commit a04b4d1ea8d99c2136a996258f1cbef1a5ff4d85 Author: imi415 Date: Fri Apr 8 22:56:26 2022 +0800 SDK v2.11.0 diff --git a/CMSIS/CMSIS.yml b/CMSIS/CMSIS.yml new file mode 100644 index 0000000..a1cf64e --- /dev/null +++ b/CMSIS/CMSIS.yml @@ -0,0 +1,1860 @@ +--- +CMSIS_Include_common: + section-type: component + meta-name: platform.Include_common + contents: + files: + - source: CMSIS/Include/cmsis_armcc.h + virtual-dir: CMSIS + - source: CMSIS/Include/cmsis_armclang.h + virtual-dir: CMSIS + - source: CMSIS/Include/cmsis_armclang_ltm.h + virtual-dir: CMSIS + - source: CMSIS/Include/cmsis_gcc.h + virtual-dir: CMSIS + - source: CMSIS/Include/cmsis_compiler.h + virtual-dir: CMSIS + - source: CMSIS/Include/cmsis_version.h + virtual-dir: CMSIS + - source: CMSIS/Include/cmsis_iccarm.h + virtual-dir: CMSIS + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: Cmsis_include_common # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_common # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_common # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_dsp: + section-type: component + meta-name: platform.Include_dsp + contents: + files: + - source: CMSIS/Include/arm_common_tables.h + virtual-dir: CMSIS + - source: CMSIS/Include/arm_const_structs.h + virtual-dir: CMSIS + - source: CMSIS/Include/arm_math.h + virtual-dir: CMSIS + component_info: + common: + version: 1.7.0 + type: CMSIS_Include + full_name: Cmsis_include_dsp # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_dsp # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_dsp # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: DSP + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_cm0: + section-type: component + meta-name: platform.Include_core_cm0 + contents: + files: + - source: CMSIS/Include/core_cm0.h + virtual-dir: CMSIS + __requires__: + - CMSIS_Include_common cmsis.core_cm0.support CMSIS_Include_dsp + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + class: CMSIS + full_name: Cmsis_include_core_cm0 # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_cm0 # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_cm0 # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: CORE + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_cm0plus: + section-type: component + meta-name: platform.Include_core_cm0plus + contents: + files: + - source: CMSIS/Include/core_cm0plus.h + virtual-dir: CMSIS + - source: CMSIS/Include/mpu_armv7.h + virtual-dir: CMSIS + __requires__: + - CMSIS_Include_common cmsis.core_cm0p.support CMSIS_Include_dsp + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: Cmsis_include_core_cm0plus # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_cm0plus # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_cm0plus # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: CORE + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_cm3: + section-type: component + meta-name: platform.Include_core_cm3 + contents: + files: + - source: CMSIS/Include/core_cm3.h + virtual-dir: CMSIS + - source: CMSIS/Include/mpu_armv7.h + virtual-dir: CMSIS + __requires__: + - CMSIS_Include_common cmsis.core_cm3.support CMSIS_Include_dsp + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: Cmsis_include_core_cm3 # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_cm3 # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_cm3 # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_cm4: + section-type: component + meta-name: platform.Include_core_cm4 + contents: + files: + - source: CMSIS/Include/core_cm4.h + virtual-dir: CMSIS + - source: CMSIS/Include/mpu_armv7.h + virtual-dir: CMSIS + __requires__: + - CMSIS_Include_common cmsis.core_cm4_cm4f.support CMSIS_Include_dsp + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: Cmsis_include_core_cm4 # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_cm4 # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_cm4 # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_cm7: + section-type: component + meta-name: platform.Include_core_cm7 + contents: + files: + - source: CMSIS/Include/core_cm7.h + virtual-dir: CMSIS + - source: CMSIS/Include/mpu_armv7.h + virtual-dir: CMSIS + __requires__: + - CMSIS_Include_common cmsis.core_cm7_cm7f.support CMSIS_Include_dsp + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: Cmsis_include_core_cm7 # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_cm7 # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_cm7 # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_sc000: + section-type: component + meta-name: platform.Include_core_sc000 + contents: + files: + - source: CMSIS/Include/core_sc000.h + virtual-dir: CMSIS + __requires__: + - CMSIS_Include_common cmsis.core_sc000.support CMSIS_Include_dsp + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: Cmsis_include_core_sc000 # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_sc000 # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_sc000 # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_sc300: + section-type: component + meta-name: platform.Include_core_sc300 + contents: + files: + - source: CMSIS/Include/core_sc300.h + virtual-dir: CMSIS + __requires__: + - CMSIS_Include_common cmsis.core_sc300.support CMSIS_Include_dsp + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: Cmsis_include_core_sc300 # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_sc300 # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_sc300 # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_cm23: + section-type: component + meta-name: platform.Include_core_cm23 + contents: + files: + - source: CMSIS/Include/core_cm23.h + virtual-dir: CMSIS + - source: CMSIS/Include/tz_context.h + virtual-dir: CMSIS + - source: CMSIS/Include/mpu_armv8.h + virtual-dir: CMSIS + __requires__: + - CMSIS_Include_common cmsis.core_cm23.support CMSIS_Include_dsp + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: Cmsis_include_core_cm23 # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_cm23 # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_cm23 # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_cm33: + section-type: component + meta-name: platform.Include_core_cm33 + contents: + files: + - source: CMSIS/Include/core_cm33.h + virtual-dir: CMSIS + - source: CMSIS/Include/tz_context.h + virtual-dir: CMSIS + - source: CMSIS/Include/mpu_armv8.h + virtual-dir: CMSIS + __requires__: + - CMSIS_Include_common cmsis.core_cm33_cm33f.support CMSIS_Include_dsp + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: Cmsis_include_core_cm33 # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_cm33 # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_cm33 # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Include_core_ca7: + section-type: component + meta-name: platform.Include_core_ca7 + contents: + files: + - source: CMSIS/Include/Core_A/cmsis_armcc.h + virtual-dir: CMSIS + - source: CMSIS/Include/Core_A/cmsis_armclang.h + virtual-dir: CMSIS + - source: CMSIS/Include/Core_A/cmsis_gcc.h + virtual-dir: CMSIS + - source: CMSIS/Include/Core_A/cmsis_compiler.h + virtual-dir: CMSIS + - source: CMSIS/Include/Core_A/cmsis_cp15.h + virtual-dir: CMSIS + - source: CMSIS/Include/Core_A/cmsis_iccarm.h + virtual-dir: CMSIS + - source: CMSIS/Include/Core_A/core_ca.h + virtual-dir: CMSIS + - source: CMSIS/Include/Core_A/irq_ctrl.h + virtual-dir: CMSIS + - source: CMSIS/Include/Core_A/Source/irq_ctrl_gic.c + virtual-dir: CMSIS + cores: ca7 + __requires__: + - cmsis.core_ca7.support + component_info: + common: + version: 1.1.4 + type: CMSIS_Include + full_name: Cmsis_include_core_ca7 # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_include_core_ca7 # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Include_core_ca7 # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS: + section-type: component + meta-name: platform.CMSIS + contents: + files: + - source: CMSIS/*.html + - source: CMSIS/*.pdf + - source: CMSIS/*.rtf + - source: CMSIS/*.txt + - source: CMSIS/Include/*.h + __requires__: + - CMSIS_Include_common CMSIS_Driver_Include.Common CMSIS_Driver CMSIS_Driver_Include.CAN + CMSIS_Driver_Include.Ethernet CMSIS_Driver_Include.Ethernet_MAC CMSIS_Driver_Include.Ethernet_PHY + CMSIS_Driver_Include.Flash CMSIS_Driver_Include.I2C CMSIS_Driver_Include.MCI CMSIS_Driver_Include.NAND + CMSIS_Driver_Include.SAI CMSIS_Driver_Include.SPI CMSIS_Driver_Include.USART CMSIS_Driver_Include.USB + CMSIS_Driver_Include.USB_Device CMSIS_Driver_Include.USB_Host CMSIS_Driver_Include.WiFi CMSIS_Driver_Include.GPIO + CMSIS_Include_dsp + component_info: + manifest: + version: 5.6.0 + type: CMSIS + full_name: Cmsis # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS # This value is temporarily added, please replace it with suitable value and then remove this comment. +CMSIS_DSP_Lib.ui_control: + section-type: component_support + component_info: + common: + ui_name: CMSIS DSP Library + ui_description: CMSIS DSP Software Library + ui_category: CMSIS DSP Lib + ui_control: true + ui_control_default: true + ui_release_specific: true + version: 1.7.0 +CMSIS_DSP_Lib: + section-type: component + meta-name: platform.CMSIS_DSP_Lib + contents: + files: + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_class_marks_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/*.h + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_convolution_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_dotproduct_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fft_bin_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/*.h + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_fir_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/*.h + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_graphic_equalizer_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/*.h + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_linear_interp_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/*.h + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_matrix_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/*.h + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_signal_converge_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_sin_cos_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/*.c + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/*.ini + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/*.txt + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/*.uvoptx + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/*.uvprojx + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/*.h + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/*.c + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM0/*.s + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/*.c + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM3/*.s + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM4_FP/*.s + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/*.c + - source: CMSIS/DSP/Examples/ARM/arm_variance_example/RTE/Device/ARMCM7_SP/*.s + - source: CMSIS/DSP/Projects/ARM/*.bat + - source: CMSIS/DSP/Projects/ARM/*.uvoptx + - source: CMSIS/DSP/Projects/ARM/*.uvprojx + - source: CMSIS/DSP/Projects/GCC/*.bat + - source: CMSIS/DSP/Projects/GCC/*.uvoptx + - source: CMSIS/DSP/Projects/GCC/*.uvprojx + - source: CMSIS/DSP/Projects/IAR/*.bat + - source: CMSIS/DSP/Projects/IAR/*.eww + - source: CMSIS/DSP/Projects/IAR/*.ewp + - source: CMSIS/DSP/Source/BasicMathFunctions/*.c + - source: CMSIS/DSP/Source/CommonTables/*.c + - source: CMSIS/DSP/Source/ComplexMathFunctions/*.c + - source: CMSIS/DSP/Source/ControllerFunctions/*.c + - source: CMSIS/DSP/Source/FastMathFunctions/*.c + - source: CMSIS/DSP/Source/FilteringFunctions/*.c + - source: CMSIS/DSP/Source/MatrixFunctions/*.c + - source: CMSIS/DSP/Source/StatisticsFunctions/*.c + - source: CMSIS/DSP/Source/SupportFunctions/*.c + - source: CMSIS/DSP/Source/TransformFunctions/*.c + - source: CMSIS/DSP/Source/TransformFunctions/*.S + __requires__: + - CMSIS_DSP_Lib.ui_control + component_info: + manifest: + version: 1.7.0 + type: CMSIS + user_visible: false + full_name: Cmsis_dsp_lib # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_DSP_Lib # This value is temporarily added, please replace it with suitable value and then remove this comment. +CMSIS_Driver: + section-type: component + meta-name: platform.CMSIS_Driver + contents: + files: + - source: CMSIS/Driver/DriverTemplates/*.c + - source: CMSIS/Driver/DriverTemplates/*.h + component_info: + manifest: + version: 2.7.1 + type: CMSIS + device_specific: false + full_name: Cmsis_driver # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CMSIS_Driver # This value is temporarily added, please replace it with suitable value and then remove this comment. +CMSIS_Driver_Include.Common: + section-type: component + meta-name: platform.CMSIS_Driver_Include.Common_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_Common.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.7.1 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include common # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include common # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: Common # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: NONE + group: Common + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.CAN: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.CAN_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_CAN.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 1.2.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include can # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include can # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: CAN # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: CAN + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.Ethernet: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.Ethernet_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_ETH.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.1.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include ethernet # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include ethernet # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: Ethernet # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + group: Ethernet + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.Ethernet_MAC: + __requires__: + - CMSIS_Driver_Include.Ethernet + section-type: component + meta-name: platform.CMSIS_Driver_Include.Ethernet_MAC_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_ETH_MAC.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.1.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include ethernet_mac # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include ethernet_mac # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: Ethernet_MAC # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: Ethernet + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.Ethernet_PHY: + __requires__: + - CMSIS_Driver_Include.Ethernet + section-type: component + meta-name: platform.CMSIS_Driver_Include.Ethernet_PHY_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_ETH_PHY.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.1.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include ethernet_phy # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include ethernet_phy # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: Ethernet_PHY # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + group: Ethernet + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.Flash: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.Flash_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_Flash.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include flash # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include flash # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: Flash # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: Flash + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.I2C: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.I2C_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_I2C.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.3.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include i2c # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include i2c # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: I2C # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: I2C + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.GPIO: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.GPIO_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_GPIO.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.0.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include gpio # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include gpio # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: GPIO # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: GPIO + sub: '' + pack_url: http://www.nxp.com + pack_vendor: NXP + pack_version: 2.0.0 +CMSIS_Driver_Include.MCI: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.MCI_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_MCI.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.3.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include mci # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include mci # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: MCI # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + group: MCI + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.NAND: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.NAND_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_NAND.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.3.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include nand # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include nand # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: NAND # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: NAND + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.SAI: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.SAI_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_SAI.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 1.1.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include sai # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include sai # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: SAI # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: SAI + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.SPI: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.SPI_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_SPI.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include spi # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include spi # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: SPI # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: SPI + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.USART: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + meta-name: platform.CMSIS_Driver_Include.USART_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_USART.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.3.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include usart # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include usart # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: USART # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: USART + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.USB: + section-type: component + __requires__: + - CMSIS_Driver_Include.Common + meta-name: platform.CMSIS_Driver_Include.USB_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_USB.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include usb # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include usb # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: USB # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: USB + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.USB_Device: + __requires__: + - CMSIS_Driver_Include.USB + section-type: component + meta-name: platform.CMSIS_Driver_Include.USB_Device_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_USBD.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include usb_device # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include usb_device # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: USB_Device # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + group: USB Device + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.WiFi: + section-type: component + __requires__: + - CMSIS_Driver_Include.Common + meta-name: platform.CMSIS_Driver_Include.WiFi_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_WiFi.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 1.0.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include wifi # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include wifi # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: WiFi # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: WiFi + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_Driver_Include.USB_Host: + __requires__: + - CMSIS_Driver_Include.USB + section-type: component + meta-name: platform.CMSIS_Driver_Include.USB_Host_CMSISInclude + contents: + cc-include: + - path: CMSIS/Driver/Include + files: + - source: CMSIS/Driver/Include/Driver_USBH.h + virtual-dir: CMSIS_driver + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: Cmsis_driver_include usb_host # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_driver_include usb_host # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: USB_Host # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: USB Host + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM0l_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM0l_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM0l_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_cortexM0l_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm0p.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm0l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm0l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM0l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM0b_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM0b_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM0b_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm0p.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm0b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm0b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM0b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM3l_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM3l_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM3l_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_cortexM3l_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm3.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm3l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm3l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM3l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM3b_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM3b_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM3b_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm3.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm3b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm3b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM3b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM4l_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM4l_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM4l_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_cortexM4l_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm4.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm4l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm4l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM4l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: DSP + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM4b_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM4b_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM4b_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm4.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm4b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm4b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM4b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM4lf_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM4lf_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM4lf_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_cortexM4lf_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm4f.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm4lf_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm4lf_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM4lf_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM4bf_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM4bf_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM4bf_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm4f.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm4bf_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm4bf_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM4bf_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM7l_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM7l_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM7l_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_cortexM7l_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm7.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm7l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm7l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM7l_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM7b_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM7b_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM7b_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm7.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm7b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm7b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM7b_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM7lfdp_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM7lfdp_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM7lfdp_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_cortexM7lfdp_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm7f.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm7lfdp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm7lfdp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM7lfdp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM7bfdp_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM7bfdp_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM7bfdp_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm7f.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm7bfdp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm7bfdp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM7bfdp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM7lfsp_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM7lfsp_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM7lfsp_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_cortexM7lfsp_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm7f.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm7lfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm7lfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM7lfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: DSP + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_cortexM7bfsp_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_cortexM7bfsp_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_cortexM7bfsp_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm7f.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_cortexm7bfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_cortexm7bfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_cortexM7bfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: DSP + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_ARMv8MBLl_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_ARMv8MBLl_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_ARMv8MBLl_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_ARMv8MBLl_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm23_cm33.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_armv8mbll_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_armv8mbll_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_ARMv8MBLl_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: DSP + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_ARMv8MMLl_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_ARMv8MMLl_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_ARMv8MMLl_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_ARMv8MMLl_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm23_cm33.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_armv8mmll_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_armv8mmll_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_ARMv8MMLl_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: DSP + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_ARMv8MMLld_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_ARMv8MMLld_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_ARMv8MMLld_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_ARMv8MMLld_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm33_cm33f.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_armv8mmlld_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_armv8mmlld_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_ARMv8MMLld_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: DSP + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_ARMv8MMLldfsp_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_ARMv8MMLldfsp_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_ARMv8MMLldfsp_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_ARMv8MMLldfsp_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm33_cm33f.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_armv8mmlldfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_armv8mmlldfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_ARMv8MMLldfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: DSP + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 +CMSIS_DSP_Lib.arm_ARMv8MMLlfsp_math: + section-type: component + meta-name: platform.CMSIS_DSP_Lib.arm_ARMv8MMLlfsp_math + contents: + files: + - source: CMSIS/DSP/Lib/ARM/arm_ARMv8MMLlfsp_math.lib + virtual-dir: libs + toolchains: mdk + attribute: extra-libraries + - source: CMSIS/DSP/Lib/GCC/libarm_ARMv8MMLlfsp_math.a + virtual-dir: libs + toolchains: armgcc mcux + attribute: extra-libraries + __requires__: + - CMSIS_DSP_Lib.ui_control cmsis.core_cm33_cm33f.support + component_info: + common: + type: CMSIS_driver + version: 1.7.0 + full_name: Cmsis_dsp_lib arm_armv8mmllfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + description: Cmsis_dsp_lib arm_armv8mmllfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + manifest_name: arm_ARMv8MMLlfsp_math # This value is temporarily added, please replace it with suitable value and then remove this comment. + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: DSP + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + + +CMSIS_RTOS2_Common: + section-type: component + meta-name: platform.CMSIS_RTOS2_Common + contents: + cc-include: + - path: CMSIS/RTOS2/Include + - path: CMSIS/RTOS2/RTX/Include + - path: CMSIS/RTOS2/RTX/Config + files: + - source: CMSIS/RTOS2/RTX/Source/rtx_core_c.h + virtual-dir: CMSIS:RTOS2:RTX:Source + - source: CMSIS/RTOS2/RTX/Source/rtx_core_ca.h + virtual-dir: CMSIS:RTOS2:RTX:Source + - source: CMSIS/RTOS2/RTX/Source/rtx_core_cm.h + virtual-dir: CMSIS:RTOS2:RTX:Source + - source: CMSIS/RTOS2/RTX/Source/rtx_lib.h + virtual-dir: CMSIS:RTOS2:RTX:Source + - source: CMSIS/RTOS2/RTX/Source/rtx_lib.c + virtual-dir: CMSIS:RTOS2:RTX:Source + - source: CMSIS/RTOS2/Include/cmsis_os2.h + virtual-dir: CMSIS:RTOS2:Include + - source: CMSIS/RTOS2/Include/os_tick.h + virtual-dir: CMSIS:RTOS2:Include + - source: CMSIS/RTOS2/RTX/Include/rtx_evr.h + virtual-dir: CMSIS:RTOS2:RTX:Include + - source: CMSIS/RTOS2/RTX/Include/rtx_os.h + virtual-dir: CMSIS:RTOS2:RTX:Include + - source: CMSIS/RTOS2/RTX/Config/RTX_Config.c + virtual-dir: CMSIS:RTOS2:RTX:Config + - source: CMSIS/RTOS2/RTX/Config/RTX_Config.h + virtual-dir: CMSIS:RTOS2:RTX:Config + - source: CMSIS/RTOS2/RTX/Library/IAR/RTX_CM0.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: iar + attribute: extra-libraries + cores: cm0 cm0p + - source: CMSIS/RTOS2/RTX/Library/IAR/RTX_CM3.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: iar + attribute: extra-libraries + cores: cm3 cm4 cm7 + - source: CMSIS/RTOS2/RTX/Library/IAR/RTX_CM4F.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: iar + attribute: extra-libraries + cores: cm4f cm7f + - source: CMSIS/RTOS2/RTX/Library/GCC/libRTX_CM0.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm0 cm0p + - source: CMSIS/RTOS2/RTX/Library/GCC/libRTX_CM3.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm3 cm4 cm7 + - source: CMSIS/RTOS2/RTX/Library/GCC/libRTX_CM4F.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm4f cm7f + - source: CMSIS/RTOS2/RTX/Library/ARM/RTX_CM0.lib + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: mdk + attribute: extra-libraries + cores: cm0 cm0p + - source: CMSIS/RTOS2/RTX/Library/ARM/RTX_CM3.lib + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: mdk + attribute: extra-libraries + cores: cm3 cm4 cm7 + - source: CMSIS/RTOS2/RTX/Library/ARM/RTX_CM4F.lib + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: mdk + attribute: extra-libraries + cores: cm4f cm7f + component_info: + common: + type: CMSIS_driver + version: 2.1.3 + full_name: CMSIS RTOS2 Common + description: CMSIS RTOS2 Common + manifest_name: CMSIS_RTOS2_Common + need_require: true + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: RTOS2 + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_RTOS2_NonSecure: + section-type: component + meta-name: platform.CMSIS_RTOS2_NonSecure + contents: + files: + - source: CMSIS/RTOS2/RTX/Library/IAR/RTX_V8MBN.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: iar + attribute: extra-libraries + cores: cm23 + - source: CMSIS/RTOS2/RTX/Library/IAR/RTX_V8MMFN.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: iar + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + - source: CMSIS/RTOS2/RTX/Library/GCC/libRTX_V8MBN.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm23 + - source: CMSIS/RTOS2/RTX/Library/GCC/libRTX_V8MMFN.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + - source: CMSIS/RTOS2/RTX/Library/ARM/RTX_V8MBN.lib + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: mdk + attribute: extra-libraries + cores: cm23 + - source: CMSIS/RTOS2/RTX/Library/ARM/RTX_V8MMFN.lib + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: mdk + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + __requires__: + - CMSIS_RTOS2_Common + component_info: + common: + type: CMSIS_driver + version: 2.1.3 + full_name: CMSIS RTOS2 NonSecure + description: CMSIS RTOS2 NonSecure + manifest_name: CMSIS_RTOS2_NonSecure + need_require: true + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: RTOS2 + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_RTOS2_Secure: + section-type: component + meta-name: platform.CMSIS_RTOS2_Secure + contents: + files: + - source: CMSIS/RTOS2/RTX/Library/IAR/RTX_V8MB.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: iar + attribute: extra-libraries + cores: cm23 + - source: CMSIS/RTOS2/RTX/Library/IAR/RTX_V8MMF.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: iar + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + - source: CMSIS/RTOS2/RTX/Library/GCC/libRTX_V8MB.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm23 + - source: CMSIS/RTOS2/RTX/Library/GCC/libRTX_V8MMF.a + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + - source: CMSIS/RTOS2/RTX/Library/ARM/RTX_V8MB.lib + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: mdk + attribute: extra-libraries + cores: cm23 + - source: CMSIS/RTOS2/RTX/Library/ARM/RTX_V8MMF.lib + virtual-dir: CMSIS:RTOS2:RTX:Library + toolchains: mdk + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + __requires__: + - CMSIS_RTOS2_Common + component_info: + common: + type: CMSIS_driver + version: 2.1.3 + full_name: CMSIS RTOS2 Secure + description: CMSIS RTOS2 Secure + manifest_name: CMSIS_RTOS2_Secure + need_require: true + cmsis_pack: + class: CMSIS + pack_name: CMSIS + sub: '' + group: RTOS2 + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +cmsis.core_cm0.support: + section-type: component_support + __requires__: + - core.cm0 +cmsis.core_cm0p.support: + section-type: component_support + __requires__: + - core.cm0p +cmsis.core_cm3.support: + section-type: component_support + __requires__: + - core.cm3 +cmsis.core_cm4.support: + section-type: component_support + __requires__: + - core.cm4 +cmsis.core_cm4f.support: + section-type: component_support + __requires__: + - core.cm4f +cmsis.core_cm4_cm4f.support: + section-type: component_support + __requires__: + - core.cm4 + - core.cm4f +cmsis.core_cm23.support: + section-type: component_support + __requires__: + - core.cm23 +cmsis.core_cm33.support: + section-type: component_support + __requires__: + - core.cm33 +cmsis.core_cm33f.support: + section-type: component_support + __requires__: + - core.cm33f +cmsis.core_cm33_cm33f.support: + section-type: component_support + __requires__: + - core.cm33 + - core.cm33f +cmsis.core_cm23_cm33.support: + section-type: component_support + __requires__: + - core.cm23 + - core.cm33 +cmsis.core_cm7.support: + section-type: component_support + __requires__: + - core.cm7 +cmsis.core_cm7f.support: + section-type: component_support + __requires__: + - core.cm7f +cmsis.core_cm7_cm7f.support: + section-type: component_support + __requires__: + - core.cm7 + - core.cm7f +cmsis.core_sc300.support: + section-type: component_support + __requires__: + - core.sc300 +cmsis.core_sc000.support: + section-type: component_support + __requires__: + - core.sc000 +cmsis.core_ca7.support: + section-type: component_support + __requires__: + - core.ca7 diff --git a/CMSIS/CMSIS_v2.yml b/CMSIS/CMSIS_v2.yml new file mode 100644 index 0000000..3ecdbc9 --- /dev/null +++ b/CMSIS/CMSIS_v2.yml @@ -0,0 +1,2011 @@ +--- +## CMSIS Core component +CMSIS_Include_core_cm: + section-type: component + __requires__: + - cmsis.core_cm.support + contents: + repo_base_path: CMSIS/Core/Include + project_base_path: CMSIS + cc-include: + - repo_relative_path: "./" + files: + - source: cmsis_armcc.h + - source: cmsis_armclang.h + - source: cmsis_armclang_ltm.h + - source: cmsis_compiler.h + - source: cmsis_gcc.h + - source: cmsis_iccarm.h + - source: cmsis_version.h + - source: core_cm0.h + cores: cm0 + - source: core_cm0plus.h + cores: cm0p + - source: core_cm23.h + cores: cm23 + - source: core_cm3.h + cores: cm3 + - source: core_cm33.h + cores: cm33 cm33f + - source: core_cm4.h + cores: cm4 cm4f + - source: core_cm7.h + cores: cm7 cm7f + - source: mpu_armv7.h + cores: cm0 cm0p cm3 cm4 cm4f cm7 cm7f + - source: mpu_armv8.h + cores: cm23 cm33 cm33f + - source: tz_context.h + cores: cm23 cm33 cm33f + component_info: + common: + version: 5.3.0 + type: CMSIS_Include + full_name: CMSIS Include For Cortex-M, ARMv8-M, ARMv8.1-M + description: CMSIS-CORE for Cortex-M, ARMv8-M, ARMv8.1-M + manifest_name: CMSIS_Include_CM + cmsis_pack: + class: CMSIS + pack_name: CMSIS + group: CORE + sub: '' + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Include_core_ca7: + section-type: component + contents: + repo_base_path: CMSIS/Core_A + project_base_path: CMSIS + cc-include: + - repo_relative_path: "./" + files: + - source: Include/cmsis_armcc.h + - source: Include/cmsis_armclang.h + - source: Include/cmsis_gcc.h + - source: Include/cmsis_compiler.h + - source: Include/cmsis_cp15.h + - source: Include/cmsis_iccarm.h + - source: Include/core_ca.h + - source: Include/irq_ctrl.h + - source: Source/irq_ctrl_gic.c + __requires__: + - cmsis.core_ca7.support + component_info: + common: + version: 1.1.4 + type: CMSIS_Include + full_name: CMSIS Include For Cortex-A + description: CMSIS-CORE for Cortex-A + manifest_name: CMSIS_Include_CA7 + cmsis_pack: + class: CMSIS + group: CORE + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +cmsis.core_cm.support: + section-type: component_support + __requires__: + - core.cm0 + - core.cm0p + - core.cm3 + - core.cm4 + - core.cm4f + - core.cm23 + - core.cm33 + - core.cm33f + - core.cm7 + - core.cm7f + +cmsis.core_ca7.support: + section-type: component_support + __requires__: + - core.ca7 + +## CMSIS DSP Library +CMSIS_DSP_Library: + section-type: component + contents: + repo_base_path: CMSIS/DSP + project_base_path: CMSIS/DSP + cc-include: + - repo_relative_path: Include + files: + - source: Include/arm_common_tables.h + - source: Include/arm_const_structs.h + - source: Include/arm_math.h + + - source: Lib/ARM/arm_cortexM0l_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm0p + - source: Lib/GCC/libarm_cortexM0l_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm0p + - source: Lib/IAR/iar_cortexM0l_math.a + cores: cm0p + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + + - source: Lib/ARM/arm_cortexM3l_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm3 + - source: Lib/GCC/libarm_cortexM3l_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm3 + - source: Lib/IAR/iar_cortexM3l_math.a + cores: cm3 + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + + - source: Lib/ARM/arm_cortexM4l_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm4 + fpu: NO_FPU + - source: Lib/GCC/libarm_cortexM4l_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm4 + fpu: NO_FPU + - source: Lib/IAR/iar_cortexM4l_math.a + cores: cm4 + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + fpu: NO_FPU + - source: Lib/ARM/arm_cortexM4lf_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm4f + fpu: SP_FPU DP_FPU + - source: Lib/GCC/libarm_cortexM4lf_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm4f + fpu: SP_FPU DP_FPU + - source: Lib/IAR/iar_cortexM4lf_math.a + cores: cm4f + fpu: SP_FPU DP_FPU + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + + - source: Lib/ARM/arm_cortexM7l_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm7 + fpu: NO_FPU + - source: Lib/GCC/libarm_cortexM7l_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm7 + fpu: NO_FPU + - source: Lib/IAR/iar_cortexM7l_math.a + cores: cm7 + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + fpu: NO_FPU + + - source: Lib/ARM/arm_cortexM7lfsp_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm7f + fpu: SP_FPU + - source: Lib/GCC/libarm_cortexM7lfsp_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm7f + fpu: SP_FPU + - source: Lib/IAR/iar_cortexM7ls_math.a + cores: cm7f + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + fpu: SP_FPU + - source: Lib/ARM/arm_cortexM7lfdp_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm7f + fpu: DP_FPU + - source: Lib/GCC/libarm_cortexM7lfdp_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm7f + fpu: DP_FPU + - source: Lib/IAR/iar_cortexM7lf_math.a + cores: cm7f + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + fpu: DP_FPU + + - source: Lib/ARM/arm_ARMv8MMLl_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm23 cm33 + fpu: NO_FPU + dsp: NO_DSP + - source: Lib/GCC/libarm_ARMv8MMLl_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm23 cm33 + fpu: NO_FPU + dsp: NO_DSP + - source: Lib/IAR/iar_ARMv8MMLl_math.a + cores: cm23 cm33 + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + fpu: NO_FPU + dsp: NO_DSP + + - source: Lib/ARM/arm_ARMv8MMLld_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm33 cm33f + fpu: NO_FPU + dsp: DSP + - source: Lib/GCC/libarm_ARMv8MMLld_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm33 cm33f + fpu: NO_FPU + dsp: DSP + - source: Lib/IAR/iar_ARMv8MMLld_math.a + cores: cm33 cm33f + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + fpu: NO_FPU + dsp: DSP + + - source: Lib/ARM/arm_ARMv8MMLlfsp_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm33 cm33f + fpu: SP_FPU + dsp: NO_DSP + - source: Lib/GCC/libarm_ARMv8MMLlfsp_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm33 cm33f + fpu: SP_FPU + dsp: NO_DSP + - source: Lib/IAR/iar_ARMv8MMLlfsp_math.a + cores: cm33 cm33f + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + fpu: SP_FPU + dsp: NO_DSP + + - source: Lib/ARM/arm_ARMv8MMLldfsp_math.lib + toolchains: mdk + attribute: extra-libraries + project_relative_path: "./" + cores: cm33 cm33f + fpu: SP_FPU + dsp: DSP + - source: Lib/GCC/libarm_ARMv8MMLldfsp_math.a + toolchains: armgcc mcux + attribute: extra-libraries + project_relative_path: "./" + cores: cm33 cm33f + fpu: SP_FPU + dsp: DSP + - source: Lib/IAR/iar_ARMv8MMLldfsp_math.a + cores: cm33 cm33f + toolchains: iar + attribute: extra-libraries + project_relative_path: "./" + fpu: SP_FPU + dsp: DSP + __requires__: + - CMSIS_DSP_Lib.ui_control + component_info: + common: + version: 1.7.0 + type: CMSIS_driver + full_name: CMSIS DSP Library + description: CMSIS-DSP Library for Cortex-M, SC000, and SC300 + manifest_name: CMSIS_DSP_Library + cmsis_pack: + class: CMSIS + group: DSP + variant: Library + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_DSP_Source: + section-type: component + contents: + repo_base_path: CMSIS/DSP + project_base_path: CMSIS/DSP + cc-include: + - repo_relative_path: Include + files: + - source: Include/arm_common_tables.h + - source: Include/arm_const_structs.h + - source: Include/arm_math.h + - source: Source/BasicMathFunctions/BasicMathFunctions.c + - source: Source/BasicMathFunctions/arm_abs_f32.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_abs_q15.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_abs_q31.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_abs_q7.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_add_f32.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_add_q15.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_add_q31.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_add_q7.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_dot_prod_f32.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_dot_prod_q15.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_dot_prod_q31.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_dot_prod_q7.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_mult_f32.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_mult_q15.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_mult_q31.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_mult_q7.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_negate_f32.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_negate_q15.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_negate_q31.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_negate_q7.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_offset_f32.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_offset_q15.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_offset_q31.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_offset_q7.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_scale_f32.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_scale_q15.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_scale_q31.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_scale_q7.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_shift_q15.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_shift_q31.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_shift_q7.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_sub_f32.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_sub_q15.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_sub_q31.c + hidden: true + exclude: true + - source: Source/BasicMathFunctions/arm_sub_q7.c + hidden: true + exclude: true + + - source: Source/CommonTables/CommonTables.c + - source: Source/CommonTables/arm_common_tables.c + hidden: true + exclude: true + - source: Source/CommonTables/arm_const_structs.c + hidden: true + exclude: true + + - source: Source/ComplexMathFunctions/ComplexMathFunctions.c + - source: Source/ComplexMathFunctions/arm_cmplx_conj_f32.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_conj_q15.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_conj_q31.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mag_f32.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mag_q15.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mag_q31.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c + hidden: true + exclude: true + - source: Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c + hidden: true + exclude: true + + - source: Source/ControllerFunctions/ControllerFunctions.c + - source: Source/ControllerFunctions/arm_pid_init_f32.c + hidden: true + exclude: true + - source: Source/ControllerFunctions/arm_pid_init_q15.c + hidden: true + exclude: true + - source: Source/ControllerFunctions/arm_pid_init_q31.c + hidden: true + exclude: true + - source: Source/ControllerFunctions/arm_pid_reset_f32.c + hidden: true + exclude: true + - source: Source/ControllerFunctions/arm_pid_reset_q15.c + hidden: true + exclude: true + - source: Source/ControllerFunctions/arm_pid_reset_q31.c + hidden: true + exclude: true + - source: Source/ControllerFunctions/arm_sin_cos_f32.c + hidden: true + exclude: true + - source: Source/ControllerFunctions/arm_sin_cos_q31.c + hidden: true + exclude: true + + - source: Source/FastMathFunctions/FastMathFunctions.c + - source: Source/FastMathFunctions/arm_cos_f32.c + hidden: true + exclude: true + - source: Source/FastMathFunctions/arm_cos_q15.c + hidden: true + exclude: true + - source: Source/FastMathFunctions/arm_cos_q31.c + hidden: true + exclude: true + - source: Source/FastMathFunctions/arm_sin_f32.c + hidden: true + exclude: true + - source: Source/FastMathFunctions/arm_sin_q15.c + hidden: true + exclude: true + - source: Source/FastMathFunctions/arm_sin_q31.c + hidden: true + exclude: true + - source: Source/FastMathFunctions/arm_sqrt_q15.c + hidden: true + exclude: true + - source: Source/FastMathFunctions/arm_sqrt_q31.c + hidden: true + exclude: true + + - source: Source/FilteringFunctions/FilteringFunctions.c + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_fast_opt_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_fast_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_fast_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_opt_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_opt_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_partial_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_partial_fast_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_partial_fast_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_partial_opt_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_partial_opt_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_partial_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_partial_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_partial_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_conv_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_correlate_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_correlate_fast_opt_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_correlate_fast_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_correlate_fast_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_correlate_opt_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_correlate_opt_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_correlate_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_correlate_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_correlate_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_decimate_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_decimate_fast_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_decimate_fast_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_decimate_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_decimate_init_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_decimate_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_decimate_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_decimate_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_fast_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_fast_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_init_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_init_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_interpolate_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_interpolate_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_interpolate_init_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_interpolate_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_interpolate_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_interpolate_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_lattice_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_lattice_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_lattice_init_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_lattice_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_lattice_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_lattice_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_sparse_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_sparse_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_sparse_init_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_sparse_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_sparse_init_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_sparse_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_sparse_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_fir_sparse_q7.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_iir_lattice_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_iir_lattice_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_iir_lattice_init_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_iir_lattice_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_iir_lattice_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_iir_lattice_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_init_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_norm_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_norm_init_f32.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_norm_init_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_norm_init_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_norm_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_norm_q31.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_q15.c + hidden: true + exclude: true + - source: Source/FilteringFunctions/arm_lms_q31.c + hidden: true + exclude: true + + - source: Source/MatrixFunctions/MatrixFunctions.c + - source: Source/MatrixFunctions/arm_mat_add_f32.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_add_q15.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_add_q31.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_init_f32.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_init_q15.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_init_q31.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_inverse_f32.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_inverse_f64.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_mult_f32.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_mult_fast_q15.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_mult_fast_q31.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_mult_q15.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_mult_q31.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_scale_f32.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_scale_q15.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_scale_q31.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_sub_f32.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_sub_q15.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_sub_q31.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_trans_f32.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_trans_q15.c + hidden: true + exclude: true + - source: Source/MatrixFunctions/arm_mat_trans_q31.c + hidden: true + exclude: true + + - source: Source/StatisticsFunctions/StatisticsFunctions.c + - source: Source/StatisticsFunctions/arm_max_f32.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_max_q15.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_max_q31.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_max_q7.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_mean_f32.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_mean_q15.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_mean_q31.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_mean_q7.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_min_f32.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_min_q15.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_min_q31.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_min_q7.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_power_f32.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_power_q15.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_power_q31.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_power_q7.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_rms_f32.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_rms_q15.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_rms_q31.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_std_f32.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_std_q15.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_std_q31.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_var_f32.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_var_q15.c + hidden: true + exclude: true + - source: Source/StatisticsFunctions/arm_var_q31.c + hidden: true + exclude: true + + - source: Source/SupportFunctions/SupportFunctions.c + - source: Source/SupportFunctions/arm_copy_f32.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_copy_q15.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_copy_q31.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_copy_q7.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_fill_f32.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_fill_q15.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_fill_q31.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_fill_q7.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_float_to_q15.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_float_to_q31.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_float_to_q7.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_q15_to_float.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_q15_to_q31.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_q15_to_q7.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_q31_to_float.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_q31_to_q15.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_q31_to_q7.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_q7_to_float.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_q7_to_q15.c + hidden: true + exclude: true + - source: Source/SupportFunctions/arm_q7_to_q31.c + hidden: true + exclude: true + + - source: Source/TransformFunctions/TransformFunctions.c + - source: Source/TransformFunctions/arm_bitreversal.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_bitreversal2.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_q15.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_q31.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix2_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix2_init_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix2_init_q15.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix2_init_q31.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix2_q15.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix2_q31.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix4_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix4_init_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix4_init_q15.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix4_init_q31.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix4_q15.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix4_q31.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_cfft_radix8_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_dct4_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_dct4_init_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_dct4_init_q15.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_dct4_init_q31.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_dct4_q15.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_dct4_q31.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_rfft_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_rfft_fast_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_rfft_fast_init_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_rfft_init_f32.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_rfft_init_q15.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_rfft_init_q31.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_rfft_q15.c + hidden: true + exclude: true + - source: Source/TransformFunctions/arm_rfft_q31.c + hidden: true + exclude: true + + __requires__: + - CMSIS_DSP_Lib.ui_control + component_info: + common: + version: 1.7.0 + type: CMSIS_driver + full_name: CMSIS DSP Library Source + description: CMSIS-DSP Library for Cortex-M, SC000, and SC300 + manifest_name: CMSIS_DSP_Library_Source + cmsis_pack: + class: CMSIS + group: DSP + variant: Source + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +## CMSIS Driver Custom components +# All CMSIS Driver components in ARM.CMSIS.pdsc have template file. In SDK yml data record, we don't use +# thus don't add them. For example, CMSIS Driver USART in pdsc have Driver_USART.h and Driver_USART.c(a template file), +# in SDK yml data record, it just has Driver_USART.h. + +# Mismatch. +# Note, inside ARM.CMSIS.pdsc, there is no component called CMSIS_Driver_Include.Common. +# SDK yml data record just abstracts it into an individual component. It is not allowed to directly require it +# in any component or application. You should require end terminal component like CMSIS_Driver_Include.USART. +CMSIS_Driver_Include.Common: + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_Common.h + component_info: + common: + version: 2.3.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver Common + description: "Access to #include Driver_Common.h file for custom implementation" + manifest_name: CMSIS_Driver_Common + cmsis_pack: + class: CMSIS Driver + pack_name: NONE + group: Common + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.USART: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_USART.h + component_info: + common: + version: 2.3.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver USART + description: "Access to #include Driver_USART.h file for custom implementation" + manifest_name: CMSIS_Driver_USART + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: USART + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.CAN: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_CAN.h + component_info: + common: + version: 1.2.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver CAN + description: "Access to #include Driver_CAN.h file for custom implementation" + manifest_name: CMSIS_Driver_CAN + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: CAN + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +# Mismatch +# In ARM.CMSIS.pdsc, the Ethernet component actually contains both Driver_ETH_MAC.h and Driver_ETH_PHY.h which is not a practical +# way we do the work. In SDK yml data record, we usually split the component into common and functionality part. +# CMSIS_Driver_Include.Ethernet is the common part for Ethernet component set. +CMSIS_Driver_Include.Ethernet: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_ETH.h + component_info: + common: + version: 2.1.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver Ethernet Common + description: "Access to #include Driver_ETH.h file for custom implementation" + manifest_name: CMSIS_Driver_Ethernet_Common + cmsis_pack: + class: CMSIS Driver + group: Ethernet + sub: Custom + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.Ethernet_MAC: + __requires__: + - CMSIS_Driver_Include.Ethernet + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_ETH_MAC.h + component_info: + common: + version: 2.1.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver Ethernet MAC + description: "Access to #include Driver_ETH_MAC.h file for custom implementation" + manifest_name: CMSIS_Driver_Ethernet_MAC + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: Ethernet MAC + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.Ethernet_PHY: + __requires__: + - CMSIS_Driver_Include.Ethernet + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_ETH_PHY.h + component_info: + common: + version: 2.1.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver Ethernet PHY + description: "Access to #include Driver_ETH_PHY.h file for custom implementation" + manifest_name: CMSIS_Driver_Ethernet_PHY + cmsis_pack: + class: CMSIS Driver + group: Ethernet PHY + sub: Custom + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.Flash: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_Flash.h + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver Flash + description: "Access to #include Driver_Flash.h file for custom implementation" + manifest_name: CMSIS_Driver_Flash + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: Flash + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.I2C: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_I2C.h + component_info: + common: + version: 2.3.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver I2C + description: "Access to #include Driver_I2C.h file for custom implementation" + manifest_name: CMSIS_Driver_I2C + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: I2C + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.MCI: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_MCI.h + component_info: + common: + version: 2.3.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver MCI + description: "Access to #include Driver_MCI.h file for custom implementation" + manifest_name: CMSIS_Driver_MCI + cmsis_pack: + class: CMSIS Driver + group: MCI + sub: Custom + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.NAND: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_NAND.h + component_info: + common: + version: 2.3.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver NAND + description: "Access to #include Driver_NAND.h file for custom implementation" + manifest_name: CMSIS_Driver_NAND + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: NAND + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.SAI: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_SAI.h + component_info: + common: + version: 1.1.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver SAI + description: "Access to #include Driver_SAI.h file for custom implementation" + manifest_name: CMSIS_Driver_SAI + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: SAI + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.SPI: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_SPI.h + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver SPI + description: "Access to #include Driver_SPI.h file for custom implementation" + manifest_name: CMSIS_Driver_SPI + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: SPI + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +# Mismatch. There is no CMSIS_Driver_Include USB in ARM.CMSIS.pdsc. Such Driver_USB.h is the common head file +# included in Driver_USBD.h and Driver_USBH.h. +CMSIS_Driver_Include.USB: + section-type: component + __requires__: + - CMSIS_Driver_Include.Common + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_USB.h + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver USB Common + description: "Access to #include Driver_USB.h file for custom implementation" + manifest_name: CMSIS_Driver_USB_Common + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: USB + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.USB_Device: + __requires__: + - CMSIS_Driver_Include.USB + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_USBD.h + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver USB Device + description: "Access to #include Driver_USBD.h file for custom implementation" + manifest_name: CMSIS_Driver_USB_Device + cmsis_pack: + class: CMSIS Driver + group: USB Device + sub: Custom + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.USB_Host: + __requires__: + - CMSIS_Driver_Include.USB + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_USBH.h + component_info: + common: + version: 2.2.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver USB Host + description: "Access to #include Driver_USBH.h file for custom implementation" + manifest_name: CMSIS_Driver_USB_Host + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: USB Host + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Driver_Include.WiFi: + section-type: component + __requires__: + - CMSIS_Driver_Include.Common + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_WiFi.h + component_info: + common: + version: 1.0.0 + type: CMSIS_driver + user_visible: false + full_name: CMSIS Driver WiFi + description: "Access to #include Driver_WiFi.h file" + manifest_name: CMSIS_Driver_WiFi + cmsis_pack: + class: CMSIS Driver + pack_name: CMSIS + group: WiFi + sub: Custom + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +# Mismatch, there is no such CMSIS Driver GPIO from ARM. +# This is our proposal to ARM as official CMSIS GPIO Driver. The JIRA: MCUX-32150 +# This component is marked as manifest specific. +CMSIS_Driver_Include.GPIO: + __requires__: + - CMSIS_Driver_Include.Common + section-type: component + contents: + repo_base_path: CMSIS/Driver/Include + project_base_path: CMSIS_driver + cc-include: + - repo_relative_path: "./" + files: + - source: Driver_GPIO.h + component_info: + manifest: + version: 2.0.0 + type: CMSIS_driver + user_visible: false + full_name: NXP CMSIS Driver GPIO + description: NXP Standardized GPIO Driver aligned with CMSIS style. + manifest_name: NXP_CMSIS_Driver_GPIO + +## CMSIS Device API +# Mismatch. In ARM.CMSIS.pdsc, an API is a special form of a software component that only defines a C/C++ Application Programming Interface (API), such OS Tick and RTOS2 are API. +# In SDK yml data record, there is no such concept called API. So for the time being, we use component for them. +CMSIS_Device_API_OSTick: + section-type: component + contents: + repo_base_path: CMSIS/RTOS2/Include + project_base_path: CMSIS/RTOS2/Include + cc-include: + - repo_relative_path: "./" + files: + - source: os_tick.h + component_info: + common: + # There is no version for api in ARM CMSIS, using apiversion instead + version: 1.0.1 + user_visible: false + type: CMSIS_driver + full_name: CMSIS Device API OSTick + description: Device interrupt controller interface + manifest_name: CMSIS_Device_API_OSTick + cmsis_pack: + class: Device + group: OS Tick + apiversion: 1.0.1 + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_Device_API_RTOS2: + section-type: component + contents: + repo_base_path: CMSIS/RTOS2/Include + project_base_path: CMSIS/RTOS2/Include + cc-include: + - repo_relative_path: "./" + files: + - source: cmsis_os2.h + component_info: + common: + # There is no version for api in ARM CMSIS, using apiversion instead + version: 2.1.3 + user_visible: false + type: CMSIS_driver + full_name: CMSIS Device API RTOS2 + description: CMSIS-RTOS API for Cortex-M, SC000, and SC300 + manifest_name: CMSIS_Device_API_RTOS2 + cmsis_pack: + class: Device + group: RTOS2 + apiversion: 2.1.3 + sub: '' + pack_name: CMSIS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +## CMSIS-RTOS2 Keil RTX5 component +# Mismatch. There is no CMSIS_RTOS2_Common in ARM.CMSIS.pdsc. +CMSIS_RTOS2_Common: + section-type: component + __requires__: + - CMSIS_Device_API_OSTick CMSIS_Device_API_RTOS2 + contents: + repo_base_path: CMSIS/RTOS2 + project_base_path: CMSIS/RTOS2 + cc-include: + - repo_relative_path: RTX/Source + - repo_relative_path: RTX/Include + - repo_relative_path: RTX/Config + files: + - source: RTX/Source/rtx_core_c.h + - source: RTX/Source/rtx_core_ca.h + - source: RTX/Source/rtx_core_cm.h + - source: RTX/Source/rtx_lib.h + - source: RTX/Source/rtx_lib.c + - source: RTX/Include/rtx_evr.h + - source: RTX/Include/rtx_os.h + - source: RTX/Config/RTX_Config.c + - source: RTX/Config/RTX_Config.h + + - source: RTX/Library/IAR/RTX_CM0.a + toolchains: iar + attribute: extra-libraries + cores: cm0 cm0p + project_relative_path: RTX/Library + - source: RTX/Library/IAR/RTX_CM3.a + toolchains: iar + attribute: extra-libraries + cores: cm3 cm4 cm7 + project_relative_path: RTX/Library + - source: RTX/Library/IAR/RTX_CM4F.a + toolchains: iar + attribute: extra-libraries + cores: cm4f cm7f + project_relative_path: RTX/Library + - source: RTX/Library/GCC/libRTX_CM0.a + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm0 cm0p + project_relative_path: RTX/Library + - source: RTX/Library/GCC/libRTX_CM3.a + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm3 cm4 cm7 + project_relative_path: RTX/Library + - source: RTX/Library/GCC/libRTX_CM4F.a + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm4f cm7f + project_relative_path: RTX/Library + - source: RTX/Library/ARM/RTX_CM0.lib + toolchains: mdk + attribute: extra-libraries + cores: cm0 cm0p + project_relative_path: RTX/Library + - source: RTX/Library/ARM/RTX_CM3.lib + toolchains: mdk + attribute: extra-libraries + cores: cm3 cm4 cm7 + project_relative_path: RTX/Library + - source: RTX/Library/ARM/RTX_CM4F.lib + toolchains: mdk + attribute: extra-libraries + cores: cm4f cm7f + project_relative_path: RTX/Library + component_info: + common: + type: CMSIS_driver + version: 5.5.1 + user_visible: false + full_name: CMSIS RTOS2 Keil RTX5 Common + description: CMSIS-RTOS2 RTX5 Common part for Cortex-M, SC000, C300 and Armv8-M (Library) + manifest_name: CMSIS_RTOS2_Keil_RTX5_Common + need_require: true + cmsis_pack: + pack_name: CMSIS + class: CMSIS + group: RTOS2 + sub: Keil RTX5 + variant: Library + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_RTOS2_Secure: + section-type: component + contents: + repo_base_path: CMSIS/RTOS2/RTX/Library + project_base_path: CMSIS/RTOS2/RTX/Library + files: + - source: IAR/RTX_V8MB.a + toolchains: iar + attribute: extra-libraries + cores: cm23 + project_relative_path: "./" + - source: IAR/RTX_V8MMF.a + toolchains: iar + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + project_relative_path: "./" + - source: GCC/libRTX_V8MB.a + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm23 + project_relative_path: "./" + - source: GCC/libRTX_V8MMF.a + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + project_relative_path: "./" + - source: ARM/RTX_V8MB.lib + toolchains: mdk + attribute: extra-libraries + cores: cm23 + project_relative_path: "./" + - source: ARM/RTX_V8MMF.lib + toolchains: mdk + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + project_relative_path: "./" + __requires__: + - CMSIS_RTOS2_Common + component_info: + common: + type: CMSIS_driver + version: 5.5.1 + user_visible: false + full_name: CMSIS RTOS2 Keil RTX5 + description: CMSIS-RTOS2 RTX5 for Cortex-M, SC000, C300 and Armv8-M (Library) + manifest_name: CMSIS_RTOS2_Keil_RTX5 + need_require: true + cmsis_pack: + pack_name: CMSIS + class: CMSIS + group: RTOS2 + sub: Keil RTX5 + variant: Library + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +CMSIS_RTOS2_NonSecure: + section-type: component + contents: + repo_base_path: CMSIS/RTOS2/RTX/Library + project_base_path: CMSIS/RTOS2/RTX/Library + files: + - source: IAR/RTX_V8MBN.a + toolchains: iar + attribute: extra-libraries + cores: cm23 + project_relative_path: "./" + - source: IAR/RTX_V8MMFN.a + toolchains: iar + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + project_relative_path: "./" + - source: GCC/libRTX_V8MBN.a + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm23 + project_relative_path: "./" + - source: GCC/libRTX_V8MMFN.a + toolchains: armgcc mcux + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + project_relative_path: "./" + - source: ARM/RTX_V8MBN.lib + toolchains: mdk + attribute: extra-libraries + cores: cm23 + project_relative_path: "./" + - source: ARM/RTX_V8MMFN.lib + toolchains: mdk + attribute: extra-libraries + cores: cm33 cm33f + fpu: SP_FPU + project_relative_path: "./" + __requires__: + - CMSIS_RTOS2_Common + component_info: + common: + type: CMSIS_driver + version: 5.5.1 + user_visible: false + full_name: CMSIS RTOS2 Keil RTX5 Non Secure + description: CMSIS-RTOS2 RTX5 for Armv8-M Non-Secure Domain (Library) + manifest_name: CMSIS_RTOS2_Keil_RTX5_NS + need_require: true + cmsis_pack: + pack_name: CMSIS + class: CMSIS + group: RTOS2 + sub: Keil RTX5 + variant: Library_NS + pack_url: http://www.keil.com/pack/ + pack_vendor: ARM + pack_version: 5.6.0 + +# CMSIS file container +# This component is only used to wrap all CMSIS pack files. +CMSIS_files: + section-type: component + contents: + repo_base_path: CMSIS + project_base_path: CMSIS + files: +# - source: Core/** +# - source: Core_A/** + - source: Driver/** +# - source: DSP/** +# - source: Include/** +# - source: NN/** +# - source: Pack/** +# - source: RTOS/** +# - source: RTOS2/** +# - source: SVD/** +# - source: Utilities/** + - source: "*.*" + - source: DSP/Source/** + component_info: + common: + version: 5.6.0 + user_visible: false + type: container + full_name: CMSIS + description: CMSIS (Cortex Microcontroller Software Interface Standard) + manifest_name: CMSIS +CMSIS_DSP_Lib.ui_control: + section-type: component_support + component_info: + common: + fixed_id: CMSIS_DSP_Library + ui_name: CMSIS DSP Library + ui_description: CMSIS DSP Software Library + ui_category: CMSIS DSP Lib + ui_control: true + ui_control_default: true + ui_release_specific: true + version: 1.7.0 diff --git a/CMSIS/Core/Include/CMSIS_Include_core_cm_LPC845.cmake b/CMSIS/Core/Include/CMSIS_Include_core_cm_LPC845.cmake new file mode 100644 index 0000000..6e28ae8 --- /dev/null +++ b/CMSIS/Core/Include/CMSIS_Include_core_cm_LPC845.cmake @@ -0,0 +1,8 @@ +include_guard(GLOBAL) +message("CMSIS_Include_core_cm component is included.") + + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/. +) + diff --git a/CMSIS/Core/Include/cmsis_armcc.h b/CMSIS/Core/Include/cmsis_armcc.h new file mode 100644 index 0000000..59f173a --- /dev/null +++ b/CMSIS/Core/Include/cmsis_armcc.h @@ -0,0 +1,894 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.1.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm 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. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + +/* CMSIS compiler control DSP macros */ +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __ARM_FEATURE_DSP 1 +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __memory_changed() +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \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. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \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. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \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 + */ +#define __ROR __ror + + +/** + \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. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \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 __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \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 + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE 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; +} + +/** + \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 + */ +__attribute__((always_inline)) __STATIC_INLINE 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 /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/CMSIS/Core/Include/cmsis_armclang.h b/CMSIS/Core/Include/cmsis_armclang.h new file mode 100644 index 0000000..e917f35 --- /dev/null +++ b/CMSIS/Core/Include/cmsis_armclang.h @@ -0,0 +1,1444 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm 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. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_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 +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \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. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \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. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \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 + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + 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. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \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 + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \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 + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + 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] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + 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] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + 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] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__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; +} + +/** + \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 + */ +__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 /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +#define __SADD8 __builtin_arm_sadd8 +#define __QADD8 __builtin_arm_qadd8 +#define __SHADD8 __builtin_arm_shadd8 +#define __UADD8 __builtin_arm_uadd8 +#define __UQADD8 __builtin_arm_uqadd8 +#define __UHADD8 __builtin_arm_uhadd8 +#define __SSUB8 __builtin_arm_ssub8 +#define __QSUB8 __builtin_arm_qsub8 +#define __SHSUB8 __builtin_arm_shsub8 +#define __USUB8 __builtin_arm_usub8 +#define __UQSUB8 __builtin_arm_uqsub8 +#define __UHSUB8 __builtin_arm_uhsub8 +#define __SADD16 __builtin_arm_sadd16 +#define __QADD16 __builtin_arm_qadd16 +#define __SHADD16 __builtin_arm_shadd16 +#define __UADD16 __builtin_arm_uadd16 +#define __UQADD16 __builtin_arm_uqadd16 +#define __UHADD16 __builtin_arm_uhadd16 +#define __SSUB16 __builtin_arm_ssub16 +#define __QSUB16 __builtin_arm_qsub16 +#define __SHSUB16 __builtin_arm_shsub16 +#define __USUB16 __builtin_arm_usub16 +#define __UQSUB16 __builtin_arm_uqsub16 +#define __UHSUB16 __builtin_arm_uhsub16 +#define __SASX __builtin_arm_sasx +#define __QASX __builtin_arm_qasx +#define __SHASX __builtin_arm_shasx +#define __UASX __builtin_arm_uasx +#define __UQASX __builtin_arm_uqasx +#define __UHASX __builtin_arm_uhasx +#define __SSAX __builtin_arm_ssax +#define __QSAX __builtin_arm_qsax +#define __SHSAX __builtin_arm_shsax +#define __USAX __builtin_arm_usax +#define __UQSAX __builtin_arm_uqsax +#define __UHSAX __builtin_arm_uhsax +#define __USAD8 __builtin_arm_usad8 +#define __USADA8 __builtin_arm_usada8 +#define __SSAT16 __builtin_arm_ssat16 +#define __USAT16 __builtin_arm_usat16 +#define __UXTB16 __builtin_arm_uxtb16 +#define __UXTAB16 __builtin_arm_uxtab16 +#define __SXTB16 __builtin_arm_sxtb16 +#define __SXTAB16 __builtin_arm_sxtab16 +#define __SMUAD __builtin_arm_smuad +#define __SMUADX __builtin_arm_smuadx +#define __SMLAD __builtin_arm_smlad +#define __SMLADX __builtin_arm_smladx +#define __SMLALD __builtin_arm_smlald +#define __SMLALDX __builtin_arm_smlaldx +#define __SMUSD __builtin_arm_smusd +#define __SMUSDX __builtin_arm_smusdx +#define __SMLSD __builtin_arm_smlsd +#define __SMLSDX __builtin_arm_smlsdx +#define __SMLSLD __builtin_arm_smlsld +#define __SMLSLDX __builtin_arm_smlsldx +#define __SEL __builtin_arm_sel +#define __QADD __builtin_arm_qadd +#define __QSUB __builtin_arm_qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/CMSIS/Core/Include/cmsis_armclang_ltm.h b/CMSIS/Core/Include/cmsis_armclang_ltm.h new file mode 100644 index 0000000..feec324 --- /dev/null +++ b/CMSIS/Core/Include/cmsis_armclang_ltm.h @@ -0,0 +1,1891 @@ +/**************************************************************************//** + * @file cmsis_armclang_ltm.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V1.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2018-2019 Arm 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. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_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 +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \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. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \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. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \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 + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + 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. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \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 + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \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 + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + 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] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + 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] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + 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] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__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; +} + +/** + \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 + */ +__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 /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/CMSIS/Core/Include/cmsis_compiler.h b/CMSIS/Core/Include/cmsis_compiler.h new file mode 100644 index 0000000..adbf296 --- /dev/null +++ b/CMSIS/Core/Include/cmsis_compiler.h @@ -0,0 +1,283 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.1.0 + * @date 09. October 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm 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. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6.6 LTM (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #include "cmsis_armclang_ltm.h" + + /* + * Arm Compiler above 6.10.1 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __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)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #define __RESTRICT __restrict + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __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 __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/CMSIS/Core/Include/cmsis_gcc.h b/CMSIS/Core/Include/cmsis_gcc.h new file mode 100644 index 0000000..3ddcc58 --- /dev/null +++ b/CMSIS/Core/Include/cmsis_gcc.h @@ -0,0 +1,2168 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm 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. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_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 +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START + +/** + \brief Initializes data and bss sections + \details This default implementations initialized all data and additional bss + sections relying on .copy.table and .zero.table specified properly + in the used linker script. + + */ +__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) +{ + extern void _start(void) __NO_RETURN; + + typedef struct { + uint32_t const* src; + uint32_t* dest; + uint32_t wlen; + } __copy_table_t; + + typedef struct { + uint32_t* dest; + uint32_t wlen; + } __zero_table_t; + + extern const __copy_table_t __copy_table_start__; + extern const __copy_table_t __copy_table_end__; + extern const __zero_table_t __zero_table_start__; + extern const __zero_table_t __zero_table_end__; + + for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = pTable->src[i]; + } + } + + for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = 0u; + } + } + + _start(); +} + +#define __PROGRAM_START __cmsis_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP __StackTop +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT __StackLimit +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section(".vectors"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __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. + */ +#define __WFI() __ASM volatile ("wfi") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \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. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"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. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \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 + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + 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. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; 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 + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + __extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + 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] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + 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] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + 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] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__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; +} + +/** + \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 + */ +__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 /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/CMSIS/Core/Include/cmsis_iccarm.h b/CMSIS/Core/Include/cmsis_iccarm.h new file mode 100644 index 0000000..12d68fd --- /dev/null +++ b/CMSIS/Core/Include/cmsis_iccarm.h @@ -0,0 +1,964 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.1.0 + * @date 08. May 2019 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2019 IAR Systems +// Copyright (c) 2017-2019 Arm Limited. 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 __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #if __ICCARM_V8 + #define __RESTRICT __restrict + #else + /* Needs IAR language extensions */ + #define __RESTRICT restrict + #endif +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + +#ifndef __PROGRAM_START +#define __PROGRAM_START __iar_program_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP CSTACK$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT CSTACK$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __vector_table +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE @".intvec" +#endif + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE 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_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE 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_INLINE 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 + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/CMSIS/Core/Include/cmsis_version.h b/CMSIS/Core/Include/cmsis_version.h new file mode 100644 index 0000000..f2e2746 --- /dev/null +++ b/CMSIS/Core/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.3 + * @date 24. June 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 ARM 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 3U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/CMSIS/Core/Include/core_cm0plus.h b/CMSIS/Core/Include/core_cm0plus.h new file mode 100644 index 0000000..d104965 --- /dev/null +++ b/CMSIS/Core/Include/core_cm0plus.h @@ -0,0 +1,1085 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 13. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex-M0+ + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t vectors = SCB->VTOR; +#else + uint32_t vectors = 0x0U; +#endif + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M0+ does not require the architectural barrier */ +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t vectors = SCB->VTOR; +#else + uint32_t vectors = 0x0U; +#endif + return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/CMSIS/Core/Include/mpu_armv7.h b/CMSIS/Core/Include/mpu_armv7.h new file mode 100644 index 0000000..66ef59b --- /dev/null +++ b/CMSIS/Core/Include/mpu_armv7.h @@ -0,0 +1,272 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for Armv7-M MPU + * @version V5.1.0 + * @date 08. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2017-2019 Arm 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes + +#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access +#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only +#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only +#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access +#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only +#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Memory Access Attributes +* +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +*/ +#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ + ((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ + ((((DisableExec) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \ + (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ + (((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ + (((MPU_RASR_ENABLE_Msk)))) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) + +/** +* MPU Memory Access Attribute for strongly ordered memory. +* - TEX: 000b +* - Shareable +* - Non-cacheable +* - Non-bufferable +*/ +#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) + +/** +* MPU Memory Access Attribute for device memory. +* - TEX: 000b (if shareable) or 010b (if non-shareable) +* - Shareable or non-shareable +* - Non-cacheable +* - Bufferable (if shareable) or non-bufferable (if non-shareable) +* +* \param IsShareable Configures the device memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) + +/** +* MPU Memory Access Attribute for normal memory. +* - TEX: 1BBb (reflecting outer cacheability rules) +* - Shareable or non-shareable +* - Cacheable or non-cacheable (reflecting inner cacheability rules) +* - Bufferable or non-bufferable (reflecting inner cacheability rules) +* +* \param OuterCp Configures the outer cache policy. +* \param InnerCp Configures the inner cache policy. +* \param IsShareable Configures the memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U)) + +/** +* MPU Memory Access Attribute non-cacheable policy. +*/ +#define ARM_MPU_CACHEP_NOCACHE 0U + +/** +* MPU Memory Access Attribute write-back, write and read allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_WRA 1U + +/** +* MPU Memory Access Attribute write-through, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WT_NWA 2U + +/** +* MPU Memory Access Attribute write-back, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_NWA 3U + + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/CMSIS/DSP/Include/arm_common_tables.h b/CMSIS/DSP/Include/arm_common_tables.h new file mode 100644 index 0000000..6a4337f --- /dev/null +++ b/CMSIS/DSP/Include/arm_common_tables.h @@ -0,0 +1,378 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_common_tables.h + * Description: Extern declaration for common tables + * + * $Date: 27. January 2017 + * $Revision: V.1.5.1 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2017 ARM Limited or its affiliates. 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. + */ + +#ifndef _ARM_COMMON_TABLES_H +#define _ARM_COMMON_TABLES_H + +#include "arm_math.h" + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREV_1024) + extern const uint16_t armBitRevTable[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_16) + extern const float32_t twiddleCoef_16[32]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_32) + extern const float32_t twiddleCoef_32[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_64) + extern const float32_t twiddleCoef_64[128]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_128) + extern const float32_t twiddleCoef_128[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_256) + extern const float32_t twiddleCoef_256[512]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_512) + extern const float32_t twiddleCoef_512[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_1024) + extern const float32_t twiddleCoef_1024[2048]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048) + extern const float32_t twiddleCoef_2048[4096]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096) + extern const float32_t twiddleCoef_4096[8192]; + #define twiddleCoef twiddleCoef_4096 + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_16) + extern const q31_t twiddleCoef_16_q31[24]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_32) + extern const q31_t twiddleCoef_32_q31[48]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_64) + extern const q31_t twiddleCoef_64_q31[96]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_128) + extern const q31_t twiddleCoef_128_q31[192]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_256) + extern const q31_t twiddleCoef_256_q31[384]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_512) + extern const q31_t twiddleCoef_512_q31[768]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) + extern const q31_t twiddleCoef_1024_q31[1536]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) + extern const q31_t twiddleCoef_2048_q31[3072]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) + extern const q31_t twiddleCoef_4096_q31[6144]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_16) + extern const q15_t twiddleCoef_16_q15[24]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_32) + extern const q15_t twiddleCoef_32_q15[48]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_64) + extern const q15_t twiddleCoef_64_q15[96]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_128) + extern const q15_t twiddleCoef_128_q15[192]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_256) + extern const q15_t twiddleCoef_256_q15[384]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_512) + extern const q15_t twiddleCoef_512_q15[768]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) + extern const q15_t twiddleCoef_1024_q15[1536]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) + extern const q15_t twiddleCoef_2048_q15[3072]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) + extern const q15_t twiddleCoef_4096_q15[6144]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32) + extern const float32_t twiddleCoef_rfft_32[32]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64) + extern const float32_t twiddleCoef_rfft_64[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128) + extern const float32_t twiddleCoef_rfft_128[128]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256) + extern const float32_t twiddleCoef_rfft_256[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512) + extern const float32_t twiddleCoef_rfft_512[512]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024) + extern const float32_t twiddleCoef_rfft_1024[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048) + extern const float32_t twiddleCoef_rfft_2048[2048]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096) + extern const float32_t twiddleCoef_rfft_4096[4096]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + /* floating-point bit reversal tables */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_16) + #define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20) + extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_32) + #define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48) + extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_64) + #define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56) + extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_128) + #define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208) + extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_256) + #define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440) + extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_512) + #define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448) + extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_1024) + #define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800) + extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_2048) + #define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808) + extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_4096) + #define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032) + extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + + /* fixed-point bit reversal tables */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_16) + #define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12) + extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_32) + #define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24) + extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_64) + #define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56) + extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_128) + #define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112) + extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_256) + #define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240) + extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_512) + #define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480) + extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_1024) + #define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992) + extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_2048) + #define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) + extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_4096) + #define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) + extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_F32) + extern const float32_t realCoefA[8192]; + extern const float32_t realCoefB[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q31) + extern const q31_t realCoefAQ31[8192]; + extern const q31_t realCoefBQ31[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q15) + extern const q15_t realCoefAQ15[8192]; + extern const q15_t realCoefBQ15[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_128) + extern const float32_t Weights_128[256]; + extern const float32_t cos_factors_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_512) + extern const float32_t Weights_512[1024]; + extern const float32_t cos_factors_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_2048) + extern const float32_t Weights_2048[4096]; + extern const float32_t cos_factors_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_8192) + extern const float32_t Weights_8192[16384]; + extern const float32_t cos_factors_8192[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_128) + extern const q15_t WeightsQ15_128[256]; + extern const q15_t cos_factorsQ15_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_512) + extern const q15_t WeightsQ15_512[1024]; + extern const q15_t cos_factorsQ15_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_2048) + extern const q15_t WeightsQ15_2048[4096]; + extern const q15_t cos_factorsQ15_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_8192) + extern const q15_t WeightsQ15_8192[16384]; + extern const q15_t cos_factorsQ15_8192[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_128) + extern const q31_t WeightsQ31_128[256]; + extern const q31_t cos_factorsQ31_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_512) + extern const q31_t WeightsQ31_512[1024]; + extern const q31_t cos_factorsQ31_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_2048) + extern const q31_t WeightsQ31_2048[4096]; + extern const q31_t cos_factorsQ31_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_8192) + extern const q31_t WeightsQ31_8192[16384]; + extern const q31_t cos_factorsQ31_8192[8192]; + #endif + +#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_ALLOW_TABLES) + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q15) + extern const q15_t armRecipTableQ15[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q31) + extern const q31_t armRecipTableQ31[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + /* Tables for Fast Math Sine and Cosine */ + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_F32) + extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q31) + extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q15) + extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + +#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_TABLES) */ + +#endif /* ARM_COMMON_TABLES_H */ diff --git a/CMSIS/DSP/Include/arm_const_structs.h b/CMSIS/DSP/Include/arm_const_structs.h new file mode 100644 index 0000000..80a3e8b --- /dev/null +++ b/CMSIS/DSP/Include/arm_const_structs.h @@ -0,0 +1,66 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_const_structs.h + * Description: Constant structs that are initialized for user convenience. + * For example, some can be given as arguments to the arm_cfft_f32() function. + * + * $Date: 27. January 2017 + * $Revision: V.1.5.1 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2017 ARM Limited or its affiliates. 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. + */ + +#ifndef _ARM_CONST_STRUCTS_H +#define _ARM_CONST_STRUCTS_H + +#include "arm_math.h" +#include "arm_common_tables.h" + + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096; + + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; + + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096; + +#endif diff --git a/CMSIS/DSP/Include/arm_math.h b/CMSIS/DSP/Include/arm_math.h new file mode 100644 index 0000000..eb37f82 --- /dev/null +++ b/CMSIS/DSP/Include/arm_math.h @@ -0,0 +1,7361 @@ +/****************************************************************************** + * @file arm_math.h + * @brief Public header file for CMSIS DSP Library + * @version V1.6.0 + * @date 18. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2010-2019 Arm Limited or its affiliates. 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. + */ + +/** + \mainpage CMSIS DSP Software Library + * + * Introduction + * ------------ + * + * This user manual describes the CMSIS DSP software library, + * a suite of common signal processing functions for use on Cortex-M processor based devices. + * + * The library is divided into a number of functions each covering a specific category: + * - Basic math functions + * - Fast math functions + * - Complex math functions + * - Filters + * - Matrix functions + * - Transform functions + * - Motor control functions + * - Statistical functions + * - Support functions + * - Interpolation functions + * + * The library has separate functions for operating on 8-bit integers, 16-bit integers, + * 32-bit integer and 32-bit floating-point values. + * + * Using the Library + * ------------ + * + * The library installer contains prebuilt versions of the libraries in the Lib folder. + * - arm_cortexM7lfdp_math.lib (Cortex-M7, Little endian, Double Precision Floating Point Unit) + * - arm_cortexM7bfdp_math.lib (Cortex-M7, Big endian, Double Precision Floating Point Unit) + * - arm_cortexM7lfsp_math.lib (Cortex-M7, Little endian, Single Precision Floating Point Unit) + * - arm_cortexM7bfsp_math.lib (Cortex-M7, Big endian and Single Precision Floating Point Unit on) + * - arm_cortexM7l_math.lib (Cortex-M7, Little endian) + * - arm_cortexM7b_math.lib (Cortex-M7, Big endian) + * - arm_cortexM4lf_math.lib (Cortex-M4, Little endian, Floating Point Unit) + * - arm_cortexM4bf_math.lib (Cortex-M4, Big endian, Floating Point Unit) + * - arm_cortexM4l_math.lib (Cortex-M4, Little endian) + * - arm_cortexM4b_math.lib (Cortex-M4, Big endian) + * - arm_cortexM3l_math.lib (Cortex-M3, Little endian) + * - arm_cortexM3b_math.lib (Cortex-M3, Big endian) + * - arm_cortexM0l_math.lib (Cortex-M0 / Cortex-M0+, Little endian) + * - arm_cortexM0b_math.lib (Cortex-M0 / Cortex-M0+, Big endian) + * - arm_ARMv8MBLl_math.lib (Armv8-M Baseline, Little endian) + * - arm_ARMv8MMLl_math.lib (Armv8-M Mainline, Little endian) + * - arm_ARMv8MMLlfsp_math.lib (Armv8-M Mainline, Little endian, Single Precision Floating Point Unit) + * - arm_ARMv8MMLld_math.lib (Armv8-M Mainline, Little endian, DSP instructions) + * - arm_ARMv8MMLldfsp_math.lib (Armv8-M Mainline, Little endian, DSP instructions, Single Precision Floating Point Unit) + * + * The library functions are declared in the public file arm_math.h which is placed in the Include folder. + * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single + * public header file arm_math.h for Cortex-M cores with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. + * + * + * Examples + * -------- + * + * The library ships with a number of examples which demonstrate how to use the library functions. + * + * Toolchain Support + * ------------ + * + * The library has been developed and tested with MDK version 5.14.0.0 + * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. + * + * Building the Library + * ------------ + * + * The library installer contains a project file to rebuild libraries on MDK toolchain in the CMSIS\\DSP\\Projects\\ARM folder. + * - arm_cortexM_math.uvprojx + * + * + * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional preprocessor macros detailed above. + * + * Preprocessor Macros + * ------------ + * + * Each library project have different preprocessor macros. + * + * - ARM_MATH_BIG_ENDIAN: + * + * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. + * + * - ARM_MATH_MATRIX_CHECK: + * + * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices + * + * - ARM_MATH_ROUNDING: + * + * Define macro ARM_MATH_ROUNDING for rounding on support functions + * + * - ARM_MATH_LOOPUNROLL: + * + * Define macro ARM_MATH_LOOPUNROLL to enable manual loop unrolling in DSP functions + * + * - ARM_MATH_NEON: + * + * Define macro ARM_MATH_NEON to enable Neon versions of the DSP functions. + * It is not enabled by default when Neon is available because performances are + * dependent on the compiler and target architecture. + * + * - ARM_MATH_NEON_EXPERIMENTAL: + * + * Define macro ARM_MATH_NEON_EXPERIMENTAL to enable experimental Neon versions of + * of some DSP functions. Experimental Neon versions currently do not have better + * performances than the scalar versions. + * + *
+ * CMSIS-DSP in ARM::CMSIS Pack + * ----------------------------- + * + * The following files relevant to CMSIS-DSP are present in the ARM::CMSIS Pack directories: + * |File/Folder |Content | + * |---------------------------------|------------------------------------------------------------------------| + * |\b CMSIS\\Documentation\\DSP | This documentation | + * |\b CMSIS\\DSP\\DSP_Lib_TestSuite | DSP_Lib test suite | + * |\b CMSIS\\DSP\\Examples | Example projects demonstrating the usage of the library functions | + * |\b CMSIS\\DSP\\Include | DSP_Lib include files | + * |\b CMSIS\\DSP\\Lib | DSP_Lib binaries | + * |\b CMSIS\\DSP\\Projects | Projects to rebuild DSP_Lib binaries | + * |\b CMSIS\\DSP\\Source | DSP_Lib source files | + * + *
+ * Revision History of CMSIS-DSP + * ------------ + * Please refer to \ref ChangeLog_pg. + */ + + +/** + * @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 CMSIS 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: + *
+ *     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.
+ *     } arm_matrix_instance_f32;
+ * 
+ * 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 numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
+ *     pData[i*numCols + j]
+ * 
+ * + * \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 \ref arm_mat_init_f32(), \ref arm_mat_init_q31() and \ref arm_mat_init_q15() + * 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: + *
+ * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
+ * 
+ * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData 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: + *
+ *     ARM_MATH_SIZE_MISMATCH
+ * 
+ * Otherwise the functions return + *
+ *     ARM_MATH_SUCCESS
+ * 
+ * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the \#define + *
+ *     ARM_MATH_MATRIX_CHECK
+ * 
+ * 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 ARM_MATH_SUCCESS. + */ + +/** + * @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 groupExamples Examples + */ + + +#ifndef _ARM_MATH_H +#define _ARM_MATH_H + +/* Compiler specific diagnostic adjustment */ +#if defined ( __CC_ARM ) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" + #pragma GCC diagnostic ignored "-Wconversion" + #pragma GCC diagnostic ignored "-Wunused-parameter" + +#elif defined ( __ICCARM__ ) + +#elif defined ( __TI_ARM__ ) + +#elif defined ( __CSMC__ ) + +#elif defined ( __TASKING__ ) + +#elif defined ( _MSC_VER ) + +#else + #error Unknown compiler +#endif + + +/* Included for instrinsics definitions */ +#if !defined ( _MSC_VER ) +#include "cmsis_compiler.h" +#else +#include +#define __STATIC_FORCEINLINE static __forceinline +#define __ALIGNED(x) __declspec(align(x)) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT +#endif + +#include "string.h" +#include "math.h" +#include "float.h" + +/* evaluate ARM DSP feature */ +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + #define ARM_MATH_DSP 1 +#endif + +#if defined(__ARM_NEON) +#include +#endif + + +#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_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 Error status returned by some functions in the library. + */ + + typedef enum + { + ARM_MATH_SUCCESS = 0, /**< No error */ + ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ + ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ + ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation */ + ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ + ARM_MATH_SINGULAR = -5, /**< Input matrix is singular and cannot be inverted */ + ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ + } arm_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 + */ +#if defined ( __CC_ARM ) + #define __SIMD32_TYPE int32_t __packed +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define __SIMD32_TYPE int32_t +#elif defined ( __GNUC__ ) + #define __SIMD32_TYPE int32_t +#elif defined ( __ICCARM__ ) + #define __SIMD32_TYPE int32_t __packed +#elif defined ( __TI_ARM__ ) + #define __SIMD32_TYPE int32_t +#elif defined ( __CSMC__ ) + #define __SIMD32_TYPE int32_t +#elif defined ( __TASKING__ ) + #define __SIMD32_TYPE __un(aligned) int32_t +#elif defined(_MSC_VER ) + #define __SIMD32_TYPE int32_t +#else + #error Unknown compiler +#endif + +#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)) + +/* SIMD replacement */ + + +/** + @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; +} + +/* + +Normally those kind of definitions are in a compiler file +in Core or Core_A. + +But for MSVC compiler it is a bit special. The goal is very specific +to CMSIS-DSP and only to allow the use of this library from other +systems like Python or Matlab. + +MSVC is not going to be used to cross-compile to ARM. So, having a MSVC +compiler file in Core or Core_A would not make sense. + +*/ +#if defined ( _MSC_VER ) + __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 + +#ifndef ARM_MATH_DSP + /** + * @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 ARM_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_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 Function to Calculates 1/in (reciprocal) value of Q31 Data type. + */ + __STATIC_FORCEINLINE uint32_t arm_recip_q31( + q31_t in, + q31_t * dst, + const q31_t * pRecipTable) + { + q31_t out; + uint32_t tempVal; + uint32_t index, i; + uint32_t signBits; + + if (in > 0) + { + signBits = ((uint32_t) (__CLZ( in) - 1)); + } + else + { + signBits = ((uint32_t) (__CLZ(-in) - 1)); + } + + /* Convert input sample to 1.31 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 24); + index = (index & INDEX_MASK); + + /* 1.31 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0U; i < 2U; i++) + { + tempVal = (uint32_t) (((q63_t) in * out) >> 31); + tempVal = 0x7FFFFFFFu - tempVal; + /* 1.31 with exp 1 */ + /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ + out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1U); + } + + + /** + * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. + */ + __STATIC_FORCEINLINE uint32_t arm_recip_q15( + q15_t in, + q15_t * dst, + const q15_t * pRecipTable) + { + q15_t out = 0; + uint32_t tempVal = 0; + uint32_t index = 0, i = 0; + uint32_t signBits = 0; + + if (in > 0) + { + signBits = ((uint32_t)(__CLZ( in) - 17)); + } + else + { + signBits = ((uint32_t)(__CLZ(-in) - 17)); + } + + /* Convert input sample to 1.15 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 8); + index = (index & INDEX_MASK); + + /* 1.15 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0U; i < 2U; i++) + { + tempVal = (uint32_t) (((q31_t) in * out) >> 15); + tempVal = 0x7FFFu - tempVal; + /* 1.15 with exp 1 */ + out = (q15_t) (((q31_t) out * tempVal) >> 14); + /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1); + } + +#if defined(ARM_MATH_NEON) + +static inline float32x4_t __arm_vec_sqrt_f32_neon(float32x4_t x) +{ + float32x4_t x1 = vmaxq_f32(x, vdupq_n_f32(FLT_MIN)); + float32x4_t e = vrsqrteq_f32(x1); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e); + return vmulq_f32(x, e); +} + +static inline int16x8_t __arm_vec_sqrt_q15_neon(int16x8_t vec) +{ + float32x4_t tempF; + int32x4_t tempHI,tempLO; + + tempLO = vmovl_s16(vget_low_s16(vec)); + tempF = vcvtq_n_f32_s32(tempLO,15); + tempF = __arm_vec_sqrt_f32_neon(tempF); + tempLO = vcvtq_n_s32_f32(tempF,15); + + tempHI = vmovl_s16(vget_high_s16(vec)); + tempF = vcvtq_n_f32_s32(tempHI,15); + tempF = __arm_vec_sqrt_f32_neon(tempF); + tempHI = vcvtq_n_s32_f32(tempF,15); + + return(vcombine_s16(vqmovn_s32(tempLO),vqmovn_s32(tempHI))); +} + +static inline int32x4_t __arm_vec_sqrt_q31_neon(int32x4_t vec) +{ + float32x4_t temp; + + temp = vcvtq_n_f32_s32(vec,31); + temp = __arm_vec_sqrt_f32_neon(temp); + return(vcvtq_n_s32_f32(temp,31)); +} + +#endif + +/* + * @brief C custom defined intrinsic functions + */ +#if !defined (ARM_MATH_DSP) + + /* + * @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 'arm_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 /* !defined (ARM_MATH_DSP) */ + + + /** + * @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.*/ + } arm_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.*/ + } arm_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. */ + } arm_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. */ + } arm_fir_instance_f32; + + /** + * @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 arm_fir_q7( + const arm_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 arm_fir_init_q7( + arm_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 arm_fir_q15( + const arm_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 arm_fir_fast_q15( + const arm_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 + * ARM_MATH_SUCCESS if initialization was successful or + * ARM_MATH_ARGUMENT_ERROR if numTaps is not a supported value. + */ + arm_status arm_fir_init_q15( + arm_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 arm_fir_q31( + const arm_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 arm_fir_fast_q31( + const arm_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 arm_fir_init_q31( + arm_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 arm_fir_f32( + const arm_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 arm_fir_init_f32( + arm_fir_instance_f32 * S, + uint16_t numTaps, + const 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. */ + 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. */ + } arm_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. */ + } arm_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. */ + } arm_biquad_casd_df1_inst_f32; + + /** + * @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 arm_biquad_cascade_df1_q15( + const arm_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 arm_biquad_cascade_df1_init_q15( + arm_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 arm_biquad_cascade_df1_fast_q15( + const arm_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 arm_biquad_cascade_df1_q31( + const arm_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 arm_biquad_cascade_df1_fast_q31( + const arm_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 arm_biquad_cascade_df1_init_q31( + arm_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 arm_biquad_cascade_df1_f32( + const arm_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 arm_biquad_cascade_df1_init_f32( + arm_biquad_casd_df1_inst_f32 * S, + uint8_t numStages, + const 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. */ + } arm_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. */ + } arm_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. */ + } arm_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. */ + } arm_matrix_instance_q31; + + /** + * @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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pScratch); + + /** + * @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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_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 ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_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 ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_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 ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_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 + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_fast_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_fast_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scaleFract, + int32_t shift, + arm_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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scaleFract, + int32_t shift, + arm_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 arm_mat_init_q31( + arm_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 arm_mat_init_q15( + arm_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 arm_mat_init_f32( + arm_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 . */ +#if !defined (ARM_MATH_DSP) + q15_t A1; + q15_t A2; +#else + q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ +#endif + 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. */ + } arm_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. */ + } arm_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. */ + } arm_pid_instance_f32; + + + + /** + * @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 arm_pid_init_f32( + arm_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 arm_pid_reset_f32( + arm_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 arm_pid_init_q31( + arm_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 arm_pid_reset_q31( + arm_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 arm_pid_init_q15( + arm_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 arm_pid_reset_q15( + arm_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 */ + } arm_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. */ + } arm_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. */ + } arm_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. */ + } arm_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. */ + } arm_bilinear_interp_instance_q7; + + + /** + * @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 arm_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 arm_mult_q15( + const q15_t * pSrcA, + const 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 arm_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 arm_mult_f32( + const float32_t * pSrcA, + const 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. */ + 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. */ + } arm_cfft_radix2_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q15( + arm_cfft_radix2_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q15( + const arm_cfft_radix2_instance_q15 * S, + q15_t * pSrc); + + + /** + * @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. */ + } arm_cfft_radix4_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + + /** + * @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. */ + } arm_cfft_radix2_instance_q31; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q31( + arm_cfft_radix2_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q31( + const arm_cfft_radix2_instance_q31 * S, + q31_t * pSrc); + + /** + * @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. */ + } arm_cfft_radix4_instance_q31; + +/* Deprecated */ + void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + 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. */ + 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. */ + } arm_cfft_radix2_instance_f32; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_f32( + arm_cfft_radix2_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_f32( + const arm_cfft_radix2_instance_f32 * S, + float32_t * pSrc); + + /** + * @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. */ + } arm_cfft_radix4_instance_f32; + +/* Deprecated */ + arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + + /** + * @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. */ + } arm_cfft_instance_q15; + +void arm_cfft_q15( + const arm_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. */ + } arm_cfft_instance_q31; + +void arm_cfft_q31( + const arm_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. */ + } arm_cfft_instance_f32; + + void arm_cfft_f32( + const arm_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. */ + const q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q15; + + arm_status arm_rfft_init_q15( + arm_rfft_instance_q15 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q15( + const arm_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. */ + const q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q31; + + arm_status arm_rfft_init_q31( + arm_rfft_instance_q31 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q31( + const arm_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. */ + const float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_f32; + + arm_status arm_rfft_init_f32( + arm_rfft_instance_f32 * S, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ +typedef struct + { + arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + const float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ + } arm_rfft_fast_instance_f32 ; + +arm_status arm_rfft_fast_init_f32 ( + arm_rfft_fast_instance_f32 * S, + uint16_t fftLen); + +arm_status arm_rfft_32_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_64_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_128_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_256_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_512_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_1024_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_2048_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + +arm_status arm_rfft_4096_fast_init_f32 ( arm_rfft_fast_instance_f32 * S ); + + + void arm_rfft_fast_f32( + arm_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. */ + const float32_t *pTwiddle; /**< points to the twiddle factor table. */ + const float32_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_f32; + + + /** + * @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 arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. + */ + arm_status arm_dct4_init_f32( + arm_dct4_instance_f32 * S, + arm_rfft_instance_f32 * S_RFFT, + arm_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 arm_dct4_f32( + const arm_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. */ + const q31_t *pTwiddle; /**< points to the twiddle factor table. */ + const q31_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q31; + + + /** + * @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 arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q31( + arm_dct4_instance_q31 * S, + arm_rfft_instance_q31 * S_RFFT, + arm_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 arm_dct4_q31( + const arm_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. */ + const q15_t *pTwiddle; /**< points to the twiddle factor table. */ + const q15_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q15; + + + /** + * @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 arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q15( + arm_dct4_instance_q15 * S, + arm_rfft_instance_q15 * S_RFFT, + arm_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 arm_dct4_q15( + const arm_dct4_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_abs_q31( + const 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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_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 ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_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 ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_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 ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_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 ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_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 ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_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 ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_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 ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_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 ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_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 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. */ + } arm_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. */ + } arm_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. */ + } arm_fir_decimate_instance_f32; + + +/** + @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 arm_fir_decimate_f32( + const arm_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 ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M + */ +arm_status arm_fir_decimate_init_f32( + arm_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 arm_fir_decimate_q15( + const arm_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 arm_fir_decimate_fast_q15( + const arm_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 ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q15( + arm_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 arm_fir_decimate_q31( + const arm_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 arm_fir_decimate_fast_q31( + const arm_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 ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q31( + arm_fir_decimate_instance_q31 * S, + uint16_t numTaps, + uint8_t M, + const 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. */ + 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. */ + } arm_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. */ + } arm_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. */ + } arm_fir_interpolate_instance_f32; + + + /** + * @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 arm_fir_interpolate_q15( + const arm_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 ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q15( + arm_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 arm_fir_interpolate_q31( + const arm_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 ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q31( + arm_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 arm_fir_interpolate_f32( + const arm_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 ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_f32( + arm_fir_interpolate_instance_f32 * S, + uint8_t L, + uint16_t numTaps, + const 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. */ + 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. */ + } arm_biquad_cas_df1_32x64_ins_q31; + + + /** + * @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 arm_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + 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 arm_biquad_cas_df1_32x64_init_q31( + arm_biquad_cas_df1_32x64_ins_q31 * S, + uint8_t numStages, + const 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. */ + const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_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. */ + } arm_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. */ + } arm_biquad_cascade_df2T_instance_f64; + + + /** + * @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 arm_biquad_cascade_df2T_f32( + const arm_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 arm_biquad_cascade_stereo_df2T_f32( + const arm_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 arm_biquad_cascade_df2T_f64( + const arm_biquad_cascade_df2T_instance_f64 * S, + float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + +#if defined(ARM_MATH_NEON) +void arm_biquad_cascade_df2T_compute_coefs_f32( + arm_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 arm_biquad_cascade_df2T_init_f32( + arm_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 arm_biquad_cascade_stereo_df2T_init_f32( + arm_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 arm_biquad_cascade_df2T_init_f64( + arm_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. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_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. */ + } arm_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. */ + } arm_fir_lattice_instance_f32; + + + /** + * @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 arm_fir_lattice_init_q15( + arm_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 arm_fir_lattice_q15( + const arm_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 arm_fir_lattice_init_q31( + arm_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 arm_fir_lattice_q31( + const arm_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 arm_fir_lattice_init_f32( + arm_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 arm_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + const 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. */ + } arm_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. */ + } arm_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. */ + } arm_iir_lattice_instance_f32; + + + /** + * @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 arm_iir_lattice_f32( + const arm_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 arm_iir_lattice_init_f32( + arm_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 arm_iir_lattice_q31( + const arm_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 arm_iir_lattice_init_q31( + arm_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 arm_iir_lattice_q15( + const arm_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 arm_iir_lattice_init_q15( + arm_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. */ + } arm_lms_instance_f32; + + + /** + * @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 arm_lms_f32( + const arm_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 arm_lms_init_f32( + arm_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. */ + } arm_lms_instance_q15; + + + /** + * @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 arm_lms_init_q15( + arm_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 arm_lms_q15( + const arm_lms_instance_q15 * S, + const 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. */ + } arm_lms_instance_q31; + + + /** + * @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 arm_lms_q31( + const arm_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 arm_lms_init_q31( + arm_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. */ + } arm_lms_norm_instance_f32; + + + /** + * @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 arm_lms_norm_f32( + arm_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 arm_lms_norm_init_f32( + arm_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. */ + 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. */ + } arm_lms_norm_instance_q31; + + + /** + * @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 arm_lms_norm_q31( + arm_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 arm_lms_norm_init_q31( + arm_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. */ + 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. */ + } arm_lms_norm_instance_q15; + + + /** + * @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 arm_lms_norm_q15( + arm_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 arm_lms_norm_init_q15( + arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_correlate_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const 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. */ + 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. */ + } arm_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. */ + } arm_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. */ + } arm_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. */ + } arm_fir_sparse_instance_q7; + + + /** + * @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 arm_fir_sparse_f32( + arm_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 arm_fir_sparse_init_f32( + arm_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 arm_fir_sparse_q31( + arm_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 arm_fir_sparse_init_q31( + arm_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 arm_fir_sparse_q15( + arm_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 arm_fir_sparse_init_q15( + arm_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 arm_fir_sparse_q7( + arm_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 arm_fir_sparse_init_q7( + arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_cmplx_mag_squared_q31( + const q31_t * pSrc, + q31_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 arm_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. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
+   *    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
+   * 
+ * + * \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 arm_pid_f32( + arm_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 arm_pid_q31( + arm_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 arm_pid_q15( + arm_pid_instance_q15 * S, + q15_t in) + { + q63_t acc; + q15_t out; + +#if defined (ARM_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((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 ARM_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 ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 * src, + arm_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 ARM_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 ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f64( + const arm_matrix_instance_f64 * src, + arm_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 Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * 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 Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta 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 + * @return none + */ + __STATIC_FORCEINLINE void arm_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 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 + @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 arm_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 pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta 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 a + * @param[out] pIb points to output three-phase coordinate b + * @return none + */ + __STATIC_FORCEINLINE void arm_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 a + @param[out] pIb points to output three-phase coordinate b + @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 arm_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 Ialpha and the Ibeta 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 Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal 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 arm_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 arm_park_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pId, + q31_t * pIq, + q31_t sinVal, + q31_t cosVal) + { + 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); + } + + /** + * @} 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 pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal 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 arm_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 arm_inv_park_q31( + q31_t Id, + q31_t Iq, + q31_t * pIalpha, + q31_t * pIbeta, + q31_t sinVal, + q31_t cosVal) + { + 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); + } + + /** + * @} 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: + *
+   *       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
+   * 
+ * + * \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. + * S points to an instance of the Linear Interpolate function data structure. + * x 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 arm_linear_interp_f32( + arm_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); + } + + + /** + * + * @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 x 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 arm_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 x 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 arm_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 x 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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_cos_q15( + q15_t x); + + + /** + * @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: + *
+   *      x1 = x0 - f(x0)/f'(x0)
+   * 
+ * where x1 is the current estimate, + * x0 is the previous estimate, and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
+   *     x0 = in/2                         [initial guess]
+   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
+   * 
+ */ + + + /** + * @addtogroup SQRT + * @{ + */ + +/** + @brief Floating-point square root function. + @param[in] in input value + @param[out] pOut square root of input value + @return execution status + - \ref ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +__STATIC_FORCEINLINE arm_status arm_sqrt_f32( + float32_t in, + float32_t * pOut) + { + if (in >= 0.0f) + { +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + *pOut = __sqrtf(in); + #else + *pOut = sqrtf(in); + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); + #else + *pOut = sqrtf(in); + #endif + +#else + *pOut = sqrtf(in); +#endif + + return (ARM_MATH_SUCCESS); + } + else + { + *pOut = 0.0f; + return (ARM_MATH_ARGUMENT_ERROR); + } + } + + +/** + @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 ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +arm_status arm_sqrt_q31( + q31_t in, + q31_t * pOut); + + +/** + @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 ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +arm_status arm_sqrt_q15( + q15_t in, + q15_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 ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + void arm_vsqrt_f32( + float32_t * pIn, + float32_t * pOut, + uint16_t len); + + void arm_vsqrt_q31( + q31_t * pIn, + q31_t * pOut, + uint16_t len); + + void arm_vsqrt_q15( + q15_t * pIn, + q15_t * pOut, + uint16_t len); + + /** + * @} end of SQRT group + */ + + + /** + * @brief floating-point Circular write function. + */ + __STATIC_FORCEINLINE void arm_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 arm_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; + } + + + /** + * @brief Q15 Circular write function. + */ + __STATIC_FORCEINLINE void arm_circularWrite_q15( + q15_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q15_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 Q15 Circular Read function. + */ + __STATIC_FORCEINLINE void arm_circularRead_q15( + q15_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q15_t * dst, + q15_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset; + q15_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 wOffset. 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; + } + + + /** + * @brief Q7 Circular write function. + */ + __STATIC_FORCEINLINE void arm_circularWrite_q7( + q7_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q7_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 Q7 Circular Read function. + */ + __STATIC_FORCEINLINE void arm_circularRead_q7( + q7_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q7_t * dst, + q7_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset; + q7_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; + } + + + /** + * @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 arm_power_q31( + const q31_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_cmplx_dot_prod_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + uint32_t numSamples, + q63_t * realResult, + q63_t * imagResult); + + + /** + * @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 arm_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 arm_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 arm_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 arm_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 arm_min_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * result, + uint32_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 arm_min_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_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 arm_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 arm_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 arm_max_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_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 arm_max_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_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 arm_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 arm_max_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + + /** + * @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 arm_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 arm_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 arm_cmplx_mult_cmplx_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 arm_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 arm_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 arm_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 arm_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 arm_q31_to_q15( + const q31_t * pSrc, + q15_t * pDst, + 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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_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 arm_q7_to_q15( + const q7_t * pSrc, + q15_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 f(x, y) 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 CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. + * + * Algorithm + * \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: + *
+   *   typedef struct
+   *   {
+   *     uint16_t numRows;
+   *     uint16_t numCols;
+   *     float32_t *pData;
+   * } arm_bilinear_interp_instance_f32;
+   * 
+ * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
+   *     XF = floor(x)
+   *     YF = floor(y)
+   * 
+ * \par + * The interpolated output point is computed as: + *
+   *  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)
+   * 
+ * 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 arm_bilinear_interp_f32( + const arm_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 arm_bilinear_interp_q31( + arm_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 arm_bilinear_interp_q15( + arm_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 arm_bilinear_interp_q7( + arm_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 + */ + + +/* 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) + + +#if defined ( __CC_ARM ) + /* Enter low optimization region - place directly above function definition */ + #if defined( __ARM_ARCH_7EM__ ) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("push") \ + _Pragma ("O1") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #if defined ( __ARM_ARCH_7EM__ ) + #define LOW_OPTIMIZATION_EXIT \ + _Pragma ("pop") + #else + #define LOW_OPTIMIZATION_EXIT + #endif + + /* Enter low optimization region - place directly above function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __GNUC__ ) + #define LOW_OPTIMIZATION_ENTER \ + __attribute__(( optimize("-O1") )) + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __ICCARM__ ) + /* Enter low optimization region - place directly above function definition */ + #if defined ( __ARM_ARCH_7EM__ ) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define LOW_OPTIMIZATION_EXIT + + /* Enter low optimization region - place directly above function definition */ + #if defined ( __ARM_ARCH_7EM__ ) + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TI_ARM__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __CSMC__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TASKING__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#endif + + +#ifdef __cplusplus +} +#endif + +/* Compiler specific diagnostic adjustment */ +#if defined ( __CC_ARM ) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + +#elif defined ( __GNUC__ ) +#pragma GCC diagnostic pop + +#elif defined ( __ICCARM__ ) + +#elif defined ( __TI_ARM__ ) + +#elif defined ( __CSMC__ ) + +#elif defined ( __TASKING__ ) + +#elif defined ( _MSC_VER ) + +#else + #error Unknown compiler +#endif + +#endif /* _ARM_MATH_H */ + +/** + * + * End of file. + */ diff --git a/CMSIS/DSP/Lib/GCC/libarm_cortexM0l_math.a b/CMSIS/DSP/Lib/GCC/libarm_cortexM0l_math.a new file mode 100644 index 0000000..950d3bd Binary files /dev/null and b/CMSIS/DSP/Lib/GCC/libarm_cortexM0l_math.a differ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c b/CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c new file mode 100644 index 0000000..b444c11 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/BasicMathFunctions.c @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: BasicMathFunctions.c + * Description: Combination of all basic math function source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_abs_f32.c" +#include "arm_abs_q15.c" +#include "arm_abs_q31.c" +#include "arm_abs_q7.c" +#include "arm_add_f32.c" +#include "arm_add_q15.c" +#include "arm_add_q31.c" +#include "arm_add_q7.c" +#include "arm_dot_prod_f32.c" +#include "arm_dot_prod_q15.c" +#include "arm_dot_prod_q31.c" +#include "arm_dot_prod_q7.c" +#include "arm_mult_f32.c" +#include "arm_mult_q15.c" +#include "arm_mult_q31.c" +#include "arm_mult_q7.c" +#include "arm_negate_f32.c" +#include "arm_negate_q15.c" +#include "arm_negate_q31.c" +#include "arm_negate_q7.c" +#include "arm_offset_f32.c" +#include "arm_offset_q15.c" +#include "arm_offset_q31.c" +#include "arm_offset_q7.c" +#include "arm_scale_f32.c" +#include "arm_scale_q15.c" +#include "arm_scale_q31.c" +#include "arm_scale_q7.c" +#include "arm_shift_q15.c" +#include "arm_shift_q31.c" +#include "arm_shift_q7.c" +#include "arm_sub_f32.c" +#include "arm_sub_q15.c" +#include "arm_sub_q31.c" +#include "arm_sub_q7.c" diff --git a/CMSIS/DSP/Source/BasicMathFunctions/CMakeLists.txt b/CMSIS/DSP/Source/BasicMathFunctions/CMakeLists.txt new file mode 100644 index 0000000..717669f --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPBasicMath) + + +file(GLOB SRC "./*_*.c") + +add_library(CMSISDSPBasicMath STATIC ${SRC}) + +configdsp(CMSISDSPBasicMath ..) + +### Includes +target_include_directories(CMSISDSPBasicMath PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_f32.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_f32.c new file mode 100644 index 0000000..a7d2624 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_f32.c @@ -0,0 +1,146 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_abs_f32.c + * Description: Floating-point vector absolute value + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include + +/** + @ingroup groupMath + */ + +/** + @defgroup BasicAbs Vector Absolute Value + + Computes the absolute value of a vector on an element-by-element basis. + +
+      pDst[n] = abs(pSrc[n]),   0 <= n < blockSize.
+  
+ + The functions support in-place computation allowing the source and + destination pointers to reference the same memory buffer. + There are separate functions for floating-point, Q7, Q15, and Q31 data types. + */ + +/** + @addtogroup BasicAbs + @{ + */ + +/** + @brief Floating-point vector absolute value. + @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 arm_abs_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined(ARM_MATH_NEON) + float32x4_t vec1; + float32x4_t res; + + /* Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = |A| */ + + /* Calculate absolute values and then store the results in the destination buffer. */ + vec1 = vld1q_f32(pSrc); + res = vabsq_f32(vec1); + vst1q_f32(pDst, res); + + /* Increment pointers */ + pSrc += 4; + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Tail */ + blkCnt = blockSize & 0x3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = |A| */ + + /* Calculate absolute and store result in destination buffer. */ + *pDst++ = fabsf(*pSrc++); + + *pDst++ = fabsf(*pSrc++); + + *pDst++ = fabsf(*pSrc++); + + *pDst++ = fabsf(*pSrc++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C = |A| */ + + /* Calculate absolute and store result in destination buffer. */ + *pDst++ = fabsf(*pSrc++); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicAbs group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q15.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q15.c new file mode 100644 index 0000000..eb944ce --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q15.c @@ -0,0 +1,132 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_abs_q15.c + * Description: Q15 vector absolute value + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicAbs + @{ + */ + +/** + @brief Q15 vector absolute value. + @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 + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF. + */ + +void arm_abs_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + q15_t in; /* Temporary input variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = |A| */ + + /* Calculate absolute of input (if -1 then saturated to 0x7fff) and store result in destination buffer. */ + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in); +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in); +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in); +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = |A| */ + + /* Calculate absolute of input (if -1 then saturated to 0x7fff) and store result in destination buffer. */ + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicAbs group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q31.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q31.c new file mode 100644 index 0000000..bf7608b --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q31.c @@ -0,0 +1,132 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_abs_q31.c + * Description: Q31 vector absolute value + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicAbs + @{ + */ + +/** + @brief Q31 vector absolute value. + @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 + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF. + */ + +void arm_abs_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t in; /* Temporary variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = |A| */ + + /* Calculate absolute of input (if -1 then saturated to 0x7fffffff) and store result in destination buffer. */ + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in); +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in); +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in); +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = |A| */ + + /* Calculate absolute of input (if -1 then saturated to 0x7fffffff) and store result in destination buffer. */ + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicAbs group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q7.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q7.c new file mode 100644 index 0000000..a6c4a6c --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_abs_q7.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_abs_q7.c + * Description: Q7 vector absolute value + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicAbs + @{ + */ + +/** + @brief Q7 vector absolute value. + @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 + + @par Conditions for optimum performance + Input and output buffers should be aligned by 32-bit + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + The Q7 value -1 (0x80) will be saturated to the maximum allowable positive value 0x7F. + */ + +void arm_abs_q7( + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + q7_t in; /* Temporary input variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = |A| */ + + /* Calculate absolute of input (if -1 then saturated to 0x7f) and store result in destination buffer. */ + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in); +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in); +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in); +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = |A| */ + + /* Calculate absolute of input (if -1 then saturated to 0x7f) and store result in destination buffer. */ + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = (in > 0) ? in : (q7_t) __QSUB(0, in); +#else + *pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicAbs group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_add_f32.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_add_f32.c new file mode 100644 index 0000000..1c66a24 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_add_f32.c @@ -0,0 +1,145 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_add_f32.c + * Description: Floating-point vector addition + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @defgroup BasicAdd Vector Addition + + Element-by-element addition of two vectors. + +
+      pDst[n] = pSrcA[n] + pSrcB[n],   0 <= n < blockSize.
+  
+ + There are separate functions for floating-point, Q7, Q15, and Q31 data types. + */ + +/** + @addtogroup BasicAdd + @{ + */ + +/** + @brief Floating-point vector addition. + @param[in] pSrcA points to first input vector + @param[in] pSrcB points to second input vector + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + */ + +void arm_add_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined(ARM_MATH_NEON) + float32x4_t vec1; + float32x4_t vec2; + float32x4_t res; + + /* Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + B */ + + /* Add and then store the results in the destination buffer. */ + vec1 = vld1q_f32(pSrcA); + vec2 = vld1q_f32(pSrcB); + res = vaddq_f32(vec1, vec2); + vst1q_f32(pDst, res); + + /* Increment pointers */ + pSrcA += 4; + pSrcB += 4; + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Tail */ + blkCnt = blockSize & 0x3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + B */ + + /* Add and store result in destination buffer. */ + *pDst++ = (*pSrcA++) + (*pSrcB++); + *pDst++ = (*pSrcA++) + (*pSrcB++); + *pDst++ = (*pSrcA++) + (*pSrcB++); + *pDst++ = (*pSrcA++) + (*pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C = A + B */ + + /* Add and store result in destination buffer. */ + *pDst++ = (*pSrcA++) + (*pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicAdd group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q15.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q15.c new file mode 100644 index 0000000..bc62937 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q15.c @@ -0,0 +1,126 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_add_q15.c + * Description: Q15 vector addition + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicAdd + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. + */ + +void arm_add_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q31_t inA1, inA2; + q31_t inB1, inB2; +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + B */ + +#if defined (ARM_MATH_DSP) + /* read 2 times 2 samples at a time from sourceA */ + inA1 = read_q15x2_ia ((q15_t **) &pSrcA); + inA2 = read_q15x2_ia ((q15_t **) &pSrcA); + /* read 2 times 2 samples at a time from sourceB */ + inB1 = read_q15x2_ia ((q15_t **) &pSrcB); + inB2 = read_q15x2_ia ((q15_t **) &pSrcB); + + /* Add and store 2 times 2 samples at a time */ + write_q15x2_ia (&pDst, __QADD16(inA1, inB1)); + write_q15x2_ia (&pDst, __QADD16(inA2, inB2)); +#else + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16); + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16); + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16); + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A + B */ + + /* Add and store result in destination buffer. */ +#if defined (ARM_MATH_DSP) + *pDst++ = (q15_t) __QADD16(*pSrcA++, *pSrcB++); +#else + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicAdd group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q31.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q31.c new file mode 100644 index 0000000..3c1cbc2 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q31.c @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_add_q31.c + * Description: Q31 vector addition + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicAdd + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated. + */ + +void arm_add_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + B */ + + /* Add and store result in destination buffer. */ + *pDst++ = __QADD(*pSrcA++, *pSrcB++); + + *pDst++ = __QADD(*pSrcA++, *pSrcB++); + + *pDst++ = __QADD(*pSrcA++, *pSrcB++); + + *pDst++ = __QADD(*pSrcA++, *pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A + B */ + + /* Add and store result in destination buffer. */ + *pDst++ = __QADD(*pSrcA++, *pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicAdd group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q7.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q7.c new file mode 100644 index 0000000..f9c4a95 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_add_q7.c @@ -0,0 +1,109 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_add_q7.c + * Description: Q7 vector addition + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicAdd + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q7 range [0x80 0x7F] are saturated. + */ + +void arm_add_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + B */ + +#if defined (ARM_MATH_DSP) + /* Add and store result in destination buffer (4 samples at a time). */ + write_q7x4_ia (&pDst, __QADD8 (read_q7x4_ia ((q7_t **) &pSrcA), read_q7x4_ia ((q7_t **) &pSrcB))); +#else + *pDst++ = (q7_t) __SSAT ((q15_t) *pSrcA++ + *pSrcB++, 8); + *pDst++ = (q7_t) __SSAT ((q15_t) *pSrcA++ + *pSrcB++, 8); + *pDst++ = (q7_t) __SSAT ((q15_t) *pSrcA++ + *pSrcB++, 8); + *pDst++ = (q7_t) __SSAT ((q15_t) *pSrcA++ + *pSrcB++, 8); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A + B */ + + /* Add and store result in destination buffer. */ + *pDst++ = (q7_t) __SSAT((q15_t) *pSrcA++ + *pSrcB++, 8); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicAdd group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_f32.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_f32.c new file mode 100644 index 0000000..3eee3b9 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_f32.c @@ -0,0 +1,163 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dot_prod_f32.c + * Description: Floating-point dot product + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @defgroup BasicDotProd Vector Dot Product + + Computes the dot product of two vectors. + The vectors are multiplied element-by-element and then summed. + +
+      sum = pSrcA[0]*pSrcB[0] + pSrcA[1]*pSrcB[1] + ... + pSrcA[blockSize-1]*pSrcB[blockSize-1]
+  
+ + There are separate functions for floating-point, Q7, Q15, and Q31 data types. + */ + +/** + @addtogroup BasicDotProd + @{ + */ + +/** + @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. + @return none + */ + +void arm_dot_prod_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + uint32_t blockSize, + float32_t * result) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t sum = 0.0f; /* Temporary return variable */ + +#if defined(ARM_MATH_NEON) + float32x4_t vec1; + float32x4_t vec2; + float32x4_t res; + float32x4_t accum = vdupq_n_f32(0); + + /* Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + vec1 = vld1q_f32(pSrcA); + vec2 = vld1q_f32(pSrcB); + + while (blkCnt > 0U) + { + /* C = A[0]*B[0] + A[1]*B[1] + A[2]*B[2] + ... + A[blockSize-1]*B[blockSize-1] */ + /* Calculate dot product and then store the result in a temporary buffer. */ + + accum = vmlaq_f32(accum, vec1, vec2); + + /* Increment pointers */ + pSrcA += 4; + pSrcB += 4; + + vec1 = vld1q_f32(pSrcA); + vec2 = vld1q_f32(pSrcB); + + /* Decrement the loop counter */ + blkCnt--; + } + +#if __aarch64__ + sum = vpadds_f32(vpadd_f32(vget_low_f32(accum), vget_high_f32(accum))); +#else + sum = (vpadd_f32(vget_low_f32(accum), vget_high_f32(accum)))[0] + (vpadd_f32(vget_low_f32(accum), vget_high_f32(accum)))[1]; +#endif + + /* Tail */ + blkCnt = blockSize & 0x3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ + + /* Calculate dot product and store result in a temporary buffer. */ + sum += (*pSrcA++) * (*pSrcB++); + + sum += (*pSrcA++) * (*pSrcB++); + + sum += (*pSrcA++) * (*pSrcB++); + + sum += (*pSrcA++) * (*pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ + + /* Calculate dot product and store result in a temporary buffer. */ + sum += (*pSrcA++) * (*pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store result in destination buffer */ + *result = sum; +} + +/** + @} end of BasicDotProd group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q15.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q15.c new file mode 100644 index 0000000..e303b09 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q15.c @@ -0,0 +1,120 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dot_prod_q15.c + * Description: Q15 dot product + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicDotProd + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The intermediate multiplications are in 1.15 x 1.15 = 2.30 format and these + results are added to a 64-bit accumulator in 34.30 format. + Nonsaturating additions are used and given that there are 33 guard bits in the accumulator + there is no risk of overflow. + The return result is in 34.30 format. + */ + +void arm_dot_prod_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + uint32_t blockSize, + q63_t * result) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t sum = 0; /* Temporary return variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ + +#if defined (ARM_MATH_DSP) + /* Calculate dot product and store result in a temporary buffer. */ + sum = __SMLALD(read_q15x2_ia ((q15_t **) &pSrcA), read_q15x2_ia ((q15_t **) &pSrcB), sum); + sum = __SMLALD(read_q15x2_ia ((q15_t **) &pSrcA), read_q15x2_ia ((q15_t **) &pSrcB), sum); +#else + sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++); + sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++); + sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++); + sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ + + /* Calculate dot product and store result in a temporary buffer. */ +//#if defined (ARM_MATH_DSP) +// sum = __SMLALD(*pSrcA++, *pSrcB++, sum); +//#else + sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++); +//#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store result in destination buffer in 34.30 format */ + *result = sum; +} + +/** + @} end of BasicDotProd group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q31.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q31.c new file mode 100644 index 0000000..76cd577 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q31.c @@ -0,0 +1,115 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dot_prod_q31.c + * Description: Q31 dot product + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicDotProd + @{ + */ + +/** + @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. + @return none + + @par Scaling and Overflow Behavior + The intermediate multiplications are in 1.31 x 1.31 = 2.62 format and these + are truncated to 2.48 format by discarding the lower 14 bits. + The 2.48 result is then added without saturation to a 64-bit accumulator in 16.48 format. + There are 15 guard bits in the accumulator and there is no risk of overflow as long as + the length of the vectors is less than 2^16 elements. + The return result is in 16.48 format. + */ + +void arm_dot_prod_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + uint32_t blockSize, + q63_t * result) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t sum = 0; /* Temporary return variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ + + /* Calculate dot product and store result in a temporary buffer. */ + sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U; + + sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U; + + sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U; + + sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ + + /* Calculate dot product and store result in a temporary buffer. */ + sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store result in destination buffer in 16.48 format */ + *result = sum; +} + +/** + @} end of BasicDotProd group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q7.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q7.c new file mode 100644 index 0000000..8e18a73 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_dot_prod_q7.c @@ -0,0 +1,139 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dot_prod_q7.c + * Description: Q7 dot product + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicDotProd + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The intermediate multiplications are in 1.7 x 1.7 = 2.14 format and these + results are added to an accumulator in 18.14 format. + Nonsaturating additions are used and there is no danger of wrap around as long as + the vectors are less than 2^18 elements long. + The return result is in 18.14 format. + */ + +void arm_dot_prod_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + uint32_t blockSize, + q31_t * result) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t sum = 0; /* Temporary return variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q31_t input1, input2; /* Temporary variables */ + q31_t inA1, inA2, inB1, inB2; /* Temporary variables */ +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ + +#if defined (ARM_MATH_DSP) + /* read 4 samples at a time from sourceA */ + input1 = read_q7x4_ia ((q7_t **) &pSrcA); + /* read 4 samples at a time from sourceB */ + input2 = read_q7x4_ia ((q7_t **) &pSrcB); + + /* extract two q7_t samples to q15_t samples */ + inA1 = __SXTB16(__ROR(input1, 8)); + /* extract reminaing two samples */ + inA2 = __SXTB16(input1); + /* extract two q7_t samples to q15_t samples */ + inB1 = __SXTB16(__ROR(input2, 8)); + /* extract reminaing two samples */ + inB2 = __SXTB16(input2); + + /* multiply and accumulate two samples at a time */ + sum = __SMLAD(inA1, inB1, sum); + sum = __SMLAD(inA2, inB2, sum); +#else + sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++); + sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++); + sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++); + sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ + + /* Calculate dot product and store result in a temporary buffer. */ +//#if defined (ARM_MATH_DSP) +// sum = __SMLAD(*pSrcA++, *pSrcB++, sum); +//#else + sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++); +//#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store result in destination buffer in 18.14 format */ + *result = sum; +} + +/** + @} end of BasicDotProd group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_f32.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_f32.c new file mode 100644 index 0000000..53ad73c --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_f32.c @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mult_f32.c + * Description: Floating-point vector multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @defgroup BasicMult Vector Multiplication + + Element-by-element multiplication of two vectors. + +
+      pDst[n] = pSrcA[n] * pSrcB[n],   0 <= n < blockSize.
+  
+ + There are separate functions for floating-point, Q7, Q15, and Q31 data types. + */ + +/** + @addtogroup BasicMult + @{ + */ + +/** + @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. + @return none + */ + +void arm_mult_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined(ARM_MATH_NEON) + float32x4_t vec1; + float32x4_t vec2; + float32x4_t res; + + /* Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * B */ + + /* Multiply the inputs and then store the results in the destination buffer. */ + vec1 = vld1q_f32(pSrcA); + vec2 = vld1q_f32(pSrcB); + res = vmulq_f32(vec1, vec2); + vst1q_f32(pDst, res); + + /* Increment pointers */ + pSrcA += 4; + pSrcB += 4; + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Tail */ + blkCnt = blockSize & 0x3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * B */ + + /* Multiply inputs and store result in destination buffer. */ + *pDst++ = (*pSrcA++) * (*pSrcB++); + + *pDst++ = (*pSrcA++) * (*pSrcB++); + + *pDst++ = (*pSrcA++) * (*pSrcB++); + + *pDst++ = (*pSrcA++) * (*pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C = A * B */ + + /* Multiply input and store result in destination buffer. */ + *pDst++ = (*pSrcA++) * (*pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicMult group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q15.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q15.c new file mode 100644 index 0000000..37aa924 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q15.c @@ -0,0 +1,143 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mult_q15.c + * Description: Q15 vector multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicMult + @{ + */ + +/** + @brief Q15 vector multiplication + @param[in] pSrcA points to first input vector + @param[in] pSrcB points to second input vector + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. + */ + +void arm_mult_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q31_t inA1, inA2, inB1, inB2; /* Temporary input variables */ + q15_t out1, out2, out3, out4; /* Temporary output variables */ + q31_t mul1, mul2, mul3, mul4; /* Temporary variables */ +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * B */ + +#if defined (ARM_MATH_DSP) + /* read 2 samples at a time from sourceA */ + inA1 = read_q15x2_ia ((q15_t **) &pSrcA); + /* read 2 samples at a time from sourceB */ + inB1 = read_q15x2_ia ((q15_t **) &pSrcB); + /* read 2 samples at a time from sourceA */ + inA2 = read_q15x2_ia ((q15_t **) &pSrcA); + /* read 2 samples at a time from sourceB */ + inB2 = read_q15x2_ia ((q15_t **) &pSrcB); + + /* multiply mul = sourceA * sourceB */ + mul1 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1 >> 16)); + mul2 = (q31_t) ((q15_t) (inA1 ) * (q15_t) (inB1 )); + mul3 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) (inB2 >> 16)); + mul4 = (q31_t) ((q15_t) (inA2 ) * (q15_t) (inB2 )); + + /* saturate result to 16 bit */ + out1 = (q15_t) __SSAT(mul1 >> 15, 16); + out2 = (q15_t) __SSAT(mul2 >> 15, 16); + out3 = (q15_t) __SSAT(mul3 >> 15, 16); + out4 = (q15_t) __SSAT(mul4 >> 15, 16); + + /* store result to destination */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pDst, __PKHBT(out2, out1, 16)); + write_q15x2_ia (&pDst, __PKHBT(out4, out3, 16)); +#else + write_q15x2_ia (&pDst, __PKHBT(out1, out2, 16)); + write_q15x2_ia (&pDst, __PKHBT(out3, out4, 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + +#else + *pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16); + *pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16); + *pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16); + *pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A * B */ + + /* Multiply inputs and store result in destination buffer. */ + *pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicMult group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q31.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q31.c new file mode 100644 index 0000000..9592684 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q31.c @@ -0,0 +1,119 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mult_q31.c + * Description: Q31 vector multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicMult + @{ + */ + +/** + @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. + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] are saturated. + */ + +void arm_mult_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t out; /* Temporary output variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * B */ + + /* Multiply inputs and store result in destination buffer. */ + out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32; + out = __SSAT(out, 31); + *pDst++ = out << 1U; + + out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32; + out = __SSAT(out, 31); + *pDst++ = out << 1U; + + out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32; + out = __SSAT(out, 31); + *pDst++ = out << 1U; + + out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32; + out = __SSAT(out, 31); + *pDst++ = out << 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A * B */ + + /* Multiply inputs and store result in destination buffer. */ + out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32; + out = __SSAT(out, 31); + *pDst++ = out << 1U; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicMult group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q7.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q7.c new file mode 100644 index 0000000..5587ce5 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_mult_q7.c @@ -0,0 +1,119 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mult_q7.c + * Description: Q7 vector multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicMult + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q7 range [0x80 0x7F] are saturated. + */ + +void arm_mult_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q7_t out1, out2, out3, out4; /* Temporary output variables */ +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * B */ + +#if defined (ARM_MATH_DSP) + /* Multiply inputs and store results in temporary variables */ + out1 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); + out2 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); + out3 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); + out4 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); + + /* Pack and store result in destination buffer (in single write) */ + write_q7x4_ia (&pDst, __PACKq7(out1, out2, out3, out4)); +#else + *pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); + *pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); + *pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); + *pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A * B */ + + /* Multiply input and store result in destination buffer. */ + *pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicMult group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_f32.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_f32.c new file mode 100644 index 0000000..f807112 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_f32.c @@ -0,0 +1,145 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_negate_f32.c + * Description: Negates floating-point vectors + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @defgroup BasicNegate Vector Negate + + Negates the elements of a vector. + +
+      pDst[n] = -pSrc[n],   0 <= n < blockSize.
+  
+ + The functions support in-place computation allowing the source and + destination pointers to reference the same memory buffer. + There are separate functions for floating-point, Q7, Q15, and Q31 data types. + */ + +/** + @addtogroup BasicNegate + @{ + */ + +/** + @brief Negates the elements of a floating-point vector. + @param[in] pSrc points to input vector. + @param[out] pDst points to output vector. + @param[in] blockSize number of samples in each vector. + @return none + */ + +void arm_negate_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined(ARM_MATH_NEON_EXPERIMENTAL) + float32x4_t vec1; + float32x4_t res; + + /* Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = -A */ + + /* Negate and then store the results in the destination buffer. */ + vec1 = vld1q_f32(pSrc); + res = vnegq_f32(vec1); + vst1q_f32(pDst, res); + + /* Increment pointers */ + pSrc += 4; + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Tail */ + blkCnt = blockSize & 0x3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = -A */ + + /* Negate and store result in destination buffer. */ + *pDst++ = -*pSrc++; + + *pDst++ = -*pSrc++; + + *pDst++ = -*pSrc++; + + *pDst++ = -*pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON_EXPERIMENTAL) */ + + while (blkCnt > 0U) + { + /* C = -A */ + + /* Negate and store result in destination buffer. */ + *pDst++ = -*pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicNegate group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q15.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q15.c new file mode 100644 index 0000000..267e4cc --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q15.c @@ -0,0 +1,126 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_negate_q15.c + * Description: Negates Q15 vectors + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicNegate + @{ + */ + +/** + @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 each vector. + @return none + + @par Conditions for optimum performance + Input and output buffers should be aligned by 32-bit + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + The Q15 value -1 (0x8000) is saturated to the maximum allowable positive value 0x7FFF. + */ + +void arm_negate_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + q15_t in; /* Temporary input variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q31_t in1; /* Temporary input variables */ +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = -A */ + +#if defined (ARM_MATH_DSP) + /* Negate and store result in destination buffer (2 samples at a time). */ + in1 = read_q15x2_ia ((q15_t **) &pSrc); + write_q15x2_ia (&pDst, __QSUB16(0, in1)); + + in1 = read_q15x2_ia ((q15_t **) &pSrc); + write_q15x2_ia (&pDst, __QSUB16(0, in1)); +#else + in = *pSrc++; + *pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in; + + in = *pSrc++; + *pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in; + + in = *pSrc++; + *pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in; + + in = *pSrc++; + *pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in; +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = -A */ + + /* Negate and store result in destination buffer. */ + in = *pSrc++; + *pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicNegate group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q31.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q31.c new file mode 100644 index 0000000..645fb0a --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q31.c @@ -0,0 +1,132 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_negate_q31.c + * Description: Negates Q31 vectors + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicNegate + @{ + */ + +/** + @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 each vector. + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + The Q31 value -1 (0x80000000) is saturated to the maximum allowable positive value 0x7FFFFFFF. + */ + +void arm_negate_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t in; /* Temporary input variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = -A */ + + /* Negate and store result in destination buffer. */ + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = -A */ + + /* Negate and store result in destination buffer. */ + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicNegate group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q7.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q7.c new file mode 100644 index 0000000..40a373e --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_negate_q7.c @@ -0,0 +1,126 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_negate_q7.c + * Description: Negates Q7 vectors + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicNegate + @{ + */ + +/** + @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 each vector. + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + The Q7 value -1 (0x80) is saturated to the maximum allowable positive value 0x7F. + */ + +void arm_negate_q7( + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + q7_t in; /* Temporary input variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q31_t in1; /* Temporary input variable */ +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = -A */ + +#if defined (ARM_MATH_DSP) + /* Negate and store result in destination buffer (4 samples at a time). */ + in1 = read_q7x4_ia ((q7_t **) &pSrc); + write_q7x4_ia (&pDst, __QSUB8(0, in1)); +#else + in = *pSrc++; + *pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in; + + in = *pSrc++; + *pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in; + + in = *pSrc++; + *pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in; + + in = *pSrc++; + *pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in; +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = -A */ + + /* Negate and store result in destination buffer. */ + in = *pSrc++; + +#if defined (ARM_MATH_DSP) + *pDst++ = (q7_t) __QSUB(0, in); +#else + *pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in; +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicNegate group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_f32.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_f32.c new file mode 100644 index 0000000..b10e3f1 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_f32.c @@ -0,0 +1,147 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_offset_f32.c + * Description: Floating-point vector offset + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @defgroup BasicOffset Vector Offset + + Adds a constant offset to each element of a vector. + +
+      pDst[n] = pSrc[n] + offset,   0 <= n < blockSize.
+  
+ + The functions support in-place computation allowing the source and + destination pointers to reference the same memory buffer. + There are separate functions for floating-point, Q7, Q15, and Q31 data types. + */ + +/** + @addtogroup BasicOffset + @{ + */ + +/** + @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 each vector + @return none + */ + +void arm_offset_f32( + const float32_t * pSrc, + float32_t offset, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined(ARM_MATH_NEON_EXPERIMENTAL) + float32x4_t vec1; + float32x4_t res; + + /* Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + offset */ + + /* Add offset and then store the results in the destination buffer. */ + vec1 = vld1q_f32(pSrc); + res = vaddq_f32(vec1,vdupq_n_f32(offset)); + vst1q_f32(pDst, res); + + /* Increment pointers */ + pSrc += 4; + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Tail */ + blkCnt = blockSize & 0x3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + offset */ + + /* Add offset and store result in destination buffer. */ + *pDst++ = (*pSrc++) + offset; + + *pDst++ = (*pSrc++) + offset; + + *pDst++ = (*pSrc++) + offset; + + *pDst++ = (*pSrc++) + offset; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON_EXPERIMENTAL) */ + + while (blkCnt > 0U) + { + /* C = A + offset */ + + /* Add offset and store result in destination buffer. */ + *pDst++ = (*pSrc++) + offset; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicOffset group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q15.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q15.c new file mode 100644 index 0000000..cd2f22b --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q15.c @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_offset_q15.c + * Description: Q15 vector offset + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicOffset + @{ + */ + +/** + @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 each vector + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. + */ + +void arm_offset_q15( + const q15_t * pSrc, + q15_t offset, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q31_t offset_packed; /* Offset packed to 32 bit */ + + /* Offset is packed to 32 bit in order to use SIMD32 for addition */ + offset_packed = __PKHBT(offset, offset, 16); +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + offset */ + +#if defined (ARM_MATH_DSP) + /* Add offset and store result in destination buffer (2 samples at a time). */ + write_q15x2_ia (&pDst, __QADD16(read_q15x2_ia ((q15_t **) &pSrc), offset_packed)); + write_q15x2_ia (&pDst, __QADD16(read_q15x2_ia ((q15_t **) &pSrc), offset_packed)); +#else + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16); + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16); + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16); + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A + offset */ + + /* Add offset and store result in destination buffer. */ +#if defined (ARM_MATH_DSP) + *pDst++ = (q15_t) __QADD16(*pSrc++, offset); +#else + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicOffset group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q31.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q31.c new file mode 100644 index 0000000..5de36b4 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q31.c @@ -0,0 +1,128 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_offset_q31.c + * Description: Q31 vector offset + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicOffset + @{ + */ + +/** + @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 each vector + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated. + */ + +void arm_offset_q31( + const q31_t * pSrc, + q31_t offset, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + offset */ + + /* Add offset and store result in destination buffer. */ +#if defined (ARM_MATH_DSP) + *pDst++ = __QADD(*pSrc++, offset); +#else + *pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset); +#endif + +#if defined (ARM_MATH_DSP) + *pDst++ = __QADD(*pSrc++, offset); +#else + *pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset); +#endif + +#if defined (ARM_MATH_DSP) + *pDst++ = __QADD(*pSrc++, offset); +#else + *pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset); +#endif + +#if defined (ARM_MATH_DSP) + *pDst++ = __QADD(*pSrc++, offset); +#else + *pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A + offset */ + + /* Add offset and store result in destination buffer. */ +#if defined (ARM_MATH_DSP) + *pDst++ = __QADD(*pSrc++, offset); +#else + *pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicOffset group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q7.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q7.c new file mode 100644 index 0000000..f67db45 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_offset_q7.c @@ -0,0 +1,116 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_offset_q7.c + * Description: Q7 vector offset + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicOffset + @{ + */ + +/** + @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 each vector + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q7 range [0x80 0x7F] are saturated. + */ + +void arm_offset_q7( + const q7_t * pSrc, + q7_t offset, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q31_t offset_packed; /* Offset packed to 32 bit */ + + /* Offset is packed to 32 bit in order to use SIMD32 for addition */ + offset_packed = __PACKq7(offset, offset, offset, offset); +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A + offset */ + +#if defined (ARM_MATH_DSP) + /* Add offset and store result in destination buffer (4 samples at a time). */ + write_q7x4_ia (&pDst, __QADD8(read_q7x4_ia ((q7_t **) &pSrc), offset_packed)); +#else + *pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8); + *pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8); + *pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8); + *pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A + offset */ + + /* Add offset and store result in destination buffer. */ + *pDst++ = (q7_t) __SSAT((q15_t) *pSrc++ + offset, 8); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicOffset group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_f32.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_f32.c new file mode 100644 index 0000000..72ecbe5 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_f32.c @@ -0,0 +1,159 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_scale_f32.c + * Description: Multiplies a floating-point vector by a scalar + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @defgroup BasicScale Vector Scale + + Multiply a vector by a scalar value. For floating-point data, the algorithm used is: + +
+      pDst[n] = pSrc[n] * scale,   0 <= n < blockSize.
+  
+ + In the fixed-point Q7, Q15, and Q31 functions, scale is represented by + a fractional multiplication scaleFract and an arithmetic shift shift. + The shift allows the gain of the scaling operation to exceed 1.0. + The algorithm used with fixed-point data is: + +
+      pDst[n] = (pSrc[n] * scaleFract) << shift,   0 <= n < blockSize.
+  
+ + The overall scale factor applied to the fixed-point data is +
+      scale = scaleFract * 2^shift.
+  
+ + The functions support in-place computation allowing the source and destination + pointers to reference the same memory buffer. + */ + +/** + @addtogroup BasicScale + @{ + */ + +/** + @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 each vector + @return none + */ + +void arm_scale_f32( + const float32_t *pSrc, + float32_t scale, + float32_t *pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ +#if defined(ARM_MATH_NEON_EXPERIMENTAL) + float32x4_t vec1; + float32x4_t res; + + /* Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * scale */ + + /* Scale the input and then store the results in the destination buffer. */ + vec1 = vld1q_f32(pSrc); + res = vmulq_f32(vec1, vdupq_n_f32(scale)); + vst1q_f32(pDst, res); + + /* Increment pointers */ + pSrc += 4; + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Tail */ + blkCnt = blockSize & 0x3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * scale */ + + /* Scale input and store result in destination buffer. */ + *pDst++ = (*pSrc++) * scale; + + *pDst++ = (*pSrc++) * scale; + + *pDst++ = (*pSrc++) * scale; + + *pDst++ = (*pSrc++) * scale; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON_EXPERIMENTAL) */ + + while (blkCnt > 0U) + { + /* C = A * scale */ + + /* Scale input and store result in destination buffer. */ + *pDst++ = (*pSrc++) * scale; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicScale group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q15.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q15.c new file mode 100644 index 0000000..039b93d --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q15.c @@ -0,0 +1,144 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_scale_q15.c + * Description: Multiplies a Q15 vector by a scalar + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicScale + @{ + */ + +/** + @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 each vector + @return none + + @par Scaling and Overflow Behavior + The input data *pSrc and scaleFract are in 1.15 format. + These are multiplied to yield a 2.30 intermediate result and this is shifted with saturation to 1.15 format. + */ + +void arm_scale_q15( + const q15_t *pSrc, + q15_t scaleFract, + int8_t shift, + q15_t *pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + int8_t kShift = 15 - shift; /* Shift to apply after scaling */ + +#if defined (ARM_MATH_LOOPUNROLL) +#if defined (ARM_MATH_DSP) + q31_t inA1, inA2; + q31_t out1, out2, out3, out4; /* Temporary output variables */ + q15_t in1, in2, in3, in4; /* Temporary input variables */ +#endif +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * scale */ + +#if defined (ARM_MATH_DSP) + /* read 2 times 2 samples at a time from source */ + inA1 = read_q15x2_ia ((q15_t **) &pSrc); + inA2 = read_q15x2_ia ((q15_t **) &pSrc); + + /* Scale inputs and store result in temporary variables + * in single cycle by packing the outputs */ + out1 = (q31_t) ((q15_t) (inA1 >> 16) * scaleFract); + out2 = (q31_t) ((q15_t) (inA1 ) * scaleFract); + out3 = (q31_t) ((q15_t) (inA2 >> 16) * scaleFract); + out4 = (q31_t) ((q15_t) (inA2 ) * scaleFract); + + /* apply shifting */ + out1 = out1 >> kShift; + out2 = out2 >> kShift; + out3 = out3 >> kShift; + out4 = out4 >> kShift; + + /* saturate the output */ + in1 = (q15_t) (__SSAT(out1, 16)); + in2 = (q15_t) (__SSAT(out2, 16)); + in3 = (q15_t) (__SSAT(out3, 16)); + in4 = (q15_t) (__SSAT(out4, 16)); + + /* store result to destination */ + write_q15x2_ia (&pDst, __PKHBT(in2, in1, 16)); + write_q15x2_ia (&pDst, __PKHBT(in4, in3, 16)); +#else + *pDst++ = (q15_t) (__SSAT(((q31_t) *pSrc++ * scaleFract) >> kShift, 16)); + *pDst++ = (q15_t) (__SSAT(((q31_t) *pSrc++ * scaleFract) >> kShift, 16)); + *pDst++ = (q15_t) (__SSAT(((q31_t) *pSrc++ * scaleFract) >> kShift, 16)); + *pDst++ = (q15_t) (__SSAT(((q31_t) *pSrc++ * scaleFract) >> kShift, 16)); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A * scale */ + + /* Scale input and store result in destination buffer. */ + *pDst++ = (q15_t) (__SSAT(((q31_t) *pSrc++ * scaleFract) >> kShift, 16)); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicScale group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q31.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q31.c new file mode 100644 index 0000000..d762ca7 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q31.c @@ -0,0 +1,191 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_scale_q31.c + * Description: Multiplies a Q31 vector by a scalar + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicScale + @{ + */ + +/** + @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 each vector + @return none + + @par Scaling and Overflow Behavior + The input data *pSrc and scaleFract are in 1.31 format. + These are multiplied to yield a 2.62 intermediate result and this is shifted with saturation to 1.31 format. + */ + +void arm_scale_q31( + const q31_t *pSrc, + q31_t scaleFract, + int8_t shift, + q31_t *pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t in, out; /* Temporary variables */ + int8_t kShift = shift + 1; /* Shift to apply after scaling */ + int8_t sign = (kShift & 0x80); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + if (sign == 0U) + { + while (blkCnt > 0U) + { + /* C = A * scale */ + + /* Scale input and store result in destination buffer. */ + in = *pSrc++; /* read input from source */ + in = ((q63_t) in * scaleFract) >> 32; /* multiply input with scaler value */ + out = in << kShift; /* apply shifting */ + if (in != (out >> kShift)) /* saturate the result */ + out = 0x7FFFFFFF ^ (in >> 31); + *pDst++ = out; /* Store result destination */ + + in = *pSrc++; + in = ((q63_t) in * scaleFract) >> 32; + out = in << kShift; + if (in != (out >> kShift)) + out = 0x7FFFFFFF ^ (in >> 31); + *pDst++ = out; + + in = *pSrc++; + in = ((q63_t) in * scaleFract) >> 32; + out = in << kShift; + if (in != (out >> kShift)) + out = 0x7FFFFFFF ^ (in >> 31); + *pDst++ = out; + + in = *pSrc++; + in = ((q63_t) in * scaleFract) >> 32; + out = in << kShift; + if (in != (out >> kShift)) + out = 0x7FFFFFFF ^ (in >> 31); + *pDst++ = out; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + while (blkCnt > 0U) + { + /* C = A * scale */ + + /* Scale input and store result in destination buffer. */ + in = *pSrc++; /* read four inputs from source */ + in = ((q63_t) in * scaleFract) >> 32; /* multiply input with scaler value */ + out = in >> -kShift; /* apply shifting */ + *pDst++ = out; /* Store result destination */ + + in = *pSrc++; + in = ((q63_t) in * scaleFract) >> 32; + out = in >> -kShift; + *pDst++ = out; + + in = *pSrc++; + in = ((q63_t) in * scaleFract) >> 32; + out = in >> -kShift; + *pDst++ = out; + + in = *pSrc++; + in = ((q63_t) in * scaleFract) >> 32; + out = in >> -kShift; + *pDst++ = out; + + /* Decrement loop counter */ + blkCnt--; + } + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + if (sign == 0U) + { + while (blkCnt > 0U) + { + /* C = A * scale */ + + /* Scale input and store result in destination buffer. */ + in = *pSrc++; + in = ((q63_t) in * scaleFract) >> 32; + out = in << kShift; + if (in != (out >> kShift)) + out = 0x7FFFFFFF ^ (in >> 31); + *pDst++ = out; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + while (blkCnt > 0U) + { + /* C = A * scale */ + + /* Scale input and store result in destination buffer. */ + in = *pSrc++; + in = ((q63_t) in * scaleFract) >> 32; + out = in >> -kShift; + *pDst++ = out; + + /* Decrement loop counter */ + blkCnt--; + } + } + +} + +/** + @} end of BasicScale group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q7.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q7.c new file mode 100644 index 0000000..cb967d2 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_scale_q7.c @@ -0,0 +1,129 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_scale_q7.c + * Description: Multiplies a Q7 vector by a scalar + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicScale + @{ + */ + +/** + @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 each vector + @return none + + @par Scaling and Overflow Behavior + The input data *pSrc and scaleFract are in 1.7 format. + These are multiplied to yield a 2.14 intermediate result and this is shifted with saturation to 1.7 format. + */ + +void arm_scale_q7( + const q7_t * pSrc, + q7_t scaleFract, + int8_t shift, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + int8_t kShift = 7 - shift; /* Shift to apply after scaling */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q7_t in1, in2, in3, in4; /* Temporary input variables */ + q7_t out1, out2, out3, out4; /* Temporary output variables */ +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * scale */ + +#if defined (ARM_MATH_DSP) + /* Reading 4 inputs from memory */ + in1 = *pSrc++; + in2 = *pSrc++; + in3 = *pSrc++; + in4 = *pSrc++; + + /* Scale inputs and store result in the temporary variable. */ + out1 = (q7_t) (__SSAT(((in1) * scaleFract) >> kShift, 8)); + out2 = (q7_t) (__SSAT(((in2) * scaleFract) >> kShift, 8)); + out3 = (q7_t) (__SSAT(((in3) * scaleFract) >> kShift, 8)); + out4 = (q7_t) (__SSAT(((in4) * scaleFract) >> kShift, 8)); + + /* Pack and store result in destination buffer (in single write) */ + write_q7x4_ia (&pDst, __PACKq7(out1, out2, out3, out4)); +#else + *pDst++ = (q7_t) (__SSAT((((q15_t) *pSrc++ * scaleFract) >> kShift), 8)); + *pDst++ = (q7_t) (__SSAT((((q15_t) *pSrc++ * scaleFract) >> kShift), 8)); + *pDst++ = (q7_t) (__SSAT((((q15_t) *pSrc++ * scaleFract) >> kShift), 8)); + *pDst++ = (q7_t) (__SSAT((((q15_t) *pSrc++ * scaleFract) >> kShift), 8)); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A * scale */ + + /* Scale input and store result in destination buffer. */ + *pDst++ = (q7_t) (__SSAT((((q15_t) *pSrc++ * scaleFract) >> kShift), 8)); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicScale group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q15.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q15.c new file mode 100644 index 0000000..8a15155 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q15.c @@ -0,0 +1,201 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_shift_q15.c + * Description: Shifts the elements of a Q15 vector by a specified number of bits + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicShift + @{ + */ + +/** + @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 each vector + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. + */ + +void arm_shift_q15( + const q15_t * pSrc, + int8_t shiftBits, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + uint8_t sign = (shiftBits & 0x80); /* Sign of shiftBits */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q15_t in1, in2; /* Temporary input variables */ +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + /* If the shift value is positive then do right shift else left shift */ + if (sign == 0U) + { + while (blkCnt > 0U) + { + /* C = A << shiftBits */ + +#if defined (ARM_MATH_DSP) + /* read 2 samples from source */ + in1 = *pSrc++; + in2 = *pSrc++; + + /* Shift the inputs and then store the results in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pDst, __PKHBT(__SSAT((in1 << shiftBits), 16), + __SSAT((in2 << shiftBits), 16), 16)); +#else + write_q15x2_ia (&pDst, __PKHBT(__SSAT((in2 << shiftBits), 16), + __SSAT((in1 << shiftBits), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* read 2 samples from source */ + in1 = *pSrc++; + in2 = *pSrc++; + +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pDst, __PKHBT(__SSAT((in1 << shiftBits), 16), + __SSAT((in2 << shiftBits), 16), 16)); +#else + write_q15x2_ia (&pDst, __PKHBT(__SSAT((in2 << shiftBits), 16), + __SSAT((in1 << shiftBits), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + +#else + *pDst++ = __SSAT(((q31_t) *pSrc++ << shiftBits), 16); + *pDst++ = __SSAT(((q31_t) *pSrc++ << shiftBits), 16); + *pDst++ = __SSAT(((q31_t) *pSrc++ << shiftBits), 16); + *pDst++ = __SSAT(((q31_t) *pSrc++ << shiftBits), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + while (blkCnt > 0U) + { + /* C = A >> shiftBits */ + +#if defined (ARM_MATH_DSP) + /* read 2 samples from source */ + in1 = *pSrc++; + in2 = *pSrc++; + + /* Shift the inputs and then store the results in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pDst, __PKHBT((in1 >> -shiftBits), + (in2 >> -shiftBits), 16)); +#else + write_q15x2_ia (&pDst, __PKHBT((in2 >> -shiftBits), + (in1 >> -shiftBits), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* read 2 samples from source */ + in1 = *pSrc++; + in2 = *pSrc++; + +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pDst, __PKHBT((in1 >> -shiftBits), + (in2 >> -shiftBits), 16)); +#else + write_q15x2_ia (&pDst, __PKHBT((in2 >> -shiftBits), + (in1 >> -shiftBits), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + +#else + *pDst++ = (*pSrc++ >> -shiftBits); + *pDst++ = (*pSrc++ >> -shiftBits); + *pDst++ = (*pSrc++ >> -shiftBits); + *pDst++ = (*pSrc++ >> -shiftBits); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* If the shift value is positive then do right shift else left shift */ + if (sign == 0U) + { + while (blkCnt > 0U) + { + /* C = A << shiftBits */ + + /* Shift input and store result in destination buffer. */ + *pDst++ = __SSAT(((q31_t) *pSrc++ << shiftBits), 16); + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + while (blkCnt > 0U) + { + /* C = A >> shiftBits */ + + /* Shift input and store result in destination buffer. */ + *pDst++ = (*pSrc++ >> -shiftBits); + + /* Decrement loop counter */ + blkCnt--; + } + } + +} + +/** + @} end of BasicShift group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q31.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q31.c new file mode 100644 index 0000000..db6060a --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q31.c @@ -0,0 +1,181 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_shift_q31.c + * Description: Shifts the elements of a Q31 vector by a specified number of bits + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ +/** + @defgroup BasicShift Vector Shift + + Shifts the elements of a fixed-point vector by a specified number of bits. + There are separate functions for Q7, Q15, and Q31 data types. + The underlying algorithm used is: + +
+      pDst[n] = pSrc[n] << shift,   0 <= n < blockSize.
+  
+ + If shift is positive then the elements of the vector are shifted to the left. + If shift is negative then the elements of the vector are shifted to the right. + + The functions support in-place computation allowing the source and destination + pointers to reference the same memory buffer. + */ + +/** + @addtogroup BasicShift + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated. + */ + +void arm_shift_q31( + const q31_t * pSrc, + int8_t shiftBits, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + uint8_t sign = (shiftBits & 0x80); /* Sign of shiftBits */ + +#if defined (ARM_MATH_LOOPUNROLL) + + q31_t in, out; /* Temporary variables */ + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + /* If the shift value is positive then do right shift else left shift */ + if (sign == 0U) + { + while (blkCnt > 0U) + { + /* C = A << shiftBits */ + + /* Shift input and store result in destination buffer. */ + in = *pSrc++; + out = in << shiftBits; + if (in != (out >> shiftBits)) + out = 0x7FFFFFFF ^ (in >> 31); + *pDst++ = out; + + in = *pSrc++; + out = in << shiftBits; + if (in != (out >> shiftBits)) + out = 0x7FFFFFFF ^ (in >> 31); + *pDst++ = out; + + in = *pSrc++; + out = in << shiftBits; + if (in != (out >> shiftBits)) + out = 0x7FFFFFFF ^ (in >> 31); + *pDst++ = out; + + in = *pSrc++; + out = in << shiftBits; + if (in != (out >> shiftBits)) + out = 0x7FFFFFFF ^ (in >> 31); + *pDst++ = out; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + while (blkCnt > 0U) + { + /* C = A >> shiftBits */ + + /* Shift input and store results in destination buffer. */ + *pDst++ = (*pSrc++ >> -shiftBits); + *pDst++ = (*pSrc++ >> -shiftBits); + *pDst++ = (*pSrc++ >> -shiftBits); + *pDst++ = (*pSrc++ >> -shiftBits); + + /* Decrement loop counter */ + blkCnt--; + } + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* If the shift value is positive then do right shift else left shift */ + if (sign == 0U) + { + while (blkCnt > 0U) + { + /* C = A << shiftBits */ + + /* Shift input and store result in destination buffer. */ + *pDst++ = clip_q63_to_q31((q63_t) *pSrc++ << shiftBits); + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + while (blkCnt > 0U) + { + /* C = A >> shiftBits */ + + /* Shift input and store result in destination buffer. */ + *pDst++ = (*pSrc++ >> -shiftBits); + + /* Decrement loop counter */ + blkCnt--; + } + } + +} + +/** + @} end of BasicShift group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q7.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q7.c new file mode 100644 index 0000000..c4163fc --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_shift_q7.c @@ -0,0 +1,175 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_shift_q7.c + * Description: Processing function for the Q7 Shifting + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicShift + @{ + */ + +/** + @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 each vector + @return none + + @par onditions for optimum performance + Input and output buffers should be aligned by 32-bit + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q7 range [0x80 0x7F] are saturated. + */ + +void arm_shift_q7( + const q7_t * pSrc, + int8_t shiftBits, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + uint8_t sign = (shiftBits & 0x80); /* Sign of shiftBits */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q7_t in1, in2, in3, in4; /* Temporary input variables */ +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + /* If the shift value is positive then do right shift else left shift */ + if (sign == 0U) + { + while (blkCnt > 0U) + { + /* C = A << shiftBits */ + +#if defined (ARM_MATH_DSP) + /* Read 4 inputs */ + in1 = *pSrc++; + in2 = *pSrc++; + in3 = *pSrc++; + in4 = *pSrc++; + + /* Pack and store result in destination buffer (in single write) */ + write_q7x4_ia (&pDst, __PACKq7(__SSAT((in1 << shiftBits), 8), + __SSAT((in2 << shiftBits), 8), + __SSAT((in3 << shiftBits), 8), + __SSAT((in4 << shiftBits), 8) )); +#else + *pDst++ = (q7_t) __SSAT(((q15_t) *pSrc++ << shiftBits), 8); + *pDst++ = (q7_t) __SSAT(((q15_t) *pSrc++ << shiftBits), 8); + *pDst++ = (q7_t) __SSAT(((q15_t) *pSrc++ << shiftBits), 8); + *pDst++ = (q7_t) __SSAT(((q15_t) *pSrc++ << shiftBits), 8); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + while (blkCnt > 0U) + { + /* C = A >> shiftBits */ + +#if defined (ARM_MATH_DSP) + /* Read 4 inputs */ + in1 = *pSrc++; + in2 = *pSrc++; + in3 = *pSrc++; + in4 = *pSrc++; + + /* Pack and store result in destination buffer (in single write) */ + write_q7x4_ia (&pDst, __PACKq7((in1 >> -shiftBits), + (in2 >> -shiftBits), + (in3 >> -shiftBits), + (in4 >> -shiftBits) )); +#else + *pDst++ = (*pSrc++ >> -shiftBits); + *pDst++ = (*pSrc++ >> -shiftBits); + *pDst++ = (*pSrc++ >> -shiftBits); + *pDst++ = (*pSrc++ >> -shiftBits); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* If the shift value is positive then do right shift else left shift */ + if (sign == 0U) + { + while (blkCnt > 0U) + { + /* C = A << shiftBits */ + + /* Shift input and store result in destination buffer. */ + *pDst++ = (q7_t) __SSAT(((q15_t) *pSrc++ << shiftBits), 8); + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + while (blkCnt > 0U) + { + /* C = A >> shiftBits */ + + /* Shift input and store result in destination buffer. */ + *pDst++ = (*pSrc++ >> -shiftBits); + + /* Decrement loop counter */ + blkCnt--; + } + } + +} + +/** + @} end of BasicShift group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_f32.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_f32.c new file mode 100644 index 0000000..4c97af3 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_f32.c @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sub_f32.c + * Description: Floating-point vector subtraction + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @defgroup BasicSub Vector Subtraction + + Element-by-element subtraction of two vectors. + +
+      pDst[n] = pSrcA[n] - pSrcB[n],   0 <= n < blockSize.
+  
+ + There are separate functions for floating-point, Q7, Q15, and Q31 data types. + */ + +/** + @addtogroup BasicSub + @{ + */ + +/** + @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 + @return none + */ + +void arm_sub_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined(ARM_MATH_NEON) + float32x4_t vec1; + float32x4_t vec2; + float32x4_t res; + + /* Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A - B */ + + /* Subtract and then store the results in the destination buffer. */ + vec1 = vld1q_f32(pSrcA); + vec2 = vld1q_f32(pSrcB); + res = vsubq_f32(vec1, vec2); + vst1q_f32(pDst, res); + + /* Increment pointers */ + pSrcA += 4; + pSrcB += 4; + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Tail */ + blkCnt = blockSize & 0x3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A - B */ + + /* Subtract and store result in destination buffer. */ + *pDst++ = (*pSrcA++) - (*pSrcB++); + + *pDst++ = (*pSrcA++) - (*pSrcB++); + + *pDst++ = (*pSrcA++) - (*pSrcB++); + + *pDst++ = (*pSrcA++) - (*pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C = A - B */ + + /* Subtract and store result in destination buffer. */ + *pDst++ = (*pSrcA++) - (*pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicSub group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q15.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q15.c new file mode 100644 index 0000000..835917e --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q15.c @@ -0,0 +1,126 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sub_q15.c + * Description: Q15 vector subtraction + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicSub + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. + */ + +void arm_sub_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q31_t inA1, inA2; + q31_t inB1, inB2; +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A - B */ + +#if defined (ARM_MATH_DSP) + /* read 2 times 2 samples at a time from sourceA */ + inA1 = read_q15x2_ia ((q15_t **) &pSrcA); + inA2 = read_q15x2_ia ((q15_t **) &pSrcA); + /* read 2 times 2 samples at a time from sourceB */ + inB1 = read_q15x2_ia ((q15_t **) &pSrcB); + inB2 = read_q15x2_ia ((q15_t **) &pSrcB); + + /* Subtract and store 2 times 2 samples at a time */ + write_q15x2_ia (&pDst, __QSUB16(inA1, inB1)); + write_q15x2_ia (&pDst, __QSUB16(inA2, inB2)); +#else + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ - *pSrcB++), 16); + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ - *pSrcB++), 16); + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ - *pSrcB++), 16); + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ - *pSrcB++), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A - B */ + + /* Subtract and store result in destination buffer. */ +#if defined (ARM_MATH_DSP) + *pDst++ = (q15_t) __QSUB16(*pSrcA++, *pSrcB++); +#else + *pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ - *pSrcB++), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicSub group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q31.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q31.c new file mode 100644 index 0000000..bac1927 --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q31.c @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sub_q31.c + * Description: Q31 vector subtraction + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicSub + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated. + */ + +void arm_sub_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A - B */ + + /* Subtract and store result in destination buffer. */ + *pDst++ = __QSUB(*pSrcA++, *pSrcB++); + + *pDst++ = __QSUB(*pSrcA++, *pSrcB++); + + *pDst++ = __QSUB(*pSrcA++, *pSrcB++); + + *pDst++ = __QSUB(*pSrcA++, *pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A - B */ + + /* Subtract and store result in destination buffer. */ + *pDst++ = __QSUB(*pSrcA++, *pSrcB++); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicSub group + */ diff --git a/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q7.c b/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q7.c new file mode 100644 index 0000000..a55a8fd --- /dev/null +++ b/CMSIS/DSP/Source/BasicMathFunctions/arm_sub_q7.c @@ -0,0 +1,109 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sub_q7.c + * Description: Q7 vector subtraction + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMath + */ + +/** + @addtogroup BasicSub + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q7 range [0x80 0x7F] will be saturated. + */ + +void arm_sub_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A - B */ + +#if defined (ARM_MATH_DSP) + /* Subtract and store result in destination buffer (4 samples at a time). */ + write_q7x4_ia (&pDst, __QSUB8(read_q7x4_ia ((q7_t **) &pSrcA), read_q7x4_ia ((q7_t **) &pSrcB))); +#else + *pDst++ = (q7_t) __SSAT((q15_t) *pSrcA++ - *pSrcB++, 8); + *pDst++ = (q7_t) __SSAT((q15_t) *pSrcA++ - *pSrcB++, 8); + *pDst++ = (q7_t) __SSAT((q15_t) *pSrcA++ - *pSrcB++, 8); + *pDst++ = (q7_t) __SSAT((q15_t) *pSrcA++ - *pSrcB++, 8); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A - B */ + + /* Subtract and store result in destination buffer. */ + *pDst++ = (q7_t) __SSAT((q15_t) *pSrcA++ - *pSrcB++, 8); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of BasicSub group + */ diff --git a/CMSIS/DSP/Source/CMakeLists.txt b/CMSIS/DSP/Source/CMakeLists.txt new file mode 100644 index 0000000..f5c58a7 --- /dev/null +++ b/CMSIS/DSP/Source/CMakeLists.txt @@ -0,0 +1,223 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSP) + +# Needed to find the config modules +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/..) + +# Select which parts of the CMSIS-DSP must be compiled. +# There are some dependencies between the parts but they are not tracked +# by this cmake. So, enabling some functions may require to enable some +# other ones. +option(BASICMATH "Basic Math Functions" ON) +option(COMPLEXMATH "Complex Math Functions" ON) +option(CONTROLLER "Controller Functions" ON) +option(FASTMATH "Fast Math Functions" ON) +option(FILTERING "Filtering Functions" ON) +option(MATRIX "Matrix Functions" ON) +option(STATISTICS "Statistics Functions" ON) +option(SUPPORT "Support Functions" ON) +option(TRANSFORM "Transform Functions" ON) + +# When OFF it is the default behavior : all tables are included. +option(CONFIGTABLE "Configuration of table allowed" OFF) + +# When CONFIGTABLE is ON, select if all interpolation tables must be included +option(ALLFAST "All interpolation tables included" OFF) +# When CONFIGTABLE is ON, select if all FFT tables must be included +option(ALLFFT "All fft tables included" OFF) + +# Features which require inclusion of a data table. +# Since some tables may be big, the corresponding feature can be +# disabled. +# Those options are taken into account only when CONFIGTABLE is ON +option(ARM_COS_F32 "cos f32" OFF) +option(ARM_COS_Q31 "cos q31" OFF) +option(ARM_COS_Q15 "cos q15" OFF) +option(ARM_SIN_F32 "sin f32" OFF) +option(ARM_SIN_Q31 "sin q31" OFF) +option(ARM_SIN_Q15 "sin q15" OFF) +option(ARM_SIN_COS_F32 "sin cos f32" OFF) +option(ARM_SIN_COS_Q31 "sin cos q31" OFF) + +option(ARM_LMS_NORM_Q31 "lms norm q31" OFF) +option(ARM_LMS_NORM_Q15 "lms norm q15" OFF) + +option(CFFT_F32_16 "cfft f32 16" OFF) +option(CFFT_F32_32 "cfft f32 32" OFF) +option(CFFT_F32_64 "cfft f32 64" OFF) +option(CFFT_F32_128 "cfft f32 128" OFF) +option(CFFT_F32_256 "cfft f32 256" OFF) +option(CFFT_F32_512 "cfft f32 512" OFF) +option(CFFT_F32_1024 "cfft f32 1024" OFF) +option(CFFT_F32_2048 "cfft f32 2048" OFF) +option(CFFT_F32_4096 "cfft f32 4096" OFF) + +option(CFFT_Q31_16 "cfft q31 16" OFF) +option(CFFT_Q31_32 "cfft q31 32" OFF) +option(CFFT_Q31_64 "cfft q31 64" OFF) +option(CFFT_Q31_128 "cfft q31 128" OFF) +option(CFFT_Q31_256 "cfft q31 256" OFF) +option(CFFT_Q31_512 "cfft q31 512" OFF) +option(CFFT_Q31_1024 "cfft q31 1024" OFF) +option(CFFT_Q31_2048 "cfft q31 2048" OFF) +option(CFFT_Q31_4096 "cfft q31 4096" OFF) + +option(CFFT_Q15_16 "cfft q15 16" OFF) +option(CFFT_Q15_32 "cfft q15 32" OFF) +option(CFFT_Q15_64 "cfft q15 64" OFF) +option(CFFT_Q15_128 "cfft q15 128" OFF) +option(CFFT_Q15_256 "cfft q15 256" OFF) +option(CFFT_Q15_512 "cfft q15 512" OFF) +option(CFFT_Q15_1024 "cfft q15 1024" OFF) +option(CFFT_Q15_2048 "cfft q15 2048" OFF) +option(CFFT_Q15_4096 "cfft q15 4096" OFF) + +option(RFFT_FAST_F32_32 "rfft fast f32 32" OFF) +option(RFFT_FAST_F32_64 "rfft fast f32 64" OFF) +option(RFFT_FAST_F32_128 "rfft fast f32 128" OFF) +option(RFFT_FAST_F32_256 "rfft fast f32 256" OFF) +option(RFFT_FAST_F32_512 "rfft fast f32 512" OFF) +option(RFFT_FAST_F32_1024 "rfft fast f32 1024" OFF) +option(RFFT_FAST_F32_2048 "rfft fast f32 2048" OFF) +option(RFFT_FAST_F32_4096 "rfft fast f32 4096" OFF) + + +option(RFFT_F32_128 "rfft f32 128" OFF) +option(RFFT_F32_512 "rfft f32 512" OFF) +option(RFFT_F32_2048 "rfft f32 2048" OFF) +option(RFFT_F32_8192 "rfft f32 8192" OFF) + +option(RFFT_Q31_32 "rfft q31 32" OFF) +option(RFFT_Q31_64 "rfft q31 64" OFF) +option(RFFT_Q31_128 "rfft q31 128" OFF) +option(RFFT_Q31_256 "rfft q31 256" OFF) +option(RFFT_Q31_512 "rfft q31 512" OFF) +option(RFFT_Q31_1024 "rfft q31 1024" OFF) +option(RFFT_Q31_2048 "rfft q31 2048" OFF) +option(RFFT_Q31_4096 "rfft q31 4096" OFF) +option(RFFT_Q31_8192 "rfft q31 8192" OFF) + +option(RFFT_Q15_32 "rfft q15 32" OFF) +option(RFFT_Q15_64 "rfft q15 64" OFF) +option(RFFT_Q15_128 "rfft q15 128" OFF) +option(RFFT_Q15_256 "rfft q15 256" OFF) +option(RFFT_Q15_512 "rfft q15 512" OFF) +option(RFFT_Q15_1024 "rfft q15 1024" OFF) +option(RFFT_Q15_2048 "rfft q15 2048" OFF) +option(RFFT_Q15_4096 "rfft q15 4096" OFF) +option(RFFT_Q15_8192 "rfft q15 8192" OFF) + +option(DCT4_F32_128 "dct4 f32 128" OFF) +option(DCT4_F32_512 "dct4 f32 512" OFF) +option(DCT4_F32_2048 "dct4 f32 2048" OFF) +option(DCT4_F32_8192 "dct4 f32 8192" OFF) + +option(DCT4_Q31_128 "dct4 q31 128" OFF) +option(DCT4_Q31_512 "dct4 q31 512" OFF) +option(DCT4_Q31_2048 "dct4 q31 2048" OFF) +option(DCT4_Q31_8192 "dct4 q31 8192" OFF) + +option(DCT4_Q15_128 "dct4 q15 128" OFF) +option(DCT4_Q15_512 "dct4 q15 512" OFF) +option(DCT4_Q15_2048 "dct4 q15 2048" OFF) +option(DCT4_Q15_8192 "dct4 q15 8192" OFF) + + +########################### +# +# CMSIS DSP +# +########################### + +# DSP Sources +SET(DSP ".") + +add_library(CMSISDSP INTERFACE) + +include(config) + + +if (BASICMATH) + add_subdirectory(BasicMathFunctions) + target_link_libraries(CMSISDSP INTERFACE CMSISDSPBasicMath) +endif() + +if (COMPLEXMATH) + add_subdirectory(ComplexMathFunctions) + target_link_libraries(CMSISDSP INTERFACE CMSISDSPComplexMath) +endif() + +if (CONTROLLER) + add_subdirectory(ControllerFunctions) + # Fast tables inclusion is allowed + if (CONFIGTABLE) + target_compile_definitions(CMSISDSPController PUBLIC ARM_FAST_ALLOW_TABLES) + endif() + target_link_libraries(CMSISDSP INTERFACE CMSISDSPController) +endif() + +if (FASTMATH) + add_subdirectory(FastMathFunctions) + # Fast tables inclusion is allowed + if (CONFIGTABLE) + target_compile_definitions(CMSISDSPFastMath PUBLIC ARM_FAST_ALLOW_TABLES) + endif() + target_link_libraries(CMSISDSP INTERFACE CMSISDSPFastMath) +endif() + +if (FILTERING) + add_subdirectory(FilteringFunctions) + # Fast tables inclusion is allowed + if (CONFIGTABLE) + target_compile_definitions(CMSISDSPFiltering PUBLIC ARM_FAST_ALLOW_TABLES) + endif() + target_link_libraries(CMSISDSP INTERFACE CMSISDSPFiltering) +endif() + +if (MATRIX) + add_subdirectory(MatrixFunctions) + target_link_libraries(CMSISDSP INTERFACE CMSISDSPMatrix) +endif() + +if (STATISTICS) + add_subdirectory(StatisticsFunctions) + target_link_libraries(CMSISDSP INTERFACE CMSISDSPStatistics) +endif() + +if (SUPPORT) + add_subdirectory(SupportFunctions) + target_link_libraries(CMSISDSP INTERFACE CMSISDSPSupport) +endif() + +if (TRANSFORM) + add_subdirectory(TransformFunctions) + # FFT tables inclusion is allowed + if (CONFIGTABLE) + target_compile_definitions(CMSISDSPTransform PUBLIC ARM_FFT_ALLOW_TABLES) + endif() + target_link_libraries(CMSISDSP INTERFACE CMSISDSPTransform) +endif() + +if (FILTERING OR CONTROLLER OR FASTMATH OR TRANSFORM) + add_subdirectory(CommonTables) + if (TRANSFORM) + # FFT tables inclusion is allowed + if (CONFIGTABLE) + target_compile_definitions(CMSISDSPCommon PUBLIC ARM_FFT_ALLOW_TABLES) + endif() + endif() + if (FILTERING OR CONTROLLER OR FASTMATH) + # Select which tables to include + if (CONFIGTABLE) + target_compile_definitions(CMSISDSPCommon PUBLIC ARM_FAST_ALLOW_TABLES) + endif() + endif() + target_link_libraries(CMSISDSP INTERFACE CMSISDSPCommon) +endif() + +### Includes +target_include_directories(CMSISDSP INTERFACE "${DSP}/../Include") + + + diff --git a/CMSIS/DSP/Source/CommonTables/CMakeLists.txt b/CMSIS/DSP/Source/CommonTables/CMakeLists.txt new file mode 100644 index 0000000..7bdad93 --- /dev/null +++ b/CMSIS/DSP/Source/CommonTables/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPCommon) + + + +add_library(CMSISDSPCommon STATIC arm_common_tables.c) + +if (CONFIGTABLE AND ALLFFT) + target_compile_definitions(CMSISDSPCommon PUBLIC ARM_ALL_FFT_TABLES) +endif() + +if (CONFIGTABLE AND ALLFAST) + target_compile_definitions(CMSISDSPCommon PUBLIC ARM_ALL_FAST_TABLES) +endif() + +include(fft) +fft(CMSISDSPCommon) + +include(interpol) +interpol(CMSISDSPCommon) + +target_sources(CMSISDSPCommon PRIVATE arm_const_structs.c) + +configdsp(CMSISDSPCommon ..) + +### Includes +target_include_directories(CMSISDSPCommon PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/CommonTables/CommonTables.c b/CMSIS/DSP/Source/CommonTables/CommonTables.c new file mode 100644 index 0000000..acda9f8 --- /dev/null +++ b/CMSIS/DSP/Source/CommonTables/CommonTables.c @@ -0,0 +1,31 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: CommonTables.c + * Description: Combination of all common table source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_common_tables.c" +#include "arm_const_structs.c" + diff --git a/CMSIS/DSP/Source/CommonTables/arm_common_tables.c b/CMSIS/DSP/Source/CommonTables/arm_common_tables.c new file mode 100644 index 0000000..4b49b34 --- /dev/null +++ b/CMSIS/DSP/Source/CommonTables/arm_common_tables.c @@ -0,0 +1,57215 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_common_tables.c + * Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup ComplexFFT + */ + +/** + @addtogroup CFFT_CIFFT Complex FFT Tables + @{ + */ + +/** + @par + Pseudo code for Generation of Bit reversal Table is + @par +
for (l = 1; l <= N/4; l++)
+  {
+    for (i = 0; i< logN2; i++)
+    {
+      a[i] = l & (1 << i);
+    }
+    for (j = 0; j < logN2; j++)
+    {
+      if (a[j] != 0)
+      y[l] += (1 << ((logN2 - 1) - j));
+    }
+    y[l] = y[l] >> 1;
+   } 
+ @par + where N = 4096, logN2 = 12 + @par + N is the maximum FFT Size supported +*/ + +/** + @brief Table for bit reversal process +*/ +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREV_1024) +const uint16_t armBitRevTable[1024] = { + 0x400, 0x200, 0x600, 0x100, 0x500, 0x300, 0x700, 0x080, 0x480, 0x280, + 0x680, 0x180, 0x580, 0x380, 0x780, 0x040, 0x440, 0x240, 0x640, 0x140, + 0x540, 0x340, 0x740, 0x0c0, 0x4c0, 0x2c0, 0x6c0, 0x1c0, 0x5c0, 0x3c0, + 0x7c0, 0x020, 0x420, 0x220, 0x620, 0x120, 0x520, 0x320, 0x720, 0x0a0, + 0x4a0, 0x2a0, 0x6a0, 0x1a0, 0x5a0, 0x3a0, 0x7a0, 0x060, 0x460, 0x260, + 0x660, 0x160, 0x560, 0x360, 0x760, 0x0e0, 0x4e0, 0x2e0, 0x6e0, 0x1e0, + 0x5e0, 0x3e0, 0x7e0, 0x010, 0x410, 0x210, 0x610, 0x110, 0x510, 0x310, + 0x710, 0x090, 0x490, 0x290, 0x690, 0x190, 0x590, 0x390, 0x790, 0x050, + 0x450, 0x250, 0x650, 0x150, 0x550, 0x350, 0x750, 0x0d0, 0x4d0, 0x2d0, + 0x6d0, 0x1d0, 0x5d0, 0x3d0, 0x7d0, 0x030, 0x430, 0x230, 0x630, 0x130, + 0x530, 0x330, 0x730, 0x0b0, 0x4b0, 0x2b0, 0x6b0, 0x1b0, 0x5b0, 0x3b0, + 0x7b0, 0x070, 0x470, 0x270, 0x670, 0x170, 0x570, 0x370, 0x770, 0x0f0, + 0x4f0, 0x2f0, 0x6f0, 0x1f0, 0x5f0, 0x3f0, 0x7f0, 0x008, 0x408, 0x208, + 0x608, 0x108, 0x508, 0x308, 0x708, 0x088, 0x488, 0x288, 0x688, 0x188, + 0x588, 0x388, 0x788, 0x048, 0x448, 0x248, 0x648, 0x148, 0x548, 0x348, + 0x748, 0x0c8, 0x4c8, 0x2c8, 0x6c8, 0x1c8, 0x5c8, 0x3c8, 0x7c8, 0x028, + 0x428, 0x228, 0x628, 0x128, 0x528, 0x328, 0x728, 0x0a8, 0x4a8, 0x2a8, + 0x6a8, 0x1a8, 0x5a8, 0x3a8, 0x7a8, 0x068, 0x468, 0x268, 0x668, 0x168, + 0x568, 0x368, 0x768, 0x0e8, 0x4e8, 0x2e8, 0x6e8, 0x1e8, 0x5e8, 0x3e8, + 0x7e8, 0x018, 0x418, 0x218, 0x618, 0x118, 0x518, 0x318, 0x718, 0x098, + 0x498, 0x298, 0x698, 0x198, 0x598, 0x398, 0x798, 0x058, 0x458, 0x258, + 0x658, 0x158, 0x558, 0x358, 0x758, 0x0d8, 0x4d8, 0x2d8, 0x6d8, 0x1d8, + 0x5d8, 0x3d8, 0x7d8, 0x038, 0x438, 0x238, 0x638, 0x138, 0x538, 0x338, + 0x738, 0x0b8, 0x4b8, 0x2b8, 0x6b8, 0x1b8, 0x5b8, 0x3b8, 0x7b8, 0x078, + 0x478, 0x278, 0x678, 0x178, 0x578, 0x378, 0x778, 0x0f8, 0x4f8, 0x2f8, + 0x6f8, 0x1f8, 0x5f8, 0x3f8, 0x7f8, 0x004, 0x404, 0x204, 0x604, 0x104, + 0x504, 0x304, 0x704, 0x084, 0x484, 0x284, 0x684, 0x184, 0x584, 0x384, + 0x784, 0x044, 0x444, 0x244, 0x644, 0x144, 0x544, 0x344, 0x744, 0x0c4, + 0x4c4, 0x2c4, 0x6c4, 0x1c4, 0x5c4, 0x3c4, 0x7c4, 0x024, 0x424, 0x224, + 0x624, 0x124, 0x524, 0x324, 0x724, 0x0a4, 0x4a4, 0x2a4, 0x6a4, 0x1a4, + 0x5a4, 0x3a4, 0x7a4, 0x064, 0x464, 0x264, 0x664, 0x164, 0x564, 0x364, + 0x764, 0x0e4, 0x4e4, 0x2e4, 0x6e4, 0x1e4, 0x5e4, 0x3e4, 0x7e4, 0x014, + 0x414, 0x214, 0x614, 0x114, 0x514, 0x314, 0x714, 0x094, 0x494, 0x294, + 0x694, 0x194, 0x594, 0x394, 0x794, 0x054, 0x454, 0x254, 0x654, 0x154, + 0x554, 0x354, 0x754, 0x0d4, 0x4d4, 0x2d4, 0x6d4, 0x1d4, 0x5d4, 0x3d4, + 0x7d4, 0x034, 0x434, 0x234, 0x634, 0x134, 0x534, 0x334, 0x734, 0x0b4, + 0x4b4, 0x2b4, 0x6b4, 0x1b4, 0x5b4, 0x3b4, 0x7b4, 0x074, 0x474, 0x274, + 0x674, 0x174, 0x574, 0x374, 0x774, 0x0f4, 0x4f4, 0x2f4, 0x6f4, 0x1f4, + 0x5f4, 0x3f4, 0x7f4, 0x00c, 0x40c, 0x20c, 0x60c, 0x10c, 0x50c, 0x30c, + 0x70c, 0x08c, 0x48c, 0x28c, 0x68c, 0x18c, 0x58c, 0x38c, 0x78c, 0x04c, + 0x44c, 0x24c, 0x64c, 0x14c, 0x54c, 0x34c, 0x74c, 0x0cc, 0x4cc, 0x2cc, + 0x6cc, 0x1cc, 0x5cc, 0x3cc, 0x7cc, 0x02c, 0x42c, 0x22c, 0x62c, 0x12c, + 0x52c, 0x32c, 0x72c, 0x0ac, 0x4ac, 0x2ac, 0x6ac, 0x1ac, 0x5ac, 0x3ac, + 0x7ac, 0x06c, 0x46c, 0x26c, 0x66c, 0x16c, 0x56c, 0x36c, 0x76c, 0x0ec, + 0x4ec, 0x2ec, 0x6ec, 0x1ec, 0x5ec, 0x3ec, 0x7ec, 0x01c, 0x41c, 0x21c, + 0x61c, 0x11c, 0x51c, 0x31c, 0x71c, 0x09c, 0x49c, 0x29c, 0x69c, 0x19c, + 0x59c, 0x39c, 0x79c, 0x05c, 0x45c, 0x25c, 0x65c, 0x15c, 0x55c, 0x35c, + 0x75c, 0x0dc, 0x4dc, 0x2dc, 0x6dc, 0x1dc, 0x5dc, 0x3dc, 0x7dc, 0x03c, + 0x43c, 0x23c, 0x63c, 0x13c, 0x53c, 0x33c, 0x73c, 0x0bc, 0x4bc, 0x2bc, + 0x6bc, 0x1bc, 0x5bc, 0x3bc, 0x7bc, 0x07c, 0x47c, 0x27c, 0x67c, 0x17c, + 0x57c, 0x37c, 0x77c, 0x0fc, 0x4fc, 0x2fc, 0x6fc, 0x1fc, 0x5fc, 0x3fc, + 0x7fc, 0x002, 0x402, 0x202, 0x602, 0x102, 0x502, 0x302, 0x702, 0x082, + 0x482, 0x282, 0x682, 0x182, 0x582, 0x382, 0x782, 0x042, 0x442, 0x242, + 0x642, 0x142, 0x542, 0x342, 0x742, 0x0c2, 0x4c2, 0x2c2, 0x6c2, 0x1c2, + 0x5c2, 0x3c2, 0x7c2, 0x022, 0x422, 0x222, 0x622, 0x122, 0x522, 0x322, + 0x722, 0x0a2, 0x4a2, 0x2a2, 0x6a2, 0x1a2, 0x5a2, 0x3a2, 0x7a2, 0x062, + 0x462, 0x262, 0x662, 0x162, 0x562, 0x362, 0x762, 0x0e2, 0x4e2, 0x2e2, + 0x6e2, 0x1e2, 0x5e2, 0x3e2, 0x7e2, 0x012, 0x412, 0x212, 0x612, 0x112, + 0x512, 0x312, 0x712, 0x092, 0x492, 0x292, 0x692, 0x192, 0x592, 0x392, + 0x792, 0x052, 0x452, 0x252, 0x652, 0x152, 0x552, 0x352, 0x752, 0x0d2, + 0x4d2, 0x2d2, 0x6d2, 0x1d2, 0x5d2, 0x3d2, 0x7d2, 0x032, 0x432, 0x232, + 0x632, 0x132, 0x532, 0x332, 0x732, 0x0b2, 0x4b2, 0x2b2, 0x6b2, 0x1b2, + 0x5b2, 0x3b2, 0x7b2, 0x072, 0x472, 0x272, 0x672, 0x172, 0x572, 0x372, + 0x772, 0x0f2, 0x4f2, 0x2f2, 0x6f2, 0x1f2, 0x5f2, 0x3f2, 0x7f2, 0x00a, + 0x40a, 0x20a, 0x60a, 0x10a, 0x50a, 0x30a, 0x70a, 0x08a, 0x48a, 0x28a, + 0x68a, 0x18a, 0x58a, 0x38a, 0x78a, 0x04a, 0x44a, 0x24a, 0x64a, 0x14a, + 0x54a, 0x34a, 0x74a, 0x0ca, 0x4ca, 0x2ca, 0x6ca, 0x1ca, 0x5ca, 0x3ca, + 0x7ca, 0x02a, 0x42a, 0x22a, 0x62a, 0x12a, 0x52a, 0x32a, 0x72a, 0x0aa, + 0x4aa, 0x2aa, 0x6aa, 0x1aa, 0x5aa, 0x3aa, 0x7aa, 0x06a, 0x46a, 0x26a, + 0x66a, 0x16a, 0x56a, 0x36a, 0x76a, 0x0ea, 0x4ea, 0x2ea, 0x6ea, 0x1ea, + 0x5ea, 0x3ea, 0x7ea, 0x01a, 0x41a, 0x21a, 0x61a, 0x11a, 0x51a, 0x31a, + 0x71a, 0x09a, 0x49a, 0x29a, 0x69a, 0x19a, 0x59a, 0x39a, 0x79a, 0x5a, + 0x45a, 0x25a, 0x65a, 0x15a, 0x55a, 0x35a, 0x75a, 0x0da, 0x4da, 0x2da, + 0x6da, 0x1da, 0x5da, 0x3da, 0x7da, 0x03a, 0x43a, 0x23a, 0x63a, 0x13a, + 0x53a, 0x33a, 0x73a, 0x0ba, 0x4ba, 0x2ba, 0x6ba, 0x1ba, 0x5ba, 0x3ba, + 0x7ba, 0x07a, 0x47a, 0x27a, 0x67a, 0x17a, 0x57a, 0x37a, 0x77a, 0x0fa, + 0x4fa, 0x2fa, 0x6fa, 0x1fa, 0x5fa, 0x3fa, 0x7fa, 0x006, 0x406, 0x206, + 0x606, 0x106, 0x506, 0x306, 0x706, 0x086, 0x486, 0x286, 0x686, 0x186, + 0x586, 0x386, 0x786, 0x046, 0x446, 0x246, 0x646, 0x146, 0x546, 0x346, + 0x746, 0x0c6, 0x4c6, 0x2c6, 0x6c6, 0x1c6, 0x5c6, 0x3c6, 0x7c6, 0x026, + 0x426, 0x226, 0x626, 0x126, 0x526, 0x326, 0x726, 0x0a6, 0x4a6, 0x2a6, + 0x6a6, 0x1a6, 0x5a6, 0x3a6, 0x7a6, 0x066, 0x466, 0x266, 0x666, 0x166, + 0x566, 0x366, 0x766, 0x0e6, 0x4e6, 0x2e6, 0x6e6, 0x1e6, 0x5e6, 0x3e6, + 0x7e6, 0x016, 0x416, 0x216, 0x616, 0x116, 0x516, 0x316, 0x716, 0x096, + 0x496, 0x296, 0x696, 0x196, 0x596, 0x396, 0x796, 0x056, 0x456, 0x256, + 0x656, 0x156, 0x556, 0x356, 0x756, 0x0d6, 0x4d6, 0x2d6, 0x6d6, 0x1d6, + 0x5d6, 0x3d6, 0x7d6, 0x036, 0x436, 0x236, 0x636, 0x136, 0x536, 0x336, + 0x736, 0x0b6, 0x4b6, 0x2b6, 0x6b6, 0x1b6, 0x5b6, 0x3b6, 0x7b6, 0x076, + 0x476, 0x276, 0x676, 0x176, 0x576, 0x376, 0x776, 0x0f6, 0x4f6, 0x2f6, + 0x6f6, 0x1f6, 0x5f6, 0x3f6, 0x7f6, 0x00e, 0x40e, 0x20e, 0x60e, 0x10e, + 0x50e, 0x30e, 0x70e, 0x08e, 0x48e, 0x28e, 0x68e, 0x18e, 0x58e, 0x38e, + 0x78e, 0x04e, 0x44e, 0x24e, 0x64e, 0x14e, 0x54e, 0x34e, 0x74e, 0x0ce, + 0x4ce, 0x2ce, 0x6ce, 0x1ce, 0x5ce, 0x3ce, 0x7ce, 0x02e, 0x42e, 0x22e, + 0x62e, 0x12e, 0x52e, 0x32e, 0x72e, 0x0ae, 0x4ae, 0x2ae, 0x6ae, 0x1ae, + 0x5ae, 0x3ae, 0x7ae, 0x06e, 0x46e, 0x26e, 0x66e, 0x16e, 0x56e, 0x36e, + 0x76e, 0x0ee, 0x4ee, 0x2ee, 0x6ee, 0x1ee, 0x5ee, 0x3ee, 0x7ee, 0x01e, + 0x41e, 0x21e, 0x61e, 0x11e, 0x51e, 0x31e, 0x71e, 0x09e, 0x49e, 0x29e, + 0x69e, 0x19e, 0x59e, 0x39e, 0x79e, 0x05e, 0x45e, 0x25e, 0x65e, 0x15e, + 0x55e, 0x35e, 0x75e, 0x0de, 0x4de, 0x2de, 0x6de, 0x1de, 0x5de, 0x3de, + 0x7de, 0x03e, 0x43e, 0x23e, 0x63e, 0x13e, 0x53e, 0x33e, 0x73e, 0x0be, + 0x4be, 0x2be, 0x6be, 0x1be, 0x5be, 0x3be, 0x7be, 0x07e, 0x47e, 0x27e, + 0x67e, 0x17e, 0x57e, 0x37e, 0x77e, 0x0fe, 0x4fe, 0x2fe, 0x6fe, 0x1fe, + 0x5fe, 0x3fe, 0x7fe, 0x001 +}; +#endif +/** + @brief Floating-point Twiddle factors Table Generation +*/ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_16) +/** + @par + Example code for Floating-point Twiddle factors Generation: + @par +
for (i = 0; i < N/; i++)
+  {
+ 	twiddleCoef[2*i]   = cos(i * 2*PI/(float)N);
+ 	twiddleCoef[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 16, PI = 3.14159265358979 + @par + Cos and Sin values are in interleaved fashion +*/ +const float32_t twiddleCoef_16[32] = { + 1.000000000f, 0.000000000f, + 0.923879533f, 0.382683432f, + 0.707106781f, 0.707106781f, + 0.382683432f, 0.923879533f, + 0.000000000f, 1.000000000f, + -0.382683432f, 0.923879533f, + -0.707106781f, 0.707106781f, + -0.923879533f, 0.382683432f, + -1.000000000f, 0.000000000f, + -0.923879533f, -0.382683432f, + -0.707106781f, -0.707106781f, + -0.382683432f, -0.923879533f, + -0.000000000f, -1.000000000f, + 0.382683432f, -0.923879533f, + 0.707106781f, -0.707106781f, + 0.923879533f, -0.382683432f +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_32) + +/** + @par + Example code for Floating-point Twiddle factors Generation: + @par +
for (i = 0; i< N/; i++)
+  {
+ 	twiddleCoef[2*i]   = cos(i * 2*PI/(float)N);
+ 	twiddleCoef[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 32, PI = 3.14159265358979 + @par + Cos and Sin values are in interleaved fashion +*/ +const float32_t twiddleCoef_32[64] = { + 1.000000000f, 0.000000000f, + 0.980785280f, 0.195090322f, + 0.923879533f, 0.382683432f, + 0.831469612f, 0.555570233f, + 0.707106781f, 0.707106781f, + 0.555570233f, 0.831469612f, + 0.382683432f, 0.923879533f, + 0.195090322f, 0.980785280f, + 0.000000000f, 1.000000000f, + -0.195090322f, 0.980785280f, + -0.382683432f, 0.923879533f, + -0.555570233f, 0.831469612f, + -0.707106781f, 0.707106781f, + -0.831469612f, 0.555570233f, + -0.923879533f, 0.382683432f, + -0.980785280f, 0.195090322f, + -1.000000000f, 0.000000000f, + -0.980785280f, -0.195090322f, + -0.923879533f, -0.382683432f, + -0.831469612f, -0.555570233f, + -0.707106781f, -0.707106781f, + -0.555570233f, -0.831469612f, + -0.382683432f, -0.923879533f, + -0.195090322f, -0.980785280f, + -0.000000000f, -1.000000000f, + 0.195090322f, -0.980785280f, + 0.382683432f, -0.923879533f, + 0.555570233f, -0.831469612f, + 0.707106781f, -0.707106781f, + 0.831469612f, -0.555570233f, + 0.923879533f, -0.382683432f, + 0.980785280f, -0.195090322f +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_64) +/** + @par + Example code for Floating-point Twiddle factors Generation: + @par +
for(i = 0; i < N/; i++)
+  {
+ 	twiddleCoef[2*i]   = cos(i * 2*PI/(float)N);
+ 	twiddleCoef[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 64, PI = 3.14159265358979 + @par + Cos and Sin values are in interleaved fashion +*/ +const float32_t twiddleCoef_64[128] = { + 1.000000000f, 0.000000000f, + 0.995184727f, 0.098017140f, + 0.980785280f, 0.195090322f, + 0.956940336f, 0.290284677f, + 0.923879533f, 0.382683432f, + 0.881921264f, 0.471396737f, + 0.831469612f, 0.555570233f, + 0.773010453f, 0.634393284f, + 0.707106781f, 0.707106781f, + 0.634393284f, 0.773010453f, + 0.555570233f, 0.831469612f, + 0.471396737f, 0.881921264f, + 0.382683432f, 0.923879533f, + 0.290284677f, 0.956940336f, + 0.195090322f, 0.980785280f, + 0.098017140f, 0.995184727f, + 0.000000000f, 1.000000000f, + -0.098017140f, 0.995184727f, + -0.195090322f, 0.980785280f, + -0.290284677f, 0.956940336f, + -0.382683432f, 0.923879533f, + -0.471396737f, 0.881921264f, + -0.555570233f, 0.831469612f, + -0.634393284f, 0.773010453f, + -0.707106781f, 0.707106781f, + -0.773010453f, 0.634393284f, + -0.831469612f, 0.555570233f, + -0.881921264f, 0.471396737f, + -0.923879533f, 0.382683432f, + -0.956940336f, 0.290284677f, + -0.980785280f, 0.195090322f, + -0.995184727f, 0.098017140f, + -1.000000000f, 0.000000000f, + -0.995184727f, -0.098017140f, + -0.980785280f, -0.195090322f, + -0.956940336f, -0.290284677f, + -0.923879533f, -0.382683432f, + -0.881921264f, -0.471396737f, + -0.831469612f, -0.555570233f, + -0.773010453f, -0.634393284f, + -0.707106781f, -0.707106781f, + -0.634393284f, -0.773010453f, + -0.555570233f, -0.831469612f, + -0.471396737f, -0.881921264f, + -0.382683432f, -0.923879533f, + -0.290284677f, -0.956940336f, + -0.195090322f, -0.980785280f, + -0.098017140f, -0.995184727f, + -0.000000000f, -1.000000000f, + 0.098017140f, -0.995184727f, + 0.195090322f, -0.980785280f, + 0.290284677f, -0.956940336f, + 0.382683432f, -0.923879533f, + 0.471396737f, -0.881921264f, + 0.555570233f, -0.831469612f, + 0.634393284f, -0.773010453f, + 0.707106781f, -0.707106781f, + 0.773010453f, -0.634393284f, + 0.831469612f, -0.555570233f, + 0.881921264f, -0.471396737f, + 0.923879533f, -0.382683432f, + 0.956940336f, -0.290284677f, + 0.980785280f, -0.195090322f, + 0.995184727f, -0.098017140f +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_128) +/** + @par + Example code for Floating-point Twiddle factors Generation: + @par +
for (i = 0; i< N/; i++)
+  {
+ 	twiddleCoef[2*i]   = cos(i * 2*PI/(float)N);
+ 	twiddleCoef[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 128, PI = 3.14159265358979 + @par + Cos and Sin values are in interleaved fashion +*/ +const float32_t twiddleCoef_128[256] = { + 1.000000000f, 0.000000000f, + 0.998795456f, 0.049067674f, + 0.995184727f, 0.098017140f, + 0.989176510f, 0.146730474f, + 0.980785280f, 0.195090322f, + 0.970031253f, 0.242980180f, + 0.956940336f, 0.290284677f, + 0.941544065f, 0.336889853f, + 0.923879533f, 0.382683432f, + 0.903989293f, 0.427555093f, + 0.881921264f, 0.471396737f, + 0.857728610f, 0.514102744f, + 0.831469612f, 0.555570233f, + 0.803207531f, 0.595699304f, + 0.773010453f, 0.634393284f, + 0.740951125f, 0.671558955f, + 0.707106781f, 0.707106781f, + 0.671558955f, 0.740951125f, + 0.634393284f, 0.773010453f, + 0.595699304f, 0.803207531f, + 0.555570233f, 0.831469612f, + 0.514102744f, 0.857728610f, + 0.471396737f, 0.881921264f, + 0.427555093f, 0.903989293f, + 0.382683432f, 0.923879533f, + 0.336889853f, 0.941544065f, + 0.290284677f, 0.956940336f, + 0.242980180f, 0.970031253f, + 0.195090322f, 0.980785280f, + 0.146730474f, 0.989176510f, + 0.098017140f, 0.995184727f, + 0.049067674f, 0.998795456f, + 0.000000000f, 1.000000000f, + -0.049067674f, 0.998795456f, + -0.098017140f, 0.995184727f, + -0.146730474f, 0.989176510f, + -0.195090322f, 0.980785280f, + -0.242980180f, 0.970031253f, + -0.290284677f, 0.956940336f, + -0.336889853f, 0.941544065f, + -0.382683432f, 0.923879533f, + -0.427555093f, 0.903989293f, + -0.471396737f, 0.881921264f, + -0.514102744f, 0.857728610f, + -0.555570233f, 0.831469612f, + -0.595699304f, 0.803207531f, + -0.634393284f, 0.773010453f, + -0.671558955f, 0.740951125f, + -0.707106781f, 0.707106781f, + -0.740951125f, 0.671558955f, + -0.773010453f, 0.634393284f, + -0.803207531f, 0.595699304f, + -0.831469612f, 0.555570233f, + -0.857728610f, 0.514102744f, + -0.881921264f, 0.471396737f, + -0.903989293f, 0.427555093f, + -0.923879533f, 0.382683432f, + -0.941544065f, 0.336889853f, + -0.956940336f, 0.290284677f, + -0.970031253f, 0.242980180f, + -0.980785280f, 0.195090322f, + -0.989176510f, 0.146730474f, + -0.995184727f, 0.098017140f, + -0.998795456f, 0.049067674f, + -1.000000000f, 0.000000000f, + -0.998795456f, -0.049067674f, + -0.995184727f, -0.098017140f, + -0.989176510f, -0.146730474f, + -0.980785280f, -0.195090322f, + -0.970031253f, -0.242980180f, + -0.956940336f, -0.290284677f, + -0.941544065f, -0.336889853f, + -0.923879533f, -0.382683432f, + -0.903989293f, -0.427555093f, + -0.881921264f, -0.471396737f, + -0.857728610f, -0.514102744f, + -0.831469612f, -0.555570233f, + -0.803207531f, -0.595699304f, + -0.773010453f, -0.634393284f, + -0.740951125f, -0.671558955f, + -0.707106781f, -0.707106781f, + -0.671558955f, -0.740951125f, + -0.634393284f, -0.773010453f, + -0.595699304f, -0.803207531f, + -0.555570233f, -0.831469612f, + -0.514102744f, -0.857728610f, + -0.471396737f, -0.881921264f, + -0.427555093f, -0.903989293f, + -0.382683432f, -0.923879533f, + -0.336889853f, -0.941544065f, + -0.290284677f, -0.956940336f, + -0.242980180f, -0.970031253f, + -0.195090322f, -0.980785280f, + -0.146730474f, -0.989176510f, + -0.098017140f, -0.995184727f, + -0.049067674f, -0.998795456f, + -0.000000000f, -1.000000000f, + 0.049067674f, -0.998795456f, + 0.098017140f, -0.995184727f, + 0.146730474f, -0.989176510f, + 0.195090322f, -0.980785280f, + 0.242980180f, -0.970031253f, + 0.290284677f, -0.956940336f, + 0.336889853f, -0.941544065f, + 0.382683432f, -0.923879533f, + 0.427555093f, -0.903989293f, + 0.471396737f, -0.881921264f, + 0.514102744f, -0.857728610f, + 0.555570233f, -0.831469612f, + 0.595699304f, -0.803207531f, + 0.634393284f, -0.773010453f, + 0.671558955f, -0.740951125f, + 0.707106781f, -0.707106781f, + 0.740951125f, -0.671558955f, + 0.773010453f, -0.634393284f, + 0.803207531f, -0.595699304f, + 0.831469612f, -0.555570233f, + 0.857728610f, -0.514102744f, + 0.881921264f, -0.471396737f, + 0.903989293f, -0.427555093f, + 0.923879533f, -0.382683432f, + 0.941544065f, -0.336889853f, + 0.956940336f, -0.290284677f, + 0.970031253f, -0.242980180f, + 0.980785280f, -0.195090322f, + 0.989176510f, -0.146730474f, + 0.995184727f, -0.098017140f, + 0.998795456f, -0.049067674f +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_256) +/** + @par + Example code for Floating-point Twiddle factors Generation: + @par +
for(i = 0; i< N/; i++)
+  {
+ 	twiddleCoef[2*i]   = cos(i * 2*PI/(float)N);
+ 	twiddleCoef[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 256, PI = 3.14159265358979 + @par + Cos and Sin values are in interleaved fashion +*/ +const float32_t twiddleCoef_256[512] = { + 1.000000000f, 0.000000000f, + 0.999698819f, 0.024541229f, + 0.998795456f, 0.049067674f, + 0.997290457f, 0.073564564f, + 0.995184727f, 0.098017140f, + 0.992479535f, 0.122410675f, + 0.989176510f, 0.146730474f, + 0.985277642f, 0.170961889f, + 0.980785280f, 0.195090322f, + 0.975702130f, 0.219101240f, + 0.970031253f, 0.242980180f, + 0.963776066f, 0.266712757f, + 0.956940336f, 0.290284677f, + 0.949528181f, 0.313681740f, + 0.941544065f, 0.336889853f, + 0.932992799f, 0.359895037f, + 0.923879533f, 0.382683432f, + 0.914209756f, 0.405241314f, + 0.903989293f, 0.427555093f, + 0.893224301f, 0.449611330f, + 0.881921264f, 0.471396737f, + 0.870086991f, 0.492898192f, + 0.857728610f, 0.514102744f, + 0.844853565f, 0.534997620f, + 0.831469612f, 0.555570233f, + 0.817584813f, 0.575808191f, + 0.803207531f, 0.595699304f, + 0.788346428f, 0.615231591f, + 0.773010453f, 0.634393284f, + 0.757208847f, 0.653172843f, + 0.740951125f, 0.671558955f, + 0.724247083f, 0.689540545f, + 0.707106781f, 0.707106781f, + 0.689540545f, 0.724247083f, + 0.671558955f, 0.740951125f, + 0.653172843f, 0.757208847f, + 0.634393284f, 0.773010453f, + 0.615231591f, 0.788346428f, + 0.595699304f, 0.803207531f, + 0.575808191f, 0.817584813f, + 0.555570233f, 0.831469612f, + 0.534997620f, 0.844853565f, + 0.514102744f, 0.857728610f, + 0.492898192f, 0.870086991f, + 0.471396737f, 0.881921264f, + 0.449611330f, 0.893224301f, + 0.427555093f, 0.903989293f, + 0.405241314f, 0.914209756f, + 0.382683432f, 0.923879533f, + 0.359895037f, 0.932992799f, + 0.336889853f, 0.941544065f, + 0.313681740f, 0.949528181f, + 0.290284677f, 0.956940336f, + 0.266712757f, 0.963776066f, + 0.242980180f, 0.970031253f, + 0.219101240f, 0.975702130f, + 0.195090322f, 0.980785280f, + 0.170961889f, 0.985277642f, + 0.146730474f, 0.989176510f, + 0.122410675f, 0.992479535f, + 0.098017140f, 0.995184727f, + 0.073564564f, 0.997290457f, + 0.049067674f, 0.998795456f, + 0.024541229f, 0.999698819f, + 0.000000000f, 1.000000000f, + -0.024541229f, 0.999698819f, + -0.049067674f, 0.998795456f, + -0.073564564f, 0.997290457f, + -0.098017140f, 0.995184727f, + -0.122410675f, 0.992479535f, + -0.146730474f, 0.989176510f, + -0.170961889f, 0.985277642f, + -0.195090322f, 0.980785280f, + -0.219101240f, 0.975702130f, + -0.242980180f, 0.970031253f, + -0.266712757f, 0.963776066f, + -0.290284677f, 0.956940336f, + -0.313681740f, 0.949528181f, + -0.336889853f, 0.941544065f, + -0.359895037f, 0.932992799f, + -0.382683432f, 0.923879533f, + -0.405241314f, 0.914209756f, + -0.427555093f, 0.903989293f, + -0.449611330f, 0.893224301f, + -0.471396737f, 0.881921264f, + -0.492898192f, 0.870086991f, + -0.514102744f, 0.857728610f, + -0.534997620f, 0.844853565f, + -0.555570233f, 0.831469612f, + -0.575808191f, 0.817584813f, + -0.595699304f, 0.803207531f, + -0.615231591f, 0.788346428f, + -0.634393284f, 0.773010453f, + -0.653172843f, 0.757208847f, + -0.671558955f, 0.740951125f, + -0.689540545f, 0.724247083f, + -0.707106781f, 0.707106781f, + -0.724247083f, 0.689540545f, + -0.740951125f, 0.671558955f, + -0.757208847f, 0.653172843f, + -0.773010453f, 0.634393284f, + -0.788346428f, 0.615231591f, + -0.803207531f, 0.595699304f, + -0.817584813f, 0.575808191f, + -0.831469612f, 0.555570233f, + -0.844853565f, 0.534997620f, + -0.857728610f, 0.514102744f, + -0.870086991f, 0.492898192f, + -0.881921264f, 0.471396737f, + -0.893224301f, 0.449611330f, + -0.903989293f, 0.427555093f, + -0.914209756f, 0.405241314f, + -0.923879533f, 0.382683432f, + -0.932992799f, 0.359895037f, + -0.941544065f, 0.336889853f, + -0.949528181f, 0.313681740f, + -0.956940336f, 0.290284677f, + -0.963776066f, 0.266712757f, + -0.970031253f, 0.242980180f, + -0.975702130f, 0.219101240f, + -0.980785280f, 0.195090322f, + -0.985277642f, 0.170961889f, + -0.989176510f, 0.146730474f, + -0.992479535f, 0.122410675f, + -0.995184727f, 0.098017140f, + -0.997290457f, 0.073564564f, + -0.998795456f, 0.049067674f, + -0.999698819f, 0.024541229f, + -1.000000000f, 0.000000000f, + -0.999698819f, -0.024541229f, + -0.998795456f, -0.049067674f, + -0.997290457f, -0.073564564f, + -0.995184727f, -0.098017140f, + -0.992479535f, -0.122410675f, + -0.989176510f, -0.146730474f, + -0.985277642f, -0.170961889f, + -0.980785280f, -0.195090322f, + -0.975702130f, -0.219101240f, + -0.970031253f, -0.242980180f, + -0.963776066f, -0.266712757f, + -0.956940336f, -0.290284677f, + -0.949528181f, -0.313681740f, + -0.941544065f, -0.336889853f, + -0.932992799f, -0.359895037f, + -0.923879533f, -0.382683432f, + -0.914209756f, -0.405241314f, + -0.903989293f, -0.427555093f, + -0.893224301f, -0.449611330f, + -0.881921264f, -0.471396737f, + -0.870086991f, -0.492898192f, + -0.857728610f, -0.514102744f, + -0.844853565f, -0.534997620f, + -0.831469612f, -0.555570233f, + -0.817584813f, -0.575808191f, + -0.803207531f, -0.595699304f, + -0.788346428f, -0.615231591f, + -0.773010453f, -0.634393284f, + -0.757208847f, -0.653172843f, + -0.740951125f, -0.671558955f, + -0.724247083f, -0.689540545f, + -0.707106781f, -0.707106781f, + -0.689540545f, -0.724247083f, + -0.671558955f, -0.740951125f, + -0.653172843f, -0.757208847f, + -0.634393284f, -0.773010453f, + -0.615231591f, -0.788346428f, + -0.595699304f, -0.803207531f, + -0.575808191f, -0.817584813f, + -0.555570233f, -0.831469612f, + -0.534997620f, -0.844853565f, + -0.514102744f, -0.857728610f, + -0.492898192f, -0.870086991f, + -0.471396737f, -0.881921264f, + -0.449611330f, -0.893224301f, + -0.427555093f, -0.903989293f, + -0.405241314f, -0.914209756f, + -0.382683432f, -0.923879533f, + -0.359895037f, -0.932992799f, + -0.336889853f, -0.941544065f, + -0.313681740f, -0.949528181f, + -0.290284677f, -0.956940336f, + -0.266712757f, -0.963776066f, + -0.242980180f, -0.970031253f, + -0.219101240f, -0.975702130f, + -0.195090322f, -0.980785280f, + -0.170961889f, -0.985277642f, + -0.146730474f, -0.989176510f, + -0.122410675f, -0.992479535f, + -0.098017140f, -0.995184727f, + -0.073564564f, -0.997290457f, + -0.049067674f, -0.998795456f, + -0.024541229f, -0.999698819f, + -0.000000000f, -1.000000000f, + 0.024541229f, -0.999698819f, + 0.049067674f, -0.998795456f, + 0.073564564f, -0.997290457f, + 0.098017140f, -0.995184727f, + 0.122410675f, -0.992479535f, + 0.146730474f, -0.989176510f, + 0.170961889f, -0.985277642f, + 0.195090322f, -0.980785280f, + 0.219101240f, -0.975702130f, + 0.242980180f, -0.970031253f, + 0.266712757f, -0.963776066f, + 0.290284677f, -0.956940336f, + 0.313681740f, -0.949528181f, + 0.336889853f, -0.941544065f, + 0.359895037f, -0.932992799f, + 0.382683432f, -0.923879533f, + 0.405241314f, -0.914209756f, + 0.427555093f, -0.903989293f, + 0.449611330f, -0.893224301f, + 0.471396737f, -0.881921264f, + 0.492898192f, -0.870086991f, + 0.514102744f, -0.857728610f, + 0.534997620f, -0.844853565f, + 0.555570233f, -0.831469612f, + 0.575808191f, -0.817584813f, + 0.595699304f, -0.803207531f, + 0.615231591f, -0.788346428f, + 0.634393284f, -0.773010453f, + 0.653172843f, -0.757208847f, + 0.671558955f, -0.740951125f, + 0.689540545f, -0.724247083f, + 0.707106781f, -0.707106781f, + 0.724247083f, -0.689540545f, + 0.740951125f, -0.671558955f, + 0.757208847f, -0.653172843f, + 0.773010453f, -0.634393284f, + 0.788346428f, -0.615231591f, + 0.803207531f, -0.595699304f, + 0.817584813f, -0.575808191f, + 0.831469612f, -0.555570233f, + 0.844853565f, -0.534997620f, + 0.857728610f, -0.514102744f, + 0.870086991f, -0.492898192f, + 0.881921264f, -0.471396737f, + 0.893224301f, -0.449611330f, + 0.903989293f, -0.427555093f, + 0.914209756f, -0.405241314f, + 0.923879533f, -0.382683432f, + 0.932992799f, -0.359895037f, + 0.941544065f, -0.336889853f, + 0.949528181f, -0.313681740f, + 0.956940336f, -0.290284677f, + 0.963776066f, -0.266712757f, + 0.970031253f, -0.242980180f, + 0.975702130f, -0.219101240f, + 0.980785280f, -0.195090322f, + 0.985277642f, -0.170961889f, + 0.989176510f, -0.146730474f, + 0.992479535f, -0.122410675f, + 0.995184727f, -0.098017140f, + 0.997290457f, -0.073564564f, + 0.998795456f, -0.049067674f, + 0.999698819f, -0.024541229f +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_512) +/** + @par + Example code for Floating-point Twiddle factors Generation: + @par +
for (i = 0; i< N/; i++)
+  {
+ 	twiddleCoef[2*i]   = cos(i * 2*PI/(float)N);
+ 	twiddleCoef[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 512, PI = 3.14159265358979 + @par + Cos and Sin values are in interleaved fashion +*/ +const float32_t twiddleCoef_512[1024] = { + 1.000000000f, 0.000000000f, + 0.999924702f, 0.012271538f, + 0.999698819f, 0.024541229f, + 0.999322385f, 0.036807223f, + 0.998795456f, 0.049067674f, + 0.998118113f, 0.061320736f, + 0.997290457f, 0.073564564f, + 0.996312612f, 0.085797312f, + 0.995184727f, 0.098017140f, + 0.993906970f, 0.110222207f, + 0.992479535f, 0.122410675f, + 0.990902635f, 0.134580709f, + 0.989176510f, 0.146730474f, + 0.987301418f, 0.158858143f, + 0.985277642f, 0.170961889f, + 0.983105487f, 0.183039888f, + 0.980785280f, 0.195090322f, + 0.978317371f, 0.207111376f, + 0.975702130f, 0.219101240f, + 0.972939952f, 0.231058108f, + 0.970031253f, 0.242980180f, + 0.966976471f, 0.254865660f, + 0.963776066f, 0.266712757f, + 0.960430519f, 0.278519689f, + 0.956940336f, 0.290284677f, + 0.953306040f, 0.302005949f, + 0.949528181f, 0.313681740f, + 0.945607325f, 0.325310292f, + 0.941544065f, 0.336889853f, + 0.937339012f, 0.348418680f, + 0.932992799f, 0.359895037f, + 0.928506080f, 0.371317194f, + 0.923879533f, 0.382683432f, + 0.919113852f, 0.393992040f, + 0.914209756f, 0.405241314f, + 0.909167983f, 0.416429560f, + 0.903989293f, 0.427555093f, + 0.898674466f, 0.438616239f, + 0.893224301f, 0.449611330f, + 0.887639620f, 0.460538711f, + 0.881921264f, 0.471396737f, + 0.876070094f, 0.482183772f, + 0.870086991f, 0.492898192f, + 0.863972856f, 0.503538384f, + 0.857728610f, 0.514102744f, + 0.851355193f, 0.524589683f, + 0.844853565f, 0.534997620f, + 0.838224706f, 0.545324988f, + 0.831469612f, 0.555570233f, + 0.824589303f, 0.565731811f, + 0.817584813f, 0.575808191f, + 0.810457198f, 0.585797857f, + 0.803207531f, 0.595699304f, + 0.795836905f, 0.605511041f, + 0.788346428f, 0.615231591f, + 0.780737229f, 0.624859488f, + 0.773010453f, 0.634393284f, + 0.765167266f, 0.643831543f, + 0.757208847f, 0.653172843f, + 0.749136395f, 0.662415778f, + 0.740951125f, 0.671558955f, + 0.732654272f, 0.680600998f, + 0.724247083f, 0.689540545f, + 0.715730825f, 0.698376249f, + 0.707106781f, 0.707106781f, + 0.698376249f, 0.715730825f, + 0.689540545f, 0.724247083f, + 0.680600998f, 0.732654272f, + 0.671558955f, 0.740951125f, + 0.662415778f, 0.749136395f, + 0.653172843f, 0.757208847f, + 0.643831543f, 0.765167266f, + 0.634393284f, 0.773010453f, + 0.624859488f, 0.780737229f, + 0.615231591f, 0.788346428f, + 0.605511041f, 0.795836905f, + 0.595699304f, 0.803207531f, + 0.585797857f, 0.810457198f, + 0.575808191f, 0.817584813f, + 0.565731811f, 0.824589303f, + 0.555570233f, 0.831469612f, + 0.545324988f, 0.838224706f, + 0.534997620f, 0.844853565f, + 0.524589683f, 0.851355193f, + 0.514102744f, 0.857728610f, + 0.503538384f, 0.863972856f, + 0.492898192f, 0.870086991f, + 0.482183772f, 0.876070094f, + 0.471396737f, 0.881921264f, + 0.460538711f, 0.887639620f, + 0.449611330f, 0.893224301f, + 0.438616239f, 0.898674466f, + 0.427555093f, 0.903989293f, + 0.416429560f, 0.909167983f, + 0.405241314f, 0.914209756f, + 0.393992040f, 0.919113852f, + 0.382683432f, 0.923879533f, + 0.371317194f, 0.928506080f, + 0.359895037f, 0.932992799f, + 0.348418680f, 0.937339012f, + 0.336889853f, 0.941544065f, + 0.325310292f, 0.945607325f, + 0.313681740f, 0.949528181f, + 0.302005949f, 0.953306040f, + 0.290284677f, 0.956940336f, + 0.278519689f, 0.960430519f, + 0.266712757f, 0.963776066f, + 0.254865660f, 0.966976471f, + 0.242980180f, 0.970031253f, + 0.231058108f, 0.972939952f, + 0.219101240f, 0.975702130f, + 0.207111376f, 0.978317371f, + 0.195090322f, 0.980785280f, + 0.183039888f, 0.983105487f, + 0.170961889f, 0.985277642f, + 0.158858143f, 0.987301418f, + 0.146730474f, 0.989176510f, + 0.134580709f, 0.990902635f, + 0.122410675f, 0.992479535f, + 0.110222207f, 0.993906970f, + 0.098017140f, 0.995184727f, + 0.085797312f, 0.996312612f, + 0.073564564f, 0.997290457f, + 0.061320736f, 0.998118113f, + 0.049067674f, 0.998795456f, + 0.036807223f, 0.999322385f, + 0.024541229f, 0.999698819f, + 0.012271538f, 0.999924702f, + 0.000000000f, 1.000000000f, + -0.012271538f, 0.999924702f, + -0.024541229f, 0.999698819f, + -0.036807223f, 0.999322385f, + -0.049067674f, 0.998795456f, + -0.061320736f, 0.998118113f, + -0.073564564f, 0.997290457f, + -0.085797312f, 0.996312612f, + -0.098017140f, 0.995184727f, + -0.110222207f, 0.993906970f, + -0.122410675f, 0.992479535f, + -0.134580709f, 0.990902635f, + -0.146730474f, 0.989176510f, + -0.158858143f, 0.987301418f, + -0.170961889f, 0.985277642f, + -0.183039888f, 0.983105487f, + -0.195090322f, 0.980785280f, + -0.207111376f, 0.978317371f, + -0.219101240f, 0.975702130f, + -0.231058108f, 0.972939952f, + -0.242980180f, 0.970031253f, + -0.254865660f, 0.966976471f, + -0.266712757f, 0.963776066f, + -0.278519689f, 0.960430519f, + -0.290284677f, 0.956940336f, + -0.302005949f, 0.953306040f, + -0.313681740f, 0.949528181f, + -0.325310292f, 0.945607325f, + -0.336889853f, 0.941544065f, + -0.348418680f, 0.937339012f, + -0.359895037f, 0.932992799f, + -0.371317194f, 0.928506080f, + -0.382683432f, 0.923879533f, + -0.393992040f, 0.919113852f, + -0.405241314f, 0.914209756f, + -0.416429560f, 0.909167983f, + -0.427555093f, 0.903989293f, + -0.438616239f, 0.898674466f, + -0.449611330f, 0.893224301f, + -0.460538711f, 0.887639620f, + -0.471396737f, 0.881921264f, + -0.482183772f, 0.876070094f, + -0.492898192f, 0.870086991f, + -0.503538384f, 0.863972856f, + -0.514102744f, 0.857728610f, + -0.524589683f, 0.851355193f, + -0.534997620f, 0.844853565f, + -0.545324988f, 0.838224706f, + -0.555570233f, 0.831469612f, + -0.565731811f, 0.824589303f, + -0.575808191f, 0.817584813f, + -0.585797857f, 0.810457198f, + -0.595699304f, 0.803207531f, + -0.605511041f, 0.795836905f, + -0.615231591f, 0.788346428f, + -0.624859488f, 0.780737229f, + -0.634393284f, 0.773010453f, + -0.643831543f, 0.765167266f, + -0.653172843f, 0.757208847f, + -0.662415778f, 0.749136395f, + -0.671558955f, 0.740951125f, + -0.680600998f, 0.732654272f, + -0.689540545f, 0.724247083f, + -0.698376249f, 0.715730825f, + -0.707106781f, 0.707106781f, + -0.715730825f, 0.698376249f, + -0.724247083f, 0.689540545f, + -0.732654272f, 0.680600998f, + -0.740951125f, 0.671558955f, + -0.749136395f, 0.662415778f, + -0.757208847f, 0.653172843f, + -0.765167266f, 0.643831543f, + -0.773010453f, 0.634393284f, + -0.780737229f, 0.624859488f, + -0.788346428f, 0.615231591f, + -0.795836905f, 0.605511041f, + -0.803207531f, 0.595699304f, + -0.810457198f, 0.585797857f, + -0.817584813f, 0.575808191f, + -0.824589303f, 0.565731811f, + -0.831469612f, 0.555570233f, + -0.838224706f, 0.545324988f, + -0.844853565f, 0.534997620f, + -0.851355193f, 0.524589683f, + -0.857728610f, 0.514102744f, + -0.863972856f, 0.503538384f, + -0.870086991f, 0.492898192f, + -0.876070094f, 0.482183772f, + -0.881921264f, 0.471396737f, + -0.887639620f, 0.460538711f, + -0.893224301f, 0.449611330f, + -0.898674466f, 0.438616239f, + -0.903989293f, 0.427555093f, + -0.909167983f, 0.416429560f, + -0.914209756f, 0.405241314f, + -0.919113852f, 0.393992040f, + -0.923879533f, 0.382683432f, + -0.928506080f, 0.371317194f, + -0.932992799f, 0.359895037f, + -0.937339012f, 0.348418680f, + -0.941544065f, 0.336889853f, + -0.945607325f, 0.325310292f, + -0.949528181f, 0.313681740f, + -0.953306040f, 0.302005949f, + -0.956940336f, 0.290284677f, + -0.960430519f, 0.278519689f, + -0.963776066f, 0.266712757f, + -0.966976471f, 0.254865660f, + -0.970031253f, 0.242980180f, + -0.972939952f, 0.231058108f, + -0.975702130f, 0.219101240f, + -0.978317371f, 0.207111376f, + -0.980785280f, 0.195090322f, + -0.983105487f, 0.183039888f, + -0.985277642f, 0.170961889f, + -0.987301418f, 0.158858143f, + -0.989176510f, 0.146730474f, + -0.990902635f, 0.134580709f, + -0.992479535f, 0.122410675f, + -0.993906970f, 0.110222207f, + -0.995184727f, 0.098017140f, + -0.996312612f, 0.085797312f, + -0.997290457f, 0.073564564f, + -0.998118113f, 0.061320736f, + -0.998795456f, 0.049067674f, + -0.999322385f, 0.036807223f, + -0.999698819f, 0.024541229f, + -0.999924702f, 0.012271538f, + -1.000000000f, 0.000000000f, + -0.999924702f, -0.012271538f, + -0.999698819f, -0.024541229f, + -0.999322385f, -0.036807223f, + -0.998795456f, -0.049067674f, + -0.998118113f, -0.061320736f, + -0.997290457f, -0.073564564f, + -0.996312612f, -0.085797312f, + -0.995184727f, -0.098017140f, + -0.993906970f, -0.110222207f, + -0.992479535f, -0.122410675f, + -0.990902635f, -0.134580709f, + -0.989176510f, -0.146730474f, + -0.987301418f, -0.158858143f, + -0.985277642f, -0.170961889f, + -0.983105487f, -0.183039888f, + -0.980785280f, -0.195090322f, + -0.978317371f, -0.207111376f, + -0.975702130f, -0.219101240f, + -0.972939952f, -0.231058108f, + -0.970031253f, -0.242980180f, + -0.966976471f, -0.254865660f, + -0.963776066f, -0.266712757f, + -0.960430519f, -0.278519689f, + -0.956940336f, -0.290284677f, + -0.953306040f, -0.302005949f, + -0.949528181f, -0.313681740f, + -0.945607325f, -0.325310292f, + -0.941544065f, -0.336889853f, + -0.937339012f, -0.348418680f, + -0.932992799f, -0.359895037f, + -0.928506080f, -0.371317194f, + -0.923879533f, -0.382683432f, + -0.919113852f, -0.393992040f, + -0.914209756f, -0.405241314f, + -0.909167983f, -0.416429560f, + -0.903989293f, -0.427555093f, + -0.898674466f, -0.438616239f, + -0.893224301f, -0.449611330f, + -0.887639620f, -0.460538711f, + -0.881921264f, -0.471396737f, + -0.876070094f, -0.482183772f, + -0.870086991f, -0.492898192f, + -0.863972856f, -0.503538384f, + -0.857728610f, -0.514102744f, + -0.851355193f, -0.524589683f, + -0.844853565f, -0.534997620f, + -0.838224706f, -0.545324988f, + -0.831469612f, -0.555570233f, + -0.824589303f, -0.565731811f, + -0.817584813f, -0.575808191f, + -0.810457198f, -0.585797857f, + -0.803207531f, -0.595699304f, + -0.795836905f, -0.605511041f, + -0.788346428f, -0.615231591f, + -0.780737229f, -0.624859488f, + -0.773010453f, -0.634393284f, + -0.765167266f, -0.643831543f, + -0.757208847f, -0.653172843f, + -0.749136395f, -0.662415778f, + -0.740951125f, -0.671558955f, + -0.732654272f, -0.680600998f, + -0.724247083f, -0.689540545f, + -0.715730825f, -0.698376249f, + -0.707106781f, -0.707106781f, + -0.698376249f, -0.715730825f, + -0.689540545f, -0.724247083f, + -0.680600998f, -0.732654272f, + -0.671558955f, -0.740951125f, + -0.662415778f, -0.749136395f, + -0.653172843f, -0.757208847f, + -0.643831543f, -0.765167266f, + -0.634393284f, -0.773010453f, + -0.624859488f, -0.780737229f, + -0.615231591f, -0.788346428f, + -0.605511041f, -0.795836905f, + -0.595699304f, -0.803207531f, + -0.585797857f, -0.810457198f, + -0.575808191f, -0.817584813f, + -0.565731811f, -0.824589303f, + -0.555570233f, -0.831469612f, + -0.545324988f, -0.838224706f, + -0.534997620f, -0.844853565f, + -0.524589683f, -0.851355193f, + -0.514102744f, -0.857728610f, + -0.503538384f, -0.863972856f, + -0.492898192f, -0.870086991f, + -0.482183772f, -0.876070094f, + -0.471396737f, -0.881921264f, + -0.460538711f, -0.887639620f, + -0.449611330f, -0.893224301f, + -0.438616239f, -0.898674466f, + -0.427555093f, -0.903989293f, + -0.416429560f, -0.909167983f, + -0.405241314f, -0.914209756f, + -0.393992040f, -0.919113852f, + -0.382683432f, -0.923879533f, + -0.371317194f, -0.928506080f, + -0.359895037f, -0.932992799f, + -0.348418680f, -0.937339012f, + -0.336889853f, -0.941544065f, + -0.325310292f, -0.945607325f, + -0.313681740f, -0.949528181f, + -0.302005949f, -0.953306040f, + -0.290284677f, -0.956940336f, + -0.278519689f, -0.960430519f, + -0.266712757f, -0.963776066f, + -0.254865660f, -0.966976471f, + -0.242980180f, -0.970031253f, + -0.231058108f, -0.972939952f, + -0.219101240f, -0.975702130f, + -0.207111376f, -0.978317371f, + -0.195090322f, -0.980785280f, + -0.183039888f, -0.983105487f, + -0.170961889f, -0.985277642f, + -0.158858143f, -0.987301418f, + -0.146730474f, -0.989176510f, + -0.134580709f, -0.990902635f, + -0.122410675f, -0.992479535f, + -0.110222207f, -0.993906970f, + -0.098017140f, -0.995184727f, + -0.085797312f, -0.996312612f, + -0.073564564f, -0.997290457f, + -0.061320736f, -0.998118113f, + -0.049067674f, -0.998795456f, + -0.036807223f, -0.999322385f, + -0.024541229f, -0.999698819f, + -0.012271538f, -0.999924702f, + -0.000000000f, -1.000000000f, + 0.012271538f, -0.999924702f, + 0.024541229f, -0.999698819f, + 0.036807223f, -0.999322385f, + 0.049067674f, -0.998795456f, + 0.061320736f, -0.998118113f, + 0.073564564f, -0.997290457f, + 0.085797312f, -0.996312612f, + 0.098017140f, -0.995184727f, + 0.110222207f, -0.993906970f, + 0.122410675f, -0.992479535f, + 0.134580709f, -0.990902635f, + 0.146730474f, -0.989176510f, + 0.158858143f, -0.987301418f, + 0.170961889f, -0.985277642f, + 0.183039888f, -0.983105487f, + 0.195090322f, -0.980785280f, + 0.207111376f, -0.978317371f, + 0.219101240f, -0.975702130f, + 0.231058108f, -0.972939952f, + 0.242980180f, -0.970031253f, + 0.254865660f, -0.966976471f, + 0.266712757f, -0.963776066f, + 0.278519689f, -0.960430519f, + 0.290284677f, -0.956940336f, + 0.302005949f, -0.953306040f, + 0.313681740f, -0.949528181f, + 0.325310292f, -0.945607325f, + 0.336889853f, -0.941544065f, + 0.348418680f, -0.937339012f, + 0.359895037f, -0.932992799f, + 0.371317194f, -0.928506080f, + 0.382683432f, -0.923879533f, + 0.393992040f, -0.919113852f, + 0.405241314f, -0.914209756f, + 0.416429560f, -0.909167983f, + 0.427555093f, -0.903989293f, + 0.438616239f, -0.898674466f, + 0.449611330f, -0.893224301f, + 0.460538711f, -0.887639620f, + 0.471396737f, -0.881921264f, + 0.482183772f, -0.876070094f, + 0.492898192f, -0.870086991f, + 0.503538384f, -0.863972856f, + 0.514102744f, -0.857728610f, + 0.524589683f, -0.851355193f, + 0.534997620f, -0.844853565f, + 0.545324988f, -0.838224706f, + 0.555570233f, -0.831469612f, + 0.565731811f, -0.824589303f, + 0.575808191f, -0.817584813f, + 0.585797857f, -0.810457198f, + 0.595699304f, -0.803207531f, + 0.605511041f, -0.795836905f, + 0.615231591f, -0.788346428f, + 0.624859488f, -0.780737229f, + 0.634393284f, -0.773010453f, + 0.643831543f, -0.765167266f, + 0.653172843f, -0.757208847f, + 0.662415778f, -0.749136395f, + 0.671558955f, -0.740951125f, + 0.680600998f, -0.732654272f, + 0.689540545f, -0.724247083f, + 0.698376249f, -0.715730825f, + 0.707106781f, -0.707106781f, + 0.715730825f, -0.698376249f, + 0.724247083f, -0.689540545f, + 0.732654272f, -0.680600998f, + 0.740951125f, -0.671558955f, + 0.749136395f, -0.662415778f, + 0.757208847f, -0.653172843f, + 0.765167266f, -0.643831543f, + 0.773010453f, -0.634393284f, + 0.780737229f, -0.624859488f, + 0.788346428f, -0.615231591f, + 0.795836905f, -0.605511041f, + 0.803207531f, -0.595699304f, + 0.810457198f, -0.585797857f, + 0.817584813f, -0.575808191f, + 0.824589303f, -0.565731811f, + 0.831469612f, -0.555570233f, + 0.838224706f, -0.545324988f, + 0.844853565f, -0.534997620f, + 0.851355193f, -0.524589683f, + 0.857728610f, -0.514102744f, + 0.863972856f, -0.503538384f, + 0.870086991f, -0.492898192f, + 0.876070094f, -0.482183772f, + 0.881921264f, -0.471396737f, + 0.887639620f, -0.460538711f, + 0.893224301f, -0.449611330f, + 0.898674466f, -0.438616239f, + 0.903989293f, -0.427555093f, + 0.909167983f, -0.416429560f, + 0.914209756f, -0.405241314f, + 0.919113852f, -0.393992040f, + 0.923879533f, -0.382683432f, + 0.928506080f, -0.371317194f, + 0.932992799f, -0.359895037f, + 0.937339012f, -0.348418680f, + 0.941544065f, -0.336889853f, + 0.945607325f, -0.325310292f, + 0.949528181f, -0.313681740f, + 0.953306040f, -0.302005949f, + 0.956940336f, -0.290284677f, + 0.960430519f, -0.278519689f, + 0.963776066f, -0.266712757f, + 0.966976471f, -0.254865660f, + 0.970031253f, -0.242980180f, + 0.972939952f, -0.231058108f, + 0.975702130f, -0.219101240f, + 0.978317371f, -0.207111376f, + 0.980785280f, -0.195090322f, + 0.983105487f, -0.183039888f, + 0.985277642f, -0.170961889f, + 0.987301418f, -0.158858143f, + 0.989176510f, -0.146730474f, + 0.990902635f, -0.134580709f, + 0.992479535f, -0.122410675f, + 0.993906970f, -0.110222207f, + 0.995184727f, -0.098017140f, + 0.996312612f, -0.085797312f, + 0.997290457f, -0.073564564f, + 0.998118113f, -0.061320736f, + 0.998795456f, -0.049067674f, + 0.999322385f, -0.036807223f, + 0.999698819f, -0.024541229f, + 0.999924702f, -0.012271538f +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_1024) +/** + @par + Example code for Floating-point Twiddle factors Generation: + @par +
for (i = 0; i< N/; i++)
+  {
+ 	twiddleCoef[2*i]   = cos(i * 2*PI/(float)N);
+ 	twiddleCoef[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 1024, PI = 3.14159265358979 + @par + Cos and Sin values are in interleaved fashion +*/ +const float32_t twiddleCoef_1024[2048] = { + 1.000000000f, 0.000000000f, + 0.999981175f, 0.006135885f, + 0.999924702f, 0.012271538f, + 0.999830582f, 0.018406730f, + 0.999698819f, 0.024541229f, + 0.999529418f, 0.030674803f, + 0.999322385f, 0.036807223f, + 0.999077728f, 0.042938257f, + 0.998795456f, 0.049067674f, + 0.998475581f, 0.055195244f, + 0.998118113f, 0.061320736f, + 0.997723067f, 0.067443920f, + 0.997290457f, 0.073564564f, + 0.996820299f, 0.079682438f, + 0.996312612f, 0.085797312f, + 0.995767414f, 0.091908956f, + 0.995184727f, 0.098017140f, + 0.994564571f, 0.104121634f, + 0.993906970f, 0.110222207f, + 0.993211949f, 0.116318631f, + 0.992479535f, 0.122410675f, + 0.991709754f, 0.128498111f, + 0.990902635f, 0.134580709f, + 0.990058210f, 0.140658239f, + 0.989176510f, 0.146730474f, + 0.988257568f, 0.152797185f, + 0.987301418f, 0.158858143f, + 0.986308097f, 0.164913120f, + 0.985277642f, 0.170961889f, + 0.984210092f, 0.177004220f, + 0.983105487f, 0.183039888f, + 0.981963869f, 0.189068664f, + 0.980785280f, 0.195090322f, + 0.979569766f, 0.201104635f, + 0.978317371f, 0.207111376f, + 0.977028143f, 0.213110320f, + 0.975702130f, 0.219101240f, + 0.974339383f, 0.225083911f, + 0.972939952f, 0.231058108f, + 0.971503891f, 0.237023606f, + 0.970031253f, 0.242980180f, + 0.968522094f, 0.248927606f, + 0.966976471f, 0.254865660f, + 0.965394442f, 0.260794118f, + 0.963776066f, 0.266712757f, + 0.962121404f, 0.272621355f, + 0.960430519f, 0.278519689f, + 0.958703475f, 0.284407537f, + 0.956940336f, 0.290284677f, + 0.955141168f, 0.296150888f, + 0.953306040f, 0.302005949f, + 0.951435021f, 0.307849640f, + 0.949528181f, 0.313681740f, + 0.947585591f, 0.319502031f, + 0.945607325f, 0.325310292f, + 0.943593458f, 0.331106306f, + 0.941544065f, 0.336889853f, + 0.939459224f, 0.342660717f, + 0.937339012f, 0.348418680f, + 0.935183510f, 0.354163525f, + 0.932992799f, 0.359895037f, + 0.930766961f, 0.365612998f, + 0.928506080f, 0.371317194f, + 0.926210242f, 0.377007410f, + 0.923879533f, 0.382683432f, + 0.921514039f, 0.388345047f, + 0.919113852f, 0.393992040f, + 0.916679060f, 0.399624200f, + 0.914209756f, 0.405241314f, + 0.911706032f, 0.410843171f, + 0.909167983f, 0.416429560f, + 0.906595705f, 0.422000271f, + 0.903989293f, 0.427555093f, + 0.901348847f, 0.433093819f, + 0.898674466f, 0.438616239f, + 0.895966250f, 0.444122145f, + 0.893224301f, 0.449611330f, + 0.890448723f, 0.455083587f, + 0.887639620f, 0.460538711f, + 0.884797098f, 0.465976496f, + 0.881921264f, 0.471396737f, + 0.879012226f, 0.476799230f, + 0.876070094f, 0.482183772f, + 0.873094978f, 0.487550160f, + 0.870086991f, 0.492898192f, + 0.867046246f, 0.498227667f, + 0.863972856f, 0.503538384f, + 0.860866939f, 0.508830143f, + 0.857728610f, 0.514102744f, + 0.854557988f, 0.519355990f, + 0.851355193f, 0.524589683f, + 0.848120345f, 0.529803625f, + 0.844853565f, 0.534997620f, + 0.841554977f, 0.540171473f, + 0.838224706f, 0.545324988f, + 0.834862875f, 0.550457973f, + 0.831469612f, 0.555570233f, + 0.828045045f, 0.560661576f, + 0.824589303f, 0.565731811f, + 0.821102515f, 0.570780746f, + 0.817584813f, 0.575808191f, + 0.814036330f, 0.580813958f, + 0.810457198f, 0.585797857f, + 0.806847554f, 0.590759702f, + 0.803207531f, 0.595699304f, + 0.799537269f, 0.600616479f, + 0.795836905f, 0.605511041f, + 0.792106577f, 0.610382806f, + 0.788346428f, 0.615231591f, + 0.784556597f, 0.620057212f, + 0.780737229f, 0.624859488f, + 0.776888466f, 0.629638239f, + 0.773010453f, 0.634393284f, + 0.769103338f, 0.639124445f, + 0.765167266f, 0.643831543f, + 0.761202385f, 0.648514401f, + 0.757208847f, 0.653172843f, + 0.753186799f, 0.657806693f, + 0.749136395f, 0.662415778f, + 0.745057785f, 0.666999922f, + 0.740951125f, 0.671558955f, + 0.736816569f, 0.676092704f, + 0.732654272f, 0.680600998f, + 0.728464390f, 0.685083668f, + 0.724247083f, 0.689540545f, + 0.720002508f, 0.693971461f, + 0.715730825f, 0.698376249f, + 0.711432196f, 0.702754744f, + 0.707106781f, 0.707106781f, + 0.702754744f, 0.711432196f, + 0.698376249f, 0.715730825f, + 0.693971461f, 0.720002508f, + 0.689540545f, 0.724247083f, + 0.685083668f, 0.728464390f, + 0.680600998f, 0.732654272f, + 0.676092704f, 0.736816569f, + 0.671558955f, 0.740951125f, + 0.666999922f, 0.745057785f, + 0.662415778f, 0.749136395f, + 0.657806693f, 0.753186799f, + 0.653172843f, 0.757208847f, + 0.648514401f, 0.761202385f, + 0.643831543f, 0.765167266f, + 0.639124445f, 0.769103338f, + 0.634393284f, 0.773010453f, + 0.629638239f, 0.776888466f, + 0.624859488f, 0.780737229f, + 0.620057212f, 0.784556597f, + 0.615231591f, 0.788346428f, + 0.610382806f, 0.792106577f, + 0.605511041f, 0.795836905f, + 0.600616479f, 0.799537269f, + 0.595699304f, 0.803207531f, + 0.590759702f, 0.806847554f, + 0.585797857f, 0.810457198f, + 0.580813958f, 0.814036330f, + 0.575808191f, 0.817584813f, + 0.570780746f, 0.821102515f, + 0.565731811f, 0.824589303f, + 0.560661576f, 0.828045045f, + 0.555570233f, 0.831469612f, + 0.550457973f, 0.834862875f, + 0.545324988f, 0.838224706f, + 0.540171473f, 0.841554977f, + 0.534997620f, 0.844853565f, + 0.529803625f, 0.848120345f, + 0.524589683f, 0.851355193f, + 0.519355990f, 0.854557988f, + 0.514102744f, 0.857728610f, + 0.508830143f, 0.860866939f, + 0.503538384f, 0.863972856f, + 0.498227667f, 0.867046246f, + 0.492898192f, 0.870086991f, + 0.487550160f, 0.873094978f, + 0.482183772f, 0.876070094f, + 0.476799230f, 0.879012226f, + 0.471396737f, 0.881921264f, + 0.465976496f, 0.884797098f, + 0.460538711f, 0.887639620f, + 0.455083587f, 0.890448723f, + 0.449611330f, 0.893224301f, + 0.444122145f, 0.895966250f, + 0.438616239f, 0.898674466f, + 0.433093819f, 0.901348847f, + 0.427555093f, 0.903989293f, + 0.422000271f, 0.906595705f, + 0.416429560f, 0.909167983f, + 0.410843171f, 0.911706032f, + 0.405241314f, 0.914209756f, + 0.399624200f, 0.916679060f, + 0.393992040f, 0.919113852f, + 0.388345047f, 0.921514039f, + 0.382683432f, 0.923879533f, + 0.377007410f, 0.926210242f, + 0.371317194f, 0.928506080f, + 0.365612998f, 0.930766961f, + 0.359895037f, 0.932992799f, + 0.354163525f, 0.935183510f, + 0.348418680f, 0.937339012f, + 0.342660717f, 0.939459224f, + 0.336889853f, 0.941544065f, + 0.331106306f, 0.943593458f, + 0.325310292f, 0.945607325f, + 0.319502031f, 0.947585591f, + 0.313681740f, 0.949528181f, + 0.307849640f, 0.951435021f, + 0.302005949f, 0.953306040f, + 0.296150888f, 0.955141168f, + 0.290284677f, 0.956940336f, + 0.284407537f, 0.958703475f, + 0.278519689f, 0.960430519f, + 0.272621355f, 0.962121404f, + 0.266712757f, 0.963776066f, + 0.260794118f, 0.965394442f, + 0.254865660f, 0.966976471f, + 0.248927606f, 0.968522094f, + 0.242980180f, 0.970031253f, + 0.237023606f, 0.971503891f, + 0.231058108f, 0.972939952f, + 0.225083911f, 0.974339383f, + 0.219101240f, 0.975702130f, + 0.213110320f, 0.977028143f, + 0.207111376f, 0.978317371f, + 0.201104635f, 0.979569766f, + 0.195090322f, 0.980785280f, + 0.189068664f, 0.981963869f, + 0.183039888f, 0.983105487f, + 0.177004220f, 0.984210092f, + 0.170961889f, 0.985277642f, + 0.164913120f, 0.986308097f, + 0.158858143f, 0.987301418f, + 0.152797185f, 0.988257568f, + 0.146730474f, 0.989176510f, + 0.140658239f, 0.990058210f, + 0.134580709f, 0.990902635f, + 0.128498111f, 0.991709754f, + 0.122410675f, 0.992479535f, + 0.116318631f, 0.993211949f, + 0.110222207f, 0.993906970f, + 0.104121634f, 0.994564571f, + 0.098017140f, 0.995184727f, + 0.091908956f, 0.995767414f, + 0.085797312f, 0.996312612f, + 0.079682438f, 0.996820299f, + 0.073564564f, 0.997290457f, + 0.067443920f, 0.997723067f, + 0.061320736f, 0.998118113f, + 0.055195244f, 0.998475581f, + 0.049067674f, 0.998795456f, + 0.042938257f, 0.999077728f, + 0.036807223f, 0.999322385f, + 0.030674803f, 0.999529418f, + 0.024541229f, 0.999698819f, + 0.018406730f, 0.999830582f, + 0.012271538f, 0.999924702f, + 0.006135885f, 0.999981175f, + 0.000000000f, 1.000000000f, + -0.006135885f, 0.999981175f, + -0.012271538f, 0.999924702f, + -0.018406730f, 0.999830582f, + -0.024541229f, 0.999698819f, + -0.030674803f, 0.999529418f, + -0.036807223f, 0.999322385f, + -0.042938257f, 0.999077728f, + -0.049067674f, 0.998795456f, + -0.055195244f, 0.998475581f, + -0.061320736f, 0.998118113f, + -0.067443920f, 0.997723067f, + -0.073564564f, 0.997290457f, + -0.079682438f, 0.996820299f, + -0.085797312f, 0.996312612f, + -0.091908956f, 0.995767414f, + -0.098017140f, 0.995184727f, + -0.104121634f, 0.994564571f, + -0.110222207f, 0.993906970f, + -0.116318631f, 0.993211949f, + -0.122410675f, 0.992479535f, + -0.128498111f, 0.991709754f, + -0.134580709f, 0.990902635f, + -0.140658239f, 0.990058210f, + -0.146730474f, 0.989176510f, + -0.152797185f, 0.988257568f, + -0.158858143f, 0.987301418f, + -0.164913120f, 0.986308097f, + -0.170961889f, 0.985277642f, + -0.177004220f, 0.984210092f, + -0.183039888f, 0.983105487f, + -0.189068664f, 0.981963869f, + -0.195090322f, 0.980785280f, + -0.201104635f, 0.979569766f, + -0.207111376f, 0.978317371f, + -0.213110320f, 0.977028143f, + -0.219101240f, 0.975702130f, + -0.225083911f, 0.974339383f, + -0.231058108f, 0.972939952f, + -0.237023606f, 0.971503891f, + -0.242980180f, 0.970031253f, + -0.248927606f, 0.968522094f, + -0.254865660f, 0.966976471f, + -0.260794118f, 0.965394442f, + -0.266712757f, 0.963776066f, + -0.272621355f, 0.962121404f, + -0.278519689f, 0.960430519f, + -0.284407537f, 0.958703475f, + -0.290284677f, 0.956940336f, + -0.296150888f, 0.955141168f, + -0.302005949f, 0.953306040f, + -0.307849640f, 0.951435021f, + -0.313681740f, 0.949528181f, + -0.319502031f, 0.947585591f, + -0.325310292f, 0.945607325f, + -0.331106306f, 0.943593458f, + -0.336889853f, 0.941544065f, + -0.342660717f, 0.939459224f, + -0.348418680f, 0.937339012f, + -0.354163525f, 0.935183510f, + -0.359895037f, 0.932992799f, + -0.365612998f, 0.930766961f, + -0.371317194f, 0.928506080f, + -0.377007410f, 0.926210242f, + -0.382683432f, 0.923879533f, + -0.388345047f, 0.921514039f, + -0.393992040f, 0.919113852f, + -0.399624200f, 0.916679060f, + -0.405241314f, 0.914209756f, + -0.410843171f, 0.911706032f, + -0.416429560f, 0.909167983f, + -0.422000271f, 0.906595705f, + -0.427555093f, 0.903989293f, + -0.433093819f, 0.901348847f, + -0.438616239f, 0.898674466f, + -0.444122145f, 0.895966250f, + -0.449611330f, 0.893224301f, + -0.455083587f, 0.890448723f, + -0.460538711f, 0.887639620f, + -0.465976496f, 0.884797098f, + -0.471396737f, 0.881921264f, + -0.476799230f, 0.879012226f, + -0.482183772f, 0.876070094f, + -0.487550160f, 0.873094978f, + -0.492898192f, 0.870086991f, + -0.498227667f, 0.867046246f, + -0.503538384f, 0.863972856f, + -0.508830143f, 0.860866939f, + -0.514102744f, 0.857728610f, + -0.519355990f, 0.854557988f, + -0.524589683f, 0.851355193f, + -0.529803625f, 0.848120345f, + -0.534997620f, 0.844853565f, + -0.540171473f, 0.841554977f, + -0.545324988f, 0.838224706f, + -0.550457973f, 0.834862875f, + -0.555570233f, 0.831469612f, + -0.560661576f, 0.828045045f, + -0.565731811f, 0.824589303f, + -0.570780746f, 0.821102515f, + -0.575808191f, 0.817584813f, + -0.580813958f, 0.814036330f, + -0.585797857f, 0.810457198f, + -0.590759702f, 0.806847554f, + -0.595699304f, 0.803207531f, + -0.600616479f, 0.799537269f, + -0.605511041f, 0.795836905f, + -0.610382806f, 0.792106577f, + -0.615231591f, 0.788346428f, + -0.620057212f, 0.784556597f, + -0.624859488f, 0.780737229f, + -0.629638239f, 0.776888466f, + -0.634393284f, 0.773010453f, + -0.639124445f, 0.769103338f, + -0.643831543f, 0.765167266f, + -0.648514401f, 0.761202385f, + -0.653172843f, 0.757208847f, + -0.657806693f, 0.753186799f, + -0.662415778f, 0.749136395f, + -0.666999922f, 0.745057785f, + -0.671558955f, 0.740951125f, + -0.676092704f, 0.736816569f, + -0.680600998f, 0.732654272f, + -0.685083668f, 0.728464390f, + -0.689540545f, 0.724247083f, + -0.693971461f, 0.720002508f, + -0.698376249f, 0.715730825f, + -0.702754744f, 0.711432196f, + -0.707106781f, 0.707106781f, + -0.711432196f, 0.702754744f, + -0.715730825f, 0.698376249f, + -0.720002508f, 0.693971461f, + -0.724247083f, 0.689540545f, + -0.728464390f, 0.685083668f, + -0.732654272f, 0.680600998f, + -0.736816569f, 0.676092704f, + -0.740951125f, 0.671558955f, + -0.745057785f, 0.666999922f, + -0.749136395f, 0.662415778f, + -0.753186799f, 0.657806693f, + -0.757208847f, 0.653172843f, + -0.761202385f, 0.648514401f, + -0.765167266f, 0.643831543f, + -0.769103338f, 0.639124445f, + -0.773010453f, 0.634393284f, + -0.776888466f, 0.629638239f, + -0.780737229f, 0.624859488f, + -0.784556597f, 0.620057212f, + -0.788346428f, 0.615231591f, + -0.792106577f, 0.610382806f, + -0.795836905f, 0.605511041f, + -0.799537269f, 0.600616479f, + -0.803207531f, 0.595699304f, + -0.806847554f, 0.590759702f, + -0.810457198f, 0.585797857f, + -0.814036330f, 0.580813958f, + -0.817584813f, 0.575808191f, + -0.821102515f, 0.570780746f, + -0.824589303f, 0.565731811f, + -0.828045045f, 0.560661576f, + -0.831469612f, 0.555570233f, + -0.834862875f, 0.550457973f, + -0.838224706f, 0.545324988f, + -0.841554977f, 0.540171473f, + -0.844853565f, 0.534997620f, + -0.848120345f, 0.529803625f, + -0.851355193f, 0.524589683f, + -0.854557988f, 0.519355990f, + -0.857728610f, 0.514102744f, + -0.860866939f, 0.508830143f, + -0.863972856f, 0.503538384f, + -0.867046246f, 0.498227667f, + -0.870086991f, 0.492898192f, + -0.873094978f, 0.487550160f, + -0.876070094f, 0.482183772f, + -0.879012226f, 0.476799230f, + -0.881921264f, 0.471396737f, + -0.884797098f, 0.465976496f, + -0.887639620f, 0.460538711f, + -0.890448723f, 0.455083587f, + -0.893224301f, 0.449611330f, + -0.895966250f, 0.444122145f, + -0.898674466f, 0.438616239f, + -0.901348847f, 0.433093819f, + -0.903989293f, 0.427555093f, + -0.906595705f, 0.422000271f, + -0.909167983f, 0.416429560f, + -0.911706032f, 0.410843171f, + -0.914209756f, 0.405241314f, + -0.916679060f, 0.399624200f, + -0.919113852f, 0.393992040f, + -0.921514039f, 0.388345047f, + -0.923879533f, 0.382683432f, + -0.926210242f, 0.377007410f, + -0.928506080f, 0.371317194f, + -0.930766961f, 0.365612998f, + -0.932992799f, 0.359895037f, + -0.935183510f, 0.354163525f, + -0.937339012f, 0.348418680f, + -0.939459224f, 0.342660717f, + -0.941544065f, 0.336889853f, + -0.943593458f, 0.331106306f, + -0.945607325f, 0.325310292f, + -0.947585591f, 0.319502031f, + -0.949528181f, 0.313681740f, + -0.951435021f, 0.307849640f, + -0.953306040f, 0.302005949f, + -0.955141168f, 0.296150888f, + -0.956940336f, 0.290284677f, + -0.958703475f, 0.284407537f, + -0.960430519f, 0.278519689f, + -0.962121404f, 0.272621355f, + -0.963776066f, 0.266712757f, + -0.965394442f, 0.260794118f, + -0.966976471f, 0.254865660f, + -0.968522094f, 0.248927606f, + -0.970031253f, 0.242980180f, + -0.971503891f, 0.237023606f, + -0.972939952f, 0.231058108f, + -0.974339383f, 0.225083911f, + -0.975702130f, 0.219101240f, + -0.977028143f, 0.213110320f, + -0.978317371f, 0.207111376f, + -0.979569766f, 0.201104635f, + -0.980785280f, 0.195090322f, + -0.981963869f, 0.189068664f, + -0.983105487f, 0.183039888f, + -0.984210092f, 0.177004220f, + -0.985277642f, 0.170961889f, + -0.986308097f, 0.164913120f, + -0.987301418f, 0.158858143f, + -0.988257568f, 0.152797185f, + -0.989176510f, 0.146730474f, + -0.990058210f, 0.140658239f, + -0.990902635f, 0.134580709f, + -0.991709754f, 0.128498111f, + -0.992479535f, 0.122410675f, + -0.993211949f, 0.116318631f, + -0.993906970f, 0.110222207f, + -0.994564571f, 0.104121634f, + -0.995184727f, 0.098017140f, + -0.995767414f, 0.091908956f, + -0.996312612f, 0.085797312f, + -0.996820299f, 0.079682438f, + -0.997290457f, 0.073564564f, + -0.997723067f, 0.067443920f, + -0.998118113f, 0.061320736f, + -0.998475581f, 0.055195244f, + -0.998795456f, 0.049067674f, + -0.999077728f, 0.042938257f, + -0.999322385f, 0.036807223f, + -0.999529418f, 0.030674803f, + -0.999698819f, 0.024541229f, + -0.999830582f, 0.018406730f, + -0.999924702f, 0.012271538f, + -0.999981175f, 0.006135885f, + -1.000000000f, 0.000000000f, + -0.999981175f, -0.006135885f, + -0.999924702f, -0.012271538f, + -0.999830582f, -0.018406730f, + -0.999698819f, -0.024541229f, + -0.999529418f, -0.030674803f, + -0.999322385f, -0.036807223f, + -0.999077728f, -0.042938257f, + -0.998795456f, -0.049067674f, + -0.998475581f, -0.055195244f, + -0.998118113f, -0.061320736f, + -0.997723067f, -0.067443920f, + -0.997290457f, -0.073564564f, + -0.996820299f, -0.079682438f, + -0.996312612f, -0.085797312f, + -0.995767414f, -0.091908956f, + -0.995184727f, -0.098017140f, + -0.994564571f, -0.104121634f, + -0.993906970f, -0.110222207f, + -0.993211949f, -0.116318631f, + -0.992479535f, -0.122410675f, + -0.991709754f, -0.128498111f, + -0.990902635f, -0.134580709f, + -0.990058210f, -0.140658239f, + -0.989176510f, -0.146730474f, + -0.988257568f, -0.152797185f, + -0.987301418f, -0.158858143f, + -0.986308097f, -0.164913120f, + -0.985277642f, -0.170961889f, + -0.984210092f, -0.177004220f, + -0.983105487f, -0.183039888f, + -0.981963869f, -0.189068664f, + -0.980785280f, -0.195090322f, + -0.979569766f, -0.201104635f, + -0.978317371f, -0.207111376f, + -0.977028143f, -0.213110320f, + -0.975702130f, -0.219101240f, + -0.974339383f, -0.225083911f, + -0.972939952f, -0.231058108f, + -0.971503891f, -0.237023606f, + -0.970031253f, -0.242980180f, + -0.968522094f, -0.248927606f, + -0.966976471f, -0.254865660f, + -0.965394442f, -0.260794118f, + -0.963776066f, -0.266712757f, + -0.962121404f, -0.272621355f, + -0.960430519f, -0.278519689f, + -0.958703475f, -0.284407537f, + -0.956940336f, -0.290284677f, + -0.955141168f, -0.296150888f, + -0.953306040f, -0.302005949f, + -0.951435021f, -0.307849640f, + -0.949528181f, -0.313681740f, + -0.947585591f, -0.319502031f, + -0.945607325f, -0.325310292f, + -0.943593458f, -0.331106306f, + -0.941544065f, -0.336889853f, + -0.939459224f, -0.342660717f, + -0.937339012f, -0.348418680f, + -0.935183510f, -0.354163525f, + -0.932992799f, -0.359895037f, + -0.930766961f, -0.365612998f, + -0.928506080f, -0.371317194f, + -0.926210242f, -0.377007410f, + -0.923879533f, -0.382683432f, + -0.921514039f, -0.388345047f, + -0.919113852f, -0.393992040f, + -0.916679060f, -0.399624200f, + -0.914209756f, -0.405241314f, + -0.911706032f, -0.410843171f, + -0.909167983f, -0.416429560f, + -0.906595705f, -0.422000271f, + -0.903989293f, -0.427555093f, + -0.901348847f, -0.433093819f, + -0.898674466f, -0.438616239f, + -0.895966250f, -0.444122145f, + -0.893224301f, -0.449611330f, + -0.890448723f, -0.455083587f, + -0.887639620f, -0.460538711f, + -0.884797098f, -0.465976496f, + -0.881921264f, -0.471396737f, + -0.879012226f, -0.476799230f, + -0.876070094f, -0.482183772f, + -0.873094978f, -0.487550160f, + -0.870086991f, -0.492898192f, + -0.867046246f, -0.498227667f, + -0.863972856f, -0.503538384f, + -0.860866939f, -0.508830143f, + -0.857728610f, -0.514102744f, + -0.854557988f, -0.519355990f, + -0.851355193f, -0.524589683f, + -0.848120345f, -0.529803625f, + -0.844853565f, -0.534997620f, + -0.841554977f, -0.540171473f, + -0.838224706f, -0.545324988f, + -0.834862875f, -0.550457973f, + -0.831469612f, -0.555570233f, + -0.828045045f, -0.560661576f, + -0.824589303f, -0.565731811f, + -0.821102515f, -0.570780746f, + -0.817584813f, -0.575808191f, + -0.814036330f, -0.580813958f, + -0.810457198f, -0.585797857f, + -0.806847554f, -0.590759702f, + -0.803207531f, -0.595699304f, + -0.799537269f, -0.600616479f, + -0.795836905f, -0.605511041f, + -0.792106577f, -0.610382806f, + -0.788346428f, -0.615231591f, + -0.784556597f, -0.620057212f, + -0.780737229f, -0.624859488f, + -0.776888466f, -0.629638239f, + -0.773010453f, -0.634393284f, + -0.769103338f, -0.639124445f, + -0.765167266f, -0.643831543f, + -0.761202385f, -0.648514401f, + -0.757208847f, -0.653172843f, + -0.753186799f, -0.657806693f, + -0.749136395f, -0.662415778f, + -0.745057785f, -0.666999922f, + -0.740951125f, -0.671558955f, + -0.736816569f, -0.676092704f, + -0.732654272f, -0.680600998f, + -0.728464390f, -0.685083668f, + -0.724247083f, -0.689540545f, + -0.720002508f, -0.693971461f, + -0.715730825f, -0.698376249f, + -0.711432196f, -0.702754744f, + -0.707106781f, -0.707106781f, + -0.702754744f, -0.711432196f, + -0.698376249f, -0.715730825f, + -0.693971461f, -0.720002508f, + -0.689540545f, -0.724247083f, + -0.685083668f, -0.728464390f, + -0.680600998f, -0.732654272f, + -0.676092704f, -0.736816569f, + -0.671558955f, -0.740951125f, + -0.666999922f, -0.745057785f, + -0.662415778f, -0.749136395f, + -0.657806693f, -0.753186799f, + -0.653172843f, -0.757208847f, + -0.648514401f, -0.761202385f, + -0.643831543f, -0.765167266f, + -0.639124445f, -0.769103338f, + -0.634393284f, -0.773010453f, + -0.629638239f, -0.776888466f, + -0.624859488f, -0.780737229f, + -0.620057212f, -0.784556597f, + -0.615231591f, -0.788346428f, + -0.610382806f, -0.792106577f, + -0.605511041f, -0.795836905f, + -0.600616479f, -0.799537269f, + -0.595699304f, -0.803207531f, + -0.590759702f, -0.806847554f, + -0.585797857f, -0.810457198f, + -0.580813958f, -0.814036330f, + -0.575808191f, -0.817584813f, + -0.570780746f, -0.821102515f, + -0.565731811f, -0.824589303f, + -0.560661576f, -0.828045045f, + -0.555570233f, -0.831469612f, + -0.550457973f, -0.834862875f, + -0.545324988f, -0.838224706f, + -0.540171473f, -0.841554977f, + -0.534997620f, -0.844853565f, + -0.529803625f, -0.848120345f, + -0.524589683f, -0.851355193f, + -0.519355990f, -0.854557988f, + -0.514102744f, -0.857728610f, + -0.508830143f, -0.860866939f, + -0.503538384f, -0.863972856f, + -0.498227667f, -0.867046246f, + -0.492898192f, -0.870086991f, + -0.487550160f, -0.873094978f, + -0.482183772f, -0.876070094f, + -0.476799230f, -0.879012226f, + -0.471396737f, -0.881921264f, + -0.465976496f, -0.884797098f, + -0.460538711f, -0.887639620f, + -0.455083587f, -0.890448723f, + -0.449611330f, -0.893224301f, + -0.444122145f, -0.895966250f, + -0.438616239f, -0.898674466f, + -0.433093819f, -0.901348847f, + -0.427555093f, -0.903989293f, + -0.422000271f, -0.906595705f, + -0.416429560f, -0.909167983f, + -0.410843171f, -0.911706032f, + -0.405241314f, -0.914209756f, + -0.399624200f, -0.916679060f, + -0.393992040f, -0.919113852f, + -0.388345047f, -0.921514039f, + -0.382683432f, -0.923879533f, + -0.377007410f, -0.926210242f, + -0.371317194f, -0.928506080f, + -0.365612998f, -0.930766961f, + -0.359895037f, -0.932992799f, + -0.354163525f, -0.935183510f, + -0.348418680f, -0.937339012f, + -0.342660717f, -0.939459224f, + -0.336889853f, -0.941544065f, + -0.331106306f, -0.943593458f, + -0.325310292f, -0.945607325f, + -0.319502031f, -0.947585591f, + -0.313681740f, -0.949528181f, + -0.307849640f, -0.951435021f, + -0.302005949f, -0.953306040f, + -0.296150888f, -0.955141168f, + -0.290284677f, -0.956940336f, + -0.284407537f, -0.958703475f, + -0.278519689f, -0.960430519f, + -0.272621355f, -0.962121404f, + -0.266712757f, -0.963776066f, + -0.260794118f, -0.965394442f, + -0.254865660f, -0.966976471f, + -0.248927606f, -0.968522094f, + -0.242980180f, -0.970031253f, + -0.237023606f, -0.971503891f, + -0.231058108f, -0.972939952f, + -0.225083911f, -0.974339383f, + -0.219101240f, -0.975702130f, + -0.213110320f, -0.977028143f, + -0.207111376f, -0.978317371f, + -0.201104635f, -0.979569766f, + -0.195090322f, -0.980785280f, + -0.189068664f, -0.981963869f, + -0.183039888f, -0.983105487f, + -0.177004220f, -0.984210092f, + -0.170961889f, -0.985277642f, + -0.164913120f, -0.986308097f, + -0.158858143f, -0.987301418f, + -0.152797185f, -0.988257568f, + -0.146730474f, -0.989176510f, + -0.140658239f, -0.990058210f, + -0.134580709f, -0.990902635f, + -0.128498111f, -0.991709754f, + -0.122410675f, -0.992479535f, + -0.116318631f, -0.993211949f, + -0.110222207f, -0.993906970f, + -0.104121634f, -0.994564571f, + -0.098017140f, -0.995184727f, + -0.091908956f, -0.995767414f, + -0.085797312f, -0.996312612f, + -0.079682438f, -0.996820299f, + -0.073564564f, -0.997290457f, + -0.067443920f, -0.997723067f, + -0.061320736f, -0.998118113f, + -0.055195244f, -0.998475581f, + -0.049067674f, -0.998795456f, + -0.042938257f, -0.999077728f, + -0.036807223f, -0.999322385f, + -0.030674803f, -0.999529418f, + -0.024541229f, -0.999698819f, + -0.018406730f, -0.999830582f, + -0.012271538f, -0.999924702f, + -0.006135885f, -0.999981175f, + -0.000000000f, -1.000000000f, + 0.006135885f, -0.999981175f, + 0.012271538f, -0.999924702f, + 0.018406730f, -0.999830582f, + 0.024541229f, -0.999698819f, + 0.030674803f, -0.999529418f, + 0.036807223f, -0.999322385f, + 0.042938257f, -0.999077728f, + 0.049067674f, -0.998795456f, + 0.055195244f, -0.998475581f, + 0.061320736f, -0.998118113f, + 0.067443920f, -0.997723067f, + 0.073564564f, -0.997290457f, + 0.079682438f, -0.996820299f, + 0.085797312f, -0.996312612f, + 0.091908956f, -0.995767414f, + 0.098017140f, -0.995184727f, + 0.104121634f, -0.994564571f, + 0.110222207f, -0.993906970f, + 0.116318631f, -0.993211949f, + 0.122410675f, -0.992479535f, + 0.128498111f, -0.991709754f, + 0.134580709f, -0.990902635f, + 0.140658239f, -0.990058210f, + 0.146730474f, -0.989176510f, + 0.152797185f, -0.988257568f, + 0.158858143f, -0.987301418f, + 0.164913120f, -0.986308097f, + 0.170961889f, -0.985277642f, + 0.177004220f, -0.984210092f, + 0.183039888f, -0.983105487f, + 0.189068664f, -0.981963869f, + 0.195090322f, -0.980785280f, + 0.201104635f, -0.979569766f, + 0.207111376f, -0.978317371f, + 0.213110320f, -0.977028143f, + 0.219101240f, -0.975702130f, + 0.225083911f, -0.974339383f, + 0.231058108f, -0.972939952f, + 0.237023606f, -0.971503891f, + 0.242980180f, -0.970031253f, + 0.248927606f, -0.968522094f, + 0.254865660f, -0.966976471f, + 0.260794118f, -0.965394442f, + 0.266712757f, -0.963776066f, + 0.272621355f, -0.962121404f, + 0.278519689f, -0.960430519f, + 0.284407537f, -0.958703475f, + 0.290284677f, -0.956940336f, + 0.296150888f, -0.955141168f, + 0.302005949f, -0.953306040f, + 0.307849640f, -0.951435021f, + 0.313681740f, -0.949528181f, + 0.319502031f, -0.947585591f, + 0.325310292f, -0.945607325f, + 0.331106306f, -0.943593458f, + 0.336889853f, -0.941544065f, + 0.342660717f, -0.939459224f, + 0.348418680f, -0.937339012f, + 0.354163525f, -0.935183510f, + 0.359895037f, -0.932992799f, + 0.365612998f, -0.930766961f, + 0.371317194f, -0.928506080f, + 0.377007410f, -0.926210242f, + 0.382683432f, -0.923879533f, + 0.388345047f, -0.921514039f, + 0.393992040f, -0.919113852f, + 0.399624200f, -0.916679060f, + 0.405241314f, -0.914209756f, + 0.410843171f, -0.911706032f, + 0.416429560f, -0.909167983f, + 0.422000271f, -0.906595705f, + 0.427555093f, -0.903989293f, + 0.433093819f, -0.901348847f, + 0.438616239f, -0.898674466f, + 0.444122145f, -0.895966250f, + 0.449611330f, -0.893224301f, + 0.455083587f, -0.890448723f, + 0.460538711f, -0.887639620f, + 0.465976496f, -0.884797098f, + 0.471396737f, -0.881921264f, + 0.476799230f, -0.879012226f, + 0.482183772f, -0.876070094f, + 0.487550160f, -0.873094978f, + 0.492898192f, -0.870086991f, + 0.498227667f, -0.867046246f, + 0.503538384f, -0.863972856f, + 0.508830143f, -0.860866939f, + 0.514102744f, -0.857728610f, + 0.519355990f, -0.854557988f, + 0.524589683f, -0.851355193f, + 0.529803625f, -0.848120345f, + 0.534997620f, -0.844853565f, + 0.540171473f, -0.841554977f, + 0.545324988f, -0.838224706f, + 0.550457973f, -0.834862875f, + 0.555570233f, -0.831469612f, + 0.560661576f, -0.828045045f, + 0.565731811f, -0.824589303f, + 0.570780746f, -0.821102515f, + 0.575808191f, -0.817584813f, + 0.580813958f, -0.814036330f, + 0.585797857f, -0.810457198f, + 0.590759702f, -0.806847554f, + 0.595699304f, -0.803207531f, + 0.600616479f, -0.799537269f, + 0.605511041f, -0.795836905f, + 0.610382806f, -0.792106577f, + 0.615231591f, -0.788346428f, + 0.620057212f, -0.784556597f, + 0.624859488f, -0.780737229f, + 0.629638239f, -0.776888466f, + 0.634393284f, -0.773010453f, + 0.639124445f, -0.769103338f, + 0.643831543f, -0.765167266f, + 0.648514401f, -0.761202385f, + 0.653172843f, -0.757208847f, + 0.657806693f, -0.753186799f, + 0.662415778f, -0.749136395f, + 0.666999922f, -0.745057785f, + 0.671558955f, -0.740951125f, + 0.676092704f, -0.736816569f, + 0.680600998f, -0.732654272f, + 0.685083668f, -0.728464390f, + 0.689540545f, -0.724247083f, + 0.693971461f, -0.720002508f, + 0.698376249f, -0.715730825f, + 0.702754744f, -0.711432196f, + 0.707106781f, -0.707106781f, + 0.711432196f, -0.702754744f, + 0.715730825f, -0.698376249f, + 0.720002508f, -0.693971461f, + 0.724247083f, -0.689540545f, + 0.728464390f, -0.685083668f, + 0.732654272f, -0.680600998f, + 0.736816569f, -0.676092704f, + 0.740951125f, -0.671558955f, + 0.745057785f, -0.666999922f, + 0.749136395f, -0.662415778f, + 0.753186799f, -0.657806693f, + 0.757208847f, -0.653172843f, + 0.761202385f, -0.648514401f, + 0.765167266f, -0.643831543f, + 0.769103338f, -0.639124445f, + 0.773010453f, -0.634393284f, + 0.776888466f, -0.629638239f, + 0.780737229f, -0.624859488f, + 0.784556597f, -0.620057212f, + 0.788346428f, -0.615231591f, + 0.792106577f, -0.610382806f, + 0.795836905f, -0.605511041f, + 0.799537269f, -0.600616479f, + 0.803207531f, -0.595699304f, + 0.806847554f, -0.590759702f, + 0.810457198f, -0.585797857f, + 0.814036330f, -0.580813958f, + 0.817584813f, -0.575808191f, + 0.821102515f, -0.570780746f, + 0.824589303f, -0.565731811f, + 0.828045045f, -0.560661576f, + 0.831469612f, -0.555570233f, + 0.834862875f, -0.550457973f, + 0.838224706f, -0.545324988f, + 0.841554977f, -0.540171473f, + 0.844853565f, -0.534997620f, + 0.848120345f, -0.529803625f, + 0.851355193f, -0.524589683f, + 0.854557988f, -0.519355990f, + 0.857728610f, -0.514102744f, + 0.860866939f, -0.508830143f, + 0.863972856f, -0.503538384f, + 0.867046246f, -0.498227667f, + 0.870086991f, -0.492898192f, + 0.873094978f, -0.487550160f, + 0.876070094f, -0.482183772f, + 0.879012226f, -0.476799230f, + 0.881921264f, -0.471396737f, + 0.884797098f, -0.465976496f, + 0.887639620f, -0.460538711f, + 0.890448723f, -0.455083587f, + 0.893224301f, -0.449611330f, + 0.895966250f, -0.444122145f, + 0.898674466f, -0.438616239f, + 0.901348847f, -0.433093819f, + 0.903989293f, -0.427555093f, + 0.906595705f, -0.422000271f, + 0.909167983f, -0.416429560f, + 0.911706032f, -0.410843171f, + 0.914209756f, -0.405241314f, + 0.916679060f, -0.399624200f, + 0.919113852f, -0.393992040f, + 0.921514039f, -0.388345047f, + 0.923879533f, -0.382683432f, + 0.926210242f, -0.377007410f, + 0.928506080f, -0.371317194f, + 0.930766961f, -0.365612998f, + 0.932992799f, -0.359895037f, + 0.935183510f, -0.354163525f, + 0.937339012f, -0.348418680f, + 0.939459224f, -0.342660717f, + 0.941544065f, -0.336889853f, + 0.943593458f, -0.331106306f, + 0.945607325f, -0.325310292f, + 0.947585591f, -0.319502031f, + 0.949528181f, -0.313681740f, + 0.951435021f, -0.307849640f, + 0.953306040f, -0.302005949f, + 0.955141168f, -0.296150888f, + 0.956940336f, -0.290284677f, + 0.958703475f, -0.284407537f, + 0.960430519f, -0.278519689f, + 0.962121404f, -0.272621355f, + 0.963776066f, -0.266712757f, + 0.965394442f, -0.260794118f, + 0.966976471f, -0.254865660f, + 0.968522094f, -0.248927606f, + 0.970031253f, -0.242980180f, + 0.971503891f, -0.237023606f, + 0.972939952f, -0.231058108f, + 0.974339383f, -0.225083911f, + 0.975702130f, -0.219101240f, + 0.977028143f, -0.213110320f, + 0.978317371f, -0.207111376f, + 0.979569766f, -0.201104635f, + 0.980785280f, -0.195090322f, + 0.981963869f, -0.189068664f, + 0.983105487f, -0.183039888f, + 0.984210092f, -0.177004220f, + 0.985277642f, -0.170961889f, + 0.986308097f, -0.164913120f, + 0.987301418f, -0.158858143f, + 0.988257568f, -0.152797185f, + 0.989176510f, -0.146730474f, + 0.990058210f, -0.140658239f, + 0.990902635f, -0.134580709f, + 0.991709754f, -0.128498111f, + 0.992479535f, -0.122410675f, + 0.993211949f, -0.116318631f, + 0.993906970f, -0.110222207f, + 0.994564571f, -0.104121634f, + 0.995184727f, -0.098017140f, + 0.995767414f, -0.091908956f, + 0.996312612f, -0.085797312f, + 0.996820299f, -0.079682438f, + 0.997290457f, -0.073564564f, + 0.997723067f, -0.067443920f, + 0.998118113f, -0.061320736f, + 0.998475581f, -0.055195244f, + 0.998795456f, -0.049067674f, + 0.999077728f, -0.042938257f, + 0.999322385f, -0.036807223f, + 0.999529418f, -0.030674803f, + 0.999698819f, -0.024541229f, + 0.999830582f, -0.018406730f, + 0.999924702f, -0.012271538f, + 0.999981175f, -0.006135885f +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048) +/** + @par + Example code for Floating-point Twiddle factors Generation: + @par +
for (i = 0; i< N/; i++)
+  {
+ 	twiddleCoef[2*i]   = cos(i * 2*PI/(float)N);
+ 	twiddleCoef[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 2048, PI = 3.14159265358979 + @par + Cos and Sin values are in interleaved fashion +*/ +const float32_t twiddleCoef_2048[4096] = { + 1.000000000f, 0.000000000f, + 0.999995294f, 0.003067957f, + 0.999981175f, 0.006135885f, + 0.999957645f, 0.009203755f, + 0.999924702f, 0.012271538f, + 0.999882347f, 0.015339206f, + 0.999830582f, 0.018406730f, + 0.999769405f, 0.021474080f, + 0.999698819f, 0.024541229f, + 0.999618822f, 0.027608146f, + 0.999529418f, 0.030674803f, + 0.999430605f, 0.033741172f, + 0.999322385f, 0.036807223f, + 0.999204759f, 0.039872928f, + 0.999077728f, 0.042938257f, + 0.998941293f, 0.046003182f, + 0.998795456f, 0.049067674f, + 0.998640218f, 0.052131705f, + 0.998475581f, 0.055195244f, + 0.998301545f, 0.058258265f, + 0.998118113f, 0.061320736f, + 0.997925286f, 0.064382631f, + 0.997723067f, 0.067443920f, + 0.997511456f, 0.070504573f, + 0.997290457f, 0.073564564f, + 0.997060070f, 0.076623861f, + 0.996820299f, 0.079682438f, + 0.996571146f, 0.082740265f, + 0.996312612f, 0.085797312f, + 0.996044701f, 0.088853553f, + 0.995767414f, 0.091908956f, + 0.995480755f, 0.094963495f, + 0.995184727f, 0.098017140f, + 0.994879331f, 0.101069863f, + 0.994564571f, 0.104121634f, + 0.994240449f, 0.107172425f, + 0.993906970f, 0.110222207f, + 0.993564136f, 0.113270952f, + 0.993211949f, 0.116318631f, + 0.992850414f, 0.119365215f, + 0.992479535f, 0.122410675f, + 0.992099313f, 0.125454983f, + 0.991709754f, 0.128498111f, + 0.991310860f, 0.131540029f, + 0.990902635f, 0.134580709f, + 0.990485084f, 0.137620122f, + 0.990058210f, 0.140658239f, + 0.989622017f, 0.143695033f, + 0.989176510f, 0.146730474f, + 0.988721692f, 0.149764535f, + 0.988257568f, 0.152797185f, + 0.987784142f, 0.155828398f, + 0.987301418f, 0.158858143f, + 0.986809402f, 0.161886394f, + 0.986308097f, 0.164913120f, + 0.985797509f, 0.167938295f, + 0.985277642f, 0.170961889f, + 0.984748502f, 0.173983873f, + 0.984210092f, 0.177004220f, + 0.983662419f, 0.180022901f, + 0.983105487f, 0.183039888f, + 0.982539302f, 0.186055152f, + 0.981963869f, 0.189068664f, + 0.981379193f, 0.192080397f, + 0.980785280f, 0.195090322f, + 0.980182136f, 0.198098411f, + 0.979569766f, 0.201104635f, + 0.978948175f, 0.204108966f, + 0.978317371f, 0.207111376f, + 0.977677358f, 0.210111837f, + 0.977028143f, 0.213110320f, + 0.976369731f, 0.216106797f, + 0.975702130f, 0.219101240f, + 0.975025345f, 0.222093621f, + 0.974339383f, 0.225083911f, + 0.973644250f, 0.228072083f, + 0.972939952f, 0.231058108f, + 0.972226497f, 0.234041959f, + 0.971503891f, 0.237023606f, + 0.970772141f, 0.240003022f, + 0.970031253f, 0.242980180f, + 0.969281235f, 0.245955050f, + 0.968522094f, 0.248927606f, + 0.967753837f, 0.251897818f, + 0.966976471f, 0.254865660f, + 0.966190003f, 0.257831102f, + 0.965394442f, 0.260794118f, + 0.964589793f, 0.263754679f, + 0.963776066f, 0.266712757f, + 0.962953267f, 0.269668326f, + 0.962121404f, 0.272621355f, + 0.961280486f, 0.275571819f, + 0.960430519f, 0.278519689f, + 0.959571513f, 0.281464938f, + 0.958703475f, 0.284407537f, + 0.957826413f, 0.287347460f, + 0.956940336f, 0.290284677f, + 0.956045251f, 0.293219163f, + 0.955141168f, 0.296150888f, + 0.954228095f, 0.299079826f, + 0.953306040f, 0.302005949f, + 0.952375013f, 0.304929230f, + 0.951435021f, 0.307849640f, + 0.950486074f, 0.310767153f, + 0.949528181f, 0.313681740f, + 0.948561350f, 0.316593376f, + 0.947585591f, 0.319502031f, + 0.946600913f, 0.322407679f, + 0.945607325f, 0.325310292f, + 0.944604837f, 0.328209844f, + 0.943593458f, 0.331106306f, + 0.942573198f, 0.333999651f, + 0.941544065f, 0.336889853f, + 0.940506071f, 0.339776884f, + 0.939459224f, 0.342660717f, + 0.938403534f, 0.345541325f, + 0.937339012f, 0.348418680f, + 0.936265667f, 0.351292756f, + 0.935183510f, 0.354163525f, + 0.934092550f, 0.357030961f, + 0.932992799f, 0.359895037f, + 0.931884266f, 0.362755724f, + 0.930766961f, 0.365612998f, + 0.929640896f, 0.368466830f, + 0.928506080f, 0.371317194f, + 0.927362526f, 0.374164063f, + 0.926210242f, 0.377007410f, + 0.925049241f, 0.379847209f, + 0.923879533f, 0.382683432f, + 0.922701128f, 0.385516054f, + 0.921514039f, 0.388345047f, + 0.920318277f, 0.391170384f, + 0.919113852f, 0.393992040f, + 0.917900776f, 0.396809987f, + 0.916679060f, 0.399624200f, + 0.915448716f, 0.402434651f, + 0.914209756f, 0.405241314f, + 0.912962190f, 0.408044163f, + 0.911706032f, 0.410843171f, + 0.910441292f, 0.413638312f, + 0.909167983f, 0.416429560f, + 0.907886116f, 0.419216888f, + 0.906595705f, 0.422000271f, + 0.905296759f, 0.424779681f, + 0.903989293f, 0.427555093f, + 0.902673318f, 0.430326481f, + 0.901348847f, 0.433093819f, + 0.900015892f, 0.435857080f, + 0.898674466f, 0.438616239f, + 0.897324581f, 0.441371269f, + 0.895966250f, 0.444122145f, + 0.894599486f, 0.446868840f, + 0.893224301f, 0.449611330f, + 0.891840709f, 0.452349587f, + 0.890448723f, 0.455083587f, + 0.889048356f, 0.457813304f, + 0.887639620f, 0.460538711f, + 0.886222530f, 0.463259784f, + 0.884797098f, 0.465976496f, + 0.883363339f, 0.468688822f, + 0.881921264f, 0.471396737f, + 0.880470889f, 0.474100215f, + 0.879012226f, 0.476799230f, + 0.877545290f, 0.479493758f, + 0.876070094f, 0.482183772f, + 0.874586652f, 0.484869248f, + 0.873094978f, 0.487550160f, + 0.871595087f, 0.490226483f, + 0.870086991f, 0.492898192f, + 0.868570706f, 0.495565262f, + 0.867046246f, 0.498227667f, + 0.865513624f, 0.500885383f, + 0.863972856f, 0.503538384f, + 0.862423956f, 0.506186645f, + 0.860866939f, 0.508830143f, + 0.859301818f, 0.511468850f, + 0.857728610f, 0.514102744f, + 0.856147328f, 0.516731799f, + 0.854557988f, 0.519355990f, + 0.852960605f, 0.521975293f, + 0.851355193f, 0.524589683f, + 0.849741768f, 0.527199135f, + 0.848120345f, 0.529803625f, + 0.846490939f, 0.532403128f, + 0.844853565f, 0.534997620f, + 0.843208240f, 0.537587076f, + 0.841554977f, 0.540171473f, + 0.839893794f, 0.542750785f, + 0.838224706f, 0.545324988f, + 0.836547727f, 0.547894059f, + 0.834862875f, 0.550457973f, + 0.833170165f, 0.553016706f, + 0.831469612f, 0.555570233f, + 0.829761234f, 0.558118531f, + 0.828045045f, 0.560661576f, + 0.826321063f, 0.563199344f, + 0.824589303f, 0.565731811f, + 0.822849781f, 0.568258953f, + 0.821102515f, 0.570780746f, + 0.819347520f, 0.573297167f, + 0.817584813f, 0.575808191f, + 0.815814411f, 0.578313796f, + 0.814036330f, 0.580813958f, + 0.812250587f, 0.583308653f, + 0.810457198f, 0.585797857f, + 0.808656182f, 0.588281548f, + 0.806847554f, 0.590759702f, + 0.805031331f, 0.593232295f, + 0.803207531f, 0.595699304f, + 0.801376172f, 0.598160707f, + 0.799537269f, 0.600616479f, + 0.797690841f, 0.603066599f, + 0.795836905f, 0.605511041f, + 0.793975478f, 0.607949785f, + 0.792106577f, 0.610382806f, + 0.790230221f, 0.612810082f, + 0.788346428f, 0.615231591f, + 0.786455214f, 0.617647308f, + 0.784556597f, 0.620057212f, + 0.782650596f, 0.622461279f, + 0.780737229f, 0.624859488f, + 0.778816512f, 0.627251815f, + 0.776888466f, 0.629638239f, + 0.774953107f, 0.632018736f, + 0.773010453f, 0.634393284f, + 0.771060524f, 0.636761861f, + 0.769103338f, 0.639124445f, + 0.767138912f, 0.641481013f, + 0.765167266f, 0.643831543f, + 0.763188417f, 0.646176013f, + 0.761202385f, 0.648514401f, + 0.759209189f, 0.650846685f, + 0.757208847f, 0.653172843f, + 0.755201377f, 0.655492853f, + 0.753186799f, 0.657806693f, + 0.751165132f, 0.660114342f, + 0.749136395f, 0.662415778f, + 0.747100606f, 0.664710978f, + 0.745057785f, 0.666999922f, + 0.743007952f, 0.669282588f, + 0.740951125f, 0.671558955f, + 0.738887324f, 0.673829000f, + 0.736816569f, 0.676092704f, + 0.734738878f, 0.678350043f, + 0.732654272f, 0.680600998f, + 0.730562769f, 0.682845546f, + 0.728464390f, 0.685083668f, + 0.726359155f, 0.687315341f, + 0.724247083f, 0.689540545f, + 0.722128194f, 0.691759258f, + 0.720002508f, 0.693971461f, + 0.717870045f, 0.696177131f, + 0.715730825f, 0.698376249f, + 0.713584869f, 0.700568794f, + 0.711432196f, 0.702754744f, + 0.709272826f, 0.704934080f, + 0.707106781f, 0.707106781f, + 0.704934080f, 0.709272826f, + 0.702754744f, 0.711432196f, + 0.700568794f, 0.713584869f, + 0.698376249f, 0.715730825f, + 0.696177131f, 0.717870045f, + 0.693971461f, 0.720002508f, + 0.691759258f, 0.722128194f, + 0.689540545f, 0.724247083f, + 0.687315341f, 0.726359155f, + 0.685083668f, 0.728464390f, + 0.682845546f, 0.730562769f, + 0.680600998f, 0.732654272f, + 0.678350043f, 0.734738878f, + 0.676092704f, 0.736816569f, + 0.673829000f, 0.738887324f, + 0.671558955f, 0.740951125f, + 0.669282588f, 0.743007952f, + 0.666999922f, 0.745057785f, + 0.664710978f, 0.747100606f, + 0.662415778f, 0.749136395f, + 0.660114342f, 0.751165132f, + 0.657806693f, 0.753186799f, + 0.655492853f, 0.755201377f, + 0.653172843f, 0.757208847f, + 0.650846685f, 0.759209189f, + 0.648514401f, 0.761202385f, + 0.646176013f, 0.763188417f, + 0.643831543f, 0.765167266f, + 0.641481013f, 0.767138912f, + 0.639124445f, 0.769103338f, + 0.636761861f, 0.771060524f, + 0.634393284f, 0.773010453f, + 0.632018736f, 0.774953107f, + 0.629638239f, 0.776888466f, + 0.627251815f, 0.778816512f, + 0.624859488f, 0.780737229f, + 0.622461279f, 0.782650596f, + 0.620057212f, 0.784556597f, + 0.617647308f, 0.786455214f, + 0.615231591f, 0.788346428f, + 0.612810082f, 0.790230221f, + 0.610382806f, 0.792106577f, + 0.607949785f, 0.793975478f, + 0.605511041f, 0.795836905f, + 0.603066599f, 0.797690841f, + 0.600616479f, 0.799537269f, + 0.598160707f, 0.801376172f, + 0.595699304f, 0.803207531f, + 0.593232295f, 0.805031331f, + 0.590759702f, 0.806847554f, + 0.588281548f, 0.808656182f, + 0.585797857f, 0.810457198f, + 0.583308653f, 0.812250587f, + 0.580813958f, 0.814036330f, + 0.578313796f, 0.815814411f, + 0.575808191f, 0.817584813f, + 0.573297167f, 0.819347520f, + 0.570780746f, 0.821102515f, + 0.568258953f, 0.822849781f, + 0.565731811f, 0.824589303f, + 0.563199344f, 0.826321063f, + 0.560661576f, 0.828045045f, + 0.558118531f, 0.829761234f, + 0.555570233f, 0.831469612f, + 0.553016706f, 0.833170165f, + 0.550457973f, 0.834862875f, + 0.547894059f, 0.836547727f, + 0.545324988f, 0.838224706f, + 0.542750785f, 0.839893794f, + 0.540171473f, 0.841554977f, + 0.537587076f, 0.843208240f, + 0.534997620f, 0.844853565f, + 0.532403128f, 0.846490939f, + 0.529803625f, 0.848120345f, + 0.527199135f, 0.849741768f, + 0.524589683f, 0.851355193f, + 0.521975293f, 0.852960605f, + 0.519355990f, 0.854557988f, + 0.516731799f, 0.856147328f, + 0.514102744f, 0.857728610f, + 0.511468850f, 0.859301818f, + 0.508830143f, 0.860866939f, + 0.506186645f, 0.862423956f, + 0.503538384f, 0.863972856f, + 0.500885383f, 0.865513624f, + 0.498227667f, 0.867046246f, + 0.495565262f, 0.868570706f, + 0.492898192f, 0.870086991f, + 0.490226483f, 0.871595087f, + 0.487550160f, 0.873094978f, + 0.484869248f, 0.874586652f, + 0.482183772f, 0.876070094f, + 0.479493758f, 0.877545290f, + 0.476799230f, 0.879012226f, + 0.474100215f, 0.880470889f, + 0.471396737f, 0.881921264f, + 0.468688822f, 0.883363339f, + 0.465976496f, 0.884797098f, + 0.463259784f, 0.886222530f, + 0.460538711f, 0.887639620f, + 0.457813304f, 0.889048356f, + 0.455083587f, 0.890448723f, + 0.452349587f, 0.891840709f, + 0.449611330f, 0.893224301f, + 0.446868840f, 0.894599486f, + 0.444122145f, 0.895966250f, + 0.441371269f, 0.897324581f, + 0.438616239f, 0.898674466f, + 0.435857080f, 0.900015892f, + 0.433093819f, 0.901348847f, + 0.430326481f, 0.902673318f, + 0.427555093f, 0.903989293f, + 0.424779681f, 0.905296759f, + 0.422000271f, 0.906595705f, + 0.419216888f, 0.907886116f, + 0.416429560f, 0.909167983f, + 0.413638312f, 0.910441292f, + 0.410843171f, 0.911706032f, + 0.408044163f, 0.912962190f, + 0.405241314f, 0.914209756f, + 0.402434651f, 0.915448716f, + 0.399624200f, 0.916679060f, + 0.396809987f, 0.917900776f, + 0.393992040f, 0.919113852f, + 0.391170384f, 0.920318277f, + 0.388345047f, 0.921514039f, + 0.385516054f, 0.922701128f, + 0.382683432f, 0.923879533f, + 0.379847209f, 0.925049241f, + 0.377007410f, 0.926210242f, + 0.374164063f, 0.927362526f, + 0.371317194f, 0.928506080f, + 0.368466830f, 0.929640896f, + 0.365612998f, 0.930766961f, + 0.362755724f, 0.931884266f, + 0.359895037f, 0.932992799f, + 0.357030961f, 0.934092550f, + 0.354163525f, 0.935183510f, + 0.351292756f, 0.936265667f, + 0.348418680f, 0.937339012f, + 0.345541325f, 0.938403534f, + 0.342660717f, 0.939459224f, + 0.339776884f, 0.940506071f, + 0.336889853f, 0.941544065f, + 0.333999651f, 0.942573198f, + 0.331106306f, 0.943593458f, + 0.328209844f, 0.944604837f, + 0.325310292f, 0.945607325f, + 0.322407679f, 0.946600913f, + 0.319502031f, 0.947585591f, + 0.316593376f, 0.948561350f, + 0.313681740f, 0.949528181f, + 0.310767153f, 0.950486074f, + 0.307849640f, 0.951435021f, + 0.304929230f, 0.952375013f, + 0.302005949f, 0.953306040f, + 0.299079826f, 0.954228095f, + 0.296150888f, 0.955141168f, + 0.293219163f, 0.956045251f, + 0.290284677f, 0.956940336f, + 0.287347460f, 0.957826413f, + 0.284407537f, 0.958703475f, + 0.281464938f, 0.959571513f, + 0.278519689f, 0.960430519f, + 0.275571819f, 0.961280486f, + 0.272621355f, 0.962121404f, + 0.269668326f, 0.962953267f, + 0.266712757f, 0.963776066f, + 0.263754679f, 0.964589793f, + 0.260794118f, 0.965394442f, + 0.257831102f, 0.966190003f, + 0.254865660f, 0.966976471f, + 0.251897818f, 0.967753837f, + 0.248927606f, 0.968522094f, + 0.245955050f, 0.969281235f, + 0.242980180f, 0.970031253f, + 0.240003022f, 0.970772141f, + 0.237023606f, 0.971503891f, + 0.234041959f, 0.972226497f, + 0.231058108f, 0.972939952f, + 0.228072083f, 0.973644250f, + 0.225083911f, 0.974339383f, + 0.222093621f, 0.975025345f, + 0.219101240f, 0.975702130f, + 0.216106797f, 0.976369731f, + 0.213110320f, 0.977028143f, + 0.210111837f, 0.977677358f, + 0.207111376f, 0.978317371f, + 0.204108966f, 0.978948175f, + 0.201104635f, 0.979569766f, + 0.198098411f, 0.980182136f, + 0.195090322f, 0.980785280f, + 0.192080397f, 0.981379193f, + 0.189068664f, 0.981963869f, + 0.186055152f, 0.982539302f, + 0.183039888f, 0.983105487f, + 0.180022901f, 0.983662419f, + 0.177004220f, 0.984210092f, + 0.173983873f, 0.984748502f, + 0.170961889f, 0.985277642f, + 0.167938295f, 0.985797509f, + 0.164913120f, 0.986308097f, + 0.161886394f, 0.986809402f, + 0.158858143f, 0.987301418f, + 0.155828398f, 0.987784142f, + 0.152797185f, 0.988257568f, + 0.149764535f, 0.988721692f, + 0.146730474f, 0.989176510f, + 0.143695033f, 0.989622017f, + 0.140658239f, 0.990058210f, + 0.137620122f, 0.990485084f, + 0.134580709f, 0.990902635f, + 0.131540029f, 0.991310860f, + 0.128498111f, 0.991709754f, + 0.125454983f, 0.992099313f, + 0.122410675f, 0.992479535f, + 0.119365215f, 0.992850414f, + 0.116318631f, 0.993211949f, + 0.113270952f, 0.993564136f, + 0.110222207f, 0.993906970f, + 0.107172425f, 0.994240449f, + 0.104121634f, 0.994564571f, + 0.101069863f, 0.994879331f, + 0.098017140f, 0.995184727f, + 0.094963495f, 0.995480755f, + 0.091908956f, 0.995767414f, + 0.088853553f, 0.996044701f, + 0.085797312f, 0.996312612f, + 0.082740265f, 0.996571146f, + 0.079682438f, 0.996820299f, + 0.076623861f, 0.997060070f, + 0.073564564f, 0.997290457f, + 0.070504573f, 0.997511456f, + 0.067443920f, 0.997723067f, + 0.064382631f, 0.997925286f, + 0.061320736f, 0.998118113f, + 0.058258265f, 0.998301545f, + 0.055195244f, 0.998475581f, + 0.052131705f, 0.998640218f, + 0.049067674f, 0.998795456f, + 0.046003182f, 0.998941293f, + 0.042938257f, 0.999077728f, + 0.039872928f, 0.999204759f, + 0.036807223f, 0.999322385f, + 0.033741172f, 0.999430605f, + 0.030674803f, 0.999529418f, + 0.027608146f, 0.999618822f, + 0.024541229f, 0.999698819f, + 0.021474080f, 0.999769405f, + 0.018406730f, 0.999830582f, + 0.015339206f, 0.999882347f, + 0.012271538f, 0.999924702f, + 0.009203755f, 0.999957645f, + 0.006135885f, 0.999981175f, + 0.003067957f, 0.999995294f, + 0.000000000f, 1.000000000f, + -0.003067957f, 0.999995294f, + -0.006135885f, 0.999981175f, + -0.009203755f, 0.999957645f, + -0.012271538f, 0.999924702f, + -0.015339206f, 0.999882347f, + -0.018406730f, 0.999830582f, + -0.021474080f, 0.999769405f, + -0.024541229f, 0.999698819f, + -0.027608146f, 0.999618822f, + -0.030674803f, 0.999529418f, + -0.033741172f, 0.999430605f, + -0.036807223f, 0.999322385f, + -0.039872928f, 0.999204759f, + -0.042938257f, 0.999077728f, + -0.046003182f, 0.998941293f, + -0.049067674f, 0.998795456f, + -0.052131705f, 0.998640218f, + -0.055195244f, 0.998475581f, + -0.058258265f, 0.998301545f, + -0.061320736f, 0.998118113f, + -0.064382631f, 0.997925286f, + -0.067443920f, 0.997723067f, + -0.070504573f, 0.997511456f, + -0.073564564f, 0.997290457f, + -0.076623861f, 0.997060070f, + -0.079682438f, 0.996820299f, + -0.082740265f, 0.996571146f, + -0.085797312f, 0.996312612f, + -0.088853553f, 0.996044701f, + -0.091908956f, 0.995767414f, + -0.094963495f, 0.995480755f, + -0.098017140f, 0.995184727f, + -0.101069863f, 0.994879331f, + -0.104121634f, 0.994564571f, + -0.107172425f, 0.994240449f, + -0.110222207f, 0.993906970f, + -0.113270952f, 0.993564136f, + -0.116318631f, 0.993211949f, + -0.119365215f, 0.992850414f, + -0.122410675f, 0.992479535f, + -0.125454983f, 0.992099313f, + -0.128498111f, 0.991709754f, + -0.131540029f, 0.991310860f, + -0.134580709f, 0.990902635f, + -0.137620122f, 0.990485084f, + -0.140658239f, 0.990058210f, + -0.143695033f, 0.989622017f, + -0.146730474f, 0.989176510f, + -0.149764535f, 0.988721692f, + -0.152797185f, 0.988257568f, + -0.155828398f, 0.987784142f, + -0.158858143f, 0.987301418f, + -0.161886394f, 0.986809402f, + -0.164913120f, 0.986308097f, + -0.167938295f, 0.985797509f, + -0.170961889f, 0.985277642f, + -0.173983873f, 0.984748502f, + -0.177004220f, 0.984210092f, + -0.180022901f, 0.983662419f, + -0.183039888f, 0.983105487f, + -0.186055152f, 0.982539302f, + -0.189068664f, 0.981963869f, + -0.192080397f, 0.981379193f, + -0.195090322f, 0.980785280f, + -0.198098411f, 0.980182136f, + -0.201104635f, 0.979569766f, + -0.204108966f, 0.978948175f, + -0.207111376f, 0.978317371f, + -0.210111837f, 0.977677358f, + -0.213110320f, 0.977028143f, + -0.216106797f, 0.976369731f, + -0.219101240f, 0.975702130f, + -0.222093621f, 0.975025345f, + -0.225083911f, 0.974339383f, + -0.228072083f, 0.973644250f, + -0.231058108f, 0.972939952f, + -0.234041959f, 0.972226497f, + -0.237023606f, 0.971503891f, + -0.240003022f, 0.970772141f, + -0.242980180f, 0.970031253f, + -0.245955050f, 0.969281235f, + -0.248927606f, 0.968522094f, + -0.251897818f, 0.967753837f, + -0.254865660f, 0.966976471f, + -0.257831102f, 0.966190003f, + -0.260794118f, 0.965394442f, + -0.263754679f, 0.964589793f, + -0.266712757f, 0.963776066f, + -0.269668326f, 0.962953267f, + -0.272621355f, 0.962121404f, + -0.275571819f, 0.961280486f, + -0.278519689f, 0.960430519f, + -0.281464938f, 0.959571513f, + -0.284407537f, 0.958703475f, + -0.287347460f, 0.957826413f, + -0.290284677f, 0.956940336f, + -0.293219163f, 0.956045251f, + -0.296150888f, 0.955141168f, + -0.299079826f, 0.954228095f, + -0.302005949f, 0.953306040f, + -0.304929230f, 0.952375013f, + -0.307849640f, 0.951435021f, + -0.310767153f, 0.950486074f, + -0.313681740f, 0.949528181f, + -0.316593376f, 0.948561350f, + -0.319502031f, 0.947585591f, + -0.322407679f, 0.946600913f, + -0.325310292f, 0.945607325f, + -0.328209844f, 0.944604837f, + -0.331106306f, 0.943593458f, + -0.333999651f, 0.942573198f, + -0.336889853f, 0.941544065f, + -0.339776884f, 0.940506071f, + -0.342660717f, 0.939459224f, + -0.345541325f, 0.938403534f, + -0.348418680f, 0.937339012f, + -0.351292756f, 0.936265667f, + -0.354163525f, 0.935183510f, + -0.357030961f, 0.934092550f, + -0.359895037f, 0.932992799f, + -0.362755724f, 0.931884266f, + -0.365612998f, 0.930766961f, + -0.368466830f, 0.929640896f, + -0.371317194f, 0.928506080f, + -0.374164063f, 0.927362526f, + -0.377007410f, 0.926210242f, + -0.379847209f, 0.925049241f, + -0.382683432f, 0.923879533f, + -0.385516054f, 0.922701128f, + -0.388345047f, 0.921514039f, + -0.391170384f, 0.920318277f, + -0.393992040f, 0.919113852f, + -0.396809987f, 0.917900776f, + -0.399624200f, 0.916679060f, + -0.402434651f, 0.915448716f, + -0.405241314f, 0.914209756f, + -0.408044163f, 0.912962190f, + -0.410843171f, 0.911706032f, + -0.413638312f, 0.910441292f, + -0.416429560f, 0.909167983f, + -0.419216888f, 0.907886116f, + -0.422000271f, 0.906595705f, + -0.424779681f, 0.905296759f, + -0.427555093f, 0.903989293f, + -0.430326481f, 0.902673318f, + -0.433093819f, 0.901348847f, + -0.435857080f, 0.900015892f, + -0.438616239f, 0.898674466f, + -0.441371269f, 0.897324581f, + -0.444122145f, 0.895966250f, + -0.446868840f, 0.894599486f, + -0.449611330f, 0.893224301f, + -0.452349587f, 0.891840709f, + -0.455083587f, 0.890448723f, + -0.457813304f, 0.889048356f, + -0.460538711f, 0.887639620f, + -0.463259784f, 0.886222530f, + -0.465976496f, 0.884797098f, + -0.468688822f, 0.883363339f, + -0.471396737f, 0.881921264f, + -0.474100215f, 0.880470889f, + -0.476799230f, 0.879012226f, + -0.479493758f, 0.877545290f, + -0.482183772f, 0.876070094f, + -0.484869248f, 0.874586652f, + -0.487550160f, 0.873094978f, + -0.490226483f, 0.871595087f, + -0.492898192f, 0.870086991f, + -0.495565262f, 0.868570706f, + -0.498227667f, 0.867046246f, + -0.500885383f, 0.865513624f, + -0.503538384f, 0.863972856f, + -0.506186645f, 0.862423956f, + -0.508830143f, 0.860866939f, + -0.511468850f, 0.859301818f, + -0.514102744f, 0.857728610f, + -0.516731799f, 0.856147328f, + -0.519355990f, 0.854557988f, + -0.521975293f, 0.852960605f, + -0.524589683f, 0.851355193f, + -0.527199135f, 0.849741768f, + -0.529803625f, 0.848120345f, + -0.532403128f, 0.846490939f, + -0.534997620f, 0.844853565f, + -0.537587076f, 0.843208240f, + -0.540171473f, 0.841554977f, + -0.542750785f, 0.839893794f, + -0.545324988f, 0.838224706f, + -0.547894059f, 0.836547727f, + -0.550457973f, 0.834862875f, + -0.553016706f, 0.833170165f, + -0.555570233f, 0.831469612f, + -0.558118531f, 0.829761234f, + -0.560661576f, 0.828045045f, + -0.563199344f, 0.826321063f, + -0.565731811f, 0.824589303f, + -0.568258953f, 0.822849781f, + -0.570780746f, 0.821102515f, + -0.573297167f, 0.819347520f, + -0.575808191f, 0.817584813f, + -0.578313796f, 0.815814411f, + -0.580813958f, 0.814036330f, + -0.583308653f, 0.812250587f, + -0.585797857f, 0.810457198f, + -0.588281548f, 0.808656182f, + -0.590759702f, 0.806847554f, + -0.593232295f, 0.805031331f, + -0.595699304f, 0.803207531f, + -0.598160707f, 0.801376172f, + -0.600616479f, 0.799537269f, + -0.603066599f, 0.797690841f, + -0.605511041f, 0.795836905f, + -0.607949785f, 0.793975478f, + -0.610382806f, 0.792106577f, + -0.612810082f, 0.790230221f, + -0.615231591f, 0.788346428f, + -0.617647308f, 0.786455214f, + -0.620057212f, 0.784556597f, + -0.622461279f, 0.782650596f, + -0.624859488f, 0.780737229f, + -0.627251815f, 0.778816512f, + -0.629638239f, 0.776888466f, + -0.632018736f, 0.774953107f, + -0.634393284f, 0.773010453f, + -0.636761861f, 0.771060524f, + -0.639124445f, 0.769103338f, + -0.641481013f, 0.767138912f, + -0.643831543f, 0.765167266f, + -0.646176013f, 0.763188417f, + -0.648514401f, 0.761202385f, + -0.650846685f, 0.759209189f, + -0.653172843f, 0.757208847f, + -0.655492853f, 0.755201377f, + -0.657806693f, 0.753186799f, + -0.660114342f, 0.751165132f, + -0.662415778f, 0.749136395f, + -0.664710978f, 0.747100606f, + -0.666999922f, 0.745057785f, + -0.669282588f, 0.743007952f, + -0.671558955f, 0.740951125f, + -0.673829000f, 0.738887324f, + -0.676092704f, 0.736816569f, + -0.678350043f, 0.734738878f, + -0.680600998f, 0.732654272f, + -0.682845546f, 0.730562769f, + -0.685083668f, 0.728464390f, + -0.687315341f, 0.726359155f, + -0.689540545f, 0.724247083f, + -0.691759258f, 0.722128194f, + -0.693971461f, 0.720002508f, + -0.696177131f, 0.717870045f, + -0.698376249f, 0.715730825f, + -0.700568794f, 0.713584869f, + -0.702754744f, 0.711432196f, + -0.704934080f, 0.709272826f, + -0.707106781f, 0.707106781f, + -0.709272826f, 0.704934080f, + -0.711432196f, 0.702754744f, + -0.713584869f, 0.700568794f, + -0.715730825f, 0.698376249f, + -0.717870045f, 0.696177131f, + -0.720002508f, 0.693971461f, + -0.722128194f, 0.691759258f, + -0.724247083f, 0.689540545f, + -0.726359155f, 0.687315341f, + -0.728464390f, 0.685083668f, + -0.730562769f, 0.682845546f, + -0.732654272f, 0.680600998f, + -0.734738878f, 0.678350043f, + -0.736816569f, 0.676092704f, + -0.738887324f, 0.673829000f, + -0.740951125f, 0.671558955f, + -0.743007952f, 0.669282588f, + -0.745057785f, 0.666999922f, + -0.747100606f, 0.664710978f, + -0.749136395f, 0.662415778f, + -0.751165132f, 0.660114342f, + -0.753186799f, 0.657806693f, + -0.755201377f, 0.655492853f, + -0.757208847f, 0.653172843f, + -0.759209189f, 0.650846685f, + -0.761202385f, 0.648514401f, + -0.763188417f, 0.646176013f, + -0.765167266f, 0.643831543f, + -0.767138912f, 0.641481013f, + -0.769103338f, 0.639124445f, + -0.771060524f, 0.636761861f, + -0.773010453f, 0.634393284f, + -0.774953107f, 0.632018736f, + -0.776888466f, 0.629638239f, + -0.778816512f, 0.627251815f, + -0.780737229f, 0.624859488f, + -0.782650596f, 0.622461279f, + -0.784556597f, 0.620057212f, + -0.786455214f, 0.617647308f, + -0.788346428f, 0.615231591f, + -0.790230221f, 0.612810082f, + -0.792106577f, 0.610382806f, + -0.793975478f, 0.607949785f, + -0.795836905f, 0.605511041f, + -0.797690841f, 0.603066599f, + -0.799537269f, 0.600616479f, + -0.801376172f, 0.598160707f, + -0.803207531f, 0.595699304f, + -0.805031331f, 0.593232295f, + -0.806847554f, 0.590759702f, + -0.808656182f, 0.588281548f, + -0.810457198f, 0.585797857f, + -0.812250587f, 0.583308653f, + -0.814036330f, 0.580813958f, + -0.815814411f, 0.578313796f, + -0.817584813f, 0.575808191f, + -0.819347520f, 0.573297167f, + -0.821102515f, 0.570780746f, + -0.822849781f, 0.568258953f, + -0.824589303f, 0.565731811f, + -0.826321063f, 0.563199344f, + -0.828045045f, 0.560661576f, + -0.829761234f, 0.558118531f, + -0.831469612f, 0.555570233f, + -0.833170165f, 0.553016706f, + -0.834862875f, 0.550457973f, + -0.836547727f, 0.547894059f, + -0.838224706f, 0.545324988f, + -0.839893794f, 0.542750785f, + -0.841554977f, 0.540171473f, + -0.843208240f, 0.537587076f, + -0.844853565f, 0.534997620f, + -0.846490939f, 0.532403128f, + -0.848120345f, 0.529803625f, + -0.849741768f, 0.527199135f, + -0.851355193f, 0.524589683f, + -0.852960605f, 0.521975293f, + -0.854557988f, 0.519355990f, + -0.856147328f, 0.516731799f, + -0.857728610f, 0.514102744f, + -0.859301818f, 0.511468850f, + -0.860866939f, 0.508830143f, + -0.862423956f, 0.506186645f, + -0.863972856f, 0.503538384f, + -0.865513624f, 0.500885383f, + -0.867046246f, 0.498227667f, + -0.868570706f, 0.495565262f, + -0.870086991f, 0.492898192f, + -0.871595087f, 0.490226483f, + -0.873094978f, 0.487550160f, + -0.874586652f, 0.484869248f, + -0.876070094f, 0.482183772f, + -0.877545290f, 0.479493758f, + -0.879012226f, 0.476799230f, + -0.880470889f, 0.474100215f, + -0.881921264f, 0.471396737f, + -0.883363339f, 0.468688822f, + -0.884797098f, 0.465976496f, + -0.886222530f, 0.463259784f, + -0.887639620f, 0.460538711f, + -0.889048356f, 0.457813304f, + -0.890448723f, 0.455083587f, + -0.891840709f, 0.452349587f, + -0.893224301f, 0.449611330f, + -0.894599486f, 0.446868840f, + -0.895966250f, 0.444122145f, + -0.897324581f, 0.441371269f, + -0.898674466f, 0.438616239f, + -0.900015892f, 0.435857080f, + -0.901348847f, 0.433093819f, + -0.902673318f, 0.430326481f, + -0.903989293f, 0.427555093f, + -0.905296759f, 0.424779681f, + -0.906595705f, 0.422000271f, + -0.907886116f, 0.419216888f, + -0.909167983f, 0.416429560f, + -0.910441292f, 0.413638312f, + -0.911706032f, 0.410843171f, + -0.912962190f, 0.408044163f, + -0.914209756f, 0.405241314f, + -0.915448716f, 0.402434651f, + -0.916679060f, 0.399624200f, + -0.917900776f, 0.396809987f, + -0.919113852f, 0.393992040f, + -0.920318277f, 0.391170384f, + -0.921514039f, 0.388345047f, + -0.922701128f, 0.385516054f, + -0.923879533f, 0.382683432f, + -0.925049241f, 0.379847209f, + -0.926210242f, 0.377007410f, + -0.927362526f, 0.374164063f, + -0.928506080f, 0.371317194f, + -0.929640896f, 0.368466830f, + -0.930766961f, 0.365612998f, + -0.931884266f, 0.362755724f, + -0.932992799f, 0.359895037f, + -0.934092550f, 0.357030961f, + -0.935183510f, 0.354163525f, + -0.936265667f, 0.351292756f, + -0.937339012f, 0.348418680f, + -0.938403534f, 0.345541325f, + -0.939459224f, 0.342660717f, + -0.940506071f, 0.339776884f, + -0.941544065f, 0.336889853f, + -0.942573198f, 0.333999651f, + -0.943593458f, 0.331106306f, + -0.944604837f, 0.328209844f, + -0.945607325f, 0.325310292f, + -0.946600913f, 0.322407679f, + -0.947585591f, 0.319502031f, + -0.948561350f, 0.316593376f, + -0.949528181f, 0.313681740f, + -0.950486074f, 0.310767153f, + -0.951435021f, 0.307849640f, + -0.952375013f, 0.304929230f, + -0.953306040f, 0.302005949f, + -0.954228095f, 0.299079826f, + -0.955141168f, 0.296150888f, + -0.956045251f, 0.293219163f, + -0.956940336f, 0.290284677f, + -0.957826413f, 0.287347460f, + -0.958703475f, 0.284407537f, + -0.959571513f, 0.281464938f, + -0.960430519f, 0.278519689f, + -0.961280486f, 0.275571819f, + -0.962121404f, 0.272621355f, + -0.962953267f, 0.269668326f, + -0.963776066f, 0.266712757f, + -0.964589793f, 0.263754679f, + -0.965394442f, 0.260794118f, + -0.966190003f, 0.257831102f, + -0.966976471f, 0.254865660f, + -0.967753837f, 0.251897818f, + -0.968522094f, 0.248927606f, + -0.969281235f, 0.245955050f, + -0.970031253f, 0.242980180f, + -0.970772141f, 0.240003022f, + -0.971503891f, 0.237023606f, + -0.972226497f, 0.234041959f, + -0.972939952f, 0.231058108f, + -0.973644250f, 0.228072083f, + -0.974339383f, 0.225083911f, + -0.975025345f, 0.222093621f, + -0.975702130f, 0.219101240f, + -0.976369731f, 0.216106797f, + -0.977028143f, 0.213110320f, + -0.977677358f, 0.210111837f, + -0.978317371f, 0.207111376f, + -0.978948175f, 0.204108966f, + -0.979569766f, 0.201104635f, + -0.980182136f, 0.198098411f, + -0.980785280f, 0.195090322f, + -0.981379193f, 0.192080397f, + -0.981963869f, 0.189068664f, + -0.982539302f, 0.186055152f, + -0.983105487f, 0.183039888f, + -0.983662419f, 0.180022901f, + -0.984210092f, 0.177004220f, + -0.984748502f, 0.173983873f, + -0.985277642f, 0.170961889f, + -0.985797509f, 0.167938295f, + -0.986308097f, 0.164913120f, + -0.986809402f, 0.161886394f, + -0.987301418f, 0.158858143f, + -0.987784142f, 0.155828398f, + -0.988257568f, 0.152797185f, + -0.988721692f, 0.149764535f, + -0.989176510f, 0.146730474f, + -0.989622017f, 0.143695033f, + -0.990058210f, 0.140658239f, + -0.990485084f, 0.137620122f, + -0.990902635f, 0.134580709f, + -0.991310860f, 0.131540029f, + -0.991709754f, 0.128498111f, + -0.992099313f, 0.125454983f, + -0.992479535f, 0.122410675f, + -0.992850414f, 0.119365215f, + -0.993211949f, 0.116318631f, + -0.993564136f, 0.113270952f, + -0.993906970f, 0.110222207f, + -0.994240449f, 0.107172425f, + -0.994564571f, 0.104121634f, + -0.994879331f, 0.101069863f, + -0.995184727f, 0.098017140f, + -0.995480755f, 0.094963495f, + -0.995767414f, 0.091908956f, + -0.996044701f, 0.088853553f, + -0.996312612f, 0.085797312f, + -0.996571146f, 0.082740265f, + -0.996820299f, 0.079682438f, + -0.997060070f, 0.076623861f, + -0.997290457f, 0.073564564f, + -0.997511456f, 0.070504573f, + -0.997723067f, 0.067443920f, + -0.997925286f, 0.064382631f, + -0.998118113f, 0.061320736f, + -0.998301545f, 0.058258265f, + -0.998475581f, 0.055195244f, + -0.998640218f, 0.052131705f, + -0.998795456f, 0.049067674f, + -0.998941293f, 0.046003182f, + -0.999077728f, 0.042938257f, + -0.999204759f, 0.039872928f, + -0.999322385f, 0.036807223f, + -0.999430605f, 0.033741172f, + -0.999529418f, 0.030674803f, + -0.999618822f, 0.027608146f, + -0.999698819f, 0.024541229f, + -0.999769405f, 0.021474080f, + -0.999830582f, 0.018406730f, + -0.999882347f, 0.015339206f, + -0.999924702f, 0.012271538f, + -0.999957645f, 0.009203755f, + -0.999981175f, 0.006135885f, + -0.999995294f, 0.003067957f, + -1.000000000f, 0.000000000f, + -0.999995294f, -0.003067957f, + -0.999981175f, -0.006135885f, + -0.999957645f, -0.009203755f, + -0.999924702f, -0.012271538f, + -0.999882347f, -0.015339206f, + -0.999830582f, -0.018406730f, + -0.999769405f, -0.021474080f, + -0.999698819f, -0.024541229f, + -0.999618822f, -0.027608146f, + -0.999529418f, -0.030674803f, + -0.999430605f, -0.033741172f, + -0.999322385f, -0.036807223f, + -0.999204759f, -0.039872928f, + -0.999077728f, -0.042938257f, + -0.998941293f, -0.046003182f, + -0.998795456f, -0.049067674f, + -0.998640218f, -0.052131705f, + -0.998475581f, -0.055195244f, + -0.998301545f, -0.058258265f, + -0.998118113f, -0.061320736f, + -0.997925286f, -0.064382631f, + -0.997723067f, -0.067443920f, + -0.997511456f, -0.070504573f, + -0.997290457f, -0.073564564f, + -0.997060070f, -0.076623861f, + -0.996820299f, -0.079682438f, + -0.996571146f, -0.082740265f, + -0.996312612f, -0.085797312f, + -0.996044701f, -0.088853553f, + -0.995767414f, -0.091908956f, + -0.995480755f, -0.094963495f, + -0.995184727f, -0.098017140f, + -0.994879331f, -0.101069863f, + -0.994564571f, -0.104121634f, + -0.994240449f, -0.107172425f, + -0.993906970f, -0.110222207f, + -0.993564136f, -0.113270952f, + -0.993211949f, -0.116318631f, + -0.992850414f, -0.119365215f, + -0.992479535f, -0.122410675f, + -0.992099313f, -0.125454983f, + -0.991709754f, -0.128498111f, + -0.991310860f, -0.131540029f, + -0.990902635f, -0.134580709f, + -0.990485084f, -0.137620122f, + -0.990058210f, -0.140658239f, + -0.989622017f, -0.143695033f, + -0.989176510f, -0.146730474f, + -0.988721692f, -0.149764535f, + -0.988257568f, -0.152797185f, + -0.987784142f, -0.155828398f, + -0.987301418f, -0.158858143f, + -0.986809402f, -0.161886394f, + -0.986308097f, -0.164913120f, + -0.985797509f, -0.167938295f, + -0.985277642f, -0.170961889f, + -0.984748502f, -0.173983873f, + -0.984210092f, -0.177004220f, + -0.983662419f, -0.180022901f, + -0.983105487f, -0.183039888f, + -0.982539302f, -0.186055152f, + -0.981963869f, -0.189068664f, + -0.981379193f, -0.192080397f, + -0.980785280f, -0.195090322f, + -0.980182136f, -0.198098411f, + -0.979569766f, -0.201104635f, + -0.978948175f, -0.204108966f, + -0.978317371f, -0.207111376f, + -0.977677358f, -0.210111837f, + -0.977028143f, -0.213110320f, + -0.976369731f, -0.216106797f, + -0.975702130f, -0.219101240f, + -0.975025345f, -0.222093621f, + -0.974339383f, -0.225083911f, + -0.973644250f, -0.228072083f, + -0.972939952f, -0.231058108f, + -0.972226497f, -0.234041959f, + -0.971503891f, -0.237023606f, + -0.970772141f, -0.240003022f, + -0.970031253f, -0.242980180f, + -0.969281235f, -0.245955050f, + -0.968522094f, -0.248927606f, + -0.967753837f, -0.251897818f, + -0.966976471f, -0.254865660f, + -0.966190003f, -0.257831102f, + -0.965394442f, -0.260794118f, + -0.964589793f, -0.263754679f, + -0.963776066f, -0.266712757f, + -0.962953267f, -0.269668326f, + -0.962121404f, -0.272621355f, + -0.961280486f, -0.275571819f, + -0.960430519f, -0.278519689f, + -0.959571513f, -0.281464938f, + -0.958703475f, -0.284407537f, + -0.957826413f, -0.287347460f, + -0.956940336f, -0.290284677f, + -0.956045251f, -0.293219163f, + -0.955141168f, -0.296150888f, + -0.954228095f, -0.299079826f, + -0.953306040f, -0.302005949f, + -0.952375013f, -0.304929230f, + -0.951435021f, -0.307849640f, + -0.950486074f, -0.310767153f, + -0.949528181f, -0.313681740f, + -0.948561350f, -0.316593376f, + -0.947585591f, -0.319502031f, + -0.946600913f, -0.322407679f, + -0.945607325f, -0.325310292f, + -0.944604837f, -0.328209844f, + -0.943593458f, -0.331106306f, + -0.942573198f, -0.333999651f, + -0.941544065f, -0.336889853f, + -0.940506071f, -0.339776884f, + -0.939459224f, -0.342660717f, + -0.938403534f, -0.345541325f, + -0.937339012f, -0.348418680f, + -0.936265667f, -0.351292756f, + -0.935183510f, -0.354163525f, + -0.934092550f, -0.357030961f, + -0.932992799f, -0.359895037f, + -0.931884266f, -0.362755724f, + -0.930766961f, -0.365612998f, + -0.929640896f, -0.368466830f, + -0.928506080f, -0.371317194f, + -0.927362526f, -0.374164063f, + -0.926210242f, -0.377007410f, + -0.925049241f, -0.379847209f, + -0.923879533f, -0.382683432f, + -0.922701128f, -0.385516054f, + -0.921514039f, -0.388345047f, + -0.920318277f, -0.391170384f, + -0.919113852f, -0.393992040f, + -0.917900776f, -0.396809987f, + -0.916679060f, -0.399624200f, + -0.915448716f, -0.402434651f, + -0.914209756f, -0.405241314f, + -0.912962190f, -0.408044163f, + -0.911706032f, -0.410843171f, + -0.910441292f, -0.413638312f, + -0.909167983f, -0.416429560f, + -0.907886116f, -0.419216888f, + -0.906595705f, -0.422000271f, + -0.905296759f, -0.424779681f, + -0.903989293f, -0.427555093f, + -0.902673318f, -0.430326481f, + -0.901348847f, -0.433093819f, + -0.900015892f, -0.435857080f, + -0.898674466f, -0.438616239f, + -0.897324581f, -0.441371269f, + -0.895966250f, -0.444122145f, + -0.894599486f, -0.446868840f, + -0.893224301f, -0.449611330f, + -0.891840709f, -0.452349587f, + -0.890448723f, -0.455083587f, + -0.889048356f, -0.457813304f, + -0.887639620f, -0.460538711f, + -0.886222530f, -0.463259784f, + -0.884797098f, -0.465976496f, + -0.883363339f, -0.468688822f, + -0.881921264f, -0.471396737f, + -0.880470889f, -0.474100215f, + -0.879012226f, -0.476799230f, + -0.877545290f, -0.479493758f, + -0.876070094f, -0.482183772f, + -0.874586652f, -0.484869248f, + -0.873094978f, -0.487550160f, + -0.871595087f, -0.490226483f, + -0.870086991f, -0.492898192f, + -0.868570706f, -0.495565262f, + -0.867046246f, -0.498227667f, + -0.865513624f, -0.500885383f, + -0.863972856f, -0.503538384f, + -0.862423956f, -0.506186645f, + -0.860866939f, -0.508830143f, + -0.859301818f, -0.511468850f, + -0.857728610f, -0.514102744f, + -0.856147328f, -0.516731799f, + -0.854557988f, -0.519355990f, + -0.852960605f, -0.521975293f, + -0.851355193f, -0.524589683f, + -0.849741768f, -0.527199135f, + -0.848120345f, -0.529803625f, + -0.846490939f, -0.532403128f, + -0.844853565f, -0.534997620f, + -0.843208240f, -0.537587076f, + -0.841554977f, -0.540171473f, + -0.839893794f, -0.542750785f, + -0.838224706f, -0.545324988f, + -0.836547727f, -0.547894059f, + -0.834862875f, -0.550457973f, + -0.833170165f, -0.553016706f, + -0.831469612f, -0.555570233f, + -0.829761234f, -0.558118531f, + -0.828045045f, -0.560661576f, + -0.826321063f, -0.563199344f, + -0.824589303f, -0.565731811f, + -0.822849781f, -0.568258953f, + -0.821102515f, -0.570780746f, + -0.819347520f, -0.573297167f, + -0.817584813f, -0.575808191f, + -0.815814411f, -0.578313796f, + -0.814036330f, -0.580813958f, + -0.812250587f, -0.583308653f, + -0.810457198f, -0.585797857f, + -0.808656182f, -0.588281548f, + -0.806847554f, -0.590759702f, + -0.805031331f, -0.593232295f, + -0.803207531f, -0.595699304f, + -0.801376172f, -0.598160707f, + -0.799537269f, -0.600616479f, + -0.797690841f, -0.603066599f, + -0.795836905f, -0.605511041f, + -0.793975478f, -0.607949785f, + -0.792106577f, -0.610382806f, + -0.790230221f, -0.612810082f, + -0.788346428f, -0.615231591f, + -0.786455214f, -0.617647308f, + -0.784556597f, -0.620057212f, + -0.782650596f, -0.622461279f, + -0.780737229f, -0.624859488f, + -0.778816512f, -0.627251815f, + -0.776888466f, -0.629638239f, + -0.774953107f, -0.632018736f, + -0.773010453f, -0.634393284f, + -0.771060524f, -0.636761861f, + -0.769103338f, -0.639124445f, + -0.767138912f, -0.641481013f, + -0.765167266f, -0.643831543f, + -0.763188417f, -0.646176013f, + -0.761202385f, -0.648514401f, + -0.759209189f, -0.650846685f, + -0.757208847f, -0.653172843f, + -0.755201377f, -0.655492853f, + -0.753186799f, -0.657806693f, + -0.751165132f, -0.660114342f, + -0.749136395f, -0.662415778f, + -0.747100606f, -0.664710978f, + -0.745057785f, -0.666999922f, + -0.743007952f, -0.669282588f, + -0.740951125f, -0.671558955f, + -0.738887324f, -0.673829000f, + -0.736816569f, -0.676092704f, + -0.734738878f, -0.678350043f, + -0.732654272f, -0.680600998f, + -0.730562769f, -0.682845546f, + -0.728464390f, -0.685083668f, + -0.726359155f, -0.687315341f, + -0.724247083f, -0.689540545f, + -0.722128194f, -0.691759258f, + -0.720002508f, -0.693971461f, + -0.717870045f, -0.696177131f, + -0.715730825f, -0.698376249f, + -0.713584869f, -0.700568794f, + -0.711432196f, -0.702754744f, + -0.709272826f, -0.704934080f, + -0.707106781f, -0.707106781f, + -0.704934080f, -0.709272826f, + -0.702754744f, -0.711432196f, + -0.700568794f, -0.713584869f, + -0.698376249f, -0.715730825f, + -0.696177131f, -0.717870045f, + -0.693971461f, -0.720002508f, + -0.691759258f, -0.722128194f, + -0.689540545f, -0.724247083f, + -0.687315341f, -0.726359155f, + -0.685083668f, -0.728464390f, + -0.682845546f, -0.730562769f, + -0.680600998f, -0.732654272f, + -0.678350043f, -0.734738878f, + -0.676092704f, -0.736816569f, + -0.673829000f, -0.738887324f, + -0.671558955f, -0.740951125f, + -0.669282588f, -0.743007952f, + -0.666999922f, -0.745057785f, + -0.664710978f, -0.747100606f, + -0.662415778f, -0.749136395f, + -0.660114342f, -0.751165132f, + -0.657806693f, -0.753186799f, + -0.655492853f, -0.755201377f, + -0.653172843f, -0.757208847f, + -0.650846685f, -0.759209189f, + -0.648514401f, -0.761202385f, + -0.646176013f, -0.763188417f, + -0.643831543f, -0.765167266f, + -0.641481013f, -0.767138912f, + -0.639124445f, -0.769103338f, + -0.636761861f, -0.771060524f, + -0.634393284f, -0.773010453f, + -0.632018736f, -0.774953107f, + -0.629638239f, -0.776888466f, + -0.627251815f, -0.778816512f, + -0.624859488f, -0.780737229f, + -0.622461279f, -0.782650596f, + -0.620057212f, -0.784556597f, + -0.617647308f, -0.786455214f, + -0.615231591f, -0.788346428f, + -0.612810082f, -0.790230221f, + -0.610382806f, -0.792106577f, + -0.607949785f, -0.793975478f, + -0.605511041f, -0.795836905f, + -0.603066599f, -0.797690841f, + -0.600616479f, -0.799537269f, + -0.598160707f, -0.801376172f, + -0.595699304f, -0.803207531f, + -0.593232295f, -0.805031331f, + -0.590759702f, -0.806847554f, + -0.588281548f, -0.808656182f, + -0.585797857f, -0.810457198f, + -0.583308653f, -0.812250587f, + -0.580813958f, -0.814036330f, + -0.578313796f, -0.815814411f, + -0.575808191f, -0.817584813f, + -0.573297167f, -0.819347520f, + -0.570780746f, -0.821102515f, + -0.568258953f, -0.822849781f, + -0.565731811f, -0.824589303f, + -0.563199344f, -0.826321063f, + -0.560661576f, -0.828045045f, + -0.558118531f, -0.829761234f, + -0.555570233f, -0.831469612f, + -0.553016706f, -0.833170165f, + -0.550457973f, -0.834862875f, + -0.547894059f, -0.836547727f, + -0.545324988f, -0.838224706f, + -0.542750785f, -0.839893794f, + -0.540171473f, -0.841554977f, + -0.537587076f, -0.843208240f, + -0.534997620f, -0.844853565f, + -0.532403128f, -0.846490939f, + -0.529803625f, -0.848120345f, + -0.527199135f, -0.849741768f, + -0.524589683f, -0.851355193f, + -0.521975293f, -0.852960605f, + -0.519355990f, -0.854557988f, + -0.516731799f, -0.856147328f, + -0.514102744f, -0.857728610f, + -0.511468850f, -0.859301818f, + -0.508830143f, -0.860866939f, + -0.506186645f, -0.862423956f, + -0.503538384f, -0.863972856f, + -0.500885383f, -0.865513624f, + -0.498227667f, -0.867046246f, + -0.495565262f, -0.868570706f, + -0.492898192f, -0.870086991f, + -0.490226483f, -0.871595087f, + -0.487550160f, -0.873094978f, + -0.484869248f, -0.874586652f, + -0.482183772f, -0.876070094f, + -0.479493758f, -0.877545290f, + -0.476799230f, -0.879012226f, + -0.474100215f, -0.880470889f, + -0.471396737f, -0.881921264f, + -0.468688822f, -0.883363339f, + -0.465976496f, -0.884797098f, + -0.463259784f, -0.886222530f, + -0.460538711f, -0.887639620f, + -0.457813304f, -0.889048356f, + -0.455083587f, -0.890448723f, + -0.452349587f, -0.891840709f, + -0.449611330f, -0.893224301f, + -0.446868840f, -0.894599486f, + -0.444122145f, -0.895966250f, + -0.441371269f, -0.897324581f, + -0.438616239f, -0.898674466f, + -0.435857080f, -0.900015892f, + -0.433093819f, -0.901348847f, + -0.430326481f, -0.902673318f, + -0.427555093f, -0.903989293f, + -0.424779681f, -0.905296759f, + -0.422000271f, -0.906595705f, + -0.419216888f, -0.907886116f, + -0.416429560f, -0.909167983f, + -0.413638312f, -0.910441292f, + -0.410843171f, -0.911706032f, + -0.408044163f, -0.912962190f, + -0.405241314f, -0.914209756f, + -0.402434651f, -0.915448716f, + -0.399624200f, -0.916679060f, + -0.396809987f, -0.917900776f, + -0.393992040f, -0.919113852f, + -0.391170384f, -0.920318277f, + -0.388345047f, -0.921514039f, + -0.385516054f, -0.922701128f, + -0.382683432f, -0.923879533f, + -0.379847209f, -0.925049241f, + -0.377007410f, -0.926210242f, + -0.374164063f, -0.927362526f, + -0.371317194f, -0.928506080f, + -0.368466830f, -0.929640896f, + -0.365612998f, -0.930766961f, + -0.362755724f, -0.931884266f, + -0.359895037f, -0.932992799f, + -0.357030961f, -0.934092550f, + -0.354163525f, -0.935183510f, + -0.351292756f, -0.936265667f, + -0.348418680f, -0.937339012f, + -0.345541325f, -0.938403534f, + -0.342660717f, -0.939459224f, + -0.339776884f, -0.940506071f, + -0.336889853f, -0.941544065f, + -0.333999651f, -0.942573198f, + -0.331106306f, -0.943593458f, + -0.328209844f, -0.944604837f, + -0.325310292f, -0.945607325f, + -0.322407679f, -0.946600913f, + -0.319502031f, -0.947585591f, + -0.316593376f, -0.948561350f, + -0.313681740f, -0.949528181f, + -0.310767153f, -0.950486074f, + -0.307849640f, -0.951435021f, + -0.304929230f, -0.952375013f, + -0.302005949f, -0.953306040f, + -0.299079826f, -0.954228095f, + -0.296150888f, -0.955141168f, + -0.293219163f, -0.956045251f, + -0.290284677f, -0.956940336f, + -0.287347460f, -0.957826413f, + -0.284407537f, -0.958703475f, + -0.281464938f, -0.959571513f, + -0.278519689f, -0.960430519f, + -0.275571819f, -0.961280486f, + -0.272621355f, -0.962121404f, + -0.269668326f, -0.962953267f, + -0.266712757f, -0.963776066f, + -0.263754679f, -0.964589793f, + -0.260794118f, -0.965394442f, + -0.257831102f, -0.966190003f, + -0.254865660f, -0.966976471f, + -0.251897818f, -0.967753837f, + -0.248927606f, -0.968522094f, + -0.245955050f, -0.969281235f, + -0.242980180f, -0.970031253f, + -0.240003022f, -0.970772141f, + -0.237023606f, -0.971503891f, + -0.234041959f, -0.972226497f, + -0.231058108f, -0.972939952f, + -0.228072083f, -0.973644250f, + -0.225083911f, -0.974339383f, + -0.222093621f, -0.975025345f, + -0.219101240f, -0.975702130f, + -0.216106797f, -0.976369731f, + -0.213110320f, -0.977028143f, + -0.210111837f, -0.977677358f, + -0.207111376f, -0.978317371f, + -0.204108966f, -0.978948175f, + -0.201104635f, -0.979569766f, + -0.198098411f, -0.980182136f, + -0.195090322f, -0.980785280f, + -0.192080397f, -0.981379193f, + -0.189068664f, -0.981963869f, + -0.186055152f, -0.982539302f, + -0.183039888f, -0.983105487f, + -0.180022901f, -0.983662419f, + -0.177004220f, -0.984210092f, + -0.173983873f, -0.984748502f, + -0.170961889f, -0.985277642f, + -0.167938295f, -0.985797509f, + -0.164913120f, -0.986308097f, + -0.161886394f, -0.986809402f, + -0.158858143f, -0.987301418f, + -0.155828398f, -0.987784142f, + -0.152797185f, -0.988257568f, + -0.149764535f, -0.988721692f, + -0.146730474f, -0.989176510f, + -0.143695033f, -0.989622017f, + -0.140658239f, -0.990058210f, + -0.137620122f, -0.990485084f, + -0.134580709f, -0.990902635f, + -0.131540029f, -0.991310860f, + -0.128498111f, -0.991709754f, + -0.125454983f, -0.992099313f, + -0.122410675f, -0.992479535f, + -0.119365215f, -0.992850414f, + -0.116318631f, -0.993211949f, + -0.113270952f, -0.993564136f, + -0.110222207f, -0.993906970f, + -0.107172425f, -0.994240449f, + -0.104121634f, -0.994564571f, + -0.101069863f, -0.994879331f, + -0.098017140f, -0.995184727f, + -0.094963495f, -0.995480755f, + -0.091908956f, -0.995767414f, + -0.088853553f, -0.996044701f, + -0.085797312f, -0.996312612f, + -0.082740265f, -0.996571146f, + -0.079682438f, -0.996820299f, + -0.076623861f, -0.997060070f, + -0.073564564f, -0.997290457f, + -0.070504573f, -0.997511456f, + -0.067443920f, -0.997723067f, + -0.064382631f, -0.997925286f, + -0.061320736f, -0.998118113f, + -0.058258265f, -0.998301545f, + -0.055195244f, -0.998475581f, + -0.052131705f, -0.998640218f, + -0.049067674f, -0.998795456f, + -0.046003182f, -0.998941293f, + -0.042938257f, -0.999077728f, + -0.039872928f, -0.999204759f, + -0.036807223f, -0.999322385f, + -0.033741172f, -0.999430605f, + -0.030674803f, -0.999529418f, + -0.027608146f, -0.999618822f, + -0.024541229f, -0.999698819f, + -0.021474080f, -0.999769405f, + -0.018406730f, -0.999830582f, + -0.015339206f, -0.999882347f, + -0.012271538f, -0.999924702f, + -0.009203755f, -0.999957645f, + -0.006135885f, -0.999981175f, + -0.003067957f, -0.999995294f, + -0.000000000f, -1.000000000f, + 0.003067957f, -0.999995294f, + 0.006135885f, -0.999981175f, + 0.009203755f, -0.999957645f, + 0.012271538f, -0.999924702f, + 0.015339206f, -0.999882347f, + 0.018406730f, -0.999830582f, + 0.021474080f, -0.999769405f, + 0.024541229f, -0.999698819f, + 0.027608146f, -0.999618822f, + 0.030674803f, -0.999529418f, + 0.033741172f, -0.999430605f, + 0.036807223f, -0.999322385f, + 0.039872928f, -0.999204759f, + 0.042938257f, -0.999077728f, + 0.046003182f, -0.998941293f, + 0.049067674f, -0.998795456f, + 0.052131705f, -0.998640218f, + 0.055195244f, -0.998475581f, + 0.058258265f, -0.998301545f, + 0.061320736f, -0.998118113f, + 0.064382631f, -0.997925286f, + 0.067443920f, -0.997723067f, + 0.070504573f, -0.997511456f, + 0.073564564f, -0.997290457f, + 0.076623861f, -0.997060070f, + 0.079682438f, -0.996820299f, + 0.082740265f, -0.996571146f, + 0.085797312f, -0.996312612f, + 0.088853553f, -0.996044701f, + 0.091908956f, -0.995767414f, + 0.094963495f, -0.995480755f, + 0.098017140f, -0.995184727f, + 0.101069863f, -0.994879331f, + 0.104121634f, -0.994564571f, + 0.107172425f, -0.994240449f, + 0.110222207f, -0.993906970f, + 0.113270952f, -0.993564136f, + 0.116318631f, -0.993211949f, + 0.119365215f, -0.992850414f, + 0.122410675f, -0.992479535f, + 0.125454983f, -0.992099313f, + 0.128498111f, -0.991709754f, + 0.131540029f, -0.991310860f, + 0.134580709f, -0.990902635f, + 0.137620122f, -0.990485084f, + 0.140658239f, -0.990058210f, + 0.143695033f, -0.989622017f, + 0.146730474f, -0.989176510f, + 0.149764535f, -0.988721692f, + 0.152797185f, -0.988257568f, + 0.155828398f, -0.987784142f, + 0.158858143f, -0.987301418f, + 0.161886394f, -0.986809402f, + 0.164913120f, -0.986308097f, + 0.167938295f, -0.985797509f, + 0.170961889f, -0.985277642f, + 0.173983873f, -0.984748502f, + 0.177004220f, -0.984210092f, + 0.180022901f, -0.983662419f, + 0.183039888f, -0.983105487f, + 0.186055152f, -0.982539302f, + 0.189068664f, -0.981963869f, + 0.192080397f, -0.981379193f, + 0.195090322f, -0.980785280f, + 0.198098411f, -0.980182136f, + 0.201104635f, -0.979569766f, + 0.204108966f, -0.978948175f, + 0.207111376f, -0.978317371f, + 0.210111837f, -0.977677358f, + 0.213110320f, -0.977028143f, + 0.216106797f, -0.976369731f, + 0.219101240f, -0.975702130f, + 0.222093621f, -0.975025345f, + 0.225083911f, -0.974339383f, + 0.228072083f, -0.973644250f, + 0.231058108f, -0.972939952f, + 0.234041959f, -0.972226497f, + 0.237023606f, -0.971503891f, + 0.240003022f, -0.970772141f, + 0.242980180f, -0.970031253f, + 0.245955050f, -0.969281235f, + 0.248927606f, -0.968522094f, + 0.251897818f, -0.967753837f, + 0.254865660f, -0.966976471f, + 0.257831102f, -0.966190003f, + 0.260794118f, -0.965394442f, + 0.263754679f, -0.964589793f, + 0.266712757f, -0.963776066f, + 0.269668326f, -0.962953267f, + 0.272621355f, -0.962121404f, + 0.275571819f, -0.961280486f, + 0.278519689f, -0.960430519f, + 0.281464938f, -0.959571513f, + 0.284407537f, -0.958703475f, + 0.287347460f, -0.957826413f, + 0.290284677f, -0.956940336f, + 0.293219163f, -0.956045251f, + 0.296150888f, -0.955141168f, + 0.299079826f, -0.954228095f, + 0.302005949f, -0.953306040f, + 0.304929230f, -0.952375013f, + 0.307849640f, -0.951435021f, + 0.310767153f, -0.950486074f, + 0.313681740f, -0.949528181f, + 0.316593376f, -0.948561350f, + 0.319502031f, -0.947585591f, + 0.322407679f, -0.946600913f, + 0.325310292f, -0.945607325f, + 0.328209844f, -0.944604837f, + 0.331106306f, -0.943593458f, + 0.333999651f, -0.942573198f, + 0.336889853f, -0.941544065f, + 0.339776884f, -0.940506071f, + 0.342660717f, -0.939459224f, + 0.345541325f, -0.938403534f, + 0.348418680f, -0.937339012f, + 0.351292756f, -0.936265667f, + 0.354163525f, -0.935183510f, + 0.357030961f, -0.934092550f, + 0.359895037f, -0.932992799f, + 0.362755724f, -0.931884266f, + 0.365612998f, -0.930766961f, + 0.368466830f, -0.929640896f, + 0.371317194f, -0.928506080f, + 0.374164063f, -0.927362526f, + 0.377007410f, -0.926210242f, + 0.379847209f, -0.925049241f, + 0.382683432f, -0.923879533f, + 0.385516054f, -0.922701128f, + 0.388345047f, -0.921514039f, + 0.391170384f, -0.920318277f, + 0.393992040f, -0.919113852f, + 0.396809987f, -0.917900776f, + 0.399624200f, -0.916679060f, + 0.402434651f, -0.915448716f, + 0.405241314f, -0.914209756f, + 0.408044163f, -0.912962190f, + 0.410843171f, -0.911706032f, + 0.413638312f, -0.910441292f, + 0.416429560f, -0.909167983f, + 0.419216888f, -0.907886116f, + 0.422000271f, -0.906595705f, + 0.424779681f, -0.905296759f, + 0.427555093f, -0.903989293f, + 0.430326481f, -0.902673318f, + 0.433093819f, -0.901348847f, + 0.435857080f, -0.900015892f, + 0.438616239f, -0.898674466f, + 0.441371269f, -0.897324581f, + 0.444122145f, -0.895966250f, + 0.446868840f, -0.894599486f, + 0.449611330f, -0.893224301f, + 0.452349587f, -0.891840709f, + 0.455083587f, -0.890448723f, + 0.457813304f, -0.889048356f, + 0.460538711f, -0.887639620f, + 0.463259784f, -0.886222530f, + 0.465976496f, -0.884797098f, + 0.468688822f, -0.883363339f, + 0.471396737f, -0.881921264f, + 0.474100215f, -0.880470889f, + 0.476799230f, -0.879012226f, + 0.479493758f, -0.877545290f, + 0.482183772f, -0.876070094f, + 0.484869248f, -0.874586652f, + 0.487550160f, -0.873094978f, + 0.490226483f, -0.871595087f, + 0.492898192f, -0.870086991f, + 0.495565262f, -0.868570706f, + 0.498227667f, -0.867046246f, + 0.500885383f, -0.865513624f, + 0.503538384f, -0.863972856f, + 0.506186645f, -0.862423956f, + 0.508830143f, -0.860866939f, + 0.511468850f, -0.859301818f, + 0.514102744f, -0.857728610f, + 0.516731799f, -0.856147328f, + 0.519355990f, -0.854557988f, + 0.521975293f, -0.852960605f, + 0.524589683f, -0.851355193f, + 0.527199135f, -0.849741768f, + 0.529803625f, -0.848120345f, + 0.532403128f, -0.846490939f, + 0.534997620f, -0.844853565f, + 0.537587076f, -0.843208240f, + 0.540171473f, -0.841554977f, + 0.542750785f, -0.839893794f, + 0.545324988f, -0.838224706f, + 0.547894059f, -0.836547727f, + 0.550457973f, -0.834862875f, + 0.553016706f, -0.833170165f, + 0.555570233f, -0.831469612f, + 0.558118531f, -0.829761234f, + 0.560661576f, -0.828045045f, + 0.563199344f, -0.826321063f, + 0.565731811f, -0.824589303f, + 0.568258953f, -0.822849781f, + 0.570780746f, -0.821102515f, + 0.573297167f, -0.819347520f, + 0.575808191f, -0.817584813f, + 0.578313796f, -0.815814411f, + 0.580813958f, -0.814036330f, + 0.583308653f, -0.812250587f, + 0.585797857f, -0.810457198f, + 0.588281548f, -0.808656182f, + 0.590759702f, -0.806847554f, + 0.593232295f, -0.805031331f, + 0.595699304f, -0.803207531f, + 0.598160707f, -0.801376172f, + 0.600616479f, -0.799537269f, + 0.603066599f, -0.797690841f, + 0.605511041f, -0.795836905f, + 0.607949785f, -0.793975478f, + 0.610382806f, -0.792106577f, + 0.612810082f, -0.790230221f, + 0.615231591f, -0.788346428f, + 0.617647308f, -0.786455214f, + 0.620057212f, -0.784556597f, + 0.622461279f, -0.782650596f, + 0.624859488f, -0.780737229f, + 0.627251815f, -0.778816512f, + 0.629638239f, -0.776888466f, + 0.632018736f, -0.774953107f, + 0.634393284f, -0.773010453f, + 0.636761861f, -0.771060524f, + 0.639124445f, -0.769103338f, + 0.641481013f, -0.767138912f, + 0.643831543f, -0.765167266f, + 0.646176013f, -0.763188417f, + 0.648514401f, -0.761202385f, + 0.650846685f, -0.759209189f, + 0.653172843f, -0.757208847f, + 0.655492853f, -0.755201377f, + 0.657806693f, -0.753186799f, + 0.660114342f, -0.751165132f, + 0.662415778f, -0.749136395f, + 0.664710978f, -0.747100606f, + 0.666999922f, -0.745057785f, + 0.669282588f, -0.743007952f, + 0.671558955f, -0.740951125f, + 0.673829000f, -0.738887324f, + 0.676092704f, -0.736816569f, + 0.678350043f, -0.734738878f, + 0.680600998f, -0.732654272f, + 0.682845546f, -0.730562769f, + 0.685083668f, -0.728464390f, + 0.687315341f, -0.726359155f, + 0.689540545f, -0.724247083f, + 0.691759258f, -0.722128194f, + 0.693971461f, -0.720002508f, + 0.696177131f, -0.717870045f, + 0.698376249f, -0.715730825f, + 0.700568794f, -0.713584869f, + 0.702754744f, -0.711432196f, + 0.704934080f, -0.709272826f, + 0.707106781f, -0.707106781f, + 0.709272826f, -0.704934080f, + 0.711432196f, -0.702754744f, + 0.713584869f, -0.700568794f, + 0.715730825f, -0.698376249f, + 0.717870045f, -0.696177131f, + 0.720002508f, -0.693971461f, + 0.722128194f, -0.691759258f, + 0.724247083f, -0.689540545f, + 0.726359155f, -0.687315341f, + 0.728464390f, -0.685083668f, + 0.730562769f, -0.682845546f, + 0.732654272f, -0.680600998f, + 0.734738878f, -0.678350043f, + 0.736816569f, -0.676092704f, + 0.738887324f, -0.673829000f, + 0.740951125f, -0.671558955f, + 0.743007952f, -0.669282588f, + 0.745057785f, -0.666999922f, + 0.747100606f, -0.664710978f, + 0.749136395f, -0.662415778f, + 0.751165132f, -0.660114342f, + 0.753186799f, -0.657806693f, + 0.755201377f, -0.655492853f, + 0.757208847f, -0.653172843f, + 0.759209189f, -0.650846685f, + 0.761202385f, -0.648514401f, + 0.763188417f, -0.646176013f, + 0.765167266f, -0.643831543f, + 0.767138912f, -0.641481013f, + 0.769103338f, -0.639124445f, + 0.771060524f, -0.636761861f, + 0.773010453f, -0.634393284f, + 0.774953107f, -0.632018736f, + 0.776888466f, -0.629638239f, + 0.778816512f, -0.627251815f, + 0.780737229f, -0.624859488f, + 0.782650596f, -0.622461279f, + 0.784556597f, -0.620057212f, + 0.786455214f, -0.617647308f, + 0.788346428f, -0.615231591f, + 0.790230221f, -0.612810082f, + 0.792106577f, -0.610382806f, + 0.793975478f, -0.607949785f, + 0.795836905f, -0.605511041f, + 0.797690841f, -0.603066599f, + 0.799537269f, -0.600616479f, + 0.801376172f, -0.598160707f, + 0.803207531f, -0.595699304f, + 0.805031331f, -0.593232295f, + 0.806847554f, -0.590759702f, + 0.808656182f, -0.588281548f, + 0.810457198f, -0.585797857f, + 0.812250587f, -0.583308653f, + 0.814036330f, -0.580813958f, + 0.815814411f, -0.578313796f, + 0.817584813f, -0.575808191f, + 0.819347520f, -0.573297167f, + 0.821102515f, -0.570780746f, + 0.822849781f, -0.568258953f, + 0.824589303f, -0.565731811f, + 0.826321063f, -0.563199344f, + 0.828045045f, -0.560661576f, + 0.829761234f, -0.558118531f, + 0.831469612f, -0.555570233f, + 0.833170165f, -0.553016706f, + 0.834862875f, -0.550457973f, + 0.836547727f, -0.547894059f, + 0.838224706f, -0.545324988f, + 0.839893794f, -0.542750785f, + 0.841554977f, -0.540171473f, + 0.843208240f, -0.537587076f, + 0.844853565f, -0.534997620f, + 0.846490939f, -0.532403128f, + 0.848120345f, -0.529803625f, + 0.849741768f, -0.527199135f, + 0.851355193f, -0.524589683f, + 0.852960605f, -0.521975293f, + 0.854557988f, -0.519355990f, + 0.856147328f, -0.516731799f, + 0.857728610f, -0.514102744f, + 0.859301818f, -0.511468850f, + 0.860866939f, -0.508830143f, + 0.862423956f, -0.506186645f, + 0.863972856f, -0.503538384f, + 0.865513624f, -0.500885383f, + 0.867046246f, -0.498227667f, + 0.868570706f, -0.495565262f, + 0.870086991f, -0.492898192f, + 0.871595087f, -0.490226483f, + 0.873094978f, -0.487550160f, + 0.874586652f, -0.484869248f, + 0.876070094f, -0.482183772f, + 0.877545290f, -0.479493758f, + 0.879012226f, -0.476799230f, + 0.880470889f, -0.474100215f, + 0.881921264f, -0.471396737f, + 0.883363339f, -0.468688822f, + 0.884797098f, -0.465976496f, + 0.886222530f, -0.463259784f, + 0.887639620f, -0.460538711f, + 0.889048356f, -0.457813304f, + 0.890448723f, -0.455083587f, + 0.891840709f, -0.452349587f, + 0.893224301f, -0.449611330f, + 0.894599486f, -0.446868840f, + 0.895966250f, -0.444122145f, + 0.897324581f, -0.441371269f, + 0.898674466f, -0.438616239f, + 0.900015892f, -0.435857080f, + 0.901348847f, -0.433093819f, + 0.902673318f, -0.430326481f, + 0.903989293f, -0.427555093f, + 0.905296759f, -0.424779681f, + 0.906595705f, -0.422000271f, + 0.907886116f, -0.419216888f, + 0.909167983f, -0.416429560f, + 0.910441292f, -0.413638312f, + 0.911706032f, -0.410843171f, + 0.912962190f, -0.408044163f, + 0.914209756f, -0.405241314f, + 0.915448716f, -0.402434651f, + 0.916679060f, -0.399624200f, + 0.917900776f, -0.396809987f, + 0.919113852f, -0.393992040f, + 0.920318277f, -0.391170384f, + 0.921514039f, -0.388345047f, + 0.922701128f, -0.385516054f, + 0.923879533f, -0.382683432f, + 0.925049241f, -0.379847209f, + 0.926210242f, -0.377007410f, + 0.927362526f, -0.374164063f, + 0.928506080f, -0.371317194f, + 0.929640896f, -0.368466830f, + 0.930766961f, -0.365612998f, + 0.931884266f, -0.362755724f, + 0.932992799f, -0.359895037f, + 0.934092550f, -0.357030961f, + 0.935183510f, -0.354163525f, + 0.936265667f, -0.351292756f, + 0.937339012f, -0.348418680f, + 0.938403534f, -0.345541325f, + 0.939459224f, -0.342660717f, + 0.940506071f, -0.339776884f, + 0.941544065f, -0.336889853f, + 0.942573198f, -0.333999651f, + 0.943593458f, -0.331106306f, + 0.944604837f, -0.328209844f, + 0.945607325f, -0.325310292f, + 0.946600913f, -0.322407679f, + 0.947585591f, -0.319502031f, + 0.948561350f, -0.316593376f, + 0.949528181f, -0.313681740f, + 0.950486074f, -0.310767153f, + 0.951435021f, -0.307849640f, + 0.952375013f, -0.304929230f, + 0.953306040f, -0.302005949f, + 0.954228095f, -0.299079826f, + 0.955141168f, -0.296150888f, + 0.956045251f, -0.293219163f, + 0.956940336f, -0.290284677f, + 0.957826413f, -0.287347460f, + 0.958703475f, -0.284407537f, + 0.959571513f, -0.281464938f, + 0.960430519f, -0.278519689f, + 0.961280486f, -0.275571819f, + 0.962121404f, -0.272621355f, + 0.962953267f, -0.269668326f, + 0.963776066f, -0.266712757f, + 0.964589793f, -0.263754679f, + 0.965394442f, -0.260794118f, + 0.966190003f, -0.257831102f, + 0.966976471f, -0.254865660f, + 0.967753837f, -0.251897818f, + 0.968522094f, -0.248927606f, + 0.969281235f, -0.245955050f, + 0.970031253f, -0.242980180f, + 0.970772141f, -0.240003022f, + 0.971503891f, -0.237023606f, + 0.972226497f, -0.234041959f, + 0.972939952f, -0.231058108f, + 0.973644250f, -0.228072083f, + 0.974339383f, -0.225083911f, + 0.975025345f, -0.222093621f, + 0.975702130f, -0.219101240f, + 0.976369731f, -0.216106797f, + 0.977028143f, -0.213110320f, + 0.977677358f, -0.210111837f, + 0.978317371f, -0.207111376f, + 0.978948175f, -0.204108966f, + 0.979569766f, -0.201104635f, + 0.980182136f, -0.198098411f, + 0.980785280f, -0.195090322f, + 0.981379193f, -0.192080397f, + 0.981963869f, -0.189068664f, + 0.982539302f, -0.186055152f, + 0.983105487f, -0.183039888f, + 0.983662419f, -0.180022901f, + 0.984210092f, -0.177004220f, + 0.984748502f, -0.173983873f, + 0.985277642f, -0.170961889f, + 0.985797509f, -0.167938295f, + 0.986308097f, -0.164913120f, + 0.986809402f, -0.161886394f, + 0.987301418f, -0.158858143f, + 0.987784142f, -0.155828398f, + 0.988257568f, -0.152797185f, + 0.988721692f, -0.149764535f, + 0.989176510f, -0.146730474f, + 0.989622017f, -0.143695033f, + 0.990058210f, -0.140658239f, + 0.990485084f, -0.137620122f, + 0.990902635f, -0.134580709f, + 0.991310860f, -0.131540029f, + 0.991709754f, -0.128498111f, + 0.992099313f, -0.125454983f, + 0.992479535f, -0.122410675f, + 0.992850414f, -0.119365215f, + 0.993211949f, -0.116318631f, + 0.993564136f, -0.113270952f, + 0.993906970f, -0.110222207f, + 0.994240449f, -0.107172425f, + 0.994564571f, -0.104121634f, + 0.994879331f, -0.101069863f, + 0.995184727f, -0.098017140f, + 0.995480755f, -0.094963495f, + 0.995767414f, -0.091908956f, + 0.996044701f, -0.088853553f, + 0.996312612f, -0.085797312f, + 0.996571146f, -0.082740265f, + 0.996820299f, -0.079682438f, + 0.997060070f, -0.076623861f, + 0.997290457f, -0.073564564f, + 0.997511456f, -0.070504573f, + 0.997723067f, -0.067443920f, + 0.997925286f, -0.064382631f, + 0.998118113f, -0.061320736f, + 0.998301545f, -0.058258265f, + 0.998475581f, -0.055195244f, + 0.998640218f, -0.052131705f, + 0.998795456f, -0.049067674f, + 0.998941293f, -0.046003182f, + 0.999077728f, -0.042938257f, + 0.999204759f, -0.039872928f, + 0.999322385f, -0.036807223f, + 0.999430605f, -0.033741172f, + 0.999529418f, -0.030674803f, + 0.999618822f, -0.027608146f, + 0.999698819f, -0.024541229f, + 0.999769405f, -0.021474080f, + 0.999830582f, -0.018406730f, + 0.999882347f, -0.015339206f, + 0.999924702f, -0.012271538f, + 0.999957645f, -0.009203755f, + 0.999981175f, -0.006135885f, + 0.999995294f, -0.003067957f +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096) +/** + @par + Example code for Floating-point Twiddle factors Generation: + @par +
for (i = 0; i< N/; i++)
+  {
+ 	twiddleCoef[2*i]   = cos(i * 2*PI/(float)N);
+ 	twiddleCoef[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 4096, PI = 3.14159265358979 + @par + Cos and Sin values are in interleaved fashion +*/ +const float32_t twiddleCoef_4096[8192] = { + 1.000000000f, 0.000000000f, + 0.999998823f, 0.001533980f, + 0.999995294f, 0.003067957f, + 0.999989411f, 0.004601926f, + 0.999981175f, 0.006135885f, + 0.999970586f, 0.007669829f, + 0.999957645f, 0.009203755f, + 0.999942350f, 0.010737659f, + 0.999924702f, 0.012271538f, + 0.999904701f, 0.013805389f, + 0.999882347f, 0.015339206f, + 0.999857641f, 0.016872988f, + 0.999830582f, 0.018406730f, + 0.999801170f, 0.019940429f, + 0.999769405f, 0.021474080f, + 0.999735288f, 0.023007681f, + 0.999698819f, 0.024541229f, + 0.999659997f, 0.026074718f, + 0.999618822f, 0.027608146f, + 0.999575296f, 0.029141509f, + 0.999529418f, 0.030674803f, + 0.999481187f, 0.032208025f, + 0.999430605f, 0.033741172f, + 0.999377670f, 0.035274239f, + 0.999322385f, 0.036807223f, + 0.999264747f, 0.038340120f, + 0.999204759f, 0.039872928f, + 0.999142419f, 0.041405641f, + 0.999077728f, 0.042938257f, + 0.999010686f, 0.044470772f, + 0.998941293f, 0.046003182f, + 0.998869550f, 0.047535484f, + 0.998795456f, 0.049067674f, + 0.998719012f, 0.050599749f, + 0.998640218f, 0.052131705f, + 0.998559074f, 0.053663538f, + 0.998475581f, 0.055195244f, + 0.998389737f, 0.056726821f, + 0.998301545f, 0.058258265f, + 0.998211003f, 0.059789571f, + 0.998118113f, 0.061320736f, + 0.998022874f, 0.062851758f, + 0.997925286f, 0.064382631f, + 0.997825350f, 0.065913353f, + 0.997723067f, 0.067443920f, + 0.997618435f, 0.068974328f, + 0.997511456f, 0.070504573f, + 0.997402130f, 0.072034653f, + 0.997290457f, 0.073564564f, + 0.997176437f, 0.075094301f, + 0.997060070f, 0.076623861f, + 0.996941358f, 0.078153242f, + 0.996820299f, 0.079682438f, + 0.996696895f, 0.081211447f, + 0.996571146f, 0.082740265f, + 0.996443051f, 0.084268888f, + 0.996312612f, 0.085797312f, + 0.996179829f, 0.087325535f, + 0.996044701f, 0.088853553f, + 0.995907229f, 0.090381361f, + 0.995767414f, 0.091908956f, + 0.995625256f, 0.093436336f, + 0.995480755f, 0.094963495f, + 0.995333912f, 0.096490431f, + 0.995184727f, 0.098017140f, + 0.995033199f, 0.099543619f, + 0.994879331f, 0.101069863f, + 0.994723121f, 0.102595869f, + 0.994564571f, 0.104121634f, + 0.994403680f, 0.105647154f, + 0.994240449f, 0.107172425f, + 0.994074879f, 0.108697444f, + 0.993906970f, 0.110222207f, + 0.993736722f, 0.111746711f, + 0.993564136f, 0.113270952f, + 0.993389211f, 0.114794927f, + 0.993211949f, 0.116318631f, + 0.993032350f, 0.117842062f, + 0.992850414f, 0.119365215f, + 0.992666142f, 0.120888087f, + 0.992479535f, 0.122410675f, + 0.992290591f, 0.123932975f, + 0.992099313f, 0.125454983f, + 0.991905700f, 0.126976696f, + 0.991709754f, 0.128498111f, + 0.991511473f, 0.130019223f, + 0.991310860f, 0.131540029f, + 0.991107914f, 0.133060525f, + 0.990902635f, 0.134580709f, + 0.990695025f, 0.136100575f, + 0.990485084f, 0.137620122f, + 0.990272812f, 0.139139344f, + 0.990058210f, 0.140658239f, + 0.989841278f, 0.142176804f, + 0.989622017f, 0.143695033f, + 0.989400428f, 0.145212925f, + 0.989176510f, 0.146730474f, + 0.988950265f, 0.148247679f, + 0.988721692f, 0.149764535f, + 0.988490793f, 0.151281038f, + 0.988257568f, 0.152797185f, + 0.988022017f, 0.154312973f, + 0.987784142f, 0.155828398f, + 0.987543942f, 0.157343456f, + 0.987301418f, 0.158858143f, + 0.987056571f, 0.160372457f, + 0.986809402f, 0.161886394f, + 0.986559910f, 0.163399949f, + 0.986308097f, 0.164913120f, + 0.986053963f, 0.166425904f, + 0.985797509f, 0.167938295f, + 0.985538735f, 0.169450291f, + 0.985277642f, 0.170961889f, + 0.985014231f, 0.172473084f, + 0.984748502f, 0.173983873f, + 0.984480455f, 0.175494253f, + 0.984210092f, 0.177004220f, + 0.983937413f, 0.178513771f, + 0.983662419f, 0.180022901f, + 0.983385110f, 0.181531608f, + 0.983105487f, 0.183039888f, + 0.982823551f, 0.184547737f, + 0.982539302f, 0.186055152f, + 0.982252741f, 0.187562129f, + 0.981963869f, 0.189068664f, + 0.981672686f, 0.190574755f, + 0.981379193f, 0.192080397f, + 0.981083391f, 0.193585587f, + 0.980785280f, 0.195090322f, + 0.980484862f, 0.196594598f, + 0.980182136f, 0.198098411f, + 0.979877104f, 0.199601758f, + 0.979569766f, 0.201104635f, + 0.979260123f, 0.202607039f, + 0.978948175f, 0.204108966f, + 0.978633924f, 0.205610413f, + 0.978317371f, 0.207111376f, + 0.977998515f, 0.208611852f, + 0.977677358f, 0.210111837f, + 0.977353900f, 0.211611327f, + 0.977028143f, 0.213110320f, + 0.976700086f, 0.214608811f, + 0.976369731f, 0.216106797f, + 0.976037079f, 0.217604275f, + 0.975702130f, 0.219101240f, + 0.975364885f, 0.220597690f, + 0.975025345f, 0.222093621f, + 0.974683511f, 0.223589029f, + 0.974339383f, 0.225083911f, + 0.973992962f, 0.226578264f, + 0.973644250f, 0.228072083f, + 0.973293246f, 0.229565366f, + 0.972939952f, 0.231058108f, + 0.972584369f, 0.232550307f, + 0.972226497f, 0.234041959f, + 0.971866337f, 0.235533059f, + 0.971503891f, 0.237023606f, + 0.971139158f, 0.238513595f, + 0.970772141f, 0.240003022f, + 0.970402839f, 0.241491885f, + 0.970031253f, 0.242980180f, + 0.969657385f, 0.244467903f, + 0.969281235f, 0.245955050f, + 0.968902805f, 0.247441619f, + 0.968522094f, 0.248927606f, + 0.968139105f, 0.250413007f, + 0.967753837f, 0.251897818f, + 0.967366292f, 0.253382037f, + 0.966976471f, 0.254865660f, + 0.966584374f, 0.256348682f, + 0.966190003f, 0.257831102f, + 0.965793359f, 0.259312915f, + 0.965394442f, 0.260794118f, + 0.964993253f, 0.262274707f, + 0.964589793f, 0.263754679f, + 0.964184064f, 0.265234030f, + 0.963776066f, 0.266712757f, + 0.963365800f, 0.268190857f, + 0.962953267f, 0.269668326f, + 0.962538468f, 0.271145160f, + 0.962121404f, 0.272621355f, + 0.961702077f, 0.274096910f, + 0.961280486f, 0.275571819f, + 0.960856633f, 0.277046080f, + 0.960430519f, 0.278519689f, + 0.960002146f, 0.279992643f, + 0.959571513f, 0.281464938f, + 0.959138622f, 0.282936570f, + 0.958703475f, 0.284407537f, + 0.958266071f, 0.285877835f, + 0.957826413f, 0.287347460f, + 0.957384501f, 0.288816408f, + 0.956940336f, 0.290284677f, + 0.956493919f, 0.291752263f, + 0.956045251f, 0.293219163f, + 0.955594334f, 0.294685372f, + 0.955141168f, 0.296150888f, + 0.954685755f, 0.297615707f, + 0.954228095f, 0.299079826f, + 0.953768190f, 0.300543241f, + 0.953306040f, 0.302005949f, + 0.952841648f, 0.303467947f, + 0.952375013f, 0.304929230f, + 0.951906137f, 0.306389795f, + 0.951435021f, 0.307849640f, + 0.950961666f, 0.309308760f, + 0.950486074f, 0.310767153f, + 0.950008245f, 0.312224814f, + 0.949528181f, 0.313681740f, + 0.949045882f, 0.315137929f, + 0.948561350f, 0.316593376f, + 0.948074586f, 0.318048077f, + 0.947585591f, 0.319502031f, + 0.947094366f, 0.320955232f, + 0.946600913f, 0.322407679f, + 0.946105232f, 0.323859367f, + 0.945607325f, 0.325310292f, + 0.945107193f, 0.326760452f, + 0.944604837f, 0.328209844f, + 0.944100258f, 0.329658463f, + 0.943593458f, 0.331106306f, + 0.943084437f, 0.332553370f, + 0.942573198f, 0.333999651f, + 0.942059740f, 0.335445147f, + 0.941544065f, 0.336889853f, + 0.941026175f, 0.338333767f, + 0.940506071f, 0.339776884f, + 0.939983753f, 0.341219202f, + 0.939459224f, 0.342660717f, + 0.938932484f, 0.344101426f, + 0.938403534f, 0.345541325f, + 0.937872376f, 0.346980411f, + 0.937339012f, 0.348418680f, + 0.936803442f, 0.349856130f, + 0.936265667f, 0.351292756f, + 0.935725689f, 0.352728556f, + 0.935183510f, 0.354163525f, + 0.934639130f, 0.355597662f, + 0.934092550f, 0.357030961f, + 0.933543773f, 0.358463421f, + 0.932992799f, 0.359895037f, + 0.932439629f, 0.361325806f, + 0.931884266f, 0.362755724f, + 0.931326709f, 0.364184790f, + 0.930766961f, 0.365612998f, + 0.930205023f, 0.367040346f, + 0.929640896f, 0.368466830f, + 0.929074581f, 0.369892447f, + 0.928506080f, 0.371317194f, + 0.927935395f, 0.372741067f, + 0.927362526f, 0.374164063f, + 0.926787474f, 0.375586178f, + 0.926210242f, 0.377007410f, + 0.925630831f, 0.378427755f, + 0.925049241f, 0.379847209f, + 0.924465474f, 0.381265769f, + 0.923879533f, 0.382683432f, + 0.923291417f, 0.384100195f, + 0.922701128f, 0.385516054f, + 0.922108669f, 0.386931006f, + 0.921514039f, 0.388345047f, + 0.920917242f, 0.389758174f, + 0.920318277f, 0.391170384f, + 0.919717146f, 0.392581674f, + 0.919113852f, 0.393992040f, + 0.918508394f, 0.395401479f, + 0.917900776f, 0.396809987f, + 0.917290997f, 0.398217562f, + 0.916679060f, 0.399624200f, + 0.916064966f, 0.401029897f, + 0.915448716f, 0.402434651f, + 0.914830312f, 0.403838458f, + 0.914209756f, 0.405241314f, + 0.913587048f, 0.406643217f, + 0.912962190f, 0.408044163f, + 0.912335185f, 0.409444149f, + 0.911706032f, 0.410843171f, + 0.911074734f, 0.412241227f, + 0.910441292f, 0.413638312f, + 0.909805708f, 0.415034424f, + 0.909167983f, 0.416429560f, + 0.908528119f, 0.417823716f, + 0.907886116f, 0.419216888f, + 0.907241978f, 0.420609074f, + 0.906595705f, 0.422000271f, + 0.905947298f, 0.423390474f, + 0.905296759f, 0.424779681f, + 0.904644091f, 0.426167889f, + 0.903989293f, 0.427555093f, + 0.903332368f, 0.428941292f, + 0.902673318f, 0.430326481f, + 0.902012144f, 0.431710658f, + 0.901348847f, 0.433093819f, + 0.900683429f, 0.434475961f, + 0.900015892f, 0.435857080f, + 0.899346237f, 0.437237174f, + 0.898674466f, 0.438616239f, + 0.898000580f, 0.439994271f, + 0.897324581f, 0.441371269f, + 0.896646470f, 0.442747228f, + 0.895966250f, 0.444122145f, + 0.895283921f, 0.445496017f, + 0.894599486f, 0.446868840f, + 0.893912945f, 0.448240612f, + 0.893224301f, 0.449611330f, + 0.892533555f, 0.450980989f, + 0.891840709f, 0.452349587f, + 0.891145765f, 0.453717121f, + 0.890448723f, 0.455083587f, + 0.889749586f, 0.456448982f, + 0.889048356f, 0.457813304f, + 0.888345033f, 0.459176548f, + 0.887639620f, 0.460538711f, + 0.886932119f, 0.461899791f, + 0.886222530f, 0.463259784f, + 0.885510856f, 0.464618686f, + 0.884797098f, 0.465976496f, + 0.884081259f, 0.467333209f, + 0.883363339f, 0.468688822f, + 0.882643340f, 0.470043332f, + 0.881921264f, 0.471396737f, + 0.881197113f, 0.472749032f, + 0.880470889f, 0.474100215f, + 0.879742593f, 0.475450282f, + 0.879012226f, 0.476799230f, + 0.878279792f, 0.478147056f, + 0.877545290f, 0.479493758f, + 0.876808724f, 0.480839331f, + 0.876070094f, 0.482183772f, + 0.875329403f, 0.483527079f, + 0.874586652f, 0.484869248f, + 0.873841843f, 0.486210276f, + 0.873094978f, 0.487550160f, + 0.872346059f, 0.488888897f, + 0.871595087f, 0.490226483f, + 0.870842063f, 0.491562916f, + 0.870086991f, 0.492898192f, + 0.869329871f, 0.494232309f, + 0.868570706f, 0.495565262f, + 0.867809497f, 0.496897049f, + 0.867046246f, 0.498227667f, + 0.866280954f, 0.499557113f, + 0.865513624f, 0.500885383f, + 0.864744258f, 0.502212474f, + 0.863972856f, 0.503538384f, + 0.863199422f, 0.504863109f, + 0.862423956f, 0.506186645f, + 0.861646461f, 0.507508991f, + 0.860866939f, 0.508830143f, + 0.860085390f, 0.510150097f, + 0.859301818f, 0.511468850f, + 0.858516224f, 0.512786401f, + 0.857728610f, 0.514102744f, + 0.856938977f, 0.515417878f, + 0.856147328f, 0.516731799f, + 0.855353665f, 0.518044504f, + 0.854557988f, 0.519355990f, + 0.853760301f, 0.520666254f, + 0.852960605f, 0.521975293f, + 0.852158902f, 0.523283103f, + 0.851355193f, 0.524589683f, + 0.850549481f, 0.525895027f, + 0.849741768f, 0.527199135f, + 0.848932055f, 0.528502002f, + 0.848120345f, 0.529803625f, + 0.847306639f, 0.531104001f, + 0.846490939f, 0.532403128f, + 0.845673247f, 0.533701002f, + 0.844853565f, 0.534997620f, + 0.844031895f, 0.536292979f, + 0.843208240f, 0.537587076f, + 0.842382600f, 0.538879909f, + 0.841554977f, 0.540171473f, + 0.840725375f, 0.541461766f, + 0.839893794f, 0.542750785f, + 0.839060237f, 0.544038527f, + 0.838224706f, 0.545324988f, + 0.837387202f, 0.546610167f, + 0.836547727f, 0.547894059f, + 0.835706284f, 0.549176662f, + 0.834862875f, 0.550457973f, + 0.834017501f, 0.551737988f, + 0.833170165f, 0.553016706f, + 0.832320868f, 0.554294121f, + 0.831469612f, 0.555570233f, + 0.830616400f, 0.556845037f, + 0.829761234f, 0.558118531f, + 0.828904115f, 0.559390712f, + 0.828045045f, 0.560661576f, + 0.827184027f, 0.561931121f, + 0.826321063f, 0.563199344f, + 0.825456154f, 0.564466242f, + 0.824589303f, 0.565731811f, + 0.823720511f, 0.566996049f, + 0.822849781f, 0.568258953f, + 0.821977115f, 0.569520519f, + 0.821102515f, 0.570780746f, + 0.820225983f, 0.572039629f, + 0.819347520f, 0.573297167f, + 0.818467130f, 0.574553355f, + 0.817584813f, 0.575808191f, + 0.816700573f, 0.577061673f, + 0.815814411f, 0.578313796f, + 0.814926329f, 0.579564559f, + 0.814036330f, 0.580813958f, + 0.813144415f, 0.582061990f, + 0.812250587f, 0.583308653f, + 0.811354847f, 0.584553943f, + 0.810457198f, 0.585797857f, + 0.809557642f, 0.587040394f, + 0.808656182f, 0.588281548f, + 0.807752818f, 0.589521319f, + 0.806847554f, 0.590759702f, + 0.805940391f, 0.591996695f, + 0.805031331f, 0.593232295f, + 0.804120377f, 0.594466499f, + 0.803207531f, 0.595699304f, + 0.802292796f, 0.596930708f, + 0.801376172f, 0.598160707f, + 0.800457662f, 0.599389298f, + 0.799537269f, 0.600616479f, + 0.798614995f, 0.601842247f, + 0.797690841f, 0.603066599f, + 0.796764810f, 0.604289531f, + 0.795836905f, 0.605511041f, + 0.794907126f, 0.606731127f, + 0.793975478f, 0.607949785f, + 0.793041960f, 0.609167012f, + 0.792106577f, 0.610382806f, + 0.791169330f, 0.611597164f, + 0.790230221f, 0.612810082f, + 0.789289253f, 0.614021559f, + 0.788346428f, 0.615231591f, + 0.787401747f, 0.616440175f, + 0.786455214f, 0.617647308f, + 0.785506830f, 0.618852988f, + 0.784556597f, 0.620057212f, + 0.783604519f, 0.621259977f, + 0.782650596f, 0.622461279f, + 0.781694832f, 0.623661118f, + 0.780737229f, 0.624859488f, + 0.779777788f, 0.626056388f, + 0.778816512f, 0.627251815f, + 0.777853404f, 0.628445767f, + 0.776888466f, 0.629638239f, + 0.775921699f, 0.630829230f, + 0.774953107f, 0.632018736f, + 0.773982691f, 0.633206755f, + 0.773010453f, 0.634393284f, + 0.772036397f, 0.635578320f, + 0.771060524f, 0.636761861f, + 0.770082837f, 0.637943904f, + 0.769103338f, 0.639124445f, + 0.768122029f, 0.640303482f, + 0.767138912f, 0.641481013f, + 0.766153990f, 0.642657034f, + 0.765167266f, 0.643831543f, + 0.764178741f, 0.645004537f, + 0.763188417f, 0.646176013f, + 0.762196298f, 0.647345969f, + 0.761202385f, 0.648514401f, + 0.760206682f, 0.649681307f, + 0.759209189f, 0.650846685f, + 0.758209910f, 0.652010531f, + 0.757208847f, 0.653172843f, + 0.756206001f, 0.654333618f, + 0.755201377f, 0.655492853f, + 0.754194975f, 0.656650546f, + 0.753186799f, 0.657806693f, + 0.752176850f, 0.658961293f, + 0.751165132f, 0.660114342f, + 0.750151646f, 0.661265838f, + 0.749136395f, 0.662415778f, + 0.748119380f, 0.663564159f, + 0.747100606f, 0.664710978f, + 0.746080074f, 0.665856234f, + 0.745057785f, 0.666999922f, + 0.744033744f, 0.668142041f, + 0.743007952f, 0.669282588f, + 0.741980412f, 0.670421560f, + 0.740951125f, 0.671558955f, + 0.739920095f, 0.672694769f, + 0.738887324f, 0.673829000f, + 0.737852815f, 0.674961646f, + 0.736816569f, 0.676092704f, + 0.735778589f, 0.677222170f, + 0.734738878f, 0.678350043f, + 0.733697438f, 0.679476320f, + 0.732654272f, 0.680600998f, + 0.731609381f, 0.681724074f, + 0.730562769f, 0.682845546f, + 0.729514438f, 0.683965412f, + 0.728464390f, 0.685083668f, + 0.727412629f, 0.686200312f, + 0.726359155f, 0.687315341f, + 0.725303972f, 0.688428753f, + 0.724247083f, 0.689540545f, + 0.723188489f, 0.690650714f, + 0.722128194f, 0.691759258f, + 0.721066199f, 0.692866175f, + 0.720002508f, 0.693971461f, + 0.718937122f, 0.695075114f, + 0.717870045f, 0.696177131f, + 0.716801279f, 0.697277511f, + 0.715730825f, 0.698376249f, + 0.714658688f, 0.699473345f, + 0.713584869f, 0.700568794f, + 0.712509371f, 0.701662595f, + 0.711432196f, 0.702754744f, + 0.710353347f, 0.703845241f, + 0.709272826f, 0.704934080f, + 0.708190637f, 0.706021261f, + 0.707106781f, 0.707106781f, + 0.706021261f, 0.708190637f, + 0.704934080f, 0.709272826f, + 0.703845241f, 0.710353347f, + 0.702754744f, 0.711432196f, + 0.701662595f, 0.712509371f, + 0.700568794f, 0.713584869f, + 0.699473345f, 0.714658688f, + 0.698376249f, 0.715730825f, + 0.697277511f, 0.716801279f, + 0.696177131f, 0.717870045f, + 0.695075114f, 0.718937122f, + 0.693971461f, 0.720002508f, + 0.692866175f, 0.721066199f, + 0.691759258f, 0.722128194f, + 0.690650714f, 0.723188489f, + 0.689540545f, 0.724247083f, + 0.688428753f, 0.725303972f, + 0.687315341f, 0.726359155f, + 0.686200312f, 0.727412629f, + 0.685083668f, 0.728464390f, + 0.683965412f, 0.729514438f, + 0.682845546f, 0.730562769f, + 0.681724074f, 0.731609381f, + 0.680600998f, 0.732654272f, + 0.679476320f, 0.733697438f, + 0.678350043f, 0.734738878f, + 0.677222170f, 0.735778589f, + 0.676092704f, 0.736816569f, + 0.674961646f, 0.737852815f, + 0.673829000f, 0.738887324f, + 0.672694769f, 0.739920095f, + 0.671558955f, 0.740951125f, + 0.670421560f, 0.741980412f, + 0.669282588f, 0.743007952f, + 0.668142041f, 0.744033744f, + 0.666999922f, 0.745057785f, + 0.665856234f, 0.746080074f, + 0.664710978f, 0.747100606f, + 0.663564159f, 0.748119380f, + 0.662415778f, 0.749136395f, + 0.661265838f, 0.750151646f, + 0.660114342f, 0.751165132f, + 0.658961293f, 0.752176850f, + 0.657806693f, 0.753186799f, + 0.656650546f, 0.754194975f, + 0.655492853f, 0.755201377f, + 0.654333618f, 0.756206001f, + 0.653172843f, 0.757208847f, + 0.652010531f, 0.758209910f, + 0.650846685f, 0.759209189f, + 0.649681307f, 0.760206682f, + 0.648514401f, 0.761202385f, + 0.647345969f, 0.762196298f, + 0.646176013f, 0.763188417f, + 0.645004537f, 0.764178741f, + 0.643831543f, 0.765167266f, + 0.642657034f, 0.766153990f, + 0.641481013f, 0.767138912f, + 0.640303482f, 0.768122029f, + 0.639124445f, 0.769103338f, + 0.637943904f, 0.770082837f, + 0.636761861f, 0.771060524f, + 0.635578320f, 0.772036397f, + 0.634393284f, 0.773010453f, + 0.633206755f, 0.773982691f, + 0.632018736f, 0.774953107f, + 0.630829230f, 0.775921699f, + 0.629638239f, 0.776888466f, + 0.628445767f, 0.777853404f, + 0.627251815f, 0.778816512f, + 0.626056388f, 0.779777788f, + 0.624859488f, 0.780737229f, + 0.623661118f, 0.781694832f, + 0.622461279f, 0.782650596f, + 0.621259977f, 0.783604519f, + 0.620057212f, 0.784556597f, + 0.618852988f, 0.785506830f, + 0.617647308f, 0.786455214f, + 0.616440175f, 0.787401747f, + 0.615231591f, 0.788346428f, + 0.614021559f, 0.789289253f, + 0.612810082f, 0.790230221f, + 0.611597164f, 0.791169330f, + 0.610382806f, 0.792106577f, + 0.609167012f, 0.793041960f, + 0.607949785f, 0.793975478f, + 0.606731127f, 0.794907126f, + 0.605511041f, 0.795836905f, + 0.604289531f, 0.796764810f, + 0.603066599f, 0.797690841f, + 0.601842247f, 0.798614995f, + 0.600616479f, 0.799537269f, + 0.599389298f, 0.800457662f, + 0.598160707f, 0.801376172f, + 0.596930708f, 0.802292796f, + 0.595699304f, 0.803207531f, + 0.594466499f, 0.804120377f, + 0.593232295f, 0.805031331f, + 0.591996695f, 0.805940391f, + 0.590759702f, 0.806847554f, + 0.589521319f, 0.807752818f, + 0.588281548f, 0.808656182f, + 0.587040394f, 0.809557642f, + 0.585797857f, 0.810457198f, + 0.584553943f, 0.811354847f, + 0.583308653f, 0.812250587f, + 0.582061990f, 0.813144415f, + 0.580813958f, 0.814036330f, + 0.579564559f, 0.814926329f, + 0.578313796f, 0.815814411f, + 0.577061673f, 0.816700573f, + 0.575808191f, 0.817584813f, + 0.574553355f, 0.818467130f, + 0.573297167f, 0.819347520f, + 0.572039629f, 0.820225983f, + 0.570780746f, 0.821102515f, + 0.569520519f, 0.821977115f, + 0.568258953f, 0.822849781f, + 0.566996049f, 0.823720511f, + 0.565731811f, 0.824589303f, + 0.564466242f, 0.825456154f, + 0.563199344f, 0.826321063f, + 0.561931121f, 0.827184027f, + 0.560661576f, 0.828045045f, + 0.559390712f, 0.828904115f, + 0.558118531f, 0.829761234f, + 0.556845037f, 0.830616400f, + 0.555570233f, 0.831469612f, + 0.554294121f, 0.832320868f, + 0.553016706f, 0.833170165f, + 0.551737988f, 0.834017501f, + 0.550457973f, 0.834862875f, + 0.549176662f, 0.835706284f, + 0.547894059f, 0.836547727f, + 0.546610167f, 0.837387202f, + 0.545324988f, 0.838224706f, + 0.544038527f, 0.839060237f, + 0.542750785f, 0.839893794f, + 0.541461766f, 0.840725375f, + 0.540171473f, 0.841554977f, + 0.538879909f, 0.842382600f, + 0.537587076f, 0.843208240f, + 0.536292979f, 0.844031895f, + 0.534997620f, 0.844853565f, + 0.533701002f, 0.845673247f, + 0.532403128f, 0.846490939f, + 0.531104001f, 0.847306639f, + 0.529803625f, 0.848120345f, + 0.528502002f, 0.848932055f, + 0.527199135f, 0.849741768f, + 0.525895027f, 0.850549481f, + 0.524589683f, 0.851355193f, + 0.523283103f, 0.852158902f, + 0.521975293f, 0.852960605f, + 0.520666254f, 0.853760301f, + 0.519355990f, 0.854557988f, + 0.518044504f, 0.855353665f, + 0.516731799f, 0.856147328f, + 0.515417878f, 0.856938977f, + 0.514102744f, 0.857728610f, + 0.512786401f, 0.858516224f, + 0.511468850f, 0.859301818f, + 0.510150097f, 0.860085390f, + 0.508830143f, 0.860866939f, + 0.507508991f, 0.861646461f, + 0.506186645f, 0.862423956f, + 0.504863109f, 0.863199422f, + 0.503538384f, 0.863972856f, + 0.502212474f, 0.864744258f, + 0.500885383f, 0.865513624f, + 0.499557113f, 0.866280954f, + 0.498227667f, 0.867046246f, + 0.496897049f, 0.867809497f, + 0.495565262f, 0.868570706f, + 0.494232309f, 0.869329871f, + 0.492898192f, 0.870086991f, + 0.491562916f, 0.870842063f, + 0.490226483f, 0.871595087f, + 0.488888897f, 0.872346059f, + 0.487550160f, 0.873094978f, + 0.486210276f, 0.873841843f, + 0.484869248f, 0.874586652f, + 0.483527079f, 0.875329403f, + 0.482183772f, 0.876070094f, + 0.480839331f, 0.876808724f, + 0.479493758f, 0.877545290f, + 0.478147056f, 0.878279792f, + 0.476799230f, 0.879012226f, + 0.475450282f, 0.879742593f, + 0.474100215f, 0.880470889f, + 0.472749032f, 0.881197113f, + 0.471396737f, 0.881921264f, + 0.470043332f, 0.882643340f, + 0.468688822f, 0.883363339f, + 0.467333209f, 0.884081259f, + 0.465976496f, 0.884797098f, + 0.464618686f, 0.885510856f, + 0.463259784f, 0.886222530f, + 0.461899791f, 0.886932119f, + 0.460538711f, 0.887639620f, + 0.459176548f, 0.888345033f, + 0.457813304f, 0.889048356f, + 0.456448982f, 0.889749586f, + 0.455083587f, 0.890448723f, + 0.453717121f, 0.891145765f, + 0.452349587f, 0.891840709f, + 0.450980989f, 0.892533555f, + 0.449611330f, 0.893224301f, + 0.448240612f, 0.893912945f, + 0.446868840f, 0.894599486f, + 0.445496017f, 0.895283921f, + 0.444122145f, 0.895966250f, + 0.442747228f, 0.896646470f, + 0.441371269f, 0.897324581f, + 0.439994271f, 0.898000580f, + 0.438616239f, 0.898674466f, + 0.437237174f, 0.899346237f, + 0.435857080f, 0.900015892f, + 0.434475961f, 0.900683429f, + 0.433093819f, 0.901348847f, + 0.431710658f, 0.902012144f, + 0.430326481f, 0.902673318f, + 0.428941292f, 0.903332368f, + 0.427555093f, 0.903989293f, + 0.426167889f, 0.904644091f, + 0.424779681f, 0.905296759f, + 0.423390474f, 0.905947298f, + 0.422000271f, 0.906595705f, + 0.420609074f, 0.907241978f, + 0.419216888f, 0.907886116f, + 0.417823716f, 0.908528119f, + 0.416429560f, 0.909167983f, + 0.415034424f, 0.909805708f, + 0.413638312f, 0.910441292f, + 0.412241227f, 0.911074734f, + 0.410843171f, 0.911706032f, + 0.409444149f, 0.912335185f, + 0.408044163f, 0.912962190f, + 0.406643217f, 0.913587048f, + 0.405241314f, 0.914209756f, + 0.403838458f, 0.914830312f, + 0.402434651f, 0.915448716f, + 0.401029897f, 0.916064966f, + 0.399624200f, 0.916679060f, + 0.398217562f, 0.917290997f, + 0.396809987f, 0.917900776f, + 0.395401479f, 0.918508394f, + 0.393992040f, 0.919113852f, + 0.392581674f, 0.919717146f, + 0.391170384f, 0.920318277f, + 0.389758174f, 0.920917242f, + 0.388345047f, 0.921514039f, + 0.386931006f, 0.922108669f, + 0.385516054f, 0.922701128f, + 0.384100195f, 0.923291417f, + 0.382683432f, 0.923879533f, + 0.381265769f, 0.924465474f, + 0.379847209f, 0.925049241f, + 0.378427755f, 0.925630831f, + 0.377007410f, 0.926210242f, + 0.375586178f, 0.926787474f, + 0.374164063f, 0.927362526f, + 0.372741067f, 0.927935395f, + 0.371317194f, 0.928506080f, + 0.369892447f, 0.929074581f, + 0.368466830f, 0.929640896f, + 0.367040346f, 0.930205023f, + 0.365612998f, 0.930766961f, + 0.364184790f, 0.931326709f, + 0.362755724f, 0.931884266f, + 0.361325806f, 0.932439629f, + 0.359895037f, 0.932992799f, + 0.358463421f, 0.933543773f, + 0.357030961f, 0.934092550f, + 0.355597662f, 0.934639130f, + 0.354163525f, 0.935183510f, + 0.352728556f, 0.935725689f, + 0.351292756f, 0.936265667f, + 0.349856130f, 0.936803442f, + 0.348418680f, 0.937339012f, + 0.346980411f, 0.937872376f, + 0.345541325f, 0.938403534f, + 0.344101426f, 0.938932484f, + 0.342660717f, 0.939459224f, + 0.341219202f, 0.939983753f, + 0.339776884f, 0.940506071f, + 0.338333767f, 0.941026175f, + 0.336889853f, 0.941544065f, + 0.335445147f, 0.942059740f, + 0.333999651f, 0.942573198f, + 0.332553370f, 0.943084437f, + 0.331106306f, 0.943593458f, + 0.329658463f, 0.944100258f, + 0.328209844f, 0.944604837f, + 0.326760452f, 0.945107193f, + 0.325310292f, 0.945607325f, + 0.323859367f, 0.946105232f, + 0.322407679f, 0.946600913f, + 0.320955232f, 0.947094366f, + 0.319502031f, 0.947585591f, + 0.318048077f, 0.948074586f, + 0.316593376f, 0.948561350f, + 0.315137929f, 0.949045882f, + 0.313681740f, 0.949528181f, + 0.312224814f, 0.950008245f, + 0.310767153f, 0.950486074f, + 0.309308760f, 0.950961666f, + 0.307849640f, 0.951435021f, + 0.306389795f, 0.951906137f, + 0.304929230f, 0.952375013f, + 0.303467947f, 0.952841648f, + 0.302005949f, 0.953306040f, + 0.300543241f, 0.953768190f, + 0.299079826f, 0.954228095f, + 0.297615707f, 0.954685755f, + 0.296150888f, 0.955141168f, + 0.294685372f, 0.955594334f, + 0.293219163f, 0.956045251f, + 0.291752263f, 0.956493919f, + 0.290284677f, 0.956940336f, + 0.288816408f, 0.957384501f, + 0.287347460f, 0.957826413f, + 0.285877835f, 0.958266071f, + 0.284407537f, 0.958703475f, + 0.282936570f, 0.959138622f, + 0.281464938f, 0.959571513f, + 0.279992643f, 0.960002146f, + 0.278519689f, 0.960430519f, + 0.277046080f, 0.960856633f, + 0.275571819f, 0.961280486f, + 0.274096910f, 0.961702077f, + 0.272621355f, 0.962121404f, + 0.271145160f, 0.962538468f, + 0.269668326f, 0.962953267f, + 0.268190857f, 0.963365800f, + 0.266712757f, 0.963776066f, + 0.265234030f, 0.964184064f, + 0.263754679f, 0.964589793f, + 0.262274707f, 0.964993253f, + 0.260794118f, 0.965394442f, + 0.259312915f, 0.965793359f, + 0.257831102f, 0.966190003f, + 0.256348682f, 0.966584374f, + 0.254865660f, 0.966976471f, + 0.253382037f, 0.967366292f, + 0.251897818f, 0.967753837f, + 0.250413007f, 0.968139105f, + 0.248927606f, 0.968522094f, + 0.247441619f, 0.968902805f, + 0.245955050f, 0.969281235f, + 0.244467903f, 0.969657385f, + 0.242980180f, 0.970031253f, + 0.241491885f, 0.970402839f, + 0.240003022f, 0.970772141f, + 0.238513595f, 0.971139158f, + 0.237023606f, 0.971503891f, + 0.235533059f, 0.971866337f, + 0.234041959f, 0.972226497f, + 0.232550307f, 0.972584369f, + 0.231058108f, 0.972939952f, + 0.229565366f, 0.973293246f, + 0.228072083f, 0.973644250f, + 0.226578264f, 0.973992962f, + 0.225083911f, 0.974339383f, + 0.223589029f, 0.974683511f, + 0.222093621f, 0.975025345f, + 0.220597690f, 0.975364885f, + 0.219101240f, 0.975702130f, + 0.217604275f, 0.976037079f, + 0.216106797f, 0.976369731f, + 0.214608811f, 0.976700086f, + 0.213110320f, 0.977028143f, + 0.211611327f, 0.977353900f, + 0.210111837f, 0.977677358f, + 0.208611852f, 0.977998515f, + 0.207111376f, 0.978317371f, + 0.205610413f, 0.978633924f, + 0.204108966f, 0.978948175f, + 0.202607039f, 0.979260123f, + 0.201104635f, 0.979569766f, + 0.199601758f, 0.979877104f, + 0.198098411f, 0.980182136f, + 0.196594598f, 0.980484862f, + 0.195090322f, 0.980785280f, + 0.193585587f, 0.981083391f, + 0.192080397f, 0.981379193f, + 0.190574755f, 0.981672686f, + 0.189068664f, 0.981963869f, + 0.187562129f, 0.982252741f, + 0.186055152f, 0.982539302f, + 0.184547737f, 0.982823551f, + 0.183039888f, 0.983105487f, + 0.181531608f, 0.983385110f, + 0.180022901f, 0.983662419f, + 0.178513771f, 0.983937413f, + 0.177004220f, 0.984210092f, + 0.175494253f, 0.984480455f, + 0.173983873f, 0.984748502f, + 0.172473084f, 0.985014231f, + 0.170961889f, 0.985277642f, + 0.169450291f, 0.985538735f, + 0.167938295f, 0.985797509f, + 0.166425904f, 0.986053963f, + 0.164913120f, 0.986308097f, + 0.163399949f, 0.986559910f, + 0.161886394f, 0.986809402f, + 0.160372457f, 0.987056571f, + 0.158858143f, 0.987301418f, + 0.157343456f, 0.987543942f, + 0.155828398f, 0.987784142f, + 0.154312973f, 0.988022017f, + 0.152797185f, 0.988257568f, + 0.151281038f, 0.988490793f, + 0.149764535f, 0.988721692f, + 0.148247679f, 0.988950265f, + 0.146730474f, 0.989176510f, + 0.145212925f, 0.989400428f, + 0.143695033f, 0.989622017f, + 0.142176804f, 0.989841278f, + 0.140658239f, 0.990058210f, + 0.139139344f, 0.990272812f, + 0.137620122f, 0.990485084f, + 0.136100575f, 0.990695025f, + 0.134580709f, 0.990902635f, + 0.133060525f, 0.991107914f, + 0.131540029f, 0.991310860f, + 0.130019223f, 0.991511473f, + 0.128498111f, 0.991709754f, + 0.126976696f, 0.991905700f, + 0.125454983f, 0.992099313f, + 0.123932975f, 0.992290591f, + 0.122410675f, 0.992479535f, + 0.120888087f, 0.992666142f, + 0.119365215f, 0.992850414f, + 0.117842062f, 0.993032350f, + 0.116318631f, 0.993211949f, + 0.114794927f, 0.993389211f, + 0.113270952f, 0.993564136f, + 0.111746711f, 0.993736722f, + 0.110222207f, 0.993906970f, + 0.108697444f, 0.994074879f, + 0.107172425f, 0.994240449f, + 0.105647154f, 0.994403680f, + 0.104121634f, 0.994564571f, + 0.102595869f, 0.994723121f, + 0.101069863f, 0.994879331f, + 0.099543619f, 0.995033199f, + 0.098017140f, 0.995184727f, + 0.096490431f, 0.995333912f, + 0.094963495f, 0.995480755f, + 0.093436336f, 0.995625256f, + 0.091908956f, 0.995767414f, + 0.090381361f, 0.995907229f, + 0.088853553f, 0.996044701f, + 0.087325535f, 0.996179829f, + 0.085797312f, 0.996312612f, + 0.084268888f, 0.996443051f, + 0.082740265f, 0.996571146f, + 0.081211447f, 0.996696895f, + 0.079682438f, 0.996820299f, + 0.078153242f, 0.996941358f, + 0.076623861f, 0.997060070f, + 0.075094301f, 0.997176437f, + 0.073564564f, 0.997290457f, + 0.072034653f, 0.997402130f, + 0.070504573f, 0.997511456f, + 0.068974328f, 0.997618435f, + 0.067443920f, 0.997723067f, + 0.065913353f, 0.997825350f, + 0.064382631f, 0.997925286f, + 0.062851758f, 0.998022874f, + 0.061320736f, 0.998118113f, + 0.059789571f, 0.998211003f, + 0.058258265f, 0.998301545f, + 0.056726821f, 0.998389737f, + 0.055195244f, 0.998475581f, + 0.053663538f, 0.998559074f, + 0.052131705f, 0.998640218f, + 0.050599749f, 0.998719012f, + 0.049067674f, 0.998795456f, + 0.047535484f, 0.998869550f, + 0.046003182f, 0.998941293f, + 0.044470772f, 0.999010686f, + 0.042938257f, 0.999077728f, + 0.041405641f, 0.999142419f, + 0.039872928f, 0.999204759f, + 0.038340120f, 0.999264747f, + 0.036807223f, 0.999322385f, + 0.035274239f, 0.999377670f, + 0.033741172f, 0.999430605f, + 0.032208025f, 0.999481187f, + 0.030674803f, 0.999529418f, + 0.029141509f, 0.999575296f, + 0.027608146f, 0.999618822f, + 0.026074718f, 0.999659997f, + 0.024541229f, 0.999698819f, + 0.023007681f, 0.999735288f, + 0.021474080f, 0.999769405f, + 0.019940429f, 0.999801170f, + 0.018406730f, 0.999830582f, + 0.016872988f, 0.999857641f, + 0.015339206f, 0.999882347f, + 0.013805389f, 0.999904701f, + 0.012271538f, 0.999924702f, + 0.010737659f, 0.999942350f, + 0.009203755f, 0.999957645f, + 0.007669829f, 0.999970586f, + 0.006135885f, 0.999981175f, + 0.004601926f, 0.999989411f, + 0.003067957f, 0.999995294f, + 0.001533980f, 0.999998823f, + 0.000000000f, 1.000000000f, + -0.001533980f, 0.999998823f, + -0.003067957f, 0.999995294f, + -0.004601926f, 0.999989411f, + -0.006135885f, 0.999981175f, + -0.007669829f, 0.999970586f, + -0.009203755f, 0.999957645f, + -0.010737659f, 0.999942350f, + -0.012271538f, 0.999924702f, + -0.013805389f, 0.999904701f, + -0.015339206f, 0.999882347f, + -0.016872988f, 0.999857641f, + -0.018406730f, 0.999830582f, + -0.019940429f, 0.999801170f, + -0.021474080f, 0.999769405f, + -0.023007681f, 0.999735288f, + -0.024541229f, 0.999698819f, + -0.026074718f, 0.999659997f, + -0.027608146f, 0.999618822f, + -0.029141509f, 0.999575296f, + -0.030674803f, 0.999529418f, + -0.032208025f, 0.999481187f, + -0.033741172f, 0.999430605f, + -0.035274239f, 0.999377670f, + -0.036807223f, 0.999322385f, + -0.038340120f, 0.999264747f, + -0.039872928f, 0.999204759f, + -0.041405641f, 0.999142419f, + -0.042938257f, 0.999077728f, + -0.044470772f, 0.999010686f, + -0.046003182f, 0.998941293f, + -0.047535484f, 0.998869550f, + -0.049067674f, 0.998795456f, + -0.050599749f, 0.998719012f, + -0.052131705f, 0.998640218f, + -0.053663538f, 0.998559074f, + -0.055195244f, 0.998475581f, + -0.056726821f, 0.998389737f, + -0.058258265f, 0.998301545f, + -0.059789571f, 0.998211003f, + -0.061320736f, 0.998118113f, + -0.062851758f, 0.998022874f, + -0.064382631f, 0.997925286f, + -0.065913353f, 0.997825350f, + -0.067443920f, 0.997723067f, + -0.068974328f, 0.997618435f, + -0.070504573f, 0.997511456f, + -0.072034653f, 0.997402130f, + -0.073564564f, 0.997290457f, + -0.075094301f, 0.997176437f, + -0.076623861f, 0.997060070f, + -0.078153242f, 0.996941358f, + -0.079682438f, 0.996820299f, + -0.081211447f, 0.996696895f, + -0.082740265f, 0.996571146f, + -0.084268888f, 0.996443051f, + -0.085797312f, 0.996312612f, + -0.087325535f, 0.996179829f, + -0.088853553f, 0.996044701f, + -0.090381361f, 0.995907229f, + -0.091908956f, 0.995767414f, + -0.093436336f, 0.995625256f, + -0.094963495f, 0.995480755f, + -0.096490431f, 0.995333912f, + -0.098017140f, 0.995184727f, + -0.099543619f, 0.995033199f, + -0.101069863f, 0.994879331f, + -0.102595869f, 0.994723121f, + -0.104121634f, 0.994564571f, + -0.105647154f, 0.994403680f, + -0.107172425f, 0.994240449f, + -0.108697444f, 0.994074879f, + -0.110222207f, 0.993906970f, + -0.111746711f, 0.993736722f, + -0.113270952f, 0.993564136f, + -0.114794927f, 0.993389211f, + -0.116318631f, 0.993211949f, + -0.117842062f, 0.993032350f, + -0.119365215f, 0.992850414f, + -0.120888087f, 0.992666142f, + -0.122410675f, 0.992479535f, + -0.123932975f, 0.992290591f, + -0.125454983f, 0.992099313f, + -0.126976696f, 0.991905700f, + -0.128498111f, 0.991709754f, + -0.130019223f, 0.991511473f, + -0.131540029f, 0.991310860f, + -0.133060525f, 0.991107914f, + -0.134580709f, 0.990902635f, + -0.136100575f, 0.990695025f, + -0.137620122f, 0.990485084f, + -0.139139344f, 0.990272812f, + -0.140658239f, 0.990058210f, + -0.142176804f, 0.989841278f, + -0.143695033f, 0.989622017f, + -0.145212925f, 0.989400428f, + -0.146730474f, 0.989176510f, + -0.148247679f, 0.988950265f, + -0.149764535f, 0.988721692f, + -0.151281038f, 0.988490793f, + -0.152797185f, 0.988257568f, + -0.154312973f, 0.988022017f, + -0.155828398f, 0.987784142f, + -0.157343456f, 0.987543942f, + -0.158858143f, 0.987301418f, + -0.160372457f, 0.987056571f, + -0.161886394f, 0.986809402f, + -0.163399949f, 0.986559910f, + -0.164913120f, 0.986308097f, + -0.166425904f, 0.986053963f, + -0.167938295f, 0.985797509f, + -0.169450291f, 0.985538735f, + -0.170961889f, 0.985277642f, + -0.172473084f, 0.985014231f, + -0.173983873f, 0.984748502f, + -0.175494253f, 0.984480455f, + -0.177004220f, 0.984210092f, + -0.178513771f, 0.983937413f, + -0.180022901f, 0.983662419f, + -0.181531608f, 0.983385110f, + -0.183039888f, 0.983105487f, + -0.184547737f, 0.982823551f, + -0.186055152f, 0.982539302f, + -0.187562129f, 0.982252741f, + -0.189068664f, 0.981963869f, + -0.190574755f, 0.981672686f, + -0.192080397f, 0.981379193f, + -0.193585587f, 0.981083391f, + -0.195090322f, 0.980785280f, + -0.196594598f, 0.980484862f, + -0.198098411f, 0.980182136f, + -0.199601758f, 0.979877104f, + -0.201104635f, 0.979569766f, + -0.202607039f, 0.979260123f, + -0.204108966f, 0.978948175f, + -0.205610413f, 0.978633924f, + -0.207111376f, 0.978317371f, + -0.208611852f, 0.977998515f, + -0.210111837f, 0.977677358f, + -0.211611327f, 0.977353900f, + -0.213110320f, 0.977028143f, + -0.214608811f, 0.976700086f, + -0.216106797f, 0.976369731f, + -0.217604275f, 0.976037079f, + -0.219101240f, 0.975702130f, + -0.220597690f, 0.975364885f, + -0.222093621f, 0.975025345f, + -0.223589029f, 0.974683511f, + -0.225083911f, 0.974339383f, + -0.226578264f, 0.973992962f, + -0.228072083f, 0.973644250f, + -0.229565366f, 0.973293246f, + -0.231058108f, 0.972939952f, + -0.232550307f, 0.972584369f, + -0.234041959f, 0.972226497f, + -0.235533059f, 0.971866337f, + -0.237023606f, 0.971503891f, + -0.238513595f, 0.971139158f, + -0.240003022f, 0.970772141f, + -0.241491885f, 0.970402839f, + -0.242980180f, 0.970031253f, + -0.244467903f, 0.969657385f, + -0.245955050f, 0.969281235f, + -0.247441619f, 0.968902805f, + -0.248927606f, 0.968522094f, + -0.250413007f, 0.968139105f, + -0.251897818f, 0.967753837f, + -0.253382037f, 0.967366292f, + -0.254865660f, 0.966976471f, + -0.256348682f, 0.966584374f, + -0.257831102f, 0.966190003f, + -0.259312915f, 0.965793359f, + -0.260794118f, 0.965394442f, + -0.262274707f, 0.964993253f, + -0.263754679f, 0.964589793f, + -0.265234030f, 0.964184064f, + -0.266712757f, 0.963776066f, + -0.268190857f, 0.963365800f, + -0.269668326f, 0.962953267f, + -0.271145160f, 0.962538468f, + -0.272621355f, 0.962121404f, + -0.274096910f, 0.961702077f, + -0.275571819f, 0.961280486f, + -0.277046080f, 0.960856633f, + -0.278519689f, 0.960430519f, + -0.279992643f, 0.960002146f, + -0.281464938f, 0.959571513f, + -0.282936570f, 0.959138622f, + -0.284407537f, 0.958703475f, + -0.285877835f, 0.958266071f, + -0.287347460f, 0.957826413f, + -0.288816408f, 0.957384501f, + -0.290284677f, 0.956940336f, + -0.291752263f, 0.956493919f, + -0.293219163f, 0.956045251f, + -0.294685372f, 0.955594334f, + -0.296150888f, 0.955141168f, + -0.297615707f, 0.954685755f, + -0.299079826f, 0.954228095f, + -0.300543241f, 0.953768190f, + -0.302005949f, 0.953306040f, + -0.303467947f, 0.952841648f, + -0.304929230f, 0.952375013f, + -0.306389795f, 0.951906137f, + -0.307849640f, 0.951435021f, + -0.309308760f, 0.950961666f, + -0.310767153f, 0.950486074f, + -0.312224814f, 0.950008245f, + -0.313681740f, 0.949528181f, + -0.315137929f, 0.949045882f, + -0.316593376f, 0.948561350f, + -0.318048077f, 0.948074586f, + -0.319502031f, 0.947585591f, + -0.320955232f, 0.947094366f, + -0.322407679f, 0.946600913f, + -0.323859367f, 0.946105232f, + -0.325310292f, 0.945607325f, + -0.326760452f, 0.945107193f, + -0.328209844f, 0.944604837f, + -0.329658463f, 0.944100258f, + -0.331106306f, 0.943593458f, + -0.332553370f, 0.943084437f, + -0.333999651f, 0.942573198f, + -0.335445147f, 0.942059740f, + -0.336889853f, 0.941544065f, + -0.338333767f, 0.941026175f, + -0.339776884f, 0.940506071f, + -0.341219202f, 0.939983753f, + -0.342660717f, 0.939459224f, + -0.344101426f, 0.938932484f, + -0.345541325f, 0.938403534f, + -0.346980411f, 0.937872376f, + -0.348418680f, 0.937339012f, + -0.349856130f, 0.936803442f, + -0.351292756f, 0.936265667f, + -0.352728556f, 0.935725689f, + -0.354163525f, 0.935183510f, + -0.355597662f, 0.934639130f, + -0.357030961f, 0.934092550f, + -0.358463421f, 0.933543773f, + -0.359895037f, 0.932992799f, + -0.361325806f, 0.932439629f, + -0.362755724f, 0.931884266f, + -0.364184790f, 0.931326709f, + -0.365612998f, 0.930766961f, + -0.367040346f, 0.930205023f, + -0.368466830f, 0.929640896f, + -0.369892447f, 0.929074581f, + -0.371317194f, 0.928506080f, + -0.372741067f, 0.927935395f, + -0.374164063f, 0.927362526f, + -0.375586178f, 0.926787474f, + -0.377007410f, 0.926210242f, + -0.378427755f, 0.925630831f, + -0.379847209f, 0.925049241f, + -0.381265769f, 0.924465474f, + -0.382683432f, 0.923879533f, + -0.384100195f, 0.923291417f, + -0.385516054f, 0.922701128f, + -0.386931006f, 0.922108669f, + -0.388345047f, 0.921514039f, + -0.389758174f, 0.920917242f, + -0.391170384f, 0.920318277f, + -0.392581674f, 0.919717146f, + -0.393992040f, 0.919113852f, + -0.395401479f, 0.918508394f, + -0.396809987f, 0.917900776f, + -0.398217562f, 0.917290997f, + -0.399624200f, 0.916679060f, + -0.401029897f, 0.916064966f, + -0.402434651f, 0.915448716f, + -0.403838458f, 0.914830312f, + -0.405241314f, 0.914209756f, + -0.406643217f, 0.913587048f, + -0.408044163f, 0.912962190f, + -0.409444149f, 0.912335185f, + -0.410843171f, 0.911706032f, + -0.412241227f, 0.911074734f, + -0.413638312f, 0.910441292f, + -0.415034424f, 0.909805708f, + -0.416429560f, 0.909167983f, + -0.417823716f, 0.908528119f, + -0.419216888f, 0.907886116f, + -0.420609074f, 0.907241978f, + -0.422000271f, 0.906595705f, + -0.423390474f, 0.905947298f, + -0.424779681f, 0.905296759f, + -0.426167889f, 0.904644091f, + -0.427555093f, 0.903989293f, + -0.428941292f, 0.903332368f, + -0.430326481f, 0.902673318f, + -0.431710658f, 0.902012144f, + -0.433093819f, 0.901348847f, + -0.434475961f, 0.900683429f, + -0.435857080f, 0.900015892f, + -0.437237174f, 0.899346237f, + -0.438616239f, 0.898674466f, + -0.439994271f, 0.898000580f, + -0.441371269f, 0.897324581f, + -0.442747228f, 0.896646470f, + -0.444122145f, 0.895966250f, + -0.445496017f, 0.895283921f, + -0.446868840f, 0.894599486f, + -0.448240612f, 0.893912945f, + -0.449611330f, 0.893224301f, + -0.450980989f, 0.892533555f, + -0.452349587f, 0.891840709f, + -0.453717121f, 0.891145765f, + -0.455083587f, 0.890448723f, + -0.456448982f, 0.889749586f, + -0.457813304f, 0.889048356f, + -0.459176548f, 0.888345033f, + -0.460538711f, 0.887639620f, + -0.461899791f, 0.886932119f, + -0.463259784f, 0.886222530f, + -0.464618686f, 0.885510856f, + -0.465976496f, 0.884797098f, + -0.467333209f, 0.884081259f, + -0.468688822f, 0.883363339f, + -0.470043332f, 0.882643340f, + -0.471396737f, 0.881921264f, + -0.472749032f, 0.881197113f, + -0.474100215f, 0.880470889f, + -0.475450282f, 0.879742593f, + -0.476799230f, 0.879012226f, + -0.478147056f, 0.878279792f, + -0.479493758f, 0.877545290f, + -0.480839331f, 0.876808724f, + -0.482183772f, 0.876070094f, + -0.483527079f, 0.875329403f, + -0.484869248f, 0.874586652f, + -0.486210276f, 0.873841843f, + -0.487550160f, 0.873094978f, + -0.488888897f, 0.872346059f, + -0.490226483f, 0.871595087f, + -0.491562916f, 0.870842063f, + -0.492898192f, 0.870086991f, + -0.494232309f, 0.869329871f, + -0.495565262f, 0.868570706f, + -0.496897049f, 0.867809497f, + -0.498227667f, 0.867046246f, + -0.499557113f, 0.866280954f, + -0.500885383f, 0.865513624f, + -0.502212474f, 0.864744258f, + -0.503538384f, 0.863972856f, + -0.504863109f, 0.863199422f, + -0.506186645f, 0.862423956f, + -0.507508991f, 0.861646461f, + -0.508830143f, 0.860866939f, + -0.510150097f, 0.860085390f, + -0.511468850f, 0.859301818f, + -0.512786401f, 0.858516224f, + -0.514102744f, 0.857728610f, + -0.515417878f, 0.856938977f, + -0.516731799f, 0.856147328f, + -0.518044504f, 0.855353665f, + -0.519355990f, 0.854557988f, + -0.520666254f, 0.853760301f, + -0.521975293f, 0.852960605f, + -0.523283103f, 0.852158902f, + -0.524589683f, 0.851355193f, + -0.525895027f, 0.850549481f, + -0.527199135f, 0.849741768f, + -0.528502002f, 0.848932055f, + -0.529803625f, 0.848120345f, + -0.531104001f, 0.847306639f, + -0.532403128f, 0.846490939f, + -0.533701002f, 0.845673247f, + -0.534997620f, 0.844853565f, + -0.536292979f, 0.844031895f, + -0.537587076f, 0.843208240f, + -0.538879909f, 0.842382600f, + -0.540171473f, 0.841554977f, + -0.541461766f, 0.840725375f, + -0.542750785f, 0.839893794f, + -0.544038527f, 0.839060237f, + -0.545324988f, 0.838224706f, + -0.546610167f, 0.837387202f, + -0.547894059f, 0.836547727f, + -0.549176662f, 0.835706284f, + -0.550457973f, 0.834862875f, + -0.551737988f, 0.834017501f, + -0.553016706f, 0.833170165f, + -0.554294121f, 0.832320868f, + -0.555570233f, 0.831469612f, + -0.556845037f, 0.830616400f, + -0.558118531f, 0.829761234f, + -0.559390712f, 0.828904115f, + -0.560661576f, 0.828045045f, + -0.561931121f, 0.827184027f, + -0.563199344f, 0.826321063f, + -0.564466242f, 0.825456154f, + -0.565731811f, 0.824589303f, + -0.566996049f, 0.823720511f, + -0.568258953f, 0.822849781f, + -0.569520519f, 0.821977115f, + -0.570780746f, 0.821102515f, + -0.572039629f, 0.820225983f, + -0.573297167f, 0.819347520f, + -0.574553355f, 0.818467130f, + -0.575808191f, 0.817584813f, + -0.577061673f, 0.816700573f, + -0.578313796f, 0.815814411f, + -0.579564559f, 0.814926329f, + -0.580813958f, 0.814036330f, + -0.582061990f, 0.813144415f, + -0.583308653f, 0.812250587f, + -0.584553943f, 0.811354847f, + -0.585797857f, 0.810457198f, + -0.587040394f, 0.809557642f, + -0.588281548f, 0.808656182f, + -0.589521319f, 0.807752818f, + -0.590759702f, 0.806847554f, + -0.591996695f, 0.805940391f, + -0.593232295f, 0.805031331f, + -0.594466499f, 0.804120377f, + -0.595699304f, 0.803207531f, + -0.596930708f, 0.802292796f, + -0.598160707f, 0.801376172f, + -0.599389298f, 0.800457662f, + -0.600616479f, 0.799537269f, + -0.601842247f, 0.798614995f, + -0.603066599f, 0.797690841f, + -0.604289531f, 0.796764810f, + -0.605511041f, 0.795836905f, + -0.606731127f, 0.794907126f, + -0.607949785f, 0.793975478f, + -0.609167012f, 0.793041960f, + -0.610382806f, 0.792106577f, + -0.611597164f, 0.791169330f, + -0.612810082f, 0.790230221f, + -0.614021559f, 0.789289253f, + -0.615231591f, 0.788346428f, + -0.616440175f, 0.787401747f, + -0.617647308f, 0.786455214f, + -0.618852988f, 0.785506830f, + -0.620057212f, 0.784556597f, + -0.621259977f, 0.783604519f, + -0.622461279f, 0.782650596f, + -0.623661118f, 0.781694832f, + -0.624859488f, 0.780737229f, + -0.626056388f, 0.779777788f, + -0.627251815f, 0.778816512f, + -0.628445767f, 0.777853404f, + -0.629638239f, 0.776888466f, + -0.630829230f, 0.775921699f, + -0.632018736f, 0.774953107f, + -0.633206755f, 0.773982691f, + -0.634393284f, 0.773010453f, + -0.635578320f, 0.772036397f, + -0.636761861f, 0.771060524f, + -0.637943904f, 0.770082837f, + -0.639124445f, 0.769103338f, + -0.640303482f, 0.768122029f, + -0.641481013f, 0.767138912f, + -0.642657034f, 0.766153990f, + -0.643831543f, 0.765167266f, + -0.645004537f, 0.764178741f, + -0.646176013f, 0.763188417f, + -0.647345969f, 0.762196298f, + -0.648514401f, 0.761202385f, + -0.649681307f, 0.760206682f, + -0.650846685f, 0.759209189f, + -0.652010531f, 0.758209910f, + -0.653172843f, 0.757208847f, + -0.654333618f, 0.756206001f, + -0.655492853f, 0.755201377f, + -0.656650546f, 0.754194975f, + -0.657806693f, 0.753186799f, + -0.658961293f, 0.752176850f, + -0.660114342f, 0.751165132f, + -0.661265838f, 0.750151646f, + -0.662415778f, 0.749136395f, + -0.663564159f, 0.748119380f, + -0.664710978f, 0.747100606f, + -0.665856234f, 0.746080074f, + -0.666999922f, 0.745057785f, + -0.668142041f, 0.744033744f, + -0.669282588f, 0.743007952f, + -0.670421560f, 0.741980412f, + -0.671558955f, 0.740951125f, + -0.672694769f, 0.739920095f, + -0.673829000f, 0.738887324f, + -0.674961646f, 0.737852815f, + -0.676092704f, 0.736816569f, + -0.677222170f, 0.735778589f, + -0.678350043f, 0.734738878f, + -0.679476320f, 0.733697438f, + -0.680600998f, 0.732654272f, + -0.681724074f, 0.731609381f, + -0.682845546f, 0.730562769f, + -0.683965412f, 0.729514438f, + -0.685083668f, 0.728464390f, + -0.686200312f, 0.727412629f, + -0.687315341f, 0.726359155f, + -0.688428753f, 0.725303972f, + -0.689540545f, 0.724247083f, + -0.690650714f, 0.723188489f, + -0.691759258f, 0.722128194f, + -0.692866175f, 0.721066199f, + -0.693971461f, 0.720002508f, + -0.695075114f, 0.718937122f, + -0.696177131f, 0.717870045f, + -0.697277511f, 0.716801279f, + -0.698376249f, 0.715730825f, + -0.699473345f, 0.714658688f, + -0.700568794f, 0.713584869f, + -0.701662595f, 0.712509371f, + -0.702754744f, 0.711432196f, + -0.703845241f, 0.710353347f, + -0.704934080f, 0.709272826f, + -0.706021261f, 0.708190637f, + -0.707106781f, 0.707106781f, + -0.708190637f, 0.706021261f, + -0.709272826f, 0.704934080f, + -0.710353347f, 0.703845241f, + -0.711432196f, 0.702754744f, + -0.712509371f, 0.701662595f, + -0.713584869f, 0.700568794f, + -0.714658688f, 0.699473345f, + -0.715730825f, 0.698376249f, + -0.716801279f, 0.697277511f, + -0.717870045f, 0.696177131f, + -0.718937122f, 0.695075114f, + -0.720002508f, 0.693971461f, + -0.721066199f, 0.692866175f, + -0.722128194f, 0.691759258f, + -0.723188489f, 0.690650714f, + -0.724247083f, 0.689540545f, + -0.725303972f, 0.688428753f, + -0.726359155f, 0.687315341f, + -0.727412629f, 0.686200312f, + -0.728464390f, 0.685083668f, + -0.729514438f, 0.683965412f, + -0.730562769f, 0.682845546f, + -0.731609381f, 0.681724074f, + -0.732654272f, 0.680600998f, + -0.733697438f, 0.679476320f, + -0.734738878f, 0.678350043f, + -0.735778589f, 0.677222170f, + -0.736816569f, 0.676092704f, + -0.737852815f, 0.674961646f, + -0.738887324f, 0.673829000f, + -0.739920095f, 0.672694769f, + -0.740951125f, 0.671558955f, + -0.741980412f, 0.670421560f, + -0.743007952f, 0.669282588f, + -0.744033744f, 0.668142041f, + -0.745057785f, 0.666999922f, + -0.746080074f, 0.665856234f, + -0.747100606f, 0.664710978f, + -0.748119380f, 0.663564159f, + -0.749136395f, 0.662415778f, + -0.750151646f, 0.661265838f, + -0.751165132f, 0.660114342f, + -0.752176850f, 0.658961293f, + -0.753186799f, 0.657806693f, + -0.754194975f, 0.656650546f, + -0.755201377f, 0.655492853f, + -0.756206001f, 0.654333618f, + -0.757208847f, 0.653172843f, + -0.758209910f, 0.652010531f, + -0.759209189f, 0.650846685f, + -0.760206682f, 0.649681307f, + -0.761202385f, 0.648514401f, + -0.762196298f, 0.647345969f, + -0.763188417f, 0.646176013f, + -0.764178741f, 0.645004537f, + -0.765167266f, 0.643831543f, + -0.766153990f, 0.642657034f, + -0.767138912f, 0.641481013f, + -0.768122029f, 0.640303482f, + -0.769103338f, 0.639124445f, + -0.770082837f, 0.637943904f, + -0.771060524f, 0.636761861f, + -0.772036397f, 0.635578320f, + -0.773010453f, 0.634393284f, + -0.773982691f, 0.633206755f, + -0.774953107f, 0.632018736f, + -0.775921699f, 0.630829230f, + -0.776888466f, 0.629638239f, + -0.777853404f, 0.628445767f, + -0.778816512f, 0.627251815f, + -0.779777788f, 0.626056388f, + -0.780737229f, 0.624859488f, + -0.781694832f, 0.623661118f, + -0.782650596f, 0.622461279f, + -0.783604519f, 0.621259977f, + -0.784556597f, 0.620057212f, + -0.785506830f, 0.618852988f, + -0.786455214f, 0.617647308f, + -0.787401747f, 0.616440175f, + -0.788346428f, 0.615231591f, + -0.789289253f, 0.614021559f, + -0.790230221f, 0.612810082f, + -0.791169330f, 0.611597164f, + -0.792106577f, 0.610382806f, + -0.793041960f, 0.609167012f, + -0.793975478f, 0.607949785f, + -0.794907126f, 0.606731127f, + -0.795836905f, 0.605511041f, + -0.796764810f, 0.604289531f, + -0.797690841f, 0.603066599f, + -0.798614995f, 0.601842247f, + -0.799537269f, 0.600616479f, + -0.800457662f, 0.599389298f, + -0.801376172f, 0.598160707f, + -0.802292796f, 0.596930708f, + -0.803207531f, 0.595699304f, + -0.804120377f, 0.594466499f, + -0.805031331f, 0.593232295f, + -0.805940391f, 0.591996695f, + -0.806847554f, 0.590759702f, + -0.807752818f, 0.589521319f, + -0.808656182f, 0.588281548f, + -0.809557642f, 0.587040394f, + -0.810457198f, 0.585797857f, + -0.811354847f, 0.584553943f, + -0.812250587f, 0.583308653f, + -0.813144415f, 0.582061990f, + -0.814036330f, 0.580813958f, + -0.814926329f, 0.579564559f, + -0.815814411f, 0.578313796f, + -0.816700573f, 0.577061673f, + -0.817584813f, 0.575808191f, + -0.818467130f, 0.574553355f, + -0.819347520f, 0.573297167f, + -0.820225983f, 0.572039629f, + -0.821102515f, 0.570780746f, + -0.821977115f, 0.569520519f, + -0.822849781f, 0.568258953f, + -0.823720511f, 0.566996049f, + -0.824589303f, 0.565731811f, + -0.825456154f, 0.564466242f, + -0.826321063f, 0.563199344f, + -0.827184027f, 0.561931121f, + -0.828045045f, 0.560661576f, + -0.828904115f, 0.559390712f, + -0.829761234f, 0.558118531f, + -0.830616400f, 0.556845037f, + -0.831469612f, 0.555570233f, + -0.832320868f, 0.554294121f, + -0.833170165f, 0.553016706f, + -0.834017501f, 0.551737988f, + -0.834862875f, 0.550457973f, + -0.835706284f, 0.549176662f, + -0.836547727f, 0.547894059f, + -0.837387202f, 0.546610167f, + -0.838224706f, 0.545324988f, + -0.839060237f, 0.544038527f, + -0.839893794f, 0.542750785f, + -0.840725375f, 0.541461766f, + -0.841554977f, 0.540171473f, + -0.842382600f, 0.538879909f, + -0.843208240f, 0.537587076f, + -0.844031895f, 0.536292979f, + -0.844853565f, 0.534997620f, + -0.845673247f, 0.533701002f, + -0.846490939f, 0.532403128f, + -0.847306639f, 0.531104001f, + -0.848120345f, 0.529803625f, + -0.848932055f, 0.528502002f, + -0.849741768f, 0.527199135f, + -0.850549481f, 0.525895027f, + -0.851355193f, 0.524589683f, + -0.852158902f, 0.523283103f, + -0.852960605f, 0.521975293f, + -0.853760301f, 0.520666254f, + -0.854557988f, 0.519355990f, + -0.855353665f, 0.518044504f, + -0.856147328f, 0.516731799f, + -0.856938977f, 0.515417878f, + -0.857728610f, 0.514102744f, + -0.858516224f, 0.512786401f, + -0.859301818f, 0.511468850f, + -0.860085390f, 0.510150097f, + -0.860866939f, 0.508830143f, + -0.861646461f, 0.507508991f, + -0.862423956f, 0.506186645f, + -0.863199422f, 0.504863109f, + -0.863972856f, 0.503538384f, + -0.864744258f, 0.502212474f, + -0.865513624f, 0.500885383f, + -0.866280954f, 0.499557113f, + -0.867046246f, 0.498227667f, + -0.867809497f, 0.496897049f, + -0.868570706f, 0.495565262f, + -0.869329871f, 0.494232309f, + -0.870086991f, 0.492898192f, + -0.870842063f, 0.491562916f, + -0.871595087f, 0.490226483f, + -0.872346059f, 0.488888897f, + -0.873094978f, 0.487550160f, + -0.873841843f, 0.486210276f, + -0.874586652f, 0.484869248f, + -0.875329403f, 0.483527079f, + -0.876070094f, 0.482183772f, + -0.876808724f, 0.480839331f, + -0.877545290f, 0.479493758f, + -0.878279792f, 0.478147056f, + -0.879012226f, 0.476799230f, + -0.879742593f, 0.475450282f, + -0.880470889f, 0.474100215f, + -0.881197113f, 0.472749032f, + -0.881921264f, 0.471396737f, + -0.882643340f, 0.470043332f, + -0.883363339f, 0.468688822f, + -0.884081259f, 0.467333209f, + -0.884797098f, 0.465976496f, + -0.885510856f, 0.464618686f, + -0.886222530f, 0.463259784f, + -0.886932119f, 0.461899791f, + -0.887639620f, 0.460538711f, + -0.888345033f, 0.459176548f, + -0.889048356f, 0.457813304f, + -0.889749586f, 0.456448982f, + -0.890448723f, 0.455083587f, + -0.891145765f, 0.453717121f, + -0.891840709f, 0.452349587f, + -0.892533555f, 0.450980989f, + -0.893224301f, 0.449611330f, + -0.893912945f, 0.448240612f, + -0.894599486f, 0.446868840f, + -0.895283921f, 0.445496017f, + -0.895966250f, 0.444122145f, + -0.896646470f, 0.442747228f, + -0.897324581f, 0.441371269f, + -0.898000580f, 0.439994271f, + -0.898674466f, 0.438616239f, + -0.899346237f, 0.437237174f, + -0.900015892f, 0.435857080f, + -0.900683429f, 0.434475961f, + -0.901348847f, 0.433093819f, + -0.902012144f, 0.431710658f, + -0.902673318f, 0.430326481f, + -0.903332368f, 0.428941292f, + -0.903989293f, 0.427555093f, + -0.904644091f, 0.426167889f, + -0.905296759f, 0.424779681f, + -0.905947298f, 0.423390474f, + -0.906595705f, 0.422000271f, + -0.907241978f, 0.420609074f, + -0.907886116f, 0.419216888f, + -0.908528119f, 0.417823716f, + -0.909167983f, 0.416429560f, + -0.909805708f, 0.415034424f, + -0.910441292f, 0.413638312f, + -0.911074734f, 0.412241227f, + -0.911706032f, 0.410843171f, + -0.912335185f, 0.409444149f, + -0.912962190f, 0.408044163f, + -0.913587048f, 0.406643217f, + -0.914209756f, 0.405241314f, + -0.914830312f, 0.403838458f, + -0.915448716f, 0.402434651f, + -0.916064966f, 0.401029897f, + -0.916679060f, 0.399624200f, + -0.917290997f, 0.398217562f, + -0.917900776f, 0.396809987f, + -0.918508394f, 0.395401479f, + -0.919113852f, 0.393992040f, + -0.919717146f, 0.392581674f, + -0.920318277f, 0.391170384f, + -0.920917242f, 0.389758174f, + -0.921514039f, 0.388345047f, + -0.922108669f, 0.386931006f, + -0.922701128f, 0.385516054f, + -0.923291417f, 0.384100195f, + -0.923879533f, 0.382683432f, + -0.924465474f, 0.381265769f, + -0.925049241f, 0.379847209f, + -0.925630831f, 0.378427755f, + -0.926210242f, 0.377007410f, + -0.926787474f, 0.375586178f, + -0.927362526f, 0.374164063f, + -0.927935395f, 0.372741067f, + -0.928506080f, 0.371317194f, + -0.929074581f, 0.369892447f, + -0.929640896f, 0.368466830f, + -0.930205023f, 0.367040346f, + -0.930766961f, 0.365612998f, + -0.931326709f, 0.364184790f, + -0.931884266f, 0.362755724f, + -0.932439629f, 0.361325806f, + -0.932992799f, 0.359895037f, + -0.933543773f, 0.358463421f, + -0.934092550f, 0.357030961f, + -0.934639130f, 0.355597662f, + -0.935183510f, 0.354163525f, + -0.935725689f, 0.352728556f, + -0.936265667f, 0.351292756f, + -0.936803442f, 0.349856130f, + -0.937339012f, 0.348418680f, + -0.937872376f, 0.346980411f, + -0.938403534f, 0.345541325f, + -0.938932484f, 0.344101426f, + -0.939459224f, 0.342660717f, + -0.939983753f, 0.341219202f, + -0.940506071f, 0.339776884f, + -0.941026175f, 0.338333767f, + -0.941544065f, 0.336889853f, + -0.942059740f, 0.335445147f, + -0.942573198f, 0.333999651f, + -0.943084437f, 0.332553370f, + -0.943593458f, 0.331106306f, + -0.944100258f, 0.329658463f, + -0.944604837f, 0.328209844f, + -0.945107193f, 0.326760452f, + -0.945607325f, 0.325310292f, + -0.946105232f, 0.323859367f, + -0.946600913f, 0.322407679f, + -0.947094366f, 0.320955232f, + -0.947585591f, 0.319502031f, + -0.948074586f, 0.318048077f, + -0.948561350f, 0.316593376f, + -0.949045882f, 0.315137929f, + -0.949528181f, 0.313681740f, + -0.950008245f, 0.312224814f, + -0.950486074f, 0.310767153f, + -0.950961666f, 0.309308760f, + -0.951435021f, 0.307849640f, + -0.951906137f, 0.306389795f, + -0.952375013f, 0.304929230f, + -0.952841648f, 0.303467947f, + -0.953306040f, 0.302005949f, + -0.953768190f, 0.300543241f, + -0.954228095f, 0.299079826f, + -0.954685755f, 0.297615707f, + -0.955141168f, 0.296150888f, + -0.955594334f, 0.294685372f, + -0.956045251f, 0.293219163f, + -0.956493919f, 0.291752263f, + -0.956940336f, 0.290284677f, + -0.957384501f, 0.288816408f, + -0.957826413f, 0.287347460f, + -0.958266071f, 0.285877835f, + -0.958703475f, 0.284407537f, + -0.959138622f, 0.282936570f, + -0.959571513f, 0.281464938f, + -0.960002146f, 0.279992643f, + -0.960430519f, 0.278519689f, + -0.960856633f, 0.277046080f, + -0.961280486f, 0.275571819f, + -0.961702077f, 0.274096910f, + -0.962121404f, 0.272621355f, + -0.962538468f, 0.271145160f, + -0.962953267f, 0.269668326f, + -0.963365800f, 0.268190857f, + -0.963776066f, 0.266712757f, + -0.964184064f, 0.265234030f, + -0.964589793f, 0.263754679f, + -0.964993253f, 0.262274707f, + -0.965394442f, 0.260794118f, + -0.965793359f, 0.259312915f, + -0.966190003f, 0.257831102f, + -0.966584374f, 0.256348682f, + -0.966976471f, 0.254865660f, + -0.967366292f, 0.253382037f, + -0.967753837f, 0.251897818f, + -0.968139105f, 0.250413007f, + -0.968522094f, 0.248927606f, + -0.968902805f, 0.247441619f, + -0.969281235f, 0.245955050f, + -0.969657385f, 0.244467903f, + -0.970031253f, 0.242980180f, + -0.970402839f, 0.241491885f, + -0.970772141f, 0.240003022f, + -0.971139158f, 0.238513595f, + -0.971503891f, 0.237023606f, + -0.971866337f, 0.235533059f, + -0.972226497f, 0.234041959f, + -0.972584369f, 0.232550307f, + -0.972939952f, 0.231058108f, + -0.973293246f, 0.229565366f, + -0.973644250f, 0.228072083f, + -0.973992962f, 0.226578264f, + -0.974339383f, 0.225083911f, + -0.974683511f, 0.223589029f, + -0.975025345f, 0.222093621f, + -0.975364885f, 0.220597690f, + -0.975702130f, 0.219101240f, + -0.976037079f, 0.217604275f, + -0.976369731f, 0.216106797f, + -0.976700086f, 0.214608811f, + -0.977028143f, 0.213110320f, + -0.977353900f, 0.211611327f, + -0.977677358f, 0.210111837f, + -0.977998515f, 0.208611852f, + -0.978317371f, 0.207111376f, + -0.978633924f, 0.205610413f, + -0.978948175f, 0.204108966f, + -0.979260123f, 0.202607039f, + -0.979569766f, 0.201104635f, + -0.979877104f, 0.199601758f, + -0.980182136f, 0.198098411f, + -0.980484862f, 0.196594598f, + -0.980785280f, 0.195090322f, + -0.981083391f, 0.193585587f, + -0.981379193f, 0.192080397f, + -0.981672686f, 0.190574755f, + -0.981963869f, 0.189068664f, + -0.982252741f, 0.187562129f, + -0.982539302f, 0.186055152f, + -0.982823551f, 0.184547737f, + -0.983105487f, 0.183039888f, + -0.983385110f, 0.181531608f, + -0.983662419f, 0.180022901f, + -0.983937413f, 0.178513771f, + -0.984210092f, 0.177004220f, + -0.984480455f, 0.175494253f, + -0.984748502f, 0.173983873f, + -0.985014231f, 0.172473084f, + -0.985277642f, 0.170961889f, + -0.985538735f, 0.169450291f, + -0.985797509f, 0.167938295f, + -0.986053963f, 0.166425904f, + -0.986308097f, 0.164913120f, + -0.986559910f, 0.163399949f, + -0.986809402f, 0.161886394f, + -0.987056571f, 0.160372457f, + -0.987301418f, 0.158858143f, + -0.987543942f, 0.157343456f, + -0.987784142f, 0.155828398f, + -0.988022017f, 0.154312973f, + -0.988257568f, 0.152797185f, + -0.988490793f, 0.151281038f, + -0.988721692f, 0.149764535f, + -0.988950265f, 0.148247679f, + -0.989176510f, 0.146730474f, + -0.989400428f, 0.145212925f, + -0.989622017f, 0.143695033f, + -0.989841278f, 0.142176804f, + -0.990058210f, 0.140658239f, + -0.990272812f, 0.139139344f, + -0.990485084f, 0.137620122f, + -0.990695025f, 0.136100575f, + -0.990902635f, 0.134580709f, + -0.991107914f, 0.133060525f, + -0.991310860f, 0.131540029f, + -0.991511473f, 0.130019223f, + -0.991709754f, 0.128498111f, + -0.991905700f, 0.126976696f, + -0.992099313f, 0.125454983f, + -0.992290591f, 0.123932975f, + -0.992479535f, 0.122410675f, + -0.992666142f, 0.120888087f, + -0.992850414f, 0.119365215f, + -0.993032350f, 0.117842062f, + -0.993211949f, 0.116318631f, + -0.993389211f, 0.114794927f, + -0.993564136f, 0.113270952f, + -0.993736722f, 0.111746711f, + -0.993906970f, 0.110222207f, + -0.994074879f, 0.108697444f, + -0.994240449f, 0.107172425f, + -0.994403680f, 0.105647154f, + -0.994564571f, 0.104121634f, + -0.994723121f, 0.102595869f, + -0.994879331f, 0.101069863f, + -0.995033199f, 0.099543619f, + -0.995184727f, 0.098017140f, + -0.995333912f, 0.096490431f, + -0.995480755f, 0.094963495f, + -0.995625256f, 0.093436336f, + -0.995767414f, 0.091908956f, + -0.995907229f, 0.090381361f, + -0.996044701f, 0.088853553f, + -0.996179829f, 0.087325535f, + -0.996312612f, 0.085797312f, + -0.996443051f, 0.084268888f, + -0.996571146f, 0.082740265f, + -0.996696895f, 0.081211447f, + -0.996820299f, 0.079682438f, + -0.996941358f, 0.078153242f, + -0.997060070f, 0.076623861f, + -0.997176437f, 0.075094301f, + -0.997290457f, 0.073564564f, + -0.997402130f, 0.072034653f, + -0.997511456f, 0.070504573f, + -0.997618435f, 0.068974328f, + -0.997723067f, 0.067443920f, + -0.997825350f, 0.065913353f, + -0.997925286f, 0.064382631f, + -0.998022874f, 0.062851758f, + -0.998118113f, 0.061320736f, + -0.998211003f, 0.059789571f, + -0.998301545f, 0.058258265f, + -0.998389737f, 0.056726821f, + -0.998475581f, 0.055195244f, + -0.998559074f, 0.053663538f, + -0.998640218f, 0.052131705f, + -0.998719012f, 0.050599749f, + -0.998795456f, 0.049067674f, + -0.998869550f, 0.047535484f, + -0.998941293f, 0.046003182f, + -0.999010686f, 0.044470772f, + -0.999077728f, 0.042938257f, + -0.999142419f, 0.041405641f, + -0.999204759f, 0.039872928f, + -0.999264747f, 0.038340120f, + -0.999322385f, 0.036807223f, + -0.999377670f, 0.035274239f, + -0.999430605f, 0.033741172f, + -0.999481187f, 0.032208025f, + -0.999529418f, 0.030674803f, + -0.999575296f, 0.029141509f, + -0.999618822f, 0.027608146f, + -0.999659997f, 0.026074718f, + -0.999698819f, 0.024541229f, + -0.999735288f, 0.023007681f, + -0.999769405f, 0.021474080f, + -0.999801170f, 0.019940429f, + -0.999830582f, 0.018406730f, + -0.999857641f, 0.016872988f, + -0.999882347f, 0.015339206f, + -0.999904701f, 0.013805389f, + -0.999924702f, 0.012271538f, + -0.999942350f, 0.010737659f, + -0.999957645f, 0.009203755f, + -0.999970586f, 0.007669829f, + -0.999981175f, 0.006135885f, + -0.999989411f, 0.004601926f, + -0.999995294f, 0.003067957f, + -0.999998823f, 0.001533980f, + -1.000000000f, 0.000000000f, + -0.999998823f, -0.001533980f, + -0.999995294f, -0.003067957f, + -0.999989411f, -0.004601926f, + -0.999981175f, -0.006135885f, + -0.999970586f, -0.007669829f, + -0.999957645f, -0.009203755f, + -0.999942350f, -0.010737659f, + -0.999924702f, -0.012271538f, + -0.999904701f, -0.013805389f, + -0.999882347f, -0.015339206f, + -0.999857641f, -0.016872988f, + -0.999830582f, -0.018406730f, + -0.999801170f, -0.019940429f, + -0.999769405f, -0.021474080f, + -0.999735288f, -0.023007681f, + -0.999698819f, -0.024541229f, + -0.999659997f, -0.026074718f, + -0.999618822f, -0.027608146f, + -0.999575296f, -0.029141509f, + -0.999529418f, -0.030674803f, + -0.999481187f, -0.032208025f, + -0.999430605f, -0.033741172f, + -0.999377670f, -0.035274239f, + -0.999322385f, -0.036807223f, + -0.999264747f, -0.038340120f, + -0.999204759f, -0.039872928f, + -0.999142419f, -0.041405641f, + -0.999077728f, -0.042938257f, + -0.999010686f, -0.044470772f, + -0.998941293f, -0.046003182f, + -0.998869550f, -0.047535484f, + -0.998795456f, -0.049067674f, + -0.998719012f, -0.050599749f, + -0.998640218f, -0.052131705f, + -0.998559074f, -0.053663538f, + -0.998475581f, -0.055195244f, + -0.998389737f, -0.056726821f, + -0.998301545f, -0.058258265f, + -0.998211003f, -0.059789571f, + -0.998118113f, -0.061320736f, + -0.998022874f, -0.062851758f, + -0.997925286f, -0.064382631f, + -0.997825350f, -0.065913353f, + -0.997723067f, -0.067443920f, + -0.997618435f, -0.068974328f, + -0.997511456f, -0.070504573f, + -0.997402130f, -0.072034653f, + -0.997290457f, -0.073564564f, + -0.997176437f, -0.075094301f, + -0.997060070f, -0.076623861f, + -0.996941358f, -0.078153242f, + -0.996820299f, -0.079682438f, + -0.996696895f, -0.081211447f, + -0.996571146f, -0.082740265f, + -0.996443051f, -0.084268888f, + -0.996312612f, -0.085797312f, + -0.996179829f, -0.087325535f, + -0.996044701f, -0.088853553f, + -0.995907229f, -0.090381361f, + -0.995767414f, -0.091908956f, + -0.995625256f, -0.093436336f, + -0.995480755f, -0.094963495f, + -0.995333912f, -0.096490431f, + -0.995184727f, -0.098017140f, + -0.995033199f, -0.099543619f, + -0.994879331f, -0.101069863f, + -0.994723121f, -0.102595869f, + -0.994564571f, -0.104121634f, + -0.994403680f, -0.105647154f, + -0.994240449f, -0.107172425f, + -0.994074879f, -0.108697444f, + -0.993906970f, -0.110222207f, + -0.993736722f, -0.111746711f, + -0.993564136f, -0.113270952f, + -0.993389211f, -0.114794927f, + -0.993211949f, -0.116318631f, + -0.993032350f, -0.117842062f, + -0.992850414f, -0.119365215f, + -0.992666142f, -0.120888087f, + -0.992479535f, -0.122410675f, + -0.992290591f, -0.123932975f, + -0.992099313f, -0.125454983f, + -0.991905700f, -0.126976696f, + -0.991709754f, -0.128498111f, + -0.991511473f, -0.130019223f, + -0.991310860f, -0.131540029f, + -0.991107914f, -0.133060525f, + -0.990902635f, -0.134580709f, + -0.990695025f, -0.136100575f, + -0.990485084f, -0.137620122f, + -0.990272812f, -0.139139344f, + -0.990058210f, -0.140658239f, + -0.989841278f, -0.142176804f, + -0.989622017f, -0.143695033f, + -0.989400428f, -0.145212925f, + -0.989176510f, -0.146730474f, + -0.988950265f, -0.148247679f, + -0.988721692f, -0.149764535f, + -0.988490793f, -0.151281038f, + -0.988257568f, -0.152797185f, + -0.988022017f, -0.154312973f, + -0.987784142f, -0.155828398f, + -0.987543942f, -0.157343456f, + -0.987301418f, -0.158858143f, + -0.987056571f, -0.160372457f, + -0.986809402f, -0.161886394f, + -0.986559910f, -0.163399949f, + -0.986308097f, -0.164913120f, + -0.986053963f, -0.166425904f, + -0.985797509f, -0.167938295f, + -0.985538735f, -0.169450291f, + -0.985277642f, -0.170961889f, + -0.985014231f, -0.172473084f, + -0.984748502f, -0.173983873f, + -0.984480455f, -0.175494253f, + -0.984210092f, -0.177004220f, + -0.983937413f, -0.178513771f, + -0.983662419f, -0.180022901f, + -0.983385110f, -0.181531608f, + -0.983105487f, -0.183039888f, + -0.982823551f, -0.184547737f, + -0.982539302f, -0.186055152f, + -0.982252741f, -0.187562129f, + -0.981963869f, -0.189068664f, + -0.981672686f, -0.190574755f, + -0.981379193f, -0.192080397f, + -0.981083391f, -0.193585587f, + -0.980785280f, -0.195090322f, + -0.980484862f, -0.196594598f, + -0.980182136f, -0.198098411f, + -0.979877104f, -0.199601758f, + -0.979569766f, -0.201104635f, + -0.979260123f, -0.202607039f, + -0.978948175f, -0.204108966f, + -0.978633924f, -0.205610413f, + -0.978317371f, -0.207111376f, + -0.977998515f, -0.208611852f, + -0.977677358f, -0.210111837f, + -0.977353900f, -0.211611327f, + -0.977028143f, -0.213110320f, + -0.976700086f, -0.214608811f, + -0.976369731f, -0.216106797f, + -0.976037079f, -0.217604275f, + -0.975702130f, -0.219101240f, + -0.975364885f, -0.220597690f, + -0.975025345f, -0.222093621f, + -0.974683511f, -0.223589029f, + -0.974339383f, -0.225083911f, + -0.973992962f, -0.226578264f, + -0.973644250f, -0.228072083f, + -0.973293246f, -0.229565366f, + -0.972939952f, -0.231058108f, + -0.972584369f, -0.232550307f, + -0.972226497f, -0.234041959f, + -0.971866337f, -0.235533059f, + -0.971503891f, -0.237023606f, + -0.971139158f, -0.238513595f, + -0.970772141f, -0.240003022f, + -0.970402839f, -0.241491885f, + -0.970031253f, -0.242980180f, + -0.969657385f, -0.244467903f, + -0.969281235f, -0.245955050f, + -0.968902805f, -0.247441619f, + -0.968522094f, -0.248927606f, + -0.968139105f, -0.250413007f, + -0.967753837f, -0.251897818f, + -0.967366292f, -0.253382037f, + -0.966976471f, -0.254865660f, + -0.966584374f, -0.256348682f, + -0.966190003f, -0.257831102f, + -0.965793359f, -0.259312915f, + -0.965394442f, -0.260794118f, + -0.964993253f, -0.262274707f, + -0.964589793f, -0.263754679f, + -0.964184064f, -0.265234030f, + -0.963776066f, -0.266712757f, + -0.963365800f, -0.268190857f, + -0.962953267f, -0.269668326f, + -0.962538468f, -0.271145160f, + -0.962121404f, -0.272621355f, + -0.961702077f, -0.274096910f, + -0.961280486f, -0.275571819f, + -0.960856633f, -0.277046080f, + -0.960430519f, -0.278519689f, + -0.960002146f, -0.279992643f, + -0.959571513f, -0.281464938f, + -0.959138622f, -0.282936570f, + -0.958703475f, -0.284407537f, + -0.958266071f, -0.285877835f, + -0.957826413f, -0.287347460f, + -0.957384501f, -0.288816408f, + -0.956940336f, -0.290284677f, + -0.956493919f, -0.291752263f, + -0.956045251f, -0.293219163f, + -0.955594334f, -0.294685372f, + -0.955141168f, -0.296150888f, + -0.954685755f, -0.297615707f, + -0.954228095f, -0.299079826f, + -0.953768190f, -0.300543241f, + -0.953306040f, -0.302005949f, + -0.952841648f, -0.303467947f, + -0.952375013f, -0.304929230f, + -0.951906137f, -0.306389795f, + -0.951435021f, -0.307849640f, + -0.950961666f, -0.309308760f, + -0.950486074f, -0.310767153f, + -0.950008245f, -0.312224814f, + -0.949528181f, -0.313681740f, + -0.949045882f, -0.315137929f, + -0.948561350f, -0.316593376f, + -0.948074586f, -0.318048077f, + -0.947585591f, -0.319502031f, + -0.947094366f, -0.320955232f, + -0.946600913f, -0.322407679f, + -0.946105232f, -0.323859367f, + -0.945607325f, -0.325310292f, + -0.945107193f, -0.326760452f, + -0.944604837f, -0.328209844f, + -0.944100258f, -0.329658463f, + -0.943593458f, -0.331106306f, + -0.943084437f, -0.332553370f, + -0.942573198f, -0.333999651f, + -0.942059740f, -0.335445147f, + -0.941544065f, -0.336889853f, + -0.941026175f, -0.338333767f, + -0.940506071f, -0.339776884f, + -0.939983753f, -0.341219202f, + -0.939459224f, -0.342660717f, + -0.938932484f, -0.344101426f, + -0.938403534f, -0.345541325f, + -0.937872376f, -0.346980411f, + -0.937339012f, -0.348418680f, + -0.936803442f, -0.349856130f, + -0.936265667f, -0.351292756f, + -0.935725689f, -0.352728556f, + -0.935183510f, -0.354163525f, + -0.934639130f, -0.355597662f, + -0.934092550f, -0.357030961f, + -0.933543773f, -0.358463421f, + -0.932992799f, -0.359895037f, + -0.932439629f, -0.361325806f, + -0.931884266f, -0.362755724f, + -0.931326709f, -0.364184790f, + -0.930766961f, -0.365612998f, + -0.930205023f, -0.367040346f, + -0.929640896f, -0.368466830f, + -0.929074581f, -0.369892447f, + -0.928506080f, -0.371317194f, + -0.927935395f, -0.372741067f, + -0.927362526f, -0.374164063f, + -0.926787474f, -0.375586178f, + -0.926210242f, -0.377007410f, + -0.925630831f, -0.378427755f, + -0.925049241f, -0.379847209f, + -0.924465474f, -0.381265769f, + -0.923879533f, -0.382683432f, + -0.923291417f, -0.384100195f, + -0.922701128f, -0.385516054f, + -0.922108669f, -0.386931006f, + -0.921514039f, -0.388345047f, + -0.920917242f, -0.389758174f, + -0.920318277f, -0.391170384f, + -0.919717146f, -0.392581674f, + -0.919113852f, -0.393992040f, + -0.918508394f, -0.395401479f, + -0.917900776f, -0.396809987f, + -0.917290997f, -0.398217562f, + -0.916679060f, -0.399624200f, + -0.916064966f, -0.401029897f, + -0.915448716f, -0.402434651f, + -0.914830312f, -0.403838458f, + -0.914209756f, -0.405241314f, + -0.913587048f, -0.406643217f, + -0.912962190f, -0.408044163f, + -0.912335185f, -0.409444149f, + -0.911706032f, -0.410843171f, + -0.911074734f, -0.412241227f, + -0.910441292f, -0.413638312f, + -0.909805708f, -0.415034424f, + -0.909167983f, -0.416429560f, + -0.908528119f, -0.417823716f, + -0.907886116f, -0.419216888f, + -0.907241978f, -0.420609074f, + -0.906595705f, -0.422000271f, + -0.905947298f, -0.423390474f, + -0.905296759f, -0.424779681f, + -0.904644091f, -0.426167889f, + -0.903989293f, -0.427555093f, + -0.903332368f, -0.428941292f, + -0.902673318f, -0.430326481f, + -0.902012144f, -0.431710658f, + -0.901348847f, -0.433093819f, + -0.900683429f, -0.434475961f, + -0.900015892f, -0.435857080f, + -0.899346237f, -0.437237174f, + -0.898674466f, -0.438616239f, + -0.898000580f, -0.439994271f, + -0.897324581f, -0.441371269f, + -0.896646470f, -0.442747228f, + -0.895966250f, -0.444122145f, + -0.895283921f, -0.445496017f, + -0.894599486f, -0.446868840f, + -0.893912945f, -0.448240612f, + -0.893224301f, -0.449611330f, + -0.892533555f, -0.450980989f, + -0.891840709f, -0.452349587f, + -0.891145765f, -0.453717121f, + -0.890448723f, -0.455083587f, + -0.889749586f, -0.456448982f, + -0.889048356f, -0.457813304f, + -0.888345033f, -0.459176548f, + -0.887639620f, -0.460538711f, + -0.886932119f, -0.461899791f, + -0.886222530f, -0.463259784f, + -0.885510856f, -0.464618686f, + -0.884797098f, -0.465976496f, + -0.884081259f, -0.467333209f, + -0.883363339f, -0.468688822f, + -0.882643340f, -0.470043332f, + -0.881921264f, -0.471396737f, + -0.881197113f, -0.472749032f, + -0.880470889f, -0.474100215f, + -0.879742593f, -0.475450282f, + -0.879012226f, -0.476799230f, + -0.878279792f, -0.478147056f, + -0.877545290f, -0.479493758f, + -0.876808724f, -0.480839331f, + -0.876070094f, -0.482183772f, + -0.875329403f, -0.483527079f, + -0.874586652f, -0.484869248f, + -0.873841843f, -0.486210276f, + -0.873094978f, -0.487550160f, + -0.872346059f, -0.488888897f, + -0.871595087f, -0.490226483f, + -0.870842063f, -0.491562916f, + -0.870086991f, -0.492898192f, + -0.869329871f, -0.494232309f, + -0.868570706f, -0.495565262f, + -0.867809497f, -0.496897049f, + -0.867046246f, -0.498227667f, + -0.866280954f, -0.499557113f, + -0.865513624f, -0.500885383f, + -0.864744258f, -0.502212474f, + -0.863972856f, -0.503538384f, + -0.863199422f, -0.504863109f, + -0.862423956f, -0.506186645f, + -0.861646461f, -0.507508991f, + -0.860866939f, -0.508830143f, + -0.860085390f, -0.510150097f, + -0.859301818f, -0.511468850f, + -0.858516224f, -0.512786401f, + -0.857728610f, -0.514102744f, + -0.856938977f, -0.515417878f, + -0.856147328f, -0.516731799f, + -0.855353665f, -0.518044504f, + -0.854557988f, -0.519355990f, + -0.853760301f, -0.520666254f, + -0.852960605f, -0.521975293f, + -0.852158902f, -0.523283103f, + -0.851355193f, -0.524589683f, + -0.850549481f, -0.525895027f, + -0.849741768f, -0.527199135f, + -0.848932055f, -0.528502002f, + -0.848120345f, -0.529803625f, + -0.847306639f, -0.531104001f, + -0.846490939f, -0.532403128f, + -0.845673247f, -0.533701002f, + -0.844853565f, -0.534997620f, + -0.844031895f, -0.536292979f, + -0.843208240f, -0.537587076f, + -0.842382600f, -0.538879909f, + -0.841554977f, -0.540171473f, + -0.840725375f, -0.541461766f, + -0.839893794f, -0.542750785f, + -0.839060237f, -0.544038527f, + -0.838224706f, -0.545324988f, + -0.837387202f, -0.546610167f, + -0.836547727f, -0.547894059f, + -0.835706284f, -0.549176662f, + -0.834862875f, -0.550457973f, + -0.834017501f, -0.551737988f, + -0.833170165f, -0.553016706f, + -0.832320868f, -0.554294121f, + -0.831469612f, -0.555570233f, + -0.830616400f, -0.556845037f, + -0.829761234f, -0.558118531f, + -0.828904115f, -0.559390712f, + -0.828045045f, -0.560661576f, + -0.827184027f, -0.561931121f, + -0.826321063f, -0.563199344f, + -0.825456154f, -0.564466242f, + -0.824589303f, -0.565731811f, + -0.823720511f, -0.566996049f, + -0.822849781f, -0.568258953f, + -0.821977115f, -0.569520519f, + -0.821102515f, -0.570780746f, + -0.820225983f, -0.572039629f, + -0.819347520f, -0.573297167f, + -0.818467130f, -0.574553355f, + -0.817584813f, -0.575808191f, + -0.816700573f, -0.577061673f, + -0.815814411f, -0.578313796f, + -0.814926329f, -0.579564559f, + -0.814036330f, -0.580813958f, + -0.813144415f, -0.582061990f, + -0.812250587f, -0.583308653f, + -0.811354847f, -0.584553943f, + -0.810457198f, -0.585797857f, + -0.809557642f, -0.587040394f, + -0.808656182f, -0.588281548f, + -0.807752818f, -0.589521319f, + -0.806847554f, -0.590759702f, + -0.805940391f, -0.591996695f, + -0.805031331f, -0.593232295f, + -0.804120377f, -0.594466499f, + -0.803207531f, -0.595699304f, + -0.802292796f, -0.596930708f, + -0.801376172f, -0.598160707f, + -0.800457662f, -0.599389298f, + -0.799537269f, -0.600616479f, + -0.798614995f, -0.601842247f, + -0.797690841f, -0.603066599f, + -0.796764810f, -0.604289531f, + -0.795836905f, -0.605511041f, + -0.794907126f, -0.606731127f, + -0.793975478f, -0.607949785f, + -0.793041960f, -0.609167012f, + -0.792106577f, -0.610382806f, + -0.791169330f, -0.611597164f, + -0.790230221f, -0.612810082f, + -0.789289253f, -0.614021559f, + -0.788346428f, -0.615231591f, + -0.787401747f, -0.616440175f, + -0.786455214f, -0.617647308f, + -0.785506830f, -0.618852988f, + -0.784556597f, -0.620057212f, + -0.783604519f, -0.621259977f, + -0.782650596f, -0.622461279f, + -0.781694832f, -0.623661118f, + -0.780737229f, -0.624859488f, + -0.779777788f, -0.626056388f, + -0.778816512f, -0.627251815f, + -0.777853404f, -0.628445767f, + -0.776888466f, -0.629638239f, + -0.775921699f, -0.630829230f, + -0.774953107f, -0.632018736f, + -0.773982691f, -0.633206755f, + -0.773010453f, -0.634393284f, + -0.772036397f, -0.635578320f, + -0.771060524f, -0.636761861f, + -0.770082837f, -0.637943904f, + -0.769103338f, -0.639124445f, + -0.768122029f, -0.640303482f, + -0.767138912f, -0.641481013f, + -0.766153990f, -0.642657034f, + -0.765167266f, -0.643831543f, + -0.764178741f, -0.645004537f, + -0.763188417f, -0.646176013f, + -0.762196298f, -0.647345969f, + -0.761202385f, -0.648514401f, + -0.760206682f, -0.649681307f, + -0.759209189f, -0.650846685f, + -0.758209910f, -0.652010531f, + -0.757208847f, -0.653172843f, + -0.756206001f, -0.654333618f, + -0.755201377f, -0.655492853f, + -0.754194975f, -0.656650546f, + -0.753186799f, -0.657806693f, + -0.752176850f, -0.658961293f, + -0.751165132f, -0.660114342f, + -0.750151646f, -0.661265838f, + -0.749136395f, -0.662415778f, + -0.748119380f, -0.663564159f, + -0.747100606f, -0.664710978f, + -0.746080074f, -0.665856234f, + -0.745057785f, -0.666999922f, + -0.744033744f, -0.668142041f, + -0.743007952f, -0.669282588f, + -0.741980412f, -0.670421560f, + -0.740951125f, -0.671558955f, + -0.739920095f, -0.672694769f, + -0.738887324f, -0.673829000f, + -0.737852815f, -0.674961646f, + -0.736816569f, -0.676092704f, + -0.735778589f, -0.677222170f, + -0.734738878f, -0.678350043f, + -0.733697438f, -0.679476320f, + -0.732654272f, -0.680600998f, + -0.731609381f, -0.681724074f, + -0.730562769f, -0.682845546f, + -0.729514438f, -0.683965412f, + -0.728464390f, -0.685083668f, + -0.727412629f, -0.686200312f, + -0.726359155f, -0.687315341f, + -0.725303972f, -0.688428753f, + -0.724247083f, -0.689540545f, + -0.723188489f, -0.690650714f, + -0.722128194f, -0.691759258f, + -0.721066199f, -0.692866175f, + -0.720002508f, -0.693971461f, + -0.718937122f, -0.695075114f, + -0.717870045f, -0.696177131f, + -0.716801279f, -0.697277511f, + -0.715730825f, -0.698376249f, + -0.714658688f, -0.699473345f, + -0.713584869f, -0.700568794f, + -0.712509371f, -0.701662595f, + -0.711432196f, -0.702754744f, + -0.710353347f, -0.703845241f, + -0.709272826f, -0.704934080f, + -0.708190637f, -0.706021261f, + -0.707106781f, -0.707106781f, + -0.706021261f, -0.708190637f, + -0.704934080f, -0.709272826f, + -0.703845241f, -0.710353347f, + -0.702754744f, -0.711432196f, + -0.701662595f, -0.712509371f, + -0.700568794f, -0.713584869f, + -0.699473345f, -0.714658688f, + -0.698376249f, -0.715730825f, + -0.697277511f, -0.716801279f, + -0.696177131f, -0.717870045f, + -0.695075114f, -0.718937122f, + -0.693971461f, -0.720002508f, + -0.692866175f, -0.721066199f, + -0.691759258f, -0.722128194f, + -0.690650714f, -0.723188489f, + -0.689540545f, -0.724247083f, + -0.688428753f, -0.725303972f, + -0.687315341f, -0.726359155f, + -0.686200312f, -0.727412629f, + -0.685083668f, -0.728464390f, + -0.683965412f, -0.729514438f, + -0.682845546f, -0.730562769f, + -0.681724074f, -0.731609381f, + -0.680600998f, -0.732654272f, + -0.679476320f, -0.733697438f, + -0.678350043f, -0.734738878f, + -0.677222170f, -0.735778589f, + -0.676092704f, -0.736816569f, + -0.674961646f, -0.737852815f, + -0.673829000f, -0.738887324f, + -0.672694769f, -0.739920095f, + -0.671558955f, -0.740951125f, + -0.670421560f, -0.741980412f, + -0.669282588f, -0.743007952f, + -0.668142041f, -0.744033744f, + -0.666999922f, -0.745057785f, + -0.665856234f, -0.746080074f, + -0.664710978f, -0.747100606f, + -0.663564159f, -0.748119380f, + -0.662415778f, -0.749136395f, + -0.661265838f, -0.750151646f, + -0.660114342f, -0.751165132f, + -0.658961293f, -0.752176850f, + -0.657806693f, -0.753186799f, + -0.656650546f, -0.754194975f, + -0.655492853f, -0.755201377f, + -0.654333618f, -0.756206001f, + -0.653172843f, -0.757208847f, + -0.652010531f, -0.758209910f, + -0.650846685f, -0.759209189f, + -0.649681307f, -0.760206682f, + -0.648514401f, -0.761202385f, + -0.647345969f, -0.762196298f, + -0.646176013f, -0.763188417f, + -0.645004537f, -0.764178741f, + -0.643831543f, -0.765167266f, + -0.642657034f, -0.766153990f, + -0.641481013f, -0.767138912f, + -0.640303482f, -0.768122029f, + -0.639124445f, -0.769103338f, + -0.637943904f, -0.770082837f, + -0.636761861f, -0.771060524f, + -0.635578320f, -0.772036397f, + -0.634393284f, -0.773010453f, + -0.633206755f, -0.773982691f, + -0.632018736f, -0.774953107f, + -0.630829230f, -0.775921699f, + -0.629638239f, -0.776888466f, + -0.628445767f, -0.777853404f, + -0.627251815f, -0.778816512f, + -0.626056388f, -0.779777788f, + -0.624859488f, -0.780737229f, + -0.623661118f, -0.781694832f, + -0.622461279f, -0.782650596f, + -0.621259977f, -0.783604519f, + -0.620057212f, -0.784556597f, + -0.618852988f, -0.785506830f, + -0.617647308f, -0.786455214f, + -0.616440175f, -0.787401747f, + -0.615231591f, -0.788346428f, + -0.614021559f, -0.789289253f, + -0.612810082f, -0.790230221f, + -0.611597164f, -0.791169330f, + -0.610382806f, -0.792106577f, + -0.609167012f, -0.793041960f, + -0.607949785f, -0.793975478f, + -0.606731127f, -0.794907126f, + -0.605511041f, -0.795836905f, + -0.604289531f, -0.796764810f, + -0.603066599f, -0.797690841f, + -0.601842247f, -0.798614995f, + -0.600616479f, -0.799537269f, + -0.599389298f, -0.800457662f, + -0.598160707f, -0.801376172f, + -0.596930708f, -0.802292796f, + -0.595699304f, -0.803207531f, + -0.594466499f, -0.804120377f, + -0.593232295f, -0.805031331f, + -0.591996695f, -0.805940391f, + -0.590759702f, -0.806847554f, + -0.589521319f, -0.807752818f, + -0.588281548f, -0.808656182f, + -0.587040394f, -0.809557642f, + -0.585797857f, -0.810457198f, + -0.584553943f, -0.811354847f, + -0.583308653f, -0.812250587f, + -0.582061990f, -0.813144415f, + -0.580813958f, -0.814036330f, + -0.579564559f, -0.814926329f, + -0.578313796f, -0.815814411f, + -0.577061673f, -0.816700573f, + -0.575808191f, -0.817584813f, + -0.574553355f, -0.818467130f, + -0.573297167f, -0.819347520f, + -0.572039629f, -0.820225983f, + -0.570780746f, -0.821102515f, + -0.569520519f, -0.821977115f, + -0.568258953f, -0.822849781f, + -0.566996049f, -0.823720511f, + -0.565731811f, -0.824589303f, + -0.564466242f, -0.825456154f, + -0.563199344f, -0.826321063f, + -0.561931121f, -0.827184027f, + -0.560661576f, -0.828045045f, + -0.559390712f, -0.828904115f, + -0.558118531f, -0.829761234f, + -0.556845037f, -0.830616400f, + -0.555570233f, -0.831469612f, + -0.554294121f, -0.832320868f, + -0.553016706f, -0.833170165f, + -0.551737988f, -0.834017501f, + -0.550457973f, -0.834862875f, + -0.549176662f, -0.835706284f, + -0.547894059f, -0.836547727f, + -0.546610167f, -0.837387202f, + -0.545324988f, -0.838224706f, + -0.544038527f, -0.839060237f, + -0.542750785f, -0.839893794f, + -0.541461766f, -0.840725375f, + -0.540171473f, -0.841554977f, + -0.538879909f, -0.842382600f, + -0.537587076f, -0.843208240f, + -0.536292979f, -0.844031895f, + -0.534997620f, -0.844853565f, + -0.533701002f, -0.845673247f, + -0.532403128f, -0.846490939f, + -0.531104001f, -0.847306639f, + -0.529803625f, -0.848120345f, + -0.528502002f, -0.848932055f, + -0.527199135f, -0.849741768f, + -0.525895027f, -0.850549481f, + -0.524589683f, -0.851355193f, + -0.523283103f, -0.852158902f, + -0.521975293f, -0.852960605f, + -0.520666254f, -0.853760301f, + -0.519355990f, -0.854557988f, + -0.518044504f, -0.855353665f, + -0.516731799f, -0.856147328f, + -0.515417878f, -0.856938977f, + -0.514102744f, -0.857728610f, + -0.512786401f, -0.858516224f, + -0.511468850f, -0.859301818f, + -0.510150097f, -0.860085390f, + -0.508830143f, -0.860866939f, + -0.507508991f, -0.861646461f, + -0.506186645f, -0.862423956f, + -0.504863109f, -0.863199422f, + -0.503538384f, -0.863972856f, + -0.502212474f, -0.864744258f, + -0.500885383f, -0.865513624f, + -0.499557113f, -0.866280954f, + -0.498227667f, -0.867046246f, + -0.496897049f, -0.867809497f, + -0.495565262f, -0.868570706f, + -0.494232309f, -0.869329871f, + -0.492898192f, -0.870086991f, + -0.491562916f, -0.870842063f, + -0.490226483f, -0.871595087f, + -0.488888897f, -0.872346059f, + -0.487550160f, -0.873094978f, + -0.486210276f, -0.873841843f, + -0.484869248f, -0.874586652f, + -0.483527079f, -0.875329403f, + -0.482183772f, -0.876070094f, + -0.480839331f, -0.876808724f, + -0.479493758f, -0.877545290f, + -0.478147056f, -0.878279792f, + -0.476799230f, -0.879012226f, + -0.475450282f, -0.879742593f, + -0.474100215f, -0.880470889f, + -0.472749032f, -0.881197113f, + -0.471396737f, -0.881921264f, + -0.470043332f, -0.882643340f, + -0.468688822f, -0.883363339f, + -0.467333209f, -0.884081259f, + -0.465976496f, -0.884797098f, + -0.464618686f, -0.885510856f, + -0.463259784f, -0.886222530f, + -0.461899791f, -0.886932119f, + -0.460538711f, -0.887639620f, + -0.459176548f, -0.888345033f, + -0.457813304f, -0.889048356f, + -0.456448982f, -0.889749586f, + -0.455083587f, -0.890448723f, + -0.453717121f, -0.891145765f, + -0.452349587f, -0.891840709f, + -0.450980989f, -0.892533555f, + -0.449611330f, -0.893224301f, + -0.448240612f, -0.893912945f, + -0.446868840f, -0.894599486f, + -0.445496017f, -0.895283921f, + -0.444122145f, -0.895966250f, + -0.442747228f, -0.896646470f, + -0.441371269f, -0.897324581f, + -0.439994271f, -0.898000580f, + -0.438616239f, -0.898674466f, + -0.437237174f, -0.899346237f, + -0.435857080f, -0.900015892f, + -0.434475961f, -0.900683429f, + -0.433093819f, -0.901348847f, + -0.431710658f, -0.902012144f, + -0.430326481f, -0.902673318f, + -0.428941292f, -0.903332368f, + -0.427555093f, -0.903989293f, + -0.426167889f, -0.904644091f, + -0.424779681f, -0.905296759f, + -0.423390474f, -0.905947298f, + -0.422000271f, -0.906595705f, + -0.420609074f, -0.907241978f, + -0.419216888f, -0.907886116f, + -0.417823716f, -0.908528119f, + -0.416429560f, -0.909167983f, + -0.415034424f, -0.909805708f, + -0.413638312f, -0.910441292f, + -0.412241227f, -0.911074734f, + -0.410843171f, -0.911706032f, + -0.409444149f, -0.912335185f, + -0.408044163f, -0.912962190f, + -0.406643217f, -0.913587048f, + -0.405241314f, -0.914209756f, + -0.403838458f, -0.914830312f, + -0.402434651f, -0.915448716f, + -0.401029897f, -0.916064966f, + -0.399624200f, -0.916679060f, + -0.398217562f, -0.917290997f, + -0.396809987f, -0.917900776f, + -0.395401479f, -0.918508394f, + -0.393992040f, -0.919113852f, + -0.392581674f, -0.919717146f, + -0.391170384f, -0.920318277f, + -0.389758174f, -0.920917242f, + -0.388345047f, -0.921514039f, + -0.386931006f, -0.922108669f, + -0.385516054f, -0.922701128f, + -0.384100195f, -0.923291417f, + -0.382683432f, -0.923879533f, + -0.381265769f, -0.924465474f, + -0.379847209f, -0.925049241f, + -0.378427755f, -0.925630831f, + -0.377007410f, -0.926210242f, + -0.375586178f, -0.926787474f, + -0.374164063f, -0.927362526f, + -0.372741067f, -0.927935395f, + -0.371317194f, -0.928506080f, + -0.369892447f, -0.929074581f, + -0.368466830f, -0.929640896f, + -0.367040346f, -0.930205023f, + -0.365612998f, -0.930766961f, + -0.364184790f, -0.931326709f, + -0.362755724f, -0.931884266f, + -0.361325806f, -0.932439629f, + -0.359895037f, -0.932992799f, + -0.358463421f, -0.933543773f, + -0.357030961f, -0.934092550f, + -0.355597662f, -0.934639130f, + -0.354163525f, -0.935183510f, + -0.352728556f, -0.935725689f, + -0.351292756f, -0.936265667f, + -0.349856130f, -0.936803442f, + -0.348418680f, -0.937339012f, + -0.346980411f, -0.937872376f, + -0.345541325f, -0.938403534f, + -0.344101426f, -0.938932484f, + -0.342660717f, -0.939459224f, + -0.341219202f, -0.939983753f, + -0.339776884f, -0.940506071f, + -0.338333767f, -0.941026175f, + -0.336889853f, -0.941544065f, + -0.335445147f, -0.942059740f, + -0.333999651f, -0.942573198f, + -0.332553370f, -0.943084437f, + -0.331106306f, -0.943593458f, + -0.329658463f, -0.944100258f, + -0.328209844f, -0.944604837f, + -0.326760452f, -0.945107193f, + -0.325310292f, -0.945607325f, + -0.323859367f, -0.946105232f, + -0.322407679f, -0.946600913f, + -0.320955232f, -0.947094366f, + -0.319502031f, -0.947585591f, + -0.318048077f, -0.948074586f, + -0.316593376f, -0.948561350f, + -0.315137929f, -0.949045882f, + -0.313681740f, -0.949528181f, + -0.312224814f, -0.950008245f, + -0.310767153f, -0.950486074f, + -0.309308760f, -0.950961666f, + -0.307849640f, -0.951435021f, + -0.306389795f, -0.951906137f, + -0.304929230f, -0.952375013f, + -0.303467947f, -0.952841648f, + -0.302005949f, -0.953306040f, + -0.300543241f, -0.953768190f, + -0.299079826f, -0.954228095f, + -0.297615707f, -0.954685755f, + -0.296150888f, -0.955141168f, + -0.294685372f, -0.955594334f, + -0.293219163f, -0.956045251f, + -0.291752263f, -0.956493919f, + -0.290284677f, -0.956940336f, + -0.288816408f, -0.957384501f, + -0.287347460f, -0.957826413f, + -0.285877835f, -0.958266071f, + -0.284407537f, -0.958703475f, + -0.282936570f, -0.959138622f, + -0.281464938f, -0.959571513f, + -0.279992643f, -0.960002146f, + -0.278519689f, -0.960430519f, + -0.277046080f, -0.960856633f, + -0.275571819f, -0.961280486f, + -0.274096910f, -0.961702077f, + -0.272621355f, -0.962121404f, + -0.271145160f, -0.962538468f, + -0.269668326f, -0.962953267f, + -0.268190857f, -0.963365800f, + -0.266712757f, -0.963776066f, + -0.265234030f, -0.964184064f, + -0.263754679f, -0.964589793f, + -0.262274707f, -0.964993253f, + -0.260794118f, -0.965394442f, + -0.259312915f, -0.965793359f, + -0.257831102f, -0.966190003f, + -0.256348682f, -0.966584374f, + -0.254865660f, -0.966976471f, + -0.253382037f, -0.967366292f, + -0.251897818f, -0.967753837f, + -0.250413007f, -0.968139105f, + -0.248927606f, -0.968522094f, + -0.247441619f, -0.968902805f, + -0.245955050f, -0.969281235f, + -0.244467903f, -0.969657385f, + -0.242980180f, -0.970031253f, + -0.241491885f, -0.970402839f, + -0.240003022f, -0.970772141f, + -0.238513595f, -0.971139158f, + -0.237023606f, -0.971503891f, + -0.235533059f, -0.971866337f, + -0.234041959f, -0.972226497f, + -0.232550307f, -0.972584369f, + -0.231058108f, -0.972939952f, + -0.229565366f, -0.973293246f, + -0.228072083f, -0.973644250f, + -0.226578264f, -0.973992962f, + -0.225083911f, -0.974339383f, + -0.223589029f, -0.974683511f, + -0.222093621f, -0.975025345f, + -0.220597690f, -0.975364885f, + -0.219101240f, -0.975702130f, + -0.217604275f, -0.976037079f, + -0.216106797f, -0.976369731f, + -0.214608811f, -0.976700086f, + -0.213110320f, -0.977028143f, + -0.211611327f, -0.977353900f, + -0.210111837f, -0.977677358f, + -0.208611852f, -0.977998515f, + -0.207111376f, -0.978317371f, + -0.205610413f, -0.978633924f, + -0.204108966f, -0.978948175f, + -0.202607039f, -0.979260123f, + -0.201104635f, -0.979569766f, + -0.199601758f, -0.979877104f, + -0.198098411f, -0.980182136f, + -0.196594598f, -0.980484862f, + -0.195090322f, -0.980785280f, + -0.193585587f, -0.981083391f, + -0.192080397f, -0.981379193f, + -0.190574755f, -0.981672686f, + -0.189068664f, -0.981963869f, + -0.187562129f, -0.982252741f, + -0.186055152f, -0.982539302f, + -0.184547737f, -0.982823551f, + -0.183039888f, -0.983105487f, + -0.181531608f, -0.983385110f, + -0.180022901f, -0.983662419f, + -0.178513771f, -0.983937413f, + -0.177004220f, -0.984210092f, + -0.175494253f, -0.984480455f, + -0.173983873f, -0.984748502f, + -0.172473084f, -0.985014231f, + -0.170961889f, -0.985277642f, + -0.169450291f, -0.985538735f, + -0.167938295f, -0.985797509f, + -0.166425904f, -0.986053963f, + -0.164913120f, -0.986308097f, + -0.163399949f, -0.986559910f, + -0.161886394f, -0.986809402f, + -0.160372457f, -0.987056571f, + -0.158858143f, -0.987301418f, + -0.157343456f, -0.987543942f, + -0.155828398f, -0.987784142f, + -0.154312973f, -0.988022017f, + -0.152797185f, -0.988257568f, + -0.151281038f, -0.988490793f, + -0.149764535f, -0.988721692f, + -0.148247679f, -0.988950265f, + -0.146730474f, -0.989176510f, + -0.145212925f, -0.989400428f, + -0.143695033f, -0.989622017f, + -0.142176804f, -0.989841278f, + -0.140658239f, -0.990058210f, + -0.139139344f, -0.990272812f, + -0.137620122f, -0.990485084f, + -0.136100575f, -0.990695025f, + -0.134580709f, -0.990902635f, + -0.133060525f, -0.991107914f, + -0.131540029f, -0.991310860f, + -0.130019223f, -0.991511473f, + -0.128498111f, -0.991709754f, + -0.126976696f, -0.991905700f, + -0.125454983f, -0.992099313f, + -0.123932975f, -0.992290591f, + -0.122410675f, -0.992479535f, + -0.120888087f, -0.992666142f, + -0.119365215f, -0.992850414f, + -0.117842062f, -0.993032350f, + -0.116318631f, -0.993211949f, + -0.114794927f, -0.993389211f, + -0.113270952f, -0.993564136f, + -0.111746711f, -0.993736722f, + -0.110222207f, -0.993906970f, + -0.108697444f, -0.994074879f, + -0.107172425f, -0.994240449f, + -0.105647154f, -0.994403680f, + -0.104121634f, -0.994564571f, + -0.102595869f, -0.994723121f, + -0.101069863f, -0.994879331f, + -0.099543619f, -0.995033199f, + -0.098017140f, -0.995184727f, + -0.096490431f, -0.995333912f, + -0.094963495f, -0.995480755f, + -0.093436336f, -0.995625256f, + -0.091908956f, -0.995767414f, + -0.090381361f, -0.995907229f, + -0.088853553f, -0.996044701f, + -0.087325535f, -0.996179829f, + -0.085797312f, -0.996312612f, + -0.084268888f, -0.996443051f, + -0.082740265f, -0.996571146f, + -0.081211447f, -0.996696895f, + -0.079682438f, -0.996820299f, + -0.078153242f, -0.996941358f, + -0.076623861f, -0.997060070f, + -0.075094301f, -0.997176437f, + -0.073564564f, -0.997290457f, + -0.072034653f, -0.997402130f, + -0.070504573f, -0.997511456f, + -0.068974328f, -0.997618435f, + -0.067443920f, -0.997723067f, + -0.065913353f, -0.997825350f, + -0.064382631f, -0.997925286f, + -0.062851758f, -0.998022874f, + -0.061320736f, -0.998118113f, + -0.059789571f, -0.998211003f, + -0.058258265f, -0.998301545f, + -0.056726821f, -0.998389737f, + -0.055195244f, -0.998475581f, + -0.053663538f, -0.998559074f, + -0.052131705f, -0.998640218f, + -0.050599749f, -0.998719012f, + -0.049067674f, -0.998795456f, + -0.047535484f, -0.998869550f, + -0.046003182f, -0.998941293f, + -0.044470772f, -0.999010686f, + -0.042938257f, -0.999077728f, + -0.041405641f, -0.999142419f, + -0.039872928f, -0.999204759f, + -0.038340120f, -0.999264747f, + -0.036807223f, -0.999322385f, + -0.035274239f, -0.999377670f, + -0.033741172f, -0.999430605f, + -0.032208025f, -0.999481187f, + -0.030674803f, -0.999529418f, + -0.029141509f, -0.999575296f, + -0.027608146f, -0.999618822f, + -0.026074718f, -0.999659997f, + -0.024541229f, -0.999698819f, + -0.023007681f, -0.999735288f, + -0.021474080f, -0.999769405f, + -0.019940429f, -0.999801170f, + -0.018406730f, -0.999830582f, + -0.016872988f, -0.999857641f, + -0.015339206f, -0.999882347f, + -0.013805389f, -0.999904701f, + -0.012271538f, -0.999924702f, + -0.010737659f, -0.999942350f, + -0.009203755f, -0.999957645f, + -0.007669829f, -0.999970586f, + -0.006135885f, -0.999981175f, + -0.004601926f, -0.999989411f, + -0.003067957f, -0.999995294f, + -0.001533980f, -0.999998823f, + -0.000000000f, -1.000000000f, + 0.001533980f, -0.999998823f, + 0.003067957f, -0.999995294f, + 0.004601926f, -0.999989411f, + 0.006135885f, -0.999981175f, + 0.007669829f, -0.999970586f, + 0.009203755f, -0.999957645f, + 0.010737659f, -0.999942350f, + 0.012271538f, -0.999924702f, + 0.013805389f, -0.999904701f, + 0.015339206f, -0.999882347f, + 0.016872988f, -0.999857641f, + 0.018406730f, -0.999830582f, + 0.019940429f, -0.999801170f, + 0.021474080f, -0.999769405f, + 0.023007681f, -0.999735288f, + 0.024541229f, -0.999698819f, + 0.026074718f, -0.999659997f, + 0.027608146f, -0.999618822f, + 0.029141509f, -0.999575296f, + 0.030674803f, -0.999529418f, + 0.032208025f, -0.999481187f, + 0.033741172f, -0.999430605f, + 0.035274239f, -0.999377670f, + 0.036807223f, -0.999322385f, + 0.038340120f, -0.999264747f, + 0.039872928f, -0.999204759f, + 0.041405641f, -0.999142419f, + 0.042938257f, -0.999077728f, + 0.044470772f, -0.999010686f, + 0.046003182f, -0.998941293f, + 0.047535484f, -0.998869550f, + 0.049067674f, -0.998795456f, + 0.050599749f, -0.998719012f, + 0.052131705f, -0.998640218f, + 0.053663538f, -0.998559074f, + 0.055195244f, -0.998475581f, + 0.056726821f, -0.998389737f, + 0.058258265f, -0.998301545f, + 0.059789571f, -0.998211003f, + 0.061320736f, -0.998118113f, + 0.062851758f, -0.998022874f, + 0.064382631f, -0.997925286f, + 0.065913353f, -0.997825350f, + 0.067443920f, -0.997723067f, + 0.068974328f, -0.997618435f, + 0.070504573f, -0.997511456f, + 0.072034653f, -0.997402130f, + 0.073564564f, -0.997290457f, + 0.075094301f, -0.997176437f, + 0.076623861f, -0.997060070f, + 0.078153242f, -0.996941358f, + 0.079682438f, -0.996820299f, + 0.081211447f, -0.996696895f, + 0.082740265f, -0.996571146f, + 0.084268888f, -0.996443051f, + 0.085797312f, -0.996312612f, + 0.087325535f, -0.996179829f, + 0.088853553f, -0.996044701f, + 0.090381361f, -0.995907229f, + 0.091908956f, -0.995767414f, + 0.093436336f, -0.995625256f, + 0.094963495f, -0.995480755f, + 0.096490431f, -0.995333912f, + 0.098017140f, -0.995184727f, + 0.099543619f, -0.995033199f, + 0.101069863f, -0.994879331f, + 0.102595869f, -0.994723121f, + 0.104121634f, -0.994564571f, + 0.105647154f, -0.994403680f, + 0.107172425f, -0.994240449f, + 0.108697444f, -0.994074879f, + 0.110222207f, -0.993906970f, + 0.111746711f, -0.993736722f, + 0.113270952f, -0.993564136f, + 0.114794927f, -0.993389211f, + 0.116318631f, -0.993211949f, + 0.117842062f, -0.993032350f, + 0.119365215f, -0.992850414f, + 0.120888087f, -0.992666142f, + 0.122410675f, -0.992479535f, + 0.123932975f, -0.992290591f, + 0.125454983f, -0.992099313f, + 0.126976696f, -0.991905700f, + 0.128498111f, -0.991709754f, + 0.130019223f, -0.991511473f, + 0.131540029f, -0.991310860f, + 0.133060525f, -0.991107914f, + 0.134580709f, -0.990902635f, + 0.136100575f, -0.990695025f, + 0.137620122f, -0.990485084f, + 0.139139344f, -0.990272812f, + 0.140658239f, -0.990058210f, + 0.142176804f, -0.989841278f, + 0.143695033f, -0.989622017f, + 0.145212925f, -0.989400428f, + 0.146730474f, -0.989176510f, + 0.148247679f, -0.988950265f, + 0.149764535f, -0.988721692f, + 0.151281038f, -0.988490793f, + 0.152797185f, -0.988257568f, + 0.154312973f, -0.988022017f, + 0.155828398f, -0.987784142f, + 0.157343456f, -0.987543942f, + 0.158858143f, -0.987301418f, + 0.160372457f, -0.987056571f, + 0.161886394f, -0.986809402f, + 0.163399949f, -0.986559910f, + 0.164913120f, -0.986308097f, + 0.166425904f, -0.986053963f, + 0.167938295f, -0.985797509f, + 0.169450291f, -0.985538735f, + 0.170961889f, -0.985277642f, + 0.172473084f, -0.985014231f, + 0.173983873f, -0.984748502f, + 0.175494253f, -0.984480455f, + 0.177004220f, -0.984210092f, + 0.178513771f, -0.983937413f, + 0.180022901f, -0.983662419f, + 0.181531608f, -0.983385110f, + 0.183039888f, -0.983105487f, + 0.184547737f, -0.982823551f, + 0.186055152f, -0.982539302f, + 0.187562129f, -0.982252741f, + 0.189068664f, -0.981963869f, + 0.190574755f, -0.981672686f, + 0.192080397f, -0.981379193f, + 0.193585587f, -0.981083391f, + 0.195090322f, -0.980785280f, + 0.196594598f, -0.980484862f, + 0.198098411f, -0.980182136f, + 0.199601758f, -0.979877104f, + 0.201104635f, -0.979569766f, + 0.202607039f, -0.979260123f, + 0.204108966f, -0.978948175f, + 0.205610413f, -0.978633924f, + 0.207111376f, -0.978317371f, + 0.208611852f, -0.977998515f, + 0.210111837f, -0.977677358f, + 0.211611327f, -0.977353900f, + 0.213110320f, -0.977028143f, + 0.214608811f, -0.976700086f, + 0.216106797f, -0.976369731f, + 0.217604275f, -0.976037079f, + 0.219101240f, -0.975702130f, + 0.220597690f, -0.975364885f, + 0.222093621f, -0.975025345f, + 0.223589029f, -0.974683511f, + 0.225083911f, -0.974339383f, + 0.226578264f, -0.973992962f, + 0.228072083f, -0.973644250f, + 0.229565366f, -0.973293246f, + 0.231058108f, -0.972939952f, + 0.232550307f, -0.972584369f, + 0.234041959f, -0.972226497f, + 0.235533059f, -0.971866337f, + 0.237023606f, -0.971503891f, + 0.238513595f, -0.971139158f, + 0.240003022f, -0.970772141f, + 0.241491885f, -0.970402839f, + 0.242980180f, -0.970031253f, + 0.244467903f, -0.969657385f, + 0.245955050f, -0.969281235f, + 0.247441619f, -0.968902805f, + 0.248927606f, -0.968522094f, + 0.250413007f, -0.968139105f, + 0.251897818f, -0.967753837f, + 0.253382037f, -0.967366292f, + 0.254865660f, -0.966976471f, + 0.256348682f, -0.966584374f, + 0.257831102f, -0.966190003f, + 0.259312915f, -0.965793359f, + 0.260794118f, -0.965394442f, + 0.262274707f, -0.964993253f, + 0.263754679f, -0.964589793f, + 0.265234030f, -0.964184064f, + 0.266712757f, -0.963776066f, + 0.268190857f, -0.963365800f, + 0.269668326f, -0.962953267f, + 0.271145160f, -0.962538468f, + 0.272621355f, -0.962121404f, + 0.274096910f, -0.961702077f, + 0.275571819f, -0.961280486f, + 0.277046080f, -0.960856633f, + 0.278519689f, -0.960430519f, + 0.279992643f, -0.960002146f, + 0.281464938f, -0.959571513f, + 0.282936570f, -0.959138622f, + 0.284407537f, -0.958703475f, + 0.285877835f, -0.958266071f, + 0.287347460f, -0.957826413f, + 0.288816408f, -0.957384501f, + 0.290284677f, -0.956940336f, + 0.291752263f, -0.956493919f, + 0.293219163f, -0.956045251f, + 0.294685372f, -0.955594334f, + 0.296150888f, -0.955141168f, + 0.297615707f, -0.954685755f, + 0.299079826f, -0.954228095f, + 0.300543241f, -0.953768190f, + 0.302005949f, -0.953306040f, + 0.303467947f, -0.952841648f, + 0.304929230f, -0.952375013f, + 0.306389795f, -0.951906137f, + 0.307849640f, -0.951435021f, + 0.309308760f, -0.950961666f, + 0.310767153f, -0.950486074f, + 0.312224814f, -0.950008245f, + 0.313681740f, -0.949528181f, + 0.315137929f, -0.949045882f, + 0.316593376f, -0.948561350f, + 0.318048077f, -0.948074586f, + 0.319502031f, -0.947585591f, + 0.320955232f, -0.947094366f, + 0.322407679f, -0.946600913f, + 0.323859367f, -0.946105232f, + 0.325310292f, -0.945607325f, + 0.326760452f, -0.945107193f, + 0.328209844f, -0.944604837f, + 0.329658463f, -0.944100258f, + 0.331106306f, -0.943593458f, + 0.332553370f, -0.943084437f, + 0.333999651f, -0.942573198f, + 0.335445147f, -0.942059740f, + 0.336889853f, -0.941544065f, + 0.338333767f, -0.941026175f, + 0.339776884f, -0.940506071f, + 0.341219202f, -0.939983753f, + 0.342660717f, -0.939459224f, + 0.344101426f, -0.938932484f, + 0.345541325f, -0.938403534f, + 0.346980411f, -0.937872376f, + 0.348418680f, -0.937339012f, + 0.349856130f, -0.936803442f, + 0.351292756f, -0.936265667f, + 0.352728556f, -0.935725689f, + 0.354163525f, -0.935183510f, + 0.355597662f, -0.934639130f, + 0.357030961f, -0.934092550f, + 0.358463421f, -0.933543773f, + 0.359895037f, -0.932992799f, + 0.361325806f, -0.932439629f, + 0.362755724f, -0.931884266f, + 0.364184790f, -0.931326709f, + 0.365612998f, -0.930766961f, + 0.367040346f, -0.930205023f, + 0.368466830f, -0.929640896f, + 0.369892447f, -0.929074581f, + 0.371317194f, -0.928506080f, + 0.372741067f, -0.927935395f, + 0.374164063f, -0.927362526f, + 0.375586178f, -0.926787474f, + 0.377007410f, -0.926210242f, + 0.378427755f, -0.925630831f, + 0.379847209f, -0.925049241f, + 0.381265769f, -0.924465474f, + 0.382683432f, -0.923879533f, + 0.384100195f, -0.923291417f, + 0.385516054f, -0.922701128f, + 0.386931006f, -0.922108669f, + 0.388345047f, -0.921514039f, + 0.389758174f, -0.920917242f, + 0.391170384f, -0.920318277f, + 0.392581674f, -0.919717146f, + 0.393992040f, -0.919113852f, + 0.395401479f, -0.918508394f, + 0.396809987f, -0.917900776f, + 0.398217562f, -0.917290997f, + 0.399624200f, -0.916679060f, + 0.401029897f, -0.916064966f, + 0.402434651f, -0.915448716f, + 0.403838458f, -0.914830312f, + 0.405241314f, -0.914209756f, + 0.406643217f, -0.913587048f, + 0.408044163f, -0.912962190f, + 0.409444149f, -0.912335185f, + 0.410843171f, -0.911706032f, + 0.412241227f, -0.911074734f, + 0.413638312f, -0.910441292f, + 0.415034424f, -0.909805708f, + 0.416429560f, -0.909167983f, + 0.417823716f, -0.908528119f, + 0.419216888f, -0.907886116f, + 0.420609074f, -0.907241978f, + 0.422000271f, -0.906595705f, + 0.423390474f, -0.905947298f, + 0.424779681f, -0.905296759f, + 0.426167889f, -0.904644091f, + 0.427555093f, -0.903989293f, + 0.428941292f, -0.903332368f, + 0.430326481f, -0.902673318f, + 0.431710658f, -0.902012144f, + 0.433093819f, -0.901348847f, + 0.434475961f, -0.900683429f, + 0.435857080f, -0.900015892f, + 0.437237174f, -0.899346237f, + 0.438616239f, -0.898674466f, + 0.439994271f, -0.898000580f, + 0.441371269f, -0.897324581f, + 0.442747228f, -0.896646470f, + 0.444122145f, -0.895966250f, + 0.445496017f, -0.895283921f, + 0.446868840f, -0.894599486f, + 0.448240612f, -0.893912945f, + 0.449611330f, -0.893224301f, + 0.450980989f, -0.892533555f, + 0.452349587f, -0.891840709f, + 0.453717121f, -0.891145765f, + 0.455083587f, -0.890448723f, + 0.456448982f, -0.889749586f, + 0.457813304f, -0.889048356f, + 0.459176548f, -0.888345033f, + 0.460538711f, -0.887639620f, + 0.461899791f, -0.886932119f, + 0.463259784f, -0.886222530f, + 0.464618686f, -0.885510856f, + 0.465976496f, -0.884797098f, + 0.467333209f, -0.884081259f, + 0.468688822f, -0.883363339f, + 0.470043332f, -0.882643340f, + 0.471396737f, -0.881921264f, + 0.472749032f, -0.881197113f, + 0.474100215f, -0.880470889f, + 0.475450282f, -0.879742593f, + 0.476799230f, -0.879012226f, + 0.478147056f, -0.878279792f, + 0.479493758f, -0.877545290f, + 0.480839331f, -0.876808724f, + 0.482183772f, -0.876070094f, + 0.483527079f, -0.875329403f, + 0.484869248f, -0.874586652f, + 0.486210276f, -0.873841843f, + 0.487550160f, -0.873094978f, + 0.488888897f, -0.872346059f, + 0.490226483f, -0.871595087f, + 0.491562916f, -0.870842063f, + 0.492898192f, -0.870086991f, + 0.494232309f, -0.869329871f, + 0.495565262f, -0.868570706f, + 0.496897049f, -0.867809497f, + 0.498227667f, -0.867046246f, + 0.499557113f, -0.866280954f, + 0.500885383f, -0.865513624f, + 0.502212474f, -0.864744258f, + 0.503538384f, -0.863972856f, + 0.504863109f, -0.863199422f, + 0.506186645f, -0.862423956f, + 0.507508991f, -0.861646461f, + 0.508830143f, -0.860866939f, + 0.510150097f, -0.860085390f, + 0.511468850f, -0.859301818f, + 0.512786401f, -0.858516224f, + 0.514102744f, -0.857728610f, + 0.515417878f, -0.856938977f, + 0.516731799f, -0.856147328f, + 0.518044504f, -0.855353665f, + 0.519355990f, -0.854557988f, + 0.520666254f, -0.853760301f, + 0.521975293f, -0.852960605f, + 0.523283103f, -0.852158902f, + 0.524589683f, -0.851355193f, + 0.525895027f, -0.850549481f, + 0.527199135f, -0.849741768f, + 0.528502002f, -0.848932055f, + 0.529803625f, -0.848120345f, + 0.531104001f, -0.847306639f, + 0.532403128f, -0.846490939f, + 0.533701002f, -0.845673247f, + 0.534997620f, -0.844853565f, + 0.536292979f, -0.844031895f, + 0.537587076f, -0.843208240f, + 0.538879909f, -0.842382600f, + 0.540171473f, -0.841554977f, + 0.541461766f, -0.840725375f, + 0.542750785f, -0.839893794f, + 0.544038527f, -0.839060237f, + 0.545324988f, -0.838224706f, + 0.546610167f, -0.837387202f, + 0.547894059f, -0.836547727f, + 0.549176662f, -0.835706284f, + 0.550457973f, -0.834862875f, + 0.551737988f, -0.834017501f, + 0.553016706f, -0.833170165f, + 0.554294121f, -0.832320868f, + 0.555570233f, -0.831469612f, + 0.556845037f, -0.830616400f, + 0.558118531f, -0.829761234f, + 0.559390712f, -0.828904115f, + 0.560661576f, -0.828045045f, + 0.561931121f, -0.827184027f, + 0.563199344f, -0.826321063f, + 0.564466242f, -0.825456154f, + 0.565731811f, -0.824589303f, + 0.566996049f, -0.823720511f, + 0.568258953f, -0.822849781f, + 0.569520519f, -0.821977115f, + 0.570780746f, -0.821102515f, + 0.572039629f, -0.820225983f, + 0.573297167f, -0.819347520f, + 0.574553355f, -0.818467130f, + 0.575808191f, -0.817584813f, + 0.577061673f, -0.816700573f, + 0.578313796f, -0.815814411f, + 0.579564559f, -0.814926329f, + 0.580813958f, -0.814036330f, + 0.582061990f, -0.813144415f, + 0.583308653f, -0.812250587f, + 0.584553943f, -0.811354847f, + 0.585797857f, -0.810457198f, + 0.587040394f, -0.809557642f, + 0.588281548f, -0.808656182f, + 0.589521319f, -0.807752818f, + 0.590759702f, -0.806847554f, + 0.591996695f, -0.805940391f, + 0.593232295f, -0.805031331f, + 0.594466499f, -0.804120377f, + 0.595699304f, -0.803207531f, + 0.596930708f, -0.802292796f, + 0.598160707f, -0.801376172f, + 0.599389298f, -0.800457662f, + 0.600616479f, -0.799537269f, + 0.601842247f, -0.798614995f, + 0.603066599f, -0.797690841f, + 0.604289531f, -0.796764810f, + 0.605511041f, -0.795836905f, + 0.606731127f, -0.794907126f, + 0.607949785f, -0.793975478f, + 0.609167012f, -0.793041960f, + 0.610382806f, -0.792106577f, + 0.611597164f, -0.791169330f, + 0.612810082f, -0.790230221f, + 0.614021559f, -0.789289253f, + 0.615231591f, -0.788346428f, + 0.616440175f, -0.787401747f, + 0.617647308f, -0.786455214f, + 0.618852988f, -0.785506830f, + 0.620057212f, -0.784556597f, + 0.621259977f, -0.783604519f, + 0.622461279f, -0.782650596f, + 0.623661118f, -0.781694832f, + 0.624859488f, -0.780737229f, + 0.626056388f, -0.779777788f, + 0.627251815f, -0.778816512f, + 0.628445767f, -0.777853404f, + 0.629638239f, -0.776888466f, + 0.630829230f, -0.775921699f, + 0.632018736f, -0.774953107f, + 0.633206755f, -0.773982691f, + 0.634393284f, -0.773010453f, + 0.635578320f, -0.772036397f, + 0.636761861f, -0.771060524f, + 0.637943904f, -0.770082837f, + 0.639124445f, -0.769103338f, + 0.640303482f, -0.768122029f, + 0.641481013f, -0.767138912f, + 0.642657034f, -0.766153990f, + 0.643831543f, -0.765167266f, + 0.645004537f, -0.764178741f, + 0.646176013f, -0.763188417f, + 0.647345969f, -0.762196298f, + 0.648514401f, -0.761202385f, + 0.649681307f, -0.760206682f, + 0.650846685f, -0.759209189f, + 0.652010531f, -0.758209910f, + 0.653172843f, -0.757208847f, + 0.654333618f, -0.756206001f, + 0.655492853f, -0.755201377f, + 0.656650546f, -0.754194975f, + 0.657806693f, -0.753186799f, + 0.658961293f, -0.752176850f, + 0.660114342f, -0.751165132f, + 0.661265838f, -0.750151646f, + 0.662415778f, -0.749136395f, + 0.663564159f, -0.748119380f, + 0.664710978f, -0.747100606f, + 0.665856234f, -0.746080074f, + 0.666999922f, -0.745057785f, + 0.668142041f, -0.744033744f, + 0.669282588f, -0.743007952f, + 0.670421560f, -0.741980412f, + 0.671558955f, -0.740951125f, + 0.672694769f, -0.739920095f, + 0.673829000f, -0.738887324f, + 0.674961646f, -0.737852815f, + 0.676092704f, -0.736816569f, + 0.677222170f, -0.735778589f, + 0.678350043f, -0.734738878f, + 0.679476320f, -0.733697438f, + 0.680600998f, -0.732654272f, + 0.681724074f, -0.731609381f, + 0.682845546f, -0.730562769f, + 0.683965412f, -0.729514438f, + 0.685083668f, -0.728464390f, + 0.686200312f, -0.727412629f, + 0.687315341f, -0.726359155f, + 0.688428753f, -0.725303972f, + 0.689540545f, -0.724247083f, + 0.690650714f, -0.723188489f, + 0.691759258f, -0.722128194f, + 0.692866175f, -0.721066199f, + 0.693971461f, -0.720002508f, + 0.695075114f, -0.718937122f, + 0.696177131f, -0.717870045f, + 0.697277511f, -0.716801279f, + 0.698376249f, -0.715730825f, + 0.699473345f, -0.714658688f, + 0.700568794f, -0.713584869f, + 0.701662595f, -0.712509371f, + 0.702754744f, -0.711432196f, + 0.703845241f, -0.710353347f, + 0.704934080f, -0.709272826f, + 0.706021261f, -0.708190637f, + 0.707106781f, -0.707106781f, + 0.708190637f, -0.706021261f, + 0.709272826f, -0.704934080f, + 0.710353347f, -0.703845241f, + 0.711432196f, -0.702754744f, + 0.712509371f, -0.701662595f, + 0.713584869f, -0.700568794f, + 0.714658688f, -0.699473345f, + 0.715730825f, -0.698376249f, + 0.716801279f, -0.697277511f, + 0.717870045f, -0.696177131f, + 0.718937122f, -0.695075114f, + 0.720002508f, -0.693971461f, + 0.721066199f, -0.692866175f, + 0.722128194f, -0.691759258f, + 0.723188489f, -0.690650714f, + 0.724247083f, -0.689540545f, + 0.725303972f, -0.688428753f, + 0.726359155f, -0.687315341f, + 0.727412629f, -0.686200312f, + 0.728464390f, -0.685083668f, + 0.729514438f, -0.683965412f, + 0.730562769f, -0.682845546f, + 0.731609381f, -0.681724074f, + 0.732654272f, -0.680600998f, + 0.733697438f, -0.679476320f, + 0.734738878f, -0.678350043f, + 0.735778589f, -0.677222170f, + 0.736816569f, -0.676092704f, + 0.737852815f, -0.674961646f, + 0.738887324f, -0.673829000f, + 0.739920095f, -0.672694769f, + 0.740951125f, -0.671558955f, + 0.741980412f, -0.670421560f, + 0.743007952f, -0.669282588f, + 0.744033744f, -0.668142041f, + 0.745057785f, -0.666999922f, + 0.746080074f, -0.665856234f, + 0.747100606f, -0.664710978f, + 0.748119380f, -0.663564159f, + 0.749136395f, -0.662415778f, + 0.750151646f, -0.661265838f, + 0.751165132f, -0.660114342f, + 0.752176850f, -0.658961293f, + 0.753186799f, -0.657806693f, + 0.754194975f, -0.656650546f, + 0.755201377f, -0.655492853f, + 0.756206001f, -0.654333618f, + 0.757208847f, -0.653172843f, + 0.758209910f, -0.652010531f, + 0.759209189f, -0.650846685f, + 0.760206682f, -0.649681307f, + 0.761202385f, -0.648514401f, + 0.762196298f, -0.647345969f, + 0.763188417f, -0.646176013f, + 0.764178741f, -0.645004537f, + 0.765167266f, -0.643831543f, + 0.766153990f, -0.642657034f, + 0.767138912f, -0.641481013f, + 0.768122029f, -0.640303482f, + 0.769103338f, -0.639124445f, + 0.770082837f, -0.637943904f, + 0.771060524f, -0.636761861f, + 0.772036397f, -0.635578320f, + 0.773010453f, -0.634393284f, + 0.773982691f, -0.633206755f, + 0.774953107f, -0.632018736f, + 0.775921699f, -0.630829230f, + 0.776888466f, -0.629638239f, + 0.777853404f, -0.628445767f, + 0.778816512f, -0.627251815f, + 0.779777788f, -0.626056388f, + 0.780737229f, -0.624859488f, + 0.781694832f, -0.623661118f, + 0.782650596f, -0.622461279f, + 0.783604519f, -0.621259977f, + 0.784556597f, -0.620057212f, + 0.785506830f, -0.618852988f, + 0.786455214f, -0.617647308f, + 0.787401747f, -0.616440175f, + 0.788346428f, -0.615231591f, + 0.789289253f, -0.614021559f, + 0.790230221f, -0.612810082f, + 0.791169330f, -0.611597164f, + 0.792106577f, -0.610382806f, + 0.793041960f, -0.609167012f, + 0.793975478f, -0.607949785f, + 0.794907126f, -0.606731127f, + 0.795836905f, -0.605511041f, + 0.796764810f, -0.604289531f, + 0.797690841f, -0.603066599f, + 0.798614995f, -0.601842247f, + 0.799537269f, -0.600616479f, + 0.800457662f, -0.599389298f, + 0.801376172f, -0.598160707f, + 0.802292796f, -0.596930708f, + 0.803207531f, -0.595699304f, + 0.804120377f, -0.594466499f, + 0.805031331f, -0.593232295f, + 0.805940391f, -0.591996695f, + 0.806847554f, -0.590759702f, + 0.807752818f, -0.589521319f, + 0.808656182f, -0.588281548f, + 0.809557642f, -0.587040394f, + 0.810457198f, -0.585797857f, + 0.811354847f, -0.584553943f, + 0.812250587f, -0.583308653f, + 0.813144415f, -0.582061990f, + 0.814036330f, -0.580813958f, + 0.814926329f, -0.579564559f, + 0.815814411f, -0.578313796f, + 0.816700573f, -0.577061673f, + 0.817584813f, -0.575808191f, + 0.818467130f, -0.574553355f, + 0.819347520f, -0.573297167f, + 0.820225983f, -0.572039629f, + 0.821102515f, -0.570780746f, + 0.821977115f, -0.569520519f, + 0.822849781f, -0.568258953f, + 0.823720511f, -0.566996049f, + 0.824589303f, -0.565731811f, + 0.825456154f, -0.564466242f, + 0.826321063f, -0.563199344f, + 0.827184027f, -0.561931121f, + 0.828045045f, -0.560661576f, + 0.828904115f, -0.559390712f, + 0.829761234f, -0.558118531f, + 0.830616400f, -0.556845037f, + 0.831469612f, -0.555570233f, + 0.832320868f, -0.554294121f, + 0.833170165f, -0.553016706f, + 0.834017501f, -0.551737988f, + 0.834862875f, -0.550457973f, + 0.835706284f, -0.549176662f, + 0.836547727f, -0.547894059f, + 0.837387202f, -0.546610167f, + 0.838224706f, -0.545324988f, + 0.839060237f, -0.544038527f, + 0.839893794f, -0.542750785f, + 0.840725375f, -0.541461766f, + 0.841554977f, -0.540171473f, + 0.842382600f, -0.538879909f, + 0.843208240f, -0.537587076f, + 0.844031895f, -0.536292979f, + 0.844853565f, -0.534997620f, + 0.845673247f, -0.533701002f, + 0.846490939f, -0.532403128f, + 0.847306639f, -0.531104001f, + 0.848120345f, -0.529803625f, + 0.848932055f, -0.528502002f, + 0.849741768f, -0.527199135f, + 0.850549481f, -0.525895027f, + 0.851355193f, -0.524589683f, + 0.852158902f, -0.523283103f, + 0.852960605f, -0.521975293f, + 0.853760301f, -0.520666254f, + 0.854557988f, -0.519355990f, + 0.855353665f, -0.518044504f, + 0.856147328f, -0.516731799f, + 0.856938977f, -0.515417878f, + 0.857728610f, -0.514102744f, + 0.858516224f, -0.512786401f, + 0.859301818f, -0.511468850f, + 0.860085390f, -0.510150097f, + 0.860866939f, -0.508830143f, + 0.861646461f, -0.507508991f, + 0.862423956f, -0.506186645f, + 0.863199422f, -0.504863109f, + 0.863972856f, -0.503538384f, + 0.864744258f, -0.502212474f, + 0.865513624f, -0.500885383f, + 0.866280954f, -0.499557113f, + 0.867046246f, -0.498227667f, + 0.867809497f, -0.496897049f, + 0.868570706f, -0.495565262f, + 0.869329871f, -0.494232309f, + 0.870086991f, -0.492898192f, + 0.870842063f, -0.491562916f, + 0.871595087f, -0.490226483f, + 0.872346059f, -0.488888897f, + 0.873094978f, -0.487550160f, + 0.873841843f, -0.486210276f, + 0.874586652f, -0.484869248f, + 0.875329403f, -0.483527079f, + 0.876070094f, -0.482183772f, + 0.876808724f, -0.480839331f, + 0.877545290f, -0.479493758f, + 0.878279792f, -0.478147056f, + 0.879012226f, -0.476799230f, + 0.879742593f, -0.475450282f, + 0.880470889f, -0.474100215f, + 0.881197113f, -0.472749032f, + 0.881921264f, -0.471396737f, + 0.882643340f, -0.470043332f, + 0.883363339f, -0.468688822f, + 0.884081259f, -0.467333209f, + 0.884797098f, -0.465976496f, + 0.885510856f, -0.464618686f, + 0.886222530f, -0.463259784f, + 0.886932119f, -0.461899791f, + 0.887639620f, -0.460538711f, + 0.888345033f, -0.459176548f, + 0.889048356f, -0.457813304f, + 0.889749586f, -0.456448982f, + 0.890448723f, -0.455083587f, + 0.891145765f, -0.453717121f, + 0.891840709f, -0.452349587f, + 0.892533555f, -0.450980989f, + 0.893224301f, -0.449611330f, + 0.893912945f, -0.448240612f, + 0.894599486f, -0.446868840f, + 0.895283921f, -0.445496017f, + 0.895966250f, -0.444122145f, + 0.896646470f, -0.442747228f, + 0.897324581f, -0.441371269f, + 0.898000580f, -0.439994271f, + 0.898674466f, -0.438616239f, + 0.899346237f, -0.437237174f, + 0.900015892f, -0.435857080f, + 0.900683429f, -0.434475961f, + 0.901348847f, -0.433093819f, + 0.902012144f, -0.431710658f, + 0.902673318f, -0.430326481f, + 0.903332368f, -0.428941292f, + 0.903989293f, -0.427555093f, + 0.904644091f, -0.426167889f, + 0.905296759f, -0.424779681f, + 0.905947298f, -0.423390474f, + 0.906595705f, -0.422000271f, + 0.907241978f, -0.420609074f, + 0.907886116f, -0.419216888f, + 0.908528119f, -0.417823716f, + 0.909167983f, -0.416429560f, + 0.909805708f, -0.415034424f, + 0.910441292f, -0.413638312f, + 0.911074734f, -0.412241227f, + 0.911706032f, -0.410843171f, + 0.912335185f, -0.409444149f, + 0.912962190f, -0.408044163f, + 0.913587048f, -0.406643217f, + 0.914209756f, -0.405241314f, + 0.914830312f, -0.403838458f, + 0.915448716f, -0.402434651f, + 0.916064966f, -0.401029897f, + 0.916679060f, -0.399624200f, + 0.917290997f, -0.398217562f, + 0.917900776f, -0.396809987f, + 0.918508394f, -0.395401479f, + 0.919113852f, -0.393992040f, + 0.919717146f, -0.392581674f, + 0.920318277f, -0.391170384f, + 0.920917242f, -0.389758174f, + 0.921514039f, -0.388345047f, + 0.922108669f, -0.386931006f, + 0.922701128f, -0.385516054f, + 0.923291417f, -0.384100195f, + 0.923879533f, -0.382683432f, + 0.924465474f, -0.381265769f, + 0.925049241f, -0.379847209f, + 0.925630831f, -0.378427755f, + 0.926210242f, -0.377007410f, + 0.926787474f, -0.375586178f, + 0.927362526f, -0.374164063f, + 0.927935395f, -0.372741067f, + 0.928506080f, -0.371317194f, + 0.929074581f, -0.369892447f, + 0.929640896f, -0.368466830f, + 0.930205023f, -0.367040346f, + 0.930766961f, -0.365612998f, + 0.931326709f, -0.364184790f, + 0.931884266f, -0.362755724f, + 0.932439629f, -0.361325806f, + 0.932992799f, -0.359895037f, + 0.933543773f, -0.358463421f, + 0.934092550f, -0.357030961f, + 0.934639130f, -0.355597662f, + 0.935183510f, -0.354163525f, + 0.935725689f, -0.352728556f, + 0.936265667f, -0.351292756f, + 0.936803442f, -0.349856130f, + 0.937339012f, -0.348418680f, + 0.937872376f, -0.346980411f, + 0.938403534f, -0.345541325f, + 0.938932484f, -0.344101426f, + 0.939459224f, -0.342660717f, + 0.939983753f, -0.341219202f, + 0.940506071f, -0.339776884f, + 0.941026175f, -0.338333767f, + 0.941544065f, -0.336889853f, + 0.942059740f, -0.335445147f, + 0.942573198f, -0.333999651f, + 0.943084437f, -0.332553370f, + 0.943593458f, -0.331106306f, + 0.944100258f, -0.329658463f, + 0.944604837f, -0.328209844f, + 0.945107193f, -0.326760452f, + 0.945607325f, -0.325310292f, + 0.946105232f, -0.323859367f, + 0.946600913f, -0.322407679f, + 0.947094366f, -0.320955232f, + 0.947585591f, -0.319502031f, + 0.948074586f, -0.318048077f, + 0.948561350f, -0.316593376f, + 0.949045882f, -0.315137929f, + 0.949528181f, -0.313681740f, + 0.950008245f, -0.312224814f, + 0.950486074f, -0.310767153f, + 0.950961666f, -0.309308760f, + 0.951435021f, -0.307849640f, + 0.951906137f, -0.306389795f, + 0.952375013f, -0.304929230f, + 0.952841648f, -0.303467947f, + 0.953306040f, -0.302005949f, + 0.953768190f, -0.300543241f, + 0.954228095f, -0.299079826f, + 0.954685755f, -0.297615707f, + 0.955141168f, -0.296150888f, + 0.955594334f, -0.294685372f, + 0.956045251f, -0.293219163f, + 0.956493919f, -0.291752263f, + 0.956940336f, -0.290284677f, + 0.957384501f, -0.288816408f, + 0.957826413f, -0.287347460f, + 0.958266071f, -0.285877835f, + 0.958703475f, -0.284407537f, + 0.959138622f, -0.282936570f, + 0.959571513f, -0.281464938f, + 0.960002146f, -0.279992643f, + 0.960430519f, -0.278519689f, + 0.960856633f, -0.277046080f, + 0.961280486f, -0.275571819f, + 0.961702077f, -0.274096910f, + 0.962121404f, -0.272621355f, + 0.962538468f, -0.271145160f, + 0.962953267f, -0.269668326f, + 0.963365800f, -0.268190857f, + 0.963776066f, -0.266712757f, + 0.964184064f, -0.265234030f, + 0.964589793f, -0.263754679f, + 0.964993253f, -0.262274707f, + 0.965394442f, -0.260794118f, + 0.965793359f, -0.259312915f, + 0.966190003f, -0.257831102f, + 0.966584374f, -0.256348682f, + 0.966976471f, -0.254865660f, + 0.967366292f, -0.253382037f, + 0.967753837f, -0.251897818f, + 0.968139105f, -0.250413007f, + 0.968522094f, -0.248927606f, + 0.968902805f, -0.247441619f, + 0.969281235f, -0.245955050f, + 0.969657385f, -0.244467903f, + 0.970031253f, -0.242980180f, + 0.970402839f, -0.241491885f, + 0.970772141f, -0.240003022f, + 0.971139158f, -0.238513595f, + 0.971503891f, -0.237023606f, + 0.971866337f, -0.235533059f, + 0.972226497f, -0.234041959f, + 0.972584369f, -0.232550307f, + 0.972939952f, -0.231058108f, + 0.973293246f, -0.229565366f, + 0.973644250f, -0.228072083f, + 0.973992962f, -0.226578264f, + 0.974339383f, -0.225083911f, + 0.974683511f, -0.223589029f, + 0.975025345f, -0.222093621f, + 0.975364885f, -0.220597690f, + 0.975702130f, -0.219101240f, + 0.976037079f, -0.217604275f, + 0.976369731f, -0.216106797f, + 0.976700086f, -0.214608811f, + 0.977028143f, -0.213110320f, + 0.977353900f, -0.211611327f, + 0.977677358f, -0.210111837f, + 0.977998515f, -0.208611852f, + 0.978317371f, -0.207111376f, + 0.978633924f, -0.205610413f, + 0.978948175f, -0.204108966f, + 0.979260123f, -0.202607039f, + 0.979569766f, -0.201104635f, + 0.979877104f, -0.199601758f, + 0.980182136f, -0.198098411f, + 0.980484862f, -0.196594598f, + 0.980785280f, -0.195090322f, + 0.981083391f, -0.193585587f, + 0.981379193f, -0.192080397f, + 0.981672686f, -0.190574755f, + 0.981963869f, -0.189068664f, + 0.982252741f, -0.187562129f, + 0.982539302f, -0.186055152f, + 0.982823551f, -0.184547737f, + 0.983105487f, -0.183039888f, + 0.983385110f, -0.181531608f, + 0.983662419f, -0.180022901f, + 0.983937413f, -0.178513771f, + 0.984210092f, -0.177004220f, + 0.984480455f, -0.175494253f, + 0.984748502f, -0.173983873f, + 0.985014231f, -0.172473084f, + 0.985277642f, -0.170961889f, + 0.985538735f, -0.169450291f, + 0.985797509f, -0.167938295f, + 0.986053963f, -0.166425904f, + 0.986308097f, -0.164913120f, + 0.986559910f, -0.163399949f, + 0.986809402f, -0.161886394f, + 0.987056571f, -0.160372457f, + 0.987301418f, -0.158858143f, + 0.987543942f, -0.157343456f, + 0.987784142f, -0.155828398f, + 0.988022017f, -0.154312973f, + 0.988257568f, -0.152797185f, + 0.988490793f, -0.151281038f, + 0.988721692f, -0.149764535f, + 0.988950265f, -0.148247679f, + 0.989176510f, -0.146730474f, + 0.989400428f, -0.145212925f, + 0.989622017f, -0.143695033f, + 0.989841278f, -0.142176804f, + 0.990058210f, -0.140658239f, + 0.990272812f, -0.139139344f, + 0.990485084f, -0.137620122f, + 0.990695025f, -0.136100575f, + 0.990902635f, -0.134580709f, + 0.991107914f, -0.133060525f, + 0.991310860f, -0.131540029f, + 0.991511473f, -0.130019223f, + 0.991709754f, -0.128498111f, + 0.991905700f, -0.126976696f, + 0.992099313f, -0.125454983f, + 0.992290591f, -0.123932975f, + 0.992479535f, -0.122410675f, + 0.992666142f, -0.120888087f, + 0.992850414f, -0.119365215f, + 0.993032350f, -0.117842062f, + 0.993211949f, -0.116318631f, + 0.993389211f, -0.114794927f, + 0.993564136f, -0.113270952f, + 0.993736722f, -0.111746711f, + 0.993906970f, -0.110222207f, + 0.994074879f, -0.108697444f, + 0.994240449f, -0.107172425f, + 0.994403680f, -0.105647154f, + 0.994564571f, -0.104121634f, + 0.994723121f, -0.102595869f, + 0.994879331f, -0.101069863f, + 0.995033199f, -0.099543619f, + 0.995184727f, -0.098017140f, + 0.995333912f, -0.096490431f, + 0.995480755f, -0.094963495f, + 0.995625256f, -0.093436336f, + 0.995767414f, -0.091908956f, + 0.995907229f, -0.090381361f, + 0.996044701f, -0.088853553f, + 0.996179829f, -0.087325535f, + 0.996312612f, -0.085797312f, + 0.996443051f, -0.084268888f, + 0.996571146f, -0.082740265f, + 0.996696895f, -0.081211447f, + 0.996820299f, -0.079682438f, + 0.996941358f, -0.078153242f, + 0.997060070f, -0.076623861f, + 0.997176437f, -0.075094301f, + 0.997290457f, -0.073564564f, + 0.997402130f, -0.072034653f, + 0.997511456f, -0.070504573f, + 0.997618435f, -0.068974328f, + 0.997723067f, -0.067443920f, + 0.997825350f, -0.065913353f, + 0.997925286f, -0.064382631f, + 0.998022874f, -0.062851758f, + 0.998118113f, -0.061320736f, + 0.998211003f, -0.059789571f, + 0.998301545f, -0.058258265f, + 0.998389737f, -0.056726821f, + 0.998475581f, -0.055195244f, + 0.998559074f, -0.053663538f, + 0.998640218f, -0.052131705f, + 0.998719012f, -0.050599749f, + 0.998795456f, -0.049067674f, + 0.998869550f, -0.047535484f, + 0.998941293f, -0.046003182f, + 0.999010686f, -0.044470772f, + 0.999077728f, -0.042938257f, + 0.999142419f, -0.041405641f, + 0.999204759f, -0.039872928f, + 0.999264747f, -0.038340120f, + 0.999322385f, -0.036807223f, + 0.999377670f, -0.035274239f, + 0.999430605f, -0.033741172f, + 0.999481187f, -0.032208025f, + 0.999529418f, -0.030674803f, + 0.999575296f, -0.029141509f, + 0.999618822f, -0.027608146f, + 0.999659997f, -0.026074718f, + 0.999698819f, -0.024541229f, + 0.999735288f, -0.023007681f, + 0.999769405f, -0.021474080f, + 0.999801170f, -0.019940429f, + 0.999830582f, -0.018406730f, + 0.999857641f, -0.016872988f, + 0.999882347f, -0.015339206f, + 0.999904701f, -0.013805389f, + 0.999924702f, -0.012271538f, + 0.999942350f, -0.010737659f, + 0.999957645f, -0.009203755f, + 0.999970586f, -0.007669829f, + 0.999981175f, -0.006135885f, + 0.999989411f, -0.004601926f, + 0.999995294f, -0.003067957f, + 0.999998823f, -0.001533980f +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +/** + @brief Q31 Twiddle factors Table +*/ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_16) +/** + @par + Example code for Q31 Twiddle factors Generation:: + @par +
 for(i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefQ31[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefQ31[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 16, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to Q31(Fixed point 1.31): + round(twiddleCoefQ31(i) * pow(2, 31)) + */ +const q31_t twiddleCoef_16_q31[24] = { + (q31_t)0x7FFFFFFF, (q31_t)0x00000000, + (q31_t)0x7641AF3C, (q31_t)0x30FBC54D, + (q31_t)0x5A82799A, (q31_t)0x5A82799A, + (q31_t)0x30FBC54D, (q31_t)0x7641AF3C, + (q31_t)0x00000000, (q31_t)0x7FFFFFFF, + (q31_t)0xCF043AB2, (q31_t)0x7641AF3C, + (q31_t)0xA57D8666, (q31_t)0x5A82799A, + (q31_t)0x89BE50C3, (q31_t)0x30FBC54D, + (q31_t)0x80000000, (q31_t)0x00000000, + (q31_t)0x89BE50C3, (q31_t)0xCF043AB2, + (q31_t)0xA57D8666, (q31_t)0xA57D8666, + (q31_t)0xCF043AB2, (q31_t)0x89BE50C3 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_32) +/** + @par + Example code for Q31 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefQ31[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefQ31[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 32, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to Q31(Fixed point 1.31): + round(twiddleCoefQ31(i) * pow(2, 31)) + */ +const q31_t twiddleCoef_32_q31[48] = { + (q31_t)0x7FFFFFFF, (q31_t)0x00000000, + (q31_t)0x7D8A5F3F, (q31_t)0x18F8B83C, + (q31_t)0x7641AF3C, (q31_t)0x30FBC54D, + (q31_t)0x6A6D98A4, (q31_t)0x471CECE6, + (q31_t)0x5A82799A, (q31_t)0x5A82799A, + (q31_t)0x471CECE6, (q31_t)0x6A6D98A4, + (q31_t)0x30FBC54D, (q31_t)0x7641AF3C, + (q31_t)0x18F8B83C, (q31_t)0x7D8A5F3F, + (q31_t)0x00000000, (q31_t)0x7FFFFFFF, + (q31_t)0xE70747C3, (q31_t)0x7D8A5F3F, + (q31_t)0xCF043AB2, (q31_t)0x7641AF3C, + (q31_t)0xB8E31319, (q31_t)0x6A6D98A4, + (q31_t)0xA57D8666, (q31_t)0x5A82799A, + (q31_t)0x9592675B, (q31_t)0x471CECE6, + (q31_t)0x89BE50C3, (q31_t)0x30FBC54D, + (q31_t)0x8275A0C0, (q31_t)0x18F8B83C, + (q31_t)0x80000000, (q31_t)0x00000000, + (q31_t)0x8275A0C0, (q31_t)0xE70747C3, + (q31_t)0x89BE50C3, (q31_t)0xCF043AB2, + (q31_t)0x9592675B, (q31_t)0xB8E31319, + (q31_t)0xA57D8666, (q31_t)0xA57D8666, + (q31_t)0xB8E31319, (q31_t)0x9592675B, + (q31_t)0xCF043AB2, (q31_t)0x89BE50C3, + (q31_t)0xE70747C3, (q31_t)0x8275A0C0 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_64) +/** + @par + Example code for Q31 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefQ31[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefQ31[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 64, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to Q31(Fixed point 1.31): + round(twiddleCoefQ31(i) * pow(2, 31)) + */ +const q31_t twiddleCoef_64_q31[96] = { + (q31_t)0x7FFFFFFF, (q31_t)0x00000000, (q31_t)0x7F62368F, + (q31_t)0x0C8BD35E, (q31_t)0x7D8A5F3F, (q31_t)0x18F8B83C, + (q31_t)0x7A7D055B, (q31_t)0x25280C5D, (q31_t)0x7641AF3C, + (q31_t)0x30FBC54D, (q31_t)0x70E2CBC6, (q31_t)0x3C56BA70, + (q31_t)0x6A6D98A4, (q31_t)0x471CECE6, (q31_t)0x62F201AC, + (q31_t)0x5133CC94, (q31_t)0x5A82799A, (q31_t)0x5A82799A, + (q31_t)0x5133CC94, (q31_t)0x62F201AC, (q31_t)0x471CECE6, + (q31_t)0x6A6D98A4, (q31_t)0x3C56BA70, (q31_t)0x70E2CBC6, + (q31_t)0x30FBC54D, (q31_t)0x7641AF3C, (q31_t)0x25280C5D, + (q31_t)0x7A7D055B, (q31_t)0x18F8B83C, (q31_t)0x7D8A5F3F, + (q31_t)0x0C8BD35E, (q31_t)0x7F62368F, (q31_t)0x00000000, + (q31_t)0x7FFFFFFF, (q31_t)0xF3742CA1, (q31_t)0x7F62368F, + (q31_t)0xE70747C3, (q31_t)0x7D8A5F3F, (q31_t)0xDAD7F3A2, + (q31_t)0x7A7D055B, (q31_t)0xCF043AB2, (q31_t)0x7641AF3C, + (q31_t)0xC3A9458F, (q31_t)0x70E2CBC6, (q31_t)0xB8E31319, + (q31_t)0x6A6D98A4, (q31_t)0xAECC336B, (q31_t)0x62F201AC, + (q31_t)0xA57D8666, (q31_t)0x5A82799A, (q31_t)0x9D0DFE53, + (q31_t)0x5133CC94, (q31_t)0x9592675B, (q31_t)0x471CECE6, + (q31_t)0x8F1D343A, (q31_t)0x3C56BA70, (q31_t)0x89BE50C3, + (q31_t)0x30FBC54D, (q31_t)0x8582FAA4, (q31_t)0x25280C5D, + (q31_t)0x8275A0C0, (q31_t)0x18F8B83C, (q31_t)0x809DC970, + (q31_t)0x0C8BD35E, (q31_t)0x80000000, (q31_t)0x00000000, + (q31_t)0x809DC970, (q31_t)0xF3742CA1, (q31_t)0x8275A0C0, + (q31_t)0xE70747C3, (q31_t)0x8582FAA4, (q31_t)0xDAD7F3A2, + (q31_t)0x89BE50C3, (q31_t)0xCF043AB2, (q31_t)0x8F1D343A, + (q31_t)0xC3A9458F, (q31_t)0x9592675B, (q31_t)0xB8E31319, + (q31_t)0x9D0DFE53, (q31_t)0xAECC336B, (q31_t)0xA57D8666, + (q31_t)0xA57D8666, (q31_t)0xAECC336B, (q31_t)0x9D0DFE53, + (q31_t)0xB8E31319, (q31_t)0x9592675B, (q31_t)0xC3A9458F, + (q31_t)0x8F1D343A, (q31_t)0xCF043AB2, (q31_t)0x89BE50C3, + (q31_t)0xDAD7F3A2, (q31_t)0x8582FAA4, (q31_t)0xE70747C3, + (q31_t)0x8275A0C0, (q31_t)0xF3742CA1, (q31_t)0x809DC970 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_128) +/** + @par + Example code for Q31 Twiddle factors Generation:: + @par +
for (i = 0; i < 3N/4; i++)
+  {
+     twiddleCoefQ31[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefQ31[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 128, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to Q31(Fixed point 1.31): + round(twiddleCoefQ31(i) * pow(2, 31)) + */ +const q31_t twiddleCoef_128_q31[192] = { + (q31_t)0x7FFFFFFF, (q31_t)0x00000000, (q31_t)0x7FD8878D, + (q31_t)0x0647D97C, (q31_t)0x7F62368F, (q31_t)0x0C8BD35E, + (q31_t)0x7E9D55FC, (q31_t)0x12C8106E, (q31_t)0x7D8A5F3F, + (q31_t)0x18F8B83C, (q31_t)0x7C29FBEE, (q31_t)0x1F19F97B, + (q31_t)0x7A7D055B, (q31_t)0x25280C5D, (q31_t)0x78848413, + (q31_t)0x2B1F34EB, (q31_t)0x7641AF3C, (q31_t)0x30FBC54D, + (q31_t)0x73B5EBD0, (q31_t)0x36BA2013, (q31_t)0x70E2CBC6, + (q31_t)0x3C56BA70, (q31_t)0x6DCA0D14, (q31_t)0x41CE1E64, + (q31_t)0x6A6D98A4, (q31_t)0x471CECE6, (q31_t)0x66CF811F, + (q31_t)0x4C3FDFF3, (q31_t)0x62F201AC, (q31_t)0x5133CC94, + (q31_t)0x5ED77C89, (q31_t)0x55F5A4D2, (q31_t)0x5A82799A, + (q31_t)0x5A82799A, (q31_t)0x55F5A4D2, (q31_t)0x5ED77C89, + (q31_t)0x5133CC94, (q31_t)0x62F201AC, (q31_t)0x4C3FDFF3, + (q31_t)0x66CF811F, (q31_t)0x471CECE6, (q31_t)0x6A6D98A4, + (q31_t)0x41CE1E64, (q31_t)0x6DCA0D14, (q31_t)0x3C56BA70, + (q31_t)0x70E2CBC6, (q31_t)0x36BA2013, (q31_t)0x73B5EBD0, + (q31_t)0x30FBC54D, (q31_t)0x7641AF3C, (q31_t)0x2B1F34EB, + (q31_t)0x78848413, (q31_t)0x25280C5D, (q31_t)0x7A7D055B, + (q31_t)0x1F19F97B, (q31_t)0x7C29FBEE, (q31_t)0x18F8B83C, + (q31_t)0x7D8A5F3F, (q31_t)0x12C8106E, (q31_t)0x7E9D55FC, + (q31_t)0x0C8BD35E, (q31_t)0x7F62368F, (q31_t)0x0647D97C, + (q31_t)0x7FD8878D, (q31_t)0x00000000, (q31_t)0x7FFFFFFF, + (q31_t)0xF9B82683, (q31_t)0x7FD8878D, (q31_t)0xF3742CA1, + (q31_t)0x7F62368F, (q31_t)0xED37EF91, (q31_t)0x7E9D55FC, + (q31_t)0xE70747C3, (q31_t)0x7D8A5F3F, (q31_t)0xE0E60684, + (q31_t)0x7C29FBEE, (q31_t)0xDAD7F3A2, (q31_t)0x7A7D055B, + (q31_t)0xD4E0CB14, (q31_t)0x78848413, (q31_t)0xCF043AB2, + (q31_t)0x7641AF3C, (q31_t)0xC945DFEC, (q31_t)0x73B5EBD0, + (q31_t)0xC3A9458F, (q31_t)0x70E2CBC6, (q31_t)0xBE31E19B, + (q31_t)0x6DCA0D14, (q31_t)0xB8E31319, (q31_t)0x6A6D98A4, + (q31_t)0xB3C0200C, (q31_t)0x66CF811F, (q31_t)0xAECC336B, + (q31_t)0x62F201AC, (q31_t)0xAA0A5B2D, (q31_t)0x5ED77C89, + (q31_t)0xA57D8666, (q31_t)0x5A82799A, (q31_t)0xA1288376, + (q31_t)0x55F5A4D2, (q31_t)0x9D0DFE53, (q31_t)0x5133CC94, + (q31_t)0x99307EE0, (q31_t)0x4C3FDFF3, (q31_t)0x9592675B, + (q31_t)0x471CECE6, (q31_t)0x9235F2EB, (q31_t)0x41CE1E64, + (q31_t)0x8F1D343A, (q31_t)0x3C56BA70, (q31_t)0x8C4A142F, + (q31_t)0x36BA2013, (q31_t)0x89BE50C3, (q31_t)0x30FBC54D, + (q31_t)0x877B7BEC, (q31_t)0x2B1F34EB, (q31_t)0x8582FAA4, + (q31_t)0x25280C5D, (q31_t)0x83D60411, (q31_t)0x1F19F97B, + (q31_t)0x8275A0C0, (q31_t)0x18F8B83C, (q31_t)0x8162AA03, + (q31_t)0x12C8106E, (q31_t)0x809DC970, (q31_t)0x0C8BD35E, + (q31_t)0x80277872, (q31_t)0x0647D97C, (q31_t)0x80000000, + (q31_t)0x00000000, (q31_t)0x80277872, (q31_t)0xF9B82683, + (q31_t)0x809DC970, (q31_t)0xF3742CA1, (q31_t)0x8162AA03, + (q31_t)0xED37EF91, (q31_t)0x8275A0C0, (q31_t)0xE70747C3, + (q31_t)0x83D60411, (q31_t)0xE0E60684, (q31_t)0x8582FAA4, + (q31_t)0xDAD7F3A2, (q31_t)0x877B7BEC, (q31_t)0xD4E0CB14, + (q31_t)0x89BE50C3, (q31_t)0xCF043AB2, (q31_t)0x8C4A142F, + (q31_t)0xC945DFEC, (q31_t)0x8F1D343A, (q31_t)0xC3A9458F, + (q31_t)0x9235F2EB, (q31_t)0xBE31E19B, (q31_t)0x9592675B, + (q31_t)0xB8E31319, (q31_t)0x99307EE0, (q31_t)0xB3C0200C, + (q31_t)0x9D0DFE53, (q31_t)0xAECC336B, (q31_t)0xA1288376, + (q31_t)0xAA0A5B2D, (q31_t)0xA57D8666, (q31_t)0xA57D8666, + (q31_t)0xAA0A5B2D, (q31_t)0xA1288376, (q31_t)0xAECC336B, + (q31_t)0x9D0DFE53, (q31_t)0xB3C0200C, (q31_t)0x99307EE0, + (q31_t)0xB8E31319, (q31_t)0x9592675B, (q31_t)0xBE31E19B, + (q31_t)0x9235F2EB, (q31_t)0xC3A9458F, (q31_t)0x8F1D343A, + (q31_t)0xC945DFEC, (q31_t)0x8C4A142F, (q31_t)0xCF043AB2, + (q31_t)0x89BE50C3, (q31_t)0xD4E0CB14, (q31_t)0x877B7BEC, + (q31_t)0xDAD7F3A2, (q31_t)0x8582FAA4, (q31_t)0xE0E60684, + (q31_t)0x83D60411, (q31_t)0xE70747C3, (q31_t)0x8275A0C0, + (q31_t)0xED37EF91, (q31_t)0x8162AA03, (q31_t)0xF3742CA1, + (q31_t)0x809DC970, (q31_t)0xF9B82683, (q31_t)0x80277872 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_256) +/** + @par + Example code for Q31 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefQ31[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefQ31[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 256, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to Q31(Fixed point 1.31): + round(twiddleCoefQ31(i) * pow(2, 31)) + + */ +const q31_t twiddleCoef_256_q31[384] = { + (q31_t)0x7FFFFFFF, (q31_t)0x00000000, (q31_t)0x7FF62182, + (q31_t)0x03242ABF, (q31_t)0x7FD8878D, (q31_t)0x0647D97C, + (q31_t)0x7FA736B4, (q31_t)0x096A9049, (q31_t)0x7F62368F, + (q31_t)0x0C8BD35E, (q31_t)0x7F0991C3, (q31_t)0x0FAB272B, + (q31_t)0x7E9D55FC, (q31_t)0x12C8106E, (q31_t)0x7E1D93E9, + (q31_t)0x15E21444, (q31_t)0x7D8A5F3F, (q31_t)0x18F8B83C, + (q31_t)0x7CE3CEB1, (q31_t)0x1C0B826A, (q31_t)0x7C29FBEE, + (q31_t)0x1F19F97B, (q31_t)0x7B5D039D, (q31_t)0x2223A4C5, + (q31_t)0x7A7D055B, (q31_t)0x25280C5D, (q31_t)0x798A23B1, + (q31_t)0x2826B928, (q31_t)0x78848413, (q31_t)0x2B1F34EB, + (q31_t)0x776C4EDB, (q31_t)0x2E110A62, (q31_t)0x7641AF3C, + (q31_t)0x30FBC54D, (q31_t)0x7504D345, (q31_t)0x33DEF287, + (q31_t)0x73B5EBD0, (q31_t)0x36BA2013, (q31_t)0x72552C84, + (q31_t)0x398CDD32, (q31_t)0x70E2CBC6, (q31_t)0x3C56BA70, + (q31_t)0x6F5F02B1, (q31_t)0x3F1749B7, (q31_t)0x6DCA0D14, + (q31_t)0x41CE1E64, (q31_t)0x6C242960, (q31_t)0x447ACD50, + (q31_t)0x6A6D98A4, (q31_t)0x471CECE6, (q31_t)0x68A69E81, + (q31_t)0x49B41533, (q31_t)0x66CF811F, (q31_t)0x4C3FDFF3, + (q31_t)0x64E88926, (q31_t)0x4EBFE8A4, (q31_t)0x62F201AC, + (q31_t)0x5133CC94, (q31_t)0x60EC3830, (q31_t)0x539B2AEF, + (q31_t)0x5ED77C89, (q31_t)0x55F5A4D2, (q31_t)0x5CB420DF, + (q31_t)0x5842DD54, (q31_t)0x5A82799A, (q31_t)0x5A82799A, + (q31_t)0x5842DD54, (q31_t)0x5CB420DF, (q31_t)0x55F5A4D2, + (q31_t)0x5ED77C89, (q31_t)0x539B2AEF, (q31_t)0x60EC3830, + (q31_t)0x5133CC94, (q31_t)0x62F201AC, (q31_t)0x4EBFE8A4, + (q31_t)0x64E88926, (q31_t)0x4C3FDFF3, (q31_t)0x66CF811F, + (q31_t)0x49B41533, (q31_t)0x68A69E81, (q31_t)0x471CECE6, + (q31_t)0x6A6D98A4, (q31_t)0x447ACD50, (q31_t)0x6C242960, + (q31_t)0x41CE1E64, (q31_t)0x6DCA0D14, (q31_t)0x3F1749B7, + (q31_t)0x6F5F02B1, (q31_t)0x3C56BA70, (q31_t)0x70E2CBC6, + (q31_t)0x398CDD32, (q31_t)0x72552C84, (q31_t)0x36BA2013, + (q31_t)0x73B5EBD0, (q31_t)0x33DEF287, (q31_t)0x7504D345, + (q31_t)0x30FBC54D, (q31_t)0x7641AF3C, (q31_t)0x2E110A62, + (q31_t)0x776C4EDB, (q31_t)0x2B1F34EB, (q31_t)0x78848413, + (q31_t)0x2826B928, (q31_t)0x798A23B1, (q31_t)0x25280C5D, + (q31_t)0x7A7D055B, (q31_t)0x2223A4C5, (q31_t)0x7B5D039D, + (q31_t)0x1F19F97B, (q31_t)0x7C29FBEE, (q31_t)0x1C0B826A, + (q31_t)0x7CE3CEB1, (q31_t)0x18F8B83C, (q31_t)0x7D8A5F3F, + (q31_t)0x15E21444, (q31_t)0x7E1D93E9, (q31_t)0x12C8106E, + (q31_t)0x7E9D55FC, (q31_t)0x0FAB272B, (q31_t)0x7F0991C3, + (q31_t)0x0C8BD35E, (q31_t)0x7F62368F, (q31_t)0x096A9049, + (q31_t)0x7FA736B4, (q31_t)0x0647D97C, (q31_t)0x7FD8878D, + (q31_t)0x03242ABF, (q31_t)0x7FF62182, (q31_t)0x00000000, + (q31_t)0x7FFFFFFF, (q31_t)0xFCDBD541, (q31_t)0x7FF62182, + (q31_t)0xF9B82683, (q31_t)0x7FD8878D, (q31_t)0xF6956FB6, + (q31_t)0x7FA736B4, (q31_t)0xF3742CA1, (q31_t)0x7F62368F, + (q31_t)0xF054D8D4, (q31_t)0x7F0991C3, (q31_t)0xED37EF91, + (q31_t)0x7E9D55FC, (q31_t)0xEA1DEBBB, (q31_t)0x7E1D93E9, + (q31_t)0xE70747C3, (q31_t)0x7D8A5F3F, (q31_t)0xE3F47D95, + (q31_t)0x7CE3CEB1, (q31_t)0xE0E60684, (q31_t)0x7C29FBEE, + (q31_t)0xDDDC5B3A, (q31_t)0x7B5D039D, (q31_t)0xDAD7F3A2, + (q31_t)0x7A7D055B, (q31_t)0xD7D946D7, (q31_t)0x798A23B1, + (q31_t)0xD4E0CB14, (q31_t)0x78848413, (q31_t)0xD1EEF59E, + (q31_t)0x776C4EDB, (q31_t)0xCF043AB2, (q31_t)0x7641AF3C, + (q31_t)0xCC210D78, (q31_t)0x7504D345, (q31_t)0xC945DFEC, + (q31_t)0x73B5EBD0, (q31_t)0xC67322CD, (q31_t)0x72552C84, + (q31_t)0xC3A9458F, (q31_t)0x70E2CBC6, (q31_t)0xC0E8B648, + (q31_t)0x6F5F02B1, (q31_t)0xBE31E19B, (q31_t)0x6DCA0D14, + (q31_t)0xBB8532AF, (q31_t)0x6C242960, (q31_t)0xB8E31319, + (q31_t)0x6A6D98A4, (q31_t)0xB64BEACC, (q31_t)0x68A69E81, + (q31_t)0xB3C0200C, (q31_t)0x66CF811F, (q31_t)0xB140175B, + (q31_t)0x64E88926, (q31_t)0xAECC336B, (q31_t)0x62F201AC, + (q31_t)0xAC64D510, (q31_t)0x60EC3830, (q31_t)0xAA0A5B2D, + (q31_t)0x5ED77C89, (q31_t)0xA7BD22AB, (q31_t)0x5CB420DF, + (q31_t)0xA57D8666, (q31_t)0x5A82799A, (q31_t)0xA34BDF20, + (q31_t)0x5842DD54, (q31_t)0xA1288376, (q31_t)0x55F5A4D2, + (q31_t)0x9F13C7D0, (q31_t)0x539B2AEF, (q31_t)0x9D0DFE53, + (q31_t)0x5133CC94, (q31_t)0x9B1776D9, (q31_t)0x4EBFE8A4, + (q31_t)0x99307EE0, (q31_t)0x4C3FDFF3, (q31_t)0x9759617E, + (q31_t)0x49B41533, (q31_t)0x9592675B, (q31_t)0x471CECE6, + (q31_t)0x93DBD69F, (q31_t)0x447ACD50, (q31_t)0x9235F2EB, + (q31_t)0x41CE1E64, (q31_t)0x90A0FD4E, (q31_t)0x3F1749B7, + (q31_t)0x8F1D343A, (q31_t)0x3C56BA70, (q31_t)0x8DAAD37B, + (q31_t)0x398CDD32, (q31_t)0x8C4A142F, (q31_t)0x36BA2013, + (q31_t)0x8AFB2CBA, (q31_t)0x33DEF287, (q31_t)0x89BE50C3, + (q31_t)0x30FBC54D, (q31_t)0x8893B124, (q31_t)0x2E110A62, + (q31_t)0x877B7BEC, (q31_t)0x2B1F34EB, (q31_t)0x8675DC4E, + (q31_t)0x2826B928, (q31_t)0x8582FAA4, (q31_t)0x25280C5D, + (q31_t)0x84A2FC62, (q31_t)0x2223A4C5, (q31_t)0x83D60411, + (q31_t)0x1F19F97B, (q31_t)0x831C314E, (q31_t)0x1C0B826A, + (q31_t)0x8275A0C0, (q31_t)0x18F8B83C, (q31_t)0x81E26C16, + (q31_t)0x15E21444, (q31_t)0x8162AA03, (q31_t)0x12C8106E, + (q31_t)0x80F66E3C, (q31_t)0x0FAB272B, (q31_t)0x809DC970, + (q31_t)0x0C8BD35E, (q31_t)0x8058C94C, (q31_t)0x096A9049, + (q31_t)0x80277872, (q31_t)0x0647D97C, (q31_t)0x8009DE7D, + (q31_t)0x03242ABF, (q31_t)0x80000000, (q31_t)0x00000000, + (q31_t)0x8009DE7D, (q31_t)0xFCDBD541, (q31_t)0x80277872, + (q31_t)0xF9B82683, (q31_t)0x8058C94C, (q31_t)0xF6956FB6, + (q31_t)0x809DC970, (q31_t)0xF3742CA1, (q31_t)0x80F66E3C, + (q31_t)0xF054D8D4, (q31_t)0x8162AA03, (q31_t)0xED37EF91, + (q31_t)0x81E26C16, (q31_t)0xEA1DEBBB, (q31_t)0x8275A0C0, + (q31_t)0xE70747C3, (q31_t)0x831C314E, (q31_t)0xE3F47D95, + (q31_t)0x83D60411, (q31_t)0xE0E60684, (q31_t)0x84A2FC62, + (q31_t)0xDDDC5B3A, (q31_t)0x8582FAA4, (q31_t)0xDAD7F3A2, + (q31_t)0x8675DC4E, (q31_t)0xD7D946D7, (q31_t)0x877B7BEC, + (q31_t)0xD4E0CB14, (q31_t)0x8893B124, (q31_t)0xD1EEF59E, + (q31_t)0x89BE50C3, (q31_t)0xCF043AB2, (q31_t)0x8AFB2CBA, + (q31_t)0xCC210D78, (q31_t)0x8C4A142F, (q31_t)0xC945DFEC, + (q31_t)0x8DAAD37B, (q31_t)0xC67322CD, (q31_t)0x8F1D343A, + (q31_t)0xC3A9458F, (q31_t)0x90A0FD4E, (q31_t)0xC0E8B648, + (q31_t)0x9235F2EB, (q31_t)0xBE31E19B, (q31_t)0x93DBD69F, + (q31_t)0xBB8532AF, (q31_t)0x9592675B, (q31_t)0xB8E31319, + (q31_t)0x9759617E, (q31_t)0xB64BEACC, (q31_t)0x99307EE0, + (q31_t)0xB3C0200C, (q31_t)0x9B1776D9, (q31_t)0xB140175B, + (q31_t)0x9D0DFE53, (q31_t)0xAECC336B, (q31_t)0x9F13C7D0, + (q31_t)0xAC64D510, (q31_t)0xA1288376, (q31_t)0xAA0A5B2D, + (q31_t)0xA34BDF20, (q31_t)0xA7BD22AB, (q31_t)0xA57D8666, + (q31_t)0xA57D8666, (q31_t)0xA7BD22AB, (q31_t)0xA34BDF20, + (q31_t)0xAA0A5B2D, (q31_t)0xA1288376, (q31_t)0xAC64D510, + (q31_t)0x9F13C7D0, (q31_t)0xAECC336B, (q31_t)0x9D0DFE53, + (q31_t)0xB140175B, (q31_t)0x9B1776D9, (q31_t)0xB3C0200C, + (q31_t)0x99307EE0, (q31_t)0xB64BEACC, (q31_t)0x9759617E, + (q31_t)0xB8E31319, (q31_t)0x9592675B, (q31_t)0xBB8532AF, + (q31_t)0x93DBD69F, (q31_t)0xBE31E19B, (q31_t)0x9235F2EB, + (q31_t)0xC0E8B648, (q31_t)0x90A0FD4E, (q31_t)0xC3A9458F, + (q31_t)0x8F1D343A, (q31_t)0xC67322CD, (q31_t)0x8DAAD37B, + (q31_t)0xC945DFEC, (q31_t)0x8C4A142F, (q31_t)0xCC210D78, + (q31_t)0x8AFB2CBA, (q31_t)0xCF043AB2, (q31_t)0x89BE50C3, + (q31_t)0xD1EEF59E, (q31_t)0x8893B124, (q31_t)0xD4E0CB14, + (q31_t)0x877B7BEC, (q31_t)0xD7D946D7, (q31_t)0x8675DC4E, + (q31_t)0xDAD7F3A2, (q31_t)0x8582FAA4, (q31_t)0xDDDC5B3A, + (q31_t)0x84A2FC62, (q31_t)0xE0E60684, (q31_t)0x83D60411, + (q31_t)0xE3F47D95, (q31_t)0x831C314E, (q31_t)0xE70747C3, + (q31_t)0x8275A0C0, (q31_t)0xEA1DEBBB, (q31_t)0x81E26C16, + (q31_t)0xED37EF91, (q31_t)0x8162AA03, (q31_t)0xF054D8D4, + (q31_t)0x80F66E3C, (q31_t)0xF3742CA1, (q31_t)0x809DC970, + (q31_t)0xF6956FB6, (q31_t)0x8058C94C, (q31_t)0xF9B82683, + (q31_t)0x80277872, (q31_t)0xFCDBD541, (q31_t)0x8009DE7D +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_512) +/** + @par + Example code for Q31 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefQ31[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefQ31[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 512, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to Q31(Fixed point 1.31): + round(twiddleCoefQ31(i) * pow(2, 31)) + + */ +const q31_t twiddleCoef_512_q31[768] = { + (q31_t)0x7FFFFFFF, (q31_t)0x00000000, (q31_t)0x7FFD885A, + (q31_t)0x01921D1F, (q31_t)0x7FF62182, (q31_t)0x03242ABF, + (q31_t)0x7FE9CBC0, (q31_t)0x04B6195D, (q31_t)0x7FD8878D, + (q31_t)0x0647D97C, (q31_t)0x7FC25596, (q31_t)0x07D95B9E, + (q31_t)0x7FA736B4, (q31_t)0x096A9049, (q31_t)0x7F872BF3, + (q31_t)0x0AFB6805, (q31_t)0x7F62368F, (q31_t)0x0C8BD35E, + (q31_t)0x7F3857F5, (q31_t)0x0E1BC2E3, (q31_t)0x7F0991C3, + (q31_t)0x0FAB272B, (q31_t)0x7ED5E5C6, (q31_t)0x1139F0CE, + (q31_t)0x7E9D55FC, (q31_t)0x12C8106E, (q31_t)0x7E5FE493, + (q31_t)0x145576B1, (q31_t)0x7E1D93E9, (q31_t)0x15E21444, + (q31_t)0x7DD6668E, (q31_t)0x176DD9DE, (q31_t)0x7D8A5F3F, + (q31_t)0x18F8B83C, (q31_t)0x7D3980EC, (q31_t)0x1A82A025, + (q31_t)0x7CE3CEB1, (q31_t)0x1C0B826A, (q31_t)0x7C894BDD, + (q31_t)0x1D934FE5, (q31_t)0x7C29FBEE, (q31_t)0x1F19F97B, + (q31_t)0x7BC5E28F, (q31_t)0x209F701C, (q31_t)0x7B5D039D, + (q31_t)0x2223A4C5, (q31_t)0x7AEF6323, (q31_t)0x23A6887E, + (q31_t)0x7A7D055B, (q31_t)0x25280C5D, (q31_t)0x7A05EEAD, + (q31_t)0x26A82185, (q31_t)0x798A23B1, (q31_t)0x2826B928, + (q31_t)0x7909A92C, (q31_t)0x29A3C484, (q31_t)0x78848413, + (q31_t)0x2B1F34EB, (q31_t)0x77FAB988, (q31_t)0x2C98FBBA, + (q31_t)0x776C4EDB, (q31_t)0x2E110A62, (q31_t)0x76D94988, + (q31_t)0x2F875262, (q31_t)0x7641AF3C, (q31_t)0x30FBC54D, + (q31_t)0x75A585CF, (q31_t)0x326E54C7, (q31_t)0x7504D345, + (q31_t)0x33DEF287, (q31_t)0x745F9DD1, (q31_t)0x354D9056, + (q31_t)0x73B5EBD0, (q31_t)0x36BA2013, (q31_t)0x7307C3D0, + (q31_t)0x382493B0, (q31_t)0x72552C84, (q31_t)0x398CDD32, + (q31_t)0x719E2CD2, (q31_t)0x3AF2EEB7, (q31_t)0x70E2CBC6, + (q31_t)0x3C56BA70, (q31_t)0x70231099, (q31_t)0x3DB832A5, + (q31_t)0x6F5F02B1, (q31_t)0x3F1749B7, (q31_t)0x6E96A99C, + (q31_t)0x4073F21D, (q31_t)0x6DCA0D14, (q31_t)0x41CE1E64, + (q31_t)0x6CF934FB, (q31_t)0x4325C135, (q31_t)0x6C242960, + (q31_t)0x447ACD50, (q31_t)0x6B4AF278, (q31_t)0x45CD358F, + (q31_t)0x6A6D98A4, (q31_t)0x471CECE6, (q31_t)0x698C246C, + (q31_t)0x4869E664, (q31_t)0x68A69E81, (q31_t)0x49B41533, + (q31_t)0x67BD0FBC, (q31_t)0x4AFB6C97, (q31_t)0x66CF811F, + (q31_t)0x4C3FDFF3, (q31_t)0x65DDFBD3, (q31_t)0x4D8162C4, + (q31_t)0x64E88926, (q31_t)0x4EBFE8A4, (q31_t)0x63EF328F, + (q31_t)0x4FFB654D, (q31_t)0x62F201AC, (q31_t)0x5133CC94, + (q31_t)0x61F1003E, (q31_t)0x5269126E, (q31_t)0x60EC3830, + (q31_t)0x539B2AEF, (q31_t)0x5FE3B38D, (q31_t)0x54CA0A4A, + (q31_t)0x5ED77C89, (q31_t)0x55F5A4D2, (q31_t)0x5DC79D7C, + (q31_t)0x571DEEF9, (q31_t)0x5CB420DF, (q31_t)0x5842DD54, + (q31_t)0x5B9D1153, (q31_t)0x59646497, (q31_t)0x5A82799A, + (q31_t)0x5A82799A, (q31_t)0x59646497, (q31_t)0x5B9D1153, + (q31_t)0x5842DD54, (q31_t)0x5CB420DF, (q31_t)0x571DEEF9, + (q31_t)0x5DC79D7C, (q31_t)0x55F5A4D2, (q31_t)0x5ED77C89, + (q31_t)0x54CA0A4A, (q31_t)0x5FE3B38D, (q31_t)0x539B2AEF, + (q31_t)0x60EC3830, (q31_t)0x5269126E, (q31_t)0x61F1003E, + (q31_t)0x5133CC94, (q31_t)0x62F201AC, (q31_t)0x4FFB654D, + (q31_t)0x63EF328F, (q31_t)0x4EBFE8A4, (q31_t)0x64E88926, + (q31_t)0x4D8162C4, (q31_t)0x65DDFBD3, (q31_t)0x4C3FDFF3, + (q31_t)0x66CF811F, (q31_t)0x4AFB6C97, (q31_t)0x67BD0FBC, + (q31_t)0x49B41533, (q31_t)0x68A69E81, (q31_t)0x4869E664, + (q31_t)0x698C246C, (q31_t)0x471CECE6, (q31_t)0x6A6D98A4, + (q31_t)0x45CD358F, (q31_t)0x6B4AF278, (q31_t)0x447ACD50, + (q31_t)0x6C242960, (q31_t)0x4325C135, (q31_t)0x6CF934FB, + (q31_t)0x41CE1E64, (q31_t)0x6DCA0D14, (q31_t)0x4073F21D, + (q31_t)0x6E96A99C, (q31_t)0x3F1749B7, (q31_t)0x6F5F02B1, + (q31_t)0x3DB832A5, (q31_t)0x70231099, (q31_t)0x3C56BA70, + (q31_t)0x70E2CBC6, (q31_t)0x3AF2EEB7, (q31_t)0x719E2CD2, + (q31_t)0x398CDD32, (q31_t)0x72552C84, (q31_t)0x382493B0, + (q31_t)0x7307C3D0, (q31_t)0x36BA2013, (q31_t)0x73B5EBD0, + (q31_t)0x354D9056, (q31_t)0x745F9DD1, (q31_t)0x33DEF287, + (q31_t)0x7504D345, (q31_t)0x326E54C7, (q31_t)0x75A585CF, + (q31_t)0x30FBC54D, (q31_t)0x7641AF3C, (q31_t)0x2F875262, + (q31_t)0x76D94988, (q31_t)0x2E110A62, (q31_t)0x776C4EDB, + (q31_t)0x2C98FBBA, (q31_t)0x77FAB988, (q31_t)0x2B1F34EB, + (q31_t)0x78848413, (q31_t)0x29A3C484, (q31_t)0x7909A92C, + (q31_t)0x2826B928, (q31_t)0x798A23B1, (q31_t)0x26A82185, + (q31_t)0x7A05EEAD, (q31_t)0x25280C5D, (q31_t)0x7A7D055B, + (q31_t)0x23A6887E, (q31_t)0x7AEF6323, (q31_t)0x2223A4C5, + (q31_t)0x7B5D039D, (q31_t)0x209F701C, (q31_t)0x7BC5E28F, + (q31_t)0x1F19F97B, (q31_t)0x7C29FBEE, (q31_t)0x1D934FE5, + (q31_t)0x7C894BDD, (q31_t)0x1C0B826A, (q31_t)0x7CE3CEB1, + (q31_t)0x1A82A025, (q31_t)0x7D3980EC, (q31_t)0x18F8B83C, + (q31_t)0x7D8A5F3F, (q31_t)0x176DD9DE, (q31_t)0x7DD6668E, + (q31_t)0x15E21444, (q31_t)0x7E1D93E9, (q31_t)0x145576B1, + (q31_t)0x7E5FE493, (q31_t)0x12C8106E, (q31_t)0x7E9D55FC, + (q31_t)0x1139F0CE, (q31_t)0x7ED5E5C6, (q31_t)0x0FAB272B, + (q31_t)0x7F0991C3, (q31_t)0x0E1BC2E3, (q31_t)0x7F3857F5, + (q31_t)0x0C8BD35E, (q31_t)0x7F62368F, (q31_t)0x0AFB6805, + (q31_t)0x7F872BF3, (q31_t)0x096A9049, (q31_t)0x7FA736B4, + (q31_t)0x07D95B9E, (q31_t)0x7FC25596, (q31_t)0x0647D97C, + (q31_t)0x7FD8878D, (q31_t)0x04B6195D, (q31_t)0x7FE9CBC0, + (q31_t)0x03242ABF, (q31_t)0x7FF62182, (q31_t)0x01921D1F, + (q31_t)0x7FFD885A, (q31_t)0x00000000, (q31_t)0x7FFFFFFF, + (q31_t)0xFE6DE2E0, (q31_t)0x7FFD885A, (q31_t)0xFCDBD541, + (q31_t)0x7FF62182, (q31_t)0xFB49E6A2, (q31_t)0x7FE9CBC0, + (q31_t)0xF9B82683, (q31_t)0x7FD8878D, (q31_t)0xF826A461, + (q31_t)0x7FC25596, (q31_t)0xF6956FB6, (q31_t)0x7FA736B4, + (q31_t)0xF50497FA, (q31_t)0x7F872BF3, (q31_t)0xF3742CA1, + (q31_t)0x7F62368F, (q31_t)0xF1E43D1C, (q31_t)0x7F3857F5, + (q31_t)0xF054D8D4, (q31_t)0x7F0991C3, (q31_t)0xEEC60F31, + (q31_t)0x7ED5E5C6, (q31_t)0xED37EF91, (q31_t)0x7E9D55FC, + (q31_t)0xEBAA894E, (q31_t)0x7E5FE493, (q31_t)0xEA1DEBBB, + (q31_t)0x7E1D93E9, (q31_t)0xE8922621, (q31_t)0x7DD6668E, + (q31_t)0xE70747C3, (q31_t)0x7D8A5F3F, (q31_t)0xE57D5FDA, + (q31_t)0x7D3980EC, (q31_t)0xE3F47D95, (q31_t)0x7CE3CEB1, + (q31_t)0xE26CB01A, (q31_t)0x7C894BDD, (q31_t)0xE0E60684, + (q31_t)0x7C29FBEE, (q31_t)0xDF608FE3, (q31_t)0x7BC5E28F, + (q31_t)0xDDDC5B3A, (q31_t)0x7B5D039D, (q31_t)0xDC597781, + (q31_t)0x7AEF6323, (q31_t)0xDAD7F3A2, (q31_t)0x7A7D055B, + (q31_t)0xD957DE7A, (q31_t)0x7A05EEAD, (q31_t)0xD7D946D7, + (q31_t)0x798A23B1, (q31_t)0xD65C3B7B, (q31_t)0x7909A92C, + (q31_t)0xD4E0CB14, (q31_t)0x78848413, (q31_t)0xD3670445, + (q31_t)0x77FAB988, (q31_t)0xD1EEF59E, (q31_t)0x776C4EDB, + (q31_t)0xD078AD9D, (q31_t)0x76D94988, (q31_t)0xCF043AB2, + (q31_t)0x7641AF3C, (q31_t)0xCD91AB38, (q31_t)0x75A585CF, + (q31_t)0xCC210D78, (q31_t)0x7504D345, (q31_t)0xCAB26FA9, + (q31_t)0x745F9DD1, (q31_t)0xC945DFEC, (q31_t)0x73B5EBD0, + (q31_t)0xC7DB6C50, (q31_t)0x7307C3D0, (q31_t)0xC67322CD, + (q31_t)0x72552C84, (q31_t)0xC50D1148, (q31_t)0x719E2CD2, + (q31_t)0xC3A9458F, (q31_t)0x70E2CBC6, (q31_t)0xC247CD5A, + (q31_t)0x70231099, (q31_t)0xC0E8B648, (q31_t)0x6F5F02B1, + (q31_t)0xBF8C0DE2, (q31_t)0x6E96A99C, (q31_t)0xBE31E19B, + (q31_t)0x6DCA0D14, (q31_t)0xBCDA3ECA, (q31_t)0x6CF934FB, + (q31_t)0xBB8532AF, (q31_t)0x6C242960, (q31_t)0xBA32CA70, + (q31_t)0x6B4AF278, (q31_t)0xB8E31319, (q31_t)0x6A6D98A4, + (q31_t)0xB796199B, (q31_t)0x698C246C, (q31_t)0xB64BEACC, + (q31_t)0x68A69E81, (q31_t)0xB5049368, (q31_t)0x67BD0FBC, + (q31_t)0xB3C0200C, (q31_t)0x66CF811F, (q31_t)0xB27E9D3B, + (q31_t)0x65DDFBD3, (q31_t)0xB140175B, (q31_t)0x64E88926, + (q31_t)0xB0049AB2, (q31_t)0x63EF328F, (q31_t)0xAECC336B, + (q31_t)0x62F201AC, (q31_t)0xAD96ED91, (q31_t)0x61F1003E, + (q31_t)0xAC64D510, (q31_t)0x60EC3830, (q31_t)0xAB35F5B5, + (q31_t)0x5FE3B38D, (q31_t)0xAA0A5B2D, (q31_t)0x5ED77C89, + (q31_t)0xA8E21106, (q31_t)0x5DC79D7C, (q31_t)0xA7BD22AB, + (q31_t)0x5CB420DF, (q31_t)0xA69B9B68, (q31_t)0x5B9D1153, + (q31_t)0xA57D8666, (q31_t)0x5A82799A, (q31_t)0xA462EEAC, + (q31_t)0x59646497, (q31_t)0xA34BDF20, (q31_t)0x5842DD54, + (q31_t)0xA2386283, (q31_t)0x571DEEF9, (q31_t)0xA1288376, + (q31_t)0x55F5A4D2, (q31_t)0xA01C4C72, (q31_t)0x54CA0A4A, + (q31_t)0x9F13C7D0, (q31_t)0x539B2AEF, (q31_t)0x9E0EFFC1, + (q31_t)0x5269126E, (q31_t)0x9D0DFE53, (q31_t)0x5133CC94, + (q31_t)0x9C10CD70, (q31_t)0x4FFB654D, (q31_t)0x9B1776D9, + (q31_t)0x4EBFE8A4, (q31_t)0x9A22042C, (q31_t)0x4D8162C4, + (q31_t)0x99307EE0, (q31_t)0x4C3FDFF3, (q31_t)0x9842F043, + (q31_t)0x4AFB6C97, (q31_t)0x9759617E, (q31_t)0x49B41533, + (q31_t)0x9673DB94, (q31_t)0x4869E664, (q31_t)0x9592675B, + (q31_t)0x471CECE6, (q31_t)0x94B50D87, (q31_t)0x45CD358F, + (q31_t)0x93DBD69F, (q31_t)0x447ACD50, (q31_t)0x9306CB04, + (q31_t)0x4325C135, (q31_t)0x9235F2EB, (q31_t)0x41CE1E64, + (q31_t)0x91695663, (q31_t)0x4073F21D, (q31_t)0x90A0FD4E, + (q31_t)0x3F1749B7, (q31_t)0x8FDCEF66, (q31_t)0x3DB832A5, + (q31_t)0x8F1D343A, (q31_t)0x3C56BA70, (q31_t)0x8E61D32D, + (q31_t)0x3AF2EEB7, (q31_t)0x8DAAD37B, (q31_t)0x398CDD32, + (q31_t)0x8CF83C30, (q31_t)0x382493B0, (q31_t)0x8C4A142F, + (q31_t)0x36BA2013, (q31_t)0x8BA0622F, (q31_t)0x354D9056, + (q31_t)0x8AFB2CBA, (q31_t)0x33DEF287, (q31_t)0x8A5A7A30, + (q31_t)0x326E54C7, (q31_t)0x89BE50C3, (q31_t)0x30FBC54D, + (q31_t)0x8926B677, (q31_t)0x2F875262, (q31_t)0x8893B124, + (q31_t)0x2E110A62, (q31_t)0x88054677, (q31_t)0x2C98FBBA, + (q31_t)0x877B7BEC, (q31_t)0x2B1F34EB, (q31_t)0x86F656D3, + (q31_t)0x29A3C484, (q31_t)0x8675DC4E, (q31_t)0x2826B928, + (q31_t)0x85FA1152, (q31_t)0x26A82185, (q31_t)0x8582FAA4, + (q31_t)0x25280C5D, (q31_t)0x85109CDC, (q31_t)0x23A6887E, + (q31_t)0x84A2FC62, (q31_t)0x2223A4C5, (q31_t)0x843A1D70, + (q31_t)0x209F701C, (q31_t)0x83D60411, (q31_t)0x1F19F97B, + (q31_t)0x8376B422, (q31_t)0x1D934FE5, (q31_t)0x831C314E, + (q31_t)0x1C0B826A, (q31_t)0x82C67F13, (q31_t)0x1A82A025, + (q31_t)0x8275A0C0, (q31_t)0x18F8B83C, (q31_t)0x82299971, + (q31_t)0x176DD9DE, (q31_t)0x81E26C16, (q31_t)0x15E21444, + (q31_t)0x81A01B6C, (q31_t)0x145576B1, (q31_t)0x8162AA03, + (q31_t)0x12C8106E, (q31_t)0x812A1A39, (q31_t)0x1139F0CE, + (q31_t)0x80F66E3C, (q31_t)0x0FAB272B, (q31_t)0x80C7A80A, + (q31_t)0x0E1BC2E3, (q31_t)0x809DC970, (q31_t)0x0C8BD35E, + (q31_t)0x8078D40D, (q31_t)0x0AFB6805, (q31_t)0x8058C94C, + (q31_t)0x096A9049, (q31_t)0x803DAA69, (q31_t)0x07D95B9E, + (q31_t)0x80277872, (q31_t)0x0647D97C, (q31_t)0x80163440, + (q31_t)0x04B6195D, (q31_t)0x8009DE7D, (q31_t)0x03242ABF, + (q31_t)0x800277A5, (q31_t)0x01921D1F, (q31_t)0x80000000, + (q31_t)0x00000000, (q31_t)0x800277A5, (q31_t)0xFE6DE2E0, + (q31_t)0x8009DE7D, (q31_t)0xFCDBD541, (q31_t)0x80163440, + (q31_t)0xFB49E6A2, (q31_t)0x80277872, (q31_t)0xF9B82683, + (q31_t)0x803DAA69, (q31_t)0xF826A461, (q31_t)0x8058C94C, + (q31_t)0xF6956FB6, (q31_t)0x8078D40D, (q31_t)0xF50497FA, + (q31_t)0x809DC970, (q31_t)0xF3742CA1, (q31_t)0x80C7A80A, + (q31_t)0xF1E43D1C, (q31_t)0x80F66E3C, (q31_t)0xF054D8D4, + (q31_t)0x812A1A39, (q31_t)0xEEC60F31, (q31_t)0x8162AA03, + (q31_t)0xED37EF91, (q31_t)0x81A01B6C, (q31_t)0xEBAA894E, + (q31_t)0x81E26C16, (q31_t)0xEA1DEBBB, (q31_t)0x82299971, + (q31_t)0xE8922621, (q31_t)0x8275A0C0, (q31_t)0xE70747C3, + (q31_t)0x82C67F13, (q31_t)0xE57D5FDA, (q31_t)0x831C314E, + (q31_t)0xE3F47D95, (q31_t)0x8376B422, (q31_t)0xE26CB01A, + (q31_t)0x83D60411, (q31_t)0xE0E60684, (q31_t)0x843A1D70, + (q31_t)0xDF608FE3, (q31_t)0x84A2FC62, (q31_t)0xDDDC5B3A, + (q31_t)0x85109CDC, (q31_t)0xDC597781, (q31_t)0x8582FAA4, + (q31_t)0xDAD7F3A2, (q31_t)0x85FA1152, (q31_t)0xD957DE7A, + (q31_t)0x8675DC4E, (q31_t)0xD7D946D7, (q31_t)0x86F656D3, + (q31_t)0xD65C3B7B, (q31_t)0x877B7BEC, (q31_t)0xD4E0CB14, + (q31_t)0x88054677, (q31_t)0xD3670445, (q31_t)0x8893B124, + (q31_t)0xD1EEF59E, (q31_t)0x8926B677, (q31_t)0xD078AD9D, + (q31_t)0x89BE50C3, (q31_t)0xCF043AB2, (q31_t)0x8A5A7A30, + (q31_t)0xCD91AB38, (q31_t)0x8AFB2CBA, (q31_t)0xCC210D78, + (q31_t)0x8BA0622F, (q31_t)0xCAB26FA9, (q31_t)0x8C4A142F, + (q31_t)0xC945DFEC, (q31_t)0x8CF83C30, (q31_t)0xC7DB6C50, + (q31_t)0x8DAAD37B, (q31_t)0xC67322CD, (q31_t)0x8E61D32D, + (q31_t)0xC50D1148, (q31_t)0x8F1D343A, (q31_t)0xC3A9458F, + (q31_t)0x8FDCEF66, (q31_t)0xC247CD5A, (q31_t)0x90A0FD4E, + (q31_t)0xC0E8B648, (q31_t)0x91695663, (q31_t)0xBF8C0DE2, + (q31_t)0x9235F2EB, (q31_t)0xBE31E19B, (q31_t)0x9306CB04, + (q31_t)0xBCDA3ECA, (q31_t)0x93DBD69F, (q31_t)0xBB8532AF, + (q31_t)0x94B50D87, (q31_t)0xBA32CA70, (q31_t)0x9592675B, + (q31_t)0xB8E31319, (q31_t)0x9673DB94, (q31_t)0xB796199B, + (q31_t)0x9759617E, (q31_t)0xB64BEACC, (q31_t)0x9842F043, + (q31_t)0xB5049368, (q31_t)0x99307EE0, (q31_t)0xB3C0200C, + (q31_t)0x9A22042C, (q31_t)0xB27E9D3B, (q31_t)0x9B1776D9, + (q31_t)0xB140175B, (q31_t)0x9C10CD70, (q31_t)0xB0049AB2, + (q31_t)0x9D0DFE53, (q31_t)0xAECC336B, (q31_t)0x9E0EFFC1, + (q31_t)0xAD96ED91, (q31_t)0x9F13C7D0, (q31_t)0xAC64D510, + (q31_t)0xA01C4C72, (q31_t)0xAB35F5B5, (q31_t)0xA1288376, + (q31_t)0xAA0A5B2D, (q31_t)0xA2386283, (q31_t)0xA8E21106, + (q31_t)0xA34BDF20, (q31_t)0xA7BD22AB, (q31_t)0xA462EEAC, + (q31_t)0xA69B9B68, (q31_t)0xA57D8666, (q31_t)0xA57D8666, + (q31_t)0xA69B9B68, (q31_t)0xA462EEAC, (q31_t)0xA7BD22AB, + (q31_t)0xA34BDF20, (q31_t)0xA8E21106, (q31_t)0xA2386283, + (q31_t)0xAA0A5B2D, (q31_t)0xA1288376, (q31_t)0xAB35F5B5, + (q31_t)0xA01C4C72, (q31_t)0xAC64D510, (q31_t)0x9F13C7D0, + (q31_t)0xAD96ED91, (q31_t)0x9E0EFFC1, (q31_t)0xAECC336B, + (q31_t)0x9D0DFE53, (q31_t)0xB0049AB2, (q31_t)0x9C10CD70, + (q31_t)0xB140175B, (q31_t)0x9B1776D9, (q31_t)0xB27E9D3B, + (q31_t)0x9A22042C, (q31_t)0xB3C0200C, (q31_t)0x99307EE0, + (q31_t)0xB5049368, (q31_t)0x9842F043, (q31_t)0xB64BEACC, + (q31_t)0x9759617E, (q31_t)0xB796199B, (q31_t)0x9673DB94, + (q31_t)0xB8E31319, (q31_t)0x9592675B, (q31_t)0xBA32CA70, + (q31_t)0x94B50D87, (q31_t)0xBB8532AF, (q31_t)0x93DBD69F, + (q31_t)0xBCDA3ECA, (q31_t)0x9306CB04, (q31_t)0xBE31E19B, + (q31_t)0x9235F2EB, (q31_t)0xBF8C0DE2, (q31_t)0x91695663, + (q31_t)0xC0E8B648, (q31_t)0x90A0FD4E, (q31_t)0xC247CD5A, + (q31_t)0x8FDCEF66, (q31_t)0xC3A9458F, (q31_t)0x8F1D343A, + (q31_t)0xC50D1148, (q31_t)0x8E61D32D, (q31_t)0xC67322CD, + (q31_t)0x8DAAD37B, (q31_t)0xC7DB6C50, (q31_t)0x8CF83C30, + (q31_t)0xC945DFEC, (q31_t)0x8C4A142F, (q31_t)0xCAB26FA9, + (q31_t)0x8BA0622F, (q31_t)0xCC210D78, (q31_t)0x8AFB2CBA, + (q31_t)0xCD91AB38, (q31_t)0x8A5A7A30, (q31_t)0xCF043AB2, + (q31_t)0x89BE50C3, (q31_t)0xD078AD9D, (q31_t)0x8926B677, + (q31_t)0xD1EEF59E, (q31_t)0x8893B124, (q31_t)0xD3670445, + (q31_t)0x88054677, (q31_t)0xD4E0CB14, (q31_t)0x877B7BEC, + (q31_t)0xD65C3B7B, (q31_t)0x86F656D3, (q31_t)0xD7D946D7, + (q31_t)0x8675DC4E, (q31_t)0xD957DE7A, (q31_t)0x85FA1152, + (q31_t)0xDAD7F3A2, (q31_t)0x8582FAA4, (q31_t)0xDC597781, + (q31_t)0x85109CDC, (q31_t)0xDDDC5B3A, (q31_t)0x84A2FC62, + (q31_t)0xDF608FE3, (q31_t)0x843A1D70, (q31_t)0xE0E60684, + (q31_t)0x83D60411, (q31_t)0xE26CB01A, (q31_t)0x8376B422, + (q31_t)0xE3F47D95, (q31_t)0x831C314E, (q31_t)0xE57D5FDA, + (q31_t)0x82C67F13, (q31_t)0xE70747C3, (q31_t)0x8275A0C0, + (q31_t)0xE8922621, (q31_t)0x82299971, (q31_t)0xEA1DEBBB, + (q31_t)0x81E26C16, (q31_t)0xEBAA894E, (q31_t)0x81A01B6C, + (q31_t)0xED37EF91, (q31_t)0x8162AA03, (q31_t)0xEEC60F31, + (q31_t)0x812A1A39, (q31_t)0xF054D8D4, (q31_t)0x80F66E3C, + (q31_t)0xF1E43D1C, (q31_t)0x80C7A80A, (q31_t)0xF3742CA1, + (q31_t)0x809DC970, (q31_t)0xF50497FA, (q31_t)0x8078D40D, + (q31_t)0xF6956FB6, (q31_t)0x8058C94C, (q31_t)0xF826A461, + (q31_t)0x803DAA69, (q31_t)0xF9B82683, (q31_t)0x80277872, + (q31_t)0xFB49E6A2, (q31_t)0x80163440, (q31_t)0xFCDBD541, + (q31_t)0x8009DE7D, (q31_t)0xFE6DE2E0, (q31_t)0x800277A5 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) +/** + @par + Example code for Q31 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefQ31[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefQ31[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 1024, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to Q31(Fixed point 1.31): + round(twiddleCoefQ31(i) * pow(2, 31)) + + */ +const q31_t twiddleCoef_1024_q31[1536] = { + (q31_t)0x7FFFFFFF, (q31_t)0x00000000, (q31_t)0x7FFF6216, + (q31_t)0x00C90F88, (q31_t)0x7FFD885A, (q31_t)0x01921D1F, + (q31_t)0x7FFA72D1, (q31_t)0x025B26D7, (q31_t)0x7FF62182, + (q31_t)0x03242ABF, (q31_t)0x7FF09477, (q31_t)0x03ED26E6, + (q31_t)0x7FE9CBC0, (q31_t)0x04B6195D, (q31_t)0x7FE1C76B, + (q31_t)0x057F0034, (q31_t)0x7FD8878D, (q31_t)0x0647D97C, + (q31_t)0x7FCE0C3E, (q31_t)0x0710A344, (q31_t)0x7FC25596, + (q31_t)0x07D95B9E, (q31_t)0x7FB563B2, (q31_t)0x08A2009A, + (q31_t)0x7FA736B4, (q31_t)0x096A9049, (q31_t)0x7F97CEBC, + (q31_t)0x0A3308BC, (q31_t)0x7F872BF3, (q31_t)0x0AFB6805, + (q31_t)0x7F754E7F, (q31_t)0x0BC3AC35, (q31_t)0x7F62368F, + (q31_t)0x0C8BD35E, (q31_t)0x7F4DE450, (q31_t)0x0D53DB92, + (q31_t)0x7F3857F5, (q31_t)0x0E1BC2E3, (q31_t)0x7F2191B4, + (q31_t)0x0EE38765, (q31_t)0x7F0991C3, (q31_t)0x0FAB272B, + (q31_t)0x7EF0585F, (q31_t)0x1072A047, (q31_t)0x7ED5E5C6, + (q31_t)0x1139F0CE, (q31_t)0x7EBA3A39, (q31_t)0x120116D4, + (q31_t)0x7E9D55FC, (q31_t)0x12C8106E, (q31_t)0x7E7F3956, + (q31_t)0x138EDBB0, (q31_t)0x7E5FE493, (q31_t)0x145576B1, + (q31_t)0x7E3F57FE, (q31_t)0x151BDF85, (q31_t)0x7E1D93E9, + (q31_t)0x15E21444, (q31_t)0x7DFA98A7, (q31_t)0x16A81305, + (q31_t)0x7DD6668E, (q31_t)0x176DD9DE, (q31_t)0x7DB0FDF7, + (q31_t)0x183366E8, (q31_t)0x7D8A5F3F, (q31_t)0x18F8B83C, + (q31_t)0x7D628AC5, (q31_t)0x19BDCBF2, (q31_t)0x7D3980EC, + (q31_t)0x1A82A025, (q31_t)0x7D0F4218, (q31_t)0x1B4732EF, + (q31_t)0x7CE3CEB1, (q31_t)0x1C0B826A, (q31_t)0x7CB72724, + (q31_t)0x1CCF8CB3, (q31_t)0x7C894BDD, (q31_t)0x1D934FE5, + (q31_t)0x7C5A3D4F, (q31_t)0x1E56CA1E, (q31_t)0x7C29FBEE, + (q31_t)0x1F19F97B, (q31_t)0x7BF88830, (q31_t)0x1FDCDC1A, + (q31_t)0x7BC5E28F, (q31_t)0x209F701C, (q31_t)0x7B920B89, + (q31_t)0x2161B39F, (q31_t)0x7B5D039D, (q31_t)0x2223A4C5, + (q31_t)0x7B26CB4F, (q31_t)0x22E541AE, (q31_t)0x7AEF6323, + (q31_t)0x23A6887E, (q31_t)0x7AB6CBA3, (q31_t)0x24677757, + (q31_t)0x7A7D055B, (q31_t)0x25280C5D, (q31_t)0x7A4210D8, + (q31_t)0x25E845B5, (q31_t)0x7A05EEAD, (q31_t)0x26A82185, + (q31_t)0x79C89F6D, (q31_t)0x27679DF4, (q31_t)0x798A23B1, + (q31_t)0x2826B928, (q31_t)0x794A7C11, (q31_t)0x28E5714A, + (q31_t)0x7909A92C, (q31_t)0x29A3C484, (q31_t)0x78C7ABA1, + (q31_t)0x2A61B101, (q31_t)0x78848413, (q31_t)0x2B1F34EB, + (q31_t)0x78403328, (q31_t)0x2BDC4E6F, (q31_t)0x77FAB988, + (q31_t)0x2C98FBBA, (q31_t)0x77B417DF, (q31_t)0x2D553AFB, + (q31_t)0x776C4EDB, (q31_t)0x2E110A62, (q31_t)0x77235F2D, + (q31_t)0x2ECC681E, (q31_t)0x76D94988, (q31_t)0x2F875262, + (q31_t)0x768E0EA5, (q31_t)0x3041C760, (q31_t)0x7641AF3C, + (q31_t)0x30FBC54D, (q31_t)0x75F42C0A, (q31_t)0x31B54A5D, + (q31_t)0x75A585CF, (q31_t)0x326E54C7, (q31_t)0x7555BD4B, + (q31_t)0x3326E2C2, (q31_t)0x7504D345, (q31_t)0x33DEF287, + (q31_t)0x74B2C883, (q31_t)0x3496824F, (q31_t)0x745F9DD1, + (q31_t)0x354D9056, (q31_t)0x740B53FA, (q31_t)0x36041AD9, + (q31_t)0x73B5EBD0, (q31_t)0x36BA2013, (q31_t)0x735F6626, + (q31_t)0x376F9E46, (q31_t)0x7307C3D0, (q31_t)0x382493B0, + (q31_t)0x72AF05A6, (q31_t)0x38D8FE93, (q31_t)0x72552C84, + (q31_t)0x398CDD32, (q31_t)0x71FA3948, (q31_t)0x3A402DD1, + (q31_t)0x719E2CD2, (q31_t)0x3AF2EEB7, (q31_t)0x71410804, + (q31_t)0x3BA51E29, (q31_t)0x70E2CBC6, (q31_t)0x3C56BA70, + (q31_t)0x708378FE, (q31_t)0x3D07C1D5, (q31_t)0x70231099, + (q31_t)0x3DB832A5, (q31_t)0x6FC19385, (q31_t)0x3E680B2C, + (q31_t)0x6F5F02B1, (q31_t)0x3F1749B7, (q31_t)0x6EFB5F12, + (q31_t)0x3FC5EC97, (q31_t)0x6E96A99C, (q31_t)0x4073F21D, + (q31_t)0x6E30E349, (q31_t)0x4121589A, (q31_t)0x6DCA0D14, + (q31_t)0x41CE1E64, (q31_t)0x6D6227FA, (q31_t)0x427A41D0, + (q31_t)0x6CF934FB, (q31_t)0x4325C135, (q31_t)0x6C8F351C, + (q31_t)0x43D09AEC, (q31_t)0x6C242960, (q31_t)0x447ACD50, + (q31_t)0x6BB812D0, (q31_t)0x452456BC, (q31_t)0x6B4AF278, + (q31_t)0x45CD358F, (q31_t)0x6ADCC964, (q31_t)0x46756827, + (q31_t)0x6A6D98A4, (q31_t)0x471CECE6, (q31_t)0x69FD614A, + (q31_t)0x47C3C22E, (q31_t)0x698C246C, (q31_t)0x4869E664, + (q31_t)0x6919E320, (q31_t)0x490F57EE, (q31_t)0x68A69E81, + (q31_t)0x49B41533, (q31_t)0x683257AA, (q31_t)0x4A581C9D, + (q31_t)0x67BD0FBC, (q31_t)0x4AFB6C97, (q31_t)0x6746C7D7, + (q31_t)0x4B9E038F, (q31_t)0x66CF811F, (q31_t)0x4C3FDFF3, + (q31_t)0x66573CBB, (q31_t)0x4CE10034, (q31_t)0x65DDFBD3, + (q31_t)0x4D8162C4, (q31_t)0x6563BF92, (q31_t)0x4E210617, + (q31_t)0x64E88926, (q31_t)0x4EBFE8A4, (q31_t)0x646C59BF, + (q31_t)0x4F5E08E3, (q31_t)0x63EF328F, (q31_t)0x4FFB654D, + (q31_t)0x637114CC, (q31_t)0x5097FC5E, (q31_t)0x62F201AC, + (q31_t)0x5133CC94, (q31_t)0x6271FA69, (q31_t)0x51CED46E, + (q31_t)0x61F1003E, (q31_t)0x5269126E, (q31_t)0x616F146B, + (q31_t)0x53028517, (q31_t)0x60EC3830, (q31_t)0x539B2AEF, + (q31_t)0x60686CCE, (q31_t)0x5433027D, (q31_t)0x5FE3B38D, + (q31_t)0x54CA0A4A, (q31_t)0x5F5E0DB3, (q31_t)0x556040E2, + (q31_t)0x5ED77C89, (q31_t)0x55F5A4D2, (q31_t)0x5E50015D, + (q31_t)0x568A34A9, (q31_t)0x5DC79D7C, (q31_t)0x571DEEF9, + (q31_t)0x5D3E5236, (q31_t)0x57B0D256, (q31_t)0x5CB420DF, + (q31_t)0x5842DD54, (q31_t)0x5C290ACC, (q31_t)0x58D40E8C, + (q31_t)0x5B9D1153, (q31_t)0x59646497, (q31_t)0x5B1035CF, + (q31_t)0x59F3DE12, (q31_t)0x5A82799A, (q31_t)0x5A82799A, + (q31_t)0x59F3DE12, (q31_t)0x5B1035CF, (q31_t)0x59646497, + (q31_t)0x5B9D1153, (q31_t)0x58D40E8C, (q31_t)0x5C290ACC, + (q31_t)0x5842DD54, (q31_t)0x5CB420DF, (q31_t)0x57B0D256, + (q31_t)0x5D3E5236, (q31_t)0x571DEEF9, (q31_t)0x5DC79D7C, + (q31_t)0x568A34A9, (q31_t)0x5E50015D, (q31_t)0x55F5A4D2, + (q31_t)0x5ED77C89, (q31_t)0x556040E2, (q31_t)0x5F5E0DB3, + (q31_t)0x54CA0A4A, (q31_t)0x5FE3B38D, (q31_t)0x5433027D, + (q31_t)0x60686CCE, (q31_t)0x539B2AEF, (q31_t)0x60EC3830, + (q31_t)0x53028517, (q31_t)0x616F146B, (q31_t)0x5269126E, + (q31_t)0x61F1003E, (q31_t)0x51CED46E, (q31_t)0x6271FA69, + (q31_t)0x5133CC94, (q31_t)0x62F201AC, (q31_t)0x5097FC5E, + (q31_t)0x637114CC, (q31_t)0x4FFB654D, (q31_t)0x63EF328F, + (q31_t)0x4F5E08E3, (q31_t)0x646C59BF, (q31_t)0x4EBFE8A4, + (q31_t)0x64E88926, (q31_t)0x4E210617, (q31_t)0x6563BF92, + (q31_t)0x4D8162C4, (q31_t)0x65DDFBD3, (q31_t)0x4CE10034, + (q31_t)0x66573CBB, (q31_t)0x4C3FDFF3, (q31_t)0x66CF811F, + (q31_t)0x4B9E038F, (q31_t)0x6746C7D7, (q31_t)0x4AFB6C97, + (q31_t)0x67BD0FBC, (q31_t)0x4A581C9D, (q31_t)0x683257AA, + (q31_t)0x49B41533, (q31_t)0x68A69E81, (q31_t)0x490F57EE, + (q31_t)0x6919E320, (q31_t)0x4869E664, (q31_t)0x698C246C, + (q31_t)0x47C3C22E, (q31_t)0x69FD614A, (q31_t)0x471CECE6, + (q31_t)0x6A6D98A4, (q31_t)0x46756827, (q31_t)0x6ADCC964, + (q31_t)0x45CD358F, (q31_t)0x6B4AF278, (q31_t)0x452456BC, + (q31_t)0x6BB812D0, (q31_t)0x447ACD50, (q31_t)0x6C242960, + (q31_t)0x43D09AEC, (q31_t)0x6C8F351C, (q31_t)0x4325C135, + (q31_t)0x6CF934FB, (q31_t)0x427A41D0, (q31_t)0x6D6227FA, + (q31_t)0x41CE1E64, (q31_t)0x6DCA0D14, (q31_t)0x4121589A, + (q31_t)0x6E30E349, (q31_t)0x4073F21D, (q31_t)0x6E96A99C, + (q31_t)0x3FC5EC97, (q31_t)0x6EFB5F12, (q31_t)0x3F1749B7, + (q31_t)0x6F5F02B1, (q31_t)0x3E680B2C, (q31_t)0x6FC19385, + (q31_t)0x3DB832A5, (q31_t)0x70231099, (q31_t)0x3D07C1D5, + (q31_t)0x708378FE, (q31_t)0x3C56BA70, (q31_t)0x70E2CBC6, + (q31_t)0x3BA51E29, (q31_t)0x71410804, (q31_t)0x3AF2EEB7, + (q31_t)0x719E2CD2, (q31_t)0x3A402DD1, (q31_t)0x71FA3948, + (q31_t)0x398CDD32, (q31_t)0x72552C84, (q31_t)0x38D8FE93, + (q31_t)0x72AF05A6, (q31_t)0x382493B0, (q31_t)0x7307C3D0, + (q31_t)0x376F9E46, (q31_t)0x735F6626, (q31_t)0x36BA2013, + (q31_t)0x73B5EBD0, (q31_t)0x36041AD9, (q31_t)0x740B53FA, + (q31_t)0x354D9056, (q31_t)0x745F9DD1, (q31_t)0x3496824F, + (q31_t)0x74B2C883, (q31_t)0x33DEF287, (q31_t)0x7504D345, + (q31_t)0x3326E2C2, (q31_t)0x7555BD4B, (q31_t)0x326E54C7, + (q31_t)0x75A585CF, (q31_t)0x31B54A5D, (q31_t)0x75F42C0A, + (q31_t)0x30FBC54D, (q31_t)0x7641AF3C, (q31_t)0x3041C760, + (q31_t)0x768E0EA5, (q31_t)0x2F875262, (q31_t)0x76D94988, + (q31_t)0x2ECC681E, (q31_t)0x77235F2D, (q31_t)0x2E110A62, + (q31_t)0x776C4EDB, (q31_t)0x2D553AFB, (q31_t)0x77B417DF, + (q31_t)0x2C98FBBA, (q31_t)0x77FAB988, (q31_t)0x2BDC4E6F, + (q31_t)0x78403328, (q31_t)0x2B1F34EB, (q31_t)0x78848413, + (q31_t)0x2A61B101, (q31_t)0x78C7ABA1, (q31_t)0x29A3C484, + (q31_t)0x7909A92C, (q31_t)0x28E5714A, (q31_t)0x794A7C11, + (q31_t)0x2826B928, (q31_t)0x798A23B1, (q31_t)0x27679DF4, + (q31_t)0x79C89F6D, (q31_t)0x26A82185, (q31_t)0x7A05EEAD, + (q31_t)0x25E845B5, (q31_t)0x7A4210D8, (q31_t)0x25280C5D, + (q31_t)0x7A7D055B, (q31_t)0x24677757, (q31_t)0x7AB6CBA3, + (q31_t)0x23A6887E, (q31_t)0x7AEF6323, (q31_t)0x22E541AE, + (q31_t)0x7B26CB4F, (q31_t)0x2223A4C5, (q31_t)0x7B5D039D, + (q31_t)0x2161B39F, (q31_t)0x7B920B89, (q31_t)0x209F701C, + (q31_t)0x7BC5E28F, (q31_t)0x1FDCDC1A, (q31_t)0x7BF88830, + (q31_t)0x1F19F97B, (q31_t)0x7C29FBEE, (q31_t)0x1E56CA1E, + (q31_t)0x7C5A3D4F, (q31_t)0x1D934FE5, (q31_t)0x7C894BDD, + (q31_t)0x1CCF8CB3, (q31_t)0x7CB72724, (q31_t)0x1C0B826A, + (q31_t)0x7CE3CEB1, (q31_t)0x1B4732EF, (q31_t)0x7D0F4218, + (q31_t)0x1A82A025, (q31_t)0x7D3980EC, (q31_t)0x19BDCBF2, + (q31_t)0x7D628AC5, (q31_t)0x18F8B83C, (q31_t)0x7D8A5F3F, + (q31_t)0x183366E8, (q31_t)0x7DB0FDF7, (q31_t)0x176DD9DE, + (q31_t)0x7DD6668E, (q31_t)0x16A81305, (q31_t)0x7DFA98A7, + (q31_t)0x15E21444, (q31_t)0x7E1D93E9, (q31_t)0x151BDF85, + (q31_t)0x7E3F57FE, (q31_t)0x145576B1, (q31_t)0x7E5FE493, + (q31_t)0x138EDBB0, (q31_t)0x7E7F3956, (q31_t)0x12C8106E, + (q31_t)0x7E9D55FC, (q31_t)0x120116D4, (q31_t)0x7EBA3A39, + (q31_t)0x1139F0CE, (q31_t)0x7ED5E5C6, (q31_t)0x1072A047, + (q31_t)0x7EF0585F, (q31_t)0x0FAB272B, (q31_t)0x7F0991C3, + (q31_t)0x0EE38765, (q31_t)0x7F2191B4, (q31_t)0x0E1BC2E3, + (q31_t)0x7F3857F5, (q31_t)0x0D53DB92, (q31_t)0x7F4DE450, + (q31_t)0x0C8BD35E, (q31_t)0x7F62368F, (q31_t)0x0BC3AC35, + (q31_t)0x7F754E7F, (q31_t)0x0AFB6805, (q31_t)0x7F872BF3, + (q31_t)0x0A3308BC, (q31_t)0x7F97CEBC, (q31_t)0x096A9049, + (q31_t)0x7FA736B4, (q31_t)0x08A2009A, (q31_t)0x7FB563B2, + (q31_t)0x07D95B9E, (q31_t)0x7FC25596, (q31_t)0x0710A344, + (q31_t)0x7FCE0C3E, (q31_t)0x0647D97C, (q31_t)0x7FD8878D, + (q31_t)0x057F0034, (q31_t)0x7FE1C76B, (q31_t)0x04B6195D, + (q31_t)0x7FE9CBC0, (q31_t)0x03ED26E6, (q31_t)0x7FF09477, + (q31_t)0x03242ABF, (q31_t)0x7FF62182, (q31_t)0x025B26D7, + (q31_t)0x7FFA72D1, (q31_t)0x01921D1F, (q31_t)0x7FFD885A, + (q31_t)0x00C90F88, (q31_t)0x7FFF6216, (q31_t)0x00000000, + (q31_t)0x7FFFFFFF, (q31_t)0xFF36F078, (q31_t)0x7FFF6216, + (q31_t)0xFE6DE2E0, (q31_t)0x7FFD885A, (q31_t)0xFDA4D928, + (q31_t)0x7FFA72D1, (q31_t)0xFCDBD541, (q31_t)0x7FF62182, + (q31_t)0xFC12D919, (q31_t)0x7FF09477, (q31_t)0xFB49E6A2, + (q31_t)0x7FE9CBC0, (q31_t)0xFA80FFCB, (q31_t)0x7FE1C76B, + (q31_t)0xF9B82683, (q31_t)0x7FD8878D, (q31_t)0xF8EF5CBB, + (q31_t)0x7FCE0C3E, (q31_t)0xF826A461, (q31_t)0x7FC25596, + (q31_t)0xF75DFF65, (q31_t)0x7FB563B2, (q31_t)0xF6956FB6, + (q31_t)0x7FA736B4, (q31_t)0xF5CCF743, (q31_t)0x7F97CEBC, + (q31_t)0xF50497FA, (q31_t)0x7F872BF3, (q31_t)0xF43C53CA, + (q31_t)0x7F754E7F, (q31_t)0xF3742CA1, (q31_t)0x7F62368F, + (q31_t)0xF2AC246D, (q31_t)0x7F4DE450, (q31_t)0xF1E43D1C, + (q31_t)0x7F3857F5, (q31_t)0xF11C789A, (q31_t)0x7F2191B4, + (q31_t)0xF054D8D4, (q31_t)0x7F0991C3, (q31_t)0xEF8D5FB8, + (q31_t)0x7EF0585F, (q31_t)0xEEC60F31, (q31_t)0x7ED5E5C6, + (q31_t)0xEDFEE92B, (q31_t)0x7EBA3A39, (q31_t)0xED37EF91, + (q31_t)0x7E9D55FC, (q31_t)0xEC71244F, (q31_t)0x7E7F3956, + (q31_t)0xEBAA894E, (q31_t)0x7E5FE493, (q31_t)0xEAE4207A, + (q31_t)0x7E3F57FE, (q31_t)0xEA1DEBBB, (q31_t)0x7E1D93E9, + (q31_t)0xE957ECFB, (q31_t)0x7DFA98A7, (q31_t)0xE8922621, + (q31_t)0x7DD6668E, (q31_t)0xE7CC9917, (q31_t)0x7DB0FDF7, + (q31_t)0xE70747C3, (q31_t)0x7D8A5F3F, (q31_t)0xE642340D, + (q31_t)0x7D628AC5, (q31_t)0xE57D5FDA, (q31_t)0x7D3980EC, + (q31_t)0xE4B8CD10, (q31_t)0x7D0F4218, (q31_t)0xE3F47D95, + (q31_t)0x7CE3CEB1, (q31_t)0xE330734C, (q31_t)0x7CB72724, + (q31_t)0xE26CB01A, (q31_t)0x7C894BDD, (q31_t)0xE1A935E1, + (q31_t)0x7C5A3D4F, (q31_t)0xE0E60684, (q31_t)0x7C29FBEE, + (q31_t)0xE02323E5, (q31_t)0x7BF88830, (q31_t)0xDF608FE3, + (q31_t)0x7BC5E28F, (q31_t)0xDE9E4C60, (q31_t)0x7B920B89, + (q31_t)0xDDDC5B3A, (q31_t)0x7B5D039D, (q31_t)0xDD1ABE51, + (q31_t)0x7B26CB4F, (q31_t)0xDC597781, (q31_t)0x7AEF6323, + (q31_t)0xDB9888A8, (q31_t)0x7AB6CBA3, (q31_t)0xDAD7F3A2, + (q31_t)0x7A7D055B, (q31_t)0xDA17BA4A, (q31_t)0x7A4210D8, + (q31_t)0xD957DE7A, (q31_t)0x7A05EEAD, (q31_t)0xD898620C, + (q31_t)0x79C89F6D, (q31_t)0xD7D946D7, (q31_t)0x798A23B1, + (q31_t)0xD71A8EB5, (q31_t)0x794A7C11, (q31_t)0xD65C3B7B, + (q31_t)0x7909A92C, (q31_t)0xD59E4EFE, (q31_t)0x78C7ABA1, + (q31_t)0xD4E0CB14, (q31_t)0x78848413, (q31_t)0xD423B190, + (q31_t)0x78403328, (q31_t)0xD3670445, (q31_t)0x77FAB988, + (q31_t)0xD2AAC504, (q31_t)0x77B417DF, (q31_t)0xD1EEF59E, + (q31_t)0x776C4EDB, (q31_t)0xD13397E1, (q31_t)0x77235F2D, + (q31_t)0xD078AD9D, (q31_t)0x76D94988, (q31_t)0xCFBE389F, + (q31_t)0x768E0EA5, (q31_t)0xCF043AB2, (q31_t)0x7641AF3C, + (q31_t)0xCE4AB5A2, (q31_t)0x75F42C0A, (q31_t)0xCD91AB38, + (q31_t)0x75A585CF, (q31_t)0xCCD91D3D, (q31_t)0x7555BD4B, + (q31_t)0xCC210D78, (q31_t)0x7504D345, (q31_t)0xCB697DB0, + (q31_t)0x74B2C883, (q31_t)0xCAB26FA9, (q31_t)0x745F9DD1, + (q31_t)0xC9FBE527, (q31_t)0x740B53FA, (q31_t)0xC945DFEC, + (q31_t)0x73B5EBD0, (q31_t)0xC89061BA, (q31_t)0x735F6626, + (q31_t)0xC7DB6C50, (q31_t)0x7307C3D0, (q31_t)0xC727016C, + (q31_t)0x72AF05A6, (q31_t)0xC67322CD, (q31_t)0x72552C84, + (q31_t)0xC5BFD22E, (q31_t)0x71FA3948, (q31_t)0xC50D1148, + (q31_t)0x719E2CD2, (q31_t)0xC45AE1D7, (q31_t)0x71410804, + (q31_t)0xC3A9458F, (q31_t)0x70E2CBC6, (q31_t)0xC2F83E2A, + (q31_t)0x708378FE, (q31_t)0xC247CD5A, (q31_t)0x70231099, + (q31_t)0xC197F4D3, (q31_t)0x6FC19385, (q31_t)0xC0E8B648, + (q31_t)0x6F5F02B1, (q31_t)0xC03A1368, (q31_t)0x6EFB5F12, + (q31_t)0xBF8C0DE2, (q31_t)0x6E96A99C, (q31_t)0xBEDEA765, + (q31_t)0x6E30E349, (q31_t)0xBE31E19B, (q31_t)0x6DCA0D14, + (q31_t)0xBD85BE2F, (q31_t)0x6D6227FA, (q31_t)0xBCDA3ECA, + (q31_t)0x6CF934FB, (q31_t)0xBC2F6513, (q31_t)0x6C8F351C, + (q31_t)0xBB8532AF, (q31_t)0x6C242960, (q31_t)0xBADBA943, + (q31_t)0x6BB812D0, (q31_t)0xBA32CA70, (q31_t)0x6B4AF278, + (q31_t)0xB98A97D8, (q31_t)0x6ADCC964, (q31_t)0xB8E31319, + (q31_t)0x6A6D98A4, (q31_t)0xB83C3DD1, (q31_t)0x69FD614A, + (q31_t)0xB796199B, (q31_t)0x698C246C, (q31_t)0xB6F0A811, + (q31_t)0x6919E320, (q31_t)0xB64BEACC, (q31_t)0x68A69E81, + (q31_t)0xB5A7E362, (q31_t)0x683257AA, (q31_t)0xB5049368, + (q31_t)0x67BD0FBC, (q31_t)0xB461FC70, (q31_t)0x6746C7D7, + (q31_t)0xB3C0200C, (q31_t)0x66CF811F, (q31_t)0xB31EFFCB, + (q31_t)0x66573CBB, (q31_t)0xB27E9D3B, (q31_t)0x65DDFBD3, + (q31_t)0xB1DEF9E8, (q31_t)0x6563BF92, (q31_t)0xB140175B, + (q31_t)0x64E88926, (q31_t)0xB0A1F71C, (q31_t)0x646C59BF, + (q31_t)0xB0049AB2, (q31_t)0x63EF328F, (q31_t)0xAF6803A1, + (q31_t)0x637114CC, (q31_t)0xAECC336B, (q31_t)0x62F201AC, + (q31_t)0xAE312B91, (q31_t)0x6271FA69, (q31_t)0xAD96ED91, + (q31_t)0x61F1003E, (q31_t)0xACFD7AE8, (q31_t)0x616F146B, + (q31_t)0xAC64D510, (q31_t)0x60EC3830, (q31_t)0xABCCFD82, + (q31_t)0x60686CCE, (q31_t)0xAB35F5B5, (q31_t)0x5FE3B38D, + (q31_t)0xAA9FBF1D, (q31_t)0x5F5E0DB3, (q31_t)0xAA0A5B2D, + (q31_t)0x5ED77C89, (q31_t)0xA975CB56, (q31_t)0x5E50015D, + (q31_t)0xA8E21106, (q31_t)0x5DC79D7C, (q31_t)0xA84F2DA9, + (q31_t)0x5D3E5236, (q31_t)0xA7BD22AB, (q31_t)0x5CB420DF, + (q31_t)0xA72BF173, (q31_t)0x5C290ACC, (q31_t)0xA69B9B68, + (q31_t)0x5B9D1153, (q31_t)0xA60C21ED, (q31_t)0x5B1035CF, + (q31_t)0xA57D8666, (q31_t)0x5A82799A, (q31_t)0xA4EFCA31, + (q31_t)0x59F3DE12, (q31_t)0xA462EEAC, (q31_t)0x59646497, + (q31_t)0xA3D6F533, (q31_t)0x58D40E8C, (q31_t)0xA34BDF20, + (q31_t)0x5842DD54, (q31_t)0xA2C1ADC9, (q31_t)0x57B0D256, + (q31_t)0xA2386283, (q31_t)0x571DEEF9, (q31_t)0xA1AFFEA2, + (q31_t)0x568A34A9, (q31_t)0xA1288376, (q31_t)0x55F5A4D2, + (q31_t)0xA0A1F24C, (q31_t)0x556040E2, (q31_t)0xA01C4C72, + (q31_t)0x54CA0A4A, (q31_t)0x9F979331, (q31_t)0x5433027D, + (q31_t)0x9F13C7D0, (q31_t)0x539B2AEF, (q31_t)0x9E90EB94, + (q31_t)0x53028517, (q31_t)0x9E0EFFC1, (q31_t)0x5269126E, + (q31_t)0x9D8E0596, (q31_t)0x51CED46E, (q31_t)0x9D0DFE53, + (q31_t)0x5133CC94, (q31_t)0x9C8EEB33, (q31_t)0x5097FC5E, + (q31_t)0x9C10CD70, (q31_t)0x4FFB654D, (q31_t)0x9B93A640, + (q31_t)0x4F5E08E3, (q31_t)0x9B1776D9, (q31_t)0x4EBFE8A4, + (q31_t)0x9A9C406D, (q31_t)0x4E210617, (q31_t)0x9A22042C, + (q31_t)0x4D8162C4, (q31_t)0x99A8C344, (q31_t)0x4CE10034, + (q31_t)0x99307EE0, (q31_t)0x4C3FDFF3, (q31_t)0x98B93828, + (q31_t)0x4B9E038F, (q31_t)0x9842F043, (q31_t)0x4AFB6C97, + (q31_t)0x97CDA855, (q31_t)0x4A581C9D, (q31_t)0x9759617E, + (q31_t)0x49B41533, (q31_t)0x96E61CDF, (q31_t)0x490F57EE, + (q31_t)0x9673DB94, (q31_t)0x4869E664, (q31_t)0x96029EB5, + (q31_t)0x47C3C22E, (q31_t)0x9592675B, (q31_t)0x471CECE6, + (q31_t)0x9523369B, (q31_t)0x46756827, (q31_t)0x94B50D87, + (q31_t)0x45CD358F, (q31_t)0x9447ED2F, (q31_t)0x452456BC, + (q31_t)0x93DBD69F, (q31_t)0x447ACD50, (q31_t)0x9370CAE4, + (q31_t)0x43D09AEC, (q31_t)0x9306CB04, (q31_t)0x4325C135, + (q31_t)0x929DD805, (q31_t)0x427A41D0, (q31_t)0x9235F2EB, + (q31_t)0x41CE1E64, (q31_t)0x91CF1CB6, (q31_t)0x4121589A, + (q31_t)0x91695663, (q31_t)0x4073F21D, (q31_t)0x9104A0ED, + (q31_t)0x3FC5EC97, (q31_t)0x90A0FD4E, (q31_t)0x3F1749B7, + (q31_t)0x903E6C7A, (q31_t)0x3E680B2C, (q31_t)0x8FDCEF66, + (q31_t)0x3DB832A5, (q31_t)0x8F7C8701, (q31_t)0x3D07C1D5, + (q31_t)0x8F1D343A, (q31_t)0x3C56BA70, (q31_t)0x8EBEF7FB, + (q31_t)0x3BA51E29, (q31_t)0x8E61D32D, (q31_t)0x3AF2EEB7, + (q31_t)0x8E05C6B7, (q31_t)0x3A402DD1, (q31_t)0x8DAAD37B, + (q31_t)0x398CDD32, (q31_t)0x8D50FA59, (q31_t)0x38D8FE93, + (q31_t)0x8CF83C30, (q31_t)0x382493B0, (q31_t)0x8CA099D9, + (q31_t)0x376F9E46, (q31_t)0x8C4A142F, (q31_t)0x36BA2013, + (q31_t)0x8BF4AC05, (q31_t)0x36041AD9, (q31_t)0x8BA0622F, + (q31_t)0x354D9056, (q31_t)0x8B4D377C, (q31_t)0x3496824F, + (q31_t)0x8AFB2CBA, (q31_t)0x33DEF287, (q31_t)0x8AAA42B4, + (q31_t)0x3326E2C2, (q31_t)0x8A5A7A30, (q31_t)0x326E54C7, + (q31_t)0x8A0BD3F5, (q31_t)0x31B54A5D, (q31_t)0x89BE50C3, + (q31_t)0x30FBC54D, (q31_t)0x8971F15A, (q31_t)0x3041C760, + (q31_t)0x8926B677, (q31_t)0x2F875262, (q31_t)0x88DCA0D3, + (q31_t)0x2ECC681E, (q31_t)0x8893B124, (q31_t)0x2E110A62, + (q31_t)0x884BE820, (q31_t)0x2D553AFB, (q31_t)0x88054677, + (q31_t)0x2C98FBBA, (q31_t)0x87BFCCD7, (q31_t)0x2BDC4E6F, + (q31_t)0x877B7BEC, (q31_t)0x2B1F34EB, (q31_t)0x8738545E, + (q31_t)0x2A61B101, (q31_t)0x86F656D3, (q31_t)0x29A3C484, + (q31_t)0x86B583EE, (q31_t)0x28E5714A, (q31_t)0x8675DC4E, + (q31_t)0x2826B928, (q31_t)0x86376092, (q31_t)0x27679DF4, + (q31_t)0x85FA1152, (q31_t)0x26A82185, (q31_t)0x85BDEF27, + (q31_t)0x25E845B5, (q31_t)0x8582FAA4, (q31_t)0x25280C5D, + (q31_t)0x8549345C, (q31_t)0x24677757, (q31_t)0x85109CDC, + (q31_t)0x23A6887E, (q31_t)0x84D934B0, (q31_t)0x22E541AE, + (q31_t)0x84A2FC62, (q31_t)0x2223A4C5, (q31_t)0x846DF476, + (q31_t)0x2161B39F, (q31_t)0x843A1D70, (q31_t)0x209F701C, + (q31_t)0x840777CF, (q31_t)0x1FDCDC1A, (q31_t)0x83D60411, + (q31_t)0x1F19F97B, (q31_t)0x83A5C2B0, (q31_t)0x1E56CA1E, + (q31_t)0x8376B422, (q31_t)0x1D934FE5, (q31_t)0x8348D8DB, + (q31_t)0x1CCF8CB3, (q31_t)0x831C314E, (q31_t)0x1C0B826A, + (q31_t)0x82F0BDE8, (q31_t)0x1B4732EF, (q31_t)0x82C67F13, + (q31_t)0x1A82A025, (q31_t)0x829D753A, (q31_t)0x19BDCBF2, + (q31_t)0x8275A0C0, (q31_t)0x18F8B83C, (q31_t)0x824F0208, + (q31_t)0x183366E8, (q31_t)0x82299971, (q31_t)0x176DD9DE, + (q31_t)0x82056758, (q31_t)0x16A81305, (q31_t)0x81E26C16, + (q31_t)0x15E21444, (q31_t)0x81C0A801, (q31_t)0x151BDF85, + (q31_t)0x81A01B6C, (q31_t)0x145576B1, (q31_t)0x8180C6A9, + (q31_t)0x138EDBB0, (q31_t)0x8162AA03, (q31_t)0x12C8106E, + (q31_t)0x8145C5C6, (q31_t)0x120116D4, (q31_t)0x812A1A39, + (q31_t)0x1139F0CE, (q31_t)0x810FA7A0, (q31_t)0x1072A047, + (q31_t)0x80F66E3C, (q31_t)0x0FAB272B, (q31_t)0x80DE6E4C, + (q31_t)0x0EE38765, (q31_t)0x80C7A80A, (q31_t)0x0E1BC2E3, + (q31_t)0x80B21BAF, (q31_t)0x0D53DB92, (q31_t)0x809DC970, + (q31_t)0x0C8BD35E, (q31_t)0x808AB180, (q31_t)0x0BC3AC35, + (q31_t)0x8078D40D, (q31_t)0x0AFB6805, (q31_t)0x80683143, + (q31_t)0x0A3308BC, (q31_t)0x8058C94C, (q31_t)0x096A9049, + (q31_t)0x804A9C4D, (q31_t)0x08A2009A, (q31_t)0x803DAA69, + (q31_t)0x07D95B9E, (q31_t)0x8031F3C1, (q31_t)0x0710A344, + (q31_t)0x80277872, (q31_t)0x0647D97C, (q31_t)0x801E3894, + (q31_t)0x057F0034, (q31_t)0x80163440, (q31_t)0x04B6195D, + (q31_t)0x800F6B88, (q31_t)0x03ED26E6, (q31_t)0x8009DE7D, + (q31_t)0x03242ABF, (q31_t)0x80058D2E, (q31_t)0x025B26D7, + (q31_t)0x800277A5, (q31_t)0x01921D1F, (q31_t)0x80009DE9, + (q31_t)0x00C90F88, (q31_t)0x80000000, (q31_t)0x00000000, + (q31_t)0x80009DE9, (q31_t)0xFF36F078, (q31_t)0x800277A5, + (q31_t)0xFE6DE2E0, (q31_t)0x80058D2E, (q31_t)0xFDA4D928, + (q31_t)0x8009DE7D, (q31_t)0xFCDBD541, (q31_t)0x800F6B88, + (q31_t)0xFC12D919, (q31_t)0x80163440, (q31_t)0xFB49E6A2, + (q31_t)0x801E3894, (q31_t)0xFA80FFCB, (q31_t)0x80277872, + (q31_t)0xF9B82683, (q31_t)0x8031F3C1, (q31_t)0xF8EF5CBB, + (q31_t)0x803DAA69, (q31_t)0xF826A461, (q31_t)0x804A9C4D, + (q31_t)0xF75DFF65, (q31_t)0x8058C94C, (q31_t)0xF6956FB6, + (q31_t)0x80683143, (q31_t)0xF5CCF743, (q31_t)0x8078D40D, + (q31_t)0xF50497FA, (q31_t)0x808AB180, (q31_t)0xF43C53CA, + (q31_t)0x809DC970, (q31_t)0xF3742CA1, (q31_t)0x80B21BAF, + (q31_t)0xF2AC246D, (q31_t)0x80C7A80A, (q31_t)0xF1E43D1C, + (q31_t)0x80DE6E4C, (q31_t)0xF11C789A, (q31_t)0x80F66E3C, + (q31_t)0xF054D8D4, (q31_t)0x810FA7A0, (q31_t)0xEF8D5FB8, + (q31_t)0x812A1A39, (q31_t)0xEEC60F31, (q31_t)0x8145C5C6, + (q31_t)0xEDFEE92B, (q31_t)0x8162AA03, (q31_t)0xED37EF91, + (q31_t)0x8180C6A9, (q31_t)0xEC71244F, (q31_t)0x81A01B6C, + (q31_t)0xEBAA894E, (q31_t)0x81C0A801, (q31_t)0xEAE4207A, + (q31_t)0x81E26C16, (q31_t)0xEA1DEBBB, (q31_t)0x82056758, + (q31_t)0xE957ECFB, (q31_t)0x82299971, (q31_t)0xE8922621, + (q31_t)0x824F0208, (q31_t)0xE7CC9917, (q31_t)0x8275A0C0, + (q31_t)0xE70747C3, (q31_t)0x829D753A, (q31_t)0xE642340D, + (q31_t)0x82C67F13, (q31_t)0xE57D5FDA, (q31_t)0x82F0BDE8, + (q31_t)0xE4B8CD10, (q31_t)0x831C314E, (q31_t)0xE3F47D95, + (q31_t)0x8348D8DB, (q31_t)0xE330734C, (q31_t)0x8376B422, + (q31_t)0xE26CB01A, (q31_t)0x83A5C2B0, (q31_t)0xE1A935E1, + (q31_t)0x83D60411, (q31_t)0xE0E60684, (q31_t)0x840777CF, + (q31_t)0xE02323E5, (q31_t)0x843A1D70, (q31_t)0xDF608FE3, + (q31_t)0x846DF476, (q31_t)0xDE9E4C60, (q31_t)0x84A2FC62, + (q31_t)0xDDDC5B3A, (q31_t)0x84D934B0, (q31_t)0xDD1ABE51, + (q31_t)0x85109CDC, (q31_t)0xDC597781, (q31_t)0x8549345C, + (q31_t)0xDB9888A8, (q31_t)0x8582FAA4, (q31_t)0xDAD7F3A2, + (q31_t)0x85BDEF27, (q31_t)0xDA17BA4A, (q31_t)0x85FA1152, + (q31_t)0xD957DE7A, (q31_t)0x86376092, (q31_t)0xD898620C, + (q31_t)0x8675DC4E, (q31_t)0xD7D946D7, (q31_t)0x86B583EE, + (q31_t)0xD71A8EB5, (q31_t)0x86F656D3, (q31_t)0xD65C3B7B, + (q31_t)0x8738545E, (q31_t)0xD59E4EFE, (q31_t)0x877B7BEC, + (q31_t)0xD4E0CB14, (q31_t)0x87BFCCD7, (q31_t)0xD423B190, + (q31_t)0x88054677, (q31_t)0xD3670445, (q31_t)0x884BE820, + (q31_t)0xD2AAC504, (q31_t)0x8893B124, (q31_t)0xD1EEF59E, + (q31_t)0x88DCA0D3, (q31_t)0xD13397E1, (q31_t)0x8926B677, + (q31_t)0xD078AD9D, (q31_t)0x8971F15A, (q31_t)0xCFBE389F, + (q31_t)0x89BE50C3, (q31_t)0xCF043AB2, (q31_t)0x8A0BD3F5, + (q31_t)0xCE4AB5A2, (q31_t)0x8A5A7A30, (q31_t)0xCD91AB38, + (q31_t)0x8AAA42B4, (q31_t)0xCCD91D3D, (q31_t)0x8AFB2CBA, + (q31_t)0xCC210D78, (q31_t)0x8B4D377C, (q31_t)0xCB697DB0, + (q31_t)0x8BA0622F, (q31_t)0xCAB26FA9, (q31_t)0x8BF4AC05, + (q31_t)0xC9FBE527, (q31_t)0x8C4A142F, (q31_t)0xC945DFEC, + (q31_t)0x8CA099D9, (q31_t)0xC89061BA, (q31_t)0x8CF83C30, + (q31_t)0xC7DB6C50, (q31_t)0x8D50FA59, (q31_t)0xC727016C, + (q31_t)0x8DAAD37B, (q31_t)0xC67322CD, (q31_t)0x8E05C6B7, + (q31_t)0xC5BFD22E, (q31_t)0x8E61D32D, (q31_t)0xC50D1148, + (q31_t)0x8EBEF7FB, (q31_t)0xC45AE1D7, (q31_t)0x8F1D343A, + (q31_t)0xC3A9458F, (q31_t)0x8F7C8701, (q31_t)0xC2F83E2A, + (q31_t)0x8FDCEF66, (q31_t)0xC247CD5A, (q31_t)0x903E6C7A, + (q31_t)0xC197F4D3, (q31_t)0x90A0FD4E, (q31_t)0xC0E8B648, + (q31_t)0x9104A0ED, (q31_t)0xC03A1368, (q31_t)0x91695663, + (q31_t)0xBF8C0DE2, (q31_t)0x91CF1CB6, (q31_t)0xBEDEA765, + (q31_t)0x9235F2EB, (q31_t)0xBE31E19B, (q31_t)0x929DD805, + (q31_t)0xBD85BE2F, (q31_t)0x9306CB04, (q31_t)0xBCDA3ECA, + (q31_t)0x9370CAE4, (q31_t)0xBC2F6513, (q31_t)0x93DBD69F, + (q31_t)0xBB8532AF, (q31_t)0x9447ED2F, (q31_t)0xBADBA943, + (q31_t)0x94B50D87, (q31_t)0xBA32CA70, (q31_t)0x9523369B, + (q31_t)0xB98A97D8, (q31_t)0x9592675B, (q31_t)0xB8E31319, + (q31_t)0x96029EB5, (q31_t)0xB83C3DD1, (q31_t)0x9673DB94, + (q31_t)0xB796199B, (q31_t)0x96E61CDF, (q31_t)0xB6F0A811, + (q31_t)0x9759617E, (q31_t)0xB64BEACC, (q31_t)0x97CDA855, + (q31_t)0xB5A7E362, (q31_t)0x9842F043, (q31_t)0xB5049368, + (q31_t)0x98B93828, (q31_t)0xB461FC70, (q31_t)0x99307EE0, + (q31_t)0xB3C0200C, (q31_t)0x99A8C344, (q31_t)0xB31EFFCB, + (q31_t)0x9A22042C, (q31_t)0xB27E9D3B, (q31_t)0x9A9C406D, + (q31_t)0xB1DEF9E8, (q31_t)0x9B1776D9, (q31_t)0xB140175B, + (q31_t)0x9B93A640, (q31_t)0xB0A1F71C, (q31_t)0x9C10CD70, + (q31_t)0xB0049AB2, (q31_t)0x9C8EEB33, (q31_t)0xAF6803A1, + (q31_t)0x9D0DFE53, (q31_t)0xAECC336B, (q31_t)0x9D8E0596, + (q31_t)0xAE312B91, (q31_t)0x9E0EFFC1, (q31_t)0xAD96ED91, + (q31_t)0x9E90EB94, (q31_t)0xACFD7AE8, (q31_t)0x9F13C7D0, + (q31_t)0xAC64D510, (q31_t)0x9F979331, (q31_t)0xABCCFD82, + (q31_t)0xA01C4C72, (q31_t)0xAB35F5B5, (q31_t)0xA0A1F24C, + (q31_t)0xAA9FBF1D, (q31_t)0xA1288376, (q31_t)0xAA0A5B2D, + (q31_t)0xA1AFFEA2, (q31_t)0xA975CB56, (q31_t)0xA2386283, + (q31_t)0xA8E21106, (q31_t)0xA2C1ADC9, (q31_t)0xA84F2DA9, + (q31_t)0xA34BDF20, (q31_t)0xA7BD22AB, (q31_t)0xA3D6F533, + (q31_t)0xA72BF173, (q31_t)0xA462EEAC, (q31_t)0xA69B9B68, + (q31_t)0xA4EFCA31, (q31_t)0xA60C21ED, (q31_t)0xA57D8666, + (q31_t)0xA57D8666, (q31_t)0xA60C21ED, (q31_t)0xA4EFCA31, + (q31_t)0xA69B9B68, (q31_t)0xA462EEAC, (q31_t)0xA72BF173, + (q31_t)0xA3D6F533, (q31_t)0xA7BD22AB, (q31_t)0xA34BDF20, + (q31_t)0xA84F2DA9, (q31_t)0xA2C1ADC9, (q31_t)0xA8E21106, + (q31_t)0xA2386283, (q31_t)0xA975CB56, (q31_t)0xA1AFFEA2, + (q31_t)0xAA0A5B2D, (q31_t)0xA1288376, (q31_t)0xAA9FBF1D, + (q31_t)0xA0A1F24C, (q31_t)0xAB35F5B5, (q31_t)0xA01C4C72, + (q31_t)0xABCCFD82, (q31_t)0x9F979331, (q31_t)0xAC64D510, + (q31_t)0x9F13C7D0, (q31_t)0xACFD7AE8, (q31_t)0x9E90EB94, + (q31_t)0xAD96ED91, (q31_t)0x9E0EFFC1, (q31_t)0xAE312B91, + (q31_t)0x9D8E0596, (q31_t)0xAECC336B, (q31_t)0x9D0DFE53, + (q31_t)0xAF6803A1, (q31_t)0x9C8EEB33, (q31_t)0xB0049AB2, + (q31_t)0x9C10CD70, (q31_t)0xB0A1F71C, (q31_t)0x9B93A640, + (q31_t)0xB140175B, (q31_t)0x9B1776D9, (q31_t)0xB1DEF9E8, + (q31_t)0x9A9C406D, (q31_t)0xB27E9D3B, (q31_t)0x9A22042C, + (q31_t)0xB31EFFCB, (q31_t)0x99A8C344, (q31_t)0xB3C0200C, + (q31_t)0x99307EE0, (q31_t)0xB461FC70, (q31_t)0x98B93828, + (q31_t)0xB5049368, (q31_t)0x9842F043, (q31_t)0xB5A7E362, + (q31_t)0x97CDA855, (q31_t)0xB64BEACC, (q31_t)0x9759617E, + (q31_t)0xB6F0A811, (q31_t)0x96E61CDF, (q31_t)0xB796199B, + (q31_t)0x9673DB94, (q31_t)0xB83C3DD1, (q31_t)0x96029EB5, + (q31_t)0xB8E31319, (q31_t)0x9592675B, (q31_t)0xB98A97D8, + (q31_t)0x9523369B, (q31_t)0xBA32CA70, (q31_t)0x94B50D87, + (q31_t)0xBADBA943, (q31_t)0x9447ED2F, (q31_t)0xBB8532AF, + (q31_t)0x93DBD69F, (q31_t)0xBC2F6513, (q31_t)0x9370CAE4, + (q31_t)0xBCDA3ECA, (q31_t)0x9306CB04, (q31_t)0xBD85BE2F, + (q31_t)0x929DD805, (q31_t)0xBE31E19B, (q31_t)0x9235F2EB, + (q31_t)0xBEDEA765, (q31_t)0x91CF1CB6, (q31_t)0xBF8C0DE2, + (q31_t)0x91695663, (q31_t)0xC03A1368, (q31_t)0x9104A0ED, + (q31_t)0xC0E8B648, (q31_t)0x90A0FD4E, (q31_t)0xC197F4D3, + (q31_t)0x903E6C7A, (q31_t)0xC247CD5A, (q31_t)0x8FDCEF66, + (q31_t)0xC2F83E2A, (q31_t)0x8F7C8701, (q31_t)0xC3A9458F, + (q31_t)0x8F1D343A, (q31_t)0xC45AE1D7, (q31_t)0x8EBEF7FB, + (q31_t)0xC50D1148, (q31_t)0x8E61D32D, (q31_t)0xC5BFD22E, + (q31_t)0x8E05C6B7, (q31_t)0xC67322CD, (q31_t)0x8DAAD37B, + (q31_t)0xC727016C, (q31_t)0x8D50FA59, (q31_t)0xC7DB6C50, + (q31_t)0x8CF83C30, (q31_t)0xC89061BA, (q31_t)0x8CA099D9, + (q31_t)0xC945DFEC, (q31_t)0x8C4A142F, (q31_t)0xC9FBE527, + (q31_t)0x8BF4AC05, (q31_t)0xCAB26FA9, (q31_t)0x8BA0622F, + (q31_t)0xCB697DB0, (q31_t)0x8B4D377C, (q31_t)0xCC210D78, + (q31_t)0x8AFB2CBA, (q31_t)0xCCD91D3D, (q31_t)0x8AAA42B4, + (q31_t)0xCD91AB38, (q31_t)0x8A5A7A30, (q31_t)0xCE4AB5A2, + (q31_t)0x8A0BD3F5, (q31_t)0xCF043AB2, (q31_t)0x89BE50C3, + (q31_t)0xCFBE389F, (q31_t)0x8971F15A, (q31_t)0xD078AD9D, + (q31_t)0x8926B677, (q31_t)0xD13397E1, (q31_t)0x88DCA0D3, + (q31_t)0xD1EEF59E, (q31_t)0x8893B124, (q31_t)0xD2AAC504, + (q31_t)0x884BE820, (q31_t)0xD3670445, (q31_t)0x88054677, + (q31_t)0xD423B190, (q31_t)0x87BFCCD7, (q31_t)0xD4E0CB14, + (q31_t)0x877B7BEC, (q31_t)0xD59E4EFE, (q31_t)0x8738545E, + (q31_t)0xD65C3B7B, (q31_t)0x86F656D3, (q31_t)0xD71A8EB5, + (q31_t)0x86B583EE, (q31_t)0xD7D946D7, (q31_t)0x8675DC4E, + (q31_t)0xD898620C, (q31_t)0x86376092, (q31_t)0xD957DE7A, + (q31_t)0x85FA1152, (q31_t)0xDA17BA4A, (q31_t)0x85BDEF27, + (q31_t)0xDAD7F3A2, (q31_t)0x8582FAA4, (q31_t)0xDB9888A8, + (q31_t)0x8549345C, (q31_t)0xDC597781, (q31_t)0x85109CDC, + (q31_t)0xDD1ABE51, (q31_t)0x84D934B0, (q31_t)0xDDDC5B3A, + (q31_t)0x84A2FC62, (q31_t)0xDE9E4C60, (q31_t)0x846DF476, + (q31_t)0xDF608FE3, (q31_t)0x843A1D70, (q31_t)0xE02323E5, + (q31_t)0x840777CF, (q31_t)0xE0E60684, (q31_t)0x83D60411, + (q31_t)0xE1A935E1, (q31_t)0x83A5C2B0, (q31_t)0xE26CB01A, + (q31_t)0x8376B422, (q31_t)0xE330734C, (q31_t)0x8348D8DB, + (q31_t)0xE3F47D95, (q31_t)0x831C314E, (q31_t)0xE4B8CD10, + (q31_t)0x82F0BDE8, (q31_t)0xE57D5FDA, (q31_t)0x82C67F13, + (q31_t)0xE642340D, (q31_t)0x829D753A, (q31_t)0xE70747C3, + (q31_t)0x8275A0C0, (q31_t)0xE7CC9917, (q31_t)0x824F0208, + (q31_t)0xE8922621, (q31_t)0x82299971, (q31_t)0xE957ECFB, + (q31_t)0x82056758, (q31_t)0xEA1DEBBB, (q31_t)0x81E26C16, + (q31_t)0xEAE4207A, (q31_t)0x81C0A801, (q31_t)0xEBAA894E, + (q31_t)0x81A01B6C, (q31_t)0xEC71244F, (q31_t)0x8180C6A9, + (q31_t)0xED37EF91, (q31_t)0x8162AA03, (q31_t)0xEDFEE92B, + (q31_t)0x8145C5C6, (q31_t)0xEEC60F31, (q31_t)0x812A1A39, + (q31_t)0xEF8D5FB8, (q31_t)0x810FA7A0, (q31_t)0xF054D8D4, + (q31_t)0x80F66E3C, (q31_t)0xF11C789A, (q31_t)0x80DE6E4C, + (q31_t)0xF1E43D1C, (q31_t)0x80C7A80A, (q31_t)0xF2AC246D, + (q31_t)0x80B21BAF, (q31_t)0xF3742CA1, (q31_t)0x809DC970, + (q31_t)0xF43C53CA, (q31_t)0x808AB180, (q31_t)0xF50497FA, + (q31_t)0x8078D40D, (q31_t)0xF5CCF743, (q31_t)0x80683143, + (q31_t)0xF6956FB6, (q31_t)0x8058C94C, (q31_t)0xF75DFF65, + (q31_t)0x804A9C4D, (q31_t)0xF826A461, (q31_t)0x803DAA69, + (q31_t)0xF8EF5CBB, (q31_t)0x8031F3C1, (q31_t)0xF9B82683, + (q31_t)0x80277872, (q31_t)0xFA80FFCB, (q31_t)0x801E3894, + (q31_t)0xFB49E6A2, (q31_t)0x80163440, (q31_t)0xFC12D919, + (q31_t)0x800F6B88, (q31_t)0xFCDBD541, (q31_t)0x8009DE7D, + (q31_t)0xFDA4D928, (q31_t)0x80058D2E, (q31_t)0xFE6DE2E0, + (q31_t)0x800277A5, (q31_t)0xFF36F078, (q31_t)0x80009DE9 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) +/** + @par + Example code for Q31 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefQ31[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefQ31[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 2048, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to Q31(Fixed point 1.31): + round(twiddleCoefQ31(i) * pow(2, 31)) + */ +const q31_t twiddleCoef_2048_q31[3072] = { + (q31_t)0x7FFFFFFF, (q31_t)0x00000000, (q31_t)0x7FFFD885, + (q31_t)0x006487E3, (q31_t)0x7FFF6216, (q31_t)0x00C90F88, + (q31_t)0x7FFE9CB2, (q31_t)0x012D96B0, (q31_t)0x7FFD885A, + (q31_t)0x01921D1F, (q31_t)0x7FFC250F, (q31_t)0x01F6A296, + (q31_t)0x7FFA72D1, (q31_t)0x025B26D7, (q31_t)0x7FF871A1, + (q31_t)0x02BFA9A4, (q31_t)0x7FF62182, (q31_t)0x03242ABF, + (q31_t)0x7FF38273, (q31_t)0x0388A9E9, (q31_t)0x7FF09477, + (q31_t)0x03ED26E6, (q31_t)0x7FED5790, (q31_t)0x0451A176, + (q31_t)0x7FE9CBC0, (q31_t)0x04B6195D, (q31_t)0x7FE5F108, + (q31_t)0x051A8E5C, (q31_t)0x7FE1C76B, (q31_t)0x057F0034, + (q31_t)0x7FDD4EEC, (q31_t)0x05E36EA9, (q31_t)0x7FD8878D, + (q31_t)0x0647D97C, (q31_t)0x7FD37152, (q31_t)0x06AC406F, + (q31_t)0x7FCE0C3E, (q31_t)0x0710A344, (q31_t)0x7FC85853, + (q31_t)0x077501BE, (q31_t)0x7FC25596, (q31_t)0x07D95B9E, + (q31_t)0x7FBC040A, (q31_t)0x083DB0A7, (q31_t)0x7FB563B2, + (q31_t)0x08A2009A, (q31_t)0x7FAE7494, (q31_t)0x09064B3A, + (q31_t)0x7FA736B4, (q31_t)0x096A9049, (q31_t)0x7F9FAA15, + (q31_t)0x09CECF89, (q31_t)0x7F97CEBC, (q31_t)0x0A3308BC, + (q31_t)0x7F8FA4AF, (q31_t)0x0A973BA5, (q31_t)0x7F872BF3, + (q31_t)0x0AFB6805, (q31_t)0x7F7E648B, (q31_t)0x0B5F8D9F, + (q31_t)0x7F754E7F, (q31_t)0x0BC3AC35, (q31_t)0x7F6BE9D4, + (q31_t)0x0C27C389, (q31_t)0x7F62368F, (q31_t)0x0C8BD35E, + (q31_t)0x7F5834B6, (q31_t)0x0CEFDB75, (q31_t)0x7F4DE450, + (q31_t)0x0D53DB92, (q31_t)0x7F434563, (q31_t)0x0DB7D376, + (q31_t)0x7F3857F5, (q31_t)0x0E1BC2E3, (q31_t)0x7F2D1C0E, + (q31_t)0x0E7FA99D, (q31_t)0x7F2191B4, (q31_t)0x0EE38765, + (q31_t)0x7F15B8EE, (q31_t)0x0F475BFE, (q31_t)0x7F0991C3, + (q31_t)0x0FAB272B, (q31_t)0x7EFD1C3C, (q31_t)0x100EE8AD, + (q31_t)0x7EF0585F, (q31_t)0x1072A047, (q31_t)0x7EE34635, + (q31_t)0x10D64DBC, (q31_t)0x7ED5E5C6, (q31_t)0x1139F0CE, + (q31_t)0x7EC8371A, (q31_t)0x119D8940, (q31_t)0x7EBA3A39, + (q31_t)0x120116D4, (q31_t)0x7EABEF2C, (q31_t)0x1264994E, + (q31_t)0x7E9D55FC, (q31_t)0x12C8106E, (q31_t)0x7E8E6EB1, + (q31_t)0x132B7BF9, (q31_t)0x7E7F3956, (q31_t)0x138EDBB0, + (q31_t)0x7E6FB5F3, (q31_t)0x13F22F57, (q31_t)0x7E5FE493, + (q31_t)0x145576B1, (q31_t)0x7E4FC53E, (q31_t)0x14B8B17F, + (q31_t)0x7E3F57FE, (q31_t)0x151BDF85, (q31_t)0x7E2E9CDF, + (q31_t)0x157F0086, (q31_t)0x7E1D93E9, (q31_t)0x15E21444, + (q31_t)0x7E0C3D29, (q31_t)0x16451A83, (q31_t)0x7DFA98A7, + (q31_t)0x16A81305, (q31_t)0x7DE8A670, (q31_t)0x170AFD8D, + (q31_t)0x7DD6668E, (q31_t)0x176DD9DE, (q31_t)0x7DC3D90D, + (q31_t)0x17D0A7BB, (q31_t)0x7DB0FDF7, (q31_t)0x183366E8, + (q31_t)0x7D9DD55A, (q31_t)0x18961727, (q31_t)0x7D8A5F3F, + (q31_t)0x18F8B83C, (q31_t)0x7D769BB5, (q31_t)0x195B49E9, + (q31_t)0x7D628AC5, (q31_t)0x19BDCBF2, (q31_t)0x7D4E2C7E, + (q31_t)0x1A203E1B, (q31_t)0x7D3980EC, (q31_t)0x1A82A025, + (q31_t)0x7D24881A, (q31_t)0x1AE4F1D6, (q31_t)0x7D0F4218, + (q31_t)0x1B4732EF, (q31_t)0x7CF9AEF0, (q31_t)0x1BA96334, + (q31_t)0x7CE3CEB1, (q31_t)0x1C0B826A, (q31_t)0x7CCDA168, + (q31_t)0x1C6D9053, (q31_t)0x7CB72724, (q31_t)0x1CCF8CB3, + (q31_t)0x7CA05FF1, (q31_t)0x1D31774D, (q31_t)0x7C894BDD, + (q31_t)0x1D934FE5, (q31_t)0x7C71EAF8, (q31_t)0x1DF5163F, + (q31_t)0x7C5A3D4F, (q31_t)0x1E56CA1E, (q31_t)0x7C4242F2, + (q31_t)0x1EB86B46, (q31_t)0x7C29FBEE, (q31_t)0x1F19F97B, + (q31_t)0x7C116853, (q31_t)0x1F7B7480, (q31_t)0x7BF88830, + (q31_t)0x1FDCDC1A, (q31_t)0x7BDF5B94, (q31_t)0x203E300D, + (q31_t)0x7BC5E28F, (q31_t)0x209F701C, (q31_t)0x7BAC1D31, + (q31_t)0x21009C0B, (q31_t)0x7B920B89, (q31_t)0x2161B39F, + (q31_t)0x7B77ADA8, (q31_t)0x21C2B69C, (q31_t)0x7B5D039D, + (q31_t)0x2223A4C5, (q31_t)0x7B420D7A, (q31_t)0x22847DDF, + (q31_t)0x7B26CB4F, (q31_t)0x22E541AE, (q31_t)0x7B0B3D2C, + (q31_t)0x2345EFF7, (q31_t)0x7AEF6323, (q31_t)0x23A6887E, + (q31_t)0x7AD33D45, (q31_t)0x24070B07, (q31_t)0x7AB6CBA3, + (q31_t)0x24677757, (q31_t)0x7A9A0E4F, (q31_t)0x24C7CD32, + (q31_t)0x7A7D055B, (q31_t)0x25280C5D, (q31_t)0x7A5FB0D8, + (q31_t)0x2588349D, (q31_t)0x7A4210D8, (q31_t)0x25E845B5, + (q31_t)0x7A24256E, (q31_t)0x26483F6C, (q31_t)0x7A05EEAD, + (q31_t)0x26A82185, (q31_t)0x79E76CA6, (q31_t)0x2707EBC6, + (q31_t)0x79C89F6D, (q31_t)0x27679DF4, (q31_t)0x79A98715, + (q31_t)0x27C737D2, (q31_t)0x798A23B1, (q31_t)0x2826B928, + (q31_t)0x796A7554, (q31_t)0x288621B9, (q31_t)0x794A7C11, + (q31_t)0x28E5714A, (q31_t)0x792A37FE, (q31_t)0x2944A7A2, + (q31_t)0x7909A92C, (q31_t)0x29A3C484, (q31_t)0x78E8CFB1, + (q31_t)0x2A02C7B8, (q31_t)0x78C7ABA1, (q31_t)0x2A61B101, + (q31_t)0x78A63D10, (q31_t)0x2AC08025, (q31_t)0x78848413, + (q31_t)0x2B1F34EB, (q31_t)0x786280BF, (q31_t)0x2B7DCF17, + (q31_t)0x78403328, (q31_t)0x2BDC4E6F, (q31_t)0x781D9B64, + (q31_t)0x2C3AB2B9, (q31_t)0x77FAB988, (q31_t)0x2C98FBBA, + (q31_t)0x77D78DAA, (q31_t)0x2CF72939, (q31_t)0x77B417DF, + (q31_t)0x2D553AFB, (q31_t)0x7790583D, (q31_t)0x2DB330C7, + (q31_t)0x776C4EDB, (q31_t)0x2E110A62, (q31_t)0x7747FBCE, + (q31_t)0x2E6EC792, (q31_t)0x77235F2D, (q31_t)0x2ECC681E, + (q31_t)0x76FE790E, (q31_t)0x2F29EBCC, (q31_t)0x76D94988, + (q31_t)0x2F875262, (q31_t)0x76B3D0B3, (q31_t)0x2FE49BA6, + (q31_t)0x768E0EA5, (q31_t)0x3041C760, (q31_t)0x76680376, + (q31_t)0x309ED555, (q31_t)0x7641AF3C, (q31_t)0x30FBC54D, + (q31_t)0x761B1211, (q31_t)0x3158970D, (q31_t)0x75F42C0A, + (q31_t)0x31B54A5D, (q31_t)0x75CCFD42, (q31_t)0x3211DF03, + (q31_t)0x75A585CF, (q31_t)0x326E54C7, (q31_t)0x757DC5CA, + (q31_t)0x32CAAB6F, (q31_t)0x7555BD4B, (q31_t)0x3326E2C2, + (q31_t)0x752D6C6C, (q31_t)0x3382FA88, (q31_t)0x7504D345, + (q31_t)0x33DEF287, (q31_t)0x74DBF1EF, (q31_t)0x343ACA87, + (q31_t)0x74B2C883, (q31_t)0x3496824F, (q31_t)0x7489571B, + (q31_t)0x34F219A7, (q31_t)0x745F9DD1, (q31_t)0x354D9056, + (q31_t)0x74359CBD, (q31_t)0x35A8E624, (q31_t)0x740B53FA, + (q31_t)0x36041AD9, (q31_t)0x73E0C3A3, (q31_t)0x365F2E3B, + (q31_t)0x73B5EBD0, (q31_t)0x36BA2013, (q31_t)0x738ACC9E, + (q31_t)0x3714F02A, (q31_t)0x735F6626, (q31_t)0x376F9E46, + (q31_t)0x7333B883, (q31_t)0x37CA2A30, (q31_t)0x7307C3D0, + (q31_t)0x382493B0, (q31_t)0x72DB8828, (q31_t)0x387EDA8E, + (q31_t)0x72AF05A6, (q31_t)0x38D8FE93, (q31_t)0x72823C66, + (q31_t)0x3932FF87, (q31_t)0x72552C84, (q31_t)0x398CDD32, + (q31_t)0x7227D61C, (q31_t)0x39E6975D, (q31_t)0x71FA3948, + (q31_t)0x3A402DD1, (q31_t)0x71CC5626, (q31_t)0x3A99A057, + (q31_t)0x719E2CD2, (q31_t)0x3AF2EEB7, (q31_t)0x716FBD68, + (q31_t)0x3B4C18BA, (q31_t)0x71410804, (q31_t)0x3BA51E29, + (q31_t)0x71120CC5, (q31_t)0x3BFDFECD, (q31_t)0x70E2CBC6, + (q31_t)0x3C56BA70, (q31_t)0x70B34524, (q31_t)0x3CAF50DA, + (q31_t)0x708378FE, (q31_t)0x3D07C1D5, (q31_t)0x70536771, + (q31_t)0x3D600D2B, (q31_t)0x70231099, (q31_t)0x3DB832A5, + (q31_t)0x6FF27496, (q31_t)0x3E10320D, (q31_t)0x6FC19385, + (q31_t)0x3E680B2C, (q31_t)0x6F906D84, (q31_t)0x3EBFBDCC, + (q31_t)0x6F5F02B1, (q31_t)0x3F1749B7, (q31_t)0x6F2D532C, + (q31_t)0x3F6EAEB8, (q31_t)0x6EFB5F12, (q31_t)0x3FC5EC97, + (q31_t)0x6EC92682, (q31_t)0x401D0320, (q31_t)0x6E96A99C, + (q31_t)0x4073F21D, (q31_t)0x6E63E87F, (q31_t)0x40CAB957, + (q31_t)0x6E30E349, (q31_t)0x4121589A, (q31_t)0x6DFD9A1B, + (q31_t)0x4177CFB0, (q31_t)0x6DCA0D14, (q31_t)0x41CE1E64, + (q31_t)0x6D963C54, (q31_t)0x42244480, (q31_t)0x6D6227FA, + (q31_t)0x427A41D0, (q31_t)0x6D2DD027, (q31_t)0x42D0161E, + (q31_t)0x6CF934FB, (q31_t)0x4325C135, (q31_t)0x6CC45697, + (q31_t)0x437B42E1, (q31_t)0x6C8F351C, (q31_t)0x43D09AEC, + (q31_t)0x6C59D0A9, (q31_t)0x4425C923, (q31_t)0x6C242960, + (q31_t)0x447ACD50, (q31_t)0x6BEE3F62, (q31_t)0x44CFA73F, + (q31_t)0x6BB812D0, (q31_t)0x452456BC, (q31_t)0x6B81A3CD, + (q31_t)0x4578DB93, (q31_t)0x6B4AF278, (q31_t)0x45CD358F, + (q31_t)0x6B13FEF5, (q31_t)0x4621647C, (q31_t)0x6ADCC964, + (q31_t)0x46756827, (q31_t)0x6AA551E8, (q31_t)0x46C9405C, + (q31_t)0x6A6D98A4, (q31_t)0x471CECE6, (q31_t)0x6A359DB9, + (q31_t)0x47706D93, (q31_t)0x69FD614A, (q31_t)0x47C3C22E, + (q31_t)0x69C4E37A, (q31_t)0x4816EA85, (q31_t)0x698C246C, + (q31_t)0x4869E664, (q31_t)0x69532442, (q31_t)0x48BCB598, + (q31_t)0x6919E320, (q31_t)0x490F57EE, (q31_t)0x68E06129, + (q31_t)0x4961CD32, (q31_t)0x68A69E81, (q31_t)0x49B41533, + (q31_t)0x686C9B4B, (q31_t)0x4A062FBD, (q31_t)0x683257AA, + (q31_t)0x4A581C9D, (q31_t)0x67F7D3C4, (q31_t)0x4AA9DBA1, + (q31_t)0x67BD0FBC, (q31_t)0x4AFB6C97, (q31_t)0x67820BB6, + (q31_t)0x4B4CCF4D, (q31_t)0x6746C7D7, (q31_t)0x4B9E038F, + (q31_t)0x670B4443, (q31_t)0x4BEF092D, (q31_t)0x66CF811F, + (q31_t)0x4C3FDFF3, (q31_t)0x66937E90, (q31_t)0x4C9087B1, + (q31_t)0x66573CBB, (q31_t)0x4CE10034, (q31_t)0x661ABBC5, + (q31_t)0x4D31494B, (q31_t)0x65DDFBD3, (q31_t)0x4D8162C4, + (q31_t)0x65A0FD0B, (q31_t)0x4DD14C6E, (q31_t)0x6563BF92, + (q31_t)0x4E210617, (q31_t)0x6526438E, (q31_t)0x4E708F8F, + (q31_t)0x64E88926, (q31_t)0x4EBFE8A4, (q31_t)0x64AA907F, + (q31_t)0x4F0F1126, (q31_t)0x646C59BF, (q31_t)0x4F5E08E3, + (q31_t)0x642DE50D, (q31_t)0x4FACCFAB, (q31_t)0x63EF328F, + (q31_t)0x4FFB654D, (q31_t)0x63B0426D, (q31_t)0x5049C999, + (q31_t)0x637114CC, (q31_t)0x5097FC5E, (q31_t)0x6331A9D4, + (q31_t)0x50E5FD6C, (q31_t)0x62F201AC, (q31_t)0x5133CC94, + (q31_t)0x62B21C7B, (q31_t)0x518169A4, (q31_t)0x6271FA69, + (q31_t)0x51CED46E, (q31_t)0x62319B9D, (q31_t)0x521C0CC1, + (q31_t)0x61F1003E, (q31_t)0x5269126E, (q31_t)0x61B02876, + (q31_t)0x52B5E545, (q31_t)0x616F146B, (q31_t)0x53028517, + (q31_t)0x612DC446, (q31_t)0x534EF1B5, (q31_t)0x60EC3830, + (q31_t)0x539B2AEF, (q31_t)0x60AA704F, (q31_t)0x53E73097, + (q31_t)0x60686CCE, (q31_t)0x5433027D, (q31_t)0x60262DD5, + (q31_t)0x547EA073, (q31_t)0x5FE3B38D, (q31_t)0x54CA0A4A, + (q31_t)0x5FA0FE1E, (q31_t)0x55153FD4, (q31_t)0x5F5E0DB3, + (q31_t)0x556040E2, (q31_t)0x5F1AE273, (q31_t)0x55AB0D46, + (q31_t)0x5ED77C89, (q31_t)0x55F5A4D2, (q31_t)0x5E93DC1F, + (q31_t)0x56400757, (q31_t)0x5E50015D, (q31_t)0x568A34A9, + (q31_t)0x5E0BEC6E, (q31_t)0x56D42C99, (q31_t)0x5DC79D7C, + (q31_t)0x571DEEF9, (q31_t)0x5D8314B0, (q31_t)0x57677B9D, + (q31_t)0x5D3E5236, (q31_t)0x57B0D256, (q31_t)0x5CF95638, + (q31_t)0x57F9F2F7, (q31_t)0x5CB420DF, (q31_t)0x5842DD54, + (q31_t)0x5C6EB258, (q31_t)0x588B913F, (q31_t)0x5C290ACC, + (q31_t)0x58D40E8C, (q31_t)0x5BE32A67, (q31_t)0x591C550E, + (q31_t)0x5B9D1153, (q31_t)0x59646497, (q31_t)0x5B56BFBD, + (q31_t)0x59AC3CFD, (q31_t)0x5B1035CF, (q31_t)0x59F3DE12, + (q31_t)0x5AC973B4, (q31_t)0x5A3B47AA, (q31_t)0x5A82799A, + (q31_t)0x5A82799A, (q31_t)0x5A3B47AA, (q31_t)0x5AC973B4, + (q31_t)0x59F3DE12, (q31_t)0x5B1035CF, (q31_t)0x59AC3CFD, + (q31_t)0x5B56BFBD, (q31_t)0x59646497, (q31_t)0x5B9D1153, + (q31_t)0x591C550E, (q31_t)0x5BE32A67, (q31_t)0x58D40E8C, + (q31_t)0x5C290ACC, (q31_t)0x588B913F, (q31_t)0x5C6EB258, + (q31_t)0x5842DD54, (q31_t)0x5CB420DF, (q31_t)0x57F9F2F7, + (q31_t)0x5CF95638, (q31_t)0x57B0D256, (q31_t)0x5D3E5236, + (q31_t)0x57677B9D, (q31_t)0x5D8314B0, (q31_t)0x571DEEF9, + (q31_t)0x5DC79D7C, (q31_t)0x56D42C99, (q31_t)0x5E0BEC6E, + (q31_t)0x568A34A9, (q31_t)0x5E50015D, (q31_t)0x56400757, + (q31_t)0x5E93DC1F, (q31_t)0x55F5A4D2, (q31_t)0x5ED77C89, + (q31_t)0x55AB0D46, (q31_t)0x5F1AE273, (q31_t)0x556040E2, + (q31_t)0x5F5E0DB3, (q31_t)0x55153FD4, (q31_t)0x5FA0FE1E, + (q31_t)0x54CA0A4A, (q31_t)0x5FE3B38D, (q31_t)0x547EA073, + (q31_t)0x60262DD5, (q31_t)0x5433027D, (q31_t)0x60686CCE, + (q31_t)0x53E73097, (q31_t)0x60AA704F, (q31_t)0x539B2AEF, + (q31_t)0x60EC3830, (q31_t)0x534EF1B5, (q31_t)0x612DC446, + (q31_t)0x53028517, (q31_t)0x616F146B, (q31_t)0x52B5E545, + (q31_t)0x61B02876, (q31_t)0x5269126E, (q31_t)0x61F1003E, + (q31_t)0x521C0CC1, (q31_t)0x62319B9D, (q31_t)0x51CED46E, + (q31_t)0x6271FA69, (q31_t)0x518169A4, (q31_t)0x62B21C7B, + (q31_t)0x5133CC94, (q31_t)0x62F201AC, (q31_t)0x50E5FD6C, + (q31_t)0x6331A9D4, (q31_t)0x5097FC5E, (q31_t)0x637114CC, + (q31_t)0x5049C999, (q31_t)0x63B0426D, (q31_t)0x4FFB654D, + (q31_t)0x63EF328F, (q31_t)0x4FACCFAB, (q31_t)0x642DE50D, + (q31_t)0x4F5E08E3, (q31_t)0x646C59BF, (q31_t)0x4F0F1126, + (q31_t)0x64AA907F, (q31_t)0x4EBFE8A4, (q31_t)0x64E88926, + (q31_t)0x4E708F8F, (q31_t)0x6526438E, (q31_t)0x4E210617, + (q31_t)0x6563BF92, (q31_t)0x4DD14C6E, (q31_t)0x65A0FD0B, + (q31_t)0x4D8162C4, (q31_t)0x65DDFBD3, (q31_t)0x4D31494B, + (q31_t)0x661ABBC5, (q31_t)0x4CE10034, (q31_t)0x66573CBB, + (q31_t)0x4C9087B1, (q31_t)0x66937E90, (q31_t)0x4C3FDFF3, + (q31_t)0x66CF811F, (q31_t)0x4BEF092D, (q31_t)0x670B4443, + (q31_t)0x4B9E038F, (q31_t)0x6746C7D7, (q31_t)0x4B4CCF4D, + (q31_t)0x67820BB6, (q31_t)0x4AFB6C97, (q31_t)0x67BD0FBC, + (q31_t)0x4AA9DBA1, (q31_t)0x67F7D3C4, (q31_t)0x4A581C9D, + (q31_t)0x683257AA, (q31_t)0x4A062FBD, (q31_t)0x686C9B4B, + (q31_t)0x49B41533, (q31_t)0x68A69E81, (q31_t)0x4961CD32, + (q31_t)0x68E06129, (q31_t)0x490F57EE, (q31_t)0x6919E320, + (q31_t)0x48BCB598, (q31_t)0x69532442, (q31_t)0x4869E664, + (q31_t)0x698C246C, (q31_t)0x4816EA85, (q31_t)0x69C4E37A, + (q31_t)0x47C3C22E, (q31_t)0x69FD614A, (q31_t)0x47706D93, + (q31_t)0x6A359DB9, (q31_t)0x471CECE6, (q31_t)0x6A6D98A4, + (q31_t)0x46C9405C, (q31_t)0x6AA551E8, (q31_t)0x46756827, + (q31_t)0x6ADCC964, (q31_t)0x4621647C, (q31_t)0x6B13FEF5, + (q31_t)0x45CD358F, (q31_t)0x6B4AF278, (q31_t)0x4578DB93, + (q31_t)0x6B81A3CD, (q31_t)0x452456BC, (q31_t)0x6BB812D0, + (q31_t)0x44CFA73F, (q31_t)0x6BEE3F62, (q31_t)0x447ACD50, + (q31_t)0x6C242960, (q31_t)0x4425C923, (q31_t)0x6C59D0A9, + (q31_t)0x43D09AEC, (q31_t)0x6C8F351C, (q31_t)0x437B42E1, + (q31_t)0x6CC45697, (q31_t)0x4325C135, (q31_t)0x6CF934FB, + (q31_t)0x42D0161E, (q31_t)0x6D2DD027, (q31_t)0x427A41D0, + (q31_t)0x6D6227FA, (q31_t)0x42244480, (q31_t)0x6D963C54, + (q31_t)0x41CE1E64, (q31_t)0x6DCA0D14, (q31_t)0x4177CFB0, + (q31_t)0x6DFD9A1B, (q31_t)0x4121589A, (q31_t)0x6E30E349, + (q31_t)0x40CAB957, (q31_t)0x6E63E87F, (q31_t)0x4073F21D, + (q31_t)0x6E96A99C, (q31_t)0x401D0320, (q31_t)0x6EC92682, + (q31_t)0x3FC5EC97, (q31_t)0x6EFB5F12, (q31_t)0x3F6EAEB8, + (q31_t)0x6F2D532C, (q31_t)0x3F1749B7, (q31_t)0x6F5F02B1, + (q31_t)0x3EBFBDCC, (q31_t)0x6F906D84, (q31_t)0x3E680B2C, + (q31_t)0x6FC19385, (q31_t)0x3E10320D, (q31_t)0x6FF27496, + (q31_t)0x3DB832A5, (q31_t)0x70231099, (q31_t)0x3D600D2B, + (q31_t)0x70536771, (q31_t)0x3D07C1D5, (q31_t)0x708378FE, + (q31_t)0x3CAF50DA, (q31_t)0x70B34524, (q31_t)0x3C56BA70, + (q31_t)0x70E2CBC6, (q31_t)0x3BFDFECD, (q31_t)0x71120CC5, + (q31_t)0x3BA51E29, (q31_t)0x71410804, (q31_t)0x3B4C18BA, + (q31_t)0x716FBD68, (q31_t)0x3AF2EEB7, (q31_t)0x719E2CD2, + (q31_t)0x3A99A057, (q31_t)0x71CC5626, (q31_t)0x3A402DD1, + (q31_t)0x71FA3948, (q31_t)0x39E6975D, (q31_t)0x7227D61C, + (q31_t)0x398CDD32, (q31_t)0x72552C84, (q31_t)0x3932FF87, + (q31_t)0x72823C66, (q31_t)0x38D8FE93, (q31_t)0x72AF05A6, + (q31_t)0x387EDA8E, (q31_t)0x72DB8828, (q31_t)0x382493B0, + (q31_t)0x7307C3D0, (q31_t)0x37CA2A30, (q31_t)0x7333B883, + (q31_t)0x376F9E46, (q31_t)0x735F6626, (q31_t)0x3714F02A, + (q31_t)0x738ACC9E, (q31_t)0x36BA2013, (q31_t)0x73B5EBD0, + (q31_t)0x365F2E3B, (q31_t)0x73E0C3A3, (q31_t)0x36041AD9, + (q31_t)0x740B53FA, (q31_t)0x35A8E624, (q31_t)0x74359CBD, + (q31_t)0x354D9056, (q31_t)0x745F9DD1, (q31_t)0x34F219A7, + (q31_t)0x7489571B, (q31_t)0x3496824F, (q31_t)0x74B2C883, + (q31_t)0x343ACA87, (q31_t)0x74DBF1EF, (q31_t)0x33DEF287, + (q31_t)0x7504D345, (q31_t)0x3382FA88, (q31_t)0x752D6C6C, + (q31_t)0x3326E2C2, (q31_t)0x7555BD4B, (q31_t)0x32CAAB6F, + (q31_t)0x757DC5CA, (q31_t)0x326E54C7, (q31_t)0x75A585CF, + (q31_t)0x3211DF03, (q31_t)0x75CCFD42, (q31_t)0x31B54A5D, + (q31_t)0x75F42C0A, (q31_t)0x3158970D, (q31_t)0x761B1211, + (q31_t)0x30FBC54D, (q31_t)0x7641AF3C, (q31_t)0x309ED555, + (q31_t)0x76680376, (q31_t)0x3041C760, (q31_t)0x768E0EA5, + (q31_t)0x2FE49BA6, (q31_t)0x76B3D0B3, (q31_t)0x2F875262, + (q31_t)0x76D94988, (q31_t)0x2F29EBCC, (q31_t)0x76FE790E, + (q31_t)0x2ECC681E, (q31_t)0x77235F2D, (q31_t)0x2E6EC792, + (q31_t)0x7747FBCE, (q31_t)0x2E110A62, (q31_t)0x776C4EDB, + (q31_t)0x2DB330C7, (q31_t)0x7790583D, (q31_t)0x2D553AFB, + (q31_t)0x77B417DF, (q31_t)0x2CF72939, (q31_t)0x77D78DAA, + (q31_t)0x2C98FBBA, (q31_t)0x77FAB988, (q31_t)0x2C3AB2B9, + (q31_t)0x781D9B64, (q31_t)0x2BDC4E6F, (q31_t)0x78403328, + (q31_t)0x2B7DCF17, (q31_t)0x786280BF, (q31_t)0x2B1F34EB, + (q31_t)0x78848413, (q31_t)0x2AC08025, (q31_t)0x78A63D10, + (q31_t)0x2A61B101, (q31_t)0x78C7ABA1, (q31_t)0x2A02C7B8, + (q31_t)0x78E8CFB1, (q31_t)0x29A3C484, (q31_t)0x7909A92C, + (q31_t)0x2944A7A2, (q31_t)0x792A37FE, (q31_t)0x28E5714A, + (q31_t)0x794A7C11, (q31_t)0x288621B9, (q31_t)0x796A7554, + (q31_t)0x2826B928, (q31_t)0x798A23B1, (q31_t)0x27C737D2, + (q31_t)0x79A98715, (q31_t)0x27679DF4, (q31_t)0x79C89F6D, + (q31_t)0x2707EBC6, (q31_t)0x79E76CA6, (q31_t)0x26A82185, + (q31_t)0x7A05EEAD, (q31_t)0x26483F6C, (q31_t)0x7A24256E, + (q31_t)0x25E845B5, (q31_t)0x7A4210D8, (q31_t)0x2588349D, + (q31_t)0x7A5FB0D8, (q31_t)0x25280C5D, (q31_t)0x7A7D055B, + (q31_t)0x24C7CD32, (q31_t)0x7A9A0E4F, (q31_t)0x24677757, + (q31_t)0x7AB6CBA3, (q31_t)0x24070B07, (q31_t)0x7AD33D45, + (q31_t)0x23A6887E, (q31_t)0x7AEF6323, (q31_t)0x2345EFF7, + (q31_t)0x7B0B3D2C, (q31_t)0x22E541AE, (q31_t)0x7B26CB4F, + (q31_t)0x22847DDF, (q31_t)0x7B420D7A, (q31_t)0x2223A4C5, + (q31_t)0x7B5D039D, (q31_t)0x21C2B69C, (q31_t)0x7B77ADA8, + (q31_t)0x2161B39F, (q31_t)0x7B920B89, (q31_t)0x21009C0B, + (q31_t)0x7BAC1D31, (q31_t)0x209F701C, (q31_t)0x7BC5E28F, + (q31_t)0x203E300D, (q31_t)0x7BDF5B94, (q31_t)0x1FDCDC1A, + (q31_t)0x7BF88830, (q31_t)0x1F7B7480, (q31_t)0x7C116853, + (q31_t)0x1F19F97B, (q31_t)0x7C29FBEE, (q31_t)0x1EB86B46, + (q31_t)0x7C4242F2, (q31_t)0x1E56CA1E, (q31_t)0x7C5A3D4F, + (q31_t)0x1DF5163F, (q31_t)0x7C71EAF8, (q31_t)0x1D934FE5, + (q31_t)0x7C894BDD, (q31_t)0x1D31774D, (q31_t)0x7CA05FF1, + (q31_t)0x1CCF8CB3, (q31_t)0x7CB72724, (q31_t)0x1C6D9053, + (q31_t)0x7CCDA168, (q31_t)0x1C0B826A, (q31_t)0x7CE3CEB1, + (q31_t)0x1BA96334, (q31_t)0x7CF9AEF0, (q31_t)0x1B4732EF, + (q31_t)0x7D0F4218, (q31_t)0x1AE4F1D6, (q31_t)0x7D24881A, + (q31_t)0x1A82A025, (q31_t)0x7D3980EC, (q31_t)0x1A203E1B, + (q31_t)0x7D4E2C7E, (q31_t)0x19BDCBF2, (q31_t)0x7D628AC5, + (q31_t)0x195B49E9, (q31_t)0x7D769BB5, (q31_t)0x18F8B83C, + (q31_t)0x7D8A5F3F, (q31_t)0x18961727, (q31_t)0x7D9DD55A, + (q31_t)0x183366E8, (q31_t)0x7DB0FDF7, (q31_t)0x17D0A7BB, + (q31_t)0x7DC3D90D, (q31_t)0x176DD9DE, (q31_t)0x7DD6668E, + (q31_t)0x170AFD8D, (q31_t)0x7DE8A670, (q31_t)0x16A81305, + (q31_t)0x7DFA98A7, (q31_t)0x16451A83, (q31_t)0x7E0C3D29, + (q31_t)0x15E21444, (q31_t)0x7E1D93E9, (q31_t)0x157F0086, + (q31_t)0x7E2E9CDF, (q31_t)0x151BDF85, (q31_t)0x7E3F57FE, + (q31_t)0x14B8B17F, (q31_t)0x7E4FC53E, (q31_t)0x145576B1, + (q31_t)0x7E5FE493, (q31_t)0x13F22F57, (q31_t)0x7E6FB5F3, + (q31_t)0x138EDBB0, (q31_t)0x7E7F3956, (q31_t)0x132B7BF9, + (q31_t)0x7E8E6EB1, (q31_t)0x12C8106E, (q31_t)0x7E9D55FC, + (q31_t)0x1264994E, (q31_t)0x7EABEF2C, (q31_t)0x120116D4, + (q31_t)0x7EBA3A39, (q31_t)0x119D8940, (q31_t)0x7EC8371A, + (q31_t)0x1139F0CE, (q31_t)0x7ED5E5C6, (q31_t)0x10D64DBC, + (q31_t)0x7EE34635, (q31_t)0x1072A047, (q31_t)0x7EF0585F, + (q31_t)0x100EE8AD, (q31_t)0x7EFD1C3C, (q31_t)0x0FAB272B, + (q31_t)0x7F0991C3, (q31_t)0x0F475BFE, (q31_t)0x7F15B8EE, + (q31_t)0x0EE38765, (q31_t)0x7F2191B4, (q31_t)0x0E7FA99D, + (q31_t)0x7F2D1C0E, (q31_t)0x0E1BC2E3, (q31_t)0x7F3857F5, + (q31_t)0x0DB7D376, (q31_t)0x7F434563, (q31_t)0x0D53DB92, + (q31_t)0x7F4DE450, (q31_t)0x0CEFDB75, (q31_t)0x7F5834B6, + (q31_t)0x0C8BD35E, (q31_t)0x7F62368F, (q31_t)0x0C27C389, + (q31_t)0x7F6BE9D4, (q31_t)0x0BC3AC35, (q31_t)0x7F754E7F, + (q31_t)0x0B5F8D9F, (q31_t)0x7F7E648B, (q31_t)0x0AFB6805, + (q31_t)0x7F872BF3, (q31_t)0x0A973BA5, (q31_t)0x7F8FA4AF, + (q31_t)0x0A3308BC, (q31_t)0x7F97CEBC, (q31_t)0x09CECF89, + (q31_t)0x7F9FAA15, (q31_t)0x096A9049, (q31_t)0x7FA736B4, + (q31_t)0x09064B3A, (q31_t)0x7FAE7494, (q31_t)0x08A2009A, + (q31_t)0x7FB563B2, (q31_t)0x083DB0A7, (q31_t)0x7FBC040A, + (q31_t)0x07D95B9E, (q31_t)0x7FC25596, (q31_t)0x077501BE, + (q31_t)0x7FC85853, (q31_t)0x0710A344, (q31_t)0x7FCE0C3E, + (q31_t)0x06AC406F, (q31_t)0x7FD37152, (q31_t)0x0647D97C, + (q31_t)0x7FD8878D, (q31_t)0x05E36EA9, (q31_t)0x7FDD4EEC, + (q31_t)0x057F0034, (q31_t)0x7FE1C76B, (q31_t)0x051A8E5C, + (q31_t)0x7FE5F108, (q31_t)0x04B6195D, (q31_t)0x7FE9CBC0, + (q31_t)0x0451A176, (q31_t)0x7FED5790, (q31_t)0x03ED26E6, + (q31_t)0x7FF09477, (q31_t)0x0388A9E9, (q31_t)0x7FF38273, + (q31_t)0x03242ABF, (q31_t)0x7FF62182, (q31_t)0x02BFA9A4, + (q31_t)0x7FF871A1, (q31_t)0x025B26D7, (q31_t)0x7FFA72D1, + (q31_t)0x01F6A296, (q31_t)0x7FFC250F, (q31_t)0x01921D1F, + (q31_t)0x7FFD885A, (q31_t)0x012D96B0, (q31_t)0x7FFE9CB2, + (q31_t)0x00C90F88, (q31_t)0x7FFF6216, (q31_t)0x006487E3, + (q31_t)0x7FFFD885, (q31_t)0x00000000, (q31_t)0x7FFFFFFF, + (q31_t)0xFF9B781D, (q31_t)0x7FFFD885, (q31_t)0xFF36F078, + (q31_t)0x7FFF6216, (q31_t)0xFED2694F, (q31_t)0x7FFE9CB2, + (q31_t)0xFE6DE2E0, (q31_t)0x7FFD885A, (q31_t)0xFE095D69, + (q31_t)0x7FFC250F, (q31_t)0xFDA4D928, (q31_t)0x7FFA72D1, + (q31_t)0xFD40565B, (q31_t)0x7FF871A1, (q31_t)0xFCDBD541, + (q31_t)0x7FF62182, (q31_t)0xFC775616, (q31_t)0x7FF38273, + (q31_t)0xFC12D919, (q31_t)0x7FF09477, (q31_t)0xFBAE5E89, + (q31_t)0x7FED5790, (q31_t)0xFB49E6A2, (q31_t)0x7FE9CBC0, + (q31_t)0xFAE571A4, (q31_t)0x7FE5F108, (q31_t)0xFA80FFCB, + (q31_t)0x7FE1C76B, (q31_t)0xFA1C9156, (q31_t)0x7FDD4EEC, + (q31_t)0xF9B82683, (q31_t)0x7FD8878D, (q31_t)0xF953BF90, + (q31_t)0x7FD37152, (q31_t)0xF8EF5CBB, (q31_t)0x7FCE0C3E, + (q31_t)0xF88AFE41, (q31_t)0x7FC85853, (q31_t)0xF826A461, + (q31_t)0x7FC25596, (q31_t)0xF7C24F58, (q31_t)0x7FBC040A, + (q31_t)0xF75DFF65, (q31_t)0x7FB563B2, (q31_t)0xF6F9B4C5, + (q31_t)0x7FAE7494, (q31_t)0xF6956FB6, (q31_t)0x7FA736B4, + (q31_t)0xF6313076, (q31_t)0x7F9FAA15, (q31_t)0xF5CCF743, + (q31_t)0x7F97CEBC, (q31_t)0xF568C45A, (q31_t)0x7F8FA4AF, + (q31_t)0xF50497FA, (q31_t)0x7F872BF3, (q31_t)0xF4A07260, + (q31_t)0x7F7E648B, (q31_t)0xF43C53CA, (q31_t)0x7F754E7F, + (q31_t)0xF3D83C76, (q31_t)0x7F6BE9D4, (q31_t)0xF3742CA1, + (q31_t)0x7F62368F, (q31_t)0xF310248A, (q31_t)0x7F5834B6, + (q31_t)0xF2AC246D, (q31_t)0x7F4DE450, (q31_t)0xF2482C89, + (q31_t)0x7F434563, (q31_t)0xF1E43D1C, (q31_t)0x7F3857F5, + (q31_t)0xF1805662, (q31_t)0x7F2D1C0E, (q31_t)0xF11C789A, + (q31_t)0x7F2191B4, (q31_t)0xF0B8A401, (q31_t)0x7F15B8EE, + (q31_t)0xF054D8D4, (q31_t)0x7F0991C3, (q31_t)0xEFF11752, + (q31_t)0x7EFD1C3C, (q31_t)0xEF8D5FB8, (q31_t)0x7EF0585F, + (q31_t)0xEF29B243, (q31_t)0x7EE34635, (q31_t)0xEEC60F31, + (q31_t)0x7ED5E5C6, (q31_t)0xEE6276BF, (q31_t)0x7EC8371A, + (q31_t)0xEDFEE92B, (q31_t)0x7EBA3A39, (q31_t)0xED9B66B2, + (q31_t)0x7EABEF2C, (q31_t)0xED37EF91, (q31_t)0x7E9D55FC, + (q31_t)0xECD48406, (q31_t)0x7E8E6EB1, (q31_t)0xEC71244F, + (q31_t)0x7E7F3956, (q31_t)0xEC0DD0A8, (q31_t)0x7E6FB5F3, + (q31_t)0xEBAA894E, (q31_t)0x7E5FE493, (q31_t)0xEB474E80, + (q31_t)0x7E4FC53E, (q31_t)0xEAE4207A, (q31_t)0x7E3F57FE, + (q31_t)0xEA80FF79, (q31_t)0x7E2E9CDF, (q31_t)0xEA1DEBBB, + (q31_t)0x7E1D93E9, (q31_t)0xE9BAE57C, (q31_t)0x7E0C3D29, + (q31_t)0xE957ECFB, (q31_t)0x7DFA98A7, (q31_t)0xE8F50273, + (q31_t)0x7DE8A670, (q31_t)0xE8922621, (q31_t)0x7DD6668E, + (q31_t)0xE82F5844, (q31_t)0x7DC3D90D, (q31_t)0xE7CC9917, + (q31_t)0x7DB0FDF7, (q31_t)0xE769E8D8, (q31_t)0x7D9DD55A, + (q31_t)0xE70747C3, (q31_t)0x7D8A5F3F, (q31_t)0xE6A4B616, + (q31_t)0x7D769BB5, (q31_t)0xE642340D, (q31_t)0x7D628AC5, + (q31_t)0xE5DFC1E4, (q31_t)0x7D4E2C7E, (q31_t)0xE57D5FDA, + (q31_t)0x7D3980EC, (q31_t)0xE51B0E2A, (q31_t)0x7D24881A, + (q31_t)0xE4B8CD10, (q31_t)0x7D0F4218, (q31_t)0xE4569CCB, + (q31_t)0x7CF9AEF0, (q31_t)0xE3F47D95, (q31_t)0x7CE3CEB1, + (q31_t)0xE3926FAC, (q31_t)0x7CCDA168, (q31_t)0xE330734C, + (q31_t)0x7CB72724, (q31_t)0xE2CE88B2, (q31_t)0x7CA05FF1, + (q31_t)0xE26CB01A, (q31_t)0x7C894BDD, (q31_t)0xE20AE9C1, + (q31_t)0x7C71EAF8, (q31_t)0xE1A935E1, (q31_t)0x7C5A3D4F, + (q31_t)0xE14794B9, (q31_t)0x7C4242F2, (q31_t)0xE0E60684, + (q31_t)0x7C29FBEE, (q31_t)0xE0848B7F, (q31_t)0x7C116853, + (q31_t)0xE02323E5, (q31_t)0x7BF88830, (q31_t)0xDFC1CFF2, + (q31_t)0x7BDF5B94, (q31_t)0xDF608FE3, (q31_t)0x7BC5E28F, + (q31_t)0xDEFF63F4, (q31_t)0x7BAC1D31, (q31_t)0xDE9E4C60, + (q31_t)0x7B920B89, (q31_t)0xDE3D4963, (q31_t)0x7B77ADA8, + (q31_t)0xDDDC5B3A, (q31_t)0x7B5D039D, (q31_t)0xDD7B8220, + (q31_t)0x7B420D7A, (q31_t)0xDD1ABE51, (q31_t)0x7B26CB4F, + (q31_t)0xDCBA1008, (q31_t)0x7B0B3D2C, (q31_t)0xDC597781, + (q31_t)0x7AEF6323, (q31_t)0xDBF8F4F8, (q31_t)0x7AD33D45, + (q31_t)0xDB9888A8, (q31_t)0x7AB6CBA3, (q31_t)0xDB3832CD, + (q31_t)0x7A9A0E4F, (q31_t)0xDAD7F3A2, (q31_t)0x7A7D055B, + (q31_t)0xDA77CB62, (q31_t)0x7A5FB0D8, (q31_t)0xDA17BA4A, + (q31_t)0x7A4210D8, (q31_t)0xD9B7C093, (q31_t)0x7A24256E, + (q31_t)0xD957DE7A, (q31_t)0x7A05EEAD, (q31_t)0xD8F81439, + (q31_t)0x79E76CA6, (q31_t)0xD898620C, (q31_t)0x79C89F6D, + (q31_t)0xD838C82D, (q31_t)0x79A98715, (q31_t)0xD7D946D7, + (q31_t)0x798A23B1, (q31_t)0xD779DE46, (q31_t)0x796A7554, + (q31_t)0xD71A8EB5, (q31_t)0x794A7C11, (q31_t)0xD6BB585D, + (q31_t)0x792A37FE, (q31_t)0xD65C3B7B, (q31_t)0x7909A92C, + (q31_t)0xD5FD3847, (q31_t)0x78E8CFB1, (q31_t)0xD59E4EFE, + (q31_t)0x78C7ABA1, (q31_t)0xD53F7FDA, (q31_t)0x78A63D10, + (q31_t)0xD4E0CB14, (q31_t)0x78848413, (q31_t)0xD48230E8, + (q31_t)0x786280BF, (q31_t)0xD423B190, (q31_t)0x78403328, + (q31_t)0xD3C54D46, (q31_t)0x781D9B64, (q31_t)0xD3670445, + (q31_t)0x77FAB988, (q31_t)0xD308D6C6, (q31_t)0x77D78DAA, + (q31_t)0xD2AAC504, (q31_t)0x77B417DF, (q31_t)0xD24CCF38, + (q31_t)0x7790583D, (q31_t)0xD1EEF59E, (q31_t)0x776C4EDB, + (q31_t)0xD191386D, (q31_t)0x7747FBCE, (q31_t)0xD13397E1, + (q31_t)0x77235F2D, (q31_t)0xD0D61433, (q31_t)0x76FE790E, + (q31_t)0xD078AD9D, (q31_t)0x76D94988, (q31_t)0xD01B6459, + (q31_t)0x76B3D0B3, (q31_t)0xCFBE389F, (q31_t)0x768E0EA5, + (q31_t)0xCF612AAA, (q31_t)0x76680376, (q31_t)0xCF043AB2, + (q31_t)0x7641AF3C, (q31_t)0xCEA768F2, (q31_t)0x761B1211, + (q31_t)0xCE4AB5A2, (q31_t)0x75F42C0A, (q31_t)0xCDEE20FC, + (q31_t)0x75CCFD42, (q31_t)0xCD91AB38, (q31_t)0x75A585CF, + (q31_t)0xCD355490, (q31_t)0x757DC5CA, (q31_t)0xCCD91D3D, + (q31_t)0x7555BD4B, (q31_t)0xCC7D0577, (q31_t)0x752D6C6C, + (q31_t)0xCC210D78, (q31_t)0x7504D345, (q31_t)0xCBC53578, + (q31_t)0x74DBF1EF, (q31_t)0xCB697DB0, (q31_t)0x74B2C883, + (q31_t)0xCB0DE658, (q31_t)0x7489571B, (q31_t)0xCAB26FA9, + (q31_t)0x745F9DD1, (q31_t)0xCA5719DB, (q31_t)0x74359CBD, + (q31_t)0xC9FBE527, (q31_t)0x740B53FA, (q31_t)0xC9A0D1C4, + (q31_t)0x73E0C3A3, (q31_t)0xC945DFEC, (q31_t)0x73B5EBD0, + (q31_t)0xC8EB0FD6, (q31_t)0x738ACC9E, (q31_t)0xC89061BA, + (q31_t)0x735F6626, (q31_t)0xC835D5D0, (q31_t)0x7333B883, + (q31_t)0xC7DB6C50, (q31_t)0x7307C3D0, (q31_t)0xC7812571, + (q31_t)0x72DB8828, (q31_t)0xC727016C, (q31_t)0x72AF05A6, + (q31_t)0xC6CD0079, (q31_t)0x72823C66, (q31_t)0xC67322CD, + (q31_t)0x72552C84, (q31_t)0xC61968A2, (q31_t)0x7227D61C, + (q31_t)0xC5BFD22E, (q31_t)0x71FA3948, (q31_t)0xC5665FA8, + (q31_t)0x71CC5626, (q31_t)0xC50D1148, (q31_t)0x719E2CD2, + (q31_t)0xC4B3E746, (q31_t)0x716FBD68, (q31_t)0xC45AE1D7, + (q31_t)0x71410804, (q31_t)0xC4020132, (q31_t)0x71120CC5, + (q31_t)0xC3A9458F, (q31_t)0x70E2CBC6, (q31_t)0xC350AF25, + (q31_t)0x70B34524, (q31_t)0xC2F83E2A, (q31_t)0x708378FE, + (q31_t)0xC29FF2D4, (q31_t)0x70536771, (q31_t)0xC247CD5A, + (q31_t)0x70231099, (q31_t)0xC1EFCDF2, (q31_t)0x6FF27496, + (q31_t)0xC197F4D3, (q31_t)0x6FC19385, (q31_t)0xC1404233, + (q31_t)0x6F906D84, (q31_t)0xC0E8B648, (q31_t)0x6F5F02B1, + (q31_t)0xC0915147, (q31_t)0x6F2D532C, (q31_t)0xC03A1368, + (q31_t)0x6EFB5F12, (q31_t)0xBFE2FCDF, (q31_t)0x6EC92682, + (q31_t)0xBF8C0DE2, (q31_t)0x6E96A99C, (q31_t)0xBF3546A8, + (q31_t)0x6E63E87F, (q31_t)0xBEDEA765, (q31_t)0x6E30E349, + (q31_t)0xBE88304F, (q31_t)0x6DFD9A1B, (q31_t)0xBE31E19B, + (q31_t)0x6DCA0D14, (q31_t)0xBDDBBB7F, (q31_t)0x6D963C54, + (q31_t)0xBD85BE2F, (q31_t)0x6D6227FA, (q31_t)0xBD2FE9E1, + (q31_t)0x6D2DD027, (q31_t)0xBCDA3ECA, (q31_t)0x6CF934FB, + (q31_t)0xBC84BD1E, (q31_t)0x6CC45697, (q31_t)0xBC2F6513, + (q31_t)0x6C8F351C, (q31_t)0xBBDA36DC, (q31_t)0x6C59D0A9, + (q31_t)0xBB8532AF, (q31_t)0x6C242960, (q31_t)0xBB3058C0, + (q31_t)0x6BEE3F62, (q31_t)0xBADBA943, (q31_t)0x6BB812D0, + (q31_t)0xBA87246C, (q31_t)0x6B81A3CD, (q31_t)0xBA32CA70, + (q31_t)0x6B4AF278, (q31_t)0xB9DE9B83, (q31_t)0x6B13FEF5, + (q31_t)0xB98A97D8, (q31_t)0x6ADCC964, (q31_t)0xB936BFA3, + (q31_t)0x6AA551E8, (q31_t)0xB8E31319, (q31_t)0x6A6D98A4, + (q31_t)0xB88F926C, (q31_t)0x6A359DB9, (q31_t)0xB83C3DD1, + (q31_t)0x69FD614A, (q31_t)0xB7E9157A, (q31_t)0x69C4E37A, + (q31_t)0xB796199B, (q31_t)0x698C246C, (q31_t)0xB7434A67, + (q31_t)0x69532442, (q31_t)0xB6F0A811, (q31_t)0x6919E320, + (q31_t)0xB69E32CD, (q31_t)0x68E06129, (q31_t)0xB64BEACC, + (q31_t)0x68A69E81, (q31_t)0xB5F9D042, (q31_t)0x686C9B4B, + (q31_t)0xB5A7E362, (q31_t)0x683257AA, (q31_t)0xB556245E, + (q31_t)0x67F7D3C4, (q31_t)0xB5049368, (q31_t)0x67BD0FBC, + (q31_t)0xB4B330B2, (q31_t)0x67820BB6, (q31_t)0xB461FC70, + (q31_t)0x6746C7D7, (q31_t)0xB410F6D2, (q31_t)0x670B4443, + (q31_t)0xB3C0200C, (q31_t)0x66CF811F, (q31_t)0xB36F784E, + (q31_t)0x66937E90, (q31_t)0xB31EFFCB, (q31_t)0x66573CBB, + (q31_t)0xB2CEB6B5, (q31_t)0x661ABBC5, (q31_t)0xB27E9D3B, + (q31_t)0x65DDFBD3, (q31_t)0xB22EB392, (q31_t)0x65A0FD0B, + (q31_t)0xB1DEF9E8, (q31_t)0x6563BF92, (q31_t)0xB18F7070, + (q31_t)0x6526438E, (q31_t)0xB140175B, (q31_t)0x64E88926, + (q31_t)0xB0F0EEDA, (q31_t)0x64AA907F, (q31_t)0xB0A1F71C, + (q31_t)0x646C59BF, (q31_t)0xB0533055, (q31_t)0x642DE50D, + (q31_t)0xB0049AB2, (q31_t)0x63EF328F, (q31_t)0xAFB63667, + (q31_t)0x63B0426D, (q31_t)0xAF6803A1, (q31_t)0x637114CC, + (q31_t)0xAF1A0293, (q31_t)0x6331A9D4, (q31_t)0xAECC336B, + (q31_t)0x62F201AC, (q31_t)0xAE7E965B, (q31_t)0x62B21C7B, + (q31_t)0xAE312B91, (q31_t)0x6271FA69, (q31_t)0xADE3F33E, + (q31_t)0x62319B9D, (q31_t)0xAD96ED91, (q31_t)0x61F1003E, + (q31_t)0xAD4A1ABA, (q31_t)0x61B02876, (q31_t)0xACFD7AE8, + (q31_t)0x616F146B, (q31_t)0xACB10E4A, (q31_t)0x612DC446, + (q31_t)0xAC64D510, (q31_t)0x60EC3830, (q31_t)0xAC18CF68, + (q31_t)0x60AA704F, (q31_t)0xABCCFD82, (q31_t)0x60686CCE, + (q31_t)0xAB815F8C, (q31_t)0x60262DD5, (q31_t)0xAB35F5B5, + (q31_t)0x5FE3B38D, (q31_t)0xAAEAC02B, (q31_t)0x5FA0FE1E, + (q31_t)0xAA9FBF1D, (q31_t)0x5F5E0DB3, (q31_t)0xAA54F2B9, + (q31_t)0x5F1AE273, (q31_t)0xAA0A5B2D, (q31_t)0x5ED77C89, + (q31_t)0xA9BFF8A8, (q31_t)0x5E93DC1F, (q31_t)0xA975CB56, + (q31_t)0x5E50015D, (q31_t)0xA92BD366, (q31_t)0x5E0BEC6E, + (q31_t)0xA8E21106, (q31_t)0x5DC79D7C, (q31_t)0xA8988463, + (q31_t)0x5D8314B0, (q31_t)0xA84F2DA9, (q31_t)0x5D3E5236, + (q31_t)0xA8060D08, (q31_t)0x5CF95638, (q31_t)0xA7BD22AB, + (q31_t)0x5CB420DF, (q31_t)0xA7746EC0, (q31_t)0x5C6EB258, + (q31_t)0xA72BF173, (q31_t)0x5C290ACC, (q31_t)0xA6E3AAF2, + (q31_t)0x5BE32A67, (q31_t)0xA69B9B68, (q31_t)0x5B9D1153, + (q31_t)0xA653C302, (q31_t)0x5B56BFBD, (q31_t)0xA60C21ED, + (q31_t)0x5B1035CF, (q31_t)0xA5C4B855, (q31_t)0x5AC973B4, + (q31_t)0xA57D8666, (q31_t)0x5A82799A, (q31_t)0xA5368C4B, + (q31_t)0x5A3B47AA, (q31_t)0xA4EFCA31, (q31_t)0x59F3DE12, + (q31_t)0xA4A94042, (q31_t)0x59AC3CFD, (q31_t)0xA462EEAC, + (q31_t)0x59646497, (q31_t)0xA41CD598, (q31_t)0x591C550E, + (q31_t)0xA3D6F533, (q31_t)0x58D40E8C, (q31_t)0xA3914DA7, + (q31_t)0x588B913F, (q31_t)0xA34BDF20, (q31_t)0x5842DD54, + (q31_t)0xA306A9C7, (q31_t)0x57F9F2F7, (q31_t)0xA2C1ADC9, + (q31_t)0x57B0D256, (q31_t)0xA27CEB4F, (q31_t)0x57677B9D, + (q31_t)0xA2386283, (q31_t)0x571DEEF9, (q31_t)0xA1F41391, + (q31_t)0x56D42C99, (q31_t)0xA1AFFEA2, (q31_t)0x568A34A9, + (q31_t)0xA16C23E1, (q31_t)0x56400757, (q31_t)0xA1288376, + (q31_t)0x55F5A4D2, (q31_t)0xA0E51D8C, (q31_t)0x55AB0D46, + (q31_t)0xA0A1F24C, (q31_t)0x556040E2, (q31_t)0xA05F01E1, + (q31_t)0x55153FD4, (q31_t)0xA01C4C72, (q31_t)0x54CA0A4A, + (q31_t)0x9FD9D22A, (q31_t)0x547EA073, (q31_t)0x9F979331, + (q31_t)0x5433027D, (q31_t)0x9F558FB0, (q31_t)0x53E73097, + (q31_t)0x9F13C7D0, (q31_t)0x539B2AEF, (q31_t)0x9ED23BB9, + (q31_t)0x534EF1B5, (q31_t)0x9E90EB94, (q31_t)0x53028517, + (q31_t)0x9E4FD789, (q31_t)0x52B5E545, (q31_t)0x9E0EFFC1, + (q31_t)0x5269126E, (q31_t)0x9DCE6462, (q31_t)0x521C0CC1, + (q31_t)0x9D8E0596, (q31_t)0x51CED46E, (q31_t)0x9D4DE384, + (q31_t)0x518169A4, (q31_t)0x9D0DFE53, (q31_t)0x5133CC94, + (q31_t)0x9CCE562B, (q31_t)0x50E5FD6C, (q31_t)0x9C8EEB33, + (q31_t)0x5097FC5E, (q31_t)0x9C4FBD92, (q31_t)0x5049C999, + (q31_t)0x9C10CD70, (q31_t)0x4FFB654D, (q31_t)0x9BD21AF2, + (q31_t)0x4FACCFAB, (q31_t)0x9B93A640, (q31_t)0x4F5E08E3, + (q31_t)0x9B556F80, (q31_t)0x4F0F1126, (q31_t)0x9B1776D9, + (q31_t)0x4EBFE8A4, (q31_t)0x9AD9BC71, (q31_t)0x4E708F8F, + (q31_t)0x9A9C406D, (q31_t)0x4E210617, (q31_t)0x9A5F02F5, + (q31_t)0x4DD14C6E, (q31_t)0x9A22042C, (q31_t)0x4D8162C4, + (q31_t)0x99E5443A, (q31_t)0x4D31494B, (q31_t)0x99A8C344, + (q31_t)0x4CE10034, (q31_t)0x996C816F, (q31_t)0x4C9087B1, + (q31_t)0x99307EE0, (q31_t)0x4C3FDFF3, (q31_t)0x98F4BBBC, + (q31_t)0x4BEF092D, (q31_t)0x98B93828, (q31_t)0x4B9E038F, + (q31_t)0x987DF449, (q31_t)0x4B4CCF4D, (q31_t)0x9842F043, + (q31_t)0x4AFB6C97, (q31_t)0x98082C3B, (q31_t)0x4AA9DBA1, + (q31_t)0x97CDA855, (q31_t)0x4A581C9D, (q31_t)0x979364B5, + (q31_t)0x4A062FBD, (q31_t)0x9759617E, (q31_t)0x49B41533, + (q31_t)0x971F9ED6, (q31_t)0x4961CD32, (q31_t)0x96E61CDF, + (q31_t)0x490F57EE, (q31_t)0x96ACDBBD, (q31_t)0x48BCB598, + (q31_t)0x9673DB94, (q31_t)0x4869E664, (q31_t)0x963B1C85, + (q31_t)0x4816EA85, (q31_t)0x96029EB5, (q31_t)0x47C3C22E, + (q31_t)0x95CA6246, (q31_t)0x47706D93, (q31_t)0x9592675B, + (q31_t)0x471CECE6, (q31_t)0x955AAE17, (q31_t)0x46C9405C, + (q31_t)0x9523369B, (q31_t)0x46756827, (q31_t)0x94EC010B, + (q31_t)0x4621647C, (q31_t)0x94B50D87, (q31_t)0x45CD358F, + (q31_t)0x947E5C32, (q31_t)0x4578DB93, (q31_t)0x9447ED2F, + (q31_t)0x452456BC, (q31_t)0x9411C09D, (q31_t)0x44CFA73F, + (q31_t)0x93DBD69F, (q31_t)0x447ACD50, (q31_t)0x93A62F56, + (q31_t)0x4425C923, (q31_t)0x9370CAE4, (q31_t)0x43D09AEC, + (q31_t)0x933BA968, (q31_t)0x437B42E1, (q31_t)0x9306CB04, + (q31_t)0x4325C135, (q31_t)0x92D22FD8, (q31_t)0x42D0161E, + (q31_t)0x929DD805, (q31_t)0x427A41D0, (q31_t)0x9269C3AC, + (q31_t)0x42244480, (q31_t)0x9235F2EB, (q31_t)0x41CE1E64, + (q31_t)0x920265E4, (q31_t)0x4177CFB0, (q31_t)0x91CF1CB6, + (q31_t)0x4121589A, (q31_t)0x919C1780, (q31_t)0x40CAB957, + (q31_t)0x91695663, (q31_t)0x4073F21D, (q31_t)0x9136D97D, + (q31_t)0x401D0320, (q31_t)0x9104A0ED, (q31_t)0x3FC5EC97, + (q31_t)0x90D2ACD3, (q31_t)0x3F6EAEB8, (q31_t)0x90A0FD4E, + (q31_t)0x3F1749B7, (q31_t)0x906F927B, (q31_t)0x3EBFBDCC, + (q31_t)0x903E6C7A, (q31_t)0x3E680B2C, (q31_t)0x900D8B69, + (q31_t)0x3E10320D, (q31_t)0x8FDCEF66, (q31_t)0x3DB832A5, + (q31_t)0x8FAC988E, (q31_t)0x3D600D2B, (q31_t)0x8F7C8701, + (q31_t)0x3D07C1D5, (q31_t)0x8F4CBADB, (q31_t)0x3CAF50DA, + (q31_t)0x8F1D343A, (q31_t)0x3C56BA70, (q31_t)0x8EEDF33B, + (q31_t)0x3BFDFECD, (q31_t)0x8EBEF7FB, (q31_t)0x3BA51E29, + (q31_t)0x8E904298, (q31_t)0x3B4C18BA, (q31_t)0x8E61D32D, + (q31_t)0x3AF2EEB7, (q31_t)0x8E33A9D9, (q31_t)0x3A99A057, + (q31_t)0x8E05C6B7, (q31_t)0x3A402DD1, (q31_t)0x8DD829E4, + (q31_t)0x39E6975D, (q31_t)0x8DAAD37B, (q31_t)0x398CDD32, + (q31_t)0x8D7DC399, (q31_t)0x3932FF87, (q31_t)0x8D50FA59, + (q31_t)0x38D8FE93, (q31_t)0x8D2477D8, (q31_t)0x387EDA8E, + (q31_t)0x8CF83C30, (q31_t)0x382493B0, (q31_t)0x8CCC477D, + (q31_t)0x37CA2A30, (q31_t)0x8CA099D9, (q31_t)0x376F9E46, + (q31_t)0x8C753361, (q31_t)0x3714F02A, (q31_t)0x8C4A142F, + (q31_t)0x36BA2013, (q31_t)0x8C1F3C5C, (q31_t)0x365F2E3B, + (q31_t)0x8BF4AC05, (q31_t)0x36041AD9, (q31_t)0x8BCA6342, + (q31_t)0x35A8E624, (q31_t)0x8BA0622F, (q31_t)0x354D9056, + (q31_t)0x8B76A8E4, (q31_t)0x34F219A7, (q31_t)0x8B4D377C, + (q31_t)0x3496824F, (q31_t)0x8B240E10, (q31_t)0x343ACA87, + (q31_t)0x8AFB2CBA, (q31_t)0x33DEF287, (q31_t)0x8AD29393, + (q31_t)0x3382FA88, (q31_t)0x8AAA42B4, (q31_t)0x3326E2C2, + (q31_t)0x8A823A35, (q31_t)0x32CAAB6F, (q31_t)0x8A5A7A30, + (q31_t)0x326E54C7, (q31_t)0x8A3302BD, (q31_t)0x3211DF03, + (q31_t)0x8A0BD3F5, (q31_t)0x31B54A5D, (q31_t)0x89E4EDEE, + (q31_t)0x3158970D, (q31_t)0x89BE50C3, (q31_t)0x30FBC54D, + (q31_t)0x8997FC89, (q31_t)0x309ED555, (q31_t)0x8971F15A, + (q31_t)0x3041C760, (q31_t)0x894C2F4C, (q31_t)0x2FE49BA6, + (q31_t)0x8926B677, (q31_t)0x2F875262, (q31_t)0x890186F1, + (q31_t)0x2F29EBCC, (q31_t)0x88DCA0D3, (q31_t)0x2ECC681E, + (q31_t)0x88B80431, (q31_t)0x2E6EC792, (q31_t)0x8893B124, + (q31_t)0x2E110A62, (q31_t)0x886FA7C2, (q31_t)0x2DB330C7, + (q31_t)0x884BE820, (q31_t)0x2D553AFB, (q31_t)0x88287255, + (q31_t)0x2CF72939, (q31_t)0x88054677, (q31_t)0x2C98FBBA, + (q31_t)0x87E2649B, (q31_t)0x2C3AB2B9, (q31_t)0x87BFCCD7, + (q31_t)0x2BDC4E6F, (q31_t)0x879D7F40, (q31_t)0x2B7DCF17, + (q31_t)0x877B7BEC, (q31_t)0x2B1F34EB, (q31_t)0x8759C2EF, + (q31_t)0x2AC08025, (q31_t)0x8738545E, (q31_t)0x2A61B101, + (q31_t)0x8717304E, (q31_t)0x2A02C7B8, (q31_t)0x86F656D3, + (q31_t)0x29A3C484, (q31_t)0x86D5C802, (q31_t)0x2944A7A2, + (q31_t)0x86B583EE, (q31_t)0x28E5714A, (q31_t)0x86958AAB, + (q31_t)0x288621B9, (q31_t)0x8675DC4E, (q31_t)0x2826B928, + (q31_t)0x865678EA, (q31_t)0x27C737D2, (q31_t)0x86376092, + (q31_t)0x27679DF4, (q31_t)0x86189359, (q31_t)0x2707EBC6, + (q31_t)0x85FA1152, (q31_t)0x26A82185, (q31_t)0x85DBDA91, + (q31_t)0x26483F6C, (q31_t)0x85BDEF27, (q31_t)0x25E845B5, + (q31_t)0x85A04F28, (q31_t)0x2588349D, (q31_t)0x8582FAA4, + (q31_t)0x25280C5D, (q31_t)0x8565F1B0, (q31_t)0x24C7CD32, + (q31_t)0x8549345C, (q31_t)0x24677757, (q31_t)0x852CC2BA, + (q31_t)0x24070B07, (q31_t)0x85109CDC, (q31_t)0x23A6887E, + (q31_t)0x84F4C2D3, (q31_t)0x2345EFF7, (q31_t)0x84D934B0, + (q31_t)0x22E541AE, (q31_t)0x84BDF285, (q31_t)0x22847DDF, + (q31_t)0x84A2FC62, (q31_t)0x2223A4C5, (q31_t)0x84885257, + (q31_t)0x21C2B69C, (q31_t)0x846DF476, (q31_t)0x2161B39F, + (q31_t)0x8453E2CE, (q31_t)0x21009C0B, (q31_t)0x843A1D70, + (q31_t)0x209F701C, (q31_t)0x8420A46B, (q31_t)0x203E300D, + (q31_t)0x840777CF, (q31_t)0x1FDCDC1A, (q31_t)0x83EE97AC, + (q31_t)0x1F7B7480, (q31_t)0x83D60411, (q31_t)0x1F19F97B, + (q31_t)0x83BDBD0D, (q31_t)0x1EB86B46, (q31_t)0x83A5C2B0, + (q31_t)0x1E56CA1E, (q31_t)0x838E1507, (q31_t)0x1DF5163F, + (q31_t)0x8376B422, (q31_t)0x1D934FE5, (q31_t)0x835FA00E, + (q31_t)0x1D31774D, (q31_t)0x8348D8DB, (q31_t)0x1CCF8CB3, + (q31_t)0x83325E97, (q31_t)0x1C6D9053, (q31_t)0x831C314E, + (q31_t)0x1C0B826A, (q31_t)0x8306510F, (q31_t)0x1BA96334, + (q31_t)0x82F0BDE8, (q31_t)0x1B4732EF, (q31_t)0x82DB77E5, + (q31_t)0x1AE4F1D6, (q31_t)0x82C67F13, (q31_t)0x1A82A025, + (q31_t)0x82B1D381, (q31_t)0x1A203E1B, (q31_t)0x829D753A, + (q31_t)0x19BDCBF2, (q31_t)0x8289644A, (q31_t)0x195B49E9, + (q31_t)0x8275A0C0, (q31_t)0x18F8B83C, (q31_t)0x82622AA5, + (q31_t)0x18961727, (q31_t)0x824F0208, (q31_t)0x183366E8, + (q31_t)0x823C26F2, (q31_t)0x17D0A7BB, (q31_t)0x82299971, + (q31_t)0x176DD9DE, (q31_t)0x8217598F, (q31_t)0x170AFD8D, + (q31_t)0x82056758, (q31_t)0x16A81305, (q31_t)0x81F3C2D7, + (q31_t)0x16451A83, (q31_t)0x81E26C16, (q31_t)0x15E21444, + (q31_t)0x81D16320, (q31_t)0x157F0086, (q31_t)0x81C0A801, + (q31_t)0x151BDF85, (q31_t)0x81B03AC1, (q31_t)0x14B8B17F, + (q31_t)0x81A01B6C, (q31_t)0x145576B1, (q31_t)0x81904A0C, + (q31_t)0x13F22F57, (q31_t)0x8180C6A9, (q31_t)0x138EDBB0, + (q31_t)0x8171914E, (q31_t)0x132B7BF9, (q31_t)0x8162AA03, + (q31_t)0x12C8106E, (q31_t)0x815410D3, (q31_t)0x1264994E, + (q31_t)0x8145C5C6, (q31_t)0x120116D4, (q31_t)0x8137C8E6, + (q31_t)0x119D8940, (q31_t)0x812A1A39, (q31_t)0x1139F0CE, + (q31_t)0x811CB9CA, (q31_t)0x10D64DBC, (q31_t)0x810FA7A0, + (q31_t)0x1072A047, (q31_t)0x8102E3C3, (q31_t)0x100EE8AD, + (q31_t)0x80F66E3C, (q31_t)0x0FAB272B, (q31_t)0x80EA4712, + (q31_t)0x0F475BFE, (q31_t)0x80DE6E4C, (q31_t)0x0EE38765, + (q31_t)0x80D2E3F1, (q31_t)0x0E7FA99D, (q31_t)0x80C7A80A, + (q31_t)0x0E1BC2E3, (q31_t)0x80BCBA9C, (q31_t)0x0DB7D376, + (q31_t)0x80B21BAF, (q31_t)0x0D53DB92, (q31_t)0x80A7CB49, + (q31_t)0x0CEFDB75, (q31_t)0x809DC970, (q31_t)0x0C8BD35E, + (q31_t)0x8094162B, (q31_t)0x0C27C389, (q31_t)0x808AB180, + (q31_t)0x0BC3AC35, (q31_t)0x80819B74, (q31_t)0x0B5F8D9F, + (q31_t)0x8078D40D, (q31_t)0x0AFB6805, (q31_t)0x80705B50, + (q31_t)0x0A973BA5, (q31_t)0x80683143, (q31_t)0x0A3308BC, + (q31_t)0x806055EA, (q31_t)0x09CECF89, (q31_t)0x8058C94C, + (q31_t)0x096A9049, (q31_t)0x80518B6B, (q31_t)0x09064B3A, + (q31_t)0x804A9C4D, (q31_t)0x08A2009A, (q31_t)0x8043FBF6, + (q31_t)0x083DB0A7, (q31_t)0x803DAA69, (q31_t)0x07D95B9E, + (q31_t)0x8037A7AC, (q31_t)0x077501BE, (q31_t)0x8031F3C1, + (q31_t)0x0710A344, (q31_t)0x802C8EAD, (q31_t)0x06AC406F, + (q31_t)0x80277872, (q31_t)0x0647D97C, (q31_t)0x8022B113, + (q31_t)0x05E36EA9, (q31_t)0x801E3894, (q31_t)0x057F0034, + (q31_t)0x801A0EF7, (q31_t)0x051A8E5C, (q31_t)0x80163440, + (q31_t)0x04B6195D, (q31_t)0x8012A86F, (q31_t)0x0451A176, + (q31_t)0x800F6B88, (q31_t)0x03ED26E6, (q31_t)0x800C7D8C, + (q31_t)0x0388A9E9, (q31_t)0x8009DE7D, (q31_t)0x03242ABF, + (q31_t)0x80078E5E, (q31_t)0x02BFA9A4, (q31_t)0x80058D2E, + (q31_t)0x025B26D7, (q31_t)0x8003DAF0, (q31_t)0x01F6A296, + (q31_t)0x800277A5, (q31_t)0x01921D1F, (q31_t)0x8001634D, + (q31_t)0x012D96B0, (q31_t)0x80009DE9, (q31_t)0x00C90F88, + (q31_t)0x8000277A, (q31_t)0x006487E3, (q31_t)0x80000000, + (q31_t)0x00000000, (q31_t)0x8000277A, (q31_t)0xFF9B781D, + (q31_t)0x80009DE9, (q31_t)0xFF36F078, (q31_t)0x8001634D, + (q31_t)0xFED2694F, (q31_t)0x800277A5, (q31_t)0xFE6DE2E0, + (q31_t)0x8003DAF0, (q31_t)0xFE095D69, (q31_t)0x80058D2E, + (q31_t)0xFDA4D928, (q31_t)0x80078E5E, (q31_t)0xFD40565B, + (q31_t)0x8009DE7D, (q31_t)0xFCDBD541, (q31_t)0x800C7D8C, + (q31_t)0xFC775616, (q31_t)0x800F6B88, (q31_t)0xFC12D919, + (q31_t)0x8012A86F, (q31_t)0xFBAE5E89, (q31_t)0x80163440, + (q31_t)0xFB49E6A2, (q31_t)0x801A0EF7, (q31_t)0xFAE571A4, + (q31_t)0x801E3894, (q31_t)0xFA80FFCB, (q31_t)0x8022B113, + (q31_t)0xFA1C9156, (q31_t)0x80277872, (q31_t)0xF9B82683, + (q31_t)0x802C8EAD, (q31_t)0xF953BF90, (q31_t)0x8031F3C1, + (q31_t)0xF8EF5CBB, (q31_t)0x8037A7AC, (q31_t)0xF88AFE41, + (q31_t)0x803DAA69, (q31_t)0xF826A461, (q31_t)0x8043FBF6, + (q31_t)0xF7C24F58, (q31_t)0x804A9C4D, (q31_t)0xF75DFF65, + (q31_t)0x80518B6B, (q31_t)0xF6F9B4C5, (q31_t)0x8058C94C, + (q31_t)0xF6956FB6, (q31_t)0x806055EA, (q31_t)0xF6313076, + (q31_t)0x80683143, (q31_t)0xF5CCF743, (q31_t)0x80705B50, + (q31_t)0xF568C45A, (q31_t)0x8078D40D, (q31_t)0xF50497FA, + (q31_t)0x80819B74, (q31_t)0xF4A07260, (q31_t)0x808AB180, + (q31_t)0xF43C53CA, (q31_t)0x8094162B, (q31_t)0xF3D83C76, + (q31_t)0x809DC970, (q31_t)0xF3742CA1, (q31_t)0x80A7CB49, + (q31_t)0xF310248A, (q31_t)0x80B21BAF, (q31_t)0xF2AC246D, + (q31_t)0x80BCBA9C, (q31_t)0xF2482C89, (q31_t)0x80C7A80A, + (q31_t)0xF1E43D1C, (q31_t)0x80D2E3F1, (q31_t)0xF1805662, + (q31_t)0x80DE6E4C, (q31_t)0xF11C789A, (q31_t)0x80EA4712, + (q31_t)0xF0B8A401, (q31_t)0x80F66E3C, (q31_t)0xF054D8D4, + (q31_t)0x8102E3C3, (q31_t)0xEFF11752, (q31_t)0x810FA7A0, + (q31_t)0xEF8D5FB8, (q31_t)0x811CB9CA, (q31_t)0xEF29B243, + (q31_t)0x812A1A39, (q31_t)0xEEC60F31, (q31_t)0x8137C8E6, + (q31_t)0xEE6276BF, (q31_t)0x8145C5C6, (q31_t)0xEDFEE92B, + (q31_t)0x815410D3, (q31_t)0xED9B66B2, (q31_t)0x8162AA03, + (q31_t)0xED37EF91, (q31_t)0x8171914E, (q31_t)0xECD48406, + (q31_t)0x8180C6A9, (q31_t)0xEC71244F, (q31_t)0x81904A0C, + (q31_t)0xEC0DD0A8, (q31_t)0x81A01B6C, (q31_t)0xEBAA894E, + (q31_t)0x81B03AC1, (q31_t)0xEB474E80, (q31_t)0x81C0A801, + (q31_t)0xEAE4207A, (q31_t)0x81D16320, (q31_t)0xEA80FF79, + (q31_t)0x81E26C16, (q31_t)0xEA1DEBBB, (q31_t)0x81F3C2D7, + (q31_t)0xE9BAE57C, (q31_t)0x82056758, (q31_t)0xE957ECFB, + (q31_t)0x8217598F, (q31_t)0xE8F50273, (q31_t)0x82299971, + (q31_t)0xE8922621, (q31_t)0x823C26F2, (q31_t)0xE82F5844, + (q31_t)0x824F0208, (q31_t)0xE7CC9917, (q31_t)0x82622AA5, + (q31_t)0xE769E8D8, (q31_t)0x8275A0C0, (q31_t)0xE70747C3, + (q31_t)0x8289644A, (q31_t)0xE6A4B616, (q31_t)0x829D753A, + (q31_t)0xE642340D, (q31_t)0x82B1D381, (q31_t)0xE5DFC1E4, + (q31_t)0x82C67F13, (q31_t)0xE57D5FDA, (q31_t)0x82DB77E5, + (q31_t)0xE51B0E2A, (q31_t)0x82F0BDE8, (q31_t)0xE4B8CD10, + (q31_t)0x8306510F, (q31_t)0xE4569CCB, (q31_t)0x831C314E, + (q31_t)0xE3F47D95, (q31_t)0x83325E97, (q31_t)0xE3926FAC, + (q31_t)0x8348D8DB, (q31_t)0xE330734C, (q31_t)0x835FA00E, + (q31_t)0xE2CE88B2, (q31_t)0x8376B422, (q31_t)0xE26CB01A, + (q31_t)0x838E1507, (q31_t)0xE20AE9C1, (q31_t)0x83A5C2B0, + (q31_t)0xE1A935E1, (q31_t)0x83BDBD0D, (q31_t)0xE14794B9, + (q31_t)0x83D60411, (q31_t)0xE0E60684, (q31_t)0x83EE97AC, + (q31_t)0xE0848B7F, (q31_t)0x840777CF, (q31_t)0xE02323E5, + (q31_t)0x8420A46B, (q31_t)0xDFC1CFF2, (q31_t)0x843A1D70, + (q31_t)0xDF608FE3, (q31_t)0x8453E2CE, (q31_t)0xDEFF63F4, + (q31_t)0x846DF476, (q31_t)0xDE9E4C60, (q31_t)0x84885257, + (q31_t)0xDE3D4963, (q31_t)0x84A2FC62, (q31_t)0xDDDC5B3A, + (q31_t)0x84BDF285, (q31_t)0xDD7B8220, (q31_t)0x84D934B0, + (q31_t)0xDD1ABE51, (q31_t)0x84F4C2D3, (q31_t)0xDCBA1008, + (q31_t)0x85109CDC, (q31_t)0xDC597781, (q31_t)0x852CC2BA, + (q31_t)0xDBF8F4F8, (q31_t)0x8549345C, (q31_t)0xDB9888A8, + (q31_t)0x8565F1B0, (q31_t)0xDB3832CD, (q31_t)0x8582FAA4, + (q31_t)0xDAD7F3A2, (q31_t)0x85A04F28, (q31_t)0xDA77CB62, + (q31_t)0x85BDEF27, (q31_t)0xDA17BA4A, (q31_t)0x85DBDA91, + (q31_t)0xD9B7C093, (q31_t)0x85FA1152, (q31_t)0xD957DE7A, + (q31_t)0x86189359, (q31_t)0xD8F81439, (q31_t)0x86376092, + (q31_t)0xD898620C, (q31_t)0x865678EA, (q31_t)0xD838C82D, + (q31_t)0x8675DC4E, (q31_t)0xD7D946D7, (q31_t)0x86958AAB, + (q31_t)0xD779DE46, (q31_t)0x86B583EE, (q31_t)0xD71A8EB5, + (q31_t)0x86D5C802, (q31_t)0xD6BB585D, (q31_t)0x86F656D3, + (q31_t)0xD65C3B7B, (q31_t)0x8717304E, (q31_t)0xD5FD3847, + (q31_t)0x8738545E, (q31_t)0xD59E4EFE, (q31_t)0x8759C2EF, + (q31_t)0xD53F7FDA, (q31_t)0x877B7BEC, (q31_t)0xD4E0CB14, + (q31_t)0x879D7F40, (q31_t)0xD48230E8, (q31_t)0x87BFCCD7, + (q31_t)0xD423B190, (q31_t)0x87E2649B, (q31_t)0xD3C54D46, + (q31_t)0x88054677, (q31_t)0xD3670445, (q31_t)0x88287255, + (q31_t)0xD308D6C6, (q31_t)0x884BE820, (q31_t)0xD2AAC504, + (q31_t)0x886FA7C2, (q31_t)0xD24CCF38, (q31_t)0x8893B124, + (q31_t)0xD1EEF59E, (q31_t)0x88B80431, (q31_t)0xD191386D, + (q31_t)0x88DCA0D3, (q31_t)0xD13397E1, (q31_t)0x890186F1, + (q31_t)0xD0D61433, (q31_t)0x8926B677, (q31_t)0xD078AD9D, + (q31_t)0x894C2F4C, (q31_t)0xD01B6459, (q31_t)0x8971F15A, + (q31_t)0xCFBE389F, (q31_t)0x8997FC89, (q31_t)0xCF612AAA, + (q31_t)0x89BE50C3, (q31_t)0xCF043AB2, (q31_t)0x89E4EDEE, + (q31_t)0xCEA768F2, (q31_t)0x8A0BD3F5, (q31_t)0xCE4AB5A2, + (q31_t)0x8A3302BD, (q31_t)0xCDEE20FC, (q31_t)0x8A5A7A30, + (q31_t)0xCD91AB38, (q31_t)0x8A823A35, (q31_t)0xCD355490, + (q31_t)0x8AAA42B4, (q31_t)0xCCD91D3D, (q31_t)0x8AD29393, + (q31_t)0xCC7D0577, (q31_t)0x8AFB2CBA, (q31_t)0xCC210D78, + (q31_t)0x8B240E10, (q31_t)0xCBC53578, (q31_t)0x8B4D377C, + (q31_t)0xCB697DB0, (q31_t)0x8B76A8E4, (q31_t)0xCB0DE658, + (q31_t)0x8BA0622F, (q31_t)0xCAB26FA9, (q31_t)0x8BCA6342, + (q31_t)0xCA5719DB, (q31_t)0x8BF4AC05, (q31_t)0xC9FBE527, + (q31_t)0x8C1F3C5C, (q31_t)0xC9A0D1C4, (q31_t)0x8C4A142F, + (q31_t)0xC945DFEC, (q31_t)0x8C753361, (q31_t)0xC8EB0FD6, + (q31_t)0x8CA099D9, (q31_t)0xC89061BA, (q31_t)0x8CCC477D, + (q31_t)0xC835D5D0, (q31_t)0x8CF83C30, (q31_t)0xC7DB6C50, + (q31_t)0x8D2477D8, (q31_t)0xC7812571, (q31_t)0x8D50FA59, + (q31_t)0xC727016C, (q31_t)0x8D7DC399, (q31_t)0xC6CD0079, + (q31_t)0x8DAAD37B, (q31_t)0xC67322CD, (q31_t)0x8DD829E4, + (q31_t)0xC61968A2, (q31_t)0x8E05C6B7, (q31_t)0xC5BFD22E, + (q31_t)0x8E33A9D9, (q31_t)0xC5665FA8, (q31_t)0x8E61D32D, + (q31_t)0xC50D1148, (q31_t)0x8E904298, (q31_t)0xC4B3E746, + (q31_t)0x8EBEF7FB, (q31_t)0xC45AE1D7, (q31_t)0x8EEDF33B, + (q31_t)0xC4020132, (q31_t)0x8F1D343A, (q31_t)0xC3A9458F, + (q31_t)0x8F4CBADB, (q31_t)0xC350AF25, (q31_t)0x8F7C8701, + (q31_t)0xC2F83E2A, (q31_t)0x8FAC988E, (q31_t)0xC29FF2D4, + (q31_t)0x8FDCEF66, (q31_t)0xC247CD5A, (q31_t)0x900D8B69, + (q31_t)0xC1EFCDF2, (q31_t)0x903E6C7A, (q31_t)0xC197F4D3, + (q31_t)0x906F927B, (q31_t)0xC1404233, (q31_t)0x90A0FD4E, + (q31_t)0xC0E8B648, (q31_t)0x90D2ACD3, (q31_t)0xC0915147, + (q31_t)0x9104A0ED, (q31_t)0xC03A1368, (q31_t)0x9136D97D, + (q31_t)0xBFE2FCDF, (q31_t)0x91695663, (q31_t)0xBF8C0DE2, + (q31_t)0x919C1780, (q31_t)0xBF3546A8, (q31_t)0x91CF1CB6, + (q31_t)0xBEDEA765, (q31_t)0x920265E4, (q31_t)0xBE88304F, + (q31_t)0x9235F2EB, (q31_t)0xBE31E19B, (q31_t)0x9269C3AC, + (q31_t)0xBDDBBB7F, (q31_t)0x929DD805, (q31_t)0xBD85BE2F, + (q31_t)0x92D22FD8, (q31_t)0xBD2FE9E1, (q31_t)0x9306CB04, + (q31_t)0xBCDA3ECA, (q31_t)0x933BA968, (q31_t)0xBC84BD1E, + (q31_t)0x9370CAE4, (q31_t)0xBC2F6513, (q31_t)0x93A62F56, + (q31_t)0xBBDA36DC, (q31_t)0x93DBD69F, (q31_t)0xBB8532AF, + (q31_t)0x9411C09D, (q31_t)0xBB3058C0, (q31_t)0x9447ED2F, + (q31_t)0xBADBA943, (q31_t)0x947E5C32, (q31_t)0xBA87246C, + (q31_t)0x94B50D87, (q31_t)0xBA32CA70, (q31_t)0x94EC010B, + (q31_t)0xB9DE9B83, (q31_t)0x9523369B, (q31_t)0xB98A97D8, + (q31_t)0x955AAE17, (q31_t)0xB936BFA3, (q31_t)0x9592675B, + (q31_t)0xB8E31319, (q31_t)0x95CA6246, (q31_t)0xB88F926C, + (q31_t)0x96029EB5, (q31_t)0xB83C3DD1, (q31_t)0x963B1C85, + (q31_t)0xB7E9157A, (q31_t)0x9673DB94, (q31_t)0xB796199B, + (q31_t)0x96ACDBBD, (q31_t)0xB7434A67, (q31_t)0x96E61CDF, + (q31_t)0xB6F0A811, (q31_t)0x971F9ED6, (q31_t)0xB69E32CD, + (q31_t)0x9759617E, (q31_t)0xB64BEACC, (q31_t)0x979364B5, + (q31_t)0xB5F9D042, (q31_t)0x97CDA855, (q31_t)0xB5A7E362, + (q31_t)0x98082C3B, (q31_t)0xB556245E, (q31_t)0x9842F043, + (q31_t)0xB5049368, (q31_t)0x987DF449, (q31_t)0xB4B330B2, + (q31_t)0x98B93828, (q31_t)0xB461FC70, (q31_t)0x98F4BBBC, + (q31_t)0xB410F6D2, (q31_t)0x99307EE0, (q31_t)0xB3C0200C, + (q31_t)0x996C816F, (q31_t)0xB36F784E, (q31_t)0x99A8C344, + (q31_t)0xB31EFFCB, (q31_t)0x99E5443A, (q31_t)0xB2CEB6B5, + (q31_t)0x9A22042C, (q31_t)0xB27E9D3B, (q31_t)0x9A5F02F5, + (q31_t)0xB22EB392, (q31_t)0x9A9C406D, (q31_t)0xB1DEF9E8, + (q31_t)0x9AD9BC71, (q31_t)0xB18F7070, (q31_t)0x9B1776D9, + (q31_t)0xB140175B, (q31_t)0x9B556F80, (q31_t)0xB0F0EEDA, + (q31_t)0x9B93A640, (q31_t)0xB0A1F71C, (q31_t)0x9BD21AF2, + (q31_t)0xB0533055, (q31_t)0x9C10CD70, (q31_t)0xB0049AB2, + (q31_t)0x9C4FBD92, (q31_t)0xAFB63667, (q31_t)0x9C8EEB33, + (q31_t)0xAF6803A1, (q31_t)0x9CCE562B, (q31_t)0xAF1A0293, + (q31_t)0x9D0DFE53, (q31_t)0xAECC336B, (q31_t)0x9D4DE384, + (q31_t)0xAE7E965B, (q31_t)0x9D8E0596, (q31_t)0xAE312B91, + (q31_t)0x9DCE6462, (q31_t)0xADE3F33E, (q31_t)0x9E0EFFC1, + (q31_t)0xAD96ED91, (q31_t)0x9E4FD789, (q31_t)0xAD4A1ABA, + (q31_t)0x9E90EB94, (q31_t)0xACFD7AE8, (q31_t)0x9ED23BB9, + (q31_t)0xACB10E4A, (q31_t)0x9F13C7D0, (q31_t)0xAC64D510, + (q31_t)0x9F558FB0, (q31_t)0xAC18CF68, (q31_t)0x9F979331, + (q31_t)0xABCCFD82, (q31_t)0x9FD9D22A, (q31_t)0xAB815F8C, + (q31_t)0xA01C4C72, (q31_t)0xAB35F5B5, (q31_t)0xA05F01E1, + (q31_t)0xAAEAC02B, (q31_t)0xA0A1F24C, (q31_t)0xAA9FBF1D, + (q31_t)0xA0E51D8C, (q31_t)0xAA54F2B9, (q31_t)0xA1288376, + (q31_t)0xAA0A5B2D, (q31_t)0xA16C23E1, (q31_t)0xA9BFF8A8, + (q31_t)0xA1AFFEA2, (q31_t)0xA975CB56, (q31_t)0xA1F41391, + (q31_t)0xA92BD366, (q31_t)0xA2386283, (q31_t)0xA8E21106, + (q31_t)0xA27CEB4F, (q31_t)0xA8988463, (q31_t)0xA2C1ADC9, + (q31_t)0xA84F2DA9, (q31_t)0xA306A9C7, (q31_t)0xA8060D08, + (q31_t)0xA34BDF20, (q31_t)0xA7BD22AB, (q31_t)0xA3914DA7, + (q31_t)0xA7746EC0, (q31_t)0xA3D6F533, (q31_t)0xA72BF173, + (q31_t)0xA41CD598, (q31_t)0xA6E3AAF2, (q31_t)0xA462EEAC, + (q31_t)0xA69B9B68, (q31_t)0xA4A94042, (q31_t)0xA653C302, + (q31_t)0xA4EFCA31, (q31_t)0xA60C21ED, (q31_t)0xA5368C4B, + (q31_t)0xA5C4B855, (q31_t)0xA57D8666, (q31_t)0xA57D8666, + (q31_t)0xA5C4B855, (q31_t)0xA5368C4B, (q31_t)0xA60C21ED, + (q31_t)0xA4EFCA31, (q31_t)0xA653C302, (q31_t)0xA4A94042, + (q31_t)0xA69B9B68, (q31_t)0xA462EEAC, (q31_t)0xA6E3AAF2, + (q31_t)0xA41CD598, (q31_t)0xA72BF173, (q31_t)0xA3D6F533, + (q31_t)0xA7746EC0, (q31_t)0xA3914DA7, (q31_t)0xA7BD22AB, + (q31_t)0xA34BDF20, (q31_t)0xA8060D08, (q31_t)0xA306A9C7, + (q31_t)0xA84F2DA9, (q31_t)0xA2C1ADC9, (q31_t)0xA8988463, + (q31_t)0xA27CEB4F, (q31_t)0xA8E21106, (q31_t)0xA2386283, + (q31_t)0xA92BD366, (q31_t)0xA1F41391, (q31_t)0xA975CB56, + (q31_t)0xA1AFFEA2, (q31_t)0xA9BFF8A8, (q31_t)0xA16C23E1, + (q31_t)0xAA0A5B2D, (q31_t)0xA1288376, (q31_t)0xAA54F2B9, + (q31_t)0xA0E51D8C, (q31_t)0xAA9FBF1D, (q31_t)0xA0A1F24C, + (q31_t)0xAAEAC02B, (q31_t)0xA05F01E1, (q31_t)0xAB35F5B5, + (q31_t)0xA01C4C72, (q31_t)0xAB815F8C, (q31_t)0x9FD9D22A, + (q31_t)0xABCCFD82, (q31_t)0x9F979331, (q31_t)0xAC18CF68, + (q31_t)0x9F558FB0, (q31_t)0xAC64D510, (q31_t)0x9F13C7D0, + (q31_t)0xACB10E4A, (q31_t)0x9ED23BB9, (q31_t)0xACFD7AE8, + (q31_t)0x9E90EB94, (q31_t)0xAD4A1ABA, (q31_t)0x9E4FD789, + (q31_t)0xAD96ED91, (q31_t)0x9E0EFFC1, (q31_t)0xADE3F33E, + (q31_t)0x9DCE6462, (q31_t)0xAE312B91, (q31_t)0x9D8E0596, + (q31_t)0xAE7E965B, (q31_t)0x9D4DE384, (q31_t)0xAECC336B, + (q31_t)0x9D0DFE53, (q31_t)0xAF1A0293, (q31_t)0x9CCE562B, + (q31_t)0xAF6803A1, (q31_t)0x9C8EEB33, (q31_t)0xAFB63667, + (q31_t)0x9C4FBD92, (q31_t)0xB0049AB2, (q31_t)0x9C10CD70, + (q31_t)0xB0533055, (q31_t)0x9BD21AF2, (q31_t)0xB0A1F71C, + (q31_t)0x9B93A640, (q31_t)0xB0F0EEDA, (q31_t)0x9B556F80, + (q31_t)0xB140175B, (q31_t)0x9B1776D9, (q31_t)0xB18F7070, + (q31_t)0x9AD9BC71, (q31_t)0xB1DEF9E8, (q31_t)0x9A9C406D, + (q31_t)0xB22EB392, (q31_t)0x9A5F02F5, (q31_t)0xB27E9D3B, + (q31_t)0x9A22042C, (q31_t)0xB2CEB6B5, (q31_t)0x99E5443A, + (q31_t)0xB31EFFCB, (q31_t)0x99A8C344, (q31_t)0xB36F784E, + (q31_t)0x996C816F, (q31_t)0xB3C0200C, (q31_t)0x99307EE0, + (q31_t)0xB410F6D2, (q31_t)0x98F4BBBC, (q31_t)0xB461FC70, + (q31_t)0x98B93828, (q31_t)0xB4B330B2, (q31_t)0x987DF449, + (q31_t)0xB5049368, (q31_t)0x9842F043, (q31_t)0xB556245E, + (q31_t)0x98082C3B, (q31_t)0xB5A7E362, (q31_t)0x97CDA855, + (q31_t)0xB5F9D042, (q31_t)0x979364B5, (q31_t)0xB64BEACC, + (q31_t)0x9759617E, (q31_t)0xB69E32CD, (q31_t)0x971F9ED6, + (q31_t)0xB6F0A811, (q31_t)0x96E61CDF, (q31_t)0xB7434A67, + (q31_t)0x96ACDBBD, (q31_t)0xB796199B, (q31_t)0x9673DB94, + (q31_t)0xB7E9157A, (q31_t)0x963B1C85, (q31_t)0xB83C3DD1, + (q31_t)0x96029EB5, (q31_t)0xB88F926C, (q31_t)0x95CA6246, + (q31_t)0xB8E31319, (q31_t)0x9592675B, (q31_t)0xB936BFA3, + (q31_t)0x955AAE17, (q31_t)0xB98A97D8, (q31_t)0x9523369B, + (q31_t)0xB9DE9B83, (q31_t)0x94EC010B, (q31_t)0xBA32CA70, + (q31_t)0x94B50D87, (q31_t)0xBA87246C, (q31_t)0x947E5C32, + (q31_t)0xBADBA943, (q31_t)0x9447ED2F, (q31_t)0xBB3058C0, + (q31_t)0x9411C09D, (q31_t)0xBB8532AF, (q31_t)0x93DBD69F, + (q31_t)0xBBDA36DC, (q31_t)0x93A62F56, (q31_t)0xBC2F6513, + (q31_t)0x9370CAE4, (q31_t)0xBC84BD1E, (q31_t)0x933BA968, + (q31_t)0xBCDA3ECA, (q31_t)0x9306CB04, (q31_t)0xBD2FE9E1, + (q31_t)0x92D22FD8, (q31_t)0xBD85BE2F, (q31_t)0x929DD805, + (q31_t)0xBDDBBB7F, (q31_t)0x9269C3AC, (q31_t)0xBE31E19B, + (q31_t)0x9235F2EB, (q31_t)0xBE88304F, (q31_t)0x920265E4, + (q31_t)0xBEDEA765, (q31_t)0x91CF1CB6, (q31_t)0xBF3546A8, + (q31_t)0x919C1780, (q31_t)0xBF8C0DE2, (q31_t)0x91695663, + (q31_t)0xBFE2FCDF, (q31_t)0x9136D97D, (q31_t)0xC03A1368, + (q31_t)0x9104A0ED, (q31_t)0xC0915147, (q31_t)0x90D2ACD3, + (q31_t)0xC0E8B648, (q31_t)0x90A0FD4E, (q31_t)0xC1404233, + (q31_t)0x906F927B, (q31_t)0xC197F4D3, (q31_t)0x903E6C7A, + (q31_t)0xC1EFCDF2, (q31_t)0x900D8B69, (q31_t)0xC247CD5A, + (q31_t)0x8FDCEF66, (q31_t)0xC29FF2D4, (q31_t)0x8FAC988E, + (q31_t)0xC2F83E2A, (q31_t)0x8F7C8701, (q31_t)0xC350AF25, + (q31_t)0x8F4CBADB, (q31_t)0xC3A9458F, (q31_t)0x8F1D343A, + (q31_t)0xC4020132, (q31_t)0x8EEDF33B, (q31_t)0xC45AE1D7, + (q31_t)0x8EBEF7FB, (q31_t)0xC4B3E746, (q31_t)0x8E904298, + (q31_t)0xC50D1148, (q31_t)0x8E61D32D, (q31_t)0xC5665FA8, + (q31_t)0x8E33A9D9, (q31_t)0xC5BFD22E, (q31_t)0x8E05C6B7, + (q31_t)0xC61968A2, (q31_t)0x8DD829E4, (q31_t)0xC67322CD, + (q31_t)0x8DAAD37B, (q31_t)0xC6CD0079, (q31_t)0x8D7DC399, + (q31_t)0xC727016C, (q31_t)0x8D50FA59, (q31_t)0xC7812571, + (q31_t)0x8D2477D8, (q31_t)0xC7DB6C50, (q31_t)0x8CF83C30, + (q31_t)0xC835D5D0, (q31_t)0x8CCC477D, (q31_t)0xC89061BA, + (q31_t)0x8CA099D9, (q31_t)0xC8EB0FD6, (q31_t)0x8C753361, + (q31_t)0xC945DFEC, (q31_t)0x8C4A142F, (q31_t)0xC9A0D1C4, + (q31_t)0x8C1F3C5C, (q31_t)0xC9FBE527, (q31_t)0x8BF4AC05, + (q31_t)0xCA5719DB, (q31_t)0x8BCA6342, (q31_t)0xCAB26FA9, + (q31_t)0x8BA0622F, (q31_t)0xCB0DE658, (q31_t)0x8B76A8E4, + (q31_t)0xCB697DB0, (q31_t)0x8B4D377C, (q31_t)0xCBC53578, + (q31_t)0x8B240E10, (q31_t)0xCC210D78, (q31_t)0x8AFB2CBA, + (q31_t)0xCC7D0577, (q31_t)0x8AD29393, (q31_t)0xCCD91D3D, + (q31_t)0x8AAA42B4, (q31_t)0xCD355490, (q31_t)0x8A823A35, + (q31_t)0xCD91AB38, (q31_t)0x8A5A7A30, (q31_t)0xCDEE20FC, + (q31_t)0x8A3302BD, (q31_t)0xCE4AB5A2, (q31_t)0x8A0BD3F5, + (q31_t)0xCEA768F2, (q31_t)0x89E4EDEE, (q31_t)0xCF043AB2, + (q31_t)0x89BE50C3, (q31_t)0xCF612AAA, (q31_t)0x8997FC89, + (q31_t)0xCFBE389F, (q31_t)0x8971F15A, (q31_t)0xD01B6459, + (q31_t)0x894C2F4C, (q31_t)0xD078AD9D, (q31_t)0x8926B677, + (q31_t)0xD0D61433, (q31_t)0x890186F1, (q31_t)0xD13397E1, + (q31_t)0x88DCA0D3, (q31_t)0xD191386D, (q31_t)0x88B80431, + (q31_t)0xD1EEF59E, (q31_t)0x8893B124, (q31_t)0xD24CCF38, + (q31_t)0x886FA7C2, (q31_t)0xD2AAC504, (q31_t)0x884BE820, + (q31_t)0xD308D6C6, (q31_t)0x88287255, (q31_t)0xD3670445, + (q31_t)0x88054677, (q31_t)0xD3C54D46, (q31_t)0x87E2649B, + (q31_t)0xD423B190, (q31_t)0x87BFCCD7, (q31_t)0xD48230E8, + (q31_t)0x879D7F40, (q31_t)0xD4E0CB14, (q31_t)0x877B7BEC, + (q31_t)0xD53F7FDA, (q31_t)0x8759C2EF, (q31_t)0xD59E4EFE, + (q31_t)0x8738545E, (q31_t)0xD5FD3847, (q31_t)0x8717304E, + (q31_t)0xD65C3B7B, (q31_t)0x86F656D3, (q31_t)0xD6BB585D, + (q31_t)0x86D5C802, (q31_t)0xD71A8EB5, (q31_t)0x86B583EE, + (q31_t)0xD779DE46, (q31_t)0x86958AAB, (q31_t)0xD7D946D7, + (q31_t)0x8675DC4E, (q31_t)0xD838C82D, (q31_t)0x865678EA, + (q31_t)0xD898620C, (q31_t)0x86376092, (q31_t)0xD8F81439, + (q31_t)0x86189359, (q31_t)0xD957DE7A, (q31_t)0x85FA1152, + (q31_t)0xD9B7C093, (q31_t)0x85DBDA91, (q31_t)0xDA17BA4A, + (q31_t)0x85BDEF27, (q31_t)0xDA77CB62, (q31_t)0x85A04F28, + (q31_t)0xDAD7F3A2, (q31_t)0x8582FAA4, (q31_t)0xDB3832CD, + (q31_t)0x8565F1B0, (q31_t)0xDB9888A8, (q31_t)0x8549345C, + (q31_t)0xDBF8F4F8, (q31_t)0x852CC2BA, (q31_t)0xDC597781, + (q31_t)0x85109CDC, (q31_t)0xDCBA1008, (q31_t)0x84F4C2D3, + (q31_t)0xDD1ABE51, (q31_t)0x84D934B0, (q31_t)0xDD7B8220, + (q31_t)0x84BDF285, (q31_t)0xDDDC5B3A, (q31_t)0x84A2FC62, + (q31_t)0xDE3D4963, (q31_t)0x84885257, (q31_t)0xDE9E4C60, + (q31_t)0x846DF476, (q31_t)0xDEFF63F4, (q31_t)0x8453E2CE, + (q31_t)0xDF608FE3, (q31_t)0x843A1D70, (q31_t)0xDFC1CFF2, + (q31_t)0x8420A46B, (q31_t)0xE02323E5, (q31_t)0x840777CF, + (q31_t)0xE0848B7F, (q31_t)0x83EE97AC, (q31_t)0xE0E60684, + (q31_t)0x83D60411, (q31_t)0xE14794B9, (q31_t)0x83BDBD0D, + (q31_t)0xE1A935E1, (q31_t)0x83A5C2B0, (q31_t)0xE20AE9C1, + (q31_t)0x838E1507, (q31_t)0xE26CB01A, (q31_t)0x8376B422, + (q31_t)0xE2CE88B2, (q31_t)0x835FA00E, (q31_t)0xE330734C, + (q31_t)0x8348D8DB, (q31_t)0xE3926FAC, (q31_t)0x83325E97, + (q31_t)0xE3F47D95, (q31_t)0x831C314E, (q31_t)0xE4569CCB, + (q31_t)0x8306510F, (q31_t)0xE4B8CD10, (q31_t)0x82F0BDE8, + (q31_t)0xE51B0E2A, (q31_t)0x82DB77E5, (q31_t)0xE57D5FDA, + (q31_t)0x82C67F13, (q31_t)0xE5DFC1E4, (q31_t)0x82B1D381, + (q31_t)0xE642340D, (q31_t)0x829D753A, (q31_t)0xE6A4B616, + (q31_t)0x8289644A, (q31_t)0xE70747C3, (q31_t)0x8275A0C0, + (q31_t)0xE769E8D8, (q31_t)0x82622AA5, (q31_t)0xE7CC9917, + (q31_t)0x824F0208, (q31_t)0xE82F5844, (q31_t)0x823C26F2, + (q31_t)0xE8922621, (q31_t)0x82299971, (q31_t)0xE8F50273, + (q31_t)0x8217598F, (q31_t)0xE957ECFB, (q31_t)0x82056758, + (q31_t)0xE9BAE57C, (q31_t)0x81F3C2D7, (q31_t)0xEA1DEBBB, + (q31_t)0x81E26C16, (q31_t)0xEA80FF79, (q31_t)0x81D16320, + (q31_t)0xEAE4207A, (q31_t)0x81C0A801, (q31_t)0xEB474E80, + (q31_t)0x81B03AC1, (q31_t)0xEBAA894E, (q31_t)0x81A01B6C, + (q31_t)0xEC0DD0A8, (q31_t)0x81904A0C, (q31_t)0xEC71244F, + (q31_t)0x8180C6A9, (q31_t)0xECD48406, (q31_t)0x8171914E, + (q31_t)0xED37EF91, (q31_t)0x8162AA03, (q31_t)0xED9B66B2, + (q31_t)0x815410D3, (q31_t)0xEDFEE92B, (q31_t)0x8145C5C6, + (q31_t)0xEE6276BF, (q31_t)0x8137C8E6, (q31_t)0xEEC60F31, + (q31_t)0x812A1A39, (q31_t)0xEF29B243, (q31_t)0x811CB9CA, + (q31_t)0xEF8D5FB8, (q31_t)0x810FA7A0, (q31_t)0xEFF11752, + (q31_t)0x8102E3C3, (q31_t)0xF054D8D4, (q31_t)0x80F66E3C, + (q31_t)0xF0B8A401, (q31_t)0x80EA4712, (q31_t)0xF11C789A, + (q31_t)0x80DE6E4C, (q31_t)0xF1805662, (q31_t)0x80D2E3F1, + (q31_t)0xF1E43D1C, (q31_t)0x80C7A80A, (q31_t)0xF2482C89, + (q31_t)0x80BCBA9C, (q31_t)0xF2AC246D, (q31_t)0x80B21BAF, + (q31_t)0xF310248A, (q31_t)0x80A7CB49, (q31_t)0xF3742CA1, + (q31_t)0x809DC970, (q31_t)0xF3D83C76, (q31_t)0x8094162B, + (q31_t)0xF43C53CA, (q31_t)0x808AB180, (q31_t)0xF4A07260, + (q31_t)0x80819B74, (q31_t)0xF50497FA, (q31_t)0x8078D40D, + (q31_t)0xF568C45A, (q31_t)0x80705B50, (q31_t)0xF5CCF743, + (q31_t)0x80683143, (q31_t)0xF6313076, (q31_t)0x806055EA, + (q31_t)0xF6956FB6, (q31_t)0x8058C94C, (q31_t)0xF6F9B4C5, + (q31_t)0x80518B6B, (q31_t)0xF75DFF65, (q31_t)0x804A9C4D, + (q31_t)0xF7C24F58, (q31_t)0x8043FBF6, (q31_t)0xF826A461, + (q31_t)0x803DAA69, (q31_t)0xF88AFE41, (q31_t)0x8037A7AC, + (q31_t)0xF8EF5CBB, (q31_t)0x8031F3C1, (q31_t)0xF953BF90, + (q31_t)0x802C8EAD, (q31_t)0xF9B82683, (q31_t)0x80277872, + (q31_t)0xFA1C9156, (q31_t)0x8022B113, (q31_t)0xFA80FFCB, + (q31_t)0x801E3894, (q31_t)0xFAE571A4, (q31_t)0x801A0EF7, + (q31_t)0xFB49E6A2, (q31_t)0x80163440, (q31_t)0xFBAE5E89, + (q31_t)0x8012A86F, (q31_t)0xFC12D919, (q31_t)0x800F6B88, + (q31_t)0xFC775616, (q31_t)0x800C7D8C, (q31_t)0xFCDBD541, + (q31_t)0x8009DE7D, (q31_t)0xFD40565B, (q31_t)0x80078E5E, + (q31_t)0xFDA4D928, (q31_t)0x80058D2E, (q31_t)0xFE095D69, + (q31_t)0x8003DAF0, (q31_t)0xFE6DE2E0, (q31_t)0x800277A5, + (q31_t)0xFED2694F, (q31_t)0x8001634D, (q31_t)0xFF36F078, + (q31_t)0x80009DE9, (q31_t)0xFF9B781D, (q31_t)0x8000277A +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) +/** + @par + Example code for Q31 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefQ31[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefQ31[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 4096, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to Q31(Fixed point 1.31): + round(twiddleCoefQ31(i) * pow(2, 31)) + */ +const q31_t twiddleCoef_4096_q31[6144] = +{ + (q31_t)0x7FFFFFFF, (q31_t)0x00000000, (q31_t)0x7FFFF621, + (q31_t)0x003243F5, (q31_t)0x7FFFD885, (q31_t)0x006487E3, + (q31_t)0x7FFFA72C, (q31_t)0x0096CBC1, (q31_t)0x7FFF6216, + (q31_t)0x00C90F88, (q31_t)0x7FFF0942, (q31_t)0x00FB532F, + (q31_t)0x7FFE9CB2, (q31_t)0x012D96B0, (q31_t)0x7FFE1C64, + (q31_t)0x015FDA03, (q31_t)0x7FFD885A, (q31_t)0x01921D1F, + (q31_t)0x7FFCE093, (q31_t)0x01C45FFE, (q31_t)0x7FFC250F, + (q31_t)0x01F6A296, (q31_t)0x7FFB55CE, (q31_t)0x0228E4E1, + (q31_t)0x7FFA72D1, (q31_t)0x025B26D7, (q31_t)0x7FF97C17, + (q31_t)0x028D6870, (q31_t)0x7FF871A1, (q31_t)0x02BFA9A4, + (q31_t)0x7FF7536F, (q31_t)0x02F1EA6B, (q31_t)0x7FF62182, + (q31_t)0x03242ABF, (q31_t)0x7FF4DBD8, (q31_t)0x03566A96, + (q31_t)0x7FF38273, (q31_t)0x0388A9E9, (q31_t)0x7FF21553, + (q31_t)0x03BAE8B1, (q31_t)0x7FF09477, (q31_t)0x03ED26E6, + (q31_t)0x7FEEFFE1, (q31_t)0x041F647F, (q31_t)0x7FED5790, + (q31_t)0x0451A176, (q31_t)0x7FEB9B85, (q31_t)0x0483DDC3, + (q31_t)0x7FE9CBC0, (q31_t)0x04B6195D, (q31_t)0x7FE7E840, + (q31_t)0x04E8543D, (q31_t)0x7FE5F108, (q31_t)0x051A8E5C, + (q31_t)0x7FE3E616, (q31_t)0x054CC7B0, (q31_t)0x7FE1C76B, + (q31_t)0x057F0034, (q31_t)0x7FDF9508, (q31_t)0x05B137DF, + (q31_t)0x7FDD4EEC, (q31_t)0x05E36EA9, (q31_t)0x7FDAF518, + (q31_t)0x0615A48A, (q31_t)0x7FD8878D, (q31_t)0x0647D97C, + (q31_t)0x7FD6064B, (q31_t)0x067A0D75, (q31_t)0x7FD37152, + (q31_t)0x06AC406F, (q31_t)0x7FD0C8A3, (q31_t)0x06DE7261, + (q31_t)0x7FCE0C3E, (q31_t)0x0710A344, (q31_t)0x7FCB3C23, + (q31_t)0x0742D310, (q31_t)0x7FC85853, (q31_t)0x077501BE, + (q31_t)0x7FC560CF, (q31_t)0x07A72F45, (q31_t)0x7FC25596, + (q31_t)0x07D95B9E, (q31_t)0x7FBF36A9, (q31_t)0x080B86C1, + (q31_t)0x7FBC040A, (q31_t)0x083DB0A7, (q31_t)0x7FB8BDB7, + (q31_t)0x086FD947, (q31_t)0x7FB563B2, (q31_t)0x08A2009A, + (q31_t)0x7FB1F5FC, (q31_t)0x08D42698, (q31_t)0x7FAE7494, + (q31_t)0x09064B3A, (q31_t)0x7FAADF7C, (q31_t)0x09386E77, + (q31_t)0x7FA736B4, (q31_t)0x096A9049, (q31_t)0x7FA37A3C, + (q31_t)0x099CB0A7, (q31_t)0x7F9FAA15, (q31_t)0x09CECF89, + (q31_t)0x7F9BC63F, (q31_t)0x0A00ECE8, (q31_t)0x7F97CEBC, + (q31_t)0x0A3308BC, (q31_t)0x7F93C38C, (q31_t)0x0A6522FE, + (q31_t)0x7F8FA4AF, (q31_t)0x0A973BA5, (q31_t)0x7F8B7226, + (q31_t)0x0AC952AA, (q31_t)0x7F872BF3, (q31_t)0x0AFB6805, + (q31_t)0x7F82D214, (q31_t)0x0B2D7BAE, (q31_t)0x7F7E648B, + (q31_t)0x0B5F8D9F, (q31_t)0x7F79E35A, (q31_t)0x0B919DCE, + (q31_t)0x7F754E7F, (q31_t)0x0BC3AC35, (q31_t)0x7F70A5FD, + (q31_t)0x0BF5B8CB, (q31_t)0x7F6BE9D4, (q31_t)0x0C27C389, + (q31_t)0x7F671A04, (q31_t)0x0C59CC67, (q31_t)0x7F62368F, + (q31_t)0x0C8BD35E, (q31_t)0x7F5D3F75, (q31_t)0x0CBDD865, + (q31_t)0x7F5834B6, (q31_t)0x0CEFDB75, (q31_t)0x7F531654, + (q31_t)0x0D21DC87, (q31_t)0x7F4DE450, (q31_t)0x0D53DB92, + (q31_t)0x7F489EAA, (q31_t)0x0D85D88F, (q31_t)0x7F434563, + (q31_t)0x0DB7D376, (q31_t)0x7F3DD87C, (q31_t)0x0DE9CC3F, + (q31_t)0x7F3857F5, (q31_t)0x0E1BC2E3, (q31_t)0x7F32C3D0, + (q31_t)0x0E4DB75B, (q31_t)0x7F2D1C0E, (q31_t)0x0E7FA99D, + (q31_t)0x7F2760AF, (q31_t)0x0EB199A3, (q31_t)0x7F2191B4, + (q31_t)0x0EE38765, (q31_t)0x7F1BAF1E, (q31_t)0x0F1572DC, + (q31_t)0x7F15B8EE, (q31_t)0x0F475BFE, (q31_t)0x7F0FAF24, + (q31_t)0x0F7942C6, (q31_t)0x7F0991C3, (q31_t)0x0FAB272B, + (q31_t)0x7F0360CB, (q31_t)0x0FDD0925, (q31_t)0x7EFD1C3C, + (q31_t)0x100EE8AD, (q31_t)0x7EF6C418, (q31_t)0x1040C5BB, + (q31_t)0x7EF0585F, (q31_t)0x1072A047, (q31_t)0x7EE9D913, + (q31_t)0x10A4784A, (q31_t)0x7EE34635, (q31_t)0x10D64DBC, + (q31_t)0x7EDC9FC6, (q31_t)0x11082096, (q31_t)0x7ED5E5C6, + (q31_t)0x1139F0CE, (q31_t)0x7ECF1837, (q31_t)0x116BBE5F, + (q31_t)0x7EC8371A, (q31_t)0x119D8940, (q31_t)0x7EC1426F, + (q31_t)0x11CF516A, (q31_t)0x7EBA3A39, (q31_t)0x120116D4, + (q31_t)0x7EB31E77, (q31_t)0x1232D978, (q31_t)0x7EABEF2C, + (q31_t)0x1264994E, (q31_t)0x7EA4AC58, (q31_t)0x1296564D, + (q31_t)0x7E9D55FC, (q31_t)0x12C8106E, (q31_t)0x7E95EC19, + (q31_t)0x12F9C7AA, (q31_t)0x7E8E6EB1, (q31_t)0x132B7BF9, + (q31_t)0x7E86DDC5, (q31_t)0x135D2D53, (q31_t)0x7E7F3956, + (q31_t)0x138EDBB0, (q31_t)0x7E778165, (q31_t)0x13C0870A, + (q31_t)0x7E6FB5F3, (q31_t)0x13F22F57, (q31_t)0x7E67D702, + (q31_t)0x1423D492, (q31_t)0x7E5FE493, (q31_t)0x145576B1, + (q31_t)0x7E57DEA6, (q31_t)0x148715AD, (q31_t)0x7E4FC53E, + (q31_t)0x14B8B17F, (q31_t)0x7E47985B, (q31_t)0x14EA4A1F, + (q31_t)0x7E3F57FE, (q31_t)0x151BDF85, (q31_t)0x7E37042A, + (q31_t)0x154D71AA, (q31_t)0x7E2E9CDF, (q31_t)0x157F0086, + (q31_t)0x7E26221E, (q31_t)0x15B08C11, (q31_t)0x7E1D93E9, + (q31_t)0x15E21444, (q31_t)0x7E14F242, (q31_t)0x16139917, + (q31_t)0x7E0C3D29, (q31_t)0x16451A83, (q31_t)0x7E03749F, + (q31_t)0x1676987F, (q31_t)0x7DFA98A7, (q31_t)0x16A81305, + (q31_t)0x7DF1A942, (q31_t)0x16D98A0C, (q31_t)0x7DE8A670, + (q31_t)0x170AFD8D, (q31_t)0x7DDF9034, (q31_t)0x173C6D80, + (q31_t)0x7DD6668E, (q31_t)0x176DD9DE, (q31_t)0x7DCD2981, + (q31_t)0x179F429F, (q31_t)0x7DC3D90D, (q31_t)0x17D0A7BB, + (q31_t)0x7DBA7534, (q31_t)0x1802092C, (q31_t)0x7DB0FDF7, + (q31_t)0x183366E8, (q31_t)0x7DA77359, (q31_t)0x1864C0E9, + (q31_t)0x7D9DD55A, (q31_t)0x18961727, (q31_t)0x7D9423FB, + (q31_t)0x18C7699B, (q31_t)0x7D8A5F3F, (q31_t)0x18F8B83C, + (q31_t)0x7D808727, (q31_t)0x192A0303, (q31_t)0x7D769BB5, + (q31_t)0x195B49E9, (q31_t)0x7D6C9CE9, (q31_t)0x198C8CE6, + (q31_t)0x7D628AC5, (q31_t)0x19BDCBF2, (q31_t)0x7D58654C, + (q31_t)0x19EF0706, (q31_t)0x7D4E2C7E, (q31_t)0x1A203E1B, + (q31_t)0x7D43E05E, (q31_t)0x1A517127, (q31_t)0x7D3980EC, + (q31_t)0x1A82A025, (q31_t)0x7D2F0E2A, (q31_t)0x1AB3CB0C, + (q31_t)0x7D24881A, (q31_t)0x1AE4F1D6, (q31_t)0x7D19EEBE, + (q31_t)0x1B161479, (q31_t)0x7D0F4218, (q31_t)0x1B4732EF, + (q31_t)0x7D048228, (q31_t)0x1B784D30, (q31_t)0x7CF9AEF0, + (q31_t)0x1BA96334, (q31_t)0x7CEEC873, (q31_t)0x1BDA74F5, + (q31_t)0x7CE3CEB1, (q31_t)0x1C0B826A, (q31_t)0x7CD8C1AD, + (q31_t)0x1C3C8B8C, (q31_t)0x7CCDA168, (q31_t)0x1C6D9053, + (q31_t)0x7CC26DE5, (q31_t)0x1C9E90B8, (q31_t)0x7CB72724, + (q31_t)0x1CCF8CB3, (q31_t)0x7CABCD27, (q31_t)0x1D00843C, + (q31_t)0x7CA05FF1, (q31_t)0x1D31774D, (q31_t)0x7C94DF82, + (q31_t)0x1D6265DD, (q31_t)0x7C894BDD, (q31_t)0x1D934FE5, + (q31_t)0x7C7DA504, (q31_t)0x1DC4355D, (q31_t)0x7C71EAF8, + (q31_t)0x1DF5163F, (q31_t)0x7C661DBB, (q31_t)0x1E25F281, + (q31_t)0x7C5A3D4F, (q31_t)0x1E56CA1E, (q31_t)0x7C4E49B6, + (q31_t)0x1E879D0C, (q31_t)0x7C4242F2, (q31_t)0x1EB86B46, + (q31_t)0x7C362904, (q31_t)0x1EE934C2, (q31_t)0x7C29FBEE, + (q31_t)0x1F19F97B, (q31_t)0x7C1DBBB2, (q31_t)0x1F4AB967, + (q31_t)0x7C116853, (q31_t)0x1F7B7480, (q31_t)0x7C0501D1, + (q31_t)0x1FAC2ABF, (q31_t)0x7BF88830, (q31_t)0x1FDCDC1A, + (q31_t)0x7BEBFB70, (q31_t)0x200D888C, (q31_t)0x7BDF5B94, + (q31_t)0x203E300D, (q31_t)0x7BD2A89E, (q31_t)0x206ED295, + (q31_t)0x7BC5E28F, (q31_t)0x209F701C, (q31_t)0x7BB9096A, + (q31_t)0x20D0089B, (q31_t)0x7BAC1D31, (q31_t)0x21009C0B, + (q31_t)0x7B9F1DE5, (q31_t)0x21312A65, (q31_t)0x7B920B89, + (q31_t)0x2161B39F, (q31_t)0x7B84E61E, (q31_t)0x219237B4, + (q31_t)0x7B77ADA8, (q31_t)0x21C2B69C, (q31_t)0x7B6A6227, + (q31_t)0x21F3304E, (q31_t)0x7B5D039D, (q31_t)0x2223A4C5, + (q31_t)0x7B4F920E, (q31_t)0x225413F8, (q31_t)0x7B420D7A, + (q31_t)0x22847DDF, (q31_t)0x7B3475E4, (q31_t)0x22B4E274, + (q31_t)0x7B26CB4F, (q31_t)0x22E541AE, (q31_t)0x7B190DBB, + (q31_t)0x23159B87, (q31_t)0x7B0B3D2C, (q31_t)0x2345EFF7, + (q31_t)0x7AFD59A3, (q31_t)0x23763EF7, (q31_t)0x7AEF6323, + (q31_t)0x23A6887E, (q31_t)0x7AE159AE, (q31_t)0x23D6CC86, + (q31_t)0x7AD33D45, (q31_t)0x24070B07, (q31_t)0x7AC50DEB, + (q31_t)0x243743FA, (q31_t)0x7AB6CBA3, (q31_t)0x24677757, + (q31_t)0x7AA8766E, (q31_t)0x2497A517, (q31_t)0x7A9A0E4F, + (q31_t)0x24C7CD32, (q31_t)0x7A8B9348, (q31_t)0x24F7EFA1, + (q31_t)0x7A7D055B, (q31_t)0x25280C5D, (q31_t)0x7A6E648A, + (q31_t)0x2558235E, (q31_t)0x7A5FB0D8, (q31_t)0x2588349D, + (q31_t)0x7A50EA46, (q31_t)0x25B84012, (q31_t)0x7A4210D8, + (q31_t)0x25E845B5, (q31_t)0x7A33248F, (q31_t)0x26184581, + (q31_t)0x7A24256E, (q31_t)0x26483F6C, (q31_t)0x7A151377, + (q31_t)0x26783370, (q31_t)0x7A05EEAD, (q31_t)0x26A82185, + (q31_t)0x79F6B711, (q31_t)0x26D809A5, (q31_t)0x79E76CA6, + (q31_t)0x2707EBC6, (q31_t)0x79D80F6F, (q31_t)0x2737C7E3, + (q31_t)0x79C89F6D, (q31_t)0x27679DF4, (q31_t)0x79B91CA4, + (q31_t)0x27976DF1, (q31_t)0x79A98715, (q31_t)0x27C737D2, + (q31_t)0x7999DEC3, (q31_t)0x27F6FB92, (q31_t)0x798A23B1, + (q31_t)0x2826B928, (q31_t)0x797A55E0, (q31_t)0x2856708C, + (q31_t)0x796A7554, (q31_t)0x288621B9, (q31_t)0x795A820E, + (q31_t)0x28B5CCA5, (q31_t)0x794A7C11, (q31_t)0x28E5714A, + (q31_t)0x793A6360, (q31_t)0x29150FA1, (q31_t)0x792A37FE, + (q31_t)0x2944A7A2, (q31_t)0x7919F9EB, (q31_t)0x29743945, + (q31_t)0x7909A92C, (q31_t)0x29A3C484, (q31_t)0x78F945C3, + (q31_t)0x29D34958, (q31_t)0x78E8CFB1, (q31_t)0x2A02C7B8, + (q31_t)0x78D846FB, (q31_t)0x2A323F9D, (q31_t)0x78C7ABA1, + (q31_t)0x2A61B101, (q31_t)0x78B6FDA8, (q31_t)0x2A911BDB, + (q31_t)0x78A63D10, (q31_t)0x2AC08025, (q31_t)0x789569DE, + (q31_t)0x2AEFDDD8, (q31_t)0x78848413, (q31_t)0x2B1F34EB, + (q31_t)0x78738BB3, (q31_t)0x2B4E8558, (q31_t)0x786280BF, + (q31_t)0x2B7DCF17, (q31_t)0x7851633B, (q31_t)0x2BAD1221, + (q31_t)0x78403328, (q31_t)0x2BDC4E6F, (q31_t)0x782EF08B, + (q31_t)0x2C0B83F9, (q31_t)0x781D9B64, (q31_t)0x2C3AB2B9, + (q31_t)0x780C33B8, (q31_t)0x2C69DAA6, (q31_t)0x77FAB988, + (q31_t)0x2C98FBBA, (q31_t)0x77E92CD8, (q31_t)0x2CC815ED, + (q31_t)0x77D78DAA, (q31_t)0x2CF72939, (q31_t)0x77C5DC01, + (q31_t)0x2D263595, (q31_t)0x77B417DF, (q31_t)0x2D553AFB, + (q31_t)0x77A24148, (q31_t)0x2D843963, (q31_t)0x7790583D, + (q31_t)0x2DB330C7, (q31_t)0x777E5CC3, (q31_t)0x2DE2211E, + (q31_t)0x776C4EDB, (q31_t)0x2E110A62, (q31_t)0x775A2E88, + (q31_t)0x2E3FEC8B, (q31_t)0x7747FBCE, (q31_t)0x2E6EC792, + (q31_t)0x7735B6AE, (q31_t)0x2E9D9B70, (q31_t)0x77235F2D, + (q31_t)0x2ECC681E, (q31_t)0x7710F54B, (q31_t)0x2EFB2D94, + (q31_t)0x76FE790E, (q31_t)0x2F29EBCC, (q31_t)0x76EBEA77, + (q31_t)0x2F58A2BD, (q31_t)0x76D94988, (q31_t)0x2F875262, + (q31_t)0x76C69646, (q31_t)0x2FB5FAB2, (q31_t)0x76B3D0B3, + (q31_t)0x2FE49BA6, (q31_t)0x76A0F8D2, (q31_t)0x30133538, + (q31_t)0x768E0EA5, (q31_t)0x3041C760, (q31_t)0x767B1230, + (q31_t)0x30705217, (q31_t)0x76680376, (q31_t)0x309ED555, + (q31_t)0x7654E279, (q31_t)0x30CD5114, (q31_t)0x7641AF3C, + (q31_t)0x30FBC54D, (q31_t)0x762E69C3, (q31_t)0x312A31F8, + (q31_t)0x761B1211, (q31_t)0x3158970D, (q31_t)0x7607A827, + (q31_t)0x3186F487, (q31_t)0x75F42C0A, (q31_t)0x31B54A5D, + (q31_t)0x75E09DBD, (q31_t)0x31E39889, (q31_t)0x75CCFD42, + (q31_t)0x3211DF03, (q31_t)0x75B94A9C, (q31_t)0x32401DC5, + (q31_t)0x75A585CF, (q31_t)0x326E54C7, (q31_t)0x7591AEDD, + (q31_t)0x329C8402, (q31_t)0x757DC5CA, (q31_t)0x32CAAB6F, + (q31_t)0x7569CA98, (q31_t)0x32F8CB07, (q31_t)0x7555BD4B, + (q31_t)0x3326E2C2, (q31_t)0x75419DE6, (q31_t)0x3354F29A, + (q31_t)0x752D6C6C, (q31_t)0x3382FA88, (q31_t)0x751928E0, + (q31_t)0x33B0FA84, (q31_t)0x7504D345, (q31_t)0x33DEF287, + (q31_t)0x74F06B9E, (q31_t)0x340CE28A, (q31_t)0x74DBF1EF, + (q31_t)0x343ACA87, (q31_t)0x74C7663A, (q31_t)0x3468AA76, + (q31_t)0x74B2C883, (q31_t)0x3496824F, (q31_t)0x749E18CD, + (q31_t)0x34C4520D, (q31_t)0x7489571B, (q31_t)0x34F219A7, + (q31_t)0x74748371, (q31_t)0x351FD917, (q31_t)0x745F9DD1, + (q31_t)0x354D9056, (q31_t)0x744AA63E, (q31_t)0x357B3F5D, + (q31_t)0x74359CBD, (q31_t)0x35A8E624, (q31_t)0x74208150, + (q31_t)0x35D684A5, (q31_t)0x740B53FA, (q31_t)0x36041AD9, + (q31_t)0x73F614C0, (q31_t)0x3631A8B7, (q31_t)0x73E0C3A3, + (q31_t)0x365F2E3B, (q31_t)0x73CB60A7, (q31_t)0x368CAB5C, + (q31_t)0x73B5EBD0, (q31_t)0x36BA2013, (q31_t)0x73A06522, + (q31_t)0x36E78C5A, (q31_t)0x738ACC9E, (q31_t)0x3714F02A, + (q31_t)0x73752249, (q31_t)0x37424B7A, (q31_t)0x735F6626, + (q31_t)0x376F9E46, (q31_t)0x73499838, (q31_t)0x379CE884, + (q31_t)0x7333B883, (q31_t)0x37CA2A30, (q31_t)0x731DC709, + (q31_t)0x37F76340, (q31_t)0x7307C3D0, (q31_t)0x382493B0, + (q31_t)0x72F1AED8, (q31_t)0x3851BB76, (q31_t)0x72DB8828, + (q31_t)0x387EDA8E, (q31_t)0x72C54FC0, (q31_t)0x38ABF0EF, + (q31_t)0x72AF05A6, (q31_t)0x38D8FE93, (q31_t)0x7298A9DC, + (q31_t)0x39060372, (q31_t)0x72823C66, (q31_t)0x3932FF87, + (q31_t)0x726BBD48, (q31_t)0x395FF2C9, (q31_t)0x72552C84, + (q31_t)0x398CDD32, (q31_t)0x723E8A1F, (q31_t)0x39B9BEBB, + (q31_t)0x7227D61C, (q31_t)0x39E6975D, (q31_t)0x7211107D, + (q31_t)0x3A136712, (q31_t)0x71FA3948, (q31_t)0x3A402DD1, + (q31_t)0x71E3507F, (q31_t)0x3A6CEB95, (q31_t)0x71CC5626, + (q31_t)0x3A99A057, (q31_t)0x71B54A40, (q31_t)0x3AC64C0F, + (q31_t)0x719E2CD2, (q31_t)0x3AF2EEB7, (q31_t)0x7186FDDE, + (q31_t)0x3B1F8847, (q31_t)0x716FBD68, (q31_t)0x3B4C18BA, + (q31_t)0x71586B73, (q31_t)0x3B78A007, (q31_t)0x71410804, + (q31_t)0x3BA51E29, (q31_t)0x7129931E, (q31_t)0x3BD19317, + (q31_t)0x71120CC5, (q31_t)0x3BFDFECD, (q31_t)0x70FA74FB, + (q31_t)0x3C2A6142, (q31_t)0x70E2CBC6, (q31_t)0x3C56BA70, + (q31_t)0x70CB1127, (q31_t)0x3C830A4F, (q31_t)0x70B34524, + (q31_t)0x3CAF50DA, (q31_t)0x709B67C0, (q31_t)0x3CDB8E09, + (q31_t)0x708378FE, (q31_t)0x3D07C1D5, (q31_t)0x706B78E3, + (q31_t)0x3D33EC39, (q31_t)0x70536771, (q31_t)0x3D600D2B, + (q31_t)0x703B44AC, (q31_t)0x3D8C24A7, (q31_t)0x70231099, + (q31_t)0x3DB832A5, (q31_t)0x700ACB3B, (q31_t)0x3DE4371F, + (q31_t)0x6FF27496, (q31_t)0x3E10320D, (q31_t)0x6FDA0CAD, + (q31_t)0x3E3C2369, (q31_t)0x6FC19385, (q31_t)0x3E680B2C, + (q31_t)0x6FA90920, (q31_t)0x3E93E94F, (q31_t)0x6F906D84, + (q31_t)0x3EBFBDCC, (q31_t)0x6F77C0B3, (q31_t)0x3EEB889C, + (q31_t)0x6F5F02B1, (q31_t)0x3F1749B7, (q31_t)0x6F463383, + (q31_t)0x3F430118, (q31_t)0x6F2D532C, (q31_t)0x3F6EAEB8, + (q31_t)0x6F1461AF, (q31_t)0x3F9A528F, (q31_t)0x6EFB5F12, + (q31_t)0x3FC5EC97, (q31_t)0x6EE24B57, (q31_t)0x3FF17CCA, + (q31_t)0x6EC92682, (q31_t)0x401D0320, (q31_t)0x6EAFF098, + (q31_t)0x40487F93, (q31_t)0x6E96A99C, (q31_t)0x4073F21D, + (q31_t)0x6E7D5193, (q31_t)0x409F5AB6, (q31_t)0x6E63E87F, + (q31_t)0x40CAB957, (q31_t)0x6E4A6E65, (q31_t)0x40F60DFB, + (q31_t)0x6E30E349, (q31_t)0x4121589A, (q31_t)0x6E17472F, + (q31_t)0x414C992E, (q31_t)0x6DFD9A1B, (q31_t)0x4177CFB0, + (q31_t)0x6DE3DC11, (q31_t)0x41A2FC1A, (q31_t)0x6DCA0D14, + (q31_t)0x41CE1E64, (q31_t)0x6DB02D29, (q31_t)0x41F93688, + (q31_t)0x6D963C54, (q31_t)0x42244480, (q31_t)0x6D7C3A98, + (q31_t)0x424F4845, (q31_t)0x6D6227FA, (q31_t)0x427A41D0, + (q31_t)0x6D48047E, (q31_t)0x42A5311A, (q31_t)0x6D2DD027, + (q31_t)0x42D0161E, (q31_t)0x6D138AFA, (q31_t)0x42FAF0D4, + (q31_t)0x6CF934FB, (q31_t)0x4325C135, (q31_t)0x6CDECE2E, + (q31_t)0x4350873C, (q31_t)0x6CC45697, (q31_t)0x437B42E1, + (q31_t)0x6CA9CE3A, (q31_t)0x43A5F41E, (q31_t)0x6C8F351C, + (q31_t)0x43D09AEC, (q31_t)0x6C748B3F, (q31_t)0x43FB3745, + (q31_t)0x6C59D0A9, (q31_t)0x4425C923, (q31_t)0x6C3F055D, + (q31_t)0x4450507E, (q31_t)0x6C242960, (q31_t)0x447ACD50, + (q31_t)0x6C093CB6, (q31_t)0x44A53F93, (q31_t)0x6BEE3F62, + (q31_t)0x44CFA73F, (q31_t)0x6BD3316A, (q31_t)0x44FA044F, + (q31_t)0x6BB812D0, (q31_t)0x452456BC, (q31_t)0x6B9CE39B, + (q31_t)0x454E9E80, (q31_t)0x6B81A3CD, (q31_t)0x4578DB93, + (q31_t)0x6B66536A, (q31_t)0x45A30DF0, (q31_t)0x6B4AF278, + (q31_t)0x45CD358F, (q31_t)0x6B2F80FA, (q31_t)0x45F7526B, + (q31_t)0x6B13FEF5, (q31_t)0x4621647C, (q31_t)0x6AF86C6C, + (q31_t)0x464B6BBD, (q31_t)0x6ADCC964, (q31_t)0x46756827, + (q31_t)0x6AC115E1, (q31_t)0x469F59B4, (q31_t)0x6AA551E8, + (q31_t)0x46C9405C, (q31_t)0x6A897D7D, (q31_t)0x46F31C1A, + (q31_t)0x6A6D98A4, (q31_t)0x471CECE6, (q31_t)0x6A51A361, + (q31_t)0x4746B2BC, (q31_t)0x6A359DB9, (q31_t)0x47706D93, + (q31_t)0x6A1987B0, (q31_t)0x479A1D66, (q31_t)0x69FD614A, + (q31_t)0x47C3C22E, (q31_t)0x69E12A8C, (q31_t)0x47ED5BE6, + (q31_t)0x69C4E37A, (q31_t)0x4816EA85, (q31_t)0x69A88C18, + (q31_t)0x48406E07, (q31_t)0x698C246C, (q31_t)0x4869E664, + (q31_t)0x696FAC78, (q31_t)0x48935397, (q31_t)0x69532442, + (q31_t)0x48BCB598, (q31_t)0x69368BCE, (q31_t)0x48E60C62, + (q31_t)0x6919E320, (q31_t)0x490F57EE, (q31_t)0x68FD2A3D, + (q31_t)0x49389836, (q31_t)0x68E06129, (q31_t)0x4961CD32, + (q31_t)0x68C387E9, (q31_t)0x498AF6DE, (q31_t)0x68A69E81, + (q31_t)0x49B41533, (q31_t)0x6889A4F5, (q31_t)0x49DD282A, + (q31_t)0x686C9B4B, (q31_t)0x4A062FBD, (q31_t)0x684F8186, + (q31_t)0x4A2F2BE5, (q31_t)0x683257AA, (q31_t)0x4A581C9D, + (q31_t)0x68151DBE, (q31_t)0x4A8101DE, (q31_t)0x67F7D3C4, + (q31_t)0x4AA9DBA1, (q31_t)0x67DA79C2, (q31_t)0x4AD2A9E1, + (q31_t)0x67BD0FBC, (q31_t)0x4AFB6C97, (q31_t)0x679F95B7, + (q31_t)0x4B2423BD, (q31_t)0x67820BB6, (q31_t)0x4B4CCF4D, + (q31_t)0x676471C0, (q31_t)0x4B756F3F, (q31_t)0x6746C7D7, + (q31_t)0x4B9E038F, (q31_t)0x67290E02, (q31_t)0x4BC68C36, + (q31_t)0x670B4443, (q31_t)0x4BEF092D, (q31_t)0x66ED6AA1, + (q31_t)0x4C177A6E, (q31_t)0x66CF811F, (q31_t)0x4C3FDFF3, + (q31_t)0x66B187C3, (q31_t)0x4C6839B6, (q31_t)0x66937E90, + (q31_t)0x4C9087B1, (q31_t)0x6675658C, (q31_t)0x4CB8C9DD, + (q31_t)0x66573CBB, (q31_t)0x4CE10034, (q31_t)0x66390422, + (q31_t)0x4D092AB0, (q31_t)0x661ABBC5, (q31_t)0x4D31494B, + (q31_t)0x65FC63A9, (q31_t)0x4D595BFE, (q31_t)0x65DDFBD3, + (q31_t)0x4D8162C4, (q31_t)0x65BF8447, (q31_t)0x4DA95D96, + (q31_t)0x65A0FD0B, (q31_t)0x4DD14C6E, (q31_t)0x65826622, + (q31_t)0x4DF92F45, (q31_t)0x6563BF92, (q31_t)0x4E210617, + (q31_t)0x6545095F, (q31_t)0x4E48D0DC, (q31_t)0x6526438E, + (q31_t)0x4E708F8F, (q31_t)0x65076E24, (q31_t)0x4E984229, + (q31_t)0x64E88926, (q31_t)0x4EBFE8A4, (q31_t)0x64C99498, + (q31_t)0x4EE782FA, (q31_t)0x64AA907F, (q31_t)0x4F0F1126, + (q31_t)0x648B7CDF, (q31_t)0x4F369320, (q31_t)0x646C59BF, + (q31_t)0x4F5E08E3, (q31_t)0x644D2722, (q31_t)0x4F857268, + (q31_t)0x642DE50D, (q31_t)0x4FACCFAB, (q31_t)0x640E9385, + (q31_t)0x4FD420A3, (q31_t)0x63EF328F, (q31_t)0x4FFB654D, + (q31_t)0x63CFC230, (q31_t)0x50229DA0, (q31_t)0x63B0426D, + (q31_t)0x5049C999, (q31_t)0x6390B34A, (q31_t)0x5070E92F, + (q31_t)0x637114CC, (q31_t)0x5097FC5E, (q31_t)0x635166F8, + (q31_t)0x50BF031F, (q31_t)0x6331A9D4, (q31_t)0x50E5FD6C, + (q31_t)0x6311DD63, (q31_t)0x510CEB40, (q31_t)0x62F201AC, + (q31_t)0x5133CC94, (q31_t)0x62D216B2, (q31_t)0x515AA162, + (q31_t)0x62B21C7B, (q31_t)0x518169A4, (q31_t)0x6292130C, + (q31_t)0x51A82555, (q31_t)0x6271FA69, (q31_t)0x51CED46E, + (q31_t)0x6251D297, (q31_t)0x51F576E9, (q31_t)0x62319B9D, + (q31_t)0x521C0CC1, (q31_t)0x6211557D, (q31_t)0x524295EF, + (q31_t)0x61F1003E, (q31_t)0x5269126E, (q31_t)0x61D09BE5, + (q31_t)0x528F8237, (q31_t)0x61B02876, (q31_t)0x52B5E545, + (q31_t)0x618FA5F6, (q31_t)0x52DC3B92, (q31_t)0x616F146B, + (q31_t)0x53028517, (q31_t)0x614E73D9, (q31_t)0x5328C1D0, + (q31_t)0x612DC446, (q31_t)0x534EF1B5, (q31_t)0x610D05B7, + (q31_t)0x537514C1, (q31_t)0x60EC3830, (q31_t)0x539B2AEF, + (q31_t)0x60CB5BB6, (q31_t)0x53C13438, (q31_t)0x60AA704F, + (q31_t)0x53E73097, (q31_t)0x60897600, (q31_t)0x540D2005, + (q31_t)0x60686CCE, (q31_t)0x5433027D, (q31_t)0x604754BE, + (q31_t)0x5458D7F9, (q31_t)0x60262DD5, (q31_t)0x547EA073, + (q31_t)0x6004F818, (q31_t)0x54A45BE5, (q31_t)0x5FE3B38D, + (q31_t)0x54CA0A4A, (q31_t)0x5FC26038, (q31_t)0x54EFAB9C, + (q31_t)0x5FA0FE1E, (q31_t)0x55153FD4, (q31_t)0x5F7F8D46, + (q31_t)0x553AC6ED, (q31_t)0x5F5E0DB3, (q31_t)0x556040E2, + (q31_t)0x5F3C7F6B, (q31_t)0x5585ADAC, (q31_t)0x5F1AE273, + (q31_t)0x55AB0D46, (q31_t)0x5EF936D1, (q31_t)0x55D05FAA, + (q31_t)0x5ED77C89, (q31_t)0x55F5A4D2, (q31_t)0x5EB5B3A1, + (q31_t)0x561ADCB8, (q31_t)0x5E93DC1F, (q31_t)0x56400757, + (q31_t)0x5E71F606, (q31_t)0x566524AA, (q31_t)0x5E50015D, + (q31_t)0x568A34A9, (q31_t)0x5E2DFE28, (q31_t)0x56AF3750, + (q31_t)0x5E0BEC6E, (q31_t)0x56D42C99, (q31_t)0x5DE9CC32, + (q31_t)0x56F9147E, (q31_t)0x5DC79D7C, (q31_t)0x571DEEF9, + (q31_t)0x5DA5604E, (q31_t)0x5742BC05, (q31_t)0x5D8314B0, + (q31_t)0x57677B9D, (q31_t)0x5D60BAA6, (q31_t)0x578C2DB9, + (q31_t)0x5D3E5236, (q31_t)0x57B0D256, (q31_t)0x5D1BDB65, + (q31_t)0x57D5696C, (q31_t)0x5CF95638, (q31_t)0x57F9F2F7, + (q31_t)0x5CD6C2B4, (q31_t)0x581E6EF1, (q31_t)0x5CB420DF, + (q31_t)0x5842DD54, (q31_t)0x5C9170BF, (q31_t)0x58673E1B, + (q31_t)0x5C6EB258, (q31_t)0x588B913F, (q31_t)0x5C4BE5B0, + (q31_t)0x58AFD6BC, (q31_t)0x5C290ACC, (q31_t)0x58D40E8C, + (q31_t)0x5C0621B2, (q31_t)0x58F838A9, (q31_t)0x5BE32A67, + (q31_t)0x591C550E, (q31_t)0x5BC024F0, (q31_t)0x594063B4, + (q31_t)0x5B9D1153, (q31_t)0x59646497, (q31_t)0x5B79EF96, + (q31_t)0x598857B1, (q31_t)0x5B56BFBD, (q31_t)0x59AC3CFD, + (q31_t)0x5B3381CE, (q31_t)0x59D01474, (q31_t)0x5B1035CF, + (q31_t)0x59F3DE12, (q31_t)0x5AECDBC4, (q31_t)0x5A1799D0, + (q31_t)0x5AC973B4, (q31_t)0x5A3B47AA, (q31_t)0x5AA5FDA4, + (q31_t)0x5A5EE79A, (q31_t)0x5A82799A, (q31_t)0x5A82799A, + (q31_t)0x5A5EE79A, (q31_t)0x5AA5FDA4, (q31_t)0x5A3B47AA, + (q31_t)0x5AC973B4, (q31_t)0x5A1799D0, (q31_t)0x5AECDBC4, + (q31_t)0x59F3DE12, (q31_t)0x5B1035CF, (q31_t)0x59D01474, + (q31_t)0x5B3381CE, (q31_t)0x59AC3CFD, (q31_t)0x5B56BFBD, + (q31_t)0x598857B1, (q31_t)0x5B79EF96, (q31_t)0x59646497, + (q31_t)0x5B9D1153, (q31_t)0x594063B4, (q31_t)0x5BC024F0, + (q31_t)0x591C550E, (q31_t)0x5BE32A67, (q31_t)0x58F838A9, + (q31_t)0x5C0621B2, (q31_t)0x58D40E8C, (q31_t)0x5C290ACC, + (q31_t)0x58AFD6BC, (q31_t)0x5C4BE5B0, (q31_t)0x588B913F, + (q31_t)0x5C6EB258, (q31_t)0x58673E1B, (q31_t)0x5C9170BF, + (q31_t)0x5842DD54, (q31_t)0x5CB420DF, (q31_t)0x581E6EF1, + (q31_t)0x5CD6C2B4, (q31_t)0x57F9F2F7, (q31_t)0x5CF95638, + (q31_t)0x57D5696C, (q31_t)0x5D1BDB65, (q31_t)0x57B0D256, + (q31_t)0x5D3E5236, (q31_t)0x578C2DB9, (q31_t)0x5D60BAA6, + (q31_t)0x57677B9D, (q31_t)0x5D8314B0, (q31_t)0x5742BC05, + (q31_t)0x5DA5604E, (q31_t)0x571DEEF9, (q31_t)0x5DC79D7C, + (q31_t)0x56F9147E, (q31_t)0x5DE9CC32, (q31_t)0x56D42C99, + (q31_t)0x5E0BEC6E, (q31_t)0x56AF3750, (q31_t)0x5E2DFE28, + (q31_t)0x568A34A9, (q31_t)0x5E50015D, (q31_t)0x566524AA, + (q31_t)0x5E71F606, (q31_t)0x56400757, (q31_t)0x5E93DC1F, + (q31_t)0x561ADCB8, (q31_t)0x5EB5B3A1, (q31_t)0x55F5A4D2, + (q31_t)0x5ED77C89, (q31_t)0x55D05FAA, (q31_t)0x5EF936D1, + (q31_t)0x55AB0D46, (q31_t)0x5F1AE273, (q31_t)0x5585ADAC, + (q31_t)0x5F3C7F6B, (q31_t)0x556040E2, (q31_t)0x5F5E0DB3, + (q31_t)0x553AC6ED, (q31_t)0x5F7F8D46, (q31_t)0x55153FD4, + (q31_t)0x5FA0FE1E, (q31_t)0x54EFAB9C, (q31_t)0x5FC26038, + (q31_t)0x54CA0A4A, (q31_t)0x5FE3B38D, (q31_t)0x54A45BE5, + (q31_t)0x6004F818, (q31_t)0x547EA073, (q31_t)0x60262DD5, + (q31_t)0x5458D7F9, (q31_t)0x604754BE, (q31_t)0x5433027D, + (q31_t)0x60686CCE, (q31_t)0x540D2005, (q31_t)0x60897600, + (q31_t)0x53E73097, (q31_t)0x60AA704F, (q31_t)0x53C13438, + (q31_t)0x60CB5BB6, (q31_t)0x539B2AEF, (q31_t)0x60EC3830, + (q31_t)0x537514C1, (q31_t)0x610D05B7, (q31_t)0x534EF1B5, + (q31_t)0x612DC446, (q31_t)0x5328C1D0, (q31_t)0x614E73D9, + (q31_t)0x53028517, (q31_t)0x616F146B, (q31_t)0x52DC3B92, + (q31_t)0x618FA5F6, (q31_t)0x52B5E545, (q31_t)0x61B02876, + (q31_t)0x528F8237, (q31_t)0x61D09BE5, (q31_t)0x5269126E, + (q31_t)0x61F1003E, (q31_t)0x524295EF, (q31_t)0x6211557D, + (q31_t)0x521C0CC1, (q31_t)0x62319B9D, (q31_t)0x51F576E9, + (q31_t)0x6251D297, (q31_t)0x51CED46E, (q31_t)0x6271FA69, + (q31_t)0x51A82555, (q31_t)0x6292130C, (q31_t)0x518169A4, + (q31_t)0x62B21C7B, (q31_t)0x515AA162, (q31_t)0x62D216B2, + (q31_t)0x5133CC94, (q31_t)0x62F201AC, (q31_t)0x510CEB40, + (q31_t)0x6311DD63, (q31_t)0x50E5FD6C, (q31_t)0x6331A9D4, + (q31_t)0x50BF031F, (q31_t)0x635166F8, (q31_t)0x5097FC5E, + (q31_t)0x637114CC, (q31_t)0x5070E92F, (q31_t)0x6390B34A, + (q31_t)0x5049C999, (q31_t)0x63B0426D, (q31_t)0x50229DA0, + (q31_t)0x63CFC230, (q31_t)0x4FFB654D, (q31_t)0x63EF328F, + (q31_t)0x4FD420A3, (q31_t)0x640E9385, (q31_t)0x4FACCFAB, + (q31_t)0x642DE50D, (q31_t)0x4F857268, (q31_t)0x644D2722, + (q31_t)0x4F5E08E3, (q31_t)0x646C59BF, (q31_t)0x4F369320, + (q31_t)0x648B7CDF, (q31_t)0x4F0F1126, (q31_t)0x64AA907F, + (q31_t)0x4EE782FA, (q31_t)0x64C99498, (q31_t)0x4EBFE8A4, + (q31_t)0x64E88926, (q31_t)0x4E984229, (q31_t)0x65076E24, + (q31_t)0x4E708F8F, (q31_t)0x6526438E, (q31_t)0x4E48D0DC, + (q31_t)0x6545095F, (q31_t)0x4E210617, (q31_t)0x6563BF92, + (q31_t)0x4DF92F45, (q31_t)0x65826622, (q31_t)0x4DD14C6E, + (q31_t)0x65A0FD0B, (q31_t)0x4DA95D96, (q31_t)0x65BF8447, + (q31_t)0x4D8162C4, (q31_t)0x65DDFBD3, (q31_t)0x4D595BFE, + (q31_t)0x65FC63A9, (q31_t)0x4D31494B, (q31_t)0x661ABBC5, + (q31_t)0x4D092AB0, (q31_t)0x66390422, (q31_t)0x4CE10034, + (q31_t)0x66573CBB, (q31_t)0x4CB8C9DD, (q31_t)0x6675658C, + (q31_t)0x4C9087B1, (q31_t)0x66937E90, (q31_t)0x4C6839B6, + (q31_t)0x66B187C3, (q31_t)0x4C3FDFF3, (q31_t)0x66CF811F, + (q31_t)0x4C177A6E, (q31_t)0x66ED6AA1, (q31_t)0x4BEF092D, + (q31_t)0x670B4443, (q31_t)0x4BC68C36, (q31_t)0x67290E02, + (q31_t)0x4B9E038F, (q31_t)0x6746C7D7, (q31_t)0x4B756F3F, + (q31_t)0x676471C0, (q31_t)0x4B4CCF4D, (q31_t)0x67820BB6, + (q31_t)0x4B2423BD, (q31_t)0x679F95B7, (q31_t)0x4AFB6C97, + (q31_t)0x67BD0FBC, (q31_t)0x4AD2A9E1, (q31_t)0x67DA79C2, + (q31_t)0x4AA9DBA1, (q31_t)0x67F7D3C4, (q31_t)0x4A8101DE, + (q31_t)0x68151DBE, (q31_t)0x4A581C9D, (q31_t)0x683257AA, + (q31_t)0x4A2F2BE5, (q31_t)0x684F8186, (q31_t)0x4A062FBD, + (q31_t)0x686C9B4B, (q31_t)0x49DD282A, (q31_t)0x6889A4F5, + (q31_t)0x49B41533, (q31_t)0x68A69E81, (q31_t)0x498AF6DE, + (q31_t)0x68C387E9, (q31_t)0x4961CD32, (q31_t)0x68E06129, + (q31_t)0x49389836, (q31_t)0x68FD2A3D, (q31_t)0x490F57EE, + (q31_t)0x6919E320, (q31_t)0x48E60C62, (q31_t)0x69368BCE, + (q31_t)0x48BCB598, (q31_t)0x69532442, (q31_t)0x48935397, + (q31_t)0x696FAC78, (q31_t)0x4869E664, (q31_t)0x698C246C, + (q31_t)0x48406E07, (q31_t)0x69A88C18, (q31_t)0x4816EA85, + (q31_t)0x69C4E37A, (q31_t)0x47ED5BE6, (q31_t)0x69E12A8C, + (q31_t)0x47C3C22E, (q31_t)0x69FD614A, (q31_t)0x479A1D66, + (q31_t)0x6A1987B0, (q31_t)0x47706D93, (q31_t)0x6A359DB9, + (q31_t)0x4746B2BC, (q31_t)0x6A51A361, (q31_t)0x471CECE6, + (q31_t)0x6A6D98A4, (q31_t)0x46F31C1A, (q31_t)0x6A897D7D, + (q31_t)0x46C9405C, (q31_t)0x6AA551E8, (q31_t)0x469F59B4, + (q31_t)0x6AC115E1, (q31_t)0x46756827, (q31_t)0x6ADCC964, + (q31_t)0x464B6BBD, (q31_t)0x6AF86C6C, (q31_t)0x4621647C, + (q31_t)0x6B13FEF5, (q31_t)0x45F7526B, (q31_t)0x6B2F80FA, + (q31_t)0x45CD358F, (q31_t)0x6B4AF278, (q31_t)0x45A30DF0, + (q31_t)0x6B66536A, (q31_t)0x4578DB93, (q31_t)0x6B81A3CD, + (q31_t)0x454E9E80, (q31_t)0x6B9CE39B, (q31_t)0x452456BC, + (q31_t)0x6BB812D0, (q31_t)0x44FA044F, (q31_t)0x6BD3316A, + (q31_t)0x44CFA73F, (q31_t)0x6BEE3F62, (q31_t)0x44A53F93, + (q31_t)0x6C093CB6, (q31_t)0x447ACD50, (q31_t)0x6C242960, + (q31_t)0x4450507E, (q31_t)0x6C3F055D, (q31_t)0x4425C923, + (q31_t)0x6C59D0A9, (q31_t)0x43FB3745, (q31_t)0x6C748B3F, + (q31_t)0x43D09AEC, (q31_t)0x6C8F351C, (q31_t)0x43A5F41E, + (q31_t)0x6CA9CE3A, (q31_t)0x437B42E1, (q31_t)0x6CC45697, + (q31_t)0x4350873C, (q31_t)0x6CDECE2E, (q31_t)0x4325C135, + (q31_t)0x6CF934FB, (q31_t)0x42FAF0D4, (q31_t)0x6D138AFA, + (q31_t)0x42D0161E, (q31_t)0x6D2DD027, (q31_t)0x42A5311A, + (q31_t)0x6D48047E, (q31_t)0x427A41D0, (q31_t)0x6D6227FA, + (q31_t)0x424F4845, (q31_t)0x6D7C3A98, (q31_t)0x42244480, + (q31_t)0x6D963C54, (q31_t)0x41F93688, (q31_t)0x6DB02D29, + (q31_t)0x41CE1E64, (q31_t)0x6DCA0D14, (q31_t)0x41A2FC1A, + (q31_t)0x6DE3DC11, (q31_t)0x4177CFB0, (q31_t)0x6DFD9A1B, + (q31_t)0x414C992E, (q31_t)0x6E17472F, (q31_t)0x4121589A, + (q31_t)0x6E30E349, (q31_t)0x40F60DFB, (q31_t)0x6E4A6E65, + (q31_t)0x40CAB957, (q31_t)0x6E63E87F, (q31_t)0x409F5AB6, + (q31_t)0x6E7D5193, (q31_t)0x4073F21D, (q31_t)0x6E96A99C, + (q31_t)0x40487F93, (q31_t)0x6EAFF098, (q31_t)0x401D0320, + (q31_t)0x6EC92682, (q31_t)0x3FF17CCA, (q31_t)0x6EE24B57, + (q31_t)0x3FC5EC97, (q31_t)0x6EFB5F12, (q31_t)0x3F9A528F, + (q31_t)0x6F1461AF, (q31_t)0x3F6EAEB8, (q31_t)0x6F2D532C, + (q31_t)0x3F430118, (q31_t)0x6F463383, (q31_t)0x3F1749B7, + (q31_t)0x6F5F02B1, (q31_t)0x3EEB889C, (q31_t)0x6F77C0B3, + (q31_t)0x3EBFBDCC, (q31_t)0x6F906D84, (q31_t)0x3E93E94F, + (q31_t)0x6FA90920, (q31_t)0x3E680B2C, (q31_t)0x6FC19385, + (q31_t)0x3E3C2369, (q31_t)0x6FDA0CAD, (q31_t)0x3E10320D, + (q31_t)0x6FF27496, (q31_t)0x3DE4371F, (q31_t)0x700ACB3B, + (q31_t)0x3DB832A5, (q31_t)0x70231099, (q31_t)0x3D8C24A7, + (q31_t)0x703B44AC, (q31_t)0x3D600D2B, (q31_t)0x70536771, + (q31_t)0x3D33EC39, (q31_t)0x706B78E3, (q31_t)0x3D07C1D5, + (q31_t)0x708378FE, (q31_t)0x3CDB8E09, (q31_t)0x709B67C0, + (q31_t)0x3CAF50DA, (q31_t)0x70B34524, (q31_t)0x3C830A4F, + (q31_t)0x70CB1127, (q31_t)0x3C56BA70, (q31_t)0x70E2CBC6, + (q31_t)0x3C2A6142, (q31_t)0x70FA74FB, (q31_t)0x3BFDFECD, + (q31_t)0x71120CC5, (q31_t)0x3BD19317, (q31_t)0x7129931E, + (q31_t)0x3BA51E29, (q31_t)0x71410804, (q31_t)0x3B78A007, + (q31_t)0x71586B73, (q31_t)0x3B4C18BA, (q31_t)0x716FBD68, + (q31_t)0x3B1F8847, (q31_t)0x7186FDDE, (q31_t)0x3AF2EEB7, + (q31_t)0x719E2CD2, (q31_t)0x3AC64C0F, (q31_t)0x71B54A40, + (q31_t)0x3A99A057, (q31_t)0x71CC5626, (q31_t)0x3A6CEB95, + (q31_t)0x71E3507F, (q31_t)0x3A402DD1, (q31_t)0x71FA3948, + (q31_t)0x3A136712, (q31_t)0x7211107D, (q31_t)0x39E6975D, + (q31_t)0x7227D61C, (q31_t)0x39B9BEBB, (q31_t)0x723E8A1F, + (q31_t)0x398CDD32, (q31_t)0x72552C84, (q31_t)0x395FF2C9, + (q31_t)0x726BBD48, (q31_t)0x3932FF87, (q31_t)0x72823C66, + (q31_t)0x39060372, (q31_t)0x7298A9DC, (q31_t)0x38D8FE93, + (q31_t)0x72AF05A6, (q31_t)0x38ABF0EF, (q31_t)0x72C54FC0, + (q31_t)0x387EDA8E, (q31_t)0x72DB8828, (q31_t)0x3851BB76, + (q31_t)0x72F1AED8, (q31_t)0x382493B0, (q31_t)0x7307C3D0, + (q31_t)0x37F76340, (q31_t)0x731DC709, (q31_t)0x37CA2A30, + (q31_t)0x7333B883, (q31_t)0x379CE884, (q31_t)0x73499838, + (q31_t)0x376F9E46, (q31_t)0x735F6626, (q31_t)0x37424B7A, + (q31_t)0x73752249, (q31_t)0x3714F02A, (q31_t)0x738ACC9E, + (q31_t)0x36E78C5A, (q31_t)0x73A06522, (q31_t)0x36BA2013, + (q31_t)0x73B5EBD0, (q31_t)0x368CAB5C, (q31_t)0x73CB60A7, + (q31_t)0x365F2E3B, (q31_t)0x73E0C3A3, (q31_t)0x3631A8B7, + (q31_t)0x73F614C0, (q31_t)0x36041AD9, (q31_t)0x740B53FA, + (q31_t)0x35D684A5, (q31_t)0x74208150, (q31_t)0x35A8E624, + (q31_t)0x74359CBD, (q31_t)0x357B3F5D, (q31_t)0x744AA63E, + (q31_t)0x354D9056, (q31_t)0x745F9DD1, (q31_t)0x351FD917, + (q31_t)0x74748371, (q31_t)0x34F219A7, (q31_t)0x7489571B, + (q31_t)0x34C4520D, (q31_t)0x749E18CD, (q31_t)0x3496824F, + (q31_t)0x74B2C883, (q31_t)0x3468AA76, (q31_t)0x74C7663A, + (q31_t)0x343ACA87, (q31_t)0x74DBF1EF, (q31_t)0x340CE28A, + (q31_t)0x74F06B9E, (q31_t)0x33DEF287, (q31_t)0x7504D345, + (q31_t)0x33B0FA84, (q31_t)0x751928E0, (q31_t)0x3382FA88, + (q31_t)0x752D6C6C, (q31_t)0x3354F29A, (q31_t)0x75419DE6, + (q31_t)0x3326E2C2, (q31_t)0x7555BD4B, (q31_t)0x32F8CB07, + (q31_t)0x7569CA98, (q31_t)0x32CAAB6F, (q31_t)0x757DC5CA, + (q31_t)0x329C8402, (q31_t)0x7591AEDD, (q31_t)0x326E54C7, + (q31_t)0x75A585CF, (q31_t)0x32401DC5, (q31_t)0x75B94A9C, + (q31_t)0x3211DF03, (q31_t)0x75CCFD42, (q31_t)0x31E39889, + (q31_t)0x75E09DBD, (q31_t)0x31B54A5D, (q31_t)0x75F42C0A, + (q31_t)0x3186F487, (q31_t)0x7607A827, (q31_t)0x3158970D, + (q31_t)0x761B1211, (q31_t)0x312A31F8, (q31_t)0x762E69C3, + (q31_t)0x30FBC54D, (q31_t)0x7641AF3C, (q31_t)0x30CD5114, + (q31_t)0x7654E279, (q31_t)0x309ED555, (q31_t)0x76680376, + (q31_t)0x30705217, (q31_t)0x767B1230, (q31_t)0x3041C760, + (q31_t)0x768E0EA5, (q31_t)0x30133538, (q31_t)0x76A0F8D2, + (q31_t)0x2FE49BA6, (q31_t)0x76B3D0B3, (q31_t)0x2FB5FAB2, + (q31_t)0x76C69646, (q31_t)0x2F875262, (q31_t)0x76D94988, + (q31_t)0x2F58A2BD, (q31_t)0x76EBEA77, (q31_t)0x2F29EBCC, + (q31_t)0x76FE790E, (q31_t)0x2EFB2D94, (q31_t)0x7710F54B, + (q31_t)0x2ECC681E, (q31_t)0x77235F2D, (q31_t)0x2E9D9B70, + (q31_t)0x7735B6AE, (q31_t)0x2E6EC792, (q31_t)0x7747FBCE, + (q31_t)0x2E3FEC8B, (q31_t)0x775A2E88, (q31_t)0x2E110A62, + (q31_t)0x776C4EDB, (q31_t)0x2DE2211E, (q31_t)0x777E5CC3, + (q31_t)0x2DB330C7, (q31_t)0x7790583D, (q31_t)0x2D843963, + (q31_t)0x77A24148, (q31_t)0x2D553AFB, (q31_t)0x77B417DF, + (q31_t)0x2D263595, (q31_t)0x77C5DC01, (q31_t)0x2CF72939, + (q31_t)0x77D78DAA, (q31_t)0x2CC815ED, (q31_t)0x77E92CD8, + (q31_t)0x2C98FBBA, (q31_t)0x77FAB988, (q31_t)0x2C69DAA6, + (q31_t)0x780C33B8, (q31_t)0x2C3AB2B9, (q31_t)0x781D9B64, + (q31_t)0x2C0B83F9, (q31_t)0x782EF08B, (q31_t)0x2BDC4E6F, + (q31_t)0x78403328, (q31_t)0x2BAD1221, (q31_t)0x7851633B, + (q31_t)0x2B7DCF17, (q31_t)0x786280BF, (q31_t)0x2B4E8558, + (q31_t)0x78738BB3, (q31_t)0x2B1F34EB, (q31_t)0x78848413, + (q31_t)0x2AEFDDD8, (q31_t)0x789569DE, (q31_t)0x2AC08025, + (q31_t)0x78A63D10, (q31_t)0x2A911BDB, (q31_t)0x78B6FDA8, + (q31_t)0x2A61B101, (q31_t)0x78C7ABA1, (q31_t)0x2A323F9D, + (q31_t)0x78D846FB, (q31_t)0x2A02C7B8, (q31_t)0x78E8CFB1, + (q31_t)0x29D34958, (q31_t)0x78F945C3, (q31_t)0x29A3C484, + (q31_t)0x7909A92C, (q31_t)0x29743945, (q31_t)0x7919F9EB, + (q31_t)0x2944A7A2, (q31_t)0x792A37FE, (q31_t)0x29150FA1, + (q31_t)0x793A6360, (q31_t)0x28E5714A, (q31_t)0x794A7C11, + (q31_t)0x28B5CCA5, (q31_t)0x795A820E, (q31_t)0x288621B9, + (q31_t)0x796A7554, (q31_t)0x2856708C, (q31_t)0x797A55E0, + (q31_t)0x2826B928, (q31_t)0x798A23B1, (q31_t)0x27F6FB92, + (q31_t)0x7999DEC3, (q31_t)0x27C737D2, (q31_t)0x79A98715, + (q31_t)0x27976DF1, (q31_t)0x79B91CA4, (q31_t)0x27679DF4, + (q31_t)0x79C89F6D, (q31_t)0x2737C7E3, (q31_t)0x79D80F6F, + (q31_t)0x2707EBC6, (q31_t)0x79E76CA6, (q31_t)0x26D809A5, + (q31_t)0x79F6B711, (q31_t)0x26A82185, (q31_t)0x7A05EEAD, + (q31_t)0x26783370, (q31_t)0x7A151377, (q31_t)0x26483F6C, + (q31_t)0x7A24256E, (q31_t)0x26184581, (q31_t)0x7A33248F, + (q31_t)0x25E845B5, (q31_t)0x7A4210D8, (q31_t)0x25B84012, + (q31_t)0x7A50EA46, (q31_t)0x2588349D, (q31_t)0x7A5FB0D8, + (q31_t)0x2558235E, (q31_t)0x7A6E648A, (q31_t)0x25280C5D, + (q31_t)0x7A7D055B, (q31_t)0x24F7EFA1, (q31_t)0x7A8B9348, + (q31_t)0x24C7CD32, (q31_t)0x7A9A0E4F, (q31_t)0x2497A517, + (q31_t)0x7AA8766E, (q31_t)0x24677757, (q31_t)0x7AB6CBA3, + (q31_t)0x243743FA, (q31_t)0x7AC50DEB, (q31_t)0x24070B07, + (q31_t)0x7AD33D45, (q31_t)0x23D6CC86, (q31_t)0x7AE159AE, + (q31_t)0x23A6887E, (q31_t)0x7AEF6323, (q31_t)0x23763EF7, + (q31_t)0x7AFD59A3, (q31_t)0x2345EFF7, (q31_t)0x7B0B3D2C, + (q31_t)0x23159B87, (q31_t)0x7B190DBB, (q31_t)0x22E541AE, + (q31_t)0x7B26CB4F, (q31_t)0x22B4E274, (q31_t)0x7B3475E4, + (q31_t)0x22847DDF, (q31_t)0x7B420D7A, (q31_t)0x225413F8, + (q31_t)0x7B4F920E, (q31_t)0x2223A4C5, (q31_t)0x7B5D039D, + (q31_t)0x21F3304E, (q31_t)0x7B6A6227, (q31_t)0x21C2B69C, + (q31_t)0x7B77ADA8, (q31_t)0x219237B4, (q31_t)0x7B84E61E, + (q31_t)0x2161B39F, (q31_t)0x7B920B89, (q31_t)0x21312A65, + (q31_t)0x7B9F1DE5, (q31_t)0x21009C0B, (q31_t)0x7BAC1D31, + (q31_t)0x20D0089B, (q31_t)0x7BB9096A, (q31_t)0x209F701C, + (q31_t)0x7BC5E28F, (q31_t)0x206ED295, (q31_t)0x7BD2A89E, + (q31_t)0x203E300D, (q31_t)0x7BDF5B94, (q31_t)0x200D888C, + (q31_t)0x7BEBFB70, (q31_t)0x1FDCDC1A, (q31_t)0x7BF88830, + (q31_t)0x1FAC2ABF, (q31_t)0x7C0501D1, (q31_t)0x1F7B7480, + (q31_t)0x7C116853, (q31_t)0x1F4AB967, (q31_t)0x7C1DBBB2, + (q31_t)0x1F19F97B, (q31_t)0x7C29FBEE, (q31_t)0x1EE934C2, + (q31_t)0x7C362904, (q31_t)0x1EB86B46, (q31_t)0x7C4242F2, + (q31_t)0x1E879D0C, (q31_t)0x7C4E49B6, (q31_t)0x1E56CA1E, + (q31_t)0x7C5A3D4F, (q31_t)0x1E25F281, (q31_t)0x7C661DBB, + (q31_t)0x1DF5163F, (q31_t)0x7C71EAF8, (q31_t)0x1DC4355D, + (q31_t)0x7C7DA504, (q31_t)0x1D934FE5, (q31_t)0x7C894BDD, + (q31_t)0x1D6265DD, (q31_t)0x7C94DF82, (q31_t)0x1D31774D, + (q31_t)0x7CA05FF1, (q31_t)0x1D00843C, (q31_t)0x7CABCD27, + (q31_t)0x1CCF8CB3, (q31_t)0x7CB72724, (q31_t)0x1C9E90B8, + (q31_t)0x7CC26DE5, (q31_t)0x1C6D9053, (q31_t)0x7CCDA168, + (q31_t)0x1C3C8B8C, (q31_t)0x7CD8C1AD, (q31_t)0x1C0B826A, + (q31_t)0x7CE3CEB1, (q31_t)0x1BDA74F5, (q31_t)0x7CEEC873, + (q31_t)0x1BA96334, (q31_t)0x7CF9AEF0, (q31_t)0x1B784D30, + (q31_t)0x7D048228, (q31_t)0x1B4732EF, (q31_t)0x7D0F4218, + (q31_t)0x1B161479, (q31_t)0x7D19EEBE, (q31_t)0x1AE4F1D6, + (q31_t)0x7D24881A, (q31_t)0x1AB3CB0C, (q31_t)0x7D2F0E2A, + (q31_t)0x1A82A025, (q31_t)0x7D3980EC, (q31_t)0x1A517127, + (q31_t)0x7D43E05E, (q31_t)0x1A203E1B, (q31_t)0x7D4E2C7E, + (q31_t)0x19EF0706, (q31_t)0x7D58654C, (q31_t)0x19BDCBF2, + (q31_t)0x7D628AC5, (q31_t)0x198C8CE6, (q31_t)0x7D6C9CE9, + (q31_t)0x195B49E9, (q31_t)0x7D769BB5, (q31_t)0x192A0303, + (q31_t)0x7D808727, (q31_t)0x18F8B83C, (q31_t)0x7D8A5F3F, + (q31_t)0x18C7699B, (q31_t)0x7D9423FB, (q31_t)0x18961727, + (q31_t)0x7D9DD55A, (q31_t)0x1864C0E9, (q31_t)0x7DA77359, + (q31_t)0x183366E8, (q31_t)0x7DB0FDF7, (q31_t)0x1802092C, + (q31_t)0x7DBA7534, (q31_t)0x17D0A7BB, (q31_t)0x7DC3D90D, + (q31_t)0x179F429F, (q31_t)0x7DCD2981, (q31_t)0x176DD9DE, + (q31_t)0x7DD6668E, (q31_t)0x173C6D80, (q31_t)0x7DDF9034, + (q31_t)0x170AFD8D, (q31_t)0x7DE8A670, (q31_t)0x16D98A0C, + (q31_t)0x7DF1A942, (q31_t)0x16A81305, (q31_t)0x7DFA98A7, + (q31_t)0x1676987F, (q31_t)0x7E03749F, (q31_t)0x16451A83, + (q31_t)0x7E0C3D29, (q31_t)0x16139917, (q31_t)0x7E14F242, + (q31_t)0x15E21444, (q31_t)0x7E1D93E9, (q31_t)0x15B08C11, + (q31_t)0x7E26221E, (q31_t)0x157F0086, (q31_t)0x7E2E9CDF, + (q31_t)0x154D71AA, (q31_t)0x7E37042A, (q31_t)0x151BDF85, + (q31_t)0x7E3F57FE, (q31_t)0x14EA4A1F, (q31_t)0x7E47985B, + (q31_t)0x14B8B17F, (q31_t)0x7E4FC53E, (q31_t)0x148715AD, + (q31_t)0x7E57DEA6, (q31_t)0x145576B1, (q31_t)0x7E5FE493, + (q31_t)0x1423D492, (q31_t)0x7E67D702, (q31_t)0x13F22F57, + (q31_t)0x7E6FB5F3, (q31_t)0x13C0870A, (q31_t)0x7E778165, + (q31_t)0x138EDBB0, (q31_t)0x7E7F3956, (q31_t)0x135D2D53, + (q31_t)0x7E86DDC5, (q31_t)0x132B7BF9, (q31_t)0x7E8E6EB1, + (q31_t)0x12F9C7AA, (q31_t)0x7E95EC19, (q31_t)0x12C8106E, + (q31_t)0x7E9D55FC, (q31_t)0x1296564D, (q31_t)0x7EA4AC58, + (q31_t)0x1264994E, (q31_t)0x7EABEF2C, (q31_t)0x1232D978, + (q31_t)0x7EB31E77, (q31_t)0x120116D4, (q31_t)0x7EBA3A39, + (q31_t)0x11CF516A, (q31_t)0x7EC1426F, (q31_t)0x119D8940, + (q31_t)0x7EC8371A, (q31_t)0x116BBE5F, (q31_t)0x7ECF1837, + (q31_t)0x1139F0CE, (q31_t)0x7ED5E5C6, (q31_t)0x11082096, + (q31_t)0x7EDC9FC6, (q31_t)0x10D64DBC, (q31_t)0x7EE34635, + (q31_t)0x10A4784A, (q31_t)0x7EE9D913, (q31_t)0x1072A047, + (q31_t)0x7EF0585F, (q31_t)0x1040C5BB, (q31_t)0x7EF6C418, + (q31_t)0x100EE8AD, (q31_t)0x7EFD1C3C, (q31_t)0x0FDD0925, + (q31_t)0x7F0360CB, (q31_t)0x0FAB272B, (q31_t)0x7F0991C3, + (q31_t)0x0F7942C6, (q31_t)0x7F0FAF24, (q31_t)0x0F475BFE, + (q31_t)0x7F15B8EE, (q31_t)0x0F1572DC, (q31_t)0x7F1BAF1E, + (q31_t)0x0EE38765, (q31_t)0x7F2191B4, (q31_t)0x0EB199A3, + (q31_t)0x7F2760AF, (q31_t)0x0E7FA99D, (q31_t)0x7F2D1C0E, + (q31_t)0x0E4DB75B, (q31_t)0x7F32C3D0, (q31_t)0x0E1BC2E3, + (q31_t)0x7F3857F5, (q31_t)0x0DE9CC3F, (q31_t)0x7F3DD87C, + (q31_t)0x0DB7D376, (q31_t)0x7F434563, (q31_t)0x0D85D88F, + (q31_t)0x7F489EAA, (q31_t)0x0D53DB92, (q31_t)0x7F4DE450, + (q31_t)0x0D21DC87, (q31_t)0x7F531654, (q31_t)0x0CEFDB75, + (q31_t)0x7F5834B6, (q31_t)0x0CBDD865, (q31_t)0x7F5D3F75, + (q31_t)0x0C8BD35E, (q31_t)0x7F62368F, (q31_t)0x0C59CC67, + (q31_t)0x7F671A04, (q31_t)0x0C27C389, (q31_t)0x7F6BE9D4, + (q31_t)0x0BF5B8CB, (q31_t)0x7F70A5FD, (q31_t)0x0BC3AC35, + (q31_t)0x7F754E7F, (q31_t)0x0B919DCE, (q31_t)0x7F79E35A, + (q31_t)0x0B5F8D9F, (q31_t)0x7F7E648B, (q31_t)0x0B2D7BAE, + (q31_t)0x7F82D214, (q31_t)0x0AFB6805, (q31_t)0x7F872BF3, + (q31_t)0x0AC952AA, (q31_t)0x7F8B7226, (q31_t)0x0A973BA5, + (q31_t)0x7F8FA4AF, (q31_t)0x0A6522FE, (q31_t)0x7F93C38C, + (q31_t)0x0A3308BC, (q31_t)0x7F97CEBC, (q31_t)0x0A00ECE8, + (q31_t)0x7F9BC63F, (q31_t)0x09CECF89, (q31_t)0x7F9FAA15, + (q31_t)0x099CB0A7, (q31_t)0x7FA37A3C, (q31_t)0x096A9049, + (q31_t)0x7FA736B4, (q31_t)0x09386E77, (q31_t)0x7FAADF7C, + (q31_t)0x09064B3A, (q31_t)0x7FAE7494, (q31_t)0x08D42698, + (q31_t)0x7FB1F5FC, (q31_t)0x08A2009A, (q31_t)0x7FB563B2, + (q31_t)0x086FD947, (q31_t)0x7FB8BDB7, (q31_t)0x083DB0A7, + (q31_t)0x7FBC040A, (q31_t)0x080B86C1, (q31_t)0x7FBF36A9, + (q31_t)0x07D95B9E, (q31_t)0x7FC25596, (q31_t)0x07A72F45, + (q31_t)0x7FC560CF, (q31_t)0x077501BE, (q31_t)0x7FC85853, + (q31_t)0x0742D310, (q31_t)0x7FCB3C23, (q31_t)0x0710A344, + (q31_t)0x7FCE0C3E, (q31_t)0x06DE7261, (q31_t)0x7FD0C8A3, + (q31_t)0x06AC406F, (q31_t)0x7FD37152, (q31_t)0x067A0D75, + (q31_t)0x7FD6064B, (q31_t)0x0647D97C, (q31_t)0x7FD8878D, + (q31_t)0x0615A48A, (q31_t)0x7FDAF518, (q31_t)0x05E36EA9, + (q31_t)0x7FDD4EEC, (q31_t)0x05B137DF, (q31_t)0x7FDF9508, + (q31_t)0x057F0034, (q31_t)0x7FE1C76B, (q31_t)0x054CC7B0, + (q31_t)0x7FE3E616, (q31_t)0x051A8E5C, (q31_t)0x7FE5F108, + (q31_t)0x04E8543D, (q31_t)0x7FE7E840, (q31_t)0x04B6195D, + (q31_t)0x7FE9CBC0, (q31_t)0x0483DDC3, (q31_t)0x7FEB9B85, + (q31_t)0x0451A176, (q31_t)0x7FED5790, (q31_t)0x041F647F, + (q31_t)0x7FEEFFE1, (q31_t)0x03ED26E6, (q31_t)0x7FF09477, + (q31_t)0x03BAE8B1, (q31_t)0x7FF21553, (q31_t)0x0388A9E9, + (q31_t)0x7FF38273, (q31_t)0x03566A96, (q31_t)0x7FF4DBD8, + (q31_t)0x03242ABF, (q31_t)0x7FF62182, (q31_t)0x02F1EA6B, + (q31_t)0x7FF7536F, (q31_t)0x02BFA9A4, (q31_t)0x7FF871A1, + (q31_t)0x028D6870, (q31_t)0x7FF97C17, (q31_t)0x025B26D7, + (q31_t)0x7FFA72D1, (q31_t)0x0228E4E1, (q31_t)0x7FFB55CE, + (q31_t)0x01F6A296, (q31_t)0x7FFC250F, (q31_t)0x01C45FFE, + (q31_t)0x7FFCE093, (q31_t)0x01921D1F, (q31_t)0x7FFD885A, + (q31_t)0x015FDA03, (q31_t)0x7FFE1C64, (q31_t)0x012D96B0, + (q31_t)0x7FFE9CB2, (q31_t)0x00FB532F, (q31_t)0x7FFF0942, + (q31_t)0x00C90F88, (q31_t)0x7FFF6216, (q31_t)0x0096CBC1, + (q31_t)0x7FFFA72C, (q31_t)0x006487E3, (q31_t)0x7FFFD885, + (q31_t)0x003243F5, (q31_t)0x7FFFF621, (q31_t)0x00000000, + (q31_t)0x7FFFFFFF, (q31_t)0xFFCDBC0A, (q31_t)0x7FFFF621, + (q31_t)0xFF9B781D, (q31_t)0x7FFFD885, (q31_t)0xFF69343E, + (q31_t)0x7FFFA72C, (q31_t)0xFF36F078, (q31_t)0x7FFF6216, + (q31_t)0xFF04ACD0, (q31_t)0x7FFF0942, (q31_t)0xFED2694F, + (q31_t)0x7FFE9CB2, (q31_t)0xFEA025FC, (q31_t)0x7FFE1C64, + (q31_t)0xFE6DE2E0, (q31_t)0x7FFD885A, (q31_t)0xFE3BA001, + (q31_t)0x7FFCE093, (q31_t)0xFE095D69, (q31_t)0x7FFC250F, + (q31_t)0xFDD71B1E, (q31_t)0x7FFB55CE, (q31_t)0xFDA4D928, + (q31_t)0x7FFA72D1, (q31_t)0xFD72978F, (q31_t)0x7FF97C17, + (q31_t)0xFD40565B, (q31_t)0x7FF871A1, (q31_t)0xFD0E1594, + (q31_t)0x7FF7536F, (q31_t)0xFCDBD541, (q31_t)0x7FF62182, + (q31_t)0xFCA99569, (q31_t)0x7FF4DBD8, (q31_t)0xFC775616, + (q31_t)0x7FF38273, (q31_t)0xFC45174E, (q31_t)0x7FF21553, + (q31_t)0xFC12D919, (q31_t)0x7FF09477, (q31_t)0xFBE09B80, + (q31_t)0x7FEEFFE1, (q31_t)0xFBAE5E89, (q31_t)0x7FED5790, + (q31_t)0xFB7C223C, (q31_t)0x7FEB9B85, (q31_t)0xFB49E6A2, + (q31_t)0x7FE9CBC0, (q31_t)0xFB17ABC2, (q31_t)0x7FE7E840, + (q31_t)0xFAE571A4, (q31_t)0x7FE5F108, (q31_t)0xFAB3384F, + (q31_t)0x7FE3E616, (q31_t)0xFA80FFCB, (q31_t)0x7FE1C76B, + (q31_t)0xFA4EC820, (q31_t)0x7FDF9508, (q31_t)0xFA1C9156, + (q31_t)0x7FDD4EEC, (q31_t)0xF9EA5B75, (q31_t)0x7FDAF518, + (q31_t)0xF9B82683, (q31_t)0x7FD8878D, (q31_t)0xF985F28A, + (q31_t)0x7FD6064B, (q31_t)0xF953BF90, (q31_t)0x7FD37152, + (q31_t)0xF9218D9E, (q31_t)0x7FD0C8A3, (q31_t)0xF8EF5CBB, + (q31_t)0x7FCE0C3E, (q31_t)0xF8BD2CEF, (q31_t)0x7FCB3C23, + (q31_t)0xF88AFE41, (q31_t)0x7FC85853, (q31_t)0xF858D0BA, + (q31_t)0x7FC560CF, (q31_t)0xF826A461, (q31_t)0x7FC25596, + (q31_t)0xF7F4793E, (q31_t)0x7FBF36A9, (q31_t)0xF7C24F58, + (q31_t)0x7FBC040A, (q31_t)0xF79026B8, (q31_t)0x7FB8BDB7, + (q31_t)0xF75DFF65, (q31_t)0x7FB563B2, (q31_t)0xF72BD967, + (q31_t)0x7FB1F5FC, (q31_t)0xF6F9B4C5, (q31_t)0x7FAE7494, + (q31_t)0xF6C79188, (q31_t)0x7FAADF7C, (q31_t)0xF6956FB6, + (q31_t)0x7FA736B4, (q31_t)0xF6634F58, (q31_t)0x7FA37A3C, + (q31_t)0xF6313076, (q31_t)0x7F9FAA15, (q31_t)0xF5FF1317, + (q31_t)0x7F9BC63F, (q31_t)0xF5CCF743, (q31_t)0x7F97CEBC, + (q31_t)0xF59ADD01, (q31_t)0x7F93C38C, (q31_t)0xF568C45A, + (q31_t)0x7F8FA4AF, (q31_t)0xF536AD55, (q31_t)0x7F8B7226, + (q31_t)0xF50497FA, (q31_t)0x7F872BF3, (q31_t)0xF4D28451, + (q31_t)0x7F82D214, (q31_t)0xF4A07260, (q31_t)0x7F7E648B, + (q31_t)0xF46E6231, (q31_t)0x7F79E35A, (q31_t)0xF43C53CA, + (q31_t)0x7F754E7F, (q31_t)0xF40A4734, (q31_t)0x7F70A5FD, + (q31_t)0xF3D83C76, (q31_t)0x7F6BE9D4, (q31_t)0xF3A63398, + (q31_t)0x7F671A04, (q31_t)0xF3742CA1, (q31_t)0x7F62368F, + (q31_t)0xF342279A, (q31_t)0x7F5D3F75, (q31_t)0xF310248A, + (q31_t)0x7F5834B6, (q31_t)0xF2DE2378, (q31_t)0x7F531654, + (q31_t)0xF2AC246D, (q31_t)0x7F4DE450, (q31_t)0xF27A2770, + (q31_t)0x7F489EAA, (q31_t)0xF2482C89, (q31_t)0x7F434563, + (q31_t)0xF21633C0, (q31_t)0x7F3DD87C, (q31_t)0xF1E43D1C, + (q31_t)0x7F3857F5, (q31_t)0xF1B248A5, (q31_t)0x7F32C3D0, + (q31_t)0xF1805662, (q31_t)0x7F2D1C0E, (q31_t)0xF14E665C, + (q31_t)0x7F2760AF, (q31_t)0xF11C789A, (q31_t)0x7F2191B4, + (q31_t)0xF0EA8D23, (q31_t)0x7F1BAF1E, (q31_t)0xF0B8A401, + (q31_t)0x7F15B8EE, (q31_t)0xF086BD39, (q31_t)0x7F0FAF24, + (q31_t)0xF054D8D4, (q31_t)0x7F0991C3, (q31_t)0xF022F6DA, + (q31_t)0x7F0360CB, (q31_t)0xEFF11752, (q31_t)0x7EFD1C3C, + (q31_t)0xEFBF3A44, (q31_t)0x7EF6C418, (q31_t)0xEF8D5FB8, + (q31_t)0x7EF0585F, (q31_t)0xEF5B87B5, (q31_t)0x7EE9D913, + (q31_t)0xEF29B243, (q31_t)0x7EE34635, (q31_t)0xEEF7DF6A, + (q31_t)0x7EDC9FC6, (q31_t)0xEEC60F31, (q31_t)0x7ED5E5C6, + (q31_t)0xEE9441A0, (q31_t)0x7ECF1837, (q31_t)0xEE6276BF, + (q31_t)0x7EC8371A, (q31_t)0xEE30AE95, (q31_t)0x7EC1426F, + (q31_t)0xEDFEE92B, (q31_t)0x7EBA3A39, (q31_t)0xEDCD2687, + (q31_t)0x7EB31E77, (q31_t)0xED9B66B2, (q31_t)0x7EABEF2C, + (q31_t)0xED69A9B2, (q31_t)0x7EA4AC58, (q31_t)0xED37EF91, + (q31_t)0x7E9D55FC, (q31_t)0xED063855, (q31_t)0x7E95EC19, + (q31_t)0xECD48406, (q31_t)0x7E8E6EB1, (q31_t)0xECA2D2AC, + (q31_t)0x7E86DDC5, (q31_t)0xEC71244F, (q31_t)0x7E7F3956, + (q31_t)0xEC3F78F5, (q31_t)0x7E778165, (q31_t)0xEC0DD0A8, + (q31_t)0x7E6FB5F3, (q31_t)0xEBDC2B6D, (q31_t)0x7E67D702, + (q31_t)0xEBAA894E, (q31_t)0x7E5FE493, (q31_t)0xEB78EA52, + (q31_t)0x7E57DEA6, (q31_t)0xEB474E80, (q31_t)0x7E4FC53E, + (q31_t)0xEB15B5E0, (q31_t)0x7E47985B, (q31_t)0xEAE4207A, + (q31_t)0x7E3F57FE, (q31_t)0xEAB28E55, (q31_t)0x7E37042A, + (q31_t)0xEA80FF79, (q31_t)0x7E2E9CDF, (q31_t)0xEA4F73EE, + (q31_t)0x7E26221E, (q31_t)0xEA1DEBBB, (q31_t)0x7E1D93E9, + (q31_t)0xE9EC66E8, (q31_t)0x7E14F242, (q31_t)0xE9BAE57C, + (q31_t)0x7E0C3D29, (q31_t)0xE9896780, (q31_t)0x7E03749F, + (q31_t)0xE957ECFB, (q31_t)0x7DFA98A7, (q31_t)0xE92675F4, + (q31_t)0x7DF1A942, (q31_t)0xE8F50273, (q31_t)0x7DE8A670, + (q31_t)0xE8C3927F, (q31_t)0x7DDF9034, (q31_t)0xE8922621, + (q31_t)0x7DD6668E, (q31_t)0xE860BD60, (q31_t)0x7DCD2981, + (q31_t)0xE82F5844, (q31_t)0x7DC3D90D, (q31_t)0xE7FDF6D3, + (q31_t)0x7DBA7534, (q31_t)0xE7CC9917, (q31_t)0x7DB0FDF7, + (q31_t)0xE79B3F16, (q31_t)0x7DA77359, (q31_t)0xE769E8D8, + (q31_t)0x7D9DD55A, (q31_t)0xE7389664, (q31_t)0x7D9423FB, + (q31_t)0xE70747C3, (q31_t)0x7D8A5F3F, (q31_t)0xE6D5FCFC, + (q31_t)0x7D808727, (q31_t)0xE6A4B616, (q31_t)0x7D769BB5, + (q31_t)0xE6737319, (q31_t)0x7D6C9CE9, (q31_t)0xE642340D, + (q31_t)0x7D628AC5, (q31_t)0xE610F8F9, (q31_t)0x7D58654C, + (q31_t)0xE5DFC1E4, (q31_t)0x7D4E2C7E, (q31_t)0xE5AE8ED8, + (q31_t)0x7D43E05E, (q31_t)0xE57D5FDA, (q31_t)0x7D3980EC, + (q31_t)0xE54C34F3, (q31_t)0x7D2F0E2A, (q31_t)0xE51B0E2A, + (q31_t)0x7D24881A, (q31_t)0xE4E9EB86, (q31_t)0x7D19EEBE, + (q31_t)0xE4B8CD10, (q31_t)0x7D0F4218, (q31_t)0xE487B2CF, + (q31_t)0x7D048228, (q31_t)0xE4569CCB, (q31_t)0x7CF9AEF0, + (q31_t)0xE4258B0A, (q31_t)0x7CEEC873, (q31_t)0xE3F47D95, + (q31_t)0x7CE3CEB1, (q31_t)0xE3C37473, (q31_t)0x7CD8C1AD, + (q31_t)0xE3926FAC, (q31_t)0x7CCDA168, (q31_t)0xE3616F47, + (q31_t)0x7CC26DE5, (q31_t)0xE330734C, (q31_t)0x7CB72724, + (q31_t)0xE2FF7BC3, (q31_t)0x7CABCD27, (q31_t)0xE2CE88B2, + (q31_t)0x7CA05FF1, (q31_t)0xE29D9A22, (q31_t)0x7C94DF82, + (q31_t)0xE26CB01A, (q31_t)0x7C894BDD, (q31_t)0xE23BCAA2, + (q31_t)0x7C7DA504, (q31_t)0xE20AE9C1, (q31_t)0x7C71EAF8, + (q31_t)0xE1DA0D7E, (q31_t)0x7C661DBB, (q31_t)0xE1A935E1, + (q31_t)0x7C5A3D4F, (q31_t)0xE17862F3, (q31_t)0x7C4E49B6, + (q31_t)0xE14794B9, (q31_t)0x7C4242F2, (q31_t)0xE116CB3D, + (q31_t)0x7C362904, (q31_t)0xE0E60684, (q31_t)0x7C29FBEE, + (q31_t)0xE0B54698, (q31_t)0x7C1DBBB2, (q31_t)0xE0848B7F, + (q31_t)0x7C116853, (q31_t)0xE053D541, (q31_t)0x7C0501D1, + (q31_t)0xE02323E5, (q31_t)0x7BF88830, (q31_t)0xDFF27773, + (q31_t)0x7BEBFB70, (q31_t)0xDFC1CFF2, (q31_t)0x7BDF5B94, + (q31_t)0xDF912D6A, (q31_t)0x7BD2A89E, (q31_t)0xDF608FE3, + (q31_t)0x7BC5E28F, (q31_t)0xDF2FF764, (q31_t)0x7BB9096A, + (q31_t)0xDEFF63F4, (q31_t)0x7BAC1D31, (q31_t)0xDECED59B, + (q31_t)0x7B9F1DE5, (q31_t)0xDE9E4C60, (q31_t)0x7B920B89, + (q31_t)0xDE6DC84B, (q31_t)0x7B84E61E, (q31_t)0xDE3D4963, + (q31_t)0x7B77ADA8, (q31_t)0xDE0CCFB1, (q31_t)0x7B6A6227, + (q31_t)0xDDDC5B3A, (q31_t)0x7B5D039D, (q31_t)0xDDABEC07, + (q31_t)0x7B4F920E, (q31_t)0xDD7B8220, (q31_t)0x7B420D7A, + (q31_t)0xDD4B1D8B, (q31_t)0x7B3475E4, (q31_t)0xDD1ABE51, + (q31_t)0x7B26CB4F, (q31_t)0xDCEA6478, (q31_t)0x7B190DBB, + (q31_t)0xDCBA1008, (q31_t)0x7B0B3D2C, (q31_t)0xDC89C108, + (q31_t)0x7AFD59A3, (q31_t)0xDC597781, (q31_t)0x7AEF6323, + (q31_t)0xDC293379, (q31_t)0x7AE159AE, (q31_t)0xDBF8F4F8, + (q31_t)0x7AD33D45, (q31_t)0xDBC8BC05, (q31_t)0x7AC50DEB, + (q31_t)0xDB9888A8, (q31_t)0x7AB6CBA3, (q31_t)0xDB685AE8, + (q31_t)0x7AA8766E, (q31_t)0xDB3832CD, (q31_t)0x7A9A0E4F, + (q31_t)0xDB08105E, (q31_t)0x7A8B9348, (q31_t)0xDAD7F3A2, + (q31_t)0x7A7D055B, (q31_t)0xDAA7DCA1, (q31_t)0x7A6E648A, + (q31_t)0xDA77CB62, (q31_t)0x7A5FB0D8, (q31_t)0xDA47BFED, + (q31_t)0x7A50EA46, (q31_t)0xDA17BA4A, (q31_t)0x7A4210D8, + (q31_t)0xD9E7BA7E, (q31_t)0x7A33248F, (q31_t)0xD9B7C093, + (q31_t)0x7A24256E, (q31_t)0xD987CC8F, (q31_t)0x7A151377, + (q31_t)0xD957DE7A, (q31_t)0x7A05EEAD, (q31_t)0xD927F65B, + (q31_t)0x79F6B711, (q31_t)0xD8F81439, (q31_t)0x79E76CA6, + (q31_t)0xD8C8381C, (q31_t)0x79D80F6F, (q31_t)0xD898620C, + (q31_t)0x79C89F6D, (q31_t)0xD868920F, (q31_t)0x79B91CA4, + (q31_t)0xD838C82D, (q31_t)0x79A98715, (q31_t)0xD809046D, + (q31_t)0x7999DEC3, (q31_t)0xD7D946D7, (q31_t)0x798A23B1, + (q31_t)0xD7A98F73, (q31_t)0x797A55E0, (q31_t)0xD779DE46, + (q31_t)0x796A7554, (q31_t)0xD74A335A, (q31_t)0x795A820E, + (q31_t)0xD71A8EB5, (q31_t)0x794A7C11, (q31_t)0xD6EAF05E, + (q31_t)0x793A6360, (q31_t)0xD6BB585D, (q31_t)0x792A37FE, + (q31_t)0xD68BC6BA, (q31_t)0x7919F9EB, (q31_t)0xD65C3B7B, + (q31_t)0x7909A92C, (q31_t)0xD62CB6A7, (q31_t)0x78F945C3, + (q31_t)0xD5FD3847, (q31_t)0x78E8CFB1, (q31_t)0xD5CDC062, + (q31_t)0x78D846FB, (q31_t)0xD59E4EFE, (q31_t)0x78C7ABA1, + (q31_t)0xD56EE424, (q31_t)0x78B6FDA8, (q31_t)0xD53F7FDA, + (q31_t)0x78A63D10, (q31_t)0xD5102227, (q31_t)0x789569DE, + (q31_t)0xD4E0CB14, (q31_t)0x78848413, (q31_t)0xD4B17AA7, + (q31_t)0x78738BB3, (q31_t)0xD48230E8, (q31_t)0x786280BF, + (q31_t)0xD452EDDE, (q31_t)0x7851633B, (q31_t)0xD423B190, + (q31_t)0x78403328, (q31_t)0xD3F47C06, (q31_t)0x782EF08B, + (q31_t)0xD3C54D46, (q31_t)0x781D9B64, (q31_t)0xD3962559, + (q31_t)0x780C33B8, (q31_t)0xD3670445, (q31_t)0x77FAB988, + (q31_t)0xD337EA12, (q31_t)0x77E92CD8, (q31_t)0xD308D6C6, + (q31_t)0x77D78DAA, (q31_t)0xD2D9CA6A, (q31_t)0x77C5DC01, + (q31_t)0xD2AAC504, (q31_t)0x77B417DF, (q31_t)0xD27BC69C, + (q31_t)0x77A24148, (q31_t)0xD24CCF38, (q31_t)0x7790583D, + (q31_t)0xD21DDEE1, (q31_t)0x777E5CC3, (q31_t)0xD1EEF59E, + (q31_t)0x776C4EDB, (q31_t)0xD1C01374, (q31_t)0x775A2E88, + (q31_t)0xD191386D, (q31_t)0x7747FBCE, (q31_t)0xD162648F, + (q31_t)0x7735B6AE, (q31_t)0xD13397E1, (q31_t)0x77235F2D, + (q31_t)0xD104D26B, (q31_t)0x7710F54B, (q31_t)0xD0D61433, + (q31_t)0x76FE790E, (q31_t)0xD0A75D42, (q31_t)0x76EBEA77, + (q31_t)0xD078AD9D, (q31_t)0x76D94988, (q31_t)0xD04A054D, + (q31_t)0x76C69646, (q31_t)0xD01B6459, (q31_t)0x76B3D0B3, + (q31_t)0xCFECCAC7, (q31_t)0x76A0F8D2, (q31_t)0xCFBE389F, + (q31_t)0x768E0EA5, (q31_t)0xCF8FADE8, (q31_t)0x767B1230, + (q31_t)0xCF612AAA, (q31_t)0x76680376, (q31_t)0xCF32AEEB, + (q31_t)0x7654E279, (q31_t)0xCF043AB2, (q31_t)0x7641AF3C, + (q31_t)0xCED5CE08, (q31_t)0x762E69C3, (q31_t)0xCEA768F2, + (q31_t)0x761B1211, (q31_t)0xCE790B78, (q31_t)0x7607A827, + (q31_t)0xCE4AB5A2, (q31_t)0x75F42C0A, (q31_t)0xCE1C6776, + (q31_t)0x75E09DBD, (q31_t)0xCDEE20FC, (q31_t)0x75CCFD42, + (q31_t)0xCDBFE23A, (q31_t)0x75B94A9C, (q31_t)0xCD91AB38, + (q31_t)0x75A585CF, (q31_t)0xCD637BFD, (q31_t)0x7591AEDD, + (q31_t)0xCD355490, (q31_t)0x757DC5CA, (q31_t)0xCD0734F8, + (q31_t)0x7569CA98, (q31_t)0xCCD91D3D, (q31_t)0x7555BD4B, + (q31_t)0xCCAB0D65, (q31_t)0x75419DE6, (q31_t)0xCC7D0577, + (q31_t)0x752D6C6C, (q31_t)0xCC4F057B, (q31_t)0x751928E0, + (q31_t)0xCC210D78, (q31_t)0x7504D345, (q31_t)0xCBF31D75, + (q31_t)0x74F06B9E, (q31_t)0xCBC53578, (q31_t)0x74DBF1EF, + (q31_t)0xCB975589, (q31_t)0x74C7663A, (q31_t)0xCB697DB0, + (q31_t)0x74B2C883, (q31_t)0xCB3BADF2, (q31_t)0x749E18CD, + (q31_t)0xCB0DE658, (q31_t)0x7489571B, (q31_t)0xCAE026E8, + (q31_t)0x74748371, (q31_t)0xCAB26FA9, (q31_t)0x745F9DD1, + (q31_t)0xCA84C0A2, (q31_t)0x744AA63E, (q31_t)0xCA5719DB, + (q31_t)0x74359CBD, (q31_t)0xCA297B5A, (q31_t)0x74208150, + (q31_t)0xC9FBE527, (q31_t)0x740B53FA, (q31_t)0xC9CE5748, + (q31_t)0x73F614C0, (q31_t)0xC9A0D1C4, (q31_t)0x73E0C3A3, + (q31_t)0xC97354A3, (q31_t)0x73CB60A7, (q31_t)0xC945DFEC, + (q31_t)0x73B5EBD0, (q31_t)0xC91873A5, (q31_t)0x73A06522, + (q31_t)0xC8EB0FD6, (q31_t)0x738ACC9E, (q31_t)0xC8BDB485, + (q31_t)0x73752249, (q31_t)0xC89061BA, (q31_t)0x735F6626, + (q31_t)0xC863177B, (q31_t)0x73499838, (q31_t)0xC835D5D0, + (q31_t)0x7333B883, (q31_t)0xC8089CBF, (q31_t)0x731DC709, + (q31_t)0xC7DB6C50, (q31_t)0x7307C3D0, (q31_t)0xC7AE4489, + (q31_t)0x72F1AED8, (q31_t)0xC7812571, (q31_t)0x72DB8828, + (q31_t)0xC7540F10, (q31_t)0x72C54FC0, (q31_t)0xC727016C, + (q31_t)0x72AF05A6, (q31_t)0xC6F9FC8D, (q31_t)0x7298A9DC, + (q31_t)0xC6CD0079, (q31_t)0x72823C66, (q31_t)0xC6A00D36, + (q31_t)0x726BBD48, (q31_t)0xC67322CD, (q31_t)0x72552C84, + (q31_t)0xC6464144, (q31_t)0x723E8A1F, (q31_t)0xC61968A2, + (q31_t)0x7227D61C, (q31_t)0xC5EC98ED, (q31_t)0x7211107D, + (q31_t)0xC5BFD22E, (q31_t)0x71FA3948, (q31_t)0xC593146A, + (q31_t)0x71E3507F, (q31_t)0xC5665FA8, (q31_t)0x71CC5626, + (q31_t)0xC539B3F0, (q31_t)0x71B54A40, (q31_t)0xC50D1148, + (q31_t)0x719E2CD2, (q31_t)0xC4E077B8, (q31_t)0x7186FDDE, + (q31_t)0xC4B3E746, (q31_t)0x716FBD68, (q31_t)0xC4875FF8, + (q31_t)0x71586B73, (q31_t)0xC45AE1D7, (q31_t)0x71410804, + (q31_t)0xC42E6CE8, (q31_t)0x7129931E, (q31_t)0xC4020132, + (q31_t)0x71120CC5, (q31_t)0xC3D59EBD, (q31_t)0x70FA74FB, + (q31_t)0xC3A9458F, (q31_t)0x70E2CBC6, (q31_t)0xC37CF5B0, + (q31_t)0x70CB1127, (q31_t)0xC350AF25, (q31_t)0x70B34524, + (q31_t)0xC32471F6, (q31_t)0x709B67C0, (q31_t)0xC2F83E2A, + (q31_t)0x708378FE, (q31_t)0xC2CC13C7, (q31_t)0x706B78E3, + (q31_t)0xC29FF2D4, (q31_t)0x70536771, (q31_t)0xC273DB58, + (q31_t)0x703B44AC, (q31_t)0xC247CD5A, (q31_t)0x70231099, + (q31_t)0xC21BC8E0, (q31_t)0x700ACB3B, (q31_t)0xC1EFCDF2, + (q31_t)0x6FF27496, (q31_t)0xC1C3DC96, (q31_t)0x6FDA0CAD, + (q31_t)0xC197F4D3, (q31_t)0x6FC19385, (q31_t)0xC16C16B0, + (q31_t)0x6FA90920, (q31_t)0xC1404233, (q31_t)0x6F906D84, + (q31_t)0xC1147763, (q31_t)0x6F77C0B3, (q31_t)0xC0E8B648, + (q31_t)0x6F5F02B1, (q31_t)0xC0BCFEE7, (q31_t)0x6F463383, + (q31_t)0xC0915147, (q31_t)0x6F2D532C, (q31_t)0xC065AD70, + (q31_t)0x6F1461AF, (q31_t)0xC03A1368, (q31_t)0x6EFB5F12, + (q31_t)0xC00E8335, (q31_t)0x6EE24B57, (q31_t)0xBFE2FCDF, + (q31_t)0x6EC92682, (q31_t)0xBFB7806C, (q31_t)0x6EAFF098, + (q31_t)0xBF8C0DE2, (q31_t)0x6E96A99C, (q31_t)0xBF60A54A, + (q31_t)0x6E7D5193, (q31_t)0xBF3546A8, (q31_t)0x6E63E87F, + (q31_t)0xBF09F204, (q31_t)0x6E4A6E65, (q31_t)0xBEDEA765, + (q31_t)0x6E30E349, (q31_t)0xBEB366D1, (q31_t)0x6E17472F, + (q31_t)0xBE88304F, (q31_t)0x6DFD9A1B, (q31_t)0xBE5D03E5, + (q31_t)0x6DE3DC11, (q31_t)0xBE31E19B, (q31_t)0x6DCA0D14, + (q31_t)0xBE06C977, (q31_t)0x6DB02D29, (q31_t)0xBDDBBB7F, + (q31_t)0x6D963C54, (q31_t)0xBDB0B7BA, (q31_t)0x6D7C3A98, + (q31_t)0xBD85BE2F, (q31_t)0x6D6227FA, (q31_t)0xBD5ACEE5, + (q31_t)0x6D48047E, (q31_t)0xBD2FE9E1, (q31_t)0x6D2DD027, + (q31_t)0xBD050F2C, (q31_t)0x6D138AFA, (q31_t)0xBCDA3ECA, + (q31_t)0x6CF934FB, (q31_t)0xBCAF78C3, (q31_t)0x6CDECE2E, + (q31_t)0xBC84BD1E, (q31_t)0x6CC45697, (q31_t)0xBC5A0BE1, + (q31_t)0x6CA9CE3A, (q31_t)0xBC2F6513, (q31_t)0x6C8F351C, + (q31_t)0xBC04C8BA, (q31_t)0x6C748B3F, (q31_t)0xBBDA36DC, + (q31_t)0x6C59D0A9, (q31_t)0xBBAFAF81, (q31_t)0x6C3F055D, + (q31_t)0xBB8532AF, (q31_t)0x6C242960, (q31_t)0xBB5AC06C, + (q31_t)0x6C093CB6, (q31_t)0xBB3058C0, (q31_t)0x6BEE3F62, + (q31_t)0xBB05FBB0, (q31_t)0x6BD3316A, (q31_t)0xBADBA943, + (q31_t)0x6BB812D0, (q31_t)0xBAB1617F, (q31_t)0x6B9CE39B, + (q31_t)0xBA87246C, (q31_t)0x6B81A3CD, (q31_t)0xBA5CF210, + (q31_t)0x6B66536A, (q31_t)0xBA32CA70, (q31_t)0x6B4AF278, + (q31_t)0xBA08AD94, (q31_t)0x6B2F80FA, (q31_t)0xB9DE9B83, + (q31_t)0x6B13FEF5, (q31_t)0xB9B49442, (q31_t)0x6AF86C6C, + (q31_t)0xB98A97D8, (q31_t)0x6ADCC964, (q31_t)0xB960A64B, + (q31_t)0x6AC115E1, (q31_t)0xB936BFA3, (q31_t)0x6AA551E8, + (q31_t)0xB90CE3E6, (q31_t)0x6A897D7D, (q31_t)0xB8E31319, + (q31_t)0x6A6D98A4, (q31_t)0xB8B94D44, (q31_t)0x6A51A361, + (q31_t)0xB88F926C, (q31_t)0x6A359DB9, (q31_t)0xB865E299, + (q31_t)0x6A1987B0, (q31_t)0xB83C3DD1, (q31_t)0x69FD614A, + (q31_t)0xB812A419, (q31_t)0x69E12A8C, (q31_t)0xB7E9157A, + (q31_t)0x69C4E37A, (q31_t)0xB7BF91F8, (q31_t)0x69A88C18, + (q31_t)0xB796199B, (q31_t)0x698C246C, (q31_t)0xB76CAC68, + (q31_t)0x696FAC78, (q31_t)0xB7434A67, (q31_t)0x69532442, + (q31_t)0xB719F39D, (q31_t)0x69368BCE, (q31_t)0xB6F0A811, + (q31_t)0x6919E320, (q31_t)0xB6C767CA, (q31_t)0x68FD2A3D, + (q31_t)0xB69E32CD, (q31_t)0x68E06129, (q31_t)0xB6750921, + (q31_t)0x68C387E9, (q31_t)0xB64BEACC, (q31_t)0x68A69E81, + (q31_t)0xB622D7D5, (q31_t)0x6889A4F5, (q31_t)0xB5F9D042, + (q31_t)0x686C9B4B, (q31_t)0xB5D0D41A, (q31_t)0x684F8186, + (q31_t)0xB5A7E362, (q31_t)0x683257AA, (q31_t)0xB57EFE21, + (q31_t)0x68151DBE, (q31_t)0xB556245E, (q31_t)0x67F7D3C4, + (q31_t)0xB52D561E, (q31_t)0x67DA79C2, (q31_t)0xB5049368, + (q31_t)0x67BD0FBC, (q31_t)0xB4DBDC42, (q31_t)0x679F95B7, + (q31_t)0xB4B330B2, (q31_t)0x67820BB6, (q31_t)0xB48A90C0, + (q31_t)0x676471C0, (q31_t)0xB461FC70, (q31_t)0x6746C7D7, + (q31_t)0xB43973C9, (q31_t)0x67290E02, (q31_t)0xB410F6D2, + (q31_t)0x670B4443, (q31_t)0xB3E88591, (q31_t)0x66ED6AA1, + (q31_t)0xB3C0200C, (q31_t)0x66CF811F, (q31_t)0xB397C649, + (q31_t)0x66B187C3, (q31_t)0xB36F784E, (q31_t)0x66937E90, + (q31_t)0xB3473622, (q31_t)0x6675658C, (q31_t)0xB31EFFCB, + (q31_t)0x66573CBB, (q31_t)0xB2F6D54F, (q31_t)0x66390422, + (q31_t)0xB2CEB6B5, (q31_t)0x661ABBC5, (q31_t)0xB2A6A401, + (q31_t)0x65FC63A9, (q31_t)0xB27E9D3B, (q31_t)0x65DDFBD3, + (q31_t)0xB256A26A, (q31_t)0x65BF8447, (q31_t)0xB22EB392, + (q31_t)0x65A0FD0B, (q31_t)0xB206D0BA, (q31_t)0x65826622, + (q31_t)0xB1DEF9E8, (q31_t)0x6563BF92, (q31_t)0xB1B72F23, + (q31_t)0x6545095F, (q31_t)0xB18F7070, (q31_t)0x6526438E, + (q31_t)0xB167BDD6, (q31_t)0x65076E24, (q31_t)0xB140175B, + (q31_t)0x64E88926, (q31_t)0xB1187D05, (q31_t)0x64C99498, + (q31_t)0xB0F0EEDA, (q31_t)0x64AA907F, (q31_t)0xB0C96CDF, + (q31_t)0x648B7CDF, (q31_t)0xB0A1F71C, (q31_t)0x646C59BF, + (q31_t)0xB07A8D97, (q31_t)0x644D2722, (q31_t)0xB0533055, + (q31_t)0x642DE50D, (q31_t)0xB02BDF5C, (q31_t)0x640E9385, + (q31_t)0xB0049AB2, (q31_t)0x63EF328F, (q31_t)0xAFDD625F, + (q31_t)0x63CFC230, (q31_t)0xAFB63667, (q31_t)0x63B0426D, + (q31_t)0xAF8F16D0, (q31_t)0x6390B34A, (q31_t)0xAF6803A1, + (q31_t)0x637114CC, (q31_t)0xAF40FCE0, (q31_t)0x635166F8, + (q31_t)0xAF1A0293, (q31_t)0x6331A9D4, (q31_t)0xAEF314BF, + (q31_t)0x6311DD63, (q31_t)0xAECC336B, (q31_t)0x62F201AC, + (q31_t)0xAEA55E9D, (q31_t)0x62D216B2, (q31_t)0xAE7E965B, + (q31_t)0x62B21C7B, (q31_t)0xAE57DAAA, (q31_t)0x6292130C, + (q31_t)0xAE312B91, (q31_t)0x6271FA69, (q31_t)0xAE0A8916, + (q31_t)0x6251D297, (q31_t)0xADE3F33E, (q31_t)0x62319B9D, + (q31_t)0xADBD6A10, (q31_t)0x6211557D, (q31_t)0xAD96ED91, + (q31_t)0x61F1003E, (q31_t)0xAD707DC8, (q31_t)0x61D09BE5, + (q31_t)0xAD4A1ABA, (q31_t)0x61B02876, (q31_t)0xAD23C46D, + (q31_t)0x618FA5F6, (q31_t)0xACFD7AE8, (q31_t)0x616F146B, + (q31_t)0xACD73E30, (q31_t)0x614E73D9, (q31_t)0xACB10E4A, + (q31_t)0x612DC446, (q31_t)0xAC8AEB3E, (q31_t)0x610D05B7, + (q31_t)0xAC64D510, (q31_t)0x60EC3830, (q31_t)0xAC3ECBC7, + (q31_t)0x60CB5BB6, (q31_t)0xAC18CF68, (q31_t)0x60AA704F, + (q31_t)0xABF2DFFA, (q31_t)0x60897600, (q31_t)0xABCCFD82, + (q31_t)0x60686CCE, (q31_t)0xABA72806, (q31_t)0x604754BE, + (q31_t)0xAB815F8C, (q31_t)0x60262DD5, (q31_t)0xAB5BA41A, + (q31_t)0x6004F818, (q31_t)0xAB35F5B5, (q31_t)0x5FE3B38D, + (q31_t)0xAB105464, (q31_t)0x5FC26038, (q31_t)0xAAEAC02B, + (q31_t)0x5FA0FE1E, (q31_t)0xAAC53912, (q31_t)0x5F7F8D46, + (q31_t)0xAA9FBF1D, (q31_t)0x5F5E0DB3, (q31_t)0xAA7A5253, + (q31_t)0x5F3C7F6B, (q31_t)0xAA54F2B9, (q31_t)0x5F1AE273, + (q31_t)0xAA2FA055, (q31_t)0x5EF936D1, (q31_t)0xAA0A5B2D, + (q31_t)0x5ED77C89, (q31_t)0xA9E52347, (q31_t)0x5EB5B3A1, + (q31_t)0xA9BFF8A8, (q31_t)0x5E93DC1F, (q31_t)0xA99ADB56, + (q31_t)0x5E71F606, (q31_t)0xA975CB56, (q31_t)0x5E50015D, + (q31_t)0xA950C8AF, (q31_t)0x5E2DFE28, (q31_t)0xA92BD366, + (q31_t)0x5E0BEC6E, (q31_t)0xA906EB81, (q31_t)0x5DE9CC32, + (q31_t)0xA8E21106, (q31_t)0x5DC79D7C, (q31_t)0xA8BD43FA, + (q31_t)0x5DA5604E, (q31_t)0xA8988463, (q31_t)0x5D8314B0, + (q31_t)0xA873D246, (q31_t)0x5D60BAA6, (q31_t)0xA84F2DA9, + (q31_t)0x5D3E5236, (q31_t)0xA82A9693, (q31_t)0x5D1BDB65, + (q31_t)0xA8060D08, (q31_t)0x5CF95638, (q31_t)0xA7E1910E, + (q31_t)0x5CD6C2B4, (q31_t)0xA7BD22AB, (q31_t)0x5CB420DF, + (q31_t)0xA798C1E4, (q31_t)0x5C9170BF, (q31_t)0xA7746EC0, + (q31_t)0x5C6EB258, (q31_t)0xA7502943, (q31_t)0x5C4BE5B0, + (q31_t)0xA72BF173, (q31_t)0x5C290ACC, (q31_t)0xA707C756, + (q31_t)0x5C0621B2, (q31_t)0xA6E3AAF2, (q31_t)0x5BE32A67, + (q31_t)0xA6BF9C4B, (q31_t)0x5BC024F0, (q31_t)0xA69B9B68, + (q31_t)0x5B9D1153, (q31_t)0xA677A84E, (q31_t)0x5B79EF96, + (q31_t)0xA653C302, (q31_t)0x5B56BFBD, (q31_t)0xA62FEB8B, + (q31_t)0x5B3381CE, (q31_t)0xA60C21ED, (q31_t)0x5B1035CF, + (q31_t)0xA5E8662F, (q31_t)0x5AECDBC4, (q31_t)0xA5C4B855, + (q31_t)0x5AC973B4, (q31_t)0xA5A11865, (q31_t)0x5AA5FDA4, + (q31_t)0xA57D8666, (q31_t)0x5A82799A, (q31_t)0xA55A025B, + (q31_t)0x5A5EE79A, (q31_t)0xA5368C4B, (q31_t)0x5A3B47AA, + (q31_t)0xA513243B, (q31_t)0x5A1799D0, (q31_t)0xA4EFCA31, + (q31_t)0x59F3DE12, (q31_t)0xA4CC7E31, (q31_t)0x59D01474, + (q31_t)0xA4A94042, (q31_t)0x59AC3CFD, (q31_t)0xA4861069, + (q31_t)0x598857B1, (q31_t)0xA462EEAC, (q31_t)0x59646497, + (q31_t)0xA43FDB0F, (q31_t)0x594063B4, (q31_t)0xA41CD598, + (q31_t)0x591C550E, (q31_t)0xA3F9DE4D, (q31_t)0x58F838A9, + (q31_t)0xA3D6F533, (q31_t)0x58D40E8C, (q31_t)0xA3B41A4F, + (q31_t)0x58AFD6BC, (q31_t)0xA3914DA7, (q31_t)0x588B913F, + (q31_t)0xA36E8F40, (q31_t)0x58673E1B, (q31_t)0xA34BDF20, + (q31_t)0x5842DD54, (q31_t)0xA3293D4B, (q31_t)0x581E6EF1, + (q31_t)0xA306A9C7, (q31_t)0x57F9F2F7, (q31_t)0xA2E4249A, + (q31_t)0x57D5696C, (q31_t)0xA2C1ADC9, (q31_t)0x57B0D256, + (q31_t)0xA29F4559, (q31_t)0x578C2DB9, (q31_t)0xA27CEB4F, + (q31_t)0x57677B9D, (q31_t)0xA25A9FB1, (q31_t)0x5742BC05, + (q31_t)0xA2386283, (q31_t)0x571DEEF9, (q31_t)0xA21633CD, + (q31_t)0x56F9147E, (q31_t)0xA1F41391, (q31_t)0x56D42C99, + (q31_t)0xA1D201D7, (q31_t)0x56AF3750, (q31_t)0xA1AFFEA2, + (q31_t)0x568A34A9, (q31_t)0xA18E09F9, (q31_t)0x566524AA, + (q31_t)0xA16C23E1, (q31_t)0x56400757, (q31_t)0xA14A4C5E, + (q31_t)0x561ADCB8, (q31_t)0xA1288376, (q31_t)0x55F5A4D2, + (q31_t)0xA106C92E, (q31_t)0x55D05FAA, (q31_t)0xA0E51D8C, + (q31_t)0x55AB0D46, (q31_t)0xA0C38094, (q31_t)0x5585ADAC, + (q31_t)0xA0A1F24C, (q31_t)0x556040E2, (q31_t)0xA08072BA, + (q31_t)0x553AC6ED, (q31_t)0xA05F01E1, (q31_t)0x55153FD4, + (q31_t)0xA03D9FC7, (q31_t)0x54EFAB9C, (q31_t)0xA01C4C72, + (q31_t)0x54CA0A4A, (q31_t)0x9FFB07E7, (q31_t)0x54A45BE5, + (q31_t)0x9FD9D22A, (q31_t)0x547EA073, (q31_t)0x9FB8AB41, + (q31_t)0x5458D7F9, (q31_t)0x9F979331, (q31_t)0x5433027D, + (q31_t)0x9F7689FF, (q31_t)0x540D2005, (q31_t)0x9F558FB0, + (q31_t)0x53E73097, (q31_t)0x9F34A449, (q31_t)0x53C13438, + (q31_t)0x9F13C7D0, (q31_t)0x539B2AEF, (q31_t)0x9EF2FA48, + (q31_t)0x537514C1, (q31_t)0x9ED23BB9, (q31_t)0x534EF1B5, + (q31_t)0x9EB18C26, (q31_t)0x5328C1D0, (q31_t)0x9E90EB94, + (q31_t)0x53028517, (q31_t)0x9E705A09, (q31_t)0x52DC3B92, + (q31_t)0x9E4FD789, (q31_t)0x52B5E545, (q31_t)0x9E2F641A, + (q31_t)0x528F8237, (q31_t)0x9E0EFFC1, (q31_t)0x5269126E, + (q31_t)0x9DEEAA82, (q31_t)0x524295EF, (q31_t)0x9DCE6462, + (q31_t)0x521C0CC1, (q31_t)0x9DAE2D68, (q31_t)0x51F576E9, + (q31_t)0x9D8E0596, (q31_t)0x51CED46E, (q31_t)0x9D6DECF4, + (q31_t)0x51A82555, (q31_t)0x9D4DE384, (q31_t)0x518169A4, + (q31_t)0x9D2DE94D, (q31_t)0x515AA162, (q31_t)0x9D0DFE53, + (q31_t)0x5133CC94, (q31_t)0x9CEE229C, (q31_t)0x510CEB40, + (q31_t)0x9CCE562B, (q31_t)0x50E5FD6C, (q31_t)0x9CAE9907, + (q31_t)0x50BF031F, (q31_t)0x9C8EEB33, (q31_t)0x5097FC5E, + (q31_t)0x9C6F4CB5, (q31_t)0x5070E92F, (q31_t)0x9C4FBD92, + (q31_t)0x5049C999, (q31_t)0x9C303DCF, (q31_t)0x50229DA0, + (q31_t)0x9C10CD70, (q31_t)0x4FFB654D, (q31_t)0x9BF16C7A, + (q31_t)0x4FD420A3, (q31_t)0x9BD21AF2, (q31_t)0x4FACCFAB, + (q31_t)0x9BB2D8DD, (q31_t)0x4F857268, (q31_t)0x9B93A640, + (q31_t)0x4F5E08E3, (q31_t)0x9B748320, (q31_t)0x4F369320, + (q31_t)0x9B556F80, (q31_t)0x4F0F1126, (q31_t)0x9B366B67, + (q31_t)0x4EE782FA, (q31_t)0x9B1776D9, (q31_t)0x4EBFE8A4, + (q31_t)0x9AF891DB, (q31_t)0x4E984229, (q31_t)0x9AD9BC71, + (q31_t)0x4E708F8F, (q31_t)0x9ABAF6A0, (q31_t)0x4E48D0DC, + (q31_t)0x9A9C406D, (q31_t)0x4E210617, (q31_t)0x9A7D99DD, + (q31_t)0x4DF92F45, (q31_t)0x9A5F02F5, (q31_t)0x4DD14C6E, + (q31_t)0x9A407BB8, (q31_t)0x4DA95D96, (q31_t)0x9A22042C, + (q31_t)0x4D8162C4, (q31_t)0x9A039C56, (q31_t)0x4D595BFE, + (q31_t)0x99E5443A, (q31_t)0x4D31494B, (q31_t)0x99C6FBDE, + (q31_t)0x4D092AB0, (q31_t)0x99A8C344, (q31_t)0x4CE10034, + (q31_t)0x998A9A73, (q31_t)0x4CB8C9DD, (q31_t)0x996C816F, + (q31_t)0x4C9087B1, (q31_t)0x994E783C, (q31_t)0x4C6839B6, + (q31_t)0x99307EE0, (q31_t)0x4C3FDFF3, (q31_t)0x9912955E, + (q31_t)0x4C177A6E, (q31_t)0x98F4BBBC, (q31_t)0x4BEF092D, + (q31_t)0x98D6F1FE, (q31_t)0x4BC68C36, (q31_t)0x98B93828, + (q31_t)0x4B9E038F, (q31_t)0x989B8E3F, (q31_t)0x4B756F3F, + (q31_t)0x987DF449, (q31_t)0x4B4CCF4D, (q31_t)0x98606A48, + (q31_t)0x4B2423BD, (q31_t)0x9842F043, (q31_t)0x4AFB6C97, + (q31_t)0x9825863D, (q31_t)0x4AD2A9E1, (q31_t)0x98082C3B, + (q31_t)0x4AA9DBA1, (q31_t)0x97EAE241, (q31_t)0x4A8101DE, + (q31_t)0x97CDA855, (q31_t)0x4A581C9D, (q31_t)0x97B07E7A, + (q31_t)0x4A2F2BE5, (q31_t)0x979364B5, (q31_t)0x4A062FBD, + (q31_t)0x97765B0A, (q31_t)0x49DD282A, (q31_t)0x9759617E, + (q31_t)0x49B41533, (q31_t)0x973C7816, (q31_t)0x498AF6DE, + (q31_t)0x971F9ED6, (q31_t)0x4961CD32, (q31_t)0x9702D5C2, + (q31_t)0x49389836, (q31_t)0x96E61CDF, (q31_t)0x490F57EE, + (q31_t)0x96C97431, (q31_t)0x48E60C62, (q31_t)0x96ACDBBD, + (q31_t)0x48BCB598, (q31_t)0x96905387, (q31_t)0x48935397, + (q31_t)0x9673DB94, (q31_t)0x4869E664, (q31_t)0x965773E7, + (q31_t)0x48406E07, (q31_t)0x963B1C85, (q31_t)0x4816EA85, + (q31_t)0x961ED573, (q31_t)0x47ED5BE6, (q31_t)0x96029EB5, + (q31_t)0x47C3C22E, (q31_t)0x95E6784F, (q31_t)0x479A1D66, + (q31_t)0x95CA6246, (q31_t)0x47706D93, (q31_t)0x95AE5C9E, + (q31_t)0x4746B2BC, (q31_t)0x9592675B, (q31_t)0x471CECE6, + (q31_t)0x95768282, (q31_t)0x46F31C1A, (q31_t)0x955AAE17, + (q31_t)0x46C9405C, (q31_t)0x953EEA1E, (q31_t)0x469F59B4, + (q31_t)0x9523369B, (q31_t)0x46756827, (q31_t)0x95079393, + (q31_t)0x464B6BBD, (q31_t)0x94EC010B, (q31_t)0x4621647C, + (q31_t)0x94D07F05, (q31_t)0x45F7526B, (q31_t)0x94B50D87, + (q31_t)0x45CD358F, (q31_t)0x9499AC95, (q31_t)0x45A30DF0, + (q31_t)0x947E5C32, (q31_t)0x4578DB93, (q31_t)0x94631C64, + (q31_t)0x454E9E80, (q31_t)0x9447ED2F, (q31_t)0x452456BC, + (q31_t)0x942CCE95, (q31_t)0x44FA044F, (q31_t)0x9411C09D, + (q31_t)0x44CFA73F, (q31_t)0x93F6C34A, (q31_t)0x44A53F93, + (q31_t)0x93DBD69F, (q31_t)0x447ACD50, (q31_t)0x93C0FAA2, + (q31_t)0x4450507E, (q31_t)0x93A62F56, (q31_t)0x4425C923, + (q31_t)0x938B74C0, (q31_t)0x43FB3745, (q31_t)0x9370CAE4, + (q31_t)0x43D09AEC, (q31_t)0x935631C5, (q31_t)0x43A5F41E, + (q31_t)0x933BA968, (q31_t)0x437B42E1, (q31_t)0x932131D1, + (q31_t)0x4350873C, (q31_t)0x9306CB04, (q31_t)0x4325C135, + (q31_t)0x92EC7505, (q31_t)0x42FAF0D4, (q31_t)0x92D22FD8, + (q31_t)0x42D0161E, (q31_t)0x92B7FB82, (q31_t)0x42A5311A, + (q31_t)0x929DD805, (q31_t)0x427A41D0, (q31_t)0x9283C567, + (q31_t)0x424F4845, (q31_t)0x9269C3AC, (q31_t)0x42244480, + (q31_t)0x924FD2D6, (q31_t)0x41F93688, (q31_t)0x9235F2EB, + (q31_t)0x41CE1E64, (q31_t)0x921C23EE, (q31_t)0x41A2FC1A, + (q31_t)0x920265E4, (q31_t)0x4177CFB0, (q31_t)0x91E8B8D0, + (q31_t)0x414C992E, (q31_t)0x91CF1CB6, (q31_t)0x4121589A, + (q31_t)0x91B5919A, (q31_t)0x40F60DFB, (q31_t)0x919C1780, + (q31_t)0x40CAB957, (q31_t)0x9182AE6C, (q31_t)0x409F5AB6, + (q31_t)0x91695663, (q31_t)0x4073F21D, (q31_t)0x91500F67, + (q31_t)0x40487F93, (q31_t)0x9136D97D, (q31_t)0x401D0320, + (q31_t)0x911DB4A8, (q31_t)0x3FF17CCA, (q31_t)0x9104A0ED, + (q31_t)0x3FC5EC97, (q31_t)0x90EB9E50, (q31_t)0x3F9A528F, + (q31_t)0x90D2ACD3, (q31_t)0x3F6EAEB8, (q31_t)0x90B9CC7C, + (q31_t)0x3F430118, (q31_t)0x90A0FD4E, (q31_t)0x3F1749B7, + (q31_t)0x90883F4C, (q31_t)0x3EEB889C, (q31_t)0x906F927B, + (q31_t)0x3EBFBDCC, (q31_t)0x9056F6DF, (q31_t)0x3E93E94F, + (q31_t)0x903E6C7A, (q31_t)0x3E680B2C, (q31_t)0x9025F352, + (q31_t)0x3E3C2369, (q31_t)0x900D8B69, (q31_t)0x3E10320D, + (q31_t)0x8FF534C4, (q31_t)0x3DE4371F, (q31_t)0x8FDCEF66, + (q31_t)0x3DB832A5, (q31_t)0x8FC4BB53, (q31_t)0x3D8C24A7, + (q31_t)0x8FAC988E, (q31_t)0x3D600D2B, (q31_t)0x8F94871D, + (q31_t)0x3D33EC39, (q31_t)0x8F7C8701, (q31_t)0x3D07C1D5, + (q31_t)0x8F64983F, (q31_t)0x3CDB8E09, (q31_t)0x8F4CBADB, + (q31_t)0x3CAF50DA, (q31_t)0x8F34EED8, (q31_t)0x3C830A4F, + (q31_t)0x8F1D343A, (q31_t)0x3C56BA70, (q31_t)0x8F058B04, + (q31_t)0x3C2A6142, (q31_t)0x8EEDF33B, (q31_t)0x3BFDFECD, + (q31_t)0x8ED66CE1, (q31_t)0x3BD19317, (q31_t)0x8EBEF7FB, + (q31_t)0x3BA51E29, (q31_t)0x8EA7948C, (q31_t)0x3B78A007, + (q31_t)0x8E904298, (q31_t)0x3B4C18BA, (q31_t)0x8E790222, + (q31_t)0x3B1F8847, (q31_t)0x8E61D32D, (q31_t)0x3AF2EEB7, + (q31_t)0x8E4AB5BF, (q31_t)0x3AC64C0F, (q31_t)0x8E33A9D9, + (q31_t)0x3A99A057, (q31_t)0x8E1CAF80, (q31_t)0x3A6CEB95, + (q31_t)0x8E05C6B7, (q31_t)0x3A402DD1, (q31_t)0x8DEEEF82, + (q31_t)0x3A136712, (q31_t)0x8DD829E4, (q31_t)0x39E6975D, + (q31_t)0x8DC175E0, (q31_t)0x39B9BEBB, (q31_t)0x8DAAD37B, + (q31_t)0x398CDD32, (q31_t)0x8D9442B7, (q31_t)0x395FF2C9, + (q31_t)0x8D7DC399, (q31_t)0x3932FF87, (q31_t)0x8D675623, + (q31_t)0x39060372, (q31_t)0x8D50FA59, (q31_t)0x38D8FE93, + (q31_t)0x8D3AB03F, (q31_t)0x38ABF0EF, (q31_t)0x8D2477D8, + (q31_t)0x387EDA8E, (q31_t)0x8D0E5127, (q31_t)0x3851BB76, + (q31_t)0x8CF83C30, (q31_t)0x382493B0, (q31_t)0x8CE238F6, + (q31_t)0x37F76340, (q31_t)0x8CCC477D, (q31_t)0x37CA2A30, + (q31_t)0x8CB667C7, (q31_t)0x379CE884, (q31_t)0x8CA099D9, + (q31_t)0x376F9E46, (q31_t)0x8C8ADDB6, (q31_t)0x37424B7A, + (q31_t)0x8C753361, (q31_t)0x3714F02A, (q31_t)0x8C5F9ADD, + (q31_t)0x36E78C5A, (q31_t)0x8C4A142F, (q31_t)0x36BA2013, + (q31_t)0x8C349F58, (q31_t)0x368CAB5C, (q31_t)0x8C1F3C5C, + (q31_t)0x365F2E3B, (q31_t)0x8C09EB40, (q31_t)0x3631A8B7, + (q31_t)0x8BF4AC05, (q31_t)0x36041AD9, (q31_t)0x8BDF7EAF, + (q31_t)0x35D684A5, (q31_t)0x8BCA6342, (q31_t)0x35A8E624, + (q31_t)0x8BB559C1, (q31_t)0x357B3F5D, (q31_t)0x8BA0622F, + (q31_t)0x354D9056, (q31_t)0x8B8B7C8F, (q31_t)0x351FD917, + (q31_t)0x8B76A8E4, (q31_t)0x34F219A7, (q31_t)0x8B61E732, + (q31_t)0x34C4520D, (q31_t)0x8B4D377C, (q31_t)0x3496824F, + (q31_t)0x8B3899C5, (q31_t)0x3468AA76, (q31_t)0x8B240E10, + (q31_t)0x343ACA87, (q31_t)0x8B0F9461, (q31_t)0x340CE28A, + (q31_t)0x8AFB2CBA, (q31_t)0x33DEF287, (q31_t)0x8AE6D71F, + (q31_t)0x33B0FA84, (q31_t)0x8AD29393, (q31_t)0x3382FA88, + (q31_t)0x8ABE6219, (q31_t)0x3354F29A, (q31_t)0x8AAA42B4, + (q31_t)0x3326E2C2, (q31_t)0x8A963567, (q31_t)0x32F8CB07, + (q31_t)0x8A823A35, (q31_t)0x32CAAB6F, (q31_t)0x8A6E5122, + (q31_t)0x329C8402, (q31_t)0x8A5A7A30, (q31_t)0x326E54C7, + (q31_t)0x8A46B563, (q31_t)0x32401DC5, (q31_t)0x8A3302BD, + (q31_t)0x3211DF03, (q31_t)0x8A1F6242, (q31_t)0x31E39889, + (q31_t)0x8A0BD3F5, (q31_t)0x31B54A5D, (q31_t)0x89F857D8, + (q31_t)0x3186F487, (q31_t)0x89E4EDEE, (q31_t)0x3158970D, + (q31_t)0x89D1963C, (q31_t)0x312A31F8, (q31_t)0x89BE50C3, + (q31_t)0x30FBC54D, (q31_t)0x89AB1D86, (q31_t)0x30CD5114, + (q31_t)0x8997FC89, (q31_t)0x309ED555, (q31_t)0x8984EDCF, + (q31_t)0x30705217, (q31_t)0x8971F15A, (q31_t)0x3041C760, + (q31_t)0x895F072D, (q31_t)0x30133538, (q31_t)0x894C2F4C, + (q31_t)0x2FE49BA6, (q31_t)0x893969B9, (q31_t)0x2FB5FAB2, + (q31_t)0x8926B677, (q31_t)0x2F875262, (q31_t)0x89141589, + (q31_t)0x2F58A2BD, (q31_t)0x890186F1, (q31_t)0x2F29EBCC, + (q31_t)0x88EF0AB4, (q31_t)0x2EFB2D94, (q31_t)0x88DCA0D3, + (q31_t)0x2ECC681E, (q31_t)0x88CA4951, (q31_t)0x2E9D9B70, + (q31_t)0x88B80431, (q31_t)0x2E6EC792, (q31_t)0x88A5D177, + (q31_t)0x2E3FEC8B, (q31_t)0x8893B124, (q31_t)0x2E110A62, + (q31_t)0x8881A33C, (q31_t)0x2DE2211E, (q31_t)0x886FA7C2, + (q31_t)0x2DB330C7, (q31_t)0x885DBEB7, (q31_t)0x2D843963, + (q31_t)0x884BE820, (q31_t)0x2D553AFB, (q31_t)0x883A23FE, + (q31_t)0x2D263595, (q31_t)0x88287255, (q31_t)0x2CF72939, + (q31_t)0x8816D327, (q31_t)0x2CC815ED, (q31_t)0x88054677, + (q31_t)0x2C98FBBA, (q31_t)0x87F3CC47, (q31_t)0x2C69DAA6, + (q31_t)0x87E2649B, (q31_t)0x2C3AB2B9, (q31_t)0x87D10F75, + (q31_t)0x2C0B83F9, (q31_t)0x87BFCCD7, (q31_t)0x2BDC4E6F, + (q31_t)0x87AE9CC5, (q31_t)0x2BAD1221, (q31_t)0x879D7F40, + (q31_t)0x2B7DCF17, (q31_t)0x878C744C, (q31_t)0x2B4E8558, + (q31_t)0x877B7BEC, (q31_t)0x2B1F34EB, (q31_t)0x876A9621, + (q31_t)0x2AEFDDD8, (q31_t)0x8759C2EF, (q31_t)0x2AC08025, + (q31_t)0x87490257, (q31_t)0x2A911BDB, (q31_t)0x8738545E, + (q31_t)0x2A61B101, (q31_t)0x8727B904, (q31_t)0x2A323F9D, + (q31_t)0x8717304E, (q31_t)0x2A02C7B8, (q31_t)0x8706BA3C, + (q31_t)0x29D34958, (q31_t)0x86F656D3, (q31_t)0x29A3C484, + (q31_t)0x86E60614, (q31_t)0x29743945, (q31_t)0x86D5C802, + (q31_t)0x2944A7A2, (q31_t)0x86C59C9F, (q31_t)0x29150FA1, + (q31_t)0x86B583EE, (q31_t)0x28E5714A, (q31_t)0x86A57DF1, + (q31_t)0x28B5CCA5, (q31_t)0x86958AAB, (q31_t)0x288621B9, + (q31_t)0x8685AA1F, (q31_t)0x2856708C, (q31_t)0x8675DC4E, + (q31_t)0x2826B928, (q31_t)0x8666213C, (q31_t)0x27F6FB92, + (q31_t)0x865678EA, (q31_t)0x27C737D2, (q31_t)0x8646E35B, + (q31_t)0x27976DF1, (q31_t)0x86376092, (q31_t)0x27679DF4, + (q31_t)0x8627F090, (q31_t)0x2737C7E3, (q31_t)0x86189359, + (q31_t)0x2707EBC6, (q31_t)0x860948EE, (q31_t)0x26D809A5, + (q31_t)0x85FA1152, (q31_t)0x26A82185, (q31_t)0x85EAEC88, + (q31_t)0x26783370, (q31_t)0x85DBDA91, (q31_t)0x26483F6C, + (q31_t)0x85CCDB70, (q31_t)0x26184581, (q31_t)0x85BDEF27, + (q31_t)0x25E845B5, (q31_t)0x85AF15B9, (q31_t)0x25B84012, + (q31_t)0x85A04F28, (q31_t)0x2588349D, (q31_t)0x85919B75, + (q31_t)0x2558235E, (q31_t)0x8582FAA4, (q31_t)0x25280C5D, + (q31_t)0x85746CB7, (q31_t)0x24F7EFA1, (q31_t)0x8565F1B0, + (q31_t)0x24C7CD32, (q31_t)0x85578991, (q31_t)0x2497A517, + (q31_t)0x8549345C, (q31_t)0x24677757, (q31_t)0x853AF214, + (q31_t)0x243743FA, (q31_t)0x852CC2BA, (q31_t)0x24070B07, + (q31_t)0x851EA652, (q31_t)0x23D6CC86, (q31_t)0x85109CDC, + (q31_t)0x23A6887E, (q31_t)0x8502A65C, (q31_t)0x23763EF7, + (q31_t)0x84F4C2D3, (q31_t)0x2345EFF7, (q31_t)0x84E6F244, + (q31_t)0x23159B87, (q31_t)0x84D934B0, (q31_t)0x22E541AE, + (q31_t)0x84CB8A1B, (q31_t)0x22B4E274, (q31_t)0x84BDF285, + (q31_t)0x22847DDF, (q31_t)0x84B06DF1, (q31_t)0x225413F8, + (q31_t)0x84A2FC62, (q31_t)0x2223A4C5, (q31_t)0x84959DD9, + (q31_t)0x21F3304E, (q31_t)0x84885257, (q31_t)0x21C2B69C, + (q31_t)0x847B19E1, (q31_t)0x219237B4, (q31_t)0x846DF476, + (q31_t)0x2161B39F, (q31_t)0x8460E21A, (q31_t)0x21312A65, + (q31_t)0x8453E2CE, (q31_t)0x21009C0B, (q31_t)0x8446F695, + (q31_t)0x20D0089B, (q31_t)0x843A1D70, (q31_t)0x209F701C, + (q31_t)0x842D5761, (q31_t)0x206ED295, (q31_t)0x8420A46B, + (q31_t)0x203E300D, (q31_t)0x8414048F, (q31_t)0x200D888C, + (q31_t)0x840777CF, (q31_t)0x1FDCDC1A, (q31_t)0x83FAFE2E, + (q31_t)0x1FAC2ABF, (q31_t)0x83EE97AC, (q31_t)0x1F7B7480, + (q31_t)0x83E2444D, (q31_t)0x1F4AB967, (q31_t)0x83D60411, + (q31_t)0x1F19F97B, (q31_t)0x83C9D6FB, (q31_t)0x1EE934C2, + (q31_t)0x83BDBD0D, (q31_t)0x1EB86B46, (q31_t)0x83B1B649, + (q31_t)0x1E879D0C, (q31_t)0x83A5C2B0, (q31_t)0x1E56CA1E, + (q31_t)0x8399E244, (q31_t)0x1E25F281, (q31_t)0x838E1507, + (q31_t)0x1DF5163F, (q31_t)0x83825AFB, (q31_t)0x1DC4355D, + (q31_t)0x8376B422, (q31_t)0x1D934FE5, (q31_t)0x836B207D, + (q31_t)0x1D6265DD, (q31_t)0x835FA00E, (q31_t)0x1D31774D, + (q31_t)0x835432D8, (q31_t)0x1D00843C, (q31_t)0x8348D8DB, + (q31_t)0x1CCF8CB3, (q31_t)0x833D921A, (q31_t)0x1C9E90B8, + (q31_t)0x83325E97, (q31_t)0x1C6D9053, (q31_t)0x83273E52, + (q31_t)0x1C3C8B8C, (q31_t)0x831C314E, (q31_t)0x1C0B826A, + (q31_t)0x8311378C, (q31_t)0x1BDA74F5, (q31_t)0x8306510F, + (q31_t)0x1BA96334, (q31_t)0x82FB7DD8, (q31_t)0x1B784D30, + (q31_t)0x82F0BDE8, (q31_t)0x1B4732EF, (q31_t)0x82E61141, + (q31_t)0x1B161479, (q31_t)0x82DB77E5, (q31_t)0x1AE4F1D6, + (q31_t)0x82D0F1D5, (q31_t)0x1AB3CB0C, (q31_t)0x82C67F13, + (q31_t)0x1A82A025, (q31_t)0x82BC1FA1, (q31_t)0x1A517127, + (q31_t)0x82B1D381, (q31_t)0x1A203E1B, (q31_t)0x82A79AB3, + (q31_t)0x19EF0706, (q31_t)0x829D753A, (q31_t)0x19BDCBF2, + (q31_t)0x82936316, (q31_t)0x198C8CE6, (q31_t)0x8289644A, + (q31_t)0x195B49E9, (q31_t)0x827F78D8, (q31_t)0x192A0303, + (q31_t)0x8275A0C0, (q31_t)0x18F8B83C, (q31_t)0x826BDC04, + (q31_t)0x18C7699B, (q31_t)0x82622AA5, (q31_t)0x18961727, + (q31_t)0x82588CA6, (q31_t)0x1864C0E9, (q31_t)0x824F0208, + (q31_t)0x183366E8, (q31_t)0x82458ACB, (q31_t)0x1802092C, + (q31_t)0x823C26F2, (q31_t)0x17D0A7BB, (q31_t)0x8232D67E, + (q31_t)0x179F429F, (q31_t)0x82299971, (q31_t)0x176DD9DE, + (q31_t)0x82206FCB, (q31_t)0x173C6D80, (q31_t)0x8217598F, + (q31_t)0x170AFD8D, (q31_t)0x820E56BE, (q31_t)0x16D98A0C, + (q31_t)0x82056758, (q31_t)0x16A81305, (q31_t)0x81FC8B60, + (q31_t)0x1676987F, (q31_t)0x81F3C2D7, (q31_t)0x16451A83, + (q31_t)0x81EB0DBD, (q31_t)0x16139917, (q31_t)0x81E26C16, + (q31_t)0x15E21444, (q31_t)0x81D9DDE1, (q31_t)0x15B08C11, + (q31_t)0x81D16320, (q31_t)0x157F0086, (q31_t)0x81C8FBD5, + (q31_t)0x154D71AA, (q31_t)0x81C0A801, (q31_t)0x151BDF85, + (q31_t)0x81B867A4, (q31_t)0x14EA4A1F, (q31_t)0x81B03AC1, + (q31_t)0x14B8B17F, (q31_t)0x81A82159, (q31_t)0x148715AD, + (q31_t)0x81A01B6C, (q31_t)0x145576B1, (q31_t)0x819828FD, + (q31_t)0x1423D492, (q31_t)0x81904A0C, (q31_t)0x13F22F57, + (q31_t)0x81887E9A, (q31_t)0x13C0870A, (q31_t)0x8180C6A9, + (q31_t)0x138EDBB0, (q31_t)0x8179223A, (q31_t)0x135D2D53, + (q31_t)0x8171914E, (q31_t)0x132B7BF9, (q31_t)0x816A13E6, + (q31_t)0x12F9C7AA, (q31_t)0x8162AA03, (q31_t)0x12C8106E, + (q31_t)0x815B53A8, (q31_t)0x1296564D, (q31_t)0x815410D3, + (q31_t)0x1264994E, (q31_t)0x814CE188, (q31_t)0x1232D978, + (q31_t)0x8145C5C6, (q31_t)0x120116D4, (q31_t)0x813EBD90, + (q31_t)0x11CF516A, (q31_t)0x8137C8E6, (q31_t)0x119D8940, + (q31_t)0x8130E7C8, (q31_t)0x116BBE5F, (q31_t)0x812A1A39, + (q31_t)0x1139F0CE, (q31_t)0x81236039, (q31_t)0x11082096, + (q31_t)0x811CB9CA, (q31_t)0x10D64DBC, (q31_t)0x811626EC, + (q31_t)0x10A4784A, (q31_t)0x810FA7A0, (q31_t)0x1072A047, + (q31_t)0x81093BE8, (q31_t)0x1040C5BB, (q31_t)0x8102E3C3, + (q31_t)0x100EE8AD, (q31_t)0x80FC9F35, (q31_t)0x0FDD0925, + (q31_t)0x80F66E3C, (q31_t)0x0FAB272B, (q31_t)0x80F050DB, + (q31_t)0x0F7942C6, (q31_t)0x80EA4712, (q31_t)0x0F475BFE, + (q31_t)0x80E450E2, (q31_t)0x0F1572DC, (q31_t)0x80DE6E4C, + (q31_t)0x0EE38765, (q31_t)0x80D89F51, (q31_t)0x0EB199A3, + (q31_t)0x80D2E3F1, (q31_t)0x0E7FA99D, (q31_t)0x80CD3C2F, + (q31_t)0x0E4DB75B, (q31_t)0x80C7A80A, (q31_t)0x0E1BC2E3, + (q31_t)0x80C22783, (q31_t)0x0DE9CC3F, (q31_t)0x80BCBA9C, + (q31_t)0x0DB7D376, (q31_t)0x80B76155, (q31_t)0x0D85D88F, + (q31_t)0x80B21BAF, (q31_t)0x0D53DB92, (q31_t)0x80ACE9AB, + (q31_t)0x0D21DC87, (q31_t)0x80A7CB49, (q31_t)0x0CEFDB75, + (q31_t)0x80A2C08B, (q31_t)0x0CBDD865, (q31_t)0x809DC970, + (q31_t)0x0C8BD35E, (q31_t)0x8098E5FB, (q31_t)0x0C59CC67, + (q31_t)0x8094162B, (q31_t)0x0C27C389, (q31_t)0x808F5A02, + (q31_t)0x0BF5B8CB, (q31_t)0x808AB180, (q31_t)0x0BC3AC35, + (q31_t)0x80861CA5, (q31_t)0x0B919DCE, (q31_t)0x80819B74, + (q31_t)0x0B5F8D9F, (q31_t)0x807D2DEB, (q31_t)0x0B2D7BAE, + (q31_t)0x8078D40D, (q31_t)0x0AFB6805, (q31_t)0x80748DD9, + (q31_t)0x0AC952AA, (q31_t)0x80705B50, (q31_t)0x0A973BA5, + (q31_t)0x806C3C73, (q31_t)0x0A6522FE, (q31_t)0x80683143, + (q31_t)0x0A3308BC, (q31_t)0x806439C0, (q31_t)0x0A00ECE8, + (q31_t)0x806055EA, (q31_t)0x09CECF89, (q31_t)0x805C85C3, + (q31_t)0x099CB0A7, (q31_t)0x8058C94C, (q31_t)0x096A9049, + (q31_t)0x80552083, (q31_t)0x09386E77, (q31_t)0x80518B6B, + (q31_t)0x09064B3A, (q31_t)0x804E0A03, (q31_t)0x08D42698, + (q31_t)0x804A9C4D, (q31_t)0x08A2009A, (q31_t)0x80474248, + (q31_t)0x086FD947, (q31_t)0x8043FBF6, (q31_t)0x083DB0A7, + (q31_t)0x8040C956, (q31_t)0x080B86C1, (q31_t)0x803DAA69, + (q31_t)0x07D95B9E, (q31_t)0x803A9F31, (q31_t)0x07A72F45, + (q31_t)0x8037A7AC, (q31_t)0x077501BE, (q31_t)0x8034C3DC, + (q31_t)0x0742D310, (q31_t)0x8031F3C1, (q31_t)0x0710A344, + (q31_t)0x802F375C, (q31_t)0x06DE7261, (q31_t)0x802C8EAD, + (q31_t)0x06AC406F, (q31_t)0x8029F9B4, (q31_t)0x067A0D75, + (q31_t)0x80277872, (q31_t)0x0647D97C, (q31_t)0x80250AE7, + (q31_t)0x0615A48A, (q31_t)0x8022B113, (q31_t)0x05E36EA9, + (q31_t)0x80206AF8, (q31_t)0x05B137DF, (q31_t)0x801E3894, + (q31_t)0x057F0034, (q31_t)0x801C19E9, (q31_t)0x054CC7B0, + (q31_t)0x801A0EF7, (q31_t)0x051A8E5C, (q31_t)0x801817BF, + (q31_t)0x04E8543D, (q31_t)0x80163440, (q31_t)0x04B6195D, + (q31_t)0x8014647A, (q31_t)0x0483DDC3, (q31_t)0x8012A86F, + (q31_t)0x0451A176, (q31_t)0x8011001E, (q31_t)0x041F647F, + (q31_t)0x800F6B88, (q31_t)0x03ED26E6, (q31_t)0x800DEAAC, + (q31_t)0x03BAE8B1, (q31_t)0x800C7D8C, (q31_t)0x0388A9E9, + (q31_t)0x800B2427, (q31_t)0x03566A96, (q31_t)0x8009DE7D, + (q31_t)0x03242ABF, (q31_t)0x8008AC90, (q31_t)0x02F1EA6B, + (q31_t)0x80078E5E, (q31_t)0x02BFA9A4, (q31_t)0x800683E8, + (q31_t)0x028D6870, (q31_t)0x80058D2E, (q31_t)0x025B26D7, + (q31_t)0x8004AA31, (q31_t)0x0228E4E1, (q31_t)0x8003DAF0, + (q31_t)0x01F6A296, (q31_t)0x80031F6C, (q31_t)0x01C45FFE, + (q31_t)0x800277A5, (q31_t)0x01921D1F, (q31_t)0x8001E39B, + (q31_t)0x015FDA03, (q31_t)0x8001634D, (q31_t)0x012D96B0, + (q31_t)0x8000F6BD, (q31_t)0x00FB532F, (q31_t)0x80009DE9, + (q31_t)0x00C90F88, (q31_t)0x800058D3, (q31_t)0x0096CBC1, + (q31_t)0x8000277A, (q31_t)0x006487E3, (q31_t)0x800009DE, + (q31_t)0x003243F5, (q31_t)0x80000000, (q31_t)0x00000000, + (q31_t)0x800009DE, (q31_t)0xFFCDBC0A, (q31_t)0x8000277A, + (q31_t)0xFF9B781D, (q31_t)0x800058D3, (q31_t)0xFF69343E, + (q31_t)0x80009DE9, (q31_t)0xFF36F078, (q31_t)0x8000F6BD, + (q31_t)0xFF04ACD0, (q31_t)0x8001634D, (q31_t)0xFED2694F, + (q31_t)0x8001E39B, (q31_t)0xFEA025FC, (q31_t)0x800277A5, + (q31_t)0xFE6DE2E0, (q31_t)0x80031F6C, (q31_t)0xFE3BA001, + (q31_t)0x8003DAF0, (q31_t)0xFE095D69, (q31_t)0x8004AA31, + (q31_t)0xFDD71B1E, (q31_t)0x80058D2E, (q31_t)0xFDA4D928, + (q31_t)0x800683E8, (q31_t)0xFD72978F, (q31_t)0x80078E5E, + (q31_t)0xFD40565B, (q31_t)0x8008AC90, (q31_t)0xFD0E1594, + (q31_t)0x8009DE7D, (q31_t)0xFCDBD541, (q31_t)0x800B2427, + (q31_t)0xFCA99569, (q31_t)0x800C7D8C, (q31_t)0xFC775616, + (q31_t)0x800DEAAC, (q31_t)0xFC45174E, (q31_t)0x800F6B88, + (q31_t)0xFC12D919, (q31_t)0x8011001E, (q31_t)0xFBE09B80, + (q31_t)0x8012A86F, (q31_t)0xFBAE5E89, (q31_t)0x8014647A, + (q31_t)0xFB7C223C, (q31_t)0x80163440, (q31_t)0xFB49E6A2, + (q31_t)0x801817BF, (q31_t)0xFB17ABC2, (q31_t)0x801A0EF7, + (q31_t)0xFAE571A4, (q31_t)0x801C19E9, (q31_t)0xFAB3384F, + (q31_t)0x801E3894, (q31_t)0xFA80FFCB, (q31_t)0x80206AF8, + (q31_t)0xFA4EC820, (q31_t)0x8022B113, (q31_t)0xFA1C9156, + (q31_t)0x80250AE7, (q31_t)0xF9EA5B75, (q31_t)0x80277872, + (q31_t)0xF9B82683, (q31_t)0x8029F9B4, (q31_t)0xF985F28A, + (q31_t)0x802C8EAD, (q31_t)0xF953BF90, (q31_t)0x802F375C, + (q31_t)0xF9218D9E, (q31_t)0x8031F3C1, (q31_t)0xF8EF5CBB, + (q31_t)0x8034C3DC, (q31_t)0xF8BD2CEF, (q31_t)0x8037A7AC, + (q31_t)0xF88AFE41, (q31_t)0x803A9F31, (q31_t)0xF858D0BA, + (q31_t)0x803DAA69, (q31_t)0xF826A461, (q31_t)0x8040C956, + (q31_t)0xF7F4793E, (q31_t)0x8043FBF6, (q31_t)0xF7C24F58, + (q31_t)0x80474248, (q31_t)0xF79026B8, (q31_t)0x804A9C4D, + (q31_t)0xF75DFF65, (q31_t)0x804E0A03, (q31_t)0xF72BD967, + (q31_t)0x80518B6B, (q31_t)0xF6F9B4C5, (q31_t)0x80552083, + (q31_t)0xF6C79188, (q31_t)0x8058C94C, (q31_t)0xF6956FB6, + (q31_t)0x805C85C3, (q31_t)0xF6634F58, (q31_t)0x806055EA, + (q31_t)0xF6313076, (q31_t)0x806439C0, (q31_t)0xF5FF1317, + (q31_t)0x80683143, (q31_t)0xF5CCF743, (q31_t)0x806C3C73, + (q31_t)0xF59ADD01, (q31_t)0x80705B50, (q31_t)0xF568C45A, + (q31_t)0x80748DD9, (q31_t)0xF536AD55, (q31_t)0x8078D40D, + (q31_t)0xF50497FA, (q31_t)0x807D2DEB, (q31_t)0xF4D28451, + (q31_t)0x80819B74, (q31_t)0xF4A07260, (q31_t)0x80861CA5, + (q31_t)0xF46E6231, (q31_t)0x808AB180, (q31_t)0xF43C53CA, + (q31_t)0x808F5A02, (q31_t)0xF40A4734, (q31_t)0x8094162B, + (q31_t)0xF3D83C76, (q31_t)0x8098E5FB, (q31_t)0xF3A63398, + (q31_t)0x809DC970, (q31_t)0xF3742CA1, (q31_t)0x80A2C08B, + (q31_t)0xF342279A, (q31_t)0x80A7CB49, (q31_t)0xF310248A, + (q31_t)0x80ACE9AB, (q31_t)0xF2DE2378, (q31_t)0x80B21BAF, + (q31_t)0xF2AC246D, (q31_t)0x80B76155, (q31_t)0xF27A2770, + (q31_t)0x80BCBA9C, (q31_t)0xF2482C89, (q31_t)0x80C22783, + (q31_t)0xF21633C0, (q31_t)0x80C7A80A, (q31_t)0xF1E43D1C, + (q31_t)0x80CD3C2F, (q31_t)0xF1B248A5, (q31_t)0x80D2E3F1, + (q31_t)0xF1805662, (q31_t)0x80D89F51, (q31_t)0xF14E665C, + (q31_t)0x80DE6E4C, (q31_t)0xF11C789A, (q31_t)0x80E450E2, + (q31_t)0xF0EA8D23, (q31_t)0x80EA4712, (q31_t)0xF0B8A401, + (q31_t)0x80F050DB, (q31_t)0xF086BD39, (q31_t)0x80F66E3C, + (q31_t)0xF054D8D4, (q31_t)0x80FC9F35, (q31_t)0xF022F6DA, + (q31_t)0x8102E3C3, (q31_t)0xEFF11752, (q31_t)0x81093BE8, + (q31_t)0xEFBF3A44, (q31_t)0x810FA7A0, (q31_t)0xEF8D5FB8, + (q31_t)0x811626EC, (q31_t)0xEF5B87B5, (q31_t)0x811CB9CA, + (q31_t)0xEF29B243, (q31_t)0x81236039, (q31_t)0xEEF7DF6A, + (q31_t)0x812A1A39, (q31_t)0xEEC60F31, (q31_t)0x8130E7C8, + (q31_t)0xEE9441A0, (q31_t)0x8137C8E6, (q31_t)0xEE6276BF, + (q31_t)0x813EBD90, (q31_t)0xEE30AE95, (q31_t)0x8145C5C6, + (q31_t)0xEDFEE92B, (q31_t)0x814CE188, (q31_t)0xEDCD2687, + (q31_t)0x815410D3, (q31_t)0xED9B66B2, (q31_t)0x815B53A8, + (q31_t)0xED69A9B2, (q31_t)0x8162AA03, (q31_t)0xED37EF91, + (q31_t)0x816A13E6, (q31_t)0xED063855, (q31_t)0x8171914E, + (q31_t)0xECD48406, (q31_t)0x8179223A, (q31_t)0xECA2D2AC, + (q31_t)0x8180C6A9, (q31_t)0xEC71244F, (q31_t)0x81887E9A, + (q31_t)0xEC3F78F5, (q31_t)0x81904A0C, (q31_t)0xEC0DD0A8, + (q31_t)0x819828FD, (q31_t)0xEBDC2B6D, (q31_t)0x81A01B6C, + (q31_t)0xEBAA894E, (q31_t)0x81A82159, (q31_t)0xEB78EA52, + (q31_t)0x81B03AC1, (q31_t)0xEB474E80, (q31_t)0x81B867A4, + (q31_t)0xEB15B5E0, (q31_t)0x81C0A801, (q31_t)0xEAE4207A, + (q31_t)0x81C8FBD5, (q31_t)0xEAB28E55, (q31_t)0x81D16320, + (q31_t)0xEA80FF79, (q31_t)0x81D9DDE1, (q31_t)0xEA4F73EE, + (q31_t)0x81E26C16, (q31_t)0xEA1DEBBB, (q31_t)0x81EB0DBD, + (q31_t)0xE9EC66E8, (q31_t)0x81F3C2D7, (q31_t)0xE9BAE57C, + (q31_t)0x81FC8B60, (q31_t)0xE9896780, (q31_t)0x82056758, + (q31_t)0xE957ECFB, (q31_t)0x820E56BE, (q31_t)0xE92675F4, + (q31_t)0x8217598F, (q31_t)0xE8F50273, (q31_t)0x82206FCB, + (q31_t)0xE8C3927F, (q31_t)0x82299971, (q31_t)0xE8922621, + (q31_t)0x8232D67E, (q31_t)0xE860BD60, (q31_t)0x823C26F2, + (q31_t)0xE82F5844, (q31_t)0x82458ACB, (q31_t)0xE7FDF6D3, + (q31_t)0x824F0208, (q31_t)0xE7CC9917, (q31_t)0x82588CA6, + (q31_t)0xE79B3F16, (q31_t)0x82622AA5, (q31_t)0xE769E8D8, + (q31_t)0x826BDC04, (q31_t)0xE7389664, (q31_t)0x8275A0C0, + (q31_t)0xE70747C3, (q31_t)0x827F78D8, (q31_t)0xE6D5FCFC, + (q31_t)0x8289644A, (q31_t)0xE6A4B616, (q31_t)0x82936316, + (q31_t)0xE6737319, (q31_t)0x829D753A, (q31_t)0xE642340D, + (q31_t)0x82A79AB3, (q31_t)0xE610F8F9, (q31_t)0x82B1D381, + (q31_t)0xE5DFC1E4, (q31_t)0x82BC1FA1, (q31_t)0xE5AE8ED8, + (q31_t)0x82C67F13, (q31_t)0xE57D5FDA, (q31_t)0x82D0F1D5, + (q31_t)0xE54C34F3, (q31_t)0x82DB77E5, (q31_t)0xE51B0E2A, + (q31_t)0x82E61141, (q31_t)0xE4E9EB86, (q31_t)0x82F0BDE8, + (q31_t)0xE4B8CD10, (q31_t)0x82FB7DD8, (q31_t)0xE487B2CF, + (q31_t)0x8306510F, (q31_t)0xE4569CCB, (q31_t)0x8311378C, + (q31_t)0xE4258B0A, (q31_t)0x831C314E, (q31_t)0xE3F47D95, + (q31_t)0x83273E52, (q31_t)0xE3C37473, (q31_t)0x83325E97, + (q31_t)0xE3926FAC, (q31_t)0x833D921A, (q31_t)0xE3616F47, + (q31_t)0x8348D8DB, (q31_t)0xE330734C, (q31_t)0x835432D8, + (q31_t)0xE2FF7BC3, (q31_t)0x835FA00E, (q31_t)0xE2CE88B2, + (q31_t)0x836B207D, (q31_t)0xE29D9A22, (q31_t)0x8376B422, + (q31_t)0xE26CB01A, (q31_t)0x83825AFB, (q31_t)0xE23BCAA2, + (q31_t)0x838E1507, (q31_t)0xE20AE9C1, (q31_t)0x8399E244, + (q31_t)0xE1DA0D7E, (q31_t)0x83A5C2B0, (q31_t)0xE1A935E1, + (q31_t)0x83B1B649, (q31_t)0xE17862F3, (q31_t)0x83BDBD0D, + (q31_t)0xE14794B9, (q31_t)0x83C9D6FB, (q31_t)0xE116CB3D, + (q31_t)0x83D60411, (q31_t)0xE0E60684, (q31_t)0x83E2444D, + (q31_t)0xE0B54698, (q31_t)0x83EE97AC, (q31_t)0xE0848B7F, + (q31_t)0x83FAFE2E, (q31_t)0xE053D541, (q31_t)0x840777CF, + (q31_t)0xE02323E5, (q31_t)0x8414048F, (q31_t)0xDFF27773, + (q31_t)0x8420A46B, (q31_t)0xDFC1CFF2, (q31_t)0x842D5761, + (q31_t)0xDF912D6A, (q31_t)0x843A1D70, (q31_t)0xDF608FE3, + (q31_t)0x8446F695, (q31_t)0xDF2FF764, (q31_t)0x8453E2CE, + (q31_t)0xDEFF63F4, (q31_t)0x8460E21A, (q31_t)0xDECED59B, + (q31_t)0x846DF476, (q31_t)0xDE9E4C60, (q31_t)0x847B19E1, + (q31_t)0xDE6DC84B, (q31_t)0x84885257, (q31_t)0xDE3D4963, + (q31_t)0x84959DD9, (q31_t)0xDE0CCFB1, (q31_t)0x84A2FC62, + (q31_t)0xDDDC5B3A, (q31_t)0x84B06DF1, (q31_t)0xDDABEC07, + (q31_t)0x84BDF285, (q31_t)0xDD7B8220, (q31_t)0x84CB8A1B, + (q31_t)0xDD4B1D8B, (q31_t)0x84D934B0, (q31_t)0xDD1ABE51, + (q31_t)0x84E6F244, (q31_t)0xDCEA6478, (q31_t)0x84F4C2D3, + (q31_t)0xDCBA1008, (q31_t)0x8502A65C, (q31_t)0xDC89C108, + (q31_t)0x85109CDC, (q31_t)0xDC597781, (q31_t)0x851EA652, + (q31_t)0xDC293379, (q31_t)0x852CC2BA, (q31_t)0xDBF8F4F8, + (q31_t)0x853AF214, (q31_t)0xDBC8BC05, (q31_t)0x8549345C, + (q31_t)0xDB9888A8, (q31_t)0x85578991, (q31_t)0xDB685AE8, + (q31_t)0x8565F1B0, (q31_t)0xDB3832CD, (q31_t)0x85746CB7, + (q31_t)0xDB08105E, (q31_t)0x8582FAA4, (q31_t)0xDAD7F3A2, + (q31_t)0x85919B75, (q31_t)0xDAA7DCA1, (q31_t)0x85A04F28, + (q31_t)0xDA77CB62, (q31_t)0x85AF15B9, (q31_t)0xDA47BFED, + (q31_t)0x85BDEF27, (q31_t)0xDA17BA4A, (q31_t)0x85CCDB70, + (q31_t)0xD9E7BA7E, (q31_t)0x85DBDA91, (q31_t)0xD9B7C093, + (q31_t)0x85EAEC88, (q31_t)0xD987CC8F, (q31_t)0x85FA1152, + (q31_t)0xD957DE7A, (q31_t)0x860948EE, (q31_t)0xD927F65B, + (q31_t)0x86189359, (q31_t)0xD8F81439, (q31_t)0x8627F090, + (q31_t)0xD8C8381C, (q31_t)0x86376092, (q31_t)0xD898620C, + (q31_t)0x8646E35B, (q31_t)0xD868920F, (q31_t)0x865678EA, + (q31_t)0xD838C82D, (q31_t)0x8666213C, (q31_t)0xD809046D, + (q31_t)0x8675DC4E, (q31_t)0xD7D946D7, (q31_t)0x8685AA1F, + (q31_t)0xD7A98F73, (q31_t)0x86958AAB, (q31_t)0xD779DE46, + (q31_t)0x86A57DF1, (q31_t)0xD74A335A, (q31_t)0x86B583EE, + (q31_t)0xD71A8EB5, (q31_t)0x86C59C9F, (q31_t)0xD6EAF05E, + (q31_t)0x86D5C802, (q31_t)0xD6BB585D, (q31_t)0x86E60614, + (q31_t)0xD68BC6BA, (q31_t)0x86F656D3, (q31_t)0xD65C3B7B, + (q31_t)0x8706BA3C, (q31_t)0xD62CB6A7, (q31_t)0x8717304E, + (q31_t)0xD5FD3847, (q31_t)0x8727B904, (q31_t)0xD5CDC062, + (q31_t)0x8738545E, (q31_t)0xD59E4EFE, (q31_t)0x87490257, + (q31_t)0xD56EE424, (q31_t)0x8759C2EF, (q31_t)0xD53F7FDA, + (q31_t)0x876A9621, (q31_t)0xD5102227, (q31_t)0x877B7BEC, + (q31_t)0xD4E0CB14, (q31_t)0x878C744C, (q31_t)0xD4B17AA7, + (q31_t)0x879D7F40, (q31_t)0xD48230E8, (q31_t)0x87AE9CC5, + (q31_t)0xD452EDDE, (q31_t)0x87BFCCD7, (q31_t)0xD423B190, + (q31_t)0x87D10F75, (q31_t)0xD3F47C06, (q31_t)0x87E2649B, + (q31_t)0xD3C54D46, (q31_t)0x87F3CC47, (q31_t)0xD3962559, + (q31_t)0x88054677, (q31_t)0xD3670445, (q31_t)0x8816D327, + (q31_t)0xD337EA12, (q31_t)0x88287255, (q31_t)0xD308D6C6, + (q31_t)0x883A23FE, (q31_t)0xD2D9CA6A, (q31_t)0x884BE820, + (q31_t)0xD2AAC504, (q31_t)0x885DBEB7, (q31_t)0xD27BC69C, + (q31_t)0x886FA7C2, (q31_t)0xD24CCF38, (q31_t)0x8881A33C, + (q31_t)0xD21DDEE1, (q31_t)0x8893B124, (q31_t)0xD1EEF59E, + (q31_t)0x88A5D177, (q31_t)0xD1C01374, (q31_t)0x88B80431, + (q31_t)0xD191386D, (q31_t)0x88CA4951, (q31_t)0xD162648F, + (q31_t)0x88DCA0D3, (q31_t)0xD13397E1, (q31_t)0x88EF0AB4, + (q31_t)0xD104D26B, (q31_t)0x890186F1, (q31_t)0xD0D61433, + (q31_t)0x89141589, (q31_t)0xD0A75D42, (q31_t)0x8926B677, + (q31_t)0xD078AD9D, (q31_t)0x893969B9, (q31_t)0xD04A054D, + (q31_t)0x894C2F4C, (q31_t)0xD01B6459, (q31_t)0x895F072D, + (q31_t)0xCFECCAC7, (q31_t)0x8971F15A, (q31_t)0xCFBE389F, + (q31_t)0x8984EDCF, (q31_t)0xCF8FADE8, (q31_t)0x8997FC89, + (q31_t)0xCF612AAA, (q31_t)0x89AB1D86, (q31_t)0xCF32AEEB, + (q31_t)0x89BE50C3, (q31_t)0xCF043AB2, (q31_t)0x89D1963C, + (q31_t)0xCED5CE08, (q31_t)0x89E4EDEE, (q31_t)0xCEA768F2, + (q31_t)0x89F857D8, (q31_t)0xCE790B78, (q31_t)0x8A0BD3F5, + (q31_t)0xCE4AB5A2, (q31_t)0x8A1F6242, (q31_t)0xCE1C6776, + (q31_t)0x8A3302BD, (q31_t)0xCDEE20FC, (q31_t)0x8A46B563, + (q31_t)0xCDBFE23A, (q31_t)0x8A5A7A30, (q31_t)0xCD91AB38, + (q31_t)0x8A6E5122, (q31_t)0xCD637BFD, (q31_t)0x8A823A35, + (q31_t)0xCD355490, (q31_t)0x8A963567, (q31_t)0xCD0734F8, + (q31_t)0x8AAA42B4, (q31_t)0xCCD91D3D, (q31_t)0x8ABE6219, + (q31_t)0xCCAB0D65, (q31_t)0x8AD29393, (q31_t)0xCC7D0577, + (q31_t)0x8AE6D71F, (q31_t)0xCC4F057B, (q31_t)0x8AFB2CBA, + (q31_t)0xCC210D78, (q31_t)0x8B0F9461, (q31_t)0xCBF31D75, + (q31_t)0x8B240E10, (q31_t)0xCBC53578, (q31_t)0x8B3899C5, + (q31_t)0xCB975589, (q31_t)0x8B4D377C, (q31_t)0xCB697DB0, + (q31_t)0x8B61E732, (q31_t)0xCB3BADF2, (q31_t)0x8B76A8E4, + (q31_t)0xCB0DE658, (q31_t)0x8B8B7C8F, (q31_t)0xCAE026E8, + (q31_t)0x8BA0622F, (q31_t)0xCAB26FA9, (q31_t)0x8BB559C1, + (q31_t)0xCA84C0A2, (q31_t)0x8BCA6342, (q31_t)0xCA5719DB, + (q31_t)0x8BDF7EAF, (q31_t)0xCA297B5A, (q31_t)0x8BF4AC05, + (q31_t)0xC9FBE527, (q31_t)0x8C09EB40, (q31_t)0xC9CE5748, + (q31_t)0x8C1F3C5C, (q31_t)0xC9A0D1C4, (q31_t)0x8C349F58, + (q31_t)0xC97354A3, (q31_t)0x8C4A142F, (q31_t)0xC945DFEC, + (q31_t)0x8C5F9ADD, (q31_t)0xC91873A5, (q31_t)0x8C753361, + (q31_t)0xC8EB0FD6, (q31_t)0x8C8ADDB6, (q31_t)0xC8BDB485, + (q31_t)0x8CA099D9, (q31_t)0xC89061BA, (q31_t)0x8CB667C7, + (q31_t)0xC863177B, (q31_t)0x8CCC477D, (q31_t)0xC835D5D0, + (q31_t)0x8CE238F6, (q31_t)0xC8089CBF, (q31_t)0x8CF83C30, + (q31_t)0xC7DB6C50, (q31_t)0x8D0E5127, (q31_t)0xC7AE4489, + (q31_t)0x8D2477D8, (q31_t)0xC7812571, (q31_t)0x8D3AB03F, + (q31_t)0xC7540F10, (q31_t)0x8D50FA59, (q31_t)0xC727016C, + (q31_t)0x8D675623, (q31_t)0xC6F9FC8D, (q31_t)0x8D7DC399, + (q31_t)0xC6CD0079, (q31_t)0x8D9442B7, (q31_t)0xC6A00D36, + (q31_t)0x8DAAD37B, (q31_t)0xC67322CD, (q31_t)0x8DC175E0, + (q31_t)0xC6464144, (q31_t)0x8DD829E4, (q31_t)0xC61968A2, + (q31_t)0x8DEEEF82, (q31_t)0xC5EC98ED, (q31_t)0x8E05C6B7, + (q31_t)0xC5BFD22E, (q31_t)0x8E1CAF80, (q31_t)0xC593146A, + (q31_t)0x8E33A9D9, (q31_t)0xC5665FA8, (q31_t)0x8E4AB5BF, + (q31_t)0xC539B3F0, (q31_t)0x8E61D32D, (q31_t)0xC50D1148, + (q31_t)0x8E790222, (q31_t)0xC4E077B8, (q31_t)0x8E904298, + (q31_t)0xC4B3E746, (q31_t)0x8EA7948C, (q31_t)0xC4875FF8, + (q31_t)0x8EBEF7FB, (q31_t)0xC45AE1D7, (q31_t)0x8ED66CE1, + (q31_t)0xC42E6CE8, (q31_t)0x8EEDF33B, (q31_t)0xC4020132, + (q31_t)0x8F058B04, (q31_t)0xC3D59EBD, (q31_t)0x8F1D343A, + (q31_t)0xC3A9458F, (q31_t)0x8F34EED8, (q31_t)0xC37CF5B0, + (q31_t)0x8F4CBADB, (q31_t)0xC350AF25, (q31_t)0x8F64983F, + (q31_t)0xC32471F6, (q31_t)0x8F7C8701, (q31_t)0xC2F83E2A, + (q31_t)0x8F94871D, (q31_t)0xC2CC13C7, (q31_t)0x8FAC988E, + (q31_t)0xC29FF2D4, (q31_t)0x8FC4BB53, (q31_t)0xC273DB58, + (q31_t)0x8FDCEF66, (q31_t)0xC247CD5A, (q31_t)0x8FF534C4, + (q31_t)0xC21BC8E0, (q31_t)0x900D8B69, (q31_t)0xC1EFCDF2, + (q31_t)0x9025F352, (q31_t)0xC1C3DC96, (q31_t)0x903E6C7A, + (q31_t)0xC197F4D3, (q31_t)0x9056F6DF, (q31_t)0xC16C16B0, + (q31_t)0x906F927B, (q31_t)0xC1404233, (q31_t)0x90883F4C, + (q31_t)0xC1147763, (q31_t)0x90A0FD4E, (q31_t)0xC0E8B648, + (q31_t)0x90B9CC7C, (q31_t)0xC0BCFEE7, (q31_t)0x90D2ACD3, + (q31_t)0xC0915147, (q31_t)0x90EB9E50, (q31_t)0xC065AD70, + (q31_t)0x9104A0ED, (q31_t)0xC03A1368, (q31_t)0x911DB4A8, + (q31_t)0xC00E8335, (q31_t)0x9136D97D, (q31_t)0xBFE2FCDF, + (q31_t)0x91500F67, (q31_t)0xBFB7806C, (q31_t)0x91695663, + (q31_t)0xBF8C0DE2, (q31_t)0x9182AE6C, (q31_t)0xBF60A54A, + (q31_t)0x919C1780, (q31_t)0xBF3546A8, (q31_t)0x91B5919A, + (q31_t)0xBF09F204, (q31_t)0x91CF1CB6, (q31_t)0xBEDEA765, + (q31_t)0x91E8B8D0, (q31_t)0xBEB366D1, (q31_t)0x920265E4, + (q31_t)0xBE88304F, (q31_t)0x921C23EE, (q31_t)0xBE5D03E5, + (q31_t)0x9235F2EB, (q31_t)0xBE31E19B, (q31_t)0x924FD2D6, + (q31_t)0xBE06C977, (q31_t)0x9269C3AC, (q31_t)0xBDDBBB7F, + (q31_t)0x9283C567, (q31_t)0xBDB0B7BA, (q31_t)0x929DD805, + (q31_t)0xBD85BE2F, (q31_t)0x92B7FB82, (q31_t)0xBD5ACEE5, + (q31_t)0x92D22FD8, (q31_t)0xBD2FE9E1, (q31_t)0x92EC7505, + (q31_t)0xBD050F2C, (q31_t)0x9306CB04, (q31_t)0xBCDA3ECA, + (q31_t)0x932131D1, (q31_t)0xBCAF78C3, (q31_t)0x933BA968, + (q31_t)0xBC84BD1E, (q31_t)0x935631C5, (q31_t)0xBC5A0BE1, + (q31_t)0x9370CAE4, (q31_t)0xBC2F6513, (q31_t)0x938B74C0, + (q31_t)0xBC04C8BA, (q31_t)0x93A62F56, (q31_t)0xBBDA36DC, + (q31_t)0x93C0FAA2, (q31_t)0xBBAFAF81, (q31_t)0x93DBD69F, + (q31_t)0xBB8532AF, (q31_t)0x93F6C34A, (q31_t)0xBB5AC06C, + (q31_t)0x9411C09D, (q31_t)0xBB3058C0, (q31_t)0x942CCE95, + (q31_t)0xBB05FBB0, (q31_t)0x9447ED2F, (q31_t)0xBADBA943, + (q31_t)0x94631C64, (q31_t)0xBAB1617F, (q31_t)0x947E5C32, + (q31_t)0xBA87246C, (q31_t)0x9499AC95, (q31_t)0xBA5CF210, + (q31_t)0x94B50D87, (q31_t)0xBA32CA70, (q31_t)0x94D07F05, + (q31_t)0xBA08AD94, (q31_t)0x94EC010B, (q31_t)0xB9DE9B83, + (q31_t)0x95079393, (q31_t)0xB9B49442, (q31_t)0x9523369B, + (q31_t)0xB98A97D8, (q31_t)0x953EEA1E, (q31_t)0xB960A64B, + (q31_t)0x955AAE17, (q31_t)0xB936BFA3, (q31_t)0x95768282, + (q31_t)0xB90CE3E6, (q31_t)0x9592675B, (q31_t)0xB8E31319, + (q31_t)0x95AE5C9E, (q31_t)0xB8B94D44, (q31_t)0x95CA6246, + (q31_t)0xB88F926C, (q31_t)0x95E6784F, (q31_t)0xB865E299, + (q31_t)0x96029EB5, (q31_t)0xB83C3DD1, (q31_t)0x961ED573, + (q31_t)0xB812A419, (q31_t)0x963B1C85, (q31_t)0xB7E9157A, + (q31_t)0x965773E7, (q31_t)0xB7BF91F8, (q31_t)0x9673DB94, + (q31_t)0xB796199B, (q31_t)0x96905387, (q31_t)0xB76CAC68, + (q31_t)0x96ACDBBD, (q31_t)0xB7434A67, (q31_t)0x96C97431, + (q31_t)0xB719F39D, (q31_t)0x96E61CDF, (q31_t)0xB6F0A811, + (q31_t)0x9702D5C2, (q31_t)0xB6C767CA, (q31_t)0x971F9ED6, + (q31_t)0xB69E32CD, (q31_t)0x973C7816, (q31_t)0xB6750921, + (q31_t)0x9759617E, (q31_t)0xB64BEACC, (q31_t)0x97765B0A, + (q31_t)0xB622D7D5, (q31_t)0x979364B5, (q31_t)0xB5F9D042, + (q31_t)0x97B07E7A, (q31_t)0xB5D0D41A, (q31_t)0x97CDA855, + (q31_t)0xB5A7E362, (q31_t)0x97EAE241, (q31_t)0xB57EFE21, + (q31_t)0x98082C3B, (q31_t)0xB556245E, (q31_t)0x9825863D, + (q31_t)0xB52D561E, (q31_t)0x9842F043, (q31_t)0xB5049368, + (q31_t)0x98606A48, (q31_t)0xB4DBDC42, (q31_t)0x987DF449, + (q31_t)0xB4B330B2, (q31_t)0x989B8E3F, (q31_t)0xB48A90C0, + (q31_t)0x98B93828, (q31_t)0xB461FC70, (q31_t)0x98D6F1FE, + (q31_t)0xB43973C9, (q31_t)0x98F4BBBC, (q31_t)0xB410F6D2, + (q31_t)0x9912955E, (q31_t)0xB3E88591, (q31_t)0x99307EE0, + (q31_t)0xB3C0200C, (q31_t)0x994E783C, (q31_t)0xB397C649, + (q31_t)0x996C816F, (q31_t)0xB36F784E, (q31_t)0x998A9A73, + (q31_t)0xB3473622, (q31_t)0x99A8C344, (q31_t)0xB31EFFCB, + (q31_t)0x99C6FBDE, (q31_t)0xB2F6D54F, (q31_t)0x99E5443A, + (q31_t)0xB2CEB6B5, (q31_t)0x9A039C56, (q31_t)0xB2A6A401, + (q31_t)0x9A22042C, (q31_t)0xB27E9D3B, (q31_t)0x9A407BB8, + (q31_t)0xB256A26A, (q31_t)0x9A5F02F5, (q31_t)0xB22EB392, + (q31_t)0x9A7D99DD, (q31_t)0xB206D0BA, (q31_t)0x9A9C406D, + (q31_t)0xB1DEF9E8, (q31_t)0x9ABAF6A0, (q31_t)0xB1B72F23, + (q31_t)0x9AD9BC71, (q31_t)0xB18F7070, (q31_t)0x9AF891DB, + (q31_t)0xB167BDD6, (q31_t)0x9B1776D9, (q31_t)0xB140175B, + (q31_t)0x9B366B67, (q31_t)0xB1187D05, (q31_t)0x9B556F80, + (q31_t)0xB0F0EEDA, (q31_t)0x9B748320, (q31_t)0xB0C96CDF, + (q31_t)0x9B93A640, (q31_t)0xB0A1F71C, (q31_t)0x9BB2D8DD, + (q31_t)0xB07A8D97, (q31_t)0x9BD21AF2, (q31_t)0xB0533055, + (q31_t)0x9BF16C7A, (q31_t)0xB02BDF5C, (q31_t)0x9C10CD70, + (q31_t)0xB0049AB2, (q31_t)0x9C303DCF, (q31_t)0xAFDD625F, + (q31_t)0x9C4FBD92, (q31_t)0xAFB63667, (q31_t)0x9C6F4CB5, + (q31_t)0xAF8F16D0, (q31_t)0x9C8EEB33, (q31_t)0xAF6803A1, + (q31_t)0x9CAE9907, (q31_t)0xAF40FCE0, (q31_t)0x9CCE562B, + (q31_t)0xAF1A0293, (q31_t)0x9CEE229C, (q31_t)0xAEF314BF, + (q31_t)0x9D0DFE53, (q31_t)0xAECC336B, (q31_t)0x9D2DE94D, + (q31_t)0xAEA55E9D, (q31_t)0x9D4DE384, (q31_t)0xAE7E965B, + (q31_t)0x9D6DECF4, (q31_t)0xAE57DAAA, (q31_t)0x9D8E0596, + (q31_t)0xAE312B91, (q31_t)0x9DAE2D68, (q31_t)0xAE0A8916, + (q31_t)0x9DCE6462, (q31_t)0xADE3F33E, (q31_t)0x9DEEAA82, + (q31_t)0xADBD6A10, (q31_t)0x9E0EFFC1, (q31_t)0xAD96ED91, + (q31_t)0x9E2F641A, (q31_t)0xAD707DC8, (q31_t)0x9E4FD789, + (q31_t)0xAD4A1ABA, (q31_t)0x9E705A09, (q31_t)0xAD23C46D, + (q31_t)0x9E90EB94, (q31_t)0xACFD7AE8, (q31_t)0x9EB18C26, + (q31_t)0xACD73E30, (q31_t)0x9ED23BB9, (q31_t)0xACB10E4A, + (q31_t)0x9EF2FA48, (q31_t)0xAC8AEB3E, (q31_t)0x9F13C7D0, + (q31_t)0xAC64D510, (q31_t)0x9F34A449, (q31_t)0xAC3ECBC7, + (q31_t)0x9F558FB0, (q31_t)0xAC18CF68, (q31_t)0x9F7689FF, + (q31_t)0xABF2DFFA, (q31_t)0x9F979331, (q31_t)0xABCCFD82, + (q31_t)0x9FB8AB41, (q31_t)0xABA72806, (q31_t)0x9FD9D22A, + (q31_t)0xAB815F8C, (q31_t)0x9FFB07E7, (q31_t)0xAB5BA41A, + (q31_t)0xA01C4C72, (q31_t)0xAB35F5B5, (q31_t)0xA03D9FC7, + (q31_t)0xAB105464, (q31_t)0xA05F01E1, (q31_t)0xAAEAC02B, + (q31_t)0xA08072BA, (q31_t)0xAAC53912, (q31_t)0xA0A1F24C, + (q31_t)0xAA9FBF1D, (q31_t)0xA0C38094, (q31_t)0xAA7A5253, + (q31_t)0xA0E51D8C, (q31_t)0xAA54F2B9, (q31_t)0xA106C92E, + (q31_t)0xAA2FA055, (q31_t)0xA1288376, (q31_t)0xAA0A5B2D, + (q31_t)0xA14A4C5E, (q31_t)0xA9E52347, (q31_t)0xA16C23E1, + (q31_t)0xA9BFF8A8, (q31_t)0xA18E09F9, (q31_t)0xA99ADB56, + (q31_t)0xA1AFFEA2, (q31_t)0xA975CB56, (q31_t)0xA1D201D7, + (q31_t)0xA950C8AF, (q31_t)0xA1F41391, (q31_t)0xA92BD366, + (q31_t)0xA21633CD, (q31_t)0xA906EB81, (q31_t)0xA2386283, + (q31_t)0xA8E21106, (q31_t)0xA25A9FB1, (q31_t)0xA8BD43FA, + (q31_t)0xA27CEB4F, (q31_t)0xA8988463, (q31_t)0xA29F4559, + (q31_t)0xA873D246, (q31_t)0xA2C1ADC9, (q31_t)0xA84F2DA9, + (q31_t)0xA2E4249A, (q31_t)0xA82A9693, (q31_t)0xA306A9C7, + (q31_t)0xA8060D08, (q31_t)0xA3293D4B, (q31_t)0xA7E1910E, + (q31_t)0xA34BDF20, (q31_t)0xA7BD22AB, (q31_t)0xA36E8F40, + (q31_t)0xA798C1E4, (q31_t)0xA3914DA7, (q31_t)0xA7746EC0, + (q31_t)0xA3B41A4F, (q31_t)0xA7502943, (q31_t)0xA3D6F533, + (q31_t)0xA72BF173, (q31_t)0xA3F9DE4D, (q31_t)0xA707C756, + (q31_t)0xA41CD598, (q31_t)0xA6E3AAF2, (q31_t)0xA43FDB0F, + (q31_t)0xA6BF9C4B, (q31_t)0xA462EEAC, (q31_t)0xA69B9B68, + (q31_t)0xA4861069, (q31_t)0xA677A84E, (q31_t)0xA4A94042, + (q31_t)0xA653C302, (q31_t)0xA4CC7E31, (q31_t)0xA62FEB8B, + (q31_t)0xA4EFCA31, (q31_t)0xA60C21ED, (q31_t)0xA513243B, + (q31_t)0xA5E8662F, (q31_t)0xA5368C4B, (q31_t)0xA5C4B855, + (q31_t)0xA55A025B, (q31_t)0xA5A11865, (q31_t)0xA57D8666, + (q31_t)0xA57D8666, (q31_t)0xA5A11865, (q31_t)0xA55A025B, + (q31_t)0xA5C4B855, (q31_t)0xA5368C4B, (q31_t)0xA5E8662F, + (q31_t)0xA513243B, (q31_t)0xA60C21ED, (q31_t)0xA4EFCA31, + (q31_t)0xA62FEB8B, (q31_t)0xA4CC7E31, (q31_t)0xA653C302, + (q31_t)0xA4A94042, (q31_t)0xA677A84E, (q31_t)0xA4861069, + (q31_t)0xA69B9B68, (q31_t)0xA462EEAC, (q31_t)0xA6BF9C4B, + (q31_t)0xA43FDB0F, (q31_t)0xA6E3AAF2, (q31_t)0xA41CD598, + (q31_t)0xA707C756, (q31_t)0xA3F9DE4D, (q31_t)0xA72BF173, + (q31_t)0xA3D6F533, (q31_t)0xA7502943, (q31_t)0xA3B41A4F, + (q31_t)0xA7746EC0, (q31_t)0xA3914DA7, (q31_t)0xA798C1E4, + (q31_t)0xA36E8F40, (q31_t)0xA7BD22AB, (q31_t)0xA34BDF20, + (q31_t)0xA7E1910E, (q31_t)0xA3293D4B, (q31_t)0xA8060D08, + (q31_t)0xA306A9C7, (q31_t)0xA82A9693, (q31_t)0xA2E4249A, + (q31_t)0xA84F2DA9, (q31_t)0xA2C1ADC9, (q31_t)0xA873D246, + (q31_t)0xA29F4559, (q31_t)0xA8988463, (q31_t)0xA27CEB4F, + (q31_t)0xA8BD43FA, (q31_t)0xA25A9FB1, (q31_t)0xA8E21106, + (q31_t)0xA2386283, (q31_t)0xA906EB81, (q31_t)0xA21633CD, + (q31_t)0xA92BD366, (q31_t)0xA1F41391, (q31_t)0xA950C8AF, + (q31_t)0xA1D201D7, (q31_t)0xA975CB56, (q31_t)0xA1AFFEA2, + (q31_t)0xA99ADB56, (q31_t)0xA18E09F9, (q31_t)0xA9BFF8A8, + (q31_t)0xA16C23E1, (q31_t)0xA9E52347, (q31_t)0xA14A4C5E, + (q31_t)0xAA0A5B2D, (q31_t)0xA1288376, (q31_t)0xAA2FA055, + (q31_t)0xA106C92E, (q31_t)0xAA54F2B9, (q31_t)0xA0E51D8C, + (q31_t)0xAA7A5253, (q31_t)0xA0C38094, (q31_t)0xAA9FBF1D, + (q31_t)0xA0A1F24C, (q31_t)0xAAC53912, (q31_t)0xA08072BA, + (q31_t)0xAAEAC02B, (q31_t)0xA05F01E1, (q31_t)0xAB105464, + (q31_t)0xA03D9FC7, (q31_t)0xAB35F5B5, (q31_t)0xA01C4C72, + (q31_t)0xAB5BA41A, (q31_t)0x9FFB07E7, (q31_t)0xAB815F8C, + (q31_t)0x9FD9D22A, (q31_t)0xABA72806, (q31_t)0x9FB8AB41, + (q31_t)0xABCCFD82, (q31_t)0x9F979331, (q31_t)0xABF2DFFA, + (q31_t)0x9F7689FF, (q31_t)0xAC18CF68, (q31_t)0x9F558FB0, + (q31_t)0xAC3ECBC7, (q31_t)0x9F34A449, (q31_t)0xAC64D510, + (q31_t)0x9F13C7D0, (q31_t)0xAC8AEB3E, (q31_t)0x9EF2FA48, + (q31_t)0xACB10E4A, (q31_t)0x9ED23BB9, (q31_t)0xACD73E30, + (q31_t)0x9EB18C26, (q31_t)0xACFD7AE8, (q31_t)0x9E90EB94, + (q31_t)0xAD23C46D, (q31_t)0x9E705A09, (q31_t)0xAD4A1ABA, + (q31_t)0x9E4FD789, (q31_t)0xAD707DC8, (q31_t)0x9E2F641A, + (q31_t)0xAD96ED91, (q31_t)0x9E0EFFC1, (q31_t)0xADBD6A10, + (q31_t)0x9DEEAA82, (q31_t)0xADE3F33E, (q31_t)0x9DCE6462, + (q31_t)0xAE0A8916, (q31_t)0x9DAE2D68, (q31_t)0xAE312B91, + (q31_t)0x9D8E0596, (q31_t)0xAE57DAAA, (q31_t)0x9D6DECF4, + (q31_t)0xAE7E965B, (q31_t)0x9D4DE384, (q31_t)0xAEA55E9D, + (q31_t)0x9D2DE94D, (q31_t)0xAECC336B, (q31_t)0x9D0DFE53, + (q31_t)0xAEF314BF, (q31_t)0x9CEE229C, (q31_t)0xAF1A0293, + (q31_t)0x9CCE562B, (q31_t)0xAF40FCE0, (q31_t)0x9CAE9907, + (q31_t)0xAF6803A1, (q31_t)0x9C8EEB33, (q31_t)0xAF8F16D0, + (q31_t)0x9C6F4CB5, (q31_t)0xAFB63667, (q31_t)0x9C4FBD92, + (q31_t)0xAFDD625F, (q31_t)0x9C303DCF, (q31_t)0xB0049AB2, + (q31_t)0x9C10CD70, (q31_t)0xB02BDF5C, (q31_t)0x9BF16C7A, + (q31_t)0xB0533055, (q31_t)0x9BD21AF2, (q31_t)0xB07A8D97, + (q31_t)0x9BB2D8DD, (q31_t)0xB0A1F71C, (q31_t)0x9B93A640, + (q31_t)0xB0C96CDF, (q31_t)0x9B748320, (q31_t)0xB0F0EEDA, + (q31_t)0x9B556F80, (q31_t)0xB1187D05, (q31_t)0x9B366B67, + (q31_t)0xB140175B, (q31_t)0x9B1776D9, (q31_t)0xB167BDD6, + (q31_t)0x9AF891DB, (q31_t)0xB18F7070, (q31_t)0x9AD9BC71, + (q31_t)0xB1B72F23, (q31_t)0x9ABAF6A0, (q31_t)0xB1DEF9E8, + (q31_t)0x9A9C406D, (q31_t)0xB206D0BA, (q31_t)0x9A7D99DD, + (q31_t)0xB22EB392, (q31_t)0x9A5F02F5, (q31_t)0xB256A26A, + (q31_t)0x9A407BB8, (q31_t)0xB27E9D3B, (q31_t)0x9A22042C, + (q31_t)0xB2A6A401, (q31_t)0x9A039C56, (q31_t)0xB2CEB6B5, + (q31_t)0x99E5443A, (q31_t)0xB2F6D54F, (q31_t)0x99C6FBDE, + (q31_t)0xB31EFFCB, (q31_t)0x99A8C344, (q31_t)0xB3473622, + (q31_t)0x998A9A73, (q31_t)0xB36F784E, (q31_t)0x996C816F, + (q31_t)0xB397C649, (q31_t)0x994E783C, (q31_t)0xB3C0200C, + (q31_t)0x99307EE0, (q31_t)0xB3E88591, (q31_t)0x9912955E, + (q31_t)0xB410F6D2, (q31_t)0x98F4BBBC, (q31_t)0xB43973C9, + (q31_t)0x98D6F1FE, (q31_t)0xB461FC70, (q31_t)0x98B93828, + (q31_t)0xB48A90C0, (q31_t)0x989B8E3F, (q31_t)0xB4B330B2, + (q31_t)0x987DF449, (q31_t)0xB4DBDC42, (q31_t)0x98606A48, + (q31_t)0xB5049368, (q31_t)0x9842F043, (q31_t)0xB52D561E, + (q31_t)0x9825863D, (q31_t)0xB556245E, (q31_t)0x98082C3B, + (q31_t)0xB57EFE21, (q31_t)0x97EAE241, (q31_t)0xB5A7E362, + (q31_t)0x97CDA855, (q31_t)0xB5D0D41A, (q31_t)0x97B07E7A, + (q31_t)0xB5F9D042, (q31_t)0x979364B5, (q31_t)0xB622D7D5, + (q31_t)0x97765B0A, (q31_t)0xB64BEACC, (q31_t)0x9759617E, + (q31_t)0xB6750921, (q31_t)0x973C7816, (q31_t)0xB69E32CD, + (q31_t)0x971F9ED6, (q31_t)0xB6C767CA, (q31_t)0x9702D5C2, + (q31_t)0xB6F0A811, (q31_t)0x96E61CDF, (q31_t)0xB719F39D, + (q31_t)0x96C97431, (q31_t)0xB7434A67, (q31_t)0x96ACDBBD, + (q31_t)0xB76CAC68, (q31_t)0x96905387, (q31_t)0xB796199B, + (q31_t)0x9673DB94, (q31_t)0xB7BF91F8, (q31_t)0x965773E7, + (q31_t)0xB7E9157A, (q31_t)0x963B1C85, (q31_t)0xB812A419, + (q31_t)0x961ED573, (q31_t)0xB83C3DD1, (q31_t)0x96029EB5, + (q31_t)0xB865E299, (q31_t)0x95E6784F, (q31_t)0xB88F926C, + (q31_t)0x95CA6246, (q31_t)0xB8B94D44, (q31_t)0x95AE5C9E, + (q31_t)0xB8E31319, (q31_t)0x9592675B, (q31_t)0xB90CE3E6, + (q31_t)0x95768282, (q31_t)0xB936BFA3, (q31_t)0x955AAE17, + (q31_t)0xB960A64B, (q31_t)0x953EEA1E, (q31_t)0xB98A97D8, + (q31_t)0x9523369B, (q31_t)0xB9B49442, (q31_t)0x95079393, + (q31_t)0xB9DE9B83, (q31_t)0x94EC010B, (q31_t)0xBA08AD94, + (q31_t)0x94D07F05, (q31_t)0xBA32CA70, (q31_t)0x94B50D87, + (q31_t)0xBA5CF210, (q31_t)0x9499AC95, (q31_t)0xBA87246C, + (q31_t)0x947E5C32, (q31_t)0xBAB1617F, (q31_t)0x94631C64, + (q31_t)0xBADBA943, (q31_t)0x9447ED2F, (q31_t)0xBB05FBB0, + (q31_t)0x942CCE95, (q31_t)0xBB3058C0, (q31_t)0x9411C09D, + (q31_t)0xBB5AC06C, (q31_t)0x93F6C34A, (q31_t)0xBB8532AF, + (q31_t)0x93DBD69F, (q31_t)0xBBAFAF81, (q31_t)0x93C0FAA2, + (q31_t)0xBBDA36DC, (q31_t)0x93A62F56, (q31_t)0xBC04C8BA, + (q31_t)0x938B74C0, (q31_t)0xBC2F6513, (q31_t)0x9370CAE4, + (q31_t)0xBC5A0BE1, (q31_t)0x935631C5, (q31_t)0xBC84BD1E, + (q31_t)0x933BA968, (q31_t)0xBCAF78C3, (q31_t)0x932131D1, + (q31_t)0xBCDA3ECA, (q31_t)0x9306CB04, (q31_t)0xBD050F2C, + (q31_t)0x92EC7505, (q31_t)0xBD2FE9E1, (q31_t)0x92D22FD8, + (q31_t)0xBD5ACEE5, (q31_t)0x92B7FB82, (q31_t)0xBD85BE2F, + (q31_t)0x929DD805, (q31_t)0xBDB0B7BA, (q31_t)0x9283C567, + (q31_t)0xBDDBBB7F, (q31_t)0x9269C3AC, (q31_t)0xBE06C977, + (q31_t)0x924FD2D6, (q31_t)0xBE31E19B, (q31_t)0x9235F2EB, + (q31_t)0xBE5D03E5, (q31_t)0x921C23EE, (q31_t)0xBE88304F, + (q31_t)0x920265E4, (q31_t)0xBEB366D1, (q31_t)0x91E8B8D0, + (q31_t)0xBEDEA765, (q31_t)0x91CF1CB6, (q31_t)0xBF09F204, + (q31_t)0x91B5919A, (q31_t)0xBF3546A8, (q31_t)0x919C1780, + (q31_t)0xBF60A54A, (q31_t)0x9182AE6C, (q31_t)0xBF8C0DE2, + (q31_t)0x91695663, (q31_t)0xBFB7806C, (q31_t)0x91500F67, + (q31_t)0xBFE2FCDF, (q31_t)0x9136D97D, (q31_t)0xC00E8335, + (q31_t)0x911DB4A8, (q31_t)0xC03A1368, (q31_t)0x9104A0ED, + (q31_t)0xC065AD70, (q31_t)0x90EB9E50, (q31_t)0xC0915147, + (q31_t)0x90D2ACD3, (q31_t)0xC0BCFEE7, (q31_t)0x90B9CC7C, + (q31_t)0xC0E8B648, (q31_t)0x90A0FD4E, (q31_t)0xC1147763, + (q31_t)0x90883F4C, (q31_t)0xC1404233, (q31_t)0x906F927B, + (q31_t)0xC16C16B0, (q31_t)0x9056F6DF, (q31_t)0xC197F4D3, + (q31_t)0x903E6C7A, (q31_t)0xC1C3DC96, (q31_t)0x9025F352, + (q31_t)0xC1EFCDF2, (q31_t)0x900D8B69, (q31_t)0xC21BC8E0, + (q31_t)0x8FF534C4, (q31_t)0xC247CD5A, (q31_t)0x8FDCEF66, + (q31_t)0xC273DB58, (q31_t)0x8FC4BB53, (q31_t)0xC29FF2D4, + (q31_t)0x8FAC988E, (q31_t)0xC2CC13C7, (q31_t)0x8F94871D, + (q31_t)0xC2F83E2A, (q31_t)0x8F7C8701, (q31_t)0xC32471F6, + (q31_t)0x8F64983F, (q31_t)0xC350AF25, (q31_t)0x8F4CBADB, + (q31_t)0xC37CF5B0, (q31_t)0x8F34EED8, (q31_t)0xC3A9458F, + (q31_t)0x8F1D343A, (q31_t)0xC3D59EBD, (q31_t)0x8F058B04, + (q31_t)0xC4020132, (q31_t)0x8EEDF33B, (q31_t)0xC42E6CE8, + (q31_t)0x8ED66CE1, (q31_t)0xC45AE1D7, (q31_t)0x8EBEF7FB, + (q31_t)0xC4875FF8, (q31_t)0x8EA7948C, (q31_t)0xC4B3E746, + (q31_t)0x8E904298, (q31_t)0xC4E077B8, (q31_t)0x8E790222, + (q31_t)0xC50D1148, (q31_t)0x8E61D32D, (q31_t)0xC539B3F0, + (q31_t)0x8E4AB5BF, (q31_t)0xC5665FA8, (q31_t)0x8E33A9D9, + (q31_t)0xC593146A, (q31_t)0x8E1CAF80, (q31_t)0xC5BFD22E, + (q31_t)0x8E05C6B7, (q31_t)0xC5EC98ED, (q31_t)0x8DEEEF82, + (q31_t)0xC61968A2, (q31_t)0x8DD829E4, (q31_t)0xC6464144, + (q31_t)0x8DC175E0, (q31_t)0xC67322CD, (q31_t)0x8DAAD37B, + (q31_t)0xC6A00D36, (q31_t)0x8D9442B7, (q31_t)0xC6CD0079, + (q31_t)0x8D7DC399, (q31_t)0xC6F9FC8D, (q31_t)0x8D675623, + (q31_t)0xC727016C, (q31_t)0x8D50FA59, (q31_t)0xC7540F10, + (q31_t)0x8D3AB03F, (q31_t)0xC7812571, (q31_t)0x8D2477D8, + (q31_t)0xC7AE4489, (q31_t)0x8D0E5127, (q31_t)0xC7DB6C50, + (q31_t)0x8CF83C30, (q31_t)0xC8089CBF, (q31_t)0x8CE238F6, + (q31_t)0xC835D5D0, (q31_t)0x8CCC477D, (q31_t)0xC863177B, + (q31_t)0x8CB667C7, (q31_t)0xC89061BA, (q31_t)0x8CA099D9, + (q31_t)0xC8BDB485, (q31_t)0x8C8ADDB6, (q31_t)0xC8EB0FD6, + (q31_t)0x8C753361, (q31_t)0xC91873A5, (q31_t)0x8C5F9ADD, + (q31_t)0xC945DFEC, (q31_t)0x8C4A142F, (q31_t)0xC97354A3, + (q31_t)0x8C349F58, (q31_t)0xC9A0D1C4, (q31_t)0x8C1F3C5C, + (q31_t)0xC9CE5748, (q31_t)0x8C09EB40, (q31_t)0xC9FBE527, + (q31_t)0x8BF4AC05, (q31_t)0xCA297B5A, (q31_t)0x8BDF7EAF, + (q31_t)0xCA5719DB, (q31_t)0x8BCA6342, (q31_t)0xCA84C0A2, + (q31_t)0x8BB559C1, (q31_t)0xCAB26FA9, (q31_t)0x8BA0622F, + (q31_t)0xCAE026E8, (q31_t)0x8B8B7C8F, (q31_t)0xCB0DE658, + (q31_t)0x8B76A8E4, (q31_t)0xCB3BADF2, (q31_t)0x8B61E732, + (q31_t)0xCB697DB0, (q31_t)0x8B4D377C, (q31_t)0xCB975589, + (q31_t)0x8B3899C5, (q31_t)0xCBC53578, (q31_t)0x8B240E10, + (q31_t)0xCBF31D75, (q31_t)0x8B0F9461, (q31_t)0xCC210D78, + (q31_t)0x8AFB2CBA, (q31_t)0xCC4F057B, (q31_t)0x8AE6D71F, + (q31_t)0xCC7D0577, (q31_t)0x8AD29393, (q31_t)0xCCAB0D65, + (q31_t)0x8ABE6219, (q31_t)0xCCD91D3D, (q31_t)0x8AAA42B4, + (q31_t)0xCD0734F8, (q31_t)0x8A963567, (q31_t)0xCD355490, + (q31_t)0x8A823A35, (q31_t)0xCD637BFD, (q31_t)0x8A6E5122, + (q31_t)0xCD91AB38, (q31_t)0x8A5A7A30, (q31_t)0xCDBFE23A, + (q31_t)0x8A46B563, (q31_t)0xCDEE20FC, (q31_t)0x8A3302BD, + (q31_t)0xCE1C6776, (q31_t)0x8A1F6242, (q31_t)0xCE4AB5A2, + (q31_t)0x8A0BD3F5, (q31_t)0xCE790B78, (q31_t)0x89F857D8, + (q31_t)0xCEA768F2, (q31_t)0x89E4EDEE, (q31_t)0xCED5CE08, + (q31_t)0x89D1963C, (q31_t)0xCF043AB2, (q31_t)0x89BE50C3, + (q31_t)0xCF32AEEB, (q31_t)0x89AB1D86, (q31_t)0xCF612AAA, + (q31_t)0x8997FC89, (q31_t)0xCF8FADE8, (q31_t)0x8984EDCF, + (q31_t)0xCFBE389F, (q31_t)0x8971F15A, (q31_t)0xCFECCAC7, + (q31_t)0x895F072D, (q31_t)0xD01B6459, (q31_t)0x894C2F4C, + (q31_t)0xD04A054D, (q31_t)0x893969B9, (q31_t)0xD078AD9D, + (q31_t)0x8926B677, (q31_t)0xD0A75D42, (q31_t)0x89141589, + (q31_t)0xD0D61433, (q31_t)0x890186F1, (q31_t)0xD104D26B, + (q31_t)0x88EF0AB4, (q31_t)0xD13397E1, (q31_t)0x88DCA0D3, + (q31_t)0xD162648F, (q31_t)0x88CA4951, (q31_t)0xD191386D, + (q31_t)0x88B80431, (q31_t)0xD1C01374, (q31_t)0x88A5D177, + (q31_t)0xD1EEF59E, (q31_t)0x8893B124, (q31_t)0xD21DDEE1, + (q31_t)0x8881A33C, (q31_t)0xD24CCF38, (q31_t)0x886FA7C2, + (q31_t)0xD27BC69C, (q31_t)0x885DBEB7, (q31_t)0xD2AAC504, + (q31_t)0x884BE820, (q31_t)0xD2D9CA6A, (q31_t)0x883A23FE, + (q31_t)0xD308D6C6, (q31_t)0x88287255, (q31_t)0xD337EA12, + (q31_t)0x8816D327, (q31_t)0xD3670445, (q31_t)0x88054677, + (q31_t)0xD3962559, (q31_t)0x87F3CC47, (q31_t)0xD3C54D46, + (q31_t)0x87E2649B, (q31_t)0xD3F47C06, (q31_t)0x87D10F75, + (q31_t)0xD423B190, (q31_t)0x87BFCCD7, (q31_t)0xD452EDDE, + (q31_t)0x87AE9CC5, (q31_t)0xD48230E8, (q31_t)0x879D7F40, + (q31_t)0xD4B17AA7, (q31_t)0x878C744C, (q31_t)0xD4E0CB14, + (q31_t)0x877B7BEC, (q31_t)0xD5102227, (q31_t)0x876A9621, + (q31_t)0xD53F7FDA, (q31_t)0x8759C2EF, (q31_t)0xD56EE424, + (q31_t)0x87490257, (q31_t)0xD59E4EFE, (q31_t)0x8738545E, + (q31_t)0xD5CDC062, (q31_t)0x8727B904, (q31_t)0xD5FD3847, + (q31_t)0x8717304E, (q31_t)0xD62CB6A7, (q31_t)0x8706BA3C, + (q31_t)0xD65C3B7B, (q31_t)0x86F656D3, (q31_t)0xD68BC6BA, + (q31_t)0x86E60614, (q31_t)0xD6BB585D, (q31_t)0x86D5C802, + (q31_t)0xD6EAF05E, (q31_t)0x86C59C9F, (q31_t)0xD71A8EB5, + (q31_t)0x86B583EE, (q31_t)0xD74A335A, (q31_t)0x86A57DF1, + (q31_t)0xD779DE46, (q31_t)0x86958AAB, (q31_t)0xD7A98F73, + (q31_t)0x8685AA1F, (q31_t)0xD7D946D7, (q31_t)0x8675DC4E, + (q31_t)0xD809046D, (q31_t)0x8666213C, (q31_t)0xD838C82D, + (q31_t)0x865678EA, (q31_t)0xD868920F, (q31_t)0x8646E35B, + (q31_t)0xD898620C, (q31_t)0x86376092, (q31_t)0xD8C8381C, + (q31_t)0x8627F090, (q31_t)0xD8F81439, (q31_t)0x86189359, + (q31_t)0xD927F65B, (q31_t)0x860948EE, (q31_t)0xD957DE7A, + (q31_t)0x85FA1152, (q31_t)0xD987CC8F, (q31_t)0x85EAEC88, + (q31_t)0xD9B7C093, (q31_t)0x85DBDA91, (q31_t)0xD9E7BA7E, + (q31_t)0x85CCDB70, (q31_t)0xDA17BA4A, (q31_t)0x85BDEF27, + (q31_t)0xDA47BFED, (q31_t)0x85AF15B9, (q31_t)0xDA77CB62, + (q31_t)0x85A04F28, (q31_t)0xDAA7DCA1, (q31_t)0x85919B75, + (q31_t)0xDAD7F3A2, (q31_t)0x8582FAA4, (q31_t)0xDB08105E, + (q31_t)0x85746CB7, (q31_t)0xDB3832CD, (q31_t)0x8565F1B0, + (q31_t)0xDB685AE8, (q31_t)0x85578991, (q31_t)0xDB9888A8, + (q31_t)0x8549345C, (q31_t)0xDBC8BC05, (q31_t)0x853AF214, + (q31_t)0xDBF8F4F8, (q31_t)0x852CC2BA, (q31_t)0xDC293379, + (q31_t)0x851EA652, (q31_t)0xDC597781, (q31_t)0x85109CDC, + (q31_t)0xDC89C108, (q31_t)0x8502A65C, (q31_t)0xDCBA1008, + (q31_t)0x84F4C2D3, (q31_t)0xDCEA6478, (q31_t)0x84E6F244, + (q31_t)0xDD1ABE51, (q31_t)0x84D934B0, (q31_t)0xDD4B1D8B, + (q31_t)0x84CB8A1B, (q31_t)0xDD7B8220, (q31_t)0x84BDF285, + (q31_t)0xDDABEC07, (q31_t)0x84B06DF1, (q31_t)0xDDDC5B3A, + (q31_t)0x84A2FC62, (q31_t)0xDE0CCFB1, (q31_t)0x84959DD9, + (q31_t)0xDE3D4963, (q31_t)0x84885257, (q31_t)0xDE6DC84B, + (q31_t)0x847B19E1, (q31_t)0xDE9E4C60, (q31_t)0x846DF476, + (q31_t)0xDECED59B, (q31_t)0x8460E21A, (q31_t)0xDEFF63F4, + (q31_t)0x8453E2CE, (q31_t)0xDF2FF764, (q31_t)0x8446F695, + (q31_t)0xDF608FE3, (q31_t)0x843A1D70, (q31_t)0xDF912D6A, + (q31_t)0x842D5761, (q31_t)0xDFC1CFF2, (q31_t)0x8420A46B, + (q31_t)0xDFF27773, (q31_t)0x8414048F, (q31_t)0xE02323E5, + (q31_t)0x840777CF, (q31_t)0xE053D541, (q31_t)0x83FAFE2E, + (q31_t)0xE0848B7F, (q31_t)0x83EE97AC, (q31_t)0xE0B54698, + (q31_t)0x83E2444D, (q31_t)0xE0E60684, (q31_t)0x83D60411, + (q31_t)0xE116CB3D, (q31_t)0x83C9D6FB, (q31_t)0xE14794B9, + (q31_t)0x83BDBD0D, (q31_t)0xE17862F3, (q31_t)0x83B1B649, + (q31_t)0xE1A935E1, (q31_t)0x83A5C2B0, (q31_t)0xE1DA0D7E, + (q31_t)0x8399E244, (q31_t)0xE20AE9C1, (q31_t)0x838E1507, + (q31_t)0xE23BCAA2, (q31_t)0x83825AFB, (q31_t)0xE26CB01A, + (q31_t)0x8376B422, (q31_t)0xE29D9A22, (q31_t)0x836B207D, + (q31_t)0xE2CE88B2, (q31_t)0x835FA00E, (q31_t)0xE2FF7BC3, + (q31_t)0x835432D8, (q31_t)0xE330734C, (q31_t)0x8348D8DB, + (q31_t)0xE3616F47, (q31_t)0x833D921A, (q31_t)0xE3926FAC, + (q31_t)0x83325E97, (q31_t)0xE3C37473, (q31_t)0x83273E52, + (q31_t)0xE3F47D95, (q31_t)0x831C314E, (q31_t)0xE4258B0A, + (q31_t)0x8311378C, (q31_t)0xE4569CCB, (q31_t)0x8306510F, + (q31_t)0xE487B2CF, (q31_t)0x82FB7DD8, (q31_t)0xE4B8CD10, + (q31_t)0x82F0BDE8, (q31_t)0xE4E9EB86, (q31_t)0x82E61141, + (q31_t)0xE51B0E2A, (q31_t)0x82DB77E5, (q31_t)0xE54C34F3, + (q31_t)0x82D0F1D5, (q31_t)0xE57D5FDA, (q31_t)0x82C67F13, + (q31_t)0xE5AE8ED8, (q31_t)0x82BC1FA1, (q31_t)0xE5DFC1E4, + (q31_t)0x82B1D381, (q31_t)0xE610F8F9, (q31_t)0x82A79AB3, + (q31_t)0xE642340D, (q31_t)0x829D753A, (q31_t)0xE6737319, + (q31_t)0x82936316, (q31_t)0xE6A4B616, (q31_t)0x8289644A, + (q31_t)0xE6D5FCFC, (q31_t)0x827F78D8, (q31_t)0xE70747C3, + (q31_t)0x8275A0C0, (q31_t)0xE7389664, (q31_t)0x826BDC04, + (q31_t)0xE769E8D8, (q31_t)0x82622AA5, (q31_t)0xE79B3F16, + (q31_t)0x82588CA6, (q31_t)0xE7CC9917, (q31_t)0x824F0208, + (q31_t)0xE7FDF6D3, (q31_t)0x82458ACB, (q31_t)0xE82F5844, + (q31_t)0x823C26F2, (q31_t)0xE860BD60, (q31_t)0x8232D67E, + (q31_t)0xE8922621, (q31_t)0x82299971, (q31_t)0xE8C3927F, + (q31_t)0x82206FCB, (q31_t)0xE8F50273, (q31_t)0x8217598F, + (q31_t)0xE92675F4, (q31_t)0x820E56BE, (q31_t)0xE957ECFB, + (q31_t)0x82056758, (q31_t)0xE9896780, (q31_t)0x81FC8B60, + (q31_t)0xE9BAE57C, (q31_t)0x81F3C2D7, (q31_t)0xE9EC66E8, + (q31_t)0x81EB0DBD, (q31_t)0xEA1DEBBB, (q31_t)0x81E26C16, + (q31_t)0xEA4F73EE, (q31_t)0x81D9DDE1, (q31_t)0xEA80FF79, + (q31_t)0x81D16320, (q31_t)0xEAB28E55, (q31_t)0x81C8FBD5, + (q31_t)0xEAE4207A, (q31_t)0x81C0A801, (q31_t)0xEB15B5E0, + (q31_t)0x81B867A4, (q31_t)0xEB474E80, (q31_t)0x81B03AC1, + (q31_t)0xEB78EA52, (q31_t)0x81A82159, (q31_t)0xEBAA894E, + (q31_t)0x81A01B6C, (q31_t)0xEBDC2B6D, (q31_t)0x819828FD, + (q31_t)0xEC0DD0A8, (q31_t)0x81904A0C, (q31_t)0xEC3F78F5, + (q31_t)0x81887E9A, (q31_t)0xEC71244F, (q31_t)0x8180C6A9, + (q31_t)0xECA2D2AC, (q31_t)0x8179223A, (q31_t)0xECD48406, + (q31_t)0x8171914E, (q31_t)0xED063855, (q31_t)0x816A13E6, + (q31_t)0xED37EF91, (q31_t)0x8162AA03, (q31_t)0xED69A9B2, + (q31_t)0x815B53A8, (q31_t)0xED9B66B2, (q31_t)0x815410D3, + (q31_t)0xEDCD2687, (q31_t)0x814CE188, (q31_t)0xEDFEE92B, + (q31_t)0x8145C5C6, (q31_t)0xEE30AE95, (q31_t)0x813EBD90, + (q31_t)0xEE6276BF, (q31_t)0x8137C8E6, (q31_t)0xEE9441A0, + (q31_t)0x8130E7C8, (q31_t)0xEEC60F31, (q31_t)0x812A1A39, + (q31_t)0xEEF7DF6A, (q31_t)0x81236039, (q31_t)0xEF29B243, + (q31_t)0x811CB9CA, (q31_t)0xEF5B87B5, (q31_t)0x811626EC, + (q31_t)0xEF8D5FB8, (q31_t)0x810FA7A0, (q31_t)0xEFBF3A44, + (q31_t)0x81093BE8, (q31_t)0xEFF11752, (q31_t)0x8102E3C3, + (q31_t)0xF022F6DA, (q31_t)0x80FC9F35, (q31_t)0xF054D8D4, + (q31_t)0x80F66E3C, (q31_t)0xF086BD39, (q31_t)0x80F050DB, + (q31_t)0xF0B8A401, (q31_t)0x80EA4712, (q31_t)0xF0EA8D23, + (q31_t)0x80E450E2, (q31_t)0xF11C789A, (q31_t)0x80DE6E4C, + (q31_t)0xF14E665C, (q31_t)0x80D89F51, (q31_t)0xF1805662, + (q31_t)0x80D2E3F1, (q31_t)0xF1B248A5, (q31_t)0x80CD3C2F, + (q31_t)0xF1E43D1C, (q31_t)0x80C7A80A, (q31_t)0xF21633C0, + (q31_t)0x80C22783, (q31_t)0xF2482C89, (q31_t)0x80BCBA9C, + (q31_t)0xF27A2770, (q31_t)0x80B76155, (q31_t)0xF2AC246D, + (q31_t)0x80B21BAF, (q31_t)0xF2DE2378, (q31_t)0x80ACE9AB, + (q31_t)0xF310248A, (q31_t)0x80A7CB49, (q31_t)0xF342279A, + (q31_t)0x80A2C08B, (q31_t)0xF3742CA1, (q31_t)0x809DC970, + (q31_t)0xF3A63398, (q31_t)0x8098E5FB, (q31_t)0xF3D83C76, + (q31_t)0x8094162B, (q31_t)0xF40A4734, (q31_t)0x808F5A02, + (q31_t)0xF43C53CA, (q31_t)0x808AB180, (q31_t)0xF46E6231, + (q31_t)0x80861CA5, (q31_t)0xF4A07260, (q31_t)0x80819B74, + (q31_t)0xF4D28451, (q31_t)0x807D2DEB, (q31_t)0xF50497FA, + (q31_t)0x8078D40D, (q31_t)0xF536AD55, (q31_t)0x80748DD9, + (q31_t)0xF568C45A, (q31_t)0x80705B50, (q31_t)0xF59ADD01, + (q31_t)0x806C3C73, (q31_t)0xF5CCF743, (q31_t)0x80683143, + (q31_t)0xF5FF1317, (q31_t)0x806439C0, (q31_t)0xF6313076, + (q31_t)0x806055EA, (q31_t)0xF6634F58, (q31_t)0x805C85C3, + (q31_t)0xF6956FB6, (q31_t)0x8058C94C, (q31_t)0xF6C79188, + (q31_t)0x80552083, (q31_t)0xF6F9B4C5, (q31_t)0x80518B6B, + (q31_t)0xF72BD967, (q31_t)0x804E0A03, (q31_t)0xF75DFF65, + (q31_t)0x804A9C4D, (q31_t)0xF79026B8, (q31_t)0x80474248, + (q31_t)0xF7C24F58, (q31_t)0x8043FBF6, (q31_t)0xF7F4793E, + (q31_t)0x8040C956, (q31_t)0xF826A461, (q31_t)0x803DAA69, + (q31_t)0xF858D0BA, (q31_t)0x803A9F31, (q31_t)0xF88AFE41, + (q31_t)0x8037A7AC, (q31_t)0xF8BD2CEF, (q31_t)0x8034C3DC, + (q31_t)0xF8EF5CBB, (q31_t)0x8031F3C1, (q31_t)0xF9218D9E, + (q31_t)0x802F375C, (q31_t)0xF953BF90, (q31_t)0x802C8EAD, + (q31_t)0xF985F28A, (q31_t)0x8029F9B4, (q31_t)0xF9B82683, + (q31_t)0x80277872, (q31_t)0xF9EA5B75, (q31_t)0x80250AE7, + (q31_t)0xFA1C9156, (q31_t)0x8022B113, (q31_t)0xFA4EC820, + (q31_t)0x80206AF8, (q31_t)0xFA80FFCB, (q31_t)0x801E3894, + (q31_t)0xFAB3384F, (q31_t)0x801C19E9, (q31_t)0xFAE571A4, + (q31_t)0x801A0EF7, (q31_t)0xFB17ABC2, (q31_t)0x801817BF, + (q31_t)0xFB49E6A2, (q31_t)0x80163440, (q31_t)0xFB7C223C, + (q31_t)0x8014647A, (q31_t)0xFBAE5E89, (q31_t)0x8012A86F, + (q31_t)0xFBE09B80, (q31_t)0x8011001E, (q31_t)0xFC12D919, + (q31_t)0x800F6B88, (q31_t)0xFC45174E, (q31_t)0x800DEAAC, + (q31_t)0xFC775616, (q31_t)0x800C7D8C, (q31_t)0xFCA99569, + (q31_t)0x800B2427, (q31_t)0xFCDBD541, (q31_t)0x8009DE7D, + (q31_t)0xFD0E1594, (q31_t)0x8008AC90, (q31_t)0xFD40565B, + (q31_t)0x80078E5E, (q31_t)0xFD72978F, (q31_t)0x800683E8, + (q31_t)0xFDA4D928, (q31_t)0x80058D2E, (q31_t)0xFDD71B1E, + (q31_t)0x8004AA31, (q31_t)0xFE095D69, (q31_t)0x8003DAF0, + (q31_t)0xFE3BA001, (q31_t)0x80031F6C, (q31_t)0xFE6DE2E0, + (q31_t)0x800277A5, (q31_t)0xFEA025FC, (q31_t)0x8001E39B, + (q31_t)0xFED2694F, (q31_t)0x8001634D, (q31_t)0xFF04ACD0, + (q31_t)0x8000F6BD, (q31_t)0xFF36F078, (q31_t)0x80009DE9, + (q31_t)0xFF69343E, (q31_t)0x800058D3, (q31_t)0xFF9B781D, + (q31_t)0x8000277A, (q31_t)0xFFCDBC0A, (q31_t)0x800009DE +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +/** + @brief q15 Twiddle factors Table +*/ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_16) + +/** + @par + Example code for q15 Twiddle factors Generation:: + @par +
fori = 0; i< 3N/4; i++)
+  {
+     twiddleCoefq15[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefq15[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 16, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to q15(Fixed point 1.15): + round(twiddleCoefq15(i) * pow(2, 15)) + */ +const q15_t twiddleCoef_16_q15[24] = { + (q15_t)0x7FFF, (q15_t)0x0000, + (q15_t)0x7641, (q15_t)0x30FB, + (q15_t)0x5A82, (q15_t)0x5A82, + (q15_t)0x30FB, (q15_t)0x7641, + (q15_t)0x0000, (q15_t)0x7FFF, + (q15_t)0xCF04, (q15_t)0x7641, + (q15_t)0xA57D, (q15_t)0x5A82, + (q15_t)0x89BE, (q15_t)0x30FB, + (q15_t)0x8000, (q15_t)0x0000, + (q15_t)0x89BE, (q15_t)0xCF04, + (q15_t)0xA57D, (q15_t)0xA57D, + (q15_t)0xCF04, (q15_t)0x89BE +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_32) +/** + @par + Example code for q15 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefq15[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefq15[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 32, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to q15(Fixed point 1.15): + round(twiddleCoefq15(i) * pow(2, 15)) + */ +const q15_t twiddleCoef_32_q15[48] = { + (q15_t)0x7FFF, (q15_t)0x0000, + (q15_t)0x7D8A, (q15_t)0x18F8, + (q15_t)0x7641, (q15_t)0x30FB, + (q15_t)0x6A6D, (q15_t)0x471C, + (q15_t)0x5A82, (q15_t)0x5A82, + (q15_t)0x471C, (q15_t)0x6A6D, + (q15_t)0x30FB, (q15_t)0x7641, + (q15_t)0x18F8, (q15_t)0x7D8A, + (q15_t)0x0000, (q15_t)0x7FFF, + (q15_t)0xE707, (q15_t)0x7D8A, + (q15_t)0xCF04, (q15_t)0x7641, + (q15_t)0xB8E3, (q15_t)0x6A6D, + (q15_t)0xA57D, (q15_t)0x5A82, + (q15_t)0x9592, (q15_t)0x471C, + (q15_t)0x89BE, (q15_t)0x30FB, + (q15_t)0x8275, (q15_t)0x18F8, + (q15_t)0x8000, (q15_t)0x0000, + (q15_t)0x8275, (q15_t)0xE707, + (q15_t)0x89BE, (q15_t)0xCF04, + (q15_t)0x9592, (q15_t)0xB8E3, + (q15_t)0xA57D, (q15_t)0xA57D, + (q15_t)0xB8E3, (q15_t)0x9592, + (q15_t)0xCF04, (q15_t)0x89BE, + (q15_t)0xE707, (q15_t)0x8275 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_64) +/** + @par + Example code for q15 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefq15[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefq15[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 64, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to q15(Fixed point 1.15): + round(twiddleCoefq15(i) * pow(2, 15)) + */ +const q15_t twiddleCoef_64_q15[96] = { + (q15_t)0x7FFF, (q15_t)0x0000, (q15_t)0x7F62, (q15_t)0x0C8B, + (q15_t)0x7D8A, (q15_t)0x18F8, (q15_t)0x7A7D, (q15_t)0x2528, + (q15_t)0x7641, (q15_t)0x30FB, (q15_t)0x70E2, (q15_t)0x3C56, + (q15_t)0x6A6D, (q15_t)0x471C, (q15_t)0x62F2, (q15_t)0x5133, + (q15_t)0x5A82, (q15_t)0x5A82, (q15_t)0x5133, (q15_t)0x62F2, + (q15_t)0x471C, (q15_t)0x6A6D, (q15_t)0x3C56, (q15_t)0x70E2, + (q15_t)0x30FB, (q15_t)0x7641, (q15_t)0x2528, (q15_t)0x7A7D, + (q15_t)0x18F8, (q15_t)0x7D8A, (q15_t)0x0C8B, (q15_t)0x7F62, + (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0xF374, (q15_t)0x7F62, + (q15_t)0xE707, (q15_t)0x7D8A, (q15_t)0xDAD7, (q15_t)0x7A7D, + (q15_t)0xCF04, (q15_t)0x7641, (q15_t)0xC3A9, (q15_t)0x70E2, + (q15_t)0xB8E3, (q15_t)0x6A6D, (q15_t)0xAECC, (q15_t)0x62F2, + (q15_t)0xA57D, (q15_t)0x5A82, (q15_t)0x9D0D, (q15_t)0x5133, + (q15_t)0x9592, (q15_t)0x471C, (q15_t)0x8F1D, (q15_t)0x3C56, + (q15_t)0x89BE, (q15_t)0x30FB, (q15_t)0x8582, (q15_t)0x2528, + (q15_t)0x8275, (q15_t)0x18F8, (q15_t)0x809D, (q15_t)0x0C8B, + (q15_t)0x8000, (q15_t)0x0000, (q15_t)0x809D, (q15_t)0xF374, + (q15_t)0x8275, (q15_t)0xE707, (q15_t)0x8582, (q15_t)0xDAD7, + (q15_t)0x89BE, (q15_t)0xCF04, (q15_t)0x8F1D, (q15_t)0xC3A9, + (q15_t)0x9592, (q15_t)0xB8E3, (q15_t)0x9D0D, (q15_t)0xAECC, + (q15_t)0xA57D, (q15_t)0xA57D, (q15_t)0xAECC, (q15_t)0x9D0D, + (q15_t)0xB8E3, (q15_t)0x9592, (q15_t)0xC3A9, (q15_t)0x8F1D, + (q15_t)0xCF04, (q15_t)0x89BE, (q15_t)0xDAD7, (q15_t)0x8582, + (q15_t)0xE707, (q15_t)0x8275, (q15_t)0xF374, (q15_t)0x809D +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_128) +/** + @par + Example code for q15 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefq15[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefq15[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 128, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to q15(Fixed point 1.15): + round(twiddleCoefq15(i) * pow(2, 15)) + */ +const q15_t twiddleCoef_128_q15[192] = { + (q15_t)0x7FFF, (q15_t)0x0000, (q15_t)0x7FD8, (q15_t)0x0647, + (q15_t)0x7F62, (q15_t)0x0C8B, (q15_t)0x7E9D, (q15_t)0x12C8, + (q15_t)0x7D8A, (q15_t)0x18F8, (q15_t)0x7C29, (q15_t)0x1F19, + (q15_t)0x7A7D, (q15_t)0x2528, (q15_t)0x7884, (q15_t)0x2B1F, + (q15_t)0x7641, (q15_t)0x30FB, (q15_t)0x73B5, (q15_t)0x36BA, + (q15_t)0x70E2, (q15_t)0x3C56, (q15_t)0x6DCA, (q15_t)0x41CE, + (q15_t)0x6A6D, (q15_t)0x471C, (q15_t)0x66CF, (q15_t)0x4C3F, + (q15_t)0x62F2, (q15_t)0x5133, (q15_t)0x5ED7, (q15_t)0x55F5, + (q15_t)0x5A82, (q15_t)0x5A82, (q15_t)0x55F5, (q15_t)0x5ED7, + (q15_t)0x5133, (q15_t)0x62F2, (q15_t)0x4C3F, (q15_t)0x66CF, + (q15_t)0x471C, (q15_t)0x6A6D, (q15_t)0x41CE, (q15_t)0x6DCA, + (q15_t)0x3C56, (q15_t)0x70E2, (q15_t)0x36BA, (q15_t)0x73B5, + (q15_t)0x30FB, (q15_t)0x7641, (q15_t)0x2B1F, (q15_t)0x7884, + (q15_t)0x2528, (q15_t)0x7A7D, (q15_t)0x1F19, (q15_t)0x7C29, + (q15_t)0x18F8, (q15_t)0x7D8A, (q15_t)0x12C8, (q15_t)0x7E9D, + (q15_t)0x0C8B, (q15_t)0x7F62, (q15_t)0x0647, (q15_t)0x7FD8, + (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0xF9B8, (q15_t)0x7FD8, + (q15_t)0xF374, (q15_t)0x7F62, (q15_t)0xED37, (q15_t)0x7E9D, + (q15_t)0xE707, (q15_t)0x7D8A, (q15_t)0xE0E6, (q15_t)0x7C29, + (q15_t)0xDAD7, (q15_t)0x7A7D, (q15_t)0xD4E0, (q15_t)0x7884, + (q15_t)0xCF04, (q15_t)0x7641, (q15_t)0xC945, (q15_t)0x73B5, + (q15_t)0xC3A9, (q15_t)0x70E2, (q15_t)0xBE31, (q15_t)0x6DCA, + (q15_t)0xB8E3, (q15_t)0x6A6D, (q15_t)0xB3C0, (q15_t)0x66CF, + (q15_t)0xAECC, (q15_t)0x62F2, (q15_t)0xAA0A, (q15_t)0x5ED7, + (q15_t)0xA57D, (q15_t)0x5A82, (q15_t)0xA128, (q15_t)0x55F5, + (q15_t)0x9D0D, (q15_t)0x5133, (q15_t)0x9930, (q15_t)0x4C3F, + (q15_t)0x9592, (q15_t)0x471C, (q15_t)0x9235, (q15_t)0x41CE, + (q15_t)0x8F1D, (q15_t)0x3C56, (q15_t)0x8C4A, (q15_t)0x36BA, + (q15_t)0x89BE, (q15_t)0x30FB, (q15_t)0x877B, (q15_t)0x2B1F, + (q15_t)0x8582, (q15_t)0x2528, (q15_t)0x83D6, (q15_t)0x1F19, + (q15_t)0x8275, (q15_t)0x18F8, (q15_t)0x8162, (q15_t)0x12C8, + (q15_t)0x809D, (q15_t)0x0C8B, (q15_t)0x8027, (q15_t)0x0647, + (q15_t)0x8000, (q15_t)0x0000, (q15_t)0x8027, (q15_t)0xF9B8, + (q15_t)0x809D, (q15_t)0xF374, (q15_t)0x8162, (q15_t)0xED37, + (q15_t)0x8275, (q15_t)0xE707, (q15_t)0x83D6, (q15_t)0xE0E6, + (q15_t)0x8582, (q15_t)0xDAD7, (q15_t)0x877B, (q15_t)0xD4E0, + (q15_t)0x89BE, (q15_t)0xCF04, (q15_t)0x8C4A, (q15_t)0xC945, + (q15_t)0x8F1D, (q15_t)0xC3A9, (q15_t)0x9235, (q15_t)0xBE31, + (q15_t)0x9592, (q15_t)0xB8E3, (q15_t)0x9930, (q15_t)0xB3C0, + (q15_t)0x9D0D, (q15_t)0xAECC, (q15_t)0xA128, (q15_t)0xAA0A, + (q15_t)0xA57D, (q15_t)0xA57D, (q15_t)0xAA0A, (q15_t)0xA128, + (q15_t)0xAECC, (q15_t)0x9D0D, (q15_t)0xB3C0, (q15_t)0x9930, + (q15_t)0xB8E3, (q15_t)0x9592, (q15_t)0xBE31, (q15_t)0x9235, + (q15_t)0xC3A9, (q15_t)0x8F1D, (q15_t)0xC945, (q15_t)0x8C4A, + (q15_t)0xCF04, (q15_t)0x89BE, (q15_t)0xD4E0, (q15_t)0x877B, + (q15_t)0xDAD7, (q15_t)0x8582, (q15_t)0xE0E6, (q15_t)0x83D6, + (q15_t)0xE707, (q15_t)0x8275, (q15_t)0xED37, (q15_t)0x8162, + (q15_t)0xF374, (q15_t)0x809D, (q15_t)0xF9B8, (q15_t)0x8027 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_256) +/** + @par + Example code for q15 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefq15[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefq15[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 256, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to q15(Fixed point 1.15): + round(twiddleCoefq15(i) * pow(2, 15)) + */ +const q15_t twiddleCoef_256_q15[384] = { + (q15_t)0x7FFF, (q15_t)0x0000, (q15_t)0x7FF6, (q15_t)0x0324, + (q15_t)0x7FD8, (q15_t)0x0647, (q15_t)0x7FA7, (q15_t)0x096A, + (q15_t)0x7F62, (q15_t)0x0C8B, (q15_t)0x7F09, (q15_t)0x0FAB, + (q15_t)0x7E9D, (q15_t)0x12C8, (q15_t)0x7E1D, (q15_t)0x15E2, + (q15_t)0x7D8A, (q15_t)0x18F8, (q15_t)0x7CE3, (q15_t)0x1C0B, + (q15_t)0x7C29, (q15_t)0x1F19, (q15_t)0x7B5D, (q15_t)0x2223, + (q15_t)0x7A7D, (q15_t)0x2528, (q15_t)0x798A, (q15_t)0x2826, + (q15_t)0x7884, (q15_t)0x2B1F, (q15_t)0x776C, (q15_t)0x2E11, + (q15_t)0x7641, (q15_t)0x30FB, (q15_t)0x7504, (q15_t)0x33DE, + (q15_t)0x73B5, (q15_t)0x36BA, (q15_t)0x7255, (q15_t)0x398C, + (q15_t)0x70E2, (q15_t)0x3C56, (q15_t)0x6F5F, (q15_t)0x3F17, + (q15_t)0x6DCA, (q15_t)0x41CE, (q15_t)0x6C24, (q15_t)0x447A, + (q15_t)0x6A6D, (q15_t)0x471C, (q15_t)0x68A6, (q15_t)0x49B4, + (q15_t)0x66CF, (q15_t)0x4C3F, (q15_t)0x64E8, (q15_t)0x4EBF, + (q15_t)0x62F2, (q15_t)0x5133, (q15_t)0x60EC, (q15_t)0x539B, + (q15_t)0x5ED7, (q15_t)0x55F5, (q15_t)0x5CB4, (q15_t)0x5842, + (q15_t)0x5A82, (q15_t)0x5A82, (q15_t)0x5842, (q15_t)0x5CB4, + (q15_t)0x55F5, (q15_t)0x5ED7, (q15_t)0x539B, (q15_t)0x60EC, + (q15_t)0x5133, (q15_t)0x62F2, (q15_t)0x4EBF, (q15_t)0x64E8, + (q15_t)0x4C3F, (q15_t)0x66CF, (q15_t)0x49B4, (q15_t)0x68A6, + (q15_t)0x471C, (q15_t)0x6A6D, (q15_t)0x447A, (q15_t)0x6C24, + (q15_t)0x41CE, (q15_t)0x6DCA, (q15_t)0x3F17, (q15_t)0x6F5F, + (q15_t)0x3C56, (q15_t)0x70E2, (q15_t)0x398C, (q15_t)0x7255, + (q15_t)0x36BA, (q15_t)0x73B5, (q15_t)0x33DE, (q15_t)0x7504, + (q15_t)0x30FB, (q15_t)0x7641, (q15_t)0x2E11, (q15_t)0x776C, + (q15_t)0x2B1F, (q15_t)0x7884, (q15_t)0x2826, (q15_t)0x798A, + (q15_t)0x2528, (q15_t)0x7A7D, (q15_t)0x2223, (q15_t)0x7B5D, + (q15_t)0x1F19, (q15_t)0x7C29, (q15_t)0x1C0B, (q15_t)0x7CE3, + (q15_t)0x18F8, (q15_t)0x7D8A, (q15_t)0x15E2, (q15_t)0x7E1D, + (q15_t)0x12C8, (q15_t)0x7E9D, (q15_t)0x0FAB, (q15_t)0x7F09, + (q15_t)0x0C8B, (q15_t)0x7F62, (q15_t)0x096A, (q15_t)0x7FA7, + (q15_t)0x0647, (q15_t)0x7FD8, (q15_t)0x0324, (q15_t)0x7FF6, + (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0xFCDB, (q15_t)0x7FF6, + (q15_t)0xF9B8, (q15_t)0x7FD8, (q15_t)0xF695, (q15_t)0x7FA7, + (q15_t)0xF374, (q15_t)0x7F62, (q15_t)0xF054, (q15_t)0x7F09, + (q15_t)0xED37, (q15_t)0x7E9D, (q15_t)0xEA1D, (q15_t)0x7E1D, + (q15_t)0xE707, (q15_t)0x7D8A, (q15_t)0xE3F4, (q15_t)0x7CE3, + (q15_t)0xE0E6, (q15_t)0x7C29, (q15_t)0xDDDC, (q15_t)0x7B5D, + (q15_t)0xDAD7, (q15_t)0x7A7D, (q15_t)0xD7D9, (q15_t)0x798A, + (q15_t)0xD4E0, (q15_t)0x7884, (q15_t)0xD1EE, (q15_t)0x776C, + (q15_t)0xCF04, (q15_t)0x7641, (q15_t)0xCC21, (q15_t)0x7504, + (q15_t)0xC945, (q15_t)0x73B5, (q15_t)0xC673, (q15_t)0x7255, + (q15_t)0xC3A9, (q15_t)0x70E2, (q15_t)0xC0E8, (q15_t)0x6F5F, + (q15_t)0xBE31, (q15_t)0x6DCA, (q15_t)0xBB85, (q15_t)0x6C24, + (q15_t)0xB8E3, (q15_t)0x6A6D, (q15_t)0xB64B, (q15_t)0x68A6, + (q15_t)0xB3C0, (q15_t)0x66CF, (q15_t)0xB140, (q15_t)0x64E8, + (q15_t)0xAECC, (q15_t)0x62F2, (q15_t)0xAC64, (q15_t)0x60EC, + (q15_t)0xAA0A, (q15_t)0x5ED7, (q15_t)0xA7BD, (q15_t)0x5CB4, + (q15_t)0xA57D, (q15_t)0x5A82, (q15_t)0xA34B, (q15_t)0x5842, + (q15_t)0xA128, (q15_t)0x55F5, (q15_t)0x9F13, (q15_t)0x539B, + (q15_t)0x9D0D, (q15_t)0x5133, (q15_t)0x9B17, (q15_t)0x4EBF, + (q15_t)0x9930, (q15_t)0x4C3F, (q15_t)0x9759, (q15_t)0x49B4, + (q15_t)0x9592, (q15_t)0x471C, (q15_t)0x93DB, (q15_t)0x447A, + (q15_t)0x9235, (q15_t)0x41CE, (q15_t)0x90A0, (q15_t)0x3F17, + (q15_t)0x8F1D, (q15_t)0x3C56, (q15_t)0x8DAA, (q15_t)0x398C, + (q15_t)0x8C4A, (q15_t)0x36BA, (q15_t)0x8AFB, (q15_t)0x33DE, + (q15_t)0x89BE, (q15_t)0x30FB, (q15_t)0x8893, (q15_t)0x2E11, + (q15_t)0x877B, (q15_t)0x2B1F, (q15_t)0x8675, (q15_t)0x2826, + (q15_t)0x8582, (q15_t)0x2528, (q15_t)0x84A2, (q15_t)0x2223, + (q15_t)0x83D6, (q15_t)0x1F19, (q15_t)0x831C, (q15_t)0x1C0B, + (q15_t)0x8275, (q15_t)0x18F8, (q15_t)0x81E2, (q15_t)0x15E2, + (q15_t)0x8162, (q15_t)0x12C8, (q15_t)0x80F6, (q15_t)0x0FAB, + (q15_t)0x809D, (q15_t)0x0C8B, (q15_t)0x8058, (q15_t)0x096A, + (q15_t)0x8027, (q15_t)0x0647, (q15_t)0x8009, (q15_t)0x0324, + (q15_t)0x8000, (q15_t)0x0000, (q15_t)0x8009, (q15_t)0xFCDB, + (q15_t)0x8027, (q15_t)0xF9B8, (q15_t)0x8058, (q15_t)0xF695, + (q15_t)0x809D, (q15_t)0xF374, (q15_t)0x80F6, (q15_t)0xF054, + (q15_t)0x8162, (q15_t)0xED37, (q15_t)0x81E2, (q15_t)0xEA1D, + (q15_t)0x8275, (q15_t)0xE707, (q15_t)0x831C, (q15_t)0xE3F4, + (q15_t)0x83D6, (q15_t)0xE0E6, (q15_t)0x84A2, (q15_t)0xDDDC, + (q15_t)0x8582, (q15_t)0xDAD7, (q15_t)0x8675, (q15_t)0xD7D9, + (q15_t)0x877B, (q15_t)0xD4E0, (q15_t)0x8893, (q15_t)0xD1EE, + (q15_t)0x89BE, (q15_t)0xCF04, (q15_t)0x8AFB, (q15_t)0xCC21, + (q15_t)0x8C4A, (q15_t)0xC945, (q15_t)0x8DAA, (q15_t)0xC673, + (q15_t)0x8F1D, (q15_t)0xC3A9, (q15_t)0x90A0, (q15_t)0xC0E8, + (q15_t)0x9235, (q15_t)0xBE31, (q15_t)0x93DB, (q15_t)0xBB85, + (q15_t)0x9592, (q15_t)0xB8E3, (q15_t)0x9759, (q15_t)0xB64B, + (q15_t)0x9930, (q15_t)0xB3C0, (q15_t)0x9B17, (q15_t)0xB140, + (q15_t)0x9D0D, (q15_t)0xAECC, (q15_t)0x9F13, (q15_t)0xAC64, + (q15_t)0xA128, (q15_t)0xAA0A, (q15_t)0xA34B, (q15_t)0xA7BD, + (q15_t)0xA57D, (q15_t)0xA57D, (q15_t)0xA7BD, (q15_t)0xA34B, + (q15_t)0xAA0A, (q15_t)0xA128, (q15_t)0xAC64, (q15_t)0x9F13, + (q15_t)0xAECC, (q15_t)0x9D0D, (q15_t)0xB140, (q15_t)0x9B17, + (q15_t)0xB3C0, (q15_t)0x9930, (q15_t)0xB64B, (q15_t)0x9759, + (q15_t)0xB8E3, (q15_t)0x9592, (q15_t)0xBB85, (q15_t)0x93DB, + (q15_t)0xBE31, (q15_t)0x9235, (q15_t)0xC0E8, (q15_t)0x90A0, + (q15_t)0xC3A9, (q15_t)0x8F1D, (q15_t)0xC673, (q15_t)0x8DAA, + (q15_t)0xC945, (q15_t)0x8C4A, (q15_t)0xCC21, (q15_t)0x8AFB, + (q15_t)0xCF04, (q15_t)0x89BE, (q15_t)0xD1EE, (q15_t)0x8893, + (q15_t)0xD4E0, (q15_t)0x877B, (q15_t)0xD7D9, (q15_t)0x8675, + (q15_t)0xDAD7, (q15_t)0x8582, (q15_t)0xDDDC, (q15_t)0x84A2, + (q15_t)0xE0E6, (q15_t)0x83D6, (q15_t)0xE3F4, (q15_t)0x831C, + (q15_t)0xE707, (q15_t)0x8275, (q15_t)0xEA1D, (q15_t)0x81E2, + (q15_t)0xED37, (q15_t)0x8162, (q15_t)0xF054, (q15_t)0x80F6, + (q15_t)0xF374, (q15_t)0x809D, (q15_t)0xF695, (q15_t)0x8058, + (q15_t)0xF9B8, (q15_t)0x8027, (q15_t)0xFCDB, (q15_t)0x8009 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_512) +/** + @par + Example code for q15 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefq15[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefq15[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 512, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to q15(Fixed point 1.15): + round(twiddleCoefq15(i) * pow(2, 15)) + */ +const q15_t twiddleCoef_512_q15[768] = { + (q15_t)0x7FFF, (q15_t)0x0000, (q15_t)0x7FFD, (q15_t)0x0192, + (q15_t)0x7FF6, (q15_t)0x0324, (q15_t)0x7FE9, (q15_t)0x04B6, + (q15_t)0x7FD8, (q15_t)0x0647, (q15_t)0x7FC2, (q15_t)0x07D9, + (q15_t)0x7FA7, (q15_t)0x096A, (q15_t)0x7F87, (q15_t)0x0AFB, + (q15_t)0x7F62, (q15_t)0x0C8B, (q15_t)0x7F38, (q15_t)0x0E1B, + (q15_t)0x7F09, (q15_t)0x0FAB, (q15_t)0x7ED5, (q15_t)0x1139, + (q15_t)0x7E9D, (q15_t)0x12C8, (q15_t)0x7E5F, (q15_t)0x1455, + (q15_t)0x7E1D, (q15_t)0x15E2, (q15_t)0x7DD6, (q15_t)0x176D, + (q15_t)0x7D8A, (q15_t)0x18F8, (q15_t)0x7D39, (q15_t)0x1A82, + (q15_t)0x7CE3, (q15_t)0x1C0B, (q15_t)0x7C89, (q15_t)0x1D93, + (q15_t)0x7C29, (q15_t)0x1F19, (q15_t)0x7BC5, (q15_t)0x209F, + (q15_t)0x7B5D, (q15_t)0x2223, (q15_t)0x7AEF, (q15_t)0x23A6, + (q15_t)0x7A7D, (q15_t)0x2528, (q15_t)0x7A05, (q15_t)0x26A8, + (q15_t)0x798A, (q15_t)0x2826, (q15_t)0x7909, (q15_t)0x29A3, + (q15_t)0x7884, (q15_t)0x2B1F, (q15_t)0x77FA, (q15_t)0x2C98, + (q15_t)0x776C, (q15_t)0x2E11, (q15_t)0x76D9, (q15_t)0x2F87, + (q15_t)0x7641, (q15_t)0x30FB, (q15_t)0x75A5, (q15_t)0x326E, + (q15_t)0x7504, (q15_t)0x33DE, (q15_t)0x745F, (q15_t)0x354D, + (q15_t)0x73B5, (q15_t)0x36BA, (q15_t)0x7307, (q15_t)0x3824, + (q15_t)0x7255, (q15_t)0x398C, (q15_t)0x719E, (q15_t)0x3AF2, + (q15_t)0x70E2, (q15_t)0x3C56, (q15_t)0x7023, (q15_t)0x3DB8, + (q15_t)0x6F5F, (q15_t)0x3F17, (q15_t)0x6E96, (q15_t)0x4073, + (q15_t)0x6DCA, (q15_t)0x41CE, (q15_t)0x6CF9, (q15_t)0x4325, + (q15_t)0x6C24, (q15_t)0x447A, (q15_t)0x6B4A, (q15_t)0x45CD, + (q15_t)0x6A6D, (q15_t)0x471C, (q15_t)0x698C, (q15_t)0x4869, + (q15_t)0x68A6, (q15_t)0x49B4, (q15_t)0x67BD, (q15_t)0x4AFB, + (q15_t)0x66CF, (q15_t)0x4C3F, (q15_t)0x65DD, (q15_t)0x4D81, + (q15_t)0x64E8, (q15_t)0x4EBF, (q15_t)0x63EF, (q15_t)0x4FFB, + (q15_t)0x62F2, (q15_t)0x5133, (q15_t)0x61F1, (q15_t)0x5269, + (q15_t)0x60EC, (q15_t)0x539B, (q15_t)0x5FE3, (q15_t)0x54CA, + (q15_t)0x5ED7, (q15_t)0x55F5, (q15_t)0x5DC7, (q15_t)0x571D, + (q15_t)0x5CB4, (q15_t)0x5842, (q15_t)0x5B9D, (q15_t)0x5964, + (q15_t)0x5A82, (q15_t)0x5A82, (q15_t)0x5964, (q15_t)0x5B9D, + (q15_t)0x5842, (q15_t)0x5CB4, (q15_t)0x571D, (q15_t)0x5DC7, + (q15_t)0x55F5, (q15_t)0x5ED7, (q15_t)0x54CA, (q15_t)0x5FE3, + (q15_t)0x539B, (q15_t)0x60EC, (q15_t)0x5269, (q15_t)0x61F1, + (q15_t)0x5133, (q15_t)0x62F2, (q15_t)0x4FFB, (q15_t)0x63EF, + (q15_t)0x4EBF, (q15_t)0x64E8, (q15_t)0x4D81, (q15_t)0x65DD, + (q15_t)0x4C3F, (q15_t)0x66CF, (q15_t)0x4AFB, (q15_t)0x67BD, + (q15_t)0x49B4, (q15_t)0x68A6, (q15_t)0x4869, (q15_t)0x698C, + (q15_t)0x471C, (q15_t)0x6A6D, (q15_t)0x45CD, (q15_t)0x6B4A, + (q15_t)0x447A, (q15_t)0x6C24, (q15_t)0x4325, (q15_t)0x6CF9, + (q15_t)0x41CE, (q15_t)0x6DCA, (q15_t)0x4073, (q15_t)0x6E96, + (q15_t)0x3F17, (q15_t)0x6F5F, (q15_t)0x3DB8, (q15_t)0x7023, + (q15_t)0x3C56, (q15_t)0x70E2, (q15_t)0x3AF2, (q15_t)0x719E, + (q15_t)0x398C, (q15_t)0x7255, (q15_t)0x3824, (q15_t)0x7307, + (q15_t)0x36BA, (q15_t)0x73B5, (q15_t)0x354D, (q15_t)0x745F, + (q15_t)0x33DE, (q15_t)0x7504, (q15_t)0x326E, (q15_t)0x75A5, + (q15_t)0x30FB, (q15_t)0x7641, (q15_t)0x2F87, (q15_t)0x76D9, + (q15_t)0x2E11, (q15_t)0x776C, (q15_t)0x2C98, (q15_t)0x77FA, + (q15_t)0x2B1F, (q15_t)0x7884, (q15_t)0x29A3, (q15_t)0x7909, + (q15_t)0x2826, (q15_t)0x798A, (q15_t)0x26A8, (q15_t)0x7A05, + (q15_t)0x2528, (q15_t)0x7A7D, (q15_t)0x23A6, (q15_t)0x7AEF, + (q15_t)0x2223, (q15_t)0x7B5D, (q15_t)0x209F, (q15_t)0x7BC5, + (q15_t)0x1F19, (q15_t)0x7C29, (q15_t)0x1D93, (q15_t)0x7C89, + (q15_t)0x1C0B, (q15_t)0x7CE3, (q15_t)0x1A82, (q15_t)0x7D39, + (q15_t)0x18F8, (q15_t)0x7D8A, (q15_t)0x176D, (q15_t)0x7DD6, + (q15_t)0x15E2, (q15_t)0x7E1D, (q15_t)0x1455, (q15_t)0x7E5F, + (q15_t)0x12C8, (q15_t)0x7E9D, (q15_t)0x1139, (q15_t)0x7ED5, + (q15_t)0x0FAB, (q15_t)0x7F09, (q15_t)0x0E1B, (q15_t)0x7F38, + (q15_t)0x0C8B, (q15_t)0x7F62, (q15_t)0x0AFB, (q15_t)0x7F87, + (q15_t)0x096A, (q15_t)0x7FA7, (q15_t)0x07D9, (q15_t)0x7FC2, + (q15_t)0x0647, (q15_t)0x7FD8, (q15_t)0x04B6, (q15_t)0x7FE9, + (q15_t)0x0324, (q15_t)0x7FF6, (q15_t)0x0192, (q15_t)0x7FFD, + (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0xFE6D, (q15_t)0x7FFD, + (q15_t)0xFCDB, (q15_t)0x7FF6, (q15_t)0xFB49, (q15_t)0x7FE9, + (q15_t)0xF9B8, (q15_t)0x7FD8, (q15_t)0xF826, (q15_t)0x7FC2, + (q15_t)0xF695, (q15_t)0x7FA7, (q15_t)0xF504, (q15_t)0x7F87, + (q15_t)0xF374, (q15_t)0x7F62, (q15_t)0xF1E4, (q15_t)0x7F38, + (q15_t)0xF054, (q15_t)0x7F09, (q15_t)0xEEC6, (q15_t)0x7ED5, + (q15_t)0xED37, (q15_t)0x7E9D, (q15_t)0xEBAA, (q15_t)0x7E5F, + (q15_t)0xEA1D, (q15_t)0x7E1D, (q15_t)0xE892, (q15_t)0x7DD6, + (q15_t)0xE707, (q15_t)0x7D8A, (q15_t)0xE57D, (q15_t)0x7D39, + (q15_t)0xE3F4, (q15_t)0x7CE3, (q15_t)0xE26C, (q15_t)0x7C89, + (q15_t)0xE0E6, (q15_t)0x7C29, (q15_t)0xDF60, (q15_t)0x7BC5, + (q15_t)0xDDDC, (q15_t)0x7B5D, (q15_t)0xDC59, (q15_t)0x7AEF, + (q15_t)0xDAD7, (q15_t)0x7A7D, (q15_t)0xD957, (q15_t)0x7A05, + (q15_t)0xD7D9, (q15_t)0x798A, (q15_t)0xD65C, (q15_t)0x7909, + (q15_t)0xD4E0, (q15_t)0x7884, (q15_t)0xD367, (q15_t)0x77FA, + (q15_t)0xD1EE, (q15_t)0x776C, (q15_t)0xD078, (q15_t)0x76D9, + (q15_t)0xCF04, (q15_t)0x7641, (q15_t)0xCD91, (q15_t)0x75A5, + (q15_t)0xCC21, (q15_t)0x7504, (q15_t)0xCAB2, (q15_t)0x745F, + (q15_t)0xC945, (q15_t)0x73B5, (q15_t)0xC7DB, (q15_t)0x7307, + (q15_t)0xC673, (q15_t)0x7255, (q15_t)0xC50D, (q15_t)0x719E, + (q15_t)0xC3A9, (q15_t)0x70E2, (q15_t)0xC247, (q15_t)0x7023, + (q15_t)0xC0E8, (q15_t)0x6F5F, (q15_t)0xBF8C, (q15_t)0x6E96, + (q15_t)0xBE31, (q15_t)0x6DCA, (q15_t)0xBCDA, (q15_t)0x6CF9, + (q15_t)0xBB85, (q15_t)0x6C24, (q15_t)0xBA32, (q15_t)0x6B4A, + (q15_t)0xB8E3, (q15_t)0x6A6D, (q15_t)0xB796, (q15_t)0x698C, + (q15_t)0xB64B, (q15_t)0x68A6, (q15_t)0xB504, (q15_t)0x67BD, + (q15_t)0xB3C0, (q15_t)0x66CF, (q15_t)0xB27E, (q15_t)0x65DD, + (q15_t)0xB140, (q15_t)0x64E8, (q15_t)0xB004, (q15_t)0x63EF, + (q15_t)0xAECC, (q15_t)0x62F2, (q15_t)0xAD96, (q15_t)0x61F1, + (q15_t)0xAC64, (q15_t)0x60EC, (q15_t)0xAB35, (q15_t)0x5FE3, + (q15_t)0xAA0A, (q15_t)0x5ED7, (q15_t)0xA8E2, (q15_t)0x5DC7, + (q15_t)0xA7BD, (q15_t)0x5CB4, (q15_t)0xA69B, (q15_t)0x5B9D, + (q15_t)0xA57D, (q15_t)0x5A82, (q15_t)0xA462, (q15_t)0x5964, + (q15_t)0xA34B, (q15_t)0x5842, (q15_t)0xA238, (q15_t)0x571D, + (q15_t)0xA128, (q15_t)0x55F5, (q15_t)0xA01C, (q15_t)0x54CA, + (q15_t)0x9F13, (q15_t)0x539B, (q15_t)0x9E0E, (q15_t)0x5269, + (q15_t)0x9D0D, (q15_t)0x5133, (q15_t)0x9C10, (q15_t)0x4FFB, + (q15_t)0x9B17, (q15_t)0x4EBF, (q15_t)0x9A22, (q15_t)0x4D81, + (q15_t)0x9930, (q15_t)0x4C3F, (q15_t)0x9842, (q15_t)0x4AFB, + (q15_t)0x9759, (q15_t)0x49B4, (q15_t)0x9673, (q15_t)0x4869, + (q15_t)0x9592, (q15_t)0x471C, (q15_t)0x94B5, (q15_t)0x45CD, + (q15_t)0x93DB, (q15_t)0x447A, (q15_t)0x9306, (q15_t)0x4325, + (q15_t)0x9235, (q15_t)0x41CE, (q15_t)0x9169, (q15_t)0x4073, + (q15_t)0x90A0, (q15_t)0x3F17, (q15_t)0x8FDC, (q15_t)0x3DB8, + (q15_t)0x8F1D, (q15_t)0x3C56, (q15_t)0x8E61, (q15_t)0x3AF2, + (q15_t)0x8DAA, (q15_t)0x398C, (q15_t)0x8CF8, (q15_t)0x3824, + (q15_t)0x8C4A, (q15_t)0x36BA, (q15_t)0x8BA0, (q15_t)0x354D, + (q15_t)0x8AFB, (q15_t)0x33DE, (q15_t)0x8A5A, (q15_t)0x326E, + (q15_t)0x89BE, (q15_t)0x30FB, (q15_t)0x8926, (q15_t)0x2F87, + (q15_t)0x8893, (q15_t)0x2E11, (q15_t)0x8805, (q15_t)0x2C98, + (q15_t)0x877B, (q15_t)0x2B1F, (q15_t)0x86F6, (q15_t)0x29A3, + (q15_t)0x8675, (q15_t)0x2826, (q15_t)0x85FA, (q15_t)0x26A8, + (q15_t)0x8582, (q15_t)0x2528, (q15_t)0x8510, (q15_t)0x23A6, + (q15_t)0x84A2, (q15_t)0x2223, (q15_t)0x843A, (q15_t)0x209F, + (q15_t)0x83D6, (q15_t)0x1F19, (q15_t)0x8376, (q15_t)0x1D93, + (q15_t)0x831C, (q15_t)0x1C0B, (q15_t)0x82C6, (q15_t)0x1A82, + (q15_t)0x8275, (q15_t)0x18F8, (q15_t)0x8229, (q15_t)0x176D, + (q15_t)0x81E2, (q15_t)0x15E2, (q15_t)0x81A0, (q15_t)0x1455, + (q15_t)0x8162, (q15_t)0x12C8, (q15_t)0x812A, (q15_t)0x1139, + (q15_t)0x80F6, (q15_t)0x0FAB, (q15_t)0x80C7, (q15_t)0x0E1B, + (q15_t)0x809D, (q15_t)0x0C8B, (q15_t)0x8078, (q15_t)0x0AFB, + (q15_t)0x8058, (q15_t)0x096A, (q15_t)0x803D, (q15_t)0x07D9, + (q15_t)0x8027, (q15_t)0x0647, (q15_t)0x8016, (q15_t)0x04B6, + (q15_t)0x8009, (q15_t)0x0324, (q15_t)0x8002, (q15_t)0x0192, + (q15_t)0x8000, (q15_t)0x0000, (q15_t)0x8002, (q15_t)0xFE6D, + (q15_t)0x8009, (q15_t)0xFCDB, (q15_t)0x8016, (q15_t)0xFB49, + (q15_t)0x8027, (q15_t)0xF9B8, (q15_t)0x803D, (q15_t)0xF826, + (q15_t)0x8058, (q15_t)0xF695, (q15_t)0x8078, (q15_t)0xF504, + (q15_t)0x809D, (q15_t)0xF374, (q15_t)0x80C7, (q15_t)0xF1E4, + (q15_t)0x80F6, (q15_t)0xF054, (q15_t)0x812A, (q15_t)0xEEC6, + (q15_t)0x8162, (q15_t)0xED37, (q15_t)0x81A0, (q15_t)0xEBAA, + (q15_t)0x81E2, (q15_t)0xEA1D, (q15_t)0x8229, (q15_t)0xE892, + (q15_t)0x8275, (q15_t)0xE707, (q15_t)0x82C6, (q15_t)0xE57D, + (q15_t)0x831C, (q15_t)0xE3F4, (q15_t)0x8376, (q15_t)0xE26C, + (q15_t)0x83D6, (q15_t)0xE0E6, (q15_t)0x843A, (q15_t)0xDF60, + (q15_t)0x84A2, (q15_t)0xDDDC, (q15_t)0x8510, (q15_t)0xDC59, + (q15_t)0x8582, (q15_t)0xDAD7, (q15_t)0x85FA, (q15_t)0xD957, + (q15_t)0x8675, (q15_t)0xD7D9, (q15_t)0x86F6, (q15_t)0xD65C, + (q15_t)0x877B, (q15_t)0xD4E0, (q15_t)0x8805, (q15_t)0xD367, + (q15_t)0x8893, (q15_t)0xD1EE, (q15_t)0x8926, (q15_t)0xD078, + (q15_t)0x89BE, (q15_t)0xCF04, (q15_t)0x8A5A, (q15_t)0xCD91, + (q15_t)0x8AFB, (q15_t)0xCC21, (q15_t)0x8BA0, (q15_t)0xCAB2, + (q15_t)0x8C4A, (q15_t)0xC945, (q15_t)0x8CF8, (q15_t)0xC7DB, + (q15_t)0x8DAA, (q15_t)0xC673, (q15_t)0x8E61, (q15_t)0xC50D, + (q15_t)0x8F1D, (q15_t)0xC3A9, (q15_t)0x8FDC, (q15_t)0xC247, + (q15_t)0x90A0, (q15_t)0xC0E8, (q15_t)0x9169, (q15_t)0xBF8C, + (q15_t)0x9235, (q15_t)0xBE31, (q15_t)0x9306, (q15_t)0xBCDA, + (q15_t)0x93DB, (q15_t)0xBB85, (q15_t)0x94B5, (q15_t)0xBA32, + (q15_t)0x9592, (q15_t)0xB8E3, (q15_t)0x9673, (q15_t)0xB796, + (q15_t)0x9759, (q15_t)0xB64B, (q15_t)0x9842, (q15_t)0xB504, + (q15_t)0x9930, (q15_t)0xB3C0, (q15_t)0x9A22, (q15_t)0xB27E, + (q15_t)0x9B17, (q15_t)0xB140, (q15_t)0x9C10, (q15_t)0xB004, + (q15_t)0x9D0D, (q15_t)0xAECC, (q15_t)0x9E0E, (q15_t)0xAD96, + (q15_t)0x9F13, (q15_t)0xAC64, (q15_t)0xA01C, (q15_t)0xAB35, + (q15_t)0xA128, (q15_t)0xAA0A, (q15_t)0xA238, (q15_t)0xA8E2, + (q15_t)0xA34B, (q15_t)0xA7BD, (q15_t)0xA462, (q15_t)0xA69B, + (q15_t)0xA57D, (q15_t)0xA57D, (q15_t)0xA69B, (q15_t)0xA462, + (q15_t)0xA7BD, (q15_t)0xA34B, (q15_t)0xA8E2, (q15_t)0xA238, + (q15_t)0xAA0A, (q15_t)0xA128, (q15_t)0xAB35, (q15_t)0xA01C, + (q15_t)0xAC64, (q15_t)0x9F13, (q15_t)0xAD96, (q15_t)0x9E0E, + (q15_t)0xAECC, (q15_t)0x9D0D, (q15_t)0xB004, (q15_t)0x9C10, + (q15_t)0xB140, (q15_t)0x9B17, (q15_t)0xB27E, (q15_t)0x9A22, + (q15_t)0xB3C0, (q15_t)0x9930, (q15_t)0xB504, (q15_t)0x9842, + (q15_t)0xB64B, (q15_t)0x9759, (q15_t)0xB796, (q15_t)0x9673, + (q15_t)0xB8E3, (q15_t)0x9592, (q15_t)0xBA32, (q15_t)0x94B5, + (q15_t)0xBB85, (q15_t)0x93DB, (q15_t)0xBCDA, (q15_t)0x9306, + (q15_t)0xBE31, (q15_t)0x9235, (q15_t)0xBF8C, (q15_t)0x9169, + (q15_t)0xC0E8, (q15_t)0x90A0, (q15_t)0xC247, (q15_t)0x8FDC, + (q15_t)0xC3A9, (q15_t)0x8F1D, (q15_t)0xC50D, (q15_t)0x8E61, + (q15_t)0xC673, (q15_t)0x8DAA, (q15_t)0xC7DB, (q15_t)0x8CF8, + (q15_t)0xC945, (q15_t)0x8C4A, (q15_t)0xCAB2, (q15_t)0x8BA0, + (q15_t)0xCC21, (q15_t)0x8AFB, (q15_t)0xCD91, (q15_t)0x8A5A, + (q15_t)0xCF04, (q15_t)0x89BE, (q15_t)0xD078, (q15_t)0x8926, + (q15_t)0xD1EE, (q15_t)0x8893, (q15_t)0xD367, (q15_t)0x8805, + (q15_t)0xD4E0, (q15_t)0x877B, (q15_t)0xD65C, (q15_t)0x86F6, + (q15_t)0xD7D9, (q15_t)0x8675, (q15_t)0xD957, (q15_t)0x85FA, + (q15_t)0xDAD7, (q15_t)0x8582, (q15_t)0xDC59, (q15_t)0x8510, + (q15_t)0xDDDC, (q15_t)0x84A2, (q15_t)0xDF60, (q15_t)0x843A, + (q15_t)0xE0E6, (q15_t)0x83D6, (q15_t)0xE26C, (q15_t)0x8376, + (q15_t)0xE3F4, (q15_t)0x831C, (q15_t)0xE57D, (q15_t)0x82C6, + (q15_t)0xE707, (q15_t)0x8275, (q15_t)0xE892, (q15_t)0x8229, + (q15_t)0xEA1D, (q15_t)0x81E2, (q15_t)0xEBAA, (q15_t)0x81A0, + (q15_t)0xED37, (q15_t)0x8162, (q15_t)0xEEC6, (q15_t)0x812A, + (q15_t)0xF054, (q15_t)0x80F6, (q15_t)0xF1E4, (q15_t)0x80C7, + (q15_t)0xF374, (q15_t)0x809D, (q15_t)0xF504, (q15_t)0x8078, + (q15_t)0xF695, (q15_t)0x8058, (q15_t)0xF826, (q15_t)0x803D, + (q15_t)0xF9B8, (q15_t)0x8027, (q15_t)0xFB49, (q15_t)0x8016, + (q15_t)0xFCDB, (q15_t)0x8009, (q15_t)0xFE6D, (q15_t)0x8002 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) +/** + @par + Example code for q15 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefq15[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefq15[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 1024, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to q15(Fixed point 1.15): + round(twiddleCoefq15(i) * pow(2, 15)) + + */ +const q15_t twiddleCoef_1024_q15[1536] = { + (q15_t)0x7FFF, (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0x00C9, + (q15_t)0x7FFD, (q15_t)0x0192, (q15_t)0x7FFA, (q15_t)0x025B, + (q15_t)0x7FF6, (q15_t)0x0324, (q15_t)0x7FF0, (q15_t)0x03ED, + (q15_t)0x7FE9, (q15_t)0x04B6, (q15_t)0x7FE1, (q15_t)0x057F, + (q15_t)0x7FD8, (q15_t)0x0647, (q15_t)0x7FCE, (q15_t)0x0710, + (q15_t)0x7FC2, (q15_t)0x07D9, (q15_t)0x7FB5, (q15_t)0x08A2, + (q15_t)0x7FA7, (q15_t)0x096A, (q15_t)0x7F97, (q15_t)0x0A33, + (q15_t)0x7F87, (q15_t)0x0AFB, (q15_t)0x7F75, (q15_t)0x0BC3, + (q15_t)0x7F62, (q15_t)0x0C8B, (q15_t)0x7F4D, (q15_t)0x0D53, + (q15_t)0x7F38, (q15_t)0x0E1B, (q15_t)0x7F21, (q15_t)0x0EE3, + (q15_t)0x7F09, (q15_t)0x0FAB, (q15_t)0x7EF0, (q15_t)0x1072, + (q15_t)0x7ED5, (q15_t)0x1139, (q15_t)0x7EBA, (q15_t)0x1201, + (q15_t)0x7E9D, (q15_t)0x12C8, (q15_t)0x7E7F, (q15_t)0x138E, + (q15_t)0x7E5F, (q15_t)0x1455, (q15_t)0x7E3F, (q15_t)0x151B, + (q15_t)0x7E1D, (q15_t)0x15E2, (q15_t)0x7DFA, (q15_t)0x16A8, + (q15_t)0x7DD6, (q15_t)0x176D, (q15_t)0x7DB0, (q15_t)0x1833, + (q15_t)0x7D8A, (q15_t)0x18F8, (q15_t)0x7D62, (q15_t)0x19BD, + (q15_t)0x7D39, (q15_t)0x1A82, (q15_t)0x7D0F, (q15_t)0x1B47, + (q15_t)0x7CE3, (q15_t)0x1C0B, (q15_t)0x7CB7, (q15_t)0x1CCF, + (q15_t)0x7C89, (q15_t)0x1D93, (q15_t)0x7C5A, (q15_t)0x1E56, + (q15_t)0x7C29, (q15_t)0x1F19, (q15_t)0x7BF8, (q15_t)0x1FDC, + (q15_t)0x7BC5, (q15_t)0x209F, (q15_t)0x7B92, (q15_t)0x2161, + (q15_t)0x7B5D, (q15_t)0x2223, (q15_t)0x7B26, (q15_t)0x22E5, + (q15_t)0x7AEF, (q15_t)0x23A6, (q15_t)0x7AB6, (q15_t)0x2467, + (q15_t)0x7A7D, (q15_t)0x2528, (q15_t)0x7A42, (q15_t)0x25E8, + (q15_t)0x7A05, (q15_t)0x26A8, (q15_t)0x79C8, (q15_t)0x2767, + (q15_t)0x798A, (q15_t)0x2826, (q15_t)0x794A, (q15_t)0x28E5, + (q15_t)0x7909, (q15_t)0x29A3, (q15_t)0x78C7, (q15_t)0x2A61, + (q15_t)0x7884, (q15_t)0x2B1F, (q15_t)0x7840, (q15_t)0x2BDC, + (q15_t)0x77FA, (q15_t)0x2C98, (q15_t)0x77B4, (q15_t)0x2D55, + (q15_t)0x776C, (q15_t)0x2E11, (q15_t)0x7723, (q15_t)0x2ECC, + (q15_t)0x76D9, (q15_t)0x2F87, (q15_t)0x768E, (q15_t)0x3041, + (q15_t)0x7641, (q15_t)0x30FB, (q15_t)0x75F4, (q15_t)0x31B5, + (q15_t)0x75A5, (q15_t)0x326E, (q15_t)0x7555, (q15_t)0x3326, + (q15_t)0x7504, (q15_t)0x33DE, (q15_t)0x74B2, (q15_t)0x3496, + (q15_t)0x745F, (q15_t)0x354D, (q15_t)0x740B, (q15_t)0x3604, + (q15_t)0x73B5, (q15_t)0x36BA, (q15_t)0x735F, (q15_t)0x376F, + (q15_t)0x7307, (q15_t)0x3824, (q15_t)0x72AF, (q15_t)0x38D8, + (q15_t)0x7255, (q15_t)0x398C, (q15_t)0x71FA, (q15_t)0x3A40, + (q15_t)0x719E, (q15_t)0x3AF2, (q15_t)0x7141, (q15_t)0x3BA5, + (q15_t)0x70E2, (q15_t)0x3C56, (q15_t)0x7083, (q15_t)0x3D07, + (q15_t)0x7023, (q15_t)0x3DB8, (q15_t)0x6FC1, (q15_t)0x3E68, + (q15_t)0x6F5F, (q15_t)0x3F17, (q15_t)0x6EFB, (q15_t)0x3FC5, + (q15_t)0x6E96, (q15_t)0x4073, (q15_t)0x6E30, (q15_t)0x4121, + (q15_t)0x6DCA, (q15_t)0x41CE, (q15_t)0x6D62, (q15_t)0x427A, + (q15_t)0x6CF9, (q15_t)0x4325, (q15_t)0x6C8F, (q15_t)0x43D0, + (q15_t)0x6C24, (q15_t)0x447A, (q15_t)0x6BB8, (q15_t)0x4524, + (q15_t)0x6B4A, (q15_t)0x45CD, (q15_t)0x6ADC, (q15_t)0x4675, + (q15_t)0x6A6D, (q15_t)0x471C, (q15_t)0x69FD, (q15_t)0x47C3, + (q15_t)0x698C, (q15_t)0x4869, (q15_t)0x6919, (q15_t)0x490F, + (q15_t)0x68A6, (q15_t)0x49B4, (q15_t)0x6832, (q15_t)0x4A58, + (q15_t)0x67BD, (q15_t)0x4AFB, (q15_t)0x6746, (q15_t)0x4B9E, + (q15_t)0x66CF, (q15_t)0x4C3F, (q15_t)0x6657, (q15_t)0x4CE1, + (q15_t)0x65DD, (q15_t)0x4D81, (q15_t)0x6563, (q15_t)0x4E21, + (q15_t)0x64E8, (q15_t)0x4EBF, (q15_t)0x646C, (q15_t)0x4F5E, + (q15_t)0x63EF, (q15_t)0x4FFB, (q15_t)0x6371, (q15_t)0x5097, + (q15_t)0x62F2, (q15_t)0x5133, (q15_t)0x6271, (q15_t)0x51CE, + (q15_t)0x61F1, (q15_t)0x5269, (q15_t)0x616F, (q15_t)0x5302, + (q15_t)0x60EC, (q15_t)0x539B, (q15_t)0x6068, (q15_t)0x5433, + (q15_t)0x5FE3, (q15_t)0x54CA, (q15_t)0x5F5E, (q15_t)0x5560, + (q15_t)0x5ED7, (q15_t)0x55F5, (q15_t)0x5E50, (q15_t)0x568A, + (q15_t)0x5DC7, (q15_t)0x571D, (q15_t)0x5D3E, (q15_t)0x57B0, + (q15_t)0x5CB4, (q15_t)0x5842, (q15_t)0x5C29, (q15_t)0x58D4, + (q15_t)0x5B9D, (q15_t)0x5964, (q15_t)0x5B10, (q15_t)0x59F3, + (q15_t)0x5A82, (q15_t)0x5A82, (q15_t)0x59F3, (q15_t)0x5B10, + (q15_t)0x5964, (q15_t)0x5B9D, (q15_t)0x58D4, (q15_t)0x5C29, + (q15_t)0x5842, (q15_t)0x5CB4, (q15_t)0x57B0, (q15_t)0x5D3E, + (q15_t)0x571D, (q15_t)0x5DC7, (q15_t)0x568A, (q15_t)0x5E50, + (q15_t)0x55F5, (q15_t)0x5ED7, (q15_t)0x5560, (q15_t)0x5F5E, + (q15_t)0x54CA, (q15_t)0x5FE3, (q15_t)0x5433, (q15_t)0x6068, + (q15_t)0x539B, (q15_t)0x60EC, (q15_t)0x5302, (q15_t)0x616F, + (q15_t)0x5269, (q15_t)0x61F1, (q15_t)0x51CE, (q15_t)0x6271, + (q15_t)0x5133, (q15_t)0x62F2, (q15_t)0x5097, (q15_t)0x6371, + (q15_t)0x4FFB, (q15_t)0x63EF, (q15_t)0x4F5E, (q15_t)0x646C, + (q15_t)0x4EBF, (q15_t)0x64E8, (q15_t)0x4E21, (q15_t)0x6563, + (q15_t)0x4D81, (q15_t)0x65DD, (q15_t)0x4CE1, (q15_t)0x6657, + (q15_t)0x4C3F, (q15_t)0x66CF, (q15_t)0x4B9E, (q15_t)0x6746, + (q15_t)0x4AFB, (q15_t)0x67BD, (q15_t)0x4A58, (q15_t)0x6832, + (q15_t)0x49B4, (q15_t)0x68A6, (q15_t)0x490F, (q15_t)0x6919, + (q15_t)0x4869, (q15_t)0x698C, (q15_t)0x47C3, (q15_t)0x69FD, + (q15_t)0x471C, (q15_t)0x6A6D, (q15_t)0x4675, (q15_t)0x6ADC, + (q15_t)0x45CD, (q15_t)0x6B4A, (q15_t)0x4524, (q15_t)0x6BB8, + (q15_t)0x447A, (q15_t)0x6C24, (q15_t)0x43D0, (q15_t)0x6C8F, + (q15_t)0x4325, (q15_t)0x6CF9, (q15_t)0x427A, (q15_t)0x6D62, + (q15_t)0x41CE, (q15_t)0x6DCA, (q15_t)0x4121, (q15_t)0x6E30, + (q15_t)0x4073, (q15_t)0x6E96, (q15_t)0x3FC5, (q15_t)0x6EFB, + (q15_t)0x3F17, (q15_t)0x6F5F, (q15_t)0x3E68, (q15_t)0x6FC1, + (q15_t)0x3DB8, (q15_t)0x7023, (q15_t)0x3D07, (q15_t)0x7083, + (q15_t)0x3C56, (q15_t)0x70E2, (q15_t)0x3BA5, (q15_t)0x7141, + (q15_t)0x3AF2, (q15_t)0x719E, (q15_t)0x3A40, (q15_t)0x71FA, + (q15_t)0x398C, (q15_t)0x7255, (q15_t)0x38D8, (q15_t)0x72AF, + (q15_t)0x3824, (q15_t)0x7307, (q15_t)0x376F, (q15_t)0x735F, + (q15_t)0x36BA, (q15_t)0x73B5, (q15_t)0x3604, (q15_t)0x740B, + (q15_t)0x354D, (q15_t)0x745F, (q15_t)0x3496, (q15_t)0x74B2, + (q15_t)0x33DE, (q15_t)0x7504, (q15_t)0x3326, (q15_t)0x7555, + (q15_t)0x326E, (q15_t)0x75A5, (q15_t)0x31B5, (q15_t)0x75F4, + (q15_t)0x30FB, (q15_t)0x7641, (q15_t)0x3041, (q15_t)0x768E, + (q15_t)0x2F87, (q15_t)0x76D9, (q15_t)0x2ECC, (q15_t)0x7723, + (q15_t)0x2E11, (q15_t)0x776C, (q15_t)0x2D55, (q15_t)0x77B4, + (q15_t)0x2C98, (q15_t)0x77FA, (q15_t)0x2BDC, (q15_t)0x7840, + (q15_t)0x2B1F, (q15_t)0x7884, (q15_t)0x2A61, (q15_t)0x78C7, + (q15_t)0x29A3, (q15_t)0x7909, (q15_t)0x28E5, (q15_t)0x794A, + (q15_t)0x2826, (q15_t)0x798A, (q15_t)0x2767, (q15_t)0x79C8, + (q15_t)0x26A8, (q15_t)0x7A05, (q15_t)0x25E8, (q15_t)0x7A42, + (q15_t)0x2528, (q15_t)0x7A7D, (q15_t)0x2467, (q15_t)0x7AB6, + (q15_t)0x23A6, (q15_t)0x7AEF, (q15_t)0x22E5, (q15_t)0x7B26, + (q15_t)0x2223, (q15_t)0x7B5D, (q15_t)0x2161, (q15_t)0x7B92, + (q15_t)0x209F, (q15_t)0x7BC5, (q15_t)0x1FDC, (q15_t)0x7BF8, + (q15_t)0x1F19, (q15_t)0x7C29, (q15_t)0x1E56, (q15_t)0x7C5A, + (q15_t)0x1D93, (q15_t)0x7C89, (q15_t)0x1CCF, (q15_t)0x7CB7, + (q15_t)0x1C0B, (q15_t)0x7CE3, (q15_t)0x1B47, (q15_t)0x7D0F, + (q15_t)0x1A82, (q15_t)0x7D39, (q15_t)0x19BD, (q15_t)0x7D62, + (q15_t)0x18F8, (q15_t)0x7D8A, (q15_t)0x1833, (q15_t)0x7DB0, + (q15_t)0x176D, (q15_t)0x7DD6, (q15_t)0x16A8, (q15_t)0x7DFA, + (q15_t)0x15E2, (q15_t)0x7E1D, (q15_t)0x151B, (q15_t)0x7E3F, + (q15_t)0x1455, (q15_t)0x7E5F, (q15_t)0x138E, (q15_t)0x7E7F, + (q15_t)0x12C8, (q15_t)0x7E9D, (q15_t)0x1201, (q15_t)0x7EBA, + (q15_t)0x1139, (q15_t)0x7ED5, (q15_t)0x1072, (q15_t)0x7EF0, + (q15_t)0x0FAB, (q15_t)0x7F09, (q15_t)0x0EE3, (q15_t)0x7F21, + (q15_t)0x0E1B, (q15_t)0x7F38, (q15_t)0x0D53, (q15_t)0x7F4D, + (q15_t)0x0C8B, (q15_t)0x7F62, (q15_t)0x0BC3, (q15_t)0x7F75, + (q15_t)0x0AFB, (q15_t)0x7F87, (q15_t)0x0A33, (q15_t)0x7F97, + (q15_t)0x096A, (q15_t)0x7FA7, (q15_t)0x08A2, (q15_t)0x7FB5, + (q15_t)0x07D9, (q15_t)0x7FC2, (q15_t)0x0710, (q15_t)0x7FCE, + (q15_t)0x0647, (q15_t)0x7FD8, (q15_t)0x057F, (q15_t)0x7FE1, + (q15_t)0x04B6, (q15_t)0x7FE9, (q15_t)0x03ED, (q15_t)0x7FF0, + (q15_t)0x0324, (q15_t)0x7FF6, (q15_t)0x025B, (q15_t)0x7FFA, + (q15_t)0x0192, (q15_t)0x7FFD, (q15_t)0x00C9, (q15_t)0x7FFF, + (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0xFF36, (q15_t)0x7FFF, + (q15_t)0xFE6D, (q15_t)0x7FFD, (q15_t)0xFDA4, (q15_t)0x7FFA, + (q15_t)0xFCDB, (q15_t)0x7FF6, (q15_t)0xFC12, (q15_t)0x7FF0, + (q15_t)0xFB49, (q15_t)0x7FE9, (q15_t)0xFA80, (q15_t)0x7FE1, + (q15_t)0xF9B8, (q15_t)0x7FD8, (q15_t)0xF8EF, (q15_t)0x7FCE, + (q15_t)0xF826, (q15_t)0x7FC2, (q15_t)0xF75D, (q15_t)0x7FB5, + (q15_t)0xF695, (q15_t)0x7FA7, (q15_t)0xF5CC, (q15_t)0x7F97, + (q15_t)0xF504, (q15_t)0x7F87, (q15_t)0xF43C, (q15_t)0x7F75, + (q15_t)0xF374, (q15_t)0x7F62, (q15_t)0xF2AC, (q15_t)0x7F4D, + (q15_t)0xF1E4, (q15_t)0x7F38, (q15_t)0xF11C, (q15_t)0x7F21, + (q15_t)0xF054, (q15_t)0x7F09, (q15_t)0xEF8D, (q15_t)0x7EF0, + (q15_t)0xEEC6, (q15_t)0x7ED5, (q15_t)0xEDFE, (q15_t)0x7EBA, + (q15_t)0xED37, (q15_t)0x7E9D, (q15_t)0xEC71, (q15_t)0x7E7F, + (q15_t)0xEBAA, (q15_t)0x7E5F, (q15_t)0xEAE4, (q15_t)0x7E3F, + (q15_t)0xEA1D, (q15_t)0x7E1D, (q15_t)0xE957, (q15_t)0x7DFA, + (q15_t)0xE892, (q15_t)0x7DD6, (q15_t)0xE7CC, (q15_t)0x7DB0, + (q15_t)0xE707, (q15_t)0x7D8A, (q15_t)0xE642, (q15_t)0x7D62, + (q15_t)0xE57D, (q15_t)0x7D39, (q15_t)0xE4B8, (q15_t)0x7D0F, + (q15_t)0xE3F4, (q15_t)0x7CE3, (q15_t)0xE330, (q15_t)0x7CB7, + (q15_t)0xE26C, (q15_t)0x7C89, (q15_t)0xE1A9, (q15_t)0x7C5A, + (q15_t)0xE0E6, (q15_t)0x7C29, (q15_t)0xE023, (q15_t)0x7BF8, + (q15_t)0xDF60, (q15_t)0x7BC5, (q15_t)0xDE9E, (q15_t)0x7B92, + (q15_t)0xDDDC, (q15_t)0x7B5D, (q15_t)0xDD1A, (q15_t)0x7B26, + (q15_t)0xDC59, (q15_t)0x7AEF, (q15_t)0xDB98, (q15_t)0x7AB6, + (q15_t)0xDAD7, (q15_t)0x7A7D, (q15_t)0xDA17, (q15_t)0x7A42, + (q15_t)0xD957, (q15_t)0x7A05, (q15_t)0xD898, (q15_t)0x79C8, + (q15_t)0xD7D9, (q15_t)0x798A, (q15_t)0xD71A, (q15_t)0x794A, + (q15_t)0xD65C, (q15_t)0x7909, (q15_t)0xD59E, (q15_t)0x78C7, + (q15_t)0xD4E0, (q15_t)0x7884, (q15_t)0xD423, (q15_t)0x7840, + (q15_t)0xD367, (q15_t)0x77FA, (q15_t)0xD2AA, (q15_t)0x77B4, + (q15_t)0xD1EE, (q15_t)0x776C, (q15_t)0xD133, (q15_t)0x7723, + (q15_t)0xD078, (q15_t)0x76D9, (q15_t)0xCFBE, (q15_t)0x768E, + (q15_t)0xCF04, (q15_t)0x7641, (q15_t)0xCE4A, (q15_t)0x75F4, + (q15_t)0xCD91, (q15_t)0x75A5, (q15_t)0xCCD9, (q15_t)0x7555, + (q15_t)0xCC21, (q15_t)0x7504, (q15_t)0xCB69, (q15_t)0x74B2, + (q15_t)0xCAB2, (q15_t)0x745F, (q15_t)0xC9FB, (q15_t)0x740B, + (q15_t)0xC945, (q15_t)0x73B5, (q15_t)0xC890, (q15_t)0x735F, + (q15_t)0xC7DB, (q15_t)0x7307, (q15_t)0xC727, (q15_t)0x72AF, + (q15_t)0xC673, (q15_t)0x7255, (q15_t)0xC5BF, (q15_t)0x71FA, + (q15_t)0xC50D, (q15_t)0x719E, (q15_t)0xC45A, (q15_t)0x7141, + (q15_t)0xC3A9, (q15_t)0x70E2, (q15_t)0xC2F8, (q15_t)0x7083, + (q15_t)0xC247, (q15_t)0x7023, (q15_t)0xC197, (q15_t)0x6FC1, + (q15_t)0xC0E8, (q15_t)0x6F5F, (q15_t)0xC03A, (q15_t)0x6EFB, + (q15_t)0xBF8C, (q15_t)0x6E96, (q15_t)0xBEDE, (q15_t)0x6E30, + (q15_t)0xBE31, (q15_t)0x6DCA, (q15_t)0xBD85, (q15_t)0x6D62, + (q15_t)0xBCDA, (q15_t)0x6CF9, (q15_t)0xBC2F, (q15_t)0x6C8F, + (q15_t)0xBB85, (q15_t)0x6C24, (q15_t)0xBADB, (q15_t)0x6BB8, + (q15_t)0xBA32, (q15_t)0x6B4A, (q15_t)0xB98A, (q15_t)0x6ADC, + (q15_t)0xB8E3, (q15_t)0x6A6D, (q15_t)0xB83C, (q15_t)0x69FD, + (q15_t)0xB796, (q15_t)0x698C, (q15_t)0xB6F0, (q15_t)0x6919, + (q15_t)0xB64B, (q15_t)0x68A6, (q15_t)0xB5A7, (q15_t)0x6832, + (q15_t)0xB504, (q15_t)0x67BD, (q15_t)0xB461, (q15_t)0x6746, + (q15_t)0xB3C0, (q15_t)0x66CF, (q15_t)0xB31E, (q15_t)0x6657, + (q15_t)0xB27E, (q15_t)0x65DD, (q15_t)0xB1DE, (q15_t)0x6563, + (q15_t)0xB140, (q15_t)0x64E8, (q15_t)0xB0A1, (q15_t)0x646C, + (q15_t)0xB004, (q15_t)0x63EF, (q15_t)0xAF68, (q15_t)0x6371, + (q15_t)0xAECC, (q15_t)0x62F2, (q15_t)0xAE31, (q15_t)0x6271, + (q15_t)0xAD96, (q15_t)0x61F1, (q15_t)0xACFD, (q15_t)0x616F, + (q15_t)0xAC64, (q15_t)0x60EC, (q15_t)0xABCC, (q15_t)0x6068, + (q15_t)0xAB35, (q15_t)0x5FE3, (q15_t)0xAA9F, (q15_t)0x5F5E, + (q15_t)0xAA0A, (q15_t)0x5ED7, (q15_t)0xA975, (q15_t)0x5E50, + (q15_t)0xA8E2, (q15_t)0x5DC7, (q15_t)0xA84F, (q15_t)0x5D3E, + (q15_t)0xA7BD, (q15_t)0x5CB4, (q15_t)0xA72B, (q15_t)0x5C29, + (q15_t)0xA69B, (q15_t)0x5B9D, (q15_t)0xA60C, (q15_t)0x5B10, + (q15_t)0xA57D, (q15_t)0x5A82, (q15_t)0xA4EF, (q15_t)0x59F3, + (q15_t)0xA462, (q15_t)0x5964, (q15_t)0xA3D6, (q15_t)0x58D4, + (q15_t)0xA34B, (q15_t)0x5842, (q15_t)0xA2C1, (q15_t)0x57B0, + (q15_t)0xA238, (q15_t)0x571D, (q15_t)0xA1AF, (q15_t)0x568A, + (q15_t)0xA128, (q15_t)0x55F5, (q15_t)0xA0A1, (q15_t)0x5560, + (q15_t)0xA01C, (q15_t)0x54CA, (q15_t)0x9F97, (q15_t)0x5433, + (q15_t)0x9F13, (q15_t)0x539B, (q15_t)0x9E90, (q15_t)0x5302, + (q15_t)0x9E0E, (q15_t)0x5269, (q15_t)0x9D8E, (q15_t)0x51CE, + (q15_t)0x9D0D, (q15_t)0x5133, (q15_t)0x9C8E, (q15_t)0x5097, + (q15_t)0x9C10, (q15_t)0x4FFB, (q15_t)0x9B93, (q15_t)0x4F5E, + (q15_t)0x9B17, (q15_t)0x4EBF, (q15_t)0x9A9C, (q15_t)0x4E21, + (q15_t)0x9A22, (q15_t)0x4D81, (q15_t)0x99A8, (q15_t)0x4CE1, + (q15_t)0x9930, (q15_t)0x4C3F, (q15_t)0x98B9, (q15_t)0x4B9E, + (q15_t)0x9842, (q15_t)0x4AFB, (q15_t)0x97CD, (q15_t)0x4A58, + (q15_t)0x9759, (q15_t)0x49B4, (q15_t)0x96E6, (q15_t)0x490F, + (q15_t)0x9673, (q15_t)0x4869, (q15_t)0x9602, (q15_t)0x47C3, + (q15_t)0x9592, (q15_t)0x471C, (q15_t)0x9523, (q15_t)0x4675, + (q15_t)0x94B5, (q15_t)0x45CD, (q15_t)0x9447, (q15_t)0x4524, + (q15_t)0x93DB, (q15_t)0x447A, (q15_t)0x9370, (q15_t)0x43D0, + (q15_t)0x9306, (q15_t)0x4325, (q15_t)0x929D, (q15_t)0x427A, + (q15_t)0x9235, (q15_t)0x41CE, (q15_t)0x91CF, (q15_t)0x4121, + (q15_t)0x9169, (q15_t)0x4073, (q15_t)0x9104, (q15_t)0x3FC5, + (q15_t)0x90A0, (q15_t)0x3F17, (q15_t)0x903E, (q15_t)0x3E68, + (q15_t)0x8FDC, (q15_t)0x3DB8, (q15_t)0x8F7C, (q15_t)0x3D07, + (q15_t)0x8F1D, (q15_t)0x3C56, (q15_t)0x8EBE, (q15_t)0x3BA5, + (q15_t)0x8E61, (q15_t)0x3AF2, (q15_t)0x8E05, (q15_t)0x3A40, + (q15_t)0x8DAA, (q15_t)0x398C, (q15_t)0x8D50, (q15_t)0x38D8, + (q15_t)0x8CF8, (q15_t)0x3824, (q15_t)0x8CA0, (q15_t)0x376F, + (q15_t)0x8C4A, (q15_t)0x36BA, (q15_t)0x8BF4, (q15_t)0x3604, + (q15_t)0x8BA0, (q15_t)0x354D, (q15_t)0x8B4D, (q15_t)0x3496, + (q15_t)0x8AFB, (q15_t)0x33DE, (q15_t)0x8AAA, (q15_t)0x3326, + (q15_t)0x8A5A, (q15_t)0x326E, (q15_t)0x8A0B, (q15_t)0x31B5, + (q15_t)0x89BE, (q15_t)0x30FB, (q15_t)0x8971, (q15_t)0x3041, + (q15_t)0x8926, (q15_t)0x2F87, (q15_t)0x88DC, (q15_t)0x2ECC, + (q15_t)0x8893, (q15_t)0x2E11, (q15_t)0x884B, (q15_t)0x2D55, + (q15_t)0x8805, (q15_t)0x2C98, (q15_t)0x87BF, (q15_t)0x2BDC, + (q15_t)0x877B, (q15_t)0x2B1F, (q15_t)0x8738, (q15_t)0x2A61, + (q15_t)0x86F6, (q15_t)0x29A3, (q15_t)0x86B5, (q15_t)0x28E5, + (q15_t)0x8675, (q15_t)0x2826, (q15_t)0x8637, (q15_t)0x2767, + (q15_t)0x85FA, (q15_t)0x26A8, (q15_t)0x85BD, (q15_t)0x25E8, + (q15_t)0x8582, (q15_t)0x2528, (q15_t)0x8549, (q15_t)0x2467, + (q15_t)0x8510, (q15_t)0x23A6, (q15_t)0x84D9, (q15_t)0x22E5, + (q15_t)0x84A2, (q15_t)0x2223, (q15_t)0x846D, (q15_t)0x2161, + (q15_t)0x843A, (q15_t)0x209F, (q15_t)0x8407, (q15_t)0x1FDC, + (q15_t)0x83D6, (q15_t)0x1F19, (q15_t)0x83A5, (q15_t)0x1E56, + (q15_t)0x8376, (q15_t)0x1D93, (q15_t)0x8348, (q15_t)0x1CCF, + (q15_t)0x831C, (q15_t)0x1C0B, (q15_t)0x82F0, (q15_t)0x1B47, + (q15_t)0x82C6, (q15_t)0x1A82, (q15_t)0x829D, (q15_t)0x19BD, + (q15_t)0x8275, (q15_t)0x18F8, (q15_t)0x824F, (q15_t)0x1833, + (q15_t)0x8229, (q15_t)0x176D, (q15_t)0x8205, (q15_t)0x16A8, + (q15_t)0x81E2, (q15_t)0x15E2, (q15_t)0x81C0, (q15_t)0x151B, + (q15_t)0x81A0, (q15_t)0x1455, (q15_t)0x8180, (q15_t)0x138E, + (q15_t)0x8162, (q15_t)0x12C8, (q15_t)0x8145, (q15_t)0x1201, + (q15_t)0x812A, (q15_t)0x1139, (q15_t)0x810F, (q15_t)0x1072, + (q15_t)0x80F6, (q15_t)0x0FAB, (q15_t)0x80DE, (q15_t)0x0EE3, + (q15_t)0x80C7, (q15_t)0x0E1B, (q15_t)0x80B2, (q15_t)0x0D53, + (q15_t)0x809D, (q15_t)0x0C8B, (q15_t)0x808A, (q15_t)0x0BC3, + (q15_t)0x8078, (q15_t)0x0AFB, (q15_t)0x8068, (q15_t)0x0A33, + (q15_t)0x8058, (q15_t)0x096A, (q15_t)0x804A, (q15_t)0x08A2, + (q15_t)0x803D, (q15_t)0x07D9, (q15_t)0x8031, (q15_t)0x0710, + (q15_t)0x8027, (q15_t)0x0647, (q15_t)0x801E, (q15_t)0x057F, + (q15_t)0x8016, (q15_t)0x04B6, (q15_t)0x800F, (q15_t)0x03ED, + (q15_t)0x8009, (q15_t)0x0324, (q15_t)0x8005, (q15_t)0x025B, + (q15_t)0x8002, (q15_t)0x0192, (q15_t)0x8000, (q15_t)0x00C9, + (q15_t)0x8000, (q15_t)0x0000, (q15_t)0x8000, (q15_t)0xFF36, + (q15_t)0x8002, (q15_t)0xFE6D, (q15_t)0x8005, (q15_t)0xFDA4, + (q15_t)0x8009, (q15_t)0xFCDB, (q15_t)0x800F, (q15_t)0xFC12, + (q15_t)0x8016, (q15_t)0xFB49, (q15_t)0x801E, (q15_t)0xFA80, + (q15_t)0x8027, (q15_t)0xF9B8, (q15_t)0x8031, (q15_t)0xF8EF, + (q15_t)0x803D, (q15_t)0xF826, (q15_t)0x804A, (q15_t)0xF75D, + (q15_t)0x8058, (q15_t)0xF695, (q15_t)0x8068, (q15_t)0xF5CC, + (q15_t)0x8078, (q15_t)0xF504, (q15_t)0x808A, (q15_t)0xF43C, + (q15_t)0x809D, (q15_t)0xF374, (q15_t)0x80B2, (q15_t)0xF2AC, + (q15_t)0x80C7, (q15_t)0xF1E4, (q15_t)0x80DE, (q15_t)0xF11C, + (q15_t)0x80F6, (q15_t)0xF054, (q15_t)0x810F, (q15_t)0xEF8D, + (q15_t)0x812A, (q15_t)0xEEC6, (q15_t)0x8145, (q15_t)0xEDFE, + (q15_t)0x8162, (q15_t)0xED37, (q15_t)0x8180, (q15_t)0xEC71, + (q15_t)0x81A0, (q15_t)0xEBAA, (q15_t)0x81C0, (q15_t)0xEAE4, + (q15_t)0x81E2, (q15_t)0xEA1D, (q15_t)0x8205, (q15_t)0xE957, + (q15_t)0x8229, (q15_t)0xE892, (q15_t)0x824F, (q15_t)0xE7CC, + (q15_t)0x8275, (q15_t)0xE707, (q15_t)0x829D, (q15_t)0xE642, + (q15_t)0x82C6, (q15_t)0xE57D, (q15_t)0x82F0, (q15_t)0xE4B8, + (q15_t)0x831C, (q15_t)0xE3F4, (q15_t)0x8348, (q15_t)0xE330, + (q15_t)0x8376, (q15_t)0xE26C, (q15_t)0x83A5, (q15_t)0xE1A9, + (q15_t)0x83D6, (q15_t)0xE0E6, (q15_t)0x8407, (q15_t)0xE023, + (q15_t)0x843A, (q15_t)0xDF60, (q15_t)0x846D, (q15_t)0xDE9E, + (q15_t)0x84A2, (q15_t)0xDDDC, (q15_t)0x84D9, (q15_t)0xDD1A, + (q15_t)0x8510, (q15_t)0xDC59, (q15_t)0x8549, (q15_t)0xDB98, + (q15_t)0x8582, (q15_t)0xDAD7, (q15_t)0x85BD, (q15_t)0xDA17, + (q15_t)0x85FA, (q15_t)0xD957, (q15_t)0x8637, (q15_t)0xD898, + (q15_t)0x8675, (q15_t)0xD7D9, (q15_t)0x86B5, (q15_t)0xD71A, + (q15_t)0x86F6, (q15_t)0xD65C, (q15_t)0x8738, (q15_t)0xD59E, + (q15_t)0x877B, (q15_t)0xD4E0, (q15_t)0x87BF, (q15_t)0xD423, + (q15_t)0x8805, (q15_t)0xD367, (q15_t)0x884B, (q15_t)0xD2AA, + (q15_t)0x8893, (q15_t)0xD1EE, (q15_t)0x88DC, (q15_t)0xD133, + (q15_t)0x8926, (q15_t)0xD078, (q15_t)0x8971, (q15_t)0xCFBE, + (q15_t)0x89BE, (q15_t)0xCF04, (q15_t)0x8A0B, (q15_t)0xCE4A, + (q15_t)0x8A5A, (q15_t)0xCD91, (q15_t)0x8AAA, (q15_t)0xCCD9, + (q15_t)0x8AFB, (q15_t)0xCC21, (q15_t)0x8B4D, (q15_t)0xCB69, + (q15_t)0x8BA0, (q15_t)0xCAB2, (q15_t)0x8BF4, (q15_t)0xC9FB, + (q15_t)0x8C4A, (q15_t)0xC945, (q15_t)0x8CA0, (q15_t)0xC890, + (q15_t)0x8CF8, (q15_t)0xC7DB, (q15_t)0x8D50, (q15_t)0xC727, + (q15_t)0x8DAA, (q15_t)0xC673, (q15_t)0x8E05, (q15_t)0xC5BF, + (q15_t)0x8E61, (q15_t)0xC50D, (q15_t)0x8EBE, (q15_t)0xC45A, + (q15_t)0x8F1D, (q15_t)0xC3A9, (q15_t)0x8F7C, (q15_t)0xC2F8, + (q15_t)0x8FDC, (q15_t)0xC247, (q15_t)0x903E, (q15_t)0xC197, + (q15_t)0x90A0, (q15_t)0xC0E8, (q15_t)0x9104, (q15_t)0xC03A, + (q15_t)0x9169, (q15_t)0xBF8C, (q15_t)0x91CF, (q15_t)0xBEDE, + (q15_t)0x9235, (q15_t)0xBE31, (q15_t)0x929D, (q15_t)0xBD85, + (q15_t)0x9306, (q15_t)0xBCDA, (q15_t)0x9370, (q15_t)0xBC2F, + (q15_t)0x93DB, (q15_t)0xBB85, (q15_t)0x9447, (q15_t)0xBADB, + (q15_t)0x94B5, (q15_t)0xBA32, (q15_t)0x9523, (q15_t)0xB98A, + (q15_t)0x9592, (q15_t)0xB8E3, (q15_t)0x9602, (q15_t)0xB83C, + (q15_t)0x9673, (q15_t)0xB796, (q15_t)0x96E6, (q15_t)0xB6F0, + (q15_t)0x9759, (q15_t)0xB64B, (q15_t)0x97CD, (q15_t)0xB5A7, + (q15_t)0x9842, (q15_t)0xB504, (q15_t)0x98B9, (q15_t)0xB461, + (q15_t)0x9930, (q15_t)0xB3C0, (q15_t)0x99A8, (q15_t)0xB31E, + (q15_t)0x9A22, (q15_t)0xB27E, (q15_t)0x9A9C, (q15_t)0xB1DE, + (q15_t)0x9B17, (q15_t)0xB140, (q15_t)0x9B93, (q15_t)0xB0A1, + (q15_t)0x9C10, (q15_t)0xB004, (q15_t)0x9C8E, (q15_t)0xAF68, + (q15_t)0x9D0D, (q15_t)0xAECC, (q15_t)0x9D8E, (q15_t)0xAE31, + (q15_t)0x9E0E, (q15_t)0xAD96, (q15_t)0x9E90, (q15_t)0xACFD, + (q15_t)0x9F13, (q15_t)0xAC64, (q15_t)0x9F97, (q15_t)0xABCC, + (q15_t)0xA01C, (q15_t)0xAB35, (q15_t)0xA0A1, (q15_t)0xAA9F, + (q15_t)0xA128, (q15_t)0xAA0A, (q15_t)0xA1AF, (q15_t)0xA975, + (q15_t)0xA238, (q15_t)0xA8E2, (q15_t)0xA2C1, (q15_t)0xA84F, + (q15_t)0xA34B, (q15_t)0xA7BD, (q15_t)0xA3D6, (q15_t)0xA72B, + (q15_t)0xA462, (q15_t)0xA69B, (q15_t)0xA4EF, (q15_t)0xA60C, + (q15_t)0xA57D, (q15_t)0xA57D, (q15_t)0xA60C, (q15_t)0xA4EF, + (q15_t)0xA69B, (q15_t)0xA462, (q15_t)0xA72B, (q15_t)0xA3D6, + (q15_t)0xA7BD, (q15_t)0xA34B, (q15_t)0xA84F, (q15_t)0xA2C1, + (q15_t)0xA8E2, (q15_t)0xA238, (q15_t)0xA975, (q15_t)0xA1AF, + (q15_t)0xAA0A, (q15_t)0xA128, (q15_t)0xAA9F, (q15_t)0xA0A1, + (q15_t)0xAB35, (q15_t)0xA01C, (q15_t)0xABCC, (q15_t)0x9F97, + (q15_t)0xAC64, (q15_t)0x9F13, (q15_t)0xACFD, (q15_t)0x9E90, + (q15_t)0xAD96, (q15_t)0x9E0E, (q15_t)0xAE31, (q15_t)0x9D8E, + (q15_t)0xAECC, (q15_t)0x9D0D, (q15_t)0xAF68, (q15_t)0x9C8E, + (q15_t)0xB004, (q15_t)0x9C10, (q15_t)0xB0A1, (q15_t)0x9B93, + (q15_t)0xB140, (q15_t)0x9B17, (q15_t)0xB1DE, (q15_t)0x9A9C, + (q15_t)0xB27E, (q15_t)0x9A22, (q15_t)0xB31E, (q15_t)0x99A8, + (q15_t)0xB3C0, (q15_t)0x9930, (q15_t)0xB461, (q15_t)0x98B9, + (q15_t)0xB504, (q15_t)0x9842, (q15_t)0xB5A7, (q15_t)0x97CD, + (q15_t)0xB64B, (q15_t)0x9759, (q15_t)0xB6F0, (q15_t)0x96E6, + (q15_t)0xB796, (q15_t)0x9673, (q15_t)0xB83C, (q15_t)0x9602, + (q15_t)0xB8E3, (q15_t)0x9592, (q15_t)0xB98A, (q15_t)0x9523, + (q15_t)0xBA32, (q15_t)0x94B5, (q15_t)0xBADB, (q15_t)0x9447, + (q15_t)0xBB85, (q15_t)0x93DB, (q15_t)0xBC2F, (q15_t)0x9370, + (q15_t)0xBCDA, (q15_t)0x9306, (q15_t)0xBD85, (q15_t)0x929D, + (q15_t)0xBE31, (q15_t)0x9235, (q15_t)0xBEDE, (q15_t)0x91CF, + (q15_t)0xBF8C, (q15_t)0x9169, (q15_t)0xC03A, (q15_t)0x9104, + (q15_t)0xC0E8, (q15_t)0x90A0, (q15_t)0xC197, (q15_t)0x903E, + (q15_t)0xC247, (q15_t)0x8FDC, (q15_t)0xC2F8, (q15_t)0x8F7C, + (q15_t)0xC3A9, (q15_t)0x8F1D, (q15_t)0xC45A, (q15_t)0x8EBE, + (q15_t)0xC50D, (q15_t)0x8E61, (q15_t)0xC5BF, (q15_t)0x8E05, + (q15_t)0xC673, (q15_t)0x8DAA, (q15_t)0xC727, (q15_t)0x8D50, + (q15_t)0xC7DB, (q15_t)0x8CF8, (q15_t)0xC890, (q15_t)0x8CA0, + (q15_t)0xC945, (q15_t)0x8C4A, (q15_t)0xC9FB, (q15_t)0x8BF4, + (q15_t)0xCAB2, (q15_t)0x8BA0, (q15_t)0xCB69, (q15_t)0x8B4D, + (q15_t)0xCC21, (q15_t)0x8AFB, (q15_t)0xCCD9, (q15_t)0x8AAA, + (q15_t)0xCD91, (q15_t)0x8A5A, (q15_t)0xCE4A, (q15_t)0x8A0B, + (q15_t)0xCF04, (q15_t)0x89BE, (q15_t)0xCFBE, (q15_t)0x8971, + (q15_t)0xD078, (q15_t)0x8926, (q15_t)0xD133, (q15_t)0x88DC, + (q15_t)0xD1EE, (q15_t)0x8893, (q15_t)0xD2AA, (q15_t)0x884B, + (q15_t)0xD367, (q15_t)0x8805, (q15_t)0xD423, (q15_t)0x87BF, + (q15_t)0xD4E0, (q15_t)0x877B, (q15_t)0xD59E, (q15_t)0x8738, + (q15_t)0xD65C, (q15_t)0x86F6, (q15_t)0xD71A, (q15_t)0x86B5, + (q15_t)0xD7D9, (q15_t)0x8675, (q15_t)0xD898, (q15_t)0x8637, + (q15_t)0xD957, (q15_t)0x85FA, (q15_t)0xDA17, (q15_t)0x85BD, + (q15_t)0xDAD7, (q15_t)0x8582, (q15_t)0xDB98, (q15_t)0x8549, + (q15_t)0xDC59, (q15_t)0x8510, (q15_t)0xDD1A, (q15_t)0x84D9, + (q15_t)0xDDDC, (q15_t)0x84A2, (q15_t)0xDE9E, (q15_t)0x846D, + (q15_t)0xDF60, (q15_t)0x843A, (q15_t)0xE023, (q15_t)0x8407, + (q15_t)0xE0E6, (q15_t)0x83D6, (q15_t)0xE1A9, (q15_t)0x83A5, + (q15_t)0xE26C, (q15_t)0x8376, (q15_t)0xE330, (q15_t)0x8348, + (q15_t)0xE3F4, (q15_t)0x831C, (q15_t)0xE4B8, (q15_t)0x82F0, + (q15_t)0xE57D, (q15_t)0x82C6, (q15_t)0xE642, (q15_t)0x829D, + (q15_t)0xE707, (q15_t)0x8275, (q15_t)0xE7CC, (q15_t)0x824F, + (q15_t)0xE892, (q15_t)0x8229, (q15_t)0xE957, (q15_t)0x8205, + (q15_t)0xEA1D, (q15_t)0x81E2, (q15_t)0xEAE4, (q15_t)0x81C0, + (q15_t)0xEBAA, (q15_t)0x81A0, (q15_t)0xEC71, (q15_t)0x8180, + (q15_t)0xED37, (q15_t)0x8162, (q15_t)0xEDFE, (q15_t)0x8145, + (q15_t)0xEEC6, (q15_t)0x812A, (q15_t)0xEF8D, (q15_t)0x810F, + (q15_t)0xF054, (q15_t)0x80F6, (q15_t)0xF11C, (q15_t)0x80DE, + (q15_t)0xF1E4, (q15_t)0x80C7, (q15_t)0xF2AC, (q15_t)0x80B2, + (q15_t)0xF374, (q15_t)0x809D, (q15_t)0xF43C, (q15_t)0x808A, + (q15_t)0xF504, (q15_t)0x8078, (q15_t)0xF5CC, (q15_t)0x8068, + (q15_t)0xF695, (q15_t)0x8058, (q15_t)0xF75D, (q15_t)0x804A, + (q15_t)0xF826, (q15_t)0x803D, (q15_t)0xF8EF, (q15_t)0x8031, + (q15_t)0xF9B8, (q15_t)0x8027, (q15_t)0xFA80, (q15_t)0x801E, + (q15_t)0xFB49, (q15_t)0x8016, (q15_t)0xFC12, (q15_t)0x800F, + (q15_t)0xFCDB, (q15_t)0x8009, (q15_t)0xFDA4, (q15_t)0x8005, + (q15_t)0xFE6D, (q15_t)0x8002, (q15_t)0xFF36, (q15_t)0x8000 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) +/** + @par + Example code for q15 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefq15[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefq15[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 2048, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to q15(Fixed point 1.15): + round(twiddleCoefq15(i) * pow(2, 15)) + */ +const q15_t twiddleCoef_2048_q15[3072] = { + (q15_t)0x7FFF, (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0x0064, + (q15_t)0x7FFF, (q15_t)0x00C9, (q15_t)0x7FFE, (q15_t)0x012D, + (q15_t)0x7FFD, (q15_t)0x0192, (q15_t)0x7FFC, (q15_t)0x01F6, + (q15_t)0x7FFA, (q15_t)0x025B, (q15_t)0x7FF8, (q15_t)0x02BF, + (q15_t)0x7FF6, (q15_t)0x0324, (q15_t)0x7FF3, (q15_t)0x0388, + (q15_t)0x7FF0, (q15_t)0x03ED, (q15_t)0x7FED, (q15_t)0x0451, + (q15_t)0x7FE9, (q15_t)0x04B6, (q15_t)0x7FE5, (q15_t)0x051A, + (q15_t)0x7FE1, (q15_t)0x057F, (q15_t)0x7FDD, (q15_t)0x05E3, + (q15_t)0x7FD8, (q15_t)0x0647, (q15_t)0x7FD3, (q15_t)0x06AC, + (q15_t)0x7FCE, (q15_t)0x0710, (q15_t)0x7FC8, (q15_t)0x0775, + (q15_t)0x7FC2, (q15_t)0x07D9, (q15_t)0x7FBC, (q15_t)0x083D, + (q15_t)0x7FB5, (q15_t)0x08A2, (q15_t)0x7FAE, (q15_t)0x0906, + (q15_t)0x7FA7, (q15_t)0x096A, (q15_t)0x7F9F, (q15_t)0x09CE, + (q15_t)0x7F97, (q15_t)0x0A33, (q15_t)0x7F8F, (q15_t)0x0A97, + (q15_t)0x7F87, (q15_t)0x0AFB, (q15_t)0x7F7E, (q15_t)0x0B5F, + (q15_t)0x7F75, (q15_t)0x0BC3, (q15_t)0x7F6B, (q15_t)0x0C27, + (q15_t)0x7F62, (q15_t)0x0C8B, (q15_t)0x7F58, (q15_t)0x0CEF, + (q15_t)0x7F4D, (q15_t)0x0D53, (q15_t)0x7F43, (q15_t)0x0DB7, + (q15_t)0x7F38, (q15_t)0x0E1B, (q15_t)0x7F2D, (q15_t)0x0E7F, + (q15_t)0x7F21, (q15_t)0x0EE3, (q15_t)0x7F15, (q15_t)0x0F47, + (q15_t)0x7F09, (q15_t)0x0FAB, (q15_t)0x7EFD, (q15_t)0x100E, + (q15_t)0x7EF0, (q15_t)0x1072, (q15_t)0x7EE3, (q15_t)0x10D6, + (q15_t)0x7ED5, (q15_t)0x1139, (q15_t)0x7EC8, (q15_t)0x119D, + (q15_t)0x7EBA, (q15_t)0x1201, (q15_t)0x7EAB, (q15_t)0x1264, + (q15_t)0x7E9D, (q15_t)0x12C8, (q15_t)0x7E8E, (q15_t)0x132B, + (q15_t)0x7E7F, (q15_t)0x138E, (q15_t)0x7E6F, (q15_t)0x13F2, + (q15_t)0x7E5F, (q15_t)0x1455, (q15_t)0x7E4F, (q15_t)0x14B8, + (q15_t)0x7E3F, (q15_t)0x151B, (q15_t)0x7E2E, (q15_t)0x157F, + (q15_t)0x7E1D, (q15_t)0x15E2, (q15_t)0x7E0C, (q15_t)0x1645, + (q15_t)0x7DFA, (q15_t)0x16A8, (q15_t)0x7DE8, (q15_t)0x170A, + (q15_t)0x7DD6, (q15_t)0x176D, (q15_t)0x7DC3, (q15_t)0x17D0, + (q15_t)0x7DB0, (q15_t)0x1833, (q15_t)0x7D9D, (q15_t)0x1896, + (q15_t)0x7D8A, (q15_t)0x18F8, (q15_t)0x7D76, (q15_t)0x195B, + (q15_t)0x7D62, (q15_t)0x19BD, (q15_t)0x7D4E, (q15_t)0x1A20, + (q15_t)0x7D39, (q15_t)0x1A82, (q15_t)0x7D24, (q15_t)0x1AE4, + (q15_t)0x7D0F, (q15_t)0x1B47, (q15_t)0x7CF9, (q15_t)0x1BA9, + (q15_t)0x7CE3, (q15_t)0x1C0B, (q15_t)0x7CCD, (q15_t)0x1C6D, + (q15_t)0x7CB7, (q15_t)0x1CCF, (q15_t)0x7CA0, (q15_t)0x1D31, + (q15_t)0x7C89, (q15_t)0x1D93, (q15_t)0x7C71, (q15_t)0x1DF5, + (q15_t)0x7C5A, (q15_t)0x1E56, (q15_t)0x7C42, (q15_t)0x1EB8, + (q15_t)0x7C29, (q15_t)0x1F19, (q15_t)0x7C11, (q15_t)0x1F7B, + (q15_t)0x7BF8, (q15_t)0x1FDC, (q15_t)0x7BDF, (q15_t)0x203E, + (q15_t)0x7BC5, (q15_t)0x209F, (q15_t)0x7BAC, (q15_t)0x2100, + (q15_t)0x7B92, (q15_t)0x2161, (q15_t)0x7B77, (q15_t)0x21C2, + (q15_t)0x7B5D, (q15_t)0x2223, (q15_t)0x7B42, (q15_t)0x2284, + (q15_t)0x7B26, (q15_t)0x22E5, (q15_t)0x7B0B, (q15_t)0x2345, + (q15_t)0x7AEF, (q15_t)0x23A6, (q15_t)0x7AD3, (q15_t)0x2407, + (q15_t)0x7AB6, (q15_t)0x2467, (q15_t)0x7A9A, (q15_t)0x24C7, + (q15_t)0x7A7D, (q15_t)0x2528, (q15_t)0x7A5F, (q15_t)0x2588, + (q15_t)0x7A42, (q15_t)0x25E8, (q15_t)0x7A24, (q15_t)0x2648, + (q15_t)0x7A05, (q15_t)0x26A8, (q15_t)0x79E7, (q15_t)0x2707, + (q15_t)0x79C8, (q15_t)0x2767, (q15_t)0x79A9, (q15_t)0x27C7, + (q15_t)0x798A, (q15_t)0x2826, (q15_t)0x796A, (q15_t)0x2886, + (q15_t)0x794A, (q15_t)0x28E5, (q15_t)0x792A, (q15_t)0x2944, + (q15_t)0x7909, (q15_t)0x29A3, (q15_t)0x78E8, (q15_t)0x2A02, + (q15_t)0x78C7, (q15_t)0x2A61, (q15_t)0x78A6, (q15_t)0x2AC0, + (q15_t)0x7884, (q15_t)0x2B1F, (q15_t)0x7862, (q15_t)0x2B7D, + (q15_t)0x7840, (q15_t)0x2BDC, (q15_t)0x781D, (q15_t)0x2C3A, + (q15_t)0x77FA, (q15_t)0x2C98, (q15_t)0x77D7, (q15_t)0x2CF7, + (q15_t)0x77B4, (q15_t)0x2D55, (q15_t)0x7790, (q15_t)0x2DB3, + (q15_t)0x776C, (q15_t)0x2E11, (q15_t)0x7747, (q15_t)0x2E6E, + (q15_t)0x7723, (q15_t)0x2ECC, (q15_t)0x76FE, (q15_t)0x2F29, + (q15_t)0x76D9, (q15_t)0x2F87, (q15_t)0x76B3, (q15_t)0x2FE4, + (q15_t)0x768E, (q15_t)0x3041, (q15_t)0x7668, (q15_t)0x309E, + (q15_t)0x7641, (q15_t)0x30FB, (q15_t)0x761B, (q15_t)0x3158, + (q15_t)0x75F4, (q15_t)0x31B5, (q15_t)0x75CC, (q15_t)0x3211, + (q15_t)0x75A5, (q15_t)0x326E, (q15_t)0x757D, (q15_t)0x32CA, + (q15_t)0x7555, (q15_t)0x3326, (q15_t)0x752D, (q15_t)0x3382, + (q15_t)0x7504, (q15_t)0x33DE, (q15_t)0x74DB, (q15_t)0x343A, + (q15_t)0x74B2, (q15_t)0x3496, (q15_t)0x7489, (q15_t)0x34F2, + (q15_t)0x745F, (q15_t)0x354D, (q15_t)0x7435, (q15_t)0x35A8, + (q15_t)0x740B, (q15_t)0x3604, (q15_t)0x73E0, (q15_t)0x365F, + (q15_t)0x73B5, (q15_t)0x36BA, (q15_t)0x738A, (q15_t)0x3714, + (q15_t)0x735F, (q15_t)0x376F, (q15_t)0x7333, (q15_t)0x37CA, + (q15_t)0x7307, (q15_t)0x3824, (q15_t)0x72DB, (q15_t)0x387E, + (q15_t)0x72AF, (q15_t)0x38D8, (q15_t)0x7282, (q15_t)0x3932, + (q15_t)0x7255, (q15_t)0x398C, (q15_t)0x7227, (q15_t)0x39E6, + (q15_t)0x71FA, (q15_t)0x3A40, (q15_t)0x71CC, (q15_t)0x3A99, + (q15_t)0x719E, (q15_t)0x3AF2, (q15_t)0x716F, (q15_t)0x3B4C, + (q15_t)0x7141, (q15_t)0x3BA5, (q15_t)0x7112, (q15_t)0x3BFD, + (q15_t)0x70E2, (q15_t)0x3C56, (q15_t)0x70B3, (q15_t)0x3CAF, + (q15_t)0x7083, (q15_t)0x3D07, (q15_t)0x7053, (q15_t)0x3D60, + (q15_t)0x7023, (q15_t)0x3DB8, (q15_t)0x6FF2, (q15_t)0x3E10, + (q15_t)0x6FC1, (q15_t)0x3E68, (q15_t)0x6F90, (q15_t)0x3EBF, + (q15_t)0x6F5F, (q15_t)0x3F17, (q15_t)0x6F2D, (q15_t)0x3F6E, + (q15_t)0x6EFB, (q15_t)0x3FC5, (q15_t)0x6EC9, (q15_t)0x401D, + (q15_t)0x6E96, (q15_t)0x4073, (q15_t)0x6E63, (q15_t)0x40CA, + (q15_t)0x6E30, (q15_t)0x4121, (q15_t)0x6DFD, (q15_t)0x4177, + (q15_t)0x6DCA, (q15_t)0x41CE, (q15_t)0x6D96, (q15_t)0x4224, + (q15_t)0x6D62, (q15_t)0x427A, (q15_t)0x6D2D, (q15_t)0x42D0, + (q15_t)0x6CF9, (q15_t)0x4325, (q15_t)0x6CC4, (q15_t)0x437B, + (q15_t)0x6C8F, (q15_t)0x43D0, (q15_t)0x6C59, (q15_t)0x4425, + (q15_t)0x6C24, (q15_t)0x447A, (q15_t)0x6BEE, (q15_t)0x44CF, + (q15_t)0x6BB8, (q15_t)0x4524, (q15_t)0x6B81, (q15_t)0x4578, + (q15_t)0x6B4A, (q15_t)0x45CD, (q15_t)0x6B13, (q15_t)0x4621, + (q15_t)0x6ADC, (q15_t)0x4675, (q15_t)0x6AA5, (q15_t)0x46C9, + (q15_t)0x6A6D, (q15_t)0x471C, (q15_t)0x6A35, (q15_t)0x4770, + (q15_t)0x69FD, (q15_t)0x47C3, (q15_t)0x69C4, (q15_t)0x4816, + (q15_t)0x698C, (q15_t)0x4869, (q15_t)0x6953, (q15_t)0x48BC, + (q15_t)0x6919, (q15_t)0x490F, (q15_t)0x68E0, (q15_t)0x4961, + (q15_t)0x68A6, (q15_t)0x49B4, (q15_t)0x686C, (q15_t)0x4A06, + (q15_t)0x6832, (q15_t)0x4A58, (q15_t)0x67F7, (q15_t)0x4AA9, + (q15_t)0x67BD, (q15_t)0x4AFB, (q15_t)0x6782, (q15_t)0x4B4C, + (q15_t)0x6746, (q15_t)0x4B9E, (q15_t)0x670B, (q15_t)0x4BEF, + (q15_t)0x66CF, (q15_t)0x4C3F, (q15_t)0x6693, (q15_t)0x4C90, + (q15_t)0x6657, (q15_t)0x4CE1, (q15_t)0x661A, (q15_t)0x4D31, + (q15_t)0x65DD, (q15_t)0x4D81, (q15_t)0x65A0, (q15_t)0x4DD1, + (q15_t)0x6563, (q15_t)0x4E21, (q15_t)0x6526, (q15_t)0x4E70, + (q15_t)0x64E8, (q15_t)0x4EBF, (q15_t)0x64AA, (q15_t)0x4F0F, + (q15_t)0x646C, (q15_t)0x4F5E, (q15_t)0x642D, (q15_t)0x4FAC, + (q15_t)0x63EF, (q15_t)0x4FFB, (q15_t)0x63B0, (q15_t)0x5049, + (q15_t)0x6371, (q15_t)0x5097, (q15_t)0x6331, (q15_t)0x50E5, + (q15_t)0x62F2, (q15_t)0x5133, (q15_t)0x62B2, (q15_t)0x5181, + (q15_t)0x6271, (q15_t)0x51CE, (q15_t)0x6231, (q15_t)0x521C, + (q15_t)0x61F1, (q15_t)0x5269, (q15_t)0x61B0, (q15_t)0x52B5, + (q15_t)0x616F, (q15_t)0x5302, (q15_t)0x612D, (q15_t)0x534E, + (q15_t)0x60EC, (q15_t)0x539B, (q15_t)0x60AA, (q15_t)0x53E7, + (q15_t)0x6068, (q15_t)0x5433, (q15_t)0x6026, (q15_t)0x547E, + (q15_t)0x5FE3, (q15_t)0x54CA, (q15_t)0x5FA0, (q15_t)0x5515, + (q15_t)0x5F5E, (q15_t)0x5560, (q15_t)0x5F1A, (q15_t)0x55AB, + (q15_t)0x5ED7, (q15_t)0x55F5, (q15_t)0x5E93, (q15_t)0x5640, + (q15_t)0x5E50, (q15_t)0x568A, (q15_t)0x5E0B, (q15_t)0x56D4, + (q15_t)0x5DC7, (q15_t)0x571D, (q15_t)0x5D83, (q15_t)0x5767, + (q15_t)0x5D3E, (q15_t)0x57B0, (q15_t)0x5CF9, (q15_t)0x57F9, + (q15_t)0x5CB4, (q15_t)0x5842, (q15_t)0x5C6E, (q15_t)0x588B, + (q15_t)0x5C29, (q15_t)0x58D4, (q15_t)0x5BE3, (q15_t)0x591C, + (q15_t)0x5B9D, (q15_t)0x5964, (q15_t)0x5B56, (q15_t)0x59AC, + (q15_t)0x5B10, (q15_t)0x59F3, (q15_t)0x5AC9, (q15_t)0x5A3B, + (q15_t)0x5A82, (q15_t)0x5A82, (q15_t)0x5A3B, (q15_t)0x5AC9, + (q15_t)0x59F3, (q15_t)0x5B10, (q15_t)0x59AC, (q15_t)0x5B56, + (q15_t)0x5964, (q15_t)0x5B9D, (q15_t)0x591C, (q15_t)0x5BE3, + (q15_t)0x58D4, (q15_t)0x5C29, (q15_t)0x588B, (q15_t)0x5C6E, + (q15_t)0x5842, (q15_t)0x5CB4, (q15_t)0x57F9, (q15_t)0x5CF9, + (q15_t)0x57B0, (q15_t)0x5D3E, (q15_t)0x5767, (q15_t)0x5D83, + (q15_t)0x571D, (q15_t)0x5DC7, (q15_t)0x56D4, (q15_t)0x5E0B, + (q15_t)0x568A, (q15_t)0x5E50, (q15_t)0x5640, (q15_t)0x5E93, + (q15_t)0x55F5, (q15_t)0x5ED7, (q15_t)0x55AB, (q15_t)0x5F1A, + (q15_t)0x5560, (q15_t)0x5F5E, (q15_t)0x5515, (q15_t)0x5FA0, + (q15_t)0x54CA, (q15_t)0x5FE3, (q15_t)0x547E, (q15_t)0x6026, + (q15_t)0x5433, (q15_t)0x6068, (q15_t)0x53E7, (q15_t)0x60AA, + (q15_t)0x539B, (q15_t)0x60EC, (q15_t)0x534E, (q15_t)0x612D, + (q15_t)0x5302, (q15_t)0x616F, (q15_t)0x52B5, (q15_t)0x61B0, + (q15_t)0x5269, (q15_t)0x61F1, (q15_t)0x521C, (q15_t)0x6231, + (q15_t)0x51CE, (q15_t)0x6271, (q15_t)0x5181, (q15_t)0x62B2, + (q15_t)0x5133, (q15_t)0x62F2, (q15_t)0x50E5, (q15_t)0x6331, + (q15_t)0x5097, (q15_t)0x6371, (q15_t)0x5049, (q15_t)0x63B0, + (q15_t)0x4FFB, (q15_t)0x63EF, (q15_t)0x4FAC, (q15_t)0x642D, + (q15_t)0x4F5E, (q15_t)0x646C, (q15_t)0x4F0F, (q15_t)0x64AA, + (q15_t)0x4EBF, (q15_t)0x64E8, (q15_t)0x4E70, (q15_t)0x6526, + (q15_t)0x4E21, (q15_t)0x6563, (q15_t)0x4DD1, (q15_t)0x65A0, + (q15_t)0x4D81, (q15_t)0x65DD, (q15_t)0x4D31, (q15_t)0x661A, + (q15_t)0x4CE1, (q15_t)0x6657, (q15_t)0x4C90, (q15_t)0x6693, + (q15_t)0x4C3F, (q15_t)0x66CF, (q15_t)0x4BEF, (q15_t)0x670B, + (q15_t)0x4B9E, (q15_t)0x6746, (q15_t)0x4B4C, (q15_t)0x6782, + (q15_t)0x4AFB, (q15_t)0x67BD, (q15_t)0x4AA9, (q15_t)0x67F7, + (q15_t)0x4A58, (q15_t)0x6832, (q15_t)0x4A06, (q15_t)0x686C, + (q15_t)0x49B4, (q15_t)0x68A6, (q15_t)0x4961, (q15_t)0x68E0, + (q15_t)0x490F, (q15_t)0x6919, (q15_t)0x48BC, (q15_t)0x6953, + (q15_t)0x4869, (q15_t)0x698C, (q15_t)0x4816, (q15_t)0x69C4, + (q15_t)0x47C3, (q15_t)0x69FD, (q15_t)0x4770, (q15_t)0x6A35, + (q15_t)0x471C, (q15_t)0x6A6D, (q15_t)0x46C9, (q15_t)0x6AA5, + (q15_t)0x4675, (q15_t)0x6ADC, (q15_t)0x4621, (q15_t)0x6B13, + (q15_t)0x45CD, (q15_t)0x6B4A, (q15_t)0x4578, (q15_t)0x6B81, + (q15_t)0x4524, (q15_t)0x6BB8, (q15_t)0x44CF, (q15_t)0x6BEE, + (q15_t)0x447A, (q15_t)0x6C24, (q15_t)0x4425, (q15_t)0x6C59, + (q15_t)0x43D0, (q15_t)0x6C8F, (q15_t)0x437B, (q15_t)0x6CC4, + (q15_t)0x4325, (q15_t)0x6CF9, (q15_t)0x42D0, (q15_t)0x6D2D, + (q15_t)0x427A, (q15_t)0x6D62, (q15_t)0x4224, (q15_t)0x6D96, + (q15_t)0x41CE, (q15_t)0x6DCA, (q15_t)0x4177, (q15_t)0x6DFD, + (q15_t)0x4121, (q15_t)0x6E30, (q15_t)0x40CA, (q15_t)0x6E63, + (q15_t)0x4073, (q15_t)0x6E96, (q15_t)0x401D, (q15_t)0x6EC9, + (q15_t)0x3FC5, (q15_t)0x6EFB, (q15_t)0x3F6E, (q15_t)0x6F2D, + (q15_t)0x3F17, (q15_t)0x6F5F, (q15_t)0x3EBF, (q15_t)0x6F90, + (q15_t)0x3E68, (q15_t)0x6FC1, (q15_t)0x3E10, (q15_t)0x6FF2, + (q15_t)0x3DB8, (q15_t)0x7023, (q15_t)0x3D60, (q15_t)0x7053, + (q15_t)0x3D07, (q15_t)0x7083, (q15_t)0x3CAF, (q15_t)0x70B3, + (q15_t)0x3C56, (q15_t)0x70E2, (q15_t)0x3BFD, (q15_t)0x7112, + (q15_t)0x3BA5, (q15_t)0x7141, (q15_t)0x3B4C, (q15_t)0x716F, + (q15_t)0x3AF2, (q15_t)0x719E, (q15_t)0x3A99, (q15_t)0x71CC, + (q15_t)0x3A40, (q15_t)0x71FA, (q15_t)0x39E6, (q15_t)0x7227, + (q15_t)0x398C, (q15_t)0x7255, (q15_t)0x3932, (q15_t)0x7282, + (q15_t)0x38D8, (q15_t)0x72AF, (q15_t)0x387E, (q15_t)0x72DB, + (q15_t)0x3824, (q15_t)0x7307, (q15_t)0x37CA, (q15_t)0x7333, + (q15_t)0x376F, (q15_t)0x735F, (q15_t)0x3714, (q15_t)0x738A, + (q15_t)0x36BA, (q15_t)0x73B5, (q15_t)0x365F, (q15_t)0x73E0, + (q15_t)0x3604, (q15_t)0x740B, (q15_t)0x35A8, (q15_t)0x7435, + (q15_t)0x354D, (q15_t)0x745F, (q15_t)0x34F2, (q15_t)0x7489, + (q15_t)0x3496, (q15_t)0x74B2, (q15_t)0x343A, (q15_t)0x74DB, + (q15_t)0x33DE, (q15_t)0x7504, (q15_t)0x3382, (q15_t)0x752D, + (q15_t)0x3326, (q15_t)0x7555, (q15_t)0x32CA, (q15_t)0x757D, + (q15_t)0x326E, (q15_t)0x75A5, (q15_t)0x3211, (q15_t)0x75CC, + (q15_t)0x31B5, (q15_t)0x75F4, (q15_t)0x3158, (q15_t)0x761B, + (q15_t)0x30FB, (q15_t)0x7641, (q15_t)0x309E, (q15_t)0x7668, + (q15_t)0x3041, (q15_t)0x768E, (q15_t)0x2FE4, (q15_t)0x76B3, + (q15_t)0x2F87, (q15_t)0x76D9, (q15_t)0x2F29, (q15_t)0x76FE, + (q15_t)0x2ECC, (q15_t)0x7723, (q15_t)0x2E6E, (q15_t)0x7747, + (q15_t)0x2E11, (q15_t)0x776C, (q15_t)0x2DB3, (q15_t)0x7790, + (q15_t)0x2D55, (q15_t)0x77B4, (q15_t)0x2CF7, (q15_t)0x77D7, + (q15_t)0x2C98, (q15_t)0x77FA, (q15_t)0x2C3A, (q15_t)0x781D, + (q15_t)0x2BDC, (q15_t)0x7840, (q15_t)0x2B7D, (q15_t)0x7862, + (q15_t)0x2B1F, (q15_t)0x7884, (q15_t)0x2AC0, (q15_t)0x78A6, + (q15_t)0x2A61, (q15_t)0x78C7, (q15_t)0x2A02, (q15_t)0x78E8, + (q15_t)0x29A3, (q15_t)0x7909, (q15_t)0x2944, (q15_t)0x792A, + (q15_t)0x28E5, (q15_t)0x794A, (q15_t)0x2886, (q15_t)0x796A, + (q15_t)0x2826, (q15_t)0x798A, (q15_t)0x27C7, (q15_t)0x79A9, + (q15_t)0x2767, (q15_t)0x79C8, (q15_t)0x2707, (q15_t)0x79E7, + (q15_t)0x26A8, (q15_t)0x7A05, (q15_t)0x2648, (q15_t)0x7A24, + (q15_t)0x25E8, (q15_t)0x7A42, (q15_t)0x2588, (q15_t)0x7A5F, + (q15_t)0x2528, (q15_t)0x7A7D, (q15_t)0x24C7, (q15_t)0x7A9A, + (q15_t)0x2467, (q15_t)0x7AB6, (q15_t)0x2407, (q15_t)0x7AD3, + (q15_t)0x23A6, (q15_t)0x7AEF, (q15_t)0x2345, (q15_t)0x7B0B, + (q15_t)0x22E5, (q15_t)0x7B26, (q15_t)0x2284, (q15_t)0x7B42, + (q15_t)0x2223, (q15_t)0x7B5D, (q15_t)0x21C2, (q15_t)0x7B77, + (q15_t)0x2161, (q15_t)0x7B92, (q15_t)0x2100, (q15_t)0x7BAC, + (q15_t)0x209F, (q15_t)0x7BC5, (q15_t)0x203E, (q15_t)0x7BDF, + (q15_t)0x1FDC, (q15_t)0x7BF8, (q15_t)0x1F7B, (q15_t)0x7C11, + (q15_t)0x1F19, (q15_t)0x7C29, (q15_t)0x1EB8, (q15_t)0x7C42, + (q15_t)0x1E56, (q15_t)0x7C5A, (q15_t)0x1DF5, (q15_t)0x7C71, + (q15_t)0x1D93, (q15_t)0x7C89, (q15_t)0x1D31, (q15_t)0x7CA0, + (q15_t)0x1CCF, (q15_t)0x7CB7, (q15_t)0x1C6D, (q15_t)0x7CCD, + (q15_t)0x1C0B, (q15_t)0x7CE3, (q15_t)0x1BA9, (q15_t)0x7CF9, + (q15_t)0x1B47, (q15_t)0x7D0F, (q15_t)0x1AE4, (q15_t)0x7D24, + (q15_t)0x1A82, (q15_t)0x7D39, (q15_t)0x1A20, (q15_t)0x7D4E, + (q15_t)0x19BD, (q15_t)0x7D62, (q15_t)0x195B, (q15_t)0x7D76, + (q15_t)0x18F8, (q15_t)0x7D8A, (q15_t)0x1896, (q15_t)0x7D9D, + (q15_t)0x1833, (q15_t)0x7DB0, (q15_t)0x17D0, (q15_t)0x7DC3, + (q15_t)0x176D, (q15_t)0x7DD6, (q15_t)0x170A, (q15_t)0x7DE8, + (q15_t)0x16A8, (q15_t)0x7DFA, (q15_t)0x1645, (q15_t)0x7E0C, + (q15_t)0x15E2, (q15_t)0x7E1D, (q15_t)0x157F, (q15_t)0x7E2E, + (q15_t)0x151B, (q15_t)0x7E3F, (q15_t)0x14B8, (q15_t)0x7E4F, + (q15_t)0x1455, (q15_t)0x7E5F, (q15_t)0x13F2, (q15_t)0x7E6F, + (q15_t)0x138E, (q15_t)0x7E7F, (q15_t)0x132B, (q15_t)0x7E8E, + (q15_t)0x12C8, (q15_t)0x7E9D, (q15_t)0x1264, (q15_t)0x7EAB, + (q15_t)0x1201, (q15_t)0x7EBA, (q15_t)0x119D, (q15_t)0x7EC8, + (q15_t)0x1139, (q15_t)0x7ED5, (q15_t)0x10D6, (q15_t)0x7EE3, + (q15_t)0x1072, (q15_t)0x7EF0, (q15_t)0x100E, (q15_t)0x7EFD, + (q15_t)0x0FAB, (q15_t)0x7F09, (q15_t)0x0F47, (q15_t)0x7F15, + (q15_t)0x0EE3, (q15_t)0x7F21, (q15_t)0x0E7F, (q15_t)0x7F2D, + (q15_t)0x0E1B, (q15_t)0x7F38, (q15_t)0x0DB7, (q15_t)0x7F43, + (q15_t)0x0D53, (q15_t)0x7F4D, (q15_t)0x0CEF, (q15_t)0x7F58, + (q15_t)0x0C8B, (q15_t)0x7F62, (q15_t)0x0C27, (q15_t)0x7F6B, + (q15_t)0x0BC3, (q15_t)0x7F75, (q15_t)0x0B5F, (q15_t)0x7F7E, + (q15_t)0x0AFB, (q15_t)0x7F87, (q15_t)0x0A97, (q15_t)0x7F8F, + (q15_t)0x0A33, (q15_t)0x7F97, (q15_t)0x09CE, (q15_t)0x7F9F, + (q15_t)0x096A, (q15_t)0x7FA7, (q15_t)0x0906, (q15_t)0x7FAE, + (q15_t)0x08A2, (q15_t)0x7FB5, (q15_t)0x083D, (q15_t)0x7FBC, + (q15_t)0x07D9, (q15_t)0x7FC2, (q15_t)0x0775, (q15_t)0x7FC8, + (q15_t)0x0710, (q15_t)0x7FCE, (q15_t)0x06AC, (q15_t)0x7FD3, + (q15_t)0x0647, (q15_t)0x7FD8, (q15_t)0x05E3, (q15_t)0x7FDD, + (q15_t)0x057F, (q15_t)0x7FE1, (q15_t)0x051A, (q15_t)0x7FE5, + (q15_t)0x04B6, (q15_t)0x7FE9, (q15_t)0x0451, (q15_t)0x7FED, + (q15_t)0x03ED, (q15_t)0x7FF0, (q15_t)0x0388, (q15_t)0x7FF3, + (q15_t)0x0324, (q15_t)0x7FF6, (q15_t)0x02BF, (q15_t)0x7FF8, + (q15_t)0x025B, (q15_t)0x7FFA, (q15_t)0x01F6, (q15_t)0x7FFC, + (q15_t)0x0192, (q15_t)0x7FFD, (q15_t)0x012D, (q15_t)0x7FFE, + (q15_t)0x00C9, (q15_t)0x7FFF, (q15_t)0x0064, (q15_t)0x7FFF, + (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0xFF9B, (q15_t)0x7FFF, + (q15_t)0xFF36, (q15_t)0x7FFF, (q15_t)0xFED2, (q15_t)0x7FFE, + (q15_t)0xFE6D, (q15_t)0x7FFD, (q15_t)0xFE09, (q15_t)0x7FFC, + (q15_t)0xFDA4, (q15_t)0x7FFA, (q15_t)0xFD40, (q15_t)0x7FF8, + (q15_t)0xFCDB, (q15_t)0x7FF6, (q15_t)0xFC77, (q15_t)0x7FF3, + (q15_t)0xFC12, (q15_t)0x7FF0, (q15_t)0xFBAE, (q15_t)0x7FED, + (q15_t)0xFB49, (q15_t)0x7FE9, (q15_t)0xFAE5, (q15_t)0x7FE5, + (q15_t)0xFA80, (q15_t)0x7FE1, (q15_t)0xFA1C, (q15_t)0x7FDD, + (q15_t)0xF9B8, (q15_t)0x7FD8, (q15_t)0xF953, (q15_t)0x7FD3, + (q15_t)0xF8EF, (q15_t)0x7FCE, (q15_t)0xF88A, (q15_t)0x7FC8, + (q15_t)0xF826, (q15_t)0x7FC2, (q15_t)0xF7C2, (q15_t)0x7FBC, + (q15_t)0xF75D, (q15_t)0x7FB5, (q15_t)0xF6F9, (q15_t)0x7FAE, + (q15_t)0xF695, (q15_t)0x7FA7, (q15_t)0xF631, (q15_t)0x7F9F, + (q15_t)0xF5CC, (q15_t)0x7F97, (q15_t)0xF568, (q15_t)0x7F8F, + (q15_t)0xF504, (q15_t)0x7F87, (q15_t)0xF4A0, (q15_t)0x7F7E, + (q15_t)0xF43C, (q15_t)0x7F75, (q15_t)0xF3D8, (q15_t)0x7F6B, + (q15_t)0xF374, (q15_t)0x7F62, (q15_t)0xF310, (q15_t)0x7F58, + (q15_t)0xF2AC, (q15_t)0x7F4D, (q15_t)0xF248, (q15_t)0x7F43, + (q15_t)0xF1E4, (q15_t)0x7F38, (q15_t)0xF180, (q15_t)0x7F2D, + (q15_t)0xF11C, (q15_t)0x7F21, (q15_t)0xF0B8, (q15_t)0x7F15, + (q15_t)0xF054, (q15_t)0x7F09, (q15_t)0xEFF1, (q15_t)0x7EFD, + (q15_t)0xEF8D, (q15_t)0x7EF0, (q15_t)0xEF29, (q15_t)0x7EE3, + (q15_t)0xEEC6, (q15_t)0x7ED5, (q15_t)0xEE62, (q15_t)0x7EC8, + (q15_t)0xEDFE, (q15_t)0x7EBA, (q15_t)0xED9B, (q15_t)0x7EAB, + (q15_t)0xED37, (q15_t)0x7E9D, (q15_t)0xECD4, (q15_t)0x7E8E, + (q15_t)0xEC71, (q15_t)0x7E7F, (q15_t)0xEC0D, (q15_t)0x7E6F, + (q15_t)0xEBAA, (q15_t)0x7E5F, (q15_t)0xEB47, (q15_t)0x7E4F, + (q15_t)0xEAE4, (q15_t)0x7E3F, (q15_t)0xEA80, (q15_t)0x7E2E, + (q15_t)0xEA1D, (q15_t)0x7E1D, (q15_t)0xE9BA, (q15_t)0x7E0C, + (q15_t)0xE957, (q15_t)0x7DFA, (q15_t)0xE8F5, (q15_t)0x7DE8, + (q15_t)0xE892, (q15_t)0x7DD6, (q15_t)0xE82F, (q15_t)0x7DC3, + (q15_t)0xE7CC, (q15_t)0x7DB0, (q15_t)0xE769, (q15_t)0x7D9D, + (q15_t)0xE707, (q15_t)0x7D8A, (q15_t)0xE6A4, (q15_t)0x7D76, + (q15_t)0xE642, (q15_t)0x7D62, (q15_t)0xE5DF, (q15_t)0x7D4E, + (q15_t)0xE57D, (q15_t)0x7D39, (q15_t)0xE51B, (q15_t)0x7D24, + (q15_t)0xE4B8, (q15_t)0x7D0F, (q15_t)0xE456, (q15_t)0x7CF9, + (q15_t)0xE3F4, (q15_t)0x7CE3, (q15_t)0xE392, (q15_t)0x7CCD, + (q15_t)0xE330, (q15_t)0x7CB7, (q15_t)0xE2CE, (q15_t)0x7CA0, + (q15_t)0xE26C, (q15_t)0x7C89, (q15_t)0xE20A, (q15_t)0x7C71, + (q15_t)0xE1A9, (q15_t)0x7C5A, (q15_t)0xE147, (q15_t)0x7C42, + (q15_t)0xE0E6, (q15_t)0x7C29, (q15_t)0xE084, (q15_t)0x7C11, + (q15_t)0xE023, (q15_t)0x7BF8, (q15_t)0xDFC1, (q15_t)0x7BDF, + (q15_t)0xDF60, (q15_t)0x7BC5, (q15_t)0xDEFF, (q15_t)0x7BAC, + (q15_t)0xDE9E, (q15_t)0x7B92, (q15_t)0xDE3D, (q15_t)0x7B77, + (q15_t)0xDDDC, (q15_t)0x7B5D, (q15_t)0xDD7B, (q15_t)0x7B42, + (q15_t)0xDD1A, (q15_t)0x7B26, (q15_t)0xDCBA, (q15_t)0x7B0B, + (q15_t)0xDC59, (q15_t)0x7AEF, (q15_t)0xDBF8, (q15_t)0x7AD3, + (q15_t)0xDB98, (q15_t)0x7AB6, (q15_t)0xDB38, (q15_t)0x7A9A, + (q15_t)0xDAD7, (q15_t)0x7A7D, (q15_t)0xDA77, (q15_t)0x7A5F, + (q15_t)0xDA17, (q15_t)0x7A42, (q15_t)0xD9B7, (q15_t)0x7A24, + (q15_t)0xD957, (q15_t)0x7A05, (q15_t)0xD8F8, (q15_t)0x79E7, + (q15_t)0xD898, (q15_t)0x79C8, (q15_t)0xD838, (q15_t)0x79A9, + (q15_t)0xD7D9, (q15_t)0x798A, (q15_t)0xD779, (q15_t)0x796A, + (q15_t)0xD71A, (q15_t)0x794A, (q15_t)0xD6BB, (q15_t)0x792A, + (q15_t)0xD65C, (q15_t)0x7909, (q15_t)0xD5FD, (q15_t)0x78E8, + (q15_t)0xD59E, (q15_t)0x78C7, (q15_t)0xD53F, (q15_t)0x78A6, + (q15_t)0xD4E0, (q15_t)0x7884, (q15_t)0xD482, (q15_t)0x7862, + (q15_t)0xD423, (q15_t)0x7840, (q15_t)0xD3C5, (q15_t)0x781D, + (q15_t)0xD367, (q15_t)0x77FA, (q15_t)0xD308, (q15_t)0x77D7, + (q15_t)0xD2AA, (q15_t)0x77B4, (q15_t)0xD24C, (q15_t)0x7790, + (q15_t)0xD1EE, (q15_t)0x776C, (q15_t)0xD191, (q15_t)0x7747, + (q15_t)0xD133, (q15_t)0x7723, (q15_t)0xD0D6, (q15_t)0x76FE, + (q15_t)0xD078, (q15_t)0x76D9, (q15_t)0xD01B, (q15_t)0x76B3, + (q15_t)0xCFBE, (q15_t)0x768E, (q15_t)0xCF61, (q15_t)0x7668, + (q15_t)0xCF04, (q15_t)0x7641, (q15_t)0xCEA7, (q15_t)0x761B, + (q15_t)0xCE4A, (q15_t)0x75F4, (q15_t)0xCDEE, (q15_t)0x75CC, + (q15_t)0xCD91, (q15_t)0x75A5, (q15_t)0xCD35, (q15_t)0x757D, + (q15_t)0xCCD9, (q15_t)0x7555, (q15_t)0xCC7D, (q15_t)0x752D, + (q15_t)0xCC21, (q15_t)0x7504, (q15_t)0xCBC5, (q15_t)0x74DB, + (q15_t)0xCB69, (q15_t)0x74B2, (q15_t)0xCB0D, (q15_t)0x7489, + (q15_t)0xCAB2, (q15_t)0x745F, (q15_t)0xCA57, (q15_t)0x7435, + (q15_t)0xC9FB, (q15_t)0x740B, (q15_t)0xC9A0, (q15_t)0x73E0, + (q15_t)0xC945, (q15_t)0x73B5, (q15_t)0xC8EB, (q15_t)0x738A, + (q15_t)0xC890, (q15_t)0x735F, (q15_t)0xC835, (q15_t)0x7333, + (q15_t)0xC7DB, (q15_t)0x7307, (q15_t)0xC781, (q15_t)0x72DB, + (q15_t)0xC727, (q15_t)0x72AF, (q15_t)0xC6CD, (q15_t)0x7282, + (q15_t)0xC673, (q15_t)0x7255, (q15_t)0xC619, (q15_t)0x7227, + (q15_t)0xC5BF, (q15_t)0x71FA, (q15_t)0xC566, (q15_t)0x71CC, + (q15_t)0xC50D, (q15_t)0x719E, (q15_t)0xC4B3, (q15_t)0x716F, + (q15_t)0xC45A, (q15_t)0x7141, (q15_t)0xC402, (q15_t)0x7112, + (q15_t)0xC3A9, (q15_t)0x70E2, (q15_t)0xC350, (q15_t)0x70B3, + (q15_t)0xC2F8, (q15_t)0x7083, (q15_t)0xC29F, (q15_t)0x7053, + (q15_t)0xC247, (q15_t)0x7023, (q15_t)0xC1EF, (q15_t)0x6FF2, + (q15_t)0xC197, (q15_t)0x6FC1, (q15_t)0xC140, (q15_t)0x6F90, + (q15_t)0xC0E8, (q15_t)0x6F5F, (q15_t)0xC091, (q15_t)0x6F2D, + (q15_t)0xC03A, (q15_t)0x6EFB, (q15_t)0xBFE2, (q15_t)0x6EC9, + (q15_t)0xBF8C, (q15_t)0x6E96, (q15_t)0xBF35, (q15_t)0x6E63, + (q15_t)0xBEDE, (q15_t)0x6E30, (q15_t)0xBE88, (q15_t)0x6DFD, + (q15_t)0xBE31, (q15_t)0x6DCA, (q15_t)0xBDDB, (q15_t)0x6D96, + (q15_t)0xBD85, (q15_t)0x6D62, (q15_t)0xBD2F, (q15_t)0x6D2D, + (q15_t)0xBCDA, (q15_t)0x6CF9, (q15_t)0xBC84, (q15_t)0x6CC4, + (q15_t)0xBC2F, (q15_t)0x6C8F, (q15_t)0xBBDA, (q15_t)0x6C59, + (q15_t)0xBB85, (q15_t)0x6C24, (q15_t)0xBB30, (q15_t)0x6BEE, + (q15_t)0xBADB, (q15_t)0x6BB8, (q15_t)0xBA87, (q15_t)0x6B81, + (q15_t)0xBA32, (q15_t)0x6B4A, (q15_t)0xB9DE, (q15_t)0x6B13, + (q15_t)0xB98A, (q15_t)0x6ADC, (q15_t)0xB936, (q15_t)0x6AA5, + (q15_t)0xB8E3, (q15_t)0x6A6D, (q15_t)0xB88F, (q15_t)0x6A35, + (q15_t)0xB83C, (q15_t)0x69FD, (q15_t)0xB7E9, (q15_t)0x69C4, + (q15_t)0xB796, (q15_t)0x698C, (q15_t)0xB743, (q15_t)0x6953, + (q15_t)0xB6F0, (q15_t)0x6919, (q15_t)0xB69E, (q15_t)0x68E0, + (q15_t)0xB64B, (q15_t)0x68A6, (q15_t)0xB5F9, (q15_t)0x686C, + (q15_t)0xB5A7, (q15_t)0x6832, (q15_t)0xB556, (q15_t)0x67F7, + (q15_t)0xB504, (q15_t)0x67BD, (q15_t)0xB4B3, (q15_t)0x6782, + (q15_t)0xB461, (q15_t)0x6746, (q15_t)0xB410, (q15_t)0x670B, + (q15_t)0xB3C0, (q15_t)0x66CF, (q15_t)0xB36F, (q15_t)0x6693, + (q15_t)0xB31E, (q15_t)0x6657, (q15_t)0xB2CE, (q15_t)0x661A, + (q15_t)0xB27E, (q15_t)0x65DD, (q15_t)0xB22E, (q15_t)0x65A0, + (q15_t)0xB1DE, (q15_t)0x6563, (q15_t)0xB18F, (q15_t)0x6526, + (q15_t)0xB140, (q15_t)0x64E8, (q15_t)0xB0F0, (q15_t)0x64AA, + (q15_t)0xB0A1, (q15_t)0x646C, (q15_t)0xB053, (q15_t)0x642D, + (q15_t)0xB004, (q15_t)0x63EF, (q15_t)0xAFB6, (q15_t)0x63B0, + (q15_t)0xAF68, (q15_t)0x6371, (q15_t)0xAF1A, (q15_t)0x6331, + (q15_t)0xAECC, (q15_t)0x62F2, (q15_t)0xAE7E, (q15_t)0x62B2, + (q15_t)0xAE31, (q15_t)0x6271, (q15_t)0xADE3, (q15_t)0x6231, + (q15_t)0xAD96, (q15_t)0x61F1, (q15_t)0xAD4A, (q15_t)0x61B0, + (q15_t)0xACFD, (q15_t)0x616F, (q15_t)0xACB1, (q15_t)0x612D, + (q15_t)0xAC64, (q15_t)0x60EC, (q15_t)0xAC18, (q15_t)0x60AA, + (q15_t)0xABCC, (q15_t)0x6068, (q15_t)0xAB81, (q15_t)0x6026, + (q15_t)0xAB35, (q15_t)0x5FE3, (q15_t)0xAAEA, (q15_t)0x5FA0, + (q15_t)0xAA9F, (q15_t)0x5F5E, (q15_t)0xAA54, (q15_t)0x5F1A, + (q15_t)0xAA0A, (q15_t)0x5ED7, (q15_t)0xA9BF, (q15_t)0x5E93, + (q15_t)0xA975, (q15_t)0x5E50, (q15_t)0xA92B, (q15_t)0x5E0B, + (q15_t)0xA8E2, (q15_t)0x5DC7, (q15_t)0xA898, (q15_t)0x5D83, + (q15_t)0xA84F, (q15_t)0x5D3E, (q15_t)0xA806, (q15_t)0x5CF9, + (q15_t)0xA7BD, (q15_t)0x5CB4, (q15_t)0xA774, (q15_t)0x5C6E, + (q15_t)0xA72B, (q15_t)0x5C29, (q15_t)0xA6E3, (q15_t)0x5BE3, + (q15_t)0xA69B, (q15_t)0x5B9D, (q15_t)0xA653, (q15_t)0x5B56, + (q15_t)0xA60C, (q15_t)0x5B10, (q15_t)0xA5C4, (q15_t)0x5AC9, + (q15_t)0xA57D, (q15_t)0x5A82, (q15_t)0xA536, (q15_t)0x5A3B, + (q15_t)0xA4EF, (q15_t)0x59F3, (q15_t)0xA4A9, (q15_t)0x59AC, + (q15_t)0xA462, (q15_t)0x5964, (q15_t)0xA41C, (q15_t)0x591C, + (q15_t)0xA3D6, (q15_t)0x58D4, (q15_t)0xA391, (q15_t)0x588B, + (q15_t)0xA34B, (q15_t)0x5842, (q15_t)0xA306, (q15_t)0x57F9, + (q15_t)0xA2C1, (q15_t)0x57B0, (q15_t)0xA27C, (q15_t)0x5767, + (q15_t)0xA238, (q15_t)0x571D, (q15_t)0xA1F4, (q15_t)0x56D4, + (q15_t)0xA1AF, (q15_t)0x568A, (q15_t)0xA16C, (q15_t)0x5640, + (q15_t)0xA128, (q15_t)0x55F5, (q15_t)0xA0E5, (q15_t)0x55AB, + (q15_t)0xA0A1, (q15_t)0x5560, (q15_t)0xA05F, (q15_t)0x5515, + (q15_t)0xA01C, (q15_t)0x54CA, (q15_t)0x9FD9, (q15_t)0x547E, + (q15_t)0x9F97, (q15_t)0x5433, (q15_t)0x9F55, (q15_t)0x53E7, + (q15_t)0x9F13, (q15_t)0x539B, (q15_t)0x9ED2, (q15_t)0x534E, + (q15_t)0x9E90, (q15_t)0x5302, (q15_t)0x9E4F, (q15_t)0x52B5, + (q15_t)0x9E0E, (q15_t)0x5269, (q15_t)0x9DCE, (q15_t)0x521C, + (q15_t)0x9D8E, (q15_t)0x51CE, (q15_t)0x9D4D, (q15_t)0x5181, + (q15_t)0x9D0D, (q15_t)0x5133, (q15_t)0x9CCE, (q15_t)0x50E5, + (q15_t)0x9C8E, (q15_t)0x5097, (q15_t)0x9C4F, (q15_t)0x5049, + (q15_t)0x9C10, (q15_t)0x4FFB, (q15_t)0x9BD2, (q15_t)0x4FAC, + (q15_t)0x9B93, (q15_t)0x4F5E, (q15_t)0x9B55, (q15_t)0x4F0F, + (q15_t)0x9B17, (q15_t)0x4EBF, (q15_t)0x9AD9, (q15_t)0x4E70, + (q15_t)0x9A9C, (q15_t)0x4E21, (q15_t)0x9A5F, (q15_t)0x4DD1, + (q15_t)0x9A22, (q15_t)0x4D81, (q15_t)0x99E5, (q15_t)0x4D31, + (q15_t)0x99A8, (q15_t)0x4CE1, (q15_t)0x996C, (q15_t)0x4C90, + (q15_t)0x9930, (q15_t)0x4C3F, (q15_t)0x98F4, (q15_t)0x4BEF, + (q15_t)0x98B9, (q15_t)0x4B9E, (q15_t)0x987D, (q15_t)0x4B4C, + (q15_t)0x9842, (q15_t)0x4AFB, (q15_t)0x9808, (q15_t)0x4AA9, + (q15_t)0x97CD, (q15_t)0x4A58, (q15_t)0x9793, (q15_t)0x4A06, + (q15_t)0x9759, (q15_t)0x49B4, (q15_t)0x971F, (q15_t)0x4961, + (q15_t)0x96E6, (q15_t)0x490F, (q15_t)0x96AC, (q15_t)0x48BC, + (q15_t)0x9673, (q15_t)0x4869, (q15_t)0x963B, (q15_t)0x4816, + (q15_t)0x9602, (q15_t)0x47C3, (q15_t)0x95CA, (q15_t)0x4770, + (q15_t)0x9592, (q15_t)0x471C, (q15_t)0x955A, (q15_t)0x46C9, + (q15_t)0x9523, (q15_t)0x4675, (q15_t)0x94EC, (q15_t)0x4621, + (q15_t)0x94B5, (q15_t)0x45CD, (q15_t)0x947E, (q15_t)0x4578, + (q15_t)0x9447, (q15_t)0x4524, (q15_t)0x9411, (q15_t)0x44CF, + (q15_t)0x93DB, (q15_t)0x447A, (q15_t)0x93A6, (q15_t)0x4425, + (q15_t)0x9370, (q15_t)0x43D0, (q15_t)0x933B, (q15_t)0x437B, + (q15_t)0x9306, (q15_t)0x4325, (q15_t)0x92D2, (q15_t)0x42D0, + (q15_t)0x929D, (q15_t)0x427A, (q15_t)0x9269, (q15_t)0x4224, + (q15_t)0x9235, (q15_t)0x41CE, (q15_t)0x9202, (q15_t)0x4177, + (q15_t)0x91CF, (q15_t)0x4121, (q15_t)0x919C, (q15_t)0x40CA, + (q15_t)0x9169, (q15_t)0x4073, (q15_t)0x9136, (q15_t)0x401D, + (q15_t)0x9104, (q15_t)0x3FC5, (q15_t)0x90D2, (q15_t)0x3F6E, + (q15_t)0x90A0, (q15_t)0x3F17, (q15_t)0x906F, (q15_t)0x3EBF, + (q15_t)0x903E, (q15_t)0x3E68, (q15_t)0x900D, (q15_t)0x3E10, + (q15_t)0x8FDC, (q15_t)0x3DB8, (q15_t)0x8FAC, (q15_t)0x3D60, + (q15_t)0x8F7C, (q15_t)0x3D07, (q15_t)0x8F4C, (q15_t)0x3CAF, + (q15_t)0x8F1D, (q15_t)0x3C56, (q15_t)0x8EED, (q15_t)0x3BFD, + (q15_t)0x8EBE, (q15_t)0x3BA5, (q15_t)0x8E90, (q15_t)0x3B4C, + (q15_t)0x8E61, (q15_t)0x3AF2, (q15_t)0x8E33, (q15_t)0x3A99, + (q15_t)0x8E05, (q15_t)0x3A40, (q15_t)0x8DD8, (q15_t)0x39E6, + (q15_t)0x8DAA, (q15_t)0x398C, (q15_t)0x8D7D, (q15_t)0x3932, + (q15_t)0x8D50, (q15_t)0x38D8, (q15_t)0x8D24, (q15_t)0x387E, + (q15_t)0x8CF8, (q15_t)0x3824, (q15_t)0x8CCC, (q15_t)0x37CA, + (q15_t)0x8CA0, (q15_t)0x376F, (q15_t)0x8C75, (q15_t)0x3714, + (q15_t)0x8C4A, (q15_t)0x36BA, (q15_t)0x8C1F, (q15_t)0x365F, + (q15_t)0x8BF4, (q15_t)0x3604, (q15_t)0x8BCA, (q15_t)0x35A8, + (q15_t)0x8BA0, (q15_t)0x354D, (q15_t)0x8B76, (q15_t)0x34F2, + (q15_t)0x8B4D, (q15_t)0x3496, (q15_t)0x8B24, (q15_t)0x343A, + (q15_t)0x8AFB, (q15_t)0x33DE, (q15_t)0x8AD2, (q15_t)0x3382, + (q15_t)0x8AAA, (q15_t)0x3326, (q15_t)0x8A82, (q15_t)0x32CA, + (q15_t)0x8A5A, (q15_t)0x326E, (q15_t)0x8A33, (q15_t)0x3211, + (q15_t)0x8A0B, (q15_t)0x31B5, (q15_t)0x89E4, (q15_t)0x3158, + (q15_t)0x89BE, (q15_t)0x30FB, (q15_t)0x8997, (q15_t)0x309E, + (q15_t)0x8971, (q15_t)0x3041, (q15_t)0x894C, (q15_t)0x2FE4, + (q15_t)0x8926, (q15_t)0x2F87, (q15_t)0x8901, (q15_t)0x2F29, + (q15_t)0x88DC, (q15_t)0x2ECC, (q15_t)0x88B8, (q15_t)0x2E6E, + (q15_t)0x8893, (q15_t)0x2E11, (q15_t)0x886F, (q15_t)0x2DB3, + (q15_t)0x884B, (q15_t)0x2D55, (q15_t)0x8828, (q15_t)0x2CF7, + (q15_t)0x8805, (q15_t)0x2C98, (q15_t)0x87E2, (q15_t)0x2C3A, + (q15_t)0x87BF, (q15_t)0x2BDC, (q15_t)0x879D, (q15_t)0x2B7D, + (q15_t)0x877B, (q15_t)0x2B1F, (q15_t)0x8759, (q15_t)0x2AC0, + (q15_t)0x8738, (q15_t)0x2A61, (q15_t)0x8717, (q15_t)0x2A02, + (q15_t)0x86F6, (q15_t)0x29A3, (q15_t)0x86D5, (q15_t)0x2944, + (q15_t)0x86B5, (q15_t)0x28E5, (q15_t)0x8695, (q15_t)0x2886, + (q15_t)0x8675, (q15_t)0x2826, (q15_t)0x8656, (q15_t)0x27C7, + (q15_t)0x8637, (q15_t)0x2767, (q15_t)0x8618, (q15_t)0x2707, + (q15_t)0x85FA, (q15_t)0x26A8, (q15_t)0x85DB, (q15_t)0x2648, + (q15_t)0x85BD, (q15_t)0x25E8, (q15_t)0x85A0, (q15_t)0x2588, + (q15_t)0x8582, (q15_t)0x2528, (q15_t)0x8565, (q15_t)0x24C7, + (q15_t)0x8549, (q15_t)0x2467, (q15_t)0x852C, (q15_t)0x2407, + (q15_t)0x8510, (q15_t)0x23A6, (q15_t)0x84F4, (q15_t)0x2345, + (q15_t)0x84D9, (q15_t)0x22E5, (q15_t)0x84BD, (q15_t)0x2284, + (q15_t)0x84A2, (q15_t)0x2223, (q15_t)0x8488, (q15_t)0x21C2, + (q15_t)0x846D, (q15_t)0x2161, (q15_t)0x8453, (q15_t)0x2100, + (q15_t)0x843A, (q15_t)0x209F, (q15_t)0x8420, (q15_t)0x203E, + (q15_t)0x8407, (q15_t)0x1FDC, (q15_t)0x83EE, (q15_t)0x1F7B, + (q15_t)0x83D6, (q15_t)0x1F19, (q15_t)0x83BD, (q15_t)0x1EB8, + (q15_t)0x83A5, (q15_t)0x1E56, (q15_t)0x838E, (q15_t)0x1DF5, + (q15_t)0x8376, (q15_t)0x1D93, (q15_t)0x835F, (q15_t)0x1D31, + (q15_t)0x8348, (q15_t)0x1CCF, (q15_t)0x8332, (q15_t)0x1C6D, + (q15_t)0x831C, (q15_t)0x1C0B, (q15_t)0x8306, (q15_t)0x1BA9, + (q15_t)0x82F0, (q15_t)0x1B47, (q15_t)0x82DB, (q15_t)0x1AE4, + (q15_t)0x82C6, (q15_t)0x1A82, (q15_t)0x82B1, (q15_t)0x1A20, + (q15_t)0x829D, (q15_t)0x19BD, (q15_t)0x8289, (q15_t)0x195B, + (q15_t)0x8275, (q15_t)0x18F8, (q15_t)0x8262, (q15_t)0x1896, + (q15_t)0x824F, (q15_t)0x1833, (q15_t)0x823C, (q15_t)0x17D0, + (q15_t)0x8229, (q15_t)0x176D, (q15_t)0x8217, (q15_t)0x170A, + (q15_t)0x8205, (q15_t)0x16A8, (q15_t)0x81F3, (q15_t)0x1645, + (q15_t)0x81E2, (q15_t)0x15E2, (q15_t)0x81D1, (q15_t)0x157F, + (q15_t)0x81C0, (q15_t)0x151B, (q15_t)0x81B0, (q15_t)0x14B8, + (q15_t)0x81A0, (q15_t)0x1455, (q15_t)0x8190, (q15_t)0x13F2, + (q15_t)0x8180, (q15_t)0x138E, (q15_t)0x8171, (q15_t)0x132B, + (q15_t)0x8162, (q15_t)0x12C8, (q15_t)0x8154, (q15_t)0x1264, + (q15_t)0x8145, (q15_t)0x1201, (q15_t)0x8137, (q15_t)0x119D, + (q15_t)0x812A, (q15_t)0x1139, (q15_t)0x811C, (q15_t)0x10D6, + (q15_t)0x810F, (q15_t)0x1072, (q15_t)0x8102, (q15_t)0x100E, + (q15_t)0x80F6, (q15_t)0x0FAB, (q15_t)0x80EA, (q15_t)0x0F47, + (q15_t)0x80DE, (q15_t)0x0EE3, (q15_t)0x80D2, (q15_t)0x0E7F, + (q15_t)0x80C7, (q15_t)0x0E1B, (q15_t)0x80BC, (q15_t)0x0DB7, + (q15_t)0x80B2, (q15_t)0x0D53, (q15_t)0x80A7, (q15_t)0x0CEF, + (q15_t)0x809D, (q15_t)0x0C8B, (q15_t)0x8094, (q15_t)0x0C27, + (q15_t)0x808A, (q15_t)0x0BC3, (q15_t)0x8081, (q15_t)0x0B5F, + (q15_t)0x8078, (q15_t)0x0AFB, (q15_t)0x8070, (q15_t)0x0A97, + (q15_t)0x8068, (q15_t)0x0A33, (q15_t)0x8060, (q15_t)0x09CE, + (q15_t)0x8058, (q15_t)0x096A, (q15_t)0x8051, (q15_t)0x0906, + (q15_t)0x804A, (q15_t)0x08A2, (q15_t)0x8043, (q15_t)0x083D, + (q15_t)0x803D, (q15_t)0x07D9, (q15_t)0x8037, (q15_t)0x0775, + (q15_t)0x8031, (q15_t)0x0710, (q15_t)0x802C, (q15_t)0x06AC, + (q15_t)0x8027, (q15_t)0x0647, (q15_t)0x8022, (q15_t)0x05E3, + (q15_t)0x801E, (q15_t)0x057F, (q15_t)0x801A, (q15_t)0x051A, + (q15_t)0x8016, (q15_t)0x04B6, (q15_t)0x8012, (q15_t)0x0451, + (q15_t)0x800F, (q15_t)0x03ED, (q15_t)0x800C, (q15_t)0x0388, + (q15_t)0x8009, (q15_t)0x0324, (q15_t)0x8007, (q15_t)0x02BF, + (q15_t)0x8005, (q15_t)0x025B, (q15_t)0x8003, (q15_t)0x01F6, + (q15_t)0x8002, (q15_t)0x0192, (q15_t)0x8001, (q15_t)0x012D, + (q15_t)0x8000, (q15_t)0x00C9, (q15_t)0x8000, (q15_t)0x0064, + (q15_t)0x8000, (q15_t)0x0000, (q15_t)0x8000, (q15_t)0xFF9B, + (q15_t)0x8000, (q15_t)0xFF36, (q15_t)0x8001, (q15_t)0xFED2, + (q15_t)0x8002, (q15_t)0xFE6D, (q15_t)0x8003, (q15_t)0xFE09, + (q15_t)0x8005, (q15_t)0xFDA4, (q15_t)0x8007, (q15_t)0xFD40, + (q15_t)0x8009, (q15_t)0xFCDB, (q15_t)0x800C, (q15_t)0xFC77, + (q15_t)0x800F, (q15_t)0xFC12, (q15_t)0x8012, (q15_t)0xFBAE, + (q15_t)0x8016, (q15_t)0xFB49, (q15_t)0x801A, (q15_t)0xFAE5, + (q15_t)0x801E, (q15_t)0xFA80, (q15_t)0x8022, (q15_t)0xFA1C, + (q15_t)0x8027, (q15_t)0xF9B8, (q15_t)0x802C, (q15_t)0xF953, + (q15_t)0x8031, (q15_t)0xF8EF, (q15_t)0x8037, (q15_t)0xF88A, + (q15_t)0x803D, (q15_t)0xF826, (q15_t)0x8043, (q15_t)0xF7C2, + (q15_t)0x804A, (q15_t)0xF75D, (q15_t)0x8051, (q15_t)0xF6F9, + (q15_t)0x8058, (q15_t)0xF695, (q15_t)0x8060, (q15_t)0xF631, + (q15_t)0x8068, (q15_t)0xF5CC, (q15_t)0x8070, (q15_t)0xF568, + (q15_t)0x8078, (q15_t)0xF504, (q15_t)0x8081, (q15_t)0xF4A0, + (q15_t)0x808A, (q15_t)0xF43C, (q15_t)0x8094, (q15_t)0xF3D8, + (q15_t)0x809D, (q15_t)0xF374, (q15_t)0x80A7, (q15_t)0xF310, + (q15_t)0x80B2, (q15_t)0xF2AC, (q15_t)0x80BC, (q15_t)0xF248, + (q15_t)0x80C7, (q15_t)0xF1E4, (q15_t)0x80D2, (q15_t)0xF180, + (q15_t)0x80DE, (q15_t)0xF11C, (q15_t)0x80EA, (q15_t)0xF0B8, + (q15_t)0x80F6, (q15_t)0xF054, (q15_t)0x8102, (q15_t)0xEFF1, + (q15_t)0x810F, (q15_t)0xEF8D, (q15_t)0x811C, (q15_t)0xEF29, + (q15_t)0x812A, (q15_t)0xEEC6, (q15_t)0x8137, (q15_t)0xEE62, + (q15_t)0x8145, (q15_t)0xEDFE, (q15_t)0x8154, (q15_t)0xED9B, + (q15_t)0x8162, (q15_t)0xED37, (q15_t)0x8171, (q15_t)0xECD4, + (q15_t)0x8180, (q15_t)0xEC71, (q15_t)0x8190, (q15_t)0xEC0D, + (q15_t)0x81A0, (q15_t)0xEBAA, (q15_t)0x81B0, (q15_t)0xEB47, + (q15_t)0x81C0, (q15_t)0xEAE4, (q15_t)0x81D1, (q15_t)0xEA80, + (q15_t)0x81E2, (q15_t)0xEA1D, (q15_t)0x81F3, (q15_t)0xE9BA, + (q15_t)0x8205, (q15_t)0xE957, (q15_t)0x8217, (q15_t)0xE8F5, + (q15_t)0x8229, (q15_t)0xE892, (q15_t)0x823C, (q15_t)0xE82F, + (q15_t)0x824F, (q15_t)0xE7CC, (q15_t)0x8262, (q15_t)0xE769, + (q15_t)0x8275, (q15_t)0xE707, (q15_t)0x8289, (q15_t)0xE6A4, + (q15_t)0x829D, (q15_t)0xE642, (q15_t)0x82B1, (q15_t)0xE5DF, + (q15_t)0x82C6, (q15_t)0xE57D, (q15_t)0x82DB, (q15_t)0xE51B, + (q15_t)0x82F0, (q15_t)0xE4B8, (q15_t)0x8306, (q15_t)0xE456, + (q15_t)0x831C, (q15_t)0xE3F4, (q15_t)0x8332, (q15_t)0xE392, + (q15_t)0x8348, (q15_t)0xE330, (q15_t)0x835F, (q15_t)0xE2CE, + (q15_t)0x8376, (q15_t)0xE26C, (q15_t)0x838E, (q15_t)0xE20A, + (q15_t)0x83A5, (q15_t)0xE1A9, (q15_t)0x83BD, (q15_t)0xE147, + (q15_t)0x83D6, (q15_t)0xE0E6, (q15_t)0x83EE, (q15_t)0xE084, + (q15_t)0x8407, (q15_t)0xE023, (q15_t)0x8420, (q15_t)0xDFC1, + (q15_t)0x843A, (q15_t)0xDF60, (q15_t)0x8453, (q15_t)0xDEFF, + (q15_t)0x846D, (q15_t)0xDE9E, (q15_t)0x8488, (q15_t)0xDE3D, + (q15_t)0x84A2, (q15_t)0xDDDC, (q15_t)0x84BD, (q15_t)0xDD7B, + (q15_t)0x84D9, (q15_t)0xDD1A, (q15_t)0x84F4, (q15_t)0xDCBA, + (q15_t)0x8510, (q15_t)0xDC59, (q15_t)0x852C, (q15_t)0xDBF8, + (q15_t)0x8549, (q15_t)0xDB98, (q15_t)0x8565, (q15_t)0xDB38, + (q15_t)0x8582, (q15_t)0xDAD7, (q15_t)0x85A0, (q15_t)0xDA77, + (q15_t)0x85BD, (q15_t)0xDA17, (q15_t)0x85DB, (q15_t)0xD9B7, + (q15_t)0x85FA, (q15_t)0xD957, (q15_t)0x8618, (q15_t)0xD8F8, + (q15_t)0x8637, (q15_t)0xD898, (q15_t)0x8656, (q15_t)0xD838, + (q15_t)0x8675, (q15_t)0xD7D9, (q15_t)0x8695, (q15_t)0xD779, + (q15_t)0x86B5, (q15_t)0xD71A, (q15_t)0x86D5, (q15_t)0xD6BB, + (q15_t)0x86F6, (q15_t)0xD65C, (q15_t)0x8717, (q15_t)0xD5FD, + (q15_t)0x8738, (q15_t)0xD59E, (q15_t)0x8759, (q15_t)0xD53F, + (q15_t)0x877B, (q15_t)0xD4E0, (q15_t)0x879D, (q15_t)0xD482, + (q15_t)0x87BF, (q15_t)0xD423, (q15_t)0x87E2, (q15_t)0xD3C5, + (q15_t)0x8805, (q15_t)0xD367, (q15_t)0x8828, (q15_t)0xD308, + (q15_t)0x884B, (q15_t)0xD2AA, (q15_t)0x886F, (q15_t)0xD24C, + (q15_t)0x8893, (q15_t)0xD1EE, (q15_t)0x88B8, (q15_t)0xD191, + (q15_t)0x88DC, (q15_t)0xD133, (q15_t)0x8901, (q15_t)0xD0D6, + (q15_t)0x8926, (q15_t)0xD078, (q15_t)0x894C, (q15_t)0xD01B, + (q15_t)0x8971, (q15_t)0xCFBE, (q15_t)0x8997, (q15_t)0xCF61, + (q15_t)0x89BE, (q15_t)0xCF04, (q15_t)0x89E4, (q15_t)0xCEA7, + (q15_t)0x8A0B, (q15_t)0xCE4A, (q15_t)0x8A33, (q15_t)0xCDEE, + (q15_t)0x8A5A, (q15_t)0xCD91, (q15_t)0x8A82, (q15_t)0xCD35, + (q15_t)0x8AAA, (q15_t)0xCCD9, (q15_t)0x8AD2, (q15_t)0xCC7D, + (q15_t)0x8AFB, (q15_t)0xCC21, (q15_t)0x8B24, (q15_t)0xCBC5, + (q15_t)0x8B4D, (q15_t)0xCB69, (q15_t)0x8B76, (q15_t)0xCB0D, + (q15_t)0x8BA0, (q15_t)0xCAB2, (q15_t)0x8BCA, (q15_t)0xCA57, + (q15_t)0x8BF4, (q15_t)0xC9FB, (q15_t)0x8C1F, (q15_t)0xC9A0, + (q15_t)0x8C4A, (q15_t)0xC945, (q15_t)0x8C75, (q15_t)0xC8EB, + (q15_t)0x8CA0, (q15_t)0xC890, (q15_t)0x8CCC, (q15_t)0xC835, + (q15_t)0x8CF8, (q15_t)0xC7DB, (q15_t)0x8D24, (q15_t)0xC781, + (q15_t)0x8D50, (q15_t)0xC727, (q15_t)0x8D7D, (q15_t)0xC6CD, + (q15_t)0x8DAA, (q15_t)0xC673, (q15_t)0x8DD8, (q15_t)0xC619, + (q15_t)0x8E05, (q15_t)0xC5BF, (q15_t)0x8E33, (q15_t)0xC566, + (q15_t)0x8E61, (q15_t)0xC50D, (q15_t)0x8E90, (q15_t)0xC4B3, + (q15_t)0x8EBE, (q15_t)0xC45A, (q15_t)0x8EED, (q15_t)0xC402, + (q15_t)0x8F1D, (q15_t)0xC3A9, (q15_t)0x8F4C, (q15_t)0xC350, + (q15_t)0x8F7C, (q15_t)0xC2F8, (q15_t)0x8FAC, (q15_t)0xC29F, + (q15_t)0x8FDC, (q15_t)0xC247, (q15_t)0x900D, (q15_t)0xC1EF, + (q15_t)0x903E, (q15_t)0xC197, (q15_t)0x906F, (q15_t)0xC140, + (q15_t)0x90A0, (q15_t)0xC0E8, (q15_t)0x90D2, (q15_t)0xC091, + (q15_t)0x9104, (q15_t)0xC03A, (q15_t)0x9136, (q15_t)0xBFE2, + (q15_t)0x9169, (q15_t)0xBF8C, (q15_t)0x919C, (q15_t)0xBF35, + (q15_t)0x91CF, (q15_t)0xBEDE, (q15_t)0x9202, (q15_t)0xBE88, + (q15_t)0x9235, (q15_t)0xBE31, (q15_t)0x9269, (q15_t)0xBDDB, + (q15_t)0x929D, (q15_t)0xBD85, (q15_t)0x92D2, (q15_t)0xBD2F, + (q15_t)0x9306, (q15_t)0xBCDA, (q15_t)0x933B, (q15_t)0xBC84, + (q15_t)0x9370, (q15_t)0xBC2F, (q15_t)0x93A6, (q15_t)0xBBDA, + (q15_t)0x93DB, (q15_t)0xBB85, (q15_t)0x9411, (q15_t)0xBB30, + (q15_t)0x9447, (q15_t)0xBADB, (q15_t)0x947E, (q15_t)0xBA87, + (q15_t)0x94B5, (q15_t)0xBA32, (q15_t)0x94EC, (q15_t)0xB9DE, + (q15_t)0x9523, (q15_t)0xB98A, (q15_t)0x955A, (q15_t)0xB936, + (q15_t)0x9592, (q15_t)0xB8E3, (q15_t)0x95CA, (q15_t)0xB88F, + (q15_t)0x9602, (q15_t)0xB83C, (q15_t)0x963B, (q15_t)0xB7E9, + (q15_t)0x9673, (q15_t)0xB796, (q15_t)0x96AC, (q15_t)0xB743, + (q15_t)0x96E6, (q15_t)0xB6F0, (q15_t)0x971F, (q15_t)0xB69E, + (q15_t)0x9759, (q15_t)0xB64B, (q15_t)0x9793, (q15_t)0xB5F9, + (q15_t)0x97CD, (q15_t)0xB5A7, (q15_t)0x9808, (q15_t)0xB556, + (q15_t)0x9842, (q15_t)0xB504, (q15_t)0x987D, (q15_t)0xB4B3, + (q15_t)0x98B9, (q15_t)0xB461, (q15_t)0x98F4, (q15_t)0xB410, + (q15_t)0x9930, (q15_t)0xB3C0, (q15_t)0x996C, (q15_t)0xB36F, + (q15_t)0x99A8, (q15_t)0xB31E, (q15_t)0x99E5, (q15_t)0xB2CE, + (q15_t)0x9A22, (q15_t)0xB27E, (q15_t)0x9A5F, (q15_t)0xB22E, + (q15_t)0x9A9C, (q15_t)0xB1DE, (q15_t)0x9AD9, (q15_t)0xB18F, + (q15_t)0x9B17, (q15_t)0xB140, (q15_t)0x9B55, (q15_t)0xB0F0, + (q15_t)0x9B93, (q15_t)0xB0A1, (q15_t)0x9BD2, (q15_t)0xB053, + (q15_t)0x9C10, (q15_t)0xB004, (q15_t)0x9C4F, (q15_t)0xAFB6, + (q15_t)0x9C8E, (q15_t)0xAF68, (q15_t)0x9CCE, (q15_t)0xAF1A, + (q15_t)0x9D0D, (q15_t)0xAECC, (q15_t)0x9D4D, (q15_t)0xAE7E, + (q15_t)0x9D8E, (q15_t)0xAE31, (q15_t)0x9DCE, (q15_t)0xADE3, + (q15_t)0x9E0E, (q15_t)0xAD96, (q15_t)0x9E4F, (q15_t)0xAD4A, + (q15_t)0x9E90, (q15_t)0xACFD, (q15_t)0x9ED2, (q15_t)0xACB1, + (q15_t)0x9F13, (q15_t)0xAC64, (q15_t)0x9F55, (q15_t)0xAC18, + (q15_t)0x9F97, (q15_t)0xABCC, (q15_t)0x9FD9, (q15_t)0xAB81, + (q15_t)0xA01C, (q15_t)0xAB35, (q15_t)0xA05F, (q15_t)0xAAEA, + (q15_t)0xA0A1, (q15_t)0xAA9F, (q15_t)0xA0E5, (q15_t)0xAA54, + (q15_t)0xA128, (q15_t)0xAA0A, (q15_t)0xA16C, (q15_t)0xA9BF, + (q15_t)0xA1AF, (q15_t)0xA975, (q15_t)0xA1F4, (q15_t)0xA92B, + (q15_t)0xA238, (q15_t)0xA8E2, (q15_t)0xA27C, (q15_t)0xA898, + (q15_t)0xA2C1, (q15_t)0xA84F, (q15_t)0xA306, (q15_t)0xA806, + (q15_t)0xA34B, (q15_t)0xA7BD, (q15_t)0xA391, (q15_t)0xA774, + (q15_t)0xA3D6, (q15_t)0xA72B, (q15_t)0xA41C, (q15_t)0xA6E3, + (q15_t)0xA462, (q15_t)0xA69B, (q15_t)0xA4A9, (q15_t)0xA653, + (q15_t)0xA4EF, (q15_t)0xA60C, (q15_t)0xA536, (q15_t)0xA5C4, + (q15_t)0xA57D, (q15_t)0xA57D, (q15_t)0xA5C4, (q15_t)0xA536, + (q15_t)0xA60C, (q15_t)0xA4EF, (q15_t)0xA653, (q15_t)0xA4A9, + (q15_t)0xA69B, (q15_t)0xA462, (q15_t)0xA6E3, (q15_t)0xA41C, + (q15_t)0xA72B, (q15_t)0xA3D6, (q15_t)0xA774, (q15_t)0xA391, + (q15_t)0xA7BD, (q15_t)0xA34B, (q15_t)0xA806, (q15_t)0xA306, + (q15_t)0xA84F, (q15_t)0xA2C1, (q15_t)0xA898, (q15_t)0xA27C, + (q15_t)0xA8E2, (q15_t)0xA238, (q15_t)0xA92B, (q15_t)0xA1F4, + (q15_t)0xA975, (q15_t)0xA1AF, (q15_t)0xA9BF, (q15_t)0xA16C, + (q15_t)0xAA0A, (q15_t)0xA128, (q15_t)0xAA54, (q15_t)0xA0E5, + (q15_t)0xAA9F, (q15_t)0xA0A1, (q15_t)0xAAEA, (q15_t)0xA05F, + (q15_t)0xAB35, (q15_t)0xA01C, (q15_t)0xAB81, (q15_t)0x9FD9, + (q15_t)0xABCC, (q15_t)0x9F97, (q15_t)0xAC18, (q15_t)0x9F55, + (q15_t)0xAC64, (q15_t)0x9F13, (q15_t)0xACB1, (q15_t)0x9ED2, + (q15_t)0xACFD, (q15_t)0x9E90, (q15_t)0xAD4A, (q15_t)0x9E4F, + (q15_t)0xAD96, (q15_t)0x9E0E, (q15_t)0xADE3, (q15_t)0x9DCE, + (q15_t)0xAE31, (q15_t)0x9D8E, (q15_t)0xAE7E, (q15_t)0x9D4D, + (q15_t)0xAECC, (q15_t)0x9D0D, (q15_t)0xAF1A, (q15_t)0x9CCE, + (q15_t)0xAF68, (q15_t)0x9C8E, (q15_t)0xAFB6, (q15_t)0x9C4F, + (q15_t)0xB004, (q15_t)0x9C10, (q15_t)0xB053, (q15_t)0x9BD2, + (q15_t)0xB0A1, (q15_t)0x9B93, (q15_t)0xB0F0, (q15_t)0x9B55, + (q15_t)0xB140, (q15_t)0x9B17, (q15_t)0xB18F, (q15_t)0x9AD9, + (q15_t)0xB1DE, (q15_t)0x9A9C, (q15_t)0xB22E, (q15_t)0x9A5F, + (q15_t)0xB27E, (q15_t)0x9A22, (q15_t)0xB2CE, (q15_t)0x99E5, + (q15_t)0xB31E, (q15_t)0x99A8, (q15_t)0xB36F, (q15_t)0x996C, + (q15_t)0xB3C0, (q15_t)0x9930, (q15_t)0xB410, (q15_t)0x98F4, + (q15_t)0xB461, (q15_t)0x98B9, (q15_t)0xB4B3, (q15_t)0x987D, + (q15_t)0xB504, (q15_t)0x9842, (q15_t)0xB556, (q15_t)0x9808, + (q15_t)0xB5A7, (q15_t)0x97CD, (q15_t)0xB5F9, (q15_t)0x9793, + (q15_t)0xB64B, (q15_t)0x9759, (q15_t)0xB69E, (q15_t)0x971F, + (q15_t)0xB6F0, (q15_t)0x96E6, (q15_t)0xB743, (q15_t)0x96AC, + (q15_t)0xB796, (q15_t)0x9673, (q15_t)0xB7E9, (q15_t)0x963B, + (q15_t)0xB83C, (q15_t)0x9602, (q15_t)0xB88F, (q15_t)0x95CA, + (q15_t)0xB8E3, (q15_t)0x9592, (q15_t)0xB936, (q15_t)0x955A, + (q15_t)0xB98A, (q15_t)0x9523, (q15_t)0xB9DE, (q15_t)0x94EC, + (q15_t)0xBA32, (q15_t)0x94B5, (q15_t)0xBA87, (q15_t)0x947E, + (q15_t)0xBADB, (q15_t)0x9447, (q15_t)0xBB30, (q15_t)0x9411, + (q15_t)0xBB85, (q15_t)0x93DB, (q15_t)0xBBDA, (q15_t)0x93A6, + (q15_t)0xBC2F, (q15_t)0x9370, (q15_t)0xBC84, (q15_t)0x933B, + (q15_t)0xBCDA, (q15_t)0x9306, (q15_t)0xBD2F, (q15_t)0x92D2, + (q15_t)0xBD85, (q15_t)0x929D, (q15_t)0xBDDB, (q15_t)0x9269, + (q15_t)0xBE31, (q15_t)0x9235, (q15_t)0xBE88, (q15_t)0x9202, + (q15_t)0xBEDE, (q15_t)0x91CF, (q15_t)0xBF35, (q15_t)0x919C, + (q15_t)0xBF8C, (q15_t)0x9169, (q15_t)0xBFE2, (q15_t)0x9136, + (q15_t)0xC03A, (q15_t)0x9104, (q15_t)0xC091, (q15_t)0x90D2, + (q15_t)0xC0E8, (q15_t)0x90A0, (q15_t)0xC140, (q15_t)0x906F, + (q15_t)0xC197, (q15_t)0x903E, (q15_t)0xC1EF, (q15_t)0x900D, + (q15_t)0xC247, (q15_t)0x8FDC, (q15_t)0xC29F, (q15_t)0x8FAC, + (q15_t)0xC2F8, (q15_t)0x8F7C, (q15_t)0xC350, (q15_t)0x8F4C, + (q15_t)0xC3A9, (q15_t)0x8F1D, (q15_t)0xC402, (q15_t)0x8EED, + (q15_t)0xC45A, (q15_t)0x8EBE, (q15_t)0xC4B3, (q15_t)0x8E90, + (q15_t)0xC50D, (q15_t)0x8E61, (q15_t)0xC566, (q15_t)0x8E33, + (q15_t)0xC5BF, (q15_t)0x8E05, (q15_t)0xC619, (q15_t)0x8DD8, + (q15_t)0xC673, (q15_t)0x8DAA, (q15_t)0xC6CD, (q15_t)0x8D7D, + (q15_t)0xC727, (q15_t)0x8D50, (q15_t)0xC781, (q15_t)0x8D24, + (q15_t)0xC7DB, (q15_t)0x8CF8, (q15_t)0xC835, (q15_t)0x8CCC, + (q15_t)0xC890, (q15_t)0x8CA0, (q15_t)0xC8EB, (q15_t)0x8C75, + (q15_t)0xC945, (q15_t)0x8C4A, (q15_t)0xC9A0, (q15_t)0x8C1F, + (q15_t)0xC9FB, (q15_t)0x8BF4, (q15_t)0xCA57, (q15_t)0x8BCA, + (q15_t)0xCAB2, (q15_t)0x8BA0, (q15_t)0xCB0D, (q15_t)0x8B76, + (q15_t)0xCB69, (q15_t)0x8B4D, (q15_t)0xCBC5, (q15_t)0x8B24, + (q15_t)0xCC21, (q15_t)0x8AFB, (q15_t)0xCC7D, (q15_t)0x8AD2, + (q15_t)0xCCD9, (q15_t)0x8AAA, (q15_t)0xCD35, (q15_t)0x8A82, + (q15_t)0xCD91, (q15_t)0x8A5A, (q15_t)0xCDEE, (q15_t)0x8A33, + (q15_t)0xCE4A, (q15_t)0x8A0B, (q15_t)0xCEA7, (q15_t)0x89E4, + (q15_t)0xCF04, (q15_t)0x89BE, (q15_t)0xCF61, (q15_t)0x8997, + (q15_t)0xCFBE, (q15_t)0x8971, (q15_t)0xD01B, (q15_t)0x894C, + (q15_t)0xD078, (q15_t)0x8926, (q15_t)0xD0D6, (q15_t)0x8901, + (q15_t)0xD133, (q15_t)0x88DC, (q15_t)0xD191, (q15_t)0x88B8, + (q15_t)0xD1EE, (q15_t)0x8893, (q15_t)0xD24C, (q15_t)0x886F, + (q15_t)0xD2AA, (q15_t)0x884B, (q15_t)0xD308, (q15_t)0x8828, + (q15_t)0xD367, (q15_t)0x8805, (q15_t)0xD3C5, (q15_t)0x87E2, + (q15_t)0xD423, (q15_t)0x87BF, (q15_t)0xD482, (q15_t)0x879D, + (q15_t)0xD4E0, (q15_t)0x877B, (q15_t)0xD53F, (q15_t)0x8759, + (q15_t)0xD59E, (q15_t)0x8738, (q15_t)0xD5FD, (q15_t)0x8717, + (q15_t)0xD65C, (q15_t)0x86F6, (q15_t)0xD6BB, (q15_t)0x86D5, + (q15_t)0xD71A, (q15_t)0x86B5, (q15_t)0xD779, (q15_t)0x8695, + (q15_t)0xD7D9, (q15_t)0x8675, (q15_t)0xD838, (q15_t)0x8656, + (q15_t)0xD898, (q15_t)0x8637, (q15_t)0xD8F8, (q15_t)0x8618, + (q15_t)0xD957, (q15_t)0x85FA, (q15_t)0xD9B7, (q15_t)0x85DB, + (q15_t)0xDA17, (q15_t)0x85BD, (q15_t)0xDA77, (q15_t)0x85A0, + (q15_t)0xDAD7, (q15_t)0x8582, (q15_t)0xDB38, (q15_t)0x8565, + (q15_t)0xDB98, (q15_t)0x8549, (q15_t)0xDBF8, (q15_t)0x852C, + (q15_t)0xDC59, (q15_t)0x8510, (q15_t)0xDCBA, (q15_t)0x84F4, + (q15_t)0xDD1A, (q15_t)0x84D9, (q15_t)0xDD7B, (q15_t)0x84BD, + (q15_t)0xDDDC, (q15_t)0x84A2, (q15_t)0xDE3D, (q15_t)0x8488, + (q15_t)0xDE9E, (q15_t)0x846D, (q15_t)0xDEFF, (q15_t)0x8453, + (q15_t)0xDF60, (q15_t)0x843A, (q15_t)0xDFC1, (q15_t)0x8420, + (q15_t)0xE023, (q15_t)0x8407, (q15_t)0xE084, (q15_t)0x83EE, + (q15_t)0xE0E6, (q15_t)0x83D6, (q15_t)0xE147, (q15_t)0x83BD, + (q15_t)0xE1A9, (q15_t)0x83A5, (q15_t)0xE20A, (q15_t)0x838E, + (q15_t)0xE26C, (q15_t)0x8376, (q15_t)0xE2CE, (q15_t)0x835F, + (q15_t)0xE330, (q15_t)0x8348, (q15_t)0xE392, (q15_t)0x8332, + (q15_t)0xE3F4, (q15_t)0x831C, (q15_t)0xE456, (q15_t)0x8306, + (q15_t)0xE4B8, (q15_t)0x82F0, (q15_t)0xE51B, (q15_t)0x82DB, + (q15_t)0xE57D, (q15_t)0x82C6, (q15_t)0xE5DF, (q15_t)0x82B1, + (q15_t)0xE642, (q15_t)0x829D, (q15_t)0xE6A4, (q15_t)0x8289, + (q15_t)0xE707, (q15_t)0x8275, (q15_t)0xE769, (q15_t)0x8262, + (q15_t)0xE7CC, (q15_t)0x824F, (q15_t)0xE82F, (q15_t)0x823C, + (q15_t)0xE892, (q15_t)0x8229, (q15_t)0xE8F5, (q15_t)0x8217, + (q15_t)0xE957, (q15_t)0x8205, (q15_t)0xE9BA, (q15_t)0x81F3, + (q15_t)0xEA1D, (q15_t)0x81E2, (q15_t)0xEA80, (q15_t)0x81D1, + (q15_t)0xEAE4, (q15_t)0x81C0, (q15_t)0xEB47, (q15_t)0x81B0, + (q15_t)0xEBAA, (q15_t)0x81A0, (q15_t)0xEC0D, (q15_t)0x8190, + (q15_t)0xEC71, (q15_t)0x8180, (q15_t)0xECD4, (q15_t)0x8171, + (q15_t)0xED37, (q15_t)0x8162, (q15_t)0xED9B, (q15_t)0x8154, + (q15_t)0xEDFE, (q15_t)0x8145, (q15_t)0xEE62, (q15_t)0x8137, + (q15_t)0xEEC6, (q15_t)0x812A, (q15_t)0xEF29, (q15_t)0x811C, + (q15_t)0xEF8D, (q15_t)0x810F, (q15_t)0xEFF1, (q15_t)0x8102, + (q15_t)0xF054, (q15_t)0x80F6, (q15_t)0xF0B8, (q15_t)0x80EA, + (q15_t)0xF11C, (q15_t)0x80DE, (q15_t)0xF180, (q15_t)0x80D2, + (q15_t)0xF1E4, (q15_t)0x80C7, (q15_t)0xF248, (q15_t)0x80BC, + (q15_t)0xF2AC, (q15_t)0x80B2, (q15_t)0xF310, (q15_t)0x80A7, + (q15_t)0xF374, (q15_t)0x809D, (q15_t)0xF3D8, (q15_t)0x8094, + (q15_t)0xF43C, (q15_t)0x808A, (q15_t)0xF4A0, (q15_t)0x8081, + (q15_t)0xF504, (q15_t)0x8078, (q15_t)0xF568, (q15_t)0x8070, + (q15_t)0xF5CC, (q15_t)0x8068, (q15_t)0xF631, (q15_t)0x8060, + (q15_t)0xF695, (q15_t)0x8058, (q15_t)0xF6F9, (q15_t)0x8051, + (q15_t)0xF75D, (q15_t)0x804A, (q15_t)0xF7C2, (q15_t)0x8043, + (q15_t)0xF826, (q15_t)0x803D, (q15_t)0xF88A, (q15_t)0x8037, + (q15_t)0xF8EF, (q15_t)0x8031, (q15_t)0xF953, (q15_t)0x802C, + (q15_t)0xF9B8, (q15_t)0x8027, (q15_t)0xFA1C, (q15_t)0x8022, + (q15_t)0xFA80, (q15_t)0x801E, (q15_t)0xFAE5, (q15_t)0x801A, + (q15_t)0xFB49, (q15_t)0x8016, (q15_t)0xFBAE, (q15_t)0x8012, + (q15_t)0xFC12, (q15_t)0x800F, (q15_t)0xFC77, (q15_t)0x800C, + (q15_t)0xFCDB, (q15_t)0x8009, (q15_t)0xFD40, (q15_t)0x8007, + (q15_t)0xFDA4, (q15_t)0x8005, (q15_t)0xFE09, (q15_t)0x8003, + (q15_t)0xFE6D, (q15_t)0x8002, (q15_t)0xFED2, (q15_t)0x8001, + (q15_t)0xFF36, (q15_t)0x8000, (q15_t)0xFF9B, (q15_t)0x8000 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) +/** + @par + Example code for q15 Twiddle factors Generation:: + @par +
for (i = 0; i< 3N/4; i++)
+  {
+     twiddleCoefq15[2*i]   = cos(i * 2*PI/(float)N);
+     twiddleCoefq15[2*i+1] = sin(i * 2*PI/(float)N);
+  } 
+ @par + where N = 4096, PI = 3.14159265358979 + @par + Cos and Sin values are interleaved fashion + @par + Convert Floating point to q15(Fixed point 1.15): + round(twiddleCoefq15(i) * pow(2, 15)) + */ +const q15_t twiddleCoef_4096_q15[6144] = +{ + (q15_t)0x7FFF, (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0x0032, + (q15_t)0x7FFF, (q15_t)0x0064, (q15_t)0x7FFF, (q15_t)0x0096, + (q15_t)0x7FFF, (q15_t)0x00C9, (q15_t)0x7FFF, (q15_t)0x00FB, + (q15_t)0x7FFE, (q15_t)0x012D, (q15_t)0x7FFE, (q15_t)0x015F, + (q15_t)0x7FFD, (q15_t)0x0192, (q15_t)0x7FFC, (q15_t)0x01C4, + (q15_t)0x7FFC, (q15_t)0x01F6, (q15_t)0x7FFB, (q15_t)0x0228, + (q15_t)0x7FFA, (q15_t)0x025B, (q15_t)0x7FF9, (q15_t)0x028D, + (q15_t)0x7FF8, (q15_t)0x02BF, (q15_t)0x7FF7, (q15_t)0x02F1, + (q15_t)0x7FF6, (q15_t)0x0324, (q15_t)0x7FF4, (q15_t)0x0356, + (q15_t)0x7FF3, (q15_t)0x0388, (q15_t)0x7FF2, (q15_t)0x03BA, + (q15_t)0x7FF0, (q15_t)0x03ED, (q15_t)0x7FEE, (q15_t)0x041F, + (q15_t)0x7FED, (q15_t)0x0451, (q15_t)0x7FEB, (q15_t)0x0483, + (q15_t)0x7FE9, (q15_t)0x04B6, (q15_t)0x7FE7, (q15_t)0x04E8, + (q15_t)0x7FE5, (q15_t)0x051A, (q15_t)0x7FE3, (q15_t)0x054C, + (q15_t)0x7FE1, (q15_t)0x057F, (q15_t)0x7FDF, (q15_t)0x05B1, + (q15_t)0x7FDD, (q15_t)0x05E3, (q15_t)0x7FDA, (q15_t)0x0615, + (q15_t)0x7FD8, (q15_t)0x0647, (q15_t)0x7FD6, (q15_t)0x067A, + (q15_t)0x7FD3, (q15_t)0x06AC, (q15_t)0x7FD0, (q15_t)0x06DE, + (q15_t)0x7FCE, (q15_t)0x0710, (q15_t)0x7FCB, (q15_t)0x0742, + (q15_t)0x7FC8, (q15_t)0x0775, (q15_t)0x7FC5, (q15_t)0x07A7, + (q15_t)0x7FC2, (q15_t)0x07D9, (q15_t)0x7FBF, (q15_t)0x080B, + (q15_t)0x7FBC, (q15_t)0x083D, (q15_t)0x7FB8, (q15_t)0x086F, + (q15_t)0x7FB5, (q15_t)0x08A2, (q15_t)0x7FB1, (q15_t)0x08D4, + (q15_t)0x7FAE, (q15_t)0x0906, (q15_t)0x7FAA, (q15_t)0x0938, + (q15_t)0x7FA7, (q15_t)0x096A, (q15_t)0x7FA3, (q15_t)0x099C, + (q15_t)0x7F9F, (q15_t)0x09CE, (q15_t)0x7F9B, (q15_t)0x0A00, + (q15_t)0x7F97, (q15_t)0x0A33, (q15_t)0x7F93, (q15_t)0x0A65, + (q15_t)0x7F8F, (q15_t)0x0A97, (q15_t)0x7F8B, (q15_t)0x0AC9, + (q15_t)0x7F87, (q15_t)0x0AFB, (q15_t)0x7F82, (q15_t)0x0B2D, + (q15_t)0x7F7E, (q15_t)0x0B5F, (q15_t)0x7F79, (q15_t)0x0B91, + (q15_t)0x7F75, (q15_t)0x0BC3, (q15_t)0x7F70, (q15_t)0x0BF5, + (q15_t)0x7F6B, (q15_t)0x0C27, (q15_t)0x7F67, (q15_t)0x0C59, + (q15_t)0x7F62, (q15_t)0x0C8B, (q15_t)0x7F5D, (q15_t)0x0CBD, + (q15_t)0x7F58, (q15_t)0x0CEF, (q15_t)0x7F53, (q15_t)0x0D21, + (q15_t)0x7F4D, (q15_t)0x0D53, (q15_t)0x7F48, (q15_t)0x0D85, + (q15_t)0x7F43, (q15_t)0x0DB7, (q15_t)0x7F3D, (q15_t)0x0DE9, + (q15_t)0x7F38, (q15_t)0x0E1B, (q15_t)0x7F32, (q15_t)0x0E4D, + (q15_t)0x7F2D, (q15_t)0x0E7F, (q15_t)0x7F27, (q15_t)0x0EB1, + (q15_t)0x7F21, (q15_t)0x0EE3, (q15_t)0x7F1B, (q15_t)0x0F15, + (q15_t)0x7F15, (q15_t)0x0F47, (q15_t)0x7F0F, (q15_t)0x0F79, + (q15_t)0x7F09, (q15_t)0x0FAB, (q15_t)0x7F03, (q15_t)0x0FDD, + (q15_t)0x7EFD, (q15_t)0x100E, (q15_t)0x7EF6, (q15_t)0x1040, + (q15_t)0x7EF0, (q15_t)0x1072, (q15_t)0x7EE9, (q15_t)0x10A4, + (q15_t)0x7EE3, (q15_t)0x10D6, (q15_t)0x7EDC, (q15_t)0x1108, + (q15_t)0x7ED5, (q15_t)0x1139, (q15_t)0x7ECF, (q15_t)0x116B, + (q15_t)0x7EC8, (q15_t)0x119D, (q15_t)0x7EC1, (q15_t)0x11CF, + (q15_t)0x7EBA, (q15_t)0x1201, (q15_t)0x7EB3, (q15_t)0x1232, + (q15_t)0x7EAB, (q15_t)0x1264, (q15_t)0x7EA4, (q15_t)0x1296, + (q15_t)0x7E9D, (q15_t)0x12C8, (q15_t)0x7E95, (q15_t)0x12F9, + (q15_t)0x7E8E, (q15_t)0x132B, (q15_t)0x7E86, (q15_t)0x135D, + (q15_t)0x7E7F, (q15_t)0x138E, (q15_t)0x7E77, (q15_t)0x13C0, + (q15_t)0x7E6F, (q15_t)0x13F2, (q15_t)0x7E67, (q15_t)0x1423, + (q15_t)0x7E5F, (q15_t)0x1455, (q15_t)0x7E57, (q15_t)0x1487, + (q15_t)0x7E4F, (q15_t)0x14B8, (q15_t)0x7E47, (q15_t)0x14EA, + (q15_t)0x7E3F, (q15_t)0x151B, (q15_t)0x7E37, (q15_t)0x154D, + (q15_t)0x7E2E, (q15_t)0x157F, (q15_t)0x7E26, (q15_t)0x15B0, + (q15_t)0x7E1D, (q15_t)0x15E2, (q15_t)0x7E14, (q15_t)0x1613, + (q15_t)0x7E0C, (q15_t)0x1645, (q15_t)0x7E03, (q15_t)0x1676, + (q15_t)0x7DFA, (q15_t)0x16A8, (q15_t)0x7DF1, (q15_t)0x16D9, + (q15_t)0x7DE8, (q15_t)0x170A, (q15_t)0x7DDF, (q15_t)0x173C, + (q15_t)0x7DD6, (q15_t)0x176D, (q15_t)0x7DCD, (q15_t)0x179F, + (q15_t)0x7DC3, (q15_t)0x17D0, (q15_t)0x7DBA, (q15_t)0x1802, + (q15_t)0x7DB0, (q15_t)0x1833, (q15_t)0x7DA7, (q15_t)0x1864, + (q15_t)0x7D9D, (q15_t)0x1896, (q15_t)0x7D94, (q15_t)0x18C7, + (q15_t)0x7D8A, (q15_t)0x18F8, (q15_t)0x7D80, (q15_t)0x192A, + (q15_t)0x7D76, (q15_t)0x195B, (q15_t)0x7D6C, (q15_t)0x198C, + (q15_t)0x7D62, (q15_t)0x19BD, (q15_t)0x7D58, (q15_t)0x19EF, + (q15_t)0x7D4E, (q15_t)0x1A20, (q15_t)0x7D43, (q15_t)0x1A51, + (q15_t)0x7D39, (q15_t)0x1A82, (q15_t)0x7D2F, (q15_t)0x1AB3, + (q15_t)0x7D24, (q15_t)0x1AE4, (q15_t)0x7D19, (q15_t)0x1B16, + (q15_t)0x7D0F, (q15_t)0x1B47, (q15_t)0x7D04, (q15_t)0x1B78, + (q15_t)0x7CF9, (q15_t)0x1BA9, (q15_t)0x7CEE, (q15_t)0x1BDA, + (q15_t)0x7CE3, (q15_t)0x1C0B, (q15_t)0x7CD8, (q15_t)0x1C3C, + (q15_t)0x7CCD, (q15_t)0x1C6D, (q15_t)0x7CC2, (q15_t)0x1C9E, + (q15_t)0x7CB7, (q15_t)0x1CCF, (q15_t)0x7CAB, (q15_t)0x1D00, + (q15_t)0x7CA0, (q15_t)0x1D31, (q15_t)0x7C94, (q15_t)0x1D62, + (q15_t)0x7C89, (q15_t)0x1D93, (q15_t)0x7C7D, (q15_t)0x1DC4, + (q15_t)0x7C71, (q15_t)0x1DF5, (q15_t)0x7C66, (q15_t)0x1E25, + (q15_t)0x7C5A, (q15_t)0x1E56, (q15_t)0x7C4E, (q15_t)0x1E87, + (q15_t)0x7C42, (q15_t)0x1EB8, (q15_t)0x7C36, (q15_t)0x1EE9, + (q15_t)0x7C29, (q15_t)0x1F19, (q15_t)0x7C1D, (q15_t)0x1F4A, + (q15_t)0x7C11, (q15_t)0x1F7B, (q15_t)0x7C05, (q15_t)0x1FAC, + (q15_t)0x7BF8, (q15_t)0x1FDC, (q15_t)0x7BEB, (q15_t)0x200D, + (q15_t)0x7BDF, (q15_t)0x203E, (q15_t)0x7BD2, (q15_t)0x206E, + (q15_t)0x7BC5, (q15_t)0x209F, (q15_t)0x7BB9, (q15_t)0x20D0, + (q15_t)0x7BAC, (q15_t)0x2100, (q15_t)0x7B9F, (q15_t)0x2131, + (q15_t)0x7B92, (q15_t)0x2161, (q15_t)0x7B84, (q15_t)0x2192, + (q15_t)0x7B77, (q15_t)0x21C2, (q15_t)0x7B6A, (q15_t)0x21F3, + (q15_t)0x7B5D, (q15_t)0x2223, (q15_t)0x7B4F, (q15_t)0x2254, + (q15_t)0x7B42, (q15_t)0x2284, (q15_t)0x7B34, (q15_t)0x22B4, + (q15_t)0x7B26, (q15_t)0x22E5, (q15_t)0x7B19, (q15_t)0x2315, + (q15_t)0x7B0B, (q15_t)0x2345, (q15_t)0x7AFD, (q15_t)0x2376, + (q15_t)0x7AEF, (q15_t)0x23A6, (q15_t)0x7AE1, (q15_t)0x23D6, + (q15_t)0x7AD3, (q15_t)0x2407, (q15_t)0x7AC5, (q15_t)0x2437, + (q15_t)0x7AB6, (q15_t)0x2467, (q15_t)0x7AA8, (q15_t)0x2497, + (q15_t)0x7A9A, (q15_t)0x24C7, (q15_t)0x7A8B, (q15_t)0x24F7, + (q15_t)0x7A7D, (q15_t)0x2528, (q15_t)0x7A6E, (q15_t)0x2558, + (q15_t)0x7A5F, (q15_t)0x2588, (q15_t)0x7A50, (q15_t)0x25B8, + (q15_t)0x7A42, (q15_t)0x25E8, (q15_t)0x7A33, (q15_t)0x2618, + (q15_t)0x7A24, (q15_t)0x2648, (q15_t)0x7A15, (q15_t)0x2678, + (q15_t)0x7A05, (q15_t)0x26A8, (q15_t)0x79F6, (q15_t)0x26D8, + (q15_t)0x79E7, (q15_t)0x2707, (q15_t)0x79D8, (q15_t)0x2737, + (q15_t)0x79C8, (q15_t)0x2767, (q15_t)0x79B9, (q15_t)0x2797, + (q15_t)0x79A9, (q15_t)0x27C7, (q15_t)0x7999, (q15_t)0x27F6, + (q15_t)0x798A, (q15_t)0x2826, (q15_t)0x797A, (q15_t)0x2856, + (q15_t)0x796A, (q15_t)0x2886, (q15_t)0x795A, (q15_t)0x28B5, + (q15_t)0x794A, (q15_t)0x28E5, (q15_t)0x793A, (q15_t)0x2915, + (q15_t)0x792A, (q15_t)0x2944, (q15_t)0x7919, (q15_t)0x2974, + (q15_t)0x7909, (q15_t)0x29A3, (q15_t)0x78F9, (q15_t)0x29D3, + (q15_t)0x78E8, (q15_t)0x2A02, (q15_t)0x78D8, (q15_t)0x2A32, + (q15_t)0x78C7, (q15_t)0x2A61, (q15_t)0x78B6, (q15_t)0x2A91, + (q15_t)0x78A6, (q15_t)0x2AC0, (q15_t)0x7895, (q15_t)0x2AEF, + (q15_t)0x7884, (q15_t)0x2B1F, (q15_t)0x7873, (q15_t)0x2B4E, + (q15_t)0x7862, (q15_t)0x2B7D, (q15_t)0x7851, (q15_t)0x2BAD, + (q15_t)0x7840, (q15_t)0x2BDC, (q15_t)0x782E, (q15_t)0x2C0B, + (q15_t)0x781D, (q15_t)0x2C3A, (q15_t)0x780C, (q15_t)0x2C69, + (q15_t)0x77FA, (q15_t)0x2C98, (q15_t)0x77E9, (q15_t)0x2CC8, + (q15_t)0x77D7, (q15_t)0x2CF7, (q15_t)0x77C5, (q15_t)0x2D26, + (q15_t)0x77B4, (q15_t)0x2D55, (q15_t)0x77A2, (q15_t)0x2D84, + (q15_t)0x7790, (q15_t)0x2DB3, (q15_t)0x777E, (q15_t)0x2DE2, + (q15_t)0x776C, (q15_t)0x2E11, (q15_t)0x775A, (q15_t)0x2E3F, + (q15_t)0x7747, (q15_t)0x2E6E, (q15_t)0x7735, (q15_t)0x2E9D, + (q15_t)0x7723, (q15_t)0x2ECC, (q15_t)0x7710, (q15_t)0x2EFB, + (q15_t)0x76FE, (q15_t)0x2F29, (q15_t)0x76EB, (q15_t)0x2F58, + (q15_t)0x76D9, (q15_t)0x2F87, (q15_t)0x76C6, (q15_t)0x2FB5, + (q15_t)0x76B3, (q15_t)0x2FE4, (q15_t)0x76A0, (q15_t)0x3013, + (q15_t)0x768E, (q15_t)0x3041, (q15_t)0x767B, (q15_t)0x3070, + (q15_t)0x7668, (q15_t)0x309E, (q15_t)0x7654, (q15_t)0x30CD, + (q15_t)0x7641, (q15_t)0x30FB, (q15_t)0x762E, (q15_t)0x312A, + (q15_t)0x761B, (q15_t)0x3158, (q15_t)0x7607, (q15_t)0x3186, + (q15_t)0x75F4, (q15_t)0x31B5, (q15_t)0x75E0, (q15_t)0x31E3, + (q15_t)0x75CC, (q15_t)0x3211, (q15_t)0x75B9, (q15_t)0x3240, + (q15_t)0x75A5, (q15_t)0x326E, (q15_t)0x7591, (q15_t)0x329C, + (q15_t)0x757D, (q15_t)0x32CA, (q15_t)0x7569, (q15_t)0x32F8, + (q15_t)0x7555, (q15_t)0x3326, (q15_t)0x7541, (q15_t)0x3354, + (q15_t)0x752D, (q15_t)0x3382, (q15_t)0x7519, (q15_t)0x33B0, + (q15_t)0x7504, (q15_t)0x33DE, (q15_t)0x74F0, (q15_t)0x340C, + (q15_t)0x74DB, (q15_t)0x343A, (q15_t)0x74C7, (q15_t)0x3468, + (q15_t)0x74B2, (q15_t)0x3496, (q15_t)0x749E, (q15_t)0x34C4, + (q15_t)0x7489, (q15_t)0x34F2, (q15_t)0x7474, (q15_t)0x351F, + (q15_t)0x745F, (q15_t)0x354D, (q15_t)0x744A, (q15_t)0x357B, + (q15_t)0x7435, (q15_t)0x35A8, (q15_t)0x7420, (q15_t)0x35D6, + (q15_t)0x740B, (q15_t)0x3604, (q15_t)0x73F6, (q15_t)0x3631, + (q15_t)0x73E0, (q15_t)0x365F, (q15_t)0x73CB, (q15_t)0x368C, + (q15_t)0x73B5, (q15_t)0x36BA, (q15_t)0x73A0, (q15_t)0x36E7, + (q15_t)0x738A, (q15_t)0x3714, (q15_t)0x7375, (q15_t)0x3742, + (q15_t)0x735F, (q15_t)0x376F, (q15_t)0x7349, (q15_t)0x379C, + (q15_t)0x7333, (q15_t)0x37CA, (q15_t)0x731D, (q15_t)0x37F7, + (q15_t)0x7307, (q15_t)0x3824, (q15_t)0x72F1, (q15_t)0x3851, + (q15_t)0x72DB, (q15_t)0x387E, (q15_t)0x72C5, (q15_t)0x38AB, + (q15_t)0x72AF, (q15_t)0x38D8, (q15_t)0x7298, (q15_t)0x3906, + (q15_t)0x7282, (q15_t)0x3932, (q15_t)0x726B, (q15_t)0x395F, + (q15_t)0x7255, (q15_t)0x398C, (q15_t)0x723E, (q15_t)0x39B9, + (q15_t)0x7227, (q15_t)0x39E6, (q15_t)0x7211, (q15_t)0x3A13, + (q15_t)0x71FA, (q15_t)0x3A40, (q15_t)0x71E3, (q15_t)0x3A6C, + (q15_t)0x71CC, (q15_t)0x3A99, (q15_t)0x71B5, (q15_t)0x3AC6, + (q15_t)0x719E, (q15_t)0x3AF2, (q15_t)0x7186, (q15_t)0x3B1F, + (q15_t)0x716F, (q15_t)0x3B4C, (q15_t)0x7158, (q15_t)0x3B78, + (q15_t)0x7141, (q15_t)0x3BA5, (q15_t)0x7129, (q15_t)0x3BD1, + (q15_t)0x7112, (q15_t)0x3BFD, (q15_t)0x70FA, (q15_t)0x3C2A, + (q15_t)0x70E2, (q15_t)0x3C56, (q15_t)0x70CB, (q15_t)0x3C83, + (q15_t)0x70B3, (q15_t)0x3CAF, (q15_t)0x709B, (q15_t)0x3CDB, + (q15_t)0x7083, (q15_t)0x3D07, (q15_t)0x706B, (q15_t)0x3D33, + (q15_t)0x7053, (q15_t)0x3D60, (q15_t)0x703B, (q15_t)0x3D8C, + (q15_t)0x7023, (q15_t)0x3DB8, (q15_t)0x700A, (q15_t)0x3DE4, + (q15_t)0x6FF2, (q15_t)0x3E10, (q15_t)0x6FDA, (q15_t)0x3E3C, + (q15_t)0x6FC1, (q15_t)0x3E68, (q15_t)0x6FA9, (q15_t)0x3E93, + (q15_t)0x6F90, (q15_t)0x3EBF, (q15_t)0x6F77, (q15_t)0x3EEB, + (q15_t)0x6F5F, (q15_t)0x3F17, (q15_t)0x6F46, (q15_t)0x3F43, + (q15_t)0x6F2D, (q15_t)0x3F6E, (q15_t)0x6F14, (q15_t)0x3F9A, + (q15_t)0x6EFB, (q15_t)0x3FC5, (q15_t)0x6EE2, (q15_t)0x3FF1, + (q15_t)0x6EC9, (q15_t)0x401D, (q15_t)0x6EAF, (q15_t)0x4048, + (q15_t)0x6E96, (q15_t)0x4073, (q15_t)0x6E7D, (q15_t)0x409F, + (q15_t)0x6E63, (q15_t)0x40CA, (q15_t)0x6E4A, (q15_t)0x40F6, + (q15_t)0x6E30, (q15_t)0x4121, (q15_t)0x6E17, (q15_t)0x414C, + (q15_t)0x6DFD, (q15_t)0x4177, (q15_t)0x6DE3, (q15_t)0x41A2, + (q15_t)0x6DCA, (q15_t)0x41CE, (q15_t)0x6DB0, (q15_t)0x41F9, + (q15_t)0x6D96, (q15_t)0x4224, (q15_t)0x6D7C, (q15_t)0x424F, + (q15_t)0x6D62, (q15_t)0x427A, (q15_t)0x6D48, (q15_t)0x42A5, + (q15_t)0x6D2D, (q15_t)0x42D0, (q15_t)0x6D13, (q15_t)0x42FA, + (q15_t)0x6CF9, (q15_t)0x4325, (q15_t)0x6CDE, (q15_t)0x4350, + (q15_t)0x6CC4, (q15_t)0x437B, (q15_t)0x6CA9, (q15_t)0x43A5, + (q15_t)0x6C8F, (q15_t)0x43D0, (q15_t)0x6C74, (q15_t)0x43FB, + (q15_t)0x6C59, (q15_t)0x4425, (q15_t)0x6C3F, (q15_t)0x4450, + (q15_t)0x6C24, (q15_t)0x447A, (q15_t)0x6C09, (q15_t)0x44A5, + (q15_t)0x6BEE, (q15_t)0x44CF, (q15_t)0x6BD3, (q15_t)0x44FA, + (q15_t)0x6BB8, (q15_t)0x4524, (q15_t)0x6B9C, (q15_t)0x454E, + (q15_t)0x6B81, (q15_t)0x4578, (q15_t)0x6B66, (q15_t)0x45A3, + (q15_t)0x6B4A, (q15_t)0x45CD, (q15_t)0x6B2F, (q15_t)0x45F7, + (q15_t)0x6B13, (q15_t)0x4621, (q15_t)0x6AF8, (q15_t)0x464B, + (q15_t)0x6ADC, (q15_t)0x4675, (q15_t)0x6AC1, (q15_t)0x469F, + (q15_t)0x6AA5, (q15_t)0x46C9, (q15_t)0x6A89, (q15_t)0x46F3, + (q15_t)0x6A6D, (q15_t)0x471C, (q15_t)0x6A51, (q15_t)0x4746, + (q15_t)0x6A35, (q15_t)0x4770, (q15_t)0x6A19, (q15_t)0x479A, + (q15_t)0x69FD, (q15_t)0x47C3, (q15_t)0x69E1, (q15_t)0x47ED, + (q15_t)0x69C4, (q15_t)0x4816, (q15_t)0x69A8, (q15_t)0x4840, + (q15_t)0x698C, (q15_t)0x4869, (q15_t)0x696F, (q15_t)0x4893, + (q15_t)0x6953, (q15_t)0x48BC, (q15_t)0x6936, (q15_t)0x48E6, + (q15_t)0x6919, (q15_t)0x490F, (q15_t)0x68FD, (q15_t)0x4938, + (q15_t)0x68E0, (q15_t)0x4961, (q15_t)0x68C3, (q15_t)0x498A, + (q15_t)0x68A6, (q15_t)0x49B4, (q15_t)0x6889, (q15_t)0x49DD, + (q15_t)0x686C, (q15_t)0x4A06, (q15_t)0x684F, (q15_t)0x4A2F, + (q15_t)0x6832, (q15_t)0x4A58, (q15_t)0x6815, (q15_t)0x4A81, + (q15_t)0x67F7, (q15_t)0x4AA9, (q15_t)0x67DA, (q15_t)0x4AD2, + (q15_t)0x67BD, (q15_t)0x4AFB, (q15_t)0x679F, (q15_t)0x4B24, + (q15_t)0x6782, (q15_t)0x4B4C, (q15_t)0x6764, (q15_t)0x4B75, + (q15_t)0x6746, (q15_t)0x4B9E, (q15_t)0x6729, (q15_t)0x4BC6, + (q15_t)0x670B, (q15_t)0x4BEF, (q15_t)0x66ED, (q15_t)0x4C17, + (q15_t)0x66CF, (q15_t)0x4C3F, (q15_t)0x66B1, (q15_t)0x4C68, + (q15_t)0x6693, (q15_t)0x4C90, (q15_t)0x6675, (q15_t)0x4CB8, + (q15_t)0x6657, (q15_t)0x4CE1, (q15_t)0x6639, (q15_t)0x4D09, + (q15_t)0x661A, (q15_t)0x4D31, (q15_t)0x65FC, (q15_t)0x4D59, + (q15_t)0x65DD, (q15_t)0x4D81, (q15_t)0x65BF, (q15_t)0x4DA9, + (q15_t)0x65A0, (q15_t)0x4DD1, (q15_t)0x6582, (q15_t)0x4DF9, + (q15_t)0x6563, (q15_t)0x4E21, (q15_t)0x6545, (q15_t)0x4E48, + (q15_t)0x6526, (q15_t)0x4E70, (q15_t)0x6507, (q15_t)0x4E98, + (q15_t)0x64E8, (q15_t)0x4EBF, (q15_t)0x64C9, (q15_t)0x4EE7, + (q15_t)0x64AA, (q15_t)0x4F0F, (q15_t)0x648B, (q15_t)0x4F36, + (q15_t)0x646C, (q15_t)0x4F5E, (q15_t)0x644D, (q15_t)0x4F85, + (q15_t)0x642D, (q15_t)0x4FAC, (q15_t)0x640E, (q15_t)0x4FD4, + (q15_t)0x63EF, (q15_t)0x4FFB, (q15_t)0x63CF, (q15_t)0x5022, + (q15_t)0x63B0, (q15_t)0x5049, (q15_t)0x6390, (q15_t)0x5070, + (q15_t)0x6371, (q15_t)0x5097, (q15_t)0x6351, (q15_t)0x50BF, + (q15_t)0x6331, (q15_t)0x50E5, (q15_t)0x6311, (q15_t)0x510C, + (q15_t)0x62F2, (q15_t)0x5133, (q15_t)0x62D2, (q15_t)0x515A, + (q15_t)0x62B2, (q15_t)0x5181, (q15_t)0x6292, (q15_t)0x51A8, + (q15_t)0x6271, (q15_t)0x51CE, (q15_t)0x6251, (q15_t)0x51F5, + (q15_t)0x6231, (q15_t)0x521C, (q15_t)0x6211, (q15_t)0x5242, + (q15_t)0x61F1, (q15_t)0x5269, (q15_t)0x61D0, (q15_t)0x528F, + (q15_t)0x61B0, (q15_t)0x52B5, (q15_t)0x618F, (q15_t)0x52DC, + (q15_t)0x616F, (q15_t)0x5302, (q15_t)0x614E, (q15_t)0x5328, + (q15_t)0x612D, (q15_t)0x534E, (q15_t)0x610D, (q15_t)0x5375, + (q15_t)0x60EC, (q15_t)0x539B, (q15_t)0x60CB, (q15_t)0x53C1, + (q15_t)0x60AA, (q15_t)0x53E7, (q15_t)0x6089, (q15_t)0x540D, + (q15_t)0x6068, (q15_t)0x5433, (q15_t)0x6047, (q15_t)0x5458, + (q15_t)0x6026, (q15_t)0x547E, (q15_t)0x6004, (q15_t)0x54A4, + (q15_t)0x5FE3, (q15_t)0x54CA, (q15_t)0x5FC2, (q15_t)0x54EF, + (q15_t)0x5FA0, (q15_t)0x5515, (q15_t)0x5F7F, (q15_t)0x553A, + (q15_t)0x5F5E, (q15_t)0x5560, (q15_t)0x5F3C, (q15_t)0x5585, + (q15_t)0x5F1A, (q15_t)0x55AB, (q15_t)0x5EF9, (q15_t)0x55D0, + (q15_t)0x5ED7, (q15_t)0x55F5, (q15_t)0x5EB5, (q15_t)0x561A, + (q15_t)0x5E93, (q15_t)0x5640, (q15_t)0x5E71, (q15_t)0x5665, + (q15_t)0x5E50, (q15_t)0x568A, (q15_t)0x5E2D, (q15_t)0x56AF, + (q15_t)0x5E0B, (q15_t)0x56D4, (q15_t)0x5DE9, (q15_t)0x56F9, + (q15_t)0x5DC7, (q15_t)0x571D, (q15_t)0x5DA5, (q15_t)0x5742, + (q15_t)0x5D83, (q15_t)0x5767, (q15_t)0x5D60, (q15_t)0x578C, + (q15_t)0x5D3E, (q15_t)0x57B0, (q15_t)0x5D1B, (q15_t)0x57D5, + (q15_t)0x5CF9, (q15_t)0x57F9, (q15_t)0x5CD6, (q15_t)0x581E, + (q15_t)0x5CB4, (q15_t)0x5842, (q15_t)0x5C91, (q15_t)0x5867, + (q15_t)0x5C6E, (q15_t)0x588B, (q15_t)0x5C4B, (q15_t)0x58AF, + (q15_t)0x5C29, (q15_t)0x58D4, (q15_t)0x5C06, (q15_t)0x58F8, + (q15_t)0x5BE3, (q15_t)0x591C, (q15_t)0x5BC0, (q15_t)0x5940, + (q15_t)0x5B9D, (q15_t)0x5964, (q15_t)0x5B79, (q15_t)0x5988, + (q15_t)0x5B56, (q15_t)0x59AC, (q15_t)0x5B33, (q15_t)0x59D0, + (q15_t)0x5B10, (q15_t)0x59F3, (q15_t)0x5AEC, (q15_t)0x5A17, + (q15_t)0x5AC9, (q15_t)0x5A3B, (q15_t)0x5AA5, (q15_t)0x5A5E, + (q15_t)0x5A82, (q15_t)0x5A82, (q15_t)0x5A5E, (q15_t)0x5AA5, + (q15_t)0x5A3B, (q15_t)0x5AC9, (q15_t)0x5A17, (q15_t)0x5AEC, + (q15_t)0x59F3, (q15_t)0x5B10, (q15_t)0x59D0, (q15_t)0x5B33, + (q15_t)0x59AC, (q15_t)0x5B56, (q15_t)0x5988, (q15_t)0x5B79, + (q15_t)0x5964, (q15_t)0x5B9D, (q15_t)0x5940, (q15_t)0x5BC0, + (q15_t)0x591C, (q15_t)0x5BE3, (q15_t)0x58F8, (q15_t)0x5C06, + (q15_t)0x58D4, (q15_t)0x5C29, (q15_t)0x58AF, (q15_t)0x5C4B, + (q15_t)0x588B, (q15_t)0x5C6E, (q15_t)0x5867, (q15_t)0x5C91, + (q15_t)0x5842, (q15_t)0x5CB4, (q15_t)0x581E, (q15_t)0x5CD6, + (q15_t)0x57F9, (q15_t)0x5CF9, (q15_t)0x57D5, (q15_t)0x5D1B, + (q15_t)0x57B0, (q15_t)0x5D3E, (q15_t)0x578C, (q15_t)0x5D60, + (q15_t)0x5767, (q15_t)0x5D83, (q15_t)0x5742, (q15_t)0x5DA5, + (q15_t)0x571D, (q15_t)0x5DC7, (q15_t)0x56F9, (q15_t)0x5DE9, + (q15_t)0x56D4, (q15_t)0x5E0B, (q15_t)0x56AF, (q15_t)0x5E2D, + (q15_t)0x568A, (q15_t)0x5E50, (q15_t)0x5665, (q15_t)0x5E71, + (q15_t)0x5640, (q15_t)0x5E93, (q15_t)0x561A, (q15_t)0x5EB5, + (q15_t)0x55F5, (q15_t)0x5ED7, (q15_t)0x55D0, (q15_t)0x5EF9, + (q15_t)0x55AB, (q15_t)0x5F1A, (q15_t)0x5585, (q15_t)0x5F3C, + (q15_t)0x5560, (q15_t)0x5F5E, (q15_t)0x553A, (q15_t)0x5F7F, + (q15_t)0x5515, (q15_t)0x5FA0, (q15_t)0x54EF, (q15_t)0x5FC2, + (q15_t)0x54CA, (q15_t)0x5FE3, (q15_t)0x54A4, (q15_t)0x6004, + (q15_t)0x547E, (q15_t)0x6026, (q15_t)0x5458, (q15_t)0x6047, + (q15_t)0x5433, (q15_t)0x6068, (q15_t)0x540D, (q15_t)0x6089, + (q15_t)0x53E7, (q15_t)0x60AA, (q15_t)0x53C1, (q15_t)0x60CB, + (q15_t)0x539B, (q15_t)0x60EC, (q15_t)0x5375, (q15_t)0x610D, + (q15_t)0x534E, (q15_t)0x612D, (q15_t)0x5328, (q15_t)0x614E, + (q15_t)0x5302, (q15_t)0x616F, (q15_t)0x52DC, (q15_t)0x618F, + (q15_t)0x52B5, (q15_t)0x61B0, (q15_t)0x528F, (q15_t)0x61D0, + (q15_t)0x5269, (q15_t)0x61F1, (q15_t)0x5242, (q15_t)0x6211, + (q15_t)0x521C, (q15_t)0x6231, (q15_t)0x51F5, (q15_t)0x6251, + (q15_t)0x51CE, (q15_t)0x6271, (q15_t)0x51A8, (q15_t)0x6292, + (q15_t)0x5181, (q15_t)0x62B2, (q15_t)0x515A, (q15_t)0x62D2, + (q15_t)0x5133, (q15_t)0x62F2, (q15_t)0x510C, (q15_t)0x6311, + (q15_t)0x50E5, (q15_t)0x6331, (q15_t)0x50BF, (q15_t)0x6351, + (q15_t)0x5097, (q15_t)0x6371, (q15_t)0x5070, (q15_t)0x6390, + (q15_t)0x5049, (q15_t)0x63B0, (q15_t)0x5022, (q15_t)0x63CF, + (q15_t)0x4FFB, (q15_t)0x63EF, (q15_t)0x4FD4, (q15_t)0x640E, + (q15_t)0x4FAC, (q15_t)0x642D, (q15_t)0x4F85, (q15_t)0x644D, + (q15_t)0x4F5E, (q15_t)0x646C, (q15_t)0x4F36, (q15_t)0x648B, + (q15_t)0x4F0F, (q15_t)0x64AA, (q15_t)0x4EE7, (q15_t)0x64C9, + (q15_t)0x4EBF, (q15_t)0x64E8, (q15_t)0x4E98, (q15_t)0x6507, + (q15_t)0x4E70, (q15_t)0x6526, (q15_t)0x4E48, (q15_t)0x6545, + (q15_t)0x4E21, (q15_t)0x6563, (q15_t)0x4DF9, (q15_t)0x6582, + (q15_t)0x4DD1, (q15_t)0x65A0, (q15_t)0x4DA9, (q15_t)0x65BF, + (q15_t)0x4D81, (q15_t)0x65DD, (q15_t)0x4D59, (q15_t)0x65FC, + (q15_t)0x4D31, (q15_t)0x661A, (q15_t)0x4D09, (q15_t)0x6639, + (q15_t)0x4CE1, (q15_t)0x6657, (q15_t)0x4CB8, (q15_t)0x6675, + (q15_t)0x4C90, (q15_t)0x6693, (q15_t)0x4C68, (q15_t)0x66B1, + (q15_t)0x4C3F, (q15_t)0x66CF, (q15_t)0x4C17, (q15_t)0x66ED, + (q15_t)0x4BEF, (q15_t)0x670B, (q15_t)0x4BC6, (q15_t)0x6729, + (q15_t)0x4B9E, (q15_t)0x6746, (q15_t)0x4B75, (q15_t)0x6764, + (q15_t)0x4B4C, (q15_t)0x6782, (q15_t)0x4B24, (q15_t)0x679F, + (q15_t)0x4AFB, (q15_t)0x67BD, (q15_t)0x4AD2, (q15_t)0x67DA, + (q15_t)0x4AA9, (q15_t)0x67F7, (q15_t)0x4A81, (q15_t)0x6815, + (q15_t)0x4A58, (q15_t)0x6832, (q15_t)0x4A2F, (q15_t)0x684F, + (q15_t)0x4A06, (q15_t)0x686C, (q15_t)0x49DD, (q15_t)0x6889, + (q15_t)0x49B4, (q15_t)0x68A6, (q15_t)0x498A, (q15_t)0x68C3, + (q15_t)0x4961, (q15_t)0x68E0, (q15_t)0x4938, (q15_t)0x68FD, + (q15_t)0x490F, (q15_t)0x6919, (q15_t)0x48E6, (q15_t)0x6936, + (q15_t)0x48BC, (q15_t)0x6953, (q15_t)0x4893, (q15_t)0x696F, + (q15_t)0x4869, (q15_t)0x698C, (q15_t)0x4840, (q15_t)0x69A8, + (q15_t)0x4816, (q15_t)0x69C4, (q15_t)0x47ED, (q15_t)0x69E1, + (q15_t)0x47C3, (q15_t)0x69FD, (q15_t)0x479A, (q15_t)0x6A19, + (q15_t)0x4770, (q15_t)0x6A35, (q15_t)0x4746, (q15_t)0x6A51, + (q15_t)0x471C, (q15_t)0x6A6D, (q15_t)0x46F3, (q15_t)0x6A89, + (q15_t)0x46C9, (q15_t)0x6AA5, (q15_t)0x469F, (q15_t)0x6AC1, + (q15_t)0x4675, (q15_t)0x6ADC, (q15_t)0x464B, (q15_t)0x6AF8, + (q15_t)0x4621, (q15_t)0x6B13, (q15_t)0x45F7, (q15_t)0x6B2F, + (q15_t)0x45CD, (q15_t)0x6B4A, (q15_t)0x45A3, (q15_t)0x6B66, + (q15_t)0x4578, (q15_t)0x6B81, (q15_t)0x454E, (q15_t)0x6B9C, + (q15_t)0x4524, (q15_t)0x6BB8, (q15_t)0x44FA, (q15_t)0x6BD3, + (q15_t)0x44CF, (q15_t)0x6BEE, (q15_t)0x44A5, (q15_t)0x6C09, + (q15_t)0x447A, (q15_t)0x6C24, (q15_t)0x4450, (q15_t)0x6C3F, + (q15_t)0x4425, (q15_t)0x6C59, (q15_t)0x43FB, (q15_t)0x6C74, + (q15_t)0x43D0, (q15_t)0x6C8F, (q15_t)0x43A5, (q15_t)0x6CA9, + (q15_t)0x437B, (q15_t)0x6CC4, (q15_t)0x4350, (q15_t)0x6CDE, + (q15_t)0x4325, (q15_t)0x6CF9, (q15_t)0x42FA, (q15_t)0x6D13, + (q15_t)0x42D0, (q15_t)0x6D2D, (q15_t)0x42A5, (q15_t)0x6D48, + (q15_t)0x427A, (q15_t)0x6D62, (q15_t)0x424F, (q15_t)0x6D7C, + (q15_t)0x4224, (q15_t)0x6D96, (q15_t)0x41F9, (q15_t)0x6DB0, + (q15_t)0x41CE, (q15_t)0x6DCA, (q15_t)0x41A2, (q15_t)0x6DE3, + (q15_t)0x4177, (q15_t)0x6DFD, (q15_t)0x414C, (q15_t)0x6E17, + (q15_t)0x4121, (q15_t)0x6E30, (q15_t)0x40F6, (q15_t)0x6E4A, + (q15_t)0x40CA, (q15_t)0x6E63, (q15_t)0x409F, (q15_t)0x6E7D, + (q15_t)0x4073, (q15_t)0x6E96, (q15_t)0x4048, (q15_t)0x6EAF, + (q15_t)0x401D, (q15_t)0x6EC9, (q15_t)0x3FF1, (q15_t)0x6EE2, + (q15_t)0x3FC5, (q15_t)0x6EFB, (q15_t)0x3F9A, (q15_t)0x6F14, + (q15_t)0x3F6E, (q15_t)0x6F2D, (q15_t)0x3F43, (q15_t)0x6F46, + (q15_t)0x3F17, (q15_t)0x6F5F, (q15_t)0x3EEB, (q15_t)0x6F77, + (q15_t)0x3EBF, (q15_t)0x6F90, (q15_t)0x3E93, (q15_t)0x6FA9, + (q15_t)0x3E68, (q15_t)0x6FC1, (q15_t)0x3E3C, (q15_t)0x6FDA, + (q15_t)0x3E10, (q15_t)0x6FF2, (q15_t)0x3DE4, (q15_t)0x700A, + (q15_t)0x3DB8, (q15_t)0x7023, (q15_t)0x3D8C, (q15_t)0x703B, + (q15_t)0x3D60, (q15_t)0x7053, (q15_t)0x3D33, (q15_t)0x706B, + (q15_t)0x3D07, (q15_t)0x7083, (q15_t)0x3CDB, (q15_t)0x709B, + (q15_t)0x3CAF, (q15_t)0x70B3, (q15_t)0x3C83, (q15_t)0x70CB, + (q15_t)0x3C56, (q15_t)0x70E2, (q15_t)0x3C2A, (q15_t)0x70FA, + (q15_t)0x3BFD, (q15_t)0x7112, (q15_t)0x3BD1, (q15_t)0x7129, + (q15_t)0x3BA5, (q15_t)0x7141, (q15_t)0x3B78, (q15_t)0x7158, + (q15_t)0x3B4C, (q15_t)0x716F, (q15_t)0x3B1F, (q15_t)0x7186, + (q15_t)0x3AF2, (q15_t)0x719E, (q15_t)0x3AC6, (q15_t)0x71B5, + (q15_t)0x3A99, (q15_t)0x71CC, (q15_t)0x3A6C, (q15_t)0x71E3, + (q15_t)0x3A40, (q15_t)0x71FA, (q15_t)0x3A13, (q15_t)0x7211, + (q15_t)0x39E6, (q15_t)0x7227, (q15_t)0x39B9, (q15_t)0x723E, + (q15_t)0x398C, (q15_t)0x7255, (q15_t)0x395F, (q15_t)0x726B, + (q15_t)0x3932, (q15_t)0x7282, (q15_t)0x3906, (q15_t)0x7298, + (q15_t)0x38D8, (q15_t)0x72AF, (q15_t)0x38AB, (q15_t)0x72C5, + (q15_t)0x387E, (q15_t)0x72DB, (q15_t)0x3851, (q15_t)0x72F1, + (q15_t)0x3824, (q15_t)0x7307, (q15_t)0x37F7, (q15_t)0x731D, + (q15_t)0x37CA, (q15_t)0x7333, (q15_t)0x379C, (q15_t)0x7349, + (q15_t)0x376F, (q15_t)0x735F, (q15_t)0x3742, (q15_t)0x7375, + (q15_t)0x3714, (q15_t)0x738A, (q15_t)0x36E7, (q15_t)0x73A0, + (q15_t)0x36BA, (q15_t)0x73B5, (q15_t)0x368C, (q15_t)0x73CB, + (q15_t)0x365F, (q15_t)0x73E0, (q15_t)0x3631, (q15_t)0x73F6, + (q15_t)0x3604, (q15_t)0x740B, (q15_t)0x35D6, (q15_t)0x7420, + (q15_t)0x35A8, (q15_t)0x7435, (q15_t)0x357B, (q15_t)0x744A, + (q15_t)0x354D, (q15_t)0x745F, (q15_t)0x351F, (q15_t)0x7474, + (q15_t)0x34F2, (q15_t)0x7489, (q15_t)0x34C4, (q15_t)0x749E, + (q15_t)0x3496, (q15_t)0x74B2, (q15_t)0x3468, (q15_t)0x74C7, + (q15_t)0x343A, (q15_t)0x74DB, (q15_t)0x340C, (q15_t)0x74F0, + (q15_t)0x33DE, (q15_t)0x7504, (q15_t)0x33B0, (q15_t)0x7519, + (q15_t)0x3382, (q15_t)0x752D, (q15_t)0x3354, (q15_t)0x7541, + (q15_t)0x3326, (q15_t)0x7555, (q15_t)0x32F8, (q15_t)0x7569, + (q15_t)0x32CA, (q15_t)0x757D, (q15_t)0x329C, (q15_t)0x7591, + (q15_t)0x326E, (q15_t)0x75A5, (q15_t)0x3240, (q15_t)0x75B9, + (q15_t)0x3211, (q15_t)0x75CC, (q15_t)0x31E3, (q15_t)0x75E0, + (q15_t)0x31B5, (q15_t)0x75F4, (q15_t)0x3186, (q15_t)0x7607, + (q15_t)0x3158, (q15_t)0x761B, (q15_t)0x312A, (q15_t)0x762E, + (q15_t)0x30FB, (q15_t)0x7641, (q15_t)0x30CD, (q15_t)0x7654, + (q15_t)0x309E, (q15_t)0x7668, (q15_t)0x3070, (q15_t)0x767B, + (q15_t)0x3041, (q15_t)0x768E, (q15_t)0x3013, (q15_t)0x76A0, + (q15_t)0x2FE4, (q15_t)0x76B3, (q15_t)0x2FB5, (q15_t)0x76C6, + (q15_t)0x2F87, (q15_t)0x76D9, (q15_t)0x2F58, (q15_t)0x76EB, + (q15_t)0x2F29, (q15_t)0x76FE, (q15_t)0x2EFB, (q15_t)0x7710, + (q15_t)0x2ECC, (q15_t)0x7723, (q15_t)0x2E9D, (q15_t)0x7735, + (q15_t)0x2E6E, (q15_t)0x7747, (q15_t)0x2E3F, (q15_t)0x775A, + (q15_t)0x2E11, (q15_t)0x776C, (q15_t)0x2DE2, (q15_t)0x777E, + (q15_t)0x2DB3, (q15_t)0x7790, (q15_t)0x2D84, (q15_t)0x77A2, + (q15_t)0x2D55, (q15_t)0x77B4, (q15_t)0x2D26, (q15_t)0x77C5, + (q15_t)0x2CF7, (q15_t)0x77D7, (q15_t)0x2CC8, (q15_t)0x77E9, + (q15_t)0x2C98, (q15_t)0x77FA, (q15_t)0x2C69, (q15_t)0x780C, + (q15_t)0x2C3A, (q15_t)0x781D, (q15_t)0x2C0B, (q15_t)0x782E, + (q15_t)0x2BDC, (q15_t)0x7840, (q15_t)0x2BAD, (q15_t)0x7851, + (q15_t)0x2B7D, (q15_t)0x7862, (q15_t)0x2B4E, (q15_t)0x7873, + (q15_t)0x2B1F, (q15_t)0x7884, (q15_t)0x2AEF, (q15_t)0x7895, + (q15_t)0x2AC0, (q15_t)0x78A6, (q15_t)0x2A91, (q15_t)0x78B6, + (q15_t)0x2A61, (q15_t)0x78C7, (q15_t)0x2A32, (q15_t)0x78D8, + (q15_t)0x2A02, (q15_t)0x78E8, (q15_t)0x29D3, (q15_t)0x78F9, + (q15_t)0x29A3, (q15_t)0x7909, (q15_t)0x2974, (q15_t)0x7919, + (q15_t)0x2944, (q15_t)0x792A, (q15_t)0x2915, (q15_t)0x793A, + (q15_t)0x28E5, (q15_t)0x794A, (q15_t)0x28B5, (q15_t)0x795A, + (q15_t)0x2886, (q15_t)0x796A, (q15_t)0x2856, (q15_t)0x797A, + (q15_t)0x2826, (q15_t)0x798A, (q15_t)0x27F6, (q15_t)0x7999, + (q15_t)0x27C7, (q15_t)0x79A9, (q15_t)0x2797, (q15_t)0x79B9, + (q15_t)0x2767, (q15_t)0x79C8, (q15_t)0x2737, (q15_t)0x79D8, + (q15_t)0x2707, (q15_t)0x79E7, (q15_t)0x26D8, (q15_t)0x79F6, + (q15_t)0x26A8, (q15_t)0x7A05, (q15_t)0x2678, (q15_t)0x7A15, + (q15_t)0x2648, (q15_t)0x7A24, (q15_t)0x2618, (q15_t)0x7A33, + (q15_t)0x25E8, (q15_t)0x7A42, (q15_t)0x25B8, (q15_t)0x7A50, + (q15_t)0x2588, (q15_t)0x7A5F, (q15_t)0x2558, (q15_t)0x7A6E, + (q15_t)0x2528, (q15_t)0x7A7D, (q15_t)0x24F7, (q15_t)0x7A8B, + (q15_t)0x24C7, (q15_t)0x7A9A, (q15_t)0x2497, (q15_t)0x7AA8, + (q15_t)0x2467, (q15_t)0x7AB6, (q15_t)0x2437, (q15_t)0x7AC5, + (q15_t)0x2407, (q15_t)0x7AD3, (q15_t)0x23D6, (q15_t)0x7AE1, + (q15_t)0x23A6, (q15_t)0x7AEF, (q15_t)0x2376, (q15_t)0x7AFD, + (q15_t)0x2345, (q15_t)0x7B0B, (q15_t)0x2315, (q15_t)0x7B19, + (q15_t)0x22E5, (q15_t)0x7B26, (q15_t)0x22B4, (q15_t)0x7B34, + (q15_t)0x2284, (q15_t)0x7B42, (q15_t)0x2254, (q15_t)0x7B4F, + (q15_t)0x2223, (q15_t)0x7B5D, (q15_t)0x21F3, (q15_t)0x7B6A, + (q15_t)0x21C2, (q15_t)0x7B77, (q15_t)0x2192, (q15_t)0x7B84, + (q15_t)0x2161, (q15_t)0x7B92, (q15_t)0x2131, (q15_t)0x7B9F, + (q15_t)0x2100, (q15_t)0x7BAC, (q15_t)0x20D0, (q15_t)0x7BB9, + (q15_t)0x209F, (q15_t)0x7BC5, (q15_t)0x206E, (q15_t)0x7BD2, + (q15_t)0x203E, (q15_t)0x7BDF, (q15_t)0x200D, (q15_t)0x7BEB, + (q15_t)0x1FDC, (q15_t)0x7BF8, (q15_t)0x1FAC, (q15_t)0x7C05, + (q15_t)0x1F7B, (q15_t)0x7C11, (q15_t)0x1F4A, (q15_t)0x7C1D, + (q15_t)0x1F19, (q15_t)0x7C29, (q15_t)0x1EE9, (q15_t)0x7C36, + (q15_t)0x1EB8, (q15_t)0x7C42, (q15_t)0x1E87, (q15_t)0x7C4E, + (q15_t)0x1E56, (q15_t)0x7C5A, (q15_t)0x1E25, (q15_t)0x7C66, + (q15_t)0x1DF5, (q15_t)0x7C71, (q15_t)0x1DC4, (q15_t)0x7C7D, + (q15_t)0x1D93, (q15_t)0x7C89, (q15_t)0x1D62, (q15_t)0x7C94, + (q15_t)0x1D31, (q15_t)0x7CA0, (q15_t)0x1D00, (q15_t)0x7CAB, + (q15_t)0x1CCF, (q15_t)0x7CB7, (q15_t)0x1C9E, (q15_t)0x7CC2, + (q15_t)0x1C6D, (q15_t)0x7CCD, (q15_t)0x1C3C, (q15_t)0x7CD8, + (q15_t)0x1C0B, (q15_t)0x7CE3, (q15_t)0x1BDA, (q15_t)0x7CEE, + (q15_t)0x1BA9, (q15_t)0x7CF9, (q15_t)0x1B78, (q15_t)0x7D04, + (q15_t)0x1B47, (q15_t)0x7D0F, (q15_t)0x1B16, (q15_t)0x7D19, + (q15_t)0x1AE4, (q15_t)0x7D24, (q15_t)0x1AB3, (q15_t)0x7D2F, + (q15_t)0x1A82, (q15_t)0x7D39, (q15_t)0x1A51, (q15_t)0x7D43, + (q15_t)0x1A20, (q15_t)0x7D4E, (q15_t)0x19EF, (q15_t)0x7D58, + (q15_t)0x19BD, (q15_t)0x7D62, (q15_t)0x198C, (q15_t)0x7D6C, + (q15_t)0x195B, (q15_t)0x7D76, (q15_t)0x192A, (q15_t)0x7D80, + (q15_t)0x18F8, (q15_t)0x7D8A, (q15_t)0x18C7, (q15_t)0x7D94, + (q15_t)0x1896, (q15_t)0x7D9D, (q15_t)0x1864, (q15_t)0x7DA7, + (q15_t)0x1833, (q15_t)0x7DB0, (q15_t)0x1802, (q15_t)0x7DBA, + (q15_t)0x17D0, (q15_t)0x7DC3, (q15_t)0x179F, (q15_t)0x7DCD, + (q15_t)0x176D, (q15_t)0x7DD6, (q15_t)0x173C, (q15_t)0x7DDF, + (q15_t)0x170A, (q15_t)0x7DE8, (q15_t)0x16D9, (q15_t)0x7DF1, + (q15_t)0x16A8, (q15_t)0x7DFA, (q15_t)0x1676, (q15_t)0x7E03, + (q15_t)0x1645, (q15_t)0x7E0C, (q15_t)0x1613, (q15_t)0x7E14, + (q15_t)0x15E2, (q15_t)0x7E1D, (q15_t)0x15B0, (q15_t)0x7E26, + (q15_t)0x157F, (q15_t)0x7E2E, (q15_t)0x154D, (q15_t)0x7E37, + (q15_t)0x151B, (q15_t)0x7E3F, (q15_t)0x14EA, (q15_t)0x7E47, + (q15_t)0x14B8, (q15_t)0x7E4F, (q15_t)0x1487, (q15_t)0x7E57, + (q15_t)0x1455, (q15_t)0x7E5F, (q15_t)0x1423, (q15_t)0x7E67, + (q15_t)0x13F2, (q15_t)0x7E6F, (q15_t)0x13C0, (q15_t)0x7E77, + (q15_t)0x138E, (q15_t)0x7E7F, (q15_t)0x135D, (q15_t)0x7E86, + (q15_t)0x132B, (q15_t)0x7E8E, (q15_t)0x12F9, (q15_t)0x7E95, + (q15_t)0x12C8, (q15_t)0x7E9D, (q15_t)0x1296, (q15_t)0x7EA4, + (q15_t)0x1264, (q15_t)0x7EAB, (q15_t)0x1232, (q15_t)0x7EB3, + (q15_t)0x1201, (q15_t)0x7EBA, (q15_t)0x11CF, (q15_t)0x7EC1, + (q15_t)0x119D, (q15_t)0x7EC8, (q15_t)0x116B, (q15_t)0x7ECF, + (q15_t)0x1139, (q15_t)0x7ED5, (q15_t)0x1108, (q15_t)0x7EDC, + (q15_t)0x10D6, (q15_t)0x7EE3, (q15_t)0x10A4, (q15_t)0x7EE9, + (q15_t)0x1072, (q15_t)0x7EF0, (q15_t)0x1040, (q15_t)0x7EF6, + (q15_t)0x100E, (q15_t)0x7EFD, (q15_t)0x0FDD, (q15_t)0x7F03, + (q15_t)0x0FAB, (q15_t)0x7F09, (q15_t)0x0F79, (q15_t)0x7F0F, + (q15_t)0x0F47, (q15_t)0x7F15, (q15_t)0x0F15, (q15_t)0x7F1B, + (q15_t)0x0EE3, (q15_t)0x7F21, (q15_t)0x0EB1, (q15_t)0x7F27, + (q15_t)0x0E7F, (q15_t)0x7F2D, (q15_t)0x0E4D, (q15_t)0x7F32, + (q15_t)0x0E1B, (q15_t)0x7F38, (q15_t)0x0DE9, (q15_t)0x7F3D, + (q15_t)0x0DB7, (q15_t)0x7F43, (q15_t)0x0D85, (q15_t)0x7F48, + (q15_t)0x0D53, (q15_t)0x7F4D, (q15_t)0x0D21, (q15_t)0x7F53, + (q15_t)0x0CEF, (q15_t)0x7F58, (q15_t)0x0CBD, (q15_t)0x7F5D, + (q15_t)0x0C8B, (q15_t)0x7F62, (q15_t)0x0C59, (q15_t)0x7F67, + (q15_t)0x0C27, (q15_t)0x7F6B, (q15_t)0x0BF5, (q15_t)0x7F70, + (q15_t)0x0BC3, (q15_t)0x7F75, (q15_t)0x0B91, (q15_t)0x7F79, + (q15_t)0x0B5F, (q15_t)0x7F7E, (q15_t)0x0B2D, (q15_t)0x7F82, + (q15_t)0x0AFB, (q15_t)0x7F87, (q15_t)0x0AC9, (q15_t)0x7F8B, + (q15_t)0x0A97, (q15_t)0x7F8F, (q15_t)0x0A65, (q15_t)0x7F93, + (q15_t)0x0A33, (q15_t)0x7F97, (q15_t)0x0A00, (q15_t)0x7F9B, + (q15_t)0x09CE, (q15_t)0x7F9F, (q15_t)0x099C, (q15_t)0x7FA3, + (q15_t)0x096A, (q15_t)0x7FA7, (q15_t)0x0938, (q15_t)0x7FAA, + (q15_t)0x0906, (q15_t)0x7FAE, (q15_t)0x08D4, (q15_t)0x7FB1, + (q15_t)0x08A2, (q15_t)0x7FB5, (q15_t)0x086F, (q15_t)0x7FB8, + (q15_t)0x083D, (q15_t)0x7FBC, (q15_t)0x080B, (q15_t)0x7FBF, + (q15_t)0x07D9, (q15_t)0x7FC2, (q15_t)0x07A7, (q15_t)0x7FC5, + (q15_t)0x0775, (q15_t)0x7FC8, (q15_t)0x0742, (q15_t)0x7FCB, + (q15_t)0x0710, (q15_t)0x7FCE, (q15_t)0x06DE, (q15_t)0x7FD0, + (q15_t)0x06AC, (q15_t)0x7FD3, (q15_t)0x067A, (q15_t)0x7FD6, + (q15_t)0x0647, (q15_t)0x7FD8, (q15_t)0x0615, (q15_t)0x7FDA, + (q15_t)0x05E3, (q15_t)0x7FDD, (q15_t)0x05B1, (q15_t)0x7FDF, + (q15_t)0x057F, (q15_t)0x7FE1, (q15_t)0x054C, (q15_t)0x7FE3, + (q15_t)0x051A, (q15_t)0x7FE5, (q15_t)0x04E8, (q15_t)0x7FE7, + (q15_t)0x04B6, (q15_t)0x7FE9, (q15_t)0x0483, (q15_t)0x7FEB, + (q15_t)0x0451, (q15_t)0x7FED, (q15_t)0x041F, (q15_t)0x7FEE, + (q15_t)0x03ED, (q15_t)0x7FF0, (q15_t)0x03BA, (q15_t)0x7FF2, + (q15_t)0x0388, (q15_t)0x7FF3, (q15_t)0x0356, (q15_t)0x7FF4, + (q15_t)0x0324, (q15_t)0x7FF6, (q15_t)0x02F1, (q15_t)0x7FF7, + (q15_t)0x02BF, (q15_t)0x7FF8, (q15_t)0x028D, (q15_t)0x7FF9, + (q15_t)0x025B, (q15_t)0x7FFA, (q15_t)0x0228, (q15_t)0x7FFB, + (q15_t)0x01F6, (q15_t)0x7FFC, (q15_t)0x01C4, (q15_t)0x7FFC, + (q15_t)0x0192, (q15_t)0x7FFD, (q15_t)0x015F, (q15_t)0x7FFE, + (q15_t)0x012D, (q15_t)0x7FFE, (q15_t)0x00FB, (q15_t)0x7FFF, + (q15_t)0x00C9, (q15_t)0x7FFF, (q15_t)0x0096, (q15_t)0x7FFF, + (q15_t)0x0064, (q15_t)0x7FFF, (q15_t)0x0032, (q15_t)0x7FFF, + (q15_t)0x0000, (q15_t)0x7FFF, (q15_t)0xFFCD, (q15_t)0x7FFF, + (q15_t)0xFF9B, (q15_t)0x7FFF, (q15_t)0xFF69, (q15_t)0x7FFF, + (q15_t)0xFF36, (q15_t)0x7FFF, (q15_t)0xFF04, (q15_t)0x7FFF, + (q15_t)0xFED2, (q15_t)0x7FFE, (q15_t)0xFEA0, (q15_t)0x7FFE, + (q15_t)0xFE6D, (q15_t)0x7FFD, (q15_t)0xFE3B, (q15_t)0x7FFC, + (q15_t)0xFE09, (q15_t)0x7FFC, (q15_t)0xFDD7, (q15_t)0x7FFB, + (q15_t)0xFDA4, (q15_t)0x7FFA, (q15_t)0xFD72, (q15_t)0x7FF9, + (q15_t)0xFD40, (q15_t)0x7FF8, (q15_t)0xFD0E, (q15_t)0x7FF7, + (q15_t)0xFCDB, (q15_t)0x7FF6, (q15_t)0xFCA9, (q15_t)0x7FF4, + (q15_t)0xFC77, (q15_t)0x7FF3, (q15_t)0xFC45, (q15_t)0x7FF2, + (q15_t)0xFC12, (q15_t)0x7FF0, (q15_t)0xFBE0, (q15_t)0x7FEE, + (q15_t)0xFBAE, (q15_t)0x7FED, (q15_t)0xFB7C, (q15_t)0x7FEB, + (q15_t)0xFB49, (q15_t)0x7FE9, (q15_t)0xFB17, (q15_t)0x7FE7, + (q15_t)0xFAE5, (q15_t)0x7FE5, (q15_t)0xFAB3, (q15_t)0x7FE3, + (q15_t)0xFA80, (q15_t)0x7FE1, (q15_t)0xFA4E, (q15_t)0x7FDF, + (q15_t)0xFA1C, (q15_t)0x7FDD, (q15_t)0xF9EA, (q15_t)0x7FDA, + (q15_t)0xF9B8, (q15_t)0x7FD8, (q15_t)0xF985, (q15_t)0x7FD6, + (q15_t)0xF953, (q15_t)0x7FD3, (q15_t)0xF921, (q15_t)0x7FD0, + (q15_t)0xF8EF, (q15_t)0x7FCE, (q15_t)0xF8BD, (q15_t)0x7FCB, + (q15_t)0xF88A, (q15_t)0x7FC8, (q15_t)0xF858, (q15_t)0x7FC5, + (q15_t)0xF826, (q15_t)0x7FC2, (q15_t)0xF7F4, (q15_t)0x7FBF, + (q15_t)0xF7C2, (q15_t)0x7FBC, (q15_t)0xF790, (q15_t)0x7FB8, + (q15_t)0xF75D, (q15_t)0x7FB5, (q15_t)0xF72B, (q15_t)0x7FB1, + (q15_t)0xF6F9, (q15_t)0x7FAE, (q15_t)0xF6C7, (q15_t)0x7FAA, + (q15_t)0xF695, (q15_t)0x7FA7, (q15_t)0xF663, (q15_t)0x7FA3, + (q15_t)0xF631, (q15_t)0x7F9F, (q15_t)0xF5FF, (q15_t)0x7F9B, + (q15_t)0xF5CC, (q15_t)0x7F97, (q15_t)0xF59A, (q15_t)0x7F93, + (q15_t)0xF568, (q15_t)0x7F8F, (q15_t)0xF536, (q15_t)0x7F8B, + (q15_t)0xF504, (q15_t)0x7F87, (q15_t)0xF4D2, (q15_t)0x7F82, + (q15_t)0xF4A0, (q15_t)0x7F7E, (q15_t)0xF46E, (q15_t)0x7F79, + (q15_t)0xF43C, (q15_t)0x7F75, (q15_t)0xF40A, (q15_t)0x7F70, + (q15_t)0xF3D8, (q15_t)0x7F6B, (q15_t)0xF3A6, (q15_t)0x7F67, + (q15_t)0xF374, (q15_t)0x7F62, (q15_t)0xF342, (q15_t)0x7F5D, + (q15_t)0xF310, (q15_t)0x7F58, (q15_t)0xF2DE, (q15_t)0x7F53, + (q15_t)0xF2AC, (q15_t)0x7F4D, (q15_t)0xF27A, (q15_t)0x7F48, + (q15_t)0xF248, (q15_t)0x7F43, (q15_t)0xF216, (q15_t)0x7F3D, + (q15_t)0xF1E4, (q15_t)0x7F38, (q15_t)0xF1B2, (q15_t)0x7F32, + (q15_t)0xF180, (q15_t)0x7F2D, (q15_t)0xF14E, (q15_t)0x7F27, + (q15_t)0xF11C, (q15_t)0x7F21, (q15_t)0xF0EA, (q15_t)0x7F1B, + (q15_t)0xF0B8, (q15_t)0x7F15, (q15_t)0xF086, (q15_t)0x7F0F, + (q15_t)0xF054, (q15_t)0x7F09, (q15_t)0xF022, (q15_t)0x7F03, + (q15_t)0xEFF1, (q15_t)0x7EFD, (q15_t)0xEFBF, (q15_t)0x7EF6, + (q15_t)0xEF8D, (q15_t)0x7EF0, (q15_t)0xEF5B, (q15_t)0x7EE9, + (q15_t)0xEF29, (q15_t)0x7EE3, (q15_t)0xEEF7, (q15_t)0x7EDC, + (q15_t)0xEEC6, (q15_t)0x7ED5, (q15_t)0xEE94, (q15_t)0x7ECF, + (q15_t)0xEE62, (q15_t)0x7EC8, (q15_t)0xEE30, (q15_t)0x7EC1, + (q15_t)0xEDFE, (q15_t)0x7EBA, (q15_t)0xEDCD, (q15_t)0x7EB3, + (q15_t)0xED9B, (q15_t)0x7EAB, (q15_t)0xED69, (q15_t)0x7EA4, + (q15_t)0xED37, (q15_t)0x7E9D, (q15_t)0xED06, (q15_t)0x7E95, + (q15_t)0xECD4, (q15_t)0x7E8E, (q15_t)0xECA2, (q15_t)0x7E86, + (q15_t)0xEC71, (q15_t)0x7E7F, (q15_t)0xEC3F, (q15_t)0x7E77, + (q15_t)0xEC0D, (q15_t)0x7E6F, (q15_t)0xEBDC, (q15_t)0x7E67, + (q15_t)0xEBAA, (q15_t)0x7E5F, (q15_t)0xEB78, (q15_t)0x7E57, + (q15_t)0xEB47, (q15_t)0x7E4F, (q15_t)0xEB15, (q15_t)0x7E47, + (q15_t)0xEAE4, (q15_t)0x7E3F, (q15_t)0xEAB2, (q15_t)0x7E37, + (q15_t)0xEA80, (q15_t)0x7E2E, (q15_t)0xEA4F, (q15_t)0x7E26, + (q15_t)0xEA1D, (q15_t)0x7E1D, (q15_t)0xE9EC, (q15_t)0x7E14, + (q15_t)0xE9BA, (q15_t)0x7E0C, (q15_t)0xE989, (q15_t)0x7E03, + (q15_t)0xE957, (q15_t)0x7DFA, (q15_t)0xE926, (q15_t)0x7DF1, + (q15_t)0xE8F5, (q15_t)0x7DE8, (q15_t)0xE8C3, (q15_t)0x7DDF, + (q15_t)0xE892, (q15_t)0x7DD6, (q15_t)0xE860, (q15_t)0x7DCD, + (q15_t)0xE82F, (q15_t)0x7DC3, (q15_t)0xE7FD, (q15_t)0x7DBA, + (q15_t)0xE7CC, (q15_t)0x7DB0, (q15_t)0xE79B, (q15_t)0x7DA7, + (q15_t)0xE769, (q15_t)0x7D9D, (q15_t)0xE738, (q15_t)0x7D94, + (q15_t)0xE707, (q15_t)0x7D8A, (q15_t)0xE6D5, (q15_t)0x7D80, + (q15_t)0xE6A4, (q15_t)0x7D76, (q15_t)0xE673, (q15_t)0x7D6C, + (q15_t)0xE642, (q15_t)0x7D62, (q15_t)0xE610, (q15_t)0x7D58, + (q15_t)0xE5DF, (q15_t)0x7D4E, (q15_t)0xE5AE, (q15_t)0x7D43, + (q15_t)0xE57D, (q15_t)0x7D39, (q15_t)0xE54C, (q15_t)0x7D2F, + (q15_t)0xE51B, (q15_t)0x7D24, (q15_t)0xE4E9, (q15_t)0x7D19, + (q15_t)0xE4B8, (q15_t)0x7D0F, (q15_t)0xE487, (q15_t)0x7D04, + (q15_t)0xE456, (q15_t)0x7CF9, (q15_t)0xE425, (q15_t)0x7CEE, + (q15_t)0xE3F4, (q15_t)0x7CE3, (q15_t)0xE3C3, (q15_t)0x7CD8, + (q15_t)0xE392, (q15_t)0x7CCD, (q15_t)0xE361, (q15_t)0x7CC2, + (q15_t)0xE330, (q15_t)0x7CB7, (q15_t)0xE2FF, (q15_t)0x7CAB, + (q15_t)0xE2CE, (q15_t)0x7CA0, (q15_t)0xE29D, (q15_t)0x7C94, + (q15_t)0xE26C, (q15_t)0x7C89, (q15_t)0xE23B, (q15_t)0x7C7D, + (q15_t)0xE20A, (q15_t)0x7C71, (q15_t)0xE1DA, (q15_t)0x7C66, + (q15_t)0xE1A9, (q15_t)0x7C5A, (q15_t)0xE178, (q15_t)0x7C4E, + (q15_t)0xE147, (q15_t)0x7C42, (q15_t)0xE116, (q15_t)0x7C36, + (q15_t)0xE0E6, (q15_t)0x7C29, (q15_t)0xE0B5, (q15_t)0x7C1D, + (q15_t)0xE084, (q15_t)0x7C11, (q15_t)0xE053, (q15_t)0x7C05, + (q15_t)0xE023, (q15_t)0x7BF8, (q15_t)0xDFF2, (q15_t)0x7BEB, + (q15_t)0xDFC1, (q15_t)0x7BDF, (q15_t)0xDF91, (q15_t)0x7BD2, + (q15_t)0xDF60, (q15_t)0x7BC5, (q15_t)0xDF2F, (q15_t)0x7BB9, + (q15_t)0xDEFF, (q15_t)0x7BAC, (q15_t)0xDECE, (q15_t)0x7B9F, + (q15_t)0xDE9E, (q15_t)0x7B92, (q15_t)0xDE6D, (q15_t)0x7B84, + (q15_t)0xDE3D, (q15_t)0x7B77, (q15_t)0xDE0C, (q15_t)0x7B6A, + (q15_t)0xDDDC, (q15_t)0x7B5D, (q15_t)0xDDAB, (q15_t)0x7B4F, + (q15_t)0xDD7B, (q15_t)0x7B42, (q15_t)0xDD4B, (q15_t)0x7B34, + (q15_t)0xDD1A, (q15_t)0x7B26, (q15_t)0xDCEA, (q15_t)0x7B19, + (q15_t)0xDCBA, (q15_t)0x7B0B, (q15_t)0xDC89, (q15_t)0x7AFD, + (q15_t)0xDC59, (q15_t)0x7AEF, (q15_t)0xDC29, (q15_t)0x7AE1, + (q15_t)0xDBF8, (q15_t)0x7AD3, (q15_t)0xDBC8, (q15_t)0x7AC5, + (q15_t)0xDB98, (q15_t)0x7AB6, (q15_t)0xDB68, (q15_t)0x7AA8, + (q15_t)0xDB38, (q15_t)0x7A9A, (q15_t)0xDB08, (q15_t)0x7A8B, + (q15_t)0xDAD7, (q15_t)0x7A7D, (q15_t)0xDAA7, (q15_t)0x7A6E, + (q15_t)0xDA77, (q15_t)0x7A5F, (q15_t)0xDA47, (q15_t)0x7A50, + (q15_t)0xDA17, (q15_t)0x7A42, (q15_t)0xD9E7, (q15_t)0x7A33, + (q15_t)0xD9B7, (q15_t)0x7A24, (q15_t)0xD987, (q15_t)0x7A15, + (q15_t)0xD957, (q15_t)0x7A05, (q15_t)0xD927, (q15_t)0x79F6, + (q15_t)0xD8F8, (q15_t)0x79E7, (q15_t)0xD8C8, (q15_t)0x79D8, + (q15_t)0xD898, (q15_t)0x79C8, (q15_t)0xD868, (q15_t)0x79B9, + (q15_t)0xD838, (q15_t)0x79A9, (q15_t)0xD809, (q15_t)0x7999, + (q15_t)0xD7D9, (q15_t)0x798A, (q15_t)0xD7A9, (q15_t)0x797A, + (q15_t)0xD779, (q15_t)0x796A, (q15_t)0xD74A, (q15_t)0x795A, + (q15_t)0xD71A, (q15_t)0x794A, (q15_t)0xD6EA, (q15_t)0x793A, + (q15_t)0xD6BB, (q15_t)0x792A, (q15_t)0xD68B, (q15_t)0x7919, + (q15_t)0xD65C, (q15_t)0x7909, (q15_t)0xD62C, (q15_t)0x78F9, + (q15_t)0xD5FD, (q15_t)0x78E8, (q15_t)0xD5CD, (q15_t)0x78D8, + (q15_t)0xD59E, (q15_t)0x78C7, (q15_t)0xD56E, (q15_t)0x78B6, + (q15_t)0xD53F, (q15_t)0x78A6, (q15_t)0xD510, (q15_t)0x7895, + (q15_t)0xD4E0, (q15_t)0x7884, (q15_t)0xD4B1, (q15_t)0x7873, + (q15_t)0xD482, (q15_t)0x7862, (q15_t)0xD452, (q15_t)0x7851, + (q15_t)0xD423, (q15_t)0x7840, (q15_t)0xD3F4, (q15_t)0x782E, + (q15_t)0xD3C5, (q15_t)0x781D, (q15_t)0xD396, (q15_t)0x780C, + (q15_t)0xD367, (q15_t)0x77FA, (q15_t)0xD337, (q15_t)0x77E9, + (q15_t)0xD308, (q15_t)0x77D7, (q15_t)0xD2D9, (q15_t)0x77C5, + (q15_t)0xD2AA, (q15_t)0x77B4, (q15_t)0xD27B, (q15_t)0x77A2, + (q15_t)0xD24C, (q15_t)0x7790, (q15_t)0xD21D, (q15_t)0x777E, + (q15_t)0xD1EE, (q15_t)0x776C, (q15_t)0xD1C0, (q15_t)0x775A, + (q15_t)0xD191, (q15_t)0x7747, (q15_t)0xD162, (q15_t)0x7735, + (q15_t)0xD133, (q15_t)0x7723, (q15_t)0xD104, (q15_t)0x7710, + (q15_t)0xD0D6, (q15_t)0x76FE, (q15_t)0xD0A7, (q15_t)0x76EB, + (q15_t)0xD078, (q15_t)0x76D9, (q15_t)0xD04A, (q15_t)0x76C6, + (q15_t)0xD01B, (q15_t)0x76B3, (q15_t)0xCFEC, (q15_t)0x76A0, + (q15_t)0xCFBE, (q15_t)0x768E, (q15_t)0xCF8F, (q15_t)0x767B, + (q15_t)0xCF61, (q15_t)0x7668, (q15_t)0xCF32, (q15_t)0x7654, + (q15_t)0xCF04, (q15_t)0x7641, (q15_t)0xCED5, (q15_t)0x762E, + (q15_t)0xCEA7, (q15_t)0x761B, (q15_t)0xCE79, (q15_t)0x7607, + (q15_t)0xCE4A, (q15_t)0x75F4, (q15_t)0xCE1C, (q15_t)0x75E0, + (q15_t)0xCDEE, (q15_t)0x75CC, (q15_t)0xCDBF, (q15_t)0x75B9, + (q15_t)0xCD91, (q15_t)0x75A5, (q15_t)0xCD63, (q15_t)0x7591, + (q15_t)0xCD35, (q15_t)0x757D, (q15_t)0xCD07, (q15_t)0x7569, + (q15_t)0xCCD9, (q15_t)0x7555, (q15_t)0xCCAB, (q15_t)0x7541, + (q15_t)0xCC7D, (q15_t)0x752D, (q15_t)0xCC4F, (q15_t)0x7519, + (q15_t)0xCC21, (q15_t)0x7504, (q15_t)0xCBF3, (q15_t)0x74F0, + (q15_t)0xCBC5, (q15_t)0x74DB, (q15_t)0xCB97, (q15_t)0x74C7, + (q15_t)0xCB69, (q15_t)0x74B2, (q15_t)0xCB3B, (q15_t)0x749E, + (q15_t)0xCB0D, (q15_t)0x7489, (q15_t)0xCAE0, (q15_t)0x7474, + (q15_t)0xCAB2, (q15_t)0x745F, (q15_t)0xCA84, (q15_t)0x744A, + (q15_t)0xCA57, (q15_t)0x7435, (q15_t)0xCA29, (q15_t)0x7420, + (q15_t)0xC9FB, (q15_t)0x740B, (q15_t)0xC9CE, (q15_t)0x73F6, + (q15_t)0xC9A0, (q15_t)0x73E0, (q15_t)0xC973, (q15_t)0x73CB, + (q15_t)0xC945, (q15_t)0x73B5, (q15_t)0xC918, (q15_t)0x73A0, + (q15_t)0xC8EB, (q15_t)0x738A, (q15_t)0xC8BD, (q15_t)0x7375, + (q15_t)0xC890, (q15_t)0x735F, (q15_t)0xC863, (q15_t)0x7349, + (q15_t)0xC835, (q15_t)0x7333, (q15_t)0xC808, (q15_t)0x731D, + (q15_t)0xC7DB, (q15_t)0x7307, (q15_t)0xC7AE, (q15_t)0x72F1, + (q15_t)0xC781, (q15_t)0x72DB, (q15_t)0xC754, (q15_t)0x72C5, + (q15_t)0xC727, (q15_t)0x72AF, (q15_t)0xC6F9, (q15_t)0x7298, + (q15_t)0xC6CD, (q15_t)0x7282, (q15_t)0xC6A0, (q15_t)0x726B, + (q15_t)0xC673, (q15_t)0x7255, (q15_t)0xC646, (q15_t)0x723E, + (q15_t)0xC619, (q15_t)0x7227, (q15_t)0xC5EC, (q15_t)0x7211, + (q15_t)0xC5BF, (q15_t)0x71FA, (q15_t)0xC593, (q15_t)0x71E3, + (q15_t)0xC566, (q15_t)0x71CC, (q15_t)0xC539, (q15_t)0x71B5, + (q15_t)0xC50D, (q15_t)0x719E, (q15_t)0xC4E0, (q15_t)0x7186, + (q15_t)0xC4B3, (q15_t)0x716F, (q15_t)0xC487, (q15_t)0x7158, + (q15_t)0xC45A, (q15_t)0x7141, (q15_t)0xC42E, (q15_t)0x7129, + (q15_t)0xC402, (q15_t)0x7112, (q15_t)0xC3D5, (q15_t)0x70FA, + (q15_t)0xC3A9, (q15_t)0x70E2, (q15_t)0xC37C, (q15_t)0x70CB, + (q15_t)0xC350, (q15_t)0x70B3, (q15_t)0xC324, (q15_t)0x709B, + (q15_t)0xC2F8, (q15_t)0x7083, (q15_t)0xC2CC, (q15_t)0x706B, + (q15_t)0xC29F, (q15_t)0x7053, (q15_t)0xC273, (q15_t)0x703B, + (q15_t)0xC247, (q15_t)0x7023, (q15_t)0xC21B, (q15_t)0x700A, + (q15_t)0xC1EF, (q15_t)0x6FF2, (q15_t)0xC1C3, (q15_t)0x6FDA, + (q15_t)0xC197, (q15_t)0x6FC1, (q15_t)0xC16C, (q15_t)0x6FA9, + (q15_t)0xC140, (q15_t)0x6F90, (q15_t)0xC114, (q15_t)0x6F77, + (q15_t)0xC0E8, (q15_t)0x6F5F, (q15_t)0xC0BC, (q15_t)0x6F46, + (q15_t)0xC091, (q15_t)0x6F2D, (q15_t)0xC065, (q15_t)0x6F14, + (q15_t)0xC03A, (q15_t)0x6EFB, (q15_t)0xC00E, (q15_t)0x6EE2, + (q15_t)0xBFE2, (q15_t)0x6EC9, (q15_t)0xBFB7, (q15_t)0x6EAF, + (q15_t)0xBF8C, (q15_t)0x6E96, (q15_t)0xBF60, (q15_t)0x6E7D, + (q15_t)0xBF35, (q15_t)0x6E63, (q15_t)0xBF09, (q15_t)0x6E4A, + (q15_t)0xBEDE, (q15_t)0x6E30, (q15_t)0xBEB3, (q15_t)0x6E17, + (q15_t)0xBE88, (q15_t)0x6DFD, (q15_t)0xBE5D, (q15_t)0x6DE3, + (q15_t)0xBE31, (q15_t)0x6DCA, (q15_t)0xBE06, (q15_t)0x6DB0, + (q15_t)0xBDDB, (q15_t)0x6D96, (q15_t)0xBDB0, (q15_t)0x6D7C, + (q15_t)0xBD85, (q15_t)0x6D62, (q15_t)0xBD5A, (q15_t)0x6D48, + (q15_t)0xBD2F, (q15_t)0x6D2D, (q15_t)0xBD05, (q15_t)0x6D13, + (q15_t)0xBCDA, (q15_t)0x6CF9, (q15_t)0xBCAF, (q15_t)0x6CDE, + (q15_t)0xBC84, (q15_t)0x6CC4, (q15_t)0xBC5A, (q15_t)0x6CA9, + (q15_t)0xBC2F, (q15_t)0x6C8F, (q15_t)0xBC04, (q15_t)0x6C74, + (q15_t)0xBBDA, (q15_t)0x6C59, (q15_t)0xBBAF, (q15_t)0x6C3F, + (q15_t)0xBB85, (q15_t)0x6C24, (q15_t)0xBB5A, (q15_t)0x6C09, + (q15_t)0xBB30, (q15_t)0x6BEE, (q15_t)0xBB05, (q15_t)0x6BD3, + (q15_t)0xBADB, (q15_t)0x6BB8, (q15_t)0xBAB1, (q15_t)0x6B9C, + (q15_t)0xBA87, (q15_t)0x6B81, (q15_t)0xBA5C, (q15_t)0x6B66, + (q15_t)0xBA32, (q15_t)0x6B4A, (q15_t)0xBA08, (q15_t)0x6B2F, + (q15_t)0xB9DE, (q15_t)0x6B13, (q15_t)0xB9B4, (q15_t)0x6AF8, + (q15_t)0xB98A, (q15_t)0x6ADC, (q15_t)0xB960, (q15_t)0x6AC1, + (q15_t)0xB936, (q15_t)0x6AA5, (q15_t)0xB90C, (q15_t)0x6A89, + (q15_t)0xB8E3, (q15_t)0x6A6D, (q15_t)0xB8B9, (q15_t)0x6A51, + (q15_t)0xB88F, (q15_t)0x6A35, (q15_t)0xB865, (q15_t)0x6A19, + (q15_t)0xB83C, (q15_t)0x69FD, (q15_t)0xB812, (q15_t)0x69E1, + (q15_t)0xB7E9, (q15_t)0x69C4, (q15_t)0xB7BF, (q15_t)0x69A8, + (q15_t)0xB796, (q15_t)0x698C, (q15_t)0xB76C, (q15_t)0x696F, + (q15_t)0xB743, (q15_t)0x6953, (q15_t)0xB719, (q15_t)0x6936, + (q15_t)0xB6F0, (q15_t)0x6919, (q15_t)0xB6C7, (q15_t)0x68FD, + (q15_t)0xB69E, (q15_t)0x68E0, (q15_t)0xB675, (q15_t)0x68C3, + (q15_t)0xB64B, (q15_t)0x68A6, (q15_t)0xB622, (q15_t)0x6889, + (q15_t)0xB5F9, (q15_t)0x686C, (q15_t)0xB5D0, (q15_t)0x684F, + (q15_t)0xB5A7, (q15_t)0x6832, (q15_t)0xB57E, (q15_t)0x6815, + (q15_t)0xB556, (q15_t)0x67F7, (q15_t)0xB52D, (q15_t)0x67DA, + (q15_t)0xB504, (q15_t)0x67BD, (q15_t)0xB4DB, (q15_t)0x679F, + (q15_t)0xB4B3, (q15_t)0x6782, (q15_t)0xB48A, (q15_t)0x6764, + (q15_t)0xB461, (q15_t)0x6746, (q15_t)0xB439, (q15_t)0x6729, + (q15_t)0xB410, (q15_t)0x670B, (q15_t)0xB3E8, (q15_t)0x66ED, + (q15_t)0xB3C0, (q15_t)0x66CF, (q15_t)0xB397, (q15_t)0x66B1, + (q15_t)0xB36F, (q15_t)0x6693, (q15_t)0xB347, (q15_t)0x6675, + (q15_t)0xB31E, (q15_t)0x6657, (q15_t)0xB2F6, (q15_t)0x6639, + (q15_t)0xB2CE, (q15_t)0x661A, (q15_t)0xB2A6, (q15_t)0x65FC, + (q15_t)0xB27E, (q15_t)0x65DD, (q15_t)0xB256, (q15_t)0x65BF, + (q15_t)0xB22E, (q15_t)0x65A0, (q15_t)0xB206, (q15_t)0x6582, + (q15_t)0xB1DE, (q15_t)0x6563, (q15_t)0xB1B7, (q15_t)0x6545, + (q15_t)0xB18F, (q15_t)0x6526, (q15_t)0xB167, (q15_t)0x6507, + (q15_t)0xB140, (q15_t)0x64E8, (q15_t)0xB118, (q15_t)0x64C9, + (q15_t)0xB0F0, (q15_t)0x64AA, (q15_t)0xB0C9, (q15_t)0x648B, + (q15_t)0xB0A1, (q15_t)0x646C, (q15_t)0xB07A, (q15_t)0x644D, + (q15_t)0xB053, (q15_t)0x642D, (q15_t)0xB02B, (q15_t)0x640E, + (q15_t)0xB004, (q15_t)0x63EF, (q15_t)0xAFDD, (q15_t)0x63CF, + (q15_t)0xAFB6, (q15_t)0x63B0, (q15_t)0xAF8F, (q15_t)0x6390, + (q15_t)0xAF68, (q15_t)0x6371, (q15_t)0xAF40, (q15_t)0x6351, + (q15_t)0xAF1A, (q15_t)0x6331, (q15_t)0xAEF3, (q15_t)0x6311, + (q15_t)0xAECC, (q15_t)0x62F2, (q15_t)0xAEA5, (q15_t)0x62D2, + (q15_t)0xAE7E, (q15_t)0x62B2, (q15_t)0xAE57, (q15_t)0x6292, + (q15_t)0xAE31, (q15_t)0x6271, (q15_t)0xAE0A, (q15_t)0x6251, + (q15_t)0xADE3, (q15_t)0x6231, (q15_t)0xADBD, (q15_t)0x6211, + (q15_t)0xAD96, (q15_t)0x61F1, (q15_t)0xAD70, (q15_t)0x61D0, + (q15_t)0xAD4A, (q15_t)0x61B0, (q15_t)0xAD23, (q15_t)0x618F, + (q15_t)0xACFD, (q15_t)0x616F, (q15_t)0xACD7, (q15_t)0x614E, + (q15_t)0xACB1, (q15_t)0x612D, (q15_t)0xAC8A, (q15_t)0x610D, + (q15_t)0xAC64, (q15_t)0x60EC, (q15_t)0xAC3E, (q15_t)0x60CB, + (q15_t)0xAC18, (q15_t)0x60AA, (q15_t)0xABF2, (q15_t)0x6089, + (q15_t)0xABCC, (q15_t)0x6068, (q15_t)0xABA7, (q15_t)0x6047, + (q15_t)0xAB81, (q15_t)0x6026, (q15_t)0xAB5B, (q15_t)0x6004, + (q15_t)0xAB35, (q15_t)0x5FE3, (q15_t)0xAB10, (q15_t)0x5FC2, + (q15_t)0xAAEA, (q15_t)0x5FA0, (q15_t)0xAAC5, (q15_t)0x5F7F, + (q15_t)0xAA9F, (q15_t)0x5F5E, (q15_t)0xAA7A, (q15_t)0x5F3C, + (q15_t)0xAA54, (q15_t)0x5F1A, (q15_t)0xAA2F, (q15_t)0x5EF9, + (q15_t)0xAA0A, (q15_t)0x5ED7, (q15_t)0xA9E5, (q15_t)0x5EB5, + (q15_t)0xA9BF, (q15_t)0x5E93, (q15_t)0xA99A, (q15_t)0x5E71, + (q15_t)0xA975, (q15_t)0x5E50, (q15_t)0xA950, (q15_t)0x5E2D, + (q15_t)0xA92B, (q15_t)0x5E0B, (q15_t)0xA906, (q15_t)0x5DE9, + (q15_t)0xA8E2, (q15_t)0x5DC7, (q15_t)0xA8BD, (q15_t)0x5DA5, + (q15_t)0xA898, (q15_t)0x5D83, (q15_t)0xA873, (q15_t)0x5D60, + (q15_t)0xA84F, (q15_t)0x5D3E, (q15_t)0xA82A, (q15_t)0x5D1B, + (q15_t)0xA806, (q15_t)0x5CF9, (q15_t)0xA7E1, (q15_t)0x5CD6, + (q15_t)0xA7BD, (q15_t)0x5CB4, (q15_t)0xA798, (q15_t)0x5C91, + (q15_t)0xA774, (q15_t)0x5C6E, (q15_t)0xA750, (q15_t)0x5C4B, + (q15_t)0xA72B, (q15_t)0x5C29, (q15_t)0xA707, (q15_t)0x5C06, + (q15_t)0xA6E3, (q15_t)0x5BE3, (q15_t)0xA6BF, (q15_t)0x5BC0, + (q15_t)0xA69B, (q15_t)0x5B9D, (q15_t)0xA677, (q15_t)0x5B79, + (q15_t)0xA653, (q15_t)0x5B56, (q15_t)0xA62F, (q15_t)0x5B33, + (q15_t)0xA60C, (q15_t)0x5B10, (q15_t)0xA5E8, (q15_t)0x5AEC, + (q15_t)0xA5C4, (q15_t)0x5AC9, (q15_t)0xA5A1, (q15_t)0x5AA5, + (q15_t)0xA57D, (q15_t)0x5A82, (q15_t)0xA55A, (q15_t)0x5A5E, + (q15_t)0xA536, (q15_t)0x5A3B, (q15_t)0xA513, (q15_t)0x5A17, + (q15_t)0xA4EF, (q15_t)0x59F3, (q15_t)0xA4CC, (q15_t)0x59D0, + (q15_t)0xA4A9, (q15_t)0x59AC, (q15_t)0xA486, (q15_t)0x5988, + (q15_t)0xA462, (q15_t)0x5964, (q15_t)0xA43F, (q15_t)0x5940, + (q15_t)0xA41C, (q15_t)0x591C, (q15_t)0xA3F9, (q15_t)0x58F8, + (q15_t)0xA3D6, (q15_t)0x58D4, (q15_t)0xA3B4, (q15_t)0x58AF, + (q15_t)0xA391, (q15_t)0x588B, (q15_t)0xA36E, (q15_t)0x5867, + (q15_t)0xA34B, (q15_t)0x5842, (q15_t)0xA329, (q15_t)0x581E, + (q15_t)0xA306, (q15_t)0x57F9, (q15_t)0xA2E4, (q15_t)0x57D5, + (q15_t)0xA2C1, (q15_t)0x57B0, (q15_t)0xA29F, (q15_t)0x578C, + (q15_t)0xA27C, (q15_t)0x5767, (q15_t)0xA25A, (q15_t)0x5742, + (q15_t)0xA238, (q15_t)0x571D, (q15_t)0xA216, (q15_t)0x56F9, + (q15_t)0xA1F4, (q15_t)0x56D4, (q15_t)0xA1D2, (q15_t)0x56AF, + (q15_t)0xA1AF, (q15_t)0x568A, (q15_t)0xA18E, (q15_t)0x5665, + (q15_t)0xA16C, (q15_t)0x5640, (q15_t)0xA14A, (q15_t)0x561A, + (q15_t)0xA128, (q15_t)0x55F5, (q15_t)0xA106, (q15_t)0x55D0, + (q15_t)0xA0E5, (q15_t)0x55AB, (q15_t)0xA0C3, (q15_t)0x5585, + (q15_t)0xA0A1, (q15_t)0x5560, (q15_t)0xA080, (q15_t)0x553A, + (q15_t)0xA05F, (q15_t)0x5515, (q15_t)0xA03D, (q15_t)0x54EF, + (q15_t)0xA01C, (q15_t)0x54CA, (q15_t)0x9FFB, (q15_t)0x54A4, + (q15_t)0x9FD9, (q15_t)0x547E, (q15_t)0x9FB8, (q15_t)0x5458, + (q15_t)0x9F97, (q15_t)0x5433, (q15_t)0x9F76, (q15_t)0x540D, + (q15_t)0x9F55, (q15_t)0x53E7, (q15_t)0x9F34, (q15_t)0x53C1, + (q15_t)0x9F13, (q15_t)0x539B, (q15_t)0x9EF2, (q15_t)0x5375, + (q15_t)0x9ED2, (q15_t)0x534E, (q15_t)0x9EB1, (q15_t)0x5328, + (q15_t)0x9E90, (q15_t)0x5302, (q15_t)0x9E70, (q15_t)0x52DC, + (q15_t)0x9E4F, (q15_t)0x52B5, (q15_t)0x9E2F, (q15_t)0x528F, + (q15_t)0x9E0E, (q15_t)0x5269, (q15_t)0x9DEE, (q15_t)0x5242, + (q15_t)0x9DCE, (q15_t)0x521C, (q15_t)0x9DAE, (q15_t)0x51F5, + (q15_t)0x9D8E, (q15_t)0x51CE, (q15_t)0x9D6D, (q15_t)0x51A8, + (q15_t)0x9D4D, (q15_t)0x5181, (q15_t)0x9D2D, (q15_t)0x515A, + (q15_t)0x9D0D, (q15_t)0x5133, (q15_t)0x9CEE, (q15_t)0x510C, + (q15_t)0x9CCE, (q15_t)0x50E5, (q15_t)0x9CAE, (q15_t)0x50BF, + (q15_t)0x9C8E, (q15_t)0x5097, (q15_t)0x9C6F, (q15_t)0x5070, + (q15_t)0x9C4F, (q15_t)0x5049, (q15_t)0x9C30, (q15_t)0x5022, + (q15_t)0x9C10, (q15_t)0x4FFB, (q15_t)0x9BF1, (q15_t)0x4FD4, + (q15_t)0x9BD2, (q15_t)0x4FAC, (q15_t)0x9BB2, (q15_t)0x4F85, + (q15_t)0x9B93, (q15_t)0x4F5E, (q15_t)0x9B74, (q15_t)0x4F36, + (q15_t)0x9B55, (q15_t)0x4F0F, (q15_t)0x9B36, (q15_t)0x4EE7, + (q15_t)0x9B17, (q15_t)0x4EBF, (q15_t)0x9AF8, (q15_t)0x4E98, + (q15_t)0x9AD9, (q15_t)0x4E70, (q15_t)0x9ABA, (q15_t)0x4E48, + (q15_t)0x9A9C, (q15_t)0x4E21, (q15_t)0x9A7D, (q15_t)0x4DF9, + (q15_t)0x9A5F, (q15_t)0x4DD1, (q15_t)0x9A40, (q15_t)0x4DA9, + (q15_t)0x9A22, (q15_t)0x4D81, (q15_t)0x9A03, (q15_t)0x4D59, + (q15_t)0x99E5, (q15_t)0x4D31, (q15_t)0x99C6, (q15_t)0x4D09, + (q15_t)0x99A8, (q15_t)0x4CE1, (q15_t)0x998A, (q15_t)0x4CB8, + (q15_t)0x996C, (q15_t)0x4C90, (q15_t)0x994E, (q15_t)0x4C68, + (q15_t)0x9930, (q15_t)0x4C3F, (q15_t)0x9912, (q15_t)0x4C17, + (q15_t)0x98F4, (q15_t)0x4BEF, (q15_t)0x98D6, (q15_t)0x4BC6, + (q15_t)0x98B9, (q15_t)0x4B9E, (q15_t)0x989B, (q15_t)0x4B75, + (q15_t)0x987D, (q15_t)0x4B4C, (q15_t)0x9860, (q15_t)0x4B24, + (q15_t)0x9842, (q15_t)0x4AFB, (q15_t)0x9825, (q15_t)0x4AD2, + (q15_t)0x9808, (q15_t)0x4AA9, (q15_t)0x97EA, (q15_t)0x4A81, + (q15_t)0x97CD, (q15_t)0x4A58, (q15_t)0x97B0, (q15_t)0x4A2F, + (q15_t)0x9793, (q15_t)0x4A06, (q15_t)0x9776, (q15_t)0x49DD, + (q15_t)0x9759, (q15_t)0x49B4, (q15_t)0x973C, (q15_t)0x498A, + (q15_t)0x971F, (q15_t)0x4961, (q15_t)0x9702, (q15_t)0x4938, + (q15_t)0x96E6, (q15_t)0x490F, (q15_t)0x96C9, (q15_t)0x48E6, + (q15_t)0x96AC, (q15_t)0x48BC, (q15_t)0x9690, (q15_t)0x4893, + (q15_t)0x9673, (q15_t)0x4869, (q15_t)0x9657, (q15_t)0x4840, + (q15_t)0x963B, (q15_t)0x4816, (q15_t)0x961E, (q15_t)0x47ED, + (q15_t)0x9602, (q15_t)0x47C3, (q15_t)0x95E6, (q15_t)0x479A, + (q15_t)0x95CA, (q15_t)0x4770, (q15_t)0x95AE, (q15_t)0x4746, + (q15_t)0x9592, (q15_t)0x471C, (q15_t)0x9576, (q15_t)0x46F3, + (q15_t)0x955A, (q15_t)0x46C9, (q15_t)0x953E, (q15_t)0x469F, + (q15_t)0x9523, (q15_t)0x4675, (q15_t)0x9507, (q15_t)0x464B, + (q15_t)0x94EC, (q15_t)0x4621, (q15_t)0x94D0, (q15_t)0x45F7, + (q15_t)0x94B5, (q15_t)0x45CD, (q15_t)0x9499, (q15_t)0x45A3, + (q15_t)0x947E, (q15_t)0x4578, (q15_t)0x9463, (q15_t)0x454E, + (q15_t)0x9447, (q15_t)0x4524, (q15_t)0x942C, (q15_t)0x44FA, + (q15_t)0x9411, (q15_t)0x44CF, (q15_t)0x93F6, (q15_t)0x44A5, + (q15_t)0x93DB, (q15_t)0x447A, (q15_t)0x93C0, (q15_t)0x4450, + (q15_t)0x93A6, (q15_t)0x4425, (q15_t)0x938B, (q15_t)0x43FB, + (q15_t)0x9370, (q15_t)0x43D0, (q15_t)0x9356, (q15_t)0x43A5, + (q15_t)0x933B, (q15_t)0x437B, (q15_t)0x9321, (q15_t)0x4350, + (q15_t)0x9306, (q15_t)0x4325, (q15_t)0x92EC, (q15_t)0x42FA, + (q15_t)0x92D2, (q15_t)0x42D0, (q15_t)0x92B7, (q15_t)0x42A5, + (q15_t)0x929D, (q15_t)0x427A, (q15_t)0x9283, (q15_t)0x424F, + (q15_t)0x9269, (q15_t)0x4224, (q15_t)0x924F, (q15_t)0x41F9, + (q15_t)0x9235, (q15_t)0x41CE, (q15_t)0x921C, (q15_t)0x41A2, + (q15_t)0x9202, (q15_t)0x4177, (q15_t)0x91E8, (q15_t)0x414C, + (q15_t)0x91CF, (q15_t)0x4121, (q15_t)0x91B5, (q15_t)0x40F6, + (q15_t)0x919C, (q15_t)0x40CA, (q15_t)0x9182, (q15_t)0x409F, + (q15_t)0x9169, (q15_t)0x4073, (q15_t)0x9150, (q15_t)0x4048, + (q15_t)0x9136, (q15_t)0x401D, (q15_t)0x911D, (q15_t)0x3FF1, + (q15_t)0x9104, (q15_t)0x3FC5, (q15_t)0x90EB, (q15_t)0x3F9A, + (q15_t)0x90D2, (q15_t)0x3F6E, (q15_t)0x90B9, (q15_t)0x3F43, + (q15_t)0x90A0, (q15_t)0x3F17, (q15_t)0x9088, (q15_t)0x3EEB, + (q15_t)0x906F, (q15_t)0x3EBF, (q15_t)0x9056, (q15_t)0x3E93, + (q15_t)0x903E, (q15_t)0x3E68, (q15_t)0x9025, (q15_t)0x3E3C, + (q15_t)0x900D, (q15_t)0x3E10, (q15_t)0x8FF5, (q15_t)0x3DE4, + (q15_t)0x8FDC, (q15_t)0x3DB8, (q15_t)0x8FC4, (q15_t)0x3D8C, + (q15_t)0x8FAC, (q15_t)0x3D60, (q15_t)0x8F94, (q15_t)0x3D33, + (q15_t)0x8F7C, (q15_t)0x3D07, (q15_t)0x8F64, (q15_t)0x3CDB, + (q15_t)0x8F4C, (q15_t)0x3CAF, (q15_t)0x8F34, (q15_t)0x3C83, + (q15_t)0x8F1D, (q15_t)0x3C56, (q15_t)0x8F05, (q15_t)0x3C2A, + (q15_t)0x8EED, (q15_t)0x3BFD, (q15_t)0x8ED6, (q15_t)0x3BD1, + (q15_t)0x8EBE, (q15_t)0x3BA5, (q15_t)0x8EA7, (q15_t)0x3B78, + (q15_t)0x8E90, (q15_t)0x3B4C, (q15_t)0x8E79, (q15_t)0x3B1F, + (q15_t)0x8E61, (q15_t)0x3AF2, (q15_t)0x8E4A, (q15_t)0x3AC6, + (q15_t)0x8E33, (q15_t)0x3A99, (q15_t)0x8E1C, (q15_t)0x3A6C, + (q15_t)0x8E05, (q15_t)0x3A40, (q15_t)0x8DEE, (q15_t)0x3A13, + (q15_t)0x8DD8, (q15_t)0x39E6, (q15_t)0x8DC1, (q15_t)0x39B9, + (q15_t)0x8DAA, (q15_t)0x398C, (q15_t)0x8D94, (q15_t)0x395F, + (q15_t)0x8D7D, (q15_t)0x3932, (q15_t)0x8D67, (q15_t)0x3906, + (q15_t)0x8D50, (q15_t)0x38D8, (q15_t)0x8D3A, (q15_t)0x38AB, + (q15_t)0x8D24, (q15_t)0x387E, (q15_t)0x8D0E, (q15_t)0x3851, + (q15_t)0x8CF8, (q15_t)0x3824, (q15_t)0x8CE2, (q15_t)0x37F7, + (q15_t)0x8CCC, (q15_t)0x37CA, (q15_t)0x8CB6, (q15_t)0x379C, + (q15_t)0x8CA0, (q15_t)0x376F, (q15_t)0x8C8A, (q15_t)0x3742, + (q15_t)0x8C75, (q15_t)0x3714, (q15_t)0x8C5F, (q15_t)0x36E7, + (q15_t)0x8C4A, (q15_t)0x36BA, (q15_t)0x8C34, (q15_t)0x368C, + (q15_t)0x8C1F, (q15_t)0x365F, (q15_t)0x8C09, (q15_t)0x3631, + (q15_t)0x8BF4, (q15_t)0x3604, (q15_t)0x8BDF, (q15_t)0x35D6, + (q15_t)0x8BCA, (q15_t)0x35A8, (q15_t)0x8BB5, (q15_t)0x357B, + (q15_t)0x8BA0, (q15_t)0x354D, (q15_t)0x8B8B, (q15_t)0x351F, + (q15_t)0x8B76, (q15_t)0x34F2, (q15_t)0x8B61, (q15_t)0x34C4, + (q15_t)0x8B4D, (q15_t)0x3496, (q15_t)0x8B38, (q15_t)0x3468, + (q15_t)0x8B24, (q15_t)0x343A, (q15_t)0x8B0F, (q15_t)0x340C, + (q15_t)0x8AFB, (q15_t)0x33DE, (q15_t)0x8AE6, (q15_t)0x33B0, + (q15_t)0x8AD2, (q15_t)0x3382, (q15_t)0x8ABE, (q15_t)0x3354, + (q15_t)0x8AAA, (q15_t)0x3326, (q15_t)0x8A96, (q15_t)0x32F8, + (q15_t)0x8A82, (q15_t)0x32CA, (q15_t)0x8A6E, (q15_t)0x329C, + (q15_t)0x8A5A, (q15_t)0x326E, (q15_t)0x8A46, (q15_t)0x3240, + (q15_t)0x8A33, (q15_t)0x3211, (q15_t)0x8A1F, (q15_t)0x31E3, + (q15_t)0x8A0B, (q15_t)0x31B5, (q15_t)0x89F8, (q15_t)0x3186, + (q15_t)0x89E4, (q15_t)0x3158, (q15_t)0x89D1, (q15_t)0x312A, + (q15_t)0x89BE, (q15_t)0x30FB, (q15_t)0x89AB, (q15_t)0x30CD, + (q15_t)0x8997, (q15_t)0x309E, (q15_t)0x8984, (q15_t)0x3070, + (q15_t)0x8971, (q15_t)0x3041, (q15_t)0x895F, (q15_t)0x3013, + (q15_t)0x894C, (q15_t)0x2FE4, (q15_t)0x8939, (q15_t)0x2FB5, + (q15_t)0x8926, (q15_t)0x2F87, (q15_t)0x8914, (q15_t)0x2F58, + (q15_t)0x8901, (q15_t)0x2F29, (q15_t)0x88EF, (q15_t)0x2EFB, + (q15_t)0x88DC, (q15_t)0x2ECC, (q15_t)0x88CA, (q15_t)0x2E9D, + (q15_t)0x88B8, (q15_t)0x2E6E, (q15_t)0x88A5, (q15_t)0x2E3F, + (q15_t)0x8893, (q15_t)0x2E11, (q15_t)0x8881, (q15_t)0x2DE2, + (q15_t)0x886F, (q15_t)0x2DB3, (q15_t)0x885D, (q15_t)0x2D84, + (q15_t)0x884B, (q15_t)0x2D55, (q15_t)0x883A, (q15_t)0x2D26, + (q15_t)0x8828, (q15_t)0x2CF7, (q15_t)0x8816, (q15_t)0x2CC8, + (q15_t)0x8805, (q15_t)0x2C98, (q15_t)0x87F3, (q15_t)0x2C69, + (q15_t)0x87E2, (q15_t)0x2C3A, (q15_t)0x87D1, (q15_t)0x2C0B, + (q15_t)0x87BF, (q15_t)0x2BDC, (q15_t)0x87AE, (q15_t)0x2BAD, + (q15_t)0x879D, (q15_t)0x2B7D, (q15_t)0x878C, (q15_t)0x2B4E, + (q15_t)0x877B, (q15_t)0x2B1F, (q15_t)0x876A, (q15_t)0x2AEF, + (q15_t)0x8759, (q15_t)0x2AC0, (q15_t)0x8749, (q15_t)0x2A91, + (q15_t)0x8738, (q15_t)0x2A61, (q15_t)0x8727, (q15_t)0x2A32, + (q15_t)0x8717, (q15_t)0x2A02, (q15_t)0x8706, (q15_t)0x29D3, + (q15_t)0x86F6, (q15_t)0x29A3, (q15_t)0x86E6, (q15_t)0x2974, + (q15_t)0x86D5, (q15_t)0x2944, (q15_t)0x86C5, (q15_t)0x2915, + (q15_t)0x86B5, (q15_t)0x28E5, (q15_t)0x86A5, (q15_t)0x28B5, + (q15_t)0x8695, (q15_t)0x2886, (q15_t)0x8685, (q15_t)0x2856, + (q15_t)0x8675, (q15_t)0x2826, (q15_t)0x8666, (q15_t)0x27F6, + (q15_t)0x8656, (q15_t)0x27C7, (q15_t)0x8646, (q15_t)0x2797, + (q15_t)0x8637, (q15_t)0x2767, (q15_t)0x8627, (q15_t)0x2737, + (q15_t)0x8618, (q15_t)0x2707, (q15_t)0x8609, (q15_t)0x26D8, + (q15_t)0x85FA, (q15_t)0x26A8, (q15_t)0x85EA, (q15_t)0x2678, + (q15_t)0x85DB, (q15_t)0x2648, (q15_t)0x85CC, (q15_t)0x2618, + (q15_t)0x85BD, (q15_t)0x25E8, (q15_t)0x85AF, (q15_t)0x25B8, + (q15_t)0x85A0, (q15_t)0x2588, (q15_t)0x8591, (q15_t)0x2558, + (q15_t)0x8582, (q15_t)0x2528, (q15_t)0x8574, (q15_t)0x24F7, + (q15_t)0x8565, (q15_t)0x24C7, (q15_t)0x8557, (q15_t)0x2497, + (q15_t)0x8549, (q15_t)0x2467, (q15_t)0x853A, (q15_t)0x2437, + (q15_t)0x852C, (q15_t)0x2407, (q15_t)0x851E, (q15_t)0x23D6, + (q15_t)0x8510, (q15_t)0x23A6, (q15_t)0x8502, (q15_t)0x2376, + (q15_t)0x84F4, (q15_t)0x2345, (q15_t)0x84E6, (q15_t)0x2315, + (q15_t)0x84D9, (q15_t)0x22E5, (q15_t)0x84CB, (q15_t)0x22B4, + (q15_t)0x84BD, (q15_t)0x2284, (q15_t)0x84B0, (q15_t)0x2254, + (q15_t)0x84A2, (q15_t)0x2223, (q15_t)0x8495, (q15_t)0x21F3, + (q15_t)0x8488, (q15_t)0x21C2, (q15_t)0x847B, (q15_t)0x2192, + (q15_t)0x846D, (q15_t)0x2161, (q15_t)0x8460, (q15_t)0x2131, + (q15_t)0x8453, (q15_t)0x2100, (q15_t)0x8446, (q15_t)0x20D0, + (q15_t)0x843A, (q15_t)0x209F, (q15_t)0x842D, (q15_t)0x206E, + (q15_t)0x8420, (q15_t)0x203E, (q15_t)0x8414, (q15_t)0x200D, + (q15_t)0x8407, (q15_t)0x1FDC, (q15_t)0x83FA, (q15_t)0x1FAC, + (q15_t)0x83EE, (q15_t)0x1F7B, (q15_t)0x83E2, (q15_t)0x1F4A, + (q15_t)0x83D6, (q15_t)0x1F19, (q15_t)0x83C9, (q15_t)0x1EE9, + (q15_t)0x83BD, (q15_t)0x1EB8, (q15_t)0x83B1, (q15_t)0x1E87, + (q15_t)0x83A5, (q15_t)0x1E56, (q15_t)0x8399, (q15_t)0x1E25, + (q15_t)0x838E, (q15_t)0x1DF5, (q15_t)0x8382, (q15_t)0x1DC4, + (q15_t)0x8376, (q15_t)0x1D93, (q15_t)0x836B, (q15_t)0x1D62, + (q15_t)0x835F, (q15_t)0x1D31, (q15_t)0x8354, (q15_t)0x1D00, + (q15_t)0x8348, (q15_t)0x1CCF, (q15_t)0x833D, (q15_t)0x1C9E, + (q15_t)0x8332, (q15_t)0x1C6D, (q15_t)0x8327, (q15_t)0x1C3C, + (q15_t)0x831C, (q15_t)0x1C0B, (q15_t)0x8311, (q15_t)0x1BDA, + (q15_t)0x8306, (q15_t)0x1BA9, (q15_t)0x82FB, (q15_t)0x1B78, + (q15_t)0x82F0, (q15_t)0x1B47, (q15_t)0x82E6, (q15_t)0x1B16, + (q15_t)0x82DB, (q15_t)0x1AE4, (q15_t)0x82D0, (q15_t)0x1AB3, + (q15_t)0x82C6, (q15_t)0x1A82, (q15_t)0x82BC, (q15_t)0x1A51, + (q15_t)0x82B1, (q15_t)0x1A20, (q15_t)0x82A7, (q15_t)0x19EF, + (q15_t)0x829D, (q15_t)0x19BD, (q15_t)0x8293, (q15_t)0x198C, + (q15_t)0x8289, (q15_t)0x195B, (q15_t)0x827F, (q15_t)0x192A, + (q15_t)0x8275, (q15_t)0x18F8, (q15_t)0x826B, (q15_t)0x18C7, + (q15_t)0x8262, (q15_t)0x1896, (q15_t)0x8258, (q15_t)0x1864, + (q15_t)0x824F, (q15_t)0x1833, (q15_t)0x8245, (q15_t)0x1802, + (q15_t)0x823C, (q15_t)0x17D0, (q15_t)0x8232, (q15_t)0x179F, + (q15_t)0x8229, (q15_t)0x176D, (q15_t)0x8220, (q15_t)0x173C, + (q15_t)0x8217, (q15_t)0x170A, (q15_t)0x820E, (q15_t)0x16D9, + (q15_t)0x8205, (q15_t)0x16A8, (q15_t)0x81FC, (q15_t)0x1676, + (q15_t)0x81F3, (q15_t)0x1645, (q15_t)0x81EB, (q15_t)0x1613, + (q15_t)0x81E2, (q15_t)0x15E2, (q15_t)0x81D9, (q15_t)0x15B0, + (q15_t)0x81D1, (q15_t)0x157F, (q15_t)0x81C8, (q15_t)0x154D, + (q15_t)0x81C0, (q15_t)0x151B, (q15_t)0x81B8, (q15_t)0x14EA, + (q15_t)0x81B0, (q15_t)0x14B8, (q15_t)0x81A8, (q15_t)0x1487, + (q15_t)0x81A0, (q15_t)0x1455, (q15_t)0x8198, (q15_t)0x1423, + (q15_t)0x8190, (q15_t)0x13F2, (q15_t)0x8188, (q15_t)0x13C0, + (q15_t)0x8180, (q15_t)0x138E, (q15_t)0x8179, (q15_t)0x135D, + (q15_t)0x8171, (q15_t)0x132B, (q15_t)0x816A, (q15_t)0x12F9, + (q15_t)0x8162, (q15_t)0x12C8, (q15_t)0x815B, (q15_t)0x1296, + (q15_t)0x8154, (q15_t)0x1264, (q15_t)0x814C, (q15_t)0x1232, + (q15_t)0x8145, (q15_t)0x1201, (q15_t)0x813E, (q15_t)0x11CF, + (q15_t)0x8137, (q15_t)0x119D, (q15_t)0x8130, (q15_t)0x116B, + (q15_t)0x812A, (q15_t)0x1139, (q15_t)0x8123, (q15_t)0x1108, + (q15_t)0x811C, (q15_t)0x10D6, (q15_t)0x8116, (q15_t)0x10A4, + (q15_t)0x810F, (q15_t)0x1072, (q15_t)0x8109, (q15_t)0x1040, + (q15_t)0x8102, (q15_t)0x100E, (q15_t)0x80FC, (q15_t)0x0FDD, + (q15_t)0x80F6, (q15_t)0x0FAB, (q15_t)0x80F0, (q15_t)0x0F79, + (q15_t)0x80EA, (q15_t)0x0F47, (q15_t)0x80E4, (q15_t)0x0F15, + (q15_t)0x80DE, (q15_t)0x0EE3, (q15_t)0x80D8, (q15_t)0x0EB1, + (q15_t)0x80D2, (q15_t)0x0E7F, (q15_t)0x80CD, (q15_t)0x0E4D, + (q15_t)0x80C7, (q15_t)0x0E1B, (q15_t)0x80C2, (q15_t)0x0DE9, + (q15_t)0x80BC, (q15_t)0x0DB7, (q15_t)0x80B7, (q15_t)0x0D85, + (q15_t)0x80B2, (q15_t)0x0D53, (q15_t)0x80AC, (q15_t)0x0D21, + (q15_t)0x80A7, (q15_t)0x0CEF, (q15_t)0x80A2, (q15_t)0x0CBD, + (q15_t)0x809D, (q15_t)0x0C8B, (q15_t)0x8098, (q15_t)0x0C59, + (q15_t)0x8094, (q15_t)0x0C27, (q15_t)0x808F, (q15_t)0x0BF5, + (q15_t)0x808A, (q15_t)0x0BC3, (q15_t)0x8086, (q15_t)0x0B91, + (q15_t)0x8081, (q15_t)0x0B5F, (q15_t)0x807D, (q15_t)0x0B2D, + (q15_t)0x8078, (q15_t)0x0AFB, (q15_t)0x8074, (q15_t)0x0AC9, + (q15_t)0x8070, (q15_t)0x0A97, (q15_t)0x806C, (q15_t)0x0A65, + (q15_t)0x8068, (q15_t)0x0A33, (q15_t)0x8064, (q15_t)0x0A00, + (q15_t)0x8060, (q15_t)0x09CE, (q15_t)0x805C, (q15_t)0x099C, + (q15_t)0x8058, (q15_t)0x096A, (q15_t)0x8055, (q15_t)0x0938, + (q15_t)0x8051, (q15_t)0x0906, (q15_t)0x804E, (q15_t)0x08D4, + (q15_t)0x804A, (q15_t)0x08A2, (q15_t)0x8047, (q15_t)0x086F, + (q15_t)0x8043, (q15_t)0x083D, (q15_t)0x8040, (q15_t)0x080B, + (q15_t)0x803D, (q15_t)0x07D9, (q15_t)0x803A, (q15_t)0x07A7, + (q15_t)0x8037, (q15_t)0x0775, (q15_t)0x8034, (q15_t)0x0742, + (q15_t)0x8031, (q15_t)0x0710, (q15_t)0x802F, (q15_t)0x06DE, + (q15_t)0x802C, (q15_t)0x06AC, (q15_t)0x8029, (q15_t)0x067A, + (q15_t)0x8027, (q15_t)0x0647, (q15_t)0x8025, (q15_t)0x0615, + (q15_t)0x8022, (q15_t)0x05E3, (q15_t)0x8020, (q15_t)0x05B1, + (q15_t)0x801E, (q15_t)0x057F, (q15_t)0x801C, (q15_t)0x054C, + (q15_t)0x801A, (q15_t)0x051A, (q15_t)0x8018, (q15_t)0x04E8, + (q15_t)0x8016, (q15_t)0x04B6, (q15_t)0x8014, (q15_t)0x0483, + (q15_t)0x8012, (q15_t)0x0451, (q15_t)0x8011, (q15_t)0x041F, + (q15_t)0x800F, (q15_t)0x03ED, (q15_t)0x800D, (q15_t)0x03BA, + (q15_t)0x800C, (q15_t)0x0388, (q15_t)0x800B, (q15_t)0x0356, + (q15_t)0x8009, (q15_t)0x0324, (q15_t)0x8008, (q15_t)0x02F1, + (q15_t)0x8007, (q15_t)0x02BF, (q15_t)0x8006, (q15_t)0x028D, + (q15_t)0x8005, (q15_t)0x025B, (q15_t)0x8004, (q15_t)0x0228, + (q15_t)0x8003, (q15_t)0x01F6, (q15_t)0x8003, (q15_t)0x01C4, + (q15_t)0x8002, (q15_t)0x0192, (q15_t)0x8001, (q15_t)0x015F, + (q15_t)0x8001, (q15_t)0x012D, (q15_t)0x8000, (q15_t)0x00FB, + (q15_t)0x8000, (q15_t)0x00C9, (q15_t)0x8000, (q15_t)0x0096, + (q15_t)0x8000, (q15_t)0x0064, (q15_t)0x8000, (q15_t)0x0032, + (q15_t)0x8000, (q15_t)0x0000, (q15_t)0x8000, (q15_t)0xFFCD, + (q15_t)0x8000, (q15_t)0xFF9B, (q15_t)0x8000, (q15_t)0xFF69, + (q15_t)0x8000, (q15_t)0xFF36, (q15_t)0x8000, (q15_t)0xFF04, + (q15_t)0x8001, (q15_t)0xFED2, (q15_t)0x8001, (q15_t)0xFEA0, + (q15_t)0x8002, (q15_t)0xFE6D, (q15_t)0x8003, (q15_t)0xFE3B, + (q15_t)0x8003, (q15_t)0xFE09, (q15_t)0x8004, (q15_t)0xFDD7, + (q15_t)0x8005, (q15_t)0xFDA4, (q15_t)0x8006, (q15_t)0xFD72, + (q15_t)0x8007, (q15_t)0xFD40, (q15_t)0x8008, (q15_t)0xFD0E, + (q15_t)0x8009, (q15_t)0xFCDB, (q15_t)0x800B, (q15_t)0xFCA9, + (q15_t)0x800C, (q15_t)0xFC77, (q15_t)0x800D, (q15_t)0xFC45, + (q15_t)0x800F, (q15_t)0xFC12, (q15_t)0x8011, (q15_t)0xFBE0, + (q15_t)0x8012, (q15_t)0xFBAE, (q15_t)0x8014, (q15_t)0xFB7C, + (q15_t)0x8016, (q15_t)0xFB49, (q15_t)0x8018, (q15_t)0xFB17, + (q15_t)0x801A, (q15_t)0xFAE5, (q15_t)0x801C, (q15_t)0xFAB3, + (q15_t)0x801E, (q15_t)0xFA80, (q15_t)0x8020, (q15_t)0xFA4E, + (q15_t)0x8022, (q15_t)0xFA1C, (q15_t)0x8025, (q15_t)0xF9EA, + (q15_t)0x8027, (q15_t)0xF9B8, (q15_t)0x8029, (q15_t)0xF985, + (q15_t)0x802C, (q15_t)0xF953, (q15_t)0x802F, (q15_t)0xF921, + (q15_t)0x8031, (q15_t)0xF8EF, (q15_t)0x8034, (q15_t)0xF8BD, + (q15_t)0x8037, (q15_t)0xF88A, (q15_t)0x803A, (q15_t)0xF858, + (q15_t)0x803D, (q15_t)0xF826, (q15_t)0x8040, (q15_t)0xF7F4, + (q15_t)0x8043, (q15_t)0xF7C2, (q15_t)0x8047, (q15_t)0xF790, + (q15_t)0x804A, (q15_t)0xF75D, (q15_t)0x804E, (q15_t)0xF72B, + (q15_t)0x8051, (q15_t)0xF6F9, (q15_t)0x8055, (q15_t)0xF6C7, + (q15_t)0x8058, (q15_t)0xF695, (q15_t)0x805C, (q15_t)0xF663, + (q15_t)0x8060, (q15_t)0xF631, (q15_t)0x8064, (q15_t)0xF5FF, + (q15_t)0x8068, (q15_t)0xF5CC, (q15_t)0x806C, (q15_t)0xF59A, + (q15_t)0x8070, (q15_t)0xF568, (q15_t)0x8074, (q15_t)0xF536, + (q15_t)0x8078, (q15_t)0xF504, (q15_t)0x807D, (q15_t)0xF4D2, + (q15_t)0x8081, (q15_t)0xF4A0, (q15_t)0x8086, (q15_t)0xF46E, + (q15_t)0x808A, (q15_t)0xF43C, (q15_t)0x808F, (q15_t)0xF40A, + (q15_t)0x8094, (q15_t)0xF3D8, (q15_t)0x8098, (q15_t)0xF3A6, + (q15_t)0x809D, (q15_t)0xF374, (q15_t)0x80A2, (q15_t)0xF342, + (q15_t)0x80A7, (q15_t)0xF310, (q15_t)0x80AC, (q15_t)0xF2DE, + (q15_t)0x80B2, (q15_t)0xF2AC, (q15_t)0x80B7, (q15_t)0xF27A, + (q15_t)0x80BC, (q15_t)0xF248, (q15_t)0x80C2, (q15_t)0xF216, + (q15_t)0x80C7, (q15_t)0xF1E4, (q15_t)0x80CD, (q15_t)0xF1B2, + (q15_t)0x80D2, (q15_t)0xF180, (q15_t)0x80D8, (q15_t)0xF14E, + (q15_t)0x80DE, (q15_t)0xF11C, (q15_t)0x80E4, (q15_t)0xF0EA, + (q15_t)0x80EA, (q15_t)0xF0B8, (q15_t)0x80F0, (q15_t)0xF086, + (q15_t)0x80F6, (q15_t)0xF054, (q15_t)0x80FC, (q15_t)0xF022, + (q15_t)0x8102, (q15_t)0xEFF1, (q15_t)0x8109, (q15_t)0xEFBF, + (q15_t)0x810F, (q15_t)0xEF8D, (q15_t)0x8116, (q15_t)0xEF5B, + (q15_t)0x811C, (q15_t)0xEF29, (q15_t)0x8123, (q15_t)0xEEF7, + (q15_t)0x812A, (q15_t)0xEEC6, (q15_t)0x8130, (q15_t)0xEE94, + (q15_t)0x8137, (q15_t)0xEE62, (q15_t)0x813E, (q15_t)0xEE30, + (q15_t)0x8145, (q15_t)0xEDFE, (q15_t)0x814C, (q15_t)0xEDCD, + (q15_t)0x8154, (q15_t)0xED9B, (q15_t)0x815B, (q15_t)0xED69, + (q15_t)0x8162, (q15_t)0xED37, (q15_t)0x816A, (q15_t)0xED06, + (q15_t)0x8171, (q15_t)0xECD4, (q15_t)0x8179, (q15_t)0xECA2, + (q15_t)0x8180, (q15_t)0xEC71, (q15_t)0x8188, (q15_t)0xEC3F, + (q15_t)0x8190, (q15_t)0xEC0D, (q15_t)0x8198, (q15_t)0xEBDC, + (q15_t)0x81A0, (q15_t)0xEBAA, (q15_t)0x81A8, (q15_t)0xEB78, + (q15_t)0x81B0, (q15_t)0xEB47, (q15_t)0x81B8, (q15_t)0xEB15, + (q15_t)0x81C0, (q15_t)0xEAE4, (q15_t)0x81C8, (q15_t)0xEAB2, + (q15_t)0x81D1, (q15_t)0xEA80, (q15_t)0x81D9, (q15_t)0xEA4F, + (q15_t)0x81E2, (q15_t)0xEA1D, (q15_t)0x81EB, (q15_t)0xE9EC, + (q15_t)0x81F3, (q15_t)0xE9BA, (q15_t)0x81FC, (q15_t)0xE989, + (q15_t)0x8205, (q15_t)0xE957, (q15_t)0x820E, (q15_t)0xE926, + (q15_t)0x8217, (q15_t)0xE8F5, (q15_t)0x8220, (q15_t)0xE8C3, + (q15_t)0x8229, (q15_t)0xE892, (q15_t)0x8232, (q15_t)0xE860, + (q15_t)0x823C, (q15_t)0xE82F, (q15_t)0x8245, (q15_t)0xE7FD, + (q15_t)0x824F, (q15_t)0xE7CC, (q15_t)0x8258, (q15_t)0xE79B, + (q15_t)0x8262, (q15_t)0xE769, (q15_t)0x826B, (q15_t)0xE738, + (q15_t)0x8275, (q15_t)0xE707, (q15_t)0x827F, (q15_t)0xE6D5, + (q15_t)0x8289, (q15_t)0xE6A4, (q15_t)0x8293, (q15_t)0xE673, + (q15_t)0x829D, (q15_t)0xE642, (q15_t)0x82A7, (q15_t)0xE610, + (q15_t)0x82B1, (q15_t)0xE5DF, (q15_t)0x82BC, (q15_t)0xE5AE, + (q15_t)0x82C6, (q15_t)0xE57D, (q15_t)0x82D0, (q15_t)0xE54C, + (q15_t)0x82DB, (q15_t)0xE51B, (q15_t)0x82E6, (q15_t)0xE4E9, + (q15_t)0x82F0, (q15_t)0xE4B8, (q15_t)0x82FB, (q15_t)0xE487, + (q15_t)0x8306, (q15_t)0xE456, (q15_t)0x8311, (q15_t)0xE425, + (q15_t)0x831C, (q15_t)0xE3F4, (q15_t)0x8327, (q15_t)0xE3C3, + (q15_t)0x8332, (q15_t)0xE392, (q15_t)0x833D, (q15_t)0xE361, + (q15_t)0x8348, (q15_t)0xE330, (q15_t)0x8354, (q15_t)0xE2FF, + (q15_t)0x835F, (q15_t)0xE2CE, (q15_t)0x836B, (q15_t)0xE29D, + (q15_t)0x8376, (q15_t)0xE26C, (q15_t)0x8382, (q15_t)0xE23B, + (q15_t)0x838E, (q15_t)0xE20A, (q15_t)0x8399, (q15_t)0xE1DA, + (q15_t)0x83A5, (q15_t)0xE1A9, (q15_t)0x83B1, (q15_t)0xE178, + (q15_t)0x83BD, (q15_t)0xE147, (q15_t)0x83C9, (q15_t)0xE116, + (q15_t)0x83D6, (q15_t)0xE0E6, (q15_t)0x83E2, (q15_t)0xE0B5, + (q15_t)0x83EE, (q15_t)0xE084, (q15_t)0x83FA, (q15_t)0xE053, + (q15_t)0x8407, (q15_t)0xE023, (q15_t)0x8414, (q15_t)0xDFF2, + (q15_t)0x8420, (q15_t)0xDFC1, (q15_t)0x842D, (q15_t)0xDF91, + (q15_t)0x843A, (q15_t)0xDF60, (q15_t)0x8446, (q15_t)0xDF2F, + (q15_t)0x8453, (q15_t)0xDEFF, (q15_t)0x8460, (q15_t)0xDECE, + (q15_t)0x846D, (q15_t)0xDE9E, (q15_t)0x847B, (q15_t)0xDE6D, + (q15_t)0x8488, (q15_t)0xDE3D, (q15_t)0x8495, (q15_t)0xDE0C, + (q15_t)0x84A2, (q15_t)0xDDDC, (q15_t)0x84B0, (q15_t)0xDDAB, + (q15_t)0x84BD, (q15_t)0xDD7B, (q15_t)0x84CB, (q15_t)0xDD4B, + (q15_t)0x84D9, (q15_t)0xDD1A, (q15_t)0x84E6, (q15_t)0xDCEA, + (q15_t)0x84F4, (q15_t)0xDCBA, (q15_t)0x8502, (q15_t)0xDC89, + (q15_t)0x8510, (q15_t)0xDC59, (q15_t)0x851E, (q15_t)0xDC29, + (q15_t)0x852C, (q15_t)0xDBF8, (q15_t)0x853A, (q15_t)0xDBC8, + (q15_t)0x8549, (q15_t)0xDB98, (q15_t)0x8557, (q15_t)0xDB68, + (q15_t)0x8565, (q15_t)0xDB38, (q15_t)0x8574, (q15_t)0xDB08, + (q15_t)0x8582, (q15_t)0xDAD7, (q15_t)0x8591, (q15_t)0xDAA7, + (q15_t)0x85A0, (q15_t)0xDA77, (q15_t)0x85AF, (q15_t)0xDA47, + (q15_t)0x85BD, (q15_t)0xDA17, (q15_t)0x85CC, (q15_t)0xD9E7, + (q15_t)0x85DB, (q15_t)0xD9B7, (q15_t)0x85EA, (q15_t)0xD987, + (q15_t)0x85FA, (q15_t)0xD957, (q15_t)0x8609, (q15_t)0xD927, + (q15_t)0x8618, (q15_t)0xD8F8, (q15_t)0x8627, (q15_t)0xD8C8, + (q15_t)0x8637, (q15_t)0xD898, (q15_t)0x8646, (q15_t)0xD868, + (q15_t)0x8656, (q15_t)0xD838, (q15_t)0x8666, (q15_t)0xD809, + (q15_t)0x8675, (q15_t)0xD7D9, (q15_t)0x8685, (q15_t)0xD7A9, + (q15_t)0x8695, (q15_t)0xD779, (q15_t)0x86A5, (q15_t)0xD74A, + (q15_t)0x86B5, (q15_t)0xD71A, (q15_t)0x86C5, (q15_t)0xD6EA, + (q15_t)0x86D5, (q15_t)0xD6BB, (q15_t)0x86E6, (q15_t)0xD68B, + (q15_t)0x86F6, (q15_t)0xD65C, (q15_t)0x8706, (q15_t)0xD62C, + (q15_t)0x8717, (q15_t)0xD5FD, (q15_t)0x8727, (q15_t)0xD5CD, + (q15_t)0x8738, (q15_t)0xD59E, (q15_t)0x8749, (q15_t)0xD56E, + (q15_t)0x8759, (q15_t)0xD53F, (q15_t)0x876A, (q15_t)0xD510, + (q15_t)0x877B, (q15_t)0xD4E0, (q15_t)0x878C, (q15_t)0xD4B1, + (q15_t)0x879D, (q15_t)0xD482, (q15_t)0x87AE, (q15_t)0xD452, + (q15_t)0x87BF, (q15_t)0xD423, (q15_t)0x87D1, (q15_t)0xD3F4, + (q15_t)0x87E2, (q15_t)0xD3C5, (q15_t)0x87F3, (q15_t)0xD396, + (q15_t)0x8805, (q15_t)0xD367, (q15_t)0x8816, (q15_t)0xD337, + (q15_t)0x8828, (q15_t)0xD308, (q15_t)0x883A, (q15_t)0xD2D9, + (q15_t)0x884B, (q15_t)0xD2AA, (q15_t)0x885D, (q15_t)0xD27B, + (q15_t)0x886F, (q15_t)0xD24C, (q15_t)0x8881, (q15_t)0xD21D, + (q15_t)0x8893, (q15_t)0xD1EE, (q15_t)0x88A5, (q15_t)0xD1C0, + (q15_t)0x88B8, (q15_t)0xD191, (q15_t)0x88CA, (q15_t)0xD162, + (q15_t)0x88DC, (q15_t)0xD133, (q15_t)0x88EF, (q15_t)0xD104, + (q15_t)0x8901, (q15_t)0xD0D6, (q15_t)0x8914, (q15_t)0xD0A7, + (q15_t)0x8926, (q15_t)0xD078, (q15_t)0x8939, (q15_t)0xD04A, + (q15_t)0x894C, (q15_t)0xD01B, (q15_t)0x895F, (q15_t)0xCFEC, + (q15_t)0x8971, (q15_t)0xCFBE, (q15_t)0x8984, (q15_t)0xCF8F, + (q15_t)0x8997, (q15_t)0xCF61, (q15_t)0x89AB, (q15_t)0xCF32, + (q15_t)0x89BE, (q15_t)0xCF04, (q15_t)0x89D1, (q15_t)0xCED5, + (q15_t)0x89E4, (q15_t)0xCEA7, (q15_t)0x89F8, (q15_t)0xCE79, + (q15_t)0x8A0B, (q15_t)0xCE4A, (q15_t)0x8A1F, (q15_t)0xCE1C, + (q15_t)0x8A33, (q15_t)0xCDEE, (q15_t)0x8A46, (q15_t)0xCDBF, + (q15_t)0x8A5A, (q15_t)0xCD91, (q15_t)0x8A6E, (q15_t)0xCD63, + (q15_t)0x8A82, (q15_t)0xCD35, (q15_t)0x8A96, (q15_t)0xCD07, + (q15_t)0x8AAA, (q15_t)0xCCD9, (q15_t)0x8ABE, (q15_t)0xCCAB, + (q15_t)0x8AD2, (q15_t)0xCC7D, (q15_t)0x8AE6, (q15_t)0xCC4F, + (q15_t)0x8AFB, (q15_t)0xCC21, (q15_t)0x8B0F, (q15_t)0xCBF3, + (q15_t)0x8B24, (q15_t)0xCBC5, (q15_t)0x8B38, (q15_t)0xCB97, + (q15_t)0x8B4D, (q15_t)0xCB69, (q15_t)0x8B61, (q15_t)0xCB3B, + (q15_t)0x8B76, (q15_t)0xCB0D, (q15_t)0x8B8B, (q15_t)0xCAE0, + (q15_t)0x8BA0, (q15_t)0xCAB2, (q15_t)0x8BB5, (q15_t)0xCA84, + (q15_t)0x8BCA, (q15_t)0xCA57, (q15_t)0x8BDF, (q15_t)0xCA29, + (q15_t)0x8BF4, (q15_t)0xC9FB, (q15_t)0x8C09, (q15_t)0xC9CE, + (q15_t)0x8C1F, (q15_t)0xC9A0, (q15_t)0x8C34, (q15_t)0xC973, + (q15_t)0x8C4A, (q15_t)0xC945, (q15_t)0x8C5F, (q15_t)0xC918, + (q15_t)0x8C75, (q15_t)0xC8EB, (q15_t)0x8C8A, (q15_t)0xC8BD, + (q15_t)0x8CA0, (q15_t)0xC890, (q15_t)0x8CB6, (q15_t)0xC863, + (q15_t)0x8CCC, (q15_t)0xC835, (q15_t)0x8CE2, (q15_t)0xC808, + (q15_t)0x8CF8, (q15_t)0xC7DB, (q15_t)0x8D0E, (q15_t)0xC7AE, + (q15_t)0x8D24, (q15_t)0xC781, (q15_t)0x8D3A, (q15_t)0xC754, + (q15_t)0x8D50, (q15_t)0xC727, (q15_t)0x8D67, (q15_t)0xC6F9, + (q15_t)0x8D7D, (q15_t)0xC6CD, (q15_t)0x8D94, (q15_t)0xC6A0, + (q15_t)0x8DAA, (q15_t)0xC673, (q15_t)0x8DC1, (q15_t)0xC646, + (q15_t)0x8DD8, (q15_t)0xC619, (q15_t)0x8DEE, (q15_t)0xC5EC, + (q15_t)0x8E05, (q15_t)0xC5BF, (q15_t)0x8E1C, (q15_t)0xC593, + (q15_t)0x8E33, (q15_t)0xC566, (q15_t)0x8E4A, (q15_t)0xC539, + (q15_t)0x8E61, (q15_t)0xC50D, (q15_t)0x8E79, (q15_t)0xC4E0, + (q15_t)0x8E90, (q15_t)0xC4B3, (q15_t)0x8EA7, (q15_t)0xC487, + (q15_t)0x8EBE, (q15_t)0xC45A, (q15_t)0x8ED6, (q15_t)0xC42E, + (q15_t)0x8EED, (q15_t)0xC402, (q15_t)0x8F05, (q15_t)0xC3D5, + (q15_t)0x8F1D, (q15_t)0xC3A9, (q15_t)0x8F34, (q15_t)0xC37C, + (q15_t)0x8F4C, (q15_t)0xC350, (q15_t)0x8F64, (q15_t)0xC324, + (q15_t)0x8F7C, (q15_t)0xC2F8, (q15_t)0x8F94, (q15_t)0xC2CC, + (q15_t)0x8FAC, (q15_t)0xC29F, (q15_t)0x8FC4, (q15_t)0xC273, + (q15_t)0x8FDC, (q15_t)0xC247, (q15_t)0x8FF5, (q15_t)0xC21B, + (q15_t)0x900D, (q15_t)0xC1EF, (q15_t)0x9025, (q15_t)0xC1C3, + (q15_t)0x903E, (q15_t)0xC197, (q15_t)0x9056, (q15_t)0xC16C, + (q15_t)0x906F, (q15_t)0xC140, (q15_t)0x9088, (q15_t)0xC114, + (q15_t)0x90A0, (q15_t)0xC0E8, (q15_t)0x90B9, (q15_t)0xC0BC, + (q15_t)0x90D2, (q15_t)0xC091, (q15_t)0x90EB, (q15_t)0xC065, + (q15_t)0x9104, (q15_t)0xC03A, (q15_t)0x911D, (q15_t)0xC00E, + (q15_t)0x9136, (q15_t)0xBFE2, (q15_t)0x9150, (q15_t)0xBFB7, + (q15_t)0x9169, (q15_t)0xBF8C, (q15_t)0x9182, (q15_t)0xBF60, + (q15_t)0x919C, (q15_t)0xBF35, (q15_t)0x91B5, (q15_t)0xBF09, + (q15_t)0x91CF, (q15_t)0xBEDE, (q15_t)0x91E8, (q15_t)0xBEB3, + (q15_t)0x9202, (q15_t)0xBE88, (q15_t)0x921C, (q15_t)0xBE5D, + (q15_t)0x9235, (q15_t)0xBE31, (q15_t)0x924F, (q15_t)0xBE06, + (q15_t)0x9269, (q15_t)0xBDDB, (q15_t)0x9283, (q15_t)0xBDB0, + (q15_t)0x929D, (q15_t)0xBD85, (q15_t)0x92B7, (q15_t)0xBD5A, + (q15_t)0x92D2, (q15_t)0xBD2F, (q15_t)0x92EC, (q15_t)0xBD05, + (q15_t)0x9306, (q15_t)0xBCDA, (q15_t)0x9321, (q15_t)0xBCAF, + (q15_t)0x933B, (q15_t)0xBC84, (q15_t)0x9356, (q15_t)0xBC5A, + (q15_t)0x9370, (q15_t)0xBC2F, (q15_t)0x938B, (q15_t)0xBC04, + (q15_t)0x93A6, (q15_t)0xBBDA, (q15_t)0x93C0, (q15_t)0xBBAF, + (q15_t)0x93DB, (q15_t)0xBB85, (q15_t)0x93F6, (q15_t)0xBB5A, + (q15_t)0x9411, (q15_t)0xBB30, (q15_t)0x942C, (q15_t)0xBB05, + (q15_t)0x9447, (q15_t)0xBADB, (q15_t)0x9463, (q15_t)0xBAB1, + (q15_t)0x947E, (q15_t)0xBA87, (q15_t)0x9499, (q15_t)0xBA5C, + (q15_t)0x94B5, (q15_t)0xBA32, (q15_t)0x94D0, (q15_t)0xBA08, + (q15_t)0x94EC, (q15_t)0xB9DE, (q15_t)0x9507, (q15_t)0xB9B4, + (q15_t)0x9523, (q15_t)0xB98A, (q15_t)0x953E, (q15_t)0xB960, + (q15_t)0x955A, (q15_t)0xB936, (q15_t)0x9576, (q15_t)0xB90C, + (q15_t)0x9592, (q15_t)0xB8E3, (q15_t)0x95AE, (q15_t)0xB8B9, + (q15_t)0x95CA, (q15_t)0xB88F, (q15_t)0x95E6, (q15_t)0xB865, + (q15_t)0x9602, (q15_t)0xB83C, (q15_t)0x961E, (q15_t)0xB812, + (q15_t)0x963B, (q15_t)0xB7E9, (q15_t)0x9657, (q15_t)0xB7BF, + (q15_t)0x9673, (q15_t)0xB796, (q15_t)0x9690, (q15_t)0xB76C, + (q15_t)0x96AC, (q15_t)0xB743, (q15_t)0x96C9, (q15_t)0xB719, + (q15_t)0x96E6, (q15_t)0xB6F0, (q15_t)0x9702, (q15_t)0xB6C7, + (q15_t)0x971F, (q15_t)0xB69E, (q15_t)0x973C, (q15_t)0xB675, + (q15_t)0x9759, (q15_t)0xB64B, (q15_t)0x9776, (q15_t)0xB622, + (q15_t)0x9793, (q15_t)0xB5F9, (q15_t)0x97B0, (q15_t)0xB5D0, + (q15_t)0x97CD, (q15_t)0xB5A7, (q15_t)0x97EA, (q15_t)0xB57E, + (q15_t)0x9808, (q15_t)0xB556, (q15_t)0x9825, (q15_t)0xB52D, + (q15_t)0x9842, (q15_t)0xB504, (q15_t)0x9860, (q15_t)0xB4DB, + (q15_t)0x987D, (q15_t)0xB4B3, (q15_t)0x989B, (q15_t)0xB48A, + (q15_t)0x98B9, (q15_t)0xB461, (q15_t)0x98D6, (q15_t)0xB439, + (q15_t)0x98F4, (q15_t)0xB410, (q15_t)0x9912, (q15_t)0xB3E8, + (q15_t)0x9930, (q15_t)0xB3C0, (q15_t)0x994E, (q15_t)0xB397, + (q15_t)0x996C, (q15_t)0xB36F, (q15_t)0x998A, (q15_t)0xB347, + (q15_t)0x99A8, (q15_t)0xB31E, (q15_t)0x99C6, (q15_t)0xB2F6, + (q15_t)0x99E5, (q15_t)0xB2CE, (q15_t)0x9A03, (q15_t)0xB2A6, + (q15_t)0x9A22, (q15_t)0xB27E, (q15_t)0x9A40, (q15_t)0xB256, + (q15_t)0x9A5F, (q15_t)0xB22E, (q15_t)0x9A7D, (q15_t)0xB206, + (q15_t)0x9A9C, (q15_t)0xB1DE, (q15_t)0x9ABA, (q15_t)0xB1B7, + (q15_t)0x9AD9, (q15_t)0xB18F, (q15_t)0x9AF8, (q15_t)0xB167, + (q15_t)0x9B17, (q15_t)0xB140, (q15_t)0x9B36, (q15_t)0xB118, + (q15_t)0x9B55, (q15_t)0xB0F0, (q15_t)0x9B74, (q15_t)0xB0C9, + (q15_t)0x9B93, (q15_t)0xB0A1, (q15_t)0x9BB2, (q15_t)0xB07A, + (q15_t)0x9BD2, (q15_t)0xB053, (q15_t)0x9BF1, (q15_t)0xB02B, + (q15_t)0x9C10, (q15_t)0xB004, (q15_t)0x9C30, (q15_t)0xAFDD, + (q15_t)0x9C4F, (q15_t)0xAFB6, (q15_t)0x9C6F, (q15_t)0xAF8F, + (q15_t)0x9C8E, (q15_t)0xAF68, (q15_t)0x9CAE, (q15_t)0xAF40, + (q15_t)0x9CCE, (q15_t)0xAF1A, (q15_t)0x9CEE, (q15_t)0xAEF3, + (q15_t)0x9D0D, (q15_t)0xAECC, (q15_t)0x9D2D, (q15_t)0xAEA5, + (q15_t)0x9D4D, (q15_t)0xAE7E, (q15_t)0x9D6D, (q15_t)0xAE57, + (q15_t)0x9D8E, (q15_t)0xAE31, (q15_t)0x9DAE, (q15_t)0xAE0A, + (q15_t)0x9DCE, (q15_t)0xADE3, (q15_t)0x9DEE, (q15_t)0xADBD, + (q15_t)0x9E0E, (q15_t)0xAD96, (q15_t)0x9E2F, (q15_t)0xAD70, + (q15_t)0x9E4F, (q15_t)0xAD4A, (q15_t)0x9E70, (q15_t)0xAD23, + (q15_t)0x9E90, (q15_t)0xACFD, (q15_t)0x9EB1, (q15_t)0xACD7, + (q15_t)0x9ED2, (q15_t)0xACB1, (q15_t)0x9EF2, (q15_t)0xAC8A, + (q15_t)0x9F13, (q15_t)0xAC64, (q15_t)0x9F34, (q15_t)0xAC3E, + (q15_t)0x9F55, (q15_t)0xAC18, (q15_t)0x9F76, (q15_t)0xABF2, + (q15_t)0x9F97, (q15_t)0xABCC, (q15_t)0x9FB8, (q15_t)0xABA7, + (q15_t)0x9FD9, (q15_t)0xAB81, (q15_t)0x9FFB, (q15_t)0xAB5B, + (q15_t)0xA01C, (q15_t)0xAB35, (q15_t)0xA03D, (q15_t)0xAB10, + (q15_t)0xA05F, (q15_t)0xAAEA, (q15_t)0xA080, (q15_t)0xAAC5, + (q15_t)0xA0A1, (q15_t)0xAA9F, (q15_t)0xA0C3, (q15_t)0xAA7A, + (q15_t)0xA0E5, (q15_t)0xAA54, (q15_t)0xA106, (q15_t)0xAA2F, + (q15_t)0xA128, (q15_t)0xAA0A, (q15_t)0xA14A, (q15_t)0xA9E5, + (q15_t)0xA16C, (q15_t)0xA9BF, (q15_t)0xA18E, (q15_t)0xA99A, + (q15_t)0xA1AF, (q15_t)0xA975, (q15_t)0xA1D2, (q15_t)0xA950, + (q15_t)0xA1F4, (q15_t)0xA92B, (q15_t)0xA216, (q15_t)0xA906, + (q15_t)0xA238, (q15_t)0xA8E2, (q15_t)0xA25A, (q15_t)0xA8BD, + (q15_t)0xA27C, (q15_t)0xA898, (q15_t)0xA29F, (q15_t)0xA873, + (q15_t)0xA2C1, (q15_t)0xA84F, (q15_t)0xA2E4, (q15_t)0xA82A, + (q15_t)0xA306, (q15_t)0xA806, (q15_t)0xA329, (q15_t)0xA7E1, + (q15_t)0xA34B, (q15_t)0xA7BD, (q15_t)0xA36E, (q15_t)0xA798, + (q15_t)0xA391, (q15_t)0xA774, (q15_t)0xA3B4, (q15_t)0xA750, + (q15_t)0xA3D6, (q15_t)0xA72B, (q15_t)0xA3F9, (q15_t)0xA707, + (q15_t)0xA41C, (q15_t)0xA6E3, (q15_t)0xA43F, (q15_t)0xA6BF, + (q15_t)0xA462, (q15_t)0xA69B, (q15_t)0xA486, (q15_t)0xA677, + (q15_t)0xA4A9, (q15_t)0xA653, (q15_t)0xA4CC, (q15_t)0xA62F, + (q15_t)0xA4EF, (q15_t)0xA60C, (q15_t)0xA513, (q15_t)0xA5E8, + (q15_t)0xA536, (q15_t)0xA5C4, (q15_t)0xA55A, (q15_t)0xA5A1, + (q15_t)0xA57D, (q15_t)0xA57D, (q15_t)0xA5A1, (q15_t)0xA55A, + (q15_t)0xA5C4, (q15_t)0xA536, (q15_t)0xA5E8, (q15_t)0xA513, + (q15_t)0xA60C, (q15_t)0xA4EF, (q15_t)0xA62F, (q15_t)0xA4CC, + (q15_t)0xA653, (q15_t)0xA4A9, (q15_t)0xA677, (q15_t)0xA486, + (q15_t)0xA69B, (q15_t)0xA462, (q15_t)0xA6BF, (q15_t)0xA43F, + (q15_t)0xA6E3, (q15_t)0xA41C, (q15_t)0xA707, (q15_t)0xA3F9, + (q15_t)0xA72B, (q15_t)0xA3D6, (q15_t)0xA750, (q15_t)0xA3B4, + (q15_t)0xA774, (q15_t)0xA391, (q15_t)0xA798, (q15_t)0xA36E, + (q15_t)0xA7BD, (q15_t)0xA34B, (q15_t)0xA7E1, (q15_t)0xA329, + (q15_t)0xA806, (q15_t)0xA306, (q15_t)0xA82A, (q15_t)0xA2E4, + (q15_t)0xA84F, (q15_t)0xA2C1, (q15_t)0xA873, (q15_t)0xA29F, + (q15_t)0xA898, (q15_t)0xA27C, (q15_t)0xA8BD, (q15_t)0xA25A, + (q15_t)0xA8E2, (q15_t)0xA238, (q15_t)0xA906, (q15_t)0xA216, + (q15_t)0xA92B, (q15_t)0xA1F4, (q15_t)0xA950, (q15_t)0xA1D2, + (q15_t)0xA975, (q15_t)0xA1AF, (q15_t)0xA99A, (q15_t)0xA18E, + (q15_t)0xA9BF, (q15_t)0xA16C, (q15_t)0xA9E5, (q15_t)0xA14A, + (q15_t)0xAA0A, (q15_t)0xA128, (q15_t)0xAA2F, (q15_t)0xA106, + (q15_t)0xAA54, (q15_t)0xA0E5, (q15_t)0xAA7A, (q15_t)0xA0C3, + (q15_t)0xAA9F, (q15_t)0xA0A1, (q15_t)0xAAC5, (q15_t)0xA080, + (q15_t)0xAAEA, (q15_t)0xA05F, (q15_t)0xAB10, (q15_t)0xA03D, + (q15_t)0xAB35, (q15_t)0xA01C, (q15_t)0xAB5B, (q15_t)0x9FFB, + (q15_t)0xAB81, (q15_t)0x9FD9, (q15_t)0xABA7, (q15_t)0x9FB8, + (q15_t)0xABCC, (q15_t)0x9F97, (q15_t)0xABF2, (q15_t)0x9F76, + (q15_t)0xAC18, (q15_t)0x9F55, (q15_t)0xAC3E, (q15_t)0x9F34, + (q15_t)0xAC64, (q15_t)0x9F13, (q15_t)0xAC8A, (q15_t)0x9EF2, + (q15_t)0xACB1, (q15_t)0x9ED2, (q15_t)0xACD7, (q15_t)0x9EB1, + (q15_t)0xACFD, (q15_t)0x9E90, (q15_t)0xAD23, (q15_t)0x9E70, + (q15_t)0xAD4A, (q15_t)0x9E4F, (q15_t)0xAD70, (q15_t)0x9E2F, + (q15_t)0xAD96, (q15_t)0x9E0E, (q15_t)0xADBD, (q15_t)0x9DEE, + (q15_t)0xADE3, (q15_t)0x9DCE, (q15_t)0xAE0A, (q15_t)0x9DAE, + (q15_t)0xAE31, (q15_t)0x9D8E, (q15_t)0xAE57, (q15_t)0x9D6D, + (q15_t)0xAE7E, (q15_t)0x9D4D, (q15_t)0xAEA5, (q15_t)0x9D2D, + (q15_t)0xAECC, (q15_t)0x9D0D, (q15_t)0xAEF3, (q15_t)0x9CEE, + (q15_t)0xAF1A, (q15_t)0x9CCE, (q15_t)0xAF40, (q15_t)0x9CAE, + (q15_t)0xAF68, (q15_t)0x9C8E, (q15_t)0xAF8F, (q15_t)0x9C6F, + (q15_t)0xAFB6, (q15_t)0x9C4F, (q15_t)0xAFDD, (q15_t)0x9C30, + (q15_t)0xB004, (q15_t)0x9C10, (q15_t)0xB02B, (q15_t)0x9BF1, + (q15_t)0xB053, (q15_t)0x9BD2, (q15_t)0xB07A, (q15_t)0x9BB2, + (q15_t)0xB0A1, (q15_t)0x9B93, (q15_t)0xB0C9, (q15_t)0x9B74, + (q15_t)0xB0F0, (q15_t)0x9B55, (q15_t)0xB118, (q15_t)0x9B36, + (q15_t)0xB140, (q15_t)0x9B17, (q15_t)0xB167, (q15_t)0x9AF8, + (q15_t)0xB18F, (q15_t)0x9AD9, (q15_t)0xB1B7, (q15_t)0x9ABA, + (q15_t)0xB1DE, (q15_t)0x9A9C, (q15_t)0xB206, (q15_t)0x9A7D, + (q15_t)0xB22E, (q15_t)0x9A5F, (q15_t)0xB256, (q15_t)0x9A40, + (q15_t)0xB27E, (q15_t)0x9A22, (q15_t)0xB2A6, (q15_t)0x9A03, + (q15_t)0xB2CE, (q15_t)0x99E5, (q15_t)0xB2F6, (q15_t)0x99C6, + (q15_t)0xB31E, (q15_t)0x99A8, (q15_t)0xB347, (q15_t)0x998A, + (q15_t)0xB36F, (q15_t)0x996C, (q15_t)0xB397, (q15_t)0x994E, + (q15_t)0xB3C0, (q15_t)0x9930, (q15_t)0xB3E8, (q15_t)0x9912, + (q15_t)0xB410, (q15_t)0x98F4, (q15_t)0xB439, (q15_t)0x98D6, + (q15_t)0xB461, (q15_t)0x98B9, (q15_t)0xB48A, (q15_t)0x989B, + (q15_t)0xB4B3, (q15_t)0x987D, (q15_t)0xB4DB, (q15_t)0x9860, + (q15_t)0xB504, (q15_t)0x9842, (q15_t)0xB52D, (q15_t)0x9825, + (q15_t)0xB556, (q15_t)0x9808, (q15_t)0xB57E, (q15_t)0x97EA, + (q15_t)0xB5A7, (q15_t)0x97CD, (q15_t)0xB5D0, (q15_t)0x97B0, + (q15_t)0xB5F9, (q15_t)0x9793, (q15_t)0xB622, (q15_t)0x9776, + (q15_t)0xB64B, (q15_t)0x9759, (q15_t)0xB675, (q15_t)0x973C, + (q15_t)0xB69E, (q15_t)0x971F, (q15_t)0xB6C7, (q15_t)0x9702, + (q15_t)0xB6F0, (q15_t)0x96E6, (q15_t)0xB719, (q15_t)0x96C9, + (q15_t)0xB743, (q15_t)0x96AC, (q15_t)0xB76C, (q15_t)0x9690, + (q15_t)0xB796, (q15_t)0x9673, (q15_t)0xB7BF, (q15_t)0x9657, + (q15_t)0xB7E9, (q15_t)0x963B, (q15_t)0xB812, (q15_t)0x961E, + (q15_t)0xB83C, (q15_t)0x9602, (q15_t)0xB865, (q15_t)0x95E6, + (q15_t)0xB88F, (q15_t)0x95CA, (q15_t)0xB8B9, (q15_t)0x95AE, + (q15_t)0xB8E3, (q15_t)0x9592, (q15_t)0xB90C, (q15_t)0x9576, + (q15_t)0xB936, (q15_t)0x955A, (q15_t)0xB960, (q15_t)0x953E, + (q15_t)0xB98A, (q15_t)0x9523, (q15_t)0xB9B4, (q15_t)0x9507, + (q15_t)0xB9DE, (q15_t)0x94EC, (q15_t)0xBA08, (q15_t)0x94D0, + (q15_t)0xBA32, (q15_t)0x94B5, (q15_t)0xBA5C, (q15_t)0x9499, + (q15_t)0xBA87, (q15_t)0x947E, (q15_t)0xBAB1, (q15_t)0x9463, + (q15_t)0xBADB, (q15_t)0x9447, (q15_t)0xBB05, (q15_t)0x942C, + (q15_t)0xBB30, (q15_t)0x9411, (q15_t)0xBB5A, (q15_t)0x93F6, + (q15_t)0xBB85, (q15_t)0x93DB, (q15_t)0xBBAF, (q15_t)0x93C0, + (q15_t)0xBBDA, (q15_t)0x93A6, (q15_t)0xBC04, (q15_t)0x938B, + (q15_t)0xBC2F, (q15_t)0x9370, (q15_t)0xBC5A, (q15_t)0x9356, + (q15_t)0xBC84, (q15_t)0x933B, (q15_t)0xBCAF, (q15_t)0x9321, + (q15_t)0xBCDA, (q15_t)0x9306, (q15_t)0xBD05, (q15_t)0x92EC, + (q15_t)0xBD2F, (q15_t)0x92D2, (q15_t)0xBD5A, (q15_t)0x92B7, + (q15_t)0xBD85, (q15_t)0x929D, (q15_t)0xBDB0, (q15_t)0x9283, + (q15_t)0xBDDB, (q15_t)0x9269, (q15_t)0xBE06, (q15_t)0x924F, + (q15_t)0xBE31, (q15_t)0x9235, (q15_t)0xBE5D, (q15_t)0x921C, + (q15_t)0xBE88, (q15_t)0x9202, (q15_t)0xBEB3, (q15_t)0x91E8, + (q15_t)0xBEDE, (q15_t)0x91CF, (q15_t)0xBF09, (q15_t)0x91B5, + (q15_t)0xBF35, (q15_t)0x919C, (q15_t)0xBF60, (q15_t)0x9182, + (q15_t)0xBF8C, (q15_t)0x9169, (q15_t)0xBFB7, (q15_t)0x9150, + (q15_t)0xBFE2, (q15_t)0x9136, (q15_t)0xC00E, (q15_t)0x911D, + (q15_t)0xC03A, (q15_t)0x9104, (q15_t)0xC065, (q15_t)0x90EB, + (q15_t)0xC091, (q15_t)0x90D2, (q15_t)0xC0BC, (q15_t)0x90B9, + (q15_t)0xC0E8, (q15_t)0x90A0, (q15_t)0xC114, (q15_t)0x9088, + (q15_t)0xC140, (q15_t)0x906F, (q15_t)0xC16C, (q15_t)0x9056, + (q15_t)0xC197, (q15_t)0x903E, (q15_t)0xC1C3, (q15_t)0x9025, + (q15_t)0xC1EF, (q15_t)0x900D, (q15_t)0xC21B, (q15_t)0x8FF5, + (q15_t)0xC247, (q15_t)0x8FDC, (q15_t)0xC273, (q15_t)0x8FC4, + (q15_t)0xC29F, (q15_t)0x8FAC, (q15_t)0xC2CC, (q15_t)0x8F94, + (q15_t)0xC2F8, (q15_t)0x8F7C, (q15_t)0xC324, (q15_t)0x8F64, + (q15_t)0xC350, (q15_t)0x8F4C, (q15_t)0xC37C, (q15_t)0x8F34, + (q15_t)0xC3A9, (q15_t)0x8F1D, (q15_t)0xC3D5, (q15_t)0x8F05, + (q15_t)0xC402, (q15_t)0x8EED, (q15_t)0xC42E, (q15_t)0x8ED6, + (q15_t)0xC45A, (q15_t)0x8EBE, (q15_t)0xC487, (q15_t)0x8EA7, + (q15_t)0xC4B3, (q15_t)0x8E90, (q15_t)0xC4E0, (q15_t)0x8E79, + (q15_t)0xC50D, (q15_t)0x8E61, (q15_t)0xC539, (q15_t)0x8E4A, + (q15_t)0xC566, (q15_t)0x8E33, (q15_t)0xC593, (q15_t)0x8E1C, + (q15_t)0xC5BF, (q15_t)0x8E05, (q15_t)0xC5EC, (q15_t)0x8DEE, + (q15_t)0xC619, (q15_t)0x8DD8, (q15_t)0xC646, (q15_t)0x8DC1, + (q15_t)0xC673, (q15_t)0x8DAA, (q15_t)0xC6A0, (q15_t)0x8D94, + (q15_t)0xC6CD, (q15_t)0x8D7D, (q15_t)0xC6F9, (q15_t)0x8D67, + (q15_t)0xC727, (q15_t)0x8D50, (q15_t)0xC754, (q15_t)0x8D3A, + (q15_t)0xC781, (q15_t)0x8D24, (q15_t)0xC7AE, (q15_t)0x8D0E, + (q15_t)0xC7DB, (q15_t)0x8CF8, (q15_t)0xC808, (q15_t)0x8CE2, + (q15_t)0xC835, (q15_t)0x8CCC, (q15_t)0xC863, (q15_t)0x8CB6, + (q15_t)0xC890, (q15_t)0x8CA0, (q15_t)0xC8BD, (q15_t)0x8C8A, + (q15_t)0xC8EB, (q15_t)0x8C75, (q15_t)0xC918, (q15_t)0x8C5F, + (q15_t)0xC945, (q15_t)0x8C4A, (q15_t)0xC973, (q15_t)0x8C34, + (q15_t)0xC9A0, (q15_t)0x8C1F, (q15_t)0xC9CE, (q15_t)0x8C09, + (q15_t)0xC9FB, (q15_t)0x8BF4, (q15_t)0xCA29, (q15_t)0x8BDF, + (q15_t)0xCA57, (q15_t)0x8BCA, (q15_t)0xCA84, (q15_t)0x8BB5, + (q15_t)0xCAB2, (q15_t)0x8BA0, (q15_t)0xCAE0, (q15_t)0x8B8B, + (q15_t)0xCB0D, (q15_t)0x8B76, (q15_t)0xCB3B, (q15_t)0x8B61, + (q15_t)0xCB69, (q15_t)0x8B4D, (q15_t)0xCB97, (q15_t)0x8B38, + (q15_t)0xCBC5, (q15_t)0x8B24, (q15_t)0xCBF3, (q15_t)0x8B0F, + (q15_t)0xCC21, (q15_t)0x8AFB, (q15_t)0xCC4F, (q15_t)0x8AE6, + (q15_t)0xCC7D, (q15_t)0x8AD2, (q15_t)0xCCAB, (q15_t)0x8ABE, + (q15_t)0xCCD9, (q15_t)0x8AAA, (q15_t)0xCD07, (q15_t)0x8A96, + (q15_t)0xCD35, (q15_t)0x8A82, (q15_t)0xCD63, (q15_t)0x8A6E, + (q15_t)0xCD91, (q15_t)0x8A5A, (q15_t)0xCDBF, (q15_t)0x8A46, + (q15_t)0xCDEE, (q15_t)0x8A33, (q15_t)0xCE1C, (q15_t)0x8A1F, + (q15_t)0xCE4A, (q15_t)0x8A0B, (q15_t)0xCE79, (q15_t)0x89F8, + (q15_t)0xCEA7, (q15_t)0x89E4, (q15_t)0xCED5, (q15_t)0x89D1, + (q15_t)0xCF04, (q15_t)0x89BE, (q15_t)0xCF32, (q15_t)0x89AB, + (q15_t)0xCF61, (q15_t)0x8997, (q15_t)0xCF8F, (q15_t)0x8984, + (q15_t)0xCFBE, (q15_t)0x8971, (q15_t)0xCFEC, (q15_t)0x895F, + (q15_t)0xD01B, (q15_t)0x894C, (q15_t)0xD04A, (q15_t)0x8939, + (q15_t)0xD078, (q15_t)0x8926, (q15_t)0xD0A7, (q15_t)0x8914, + (q15_t)0xD0D6, (q15_t)0x8901, (q15_t)0xD104, (q15_t)0x88EF, + (q15_t)0xD133, (q15_t)0x88DC, (q15_t)0xD162, (q15_t)0x88CA, + (q15_t)0xD191, (q15_t)0x88B8, (q15_t)0xD1C0, (q15_t)0x88A5, + (q15_t)0xD1EE, (q15_t)0x8893, (q15_t)0xD21D, (q15_t)0x8881, + (q15_t)0xD24C, (q15_t)0x886F, (q15_t)0xD27B, (q15_t)0x885D, + (q15_t)0xD2AA, (q15_t)0x884B, (q15_t)0xD2D9, (q15_t)0x883A, + (q15_t)0xD308, (q15_t)0x8828, (q15_t)0xD337, (q15_t)0x8816, + (q15_t)0xD367, (q15_t)0x8805, (q15_t)0xD396, (q15_t)0x87F3, + (q15_t)0xD3C5, (q15_t)0x87E2, (q15_t)0xD3F4, (q15_t)0x87D1, + (q15_t)0xD423, (q15_t)0x87BF, (q15_t)0xD452, (q15_t)0x87AE, + (q15_t)0xD482, (q15_t)0x879D, (q15_t)0xD4B1, (q15_t)0x878C, + (q15_t)0xD4E0, (q15_t)0x877B, (q15_t)0xD510, (q15_t)0x876A, + (q15_t)0xD53F, (q15_t)0x8759, (q15_t)0xD56E, (q15_t)0x8749, + (q15_t)0xD59E, (q15_t)0x8738, (q15_t)0xD5CD, (q15_t)0x8727, + (q15_t)0xD5FD, (q15_t)0x8717, (q15_t)0xD62C, (q15_t)0x8706, + (q15_t)0xD65C, (q15_t)0x86F6, (q15_t)0xD68B, (q15_t)0x86E6, + (q15_t)0xD6BB, (q15_t)0x86D5, (q15_t)0xD6EA, (q15_t)0x86C5, + (q15_t)0xD71A, (q15_t)0x86B5, (q15_t)0xD74A, (q15_t)0x86A5, + (q15_t)0xD779, (q15_t)0x8695, (q15_t)0xD7A9, (q15_t)0x8685, + (q15_t)0xD7D9, (q15_t)0x8675, (q15_t)0xD809, (q15_t)0x8666, + (q15_t)0xD838, (q15_t)0x8656, (q15_t)0xD868, (q15_t)0x8646, + (q15_t)0xD898, (q15_t)0x8637, (q15_t)0xD8C8, (q15_t)0x8627, + (q15_t)0xD8F8, (q15_t)0x8618, (q15_t)0xD927, (q15_t)0x8609, + (q15_t)0xD957, (q15_t)0x85FA, (q15_t)0xD987, (q15_t)0x85EA, + (q15_t)0xD9B7, (q15_t)0x85DB, (q15_t)0xD9E7, (q15_t)0x85CC, + (q15_t)0xDA17, (q15_t)0x85BD, (q15_t)0xDA47, (q15_t)0x85AF, + (q15_t)0xDA77, (q15_t)0x85A0, (q15_t)0xDAA7, (q15_t)0x8591, + (q15_t)0xDAD7, (q15_t)0x8582, (q15_t)0xDB08, (q15_t)0x8574, + (q15_t)0xDB38, (q15_t)0x8565, (q15_t)0xDB68, (q15_t)0x8557, + (q15_t)0xDB98, (q15_t)0x8549, (q15_t)0xDBC8, (q15_t)0x853A, + (q15_t)0xDBF8, (q15_t)0x852C, (q15_t)0xDC29, (q15_t)0x851E, + (q15_t)0xDC59, (q15_t)0x8510, (q15_t)0xDC89, (q15_t)0x8502, + (q15_t)0xDCBA, (q15_t)0x84F4, (q15_t)0xDCEA, (q15_t)0x84E6, + (q15_t)0xDD1A, (q15_t)0x84D9, (q15_t)0xDD4B, (q15_t)0x84CB, + (q15_t)0xDD7B, (q15_t)0x84BD, (q15_t)0xDDAB, (q15_t)0x84B0, + (q15_t)0xDDDC, (q15_t)0x84A2, (q15_t)0xDE0C, (q15_t)0x8495, + (q15_t)0xDE3D, (q15_t)0x8488, (q15_t)0xDE6D, (q15_t)0x847B, + (q15_t)0xDE9E, (q15_t)0x846D, (q15_t)0xDECE, (q15_t)0x8460, + (q15_t)0xDEFF, (q15_t)0x8453, (q15_t)0xDF2F, (q15_t)0x8446, + (q15_t)0xDF60, (q15_t)0x843A, (q15_t)0xDF91, (q15_t)0x842D, + (q15_t)0xDFC1, (q15_t)0x8420, (q15_t)0xDFF2, (q15_t)0x8414, + (q15_t)0xE023, (q15_t)0x8407, (q15_t)0xE053, (q15_t)0x83FA, + (q15_t)0xE084, (q15_t)0x83EE, (q15_t)0xE0B5, (q15_t)0x83E2, + (q15_t)0xE0E6, (q15_t)0x83D6, (q15_t)0xE116, (q15_t)0x83C9, + (q15_t)0xE147, (q15_t)0x83BD, (q15_t)0xE178, (q15_t)0x83B1, + (q15_t)0xE1A9, (q15_t)0x83A5, (q15_t)0xE1DA, (q15_t)0x8399, + (q15_t)0xE20A, (q15_t)0x838E, (q15_t)0xE23B, (q15_t)0x8382, + (q15_t)0xE26C, (q15_t)0x8376, (q15_t)0xE29D, (q15_t)0x836B, + (q15_t)0xE2CE, (q15_t)0x835F, (q15_t)0xE2FF, (q15_t)0x8354, + (q15_t)0xE330, (q15_t)0x8348, (q15_t)0xE361, (q15_t)0x833D, + (q15_t)0xE392, (q15_t)0x8332, (q15_t)0xE3C3, (q15_t)0x8327, + (q15_t)0xE3F4, (q15_t)0x831C, (q15_t)0xE425, (q15_t)0x8311, + (q15_t)0xE456, (q15_t)0x8306, (q15_t)0xE487, (q15_t)0x82FB, + (q15_t)0xE4B8, (q15_t)0x82F0, (q15_t)0xE4E9, (q15_t)0x82E6, + (q15_t)0xE51B, (q15_t)0x82DB, (q15_t)0xE54C, (q15_t)0x82D0, + (q15_t)0xE57D, (q15_t)0x82C6, (q15_t)0xE5AE, (q15_t)0x82BC, + (q15_t)0xE5DF, (q15_t)0x82B1, (q15_t)0xE610, (q15_t)0x82A7, + (q15_t)0xE642, (q15_t)0x829D, (q15_t)0xE673, (q15_t)0x8293, + (q15_t)0xE6A4, (q15_t)0x8289, (q15_t)0xE6D5, (q15_t)0x827F, + (q15_t)0xE707, (q15_t)0x8275, (q15_t)0xE738, (q15_t)0x826B, + (q15_t)0xE769, (q15_t)0x8262, (q15_t)0xE79B, (q15_t)0x8258, + (q15_t)0xE7CC, (q15_t)0x824F, (q15_t)0xE7FD, (q15_t)0x8245, + (q15_t)0xE82F, (q15_t)0x823C, (q15_t)0xE860, (q15_t)0x8232, + (q15_t)0xE892, (q15_t)0x8229, (q15_t)0xE8C3, (q15_t)0x8220, + (q15_t)0xE8F5, (q15_t)0x8217, (q15_t)0xE926, (q15_t)0x820E, + (q15_t)0xE957, (q15_t)0x8205, (q15_t)0xE989, (q15_t)0x81FC, + (q15_t)0xE9BA, (q15_t)0x81F3, (q15_t)0xE9EC, (q15_t)0x81EB, + (q15_t)0xEA1D, (q15_t)0x81E2, (q15_t)0xEA4F, (q15_t)0x81D9, + (q15_t)0xEA80, (q15_t)0x81D1, (q15_t)0xEAB2, (q15_t)0x81C8, + (q15_t)0xEAE4, (q15_t)0x81C0, (q15_t)0xEB15, (q15_t)0x81B8, + (q15_t)0xEB47, (q15_t)0x81B0, (q15_t)0xEB78, (q15_t)0x81A8, + (q15_t)0xEBAA, (q15_t)0x81A0, (q15_t)0xEBDC, (q15_t)0x8198, + (q15_t)0xEC0D, (q15_t)0x8190, (q15_t)0xEC3F, (q15_t)0x8188, + (q15_t)0xEC71, (q15_t)0x8180, (q15_t)0xECA2, (q15_t)0x8179, + (q15_t)0xECD4, (q15_t)0x8171, (q15_t)0xED06, (q15_t)0x816A, + (q15_t)0xED37, (q15_t)0x8162, (q15_t)0xED69, (q15_t)0x815B, + (q15_t)0xED9B, (q15_t)0x8154, (q15_t)0xEDCD, (q15_t)0x814C, + (q15_t)0xEDFE, (q15_t)0x8145, (q15_t)0xEE30, (q15_t)0x813E, + (q15_t)0xEE62, (q15_t)0x8137, (q15_t)0xEE94, (q15_t)0x8130, + (q15_t)0xEEC6, (q15_t)0x812A, (q15_t)0xEEF7, (q15_t)0x8123, + (q15_t)0xEF29, (q15_t)0x811C, (q15_t)0xEF5B, (q15_t)0x8116, + (q15_t)0xEF8D, (q15_t)0x810F, (q15_t)0xEFBF, (q15_t)0x8109, + (q15_t)0xEFF1, (q15_t)0x8102, (q15_t)0xF022, (q15_t)0x80FC, + (q15_t)0xF054, (q15_t)0x80F6, (q15_t)0xF086, (q15_t)0x80F0, + (q15_t)0xF0B8, (q15_t)0x80EA, (q15_t)0xF0EA, (q15_t)0x80E4, + (q15_t)0xF11C, (q15_t)0x80DE, (q15_t)0xF14E, (q15_t)0x80D8, + (q15_t)0xF180, (q15_t)0x80D2, (q15_t)0xF1B2, (q15_t)0x80CD, + (q15_t)0xF1E4, (q15_t)0x80C7, (q15_t)0xF216, (q15_t)0x80C2, + (q15_t)0xF248, (q15_t)0x80BC, (q15_t)0xF27A, (q15_t)0x80B7, + (q15_t)0xF2AC, (q15_t)0x80B2, (q15_t)0xF2DE, (q15_t)0x80AC, + (q15_t)0xF310, (q15_t)0x80A7, (q15_t)0xF342, (q15_t)0x80A2, + (q15_t)0xF374, (q15_t)0x809D, (q15_t)0xF3A6, (q15_t)0x8098, + (q15_t)0xF3D8, (q15_t)0x8094, (q15_t)0xF40A, (q15_t)0x808F, + (q15_t)0xF43C, (q15_t)0x808A, (q15_t)0xF46E, (q15_t)0x8086, + (q15_t)0xF4A0, (q15_t)0x8081, (q15_t)0xF4D2, (q15_t)0x807D, + (q15_t)0xF504, (q15_t)0x8078, (q15_t)0xF536, (q15_t)0x8074, + (q15_t)0xF568, (q15_t)0x8070, (q15_t)0xF59A, (q15_t)0x806C, + (q15_t)0xF5CC, (q15_t)0x8068, (q15_t)0xF5FF, (q15_t)0x8064, + (q15_t)0xF631, (q15_t)0x8060, (q15_t)0xF663, (q15_t)0x805C, + (q15_t)0xF695, (q15_t)0x8058, (q15_t)0xF6C7, (q15_t)0x8055, + (q15_t)0xF6F9, (q15_t)0x8051, (q15_t)0xF72B, (q15_t)0x804E, + (q15_t)0xF75D, (q15_t)0x804A, (q15_t)0xF790, (q15_t)0x8047, + (q15_t)0xF7C2, (q15_t)0x8043, (q15_t)0xF7F4, (q15_t)0x8040, + (q15_t)0xF826, (q15_t)0x803D, (q15_t)0xF858, (q15_t)0x803A, + (q15_t)0xF88A, (q15_t)0x8037, (q15_t)0xF8BD, (q15_t)0x8034, + (q15_t)0xF8EF, (q15_t)0x8031, (q15_t)0xF921, (q15_t)0x802F, + (q15_t)0xF953, (q15_t)0x802C, (q15_t)0xF985, (q15_t)0x8029, + (q15_t)0xF9B8, (q15_t)0x8027, (q15_t)0xF9EA, (q15_t)0x8025, + (q15_t)0xFA1C, (q15_t)0x8022, (q15_t)0xFA4E, (q15_t)0x8020, + (q15_t)0xFA80, (q15_t)0x801E, (q15_t)0xFAB3, (q15_t)0x801C, + (q15_t)0xFAE5, (q15_t)0x801A, (q15_t)0xFB17, (q15_t)0x8018, + (q15_t)0xFB49, (q15_t)0x8016, (q15_t)0xFB7C, (q15_t)0x8014, + (q15_t)0xFBAE, (q15_t)0x8012, (q15_t)0xFBE0, (q15_t)0x8011, + (q15_t)0xFC12, (q15_t)0x800F, (q15_t)0xFC45, (q15_t)0x800D, + (q15_t)0xFC77, (q15_t)0x800C, (q15_t)0xFCA9, (q15_t)0x800B, + (q15_t)0xFCDB, (q15_t)0x8009, (q15_t)0xFD0E, (q15_t)0x8008, + (q15_t)0xFD40, (q15_t)0x8007, (q15_t)0xFD72, (q15_t)0x8006, + (q15_t)0xFDA4, (q15_t)0x8005, (q15_t)0xFDD7, (q15_t)0x8004, + (q15_t)0xFE09, (q15_t)0x8003, (q15_t)0xFE3B, (q15_t)0x8003, + (q15_t)0xFE6D, (q15_t)0x8002, (q15_t)0xFEA0, (q15_t)0x8001, + (q15_t)0xFED2, (q15_t)0x8001, (q15_t)0xFF04, (q15_t)0x8000, + (q15_t)0xFF36, (q15_t)0x8000, (q15_t)0xFF69, (q15_t)0x8000, + (q15_t)0xFF9B, (q15_t)0x8000, (q15_t)0xFFCD, (q15_t)0x8000 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +/** + @} end of CFFT_CIFFT group +*/ + + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_16) + +const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH] = +{ + /* 8x2, size 20 */ + 8,64, 24,72, 16,64, 40,80, 32,64, 56,88, 48,72, 88,104, 72,96, 104,112 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_32) + +const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH] = +{ + /* 8x4, size 48 */ + 8,64, 16,128, 24,192, 32,64, 40,72, 48,136, 56,200, 64,128, 72,80, 88,208, + 80,144, 96,192, 104,208, 112,152, 120,216, 136,192, 144,160, 168,208, + 152,224, 176,208, 184,232, 216,240, 200,224, 232,240 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_64) + +const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH] = +{ + /* radix 8, size 56 */ + 8,64, 16,128, 24,192, 32,256, 40,320, 48,384, 56,448, 80,136, 88,200, + 96,264, 104,328, 112,392, 120,456, 152,208, 160,272, 168,336, 176,400, + 184,464, 224,280, 232,344, 240,408, 248,472, 296,352, 304,416, 312,480, + 368,424, 376,488, 440,496 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_128) + +const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH] = +{ + /* 8x2, size 208 */ + 8,512, 16,64, 24,576, 32,128, 40,640, 48,192, 56,704, 64,256, 72,768, + 80,320, 88,832, 96,384, 104,896, 112,448, 120,960, 128,512, 136,520, + 144,768, 152,584, 160,520, 168,648, 176,200, 184,712, 192,264, 200,776, + 208,328, 216,840, 224,392, 232,904, 240,456, 248,968, 264,528, 272,320, + 280,592, 288,768, 296,656, 304,328, 312,720, 328,784, 344,848, 352,400, + 360,912, 368,464, 376,976, 384,576, 392,536, 400,832, 408,600, 416,584, + 424,664, 432,840, 440,728, 448,592, 456,792, 464,848, 472,856, 480,600, + 488,920, 496,856, 504,984, 520,544, 528,576, 536,608, 552,672, 560,608, + 568,736, 576,768, 584,800, 592,832, 600,864, 608,800, 616,928, 624,864, + 632,992, 648,672, 656,896, 664,928, 688,904, 696,744, 704,896, 712,808, + 720,912, 728,872, 736,928, 744,936, 752,920, 760,1000, 776,800, 784,832, + 792,864, 808,904, 816,864, 824,920, 840,864, 856,880, 872,944, 888,1008, + 904,928, 912,960, 920,992, 944,968, 952,1000, 968,992, 984,1008 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_256) + +const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH] = +{ + /* 8x4, size 440 */ + 8,512, 16,1024, 24,1536, 32,64, 40,576, 48,1088, 56,1600, 64,128, 72,640, + 80,1152, 88,1664, 96,192, 104,704, 112,1216, 120,1728, 128,256, 136,768, + 144,1280, 152,1792, 160,320, 168,832, 176,1344, 184,1856, 192,384, + 200,896, 208,1408, 216,1920, 224,448, 232,960, 240,1472, 248,1984, + 256,512, 264,520, 272,1032, 280,1544, 288,640, 296,584, 304,1096, 312,1608, + 320,768, 328,648, 336,1160, 344,1672, 352,896, 360,712, 368,1224, 376,1736, + 384,520, 392,776, 400,1288, 408,1800, 416,648, 424,840, 432,1352, 440,1864, + 448,776, 456,904, 464,1416, 472,1928, 480,904, 488,968, 496,1480, 504,1992, + 520,528, 512,1024, 528,1040, 536,1552, 544,1152, 552,592, 560,1104, + 568,1616, 576,1280, 584,656, 592,1168, 600,1680, 608,1408, 616,720, + 624,1232, 632,1744, 640,1032, 648,784, 656,1296, 664,1808, 672,1160, + 680,848, 688,1360, 696,1872, 704,1288, 712,912, 720,1424, 728,1936, + 736,1416, 744,976, 752,1488, 760,2000, 768,1536, 776,1552, 784,1048, + 792,1560, 800,1664, 808,1680, 816,1112, 824,1624, 832,1792, 840,1808, + 848,1176, 856,1688, 864,1920, 872,1936, 880,1240, 888,1752, 896,1544, + 904,1560, 912,1304, 920,1816, 928,1672, 936,1688, 944,1368, 952,1880, + 960,1800, 968,1816, 976,1432, 984,1944, 992,1928, 1000,1944, 1008,1496, + 1016,2008, 1032,1152, 1040,1056, 1048,1568, 1064,1408, 1072,1120, + 1080,1632, 1088,1536, 1096,1160, 1104,1184, 1112,1696, 1120,1552, + 1128,1416, 1136,1248, 1144,1760, 1160,1664, 1168,1312, 1176,1824, + 1184,1544, 1192,1920, 1200,1376, 1208,1888, 1216,1568, 1224,1672, + 1232,1440, 1240,1952, 1248,1560, 1256,1928, 1264,1504, 1272,2016, + 1288,1312, 1296,1408, 1304,1576, 1320,1424, 1328,1416, 1336,1640, + 1344,1792, 1352,1824, 1360,1920, 1368,1704, 1376,1800, 1384,1432, + 1392,1928, 1400,1768, 1416,1680, 1432,1832, 1440,1576, 1448,1936, + 1456,1832, 1464,1896, 1472,1808, 1480,1688, 1488,1936, 1496,1960, + 1504,1816, 1512,1944, 1520,1944, 1528,2024, 1560,1584, 1592,1648, + 1600,1792, 1608,1920, 1616,1800, 1624,1712, 1632,1808, 1640,1936, + 1648,1816, 1656,1776, 1672,1696, 1688,1840, 1704,1952, 1712,1928, + 1720,1904, 1728,1824, 1736,1952, 1744,1832, 1752,1968, 1760,1840, + 1768,1960, 1776,1944, 1784,2032, 1864,1872, 1848,1944, 1872,1888, + 1880,1904, 1888,1984, 1896,2000, 1912,2032, 1904,2016, 1976,2032, + 1960,1968, 2008,2032, 1992,2016, 2024,2032 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_512) + +const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH] = +{ + /* radix 8, size 448 */ + 8,512, 16,1024, 24,1536, 32,2048, 40,2560, 48,3072, 56,3584, 72,576, + 80,1088, 88,1600, 96,2112, 104,2624, 112,3136, 120,3648, 136,640, 144,1152, + 152,1664, 160,2176, 168,2688, 176,3200, 184,3712, 200,704, 208,1216, + 216,1728, 224,2240, 232,2752, 240,3264, 248,3776, 264,768, 272,1280, + 280,1792, 288,2304, 296,2816, 304,3328, 312,3840, 328,832, 336,1344, + 344,1856, 352,2368, 360,2880, 368,3392, 376,3904, 392,896, 400,1408, + 408,1920, 416,2432, 424,2944, 432,3456, 440,3968, 456,960, 464,1472, + 472,1984, 480,2496, 488,3008, 496,3520, 504,4032, 528,1032, 536,1544, + 544,2056, 552,2568, 560,3080, 568,3592, 592,1096, 600,1608, 608,2120, + 616,2632, 624,3144, 632,3656, 656,1160, 664,1672, 672,2184, 680,2696, + 688,3208, 696,3720, 720,1224, 728,1736, 736,2248, 744,2760, 752,3272, + 760,3784, 784,1288, 792,1800, 800,2312, 808,2824, 816,3336, 824,3848, + 848,1352, 856,1864, 864,2376, 872,2888, 880,3400, 888,3912, 912,1416, + 920,1928, 928,2440, 936,2952, 944,3464, 952,3976, 976,1480, 984,1992, + 992,2504, 1000,3016, 1008,3528, 1016,4040, 1048,1552, 1056,2064, 1064,2576, + 1072,3088, 1080,3600, 1112,1616, 1120,2128, 1128,2640, 1136,3152, + 1144,3664, 1176,1680, 1184,2192, 1192,2704, 1200,3216, 1208,3728, + 1240,1744, 1248,2256, 1256,2768, 1264,3280, 1272,3792, 1304,1808, + 1312,2320, 1320,2832, 1328,3344, 1336,3856, 1368,1872, 1376,2384, + 1384,2896, 1392,3408, 1400,3920, 1432,1936, 1440,2448, 1448,2960, + 1456,3472, 1464,3984, 1496,2000, 1504,2512, 1512,3024, 1520,3536, + 1528,4048, 1568,2072, 1576,2584, 1584,3096, 1592,3608, 1632,2136, + 1640,2648, 1648,3160, 1656,3672, 1696,2200, 1704,2712, 1712,3224, + 1720,3736, 1760,2264, 1768,2776, 1776,3288, 1784,3800, 1824,2328, + 1832,2840, 1840,3352, 1848,3864, 1888,2392, 1896,2904, 1904,3416, + 1912,3928, 1952,2456, 1960,2968, 1968,3480, 1976,3992, 2016,2520, + 2024,3032, 2032,3544, 2040,4056, 2088,2592, 2096,3104, 2104,3616, + 2152,2656, 2160,3168, 2168,3680, 2216,2720, 2224,3232, 2232,3744, + 2280,2784, 2288,3296, 2296,3808, 2344,2848, 2352,3360, 2360,3872, + 2408,2912, 2416,3424, 2424,3936, 2472,2976, 2480,3488, 2488,4000, + 2536,3040, 2544,3552, 2552,4064, 2608,3112, 2616,3624, 2672,3176, + 2680,3688, 2736,3240, 2744,3752, 2800,3304, 2808,3816, 2864,3368, + 2872,3880, 2928,3432, 2936,3944, 2992,3496, 3000,4008, 3056,3560, + 3064,4072, 3128,3632, 3192,3696, 3256,3760, 3320,3824, 3384,3888, + 3448,3952, 3512,4016, 3576,4080 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_1024) + +const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH] = +{ + /* 8x2, size 1800 */ + 8,4096, 16,512, 24,4608, 32,1024, 40,5120, 48,1536, 56,5632, 64,2048, + 72,6144, 80,2560, 88,6656, 96,3072, 104,7168, 112,3584, 120,7680, 128,2048, + 136,4160, 144,576, 152,4672, 160,1088, 168,5184, 176,1600, 184,5696, + 192,2112, 200,6208, 208,2624, 216,6720, 224,3136, 232,7232, 240,3648, + 248,7744, 256,2048, 264,4224, 272,640, 280,4736, 288,1152, 296,5248, + 304,1664, 312,5760, 320,2176, 328,6272, 336,2688, 344,6784, 352,3200, + 360,7296, 368,3712, 376,7808, 384,2112, 392,4288, 400,704, 408,4800, + 416,1216, 424,5312, 432,1728, 440,5824, 448,2240, 456,6336, 464,2752, + 472,6848, 480,3264, 488,7360, 496,3776, 504,7872, 512,2048, 520,4352, + 528,768, 536,4864, 544,1280, 552,5376, 560,1792, 568,5888, 576,2304, + 584,6400, 592,2816, 600,6912, 608,3328, 616,7424, 624,3840, 632,7936, + 640,2176, 648,4416, 656,832, 664,4928, 672,1344, 680,5440, 688,1856, + 696,5952, 704,2368, 712,6464, 720,2880, 728,6976, 736,3392, 744,7488, + 752,3904, 760,8000, 768,2112, 776,4480, 784,896, 792,4992, 800,1408, + 808,5504, 816,1920, 824,6016, 832,2432, 840,6528, 848,2944, 856,7040, + 864,3456, 872,7552, 880,3968, 888,8064, 896,2240, 904,4544, 912,960, + 920,5056, 928,1472, 936,5568, 944,1984, 952,6080, 960,2496, 968,6592, + 976,3008, 984,7104, 992,3520, 1000,7616, 1008,4032, 1016,8128, 1024,4096, + 1032,4104, 1040,4352, 1048,4616, 1056,4104, 1064,5128, 1072,1544, + 1080,5640, 1088,2056, 1096,6152, 1104,2568, 1112,6664, 1120,3080, + 1128,7176, 1136,3592, 1144,7688, 1152,6144, 1160,4168, 1168,6400, + 1176,4680, 1184,6152, 1192,5192, 1200,1608, 1208,5704, 1216,2120, + 1224,6216, 1232,2632, 1240,6728, 1248,3144, 1256,7240, 1264,3656, + 1272,7752, 1280,4160, 1288,4232, 1296,4416, 1304,4744, 1312,4168, + 1320,5256, 1328,1672, 1336,5768, 1344,2184, 1352,6280, 1360,2696, + 1368,6792, 1376,3208, 1384,7304, 1392,3720, 1400,7816, 1408,6208, + 1416,4296, 1424,6464, 1432,4808, 1440,6216, 1448,5320, 1456,1736, + 1464,5832, 1472,2248, 1480,6344, 1488,2760, 1496,6856, 1504,3272, + 1512,7368, 1520,3784, 1528,7880, 1536,4224, 1544,4360, 1552,4480, + 1560,4872, 1568,4232, 1576,5384, 1584,1800, 1592,5896, 1600,2312, + 1608,6408, 1616,2824, 1624,6920, 1632,3336, 1640,7432, 1648,3848, + 1656,7944, 1664,6272, 1672,4424, 1680,6528, 1688,4936, 1696,6280, + 1704,5448, 1712,1864, 1720,5960, 1728,2376, 1736,6472, 1744,2888, + 1752,6984, 1760,3400, 1768,7496, 1776,3912, 1784,8008, 1792,4288, + 1800,4488, 1808,4544, 1816,5000, 1824,4296, 1832,5512, 1840,1928, + 1848,6024, 1856,2440, 1864,6536, 1872,2952, 1880,7048, 1888,3464, + 1896,7560, 1904,3976, 1912,8072, 1920,6336, 1928,4552, 1936,6592, + 1944,5064, 1952,6344, 1960,5576, 1968,1992, 1976,6088, 1984,2504, + 1992,6600, 2000,3016, 2008,7112, 2016,3528, 2024,7624, 2032,4040, + 2040,8136, 2056,4112, 2064,2112, 2072,4624, 2080,4352, 2088,5136, + 2096,4480, 2104,5648, 2120,6160, 2128,2576, 2136,6672, 2144,3088, + 2152,7184, 2160,3600, 2168,7696, 2176,2560, 2184,4176, 2192,2816, + 2200,4688, 2208,2568, 2216,5200, 2224,2824, 2232,5712, 2240,2576, + 2248,6224, 2256,2640, 2264,6736, 2272,3152, 2280,7248, 2288,3664, + 2296,7760, 2312,4240, 2320,2432, 2328,4752, 2336,6400, 2344,5264, + 2352,6528, 2360,5776, 2368,2816, 2376,6288, 2384,2704, 2392,6800, + 2400,3216, 2408,7312, 2416,3728, 2424,7824, 2432,2624, 2440,4304, + 2448,2880, 2456,4816, 2464,2632, 2472,5328, 2480,2888, 2488,5840, + 2496,2640, 2504,6352, 2512,2768, 2520,6864, 2528,3280, 2536,7376, + 2544,3792, 2552,7888, 2568,4368, 2584,4880, 2592,4416, 2600,5392, + 2608,4544, 2616,5904, 2632,6416, 2640,2832, 2648,6928, 2656,3344, + 2664,7440, 2672,3856, 2680,7952, 2696,4432, 2704,2944, 2712,4944, + 2720,4432, 2728,5456, 2736,2952, 2744,5968, 2752,2944, 2760,6480, + 2768,2896, 2776,6992, 2784,3408, 2792,7504, 2800,3920, 2808,8016, + 2824,4496, 2840,5008, 2848,6464, 2856,5520, 2864,6592, 2872,6032, + 2888,6544, 2896,2960, 2904,7056, 2912,3472, 2920,7568, 2928,3984, + 2936,8080, 2952,4560, 2960,3008, 2968,5072, 2976,6480, 2984,5584, + 2992,3016, 3000,6096, 3016,6608, 3032,7120, 3040,3536, 3048,7632, + 3056,4048, 3064,8144, 3072,4608, 3080,4120, 3088,4864, 3096,4632, + 3104,4616, 3112,5144, 3120,4872, 3128,5656, 3136,4624, 3144,6168, + 3152,4880, 3160,6680, 3168,4632, 3176,7192, 3184,3608, 3192,7704, + 3200,6656, 3208,4184, 3216,6912, 3224,4696, 3232,6664, 3240,5208, + 3248,6920, 3256,5720, 3264,6672, 3272,6232, 3280,6928, 3288,6744, + 3296,6680, 3304,7256, 3312,3672, 3320,7768, 3328,4672, 3336,4248, + 3344,4928, 3352,4760, 3360,4680, 3368,5272, 3376,4936, 3384,5784, + 3392,4688, 3400,6296, 3408,4944, 3416,6808, 3424,4696, 3432,7320, + 3440,3736, 3448,7832, 3456,6720, 3464,4312, 3472,6976, 3480,4824, + 3488,6728, 3496,5336, 3504,6984, 3512,5848, 3520,6736, 3528,6360, + 3536,6992, 3544,6872, 3552,6744, 3560,7384, 3568,3800, 3576,7896, + 3584,4736, 3592,4376, 3600,4992, 3608,4888, 3616,4744, 3624,5400, + 3632,5000, 3640,5912, 3648,4752, 3656,6424, 3664,5008, 3672,6936, + 3680,4760, 3688,7448, 3696,3864, 3704,7960, 3712,6784, 3720,4440, + 3728,7040, 3736,4952, 3744,6792, 3752,5464, 3760,7048, 3768,5976, + 3776,6800, 3784,6488, 3792,7056, 3800,7000, 3808,6808, 3816,7512, + 3824,3928, 3832,8024, 3840,4800, 3848,4504, 3856,5056, 3864,5016, + 3872,4808, 3880,5528, 3888,5064, 3896,6040, 3904,4816, 3912,6552, + 3920,5072, 3928,7064, 3936,4824, 3944,7576, 3952,3992, 3960,8088, + 3968,6848, 3976,4568, 3984,7104, 3992,5080, 4000,6856, 4008,5592, + 4016,7112, 4024,6104, 4032,6864, 4040,6616, 4048,7120, 4056,7128, + 4064,6872, 4072,7640, 4080,7128, 4088,8152, 4104,4128, 4112,4160, + 4120,4640, 4136,5152, 4144,4232, 4152,5664, 4160,4352, 4168,6176, + 4176,4416, 4184,6688, 4192,4616, 4200,7200, 4208,4744, 4216,7712, + 4224,4608, 4232,4616, 4240,4672, 4248,4704, 4256,4640, 4264,5216, + 4272,4704, 4280,5728, 4288,4864, 4296,6240, 4304,4928, 4312,6752, + 4320,4632, 4328,7264, 4336,4760, 4344,7776, 4360,4640, 4368,4416, + 4376,4768, 4384,6152, 4392,5280, 4400,6280, 4408,5792, 4424,6304, + 4440,6816, 4448,6664, 4456,7328, 4464,6792, 4472,7840, 4480,4624, + 4488,4632, 4496,4688, 4504,4832, 4512,6168, 4520,5344, 4528,6296, + 4536,5856, 4544,4880, 4552,6368, 4560,4944, 4568,6880, 4576,6680, + 4584,7392, 4592,6808, 4600,7904, 4608,6144, 4616,6152, 4624,6208, + 4632,4896, 4640,6176, 4648,5408, 4656,6240, 4664,5920, 4672,6400, + 4680,6432, 4688,6464, 4696,6944, 4704,6432, 4712,7456, 4720,4808, + 4728,7968, 4736,6656, 4744,6664, 4752,6720, 4760,4960, 4768,6688, + 4776,5472, 4784,6752, 4792,5984, 4800,6912, 4808,6496, 4816,6976, + 4824,7008, 4832,6944, 4840,7520, 4848,7008, 4856,8032, 4864,6160, + 4872,6168, 4880,6224, 4888,5024, 4896,6216, 4904,5536, 4912,6344, + 4920,6048, 4928,6416, 4936,6560, 4944,6480, 4952,7072, 4960,6728, + 4968,7584, 4976,6856, 4984,8096, 4992,6672, 5000,6680, 5008,6736, + 5016,5088, 5024,6232, 5032,5600, 5040,6360, 5048,6112, 5056,6928, + 5064,6624, 5072,6992, 5080,7136, 5088,6744, 5096,7648, 5104,6872, + 5112,8160, 5128,5152, 5136,5376, 5144,5408, 5168,5384, 5176,5672, + 5184,5376, 5192,6184, 5200,5392, 5208,6696, 5216,5408, 5224,7208, + 5232,5400, 5240,7720, 5248,7168, 5256,7200, 5264,7424, 5272,7456, + 5280,7176, 5288,7208, 5296,7432, 5304,5736, 5312,7184, 5320,6248, + 5328,7440, 5336,6760, 5344,7192, 5352,7272, 5360,7448, 5368,7784, + 5384,5408, 5392,5440, 5400,5472, 5408,6184, 5416,7208, 5424,5448, + 5432,5800, 5448,6312, 5464,6824, 5472,6696, 5480,7336, 5488,6824, + 5496,7848, 5504,7232, 5512,7264, 5520,7488, 5528,7520, 5536,7240, + 5544,7272, 5552,7496, 5560,5864, 5568,7248, 5576,6376, 5584,7504, + 5592,6888, 5600,7256, 5608,7400, 5616,7512, 5624,7912, 5632,7168, + 5640,7176, 5648,7232, 5656,7240, 5664,7200, 5672,7208, 5680,7264, + 5688,5928, 5696,7424, 5704,6440, 5712,7488, 5720,6952, 5728,7456, + 5736,7464, 5744,7520, 5752,7976, 5760,7296, 5768,7328, 5776,7552, + 5784,7584, 5792,7304, 5800,7336, 5808,7560, 5816,5992, 5824,7312, + 5832,6504, 5840,7568, 5848,7016, 5856,7320, 5864,7528, 5872,7576, + 5880,8040, 5888,7184, 5896,7192, 5904,7248, 5912,7256, 5920,6248, + 5928,7272, 5936,6376, 5944,6056, 5952,7440, 5960,6568, 5968,7504, + 5976,7080, 5984,6760, 5992,7592, 6000,6888, 6008,8104, 6016,7360, + 6024,7392, 6032,7616, 6040,7648, 6048,7368, 6056,7400, 6064,7624, + 6072,6120, 6080,7376, 6088,6632, 6096,7632, 6104,7144, 6112,7384, + 6120,7656, 6128,7640, 6136,8168, 6168,6240, 6192,6216, 6200,7264, + 6232,6704, 6248,7216, 6256,6680, 6264,7728, 6272,6656, 6280,6664, + 6288,6912, 6296,6496, 6304,6688, 6312,6696, 6320,6944, 6328,7520, + 6336,6672, 6344,6680, 6352,6928, 6360,6768, 6368,6704, 6376,7280, + 6384,6744, 6392,7792, 6408,6432, 6424,6752, 6440,7432, 6448,6536, + 6456,7560, 6472,6944, 6488,6832, 6496,6920, 6504,7344, 6512,7048, + 6520,7856, 6528,6720, 6536,6728, 6544,6976, 6552,7008, 6560,6752, + 6568,7448, 6576,7008, 6584,7576, 6592,6736, 6600,6744, 6608,6992, + 6616,6896, 6624,6936, 6632,7408, 6640,7064, 6648,7920, 6712,7280, + 6744,6960, 6760,7472, 6768,6936, 6776,7984, 6800,6848, 6808,6856, + 6832,6880, 6840,6888, 6848,7040, 6856,7048, 6864,7104, 6872,7024, + 6880,7072, 6888,7536, 6896,7136, 6904,8048, 6952,7496, 6968,7624, + 6984,7008, 7000,7088, 7016,7600, 7024,7112, 7032,8112, 7056,7104, + 7064,7112, 7080,7512, 7088,7136, 7096,7640, 7128,7152, 7144,7664, + 7160,8176, 7176,7200, 7192,7216, 7224,7272, 7240,7264, 7256,7280, + 7288,7736, 7296,7680, 7304,7712, 7312,7936, 7320,7968, 7328,7688, + 7336,7720, 7344,7944, 7352,7976, 7360,7696, 7368,7728, 7376,7952, + 7384,7984, 7392,7704, 7400,7736, 7408,7960, 7416,7800, 7432,7456, + 7448,7472, 7480,7592, 7496,7520, 7512,7536, 7528,7976, 7544,7864, + 7552,7744, 7560,7776, 7568,8000, 7576,8032, 7584,7752, 7592,7784, + 7600,8008, 7608,8040, 7616,7760, 7624,7792, 7632,8016, 7640,8048, + 7648,7768, 7656,7800, 7664,8024, 7672,7928, 7688,7712, 7704,7728, + 7752,7776, 7768,7792, 7800,7992, 7816,7840, 7824,8064, 7832,8096, + 7856,8072, 7864,8104, 7872,8064, 7880,8072, 7888,8080, 7896,8112, + 7904,8096, 7912,8104, 7920,8088, 7928,8056, 7944,7968, 7960,7984, + 8008,8032, 8024,8048, 8056,8120, 8072,8096, 8080,8128, 8088,8160, + 8112,8136, 8120,8168, 8136,8160, 8152,8176 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_2048) + +const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH] = +{ + /* 8x2, size 3808 */ + 8,4096, 16,8192, 24,12288, 32,512, 40,4608, 48,8704, 56,12800, 64,1024, + 72,5120, 80,9216, 88,13312, 96,1536, 104,5632, 112,9728, 120,13824, + 128,2048, 136,6144, 144,10240, 152,14336, 160,2560, 168,6656, 176,10752, + 184,14848, 192,3072, 200,7168, 208,11264, 216,15360, 224,3584, 232,7680, + 240,11776, 248,15872, 256,1024, 264,4160, 272,8256, 280,12352, 288,576, + 296,4672, 304,8768, 312,12864, 320,1088, 328,5184, 336,9280, 344,13376, + 352,1600, 360,5696, 368,9792, 376,13888, 384,2112, 392,6208, 400,10304, + 408,14400, 416,2624, 424,6720, 432,10816, 440,14912, 448,3136, 456,7232, + 464,11328, 472,15424, 480,3648, 488,7744, 496,11840, 504,15936, 512,2048, + 520,4224, 528,8320, 536,12416, 544,640, 552,4736, 560,8832, 568,12928, + 576,1152, 584,5248, 592,9344, 600,13440, 608,1664, 616,5760, 624,9856, + 632,13952, 640,2176, 648,6272, 656,10368, 664,14464, 672,2688, 680,6784, + 688,10880, 696,14976, 704,3200, 712,7296, 720,11392, 728,15488, 736,3712, + 744,7808, 752,11904, 760,16000, 768,3072, 776,4288, 784,8384, 792,12480, + 800,3200, 808,4800, 816,8896, 824,12992, 832,1216, 840,5312, 848,9408, + 856,13504, 864,1728, 872,5824, 880,9920, 888,14016, 896,2240, 904,6336, + 912,10432, 920,14528, 928,2752, 936,6848, 944,10944, 952,15040, 960,3264, + 968,7360, 976,11456, 984,15552, 992,3776, 1000,7872, 1008,11968, 1016,16064, + 1032,4352, 1040,8448, 1048,12544, 1056,3072, 1064,4864, 1072,8960, + 1080,13056, 1088,1280, 1096,5376, 1104,9472, 1112,13568, 1120,1792, + 1128,5888, 1136,9984, 1144,14080, 1152,2304, 1160,6400, 1168,10496, + 1176,14592, 1184,2816, 1192,6912, 1200,11008, 1208,15104, 1216,3328, + 1224,7424, 1232,11520, 1240,15616, 1248,3840, 1256,7936, 1264,12032, + 1272,16128, 1288,4416, 1296,8512, 1304,12608, 1312,3328, 1320,4928, + 1328,9024, 1336,13120, 1352,5440, 1360,9536, 1368,13632, 1376,1856, + 1384,5952, 1392,10048, 1400,14144, 1408,2368, 1416,6464, 1424,10560, + 1432,14656, 1440,2880, 1448,6976, 1456,11072, 1464,15168, 1472,3392, + 1480,7488, 1488,11584, 1496,15680, 1504,3904, 1512,8000, 1520,12096, + 1528,16192, 1536,2112, 1544,4480, 1552,8576, 1560,12672, 1568,2240, + 1576,4992, 1584,9088, 1592,13184, 1600,2368, 1608,5504, 1616,9600, + 1624,13696, 1632,1920, 1640,6016, 1648,10112, 1656,14208, 1664,2432, + 1672,6528, 1680,10624, 1688,14720, 1696,2944, 1704,7040, 1712,11136, + 1720,15232, 1728,3456, 1736,7552, 1744,11648, 1752,15744, 1760,3968, + 1768,8064, 1776,12160, 1784,16256, 1792,3136, 1800,4544, 1808,8640, + 1816,12736, 1824,3264, 1832,5056, 1840,9152, 1848,13248, 1856,3392, + 1864,5568, 1872,9664, 1880,13760, 1888,1984, 1896,6080, 1904,10176, + 1912,14272, 1920,2496, 1928,6592, 1936,10688, 1944,14784, 1952,3008, + 1960,7104, 1968,11200, 1976,15296, 1984,3520, 1992,7616, 2000,11712, + 2008,15808, 2016,4032, 2024,8128, 2032,12224, 2040,16320, 2048,4096, + 2056,4104, 2064,8200, 2072,12296, 2080,4224, 2088,4616, 2096,8712, + 2104,12808, 2112,4352, 2120,5128, 2128,9224, 2136,13320, 2144,4480, + 2152,5640, 2160,9736, 2168,13832, 2176,4104, 2184,6152, 2192,10248, + 2200,14344, 2208,2568, 2216,6664, 2224,10760, 2232,14856, 2240,3080, + 2248,7176, 2256,11272, 2264,15368, 2272,3592, 2280,7688, 2288,11784, + 2296,15880, 2304,5120, 2312,4168, 2320,8264, 2328,12360, 2336,5248, + 2344,4680, 2352,8776, 2360,12872, 2368,5376, 2376,5192, 2384,9288, + 2392,13384, 2400,5504, 2408,5704, 2416,9800, 2424,13896, 2432,5128, + 2440,6216, 2448,10312, 2456,14408, 2464,2632, 2472,6728, 2480,10824, + 2488,14920, 2496,3144, 2504,7240, 2512,11336, 2520,15432, 2528,3656, + 2536,7752, 2544,11848, 2552,15944, 2560,6144, 2568,4232, 2576,8328, + 2584,12424, 2592,6272, 2600,4744, 2608,8840, 2616,12936, 2624,6400, + 2632,5256, 2640,9352, 2648,13448, 2656,6528, 2664,5768, 2672,9864, + 2680,13960, 2688,6152, 2696,6280, 2704,10376, 2712,14472, 2720,6280, + 2728,6792, 2736,10888, 2744,14984, 2752,3208, 2760,7304, 2768,11400, + 2776,15496, 2784,3720, 2792,7816, 2800,11912, 2808,16008, 2816,7168, + 2824,4296, 2832,8392, 2840,12488, 2848,7296, 2856,4808, 2864,8904, + 2872,13000, 2880,7424, 2888,5320, 2896,9416, 2904,13512, 2912,7552, + 2920,5832, 2928,9928, 2936,14024, 2944,7176, 2952,6344, 2960,10440, + 2968,14536, 2976,7304, 2984,6856, 2992,10952, 3000,15048, 3008,3272, + 3016,7368, 3024,11464, 3032,15560, 3040,3784, 3048,7880, 3056,11976, + 3064,16072, 3072,4160, 3080,4360, 3088,8456, 3096,12552, 3104,4288, + 3112,4872, 3120,8968, 3128,13064, 3136,4416, 3144,5384, 3152,9480, + 3160,13576, 3168,4544, 3176,5896, 3184,9992, 3192,14088, 3200,4168, + 3208,6408, 3216,10504, 3224,14600, 3232,4296, 3240,6920, 3248,11016, + 3256,15112, 3264,3336, 3272,7432, 3280,11528, 3288,15624, 3296,3848, + 3304,7944, 3312,12040, 3320,16136, 3328,5184, 3336,4424, 3344,8520, + 3352,12616, 3360,5312, 3368,4936, 3376,9032, 3384,13128, 3392,5440, + 3400,5448, 3408,9544, 3416,13640, 3424,5568, 3432,5960, 3440,10056, + 3448,14152, 3456,5192, 3464,6472, 3472,10568, 3480,14664, 3488,5320, + 3496,6984, 3504,11080, 3512,15176, 3520,5448, 3528,7496, 3536,11592, + 3544,15688, 3552,3912, 3560,8008, 3568,12104, 3576,16200, 3584,6208, + 3592,4488, 3600,8584, 3608,12680, 3616,6336, 3624,5000, 3632,9096, + 3640,13192, 3648,6464, 3656,5512, 3664,9608, 3672,13704, 3680,6592, + 3688,6024, 3696,10120, 3704,14216, 3712,6216, 3720,6536, 3728,10632, + 3736,14728, 3744,6344, 3752,7048, 3760,11144, 3768,15240, 3776,6472, + 3784,7560, 3792,11656, 3800,15752, 3808,3976, 3816,8072, 3824,12168, + 3832,16264, 3840,7232, 3848,4552, 3856,8648, 3864,12744, 3872,7360, + 3880,5064, 3888,9160, 3896,13256, 3904,7488, 3912,5576, 3920,9672, + 3928,13768, 3936,7616, 3944,6088, 3952,10184, 3960,14280, 3968,7240, + 3976,6600, 3984,10696, 3992,14792, 4000,7368, 4008,7112, 4016,11208, + 4024,15304, 4032,7496, 4040,7624, 4048,11720, 4056,15816, 4064,7624, + 4072,8136, 4080,12232, 4088,16328, 4096,8192, 4104,4112, 4112,8208, + 4120,12304, 4128,8320, 4136,4624, 4144,8720, 4152,12816, 4160,8448, + 4168,5136, 4176,9232, 4184,13328, 4192,8576, 4200,5648, 4208,9744, + 4216,13840, 4224,8200, 4232,6160, 4240,10256, 4248,14352, 4256,8328, + 4264,6672, 4272,10768, 4280,14864, 4288,8456, 4296,7184, 4304,11280, + 4312,15376, 4320,8584, 4328,7696, 4336,11792, 4344,15888, 4352,9216, + 4360,9232, 4368,8272, 4376,12368, 4384,9344, 4392,4688, 4400,8784, + 4408,12880, 4416,9472, 4424,5200, 4432,9296, 4440,13392, 4448,9600, + 4456,5712, 4464,9808, 4472,13904, 4480,9224, 4488,6224, 4496,10320, + 4504,14416, 4512,9352, 4520,6736, 4528,10832, 4536,14928, 4544,9480, + 4552,7248, 4560,11344, 4568,15440, 4576,9608, 4584,7760, 4592,11856, + 4600,15952, 4608,10240, 4616,10256, 4624,8336, 4632,12432, 4640,10368, + 4648,4752, 4656,8848, 4664,12944, 4672,10496, 4680,5264, 4688,9360, + 4696,13456, 4704,10624, 4712,5776, 4720,9872, 4728,13968, 4736,10248, + 4744,6288, 4752,10384, 4760,14480, 4768,10376, 4776,6800, 4784,10896, + 4792,14992, 4800,10504, 4808,7312, 4816,11408, 4824,15504, 4832,10632, + 4840,7824, 4848,11920, 4856,16016, 4864,11264, 4872,11280, 4880,8400, + 4888,12496, 4896,11392, 4904,11408, 4912,8912, 4920,13008, 4928,11520, + 4936,5328, 4944,9424, 4952,13520, 4960,11648, 4968,5840, 4976,9936, + 4984,14032, 4992,11272, 5000,6352, 5008,10448, 5016,14544, 5024,11400, + 5032,6864, 5040,10960, 5048,15056, 5056,11528, 5064,7376, 5072,11472, + 5080,15568, 5088,11656, 5096,7888, 5104,11984, 5112,16080, 5120,8256, + 5128,8272, 5136,8464, 5144,12560, 5152,8384, 5160,8400, 5168,8976, + 5176,13072, 5184,8512, 5192,5392, 5200,9488, 5208,13584, 5216,8640, + 5224,5904, 5232,10000, 5240,14096, 5248,8264, 5256,6416, 5264,10512, + 5272,14608, 5280,8392, 5288,6928, 5296,11024, 5304,15120, 5312,8520, + 5320,7440, 5328,11536, 5336,15632, 5344,8648, 5352,7952, 5360,12048, + 5368,16144, 5376,9280, 5384,9296, 5392,8528, 5400,12624, 5408,9408, + 5416,9424, 5424,9040, 5432,13136, 5440,9536, 5448,5456, 5456,9552, + 5464,13648, 5472,9664, 5480,5968, 5488,10064, 5496,14160, 5504,9288, + 5512,6480, 5520,10576, 5528,14672, 5536,9416, 5544,6992, 5552,11088, + 5560,15184, 5568,9544, 5576,7504, 5584,11600, 5592,15696, 5600,9672, + 5608,8016, 5616,12112, 5624,16208, 5632,10304, 5640,10320, 5648,8592, + 5656,12688, 5664,10432, 5672,10448, 5680,9104, 5688,13200, 5696,10560, + 5704,10576, 5712,9616, 5720,13712, 5728,10688, 5736,6032, 5744,10128, + 5752,14224, 5760,10312, 5768,6544, 5776,10640, 5784,14736, 5792,10440, + 5800,7056, 5808,11152, 5816,15248, 5824,10568, 5832,7568, 5840,11664, + 5848,15760, 5856,10696, 5864,8080, 5872,12176, 5880,16272, 5888,11328, + 5896,11344, 5904,8656, 5912,12752, 5920,11456, 5928,11472, 5936,9168, + 5944,13264, 5952,11584, 5960,11600, 5968,9680, 5976,13776, 5984,11712, + 5992,6096, 6000,10192, 6008,14288, 6016,11336, 6024,6608, 6032,10704, + 6040,14800, 6048,11464, 6056,7120, 6064,11216, 6072,15312, 6080,11592, + 6088,7632, 6096,11728, 6104,15824, 6112,11720, 6120,8144, 6128,12240, + 6136,16336, 6144,12288, 6152,12304, 6160,8216, 6168,12312, 6176,12416, + 6184,12432, 6192,8728, 6200,12824, 6208,12544, 6216,12560, 6224,9240, + 6232,13336, 6240,12672, 6248,12688, 6256,9752, 6264,13848, 6272,12296, + 6280,12312, 6288,10264, 6296,14360, 6304,12424, 6312,6680, 6320,10776, + 6328,14872, 6336,12552, 6344,7192, 6352,11288, 6360,15384, 6368,12680, + 6376,7704, 6384,11800, 6392,15896, 6400,13312, 6408,13328, 6416,8280, + 6424,12376, 6432,13440, 6440,13456, 6448,8792, 6456,12888, 6464,13568, + 6472,13584, 6480,9304, 6488,13400, 6496,13696, 6504,13712, 6512,9816, + 6520,13912, 6528,13320, 6536,13336, 6544,10328, 6552,14424, 6560,13448, + 6568,6744, 6576,10840, 6584,14936, 6592,13576, 6600,7256, 6608,11352, + 6616,15448, 6624,13704, 6632,7768, 6640,11864, 6648,15960, 6656,14336, + 6664,14352, 6672,8344, 6680,12440, 6688,14464, 6696,14480, 6704,8856, + 6712,12952, 6720,14592, 6728,14608, 6736,9368, 6744,13464, 6752,14720, + 6760,14736, 6768,9880, 6776,13976, 6784,14344, 6792,14360, 6800,10392, + 6808,14488, 6816,14472, 6824,14488, 6832,10904, 6840,15000, 6848,14600, + 6856,7320, 6864,11416, 6872,15512, 6880,14728, 6888,7832, 6896,11928, + 6904,16024, 6912,15360, 6920,15376, 6928,8408, 6936,12504, 6944,15488, + 6952,15504, 6960,8920, 6968,13016, 6976,15616, 6984,15632, 6992,9432, + 7000,13528, 7008,15744, 7016,15760, 7024,9944, 7032,14040, 7040,15368, + 7048,15384, 7056,10456, 7064,14552, 7072,15496, 7080,15512, 7088,10968, + 7096,15064, 7104,15624, 7112,7384, 7120,11480, 7128,15576, 7136,15752, + 7144,7896, 7152,11992, 7160,16088, 7168,12352, 7176,12368, 7184,8472, + 7192,12568, 7200,12480, 7208,12496, 7216,8984, 7224,13080, 7232,12608, + 7240,12624, 7248,9496, 7256,13592, 7264,12736, 7272,12752, 7280,10008, + 7288,14104, 7296,12360, 7304,12376, 7312,10520, 7320,14616, 7328,12488, + 7336,12504, 7344,11032, 7352,15128, 7360,12616, 7368,7448, 7376,11544, + 7384,15640, 7392,12744, 7400,7960, 7408,12056, 7416,16152, 7424,13376, + 7432,13392, 7440,8536, 7448,12632, 7456,13504, 7464,13520, 7472,9048, + 7480,13144, 7488,13632, 7496,13648, 7504,9560, 7512,13656, 7520,13760, + 7528,13776, 7536,10072, 7544,14168, 7552,13384, 7560,13400, 7568,10584, + 7576,14680, 7584,13512, 7592,13528, 7600,11096, 7608,15192, 7616,13640, + 7624,13656, 7632,11608, 7640,15704, 7648,13768, 7656,8024, 7664,12120, + 7672,16216, 7680,14400, 7688,14416, 7696,8600, 7704,12696, 7712,14528, + 7720,14544, 7728,9112, 7736,13208, 7744,14656, 7752,14672, 7760,9624, + 7768,13720, 7776,14784, 7784,14800, 7792,10136, 7800,14232, 7808,14408, + 7816,14424, 7824,10648, 7832,14744, 7840,14536, 7848,14552, 7856,11160, + 7864,15256, 7872,14664, 7880,14680, 7888,11672, 7896,15768, 7904,14792, + 7912,8088, 7920,12184, 7928,16280, 7936,15424, 7944,15440, 7952,8664, + 7960,12760, 7968,15552, 7976,15568, 7984,9176, 7992,13272, 8000,15680, + 8008,15696, 8016,9688, 8024,13784, 8032,15808, 8040,15824, 8048,10200, + 8056,14296, 8064,15432, 8072,15448, 8080,10712, 8088,14808, 8096,15560, + 8104,15576, 8112,11224, 8120,15320, 8128,15688, 8136,15704, 8144,11736, + 8152,15832, 8160,15816, 8168,15832, 8176,12248, 8184,16344, 8200,8320, + 8208,8224, 8216,12320, 8232,10368, 8240,8736, 8248,12832, 8256,8448, + 8264,8384, 8272,9248, 8280,13344, 8288,9232, 8296,10432, 8304,9760, + 8312,13856, 8328,12416, 8336,10272, 8344,14368, 8352,12296, 8360,14464, + 8368,10784, 8376,14880, 8384,8456, 8392,12480, 8400,11296, 8408,15392, + 8416,12552, 8424,14528, 8432,11808, 8440,15904, 8448,9216, 8456,8576, + 8464,9232, 8472,12384, 8480,9248, 8488,10624, 8496,8800, 8504,12896, + 8512,9472, 8520,8640, 8528,9312, 8536,13408, 8544,9296, 8552,10688, + 8560,9824, 8568,13920, 8576,9224, 8584,12672, 8592,10336, 8600,14432, + 8608,13320, 8616,14720, 8624,10848, 8632,14944, 8640,9480, 8648,12736, + 8656,11360, 8664,15456, 8672,13576, 8680,14784, 8688,11872, 8696,15968, + 8704,12288, 8712,12416, 8720,12296, 8728,12448, 8736,12304, 8744,10376, + 8752,8864, 8760,12960, 8768,12352, 8776,12480, 8784,9376, 8792,13472, + 8800,12368, 8808,10440, 8816,9888, 8824,13984, 8832,12320, 8840,12424, + 8848,10400, 8856,14496, 8864,12312, 8872,14472, 8880,10912, 8888,15008, + 8896,12384, 8904,12488, 8912,11424, 8920,15520, 8928,12568, 8936,14536, + 8944,11936, 8952,16032, 8960,12544, 8968,12672, 8976,12552, 8984,12512, + 8992,12560, 9000,10632, 9008,12568, 9016,13024, 9024,12608, 9032,12736, + 9040,9440, 9048,13536, 9056,12624, 9064,10696, 9072,9952, 9080,14048, + 9088,9240, 9096,12680, 9104,10464, 9112,14560, 9120,13336, 9128,14728, + 9136,10976, 9144,15072, 9152,9496, 9160,12744, 9168,11488, 9176,15584, + 9184,13592, 9192,14792, 9200,12000, 9208,16096, 9224,9344, 9232,9248, + 9240,12576, 9256,11392, 9264,12560, 9272,13088, 9280,9472, 9288,9408, + 9296,9504, 9304,13600, 9312,9488, 9320,11456, 9328,10016, 9336,14112, + 9352,13440, 9360,10528, 9368,14624, 9376,12360, 9384,15488, 9392,11040, + 9400,15136, 9408,9480, 9416,13504, 9424,11552, 9432,15648, 9440,12616, + 9448,15552, 9456,12064, 9464,16160, 9480,9600, 9488,9504, 9496,12640, + 9512,11648, 9520,12624, 9528,13152, 9544,9664, 9552,9568, 9560,13664, + 9576,11712, 9584,10080, 9592,14176, 9608,13696, 9616,10592, 9624,14688, + 9632,13384, 9640,15744, 9648,11104, 9656,15200, 9672,13760, 9680,11616, + 9688,15712, 9696,13640, 9704,15808, 9712,12128, 9720,16224, 9728,13312, + 9736,13440, 9744,13320, 9752,12704, 9760,13328, 9768,11400, 9776,13336, + 9784,13216, 9792,13376, 9800,13504, 9808,13384, 9816,13728, 9824,13392, + 9832,11464, 9840,10144, 9848,14240, 9856,13344, 9864,13448, 9872,10656, + 9880,14752, 9888,12376, 9896,15496, 9904,11168, 9912,15264, 9920,13408, + 9928,13512, 9936,11680, 9944,15776, 9952,12632, 9960,15560, 9968,12192, + 9976,16288, 9984,13568, 9992,13696, 10000,13576, 10008,12768, 10016,13584, + 10024,11656, 10032,13592, 10040,13280, 10048,13632, 10056,13760, + 10064,13640, 10072,13792, 10080,13648, 10088,11720, 10096,10208, + 10104,14304, 10112,13600, 10120,13704, 10128,10720, 10136,14816, + 10144,13400, 10152,15752, 10160,11232, 10168,15328, 10176,13664, + 10184,13768, 10192,11744, 10200,15840, 10208,13656, 10216,15816, + 10224,12256, 10232,16352, 10248,10272, 10256,10368, 10264,12328, + 10280,10384, 10288,10376, 10296,12840, 10304,11264, 10312,11296, + 10320,11392, 10328,13352, 10336,11272, 10344,10448, 10352,11400, + 10360,13864, 10376,12432, 10392,14376, 10400,12328, 10408,14480, + 10416,10792, 10424,14888, 10432,11280, 10440,12496, 10448,11304, + 10456,15400, 10464,11288, 10472,14544, 10480,11816, 10488,15912, + 10496,11264, 10504,11272, 10512,11280, 10520,12392, 10528,11296, + 10536,10640, 10544,12496, 10552,12904, 10560,11328, 10568,11360, + 10576,11456, 10584,13416, 10592,11336, 10600,10704, 10608,11464, + 10616,13928, 10624,11392, 10632,12688, 10640,11304, 10648,14440, + 10656,13352, 10664,14736, 10672,10856, 10680,14952, 10688,11344, + 10696,12752, 10704,11368, 10712,15464, 10720,11352, 10728,14800, + 10736,11880, 10744,15976, 10752,14336, 10760,14368, 10768,14464, + 10776,12456, 10784,14344, 10792,14376, 10800,14472, 10808,12968, + 10816,15360, 10824,15392, 10832,15488, 10840,13480, 10848,15368, + 10856,15400, 10864,15496, 10872,13992, 10880,14352, 10888,12440, + 10896,14480, 10904,14504, 10912,14360, 10920,14488, 10928,14488, + 10936,15016, 10944,15376, 10952,12504, 10960,11432, 10968,15528, + 10976,15384, 10984,14552, 10992,11944, 11000,16040, 11008,14400, + 11016,14432, 11024,14528, 11032,12520, 11040,14408, 11048,14440, + 11056,14536, 11064,13032, 11072,15424, 11080,15456, 11088,15552, + 11096,13544, 11104,15432, 11112,15464, 11120,15560, 11128,14056, + 11136,14416, 11144,12696, 11152,14544, 11160,14568, 11168,14424, + 11176,14744, 11184,14552, 11192,15080, 11200,15440, 11208,12760, + 11216,11496, 11224,15592, 11232,15448, 11240,14808, 11248,12008, + 11256,16104, 11272,11296, 11280,11392, 11288,12584, 11304,11408, + 11312,12688, 11320,13096, 11328,11520, 11336,11552, 11344,11648, + 11352,13608, 11360,11528, 11368,11472, 11376,11656, 11384,14120, + 11400,13456, 11416,14632, 11424,12392, 11432,15504, 11440,14440, + 11448,15144, 11456,11536, 11464,13520, 11472,11560, 11480,15656, + 11488,11544, 11496,15568, 11504,12072, 11512,16168, 11528,11552, + 11536,11648, 11544,12648, 11560,11664, 11568,12752, 11576,13160, + 11592,11616, 11600,11712, 11608,13672, 11624,11728, 11632,11720, + 11640,14184, 11656,13712, 11672,14696, 11680,13416, 11688,15760, + 11696,15464, 11704,15208, 11720,13776, 11736,15720, 11744,13672, + 11752,15824, 11760,12136, 11768,16232, 11776,14592, 11784,14624, + 11792,14720, 11800,12712, 11808,14600, 11816,14632, 11824,14728, + 11832,13224, 11840,15616, 11848,15648, 11856,15744, 11864,13736, + 11872,15624, 11880,15656, 11888,15752, 11896,14248, 11904,14608, + 11912,13464, 11920,14736, 11928,14760, 11936,14616, 11944,15512, + 11952,14744, 11960,15272, 11968,15632, 11976,13528, 11984,15760, + 11992,15784, 12000,15640, 12008,15576, 12016,12200, 12024,16296, + 12032,14656, 12040,14688, 12048,14784, 12056,12776, 12064,14664, + 12072,14696, 12080,14792, 12088,13288, 12096,15680, 12104,15712, + 12112,15808, 12120,13800, 12128,15688, 12136,15720, 12144,15816, + 12152,14312, 12160,14672, 12168,13720, 12176,14800, 12184,14824, + 12192,14680, 12200,15768, 12208,14808, 12216,15336, 12224,15696, + 12232,13784, 12240,15824, 12248,15848, 12256,15704, 12264,15832, + 12272,15832, 12280,16360, 12312,12336, 12344,12848, 12352,12544, + 12360,12552, 12368,12560, 12376,13360, 12384,12576, 12392,12584, + 12400,13336, 12408,13872, 12424,12448, 12440,14384, 12456,14496, + 12464,14472, 12472,14896, 12480,12672, 12488,12512, 12496,12688, + 12504,15408, 12512,12680, 12520,14560, 12528,14728, 12536,15920, + 12544,13312, 12552,13320, 12560,13328, 12568,13336, 12576,13344, + 12584,13352, 12592,13360, 12600,12912, 12608,13568, 12616,13576, + 12624,13584, 12632,13424, 12640,13600, 12648,13608, 12656,13400, + 12664,13936, 12672,13440, 12680,12704, 12688,13456, 12696,14448, + 12704,13448, 12712,14752, 12720,15496, 12728,14960, 12736,13696, + 12744,12768, 12752,13712, 12760,15472, 12768,13704, 12776,14816, + 12784,15752, 12792,15984, 12800,14336, 12808,14464, 12816,14344, + 12824,14472, 12832,14352, 12840,14480, 12848,14360, 12856,12976, + 12864,14400, 12872,14528, 12880,14408, 12888,13488, 12896,14416, + 12904,14544, 12912,14424, 12920,14000, 12928,14368, 12936,14496, + 12944,14376, 12952,14512, 12960,14384, 12968,14504, 12976,14488, + 12984,15024, 12992,14432, 13000,14560, 13008,14440, 13016,15536, + 13024,14448, 13032,14568, 13040,14744, 13048,16048, 13056,14592, + 13064,14720, 13072,14600, 13080,14728, 13088,14608, 13096,14736, + 13104,14616, 13112,14744, 13120,14656, 13128,14784, 13136,14664, + 13144,13552, 13152,14672, 13160,14800, 13168,14680, 13176,14064, + 13184,14624, 13192,14752, 13200,14632, 13208,14576, 13216,13464, + 13224,14760, 13232,15512, 13240,15088, 13248,14688, 13256,14816, + 13264,14696, 13272,15600, 13280,13720, 13288,14824, 13296,15768, + 13304,16112, 13336,13360, 13368,14616, 13376,13568, 13384,13576, + 13392,13584, 13400,13616, 13408,13600, 13416,13608, 13424,13592, + 13432,14128, 13448,13472, 13464,14640, 13480,15520, 13488,14536, + 13496,15152, 13504,13696, 13512,13536, 13520,13712, 13528,15664, + 13536,13704, 13544,15584, 13552,14792, 13560,16176, 13592,13616, + 13624,14680, 13656,13680, 13688,14192, 13704,13728, 13720,14704, + 13736,15776, 13744,15560, 13752,15216, 13768,13792, 13784,15728, + 13800,15840, 13808,15816, 13816,16240, 13824,15360, 13832,15488, + 13840,15368, 13848,15496, 13856,15376, 13864,15504, 13872,15384, + 13880,15512, 13888,15424, 13896,15552, 13904,15432, 13912,15560, + 13920,15440, 13928,15568, 13936,15448, 13944,14256, 13952,15392, + 13960,15520, 13968,15400, 13976,14768, 13984,15408, 13992,15528, + 14000,14552, 14008,15280, 14016,15456, 14024,15584, 14032,15464, + 14040,15792, 14048,15472, 14056,15592, 14064,14808, 14072,16304, + 14080,15616, 14088,15744, 14096,15624, 14104,15752, 14112,15632, + 14120,15760, 14128,15640, 14136,15768, 14144,15680, 14152,15808, + 14160,15688, 14168,15816, 14176,15696, 14184,15824, 14192,15704, + 14200,14320, 14208,15648, 14216,15776, 14224,15656, 14232,14832, + 14240,15664, 14248,15784, 14256,15576, 14264,15344, 14272,15712, + 14280,15840, 14288,15720, 14296,15856, 14304,15728, 14312,15848, + 14320,15832, 14328,16368, 14392,14488, 14400,14592, 14408,14600, + 14416,14608, 14424,14616, 14432,14624, 14440,14632, 14448,14640, + 14456,15512, 14504,14512, 14520,14904, 14528,14720, 14536,14728, + 14544,14736, 14552,15416, 14560,14752, 14568,14576, 14584,15928, + 14576,14760, 14592,15360, 14600,15368, 14608,15376, 14616,15384, + 14624,15392, 14632,15400, 14640,15408, 14648,15416, 14656,15616, + 14664,15624, 14672,15632, 14680,15640, 14688,15648, 14696,15656, + 14704,15664, 14712,15576, 14720,15488, 14728,15496, 14736,15504, + 14744,15512, 14752,15520, 14760,14768, 14776,14968, 14768,15528, + 14784,15744, 14792,15752, 14800,15760, 14808,15480, 14816,15776, + 14824,14832, 14840,15992, 14832,15784, 14856,14864, 14864,14880, + 14872,14896, 14880,14976, 14888,14992, 14896,15008, 14904,15024, + 14912,15104, 14920,15120, 14928,15136, 14936,15152, 14944,15232, + 14952,15248, 14960,15264, 14968,15280, 14984,15008, 15000,15024, + 15016,15024, 15040,15112, 15048,15128, 15056,15144, 15064,15544, + 15072,15240, 15080,15256, 15088,15272, 15096,16056, 15104,15872, + 15112,15888, 15120,15904, 15128,15920, 15136,16000, 15144,16016, + 15152,16032, 15160,16048, 15168,16128, 15176,16144, 15184,16160, + 15192,16176, 15200,16256, 15208,16272, 15216,16288, 15224,16304, + 15232,15880, 15240,15896, 15248,15912, 15256,15928, 15264,16008, + 15272,16024, 15280,16040, 15288,16056, 15296,16136, 15304,16152, + 15312,16168, 15320,15608, 15328,16264, 15336,16280, 15344,16296, + 15352,16120, 15416,15512, 15424,15616, 15432,15624, 15440,15632, + 15448,15640, 15456,15648, 15464,15656, 15472,15664, 15480,15768, + 15528,15536, 15544,16048, 15552,15744, 15560,15752, 15568,15760, + 15576,15672, 15584,15776, 15592,15600, 15600,15784, 15608,16184, + 15672,15768, 15736,15832, 15784,15792, 15800,16304, 15848,15856, + 15880,16000, 15864,16248, 15888,16000, 15896,16008, 15904,16000, + 15912,16016, 15920,16008, 15928,16024, 15936,16128, 15944,16160, + 15952,16256, 15960,16288, 15968,16136, 15976,16168, 15984,16264, + 15992,16296, 16008,16032, 16024,16040, 16064,16144, 16040,16048, + 16072,16176, 16080,16272, 16088,16304, 16096,16152, 16104,16184, + 16112,16280, 16136,16256, 16120,16312, 16144,16256, 16152,16264, + 16160,16256, 16168,16272, 16176,16264, 16184,16280, 16200,16208, + 16208,16224, 16216,16240, 16224,16320, 16232,16336, 16240,16352, + 16248,16368, 16264,16288, 16280,16296, 16296,16304, 16344,16368, + 16328,16352, 16360,16368 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_4096) + +const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH] = +{ + /* radix 8, size 4032 */ + 8,4096, 16,8192, 24,12288, 32,16384, 40,20480, 48,24576, 56,28672, 64,512, + 72,4608, 80,8704, 88,12800, 96,16896, 104,20992, 112,25088, 120,29184, + 128,1024, 136,5120, 144,9216, 152,13312, 160,17408, 168,21504, 176,25600, + 184,29696, 192,1536, 200,5632, 208,9728, 216,13824, 224,17920, 232,22016, + 240,26112, 248,30208, 256,2048, 264,6144, 272,10240, 280,14336, 288,18432, + 296,22528, 304,26624, 312,30720, 320,2560, 328,6656, 336,10752, 344,14848, + 352,18944, 360,23040, 368,27136, 376,31232, 384,3072, 392,7168, 400,11264, + 408,15360, 416,19456, 424,23552, 432,27648, 440,31744, 448,3584, 456,7680, + 464,11776, 472,15872, 480,19968, 488,24064, 496,28160, 504,32256, 520,4160, + 528,8256, 536,12352, 544,16448, 552,20544, 560,24640, 568,28736, 584,4672, + 592,8768, 600,12864, 608,16960, 616,21056, 624,25152, 632,29248, 640,1088, + 648,5184, 656,9280, 664,13376, 672,17472, 680,21568, 688,25664, 696,29760, + 704,1600, 712,5696, 720,9792, 728,13888, 736,17984, 744,22080, 752,26176, + 760,30272, 768,2112, 776,6208, 784,10304, 792,14400, 800,18496, 808,22592, + 816,26688, 824,30784, 832,2624, 840,6720, 848,10816, 856,14912, 864,19008, + 872,23104, 880,27200, 888,31296, 896,3136, 904,7232, 912,11328, 920,15424, + 928,19520, 936,23616, 944,27712, 952,31808, 960,3648, 968,7744, 976,11840, + 984,15936, 992,20032, 1000,24128, 1008,28224, 1016,32320, 1032,4224, + 1040,8320, 1048,12416, 1056,16512, 1064,20608, 1072,24704, 1080,28800, + 1096,4736, 1104,8832, 1112,12928, 1120,17024, 1128,21120, 1136,25216, + 1144,29312, 1160,5248, 1168,9344, 1176,13440, 1184,17536, 1192,21632, + 1200,25728, 1208,29824, 1216,1664, 1224,5760, 1232,9856, 1240,13952, + 1248,18048, 1256,22144, 1264,26240, 1272,30336, 1280,2176, 1288,6272, + 1296,10368, 1304,14464, 1312,18560, 1320,22656, 1328,26752, 1336,30848, + 1344,2688, 1352,6784, 1360,10880, 1368,14976, 1376,19072, 1384,23168, + 1392,27264, 1400,31360, 1408,3200, 1416,7296, 1424,11392, 1432,15488, + 1440,19584, 1448,23680, 1456,27776, 1464,31872, 1472,3712, 1480,7808, + 1488,11904, 1496,16000, 1504,20096, 1512,24192, 1520,28288, 1528,32384, + 1544,4288, 1552,8384, 1560,12480, 1568,16576, 1576,20672, 1584,24768, + 1592,28864, 1608,4800, 1616,8896, 1624,12992, 1632,17088, 1640,21184, + 1648,25280, 1656,29376, 1672,5312, 1680,9408, 1688,13504, 1696,17600, + 1704,21696, 1712,25792, 1720,29888, 1736,5824, 1744,9920, 1752,14016, + 1760,18112, 1768,22208, 1776,26304, 1784,30400, 1792,2240, 1800,6336, + 1808,10432, 1816,14528, 1824,18624, 1832,22720, 1840,26816, 1848,30912, + 1856,2752, 1864,6848, 1872,10944, 1880,15040, 1888,19136, 1896,23232, + 1904,27328, 1912,31424, 1920,3264, 1928,7360, 1936,11456, 1944,15552, + 1952,19648, 1960,23744, 1968,27840, 1976,31936, 1984,3776, 1992,7872, + 2000,11968, 2008,16064, 2016,20160, 2024,24256, 2032,28352, 2040,32448, + 2056,4352, 2064,8448, 2072,12544, 2080,16640, 2088,20736, 2096,24832, + 2104,28928, 2120,4864, 2128,8960, 2136,13056, 2144,17152, 2152,21248, + 2160,25344, 2168,29440, 2184,5376, 2192,9472, 2200,13568, 2208,17664, + 2216,21760, 2224,25856, 2232,29952, 2248,5888, 2256,9984, 2264,14080, + 2272,18176, 2280,22272, 2288,26368, 2296,30464, 2312,6400, 2320,10496, + 2328,14592, 2336,18688, 2344,22784, 2352,26880, 2360,30976, 2368,2816, + 2376,6912, 2384,11008, 2392,15104, 2400,19200, 2408,23296, 2416,27392, + 2424,31488, 2432,3328, 2440,7424, 2448,11520, 2456,15616, 2464,19712, + 2472,23808, 2480,27904, 2488,32000, 2496,3840, 2504,7936, 2512,12032, + 2520,16128, 2528,20224, 2536,24320, 2544,28416, 2552,32512, 2568,4416, + 2576,8512, 2584,12608, 2592,16704, 2600,20800, 2608,24896, 2616,28992, + 2632,4928, 2640,9024, 2648,13120, 2656,17216, 2664,21312, 2672,25408, + 2680,29504, 2696,5440, 2704,9536, 2712,13632, 2720,17728, 2728,21824, + 2736,25920, 2744,30016, 2760,5952, 2768,10048, 2776,14144, 2784,18240, + 2792,22336, 2800,26432, 2808,30528, 2824,6464, 2832,10560, 2840,14656, + 2848,18752, 2856,22848, 2864,26944, 2872,31040, 2888,6976, 2896,11072, + 2904,15168, 2912,19264, 2920,23360, 2928,27456, 2936,31552, 2944,3392, + 2952,7488, 2960,11584, 2968,15680, 2976,19776, 2984,23872, 2992,27968, + 3000,32064, 3008,3904, 3016,8000, 3024,12096, 3032,16192, 3040,20288, + 3048,24384, 3056,28480, 3064,32576, 3080,4480, 3088,8576, 3096,12672, + 3104,16768, 3112,20864, 3120,24960, 3128,29056, 3144,4992, 3152,9088, + 3160,13184, 3168,17280, 3176,21376, 3184,25472, 3192,29568, 3208,5504, + 3216,9600, 3224,13696, 3232,17792, 3240,21888, 3248,25984, 3256,30080, + 3272,6016, 3280,10112, 3288,14208, 3296,18304, 3304,22400, 3312,26496, + 3320,30592, 3336,6528, 3344,10624, 3352,14720, 3360,18816, 3368,22912, + 3376,27008, 3384,31104, 3400,7040, 3408,11136, 3416,15232, 3424,19328, + 3432,23424, 3440,27520, 3448,31616, 3464,7552, 3472,11648, 3480,15744, + 3488,19840, 3496,23936, 3504,28032, 3512,32128, 3520,3968, 3528,8064, + 3536,12160, 3544,16256, 3552,20352, 3560,24448, 3568,28544, 3576,32640, + 3592,4544, 3600,8640, 3608,12736, 3616,16832, 3624,20928, 3632,25024, + 3640,29120, 3656,5056, 3664,9152, 3672,13248, 3680,17344, 3688,21440, + 3696,25536, 3704,29632, 3720,5568, 3728,9664, 3736,13760, 3744,17856, + 3752,21952, 3760,26048, 3768,30144, 3784,6080, 3792,10176, 3800,14272, + 3808,18368, 3816,22464, 3824,26560, 3832,30656, 3848,6592, 3856,10688, + 3864,14784, 3872,18880, 3880,22976, 3888,27072, 3896,31168, 3912,7104, + 3920,11200, 3928,15296, 3936,19392, 3944,23488, 3952,27584, 3960,31680, + 3976,7616, 3984,11712, 3992,15808, 4000,19904, 4008,24000, 4016,28096, + 4024,32192, 4040,8128, 4048,12224, 4056,16320, 4064,20416, 4072,24512, + 4080,28608, 4088,32704, 4112,8200, 4120,12296, 4128,16392, 4136,20488, + 4144,24584, 4152,28680, 4168,4616, 4176,8712, 4184,12808, 4192,16904, + 4200,21000, 4208,25096, 4216,29192, 4232,5128, 4240,9224, 4248,13320, + 4256,17416, 4264,21512, 4272,25608, 4280,29704, 4296,5640, 4304,9736, + 4312,13832, 4320,17928, 4328,22024, 4336,26120, 4344,30216, 4360,6152, + 4368,10248, 4376,14344, 4384,18440, 4392,22536, 4400,26632, 4408,30728, + 4424,6664, 4432,10760, 4440,14856, 4448,18952, 4456,23048, 4464,27144, + 4472,31240, 4488,7176, 4496,11272, 4504,15368, 4512,19464, 4520,23560, + 4528,27656, 4536,31752, 4552,7688, 4560,11784, 4568,15880, 4576,19976, + 4584,24072, 4592,28168, 4600,32264, 4624,8264, 4632,12360, 4640,16456, + 4648,20552, 4656,24648, 4664,28744, 4688,8776, 4696,12872, 4704,16968, + 4712,21064, 4720,25160, 4728,29256, 4744,5192, 4752,9288, 4760,13384, + 4768,17480, 4776,21576, 4784,25672, 4792,29768, 4808,5704, 4816,9800, + 4824,13896, 4832,17992, 4840,22088, 4848,26184, 4856,30280, 4872,6216, + 4880,10312, 4888,14408, 4896,18504, 4904,22600, 4912,26696, 4920,30792, + 4936,6728, 4944,10824, 4952,14920, 4960,19016, 4968,23112, 4976,27208, + 4984,31304, 5000,7240, 5008,11336, 5016,15432, 5024,19528, 5032,23624, + 5040,27720, 5048,31816, 5064,7752, 5072,11848, 5080,15944, 5088,20040, + 5096,24136, 5104,28232, 5112,32328, 5136,8328, 5144,12424, 5152,16520, + 5160,20616, 5168,24712, 5176,28808, 5200,8840, 5208,12936, 5216,17032, + 5224,21128, 5232,25224, 5240,29320, 5264,9352, 5272,13448, 5280,17544, + 5288,21640, 5296,25736, 5304,29832, 5320,5768, 5328,9864, 5336,13960, + 5344,18056, 5352,22152, 5360,26248, 5368,30344, 5384,6280, 5392,10376, + 5400,14472, 5408,18568, 5416,22664, 5424,26760, 5432,30856, 5448,6792, + 5456,10888, 5464,14984, 5472,19080, 5480,23176, 5488,27272, 5496,31368, + 5512,7304, 5520,11400, 5528,15496, 5536,19592, 5544,23688, 5552,27784, + 5560,31880, 5576,7816, 5584,11912, 5592,16008, 5600,20104, 5608,24200, + 5616,28296, 5624,32392, 5648,8392, 5656,12488, 5664,16584, 5672,20680, + 5680,24776, 5688,28872, 5712,8904, 5720,13000, 5728,17096, 5736,21192, + 5744,25288, 5752,29384, 5776,9416, 5784,13512, 5792,17608, 5800,21704, + 5808,25800, 5816,29896, 5840,9928, 5848,14024, 5856,18120, 5864,22216, + 5872,26312, 5880,30408, 5896,6344, 5904,10440, 5912,14536, 5920,18632, + 5928,22728, 5936,26824, 5944,30920, 5960,6856, 5968,10952, 5976,15048, + 5984,19144, 5992,23240, 6000,27336, 6008,31432, 6024,7368, 6032,11464, + 6040,15560, 6048,19656, 6056,23752, 6064,27848, 6072,31944, 6088,7880, + 6096,11976, 6104,16072, 6112,20168, 6120,24264, 6128,28360, 6136,32456, + 6160,8456, 6168,12552, 6176,16648, 6184,20744, 6192,24840, 6200,28936, + 6224,8968, 6232,13064, 6240,17160, 6248,21256, 6256,25352, 6264,29448, + 6288,9480, 6296,13576, 6304,17672, 6312,21768, 6320,25864, 6328,29960, + 6352,9992, 6360,14088, 6368,18184, 6376,22280, 6384,26376, 6392,30472, + 6416,10504, 6424,14600, 6432,18696, 6440,22792, 6448,26888, 6456,30984, + 6472,6920, 6480,11016, 6488,15112, 6496,19208, 6504,23304, 6512,27400, + 6520,31496, 6536,7432, 6544,11528, 6552,15624, 6560,19720, 6568,23816, + 6576,27912, 6584,32008, 6600,7944, 6608,12040, 6616,16136, 6624,20232, + 6632,24328, 6640,28424, 6648,32520, 6672,8520, 6680,12616, 6688,16712, + 6696,20808, 6704,24904, 6712,29000, 6736,9032, 6744,13128, 6752,17224, + 6760,21320, 6768,25416, 6776,29512, 6800,9544, 6808,13640, 6816,17736, + 6824,21832, 6832,25928, 6840,30024, 6864,10056, 6872,14152, 6880,18248, + 6888,22344, 6896,26440, 6904,30536, 6928,10568, 6936,14664, 6944,18760, + 6952,22856, 6960,26952, 6968,31048, 6992,11080, 7000,15176, 7008,19272, + 7016,23368, 7024,27464, 7032,31560, 7048,7496, 7056,11592, 7064,15688, + 7072,19784, 7080,23880, 7088,27976, 7096,32072, 7112,8008, 7120,12104, + 7128,16200, 7136,20296, 7144,24392, 7152,28488, 7160,32584, 7184,8584, + 7192,12680, 7200,16776, 7208,20872, 7216,24968, 7224,29064, 7248,9096, + 7256,13192, 7264,17288, 7272,21384, 7280,25480, 7288,29576, 7312,9608, + 7320,13704, 7328,17800, 7336,21896, 7344,25992, 7352,30088, 7376,10120, + 7384,14216, 7392,18312, 7400,22408, 7408,26504, 7416,30600, 7440,10632, + 7448,14728, 7456,18824, 7464,22920, 7472,27016, 7480,31112, 7504,11144, + 7512,15240, 7520,19336, 7528,23432, 7536,27528, 7544,31624, 7568,11656, + 7576,15752, 7584,19848, 7592,23944, 7600,28040, 7608,32136, 7624,8072, + 7632,12168, 7640,16264, 7648,20360, 7656,24456, 7664,28552, 7672,32648, + 7696,8648, 7704,12744, 7712,16840, 7720,20936, 7728,25032, 7736,29128, + 7760,9160, 7768,13256, 7776,17352, 7784,21448, 7792,25544, 7800,29640, + 7824,9672, 7832,13768, 7840,17864, 7848,21960, 7856,26056, 7864,30152, + 7888,10184, 7896,14280, 7904,18376, 7912,22472, 7920,26568, 7928,30664, + 7952,10696, 7960,14792, 7968,18888, 7976,22984, 7984,27080, 7992,31176, + 8016,11208, 8024,15304, 8032,19400, 8040,23496, 8048,27592, 8056,31688, + 8080,11720, 8088,15816, 8096,19912, 8104,24008, 8112,28104, 8120,32200, + 8144,12232, 8152,16328, 8160,20424, 8168,24520, 8176,28616, 8184,32712, + 8216,12304, 8224,16400, 8232,20496, 8240,24592, 8248,28688, 8272,8720, + 8280,12816, 8288,16912, 8296,21008, 8304,25104, 8312,29200, 8336,9232, + 8344,13328, 8352,17424, 8360,21520, 8368,25616, 8376,29712, 8400,9744, + 8408,13840, 8416,17936, 8424,22032, 8432,26128, 8440,30224, 8464,10256, + 8472,14352, 8480,18448, 8488,22544, 8496,26640, 8504,30736, 8528,10768, + 8536,14864, 8544,18960, 8552,23056, 8560,27152, 8568,31248, 8592,11280, + 8600,15376, 8608,19472, 8616,23568, 8624,27664, 8632,31760, 8656,11792, + 8664,15888, 8672,19984, 8680,24080, 8688,28176, 8696,32272, 8728,12368, + 8736,16464, 8744,20560, 8752,24656, 8760,28752, 8792,12880, 8800,16976, + 8808,21072, 8816,25168, 8824,29264, 8848,9296, 8856,13392, 8864,17488, + 8872,21584, 8880,25680, 8888,29776, 8912,9808, 8920,13904, 8928,18000, + 8936,22096, 8944,26192, 8952,30288, 8976,10320, 8984,14416, 8992,18512, + 9000,22608, 9008,26704, 9016,30800, 9040,10832, 9048,14928, 9056,19024, + 9064,23120, 9072,27216, 9080,31312, 9104,11344, 9112,15440, 9120,19536, + 9128,23632, 9136,27728, 9144,31824, 9168,11856, 9176,15952, 9184,20048, + 9192,24144, 9200,28240, 9208,32336, 9240,12432, 9248,16528, 9256,20624, + 9264,24720, 9272,28816, 9304,12944, 9312,17040, 9320,21136, 9328,25232, + 9336,29328, 9368,13456, 9376,17552, 9384,21648, 9392,25744, 9400,29840, + 9424,9872, 9432,13968, 9440,18064, 9448,22160, 9456,26256, 9464,30352, + 9488,10384, 9496,14480, 9504,18576, 9512,22672, 9520,26768, 9528,30864, + 9552,10896, 9560,14992, 9568,19088, 9576,23184, 9584,27280, 9592,31376, + 9616,11408, 9624,15504, 9632,19600, 9640,23696, 9648,27792, 9656,31888, + 9680,11920, 9688,16016, 9696,20112, 9704,24208, 9712,28304, 9720,32400, + 9752,12496, 9760,16592, 9768,20688, 9776,24784, 9784,28880, 9816,13008, + 9824,17104, 9832,21200, 9840,25296, 9848,29392, 9880,13520, 9888,17616, + 9896,21712, 9904,25808, 9912,29904, 9944,14032, 9952,18128, 9960,22224, + 9968,26320, 9976,30416, 10000,10448, 10008,14544, 10016,18640, 10024,22736, + 10032,26832, 10040,30928, 10064,10960, 10072,15056, 10080,19152, + 10088,23248, 10096,27344, 10104,31440, 10128,11472, 10136,15568, + 10144,19664, 10152,23760, 10160,27856, 10168,31952, 10192,11984, + 10200,16080, 10208,20176, 10216,24272, 10224,28368, 10232,32464, + 10264,12560, 10272,16656, 10280,20752, 10288,24848, 10296,28944, + 10328,13072, 10336,17168, 10344,21264, 10352,25360, 10360,29456, + 10392,13584, 10400,17680, 10408,21776, 10416,25872, 10424,29968, + 10456,14096, 10464,18192, 10472,22288, 10480,26384, 10488,30480, + 10520,14608, 10528,18704, 10536,22800, 10544,26896, 10552,30992, + 10576,11024, 10584,15120, 10592,19216, 10600,23312, 10608,27408, + 10616,31504, 10640,11536, 10648,15632, 10656,19728, 10664,23824, + 10672,27920, 10680,32016, 10704,12048, 10712,16144, 10720,20240, + 10728,24336, 10736,28432, 10744,32528, 10776,12624, 10784,16720, + 10792,20816, 10800,24912, 10808,29008, 10840,13136, 10848,17232, + 10856,21328, 10864,25424, 10872,29520, 10904,13648, 10912,17744, + 10920,21840, 10928,25936, 10936,30032, 10968,14160, 10976,18256, + 10984,22352, 10992,26448, 11000,30544, 11032,14672, 11040,18768, + 11048,22864, 11056,26960, 11064,31056, 11096,15184, 11104,19280, + 11112,23376, 11120,27472, 11128,31568, 11152,11600, 11160,15696, + 11168,19792, 11176,23888, 11184,27984, 11192,32080, 11216,12112, + 11224,16208, 11232,20304, 11240,24400, 11248,28496, 11256,32592, + 11288,12688, 11296,16784, 11304,20880, 11312,24976, 11320,29072, + 11352,13200, 11360,17296, 11368,21392, 11376,25488, 11384,29584, + 11416,13712, 11424,17808, 11432,21904, 11440,26000, 11448,30096, + 11480,14224, 11488,18320, 11496,22416, 11504,26512, 11512,30608, + 11544,14736, 11552,18832, 11560,22928, 11568,27024, 11576,31120, + 11608,15248, 11616,19344, 11624,23440, 11632,27536, 11640,31632, + 11672,15760, 11680,19856, 11688,23952, 11696,28048, 11704,32144, + 11728,12176, 11736,16272, 11744,20368, 11752,24464, 11760,28560, + 11768,32656, 11800,12752, 11808,16848, 11816,20944, 11824,25040, + 11832,29136, 11864,13264, 11872,17360, 11880,21456, 11888,25552, + 11896,29648, 11928,13776, 11936,17872, 11944,21968, 11952,26064, + 11960,30160, 11992,14288, 12000,18384, 12008,22480, 12016,26576, + 12024,30672, 12056,14800, 12064,18896, 12072,22992, 12080,27088, + 12088,31184, 12120,15312, 12128,19408, 12136,23504, 12144,27600, + 12152,31696, 12184,15824, 12192,19920, 12200,24016, 12208,28112, + 12216,32208, 12248,16336, 12256,20432, 12264,24528, 12272,28624, + 12280,32720, 12320,16408, 12328,20504, 12336,24600, 12344,28696, + 12376,12824, 12384,16920, 12392,21016, 12400,25112, 12408,29208, + 12440,13336, 12448,17432, 12456,21528, 12464,25624, 12472,29720, + 12504,13848, 12512,17944, 12520,22040, 12528,26136, 12536,30232, + 12568,14360, 12576,18456, 12584,22552, 12592,26648, 12600,30744, + 12632,14872, 12640,18968, 12648,23064, 12656,27160, 12664,31256, + 12696,15384, 12704,19480, 12712,23576, 12720,27672, 12728,31768, + 12760,15896, 12768,19992, 12776,24088, 12784,28184, 12792,32280, + 12832,16472, 12840,20568, 12848,24664, 12856,28760, 12896,16984, + 12904,21080, 12912,25176, 12920,29272, 12952,13400, 12960,17496, + 12968,21592, 12976,25688, 12984,29784, 13016,13912, 13024,18008, + 13032,22104, 13040,26200, 13048,30296, 13080,14424, 13088,18520, + 13096,22616, 13104,26712, 13112,30808, 13144,14936, 13152,19032, + 13160,23128, 13168,27224, 13176,31320, 13208,15448, 13216,19544, + 13224,23640, 13232,27736, 13240,31832, 13272,15960, 13280,20056, + 13288,24152, 13296,28248, 13304,32344, 13344,16536, 13352,20632, + 13360,24728, 13368,28824, 13408,17048, 13416,21144, 13424,25240, + 13432,29336, 13472,17560, 13480,21656, 13488,25752, 13496,29848, + 13528,13976, 13536,18072, 13544,22168, 13552,26264, 13560,30360, + 13592,14488, 13600,18584, 13608,22680, 13616,26776, 13624,30872, + 13656,15000, 13664,19096, 13672,23192, 13680,27288, 13688,31384, + 13720,15512, 13728,19608, 13736,23704, 13744,27800, 13752,31896, + 13784,16024, 13792,20120, 13800,24216, 13808,28312, 13816,32408, + 13856,16600, 13864,20696, 13872,24792, 13880,28888, 13920,17112, + 13928,21208, 13936,25304, 13944,29400, 13984,17624, 13992,21720, + 14000,25816, 14008,29912, 14048,18136, 14056,22232, 14064,26328, + 14072,30424, 14104,14552, 14112,18648, 14120,22744, 14128,26840, + 14136,30936, 14168,15064, 14176,19160, 14184,23256, 14192,27352, + 14200,31448, 14232,15576, 14240,19672, 14248,23768, 14256,27864, + 14264,31960, 14296,16088, 14304,20184, 14312,24280, 14320,28376, + 14328,32472, 14368,16664, 14376,20760, 14384,24856, 14392,28952, + 14432,17176, 14440,21272, 14448,25368, 14456,29464, 14496,17688, + 14504,21784, 14512,25880, 14520,29976, 14560,18200, 14568,22296, + 14576,26392, 14584,30488, 14624,18712, 14632,22808, 14640,26904, + 14648,31000, 14680,15128, 14688,19224, 14696,23320, 14704,27416, + 14712,31512, 14744,15640, 14752,19736, 14760,23832, 14768,27928, + 14776,32024, 14808,16152, 14816,20248, 14824,24344, 14832,28440, + 14840,32536, 14880,16728, 14888,20824, 14896,24920, 14904,29016, + 14944,17240, 14952,21336, 14960,25432, 14968,29528, 15008,17752, + 15016,21848, 15024,25944, 15032,30040, 15072,18264, 15080,22360, + 15088,26456, 15096,30552, 15136,18776, 15144,22872, 15152,26968, + 15160,31064, 15200,19288, 15208,23384, 15216,27480, 15224,31576, + 15256,15704, 15264,19800, 15272,23896, 15280,27992, 15288,32088, + 15320,16216, 15328,20312, 15336,24408, 15344,28504, 15352,32600, + 15392,16792, 15400,20888, 15408,24984, 15416,29080, 15456,17304, + 15464,21400, 15472,25496, 15480,29592, 15520,17816, 15528,21912, + 15536,26008, 15544,30104, 15584,18328, 15592,22424, 15600,26520, + 15608,30616, 15648,18840, 15656,22936, 15664,27032, 15672,31128, + 15712,19352, 15720,23448, 15728,27544, 15736,31640, 15776,19864, + 15784,23960, 15792,28056, 15800,32152, 15832,16280, 15840,20376, + 15848,24472, 15856,28568, 15864,32664, 15904,16856, 15912,20952, + 15920,25048, 15928,29144, 15968,17368, 15976,21464, 15984,25560, + 15992,29656, 16032,17880, 16040,21976, 16048,26072, 16056,30168, + 16096,18392, 16104,22488, 16112,26584, 16120,30680, 16160,18904, + 16168,23000, 16176,27096, 16184,31192, 16224,19416, 16232,23512, + 16240,27608, 16248,31704, 16288,19928, 16296,24024, 16304,28120, + 16312,32216, 16352,20440, 16360,24536, 16368,28632, 16376,32728, + 16424,20512, 16432,24608, 16440,28704, 16480,16928, 16488,21024, + 16496,25120, 16504,29216, 16544,17440, 16552,21536, 16560,25632, + 16568,29728, 16608,17952, 16616,22048, 16624,26144, 16632,30240, + 16672,18464, 16680,22560, 16688,26656, 16696,30752, 16736,18976, + 16744,23072, 16752,27168, 16760,31264, 16800,19488, 16808,23584, + 16816,27680, 16824,31776, 16864,20000, 16872,24096, 16880,28192, + 16888,32288, 16936,20576, 16944,24672, 16952,28768, 17000,21088, + 17008,25184, 17016,29280, 17056,17504, 17064,21600, 17072,25696, + 17080,29792, 17120,18016, 17128,22112, 17136,26208, 17144,30304, + 17184,18528, 17192,22624, 17200,26720, 17208,30816, 17248,19040, + 17256,23136, 17264,27232, 17272,31328, 17312,19552, 17320,23648, + 17328,27744, 17336,31840, 17376,20064, 17384,24160, 17392,28256, + 17400,32352, 17448,20640, 17456,24736, 17464,28832, 17512,21152, + 17520,25248, 17528,29344, 17576,21664, 17584,25760, 17592,29856, + 17632,18080, 17640,22176, 17648,26272, 17656,30368, 17696,18592, + 17704,22688, 17712,26784, 17720,30880, 17760,19104, 17768,23200, + 17776,27296, 17784,31392, 17824,19616, 17832,23712, 17840,27808, + 17848,31904, 17888,20128, 17896,24224, 17904,28320, 17912,32416, + 17960,20704, 17968,24800, 17976,28896, 18024,21216, 18032,25312, + 18040,29408, 18088,21728, 18096,25824, 18104,29920, 18152,22240, + 18160,26336, 18168,30432, 18208,18656, 18216,22752, 18224,26848, + 18232,30944, 18272,19168, 18280,23264, 18288,27360, 18296,31456, + 18336,19680, 18344,23776, 18352,27872, 18360,31968, 18400,20192, + 18408,24288, 18416,28384, 18424,32480, 18472,20768, 18480,24864, + 18488,28960, 18536,21280, 18544,25376, 18552,29472, 18600,21792, + 18608,25888, 18616,29984, 18664,22304, 18672,26400, 18680,30496, + 18728,22816, 18736,26912, 18744,31008, 18784,19232, 18792,23328, + 18800,27424, 18808,31520, 18848,19744, 18856,23840, 18864,27936, + 18872,32032, 18912,20256, 18920,24352, 18928,28448, 18936,32544, + 18984,20832, 18992,24928, 19000,29024, 19048,21344, 19056,25440, + 19064,29536, 19112,21856, 19120,25952, 19128,30048, 19176,22368, + 19184,26464, 19192,30560, 19240,22880, 19248,26976, 19256,31072, + 19304,23392, 19312,27488, 19320,31584, 19360,19808, 19368,23904, + 19376,28000, 19384,32096, 19424,20320, 19432,24416, 19440,28512, + 19448,32608, 19496,20896, 19504,24992, 19512,29088, 19560,21408, + 19568,25504, 19576,29600, 19624,21920, 19632,26016, 19640,30112, + 19688,22432, 19696,26528, 19704,30624, 19752,22944, 19760,27040, + 19768,31136, 19816,23456, 19824,27552, 19832,31648, 19880,23968, + 19888,28064, 19896,32160, 19936,20384, 19944,24480, 19952,28576, + 19960,32672, 20008,20960, 20016,25056, 20024,29152, 20072,21472, + 20080,25568, 20088,29664, 20136,21984, 20144,26080, 20152,30176, + 20200,22496, 20208,26592, 20216,30688, 20264,23008, 20272,27104, + 20280,31200, 20328,23520, 20336,27616, 20344,31712, 20392,24032, + 20400,28128, 20408,32224, 20456,24544, 20464,28640, 20472,32736, + 20528,24616, 20536,28712, 20584,21032, 20592,25128, 20600,29224, + 20648,21544, 20656,25640, 20664,29736, 20712,22056, 20720,26152, + 20728,30248, 20776,22568, 20784,26664, 20792,30760, 20840,23080, + 20848,27176, 20856,31272, 20904,23592, 20912,27688, 20920,31784, + 20968,24104, 20976,28200, 20984,32296, 21040,24680, 21048,28776, + 21104,25192, 21112,29288, 21160,21608, 21168,25704, 21176,29800, + 21224,22120, 21232,26216, 21240,30312, 21288,22632, 21296,26728, + 21304,30824, 21352,23144, 21360,27240, 21368,31336, 21416,23656, + 21424,27752, 21432,31848, 21480,24168, 21488,28264, 21496,32360, + 21552,24744, 21560,28840, 21616,25256, 21624,29352, 21680,25768, + 21688,29864, 21736,22184, 21744,26280, 21752,30376, 21800,22696, + 21808,26792, 21816,30888, 21864,23208, 21872,27304, 21880,31400, + 21928,23720, 21936,27816, 21944,31912, 21992,24232, 22000,28328, + 22008,32424, 22064,24808, 22072,28904, 22128,25320, 22136,29416, + 22192,25832, 22200,29928, 22256,26344, 22264,30440, 22312,22760, + 22320,26856, 22328,30952, 22376,23272, 22384,27368, 22392,31464, + 22440,23784, 22448,27880, 22456,31976, 22504,24296, 22512,28392, + 22520,32488, 22576,24872, 22584,28968, 22640,25384, 22648,29480, + 22704,25896, 22712,29992, 22768,26408, 22776,30504, 22832,26920, + 22840,31016, 22888,23336, 22896,27432, 22904,31528, 22952,23848, + 22960,27944, 22968,32040, 23016,24360, 23024,28456, 23032,32552, + 23088,24936, 23096,29032, 23152,25448, 23160,29544, 23216,25960, + 23224,30056, 23280,26472, 23288,30568, 23344,26984, 23352,31080, + 23408,27496, 23416,31592, 23464,23912, 23472,28008, 23480,32104, + 23528,24424, 23536,28520, 23544,32616, 23600,25000, 23608,29096, + 23664,25512, 23672,29608, 23728,26024, 23736,30120, 23792,26536, + 23800,30632, 23856,27048, 23864,31144, 23920,27560, 23928,31656, + 23984,28072, 23992,32168, 24040,24488, 24048,28584, 24056,32680, + 24112,25064, 24120,29160, 24176,25576, 24184,29672, 24240,26088, + 24248,30184, 24304,26600, 24312,30696, 24368,27112, 24376,31208, + 24432,27624, 24440,31720, 24496,28136, 24504,32232, 24560,28648, + 24568,32744, 24632,28720, 24688,25136, 24696,29232, 24752,25648, + 24760,29744, 24816,26160, 24824,30256, 24880,26672, 24888,30768, + 24944,27184, 24952,31280, 25008,27696, 25016,31792, 25072,28208, + 25080,32304, 25144,28784, 25208,29296, 25264,25712, 25272,29808, + 25328,26224, 25336,30320, 25392,26736, 25400,30832, 25456,27248, + 25464,31344, 25520,27760, 25528,31856, 25584,28272, 25592,32368, + 25656,28848, 25720,29360, 25784,29872, 25840,26288, 25848,30384, + 25904,26800, 25912,30896, 25968,27312, 25976,31408, 26032,27824, + 26040,31920, 26096,28336, 26104,32432, 26168,28912, 26232,29424, + 26296,29936, 26360,30448, 26416,26864, 26424,30960, 26480,27376, + 26488,31472, 26544,27888, 26552,31984, 26608,28400, 26616,32496, + 26680,28976, 26744,29488, 26808,30000, 26872,30512, 26936,31024, + 26992,27440, 27000,31536, 27056,27952, 27064,32048, 27120,28464, + 27128,32560, 27192,29040, 27256,29552, 27320,30064, 27384,30576, + 27448,31088, 27512,31600, 27568,28016, 27576,32112, 27632,28528, + 27640,32624, 27704,29104, 27768,29616, 27832,30128, 27896,30640, + 27960,31152, 28024,31664, 28088,32176, 28144,28592, 28152,32688, + 28216,29168, 28280,29680, 28344,30192, 28408,30704, 28472,31216, + 28536,31728, 28600,32240, 28664,32752, 28792,29240, 28856,29752, + 28920,30264, 28984,30776, 29048,31288, 29112,31800, 29176,32312, + 29368,29816, 29432,30328, 29496,30840, 29560,31352, 29624,31864, + 29688,32376, 29944,30392, 30008,30904, 30072,31416, 30136,31928, + 30200,32440, 30520,30968, 30584,31480, 30648,31992, 30712,32504, + 31096,31544, 31160,32056, 31224,32568, 31672,32120, 31736,32632, + 32248,32696 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_16) + +const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH] = +{ + /* radix 4, size 12 */ + 8,64, 16,32, 24,96, 40,80, 56,112, 88,104 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_32) +const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH] = +{ + /* 4x2, size 24 */ + 8,128, 16,64, 24,192, 40,160, 48,96, 56,224, 72,144, + 88,208, 104,176, 120,240, 152,200, 184,232 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_64) +const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH] = +{ + /* radix 4, size 56 */ + 8,256, 16,128, 24,384, 32,64, 40,320, 48,192, 56,448, 72,288, 80,160, 88,416, 104,352, + 112,224, 120,480, 136,272, 152,400, 168,336, 176,208, 184,464, 200,304, 216,432, + 232,368, 248,496, 280,392, 296,328, 312,456, 344,424, 376,488, 440,472 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_128) +const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH] = +{ + /* 4x2, size 112 */ + 8,512, 16,256, 24,768, 32,128, 40,640, 48,384, 56,896, 72,576, 80,320, 88,832, 96,192, + 104,704, 112,448, 120,960, 136,544, 144,288, 152,800, 168,672, 176,416, 184,928, 200,608, + 208,352, 216,864, 232,736, 240,480, 248,992, 264,528, 280,784, 296,656, 304,400, 312,912, + 328,592, 344,848, 360,720, 368,464, 376,976, 392,560, 408,816, 424,688, 440,944, 456,624, + 472,880, 488,752, 504,1008, 536,776, 552,648, 568,904, 600,840, 616,712, 632,968, + 664,808, 696,936, 728,872, 760,1000, 824,920, 888,984 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_256) +const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH] = +{ + /* radix 4, size 240 */ + 8,1024, 16,512, 24,1536, 32,256, 40,1280, 48,768, 56,1792, 64,128, 72,1152, 80,640, + 88,1664, 96,384, 104,1408, 112,896, 120,1920, 136,1088, 144,576, 152,1600, 160,320, + 168,1344, 176,832, 184,1856, 200,1216, 208,704, 216,1728, 224,448, 232,1472, 240,960, + 248,1984, 264,1056, 272,544, 280,1568, 296,1312, 304,800, 312,1824, 328,1184, 336,672, + 344,1696, 352,416, 360,1440, 368,928, 376,1952, 392,1120, 400,608, 408,1632, 424,1376, + 432,864, 440,1888, 456,1248, 464,736, 472,1760, 488,1504, 496,992, 504,2016, 520,1040, + 536,1552, 552,1296, 560,784, 568,1808, 584,1168, 592,656, 600,1680, 616,1424, 624,912, + 632,1936, 648,1104, 664,1616, 680,1360, 688,848, 696,1872, 712,1232, 728,1744, 744,1488, + 752,976, 760,2000, 776,1072, 792,1584, 808,1328, 824,1840, 840,1200, 856,1712, 872,1456, + 880,944, 888,1968, 904,1136, 920,1648, 936,1392, 952,1904, 968,1264, 984,1776, 1000,1520, + 1016,2032, 1048,1544, 1064,1288, 1080,1800, 1096,1160, 1112,1672, 1128,1416, 1144,1928, + 1176,1608, 1192,1352, 1208,1864, 1240,1736, 1256,1480, 1272,1992, 1304,1576, 1336,1832, + 1368,1704, 1384,1448, 1400,1960, 1432,1640, 1464,1896, 1496,1768, 1528,2024, 1592,1816, + 1624,1688, 1656,1944, 1720,1880, 1784,2008, 1912,1976 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_512) +const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH] = +{ + /* 4x2, size 480 */ + 8,2048, 16,1024, 24,3072, 32,512, 40,2560, 48,1536, 56,3584, 64,256, 72,2304, 80,1280, + 88,3328, 96,768, 104,2816, 112,1792, 120,3840, 136,2176, 144,1152, 152,3200, 160,640, + 168,2688, 176,1664, 184,3712, 192,384, 200,2432, 208,1408, 216,3456, 224,896, 232,2944, + 240,1920, 248,3968, 264,2112, 272,1088, 280,3136, 288,576, 296,2624, 304,1600, 312,3648, + 328,2368, 336,1344, 344,3392, 352,832, 360,2880, 368,1856, 376,3904, 392,2240, 400,1216, + 408,3264, 416,704, 424,2752, 432,1728, 440,3776, 456,2496, 464,1472, 472,3520, 480,960, + 488,3008, 496,1984, 504,4032, 520,2080, 528,1056, 536,3104, 552,2592, 560,1568, 568,3616, + 584,2336, 592,1312, 600,3360, 608,800, 616,2848, 624,1824, 632,3872, 648,2208, 656,1184, + 664,3232, 680,2720, 688,1696, 696,3744, 712,2464, 720,1440, 728,3488, 736,928, 744,2976, + 752,1952, 760,4000, 776,2144, 784,1120, 792,3168, 808,2656, 816,1632, 824,3680, 840,2400, + 848,1376, 856,3424, 872,2912, 880,1888, 888,3936, 904,2272, 912,1248, 920,3296, 936,2784, + 944,1760, 952,3808, 968,2528, 976,1504, 984,3552, 1000,3040, 1008,2016, 1016,4064, + 1032,2064, 1048,3088, 1064,2576, 1072,1552, 1080,3600, 1096,2320, 1104,1296, 1112,3344, + 1128,2832, 1136,1808, 1144,3856, 1160,2192, 1176,3216, 1192,2704, 1200,1680, 1208,3728, + 1224,2448, 1232,1424, 1240,3472, 1256,2960, 1264,1936, 1272,3984, 1288,2128, 1304,3152, + 1320,2640, 1328,1616, 1336,3664, 1352,2384, 1368,3408, 1384,2896, 1392,1872, 1400,3920, + 1416,2256, 1432,3280, 1448,2768, 1456,1744, 1464,3792, 1480,2512, 1496,3536, 1512,3024, + 1520,2000, 1528,4048, 1544,2096, 1560,3120, 1576,2608, 1592,3632, 1608,2352, 1624,3376, + 1640,2864, 1648,1840, 1656,3888, 1672,2224, 1688,3248, 1704,2736, 1720,3760, 1736,2480, + 1752,3504, 1768,2992, 1776,1968, 1784,4016, 1800,2160, 1816,3184, 1832,2672, 1848,3696, + 1864,2416, 1880,3440, 1896,2928, 1912,3952, 1928,2288, 1944,3312, 1960,2800, 1976,3824, + 1992,2544, 2008,3568, 2024,3056, 2040,4080, 2072,3080, 2088,2568, 2104,3592, 2120,2312, + 2136,3336, 2152,2824, 2168,3848, 2200,3208, 2216,2696, 2232,3720, 2248,2440, 2264,3464, + 2280,2952, 2296,3976, 2328,3144, 2344,2632, 2360,3656, 2392,3400, 2408,2888, 2424,3912, + 2456,3272, 2472,2760, 2488,3784, 2520,3528, 2536,3016, 2552,4040, 2584,3112, 2616,3624, + 2648,3368, 2664,2856, 2680,3880, 2712,3240, 2744,3752, 2776,3496, 2792,2984, 2808,4008, + 2840,3176, 2872,3688, 2904,3432, 2936,3944, 2968,3304, 3000,3816, 3032,3560, 3064,4072, + 3128,3608, 3160,3352, 3192,3864, 3256,3736, 3288,3480, 3320,3992, 3384,3672, 3448,3928, + 3512,3800, 3576,4056, 3704,3896, 3832,4024 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_1024) +const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH] = +{ + /* radix 4, size 992 */ + 8,4096, 16,2048, 24,6144, 32,1024, 40,5120, 48,3072, 56,7168, 64,512, 72,4608, + 80,2560, 88,6656, 96,1536, 104,5632, 112,3584, 120,7680, 128,256, 136,4352, + 144,2304, 152,6400, 160,1280, 168,5376, 176,3328, 184,7424, 192,768, 200,4864, + 208,2816, 216,6912, 224,1792, 232,5888, 240,3840, 248,7936, 264,4224, 272,2176, + 280,6272, 288,1152, 296,5248, 304,3200, 312,7296, 320,640, 328,4736, 336,2688, + 344,6784, 352,1664, 360,5760, 368,3712, 376,7808, 392,4480, 400,2432, 408,6528, + 416,1408, 424,5504, 432,3456, 440,7552, 448,896, 456,4992, 464,2944, 472,7040, + 480,1920, 488,6016, 496,3968, 504,8064, 520,4160, 528,2112, 536,6208, 544,1088, + 552,5184, 560,3136, 568,7232, 584,4672, 592,2624, 600,6720, 608,1600, 616,5696, + 624,3648, 632,7744, 648,4416, 656,2368, 664,6464, 672,1344, 680,5440, 688,3392, + 696,7488, 704,832, 712,4928, 720,2880, 728,6976, 736,1856, 744,5952, 752,3904, + 760,8000, 776,4288, 784,2240, 792,6336, 800,1216, 808,5312, 816,3264, 824,7360, + 840,4800, 848,2752, 856,6848, 864,1728, 872,5824, 880,3776, 888,7872, 904,4544, + 912,2496, 920,6592, 928,1472, 936,5568, 944,3520, 952,7616, 968,5056, 976,3008, + 984,7104, 992,1984, 1000,6080, 1008,4032, 1016,8128, 1032,4128, 1040,2080, + 1048,6176, 1064,5152, 1072,3104, 1080,7200, 1096,4640, 1104,2592, 1112,6688, + 1120,1568, 1128,5664, 1136,3616, 1144,7712, 1160,4384, 1168,2336, 1176,6432, + 1184,1312, 1192,5408, 1200,3360, 1208,7456, 1224,4896, 1232,2848, 1240,6944, + 1248,1824, 1256,5920, 1264,3872, 1272,7968, 1288,4256, 1296,2208, 1304,6304, + 1320,5280, 1328,3232, 1336,7328, 1352,4768, 1360,2720, 1368,6816, 1376,1696, + 1384,5792, 1392,3744, 1400,7840, 1416,4512, 1424,2464, 1432,6560, 1448,5536, + 1456,3488, 1464,7584, 1480,5024, 1488,2976, 1496,7072, 1504,1952, 1512,6048, + 1520,4000, 1528,8096, 1544,4192, 1552,2144, 1560,6240, 1576,5216, 1584,3168, + 1592,7264, 1608,4704, 1616,2656, 1624,6752, 1640,5728, 1648,3680, 1656,7776, + 1672,4448, 1680,2400, 1688,6496, 1704,5472, 1712,3424, 1720,7520, 1736,4960, + 1744,2912, 1752,7008, 1760,1888, 1768,5984, 1776,3936, 1784,8032, 1800,4320, + 1808,2272, 1816,6368, 1832,5344, 1840,3296, 1848,7392, 1864,4832, 1872,2784, + 1880,6880, 1896,5856, 1904,3808, 1912,7904, 1928,4576, 1936,2528, 1944,6624, + 1960,5600, 1968,3552, 1976,7648, 1992,5088, 2000,3040, 2008,7136, 2024,6112, + 2032,4064, 2040,8160, 2056,4112, 2072,6160, 2088,5136, 2096,3088, 2104,7184, + 2120,4624, 2128,2576, 2136,6672, 2152,5648, 2160,3600, 2168,7696, 2184,4368, + 2192,2320, 2200,6416, 2216,5392, 2224,3344, 2232,7440, 2248,4880, 2256,2832, + 2264,6928, 2280,5904, 2288,3856, 2296,7952, 2312,4240, 2328,6288, 2344,5264, + 2352,3216, 2360,7312, 2376,4752, 2384,2704, 2392,6800, 2408,5776, 2416,3728, + 2424,7824, 2440,4496, 2456,6544, 2472,5520, 2480,3472, 2488,7568, 2504,5008, + 2512,2960, 2520,7056, 2536,6032, 2544,3984, 2552,8080, 2568,4176, 2584,6224, + 2600,5200, 2608,3152, 2616,7248, 2632,4688, 2648,6736, 2664,5712, 2672,3664, + 2680,7760, 2696,4432, 2712,6480, 2728,5456, 2736,3408, 2744,7504, 2760,4944, + 2768,2896, 2776,6992, 2792,5968, 2800,3920, 2808,8016, 2824,4304, 2840,6352, + 2856,5328, 2864,3280, 2872,7376, 2888,4816, 2904,6864, 2920,5840, 2928,3792, + 2936,7888, 2952,4560, 2968,6608, 2984,5584, 2992,3536, 3000,7632, 3016,5072, + 3032,7120, 3048,6096, 3056,4048, 3064,8144, 3080,4144, 3096,6192, 3112,5168, + 3128,7216, 3144,4656, 3160,6704, 3176,5680, 3184,3632, 3192,7728, 3208,4400, + 3224,6448, 3240,5424, 3248,3376, 3256,7472, 3272,4912, 3288,6960, 3304,5936, + 3312,3888, 3320,7984, 3336,4272, 3352,6320, 3368,5296, 3384,7344, 3400,4784, + 3416,6832, 3432,5808, 3440,3760, 3448,7856, 3464,4528, 3480,6576, 3496,5552, + 3512,7600, 3528,5040, 3544,7088, 3560,6064, 3568,4016, 3576,8112, 3592,4208, + 3608,6256, 3624,5232, 3640,7280, 3656,4720, 3672,6768, 3688,5744, 3704,7792, + 3720,4464, 3736,6512, 3752,5488, 3768,7536, 3784,4976, 3800,7024, 3816,6000, + 3824,3952, 3832,8048, 3848,4336, 3864,6384, 3880,5360, 3896,7408, 3912,4848, + 3928,6896, 3944,5872, 3960,7920, 3976,4592, 3992,6640, 4008,5616, 4024,7664, + 4040,5104, 4056,7152, 4072,6128, 4088,8176, 4120,6152, 4136,5128, 4152,7176, + 4168,4616, 4184,6664, 4200,5640, 4216,7688, 4232,4360, 4248,6408, 4264,5384, + 4280,7432, 4296,4872, 4312,6920, 4328,5896, 4344,7944, 4376,6280, 4392,5256, + 4408,7304, 4424,4744, 4440,6792, 4456,5768, 4472,7816, 4504,6536, 4520,5512, + 4536,7560, 4552,5000, 4568,7048, 4584,6024, 4600,8072, 4632,6216, 4648,5192, + 4664,7240, 4696,6728, 4712,5704, 4728,7752, 4760,6472, 4776,5448, 4792,7496, + 4808,4936, 4824,6984, 4840,5960, 4856,8008, 4888,6344, 4904,5320, 4920,7368, + 4952,6856, 4968,5832, 4984,7880, 5016,6600, 5032,5576, 5048,7624, 5080,7112, + 5096,6088, 5112,8136, 5144,6184, 5176,7208, 5208,6696, 5224,5672, 5240,7720, + 5272,6440, 5288,5416, 5304,7464, 5336,6952, 5352,5928, 5368,7976, 5400,6312, + 5432,7336, 5464,6824, 5480,5800, 5496,7848, 5528,6568, 5560,7592, 5592,7080, + 5608,6056, 5624,8104, 5656,6248, 5688,7272, 5720,6760, 5752,7784, 5784,6504, + 5816,7528, 5848,7016, 5864,5992, 5880,8040, 5912,6376, 5944,7400, 5976,6888, + 6008,7912, 6040,6632, 6072,7656, 6104,7144, 6136,8168, 6200,7192, 6232,6680, + 6264,7704, 6296,6424, 6328,7448, 6360,6936, 6392,7960, 6456,7320, 6488,6808, + 6520,7832, 6584,7576, 6616,7064, 6648,8088, 6712,7256, 6776,7768, 6840,7512, + 6872,7000, 6904,8024, 6968,7384, 7032,7896, 7096,7640, 7160,8152, 7288,7736, + 7352,7480, 7416,7992, 7544,7864, 7672,8120, 7928,8056 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_2048) +const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH] = +{ + /* 4x2, size 1984 */ + 8,8192, 16,4096, 24,12288, 32,2048, 40,10240, 48,6144, 56,14336, 64,1024, + 72,9216, 80,5120, 88,13312, 96,3072, 104,11264, 112,7168, 120,15360, 128,512, + 136,8704, 144,4608, 152,12800, 160,2560, 168,10752, 176,6656, 184,14848, + 192,1536, 200,9728, 208,5632, 216,13824, 224,3584, 232,11776, 240,7680, + 248,15872, 264,8448, 272,4352, 280,12544, 288,2304, 296,10496, 304,6400, + 312,14592, 320,1280, 328,9472, 336,5376, 344,13568, 352,3328, 360,11520, + 368,7424, 376,15616, 384,768, 392,8960, 400,4864, 408,13056, 416,2816, + 424,11008, 432,6912, 440,15104, 448,1792, 456,9984, 464,5888, 472,14080, + 480,3840, 488,12032, 496,7936, 504,16128, 520,8320, 528,4224, 536,12416, + 544,2176, 552,10368, 560,6272, 568,14464, 576,1152, 584,9344, 592,5248, + 600,13440, 608,3200, 616,11392, 624,7296, 632,15488, 648,8832, 656,4736, + 664,12928, 672,2688, 680,10880, 688,6784, 696,14976, 704,1664, 712,9856, + 720,5760, 728,13952, 736,3712, 744,11904, 752,7808, 760,16000, 776,8576, + 784,4480, 792,12672, 800,2432, 808,10624, 816,6528, 824,14720, 832,1408, + 840,9600, 848,5504, 856,13696, 864,3456, 872,11648, 880,7552, 888,15744, + 904,9088, 912,4992, 920,13184, 928,2944, 936,11136, 944,7040, 952,15232, + 960,1920, 968,10112, 976,6016, 984,14208, 992,3968, 1000,12160, 1008,8064, + 1016,16256, 1032,8256, 1040,4160, 1048,12352, 1056,2112, 1064,10304, 1072,6208, + 1080,14400, 1096,9280, 1104,5184, 1112,13376, 1120,3136, 1128,11328, 1136,7232, + 1144,15424, 1160,8768, 1168,4672, 1176,12864, 1184,2624, 1192,10816, 1200,6720, + 1208,14912, 1216,1600, 1224,9792, 1232,5696, 1240,13888, 1248,3648, 1256,11840, + 1264,7744, 1272,15936, 1288,8512, 1296,4416, 1304,12608, 1312,2368, 1320,10560, + 1328,6464, 1336,14656, 1352,9536, 1360,5440, 1368,13632, 1376,3392, 1384,11584, + 1392,7488, 1400,15680, 1416,9024, 1424,4928, 1432,13120, 1440,2880, 1448,11072, + 1456,6976, 1464,15168, 1472,1856, 1480,10048, 1488,5952, 1496,14144, 1504,3904, + 1512,12096, 1520,8000, 1528,16192, 1544,8384, 1552,4288, 1560,12480, 1568,2240, + 1576,10432, 1584,6336, 1592,14528, 1608,9408, 1616,5312, 1624,13504, 1632,3264, + 1640,11456, 1648,7360, 1656,15552, 1672,8896, 1680,4800, 1688,12992, 1696,2752, + 1704,10944, 1712,6848, 1720,15040, 1736,9920, 1744,5824, 1752,14016, 1760,3776, + 1768,11968, 1776,7872, 1784,16064, 1800,8640, 1808,4544, 1816,12736, 1824,2496, + 1832,10688, 1840,6592, 1848,14784, 1864,9664, 1872,5568, 1880,13760, 1888,3520, + 1896,11712, 1904,7616, 1912,15808, 1928,9152, 1936,5056, 1944,13248, 1952,3008, + 1960,11200, 1968,7104, 1976,15296, 1992,10176, 2000,6080, 2008,14272, 2016,4032, + 2024,12224, 2032,8128, 2040,16320, 2056,8224, 2064,4128, 2072,12320, 2088,10272, + 2096,6176, 2104,14368, 2120,9248, 2128,5152, 2136,13344, 2144,3104, 2152,11296, + 2160,7200, 2168,15392, 2184,8736, 2192,4640, 2200,12832, 2208,2592, 2216,10784, + 2224,6688, 2232,14880, 2248,9760, 2256,5664, 2264,13856, 2272,3616, 2280,11808, + 2288,7712, 2296,15904, 2312,8480, 2320,4384, 2328,12576, 2344,10528, 2352,6432, + 2360,14624, 2376,9504, 2384,5408, 2392,13600, 2400,3360, 2408,11552, 2416,7456, + 2424,15648, 2440,8992, 2448,4896, 2456,13088, 2464,2848, 2472,11040, 2480,6944, + 2488,15136, 2504,10016, 2512,5920, 2520,14112, 2528,3872, 2536,12064, 2544,7968, + 2552,16160, 2568,8352, 2576,4256, 2584,12448, 2600,10400, 2608,6304, 2616,14496, + 2632,9376, 2640,5280, 2648,13472, 2656,3232, 2664,11424, 2672,7328, 2680,15520, + 2696,8864, 2704,4768, 2712,12960, 2728,10912, 2736,6816, 2744,15008, 2760,9888, + 2768,5792, 2776,13984, 2784,3744, 2792,11936, 2800,7840, 2808,16032, 2824,8608, + 2832,4512, 2840,12704, 2856,10656, 2864,6560, 2872,14752, 2888,9632, 2896,5536, + 2904,13728, 2912,3488, 2920,11680, 2928,7584, 2936,15776, 2952,9120, 2960,5024, + 2968,13216, 2984,11168, 2992,7072, 3000,15264, 3016,10144, 3024,6048, + 3032,14240, 3040,4000, 3048,12192, 3056,8096, 3064,16288, 3080,8288, 3088,4192, + 3096,12384, 3112,10336, 3120,6240, 3128,14432, 3144,9312, 3152,5216, 3160,13408, + 3176,11360, 3184,7264, 3192,15456, 3208,8800, 3216,4704, 3224,12896, 3240,10848, + 3248,6752, 3256,14944, 3272,9824, 3280,5728, 3288,13920, 3296,3680, 3304,11872, + 3312,7776, 3320,15968, 3336,8544, 3344,4448, 3352,12640, 3368,10592, 3376,6496, + 3384,14688, 3400,9568, 3408,5472, 3416,13664, 3432,11616, 3440,7520, 3448,15712, + 3464,9056, 3472,4960, 3480,13152, 3496,11104, 3504,7008, 3512,15200, 3528,10080, + 3536,5984, 3544,14176, 3552,3936, 3560,12128, 3568,8032, 3576,16224, 3592,8416, + 3600,4320, 3608,12512, 3624,10464, 3632,6368, 3640,14560, 3656,9440, 3664,5344, + 3672,13536, 3688,11488, 3696,7392, 3704,15584, 3720,8928, 3728,4832, 3736,13024, + 3752,10976, 3760,6880, 3768,15072, 3784,9952, 3792,5856, 3800,14048, 3816,12000, + 3824,7904, 3832,16096, 3848,8672, 3856,4576, 3864,12768, 3880,10720, 3888,6624, + 3896,14816, 3912,9696, 3920,5600, 3928,13792, 3944,11744, 3952,7648, 3960,15840, + 3976,9184, 3984,5088, 3992,13280, 4008,11232, 4016,7136, 4024,15328, 4040,10208, + 4048,6112, 4056,14304, 4072,12256, 4080,8160, 4088,16352, 4104,8208, 4120,12304, + 4136,10256, 4144,6160, 4152,14352, 4168,9232, 4176,5136, 4184,13328, 4200,11280, + 4208,7184, 4216,15376, 4232,8720, 4240,4624, 4248,12816, 4264,10768, 4272,6672, + 4280,14864, 4296,9744, 4304,5648, 4312,13840, 4328,11792, 4336,7696, 4344,15888, + 4360,8464, 4376,12560, 4392,10512, 4400,6416, 4408,14608, 4424,9488, 4432,5392, + 4440,13584, 4456,11536, 4464,7440, 4472,15632, 4488,8976, 4496,4880, 4504,13072, + 4520,11024, 4528,6928, 4536,15120, 4552,10000, 4560,5904, 4568,14096, + 4584,12048, 4592,7952, 4600,16144, 4616,8336, 4632,12432, 4648,10384, 4656,6288, + 4664,14480, 4680,9360, 4688,5264, 4696,13456, 4712,11408, 4720,7312, 4728,15504, + 4744,8848, 4760,12944, 4776,10896, 4784,6800, 4792,14992, 4808,9872, 4816,5776, + 4824,13968, 4840,11920, 4848,7824, 4856,16016, 4872,8592, 4888,12688, + 4904,10640, 4912,6544, 4920,14736, 4936,9616, 4944,5520, 4952,13712, 4968,11664, + 4976,7568, 4984,15760, 5000,9104, 5016,13200, 5032,11152, 5040,7056, 5048,15248, + 5064,10128, 5072,6032, 5080,14224, 5096,12176, 5104,8080, 5112,16272, 5128,8272, + 5144,12368, 5160,10320, 5168,6224, 5176,14416, 5192,9296, 5208,13392, + 5224,11344, 5232,7248, 5240,15440, 5256,8784, 5272,12880, 5288,10832, 5296,6736, + 5304,14928, 5320,9808, 5328,5712, 5336,13904, 5352,11856, 5360,7760, 5368,15952, + 5384,8528, 5400,12624, 5416,10576, 5424,6480, 5432,14672, 5448,9552, 5464,13648, + 5480,11600, 5488,7504, 5496,15696, 5512,9040, 5528,13136, 5544,11088, 5552,6992, + 5560,15184, 5576,10064, 5584,5968, 5592,14160, 5608,12112, 5616,8016, + 5624,16208, 5640,8400, 5656,12496, 5672,10448, 5680,6352, 5688,14544, 5704,9424, + 5720,13520, 5736,11472, 5744,7376, 5752,15568, 5768,8912, 5784,13008, + 5800,10960, 5808,6864, 5816,15056, 5832,9936, 5848,14032, 5864,11984, 5872,7888, + 5880,16080, 5896,8656, 5912,12752, 5928,10704, 5936,6608, 5944,14800, 5960,9680, + 5976,13776, 5992,11728, 6000,7632, 6008,15824, 6024,9168, 6040,13264, + 6056,11216, 6064,7120, 6072,15312, 6088,10192, 6104,14288, 6120,12240, + 6128,8144, 6136,16336, 6152,8240, 6168,12336, 6184,10288, 6200,14384, 6216,9264, + 6232,13360, 6248,11312, 6256,7216, 6264,15408, 6280,8752, 6296,12848, + 6312,10800, 6320,6704, 6328,14896, 6344,9776, 6360,13872, 6376,11824, 6384,7728, + 6392,15920, 6408,8496, 6424,12592, 6440,10544, 6456,14640, 6472,9520, + 6488,13616, 6504,11568, 6512,7472, 6520,15664, 6536,9008, 6552,13104, + 6568,11056, 6576,6960, 6584,15152, 6600,10032, 6616,14128, 6632,12080, + 6640,7984, 6648,16176, 6664,8368, 6680,12464, 6696,10416, 6712,14512, 6728,9392, + 6744,13488, 6760,11440, 6768,7344, 6776,15536, 6792,8880, 6808,12976, + 6824,10928, 6840,15024, 6856,9904, 6872,14000, 6888,11952, 6896,7856, + 6904,16048, 6920,8624, 6936,12720, 6952,10672, 6968,14768, 6984,9648, + 7000,13744, 7016,11696, 7024,7600, 7032,15792, 7048,9136, 7064,13232, + 7080,11184, 7096,15280, 7112,10160, 7128,14256, 7144,12208, 7152,8112, + 7160,16304, 7176,8304, 7192,12400, 7208,10352, 7224,14448, 7240,9328, + 7256,13424, 7272,11376, 7288,15472, 7304,8816, 7320,12912, 7336,10864, + 7352,14960, 7368,9840, 7384,13936, 7400,11888, 7408,7792, 7416,15984, 7432,8560, + 7448,12656, 7464,10608, 7480,14704, 7496,9584, 7512,13680, 7528,11632, + 7544,15728, 7560,9072, 7576,13168, 7592,11120, 7608,15216, 7624,10096, + 7640,14192, 7656,12144, 7664,8048, 7672,16240, 7688,8432, 7704,12528, + 7720,10480, 7736,14576, 7752,9456, 7768,13552, 7784,11504, 7800,15600, + 7816,8944, 7832,13040, 7848,10992, 7864,15088, 7880,9968, 7896,14064, + 7912,12016, 7928,16112, 7944,8688, 7960,12784, 7976,10736, 7992,14832, + 8008,9712, 8024,13808, 8040,11760, 8056,15856, 8072,9200, 8088,13296, + 8104,11248, 8120,15344, 8136,10224, 8152,14320, 8168,12272, 8184,16368, + 8216,12296, 8232,10248, 8248,14344, 8264,9224, 8280,13320, 8296,11272, + 8312,15368, 8328,8712, 8344,12808, 8360,10760, 8376,14856, 8392,9736, + 8408,13832, 8424,11784, 8440,15880, 8472,12552, 8488,10504, 8504,14600, + 8520,9480, 8536,13576, 8552,11528, 8568,15624, 8584,8968, 8600,13064, + 8616,11016, 8632,15112, 8648,9992, 8664,14088, 8680,12040, 8696,16136, + 8728,12424, 8744,10376, 8760,14472, 8776,9352, 8792,13448, 8808,11400, + 8824,15496, 8856,12936, 8872,10888, 8888,14984, 8904,9864, 8920,13960, + 8936,11912, 8952,16008, 8984,12680, 9000,10632, 9016,14728, 9032,9608, + 9048,13704, 9064,11656, 9080,15752, 9112,13192, 9128,11144, 9144,15240, + 9160,10120, 9176,14216, 9192,12168, 9208,16264, 9240,12360, 9256,10312, + 9272,14408, 9304,13384, 9320,11336, 9336,15432, 9368,12872, 9384,10824, + 9400,14920, 9416,9800, 9432,13896, 9448,11848, 9464,15944, 9496,12616, + 9512,10568, 9528,14664, 9560,13640, 9576,11592, 9592,15688, 9624,13128, + 9640,11080, 9656,15176, 9672,10056, 9688,14152, 9704,12104, 9720,16200, + 9752,12488, 9768,10440, 9784,14536, 9816,13512, 9832,11464, 9848,15560, + 9880,13000, 9896,10952, 9912,15048, 9944,14024, 9960,11976, 9976,16072, + 10008,12744, 10024,10696, 10040,14792, 10072,13768, 10088,11720, 10104,15816, + 10136,13256, 10152,11208, 10168,15304, 10200,14280, 10216,12232, 10232,16328, + 10264,12328, 10296,14376, 10328,13352, 10344,11304, 10360,15400, 10392,12840, + 10408,10792, 10424,14888, 10456,13864, 10472,11816, 10488,15912, 10520,12584, + 10552,14632, 10584,13608, 10600,11560, 10616,15656, 10648,13096, 10664,11048, + 10680,15144, 10712,14120, 10728,12072, 10744,16168, 10776,12456, 10808,14504, + 10840,13480, 10856,11432, 10872,15528, 10904,12968, 10936,15016, 10968,13992, + 10984,11944, 11000,16040, 11032,12712, 11064,14760, 11096,13736, 11112,11688, + 11128,15784, 11160,13224, 11192,15272, 11224,14248, 11240,12200, 11256,16296, + 11288,12392, 11320,14440, 11352,13416, 11384,15464, 11416,12904, 11448,14952, + 11480,13928, 11496,11880, 11512,15976, 11544,12648, 11576,14696, 11608,13672, + 11640,15720, 11672,13160, 11704,15208, 11736,14184, 11752,12136, 11768,16232, + 11800,12520, 11832,14568, 11864,13544, 11896,15592, 11928,13032, 11960,15080, + 11992,14056, 12024,16104, 12056,12776, 12088,14824, 12120,13800, 12152,15848, + 12184,13288, 12216,15336, 12248,14312, 12280,16360, 12344,14360, 12376,13336, + 12408,15384, 12440,12824, 12472,14872, 12504,13848, 12536,15896, 12600,14616, + 12632,13592, 12664,15640, 12696,13080, 12728,15128, 12760,14104, 12792,16152, + 12856,14488, 12888,13464, 12920,15512, 12984,15000, 13016,13976, 13048,16024, + 13112,14744, 13144,13720, 13176,15768, 13240,15256, 13272,14232, 13304,16280, + 13368,14424, 13432,15448, 13496,14936, 13528,13912, 13560,15960, 13624,14680, + 13688,15704, 13752,15192, 13784,14168, 13816,16216, 13880,14552, 13944,15576, + 14008,15064, 14072,16088, 14136,14808, 14200,15832, 14264,15320, 14328,16344, + 14456,15416, 14520,14904, 14584,15928, 14712,15672, 14776,15160, 14840,16184, + 14968,15544, 15096,16056, 15224,15800, 15352,16312, 15608,15992, 15864,16248 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_4096) +const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH] = +{ + /* radix 4, size 4032 */ + 8,16384, 16,8192, 24,24576, 32,4096, 40,20480, 48,12288, 56,28672, 64,2048, + 72,18432, 80,10240, 88,26624, 96,6144, 104,22528, 112,14336, 120,30720, + 128,1024, 136,17408, 144,9216, 152,25600, 160,5120, 168,21504, 176,13312, + 184,29696, 192,3072, 200,19456, 208,11264, 216,27648, 224,7168, 232,23552, + 240,15360, 248,31744, 256,512, 264,16896, 272,8704, 280,25088, 288,4608, + 296,20992, 304,12800, 312,29184, 320,2560, 328,18944, 336,10752, 344,27136, + 352,6656, 360,23040, 368,14848, 376,31232, 384,1536, 392,17920, 400,9728, + 408,26112, 416,5632, 424,22016, 432,13824, 440,30208, 448,3584, 456,19968, + 464,11776, 472,28160, 480,7680, 488,24064, 496,15872, 504,32256, 520,16640, + 528,8448, 536,24832, 544,4352, 552,20736, 560,12544, 568,28928, 576,2304, + 584,18688, 592,10496, 600,26880, 608,6400, 616,22784, 624,14592, 632,30976, + 640,1280, 648,17664, 656,9472, 664,25856, 672,5376, 680,21760, 688,13568, + 696,29952, 704,3328, 712,19712, 720,11520, 728,27904, 736,7424, 744,23808, + 752,15616, 760,32000, 776,17152, 784,8960, 792,25344, 800,4864, 808,21248, + 816,13056, 824,29440, 832,2816, 840,19200, 848,11008, 856,27392, 864,6912, + 872,23296, 880,15104, 888,31488, 896,1792, 904,18176, 912,9984, 920,26368, + 928,5888, 936,22272, 944,14080, 952,30464, 960,3840, 968,20224, 976,12032, + 984,28416, 992,7936, 1000,24320, 1008,16128, 1016,32512, 1032,16512, 1040,8320, + 1048,24704, 1056,4224, 1064,20608, 1072,12416, 1080,28800, 1088,2176, + 1096,18560, 1104,10368, 1112,26752, 1120,6272, 1128,22656, 1136,14464, + 1144,30848, 1160,17536, 1168,9344, 1176,25728, 1184,5248, 1192,21632, + 1200,13440, 1208,29824, 1216,3200, 1224,19584, 1232,11392, 1240,27776, + 1248,7296, 1256,23680, 1264,15488, 1272,31872, 1288,17024, 1296,8832, + 1304,25216, 1312,4736, 1320,21120, 1328,12928, 1336,29312, 1344,2688, + 1352,19072, 1360,10880, 1368,27264, 1376,6784, 1384,23168, 1392,14976, + 1400,31360, 1408,1664, 1416,18048, 1424,9856, 1432,26240, 1440,5760, 1448,22144, + 1456,13952, 1464,30336, 1472,3712, 1480,20096, 1488,11904, 1496,28288, + 1504,7808, 1512,24192, 1520,16000, 1528,32384, 1544,16768, 1552,8576, + 1560,24960, 1568,4480, 1576,20864, 1584,12672, 1592,29056, 1600,2432, + 1608,18816, 1616,10624, 1624,27008, 1632,6528, 1640,22912, 1648,14720, + 1656,31104, 1672,17792, 1680,9600, 1688,25984, 1696,5504, 1704,21888, + 1712,13696, 1720,30080, 1728,3456, 1736,19840, 1744,11648, 1752,28032, + 1760,7552, 1768,23936, 1776,15744, 1784,32128, 1800,17280, 1808,9088, + 1816,25472, 1824,4992, 1832,21376, 1840,13184, 1848,29568, 1856,2944, + 1864,19328, 1872,11136, 1880,27520, 1888,7040, 1896,23424, 1904,15232, + 1912,31616, 1928,18304, 1936,10112, 1944,26496, 1952,6016, 1960,22400, + 1968,14208, 1976,30592, 1984,3968, 1992,20352, 2000,12160, 2008,28544, + 2016,8064, 2024,24448, 2032,16256, 2040,32640, 2056,16448, 2064,8256, + 2072,24640, 2080,4160, 2088,20544, 2096,12352, 2104,28736, 2120,18496, + 2128,10304, 2136,26688, 2144,6208, 2152,22592, 2160,14400, 2168,30784, + 2184,17472, 2192,9280, 2200,25664, 2208,5184, 2216,21568, 2224,13376, + 2232,29760, 2240,3136, 2248,19520, 2256,11328, 2264,27712, 2272,7232, + 2280,23616, 2288,15424, 2296,31808, 2312,16960, 2320,8768, 2328,25152, + 2336,4672, 2344,21056, 2352,12864, 2360,29248, 2368,2624, 2376,19008, + 2384,10816, 2392,27200, 2400,6720, 2408,23104, 2416,14912, 2424,31296, + 2440,17984, 2448,9792, 2456,26176, 2464,5696, 2472,22080, 2480,13888, + 2488,30272, 2496,3648, 2504,20032, 2512,11840, 2520,28224, 2528,7744, + 2536,24128, 2544,15936, 2552,32320, 2568,16704, 2576,8512, 2584,24896, + 2592,4416, 2600,20800, 2608,12608, 2616,28992, 2632,18752, 2640,10560, + 2648,26944, 2656,6464, 2664,22848, 2672,14656, 2680,31040, 2696,17728, + 2704,9536, 2712,25920, 2720,5440, 2728,21824, 2736,13632, 2744,30016, 2752,3392, + 2760,19776, 2768,11584, 2776,27968, 2784,7488, 2792,23872, 2800,15680, + 2808,32064, 2824,17216, 2832,9024, 2840,25408, 2848,4928, 2856,21312, + 2864,13120, 2872,29504, 2888,19264, 2896,11072, 2904,27456, 2912,6976, + 2920,23360, 2928,15168, 2936,31552, 2952,18240, 2960,10048, 2968,26432, + 2976,5952, 2984,22336, 2992,14144, 3000,30528, 3008,3904, 3016,20288, + 3024,12096, 3032,28480, 3040,8000, 3048,24384, 3056,16192, 3064,32576, + 3080,16576, 3088,8384, 3096,24768, 3104,4288, 3112,20672, 3120,12480, + 3128,28864, 3144,18624, 3152,10432, 3160,26816, 3168,6336, 3176,22720, + 3184,14528, 3192,30912, 3208,17600, 3216,9408, 3224,25792, 3232,5312, + 3240,21696, 3248,13504, 3256,29888, 3272,19648, 3280,11456, 3288,27840, + 3296,7360, 3304,23744, 3312,15552, 3320,31936, 3336,17088, 3344,8896, + 3352,25280, 3360,4800, 3368,21184, 3376,12992, 3384,29376, 3400,19136, + 3408,10944, 3416,27328, 3424,6848, 3432,23232, 3440,15040, 3448,31424, + 3464,18112, 3472,9920, 3480,26304, 3488,5824, 3496,22208, 3504,14016, + 3512,30400, 3520,3776, 3528,20160, 3536,11968, 3544,28352, 3552,7872, + 3560,24256, 3568,16064, 3576,32448, 3592,16832, 3600,8640, 3608,25024, + 3616,4544, 3624,20928, 3632,12736, 3640,29120, 3656,18880, 3664,10688, + 3672,27072, 3680,6592, 3688,22976, 3696,14784, 3704,31168, 3720,17856, + 3728,9664, 3736,26048, 3744,5568, 3752,21952, 3760,13760, 3768,30144, + 3784,19904, 3792,11712, 3800,28096, 3808,7616, 3816,24000, 3824,15808, + 3832,32192, 3848,17344, 3856,9152, 3864,25536, 3872,5056, 3880,21440, + 3888,13248, 3896,29632, 3912,19392, 3920,11200, 3928,27584, 3936,7104, + 3944,23488, 3952,15296, 3960,31680, 3976,18368, 3984,10176, 3992,26560, + 4000,6080, 4008,22464, 4016,14272, 4024,30656, 4040,20416, 4048,12224, + 4056,28608, 4064,8128, 4072,24512, 4080,16320, 4088,32704, 4104,16416, + 4112,8224, 4120,24608, 4136,20512, 4144,12320, 4152,28704, 4168,18464, + 4176,10272, 4184,26656, 4192,6176, 4200,22560, 4208,14368, 4216,30752, + 4232,17440, 4240,9248, 4248,25632, 4256,5152, 4264,21536, 4272,13344, + 4280,29728, 4296,19488, 4304,11296, 4312,27680, 4320,7200, 4328,23584, + 4336,15392, 4344,31776, 4360,16928, 4368,8736, 4376,25120, 4384,4640, + 4392,21024, 4400,12832, 4408,29216, 4424,18976, 4432,10784, 4440,27168, + 4448,6688, 4456,23072, 4464,14880, 4472,31264, 4488,17952, 4496,9760, + 4504,26144, 4512,5664, 4520,22048, 4528,13856, 4536,30240, 4552,20000, + 4560,11808, 4568,28192, 4576,7712, 4584,24096, 4592,15904, 4600,32288, + 4616,16672, 4624,8480, 4632,24864, 4648,20768, 4656,12576, 4664,28960, + 4680,18720, 4688,10528, 4696,26912, 4704,6432, 4712,22816, 4720,14624, + 4728,31008, 4744,17696, 4752,9504, 4760,25888, 4768,5408, 4776,21792, + 4784,13600, 4792,29984, 4808,19744, 4816,11552, 4824,27936, 4832,7456, + 4840,23840, 4848,15648, 4856,32032, 4872,17184, 4880,8992, 4888,25376, + 4904,21280, 4912,13088, 4920,29472, 4936,19232, 4944,11040, 4952,27424, + 4960,6944, 4968,23328, 4976,15136, 4984,31520, 5000,18208, 5008,10016, + 5016,26400, 5024,5920, 5032,22304, 5040,14112, 5048,30496, 5064,20256, + 5072,12064, 5080,28448, 5088,7968, 5096,24352, 5104,16160, 5112,32544, + 5128,16544, 5136,8352, 5144,24736, 5160,20640, 5168,12448, 5176,28832, + 5192,18592, 5200,10400, 5208,26784, 5216,6304, 5224,22688, 5232,14496, + 5240,30880, 5256,17568, 5264,9376, 5272,25760, 5288,21664, 5296,13472, + 5304,29856, 5320,19616, 5328,11424, 5336,27808, 5344,7328, 5352,23712, + 5360,15520, 5368,31904, 5384,17056, 5392,8864, 5400,25248, 5416,21152, + 5424,12960, 5432,29344, 5448,19104, 5456,10912, 5464,27296, 5472,6816, + 5480,23200, 5488,15008, 5496,31392, 5512,18080, 5520,9888, 5528,26272, + 5536,5792, 5544,22176, 5552,13984, 5560,30368, 5576,20128, 5584,11936, + 5592,28320, 5600,7840, 5608,24224, 5616,16032, 5624,32416, 5640,16800, + 5648,8608, 5656,24992, 5672,20896, 5680,12704, 5688,29088, 5704,18848, + 5712,10656, 5720,27040, 5728,6560, 5736,22944, 5744,14752, 5752,31136, + 5768,17824, 5776,9632, 5784,26016, 5800,21920, 5808,13728, 5816,30112, + 5832,19872, 5840,11680, 5848,28064, 5856,7584, 5864,23968, 5872,15776, + 5880,32160, 5896,17312, 5904,9120, 5912,25504, 5928,21408, 5936,13216, + 5944,29600, 5960,19360, 5968,11168, 5976,27552, 5984,7072, 5992,23456, + 6000,15264, 6008,31648, 6024,18336, 6032,10144, 6040,26528, 6056,22432, + 6064,14240, 6072,30624, 6088,20384, 6096,12192, 6104,28576, 6112,8096, + 6120,24480, 6128,16288, 6136,32672, 6152,16480, 6160,8288, 6168,24672, + 6184,20576, 6192,12384, 6200,28768, 6216,18528, 6224,10336, 6232,26720, + 6248,22624, 6256,14432, 6264,30816, 6280,17504, 6288,9312, 6296,25696, + 6312,21600, 6320,13408, 6328,29792, 6344,19552, 6352,11360, 6360,27744, + 6368,7264, 6376,23648, 6384,15456, 6392,31840, 6408,16992, 6416,8800, + 6424,25184, 6440,21088, 6448,12896, 6456,29280, 6472,19040, 6480,10848, + 6488,27232, 6496,6752, 6504,23136, 6512,14944, 6520,31328, 6536,18016, + 6544,9824, 6552,26208, 6568,22112, 6576,13920, 6584,30304, 6600,20064, + 6608,11872, 6616,28256, 6624,7776, 6632,24160, 6640,15968, 6648,32352, + 6664,16736, 6672,8544, 6680,24928, 6696,20832, 6704,12640, 6712,29024, + 6728,18784, 6736,10592, 6744,26976, 6760,22880, 6768,14688, 6776,31072, + 6792,17760, 6800,9568, 6808,25952, 6824,21856, 6832,13664, 6840,30048, + 6856,19808, 6864,11616, 6872,28000, 6880,7520, 6888,23904, 6896,15712, + 6904,32096, 6920,17248, 6928,9056, 6936,25440, 6952,21344, 6960,13152, + 6968,29536, 6984,19296, 6992,11104, 7000,27488, 7016,23392, 7024,15200, + 7032,31584, 7048,18272, 7056,10080, 7064,26464, 7080,22368, 7088,14176, + 7096,30560, 7112,20320, 7120,12128, 7128,28512, 7136,8032, 7144,24416, + 7152,16224, 7160,32608, 7176,16608, 7184,8416, 7192,24800, 7208,20704, + 7216,12512, 7224,28896, 7240,18656, 7248,10464, 7256,26848, 7272,22752, + 7280,14560, 7288,30944, 7304,17632, 7312,9440, 7320,25824, 7336,21728, + 7344,13536, 7352,29920, 7368,19680, 7376,11488, 7384,27872, 7400,23776, + 7408,15584, 7416,31968, 7432,17120, 7440,8928, 7448,25312, 7464,21216, + 7472,13024, 7480,29408, 7496,19168, 7504,10976, 7512,27360, 7528,23264, + 7536,15072, 7544,31456, 7560,18144, 7568,9952, 7576,26336, 7592,22240, + 7600,14048, 7608,30432, 7624,20192, 7632,12000, 7640,28384, 7648,7904, + 7656,24288, 7664,16096, 7672,32480, 7688,16864, 7696,8672, 7704,25056, + 7720,20960, 7728,12768, 7736,29152, 7752,18912, 7760,10720, 7768,27104, + 7784,23008, 7792,14816, 7800,31200, 7816,17888, 7824,9696, 7832,26080, + 7848,21984, 7856,13792, 7864,30176, 7880,19936, 7888,11744, 7896,28128, + 7912,24032, 7920,15840, 7928,32224, 7944,17376, 7952,9184, 7960,25568, + 7976,21472, 7984,13280, 7992,29664, 8008,19424, 8016,11232, 8024,27616, + 8040,23520, 8048,15328, 8056,31712, 8072,18400, 8080,10208, 8088,26592, + 8104,22496, 8112,14304, 8120,30688, 8136,20448, 8144,12256, 8152,28640, + 8168,24544, 8176,16352, 8184,32736, 8200,16400, 8216,24592, 8232,20496, + 8240,12304, 8248,28688, 8264,18448, 8272,10256, 8280,26640, 8296,22544, + 8304,14352, 8312,30736, 8328,17424, 8336,9232, 8344,25616, 8360,21520, + 8368,13328, 8376,29712, 8392,19472, 8400,11280, 8408,27664, 8424,23568, + 8432,15376, 8440,31760, 8456,16912, 8464,8720, 8472,25104, 8488,21008, + 8496,12816, 8504,29200, 8520,18960, 8528,10768, 8536,27152, 8552,23056, + 8560,14864, 8568,31248, 8584,17936, 8592,9744, 8600,26128, 8616,22032, + 8624,13840, 8632,30224, 8648,19984, 8656,11792, 8664,28176, 8680,24080, + 8688,15888, 8696,32272, 8712,16656, 8728,24848, 8744,20752, 8752,12560, + 8760,28944, 8776,18704, 8784,10512, 8792,26896, 8808,22800, 8816,14608, + 8824,30992, 8840,17680, 8848,9488, 8856,25872, 8872,21776, 8880,13584, + 8888,29968, 8904,19728, 8912,11536, 8920,27920, 8936,23824, 8944,15632, + 8952,32016, 8968,17168, 8984,25360, 9000,21264, 9008,13072, 9016,29456, + 9032,19216, 9040,11024, 9048,27408, 9064,23312, 9072,15120, 9080,31504, + 9096,18192, 9104,10000, 9112,26384, 9128,22288, 9136,14096, 9144,30480, + 9160,20240, 9168,12048, 9176,28432, 9192,24336, 9200,16144, 9208,32528, + 9224,16528, 9240,24720, 9256,20624, 9264,12432, 9272,28816, 9288,18576, + 9296,10384, 9304,26768, 9320,22672, 9328,14480, 9336,30864, 9352,17552, + 9368,25744, 9384,21648, 9392,13456, 9400,29840, 9416,19600, 9424,11408, + 9432,27792, 9448,23696, 9456,15504, 9464,31888, 9480,17040, 9496,25232, + 9512,21136, 9520,12944, 9528,29328, 9544,19088, 9552,10896, 9560,27280, + 9576,23184, 9584,14992, 9592,31376, 9608,18064, 9616,9872, 9624,26256, + 9640,22160, 9648,13968, 9656,30352, 9672,20112, 9680,11920, 9688,28304, + 9704,24208, 9712,16016, 9720,32400, 9736,16784, 9752,24976, 9768,20880, + 9776,12688, 9784,29072, 9800,18832, 9808,10640, 9816,27024, 9832,22928, + 9840,14736, 9848,31120, 9864,17808, 9880,26000, 9896,21904, 9904,13712, + 9912,30096, 9928,19856, 9936,11664, 9944,28048, 9960,23952, 9968,15760, + 9976,32144, 9992,17296, 10008,25488, 10024,21392, 10032,13200, 10040,29584, + 10056,19344, 10064,11152, 10072,27536, 10088,23440, 10096,15248, 10104,31632, + 10120,18320, 10136,26512, 10152,22416, 10160,14224, 10168,30608, 10184,20368, + 10192,12176, 10200,28560, 10216,24464, 10224,16272, 10232,32656, 10248,16464, + 10264,24656, 10280,20560, 10288,12368, 10296,28752, 10312,18512, 10328,26704, + 10344,22608, 10352,14416, 10360,30800, 10376,17488, 10392,25680, 10408,21584, + 10416,13392, 10424,29776, 10440,19536, 10448,11344, 10456,27728, 10472,23632, + 10480,15440, 10488,31824, 10504,16976, 10520,25168, 10536,21072, 10544,12880, + 10552,29264, 10568,19024, 10576,10832, 10584,27216, 10600,23120, 10608,14928, + 10616,31312, 10632,18000, 10648,26192, 10664,22096, 10672,13904, 10680,30288, + 10696,20048, 10704,11856, 10712,28240, 10728,24144, 10736,15952, 10744,32336, + 10760,16720, 10776,24912, 10792,20816, 10800,12624, 10808,29008, 10824,18768, + 10840,26960, 10856,22864, 10864,14672, 10872,31056, 10888,17744, 10904,25936, + 10920,21840, 10928,13648, 10936,30032, 10952,19792, 10960,11600, 10968,27984, + 10984,23888, 10992,15696, 11000,32080, 11016,17232, 11032,25424, 11048,21328, + 11056,13136, 11064,29520, 11080,19280, 11096,27472, 11112,23376, 11120,15184, + 11128,31568, 11144,18256, 11160,26448, 11176,22352, 11184,14160, 11192,30544, + 11208,20304, 11216,12112, 11224,28496, 11240,24400, 11248,16208, 11256,32592, + 11272,16592, 11288,24784, 11304,20688, 11312,12496, 11320,28880, 11336,18640, + 11352,26832, 11368,22736, 11376,14544, 11384,30928, 11400,17616, 11416,25808, + 11432,21712, 11440,13520, 11448,29904, 11464,19664, 11480,27856, 11496,23760, + 11504,15568, 11512,31952, 11528,17104, 11544,25296, 11560,21200, 11568,13008, + 11576,29392, 11592,19152, 11608,27344, 11624,23248, 11632,15056, 11640,31440, + 11656,18128, 11672,26320, 11688,22224, 11696,14032, 11704,30416, 11720,20176, + 11728,11984, 11736,28368, 11752,24272, 11760,16080, 11768,32464, 11784,16848, + 11800,25040, 11816,20944, 11824,12752, 11832,29136, 11848,18896, 11864,27088, + 11880,22992, 11888,14800, 11896,31184, 11912,17872, 11928,26064, 11944,21968, + 11952,13776, 11960,30160, 11976,19920, 11992,28112, 12008,24016, 12016,15824, + 12024,32208, 12040,17360, 12056,25552, 12072,21456, 12080,13264, 12088,29648, + 12104,19408, 12120,27600, 12136,23504, 12144,15312, 12152,31696, 12168,18384, + 12184,26576, 12200,22480, 12208,14288, 12216,30672, 12232,20432, 12248,28624, + 12264,24528, 12272,16336, 12280,32720, 12296,16432, 12312,24624, 12328,20528, + 12344,28720, 12360,18480, 12376,26672, 12392,22576, 12400,14384, 12408,30768, + 12424,17456, 12440,25648, 12456,21552, 12464,13360, 12472,29744, 12488,19504, + 12504,27696, 12520,23600, 12528,15408, 12536,31792, 12552,16944, 12568,25136, + 12584,21040, 12592,12848, 12600,29232, 12616,18992, 12632,27184, 12648,23088, + 12656,14896, 12664,31280, 12680,17968, 12696,26160, 12712,22064, 12720,13872, + 12728,30256, 12744,20016, 12760,28208, 12776,24112, 12784,15920, 12792,32304, + 12808,16688, 12824,24880, 12840,20784, 12856,28976, 12872,18736, 12888,26928, + 12904,22832, 12912,14640, 12920,31024, 12936,17712, 12952,25904, 12968,21808, + 12976,13616, 12984,30000, 13000,19760, 13016,27952, 13032,23856, 13040,15664, + 13048,32048, 13064,17200, 13080,25392, 13096,21296, 13112,29488, 13128,19248, + 13144,27440, 13160,23344, 13168,15152, 13176,31536, 13192,18224, 13208,26416, + 13224,22320, 13232,14128, 13240,30512, 13256,20272, 13272,28464, 13288,24368, + 13296,16176, 13304,32560, 13320,16560, 13336,24752, 13352,20656, 13368,28848, + 13384,18608, 13400,26800, 13416,22704, 13424,14512, 13432,30896, 13448,17584, + 13464,25776, 13480,21680, 13496,29872, 13512,19632, 13528,27824, 13544,23728, + 13552,15536, 13560,31920, 13576,17072, 13592,25264, 13608,21168, 13624,29360, + 13640,19120, 13656,27312, 13672,23216, 13680,15024, 13688,31408, 13704,18096, + 13720,26288, 13736,22192, 13744,14000, 13752,30384, 13768,20144, 13784,28336, + 13800,24240, 13808,16048, 13816,32432, 13832,16816, 13848,25008, 13864,20912, + 13880,29104, 13896,18864, 13912,27056, 13928,22960, 13936,14768, 13944,31152, + 13960,17840, 13976,26032, 13992,21936, 14008,30128, 14024,19888, 14040,28080, + 14056,23984, 14064,15792, 14072,32176, 14088,17328, 14104,25520, 14120,21424, + 14136,29616, 14152,19376, 14168,27568, 14184,23472, 14192,15280, 14200,31664, + 14216,18352, 14232,26544, 14248,22448, 14264,30640, 14280,20400, 14296,28592, + 14312,24496, 14320,16304, 14328,32688, 14344,16496, 14360,24688, 14376,20592, + 14392,28784, 14408,18544, 14424,26736, 14440,22640, 14456,30832, 14472,17520, + 14488,25712, 14504,21616, 14520,29808, 14536,19568, 14552,27760, 14568,23664, + 14576,15472, 14584,31856, 14600,17008, 14616,25200, 14632,21104, 14648,29296, + 14664,19056, 14680,27248, 14696,23152, 14704,14960, 14712,31344, 14728,18032, + 14744,26224, 14760,22128, 14776,30320, 14792,20080, 14808,28272, 14824,24176, + 14832,15984, 14840,32368, 14856,16752, 14872,24944, 14888,20848, 14904,29040, + 14920,18800, 14936,26992, 14952,22896, 14968,31088, 14984,17776, 15000,25968, + 15016,21872, 15032,30064, 15048,19824, 15064,28016, 15080,23920, 15088,15728, + 15096,32112, 15112,17264, 15128,25456, 15144,21360, 15160,29552, 15176,19312, + 15192,27504, 15208,23408, 15224,31600, 15240,18288, 15256,26480, 15272,22384, + 15288,30576, 15304,20336, 15320,28528, 15336,24432, 15344,16240, 15352,32624, + 15368,16624, 15384,24816, 15400,20720, 15416,28912, 15432,18672, 15448,26864, + 15464,22768, 15480,30960, 15496,17648, 15512,25840, 15528,21744, 15544,29936, + 15560,19696, 15576,27888, 15592,23792, 15608,31984, 15624,17136, 15640,25328, + 15656,21232, 15672,29424, 15688,19184, 15704,27376, 15720,23280, 15736,31472, + 15752,18160, 15768,26352, 15784,22256, 15800,30448, 15816,20208, 15832,28400, + 15848,24304, 15856,16112, 15864,32496, 15880,16880, 15896,25072, 15912,20976, + 15928,29168, 15944,18928, 15960,27120, 15976,23024, 15992,31216, 16008,17904, + 16024,26096, 16040,22000, 16056,30192, 16072,19952, 16088,28144, 16104,24048, + 16120,32240, 16136,17392, 16152,25584, 16168,21488, 16184,29680, 16200,19440, + 16216,27632, 16232,23536, 16248,31728, 16264,18416, 16280,26608, 16296,22512, + 16312,30704, 16328,20464, 16344,28656, 16360,24560, 16376,32752, 16408,24584, + 16424,20488, 16440,28680, 16456,18440, 16472,26632, 16488,22536, 16504,30728, + 16520,17416, 16536,25608, 16552,21512, 16568,29704, 16584,19464, 16600,27656, + 16616,23560, 16632,31752, 16648,16904, 16664,25096, 16680,21000, 16696,29192, + 16712,18952, 16728,27144, 16744,23048, 16760,31240, 16776,17928, 16792,26120, + 16808,22024, 16824,30216, 16840,19976, 16856,28168, 16872,24072, 16888,32264, + 16920,24840, 16936,20744, 16952,28936, 16968,18696, 16984,26888, 17000,22792, + 17016,30984, 17032,17672, 17048,25864, 17064,21768, 17080,29960, 17096,19720, + 17112,27912, 17128,23816, 17144,32008, 17176,25352, 17192,21256, 17208,29448, + 17224,19208, 17240,27400, 17256,23304, 17272,31496, 17288,18184, 17304,26376, + 17320,22280, 17336,30472, 17352,20232, 17368,28424, 17384,24328, 17400,32520, + 17432,24712, 17448,20616, 17464,28808, 17480,18568, 17496,26760, 17512,22664, + 17528,30856, 17560,25736, 17576,21640, 17592,29832, 17608,19592, 17624,27784, + 17640,23688, 17656,31880, 17688,25224, 17704,21128, 17720,29320, 17736,19080, + 17752,27272, 17768,23176, 17784,31368, 17800,18056, 17816,26248, 17832,22152, + 17848,30344, 17864,20104, 17880,28296, 17896,24200, 17912,32392, 17944,24968, + 17960,20872, 17976,29064, 17992,18824, 18008,27016, 18024,22920, 18040,31112, + 18072,25992, 18088,21896, 18104,30088, 18120,19848, 18136,28040, 18152,23944, + 18168,32136, 18200,25480, 18216,21384, 18232,29576, 18248,19336, 18264,27528, + 18280,23432, 18296,31624, 18328,26504, 18344,22408, 18360,30600, 18376,20360, + 18392,28552, 18408,24456, 18424,32648, 18456,24648, 18472,20552, 18488,28744, + 18520,26696, 18536,22600, 18552,30792, 18584,25672, 18600,21576, 18616,29768, + 18632,19528, 18648,27720, 18664,23624, 18680,31816, 18712,25160, 18728,21064, + 18744,29256, 18760,19016, 18776,27208, 18792,23112, 18808,31304, 18840,26184, + 18856,22088, 18872,30280, 18888,20040, 18904,28232, 18920,24136, 18936,32328, + 18968,24904, 18984,20808, 19000,29000, 19032,26952, 19048,22856, 19064,31048, + 19096,25928, 19112,21832, 19128,30024, 19144,19784, 19160,27976, 19176,23880, + 19192,32072, 19224,25416, 19240,21320, 19256,29512, 19288,27464, 19304,23368, + 19320,31560, 19352,26440, 19368,22344, 19384,30536, 19400,20296, 19416,28488, + 19432,24392, 19448,32584, 19480,24776, 19496,20680, 19512,28872, 19544,26824, + 19560,22728, 19576,30920, 19608,25800, 19624,21704, 19640,29896, 19672,27848, + 19688,23752, 19704,31944, 19736,25288, 19752,21192, 19768,29384, 19800,27336, + 19816,23240, 19832,31432, 19864,26312, 19880,22216, 19896,30408, 19912,20168, + 19928,28360, 19944,24264, 19960,32456, 19992,25032, 20008,20936, 20024,29128, + 20056,27080, 20072,22984, 20088,31176, 20120,26056, 20136,21960, 20152,30152, + 20184,28104, 20200,24008, 20216,32200, 20248,25544, 20264,21448, 20280,29640, + 20312,27592, 20328,23496, 20344,31688, 20376,26568, 20392,22472, 20408,30664, + 20440,28616, 20456,24520, 20472,32712, 20504,24616, 20536,28712, 20568,26664, + 20584,22568, 20600,30760, 20632,25640, 20648,21544, 20664,29736, 20696,27688, + 20712,23592, 20728,31784, 20760,25128, 20776,21032, 20792,29224, 20824,27176, + 20840,23080, 20856,31272, 20888,26152, 20904,22056, 20920,30248, 20952,28200, + 20968,24104, 20984,32296, 21016,24872, 21048,28968, 21080,26920, 21096,22824, + 21112,31016, 21144,25896, 21160,21800, 21176,29992, 21208,27944, 21224,23848, + 21240,32040, 21272,25384, 21304,29480, 21336,27432, 21352,23336, 21368,31528, + 21400,26408, 21416,22312, 21432,30504, 21464,28456, 21480,24360, 21496,32552, + 21528,24744, 21560,28840, 21592,26792, 21608,22696, 21624,30888, 21656,25768, + 21688,29864, 21720,27816, 21736,23720, 21752,31912, 21784,25256, 21816,29352, + 21848,27304, 21864,23208, 21880,31400, 21912,26280, 21928,22184, 21944,30376, + 21976,28328, 21992,24232, 22008,32424, 22040,25000, 22072,29096, 22104,27048, + 22120,22952, 22136,31144, 22168,26024, 22200,30120, 22232,28072, 22248,23976, + 22264,32168, 22296,25512, 22328,29608, 22360,27560, 22376,23464, 22392,31656, + 22424,26536, 22456,30632, 22488,28584, 22504,24488, 22520,32680, 22552,24680, + 22584,28776, 22616,26728, 22648,30824, 22680,25704, 22712,29800, 22744,27752, + 22760,23656, 22776,31848, 22808,25192, 22840,29288, 22872,27240, 22888,23144, + 22904,31336, 22936,26216, 22968,30312, 23000,28264, 23016,24168, 23032,32360, + 23064,24936, 23096,29032, 23128,26984, 23160,31080, 23192,25960, 23224,30056, + 23256,28008, 23272,23912, 23288,32104, 23320,25448, 23352,29544, 23384,27496, + 23416,31592, 23448,26472, 23480,30568, 23512,28520, 23528,24424, 23544,32616, + 23576,24808, 23608,28904, 23640,26856, 23672,30952, 23704,25832, 23736,29928, + 23768,27880, 23800,31976, 23832,25320, 23864,29416, 23896,27368, 23928,31464, + 23960,26344, 23992,30440, 24024,28392, 24040,24296, 24056,32488, 24088,25064, + 24120,29160, 24152,27112, 24184,31208, 24216,26088, 24248,30184, 24280,28136, + 24312,32232, 24344,25576, 24376,29672, 24408,27624, 24440,31720, 24472,26600, + 24504,30696, 24536,28648, 24568,32744, 24632,28696, 24664,26648, 24696,30744, + 24728,25624, 24760,29720, 24792,27672, 24824,31768, 24856,25112, 24888,29208, + 24920,27160, 24952,31256, 24984,26136, 25016,30232, 25048,28184, 25080,32280, + 25144,28952, 25176,26904, 25208,31000, 25240,25880, 25272,29976, 25304,27928, + 25336,32024, 25400,29464, 25432,27416, 25464,31512, 25496,26392, 25528,30488, + 25560,28440, 25592,32536, 25656,28824, 25688,26776, 25720,30872, 25784,29848, + 25816,27800, 25848,31896, 25912,29336, 25944,27288, 25976,31384, 26008,26264, + 26040,30360, 26072,28312, 26104,32408, 26168,29080, 26200,27032, 26232,31128, + 26296,30104, 26328,28056, 26360,32152, 26424,29592, 26456,27544, 26488,31640, + 26552,30616, 26584,28568, 26616,32664, 26680,28760, 26744,30808, 26808,29784, + 26840,27736, 26872,31832, 26936,29272, 26968,27224, 27000,31320, 27064,30296, + 27096,28248, 27128,32344, 27192,29016, 27256,31064, 27320,30040, 27352,27992, + 27384,32088, 27448,29528, 27512,31576, 27576,30552, 27608,28504, 27640,32600, + 27704,28888, 27768,30936, 27832,29912, 27896,31960, 27960,29400, 28024,31448, + 28088,30424, 28120,28376, 28152,32472, 28216,29144, 28280,31192, 28344,30168, + 28408,32216, 28472,29656, 28536,31704, 28600,30680, 28664,32728, 28792,30776, + 28856,29752, 28920,31800, 28984,29240, 29048,31288, 29112,30264, 29176,32312, + 29304,31032, 29368,30008, 29432,32056, 29560,31544, 29624,30520, 29688,32568, + 29816,30904, 29944,31928, 30072,31416, 30136,30392, 30200,32440, 30328,31160, + 30456,32184, 30584,31672, 30712,32696, 30968,31864, 31096,31352, 31224,32376, + 31480,32120, 31736,32632, 32248,32504 +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32) +/** + @par + Example code for Floating-point RFFT Twiddle factors Generation: + @par +
TW = exp(pi/2*i-2*pi*i*[0:L/2-1]/L).' 
+ @par + Real and Imag values are in interleaved fashion +*/ +const float32_t twiddleCoef_rfft_32[32] = { + 0.000000000f, 1.000000000f, + 0.195090322f, 0.980785280f, + 0.382683432f, 0.923879533f, + 0.555570233f, 0.831469612f, + 0.707106781f, 0.707106781f, + 0.831469612f, 0.555570233f, + 0.923879533f, 0.382683432f, + 0.980785280f, 0.195090322f, + 1.000000000f, 0.000000000f, + 0.980785280f, -0.195090322f, + 0.923879533f, -0.382683432f, + 0.831469612f, -0.555570233f, + 0.707106781f, -0.707106781f, + 0.555570233f, -0.831469612f, + 0.382683432f, -0.923879533f, + 0.195090322f, -0.980785280f +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64) +const float32_t twiddleCoef_rfft_64[64] = { + 0.000000000000000f, 1.000000000000000f, + 0.098017140329561f, 0.995184726672197f, + 0.195090322016128f, 0.980785280403230f, + 0.290284677254462f, 0.956940335732209f, + 0.382683432365090f, 0.923879532511287f, + 0.471396736825998f, 0.881921264348355f, + 0.555570233019602f, 0.831469612302545f, + 0.634393284163645f, 0.773010453362737f, + 0.707106781186547f, 0.707106781186548f, + 0.773010453362737f, 0.634393284163645f, + 0.831469612302545f, 0.555570233019602f, + 0.881921264348355f, 0.471396736825998f, + 0.923879532511287f, 0.382683432365090f, + 0.956940335732209f, 0.290284677254462f, + 0.980785280403230f, 0.195090322016128f, + 0.995184726672197f, 0.098017140329561f, + 1.000000000000000f, 0.000000000000000f, + 0.995184726672197f, -0.098017140329561f, + 0.980785280403230f, -0.195090322016128f, + 0.956940335732209f, -0.290284677254462f, + 0.923879532511287f, -0.382683432365090f, + 0.881921264348355f, -0.471396736825998f, + 0.831469612302545f, -0.555570233019602f, + 0.773010453362737f, -0.634393284163645f, + 0.707106781186548f, -0.707106781186547f, + 0.634393284163645f, -0.773010453362737f, + 0.555570233019602f, -0.831469612302545f, + 0.471396736825998f, -0.881921264348355f, + 0.382683432365090f, -0.923879532511287f, + 0.290284677254462f, -0.956940335732209f, + 0.195090322016129f, -0.980785280403230f, + 0.098017140329561f, -0.995184726672197f +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128) +const float32_t twiddleCoef_rfft_128[128] = { + 0.000000000f, 1.000000000f, + 0.049067674f, 0.998795456f, + 0.098017140f, 0.995184727f, + 0.146730474f, 0.989176510f, + 0.195090322f, 0.980785280f, + 0.242980180f, 0.970031253f, + 0.290284677f, 0.956940336f, + 0.336889853f, 0.941544065f, + 0.382683432f, 0.923879533f, + 0.427555093f, 0.903989293f, + 0.471396737f, 0.881921264f, + 0.514102744f, 0.857728610f, + 0.555570233f, 0.831469612f, + 0.595699304f, 0.803207531f, + 0.634393284f, 0.773010453f, + 0.671558955f, 0.740951125f, + 0.707106781f, 0.707106781f, + 0.740951125f, 0.671558955f, + 0.773010453f, 0.634393284f, + 0.803207531f, 0.595699304f, + 0.831469612f, 0.555570233f, + 0.857728610f, 0.514102744f, + 0.881921264f, 0.471396737f, + 0.903989293f, 0.427555093f, + 0.923879533f, 0.382683432f, + 0.941544065f, 0.336889853f, + 0.956940336f, 0.290284677f, + 0.970031253f, 0.242980180f, + 0.980785280f, 0.195090322f, + 0.989176510f, 0.146730474f, + 0.995184727f, 0.098017140f, + 0.998795456f, 0.049067674f, + 1.000000000f, 0.000000000f, + 0.998795456f, -0.049067674f, + 0.995184727f, -0.098017140f, + 0.989176510f, -0.146730474f, + 0.980785280f, -0.195090322f, + 0.970031253f, -0.242980180f, + 0.956940336f, -0.290284677f, + 0.941544065f, -0.336889853f, + 0.923879533f, -0.382683432f, + 0.903989293f, -0.427555093f, + 0.881921264f, -0.471396737f, + 0.857728610f, -0.514102744f, + 0.831469612f, -0.555570233f, + 0.803207531f, -0.595699304f, + 0.773010453f, -0.634393284f, + 0.740951125f, -0.671558955f, + 0.707106781f, -0.707106781f, + 0.671558955f, -0.740951125f, + 0.634393284f, -0.773010453f, + 0.595699304f, -0.803207531f, + 0.555570233f, -0.831469612f, + 0.514102744f, -0.857728610f, + 0.471396737f, -0.881921264f, + 0.427555093f, -0.903989293f, + 0.382683432f, -0.923879533f, + 0.336889853f, -0.941544065f, + 0.290284677f, -0.956940336f, + 0.242980180f, -0.970031253f, + 0.195090322f, -0.980785280f, + 0.146730474f, -0.989176510f, + 0.098017140f, -0.995184727f, + 0.049067674f, -0.998795456f +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256) +const float32_t twiddleCoef_rfft_256[256] = { + 0.000000000f, 1.000000000f, + 0.024541229f, 0.999698819f, + 0.049067674f, 0.998795456f, + 0.073564564f, 0.997290457f, + 0.098017140f, 0.995184727f, + 0.122410675f, 0.992479535f, + 0.146730474f, 0.989176510f, + 0.170961889f, 0.985277642f, + 0.195090322f, 0.980785280f, + 0.219101240f, 0.975702130f, + 0.242980180f, 0.970031253f, + 0.266712757f, 0.963776066f, + 0.290284677f, 0.956940336f, + 0.313681740f, 0.949528181f, + 0.336889853f, 0.941544065f, + 0.359895037f, 0.932992799f, + 0.382683432f, 0.923879533f, + 0.405241314f, 0.914209756f, + 0.427555093f, 0.903989293f, + 0.449611330f, 0.893224301f, + 0.471396737f, 0.881921264f, + 0.492898192f, 0.870086991f, + 0.514102744f, 0.857728610f, + 0.534997620f, 0.844853565f, + 0.555570233f, 0.831469612f, + 0.575808191f, 0.817584813f, + 0.595699304f, 0.803207531f, + 0.615231591f, 0.788346428f, + 0.634393284f, 0.773010453f, + 0.653172843f, 0.757208847f, + 0.671558955f, 0.740951125f, + 0.689540545f, 0.724247083f, + 0.707106781f, 0.707106781f, + 0.724247083f, 0.689540545f, + 0.740951125f, 0.671558955f, + 0.757208847f, 0.653172843f, + 0.773010453f, 0.634393284f, + 0.788346428f, 0.615231591f, + 0.803207531f, 0.595699304f, + 0.817584813f, 0.575808191f, + 0.831469612f, 0.555570233f, + 0.844853565f, 0.534997620f, + 0.857728610f, 0.514102744f, + 0.870086991f, 0.492898192f, + 0.881921264f, 0.471396737f, + 0.893224301f, 0.449611330f, + 0.903989293f, 0.427555093f, + 0.914209756f, 0.405241314f, + 0.923879533f, 0.382683432f, + 0.932992799f, 0.359895037f, + 0.941544065f, 0.336889853f, + 0.949528181f, 0.313681740f, + 0.956940336f, 0.290284677f, + 0.963776066f, 0.266712757f, + 0.970031253f, 0.242980180f, + 0.975702130f, 0.219101240f, + 0.980785280f, 0.195090322f, + 0.985277642f, 0.170961889f, + 0.989176510f, 0.146730474f, + 0.992479535f, 0.122410675f, + 0.995184727f, 0.098017140f, + 0.997290457f, 0.073564564f, + 0.998795456f, 0.049067674f, + 0.999698819f, 0.024541229f, + 1.000000000f, 0.000000000f, + 0.999698819f, -0.024541229f, + 0.998795456f, -0.049067674f, + 0.997290457f, -0.073564564f, + 0.995184727f, -0.098017140f, + 0.992479535f, -0.122410675f, + 0.989176510f, -0.146730474f, + 0.985277642f, -0.170961889f, + 0.980785280f, -0.195090322f, + 0.975702130f, -0.219101240f, + 0.970031253f, -0.242980180f, + 0.963776066f, -0.266712757f, + 0.956940336f, -0.290284677f, + 0.949528181f, -0.313681740f, + 0.941544065f, -0.336889853f, + 0.932992799f, -0.359895037f, + 0.923879533f, -0.382683432f, + 0.914209756f, -0.405241314f, + 0.903989293f, -0.427555093f, + 0.893224301f, -0.449611330f, + 0.881921264f, -0.471396737f, + 0.870086991f, -0.492898192f, + 0.857728610f, -0.514102744f, + 0.844853565f, -0.534997620f, + 0.831469612f, -0.555570233f, + 0.817584813f, -0.575808191f, + 0.803207531f, -0.595699304f, + 0.788346428f, -0.615231591f, + 0.773010453f, -0.634393284f, + 0.757208847f, -0.653172843f, + 0.740951125f, -0.671558955f, + 0.724247083f, -0.689540545f, + 0.707106781f, -0.707106781f, + 0.689540545f, -0.724247083f, + 0.671558955f, -0.740951125f, + 0.653172843f, -0.757208847f, + 0.634393284f, -0.773010453f, + 0.615231591f, -0.788346428f, + 0.595699304f, -0.803207531f, + 0.575808191f, -0.817584813f, + 0.555570233f, -0.831469612f, + 0.534997620f, -0.844853565f, + 0.514102744f, -0.857728610f, + 0.492898192f, -0.870086991f, + 0.471396737f, -0.881921264f, + 0.449611330f, -0.893224301f, + 0.427555093f, -0.903989293f, + 0.405241314f, -0.914209756f, + 0.382683432f, -0.923879533f, + 0.359895037f, -0.932992799f, + 0.336889853f, -0.941544065f, + 0.313681740f, -0.949528181f, + 0.290284677f, -0.956940336f, + 0.266712757f, -0.963776066f, + 0.242980180f, -0.970031253f, + 0.219101240f, -0.975702130f, + 0.195090322f, -0.980785280f, + 0.170961889f, -0.985277642f, + 0.146730474f, -0.989176510f, + 0.122410675f, -0.992479535f, + 0.098017140f, -0.995184727f, + 0.073564564f, -0.997290457f, + 0.049067674f, -0.998795456f, + 0.024541229f, -0.999698819f +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512) +const float32_t twiddleCoef_rfft_512[512] = { + 0.000000000f, 1.000000000f, + 0.012271538f, 0.999924702f, + 0.024541229f, 0.999698819f, + 0.036807223f, 0.999322385f, + 0.049067674f, 0.998795456f, + 0.061320736f, 0.998118113f, + 0.073564564f, 0.997290457f, + 0.085797312f, 0.996312612f, + 0.098017140f, 0.995184727f, + 0.110222207f, 0.993906970f, + 0.122410675f, 0.992479535f, + 0.134580709f, 0.990902635f, + 0.146730474f, 0.989176510f, + 0.158858143f, 0.987301418f, + 0.170961889f, 0.985277642f, + 0.183039888f, 0.983105487f, + 0.195090322f, 0.980785280f, + 0.207111376f, 0.978317371f, + 0.219101240f, 0.975702130f, + 0.231058108f, 0.972939952f, + 0.242980180f, 0.970031253f, + 0.254865660f, 0.966976471f, + 0.266712757f, 0.963776066f, + 0.278519689f, 0.960430519f, + 0.290284677f, 0.956940336f, + 0.302005949f, 0.953306040f, + 0.313681740f, 0.949528181f, + 0.325310292f, 0.945607325f, + 0.336889853f, 0.941544065f, + 0.348418680f, 0.937339012f, + 0.359895037f, 0.932992799f, + 0.371317194f, 0.928506080f, + 0.382683432f, 0.923879533f, + 0.393992040f, 0.919113852f, + 0.405241314f, 0.914209756f, + 0.416429560f, 0.909167983f, + 0.427555093f, 0.903989293f, + 0.438616239f, 0.898674466f, + 0.449611330f, 0.893224301f, + 0.460538711f, 0.887639620f, + 0.471396737f, 0.881921264f, + 0.482183772f, 0.876070094f, + 0.492898192f, 0.870086991f, + 0.503538384f, 0.863972856f, + 0.514102744f, 0.857728610f, + 0.524589683f, 0.851355193f, + 0.534997620f, 0.844853565f, + 0.545324988f, 0.838224706f, + 0.555570233f, 0.831469612f, + 0.565731811f, 0.824589303f, + 0.575808191f, 0.817584813f, + 0.585797857f, 0.810457198f, + 0.595699304f, 0.803207531f, + 0.605511041f, 0.795836905f, + 0.615231591f, 0.788346428f, + 0.624859488f, 0.780737229f, + 0.634393284f, 0.773010453f, + 0.643831543f, 0.765167266f, + 0.653172843f, 0.757208847f, + 0.662415778f, 0.749136395f, + 0.671558955f, 0.740951125f, + 0.680600998f, 0.732654272f, + 0.689540545f, 0.724247083f, + 0.698376249f, 0.715730825f, + 0.707106781f, 0.707106781f, + 0.715730825f, 0.698376249f, + 0.724247083f, 0.689540545f, + 0.732654272f, 0.680600998f, + 0.740951125f, 0.671558955f, + 0.749136395f, 0.662415778f, + 0.757208847f, 0.653172843f, + 0.765167266f, 0.643831543f, + 0.773010453f, 0.634393284f, + 0.780737229f, 0.624859488f, + 0.788346428f, 0.615231591f, + 0.795836905f, 0.605511041f, + 0.803207531f, 0.595699304f, + 0.810457198f, 0.585797857f, + 0.817584813f, 0.575808191f, + 0.824589303f, 0.565731811f, + 0.831469612f, 0.555570233f, + 0.838224706f, 0.545324988f, + 0.844853565f, 0.534997620f, + 0.851355193f, 0.524589683f, + 0.857728610f, 0.514102744f, + 0.863972856f, 0.503538384f, + 0.870086991f, 0.492898192f, + 0.876070094f, 0.482183772f, + 0.881921264f, 0.471396737f, + 0.887639620f, 0.460538711f, + 0.893224301f, 0.449611330f, + 0.898674466f, 0.438616239f, + 0.903989293f, 0.427555093f, + 0.909167983f, 0.416429560f, + 0.914209756f, 0.405241314f, + 0.919113852f, 0.393992040f, + 0.923879533f, 0.382683432f, + 0.928506080f, 0.371317194f, + 0.932992799f, 0.359895037f, + 0.937339012f, 0.348418680f, + 0.941544065f, 0.336889853f, + 0.945607325f, 0.325310292f, + 0.949528181f, 0.313681740f, + 0.953306040f, 0.302005949f, + 0.956940336f, 0.290284677f, + 0.960430519f, 0.278519689f, + 0.963776066f, 0.266712757f, + 0.966976471f, 0.254865660f, + 0.970031253f, 0.242980180f, + 0.972939952f, 0.231058108f, + 0.975702130f, 0.219101240f, + 0.978317371f, 0.207111376f, + 0.980785280f, 0.195090322f, + 0.983105487f, 0.183039888f, + 0.985277642f, 0.170961889f, + 0.987301418f, 0.158858143f, + 0.989176510f, 0.146730474f, + 0.990902635f, 0.134580709f, + 0.992479535f, 0.122410675f, + 0.993906970f, 0.110222207f, + 0.995184727f, 0.098017140f, + 0.996312612f, 0.085797312f, + 0.997290457f, 0.073564564f, + 0.998118113f, 0.061320736f, + 0.998795456f, 0.049067674f, + 0.999322385f, 0.036807223f, + 0.999698819f, 0.024541229f, + 0.999924702f, 0.012271538f, + 1.000000000f, 0.000000000f, + 0.999924702f, -0.012271538f, + 0.999698819f, -0.024541229f, + 0.999322385f, -0.036807223f, + 0.998795456f, -0.049067674f, + 0.998118113f, -0.061320736f, + 0.997290457f, -0.073564564f, + 0.996312612f, -0.085797312f, + 0.995184727f, -0.098017140f, + 0.993906970f, -0.110222207f, + 0.992479535f, -0.122410675f, + 0.990902635f, -0.134580709f, + 0.989176510f, -0.146730474f, + 0.987301418f, -0.158858143f, + 0.985277642f, -0.170961889f, + 0.983105487f, -0.183039888f, + 0.980785280f, -0.195090322f, + 0.978317371f, -0.207111376f, + 0.975702130f, -0.219101240f, + 0.972939952f, -0.231058108f, + 0.970031253f, -0.242980180f, + 0.966976471f, -0.254865660f, + 0.963776066f, -0.266712757f, + 0.960430519f, -0.278519689f, + 0.956940336f, -0.290284677f, + 0.953306040f, -0.302005949f, + 0.949528181f, -0.313681740f, + 0.945607325f, -0.325310292f, + 0.941544065f, -0.336889853f, + 0.937339012f, -0.348418680f, + 0.932992799f, -0.359895037f, + 0.928506080f, -0.371317194f, + 0.923879533f, -0.382683432f, + 0.919113852f, -0.393992040f, + 0.914209756f, -0.405241314f, + 0.909167983f, -0.416429560f, + 0.903989293f, -0.427555093f, + 0.898674466f, -0.438616239f, + 0.893224301f, -0.449611330f, + 0.887639620f, -0.460538711f, + 0.881921264f, -0.471396737f, + 0.876070094f, -0.482183772f, + 0.870086991f, -0.492898192f, + 0.863972856f, -0.503538384f, + 0.857728610f, -0.514102744f, + 0.851355193f, -0.524589683f, + 0.844853565f, -0.534997620f, + 0.838224706f, -0.545324988f, + 0.831469612f, -0.555570233f, + 0.824589303f, -0.565731811f, + 0.817584813f, -0.575808191f, + 0.810457198f, -0.585797857f, + 0.803207531f, -0.595699304f, + 0.795836905f, -0.605511041f, + 0.788346428f, -0.615231591f, + 0.780737229f, -0.624859488f, + 0.773010453f, -0.634393284f, + 0.765167266f, -0.643831543f, + 0.757208847f, -0.653172843f, + 0.749136395f, -0.662415778f, + 0.740951125f, -0.671558955f, + 0.732654272f, -0.680600998f, + 0.724247083f, -0.689540545f, + 0.715730825f, -0.698376249f, + 0.707106781f, -0.707106781f, + 0.698376249f, -0.715730825f, + 0.689540545f, -0.724247083f, + 0.680600998f, -0.732654272f, + 0.671558955f, -0.740951125f, + 0.662415778f, -0.749136395f, + 0.653172843f, -0.757208847f, + 0.643831543f, -0.765167266f, + 0.634393284f, -0.773010453f, + 0.624859488f, -0.780737229f, + 0.615231591f, -0.788346428f, + 0.605511041f, -0.795836905f, + 0.595699304f, -0.803207531f, + 0.585797857f, -0.810457198f, + 0.575808191f, -0.817584813f, + 0.565731811f, -0.824589303f, + 0.555570233f, -0.831469612f, + 0.545324988f, -0.838224706f, + 0.534997620f, -0.844853565f, + 0.524589683f, -0.851355193f, + 0.514102744f, -0.857728610f, + 0.503538384f, -0.863972856f, + 0.492898192f, -0.870086991f, + 0.482183772f, -0.876070094f, + 0.471396737f, -0.881921264f, + 0.460538711f, -0.887639620f, + 0.449611330f, -0.893224301f, + 0.438616239f, -0.898674466f, + 0.427555093f, -0.903989293f, + 0.416429560f, -0.909167983f, + 0.405241314f, -0.914209756f, + 0.393992040f, -0.919113852f, + 0.382683432f, -0.923879533f, + 0.371317194f, -0.928506080f, + 0.359895037f, -0.932992799f, + 0.348418680f, -0.937339012f, + 0.336889853f, -0.941544065f, + 0.325310292f, -0.945607325f, + 0.313681740f, -0.949528181f, + 0.302005949f, -0.953306040f, + 0.290284677f, -0.956940336f, + 0.278519689f, -0.960430519f, + 0.266712757f, -0.963776066f, + 0.254865660f, -0.966976471f, + 0.242980180f, -0.970031253f, + 0.231058108f, -0.972939952f, + 0.219101240f, -0.975702130f, + 0.207111376f, -0.978317371f, + 0.195090322f, -0.980785280f, + 0.183039888f, -0.983105487f, + 0.170961889f, -0.985277642f, + 0.158858143f, -0.987301418f, + 0.146730474f, -0.989176510f, + 0.134580709f, -0.990902635f, + 0.122410675f, -0.992479535f, + 0.110222207f, -0.993906970f, + 0.098017140f, -0.995184727f, + 0.085797312f, -0.996312612f, + 0.073564564f, -0.997290457f, + 0.061320736f, -0.998118113f, + 0.049067674f, -0.998795456f, + 0.036807223f, -0.999322385f, + 0.024541229f, -0.999698819f, + 0.012271538f, -0.999924702f +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024) +const float32_t twiddleCoef_rfft_1024[1024] = { + 0.000000000f, 1.000000000f, + 0.006135885f, 0.999981175f, + 0.012271538f, 0.999924702f, + 0.018406730f, 0.999830582f, + 0.024541229f, 0.999698819f, + 0.030674803f, 0.999529418f, + 0.036807223f, 0.999322385f, + 0.042938257f, 0.999077728f, + 0.049067674f, 0.998795456f, + 0.055195244f, 0.998475581f, + 0.061320736f, 0.998118113f, + 0.067443920f, 0.997723067f, + 0.073564564f, 0.997290457f, + 0.079682438f, 0.996820299f, + 0.085797312f, 0.996312612f, + 0.091908956f, 0.995767414f, + 0.098017140f, 0.995184727f, + 0.104121634f, 0.994564571f, + 0.110222207f, 0.993906970f, + 0.116318631f, 0.993211949f, + 0.122410675f, 0.992479535f, + 0.128498111f, 0.991709754f, + 0.134580709f, 0.990902635f, + 0.140658239f, 0.990058210f, + 0.146730474f, 0.989176510f, + 0.152797185f, 0.988257568f, + 0.158858143f, 0.987301418f, + 0.164913120f, 0.986308097f, + 0.170961889f, 0.985277642f, + 0.177004220f, 0.984210092f, + 0.183039888f, 0.983105487f, + 0.189068664f, 0.981963869f, + 0.195090322f, 0.980785280f, + 0.201104635f, 0.979569766f, + 0.207111376f, 0.978317371f, + 0.213110320f, 0.977028143f, + 0.219101240f, 0.975702130f, + 0.225083911f, 0.974339383f, + 0.231058108f, 0.972939952f, + 0.237023606f, 0.971503891f, + 0.242980180f, 0.970031253f, + 0.248927606f, 0.968522094f, + 0.254865660f, 0.966976471f, + 0.260794118f, 0.965394442f, + 0.266712757f, 0.963776066f, + 0.272621355f, 0.962121404f, + 0.278519689f, 0.960430519f, + 0.284407537f, 0.958703475f, + 0.290284677f, 0.956940336f, + 0.296150888f, 0.955141168f, + 0.302005949f, 0.953306040f, + 0.307849640f, 0.951435021f, + 0.313681740f, 0.949528181f, + 0.319502031f, 0.947585591f, + 0.325310292f, 0.945607325f, + 0.331106306f, 0.943593458f, + 0.336889853f, 0.941544065f, + 0.342660717f, 0.939459224f, + 0.348418680f, 0.937339012f, + 0.354163525f, 0.935183510f, + 0.359895037f, 0.932992799f, + 0.365612998f, 0.930766961f, + 0.371317194f, 0.928506080f, + 0.377007410f, 0.926210242f, + 0.382683432f, 0.923879533f, + 0.388345047f, 0.921514039f, + 0.393992040f, 0.919113852f, + 0.399624200f, 0.916679060f, + 0.405241314f, 0.914209756f, + 0.410843171f, 0.911706032f, + 0.416429560f, 0.909167983f, + 0.422000271f, 0.906595705f, + 0.427555093f, 0.903989293f, + 0.433093819f, 0.901348847f, + 0.438616239f, 0.898674466f, + 0.444122145f, 0.895966250f, + 0.449611330f, 0.893224301f, + 0.455083587f, 0.890448723f, + 0.460538711f, 0.887639620f, + 0.465976496f, 0.884797098f, + 0.471396737f, 0.881921264f, + 0.476799230f, 0.879012226f, + 0.482183772f, 0.876070094f, + 0.487550160f, 0.873094978f, + 0.492898192f, 0.870086991f, + 0.498227667f, 0.867046246f, + 0.503538384f, 0.863972856f, + 0.508830143f, 0.860866939f, + 0.514102744f, 0.857728610f, + 0.519355990f, 0.854557988f, + 0.524589683f, 0.851355193f, + 0.529803625f, 0.848120345f, + 0.534997620f, 0.844853565f, + 0.540171473f, 0.841554977f, + 0.545324988f, 0.838224706f, + 0.550457973f, 0.834862875f, + 0.555570233f, 0.831469612f, + 0.560661576f, 0.828045045f, + 0.565731811f, 0.824589303f, + 0.570780746f, 0.821102515f, + 0.575808191f, 0.817584813f, + 0.580813958f, 0.814036330f, + 0.585797857f, 0.810457198f, + 0.590759702f, 0.806847554f, + 0.595699304f, 0.803207531f, + 0.600616479f, 0.799537269f, + 0.605511041f, 0.795836905f, + 0.610382806f, 0.792106577f, + 0.615231591f, 0.788346428f, + 0.620057212f, 0.784556597f, + 0.624859488f, 0.780737229f, + 0.629638239f, 0.776888466f, + 0.634393284f, 0.773010453f, + 0.639124445f, 0.769103338f, + 0.643831543f, 0.765167266f, + 0.648514401f, 0.761202385f, + 0.653172843f, 0.757208847f, + 0.657806693f, 0.753186799f, + 0.662415778f, 0.749136395f, + 0.666999922f, 0.745057785f, + 0.671558955f, 0.740951125f, + 0.676092704f, 0.736816569f, + 0.680600998f, 0.732654272f, + 0.685083668f, 0.728464390f, + 0.689540545f, 0.724247083f, + 0.693971461f, 0.720002508f, + 0.698376249f, 0.715730825f, + 0.702754744f, 0.711432196f, + 0.707106781f, 0.707106781f, + 0.711432196f, 0.702754744f, + 0.715730825f, 0.698376249f, + 0.720002508f, 0.693971461f, + 0.724247083f, 0.689540545f, + 0.728464390f, 0.685083668f, + 0.732654272f, 0.680600998f, + 0.736816569f, 0.676092704f, + 0.740951125f, 0.671558955f, + 0.745057785f, 0.666999922f, + 0.749136395f, 0.662415778f, + 0.753186799f, 0.657806693f, + 0.757208847f, 0.653172843f, + 0.761202385f, 0.648514401f, + 0.765167266f, 0.643831543f, + 0.769103338f, 0.639124445f, + 0.773010453f, 0.634393284f, + 0.776888466f, 0.629638239f, + 0.780737229f, 0.624859488f, + 0.784556597f, 0.620057212f, + 0.788346428f, 0.615231591f, + 0.792106577f, 0.610382806f, + 0.795836905f, 0.605511041f, + 0.799537269f, 0.600616479f, + 0.803207531f, 0.595699304f, + 0.806847554f, 0.590759702f, + 0.810457198f, 0.585797857f, + 0.814036330f, 0.580813958f, + 0.817584813f, 0.575808191f, + 0.821102515f, 0.570780746f, + 0.824589303f, 0.565731811f, + 0.828045045f, 0.560661576f, + 0.831469612f, 0.555570233f, + 0.834862875f, 0.550457973f, + 0.838224706f, 0.545324988f, + 0.841554977f, 0.540171473f, + 0.844853565f, 0.534997620f, + 0.848120345f, 0.529803625f, + 0.851355193f, 0.524589683f, + 0.854557988f, 0.519355990f, + 0.857728610f, 0.514102744f, + 0.860866939f, 0.508830143f, + 0.863972856f, 0.503538384f, + 0.867046246f, 0.498227667f, + 0.870086991f, 0.492898192f, + 0.873094978f, 0.487550160f, + 0.876070094f, 0.482183772f, + 0.879012226f, 0.476799230f, + 0.881921264f, 0.471396737f, + 0.884797098f, 0.465976496f, + 0.887639620f, 0.460538711f, + 0.890448723f, 0.455083587f, + 0.893224301f, 0.449611330f, + 0.895966250f, 0.444122145f, + 0.898674466f, 0.438616239f, + 0.901348847f, 0.433093819f, + 0.903989293f, 0.427555093f, + 0.906595705f, 0.422000271f, + 0.909167983f, 0.416429560f, + 0.911706032f, 0.410843171f, + 0.914209756f, 0.405241314f, + 0.916679060f, 0.399624200f, + 0.919113852f, 0.393992040f, + 0.921514039f, 0.388345047f, + 0.923879533f, 0.382683432f, + 0.926210242f, 0.377007410f, + 0.928506080f, 0.371317194f, + 0.930766961f, 0.365612998f, + 0.932992799f, 0.359895037f, + 0.935183510f, 0.354163525f, + 0.937339012f, 0.348418680f, + 0.939459224f, 0.342660717f, + 0.941544065f, 0.336889853f, + 0.943593458f, 0.331106306f, + 0.945607325f, 0.325310292f, + 0.947585591f, 0.319502031f, + 0.949528181f, 0.313681740f, + 0.951435021f, 0.307849640f, + 0.953306040f, 0.302005949f, + 0.955141168f, 0.296150888f, + 0.956940336f, 0.290284677f, + 0.958703475f, 0.284407537f, + 0.960430519f, 0.278519689f, + 0.962121404f, 0.272621355f, + 0.963776066f, 0.266712757f, + 0.965394442f, 0.260794118f, + 0.966976471f, 0.254865660f, + 0.968522094f, 0.248927606f, + 0.970031253f, 0.242980180f, + 0.971503891f, 0.237023606f, + 0.972939952f, 0.231058108f, + 0.974339383f, 0.225083911f, + 0.975702130f, 0.219101240f, + 0.977028143f, 0.213110320f, + 0.978317371f, 0.207111376f, + 0.979569766f, 0.201104635f, + 0.980785280f, 0.195090322f, + 0.981963869f, 0.189068664f, + 0.983105487f, 0.183039888f, + 0.984210092f, 0.177004220f, + 0.985277642f, 0.170961889f, + 0.986308097f, 0.164913120f, + 0.987301418f, 0.158858143f, + 0.988257568f, 0.152797185f, + 0.989176510f, 0.146730474f, + 0.990058210f, 0.140658239f, + 0.990902635f, 0.134580709f, + 0.991709754f, 0.128498111f, + 0.992479535f, 0.122410675f, + 0.993211949f, 0.116318631f, + 0.993906970f, 0.110222207f, + 0.994564571f, 0.104121634f, + 0.995184727f, 0.098017140f, + 0.995767414f, 0.091908956f, + 0.996312612f, 0.085797312f, + 0.996820299f, 0.079682438f, + 0.997290457f, 0.073564564f, + 0.997723067f, 0.067443920f, + 0.998118113f, 0.061320736f, + 0.998475581f, 0.055195244f, + 0.998795456f, 0.049067674f, + 0.999077728f, 0.042938257f, + 0.999322385f, 0.036807223f, + 0.999529418f, 0.030674803f, + 0.999698819f, 0.024541229f, + 0.999830582f, 0.018406730f, + 0.999924702f, 0.012271538f, + 0.999981175f, 0.006135885f, + 1.000000000f, 0.000000000f, + 0.999981175f, -0.006135885f, + 0.999924702f, -0.012271538f, + 0.999830582f, -0.018406730f, + 0.999698819f, -0.024541229f, + 0.999529418f, -0.030674803f, + 0.999322385f, -0.036807223f, + 0.999077728f, -0.042938257f, + 0.998795456f, -0.049067674f, + 0.998475581f, -0.055195244f, + 0.998118113f, -0.061320736f, + 0.997723067f, -0.067443920f, + 0.997290457f, -0.073564564f, + 0.996820299f, -0.079682438f, + 0.996312612f, -0.085797312f, + 0.995767414f, -0.091908956f, + 0.995184727f, -0.098017140f, + 0.994564571f, -0.104121634f, + 0.993906970f, -0.110222207f, + 0.993211949f, -0.116318631f, + 0.992479535f, -0.122410675f, + 0.991709754f, -0.128498111f, + 0.990902635f, -0.134580709f, + 0.990058210f, -0.140658239f, + 0.989176510f, -0.146730474f, + 0.988257568f, -0.152797185f, + 0.987301418f, -0.158858143f, + 0.986308097f, -0.164913120f, + 0.985277642f, -0.170961889f, + 0.984210092f, -0.177004220f, + 0.983105487f, -0.183039888f, + 0.981963869f, -0.189068664f, + 0.980785280f, -0.195090322f, + 0.979569766f, -0.201104635f, + 0.978317371f, -0.207111376f, + 0.977028143f, -0.213110320f, + 0.975702130f, -0.219101240f, + 0.974339383f, -0.225083911f, + 0.972939952f, -0.231058108f, + 0.971503891f, -0.237023606f, + 0.970031253f, -0.242980180f, + 0.968522094f, -0.248927606f, + 0.966976471f, -0.254865660f, + 0.965394442f, -0.260794118f, + 0.963776066f, -0.266712757f, + 0.962121404f, -0.272621355f, + 0.960430519f, -0.278519689f, + 0.958703475f, -0.284407537f, + 0.956940336f, -0.290284677f, + 0.955141168f, -0.296150888f, + 0.953306040f, -0.302005949f, + 0.951435021f, -0.307849640f, + 0.949528181f, -0.313681740f, + 0.947585591f, -0.319502031f, + 0.945607325f, -0.325310292f, + 0.943593458f, -0.331106306f, + 0.941544065f, -0.336889853f, + 0.939459224f, -0.342660717f, + 0.937339012f, -0.348418680f, + 0.935183510f, -0.354163525f, + 0.932992799f, -0.359895037f, + 0.930766961f, -0.365612998f, + 0.928506080f, -0.371317194f, + 0.926210242f, -0.377007410f, + 0.923879533f, -0.382683432f, + 0.921514039f, -0.388345047f, + 0.919113852f, -0.393992040f, + 0.916679060f, -0.399624200f, + 0.914209756f, -0.405241314f, + 0.911706032f, -0.410843171f, + 0.909167983f, -0.416429560f, + 0.906595705f, -0.422000271f, + 0.903989293f, -0.427555093f, + 0.901348847f, -0.433093819f, + 0.898674466f, -0.438616239f, + 0.895966250f, -0.444122145f, + 0.893224301f, -0.449611330f, + 0.890448723f, -0.455083587f, + 0.887639620f, -0.460538711f, + 0.884797098f, -0.465976496f, + 0.881921264f, -0.471396737f, + 0.879012226f, -0.476799230f, + 0.876070094f, -0.482183772f, + 0.873094978f, -0.487550160f, + 0.870086991f, -0.492898192f, + 0.867046246f, -0.498227667f, + 0.863972856f, -0.503538384f, + 0.860866939f, -0.508830143f, + 0.857728610f, -0.514102744f, + 0.854557988f, -0.519355990f, + 0.851355193f, -0.524589683f, + 0.848120345f, -0.529803625f, + 0.844853565f, -0.534997620f, + 0.841554977f, -0.540171473f, + 0.838224706f, -0.545324988f, + 0.834862875f, -0.550457973f, + 0.831469612f, -0.555570233f, + 0.828045045f, -0.560661576f, + 0.824589303f, -0.565731811f, + 0.821102515f, -0.570780746f, + 0.817584813f, -0.575808191f, + 0.814036330f, -0.580813958f, + 0.810457198f, -0.585797857f, + 0.806847554f, -0.590759702f, + 0.803207531f, -0.595699304f, + 0.799537269f, -0.600616479f, + 0.795836905f, -0.605511041f, + 0.792106577f, -0.610382806f, + 0.788346428f, -0.615231591f, + 0.784556597f, -0.620057212f, + 0.780737229f, -0.624859488f, + 0.776888466f, -0.629638239f, + 0.773010453f, -0.634393284f, + 0.769103338f, -0.639124445f, + 0.765167266f, -0.643831543f, + 0.761202385f, -0.648514401f, + 0.757208847f, -0.653172843f, + 0.753186799f, -0.657806693f, + 0.749136395f, -0.662415778f, + 0.745057785f, -0.666999922f, + 0.740951125f, -0.671558955f, + 0.736816569f, -0.676092704f, + 0.732654272f, -0.680600998f, + 0.728464390f, -0.685083668f, + 0.724247083f, -0.689540545f, + 0.720002508f, -0.693971461f, + 0.715730825f, -0.698376249f, + 0.711432196f, -0.702754744f, + 0.707106781f, -0.707106781f, + 0.702754744f, -0.711432196f, + 0.698376249f, -0.715730825f, + 0.693971461f, -0.720002508f, + 0.689540545f, -0.724247083f, + 0.685083668f, -0.728464390f, + 0.680600998f, -0.732654272f, + 0.676092704f, -0.736816569f, + 0.671558955f, -0.740951125f, + 0.666999922f, -0.745057785f, + 0.662415778f, -0.749136395f, + 0.657806693f, -0.753186799f, + 0.653172843f, -0.757208847f, + 0.648514401f, -0.761202385f, + 0.643831543f, -0.765167266f, + 0.639124445f, -0.769103338f, + 0.634393284f, -0.773010453f, + 0.629638239f, -0.776888466f, + 0.624859488f, -0.780737229f, + 0.620057212f, -0.784556597f, + 0.615231591f, -0.788346428f, + 0.610382806f, -0.792106577f, + 0.605511041f, -0.795836905f, + 0.600616479f, -0.799537269f, + 0.595699304f, -0.803207531f, + 0.590759702f, -0.806847554f, + 0.585797857f, -0.810457198f, + 0.580813958f, -0.814036330f, + 0.575808191f, -0.817584813f, + 0.570780746f, -0.821102515f, + 0.565731811f, -0.824589303f, + 0.560661576f, -0.828045045f, + 0.555570233f, -0.831469612f, + 0.550457973f, -0.834862875f, + 0.545324988f, -0.838224706f, + 0.540171473f, -0.841554977f, + 0.534997620f, -0.844853565f, + 0.529803625f, -0.848120345f, + 0.524589683f, -0.851355193f, + 0.519355990f, -0.854557988f, + 0.514102744f, -0.857728610f, + 0.508830143f, -0.860866939f, + 0.503538384f, -0.863972856f, + 0.498227667f, -0.867046246f, + 0.492898192f, -0.870086991f, + 0.487550160f, -0.873094978f, + 0.482183772f, -0.876070094f, + 0.476799230f, -0.879012226f, + 0.471396737f, -0.881921264f, + 0.465976496f, -0.884797098f, + 0.460538711f, -0.887639620f, + 0.455083587f, -0.890448723f, + 0.449611330f, -0.893224301f, + 0.444122145f, -0.895966250f, + 0.438616239f, -0.898674466f, + 0.433093819f, -0.901348847f, + 0.427555093f, -0.903989293f, + 0.422000271f, -0.906595705f, + 0.416429560f, -0.909167983f, + 0.410843171f, -0.911706032f, + 0.405241314f, -0.914209756f, + 0.399624200f, -0.916679060f, + 0.393992040f, -0.919113852f, + 0.388345047f, -0.921514039f, + 0.382683432f, -0.923879533f, + 0.377007410f, -0.926210242f, + 0.371317194f, -0.928506080f, + 0.365612998f, -0.930766961f, + 0.359895037f, -0.932992799f, + 0.354163525f, -0.935183510f, + 0.348418680f, -0.937339012f, + 0.342660717f, -0.939459224f, + 0.336889853f, -0.941544065f, + 0.331106306f, -0.943593458f, + 0.325310292f, -0.945607325f, + 0.319502031f, -0.947585591f, + 0.313681740f, -0.949528181f, + 0.307849640f, -0.951435021f, + 0.302005949f, -0.953306040f, + 0.296150888f, -0.955141168f, + 0.290284677f, -0.956940336f, + 0.284407537f, -0.958703475f, + 0.278519689f, -0.960430519f, + 0.272621355f, -0.962121404f, + 0.266712757f, -0.963776066f, + 0.260794118f, -0.965394442f, + 0.254865660f, -0.966976471f, + 0.248927606f, -0.968522094f, + 0.242980180f, -0.970031253f, + 0.237023606f, -0.971503891f, + 0.231058108f, -0.972939952f, + 0.225083911f, -0.974339383f, + 0.219101240f, -0.975702130f, + 0.213110320f, -0.977028143f, + 0.207111376f, -0.978317371f, + 0.201104635f, -0.979569766f, + 0.195090322f, -0.980785280f, + 0.189068664f, -0.981963869f, + 0.183039888f, -0.983105487f, + 0.177004220f, -0.984210092f, + 0.170961889f, -0.985277642f, + 0.164913120f, -0.986308097f, + 0.158858143f, -0.987301418f, + 0.152797185f, -0.988257568f, + 0.146730474f, -0.989176510f, + 0.140658239f, -0.990058210f, + 0.134580709f, -0.990902635f, + 0.128498111f, -0.991709754f, + 0.122410675f, -0.992479535f, + 0.116318631f, -0.993211949f, + 0.110222207f, -0.993906970f, + 0.104121634f, -0.994564571f, + 0.098017140f, -0.995184727f, + 0.091908956f, -0.995767414f, + 0.085797312f, -0.996312612f, + 0.079682438f, -0.996820299f, + 0.073564564f, -0.997290457f, + 0.067443920f, -0.997723067f, + 0.061320736f, -0.998118113f, + 0.055195244f, -0.998475581f, + 0.049067674f, -0.998795456f, + 0.042938257f, -0.999077728f, + 0.036807223f, -0.999322385f, + 0.030674803f, -0.999529418f, + 0.024541229f, -0.999698819f, + 0.018406730f, -0.999830582f, + 0.012271538f, -0.999924702f, + 0.006135885f, -0.999981175f +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048) +const float32_t twiddleCoef_rfft_2048[2048] = { + 0.000000000f, 1.000000000f, + 0.003067957f, 0.999995294f, + 0.006135885f, 0.999981175f, + 0.009203755f, 0.999957645f, + 0.012271538f, 0.999924702f, + 0.015339206f, 0.999882347f, + 0.018406730f, 0.999830582f, + 0.021474080f, 0.999769405f, + 0.024541229f, 0.999698819f, + 0.027608146f, 0.999618822f, + 0.030674803f, 0.999529418f, + 0.033741172f, 0.999430605f, + 0.036807223f, 0.999322385f, + 0.039872928f, 0.999204759f, + 0.042938257f, 0.999077728f, + 0.046003182f, 0.998941293f, + 0.049067674f, 0.998795456f, + 0.052131705f, 0.998640218f, + 0.055195244f, 0.998475581f, + 0.058258265f, 0.998301545f, + 0.061320736f, 0.998118113f, + 0.064382631f, 0.997925286f, + 0.067443920f, 0.997723067f, + 0.070504573f, 0.997511456f, + 0.073564564f, 0.997290457f, + 0.076623861f, 0.997060070f, + 0.079682438f, 0.996820299f, + 0.082740265f, 0.996571146f, + 0.085797312f, 0.996312612f, + 0.088853553f, 0.996044701f, + 0.091908956f, 0.995767414f, + 0.094963495f, 0.995480755f, + 0.098017140f, 0.995184727f, + 0.101069863f, 0.994879331f, + 0.104121634f, 0.994564571f, + 0.107172425f, 0.994240449f, + 0.110222207f, 0.993906970f, + 0.113270952f, 0.993564136f, + 0.116318631f, 0.993211949f, + 0.119365215f, 0.992850414f, + 0.122410675f, 0.992479535f, + 0.125454983f, 0.992099313f, + 0.128498111f, 0.991709754f, + 0.131540029f, 0.991310860f, + 0.134580709f, 0.990902635f, + 0.137620122f, 0.990485084f, + 0.140658239f, 0.990058210f, + 0.143695033f, 0.989622017f, + 0.146730474f, 0.989176510f, + 0.149764535f, 0.988721692f, + 0.152797185f, 0.988257568f, + 0.155828398f, 0.987784142f, + 0.158858143f, 0.987301418f, + 0.161886394f, 0.986809402f, + 0.164913120f, 0.986308097f, + 0.167938295f, 0.985797509f, + 0.170961889f, 0.985277642f, + 0.173983873f, 0.984748502f, + 0.177004220f, 0.984210092f, + 0.180022901f, 0.983662419f, + 0.183039888f, 0.983105487f, + 0.186055152f, 0.982539302f, + 0.189068664f, 0.981963869f, + 0.192080397f, 0.981379193f, + 0.195090322f, 0.980785280f, + 0.198098411f, 0.980182136f, + 0.201104635f, 0.979569766f, + 0.204108966f, 0.978948175f, + 0.207111376f, 0.978317371f, + 0.210111837f, 0.977677358f, + 0.213110320f, 0.977028143f, + 0.216106797f, 0.976369731f, + 0.219101240f, 0.975702130f, + 0.222093621f, 0.975025345f, + 0.225083911f, 0.974339383f, + 0.228072083f, 0.973644250f, + 0.231058108f, 0.972939952f, + 0.234041959f, 0.972226497f, + 0.237023606f, 0.971503891f, + 0.240003022f, 0.970772141f, + 0.242980180f, 0.970031253f, + 0.245955050f, 0.969281235f, + 0.248927606f, 0.968522094f, + 0.251897818f, 0.967753837f, + 0.254865660f, 0.966976471f, + 0.257831102f, 0.966190003f, + 0.260794118f, 0.965394442f, + 0.263754679f, 0.964589793f, + 0.266712757f, 0.963776066f, + 0.269668326f, 0.962953267f, + 0.272621355f, 0.962121404f, + 0.275571819f, 0.961280486f, + 0.278519689f, 0.960430519f, + 0.281464938f, 0.959571513f, + 0.284407537f, 0.958703475f, + 0.287347460f, 0.957826413f, + 0.290284677f, 0.956940336f, + 0.293219163f, 0.956045251f, + 0.296150888f, 0.955141168f, + 0.299079826f, 0.954228095f, + 0.302005949f, 0.953306040f, + 0.304929230f, 0.952375013f, + 0.307849640f, 0.951435021f, + 0.310767153f, 0.950486074f, + 0.313681740f, 0.949528181f, + 0.316593376f, 0.948561350f, + 0.319502031f, 0.947585591f, + 0.322407679f, 0.946600913f, + 0.325310292f, 0.945607325f, + 0.328209844f, 0.944604837f, + 0.331106306f, 0.943593458f, + 0.333999651f, 0.942573198f, + 0.336889853f, 0.941544065f, + 0.339776884f, 0.940506071f, + 0.342660717f, 0.939459224f, + 0.345541325f, 0.938403534f, + 0.348418680f, 0.937339012f, + 0.351292756f, 0.936265667f, + 0.354163525f, 0.935183510f, + 0.357030961f, 0.934092550f, + 0.359895037f, 0.932992799f, + 0.362755724f, 0.931884266f, + 0.365612998f, 0.930766961f, + 0.368466830f, 0.929640896f, + 0.371317194f, 0.928506080f, + 0.374164063f, 0.927362526f, + 0.377007410f, 0.926210242f, + 0.379847209f, 0.925049241f, + 0.382683432f, 0.923879533f, + 0.385516054f, 0.922701128f, + 0.388345047f, 0.921514039f, + 0.391170384f, 0.920318277f, + 0.393992040f, 0.919113852f, + 0.396809987f, 0.917900776f, + 0.399624200f, 0.916679060f, + 0.402434651f, 0.915448716f, + 0.405241314f, 0.914209756f, + 0.408044163f, 0.912962190f, + 0.410843171f, 0.911706032f, + 0.413638312f, 0.910441292f, + 0.416429560f, 0.909167983f, + 0.419216888f, 0.907886116f, + 0.422000271f, 0.906595705f, + 0.424779681f, 0.905296759f, + 0.427555093f, 0.903989293f, + 0.430326481f, 0.902673318f, + 0.433093819f, 0.901348847f, + 0.435857080f, 0.900015892f, + 0.438616239f, 0.898674466f, + 0.441371269f, 0.897324581f, + 0.444122145f, 0.895966250f, + 0.446868840f, 0.894599486f, + 0.449611330f, 0.893224301f, + 0.452349587f, 0.891840709f, + 0.455083587f, 0.890448723f, + 0.457813304f, 0.889048356f, + 0.460538711f, 0.887639620f, + 0.463259784f, 0.886222530f, + 0.465976496f, 0.884797098f, + 0.468688822f, 0.883363339f, + 0.471396737f, 0.881921264f, + 0.474100215f, 0.880470889f, + 0.476799230f, 0.879012226f, + 0.479493758f, 0.877545290f, + 0.482183772f, 0.876070094f, + 0.484869248f, 0.874586652f, + 0.487550160f, 0.873094978f, + 0.490226483f, 0.871595087f, + 0.492898192f, 0.870086991f, + 0.495565262f, 0.868570706f, + 0.498227667f, 0.867046246f, + 0.500885383f, 0.865513624f, + 0.503538384f, 0.863972856f, + 0.506186645f, 0.862423956f, + 0.508830143f, 0.860866939f, + 0.511468850f, 0.859301818f, + 0.514102744f, 0.857728610f, + 0.516731799f, 0.856147328f, + 0.519355990f, 0.854557988f, + 0.521975293f, 0.852960605f, + 0.524589683f, 0.851355193f, + 0.527199135f, 0.849741768f, + 0.529803625f, 0.848120345f, + 0.532403128f, 0.846490939f, + 0.534997620f, 0.844853565f, + 0.537587076f, 0.843208240f, + 0.540171473f, 0.841554977f, + 0.542750785f, 0.839893794f, + 0.545324988f, 0.838224706f, + 0.547894059f, 0.836547727f, + 0.550457973f, 0.834862875f, + 0.553016706f, 0.833170165f, + 0.555570233f, 0.831469612f, + 0.558118531f, 0.829761234f, + 0.560661576f, 0.828045045f, + 0.563199344f, 0.826321063f, + 0.565731811f, 0.824589303f, + 0.568258953f, 0.822849781f, + 0.570780746f, 0.821102515f, + 0.573297167f, 0.819347520f, + 0.575808191f, 0.817584813f, + 0.578313796f, 0.815814411f, + 0.580813958f, 0.814036330f, + 0.583308653f, 0.812250587f, + 0.585797857f, 0.810457198f, + 0.588281548f, 0.808656182f, + 0.590759702f, 0.806847554f, + 0.593232295f, 0.805031331f, + 0.595699304f, 0.803207531f, + 0.598160707f, 0.801376172f, + 0.600616479f, 0.799537269f, + 0.603066599f, 0.797690841f, + 0.605511041f, 0.795836905f, + 0.607949785f, 0.793975478f, + 0.610382806f, 0.792106577f, + 0.612810082f, 0.790230221f, + 0.615231591f, 0.788346428f, + 0.617647308f, 0.786455214f, + 0.620057212f, 0.784556597f, + 0.622461279f, 0.782650596f, + 0.624859488f, 0.780737229f, + 0.627251815f, 0.778816512f, + 0.629638239f, 0.776888466f, + 0.632018736f, 0.774953107f, + 0.634393284f, 0.773010453f, + 0.636761861f, 0.771060524f, + 0.639124445f, 0.769103338f, + 0.641481013f, 0.767138912f, + 0.643831543f, 0.765167266f, + 0.646176013f, 0.763188417f, + 0.648514401f, 0.761202385f, + 0.650846685f, 0.759209189f, + 0.653172843f, 0.757208847f, + 0.655492853f, 0.755201377f, + 0.657806693f, 0.753186799f, + 0.660114342f, 0.751165132f, + 0.662415778f, 0.749136395f, + 0.664710978f, 0.747100606f, + 0.666999922f, 0.745057785f, + 0.669282588f, 0.743007952f, + 0.671558955f, 0.740951125f, + 0.673829000f, 0.738887324f, + 0.676092704f, 0.736816569f, + 0.678350043f, 0.734738878f, + 0.680600998f, 0.732654272f, + 0.682845546f, 0.730562769f, + 0.685083668f, 0.728464390f, + 0.687315341f, 0.726359155f, + 0.689540545f, 0.724247083f, + 0.691759258f, 0.722128194f, + 0.693971461f, 0.720002508f, + 0.696177131f, 0.717870045f, + 0.698376249f, 0.715730825f, + 0.700568794f, 0.713584869f, + 0.702754744f, 0.711432196f, + 0.704934080f, 0.709272826f, + 0.707106781f, 0.707106781f, + 0.709272826f, 0.704934080f, + 0.711432196f, 0.702754744f, + 0.713584869f, 0.700568794f, + 0.715730825f, 0.698376249f, + 0.717870045f, 0.696177131f, + 0.720002508f, 0.693971461f, + 0.722128194f, 0.691759258f, + 0.724247083f, 0.689540545f, + 0.726359155f, 0.687315341f, + 0.728464390f, 0.685083668f, + 0.730562769f, 0.682845546f, + 0.732654272f, 0.680600998f, + 0.734738878f, 0.678350043f, + 0.736816569f, 0.676092704f, + 0.738887324f, 0.673829000f, + 0.740951125f, 0.671558955f, + 0.743007952f, 0.669282588f, + 0.745057785f, 0.666999922f, + 0.747100606f, 0.664710978f, + 0.749136395f, 0.662415778f, + 0.751165132f, 0.660114342f, + 0.753186799f, 0.657806693f, + 0.755201377f, 0.655492853f, + 0.757208847f, 0.653172843f, + 0.759209189f, 0.650846685f, + 0.761202385f, 0.648514401f, + 0.763188417f, 0.646176013f, + 0.765167266f, 0.643831543f, + 0.767138912f, 0.641481013f, + 0.769103338f, 0.639124445f, + 0.771060524f, 0.636761861f, + 0.773010453f, 0.634393284f, + 0.774953107f, 0.632018736f, + 0.776888466f, 0.629638239f, + 0.778816512f, 0.627251815f, + 0.780737229f, 0.624859488f, + 0.782650596f, 0.622461279f, + 0.784556597f, 0.620057212f, + 0.786455214f, 0.617647308f, + 0.788346428f, 0.615231591f, + 0.790230221f, 0.612810082f, + 0.792106577f, 0.610382806f, + 0.793975478f, 0.607949785f, + 0.795836905f, 0.605511041f, + 0.797690841f, 0.603066599f, + 0.799537269f, 0.600616479f, + 0.801376172f, 0.598160707f, + 0.803207531f, 0.595699304f, + 0.805031331f, 0.593232295f, + 0.806847554f, 0.590759702f, + 0.808656182f, 0.588281548f, + 0.810457198f, 0.585797857f, + 0.812250587f, 0.583308653f, + 0.814036330f, 0.580813958f, + 0.815814411f, 0.578313796f, + 0.817584813f, 0.575808191f, + 0.819347520f, 0.573297167f, + 0.821102515f, 0.570780746f, + 0.822849781f, 0.568258953f, + 0.824589303f, 0.565731811f, + 0.826321063f, 0.563199344f, + 0.828045045f, 0.560661576f, + 0.829761234f, 0.558118531f, + 0.831469612f, 0.555570233f, + 0.833170165f, 0.553016706f, + 0.834862875f, 0.550457973f, + 0.836547727f, 0.547894059f, + 0.838224706f, 0.545324988f, + 0.839893794f, 0.542750785f, + 0.841554977f, 0.540171473f, + 0.843208240f, 0.537587076f, + 0.844853565f, 0.534997620f, + 0.846490939f, 0.532403128f, + 0.848120345f, 0.529803625f, + 0.849741768f, 0.527199135f, + 0.851355193f, 0.524589683f, + 0.852960605f, 0.521975293f, + 0.854557988f, 0.519355990f, + 0.856147328f, 0.516731799f, + 0.857728610f, 0.514102744f, + 0.859301818f, 0.511468850f, + 0.860866939f, 0.508830143f, + 0.862423956f, 0.506186645f, + 0.863972856f, 0.503538384f, + 0.865513624f, 0.500885383f, + 0.867046246f, 0.498227667f, + 0.868570706f, 0.495565262f, + 0.870086991f, 0.492898192f, + 0.871595087f, 0.490226483f, + 0.873094978f, 0.487550160f, + 0.874586652f, 0.484869248f, + 0.876070094f, 0.482183772f, + 0.877545290f, 0.479493758f, + 0.879012226f, 0.476799230f, + 0.880470889f, 0.474100215f, + 0.881921264f, 0.471396737f, + 0.883363339f, 0.468688822f, + 0.884797098f, 0.465976496f, + 0.886222530f, 0.463259784f, + 0.887639620f, 0.460538711f, + 0.889048356f, 0.457813304f, + 0.890448723f, 0.455083587f, + 0.891840709f, 0.452349587f, + 0.893224301f, 0.449611330f, + 0.894599486f, 0.446868840f, + 0.895966250f, 0.444122145f, + 0.897324581f, 0.441371269f, + 0.898674466f, 0.438616239f, + 0.900015892f, 0.435857080f, + 0.901348847f, 0.433093819f, + 0.902673318f, 0.430326481f, + 0.903989293f, 0.427555093f, + 0.905296759f, 0.424779681f, + 0.906595705f, 0.422000271f, + 0.907886116f, 0.419216888f, + 0.909167983f, 0.416429560f, + 0.910441292f, 0.413638312f, + 0.911706032f, 0.410843171f, + 0.912962190f, 0.408044163f, + 0.914209756f, 0.405241314f, + 0.915448716f, 0.402434651f, + 0.916679060f, 0.399624200f, + 0.917900776f, 0.396809987f, + 0.919113852f, 0.393992040f, + 0.920318277f, 0.391170384f, + 0.921514039f, 0.388345047f, + 0.922701128f, 0.385516054f, + 0.923879533f, 0.382683432f, + 0.925049241f, 0.379847209f, + 0.926210242f, 0.377007410f, + 0.927362526f, 0.374164063f, + 0.928506080f, 0.371317194f, + 0.929640896f, 0.368466830f, + 0.930766961f, 0.365612998f, + 0.931884266f, 0.362755724f, + 0.932992799f, 0.359895037f, + 0.934092550f, 0.357030961f, + 0.935183510f, 0.354163525f, + 0.936265667f, 0.351292756f, + 0.937339012f, 0.348418680f, + 0.938403534f, 0.345541325f, + 0.939459224f, 0.342660717f, + 0.940506071f, 0.339776884f, + 0.941544065f, 0.336889853f, + 0.942573198f, 0.333999651f, + 0.943593458f, 0.331106306f, + 0.944604837f, 0.328209844f, + 0.945607325f, 0.325310292f, + 0.946600913f, 0.322407679f, + 0.947585591f, 0.319502031f, + 0.948561350f, 0.316593376f, + 0.949528181f, 0.313681740f, + 0.950486074f, 0.310767153f, + 0.951435021f, 0.307849640f, + 0.952375013f, 0.304929230f, + 0.953306040f, 0.302005949f, + 0.954228095f, 0.299079826f, + 0.955141168f, 0.296150888f, + 0.956045251f, 0.293219163f, + 0.956940336f, 0.290284677f, + 0.957826413f, 0.287347460f, + 0.958703475f, 0.284407537f, + 0.959571513f, 0.281464938f, + 0.960430519f, 0.278519689f, + 0.961280486f, 0.275571819f, + 0.962121404f, 0.272621355f, + 0.962953267f, 0.269668326f, + 0.963776066f, 0.266712757f, + 0.964589793f, 0.263754679f, + 0.965394442f, 0.260794118f, + 0.966190003f, 0.257831102f, + 0.966976471f, 0.254865660f, + 0.967753837f, 0.251897818f, + 0.968522094f, 0.248927606f, + 0.969281235f, 0.245955050f, + 0.970031253f, 0.242980180f, + 0.970772141f, 0.240003022f, + 0.971503891f, 0.237023606f, + 0.972226497f, 0.234041959f, + 0.972939952f, 0.231058108f, + 0.973644250f, 0.228072083f, + 0.974339383f, 0.225083911f, + 0.975025345f, 0.222093621f, + 0.975702130f, 0.219101240f, + 0.976369731f, 0.216106797f, + 0.977028143f, 0.213110320f, + 0.977677358f, 0.210111837f, + 0.978317371f, 0.207111376f, + 0.978948175f, 0.204108966f, + 0.979569766f, 0.201104635f, + 0.980182136f, 0.198098411f, + 0.980785280f, 0.195090322f, + 0.981379193f, 0.192080397f, + 0.981963869f, 0.189068664f, + 0.982539302f, 0.186055152f, + 0.983105487f, 0.183039888f, + 0.983662419f, 0.180022901f, + 0.984210092f, 0.177004220f, + 0.984748502f, 0.173983873f, + 0.985277642f, 0.170961889f, + 0.985797509f, 0.167938295f, + 0.986308097f, 0.164913120f, + 0.986809402f, 0.161886394f, + 0.987301418f, 0.158858143f, + 0.987784142f, 0.155828398f, + 0.988257568f, 0.152797185f, + 0.988721692f, 0.149764535f, + 0.989176510f, 0.146730474f, + 0.989622017f, 0.143695033f, + 0.990058210f, 0.140658239f, + 0.990485084f, 0.137620122f, + 0.990902635f, 0.134580709f, + 0.991310860f, 0.131540029f, + 0.991709754f, 0.128498111f, + 0.992099313f, 0.125454983f, + 0.992479535f, 0.122410675f, + 0.992850414f, 0.119365215f, + 0.993211949f, 0.116318631f, + 0.993564136f, 0.113270952f, + 0.993906970f, 0.110222207f, + 0.994240449f, 0.107172425f, + 0.994564571f, 0.104121634f, + 0.994879331f, 0.101069863f, + 0.995184727f, 0.098017140f, + 0.995480755f, 0.094963495f, + 0.995767414f, 0.091908956f, + 0.996044701f, 0.088853553f, + 0.996312612f, 0.085797312f, + 0.996571146f, 0.082740265f, + 0.996820299f, 0.079682438f, + 0.997060070f, 0.076623861f, + 0.997290457f, 0.073564564f, + 0.997511456f, 0.070504573f, + 0.997723067f, 0.067443920f, + 0.997925286f, 0.064382631f, + 0.998118113f, 0.061320736f, + 0.998301545f, 0.058258265f, + 0.998475581f, 0.055195244f, + 0.998640218f, 0.052131705f, + 0.998795456f, 0.049067674f, + 0.998941293f, 0.046003182f, + 0.999077728f, 0.042938257f, + 0.999204759f, 0.039872928f, + 0.999322385f, 0.036807223f, + 0.999430605f, 0.033741172f, + 0.999529418f, 0.030674803f, + 0.999618822f, 0.027608146f, + 0.999698819f, 0.024541229f, + 0.999769405f, 0.021474080f, + 0.999830582f, 0.018406730f, + 0.999882347f, 0.015339206f, + 0.999924702f, 0.012271538f, + 0.999957645f, 0.009203755f, + 0.999981175f, 0.006135885f, + 0.999995294f, 0.003067957f, + 1.000000000f, 0.000000000f, + 0.999995294f, -0.003067957f, + 0.999981175f, -0.006135885f, + 0.999957645f, -0.009203755f, + 0.999924702f, -0.012271538f, + 0.999882347f, -0.015339206f, + 0.999830582f, -0.018406730f, + 0.999769405f, -0.021474080f, + 0.999698819f, -0.024541229f, + 0.999618822f, -0.027608146f, + 0.999529418f, -0.030674803f, + 0.999430605f, -0.033741172f, + 0.999322385f, -0.036807223f, + 0.999204759f, -0.039872928f, + 0.999077728f, -0.042938257f, + 0.998941293f, -0.046003182f, + 0.998795456f, -0.049067674f, + 0.998640218f, -0.052131705f, + 0.998475581f, -0.055195244f, + 0.998301545f, -0.058258265f, + 0.998118113f, -0.061320736f, + 0.997925286f, -0.064382631f, + 0.997723067f, -0.067443920f, + 0.997511456f, -0.070504573f, + 0.997290457f, -0.073564564f, + 0.997060070f, -0.076623861f, + 0.996820299f, -0.079682438f, + 0.996571146f, -0.082740265f, + 0.996312612f, -0.085797312f, + 0.996044701f, -0.088853553f, + 0.995767414f, -0.091908956f, + 0.995480755f, -0.094963495f, + 0.995184727f, -0.098017140f, + 0.994879331f, -0.101069863f, + 0.994564571f, -0.104121634f, + 0.994240449f, -0.107172425f, + 0.993906970f, -0.110222207f, + 0.993564136f, -0.113270952f, + 0.993211949f, -0.116318631f, + 0.992850414f, -0.119365215f, + 0.992479535f, -0.122410675f, + 0.992099313f, -0.125454983f, + 0.991709754f, -0.128498111f, + 0.991310860f, -0.131540029f, + 0.990902635f, -0.134580709f, + 0.990485084f, -0.137620122f, + 0.990058210f, -0.140658239f, + 0.989622017f, -0.143695033f, + 0.989176510f, -0.146730474f, + 0.988721692f, -0.149764535f, + 0.988257568f, -0.152797185f, + 0.987784142f, -0.155828398f, + 0.987301418f, -0.158858143f, + 0.986809402f, -0.161886394f, + 0.986308097f, -0.164913120f, + 0.985797509f, -0.167938295f, + 0.985277642f, -0.170961889f, + 0.984748502f, -0.173983873f, + 0.984210092f, -0.177004220f, + 0.983662419f, -0.180022901f, + 0.983105487f, -0.183039888f, + 0.982539302f, -0.186055152f, + 0.981963869f, -0.189068664f, + 0.981379193f, -0.192080397f, + 0.980785280f, -0.195090322f, + 0.980182136f, -0.198098411f, + 0.979569766f, -0.201104635f, + 0.978948175f, -0.204108966f, + 0.978317371f, -0.207111376f, + 0.977677358f, -0.210111837f, + 0.977028143f, -0.213110320f, + 0.976369731f, -0.216106797f, + 0.975702130f, -0.219101240f, + 0.975025345f, -0.222093621f, + 0.974339383f, -0.225083911f, + 0.973644250f, -0.228072083f, + 0.972939952f, -0.231058108f, + 0.972226497f, -0.234041959f, + 0.971503891f, -0.237023606f, + 0.970772141f, -0.240003022f, + 0.970031253f, -0.242980180f, + 0.969281235f, -0.245955050f, + 0.968522094f, -0.248927606f, + 0.967753837f, -0.251897818f, + 0.966976471f, -0.254865660f, + 0.966190003f, -0.257831102f, + 0.965394442f, -0.260794118f, + 0.964589793f, -0.263754679f, + 0.963776066f, -0.266712757f, + 0.962953267f, -0.269668326f, + 0.962121404f, -0.272621355f, + 0.961280486f, -0.275571819f, + 0.960430519f, -0.278519689f, + 0.959571513f, -0.281464938f, + 0.958703475f, -0.284407537f, + 0.957826413f, -0.287347460f, + 0.956940336f, -0.290284677f, + 0.956045251f, -0.293219163f, + 0.955141168f, -0.296150888f, + 0.954228095f, -0.299079826f, + 0.953306040f, -0.302005949f, + 0.952375013f, -0.304929230f, + 0.951435021f, -0.307849640f, + 0.950486074f, -0.310767153f, + 0.949528181f, -0.313681740f, + 0.948561350f, -0.316593376f, + 0.947585591f, -0.319502031f, + 0.946600913f, -0.322407679f, + 0.945607325f, -0.325310292f, + 0.944604837f, -0.328209844f, + 0.943593458f, -0.331106306f, + 0.942573198f, -0.333999651f, + 0.941544065f, -0.336889853f, + 0.940506071f, -0.339776884f, + 0.939459224f, -0.342660717f, + 0.938403534f, -0.345541325f, + 0.937339012f, -0.348418680f, + 0.936265667f, -0.351292756f, + 0.935183510f, -0.354163525f, + 0.934092550f, -0.357030961f, + 0.932992799f, -0.359895037f, + 0.931884266f, -0.362755724f, + 0.930766961f, -0.365612998f, + 0.929640896f, -0.368466830f, + 0.928506080f, -0.371317194f, + 0.927362526f, -0.374164063f, + 0.926210242f, -0.377007410f, + 0.925049241f, -0.379847209f, + 0.923879533f, -0.382683432f, + 0.922701128f, -0.385516054f, + 0.921514039f, -0.388345047f, + 0.920318277f, -0.391170384f, + 0.919113852f, -0.393992040f, + 0.917900776f, -0.396809987f, + 0.916679060f, -0.399624200f, + 0.915448716f, -0.402434651f, + 0.914209756f, -0.405241314f, + 0.912962190f, -0.408044163f, + 0.911706032f, -0.410843171f, + 0.910441292f, -0.413638312f, + 0.909167983f, -0.416429560f, + 0.907886116f, -0.419216888f, + 0.906595705f, -0.422000271f, + 0.905296759f, -0.424779681f, + 0.903989293f, -0.427555093f, + 0.902673318f, -0.430326481f, + 0.901348847f, -0.433093819f, + 0.900015892f, -0.435857080f, + 0.898674466f, -0.438616239f, + 0.897324581f, -0.441371269f, + 0.895966250f, -0.444122145f, + 0.894599486f, -0.446868840f, + 0.893224301f, -0.449611330f, + 0.891840709f, -0.452349587f, + 0.890448723f, -0.455083587f, + 0.889048356f, -0.457813304f, + 0.887639620f, -0.460538711f, + 0.886222530f, -0.463259784f, + 0.884797098f, -0.465976496f, + 0.883363339f, -0.468688822f, + 0.881921264f, -0.471396737f, + 0.880470889f, -0.474100215f, + 0.879012226f, -0.476799230f, + 0.877545290f, -0.479493758f, + 0.876070094f, -0.482183772f, + 0.874586652f, -0.484869248f, + 0.873094978f, -0.487550160f, + 0.871595087f, -0.490226483f, + 0.870086991f, -0.492898192f, + 0.868570706f, -0.495565262f, + 0.867046246f, -0.498227667f, + 0.865513624f, -0.500885383f, + 0.863972856f, -0.503538384f, + 0.862423956f, -0.506186645f, + 0.860866939f, -0.508830143f, + 0.859301818f, -0.511468850f, + 0.857728610f, -0.514102744f, + 0.856147328f, -0.516731799f, + 0.854557988f, -0.519355990f, + 0.852960605f, -0.521975293f, + 0.851355193f, -0.524589683f, + 0.849741768f, -0.527199135f, + 0.848120345f, -0.529803625f, + 0.846490939f, -0.532403128f, + 0.844853565f, -0.534997620f, + 0.843208240f, -0.537587076f, + 0.841554977f, -0.540171473f, + 0.839893794f, -0.542750785f, + 0.838224706f, -0.545324988f, + 0.836547727f, -0.547894059f, + 0.834862875f, -0.550457973f, + 0.833170165f, -0.553016706f, + 0.831469612f, -0.555570233f, + 0.829761234f, -0.558118531f, + 0.828045045f, -0.560661576f, + 0.826321063f, -0.563199344f, + 0.824589303f, -0.565731811f, + 0.822849781f, -0.568258953f, + 0.821102515f, -0.570780746f, + 0.819347520f, -0.573297167f, + 0.817584813f, -0.575808191f, + 0.815814411f, -0.578313796f, + 0.814036330f, -0.580813958f, + 0.812250587f, -0.583308653f, + 0.810457198f, -0.585797857f, + 0.808656182f, -0.588281548f, + 0.806847554f, -0.590759702f, + 0.805031331f, -0.593232295f, + 0.803207531f, -0.595699304f, + 0.801376172f, -0.598160707f, + 0.799537269f, -0.600616479f, + 0.797690841f, -0.603066599f, + 0.795836905f, -0.605511041f, + 0.793975478f, -0.607949785f, + 0.792106577f, -0.610382806f, + 0.790230221f, -0.612810082f, + 0.788346428f, -0.615231591f, + 0.786455214f, -0.617647308f, + 0.784556597f, -0.620057212f, + 0.782650596f, -0.622461279f, + 0.780737229f, -0.624859488f, + 0.778816512f, -0.627251815f, + 0.776888466f, -0.629638239f, + 0.774953107f, -0.632018736f, + 0.773010453f, -0.634393284f, + 0.771060524f, -0.636761861f, + 0.769103338f, -0.639124445f, + 0.767138912f, -0.641481013f, + 0.765167266f, -0.643831543f, + 0.763188417f, -0.646176013f, + 0.761202385f, -0.648514401f, + 0.759209189f, -0.650846685f, + 0.757208847f, -0.653172843f, + 0.755201377f, -0.655492853f, + 0.753186799f, -0.657806693f, + 0.751165132f, -0.660114342f, + 0.749136395f, -0.662415778f, + 0.747100606f, -0.664710978f, + 0.745057785f, -0.666999922f, + 0.743007952f, -0.669282588f, + 0.740951125f, -0.671558955f, + 0.738887324f, -0.673829000f, + 0.736816569f, -0.676092704f, + 0.734738878f, -0.678350043f, + 0.732654272f, -0.680600998f, + 0.730562769f, -0.682845546f, + 0.728464390f, -0.685083668f, + 0.726359155f, -0.687315341f, + 0.724247083f, -0.689540545f, + 0.722128194f, -0.691759258f, + 0.720002508f, -0.693971461f, + 0.717870045f, -0.696177131f, + 0.715730825f, -0.698376249f, + 0.713584869f, -0.700568794f, + 0.711432196f, -0.702754744f, + 0.709272826f, -0.704934080f, + 0.707106781f, -0.707106781f, + 0.704934080f, -0.709272826f, + 0.702754744f, -0.711432196f, + 0.700568794f, -0.713584869f, + 0.698376249f, -0.715730825f, + 0.696177131f, -0.717870045f, + 0.693971461f, -0.720002508f, + 0.691759258f, -0.722128194f, + 0.689540545f, -0.724247083f, + 0.687315341f, -0.726359155f, + 0.685083668f, -0.728464390f, + 0.682845546f, -0.730562769f, + 0.680600998f, -0.732654272f, + 0.678350043f, -0.734738878f, + 0.676092704f, -0.736816569f, + 0.673829000f, -0.738887324f, + 0.671558955f, -0.740951125f, + 0.669282588f, -0.743007952f, + 0.666999922f, -0.745057785f, + 0.664710978f, -0.747100606f, + 0.662415778f, -0.749136395f, + 0.660114342f, -0.751165132f, + 0.657806693f, -0.753186799f, + 0.655492853f, -0.755201377f, + 0.653172843f, -0.757208847f, + 0.650846685f, -0.759209189f, + 0.648514401f, -0.761202385f, + 0.646176013f, -0.763188417f, + 0.643831543f, -0.765167266f, + 0.641481013f, -0.767138912f, + 0.639124445f, -0.769103338f, + 0.636761861f, -0.771060524f, + 0.634393284f, -0.773010453f, + 0.632018736f, -0.774953107f, + 0.629638239f, -0.776888466f, + 0.627251815f, -0.778816512f, + 0.624859488f, -0.780737229f, + 0.622461279f, -0.782650596f, + 0.620057212f, -0.784556597f, + 0.617647308f, -0.786455214f, + 0.615231591f, -0.788346428f, + 0.612810082f, -0.790230221f, + 0.610382806f, -0.792106577f, + 0.607949785f, -0.793975478f, + 0.605511041f, -0.795836905f, + 0.603066599f, -0.797690841f, + 0.600616479f, -0.799537269f, + 0.598160707f, -0.801376172f, + 0.595699304f, -0.803207531f, + 0.593232295f, -0.805031331f, + 0.590759702f, -0.806847554f, + 0.588281548f, -0.808656182f, + 0.585797857f, -0.810457198f, + 0.583308653f, -0.812250587f, + 0.580813958f, -0.814036330f, + 0.578313796f, -0.815814411f, + 0.575808191f, -0.817584813f, + 0.573297167f, -0.819347520f, + 0.570780746f, -0.821102515f, + 0.568258953f, -0.822849781f, + 0.565731811f, -0.824589303f, + 0.563199344f, -0.826321063f, + 0.560661576f, -0.828045045f, + 0.558118531f, -0.829761234f, + 0.555570233f, -0.831469612f, + 0.553016706f, -0.833170165f, + 0.550457973f, -0.834862875f, + 0.547894059f, -0.836547727f, + 0.545324988f, -0.838224706f, + 0.542750785f, -0.839893794f, + 0.540171473f, -0.841554977f, + 0.537587076f, -0.843208240f, + 0.534997620f, -0.844853565f, + 0.532403128f, -0.846490939f, + 0.529803625f, -0.848120345f, + 0.527199135f, -0.849741768f, + 0.524589683f, -0.851355193f, + 0.521975293f, -0.852960605f, + 0.519355990f, -0.854557988f, + 0.516731799f, -0.856147328f, + 0.514102744f, -0.857728610f, + 0.511468850f, -0.859301818f, + 0.508830143f, -0.860866939f, + 0.506186645f, -0.862423956f, + 0.503538384f, -0.863972856f, + 0.500885383f, -0.865513624f, + 0.498227667f, -0.867046246f, + 0.495565262f, -0.868570706f, + 0.492898192f, -0.870086991f, + 0.490226483f, -0.871595087f, + 0.487550160f, -0.873094978f, + 0.484869248f, -0.874586652f, + 0.482183772f, -0.876070094f, + 0.479493758f, -0.877545290f, + 0.476799230f, -0.879012226f, + 0.474100215f, -0.880470889f, + 0.471396737f, -0.881921264f, + 0.468688822f, -0.883363339f, + 0.465976496f, -0.884797098f, + 0.463259784f, -0.886222530f, + 0.460538711f, -0.887639620f, + 0.457813304f, -0.889048356f, + 0.455083587f, -0.890448723f, + 0.452349587f, -0.891840709f, + 0.449611330f, -0.893224301f, + 0.446868840f, -0.894599486f, + 0.444122145f, -0.895966250f, + 0.441371269f, -0.897324581f, + 0.438616239f, -0.898674466f, + 0.435857080f, -0.900015892f, + 0.433093819f, -0.901348847f, + 0.430326481f, -0.902673318f, + 0.427555093f, -0.903989293f, + 0.424779681f, -0.905296759f, + 0.422000271f, -0.906595705f, + 0.419216888f, -0.907886116f, + 0.416429560f, -0.909167983f, + 0.413638312f, -0.910441292f, + 0.410843171f, -0.911706032f, + 0.408044163f, -0.912962190f, + 0.405241314f, -0.914209756f, + 0.402434651f, -0.915448716f, + 0.399624200f, -0.916679060f, + 0.396809987f, -0.917900776f, + 0.393992040f, -0.919113852f, + 0.391170384f, -0.920318277f, + 0.388345047f, -0.921514039f, + 0.385516054f, -0.922701128f, + 0.382683432f, -0.923879533f, + 0.379847209f, -0.925049241f, + 0.377007410f, -0.926210242f, + 0.374164063f, -0.927362526f, + 0.371317194f, -0.928506080f, + 0.368466830f, -0.929640896f, + 0.365612998f, -0.930766961f, + 0.362755724f, -0.931884266f, + 0.359895037f, -0.932992799f, + 0.357030961f, -0.934092550f, + 0.354163525f, -0.935183510f, + 0.351292756f, -0.936265667f, + 0.348418680f, -0.937339012f, + 0.345541325f, -0.938403534f, + 0.342660717f, -0.939459224f, + 0.339776884f, -0.940506071f, + 0.336889853f, -0.941544065f, + 0.333999651f, -0.942573198f, + 0.331106306f, -0.943593458f, + 0.328209844f, -0.944604837f, + 0.325310292f, -0.945607325f, + 0.322407679f, -0.946600913f, + 0.319502031f, -0.947585591f, + 0.316593376f, -0.948561350f, + 0.313681740f, -0.949528181f, + 0.310767153f, -0.950486074f, + 0.307849640f, -0.951435021f, + 0.304929230f, -0.952375013f, + 0.302005949f, -0.953306040f, + 0.299079826f, -0.954228095f, + 0.296150888f, -0.955141168f, + 0.293219163f, -0.956045251f, + 0.290284677f, -0.956940336f, + 0.287347460f, -0.957826413f, + 0.284407537f, -0.958703475f, + 0.281464938f, -0.959571513f, + 0.278519689f, -0.960430519f, + 0.275571819f, -0.961280486f, + 0.272621355f, -0.962121404f, + 0.269668326f, -0.962953267f, + 0.266712757f, -0.963776066f, + 0.263754679f, -0.964589793f, + 0.260794118f, -0.965394442f, + 0.257831102f, -0.966190003f, + 0.254865660f, -0.966976471f, + 0.251897818f, -0.967753837f, + 0.248927606f, -0.968522094f, + 0.245955050f, -0.969281235f, + 0.242980180f, -0.970031253f, + 0.240003022f, -0.970772141f, + 0.237023606f, -0.971503891f, + 0.234041959f, -0.972226497f, + 0.231058108f, -0.972939952f, + 0.228072083f, -0.973644250f, + 0.225083911f, -0.974339383f, + 0.222093621f, -0.975025345f, + 0.219101240f, -0.975702130f, + 0.216106797f, -0.976369731f, + 0.213110320f, -0.977028143f, + 0.210111837f, -0.977677358f, + 0.207111376f, -0.978317371f, + 0.204108966f, -0.978948175f, + 0.201104635f, -0.979569766f, + 0.198098411f, -0.980182136f, + 0.195090322f, -0.980785280f, + 0.192080397f, -0.981379193f, + 0.189068664f, -0.981963869f, + 0.186055152f, -0.982539302f, + 0.183039888f, -0.983105487f, + 0.180022901f, -0.983662419f, + 0.177004220f, -0.984210092f, + 0.173983873f, -0.984748502f, + 0.170961889f, -0.985277642f, + 0.167938295f, -0.985797509f, + 0.164913120f, -0.986308097f, + 0.161886394f, -0.986809402f, + 0.158858143f, -0.987301418f, + 0.155828398f, -0.987784142f, + 0.152797185f, -0.988257568f, + 0.149764535f, -0.988721692f, + 0.146730474f, -0.989176510f, + 0.143695033f, -0.989622017f, + 0.140658239f, -0.990058210f, + 0.137620122f, -0.990485084f, + 0.134580709f, -0.990902635f, + 0.131540029f, -0.991310860f, + 0.128498111f, -0.991709754f, + 0.125454983f, -0.992099313f, + 0.122410675f, -0.992479535f, + 0.119365215f, -0.992850414f, + 0.116318631f, -0.993211949f, + 0.113270952f, -0.993564136f, + 0.110222207f, -0.993906970f, + 0.107172425f, -0.994240449f, + 0.104121634f, -0.994564571f, + 0.101069863f, -0.994879331f, + 0.098017140f, -0.995184727f, + 0.094963495f, -0.995480755f, + 0.091908956f, -0.995767414f, + 0.088853553f, -0.996044701f, + 0.085797312f, -0.996312612f, + 0.082740265f, -0.996571146f, + 0.079682438f, -0.996820299f, + 0.076623861f, -0.997060070f, + 0.073564564f, -0.997290457f, + 0.070504573f, -0.997511456f, + 0.067443920f, -0.997723067f, + 0.064382631f, -0.997925286f, + 0.061320736f, -0.998118113f, + 0.058258265f, -0.998301545f, + 0.055195244f, -0.998475581f, + 0.052131705f, -0.998640218f, + 0.049067674f, -0.998795456f, + 0.046003182f, -0.998941293f, + 0.042938257f, -0.999077728f, + 0.039872928f, -0.999204759f, + 0.036807223f, -0.999322385f, + 0.033741172f, -0.999430605f, + 0.030674803f, -0.999529418f, + 0.027608146f, -0.999618822f, + 0.024541229f, -0.999698819f, + 0.021474080f, -0.999769405f, + 0.018406730f, -0.999830582f, + 0.015339206f, -0.999882347f, + 0.012271538f, -0.999924702f, + 0.009203755f, -0.999957645f, + 0.006135885f, -0.999981175f, + 0.003067957f, -0.999995294f +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096) +const float32_t twiddleCoef_rfft_4096[4096] = { + 0.000000000f, 1.000000000f, + 0.001533980f, 0.999998823f, + 0.003067957f, 0.999995294f, + 0.004601926f, 0.999989411f, + 0.006135885f, 0.999981175f, + 0.007669829f, 0.999970586f, + 0.009203755f, 0.999957645f, + 0.010737659f, 0.999942350f, + 0.012271538f, 0.999924702f, + 0.013805389f, 0.999904701f, + 0.015339206f, 0.999882347f, + 0.016872988f, 0.999857641f, + 0.018406730f, 0.999830582f, + 0.019940429f, 0.999801170f, + 0.021474080f, 0.999769405f, + 0.023007681f, 0.999735288f, + 0.024541229f, 0.999698819f, + 0.026074718f, 0.999659997f, + 0.027608146f, 0.999618822f, + 0.029141509f, 0.999575296f, + 0.030674803f, 0.999529418f, + 0.032208025f, 0.999481187f, + 0.033741172f, 0.999430605f, + 0.035274239f, 0.999377670f, + 0.036807223f, 0.999322385f, + 0.038340120f, 0.999264747f, + 0.039872928f, 0.999204759f, + 0.041405641f, 0.999142419f, + 0.042938257f, 0.999077728f, + 0.044470772f, 0.999010686f, + 0.046003182f, 0.998941293f, + 0.047535484f, 0.998869550f, + 0.049067674f, 0.998795456f, + 0.050599749f, 0.998719012f, + 0.052131705f, 0.998640218f, + 0.053663538f, 0.998559074f, + 0.055195244f, 0.998475581f, + 0.056726821f, 0.998389737f, + 0.058258265f, 0.998301545f, + 0.059789571f, 0.998211003f, + 0.061320736f, 0.998118113f, + 0.062851758f, 0.998022874f, + 0.064382631f, 0.997925286f, + 0.065913353f, 0.997825350f, + 0.067443920f, 0.997723067f, + 0.068974328f, 0.997618435f, + 0.070504573f, 0.997511456f, + 0.072034653f, 0.997402130f, + 0.073564564f, 0.997290457f, + 0.075094301f, 0.997176437f, + 0.076623861f, 0.997060070f, + 0.078153242f, 0.996941358f, + 0.079682438f, 0.996820299f, + 0.081211447f, 0.996696895f, + 0.082740265f, 0.996571146f, + 0.084268888f, 0.996443051f, + 0.085797312f, 0.996312612f, + 0.087325535f, 0.996179829f, + 0.088853553f, 0.996044701f, + 0.090381361f, 0.995907229f, + 0.091908956f, 0.995767414f, + 0.093436336f, 0.995625256f, + 0.094963495f, 0.995480755f, + 0.096490431f, 0.995333912f, + 0.098017140f, 0.995184727f, + 0.099543619f, 0.995033199f, + 0.101069863f, 0.994879331f, + 0.102595869f, 0.994723121f, + 0.104121634f, 0.994564571f, + 0.105647154f, 0.994403680f, + 0.107172425f, 0.994240449f, + 0.108697444f, 0.994074879f, + 0.110222207f, 0.993906970f, + 0.111746711f, 0.993736722f, + 0.113270952f, 0.993564136f, + 0.114794927f, 0.993389211f, + 0.116318631f, 0.993211949f, + 0.117842062f, 0.993032350f, + 0.119365215f, 0.992850414f, + 0.120888087f, 0.992666142f, + 0.122410675f, 0.992479535f, + 0.123932975f, 0.992290591f, + 0.125454983f, 0.992099313f, + 0.126976696f, 0.991905700f, + 0.128498111f, 0.991709754f, + 0.130019223f, 0.991511473f, + 0.131540029f, 0.991310860f, + 0.133060525f, 0.991107914f, + 0.134580709f, 0.990902635f, + 0.136100575f, 0.990695025f, + 0.137620122f, 0.990485084f, + 0.139139344f, 0.990272812f, + 0.140658239f, 0.990058210f, + 0.142176804f, 0.989841278f, + 0.143695033f, 0.989622017f, + 0.145212925f, 0.989400428f, + 0.146730474f, 0.989176510f, + 0.148247679f, 0.988950265f, + 0.149764535f, 0.988721692f, + 0.151281038f, 0.988490793f, + 0.152797185f, 0.988257568f, + 0.154312973f, 0.988022017f, + 0.155828398f, 0.987784142f, + 0.157343456f, 0.987543942f, + 0.158858143f, 0.987301418f, + 0.160372457f, 0.987056571f, + 0.161886394f, 0.986809402f, + 0.163399949f, 0.986559910f, + 0.164913120f, 0.986308097f, + 0.166425904f, 0.986053963f, + 0.167938295f, 0.985797509f, + 0.169450291f, 0.985538735f, + 0.170961889f, 0.985277642f, + 0.172473084f, 0.985014231f, + 0.173983873f, 0.984748502f, + 0.175494253f, 0.984480455f, + 0.177004220f, 0.984210092f, + 0.178513771f, 0.983937413f, + 0.180022901f, 0.983662419f, + 0.181531608f, 0.983385110f, + 0.183039888f, 0.983105487f, + 0.184547737f, 0.982823551f, + 0.186055152f, 0.982539302f, + 0.187562129f, 0.982252741f, + 0.189068664f, 0.981963869f, + 0.190574755f, 0.981672686f, + 0.192080397f, 0.981379193f, + 0.193585587f, 0.981083391f, + 0.195090322f, 0.980785280f, + 0.196594598f, 0.980484862f, + 0.198098411f, 0.980182136f, + 0.199601758f, 0.979877104f, + 0.201104635f, 0.979569766f, + 0.202607039f, 0.979260123f, + 0.204108966f, 0.978948175f, + 0.205610413f, 0.978633924f, + 0.207111376f, 0.978317371f, + 0.208611852f, 0.977998515f, + 0.210111837f, 0.977677358f, + 0.211611327f, 0.977353900f, + 0.213110320f, 0.977028143f, + 0.214608811f, 0.976700086f, + 0.216106797f, 0.976369731f, + 0.217604275f, 0.976037079f, + 0.219101240f, 0.975702130f, + 0.220597690f, 0.975364885f, + 0.222093621f, 0.975025345f, + 0.223589029f, 0.974683511f, + 0.225083911f, 0.974339383f, + 0.226578264f, 0.973992962f, + 0.228072083f, 0.973644250f, + 0.229565366f, 0.973293246f, + 0.231058108f, 0.972939952f, + 0.232550307f, 0.972584369f, + 0.234041959f, 0.972226497f, + 0.235533059f, 0.971866337f, + 0.237023606f, 0.971503891f, + 0.238513595f, 0.971139158f, + 0.240003022f, 0.970772141f, + 0.241491885f, 0.970402839f, + 0.242980180f, 0.970031253f, + 0.244467903f, 0.969657385f, + 0.245955050f, 0.969281235f, + 0.247441619f, 0.968902805f, + 0.248927606f, 0.968522094f, + 0.250413007f, 0.968139105f, + 0.251897818f, 0.967753837f, + 0.253382037f, 0.967366292f, + 0.254865660f, 0.966976471f, + 0.256348682f, 0.966584374f, + 0.257831102f, 0.966190003f, + 0.259312915f, 0.965793359f, + 0.260794118f, 0.965394442f, + 0.262274707f, 0.964993253f, + 0.263754679f, 0.964589793f, + 0.265234030f, 0.964184064f, + 0.266712757f, 0.963776066f, + 0.268190857f, 0.963365800f, + 0.269668326f, 0.962953267f, + 0.271145160f, 0.962538468f, + 0.272621355f, 0.962121404f, + 0.274096910f, 0.961702077f, + 0.275571819f, 0.961280486f, + 0.277046080f, 0.960856633f, + 0.278519689f, 0.960430519f, + 0.279992643f, 0.960002146f, + 0.281464938f, 0.959571513f, + 0.282936570f, 0.959138622f, + 0.284407537f, 0.958703475f, + 0.285877835f, 0.958266071f, + 0.287347460f, 0.957826413f, + 0.288816408f, 0.957384501f, + 0.290284677f, 0.956940336f, + 0.291752263f, 0.956493919f, + 0.293219163f, 0.956045251f, + 0.294685372f, 0.955594334f, + 0.296150888f, 0.955141168f, + 0.297615707f, 0.954685755f, + 0.299079826f, 0.954228095f, + 0.300543241f, 0.953768190f, + 0.302005949f, 0.953306040f, + 0.303467947f, 0.952841648f, + 0.304929230f, 0.952375013f, + 0.306389795f, 0.951906137f, + 0.307849640f, 0.951435021f, + 0.309308760f, 0.950961666f, + 0.310767153f, 0.950486074f, + 0.312224814f, 0.950008245f, + 0.313681740f, 0.949528181f, + 0.315137929f, 0.949045882f, + 0.316593376f, 0.948561350f, + 0.318048077f, 0.948074586f, + 0.319502031f, 0.947585591f, + 0.320955232f, 0.947094366f, + 0.322407679f, 0.946600913f, + 0.323859367f, 0.946105232f, + 0.325310292f, 0.945607325f, + 0.326760452f, 0.945107193f, + 0.328209844f, 0.944604837f, + 0.329658463f, 0.944100258f, + 0.331106306f, 0.943593458f, + 0.332553370f, 0.943084437f, + 0.333999651f, 0.942573198f, + 0.335445147f, 0.942059740f, + 0.336889853f, 0.941544065f, + 0.338333767f, 0.941026175f, + 0.339776884f, 0.940506071f, + 0.341219202f, 0.939983753f, + 0.342660717f, 0.939459224f, + 0.344101426f, 0.938932484f, + 0.345541325f, 0.938403534f, + 0.346980411f, 0.937872376f, + 0.348418680f, 0.937339012f, + 0.349856130f, 0.936803442f, + 0.351292756f, 0.936265667f, + 0.352728556f, 0.935725689f, + 0.354163525f, 0.935183510f, + 0.355597662f, 0.934639130f, + 0.357030961f, 0.934092550f, + 0.358463421f, 0.933543773f, + 0.359895037f, 0.932992799f, + 0.361325806f, 0.932439629f, + 0.362755724f, 0.931884266f, + 0.364184790f, 0.931326709f, + 0.365612998f, 0.930766961f, + 0.367040346f, 0.930205023f, + 0.368466830f, 0.929640896f, + 0.369892447f, 0.929074581f, + 0.371317194f, 0.928506080f, + 0.372741067f, 0.927935395f, + 0.374164063f, 0.927362526f, + 0.375586178f, 0.926787474f, + 0.377007410f, 0.926210242f, + 0.378427755f, 0.925630831f, + 0.379847209f, 0.925049241f, + 0.381265769f, 0.924465474f, + 0.382683432f, 0.923879533f, + 0.384100195f, 0.923291417f, + 0.385516054f, 0.922701128f, + 0.386931006f, 0.922108669f, + 0.388345047f, 0.921514039f, + 0.389758174f, 0.920917242f, + 0.391170384f, 0.920318277f, + 0.392581674f, 0.919717146f, + 0.393992040f, 0.919113852f, + 0.395401479f, 0.918508394f, + 0.396809987f, 0.917900776f, + 0.398217562f, 0.917290997f, + 0.399624200f, 0.916679060f, + 0.401029897f, 0.916064966f, + 0.402434651f, 0.915448716f, + 0.403838458f, 0.914830312f, + 0.405241314f, 0.914209756f, + 0.406643217f, 0.913587048f, + 0.408044163f, 0.912962190f, + 0.409444149f, 0.912335185f, + 0.410843171f, 0.911706032f, + 0.412241227f, 0.911074734f, + 0.413638312f, 0.910441292f, + 0.415034424f, 0.909805708f, + 0.416429560f, 0.909167983f, + 0.417823716f, 0.908528119f, + 0.419216888f, 0.907886116f, + 0.420609074f, 0.907241978f, + 0.422000271f, 0.906595705f, + 0.423390474f, 0.905947298f, + 0.424779681f, 0.905296759f, + 0.426167889f, 0.904644091f, + 0.427555093f, 0.903989293f, + 0.428941292f, 0.903332368f, + 0.430326481f, 0.902673318f, + 0.431710658f, 0.902012144f, + 0.433093819f, 0.901348847f, + 0.434475961f, 0.900683429f, + 0.435857080f, 0.900015892f, + 0.437237174f, 0.899346237f, + 0.438616239f, 0.898674466f, + 0.439994271f, 0.898000580f, + 0.441371269f, 0.897324581f, + 0.442747228f, 0.896646470f, + 0.444122145f, 0.895966250f, + 0.445496017f, 0.895283921f, + 0.446868840f, 0.894599486f, + 0.448240612f, 0.893912945f, + 0.449611330f, 0.893224301f, + 0.450980989f, 0.892533555f, + 0.452349587f, 0.891840709f, + 0.453717121f, 0.891145765f, + 0.455083587f, 0.890448723f, + 0.456448982f, 0.889749586f, + 0.457813304f, 0.889048356f, + 0.459176548f, 0.888345033f, + 0.460538711f, 0.887639620f, + 0.461899791f, 0.886932119f, + 0.463259784f, 0.886222530f, + 0.464618686f, 0.885510856f, + 0.465976496f, 0.884797098f, + 0.467333209f, 0.884081259f, + 0.468688822f, 0.883363339f, + 0.470043332f, 0.882643340f, + 0.471396737f, 0.881921264f, + 0.472749032f, 0.881197113f, + 0.474100215f, 0.880470889f, + 0.475450282f, 0.879742593f, + 0.476799230f, 0.879012226f, + 0.478147056f, 0.878279792f, + 0.479493758f, 0.877545290f, + 0.480839331f, 0.876808724f, + 0.482183772f, 0.876070094f, + 0.483527079f, 0.875329403f, + 0.484869248f, 0.874586652f, + 0.486210276f, 0.873841843f, + 0.487550160f, 0.873094978f, + 0.488888897f, 0.872346059f, + 0.490226483f, 0.871595087f, + 0.491562916f, 0.870842063f, + 0.492898192f, 0.870086991f, + 0.494232309f, 0.869329871f, + 0.495565262f, 0.868570706f, + 0.496897049f, 0.867809497f, + 0.498227667f, 0.867046246f, + 0.499557113f, 0.866280954f, + 0.500885383f, 0.865513624f, + 0.502212474f, 0.864744258f, + 0.503538384f, 0.863972856f, + 0.504863109f, 0.863199422f, + 0.506186645f, 0.862423956f, + 0.507508991f, 0.861646461f, + 0.508830143f, 0.860866939f, + 0.510150097f, 0.860085390f, + 0.511468850f, 0.859301818f, + 0.512786401f, 0.858516224f, + 0.514102744f, 0.857728610f, + 0.515417878f, 0.856938977f, + 0.516731799f, 0.856147328f, + 0.518044504f, 0.855353665f, + 0.519355990f, 0.854557988f, + 0.520666254f, 0.853760301f, + 0.521975293f, 0.852960605f, + 0.523283103f, 0.852158902f, + 0.524589683f, 0.851355193f, + 0.525895027f, 0.850549481f, + 0.527199135f, 0.849741768f, + 0.528502002f, 0.848932055f, + 0.529803625f, 0.848120345f, + 0.531104001f, 0.847306639f, + 0.532403128f, 0.846490939f, + 0.533701002f, 0.845673247f, + 0.534997620f, 0.844853565f, + 0.536292979f, 0.844031895f, + 0.537587076f, 0.843208240f, + 0.538879909f, 0.842382600f, + 0.540171473f, 0.841554977f, + 0.541461766f, 0.840725375f, + 0.542750785f, 0.839893794f, + 0.544038527f, 0.839060237f, + 0.545324988f, 0.838224706f, + 0.546610167f, 0.837387202f, + 0.547894059f, 0.836547727f, + 0.549176662f, 0.835706284f, + 0.550457973f, 0.834862875f, + 0.551737988f, 0.834017501f, + 0.553016706f, 0.833170165f, + 0.554294121f, 0.832320868f, + 0.555570233f, 0.831469612f, + 0.556845037f, 0.830616400f, + 0.558118531f, 0.829761234f, + 0.559390712f, 0.828904115f, + 0.560661576f, 0.828045045f, + 0.561931121f, 0.827184027f, + 0.563199344f, 0.826321063f, + 0.564466242f, 0.825456154f, + 0.565731811f, 0.824589303f, + 0.566996049f, 0.823720511f, + 0.568258953f, 0.822849781f, + 0.569520519f, 0.821977115f, + 0.570780746f, 0.821102515f, + 0.572039629f, 0.820225983f, + 0.573297167f, 0.819347520f, + 0.574553355f, 0.818467130f, + 0.575808191f, 0.817584813f, + 0.577061673f, 0.816700573f, + 0.578313796f, 0.815814411f, + 0.579564559f, 0.814926329f, + 0.580813958f, 0.814036330f, + 0.582061990f, 0.813144415f, + 0.583308653f, 0.812250587f, + 0.584553943f, 0.811354847f, + 0.585797857f, 0.810457198f, + 0.587040394f, 0.809557642f, + 0.588281548f, 0.808656182f, + 0.589521319f, 0.807752818f, + 0.590759702f, 0.806847554f, + 0.591996695f, 0.805940391f, + 0.593232295f, 0.805031331f, + 0.594466499f, 0.804120377f, + 0.595699304f, 0.803207531f, + 0.596930708f, 0.802292796f, + 0.598160707f, 0.801376172f, + 0.599389298f, 0.800457662f, + 0.600616479f, 0.799537269f, + 0.601842247f, 0.798614995f, + 0.603066599f, 0.797690841f, + 0.604289531f, 0.796764810f, + 0.605511041f, 0.795836905f, + 0.606731127f, 0.794907126f, + 0.607949785f, 0.793975478f, + 0.609167012f, 0.793041960f, + 0.610382806f, 0.792106577f, + 0.611597164f, 0.791169330f, + 0.612810082f, 0.790230221f, + 0.614021559f, 0.789289253f, + 0.615231591f, 0.788346428f, + 0.616440175f, 0.787401747f, + 0.617647308f, 0.786455214f, + 0.618852988f, 0.785506830f, + 0.620057212f, 0.784556597f, + 0.621259977f, 0.783604519f, + 0.622461279f, 0.782650596f, + 0.623661118f, 0.781694832f, + 0.624859488f, 0.780737229f, + 0.626056388f, 0.779777788f, + 0.627251815f, 0.778816512f, + 0.628445767f, 0.777853404f, + 0.629638239f, 0.776888466f, + 0.630829230f, 0.775921699f, + 0.632018736f, 0.774953107f, + 0.633206755f, 0.773982691f, + 0.634393284f, 0.773010453f, + 0.635578320f, 0.772036397f, + 0.636761861f, 0.771060524f, + 0.637943904f, 0.770082837f, + 0.639124445f, 0.769103338f, + 0.640303482f, 0.768122029f, + 0.641481013f, 0.767138912f, + 0.642657034f, 0.766153990f, + 0.643831543f, 0.765167266f, + 0.645004537f, 0.764178741f, + 0.646176013f, 0.763188417f, + 0.647345969f, 0.762196298f, + 0.648514401f, 0.761202385f, + 0.649681307f, 0.760206682f, + 0.650846685f, 0.759209189f, + 0.652010531f, 0.758209910f, + 0.653172843f, 0.757208847f, + 0.654333618f, 0.756206001f, + 0.655492853f, 0.755201377f, + 0.656650546f, 0.754194975f, + 0.657806693f, 0.753186799f, + 0.658961293f, 0.752176850f, + 0.660114342f, 0.751165132f, + 0.661265838f, 0.750151646f, + 0.662415778f, 0.749136395f, + 0.663564159f, 0.748119380f, + 0.664710978f, 0.747100606f, + 0.665856234f, 0.746080074f, + 0.666999922f, 0.745057785f, + 0.668142041f, 0.744033744f, + 0.669282588f, 0.743007952f, + 0.670421560f, 0.741980412f, + 0.671558955f, 0.740951125f, + 0.672694769f, 0.739920095f, + 0.673829000f, 0.738887324f, + 0.674961646f, 0.737852815f, + 0.676092704f, 0.736816569f, + 0.677222170f, 0.735778589f, + 0.678350043f, 0.734738878f, + 0.679476320f, 0.733697438f, + 0.680600998f, 0.732654272f, + 0.681724074f, 0.731609381f, + 0.682845546f, 0.730562769f, + 0.683965412f, 0.729514438f, + 0.685083668f, 0.728464390f, + 0.686200312f, 0.727412629f, + 0.687315341f, 0.726359155f, + 0.688428753f, 0.725303972f, + 0.689540545f, 0.724247083f, + 0.690650714f, 0.723188489f, + 0.691759258f, 0.722128194f, + 0.692866175f, 0.721066199f, + 0.693971461f, 0.720002508f, + 0.695075114f, 0.718937122f, + 0.696177131f, 0.717870045f, + 0.697277511f, 0.716801279f, + 0.698376249f, 0.715730825f, + 0.699473345f, 0.714658688f, + 0.700568794f, 0.713584869f, + 0.701662595f, 0.712509371f, + 0.702754744f, 0.711432196f, + 0.703845241f, 0.710353347f, + 0.704934080f, 0.709272826f, + 0.706021261f, 0.708190637f, + 0.707106781f, 0.707106781f, + 0.708190637f, 0.706021261f, + 0.709272826f, 0.704934080f, + 0.710353347f, 0.703845241f, + 0.711432196f, 0.702754744f, + 0.712509371f, 0.701662595f, + 0.713584869f, 0.700568794f, + 0.714658688f, 0.699473345f, + 0.715730825f, 0.698376249f, + 0.716801279f, 0.697277511f, + 0.717870045f, 0.696177131f, + 0.718937122f, 0.695075114f, + 0.720002508f, 0.693971461f, + 0.721066199f, 0.692866175f, + 0.722128194f, 0.691759258f, + 0.723188489f, 0.690650714f, + 0.724247083f, 0.689540545f, + 0.725303972f, 0.688428753f, + 0.726359155f, 0.687315341f, + 0.727412629f, 0.686200312f, + 0.728464390f, 0.685083668f, + 0.729514438f, 0.683965412f, + 0.730562769f, 0.682845546f, + 0.731609381f, 0.681724074f, + 0.732654272f, 0.680600998f, + 0.733697438f, 0.679476320f, + 0.734738878f, 0.678350043f, + 0.735778589f, 0.677222170f, + 0.736816569f, 0.676092704f, + 0.737852815f, 0.674961646f, + 0.738887324f, 0.673829000f, + 0.739920095f, 0.672694769f, + 0.740951125f, 0.671558955f, + 0.741980412f, 0.670421560f, + 0.743007952f, 0.669282588f, + 0.744033744f, 0.668142041f, + 0.745057785f, 0.666999922f, + 0.746080074f, 0.665856234f, + 0.747100606f, 0.664710978f, + 0.748119380f, 0.663564159f, + 0.749136395f, 0.662415778f, + 0.750151646f, 0.661265838f, + 0.751165132f, 0.660114342f, + 0.752176850f, 0.658961293f, + 0.753186799f, 0.657806693f, + 0.754194975f, 0.656650546f, + 0.755201377f, 0.655492853f, + 0.756206001f, 0.654333618f, + 0.757208847f, 0.653172843f, + 0.758209910f, 0.652010531f, + 0.759209189f, 0.650846685f, + 0.760206682f, 0.649681307f, + 0.761202385f, 0.648514401f, + 0.762196298f, 0.647345969f, + 0.763188417f, 0.646176013f, + 0.764178741f, 0.645004537f, + 0.765167266f, 0.643831543f, + 0.766153990f, 0.642657034f, + 0.767138912f, 0.641481013f, + 0.768122029f, 0.640303482f, + 0.769103338f, 0.639124445f, + 0.770082837f, 0.637943904f, + 0.771060524f, 0.636761861f, + 0.772036397f, 0.635578320f, + 0.773010453f, 0.634393284f, + 0.773982691f, 0.633206755f, + 0.774953107f, 0.632018736f, + 0.775921699f, 0.630829230f, + 0.776888466f, 0.629638239f, + 0.777853404f, 0.628445767f, + 0.778816512f, 0.627251815f, + 0.779777788f, 0.626056388f, + 0.780737229f, 0.624859488f, + 0.781694832f, 0.623661118f, + 0.782650596f, 0.622461279f, + 0.783604519f, 0.621259977f, + 0.784556597f, 0.620057212f, + 0.785506830f, 0.618852988f, + 0.786455214f, 0.617647308f, + 0.787401747f, 0.616440175f, + 0.788346428f, 0.615231591f, + 0.789289253f, 0.614021559f, + 0.790230221f, 0.612810082f, + 0.791169330f, 0.611597164f, + 0.792106577f, 0.610382806f, + 0.793041960f, 0.609167012f, + 0.793975478f, 0.607949785f, + 0.794907126f, 0.606731127f, + 0.795836905f, 0.605511041f, + 0.796764810f, 0.604289531f, + 0.797690841f, 0.603066599f, + 0.798614995f, 0.601842247f, + 0.799537269f, 0.600616479f, + 0.800457662f, 0.599389298f, + 0.801376172f, 0.598160707f, + 0.802292796f, 0.596930708f, + 0.803207531f, 0.595699304f, + 0.804120377f, 0.594466499f, + 0.805031331f, 0.593232295f, + 0.805940391f, 0.591996695f, + 0.806847554f, 0.590759702f, + 0.807752818f, 0.589521319f, + 0.808656182f, 0.588281548f, + 0.809557642f, 0.587040394f, + 0.810457198f, 0.585797857f, + 0.811354847f, 0.584553943f, + 0.812250587f, 0.583308653f, + 0.813144415f, 0.582061990f, + 0.814036330f, 0.580813958f, + 0.814926329f, 0.579564559f, + 0.815814411f, 0.578313796f, + 0.816700573f, 0.577061673f, + 0.817584813f, 0.575808191f, + 0.818467130f, 0.574553355f, + 0.819347520f, 0.573297167f, + 0.820225983f, 0.572039629f, + 0.821102515f, 0.570780746f, + 0.821977115f, 0.569520519f, + 0.822849781f, 0.568258953f, + 0.823720511f, 0.566996049f, + 0.824589303f, 0.565731811f, + 0.825456154f, 0.564466242f, + 0.826321063f, 0.563199344f, + 0.827184027f, 0.561931121f, + 0.828045045f, 0.560661576f, + 0.828904115f, 0.559390712f, + 0.829761234f, 0.558118531f, + 0.830616400f, 0.556845037f, + 0.831469612f, 0.555570233f, + 0.832320868f, 0.554294121f, + 0.833170165f, 0.553016706f, + 0.834017501f, 0.551737988f, + 0.834862875f, 0.550457973f, + 0.835706284f, 0.549176662f, + 0.836547727f, 0.547894059f, + 0.837387202f, 0.546610167f, + 0.838224706f, 0.545324988f, + 0.839060237f, 0.544038527f, + 0.839893794f, 0.542750785f, + 0.840725375f, 0.541461766f, + 0.841554977f, 0.540171473f, + 0.842382600f, 0.538879909f, + 0.843208240f, 0.537587076f, + 0.844031895f, 0.536292979f, + 0.844853565f, 0.534997620f, + 0.845673247f, 0.533701002f, + 0.846490939f, 0.532403128f, + 0.847306639f, 0.531104001f, + 0.848120345f, 0.529803625f, + 0.848932055f, 0.528502002f, + 0.849741768f, 0.527199135f, + 0.850549481f, 0.525895027f, + 0.851355193f, 0.524589683f, + 0.852158902f, 0.523283103f, + 0.852960605f, 0.521975293f, + 0.853760301f, 0.520666254f, + 0.854557988f, 0.519355990f, + 0.855353665f, 0.518044504f, + 0.856147328f, 0.516731799f, + 0.856938977f, 0.515417878f, + 0.857728610f, 0.514102744f, + 0.858516224f, 0.512786401f, + 0.859301818f, 0.511468850f, + 0.860085390f, 0.510150097f, + 0.860866939f, 0.508830143f, + 0.861646461f, 0.507508991f, + 0.862423956f, 0.506186645f, + 0.863199422f, 0.504863109f, + 0.863972856f, 0.503538384f, + 0.864744258f, 0.502212474f, + 0.865513624f, 0.500885383f, + 0.866280954f, 0.499557113f, + 0.867046246f, 0.498227667f, + 0.867809497f, 0.496897049f, + 0.868570706f, 0.495565262f, + 0.869329871f, 0.494232309f, + 0.870086991f, 0.492898192f, + 0.870842063f, 0.491562916f, + 0.871595087f, 0.490226483f, + 0.872346059f, 0.488888897f, + 0.873094978f, 0.487550160f, + 0.873841843f, 0.486210276f, + 0.874586652f, 0.484869248f, + 0.875329403f, 0.483527079f, + 0.876070094f, 0.482183772f, + 0.876808724f, 0.480839331f, + 0.877545290f, 0.479493758f, + 0.878279792f, 0.478147056f, + 0.879012226f, 0.476799230f, + 0.879742593f, 0.475450282f, + 0.880470889f, 0.474100215f, + 0.881197113f, 0.472749032f, + 0.881921264f, 0.471396737f, + 0.882643340f, 0.470043332f, + 0.883363339f, 0.468688822f, + 0.884081259f, 0.467333209f, + 0.884797098f, 0.465976496f, + 0.885510856f, 0.464618686f, + 0.886222530f, 0.463259784f, + 0.886932119f, 0.461899791f, + 0.887639620f, 0.460538711f, + 0.888345033f, 0.459176548f, + 0.889048356f, 0.457813304f, + 0.889749586f, 0.456448982f, + 0.890448723f, 0.455083587f, + 0.891145765f, 0.453717121f, + 0.891840709f, 0.452349587f, + 0.892533555f, 0.450980989f, + 0.893224301f, 0.449611330f, + 0.893912945f, 0.448240612f, + 0.894599486f, 0.446868840f, + 0.895283921f, 0.445496017f, + 0.895966250f, 0.444122145f, + 0.896646470f, 0.442747228f, + 0.897324581f, 0.441371269f, + 0.898000580f, 0.439994271f, + 0.898674466f, 0.438616239f, + 0.899346237f, 0.437237174f, + 0.900015892f, 0.435857080f, + 0.900683429f, 0.434475961f, + 0.901348847f, 0.433093819f, + 0.902012144f, 0.431710658f, + 0.902673318f, 0.430326481f, + 0.903332368f, 0.428941292f, + 0.903989293f, 0.427555093f, + 0.904644091f, 0.426167889f, + 0.905296759f, 0.424779681f, + 0.905947298f, 0.423390474f, + 0.906595705f, 0.422000271f, + 0.907241978f, 0.420609074f, + 0.907886116f, 0.419216888f, + 0.908528119f, 0.417823716f, + 0.909167983f, 0.416429560f, + 0.909805708f, 0.415034424f, + 0.910441292f, 0.413638312f, + 0.911074734f, 0.412241227f, + 0.911706032f, 0.410843171f, + 0.912335185f, 0.409444149f, + 0.912962190f, 0.408044163f, + 0.913587048f, 0.406643217f, + 0.914209756f, 0.405241314f, + 0.914830312f, 0.403838458f, + 0.915448716f, 0.402434651f, + 0.916064966f, 0.401029897f, + 0.916679060f, 0.399624200f, + 0.917290997f, 0.398217562f, + 0.917900776f, 0.396809987f, + 0.918508394f, 0.395401479f, + 0.919113852f, 0.393992040f, + 0.919717146f, 0.392581674f, + 0.920318277f, 0.391170384f, + 0.920917242f, 0.389758174f, + 0.921514039f, 0.388345047f, + 0.922108669f, 0.386931006f, + 0.922701128f, 0.385516054f, + 0.923291417f, 0.384100195f, + 0.923879533f, 0.382683432f, + 0.924465474f, 0.381265769f, + 0.925049241f, 0.379847209f, + 0.925630831f, 0.378427755f, + 0.926210242f, 0.377007410f, + 0.926787474f, 0.375586178f, + 0.927362526f, 0.374164063f, + 0.927935395f, 0.372741067f, + 0.928506080f, 0.371317194f, + 0.929074581f, 0.369892447f, + 0.929640896f, 0.368466830f, + 0.930205023f, 0.367040346f, + 0.930766961f, 0.365612998f, + 0.931326709f, 0.364184790f, + 0.931884266f, 0.362755724f, + 0.932439629f, 0.361325806f, + 0.932992799f, 0.359895037f, + 0.933543773f, 0.358463421f, + 0.934092550f, 0.357030961f, + 0.934639130f, 0.355597662f, + 0.935183510f, 0.354163525f, + 0.935725689f, 0.352728556f, + 0.936265667f, 0.351292756f, + 0.936803442f, 0.349856130f, + 0.937339012f, 0.348418680f, + 0.937872376f, 0.346980411f, + 0.938403534f, 0.345541325f, + 0.938932484f, 0.344101426f, + 0.939459224f, 0.342660717f, + 0.939983753f, 0.341219202f, + 0.940506071f, 0.339776884f, + 0.941026175f, 0.338333767f, + 0.941544065f, 0.336889853f, + 0.942059740f, 0.335445147f, + 0.942573198f, 0.333999651f, + 0.943084437f, 0.332553370f, + 0.943593458f, 0.331106306f, + 0.944100258f, 0.329658463f, + 0.944604837f, 0.328209844f, + 0.945107193f, 0.326760452f, + 0.945607325f, 0.325310292f, + 0.946105232f, 0.323859367f, + 0.946600913f, 0.322407679f, + 0.947094366f, 0.320955232f, + 0.947585591f, 0.319502031f, + 0.948074586f, 0.318048077f, + 0.948561350f, 0.316593376f, + 0.949045882f, 0.315137929f, + 0.949528181f, 0.313681740f, + 0.950008245f, 0.312224814f, + 0.950486074f, 0.310767153f, + 0.950961666f, 0.309308760f, + 0.951435021f, 0.307849640f, + 0.951906137f, 0.306389795f, + 0.952375013f, 0.304929230f, + 0.952841648f, 0.303467947f, + 0.953306040f, 0.302005949f, + 0.953768190f, 0.300543241f, + 0.954228095f, 0.299079826f, + 0.954685755f, 0.297615707f, + 0.955141168f, 0.296150888f, + 0.955594334f, 0.294685372f, + 0.956045251f, 0.293219163f, + 0.956493919f, 0.291752263f, + 0.956940336f, 0.290284677f, + 0.957384501f, 0.288816408f, + 0.957826413f, 0.287347460f, + 0.958266071f, 0.285877835f, + 0.958703475f, 0.284407537f, + 0.959138622f, 0.282936570f, + 0.959571513f, 0.281464938f, + 0.960002146f, 0.279992643f, + 0.960430519f, 0.278519689f, + 0.960856633f, 0.277046080f, + 0.961280486f, 0.275571819f, + 0.961702077f, 0.274096910f, + 0.962121404f, 0.272621355f, + 0.962538468f, 0.271145160f, + 0.962953267f, 0.269668326f, + 0.963365800f, 0.268190857f, + 0.963776066f, 0.266712757f, + 0.964184064f, 0.265234030f, + 0.964589793f, 0.263754679f, + 0.964993253f, 0.262274707f, + 0.965394442f, 0.260794118f, + 0.965793359f, 0.259312915f, + 0.966190003f, 0.257831102f, + 0.966584374f, 0.256348682f, + 0.966976471f, 0.254865660f, + 0.967366292f, 0.253382037f, + 0.967753837f, 0.251897818f, + 0.968139105f, 0.250413007f, + 0.968522094f, 0.248927606f, + 0.968902805f, 0.247441619f, + 0.969281235f, 0.245955050f, + 0.969657385f, 0.244467903f, + 0.970031253f, 0.242980180f, + 0.970402839f, 0.241491885f, + 0.970772141f, 0.240003022f, + 0.971139158f, 0.238513595f, + 0.971503891f, 0.237023606f, + 0.971866337f, 0.235533059f, + 0.972226497f, 0.234041959f, + 0.972584369f, 0.232550307f, + 0.972939952f, 0.231058108f, + 0.973293246f, 0.229565366f, + 0.973644250f, 0.228072083f, + 0.973992962f, 0.226578264f, + 0.974339383f, 0.225083911f, + 0.974683511f, 0.223589029f, + 0.975025345f, 0.222093621f, + 0.975364885f, 0.220597690f, + 0.975702130f, 0.219101240f, + 0.976037079f, 0.217604275f, + 0.976369731f, 0.216106797f, + 0.976700086f, 0.214608811f, + 0.977028143f, 0.213110320f, + 0.977353900f, 0.211611327f, + 0.977677358f, 0.210111837f, + 0.977998515f, 0.208611852f, + 0.978317371f, 0.207111376f, + 0.978633924f, 0.205610413f, + 0.978948175f, 0.204108966f, + 0.979260123f, 0.202607039f, + 0.979569766f, 0.201104635f, + 0.979877104f, 0.199601758f, + 0.980182136f, 0.198098411f, + 0.980484862f, 0.196594598f, + 0.980785280f, 0.195090322f, + 0.981083391f, 0.193585587f, + 0.981379193f, 0.192080397f, + 0.981672686f, 0.190574755f, + 0.981963869f, 0.189068664f, + 0.982252741f, 0.187562129f, + 0.982539302f, 0.186055152f, + 0.982823551f, 0.184547737f, + 0.983105487f, 0.183039888f, + 0.983385110f, 0.181531608f, + 0.983662419f, 0.180022901f, + 0.983937413f, 0.178513771f, + 0.984210092f, 0.177004220f, + 0.984480455f, 0.175494253f, + 0.984748502f, 0.173983873f, + 0.985014231f, 0.172473084f, + 0.985277642f, 0.170961889f, + 0.985538735f, 0.169450291f, + 0.985797509f, 0.167938295f, + 0.986053963f, 0.166425904f, + 0.986308097f, 0.164913120f, + 0.986559910f, 0.163399949f, + 0.986809402f, 0.161886394f, + 0.987056571f, 0.160372457f, + 0.987301418f, 0.158858143f, + 0.987543942f, 0.157343456f, + 0.987784142f, 0.155828398f, + 0.988022017f, 0.154312973f, + 0.988257568f, 0.152797185f, + 0.988490793f, 0.151281038f, + 0.988721692f, 0.149764535f, + 0.988950265f, 0.148247679f, + 0.989176510f, 0.146730474f, + 0.989400428f, 0.145212925f, + 0.989622017f, 0.143695033f, + 0.989841278f, 0.142176804f, + 0.990058210f, 0.140658239f, + 0.990272812f, 0.139139344f, + 0.990485084f, 0.137620122f, + 0.990695025f, 0.136100575f, + 0.990902635f, 0.134580709f, + 0.991107914f, 0.133060525f, + 0.991310860f, 0.131540029f, + 0.991511473f, 0.130019223f, + 0.991709754f, 0.128498111f, + 0.991905700f, 0.126976696f, + 0.992099313f, 0.125454983f, + 0.992290591f, 0.123932975f, + 0.992479535f, 0.122410675f, + 0.992666142f, 0.120888087f, + 0.992850414f, 0.119365215f, + 0.993032350f, 0.117842062f, + 0.993211949f, 0.116318631f, + 0.993389211f, 0.114794927f, + 0.993564136f, 0.113270952f, + 0.993736722f, 0.111746711f, + 0.993906970f, 0.110222207f, + 0.994074879f, 0.108697444f, + 0.994240449f, 0.107172425f, + 0.994403680f, 0.105647154f, + 0.994564571f, 0.104121634f, + 0.994723121f, 0.102595869f, + 0.994879331f, 0.101069863f, + 0.995033199f, 0.099543619f, + 0.995184727f, 0.098017140f, + 0.995333912f, 0.096490431f, + 0.995480755f, 0.094963495f, + 0.995625256f, 0.093436336f, + 0.995767414f, 0.091908956f, + 0.995907229f, 0.090381361f, + 0.996044701f, 0.088853553f, + 0.996179829f, 0.087325535f, + 0.996312612f, 0.085797312f, + 0.996443051f, 0.084268888f, + 0.996571146f, 0.082740265f, + 0.996696895f, 0.081211447f, + 0.996820299f, 0.079682438f, + 0.996941358f, 0.078153242f, + 0.997060070f, 0.076623861f, + 0.997176437f, 0.075094301f, + 0.997290457f, 0.073564564f, + 0.997402130f, 0.072034653f, + 0.997511456f, 0.070504573f, + 0.997618435f, 0.068974328f, + 0.997723067f, 0.067443920f, + 0.997825350f, 0.065913353f, + 0.997925286f, 0.064382631f, + 0.998022874f, 0.062851758f, + 0.998118113f, 0.061320736f, + 0.998211003f, 0.059789571f, + 0.998301545f, 0.058258265f, + 0.998389737f, 0.056726821f, + 0.998475581f, 0.055195244f, + 0.998559074f, 0.053663538f, + 0.998640218f, 0.052131705f, + 0.998719012f, 0.050599749f, + 0.998795456f, 0.049067674f, + 0.998869550f, 0.047535484f, + 0.998941293f, 0.046003182f, + 0.999010686f, 0.044470772f, + 0.999077728f, 0.042938257f, + 0.999142419f, 0.041405641f, + 0.999204759f, 0.039872928f, + 0.999264747f, 0.038340120f, + 0.999322385f, 0.036807223f, + 0.999377670f, 0.035274239f, + 0.999430605f, 0.033741172f, + 0.999481187f, 0.032208025f, + 0.999529418f, 0.030674803f, + 0.999575296f, 0.029141509f, + 0.999618822f, 0.027608146f, + 0.999659997f, 0.026074718f, + 0.999698819f, 0.024541229f, + 0.999735288f, 0.023007681f, + 0.999769405f, 0.021474080f, + 0.999801170f, 0.019940429f, + 0.999830582f, 0.018406730f, + 0.999857641f, 0.016872988f, + 0.999882347f, 0.015339206f, + 0.999904701f, 0.013805389f, + 0.999924702f, 0.012271538f, + 0.999942350f, 0.010737659f, + 0.999957645f, 0.009203755f, + 0.999970586f, 0.007669829f, + 0.999981175f, 0.006135885f, + 0.999989411f, 0.004601926f, + 0.999995294f, 0.003067957f, + 0.999998823f, 0.001533980f, + 1.000000000f, 0.000000000f, + 0.999998823f, -0.001533980f, + 0.999995294f, -0.003067957f, + 0.999989411f, -0.004601926f, + 0.999981175f, -0.006135885f, + 0.999970586f, -0.007669829f, + 0.999957645f, -0.009203755f, + 0.999942350f, -0.010737659f, + 0.999924702f, -0.012271538f, + 0.999904701f, -0.013805389f, + 0.999882347f, -0.015339206f, + 0.999857641f, -0.016872988f, + 0.999830582f, -0.018406730f, + 0.999801170f, -0.019940429f, + 0.999769405f, -0.021474080f, + 0.999735288f, -0.023007681f, + 0.999698819f, -0.024541229f, + 0.999659997f, -0.026074718f, + 0.999618822f, -0.027608146f, + 0.999575296f, -0.029141509f, + 0.999529418f, -0.030674803f, + 0.999481187f, -0.032208025f, + 0.999430605f, -0.033741172f, + 0.999377670f, -0.035274239f, + 0.999322385f, -0.036807223f, + 0.999264747f, -0.038340120f, + 0.999204759f, -0.039872928f, + 0.999142419f, -0.041405641f, + 0.999077728f, -0.042938257f, + 0.999010686f, -0.044470772f, + 0.998941293f, -0.046003182f, + 0.998869550f, -0.047535484f, + 0.998795456f, -0.049067674f, + 0.998719012f, -0.050599749f, + 0.998640218f, -0.052131705f, + 0.998559074f, -0.053663538f, + 0.998475581f, -0.055195244f, + 0.998389737f, -0.056726821f, + 0.998301545f, -0.058258265f, + 0.998211003f, -0.059789571f, + 0.998118113f, -0.061320736f, + 0.998022874f, -0.062851758f, + 0.997925286f, -0.064382631f, + 0.997825350f, -0.065913353f, + 0.997723067f, -0.067443920f, + 0.997618435f, -0.068974328f, + 0.997511456f, -0.070504573f, + 0.997402130f, -0.072034653f, + 0.997290457f, -0.073564564f, + 0.997176437f, -0.075094301f, + 0.997060070f, -0.076623861f, + 0.996941358f, -0.078153242f, + 0.996820299f, -0.079682438f, + 0.996696895f, -0.081211447f, + 0.996571146f, -0.082740265f, + 0.996443051f, -0.084268888f, + 0.996312612f, -0.085797312f, + 0.996179829f, -0.087325535f, + 0.996044701f, -0.088853553f, + 0.995907229f, -0.090381361f, + 0.995767414f, -0.091908956f, + 0.995625256f, -0.093436336f, + 0.995480755f, -0.094963495f, + 0.995333912f, -0.096490431f, + 0.995184727f, -0.098017140f, + 0.995033199f, -0.099543619f, + 0.994879331f, -0.101069863f, + 0.994723121f, -0.102595869f, + 0.994564571f, -0.104121634f, + 0.994403680f, -0.105647154f, + 0.994240449f, -0.107172425f, + 0.994074879f, -0.108697444f, + 0.993906970f, -0.110222207f, + 0.993736722f, -0.111746711f, + 0.993564136f, -0.113270952f, + 0.993389211f, -0.114794927f, + 0.993211949f, -0.116318631f, + 0.993032350f, -0.117842062f, + 0.992850414f, -0.119365215f, + 0.992666142f, -0.120888087f, + 0.992479535f, -0.122410675f, + 0.992290591f, -0.123932975f, + 0.992099313f, -0.125454983f, + 0.991905700f, -0.126976696f, + 0.991709754f, -0.128498111f, + 0.991511473f, -0.130019223f, + 0.991310860f, -0.131540029f, + 0.991107914f, -0.133060525f, + 0.990902635f, -0.134580709f, + 0.990695025f, -0.136100575f, + 0.990485084f, -0.137620122f, + 0.990272812f, -0.139139344f, + 0.990058210f, -0.140658239f, + 0.989841278f, -0.142176804f, + 0.989622017f, -0.143695033f, + 0.989400428f, -0.145212925f, + 0.989176510f, -0.146730474f, + 0.988950265f, -0.148247679f, + 0.988721692f, -0.149764535f, + 0.988490793f, -0.151281038f, + 0.988257568f, -0.152797185f, + 0.988022017f, -0.154312973f, + 0.987784142f, -0.155828398f, + 0.987543942f, -0.157343456f, + 0.987301418f, -0.158858143f, + 0.987056571f, -0.160372457f, + 0.986809402f, -0.161886394f, + 0.986559910f, -0.163399949f, + 0.986308097f, -0.164913120f, + 0.986053963f, -0.166425904f, + 0.985797509f, -0.167938295f, + 0.985538735f, -0.169450291f, + 0.985277642f, -0.170961889f, + 0.985014231f, -0.172473084f, + 0.984748502f, -0.173983873f, + 0.984480455f, -0.175494253f, + 0.984210092f, -0.177004220f, + 0.983937413f, -0.178513771f, + 0.983662419f, -0.180022901f, + 0.983385110f, -0.181531608f, + 0.983105487f, -0.183039888f, + 0.982823551f, -0.184547737f, + 0.982539302f, -0.186055152f, + 0.982252741f, -0.187562129f, + 0.981963869f, -0.189068664f, + 0.981672686f, -0.190574755f, + 0.981379193f, -0.192080397f, + 0.981083391f, -0.193585587f, + 0.980785280f, -0.195090322f, + 0.980484862f, -0.196594598f, + 0.980182136f, -0.198098411f, + 0.979877104f, -0.199601758f, + 0.979569766f, -0.201104635f, + 0.979260123f, -0.202607039f, + 0.978948175f, -0.204108966f, + 0.978633924f, -0.205610413f, + 0.978317371f, -0.207111376f, + 0.977998515f, -0.208611852f, + 0.977677358f, -0.210111837f, + 0.977353900f, -0.211611327f, + 0.977028143f, -0.213110320f, + 0.976700086f, -0.214608811f, + 0.976369731f, -0.216106797f, + 0.976037079f, -0.217604275f, + 0.975702130f, -0.219101240f, + 0.975364885f, -0.220597690f, + 0.975025345f, -0.222093621f, + 0.974683511f, -0.223589029f, + 0.974339383f, -0.225083911f, + 0.973992962f, -0.226578264f, + 0.973644250f, -0.228072083f, + 0.973293246f, -0.229565366f, + 0.972939952f, -0.231058108f, + 0.972584369f, -0.232550307f, + 0.972226497f, -0.234041959f, + 0.971866337f, -0.235533059f, + 0.971503891f, -0.237023606f, + 0.971139158f, -0.238513595f, + 0.970772141f, -0.240003022f, + 0.970402839f, -0.241491885f, + 0.970031253f, -0.242980180f, + 0.969657385f, -0.244467903f, + 0.969281235f, -0.245955050f, + 0.968902805f, -0.247441619f, + 0.968522094f, -0.248927606f, + 0.968139105f, -0.250413007f, + 0.967753837f, -0.251897818f, + 0.967366292f, -0.253382037f, + 0.966976471f, -0.254865660f, + 0.966584374f, -0.256348682f, + 0.966190003f, -0.257831102f, + 0.965793359f, -0.259312915f, + 0.965394442f, -0.260794118f, + 0.964993253f, -0.262274707f, + 0.964589793f, -0.263754679f, + 0.964184064f, -0.265234030f, + 0.963776066f, -0.266712757f, + 0.963365800f, -0.268190857f, + 0.962953267f, -0.269668326f, + 0.962538468f, -0.271145160f, + 0.962121404f, -0.272621355f, + 0.961702077f, -0.274096910f, + 0.961280486f, -0.275571819f, + 0.960856633f, -0.277046080f, + 0.960430519f, -0.278519689f, + 0.960002146f, -0.279992643f, + 0.959571513f, -0.281464938f, + 0.959138622f, -0.282936570f, + 0.958703475f, -0.284407537f, + 0.958266071f, -0.285877835f, + 0.957826413f, -0.287347460f, + 0.957384501f, -0.288816408f, + 0.956940336f, -0.290284677f, + 0.956493919f, -0.291752263f, + 0.956045251f, -0.293219163f, + 0.955594334f, -0.294685372f, + 0.955141168f, -0.296150888f, + 0.954685755f, -0.297615707f, + 0.954228095f, -0.299079826f, + 0.953768190f, -0.300543241f, + 0.953306040f, -0.302005949f, + 0.952841648f, -0.303467947f, + 0.952375013f, -0.304929230f, + 0.951906137f, -0.306389795f, + 0.951435021f, -0.307849640f, + 0.950961666f, -0.309308760f, + 0.950486074f, -0.310767153f, + 0.950008245f, -0.312224814f, + 0.949528181f, -0.313681740f, + 0.949045882f, -0.315137929f, + 0.948561350f, -0.316593376f, + 0.948074586f, -0.318048077f, + 0.947585591f, -0.319502031f, + 0.947094366f, -0.320955232f, + 0.946600913f, -0.322407679f, + 0.946105232f, -0.323859367f, + 0.945607325f, -0.325310292f, + 0.945107193f, -0.326760452f, + 0.944604837f, -0.328209844f, + 0.944100258f, -0.329658463f, + 0.943593458f, -0.331106306f, + 0.943084437f, -0.332553370f, + 0.942573198f, -0.333999651f, + 0.942059740f, -0.335445147f, + 0.941544065f, -0.336889853f, + 0.941026175f, -0.338333767f, + 0.940506071f, -0.339776884f, + 0.939983753f, -0.341219202f, + 0.939459224f, -0.342660717f, + 0.938932484f, -0.344101426f, + 0.938403534f, -0.345541325f, + 0.937872376f, -0.346980411f, + 0.937339012f, -0.348418680f, + 0.936803442f, -0.349856130f, + 0.936265667f, -0.351292756f, + 0.935725689f, -0.352728556f, + 0.935183510f, -0.354163525f, + 0.934639130f, -0.355597662f, + 0.934092550f, -0.357030961f, + 0.933543773f, -0.358463421f, + 0.932992799f, -0.359895037f, + 0.932439629f, -0.361325806f, + 0.931884266f, -0.362755724f, + 0.931326709f, -0.364184790f, + 0.930766961f, -0.365612998f, + 0.930205023f, -0.367040346f, + 0.929640896f, -0.368466830f, + 0.929074581f, -0.369892447f, + 0.928506080f, -0.371317194f, + 0.927935395f, -0.372741067f, + 0.927362526f, -0.374164063f, + 0.926787474f, -0.375586178f, + 0.926210242f, -0.377007410f, + 0.925630831f, -0.378427755f, + 0.925049241f, -0.379847209f, + 0.924465474f, -0.381265769f, + 0.923879533f, -0.382683432f, + 0.923291417f, -0.384100195f, + 0.922701128f, -0.385516054f, + 0.922108669f, -0.386931006f, + 0.921514039f, -0.388345047f, + 0.920917242f, -0.389758174f, + 0.920318277f, -0.391170384f, + 0.919717146f, -0.392581674f, + 0.919113852f, -0.393992040f, + 0.918508394f, -0.395401479f, + 0.917900776f, -0.396809987f, + 0.917290997f, -0.398217562f, + 0.916679060f, -0.399624200f, + 0.916064966f, -0.401029897f, + 0.915448716f, -0.402434651f, + 0.914830312f, -0.403838458f, + 0.914209756f, -0.405241314f, + 0.913587048f, -0.406643217f, + 0.912962190f, -0.408044163f, + 0.912335185f, -0.409444149f, + 0.911706032f, -0.410843171f, + 0.911074734f, -0.412241227f, + 0.910441292f, -0.413638312f, + 0.909805708f, -0.415034424f, + 0.909167983f, -0.416429560f, + 0.908528119f, -0.417823716f, + 0.907886116f, -0.419216888f, + 0.907241978f, -0.420609074f, + 0.906595705f, -0.422000271f, + 0.905947298f, -0.423390474f, + 0.905296759f, -0.424779681f, + 0.904644091f, -0.426167889f, + 0.903989293f, -0.427555093f, + 0.903332368f, -0.428941292f, + 0.902673318f, -0.430326481f, + 0.902012144f, -0.431710658f, + 0.901348847f, -0.433093819f, + 0.900683429f, -0.434475961f, + 0.900015892f, -0.435857080f, + 0.899346237f, -0.437237174f, + 0.898674466f, -0.438616239f, + 0.898000580f, -0.439994271f, + 0.897324581f, -0.441371269f, + 0.896646470f, -0.442747228f, + 0.895966250f, -0.444122145f, + 0.895283921f, -0.445496017f, + 0.894599486f, -0.446868840f, + 0.893912945f, -0.448240612f, + 0.893224301f, -0.449611330f, + 0.892533555f, -0.450980989f, + 0.891840709f, -0.452349587f, + 0.891145765f, -0.453717121f, + 0.890448723f, -0.455083587f, + 0.889749586f, -0.456448982f, + 0.889048356f, -0.457813304f, + 0.888345033f, -0.459176548f, + 0.887639620f, -0.460538711f, + 0.886932119f, -0.461899791f, + 0.886222530f, -0.463259784f, + 0.885510856f, -0.464618686f, + 0.884797098f, -0.465976496f, + 0.884081259f, -0.467333209f, + 0.883363339f, -0.468688822f, + 0.882643340f, -0.470043332f, + 0.881921264f, -0.471396737f, + 0.881197113f, -0.472749032f, + 0.880470889f, -0.474100215f, + 0.879742593f, -0.475450282f, + 0.879012226f, -0.476799230f, + 0.878279792f, -0.478147056f, + 0.877545290f, -0.479493758f, + 0.876808724f, -0.480839331f, + 0.876070094f, -0.482183772f, + 0.875329403f, -0.483527079f, + 0.874586652f, -0.484869248f, + 0.873841843f, -0.486210276f, + 0.873094978f, -0.487550160f, + 0.872346059f, -0.488888897f, + 0.871595087f, -0.490226483f, + 0.870842063f, -0.491562916f, + 0.870086991f, -0.492898192f, + 0.869329871f, -0.494232309f, + 0.868570706f, -0.495565262f, + 0.867809497f, -0.496897049f, + 0.867046246f, -0.498227667f, + 0.866280954f, -0.499557113f, + 0.865513624f, -0.500885383f, + 0.864744258f, -0.502212474f, + 0.863972856f, -0.503538384f, + 0.863199422f, -0.504863109f, + 0.862423956f, -0.506186645f, + 0.861646461f, -0.507508991f, + 0.860866939f, -0.508830143f, + 0.860085390f, -0.510150097f, + 0.859301818f, -0.511468850f, + 0.858516224f, -0.512786401f, + 0.857728610f, -0.514102744f, + 0.856938977f, -0.515417878f, + 0.856147328f, -0.516731799f, + 0.855353665f, -0.518044504f, + 0.854557988f, -0.519355990f, + 0.853760301f, -0.520666254f, + 0.852960605f, -0.521975293f, + 0.852158902f, -0.523283103f, + 0.851355193f, -0.524589683f, + 0.850549481f, -0.525895027f, + 0.849741768f, -0.527199135f, + 0.848932055f, -0.528502002f, + 0.848120345f, -0.529803625f, + 0.847306639f, -0.531104001f, + 0.846490939f, -0.532403128f, + 0.845673247f, -0.533701002f, + 0.844853565f, -0.534997620f, + 0.844031895f, -0.536292979f, + 0.843208240f, -0.537587076f, + 0.842382600f, -0.538879909f, + 0.841554977f, -0.540171473f, + 0.840725375f, -0.541461766f, + 0.839893794f, -0.542750785f, + 0.839060237f, -0.544038527f, + 0.838224706f, -0.545324988f, + 0.837387202f, -0.546610167f, + 0.836547727f, -0.547894059f, + 0.835706284f, -0.549176662f, + 0.834862875f, -0.550457973f, + 0.834017501f, -0.551737988f, + 0.833170165f, -0.553016706f, + 0.832320868f, -0.554294121f, + 0.831469612f, -0.555570233f, + 0.830616400f, -0.556845037f, + 0.829761234f, -0.558118531f, + 0.828904115f, -0.559390712f, + 0.828045045f, -0.560661576f, + 0.827184027f, -0.561931121f, + 0.826321063f, -0.563199344f, + 0.825456154f, -0.564466242f, + 0.824589303f, -0.565731811f, + 0.823720511f, -0.566996049f, + 0.822849781f, -0.568258953f, + 0.821977115f, -0.569520519f, + 0.821102515f, -0.570780746f, + 0.820225983f, -0.572039629f, + 0.819347520f, -0.573297167f, + 0.818467130f, -0.574553355f, + 0.817584813f, -0.575808191f, + 0.816700573f, -0.577061673f, + 0.815814411f, -0.578313796f, + 0.814926329f, -0.579564559f, + 0.814036330f, -0.580813958f, + 0.813144415f, -0.582061990f, + 0.812250587f, -0.583308653f, + 0.811354847f, -0.584553943f, + 0.810457198f, -0.585797857f, + 0.809557642f, -0.587040394f, + 0.808656182f, -0.588281548f, + 0.807752818f, -0.589521319f, + 0.806847554f, -0.590759702f, + 0.805940391f, -0.591996695f, + 0.805031331f, -0.593232295f, + 0.804120377f, -0.594466499f, + 0.803207531f, -0.595699304f, + 0.802292796f, -0.596930708f, + 0.801376172f, -0.598160707f, + 0.800457662f, -0.599389298f, + 0.799537269f, -0.600616479f, + 0.798614995f, -0.601842247f, + 0.797690841f, -0.603066599f, + 0.796764810f, -0.604289531f, + 0.795836905f, -0.605511041f, + 0.794907126f, -0.606731127f, + 0.793975478f, -0.607949785f, + 0.793041960f, -0.609167012f, + 0.792106577f, -0.610382806f, + 0.791169330f, -0.611597164f, + 0.790230221f, -0.612810082f, + 0.789289253f, -0.614021559f, + 0.788346428f, -0.615231591f, + 0.787401747f, -0.616440175f, + 0.786455214f, -0.617647308f, + 0.785506830f, -0.618852988f, + 0.784556597f, -0.620057212f, + 0.783604519f, -0.621259977f, + 0.782650596f, -0.622461279f, + 0.781694832f, -0.623661118f, + 0.780737229f, -0.624859488f, + 0.779777788f, -0.626056388f, + 0.778816512f, -0.627251815f, + 0.777853404f, -0.628445767f, + 0.776888466f, -0.629638239f, + 0.775921699f, -0.630829230f, + 0.774953107f, -0.632018736f, + 0.773982691f, -0.633206755f, + 0.773010453f, -0.634393284f, + 0.772036397f, -0.635578320f, + 0.771060524f, -0.636761861f, + 0.770082837f, -0.637943904f, + 0.769103338f, -0.639124445f, + 0.768122029f, -0.640303482f, + 0.767138912f, -0.641481013f, + 0.766153990f, -0.642657034f, + 0.765167266f, -0.643831543f, + 0.764178741f, -0.645004537f, + 0.763188417f, -0.646176013f, + 0.762196298f, -0.647345969f, + 0.761202385f, -0.648514401f, + 0.760206682f, -0.649681307f, + 0.759209189f, -0.650846685f, + 0.758209910f, -0.652010531f, + 0.757208847f, -0.653172843f, + 0.756206001f, -0.654333618f, + 0.755201377f, -0.655492853f, + 0.754194975f, -0.656650546f, + 0.753186799f, -0.657806693f, + 0.752176850f, -0.658961293f, + 0.751165132f, -0.660114342f, + 0.750151646f, -0.661265838f, + 0.749136395f, -0.662415778f, + 0.748119380f, -0.663564159f, + 0.747100606f, -0.664710978f, + 0.746080074f, -0.665856234f, + 0.745057785f, -0.666999922f, + 0.744033744f, -0.668142041f, + 0.743007952f, -0.669282588f, + 0.741980412f, -0.670421560f, + 0.740951125f, -0.671558955f, + 0.739920095f, -0.672694769f, + 0.738887324f, -0.673829000f, + 0.737852815f, -0.674961646f, + 0.736816569f, -0.676092704f, + 0.735778589f, -0.677222170f, + 0.734738878f, -0.678350043f, + 0.733697438f, -0.679476320f, + 0.732654272f, -0.680600998f, + 0.731609381f, -0.681724074f, + 0.730562769f, -0.682845546f, + 0.729514438f, -0.683965412f, + 0.728464390f, -0.685083668f, + 0.727412629f, -0.686200312f, + 0.726359155f, -0.687315341f, + 0.725303972f, -0.688428753f, + 0.724247083f, -0.689540545f, + 0.723188489f, -0.690650714f, + 0.722128194f, -0.691759258f, + 0.721066199f, -0.692866175f, + 0.720002508f, -0.693971461f, + 0.718937122f, -0.695075114f, + 0.717870045f, -0.696177131f, + 0.716801279f, -0.697277511f, + 0.715730825f, -0.698376249f, + 0.714658688f, -0.699473345f, + 0.713584869f, -0.700568794f, + 0.712509371f, -0.701662595f, + 0.711432196f, -0.702754744f, + 0.710353347f, -0.703845241f, + 0.709272826f, -0.704934080f, + 0.708190637f, -0.706021261f, + 0.707106781f, -0.707106781f, + 0.706021261f, -0.708190637f, + 0.704934080f, -0.709272826f, + 0.703845241f, -0.710353347f, + 0.702754744f, -0.711432196f, + 0.701662595f, -0.712509371f, + 0.700568794f, -0.713584869f, + 0.699473345f, -0.714658688f, + 0.698376249f, -0.715730825f, + 0.697277511f, -0.716801279f, + 0.696177131f, -0.717870045f, + 0.695075114f, -0.718937122f, + 0.693971461f, -0.720002508f, + 0.692866175f, -0.721066199f, + 0.691759258f, -0.722128194f, + 0.690650714f, -0.723188489f, + 0.689540545f, -0.724247083f, + 0.688428753f, -0.725303972f, + 0.687315341f, -0.726359155f, + 0.686200312f, -0.727412629f, + 0.685083668f, -0.728464390f, + 0.683965412f, -0.729514438f, + 0.682845546f, -0.730562769f, + 0.681724074f, -0.731609381f, + 0.680600998f, -0.732654272f, + 0.679476320f, -0.733697438f, + 0.678350043f, -0.734738878f, + 0.677222170f, -0.735778589f, + 0.676092704f, -0.736816569f, + 0.674961646f, -0.737852815f, + 0.673829000f, -0.738887324f, + 0.672694769f, -0.739920095f, + 0.671558955f, -0.740951125f, + 0.670421560f, -0.741980412f, + 0.669282588f, -0.743007952f, + 0.668142041f, -0.744033744f, + 0.666999922f, -0.745057785f, + 0.665856234f, -0.746080074f, + 0.664710978f, -0.747100606f, + 0.663564159f, -0.748119380f, + 0.662415778f, -0.749136395f, + 0.661265838f, -0.750151646f, + 0.660114342f, -0.751165132f, + 0.658961293f, -0.752176850f, + 0.657806693f, -0.753186799f, + 0.656650546f, -0.754194975f, + 0.655492853f, -0.755201377f, + 0.654333618f, -0.756206001f, + 0.653172843f, -0.757208847f, + 0.652010531f, -0.758209910f, + 0.650846685f, -0.759209189f, + 0.649681307f, -0.760206682f, + 0.648514401f, -0.761202385f, + 0.647345969f, -0.762196298f, + 0.646176013f, -0.763188417f, + 0.645004537f, -0.764178741f, + 0.643831543f, -0.765167266f, + 0.642657034f, -0.766153990f, + 0.641481013f, -0.767138912f, + 0.640303482f, -0.768122029f, + 0.639124445f, -0.769103338f, + 0.637943904f, -0.770082837f, + 0.636761861f, -0.771060524f, + 0.635578320f, -0.772036397f, + 0.634393284f, -0.773010453f, + 0.633206755f, -0.773982691f, + 0.632018736f, -0.774953107f, + 0.630829230f, -0.775921699f, + 0.629638239f, -0.776888466f, + 0.628445767f, -0.777853404f, + 0.627251815f, -0.778816512f, + 0.626056388f, -0.779777788f, + 0.624859488f, -0.780737229f, + 0.623661118f, -0.781694832f, + 0.622461279f, -0.782650596f, + 0.621259977f, -0.783604519f, + 0.620057212f, -0.784556597f, + 0.618852988f, -0.785506830f, + 0.617647308f, -0.786455214f, + 0.616440175f, -0.787401747f, + 0.615231591f, -0.788346428f, + 0.614021559f, -0.789289253f, + 0.612810082f, -0.790230221f, + 0.611597164f, -0.791169330f, + 0.610382806f, -0.792106577f, + 0.609167012f, -0.793041960f, + 0.607949785f, -0.793975478f, + 0.606731127f, -0.794907126f, + 0.605511041f, -0.795836905f, + 0.604289531f, -0.796764810f, + 0.603066599f, -0.797690841f, + 0.601842247f, -0.798614995f, + 0.600616479f, -0.799537269f, + 0.599389298f, -0.800457662f, + 0.598160707f, -0.801376172f, + 0.596930708f, -0.802292796f, + 0.595699304f, -0.803207531f, + 0.594466499f, -0.804120377f, + 0.593232295f, -0.805031331f, + 0.591996695f, -0.805940391f, + 0.590759702f, -0.806847554f, + 0.589521319f, -0.807752818f, + 0.588281548f, -0.808656182f, + 0.587040394f, -0.809557642f, + 0.585797857f, -0.810457198f, + 0.584553943f, -0.811354847f, + 0.583308653f, -0.812250587f, + 0.582061990f, -0.813144415f, + 0.580813958f, -0.814036330f, + 0.579564559f, -0.814926329f, + 0.578313796f, -0.815814411f, + 0.577061673f, -0.816700573f, + 0.575808191f, -0.817584813f, + 0.574553355f, -0.818467130f, + 0.573297167f, -0.819347520f, + 0.572039629f, -0.820225983f, + 0.570780746f, -0.821102515f, + 0.569520519f, -0.821977115f, + 0.568258953f, -0.822849781f, + 0.566996049f, -0.823720511f, + 0.565731811f, -0.824589303f, + 0.564466242f, -0.825456154f, + 0.563199344f, -0.826321063f, + 0.561931121f, -0.827184027f, + 0.560661576f, -0.828045045f, + 0.559390712f, -0.828904115f, + 0.558118531f, -0.829761234f, + 0.556845037f, -0.830616400f, + 0.555570233f, -0.831469612f, + 0.554294121f, -0.832320868f, + 0.553016706f, -0.833170165f, + 0.551737988f, -0.834017501f, + 0.550457973f, -0.834862875f, + 0.549176662f, -0.835706284f, + 0.547894059f, -0.836547727f, + 0.546610167f, -0.837387202f, + 0.545324988f, -0.838224706f, + 0.544038527f, -0.839060237f, + 0.542750785f, -0.839893794f, + 0.541461766f, -0.840725375f, + 0.540171473f, -0.841554977f, + 0.538879909f, -0.842382600f, + 0.537587076f, -0.843208240f, + 0.536292979f, -0.844031895f, + 0.534997620f, -0.844853565f, + 0.533701002f, -0.845673247f, + 0.532403128f, -0.846490939f, + 0.531104001f, -0.847306639f, + 0.529803625f, -0.848120345f, + 0.528502002f, -0.848932055f, + 0.527199135f, -0.849741768f, + 0.525895027f, -0.850549481f, + 0.524589683f, -0.851355193f, + 0.523283103f, -0.852158902f, + 0.521975293f, -0.852960605f, + 0.520666254f, -0.853760301f, + 0.519355990f, -0.854557988f, + 0.518044504f, -0.855353665f, + 0.516731799f, -0.856147328f, + 0.515417878f, -0.856938977f, + 0.514102744f, -0.857728610f, + 0.512786401f, -0.858516224f, + 0.511468850f, -0.859301818f, + 0.510150097f, -0.860085390f, + 0.508830143f, -0.860866939f, + 0.507508991f, -0.861646461f, + 0.506186645f, -0.862423956f, + 0.504863109f, -0.863199422f, + 0.503538384f, -0.863972856f, + 0.502212474f, -0.864744258f, + 0.500885383f, -0.865513624f, + 0.499557113f, -0.866280954f, + 0.498227667f, -0.867046246f, + 0.496897049f, -0.867809497f, + 0.495565262f, -0.868570706f, + 0.494232309f, -0.869329871f, + 0.492898192f, -0.870086991f, + 0.491562916f, -0.870842063f, + 0.490226483f, -0.871595087f, + 0.488888897f, -0.872346059f, + 0.487550160f, -0.873094978f, + 0.486210276f, -0.873841843f, + 0.484869248f, -0.874586652f, + 0.483527079f, -0.875329403f, + 0.482183772f, -0.876070094f, + 0.480839331f, -0.876808724f, + 0.479493758f, -0.877545290f, + 0.478147056f, -0.878279792f, + 0.476799230f, -0.879012226f, + 0.475450282f, -0.879742593f, + 0.474100215f, -0.880470889f, + 0.472749032f, -0.881197113f, + 0.471396737f, -0.881921264f, + 0.470043332f, -0.882643340f, + 0.468688822f, -0.883363339f, + 0.467333209f, -0.884081259f, + 0.465976496f, -0.884797098f, + 0.464618686f, -0.885510856f, + 0.463259784f, -0.886222530f, + 0.461899791f, -0.886932119f, + 0.460538711f, -0.887639620f, + 0.459176548f, -0.888345033f, + 0.457813304f, -0.889048356f, + 0.456448982f, -0.889749586f, + 0.455083587f, -0.890448723f, + 0.453717121f, -0.891145765f, + 0.452349587f, -0.891840709f, + 0.450980989f, -0.892533555f, + 0.449611330f, -0.893224301f, + 0.448240612f, -0.893912945f, + 0.446868840f, -0.894599486f, + 0.445496017f, -0.895283921f, + 0.444122145f, -0.895966250f, + 0.442747228f, -0.896646470f, + 0.441371269f, -0.897324581f, + 0.439994271f, -0.898000580f, + 0.438616239f, -0.898674466f, + 0.437237174f, -0.899346237f, + 0.435857080f, -0.900015892f, + 0.434475961f, -0.900683429f, + 0.433093819f, -0.901348847f, + 0.431710658f, -0.902012144f, + 0.430326481f, -0.902673318f, + 0.428941292f, -0.903332368f, + 0.427555093f, -0.903989293f, + 0.426167889f, -0.904644091f, + 0.424779681f, -0.905296759f, + 0.423390474f, -0.905947298f, + 0.422000271f, -0.906595705f, + 0.420609074f, -0.907241978f, + 0.419216888f, -0.907886116f, + 0.417823716f, -0.908528119f, + 0.416429560f, -0.909167983f, + 0.415034424f, -0.909805708f, + 0.413638312f, -0.910441292f, + 0.412241227f, -0.911074734f, + 0.410843171f, -0.911706032f, + 0.409444149f, -0.912335185f, + 0.408044163f, -0.912962190f, + 0.406643217f, -0.913587048f, + 0.405241314f, -0.914209756f, + 0.403838458f, -0.914830312f, + 0.402434651f, -0.915448716f, + 0.401029897f, -0.916064966f, + 0.399624200f, -0.916679060f, + 0.398217562f, -0.917290997f, + 0.396809987f, -0.917900776f, + 0.395401479f, -0.918508394f, + 0.393992040f, -0.919113852f, + 0.392581674f, -0.919717146f, + 0.391170384f, -0.920318277f, + 0.389758174f, -0.920917242f, + 0.388345047f, -0.921514039f, + 0.386931006f, -0.922108669f, + 0.385516054f, -0.922701128f, + 0.384100195f, -0.923291417f, + 0.382683432f, -0.923879533f, + 0.381265769f, -0.924465474f, + 0.379847209f, -0.925049241f, + 0.378427755f, -0.925630831f, + 0.377007410f, -0.926210242f, + 0.375586178f, -0.926787474f, + 0.374164063f, -0.927362526f, + 0.372741067f, -0.927935395f, + 0.371317194f, -0.928506080f, + 0.369892447f, -0.929074581f, + 0.368466830f, -0.929640896f, + 0.367040346f, -0.930205023f, + 0.365612998f, -0.930766961f, + 0.364184790f, -0.931326709f, + 0.362755724f, -0.931884266f, + 0.361325806f, -0.932439629f, + 0.359895037f, -0.932992799f, + 0.358463421f, -0.933543773f, + 0.357030961f, -0.934092550f, + 0.355597662f, -0.934639130f, + 0.354163525f, -0.935183510f, + 0.352728556f, -0.935725689f, + 0.351292756f, -0.936265667f, + 0.349856130f, -0.936803442f, + 0.348418680f, -0.937339012f, + 0.346980411f, -0.937872376f, + 0.345541325f, -0.938403534f, + 0.344101426f, -0.938932484f, + 0.342660717f, -0.939459224f, + 0.341219202f, -0.939983753f, + 0.339776884f, -0.940506071f, + 0.338333767f, -0.941026175f, + 0.336889853f, -0.941544065f, + 0.335445147f, -0.942059740f, + 0.333999651f, -0.942573198f, + 0.332553370f, -0.943084437f, + 0.331106306f, -0.943593458f, + 0.329658463f, -0.944100258f, + 0.328209844f, -0.944604837f, + 0.326760452f, -0.945107193f, + 0.325310292f, -0.945607325f, + 0.323859367f, -0.946105232f, + 0.322407679f, -0.946600913f, + 0.320955232f, -0.947094366f, + 0.319502031f, -0.947585591f, + 0.318048077f, -0.948074586f, + 0.316593376f, -0.948561350f, + 0.315137929f, -0.949045882f, + 0.313681740f, -0.949528181f, + 0.312224814f, -0.950008245f, + 0.310767153f, -0.950486074f, + 0.309308760f, -0.950961666f, + 0.307849640f, -0.951435021f, + 0.306389795f, -0.951906137f, + 0.304929230f, -0.952375013f, + 0.303467947f, -0.952841648f, + 0.302005949f, -0.953306040f, + 0.300543241f, -0.953768190f, + 0.299079826f, -0.954228095f, + 0.297615707f, -0.954685755f, + 0.296150888f, -0.955141168f, + 0.294685372f, -0.955594334f, + 0.293219163f, -0.956045251f, + 0.291752263f, -0.956493919f, + 0.290284677f, -0.956940336f, + 0.288816408f, -0.957384501f, + 0.287347460f, -0.957826413f, + 0.285877835f, -0.958266071f, + 0.284407537f, -0.958703475f, + 0.282936570f, -0.959138622f, + 0.281464938f, -0.959571513f, + 0.279992643f, -0.960002146f, + 0.278519689f, -0.960430519f, + 0.277046080f, -0.960856633f, + 0.275571819f, -0.961280486f, + 0.274096910f, -0.961702077f, + 0.272621355f, -0.962121404f, + 0.271145160f, -0.962538468f, + 0.269668326f, -0.962953267f, + 0.268190857f, -0.963365800f, + 0.266712757f, -0.963776066f, + 0.265234030f, -0.964184064f, + 0.263754679f, -0.964589793f, + 0.262274707f, -0.964993253f, + 0.260794118f, -0.965394442f, + 0.259312915f, -0.965793359f, + 0.257831102f, -0.966190003f, + 0.256348682f, -0.966584374f, + 0.254865660f, -0.966976471f, + 0.253382037f, -0.967366292f, + 0.251897818f, -0.967753837f, + 0.250413007f, -0.968139105f, + 0.248927606f, -0.968522094f, + 0.247441619f, -0.968902805f, + 0.245955050f, -0.969281235f, + 0.244467903f, -0.969657385f, + 0.242980180f, -0.970031253f, + 0.241491885f, -0.970402839f, + 0.240003022f, -0.970772141f, + 0.238513595f, -0.971139158f, + 0.237023606f, -0.971503891f, + 0.235533059f, -0.971866337f, + 0.234041959f, -0.972226497f, + 0.232550307f, -0.972584369f, + 0.231058108f, -0.972939952f, + 0.229565366f, -0.973293246f, + 0.228072083f, -0.973644250f, + 0.226578264f, -0.973992962f, + 0.225083911f, -0.974339383f, + 0.223589029f, -0.974683511f, + 0.222093621f, -0.975025345f, + 0.220597690f, -0.975364885f, + 0.219101240f, -0.975702130f, + 0.217604275f, -0.976037079f, + 0.216106797f, -0.976369731f, + 0.214608811f, -0.976700086f, + 0.213110320f, -0.977028143f, + 0.211611327f, -0.977353900f, + 0.210111837f, -0.977677358f, + 0.208611852f, -0.977998515f, + 0.207111376f, -0.978317371f, + 0.205610413f, -0.978633924f, + 0.204108966f, -0.978948175f, + 0.202607039f, -0.979260123f, + 0.201104635f, -0.979569766f, + 0.199601758f, -0.979877104f, + 0.198098411f, -0.980182136f, + 0.196594598f, -0.980484862f, + 0.195090322f, -0.980785280f, + 0.193585587f, -0.981083391f, + 0.192080397f, -0.981379193f, + 0.190574755f, -0.981672686f, + 0.189068664f, -0.981963869f, + 0.187562129f, -0.982252741f, + 0.186055152f, -0.982539302f, + 0.184547737f, -0.982823551f, + 0.183039888f, -0.983105487f, + 0.181531608f, -0.983385110f, + 0.180022901f, -0.983662419f, + 0.178513771f, -0.983937413f, + 0.177004220f, -0.984210092f, + 0.175494253f, -0.984480455f, + 0.173983873f, -0.984748502f, + 0.172473084f, -0.985014231f, + 0.170961889f, -0.985277642f, + 0.169450291f, -0.985538735f, + 0.167938295f, -0.985797509f, + 0.166425904f, -0.986053963f, + 0.164913120f, -0.986308097f, + 0.163399949f, -0.986559910f, + 0.161886394f, -0.986809402f, + 0.160372457f, -0.987056571f, + 0.158858143f, -0.987301418f, + 0.157343456f, -0.987543942f, + 0.155828398f, -0.987784142f, + 0.154312973f, -0.988022017f, + 0.152797185f, -0.988257568f, + 0.151281038f, -0.988490793f, + 0.149764535f, -0.988721692f, + 0.148247679f, -0.988950265f, + 0.146730474f, -0.989176510f, + 0.145212925f, -0.989400428f, + 0.143695033f, -0.989622017f, + 0.142176804f, -0.989841278f, + 0.140658239f, -0.990058210f, + 0.139139344f, -0.990272812f, + 0.137620122f, -0.990485084f, + 0.136100575f, -0.990695025f, + 0.134580709f, -0.990902635f, + 0.133060525f, -0.991107914f, + 0.131540029f, -0.991310860f, + 0.130019223f, -0.991511473f, + 0.128498111f, -0.991709754f, + 0.126976696f, -0.991905700f, + 0.125454983f, -0.992099313f, + 0.123932975f, -0.992290591f, + 0.122410675f, -0.992479535f, + 0.120888087f, -0.992666142f, + 0.119365215f, -0.992850414f, + 0.117842062f, -0.993032350f, + 0.116318631f, -0.993211949f, + 0.114794927f, -0.993389211f, + 0.113270952f, -0.993564136f, + 0.111746711f, -0.993736722f, + 0.110222207f, -0.993906970f, + 0.108697444f, -0.994074879f, + 0.107172425f, -0.994240449f, + 0.105647154f, -0.994403680f, + 0.104121634f, -0.994564571f, + 0.102595869f, -0.994723121f, + 0.101069863f, -0.994879331f, + 0.099543619f, -0.995033199f, + 0.098017140f, -0.995184727f, + 0.096490431f, -0.995333912f, + 0.094963495f, -0.995480755f, + 0.093436336f, -0.995625256f, + 0.091908956f, -0.995767414f, + 0.090381361f, -0.995907229f, + 0.088853553f, -0.996044701f, + 0.087325535f, -0.996179829f, + 0.085797312f, -0.996312612f, + 0.084268888f, -0.996443051f, + 0.082740265f, -0.996571146f, + 0.081211447f, -0.996696895f, + 0.079682438f, -0.996820299f, + 0.078153242f, -0.996941358f, + 0.076623861f, -0.997060070f, + 0.075094301f, -0.997176437f, + 0.073564564f, -0.997290457f, + 0.072034653f, -0.997402130f, + 0.070504573f, -0.997511456f, + 0.068974328f, -0.997618435f, + 0.067443920f, -0.997723067f, + 0.065913353f, -0.997825350f, + 0.064382631f, -0.997925286f, + 0.062851758f, -0.998022874f, + 0.061320736f, -0.998118113f, + 0.059789571f, -0.998211003f, + 0.058258265f, -0.998301545f, + 0.056726821f, -0.998389737f, + 0.055195244f, -0.998475581f, + 0.053663538f, -0.998559074f, + 0.052131705f, -0.998640218f, + 0.050599749f, -0.998719012f, + 0.049067674f, -0.998795456f, + 0.047535484f, -0.998869550f, + 0.046003182f, -0.998941293f, + 0.044470772f, -0.999010686f, + 0.042938257f, -0.999077728f, + 0.041405641f, -0.999142419f, + 0.039872928f, -0.999204759f, + 0.038340120f, -0.999264747f, + 0.036807223f, -0.999322385f, + 0.035274239f, -0.999377670f, + 0.033741172f, -0.999430605f, + 0.032208025f, -0.999481187f, + 0.030674803f, -0.999529418f, + 0.029141509f, -0.999575296f, + 0.027608146f, -0.999618822f, + 0.026074718f, -0.999659997f, + 0.024541229f, -0.999698819f, + 0.023007681f, -0.999735288f, + 0.021474080f, -0.999769405f, + 0.019940429f, -0.999801170f, + 0.018406730f, -0.999830582f, + 0.016872988f, -0.999857641f, + 0.015339206f, -0.999882347f, + 0.013805389f, -0.999904701f, + 0.012271538f, -0.999924702f, + 0.010737659f, -0.999942350f, + 0.009203755f, -0.999957645f, + 0.007669829f, -0.999970586f, + 0.006135885f, -0.999981175f, + 0.004601926f, -0.999989411f, + 0.003067957f, -0.999995294f, + 0.001533980f, -0.999998823f +}; + +#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALL_TABLES) */ + +/** + @ingroup RealFFT + */ + +/** + @addtogroup RealFFT_Table Real FFT Tables + @{ + */ + +/** + @par + Generation of realCoefA array: + @par + n = 4096 +
for (i = 0; i < n; i++)
+  {
+     pATable[2 * i]     = 0.5 * ( 1.0 - sin (2 * PI / (double) (2 * n) * (double) i));
+     pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
+  }
+ */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_F32) +const float32_t realCoefA[8192] = { + 0.500000000000000f, -0.500000000000000f, 0.499616503715515f, -0.499999850988388f, + 0.499233007431030f, -0.499999403953552f, 0.498849511146545f, -0.499998688697815f, + 0.498466014862061f, -0.499997645616531f, 0.498082518577576f, -0.499996334314346f, + 0.497699022293091f, -0.499994695186615f, 0.497315555810928f, -0.499992787837982f, + 0.496932059526443f, -0.499990582466125f, 0.496548563241959f, -0.499988079071045f, + 0.496165096759796f, -0.499985307455063f, 0.495781600475311f, -0.499982208013535f, + 0.495398133993149f, -0.499978810548782f, 0.495014637708664f, -0.499975144863129f, + 0.494631171226501f, -0.499971181154251f, 0.494247704744339f, -0.499966919422150f, + 0.493864238262177f, -0.499962359666824f, 0.493480771780014f, -0.499957501888275f, + 0.493097305297852f, -0.499952346086502f, 0.492713838815689f, -0.499946922063828f, + 0.492330402135849f, -0.499941170215607f, 0.491946935653687f, -0.499935150146484f, + 0.491563498973846f, -0.499928832054138f, 0.491180062294006f, -0.499922215938568f, + 0.490796625614166f, -0.499915301799774f, 0.490413218736649f, -0.499908089637756f, + 0.490029782056808f, -0.499900579452515f, 0.489646375179291f, -0.499892801046371f, + 0.489262968301773f, -0.499884694814682f, 0.488879561424255f, -0.499876320362091f, + 0.488496154546738f, -0.499867647886276f, 0.488112777471542f, -0.499858677387238f, + 0.487729400396347f, -0.499849408864975f, 0.487346023321152f, -0.499839842319489f, + 0.486962646245956f, -0.499830007553101f, 0.486579269170761f, -0.499819844961166f, + 0.486195921897888f, -0.499809414148331f, 0.485812574625015f, -0.499798685312271f, + 0.485429257154465f, -0.499787658452988f, 0.485045909881592f, -0.499776333570480f, + 0.484662592411041f, -0.499764710664749f, 0.484279274940491f, -0.499752789735794f, + 0.483895987272263f, -0.499740600585938f, 0.483512699604034f, -0.499728083610535f, + 0.483129411935806f, -0.499715298414230f, 0.482746154069901f, -0.499702215194702f, + 0.482362866401672f, -0.499688833951950f, 0.481979638338089f, -0.499675154685974f, + 0.481596380472183f, -0.499661177396774f, 0.481213152408600f, -0.499646931886673f, + 0.480829954147339f, -0.499632388353348f, 0.480446726083755f, -0.499617516994476f, + 0.480063527822495f, -0.499602377414703f, 0.479680359363556f, -0.499586939811707f, + 0.479297190904617f, -0.499571204185486f, 0.478914022445679f, -0.499555170536041f, + 0.478530883789063f, -0.499538868665695f, 0.478147745132446f, -0.499522238969803f, + 0.477764606475830f, -0.499505341053009f, 0.477381497621536f, -0.499488145112991f, + 0.476998418569565f, -0.499470651149750f, 0.476615339517593f, -0.499452859163284f, + 0.476232260465622f, -0.499434769153595f, 0.475849211215973f, -0.499416410923004f, + 0.475466161966324f, -0.499397724866867f, 0.475083142518997f, -0.499378770589828f, + 0.474700123071671f, -0.499359518289566f, 0.474317133426666f, -0.499339967966080f, + 0.473934143781662f, -0.499320119619370f, 0.473551183938980f, -0.499299973249435f, + 0.473168224096298f, -0.499279528856277f, 0.472785294055939f, -0.499258816242218f, + 0.472402364015579f, -0.499237775802612f, 0.472019463777542f, -0.499216467142105f, + 0.471636593341827f, -0.499194860458374f, 0.471253722906113f, -0.499172955751419f, + 0.470870882272720f, -0.499150782823563f, 0.470488041639328f, -0.499128282070160f, + 0.470105201005936f, -0.499105513095856f, 0.469722419977188f, -0.499082416296005f, + 0.469339638948441f, -0.499059051275253f, 0.468956857919693f, -0.499035388231277f, + 0.468574106693268f, -0.499011427164078f, 0.468191385269165f, -0.498987197875977f, + 0.467808693647385f, -0.498962640762329f, 0.467426002025604f, -0.498937815427780f, + 0.467043310403824f, -0.498912662267685f, 0.466660678386688f, -0.498887240886688f, + 0.466278046369553f, -0.498861521482468f, 0.465895414352417f, -0.498835533857346f, + 0.465512841939926f, -0.498809218406677f, 0.465130269527435f, -0.498782604932785f, + 0.464747726917267f, -0.498755723237991f, 0.464365184307098f, -0.498728543519974f, + 0.463982671499252f, -0.498701065778732f, 0.463600188493729f, -0.498673290014267f, + 0.463217705488205f, -0.498645216226578f, 0.462835282087326f, -0.498616874217987f, + 0.462452858686447f, -0.498588204383850f, 0.462070435285568f, -0.498559266328812f, + 0.461688071489334f, -0.498530030250549f, 0.461305707693100f, -0.498500496149063f, + 0.460923373699188f, -0.498470664024353f, 0.460541069507599f, -0.498440563678741f, + 0.460158795118332f, -0.498410135507584f, 0.459776520729065f, -0.498379439115524f, + 0.459394276142120f, -0.498348444700241f, 0.459012061357498f, -0.498317152261734f, + 0.458629876375198f, -0.498285561800003f, 0.458247691392899f, -0.498253703117371f, + 0.457865566015244f, -0.498221516609192f, 0.457483440637589f, -0.498189061880112f, + 0.457101345062256f, -0.498156309127808f, 0.456719279289246f, -0.498123258352280f, + 0.456337243318558f, -0.498089909553528f, 0.455955207347870f, -0.498056292533875f, + 0.455573230981827f, -0.498022347688675f, 0.455191254615784f, -0.497988134622574f, + 0.454809308052063f, -0.497953623533249f, 0.454427421092987f, -0.497918814420700f, + 0.454045534133911f, -0.497883707284927f, 0.453663676977158f, -0.497848302125931f, + 0.453281819820404f, -0.497812628746033f, 0.452900022268295f, -0.497776657342911f, + 0.452518254518509f, -0.497740387916565f, 0.452136516571045f, -0.497703820466995f, + 0.451754778623581f, -0.497666954994202f, 0.451373100280762f, -0.497629791498184f, + 0.450991421937943f, -0.497592359781265f, 0.450609803199768f, -0.497554630041122f, + 0.450228184461594f, -0.497516602277756f, 0.449846625328064f, -0.497478276491165f, + 0.449465066194534f, -0.497439652681351f, 0.449083566665649f, -0.497400760650635f, + 0.448702067136765f, -0.497361570596695f, 0.448320597410202f, -0.497322082519531f, + 0.447939187288284f, -0.497282296419144f, 0.447557777166367f, -0.497242212295532f, + 0.447176426649094f, -0.497201830148697f, 0.446795076131821f, -0.497161179780960f, + 0.446413785219193f, -0.497120231389999f, 0.446032524108887f, -0.497078984975815f, + 0.445651292800903f, -0.497037440538406f, 0.445270061492920f, -0.496995598077774f, + 0.444888889789581f, -0.496953487396240f, 0.444507747888565f, -0.496911078691483f, + 0.444126635789871f, -0.496868371963501f, 0.443745553493500f, -0.496825367212296f, + 0.443364530801773f, -0.496782064437866f, 0.442983508110046f, -0.496738493442535f, + 0.442602545022964f, -0.496694594621658f, 0.442221581935883f, -0.496650427579880f, + 0.441840678453445f, -0.496605962514877f, 0.441459804773331f, -0.496561229228973f, + 0.441078960895538f, -0.496516168117523f, 0.440698176622391f, -0.496470838785172f, + 0.440317392349243f, -0.496425211429596f, 0.439936667680740f, -0.496379286050797f, + 0.439555943012238f, -0.496333062648773f, 0.439175277948380f, -0.496286571025848f, + 0.438794672489166f, -0.496239781379700f, 0.438414067029953f, -0.496192663908005f, + 0.438033521175385f, -0.496145308017731f, 0.437653005123138f, -0.496097624301910f, + 0.437272518873215f, -0.496049642562866f, 0.436892062425613f, -0.496001392602921f, + 0.436511665582657f, -0.495952844619751f, 0.436131268739700f, -0.495903998613358f, + 0.435750931501389f, -0.495854884386063f, 0.435370653867722f, -0.495805442333221f, + 0.434990376234055f, -0.495755732059479f, 0.434610158205032f, -0.495705723762512f, + 0.434229999780655f, -0.495655417442322f, 0.433849841356277f, -0.495604842901230f, + 0.433469742536545f, -0.495553970336914f, 0.433089673519135f, -0.495502769947052f, + 0.432709634304047f, -0.495451331138611f, 0.432329654693604f, -0.495399564504623f, + 0.431949704885483f, -0.495347499847412f, 0.431569814682007f, -0.495295166969299f, + 0.431189924478531f, -0.495242536067963f, 0.430810123682022f, -0.495189607143402f, + 0.430430322885513f, -0.495136409997940f, 0.430050581693649f, -0.495082914829254f, + 0.429670870304108f, -0.495029091835022f, 0.429291218519211f, -0.494975030422211f, + 0.428911596536636f, -0.494920641183853f, 0.428532034158707f, -0.494865983724594f, + 0.428152471780777f, -0.494810998439789f, 0.427772998809814f, -0.494755744934082f, + 0.427393525838852f, -0.494700223207474f, 0.427014142274857f, -0.494644373655319f, + 0.426634758710861f, -0.494588255882263f, 0.426255434751511f, -0.494531840085983f, + 0.425876170396805f, -0.494475126266479f, 0.425496935844421f, -0.494418144226074f, + 0.425117731094360f, -0.494360834360123f, 0.424738585948944f, -0.494303256273270f, + 0.424359470605850f, -0.494245409965515f, 0.423980414867401f, -0.494187235832214f, + 0.423601418733597f, -0.494128793478012f, 0.423222452402115f, -0.494070053100586f, + 0.422843515872955f, -0.494011014699936f, 0.422464638948441f, -0.493951678276062f, + 0.422085791826248f, -0.493892073631287f, 0.421707004308701f, -0.493832170963287f, + 0.421328276395798f, -0.493771970272064f, 0.420949578285217f, -0.493711471557617f, + 0.420570939779282f, -0.493650704622269f, 0.420192331075668f, -0.493589639663696f, + 0.419813781976700f, -0.493528276681900f, 0.419435262680054f, -0.493466645479202f, + 0.419056802988052f, -0.493404686450958f, 0.418678402900696f, -0.493342459201813f, + 0.418300032615662f, -0.493279963731766f, 0.417921721935272f, -0.493217140436172f, + 0.417543441057205f, -0.493154048919678f, 0.417165219783783f, -0.493090659379959f, + 0.416787058115005f, -0.493026971817017f, 0.416408926248550f, -0.492963016033173f, + 0.416030853986740f, -0.492898762226105f, 0.415652841329575f, -0.492834210395813f, + 0.415274858474731f, -0.492769360542297f, 0.414896935224533f, -0.492704242467880f, + 0.414519041776657f, -0.492638826370239f, 0.414141237735748f, -0.492573112249374f, + 0.413763463497162f, -0.492507129907608f, 0.413385748863220f, -0.492440819740295f, + 0.413008064031601f, -0.492374241352081f, 0.412630438804626f, -0.492307394742966f, + 0.412252873182297f, -0.492240220308304f, 0.411875367164612f, -0.492172777652740f, + 0.411497890949249f, -0.492105036973953f, 0.411120474338531f, -0.492037028074265f, + 0.410743117332459f, -0.491968721151352f, 0.410365819931030f, -0.491900116205215f, + 0.409988552331924f, -0.491831213235855f, 0.409611344337463f, -0.491762012243271f, + 0.409234195947647f, -0.491692543029785f, 0.408857107162476f, -0.491622805595398f, + 0.408480048179626f, -0.491552740335464f, 0.408103078603745f, -0.491482406854630f, + 0.407726138830185f, -0.491411775350571f, 0.407349258661270f, -0.491340845823288f, + 0.406972438097000f, -0.491269648075104f, 0.406595647335052f, -0.491198152303696f, + 0.406218945980072f, -0.491126358509064f, 0.405842274427414f, -0.491054296493530f, + 0.405465662479401f, -0.490981936454773f, 0.405089110136032f, -0.490909278392792f, + 0.404712617397308f, -0.490836352109909f, 0.404336184263229f, -0.490763127803802f, + 0.403959810733795f, -0.490689605474472f, 0.403583467006683f, -0.490615785121918f, + 0.403207212686539f, -0.490541696548462f, 0.402830988168716f, -0.490467309951782f, + 0.402454853057861f, -0.490392625331879f, 0.402078747749329f, -0.490317672491074f, + 0.401702702045441f, -0.490242421627045f, 0.401326715946198f, -0.490166902542114f, + 0.400950789451599f, -0.490091055631638f, 0.400574922561646f, -0.490014940500259f, + 0.400199115276337f, -0.489938557147980f, 0.399823367595673f, -0.489861875772476f, + 0.399447679519653f, -0.489784896373749f, 0.399072051048279f, -0.489707618951797f, + 0.398696482181549f, -0.489630073308945f, 0.398320972919464f, -0.489552229642868f, + 0.397945523262024f, -0.489474087953568f, 0.397570133209229f, -0.489395678043365f, + 0.397194802761078f, -0.489316970109940f, 0.396819531917572f, -0.489237964153290f, + 0.396444320678711f, -0.489158689975739f, 0.396069169044495f, -0.489079117774963f, + 0.395694077014923f, -0.488999247550964f, 0.395319044589996f, -0.488919109106064f, + 0.394944071769714f, -0.488838672637939f, 0.394569188356400f, -0.488757967948914f, + 0.394194334745407f, -0.488676935434341f, 0.393819570541382f, -0.488595664501190f, + 0.393444836139679f, -0.488514065742493f, 0.393070191144943f, -0.488432198762894f, + 0.392695605754852f, -0.488350033760071f, 0.392321079969406f, -0.488267600536346f, + 0.391946613788605f, -0.488184869289398f, 0.391572207212448f, -0.488101840019226f, + 0.391197860240936f, -0.488018542528152f, 0.390823602676392f, -0.487934947013855f, + 0.390449374914169f, -0.487851053476334f, 0.390075236558914f, -0.487766891717911f, + 0.389701157808304f, -0.487682431936264f, 0.389327138662338f, -0.487597703933716f, + 0.388953179121017f, -0.487512677907944f, 0.388579308986664f, -0.487427353858948f, + 0.388205498456955f, -0.487341761589050f, 0.387831717729568f, -0.487255871295929f, + 0.387458056211472f, -0.487169682979584f, 0.387084424495697f, -0.487083226442337f, + 0.386710882186890f, -0.486996471881866f, 0.386337369680405f, -0.486909449100494f, + 0.385963946580887f, -0.486822128295898f, 0.385590612888336f, -0.486734509468079f, + 0.385217308998108f, -0.486646622419357f, 0.384844094514847f, -0.486558437347412f, + 0.384470939636230f, -0.486469984054565f, 0.384097874164581f, -0.486381232738495f, + 0.383724838495255f, -0.486292183399200f, 0.383351892232895f, -0.486202865839005f, + 0.382979035377502f, -0.486113250255585f, 0.382606208324432f, -0.486023366451263f, + 0.382233470678329f, -0.485933154821396f, 0.381860792636871f, -0.485842704772949f, + 0.381488204002380f, -0.485751956701279f, 0.381115674972534f, -0.485660910606384f, + 0.380743205547333f, -0.485569566488266f, 0.380370795726776f, -0.485477954149246f, + 0.379998475313187f, -0.485386073589325f, 0.379626244306564f, -0.485293895006180f, + 0.379254043102264f, -0.485201418399811f, 0.378881961107254f, -0.485108673572540f, + 0.378509908914566f, -0.485015630722046f, 0.378137946128845f, -0.484922289848328f, + 0.377766042947769f, -0.484828680753708f, 0.377394229173660f, -0.484734803438187f, + 0.377022475004196f, -0.484640628099442f, 0.376650810241699f, -0.484546154737473f, + 0.376279205083847f, -0.484451413154602f, 0.375907659530640f, -0.484356373548508f, + 0.375536203384399f, -0.484261035919189f, 0.375164806842804f, -0.484165430068970f, + 0.374793499708176f, -0.484069555997849f, 0.374422252178192f, -0.483973383903503f, + 0.374051094055176f, -0.483876913785934f, 0.373679995536804f, -0.483780175447464f, + 0.373308986425400f, -0.483683139085770f, 0.372938036918640f, -0.483585834503174f, + 0.372567176818848f, -0.483488231897354f, 0.372196376323700f, -0.483390361070633f, + 0.371825665235519f, -0.483292192220688f, 0.371455013751984f, -0.483193725347519f, + 0.371084451675415f, -0.483094990253448f, 0.370713949203491f, -0.482995986938477f, + 0.370343536138535f, -0.482896685600281f, 0.369973212480545f, -0.482797086238861f, + 0.369602948427200f, -0.482697218656540f, 0.369232743978500f, -0.482597053050995f, + 0.368862658739090f, -0.482496619224548f, 0.368492603302002f, -0.482395917177200f, + 0.368122667074203f, -0.482294887304306f, 0.367752790451050f, -0.482193619012833f, + 0.367382973432541f, -0.482092022895813f, 0.367013275623322f, -0.481990188360214f, + 0.366643607616425f, -0.481888025999069f, 0.366274058818817f, -0.481785595417023f, + 0.365904569625854f, -0.481682896614075f, 0.365535169839859f, -0.481579899787903f, + 0.365165829658508f, -0.481476634740829f, 0.364796578884125f, -0.481373071670532f, + 0.364427417516708f, -0.481269240379334f, 0.364058345556259f, -0.481165111064911f, + 0.363689333200455f, -0.481060713529587f, 0.363320380449295f, -0.480956017971039f, + 0.362951546907425f, -0.480851024389267f, 0.362582772970200f, -0.480745792388916f, + 0.362214088439941f, -0.480640232563019f, 0.361845493316650f, -0.480534434318542f, + 0.361476957798004f, -0.480428308248520f, 0.361108511686325f, -0.480321943759918f, + 0.360740154981613f, -0.480215251445770f, 0.360371887683868f, -0.480108320713043f, + 0.360003679990768f, -0.480001062154770f, 0.359635561704636f, -0.479893565177917f, + 0.359267532825470f, -0.479785770177841f, 0.358899593353271f, -0.479677677154541f, + 0.358531713485718f, -0.479569315910339f, 0.358163923025131f, -0.479460656642914f, + 0.357796221971512f, -0.479351729154587f, 0.357428610324860f, -0.479242533445358f, + 0.357061088085175f, -0.479133039712906f, 0.356693625450134f, -0.479023247957230f, + 0.356326282024384f, -0.478913217782974f, 0.355958998203278f, -0.478802859783173f, + 0.355591803789139f, -0.478692263364792f, 0.355224698781967f, -0.478581339120865f, + 0.354857653379440f, -0.478470176458359f, 0.354490727186203f, -0.478358715772629f, + 0.354123860597610f, -0.478246957063675f, 0.353757113218308f, -0.478134930133820f, + 0.353390425443649f, -0.478022634983063f, 0.353023827075958f, -0.477910041809082f, + 0.352657318115234f, -0.477797180414200f, 0.352290898561478f, -0.477684020996094f, + 0.351924568414688f, -0.477570593357086f, 0.351558297872543f, -0.477456867694855f, + 0.351192146539688f, -0.477342873811722f, 0.350826084613800f, -0.477228611707687f, + 0.350460082292557f, -0.477114051580429f, 0.350094199180603f, -0.476999223232269f, + 0.349728375673294f, -0.476884096860886f, 0.349362671375275f, -0.476768702268600f, + 0.348997026681900f, -0.476653009653091f, 0.348631471395493f, -0.476537048816681f, + 0.348266035318375f, -0.476420819759369f, 0.347900658845901f, -0.476304292678833f, + 0.347535371780396f, -0.476187497377396f, 0.347170203924179f, -0.476070433855057f, + 0.346805095672607f, -0.475953072309494f, 0.346440106630325f, -0.475835442543030f, + 0.346075177192688f, -0.475717514753342f, 0.345710366964340f, -0.475599318742752f, + 0.345345616340637f, -0.475480824708939f, 0.344980984926224f, -0.475362062454224f, + 0.344616413116455f, -0.475243031978607f, 0.344251960515976f, -0.475123733282089f, + 0.343887597322464f, -0.475004136562347f, 0.343523323535919f, -0.474884241819382f, + 0.343159139156342f, -0.474764078855515f, 0.342795044183731f, -0.474643647670746f, + 0.342431038618088f, -0.474522948265076f, 0.342067122459412f, -0.474401950836182f, + 0.341703325510025f, -0.474280685186386f, 0.341339588165283f, -0.474159121513367f, + 0.340975970029831f, -0.474037289619446f, 0.340612411499023f, -0.473915189504623f, + 0.340248972177505f, -0.473792791366577f, 0.339885622262955f, -0.473670125007629f, + 0.339522391557693f, -0.473547190427780f, 0.339159220457077f, -0.473423957824707f, + 0.338796168565750f, -0.473300457000732f, 0.338433176279068f, -0.473176687955856f, + 0.338070303201675f, -0.473052620887756f, 0.337707549333572f, -0.472928285598755f, + 0.337344855070114f, -0.472803652286530f, 0.336982280015945f, -0.472678780555725f, + 0.336619764566422f, -0.472553610801697f, 0.336257368326187f, -0.472428143024445f, + 0.335895091295242f, -0.472302407026291f, 0.335532873868942f, -0.472176402807236f, + 0.335170775651932f, -0.472050130367279f, 0.334808766841888f, -0.471923559904099f, + 0.334446847438812f, -0.471796721220016f, 0.334085017442703f, -0.471669614315033f, + 0.333723306655884f, -0.471542209386826f, 0.333361685276031f, -0.471414536237717f, + 0.333000183105469f, -0.471286594867706f, 0.332638740539551f, -0.471158385276794f, + 0.332277417182922f, -0.471029877662659f, 0.331916213035584f, -0.470901101827621f, + 0.331555068492889f, -0.470772027969360f, 0.331194043159485f, -0.470642685890198f, + 0.330833107233047f, -0.470513075590134f, 0.330472290515900f, -0.470383197069168f, + 0.330111563205719f, -0.470253020524979f, 0.329750925302505f, -0.470122605562210f, + 0.329390406608582f, -0.469991862773895f, 0.329029977321625f, -0.469860881567001f, + 0.328669637441635f, -0.469729602336884f, 0.328309416770935f, -0.469598054885864f, + 0.327949285507202f, -0.469466239213943f, 0.327589273452759f, -0.469334155321121f, + 0.327229350805283f, -0.469201773405075f, 0.326869517564774f, -0.469069123268127f, + 0.326509803533554f, -0.468936175107956f, 0.326150178909302f, -0.468802988529205f, + 0.325790673494339f, -0.468669503927231f, 0.325431257486343f, -0.468535751104355f, + 0.325071930885315f, -0.468401730060577f, 0.324712723493576f, -0.468267410993576f, + 0.324353635311127f, -0.468132823705673f, 0.323994606733322f, -0.467997968196869f, + 0.323635727167130f, -0.467862844467163f, 0.323276937007904f, -0.467727422714233f, + 0.322918236255646f, -0.467591762542725f, 0.322559654712677f, -0.467455804347992f, + 0.322201162576675f, -0.467319577932358f, 0.321842789649963f, -0.467183053493500f, + 0.321484506130219f, -0.467046260833740f, 0.321126341819763f, -0.466909229755402f, + 0.320768296718597f, -0.466771900653839f, 0.320410341024399f, -0.466634273529053f, + 0.320052474737167f, -0.466496407985687f, 0.319694727659225f, -0.466358244419098f, + 0.319337099790573f, -0.466219812631607f, 0.318979561328888f, -0.466081112623215f, + 0.318622142076492f, -0.465942144393921f, 0.318264812231064f, -0.465802878141403f, + 0.317907601594925f, -0.465663343667984f, 0.317550510168076f, -0.465523540973663f, + 0.317193508148193f, -0.465383470058441f, 0.316836595535278f, -0.465243130922318f, + 0.316479831933975f, -0.465102523565292f, 0.316123157739639f, -0.464961618185043f, + 0.315766572952271f, -0.464820444583893f, 0.315410137176514f, -0.464679002761841f, + 0.315053790807724f, -0.464537292718887f, 0.314697533845901f, -0.464395314455032f, + 0.314341396093369f, -0.464253038167953f, 0.313985377550125f, -0.464110493659973f, + 0.313629478216171f, -0.463967710733414f, 0.313273668289185f, -0.463824629783630f, + 0.312917977571487f, -0.463681250810623f, 0.312562376260757f, -0.463537633419037f, + 0.312206923961639f, -0.463393747806549f, 0.311851561069489f, -0.463249564170837f, + 0.311496287584305f, -0.463105112314224f, 0.311141163110733f, -0.462960392236710f, + 0.310786128044128f, -0.462815403938293f, 0.310431212186813f, -0.462670147418976f, + 0.310076385736465f, -0.462524622678757f, 0.309721708297729f, -0.462378799915314f, + 0.309367120265961f, -0.462232738733292f, 0.309012651443481f, -0.462086379528046f, + 0.308658272027969f, -0.461939752101898f, 0.308304041624069f, -0.461792886257172f, + 0.307949900627136f, -0.461645722389221f, 0.307595878839493f, -0.461498260498047f, + 0.307241976261139f, -0.461350560188293f, 0.306888192892075f, -0.461202591657639f, + 0.306534498929977f, -0.461054325103760f, 0.306180924177170f, -0.460905820131302f, + 0.305827468633652f, -0.460757017135620f, 0.305474132299423f, -0.460607945919037f, + 0.305120915174484f, -0.460458606481552f, 0.304767817258835f, -0.460309028625488f, + 0.304414808750153f, -0.460159152746201f, 0.304061919450760f, -0.460008978843689f, + 0.303709149360657f, -0.459858566522598f, 0.303356528282166f, -0.459707885980606f, + 0.303003966808319f, -0.459556937217712f, 0.302651554346085f, -0.459405690431595f, + 0.302299261093140f, -0.459254205226898f, 0.301947087049484f, -0.459102421998978f, + 0.301595002412796f, -0.458950400352478f, 0.301243066787720f, -0.458798080682755f, + 0.300891220569611f, -0.458645492792130f, 0.300539493560791f, -0.458492636680603f, + 0.300187885761261f, -0.458339542150497f, 0.299836426973343f, -0.458186149597168f, + 0.299485057592392f, -0.458032488822937f, 0.299133807420731f, -0.457878559827805f, + 0.298782676458359f, -0.457724362611771f, 0.298431664705276f, -0.457569897174835f, + 0.298080772161484f, -0.457415163516998f, 0.297729998826981f, -0.457260161638260f, + 0.297379344701767f, -0.457104891538620f, 0.297028809785843f, -0.456949323415756f, + 0.296678394079208f, -0.456793516874313f, 0.296328097581863f, -0.456637442111969f, + 0.295977920293808f, -0.456481099128723f, 0.295627862215042f, -0.456324487924576f, + 0.295277923345566f, -0.456167578697205f, 0.294928103685379f, -0.456010431051254f, + 0.294578403234482f, -0.455853015184402f, 0.294228851795197f, -0.455695331096649f, + 0.293879389762878f, -0.455537378787994f, 0.293530046939850f, -0.455379128456116f, + 0.293180853128433f, -0.455220639705658f, 0.292831748723984f, -0.455061882734299f, + 0.292482793331146f, -0.454902857542038f, 0.292133957147598f, -0.454743564128876f, + 0.291785210371017f, -0.454584002494812f, 0.291436612606049f, -0.454424172639847f, + 0.291088134050369f, -0.454264044761658f, 0.290739774703979f, -0.454103678464890f, + 0.290391564369202f, -0.453943043947220f, 0.290043443441391f, -0.453782171010971f, + 0.289695471525192f, -0.453621000051498f, 0.289347589015961f, -0.453459560871124f, + 0.288999855518341f, -0.453297853469849f, 0.288652241230011f, -0.453135877847672f, + 0.288304775953293f, -0.452973634004593f, 0.287957400083542f, -0.452811151742935f, + 0.287610173225403f, -0.452648371458054f, 0.287263035774231f, -0.452485352754593f, + 0.286916047334671f, -0.452322036027908f, 0.286569178104401f, -0.452158480882645f, + 0.286222457885742f, -0.451994657516479f, 0.285875827074051f, -0.451830536127090f, + 0.285529345273972f, -0.451666176319122f, 0.285182982683182f, -0.451501548290253f, + 0.284836769104004f, -0.451336652040482f, 0.284490644931793f, -0.451171487569809f, + 0.284144669771194f, -0.451006084680557f, 0.283798813819885f, -0.450840383768082f, + 0.283453077077866f, -0.450674414634705f, 0.283107489347458f, -0.450508207082748f, + 0.282762020826340f, -0.450341701507568f, 0.282416671514511f, -0.450174957513809f, + 0.282071471214294f, -0.450007945299149f, 0.281726360321045f, -0.449840664863586f, + 0.281381398439407f, -0.449673116207123f, 0.281036585569382f, -0.449505299329758f, + 0.280691891908646f, -0.449337244033813f, 0.280347317457199f, -0.449168890714645f, + 0.280002862215042f, -0.449000298976898f, 0.279658555984497f, -0.448831409215927f, + 0.279314368963242f, -0.448662281036377f, 0.278970301151276f, -0.448492884635925f, + 0.278626382350922f, -0.448323249816895f, 0.278282582759857f, -0.448153316974640f, + 0.277938932180405f, -0.447983115911484f, 0.277595400810242f, -0.447812676429749f, + 0.277251988649368f, -0.447641968727112f, 0.276908725500107f, -0.447470992803574f, + 0.276565581560135f, -0.447299748659134f, 0.276222556829453f, -0.447128236293793f, + 0.275879681110382f, -0.446956485509872f, 0.275536954402924f, -0.446784436702728f, + 0.275194346904755f, -0.446612149477005f, 0.274851858615875f, -0.446439594030380f, + 0.274509519338608f, -0.446266770362854f, 0.274167299270630f, -0.446093708276749f, + 0.273825198411942f, -0.445920348167419f, 0.273483246564865f, -0.445746749639511f, + 0.273141443729401f, -0.445572882890701f, 0.272799760103226f, -0.445398747920990f, + 0.272458195686340f, -0.445224374532700f, 0.272116780281067f, -0.445049703121185f, + 0.271775513887405f, -0.444874793291092f, 0.271434366703033f, -0.444699615240097f, + 0.271093338727951f, -0.444524168968201f, 0.270752459764481f, -0.444348484277725f, + 0.270411729812622f, -0.444172531366348f, 0.270071119070053f, -0.443996280431747f, + 0.269730657339096f, -0.443819820880890f, 0.269390314817429f, -0.443643063306808f, + 0.269050091505051f, -0.443466067314148f, 0.268710047006607f, -0.443288803100586f, + 0.268370121717453f, -0.443111270666122f, 0.268030315637589f, -0.442933470010757f, + 0.267690658569336f, -0.442755430936813f, 0.267351150512695f, -0.442577123641968f, + 0.267011761665344f, -0.442398548126221f, 0.266672492027283f, -0.442219734191895f, + 0.266333401203156f, -0.442040622234344f, 0.265994429588318f, -0.441861271858215f, + 0.265655577182770f, -0.441681683063507f, 0.265316903591156f, -0.441501796245575f, + 0.264978319406509f, -0.441321671009064f, 0.264639914035797f, -0.441141277551651f, + 0.264301627874374f, -0.440960645675659f, 0.263963490724564f, -0.440779715776443f, + 0.263625472784042f, -0.440598547458649f, 0.263287603855133f, -0.440417140722275f, + 0.262949883937836f, -0.440235435962677f, 0.262612313032150f, -0.440053492784500f, + 0.262274861335754f, -0.439871311187744f, 0.261937558650970f, -0.439688831567764f, + 0.261600375175476f, -0.439506113529205f, 0.261263370513916f, -0.439323127269745f, + 0.260926485061646f, -0.439139902591705f, 0.260589718818665f, -0.438956409692764f, + 0.260253131389618f, -0.438772648572922f, 0.259916663169861f, -0.438588619232178f, + 0.259580343961716f, -0.438404351472855f, 0.259244143962860f, -0.438219845294952f, + 0.258908122777939f, -0.438035041093826f, 0.258572220802307f, -0.437849998474121f, + 0.258236467838287f, -0.437664687633514f, 0.257900834083557f, -0.437479138374329f, + 0.257565379142761f, -0.437293320894241f, 0.257230043411255f, -0.437107264995575f, + 0.256894856691360f, -0.436920911073685f, 0.256559818983078f, -0.436734348535538f, + 0.256224930286407f, -0.436547487974167f, 0.255890160799026f, -0.436360388994217f, + 0.255555540323257f, -0.436173021793365f, 0.255221068859100f, -0.435985416173935f, + 0.254886746406555f, -0.435797542333603f, 0.254552572965622f, -0.435609430074692f, + 0.254218548536301f, -0.435421019792557f, 0.253884643316269f, -0.435232400894165f, + 0.253550916910172f, -0.435043483972549f, 0.253217309713364f, -0.434854328632355f, + 0.252883851528168f, -0.434664934873581f, 0.252550542354584f, -0.434475272893906f, + 0.252217382192612f, -0.434285342693329f, 0.251884341239929f, -0.434095174074173f, + 0.251551479101181f, -0.433904737234116f, 0.251218736171722f, -0.433714061975479f, + 0.250886172056198f, -0.433523118495941f, 0.250553727149963f, -0.433331936597824f, + 0.250221431255341f, -0.433140486478806f, 0.249889299273491f, -0.432948768138886f, + 0.249557301402092f, -0.432756811380386f, 0.249225467443466f, -0.432564586400986f, + 0.248893767595291f, -0.432372123003006f, 0.248562216758728f, -0.432179391384125f, + 0.248230814933777f, -0.431986421346664f, 0.247899547219276f, -0.431793183088303f, + 0.247568443417549f, -0.431599706411362f, 0.247237488627434f, -0.431405961513519f, + 0.246906682848930f, -0.431211978197098f, 0.246576011180878f, -0.431017726659775f, + 0.246245503425598f, -0.430823236703873f, 0.245915144681931f, -0.430628478527069f, + 0.245584934949875f, -0.430433481931686f, 0.245254859328270f, -0.430238217115402f, + 0.244924947619438f, -0.430042684078217f, 0.244595184922218f, -0.429846942424774f, + 0.244265571236610f, -0.429650902748108f, 0.243936106562614f, -0.429454624652863f, + 0.243606805801392f, -0.429258108139038f, 0.243277639150620f, -0.429061323404312f, + 0.242948621511459f, -0.428864300251007f, 0.242619767785072f, -0.428667008876801f, + 0.242291063070297f, -0.428469479084015f, 0.241962507367134f, -0.428271710872650f, + 0.241634100675583f, -0.428073674440384f, 0.241305842995644f, -0.427875369787216f, + 0.240977749228477f, -0.427676826715469f, 0.240649804472923f, -0.427478045225143f, + 0.240322008728981f, -0.427278995513916f, 0.239994361996651f, -0.427079707384110f, + 0.239666879177094f, -0.426880151033401f, 0.239339530467987f, -0.426680356264114f, + 0.239012360572815f, -0.426480293273926f, 0.238685324788094f, -0.426279991865158f, + 0.238358452916145f, -0.426079452037811f, 0.238031730055809f, -0.425878643989563f, + 0.237705156207085f, -0.425677597522736f, 0.237378746271133f, -0.425476282835007f, + 0.237052485346794f, -0.425274729728699f, 0.236726388335228f, -0.425072938203812f, + 0.236400425434113f, -0.424870878458023f, 0.236074641346931f, -0.424668580293655f, + 0.235749006271362f, -0.424466013908386f, 0.235423520207405f, -0.424263238906860f, + 0.235098183155060f, -0.424060165882111f, 0.234773010015488f, -0.423856884241104f, + 0.234448000788689f, -0.423653304576874f, 0.234123140573502f, -0.423449516296387f, + 0.233798429369926f, -0.423245459794998f, 0.233473882079124f, -0.423041164875031f, + 0.233149498701096f, -0.422836631536484f, 0.232825264334679f, -0.422631829977036f, + 0.232501193881035f, -0.422426789999008f, 0.232177272439003f, -0.422221481800079f, + 0.231853514909744f, -0.422015935182571f, 0.231529906392097f, -0.421810150146484f, + 0.231206461787224f, -0.421604126691818f, 0.230883181095123f, -0.421397835016251f, + 0.230560049414635f, -0.421191304922104f, 0.230237081646919f, -0.420984506607056f, + 0.229914262890816f, -0.420777499675751f, 0.229591608047485f, -0.420570224523544f, + 0.229269117116928f, -0.420362681150436f, 0.228946775197983f, -0.420154929161072f, + 0.228624612092972f, -0.419946908950806f, 0.228302597999573f, -0.419738620519638f, + 0.227980732917786f, -0.419530123472214f, 0.227659046649933f, -0.419321358203888f, + 0.227337509393692f, -0.419112354516983f, 0.227016136050224f, -0.418903112411499f, + 0.226694911718369f, -0.418693602085114f, 0.226373866200447f, -0.418483853340149f, + 0.226052969694138f, -0.418273866176605f, 0.225732237100601f, -0.418063640594482f, + 0.225411668419838f, -0.417853146791458f, 0.225091263651848f, -0.417642414569855f, + 0.224771007895470f, -0.417431443929672f, 0.224450930953026f, -0.417220205068588f, + 0.224131003022194f, -0.417008757591248f, 0.223811239004135f, -0.416797041893005f, + 0.223491653800011f, -0.416585087776184f, 0.223172217607498f, -0.416372895240784f, + 0.222852945327759f, -0.416160434484482f, 0.222533836960793f, -0.415947735309601f, + 0.222214877605438f, -0.415734797716141f, 0.221896097064018f, -0.415521621704102f, + 0.221577480435371f, -0.415308207273483f, 0.221259027719498f, -0.415094524621964f, + 0.220940738916397f, -0.414880603551865f, 0.220622614026070f, -0.414666473865509f, + 0.220304638147354f, -0.414452046155930f, 0.219986841082573f, -0.414237409830093f, + 0.219669207930565f, -0.414022535085678f, 0.219351738691330f, -0.413807392120361f, + 0.219034433364868f, -0.413592010736465f, 0.218717306852341f, -0.413376390933990f, + 0.218400329351425f, -0.413160532712936f, 0.218083515763283f, -0.412944436073303f, + 0.217766880989075f, -0.412728071212769f, 0.217450410127640f, -0.412511497735977f, + 0.217134088277817f, -0.412294656038284f, 0.216817945241928f, -0.412077575922012f, + 0.216501981019974f, -0.411860257387161f, 0.216186165809631f, -0.411642700433731f, + 0.215870529413223f, -0.411424905061722f, 0.215555042028427f, -0.411206841468811f, + 0.215239733457565f, -0.410988569259644f, 0.214924603700638f, -0.410770028829575f, + 0.214609622955322f, -0.410551249980927f, 0.214294821023941f, -0.410332232713699f, + 0.213980183005333f, -0.410112977027893f, 0.213665723800659f, -0.409893482923508f, + 0.213351413607597f, -0.409673750400543f, 0.213037282228470f, -0.409453779459000f, + 0.212723329663277f, -0.409233570098877f, 0.212409526109695f, -0.409013092517853f, + 0.212095901370049f, -0.408792406320572f, 0.211782455444336f, -0.408571451902390f, + 0.211469158530235f, -0.408350288867950f, 0.211156040430069f, -0.408128857612610f, + 0.210843101143837f, -0.407907217741013f, 0.210530325770378f, -0.407685309648514f, + 0.210217714309692f, -0.407463163137436f, 0.209905281662941f, -0.407240778207779f, + 0.209593027830124f, -0.407018154859543f, 0.209280923008919f, -0.406795293092728f, + 0.208969011902809f, -0.406572192907333f, 0.208657249808311f, -0.406348884105682f, + 0.208345666527748f, -0.406125307083130f, 0.208034262061119f, -0.405901491641998f, + 0.207723021507263f, -0.405677437782288f, 0.207411959767342f, -0.405453115701675f, + 0.207101076841354f, -0.405228585004807f, 0.206790357828140f, -0.405003815889359f, + 0.206479802727699f, -0.404778808355331f, 0.206169426441193f, -0.404553562402725f, + 0.205859228968620f, -0.404328078031540f, 0.205549195408821f, -0.404102355241776f, + 0.205239340662956f, -0.403876423835754f, 0.204929664731026f, -0.403650224208832f, + 0.204620152711868f, -0.403423786163330f, 0.204310819506645f, -0.403197109699249f, + 0.204001650214195f, -0.402970194816589f, 0.203692659735680f, -0.402743041515350f, + 0.203383848071098f, -0.402515679597855f, 0.203075215220451f, -0.402288049459457f, + 0.202766746282578f, -0.402060180902481f, 0.202458456158638f, -0.401832103729248f, + 0.202150344848633f, -0.401603758335114f, 0.201842412352562f, -0.401375204324722f, + 0.201534643769264f, -0.401146411895752f, 0.201227053999901f, -0.400917351245880f, + 0.200919643044472f, -0.400688081979752f, 0.200612410902977f, -0.400458574295044f, + 0.200305357575417f, -0.400228828191757f, 0.199998468160629f, -0.399998843669891f, + 0.199691757559776f, -0.399768620729446f, 0.199385225772858f, -0.399538189172745f, + 0.199078872799873f, -0.399307489395142f, 0.198772698640823f, -0.399076581001282f, + 0.198466703295708f, -0.398845434188843f, 0.198160871863365f, -0.398614019155502f, + 0.197855234146118f, -0.398382395505905f, 0.197549775242805f, -0.398150533437729f, + 0.197244480252266f, -0.397918462753296f, 0.196939364075661f, -0.397686123847961f, + 0.196634441614151f, -0.397453576326370f, 0.196329683065414f, -0.397220760583878f, + 0.196025103330612f, -0.396987736225128f, 0.195720717310905f, -0.396754473447800f, + 0.195416495203972f, -0.396520972251892f, 0.195112451910973f, -0.396287262439728f, + 0.194808602333069f, -0.396053284406662f, 0.194504916667938f, -0.395819097757339f, + 0.194201424717903f, -0.395584672689438f, 0.193898096680641f, -0.395350009202957f, + 0.193594962358475f, -0.395115107297897f, 0.193292006850243f, -0.394879996776581f, + 0.192989215254784f, -0.394644618034363f, 0.192686617374420f, -0.394409030675888f, + 0.192384198307991f, -0.394173204898834f, 0.192081972956657f, -0.393937170505524f, + 0.191779911518097f, -0.393700867891312f, 0.191478043794632f, -0.393464356660843f, + 0.191176339983940f, -0.393227607011795f, 0.190874829888344f, -0.392990618944168f, + 0.190573498606682f, -0.392753422260284f, 0.190272361040115f, -0.392515957355499f, + 0.189971387386322f, -0.392278283834457f, 0.189670607447624f, -0.392040401697159f, + 0.189370006322861f, -0.391802251338959f, 0.189069598913193f, -0.391563892364502f, + 0.188769355416298f, -0.391325294971466f, 0.188469305634499f, -0.391086459159851f, + 0.188169434666634f, -0.390847414731979f, 0.187869757413864f, -0.390608131885529f, + 0.187570258975029f, -0.390368610620499f, 0.187270939350128f, -0.390128880739212f, + 0.186971798539162f, -0.389888882637024f, 0.186672851443291f, -0.389648675918579f, + 0.186374098062515f, -0.389408260583878f, 0.186075508594513f, -0.389167606830597f, + 0.185777112841606f, -0.388926714658737f, 0.185478910803795f, -0.388685584068298f, + 0.185180887579918f, -0.388444244861603f, 0.184883043169975f, -0.388202667236328f, + 0.184585392475128f, -0.387960851192474f, 0.184287920594215f, -0.387718826532364f, + 0.183990627527237f, -0.387476563453674f, 0.183693528175354f, -0.387234061956406f, + 0.183396622538567f, -0.386991351842880f, 0.183099895715714f, -0.386748403310776f, + 0.182803362607956f, -0.386505216360092f, 0.182507008314133f, -0.386261820793152f, + 0.182210832834244f, -0.386018186807632f, 0.181914865970612f, -0.385774344205856f, + 0.181619063019753f, -0.385530263185501f, 0.181323468685150f, -0.385285943746567f, + 0.181028053164482f, -0.385041415691376f, 0.180732816457748f, -0.384796649217606f, + 0.180437773466110f, -0.384551674127579f, 0.180142924189568f, -0.384306460618973f, + 0.179848253726959f, -0.384061008691788f, 0.179553776979446f, -0.383815348148346f, + 0.179259493947029f, -0.383569449186325f, 0.178965389728546f, -0.383323341608047f, + 0.178671479225159f, -0.383076995611191f, 0.178377762436867f, -0.382830440998077f, + 0.178084224462509f, -0.382583618164063f, 0.177790880203247f, -0.382336616516113f, + 0.177497729659081f, -0.382089376449585f, 0.177204772830009f, -0.381841897964478f, + 0.176911994814873f, -0.381594210863113f, 0.176619410514832f, -0.381346285343170f, + 0.176327019929886f, -0.381098151206970f, 0.176034808158875f, -0.380849778652191f, + 0.175742805004120f, -0.380601197481155f, 0.175450980663300f, -0.380352377891541f, + 0.175159350037575f, -0.380103349685669f, 0.174867913126946f, -0.379854083061218f, + 0.174576655030251f, -0.379604607820511f, 0.174285605549812f, -0.379354894161224f, + 0.173994734883308f, -0.379104942083359f, 0.173704057931900f, -0.378854811191559f, + 0.173413574695587f, -0.378604412078857f, 0.173123285174370f, -0.378353834152222f, + 0.172833189368248f, -0.378102988004684f, 0.172543287277222f, -0.377851963043213f, + 0.172253578901291f, -0.377600699663162f, 0.171964049339294f, -0.377349197864532f, + 0.171674728393555f, -0.377097487449646f, 0.171385586261749f, -0.376845568418503f, + 0.171096652746201f, -0.376593410968781f, 0.170807912945747f, -0.376341015100479f, + 0.170519351959229f, -0.376088410615921f, 0.170230999588966f, -0.375835597515106f, + 0.169942826032639f, -0.375582575798035f, 0.169654861092567f, -0.375329315662384f, + 0.169367074966431f, -0.375075817108154f, 0.169079497456551f, -0.374822109937668f, + 0.168792113661766f, -0.374568194150925f, 0.168504923582077f, -0.374314039945602f, + 0.168217927217484f, -0.374059677124023f, 0.167931124567986f, -0.373805105686188f, + 0.167644515633583f, -0.373550295829773f, 0.167358100414276f, -0.373295277357101f, + 0.167071878910065f, -0.373040050268173f, 0.166785866022110f, -0.372784584760666f, + 0.166500031948090f, -0.372528880834579f, 0.166214406490326f, -0.372272998094559f, + 0.165928974747658f, -0.372016876935959f, 0.165643751621246f, -0.371760547161102f, + 0.165358707308769f, -0.371503978967667f, 0.165073871612549f, -0.371247202157974f, + 0.164789214730263f, -0.370990216732025f, 0.164504766464233f, -0.370732992887497f, + 0.164220526814461f, -0.370475560426712f, 0.163936465978622f, -0.370217919349670f, + 0.163652613759041f, -0.369960039854050f, 0.163368955254555f, -0.369701951742172f, + 0.163085505366325f, -0.369443655014038f, 0.162802234292030f, -0.369185149669647f, + 0.162519171833992f, -0.368926405906677f, 0.162236317992210f, -0.368667453527451f, + 0.161953642964363f, -0.368408292531967f, 0.161671176552773f, -0.368148893117905f, + 0.161388918757439f, -0.367889285087585f, 0.161106839776039f, -0.367629468441010f, + 0.160824984312058f, -0.367369443178177f, 0.160543307662010f, -0.367109179496765f, + 0.160261839628220f, -0.366848707199097f, 0.159980565309525f, -0.366588026285172f, + 0.159699499607086f, -0.366327136754990f, 0.159418627619743f, -0.366066008806229f, + 0.159137964248657f, -0.365804702043533f, 0.158857494592667f, -0.365543156862259f, + 0.158577233552933f, -0.365281373262405f, 0.158297166228294f, -0.365019410848618f, + 0.158017292618752f, -0.364757210016251f, 0.157737627625465f, -0.364494800567627f, + 0.157458171248436f, -0.364232182502747f, 0.157178908586502f, -0.363969355821610f, + 0.156899839639664f, -0.363706320524216f, 0.156620979309082f, -0.363443046808243f, + 0.156342327594757f, -0.363179564476013f, 0.156063869595528f, -0.362915903329849f, + 0.155785620212555f, -0.362651973962784f, 0.155507579445839f, -0.362387865781784f, + 0.155229732394218f, -0.362123548984528f, 0.154952079057693f, -0.361858993768692f, + 0.154674649238586f, -0.361594229936600f, 0.154397398233414f, -0.361329287290573f, + 0.154120370745659f, -0.361064106225967f, 0.153843536973000f, -0.360798716545105f, + 0.153566911816597f, -0.360533088445663f, 0.153290495276451f, -0.360267281532288f, + 0.153014272451401f, -0.360001266002655f, 0.152738258242607f, -0.359735012054443f, + 0.152462437748909f, -0.359468549489975f, 0.152186840772629f, -0.359201908111572f, + 0.151911437511444f, -0.358935028314590f, 0.151636242866516f, -0.358667939901352f, + 0.151361241936684f, -0.358400642871857f, 0.151086464524269f, -0.358133137226105f, + 0.150811880826950f, -0.357865422964096f, 0.150537505745888f, -0.357597470283508f, + 0.150263324379921f, -0.357329338788986f, 0.149989366531372f, -0.357060998678207f, + 0.149715602397919f, -0.356792420148849f, 0.149442046880722f, -0.356523662805557f, + 0.149168699979782f, -0.356254696846008f, 0.148895561695099f, -0.355985492467880f, + 0.148622632026672f, -0.355716109275818f, 0.148349896073341f, -0.355446487665176f, + 0.148077383637428f, -0.355176687240601f, 0.147805064916611f, -0.354906648397446f, + 0.147532954812050f, -0.354636400938034f, 0.147261068224907f, -0.354365974664688f, + 0.146989375352860f, -0.354095309972763f, 0.146717891097069f, -0.353824466466904f, + 0.146446615457535f, -0.353553384542465f, 0.146175548434258f, -0.353282123804092f, + 0.145904675126076f, -0.353010624647141f, 0.145634025335312f, -0.352738946676254f, + 0.145363584160805f, -0.352467030286789f, 0.145093351602554f, -0.352194935083389f, + 0.144823327660561f, -0.351922631263733f, 0.144553512334824f, -0.351650089025497f, + 0.144283905625343f, -0.351377367973328f, 0.144014507532120f, -0.351104438304901f, + 0.143745318055153f, -0.350831300020218f, 0.143476337194443f, -0.350557953119278f, + 0.143207564949989f, -0.350284397602081f, 0.142939001321793f, -0.350010633468628f, + 0.142670661211014f, -0.349736660718918f, 0.142402514815331f, -0.349462509155273f, + 0.142134591937065f, -0.349188119173050f, 0.141866862773895f, -0.348913550376892f, + 0.141599357128143f, -0.348638743162155f, 0.141332060098648f, -0.348363757133484f, + 0.141064971685410f, -0.348088562488556f, 0.140798106789589f, -0.347813159227371f, + 0.140531435608864f, -0.347537547349930f, 0.140264987945557f, -0.347261756658554f, + 0.139998748898506f, -0.346985727548599f, 0.139732718467712f, -0.346709519624710f, + 0.139466896653175f, -0.346433073282242f, 0.139201298356056f, -0.346156448125839f, + 0.138935908675194f, -0.345879614353180f, 0.138670727610588f, -0.345602601766586f, + 0.138405755162239f, -0.345325350761414f, 0.138141006231308f, -0.345047920942307f, + 0.137876465916634f, -0.344770282506943f, 0.137612134218216f, -0.344492435455322f, + 0.137348011136055f, -0.344214379787445f, 0.137084111571312f, -0.343936115503311f, + 0.136820420622826f, -0.343657672405243f, 0.136556953191757f, -0.343379020690918f, + 0.136293679475784f, -0.343100160360336f, 0.136030644178391f, -0.342821091413498f, + 0.135767802596092f, -0.342541843652725f, 0.135505184531212f, -0.342262357473373f, + 0.135242775082588f, -0.341982692480087f, 0.134980589151382f, -0.341702848672867f, + 0.134718611836433f, -0.341422766447067f, 0.134456858038902f, -0.341142505407333f, + 0.134195312857628f, -0.340862035751343f, 0.133933976292610f, -0.340581357479095f, + 0.133672863245010f, -0.340300500392914f, 0.133411958813667f, -0.340019434690475f, + 0.133151277899742f, -0.339738160371780f, 0.132890805602074f, -0.339456677436829f, + 0.132630556821823f, -0.339175015687943f, 0.132370531558990f, -0.338893145322800f, + 0.132110700011253f, -0.338611096143723f, 0.131851106882095f, -0.338328808546066f, + 0.131591722369194f, -0.338046342134476f, 0.131332546472549f, -0.337763696908951f, + 0.131073594093323f, -0.337480813264847f, 0.130814850330353f, -0.337197750806808f, + 0.130556344985962f, -0.336914509534836f, 0.130298033356667f, -0.336631029844284f, + 0.130039945244789f, -0.336347371339798f, 0.129782080650330f, -0.336063534021378f, + 0.129524439573288f, -0.335779488086700f, 0.129267007112503f, -0.335495233535767f, + 0.129009798169136f, -0.335210770368576f, 0.128752797842026f, -0.334926128387451f, + 0.128496021032333f, -0.334641307592392f, 0.128239467740059f, -0.334356248378754f, + 0.127983123064041f, -0.334071010351181f, 0.127727001905441f, -0.333785593509674f, + 0.127471104264259f, -0.333499968051910f, 0.127215430140495f, -0.333214133977890f, + 0.126959964632988f, -0.332928121089935f, 0.126704722642899f, -0.332641899585724f, + 0.126449704170227f, -0.332355499267578f, 0.126194894313812f, -0.332068890333176f, + 0.125940307974815f, -0.331782072782516f, 0.125685945153236f, -0.331495076417923f, + 0.125431805849075f, -0.331207901239395f, 0.125177875161171f, -0.330920487642288f, + 0.124924175441265f, -0.330632925033569f, 0.124670691788197f, -0.330345153808594f, + 0.124417431652546f, -0.330057173967361f, 0.124164395034313f, -0.329769015312195f, + 0.123911574482918f, -0.329480648040771f, 0.123658977448940f, -0.329192101955414f, + 0.123406603932381f, -0.328903347253799f, 0.123154446482658f, -0.328614413738251f, + 0.122902512550354f, -0.328325271606445f, 0.122650802135468f, -0.328035950660706f, + 0.122399315237999f, -0.327746421098709f, 0.122148044407368f, -0.327456712722778f, + 0.121896997094154f, -0.327166795730591f, 0.121646173298359f, -0.326876699924469f, + 0.121395580470562f, -0.326586425304413f, 0.121145196259022f, -0.326295942068100f, + 0.120895043015480f, -0.326005280017853f, 0.120645113289356f, -0.325714409351349f, + 0.120395407080650f, -0.325423330068588f, 0.120145916938782f, -0.325132101774216f, + 0.119896657764912f, -0.324840664863586f, 0.119647622108459f, -0.324549019336700f, + 0.119398809969425f, -0.324257194995880f, 0.119150213897228f, -0.323965191841125f, + 0.118901848793030f, -0.323672980070114f, 0.118653707206249f, -0.323380589485168f, + 0.118405789136887f, -0.323088020086288f, 0.118158094584942f, -0.322795242071152f, + 0.117910631000996f, -0.322502255439758f, 0.117663383483887f, -0.322209119796753f, + 0.117416366934776f, -0.321915775537491f, 0.117169573903084f, -0.321622252464294f, + 0.116923004388809f, -0.321328520774841f, 0.116676658391953f, -0.321034610271454f, + 0.116430543363094f, -0.320740520954132f, 0.116184651851654f, -0.320446223020554f, + 0.115938983857632f, -0.320151746273041f, 0.115693546831608f, -0.319857090711594f, + 0.115448333323002f, -0.319562226533890f, 0.115203343331814f, -0.319267183542252f, + 0.114958584308624f, -0.318971961736679f, 0.114714048802853f, -0.318676531314850f, + 0.114469736814499f, -0.318380922079086f, 0.114225655794144f, -0.318085134029388f, + 0.113981798291206f, -0.317789167165756f, 0.113738171756268f, -0.317492991685867f, + 0.113494776189327f, -0.317196637392044f, 0.113251596689224f, -0.316900104284287f, + 0.113008655607700f, -0.316603392362595f, 0.112765938043594f, -0.316306471824646f, + 0.112523443996906f, -0.316009372472763f, 0.112281180918217f, -0.315712094306946f, + 0.112039148807526f, -0.315414607524872f, 0.111797347664833f, -0.315116971731186f, + 0.111555770039558f, -0.314819127321243f, 0.111314415931702f, -0.314521104097366f, + 0.111073300242424f, -0.314222872257233f, 0.110832408070564f, -0.313924491405487f, + 0.110591746866703f, -0.313625901937485f, 0.110351309180260f, -0.313327133655548f, + 0.110111102461815f, -0.313028186559677f, 0.109871134161949f, -0.312729060649872f, + 0.109631389379501f, -0.312429755926132f, 0.109391868114471f, -0.312130242586136f, + 0.109152585268021f, -0.311830550432205f, 0.108913525938988f, -0.311530679464340f, + 0.108674705028534f, -0.311230629682541f, 0.108436107635498f, -0.310930401086807f, + 0.108197741210461f, -0.310629993677139f, 0.107959605753422f, -0.310329377651215f, + 0.107721701264381f, -0.310028612613678f, 0.107484027743340f, -0.309727638959885f, + 0.107246585190296f, -0.309426486492157f, 0.107009373605251f, -0.309125155210495f, + 0.106772392988205f, -0.308823645114899f, 0.106535643339157f, -0.308521956205368f, + 0.106299124658108f, -0.308220088481903f, 0.106062836945057f, -0.307918041944504f, + 0.105826787650585f, -0.307615786790848f, 0.105590961873531f, -0.307313382625580f, + 0.105355374515057f, -0.307010769844055f, 0.105120018124580f, -0.306708008050919f, + 0.104884892702103f, -0.306405037641525f, 0.104649998247623f, -0.306101888418198f, + 0.104415334761143f, -0.305798590183258f, 0.104180909693241f, -0.305495083332062f, + 0.103946708142757f, -0.305191397666931f, 0.103712752461433f, -0.304887533187866f, + 0.103479020297527f, -0.304583519697189f, 0.103245526552200f, -0.304279297590256f, + 0.103012263774872f, -0.303974896669388f, 0.102779231965542f, -0.303670316934586f, + 0.102546438574791f, -0.303365558385849f, 0.102313876152039f, -0.303060621023178f, + 0.102081544697285f, -0.302755534648895f, 0.101849451661110f, -0.302450239658356f, + 0.101617597043514f, -0.302144765853882f, 0.101385973393917f, -0.301839113235474f, + 0.101154580712318f, -0.301533311605453f, 0.100923426449299f, -0.301227301359177f, + 0.100692503154278f, -0.300921112298965f, 0.100461818277836f, -0.300614774227142f, + 0.100231364369392f, -0.300308227539063f, 0.100001148879528f, -0.300001531839371f, + 0.099771171808243f, -0.299694657325745f, 0.099541425704956f, -0.299387603998184f, + 0.099311910569668f, -0.299080342054367f, 0.099082641303539f, -0.298772931098938f, + 0.098853603005409f, -0.298465341329575f, 0.098624803125858f, -0.298157602548599f, + 0.098396234214306f, -0.297849655151367f, 0.098167903721333f, -0.297541528940201f, + 0.097939811646938f, -0.297233253717422f, 0.097711957991123f, -0.296924799680710f, + 0.097484335303307f, -0.296616137027740f, 0.097256951034069f, -0.296307325363159f, + 0.097029805183411f, -0.295998334884644f, 0.096802897751331f, -0.295689195394516f, + 0.096576221287251f, -0.295379847288132f, 0.096349790692329f, -0.295070350170136f, + 0.096123591065407f, -0.294760644435883f, 0.095897629857063f, -0.294450789690018f, + 0.095671907067299f, -0.294140785932541f, 0.095446422696114f, -0.293830573558807f, + 0.095221176743507f, -0.293520182371140f, 0.094996169209480f, -0.293209642171860f, + 0.094771400094032f, -0.292898923158646f, 0.094546869397163f, -0.292588025331497f, + 0.094322577118874f, -0.292276978492737f, 0.094098523259163f, -0.291965723037720f, + 0.093874707818031f, -0.291654318571091f, 0.093651130795479f, -0.291342735290527f, + 0.093427792191505f, -0.291031002998352f, 0.093204692006111f, -0.290719062089920f, + 0.092981837689877f, -0.290406972169876f, 0.092759214341640f, -0.290094703435898f, + 0.092536836862564f, -0.289782285690308f, 0.092314697802067f, -0.289469659328461f, + 0.092092797160149f, -0.289156883955002f, 0.091871134936810f, -0.288843959569931f, + 0.091649711132050f, -0.288530826568604f, 0.091428533196449f, -0.288217544555664f, + 0.091207593679428f, -0.287904083728790f, 0.090986892580986f, -0.287590473890305f, + 0.090766437351704f, -0.287276685237885f, 0.090546220541000f, -0.286962717771530f, + 0.090326242148876f, -0.286648571491241f, 0.090106502175331f, -0.286334276199341f, + 0.089887008070946f, -0.286019802093506f, 0.089667752385139f, -0.285705178976059f, + 0.089448742568493f, -0.285390377044678f, 0.089229971170425f, -0.285075396299362f, + 0.089011445641518f, -0.284760266542435f, 0.088793158531189f, -0.284444957971573f, + 0.088575109839439f, -0.284129470586777f, 0.088357307016850f, -0.283813834190369f, + 0.088139742612839f, -0.283498018980026f, 0.087922424077988f, -0.283182054758072f, + 0.087705351412296f, -0.282865911722183f, 0.087488517165184f, -0.282549589872360f, + 0.087271921336651f, -0.282233119010925f, 0.087055571377277f, -0.281916469335556f, + 0.086839467287064f, -0.281599670648575f, 0.086623609066010f, -0.281282693147659f, + 0.086407989263535f, -0.280965566635132f, 0.086192607879639f, -0.280648261308670f, + 0.085977479815483f, -0.280330777168274f, 0.085762590169907f, -0.280013144016266f, + 0.085547938942909f, -0.279695361852646f, 0.085333541035652f, -0.279377400875092f, + 0.085119381546974f, -0.279059261083603f, 0.084905467927456f, -0.278740972280502f, + 0.084691800177097f, -0.278422504663467f, 0.084478378295898f, -0.278103888034821f, + 0.084265194833279f, -0.277785122394562f, 0.084052257239819f, -0.277466177940369f, + 0.083839565515518f, -0.277147054672241f, 0.083627119660378f, -0.276827782392502f, + 0.083414919674397f, -0.276508361101151f, 0.083202958106995f, -0.276188760995865f, + 0.082991249859333f, -0.275868982076645f, 0.082779780030251f, -0.275549083948135f, + 0.082568563520908f, -0.275228977203369f, 0.082357585430145f, -0.274908751249313f, + 0.082146860659122f, -0.274588316679001f, 0.081936374306679f, -0.274267762899399f, + 0.081726133823395f, -0.273947030305862f, 0.081516146659851f, -0.273626148700714f, + 0.081306397914886f, -0.273305088281631f, 0.081096902489662f, -0.272983878850937f, + 0.080887645483017f, -0.272662490606308f, 0.080678641796112f, -0.272340953350067f, + 0.080469883978367f, -0.272019267082214f, 0.080261372029781f, -0.271697402000427f, + 0.080053105950356f, -0.271375387907028f, 0.079845085740089f, -0.271053224802017f, + 0.079637311398983f, -0.270730882883072f, 0.079429790377617f, -0.270408391952515f, + 0.079222507774830f, -0.270085722208023f, 0.079015478491783f, -0.269762933254242f, + 0.078808702528477f, -0.269439965486526f, 0.078602164983749f, -0.269116818904877f, + 0.078395880758762f, -0.268793523311615f, 0.078189842402935f, -0.268470078706741f, + 0.077984049916267f, -0.268146485090256f, 0.077778510749340f, -0.267822742462158f, + 0.077573217451572f, -0.267498821020126f, 0.077368170022964f, -0.267174720764160f, + 0.077163375914097f, -0.266850501298904f, 0.076958827674389f, -0.266526103019714f, + 0.076754532754421f, -0.266201555728912f, 0.076550483703613f, -0.265876859426498f, + 0.076346680521965f, -0.265552014112473f, 0.076143130660057f, -0.265226989984512f, + 0.075939826667309f, -0.264901816844940f, 0.075736775994301f, -0.264576494693756f, + 0.075533971190453f, -0.264250993728638f, 0.075331419706345f, -0.263925373554230f, + 0.075129114091396f, -0.263599574565887f, 0.074927061796188f, -0.263273626565933f, + 0.074725262820721f, -0.262947499752045f, 0.074523709714413f, -0.262621253728867f, + 0.074322402477264f, -0.262294828891754f, 0.074121348559856f, -0.261968284845352f, + 0.073920547962189f, -0.261641561985016f, 0.073720000684261f, -0.261314690113068f, + 0.073519699275494f, -0.260987639427185f, 0.073319651186466f, -0.260660469532013f, + 0.073119848966599f, -0.260333120822906f, 0.072920300066471f, -0.260005623102188f, + 0.072721004486084f, -0.259678006172180f, 0.072521962225437f, -0.259350210428238f, + 0.072323165833950f, -0.259022265672684f, 0.072124622762203f, -0.258694142103195f, + 0.071926333010197f, -0.258365899324417f, 0.071728296577930f, -0.258037507534027f, + 0.071530513465405f, -0.257708936929703f, 0.071332976222038f, -0.257380217313766f, + 0.071135692298412f, -0.257051378488541f, 0.070938661694527f, -0.256722360849380f, + 0.070741884410381f, -0.256393194198608f, 0.070545360445976f, -0.256063878536224f, + 0.070349089801311f, -0.255734413862228f, 0.070153072476387f, -0.255404800176620f, + 0.069957308471203f, -0.255075037479401f, 0.069761790335178f, -0.254745125770569f, + 0.069566532969475f, -0.254415065050125f, 0.069371521472931f, -0.254084855318069f, + 0.069176770746708f, -0.253754496574402f, 0.068982265889645f, -0.253423988819122f, + 0.068788021802902f, -0.253093332052231f, 0.068594031035900f, -0.252762526273727f, + 0.068400286138058f, -0.252431541681290f, 0.068206802010536f, -0.252100437879562f, + 0.068013571202755f, -0.251769185066223f, 0.067820593714714f, -0.251437783241272f, + 0.067627869546413f, -0.251106232404709f, 0.067435398697853f, -0.250774532556534f, + 0.067243188619614f, -0.250442683696747f, 0.067051224410534f, -0.250110685825348f, + 0.066859520971775f, -0.249778553843498f, 0.066668070852757f, -0.249446272850037f, + 0.066476874053478f, -0.249113827943802f, 0.066285938024521f, -0.248781248927116f, + 0.066095255315304f, -0.248448520898819f, 0.065904818475246f, -0.248115643858910f, + 0.065714649856091f, -0.247782632708550f, 0.065524727106094f, -0.247449472546577f, + 0.065335065126419f, -0.247116148471832f, 0.065145656466484f, -0.246782705187798f, + 0.064956501126289f, -0.246449097990990f, 0.064767606556416f, -0.246115356683731f, + 0.064578965306282f, -0.245781451463699f, 0.064390584826469f, -0.245447427034378f, + 0.064202457666397f, -0.245113238692284f, 0.064014583826065f, -0.244778916239738f, + 0.063826970756054f, -0.244444444775581f, 0.063639611005783f, -0.244109839200974f, + 0.063452512025833f, -0.243775084614754f, 0.063265666365623f, -0.243440181016922f, + 0.063079081475735f, -0.243105143308640f, 0.062892749905586f, -0.242769956588745f, + 0.062706671655178f, -0.242434620857239f, 0.062520854175091f, -0.242099151015282f, + 0.062335297465324f, -0.241763532161713f, 0.062149997800589f, -0.241427779197693f, + 0.061964951455593f, -0.241091892123222f, 0.061780165880919f, -0.240755841135979f, + 0.061595637351274f, -0.240419670939446f, 0.061411365866661f, -0.240083336830139f, + 0.061227355152369f, -0.239746883511543f, 0.061043601483107f, -0.239410281181335f, + 0.060860104858875f, -0.239073529839516f, 0.060676865279675f, -0.238736644387245f, + 0.060493886470795f, -0.238399609923363f, 0.060311164706945f, -0.238062441349030f, + 0.060128703713417f, -0.237725138664246f, 0.059946499764919f, -0.237387686967850f, + 0.059764556586742f, -0.237050101161003f, 0.059582870453596f, -0.236712381243706f, + 0.059401445090771f, -0.236374512314796f, 0.059220276772976f, -0.236036509275436f, + 0.059039369225502f, -0.235698372125626f, 0.058858718723059f, -0.235360085964203f, + 0.058678328990936f, -0.235021665692329f, 0.058498200029135f, -0.234683111310005f, + 0.058318331837654f, -0.234344407916069f, 0.058138720691204f, -0.234005570411682f, + 0.057959370315075f, -0.233666598796844f, 0.057780280709267f, -0.233327493071556f, + 0.057601451873779f, -0.232988253235817f, 0.057422880083323f, -0.232648864388466f, + 0.057244572788477f, -0.232309341430664f, 0.057066522538662f, -0.231969684362412f, + 0.056888736784458f, -0.231629893183708f, 0.056711208075285f, -0.231289967894554f, + 0.056533940136433f, -0.230949893593788f, 0.056356932967901f, -0.230609700083733f, + 0.056180190294981f, -0.230269357562065f, 0.056003704667091f, -0.229928880929947f, + 0.055827483534813f, -0.229588270187378f, 0.055651523172855f, -0.229247525334358f, + 0.055475823581219f, -0.228906646370888f, 0.055300384759903f, -0.228565633296967f, + 0.055125206708908f, -0.228224486112595f, 0.054950293153524f, -0.227883204817772f, + 0.054775636643171f, -0.227541789412498f, 0.054601248353720f, -0.227200239896774f, + 0.054427117109299f, -0.226858556270599f, 0.054253250360489f, -0.226516738533974f, + 0.054079644382000f, -0.226174786686897f, 0.053906302899122f, -0.225832715630531f, + 0.053733222186565f, -0.225490495562553f, 0.053560405969620f, -0.225148141384125f, + 0.053387850522995f, -0.224805667996407f, 0.053215555846691f, -0.224463045597076f, + 0.053043525665998f, -0.224120303988457f, 0.052871759980917f, -0.223777428269386f, + 0.052700258791447f, -0.223434418439865f, 0.052529018372297f, -0.223091274499893f, + 0.052358038723469f, -0.222748011350632f, 0.052187327295542f, -0.222404599189758f, + 0.052016876637936f, -0.222061067819595f, 0.051846686750650f, -0.221717402338982f, + 0.051676765084267f, -0.221373617649078f, 0.051507104188204f, -0.221029683947563f, + 0.051337707787752f, -0.220685631036758f, 0.051168579608202f, -0.220341444015503f, + 0.050999708473682f, -0.219997137784958f, 0.050831105560064f, -0.219652697443962f, + 0.050662767142057f, -0.219308122992516f, 0.050494693219662f, -0.218963414430618f, + 0.050326880067587f, -0.218618586659431f, 0.050159335136414f, -0.218273624777794f, + 0.049992054700851f, -0.217928543686867f, 0.049825038760900f, -0.217583328485489f, + 0.049658283591270f, -0.217237979173660f, 0.049491796642542f, -0.216892510652542f, + 0.049325577914715f, -0.216546908020973f, 0.049159619957209f, -0.216201186180115f, + 0.048993926495314f, -0.215855330228806f, 0.048828501254320f, -0.215509355068207f, + 0.048663340508938f, -0.215163245797157f, 0.048498444259167f, -0.214817002415657f, + 0.048333816230297f, -0.214470639824867f, 0.048169452697039f, -0.214124158024788f, + 0.048005353659391f, -0.213777542114258f, 0.047841522842646f, -0.213430806994438f, + 0.047677956521511f, -0.213083937764168f, 0.047514654695988f, -0.212736949324608f, + 0.047351621091366f, -0.212389841675758f, 0.047188851982355f, -0.212042599916458f, + 0.047026351094246f, -0.211695238947868f, 0.046864114701748f, -0.211347743868828f, + 0.046702146530151f, -0.211000129580498f, 0.046540446579456f, -0.210652396082878f, + 0.046379011124372f, -0.210304543375969f, 0.046217843890190f, -0.209956556558609f, + 0.046056941151619f, -0.209608450531960f, 0.045896306633949f, -0.209260210394859f, + 0.045735940337181f, -0.208911851048470f, 0.045575842261314f, -0.208563387393951f, + 0.045416008681059f, -0.208214774727821f, 0.045256443321705f, -0.207866057753563f, + 0.045097146183252f, -0.207517206668854f, 0.044938117265701f, -0.207168251276016f, + 0.044779352843761f, -0.206819161772728f, 0.044620860368013f, -0.206469938158989f, + 0.044462632387877f, -0.206120610237122f, 0.044304672628641f, -0.205771163105965f, + 0.044146984815598f, -0.205421581864357f, 0.043989561498165f, -0.205071896314621f, + 0.043832406401634f, -0.204722076654434f, 0.043675523251295f, -0.204372137784958f, + 0.043518904596567f, -0.204022079706192f, 0.043362557888031f, -0.203671902418137f, + 0.043206475675106f, -0.203321605920792f, 0.043050665408373f, -0.202971190214157f, + 0.042895123362541f, -0.202620655298233f, 0.042739849537611f, -0.202270001173019f, + 0.042584843933582f, -0.201919227838516f, 0.042430106550455f, -0.201568335294724f, + 0.042275641113520f, -0.201217323541641f, 0.042121443897486f, -0.200866192579269f, + 0.041967518627644f, -0.200514942407608f, 0.041813857853413f, -0.200163587927818f, + 0.041660469025373f, -0.199812099337578f, 0.041507352143526f, -0.199460506439209f, + 0.041354499757290f, -0.199108779430389f, 0.041201923042536f, -0.198756948113441f, + 0.041049610823393f, -0.198404997587204f, 0.040897574275732f, -0.198052927851677f, + 0.040745802223682f, -0.197700738906860f, 0.040594302117825f, -0.197348430752754f, + 0.040443073958158f, -0.196996018290520f, 0.040292114019394f, -0.196643486618996f, + 0.040141426026821f, -0.196290835738182f, 0.039991009980440f, -0.195938065648079f, + 0.039840862154961f, -0.195585191249847f, 0.039690986275673f, -0.195232197642326f, + 0.039541378617287f, -0.194879084825516f, 0.039392042905092f, -0.194525867700577f, + 0.039242979139090f, -0.194172516465187f, 0.039094187319279f, -0.193819075822830f, + 0.038945667445660f, -0.193465501070023f, 0.038797415792942f, -0.193111822009087f, + 0.038649436086416f, -0.192758023738861f, 0.038501728326082f, -0.192404121160507f, + 0.038354292511940f, -0.192050099372864f, 0.038207128643990f, -0.191695958375931f, + 0.038060232996941f, -0.191341713070869f, 0.037913613021374f, -0.190987363457680f, + 0.037767261266708f, -0.190632879734039f, 0.037621185183525f, -0.190278306603432f, + 0.037475381046534f, -0.189923599362373f, 0.037329845130444f, -0.189568802714348f, + 0.037184584885836f, -0.189213871955872f, 0.037039596587420f, -0.188858851790428f, + 0.036894880235195f, -0.188503712415695f, 0.036750435829163f, -0.188148453831673f, + 0.036606263369322f, -0.187793090939522f, 0.036462362855673f, -0.187437608838081f, + 0.036318738013506f, -0.187082037329674f, 0.036175385117531f, -0.186726331710815f, + 0.036032304167747f, -0.186370536684990f, 0.035889495164156f, -0.186014622449875f, + 0.035746958106756f, -0.185658603906631f, 0.035604696720839f, -0.185302466154099f, + 0.035462711006403f, -0.184946224093437f, 0.035320993512869f, -0.184589877724648f, + 0.035179551690817f, -0.184233412146568f, 0.035038381814957f, -0.183876842260361f, + 0.034897487610579f, -0.183520168066025f, 0.034756865352392f, -0.183163389563560f, + 0.034616518765688f, -0.182806491851807f, 0.034476444125175f, -0.182449504733086f, + 0.034336645156145f, -0.182092398405075f, 0.034197118133307f, -0.181735187768936f, + 0.034057866781950f, -0.181377857923508f, 0.033918887376785f, -0.181020438671112f, + 0.033780183643103f, -0.180662900209427f, 0.033641755580902f, -0.180305257439613f, + 0.033503599464893f, -0.179947525262833f, 0.033365719020367f, -0.179589673876762f, + 0.033228114247322f, -0.179231703281403f, 0.033090781420469f, -0.178873643279076f, + 0.032953724265099f, -0.178515478968620f, 0.032816942781210f, -0.178157210350037f, + 0.032680433243513f, -0.177798837423325f, 0.032544203102589f, -0.177440345287323f, + 0.032408244907856f, -0.177081763744354f, 0.032272562384605f, -0.176723077893257f, + 0.032137155532837f, -0.176364272832870f, 0.032002024352551f, -0.176005378365517f, + 0.031867165118456f, -0.175646379590034f, 0.031732585281134f, -0.175287276506424f, + 0.031598277390003f, -0.174928069114685f, 0.031464248895645f, -0.174568757414818f, + 0.031330492347479f, -0.174209341406822f, 0.031197015196085f, -0.173849821090698f, + 0.031063811853528f, -0.173490211367607f, 0.030930884182453f, -0.173130482435226f, + 0.030798232182860f, -0.172770664095879f, 0.030665857717395f, -0.172410741448402f, + 0.030533758923411f, -0.172050714492798f, 0.030401935800910f, -0.171690583229065f, + 0.030270388349891f, -0.171330362558365f, 0.030139118432999f, -0.170970037579536f, + 0.030008124187589f, -0.170609608292580f, 0.029877405613661f, -0.170249074697495f, + 0.029746964573860f, -0.169888436794281f, 0.029616801068187f, -0.169527709484100f, + 0.029486913233995f, -0.169166877865791f, 0.029357301071286f, -0.168805956840515f, + 0.029227968305349f, -0.168444931507111f, 0.029098909348249f, -0.168083801865578f, + 0.028970129787922f, -0.167722567915916f, 0.028841627761722f, -0.167361244559288f, + 0.028713401407003f, -0.166999831795692f, 0.028585452586412f, -0.166638299822807f, + 0.028457781299949f, -0.166276678442955f, 0.028330387547612f, -0.165914967656136f, + 0.028203271329403f, -0.165553152561188f, 0.028076432645321f, -0.165191248059273f, + 0.027949871495366f, -0.164829224348068f, 0.027823587879539f, -0.164467126131058f, + 0.027697581797838f, -0.164104923605919f, 0.027571853250265f, -0.163742616772652f, + 0.027446404099464f, -0.163380220532417f, 0.027321230620146f, -0.163017734885216f, + 0.027196336537600f, -0.162655144929886f, 0.027071721851826f, -0.162292465567589f, + 0.026947384700179f, -0.161929681897163f, 0.026823325082660f, -0.161566808819771f, + 0.026699542999268f, -0.161203846335411f, 0.026576040312648f, -0.160840779542923f, + 0.026452817022800f, -0.160477623343468f, 0.026329871267080f, -0.160114362835884f, + 0.026207204908133f, -0.159751012921333f, 0.026084816083312f, -0.159387573599815f, + 0.025962706655264f, -0.159024044871330f, 0.025840876623988f, -0.158660411834717f, + 0.025719324126840f, -0.158296689391136f, 0.025598052889109f, -0.157932877540588f, + 0.025477059185505f, -0.157568961381912f, 0.025356344878674f, -0.157204970717430f, + 0.025235909968615f, -0.156840875744820f, 0.025115754455328f, -0.156476691365242f, + 0.024995878338814f, -0.156112402677536f, 0.024876279756427f, -0.155748039484024f, + 0.024756962433457f, -0.155383571982384f, 0.024637924507260f, -0.155019029974937f, + 0.024519165977836f, -0.154654383659363f, 0.024400688707829f, -0.154289647936821f, + 0.024282488971949f, -0.153924822807312f, 0.024164570495486f, -0.153559908270836f, + 0.024046931415796f, -0.153194904327393f, 0.023929571732879f, -0.152829796075821f, + 0.023812493309379f, -0.152464613318443f, 0.023695694282651f, -0.152099341154099f, + 0.023579176515341f, -0.151733979582787f, 0.023462938144803f, -0.151368513703346f, + 0.023346979171038f, -0.151002973318100f, 0.023231301456690f, -0.150637343525887f, + 0.023115905001760f, -0.150271624326706f, 0.023000787943602f, -0.149905815720558f, + 0.022885952144861f, -0.149539917707443f, 0.022771397605538f, -0.149173930287361f, + 0.022657122462988f, -0.148807853460312f, 0.022543128579855f, -0.148441687226295f, + 0.022429415956140f, -0.148075446486473f, 0.022315984591842f, -0.147709101438522f, + 0.022202832624316f, -0.147342681884766f, 0.022089963778853f, -0.146976172924042f, + 0.021977374330163f, -0.146609574556351f, 0.021865066140890f, -0.146242901682854f, + 0.021753041073680f, -0.145876124501228f, 0.021641295403242f, -0.145509272813797f, + 0.021529832854867f, -0.145142331719399f, 0.021418649703264f, -0.144775316119194f, + 0.021307749673724f, -0.144408211112022f, 0.021197130903602f, -0.144041016697884f, + 0.021086793392897f, -0.143673732876778f, 0.020976737141609f, -0.143306359648705f, + 0.020866964012384f, -0.142938911914825f, 0.020757472142577f, -0.142571389675140f, + 0.020648263394833f, -0.142203763127327f, 0.020539334043860f, -0.141836062073708f, + 0.020430689677596f, -0.141468286514282f, 0.020322324708104f, -0.141100421547890f, + 0.020214242860675f, -0.140732467174530f, 0.020106444135308f, -0.140364438295364f, + 0.019998926669359f, -0.139996320009232f, 0.019891692325473f, -0.139628127217293f, + 0.019784741103649f, -0.139259845018387f, 0.019678071141243f, -0.138891488313675f, + 0.019571684300900f, -0.138523042201996f, 0.019465578719974f, -0.138154521584511f, + 0.019359756261110f, -0.137785911560059f, 0.019254218786955f, -0.137417227029800f, + 0.019148962572217f, -0.137048453092575f, 0.019043987616897f, -0.136679604649544f, + 0.018939297646284f, -0.136310681700706f, 0.018834890797734f, -0.135941669344902f, + 0.018730765208602f, -0.135572582483292f, 0.018626924604177f, -0.135203406214714f, + 0.018523367121816f, -0.134834155440331f, 0.018420090898871f, -0.134464830160141f, + 0.018317099660635f, -0.134095430374146f, 0.018214391544461f, -0.133725941181183f, + 0.018111966550350f, -0.133356377482414f, 0.018009826540947f, -0.132986739277840f, + 0.017907967790961f, -0.132617011666298f, 0.017806394025683f, -0.132247209548950f, + 0.017705103382468f, -0.131877332925797f, 0.017604095861316f, -0.131507381796837f, + 0.017503373324871f, -0.131137356162071f, 0.017402933910489f, -0.130767241120338f, + 0.017302779480815f, -0.130397051572800f, 0.017202908173203f, -0.130026802420616f, + 0.017103319987655f, -0.129656463861465f, 0.017004016786814f, -0.129286035895348f, + 0.016904998570681f, -0.128915548324585f, 0.016806263476610f, -0.128544986248016f, + 0.016707813367248f, -0.128174334764481f, 0.016609646379948f, -0.127803623676300f, + 0.016511764377356f, -0.127432823181152f, 0.016414167359471f, -0.127061963081360f, + 0.016316853463650f, -0.126691013574600f, 0.016219824552536f, -0.126320004463196f, + 0.016123080626130f, -0.125948905944824f, 0.016026621684432f, -0.125577747821808f, + 0.015930447727442f, -0.125206500291824f, 0.015834558755159f, -0.124835193157196f, + 0.015738952904940f, -0.124463804066181f, 0.015643632039428f, -0.124092340469360f, + 0.015548598021269f, -0.123720809817314f, 0.015453847125173f, -0.123349204659462f, + 0.015359382145107f, -0.122977524995804f, 0.015265202149749f, -0.122605770826340f, + 0.015171307139099f, -0.122233949601650f, 0.015077698044479f, -0.121862053871155f, + 0.014984373003244f, -0.121490091085434f, 0.014891333878040f, -0.121118053793907f, + 0.014798580668867f, -0.120745941996574f, 0.014706112444401f, -0.120373763144016f, + 0.014613929204643f, -0.120001509785652f, 0.014522032812238f, -0.119629189372063f, + 0.014430420473218f, -0.119256794452667f, 0.014339094981551f, -0.118884332478046f, + 0.014248054474592f, -0.118511803448200f, 0.014157299883664f, -0.118139199912548f, + 0.014066831208766f, -0.117766529321671f, 0.013976648449898f, -0.117393791675568f, + 0.013886751607060f, -0.117020979523659f, 0.013797140680254f, -0.116648100316525f, + 0.013707815669477f, -0.116275154054165f, 0.013618776574731f, -0.115902140736580f, + 0.013530024327338f, -0.115529052913189f, 0.013441557064652f, -0.115155905485153f, + 0.013353376649320f, -0.114782683551311f, 0.013265483081341f, -0.114409394562244f, + 0.013177875429392f, -0.114036038517952f, 0.013090553693473f, -0.113662622869015f, + 0.013003518804908f, -0.113289132714272f, 0.012916770763695f, -0.112915575504303f, + 0.012830308638513f, -0.112541958689690f, 0.012744133360684f, -0.112168267369270f, + 0.012658244930208f, -0.111794516444206f, 0.012572642415762f, -0.111420698463917f, + 0.012487327679992f, -0.111046813428402f, 0.012402298860252f, -0.110672861337662f, + 0.012317557819188f, -0.110298842191696f, 0.012233102694154f, -0.109924763441086f, + 0.012148935347795f, -0.109550617635250f, 0.012065053917468f, -0.109176412224770f, + 0.011981460265815f, -0.108802139759064f, 0.011898153461516f, -0.108427800238132f, + 0.011815134435892f, -0.108053401112556f, 0.011732402257621f, -0.107678934931755f, + 0.011649956926703f, -0.107304409146309f, 0.011567799374461f, -0.106929816305637f, + 0.011485928669572f, -0.106555156409740f, 0.011404345743358f, -0.106180444359779f, + 0.011323049664497f, -0.105805665254593f, 0.011242041364312f, -0.105430819094181f, + 0.011161320842803f, -0.105055920779705f, 0.011080888099968f, -0.104680955410004f, + 0.011000742204487f, -0.104305922985077f, 0.010920885019004f, -0.103930838406086f, + 0.010841314680874f, -0.103555686771870f, 0.010762032121420f, -0.103180475533009f, + 0.010683037340641f, -0.102805204689503f, 0.010604331269860f, -0.102429874241352f, + 0.010525912046432f, -0.102054484188557f, 0.010447781533003f, -0.101679034531116f, + 0.010369938798249f, -0.101303517818451f, 0.010292383842170f, -0.100927948951721f, + 0.010215117596090f, -0.100552320480347f, 0.010138138197362f, -0.100176624953747f, + 0.010061448439956f, -0.099800877273083f, 0.009985045529902f, -0.099425069987774f, + 0.009908932261169f, -0.099049203097820f, 0.009833106771111f, -0.098673284053802f, + 0.009757569059730f, -0.098297297954559f, 0.009682320058346f, -0.097921259701252f, + 0.009607359766960f, -0.097545161843300f, 0.009532688185573f, -0.097169004380703f, + 0.009458304382861f, -0.096792794764042f, 0.009384209290147f, -0.096416525542736f, + 0.009310402907431f, -0.096040196716785f, 0.009236886166036f, -0.095663815736771f, + 0.009163657203317f, -0.095287375152111f, 0.009090716950595f, -0.094910882413387f, + 0.009018065407872f, -0.094534330070019f, 0.008945702575147f, -0.094157725572586f, + 0.008873629383743f, -0.093781061470509f, 0.008801844902337f, -0.093404345214367f, + 0.008730349130929f, -0.093027576804161f, 0.008659142069519f, -0.092650748789310f, + 0.008588224649429f, -0.092273868620396f, 0.008517595939338f, -0.091896936297417f, + 0.008447255939245f, -0.091519944369793f, 0.008377205580473f, -0.091142900288105f, + 0.008307444863021f, -0.090765804052353f, 0.008237972855568f, -0.090388655662537f, + 0.008168790489435f, -0.090011447668076f, 0.008099896833301f, -0.089634194970131f, + 0.008031292818487f, -0.089256882667542f, 0.007962978444993f, -0.088879525661469f, + 0.007894953712821f, -0.088502109050751f, 0.007827218621969f, -0.088124647736549f, + 0.007759772241116f, -0.087747126817703f, 0.007692615967244f, -0.087369553744793f, + 0.007625748869032f, -0.086991935968399f, 0.007559171877801f, -0.086614266037941f, + 0.007492884527892f, -0.086236543953419f, 0.007426886819303f, -0.085858769714832f, + 0.007361178752035f, -0.085480943322182f, 0.007295760791749f, -0.085103072226048f, + 0.007230632472783f, -0.084725148975849f, 0.007165793795139f, -0.084347173571587f, + 0.007101245224476f, -0.083969146013260f, 0.007036986760795f, -0.083591073751450f, + 0.006973018404096f, -0.083212949335575f, 0.006909339688718f, -0.082834780216217f, + 0.006845951545984f, -0.082456558942795f, 0.006782853044569f, -0.082078292965889f, + 0.006720044650137f, -0.081699974834919f, 0.006657526828349f, -0.081321612000465f, + 0.006595299113542f, -0.080943197011948f, 0.006533361505717f, -0.080564737319946f, + 0.006471714470536f, -0.080186225473881f, 0.006410357542336f, -0.079807676374912f, + 0.006349290721118f, -0.079429075121880f, 0.006288514938205f, -0.079050421714783f, + 0.006228029262275f, -0.078671731054783f, 0.006167833693326f, -0.078292988240719f, + 0.006107929162681f, -0.077914200723171f, 0.006048315204680f, -0.077535368502140f, + 0.005988991353661f, -0.077156484127045f, 0.005929958540946f, -0.076777562499046f, + 0.005871216300875f, -0.076398596167564f, 0.005812764633447f, -0.076019577682018f, + 0.005754603538662f, -0.075640521943569f, 0.005696733482182f, -0.075261414051056f, + 0.005639153998345f, -0.074882268905640f, 0.005581865552813f, -0.074503071606159f, + 0.005524867679924f, -0.074123837053776f, 0.005468160845339f, -0.073744557797909f, + 0.005411745049059f, -0.073365233838558f, 0.005355620291084f, -0.072985872626305f, + 0.005299786105752f, -0.072606459259987f, 0.005244242958724f, -0.072227008640766f, + 0.005188991315663f, -0.071847513318062f, 0.005134030245245f, -0.071467980742455f, + 0.005079360678792f, -0.071088403463364f, 0.005024982150644f, -0.070708781480789f, + 0.004970894660801f, -0.070329122245312f, 0.004917098674923f, -0.069949418306351f, + 0.004863593727350f, -0.069569669663906f, 0.004810380283743f, -0.069189883768559f, + 0.004757457878441f, -0.068810060620308f, 0.004704826977104f, -0.068430192768574f, + 0.004652487114072f, -0.068050287663937f, 0.004600439220667f, -0.067670337855816f, + 0.004548682365566f, -0.067290350794792f, 0.004497217014432f, -0.066910326480865f, + 0.004446043167263f, -0.066530264914036f, 0.004395160824060f, -0.066150158643723f, + 0.004344569984823f, -0.065770015120506f, 0.004294271115214f, -0.065389834344387f, + 0.004244263283908f, -0.065009608864784f, 0.004194547422230f, -0.064629353582859f, + 0.004145123064518f, -0.064249053597450f, 0.004095990676433f, -0.063868723809719f, + 0.004047149792314f, -0.063488349318504f, 0.003998600877821f, -0.063107937574387f, + 0.003950343467295f, -0.062727488577366f, 0.003902378026396f, -0.062347009778023f, + 0.003854704322293f, -0.061966486275196f, 0.003807322587818f, -0.061585929244757f, + 0.003760232590139f, -0.061205338686705f, 0.003713434794918f, -0.060824707150459f, + 0.003666928736493f, -0.060444042086601f, 0.003620714880526f, -0.060063343495131f, + 0.003574792761356f, -0.059682607650757f, 0.003529162844643f, -0.059301838278770f, + 0.003483824897557f, -0.058921031653881f, 0.003438779152930f, -0.058540191501379f, + 0.003394025377929f, -0.058159314095974f, 0.003349563805386f, -0.057778406888247f, + 0.003305394435301f, -0.057397462427616f, 0.003261517267674f, -0.057016488164663f, + 0.003217932302505f, -0.056635476648808f, 0.003174639539793f, -0.056254431605339f, + 0.003131638979539f, -0.055873356759548f, 0.003088930854574f, -0.055492244660854f, + 0.003046514932066f, -0.055111102759838f, 0.003004391444847f, -0.054729927331209f, + 0.002962560392916f, -0.054348722100258f, 0.002921021543443f, -0.053967483341694f, + 0.002879775362089f, -0.053586211055517f, 0.002838821383193f, -0.053204908967018f, + 0.002798160072416f, -0.052823577076197f, 0.002757790964097f, -0.052442211657763f, + 0.002717714523897f, -0.052060816437006f, 0.002677930751815f, -0.051679391413927f, + 0.002638439415023f, -0.051297932863235f, 0.002599240746349f, -0.050916448235512f, + 0.002560334512964f, -0.050534930080175f, 0.002521721180528f, -0.050153385847807f, + 0.002483400283381f, -0.049771808087826f, 0.002445372054353f, -0.049390204250813f, + 0.002407636726275f, -0.049008570611477f, 0.002370193833485f, -0.048626907169819f, + 0.002333043841645f, -0.048245213925838f, 0.002296186750755f, -0.047863494604826f, + 0.002259622327983f, -0.047481749206781f, 0.002223350573331f, -0.047099970281124f, + 0.002187371719629f, -0.046718169003725f, 0.002151685766876f, -0.046336337924004f, + 0.002116292715073f, -0.045954477041960f, 0.002081192564219f, -0.045572593808174f, + 0.002046385314316f, -0.045190680772066f, 0.002011870965362f, -0.044808741658926f, + 0.001977649517357f, -0.044426776468754f, 0.001943721086718f, -0.044044785201550f, + 0.001910085673444f, -0.043662767857313f, 0.001876743277535f, -0.043280724436045f, + 0.001843693898991f, -0.042898654937744f, 0.001810937537812f, -0.042516563087702f, + 0.001778474310413f, -0.042134445160627f, 0.001746304216795f, -0.041752301156521f, + 0.001714427140541f, -0.041370131075382f, 0.001682843198068f, -0.040987938642502f, + 0.001651552389376f, -0.040605723857880f, 0.001620554830879f, -0.040223482996225f, + 0.001589850406162f, -0.039841219782829f, 0.001559439115226f, -0.039458930492401f, + 0.001529321074486f, -0.039076622575521f, 0.001499496400356f, -0.038694288581610f, + 0.001469964860007f, -0.038311932235956f, 0.001440726569854f, -0.037929553538561f, + 0.001411781646311f, -0.037547148764133f, 0.001383129972965f, -0.037164725363255f, + 0.001354771666229f, -0.036782283335924f, 0.001326706726104f, -0.036399815231562f, + 0.001298935036175f, -0.036017324775457f, 0.001271456829272f, -0.035634815692902f, + 0.001244271872565f, -0.035252287983894f, 0.001217380515300f, -0.034869734197855f, + 0.001190782408230f, -0.034487165510654f, 0.001164477784187f, -0.034104570746422f, + 0.001138466643170f, -0.033721961081028f, 0.001112748985179f, -0.033339329063892f, + 0.001087324810214f, -0.032956674695015f, 0.001062194118276f, -0.032574005424976f, + 0.001037356909364f, -0.032191313803196f, 0.001012813183479f, -0.031808607280254f, + 0.000988563057035f, -0.031425878405571f, 0.000964606530033f, -0.031043132767081f, + 0.000940943544265f, -0.030660368502140f, 0.000917574157938f, -0.030277585610747f, + 0.000894498312846f, -0.029894785955548f, 0.000871716125403f, -0.029511967673898f, + 0.000849227537401f, -0.029129132628441f, 0.000827032607049f, -0.028746278956532f, + 0.000805131276138f, -0.028363410383463f, 0.000783523661084f, -0.027980525046587f, + 0.000762209703680f, -0.027597622945905f, 0.000741189462133f, -0.027214704081416f, + 0.000720462878235f, -0.026831768453121f, 0.000700030010194f, -0.026448817923665f, + 0.000679890916217f, -0.026065852493048f, 0.000660045538098f, -0.025682870298624f, + 0.000640493875835f, -0.025299875065684f, 0.000621235987637f, -0.024916863068938f, + 0.000602271873504f, -0.024533838033676f, 0.000583601591643f, -0.024150796234608f, + 0.000565225025639f, -0.023767741397023f, 0.000547142291907f, -0.023384673520923f, + 0.000529353390448f, -0.023001590743661f, 0.000511858321261f, -0.022618494927883f, + 0.000494657084346f, -0.022235386073589f, 0.000477749679703f, -0.021852264180779f, + 0.000461136136437f, -0.021469129249454f, 0.000444816454547f, -0.021085981279612f, + 0.000428790634032f, -0.020702820271254f, 0.000413058703998f, -0.020319648087025f, + 0.000397620693548f, -0.019936462864280f, 0.000382476573577f, -0.019553268328309f, + 0.000367626344087f, -0.019170060753822f, 0.000353070063284f, -0.018786842003465f, + 0.000338807702065f, -0.018403612077236f, 0.000324839289533f, -0.018020370975137f, + 0.000311164796585f, -0.017637118697166f, 0.000297784281429f, -0.017253857105970f, + 0.000284697714960f, -0.016870586201549f, 0.000271905126283f, -0.016487304121256f, + 0.000259406515397f, -0.016104012727737f, 0.000247201882303f, -0.015720712020993f, + 0.000235291256104f, -0.015337402001023f, 0.000223674607696f, -0.014954082667828f, + 0.000212351980736f, -0.014570754021406f, 0.000201323360670f, -0.014187417924404f, + 0.000190588747500f, -0.013804072514176f, 0.000180148170330f, -0.013420719653368f, + 0.000170001629158f, -0.013037359341979f, 0.000160149123985f, -0.012653990648687f, + 0.000150590654812f, -0.012270614504814f, 0.000141326236189f, -0.011887230910361f, + 0.000132355868118f, -0.011503840796649f, 0.000123679565149f, -0.011120444163680f, + 0.000115297327284f, -0.010737040080130f, 0.000107209154521f, -0.010353630408645f, + 0.000099415054137f, -0.009970214217901f, 0.000091915040684f, -0.009586792439222f, + 0.000084709099610f, -0.009203365072608f, 0.000077797252743f, -0.008819932118058f, + 0.000071179500083f, -0.008436493575573f, 0.000064855834353f, -0.008053051307797f, + 0.000058826273744f, -0.007669602986425f, 0.000053090810979f, -0.007286150939763f, + 0.000047649456974f, -0.006902694236487f, 0.000042502211727f, -0.006519233807921f, + 0.000037649078877f, -0.006135769188404f, 0.000033090062061f, -0.005752300843596f, + 0.000028825161280f, -0.005368829704821f, 0.000024854381991f, -0.004985354840755f, + 0.000021177724193f, -0.004601877182722f, 0.000017795191525f, -0.004218397196382f, + 0.000014706784896f, -0.003834914416075f, 0.000011912506125f, -0.003451429307461f, + 0.000009412358850f, -0.003067942336202f, 0.000007206342616f, -0.002684453502297f, + 0.000005294459243f, -0.002300963038579f, 0.000003676709639f, -0.001917471294291f, + 0.000002353095169f, -0.001533978385851f, 0.000001323616516f, -0.001150484546088f, + 0.000000588274133f, -0.000766990066040f, 0.000000147068562f, -0.000383495149435f, + 0.000000000000000f, -0.000000000000023f, 0.000000147068562f, 0.000383495149435f, + 0.000000588274133f, 0.000766990066040f, 0.000001323616516f, 0.001150484546088f, + 0.000002353095169f, 0.001533978385851f, 0.000003676709639f, 0.001917471294291f, + 0.000005294459243f, 0.002300963038579f, 0.000007206342616f, 0.002684453502297f, + 0.000009412358850f, 0.003067942336202f, 0.000011912506125f, 0.003451429307461f, + 0.000014706784896f, 0.003834914416075f, 0.000017795191525f, 0.004218397196382f, + 0.000021177724193f, 0.004601877182722f, 0.000024854381991f, 0.004985354840755f, + 0.000028825161280f, 0.005368829704821f, 0.000033090062061f, 0.005752300843596f, + 0.000037649078877f, 0.006135769188404f, 0.000042502211727f, 0.006519233807921f, + 0.000047649456974f, 0.006902694236487f, 0.000053090810979f, 0.007286150939763f, + 0.000058826273744f, 0.007669602986425f, 0.000064855834353f, 0.008053051307797f, + 0.000071179500083f, 0.008436493575573f, 0.000077797252743f, 0.008819932118058f, + 0.000084709099610f, 0.009203365072608f, 0.000091915040684f, 0.009586792439222f, + 0.000099415054137f, 0.009970214217901f, 0.000107209154521f, 0.010353630408645f, + 0.000115297327284f, 0.010737040080130f, 0.000123679565149f, 0.011120444163680f, + 0.000132355868118f, 0.011503840796649f, 0.000141326236189f, 0.011887230910361f, + 0.000150590654812f, 0.012270614504814f, 0.000160149123985f, 0.012653990648687f, + 0.000170001629158f, 0.013037359341979f, 0.000180148170330f, 0.013420719653368f, + 0.000190588747500f, 0.013804072514176f, 0.000201323360670f, 0.014187417924404f, + 0.000212351980736f, 0.014570754021406f, 0.000223674607696f, 0.014954082667828f, + 0.000235291256104f, 0.015337402001023f, 0.000247201882303f, 0.015720712020993f, + 0.000259406515397f, 0.016104012727737f, 0.000271905126283f, 0.016487304121256f, + 0.000284697714960f, 0.016870586201549f, 0.000297784281429f, 0.017253857105970f, + 0.000311164796585f, 0.017637118697166f, 0.000324839289533f, 0.018020370975137f, + 0.000338807702065f, 0.018403612077236f, 0.000353070063284f, 0.018786842003465f, + 0.000367626344087f, 0.019170060753822f, 0.000382476573577f, 0.019553268328309f, + 0.000397620693548f, 0.019936462864280f, 0.000413058703998f, 0.020319648087025f, + 0.000428790634032f, 0.020702820271254f, 0.000444816454547f, 0.021085981279612f, + 0.000461136136437f, 0.021469129249454f, 0.000477749679703f, 0.021852264180779f, + 0.000494657084346f, 0.022235386073589f, 0.000511858321261f, 0.022618494927883f, + 0.000529353390448f, 0.023001590743661f, 0.000547142291907f, 0.023384673520923f, + 0.000565225025639f, 0.023767741397023f, 0.000583601591643f, 0.024150796234608f, + 0.000602271873504f, 0.024533838033676f, 0.000621235987637f, 0.024916863068938f, + 0.000640493875835f, 0.025299875065684f, 0.000660045538098f, 0.025682870298624f, + 0.000679890916217f, 0.026065852493048f, 0.000700030010194f, 0.026448817923665f, + 0.000720462878235f, 0.026831768453121f, 0.000741189462133f, 0.027214704081416f, + 0.000762209703680f, 0.027597622945905f, 0.000783523661084f, 0.027980525046587f, + 0.000805131276138f, 0.028363410383463f, 0.000827032607049f, 0.028746278956532f, + 0.000849227537401f, 0.029129132628441f, 0.000871716125403f, 0.029511967673898f, + 0.000894498312846f, 0.029894785955548f, 0.000917574157938f, 0.030277585610747f, + 0.000940943544265f, 0.030660368502140f, 0.000964606530033f, 0.031043132767081f, + 0.000988563057035f, 0.031425878405571f, 0.001012813183479f, 0.031808607280254f, + 0.001037356909364f, 0.032191313803196f, 0.001062194118276f, 0.032574005424976f, + 0.001087324810214f, 0.032956674695015f, 0.001112748985179f, 0.033339329063892f, + 0.001138466643170f, 0.033721961081028f, 0.001164477784187f, 0.034104570746422f, + 0.001190782408230f, 0.034487165510654f, 0.001217380515300f, 0.034869734197855f, + 0.001244271872565f, 0.035252287983894f, 0.001271456829272f, 0.035634815692902f, + 0.001298935036175f, 0.036017324775457f, 0.001326706726104f, 0.036399815231562f, + 0.001354771666229f, 0.036782283335924f, 0.001383129972965f, 0.037164725363255f, + 0.001411781646311f, 0.037547148764133f, 0.001440726569854f, 0.037929553538561f, + 0.001469964860007f, 0.038311932235956f, 0.001499496400356f, 0.038694288581610f, + 0.001529321074486f, 0.039076622575521f, 0.001559439115226f, 0.039458930492401f, + 0.001589850406162f, 0.039841219782829f, 0.001620554830879f, 0.040223482996225f, + 0.001651552389376f, 0.040605723857880f, 0.001682843198068f, 0.040987938642502f, + 0.001714427140541f, 0.041370131075382f, 0.001746304216795f, 0.041752301156521f, + 0.001778474310413f, 0.042134445160627f, 0.001810937537812f, 0.042516563087702f, + 0.001843693898991f, 0.042898654937744f, 0.001876743277535f, 0.043280724436045f, + 0.001910085673444f, 0.043662767857313f, 0.001943721086718f, 0.044044785201550f, + 0.001977649517357f, 0.044426776468754f, 0.002011870965362f, 0.044808741658926f, + 0.002046385314316f, 0.045190680772066f, 0.002081192564219f, 0.045572593808174f, + 0.002116292715073f, 0.045954477041960f, 0.002151685766876f, 0.046336337924004f, + 0.002187371719629f, 0.046718169003725f, 0.002223350573331f, 0.047099970281124f, + 0.002259622327983f, 0.047481749206781f, 0.002296186750755f, 0.047863494604826f, + 0.002333043841645f, 0.048245213925838f, 0.002370193833485f, 0.048626907169819f, + 0.002407636726275f, 0.049008570611477f, 0.002445372054353f, 0.049390204250813f, + 0.002483400283381f, 0.049771808087826f, 0.002521721180528f, 0.050153385847807f, + 0.002560334512964f, 0.050534930080175f, 0.002599240746349f, 0.050916448235512f, + 0.002638439415023f, 0.051297932863235f, 0.002677930751815f, 0.051679391413927f, + 0.002717714523897f, 0.052060816437006f, 0.002757790964097f, 0.052442211657763f, + 0.002798160072416f, 0.052823577076197f, 0.002838821383193f, 0.053204908967018f, + 0.002879775362089f, 0.053586211055517f, 0.002921021543443f, 0.053967483341694f, + 0.002962560392916f, 0.054348722100258f, 0.003004391444847f, 0.054729927331209f, + 0.003046514932066f, 0.055111102759838f, 0.003088930854574f, 0.055492244660854f, + 0.003131638979539f, 0.055873356759548f, 0.003174639539793f, 0.056254431605339f, + 0.003217932302505f, 0.056635476648808f, 0.003261517267674f, 0.057016488164663f, + 0.003305394435301f, 0.057397462427616f, 0.003349563805386f, 0.057778406888247f, + 0.003394025377929f, 0.058159314095974f, 0.003438779152930f, 0.058540191501379f, + 0.003483824897557f, 0.058921031653881f, 0.003529162844643f, 0.059301838278770f, + 0.003574792761356f, 0.059682607650757f, 0.003620714880526f, 0.060063343495131f, + 0.003666928736493f, 0.060444042086601f, 0.003713434794918f, 0.060824707150459f, + 0.003760232590139f, 0.061205338686705f, 0.003807322587818f, 0.061585929244757f, + 0.003854704322293f, 0.061966486275196f, 0.003902378026396f, 0.062347009778023f, + 0.003950343467295f, 0.062727488577366f, 0.003998600877821f, 0.063107937574387f, + 0.004047149792314f, 0.063488349318504f, 0.004095990676433f, 0.063868723809719f, + 0.004145123064518f, 0.064249053597450f, 0.004194547422230f, 0.064629353582859f, + 0.004244263283908f, 0.065009608864784f, 0.004294271115214f, 0.065389834344387f, + 0.004344569984823f, 0.065770015120506f, 0.004395160824060f, 0.066150158643723f, + 0.004446043167263f, 0.066530264914036f, 0.004497217014432f, 0.066910326480865f, + 0.004548682365566f, 0.067290350794792f, 0.004600439220667f, 0.067670337855816f, + 0.004652487114072f, 0.068050287663937f, 0.004704826977104f, 0.068430192768574f, + 0.004757457878441f, 0.068810060620308f, 0.004810380283743f, 0.069189883768559f, + 0.004863593727350f, 0.069569669663906f, 0.004917098674923f, 0.069949418306351f, + 0.004970894660801f, 0.070329122245312f, 0.005024982150644f, 0.070708781480789f, + 0.005079360678792f, 0.071088403463364f, 0.005134030245245f, 0.071467980742455f, + 0.005188991315663f, 0.071847513318062f, 0.005244242958724f, 0.072227008640766f, + 0.005299786105752f, 0.072606459259987f, 0.005355620291084f, 0.072985872626305f, + 0.005411745049059f, 0.073365233838558f, 0.005468160845339f, 0.073744557797909f, + 0.005524867679924f, 0.074123837053776f, 0.005581865552813f, 0.074503071606159f, + 0.005639153998345f, 0.074882268905640f, 0.005696733482182f, 0.075261414051056f, + 0.005754603538662f, 0.075640521943569f, 0.005812764633447f, 0.076019577682018f, + 0.005871216300875f, 0.076398596167564f, 0.005929958540946f, 0.076777562499046f, + 0.005988991353661f, 0.077156484127045f, 0.006048315204680f, 0.077535368502140f, + 0.006107929162681f, 0.077914200723171f, 0.006167833693326f, 0.078292988240719f, + 0.006228029262275f, 0.078671731054783f, 0.006288514938205f, 0.079050421714783f, + 0.006349290721118f, 0.079429075121880f, 0.006410357542336f, 0.079807676374912f, + 0.006471714470536f, 0.080186225473881f, 0.006533361505717f, 0.080564737319946f, + 0.006595299113542f, 0.080943197011948f, 0.006657526828349f, 0.081321612000465f, + 0.006720044650137f, 0.081699974834919f, 0.006782853044569f, 0.082078292965889f, + 0.006845951545984f, 0.082456558942795f, 0.006909339688718f, 0.082834780216217f, + 0.006973018404096f, 0.083212949335575f, 0.007036986760795f, 0.083591073751450f, + 0.007101245224476f, 0.083969146013260f, 0.007165793795139f, 0.084347173571587f, + 0.007230632472783f, 0.084725148975849f, 0.007295760791749f, 0.085103072226048f, + 0.007361178752035f, 0.085480943322182f, 0.007426886819303f, 0.085858769714832f, + 0.007492884527892f, 0.086236543953419f, 0.007559171877801f, 0.086614266037941f, + 0.007625748869032f, 0.086991935968399f, 0.007692615967244f, 0.087369553744793f, + 0.007759772241116f, 0.087747126817703f, 0.007827218621969f, 0.088124647736549f, + 0.007894953712821f, 0.088502109050751f, 0.007962978444993f, 0.088879525661469f, + 0.008031292818487f, 0.089256882667542f, 0.008099896833301f, 0.089634194970131f, + 0.008168790489435f, 0.090011447668076f, 0.008237972855568f, 0.090388655662537f, + 0.008307444863021f, 0.090765804052353f, 0.008377205580473f, 0.091142900288105f, + 0.008447255939245f, 0.091519944369793f, 0.008517595939338f, 0.091896936297417f, + 0.008588224649429f, 0.092273868620396f, 0.008659142069519f, 0.092650748789310f, + 0.008730349130929f, 0.093027576804161f, 0.008801844902337f, 0.093404345214367f, + 0.008873629383743f, 0.093781061470509f, 0.008945702575147f, 0.094157725572586f, + 0.009018065407872f, 0.094534330070019f, 0.009090716950595f, 0.094910882413387f, + 0.009163657203317f, 0.095287375152111f, 0.009236886166036f, 0.095663815736771f, + 0.009310402907431f, 0.096040196716785f, 0.009384209290147f, 0.096416525542736f, + 0.009458304382861f, 0.096792794764042f, 0.009532688185573f, 0.097169004380703f, + 0.009607359766960f, 0.097545161843300f, 0.009682320058346f, 0.097921259701252f, + 0.009757569059730f, 0.098297297954559f, 0.009833106771111f, 0.098673284053802f, + 0.009908932261169f, 0.099049203097820f, 0.009985045529902f, 0.099425069987774f, + 0.010061448439956f, 0.099800877273083f, 0.010138138197362f, 0.100176624953747f, + 0.010215117596090f, 0.100552320480347f, 0.010292383842170f, 0.100927948951721f, + 0.010369938798249f, 0.101303517818451f, 0.010447781533003f, 0.101679034531116f, + 0.010525912046432f, 0.102054484188557f, 0.010604331269860f, 0.102429874241352f, + 0.010683037340641f, 0.102805204689503f, 0.010762032121420f, 0.103180475533009f, + 0.010841314680874f, 0.103555686771870f, 0.010920885019004f, 0.103930838406086f, + 0.011000742204487f, 0.104305922985077f, 0.011080888099968f, 0.104680955410004f, + 0.011161320842803f, 0.105055920779705f, 0.011242041364312f, 0.105430819094181f, + 0.011323049664497f, 0.105805665254593f, 0.011404345743358f, 0.106180444359779f, + 0.011485928669572f, 0.106555156409740f, 0.011567799374461f, 0.106929816305637f, + 0.011649956926703f, 0.107304409146309f, 0.011732402257621f, 0.107678934931755f, + 0.011815134435892f, 0.108053401112556f, 0.011898153461516f, 0.108427800238132f, + 0.011981460265815f, 0.108802139759064f, 0.012065053917468f, 0.109176412224770f, + 0.012148935347795f, 0.109550617635250f, 0.012233102694154f, 0.109924763441086f, + 0.012317557819188f, 0.110298842191696f, 0.012402298860252f, 0.110672861337662f, + 0.012487327679992f, 0.111046813428402f, 0.012572642415762f, 0.111420698463917f, + 0.012658244930208f, 0.111794516444206f, 0.012744133360684f, 0.112168267369270f, + 0.012830308638513f, 0.112541958689690f, 0.012916770763695f, 0.112915575504303f, + 0.013003518804908f, 0.113289132714272f, 0.013090553693473f, 0.113662622869015f, + 0.013177875429392f, 0.114036038517952f, 0.013265483081341f, 0.114409394562244f, + 0.013353376649320f, 0.114782683551311f, 0.013441557064652f, 0.115155905485153f, + 0.013530024327338f, 0.115529052913189f, 0.013618776574731f, 0.115902140736580f, + 0.013707815669477f, 0.116275154054165f, 0.013797140680254f, 0.116648100316525f, + 0.013886751607060f, 0.117020979523659f, 0.013976648449898f, 0.117393791675568f, + 0.014066831208766f, 0.117766529321671f, 0.014157299883664f, 0.118139199912548f, + 0.014248054474592f, 0.118511803448200f, 0.014339094981551f, 0.118884332478046f, + 0.014430420473218f, 0.119256794452667f, 0.014522032812238f, 0.119629189372063f, + 0.014613929204643f, 0.120001509785652f, 0.014706112444401f, 0.120373763144016f, + 0.014798580668867f, 0.120745941996574f, 0.014891333878040f, 0.121118053793907f, + 0.014984373003244f, 0.121490091085434f, 0.015077698044479f, 0.121862053871155f, + 0.015171307139099f, 0.122233949601650f, 0.015265202149749f, 0.122605770826340f, + 0.015359382145107f, 0.122977524995804f, 0.015453847125173f, 0.123349204659462f, + 0.015548598021269f, 0.123720809817314f, 0.015643632039428f, 0.124092340469360f, + 0.015738952904940f, 0.124463804066181f, 0.015834558755159f, 0.124835193157196f, + 0.015930447727442f, 0.125206500291824f, 0.016026621684432f, 0.125577747821808f, + 0.016123080626130f, 0.125948905944824f, 0.016219824552536f, 0.126320004463196f, + 0.016316853463650f, 0.126691013574600f, 0.016414167359471f, 0.127061963081360f, + 0.016511764377356f, 0.127432823181152f, 0.016609646379948f, 0.127803623676300f, + 0.016707813367248f, 0.128174334764481f, 0.016806263476610f, 0.128544986248016f, + 0.016904998570681f, 0.128915548324585f, 0.017004016786814f, 0.129286035895348f, + 0.017103319987655f, 0.129656463861465f, 0.017202908173203f, 0.130026802420616f, + 0.017302779480815f, 0.130397051572800f, 0.017402933910489f, 0.130767241120338f, + 0.017503373324871f, 0.131137356162071f, 0.017604095861316f, 0.131507381796837f, + 0.017705103382468f, 0.131877332925797f, 0.017806394025683f, 0.132247209548950f, + 0.017907967790961f, 0.132617011666298f, 0.018009826540947f, 0.132986739277840f, + 0.018111966550350f, 0.133356377482414f, 0.018214391544461f, 0.133725941181183f, + 0.018317099660635f, 0.134095430374146f, 0.018420090898871f, 0.134464830160141f, + 0.018523367121816f, 0.134834155440331f, 0.018626924604177f, 0.135203406214714f, + 0.018730765208602f, 0.135572582483292f, 0.018834890797734f, 0.135941669344902f, + 0.018939297646284f, 0.136310681700706f, 0.019043987616897f, 0.136679604649544f, + 0.019148962572217f, 0.137048453092575f, 0.019254218786955f, 0.137417227029800f, + 0.019359756261110f, 0.137785911560059f, 0.019465578719974f, 0.138154521584511f, + 0.019571684300900f, 0.138523042201996f, 0.019678071141243f, 0.138891488313675f, + 0.019784741103649f, 0.139259845018387f, 0.019891692325473f, 0.139628127217293f, + 0.019998926669359f, 0.139996320009232f, 0.020106444135308f, 0.140364438295364f, + 0.020214242860675f, 0.140732467174530f, 0.020322324708104f, 0.141100421547890f, + 0.020430689677596f, 0.141468286514282f, 0.020539334043860f, 0.141836062073708f, + 0.020648263394833f, 0.142203763127327f, 0.020757472142577f, 0.142571389675140f, + 0.020866964012384f, 0.142938911914825f, 0.020976737141609f, 0.143306359648705f, + 0.021086793392897f, 0.143673732876778f, 0.021197130903602f, 0.144041016697884f, + 0.021307749673724f, 0.144408211112022f, 0.021418649703264f, 0.144775316119194f, + 0.021529832854867f, 0.145142331719399f, 0.021641295403242f, 0.145509272813797f, + 0.021753041073680f, 0.145876124501228f, 0.021865066140890f, 0.146242901682854f, + 0.021977374330163f, 0.146609574556351f, 0.022089963778853f, 0.146976172924042f, + 0.022202832624316f, 0.147342681884766f, 0.022315984591842f, 0.147709101438522f, + 0.022429415956140f, 0.148075446486473f, 0.022543128579855f, 0.148441687226295f, + 0.022657122462988f, 0.148807853460312f, 0.022771397605538f, 0.149173930287361f, + 0.022885952144861f, 0.149539917707443f, 0.023000787943602f, 0.149905815720558f, + 0.023115905001760f, 0.150271624326706f, 0.023231301456690f, 0.150637343525887f, + 0.023346979171038f, 0.151002973318100f, 0.023462938144803f, 0.151368513703346f, + 0.023579176515341f, 0.151733979582787f, 0.023695694282651f, 0.152099341154099f, + 0.023812493309379f, 0.152464613318443f, 0.023929571732879f, 0.152829796075821f, + 0.024046931415796f, 0.153194904327393f, 0.024164570495486f, 0.153559908270836f, + 0.024282488971949f, 0.153924822807312f, 0.024400688707829f, 0.154289647936821f, + 0.024519165977836f, 0.154654383659363f, 0.024637924507260f, 0.155019029974937f, + 0.024756962433457f, 0.155383571982384f, 0.024876279756427f, 0.155748039484024f, + 0.024995878338814f, 0.156112402677536f, 0.025115754455328f, 0.156476691365242f, + 0.025235909968615f, 0.156840875744820f, 0.025356344878674f, 0.157204970717430f, + 0.025477059185505f, 0.157568961381912f, 0.025598052889109f, 0.157932877540588f, + 0.025719324126840f, 0.158296689391136f, 0.025840876623988f, 0.158660411834717f, + 0.025962706655264f, 0.159024044871330f, 0.026084816083312f, 0.159387573599815f, + 0.026207204908133f, 0.159751012921333f, 0.026329871267080f, 0.160114362835884f, + 0.026452817022800f, 0.160477623343468f, 0.026576040312648f, 0.160840779542923f, + 0.026699542999268f, 0.161203846335411f, 0.026823325082660f, 0.161566808819771f, + 0.026947384700179f, 0.161929681897163f, 0.027071721851826f, 0.162292465567589f, + 0.027196336537600f, 0.162655144929886f, 0.027321230620146f, 0.163017734885216f, + 0.027446404099464f, 0.163380220532417f, 0.027571853250265f, 0.163742616772652f, + 0.027697581797838f, 0.164104923605919f, 0.027823587879539f, 0.164467126131058f, + 0.027949871495366f, 0.164829224348068f, 0.028076432645321f, 0.165191248059273f, + 0.028203271329403f, 0.165553152561188f, 0.028330387547612f, 0.165914967656136f, + 0.028457781299949f, 0.166276678442955f, 0.028585452586412f, 0.166638299822807f, + 0.028713401407003f, 0.166999831795692f, 0.028841627761722f, 0.167361244559288f, + 0.028970129787922f, 0.167722567915916f, 0.029098909348249f, 0.168083801865578f, + 0.029227968305349f, 0.168444931507111f, 0.029357301071286f, 0.168805956840515f, + 0.029486913233995f, 0.169166877865791f, 0.029616801068187f, 0.169527709484100f, + 0.029746964573860f, 0.169888436794281f, 0.029877405613661f, 0.170249074697495f, + 0.030008124187589f, 0.170609608292580f, 0.030139118432999f, 0.170970037579536f, + 0.030270388349891f, 0.171330362558365f, 0.030401935800910f, 0.171690583229065f, + 0.030533758923411f, 0.172050714492798f, 0.030665857717395f, 0.172410741448402f, + 0.030798232182860f, 0.172770664095879f, 0.030930884182453f, 0.173130482435226f, + 0.031063811853528f, 0.173490211367607f, 0.031197015196085f, 0.173849821090698f, + 0.031330492347479f, 0.174209341406822f, 0.031464248895645f, 0.174568757414818f, + 0.031598277390003f, 0.174928069114685f, 0.031732585281134f, 0.175287276506424f, + 0.031867165118456f, 0.175646379590034f, 0.032002024352551f, 0.176005378365517f, + 0.032137155532837f, 0.176364272832870f, 0.032272562384605f, 0.176723077893257f, + 0.032408244907856f, 0.177081763744354f, 0.032544203102589f, 0.177440345287323f, + 0.032680433243513f, 0.177798837423325f, 0.032816942781210f, 0.178157210350037f, + 0.032953724265099f, 0.178515478968620f, 0.033090781420469f, 0.178873643279076f, + 0.033228114247322f, 0.179231703281403f, 0.033365719020367f, 0.179589673876762f, + 0.033503599464893f, 0.179947525262833f, 0.033641755580902f, 0.180305257439613f, + 0.033780183643103f, 0.180662900209427f, 0.033918887376785f, 0.181020438671112f, + 0.034057866781950f, 0.181377857923508f, 0.034197118133307f, 0.181735187768936f, + 0.034336645156145f, 0.182092398405075f, 0.034476444125175f, 0.182449504733086f, + 0.034616518765688f, 0.182806491851807f, 0.034756865352392f, 0.183163389563560f, + 0.034897487610579f, 0.183520168066025f, 0.035038381814957f, 0.183876842260361f, + 0.035179551690817f, 0.184233412146568f, 0.035320993512869f, 0.184589877724648f, + 0.035462711006403f, 0.184946224093437f, 0.035604696720839f, 0.185302466154099f, + 0.035746958106756f, 0.185658603906631f, 0.035889495164156f, 0.186014622449875f, + 0.036032304167747f, 0.186370536684990f, 0.036175385117531f, 0.186726331710815f, + 0.036318738013506f, 0.187082037329674f, 0.036462362855673f, 0.187437608838081f, + 0.036606263369322f, 0.187793090939522f, 0.036750435829163f, 0.188148453831673f, + 0.036894880235195f, 0.188503712415695f, 0.037039596587420f, 0.188858851790428f, + 0.037184584885836f, 0.189213871955872f, 0.037329845130444f, 0.189568802714348f, + 0.037475381046534f, 0.189923599362373f, 0.037621185183525f, 0.190278306603432f, + 0.037767261266708f, 0.190632879734039f, 0.037913613021374f, 0.190987363457680f, + 0.038060232996941f, 0.191341713070869f, 0.038207128643990f, 0.191695958375931f, + 0.038354292511940f, 0.192050099372864f, 0.038501728326082f, 0.192404121160507f, + 0.038649436086416f, 0.192758023738861f, 0.038797415792942f, 0.193111822009087f, + 0.038945667445660f, 0.193465501070023f, 0.039094187319279f, 0.193819075822830f, + 0.039242979139090f, 0.194172516465187f, 0.039392042905092f, 0.194525867700577f, + 0.039541378617287f, 0.194879084825516f, 0.039690986275673f, 0.195232197642326f, + 0.039840862154961f, 0.195585191249847f, 0.039991009980440f, 0.195938065648079f, + 0.040141426026821f, 0.196290835738182f, 0.040292114019394f, 0.196643486618996f, + 0.040443073958158f, 0.196996018290520f, 0.040594302117825f, 0.197348430752754f, + 0.040745802223682f, 0.197700738906860f, 0.040897574275732f, 0.198052927851677f, + 0.041049610823393f, 0.198404997587204f, 0.041201923042536f, 0.198756948113441f, + 0.041354499757290f, 0.199108779430389f, 0.041507352143526f, 0.199460506439209f, + 0.041660469025373f, 0.199812099337578f, 0.041813857853413f, 0.200163587927818f, + 0.041967518627644f, 0.200514942407608f, 0.042121443897486f, 0.200866192579269f, + 0.042275641113520f, 0.201217323541641f, 0.042430106550455f, 0.201568335294724f, + 0.042584843933582f, 0.201919227838516f, 0.042739849537611f, 0.202270001173019f, + 0.042895123362541f, 0.202620655298233f, 0.043050665408373f, 0.202971190214157f, + 0.043206475675106f, 0.203321605920792f, 0.043362557888031f, 0.203671902418137f, + 0.043518904596567f, 0.204022079706192f, 0.043675523251295f, 0.204372137784958f, + 0.043832406401634f, 0.204722076654434f, 0.043989561498165f, 0.205071896314621f, + 0.044146984815598f, 0.205421581864357f, 0.044304672628641f, 0.205771163105965f, + 0.044462632387877f, 0.206120610237122f, 0.044620860368013f, 0.206469938158989f, + 0.044779352843761f, 0.206819161772728f, 0.044938117265701f, 0.207168251276016f, + 0.045097146183252f, 0.207517206668854f, 0.045256443321705f, 0.207866057753563f, + 0.045416008681059f, 0.208214774727821f, 0.045575842261314f, 0.208563387393951f, + 0.045735940337181f, 0.208911851048470f, 0.045896306633949f, 0.209260210394859f, + 0.046056941151619f, 0.209608450531960f, 0.046217843890190f, 0.209956556558609f, + 0.046379011124372f, 0.210304543375969f, 0.046540446579456f, 0.210652396082878f, + 0.046702146530151f, 0.211000129580498f, 0.046864114701748f, 0.211347743868828f, + 0.047026351094246f, 0.211695238947868f, 0.047188851982355f, 0.212042599916458f, + 0.047351621091366f, 0.212389841675758f, 0.047514654695988f, 0.212736949324608f, + 0.047677956521511f, 0.213083937764168f, 0.047841522842646f, 0.213430806994438f, + 0.048005353659391f, 0.213777542114258f, 0.048169452697039f, 0.214124158024788f, + 0.048333816230297f, 0.214470639824867f, 0.048498444259167f, 0.214817002415657f, + 0.048663340508938f, 0.215163245797157f, 0.048828501254320f, 0.215509355068207f, + 0.048993926495314f, 0.215855330228806f, 0.049159619957209f, 0.216201186180115f, + 0.049325577914715f, 0.216546908020973f, 0.049491796642542f, 0.216892510652542f, + 0.049658283591270f, 0.217237979173660f, 0.049825038760900f, 0.217583328485489f, + 0.049992054700851f, 0.217928543686867f, 0.050159335136414f, 0.218273624777794f, + 0.050326880067587f, 0.218618586659431f, 0.050494693219662f, 0.218963414430618f, + 0.050662767142057f, 0.219308122992516f, 0.050831105560064f, 0.219652697443962f, + 0.050999708473682f, 0.219997137784958f, 0.051168579608202f, 0.220341444015503f, + 0.051337707787752f, 0.220685631036758f, 0.051507104188204f, 0.221029683947563f, + 0.051676765084267f, 0.221373617649078f, 0.051846686750650f, 0.221717402338982f, + 0.052016876637936f, 0.222061067819595f, 0.052187327295542f, 0.222404599189758f, + 0.052358038723469f, 0.222748011350632f, 0.052529018372297f, 0.223091274499893f, + 0.052700258791447f, 0.223434418439865f, 0.052871759980917f, 0.223777428269386f, + 0.053043525665998f, 0.224120303988457f, 0.053215555846691f, 0.224463045597076f, + 0.053387850522995f, 0.224805667996407f, 0.053560405969620f, 0.225148141384125f, + 0.053733222186565f, 0.225490495562553f, 0.053906302899122f, 0.225832715630531f, + 0.054079644382000f, 0.226174786686897f, 0.054253250360489f, 0.226516738533974f, + 0.054427117109299f, 0.226858556270599f, 0.054601248353720f, 0.227200239896774f, + 0.054775636643171f, 0.227541789412498f, 0.054950293153524f, 0.227883204817772f, + 0.055125206708908f, 0.228224486112595f, 0.055300384759903f, 0.228565633296967f, + 0.055475823581219f, 0.228906646370888f, 0.055651523172855f, 0.229247525334358f, + 0.055827483534813f, 0.229588270187378f, 0.056003704667091f, 0.229928880929947f, + 0.056180190294981f, 0.230269357562065f, 0.056356932967901f, 0.230609700083733f, + 0.056533940136433f, 0.230949893593788f, 0.056711208075285f, 0.231289967894554f, + 0.056888736784458f, 0.231629893183708f, 0.057066522538662f, 0.231969684362412f, + 0.057244572788477f, 0.232309341430664f, 0.057422880083323f, 0.232648864388466f, + 0.057601451873779f, 0.232988253235817f, 0.057780280709267f, 0.233327493071556f, + 0.057959370315075f, 0.233666598796844f, 0.058138720691204f, 0.234005570411682f, + 0.058318331837654f, 0.234344407916069f, 0.058498200029135f, 0.234683111310005f, + 0.058678328990936f, 0.235021665692329f, 0.058858718723059f, 0.235360085964203f, + 0.059039369225502f, 0.235698372125626f, 0.059220276772976f, 0.236036509275436f, + 0.059401445090771f, 0.236374512314796f, 0.059582870453596f, 0.236712381243706f, + 0.059764556586742f, 0.237050101161003f, 0.059946499764919f, 0.237387686967850f, + 0.060128703713417f, 0.237725138664246f, 0.060311164706945f, 0.238062441349030f, + 0.060493886470795f, 0.238399609923363f, 0.060676865279675f, 0.238736644387245f, + 0.060860104858875f, 0.239073529839516f, 0.061043601483107f, 0.239410281181335f, + 0.061227355152369f, 0.239746883511543f, 0.061411365866661f, 0.240083336830139f, + 0.061595637351274f, 0.240419670939446f, 0.061780165880919f, 0.240755841135979f, + 0.061964951455593f, 0.241091892123222f, 0.062149997800589f, 0.241427779197693f, + 0.062335297465324f, 0.241763532161713f, 0.062520854175091f, 0.242099151015282f, + 0.062706671655178f, 0.242434620857239f, 0.062892749905586f, 0.242769956588745f, + 0.063079081475735f, 0.243105143308640f, 0.063265666365623f, 0.243440181016922f, + 0.063452512025833f, 0.243775084614754f, 0.063639611005783f, 0.244109839200974f, + 0.063826970756054f, 0.244444444775581f, 0.064014583826065f, 0.244778916239738f, + 0.064202457666397f, 0.245113238692284f, 0.064390584826469f, 0.245447427034378f, + 0.064578965306282f, 0.245781451463699f, 0.064767606556416f, 0.246115356683731f, + 0.064956501126289f, 0.246449097990990f, 0.065145656466484f, 0.246782705187798f, + 0.065335065126419f, 0.247116148471832f, 0.065524727106094f, 0.247449472546577f, + 0.065714649856091f, 0.247782632708550f, 0.065904818475246f, 0.248115643858910f, + 0.066095255315304f, 0.248448520898819f, 0.066285938024521f, 0.248781248927116f, + 0.066476874053478f, 0.249113827943802f, 0.066668070852757f, 0.249446272850037f, + 0.066859520971775f, 0.249778553843498f, 0.067051224410534f, 0.250110685825348f, + 0.067243188619614f, 0.250442683696747f, 0.067435398697853f, 0.250774532556534f, + 0.067627869546413f, 0.251106232404709f, 0.067820593714714f, 0.251437783241272f, + 0.068013571202755f, 0.251769185066223f, 0.068206802010536f, 0.252100437879562f, + 0.068400286138058f, 0.252431541681290f, 0.068594031035900f, 0.252762526273727f, + 0.068788021802902f, 0.253093332052231f, 0.068982265889645f, 0.253423988819122f, + 0.069176770746708f, 0.253754496574402f, 0.069371521472931f, 0.254084855318069f, + 0.069566532969475f, 0.254415065050125f, 0.069761790335178f, 0.254745125770569f, + 0.069957308471203f, 0.255075037479401f, 0.070153072476387f, 0.255404800176620f, + 0.070349089801311f, 0.255734413862228f, 0.070545360445976f, 0.256063878536224f, + 0.070741884410381f, 0.256393194198608f, 0.070938661694527f, 0.256722360849380f, + 0.071135692298412f, 0.257051378488541f, 0.071332976222038f, 0.257380217313766f, + 0.071530513465405f, 0.257708936929703f, 0.071728296577930f, 0.258037507534027f, + 0.071926333010197f, 0.258365899324417f, 0.072124622762203f, 0.258694142103195f, + 0.072323165833950f, 0.259022265672684f, 0.072521962225437f, 0.259350210428238f, + 0.072721004486084f, 0.259678006172180f, 0.072920300066471f, 0.260005623102188f, + 0.073119848966599f, 0.260333120822906f, 0.073319651186466f, 0.260660469532013f, + 0.073519699275494f, 0.260987639427185f, 0.073720000684261f, 0.261314690113068f, + 0.073920547962189f, 0.261641561985016f, 0.074121348559856f, 0.261968284845352f, + 0.074322402477264f, 0.262294828891754f, 0.074523709714413f, 0.262621253728867f, + 0.074725262820721f, 0.262947499752045f, 0.074927061796188f, 0.263273626565933f, + 0.075129114091396f, 0.263599574565887f, 0.075331419706345f, 0.263925373554230f, + 0.075533971190453f, 0.264250993728638f, 0.075736775994301f, 0.264576494693756f, + 0.075939826667309f, 0.264901816844940f, 0.076143130660057f, 0.265226989984512f, + 0.076346680521965f, 0.265552014112473f, 0.076550483703613f, 0.265876859426498f, + 0.076754532754421f, 0.266201555728912f, 0.076958827674389f, 0.266526103019714f, + 0.077163375914097f, 0.266850501298904f, 0.077368170022964f, 0.267174720764160f, + 0.077573217451572f, 0.267498821020126f, 0.077778510749340f, 0.267822742462158f, + 0.077984049916267f, 0.268146485090256f, 0.078189842402935f, 0.268470078706741f, + 0.078395880758762f, 0.268793523311615f, 0.078602164983749f, 0.269116818904877f, + 0.078808702528477f, 0.269439965486526f, 0.079015478491783f, 0.269762933254242f, + 0.079222507774830f, 0.270085722208023f, 0.079429790377617f, 0.270408391952515f, + 0.079637311398983f, 0.270730882883072f, 0.079845085740089f, 0.271053224802017f, + 0.080053105950356f, 0.271375387907028f, 0.080261372029781f, 0.271697402000427f, + 0.080469883978367f, 0.272019267082214f, 0.080678641796112f, 0.272340953350067f, + 0.080887645483017f, 0.272662490606308f, 0.081096902489662f, 0.272983878850937f, + 0.081306397914886f, 0.273305088281631f, 0.081516146659851f, 0.273626148700714f, + 0.081726133823395f, 0.273947030305862f, 0.081936374306679f, 0.274267762899399f, + 0.082146860659122f, 0.274588316679001f, 0.082357585430145f, 0.274908751249313f, + 0.082568563520908f, 0.275228977203369f, 0.082779780030251f, 0.275549083948135f, + 0.082991249859333f, 0.275868982076645f, 0.083202958106995f, 0.276188760995865f, + 0.083414919674397f, 0.276508361101151f, 0.083627119660378f, 0.276827782392502f, + 0.083839565515518f, 0.277147054672241f, 0.084052257239819f, 0.277466177940369f, + 0.084265194833279f, 0.277785122394562f, 0.084478378295898f, 0.278103888034821f, + 0.084691800177097f, 0.278422504663467f, 0.084905467927456f, 0.278740972280502f, + 0.085119381546974f, 0.279059261083603f, 0.085333541035652f, 0.279377400875092f, + 0.085547938942909f, 0.279695361852646f, 0.085762590169907f, 0.280013144016266f, + 0.085977479815483f, 0.280330777168274f, 0.086192607879639f, 0.280648261308670f, + 0.086407989263535f, 0.280965566635132f, 0.086623609066010f, 0.281282693147659f, + 0.086839467287064f, 0.281599670648575f, 0.087055571377277f, 0.281916469335556f, + 0.087271921336651f, 0.282233119010925f, 0.087488517165184f, 0.282549589872360f, + 0.087705351412296f, 0.282865911722183f, 0.087922424077988f, 0.283182054758072f, + 0.088139742612839f, 0.283498018980026f, 0.088357307016850f, 0.283813834190369f, + 0.088575109839439f, 0.284129470586777f, 0.088793158531189f, 0.284444957971573f, + 0.089011445641518f, 0.284760266542435f, 0.089229971170425f, 0.285075396299362f, + 0.089448742568493f, 0.285390377044678f, 0.089667752385139f, 0.285705178976059f, + 0.089887008070946f, 0.286019802093506f, 0.090106502175331f, 0.286334276199341f, + 0.090326242148876f, 0.286648571491241f, 0.090546220541000f, 0.286962717771530f, + 0.090766437351704f, 0.287276685237885f, 0.090986892580986f, 0.287590473890305f, + 0.091207593679428f, 0.287904083728790f, 0.091428533196449f, 0.288217544555664f, + 0.091649711132050f, 0.288530826568604f, 0.091871134936810f, 0.288843959569931f, + 0.092092797160149f, 0.289156883955002f, 0.092314697802067f, 0.289469659328461f, + 0.092536836862564f, 0.289782285690308f, 0.092759214341640f, 0.290094703435898f, + 0.092981837689877f, 0.290406972169876f, 0.093204692006111f, 0.290719062089920f, + 0.093427792191505f, 0.291031002998352f, 0.093651130795479f, 0.291342735290527f, + 0.093874707818031f, 0.291654318571091f, 0.094098523259163f, 0.291965723037720f, + 0.094322577118874f, 0.292276978492737f, 0.094546869397163f, 0.292588025331497f, + 0.094771400094032f, 0.292898923158646f, 0.094996169209480f, 0.293209642171860f, + 0.095221176743507f, 0.293520182371140f, 0.095446422696114f, 0.293830573558807f, + 0.095671907067299f, 0.294140785932541f, 0.095897629857063f, 0.294450789690018f, + 0.096123591065407f, 0.294760644435883f, 0.096349790692329f, 0.295070350170136f, + 0.096576221287251f, 0.295379847288132f, 0.096802897751331f, 0.295689195394516f, + 0.097029805183411f, 0.295998334884644f, 0.097256951034069f, 0.296307325363159f, + 0.097484335303307f, 0.296616137027740f, 0.097711957991123f, 0.296924799680710f, + 0.097939811646938f, 0.297233253717422f, 0.098167903721333f, 0.297541528940201f, + 0.098396234214306f, 0.297849655151367f, 0.098624803125858f, 0.298157602548599f, + 0.098853603005409f, 0.298465341329575f, 0.099082641303539f, 0.298772931098938f, + 0.099311910569668f, 0.299080342054367f, 0.099541425704956f, 0.299387603998184f, + 0.099771171808243f, 0.299694657325745f, 0.100001148879528f, 0.300001531839371f, + 0.100231364369392f, 0.300308227539063f, 0.100461818277836f, 0.300614774227142f, + 0.100692503154278f, 0.300921112298965f, 0.100923426449299f, 0.301227301359177f, + 0.101154580712318f, 0.301533311605453f, 0.101385973393917f, 0.301839113235474f, + 0.101617597043514f, 0.302144765853882f, 0.101849451661110f, 0.302450239658356f, + 0.102081544697285f, 0.302755534648895f, 0.102313876152039f, 0.303060621023178f, + 0.102546438574791f, 0.303365558385849f, 0.102779231965542f, 0.303670316934586f, + 0.103012263774872f, 0.303974896669388f, 0.103245526552200f, 0.304279297590256f, + 0.103479020297527f, 0.304583519697189f, 0.103712752461433f, 0.304887533187866f, + 0.103946708142757f, 0.305191397666931f, 0.104180909693241f, 0.305495083332062f, + 0.104415334761143f, 0.305798590183258f, 0.104649998247623f, 0.306101888418198f, + 0.104884892702103f, 0.306405037641525f, 0.105120018124580f, 0.306708008050919f, + 0.105355374515057f, 0.307010769844055f, 0.105590961873531f, 0.307313382625580f, + 0.105826787650585f, 0.307615786790848f, 0.106062836945057f, 0.307918041944504f, + 0.106299124658108f, 0.308220088481903f, 0.106535643339157f, 0.308521956205368f, + 0.106772392988205f, 0.308823645114899f, 0.107009373605251f, 0.309125155210495f, + 0.107246585190296f, 0.309426486492157f, 0.107484027743340f, 0.309727638959885f, + 0.107721701264381f, 0.310028612613678f, 0.107959605753422f, 0.310329377651215f, + 0.108197741210461f, 0.310629993677139f, 0.108436107635498f, 0.310930401086807f, + 0.108674705028534f, 0.311230629682541f, 0.108913525938988f, 0.311530679464340f, + 0.109152585268021f, 0.311830550432205f, 0.109391868114471f, 0.312130242586136f, + 0.109631389379501f, 0.312429755926132f, 0.109871134161949f, 0.312729060649872f, + 0.110111102461815f, 0.313028186559677f, 0.110351309180260f, 0.313327133655548f, + 0.110591746866703f, 0.313625901937485f, 0.110832408070564f, 0.313924491405487f, + 0.111073300242424f, 0.314222872257233f, 0.111314415931702f, 0.314521104097366f, + 0.111555770039558f, 0.314819127321243f, 0.111797347664833f, 0.315116971731186f, + 0.112039148807526f, 0.315414607524872f, 0.112281180918217f, 0.315712094306946f, + 0.112523443996906f, 0.316009372472763f, 0.112765938043594f, 0.316306471824646f, + 0.113008655607700f, 0.316603392362595f, 0.113251596689224f, 0.316900104284287f, + 0.113494776189327f, 0.317196637392044f, 0.113738171756268f, 0.317492991685867f, + 0.113981798291206f, 0.317789167165756f, 0.114225655794144f, 0.318085134029388f, + 0.114469736814499f, 0.318380922079086f, 0.114714048802853f, 0.318676531314850f, + 0.114958584308624f, 0.318971961736679f, 0.115203343331814f, 0.319267183542252f, + 0.115448333323002f, 0.319562226533890f, 0.115693546831608f, 0.319857090711594f, + 0.115938983857632f, 0.320151746273041f, 0.116184651851654f, 0.320446223020554f, + 0.116430543363094f, 0.320740520954132f, 0.116676658391953f, 0.321034610271454f, + 0.116923004388809f, 0.321328520774841f, 0.117169573903084f, 0.321622252464294f, + 0.117416366934776f, 0.321915775537491f, 0.117663383483887f, 0.322209119796753f, + 0.117910631000996f, 0.322502255439758f, 0.118158094584942f, 0.322795242071152f, + 0.118405789136887f, 0.323088020086288f, 0.118653707206249f, 0.323380589485168f, + 0.118901848793030f, 0.323672980070114f, 0.119150213897228f, 0.323965191841125f, + 0.119398809969425f, 0.324257194995880f, 0.119647622108459f, 0.324549019336700f, + 0.119896657764912f, 0.324840664863586f, 0.120145916938782f, 0.325132101774216f, + 0.120395407080650f, 0.325423330068588f, 0.120645113289356f, 0.325714409351349f, + 0.120895043015480f, 0.326005280017853f, 0.121145196259022f, 0.326295942068100f, + 0.121395580470562f, 0.326586425304413f, 0.121646173298359f, 0.326876699924469f, + 0.121896997094154f, 0.327166795730591f, 0.122148044407368f, 0.327456712722778f, + 0.122399315237999f, 0.327746421098709f, 0.122650802135468f, 0.328035950660706f, + 0.122902512550354f, 0.328325271606445f, 0.123154446482658f, 0.328614413738251f, + 0.123406603932381f, 0.328903347253799f, 0.123658977448940f, 0.329192101955414f, + 0.123911574482918f, 0.329480648040771f, 0.124164395034313f, 0.329769015312195f, + 0.124417431652546f, 0.330057173967361f, 0.124670691788197f, 0.330345153808594f, + 0.124924175441265f, 0.330632925033569f, 0.125177875161171f, 0.330920487642288f, + 0.125431805849075f, 0.331207901239395f, 0.125685945153236f, 0.331495076417923f, + 0.125940307974815f, 0.331782072782516f, 0.126194894313812f, 0.332068890333176f, + 0.126449704170227f, 0.332355499267578f, 0.126704722642899f, 0.332641899585724f, + 0.126959964632988f, 0.332928121089935f, 0.127215430140495f, 0.333214133977890f, + 0.127471104264259f, 0.333499968051910f, 0.127727001905441f, 0.333785593509674f, + 0.127983123064041f, 0.334071010351181f, 0.128239467740059f, 0.334356248378754f, + 0.128496021032333f, 0.334641307592392f, 0.128752797842026f, 0.334926128387451f, + 0.129009798169136f, 0.335210770368576f, 0.129267007112503f, 0.335495233535767f, + 0.129524439573288f, 0.335779488086700f, 0.129782080650330f, 0.336063534021378f, + 0.130039945244789f, 0.336347371339798f, 0.130298033356667f, 0.336631029844284f, + 0.130556344985962f, 0.336914509534836f, 0.130814850330353f, 0.337197750806808f, + 0.131073594093323f, 0.337480813264847f, 0.131332546472549f, 0.337763696908951f, + 0.131591722369194f, 0.338046342134476f, 0.131851106882095f, 0.338328808546066f, + 0.132110700011253f, 0.338611096143723f, 0.132370531558990f, 0.338893145322800f, + 0.132630556821823f, 0.339175015687943f, 0.132890805602074f, 0.339456677436829f, + 0.133151277899742f, 0.339738160371780f, 0.133411958813667f, 0.340019434690475f, + 0.133672863245010f, 0.340300500392914f, 0.133933976292610f, 0.340581357479095f, + 0.134195312857628f, 0.340862035751343f, 0.134456858038902f, 0.341142505407333f, + 0.134718611836433f, 0.341422766447067f, 0.134980589151382f, 0.341702848672867f, + 0.135242775082588f, 0.341982692480087f, 0.135505184531212f, 0.342262357473373f, + 0.135767802596092f, 0.342541843652725f, 0.136030644178391f, 0.342821091413498f, + 0.136293679475784f, 0.343100160360336f, 0.136556953191757f, 0.343379020690918f, + 0.136820420622826f, 0.343657672405243f, 0.137084111571312f, 0.343936115503311f, + 0.137348011136055f, 0.344214379787445f, 0.137612134218216f, 0.344492435455322f, + 0.137876465916634f, 0.344770282506943f, 0.138141006231308f, 0.345047920942307f, + 0.138405755162239f, 0.345325350761414f, 0.138670727610588f, 0.345602601766586f, + 0.138935908675194f, 0.345879614353180f, 0.139201298356056f, 0.346156448125839f, + 0.139466896653175f, 0.346433073282242f, 0.139732718467712f, 0.346709519624710f, + 0.139998748898506f, 0.346985727548599f, 0.140264987945557f, 0.347261756658554f, + 0.140531435608864f, 0.347537547349930f, 0.140798106789589f, 0.347813159227371f, + 0.141064971685410f, 0.348088562488556f, 0.141332060098648f, 0.348363757133484f, + 0.141599357128143f, 0.348638743162155f, 0.141866862773895f, 0.348913550376892f, + 0.142134591937065f, 0.349188119173050f, 0.142402514815331f, 0.349462509155273f, + 0.142670661211014f, 0.349736660718918f, 0.142939001321793f, 0.350010633468628f, + 0.143207564949989f, 0.350284397602081f, 0.143476337194443f, 0.350557953119278f, + 0.143745318055153f, 0.350831300020218f, 0.144014507532120f, 0.351104438304901f, + 0.144283905625343f, 0.351377367973328f, 0.144553512334824f, 0.351650089025497f, + 0.144823327660561f, 0.351922631263733f, 0.145093351602554f, 0.352194935083389f, + 0.145363584160805f, 0.352467030286789f, 0.145634025335312f, 0.352738946676254f, + 0.145904675126076f, 0.353010624647141f, 0.146175548434258f, 0.353282123804092f, + 0.146446615457535f, 0.353553384542465f, 0.146717891097069f, 0.353824466466904f, + 0.146989375352860f, 0.354095309972763f, 0.147261068224907f, 0.354365974664688f, + 0.147532954812050f, 0.354636400938034f, 0.147805064916611f, 0.354906648397446f, + 0.148077383637428f, 0.355176687240601f, 0.148349896073341f, 0.355446487665176f, + 0.148622632026672f, 0.355716109275818f, 0.148895561695099f, 0.355985492467880f, + 0.149168699979782f, 0.356254696846008f, 0.149442046880722f, 0.356523662805557f, + 0.149715602397919f, 0.356792420148849f, 0.149989366531372f, 0.357060998678207f, + 0.150263324379921f, 0.357329338788986f, 0.150537505745888f, 0.357597470283508f, + 0.150811880826950f, 0.357865422964096f, 0.151086464524269f, 0.358133137226105f, + 0.151361241936684f, 0.358400642871857f, 0.151636242866516f, 0.358667939901352f, + 0.151911437511444f, 0.358935028314590f, 0.152186840772629f, 0.359201908111572f, + 0.152462437748909f, 0.359468549489975f, 0.152738258242607f, 0.359735012054443f, + 0.153014272451401f, 0.360001266002655f, 0.153290495276451f, 0.360267281532288f, + 0.153566911816597f, 0.360533088445663f, 0.153843536973000f, 0.360798716545105f, + 0.154120370745659f, 0.361064106225967f, 0.154397398233414f, 0.361329287290573f, + 0.154674649238586f, 0.361594229936600f, 0.154952079057693f, 0.361858993768692f, + 0.155229732394218f, 0.362123548984528f, 0.155507579445839f, 0.362387865781784f, + 0.155785620212555f, 0.362651973962784f, 0.156063869595528f, 0.362915903329849f, + 0.156342327594757f, 0.363179564476013f, 0.156620979309082f, 0.363443046808243f, + 0.156899839639664f, 0.363706320524216f, 0.157178908586502f, 0.363969355821610f, + 0.157458171248436f, 0.364232182502747f, 0.157737627625465f, 0.364494800567627f, + 0.158017292618752f, 0.364757210016251f, 0.158297166228294f, 0.365019410848618f, + 0.158577233552933f, 0.365281373262405f, 0.158857494592667f, 0.365543156862259f, + 0.159137964248657f, 0.365804702043533f, 0.159418627619743f, 0.366066008806229f, + 0.159699499607086f, 0.366327136754990f, 0.159980565309525f, 0.366588026285172f, + 0.160261839628220f, 0.366848707199097f, 0.160543307662010f, 0.367109179496765f, + 0.160824984312058f, 0.367369443178177f, 0.161106839776039f, 0.367629468441010f, + 0.161388918757439f, 0.367889285087585f, 0.161671176552773f, 0.368148893117905f, + 0.161953642964363f, 0.368408292531967f, 0.162236317992210f, 0.368667453527451f, + 0.162519171833992f, 0.368926405906677f, 0.162802234292030f, 0.369185149669647f, + 0.163085505366325f, 0.369443655014038f, 0.163368955254555f, 0.369701951742172f, + 0.163652613759041f, 0.369960039854050f, 0.163936465978622f, 0.370217919349670f, + 0.164220526814461f, 0.370475560426712f, 0.164504766464233f, 0.370732992887497f, + 0.164789214730263f, 0.370990216732025f, 0.165073871612549f, 0.371247202157974f, + 0.165358707308769f, 0.371503978967667f, 0.165643751621246f, 0.371760547161102f, + 0.165928974747658f, 0.372016876935959f, 0.166214406490326f, 0.372272998094559f, + 0.166500031948090f, 0.372528880834579f, 0.166785866022110f, 0.372784584760666f, + 0.167071878910065f, 0.373040050268173f, 0.167358100414276f, 0.373295277357101f, + 0.167644515633583f, 0.373550295829773f, 0.167931124567986f, 0.373805105686188f, + 0.168217927217484f, 0.374059677124023f, 0.168504923582077f, 0.374314039945602f, + 0.168792113661766f, 0.374568194150925f, 0.169079497456551f, 0.374822109937668f, + 0.169367074966431f, 0.375075817108154f, 0.169654861092567f, 0.375329315662384f, + 0.169942826032639f, 0.375582575798035f, 0.170230999588966f, 0.375835597515106f, + 0.170519351959229f, 0.376088410615921f, 0.170807912945747f, 0.376341015100479f, + 0.171096652746201f, 0.376593410968781f, 0.171385586261749f, 0.376845568418503f, + 0.171674728393555f, 0.377097487449646f, 0.171964049339294f, 0.377349197864532f, + 0.172253578901291f, 0.377600699663162f, 0.172543287277222f, 0.377851963043213f, + 0.172833189368248f, 0.378102988004684f, 0.173123285174370f, 0.378353834152222f, + 0.173413574695587f, 0.378604412078857f, 0.173704057931900f, 0.378854811191559f, + 0.173994734883308f, 0.379104942083359f, 0.174285605549812f, 0.379354894161224f, + 0.174576655030251f, 0.379604607820511f, 0.174867913126946f, 0.379854083061218f, + 0.175159350037575f, 0.380103349685669f, 0.175450980663300f, 0.380352377891541f, + 0.175742805004120f, 0.380601197481155f, 0.176034808158875f, 0.380849778652191f, + 0.176327019929886f, 0.381098151206970f, 0.176619410514832f, 0.381346285343170f, + 0.176911994814873f, 0.381594210863113f, 0.177204772830009f, 0.381841897964478f, + 0.177497729659081f, 0.382089376449585f, 0.177790880203247f, 0.382336616516113f, + 0.178084224462509f, 0.382583618164063f, 0.178377762436867f, 0.382830440998077f, + 0.178671479225159f, 0.383076995611191f, 0.178965389728546f, 0.383323341608047f, + 0.179259493947029f, 0.383569449186325f, 0.179553776979446f, 0.383815348148346f, + 0.179848253726959f, 0.384061008691788f, 0.180142924189568f, 0.384306460618973f, + 0.180437773466110f, 0.384551674127579f, 0.180732816457748f, 0.384796649217606f, + 0.181028053164482f, 0.385041415691376f, 0.181323468685150f, 0.385285943746567f, + 0.181619063019753f, 0.385530263185501f, 0.181914865970612f, 0.385774344205856f, + 0.182210832834244f, 0.386018186807632f, 0.182507008314133f, 0.386261820793152f, + 0.182803362607956f, 0.386505216360092f, 0.183099895715714f, 0.386748403310776f, + 0.183396622538567f, 0.386991351842880f, 0.183693528175354f, 0.387234061956406f, + 0.183990627527237f, 0.387476563453674f, 0.184287920594215f, 0.387718826532364f, + 0.184585392475128f, 0.387960851192474f, 0.184883043169975f, 0.388202667236328f, + 0.185180887579918f, 0.388444244861603f, 0.185478910803795f, 0.388685584068298f, + 0.185777112841606f, 0.388926714658737f, 0.186075508594513f, 0.389167606830597f, + 0.186374098062515f, 0.389408260583878f, 0.186672851443291f, 0.389648675918579f, + 0.186971798539162f, 0.389888882637024f, 0.187270939350128f, 0.390128880739212f, + 0.187570258975029f, 0.390368610620499f, 0.187869757413864f, 0.390608131885529f, + 0.188169434666634f, 0.390847414731979f, 0.188469305634499f, 0.391086459159851f, + 0.188769355416298f, 0.391325294971466f, 0.189069598913193f, 0.391563892364502f, + 0.189370006322861f, 0.391802251338959f, 0.189670607447624f, 0.392040401697159f, + 0.189971387386322f, 0.392278283834457f, 0.190272361040115f, 0.392515957355499f, + 0.190573498606682f, 0.392753422260284f, 0.190874829888344f, 0.392990618944168f, + 0.191176339983940f, 0.393227607011795f, 0.191478043794632f, 0.393464356660843f, + 0.191779911518097f, 0.393700867891312f, 0.192081972956657f, 0.393937170505524f, + 0.192384198307991f, 0.394173204898834f, 0.192686617374420f, 0.394409030675888f, + 0.192989215254784f, 0.394644618034363f, 0.193292006850243f, 0.394879996776581f, + 0.193594962358475f, 0.395115107297897f, 0.193898096680641f, 0.395350009202957f, + 0.194201424717903f, 0.395584672689438f, 0.194504916667938f, 0.395819097757339f, + 0.194808602333069f, 0.396053284406662f, 0.195112451910973f, 0.396287262439728f, + 0.195416495203972f, 0.396520972251892f, 0.195720717310905f, 0.396754473447800f, + 0.196025103330612f, 0.396987736225128f, 0.196329683065414f, 0.397220760583878f, + 0.196634441614151f, 0.397453576326370f, 0.196939364075661f, 0.397686123847961f, + 0.197244480252266f, 0.397918462753296f, 0.197549775242805f, 0.398150533437729f, + 0.197855234146118f, 0.398382395505905f, 0.198160871863365f, 0.398614019155502f, + 0.198466703295708f, 0.398845434188843f, 0.198772698640823f, 0.399076581001282f, + 0.199078872799873f, 0.399307489395142f, 0.199385225772858f, 0.399538189172745f, + 0.199691757559776f, 0.399768620729446f, 0.199998468160629f, 0.399998843669891f, + 0.200305357575417f, 0.400228828191757f, 0.200612410902977f, 0.400458574295044f, + 0.200919643044472f, 0.400688081979752f, 0.201227053999901f, 0.400917351245880f, + 0.201534643769264f, 0.401146411895752f, 0.201842412352562f, 0.401375204324722f, + 0.202150344848633f, 0.401603758335114f, 0.202458456158638f, 0.401832103729248f, + 0.202766746282578f, 0.402060180902481f, 0.203075215220451f, 0.402288049459457f, + 0.203383848071098f, 0.402515679597855f, 0.203692659735680f, 0.402743041515350f, + 0.204001650214195f, 0.402970194816589f, 0.204310819506645f, 0.403197109699249f, + 0.204620152711868f, 0.403423786163330f, 0.204929664731026f, 0.403650224208832f, + 0.205239340662956f, 0.403876423835754f, 0.205549195408821f, 0.404102355241776f, + 0.205859228968620f, 0.404328078031540f, 0.206169426441193f, 0.404553562402725f, + 0.206479802727699f, 0.404778808355331f, 0.206790357828140f, 0.405003815889359f, + 0.207101076841354f, 0.405228585004807f, 0.207411959767342f, 0.405453115701675f, + 0.207723021507263f, 0.405677437782288f, 0.208034262061119f, 0.405901491641998f, + 0.208345666527748f, 0.406125307083130f, 0.208657249808311f, 0.406348884105682f, + 0.208969011902809f, 0.406572192907333f, 0.209280923008919f, 0.406795293092728f, + 0.209593027830124f, 0.407018154859543f, 0.209905281662941f, 0.407240778207779f, + 0.210217714309692f, 0.407463163137436f, 0.210530325770378f, 0.407685309648514f, + 0.210843101143837f, 0.407907217741013f, 0.211156040430069f, 0.408128857612610f, + 0.211469158530235f, 0.408350288867950f, 0.211782455444336f, 0.408571451902390f, + 0.212095901370049f, 0.408792406320572f, 0.212409526109695f, 0.409013092517853f, + 0.212723329663277f, 0.409233570098877f, 0.213037282228470f, 0.409453779459000f, + 0.213351413607597f, 0.409673750400543f, 0.213665723800659f, 0.409893482923508f, + 0.213980183005333f, 0.410112977027893f, 0.214294821023941f, 0.410332232713699f, + 0.214609622955322f, 0.410551249980927f, 0.214924603700638f, 0.410770028829575f, + 0.215239733457565f, 0.410988569259644f, 0.215555042028427f, 0.411206841468811f, + 0.215870529413223f, 0.411424905061722f, 0.216186165809631f, 0.411642700433731f, + 0.216501981019974f, 0.411860257387161f, 0.216817945241928f, 0.412077575922012f, + 0.217134088277817f, 0.412294656038284f, 0.217450410127640f, 0.412511497735977f, + 0.217766880989075f, 0.412728071212769f, 0.218083515763283f, 0.412944436073303f, + 0.218400329351425f, 0.413160532712936f, 0.218717306852341f, 0.413376390933990f, + 0.219034433364868f, 0.413592010736465f, 0.219351738691330f, 0.413807392120361f, + 0.219669207930565f, 0.414022535085678f, 0.219986841082573f, 0.414237409830093f, + 0.220304638147354f, 0.414452046155930f, 0.220622614026070f, 0.414666473865509f, + 0.220940738916397f, 0.414880603551865f, 0.221259027719498f, 0.415094524621964f, + 0.221577480435371f, 0.415308207273483f, 0.221896097064018f, 0.415521621704102f, + 0.222214877605438f, 0.415734797716141f, 0.222533836960793f, 0.415947735309601f, + 0.222852945327759f, 0.416160434484482f, 0.223172217607498f, 0.416372895240784f, + 0.223491653800011f, 0.416585087776184f, 0.223811239004135f, 0.416797041893005f, + 0.224131003022194f, 0.417008757591248f, 0.224450930953026f, 0.417220205068588f, + 0.224771007895470f, 0.417431443929672f, 0.225091263651848f, 0.417642414569855f, + 0.225411668419838f, 0.417853146791458f, 0.225732237100601f, 0.418063640594482f, + 0.226052969694138f, 0.418273866176605f, 0.226373866200447f, 0.418483853340149f, + 0.226694911718369f, 0.418693602085114f, 0.227016136050224f, 0.418903112411499f, + 0.227337509393692f, 0.419112354516983f, 0.227659046649933f, 0.419321358203888f, + 0.227980732917786f, 0.419530123472214f, 0.228302597999573f, 0.419738620519638f, + 0.228624612092972f, 0.419946908950806f, 0.228946775197983f, 0.420154929161072f, + 0.229269117116928f, 0.420362681150436f, 0.229591608047485f, 0.420570224523544f, + 0.229914262890816f, 0.420777499675751f, 0.230237081646919f, 0.420984506607056f, + 0.230560049414635f, 0.421191304922104f, 0.230883181095123f, 0.421397835016251f, + 0.231206461787224f, 0.421604126691818f, 0.231529906392097f, 0.421810150146484f, + 0.231853514909744f, 0.422015935182571f, 0.232177272439003f, 0.422221481800079f, + 0.232501193881035f, 0.422426789999008f, 0.232825264334679f, 0.422631829977036f, + 0.233149498701096f, 0.422836631536484f, 0.233473882079124f, 0.423041164875031f, + 0.233798429369926f, 0.423245459794998f, 0.234123140573502f, 0.423449516296387f, + 0.234448000788689f, 0.423653304576874f, 0.234773010015488f, 0.423856884241104f, + 0.235098183155060f, 0.424060165882111f, 0.235423520207405f, 0.424263238906860f, + 0.235749006271362f, 0.424466013908386f, 0.236074641346931f, 0.424668580293655f, + 0.236400425434113f, 0.424870878458023f, 0.236726388335228f, 0.425072938203812f, + 0.237052485346794f, 0.425274729728699f, 0.237378746271133f, 0.425476282835007f, + 0.237705156207085f, 0.425677597522736f, 0.238031730055809f, 0.425878643989563f, + 0.238358452916145f, 0.426079452037811f, 0.238685324788094f, 0.426279991865158f, + 0.239012360572815f, 0.426480293273926f, 0.239339530467987f, 0.426680356264114f, + 0.239666879177094f, 0.426880151033401f, 0.239994361996651f, 0.427079707384110f, + 0.240322008728981f, 0.427278995513916f, 0.240649804472923f, 0.427478045225143f, + 0.240977749228477f, 0.427676826715469f, 0.241305842995644f, 0.427875369787216f, + 0.241634100675583f, 0.428073674440384f, 0.241962507367134f, 0.428271710872650f, + 0.242291063070297f, 0.428469479084015f, 0.242619767785072f, 0.428667008876801f, + 0.242948621511459f, 0.428864300251007f, 0.243277639150620f, 0.429061323404312f, + 0.243606805801392f, 0.429258108139038f, 0.243936106562614f, 0.429454624652863f, + 0.244265571236610f, 0.429650902748108f, 0.244595184922218f, 0.429846942424774f, + 0.244924947619438f, 0.430042684078217f, 0.245254859328270f, 0.430238217115402f, + 0.245584934949875f, 0.430433481931686f, 0.245915144681931f, 0.430628478527069f, + 0.246245503425598f, 0.430823236703873f, 0.246576011180878f, 0.431017726659775f, + 0.246906682848930f, 0.431211978197098f, 0.247237488627434f, 0.431405961513519f, + 0.247568443417549f, 0.431599706411362f, 0.247899547219276f, 0.431793183088303f, + 0.248230814933777f, 0.431986421346664f, 0.248562216758728f, 0.432179391384125f, + 0.248893767595291f, 0.432372123003006f, 0.249225467443466f, 0.432564586400986f, + 0.249557301402092f, 0.432756811380386f, 0.249889299273491f, 0.432948768138886f, + 0.250221431255341f, 0.433140486478806f, 0.250553727149963f, 0.433331936597824f, + 0.250886172056198f, 0.433523118495941f, 0.251218736171722f, 0.433714061975479f, + 0.251551479101181f, 0.433904737234116f, 0.251884341239929f, 0.434095174074173f, + 0.252217382192612f, 0.434285342693329f, 0.252550542354584f, 0.434475272893906f, + 0.252883851528168f, 0.434664934873581f, 0.253217309713364f, 0.434854328632355f, + 0.253550916910172f, 0.435043483972549f, 0.253884643316269f, 0.435232400894165f, + 0.254218548536301f, 0.435421019792557f, 0.254552572965622f, 0.435609430074692f, + 0.254886746406555f, 0.435797542333603f, 0.255221068859100f, 0.435985416173935f, + 0.255555540323257f, 0.436173021793365f, 0.255890160799026f, 0.436360388994217f, + 0.256224930286407f, 0.436547487974167f, 0.256559818983078f, 0.436734348535538f, + 0.256894856691360f, 0.436920911073685f, 0.257230043411255f, 0.437107264995575f, + 0.257565379142761f, 0.437293320894241f, 0.257900834083557f, 0.437479138374329f, + 0.258236467838287f, 0.437664687633514f, 0.258572220802307f, 0.437849998474121f, + 0.258908122777939f, 0.438035041093826f, 0.259244143962860f, 0.438219845294952f, + 0.259580343961716f, 0.438404351472855f, 0.259916663169861f, 0.438588619232178f, + 0.260253131389618f, 0.438772648572922f, 0.260589718818665f, 0.438956409692764f, + 0.260926485061646f, 0.439139902591705f, 0.261263370513916f, 0.439323127269745f, + 0.261600375175476f, 0.439506113529205f, 0.261937558650970f, 0.439688831567764f, + 0.262274861335754f, 0.439871311187744f, 0.262612313032150f, 0.440053492784500f, + 0.262949883937836f, 0.440235435962677f, 0.263287603855133f, 0.440417140722275f, + 0.263625472784042f, 0.440598547458649f, 0.263963490724564f, 0.440779715776443f, + 0.264301627874374f, 0.440960645675659f, 0.264639914035797f, 0.441141277551651f, + 0.264978319406509f, 0.441321671009064f, 0.265316903591156f, 0.441501796245575f, + 0.265655577182770f, 0.441681683063507f, 0.265994429588318f, 0.441861271858215f, + 0.266333401203156f, 0.442040622234344f, 0.266672492027283f, 0.442219734191895f, + 0.267011761665344f, 0.442398548126221f, 0.267351150512695f, 0.442577123641968f, + 0.267690658569336f, 0.442755430936813f, 0.268030315637589f, 0.442933470010757f, + 0.268370121717453f, 0.443111270666122f, 0.268710047006607f, 0.443288803100586f, + 0.269050091505051f, 0.443466067314148f, 0.269390314817429f, 0.443643063306808f, + 0.269730657339096f, 0.443819820880890f, 0.270071119070053f, 0.443996280431747f, + 0.270411729812622f, 0.444172531366348f, 0.270752459764481f, 0.444348484277725f, + 0.271093338727951f, 0.444524168968201f, 0.271434366703033f, 0.444699615240097f, + 0.271775513887405f, 0.444874793291092f, 0.272116780281067f, 0.445049703121185f, + 0.272458195686340f, 0.445224374532700f, 0.272799760103226f, 0.445398747920990f, + 0.273141443729401f, 0.445572882890701f, 0.273483246564865f, 0.445746749639511f, + 0.273825198411942f, 0.445920348167419f, 0.274167299270630f, 0.446093708276749f, + 0.274509519338608f, 0.446266770362854f, 0.274851858615875f, 0.446439594030380f, + 0.275194346904755f, 0.446612149477005f, 0.275536954402924f, 0.446784436702728f, + 0.275879681110382f, 0.446956485509872f, 0.276222556829453f, 0.447128236293793f, + 0.276565581560135f, 0.447299748659134f, 0.276908725500107f, 0.447470992803574f, + 0.277251988649368f, 0.447641968727112f, 0.277595400810242f, 0.447812676429749f, + 0.277938932180405f, 0.447983115911484f, 0.278282582759857f, 0.448153316974640f, + 0.278626382350922f, 0.448323249816895f, 0.278970301151276f, 0.448492884635925f, + 0.279314368963242f, 0.448662281036377f, 0.279658555984497f, 0.448831409215927f, + 0.280002862215042f, 0.449000298976898f, 0.280347317457199f, 0.449168890714645f, + 0.280691891908646f, 0.449337244033813f, 0.281036585569382f, 0.449505299329758f, + 0.281381398439407f, 0.449673116207123f, 0.281726360321045f, 0.449840664863586f, + 0.282071471214294f, 0.450007945299149f, 0.282416671514511f, 0.450174957513809f, + 0.282762020826340f, 0.450341701507568f, 0.283107489347458f, 0.450508207082748f, + 0.283453077077866f, 0.450674414634705f, 0.283798813819885f, 0.450840383768082f, + 0.284144669771194f, 0.451006084680557f, 0.284490644931793f, 0.451171487569809f, + 0.284836769104004f, 0.451336652040482f, 0.285182982683182f, 0.451501548290253f, + 0.285529345273972f, 0.451666176319122f, 0.285875827074051f, 0.451830536127090f, + 0.286222457885742f, 0.451994657516479f, 0.286569178104401f, 0.452158480882645f, + 0.286916047334671f, 0.452322036027908f, 0.287263035774231f, 0.452485352754593f, + 0.287610173225403f, 0.452648371458054f, 0.287957400083542f, 0.452811151742935f, + 0.288304775953293f, 0.452973634004593f, 0.288652241230011f, 0.453135877847672f, + 0.288999855518341f, 0.453297853469849f, 0.289347589015961f, 0.453459560871124f, + 0.289695471525192f, 0.453621000051498f, 0.290043443441391f, 0.453782171010971f, + 0.290391564369202f, 0.453943043947220f, 0.290739774703979f, 0.454103678464890f, + 0.291088134050369f, 0.454264044761658f, 0.291436612606049f, 0.454424172639847f, + 0.291785210371017f, 0.454584002494812f, 0.292133957147598f, 0.454743564128876f, + 0.292482793331146f, 0.454902857542038f, 0.292831748723984f, 0.455061882734299f, + 0.293180853128433f, 0.455220639705658f, 0.293530046939850f, 0.455379128456116f, + 0.293879389762878f, 0.455537378787994f, 0.294228851795197f, 0.455695331096649f, + 0.294578403234482f, 0.455853015184402f, 0.294928103685379f, 0.456010431051254f, + 0.295277923345566f, 0.456167578697205f, 0.295627862215042f, 0.456324487924576f, + 0.295977920293808f, 0.456481099128723f, 0.296328097581863f, 0.456637442111969f, + 0.296678394079208f, 0.456793516874313f, 0.297028809785843f, 0.456949323415756f, + 0.297379344701767f, 0.457104891538620f, 0.297729998826981f, 0.457260161638260f, + 0.298080772161484f, 0.457415163516998f, 0.298431664705276f, 0.457569897174835f, + 0.298782676458359f, 0.457724362611771f, 0.299133807420731f, 0.457878559827805f, + 0.299485057592392f, 0.458032488822937f, 0.299836426973343f, 0.458186149597168f, + 0.300187885761261f, 0.458339542150497f, 0.300539493560791f, 0.458492636680603f, + 0.300891220569611f, 0.458645492792130f, 0.301243066787720f, 0.458798080682755f, + 0.301595002412796f, 0.458950400352478f, 0.301947087049484f, 0.459102421998978f, + 0.302299261093140f, 0.459254205226898f, 0.302651554346085f, 0.459405690431595f, + 0.303003966808319f, 0.459556937217712f, 0.303356528282166f, 0.459707885980606f, + 0.303709149360657f, 0.459858566522598f, 0.304061919450760f, 0.460008978843689f, + 0.304414808750153f, 0.460159152746201f, 0.304767817258835f, 0.460309028625488f, + 0.305120915174484f, 0.460458606481552f, 0.305474132299423f, 0.460607945919037f, + 0.305827468633652f, 0.460757017135620f, 0.306180924177170f, 0.460905820131302f, + 0.306534498929977f, 0.461054325103760f, 0.306888192892075f, 0.461202591657639f, + 0.307241976261139f, 0.461350560188293f, 0.307595878839493f, 0.461498260498047f, + 0.307949900627136f, 0.461645722389221f, 0.308304041624069f, 0.461792886257172f, + 0.308658272027969f, 0.461939752101898f, 0.309012651443481f, 0.462086379528046f, + 0.309367120265961f, 0.462232738733292f, 0.309721708297729f, 0.462378799915314f, + 0.310076385736465f, 0.462524622678757f, 0.310431212186813f, 0.462670147418976f, + 0.310786128044128f, 0.462815403938293f, 0.311141163110733f, 0.462960392236710f, + 0.311496287584305f, 0.463105112314224f, 0.311851561069489f, 0.463249564170837f, + 0.312206923961639f, 0.463393747806549f, 0.312562376260757f, 0.463537633419037f, + 0.312917977571487f, 0.463681250810623f, 0.313273668289185f, 0.463824629783630f, + 0.313629478216171f, 0.463967710733414f, 0.313985377550125f, 0.464110493659973f, + 0.314341396093369f, 0.464253038167953f, 0.314697533845901f, 0.464395314455032f, + 0.315053790807724f, 0.464537292718887f, 0.315410137176514f, 0.464679002761841f, + 0.315766572952271f, 0.464820444583893f, 0.316123157739639f, 0.464961618185043f, + 0.316479831933975f, 0.465102523565292f, 0.316836595535278f, 0.465243130922318f, + 0.317193508148193f, 0.465383470058441f, 0.317550510168076f, 0.465523540973663f, + 0.317907601594925f, 0.465663343667984f, 0.318264812231064f, 0.465802878141403f, + 0.318622142076492f, 0.465942144393921f, 0.318979561328888f, 0.466081112623215f, + 0.319337099790573f, 0.466219812631607f, 0.319694727659225f, 0.466358244419098f, + 0.320052474737167f, 0.466496407985687f, 0.320410341024399f, 0.466634273529053f, + 0.320768296718597f, 0.466771900653839f, 0.321126341819763f, 0.466909229755402f, + 0.321484506130219f, 0.467046260833740f, 0.321842789649963f, 0.467183053493500f, + 0.322201162576675f, 0.467319577932358f, 0.322559654712677f, 0.467455804347992f, + 0.322918236255646f, 0.467591762542725f, 0.323276937007904f, 0.467727422714233f, + 0.323635727167130f, 0.467862844467163f, 0.323994606733322f, 0.467997968196869f, + 0.324353635311127f, 0.468132823705673f, 0.324712723493576f, 0.468267410993576f, + 0.325071930885315f, 0.468401730060577f, 0.325431257486343f, 0.468535751104355f, + 0.325790673494339f, 0.468669503927231f, 0.326150178909302f, 0.468802988529205f, + 0.326509803533554f, 0.468936175107956f, 0.326869517564774f, 0.469069123268127f, + 0.327229350805283f, 0.469201773405075f, 0.327589273452759f, 0.469334155321121f, + 0.327949285507202f, 0.469466239213943f, 0.328309416770935f, 0.469598054885864f, + 0.328669637441635f, 0.469729602336884f, 0.329029977321625f, 0.469860881567001f, + 0.329390406608582f, 0.469991862773895f, 0.329750925302505f, 0.470122605562210f, + 0.330111563205719f, 0.470253020524979f, 0.330472290515900f, 0.470383197069168f, + 0.330833107233047f, 0.470513075590134f, 0.331194043159485f, 0.470642685890198f, + 0.331555068492889f, 0.470772027969360f, 0.331916213035584f, 0.470901101827621f, + 0.332277417182922f, 0.471029877662659f, 0.332638740539551f, 0.471158385276794f, + 0.333000183105469f, 0.471286594867706f, 0.333361685276031f, 0.471414536237717f, + 0.333723306655884f, 0.471542209386826f, 0.334085017442703f, 0.471669614315033f, + 0.334446847438812f, 0.471796721220016f, 0.334808766841888f, 0.471923559904099f, + 0.335170775651932f, 0.472050130367279f, 0.335532873868942f, 0.472176402807236f, + 0.335895091295242f, 0.472302407026291f, 0.336257368326187f, 0.472428143024445f, + 0.336619764566422f, 0.472553610801697f, 0.336982280015945f, 0.472678780555725f, + 0.337344855070114f, 0.472803652286530f, 0.337707549333572f, 0.472928285598755f, + 0.338070303201675f, 0.473052620887756f, 0.338433176279068f, 0.473176687955856f, + 0.338796168565750f, 0.473300457000732f, 0.339159220457077f, 0.473423957824707f, + 0.339522391557693f, 0.473547190427780f, 0.339885622262955f, 0.473670125007629f, + 0.340248972177505f, 0.473792791366577f, 0.340612411499023f, 0.473915189504623f, + 0.340975970029831f, 0.474037289619446f, 0.341339588165283f, 0.474159121513367f, + 0.341703325510025f, 0.474280685186386f, 0.342067122459412f, 0.474401950836182f, + 0.342431038618088f, 0.474522948265076f, 0.342795044183731f, 0.474643647670746f, + 0.343159139156342f, 0.474764078855515f, 0.343523323535919f, 0.474884241819382f, + 0.343887597322464f, 0.475004136562347f, 0.344251960515976f, 0.475123733282089f, + 0.344616413116455f, 0.475243031978607f, 0.344980984926224f, 0.475362062454224f, + 0.345345616340637f, 0.475480824708939f, 0.345710366964340f, 0.475599318742752f, + 0.346075177192688f, 0.475717514753342f, 0.346440106630325f, 0.475835442543030f, + 0.346805095672607f, 0.475953072309494f, 0.347170203924179f, 0.476070433855057f, + 0.347535371780396f, 0.476187497377396f, 0.347900658845901f, 0.476304292678833f, + 0.348266035318375f, 0.476420819759369f, 0.348631471395493f, 0.476537048816681f, + 0.348997026681900f, 0.476653009653091f, 0.349362671375275f, 0.476768702268600f, + 0.349728375673294f, 0.476884096860886f, 0.350094199180603f, 0.476999223232269f, + 0.350460082292557f, 0.477114051580429f, 0.350826084613800f, 0.477228611707687f, + 0.351192146539688f, 0.477342873811722f, 0.351558297872543f, 0.477456867694855f, + 0.351924568414688f, 0.477570593357086f, 0.352290898561478f, 0.477684020996094f, + 0.352657318115234f, 0.477797180414200f, 0.353023827075958f, 0.477910041809082f, + 0.353390425443649f, 0.478022634983063f, 0.353757113218308f, 0.478134930133820f, + 0.354123860597610f, 0.478246957063675f, 0.354490727186203f, 0.478358715772629f, + 0.354857653379440f, 0.478470176458359f, 0.355224698781967f, 0.478581339120865f, + 0.355591803789139f, 0.478692263364792f, 0.355958998203278f, 0.478802859783173f, + 0.356326282024384f, 0.478913217782974f, 0.356693625450134f, 0.479023247957230f, + 0.357061088085175f, 0.479133039712906f, 0.357428610324860f, 0.479242533445358f, + 0.357796221971512f, 0.479351729154587f, 0.358163923025131f, 0.479460656642914f, + 0.358531713485718f, 0.479569315910339f, 0.358899593353271f, 0.479677677154541f, + 0.359267532825470f, 0.479785770177841f, 0.359635561704636f, 0.479893565177917f, + 0.360003679990768f, 0.480001062154770f, 0.360371887683868f, 0.480108320713043f, + 0.360740154981613f, 0.480215251445770f, 0.361108511686325f, 0.480321943759918f, + 0.361476957798004f, 0.480428308248520f, 0.361845493316650f, 0.480534434318542f, + 0.362214088439941f, 0.480640232563019f, 0.362582772970200f, 0.480745792388916f, + 0.362951546907425f, 0.480851024389267f, 0.363320380449295f, 0.480956017971039f, + 0.363689333200455f, 0.481060713529587f, 0.364058345556259f, 0.481165111064911f, + 0.364427417516708f, 0.481269240379334f, 0.364796578884125f, 0.481373071670532f, + 0.365165829658508f, 0.481476634740829f, 0.365535169839859f, 0.481579899787903f, + 0.365904569625854f, 0.481682896614075f, 0.366274058818817f, 0.481785595417023f, + 0.366643607616425f, 0.481888025999069f, 0.367013275623322f, 0.481990188360214f, + 0.367382973432541f, 0.482092022895813f, 0.367752790451050f, 0.482193619012833f, + 0.368122667074203f, 0.482294887304306f, 0.368492603302002f, 0.482395917177200f, + 0.368862658739090f, 0.482496619224548f, 0.369232743978500f, 0.482597053050995f, + 0.369602948427200f, 0.482697218656540f, 0.369973212480545f, 0.482797086238861f, + 0.370343536138535f, 0.482896685600281f, 0.370713949203491f, 0.482995986938477f, + 0.371084451675415f, 0.483094990253448f, 0.371455013751984f, 0.483193725347519f, + 0.371825665235519f, 0.483292192220688f, 0.372196376323700f, 0.483390361070633f, + 0.372567176818848f, 0.483488231897354f, 0.372938036918640f, 0.483585834503174f, + 0.373308986425400f, 0.483683139085770f, 0.373679995536804f, 0.483780175447464f, + 0.374051094055176f, 0.483876913785934f, 0.374422252178192f, 0.483973383903503f, + 0.374793499708176f, 0.484069555997849f, 0.375164806842804f, 0.484165430068970f, + 0.375536203384399f, 0.484261035919189f, 0.375907659530640f, 0.484356373548508f, + 0.376279205083847f, 0.484451413154602f, 0.376650810241699f, 0.484546154737473f, + 0.377022475004196f, 0.484640628099442f, 0.377394229173660f, 0.484734803438187f, + 0.377766042947769f, 0.484828680753708f, 0.378137946128845f, 0.484922289848328f, + 0.378509908914566f, 0.485015630722046f, 0.378881961107254f, 0.485108673572540f, + 0.379254043102264f, 0.485201418399811f, 0.379626244306564f, 0.485293895006180f, + 0.379998475313187f, 0.485386073589325f, 0.380370795726776f, 0.485477954149246f, + 0.380743205547333f, 0.485569566488266f, 0.381115674972534f, 0.485660910606384f, + 0.381488204002380f, 0.485751956701279f, 0.381860792636871f, 0.485842704772949f, + 0.382233470678329f, 0.485933154821396f, 0.382606208324432f, 0.486023366451263f, + 0.382979035377502f, 0.486113250255585f, 0.383351892232895f, 0.486202865839005f, + 0.383724838495255f, 0.486292183399200f, 0.384097874164581f, 0.486381232738495f, + 0.384470939636230f, 0.486469984054565f, 0.384844094514847f, 0.486558437347412f, + 0.385217308998108f, 0.486646622419357f, 0.385590612888336f, 0.486734509468079f, + 0.385963946580887f, 0.486822128295898f, 0.386337369680405f, 0.486909449100494f, + 0.386710882186890f, 0.486996471881866f, 0.387084424495697f, 0.487083226442337f, + 0.387458056211472f, 0.487169682979584f, 0.387831717729568f, 0.487255871295929f, + 0.388205498456955f, 0.487341761589050f, 0.388579308986664f, 0.487427353858948f, + 0.388953179121017f, 0.487512677907944f, 0.389327138662338f, 0.487597703933716f, + 0.389701157808304f, 0.487682431936264f, 0.390075236558914f, 0.487766891717911f, + 0.390449374914169f, 0.487851053476334f, 0.390823602676392f, 0.487934947013855f, + 0.391197860240936f, 0.488018542528152f, 0.391572207212448f, 0.488101840019226f, + 0.391946613788605f, 0.488184869289398f, 0.392321079969406f, 0.488267600536346f, + 0.392695605754852f, 0.488350033760071f, 0.393070191144943f, 0.488432198762894f, + 0.393444836139679f, 0.488514065742493f, 0.393819570541382f, 0.488595664501190f, + 0.394194334745407f, 0.488676935434341f, 0.394569188356400f, 0.488757967948914f, + 0.394944071769714f, 0.488838672637939f, 0.395319044589996f, 0.488919109106064f, + 0.395694077014923f, 0.488999247550964f, 0.396069169044495f, 0.489079117774963f, + 0.396444320678711f, 0.489158689975739f, 0.396819531917572f, 0.489237964153290f, + 0.397194802761078f, 0.489316970109940f, 0.397570133209229f, 0.489395678043365f, + 0.397945523262024f, 0.489474087953568f, 0.398320972919464f, 0.489552229642868f, + 0.398696482181549f, 0.489630073308945f, 0.399072051048279f, 0.489707618951797f, + 0.399447679519653f, 0.489784896373749f, 0.399823367595673f, 0.489861875772476f, + 0.400199115276337f, 0.489938557147980f, 0.400574922561646f, 0.490014940500259f, + 0.400950789451599f, 0.490091055631638f, 0.401326715946198f, 0.490166902542114f, + 0.401702702045441f, 0.490242421627045f, 0.402078747749329f, 0.490317672491074f, + 0.402454853057861f, 0.490392625331879f, 0.402830988168716f, 0.490467309951782f, + 0.403207212686539f, 0.490541696548462f, 0.403583467006683f, 0.490615785121918f, + 0.403959810733795f, 0.490689605474472f, 0.404336184263229f, 0.490763127803802f, + 0.404712617397308f, 0.490836352109909f, 0.405089110136032f, 0.490909278392792f, + 0.405465662479401f, 0.490981936454773f, 0.405842274427414f, 0.491054296493530f, + 0.406218945980072f, 0.491126358509064f, 0.406595647335052f, 0.491198152303696f, + 0.406972438097000f, 0.491269648075104f, 0.407349258661270f, 0.491340845823288f, + 0.407726138830185f, 0.491411775350571f, 0.408103078603745f, 0.491482406854630f, + 0.408480048179626f, 0.491552740335464f, 0.408857107162476f, 0.491622805595398f, + 0.409234195947647f, 0.491692543029785f, 0.409611344337463f, 0.491762012243271f, + 0.409988552331924f, 0.491831213235855f, 0.410365819931030f, 0.491900116205215f, + 0.410743117332459f, 0.491968721151352f, 0.411120474338531f, 0.492037028074265f, + 0.411497890949249f, 0.492105036973953f, 0.411875367164612f, 0.492172777652740f, + 0.412252873182297f, 0.492240220308304f, 0.412630438804626f, 0.492307394742966f, + 0.413008064031601f, 0.492374241352081f, 0.413385748863220f, 0.492440819740295f, + 0.413763463497162f, 0.492507129907608f, 0.414141237735748f, 0.492573112249374f, + 0.414519041776657f, 0.492638826370239f, 0.414896935224533f, 0.492704242467880f, + 0.415274858474731f, 0.492769360542297f, 0.415652841329575f, 0.492834210395813f, + 0.416030853986740f, 0.492898762226105f, 0.416408926248550f, 0.492963016033173f, + 0.416787058115005f, 0.493026971817017f, 0.417165219783783f, 0.493090659379959f, + 0.417543441057205f, 0.493154048919678f, 0.417921721935272f, 0.493217140436172f, + 0.418300032615662f, 0.493279963731766f, 0.418678402900696f, 0.493342459201813f, + 0.419056802988052f, 0.493404686450958f, 0.419435262680054f, 0.493466645479202f, + 0.419813781976700f, 0.493528276681900f, 0.420192331075668f, 0.493589639663696f, + 0.420570939779282f, 0.493650704622269f, 0.420949578285217f, 0.493711471557617f, + 0.421328276395798f, 0.493771970272064f, 0.421707004308701f, 0.493832170963287f, + 0.422085791826248f, 0.493892073631287f, 0.422464638948441f, 0.493951678276062f, + 0.422843515872955f, 0.494011014699936f, 0.423222452402115f, 0.494070053100586f, + 0.423601418733597f, 0.494128793478012f, 0.423980414867401f, 0.494187235832214f, + 0.424359470605850f, 0.494245409965515f, 0.424738585948944f, 0.494303256273270f, + 0.425117731094360f, 0.494360834360123f, 0.425496935844421f, 0.494418144226074f, + 0.425876170396805f, 0.494475126266479f, 0.426255434751511f, 0.494531840085983f, + 0.426634758710861f, 0.494588255882263f, 0.427014142274857f, 0.494644373655319f, + 0.427393525838852f, 0.494700223207474f, 0.427772998809814f, 0.494755744934082f, + 0.428152471780777f, 0.494810998439789f, 0.428532034158707f, 0.494865983724594f, + 0.428911596536636f, 0.494920641183853f, 0.429291218519211f, 0.494975030422211f, + 0.429670870304108f, 0.495029091835022f, 0.430050581693649f, 0.495082914829254f, + 0.430430322885513f, 0.495136409997940f, 0.430810123682022f, 0.495189607143402f, + 0.431189924478531f, 0.495242536067963f, 0.431569814682007f, 0.495295166969299f, + 0.431949704885483f, 0.495347499847412f, 0.432329654693604f, 0.495399564504623f, + 0.432709634304047f, 0.495451331138611f, 0.433089673519135f, 0.495502769947052f, + 0.433469742536545f, 0.495553970336914f, 0.433849841356277f, 0.495604842901230f, + 0.434229999780655f, 0.495655417442322f, 0.434610158205032f, 0.495705723762512f, + 0.434990376234055f, 0.495755732059479f, 0.435370653867722f, 0.495805442333221f, + 0.435750931501389f, 0.495854884386063f, 0.436131268739700f, 0.495903998613358f, + 0.436511665582657f, 0.495952844619751f, 0.436892062425613f, 0.496001392602921f, + 0.437272518873215f, 0.496049642562866f, 0.437653005123138f, 0.496097624301910f, + 0.438033521175385f, 0.496145308017731f, 0.438414067029953f, 0.496192663908005f, + 0.438794672489166f, 0.496239781379700f, 0.439175277948380f, 0.496286571025848f, + 0.439555943012238f, 0.496333062648773f, 0.439936667680740f, 0.496379286050797f, + 0.440317392349243f, 0.496425211429596f, 0.440698176622391f, 0.496470838785172f, + 0.441078960895538f, 0.496516168117523f, 0.441459804773331f, 0.496561229228973f, + 0.441840678453445f, 0.496605962514877f, 0.442221581935883f, 0.496650427579880f, + 0.442602545022964f, 0.496694594621658f, 0.442983508110046f, 0.496738493442535f, + 0.443364530801773f, 0.496782064437866f, 0.443745553493500f, 0.496825367212296f, + 0.444126635789871f, 0.496868371963501f, 0.444507747888565f, 0.496911078691483f, + 0.444888889789581f, 0.496953487396240f, 0.445270061492920f, 0.496995598077774f, + 0.445651292800903f, 0.497037440538406f, 0.446032524108887f, 0.497078984975815f, + 0.446413785219193f, 0.497120231389999f, 0.446795076131821f, 0.497161179780960f, + 0.447176426649094f, 0.497201830148697f, 0.447557777166367f, 0.497242212295532f, + 0.447939187288284f, 0.497282296419144f, 0.448320597410202f, 0.497322082519531f, + 0.448702067136765f, 0.497361570596695f, 0.449083566665649f, 0.497400760650635f, + 0.449465066194534f, 0.497439652681351f, 0.449846625328064f, 0.497478276491165f, + 0.450228184461594f, 0.497516602277756f, 0.450609803199768f, 0.497554630041122f, + 0.450991421937943f, 0.497592359781265f, 0.451373100280762f, 0.497629791498184f, + 0.451754778623581f, 0.497666954994202f, 0.452136516571045f, 0.497703820466995f, + 0.452518254518509f, 0.497740387916565f, 0.452900022268295f, 0.497776657342911f, + 0.453281819820404f, 0.497812628746033f, 0.453663676977158f, 0.497848302125931f, + 0.454045534133911f, 0.497883707284927f, 0.454427421092987f, 0.497918814420700f, + 0.454809308052063f, 0.497953623533249f, 0.455191254615784f, 0.497988134622574f, + 0.455573230981827f, 0.498022347688675f, 0.455955207347870f, 0.498056292533875f, + 0.456337243318558f, 0.498089909553528f, 0.456719279289246f, 0.498123258352280f, + 0.457101345062256f, 0.498156309127808f, 0.457483440637589f, 0.498189061880112f, + 0.457865566015244f, 0.498221516609192f, 0.458247691392899f, 0.498253703117371f, + 0.458629876375198f, 0.498285561800003f, 0.459012061357498f, 0.498317152261734f, + 0.459394276142120f, 0.498348444700241f, 0.459776520729065f, 0.498379439115524f, + 0.460158795118332f, 0.498410135507584f, 0.460541069507599f, 0.498440563678741f, + 0.460923373699188f, 0.498470664024353f, 0.461305707693100f, 0.498500496149063f, + 0.461688071489334f, 0.498530030250549f, 0.462070435285568f, 0.498559266328812f, + 0.462452858686447f, 0.498588204383850f, 0.462835282087326f, 0.498616874217987f, + 0.463217705488205f, 0.498645216226578f, 0.463600188493729f, 0.498673290014267f, + 0.463982671499252f, 0.498701065778732f, 0.464365184307098f, 0.498728543519974f, + 0.464747726917267f, 0.498755723237991f, 0.465130269527435f, 0.498782604932785f, + 0.465512841939926f, 0.498809218406677f, 0.465895414352417f, 0.498835533857346f, + 0.466278046369553f, 0.498861521482468f, 0.466660678386688f, 0.498887240886688f, + 0.467043310403824f, 0.498912662267685f, 0.467426002025604f, 0.498937815427780f, + 0.467808693647385f, 0.498962640762329f, 0.468191385269165f, 0.498987197875977f, + 0.468574106693268f, 0.499011427164078f, 0.468956857919693f, 0.499035388231277f, + 0.469339638948441f, 0.499059051275253f, 0.469722419977188f, 0.499082416296005f, + 0.470105201005936f, 0.499105513095856f, 0.470488041639328f, 0.499128282070160f, + 0.470870882272720f, 0.499150782823563f, 0.471253722906113f, 0.499172955751419f, + 0.471636593341827f, 0.499194860458374f, 0.472019463777542f, 0.499216467142105f, + 0.472402364015579f, 0.499237775802612f, 0.472785294055939f, 0.499258816242218f, + 0.473168224096298f, 0.499279528856277f, 0.473551183938980f, 0.499299973249435f, + 0.473934143781662f, 0.499320119619370f, 0.474317133426666f, 0.499339967966080f, + 0.474700123071671f, 0.499359518289566f, 0.475083142518997f, 0.499378770589828f, + 0.475466161966324f, 0.499397724866867f, 0.475849211215973f, 0.499416410923004f, + 0.476232260465622f, 0.499434769153595f, 0.476615339517593f, 0.499452859163284f, + 0.476998418569565f, 0.499470651149750f, 0.477381497621536f, 0.499488145112991f, + 0.477764606475830f, 0.499505341053009f, 0.478147745132446f, 0.499522238969803f, + 0.478530883789063f, 0.499538868665695f, 0.478914022445679f, 0.499555170536041f, + 0.479297190904617f, 0.499571204185486f, 0.479680359363556f, 0.499586939811707f, + 0.480063527822495f, 0.499602377414703f, 0.480446726083755f, 0.499617516994476f, + 0.480829954147339f, 0.499632388353348f, 0.481213152408600f, 0.499646931886673f, + 0.481596380472183f, 0.499661177396774f, 0.481979638338089f, 0.499675154685974f, + 0.482362866401672f, 0.499688833951950f, 0.482746154069901f, 0.499702215194702f, + 0.483129411935806f, 0.499715298414230f, 0.483512699604034f, 0.499728083610535f, + 0.483895987272263f, 0.499740600585938f, 0.484279274940491f, 0.499752789735794f, + 0.484662592411041f, 0.499764710664749f, 0.485045909881592f, 0.499776333570480f, + 0.485429257154465f, 0.499787658452988f, 0.485812574625015f, 0.499798685312271f, + 0.486195921897888f, 0.499809414148331f, 0.486579269170761f, 0.499819844961166f, + 0.486962646245956f, 0.499830007553101f, 0.487346023321152f, 0.499839842319489f, + 0.487729400396347f, 0.499849408864975f, 0.488112777471542f, 0.499858677387238f, + 0.488496154546738f, 0.499867647886276f, 0.488879561424255f, 0.499876320362091f, + 0.489262968301773f, 0.499884694814682f, 0.489646375179291f, 0.499892801046371f, + 0.490029782056808f, 0.499900579452515f, 0.490413218736649f, 0.499908089637756f, + 0.490796625614166f, 0.499915301799774f, 0.491180062294006f, 0.499922215938568f, + 0.491563498973846f, 0.499928832054138f, 0.491946935653687f, 0.499935150146484f, + 0.492330402135849f, 0.499941170215607f, 0.492713838815689f, 0.499946922063828f, + 0.493097305297852f, 0.499952346086502f, 0.493480771780014f, 0.499957501888275f, + 0.493864238262177f, 0.499962359666824f, 0.494247704744339f, 0.499966919422150f, + 0.494631171226501f, 0.499971181154251f, 0.495014637708664f, 0.499975144863129f, + 0.495398133993149f, 0.499978810548782f, 0.495781600475311f, 0.499982208013535f, + 0.496165096759796f, 0.499985307455063f, 0.496548563241959f, 0.499988079071045f, + 0.496932059526443f, 0.499990582466125f, 0.497315555810928f, 0.499992787837982f, + 0.497699022293091f, 0.499994695186615f, 0.498082518577576f, 0.499996334314346f, + 0.498466014862061f, 0.499997645616531f, 0.498849511146545f, 0.499998688697815f, + 0.499233007431030f, 0.499999403953552f, 0.499616503715515f, 0.499999850988388f, +}; + + +/** + @par + Generation of realCoefB array: + @par + n = 4096 +
for (i = 0; i < n; i++)
+  {
+     pBTable[2 * i]     = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));
+     pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
+  }
+ */ + +const float32_t realCoefB[8192] = { + 0.500000000000000f, 0.500000000000000f, 0.500383496284485f, 0.499999850988388f, + 0.500766992568970f, 0.499999403953552f, 0.501150488853455f, 0.499998688697815f, + 0.501533985137939f, 0.499997645616531f, 0.501917481422424f, 0.499996334314346f, + 0.502300977706909f, 0.499994695186615f, 0.502684473991394f, 0.499992787837982f, + 0.503067970275879f, 0.499990582466125f, 0.503451406955719f, 0.499988079071045f, + 0.503834903240204f, 0.499985307455063f, 0.504218399524689f, 0.499982208013535f, + 0.504601895809174f, 0.499978810548782f, 0.504985332489014f, 0.499975144863129f, + 0.505368828773499f, 0.499971181154251f, 0.505752325057983f, 0.499966919422150f, + 0.506135761737823f, 0.499962359666824f, 0.506519258022308f, 0.499957501888275f, + 0.506902694702148f, 0.499952346086502f, 0.507286131381989f, 0.499946922063828f, + 0.507669627666473f, 0.499941170215607f, 0.508053064346313f, 0.499935150146484f, + 0.508436501026154f, 0.499928832054138f, 0.508819937705994f, 0.499922215938568f, + 0.509203374385834f, 0.499915301799774f, 0.509586811065674f, 0.499908089637756f, + 0.509970188140869f, 0.499900579452515f, 0.510353624820709f, 0.499892801046371f, + 0.510737061500549f, 0.499884694814682f, 0.511120438575745f, 0.499876320362091f, + 0.511503815650940f, 0.499867647886276f, 0.511887252330780f, 0.499858677387238f, + 0.512270629405975f, 0.499849408864975f, 0.512654006481171f, 0.499839842319489f, + 0.513037383556366f, 0.499830007553101f, 0.513420701026917f, 0.499819844961166f, + 0.513804078102112f, 0.499809414148331f, 0.514187395572662f, 0.499798685312271f, + 0.514570772647858f, 0.499787658452988f, 0.514954090118408f, 0.499776333570480f, + 0.515337407588959f, 0.499764710664749f, 0.515720725059509f, 0.499752789735794f, + 0.516103982925415f, 0.499740600585938f, 0.516487300395966f, 0.499728083610535f, + 0.516870558261871f, 0.499715298414230f, 0.517253875732422f, 0.499702215194702f, + 0.517637133598328f, 0.499688833951950f, 0.518020391464233f, 0.499675154685974f, + 0.518403589725494f, 0.499661177396774f, 0.518786847591400f, 0.499646931886673f, + 0.519170045852661f, 0.499632388353348f, 0.519553244113922f, 0.499617516994476f, + 0.519936442375183f, 0.499602377414703f, 0.520319640636444f, 0.499586939811707f, + 0.520702838897705f, 0.499571204185486f, 0.521085977554321f, 0.499555170536041f, + 0.521469116210938f, 0.499538868665695f, 0.521852254867554f, 0.499522238969803f, + 0.522235393524170f, 0.499505341053009f, 0.522618472576141f, 0.499488145112991f, + 0.523001611232758f, 0.499470651149750f, 0.523384690284729f, 0.499452859163284f, + 0.523767769336700f, 0.499434769153595f, 0.524150788784027f, 0.499416410923004f, + 0.524533808231354f, 0.499397724866867f, 0.524916887283325f, 0.499378770589828f, + 0.525299847126007f, 0.499359518289566f, 0.525682866573334f, 0.499339967966080f, + 0.526065826416016f, 0.499320119619370f, 0.526448845863342f, 0.499299973249435f, + 0.526831746101379f, 0.499279528856277f, 0.527214705944061f, 0.499258816242218f, + 0.527597606182098f, 0.499237775802612f, 0.527980506420136f, 0.499216467142105f, + 0.528363406658173f, 0.499194860458374f, 0.528746306896210f, 0.499172955751419f, + 0.529129147529602f, 0.499150782823563f, 0.529511988162994f, 0.499128282070160f, + 0.529894769191742f, 0.499105513095856f, 0.530277609825134f, 0.499082416296005f, + 0.530660390853882f, 0.499059051275253f, 0.531043112277985f, 0.499035388231277f, + 0.531425893306732f, 0.499011427164078f, 0.531808614730835f, 0.498987197875977f, + 0.532191336154938f, 0.498962640762329f, 0.532573997974396f, 0.498937815427780f, + 0.532956659793854f, 0.498912662267685f, 0.533339321613312f, 0.498887240886688f, + 0.533721983432770f, 0.498861521482468f, 0.534104585647583f, 0.498835533857346f, + 0.534487187862396f, 0.498809218406677f, 0.534869730472565f, 0.498782604932785f, + 0.535252273082733f, 0.498755723237991f, 0.535634815692902f, 0.498728543519974f, + 0.536017298698425f, 0.498701065778732f, 0.536399841308594f, 0.498673290014267f, + 0.536782264709473f, 0.498645216226578f, 0.537164747714996f, 0.498616874217987f, + 0.537547171115875f, 0.498588204383850f, 0.537929534912109f, 0.498559266328812f, + 0.538311958312988f, 0.498530030250549f, 0.538694262504578f, 0.498500496149063f, + 0.539076626300812f, 0.498470664024353f, 0.539458930492401f, 0.498440563678741f, + 0.539841234683990f, 0.498410135507584f, 0.540223479270935f, 0.498379439115524f, + 0.540605723857880f, 0.498348444700241f, 0.540987968444824f, 0.498317152261734f, + 0.541370153427124f, 0.498285561800003f, 0.541752278804779f, 0.498253703117371f, + 0.542134463787079f, 0.498221516609192f, 0.542516589164734f, 0.498189061880112f, + 0.542898654937744f, 0.498156309127808f, 0.543280720710754f, 0.498123258352280f, + 0.543662786483765f, 0.498089909553528f, 0.544044792652130f, 0.498056292533875f, + 0.544426798820496f, 0.498022347688675f, 0.544808745384216f, 0.497988134622574f, + 0.545190691947937f, 0.497953623533249f, 0.545572578907013f, 0.497918814420700f, + 0.545954465866089f, 0.497883707284927f, 0.546336352825165f, 0.497848302125931f, + 0.546718180179596f, 0.497812628746033f, 0.547099947929382f, 0.497776657342911f, + 0.547481775283813f, 0.497740387916565f, 0.547863483428955f, 0.497703820466995f, + 0.548245191574097f, 0.497666954994202f, 0.548626899719238f, 0.497629791498184f, + 0.549008548259735f, 0.497592359781265f, 0.549390196800232f, 0.497554630041122f, + 0.549771785736084f, 0.497516602277756f, 0.550153374671936f, 0.497478276491165f, + 0.550534904003143f, 0.497439652681351f, 0.550916433334351f, 0.497400760650635f, + 0.551297962665558f, 0.497361570596695f, 0.551679372787476f, 0.497322082519531f, + 0.552060842514038f, 0.497282296419144f, 0.552442193031311f, 0.497242212295532f, + 0.552823603153229f, 0.497201830148697f, 0.553204894065857f, 0.497161179780960f, + 0.553586184978485f, 0.497120231389999f, 0.553967475891113f, 0.497078984975815f, + 0.554348707199097f, 0.497037440538406f, 0.554729938507080f, 0.496995598077774f, + 0.555111110210419f, 0.496953487396240f, 0.555492222309113f, 0.496911078691483f, + 0.555873334407806f, 0.496868371963501f, 0.556254446506500f, 0.496825367212296f, + 0.556635499000549f, 0.496782064437866f, 0.557016491889954f, 0.496738493442535f, + 0.557397484779358f, 0.496694594621658f, 0.557778418064117f, 0.496650427579880f, + 0.558159291744232f, 0.496605962514877f, 0.558540165424347f, 0.496561229228973f, + 0.558921039104462f, 0.496516168117523f, 0.559301853179932f, 0.496470838785172f, + 0.559682607650757f, 0.496425211429596f, 0.560063362121582f, 0.496379286050797f, + 0.560444056987762f, 0.496333062648773f, 0.560824692249298f, 0.496286571025848f, + 0.561205327510834f, 0.496239781379700f, 0.561585903167725f, 0.496192663908005f, + 0.561966478824615f, 0.496145308017731f, 0.562346994876862f, 0.496097624301910f, + 0.562727510929108f, 0.496049642562866f, 0.563107967376709f, 0.496001392602921f, + 0.563488364219666f, 0.495952844619751f, 0.563868701457977f, 0.495903998613358f, + 0.564249038696289f, 0.495854884386063f, 0.564629375934601f, 0.495805442333221f, + 0.565009593963623f, 0.495755732059479f, 0.565389811992645f, 0.495705723762512f, + 0.565770030021667f, 0.495655417442322f, 0.566150128841400f, 0.495604842901230f, + 0.566530287265778f, 0.495553970336914f, 0.566910326480865f, 0.495502769947052f, + 0.567290365695953f, 0.495451331138611f, 0.567670345306396f, 0.495399564504623f, + 0.568050265312195f, 0.495347499847412f, 0.568430185317993f, 0.495295166969299f, + 0.568810045719147f, 0.495242536067963f, 0.569189906120300f, 0.495189607143402f, + 0.569569647312164f, 0.495136409997940f, 0.569949388504028f, 0.495082914829254f, + 0.570329129695892f, 0.495029091835022f, 0.570708811283112f, 0.494975030422211f, + 0.571088373661041f, 0.494920641183853f, 0.571467995643616f, 0.494865983724594f, + 0.571847498416901f, 0.494810998439789f, 0.572227001190186f, 0.494755744934082f, + 0.572606444358826f, 0.494700223207474f, 0.572985887527466f, 0.494644373655319f, + 0.573365211486816f, 0.494588255882263f, 0.573744535446167f, 0.494531840085983f, + 0.574123859405518f, 0.494475126266479f, 0.574503064155579f, 0.494418144226074f, + 0.574882268905640f, 0.494360834360123f, 0.575261414051056f, 0.494303256273270f, + 0.575640499591827f, 0.494245409965515f, 0.576019585132599f, 0.494187235832214f, + 0.576398611068726f, 0.494128793478012f, 0.576777577400208f, 0.494070053100586f, + 0.577156484127045f, 0.494011014699936f, 0.577535390853882f, 0.493951678276062f, + 0.577914178371429f, 0.493892073631287f, 0.578292965888977f, 0.493832170963287f, + 0.578671753406525f, 0.493771970272064f, 0.579050421714783f, 0.493711471557617f, + 0.579429090023041f, 0.493650704622269f, 0.579807698726654f, 0.493589639663696f, + 0.580186247825623f, 0.493528276681900f, 0.580564737319946f, 0.493466645479202f, + 0.580943167209625f, 0.493404686450958f, 0.581321597099304f, 0.493342459201813f, + 0.581699967384338f, 0.493279963731766f, 0.582078278064728f, 0.493217140436172f, + 0.582456588745117f, 0.493154048919678f, 0.582834780216217f, 0.493090659379959f, + 0.583212971687317f, 0.493026971817017f, 0.583591103553772f, 0.492963016033173f, + 0.583969175815582f, 0.492898762226105f, 0.584347188472748f, 0.492834210395813f, + 0.584725141525269f, 0.492769360542297f, 0.585103094577789f, 0.492704242467880f, + 0.585480928421021f, 0.492638826370239f, 0.585858762264252f, 0.492573112249374f, + 0.586236536502838f, 0.492507129907608f, 0.586614251136780f, 0.492440819740295f, + 0.586991965770721f, 0.492374241352081f, 0.587369561195374f, 0.492307394742966f, + 0.587747097015381f, 0.492240220308304f, 0.588124632835388f, 0.492172777652740f, + 0.588502109050751f, 0.492105036973953f, 0.588879525661469f, 0.492037028074265f, + 0.589256882667542f, 0.491968721151352f, 0.589634180068970f, 0.491900116205215f, + 0.590011477470398f, 0.491831213235855f, 0.590388655662537f, 0.491762012243271f, + 0.590765833854675f, 0.491692543029785f, 0.591142892837524f, 0.491622805595398f, + 0.591519951820374f, 0.491552740335464f, 0.591896951198578f, 0.491482406854630f, + 0.592273890972137f, 0.491411775350571f, 0.592650771141052f, 0.491340845823288f, + 0.593027591705322f, 0.491269648075104f, 0.593404352664948f, 0.491198152303696f, + 0.593781054019928f, 0.491126358509064f, 0.594157755374908f, 0.491054296493530f, + 0.594534337520599f, 0.490981936454773f, 0.594910860061646f, 0.490909278392792f, + 0.595287382602692f, 0.490836352109909f, 0.595663845539093f, 0.490763127803802f, + 0.596040189266205f, 0.490689605474472f, 0.596416532993317f, 0.490615785121918f, + 0.596792817115784f, 0.490541696548462f, 0.597168982028961f, 0.490467309951782f, + 0.597545146942139f, 0.490392625331879f, 0.597921252250671f, 0.490317672491074f, + 0.598297297954559f, 0.490242421627045f, 0.598673284053802f, 0.490166902542114f, + 0.599049210548401f, 0.490091055631638f, 0.599425077438354f, 0.490014940500259f, + 0.599800884723663f, 0.489938557147980f, 0.600176632404327f, 0.489861875772476f, + 0.600552320480347f, 0.489784896373749f, 0.600927948951721f, 0.489707618951797f, + 0.601303517818451f, 0.489630073308945f, 0.601679027080536f, 0.489552229642868f, + 0.602054476737976f, 0.489474087953568f, 0.602429866790771f, 0.489395678043365f, + 0.602805197238922f, 0.489316970109940f, 0.603180468082428f, 0.489237964153290f, + 0.603555679321289f, 0.489158689975739f, 0.603930830955505f, 0.489079117774963f, + 0.604305922985077f, 0.488999247550964f, 0.604680955410004f, 0.488919109106064f, + 0.605055928230286f, 0.488838672637939f, 0.605430841445923f, 0.488757967948914f, + 0.605805635452271f, 0.488676935434341f, 0.606180429458618f, 0.488595664501190f, + 0.606555163860321f, 0.488514065742493f, 0.606929838657379f, 0.488432198762894f, + 0.607304394245148f, 0.488350033760071f, 0.607678949832916f, 0.488267600536346f, + 0.608053386211395f, 0.488184869289398f, 0.608427822589874f, 0.488101840019226f, + 0.608802139759064f, 0.488018542528152f, 0.609176397323608f, 0.487934947013855f, + 0.609550595283508f, 0.487851053476334f, 0.609924793243408f, 0.487766891717911f, + 0.610298871994019f, 0.487682431936264f, 0.610672831535339f, 0.487597703933716f, + 0.611046791076660f, 0.487512677907944f, 0.611420691013336f, 0.487427353858948f, + 0.611794531345367f, 0.487341761589050f, 0.612168252468109f, 0.487255871295929f, + 0.612541973590851f, 0.487169682979584f, 0.612915575504303f, 0.487083226442337f, + 0.613289117813110f, 0.486996471881866f, 0.613662600517273f, 0.486909449100494f, + 0.614036023616791f, 0.486822128295898f, 0.614409387111664f, 0.486734509468079f, + 0.614782691001892f, 0.486646622419357f, 0.615155875682831f, 0.486558437347412f, + 0.615529060363770f, 0.486469984054565f, 0.615902125835419f, 0.486381232738495f, + 0.616275131702423f, 0.486292183399200f, 0.616648077964783f, 0.486202865839005f, + 0.617020964622498f, 0.486113250255585f, 0.617393791675568f, 0.486023366451263f, + 0.617766559123993f, 0.485933154821396f, 0.618139207363129f, 0.485842704772949f, + 0.618511795997620f, 0.485751956701279f, 0.618884325027466f, 0.485660910606384f, + 0.619256794452667f, 0.485569566488266f, 0.619629204273224f, 0.485477954149246f, + 0.620001494884491f, 0.485386073589325f, 0.620373785495758f, 0.485293895006180f, + 0.620745956897736f, 0.485201418399811f, 0.621118068695068f, 0.485108673572540f, + 0.621490061283112f, 0.485015630722046f, 0.621862053871155f, 0.484922289848328f, + 0.622233927249908f, 0.484828680753708f, 0.622605800628662f, 0.484734803438187f, + 0.622977554798126f, 0.484640628099442f, 0.623349189758301f, 0.484546154737473f, + 0.623720824718475f, 0.484451413154602f, 0.624092340469360f, 0.484356373548508f, + 0.624463796615601f, 0.484261035919189f, 0.624835193157196f, 0.484165430068970f, + 0.625206530094147f, 0.484069555997849f, 0.625577747821808f, 0.483973383903503f, + 0.625948905944824f, 0.483876913785934f, 0.626320004463196f, 0.483780175447464f, + 0.626691043376923f, 0.483683139085770f, 0.627061963081360f, 0.483585834503174f, + 0.627432823181152f, 0.483488231897354f, 0.627803623676300f, 0.483390361070633f, + 0.628174364566803f, 0.483292192220688f, 0.628544986248016f, 0.483193725347519f, + 0.628915548324585f, 0.483094990253448f, 0.629286050796509f, 0.482995986938477f, + 0.629656434059143f, 0.482896685600281f, 0.630026817321777f, 0.482797086238861f, + 0.630397081375122f, 0.482697218656540f, 0.630767226219177f, 0.482597053050995f, + 0.631137371063232f, 0.482496619224548f, 0.631507396697998f, 0.482395917177200f, + 0.631877362728119f, 0.482294887304306f, 0.632247209548950f, 0.482193619012833f, + 0.632616996765137f, 0.482092022895813f, 0.632986724376678f, 0.481990188360214f, + 0.633356392383575f, 0.481888025999069f, 0.633725941181183f, 0.481785595417023f, + 0.634095430374146f, 0.481682896614075f, 0.634464859962463f, 0.481579899787903f, + 0.634834170341492f, 0.481476634740829f, 0.635203421115875f, 0.481373071670532f, + 0.635572552680969f, 0.481269240379334f, 0.635941684246063f, 0.481165111064911f, + 0.636310696601868f, 0.481060713529587f, 0.636679589748383f, 0.480956017971039f, + 0.637048482894897f, 0.480851024389267f, 0.637417197227478f, 0.480745792388916f, + 0.637785911560059f, 0.480640232563019f, 0.638154506683350f, 0.480534434318542f, + 0.638523042201996f, 0.480428308248520f, 0.638891458511353f, 0.480321943759918f, + 0.639259815216064f, 0.480215251445770f, 0.639628112316132f, 0.480108320713043f, + 0.639996349811554f, 0.480001062154770f, 0.640364408493042f, 0.479893565177917f, + 0.640732467174530f, 0.479785770177841f, 0.641100406646729f, 0.479677677154541f, + 0.641468286514282f, 0.479569315910339f, 0.641836047172546f, 0.479460656642914f, + 0.642203748226166f, 0.479351729154587f, 0.642571389675140f, 0.479242533445358f, + 0.642938911914825f, 0.479133039712906f, 0.643306374549866f, 0.479023247957230f, + 0.643673717975616f, 0.478913217782974f, 0.644041001796722f, 0.478802859783173f, + 0.644408226013184f, 0.478692263364792f, 0.644775331020355f, 0.478581339120865f, + 0.645142316818237f, 0.478470176458359f, 0.645509302616119f, 0.478358715772629f, + 0.645876109600067f, 0.478246957063675f, 0.646242916584015f, 0.478134930133820f, + 0.646609604358673f, 0.478022634983063f, 0.646976172924042f, 0.477910041809082f, + 0.647342681884766f, 0.477797180414200f, 0.647709131240845f, 0.477684020996094f, + 0.648075461387634f, 0.477570593357086f, 0.648441672325134f, 0.477456867694855f, + 0.648807883262634f, 0.477342873811722f, 0.649173915386200f, 0.477228611707687f, + 0.649539887905121f, 0.477114051580429f, 0.649905800819397f, 0.476999223232269f, + 0.650271594524384f, 0.476884096860886f, 0.650637328624725f, 0.476768702268600f, + 0.651003003120422f, 0.476653009653091f, 0.651368498802185f, 0.476537048816681f, + 0.651733994483948f, 0.476420819759369f, 0.652099311351776f, 0.476304292678833f, + 0.652464628219604f, 0.476187497377396f, 0.652829825878143f, 0.476070433855057f, + 0.653194904327393f, 0.475953072309494f, 0.653559923171997f, 0.475835442543030f, + 0.653924822807312f, 0.475717514753342f, 0.654289662837982f, 0.475599318742752f, + 0.654654383659363f, 0.475480824708939f, 0.655019044876099f, 0.475362062454224f, + 0.655383586883545f, 0.475243031978607f, 0.655748009681702f, 0.475123733282089f, + 0.656112432479858f, 0.475004136562347f, 0.656476676464081f, 0.474884241819382f, + 0.656840860843658f, 0.474764078855515f, 0.657204985618591f, 0.474643647670746f, + 0.657568991184235f, 0.474522948265076f, 0.657932877540588f, 0.474401950836182f, + 0.658296704292297f, 0.474280685186386f, 0.658660411834717f, 0.474159121513367f, + 0.659024059772491f, 0.474037289619446f, 0.659387588500977f, 0.473915189504623f, + 0.659750998020172f, 0.473792791366577f, 0.660114347934723f, 0.473670125007629f, + 0.660477638244629f, 0.473547190427780f, 0.660840749740601f, 0.473423957824707f, + 0.661203861236572f, 0.473300457000732f, 0.661566793918610f, 0.473176687955856f, + 0.661929666996002f, 0.473052620887756f, 0.662292480468750f, 0.472928285598755f, + 0.662655174732208f, 0.472803652286530f, 0.663017749786377f, 0.472678780555725f, + 0.663380205631256f, 0.472553610801697f, 0.663742601871490f, 0.472428143024445f, + 0.664104938507080f, 0.472302407026291f, 0.664467096328735f, 0.472176402807236f, + 0.664829254150391f, 0.472050130367279f, 0.665191233158112f, 0.471923559904099f, + 0.665553152561188f, 0.471796721220016f, 0.665914952754974f, 0.471669614315033f, + 0.666276693344116f, 0.471542209386826f, 0.666638314723969f, 0.471414536237717f, + 0.666999816894531f, 0.471286594867706f, 0.667361259460449f, 0.471158385276794f, + 0.667722582817078f, 0.471029877662659f, 0.668083786964417f, 0.470901101827621f, + 0.668444931507111f, 0.470772027969360f, 0.668805956840515f, 0.470642685890198f, + 0.669166862964630f, 0.470513075590134f, 0.669527709484100f, 0.470383197069168f, + 0.669888436794281f, 0.470253020524979f, 0.670249044895172f, 0.470122605562210f, + 0.670609593391418f, 0.469991862773895f, 0.670970022678375f, 0.469860881567001f, + 0.671330332756042f, 0.469729602336884f, 0.671690583229065f, 0.469598054885864f, + 0.672050714492798f, 0.469466239213943f, 0.672410726547241f, 0.469334155321121f, + 0.672770678997040f, 0.469201773405075f, 0.673130512237549f, 0.469069123268127f, + 0.673490226268768f, 0.468936175107956f, 0.673849821090698f, 0.468802988529205f, + 0.674209356307983f, 0.468669503927231f, 0.674568772315979f, 0.468535751104355f, + 0.674928069114685f, 0.468401730060577f, 0.675287246704102f, 0.468267410993576f, + 0.675646364688873f, 0.468132823705673f, 0.676005363464355f, 0.467997968196869f, + 0.676364302635193f, 0.467862844467163f, 0.676723062992096f, 0.467727422714233f, + 0.677081763744354f, 0.467591762542725f, 0.677440345287323f, 0.467455804347992f, + 0.677798807621002f, 0.467319577932358f, 0.678157210350037f, 0.467183053493500f, + 0.678515493869781f, 0.467046260833740f, 0.678873658180237f, 0.466909229755402f, + 0.679231703281403f, 0.466771900653839f, 0.679589688777924f, 0.466634273529053f, + 0.679947495460510f, 0.466496407985687f, 0.680305242538452f, 0.466358244419098f, + 0.680662930011749f, 0.466219812631607f, 0.681020438671112f, 0.466081112623215f, + 0.681377887725830f, 0.465942144393921f, 0.681735157966614f, 0.465802878141403f, + 0.682092368602753f, 0.465663343667984f, 0.682449519634247f, 0.465523540973663f, + 0.682806491851807f, 0.465383470058441f, 0.683163404464722f, 0.465243130922318f, + 0.683520197868347f, 0.465102523565292f, 0.683876872062683f, 0.464961618185043f, + 0.684233427047729f, 0.464820444583893f, 0.684589862823486f, 0.464679002761841f, + 0.684946238994598f, 0.464537292718887f, 0.685302436351776f, 0.464395314455032f, + 0.685658574104309f, 0.464253038167953f, 0.686014592647552f, 0.464110493659973f, + 0.686370551586151f, 0.463967710733414f, 0.686726331710815f, 0.463824629783630f, + 0.687082052230835f, 0.463681250810623f, 0.687437593936920f, 0.463537633419037f, + 0.687793076038361f, 0.463393747806549f, 0.688148438930511f, 0.463249564170837f, + 0.688503682613373f, 0.463105112314224f, 0.688858866691589f, 0.462960392236710f, + 0.689213871955872f, 0.462815403938293f, 0.689568817615509f, 0.462670147418976f, + 0.689923584461212f, 0.462524622678757f, 0.690278291702271f, 0.462378799915314f, + 0.690632879734039f, 0.462232738733292f, 0.690987348556519f, 0.462086379528046f, + 0.691341698169708f, 0.461939752101898f, 0.691695988178253f, 0.461792886257172f, + 0.692050099372864f, 0.461645722389221f, 0.692404091358185f, 0.461498260498047f, + 0.692758023738861f, 0.461350560188293f, 0.693111836910248f, 0.461202591657639f, + 0.693465530872345f, 0.461054325103760f, 0.693819046020508f, 0.460905820131302f, + 0.694172501564026f, 0.460757017135620f, 0.694525837898254f, 0.460607945919037f, + 0.694879114627838f, 0.460458606481552f, 0.695232212543488f, 0.460309028625488f, + 0.695585191249847f, 0.460159152746201f, 0.695938050746918f, 0.460008978843689f, + 0.696290850639343f, 0.459858566522598f, 0.696643471717834f, 0.459707885980606f, + 0.696996033191681f, 0.459556937217712f, 0.697348415851593f, 0.459405690431595f, + 0.697700738906860f, 0.459254205226898f, 0.698052942752838f, 0.459102421998978f, + 0.698404967784882f, 0.458950400352478f, 0.698756933212280f, 0.458798080682755f, + 0.699108779430389f, 0.458645492792130f, 0.699460506439209f, 0.458492636680603f, + 0.699812114238739f, 0.458339542150497f, 0.700163602828979f, 0.458186149597168f, + 0.700514972209930f, 0.458032488822937f, 0.700866222381592f, 0.457878559827805f, + 0.701217353343964f, 0.457724362611771f, 0.701568365097046f, 0.457569897174835f, + 0.701919257640839f, 0.457415163516998f, 0.702270030975342f, 0.457260161638260f, + 0.702620685100555f, 0.457104891538620f, 0.702971220016479f, 0.456949323415756f, + 0.703321635723114f, 0.456793516874313f, 0.703671932220459f, 0.456637442111969f, + 0.704022109508514f, 0.456481099128723f, 0.704372167587280f, 0.456324487924576f, + 0.704722046852112f, 0.456167578697205f, 0.705071866512299f, 0.456010431051254f, + 0.705421566963196f, 0.455853015184402f, 0.705771148204803f, 0.455695331096649f, + 0.706120610237122f, 0.455537378787994f, 0.706469953060150f, 0.455379128456116f, + 0.706819176673889f, 0.455220639705658f, 0.707168221473694f, 0.455061882734299f, + 0.707517206668854f, 0.454902857542038f, 0.707866072654724f, 0.454743564128876f, + 0.708214759826660f, 0.454584002494812f, 0.708563387393951f, 0.454424172639847f, + 0.708911836147308f, 0.454264044761658f, 0.709260225296021f, 0.454103678464890f, + 0.709608435630798f, 0.453943043947220f, 0.709956526756287f, 0.453782171010971f, + 0.710304558277130f, 0.453621000051498f, 0.710652410984039f, 0.453459560871124f, + 0.711000144481659f, 0.453297853469849f, 0.711347758769989f, 0.453135877847672f, + 0.711695253849030f, 0.452973634004593f, 0.712042629718781f, 0.452811151742935f, + 0.712389826774597f, 0.452648371458054f, 0.712736964225769f, 0.452485352754593f, + 0.713083922863007f, 0.452322036027908f, 0.713430821895599f, 0.452158480882645f, + 0.713777542114258f, 0.451994657516479f, 0.714124143123627f, 0.451830536127090f, + 0.714470624923706f, 0.451666176319122f, 0.714816987514496f, 0.451501548290253f, + 0.715163230895996f, 0.451336652040482f, 0.715509355068207f, 0.451171487569809f, + 0.715855300426483f, 0.451006084680557f, 0.716201186180115f, 0.450840383768082f, + 0.716546893119812f, 0.450674414634705f, 0.716892480850220f, 0.450508207082748f, + 0.717238008975983f, 0.450341701507568f, 0.717583298683167f, 0.450174957513809f, + 0.717928528785706f, 0.450007945299149f, 0.718273639678955f, 0.449840664863586f, + 0.718618571758270f, 0.449673116207123f, 0.718963444232941f, 0.449505299329758f, + 0.719308137893677f, 0.449337244033813f, 0.719652712345123f, 0.449168890714645f, + 0.719997107982636f, 0.449000298976898f, 0.720341444015503f, 0.448831409215927f, + 0.720685660839081f, 0.448662281036377f, 0.721029698848724f, 0.448492884635925f, + 0.721373617649078f, 0.448323249816895f, 0.721717417240143f, 0.448153316974640f, + 0.722061097621918f, 0.447983115911484f, 0.722404599189758f, 0.447812676429749f, + 0.722747981548309f, 0.447641968727112f, 0.723091304302216f, 0.447470992803574f, + 0.723434448242188f, 0.447299748659134f, 0.723777413368225f, 0.447128236293793f, + 0.724120318889618f, 0.446956485509872f, 0.724463045597076f, 0.446784436702728f, + 0.724805653095245f, 0.446612149477005f, 0.725148141384125f, 0.446439594030380f, + 0.725490510463715f, 0.446266770362854f, 0.725832700729370f, 0.446093708276749f, + 0.726174771785736f, 0.445920348167419f, 0.726516723632813f, 0.445746749639511f, + 0.726858556270599f, 0.445572882890701f, 0.727200269699097f, 0.445398747920990f, + 0.727541804313660f, 0.445224374532700f, 0.727883219718933f, 0.445049703121185f, + 0.728224515914917f, 0.444874793291092f, 0.728565633296967f, 0.444699615240097f, + 0.728906631469727f, 0.444524168968201f, 0.729247510433197f, 0.444348484277725f, + 0.729588270187378f, 0.444172531366348f, 0.729928910732269f, 0.443996280431747f, + 0.730269372463226f, 0.443819820880890f, 0.730609714984894f, 0.443643063306808f, + 0.730949878692627f, 0.443466067314148f, 0.731289982795715f, 0.443288803100586f, + 0.731629908084869f, 0.443111270666122f, 0.731969714164734f, 0.442933470010757f, + 0.732309341430664f, 0.442755430936813f, 0.732648849487305f, 0.442577123641968f, + 0.732988238334656f, 0.442398548126221f, 0.733327507972717f, 0.442219734191895f, + 0.733666598796844f, 0.442040622234344f, 0.734005570411682f, 0.441861271858215f, + 0.734344422817230f, 0.441681683063507f, 0.734683096408844f, 0.441501796245575f, + 0.735021650791168f, 0.441321671009064f, 0.735360085964203f, 0.441141277551651f, + 0.735698342323303f, 0.440960645675659f, 0.736036539077759f, 0.440779715776443f, + 0.736374497413635f, 0.440598547458649f, 0.736712396144867f, 0.440417140722275f, + 0.737050116062164f, 0.440235435962677f, 0.737387716770172f, 0.440053492784500f, + 0.737725138664246f, 0.439871311187744f, 0.738062441349030f, 0.439688831567764f, + 0.738399624824524f, 0.439506113529205f, 0.738736629486084f, 0.439323127269745f, + 0.739073514938354f, 0.439139902591705f, 0.739410281181335f, 0.438956409692764f, + 0.739746868610382f, 0.438772648572922f, 0.740083336830139f, 0.438588619232178f, + 0.740419685840607f, 0.438404351472855f, 0.740755856037140f, 0.438219845294952f, + 0.741091907024384f, 0.438035041093826f, 0.741427779197693f, 0.437849998474121f, + 0.741763532161713f, 0.437664687633514f, 0.742099165916443f, 0.437479138374329f, + 0.742434620857239f, 0.437293320894241f, 0.742769956588745f, 0.437107264995575f, + 0.743105113506317f, 0.436920911073685f, 0.743440151214600f, 0.436734348535538f, + 0.743775069713593f, 0.436547487974167f, 0.744109809398651f, 0.436360388994217f, + 0.744444429874420f, 0.436173021793365f, 0.744778931140900f, 0.435985416173935f, + 0.745113253593445f, 0.435797542333603f, 0.745447397232056f, 0.435609430074692f, + 0.745781481266022f, 0.435421019792557f, 0.746115326881409f, 0.435232400894165f, + 0.746449112892151f, 0.435043483972549f, 0.746782720088959f, 0.434854328632355f, + 0.747116148471832f, 0.434664934873581f, 0.747449457645416f, 0.434475272893906f, + 0.747782647609711f, 0.434285342693329f, 0.748115658760071f, 0.434095174074173f, + 0.748448550701141f, 0.433904737234116f, 0.748781263828278f, 0.433714061975479f, + 0.749113857746124f, 0.433523118495941f, 0.749446272850037f, 0.433331936597824f, + 0.749778568744659f, 0.433140486478806f, 0.750110685825348f, 0.432948768138886f, + 0.750442683696747f, 0.432756811380386f, 0.750774562358856f, 0.432564586400986f, + 0.751106262207031f, 0.432372123003006f, 0.751437783241272f, 0.432179391384125f, + 0.751769185066223f, 0.431986421346664f, 0.752100467681885f, 0.431793183088303f, + 0.752431571483612f, 0.431599706411362f, 0.752762496471405f, 0.431405961513519f, + 0.753093302249908f, 0.431211978197098f, 0.753423988819122f, 0.431017726659775f, + 0.753754496574402f, 0.430823236703873f, 0.754084885120392f, 0.430628478527069f, + 0.754415094852448f, 0.430433481931686f, 0.754745125770569f, 0.430238217115402f, + 0.755075037479401f, 0.430042684078217f, 0.755404829978943f, 0.429846942424774f, + 0.755734443664551f, 0.429650902748108f, 0.756063878536224f, 0.429454624652863f, + 0.756393194198608f, 0.429258108139038f, 0.756722390651703f, 0.429061323404312f, + 0.757051348686218f, 0.428864300251007f, 0.757380247116089f, 0.428667008876801f, + 0.757708966732025f, 0.428469479084015f, 0.758037507534027f, 0.428271710872650f, + 0.758365929126740f, 0.428073674440384f, 0.758694171905518f, 0.427875369787216f, + 0.759022235870361f, 0.427676826715469f, 0.759350180625916f, 0.427478045225143f, + 0.759678006172180f, 0.427278995513916f, 0.760005652904511f, 0.427079707384110f, + 0.760333120822906f, 0.426880151033401f, 0.760660469532013f, 0.426680356264114f, + 0.760987639427185f, 0.426480293273926f, 0.761314690113068f, 0.426279991865158f, + 0.761641561985016f, 0.426079452037811f, 0.761968255043030f, 0.425878643989563f, + 0.762294828891754f, 0.425677597522736f, 0.762621283531189f, 0.425476282835007f, + 0.762947499752045f, 0.425274729728699f, 0.763273596763611f, 0.425072938203812f, + 0.763599574565887f, 0.424870878458023f, 0.763925373554230f, 0.424668580293655f, + 0.764250993728638f, 0.424466013908386f, 0.764576494693756f, 0.424263238906860f, + 0.764901816844940f, 0.424060165882111f, 0.765226960182190f, 0.423856884241104f, + 0.765551984310150f, 0.423653304576874f, 0.765876889228821f, 0.423449516296387f, + 0.766201555728912f, 0.423245459794998f, 0.766526103019714f, 0.423041164875031f, + 0.766850471496582f, 0.422836631536484f, 0.767174720764160f, 0.422631829977036f, + 0.767498791217804f, 0.422426789999008f, 0.767822742462158f, 0.422221481800079f, + 0.768146514892578f, 0.422015935182571f, 0.768470108509064f, 0.421810150146484f, + 0.768793523311615f, 0.421604126691818f, 0.769116818904877f, 0.421397835016251f, + 0.769439935684204f, 0.421191304922104f, 0.769762933254242f, 0.420984506607056f, + 0.770085752010345f, 0.420777499675751f, 0.770408391952515f, 0.420570224523544f, + 0.770730912685394f, 0.420362681150436f, 0.771053194999695f, 0.420154929161072f, + 0.771375417709351f, 0.419946908950806f, 0.771697402000427f, 0.419738620519638f, + 0.772019267082214f, 0.419530123472214f, 0.772340953350067f, 0.419321358203888f, + 0.772662520408630f, 0.419112354516983f, 0.772983849048615f, 0.418903112411499f, + 0.773305058479309f, 0.418693602085114f, 0.773626148700714f, 0.418483853340149f, + 0.773947000503540f, 0.418273866176605f, 0.774267733097076f, 0.418063640594482f, + 0.774588346481323f, 0.417853146791458f, 0.774908721446991f, 0.417642414569855f, + 0.775228977203369f, 0.417431443929672f, 0.775549054145813f, 0.417220205068588f, + 0.775869011878967f, 0.417008757591248f, 0.776188731193542f, 0.416797041893005f, + 0.776508331298828f, 0.416585087776184f, 0.776827812194824f, 0.416372895240784f, + 0.777147054672241f, 0.416160434484482f, 0.777466177940369f, 0.415947735309601f, + 0.777785122394562f, 0.415734797716141f, 0.778103888034821f, 0.415521621704102f, + 0.778422534465790f, 0.415308207273483f, 0.778741002082825f, 0.415094524621964f, + 0.779059290885925f, 0.414880603551865f, 0.779377400875092f, 0.414666473865509f, + 0.779695332050323f, 0.414452046155930f, 0.780013144016266f, 0.414237409830093f, + 0.780330777168274f, 0.414022535085678f, 0.780648231506348f, 0.413807392120361f, + 0.780965566635132f, 0.413592010736465f, 0.781282722949982f, 0.413376390933990f, + 0.781599700450897f, 0.413160532712936f, 0.781916499137878f, 0.412944436073303f, + 0.782233119010925f, 0.412728071212769f, 0.782549619674683f, 0.412511497735977f, + 0.782865881919861f, 0.412294656038284f, 0.783182024955750f, 0.412077575922012f, + 0.783498048782349f, 0.411860257387161f, 0.783813834190369f, 0.411642700433731f, + 0.784129500389099f, 0.411424905061722f, 0.784444928169250f, 0.411206841468811f, + 0.784760236740112f, 0.410988569259644f, 0.785075426101685f, 0.410770028829575f, + 0.785390377044678f, 0.410551249980927f, 0.785705149173737f, 0.410332232713699f, + 0.786019802093506f, 0.410112977027893f, 0.786334276199341f, 0.409893482923508f, + 0.786648571491241f, 0.409673750400543f, 0.786962687969208f, 0.409453779459000f, + 0.787276685237885f, 0.409233570098877f, 0.787590444087982f, 0.409013092517853f, + 0.787904083728790f, 0.408792406320572f, 0.788217544555664f, 0.408571451902390f, + 0.788530826568604f, 0.408350288867950f, 0.788843929767609f, 0.408128857612610f, + 0.789156913757324f, 0.407907217741013f, 0.789469659328461f, 0.407685309648514f, + 0.789782285690308f, 0.407463163137436f, 0.790094733238220f, 0.407240778207779f, + 0.790407001972198f, 0.407018154859543f, 0.790719091892242f, 0.406795293092728f, + 0.791031002998352f, 0.406572192907333f, 0.791342735290527f, 0.406348884105682f, + 0.791654348373413f, 0.406125307083130f, 0.791965723037720f, 0.405901491641998f, + 0.792276978492737f, 0.405677437782288f, 0.792588055133820f, 0.405453115701675f, + 0.792898952960968f, 0.405228585004807f, 0.793209671974182f, 0.405003815889359f, + 0.793520212173462f, 0.404778808355331f, 0.793830573558807f, 0.404553562402725f, + 0.794140756130219f, 0.404328078031540f, 0.794450819492340f, 0.404102355241776f, + 0.794760644435883f, 0.403876423835754f, 0.795070350170136f, 0.403650224208832f, + 0.795379877090454f, 0.403423786163330f, 0.795689165592194f, 0.403197109699249f, + 0.795998334884644f, 0.402970194816589f, 0.796307325363159f, 0.402743041515350f, + 0.796616137027740f, 0.402515679597855f, 0.796924769878387f, 0.402288049459457f, + 0.797233223915100f, 0.402060180902481f, 0.797541558742523f, 0.401832103729248f, + 0.797849655151367f, 0.401603758335114f, 0.798157572746277f, 0.401375204324722f, + 0.798465371131897f, 0.401146411895752f, 0.798772931098938f, 0.400917351245880f, + 0.799080371856689f, 0.400688081979752f, 0.799387574195862f, 0.400458574295044f, + 0.799694657325745f, 0.400228828191757f, 0.800001561641693f, 0.399998843669891f, + 0.800308227539063f, 0.399768620729446f, 0.800614774227142f, 0.399538189172745f, + 0.800921142101288f, 0.399307489395142f, 0.801227271556854f, 0.399076581001282f, + 0.801533281803131f, 0.398845434188843f, 0.801839113235474f, 0.398614019155502f, + 0.802144765853882f, 0.398382395505905f, 0.802450239658356f, 0.398150533437729f, + 0.802755534648895f, 0.397918462753296f, 0.803060650825500f, 0.397686123847961f, + 0.803365588188171f, 0.397453576326370f, 0.803670346736908f, 0.397220760583878f, + 0.803974866867065f, 0.396987736225128f, 0.804279267787933f, 0.396754473447800f, + 0.804583489894867f, 0.396520972251892f, 0.804887533187866f, 0.396287262439728f, + 0.805191397666931f, 0.396053284406662f, 0.805495083332062f, 0.395819097757339f, + 0.805798590183258f, 0.395584672689438f, 0.806101918220520f, 0.395350009202957f, + 0.806405067443848f, 0.395115107297897f, 0.806707978248596f, 0.394879996776581f, + 0.807010769844055f, 0.394644618034363f, 0.807313382625580f, 0.394409030675888f, + 0.807615816593170f, 0.394173204898834f, 0.807918012142181f, 0.393937170505524f, + 0.808220088481903f, 0.393700867891312f, 0.808521986007690f, 0.393464356660843f, + 0.808823645114899f, 0.393227607011795f, 0.809125185012817f, 0.392990618944168f, + 0.809426486492157f, 0.392753422260284f, 0.809727668762207f, 0.392515957355499f, + 0.810028612613678f, 0.392278283834457f, 0.810329377651215f, 0.392040401697159f, + 0.810629963874817f, 0.391802251338959f, 0.810930430889130f, 0.391563892364502f, + 0.811230659484863f, 0.391325294971466f, 0.811530709266663f, 0.391086459159851f, + 0.811830580234528f, 0.390847414731979f, 0.812130272388458f, 0.390608131885529f, + 0.812429726123810f, 0.390368610620499f, 0.812729060649872f, 0.390128880739212f, + 0.813028216362000f, 0.389888882637024f, 0.813327133655548f, 0.389648675918579f, + 0.813625931739807f, 0.389408260583878f, 0.813924491405487f, 0.389167606830597f, + 0.814222872257233f, 0.388926714658737f, 0.814521074295044f, 0.388685584068298f, + 0.814819097518921f, 0.388444244861603f, 0.815116941928864f, 0.388202667236328f, + 0.815414607524872f, 0.387960851192474f, 0.815712094306946f, 0.387718826532364f, + 0.816009342670441f, 0.387476563453674f, 0.816306471824646f, 0.387234061956406f, + 0.816603362560272f, 0.386991351842880f, 0.816900074481964f, 0.386748403310776f, + 0.817196667194366f, 0.386505216360092f, 0.817493021488190f, 0.386261820793152f, + 0.817789137363434f, 0.386018186807632f, 0.818085134029388f, 0.385774344205856f, + 0.818380951881409f, 0.385530263185501f, 0.818676531314850f, 0.385285943746567f, + 0.818971931934357f, 0.385041415691376f, 0.819267153739929f, 0.384796649217606f, + 0.819562196731567f, 0.384551674127579f, 0.819857060909271f, 0.384306460618973f, + 0.820151746273041f, 0.384061008691788f, 0.820446193218231f, 0.383815348148346f, + 0.820740520954132f, 0.383569449186325f, 0.821034610271454f, 0.383323341608047f, + 0.821328520774841f, 0.383076995611191f, 0.821622252464294f, 0.382830440998077f, + 0.821915745735168f, 0.382583618164063f, 0.822209119796753f, 0.382336616516113f, + 0.822502255439758f, 0.382089376449585f, 0.822795212268829f, 0.381841897964478f, + 0.823087990283966f, 0.381594210863113f, 0.823380589485168f, 0.381346285343170f, + 0.823673009872437f, 0.381098151206970f, 0.823965191841125f, 0.380849778652191f, + 0.824257194995880f, 0.380601197481155f, 0.824549019336700f, 0.380352377891541f, + 0.824840664863586f, 0.380103349685669f, 0.825132071971893f, 0.379854083061218f, + 0.825423359870911f, 0.379604607820511f, 0.825714409351349f, 0.379354894161224f, + 0.826005280017853f, 0.379104942083359f, 0.826295912265778f, 0.378854811191559f, + 0.826586425304413f, 0.378604412078857f, 0.826876699924469f, 0.378353834152222f, + 0.827166795730591f, 0.378102988004684f, 0.827456712722778f, 0.377851963043213f, + 0.827746450901031f, 0.377600699663162f, 0.828035950660706f, 0.377349197864532f, + 0.828325271606445f, 0.377097487449646f, 0.828614413738251f, 0.376845568418503f, + 0.828903317451477f, 0.376593410968781f, 0.829192101955414f, 0.376341015100479f, + 0.829480648040771f, 0.376088410615921f, 0.829769015312195f, 0.375835597515106f, + 0.830057144165039f, 0.375582575798035f, 0.830345153808594f, 0.375329315662384f, + 0.830632925033569f, 0.375075817108154f, 0.830920517444611f, 0.374822109937668f, + 0.831207871437073f, 0.374568194150925f, 0.831495106220245f, 0.374314039945602f, + 0.831782102584839f, 0.374059677124023f, 0.832068860530853f, 0.373805105686188f, + 0.832355499267578f, 0.373550295829773f, 0.832641899585724f, 0.373295277357101f, + 0.832928121089935f, 0.373040050268173f, 0.833214163780212f, 0.372784584760666f, + 0.833499968051910f, 0.372528880834579f, 0.833785593509674f, 0.372272998094559f, + 0.834071040153503f, 0.372016876935959f, 0.834356248378754f, 0.371760547161102f, + 0.834641277790070f, 0.371503978967667f, 0.834926128387451f, 0.371247202157974f, + 0.835210800170898f, 0.370990216732025f, 0.835495233535767f, 0.370732992887497f, + 0.835779488086700f, 0.370475560426712f, 0.836063504219055f, 0.370217919349670f, + 0.836347401142120f, 0.369960039854050f, 0.836631059646606f, 0.369701951742172f, + 0.836914479732513f, 0.369443655014038f, 0.837197780609131f, 0.369185149669647f, + 0.837480843067169f, 0.368926405906677f, 0.837763667106628f, 0.368667453527451f, + 0.838046371936798f, 0.368408292531967f, 0.838328838348389f, 0.368148893117905f, + 0.838611066341400f, 0.367889285087585f, 0.838893175125122f, 0.367629468441010f, + 0.839175045490265f, 0.367369443178177f, 0.839456677436829f, 0.367109179496765f, + 0.839738130569458f, 0.366848707199097f, 0.840019404888153f, 0.366588026285172f, + 0.840300500392914f, 0.366327136754990f, 0.840581357479095f, 0.366066008806229f, + 0.840862035751343f, 0.365804702043533f, 0.841142535209656f, 0.365543156862259f, + 0.841422796249390f, 0.365281373262405f, 0.841702818870544f, 0.365019410848618f, + 0.841982722282410f, 0.364757210016251f, 0.842262387275696f, 0.364494800567627f, + 0.842541813850403f, 0.364232182502747f, 0.842821121215820f, 0.363969355821610f, + 0.843100130558014f, 0.363706320524216f, 0.843379020690918f, 0.363443046808243f, + 0.843657672405243f, 0.363179564476013f, 0.843936145305634f, 0.362915903329849f, + 0.844214379787445f, 0.362651973962784f, 0.844492435455322f, 0.362387865781784f, + 0.844770252704620f, 0.362123548984528f, 0.845047891139984f, 0.361858993768692f, + 0.845325350761414f, 0.361594229936600f, 0.845602571964264f, 0.361329287290573f, + 0.845879614353180f, 0.361064106225967f, 0.846156477928162f, 0.360798716545105f, + 0.846433103084564f, 0.360533088445663f, 0.846709489822388f, 0.360267281532288f, + 0.846985757350922f, 0.360001266002655f, 0.847261726856232f, 0.359735012054443f, + 0.847537577152252f, 0.359468549489975f, 0.847813189029694f, 0.359201908111572f, + 0.848088562488556f, 0.358935028314590f, 0.848363757133484f, 0.358667939901352f, + 0.848638772964478f, 0.358400642871857f, 0.848913550376892f, 0.358133137226105f, + 0.849188148975372f, 0.357865422964096f, 0.849462509155273f, 0.357597470283508f, + 0.849736690521240f, 0.357329338788986f, 0.850010633468628f, 0.357060998678207f, + 0.850284397602081f, 0.356792420148849f, 0.850557923316956f, 0.356523662805557f, + 0.850831270217896f, 0.356254696846008f, 0.851104438304901f, 0.355985492467880f, + 0.851377367973328f, 0.355716109275818f, 0.851650118827820f, 0.355446487665176f, + 0.851922631263733f, 0.355176687240601f, 0.852194905281067f, 0.354906648397446f, + 0.852467060089111f, 0.354636400938034f, 0.852738916873932f, 0.354365974664688f, + 0.853010654449463f, 0.354095309972763f, 0.853282094001770f, 0.353824466466904f, + 0.853553414344788f, 0.353553384542465f, 0.853824436664581f, 0.353282123804092f, + 0.854095339775085f, 0.353010624647141f, 0.854365944862366f, 0.352738946676254f, + 0.854636430740356f, 0.352467030286789f, 0.854906618595123f, 0.352194935083389f, + 0.855176687240601f, 0.351922631263733f, 0.855446517467499f, 0.351650089025497f, + 0.855716109275818f, 0.351377367973328f, 0.855985522270203f, 0.351104438304901f, + 0.856254696846008f, 0.350831300020218f, 0.856523692607880f, 0.350557953119278f, + 0.856792449951172f, 0.350284397602081f, 0.857060968875885f, 0.350010633468628f, + 0.857329368591309f, 0.349736660718918f, 0.857597470283508f, 0.349462509155273f, + 0.857865393161774f, 0.349188119173050f, 0.858133137226105f, 0.348913550376892f, + 0.858400642871857f, 0.348638743162155f, 0.858667910099030f, 0.348363757133484f, + 0.858934998512268f, 0.348088562488556f, 0.859201908111572f, 0.347813159227371f, + 0.859468579292297f, 0.347537547349930f, 0.859735012054443f, 0.347261756658554f, + 0.860001266002655f, 0.346985727548599f, 0.860267281532288f, 0.346709519624710f, + 0.860533118247986f, 0.346433073282242f, 0.860798716545105f, 0.346156448125839f, + 0.861064076423645f, 0.345879614353180f, 0.861329257488251f, 0.345602601766586f, + 0.861594259738922f, 0.345325350761414f, 0.861859023571014f, 0.345047920942307f, + 0.862123548984528f, 0.344770282506943f, 0.862387895584106f, 0.344492435455322f, + 0.862652003765106f, 0.344214379787445f, 0.862915873527527f, 0.343936115503311f, + 0.863179564476013f, 0.343657672405243f, 0.863443076610565f, 0.343379020690918f, + 0.863706290721893f, 0.343100160360336f, 0.863969385623932f, 0.342821091413498f, + 0.864232182502747f, 0.342541843652725f, 0.864494800567627f, 0.342262357473373f, + 0.864757239818573f, 0.341982692480087f, 0.865019381046295f, 0.341702848672867f, + 0.865281403064728f, 0.341422766447067f, 0.865543127059937f, 0.341142505407333f, + 0.865804672241211f, 0.340862035751343f, 0.866066038608551f, 0.340581357479095f, + 0.866327106952667f, 0.340300500392914f, 0.866588056087494f, 0.340019434690475f, + 0.866848707199097f, 0.339738160371780f, 0.867109179496765f, 0.339456677436829f, + 0.867369413375854f, 0.339175015687943f, 0.867629468441010f, 0.338893145322800f, + 0.867889285087585f, 0.338611096143723f, 0.868148922920227f, 0.338328808546066f, + 0.868408262729645f, 0.338046342134476f, 0.868667483329773f, 0.337763696908951f, + 0.868926405906677f, 0.337480813264847f, 0.869185149669647f, 0.337197750806808f, + 0.869443655014038f, 0.336914509534836f, 0.869701981544495f, 0.336631029844284f, + 0.869960069656372f, 0.336347371339798f, 0.870217919349670f, 0.336063534021378f, + 0.870475590229034f, 0.335779488086700f, 0.870733022689819f, 0.335495233535767f, + 0.870990216732025f, 0.335210770368576f, 0.871247172355652f, 0.334926128387451f, + 0.871503949165344f, 0.334641307592392f, 0.871760547161102f, 0.334356248378754f, + 0.872016847133636f, 0.334071010351181f, 0.872272968292236f, 0.333785593509674f, + 0.872528910636902f, 0.333499968051910f, 0.872784554958344f, 0.333214133977890f, + 0.873040020465851f, 0.332928121089935f, 0.873295307159424f, 0.332641899585724f, + 0.873550295829773f, 0.332355499267578f, 0.873805105686188f, 0.332068890333176f, + 0.874059677124023f, 0.331782072782516f, 0.874314069747925f, 0.331495076417923f, + 0.874568223953247f, 0.331207901239395f, 0.874822139739990f, 0.330920487642288f, + 0.875075817108154f, 0.330632925033569f, 0.875329315662384f, 0.330345153808594f, + 0.875582575798035f, 0.330057173967361f, 0.875835597515106f, 0.329769015312195f, + 0.876088440418243f, 0.329480648040771f, 0.876341044902802f, 0.329192101955414f, + 0.876593410968781f, 0.328903347253799f, 0.876845538616180f, 0.328614413738251f, + 0.877097487449646f, 0.328325271606445f, 0.877349197864532f, 0.328035950660706f, + 0.877600669860840f, 0.327746421098709f, 0.877851963043213f, 0.327456712722778f, + 0.878103017807007f, 0.327166795730591f, 0.878353834152222f, 0.326876699924469f, + 0.878604412078857f, 0.326586425304413f, 0.878854811191559f, 0.326295942068100f, + 0.879104971885681f, 0.326005280017853f, 0.879354894161224f, 0.325714409351349f, + 0.879604578018188f, 0.325423330068588f, 0.879854083061218f, 0.325132101774216f, + 0.880103349685669f, 0.324840664863586f, 0.880352377891541f, 0.324549019336700f, + 0.880601167678833f, 0.324257194995880f, 0.880849778652191f, 0.323965191841125f, + 0.881098151206970f, 0.323672980070114f, 0.881346285343170f, 0.323380589485168f, + 0.881594181060791f, 0.323088020086288f, 0.881841897964478f, 0.322795242071152f, + 0.882089376449585f, 0.322502255439758f, 0.882336616516113f, 0.322209119796753f, + 0.882583618164063f, 0.321915775537491f, 0.882830440998077f, 0.321622252464294f, + 0.883076965808868f, 0.321328520774841f, 0.883323311805725f, 0.321034610271454f, + 0.883569478988647f, 0.320740520954132f, 0.883815348148346f, 0.320446223020554f, + 0.884061038494110f, 0.320151746273041f, 0.884306430816650f, 0.319857090711594f, + 0.884551644325256f, 0.319562226533890f, 0.884796679019928f, 0.319267183542252f, + 0.885041415691376f, 0.318971961736679f, 0.885285973548889f, 0.318676531314850f, + 0.885530233383179f, 0.318380922079086f, 0.885774314403534f, 0.318085134029388f, + 0.886018216609955f, 0.317789167165756f, 0.886261820793152f, 0.317492991685867f, + 0.886505246162415f, 0.317196637392044f, 0.886748373508453f, 0.316900104284287f, + 0.886991322040558f, 0.316603392362595f, 0.887234091758728f, 0.316306471824646f, + 0.887476563453674f, 0.316009372472763f, 0.887718796730042f, 0.315712094306946f, + 0.887960851192474f, 0.315414607524872f, 0.888202667236328f, 0.315116971731186f, + 0.888444244861603f, 0.314819127321243f, 0.888685584068298f, 0.314521104097366f, + 0.888926684856415f, 0.314222872257233f, 0.889167606830597f, 0.313924491405487f, + 0.889408230781555f, 0.313625901937485f, 0.889648675918579f, 0.313327133655548f, + 0.889888882637024f, 0.313028186559677f, 0.890128850936890f, 0.312729060649872f, + 0.890368640422821f, 0.312429755926132f, 0.890608131885529f, 0.312130242586136f, + 0.890847444534302f, 0.311830550432205f, 0.891086459159851f, 0.311530679464340f, + 0.891325294971466f, 0.311230629682541f, 0.891563892364502f, 0.310930401086807f, + 0.891802251338959f, 0.310629993677139f, 0.892040371894836f, 0.310329377651215f, + 0.892278313636780f, 0.310028612613678f, 0.892515957355499f, 0.309727638959885f, + 0.892753422260284f, 0.309426486492157f, 0.892990648746490f, 0.309125155210495f, + 0.893227577209473f, 0.308823645114899f, 0.893464326858521f, 0.308521956205368f, + 0.893700897693634f, 0.308220088481903f, 0.893937170505524f, 0.307918041944504f, + 0.894173204898834f, 0.307615786790848f, 0.894409060478210f, 0.307313382625580f, + 0.894644618034363f, 0.307010769844055f, 0.894879996776581f, 0.306708008050919f, + 0.895115137100220f, 0.306405037641525f, 0.895349979400635f, 0.306101888418198f, + 0.895584642887115f, 0.305798590183258f, 0.895819067955017f, 0.305495083332062f, + 0.896053314208984f, 0.305191397666931f, 0.896287262439728f, 0.304887533187866f, + 0.896520972251892f, 0.304583519697189f, 0.896754503250122f, 0.304279297590256f, + 0.896987736225128f, 0.303974896669388f, 0.897220790386200f, 0.303670316934586f, + 0.897453546524048f, 0.303365558385849f, 0.897686123847961f, 0.303060621023178f, + 0.897918462753296f, 0.302755534648895f, 0.898150563240051f, 0.302450239658356f, + 0.898382425308228f, 0.302144765853882f, 0.898614048957825f, 0.301839113235474f, + 0.898845434188843f, 0.301533311605453f, 0.899076581001282f, 0.301227301359177f, + 0.899307489395142f, 0.300921112298965f, 0.899538159370422f, 0.300614774227142f, + 0.899768650531769f, 0.300308227539063f, 0.899998843669891f, 0.300001531839371f, + 0.900228857994080f, 0.299694657325745f, 0.900458574295044f, 0.299387603998184f, + 0.900688111782074f, 0.299080342054367f, 0.900917351245880f, 0.298772931098938f, + 0.901146411895752f, 0.298465341329575f, 0.901375174522400f, 0.298157602548599f, + 0.901603758335114f, 0.297849655151367f, 0.901832103729248f, 0.297541528940201f, + 0.902060210704803f, 0.297233253717422f, 0.902288019657135f, 0.296924799680710f, + 0.902515649795532f, 0.296616137027740f, 0.902743041515350f, 0.296307325363159f, + 0.902970194816589f, 0.295998334884644f, 0.903197109699249f, 0.295689195394516f, + 0.903423786163330f, 0.295379847288132f, 0.903650224208832f, 0.295070350170136f, + 0.903876423835754f, 0.294760644435883f, 0.904102385044098f, 0.294450789690018f, + 0.904328107833862f, 0.294140785932541f, 0.904553592205048f, 0.293830573558807f, + 0.904778838157654f, 0.293520182371140f, 0.905003845691681f, 0.293209642171860f, + 0.905228614807129f, 0.292898923158646f, 0.905453145503998f, 0.292588025331497f, + 0.905677437782288f, 0.292276978492737f, 0.905901491641998f, 0.291965723037720f, + 0.906125307083130f, 0.291654318571091f, 0.906348884105682f, 0.291342735290527f, + 0.906572222709656f, 0.291031002998352f, 0.906795322895050f, 0.290719062089920f, + 0.907018184661865f, 0.290406972169876f, 0.907240808010101f, 0.290094703435898f, + 0.907463192939758f, 0.289782285690308f, 0.907685279846191f, 0.289469659328461f, + 0.907907187938690f, 0.289156883955002f, 0.908128857612610f, 0.288843959569931f, + 0.908350288867950f, 0.288530826568604f, 0.908571481704712f, 0.288217544555664f, + 0.908792436122894f, 0.287904083728790f, 0.909013092517853f, 0.287590473890305f, + 0.909233570098877f, 0.287276685237885f, 0.909453809261322f, 0.286962717771530f, + 0.909673750400543f, 0.286648571491241f, 0.909893512725830f, 0.286334276199341f, + 0.910112977027893f, 0.286019802093506f, 0.910332262516022f, 0.285705178976059f, + 0.910551249980927f, 0.285390377044678f, 0.910769999027252f, 0.285075396299362f, + 0.910988569259644f, 0.284760266542435f, 0.911206841468811f, 0.284444957971573f, + 0.911424875259399f, 0.284129470586777f, 0.911642670631409f, 0.283813834190369f, + 0.911860227584839f, 0.283498018980026f, 0.912077546119690f, 0.283182054758072f, + 0.912294626235962f, 0.282865911722183f, 0.912511467933655f, 0.282549589872360f, + 0.912728071212769f, 0.282233119010925f, 0.912944436073303f, 0.281916469335556f, + 0.913160502910614f, 0.281599670648575f, 0.913376390933990f, 0.281282693147659f, + 0.913592040538788f, 0.280965566635132f, 0.913807392120361f, 0.280648261308670f, + 0.914022505283356f, 0.280330777168274f, 0.914237439632416f, 0.280013144016266f, + 0.914452075958252f, 0.279695361852646f, 0.914666473865509f, 0.279377400875092f, + 0.914880633354187f, 0.279059261083603f, 0.915094554424286f, 0.278740972280502f, + 0.915308177471161f, 0.278422504663467f, 0.915521621704102f, 0.278103888034821f, + 0.915734827518463f, 0.277785122394562f, 0.915947735309601f, 0.277466177940369f, + 0.916160404682159f, 0.277147054672241f, 0.916372895240784f, 0.276827782392502f, + 0.916585087776184f, 0.276508361101151f, 0.916797041893005f, 0.276188760995865f, + 0.917008757591248f, 0.275868982076645f, 0.917220234870911f, 0.275549083948135f, + 0.917431414127350f, 0.275228977203369f, 0.917642414569855f, 0.274908751249313f, + 0.917853116989136f, 0.274588316679001f, 0.918063640594482f, 0.274267762899399f, + 0.918273866176605f, 0.273947030305862f, 0.918483853340149f, 0.273626148700714f, + 0.918693602085114f, 0.273305088281631f, 0.918903112411499f, 0.272983878850937f, + 0.919112324714661f, 0.272662490606308f, 0.919321358203888f, 0.272340953350067f, + 0.919530093669891f, 0.272019267082214f, 0.919738650321960f, 0.271697402000427f, + 0.919946908950806f, 0.271375387907028f, 0.920154929161072f, 0.271053224802017f, + 0.920362710952759f, 0.270730882883072f, 0.920570194721222f, 0.270408391952515f, + 0.920777499675751f, 0.270085722208023f, 0.920984506607056f, 0.269762933254242f, + 0.921191275119781f, 0.269439965486526f, 0.921397805213928f, 0.269116818904877f, + 0.921604096889496f, 0.268793523311615f, 0.921810150146484f, 0.268470078706741f, + 0.922015964984894f, 0.268146485090256f, 0.922221481800079f, 0.267822742462158f, + 0.922426760196686f, 0.267498821020126f, 0.922631800174713f, 0.267174720764160f, + 0.922836601734161f, 0.266850501298904f, 0.923041164875031f, 0.266526103019714f, + 0.923245489597321f, 0.266201555728912f, 0.923449516296387f, 0.265876859426498f, + 0.923653304576874f, 0.265552014112473f, 0.923856854438782f, 0.265226989984512f, + 0.924060165882111f, 0.264901816844940f, 0.924263238906860f, 0.264576494693756f, + 0.924466013908386f, 0.264250993728638f, 0.924668610095978f, 0.263925373554230f, + 0.924870908260345f, 0.263599574565887f, 0.925072908401489f, 0.263273626565933f, + 0.925274729728699f, 0.262947499752045f, 0.925476312637329f, 0.262621253728867f, + 0.925677597522736f, 0.262294828891754f, 0.925878643989563f, 0.261968284845352f, + 0.926079452037811f, 0.261641561985016f, 0.926280021667480f, 0.261314690113068f, + 0.926480293273926f, 0.260987639427185f, 0.926680326461792f, 0.260660469532013f, + 0.926880121231079f, 0.260333120822906f, 0.927079677581787f, 0.260005623102188f, + 0.927278995513916f, 0.259678006172180f, 0.927478015422821f, 0.259350210428238f, + 0.927676856517792f, 0.259022265672684f, 0.927875399589539f, 0.258694142103195f, + 0.928073644638062f, 0.258365899324417f, 0.928271710872650f, 0.258037507534027f, + 0.928469479084015f, 0.257708936929703f, 0.928667008876801f, 0.257380217313766f, + 0.928864300251007f, 0.257051378488541f, 0.929061353206635f, 0.256722360849380f, + 0.929258108139038f, 0.256393194198608f, 0.929454624652863f, 0.256063878536224f, + 0.929650902748108f, 0.255734413862228f, 0.929846942424774f, 0.255404800176620f, + 0.930042684078217f, 0.255075037479401f, 0.930238187313080f, 0.254745125770569f, + 0.930433452129364f, 0.254415065050125f, 0.930628478527069f, 0.254084855318069f, + 0.930823206901550f, 0.253754496574402f, 0.931017756462097f, 0.253423988819122f, + 0.931211948394775f, 0.253093332052231f, 0.931405961513519f, 0.252762526273727f, + 0.931599736213684f, 0.252431541681290f, 0.931793212890625f, 0.252100437879562f, + 0.931986451148987f, 0.251769185066223f, 0.932179391384125f, 0.251437783241272f, + 0.932372152805328f, 0.251106232404709f, 0.932564616203308f, 0.250774532556534f, + 0.932756841182709f, 0.250442683696747f, 0.932948768138886f, 0.250110685825348f, + 0.933140456676483f, 0.249778553843498f, 0.933331906795502f, 0.249446272850037f, + 0.933523118495941f, 0.249113827943802f, 0.933714091777802f, 0.248781248927116f, + 0.933904767036438f, 0.248448520898819f, 0.934095203876495f, 0.248115643858910f, + 0.934285342693329f, 0.247782632708550f, 0.934475243091583f, 0.247449472546577f, + 0.934664964675903f, 0.247116148471832f, 0.934854328632355f, 0.246782705187798f, + 0.935043513774872f, 0.246449097990990f, 0.935232400894165f, 0.246115356683731f, + 0.935421049594879f, 0.245781451463699f, 0.935609400272369f, 0.245447427034378f, + 0.935797572135925f, 0.245113238692284f, 0.935985386371613f, 0.244778916239738f, + 0.936173021793365f, 0.244444444775581f, 0.936360359191895f, 0.244109839200974f, + 0.936547517776489f, 0.243775084614754f, 0.936734318733215f, 0.243440181016922f, + 0.936920940876007f, 0.243105143308640f, 0.937107264995575f, 0.242769956588745f, + 0.937293350696564f, 0.242434620857239f, 0.937479138374329f, 0.242099151015282f, + 0.937664687633514f, 0.241763532161713f, 0.937849998474121f, 0.241427779197693f, + 0.938035070896149f, 0.241091892123222f, 0.938219845294952f, 0.240755841135979f, + 0.938404381275177f, 0.240419670939446f, 0.938588619232178f, 0.240083336830139f, + 0.938772618770599f, 0.239746883511543f, 0.938956379890442f, 0.239410281181335f, + 0.939139902591705f, 0.239073529839516f, 0.939323127269745f, 0.238736644387245f, + 0.939506113529205f, 0.238399609923363f, 0.939688861370087f, 0.238062441349030f, + 0.939871311187744f, 0.237725138664246f, 0.940053522586823f, 0.237387686967850f, + 0.940235435962677f, 0.237050101161003f, 0.940417110919952f, 0.236712381243706f, + 0.940598547458649f, 0.236374512314796f, 0.940779745578766f, 0.236036509275436f, + 0.940960645675659f, 0.235698372125626f, 0.941141307353973f, 0.235360085964203f, + 0.941321671009064f, 0.235021665692329f, 0.941501796245575f, 0.234683111310005f, + 0.941681683063507f, 0.234344407916069f, 0.941861271858215f, 0.234005570411682f, + 0.942040622234344f, 0.233666598796844f, 0.942219734191895f, 0.233327493071556f, + 0.942398548126221f, 0.232988253235817f, 0.942577123641968f, 0.232648864388466f, + 0.942755401134491f, 0.232309341430664f, 0.942933499813080f, 0.231969684362412f, + 0.943111240863800f, 0.231629893183708f, 0.943288803100586f, 0.231289967894554f, + 0.943466067314148f, 0.230949893593788f, 0.943643093109131f, 0.230609700083733f, + 0.943819820880890f, 0.230269357562065f, 0.943996310234070f, 0.229928880929947f, + 0.944172501564026f, 0.229588270187378f, 0.944348454475403f, 0.229247525334358f, + 0.944524168968201f, 0.228906646370888f, 0.944699645042419f, 0.228565633296967f, + 0.944874763488770f, 0.228224486112595f, 0.945049703121185f, 0.227883204817772f, + 0.945224344730377f, 0.227541789412498f, 0.945398747920990f, 0.227200239896774f, + 0.945572853088379f, 0.226858556270599f, 0.945746779441834f, 0.226516738533974f, + 0.945920348167419f, 0.226174786686897f, 0.946093678474426f, 0.225832715630531f, + 0.946266770362854f, 0.225490495562553f, 0.946439623832703f, 0.225148141384125f, + 0.946612179279327f, 0.224805667996407f, 0.946784436702728f, 0.224463045597076f, + 0.946956455707550f, 0.224120303988457f, 0.947128236293793f, 0.223777428269386f, + 0.947299718856812f, 0.223434418439865f, 0.947470963001251f, 0.223091274499893f, + 0.947641968727112f, 0.222748011350632f, 0.947812676429749f, 0.222404599189758f, + 0.947983145713806f, 0.222061067819595f, 0.948153316974640f, 0.221717402338982f, + 0.948323249816895f, 0.221373617649078f, 0.948492884635925f, 0.221029683947563f, + 0.948662281036377f, 0.220685631036758f, 0.948831439018250f, 0.220341444015503f, + 0.949000298976898f, 0.219997137784958f, 0.949168920516968f, 0.219652697443962f, + 0.949337244033813f, 0.219308122992516f, 0.949505329132080f, 0.218963414430618f, + 0.949673116207123f, 0.218618586659431f, 0.949840664863586f, 0.218273624777794f, + 0.950007975101471f, 0.217928543686867f, 0.950174987316132f, 0.217583328485489f, + 0.950341701507568f, 0.217237979173660f, 0.950508177280426f, 0.216892510652542f, + 0.950674414634705f, 0.216546908020973f, 0.950840353965759f, 0.216201186180115f, + 0.951006054878235f, 0.215855330228806f, 0.951171517372131f, 0.215509355068207f, + 0.951336681842804f, 0.215163245797157f, 0.951501548290253f, 0.214817002415657f, + 0.951666176319122f, 0.214470639824867f, 0.951830565929413f, 0.214124158024788f, + 0.951994657516479f, 0.213777542114258f, 0.952158451080322f, 0.213430806994438f, + 0.952322065830231f, 0.213083937764168f, 0.952485322952271f, 0.212736949324608f, + 0.952648401260376f, 0.212389841675758f, 0.952811121940613f, 0.212042599916458f, + 0.952973663806915f, 0.211695238947868f, 0.953135907649994f, 0.211347743868828f, + 0.953297853469849f, 0.211000129580498f, 0.953459560871124f, 0.210652396082878f, + 0.953620970249176f, 0.210304543375969f, 0.953782141208649f, 0.209956556558609f, + 0.953943073749542f, 0.209608450531960f, 0.954103708267212f, 0.209260210394859f, + 0.954264044761658f, 0.208911851048470f, 0.954424142837524f, 0.208563387393951f, + 0.954584002494812f, 0.208214774727821f, 0.954743564128876f, 0.207866057753563f, + 0.954902827739716f, 0.207517206668854f, 0.955061912536621f, 0.207168251276016f, + 0.955220639705658f, 0.206819161772728f, 0.955379128456116f, 0.206469938158989f, + 0.955537378787994f, 0.206120610237122f, 0.955695331096649f, 0.205771163105965f, + 0.955853044986725f, 0.205421581864357f, 0.956010460853577f, 0.205071896314621f, + 0.956167578697205f, 0.204722076654434f, 0.956324458122253f, 0.204372137784958f, + 0.956481099128723f, 0.204022079706192f, 0.956637442111969f, 0.203671902418137f, + 0.956793546676636f, 0.203321605920792f, 0.956949353218079f, 0.202971190214157f, + 0.957104861736298f, 0.202620655298233f, 0.957260131835938f, 0.202270001173019f, + 0.957415163516998f, 0.201919227838516f, 0.957569897174835f, 0.201568335294724f, + 0.957724332809448f, 0.201217323541641f, 0.957878530025482f, 0.200866192579269f, + 0.958032488822937f, 0.200514942407608f, 0.958186149597168f, 0.200163587927818f, + 0.958339512348175f, 0.199812099337578f, 0.958492636680603f, 0.199460506439209f, + 0.958645522594452f, 0.199108779430389f, 0.958798050880432f, 0.198756948113441f, + 0.958950400352478f, 0.198404997587204f, 0.959102451801300f, 0.198052927851677f, + 0.959254205226898f, 0.197700738906860f, 0.959405720233917f, 0.197348430752754f, + 0.959556937217712f, 0.196996018290520f, 0.959707856178284f, 0.196643486618996f, + 0.959858596324921f, 0.196290835738182f, 0.960008978843689f, 0.195938065648079f, + 0.960159122943878f, 0.195585191249847f, 0.960309028625488f, 0.195232197642326f, + 0.960458636283875f, 0.194879084825516f, 0.960607945919037f, 0.194525867700577f, + 0.960757017135620f, 0.194172516465187f, 0.960905790328979f, 0.193819075822830f, + 0.961054325103760f, 0.193465501070023f, 0.961202561855316f, 0.193111822009087f, + 0.961350560188293f, 0.192758023738861f, 0.961498260498047f, 0.192404121160507f, + 0.961645722389221f, 0.192050099372864f, 0.961792886257172f, 0.191695958375931f, + 0.961939752101898f, 0.191341713070869f, 0.962086379528046f, 0.190987363457680f, + 0.962232708930969f, 0.190632879734039f, 0.962378799915314f, 0.190278306603432f, + 0.962524592876434f, 0.189923599362373f, 0.962670147418976f, 0.189568802714348f, + 0.962815403938293f, 0.189213871955872f, 0.962960422039032f, 0.188858851790428f, + 0.963105142116547f, 0.188503712415695f, 0.963249564170837f, 0.188148453831673f, + 0.963393747806549f, 0.187793090939522f, 0.963537633419037f, 0.187437608838081f, + 0.963681280612946f, 0.187082037329674f, 0.963824629783630f, 0.186726331710815f, + 0.963967680931091f, 0.186370536684990f, 0.964110493659973f, 0.186014622449875f, + 0.964253067970276f, 0.185658603906631f, 0.964395284652710f, 0.185302466154099f, + 0.964537262916565f, 0.184946224093437f, 0.964679002761841f, 0.184589877724648f, + 0.964820444583893f, 0.184233412146568f, 0.964961588382721f, 0.183876842260361f, + 0.965102493762970f, 0.183520168066025f, 0.965243160724640f, 0.183163389563560f, + 0.965383470058441f, 0.182806491851807f, 0.965523540973663f, 0.182449504733086f, + 0.965663373470306f, 0.182092398405075f, 0.965802907943726f, 0.181735187768936f, + 0.965942144393921f, 0.181377857923508f, 0.966081082820892f, 0.181020438671112f, + 0.966219842433929f, 0.180662900209427f, 0.966358244419098f, 0.180305257439613f, + 0.966496407985687f, 0.179947525262833f, 0.966634273529053f, 0.179589673876762f, + 0.966771900653839f, 0.179231703281403f, 0.966909229755402f, 0.178873643279076f, + 0.967046260833740f, 0.178515478968620f, 0.967183053493500f, 0.178157210350037f, + 0.967319548130035f, 0.177798837423325f, 0.967455804347992f, 0.177440345287323f, + 0.967591762542725f, 0.177081763744354f, 0.967727422714233f, 0.176723077893257f, + 0.967862844467163f, 0.176364272832870f, 0.967997968196869f, 0.176005378365517f, + 0.968132853507996f, 0.175646379590034f, 0.968267440795898f, 0.175287276506424f, + 0.968401730060577f, 0.174928069114685f, 0.968535780906677f, 0.174568757414818f, + 0.968669533729553f, 0.174209341406822f, 0.968802988529205f, 0.173849821090698f, + 0.968936204910278f, 0.173490211367607f, 0.969069123268127f, 0.173130482435226f, + 0.969201743602753f, 0.172770664095879f, 0.969334125518799f, 0.172410741448402f, + 0.969466269016266f, 0.172050714492798f, 0.969598054885864f, 0.171690583229065f, + 0.969729602336884f, 0.171330362558365f, 0.969860911369324f, 0.170970037579536f, + 0.969991862773895f, 0.170609608292580f, 0.970122575759888f, 0.170249074697495f, + 0.970253050327301f, 0.169888436794281f, 0.970383226871490f, 0.169527709484100f, + 0.970513105392456f, 0.169166877865791f, 0.970642685890198f, 0.168805956840515f, + 0.970772027969360f, 0.168444931507111f, 0.970901072025299f, 0.168083801865578f, + 0.971029877662659f, 0.167722567915916f, 0.971158385276794f, 0.167361244559288f, + 0.971286594867706f, 0.166999831795692f, 0.971414566040039f, 0.166638299822807f, + 0.971542239189148f, 0.166276678442955f, 0.971669614315033f, 0.165914967656136f, + 0.971796751022339f, 0.165553152561188f, 0.971923589706421f, 0.165191248059273f, + 0.972050130367279f, 0.164829224348068f, 0.972176432609558f, 0.164467126131058f, + 0.972302436828613f, 0.164104923605919f, 0.972428143024445f, 0.163742616772652f, + 0.972553610801697f, 0.163380220532417f, 0.972678780555725f, 0.163017734885216f, + 0.972803652286530f, 0.162655144929886f, 0.972928285598755f, 0.162292465567589f, + 0.973052620887756f, 0.161929681897163f, 0.973176658153534f, 0.161566808819771f, + 0.973300457000732f, 0.161203846335411f, 0.973423957824707f, 0.160840779542923f, + 0.973547160625458f, 0.160477623343468f, 0.973670125007629f, 0.160114362835884f, + 0.973792791366577f, 0.159751012921333f, 0.973915159702301f, 0.159387573599815f, + 0.974037289619446f, 0.159024044871330f, 0.974159121513367f, 0.158660411834717f, + 0.974280655384064f, 0.158296689391136f, 0.974401950836182f, 0.157932877540588f, + 0.974522948265076f, 0.157568961381912f, 0.974643647670746f, 0.157204970717430f, + 0.974764108657837f, 0.156840875744820f, 0.974884271621704f, 0.156476691365242f, + 0.975004136562347f, 0.156112402677536f, 0.975123703479767f, 0.155748039484024f, + 0.975243031978607f, 0.155383571982384f, 0.975362062454224f, 0.155019029974937f, + 0.975480854511261f, 0.154654383659363f, 0.975599288940430f, 0.154289647936821f, + 0.975717484951019f, 0.153924822807312f, 0.975835442543030f, 0.153559908270836f, + 0.975953042507172f, 0.153194904327393f, 0.976070404052734f, 0.152829796075821f, + 0.976187527179718f, 0.152464613318443f, 0.976304292678833f, 0.152099341154099f, + 0.976420819759369f, 0.151733979582787f, 0.976537048816681f, 0.151368513703346f, + 0.976653039455414f, 0.151002973318100f, 0.976768672466278f, 0.150637343525887f, + 0.976884067058563f, 0.150271624326706f, 0.976999223232269f, 0.149905815720558f, + 0.977114021778107f, 0.149539917707443f, 0.977228581905365f, 0.149173930287361f, + 0.977342903614044f, 0.148807853460312f, 0.977456867694855f, 0.148441687226295f, + 0.977570593357086f, 0.148075446486473f, 0.977684020996094f, 0.147709101438522f, + 0.977797150611877f, 0.147342681884766f, 0.977910041809082f, 0.146976172924042f, + 0.978022634983063f, 0.146609574556351f, 0.978134930133820f, 0.146242901682854f, + 0.978246986865997f, 0.145876124501228f, 0.978358685970306f, 0.145509272813797f, + 0.978470146656036f, 0.145142331719399f, 0.978581368923187f, 0.144775316119194f, + 0.978692233562469f, 0.144408211112022f, 0.978802859783173f, 0.144041016697884f, + 0.978913187980652f, 0.143673732876778f, 0.979023277759552f, 0.143306359648705f, + 0.979133009910584f, 0.142938911914825f, 0.979242503643036f, 0.142571389675140f, + 0.979351758956909f, 0.142203763127327f, 0.979460656642914f, 0.141836062073708f, + 0.979569315910339f, 0.141468286514282f, 0.979677677154541f, 0.141100421547890f, + 0.979785740375519f, 0.140732467174530f, 0.979893565177917f, 0.140364438295364f, + 0.980001091957092f, 0.139996320009232f, 0.980108320713043f, 0.139628127217293f, + 0.980215251445770f, 0.139259845018387f, 0.980321943759918f, 0.138891488313675f, + 0.980428338050842f, 0.138523042201996f, 0.980534434318542f, 0.138154521584511f, + 0.980640232563019f, 0.137785911560059f, 0.980745792388916f, 0.137417227029800f, + 0.980851054191589f, 0.137048453092575f, 0.980956017971039f, 0.136679604649544f, + 0.981060683727264f, 0.136310681700706f, 0.981165111064911f, 0.135941669344902f, + 0.981269240379334f, 0.135572582483292f, 0.981373071670532f, 0.135203406214714f, + 0.981476604938507f, 0.134834155440331f, 0.981579899787903f, 0.134464830160141f, + 0.981682896614075f, 0.134095430374146f, 0.981785595417023f, 0.133725941181183f, + 0.981888055801392f, 0.133356377482414f, 0.981990158557892f, 0.132986739277840f, + 0.982092022895813f, 0.132617011666298f, 0.982193589210510f, 0.132247209548950f, + 0.982294917106628f, 0.131877332925797f, 0.982395887374878f, 0.131507381796837f, + 0.982496619224548f, 0.131137356162071f, 0.982597053050995f, 0.130767241120338f, + 0.982697248458862f, 0.130397051572800f, 0.982797086238861f, 0.130026802420616f, + 0.982896685600281f, 0.129656463861465f, 0.982995986938477f, 0.129286035895348f, + 0.983094990253448f, 0.128915548324585f, 0.983193755149841f, 0.128544986248016f, + 0.983292162418365f, 0.128174334764481f, 0.983390331268311f, 0.127803623676300f, + 0.983488261699677f, 0.127432823181152f, 0.983585834503174f, 0.127061963081360f, + 0.983683168888092f, 0.126691013574600f, 0.983780145645142f, 0.126320004463196f, + 0.983876943588257f, 0.125948905944824f, 0.983973383903503f, 0.125577747821808f, + 0.984069526195526f, 0.125206500291824f, 0.984165430068970f, 0.124835193157196f, + 0.984261035919189f, 0.124463804066181f, 0.984356343746185f, 0.124092340469360f, + 0.984451413154602f, 0.123720809817314f, 0.984546124935150f, 0.123349204659462f, + 0.984640598297119f, 0.122977524995804f, 0.984734773635864f, 0.122605770826340f, + 0.984828710556030f, 0.122233949601650f, 0.984922289848328f, 0.121862053871155f, + 0.985015630722046f, 0.121490091085434f, 0.985108673572540f, 0.121118053793907f, + 0.985201418399811f, 0.120745941996574f, 0.985293865203857f, 0.120373763144016f, + 0.985386073589325f, 0.120001509785652f, 0.985477983951569f, 0.119629189372063f, + 0.985569596290588f, 0.119256794452667f, 0.985660910606384f, 0.118884332478046f, + 0.985751926898956f, 0.118511803448200f, 0.985842704772949f, 0.118139199912548f, + 0.985933184623718f, 0.117766529321671f, 0.986023366451263f, 0.117393791675568f, + 0.986113250255585f, 0.117020979523659f, 0.986202836036682f, 0.116648100316525f, + 0.986292183399200f, 0.116275154054165f, 0.986381232738495f, 0.115902140736580f, + 0.986469984054565f, 0.115529052913189f, 0.986558437347412f, 0.115155905485153f, + 0.986646652221680f, 0.114782683551311f, 0.986734509468079f, 0.114409394562244f, + 0.986822128295898f, 0.114036038517952f, 0.986909449100494f, 0.113662622869015f, + 0.986996471881866f, 0.113289132714272f, 0.987083256244659f, 0.112915575504303f, + 0.987169682979584f, 0.112541958689690f, 0.987255871295929f, 0.112168267369270f, + 0.987341761589050f, 0.111794516444206f, 0.987427353858948f, 0.111420698463917f, + 0.987512648105621f, 0.111046813428402f, 0.987597703933716f, 0.110672861337662f, + 0.987682461738586f, 0.110298842191696f, 0.987766921520233f, 0.109924763441086f, + 0.987851083278656f, 0.109550617635250f, 0.987934947013855f, 0.109176412224770f, + 0.988018512725830f, 0.108802139759064f, 0.988101840019226f, 0.108427800238132f, + 0.988184869289398f, 0.108053401112556f, 0.988267600536346f, 0.107678934931755f, + 0.988350033760071f, 0.107304409146309f, 0.988432228565216f, 0.106929816305637f, + 0.988514065742493f, 0.106555156409740f, 0.988595664501190f, 0.106180444359779f, + 0.988676965236664f, 0.105805665254593f, 0.988757967948914f, 0.105430819094181f, + 0.988838672637939f, 0.105055920779705f, 0.988919138908386f, 0.104680955410004f, + 0.988999247550964f, 0.104305922985077f, 0.989079117774963f, 0.103930838406086f, + 0.989158689975739f, 0.103555686771870f, 0.989237964153290f, 0.103180475533009f, + 0.989316940307617f, 0.102805204689503f, 0.989395678043365f, 0.102429874241352f, + 0.989474058151245f, 0.102054484188557f, 0.989552199840546f, 0.101679034531116f, + 0.989630043506622f, 0.101303517818451f, 0.989707589149475f, 0.100927948951721f, + 0.989784896373749f, 0.100552320480347f, 0.989861845970154f, 0.100176624953747f, + 0.989938557147980f, 0.099800877273083f, 0.990014970302582f, 0.099425069987774f, + 0.990091085433960f, 0.099049203097820f, 0.990166902542114f, 0.098673284053802f, + 0.990242421627045f, 0.098297297954559f, 0.990317702293396f, 0.097921259701252f, + 0.990392625331879f, 0.097545161843300f, 0.990467309951782f, 0.097169004380703f, + 0.990541696548462f, 0.096792794764042f, 0.990615785121918f, 0.096416525542736f, + 0.990689575672150f, 0.096040196716785f, 0.990763127803802f, 0.095663815736771f, + 0.990836322307587f, 0.095287375152111f, 0.990909278392792f, 0.094910882413387f, + 0.990981936454773f, 0.094534330070019f, 0.991054296493530f, 0.094157725572586f, + 0.991126358509064f, 0.093781061470509f, 0.991198182106018f, 0.093404345214367f, + 0.991269648075104f, 0.093027576804161f, 0.991340875625610f, 0.092650748789310f, + 0.991411805152893f, 0.092273868620396f, 0.991482377052307f, 0.091896936297417f, + 0.991552770137787f, 0.091519944369793f, 0.991622805595398f, 0.091142900288105f, + 0.991692543029785f, 0.090765804052353f, 0.991762042045593f, 0.090388655662537f, + 0.991831183433533f, 0.090011447668076f, 0.991900086402893f, 0.089634194970131f, + 0.991968691349030f, 0.089256882667542f, 0.992036998271942f, 0.088879525661469f, + 0.992105066776276f, 0.088502109050751f, 0.992172777652740f, 0.088124647736549f, + 0.992240250110626f, 0.087747126817703f, 0.992307364940643f, 0.087369553744793f, + 0.992374241352081f, 0.086991935968399f, 0.992440819740295f, 0.086614266037941f, + 0.992507100105286f, 0.086236543953419f, 0.992573142051697f, 0.085858769714832f, + 0.992638826370239f, 0.085480943322182f, 0.992704212665558f, 0.085103072226048f, + 0.992769360542297f, 0.084725148975849f, 0.992834210395813f, 0.084347173571587f, + 0.992898762226105f, 0.083969146013260f, 0.992963016033173f, 0.083591073751450f, + 0.993026971817017f, 0.083212949335575f, 0.993090689182281f, 0.082834780216217f, + 0.993154048919678f, 0.082456558942795f, 0.993217170238495f, 0.082078292965889f, + 0.993279933929443f, 0.081699974834919f, 0.993342459201813f, 0.081321612000465f, + 0.993404686450958f, 0.080943197011948f, 0.993466615676880f, 0.080564737319946f, + 0.993528306484222f, 0.080186225473881f, 0.993589639663696f, 0.079807676374912f, + 0.993650734424591f, 0.079429075121880f, 0.993711471557617f, 0.079050421714783f, + 0.993771970272064f, 0.078671731054783f, 0.993832170963287f, 0.078292988240719f, + 0.993892073631287f, 0.077914200723171f, 0.993951678276062f, 0.077535368502140f, + 0.994010984897614f, 0.077156484127045f, 0.994070053100586f, 0.076777562499046f, + 0.994128763675690f, 0.076398596167564f, 0.994187235832214f, 0.076019577682018f, + 0.994245409965515f, 0.075640521943569f, 0.994303286075592f, 0.075261414051056f, + 0.994360864162445f, 0.074882268905640f, 0.994418144226074f, 0.074503071606159f, + 0.994475126266479f, 0.074123837053776f, 0.994531810283661f, 0.073744557797909f, + 0.994588255882263f, 0.073365233838558f, 0.994644403457642f, 0.072985872626305f, + 0.994700193405151f, 0.072606459259987f, 0.994755744934082f, 0.072227008640766f, + 0.994810998439789f, 0.071847513318062f, 0.994865953922272f, 0.071467980742455f, + 0.994920611381531f, 0.071088403463364f, 0.994975030422211f, 0.070708781480789f, + 0.995029091835022f, 0.070329122245312f, 0.995082914829254f, 0.069949418306351f, + 0.995136380195618f, 0.069569669663906f, 0.995189607143402f, 0.069189883768559f, + 0.995242536067963f, 0.068810060620308f, 0.995295166969299f, 0.068430192768574f, + 0.995347499847412f, 0.068050287663937f, 0.995399534702301f, 0.067670337855816f, + 0.995451331138611f, 0.067290350794792f, 0.995502769947052f, 0.066910326480865f, + 0.995553970336914f, 0.066530264914036f, 0.995604813098907f, 0.066150158643723f, + 0.995655417442322f, 0.065770015120506f, 0.995705723762512f, 0.065389834344387f, + 0.995755732059479f, 0.065009608864784f, 0.995805442333221f, 0.064629353582859f, + 0.995854854583740f, 0.064249053597450f, 0.995904028415680f, 0.063868723809719f, + 0.995952844619751f, 0.063488349318504f, 0.996001422405243f, 0.063107937574387f, + 0.996049642562866f, 0.062727488577366f, 0.996097624301910f, 0.062347009778023f, + 0.996145308017731f, 0.061966486275196f, 0.996192693710327f, 0.061585929244757f, + 0.996239781379700f, 0.061205338686705f, 0.996286571025848f, 0.060824707150459f, + 0.996333062648773f, 0.060444042086601f, 0.996379256248474f, 0.060063343495131f, + 0.996425211429596f, 0.059682607650757f, 0.996470808982849f, 0.059301838278770f, + 0.996516168117523f, 0.058921031653881f, 0.996561229228973f, 0.058540191501379f, + 0.996605992317200f, 0.058159314095974f, 0.996650457382202f, 0.057778406888247f, + 0.996694624423981f, 0.057397462427616f, 0.996738493442535f, 0.057016488164663f, + 0.996782064437866f, 0.056635476648808f, 0.996825337409973f, 0.056254431605339f, + 0.996868371963501f, 0.055873356759548f, 0.996911048889160f, 0.055492244660854f, + 0.996953487396240f, 0.055111102759838f, 0.996995627880096f, 0.054729927331209f, + 0.997037410736084f, 0.054348722100258f, 0.997078955173492f, 0.053967483341694f, + 0.997120201587677f, 0.053586211055517f, 0.997161149978638f, 0.053204908967018f, + 0.997201859951019f, 0.052823577076197f, 0.997242212295532f, 0.052442211657763f, + 0.997282266616821f, 0.052060816437006f, 0.997322082519531f, 0.051679391413927f, + 0.997361540794373f, 0.051297932863235f, 0.997400760650635f, 0.050916448235512f, + 0.997439682483673f, 0.050534930080175f, 0.997478306293488f, 0.050153385847807f, + 0.997516572475433f, 0.049771808087826f, 0.997554600238800f, 0.049390204250813f, + 0.997592389583588f, 0.049008570611477f, 0.997629821300507f, 0.048626907169819f, + 0.997666954994202f, 0.048245213925838f, 0.997703790664673f, 0.047863494604826f, + 0.997740387916565f, 0.047481749206781f, 0.997776627540588f, 0.047099970281124f, + 0.997812628746033f, 0.046718169003725f, 0.997848331928253f, 0.046336337924004f, + 0.997883677482605f, 0.045954477041960f, 0.997918784618378f, 0.045572593808174f, + 0.997953593730927f, 0.045190680772066f, 0.997988104820251f, 0.044808741658926f, + 0.998022377490997f, 0.044426776468754f, 0.998056292533875f, 0.044044785201550f, + 0.998089909553528f, 0.043662767857313f, 0.998123228549957f, 0.043280724436045f, + 0.998156309127808f, 0.042898654937744f, 0.998189091682434f, 0.042516563087702f, + 0.998221516609192f, 0.042134445160627f, 0.998253703117371f, 0.041752301156521f, + 0.998285591602325f, 0.041370131075382f, 0.998317182064056f, 0.040987938642502f, + 0.998348474502563f, 0.040605723857880f, 0.998379468917847f, 0.040223482996225f, + 0.998410165309906f, 0.039841219782829f, 0.998440563678741f, 0.039458930492401f, + 0.998470664024353f, 0.039076622575521f, 0.998500525951386f, 0.038694288581610f, + 0.998530030250549f, 0.038311932235956f, 0.998559296131134f, 0.037929553538561f, + 0.998588204383850f, 0.037547148764133f, 0.998616874217987f, 0.037164725363255f, + 0.998645246028900f, 0.036782283335924f, 0.998673319816589f, 0.036399815231562f, + 0.998701035976410f, 0.036017324775457f, 0.998728513717651f, 0.035634815692902f, + 0.998755753040314f, 0.035252287983894f, 0.998782634735107f, 0.034869734197855f, + 0.998809218406677f, 0.034487165510654f, 0.998835504055023f, 0.034104570746422f, + 0.998861551284790f, 0.033721961081028f, 0.998887240886688f, 0.033339329063892f, + 0.998912692070007f, 0.032956674695015f, 0.998937785625458f, 0.032574005424976f, + 0.998962640762329f, 0.032191313803196f, 0.998987197875977f, 0.031808607280254f, + 0.999011456966400f, 0.031425878405571f, 0.999035418033600f, 0.031043132767081f, + 0.999059081077576f, 0.030660368502140f, 0.999082446098328f, 0.030277585610747f, + 0.999105513095856f, 0.029894785955548f, 0.999128282070160f, 0.029511967673898f, + 0.999150753021240f, 0.029129132628441f, 0.999172985553741f, 0.028746278956532f, + 0.999194860458374f, 0.028363410383463f, 0.999216496944427f, 0.027980525046587f, + 0.999237775802612f, 0.027597622945905f, 0.999258816242218f, 0.027214704081416f, + 0.999279558658600f, 0.026831768453121f, 0.999299943447113f, 0.026448817923665f, + 0.999320089817047f, 0.026065852493048f, 0.999339938163757f, 0.025682870298624f, + 0.999359488487244f, 0.025299875065684f, 0.999378740787506f, 0.024916863068938f, + 0.999397754669189f, 0.024533838033676f, 0.999416410923004f, 0.024150796234608f, + 0.999434769153595f, 0.023767741397023f, 0.999452829360962f, 0.023384673520923f, + 0.999470651149750f, 0.023001590743661f, 0.999488115310669f, 0.022618494927883f, + 0.999505341053009f, 0.022235386073589f, 0.999522268772125f, 0.021852264180779f, + 0.999538838863373f, 0.021469129249454f, 0.999555170536041f, 0.021085981279612f, + 0.999571204185486f, 0.020702820271254f, 0.999586939811707f, 0.020319648087025f, + 0.999602377414703f, 0.019936462864280f, 0.999617516994476f, 0.019553268328309f, + 0.999632358551025f, 0.019170060753822f, 0.999646902084351f, 0.018786842003465f, + 0.999661207199097f, 0.018403612077236f, 0.999675154685974f, 0.018020370975137f, + 0.999688863754272f, 0.017637118697166f, 0.999702215194702f, 0.017253857105970f, + 0.999715328216553f, 0.016870586201549f, 0.999728083610535f, 0.016487304121256f, + 0.999740600585938f, 0.016104012727737f, 0.999752819538116f, 0.015720712020993f, + 0.999764680862427f, 0.015337402001023f, 0.999776303768158f, 0.014954082667828f, + 0.999787628650665f, 0.014570754021406f, 0.999798655509949f, 0.014187417924404f, + 0.999809384346008f, 0.013804072514176f, 0.999819874763489f, 0.013420719653368f, + 0.999830007553101f, 0.013037359341979f, 0.999839842319489f, 0.012653990648687f, + 0.999849438667297f, 0.012270614504814f, 0.999858677387238f, 0.011887230910361f, + 0.999867618083954f, 0.011503840796649f, 0.999876320362091f, 0.011120444163680f, + 0.999884724617004f, 0.010737040080130f, 0.999892771244049f, 0.010353630408645f, + 0.999900579452515f, 0.009970214217901f, 0.999908089637756f, 0.009586792439222f, + 0.999915301799774f, 0.009203365072608f, 0.999922215938568f, 0.008819932118058f, + 0.999928832054138f, 0.008436493575573f, 0.999935150146484f, 0.008053051307797f, + 0.999941170215607f, 0.007669602986425f, 0.999946892261505f, 0.007286150939763f, + 0.999952375888824f, 0.006902694236487f, 0.999957501888275f, 0.006519233807921f, + 0.999962329864502f, 0.006135769188404f, 0.999966919422150f, 0.005752300843596f, + 0.999971151351929f, 0.005368829704821f, 0.999975144863129f, 0.004985354840755f, + 0.999978840351105f, 0.004601877182722f, 0.999982178211212f, 0.004218397196382f, + 0.999985277652740f, 0.003834914416075f, 0.999988079071045f, 0.003451429307461f, + 0.999990582466125f, 0.003067942336202f, 0.999992787837982f, 0.002684453502297f, + 0.999994695186615f, 0.002300963038579f, 0.999996304512024f, 0.001917471294291f, + 0.999997675418854f, 0.001533978385851f, 0.999998688697815f, 0.001150484546088f, + 0.999999403953552f, 0.000766990066040f, 0.999999880790710f, 0.000383495149435f, + 1.000000000000000f, 0.000000000000023f, 0.999999880790710f, -0.000383495149435f, + 0.999999403953552f, -0.000766990066040f, 0.999998688697815f, -0.001150484546088f, + 0.999997675418854f, -0.001533978385851f, 0.999996304512024f, -0.001917471294291f, + 0.999994695186615f, -0.002300963038579f, 0.999992787837982f, -0.002684453502297f, + 0.999990582466125f, -0.003067942336202f, 0.999988079071045f, -0.003451429307461f, + 0.999985277652740f, -0.003834914416075f, 0.999982178211212f, -0.004218397196382f, + 0.999978840351105f, -0.004601877182722f, 0.999975144863129f, -0.004985354840755f, + 0.999971151351929f, -0.005368829704821f, 0.999966919422150f, -0.005752300843596f, + 0.999962329864502f, -0.006135769188404f, 0.999957501888275f, -0.006519233807921f, + 0.999952375888824f, -0.006902694236487f, 0.999946892261505f, -0.007286150939763f, + 0.999941170215607f, -0.007669602986425f, 0.999935150146484f, -0.008053051307797f, + 0.999928832054138f, -0.008436493575573f, 0.999922215938568f, -0.008819932118058f, + 0.999915301799774f, -0.009203365072608f, 0.999908089637756f, -0.009586792439222f, + 0.999900579452515f, -0.009970214217901f, 0.999892771244049f, -0.010353630408645f, + 0.999884724617004f, -0.010737040080130f, 0.999876320362091f, -0.011120444163680f, + 0.999867618083954f, -0.011503840796649f, 0.999858677387238f, -0.011887230910361f, + 0.999849438667297f, -0.012270614504814f, 0.999839842319489f, -0.012653990648687f, + 0.999830007553101f, -0.013037359341979f, 0.999819874763489f, -0.013420719653368f, + 0.999809384346008f, -0.013804072514176f, 0.999798655509949f, -0.014187417924404f, + 0.999787628650665f, -0.014570754021406f, 0.999776303768158f, -0.014954082667828f, + 0.999764680862427f, -0.015337402001023f, 0.999752819538116f, -0.015720712020993f, + 0.999740600585938f, -0.016104012727737f, 0.999728083610535f, -0.016487304121256f, + 0.999715328216553f, -0.016870586201549f, 0.999702215194702f, -0.017253857105970f, + 0.999688863754272f, -0.017637118697166f, 0.999675154685974f, -0.018020370975137f, + 0.999661207199097f, -0.018403612077236f, 0.999646902084351f, -0.018786842003465f, + 0.999632358551025f, -0.019170060753822f, 0.999617516994476f, -0.019553268328309f, + 0.999602377414703f, -0.019936462864280f, 0.999586939811707f, -0.020319648087025f, + 0.999571204185486f, -0.020702820271254f, 0.999555170536041f, -0.021085981279612f, + 0.999538838863373f, -0.021469129249454f, 0.999522268772125f, -0.021852264180779f, + 0.999505341053009f, -0.022235386073589f, 0.999488115310669f, -0.022618494927883f, + 0.999470651149750f, -0.023001590743661f, 0.999452829360962f, -0.023384673520923f, + 0.999434769153595f, -0.023767741397023f, 0.999416410923004f, -0.024150796234608f, + 0.999397754669189f, -0.024533838033676f, 0.999378740787506f, -0.024916863068938f, + 0.999359488487244f, -0.025299875065684f, 0.999339938163757f, -0.025682870298624f, + 0.999320089817047f, -0.026065852493048f, 0.999299943447113f, -0.026448817923665f, + 0.999279558658600f, -0.026831768453121f, 0.999258816242218f, -0.027214704081416f, + 0.999237775802612f, -0.027597622945905f, 0.999216496944427f, -0.027980525046587f, + 0.999194860458374f, -0.028363410383463f, 0.999172985553741f, -0.028746278956532f, + 0.999150753021240f, -0.029129132628441f, 0.999128282070160f, -0.029511967673898f, + 0.999105513095856f, -0.029894785955548f, 0.999082446098328f, -0.030277585610747f, + 0.999059081077576f, -0.030660368502140f, 0.999035418033600f, -0.031043132767081f, + 0.999011456966400f, -0.031425878405571f, 0.998987197875977f, -0.031808607280254f, + 0.998962640762329f, -0.032191313803196f, 0.998937785625458f, -0.032574005424976f, + 0.998912692070007f, -0.032956674695015f, 0.998887240886688f, -0.033339329063892f, + 0.998861551284790f, -0.033721961081028f, 0.998835504055023f, -0.034104570746422f, + 0.998809218406677f, -0.034487165510654f, 0.998782634735107f, -0.034869734197855f, + 0.998755753040314f, -0.035252287983894f, 0.998728513717651f, -0.035634815692902f, + 0.998701035976410f, -0.036017324775457f, 0.998673319816589f, -0.036399815231562f, + 0.998645246028900f, -0.036782283335924f, 0.998616874217987f, -0.037164725363255f, + 0.998588204383850f, -0.037547148764133f, 0.998559296131134f, -0.037929553538561f, + 0.998530030250549f, -0.038311932235956f, 0.998500525951386f, -0.038694288581610f, + 0.998470664024353f, -0.039076622575521f, 0.998440563678741f, -0.039458930492401f, + 0.998410165309906f, -0.039841219782829f, 0.998379468917847f, -0.040223482996225f, + 0.998348474502563f, -0.040605723857880f, 0.998317182064056f, -0.040987938642502f, + 0.998285591602325f, -0.041370131075382f, 0.998253703117371f, -0.041752301156521f, + 0.998221516609192f, -0.042134445160627f, 0.998189091682434f, -0.042516563087702f, + 0.998156309127808f, -0.042898654937744f, 0.998123228549957f, -0.043280724436045f, + 0.998089909553528f, -0.043662767857313f, 0.998056292533875f, -0.044044785201550f, + 0.998022377490997f, -0.044426776468754f, 0.997988104820251f, -0.044808741658926f, + 0.997953593730927f, -0.045190680772066f, 0.997918784618378f, -0.045572593808174f, + 0.997883677482605f, -0.045954477041960f, 0.997848331928253f, -0.046336337924004f, + 0.997812628746033f, -0.046718169003725f, 0.997776627540588f, -0.047099970281124f, + 0.997740387916565f, -0.047481749206781f, 0.997703790664673f, -0.047863494604826f, + 0.997666954994202f, -0.048245213925838f, 0.997629821300507f, -0.048626907169819f, + 0.997592389583588f, -0.049008570611477f, 0.997554600238800f, -0.049390204250813f, + 0.997516572475433f, -0.049771808087826f, 0.997478306293488f, -0.050153385847807f, + 0.997439682483673f, -0.050534930080175f, 0.997400760650635f, -0.050916448235512f, + 0.997361540794373f, -0.051297932863235f, 0.997322082519531f, -0.051679391413927f, + 0.997282266616821f, -0.052060816437006f, 0.997242212295532f, -0.052442211657763f, + 0.997201859951019f, -0.052823577076197f, 0.997161149978638f, -0.053204908967018f, + 0.997120201587677f, -0.053586211055517f, 0.997078955173492f, -0.053967483341694f, + 0.997037410736084f, -0.054348722100258f, 0.996995627880096f, -0.054729927331209f, + 0.996953487396240f, -0.055111102759838f, 0.996911048889160f, -0.055492244660854f, + 0.996868371963501f, -0.055873356759548f, 0.996825337409973f, -0.056254431605339f, + 0.996782064437866f, -0.056635476648808f, 0.996738493442535f, -0.057016488164663f, + 0.996694624423981f, -0.057397462427616f, 0.996650457382202f, -0.057778406888247f, + 0.996605992317200f, -0.058159314095974f, 0.996561229228973f, -0.058540191501379f, + 0.996516168117523f, -0.058921031653881f, 0.996470808982849f, -0.059301838278770f, + 0.996425211429596f, -0.059682607650757f, 0.996379256248474f, -0.060063343495131f, + 0.996333062648773f, -0.060444042086601f, 0.996286571025848f, -0.060824707150459f, + 0.996239781379700f, -0.061205338686705f, 0.996192693710327f, -0.061585929244757f, + 0.996145308017731f, -0.061966486275196f, 0.996097624301910f, -0.062347009778023f, + 0.996049642562866f, -0.062727488577366f, 0.996001422405243f, -0.063107937574387f, + 0.995952844619751f, -0.063488349318504f, 0.995904028415680f, -0.063868723809719f, + 0.995854854583740f, -0.064249053597450f, 0.995805442333221f, -0.064629353582859f, + 0.995755732059479f, -0.065009608864784f, 0.995705723762512f, -0.065389834344387f, + 0.995655417442322f, -0.065770015120506f, 0.995604813098907f, -0.066150158643723f, + 0.995553970336914f, -0.066530264914036f, 0.995502769947052f, -0.066910326480865f, + 0.995451331138611f, -0.067290350794792f, 0.995399534702301f, -0.067670337855816f, + 0.995347499847412f, -0.068050287663937f, 0.995295166969299f, -0.068430192768574f, + 0.995242536067963f, -0.068810060620308f, 0.995189607143402f, -0.069189883768559f, + 0.995136380195618f, -0.069569669663906f, 0.995082914829254f, -0.069949418306351f, + 0.995029091835022f, -0.070329122245312f, 0.994975030422211f, -0.070708781480789f, + 0.994920611381531f, -0.071088403463364f, 0.994865953922272f, -0.071467980742455f, + 0.994810998439789f, -0.071847513318062f, 0.994755744934082f, -0.072227008640766f, + 0.994700193405151f, -0.072606459259987f, 0.994644403457642f, -0.072985872626305f, + 0.994588255882263f, -0.073365233838558f, 0.994531810283661f, -0.073744557797909f, + 0.994475126266479f, -0.074123837053776f, 0.994418144226074f, -0.074503071606159f, + 0.994360864162445f, -0.074882268905640f, 0.994303286075592f, -0.075261414051056f, + 0.994245409965515f, -0.075640521943569f, 0.994187235832214f, -0.076019577682018f, + 0.994128763675690f, -0.076398596167564f, 0.994070053100586f, -0.076777562499046f, + 0.994010984897614f, -0.077156484127045f, 0.993951678276062f, -0.077535368502140f, + 0.993892073631287f, -0.077914200723171f, 0.993832170963287f, -0.078292988240719f, + 0.993771970272064f, -0.078671731054783f, 0.993711471557617f, -0.079050421714783f, + 0.993650734424591f, -0.079429075121880f, 0.993589639663696f, -0.079807676374912f, + 0.993528306484222f, -0.080186225473881f, 0.993466615676880f, -0.080564737319946f, + 0.993404686450958f, -0.080943197011948f, 0.993342459201813f, -0.081321612000465f, + 0.993279933929443f, -0.081699974834919f, 0.993217170238495f, -0.082078292965889f, + 0.993154048919678f, -0.082456558942795f, 0.993090689182281f, -0.082834780216217f, + 0.993026971817017f, -0.083212949335575f, 0.992963016033173f, -0.083591073751450f, + 0.992898762226105f, -0.083969146013260f, 0.992834210395813f, -0.084347173571587f, + 0.992769360542297f, -0.084725148975849f, 0.992704212665558f, -0.085103072226048f, + 0.992638826370239f, -0.085480943322182f, 0.992573142051697f, -0.085858769714832f, + 0.992507100105286f, -0.086236543953419f, 0.992440819740295f, -0.086614266037941f, + 0.992374241352081f, -0.086991935968399f, 0.992307364940643f, -0.087369553744793f, + 0.992240250110626f, -0.087747126817703f, 0.992172777652740f, -0.088124647736549f, + 0.992105066776276f, -0.088502109050751f, 0.992036998271942f, -0.088879525661469f, + 0.991968691349030f, -0.089256882667542f, 0.991900086402893f, -0.089634194970131f, + 0.991831183433533f, -0.090011447668076f, 0.991762042045593f, -0.090388655662537f, + 0.991692543029785f, -0.090765804052353f, 0.991622805595398f, -0.091142900288105f, + 0.991552770137787f, -0.091519944369793f, 0.991482377052307f, -0.091896936297417f, + 0.991411805152893f, -0.092273868620396f, 0.991340875625610f, -0.092650748789310f, + 0.991269648075104f, -0.093027576804161f, 0.991198182106018f, -0.093404345214367f, + 0.991126358509064f, -0.093781061470509f, 0.991054296493530f, -0.094157725572586f, + 0.990981936454773f, -0.094534330070019f, 0.990909278392792f, -0.094910882413387f, + 0.990836322307587f, -0.095287375152111f, 0.990763127803802f, -0.095663815736771f, + 0.990689575672150f, -0.096040196716785f, 0.990615785121918f, -0.096416525542736f, + 0.990541696548462f, -0.096792794764042f, 0.990467309951782f, -0.097169004380703f, + 0.990392625331879f, -0.097545161843300f, 0.990317702293396f, -0.097921259701252f, + 0.990242421627045f, -0.098297297954559f, 0.990166902542114f, -0.098673284053802f, + 0.990091085433960f, -0.099049203097820f, 0.990014970302582f, -0.099425069987774f, + 0.989938557147980f, -0.099800877273083f, 0.989861845970154f, -0.100176624953747f, + 0.989784896373749f, -0.100552320480347f, 0.989707589149475f, -0.100927948951721f, + 0.989630043506622f, -0.101303517818451f, 0.989552199840546f, -0.101679034531116f, + 0.989474058151245f, -0.102054484188557f, 0.989395678043365f, -0.102429874241352f, + 0.989316940307617f, -0.102805204689503f, 0.989237964153290f, -0.103180475533009f, + 0.989158689975739f, -0.103555686771870f, 0.989079117774963f, -0.103930838406086f, + 0.988999247550964f, -0.104305922985077f, 0.988919138908386f, -0.104680955410004f, + 0.988838672637939f, -0.105055920779705f, 0.988757967948914f, -0.105430819094181f, + 0.988676965236664f, -0.105805665254593f, 0.988595664501190f, -0.106180444359779f, + 0.988514065742493f, -0.106555156409740f, 0.988432228565216f, -0.106929816305637f, + 0.988350033760071f, -0.107304409146309f, 0.988267600536346f, -0.107678934931755f, + 0.988184869289398f, -0.108053401112556f, 0.988101840019226f, -0.108427800238132f, + 0.988018512725830f, -0.108802139759064f, 0.987934947013855f, -0.109176412224770f, + 0.987851083278656f, -0.109550617635250f, 0.987766921520233f, -0.109924763441086f, + 0.987682461738586f, -0.110298842191696f, 0.987597703933716f, -0.110672861337662f, + 0.987512648105621f, -0.111046813428402f, 0.987427353858948f, -0.111420698463917f, + 0.987341761589050f, -0.111794516444206f, 0.987255871295929f, -0.112168267369270f, + 0.987169682979584f, -0.112541958689690f, 0.987083256244659f, -0.112915575504303f, + 0.986996471881866f, -0.113289132714272f, 0.986909449100494f, -0.113662622869015f, + 0.986822128295898f, -0.114036038517952f, 0.986734509468079f, -0.114409394562244f, + 0.986646652221680f, -0.114782683551311f, 0.986558437347412f, -0.115155905485153f, + 0.986469984054565f, -0.115529052913189f, 0.986381232738495f, -0.115902140736580f, + 0.986292183399200f, -0.116275154054165f, 0.986202836036682f, -0.116648100316525f, + 0.986113250255585f, -0.117020979523659f, 0.986023366451263f, -0.117393791675568f, + 0.985933184623718f, -0.117766529321671f, 0.985842704772949f, -0.118139199912548f, + 0.985751926898956f, -0.118511803448200f, 0.985660910606384f, -0.118884332478046f, + 0.985569596290588f, -0.119256794452667f, 0.985477983951569f, -0.119629189372063f, + 0.985386073589325f, -0.120001509785652f, 0.985293865203857f, -0.120373763144016f, + 0.985201418399811f, -0.120745941996574f, 0.985108673572540f, -0.121118053793907f, + 0.985015630722046f, -0.121490091085434f, 0.984922289848328f, -0.121862053871155f, + 0.984828710556030f, -0.122233949601650f, 0.984734773635864f, -0.122605770826340f, + 0.984640598297119f, -0.122977524995804f, 0.984546124935150f, -0.123349204659462f, + 0.984451413154602f, -0.123720809817314f, 0.984356343746185f, -0.124092340469360f, + 0.984261035919189f, -0.124463804066181f, 0.984165430068970f, -0.124835193157196f, + 0.984069526195526f, -0.125206500291824f, 0.983973383903503f, -0.125577747821808f, + 0.983876943588257f, -0.125948905944824f, 0.983780145645142f, -0.126320004463196f, + 0.983683168888092f, -0.126691013574600f, 0.983585834503174f, -0.127061963081360f, + 0.983488261699677f, -0.127432823181152f, 0.983390331268311f, -0.127803623676300f, + 0.983292162418365f, -0.128174334764481f, 0.983193755149841f, -0.128544986248016f, + 0.983094990253448f, -0.128915548324585f, 0.982995986938477f, -0.129286035895348f, + 0.982896685600281f, -0.129656463861465f, 0.982797086238861f, -0.130026802420616f, + 0.982697248458862f, -0.130397051572800f, 0.982597053050995f, -0.130767241120338f, + 0.982496619224548f, -0.131137356162071f, 0.982395887374878f, -0.131507381796837f, + 0.982294917106628f, -0.131877332925797f, 0.982193589210510f, -0.132247209548950f, + 0.982092022895813f, -0.132617011666298f, 0.981990158557892f, -0.132986739277840f, + 0.981888055801392f, -0.133356377482414f, 0.981785595417023f, -0.133725941181183f, + 0.981682896614075f, -0.134095430374146f, 0.981579899787903f, -0.134464830160141f, + 0.981476604938507f, -0.134834155440331f, 0.981373071670532f, -0.135203406214714f, + 0.981269240379334f, -0.135572582483292f, 0.981165111064911f, -0.135941669344902f, + 0.981060683727264f, -0.136310681700706f, 0.980956017971039f, -0.136679604649544f, + 0.980851054191589f, -0.137048453092575f, 0.980745792388916f, -0.137417227029800f, + 0.980640232563019f, -0.137785911560059f, 0.980534434318542f, -0.138154521584511f, + 0.980428338050842f, -0.138523042201996f, 0.980321943759918f, -0.138891488313675f, + 0.980215251445770f, -0.139259845018387f, 0.980108320713043f, -0.139628127217293f, + 0.980001091957092f, -0.139996320009232f, 0.979893565177917f, -0.140364438295364f, + 0.979785740375519f, -0.140732467174530f, 0.979677677154541f, -0.141100421547890f, + 0.979569315910339f, -0.141468286514282f, 0.979460656642914f, -0.141836062073708f, + 0.979351758956909f, -0.142203763127327f, 0.979242503643036f, -0.142571389675140f, + 0.979133009910584f, -0.142938911914825f, 0.979023277759552f, -0.143306359648705f, + 0.978913187980652f, -0.143673732876778f, 0.978802859783173f, -0.144041016697884f, + 0.978692233562469f, -0.144408211112022f, 0.978581368923187f, -0.144775316119194f, + 0.978470146656036f, -0.145142331719399f, 0.978358685970306f, -0.145509272813797f, + 0.978246986865997f, -0.145876124501228f, 0.978134930133820f, -0.146242901682854f, + 0.978022634983063f, -0.146609574556351f, 0.977910041809082f, -0.146976172924042f, + 0.977797150611877f, -0.147342681884766f, 0.977684020996094f, -0.147709101438522f, + 0.977570593357086f, -0.148075446486473f, 0.977456867694855f, -0.148441687226295f, + 0.977342903614044f, -0.148807853460312f, 0.977228581905365f, -0.149173930287361f, + 0.977114021778107f, -0.149539917707443f, 0.976999223232269f, -0.149905815720558f, + 0.976884067058563f, -0.150271624326706f, 0.976768672466278f, -0.150637343525887f, + 0.976653039455414f, -0.151002973318100f, 0.976537048816681f, -0.151368513703346f, + 0.976420819759369f, -0.151733979582787f, 0.976304292678833f, -0.152099341154099f, + 0.976187527179718f, -0.152464613318443f, 0.976070404052734f, -0.152829796075821f, + 0.975953042507172f, -0.153194904327393f, 0.975835442543030f, -0.153559908270836f, + 0.975717484951019f, -0.153924822807312f, 0.975599288940430f, -0.154289647936821f, + 0.975480854511261f, -0.154654383659363f, 0.975362062454224f, -0.155019029974937f, + 0.975243031978607f, -0.155383571982384f, 0.975123703479767f, -0.155748039484024f, + 0.975004136562347f, -0.156112402677536f, 0.974884271621704f, -0.156476691365242f, + 0.974764108657837f, -0.156840875744820f, 0.974643647670746f, -0.157204970717430f, + 0.974522948265076f, -0.157568961381912f, 0.974401950836182f, -0.157932877540588f, + 0.974280655384064f, -0.158296689391136f, 0.974159121513367f, -0.158660411834717f, + 0.974037289619446f, -0.159024044871330f, 0.973915159702301f, -0.159387573599815f, + 0.973792791366577f, -0.159751012921333f, 0.973670125007629f, -0.160114362835884f, + 0.973547160625458f, -0.160477623343468f, 0.973423957824707f, -0.160840779542923f, + 0.973300457000732f, -0.161203846335411f, 0.973176658153534f, -0.161566808819771f, + 0.973052620887756f, -0.161929681897163f, 0.972928285598755f, -0.162292465567589f, + 0.972803652286530f, -0.162655144929886f, 0.972678780555725f, -0.163017734885216f, + 0.972553610801697f, -0.163380220532417f, 0.972428143024445f, -0.163742616772652f, + 0.972302436828613f, -0.164104923605919f, 0.972176432609558f, -0.164467126131058f, + 0.972050130367279f, -0.164829224348068f, 0.971923589706421f, -0.165191248059273f, + 0.971796751022339f, -0.165553152561188f, 0.971669614315033f, -0.165914967656136f, + 0.971542239189148f, -0.166276678442955f, 0.971414566040039f, -0.166638299822807f, + 0.971286594867706f, -0.166999831795692f, 0.971158385276794f, -0.167361244559288f, + 0.971029877662659f, -0.167722567915916f, 0.970901072025299f, -0.168083801865578f, + 0.970772027969360f, -0.168444931507111f, 0.970642685890198f, -0.168805956840515f, + 0.970513105392456f, -0.169166877865791f, 0.970383226871490f, -0.169527709484100f, + 0.970253050327301f, -0.169888436794281f, 0.970122575759888f, -0.170249074697495f, + 0.969991862773895f, -0.170609608292580f, 0.969860911369324f, -0.170970037579536f, + 0.969729602336884f, -0.171330362558365f, 0.969598054885864f, -0.171690583229065f, + 0.969466269016266f, -0.172050714492798f, 0.969334125518799f, -0.172410741448402f, + 0.969201743602753f, -0.172770664095879f, 0.969069123268127f, -0.173130482435226f, + 0.968936204910278f, -0.173490211367607f, 0.968802988529205f, -0.173849821090698f, + 0.968669533729553f, -0.174209341406822f, 0.968535780906677f, -0.174568757414818f, + 0.968401730060577f, -0.174928069114685f, 0.968267440795898f, -0.175287276506424f, + 0.968132853507996f, -0.175646379590034f, 0.967997968196869f, -0.176005378365517f, + 0.967862844467163f, -0.176364272832870f, 0.967727422714233f, -0.176723077893257f, + 0.967591762542725f, -0.177081763744354f, 0.967455804347992f, -0.177440345287323f, + 0.967319548130035f, -0.177798837423325f, 0.967183053493500f, -0.178157210350037f, + 0.967046260833740f, -0.178515478968620f, 0.966909229755402f, -0.178873643279076f, + 0.966771900653839f, -0.179231703281403f, 0.966634273529053f, -0.179589673876762f, + 0.966496407985687f, -0.179947525262833f, 0.966358244419098f, -0.180305257439613f, + 0.966219842433929f, -0.180662900209427f, 0.966081082820892f, -0.181020438671112f, + 0.965942144393921f, -0.181377857923508f, 0.965802907943726f, -0.181735187768936f, + 0.965663373470306f, -0.182092398405075f, 0.965523540973663f, -0.182449504733086f, + 0.965383470058441f, -0.182806491851807f, 0.965243160724640f, -0.183163389563560f, + 0.965102493762970f, -0.183520168066025f, 0.964961588382721f, -0.183876842260361f, + 0.964820444583893f, -0.184233412146568f, 0.964679002761841f, -0.184589877724648f, + 0.964537262916565f, -0.184946224093437f, 0.964395284652710f, -0.185302466154099f, + 0.964253067970276f, -0.185658603906631f, 0.964110493659973f, -0.186014622449875f, + 0.963967680931091f, -0.186370536684990f, 0.963824629783630f, -0.186726331710815f, + 0.963681280612946f, -0.187082037329674f, 0.963537633419037f, -0.187437608838081f, + 0.963393747806549f, -0.187793090939522f, 0.963249564170837f, -0.188148453831673f, + 0.963105142116547f, -0.188503712415695f, 0.962960422039032f, -0.188858851790428f, + 0.962815403938293f, -0.189213871955872f, 0.962670147418976f, -0.189568802714348f, + 0.962524592876434f, -0.189923599362373f, 0.962378799915314f, -0.190278306603432f, + 0.962232708930969f, -0.190632879734039f, 0.962086379528046f, -0.190987363457680f, + 0.961939752101898f, -0.191341713070869f, 0.961792886257172f, -0.191695958375931f, + 0.961645722389221f, -0.192050099372864f, 0.961498260498047f, -0.192404121160507f, + 0.961350560188293f, -0.192758023738861f, 0.961202561855316f, -0.193111822009087f, + 0.961054325103760f, -0.193465501070023f, 0.960905790328979f, -0.193819075822830f, + 0.960757017135620f, -0.194172516465187f, 0.960607945919037f, -0.194525867700577f, + 0.960458636283875f, -0.194879084825516f, 0.960309028625488f, -0.195232197642326f, + 0.960159122943878f, -0.195585191249847f, 0.960008978843689f, -0.195938065648079f, + 0.959858596324921f, -0.196290835738182f, 0.959707856178284f, -0.196643486618996f, + 0.959556937217712f, -0.196996018290520f, 0.959405720233917f, -0.197348430752754f, + 0.959254205226898f, -0.197700738906860f, 0.959102451801300f, -0.198052927851677f, + 0.958950400352478f, -0.198404997587204f, 0.958798050880432f, -0.198756948113441f, + 0.958645522594452f, -0.199108779430389f, 0.958492636680603f, -0.199460506439209f, + 0.958339512348175f, -0.199812099337578f, 0.958186149597168f, -0.200163587927818f, + 0.958032488822937f, -0.200514942407608f, 0.957878530025482f, -0.200866192579269f, + 0.957724332809448f, -0.201217323541641f, 0.957569897174835f, -0.201568335294724f, + 0.957415163516998f, -0.201919227838516f, 0.957260131835938f, -0.202270001173019f, + 0.957104861736298f, -0.202620655298233f, 0.956949353218079f, -0.202971190214157f, + 0.956793546676636f, -0.203321605920792f, 0.956637442111969f, -0.203671902418137f, + 0.956481099128723f, -0.204022079706192f, 0.956324458122253f, -0.204372137784958f, + 0.956167578697205f, -0.204722076654434f, 0.956010460853577f, -0.205071896314621f, + 0.955853044986725f, -0.205421581864357f, 0.955695331096649f, -0.205771163105965f, + 0.955537378787994f, -0.206120610237122f, 0.955379128456116f, -0.206469938158989f, + 0.955220639705658f, -0.206819161772728f, 0.955061912536621f, -0.207168251276016f, + 0.954902827739716f, -0.207517206668854f, 0.954743564128876f, -0.207866057753563f, + 0.954584002494812f, -0.208214774727821f, 0.954424142837524f, -0.208563387393951f, + 0.954264044761658f, -0.208911851048470f, 0.954103708267212f, -0.209260210394859f, + 0.953943073749542f, -0.209608450531960f, 0.953782141208649f, -0.209956556558609f, + 0.953620970249176f, -0.210304543375969f, 0.953459560871124f, -0.210652396082878f, + 0.953297853469849f, -0.211000129580498f, 0.953135907649994f, -0.211347743868828f, + 0.952973663806915f, -0.211695238947868f, 0.952811121940613f, -0.212042599916458f, + 0.952648401260376f, -0.212389841675758f, 0.952485322952271f, -0.212736949324608f, + 0.952322065830231f, -0.213083937764168f, 0.952158451080322f, -0.213430806994438f, + 0.951994657516479f, -0.213777542114258f, 0.951830565929413f, -0.214124158024788f, + 0.951666176319122f, -0.214470639824867f, 0.951501548290253f, -0.214817002415657f, + 0.951336681842804f, -0.215163245797157f, 0.951171517372131f, -0.215509355068207f, + 0.951006054878235f, -0.215855330228806f, 0.950840353965759f, -0.216201186180115f, + 0.950674414634705f, -0.216546908020973f, 0.950508177280426f, -0.216892510652542f, + 0.950341701507568f, -0.217237979173660f, 0.950174987316132f, -0.217583328485489f, + 0.950007975101471f, -0.217928543686867f, 0.949840664863586f, -0.218273624777794f, + 0.949673116207123f, -0.218618586659431f, 0.949505329132080f, -0.218963414430618f, + 0.949337244033813f, -0.219308122992516f, 0.949168920516968f, -0.219652697443962f, + 0.949000298976898f, -0.219997137784958f, 0.948831439018250f, -0.220341444015503f, + 0.948662281036377f, -0.220685631036758f, 0.948492884635925f, -0.221029683947563f, + 0.948323249816895f, -0.221373617649078f, 0.948153316974640f, -0.221717402338982f, + 0.947983145713806f, -0.222061067819595f, 0.947812676429749f, -0.222404599189758f, + 0.947641968727112f, -0.222748011350632f, 0.947470963001251f, -0.223091274499893f, + 0.947299718856812f, -0.223434418439865f, 0.947128236293793f, -0.223777428269386f, + 0.946956455707550f, -0.224120303988457f, 0.946784436702728f, -0.224463045597076f, + 0.946612179279327f, -0.224805667996407f, 0.946439623832703f, -0.225148141384125f, + 0.946266770362854f, -0.225490495562553f, 0.946093678474426f, -0.225832715630531f, + 0.945920348167419f, -0.226174786686897f, 0.945746779441834f, -0.226516738533974f, + 0.945572853088379f, -0.226858556270599f, 0.945398747920990f, -0.227200239896774f, + 0.945224344730377f, -0.227541789412498f, 0.945049703121185f, -0.227883204817772f, + 0.944874763488770f, -0.228224486112595f, 0.944699645042419f, -0.228565633296967f, + 0.944524168968201f, -0.228906646370888f, 0.944348454475403f, -0.229247525334358f, + 0.944172501564026f, -0.229588270187378f, 0.943996310234070f, -0.229928880929947f, + 0.943819820880890f, -0.230269357562065f, 0.943643093109131f, -0.230609700083733f, + 0.943466067314148f, -0.230949893593788f, 0.943288803100586f, -0.231289967894554f, + 0.943111240863800f, -0.231629893183708f, 0.942933499813080f, -0.231969684362412f, + 0.942755401134491f, -0.232309341430664f, 0.942577123641968f, -0.232648864388466f, + 0.942398548126221f, -0.232988253235817f, 0.942219734191895f, -0.233327493071556f, + 0.942040622234344f, -0.233666598796844f, 0.941861271858215f, -0.234005570411682f, + 0.941681683063507f, -0.234344407916069f, 0.941501796245575f, -0.234683111310005f, + 0.941321671009064f, -0.235021665692329f, 0.941141307353973f, -0.235360085964203f, + 0.940960645675659f, -0.235698372125626f, 0.940779745578766f, -0.236036509275436f, + 0.940598547458649f, -0.236374512314796f, 0.940417110919952f, -0.236712381243706f, + 0.940235435962677f, -0.237050101161003f, 0.940053522586823f, -0.237387686967850f, + 0.939871311187744f, -0.237725138664246f, 0.939688861370087f, -0.238062441349030f, + 0.939506113529205f, -0.238399609923363f, 0.939323127269745f, -0.238736644387245f, + 0.939139902591705f, -0.239073529839516f, 0.938956379890442f, -0.239410281181335f, + 0.938772618770599f, -0.239746883511543f, 0.938588619232178f, -0.240083336830139f, + 0.938404381275177f, -0.240419670939446f, 0.938219845294952f, -0.240755841135979f, + 0.938035070896149f, -0.241091892123222f, 0.937849998474121f, -0.241427779197693f, + 0.937664687633514f, -0.241763532161713f, 0.937479138374329f, -0.242099151015282f, + 0.937293350696564f, -0.242434620857239f, 0.937107264995575f, -0.242769956588745f, + 0.936920940876007f, -0.243105143308640f, 0.936734318733215f, -0.243440181016922f, + 0.936547517776489f, -0.243775084614754f, 0.936360359191895f, -0.244109839200974f, + 0.936173021793365f, -0.244444444775581f, 0.935985386371613f, -0.244778916239738f, + 0.935797572135925f, -0.245113238692284f, 0.935609400272369f, -0.245447427034378f, + 0.935421049594879f, -0.245781451463699f, 0.935232400894165f, -0.246115356683731f, + 0.935043513774872f, -0.246449097990990f, 0.934854328632355f, -0.246782705187798f, + 0.934664964675903f, -0.247116148471832f, 0.934475243091583f, -0.247449472546577f, + 0.934285342693329f, -0.247782632708550f, 0.934095203876495f, -0.248115643858910f, + 0.933904767036438f, -0.248448520898819f, 0.933714091777802f, -0.248781248927116f, + 0.933523118495941f, -0.249113827943802f, 0.933331906795502f, -0.249446272850037f, + 0.933140456676483f, -0.249778553843498f, 0.932948768138886f, -0.250110685825348f, + 0.932756841182709f, -0.250442683696747f, 0.932564616203308f, -0.250774532556534f, + 0.932372152805328f, -0.251106232404709f, 0.932179391384125f, -0.251437783241272f, + 0.931986451148987f, -0.251769185066223f, 0.931793212890625f, -0.252100437879562f, + 0.931599736213684f, -0.252431541681290f, 0.931405961513519f, -0.252762526273727f, + 0.931211948394775f, -0.253093332052231f, 0.931017756462097f, -0.253423988819122f, + 0.930823206901550f, -0.253754496574402f, 0.930628478527069f, -0.254084855318069f, + 0.930433452129364f, -0.254415065050125f, 0.930238187313080f, -0.254745125770569f, + 0.930042684078217f, -0.255075037479401f, 0.929846942424774f, -0.255404800176620f, + 0.929650902748108f, -0.255734413862228f, 0.929454624652863f, -0.256063878536224f, + 0.929258108139038f, -0.256393194198608f, 0.929061353206635f, -0.256722360849380f, + 0.928864300251007f, -0.257051378488541f, 0.928667008876801f, -0.257380217313766f, + 0.928469479084015f, -0.257708936929703f, 0.928271710872650f, -0.258037507534027f, + 0.928073644638062f, -0.258365899324417f, 0.927875399589539f, -0.258694142103195f, + 0.927676856517792f, -0.259022265672684f, 0.927478015422821f, -0.259350210428238f, + 0.927278995513916f, -0.259678006172180f, 0.927079677581787f, -0.260005623102188f, + 0.926880121231079f, -0.260333120822906f, 0.926680326461792f, -0.260660469532013f, + 0.926480293273926f, -0.260987639427185f, 0.926280021667480f, -0.261314690113068f, + 0.926079452037811f, -0.261641561985016f, 0.925878643989563f, -0.261968284845352f, + 0.925677597522736f, -0.262294828891754f, 0.925476312637329f, -0.262621253728867f, + 0.925274729728699f, -0.262947499752045f, 0.925072908401489f, -0.263273626565933f, + 0.924870908260345f, -0.263599574565887f, 0.924668610095978f, -0.263925373554230f, + 0.924466013908386f, -0.264250993728638f, 0.924263238906860f, -0.264576494693756f, + 0.924060165882111f, -0.264901816844940f, 0.923856854438782f, -0.265226989984512f, + 0.923653304576874f, -0.265552014112473f, 0.923449516296387f, -0.265876859426498f, + 0.923245489597321f, -0.266201555728912f, 0.923041164875031f, -0.266526103019714f, + 0.922836601734161f, -0.266850501298904f, 0.922631800174713f, -0.267174720764160f, + 0.922426760196686f, -0.267498821020126f, 0.922221481800079f, -0.267822742462158f, + 0.922015964984894f, -0.268146485090256f, 0.921810150146484f, -0.268470078706741f, + 0.921604096889496f, -0.268793523311615f, 0.921397805213928f, -0.269116818904877f, + 0.921191275119781f, -0.269439965486526f, 0.920984506607056f, -0.269762933254242f, + 0.920777499675751f, -0.270085722208023f, 0.920570194721222f, -0.270408391952515f, + 0.920362710952759f, -0.270730882883072f, 0.920154929161072f, -0.271053224802017f, + 0.919946908950806f, -0.271375387907028f, 0.919738650321960f, -0.271697402000427f, + 0.919530093669891f, -0.272019267082214f, 0.919321358203888f, -0.272340953350067f, + 0.919112324714661f, -0.272662490606308f, 0.918903112411499f, -0.272983878850937f, + 0.918693602085114f, -0.273305088281631f, 0.918483853340149f, -0.273626148700714f, + 0.918273866176605f, -0.273947030305862f, 0.918063640594482f, -0.274267762899399f, + 0.917853116989136f, -0.274588316679001f, 0.917642414569855f, -0.274908751249313f, + 0.917431414127350f, -0.275228977203369f, 0.917220234870911f, -0.275549083948135f, + 0.917008757591248f, -0.275868982076645f, 0.916797041893005f, -0.276188760995865f, + 0.916585087776184f, -0.276508361101151f, 0.916372895240784f, -0.276827782392502f, + 0.916160404682159f, -0.277147054672241f, 0.915947735309601f, -0.277466177940369f, + 0.915734827518463f, -0.277785122394562f, 0.915521621704102f, -0.278103888034821f, + 0.915308177471161f, -0.278422504663467f, 0.915094554424286f, -0.278740972280502f, + 0.914880633354187f, -0.279059261083603f, 0.914666473865509f, -0.279377400875092f, + 0.914452075958252f, -0.279695361852646f, 0.914237439632416f, -0.280013144016266f, + 0.914022505283356f, -0.280330777168274f, 0.913807392120361f, -0.280648261308670f, + 0.913592040538788f, -0.280965566635132f, 0.913376390933990f, -0.281282693147659f, + 0.913160502910614f, -0.281599670648575f, 0.912944436073303f, -0.281916469335556f, + 0.912728071212769f, -0.282233119010925f, 0.912511467933655f, -0.282549589872360f, + 0.912294626235962f, -0.282865911722183f, 0.912077546119690f, -0.283182054758072f, + 0.911860227584839f, -0.283498018980026f, 0.911642670631409f, -0.283813834190369f, + 0.911424875259399f, -0.284129470586777f, 0.911206841468811f, -0.284444957971573f, + 0.910988569259644f, -0.284760266542435f, 0.910769999027252f, -0.285075396299362f, + 0.910551249980927f, -0.285390377044678f, 0.910332262516022f, -0.285705178976059f, + 0.910112977027893f, -0.286019802093506f, 0.909893512725830f, -0.286334276199341f, + 0.909673750400543f, -0.286648571491241f, 0.909453809261322f, -0.286962717771530f, + 0.909233570098877f, -0.287276685237885f, 0.909013092517853f, -0.287590473890305f, + 0.908792436122894f, -0.287904083728790f, 0.908571481704712f, -0.288217544555664f, + 0.908350288867950f, -0.288530826568604f, 0.908128857612610f, -0.288843959569931f, + 0.907907187938690f, -0.289156883955002f, 0.907685279846191f, -0.289469659328461f, + 0.907463192939758f, -0.289782285690308f, 0.907240808010101f, -0.290094703435898f, + 0.907018184661865f, -0.290406972169876f, 0.906795322895050f, -0.290719062089920f, + 0.906572222709656f, -0.291031002998352f, 0.906348884105682f, -0.291342735290527f, + 0.906125307083130f, -0.291654318571091f, 0.905901491641998f, -0.291965723037720f, + 0.905677437782288f, -0.292276978492737f, 0.905453145503998f, -0.292588025331497f, + 0.905228614807129f, -0.292898923158646f, 0.905003845691681f, -0.293209642171860f, + 0.904778838157654f, -0.293520182371140f, 0.904553592205048f, -0.293830573558807f, + 0.904328107833862f, -0.294140785932541f, 0.904102385044098f, -0.294450789690018f, + 0.903876423835754f, -0.294760644435883f, 0.903650224208832f, -0.295070350170136f, + 0.903423786163330f, -0.295379847288132f, 0.903197109699249f, -0.295689195394516f, + 0.902970194816589f, -0.295998334884644f, 0.902743041515350f, -0.296307325363159f, + 0.902515649795532f, -0.296616137027740f, 0.902288019657135f, -0.296924799680710f, + 0.902060210704803f, -0.297233253717422f, 0.901832103729248f, -0.297541528940201f, + 0.901603758335114f, -0.297849655151367f, 0.901375174522400f, -0.298157602548599f, + 0.901146411895752f, -0.298465341329575f, 0.900917351245880f, -0.298772931098938f, + 0.900688111782074f, -0.299080342054367f, 0.900458574295044f, -0.299387603998184f, + 0.900228857994080f, -0.299694657325745f, 0.899998843669891f, -0.300001531839371f, + 0.899768650531769f, -0.300308227539063f, 0.899538159370422f, -0.300614774227142f, + 0.899307489395142f, -0.300921112298965f, 0.899076581001282f, -0.301227301359177f, + 0.898845434188843f, -0.301533311605453f, 0.898614048957825f, -0.301839113235474f, + 0.898382425308228f, -0.302144765853882f, 0.898150563240051f, -0.302450239658356f, + 0.897918462753296f, -0.302755534648895f, 0.897686123847961f, -0.303060621023178f, + 0.897453546524048f, -0.303365558385849f, 0.897220790386200f, -0.303670316934586f, + 0.896987736225128f, -0.303974896669388f, 0.896754503250122f, -0.304279297590256f, + 0.896520972251892f, -0.304583519697189f, 0.896287262439728f, -0.304887533187866f, + 0.896053314208984f, -0.305191397666931f, 0.895819067955017f, -0.305495083332062f, + 0.895584642887115f, -0.305798590183258f, 0.895349979400635f, -0.306101888418198f, + 0.895115137100220f, -0.306405037641525f, 0.894879996776581f, -0.306708008050919f, + 0.894644618034363f, -0.307010769844055f, 0.894409060478210f, -0.307313382625580f, + 0.894173204898834f, -0.307615786790848f, 0.893937170505524f, -0.307918041944504f, + 0.893700897693634f, -0.308220088481903f, 0.893464326858521f, -0.308521956205368f, + 0.893227577209473f, -0.308823645114899f, 0.892990648746490f, -0.309125155210495f, + 0.892753422260284f, -0.309426486492157f, 0.892515957355499f, -0.309727638959885f, + 0.892278313636780f, -0.310028612613678f, 0.892040371894836f, -0.310329377651215f, + 0.891802251338959f, -0.310629993677139f, 0.891563892364502f, -0.310930401086807f, + 0.891325294971466f, -0.311230629682541f, 0.891086459159851f, -0.311530679464340f, + 0.890847444534302f, -0.311830550432205f, 0.890608131885529f, -0.312130242586136f, + 0.890368640422821f, -0.312429755926132f, 0.890128850936890f, -0.312729060649872f, + 0.889888882637024f, -0.313028186559677f, 0.889648675918579f, -0.313327133655548f, + 0.889408230781555f, -0.313625901937485f, 0.889167606830597f, -0.313924491405487f, + 0.888926684856415f, -0.314222872257233f, 0.888685584068298f, -0.314521104097366f, + 0.888444244861603f, -0.314819127321243f, 0.888202667236328f, -0.315116971731186f, + 0.887960851192474f, -0.315414607524872f, 0.887718796730042f, -0.315712094306946f, + 0.887476563453674f, -0.316009372472763f, 0.887234091758728f, -0.316306471824646f, + 0.886991322040558f, -0.316603392362595f, 0.886748373508453f, -0.316900104284287f, + 0.886505246162415f, -0.317196637392044f, 0.886261820793152f, -0.317492991685867f, + 0.886018216609955f, -0.317789167165756f, 0.885774314403534f, -0.318085134029388f, + 0.885530233383179f, -0.318380922079086f, 0.885285973548889f, -0.318676531314850f, + 0.885041415691376f, -0.318971961736679f, 0.884796679019928f, -0.319267183542252f, + 0.884551644325256f, -0.319562226533890f, 0.884306430816650f, -0.319857090711594f, + 0.884061038494110f, -0.320151746273041f, 0.883815348148346f, -0.320446223020554f, + 0.883569478988647f, -0.320740520954132f, 0.883323311805725f, -0.321034610271454f, + 0.883076965808868f, -0.321328520774841f, 0.882830440998077f, -0.321622252464294f, + 0.882583618164063f, -0.321915775537491f, 0.882336616516113f, -0.322209119796753f, + 0.882089376449585f, -0.322502255439758f, 0.881841897964478f, -0.322795242071152f, + 0.881594181060791f, -0.323088020086288f, 0.881346285343170f, -0.323380589485168f, + 0.881098151206970f, -0.323672980070114f, 0.880849778652191f, -0.323965191841125f, + 0.880601167678833f, -0.324257194995880f, 0.880352377891541f, -0.324549019336700f, + 0.880103349685669f, -0.324840664863586f, 0.879854083061218f, -0.325132101774216f, + 0.879604578018188f, -0.325423330068588f, 0.879354894161224f, -0.325714409351349f, + 0.879104971885681f, -0.326005280017853f, 0.878854811191559f, -0.326295942068100f, + 0.878604412078857f, -0.326586425304413f, 0.878353834152222f, -0.326876699924469f, + 0.878103017807007f, -0.327166795730591f, 0.877851963043213f, -0.327456712722778f, + 0.877600669860840f, -0.327746421098709f, 0.877349197864532f, -0.328035950660706f, + 0.877097487449646f, -0.328325271606445f, 0.876845538616180f, -0.328614413738251f, + 0.876593410968781f, -0.328903347253799f, 0.876341044902802f, -0.329192101955414f, + 0.876088440418243f, -0.329480648040771f, 0.875835597515106f, -0.329769015312195f, + 0.875582575798035f, -0.330057173967361f, 0.875329315662384f, -0.330345153808594f, + 0.875075817108154f, -0.330632925033569f, 0.874822139739990f, -0.330920487642288f, + 0.874568223953247f, -0.331207901239395f, 0.874314069747925f, -0.331495076417923f, + 0.874059677124023f, -0.331782072782516f, 0.873805105686188f, -0.332068890333176f, + 0.873550295829773f, -0.332355499267578f, 0.873295307159424f, -0.332641899585724f, + 0.873040020465851f, -0.332928121089935f, 0.872784554958344f, -0.333214133977890f, + 0.872528910636902f, -0.333499968051910f, 0.872272968292236f, -0.333785593509674f, + 0.872016847133636f, -0.334071010351181f, 0.871760547161102f, -0.334356248378754f, + 0.871503949165344f, -0.334641307592392f, 0.871247172355652f, -0.334926128387451f, + 0.870990216732025f, -0.335210770368576f, 0.870733022689819f, -0.335495233535767f, + 0.870475590229034f, -0.335779488086700f, 0.870217919349670f, -0.336063534021378f, + 0.869960069656372f, -0.336347371339798f, 0.869701981544495f, -0.336631029844284f, + 0.869443655014038f, -0.336914509534836f, 0.869185149669647f, -0.337197750806808f, + 0.868926405906677f, -0.337480813264847f, 0.868667483329773f, -0.337763696908951f, + 0.868408262729645f, -0.338046342134476f, 0.868148922920227f, -0.338328808546066f, + 0.867889285087585f, -0.338611096143723f, 0.867629468441010f, -0.338893145322800f, + 0.867369413375854f, -0.339175015687943f, 0.867109179496765f, -0.339456677436829f, + 0.866848707199097f, -0.339738160371780f, 0.866588056087494f, -0.340019434690475f, + 0.866327106952667f, -0.340300500392914f, 0.866066038608551f, -0.340581357479095f, + 0.865804672241211f, -0.340862035751343f, 0.865543127059937f, -0.341142505407333f, + 0.865281403064728f, -0.341422766447067f, 0.865019381046295f, -0.341702848672867f, + 0.864757239818573f, -0.341982692480087f, 0.864494800567627f, -0.342262357473373f, + 0.864232182502747f, -0.342541843652725f, 0.863969385623932f, -0.342821091413498f, + 0.863706290721893f, -0.343100160360336f, 0.863443076610565f, -0.343379020690918f, + 0.863179564476013f, -0.343657672405243f, 0.862915873527527f, -0.343936115503311f, + 0.862652003765106f, -0.344214379787445f, 0.862387895584106f, -0.344492435455322f, + 0.862123548984528f, -0.344770282506943f, 0.861859023571014f, -0.345047920942307f, + 0.861594259738922f, -0.345325350761414f, 0.861329257488251f, -0.345602601766586f, + 0.861064076423645f, -0.345879614353180f, 0.860798716545105f, -0.346156448125839f, + 0.860533118247986f, -0.346433073282242f, 0.860267281532288f, -0.346709519624710f, + 0.860001266002655f, -0.346985727548599f, 0.859735012054443f, -0.347261756658554f, + 0.859468579292297f, -0.347537547349930f, 0.859201908111572f, -0.347813159227371f, + 0.858934998512268f, -0.348088562488556f, 0.858667910099030f, -0.348363757133484f, + 0.858400642871857f, -0.348638743162155f, 0.858133137226105f, -0.348913550376892f, + 0.857865393161774f, -0.349188119173050f, 0.857597470283508f, -0.349462509155273f, + 0.857329368591309f, -0.349736660718918f, 0.857060968875885f, -0.350010633468628f, + 0.856792449951172f, -0.350284397602081f, 0.856523692607880f, -0.350557953119278f, + 0.856254696846008f, -0.350831300020218f, 0.855985522270203f, -0.351104438304901f, + 0.855716109275818f, -0.351377367973328f, 0.855446517467499f, -0.351650089025497f, + 0.855176687240601f, -0.351922631263733f, 0.854906618595123f, -0.352194935083389f, + 0.854636430740356f, -0.352467030286789f, 0.854365944862366f, -0.352738946676254f, + 0.854095339775085f, -0.353010624647141f, 0.853824436664581f, -0.353282123804092f, + 0.853553414344788f, -0.353553384542465f, 0.853282094001770f, -0.353824466466904f, + 0.853010654449463f, -0.354095309972763f, 0.852738916873932f, -0.354365974664688f, + 0.852467060089111f, -0.354636400938034f, 0.852194905281067f, -0.354906648397446f, + 0.851922631263733f, -0.355176687240601f, 0.851650118827820f, -0.355446487665176f, + 0.851377367973328f, -0.355716109275818f, 0.851104438304901f, -0.355985492467880f, + 0.850831270217896f, -0.356254696846008f, 0.850557923316956f, -0.356523662805557f, + 0.850284397602081f, -0.356792420148849f, 0.850010633468628f, -0.357060998678207f, + 0.849736690521240f, -0.357329338788986f, 0.849462509155273f, -0.357597470283508f, + 0.849188148975372f, -0.357865422964096f, 0.848913550376892f, -0.358133137226105f, + 0.848638772964478f, -0.358400642871857f, 0.848363757133484f, -0.358667939901352f, + 0.848088562488556f, -0.358935028314590f, 0.847813189029694f, -0.359201908111572f, + 0.847537577152252f, -0.359468549489975f, 0.847261726856232f, -0.359735012054443f, + 0.846985757350922f, -0.360001266002655f, 0.846709489822388f, -0.360267281532288f, + 0.846433103084564f, -0.360533088445663f, 0.846156477928162f, -0.360798716545105f, + 0.845879614353180f, -0.361064106225967f, 0.845602571964264f, -0.361329287290573f, + 0.845325350761414f, -0.361594229936600f, 0.845047891139984f, -0.361858993768692f, + 0.844770252704620f, -0.362123548984528f, 0.844492435455322f, -0.362387865781784f, + 0.844214379787445f, -0.362651973962784f, 0.843936145305634f, -0.362915903329849f, + 0.843657672405243f, -0.363179564476013f, 0.843379020690918f, -0.363443046808243f, + 0.843100130558014f, -0.363706320524216f, 0.842821121215820f, -0.363969355821610f, + 0.842541813850403f, -0.364232182502747f, 0.842262387275696f, -0.364494800567627f, + 0.841982722282410f, -0.364757210016251f, 0.841702818870544f, -0.365019410848618f, + 0.841422796249390f, -0.365281373262405f, 0.841142535209656f, -0.365543156862259f, + 0.840862035751343f, -0.365804702043533f, 0.840581357479095f, -0.366066008806229f, + 0.840300500392914f, -0.366327136754990f, 0.840019404888153f, -0.366588026285172f, + 0.839738130569458f, -0.366848707199097f, 0.839456677436829f, -0.367109179496765f, + 0.839175045490265f, -0.367369443178177f, 0.838893175125122f, -0.367629468441010f, + 0.838611066341400f, -0.367889285087585f, 0.838328838348389f, -0.368148893117905f, + 0.838046371936798f, -0.368408292531967f, 0.837763667106628f, -0.368667453527451f, + 0.837480843067169f, -0.368926405906677f, 0.837197780609131f, -0.369185149669647f, + 0.836914479732513f, -0.369443655014038f, 0.836631059646606f, -0.369701951742172f, + 0.836347401142120f, -0.369960039854050f, 0.836063504219055f, -0.370217919349670f, + 0.835779488086700f, -0.370475560426712f, 0.835495233535767f, -0.370732992887497f, + 0.835210800170898f, -0.370990216732025f, 0.834926128387451f, -0.371247202157974f, + 0.834641277790070f, -0.371503978967667f, 0.834356248378754f, -0.371760547161102f, + 0.834071040153503f, -0.372016876935959f, 0.833785593509674f, -0.372272998094559f, + 0.833499968051910f, -0.372528880834579f, 0.833214163780212f, -0.372784584760666f, + 0.832928121089935f, -0.373040050268173f, 0.832641899585724f, -0.373295277357101f, + 0.832355499267578f, -0.373550295829773f, 0.832068860530853f, -0.373805105686188f, + 0.831782102584839f, -0.374059677124023f, 0.831495106220245f, -0.374314039945602f, + 0.831207871437073f, -0.374568194150925f, 0.830920517444611f, -0.374822109937668f, + 0.830632925033569f, -0.375075817108154f, 0.830345153808594f, -0.375329315662384f, + 0.830057144165039f, -0.375582575798035f, 0.829769015312195f, -0.375835597515106f, + 0.829480648040771f, -0.376088410615921f, 0.829192101955414f, -0.376341015100479f, + 0.828903317451477f, -0.376593410968781f, 0.828614413738251f, -0.376845568418503f, + 0.828325271606445f, -0.377097487449646f, 0.828035950660706f, -0.377349197864532f, + 0.827746450901031f, -0.377600699663162f, 0.827456712722778f, -0.377851963043213f, + 0.827166795730591f, -0.378102988004684f, 0.826876699924469f, -0.378353834152222f, + 0.826586425304413f, -0.378604412078857f, 0.826295912265778f, -0.378854811191559f, + 0.826005280017853f, -0.379104942083359f, 0.825714409351349f, -0.379354894161224f, + 0.825423359870911f, -0.379604607820511f, 0.825132071971893f, -0.379854083061218f, + 0.824840664863586f, -0.380103349685669f, 0.824549019336700f, -0.380352377891541f, + 0.824257194995880f, -0.380601197481155f, 0.823965191841125f, -0.380849778652191f, + 0.823673009872437f, -0.381098151206970f, 0.823380589485168f, -0.381346285343170f, + 0.823087990283966f, -0.381594210863113f, 0.822795212268829f, -0.381841897964478f, + 0.822502255439758f, -0.382089376449585f, 0.822209119796753f, -0.382336616516113f, + 0.821915745735168f, -0.382583618164063f, 0.821622252464294f, -0.382830440998077f, + 0.821328520774841f, -0.383076995611191f, 0.821034610271454f, -0.383323341608047f, + 0.820740520954132f, -0.383569449186325f, 0.820446193218231f, -0.383815348148346f, + 0.820151746273041f, -0.384061008691788f, 0.819857060909271f, -0.384306460618973f, + 0.819562196731567f, -0.384551674127579f, 0.819267153739929f, -0.384796649217606f, + 0.818971931934357f, -0.385041415691376f, 0.818676531314850f, -0.385285943746567f, + 0.818380951881409f, -0.385530263185501f, 0.818085134029388f, -0.385774344205856f, + 0.817789137363434f, -0.386018186807632f, 0.817493021488190f, -0.386261820793152f, + 0.817196667194366f, -0.386505216360092f, 0.816900074481964f, -0.386748403310776f, + 0.816603362560272f, -0.386991351842880f, 0.816306471824646f, -0.387234061956406f, + 0.816009342670441f, -0.387476563453674f, 0.815712094306946f, -0.387718826532364f, + 0.815414607524872f, -0.387960851192474f, 0.815116941928864f, -0.388202667236328f, + 0.814819097518921f, -0.388444244861603f, 0.814521074295044f, -0.388685584068298f, + 0.814222872257233f, -0.388926714658737f, 0.813924491405487f, -0.389167606830597f, + 0.813625931739807f, -0.389408260583878f, 0.813327133655548f, -0.389648675918579f, + 0.813028216362000f, -0.389888882637024f, 0.812729060649872f, -0.390128880739212f, + 0.812429726123810f, -0.390368610620499f, 0.812130272388458f, -0.390608131885529f, + 0.811830580234528f, -0.390847414731979f, 0.811530709266663f, -0.391086459159851f, + 0.811230659484863f, -0.391325294971466f, 0.810930430889130f, -0.391563892364502f, + 0.810629963874817f, -0.391802251338959f, 0.810329377651215f, -0.392040401697159f, + 0.810028612613678f, -0.392278283834457f, 0.809727668762207f, -0.392515957355499f, + 0.809426486492157f, -0.392753422260284f, 0.809125185012817f, -0.392990618944168f, + 0.808823645114899f, -0.393227607011795f, 0.808521986007690f, -0.393464356660843f, + 0.808220088481903f, -0.393700867891312f, 0.807918012142181f, -0.393937170505524f, + 0.807615816593170f, -0.394173204898834f, 0.807313382625580f, -0.394409030675888f, + 0.807010769844055f, -0.394644618034363f, 0.806707978248596f, -0.394879996776581f, + 0.806405067443848f, -0.395115107297897f, 0.806101918220520f, -0.395350009202957f, + 0.805798590183258f, -0.395584672689438f, 0.805495083332062f, -0.395819097757339f, + 0.805191397666931f, -0.396053284406662f, 0.804887533187866f, -0.396287262439728f, + 0.804583489894867f, -0.396520972251892f, 0.804279267787933f, -0.396754473447800f, + 0.803974866867065f, -0.396987736225128f, 0.803670346736908f, -0.397220760583878f, + 0.803365588188171f, -0.397453576326370f, 0.803060650825500f, -0.397686123847961f, + 0.802755534648895f, -0.397918462753296f, 0.802450239658356f, -0.398150533437729f, + 0.802144765853882f, -0.398382395505905f, 0.801839113235474f, -0.398614019155502f, + 0.801533281803131f, -0.398845434188843f, 0.801227271556854f, -0.399076581001282f, + 0.800921142101288f, -0.399307489395142f, 0.800614774227142f, -0.399538189172745f, + 0.800308227539063f, -0.399768620729446f, 0.800001561641693f, -0.399998843669891f, + 0.799694657325745f, -0.400228828191757f, 0.799387574195862f, -0.400458574295044f, + 0.799080371856689f, -0.400688081979752f, 0.798772931098938f, -0.400917351245880f, + 0.798465371131897f, -0.401146411895752f, 0.798157572746277f, -0.401375204324722f, + 0.797849655151367f, -0.401603758335114f, 0.797541558742523f, -0.401832103729248f, + 0.797233223915100f, -0.402060180902481f, 0.796924769878387f, -0.402288049459457f, + 0.796616137027740f, -0.402515679597855f, 0.796307325363159f, -0.402743041515350f, + 0.795998334884644f, -0.402970194816589f, 0.795689165592194f, -0.403197109699249f, + 0.795379877090454f, -0.403423786163330f, 0.795070350170136f, -0.403650224208832f, + 0.794760644435883f, -0.403876423835754f, 0.794450819492340f, -0.404102355241776f, + 0.794140756130219f, -0.404328078031540f, 0.793830573558807f, -0.404553562402725f, + 0.793520212173462f, -0.404778808355331f, 0.793209671974182f, -0.405003815889359f, + 0.792898952960968f, -0.405228585004807f, 0.792588055133820f, -0.405453115701675f, + 0.792276978492737f, -0.405677437782288f, 0.791965723037720f, -0.405901491641998f, + 0.791654348373413f, -0.406125307083130f, 0.791342735290527f, -0.406348884105682f, + 0.791031002998352f, -0.406572192907333f, 0.790719091892242f, -0.406795293092728f, + 0.790407001972198f, -0.407018154859543f, 0.790094733238220f, -0.407240778207779f, + 0.789782285690308f, -0.407463163137436f, 0.789469659328461f, -0.407685309648514f, + 0.789156913757324f, -0.407907217741013f, 0.788843929767609f, -0.408128857612610f, + 0.788530826568604f, -0.408350288867950f, 0.788217544555664f, -0.408571451902390f, + 0.787904083728790f, -0.408792406320572f, 0.787590444087982f, -0.409013092517853f, + 0.787276685237885f, -0.409233570098877f, 0.786962687969208f, -0.409453779459000f, + 0.786648571491241f, -0.409673750400543f, 0.786334276199341f, -0.409893482923508f, + 0.786019802093506f, -0.410112977027893f, 0.785705149173737f, -0.410332232713699f, + 0.785390377044678f, -0.410551249980927f, 0.785075426101685f, -0.410770028829575f, + 0.784760236740112f, -0.410988569259644f, 0.784444928169250f, -0.411206841468811f, + 0.784129500389099f, -0.411424905061722f, 0.783813834190369f, -0.411642700433731f, + 0.783498048782349f, -0.411860257387161f, 0.783182024955750f, -0.412077575922012f, + 0.782865881919861f, -0.412294656038284f, 0.782549619674683f, -0.412511497735977f, + 0.782233119010925f, -0.412728071212769f, 0.781916499137878f, -0.412944436073303f, + 0.781599700450897f, -0.413160532712936f, 0.781282722949982f, -0.413376390933990f, + 0.780965566635132f, -0.413592010736465f, 0.780648231506348f, -0.413807392120361f, + 0.780330777168274f, -0.414022535085678f, 0.780013144016266f, -0.414237409830093f, + 0.779695332050323f, -0.414452046155930f, 0.779377400875092f, -0.414666473865509f, + 0.779059290885925f, -0.414880603551865f, 0.778741002082825f, -0.415094524621964f, + 0.778422534465790f, -0.415308207273483f, 0.778103888034821f, -0.415521621704102f, + 0.777785122394562f, -0.415734797716141f, 0.777466177940369f, -0.415947735309601f, + 0.777147054672241f, -0.416160434484482f, 0.776827812194824f, -0.416372895240784f, + 0.776508331298828f, -0.416585087776184f, 0.776188731193542f, -0.416797041893005f, + 0.775869011878967f, -0.417008757591248f, 0.775549054145813f, -0.417220205068588f, + 0.775228977203369f, -0.417431443929672f, 0.774908721446991f, -0.417642414569855f, + 0.774588346481323f, -0.417853146791458f, 0.774267733097076f, -0.418063640594482f, + 0.773947000503540f, -0.418273866176605f, 0.773626148700714f, -0.418483853340149f, + 0.773305058479309f, -0.418693602085114f, 0.772983849048615f, -0.418903112411499f, + 0.772662520408630f, -0.419112354516983f, 0.772340953350067f, -0.419321358203888f, + 0.772019267082214f, -0.419530123472214f, 0.771697402000427f, -0.419738620519638f, + 0.771375417709351f, -0.419946908950806f, 0.771053194999695f, -0.420154929161072f, + 0.770730912685394f, -0.420362681150436f, 0.770408391952515f, -0.420570224523544f, + 0.770085752010345f, -0.420777499675751f, 0.769762933254242f, -0.420984506607056f, + 0.769439935684204f, -0.421191304922104f, 0.769116818904877f, -0.421397835016251f, + 0.768793523311615f, -0.421604126691818f, 0.768470108509064f, -0.421810150146484f, + 0.768146514892578f, -0.422015935182571f, 0.767822742462158f, -0.422221481800079f, + 0.767498791217804f, -0.422426789999008f, 0.767174720764160f, -0.422631829977036f, + 0.766850471496582f, -0.422836631536484f, 0.766526103019714f, -0.423041164875031f, + 0.766201555728912f, -0.423245459794998f, 0.765876889228821f, -0.423449516296387f, + 0.765551984310150f, -0.423653304576874f, 0.765226960182190f, -0.423856884241104f, + 0.764901816844940f, -0.424060165882111f, 0.764576494693756f, -0.424263238906860f, + 0.764250993728638f, -0.424466013908386f, 0.763925373554230f, -0.424668580293655f, + 0.763599574565887f, -0.424870878458023f, 0.763273596763611f, -0.425072938203812f, + 0.762947499752045f, -0.425274729728699f, 0.762621283531189f, -0.425476282835007f, + 0.762294828891754f, -0.425677597522736f, 0.761968255043030f, -0.425878643989563f, + 0.761641561985016f, -0.426079452037811f, 0.761314690113068f, -0.426279991865158f, + 0.760987639427185f, -0.426480293273926f, 0.760660469532013f, -0.426680356264114f, + 0.760333120822906f, -0.426880151033401f, 0.760005652904511f, -0.427079707384110f, + 0.759678006172180f, -0.427278995513916f, 0.759350180625916f, -0.427478045225143f, + 0.759022235870361f, -0.427676826715469f, 0.758694171905518f, -0.427875369787216f, + 0.758365929126740f, -0.428073674440384f, 0.758037507534027f, -0.428271710872650f, + 0.757708966732025f, -0.428469479084015f, 0.757380247116089f, -0.428667008876801f, + 0.757051348686218f, -0.428864300251007f, 0.756722390651703f, -0.429061323404312f, + 0.756393194198608f, -0.429258108139038f, 0.756063878536224f, -0.429454624652863f, + 0.755734443664551f, -0.429650902748108f, 0.755404829978943f, -0.429846942424774f, + 0.755075037479401f, -0.430042684078217f, 0.754745125770569f, -0.430238217115402f, + 0.754415094852448f, -0.430433481931686f, 0.754084885120392f, -0.430628478527069f, + 0.753754496574402f, -0.430823236703873f, 0.753423988819122f, -0.431017726659775f, + 0.753093302249908f, -0.431211978197098f, 0.752762496471405f, -0.431405961513519f, + 0.752431571483612f, -0.431599706411362f, 0.752100467681885f, -0.431793183088303f, + 0.751769185066223f, -0.431986421346664f, 0.751437783241272f, -0.432179391384125f, + 0.751106262207031f, -0.432372123003006f, 0.750774562358856f, -0.432564586400986f, + 0.750442683696747f, -0.432756811380386f, 0.750110685825348f, -0.432948768138886f, + 0.749778568744659f, -0.433140486478806f, 0.749446272850037f, -0.433331936597824f, + 0.749113857746124f, -0.433523118495941f, 0.748781263828278f, -0.433714061975479f, + 0.748448550701141f, -0.433904737234116f, 0.748115658760071f, -0.434095174074173f, + 0.747782647609711f, -0.434285342693329f, 0.747449457645416f, -0.434475272893906f, + 0.747116148471832f, -0.434664934873581f, 0.746782720088959f, -0.434854328632355f, + 0.746449112892151f, -0.435043483972549f, 0.746115326881409f, -0.435232400894165f, + 0.745781481266022f, -0.435421019792557f, 0.745447397232056f, -0.435609430074692f, + 0.745113253593445f, -0.435797542333603f, 0.744778931140900f, -0.435985416173935f, + 0.744444429874420f, -0.436173021793365f, 0.744109809398651f, -0.436360388994217f, + 0.743775069713593f, -0.436547487974167f, 0.743440151214600f, -0.436734348535538f, + 0.743105113506317f, -0.436920911073685f, 0.742769956588745f, -0.437107264995575f, + 0.742434620857239f, -0.437293320894241f, 0.742099165916443f, -0.437479138374329f, + 0.741763532161713f, -0.437664687633514f, 0.741427779197693f, -0.437849998474121f, + 0.741091907024384f, -0.438035041093826f, 0.740755856037140f, -0.438219845294952f, + 0.740419685840607f, -0.438404351472855f, 0.740083336830139f, -0.438588619232178f, + 0.739746868610382f, -0.438772648572922f, 0.739410281181335f, -0.438956409692764f, + 0.739073514938354f, -0.439139902591705f, 0.738736629486084f, -0.439323127269745f, + 0.738399624824524f, -0.439506113529205f, 0.738062441349030f, -0.439688831567764f, + 0.737725138664246f, -0.439871311187744f, 0.737387716770172f, -0.440053492784500f, + 0.737050116062164f, -0.440235435962677f, 0.736712396144867f, -0.440417140722275f, + 0.736374497413635f, -0.440598547458649f, 0.736036539077759f, -0.440779715776443f, + 0.735698342323303f, -0.440960645675659f, 0.735360085964203f, -0.441141277551651f, + 0.735021650791168f, -0.441321671009064f, 0.734683096408844f, -0.441501796245575f, + 0.734344422817230f, -0.441681683063507f, 0.734005570411682f, -0.441861271858215f, + 0.733666598796844f, -0.442040622234344f, 0.733327507972717f, -0.442219734191895f, + 0.732988238334656f, -0.442398548126221f, 0.732648849487305f, -0.442577123641968f, + 0.732309341430664f, -0.442755430936813f, 0.731969714164734f, -0.442933470010757f, + 0.731629908084869f, -0.443111270666122f, 0.731289982795715f, -0.443288803100586f, + 0.730949878692627f, -0.443466067314148f, 0.730609714984894f, -0.443643063306808f, + 0.730269372463226f, -0.443819820880890f, 0.729928910732269f, -0.443996280431747f, + 0.729588270187378f, -0.444172531366348f, 0.729247510433197f, -0.444348484277725f, + 0.728906631469727f, -0.444524168968201f, 0.728565633296967f, -0.444699615240097f, + 0.728224515914917f, -0.444874793291092f, 0.727883219718933f, -0.445049703121185f, + 0.727541804313660f, -0.445224374532700f, 0.727200269699097f, -0.445398747920990f, + 0.726858556270599f, -0.445572882890701f, 0.726516723632813f, -0.445746749639511f, + 0.726174771785736f, -0.445920348167419f, 0.725832700729370f, -0.446093708276749f, + 0.725490510463715f, -0.446266770362854f, 0.725148141384125f, -0.446439594030380f, + 0.724805653095245f, -0.446612149477005f, 0.724463045597076f, -0.446784436702728f, + 0.724120318889618f, -0.446956485509872f, 0.723777413368225f, -0.447128236293793f, + 0.723434448242188f, -0.447299748659134f, 0.723091304302216f, -0.447470992803574f, + 0.722747981548309f, -0.447641968727112f, 0.722404599189758f, -0.447812676429749f, + 0.722061097621918f, -0.447983115911484f, 0.721717417240143f, -0.448153316974640f, + 0.721373617649078f, -0.448323249816895f, 0.721029698848724f, -0.448492884635925f, + 0.720685660839081f, -0.448662281036377f, 0.720341444015503f, -0.448831409215927f, + 0.719997107982636f, -0.449000298976898f, 0.719652712345123f, -0.449168890714645f, + 0.719308137893677f, -0.449337244033813f, 0.718963444232941f, -0.449505299329758f, + 0.718618571758270f, -0.449673116207123f, 0.718273639678955f, -0.449840664863586f, + 0.717928528785706f, -0.450007945299149f, 0.717583298683167f, -0.450174957513809f, + 0.717238008975983f, -0.450341701507568f, 0.716892480850220f, -0.450508207082748f, + 0.716546893119812f, -0.450674414634705f, 0.716201186180115f, -0.450840383768082f, + 0.715855300426483f, -0.451006084680557f, 0.715509355068207f, -0.451171487569809f, + 0.715163230895996f, -0.451336652040482f, 0.714816987514496f, -0.451501548290253f, + 0.714470624923706f, -0.451666176319122f, 0.714124143123627f, -0.451830536127090f, + 0.713777542114258f, -0.451994657516479f, 0.713430821895599f, -0.452158480882645f, + 0.713083922863007f, -0.452322036027908f, 0.712736964225769f, -0.452485352754593f, + 0.712389826774597f, -0.452648371458054f, 0.712042629718781f, -0.452811151742935f, + 0.711695253849030f, -0.452973634004593f, 0.711347758769989f, -0.453135877847672f, + 0.711000144481659f, -0.453297853469849f, 0.710652410984039f, -0.453459560871124f, + 0.710304558277130f, -0.453621000051498f, 0.709956526756287f, -0.453782171010971f, + 0.709608435630798f, -0.453943043947220f, 0.709260225296021f, -0.454103678464890f, + 0.708911836147308f, -0.454264044761658f, 0.708563387393951f, -0.454424172639847f, + 0.708214759826660f, -0.454584002494812f, 0.707866072654724f, -0.454743564128876f, + 0.707517206668854f, -0.454902857542038f, 0.707168221473694f, -0.455061882734299f, + 0.706819176673889f, -0.455220639705658f, 0.706469953060150f, -0.455379128456116f, + 0.706120610237122f, -0.455537378787994f, 0.705771148204803f, -0.455695331096649f, + 0.705421566963196f, -0.455853015184402f, 0.705071866512299f, -0.456010431051254f, + 0.704722046852112f, -0.456167578697205f, 0.704372167587280f, -0.456324487924576f, + 0.704022109508514f, -0.456481099128723f, 0.703671932220459f, -0.456637442111969f, + 0.703321635723114f, -0.456793516874313f, 0.702971220016479f, -0.456949323415756f, + 0.702620685100555f, -0.457104891538620f, 0.702270030975342f, -0.457260161638260f, + 0.701919257640839f, -0.457415163516998f, 0.701568365097046f, -0.457569897174835f, + 0.701217353343964f, -0.457724362611771f, 0.700866222381592f, -0.457878559827805f, + 0.700514972209930f, -0.458032488822937f, 0.700163602828979f, -0.458186149597168f, + 0.699812114238739f, -0.458339542150497f, 0.699460506439209f, -0.458492636680603f, + 0.699108779430389f, -0.458645492792130f, 0.698756933212280f, -0.458798080682755f, + 0.698404967784882f, -0.458950400352478f, 0.698052942752838f, -0.459102421998978f, + 0.697700738906860f, -0.459254205226898f, 0.697348415851593f, -0.459405690431595f, + 0.696996033191681f, -0.459556937217712f, 0.696643471717834f, -0.459707885980606f, + 0.696290850639343f, -0.459858566522598f, 0.695938050746918f, -0.460008978843689f, + 0.695585191249847f, -0.460159152746201f, 0.695232212543488f, -0.460309028625488f, + 0.694879114627838f, -0.460458606481552f, 0.694525837898254f, -0.460607945919037f, + 0.694172501564026f, -0.460757017135620f, 0.693819046020508f, -0.460905820131302f, + 0.693465530872345f, -0.461054325103760f, 0.693111836910248f, -0.461202591657639f, + 0.692758023738861f, -0.461350560188293f, 0.692404091358185f, -0.461498260498047f, + 0.692050099372864f, -0.461645722389221f, 0.691695988178253f, -0.461792886257172f, + 0.691341698169708f, -0.461939752101898f, 0.690987348556519f, -0.462086379528046f, + 0.690632879734039f, -0.462232738733292f, 0.690278291702271f, -0.462378799915314f, + 0.689923584461212f, -0.462524622678757f, 0.689568817615509f, -0.462670147418976f, + 0.689213871955872f, -0.462815403938293f, 0.688858866691589f, -0.462960392236710f, + 0.688503682613373f, -0.463105112314224f, 0.688148438930511f, -0.463249564170837f, + 0.687793076038361f, -0.463393747806549f, 0.687437593936920f, -0.463537633419037f, + 0.687082052230835f, -0.463681250810623f, 0.686726331710815f, -0.463824629783630f, + 0.686370551586151f, -0.463967710733414f, 0.686014592647552f, -0.464110493659973f, + 0.685658574104309f, -0.464253038167953f, 0.685302436351776f, -0.464395314455032f, + 0.684946238994598f, -0.464537292718887f, 0.684589862823486f, -0.464679002761841f, + 0.684233427047729f, -0.464820444583893f, 0.683876872062683f, -0.464961618185043f, + 0.683520197868347f, -0.465102523565292f, 0.683163404464722f, -0.465243130922318f, + 0.682806491851807f, -0.465383470058441f, 0.682449519634247f, -0.465523540973663f, + 0.682092368602753f, -0.465663343667984f, 0.681735157966614f, -0.465802878141403f, + 0.681377887725830f, -0.465942144393921f, 0.681020438671112f, -0.466081112623215f, + 0.680662930011749f, -0.466219812631607f, 0.680305242538452f, -0.466358244419098f, + 0.679947495460510f, -0.466496407985687f, 0.679589688777924f, -0.466634273529053f, + 0.679231703281403f, -0.466771900653839f, 0.678873658180237f, -0.466909229755402f, + 0.678515493869781f, -0.467046260833740f, 0.678157210350037f, -0.467183053493500f, + 0.677798807621002f, -0.467319577932358f, 0.677440345287323f, -0.467455804347992f, + 0.677081763744354f, -0.467591762542725f, 0.676723062992096f, -0.467727422714233f, + 0.676364302635193f, -0.467862844467163f, 0.676005363464355f, -0.467997968196869f, + 0.675646364688873f, -0.468132823705673f, 0.675287246704102f, -0.468267410993576f, + 0.674928069114685f, -0.468401730060577f, 0.674568772315979f, -0.468535751104355f, + 0.674209356307983f, -0.468669503927231f, 0.673849821090698f, -0.468802988529205f, + 0.673490226268768f, -0.468936175107956f, 0.673130512237549f, -0.469069123268127f, + 0.672770678997040f, -0.469201773405075f, 0.672410726547241f, -0.469334155321121f, + 0.672050714492798f, -0.469466239213943f, 0.671690583229065f, -0.469598054885864f, + 0.671330332756042f, -0.469729602336884f, 0.670970022678375f, -0.469860881567001f, + 0.670609593391418f, -0.469991862773895f, 0.670249044895172f, -0.470122605562210f, + 0.669888436794281f, -0.470253020524979f, 0.669527709484100f, -0.470383197069168f, + 0.669166862964630f, -0.470513075590134f, 0.668805956840515f, -0.470642685890198f, + 0.668444931507111f, -0.470772027969360f, 0.668083786964417f, -0.470901101827621f, + 0.667722582817078f, -0.471029877662659f, 0.667361259460449f, -0.471158385276794f, + 0.666999816894531f, -0.471286594867706f, 0.666638314723969f, -0.471414536237717f, + 0.666276693344116f, -0.471542209386826f, 0.665914952754974f, -0.471669614315033f, + 0.665553152561188f, -0.471796721220016f, 0.665191233158112f, -0.471923559904099f, + 0.664829254150391f, -0.472050130367279f, 0.664467096328735f, -0.472176402807236f, + 0.664104938507080f, -0.472302407026291f, 0.663742601871490f, -0.472428143024445f, + 0.663380205631256f, -0.472553610801697f, 0.663017749786377f, -0.472678780555725f, + 0.662655174732208f, -0.472803652286530f, 0.662292480468750f, -0.472928285598755f, + 0.661929666996002f, -0.473052620887756f, 0.661566793918610f, -0.473176687955856f, + 0.661203861236572f, -0.473300457000732f, 0.660840749740601f, -0.473423957824707f, + 0.660477638244629f, -0.473547190427780f, 0.660114347934723f, -0.473670125007629f, + 0.659750998020172f, -0.473792791366577f, 0.659387588500977f, -0.473915189504623f, + 0.659024059772491f, -0.474037289619446f, 0.658660411834717f, -0.474159121513367f, + 0.658296704292297f, -0.474280685186386f, 0.657932877540588f, -0.474401950836182f, + 0.657568991184235f, -0.474522948265076f, 0.657204985618591f, -0.474643647670746f, + 0.656840860843658f, -0.474764078855515f, 0.656476676464081f, -0.474884241819382f, + 0.656112432479858f, -0.475004136562347f, 0.655748009681702f, -0.475123733282089f, + 0.655383586883545f, -0.475243031978607f, 0.655019044876099f, -0.475362062454224f, + 0.654654383659363f, -0.475480824708939f, 0.654289662837982f, -0.475599318742752f, + 0.653924822807312f, -0.475717514753342f, 0.653559923171997f, -0.475835442543030f, + 0.653194904327393f, -0.475953072309494f, 0.652829825878143f, -0.476070433855057f, + 0.652464628219604f, -0.476187497377396f, 0.652099311351776f, -0.476304292678833f, + 0.651733994483948f, -0.476420819759369f, 0.651368498802185f, -0.476537048816681f, + 0.651003003120422f, -0.476653009653091f, 0.650637328624725f, -0.476768702268600f, + 0.650271594524384f, -0.476884096860886f, 0.649905800819397f, -0.476999223232269f, + 0.649539887905121f, -0.477114051580429f, 0.649173915386200f, -0.477228611707687f, + 0.648807883262634f, -0.477342873811722f, 0.648441672325134f, -0.477456867694855f, + 0.648075461387634f, -0.477570593357086f, 0.647709131240845f, -0.477684020996094f, + 0.647342681884766f, -0.477797180414200f, 0.646976172924042f, -0.477910041809082f, + 0.646609604358673f, -0.478022634983063f, 0.646242916584015f, -0.478134930133820f, + 0.645876109600067f, -0.478246957063675f, 0.645509302616119f, -0.478358715772629f, + 0.645142316818237f, -0.478470176458359f, 0.644775331020355f, -0.478581339120865f, + 0.644408226013184f, -0.478692263364792f, 0.644041001796722f, -0.478802859783173f, + 0.643673717975616f, -0.478913217782974f, 0.643306374549866f, -0.479023247957230f, + 0.642938911914825f, -0.479133039712906f, 0.642571389675140f, -0.479242533445358f, + 0.642203748226166f, -0.479351729154587f, 0.641836047172546f, -0.479460656642914f, + 0.641468286514282f, -0.479569315910339f, 0.641100406646729f, -0.479677677154541f, + 0.640732467174530f, -0.479785770177841f, 0.640364408493042f, -0.479893565177917f, + 0.639996349811554f, -0.480001062154770f, 0.639628112316132f, -0.480108320713043f, + 0.639259815216064f, -0.480215251445770f, 0.638891458511353f, -0.480321943759918f, + 0.638523042201996f, -0.480428308248520f, 0.638154506683350f, -0.480534434318542f, + 0.637785911560059f, -0.480640232563019f, 0.637417197227478f, -0.480745792388916f, + 0.637048482894897f, -0.480851024389267f, 0.636679589748383f, -0.480956017971039f, + 0.636310696601868f, -0.481060713529587f, 0.635941684246063f, -0.481165111064911f, + 0.635572552680969f, -0.481269240379334f, 0.635203421115875f, -0.481373071670532f, + 0.634834170341492f, -0.481476634740829f, 0.634464859962463f, -0.481579899787903f, + 0.634095430374146f, -0.481682896614075f, 0.633725941181183f, -0.481785595417023f, + 0.633356392383575f, -0.481888025999069f, 0.632986724376678f, -0.481990188360214f, + 0.632616996765137f, -0.482092022895813f, 0.632247209548950f, -0.482193619012833f, + 0.631877362728119f, -0.482294887304306f, 0.631507396697998f, -0.482395917177200f, + 0.631137371063232f, -0.482496619224548f, 0.630767226219177f, -0.482597053050995f, + 0.630397081375122f, -0.482697218656540f, 0.630026817321777f, -0.482797086238861f, + 0.629656434059143f, -0.482896685600281f, 0.629286050796509f, -0.482995986938477f, + 0.628915548324585f, -0.483094990253448f, 0.628544986248016f, -0.483193725347519f, + 0.628174364566803f, -0.483292192220688f, 0.627803623676300f, -0.483390361070633f, + 0.627432823181152f, -0.483488231897354f, 0.627061963081360f, -0.483585834503174f, + 0.626691043376923f, -0.483683139085770f, 0.626320004463196f, -0.483780175447464f, + 0.625948905944824f, -0.483876913785934f, 0.625577747821808f, -0.483973383903503f, + 0.625206530094147f, -0.484069555997849f, 0.624835193157196f, -0.484165430068970f, + 0.624463796615601f, -0.484261035919189f, 0.624092340469360f, -0.484356373548508f, + 0.623720824718475f, -0.484451413154602f, 0.623349189758301f, -0.484546154737473f, + 0.622977554798126f, -0.484640628099442f, 0.622605800628662f, -0.484734803438187f, + 0.622233927249908f, -0.484828680753708f, 0.621862053871155f, -0.484922289848328f, + 0.621490061283112f, -0.485015630722046f, 0.621118068695068f, -0.485108673572540f, + 0.620745956897736f, -0.485201418399811f, 0.620373785495758f, -0.485293895006180f, + 0.620001494884491f, -0.485386073589325f, 0.619629204273224f, -0.485477954149246f, + 0.619256794452667f, -0.485569566488266f, 0.618884325027466f, -0.485660910606384f, + 0.618511795997620f, -0.485751956701279f, 0.618139207363129f, -0.485842704772949f, + 0.617766559123993f, -0.485933154821396f, 0.617393791675568f, -0.486023366451263f, + 0.617020964622498f, -0.486113250255585f, 0.616648077964783f, -0.486202865839005f, + 0.616275131702423f, -0.486292183399200f, 0.615902125835419f, -0.486381232738495f, + 0.615529060363770f, -0.486469984054565f, 0.615155875682831f, -0.486558437347412f, + 0.614782691001892f, -0.486646622419357f, 0.614409387111664f, -0.486734509468079f, + 0.614036023616791f, -0.486822128295898f, 0.613662600517273f, -0.486909449100494f, + 0.613289117813110f, -0.486996471881866f, 0.612915575504303f, -0.487083226442337f, + 0.612541973590851f, -0.487169682979584f, 0.612168252468109f, -0.487255871295929f, + 0.611794531345367f, -0.487341761589050f, 0.611420691013336f, -0.487427353858948f, + 0.611046791076660f, -0.487512677907944f, 0.610672831535339f, -0.487597703933716f, + 0.610298871994019f, -0.487682431936264f, 0.609924793243408f, -0.487766891717911f, + 0.609550595283508f, -0.487851053476334f, 0.609176397323608f, -0.487934947013855f, + 0.608802139759064f, -0.488018542528152f, 0.608427822589874f, -0.488101840019226f, + 0.608053386211395f, -0.488184869289398f, 0.607678949832916f, -0.488267600536346f, + 0.607304394245148f, -0.488350033760071f, 0.606929838657379f, -0.488432198762894f, + 0.606555163860321f, -0.488514065742493f, 0.606180429458618f, -0.488595664501190f, + 0.605805635452271f, -0.488676935434341f, 0.605430841445923f, -0.488757967948914f, + 0.605055928230286f, -0.488838672637939f, 0.604680955410004f, -0.488919109106064f, + 0.604305922985077f, -0.488999247550964f, 0.603930830955505f, -0.489079117774963f, + 0.603555679321289f, -0.489158689975739f, 0.603180468082428f, -0.489237964153290f, + 0.602805197238922f, -0.489316970109940f, 0.602429866790771f, -0.489395678043365f, + 0.602054476737976f, -0.489474087953568f, 0.601679027080536f, -0.489552229642868f, + 0.601303517818451f, -0.489630073308945f, 0.600927948951721f, -0.489707618951797f, + 0.600552320480347f, -0.489784896373749f, 0.600176632404327f, -0.489861875772476f, + 0.599800884723663f, -0.489938557147980f, 0.599425077438354f, -0.490014940500259f, + 0.599049210548401f, -0.490091055631638f, 0.598673284053802f, -0.490166902542114f, + 0.598297297954559f, -0.490242421627045f, 0.597921252250671f, -0.490317672491074f, + 0.597545146942139f, -0.490392625331879f, 0.597168982028961f, -0.490467309951782f, + 0.596792817115784f, -0.490541696548462f, 0.596416532993317f, -0.490615785121918f, + 0.596040189266205f, -0.490689605474472f, 0.595663845539093f, -0.490763127803802f, + 0.595287382602692f, -0.490836352109909f, 0.594910860061646f, -0.490909278392792f, + 0.594534337520599f, -0.490981936454773f, 0.594157755374908f, -0.491054296493530f, + 0.593781054019928f, -0.491126358509064f, 0.593404352664948f, -0.491198152303696f, + 0.593027591705322f, -0.491269648075104f, 0.592650771141052f, -0.491340845823288f, + 0.592273890972137f, -0.491411775350571f, 0.591896951198578f, -0.491482406854630f, + 0.591519951820374f, -0.491552740335464f, 0.591142892837524f, -0.491622805595398f, + 0.590765833854675f, -0.491692543029785f, 0.590388655662537f, -0.491762012243271f, + 0.590011477470398f, -0.491831213235855f, 0.589634180068970f, -0.491900116205215f, + 0.589256882667542f, -0.491968721151352f, 0.588879525661469f, -0.492037028074265f, + 0.588502109050751f, -0.492105036973953f, 0.588124632835388f, -0.492172777652740f, + 0.587747097015381f, -0.492240220308304f, 0.587369561195374f, -0.492307394742966f, + 0.586991965770721f, -0.492374241352081f, 0.586614251136780f, -0.492440819740295f, + 0.586236536502838f, -0.492507129907608f, 0.585858762264252f, -0.492573112249374f, + 0.585480928421021f, -0.492638826370239f, 0.585103094577789f, -0.492704242467880f, + 0.584725141525269f, -0.492769360542297f, 0.584347188472748f, -0.492834210395813f, + 0.583969175815582f, -0.492898762226105f, 0.583591103553772f, -0.492963016033173f, + 0.583212971687317f, -0.493026971817017f, 0.582834780216217f, -0.493090659379959f, + 0.582456588745117f, -0.493154048919678f, 0.582078278064728f, -0.493217140436172f, + 0.581699967384338f, -0.493279963731766f, 0.581321597099304f, -0.493342459201813f, + 0.580943167209625f, -0.493404686450958f, 0.580564737319946f, -0.493466645479202f, + 0.580186247825623f, -0.493528276681900f, 0.579807698726654f, -0.493589639663696f, + 0.579429090023041f, -0.493650704622269f, 0.579050421714783f, -0.493711471557617f, + 0.578671753406525f, -0.493771970272064f, 0.578292965888977f, -0.493832170963287f, + 0.577914178371429f, -0.493892073631287f, 0.577535390853882f, -0.493951678276062f, + 0.577156484127045f, -0.494011014699936f, 0.576777577400208f, -0.494070053100586f, + 0.576398611068726f, -0.494128793478012f, 0.576019585132599f, -0.494187235832214f, + 0.575640499591827f, -0.494245409965515f, 0.575261414051056f, -0.494303256273270f, + 0.574882268905640f, -0.494360834360123f, 0.574503064155579f, -0.494418144226074f, + 0.574123859405518f, -0.494475126266479f, 0.573744535446167f, -0.494531840085983f, + 0.573365211486816f, -0.494588255882263f, 0.572985887527466f, -0.494644373655319f, + 0.572606444358826f, -0.494700223207474f, 0.572227001190186f, -0.494755744934082f, + 0.571847498416901f, -0.494810998439789f, 0.571467995643616f, -0.494865983724594f, + 0.571088373661041f, -0.494920641183853f, 0.570708811283112f, -0.494975030422211f, + 0.570329129695892f, -0.495029091835022f, 0.569949388504028f, -0.495082914829254f, + 0.569569647312164f, -0.495136409997940f, 0.569189906120300f, -0.495189607143402f, + 0.568810045719147f, -0.495242536067963f, 0.568430185317993f, -0.495295166969299f, + 0.568050265312195f, -0.495347499847412f, 0.567670345306396f, -0.495399564504623f, + 0.567290365695953f, -0.495451331138611f, 0.566910326480865f, -0.495502769947052f, + 0.566530287265778f, -0.495553970336914f, 0.566150128841400f, -0.495604842901230f, + 0.565770030021667f, -0.495655417442322f, 0.565389811992645f, -0.495705723762512f, + 0.565009593963623f, -0.495755732059479f, 0.564629375934601f, -0.495805442333221f, + 0.564249038696289f, -0.495854884386063f, 0.563868701457977f, -0.495903998613358f, + 0.563488364219666f, -0.495952844619751f, 0.563107967376709f, -0.496001392602921f, + 0.562727510929108f, -0.496049642562866f, 0.562346994876862f, -0.496097624301910f, + 0.561966478824615f, -0.496145308017731f, 0.561585903167725f, -0.496192663908005f, + 0.561205327510834f, -0.496239781379700f, 0.560824692249298f, -0.496286571025848f, + 0.560444056987762f, -0.496333062648773f, 0.560063362121582f, -0.496379286050797f, + 0.559682607650757f, -0.496425211429596f, 0.559301853179932f, -0.496470838785172f, + 0.558921039104462f, -0.496516168117523f, 0.558540165424347f, -0.496561229228973f, + 0.558159291744232f, -0.496605962514877f, 0.557778418064117f, -0.496650427579880f, + 0.557397484779358f, -0.496694594621658f, 0.557016491889954f, -0.496738493442535f, + 0.556635499000549f, -0.496782064437866f, 0.556254446506500f, -0.496825367212296f, + 0.555873334407806f, -0.496868371963501f, 0.555492222309113f, -0.496911078691483f, + 0.555111110210419f, -0.496953487396240f, 0.554729938507080f, -0.496995598077774f, + 0.554348707199097f, -0.497037440538406f, 0.553967475891113f, -0.497078984975815f, + 0.553586184978485f, -0.497120231389999f, 0.553204894065857f, -0.497161179780960f, + 0.552823603153229f, -0.497201830148697f, 0.552442193031311f, -0.497242212295532f, + 0.552060842514038f, -0.497282296419144f, 0.551679372787476f, -0.497322082519531f, + 0.551297962665558f, -0.497361570596695f, 0.550916433334351f, -0.497400760650635f, + 0.550534904003143f, -0.497439652681351f, 0.550153374671936f, -0.497478276491165f, + 0.549771785736084f, -0.497516602277756f, 0.549390196800232f, -0.497554630041122f, + 0.549008548259735f, -0.497592359781265f, 0.548626899719238f, -0.497629791498184f, + 0.548245191574097f, -0.497666954994202f, 0.547863483428955f, -0.497703820466995f, + 0.547481775283813f, -0.497740387916565f, 0.547099947929382f, -0.497776657342911f, + 0.546718180179596f, -0.497812628746033f, 0.546336352825165f, -0.497848302125931f, + 0.545954465866089f, -0.497883707284927f, 0.545572578907013f, -0.497918814420700f, + 0.545190691947937f, -0.497953623533249f, 0.544808745384216f, -0.497988134622574f, + 0.544426798820496f, -0.498022347688675f, 0.544044792652130f, -0.498056292533875f, + 0.543662786483765f, -0.498089909553528f, 0.543280720710754f, -0.498123258352280f, + 0.542898654937744f, -0.498156309127808f, 0.542516589164734f, -0.498189061880112f, + 0.542134463787079f, -0.498221516609192f, 0.541752278804779f, -0.498253703117371f, + 0.541370153427124f, -0.498285561800003f, 0.540987968444824f, -0.498317152261734f, + 0.540605723857880f, -0.498348444700241f, 0.540223479270935f, -0.498379439115524f, + 0.539841234683990f, -0.498410135507584f, 0.539458930492401f, -0.498440563678741f, + 0.539076626300812f, -0.498470664024353f, 0.538694262504578f, -0.498500496149063f, + 0.538311958312988f, -0.498530030250549f, 0.537929534912109f, -0.498559266328812f, + 0.537547171115875f, -0.498588204383850f, 0.537164747714996f, -0.498616874217987f, + 0.536782264709473f, -0.498645216226578f, 0.536399841308594f, -0.498673290014267f, + 0.536017298698425f, -0.498701065778732f, 0.535634815692902f, -0.498728543519974f, + 0.535252273082733f, -0.498755723237991f, 0.534869730472565f, -0.498782604932785f, + 0.534487187862396f, -0.498809218406677f, 0.534104585647583f, -0.498835533857346f, + 0.533721983432770f, -0.498861521482468f, 0.533339321613312f, -0.498887240886688f, + 0.532956659793854f, -0.498912662267685f, 0.532573997974396f, -0.498937815427780f, + 0.532191336154938f, -0.498962640762329f, 0.531808614730835f, -0.498987197875977f, + 0.531425893306732f, -0.499011427164078f, 0.531043112277985f, -0.499035388231277f, + 0.530660390853882f, -0.499059051275253f, 0.530277609825134f, -0.499082416296005f, + 0.529894769191742f, -0.499105513095856f, 0.529511988162994f, -0.499128282070160f, + 0.529129147529602f, -0.499150782823563f, 0.528746306896210f, -0.499172955751419f, + 0.528363406658173f, -0.499194860458374f, 0.527980506420136f, -0.499216467142105f, + 0.527597606182098f, -0.499237775802612f, 0.527214705944061f, -0.499258816242218f, + 0.526831746101379f, -0.499279528856277f, 0.526448845863342f, -0.499299973249435f, + 0.526065826416016f, -0.499320119619370f, 0.525682866573334f, -0.499339967966080f, + 0.525299847126007f, -0.499359518289566f, 0.524916887283325f, -0.499378770589828f, + 0.524533808231354f, -0.499397724866867f, 0.524150788784027f, -0.499416410923004f, + 0.523767769336700f, -0.499434769153595f, 0.523384690284729f, -0.499452859163284f, + 0.523001611232758f, -0.499470651149750f, 0.522618472576141f, -0.499488145112991f, + 0.522235393524170f, -0.499505341053009f, 0.521852254867554f, -0.499522238969803f, + 0.521469116210938f, -0.499538868665695f, 0.521085977554321f, -0.499555170536041f, + 0.520702838897705f, -0.499571204185486f, 0.520319640636444f, -0.499586939811707f, + 0.519936442375183f, -0.499602377414703f, 0.519553244113922f, -0.499617516994476f, + 0.519170045852661f, -0.499632388353348f, 0.518786847591400f, -0.499646931886673f, + 0.518403589725494f, -0.499661177396774f, 0.518020391464233f, -0.499675154685974f, + 0.517637133598328f, -0.499688833951950f, 0.517253875732422f, -0.499702215194702f, + 0.516870558261871f, -0.499715298414230f, 0.516487300395966f, -0.499728083610535f, + 0.516103982925415f, -0.499740600585938f, 0.515720725059509f, -0.499752789735794f, + 0.515337407588959f, -0.499764710664749f, 0.514954090118408f, -0.499776333570480f, + 0.514570772647858f, -0.499787658452988f, 0.514187395572662f, -0.499798685312271f, + 0.513804078102112f, -0.499809414148331f, 0.513420701026917f, -0.499819844961166f, + 0.513037383556366f, -0.499830007553101f, 0.512654006481171f, -0.499839842319489f, + 0.512270629405975f, -0.499849408864975f, 0.511887252330780f, -0.499858677387238f, + 0.511503815650940f, -0.499867647886276f, 0.511120438575745f, -0.499876320362091f, + 0.510737061500549f, -0.499884694814682f, 0.510353624820709f, -0.499892801046371f, + 0.509970188140869f, -0.499900579452515f, 0.509586811065674f, -0.499908089637756f, + 0.509203374385834f, -0.499915301799774f, 0.508819937705994f, -0.499922215938568f, + 0.508436501026154f, -0.499928832054138f, 0.508053064346313f, -0.499935150146484f, + 0.507669627666473f, -0.499941170215607f, 0.507286131381989f, -0.499946922063828f, + 0.506902694702148f, -0.499952346086502f, 0.506519258022308f, -0.499957501888275f, + 0.506135761737823f, -0.499962359666824f, 0.505752325057983f, -0.499966919422150f, + 0.505368828773499f, -0.499971181154251f, 0.504985332489014f, -0.499975144863129f, + 0.504601895809174f, -0.499978810548782f, 0.504218399524689f, -0.499982208013535f, + 0.503834903240204f, -0.499985307455063f, 0.503451406955719f, -0.499988079071045f, + 0.503067970275879f, -0.499990582466125f, 0.502684473991394f, -0.499992787837982f, + 0.502300977706909f, -0.499994695186615f, 0.501917481422424f, -0.499996334314346f, + 0.501533985137939f, -0.499997645616531f, 0.501150488853455f, -0.499998688697815f, + 0.500766992568970f, -0.499999403953552f, 0.500383496284485f, -0.499999850988388f, +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q31) +/** + @par + Generation fixed-point realCoefAQ31 array in Q31 format: + @par + n = 4096 +
for (i = 0; i < n; i++)
+  {
+     pATable[2 * i]     = 0.5 * ( 1.0 - sin (2 * PI / (double) (2 * n) * (double) i));
+     pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
+  }
+ @par + Convert to fixed point Q31 format + round(pATable[i] * pow(2, 31)) +*/ +const q31_t realCoefAQ31[8192] = { + (q31_t)0x40000000, (q31_t)0xc0000000, (q31_t)0x3ff36f02, (q31_t)0xc000013c, + (q31_t)0x3fe6de05, (q31_t)0xc00004ef, (q31_t)0x3fda4d09, (q31_t)0xc0000b1a, + (q31_t)0x3fcdbc0f, (q31_t)0xc00013bd, (q31_t)0x3fc12b16, (q31_t)0xc0001ed8, + (q31_t)0x3fb49a1f, (q31_t)0xc0002c6a, (q31_t)0x3fa8092c, (q31_t)0xc0003c74, + (q31_t)0x3f9b783c, (q31_t)0xc0004ef5, (q31_t)0x3f8ee750, (q31_t)0xc00063ee, + (q31_t)0x3f825668, (q31_t)0xc0007b5f, (q31_t)0x3f75c585, (q31_t)0xc0009547, + (q31_t)0x3f6934a8, (q31_t)0xc000b1a7, (q31_t)0x3f5ca3d0, (q31_t)0xc000d07e, + (q31_t)0x3f5012fe, (q31_t)0xc000f1ce, (q31_t)0x3f438234, (q31_t)0xc0011594, + (q31_t)0x3f36f170, (q31_t)0xc0013bd3, (q31_t)0x3f2a60b4, (q31_t)0xc0016489, + (q31_t)0x3f1dd001, (q31_t)0xc0018fb6, (q31_t)0x3f113f56, (q31_t)0xc001bd5c, + (q31_t)0x3f04aeb5, (q31_t)0xc001ed78, (q31_t)0x3ef81e1d, (q31_t)0xc002200d, + (q31_t)0x3eeb8d8f, (q31_t)0xc0025519, (q31_t)0x3edefd0c, (q31_t)0xc0028c9c, + (q31_t)0x3ed26c94, (q31_t)0xc002c697, (q31_t)0x3ec5dc28, (q31_t)0xc003030a, + (q31_t)0x3eb94bc8, (q31_t)0xc00341f4, (q31_t)0x3eacbb74, (q31_t)0xc0038356, + (q31_t)0x3ea02b2e, (q31_t)0xc003c72f, (q31_t)0x3e939af5, (q31_t)0xc0040d80, + (q31_t)0x3e870aca, (q31_t)0xc0045648, (q31_t)0x3e7a7aae, (q31_t)0xc004a188, + (q31_t)0x3e6deaa1, (q31_t)0xc004ef3f, (q31_t)0x3e615aa3, (q31_t)0xc0053f6e, + (q31_t)0x3e54cab5, (q31_t)0xc0059214, (q31_t)0x3e483ad8, (q31_t)0xc005e731, + (q31_t)0x3e3bab0b, (q31_t)0xc0063ec6, (q31_t)0x3e2f1b50, (q31_t)0xc00698d3, + (q31_t)0x3e228ba7, (q31_t)0xc006f556, (q31_t)0x3e15fc11, (q31_t)0xc0075452, + (q31_t)0x3e096c8d, (q31_t)0xc007b5c4, (q31_t)0x3dfcdd1d, (q31_t)0xc00819ae, + (q31_t)0x3df04dc0, (q31_t)0xc008800f, (q31_t)0x3de3be78, (q31_t)0xc008e8e8, + (q31_t)0x3dd72f45, (q31_t)0xc0095438, (q31_t)0x3dcaa027, (q31_t)0xc009c1ff, + (q31_t)0x3dbe111e, (q31_t)0xc00a323d, (q31_t)0x3db1822c, (q31_t)0xc00aa4f3, + (q31_t)0x3da4f351, (q31_t)0xc00b1a20, (q31_t)0x3d98648d, (q31_t)0xc00b91c4, + (q31_t)0x3d8bd5e1, (q31_t)0xc00c0be0, (q31_t)0x3d7f474d, (q31_t)0xc00c8872, + (q31_t)0x3d72b8d2, (q31_t)0xc00d077c, (q31_t)0x3d662a70, (q31_t)0xc00d88fd, + (q31_t)0x3d599c28, (q31_t)0xc00e0cf5, (q31_t)0x3d4d0df9, (q31_t)0xc00e9364, + (q31_t)0x3d407fe6, (q31_t)0xc00f1c4a, (q31_t)0x3d33f1ed, (q31_t)0xc00fa7a8, + (q31_t)0x3d276410, (q31_t)0xc010357c, (q31_t)0x3d1ad650, (q31_t)0xc010c5c7, + (q31_t)0x3d0e48ab, (q31_t)0xc011588a, (q31_t)0x3d01bb24, (q31_t)0xc011edc3, + (q31_t)0x3cf52dbb, (q31_t)0xc0128574, (q31_t)0x3ce8a06f, (q31_t)0xc0131f9b, + (q31_t)0x3cdc1342, (q31_t)0xc013bc39, (q31_t)0x3ccf8634, (q31_t)0xc0145b4e, + (q31_t)0x3cc2f945, (q31_t)0xc014fcda, (q31_t)0x3cb66c77, (q31_t)0xc015a0dd, + (q31_t)0x3ca9dfc8, (q31_t)0xc0164757, (q31_t)0x3c9d533b, (q31_t)0xc016f047, + (q31_t)0x3c90c6cf, (q31_t)0xc0179bae, (q31_t)0x3c843a85, (q31_t)0xc018498c, + (q31_t)0x3c77ae5e, (q31_t)0xc018f9e1, (q31_t)0x3c6b2259, (q31_t)0xc019acac, + (q31_t)0x3c5e9678, (q31_t)0xc01a61ee, (q31_t)0x3c520aba, (q31_t)0xc01b19a7, + (q31_t)0x3c457f21, (q31_t)0xc01bd3d6, (q31_t)0x3c38f3ac, (q31_t)0xc01c907c, + (q31_t)0x3c2c685d, (q31_t)0xc01d4f99, (q31_t)0x3c1fdd34, (q31_t)0xc01e112b, + (q31_t)0x3c135231, (q31_t)0xc01ed535, (q31_t)0x3c06c754, (q31_t)0xc01f9bb5, + (q31_t)0x3bfa3c9f, (q31_t)0xc02064ab, (q31_t)0x3bedb212, (q31_t)0xc0213018, + (q31_t)0x3be127ac, (q31_t)0xc021fdfb, (q31_t)0x3bd49d70, (q31_t)0xc022ce54, + (q31_t)0x3bc8135c, (q31_t)0xc023a124, (q31_t)0x3bbb8973, (q31_t)0xc024766a, + (q31_t)0x3baeffb3, (q31_t)0xc0254e27, (q31_t)0x3ba2761e, (q31_t)0xc0262859, + (q31_t)0x3b95ecb4, (q31_t)0xc0270502, (q31_t)0x3b896375, (q31_t)0xc027e421, + (q31_t)0x3b7cda63, (q31_t)0xc028c5b6, (q31_t)0x3b70517d, (q31_t)0xc029a9c1, + (q31_t)0x3b63c8c4, (q31_t)0xc02a9042, (q31_t)0x3b574039, (q31_t)0xc02b7939, + (q31_t)0x3b4ab7db, (q31_t)0xc02c64a6, (q31_t)0x3b3e2fac, (q31_t)0xc02d5289, + (q31_t)0x3b31a7ac, (q31_t)0xc02e42e2, (q31_t)0x3b251fdc, (q31_t)0xc02f35b1, + (q31_t)0x3b18983b, (q31_t)0xc0302af5, (q31_t)0x3b0c10cb, (q31_t)0xc03122b0, + (q31_t)0x3aff898c, (q31_t)0xc0321ce0, (q31_t)0x3af3027e, (q31_t)0xc0331986, + (q31_t)0x3ae67ba2, (q31_t)0xc03418a2, (q31_t)0x3ad9f4f8, (q31_t)0xc0351a33, + (q31_t)0x3acd6e81, (q31_t)0xc0361e3a, (q31_t)0x3ac0e83d, (q31_t)0xc03724b6, + (q31_t)0x3ab4622d, (q31_t)0xc0382da8, (q31_t)0x3aa7dc52, (q31_t)0xc0393910, + (q31_t)0x3a9b56ab, (q31_t)0xc03a46ed, (q31_t)0x3a8ed139, (q31_t)0xc03b573f, + (q31_t)0x3a824bfd, (q31_t)0xc03c6a07, (q31_t)0x3a75c6f8, (q31_t)0xc03d7f44, + (q31_t)0x3a694229, (q31_t)0xc03e96f6, (q31_t)0x3a5cbd91, (q31_t)0xc03fb11d, + (q31_t)0x3a503930, (q31_t)0xc040cdba, (q31_t)0x3a43b508, (q31_t)0xc041eccc, + (q31_t)0x3a373119, (q31_t)0xc0430e53, (q31_t)0x3a2aad62, (q31_t)0xc044324f, + (q31_t)0x3a1e29e5, (q31_t)0xc04558c0, (q31_t)0x3a11a6a3, (q31_t)0xc04681a6, + (q31_t)0x3a05239a, (q31_t)0xc047ad01, (q31_t)0x39f8a0cd, (q31_t)0xc048dad1, + (q31_t)0x39ec1e3b, (q31_t)0xc04a0b16, (q31_t)0x39df9be6, (q31_t)0xc04b3dcf, + (q31_t)0x39d319cc, (q31_t)0xc04c72fe, (q31_t)0x39c697f0, (q31_t)0xc04daaa1, + (q31_t)0x39ba1651, (q31_t)0xc04ee4b8, (q31_t)0x39ad94f0, (q31_t)0xc0502145, + (q31_t)0x39a113cd, (q31_t)0xc0516045, (q31_t)0x399492ea, (q31_t)0xc052a1bb, + (q31_t)0x39881245, (q31_t)0xc053e5a5, (q31_t)0x397b91e1, (q31_t)0xc0552c03, + (q31_t)0x396f11bc, (q31_t)0xc05674d6, (q31_t)0x396291d9, (q31_t)0xc057c01d, + (q31_t)0x39561237, (q31_t)0xc0590dd8, (q31_t)0x394992d7, (q31_t)0xc05a5e07, + (q31_t)0x393d13b8, (q31_t)0xc05bb0ab, (q31_t)0x393094dd, (q31_t)0xc05d05c3, + (q31_t)0x39241645, (q31_t)0xc05e5d4e, (q31_t)0x391797f0, (q31_t)0xc05fb74e, + (q31_t)0x390b19e0, (q31_t)0xc06113c2, (q31_t)0x38fe9c15, (q31_t)0xc06272aa, + (q31_t)0x38f21e8e, (q31_t)0xc063d405, (q31_t)0x38e5a14d, (q31_t)0xc06537d4, + (q31_t)0x38d92452, (q31_t)0xc0669e18, (q31_t)0x38cca79e, (q31_t)0xc06806ce, + (q31_t)0x38c02b31, (q31_t)0xc06971f9, (q31_t)0x38b3af0c, (q31_t)0xc06adf97, + (q31_t)0x38a7332e, (q31_t)0xc06c4fa8, (q31_t)0x389ab799, (q31_t)0xc06dc22e, + (q31_t)0x388e3c4d, (q31_t)0xc06f3726, (q31_t)0x3881c14b, (q31_t)0xc070ae92, + (q31_t)0x38754692, (q31_t)0xc0722871, (q31_t)0x3868cc24, (q31_t)0xc073a4c3, + (q31_t)0x385c5201, (q31_t)0xc0752389, (q31_t)0x384fd829, (q31_t)0xc076a4c2, + (q31_t)0x38435e9d, (q31_t)0xc078286e, (q31_t)0x3836e55d, (q31_t)0xc079ae8c, + (q31_t)0x382a6c6a, (q31_t)0xc07b371e, (q31_t)0x381df3c5, (q31_t)0xc07cc223, + (q31_t)0x38117b6d, (q31_t)0xc07e4f9b, (q31_t)0x38050364, (q31_t)0xc07fdf85, + (q31_t)0x37f88ba9, (q31_t)0xc08171e2, (q31_t)0x37ec143e, (q31_t)0xc08306b2, + (q31_t)0x37df9d22, (q31_t)0xc0849df4, (q31_t)0x37d32657, (q31_t)0xc08637a9, + (q31_t)0x37c6afdc, (q31_t)0xc087d3d0, (q31_t)0x37ba39b3, (q31_t)0xc089726a, + (q31_t)0x37adc3db, (q31_t)0xc08b1376, (q31_t)0x37a14e55, (q31_t)0xc08cb6f5, + (q31_t)0x3794d922, (q31_t)0xc08e5ce5, (q31_t)0x37886442, (q31_t)0xc0900548, + (q31_t)0x377befb5, (q31_t)0xc091b01d, (q31_t)0x376f7b7d, (q31_t)0xc0935d64, + (q31_t)0x37630799, (q31_t)0xc0950d1d, (q31_t)0x3756940a, (q31_t)0xc096bf48, + (q31_t)0x374a20d0, (q31_t)0xc09873e4, (q31_t)0x373daded, (q31_t)0xc09a2af3, + (q31_t)0x37313b60, (q31_t)0xc09be473, (q31_t)0x3724c92a, (q31_t)0xc09da065, + (q31_t)0x3718574b, (q31_t)0xc09f5ec8, (q31_t)0x370be5c4, (q31_t)0xc0a11f9d, + (q31_t)0x36ff7496, (q31_t)0xc0a2e2e3, (q31_t)0x36f303c0, (q31_t)0xc0a4a89b, + (q31_t)0x36e69344, (q31_t)0xc0a670c4, (q31_t)0x36da2321, (q31_t)0xc0a83b5e, + (q31_t)0x36cdb359, (q31_t)0xc0aa086a, (q31_t)0x36c143ec, (q31_t)0xc0abd7e6, + (q31_t)0x36b4d4d9, (q31_t)0xc0ada9d4, (q31_t)0x36a86623, (q31_t)0xc0af7e33, + (q31_t)0x369bf7c9, (q31_t)0xc0b15502, (q31_t)0x368f89cb, (q31_t)0xc0b32e42, + (q31_t)0x36831c2b, (q31_t)0xc0b509f3, (q31_t)0x3676aee8, (q31_t)0xc0b6e815, + (q31_t)0x366a4203, (q31_t)0xc0b8c8a7, (q31_t)0x365dd57d, (q31_t)0xc0baabaa, + (q31_t)0x36516956, (q31_t)0xc0bc911d, (q31_t)0x3644fd8f, (q31_t)0xc0be7901, + (q31_t)0x36389228, (q31_t)0xc0c06355, (q31_t)0x362c2721, (q31_t)0xc0c25019, + (q31_t)0x361fbc7b, (q31_t)0xc0c43f4d, (q31_t)0x36135237, (q31_t)0xc0c630f2, + (q31_t)0x3606e854, (q31_t)0xc0c82506, (q31_t)0x35fa7ed4, (q31_t)0xc0ca1b8a, + (q31_t)0x35ee15b7, (q31_t)0xc0cc147f, (q31_t)0x35e1acfd, (q31_t)0xc0ce0fe3, + (q31_t)0x35d544a7, (q31_t)0xc0d00db6, (q31_t)0x35c8dcb6, (q31_t)0xc0d20dfa, + (q31_t)0x35bc7529, (q31_t)0xc0d410ad, (q31_t)0x35b00e02, (q31_t)0xc0d615cf, + (q31_t)0x35a3a740, (q31_t)0xc0d81d61, (q31_t)0x359740e5, (q31_t)0xc0da2762, + (q31_t)0x358adaf0, (q31_t)0xc0dc33d2, (q31_t)0x357e7563, (q31_t)0xc0de42b2, + (q31_t)0x3572103d, (q31_t)0xc0e05401, (q31_t)0x3565ab80, (q31_t)0xc0e267be, + (q31_t)0x3559472b, (q31_t)0xc0e47deb, (q31_t)0x354ce33f, (q31_t)0xc0e69686, + (q31_t)0x35407fbd, (q31_t)0xc0e8b190, (q31_t)0x35341ca5, (q31_t)0xc0eacf09, + (q31_t)0x3527b9f7, (q31_t)0xc0eceef1, (q31_t)0x351b57b5, (q31_t)0xc0ef1147, + (q31_t)0x350ef5de, (q31_t)0xc0f1360b, (q31_t)0x35029473, (q31_t)0xc0f35d3e, + (q31_t)0x34f63374, (q31_t)0xc0f586df, (q31_t)0x34e9d2e3, (q31_t)0xc0f7b2ee, + (q31_t)0x34dd72be, (q31_t)0xc0f9e16b, (q31_t)0x34d11308, (q31_t)0xc0fc1257, + (q31_t)0x34c4b3c0, (q31_t)0xc0fe45b0, (q31_t)0x34b854e7, (q31_t)0xc1007b77, + (q31_t)0x34abf67e, (q31_t)0xc102b3ac, (q31_t)0x349f9884, (q31_t)0xc104ee4f, + (q31_t)0x34933afa, (q31_t)0xc1072b5f, (q31_t)0x3486dde1, (q31_t)0xc1096add, + (q31_t)0x347a8139, (q31_t)0xc10bacc8, (q31_t)0x346e2504, (q31_t)0xc10df120, + (q31_t)0x3461c940, (q31_t)0xc11037e6, (q31_t)0x34556def, (q31_t)0xc1128119, + (q31_t)0x34491311, (q31_t)0xc114ccb9, (q31_t)0x343cb8a7, (q31_t)0xc1171ac6, + (q31_t)0x34305eb0, (q31_t)0xc1196b3f, (q31_t)0x3424052f, (q31_t)0xc11bbe26, + (q31_t)0x3417ac22, (q31_t)0xc11e1379, (q31_t)0x340b538b, (q31_t)0xc1206b39, + (q31_t)0x33fefb6a, (q31_t)0xc122c566, (q31_t)0x33f2a3bf, (q31_t)0xc12521ff, + (q31_t)0x33e64c8c, (q31_t)0xc1278104, (q31_t)0x33d9f5cf, (q31_t)0xc129e276, + (q31_t)0x33cd9f8b, (q31_t)0xc12c4653, (q31_t)0x33c149bf, (q31_t)0xc12eac9d, + (q31_t)0x33b4f46c, (q31_t)0xc1311553, (q31_t)0x33a89f92, (q31_t)0xc1338075, + (q31_t)0x339c4b32, (q31_t)0xc135ee02, (q31_t)0x338ff74d, (q31_t)0xc1385dfb, + (q31_t)0x3383a3e2, (q31_t)0xc13ad060, (q31_t)0x337750f2, (q31_t)0xc13d4530, + (q31_t)0x336afe7e, (q31_t)0xc13fbc6c, (q31_t)0x335eac86, (q31_t)0xc1423613, + (q31_t)0x33525b0b, (q31_t)0xc144b225, (q31_t)0x33460a0d, (q31_t)0xc14730a3, + (q31_t)0x3339b98d, (q31_t)0xc149b18b, (q31_t)0x332d698a, (q31_t)0xc14c34df, + (q31_t)0x33211a07, (q31_t)0xc14eba9d, (q31_t)0x3314cb02, (q31_t)0xc15142c6, + (q31_t)0x33087c7d, (q31_t)0xc153cd5a, (q31_t)0x32fc2e77, (q31_t)0xc1565a58, + (q31_t)0x32efe0f2, (q31_t)0xc158e9c1, (q31_t)0x32e393ef, (q31_t)0xc15b7b94, + (q31_t)0x32d7476c, (q31_t)0xc15e0fd1, (q31_t)0x32cafb6b, (q31_t)0xc160a678, + (q31_t)0x32beafed, (q31_t)0xc1633f8a, (q31_t)0x32b264f2, (q31_t)0xc165db05, + (q31_t)0x32a61a7a, (q31_t)0xc16878eb, (q31_t)0x3299d085, (q31_t)0xc16b193a, + (q31_t)0x328d8715, (q31_t)0xc16dbbf3, (q31_t)0x32813e2a, (q31_t)0xc1706115, + (q31_t)0x3274f5c3, (q31_t)0xc17308a1, (q31_t)0x3268ade3, (q31_t)0xc175b296, + (q31_t)0x325c6688, (q31_t)0xc1785ef4, (q31_t)0x32501fb5, (q31_t)0xc17b0dbb, + (q31_t)0x3243d968, (q31_t)0xc17dbeec, (q31_t)0x323793a3, (q31_t)0xc1807285, + (q31_t)0x322b4e66, (q31_t)0xc1832888, (q31_t)0x321f09b1, (q31_t)0xc185e0f3, + (q31_t)0x3212c585, (q31_t)0xc1889bc6, (q31_t)0x320681e3, (q31_t)0xc18b5903, + (q31_t)0x31fa3ecb, (q31_t)0xc18e18a7, (q31_t)0x31edfc3d, (q31_t)0xc190dab4, + (q31_t)0x31e1ba3a, (q31_t)0xc1939f29, (q31_t)0x31d578c2, (q31_t)0xc1966606, + (q31_t)0x31c937d6, (q31_t)0xc1992f4c, (q31_t)0x31bcf777, (q31_t)0xc19bfaf9, + (q31_t)0x31b0b7a4, (q31_t)0xc19ec90d, (q31_t)0x31a4785e, (q31_t)0xc1a1998a, + (q31_t)0x319839a6, (q31_t)0xc1a46c6e, (q31_t)0x318bfb7d, (q31_t)0xc1a741b9, + (q31_t)0x317fbde2, (q31_t)0xc1aa196c, (q31_t)0x317380d6, (q31_t)0xc1acf386, + (q31_t)0x31674459, (q31_t)0xc1afd007, (q31_t)0x315b086d, (q31_t)0xc1b2aef0, + (q31_t)0x314ecd11, (q31_t)0xc1b5903f, (q31_t)0x31429247, (q31_t)0xc1b873f5, + (q31_t)0x3136580d, (q31_t)0xc1bb5a11, (q31_t)0x312a1e66, (q31_t)0xc1be4294, + (q31_t)0x311de551, (q31_t)0xc1c12d7e, (q31_t)0x3111accf, (q31_t)0xc1c41ace, + (q31_t)0x310574e0, (q31_t)0xc1c70a84, (q31_t)0x30f93d86, (q31_t)0xc1c9fca0, + (q31_t)0x30ed06bf, (q31_t)0xc1ccf122, (q31_t)0x30e0d08d, (q31_t)0xc1cfe80a, + (q31_t)0x30d49af1, (q31_t)0xc1d2e158, (q31_t)0x30c865ea, (q31_t)0xc1d5dd0c, + (q31_t)0x30bc317a, (q31_t)0xc1d8db25, (q31_t)0x30affda0, (q31_t)0xc1dbdba3, + (q31_t)0x30a3ca5d, (q31_t)0xc1dede87, (q31_t)0x309797b2, (q31_t)0xc1e1e3d0, + (q31_t)0x308b659f, (q31_t)0xc1e4eb7e, (q31_t)0x307f3424, (q31_t)0xc1e7f591, + (q31_t)0x30730342, (q31_t)0xc1eb0209, (q31_t)0x3066d2fa, (q31_t)0xc1ee10e5, + (q31_t)0x305aa34c, (q31_t)0xc1f12227, (q31_t)0x304e7438, (q31_t)0xc1f435cc, + (q31_t)0x304245c0, (q31_t)0xc1f74bd6, (q31_t)0x303617e2, (q31_t)0xc1fa6445, + (q31_t)0x3029eaa1, (q31_t)0xc1fd7f17, (q31_t)0x301dbdfb, (q31_t)0xc2009c4e, + (q31_t)0x301191f3, (q31_t)0xc203bbe8, (q31_t)0x30056687, (q31_t)0xc206dde6, + (q31_t)0x2ff93bba, (q31_t)0xc20a0248, (q31_t)0x2fed118a, (q31_t)0xc20d290d, + (q31_t)0x2fe0e7f9, (q31_t)0xc2105236, (q31_t)0x2fd4bf08, (q31_t)0xc2137dc2, + (q31_t)0x2fc896b5, (q31_t)0xc216abb1, (q31_t)0x2fbc6f03, (q31_t)0xc219dc03, + (q31_t)0x2fb047f2, (q31_t)0xc21d0eb8, (q31_t)0x2fa42181, (q31_t)0xc22043d0, + (q31_t)0x2f97fbb2, (q31_t)0xc2237b4b, (q31_t)0x2f8bd685, (q31_t)0xc226b528, + (q31_t)0x2f7fb1fa, (q31_t)0xc229f167, (q31_t)0x2f738e12, (q31_t)0xc22d3009, + (q31_t)0x2f676ace, (q31_t)0xc230710d, (q31_t)0x2f5b482d, (q31_t)0xc233b473, + (q31_t)0x2f4f2630, (q31_t)0xc236fa3b, (q31_t)0x2f4304d8, (q31_t)0xc23a4265, + (q31_t)0x2f36e426, (q31_t)0xc23d8cf1, (q31_t)0x2f2ac419, (q31_t)0xc240d9de, + (q31_t)0x2f1ea4b2, (q31_t)0xc244292c, (q31_t)0x2f1285f2, (q31_t)0xc2477adc, + (q31_t)0x2f0667d9, (q31_t)0xc24aceed, (q31_t)0x2efa4a67, (q31_t)0xc24e255e, + (q31_t)0x2eee2d9d, (q31_t)0xc2517e31, (q31_t)0x2ee2117c, (q31_t)0xc254d965, + (q31_t)0x2ed5f604, (q31_t)0xc25836f9, (q31_t)0x2ec9db35, (q31_t)0xc25b96ee, + (q31_t)0x2ebdc110, (q31_t)0xc25ef943, (q31_t)0x2eb1a796, (q31_t)0xc2625df8, + (q31_t)0x2ea58ec6, (q31_t)0xc265c50e, (q31_t)0x2e9976a1, (q31_t)0xc2692e83, + (q31_t)0x2e8d5f29, (q31_t)0xc26c9a58, (q31_t)0x2e81485c, (q31_t)0xc270088e, + (q31_t)0x2e75323c, (q31_t)0xc2737922, (q31_t)0x2e691cc9, (q31_t)0xc276ec16, + (q31_t)0x2e5d0804, (q31_t)0xc27a616a, (q31_t)0x2e50f3ed, (q31_t)0xc27dd91c, + (q31_t)0x2e44e084, (q31_t)0xc281532e, (q31_t)0x2e38cdcb, (q31_t)0xc284cf9f, + (q31_t)0x2e2cbbc1, (q31_t)0xc2884e6e, (q31_t)0x2e20aa67, (q31_t)0xc28bcf9c, + (q31_t)0x2e1499bd, (q31_t)0xc28f5329, (q31_t)0x2e0889c4, (q31_t)0xc292d914, + (q31_t)0x2dfc7a7c, (q31_t)0xc296615d, (q31_t)0x2df06be6, (q31_t)0xc299ec05, + (q31_t)0x2de45e03, (q31_t)0xc29d790a, (q31_t)0x2dd850d2, (q31_t)0xc2a1086d, + (q31_t)0x2dcc4454, (q31_t)0xc2a49a2e, (q31_t)0x2dc0388a, (q31_t)0xc2a82e4d, + (q31_t)0x2db42d74, (q31_t)0xc2abc4c9, (q31_t)0x2da82313, (q31_t)0xc2af5da2, + (q31_t)0x2d9c1967, (q31_t)0xc2b2f8d8, (q31_t)0x2d901070, (q31_t)0xc2b6966c, + (q31_t)0x2d84082f, (q31_t)0xc2ba365c, (q31_t)0x2d7800a5, (q31_t)0xc2bdd8a9, + (q31_t)0x2d6bf9d1, (q31_t)0xc2c17d52, (q31_t)0x2d5ff3b5, (q31_t)0xc2c52459, + (q31_t)0x2d53ee51, (q31_t)0xc2c8cdbb, (q31_t)0x2d47e9a5, (q31_t)0xc2cc7979, + (q31_t)0x2d3be5b1, (q31_t)0xc2d02794, (q31_t)0x2d2fe277, (q31_t)0xc2d3d80a, + (q31_t)0x2d23dff7, (q31_t)0xc2d78add, (q31_t)0x2d17de31, (q31_t)0xc2db400a, + (q31_t)0x2d0bdd25, (q31_t)0xc2def794, (q31_t)0x2cffdcd4, (q31_t)0xc2e2b178, + (q31_t)0x2cf3dd3f, (q31_t)0xc2e66db8, (q31_t)0x2ce7de66, (q31_t)0xc2ea2c53, + (q31_t)0x2cdbe04a, (q31_t)0xc2eded49, (q31_t)0x2ccfe2ea, (q31_t)0xc2f1b099, + (q31_t)0x2cc3e648, (q31_t)0xc2f57644, (q31_t)0x2cb7ea63, (q31_t)0xc2f93e4a, + (q31_t)0x2cabef3d, (q31_t)0xc2fd08a9, (q31_t)0x2c9ff4d6, (q31_t)0xc300d563, + (q31_t)0x2c93fb2e, (q31_t)0xc304a477, (q31_t)0x2c880245, (q31_t)0xc30875e5, + (q31_t)0x2c7c0a1d, (q31_t)0xc30c49ad, (q31_t)0x2c7012b5, (q31_t)0xc3101fce, + (q31_t)0x2c641c0e, (q31_t)0xc313f848, (q31_t)0x2c582629, (q31_t)0xc317d31c, + (q31_t)0x2c4c3106, (q31_t)0xc31bb049, (q31_t)0x2c403ca5, (q31_t)0xc31f8fcf, + (q31_t)0x2c344908, (q31_t)0xc32371ae, (q31_t)0x2c28562d, (q31_t)0xc32755e5, + (q31_t)0x2c1c6417, (q31_t)0xc32b3c75, (q31_t)0x2c1072c4, (q31_t)0xc32f255e, + (q31_t)0x2c048237, (q31_t)0xc333109e, (q31_t)0x2bf8926f, (q31_t)0xc336fe37, + (q31_t)0x2beca36c, (q31_t)0xc33aee27, (q31_t)0x2be0b52f, (q31_t)0xc33ee070, + (q31_t)0x2bd4c7ba, (q31_t)0xc342d510, (q31_t)0x2bc8db0b, (q31_t)0xc346cc07, + (q31_t)0x2bbcef23, (q31_t)0xc34ac556, (q31_t)0x2bb10404, (q31_t)0xc34ec0fc, + (q31_t)0x2ba519ad, (q31_t)0xc352bef9, (q31_t)0x2b99301f, (q31_t)0xc356bf4d, + (q31_t)0x2b8d475b, (q31_t)0xc35ac1f7, (q31_t)0x2b815f60, (q31_t)0xc35ec6f8, + (q31_t)0x2b75782f, (q31_t)0xc362ce50, (q31_t)0x2b6991ca, (q31_t)0xc366d7fd, + (q31_t)0x2b5dac2f, (q31_t)0xc36ae401, (q31_t)0x2b51c760, (q31_t)0xc36ef25b, + (q31_t)0x2b45e35d, (q31_t)0xc373030a, (q31_t)0x2b3a0027, (q31_t)0xc377160f, + (q31_t)0x2b2e1dbe, (q31_t)0xc37b2b6a, (q31_t)0x2b223c22, (q31_t)0xc37f4319, + (q31_t)0x2b165b54, (q31_t)0xc3835d1e, (q31_t)0x2b0a7b54, (q31_t)0xc3877978, + (q31_t)0x2afe9c24, (q31_t)0xc38b9827, (q31_t)0x2af2bdc3, (q31_t)0xc38fb92a, + (q31_t)0x2ae6e031, (q31_t)0xc393dc82, (q31_t)0x2adb0370, (q31_t)0xc398022f, + (q31_t)0x2acf277f, (q31_t)0xc39c2a2f, (q31_t)0x2ac34c60, (q31_t)0xc3a05484, + (q31_t)0x2ab77212, (q31_t)0xc3a4812c, (q31_t)0x2aab9896, (q31_t)0xc3a8b028, + (q31_t)0x2a9fbfed, (q31_t)0xc3ace178, (q31_t)0x2a93e817, (q31_t)0xc3b1151b, + (q31_t)0x2a881114, (q31_t)0xc3b54b11, (q31_t)0x2a7c3ae5, (q31_t)0xc3b9835a, + (q31_t)0x2a70658a, (q31_t)0xc3bdbdf6, (q31_t)0x2a649105, (q31_t)0xc3c1fae5, + (q31_t)0x2a58bd54, (q31_t)0xc3c63a26, (q31_t)0x2a4cea79, (q31_t)0xc3ca7bba, + (q31_t)0x2a411874, (q31_t)0xc3cebfa0, (q31_t)0x2a354746, (q31_t)0xc3d305d8, + (q31_t)0x2a2976ef, (q31_t)0xc3d74e62, (q31_t)0x2a1da770, (q31_t)0xc3db993e, + (q31_t)0x2a11d8c8, (q31_t)0xc3dfe66c, (q31_t)0x2a060af9, (q31_t)0xc3e435ea, + (q31_t)0x29fa3e03, (q31_t)0xc3e887bb, (q31_t)0x29ee71e6, (q31_t)0xc3ecdbdc, + (q31_t)0x29e2a6a3, (q31_t)0xc3f1324e, (q31_t)0x29d6dc3b, (q31_t)0xc3f58b10, + (q31_t)0x29cb12ad, (q31_t)0xc3f9e624, (q31_t)0x29bf49fa, (q31_t)0xc3fe4388, + (q31_t)0x29b38223, (q31_t)0xc402a33c, (q31_t)0x29a7bb28, (q31_t)0xc4070540, + (q31_t)0x299bf509, (q31_t)0xc40b6994, (q31_t)0x29902fc7, (q31_t)0xc40fd037, + (q31_t)0x29846b63, (q31_t)0xc414392b, (q31_t)0x2978a7dd, (q31_t)0xc418a46d, + (q31_t)0x296ce535, (q31_t)0xc41d11ff, (q31_t)0x2961236c, (q31_t)0xc42181e0, + (q31_t)0x29556282, (q31_t)0xc425f410, (q31_t)0x2949a278, (q31_t)0xc42a688f, + (q31_t)0x293de34e, (q31_t)0xc42edf5c, (q31_t)0x29322505, (q31_t)0xc4335877, + (q31_t)0x2926679c, (q31_t)0xc437d3e1, (q31_t)0x291aab16, (q31_t)0xc43c5199, + (q31_t)0x290eef71, (q31_t)0xc440d19e, (q31_t)0x290334af, (q31_t)0xc44553f2, + (q31_t)0x28f77acf, (q31_t)0xc449d892, (q31_t)0x28ebc1d3, (q31_t)0xc44e5f80, + (q31_t)0x28e009ba, (q31_t)0xc452e8bc, (q31_t)0x28d45286, (q31_t)0xc4577444, + (q31_t)0x28c89c37, (q31_t)0xc45c0219, (q31_t)0x28bce6cd, (q31_t)0xc460923b, + (q31_t)0x28b13248, (q31_t)0xc46524a9, (q31_t)0x28a57ea9, (q31_t)0xc469b963, + (q31_t)0x2899cbf1, (q31_t)0xc46e5069, (q31_t)0x288e1a20, (q31_t)0xc472e9bc, + (q31_t)0x28826936, (q31_t)0xc477855a, (q31_t)0x2876b934, (q31_t)0xc47c2344, + (q31_t)0x286b0a1a, (q31_t)0xc480c379, (q31_t)0x285f5be9, (q31_t)0xc48565f9, + (q31_t)0x2853aea1, (q31_t)0xc48a0ac4, (q31_t)0x28480243, (q31_t)0xc48eb1db, + (q31_t)0x283c56cf, (q31_t)0xc4935b3c, (q31_t)0x2830ac45, (q31_t)0xc49806e7, + (q31_t)0x282502a7, (q31_t)0xc49cb4dd, (q31_t)0x281959f4, (q31_t)0xc4a1651c, + (q31_t)0x280db22d, (q31_t)0xc4a617a6, (q31_t)0x28020b52, (q31_t)0xc4aacc7a, + (q31_t)0x27f66564, (q31_t)0xc4af8397, (q31_t)0x27eac063, (q31_t)0xc4b43cfd, + (q31_t)0x27df1c50, (q31_t)0xc4b8f8ad, (q31_t)0x27d3792b, (q31_t)0xc4bdb6a6, + (q31_t)0x27c7d6f4, (q31_t)0xc4c276e8, (q31_t)0x27bc35ad, (q31_t)0xc4c73972, + (q31_t)0x27b09555, (q31_t)0xc4cbfe45, (q31_t)0x27a4f5ed, (q31_t)0xc4d0c560, + (q31_t)0x27995776, (q31_t)0xc4d58ec3, (q31_t)0x278db9ef, (q31_t)0xc4da5a6f, + (q31_t)0x27821d59, (q31_t)0xc4df2862, (q31_t)0x277681b6, (q31_t)0xc4e3f89c, + (q31_t)0x276ae704, (q31_t)0xc4e8cb1e, (q31_t)0x275f4d45, (q31_t)0xc4ed9fe7, + (q31_t)0x2753b479, (q31_t)0xc4f276f7, (q31_t)0x27481ca1, (q31_t)0xc4f7504e, + (q31_t)0x273c85bc, (q31_t)0xc4fc2bec, (q31_t)0x2730efcc, (q31_t)0xc50109d0, + (q31_t)0x27255ad1, (q31_t)0xc505e9fb, (q31_t)0x2719c6cb, (q31_t)0xc50acc6b, + (q31_t)0x270e33bb, (q31_t)0xc50fb121, (q31_t)0x2702a1a1, (q31_t)0xc514981d, + (q31_t)0x26f7107e, (q31_t)0xc519815f, (q31_t)0x26eb8052, (q31_t)0xc51e6ce6, + (q31_t)0x26dff11d, (q31_t)0xc5235ab2, (q31_t)0x26d462e1, (q31_t)0xc5284ac3, + (q31_t)0x26c8d59c, (q31_t)0xc52d3d18, (q31_t)0x26bd4951, (q31_t)0xc53231b3, + (q31_t)0x26b1bdff, (q31_t)0xc5372891, (q31_t)0x26a633a6, (q31_t)0xc53c21b4, + (q31_t)0x269aaa48, (q31_t)0xc5411d1b, (q31_t)0x268f21e5, (q31_t)0xc5461ac6, + (q31_t)0x26839a7c, (q31_t)0xc54b1ab4, (q31_t)0x26781410, (q31_t)0xc5501ce5, + (q31_t)0x266c8e9f, (q31_t)0xc555215a, (q31_t)0x26610a2a, (q31_t)0xc55a2812, + (q31_t)0x265586b3, (q31_t)0xc55f310d, (q31_t)0x264a0438, (q31_t)0xc5643c4a, + (q31_t)0x263e82bc, (q31_t)0xc56949ca, (q31_t)0x2633023e, (q31_t)0xc56e598c, + (q31_t)0x262782be, (q31_t)0xc5736b90, (q31_t)0x261c043d, (q31_t)0xc5787fd6, + (q31_t)0x261086bc, (q31_t)0xc57d965d, (q31_t)0x26050a3b, (q31_t)0xc582af26, + (q31_t)0x25f98ebb, (q31_t)0xc587ca31, (q31_t)0x25ee143b, (q31_t)0xc58ce77c, + (q31_t)0x25e29abc, (q31_t)0xc5920708, (q31_t)0x25d72240, (q31_t)0xc59728d5, + (q31_t)0x25cbaac5, (q31_t)0xc59c4ce3, (q31_t)0x25c0344d, (q31_t)0xc5a17330, + (q31_t)0x25b4bed8, (q31_t)0xc5a69bbe, (q31_t)0x25a94a67, (q31_t)0xc5abc68c, + (q31_t)0x259dd6f9, (q31_t)0xc5b0f399, (q31_t)0x25926490, (q31_t)0xc5b622e6, + (q31_t)0x2586f32c, (q31_t)0xc5bb5472, (q31_t)0x257b82cd, (q31_t)0xc5c0883d, + (q31_t)0x25701374, (q31_t)0xc5c5be47, (q31_t)0x2564a521, (q31_t)0xc5caf690, + (q31_t)0x255937d5, (q31_t)0xc5d03118, (q31_t)0x254dcb8f, (q31_t)0xc5d56ddd, + (q31_t)0x25426051, (q31_t)0xc5daace1, (q31_t)0x2536f61b, (q31_t)0xc5dfee22, + (q31_t)0x252b8cee, (q31_t)0xc5e531a1, (q31_t)0x252024c9, (q31_t)0xc5ea775e, + (q31_t)0x2514bdad, (q31_t)0xc5efbf58, (q31_t)0x2509579b, (q31_t)0xc5f5098f, + (q31_t)0x24fdf294, (q31_t)0xc5fa5603, (q31_t)0x24f28e96, (q31_t)0xc5ffa4b3, + (q31_t)0x24e72ba4, (q31_t)0xc604f5a0, (q31_t)0x24dbc9bd, (q31_t)0xc60a48c9, + (q31_t)0x24d068e2, (q31_t)0xc60f9e2e, (q31_t)0x24c50914, (q31_t)0xc614f5cf, + (q31_t)0x24b9aa52, (q31_t)0xc61a4fac, (q31_t)0x24ae4c9d, (q31_t)0xc61fabc4, + (q31_t)0x24a2eff6, (q31_t)0xc6250a18, (q31_t)0x2497945d, (q31_t)0xc62a6aa6, + (q31_t)0x248c39d3, (q31_t)0xc62fcd6f, (q31_t)0x2480e057, (q31_t)0xc6353273, + (q31_t)0x247587eb, (q31_t)0xc63a99b1, (q31_t)0x246a308f, (q31_t)0xc6400329, + (q31_t)0x245eda43, (q31_t)0xc6456edb, (q31_t)0x24538507, (q31_t)0xc64adcc7, + (q31_t)0x244830dd, (q31_t)0xc6504ced, (q31_t)0x243cddc4, (q31_t)0xc655bf4c, + (q31_t)0x24318bbe, (q31_t)0xc65b33e4, (q31_t)0x24263ac9, (q31_t)0xc660aab5, + (q31_t)0x241aeae8, (q31_t)0xc66623be, (q31_t)0x240f9c1a, (q31_t)0xc66b9f01, + (q31_t)0x24044e60, (q31_t)0xc6711c7b, (q31_t)0x23f901ba, (q31_t)0xc6769c2e, + (q31_t)0x23edb628, (q31_t)0xc67c1e18, (q31_t)0x23e26bac, (q31_t)0xc681a23a, + (q31_t)0x23d72245, (q31_t)0xc6872894, (q31_t)0x23cbd9f4, (q31_t)0xc68cb124, + (q31_t)0x23c092b9, (q31_t)0xc6923bec, (q31_t)0x23b54c95, (q31_t)0xc697c8eb, + (q31_t)0x23aa0788, (q31_t)0xc69d5820, (q31_t)0x239ec393, (q31_t)0xc6a2e98b, + (q31_t)0x239380b6, (q31_t)0xc6a87d2d, (q31_t)0x23883ef2, (q31_t)0xc6ae1304, + (q31_t)0x237cfe47, (q31_t)0xc6b3ab12, (q31_t)0x2371beb5, (q31_t)0xc6b94554, + (q31_t)0x2366803c, (q31_t)0xc6bee1cd, (q31_t)0x235b42df, (q31_t)0xc6c4807a, + (q31_t)0x2350069b, (q31_t)0xc6ca215c, (q31_t)0x2344cb73, (q31_t)0xc6cfc472, + (q31_t)0x23399167, (q31_t)0xc6d569be, (q31_t)0x232e5876, (q31_t)0xc6db113d, + (q31_t)0x232320a2, (q31_t)0xc6e0baf0, (q31_t)0x2317e9eb, (q31_t)0xc6e666d7, + (q31_t)0x230cb451, (q31_t)0xc6ec14f2, (q31_t)0x23017fd5, (q31_t)0xc6f1c540, + (q31_t)0x22f64c77, (q31_t)0xc6f777c1, (q31_t)0x22eb1a37, (q31_t)0xc6fd2c75, + (q31_t)0x22dfe917, (q31_t)0xc702e35c, (q31_t)0x22d4b916, (q31_t)0xc7089c75, + (q31_t)0x22c98a35, (q31_t)0xc70e57c0, (q31_t)0x22be5c74, (q31_t)0xc714153e, + (q31_t)0x22b32fd4, (q31_t)0xc719d4ed, (q31_t)0x22a80456, (q31_t)0xc71f96ce, + (q31_t)0x229cd9f8, (q31_t)0xc7255ae0, (q31_t)0x2291b0bd, (q31_t)0xc72b2123, + (q31_t)0x228688a4, (q31_t)0xc730e997, (q31_t)0x227b61af, (q31_t)0xc736b43c, + (q31_t)0x22703bdc, (q31_t)0xc73c8111, (q31_t)0x2265172e, (q31_t)0xc7425016, + (q31_t)0x2259f3a3, (q31_t)0xc748214c, (q31_t)0x224ed13d, (q31_t)0xc74df4b1, + (q31_t)0x2243affc, (q31_t)0xc753ca46, (q31_t)0x22388fe1, (q31_t)0xc759a20a, + (q31_t)0x222d70eb, (q31_t)0xc75f7bfe, (q31_t)0x2222531c, (q31_t)0xc7655820, + (q31_t)0x22173674, (q31_t)0xc76b3671, (q31_t)0x220c1af3, (q31_t)0xc77116f0, + (q31_t)0x22010099, (q31_t)0xc776f99d, (q31_t)0x21f5e768, (q31_t)0xc77cde79, + (q31_t)0x21eacf5f, (q31_t)0xc782c582, (q31_t)0x21dfb87f, (q31_t)0xc788aeb9, + (q31_t)0x21d4a2c8, (q31_t)0xc78e9a1d, (q31_t)0x21c98e3b, (q31_t)0xc79487ae, + (q31_t)0x21be7ad8, (q31_t)0xc79a776c, (q31_t)0x21b368a0, (q31_t)0xc7a06957, + (q31_t)0x21a85793, (q31_t)0xc7a65d6e, (q31_t)0x219d47b1, (q31_t)0xc7ac53b1, + (q31_t)0x219238fb, (q31_t)0xc7b24c20, (q31_t)0x21872b72, (q31_t)0xc7b846ba, + (q31_t)0x217c1f15, (q31_t)0xc7be4381, (q31_t)0x217113e5, (q31_t)0xc7c44272, + (q31_t)0x216609e3, (q31_t)0xc7ca438f, (q31_t)0x215b0110, (q31_t)0xc7d046d6, + (q31_t)0x214ff96a, (q31_t)0xc7d64c47, (q31_t)0x2144f2f3, (q31_t)0xc7dc53e3, + (q31_t)0x2139edac, (q31_t)0xc7e25daa, (q31_t)0x212ee995, (q31_t)0xc7e8699a, + (q31_t)0x2123e6ad, (q31_t)0xc7ee77b3, (q31_t)0x2118e4f6, (q31_t)0xc7f487f6, + (q31_t)0x210de470, (q31_t)0xc7fa9a62, (q31_t)0x2102e51c, (q31_t)0xc800aef7, + (q31_t)0x20f7e6f9, (q31_t)0xc806c5b5, (q31_t)0x20ecea09, (q31_t)0xc80cde9b, + (q31_t)0x20e1ee4b, (q31_t)0xc812f9a9, (q31_t)0x20d6f3c1, (q31_t)0xc81916df, + (q31_t)0x20cbfa6a, (q31_t)0xc81f363d, (q31_t)0x20c10247, (q31_t)0xc82557c3, + (q31_t)0x20b60b58, (q31_t)0xc82b7b70, (q31_t)0x20ab159e, (q31_t)0xc831a143, + (q31_t)0x20a0211a, (q31_t)0xc837c93e, (q31_t)0x20952dcb, (q31_t)0xc83df35f, + (q31_t)0x208a3bb2, (q31_t)0xc8441fa6, (q31_t)0x207f4acf, (q31_t)0xc84a4e14, + (q31_t)0x20745b24, (q31_t)0xc8507ea7, (q31_t)0x20696cb0, (q31_t)0xc856b160, + (q31_t)0x205e7f74, (q31_t)0xc85ce63e, (q31_t)0x2053936f, (q31_t)0xc8631d42, + (q31_t)0x2048a8a4, (q31_t)0xc869566a, (q31_t)0x203dbf11, (q31_t)0xc86f91b7, + (q31_t)0x2032d6b8, (q31_t)0xc875cf28, (q31_t)0x2027ef99, (q31_t)0xc87c0ebd, + (q31_t)0x201d09b4, (q31_t)0xc8825077, (q31_t)0x2012250a, (q31_t)0xc8889454, + (q31_t)0x2007419b, (q31_t)0xc88eda54, (q31_t)0x1ffc5f67, (q31_t)0xc8952278, + (q31_t)0x1ff17e70, (q31_t)0xc89b6cbf, (q31_t)0x1fe69eb4, (q31_t)0xc8a1b928, + (q31_t)0x1fdbc036, (q31_t)0xc8a807b4, (q31_t)0x1fd0e2f5, (q31_t)0xc8ae5862, + (q31_t)0x1fc606f1, (q31_t)0xc8b4ab32, (q31_t)0x1fbb2c2c, (q31_t)0xc8bb0023, + (q31_t)0x1fb052a5, (q31_t)0xc8c15736, (q31_t)0x1fa57a5d, (q31_t)0xc8c7b06b, + (q31_t)0x1f9aa354, (q31_t)0xc8ce0bc0, (q31_t)0x1f8fcd8b, (q31_t)0xc8d46936, + (q31_t)0x1f84f902, (q31_t)0xc8dac8cd, (q31_t)0x1f7a25ba, (q31_t)0xc8e12a84, + (q31_t)0x1f6f53b3, (q31_t)0xc8e78e5b, (q31_t)0x1f6482ed, (q31_t)0xc8edf452, + (q31_t)0x1f59b369, (q31_t)0xc8f45c68, (q31_t)0x1f4ee527, (q31_t)0xc8fac69e, + (q31_t)0x1f441828, (q31_t)0xc90132f2, (q31_t)0x1f394c6b, (q31_t)0xc907a166, + (q31_t)0x1f2e81f3, (q31_t)0xc90e11f7, (q31_t)0x1f23b8be, (q31_t)0xc91484a8, + (q31_t)0x1f18f0ce, (q31_t)0xc91af976, (q31_t)0x1f0e2a22, (q31_t)0xc9217062, + (q31_t)0x1f0364bc, (q31_t)0xc927e96b, (q31_t)0x1ef8a09b, (q31_t)0xc92e6492, + (q31_t)0x1eedddc0, (q31_t)0xc934e1d6, (q31_t)0x1ee31c2b, (q31_t)0xc93b6137, + (q31_t)0x1ed85bdd, (q31_t)0xc941e2b4, (q31_t)0x1ecd9cd7, (q31_t)0xc948664d, + (q31_t)0x1ec2df18, (q31_t)0xc94eec03, (q31_t)0x1eb822a1, (q31_t)0xc95573d4, + (q31_t)0x1ead6773, (q31_t)0xc95bfdc1, (q31_t)0x1ea2ad8d, (q31_t)0xc96289c9, + (q31_t)0x1e97f4f1, (q31_t)0xc96917ec, (q31_t)0x1e8d3d9e, (q31_t)0xc96fa82a, + (q31_t)0x1e828796, (q31_t)0xc9763a83, (q31_t)0x1e77d2d8, (q31_t)0xc97ccef5, + (q31_t)0x1e6d1f65, (q31_t)0xc9836582, (q31_t)0x1e626d3e, (q31_t)0xc989fe29, + (q31_t)0x1e57bc62, (q31_t)0xc99098e9, (q31_t)0x1e4d0cd2, (q31_t)0xc99735c2, + (q31_t)0x1e425e8f, (q31_t)0xc99dd4b4, (q31_t)0x1e37b199, (q31_t)0xc9a475bf, + (q31_t)0x1e2d05f1, (q31_t)0xc9ab18e3, (q31_t)0x1e225b96, (q31_t)0xc9b1be1e, + (q31_t)0x1e17b28a, (q31_t)0xc9b86572, (q31_t)0x1e0d0acc, (q31_t)0xc9bf0edd, + (q31_t)0x1e02645d, (q31_t)0xc9c5ba60, (q31_t)0x1df7bf3e, (q31_t)0xc9cc67fa, + (q31_t)0x1ded1b6e, (q31_t)0xc9d317ab, (q31_t)0x1de278ef, (q31_t)0xc9d9c973, + (q31_t)0x1dd7d7c1, (q31_t)0xc9e07d51, (q31_t)0x1dcd37e4, (q31_t)0xc9e73346, + (q31_t)0x1dc29958, (q31_t)0xc9edeb50, (q31_t)0x1db7fc1e, (q31_t)0xc9f4a570, + (q31_t)0x1dad6036, (q31_t)0xc9fb61a5, (q31_t)0x1da2c5a2, (q31_t)0xca021fef, + (q31_t)0x1d982c60, (q31_t)0xca08e04f, (q31_t)0x1d8d9472, (q31_t)0xca0fa2c3, + (q31_t)0x1d82fdd8, (q31_t)0xca16674b, (q31_t)0x1d786892, (q31_t)0xca1d2de7, + (q31_t)0x1d6dd4a2, (q31_t)0xca23f698, (q31_t)0x1d634206, (q31_t)0xca2ac15b, + (q31_t)0x1d58b0c0, (q31_t)0xca318e32, (q31_t)0x1d4e20d0, (q31_t)0xca385d1d, + (q31_t)0x1d439236, (q31_t)0xca3f2e19, (q31_t)0x1d3904f4, (q31_t)0xca460129, + (q31_t)0x1d2e7908, (q31_t)0xca4cd64b, (q31_t)0x1d23ee74, (q31_t)0xca53ad7e, + (q31_t)0x1d196538, (q31_t)0xca5a86c4, (q31_t)0x1d0edd55, (q31_t)0xca61621b, + (q31_t)0x1d0456ca, (q31_t)0xca683f83, (q31_t)0x1cf9d199, (q31_t)0xca6f1efc, + (q31_t)0x1cef4dc2, (q31_t)0xca760086, (q31_t)0x1ce4cb44, (q31_t)0xca7ce420, + (q31_t)0x1cda4a21, (q31_t)0xca83c9ca, (q31_t)0x1ccfca59, (q31_t)0xca8ab184, + (q31_t)0x1cc54bec, (q31_t)0xca919b4e, (q31_t)0x1cbacedb, (q31_t)0xca988727, + (q31_t)0x1cb05326, (q31_t)0xca9f750f, (q31_t)0x1ca5d8cd, (q31_t)0xcaa66506, + (q31_t)0x1c9b5fd2, (q31_t)0xcaad570c, (q31_t)0x1c90e834, (q31_t)0xcab44b1f, + (q31_t)0x1c8671f3, (q31_t)0xcabb4141, (q31_t)0x1c7bfd11, (q31_t)0xcac23971, + (q31_t)0x1c71898d, (q31_t)0xcac933ae, (q31_t)0x1c671768, (q31_t)0xcad02ff8, + (q31_t)0x1c5ca6a2, (q31_t)0xcad72e4f, (q31_t)0x1c52373c, (q31_t)0xcade2eb3, + (q31_t)0x1c47c936, (q31_t)0xcae53123, (q31_t)0x1c3d5c91, (q31_t)0xcaec35a0, + (q31_t)0x1c32f14d, (q31_t)0xcaf33c28, (q31_t)0x1c28876a, (q31_t)0xcafa44bc, + (q31_t)0x1c1e1ee9, (q31_t)0xcb014f5b, (q31_t)0x1c13b7c9, (q31_t)0xcb085c05, + (q31_t)0x1c09520d, (q31_t)0xcb0f6aba, (q31_t)0x1bfeedb3, (q31_t)0xcb167b79, + (q31_t)0x1bf48abd, (q31_t)0xcb1d8e43, (q31_t)0x1bea292b, (q31_t)0xcb24a316, + (q31_t)0x1bdfc8fc, (q31_t)0xcb2bb9f4, (q31_t)0x1bd56a32, (q31_t)0xcb32d2da, + (q31_t)0x1bcb0cce, (q31_t)0xcb39edca, (q31_t)0x1bc0b0ce, (q31_t)0xcb410ac3, + (q31_t)0x1bb65634, (q31_t)0xcb4829c4, (q31_t)0x1babfd01, (q31_t)0xcb4f4acd, + (q31_t)0x1ba1a534, (q31_t)0xcb566ddf, (q31_t)0x1b974ece, (q31_t)0xcb5d92f8, + (q31_t)0x1b8cf9cf, (q31_t)0xcb64ba19, (q31_t)0x1b82a638, (q31_t)0xcb6be341, + (q31_t)0x1b785409, (q31_t)0xcb730e70, (q31_t)0x1b6e0342, (q31_t)0xcb7a3ba5, + (q31_t)0x1b63b3e5, (q31_t)0xcb816ae1, (q31_t)0x1b5965f1, (q31_t)0xcb889c23, + (q31_t)0x1b4f1967, (q31_t)0xcb8fcf6b, (q31_t)0x1b44ce46, (q31_t)0xcb9704b9, + (q31_t)0x1b3a8491, (q31_t)0xcb9e3c0b, (q31_t)0x1b303c46, (q31_t)0xcba57563, + (q31_t)0x1b25f566, (q31_t)0xcbacb0bf, (q31_t)0x1b1baff2, (q31_t)0xcbb3ee20, + (q31_t)0x1b116beb, (q31_t)0xcbbb2d85, (q31_t)0x1b072950, (q31_t)0xcbc26eee, + (q31_t)0x1afce821, (q31_t)0xcbc9b25a, (q31_t)0x1af2a860, (q31_t)0xcbd0f7ca, + (q31_t)0x1ae86a0d, (q31_t)0xcbd83f3d, (q31_t)0x1ade2d28, (q31_t)0xcbdf88b3, + (q31_t)0x1ad3f1b1, (q31_t)0xcbe6d42b, (q31_t)0x1ac9b7a9, (q31_t)0xcbee21a5, + (q31_t)0x1abf7f11, (q31_t)0xcbf57121, (q31_t)0x1ab547e8, (q31_t)0xcbfcc29f, + (q31_t)0x1aab122f, (q31_t)0xcc04161e, (q31_t)0x1aa0dde7, (q31_t)0xcc0b6b9e, + (q31_t)0x1a96ab0f, (q31_t)0xcc12c31f, (q31_t)0x1a8c79a9, (q31_t)0xcc1a1ca0, + (q31_t)0x1a8249b4, (q31_t)0xcc217822, (q31_t)0x1a781b31, (q31_t)0xcc28d5a3, + (q31_t)0x1a6dee21, (q31_t)0xcc303524, (q31_t)0x1a63c284, (q31_t)0xcc3796a5, + (q31_t)0x1a599859, (q31_t)0xcc3efa25, (q31_t)0x1a4f6fa3, (q31_t)0xcc465fa3, + (q31_t)0x1a454860, (q31_t)0xcc4dc720, (q31_t)0x1a3b2292, (q31_t)0xcc55309b, + (q31_t)0x1a30fe38, (q31_t)0xcc5c9c14, (q31_t)0x1a26db54, (q31_t)0xcc64098b, + (q31_t)0x1a1cb9e5, (q31_t)0xcc6b78ff, (q31_t)0x1a1299ec, (q31_t)0xcc72ea70, + (q31_t)0x1a087b69, (q31_t)0xcc7a5dde, (q31_t)0x19fe5e5e, (q31_t)0xcc81d349, + (q31_t)0x19f442c9, (q31_t)0xcc894aaf, (q31_t)0x19ea28ac, (q31_t)0xcc90c412, + (q31_t)0x19e01006, (q31_t)0xcc983f70, (q31_t)0x19d5f8d9, (q31_t)0xcc9fbcca, + (q31_t)0x19cbe325, (q31_t)0xcca73c1e, (q31_t)0x19c1cee9, (q31_t)0xccaebd6e, + (q31_t)0x19b7bc27, (q31_t)0xccb640b8, (q31_t)0x19adaadf, (q31_t)0xccbdc5fc, + (q31_t)0x19a39b11, (q31_t)0xccc54d3a, (q31_t)0x19998cbe, (q31_t)0xccccd671, + (q31_t)0x198f7fe6, (q31_t)0xccd461a2, (q31_t)0x19857489, (q31_t)0xccdbeecc, + (q31_t)0x197b6aa8, (q31_t)0xcce37def, (q31_t)0x19716243, (q31_t)0xcceb0f0a, + (q31_t)0x19675b5a, (q31_t)0xccf2a21d, (q31_t)0x195d55ef, (q31_t)0xccfa3729, + (q31_t)0x19535201, (q31_t)0xcd01ce2b, (q31_t)0x19494f90, (q31_t)0xcd096725, + (q31_t)0x193f4e9e, (q31_t)0xcd110216, (q31_t)0x19354f2a, (q31_t)0xcd189efe, + (q31_t)0x192b5135, (q31_t)0xcd203ddc, (q31_t)0x192154bf, (q31_t)0xcd27deb0, + (q31_t)0x191759c9, (q31_t)0xcd2f817b, (q31_t)0x190d6053, (q31_t)0xcd37263a, + (q31_t)0x1903685d, (q31_t)0xcd3eccef, (q31_t)0x18f971e8, (q31_t)0xcd467599, + (q31_t)0x18ef7cf4, (q31_t)0xcd4e2037, (q31_t)0x18e58982, (q31_t)0xcd55ccca, + (q31_t)0x18db9792, (q31_t)0xcd5d7b50, (q31_t)0x18d1a724, (q31_t)0xcd652bcb, + (q31_t)0x18c7b838, (q31_t)0xcd6cde39, (q31_t)0x18bdcad0, (q31_t)0xcd74929a, + (q31_t)0x18b3deeb, (q31_t)0xcd7c48ee, (q31_t)0x18a9f48a, (q31_t)0xcd840134, + (q31_t)0x18a00bae, (q31_t)0xcd8bbb6d, (q31_t)0x18962456, (q31_t)0xcd937798, + (q31_t)0x188c3e83, (q31_t)0xcd9b35b4, (q31_t)0x18825a35, (q31_t)0xcda2f5c2, + (q31_t)0x1878776d, (q31_t)0xcdaab7c0, (q31_t)0x186e962b, (q31_t)0xcdb27bb0, + (q31_t)0x1864b670, (q31_t)0xcdba4190, (q31_t)0x185ad83c, (q31_t)0xcdc20960, + (q31_t)0x1850fb8e, (q31_t)0xcdc9d320, (q31_t)0x18472069, (q31_t)0xcdd19ed0, + (q31_t)0x183d46cc, (q31_t)0xcdd96c6f, (q31_t)0x18336eb7, (q31_t)0xcde13bfd, + (q31_t)0x1829982b, (q31_t)0xcde90d79, (q31_t)0x181fc328, (q31_t)0xcdf0e0e4, + (q31_t)0x1815efae, (q31_t)0xcdf8b63d, (q31_t)0x180c1dbf, (q31_t)0xce008d84, + (q31_t)0x18024d59, (q31_t)0xce0866b8, (q31_t)0x17f87e7f, (q31_t)0xce1041d9, + (q31_t)0x17eeb130, (q31_t)0xce181ee8, (q31_t)0x17e4e56c, (q31_t)0xce1ffde2, + (q31_t)0x17db1b34, (q31_t)0xce27dec9, (q31_t)0x17d15288, (q31_t)0xce2fc19c, + (q31_t)0x17c78b68, (q31_t)0xce37a65b, (q31_t)0x17bdc5d6, (q31_t)0xce3f8d05, + (q31_t)0x17b401d1, (q31_t)0xce47759a, (q31_t)0x17aa3f5a, (q31_t)0xce4f6019, + (q31_t)0x17a07e70, (q31_t)0xce574c84, (q31_t)0x1796bf16, (q31_t)0xce5f3ad8, + (q31_t)0x178d014a, (q31_t)0xce672b16, (q31_t)0x1783450d, (q31_t)0xce6f1d3d, + (q31_t)0x17798a60, (q31_t)0xce77114e, (q31_t)0x176fd143, (q31_t)0xce7f0748, + (q31_t)0x176619b6, (q31_t)0xce86ff2a, (q31_t)0x175c63ba, (q31_t)0xce8ef8f4, + (q31_t)0x1752af4f, (q31_t)0xce96f4a7, (q31_t)0x1748fc75, (q31_t)0xce9ef241, + (q31_t)0x173f4b2e, (q31_t)0xcea6f1c2, (q31_t)0x17359b78, (q31_t)0xceaef32b, + (q31_t)0x172bed55, (q31_t)0xceb6f67a, (q31_t)0x172240c5, (q31_t)0xcebefbb0, + (q31_t)0x171895c9, (q31_t)0xcec702cb, (q31_t)0x170eec60, (q31_t)0xcecf0bcd, + (q31_t)0x1705448b, (q31_t)0xced716b4, (q31_t)0x16fb9e4b, (q31_t)0xcedf2380, + (q31_t)0x16f1f99f, (q31_t)0xcee73231, (q31_t)0x16e85689, (q31_t)0xceef42c7, + (q31_t)0x16deb508, (q31_t)0xcef75541, (q31_t)0x16d5151d, (q31_t)0xceff699f, + (q31_t)0x16cb76c9, (q31_t)0xcf077fe1, (q31_t)0x16c1da0b, (q31_t)0xcf0f9805, + (q31_t)0x16b83ee4, (q31_t)0xcf17b20d, (q31_t)0x16aea555, (q31_t)0xcf1fcdf8, + (q31_t)0x16a50d5d, (q31_t)0xcf27ebc5, (q31_t)0x169b76fe, (q31_t)0xcf300b74, + (q31_t)0x1691e237, (q31_t)0xcf382d05, (q31_t)0x16884f09, (q31_t)0xcf405077, + (q31_t)0x167ebd74, (q31_t)0xcf4875ca, (q31_t)0x16752d79, (q31_t)0xcf509cfe, + (q31_t)0x166b9f18, (q31_t)0xcf58c613, (q31_t)0x16621251, (q31_t)0xcf60f108, + (q31_t)0x16588725, (q31_t)0xcf691ddd, (q31_t)0x164efd94, (q31_t)0xcf714c91, + (q31_t)0x1645759f, (q31_t)0xcf797d24, (q31_t)0x163bef46, (q31_t)0xcf81af97, + (q31_t)0x16326a88, (q31_t)0xcf89e3e8, (q31_t)0x1628e767, (q31_t)0xcf921a17, + (q31_t)0x161f65e4, (q31_t)0xcf9a5225, (q31_t)0x1615e5fd, (q31_t)0xcfa28c10, + (q31_t)0x160c67b4, (q31_t)0xcfaac7d8, (q31_t)0x1602eb0a, (q31_t)0xcfb3057d, + (q31_t)0x15f96ffd, (q31_t)0xcfbb4500, (q31_t)0x15eff690, (q31_t)0xcfc3865e, + (q31_t)0x15e67ec1, (q31_t)0xcfcbc999, (q31_t)0x15dd0892, (q31_t)0xcfd40eaf, + (q31_t)0x15d39403, (q31_t)0xcfdc55a1, (q31_t)0x15ca2115, (q31_t)0xcfe49e6d, + (q31_t)0x15c0afc6, (q31_t)0xcfece915, (q31_t)0x15b74019, (q31_t)0xcff53597, + (q31_t)0x15add20d, (q31_t)0xcffd83f4, (q31_t)0x15a465a3, (q31_t)0xd005d42a, + (q31_t)0x159afadb, (q31_t)0xd00e2639, (q31_t)0x159191b5, (q31_t)0xd0167a22, + (q31_t)0x15882a32, (q31_t)0xd01ecfe4, (q31_t)0x157ec452, (q31_t)0xd027277e, + (q31_t)0x15756016, (q31_t)0xd02f80f1, (q31_t)0x156bfd7d, (q31_t)0xd037dc3b, + (q31_t)0x15629c89, (q31_t)0xd040395d, (q31_t)0x15593d3a, (q31_t)0xd0489856, + (q31_t)0x154fdf8f, (q31_t)0xd050f926, (q31_t)0x15468389, (q31_t)0xd0595bcd, + (q31_t)0x153d292a, (q31_t)0xd061c04a, (q31_t)0x1533d070, (q31_t)0xd06a269d, + (q31_t)0x152a795d, (q31_t)0xd0728ec6, (q31_t)0x152123f0, (q31_t)0xd07af8c4, + (q31_t)0x1517d02b, (q31_t)0xd0836497, (q31_t)0x150e7e0d, (q31_t)0xd08bd23f, + (q31_t)0x15052d97, (q31_t)0xd09441bb, (q31_t)0x14fbdec9, (q31_t)0xd09cb30b, + (q31_t)0x14f291a4, (q31_t)0xd0a5262f, (q31_t)0x14e94627, (q31_t)0xd0ad9b26, + (q31_t)0x14dffc54, (q31_t)0xd0b611f1, (q31_t)0x14d6b42b, (q31_t)0xd0be8a8d, + (q31_t)0x14cd6dab, (q31_t)0xd0c704fd, (q31_t)0x14c428d6, (q31_t)0xd0cf813e, + (q31_t)0x14bae5ab, (q31_t)0xd0d7ff51, (q31_t)0x14b1a42c, (q31_t)0xd0e07f36, + (q31_t)0x14a86458, (q31_t)0xd0e900ec, (q31_t)0x149f2630, (q31_t)0xd0f18472, + (q31_t)0x1495e9b3, (q31_t)0xd0fa09c9, (q31_t)0x148caee4, (q31_t)0xd10290f0, + (q31_t)0x148375c1, (q31_t)0xd10b19e7, (q31_t)0x147a3e4b, (q31_t)0xd113a4ad, + (q31_t)0x14710883, (q31_t)0xd11c3142, (q31_t)0x1467d469, (q31_t)0xd124bfa6, + (q31_t)0x145ea1fd, (q31_t)0xd12d4fd9, (q31_t)0x14557140, (q31_t)0xd135e1d9, + (q31_t)0x144c4232, (q31_t)0xd13e75a8, (q31_t)0x144314d3, (q31_t)0xd1470b44, + (q31_t)0x1439e923, (q31_t)0xd14fa2ad, (q31_t)0x1430bf24, (q31_t)0xd1583be2, + (q31_t)0x142796d5, (q31_t)0xd160d6e5, (q31_t)0x141e7037, (q31_t)0xd16973b3, + (q31_t)0x14154b4a, (q31_t)0xd172124d, (q31_t)0x140c280e, (q31_t)0xd17ab2b3, + (q31_t)0x14030684, (q31_t)0xd18354e4, (q31_t)0x13f9e6ad, (q31_t)0xd18bf8e0, + (q31_t)0x13f0c887, (q31_t)0xd1949ea6, (q31_t)0x13e7ac15, (q31_t)0xd19d4636, + (q31_t)0x13de9156, (q31_t)0xd1a5ef90, (q31_t)0x13d5784a, (q31_t)0xd1ae9ab4, + (q31_t)0x13cc60f2, (q31_t)0xd1b747a0, (q31_t)0x13c34b4f, (q31_t)0xd1bff656, + (q31_t)0x13ba3760, (q31_t)0xd1c8a6d4, (q31_t)0x13b12526, (q31_t)0xd1d1591a, + (q31_t)0x13a814a2, (q31_t)0xd1da0d28, (q31_t)0x139f05d3, (q31_t)0xd1e2c2fd, + (q31_t)0x1395f8ba, (q31_t)0xd1eb7a9a, (q31_t)0x138ced57, (q31_t)0xd1f433fd, + (q31_t)0x1383e3ab, (q31_t)0xd1fcef27, (q31_t)0x137adbb6, (q31_t)0xd205ac17, + (q31_t)0x1371d579, (q31_t)0xd20e6acc, (q31_t)0x1368d0f3, (q31_t)0xd2172b48, + (q31_t)0x135fce26, (q31_t)0xd21fed88, (q31_t)0x1356cd11, (q31_t)0xd228b18d, + (q31_t)0x134dcdb4, (q31_t)0xd2317756, (q31_t)0x1344d011, (q31_t)0xd23a3ee4, + (q31_t)0x133bd427, (q31_t)0xd2430835, (q31_t)0x1332d9f7, (q31_t)0xd24bd34a, + (q31_t)0x1329e181, (q31_t)0xd254a021, (q31_t)0x1320eac6, (q31_t)0xd25d6ebc, + (q31_t)0x1317f5c6, (q31_t)0xd2663f19, (q31_t)0x130f0280, (q31_t)0xd26f1138, + (q31_t)0x130610f7, (q31_t)0xd277e518, (q31_t)0x12fd2129, (q31_t)0xd280babb, + (q31_t)0x12f43318, (q31_t)0xd289921e, (q31_t)0x12eb46c3, (q31_t)0xd2926b41, + (q31_t)0x12e25c2b, (q31_t)0xd29b4626, (q31_t)0x12d97350, (q31_t)0xd2a422ca, + (q31_t)0x12d08c33, (q31_t)0xd2ad012e, (q31_t)0x12c7a6d4, (q31_t)0xd2b5e151, + (q31_t)0x12bec333, (q31_t)0xd2bec333, (q31_t)0x12b5e151, (q31_t)0xd2c7a6d4, + (q31_t)0x12ad012e, (q31_t)0xd2d08c33, (q31_t)0x12a422ca, (q31_t)0xd2d97350, + (q31_t)0x129b4626, (q31_t)0xd2e25c2b, (q31_t)0x12926b41, (q31_t)0xd2eb46c3, + (q31_t)0x1289921e, (q31_t)0xd2f43318, (q31_t)0x1280babb, (q31_t)0xd2fd2129, + (q31_t)0x1277e518, (q31_t)0xd30610f7, (q31_t)0x126f1138, (q31_t)0xd30f0280, + (q31_t)0x12663f19, (q31_t)0xd317f5c6, (q31_t)0x125d6ebc, (q31_t)0xd320eac6, + (q31_t)0x1254a021, (q31_t)0xd329e181, (q31_t)0x124bd34a, (q31_t)0xd332d9f7, + (q31_t)0x12430835, (q31_t)0xd33bd427, (q31_t)0x123a3ee4, (q31_t)0xd344d011, + (q31_t)0x12317756, (q31_t)0xd34dcdb4, (q31_t)0x1228b18d, (q31_t)0xd356cd11, + (q31_t)0x121fed88, (q31_t)0xd35fce26, (q31_t)0x12172b48, (q31_t)0xd368d0f3, + (q31_t)0x120e6acc, (q31_t)0xd371d579, (q31_t)0x1205ac17, (q31_t)0xd37adbb6, + (q31_t)0x11fcef27, (q31_t)0xd383e3ab, (q31_t)0x11f433fd, (q31_t)0xd38ced57, + (q31_t)0x11eb7a9a, (q31_t)0xd395f8ba, (q31_t)0x11e2c2fd, (q31_t)0xd39f05d3, + (q31_t)0x11da0d28, (q31_t)0xd3a814a2, (q31_t)0x11d1591a, (q31_t)0xd3b12526, + (q31_t)0x11c8a6d4, (q31_t)0xd3ba3760, (q31_t)0x11bff656, (q31_t)0xd3c34b4f, + (q31_t)0x11b747a0, (q31_t)0xd3cc60f2, (q31_t)0x11ae9ab4, (q31_t)0xd3d5784a, + (q31_t)0x11a5ef90, (q31_t)0xd3de9156, (q31_t)0x119d4636, (q31_t)0xd3e7ac15, + (q31_t)0x11949ea6, (q31_t)0xd3f0c887, (q31_t)0x118bf8e0, (q31_t)0xd3f9e6ad, + (q31_t)0x118354e4, (q31_t)0xd4030684, (q31_t)0x117ab2b3, (q31_t)0xd40c280e, + (q31_t)0x1172124d, (q31_t)0xd4154b4a, (q31_t)0x116973b3, (q31_t)0xd41e7037, + (q31_t)0x1160d6e5, (q31_t)0xd42796d5, (q31_t)0x11583be2, (q31_t)0xd430bf24, + (q31_t)0x114fa2ad, (q31_t)0xd439e923, (q31_t)0x11470b44, (q31_t)0xd44314d3, + (q31_t)0x113e75a8, (q31_t)0xd44c4232, (q31_t)0x1135e1d9, (q31_t)0xd4557140, + (q31_t)0x112d4fd9, (q31_t)0xd45ea1fd, (q31_t)0x1124bfa6, (q31_t)0xd467d469, + (q31_t)0x111c3142, (q31_t)0xd4710883, (q31_t)0x1113a4ad, (q31_t)0xd47a3e4b, + (q31_t)0x110b19e7, (q31_t)0xd48375c1, (q31_t)0x110290f0, (q31_t)0xd48caee4, + (q31_t)0x10fa09c9, (q31_t)0xd495e9b3, (q31_t)0x10f18472, (q31_t)0xd49f2630, + (q31_t)0x10e900ec, (q31_t)0xd4a86458, (q31_t)0x10e07f36, (q31_t)0xd4b1a42c, + (q31_t)0x10d7ff51, (q31_t)0xd4bae5ab, (q31_t)0x10cf813e, (q31_t)0xd4c428d6, + (q31_t)0x10c704fd, (q31_t)0xd4cd6dab, (q31_t)0x10be8a8d, (q31_t)0xd4d6b42b, + (q31_t)0x10b611f1, (q31_t)0xd4dffc54, (q31_t)0x10ad9b26, (q31_t)0xd4e94627, + (q31_t)0x10a5262f, (q31_t)0xd4f291a4, (q31_t)0x109cb30b, (q31_t)0xd4fbdec9, + (q31_t)0x109441bb, (q31_t)0xd5052d97, (q31_t)0x108bd23f, (q31_t)0xd50e7e0d, + (q31_t)0x10836497, (q31_t)0xd517d02b, (q31_t)0x107af8c4, (q31_t)0xd52123f0, + (q31_t)0x10728ec6, (q31_t)0xd52a795d, (q31_t)0x106a269d, (q31_t)0xd533d070, + (q31_t)0x1061c04a, (q31_t)0xd53d292a, (q31_t)0x10595bcd, (q31_t)0xd5468389, + (q31_t)0x1050f926, (q31_t)0xd54fdf8f, (q31_t)0x10489856, (q31_t)0xd5593d3a, + (q31_t)0x1040395d, (q31_t)0xd5629c89, (q31_t)0x1037dc3b, (q31_t)0xd56bfd7d, + (q31_t)0x102f80f1, (q31_t)0xd5756016, (q31_t)0x1027277e, (q31_t)0xd57ec452, + (q31_t)0x101ecfe4, (q31_t)0xd5882a32, (q31_t)0x10167a22, (q31_t)0xd59191b5, + (q31_t)0x100e2639, (q31_t)0xd59afadb, (q31_t)0x1005d42a, (q31_t)0xd5a465a3, + (q31_t)0xffd83f4, (q31_t)0xd5add20d, (q31_t)0xff53597, (q31_t)0xd5b74019, + (q31_t)0xfece915, (q31_t)0xd5c0afc6, (q31_t)0xfe49e6d, (q31_t)0xd5ca2115, + (q31_t)0xfdc55a1, (q31_t)0xd5d39403, (q31_t)0xfd40eaf, (q31_t)0xd5dd0892, + (q31_t)0xfcbc999, (q31_t)0xd5e67ec1, (q31_t)0xfc3865e, (q31_t)0xd5eff690, + (q31_t)0xfbb4500, (q31_t)0xd5f96ffd, (q31_t)0xfb3057d, (q31_t)0xd602eb0a, + (q31_t)0xfaac7d8, (q31_t)0xd60c67b4, (q31_t)0xfa28c10, (q31_t)0xd615e5fd, + (q31_t)0xf9a5225, (q31_t)0xd61f65e4, (q31_t)0xf921a17, (q31_t)0xd628e767, + (q31_t)0xf89e3e8, (q31_t)0xd6326a88, (q31_t)0xf81af97, (q31_t)0xd63bef46, + (q31_t)0xf797d24, (q31_t)0xd645759f, (q31_t)0xf714c91, (q31_t)0xd64efd94, + (q31_t)0xf691ddd, (q31_t)0xd6588725, (q31_t)0xf60f108, (q31_t)0xd6621251, + (q31_t)0xf58c613, (q31_t)0xd66b9f18, (q31_t)0xf509cfe, (q31_t)0xd6752d79, + (q31_t)0xf4875ca, (q31_t)0xd67ebd74, (q31_t)0xf405077, (q31_t)0xd6884f09, + (q31_t)0xf382d05, (q31_t)0xd691e237, (q31_t)0xf300b74, (q31_t)0xd69b76fe, + (q31_t)0xf27ebc5, (q31_t)0xd6a50d5d, (q31_t)0xf1fcdf8, (q31_t)0xd6aea555, + (q31_t)0xf17b20d, (q31_t)0xd6b83ee4, (q31_t)0xf0f9805, (q31_t)0xd6c1da0b, + (q31_t)0xf077fe1, (q31_t)0xd6cb76c9, (q31_t)0xeff699f, (q31_t)0xd6d5151d, + (q31_t)0xef75541, (q31_t)0xd6deb508, (q31_t)0xeef42c7, (q31_t)0xd6e85689, + (q31_t)0xee73231, (q31_t)0xd6f1f99f, (q31_t)0xedf2380, (q31_t)0xd6fb9e4b, + (q31_t)0xed716b4, (q31_t)0xd705448b, (q31_t)0xecf0bcd, (q31_t)0xd70eec60, + (q31_t)0xec702cb, (q31_t)0xd71895c9, (q31_t)0xebefbb0, (q31_t)0xd72240c5, + (q31_t)0xeb6f67a, (q31_t)0xd72bed55, (q31_t)0xeaef32b, (q31_t)0xd7359b78, + (q31_t)0xea6f1c2, (q31_t)0xd73f4b2e, (q31_t)0xe9ef241, (q31_t)0xd748fc75, + (q31_t)0xe96f4a7, (q31_t)0xd752af4f, (q31_t)0xe8ef8f4, (q31_t)0xd75c63ba, + (q31_t)0xe86ff2a, (q31_t)0xd76619b6, (q31_t)0xe7f0748, (q31_t)0xd76fd143, + (q31_t)0xe77114e, (q31_t)0xd7798a60, (q31_t)0xe6f1d3d, (q31_t)0xd783450d, + (q31_t)0xe672b16, (q31_t)0xd78d014a, (q31_t)0xe5f3ad8, (q31_t)0xd796bf16, + (q31_t)0xe574c84, (q31_t)0xd7a07e70, (q31_t)0xe4f6019, (q31_t)0xd7aa3f5a, + (q31_t)0xe47759a, (q31_t)0xd7b401d1, (q31_t)0xe3f8d05, (q31_t)0xd7bdc5d6, + (q31_t)0xe37a65b, (q31_t)0xd7c78b68, (q31_t)0xe2fc19c, (q31_t)0xd7d15288, + (q31_t)0xe27dec9, (q31_t)0xd7db1b34, (q31_t)0xe1ffde2, (q31_t)0xd7e4e56c, + (q31_t)0xe181ee8, (q31_t)0xd7eeb130, (q31_t)0xe1041d9, (q31_t)0xd7f87e7f, + (q31_t)0xe0866b8, (q31_t)0xd8024d59, (q31_t)0xe008d84, (q31_t)0xd80c1dbf, + (q31_t)0xdf8b63d, (q31_t)0xd815efae, (q31_t)0xdf0e0e4, (q31_t)0xd81fc328, + (q31_t)0xde90d79, (q31_t)0xd829982b, (q31_t)0xde13bfd, (q31_t)0xd8336eb7, + (q31_t)0xdd96c6f, (q31_t)0xd83d46cc, (q31_t)0xdd19ed0, (q31_t)0xd8472069, + (q31_t)0xdc9d320, (q31_t)0xd850fb8e, (q31_t)0xdc20960, (q31_t)0xd85ad83c, + (q31_t)0xdba4190, (q31_t)0xd864b670, (q31_t)0xdb27bb0, (q31_t)0xd86e962b, + (q31_t)0xdaab7c0, (q31_t)0xd878776d, (q31_t)0xda2f5c2, (q31_t)0xd8825a35, + (q31_t)0xd9b35b4, (q31_t)0xd88c3e83, (q31_t)0xd937798, (q31_t)0xd8962456, + (q31_t)0xd8bbb6d, (q31_t)0xd8a00bae, (q31_t)0xd840134, (q31_t)0xd8a9f48a, + (q31_t)0xd7c48ee, (q31_t)0xd8b3deeb, (q31_t)0xd74929a, (q31_t)0xd8bdcad0, + (q31_t)0xd6cde39, (q31_t)0xd8c7b838, (q31_t)0xd652bcb, (q31_t)0xd8d1a724, + (q31_t)0xd5d7b50, (q31_t)0xd8db9792, (q31_t)0xd55ccca, (q31_t)0xd8e58982, + (q31_t)0xd4e2037, (q31_t)0xd8ef7cf4, (q31_t)0xd467599, (q31_t)0xd8f971e8, + (q31_t)0xd3eccef, (q31_t)0xd903685d, (q31_t)0xd37263a, (q31_t)0xd90d6053, + (q31_t)0xd2f817b, (q31_t)0xd91759c9, (q31_t)0xd27deb0, (q31_t)0xd92154bf, + (q31_t)0xd203ddc, (q31_t)0xd92b5135, (q31_t)0xd189efe, (q31_t)0xd9354f2a, + (q31_t)0xd110216, (q31_t)0xd93f4e9e, (q31_t)0xd096725, (q31_t)0xd9494f90, + (q31_t)0xd01ce2b, (q31_t)0xd9535201, (q31_t)0xcfa3729, (q31_t)0xd95d55ef, + (q31_t)0xcf2a21d, (q31_t)0xd9675b5a, (q31_t)0xceb0f0a, (q31_t)0xd9716243, + (q31_t)0xce37def, (q31_t)0xd97b6aa8, (q31_t)0xcdbeecc, (q31_t)0xd9857489, + (q31_t)0xcd461a2, (q31_t)0xd98f7fe6, (q31_t)0xcccd671, (q31_t)0xd9998cbe, + (q31_t)0xcc54d3a, (q31_t)0xd9a39b11, (q31_t)0xcbdc5fc, (q31_t)0xd9adaadf, + (q31_t)0xcb640b8, (q31_t)0xd9b7bc27, (q31_t)0xcaebd6e, (q31_t)0xd9c1cee9, + (q31_t)0xca73c1e, (q31_t)0xd9cbe325, (q31_t)0xc9fbcca, (q31_t)0xd9d5f8d9, + (q31_t)0xc983f70, (q31_t)0xd9e01006, (q31_t)0xc90c412, (q31_t)0xd9ea28ac, + (q31_t)0xc894aaf, (q31_t)0xd9f442c9, (q31_t)0xc81d349, (q31_t)0xd9fe5e5e, + (q31_t)0xc7a5dde, (q31_t)0xda087b69, (q31_t)0xc72ea70, (q31_t)0xda1299ec, + (q31_t)0xc6b78ff, (q31_t)0xda1cb9e5, (q31_t)0xc64098b, (q31_t)0xda26db54, + (q31_t)0xc5c9c14, (q31_t)0xda30fe38, (q31_t)0xc55309b, (q31_t)0xda3b2292, + (q31_t)0xc4dc720, (q31_t)0xda454860, (q31_t)0xc465fa3, (q31_t)0xda4f6fa3, + (q31_t)0xc3efa25, (q31_t)0xda599859, (q31_t)0xc3796a5, (q31_t)0xda63c284, + (q31_t)0xc303524, (q31_t)0xda6dee21, (q31_t)0xc28d5a3, (q31_t)0xda781b31, + (q31_t)0xc217822, (q31_t)0xda8249b4, (q31_t)0xc1a1ca0, (q31_t)0xda8c79a9, + (q31_t)0xc12c31f, (q31_t)0xda96ab0f, (q31_t)0xc0b6b9e, (q31_t)0xdaa0dde7, + (q31_t)0xc04161e, (q31_t)0xdaab122f, (q31_t)0xbfcc29f, (q31_t)0xdab547e8, + (q31_t)0xbf57121, (q31_t)0xdabf7f11, (q31_t)0xbee21a5, (q31_t)0xdac9b7a9, + (q31_t)0xbe6d42b, (q31_t)0xdad3f1b1, (q31_t)0xbdf88b3, (q31_t)0xdade2d28, + (q31_t)0xbd83f3d, (q31_t)0xdae86a0d, (q31_t)0xbd0f7ca, (q31_t)0xdaf2a860, + (q31_t)0xbc9b25a, (q31_t)0xdafce821, (q31_t)0xbc26eee, (q31_t)0xdb072950, + (q31_t)0xbbb2d85, (q31_t)0xdb116beb, (q31_t)0xbb3ee20, (q31_t)0xdb1baff2, + (q31_t)0xbacb0bf, (q31_t)0xdb25f566, (q31_t)0xba57563, (q31_t)0xdb303c46, + (q31_t)0xb9e3c0b, (q31_t)0xdb3a8491, (q31_t)0xb9704b9, (q31_t)0xdb44ce46, + (q31_t)0xb8fcf6b, (q31_t)0xdb4f1967, (q31_t)0xb889c23, (q31_t)0xdb5965f1, + (q31_t)0xb816ae1, (q31_t)0xdb63b3e5, (q31_t)0xb7a3ba5, (q31_t)0xdb6e0342, + (q31_t)0xb730e70, (q31_t)0xdb785409, (q31_t)0xb6be341, (q31_t)0xdb82a638, + (q31_t)0xb64ba19, (q31_t)0xdb8cf9cf, (q31_t)0xb5d92f8, (q31_t)0xdb974ece, + (q31_t)0xb566ddf, (q31_t)0xdba1a534, (q31_t)0xb4f4acd, (q31_t)0xdbabfd01, + (q31_t)0xb4829c4, (q31_t)0xdbb65634, (q31_t)0xb410ac3, (q31_t)0xdbc0b0ce, + (q31_t)0xb39edca, (q31_t)0xdbcb0cce, (q31_t)0xb32d2da, (q31_t)0xdbd56a32, + (q31_t)0xb2bb9f4, (q31_t)0xdbdfc8fc, (q31_t)0xb24a316, (q31_t)0xdbea292b, + (q31_t)0xb1d8e43, (q31_t)0xdbf48abd, (q31_t)0xb167b79, (q31_t)0xdbfeedb3, + (q31_t)0xb0f6aba, (q31_t)0xdc09520d, (q31_t)0xb085c05, (q31_t)0xdc13b7c9, + (q31_t)0xb014f5b, (q31_t)0xdc1e1ee9, (q31_t)0xafa44bc, (q31_t)0xdc28876a, + (q31_t)0xaf33c28, (q31_t)0xdc32f14d, (q31_t)0xaec35a0, (q31_t)0xdc3d5c91, + (q31_t)0xae53123, (q31_t)0xdc47c936, (q31_t)0xade2eb3, (q31_t)0xdc52373c, + (q31_t)0xad72e4f, (q31_t)0xdc5ca6a2, (q31_t)0xad02ff8, (q31_t)0xdc671768, + (q31_t)0xac933ae, (q31_t)0xdc71898d, (q31_t)0xac23971, (q31_t)0xdc7bfd11, + (q31_t)0xabb4141, (q31_t)0xdc8671f3, (q31_t)0xab44b1f, (q31_t)0xdc90e834, + (q31_t)0xaad570c, (q31_t)0xdc9b5fd2, (q31_t)0xaa66506, (q31_t)0xdca5d8cd, + (q31_t)0xa9f750f, (q31_t)0xdcb05326, (q31_t)0xa988727, (q31_t)0xdcbacedb, + (q31_t)0xa919b4e, (q31_t)0xdcc54bec, (q31_t)0xa8ab184, (q31_t)0xdccfca59, + (q31_t)0xa83c9ca, (q31_t)0xdcda4a21, (q31_t)0xa7ce420, (q31_t)0xdce4cb44, + (q31_t)0xa760086, (q31_t)0xdcef4dc2, (q31_t)0xa6f1efc, (q31_t)0xdcf9d199, + (q31_t)0xa683f83, (q31_t)0xdd0456ca, (q31_t)0xa61621b, (q31_t)0xdd0edd55, + (q31_t)0xa5a86c4, (q31_t)0xdd196538, (q31_t)0xa53ad7e, (q31_t)0xdd23ee74, + (q31_t)0xa4cd64b, (q31_t)0xdd2e7908, (q31_t)0xa460129, (q31_t)0xdd3904f4, + (q31_t)0xa3f2e19, (q31_t)0xdd439236, (q31_t)0xa385d1d, (q31_t)0xdd4e20d0, + (q31_t)0xa318e32, (q31_t)0xdd58b0c0, (q31_t)0xa2ac15b, (q31_t)0xdd634206, + (q31_t)0xa23f698, (q31_t)0xdd6dd4a2, (q31_t)0xa1d2de7, (q31_t)0xdd786892, + (q31_t)0xa16674b, (q31_t)0xdd82fdd8, (q31_t)0xa0fa2c3, (q31_t)0xdd8d9472, + (q31_t)0xa08e04f, (q31_t)0xdd982c60, (q31_t)0xa021fef, (q31_t)0xdda2c5a2, + (q31_t)0x9fb61a5, (q31_t)0xddad6036, (q31_t)0x9f4a570, (q31_t)0xddb7fc1e, + (q31_t)0x9edeb50, (q31_t)0xddc29958, (q31_t)0x9e73346, (q31_t)0xddcd37e4, + (q31_t)0x9e07d51, (q31_t)0xddd7d7c1, (q31_t)0x9d9c973, (q31_t)0xdde278ef, + (q31_t)0x9d317ab, (q31_t)0xdded1b6e, (q31_t)0x9cc67fa, (q31_t)0xddf7bf3e, + (q31_t)0x9c5ba60, (q31_t)0xde02645d, (q31_t)0x9bf0edd, (q31_t)0xde0d0acc, + (q31_t)0x9b86572, (q31_t)0xde17b28a, (q31_t)0x9b1be1e, (q31_t)0xde225b96, + (q31_t)0x9ab18e3, (q31_t)0xde2d05f1, (q31_t)0x9a475bf, (q31_t)0xde37b199, + (q31_t)0x99dd4b4, (q31_t)0xde425e8f, (q31_t)0x99735c2, (q31_t)0xde4d0cd2, + (q31_t)0x99098e9, (q31_t)0xde57bc62, (q31_t)0x989fe29, (q31_t)0xde626d3e, + (q31_t)0x9836582, (q31_t)0xde6d1f65, (q31_t)0x97ccef5, (q31_t)0xde77d2d8, + (q31_t)0x9763a83, (q31_t)0xde828796, (q31_t)0x96fa82a, (q31_t)0xde8d3d9e, + (q31_t)0x96917ec, (q31_t)0xde97f4f1, (q31_t)0x96289c9, (q31_t)0xdea2ad8d, + (q31_t)0x95bfdc1, (q31_t)0xdead6773, (q31_t)0x95573d4, (q31_t)0xdeb822a1, + (q31_t)0x94eec03, (q31_t)0xdec2df18, (q31_t)0x948664d, (q31_t)0xdecd9cd7, + (q31_t)0x941e2b4, (q31_t)0xded85bdd, (q31_t)0x93b6137, (q31_t)0xdee31c2b, + (q31_t)0x934e1d6, (q31_t)0xdeedddc0, (q31_t)0x92e6492, (q31_t)0xdef8a09b, + (q31_t)0x927e96b, (q31_t)0xdf0364bc, (q31_t)0x9217062, (q31_t)0xdf0e2a22, + (q31_t)0x91af976, (q31_t)0xdf18f0ce, (q31_t)0x91484a8, (q31_t)0xdf23b8be, + (q31_t)0x90e11f7, (q31_t)0xdf2e81f3, (q31_t)0x907a166, (q31_t)0xdf394c6b, + (q31_t)0x90132f2, (q31_t)0xdf441828, (q31_t)0x8fac69e, (q31_t)0xdf4ee527, + (q31_t)0x8f45c68, (q31_t)0xdf59b369, (q31_t)0x8edf452, (q31_t)0xdf6482ed, + (q31_t)0x8e78e5b, (q31_t)0xdf6f53b3, (q31_t)0x8e12a84, (q31_t)0xdf7a25ba, + (q31_t)0x8dac8cd, (q31_t)0xdf84f902, (q31_t)0x8d46936, (q31_t)0xdf8fcd8b, + (q31_t)0x8ce0bc0, (q31_t)0xdf9aa354, (q31_t)0x8c7b06b, (q31_t)0xdfa57a5d, + (q31_t)0x8c15736, (q31_t)0xdfb052a5, (q31_t)0x8bb0023, (q31_t)0xdfbb2c2c, + (q31_t)0x8b4ab32, (q31_t)0xdfc606f1, (q31_t)0x8ae5862, (q31_t)0xdfd0e2f5, + (q31_t)0x8a807b4, (q31_t)0xdfdbc036, (q31_t)0x8a1b928, (q31_t)0xdfe69eb4, + (q31_t)0x89b6cbf, (q31_t)0xdff17e70, (q31_t)0x8952278, (q31_t)0xdffc5f67, + (q31_t)0x88eda54, (q31_t)0xe007419b, (q31_t)0x8889454, (q31_t)0xe012250a, + (q31_t)0x8825077, (q31_t)0xe01d09b4, (q31_t)0x87c0ebd, (q31_t)0xe027ef99, + (q31_t)0x875cf28, (q31_t)0xe032d6b8, (q31_t)0x86f91b7, (q31_t)0xe03dbf11, + (q31_t)0x869566a, (q31_t)0xe048a8a4, (q31_t)0x8631d42, (q31_t)0xe053936f, + (q31_t)0x85ce63e, (q31_t)0xe05e7f74, (q31_t)0x856b160, (q31_t)0xe0696cb0, + (q31_t)0x8507ea7, (q31_t)0xe0745b24, (q31_t)0x84a4e14, (q31_t)0xe07f4acf, + (q31_t)0x8441fa6, (q31_t)0xe08a3bb2, (q31_t)0x83df35f, (q31_t)0xe0952dcb, + (q31_t)0x837c93e, (q31_t)0xe0a0211a, (q31_t)0x831a143, (q31_t)0xe0ab159e, + (q31_t)0x82b7b70, (q31_t)0xe0b60b58, (q31_t)0x82557c3, (q31_t)0xe0c10247, + (q31_t)0x81f363d, (q31_t)0xe0cbfa6a, (q31_t)0x81916df, (q31_t)0xe0d6f3c1, + (q31_t)0x812f9a9, (q31_t)0xe0e1ee4b, (q31_t)0x80cde9b, (q31_t)0xe0ecea09, + (q31_t)0x806c5b5, (q31_t)0xe0f7e6f9, (q31_t)0x800aef7, (q31_t)0xe102e51c, + (q31_t)0x7fa9a62, (q31_t)0xe10de470, (q31_t)0x7f487f6, (q31_t)0xe118e4f6, + (q31_t)0x7ee77b3, (q31_t)0xe123e6ad, (q31_t)0x7e8699a, (q31_t)0xe12ee995, + (q31_t)0x7e25daa, (q31_t)0xe139edac, (q31_t)0x7dc53e3, (q31_t)0xe144f2f3, + (q31_t)0x7d64c47, (q31_t)0xe14ff96a, (q31_t)0x7d046d6, (q31_t)0xe15b0110, + (q31_t)0x7ca438f, (q31_t)0xe16609e3, (q31_t)0x7c44272, (q31_t)0xe17113e5, + (q31_t)0x7be4381, (q31_t)0xe17c1f15, (q31_t)0x7b846ba, (q31_t)0xe1872b72, + (q31_t)0x7b24c20, (q31_t)0xe19238fb, (q31_t)0x7ac53b1, (q31_t)0xe19d47b1, + (q31_t)0x7a65d6e, (q31_t)0xe1a85793, (q31_t)0x7a06957, (q31_t)0xe1b368a0, + (q31_t)0x79a776c, (q31_t)0xe1be7ad8, (q31_t)0x79487ae, (q31_t)0xe1c98e3b, + (q31_t)0x78e9a1d, (q31_t)0xe1d4a2c8, (q31_t)0x788aeb9, (q31_t)0xe1dfb87f, + (q31_t)0x782c582, (q31_t)0xe1eacf5f, (q31_t)0x77cde79, (q31_t)0xe1f5e768, + (q31_t)0x776f99d, (q31_t)0xe2010099, (q31_t)0x77116f0, (q31_t)0xe20c1af3, + (q31_t)0x76b3671, (q31_t)0xe2173674, (q31_t)0x7655820, (q31_t)0xe222531c, + (q31_t)0x75f7bfe, (q31_t)0xe22d70eb, (q31_t)0x759a20a, (q31_t)0xe2388fe1, + (q31_t)0x753ca46, (q31_t)0xe243affc, (q31_t)0x74df4b1, (q31_t)0xe24ed13d, + (q31_t)0x748214c, (q31_t)0xe259f3a3, (q31_t)0x7425016, (q31_t)0xe265172e, + (q31_t)0x73c8111, (q31_t)0xe2703bdc, (q31_t)0x736b43c, (q31_t)0xe27b61af, + (q31_t)0x730e997, (q31_t)0xe28688a4, (q31_t)0x72b2123, (q31_t)0xe291b0bd, + (q31_t)0x7255ae0, (q31_t)0xe29cd9f8, (q31_t)0x71f96ce, (q31_t)0xe2a80456, + (q31_t)0x719d4ed, (q31_t)0xe2b32fd4, (q31_t)0x714153e, (q31_t)0xe2be5c74, + (q31_t)0x70e57c0, (q31_t)0xe2c98a35, (q31_t)0x7089c75, (q31_t)0xe2d4b916, + (q31_t)0x702e35c, (q31_t)0xe2dfe917, (q31_t)0x6fd2c75, (q31_t)0xe2eb1a37, + (q31_t)0x6f777c1, (q31_t)0xe2f64c77, (q31_t)0x6f1c540, (q31_t)0xe3017fd5, + (q31_t)0x6ec14f2, (q31_t)0xe30cb451, (q31_t)0x6e666d7, (q31_t)0xe317e9eb, + (q31_t)0x6e0baf0, (q31_t)0xe32320a2, (q31_t)0x6db113d, (q31_t)0xe32e5876, + (q31_t)0x6d569be, (q31_t)0xe3399167, (q31_t)0x6cfc472, (q31_t)0xe344cb73, + (q31_t)0x6ca215c, (q31_t)0xe350069b, (q31_t)0x6c4807a, (q31_t)0xe35b42df, + (q31_t)0x6bee1cd, (q31_t)0xe366803c, (q31_t)0x6b94554, (q31_t)0xe371beb5, + (q31_t)0x6b3ab12, (q31_t)0xe37cfe47, (q31_t)0x6ae1304, (q31_t)0xe3883ef2, + (q31_t)0x6a87d2d, (q31_t)0xe39380b6, (q31_t)0x6a2e98b, (q31_t)0xe39ec393, + (q31_t)0x69d5820, (q31_t)0xe3aa0788, (q31_t)0x697c8eb, (q31_t)0xe3b54c95, + (q31_t)0x6923bec, (q31_t)0xe3c092b9, (q31_t)0x68cb124, (q31_t)0xe3cbd9f4, + (q31_t)0x6872894, (q31_t)0xe3d72245, (q31_t)0x681a23a, (q31_t)0xe3e26bac, + (q31_t)0x67c1e18, (q31_t)0xe3edb628, (q31_t)0x6769c2e, (q31_t)0xe3f901ba, + (q31_t)0x6711c7b, (q31_t)0xe4044e60, (q31_t)0x66b9f01, (q31_t)0xe40f9c1a, + (q31_t)0x66623be, (q31_t)0xe41aeae8, (q31_t)0x660aab5, (q31_t)0xe4263ac9, + (q31_t)0x65b33e4, (q31_t)0xe4318bbe, (q31_t)0x655bf4c, (q31_t)0xe43cddc4, + (q31_t)0x6504ced, (q31_t)0xe44830dd, (q31_t)0x64adcc7, (q31_t)0xe4538507, + (q31_t)0x6456edb, (q31_t)0xe45eda43, (q31_t)0x6400329, (q31_t)0xe46a308f, + (q31_t)0x63a99b1, (q31_t)0xe47587eb, (q31_t)0x6353273, (q31_t)0xe480e057, + (q31_t)0x62fcd6f, (q31_t)0xe48c39d3, (q31_t)0x62a6aa6, (q31_t)0xe497945d, + (q31_t)0x6250a18, (q31_t)0xe4a2eff6, (q31_t)0x61fabc4, (q31_t)0xe4ae4c9d, + (q31_t)0x61a4fac, (q31_t)0xe4b9aa52, (q31_t)0x614f5cf, (q31_t)0xe4c50914, + (q31_t)0x60f9e2e, (q31_t)0xe4d068e2, (q31_t)0x60a48c9, (q31_t)0xe4dbc9bd, + (q31_t)0x604f5a0, (q31_t)0xe4e72ba4, (q31_t)0x5ffa4b3, (q31_t)0xe4f28e96, + (q31_t)0x5fa5603, (q31_t)0xe4fdf294, (q31_t)0x5f5098f, (q31_t)0xe509579b, + (q31_t)0x5efbf58, (q31_t)0xe514bdad, (q31_t)0x5ea775e, (q31_t)0xe52024c9, + (q31_t)0x5e531a1, (q31_t)0xe52b8cee, (q31_t)0x5dfee22, (q31_t)0xe536f61b, + (q31_t)0x5daace1, (q31_t)0xe5426051, (q31_t)0x5d56ddd, (q31_t)0xe54dcb8f, + (q31_t)0x5d03118, (q31_t)0xe55937d5, (q31_t)0x5caf690, (q31_t)0xe564a521, + (q31_t)0x5c5be47, (q31_t)0xe5701374, (q31_t)0x5c0883d, (q31_t)0xe57b82cd, + (q31_t)0x5bb5472, (q31_t)0xe586f32c, (q31_t)0x5b622e6, (q31_t)0xe5926490, + (q31_t)0x5b0f399, (q31_t)0xe59dd6f9, (q31_t)0x5abc68c, (q31_t)0xe5a94a67, + (q31_t)0x5a69bbe, (q31_t)0xe5b4bed8, (q31_t)0x5a17330, (q31_t)0xe5c0344d, + (q31_t)0x59c4ce3, (q31_t)0xe5cbaac5, (q31_t)0x59728d5, (q31_t)0xe5d72240, + (q31_t)0x5920708, (q31_t)0xe5e29abc, (q31_t)0x58ce77c, (q31_t)0xe5ee143b, + (q31_t)0x587ca31, (q31_t)0xe5f98ebb, (q31_t)0x582af26, (q31_t)0xe6050a3b, + (q31_t)0x57d965d, (q31_t)0xe61086bc, (q31_t)0x5787fd6, (q31_t)0xe61c043d, + (q31_t)0x5736b90, (q31_t)0xe62782be, (q31_t)0x56e598c, (q31_t)0xe633023e, + (q31_t)0x56949ca, (q31_t)0xe63e82bc, (q31_t)0x5643c4a, (q31_t)0xe64a0438, + (q31_t)0x55f310d, (q31_t)0xe65586b3, (q31_t)0x55a2812, (q31_t)0xe6610a2a, + (q31_t)0x555215a, (q31_t)0xe66c8e9f, (q31_t)0x5501ce5, (q31_t)0xe6781410, + (q31_t)0x54b1ab4, (q31_t)0xe6839a7c, (q31_t)0x5461ac6, (q31_t)0xe68f21e5, + (q31_t)0x5411d1b, (q31_t)0xe69aaa48, (q31_t)0x53c21b4, (q31_t)0xe6a633a6, + (q31_t)0x5372891, (q31_t)0xe6b1bdff, (q31_t)0x53231b3, (q31_t)0xe6bd4951, + (q31_t)0x52d3d18, (q31_t)0xe6c8d59c, (q31_t)0x5284ac3, (q31_t)0xe6d462e1, + (q31_t)0x5235ab2, (q31_t)0xe6dff11d, (q31_t)0x51e6ce6, (q31_t)0xe6eb8052, + (q31_t)0x519815f, (q31_t)0xe6f7107e, (q31_t)0x514981d, (q31_t)0xe702a1a1, + (q31_t)0x50fb121, (q31_t)0xe70e33bb, (q31_t)0x50acc6b, (q31_t)0xe719c6cb, + (q31_t)0x505e9fb, (q31_t)0xe7255ad1, (q31_t)0x50109d0, (q31_t)0xe730efcc, + (q31_t)0x4fc2bec, (q31_t)0xe73c85bc, (q31_t)0x4f7504e, (q31_t)0xe7481ca1, + (q31_t)0x4f276f7, (q31_t)0xe753b479, (q31_t)0x4ed9fe7, (q31_t)0xe75f4d45, + (q31_t)0x4e8cb1e, (q31_t)0xe76ae704, (q31_t)0x4e3f89c, (q31_t)0xe77681b6, + (q31_t)0x4df2862, (q31_t)0xe7821d59, (q31_t)0x4da5a6f, (q31_t)0xe78db9ef, + (q31_t)0x4d58ec3, (q31_t)0xe7995776, (q31_t)0x4d0c560, (q31_t)0xe7a4f5ed, + (q31_t)0x4cbfe45, (q31_t)0xe7b09555, (q31_t)0x4c73972, (q31_t)0xe7bc35ad, + (q31_t)0x4c276e8, (q31_t)0xe7c7d6f4, (q31_t)0x4bdb6a6, (q31_t)0xe7d3792b, + (q31_t)0x4b8f8ad, (q31_t)0xe7df1c50, (q31_t)0x4b43cfd, (q31_t)0xe7eac063, + (q31_t)0x4af8397, (q31_t)0xe7f66564, (q31_t)0x4aacc7a, (q31_t)0xe8020b52, + (q31_t)0x4a617a6, (q31_t)0xe80db22d, (q31_t)0x4a1651c, (q31_t)0xe81959f4, + (q31_t)0x49cb4dd, (q31_t)0xe82502a7, (q31_t)0x49806e7, (q31_t)0xe830ac45, + (q31_t)0x4935b3c, (q31_t)0xe83c56cf, (q31_t)0x48eb1db, (q31_t)0xe8480243, + (q31_t)0x48a0ac4, (q31_t)0xe853aea1, (q31_t)0x48565f9, (q31_t)0xe85f5be9, + (q31_t)0x480c379, (q31_t)0xe86b0a1a, (q31_t)0x47c2344, (q31_t)0xe876b934, + (q31_t)0x477855a, (q31_t)0xe8826936, (q31_t)0x472e9bc, (q31_t)0xe88e1a20, + (q31_t)0x46e5069, (q31_t)0xe899cbf1, (q31_t)0x469b963, (q31_t)0xe8a57ea9, + (q31_t)0x46524a9, (q31_t)0xe8b13248, (q31_t)0x460923b, (q31_t)0xe8bce6cd, + (q31_t)0x45c0219, (q31_t)0xe8c89c37, (q31_t)0x4577444, (q31_t)0xe8d45286, + (q31_t)0x452e8bc, (q31_t)0xe8e009ba, (q31_t)0x44e5f80, (q31_t)0xe8ebc1d3, + (q31_t)0x449d892, (q31_t)0xe8f77acf, (q31_t)0x44553f2, (q31_t)0xe90334af, + (q31_t)0x440d19e, (q31_t)0xe90eef71, (q31_t)0x43c5199, (q31_t)0xe91aab16, + (q31_t)0x437d3e1, (q31_t)0xe926679c, (q31_t)0x4335877, (q31_t)0xe9322505, + (q31_t)0x42edf5c, (q31_t)0xe93de34e, (q31_t)0x42a688f, (q31_t)0xe949a278, + (q31_t)0x425f410, (q31_t)0xe9556282, (q31_t)0x42181e0, (q31_t)0xe961236c, + (q31_t)0x41d11ff, (q31_t)0xe96ce535, (q31_t)0x418a46d, (q31_t)0xe978a7dd, + (q31_t)0x414392b, (q31_t)0xe9846b63, (q31_t)0x40fd037, (q31_t)0xe9902fc7, + (q31_t)0x40b6994, (q31_t)0xe99bf509, (q31_t)0x4070540, (q31_t)0xe9a7bb28, + (q31_t)0x402a33c, (q31_t)0xe9b38223, (q31_t)0x3fe4388, (q31_t)0xe9bf49fa, + (q31_t)0x3f9e624, (q31_t)0xe9cb12ad, (q31_t)0x3f58b10, (q31_t)0xe9d6dc3b, + (q31_t)0x3f1324e, (q31_t)0xe9e2a6a3, (q31_t)0x3ecdbdc, (q31_t)0xe9ee71e6, + (q31_t)0x3e887bb, (q31_t)0xe9fa3e03, (q31_t)0x3e435ea, (q31_t)0xea060af9, + (q31_t)0x3dfe66c, (q31_t)0xea11d8c8, (q31_t)0x3db993e, (q31_t)0xea1da770, + (q31_t)0x3d74e62, (q31_t)0xea2976ef, (q31_t)0x3d305d8, (q31_t)0xea354746, + (q31_t)0x3cebfa0, (q31_t)0xea411874, (q31_t)0x3ca7bba, (q31_t)0xea4cea79, + (q31_t)0x3c63a26, (q31_t)0xea58bd54, (q31_t)0x3c1fae5, (q31_t)0xea649105, + (q31_t)0x3bdbdf6, (q31_t)0xea70658a, (q31_t)0x3b9835a, (q31_t)0xea7c3ae5, + (q31_t)0x3b54b11, (q31_t)0xea881114, (q31_t)0x3b1151b, (q31_t)0xea93e817, + (q31_t)0x3ace178, (q31_t)0xea9fbfed, (q31_t)0x3a8b028, (q31_t)0xeaab9896, + (q31_t)0x3a4812c, (q31_t)0xeab77212, (q31_t)0x3a05484, (q31_t)0xeac34c60, + (q31_t)0x39c2a2f, (q31_t)0xeacf277f, (q31_t)0x398022f, (q31_t)0xeadb0370, + (q31_t)0x393dc82, (q31_t)0xeae6e031, (q31_t)0x38fb92a, (q31_t)0xeaf2bdc3, + (q31_t)0x38b9827, (q31_t)0xeafe9c24, (q31_t)0x3877978, (q31_t)0xeb0a7b54, + (q31_t)0x3835d1e, (q31_t)0xeb165b54, (q31_t)0x37f4319, (q31_t)0xeb223c22, + (q31_t)0x37b2b6a, (q31_t)0xeb2e1dbe, (q31_t)0x377160f, (q31_t)0xeb3a0027, + (q31_t)0x373030a, (q31_t)0xeb45e35d, (q31_t)0x36ef25b, (q31_t)0xeb51c760, + (q31_t)0x36ae401, (q31_t)0xeb5dac2f, (q31_t)0x366d7fd, (q31_t)0xeb6991ca, + (q31_t)0x362ce50, (q31_t)0xeb75782f, (q31_t)0x35ec6f8, (q31_t)0xeb815f60, + (q31_t)0x35ac1f7, (q31_t)0xeb8d475b, (q31_t)0x356bf4d, (q31_t)0xeb99301f, + (q31_t)0x352bef9, (q31_t)0xeba519ad, (q31_t)0x34ec0fc, (q31_t)0xebb10404, + (q31_t)0x34ac556, (q31_t)0xebbcef23, (q31_t)0x346cc07, (q31_t)0xebc8db0b, + (q31_t)0x342d510, (q31_t)0xebd4c7ba, (q31_t)0x33ee070, (q31_t)0xebe0b52f, + (q31_t)0x33aee27, (q31_t)0xebeca36c, (q31_t)0x336fe37, (q31_t)0xebf8926f, + (q31_t)0x333109e, (q31_t)0xec048237, (q31_t)0x32f255e, (q31_t)0xec1072c4, + (q31_t)0x32b3c75, (q31_t)0xec1c6417, (q31_t)0x32755e5, (q31_t)0xec28562d, + (q31_t)0x32371ae, (q31_t)0xec344908, (q31_t)0x31f8fcf, (q31_t)0xec403ca5, + (q31_t)0x31bb049, (q31_t)0xec4c3106, (q31_t)0x317d31c, (q31_t)0xec582629, + (q31_t)0x313f848, (q31_t)0xec641c0e, (q31_t)0x3101fce, (q31_t)0xec7012b5, + (q31_t)0x30c49ad, (q31_t)0xec7c0a1d, (q31_t)0x30875e5, (q31_t)0xec880245, + (q31_t)0x304a477, (q31_t)0xec93fb2e, (q31_t)0x300d563, (q31_t)0xec9ff4d6, + (q31_t)0x2fd08a9, (q31_t)0xecabef3d, (q31_t)0x2f93e4a, (q31_t)0xecb7ea63, + (q31_t)0x2f57644, (q31_t)0xecc3e648, (q31_t)0x2f1b099, (q31_t)0xeccfe2ea, + (q31_t)0x2eded49, (q31_t)0xecdbe04a, (q31_t)0x2ea2c53, (q31_t)0xece7de66, + (q31_t)0x2e66db8, (q31_t)0xecf3dd3f, (q31_t)0x2e2b178, (q31_t)0xecffdcd4, + (q31_t)0x2def794, (q31_t)0xed0bdd25, (q31_t)0x2db400a, (q31_t)0xed17de31, + (q31_t)0x2d78add, (q31_t)0xed23dff7, (q31_t)0x2d3d80a, (q31_t)0xed2fe277, + (q31_t)0x2d02794, (q31_t)0xed3be5b1, (q31_t)0x2cc7979, (q31_t)0xed47e9a5, + (q31_t)0x2c8cdbb, (q31_t)0xed53ee51, (q31_t)0x2c52459, (q31_t)0xed5ff3b5, + (q31_t)0x2c17d52, (q31_t)0xed6bf9d1, (q31_t)0x2bdd8a9, (q31_t)0xed7800a5, + (q31_t)0x2ba365c, (q31_t)0xed84082f, (q31_t)0x2b6966c, (q31_t)0xed901070, + (q31_t)0x2b2f8d8, (q31_t)0xed9c1967, (q31_t)0x2af5da2, (q31_t)0xeda82313, + (q31_t)0x2abc4c9, (q31_t)0xedb42d74, (q31_t)0x2a82e4d, (q31_t)0xedc0388a, + (q31_t)0x2a49a2e, (q31_t)0xedcc4454, (q31_t)0x2a1086d, (q31_t)0xedd850d2, + (q31_t)0x29d790a, (q31_t)0xede45e03, (q31_t)0x299ec05, (q31_t)0xedf06be6, + (q31_t)0x296615d, (q31_t)0xedfc7a7c, (q31_t)0x292d914, (q31_t)0xee0889c4, + (q31_t)0x28f5329, (q31_t)0xee1499bd, (q31_t)0x28bcf9c, (q31_t)0xee20aa67, + (q31_t)0x2884e6e, (q31_t)0xee2cbbc1, (q31_t)0x284cf9f, (q31_t)0xee38cdcb, + (q31_t)0x281532e, (q31_t)0xee44e084, (q31_t)0x27dd91c, (q31_t)0xee50f3ed, + (q31_t)0x27a616a, (q31_t)0xee5d0804, (q31_t)0x276ec16, (q31_t)0xee691cc9, + (q31_t)0x2737922, (q31_t)0xee75323c, (q31_t)0x270088e, (q31_t)0xee81485c, + (q31_t)0x26c9a58, (q31_t)0xee8d5f29, (q31_t)0x2692e83, (q31_t)0xee9976a1, + (q31_t)0x265c50e, (q31_t)0xeea58ec6, (q31_t)0x2625df8, (q31_t)0xeeb1a796, + (q31_t)0x25ef943, (q31_t)0xeebdc110, (q31_t)0x25b96ee, (q31_t)0xeec9db35, + (q31_t)0x25836f9, (q31_t)0xeed5f604, (q31_t)0x254d965, (q31_t)0xeee2117c, + (q31_t)0x2517e31, (q31_t)0xeeee2d9d, (q31_t)0x24e255e, (q31_t)0xeefa4a67, + (q31_t)0x24aceed, (q31_t)0xef0667d9, (q31_t)0x2477adc, (q31_t)0xef1285f2, + (q31_t)0x244292c, (q31_t)0xef1ea4b2, (q31_t)0x240d9de, (q31_t)0xef2ac419, + (q31_t)0x23d8cf1, (q31_t)0xef36e426, (q31_t)0x23a4265, (q31_t)0xef4304d8, + (q31_t)0x236fa3b, (q31_t)0xef4f2630, (q31_t)0x233b473, (q31_t)0xef5b482d, + (q31_t)0x230710d, (q31_t)0xef676ace, (q31_t)0x22d3009, (q31_t)0xef738e12, + (q31_t)0x229f167, (q31_t)0xef7fb1fa, (q31_t)0x226b528, (q31_t)0xef8bd685, + (q31_t)0x2237b4b, (q31_t)0xef97fbb2, (q31_t)0x22043d0, (q31_t)0xefa42181, + (q31_t)0x21d0eb8, (q31_t)0xefb047f2, (q31_t)0x219dc03, (q31_t)0xefbc6f03, + (q31_t)0x216abb1, (q31_t)0xefc896b5, (q31_t)0x2137dc2, (q31_t)0xefd4bf08, + (q31_t)0x2105236, (q31_t)0xefe0e7f9, (q31_t)0x20d290d, (q31_t)0xefed118a, + (q31_t)0x20a0248, (q31_t)0xeff93bba, (q31_t)0x206dde6, (q31_t)0xf0056687, + (q31_t)0x203bbe8, (q31_t)0xf01191f3, (q31_t)0x2009c4e, (q31_t)0xf01dbdfb, + (q31_t)0x1fd7f17, (q31_t)0xf029eaa1, (q31_t)0x1fa6445, (q31_t)0xf03617e2, + (q31_t)0x1f74bd6, (q31_t)0xf04245c0, (q31_t)0x1f435cc, (q31_t)0xf04e7438, + (q31_t)0x1f12227, (q31_t)0xf05aa34c, (q31_t)0x1ee10e5, (q31_t)0xf066d2fa, + (q31_t)0x1eb0209, (q31_t)0xf0730342, (q31_t)0x1e7f591, (q31_t)0xf07f3424, + (q31_t)0x1e4eb7e, (q31_t)0xf08b659f, (q31_t)0x1e1e3d0, (q31_t)0xf09797b2, + (q31_t)0x1dede87, (q31_t)0xf0a3ca5d, (q31_t)0x1dbdba3, (q31_t)0xf0affda0, + (q31_t)0x1d8db25, (q31_t)0xf0bc317a, (q31_t)0x1d5dd0c, (q31_t)0xf0c865ea, + (q31_t)0x1d2e158, (q31_t)0xf0d49af1, (q31_t)0x1cfe80a, (q31_t)0xf0e0d08d, + (q31_t)0x1ccf122, (q31_t)0xf0ed06bf, (q31_t)0x1c9fca0, (q31_t)0xf0f93d86, + (q31_t)0x1c70a84, (q31_t)0xf10574e0, (q31_t)0x1c41ace, (q31_t)0xf111accf, + (q31_t)0x1c12d7e, (q31_t)0xf11de551, (q31_t)0x1be4294, (q31_t)0xf12a1e66, + (q31_t)0x1bb5a11, (q31_t)0xf136580d, (q31_t)0x1b873f5, (q31_t)0xf1429247, + (q31_t)0x1b5903f, (q31_t)0xf14ecd11, (q31_t)0x1b2aef0, (q31_t)0xf15b086d, + (q31_t)0x1afd007, (q31_t)0xf1674459, (q31_t)0x1acf386, (q31_t)0xf17380d6, + (q31_t)0x1aa196c, (q31_t)0xf17fbde2, (q31_t)0x1a741b9, (q31_t)0xf18bfb7d, + (q31_t)0x1a46c6e, (q31_t)0xf19839a6, (q31_t)0x1a1998a, (q31_t)0xf1a4785e, + (q31_t)0x19ec90d, (q31_t)0xf1b0b7a4, (q31_t)0x19bfaf9, (q31_t)0xf1bcf777, + (q31_t)0x1992f4c, (q31_t)0xf1c937d6, (q31_t)0x1966606, (q31_t)0xf1d578c2, + (q31_t)0x1939f29, (q31_t)0xf1e1ba3a, (q31_t)0x190dab4, (q31_t)0xf1edfc3d, + (q31_t)0x18e18a7, (q31_t)0xf1fa3ecb, (q31_t)0x18b5903, (q31_t)0xf20681e3, + (q31_t)0x1889bc6, (q31_t)0xf212c585, (q31_t)0x185e0f3, (q31_t)0xf21f09b1, + (q31_t)0x1832888, (q31_t)0xf22b4e66, (q31_t)0x1807285, (q31_t)0xf23793a3, + (q31_t)0x17dbeec, (q31_t)0xf243d968, (q31_t)0x17b0dbb, (q31_t)0xf2501fb5, + (q31_t)0x1785ef4, (q31_t)0xf25c6688, (q31_t)0x175b296, (q31_t)0xf268ade3, + (q31_t)0x17308a1, (q31_t)0xf274f5c3, (q31_t)0x1706115, (q31_t)0xf2813e2a, + (q31_t)0x16dbbf3, (q31_t)0xf28d8715, (q31_t)0x16b193a, (q31_t)0xf299d085, + (q31_t)0x16878eb, (q31_t)0xf2a61a7a, (q31_t)0x165db05, (q31_t)0xf2b264f2, + (q31_t)0x1633f8a, (q31_t)0xf2beafed, (q31_t)0x160a678, (q31_t)0xf2cafb6b, + (q31_t)0x15e0fd1, (q31_t)0xf2d7476c, (q31_t)0x15b7b94, (q31_t)0xf2e393ef, + (q31_t)0x158e9c1, (q31_t)0xf2efe0f2, (q31_t)0x1565a58, (q31_t)0xf2fc2e77, + (q31_t)0x153cd5a, (q31_t)0xf3087c7d, (q31_t)0x15142c6, (q31_t)0xf314cb02, + (q31_t)0x14eba9d, (q31_t)0xf3211a07, (q31_t)0x14c34df, (q31_t)0xf32d698a, + (q31_t)0x149b18b, (q31_t)0xf339b98d, (q31_t)0x14730a3, (q31_t)0xf3460a0d, + (q31_t)0x144b225, (q31_t)0xf3525b0b, (q31_t)0x1423613, (q31_t)0xf35eac86, + (q31_t)0x13fbc6c, (q31_t)0xf36afe7e, (q31_t)0x13d4530, (q31_t)0xf37750f2, + (q31_t)0x13ad060, (q31_t)0xf383a3e2, (q31_t)0x1385dfb, (q31_t)0xf38ff74d, + (q31_t)0x135ee02, (q31_t)0xf39c4b32, (q31_t)0x1338075, (q31_t)0xf3a89f92, + (q31_t)0x1311553, (q31_t)0xf3b4f46c, (q31_t)0x12eac9d, (q31_t)0xf3c149bf, + (q31_t)0x12c4653, (q31_t)0xf3cd9f8b, (q31_t)0x129e276, (q31_t)0xf3d9f5cf, + (q31_t)0x1278104, (q31_t)0xf3e64c8c, (q31_t)0x12521ff, (q31_t)0xf3f2a3bf, + (q31_t)0x122c566, (q31_t)0xf3fefb6a, (q31_t)0x1206b39, (q31_t)0xf40b538b, + (q31_t)0x11e1379, (q31_t)0xf417ac22, (q31_t)0x11bbe26, (q31_t)0xf424052f, + (q31_t)0x1196b3f, (q31_t)0xf4305eb0, (q31_t)0x1171ac6, (q31_t)0xf43cb8a7, + (q31_t)0x114ccb9, (q31_t)0xf4491311, (q31_t)0x1128119, (q31_t)0xf4556def, + (q31_t)0x11037e6, (q31_t)0xf461c940, (q31_t)0x10df120, (q31_t)0xf46e2504, + (q31_t)0x10bacc8, (q31_t)0xf47a8139, (q31_t)0x1096add, (q31_t)0xf486dde1, + (q31_t)0x1072b5f, (q31_t)0xf4933afa, (q31_t)0x104ee4f, (q31_t)0xf49f9884, + (q31_t)0x102b3ac, (q31_t)0xf4abf67e, (q31_t)0x1007b77, (q31_t)0xf4b854e7, + (q31_t)0xfe45b0, (q31_t)0xf4c4b3c0, (q31_t)0xfc1257, (q31_t)0xf4d11308, + (q31_t)0xf9e16b, (q31_t)0xf4dd72be, (q31_t)0xf7b2ee, (q31_t)0xf4e9d2e3, + (q31_t)0xf586df, (q31_t)0xf4f63374, (q31_t)0xf35d3e, (q31_t)0xf5029473, + (q31_t)0xf1360b, (q31_t)0xf50ef5de, (q31_t)0xef1147, (q31_t)0xf51b57b5, + (q31_t)0xeceef1, (q31_t)0xf527b9f7, (q31_t)0xeacf09, (q31_t)0xf5341ca5, + (q31_t)0xe8b190, (q31_t)0xf5407fbd, (q31_t)0xe69686, (q31_t)0xf54ce33f, + (q31_t)0xe47deb, (q31_t)0xf559472b, (q31_t)0xe267be, (q31_t)0xf565ab80, + (q31_t)0xe05401, (q31_t)0xf572103d, (q31_t)0xde42b2, (q31_t)0xf57e7563, + (q31_t)0xdc33d2, (q31_t)0xf58adaf0, (q31_t)0xda2762, (q31_t)0xf59740e5, + (q31_t)0xd81d61, (q31_t)0xf5a3a740, (q31_t)0xd615cf, (q31_t)0xf5b00e02, + (q31_t)0xd410ad, (q31_t)0xf5bc7529, (q31_t)0xd20dfa, (q31_t)0xf5c8dcb6, + (q31_t)0xd00db6, (q31_t)0xf5d544a7, (q31_t)0xce0fe3, (q31_t)0xf5e1acfd, + (q31_t)0xcc147f, (q31_t)0xf5ee15b7, (q31_t)0xca1b8a, (q31_t)0xf5fa7ed4, + (q31_t)0xc82506, (q31_t)0xf606e854, (q31_t)0xc630f2, (q31_t)0xf6135237, + (q31_t)0xc43f4d, (q31_t)0xf61fbc7b, (q31_t)0xc25019, (q31_t)0xf62c2721, + (q31_t)0xc06355, (q31_t)0xf6389228, (q31_t)0xbe7901, (q31_t)0xf644fd8f, + (q31_t)0xbc911d, (q31_t)0xf6516956, (q31_t)0xbaabaa, (q31_t)0xf65dd57d, + (q31_t)0xb8c8a7, (q31_t)0xf66a4203, (q31_t)0xb6e815, (q31_t)0xf676aee8, + (q31_t)0xb509f3, (q31_t)0xf6831c2b, (q31_t)0xb32e42, (q31_t)0xf68f89cb, + (q31_t)0xb15502, (q31_t)0xf69bf7c9, (q31_t)0xaf7e33, (q31_t)0xf6a86623, + (q31_t)0xada9d4, (q31_t)0xf6b4d4d9, (q31_t)0xabd7e6, (q31_t)0xf6c143ec, + (q31_t)0xaa086a, (q31_t)0xf6cdb359, (q31_t)0xa83b5e, (q31_t)0xf6da2321, + (q31_t)0xa670c4, (q31_t)0xf6e69344, (q31_t)0xa4a89b, (q31_t)0xf6f303c0, + (q31_t)0xa2e2e3, (q31_t)0xf6ff7496, (q31_t)0xa11f9d, (q31_t)0xf70be5c4, + (q31_t)0x9f5ec8, (q31_t)0xf718574b, (q31_t)0x9da065, (q31_t)0xf724c92a, + (q31_t)0x9be473, (q31_t)0xf7313b60, (q31_t)0x9a2af3, (q31_t)0xf73daded, + (q31_t)0x9873e4, (q31_t)0xf74a20d0, (q31_t)0x96bf48, (q31_t)0xf756940a, + (q31_t)0x950d1d, (q31_t)0xf7630799, (q31_t)0x935d64, (q31_t)0xf76f7b7d, + (q31_t)0x91b01d, (q31_t)0xf77befb5, (q31_t)0x900548, (q31_t)0xf7886442, + (q31_t)0x8e5ce5, (q31_t)0xf794d922, (q31_t)0x8cb6f5, (q31_t)0xf7a14e55, + (q31_t)0x8b1376, (q31_t)0xf7adc3db, (q31_t)0x89726a, (q31_t)0xf7ba39b3, + (q31_t)0x87d3d0, (q31_t)0xf7c6afdc, (q31_t)0x8637a9, (q31_t)0xf7d32657, + (q31_t)0x849df4, (q31_t)0xf7df9d22, (q31_t)0x8306b2, (q31_t)0xf7ec143e, + (q31_t)0x8171e2, (q31_t)0xf7f88ba9, (q31_t)0x7fdf85, (q31_t)0xf8050364, + (q31_t)0x7e4f9b, (q31_t)0xf8117b6d, (q31_t)0x7cc223, (q31_t)0xf81df3c5, + (q31_t)0x7b371e, (q31_t)0xf82a6c6a, (q31_t)0x79ae8c, (q31_t)0xf836e55d, + (q31_t)0x78286e, (q31_t)0xf8435e9d, (q31_t)0x76a4c2, (q31_t)0xf84fd829, + (q31_t)0x752389, (q31_t)0xf85c5201, (q31_t)0x73a4c3, (q31_t)0xf868cc24, + (q31_t)0x722871, (q31_t)0xf8754692, (q31_t)0x70ae92, (q31_t)0xf881c14b, + (q31_t)0x6f3726, (q31_t)0xf88e3c4d, (q31_t)0x6dc22e, (q31_t)0xf89ab799, + (q31_t)0x6c4fa8, (q31_t)0xf8a7332e, (q31_t)0x6adf97, (q31_t)0xf8b3af0c, + (q31_t)0x6971f9, (q31_t)0xf8c02b31, (q31_t)0x6806ce, (q31_t)0xf8cca79e, + (q31_t)0x669e18, (q31_t)0xf8d92452, (q31_t)0x6537d4, (q31_t)0xf8e5a14d, + (q31_t)0x63d405, (q31_t)0xf8f21e8e, (q31_t)0x6272aa, (q31_t)0xf8fe9c15, + (q31_t)0x6113c2, (q31_t)0xf90b19e0, (q31_t)0x5fb74e, (q31_t)0xf91797f0, + (q31_t)0x5e5d4e, (q31_t)0xf9241645, (q31_t)0x5d05c3, (q31_t)0xf93094dd, + (q31_t)0x5bb0ab, (q31_t)0xf93d13b8, (q31_t)0x5a5e07, (q31_t)0xf94992d7, + (q31_t)0x590dd8, (q31_t)0xf9561237, (q31_t)0x57c01d, (q31_t)0xf96291d9, + (q31_t)0x5674d6, (q31_t)0xf96f11bc, (q31_t)0x552c03, (q31_t)0xf97b91e1, + (q31_t)0x53e5a5, (q31_t)0xf9881245, (q31_t)0x52a1bb, (q31_t)0xf99492ea, + (q31_t)0x516045, (q31_t)0xf9a113cd, (q31_t)0x502145, (q31_t)0xf9ad94f0, + (q31_t)0x4ee4b8, (q31_t)0xf9ba1651, (q31_t)0x4daaa1, (q31_t)0xf9c697f0, + (q31_t)0x4c72fe, (q31_t)0xf9d319cc, (q31_t)0x4b3dcf, (q31_t)0xf9df9be6, + (q31_t)0x4a0b16, (q31_t)0xf9ec1e3b, (q31_t)0x48dad1, (q31_t)0xf9f8a0cd, + (q31_t)0x47ad01, (q31_t)0xfa05239a, (q31_t)0x4681a6, (q31_t)0xfa11a6a3, + (q31_t)0x4558c0, (q31_t)0xfa1e29e5, (q31_t)0x44324f, (q31_t)0xfa2aad62, + (q31_t)0x430e53, (q31_t)0xfa373119, (q31_t)0x41eccc, (q31_t)0xfa43b508, + (q31_t)0x40cdba, (q31_t)0xfa503930, (q31_t)0x3fb11d, (q31_t)0xfa5cbd91, + (q31_t)0x3e96f6, (q31_t)0xfa694229, (q31_t)0x3d7f44, (q31_t)0xfa75c6f8, + (q31_t)0x3c6a07, (q31_t)0xfa824bfd, (q31_t)0x3b573f, (q31_t)0xfa8ed139, + (q31_t)0x3a46ed, (q31_t)0xfa9b56ab, (q31_t)0x393910, (q31_t)0xfaa7dc52, + (q31_t)0x382da8, (q31_t)0xfab4622d, (q31_t)0x3724b6, (q31_t)0xfac0e83d, + (q31_t)0x361e3a, (q31_t)0xfacd6e81, (q31_t)0x351a33, (q31_t)0xfad9f4f8, + (q31_t)0x3418a2, (q31_t)0xfae67ba2, (q31_t)0x331986, (q31_t)0xfaf3027e, + (q31_t)0x321ce0, (q31_t)0xfaff898c, (q31_t)0x3122b0, (q31_t)0xfb0c10cb, + (q31_t)0x302af5, (q31_t)0xfb18983b, (q31_t)0x2f35b1, (q31_t)0xfb251fdc, + (q31_t)0x2e42e2, (q31_t)0xfb31a7ac, (q31_t)0x2d5289, (q31_t)0xfb3e2fac, + (q31_t)0x2c64a6, (q31_t)0xfb4ab7db, (q31_t)0x2b7939, (q31_t)0xfb574039, + (q31_t)0x2a9042, (q31_t)0xfb63c8c4, (q31_t)0x29a9c1, (q31_t)0xfb70517d, + (q31_t)0x28c5b6, (q31_t)0xfb7cda63, (q31_t)0x27e421, (q31_t)0xfb896375, + (q31_t)0x270502, (q31_t)0xfb95ecb4, (q31_t)0x262859, (q31_t)0xfba2761e, + (q31_t)0x254e27, (q31_t)0xfbaeffb3, (q31_t)0x24766a, (q31_t)0xfbbb8973, + (q31_t)0x23a124, (q31_t)0xfbc8135c, (q31_t)0x22ce54, (q31_t)0xfbd49d70, + (q31_t)0x21fdfb, (q31_t)0xfbe127ac, (q31_t)0x213018, (q31_t)0xfbedb212, + (q31_t)0x2064ab, (q31_t)0xfbfa3c9f, (q31_t)0x1f9bb5, (q31_t)0xfc06c754, + (q31_t)0x1ed535, (q31_t)0xfc135231, (q31_t)0x1e112b, (q31_t)0xfc1fdd34, + (q31_t)0x1d4f99, (q31_t)0xfc2c685d, (q31_t)0x1c907c, (q31_t)0xfc38f3ac, + (q31_t)0x1bd3d6, (q31_t)0xfc457f21, (q31_t)0x1b19a7, (q31_t)0xfc520aba, + (q31_t)0x1a61ee, (q31_t)0xfc5e9678, (q31_t)0x19acac, (q31_t)0xfc6b2259, + (q31_t)0x18f9e1, (q31_t)0xfc77ae5e, (q31_t)0x18498c, (q31_t)0xfc843a85, + (q31_t)0x179bae, (q31_t)0xfc90c6cf, (q31_t)0x16f047, (q31_t)0xfc9d533b, + (q31_t)0x164757, (q31_t)0xfca9dfc8, (q31_t)0x15a0dd, (q31_t)0xfcb66c77, + (q31_t)0x14fcda, (q31_t)0xfcc2f945, (q31_t)0x145b4e, (q31_t)0xfccf8634, + (q31_t)0x13bc39, (q31_t)0xfcdc1342, (q31_t)0x131f9b, (q31_t)0xfce8a06f, + (q31_t)0x128574, (q31_t)0xfcf52dbb, (q31_t)0x11edc3, (q31_t)0xfd01bb24, + (q31_t)0x11588a, (q31_t)0xfd0e48ab, (q31_t)0x10c5c7, (q31_t)0xfd1ad650, + (q31_t)0x10357c, (q31_t)0xfd276410, (q31_t)0xfa7a8, (q31_t)0xfd33f1ed, + (q31_t)0xf1c4a, (q31_t)0xfd407fe6, (q31_t)0xe9364, (q31_t)0xfd4d0df9, + (q31_t)0xe0cf5, (q31_t)0xfd599c28, (q31_t)0xd88fd, (q31_t)0xfd662a70, + (q31_t)0xd077c, (q31_t)0xfd72b8d2, (q31_t)0xc8872, (q31_t)0xfd7f474d, + (q31_t)0xc0be0, (q31_t)0xfd8bd5e1, (q31_t)0xb91c4, (q31_t)0xfd98648d, + (q31_t)0xb1a20, (q31_t)0xfda4f351, (q31_t)0xaa4f3, (q31_t)0xfdb1822c, + (q31_t)0xa323d, (q31_t)0xfdbe111e, (q31_t)0x9c1ff, (q31_t)0xfdcaa027, + (q31_t)0x95438, (q31_t)0xfdd72f45, (q31_t)0x8e8e8, (q31_t)0xfde3be78, + (q31_t)0x8800f, (q31_t)0xfdf04dc0, (q31_t)0x819ae, (q31_t)0xfdfcdd1d, + (q31_t)0x7b5c4, (q31_t)0xfe096c8d, (q31_t)0x75452, (q31_t)0xfe15fc11, + (q31_t)0x6f556, (q31_t)0xfe228ba7, (q31_t)0x698d3, (q31_t)0xfe2f1b50, + (q31_t)0x63ec6, (q31_t)0xfe3bab0b, (q31_t)0x5e731, (q31_t)0xfe483ad8, + (q31_t)0x59214, (q31_t)0xfe54cab5, (q31_t)0x53f6e, (q31_t)0xfe615aa3, + (q31_t)0x4ef3f, (q31_t)0xfe6deaa1, (q31_t)0x4a188, (q31_t)0xfe7a7aae, + (q31_t)0x45648, (q31_t)0xfe870aca, (q31_t)0x40d80, (q31_t)0xfe939af5, + (q31_t)0x3c72f, (q31_t)0xfea02b2e, (q31_t)0x38356, (q31_t)0xfeacbb74, + (q31_t)0x341f4, (q31_t)0xfeb94bc8, (q31_t)0x3030a, (q31_t)0xfec5dc28, + (q31_t)0x2c697, (q31_t)0xfed26c94, (q31_t)0x28c9c, (q31_t)0xfedefd0c, + (q31_t)0x25519, (q31_t)0xfeeb8d8f, (q31_t)0x2200d, (q31_t)0xfef81e1d, + (q31_t)0x1ed78, (q31_t)0xff04aeb5, (q31_t)0x1bd5c, (q31_t)0xff113f56, + (q31_t)0x18fb6, (q31_t)0xff1dd001, (q31_t)0x16489, (q31_t)0xff2a60b4, + (q31_t)0x13bd3, (q31_t)0xff36f170, (q31_t)0x11594, (q31_t)0xff438234, + (q31_t)0xf1ce, (q31_t)0xff5012fe, (q31_t)0xd07e, (q31_t)0xff5ca3d0, + (q31_t)0xb1a7, (q31_t)0xff6934a8, (q31_t)0x9547, (q31_t)0xff75c585, + (q31_t)0x7b5f, (q31_t)0xff825668, (q31_t)0x63ee, (q31_t)0xff8ee750, + (q31_t)0x4ef5, (q31_t)0xff9b783c, (q31_t)0x3c74, (q31_t)0xffa8092c, + (q31_t)0x2c6a, (q31_t)0xffb49a1f, (q31_t)0x1ed8, (q31_t)0xffc12b16, + (q31_t)0x13bd, (q31_t)0xffcdbc0f, (q31_t)0xb1a, (q31_t)0xffda4d09, + (q31_t)0x4ef, (q31_t)0xffe6de05, (q31_t)0x13c, (q31_t)0xfff36f02, + (q31_t)0x0, (q31_t)0x0, (q31_t)0x13c, (q31_t)0xc90fe, + (q31_t)0x4ef, (q31_t)0x1921fb, (q31_t)0xb1a, (q31_t)0x25b2f7, + (q31_t)0x13bd, (q31_t)0x3243f1, (q31_t)0x1ed8, (q31_t)0x3ed4ea, + (q31_t)0x2c6a, (q31_t)0x4b65e1, (q31_t)0x3c74, (q31_t)0x57f6d4, + (q31_t)0x4ef5, (q31_t)0x6487c4, (q31_t)0x63ee, (q31_t)0x7118b0, + (q31_t)0x7b5f, (q31_t)0x7da998, (q31_t)0x9547, (q31_t)0x8a3a7b, + (q31_t)0xb1a7, (q31_t)0x96cb58, (q31_t)0xd07e, (q31_t)0xa35c30, + (q31_t)0xf1ce, (q31_t)0xafed02, (q31_t)0x11594, (q31_t)0xbc7dcc, + (q31_t)0x13bd3, (q31_t)0xc90e90, (q31_t)0x16489, (q31_t)0xd59f4c, + (q31_t)0x18fb6, (q31_t)0xe22fff, (q31_t)0x1bd5c, (q31_t)0xeec0aa, + (q31_t)0x1ed78, (q31_t)0xfb514b, (q31_t)0x2200d, (q31_t)0x107e1e3, + (q31_t)0x25519, (q31_t)0x1147271, (q31_t)0x28c9c, (q31_t)0x12102f4, + (q31_t)0x2c697, (q31_t)0x12d936c, (q31_t)0x3030a, (q31_t)0x13a23d8, + (q31_t)0x341f4, (q31_t)0x146b438, (q31_t)0x38356, (q31_t)0x153448c, + (q31_t)0x3c72f, (q31_t)0x15fd4d2, (q31_t)0x40d80, (q31_t)0x16c650b, + (q31_t)0x45648, (q31_t)0x178f536, (q31_t)0x4a188, (q31_t)0x1858552, + (q31_t)0x4ef3f, (q31_t)0x192155f, (q31_t)0x53f6e, (q31_t)0x19ea55d, + (q31_t)0x59214, (q31_t)0x1ab354b, (q31_t)0x5e731, (q31_t)0x1b7c528, + (q31_t)0x63ec6, (q31_t)0x1c454f5, (q31_t)0x698d3, (q31_t)0x1d0e4b0, + (q31_t)0x6f556, (q31_t)0x1dd7459, (q31_t)0x75452, (q31_t)0x1ea03ef, + (q31_t)0x7b5c4, (q31_t)0x1f69373, (q31_t)0x819ae, (q31_t)0x20322e3, + (q31_t)0x8800f, (q31_t)0x20fb240, (q31_t)0x8e8e8, (q31_t)0x21c4188, + (q31_t)0x95438, (q31_t)0x228d0bb, (q31_t)0x9c1ff, (q31_t)0x2355fd9, + (q31_t)0xa323d, (q31_t)0x241eee2, (q31_t)0xaa4f3, (q31_t)0x24e7dd4, + (q31_t)0xb1a20, (q31_t)0x25b0caf, (q31_t)0xb91c4, (q31_t)0x2679b73, + (q31_t)0xc0be0, (q31_t)0x2742a1f, (q31_t)0xc8872, (q31_t)0x280b8b3, + (q31_t)0xd077c, (q31_t)0x28d472e, (q31_t)0xd88fd, (q31_t)0x299d590, + (q31_t)0xe0cf5, (q31_t)0x2a663d8, (q31_t)0xe9364, (q31_t)0x2b2f207, + (q31_t)0xf1c4a, (q31_t)0x2bf801a, (q31_t)0xfa7a8, (q31_t)0x2cc0e13, + (q31_t)0x10357c, (q31_t)0x2d89bf0, (q31_t)0x10c5c7, (q31_t)0x2e529b0, + (q31_t)0x11588a, (q31_t)0x2f1b755, (q31_t)0x11edc3, (q31_t)0x2fe44dc, + (q31_t)0x128574, (q31_t)0x30ad245, (q31_t)0x131f9b, (q31_t)0x3175f91, + (q31_t)0x13bc39, (q31_t)0x323ecbe, (q31_t)0x145b4e, (q31_t)0x33079cc, + (q31_t)0x14fcda, (q31_t)0x33d06bb, (q31_t)0x15a0dd, (q31_t)0x3499389, + (q31_t)0x164757, (q31_t)0x3562038, (q31_t)0x16f047, (q31_t)0x362acc5, + (q31_t)0x179bae, (q31_t)0x36f3931, (q31_t)0x18498c, (q31_t)0x37bc57b, + (q31_t)0x18f9e1, (q31_t)0x38851a2, (q31_t)0x19acac, (q31_t)0x394dda7, + (q31_t)0x1a61ee, (q31_t)0x3a16988, (q31_t)0x1b19a7, (q31_t)0x3adf546, + (q31_t)0x1bd3d6, (q31_t)0x3ba80df, (q31_t)0x1c907c, (q31_t)0x3c70c54, + (q31_t)0x1d4f99, (q31_t)0x3d397a3, (q31_t)0x1e112b, (q31_t)0x3e022cc, + (q31_t)0x1ed535, (q31_t)0x3ecadcf, (q31_t)0x1f9bb5, (q31_t)0x3f938ac, + (q31_t)0x2064ab, (q31_t)0x405c361, (q31_t)0x213018, (q31_t)0x4124dee, + (q31_t)0x21fdfb, (q31_t)0x41ed854, (q31_t)0x22ce54, (q31_t)0x42b6290, + (q31_t)0x23a124, (q31_t)0x437eca4, (q31_t)0x24766a, (q31_t)0x444768d, + (q31_t)0x254e27, (q31_t)0x451004d, (q31_t)0x262859, (q31_t)0x45d89e2, + (q31_t)0x270502, (q31_t)0x46a134c, (q31_t)0x27e421, (q31_t)0x4769c8b, + (q31_t)0x28c5b6, (q31_t)0x483259d, (q31_t)0x29a9c1, (q31_t)0x48fae83, + (q31_t)0x2a9042, (q31_t)0x49c373c, (q31_t)0x2b7939, (q31_t)0x4a8bfc7, + (q31_t)0x2c64a6, (q31_t)0x4b54825, (q31_t)0x2d5289, (q31_t)0x4c1d054, + (q31_t)0x2e42e2, (q31_t)0x4ce5854, (q31_t)0x2f35b1, (q31_t)0x4dae024, + (q31_t)0x302af5, (q31_t)0x4e767c5, (q31_t)0x3122b0, (q31_t)0x4f3ef35, + (q31_t)0x321ce0, (q31_t)0x5007674, (q31_t)0x331986, (q31_t)0x50cfd82, + (q31_t)0x3418a2, (q31_t)0x519845e, (q31_t)0x351a33, (q31_t)0x5260b08, + (q31_t)0x361e3a, (q31_t)0x532917f, (q31_t)0x3724b6, (q31_t)0x53f17c3, + (q31_t)0x382da8, (q31_t)0x54b9dd3, (q31_t)0x393910, (q31_t)0x55823ae, + (q31_t)0x3a46ed, (q31_t)0x564a955, (q31_t)0x3b573f, (q31_t)0x5712ec7, + (q31_t)0x3c6a07, (q31_t)0x57db403, (q31_t)0x3d7f44, (q31_t)0x58a3908, + (q31_t)0x3e96f6, (q31_t)0x596bdd7, (q31_t)0x3fb11d, (q31_t)0x5a3426f, + (q31_t)0x40cdba, (q31_t)0x5afc6d0, (q31_t)0x41eccc, (q31_t)0x5bc4af8, + (q31_t)0x430e53, (q31_t)0x5c8cee7, (q31_t)0x44324f, (q31_t)0x5d5529e, + (q31_t)0x4558c0, (q31_t)0x5e1d61b, (q31_t)0x4681a6, (q31_t)0x5ee595d, + (q31_t)0x47ad01, (q31_t)0x5fadc66, (q31_t)0x48dad1, (q31_t)0x6075f33, + (q31_t)0x4a0b16, (q31_t)0x613e1c5, (q31_t)0x4b3dcf, (q31_t)0x620641a, + (q31_t)0x4c72fe, (q31_t)0x62ce634, (q31_t)0x4daaa1, (q31_t)0x6396810, + (q31_t)0x4ee4b8, (q31_t)0x645e9af, (q31_t)0x502145, (q31_t)0x6526b10, + (q31_t)0x516045, (q31_t)0x65eec33, (q31_t)0x52a1bb, (q31_t)0x66b6d16, + (q31_t)0x53e5a5, (q31_t)0x677edbb, (q31_t)0x552c03, (q31_t)0x6846e1f, + (q31_t)0x5674d6, (q31_t)0x690ee44, (q31_t)0x57c01d, (q31_t)0x69d6e27, + (q31_t)0x590dd8, (q31_t)0x6a9edc9, (q31_t)0x5a5e07, (q31_t)0x6b66d29, + (q31_t)0x5bb0ab, (q31_t)0x6c2ec48, (q31_t)0x5d05c3, (q31_t)0x6cf6b23, + (q31_t)0x5e5d4e, (q31_t)0x6dbe9bb, (q31_t)0x5fb74e, (q31_t)0x6e86810, + (q31_t)0x6113c2, (q31_t)0x6f4e620, (q31_t)0x6272aa, (q31_t)0x70163eb, + (q31_t)0x63d405, (q31_t)0x70de172, (q31_t)0x6537d4, (q31_t)0x71a5eb3, + (q31_t)0x669e18, (q31_t)0x726dbae, (q31_t)0x6806ce, (q31_t)0x7335862, + (q31_t)0x6971f9, (q31_t)0x73fd4cf, (q31_t)0x6adf97, (q31_t)0x74c50f4, + (q31_t)0x6c4fa8, (q31_t)0x758ccd2, (q31_t)0x6dc22e, (q31_t)0x7654867, + (q31_t)0x6f3726, (q31_t)0x771c3b3, (q31_t)0x70ae92, (q31_t)0x77e3eb5, + (q31_t)0x722871, (q31_t)0x78ab96e, (q31_t)0x73a4c3, (q31_t)0x79733dc, + (q31_t)0x752389, (q31_t)0x7a3adff, (q31_t)0x76a4c2, (q31_t)0x7b027d7, + (q31_t)0x78286e, (q31_t)0x7bca163, (q31_t)0x79ae8c, (q31_t)0x7c91aa3, + (q31_t)0x7b371e, (q31_t)0x7d59396, (q31_t)0x7cc223, (q31_t)0x7e20c3b, + (q31_t)0x7e4f9b, (q31_t)0x7ee8493, (q31_t)0x7fdf85, (q31_t)0x7fafc9c, + (q31_t)0x8171e2, (q31_t)0x8077457, (q31_t)0x8306b2, (q31_t)0x813ebc2, + (q31_t)0x849df4, (q31_t)0x82062de, (q31_t)0x8637a9, (q31_t)0x82cd9a9, + (q31_t)0x87d3d0, (q31_t)0x8395024, (q31_t)0x89726a, (q31_t)0x845c64d, + (q31_t)0x8b1376, (q31_t)0x8523c25, (q31_t)0x8cb6f5, (q31_t)0x85eb1ab, + (q31_t)0x8e5ce5, (q31_t)0x86b26de, (q31_t)0x900548, (q31_t)0x8779bbe, + (q31_t)0x91b01d, (q31_t)0x884104b, (q31_t)0x935d64, (q31_t)0x8908483, + (q31_t)0x950d1d, (q31_t)0x89cf867, (q31_t)0x96bf48, (q31_t)0x8a96bf6, + (q31_t)0x9873e4, (q31_t)0x8b5df30, (q31_t)0x9a2af3, (q31_t)0x8c25213, + (q31_t)0x9be473, (q31_t)0x8cec4a0, (q31_t)0x9da065, (q31_t)0x8db36d6, + (q31_t)0x9f5ec8, (q31_t)0x8e7a8b5, (q31_t)0xa11f9d, (q31_t)0x8f41a3c, + (q31_t)0xa2e2e3, (q31_t)0x9008b6a, (q31_t)0xa4a89b, (q31_t)0x90cfc40, + (q31_t)0xa670c4, (q31_t)0x9196cbc, (q31_t)0xa83b5e, (q31_t)0x925dcdf, + (q31_t)0xaa086a, (q31_t)0x9324ca7, (q31_t)0xabd7e6, (q31_t)0x93ebc14, + (q31_t)0xada9d4, (q31_t)0x94b2b27, (q31_t)0xaf7e33, (q31_t)0x95799dd, + (q31_t)0xb15502, (q31_t)0x9640837, (q31_t)0xb32e42, (q31_t)0x9707635, + (q31_t)0xb509f3, (q31_t)0x97ce3d5, (q31_t)0xb6e815, (q31_t)0x9895118, + (q31_t)0xb8c8a7, (q31_t)0x995bdfd, (q31_t)0xbaabaa, (q31_t)0x9a22a83, + (q31_t)0xbc911d, (q31_t)0x9ae96aa, (q31_t)0xbe7901, (q31_t)0x9bb0271, + (q31_t)0xc06355, (q31_t)0x9c76dd8, (q31_t)0xc25019, (q31_t)0x9d3d8df, + (q31_t)0xc43f4d, (q31_t)0x9e04385, (q31_t)0xc630f2, (q31_t)0x9ecadc9, + (q31_t)0xc82506, (q31_t)0x9f917ac, (q31_t)0xca1b8a, (q31_t)0xa05812c, + (q31_t)0xcc147f, (q31_t)0xa11ea49, (q31_t)0xce0fe3, (q31_t)0xa1e5303, + (q31_t)0xd00db6, (q31_t)0xa2abb59, (q31_t)0xd20dfa, (q31_t)0xa37234a, + (q31_t)0xd410ad, (q31_t)0xa438ad7, (q31_t)0xd615cf, (q31_t)0xa4ff1fe, + (q31_t)0xd81d61, (q31_t)0xa5c58c0, (q31_t)0xda2762, (q31_t)0xa68bf1b, + (q31_t)0xdc33d2, (q31_t)0xa752510, (q31_t)0xde42b2, (q31_t)0xa818a9d, + (q31_t)0xe05401, (q31_t)0xa8defc3, (q31_t)0xe267be, (q31_t)0xa9a5480, + (q31_t)0xe47deb, (q31_t)0xaa6b8d5, (q31_t)0xe69686, (q31_t)0xab31cc1, + (q31_t)0xe8b190, (q31_t)0xabf8043, (q31_t)0xeacf09, (q31_t)0xacbe35b, + (q31_t)0xeceef1, (q31_t)0xad84609, (q31_t)0xef1147, (q31_t)0xae4a84b, + (q31_t)0xf1360b, (q31_t)0xaf10a22, (q31_t)0xf35d3e, (q31_t)0xafd6b8d, + (q31_t)0xf586df, (q31_t)0xb09cc8c, (q31_t)0xf7b2ee, (q31_t)0xb162d1d, + (q31_t)0xf9e16b, (q31_t)0xb228d42, (q31_t)0xfc1257, (q31_t)0xb2eecf8, + (q31_t)0xfe45b0, (q31_t)0xb3b4c40, (q31_t)0x1007b77, (q31_t)0xb47ab19, + (q31_t)0x102b3ac, (q31_t)0xb540982, (q31_t)0x104ee4f, (q31_t)0xb60677c, + (q31_t)0x1072b5f, (q31_t)0xb6cc506, (q31_t)0x1096add, (q31_t)0xb79221f, + (q31_t)0x10bacc8, (q31_t)0xb857ec7, (q31_t)0x10df120, (q31_t)0xb91dafc, + (q31_t)0x11037e6, (q31_t)0xb9e36c0, (q31_t)0x1128119, (q31_t)0xbaa9211, + (q31_t)0x114ccb9, (q31_t)0xbb6ecef, (q31_t)0x1171ac6, (q31_t)0xbc34759, + (q31_t)0x1196b3f, (q31_t)0xbcfa150, (q31_t)0x11bbe26, (q31_t)0xbdbfad1, + (q31_t)0x11e1379, (q31_t)0xbe853de, (q31_t)0x1206b39, (q31_t)0xbf4ac75, + (q31_t)0x122c566, (q31_t)0xc010496, (q31_t)0x12521ff, (q31_t)0xc0d5c41, + (q31_t)0x1278104, (q31_t)0xc19b374, (q31_t)0x129e276, (q31_t)0xc260a31, + (q31_t)0x12c4653, (q31_t)0xc326075, (q31_t)0x12eac9d, (q31_t)0xc3eb641, + (q31_t)0x1311553, (q31_t)0xc4b0b94, (q31_t)0x1338075, (q31_t)0xc57606e, + (q31_t)0x135ee02, (q31_t)0xc63b4ce, (q31_t)0x1385dfb, (q31_t)0xc7008b3, + (q31_t)0x13ad060, (q31_t)0xc7c5c1e, (q31_t)0x13d4530, (q31_t)0xc88af0e, + (q31_t)0x13fbc6c, (q31_t)0xc950182, (q31_t)0x1423613, (q31_t)0xca1537a, + (q31_t)0x144b225, (q31_t)0xcada4f5, (q31_t)0x14730a3, (q31_t)0xcb9f5f3, + (q31_t)0x149b18b, (q31_t)0xcc64673, (q31_t)0x14c34df, (q31_t)0xcd29676, + (q31_t)0x14eba9d, (q31_t)0xcdee5f9, (q31_t)0x15142c6, (q31_t)0xceb34fe, + (q31_t)0x153cd5a, (q31_t)0xcf78383, (q31_t)0x1565a58, (q31_t)0xd03d189, + (q31_t)0x158e9c1, (q31_t)0xd101f0e, (q31_t)0x15b7b94, (q31_t)0xd1c6c11, + (q31_t)0x15e0fd1, (q31_t)0xd28b894, (q31_t)0x160a678, (q31_t)0xd350495, + (q31_t)0x1633f8a, (q31_t)0xd415013, (q31_t)0x165db05, (q31_t)0xd4d9b0e, + (q31_t)0x16878eb, (q31_t)0xd59e586, (q31_t)0x16b193a, (q31_t)0xd662f7b, + (q31_t)0x16dbbf3, (q31_t)0xd7278eb, (q31_t)0x1706115, (q31_t)0xd7ec1d6, + (q31_t)0x17308a1, (q31_t)0xd8b0a3d, (q31_t)0x175b296, (q31_t)0xd97521d, + (q31_t)0x1785ef4, (q31_t)0xda39978, (q31_t)0x17b0dbb, (q31_t)0xdafe04b, + (q31_t)0x17dbeec, (q31_t)0xdbc2698, (q31_t)0x1807285, (q31_t)0xdc86c5d, + (q31_t)0x1832888, (q31_t)0xdd4b19a, (q31_t)0x185e0f3, (q31_t)0xde0f64f, + (q31_t)0x1889bc6, (q31_t)0xded3a7b, (q31_t)0x18b5903, (q31_t)0xdf97e1d, + (q31_t)0x18e18a7, (q31_t)0xe05c135, (q31_t)0x190dab4, (q31_t)0xe1203c3, + (q31_t)0x1939f29, (q31_t)0xe1e45c6, (q31_t)0x1966606, (q31_t)0xe2a873e, + (q31_t)0x1992f4c, (q31_t)0xe36c82a, (q31_t)0x19bfaf9, (q31_t)0xe430889, + (q31_t)0x19ec90d, (q31_t)0xe4f485c, (q31_t)0x1a1998a, (q31_t)0xe5b87a2, + (q31_t)0x1a46c6e, (q31_t)0xe67c65a, (q31_t)0x1a741b9, (q31_t)0xe740483, + (q31_t)0x1aa196c, (q31_t)0xe80421e, (q31_t)0x1acf386, (q31_t)0xe8c7f2a, + (q31_t)0x1afd007, (q31_t)0xe98bba7, (q31_t)0x1b2aef0, (q31_t)0xea4f793, + (q31_t)0x1b5903f, (q31_t)0xeb132ef, (q31_t)0x1b873f5, (q31_t)0xebd6db9, + (q31_t)0x1bb5a11, (q31_t)0xec9a7f3, (q31_t)0x1be4294, (q31_t)0xed5e19a, + (q31_t)0x1c12d7e, (q31_t)0xee21aaf, (q31_t)0x1c41ace, (q31_t)0xeee5331, + (q31_t)0x1c70a84, (q31_t)0xefa8b20, (q31_t)0x1c9fca0, (q31_t)0xf06c27a, + (q31_t)0x1ccf122, (q31_t)0xf12f941, (q31_t)0x1cfe80a, (q31_t)0xf1f2f73, + (q31_t)0x1d2e158, (q31_t)0xf2b650f, (q31_t)0x1d5dd0c, (q31_t)0xf379a16, + (q31_t)0x1d8db25, (q31_t)0xf43ce86, (q31_t)0x1dbdba3, (q31_t)0xf500260, + (q31_t)0x1dede87, (q31_t)0xf5c35a3, (q31_t)0x1e1e3d0, (q31_t)0xf68684e, + (q31_t)0x1e4eb7e, (q31_t)0xf749a61, (q31_t)0x1e7f591, (q31_t)0xf80cbdc, + (q31_t)0x1eb0209, (q31_t)0xf8cfcbe, (q31_t)0x1ee10e5, (q31_t)0xf992d06, + (q31_t)0x1f12227, (q31_t)0xfa55cb4, (q31_t)0x1f435cc, (q31_t)0xfb18bc8, + (q31_t)0x1f74bd6, (q31_t)0xfbdba40, (q31_t)0x1fa6445, (q31_t)0xfc9e81e, + (q31_t)0x1fd7f17, (q31_t)0xfd6155f, (q31_t)0x2009c4e, (q31_t)0xfe24205, + (q31_t)0x203bbe8, (q31_t)0xfee6e0d, (q31_t)0x206dde6, (q31_t)0xffa9979, + (q31_t)0x20a0248, (q31_t)0x1006c446, (q31_t)0x20d290d, (q31_t)0x1012ee76, + (q31_t)0x2105236, (q31_t)0x101f1807, (q31_t)0x2137dc2, (q31_t)0x102b40f8, + (q31_t)0x216abb1, (q31_t)0x1037694b, (q31_t)0x219dc03, (q31_t)0x104390fd, + (q31_t)0x21d0eb8, (q31_t)0x104fb80e, (q31_t)0x22043d0, (q31_t)0x105bde7f, + (q31_t)0x2237b4b, (q31_t)0x1068044e, (q31_t)0x226b528, (q31_t)0x1074297b, + (q31_t)0x229f167, (q31_t)0x10804e06, (q31_t)0x22d3009, (q31_t)0x108c71ee, + (q31_t)0x230710d, (q31_t)0x10989532, (q31_t)0x233b473, (q31_t)0x10a4b7d3, + (q31_t)0x236fa3b, (q31_t)0x10b0d9d0, (q31_t)0x23a4265, (q31_t)0x10bcfb28, + (q31_t)0x23d8cf1, (q31_t)0x10c91bda, (q31_t)0x240d9de, (q31_t)0x10d53be7, + (q31_t)0x244292c, (q31_t)0x10e15b4e, (q31_t)0x2477adc, (q31_t)0x10ed7a0e, + (q31_t)0x24aceed, (q31_t)0x10f99827, (q31_t)0x24e255e, (q31_t)0x1105b599, + (q31_t)0x2517e31, (q31_t)0x1111d263, (q31_t)0x254d965, (q31_t)0x111dee84, + (q31_t)0x25836f9, (q31_t)0x112a09fc, (q31_t)0x25b96ee, (q31_t)0x113624cb, + (q31_t)0x25ef943, (q31_t)0x11423ef0, (q31_t)0x2625df8, (q31_t)0x114e586a, + (q31_t)0x265c50e, (q31_t)0x115a713a, (q31_t)0x2692e83, (q31_t)0x1166895f, + (q31_t)0x26c9a58, (q31_t)0x1172a0d7, (q31_t)0x270088e, (q31_t)0x117eb7a4, + (q31_t)0x2737922, (q31_t)0x118acdc4, (q31_t)0x276ec16, (q31_t)0x1196e337, + (q31_t)0x27a616a, (q31_t)0x11a2f7fc, (q31_t)0x27dd91c, (q31_t)0x11af0c13, + (q31_t)0x281532e, (q31_t)0x11bb1f7c, (q31_t)0x284cf9f, (q31_t)0x11c73235, + (q31_t)0x2884e6e, (q31_t)0x11d3443f, (q31_t)0x28bcf9c, (q31_t)0x11df5599, + (q31_t)0x28f5329, (q31_t)0x11eb6643, (q31_t)0x292d914, (q31_t)0x11f7763c, + (q31_t)0x296615d, (q31_t)0x12038584, (q31_t)0x299ec05, (q31_t)0x120f941a, + (q31_t)0x29d790a, (q31_t)0x121ba1fd, (q31_t)0x2a1086d, (q31_t)0x1227af2e, + (q31_t)0x2a49a2e, (q31_t)0x1233bbac, (q31_t)0x2a82e4d, (q31_t)0x123fc776, + (q31_t)0x2abc4c9, (q31_t)0x124bd28c, (q31_t)0x2af5da2, (q31_t)0x1257dced, + (q31_t)0x2b2f8d8, (q31_t)0x1263e699, (q31_t)0x2b6966c, (q31_t)0x126fef90, + (q31_t)0x2ba365c, (q31_t)0x127bf7d1, (q31_t)0x2bdd8a9, (q31_t)0x1287ff5b, + (q31_t)0x2c17d52, (q31_t)0x1294062f, (q31_t)0x2c52459, (q31_t)0x12a00c4b, + (q31_t)0x2c8cdbb, (q31_t)0x12ac11af, (q31_t)0x2cc7979, (q31_t)0x12b8165b, + (q31_t)0x2d02794, (q31_t)0x12c41a4f, (q31_t)0x2d3d80a, (q31_t)0x12d01d89, + (q31_t)0x2d78add, (q31_t)0x12dc2009, (q31_t)0x2db400a, (q31_t)0x12e821cf, + (q31_t)0x2def794, (q31_t)0x12f422db, (q31_t)0x2e2b178, (q31_t)0x1300232c, + (q31_t)0x2e66db8, (q31_t)0x130c22c1, (q31_t)0x2ea2c53, (q31_t)0x1318219a, + (q31_t)0x2eded49, (q31_t)0x13241fb6, (q31_t)0x2f1b099, (q31_t)0x13301d16, + (q31_t)0x2f57644, (q31_t)0x133c19b8, (q31_t)0x2f93e4a, (q31_t)0x1348159d, + (q31_t)0x2fd08a9, (q31_t)0x135410c3, (q31_t)0x300d563, (q31_t)0x13600b2a, + (q31_t)0x304a477, (q31_t)0x136c04d2, (q31_t)0x30875e5, (q31_t)0x1377fdbb, + (q31_t)0x30c49ad, (q31_t)0x1383f5e3, (q31_t)0x3101fce, (q31_t)0x138fed4b, + (q31_t)0x313f848, (q31_t)0x139be3f2, (q31_t)0x317d31c, (q31_t)0x13a7d9d7, + (q31_t)0x31bb049, (q31_t)0x13b3cefa, (q31_t)0x31f8fcf, (q31_t)0x13bfc35b, + (q31_t)0x32371ae, (q31_t)0x13cbb6f8, (q31_t)0x32755e5, (q31_t)0x13d7a9d3, + (q31_t)0x32b3c75, (q31_t)0x13e39be9, (q31_t)0x32f255e, (q31_t)0x13ef8d3c, + (q31_t)0x333109e, (q31_t)0x13fb7dc9, (q31_t)0x336fe37, (q31_t)0x14076d91, + (q31_t)0x33aee27, (q31_t)0x14135c94, (q31_t)0x33ee070, (q31_t)0x141f4ad1, + (q31_t)0x342d510, (q31_t)0x142b3846, (q31_t)0x346cc07, (q31_t)0x143724f5, + (q31_t)0x34ac556, (q31_t)0x144310dd, (q31_t)0x34ec0fc, (q31_t)0x144efbfc, + (q31_t)0x352bef9, (q31_t)0x145ae653, (q31_t)0x356bf4d, (q31_t)0x1466cfe1, + (q31_t)0x35ac1f7, (q31_t)0x1472b8a5, (q31_t)0x35ec6f8, (q31_t)0x147ea0a0, + (q31_t)0x362ce50, (q31_t)0x148a87d1, (q31_t)0x366d7fd, (q31_t)0x14966e36, + (q31_t)0x36ae401, (q31_t)0x14a253d1, (q31_t)0x36ef25b, (q31_t)0x14ae38a0, + (q31_t)0x373030a, (q31_t)0x14ba1ca3, (q31_t)0x377160f, (q31_t)0x14c5ffd9, + (q31_t)0x37b2b6a, (q31_t)0x14d1e242, (q31_t)0x37f4319, (q31_t)0x14ddc3de, + (q31_t)0x3835d1e, (q31_t)0x14e9a4ac, (q31_t)0x3877978, (q31_t)0x14f584ac, + (q31_t)0x38b9827, (q31_t)0x150163dc, (q31_t)0x38fb92a, (q31_t)0x150d423d, + (q31_t)0x393dc82, (q31_t)0x15191fcf, (q31_t)0x398022f, (q31_t)0x1524fc90, + (q31_t)0x39c2a2f, (q31_t)0x1530d881, (q31_t)0x3a05484, (q31_t)0x153cb3a0, + (q31_t)0x3a4812c, (q31_t)0x15488dee, (q31_t)0x3a8b028, (q31_t)0x1554676a, + (q31_t)0x3ace178, (q31_t)0x15604013, (q31_t)0x3b1151b, (q31_t)0x156c17e9, + (q31_t)0x3b54b11, (q31_t)0x1577eeec, (q31_t)0x3b9835a, (q31_t)0x1583c51b, + (q31_t)0x3bdbdf6, (q31_t)0x158f9a76, (q31_t)0x3c1fae5, (q31_t)0x159b6efb, + (q31_t)0x3c63a26, (q31_t)0x15a742ac, (q31_t)0x3ca7bba, (q31_t)0x15b31587, + (q31_t)0x3cebfa0, (q31_t)0x15bee78c, (q31_t)0x3d305d8, (q31_t)0x15cab8ba, + (q31_t)0x3d74e62, (q31_t)0x15d68911, (q31_t)0x3db993e, (q31_t)0x15e25890, + (q31_t)0x3dfe66c, (q31_t)0x15ee2738, (q31_t)0x3e435ea, (q31_t)0x15f9f507, + (q31_t)0x3e887bb, (q31_t)0x1605c1fd, (q31_t)0x3ecdbdc, (q31_t)0x16118e1a, + (q31_t)0x3f1324e, (q31_t)0x161d595d, (q31_t)0x3f58b10, (q31_t)0x162923c5, + (q31_t)0x3f9e624, (q31_t)0x1634ed53, (q31_t)0x3fe4388, (q31_t)0x1640b606, + (q31_t)0x402a33c, (q31_t)0x164c7ddd, (q31_t)0x4070540, (q31_t)0x165844d8, + (q31_t)0x40b6994, (q31_t)0x16640af7, (q31_t)0x40fd037, (q31_t)0x166fd039, + (q31_t)0x414392b, (q31_t)0x167b949d, (q31_t)0x418a46d, (q31_t)0x16875823, + (q31_t)0x41d11ff, (q31_t)0x16931acb, (q31_t)0x42181e0, (q31_t)0x169edc94, + (q31_t)0x425f410, (q31_t)0x16aa9d7e, (q31_t)0x42a688f, (q31_t)0x16b65d88, + (q31_t)0x42edf5c, (q31_t)0x16c21cb2, (q31_t)0x4335877, (q31_t)0x16cddafb, + (q31_t)0x437d3e1, (q31_t)0x16d99864, (q31_t)0x43c5199, (q31_t)0x16e554ea, + (q31_t)0x440d19e, (q31_t)0x16f1108f, (q31_t)0x44553f2, (q31_t)0x16fccb51, + (q31_t)0x449d892, (q31_t)0x17088531, (q31_t)0x44e5f80, (q31_t)0x17143e2d, + (q31_t)0x452e8bc, (q31_t)0x171ff646, (q31_t)0x4577444, (q31_t)0x172bad7a, + (q31_t)0x45c0219, (q31_t)0x173763c9, (q31_t)0x460923b, (q31_t)0x17431933, + (q31_t)0x46524a9, (q31_t)0x174ecdb8, (q31_t)0x469b963, (q31_t)0x175a8157, + (q31_t)0x46e5069, (q31_t)0x1766340f, (q31_t)0x472e9bc, (q31_t)0x1771e5e0, + (q31_t)0x477855a, (q31_t)0x177d96ca, (q31_t)0x47c2344, (q31_t)0x178946cc, + (q31_t)0x480c379, (q31_t)0x1794f5e6, (q31_t)0x48565f9, (q31_t)0x17a0a417, + (q31_t)0x48a0ac4, (q31_t)0x17ac515f, (q31_t)0x48eb1db, (q31_t)0x17b7fdbd, + (q31_t)0x4935b3c, (q31_t)0x17c3a931, (q31_t)0x49806e7, (q31_t)0x17cf53bb, + (q31_t)0x49cb4dd, (q31_t)0x17dafd59, (q31_t)0x4a1651c, (q31_t)0x17e6a60c, + (q31_t)0x4a617a6, (q31_t)0x17f24dd3, (q31_t)0x4aacc7a, (q31_t)0x17fdf4ae, + (q31_t)0x4af8397, (q31_t)0x18099a9c, (q31_t)0x4b43cfd, (q31_t)0x18153f9d, + (q31_t)0x4b8f8ad, (q31_t)0x1820e3b0, (q31_t)0x4bdb6a6, (q31_t)0x182c86d5, + (q31_t)0x4c276e8, (q31_t)0x1838290c, (q31_t)0x4c73972, (q31_t)0x1843ca53, + (q31_t)0x4cbfe45, (q31_t)0x184f6aab, (q31_t)0x4d0c560, (q31_t)0x185b0a13, + (q31_t)0x4d58ec3, (q31_t)0x1866a88a, (q31_t)0x4da5a6f, (q31_t)0x18724611, + (q31_t)0x4df2862, (q31_t)0x187de2a7, (q31_t)0x4e3f89c, (q31_t)0x18897e4a, + (q31_t)0x4e8cb1e, (q31_t)0x189518fc, (q31_t)0x4ed9fe7, (q31_t)0x18a0b2bb, + (q31_t)0x4f276f7, (q31_t)0x18ac4b87, (q31_t)0x4f7504e, (q31_t)0x18b7e35f, + (q31_t)0x4fc2bec, (q31_t)0x18c37a44, (q31_t)0x50109d0, (q31_t)0x18cf1034, + (q31_t)0x505e9fb, (q31_t)0x18daa52f, (q31_t)0x50acc6b, (q31_t)0x18e63935, + (q31_t)0x50fb121, (q31_t)0x18f1cc45, (q31_t)0x514981d, (q31_t)0x18fd5e5f, + (q31_t)0x519815f, (q31_t)0x1908ef82, (q31_t)0x51e6ce6, (q31_t)0x19147fae, + (q31_t)0x5235ab2, (q31_t)0x19200ee3, (q31_t)0x5284ac3, (q31_t)0x192b9d1f, + (q31_t)0x52d3d18, (q31_t)0x19372a64, (q31_t)0x53231b3, (q31_t)0x1942b6af, + (q31_t)0x5372891, (q31_t)0x194e4201, (q31_t)0x53c21b4, (q31_t)0x1959cc5a, + (q31_t)0x5411d1b, (q31_t)0x196555b8, (q31_t)0x5461ac6, (q31_t)0x1970de1b, + (q31_t)0x54b1ab4, (q31_t)0x197c6584, (q31_t)0x5501ce5, (q31_t)0x1987ebf0, + (q31_t)0x555215a, (q31_t)0x19937161, (q31_t)0x55a2812, (q31_t)0x199ef5d6, + (q31_t)0x55f310d, (q31_t)0x19aa794d, (q31_t)0x5643c4a, (q31_t)0x19b5fbc8, + (q31_t)0x56949ca, (q31_t)0x19c17d44, (q31_t)0x56e598c, (q31_t)0x19ccfdc2, + (q31_t)0x5736b90, (q31_t)0x19d87d42, (q31_t)0x5787fd6, (q31_t)0x19e3fbc3, + (q31_t)0x57d965d, (q31_t)0x19ef7944, (q31_t)0x582af26, (q31_t)0x19faf5c5, + (q31_t)0x587ca31, (q31_t)0x1a067145, (q31_t)0x58ce77c, (q31_t)0x1a11ebc5, + (q31_t)0x5920708, (q31_t)0x1a1d6544, (q31_t)0x59728d5, (q31_t)0x1a28ddc0, + (q31_t)0x59c4ce3, (q31_t)0x1a34553b, (q31_t)0x5a17330, (q31_t)0x1a3fcbb3, + (q31_t)0x5a69bbe, (q31_t)0x1a4b4128, (q31_t)0x5abc68c, (q31_t)0x1a56b599, + (q31_t)0x5b0f399, (q31_t)0x1a622907, (q31_t)0x5b622e6, (q31_t)0x1a6d9b70, + (q31_t)0x5bb5472, (q31_t)0x1a790cd4, (q31_t)0x5c0883d, (q31_t)0x1a847d33, + (q31_t)0x5c5be47, (q31_t)0x1a8fec8c, (q31_t)0x5caf690, (q31_t)0x1a9b5adf, + (q31_t)0x5d03118, (q31_t)0x1aa6c82b, (q31_t)0x5d56ddd, (q31_t)0x1ab23471, + (q31_t)0x5daace1, (q31_t)0x1abd9faf, (q31_t)0x5dfee22, (q31_t)0x1ac909e5, + (q31_t)0x5e531a1, (q31_t)0x1ad47312, (q31_t)0x5ea775e, (q31_t)0x1adfdb37, + (q31_t)0x5efbf58, (q31_t)0x1aeb4253, (q31_t)0x5f5098f, (q31_t)0x1af6a865, + (q31_t)0x5fa5603, (q31_t)0x1b020d6c, (q31_t)0x5ffa4b3, (q31_t)0x1b0d716a, + (q31_t)0x604f5a0, (q31_t)0x1b18d45c, (q31_t)0x60a48c9, (q31_t)0x1b243643, + (q31_t)0x60f9e2e, (q31_t)0x1b2f971e, (q31_t)0x614f5cf, (q31_t)0x1b3af6ec, + (q31_t)0x61a4fac, (q31_t)0x1b4655ae, (q31_t)0x61fabc4, (q31_t)0x1b51b363, + (q31_t)0x6250a18, (q31_t)0x1b5d100a, (q31_t)0x62a6aa6, (q31_t)0x1b686ba3, + (q31_t)0x62fcd6f, (q31_t)0x1b73c62d, (q31_t)0x6353273, (q31_t)0x1b7f1fa9, + (q31_t)0x63a99b1, (q31_t)0x1b8a7815, (q31_t)0x6400329, (q31_t)0x1b95cf71, + (q31_t)0x6456edb, (q31_t)0x1ba125bd, (q31_t)0x64adcc7, (q31_t)0x1bac7af9, + (q31_t)0x6504ced, (q31_t)0x1bb7cf23, (q31_t)0x655bf4c, (q31_t)0x1bc3223c, + (q31_t)0x65b33e4, (q31_t)0x1bce7442, (q31_t)0x660aab5, (q31_t)0x1bd9c537, + (q31_t)0x66623be, (q31_t)0x1be51518, (q31_t)0x66b9f01, (q31_t)0x1bf063e6, + (q31_t)0x6711c7b, (q31_t)0x1bfbb1a0, (q31_t)0x6769c2e, (q31_t)0x1c06fe46, + (q31_t)0x67c1e18, (q31_t)0x1c1249d8, (q31_t)0x681a23a, (q31_t)0x1c1d9454, + (q31_t)0x6872894, (q31_t)0x1c28ddbb, (q31_t)0x68cb124, (q31_t)0x1c34260c, + (q31_t)0x6923bec, (q31_t)0x1c3f6d47, (q31_t)0x697c8eb, (q31_t)0x1c4ab36b, + (q31_t)0x69d5820, (q31_t)0x1c55f878, (q31_t)0x6a2e98b, (q31_t)0x1c613c6d, + (q31_t)0x6a87d2d, (q31_t)0x1c6c7f4a, (q31_t)0x6ae1304, (q31_t)0x1c77c10e, + (q31_t)0x6b3ab12, (q31_t)0x1c8301b9, (q31_t)0x6b94554, (q31_t)0x1c8e414b, + (q31_t)0x6bee1cd, (q31_t)0x1c997fc4, (q31_t)0x6c4807a, (q31_t)0x1ca4bd21, + (q31_t)0x6ca215c, (q31_t)0x1caff965, (q31_t)0x6cfc472, (q31_t)0x1cbb348d, + (q31_t)0x6d569be, (q31_t)0x1cc66e99, (q31_t)0x6db113d, (q31_t)0x1cd1a78a, + (q31_t)0x6e0baf0, (q31_t)0x1cdcdf5e, (q31_t)0x6e666d7, (q31_t)0x1ce81615, + (q31_t)0x6ec14f2, (q31_t)0x1cf34baf, (q31_t)0x6f1c540, (q31_t)0x1cfe802b, + (q31_t)0x6f777c1, (q31_t)0x1d09b389, (q31_t)0x6fd2c75, (q31_t)0x1d14e5c9, + (q31_t)0x702e35c, (q31_t)0x1d2016e9, (q31_t)0x7089c75, (q31_t)0x1d2b46ea, + (q31_t)0x70e57c0, (q31_t)0x1d3675cb, (q31_t)0x714153e, (q31_t)0x1d41a38c, + (q31_t)0x719d4ed, (q31_t)0x1d4cd02c, (q31_t)0x71f96ce, (q31_t)0x1d57fbaa, + (q31_t)0x7255ae0, (q31_t)0x1d632608, (q31_t)0x72b2123, (q31_t)0x1d6e4f43, + (q31_t)0x730e997, (q31_t)0x1d79775c, (q31_t)0x736b43c, (q31_t)0x1d849e51, + (q31_t)0x73c8111, (q31_t)0x1d8fc424, (q31_t)0x7425016, (q31_t)0x1d9ae8d2, + (q31_t)0x748214c, (q31_t)0x1da60c5d, (q31_t)0x74df4b1, (q31_t)0x1db12ec3, + (q31_t)0x753ca46, (q31_t)0x1dbc5004, (q31_t)0x759a20a, (q31_t)0x1dc7701f, + (q31_t)0x75f7bfe, (q31_t)0x1dd28f15, (q31_t)0x7655820, (q31_t)0x1dddace4, + (q31_t)0x76b3671, (q31_t)0x1de8c98c, (q31_t)0x77116f0, (q31_t)0x1df3e50d, + (q31_t)0x776f99d, (q31_t)0x1dfeff67, (q31_t)0x77cde79, (q31_t)0x1e0a1898, + (q31_t)0x782c582, (q31_t)0x1e1530a1, (q31_t)0x788aeb9, (q31_t)0x1e204781, + (q31_t)0x78e9a1d, (q31_t)0x1e2b5d38, (q31_t)0x79487ae, (q31_t)0x1e3671c5, + (q31_t)0x79a776c, (q31_t)0x1e418528, (q31_t)0x7a06957, (q31_t)0x1e4c9760, + (q31_t)0x7a65d6e, (q31_t)0x1e57a86d, (q31_t)0x7ac53b1, (q31_t)0x1e62b84f, + (q31_t)0x7b24c20, (q31_t)0x1e6dc705, (q31_t)0x7b846ba, (q31_t)0x1e78d48e, + (q31_t)0x7be4381, (q31_t)0x1e83e0eb, (q31_t)0x7c44272, (q31_t)0x1e8eec1b, + (q31_t)0x7ca438f, (q31_t)0x1e99f61d, (q31_t)0x7d046d6, (q31_t)0x1ea4fef0, + (q31_t)0x7d64c47, (q31_t)0x1eb00696, (q31_t)0x7dc53e3, (q31_t)0x1ebb0d0d, + (q31_t)0x7e25daa, (q31_t)0x1ec61254, (q31_t)0x7e8699a, (q31_t)0x1ed1166b, + (q31_t)0x7ee77b3, (q31_t)0x1edc1953, (q31_t)0x7f487f6, (q31_t)0x1ee71b0a, + (q31_t)0x7fa9a62, (q31_t)0x1ef21b90, (q31_t)0x800aef7, (q31_t)0x1efd1ae4, + (q31_t)0x806c5b5, (q31_t)0x1f081907, (q31_t)0x80cde9b, (q31_t)0x1f1315f7, + (q31_t)0x812f9a9, (q31_t)0x1f1e11b5, (q31_t)0x81916df, (q31_t)0x1f290c3f, + (q31_t)0x81f363d, (q31_t)0x1f340596, (q31_t)0x82557c3, (q31_t)0x1f3efdb9, + (q31_t)0x82b7b70, (q31_t)0x1f49f4a8, (q31_t)0x831a143, (q31_t)0x1f54ea62, + (q31_t)0x837c93e, (q31_t)0x1f5fdee6, (q31_t)0x83df35f, (q31_t)0x1f6ad235, + (q31_t)0x8441fa6, (q31_t)0x1f75c44e, (q31_t)0x84a4e14, (q31_t)0x1f80b531, + (q31_t)0x8507ea7, (q31_t)0x1f8ba4dc, (q31_t)0x856b160, (q31_t)0x1f969350, + (q31_t)0x85ce63e, (q31_t)0x1fa1808c, (q31_t)0x8631d42, (q31_t)0x1fac6c91, + (q31_t)0x869566a, (q31_t)0x1fb7575c, (q31_t)0x86f91b7, (q31_t)0x1fc240ef, + (q31_t)0x875cf28, (q31_t)0x1fcd2948, (q31_t)0x87c0ebd, (q31_t)0x1fd81067, + (q31_t)0x8825077, (q31_t)0x1fe2f64c, (q31_t)0x8889454, (q31_t)0x1feddaf6, + (q31_t)0x88eda54, (q31_t)0x1ff8be65, (q31_t)0x8952278, (q31_t)0x2003a099, + (q31_t)0x89b6cbf, (q31_t)0x200e8190, (q31_t)0x8a1b928, (q31_t)0x2019614c, + (q31_t)0x8a807b4, (q31_t)0x20243fca, (q31_t)0x8ae5862, (q31_t)0x202f1d0b, + (q31_t)0x8b4ab32, (q31_t)0x2039f90f, (q31_t)0x8bb0023, (q31_t)0x2044d3d4, + (q31_t)0x8c15736, (q31_t)0x204fad5b, (q31_t)0x8c7b06b, (q31_t)0x205a85a3, + (q31_t)0x8ce0bc0, (q31_t)0x20655cac, (q31_t)0x8d46936, (q31_t)0x20703275, + (q31_t)0x8dac8cd, (q31_t)0x207b06fe, (q31_t)0x8e12a84, (q31_t)0x2085da46, + (q31_t)0x8e78e5b, (q31_t)0x2090ac4d, (q31_t)0x8edf452, (q31_t)0x209b7d13, + (q31_t)0x8f45c68, (q31_t)0x20a64c97, (q31_t)0x8fac69e, (q31_t)0x20b11ad9, + (q31_t)0x90132f2, (q31_t)0x20bbe7d8, (q31_t)0x907a166, (q31_t)0x20c6b395, + (q31_t)0x90e11f7, (q31_t)0x20d17e0d, (q31_t)0x91484a8, (q31_t)0x20dc4742, + (q31_t)0x91af976, (q31_t)0x20e70f32, (q31_t)0x9217062, (q31_t)0x20f1d5de, + (q31_t)0x927e96b, (q31_t)0x20fc9b44, (q31_t)0x92e6492, (q31_t)0x21075f65, + (q31_t)0x934e1d6, (q31_t)0x21122240, (q31_t)0x93b6137, (q31_t)0x211ce3d5, + (q31_t)0x941e2b4, (q31_t)0x2127a423, (q31_t)0x948664d, (q31_t)0x21326329, + (q31_t)0x94eec03, (q31_t)0x213d20e8, (q31_t)0x95573d4, (q31_t)0x2147dd5f, + (q31_t)0x95bfdc1, (q31_t)0x2152988d, (q31_t)0x96289c9, (q31_t)0x215d5273, + (q31_t)0x96917ec, (q31_t)0x21680b0f, (q31_t)0x96fa82a, (q31_t)0x2172c262, + (q31_t)0x9763a83, (q31_t)0x217d786a, (q31_t)0x97ccef5, (q31_t)0x21882d28, + (q31_t)0x9836582, (q31_t)0x2192e09b, (q31_t)0x989fe29, (q31_t)0x219d92c2, + (q31_t)0x99098e9, (q31_t)0x21a8439e, (q31_t)0x99735c2, (q31_t)0x21b2f32e, + (q31_t)0x99dd4b4, (q31_t)0x21bda171, (q31_t)0x9a475bf, (q31_t)0x21c84e67, + (q31_t)0x9ab18e3, (q31_t)0x21d2fa0f, (q31_t)0x9b1be1e, (q31_t)0x21dda46a, + (q31_t)0x9b86572, (q31_t)0x21e84d76, (q31_t)0x9bf0edd, (q31_t)0x21f2f534, + (q31_t)0x9c5ba60, (q31_t)0x21fd9ba3, (q31_t)0x9cc67fa, (q31_t)0x220840c2, + (q31_t)0x9d317ab, (q31_t)0x2212e492, (q31_t)0x9d9c973, (q31_t)0x221d8711, + (q31_t)0x9e07d51, (q31_t)0x2228283f, (q31_t)0x9e73346, (q31_t)0x2232c81c, + (q31_t)0x9edeb50, (q31_t)0x223d66a8, (q31_t)0x9f4a570, (q31_t)0x224803e2, + (q31_t)0x9fb61a5, (q31_t)0x22529fca, (q31_t)0xa021fef, (q31_t)0x225d3a5e, + (q31_t)0xa08e04f, (q31_t)0x2267d3a0, (q31_t)0xa0fa2c3, (q31_t)0x22726b8e, + (q31_t)0xa16674b, (q31_t)0x227d0228, (q31_t)0xa1d2de7, (q31_t)0x2287976e, + (q31_t)0xa23f698, (q31_t)0x22922b5e, (q31_t)0xa2ac15b, (q31_t)0x229cbdfa, + (q31_t)0xa318e32, (q31_t)0x22a74f40, (q31_t)0xa385d1d, (q31_t)0x22b1df30, + (q31_t)0xa3f2e19, (q31_t)0x22bc6dca, (q31_t)0xa460129, (q31_t)0x22c6fb0c, + (q31_t)0xa4cd64b, (q31_t)0x22d186f8, (q31_t)0xa53ad7e, (q31_t)0x22dc118c, + (q31_t)0xa5a86c4, (q31_t)0x22e69ac8, (q31_t)0xa61621b, (q31_t)0x22f122ab, + (q31_t)0xa683f83, (q31_t)0x22fba936, (q31_t)0xa6f1efc, (q31_t)0x23062e67, + (q31_t)0xa760086, (q31_t)0x2310b23e, (q31_t)0xa7ce420, (q31_t)0x231b34bc, + (q31_t)0xa83c9ca, (q31_t)0x2325b5df, (q31_t)0xa8ab184, (q31_t)0x233035a7, + (q31_t)0xa919b4e, (q31_t)0x233ab414, (q31_t)0xa988727, (q31_t)0x23453125, + (q31_t)0xa9f750f, (q31_t)0x234facda, (q31_t)0xaa66506, (q31_t)0x235a2733, + (q31_t)0xaad570c, (q31_t)0x2364a02e, (q31_t)0xab44b1f, (q31_t)0x236f17cc, + (q31_t)0xabb4141, (q31_t)0x23798e0d, (q31_t)0xac23971, (q31_t)0x238402ef, + (q31_t)0xac933ae, (q31_t)0x238e7673, (q31_t)0xad02ff8, (q31_t)0x2398e898, + (q31_t)0xad72e4f, (q31_t)0x23a3595e, (q31_t)0xade2eb3, (q31_t)0x23adc8c4, + (q31_t)0xae53123, (q31_t)0x23b836ca, (q31_t)0xaec35a0, (q31_t)0x23c2a36f, + (q31_t)0xaf33c28, (q31_t)0x23cd0eb3, (q31_t)0xafa44bc, (q31_t)0x23d77896, + (q31_t)0xb014f5b, (q31_t)0x23e1e117, (q31_t)0xb085c05, (q31_t)0x23ec4837, + (q31_t)0xb0f6aba, (q31_t)0x23f6adf3, (q31_t)0xb167b79, (q31_t)0x2401124d, + (q31_t)0xb1d8e43, (q31_t)0x240b7543, (q31_t)0xb24a316, (q31_t)0x2415d6d5, + (q31_t)0xb2bb9f4, (q31_t)0x24203704, (q31_t)0xb32d2da, (q31_t)0x242a95ce, + (q31_t)0xb39edca, (q31_t)0x2434f332, (q31_t)0xb410ac3, (q31_t)0x243f4f32, + (q31_t)0xb4829c4, (q31_t)0x2449a9cc, (q31_t)0xb4f4acd, (q31_t)0x245402ff, + (q31_t)0xb566ddf, (q31_t)0x245e5acc, (q31_t)0xb5d92f8, (q31_t)0x2468b132, + (q31_t)0xb64ba19, (q31_t)0x24730631, (q31_t)0xb6be341, (q31_t)0x247d59c8, + (q31_t)0xb730e70, (q31_t)0x2487abf7, (q31_t)0xb7a3ba5, (q31_t)0x2491fcbe, + (q31_t)0xb816ae1, (q31_t)0x249c4c1b, (q31_t)0xb889c23, (q31_t)0x24a69a0f, + (q31_t)0xb8fcf6b, (q31_t)0x24b0e699, (q31_t)0xb9704b9, (q31_t)0x24bb31ba, + (q31_t)0xb9e3c0b, (q31_t)0x24c57b6f, (q31_t)0xba57563, (q31_t)0x24cfc3ba, + (q31_t)0xbacb0bf, (q31_t)0x24da0a9a, (q31_t)0xbb3ee20, (q31_t)0x24e4500e, + (q31_t)0xbbb2d85, (q31_t)0x24ee9415, (q31_t)0xbc26eee, (q31_t)0x24f8d6b0, + (q31_t)0xbc9b25a, (q31_t)0x250317df, (q31_t)0xbd0f7ca, (q31_t)0x250d57a0, + (q31_t)0xbd83f3d, (q31_t)0x251795f3, (q31_t)0xbdf88b3, (q31_t)0x2521d2d8, + (q31_t)0xbe6d42b, (q31_t)0x252c0e4f, (q31_t)0xbee21a5, (q31_t)0x25364857, + (q31_t)0xbf57121, (q31_t)0x254080ef, (q31_t)0xbfcc29f, (q31_t)0x254ab818, + (q31_t)0xc04161e, (q31_t)0x2554edd1, (q31_t)0xc0b6b9e, (q31_t)0x255f2219, + (q31_t)0xc12c31f, (q31_t)0x256954f1, (q31_t)0xc1a1ca0, (q31_t)0x25738657, + (q31_t)0xc217822, (q31_t)0x257db64c, (q31_t)0xc28d5a3, (q31_t)0x2587e4cf, + (q31_t)0xc303524, (q31_t)0x259211df, (q31_t)0xc3796a5, (q31_t)0x259c3d7c, + (q31_t)0xc3efa25, (q31_t)0x25a667a7, (q31_t)0xc465fa3, (q31_t)0x25b0905d, + (q31_t)0xc4dc720, (q31_t)0x25bab7a0, (q31_t)0xc55309b, (q31_t)0x25c4dd6e, + (q31_t)0xc5c9c14, (q31_t)0x25cf01c8, (q31_t)0xc64098b, (q31_t)0x25d924ac, + (q31_t)0xc6b78ff, (q31_t)0x25e3461b, (q31_t)0xc72ea70, (q31_t)0x25ed6614, + (q31_t)0xc7a5dde, (q31_t)0x25f78497, (q31_t)0xc81d349, (q31_t)0x2601a1a2, + (q31_t)0xc894aaf, (q31_t)0x260bbd37, (q31_t)0xc90c412, (q31_t)0x2615d754, + (q31_t)0xc983f70, (q31_t)0x261feffa, (q31_t)0xc9fbcca, (q31_t)0x262a0727, + (q31_t)0xca73c1e, (q31_t)0x26341cdb, (q31_t)0xcaebd6e, (q31_t)0x263e3117, + (q31_t)0xcb640b8, (q31_t)0x264843d9, (q31_t)0xcbdc5fc, (q31_t)0x26525521, + (q31_t)0xcc54d3a, (q31_t)0x265c64ef, (q31_t)0xcccd671, (q31_t)0x26667342, + (q31_t)0xcd461a2, (q31_t)0x2670801a, (q31_t)0xcdbeecc, (q31_t)0x267a8b77, + (q31_t)0xce37def, (q31_t)0x26849558, (q31_t)0xceb0f0a, (q31_t)0x268e9dbd, + (q31_t)0xcf2a21d, (q31_t)0x2698a4a6, (q31_t)0xcfa3729, (q31_t)0x26a2aa11, + (q31_t)0xd01ce2b, (q31_t)0x26acadff, (q31_t)0xd096725, (q31_t)0x26b6b070, + (q31_t)0xd110216, (q31_t)0x26c0b162, (q31_t)0xd189efe, (q31_t)0x26cab0d6, + (q31_t)0xd203ddc, (q31_t)0x26d4aecb, (q31_t)0xd27deb0, (q31_t)0x26deab41, + (q31_t)0xd2f817b, (q31_t)0x26e8a637, (q31_t)0xd37263a, (q31_t)0x26f29fad, + (q31_t)0xd3eccef, (q31_t)0x26fc97a3, (q31_t)0xd467599, (q31_t)0x27068e18, + (q31_t)0xd4e2037, (q31_t)0x2710830c, (q31_t)0xd55ccca, (q31_t)0x271a767e, + (q31_t)0xd5d7b50, (q31_t)0x2724686e, (q31_t)0xd652bcb, (q31_t)0x272e58dc, + (q31_t)0xd6cde39, (q31_t)0x273847c8, (q31_t)0xd74929a, (q31_t)0x27423530, + (q31_t)0xd7c48ee, (q31_t)0x274c2115, (q31_t)0xd840134, (q31_t)0x27560b76, + (q31_t)0xd8bbb6d, (q31_t)0x275ff452, (q31_t)0xd937798, (q31_t)0x2769dbaa, + (q31_t)0xd9b35b4, (q31_t)0x2773c17d, (q31_t)0xda2f5c2, (q31_t)0x277da5cb, + (q31_t)0xdaab7c0, (q31_t)0x27878893, (q31_t)0xdb27bb0, (q31_t)0x279169d5, + (q31_t)0xdba4190, (q31_t)0x279b4990, (q31_t)0xdc20960, (q31_t)0x27a527c4, + (q31_t)0xdc9d320, (q31_t)0x27af0472, (q31_t)0xdd19ed0, (q31_t)0x27b8df97, + (q31_t)0xdd96c6f, (q31_t)0x27c2b934, (q31_t)0xde13bfd, (q31_t)0x27cc9149, + (q31_t)0xde90d79, (q31_t)0x27d667d5, (q31_t)0xdf0e0e4, (q31_t)0x27e03cd8, + (q31_t)0xdf8b63d, (q31_t)0x27ea1052, (q31_t)0xe008d84, (q31_t)0x27f3e241, + (q31_t)0xe0866b8, (q31_t)0x27fdb2a7, (q31_t)0xe1041d9, (q31_t)0x28078181, + (q31_t)0xe181ee8, (q31_t)0x28114ed0, (q31_t)0xe1ffde2, (q31_t)0x281b1a94, + (q31_t)0xe27dec9, (q31_t)0x2824e4cc, (q31_t)0xe2fc19c, (q31_t)0x282ead78, + (q31_t)0xe37a65b, (q31_t)0x28387498, (q31_t)0xe3f8d05, (q31_t)0x28423a2a, + (q31_t)0xe47759a, (q31_t)0x284bfe2f, (q31_t)0xe4f6019, (q31_t)0x2855c0a6, + (q31_t)0xe574c84, (q31_t)0x285f8190, (q31_t)0xe5f3ad8, (q31_t)0x286940ea, + (q31_t)0xe672b16, (q31_t)0x2872feb6, (q31_t)0xe6f1d3d, (q31_t)0x287cbaf3, + (q31_t)0xe77114e, (q31_t)0x288675a0, (q31_t)0xe7f0748, (q31_t)0x28902ebd, + (q31_t)0xe86ff2a, (q31_t)0x2899e64a, (q31_t)0xe8ef8f4, (q31_t)0x28a39c46, + (q31_t)0xe96f4a7, (q31_t)0x28ad50b1, (q31_t)0xe9ef241, (q31_t)0x28b7038b, + (q31_t)0xea6f1c2, (q31_t)0x28c0b4d2, (q31_t)0xeaef32b, (q31_t)0x28ca6488, + (q31_t)0xeb6f67a, (q31_t)0x28d412ab, (q31_t)0xebefbb0, (q31_t)0x28ddbf3b, + (q31_t)0xec702cb, (q31_t)0x28e76a37, (q31_t)0xecf0bcd, (q31_t)0x28f113a0, + (q31_t)0xed716b4, (q31_t)0x28fabb75, (q31_t)0xedf2380, (q31_t)0x290461b5, + (q31_t)0xee73231, (q31_t)0x290e0661, (q31_t)0xeef42c7, (q31_t)0x2917a977, + (q31_t)0xef75541, (q31_t)0x29214af8, (q31_t)0xeff699f, (q31_t)0x292aeae3, + (q31_t)0xf077fe1, (q31_t)0x29348937, (q31_t)0xf0f9805, (q31_t)0x293e25f5, + (q31_t)0xf17b20d, (q31_t)0x2947c11c, (q31_t)0xf1fcdf8, (q31_t)0x29515aab, + (q31_t)0xf27ebc5, (q31_t)0x295af2a3, (q31_t)0xf300b74, (q31_t)0x29648902, + (q31_t)0xf382d05, (q31_t)0x296e1dc9, (q31_t)0xf405077, (q31_t)0x2977b0f7, + (q31_t)0xf4875ca, (q31_t)0x2981428c, (q31_t)0xf509cfe, (q31_t)0x298ad287, + (q31_t)0xf58c613, (q31_t)0x299460e8, (q31_t)0xf60f108, (q31_t)0x299dedaf, + (q31_t)0xf691ddd, (q31_t)0x29a778db, (q31_t)0xf714c91, (q31_t)0x29b1026c, + (q31_t)0xf797d24, (q31_t)0x29ba8a61, (q31_t)0xf81af97, (q31_t)0x29c410ba, + (q31_t)0xf89e3e8, (q31_t)0x29cd9578, (q31_t)0xf921a17, (q31_t)0x29d71899, + (q31_t)0xf9a5225, (q31_t)0x29e09a1c, (q31_t)0xfa28c10, (q31_t)0x29ea1a03, + (q31_t)0xfaac7d8, (q31_t)0x29f3984c, (q31_t)0xfb3057d, (q31_t)0x29fd14f6, + (q31_t)0xfbb4500, (q31_t)0x2a069003, (q31_t)0xfc3865e, (q31_t)0x2a100970, + (q31_t)0xfcbc999, (q31_t)0x2a19813f, (q31_t)0xfd40eaf, (q31_t)0x2a22f76e, + (q31_t)0xfdc55a1, (q31_t)0x2a2c6bfd, (q31_t)0xfe49e6d, (q31_t)0x2a35deeb, + (q31_t)0xfece915, (q31_t)0x2a3f503a, (q31_t)0xff53597, (q31_t)0x2a48bfe7, + (q31_t)0xffd83f4, (q31_t)0x2a522df3, (q31_t)0x1005d42a, (q31_t)0x2a5b9a5d, + (q31_t)0x100e2639, (q31_t)0x2a650525, (q31_t)0x10167a22, (q31_t)0x2a6e6e4b, + (q31_t)0x101ecfe4, (q31_t)0x2a77d5ce, (q31_t)0x1027277e, (q31_t)0x2a813bae, + (q31_t)0x102f80f1, (q31_t)0x2a8a9fea, (q31_t)0x1037dc3b, (q31_t)0x2a940283, + (q31_t)0x1040395d, (q31_t)0x2a9d6377, (q31_t)0x10489856, (q31_t)0x2aa6c2c6, + (q31_t)0x1050f926, (q31_t)0x2ab02071, (q31_t)0x10595bcd, (q31_t)0x2ab97c77, + (q31_t)0x1061c04a, (q31_t)0x2ac2d6d6, (q31_t)0x106a269d, (q31_t)0x2acc2f90, + (q31_t)0x10728ec6, (q31_t)0x2ad586a3, (q31_t)0x107af8c4, (q31_t)0x2adedc10, + (q31_t)0x10836497, (q31_t)0x2ae82fd5, (q31_t)0x108bd23f, (q31_t)0x2af181f3, + (q31_t)0x109441bb, (q31_t)0x2afad269, (q31_t)0x109cb30b, (q31_t)0x2b042137, + (q31_t)0x10a5262f, (q31_t)0x2b0d6e5c, (q31_t)0x10ad9b26, (q31_t)0x2b16b9d9, + (q31_t)0x10b611f1, (q31_t)0x2b2003ac, (q31_t)0x10be8a8d, (q31_t)0x2b294bd5, + (q31_t)0x10c704fd, (q31_t)0x2b329255, (q31_t)0x10cf813e, (q31_t)0x2b3bd72a, + (q31_t)0x10d7ff51, (q31_t)0x2b451a55, (q31_t)0x10e07f36, (q31_t)0x2b4e5bd4, + (q31_t)0x10e900ec, (q31_t)0x2b579ba8, (q31_t)0x10f18472, (q31_t)0x2b60d9d0, + (q31_t)0x10fa09c9, (q31_t)0x2b6a164d, (q31_t)0x110290f0, (q31_t)0x2b73511c, + (q31_t)0x110b19e7, (q31_t)0x2b7c8a3f, (q31_t)0x1113a4ad, (q31_t)0x2b85c1b5, + (q31_t)0x111c3142, (q31_t)0x2b8ef77d, (q31_t)0x1124bfa6, (q31_t)0x2b982b97, + (q31_t)0x112d4fd9, (q31_t)0x2ba15e03, (q31_t)0x1135e1d9, (q31_t)0x2baa8ec0, + (q31_t)0x113e75a8, (q31_t)0x2bb3bdce, (q31_t)0x11470b44, (q31_t)0x2bbceb2d, + (q31_t)0x114fa2ad, (q31_t)0x2bc616dd, (q31_t)0x11583be2, (q31_t)0x2bcf40dc, + (q31_t)0x1160d6e5, (q31_t)0x2bd8692b, (q31_t)0x116973b3, (q31_t)0x2be18fc9, + (q31_t)0x1172124d, (q31_t)0x2beab4b6, (q31_t)0x117ab2b3, (q31_t)0x2bf3d7f2, + (q31_t)0x118354e4, (q31_t)0x2bfcf97c, (q31_t)0x118bf8e0, (q31_t)0x2c061953, + (q31_t)0x11949ea6, (q31_t)0x2c0f3779, (q31_t)0x119d4636, (q31_t)0x2c1853eb, + (q31_t)0x11a5ef90, (q31_t)0x2c216eaa, (q31_t)0x11ae9ab4, (q31_t)0x2c2a87b6, + (q31_t)0x11b747a0, (q31_t)0x2c339f0e, (q31_t)0x11bff656, (q31_t)0x2c3cb4b1, + (q31_t)0x11c8a6d4, (q31_t)0x2c45c8a0, (q31_t)0x11d1591a, (q31_t)0x2c4edada, + (q31_t)0x11da0d28, (q31_t)0x2c57eb5e, (q31_t)0x11e2c2fd, (q31_t)0x2c60fa2d, + (q31_t)0x11eb7a9a, (q31_t)0x2c6a0746, (q31_t)0x11f433fd, (q31_t)0x2c7312a9, + (q31_t)0x11fcef27, (q31_t)0x2c7c1c55, (q31_t)0x1205ac17, (q31_t)0x2c85244a, + (q31_t)0x120e6acc, (q31_t)0x2c8e2a87, (q31_t)0x12172b48, (q31_t)0x2c972f0d, + (q31_t)0x121fed88, (q31_t)0x2ca031da, (q31_t)0x1228b18d, (q31_t)0x2ca932ef, + (q31_t)0x12317756, (q31_t)0x2cb2324c, (q31_t)0x123a3ee4, (q31_t)0x2cbb2fef, + (q31_t)0x12430835, (q31_t)0x2cc42bd9, (q31_t)0x124bd34a, (q31_t)0x2ccd2609, + (q31_t)0x1254a021, (q31_t)0x2cd61e7f, (q31_t)0x125d6ebc, (q31_t)0x2cdf153a, + (q31_t)0x12663f19, (q31_t)0x2ce80a3a, (q31_t)0x126f1138, (q31_t)0x2cf0fd80, + (q31_t)0x1277e518, (q31_t)0x2cf9ef09, (q31_t)0x1280babb, (q31_t)0x2d02ded7, + (q31_t)0x1289921e, (q31_t)0x2d0bcce8, (q31_t)0x12926b41, (q31_t)0x2d14b93d, + (q31_t)0x129b4626, (q31_t)0x2d1da3d5, (q31_t)0x12a422ca, (q31_t)0x2d268cb0, + (q31_t)0x12ad012e, (q31_t)0x2d2f73cd, (q31_t)0x12b5e151, (q31_t)0x2d38592c, + (q31_t)0x12bec333, (q31_t)0x2d413ccd, (q31_t)0x12c7a6d4, (q31_t)0x2d4a1eaf, + (q31_t)0x12d08c33, (q31_t)0x2d52fed2, (q31_t)0x12d97350, (q31_t)0x2d5bdd36, + (q31_t)0x12e25c2b, (q31_t)0x2d64b9da, (q31_t)0x12eb46c3, (q31_t)0x2d6d94bf, + (q31_t)0x12f43318, (q31_t)0x2d766de2, (q31_t)0x12fd2129, (q31_t)0x2d7f4545, + (q31_t)0x130610f7, (q31_t)0x2d881ae8, (q31_t)0x130f0280, (q31_t)0x2d90eec8, + (q31_t)0x1317f5c6, (q31_t)0x2d99c0e7, (q31_t)0x1320eac6, (q31_t)0x2da29144, + (q31_t)0x1329e181, (q31_t)0x2dab5fdf, (q31_t)0x1332d9f7, (q31_t)0x2db42cb6, + (q31_t)0x133bd427, (q31_t)0x2dbcf7cb, (q31_t)0x1344d011, (q31_t)0x2dc5c11c, + (q31_t)0x134dcdb4, (q31_t)0x2dce88aa, (q31_t)0x1356cd11, (q31_t)0x2dd74e73, + (q31_t)0x135fce26, (q31_t)0x2de01278, (q31_t)0x1368d0f3, (q31_t)0x2de8d4b8, + (q31_t)0x1371d579, (q31_t)0x2df19534, (q31_t)0x137adbb6, (q31_t)0x2dfa53e9, + (q31_t)0x1383e3ab, (q31_t)0x2e0310d9, (q31_t)0x138ced57, (q31_t)0x2e0bcc03, + (q31_t)0x1395f8ba, (q31_t)0x2e148566, (q31_t)0x139f05d3, (q31_t)0x2e1d3d03, + (q31_t)0x13a814a2, (q31_t)0x2e25f2d8, (q31_t)0x13b12526, (q31_t)0x2e2ea6e6, + (q31_t)0x13ba3760, (q31_t)0x2e37592c, (q31_t)0x13c34b4f, (q31_t)0x2e4009aa, + (q31_t)0x13cc60f2, (q31_t)0x2e48b860, (q31_t)0x13d5784a, (q31_t)0x2e51654c, + (q31_t)0x13de9156, (q31_t)0x2e5a1070, (q31_t)0x13e7ac15, (q31_t)0x2e62b9ca, + (q31_t)0x13f0c887, (q31_t)0x2e6b615a, (q31_t)0x13f9e6ad, (q31_t)0x2e740720, + (q31_t)0x14030684, (q31_t)0x2e7cab1c, (q31_t)0x140c280e, (q31_t)0x2e854d4d, + (q31_t)0x14154b4a, (q31_t)0x2e8dedb3, (q31_t)0x141e7037, (q31_t)0x2e968c4d, + (q31_t)0x142796d5, (q31_t)0x2e9f291b, (q31_t)0x1430bf24, (q31_t)0x2ea7c41e, + (q31_t)0x1439e923, (q31_t)0x2eb05d53, (q31_t)0x144314d3, (q31_t)0x2eb8f4bc, + (q31_t)0x144c4232, (q31_t)0x2ec18a58, (q31_t)0x14557140, (q31_t)0x2eca1e27, + (q31_t)0x145ea1fd, (q31_t)0x2ed2b027, (q31_t)0x1467d469, (q31_t)0x2edb405a, + (q31_t)0x14710883, (q31_t)0x2ee3cebe, (q31_t)0x147a3e4b, (q31_t)0x2eec5b53, + (q31_t)0x148375c1, (q31_t)0x2ef4e619, (q31_t)0x148caee4, (q31_t)0x2efd6f10, + (q31_t)0x1495e9b3, (q31_t)0x2f05f637, (q31_t)0x149f2630, (q31_t)0x2f0e7b8e, + (q31_t)0x14a86458, (q31_t)0x2f16ff14, (q31_t)0x14b1a42c, (q31_t)0x2f1f80ca, + (q31_t)0x14bae5ab, (q31_t)0x2f2800af, (q31_t)0x14c428d6, (q31_t)0x2f307ec2, + (q31_t)0x14cd6dab, (q31_t)0x2f38fb03, (q31_t)0x14d6b42b, (q31_t)0x2f417573, + (q31_t)0x14dffc54, (q31_t)0x2f49ee0f, (q31_t)0x14e94627, (q31_t)0x2f5264da, + (q31_t)0x14f291a4, (q31_t)0x2f5ad9d1, (q31_t)0x14fbdec9, (q31_t)0x2f634cf5, + (q31_t)0x15052d97, (q31_t)0x2f6bbe45, (q31_t)0x150e7e0d, (q31_t)0x2f742dc1, + (q31_t)0x1517d02b, (q31_t)0x2f7c9b69, (q31_t)0x152123f0, (q31_t)0x2f85073c, + (q31_t)0x152a795d, (q31_t)0x2f8d713a, (q31_t)0x1533d070, (q31_t)0x2f95d963, + (q31_t)0x153d292a, (q31_t)0x2f9e3fb6, (q31_t)0x15468389, (q31_t)0x2fa6a433, + (q31_t)0x154fdf8f, (q31_t)0x2faf06da, (q31_t)0x15593d3a, (q31_t)0x2fb767aa, + (q31_t)0x15629c89, (q31_t)0x2fbfc6a3, (q31_t)0x156bfd7d, (q31_t)0x2fc823c5, + (q31_t)0x15756016, (q31_t)0x2fd07f0f, (q31_t)0x157ec452, (q31_t)0x2fd8d882, + (q31_t)0x15882a32, (q31_t)0x2fe1301c, (q31_t)0x159191b5, (q31_t)0x2fe985de, + (q31_t)0x159afadb, (q31_t)0x2ff1d9c7, (q31_t)0x15a465a3, (q31_t)0x2ffa2bd6, + (q31_t)0x15add20d, (q31_t)0x30027c0c, (q31_t)0x15b74019, (q31_t)0x300aca69, + (q31_t)0x15c0afc6, (q31_t)0x301316eb, (q31_t)0x15ca2115, (q31_t)0x301b6193, + (q31_t)0x15d39403, (q31_t)0x3023aa5f, (q31_t)0x15dd0892, (q31_t)0x302bf151, + (q31_t)0x15e67ec1, (q31_t)0x30343667, (q31_t)0x15eff690, (q31_t)0x303c79a2, + (q31_t)0x15f96ffd, (q31_t)0x3044bb00, (q31_t)0x1602eb0a, (q31_t)0x304cfa83, + (q31_t)0x160c67b4, (q31_t)0x30553828, (q31_t)0x1615e5fd, (q31_t)0x305d73f0, + (q31_t)0x161f65e4, (q31_t)0x3065addb, (q31_t)0x1628e767, (q31_t)0x306de5e9, + (q31_t)0x16326a88, (q31_t)0x30761c18, (q31_t)0x163bef46, (q31_t)0x307e5069, + (q31_t)0x1645759f, (q31_t)0x308682dc, (q31_t)0x164efd94, (q31_t)0x308eb36f, + (q31_t)0x16588725, (q31_t)0x3096e223, (q31_t)0x16621251, (q31_t)0x309f0ef8, + (q31_t)0x166b9f18, (q31_t)0x30a739ed, (q31_t)0x16752d79, (q31_t)0x30af6302, + (q31_t)0x167ebd74, (q31_t)0x30b78a36, (q31_t)0x16884f09, (q31_t)0x30bfaf89, + (q31_t)0x1691e237, (q31_t)0x30c7d2fb, (q31_t)0x169b76fe, (q31_t)0x30cff48c, + (q31_t)0x16a50d5d, (q31_t)0x30d8143b, (q31_t)0x16aea555, (q31_t)0x30e03208, + (q31_t)0x16b83ee4, (q31_t)0x30e84df3, (q31_t)0x16c1da0b, (q31_t)0x30f067fb, + (q31_t)0x16cb76c9, (q31_t)0x30f8801f, (q31_t)0x16d5151d, (q31_t)0x31009661, + (q31_t)0x16deb508, (q31_t)0x3108aabf, (q31_t)0x16e85689, (q31_t)0x3110bd39, + (q31_t)0x16f1f99f, (q31_t)0x3118cdcf, (q31_t)0x16fb9e4b, (q31_t)0x3120dc80, + (q31_t)0x1705448b, (q31_t)0x3128e94c, (q31_t)0x170eec60, (q31_t)0x3130f433, + (q31_t)0x171895c9, (q31_t)0x3138fd35, (q31_t)0x172240c5, (q31_t)0x31410450, + (q31_t)0x172bed55, (q31_t)0x31490986, (q31_t)0x17359b78, (q31_t)0x31510cd5, + (q31_t)0x173f4b2e, (q31_t)0x31590e3e, (q31_t)0x1748fc75, (q31_t)0x31610dbf, + (q31_t)0x1752af4f, (q31_t)0x31690b59, (q31_t)0x175c63ba, (q31_t)0x3171070c, + (q31_t)0x176619b6, (q31_t)0x317900d6, (q31_t)0x176fd143, (q31_t)0x3180f8b8, + (q31_t)0x17798a60, (q31_t)0x3188eeb2, (q31_t)0x1783450d, (q31_t)0x3190e2c3, + (q31_t)0x178d014a, (q31_t)0x3198d4ea, (q31_t)0x1796bf16, (q31_t)0x31a0c528, + (q31_t)0x17a07e70, (q31_t)0x31a8b37c, (q31_t)0x17aa3f5a, (q31_t)0x31b09fe7, + (q31_t)0x17b401d1, (q31_t)0x31b88a66, (q31_t)0x17bdc5d6, (q31_t)0x31c072fb, + (q31_t)0x17c78b68, (q31_t)0x31c859a5, (q31_t)0x17d15288, (q31_t)0x31d03e64, + (q31_t)0x17db1b34, (q31_t)0x31d82137, (q31_t)0x17e4e56c, (q31_t)0x31e0021e, + (q31_t)0x17eeb130, (q31_t)0x31e7e118, (q31_t)0x17f87e7f, (q31_t)0x31efbe27, + (q31_t)0x18024d59, (q31_t)0x31f79948, (q31_t)0x180c1dbf, (q31_t)0x31ff727c, + (q31_t)0x1815efae, (q31_t)0x320749c3, (q31_t)0x181fc328, (q31_t)0x320f1f1c, + (q31_t)0x1829982b, (q31_t)0x3216f287, (q31_t)0x18336eb7, (q31_t)0x321ec403, + (q31_t)0x183d46cc, (q31_t)0x32269391, (q31_t)0x18472069, (q31_t)0x322e6130, + (q31_t)0x1850fb8e, (q31_t)0x32362ce0, (q31_t)0x185ad83c, (q31_t)0x323df6a0, + (q31_t)0x1864b670, (q31_t)0x3245be70, (q31_t)0x186e962b, (q31_t)0x324d8450, + (q31_t)0x1878776d, (q31_t)0x32554840, (q31_t)0x18825a35, (q31_t)0x325d0a3e, + (q31_t)0x188c3e83, (q31_t)0x3264ca4c, (q31_t)0x18962456, (q31_t)0x326c8868, + (q31_t)0x18a00bae, (q31_t)0x32744493, (q31_t)0x18a9f48a, (q31_t)0x327bfecc, + (q31_t)0x18b3deeb, (q31_t)0x3283b712, (q31_t)0x18bdcad0, (q31_t)0x328b6d66, + (q31_t)0x18c7b838, (q31_t)0x329321c7, (q31_t)0x18d1a724, (q31_t)0x329ad435, + (q31_t)0x18db9792, (q31_t)0x32a284b0, (q31_t)0x18e58982, (q31_t)0x32aa3336, + (q31_t)0x18ef7cf4, (q31_t)0x32b1dfc9, (q31_t)0x18f971e8, (q31_t)0x32b98a67, + (q31_t)0x1903685d, (q31_t)0x32c13311, (q31_t)0x190d6053, (q31_t)0x32c8d9c6, + (q31_t)0x191759c9, (q31_t)0x32d07e85, (q31_t)0x192154bf, (q31_t)0x32d82150, + (q31_t)0x192b5135, (q31_t)0x32dfc224, (q31_t)0x19354f2a, (q31_t)0x32e76102, + (q31_t)0x193f4e9e, (q31_t)0x32eefdea, (q31_t)0x19494f90, (q31_t)0x32f698db, + (q31_t)0x19535201, (q31_t)0x32fe31d5, (q31_t)0x195d55ef, (q31_t)0x3305c8d7, + (q31_t)0x19675b5a, (q31_t)0x330d5de3, (q31_t)0x19716243, (q31_t)0x3314f0f6, + (q31_t)0x197b6aa8, (q31_t)0x331c8211, (q31_t)0x19857489, (q31_t)0x33241134, + (q31_t)0x198f7fe6, (q31_t)0x332b9e5e, (q31_t)0x19998cbe, (q31_t)0x3333298f, + (q31_t)0x19a39b11, (q31_t)0x333ab2c6, (q31_t)0x19adaadf, (q31_t)0x33423a04, + (q31_t)0x19b7bc27, (q31_t)0x3349bf48, (q31_t)0x19c1cee9, (q31_t)0x33514292, + (q31_t)0x19cbe325, (q31_t)0x3358c3e2, (q31_t)0x19d5f8d9, (q31_t)0x33604336, + (q31_t)0x19e01006, (q31_t)0x3367c090, (q31_t)0x19ea28ac, (q31_t)0x336f3bee, + (q31_t)0x19f442c9, (q31_t)0x3376b551, (q31_t)0x19fe5e5e, (q31_t)0x337e2cb7, + (q31_t)0x1a087b69, (q31_t)0x3385a222, (q31_t)0x1a1299ec, (q31_t)0x338d1590, + (q31_t)0x1a1cb9e5, (q31_t)0x33948701, (q31_t)0x1a26db54, (q31_t)0x339bf675, + (q31_t)0x1a30fe38, (q31_t)0x33a363ec, (q31_t)0x1a3b2292, (q31_t)0x33aacf65, + (q31_t)0x1a454860, (q31_t)0x33b238e0, (q31_t)0x1a4f6fa3, (q31_t)0x33b9a05d, + (q31_t)0x1a599859, (q31_t)0x33c105db, (q31_t)0x1a63c284, (q31_t)0x33c8695b, + (q31_t)0x1a6dee21, (q31_t)0x33cfcadc, (q31_t)0x1a781b31, (q31_t)0x33d72a5d, + (q31_t)0x1a8249b4, (q31_t)0x33de87de, (q31_t)0x1a8c79a9, (q31_t)0x33e5e360, + (q31_t)0x1a96ab0f, (q31_t)0x33ed3ce1, (q31_t)0x1aa0dde7, (q31_t)0x33f49462, + (q31_t)0x1aab122f, (q31_t)0x33fbe9e2, (q31_t)0x1ab547e8, (q31_t)0x34033d61, + (q31_t)0x1abf7f11, (q31_t)0x340a8edf, (q31_t)0x1ac9b7a9, (q31_t)0x3411de5b, + (q31_t)0x1ad3f1b1, (q31_t)0x34192bd5, (q31_t)0x1ade2d28, (q31_t)0x3420774d, + (q31_t)0x1ae86a0d, (q31_t)0x3427c0c3, (q31_t)0x1af2a860, (q31_t)0x342f0836, + (q31_t)0x1afce821, (q31_t)0x34364da6, (q31_t)0x1b072950, (q31_t)0x343d9112, + (q31_t)0x1b116beb, (q31_t)0x3444d27b, (q31_t)0x1b1baff2, (q31_t)0x344c11e0, + (q31_t)0x1b25f566, (q31_t)0x34534f41, (q31_t)0x1b303c46, (q31_t)0x345a8a9d, + (q31_t)0x1b3a8491, (q31_t)0x3461c3f5, (q31_t)0x1b44ce46, (q31_t)0x3468fb47, + (q31_t)0x1b4f1967, (q31_t)0x34703095, (q31_t)0x1b5965f1, (q31_t)0x347763dd, + (q31_t)0x1b63b3e5, (q31_t)0x347e951f, (q31_t)0x1b6e0342, (q31_t)0x3485c45b, + (q31_t)0x1b785409, (q31_t)0x348cf190, (q31_t)0x1b82a638, (q31_t)0x34941cbf, + (q31_t)0x1b8cf9cf, (q31_t)0x349b45e7, (q31_t)0x1b974ece, (q31_t)0x34a26d08, + (q31_t)0x1ba1a534, (q31_t)0x34a99221, (q31_t)0x1babfd01, (q31_t)0x34b0b533, + (q31_t)0x1bb65634, (q31_t)0x34b7d63c, (q31_t)0x1bc0b0ce, (q31_t)0x34bef53d, + (q31_t)0x1bcb0cce, (q31_t)0x34c61236, (q31_t)0x1bd56a32, (q31_t)0x34cd2d26, + (q31_t)0x1bdfc8fc, (q31_t)0x34d4460c, (q31_t)0x1bea292b, (q31_t)0x34db5cea, + (q31_t)0x1bf48abd, (q31_t)0x34e271bd, (q31_t)0x1bfeedb3, (q31_t)0x34e98487, + (q31_t)0x1c09520d, (q31_t)0x34f09546, (q31_t)0x1c13b7c9, (q31_t)0x34f7a3fb, + (q31_t)0x1c1e1ee9, (q31_t)0x34feb0a5, (q31_t)0x1c28876a, (q31_t)0x3505bb44, + (q31_t)0x1c32f14d, (q31_t)0x350cc3d8, (q31_t)0x1c3d5c91, (q31_t)0x3513ca60, + (q31_t)0x1c47c936, (q31_t)0x351acedd, (q31_t)0x1c52373c, (q31_t)0x3521d14d, + (q31_t)0x1c5ca6a2, (q31_t)0x3528d1b1, (q31_t)0x1c671768, (q31_t)0x352fd008, + (q31_t)0x1c71898d, (q31_t)0x3536cc52, (q31_t)0x1c7bfd11, (q31_t)0x353dc68f, + (q31_t)0x1c8671f3, (q31_t)0x3544bebf, (q31_t)0x1c90e834, (q31_t)0x354bb4e1, + (q31_t)0x1c9b5fd2, (q31_t)0x3552a8f4, (q31_t)0x1ca5d8cd, (q31_t)0x35599afa, + (q31_t)0x1cb05326, (q31_t)0x35608af1, (q31_t)0x1cbacedb, (q31_t)0x356778d9, + (q31_t)0x1cc54bec, (q31_t)0x356e64b2, (q31_t)0x1ccfca59, (q31_t)0x35754e7c, + (q31_t)0x1cda4a21, (q31_t)0x357c3636, (q31_t)0x1ce4cb44, (q31_t)0x35831be0, + (q31_t)0x1cef4dc2, (q31_t)0x3589ff7a, (q31_t)0x1cf9d199, (q31_t)0x3590e104, + (q31_t)0x1d0456ca, (q31_t)0x3597c07d, (q31_t)0x1d0edd55, (q31_t)0x359e9de5, + (q31_t)0x1d196538, (q31_t)0x35a5793c, (q31_t)0x1d23ee74, (q31_t)0x35ac5282, + (q31_t)0x1d2e7908, (q31_t)0x35b329b5, (q31_t)0x1d3904f4, (q31_t)0x35b9fed7, + (q31_t)0x1d439236, (q31_t)0x35c0d1e7, (q31_t)0x1d4e20d0, (q31_t)0x35c7a2e3, + (q31_t)0x1d58b0c0, (q31_t)0x35ce71ce, (q31_t)0x1d634206, (q31_t)0x35d53ea5, + (q31_t)0x1d6dd4a2, (q31_t)0x35dc0968, (q31_t)0x1d786892, (q31_t)0x35e2d219, + (q31_t)0x1d82fdd8, (q31_t)0x35e998b5, (q31_t)0x1d8d9472, (q31_t)0x35f05d3d, + (q31_t)0x1d982c60, (q31_t)0x35f71fb1, (q31_t)0x1da2c5a2, (q31_t)0x35fde011, + (q31_t)0x1dad6036, (q31_t)0x36049e5b, (q31_t)0x1db7fc1e, (q31_t)0x360b5a90, + (q31_t)0x1dc29958, (q31_t)0x361214b0, (q31_t)0x1dcd37e4, (q31_t)0x3618ccba, + (q31_t)0x1dd7d7c1, (q31_t)0x361f82af, (q31_t)0x1de278ef, (q31_t)0x3626368d, + (q31_t)0x1ded1b6e, (q31_t)0x362ce855, (q31_t)0x1df7bf3e, (q31_t)0x36339806, + (q31_t)0x1e02645d, (q31_t)0x363a45a0, (q31_t)0x1e0d0acc, (q31_t)0x3640f123, + (q31_t)0x1e17b28a, (q31_t)0x36479a8e, (q31_t)0x1e225b96, (q31_t)0x364e41e2, + (q31_t)0x1e2d05f1, (q31_t)0x3654e71d, (q31_t)0x1e37b199, (q31_t)0x365b8a41, + (q31_t)0x1e425e8f, (q31_t)0x36622b4c, (q31_t)0x1e4d0cd2, (q31_t)0x3668ca3e, + (q31_t)0x1e57bc62, (q31_t)0x366f6717, (q31_t)0x1e626d3e, (q31_t)0x367601d7, + (q31_t)0x1e6d1f65, (q31_t)0x367c9a7e, (q31_t)0x1e77d2d8, (q31_t)0x3683310b, + (q31_t)0x1e828796, (q31_t)0x3689c57d, (q31_t)0x1e8d3d9e, (q31_t)0x369057d6, + (q31_t)0x1e97f4f1, (q31_t)0x3696e814, (q31_t)0x1ea2ad8d, (q31_t)0x369d7637, + (q31_t)0x1ead6773, (q31_t)0x36a4023f, (q31_t)0x1eb822a1, (q31_t)0x36aa8c2c, + (q31_t)0x1ec2df18, (q31_t)0x36b113fd, (q31_t)0x1ecd9cd7, (q31_t)0x36b799b3, + (q31_t)0x1ed85bdd, (q31_t)0x36be1d4c, (q31_t)0x1ee31c2b, (q31_t)0x36c49ec9, + (q31_t)0x1eedddc0, (q31_t)0x36cb1e2a, (q31_t)0x1ef8a09b, (q31_t)0x36d19b6e, + (q31_t)0x1f0364bc, (q31_t)0x36d81695, (q31_t)0x1f0e2a22, (q31_t)0x36de8f9e, + (q31_t)0x1f18f0ce, (q31_t)0x36e5068a, (q31_t)0x1f23b8be, (q31_t)0x36eb7b58, + (q31_t)0x1f2e81f3, (q31_t)0x36f1ee09, (q31_t)0x1f394c6b, (q31_t)0x36f85e9a, + (q31_t)0x1f441828, (q31_t)0x36fecd0e, (q31_t)0x1f4ee527, (q31_t)0x37053962, + (q31_t)0x1f59b369, (q31_t)0x370ba398, (q31_t)0x1f6482ed, (q31_t)0x37120bae, + (q31_t)0x1f6f53b3, (q31_t)0x371871a5, (q31_t)0x1f7a25ba, (q31_t)0x371ed57c, + (q31_t)0x1f84f902, (q31_t)0x37253733, (q31_t)0x1f8fcd8b, (q31_t)0x372b96ca, + (q31_t)0x1f9aa354, (q31_t)0x3731f440, (q31_t)0x1fa57a5d, (q31_t)0x37384f95, + (q31_t)0x1fb052a5, (q31_t)0x373ea8ca, (q31_t)0x1fbb2c2c, (q31_t)0x3744ffdd, + (q31_t)0x1fc606f1, (q31_t)0x374b54ce, (q31_t)0x1fd0e2f5, (q31_t)0x3751a79e, + (q31_t)0x1fdbc036, (q31_t)0x3757f84c, (q31_t)0x1fe69eb4, (q31_t)0x375e46d8, + (q31_t)0x1ff17e70, (q31_t)0x37649341, (q31_t)0x1ffc5f67, (q31_t)0x376add88, + (q31_t)0x2007419b, (q31_t)0x377125ac, (q31_t)0x2012250a, (q31_t)0x37776bac, + (q31_t)0x201d09b4, (q31_t)0x377daf89, (q31_t)0x2027ef99, (q31_t)0x3783f143, + (q31_t)0x2032d6b8, (q31_t)0x378a30d8, (q31_t)0x203dbf11, (q31_t)0x37906e49, + (q31_t)0x2048a8a4, (q31_t)0x3796a996, (q31_t)0x2053936f, (q31_t)0x379ce2be, + (q31_t)0x205e7f74, (q31_t)0x37a319c2, (q31_t)0x20696cb0, (q31_t)0x37a94ea0, + (q31_t)0x20745b24, (q31_t)0x37af8159, (q31_t)0x207f4acf, (q31_t)0x37b5b1ec, + (q31_t)0x208a3bb2, (q31_t)0x37bbe05a, (q31_t)0x20952dcb, (q31_t)0x37c20ca1, + (q31_t)0x20a0211a, (q31_t)0x37c836c2, (q31_t)0x20ab159e, (q31_t)0x37ce5ebd, + (q31_t)0x20b60b58, (q31_t)0x37d48490, (q31_t)0x20c10247, (q31_t)0x37daa83d, + (q31_t)0x20cbfa6a, (q31_t)0x37e0c9c3, (q31_t)0x20d6f3c1, (q31_t)0x37e6e921, + (q31_t)0x20e1ee4b, (q31_t)0x37ed0657, (q31_t)0x20ecea09, (q31_t)0x37f32165, + (q31_t)0x20f7e6f9, (q31_t)0x37f93a4b, (q31_t)0x2102e51c, (q31_t)0x37ff5109, + (q31_t)0x210de470, (q31_t)0x3805659e, (q31_t)0x2118e4f6, (q31_t)0x380b780a, + (q31_t)0x2123e6ad, (q31_t)0x3811884d, (q31_t)0x212ee995, (q31_t)0x38179666, + (q31_t)0x2139edac, (q31_t)0x381da256, (q31_t)0x2144f2f3, (q31_t)0x3823ac1d, + (q31_t)0x214ff96a, (q31_t)0x3829b3b9, (q31_t)0x215b0110, (q31_t)0x382fb92a, + (q31_t)0x216609e3, (q31_t)0x3835bc71, (q31_t)0x217113e5, (q31_t)0x383bbd8e, + (q31_t)0x217c1f15, (q31_t)0x3841bc7f, (q31_t)0x21872b72, (q31_t)0x3847b946, + (q31_t)0x219238fb, (q31_t)0x384db3e0, (q31_t)0x219d47b1, (q31_t)0x3853ac4f, + (q31_t)0x21a85793, (q31_t)0x3859a292, (q31_t)0x21b368a0, (q31_t)0x385f96a9, + (q31_t)0x21be7ad8, (q31_t)0x38658894, (q31_t)0x21c98e3b, (q31_t)0x386b7852, + (q31_t)0x21d4a2c8, (q31_t)0x387165e3, (q31_t)0x21dfb87f, (q31_t)0x38775147, + (q31_t)0x21eacf5f, (q31_t)0x387d3a7e, (q31_t)0x21f5e768, (q31_t)0x38832187, + (q31_t)0x22010099, (q31_t)0x38890663, (q31_t)0x220c1af3, (q31_t)0x388ee910, + (q31_t)0x22173674, (q31_t)0x3894c98f, (q31_t)0x2222531c, (q31_t)0x389aa7e0, + (q31_t)0x222d70eb, (q31_t)0x38a08402, (q31_t)0x22388fe1, (q31_t)0x38a65df6, + (q31_t)0x2243affc, (q31_t)0x38ac35ba, (q31_t)0x224ed13d, (q31_t)0x38b20b4f, + (q31_t)0x2259f3a3, (q31_t)0x38b7deb4, (q31_t)0x2265172e, (q31_t)0x38bdafea, + (q31_t)0x22703bdc, (q31_t)0x38c37eef, (q31_t)0x227b61af, (q31_t)0x38c94bc4, + (q31_t)0x228688a4, (q31_t)0x38cf1669, (q31_t)0x2291b0bd, (q31_t)0x38d4dedd, + (q31_t)0x229cd9f8, (q31_t)0x38daa520, (q31_t)0x22a80456, (q31_t)0x38e06932, + (q31_t)0x22b32fd4, (q31_t)0x38e62b13, (q31_t)0x22be5c74, (q31_t)0x38ebeac2, + (q31_t)0x22c98a35, (q31_t)0x38f1a840, (q31_t)0x22d4b916, (q31_t)0x38f7638b, + (q31_t)0x22dfe917, (q31_t)0x38fd1ca4, (q31_t)0x22eb1a37, (q31_t)0x3902d38b, + (q31_t)0x22f64c77, (q31_t)0x3908883f, (q31_t)0x23017fd5, (q31_t)0x390e3ac0, + (q31_t)0x230cb451, (q31_t)0x3913eb0e, (q31_t)0x2317e9eb, (q31_t)0x39199929, + (q31_t)0x232320a2, (q31_t)0x391f4510, (q31_t)0x232e5876, (q31_t)0x3924eec3, + (q31_t)0x23399167, (q31_t)0x392a9642, (q31_t)0x2344cb73, (q31_t)0x39303b8e, + (q31_t)0x2350069b, (q31_t)0x3935dea4, (q31_t)0x235b42df, (q31_t)0x393b7f86, + (q31_t)0x2366803c, (q31_t)0x39411e33, (q31_t)0x2371beb5, (q31_t)0x3946baac, + (q31_t)0x237cfe47, (q31_t)0x394c54ee, (q31_t)0x23883ef2, (q31_t)0x3951ecfc, + (q31_t)0x239380b6, (q31_t)0x395782d3, (q31_t)0x239ec393, (q31_t)0x395d1675, + (q31_t)0x23aa0788, (q31_t)0x3962a7e0, (q31_t)0x23b54c95, (q31_t)0x39683715, + (q31_t)0x23c092b9, (q31_t)0x396dc414, (q31_t)0x23cbd9f4, (q31_t)0x39734edc, + (q31_t)0x23d72245, (q31_t)0x3978d76c, (q31_t)0x23e26bac, (q31_t)0x397e5dc6, + (q31_t)0x23edb628, (q31_t)0x3983e1e8, (q31_t)0x23f901ba, (q31_t)0x398963d2, + (q31_t)0x24044e60, (q31_t)0x398ee385, (q31_t)0x240f9c1a, (q31_t)0x399460ff, + (q31_t)0x241aeae8, (q31_t)0x3999dc42, (q31_t)0x24263ac9, (q31_t)0x399f554b, + (q31_t)0x24318bbe, (q31_t)0x39a4cc1c, (q31_t)0x243cddc4, (q31_t)0x39aa40b4, + (q31_t)0x244830dd, (q31_t)0x39afb313, (q31_t)0x24538507, (q31_t)0x39b52339, + (q31_t)0x245eda43, (q31_t)0x39ba9125, (q31_t)0x246a308f, (q31_t)0x39bffcd7, + (q31_t)0x247587eb, (q31_t)0x39c5664f, (q31_t)0x2480e057, (q31_t)0x39cacd8d, + (q31_t)0x248c39d3, (q31_t)0x39d03291, (q31_t)0x2497945d, (q31_t)0x39d5955a, + (q31_t)0x24a2eff6, (q31_t)0x39daf5e8, (q31_t)0x24ae4c9d, (q31_t)0x39e0543c, + (q31_t)0x24b9aa52, (q31_t)0x39e5b054, (q31_t)0x24c50914, (q31_t)0x39eb0a31, + (q31_t)0x24d068e2, (q31_t)0x39f061d2, (q31_t)0x24dbc9bd, (q31_t)0x39f5b737, + (q31_t)0x24e72ba4, (q31_t)0x39fb0a60, (q31_t)0x24f28e96, (q31_t)0x3a005b4d, + (q31_t)0x24fdf294, (q31_t)0x3a05a9fd, (q31_t)0x2509579b, (q31_t)0x3a0af671, + (q31_t)0x2514bdad, (q31_t)0x3a1040a8, (q31_t)0x252024c9, (q31_t)0x3a1588a2, + (q31_t)0x252b8cee, (q31_t)0x3a1ace5f, (q31_t)0x2536f61b, (q31_t)0x3a2011de, + (q31_t)0x25426051, (q31_t)0x3a25531f, (q31_t)0x254dcb8f, (q31_t)0x3a2a9223, + (q31_t)0x255937d5, (q31_t)0x3a2fcee8, (q31_t)0x2564a521, (q31_t)0x3a350970, + (q31_t)0x25701374, (q31_t)0x3a3a41b9, (q31_t)0x257b82cd, (q31_t)0x3a3f77c3, + (q31_t)0x2586f32c, (q31_t)0x3a44ab8e, (q31_t)0x25926490, (q31_t)0x3a49dd1a, + (q31_t)0x259dd6f9, (q31_t)0x3a4f0c67, (q31_t)0x25a94a67, (q31_t)0x3a543974, + (q31_t)0x25b4bed8, (q31_t)0x3a596442, (q31_t)0x25c0344d, (q31_t)0x3a5e8cd0, + (q31_t)0x25cbaac5, (q31_t)0x3a63b31d, (q31_t)0x25d72240, (q31_t)0x3a68d72b, + (q31_t)0x25e29abc, (q31_t)0x3a6df8f8, (q31_t)0x25ee143b, (q31_t)0x3a731884, + (q31_t)0x25f98ebb, (q31_t)0x3a7835cf, (q31_t)0x26050a3b, (q31_t)0x3a7d50da, + (q31_t)0x261086bc, (q31_t)0x3a8269a3, (q31_t)0x261c043d, (q31_t)0x3a87802a, + (q31_t)0x262782be, (q31_t)0x3a8c9470, (q31_t)0x2633023e, (q31_t)0x3a91a674, + (q31_t)0x263e82bc, (q31_t)0x3a96b636, (q31_t)0x264a0438, (q31_t)0x3a9bc3b6, + (q31_t)0x265586b3, (q31_t)0x3aa0cef3, (q31_t)0x26610a2a, (q31_t)0x3aa5d7ee, + (q31_t)0x266c8e9f, (q31_t)0x3aaadea6, (q31_t)0x26781410, (q31_t)0x3aafe31b, + (q31_t)0x26839a7c, (q31_t)0x3ab4e54c, (q31_t)0x268f21e5, (q31_t)0x3ab9e53a, + (q31_t)0x269aaa48, (q31_t)0x3abee2e5, (q31_t)0x26a633a6, (q31_t)0x3ac3de4c, + (q31_t)0x26b1bdff, (q31_t)0x3ac8d76f, (q31_t)0x26bd4951, (q31_t)0x3acdce4d, + (q31_t)0x26c8d59c, (q31_t)0x3ad2c2e8, (q31_t)0x26d462e1, (q31_t)0x3ad7b53d, + (q31_t)0x26dff11d, (q31_t)0x3adca54e, (q31_t)0x26eb8052, (q31_t)0x3ae1931a, + (q31_t)0x26f7107e, (q31_t)0x3ae67ea1, (q31_t)0x2702a1a1, (q31_t)0x3aeb67e3, + (q31_t)0x270e33bb, (q31_t)0x3af04edf, (q31_t)0x2719c6cb, (q31_t)0x3af53395, + (q31_t)0x27255ad1, (q31_t)0x3afa1605, (q31_t)0x2730efcc, (q31_t)0x3afef630, + (q31_t)0x273c85bc, (q31_t)0x3b03d414, (q31_t)0x27481ca1, (q31_t)0x3b08afb2, + (q31_t)0x2753b479, (q31_t)0x3b0d8909, (q31_t)0x275f4d45, (q31_t)0x3b126019, + (q31_t)0x276ae704, (q31_t)0x3b1734e2, (q31_t)0x277681b6, (q31_t)0x3b1c0764, + (q31_t)0x27821d59, (q31_t)0x3b20d79e, (q31_t)0x278db9ef, (q31_t)0x3b25a591, + (q31_t)0x27995776, (q31_t)0x3b2a713d, (q31_t)0x27a4f5ed, (q31_t)0x3b2f3aa0, + (q31_t)0x27b09555, (q31_t)0x3b3401bb, (q31_t)0x27bc35ad, (q31_t)0x3b38c68e, + (q31_t)0x27c7d6f4, (q31_t)0x3b3d8918, (q31_t)0x27d3792b, (q31_t)0x3b42495a, + (q31_t)0x27df1c50, (q31_t)0x3b470753, (q31_t)0x27eac063, (q31_t)0x3b4bc303, + (q31_t)0x27f66564, (q31_t)0x3b507c69, (q31_t)0x28020b52, (q31_t)0x3b553386, + (q31_t)0x280db22d, (q31_t)0x3b59e85a, (q31_t)0x281959f4, (q31_t)0x3b5e9ae4, + (q31_t)0x282502a7, (q31_t)0x3b634b23, (q31_t)0x2830ac45, (q31_t)0x3b67f919, + (q31_t)0x283c56cf, (q31_t)0x3b6ca4c4, (q31_t)0x28480243, (q31_t)0x3b714e25, + (q31_t)0x2853aea1, (q31_t)0x3b75f53c, (q31_t)0x285f5be9, (q31_t)0x3b7a9a07, + (q31_t)0x286b0a1a, (q31_t)0x3b7f3c87, (q31_t)0x2876b934, (q31_t)0x3b83dcbc, + (q31_t)0x28826936, (q31_t)0x3b887aa6, (q31_t)0x288e1a20, (q31_t)0x3b8d1644, + (q31_t)0x2899cbf1, (q31_t)0x3b91af97, (q31_t)0x28a57ea9, (q31_t)0x3b96469d, + (q31_t)0x28b13248, (q31_t)0x3b9adb57, (q31_t)0x28bce6cd, (q31_t)0x3b9f6dc5, + (q31_t)0x28c89c37, (q31_t)0x3ba3fde7, (q31_t)0x28d45286, (q31_t)0x3ba88bbc, + (q31_t)0x28e009ba, (q31_t)0x3bad1744, (q31_t)0x28ebc1d3, (q31_t)0x3bb1a080, + (q31_t)0x28f77acf, (q31_t)0x3bb6276e, (q31_t)0x290334af, (q31_t)0x3bbaac0e, + (q31_t)0x290eef71, (q31_t)0x3bbf2e62, (q31_t)0x291aab16, (q31_t)0x3bc3ae67, + (q31_t)0x2926679c, (q31_t)0x3bc82c1f, (q31_t)0x29322505, (q31_t)0x3bcca789, + (q31_t)0x293de34e, (q31_t)0x3bd120a4, (q31_t)0x2949a278, (q31_t)0x3bd59771, + (q31_t)0x29556282, (q31_t)0x3bda0bf0, (q31_t)0x2961236c, (q31_t)0x3bde7e20, + (q31_t)0x296ce535, (q31_t)0x3be2ee01, (q31_t)0x2978a7dd, (q31_t)0x3be75b93, + (q31_t)0x29846b63, (q31_t)0x3bebc6d5, (q31_t)0x29902fc7, (q31_t)0x3bf02fc9, + (q31_t)0x299bf509, (q31_t)0x3bf4966c, (q31_t)0x29a7bb28, (q31_t)0x3bf8fac0, + (q31_t)0x29b38223, (q31_t)0x3bfd5cc4, (q31_t)0x29bf49fa, (q31_t)0x3c01bc78, + (q31_t)0x29cb12ad, (q31_t)0x3c0619dc, (q31_t)0x29d6dc3b, (q31_t)0x3c0a74f0, + (q31_t)0x29e2a6a3, (q31_t)0x3c0ecdb2, (q31_t)0x29ee71e6, (q31_t)0x3c132424, + (q31_t)0x29fa3e03, (q31_t)0x3c177845, (q31_t)0x2a060af9, (q31_t)0x3c1bca16, + (q31_t)0x2a11d8c8, (q31_t)0x3c201994, (q31_t)0x2a1da770, (q31_t)0x3c2466c2, + (q31_t)0x2a2976ef, (q31_t)0x3c28b19e, (q31_t)0x2a354746, (q31_t)0x3c2cfa28, + (q31_t)0x2a411874, (q31_t)0x3c314060, (q31_t)0x2a4cea79, (q31_t)0x3c358446, + (q31_t)0x2a58bd54, (q31_t)0x3c39c5da, (q31_t)0x2a649105, (q31_t)0x3c3e051b, + (q31_t)0x2a70658a, (q31_t)0x3c42420a, (q31_t)0x2a7c3ae5, (q31_t)0x3c467ca6, + (q31_t)0x2a881114, (q31_t)0x3c4ab4ef, (q31_t)0x2a93e817, (q31_t)0x3c4eeae5, + (q31_t)0x2a9fbfed, (q31_t)0x3c531e88, (q31_t)0x2aab9896, (q31_t)0x3c574fd8, + (q31_t)0x2ab77212, (q31_t)0x3c5b7ed4, (q31_t)0x2ac34c60, (q31_t)0x3c5fab7c, + (q31_t)0x2acf277f, (q31_t)0x3c63d5d1, (q31_t)0x2adb0370, (q31_t)0x3c67fdd1, + (q31_t)0x2ae6e031, (q31_t)0x3c6c237e, (q31_t)0x2af2bdc3, (q31_t)0x3c7046d6, + (q31_t)0x2afe9c24, (q31_t)0x3c7467d9, (q31_t)0x2b0a7b54, (q31_t)0x3c788688, + (q31_t)0x2b165b54, (q31_t)0x3c7ca2e2, (q31_t)0x2b223c22, (q31_t)0x3c80bce7, + (q31_t)0x2b2e1dbe, (q31_t)0x3c84d496, (q31_t)0x2b3a0027, (q31_t)0x3c88e9f1, + (q31_t)0x2b45e35d, (q31_t)0x3c8cfcf6, (q31_t)0x2b51c760, (q31_t)0x3c910da5, + (q31_t)0x2b5dac2f, (q31_t)0x3c951bff, (q31_t)0x2b6991ca, (q31_t)0x3c992803, + (q31_t)0x2b75782f, (q31_t)0x3c9d31b0, (q31_t)0x2b815f60, (q31_t)0x3ca13908, + (q31_t)0x2b8d475b, (q31_t)0x3ca53e09, (q31_t)0x2b99301f, (q31_t)0x3ca940b3, + (q31_t)0x2ba519ad, (q31_t)0x3cad4107, (q31_t)0x2bb10404, (q31_t)0x3cb13f04, + (q31_t)0x2bbcef23, (q31_t)0x3cb53aaa, (q31_t)0x2bc8db0b, (q31_t)0x3cb933f9, + (q31_t)0x2bd4c7ba, (q31_t)0x3cbd2af0, (q31_t)0x2be0b52f, (q31_t)0x3cc11f90, + (q31_t)0x2beca36c, (q31_t)0x3cc511d9, (q31_t)0x2bf8926f, (q31_t)0x3cc901c9, + (q31_t)0x2c048237, (q31_t)0x3cccef62, (q31_t)0x2c1072c4, (q31_t)0x3cd0daa2, + (q31_t)0x2c1c6417, (q31_t)0x3cd4c38b, (q31_t)0x2c28562d, (q31_t)0x3cd8aa1b, + (q31_t)0x2c344908, (q31_t)0x3cdc8e52, (q31_t)0x2c403ca5, (q31_t)0x3ce07031, + (q31_t)0x2c4c3106, (q31_t)0x3ce44fb7, (q31_t)0x2c582629, (q31_t)0x3ce82ce4, + (q31_t)0x2c641c0e, (q31_t)0x3cec07b8, (q31_t)0x2c7012b5, (q31_t)0x3cefe032, + (q31_t)0x2c7c0a1d, (q31_t)0x3cf3b653, (q31_t)0x2c880245, (q31_t)0x3cf78a1b, + (q31_t)0x2c93fb2e, (q31_t)0x3cfb5b89, (q31_t)0x2c9ff4d6, (q31_t)0x3cff2a9d, + (q31_t)0x2cabef3d, (q31_t)0x3d02f757, (q31_t)0x2cb7ea63, (q31_t)0x3d06c1b6, + (q31_t)0x2cc3e648, (q31_t)0x3d0a89bc, (q31_t)0x2ccfe2ea, (q31_t)0x3d0e4f67, + (q31_t)0x2cdbe04a, (q31_t)0x3d1212b7, (q31_t)0x2ce7de66, (q31_t)0x3d15d3ad, + (q31_t)0x2cf3dd3f, (q31_t)0x3d199248, (q31_t)0x2cffdcd4, (q31_t)0x3d1d4e88, + (q31_t)0x2d0bdd25, (q31_t)0x3d21086c, (q31_t)0x2d17de31, (q31_t)0x3d24bff6, + (q31_t)0x2d23dff7, (q31_t)0x3d287523, (q31_t)0x2d2fe277, (q31_t)0x3d2c27f6, + (q31_t)0x2d3be5b1, (q31_t)0x3d2fd86c, (q31_t)0x2d47e9a5, (q31_t)0x3d338687, + (q31_t)0x2d53ee51, (q31_t)0x3d373245, (q31_t)0x2d5ff3b5, (q31_t)0x3d3adba7, + (q31_t)0x2d6bf9d1, (q31_t)0x3d3e82ae, (q31_t)0x2d7800a5, (q31_t)0x3d422757, + (q31_t)0x2d84082f, (q31_t)0x3d45c9a4, (q31_t)0x2d901070, (q31_t)0x3d496994, + (q31_t)0x2d9c1967, (q31_t)0x3d4d0728, (q31_t)0x2da82313, (q31_t)0x3d50a25e, + (q31_t)0x2db42d74, (q31_t)0x3d543b37, (q31_t)0x2dc0388a, (q31_t)0x3d57d1b3, + (q31_t)0x2dcc4454, (q31_t)0x3d5b65d2, (q31_t)0x2dd850d2, (q31_t)0x3d5ef793, + (q31_t)0x2de45e03, (q31_t)0x3d6286f6, (q31_t)0x2df06be6, (q31_t)0x3d6613fb, + (q31_t)0x2dfc7a7c, (q31_t)0x3d699ea3, (q31_t)0x2e0889c4, (q31_t)0x3d6d26ec, + (q31_t)0x2e1499bd, (q31_t)0x3d70acd7, (q31_t)0x2e20aa67, (q31_t)0x3d743064, + (q31_t)0x2e2cbbc1, (q31_t)0x3d77b192, (q31_t)0x2e38cdcb, (q31_t)0x3d7b3061, + (q31_t)0x2e44e084, (q31_t)0x3d7eacd2, (q31_t)0x2e50f3ed, (q31_t)0x3d8226e4, + (q31_t)0x2e5d0804, (q31_t)0x3d859e96, (q31_t)0x2e691cc9, (q31_t)0x3d8913ea, + (q31_t)0x2e75323c, (q31_t)0x3d8c86de, (q31_t)0x2e81485c, (q31_t)0x3d8ff772, + (q31_t)0x2e8d5f29, (q31_t)0x3d9365a8, (q31_t)0x2e9976a1, (q31_t)0x3d96d17d, + (q31_t)0x2ea58ec6, (q31_t)0x3d9a3af2, (q31_t)0x2eb1a796, (q31_t)0x3d9da208, + (q31_t)0x2ebdc110, (q31_t)0x3da106bd, (q31_t)0x2ec9db35, (q31_t)0x3da46912, + (q31_t)0x2ed5f604, (q31_t)0x3da7c907, (q31_t)0x2ee2117c, (q31_t)0x3dab269b, + (q31_t)0x2eee2d9d, (q31_t)0x3dae81cf, (q31_t)0x2efa4a67, (q31_t)0x3db1daa2, + (q31_t)0x2f0667d9, (q31_t)0x3db53113, (q31_t)0x2f1285f2, (q31_t)0x3db88524, + (q31_t)0x2f1ea4b2, (q31_t)0x3dbbd6d4, (q31_t)0x2f2ac419, (q31_t)0x3dbf2622, + (q31_t)0x2f36e426, (q31_t)0x3dc2730f, (q31_t)0x2f4304d8, (q31_t)0x3dc5bd9b, + (q31_t)0x2f4f2630, (q31_t)0x3dc905c5, (q31_t)0x2f5b482d, (q31_t)0x3dcc4b8d, + (q31_t)0x2f676ace, (q31_t)0x3dcf8ef3, (q31_t)0x2f738e12, (q31_t)0x3dd2cff7, + (q31_t)0x2f7fb1fa, (q31_t)0x3dd60e99, (q31_t)0x2f8bd685, (q31_t)0x3dd94ad8, + (q31_t)0x2f97fbb2, (q31_t)0x3ddc84b5, (q31_t)0x2fa42181, (q31_t)0x3ddfbc30, + (q31_t)0x2fb047f2, (q31_t)0x3de2f148, (q31_t)0x2fbc6f03, (q31_t)0x3de623fd, + (q31_t)0x2fc896b5, (q31_t)0x3de9544f, (q31_t)0x2fd4bf08, (q31_t)0x3dec823e, + (q31_t)0x2fe0e7f9, (q31_t)0x3defadca, (q31_t)0x2fed118a, (q31_t)0x3df2d6f3, + (q31_t)0x2ff93bba, (q31_t)0x3df5fdb8, (q31_t)0x30056687, (q31_t)0x3df9221a, + (q31_t)0x301191f3, (q31_t)0x3dfc4418, (q31_t)0x301dbdfb, (q31_t)0x3dff63b2, + (q31_t)0x3029eaa1, (q31_t)0x3e0280e9, (q31_t)0x303617e2, (q31_t)0x3e059bbb, + (q31_t)0x304245c0, (q31_t)0x3e08b42a, (q31_t)0x304e7438, (q31_t)0x3e0bca34, + (q31_t)0x305aa34c, (q31_t)0x3e0eddd9, (q31_t)0x3066d2fa, (q31_t)0x3e11ef1b, + (q31_t)0x30730342, (q31_t)0x3e14fdf7, (q31_t)0x307f3424, (q31_t)0x3e180a6f, + (q31_t)0x308b659f, (q31_t)0x3e1b1482, (q31_t)0x309797b2, (q31_t)0x3e1e1c30, + (q31_t)0x30a3ca5d, (q31_t)0x3e212179, (q31_t)0x30affda0, (q31_t)0x3e24245d, + (q31_t)0x30bc317a, (q31_t)0x3e2724db, (q31_t)0x30c865ea, (q31_t)0x3e2a22f4, + (q31_t)0x30d49af1, (q31_t)0x3e2d1ea8, (q31_t)0x30e0d08d, (q31_t)0x3e3017f6, + (q31_t)0x30ed06bf, (q31_t)0x3e330ede, (q31_t)0x30f93d86, (q31_t)0x3e360360, + (q31_t)0x310574e0, (q31_t)0x3e38f57c, (q31_t)0x3111accf, (q31_t)0x3e3be532, + (q31_t)0x311de551, (q31_t)0x3e3ed282, (q31_t)0x312a1e66, (q31_t)0x3e41bd6c, + (q31_t)0x3136580d, (q31_t)0x3e44a5ef, (q31_t)0x31429247, (q31_t)0x3e478c0b, + (q31_t)0x314ecd11, (q31_t)0x3e4a6fc1, (q31_t)0x315b086d, (q31_t)0x3e4d5110, + (q31_t)0x31674459, (q31_t)0x3e502ff9, (q31_t)0x317380d6, (q31_t)0x3e530c7a, + (q31_t)0x317fbde2, (q31_t)0x3e55e694, (q31_t)0x318bfb7d, (q31_t)0x3e58be47, + (q31_t)0x319839a6, (q31_t)0x3e5b9392, (q31_t)0x31a4785e, (q31_t)0x3e5e6676, + (q31_t)0x31b0b7a4, (q31_t)0x3e6136f3, (q31_t)0x31bcf777, (q31_t)0x3e640507, + (q31_t)0x31c937d6, (q31_t)0x3e66d0b4, (q31_t)0x31d578c2, (q31_t)0x3e6999fa, + (q31_t)0x31e1ba3a, (q31_t)0x3e6c60d7, (q31_t)0x31edfc3d, (q31_t)0x3e6f254c, + (q31_t)0x31fa3ecb, (q31_t)0x3e71e759, (q31_t)0x320681e3, (q31_t)0x3e74a6fd, + (q31_t)0x3212c585, (q31_t)0x3e77643a, (q31_t)0x321f09b1, (q31_t)0x3e7a1f0d, + (q31_t)0x322b4e66, (q31_t)0x3e7cd778, (q31_t)0x323793a3, (q31_t)0x3e7f8d7b, + (q31_t)0x3243d968, (q31_t)0x3e824114, (q31_t)0x32501fb5, (q31_t)0x3e84f245, + (q31_t)0x325c6688, (q31_t)0x3e87a10c, (q31_t)0x3268ade3, (q31_t)0x3e8a4d6a, + (q31_t)0x3274f5c3, (q31_t)0x3e8cf75f, (q31_t)0x32813e2a, (q31_t)0x3e8f9eeb, + (q31_t)0x328d8715, (q31_t)0x3e92440d, (q31_t)0x3299d085, (q31_t)0x3e94e6c6, + (q31_t)0x32a61a7a, (q31_t)0x3e978715, (q31_t)0x32b264f2, (q31_t)0x3e9a24fb, + (q31_t)0x32beafed, (q31_t)0x3e9cc076, (q31_t)0x32cafb6b, (q31_t)0x3e9f5988, + (q31_t)0x32d7476c, (q31_t)0x3ea1f02f, (q31_t)0x32e393ef, (q31_t)0x3ea4846c, + (q31_t)0x32efe0f2, (q31_t)0x3ea7163f, (q31_t)0x32fc2e77, (q31_t)0x3ea9a5a8, + (q31_t)0x33087c7d, (q31_t)0x3eac32a6, (q31_t)0x3314cb02, (q31_t)0x3eaebd3a, + (q31_t)0x33211a07, (q31_t)0x3eb14563, (q31_t)0x332d698a, (q31_t)0x3eb3cb21, + (q31_t)0x3339b98d, (q31_t)0x3eb64e75, (q31_t)0x33460a0d, (q31_t)0x3eb8cf5d, + (q31_t)0x33525b0b, (q31_t)0x3ebb4ddb, (q31_t)0x335eac86, (q31_t)0x3ebdc9ed, + (q31_t)0x336afe7e, (q31_t)0x3ec04394, (q31_t)0x337750f2, (q31_t)0x3ec2bad0, + (q31_t)0x3383a3e2, (q31_t)0x3ec52fa0, (q31_t)0x338ff74d, (q31_t)0x3ec7a205, + (q31_t)0x339c4b32, (q31_t)0x3eca11fe, (q31_t)0x33a89f92, (q31_t)0x3ecc7f8b, + (q31_t)0x33b4f46c, (q31_t)0x3eceeaad, (q31_t)0x33c149bf, (q31_t)0x3ed15363, + (q31_t)0x33cd9f8b, (q31_t)0x3ed3b9ad, (q31_t)0x33d9f5cf, (q31_t)0x3ed61d8a, + (q31_t)0x33e64c8c, (q31_t)0x3ed87efc, (q31_t)0x33f2a3bf, (q31_t)0x3edade01, + (q31_t)0x33fefb6a, (q31_t)0x3edd3a9a, (q31_t)0x340b538b, (q31_t)0x3edf94c7, + (q31_t)0x3417ac22, (q31_t)0x3ee1ec87, (q31_t)0x3424052f, (q31_t)0x3ee441da, + (q31_t)0x34305eb0, (q31_t)0x3ee694c1, (q31_t)0x343cb8a7, (q31_t)0x3ee8e53a, + (q31_t)0x34491311, (q31_t)0x3eeb3347, (q31_t)0x34556def, (q31_t)0x3eed7ee7, + (q31_t)0x3461c940, (q31_t)0x3eefc81a, (q31_t)0x346e2504, (q31_t)0x3ef20ee0, + (q31_t)0x347a8139, (q31_t)0x3ef45338, (q31_t)0x3486dde1, (q31_t)0x3ef69523, + (q31_t)0x34933afa, (q31_t)0x3ef8d4a1, (q31_t)0x349f9884, (q31_t)0x3efb11b1, + (q31_t)0x34abf67e, (q31_t)0x3efd4c54, (q31_t)0x34b854e7, (q31_t)0x3eff8489, + (q31_t)0x34c4b3c0, (q31_t)0x3f01ba50, (q31_t)0x34d11308, (q31_t)0x3f03eda9, + (q31_t)0x34dd72be, (q31_t)0x3f061e95, (q31_t)0x34e9d2e3, (q31_t)0x3f084d12, + (q31_t)0x34f63374, (q31_t)0x3f0a7921, (q31_t)0x35029473, (q31_t)0x3f0ca2c2, + (q31_t)0x350ef5de, (q31_t)0x3f0ec9f5, (q31_t)0x351b57b5, (q31_t)0x3f10eeb9, + (q31_t)0x3527b9f7, (q31_t)0x3f13110f, (q31_t)0x35341ca5, (q31_t)0x3f1530f7, + (q31_t)0x35407fbd, (q31_t)0x3f174e70, (q31_t)0x354ce33f, (q31_t)0x3f19697a, + (q31_t)0x3559472b, (q31_t)0x3f1b8215, (q31_t)0x3565ab80, (q31_t)0x3f1d9842, + (q31_t)0x3572103d, (q31_t)0x3f1fabff, (q31_t)0x357e7563, (q31_t)0x3f21bd4e, + (q31_t)0x358adaf0, (q31_t)0x3f23cc2e, (q31_t)0x359740e5, (q31_t)0x3f25d89e, + (q31_t)0x35a3a740, (q31_t)0x3f27e29f, (q31_t)0x35b00e02, (q31_t)0x3f29ea31, + (q31_t)0x35bc7529, (q31_t)0x3f2bef53, (q31_t)0x35c8dcb6, (q31_t)0x3f2df206, + (q31_t)0x35d544a7, (q31_t)0x3f2ff24a, (q31_t)0x35e1acfd, (q31_t)0x3f31f01d, + (q31_t)0x35ee15b7, (q31_t)0x3f33eb81, (q31_t)0x35fa7ed4, (q31_t)0x3f35e476, + (q31_t)0x3606e854, (q31_t)0x3f37dafa, (q31_t)0x36135237, (q31_t)0x3f39cf0e, + (q31_t)0x361fbc7b, (q31_t)0x3f3bc0b3, (q31_t)0x362c2721, (q31_t)0x3f3dafe7, + (q31_t)0x36389228, (q31_t)0x3f3f9cab, (q31_t)0x3644fd8f, (q31_t)0x3f4186ff, + (q31_t)0x36516956, (q31_t)0x3f436ee3, (q31_t)0x365dd57d, (q31_t)0x3f455456, + (q31_t)0x366a4203, (q31_t)0x3f473759, (q31_t)0x3676aee8, (q31_t)0x3f4917eb, + (q31_t)0x36831c2b, (q31_t)0x3f4af60d, (q31_t)0x368f89cb, (q31_t)0x3f4cd1be, + (q31_t)0x369bf7c9, (q31_t)0x3f4eaafe, (q31_t)0x36a86623, (q31_t)0x3f5081cd, + (q31_t)0x36b4d4d9, (q31_t)0x3f52562c, (q31_t)0x36c143ec, (q31_t)0x3f54281a, + (q31_t)0x36cdb359, (q31_t)0x3f55f796, (q31_t)0x36da2321, (q31_t)0x3f57c4a2, + (q31_t)0x36e69344, (q31_t)0x3f598f3c, (q31_t)0x36f303c0, (q31_t)0x3f5b5765, + (q31_t)0x36ff7496, (q31_t)0x3f5d1d1d, (q31_t)0x370be5c4, (q31_t)0x3f5ee063, + (q31_t)0x3718574b, (q31_t)0x3f60a138, (q31_t)0x3724c92a, (q31_t)0x3f625f9b, + (q31_t)0x37313b60, (q31_t)0x3f641b8d, (q31_t)0x373daded, (q31_t)0x3f65d50d, + (q31_t)0x374a20d0, (q31_t)0x3f678c1c, (q31_t)0x3756940a, (q31_t)0x3f6940b8, + (q31_t)0x37630799, (q31_t)0x3f6af2e3, (q31_t)0x376f7b7d, (q31_t)0x3f6ca29c, + (q31_t)0x377befb5, (q31_t)0x3f6e4fe3, (q31_t)0x37886442, (q31_t)0x3f6ffab8, + (q31_t)0x3794d922, (q31_t)0x3f71a31b, (q31_t)0x37a14e55, (q31_t)0x3f73490b, + (q31_t)0x37adc3db, (q31_t)0x3f74ec8a, (q31_t)0x37ba39b3, (q31_t)0x3f768d96, + (q31_t)0x37c6afdc, (q31_t)0x3f782c30, (q31_t)0x37d32657, (q31_t)0x3f79c857, + (q31_t)0x37df9d22, (q31_t)0x3f7b620c, (q31_t)0x37ec143e, (q31_t)0x3f7cf94e, + (q31_t)0x37f88ba9, (q31_t)0x3f7e8e1e, (q31_t)0x38050364, (q31_t)0x3f80207b, + (q31_t)0x38117b6d, (q31_t)0x3f81b065, (q31_t)0x381df3c5, (q31_t)0x3f833ddd, + (q31_t)0x382a6c6a, (q31_t)0x3f84c8e2, (q31_t)0x3836e55d, (q31_t)0x3f865174, + (q31_t)0x38435e9d, (q31_t)0x3f87d792, (q31_t)0x384fd829, (q31_t)0x3f895b3e, + (q31_t)0x385c5201, (q31_t)0x3f8adc77, (q31_t)0x3868cc24, (q31_t)0x3f8c5b3d, + (q31_t)0x38754692, (q31_t)0x3f8dd78f, (q31_t)0x3881c14b, (q31_t)0x3f8f516e, + (q31_t)0x388e3c4d, (q31_t)0x3f90c8da, (q31_t)0x389ab799, (q31_t)0x3f923dd2, + (q31_t)0x38a7332e, (q31_t)0x3f93b058, (q31_t)0x38b3af0c, (q31_t)0x3f952069, + (q31_t)0x38c02b31, (q31_t)0x3f968e07, (q31_t)0x38cca79e, (q31_t)0x3f97f932, + (q31_t)0x38d92452, (q31_t)0x3f9961e8, (q31_t)0x38e5a14d, (q31_t)0x3f9ac82c, + (q31_t)0x38f21e8e, (q31_t)0x3f9c2bfb, (q31_t)0x38fe9c15, (q31_t)0x3f9d8d56, + (q31_t)0x390b19e0, (q31_t)0x3f9eec3e, (q31_t)0x391797f0, (q31_t)0x3fa048b2, + (q31_t)0x39241645, (q31_t)0x3fa1a2b2, (q31_t)0x393094dd, (q31_t)0x3fa2fa3d, + (q31_t)0x393d13b8, (q31_t)0x3fa44f55, (q31_t)0x394992d7, (q31_t)0x3fa5a1f9, + (q31_t)0x39561237, (q31_t)0x3fa6f228, (q31_t)0x396291d9, (q31_t)0x3fa83fe3, + (q31_t)0x396f11bc, (q31_t)0x3fa98b2a, (q31_t)0x397b91e1, (q31_t)0x3faad3fd, + (q31_t)0x39881245, (q31_t)0x3fac1a5b, (q31_t)0x399492ea, (q31_t)0x3fad5e45, + (q31_t)0x39a113cd, (q31_t)0x3fae9fbb, (q31_t)0x39ad94f0, (q31_t)0x3fafdebb, + (q31_t)0x39ba1651, (q31_t)0x3fb11b48, (q31_t)0x39c697f0, (q31_t)0x3fb2555f, + (q31_t)0x39d319cc, (q31_t)0x3fb38d02, (q31_t)0x39df9be6, (q31_t)0x3fb4c231, + (q31_t)0x39ec1e3b, (q31_t)0x3fb5f4ea, (q31_t)0x39f8a0cd, (q31_t)0x3fb7252f, + (q31_t)0x3a05239a, (q31_t)0x3fb852ff, (q31_t)0x3a11a6a3, (q31_t)0x3fb97e5a, + (q31_t)0x3a1e29e5, (q31_t)0x3fbaa740, (q31_t)0x3a2aad62, (q31_t)0x3fbbcdb1, + (q31_t)0x3a373119, (q31_t)0x3fbcf1ad, (q31_t)0x3a43b508, (q31_t)0x3fbe1334, + (q31_t)0x3a503930, (q31_t)0x3fbf3246, (q31_t)0x3a5cbd91, (q31_t)0x3fc04ee3, + (q31_t)0x3a694229, (q31_t)0x3fc1690a, (q31_t)0x3a75c6f8, (q31_t)0x3fc280bc, + (q31_t)0x3a824bfd, (q31_t)0x3fc395f9, (q31_t)0x3a8ed139, (q31_t)0x3fc4a8c1, + (q31_t)0x3a9b56ab, (q31_t)0x3fc5b913, (q31_t)0x3aa7dc52, (q31_t)0x3fc6c6f0, + (q31_t)0x3ab4622d, (q31_t)0x3fc7d258, (q31_t)0x3ac0e83d, (q31_t)0x3fc8db4a, + (q31_t)0x3acd6e81, (q31_t)0x3fc9e1c6, (q31_t)0x3ad9f4f8, (q31_t)0x3fcae5cd, + (q31_t)0x3ae67ba2, (q31_t)0x3fcbe75e, (q31_t)0x3af3027e, (q31_t)0x3fcce67a, + (q31_t)0x3aff898c, (q31_t)0x3fcde320, (q31_t)0x3b0c10cb, (q31_t)0x3fcedd50, + (q31_t)0x3b18983b, (q31_t)0x3fcfd50b, (q31_t)0x3b251fdc, (q31_t)0x3fd0ca4f, + (q31_t)0x3b31a7ac, (q31_t)0x3fd1bd1e, (q31_t)0x3b3e2fac, (q31_t)0x3fd2ad77, + (q31_t)0x3b4ab7db, (q31_t)0x3fd39b5a, (q31_t)0x3b574039, (q31_t)0x3fd486c7, + (q31_t)0x3b63c8c4, (q31_t)0x3fd56fbe, (q31_t)0x3b70517d, (q31_t)0x3fd6563f, + (q31_t)0x3b7cda63, (q31_t)0x3fd73a4a, (q31_t)0x3b896375, (q31_t)0x3fd81bdf, + (q31_t)0x3b95ecb4, (q31_t)0x3fd8fafe, (q31_t)0x3ba2761e, (q31_t)0x3fd9d7a7, + (q31_t)0x3baeffb3, (q31_t)0x3fdab1d9, (q31_t)0x3bbb8973, (q31_t)0x3fdb8996, + (q31_t)0x3bc8135c, (q31_t)0x3fdc5edc, (q31_t)0x3bd49d70, (q31_t)0x3fdd31ac, + (q31_t)0x3be127ac, (q31_t)0x3fde0205, (q31_t)0x3bedb212, (q31_t)0x3fdecfe8, + (q31_t)0x3bfa3c9f, (q31_t)0x3fdf9b55, (q31_t)0x3c06c754, (q31_t)0x3fe0644b, + (q31_t)0x3c135231, (q31_t)0x3fe12acb, (q31_t)0x3c1fdd34, (q31_t)0x3fe1eed5, + (q31_t)0x3c2c685d, (q31_t)0x3fe2b067, (q31_t)0x3c38f3ac, (q31_t)0x3fe36f84, + (q31_t)0x3c457f21, (q31_t)0x3fe42c2a, (q31_t)0x3c520aba, (q31_t)0x3fe4e659, + (q31_t)0x3c5e9678, (q31_t)0x3fe59e12, (q31_t)0x3c6b2259, (q31_t)0x3fe65354, + (q31_t)0x3c77ae5e, (q31_t)0x3fe7061f, (q31_t)0x3c843a85, (q31_t)0x3fe7b674, + (q31_t)0x3c90c6cf, (q31_t)0x3fe86452, (q31_t)0x3c9d533b, (q31_t)0x3fe90fb9, + (q31_t)0x3ca9dfc8, (q31_t)0x3fe9b8a9, (q31_t)0x3cb66c77, (q31_t)0x3fea5f23, + (q31_t)0x3cc2f945, (q31_t)0x3feb0326, (q31_t)0x3ccf8634, (q31_t)0x3feba4b2, + (q31_t)0x3cdc1342, (q31_t)0x3fec43c7, (q31_t)0x3ce8a06f, (q31_t)0x3fece065, + (q31_t)0x3cf52dbb, (q31_t)0x3fed7a8c, (q31_t)0x3d01bb24, (q31_t)0x3fee123d, + (q31_t)0x3d0e48ab, (q31_t)0x3feea776, (q31_t)0x3d1ad650, (q31_t)0x3fef3a39, + (q31_t)0x3d276410, (q31_t)0x3fefca84, (q31_t)0x3d33f1ed, (q31_t)0x3ff05858, + (q31_t)0x3d407fe6, (q31_t)0x3ff0e3b6, (q31_t)0x3d4d0df9, (q31_t)0x3ff16c9c, + (q31_t)0x3d599c28, (q31_t)0x3ff1f30b, (q31_t)0x3d662a70, (q31_t)0x3ff27703, + (q31_t)0x3d72b8d2, (q31_t)0x3ff2f884, (q31_t)0x3d7f474d, (q31_t)0x3ff3778e, + (q31_t)0x3d8bd5e1, (q31_t)0x3ff3f420, (q31_t)0x3d98648d, (q31_t)0x3ff46e3c, + (q31_t)0x3da4f351, (q31_t)0x3ff4e5e0, (q31_t)0x3db1822c, (q31_t)0x3ff55b0d, + (q31_t)0x3dbe111e, (q31_t)0x3ff5cdc3, (q31_t)0x3dcaa027, (q31_t)0x3ff63e01, + (q31_t)0x3dd72f45, (q31_t)0x3ff6abc8, (q31_t)0x3de3be78, (q31_t)0x3ff71718, + (q31_t)0x3df04dc0, (q31_t)0x3ff77ff1, (q31_t)0x3dfcdd1d, (q31_t)0x3ff7e652, + (q31_t)0x3e096c8d, (q31_t)0x3ff84a3c, (q31_t)0x3e15fc11, (q31_t)0x3ff8abae, + (q31_t)0x3e228ba7, (q31_t)0x3ff90aaa, (q31_t)0x3e2f1b50, (q31_t)0x3ff9672d, + (q31_t)0x3e3bab0b, (q31_t)0x3ff9c13a, (q31_t)0x3e483ad8, (q31_t)0x3ffa18cf, + (q31_t)0x3e54cab5, (q31_t)0x3ffa6dec, (q31_t)0x3e615aa3, (q31_t)0x3ffac092, + (q31_t)0x3e6deaa1, (q31_t)0x3ffb10c1, (q31_t)0x3e7a7aae, (q31_t)0x3ffb5e78, + (q31_t)0x3e870aca, (q31_t)0x3ffba9b8, (q31_t)0x3e939af5, (q31_t)0x3ffbf280, + (q31_t)0x3ea02b2e, (q31_t)0x3ffc38d1, (q31_t)0x3eacbb74, (q31_t)0x3ffc7caa, + (q31_t)0x3eb94bc8, (q31_t)0x3ffcbe0c, (q31_t)0x3ec5dc28, (q31_t)0x3ffcfcf6, + (q31_t)0x3ed26c94, (q31_t)0x3ffd3969, (q31_t)0x3edefd0c, (q31_t)0x3ffd7364, + (q31_t)0x3eeb8d8f, (q31_t)0x3ffdaae7, (q31_t)0x3ef81e1d, (q31_t)0x3ffddff3, + (q31_t)0x3f04aeb5, (q31_t)0x3ffe1288, (q31_t)0x3f113f56, (q31_t)0x3ffe42a4, + (q31_t)0x3f1dd001, (q31_t)0x3ffe704a, (q31_t)0x3f2a60b4, (q31_t)0x3ffe9b77, + (q31_t)0x3f36f170, (q31_t)0x3ffec42d, (q31_t)0x3f438234, (q31_t)0x3ffeea6c, + (q31_t)0x3f5012fe, (q31_t)0x3fff0e32, (q31_t)0x3f5ca3d0, (q31_t)0x3fff2f82, + (q31_t)0x3f6934a8, (q31_t)0x3fff4e59, (q31_t)0x3f75c585, (q31_t)0x3fff6ab9, + (q31_t)0x3f825668, (q31_t)0x3fff84a1, (q31_t)0x3f8ee750, (q31_t)0x3fff9c12, + (q31_t)0x3f9b783c, (q31_t)0x3fffb10b, (q31_t)0x3fa8092c, (q31_t)0x3fffc38c, + (q31_t)0x3fb49a1f, (q31_t)0x3fffd396, (q31_t)0x3fc12b16, (q31_t)0x3fffe128, + (q31_t)0x3fcdbc0f, (q31_t)0x3fffec43, (q31_t)0x3fda4d09, (q31_t)0x3ffff4e6, + (q31_t)0x3fe6de05, (q31_t)0x3ffffb11, (q31_t)0x3ff36f02, (q31_t)0x3ffffec4, +}; + + +/** + @par + Generation of realCoefBQ31 array: + @par + n = 4096 +
for (i = 0; i < n; i++)
+  {
+     pBTable[2 * i]     = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));
+     pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
+  } 
+ @par + Convert to fixed point Q31 format + round(pBTable[i] * pow(2, 31)) + */ + +const q31_t realCoefBQ31[8192] = { + (q31_t)0x40000000, (q31_t)0x40000000, (q31_t)0x400c90fe, (q31_t)0x3ffffec4, + (q31_t)0x401921fb, (q31_t)0x3ffffb11, (q31_t)0x4025b2f7, (q31_t)0x3ffff4e6, + (q31_t)0x403243f1, (q31_t)0x3fffec43, (q31_t)0x403ed4ea, (q31_t)0x3fffe128, + (q31_t)0x404b65e1, (q31_t)0x3fffd396, (q31_t)0x4057f6d4, (q31_t)0x3fffc38c, + (q31_t)0x406487c4, (q31_t)0x3fffb10b, (q31_t)0x407118b0, (q31_t)0x3fff9c12, + (q31_t)0x407da998, (q31_t)0x3fff84a1, (q31_t)0x408a3a7b, (q31_t)0x3fff6ab9, + (q31_t)0x4096cb58, (q31_t)0x3fff4e59, (q31_t)0x40a35c30, (q31_t)0x3fff2f82, + (q31_t)0x40afed02, (q31_t)0x3fff0e32, (q31_t)0x40bc7dcc, (q31_t)0x3ffeea6c, + (q31_t)0x40c90e90, (q31_t)0x3ffec42d, (q31_t)0x40d59f4c, (q31_t)0x3ffe9b77, + (q31_t)0x40e22fff, (q31_t)0x3ffe704a, (q31_t)0x40eec0aa, (q31_t)0x3ffe42a4, + (q31_t)0x40fb514b, (q31_t)0x3ffe1288, (q31_t)0x4107e1e3, (q31_t)0x3ffddff3, + (q31_t)0x41147271, (q31_t)0x3ffdaae7, (q31_t)0x412102f4, (q31_t)0x3ffd7364, + (q31_t)0x412d936c, (q31_t)0x3ffd3969, (q31_t)0x413a23d8, (q31_t)0x3ffcfcf6, + (q31_t)0x4146b438, (q31_t)0x3ffcbe0c, (q31_t)0x4153448c, (q31_t)0x3ffc7caa, + (q31_t)0x415fd4d2, (q31_t)0x3ffc38d1, (q31_t)0x416c650b, (q31_t)0x3ffbf280, + (q31_t)0x4178f536, (q31_t)0x3ffba9b8, (q31_t)0x41858552, (q31_t)0x3ffb5e78, + (q31_t)0x4192155f, (q31_t)0x3ffb10c1, (q31_t)0x419ea55d, (q31_t)0x3ffac092, + (q31_t)0x41ab354b, (q31_t)0x3ffa6dec, (q31_t)0x41b7c528, (q31_t)0x3ffa18cf, + (q31_t)0x41c454f5, (q31_t)0x3ff9c13a, (q31_t)0x41d0e4b0, (q31_t)0x3ff9672d, + (q31_t)0x41dd7459, (q31_t)0x3ff90aaa, (q31_t)0x41ea03ef, (q31_t)0x3ff8abae, + (q31_t)0x41f69373, (q31_t)0x3ff84a3c, (q31_t)0x420322e3, (q31_t)0x3ff7e652, + (q31_t)0x420fb240, (q31_t)0x3ff77ff1, (q31_t)0x421c4188, (q31_t)0x3ff71718, + (q31_t)0x4228d0bb, (q31_t)0x3ff6abc8, (q31_t)0x42355fd9, (q31_t)0x3ff63e01, + (q31_t)0x4241eee2, (q31_t)0x3ff5cdc3, (q31_t)0x424e7dd4, (q31_t)0x3ff55b0d, + (q31_t)0x425b0caf, (q31_t)0x3ff4e5e0, (q31_t)0x42679b73, (q31_t)0x3ff46e3c, + (q31_t)0x42742a1f, (q31_t)0x3ff3f420, (q31_t)0x4280b8b3, (q31_t)0x3ff3778e, + (q31_t)0x428d472e, (q31_t)0x3ff2f884, (q31_t)0x4299d590, (q31_t)0x3ff27703, + (q31_t)0x42a663d8, (q31_t)0x3ff1f30b, (q31_t)0x42b2f207, (q31_t)0x3ff16c9c, + (q31_t)0x42bf801a, (q31_t)0x3ff0e3b6, (q31_t)0x42cc0e13, (q31_t)0x3ff05858, + (q31_t)0x42d89bf0, (q31_t)0x3fefca84, (q31_t)0x42e529b0, (q31_t)0x3fef3a39, + (q31_t)0x42f1b755, (q31_t)0x3feea776, (q31_t)0x42fe44dc, (q31_t)0x3fee123d, + (q31_t)0x430ad245, (q31_t)0x3fed7a8c, (q31_t)0x43175f91, (q31_t)0x3fece065, + (q31_t)0x4323ecbe, (q31_t)0x3fec43c7, (q31_t)0x433079cc, (q31_t)0x3feba4b2, + (q31_t)0x433d06bb, (q31_t)0x3feb0326, (q31_t)0x43499389, (q31_t)0x3fea5f23, + (q31_t)0x43562038, (q31_t)0x3fe9b8a9, (q31_t)0x4362acc5, (q31_t)0x3fe90fb9, + (q31_t)0x436f3931, (q31_t)0x3fe86452, (q31_t)0x437bc57b, (q31_t)0x3fe7b674, + (q31_t)0x438851a2, (q31_t)0x3fe7061f, (q31_t)0x4394dda7, (q31_t)0x3fe65354, + (q31_t)0x43a16988, (q31_t)0x3fe59e12, (q31_t)0x43adf546, (q31_t)0x3fe4e659, + (q31_t)0x43ba80df, (q31_t)0x3fe42c2a, (q31_t)0x43c70c54, (q31_t)0x3fe36f84, + (q31_t)0x43d397a3, (q31_t)0x3fe2b067, (q31_t)0x43e022cc, (q31_t)0x3fe1eed5, + (q31_t)0x43ecadcf, (q31_t)0x3fe12acb, (q31_t)0x43f938ac, (q31_t)0x3fe0644b, + (q31_t)0x4405c361, (q31_t)0x3fdf9b55, (q31_t)0x44124dee, (q31_t)0x3fdecfe8, + (q31_t)0x441ed854, (q31_t)0x3fde0205, (q31_t)0x442b6290, (q31_t)0x3fdd31ac, + (q31_t)0x4437eca4, (q31_t)0x3fdc5edc, (q31_t)0x4444768d, (q31_t)0x3fdb8996, + (q31_t)0x4451004d, (q31_t)0x3fdab1d9, (q31_t)0x445d89e2, (q31_t)0x3fd9d7a7, + (q31_t)0x446a134c, (q31_t)0x3fd8fafe, (q31_t)0x44769c8b, (q31_t)0x3fd81bdf, + (q31_t)0x4483259d, (q31_t)0x3fd73a4a, (q31_t)0x448fae83, (q31_t)0x3fd6563f, + (q31_t)0x449c373c, (q31_t)0x3fd56fbe, (q31_t)0x44a8bfc7, (q31_t)0x3fd486c7, + (q31_t)0x44b54825, (q31_t)0x3fd39b5a, (q31_t)0x44c1d054, (q31_t)0x3fd2ad77, + (q31_t)0x44ce5854, (q31_t)0x3fd1bd1e, (q31_t)0x44dae024, (q31_t)0x3fd0ca4f, + (q31_t)0x44e767c5, (q31_t)0x3fcfd50b, (q31_t)0x44f3ef35, (q31_t)0x3fcedd50, + (q31_t)0x45007674, (q31_t)0x3fcde320, (q31_t)0x450cfd82, (q31_t)0x3fcce67a, + (q31_t)0x4519845e, (q31_t)0x3fcbe75e, (q31_t)0x45260b08, (q31_t)0x3fcae5cd, + (q31_t)0x4532917f, (q31_t)0x3fc9e1c6, (q31_t)0x453f17c3, (q31_t)0x3fc8db4a, + (q31_t)0x454b9dd3, (q31_t)0x3fc7d258, (q31_t)0x455823ae, (q31_t)0x3fc6c6f0, + (q31_t)0x4564a955, (q31_t)0x3fc5b913, (q31_t)0x45712ec7, (q31_t)0x3fc4a8c1, + (q31_t)0x457db403, (q31_t)0x3fc395f9, (q31_t)0x458a3908, (q31_t)0x3fc280bc, + (q31_t)0x4596bdd7, (q31_t)0x3fc1690a, (q31_t)0x45a3426f, (q31_t)0x3fc04ee3, + (q31_t)0x45afc6d0, (q31_t)0x3fbf3246, (q31_t)0x45bc4af8, (q31_t)0x3fbe1334, + (q31_t)0x45c8cee7, (q31_t)0x3fbcf1ad, (q31_t)0x45d5529e, (q31_t)0x3fbbcdb1, + (q31_t)0x45e1d61b, (q31_t)0x3fbaa740, (q31_t)0x45ee595d, (q31_t)0x3fb97e5a, + (q31_t)0x45fadc66, (q31_t)0x3fb852ff, (q31_t)0x46075f33, (q31_t)0x3fb7252f, + (q31_t)0x4613e1c5, (q31_t)0x3fb5f4ea, (q31_t)0x4620641a, (q31_t)0x3fb4c231, + (q31_t)0x462ce634, (q31_t)0x3fb38d02, (q31_t)0x46396810, (q31_t)0x3fb2555f, + (q31_t)0x4645e9af, (q31_t)0x3fb11b48, (q31_t)0x46526b10, (q31_t)0x3fafdebb, + (q31_t)0x465eec33, (q31_t)0x3fae9fbb, (q31_t)0x466b6d16, (q31_t)0x3fad5e45, + (q31_t)0x4677edbb, (q31_t)0x3fac1a5b, (q31_t)0x46846e1f, (q31_t)0x3faad3fd, + (q31_t)0x4690ee44, (q31_t)0x3fa98b2a, (q31_t)0x469d6e27, (q31_t)0x3fa83fe3, + (q31_t)0x46a9edc9, (q31_t)0x3fa6f228, (q31_t)0x46b66d29, (q31_t)0x3fa5a1f9, + (q31_t)0x46c2ec48, (q31_t)0x3fa44f55, (q31_t)0x46cf6b23, (q31_t)0x3fa2fa3d, + (q31_t)0x46dbe9bb, (q31_t)0x3fa1a2b2, (q31_t)0x46e86810, (q31_t)0x3fa048b2, + (q31_t)0x46f4e620, (q31_t)0x3f9eec3e, (q31_t)0x470163eb, (q31_t)0x3f9d8d56, + (q31_t)0x470de172, (q31_t)0x3f9c2bfb, (q31_t)0x471a5eb3, (q31_t)0x3f9ac82c, + (q31_t)0x4726dbae, (q31_t)0x3f9961e8, (q31_t)0x47335862, (q31_t)0x3f97f932, + (q31_t)0x473fd4cf, (q31_t)0x3f968e07, (q31_t)0x474c50f4, (q31_t)0x3f952069, + (q31_t)0x4758ccd2, (q31_t)0x3f93b058, (q31_t)0x47654867, (q31_t)0x3f923dd2, + (q31_t)0x4771c3b3, (q31_t)0x3f90c8da, (q31_t)0x477e3eb5, (q31_t)0x3f8f516e, + (q31_t)0x478ab96e, (q31_t)0x3f8dd78f, (q31_t)0x479733dc, (q31_t)0x3f8c5b3d, + (q31_t)0x47a3adff, (q31_t)0x3f8adc77, (q31_t)0x47b027d7, (q31_t)0x3f895b3e, + (q31_t)0x47bca163, (q31_t)0x3f87d792, (q31_t)0x47c91aa3, (q31_t)0x3f865174, + (q31_t)0x47d59396, (q31_t)0x3f84c8e2, (q31_t)0x47e20c3b, (q31_t)0x3f833ddd, + (q31_t)0x47ee8493, (q31_t)0x3f81b065, (q31_t)0x47fafc9c, (q31_t)0x3f80207b, + (q31_t)0x48077457, (q31_t)0x3f7e8e1e, (q31_t)0x4813ebc2, (q31_t)0x3f7cf94e, + (q31_t)0x482062de, (q31_t)0x3f7b620c, (q31_t)0x482cd9a9, (q31_t)0x3f79c857, + (q31_t)0x48395024, (q31_t)0x3f782c30, (q31_t)0x4845c64d, (q31_t)0x3f768d96, + (q31_t)0x48523c25, (q31_t)0x3f74ec8a, (q31_t)0x485eb1ab, (q31_t)0x3f73490b, + (q31_t)0x486b26de, (q31_t)0x3f71a31b, (q31_t)0x48779bbe, (q31_t)0x3f6ffab8, + (q31_t)0x4884104b, (q31_t)0x3f6e4fe3, (q31_t)0x48908483, (q31_t)0x3f6ca29c, + (q31_t)0x489cf867, (q31_t)0x3f6af2e3, (q31_t)0x48a96bf6, (q31_t)0x3f6940b8, + (q31_t)0x48b5df30, (q31_t)0x3f678c1c, (q31_t)0x48c25213, (q31_t)0x3f65d50d, + (q31_t)0x48cec4a0, (q31_t)0x3f641b8d, (q31_t)0x48db36d6, (q31_t)0x3f625f9b, + (q31_t)0x48e7a8b5, (q31_t)0x3f60a138, (q31_t)0x48f41a3c, (q31_t)0x3f5ee063, + (q31_t)0x49008b6a, (q31_t)0x3f5d1d1d, (q31_t)0x490cfc40, (q31_t)0x3f5b5765, + (q31_t)0x49196cbc, (q31_t)0x3f598f3c, (q31_t)0x4925dcdf, (q31_t)0x3f57c4a2, + (q31_t)0x49324ca7, (q31_t)0x3f55f796, (q31_t)0x493ebc14, (q31_t)0x3f54281a, + (q31_t)0x494b2b27, (q31_t)0x3f52562c, (q31_t)0x495799dd, (q31_t)0x3f5081cd, + (q31_t)0x49640837, (q31_t)0x3f4eaafe, (q31_t)0x49707635, (q31_t)0x3f4cd1be, + (q31_t)0x497ce3d5, (q31_t)0x3f4af60d, (q31_t)0x49895118, (q31_t)0x3f4917eb, + (q31_t)0x4995bdfd, (q31_t)0x3f473759, (q31_t)0x49a22a83, (q31_t)0x3f455456, + (q31_t)0x49ae96aa, (q31_t)0x3f436ee3, (q31_t)0x49bb0271, (q31_t)0x3f4186ff, + (q31_t)0x49c76dd8, (q31_t)0x3f3f9cab, (q31_t)0x49d3d8df, (q31_t)0x3f3dafe7, + (q31_t)0x49e04385, (q31_t)0x3f3bc0b3, (q31_t)0x49ecadc9, (q31_t)0x3f39cf0e, + (q31_t)0x49f917ac, (q31_t)0x3f37dafa, (q31_t)0x4a05812c, (q31_t)0x3f35e476, + (q31_t)0x4a11ea49, (q31_t)0x3f33eb81, (q31_t)0x4a1e5303, (q31_t)0x3f31f01d, + (q31_t)0x4a2abb59, (q31_t)0x3f2ff24a, (q31_t)0x4a37234a, (q31_t)0x3f2df206, + (q31_t)0x4a438ad7, (q31_t)0x3f2bef53, (q31_t)0x4a4ff1fe, (q31_t)0x3f29ea31, + (q31_t)0x4a5c58c0, (q31_t)0x3f27e29f, (q31_t)0x4a68bf1b, (q31_t)0x3f25d89e, + (q31_t)0x4a752510, (q31_t)0x3f23cc2e, (q31_t)0x4a818a9d, (q31_t)0x3f21bd4e, + (q31_t)0x4a8defc3, (q31_t)0x3f1fabff, (q31_t)0x4a9a5480, (q31_t)0x3f1d9842, + (q31_t)0x4aa6b8d5, (q31_t)0x3f1b8215, (q31_t)0x4ab31cc1, (q31_t)0x3f19697a, + (q31_t)0x4abf8043, (q31_t)0x3f174e70, (q31_t)0x4acbe35b, (q31_t)0x3f1530f7, + (q31_t)0x4ad84609, (q31_t)0x3f13110f, (q31_t)0x4ae4a84b, (q31_t)0x3f10eeb9, + (q31_t)0x4af10a22, (q31_t)0x3f0ec9f5, (q31_t)0x4afd6b8d, (q31_t)0x3f0ca2c2, + (q31_t)0x4b09cc8c, (q31_t)0x3f0a7921, (q31_t)0x4b162d1d, (q31_t)0x3f084d12, + (q31_t)0x4b228d42, (q31_t)0x3f061e95, (q31_t)0x4b2eecf8, (q31_t)0x3f03eda9, + (q31_t)0x4b3b4c40, (q31_t)0x3f01ba50, (q31_t)0x4b47ab19, (q31_t)0x3eff8489, + (q31_t)0x4b540982, (q31_t)0x3efd4c54, (q31_t)0x4b60677c, (q31_t)0x3efb11b1, + (q31_t)0x4b6cc506, (q31_t)0x3ef8d4a1, (q31_t)0x4b79221f, (q31_t)0x3ef69523, + (q31_t)0x4b857ec7, (q31_t)0x3ef45338, (q31_t)0x4b91dafc, (q31_t)0x3ef20ee0, + (q31_t)0x4b9e36c0, (q31_t)0x3eefc81a, (q31_t)0x4baa9211, (q31_t)0x3eed7ee7, + (q31_t)0x4bb6ecef, (q31_t)0x3eeb3347, (q31_t)0x4bc34759, (q31_t)0x3ee8e53a, + (q31_t)0x4bcfa150, (q31_t)0x3ee694c1, (q31_t)0x4bdbfad1, (q31_t)0x3ee441da, + (q31_t)0x4be853de, (q31_t)0x3ee1ec87, (q31_t)0x4bf4ac75, (q31_t)0x3edf94c7, + (q31_t)0x4c010496, (q31_t)0x3edd3a9a, (q31_t)0x4c0d5c41, (q31_t)0x3edade01, + (q31_t)0x4c19b374, (q31_t)0x3ed87efc, (q31_t)0x4c260a31, (q31_t)0x3ed61d8a, + (q31_t)0x4c326075, (q31_t)0x3ed3b9ad, (q31_t)0x4c3eb641, (q31_t)0x3ed15363, + (q31_t)0x4c4b0b94, (q31_t)0x3eceeaad, (q31_t)0x4c57606e, (q31_t)0x3ecc7f8b, + (q31_t)0x4c63b4ce, (q31_t)0x3eca11fe, (q31_t)0x4c7008b3, (q31_t)0x3ec7a205, + (q31_t)0x4c7c5c1e, (q31_t)0x3ec52fa0, (q31_t)0x4c88af0e, (q31_t)0x3ec2bad0, + (q31_t)0x4c950182, (q31_t)0x3ec04394, (q31_t)0x4ca1537a, (q31_t)0x3ebdc9ed, + (q31_t)0x4cada4f5, (q31_t)0x3ebb4ddb, (q31_t)0x4cb9f5f3, (q31_t)0x3eb8cf5d, + (q31_t)0x4cc64673, (q31_t)0x3eb64e75, (q31_t)0x4cd29676, (q31_t)0x3eb3cb21, + (q31_t)0x4cdee5f9, (q31_t)0x3eb14563, (q31_t)0x4ceb34fe, (q31_t)0x3eaebd3a, + (q31_t)0x4cf78383, (q31_t)0x3eac32a6, (q31_t)0x4d03d189, (q31_t)0x3ea9a5a8, + (q31_t)0x4d101f0e, (q31_t)0x3ea7163f, (q31_t)0x4d1c6c11, (q31_t)0x3ea4846c, + (q31_t)0x4d28b894, (q31_t)0x3ea1f02f, (q31_t)0x4d350495, (q31_t)0x3e9f5988, + (q31_t)0x4d415013, (q31_t)0x3e9cc076, (q31_t)0x4d4d9b0e, (q31_t)0x3e9a24fb, + (q31_t)0x4d59e586, (q31_t)0x3e978715, (q31_t)0x4d662f7b, (q31_t)0x3e94e6c6, + (q31_t)0x4d7278eb, (q31_t)0x3e92440d, (q31_t)0x4d7ec1d6, (q31_t)0x3e8f9eeb, + (q31_t)0x4d8b0a3d, (q31_t)0x3e8cf75f, (q31_t)0x4d97521d, (q31_t)0x3e8a4d6a, + (q31_t)0x4da39978, (q31_t)0x3e87a10c, (q31_t)0x4dafe04b, (q31_t)0x3e84f245, + (q31_t)0x4dbc2698, (q31_t)0x3e824114, (q31_t)0x4dc86c5d, (q31_t)0x3e7f8d7b, + (q31_t)0x4dd4b19a, (q31_t)0x3e7cd778, (q31_t)0x4de0f64f, (q31_t)0x3e7a1f0d, + (q31_t)0x4ded3a7b, (q31_t)0x3e77643a, (q31_t)0x4df97e1d, (q31_t)0x3e74a6fd, + (q31_t)0x4e05c135, (q31_t)0x3e71e759, (q31_t)0x4e1203c3, (q31_t)0x3e6f254c, + (q31_t)0x4e1e45c6, (q31_t)0x3e6c60d7, (q31_t)0x4e2a873e, (q31_t)0x3e6999fa, + (q31_t)0x4e36c82a, (q31_t)0x3e66d0b4, (q31_t)0x4e430889, (q31_t)0x3e640507, + (q31_t)0x4e4f485c, (q31_t)0x3e6136f3, (q31_t)0x4e5b87a2, (q31_t)0x3e5e6676, + (q31_t)0x4e67c65a, (q31_t)0x3e5b9392, (q31_t)0x4e740483, (q31_t)0x3e58be47, + (q31_t)0x4e80421e, (q31_t)0x3e55e694, (q31_t)0x4e8c7f2a, (q31_t)0x3e530c7a, + (q31_t)0x4e98bba7, (q31_t)0x3e502ff9, (q31_t)0x4ea4f793, (q31_t)0x3e4d5110, + (q31_t)0x4eb132ef, (q31_t)0x3e4a6fc1, (q31_t)0x4ebd6db9, (q31_t)0x3e478c0b, + (q31_t)0x4ec9a7f3, (q31_t)0x3e44a5ef, (q31_t)0x4ed5e19a, (q31_t)0x3e41bd6c, + (q31_t)0x4ee21aaf, (q31_t)0x3e3ed282, (q31_t)0x4eee5331, (q31_t)0x3e3be532, + (q31_t)0x4efa8b20, (q31_t)0x3e38f57c, (q31_t)0x4f06c27a, (q31_t)0x3e360360, + (q31_t)0x4f12f941, (q31_t)0x3e330ede, (q31_t)0x4f1f2f73, (q31_t)0x3e3017f6, + (q31_t)0x4f2b650f, (q31_t)0x3e2d1ea8, (q31_t)0x4f379a16, (q31_t)0x3e2a22f4, + (q31_t)0x4f43ce86, (q31_t)0x3e2724db, (q31_t)0x4f500260, (q31_t)0x3e24245d, + (q31_t)0x4f5c35a3, (q31_t)0x3e212179, (q31_t)0x4f68684e, (q31_t)0x3e1e1c30, + (q31_t)0x4f749a61, (q31_t)0x3e1b1482, (q31_t)0x4f80cbdc, (q31_t)0x3e180a6f, + (q31_t)0x4f8cfcbe, (q31_t)0x3e14fdf7, (q31_t)0x4f992d06, (q31_t)0x3e11ef1b, + (q31_t)0x4fa55cb4, (q31_t)0x3e0eddd9, (q31_t)0x4fb18bc8, (q31_t)0x3e0bca34, + (q31_t)0x4fbdba40, (q31_t)0x3e08b42a, (q31_t)0x4fc9e81e, (q31_t)0x3e059bbb, + (q31_t)0x4fd6155f, (q31_t)0x3e0280e9, (q31_t)0x4fe24205, (q31_t)0x3dff63b2, + (q31_t)0x4fee6e0d, (q31_t)0x3dfc4418, (q31_t)0x4ffa9979, (q31_t)0x3df9221a, + (q31_t)0x5006c446, (q31_t)0x3df5fdb8, (q31_t)0x5012ee76, (q31_t)0x3df2d6f3, + (q31_t)0x501f1807, (q31_t)0x3defadca, (q31_t)0x502b40f8, (q31_t)0x3dec823e, + (q31_t)0x5037694b, (q31_t)0x3de9544f, (q31_t)0x504390fd, (q31_t)0x3de623fd, + (q31_t)0x504fb80e, (q31_t)0x3de2f148, (q31_t)0x505bde7f, (q31_t)0x3ddfbc30, + (q31_t)0x5068044e, (q31_t)0x3ddc84b5, (q31_t)0x5074297b, (q31_t)0x3dd94ad8, + (q31_t)0x50804e06, (q31_t)0x3dd60e99, (q31_t)0x508c71ee, (q31_t)0x3dd2cff7, + (q31_t)0x50989532, (q31_t)0x3dcf8ef3, (q31_t)0x50a4b7d3, (q31_t)0x3dcc4b8d, + (q31_t)0x50b0d9d0, (q31_t)0x3dc905c5, (q31_t)0x50bcfb28, (q31_t)0x3dc5bd9b, + (q31_t)0x50c91bda, (q31_t)0x3dc2730f, (q31_t)0x50d53be7, (q31_t)0x3dbf2622, + (q31_t)0x50e15b4e, (q31_t)0x3dbbd6d4, (q31_t)0x50ed7a0e, (q31_t)0x3db88524, + (q31_t)0x50f99827, (q31_t)0x3db53113, (q31_t)0x5105b599, (q31_t)0x3db1daa2, + (q31_t)0x5111d263, (q31_t)0x3dae81cf, (q31_t)0x511dee84, (q31_t)0x3dab269b, + (q31_t)0x512a09fc, (q31_t)0x3da7c907, (q31_t)0x513624cb, (q31_t)0x3da46912, + (q31_t)0x51423ef0, (q31_t)0x3da106bd, (q31_t)0x514e586a, (q31_t)0x3d9da208, + (q31_t)0x515a713a, (q31_t)0x3d9a3af2, (q31_t)0x5166895f, (q31_t)0x3d96d17d, + (q31_t)0x5172a0d7, (q31_t)0x3d9365a8, (q31_t)0x517eb7a4, (q31_t)0x3d8ff772, + (q31_t)0x518acdc4, (q31_t)0x3d8c86de, (q31_t)0x5196e337, (q31_t)0x3d8913ea, + (q31_t)0x51a2f7fc, (q31_t)0x3d859e96, (q31_t)0x51af0c13, (q31_t)0x3d8226e4, + (q31_t)0x51bb1f7c, (q31_t)0x3d7eacd2, (q31_t)0x51c73235, (q31_t)0x3d7b3061, + (q31_t)0x51d3443f, (q31_t)0x3d77b192, (q31_t)0x51df5599, (q31_t)0x3d743064, + (q31_t)0x51eb6643, (q31_t)0x3d70acd7, (q31_t)0x51f7763c, (q31_t)0x3d6d26ec, + (q31_t)0x52038584, (q31_t)0x3d699ea3, (q31_t)0x520f941a, (q31_t)0x3d6613fb, + (q31_t)0x521ba1fd, (q31_t)0x3d6286f6, (q31_t)0x5227af2e, (q31_t)0x3d5ef793, + (q31_t)0x5233bbac, (q31_t)0x3d5b65d2, (q31_t)0x523fc776, (q31_t)0x3d57d1b3, + (q31_t)0x524bd28c, (q31_t)0x3d543b37, (q31_t)0x5257dced, (q31_t)0x3d50a25e, + (q31_t)0x5263e699, (q31_t)0x3d4d0728, (q31_t)0x526fef90, (q31_t)0x3d496994, + (q31_t)0x527bf7d1, (q31_t)0x3d45c9a4, (q31_t)0x5287ff5b, (q31_t)0x3d422757, + (q31_t)0x5294062f, (q31_t)0x3d3e82ae, (q31_t)0x52a00c4b, (q31_t)0x3d3adba7, + (q31_t)0x52ac11af, (q31_t)0x3d373245, (q31_t)0x52b8165b, (q31_t)0x3d338687, + (q31_t)0x52c41a4f, (q31_t)0x3d2fd86c, (q31_t)0x52d01d89, (q31_t)0x3d2c27f6, + (q31_t)0x52dc2009, (q31_t)0x3d287523, (q31_t)0x52e821cf, (q31_t)0x3d24bff6, + (q31_t)0x52f422db, (q31_t)0x3d21086c, (q31_t)0x5300232c, (q31_t)0x3d1d4e88, + (q31_t)0x530c22c1, (q31_t)0x3d199248, (q31_t)0x5318219a, (q31_t)0x3d15d3ad, + (q31_t)0x53241fb6, (q31_t)0x3d1212b7, (q31_t)0x53301d16, (q31_t)0x3d0e4f67, + (q31_t)0x533c19b8, (q31_t)0x3d0a89bc, (q31_t)0x5348159d, (q31_t)0x3d06c1b6, + (q31_t)0x535410c3, (q31_t)0x3d02f757, (q31_t)0x53600b2a, (q31_t)0x3cff2a9d, + (q31_t)0x536c04d2, (q31_t)0x3cfb5b89, (q31_t)0x5377fdbb, (q31_t)0x3cf78a1b, + (q31_t)0x5383f5e3, (q31_t)0x3cf3b653, (q31_t)0x538fed4b, (q31_t)0x3cefe032, + (q31_t)0x539be3f2, (q31_t)0x3cec07b8, (q31_t)0x53a7d9d7, (q31_t)0x3ce82ce4, + (q31_t)0x53b3cefa, (q31_t)0x3ce44fb7, (q31_t)0x53bfc35b, (q31_t)0x3ce07031, + (q31_t)0x53cbb6f8, (q31_t)0x3cdc8e52, (q31_t)0x53d7a9d3, (q31_t)0x3cd8aa1b, + (q31_t)0x53e39be9, (q31_t)0x3cd4c38b, (q31_t)0x53ef8d3c, (q31_t)0x3cd0daa2, + (q31_t)0x53fb7dc9, (q31_t)0x3cccef62, (q31_t)0x54076d91, (q31_t)0x3cc901c9, + (q31_t)0x54135c94, (q31_t)0x3cc511d9, (q31_t)0x541f4ad1, (q31_t)0x3cc11f90, + (q31_t)0x542b3846, (q31_t)0x3cbd2af0, (q31_t)0x543724f5, (q31_t)0x3cb933f9, + (q31_t)0x544310dd, (q31_t)0x3cb53aaa, (q31_t)0x544efbfc, (q31_t)0x3cb13f04, + (q31_t)0x545ae653, (q31_t)0x3cad4107, (q31_t)0x5466cfe1, (q31_t)0x3ca940b3, + (q31_t)0x5472b8a5, (q31_t)0x3ca53e09, (q31_t)0x547ea0a0, (q31_t)0x3ca13908, + (q31_t)0x548a87d1, (q31_t)0x3c9d31b0, (q31_t)0x54966e36, (q31_t)0x3c992803, + (q31_t)0x54a253d1, (q31_t)0x3c951bff, (q31_t)0x54ae38a0, (q31_t)0x3c910da5, + (q31_t)0x54ba1ca3, (q31_t)0x3c8cfcf6, (q31_t)0x54c5ffd9, (q31_t)0x3c88e9f1, + (q31_t)0x54d1e242, (q31_t)0x3c84d496, (q31_t)0x54ddc3de, (q31_t)0x3c80bce7, + (q31_t)0x54e9a4ac, (q31_t)0x3c7ca2e2, (q31_t)0x54f584ac, (q31_t)0x3c788688, + (q31_t)0x550163dc, (q31_t)0x3c7467d9, (q31_t)0x550d423d, (q31_t)0x3c7046d6, + (q31_t)0x55191fcf, (q31_t)0x3c6c237e, (q31_t)0x5524fc90, (q31_t)0x3c67fdd1, + (q31_t)0x5530d881, (q31_t)0x3c63d5d1, (q31_t)0x553cb3a0, (q31_t)0x3c5fab7c, + (q31_t)0x55488dee, (q31_t)0x3c5b7ed4, (q31_t)0x5554676a, (q31_t)0x3c574fd8, + (q31_t)0x55604013, (q31_t)0x3c531e88, (q31_t)0x556c17e9, (q31_t)0x3c4eeae5, + (q31_t)0x5577eeec, (q31_t)0x3c4ab4ef, (q31_t)0x5583c51b, (q31_t)0x3c467ca6, + (q31_t)0x558f9a76, (q31_t)0x3c42420a, (q31_t)0x559b6efb, (q31_t)0x3c3e051b, + (q31_t)0x55a742ac, (q31_t)0x3c39c5da, (q31_t)0x55b31587, (q31_t)0x3c358446, + (q31_t)0x55bee78c, (q31_t)0x3c314060, (q31_t)0x55cab8ba, (q31_t)0x3c2cfa28, + (q31_t)0x55d68911, (q31_t)0x3c28b19e, (q31_t)0x55e25890, (q31_t)0x3c2466c2, + (q31_t)0x55ee2738, (q31_t)0x3c201994, (q31_t)0x55f9f507, (q31_t)0x3c1bca16, + (q31_t)0x5605c1fd, (q31_t)0x3c177845, (q31_t)0x56118e1a, (q31_t)0x3c132424, + (q31_t)0x561d595d, (q31_t)0x3c0ecdb2, (q31_t)0x562923c5, (q31_t)0x3c0a74f0, + (q31_t)0x5634ed53, (q31_t)0x3c0619dc, (q31_t)0x5640b606, (q31_t)0x3c01bc78, + (q31_t)0x564c7ddd, (q31_t)0x3bfd5cc4, (q31_t)0x565844d8, (q31_t)0x3bf8fac0, + (q31_t)0x56640af7, (q31_t)0x3bf4966c, (q31_t)0x566fd039, (q31_t)0x3bf02fc9, + (q31_t)0x567b949d, (q31_t)0x3bebc6d5, (q31_t)0x56875823, (q31_t)0x3be75b93, + (q31_t)0x56931acb, (q31_t)0x3be2ee01, (q31_t)0x569edc94, (q31_t)0x3bde7e20, + (q31_t)0x56aa9d7e, (q31_t)0x3bda0bf0, (q31_t)0x56b65d88, (q31_t)0x3bd59771, + (q31_t)0x56c21cb2, (q31_t)0x3bd120a4, (q31_t)0x56cddafb, (q31_t)0x3bcca789, + (q31_t)0x56d99864, (q31_t)0x3bc82c1f, (q31_t)0x56e554ea, (q31_t)0x3bc3ae67, + (q31_t)0x56f1108f, (q31_t)0x3bbf2e62, (q31_t)0x56fccb51, (q31_t)0x3bbaac0e, + (q31_t)0x57088531, (q31_t)0x3bb6276e, (q31_t)0x57143e2d, (q31_t)0x3bb1a080, + (q31_t)0x571ff646, (q31_t)0x3bad1744, (q31_t)0x572bad7a, (q31_t)0x3ba88bbc, + (q31_t)0x573763c9, (q31_t)0x3ba3fde7, (q31_t)0x57431933, (q31_t)0x3b9f6dc5, + (q31_t)0x574ecdb8, (q31_t)0x3b9adb57, (q31_t)0x575a8157, (q31_t)0x3b96469d, + (q31_t)0x5766340f, (q31_t)0x3b91af97, (q31_t)0x5771e5e0, (q31_t)0x3b8d1644, + (q31_t)0x577d96ca, (q31_t)0x3b887aa6, (q31_t)0x578946cc, (q31_t)0x3b83dcbc, + (q31_t)0x5794f5e6, (q31_t)0x3b7f3c87, (q31_t)0x57a0a417, (q31_t)0x3b7a9a07, + (q31_t)0x57ac515f, (q31_t)0x3b75f53c, (q31_t)0x57b7fdbd, (q31_t)0x3b714e25, + (q31_t)0x57c3a931, (q31_t)0x3b6ca4c4, (q31_t)0x57cf53bb, (q31_t)0x3b67f919, + (q31_t)0x57dafd59, (q31_t)0x3b634b23, (q31_t)0x57e6a60c, (q31_t)0x3b5e9ae4, + (q31_t)0x57f24dd3, (q31_t)0x3b59e85a, (q31_t)0x57fdf4ae, (q31_t)0x3b553386, + (q31_t)0x58099a9c, (q31_t)0x3b507c69, (q31_t)0x58153f9d, (q31_t)0x3b4bc303, + (q31_t)0x5820e3b0, (q31_t)0x3b470753, (q31_t)0x582c86d5, (q31_t)0x3b42495a, + (q31_t)0x5838290c, (q31_t)0x3b3d8918, (q31_t)0x5843ca53, (q31_t)0x3b38c68e, + (q31_t)0x584f6aab, (q31_t)0x3b3401bb, (q31_t)0x585b0a13, (q31_t)0x3b2f3aa0, + (q31_t)0x5866a88a, (q31_t)0x3b2a713d, (q31_t)0x58724611, (q31_t)0x3b25a591, + (q31_t)0x587de2a7, (q31_t)0x3b20d79e, (q31_t)0x58897e4a, (q31_t)0x3b1c0764, + (q31_t)0x589518fc, (q31_t)0x3b1734e2, (q31_t)0x58a0b2bb, (q31_t)0x3b126019, + (q31_t)0x58ac4b87, (q31_t)0x3b0d8909, (q31_t)0x58b7e35f, (q31_t)0x3b08afb2, + (q31_t)0x58c37a44, (q31_t)0x3b03d414, (q31_t)0x58cf1034, (q31_t)0x3afef630, + (q31_t)0x58daa52f, (q31_t)0x3afa1605, (q31_t)0x58e63935, (q31_t)0x3af53395, + (q31_t)0x58f1cc45, (q31_t)0x3af04edf, (q31_t)0x58fd5e5f, (q31_t)0x3aeb67e3, + (q31_t)0x5908ef82, (q31_t)0x3ae67ea1, (q31_t)0x59147fae, (q31_t)0x3ae1931a, + (q31_t)0x59200ee3, (q31_t)0x3adca54e, (q31_t)0x592b9d1f, (q31_t)0x3ad7b53d, + (q31_t)0x59372a64, (q31_t)0x3ad2c2e8, (q31_t)0x5942b6af, (q31_t)0x3acdce4d, + (q31_t)0x594e4201, (q31_t)0x3ac8d76f, (q31_t)0x5959cc5a, (q31_t)0x3ac3de4c, + (q31_t)0x596555b8, (q31_t)0x3abee2e5, (q31_t)0x5970de1b, (q31_t)0x3ab9e53a, + (q31_t)0x597c6584, (q31_t)0x3ab4e54c, (q31_t)0x5987ebf0, (q31_t)0x3aafe31b, + (q31_t)0x59937161, (q31_t)0x3aaadea6, (q31_t)0x599ef5d6, (q31_t)0x3aa5d7ee, + (q31_t)0x59aa794d, (q31_t)0x3aa0cef3, (q31_t)0x59b5fbc8, (q31_t)0x3a9bc3b6, + (q31_t)0x59c17d44, (q31_t)0x3a96b636, (q31_t)0x59ccfdc2, (q31_t)0x3a91a674, + (q31_t)0x59d87d42, (q31_t)0x3a8c9470, (q31_t)0x59e3fbc3, (q31_t)0x3a87802a, + (q31_t)0x59ef7944, (q31_t)0x3a8269a3, (q31_t)0x59faf5c5, (q31_t)0x3a7d50da, + (q31_t)0x5a067145, (q31_t)0x3a7835cf, (q31_t)0x5a11ebc5, (q31_t)0x3a731884, + (q31_t)0x5a1d6544, (q31_t)0x3a6df8f8, (q31_t)0x5a28ddc0, (q31_t)0x3a68d72b, + (q31_t)0x5a34553b, (q31_t)0x3a63b31d, (q31_t)0x5a3fcbb3, (q31_t)0x3a5e8cd0, + (q31_t)0x5a4b4128, (q31_t)0x3a596442, (q31_t)0x5a56b599, (q31_t)0x3a543974, + (q31_t)0x5a622907, (q31_t)0x3a4f0c67, (q31_t)0x5a6d9b70, (q31_t)0x3a49dd1a, + (q31_t)0x5a790cd4, (q31_t)0x3a44ab8e, (q31_t)0x5a847d33, (q31_t)0x3a3f77c3, + (q31_t)0x5a8fec8c, (q31_t)0x3a3a41b9, (q31_t)0x5a9b5adf, (q31_t)0x3a350970, + (q31_t)0x5aa6c82b, (q31_t)0x3a2fcee8, (q31_t)0x5ab23471, (q31_t)0x3a2a9223, + (q31_t)0x5abd9faf, (q31_t)0x3a25531f, (q31_t)0x5ac909e5, (q31_t)0x3a2011de, + (q31_t)0x5ad47312, (q31_t)0x3a1ace5f, (q31_t)0x5adfdb37, (q31_t)0x3a1588a2, + (q31_t)0x5aeb4253, (q31_t)0x3a1040a8, (q31_t)0x5af6a865, (q31_t)0x3a0af671, + (q31_t)0x5b020d6c, (q31_t)0x3a05a9fd, (q31_t)0x5b0d716a, (q31_t)0x3a005b4d, + (q31_t)0x5b18d45c, (q31_t)0x39fb0a60, (q31_t)0x5b243643, (q31_t)0x39f5b737, + (q31_t)0x5b2f971e, (q31_t)0x39f061d2, (q31_t)0x5b3af6ec, (q31_t)0x39eb0a31, + (q31_t)0x5b4655ae, (q31_t)0x39e5b054, (q31_t)0x5b51b363, (q31_t)0x39e0543c, + (q31_t)0x5b5d100a, (q31_t)0x39daf5e8, (q31_t)0x5b686ba3, (q31_t)0x39d5955a, + (q31_t)0x5b73c62d, (q31_t)0x39d03291, (q31_t)0x5b7f1fa9, (q31_t)0x39cacd8d, + (q31_t)0x5b8a7815, (q31_t)0x39c5664f, (q31_t)0x5b95cf71, (q31_t)0x39bffcd7, + (q31_t)0x5ba125bd, (q31_t)0x39ba9125, (q31_t)0x5bac7af9, (q31_t)0x39b52339, + (q31_t)0x5bb7cf23, (q31_t)0x39afb313, (q31_t)0x5bc3223c, (q31_t)0x39aa40b4, + (q31_t)0x5bce7442, (q31_t)0x39a4cc1c, (q31_t)0x5bd9c537, (q31_t)0x399f554b, + (q31_t)0x5be51518, (q31_t)0x3999dc42, (q31_t)0x5bf063e6, (q31_t)0x399460ff, + (q31_t)0x5bfbb1a0, (q31_t)0x398ee385, (q31_t)0x5c06fe46, (q31_t)0x398963d2, + (q31_t)0x5c1249d8, (q31_t)0x3983e1e8, (q31_t)0x5c1d9454, (q31_t)0x397e5dc6, + (q31_t)0x5c28ddbb, (q31_t)0x3978d76c, (q31_t)0x5c34260c, (q31_t)0x39734edc, + (q31_t)0x5c3f6d47, (q31_t)0x396dc414, (q31_t)0x5c4ab36b, (q31_t)0x39683715, + (q31_t)0x5c55f878, (q31_t)0x3962a7e0, (q31_t)0x5c613c6d, (q31_t)0x395d1675, + (q31_t)0x5c6c7f4a, (q31_t)0x395782d3, (q31_t)0x5c77c10e, (q31_t)0x3951ecfc, + (q31_t)0x5c8301b9, (q31_t)0x394c54ee, (q31_t)0x5c8e414b, (q31_t)0x3946baac, + (q31_t)0x5c997fc4, (q31_t)0x39411e33, (q31_t)0x5ca4bd21, (q31_t)0x393b7f86, + (q31_t)0x5caff965, (q31_t)0x3935dea4, (q31_t)0x5cbb348d, (q31_t)0x39303b8e, + (q31_t)0x5cc66e99, (q31_t)0x392a9642, (q31_t)0x5cd1a78a, (q31_t)0x3924eec3, + (q31_t)0x5cdcdf5e, (q31_t)0x391f4510, (q31_t)0x5ce81615, (q31_t)0x39199929, + (q31_t)0x5cf34baf, (q31_t)0x3913eb0e, (q31_t)0x5cfe802b, (q31_t)0x390e3ac0, + (q31_t)0x5d09b389, (q31_t)0x3908883f, (q31_t)0x5d14e5c9, (q31_t)0x3902d38b, + (q31_t)0x5d2016e9, (q31_t)0x38fd1ca4, (q31_t)0x5d2b46ea, (q31_t)0x38f7638b, + (q31_t)0x5d3675cb, (q31_t)0x38f1a840, (q31_t)0x5d41a38c, (q31_t)0x38ebeac2, + (q31_t)0x5d4cd02c, (q31_t)0x38e62b13, (q31_t)0x5d57fbaa, (q31_t)0x38e06932, + (q31_t)0x5d632608, (q31_t)0x38daa520, (q31_t)0x5d6e4f43, (q31_t)0x38d4dedd, + (q31_t)0x5d79775c, (q31_t)0x38cf1669, (q31_t)0x5d849e51, (q31_t)0x38c94bc4, + (q31_t)0x5d8fc424, (q31_t)0x38c37eef, (q31_t)0x5d9ae8d2, (q31_t)0x38bdafea, + (q31_t)0x5da60c5d, (q31_t)0x38b7deb4, (q31_t)0x5db12ec3, (q31_t)0x38b20b4f, + (q31_t)0x5dbc5004, (q31_t)0x38ac35ba, (q31_t)0x5dc7701f, (q31_t)0x38a65df6, + (q31_t)0x5dd28f15, (q31_t)0x38a08402, (q31_t)0x5dddace4, (q31_t)0x389aa7e0, + (q31_t)0x5de8c98c, (q31_t)0x3894c98f, (q31_t)0x5df3e50d, (q31_t)0x388ee910, + (q31_t)0x5dfeff67, (q31_t)0x38890663, (q31_t)0x5e0a1898, (q31_t)0x38832187, + (q31_t)0x5e1530a1, (q31_t)0x387d3a7e, (q31_t)0x5e204781, (q31_t)0x38775147, + (q31_t)0x5e2b5d38, (q31_t)0x387165e3, (q31_t)0x5e3671c5, (q31_t)0x386b7852, + (q31_t)0x5e418528, (q31_t)0x38658894, (q31_t)0x5e4c9760, (q31_t)0x385f96a9, + (q31_t)0x5e57a86d, (q31_t)0x3859a292, (q31_t)0x5e62b84f, (q31_t)0x3853ac4f, + (q31_t)0x5e6dc705, (q31_t)0x384db3e0, (q31_t)0x5e78d48e, (q31_t)0x3847b946, + (q31_t)0x5e83e0eb, (q31_t)0x3841bc7f, (q31_t)0x5e8eec1b, (q31_t)0x383bbd8e, + (q31_t)0x5e99f61d, (q31_t)0x3835bc71, (q31_t)0x5ea4fef0, (q31_t)0x382fb92a, + (q31_t)0x5eb00696, (q31_t)0x3829b3b9, (q31_t)0x5ebb0d0d, (q31_t)0x3823ac1d, + (q31_t)0x5ec61254, (q31_t)0x381da256, (q31_t)0x5ed1166b, (q31_t)0x38179666, + (q31_t)0x5edc1953, (q31_t)0x3811884d, (q31_t)0x5ee71b0a, (q31_t)0x380b780a, + (q31_t)0x5ef21b90, (q31_t)0x3805659e, (q31_t)0x5efd1ae4, (q31_t)0x37ff5109, + (q31_t)0x5f081907, (q31_t)0x37f93a4b, (q31_t)0x5f1315f7, (q31_t)0x37f32165, + (q31_t)0x5f1e11b5, (q31_t)0x37ed0657, (q31_t)0x5f290c3f, (q31_t)0x37e6e921, + (q31_t)0x5f340596, (q31_t)0x37e0c9c3, (q31_t)0x5f3efdb9, (q31_t)0x37daa83d, + (q31_t)0x5f49f4a8, (q31_t)0x37d48490, (q31_t)0x5f54ea62, (q31_t)0x37ce5ebd, + (q31_t)0x5f5fdee6, (q31_t)0x37c836c2, (q31_t)0x5f6ad235, (q31_t)0x37c20ca1, + (q31_t)0x5f75c44e, (q31_t)0x37bbe05a, (q31_t)0x5f80b531, (q31_t)0x37b5b1ec, + (q31_t)0x5f8ba4dc, (q31_t)0x37af8159, (q31_t)0x5f969350, (q31_t)0x37a94ea0, + (q31_t)0x5fa1808c, (q31_t)0x37a319c2, (q31_t)0x5fac6c91, (q31_t)0x379ce2be, + (q31_t)0x5fb7575c, (q31_t)0x3796a996, (q31_t)0x5fc240ef, (q31_t)0x37906e49, + (q31_t)0x5fcd2948, (q31_t)0x378a30d8, (q31_t)0x5fd81067, (q31_t)0x3783f143, + (q31_t)0x5fe2f64c, (q31_t)0x377daf89, (q31_t)0x5feddaf6, (q31_t)0x37776bac, + (q31_t)0x5ff8be65, (q31_t)0x377125ac, (q31_t)0x6003a099, (q31_t)0x376add88, + (q31_t)0x600e8190, (q31_t)0x37649341, (q31_t)0x6019614c, (q31_t)0x375e46d8, + (q31_t)0x60243fca, (q31_t)0x3757f84c, (q31_t)0x602f1d0b, (q31_t)0x3751a79e, + (q31_t)0x6039f90f, (q31_t)0x374b54ce, (q31_t)0x6044d3d4, (q31_t)0x3744ffdd, + (q31_t)0x604fad5b, (q31_t)0x373ea8ca, (q31_t)0x605a85a3, (q31_t)0x37384f95, + (q31_t)0x60655cac, (q31_t)0x3731f440, (q31_t)0x60703275, (q31_t)0x372b96ca, + (q31_t)0x607b06fe, (q31_t)0x37253733, (q31_t)0x6085da46, (q31_t)0x371ed57c, + (q31_t)0x6090ac4d, (q31_t)0x371871a5, (q31_t)0x609b7d13, (q31_t)0x37120bae, + (q31_t)0x60a64c97, (q31_t)0x370ba398, (q31_t)0x60b11ad9, (q31_t)0x37053962, + (q31_t)0x60bbe7d8, (q31_t)0x36fecd0e, (q31_t)0x60c6b395, (q31_t)0x36f85e9a, + (q31_t)0x60d17e0d, (q31_t)0x36f1ee09, (q31_t)0x60dc4742, (q31_t)0x36eb7b58, + (q31_t)0x60e70f32, (q31_t)0x36e5068a, (q31_t)0x60f1d5de, (q31_t)0x36de8f9e, + (q31_t)0x60fc9b44, (q31_t)0x36d81695, (q31_t)0x61075f65, (q31_t)0x36d19b6e, + (q31_t)0x61122240, (q31_t)0x36cb1e2a, (q31_t)0x611ce3d5, (q31_t)0x36c49ec9, + (q31_t)0x6127a423, (q31_t)0x36be1d4c, (q31_t)0x61326329, (q31_t)0x36b799b3, + (q31_t)0x613d20e8, (q31_t)0x36b113fd, (q31_t)0x6147dd5f, (q31_t)0x36aa8c2c, + (q31_t)0x6152988d, (q31_t)0x36a4023f, (q31_t)0x615d5273, (q31_t)0x369d7637, + (q31_t)0x61680b0f, (q31_t)0x3696e814, (q31_t)0x6172c262, (q31_t)0x369057d6, + (q31_t)0x617d786a, (q31_t)0x3689c57d, (q31_t)0x61882d28, (q31_t)0x3683310b, + (q31_t)0x6192e09b, (q31_t)0x367c9a7e, (q31_t)0x619d92c2, (q31_t)0x367601d7, + (q31_t)0x61a8439e, (q31_t)0x366f6717, (q31_t)0x61b2f32e, (q31_t)0x3668ca3e, + (q31_t)0x61bda171, (q31_t)0x36622b4c, (q31_t)0x61c84e67, (q31_t)0x365b8a41, + (q31_t)0x61d2fa0f, (q31_t)0x3654e71d, (q31_t)0x61dda46a, (q31_t)0x364e41e2, + (q31_t)0x61e84d76, (q31_t)0x36479a8e, (q31_t)0x61f2f534, (q31_t)0x3640f123, + (q31_t)0x61fd9ba3, (q31_t)0x363a45a0, (q31_t)0x620840c2, (q31_t)0x36339806, + (q31_t)0x6212e492, (q31_t)0x362ce855, (q31_t)0x621d8711, (q31_t)0x3626368d, + (q31_t)0x6228283f, (q31_t)0x361f82af, (q31_t)0x6232c81c, (q31_t)0x3618ccba, + (q31_t)0x623d66a8, (q31_t)0x361214b0, (q31_t)0x624803e2, (q31_t)0x360b5a90, + (q31_t)0x62529fca, (q31_t)0x36049e5b, (q31_t)0x625d3a5e, (q31_t)0x35fde011, + (q31_t)0x6267d3a0, (q31_t)0x35f71fb1, (q31_t)0x62726b8e, (q31_t)0x35f05d3d, + (q31_t)0x627d0228, (q31_t)0x35e998b5, (q31_t)0x6287976e, (q31_t)0x35e2d219, + (q31_t)0x62922b5e, (q31_t)0x35dc0968, (q31_t)0x629cbdfa, (q31_t)0x35d53ea5, + (q31_t)0x62a74f40, (q31_t)0x35ce71ce, (q31_t)0x62b1df30, (q31_t)0x35c7a2e3, + (q31_t)0x62bc6dca, (q31_t)0x35c0d1e7, (q31_t)0x62c6fb0c, (q31_t)0x35b9fed7, + (q31_t)0x62d186f8, (q31_t)0x35b329b5, (q31_t)0x62dc118c, (q31_t)0x35ac5282, + (q31_t)0x62e69ac8, (q31_t)0x35a5793c, (q31_t)0x62f122ab, (q31_t)0x359e9de5, + (q31_t)0x62fba936, (q31_t)0x3597c07d, (q31_t)0x63062e67, (q31_t)0x3590e104, + (q31_t)0x6310b23e, (q31_t)0x3589ff7a, (q31_t)0x631b34bc, (q31_t)0x35831be0, + (q31_t)0x6325b5df, (q31_t)0x357c3636, (q31_t)0x633035a7, (q31_t)0x35754e7c, + (q31_t)0x633ab414, (q31_t)0x356e64b2, (q31_t)0x63453125, (q31_t)0x356778d9, + (q31_t)0x634facda, (q31_t)0x35608af1, (q31_t)0x635a2733, (q31_t)0x35599afa, + (q31_t)0x6364a02e, (q31_t)0x3552a8f4, (q31_t)0x636f17cc, (q31_t)0x354bb4e1, + (q31_t)0x63798e0d, (q31_t)0x3544bebf, (q31_t)0x638402ef, (q31_t)0x353dc68f, + (q31_t)0x638e7673, (q31_t)0x3536cc52, (q31_t)0x6398e898, (q31_t)0x352fd008, + (q31_t)0x63a3595e, (q31_t)0x3528d1b1, (q31_t)0x63adc8c4, (q31_t)0x3521d14d, + (q31_t)0x63b836ca, (q31_t)0x351acedd, (q31_t)0x63c2a36f, (q31_t)0x3513ca60, + (q31_t)0x63cd0eb3, (q31_t)0x350cc3d8, (q31_t)0x63d77896, (q31_t)0x3505bb44, + (q31_t)0x63e1e117, (q31_t)0x34feb0a5, (q31_t)0x63ec4837, (q31_t)0x34f7a3fb, + (q31_t)0x63f6adf3, (q31_t)0x34f09546, (q31_t)0x6401124d, (q31_t)0x34e98487, + (q31_t)0x640b7543, (q31_t)0x34e271bd, (q31_t)0x6415d6d5, (q31_t)0x34db5cea, + (q31_t)0x64203704, (q31_t)0x34d4460c, (q31_t)0x642a95ce, (q31_t)0x34cd2d26, + (q31_t)0x6434f332, (q31_t)0x34c61236, (q31_t)0x643f4f32, (q31_t)0x34bef53d, + (q31_t)0x6449a9cc, (q31_t)0x34b7d63c, (q31_t)0x645402ff, (q31_t)0x34b0b533, + (q31_t)0x645e5acc, (q31_t)0x34a99221, (q31_t)0x6468b132, (q31_t)0x34a26d08, + (q31_t)0x64730631, (q31_t)0x349b45e7, (q31_t)0x647d59c8, (q31_t)0x34941cbf, + (q31_t)0x6487abf7, (q31_t)0x348cf190, (q31_t)0x6491fcbe, (q31_t)0x3485c45b, + (q31_t)0x649c4c1b, (q31_t)0x347e951f, (q31_t)0x64a69a0f, (q31_t)0x347763dd, + (q31_t)0x64b0e699, (q31_t)0x34703095, (q31_t)0x64bb31ba, (q31_t)0x3468fb47, + (q31_t)0x64c57b6f, (q31_t)0x3461c3f5, (q31_t)0x64cfc3ba, (q31_t)0x345a8a9d, + (q31_t)0x64da0a9a, (q31_t)0x34534f41, (q31_t)0x64e4500e, (q31_t)0x344c11e0, + (q31_t)0x64ee9415, (q31_t)0x3444d27b, (q31_t)0x64f8d6b0, (q31_t)0x343d9112, + (q31_t)0x650317df, (q31_t)0x34364da6, (q31_t)0x650d57a0, (q31_t)0x342f0836, + (q31_t)0x651795f3, (q31_t)0x3427c0c3, (q31_t)0x6521d2d8, (q31_t)0x3420774d, + (q31_t)0x652c0e4f, (q31_t)0x34192bd5, (q31_t)0x65364857, (q31_t)0x3411de5b, + (q31_t)0x654080ef, (q31_t)0x340a8edf, (q31_t)0x654ab818, (q31_t)0x34033d61, + (q31_t)0x6554edd1, (q31_t)0x33fbe9e2, (q31_t)0x655f2219, (q31_t)0x33f49462, + (q31_t)0x656954f1, (q31_t)0x33ed3ce1, (q31_t)0x65738657, (q31_t)0x33e5e360, + (q31_t)0x657db64c, (q31_t)0x33de87de, (q31_t)0x6587e4cf, (q31_t)0x33d72a5d, + (q31_t)0x659211df, (q31_t)0x33cfcadc, (q31_t)0x659c3d7c, (q31_t)0x33c8695b, + (q31_t)0x65a667a7, (q31_t)0x33c105db, (q31_t)0x65b0905d, (q31_t)0x33b9a05d, + (q31_t)0x65bab7a0, (q31_t)0x33b238e0, (q31_t)0x65c4dd6e, (q31_t)0x33aacf65, + (q31_t)0x65cf01c8, (q31_t)0x33a363ec, (q31_t)0x65d924ac, (q31_t)0x339bf675, + (q31_t)0x65e3461b, (q31_t)0x33948701, (q31_t)0x65ed6614, (q31_t)0x338d1590, + (q31_t)0x65f78497, (q31_t)0x3385a222, (q31_t)0x6601a1a2, (q31_t)0x337e2cb7, + (q31_t)0x660bbd37, (q31_t)0x3376b551, (q31_t)0x6615d754, (q31_t)0x336f3bee, + (q31_t)0x661feffa, (q31_t)0x3367c090, (q31_t)0x662a0727, (q31_t)0x33604336, + (q31_t)0x66341cdb, (q31_t)0x3358c3e2, (q31_t)0x663e3117, (q31_t)0x33514292, + (q31_t)0x664843d9, (q31_t)0x3349bf48, (q31_t)0x66525521, (q31_t)0x33423a04, + (q31_t)0x665c64ef, (q31_t)0x333ab2c6, (q31_t)0x66667342, (q31_t)0x3333298f, + (q31_t)0x6670801a, (q31_t)0x332b9e5e, (q31_t)0x667a8b77, (q31_t)0x33241134, + (q31_t)0x66849558, (q31_t)0x331c8211, (q31_t)0x668e9dbd, (q31_t)0x3314f0f6, + (q31_t)0x6698a4a6, (q31_t)0x330d5de3, (q31_t)0x66a2aa11, (q31_t)0x3305c8d7, + (q31_t)0x66acadff, (q31_t)0x32fe31d5, (q31_t)0x66b6b070, (q31_t)0x32f698db, + (q31_t)0x66c0b162, (q31_t)0x32eefdea, (q31_t)0x66cab0d6, (q31_t)0x32e76102, + (q31_t)0x66d4aecb, (q31_t)0x32dfc224, (q31_t)0x66deab41, (q31_t)0x32d82150, + (q31_t)0x66e8a637, (q31_t)0x32d07e85, (q31_t)0x66f29fad, (q31_t)0x32c8d9c6, + (q31_t)0x66fc97a3, (q31_t)0x32c13311, (q31_t)0x67068e18, (q31_t)0x32b98a67, + (q31_t)0x6710830c, (q31_t)0x32b1dfc9, (q31_t)0x671a767e, (q31_t)0x32aa3336, + (q31_t)0x6724686e, (q31_t)0x32a284b0, (q31_t)0x672e58dc, (q31_t)0x329ad435, + (q31_t)0x673847c8, (q31_t)0x329321c7, (q31_t)0x67423530, (q31_t)0x328b6d66, + (q31_t)0x674c2115, (q31_t)0x3283b712, (q31_t)0x67560b76, (q31_t)0x327bfecc, + (q31_t)0x675ff452, (q31_t)0x32744493, (q31_t)0x6769dbaa, (q31_t)0x326c8868, + (q31_t)0x6773c17d, (q31_t)0x3264ca4c, (q31_t)0x677da5cb, (q31_t)0x325d0a3e, + (q31_t)0x67878893, (q31_t)0x32554840, (q31_t)0x679169d5, (q31_t)0x324d8450, + (q31_t)0x679b4990, (q31_t)0x3245be70, (q31_t)0x67a527c4, (q31_t)0x323df6a0, + (q31_t)0x67af0472, (q31_t)0x32362ce0, (q31_t)0x67b8df97, (q31_t)0x322e6130, + (q31_t)0x67c2b934, (q31_t)0x32269391, (q31_t)0x67cc9149, (q31_t)0x321ec403, + (q31_t)0x67d667d5, (q31_t)0x3216f287, (q31_t)0x67e03cd8, (q31_t)0x320f1f1c, + (q31_t)0x67ea1052, (q31_t)0x320749c3, (q31_t)0x67f3e241, (q31_t)0x31ff727c, + (q31_t)0x67fdb2a7, (q31_t)0x31f79948, (q31_t)0x68078181, (q31_t)0x31efbe27, + (q31_t)0x68114ed0, (q31_t)0x31e7e118, (q31_t)0x681b1a94, (q31_t)0x31e0021e, + (q31_t)0x6824e4cc, (q31_t)0x31d82137, (q31_t)0x682ead78, (q31_t)0x31d03e64, + (q31_t)0x68387498, (q31_t)0x31c859a5, (q31_t)0x68423a2a, (q31_t)0x31c072fb, + (q31_t)0x684bfe2f, (q31_t)0x31b88a66, (q31_t)0x6855c0a6, (q31_t)0x31b09fe7, + (q31_t)0x685f8190, (q31_t)0x31a8b37c, (q31_t)0x686940ea, (q31_t)0x31a0c528, + (q31_t)0x6872feb6, (q31_t)0x3198d4ea, (q31_t)0x687cbaf3, (q31_t)0x3190e2c3, + (q31_t)0x688675a0, (q31_t)0x3188eeb2, (q31_t)0x68902ebd, (q31_t)0x3180f8b8, + (q31_t)0x6899e64a, (q31_t)0x317900d6, (q31_t)0x68a39c46, (q31_t)0x3171070c, + (q31_t)0x68ad50b1, (q31_t)0x31690b59, (q31_t)0x68b7038b, (q31_t)0x31610dbf, + (q31_t)0x68c0b4d2, (q31_t)0x31590e3e, (q31_t)0x68ca6488, (q31_t)0x31510cd5, + (q31_t)0x68d412ab, (q31_t)0x31490986, (q31_t)0x68ddbf3b, (q31_t)0x31410450, + (q31_t)0x68e76a37, (q31_t)0x3138fd35, (q31_t)0x68f113a0, (q31_t)0x3130f433, + (q31_t)0x68fabb75, (q31_t)0x3128e94c, (q31_t)0x690461b5, (q31_t)0x3120dc80, + (q31_t)0x690e0661, (q31_t)0x3118cdcf, (q31_t)0x6917a977, (q31_t)0x3110bd39, + (q31_t)0x69214af8, (q31_t)0x3108aabf, (q31_t)0x692aeae3, (q31_t)0x31009661, + (q31_t)0x69348937, (q31_t)0x30f8801f, (q31_t)0x693e25f5, (q31_t)0x30f067fb, + (q31_t)0x6947c11c, (q31_t)0x30e84df3, (q31_t)0x69515aab, (q31_t)0x30e03208, + (q31_t)0x695af2a3, (q31_t)0x30d8143b, (q31_t)0x69648902, (q31_t)0x30cff48c, + (q31_t)0x696e1dc9, (q31_t)0x30c7d2fb, (q31_t)0x6977b0f7, (q31_t)0x30bfaf89, + (q31_t)0x6981428c, (q31_t)0x30b78a36, (q31_t)0x698ad287, (q31_t)0x30af6302, + (q31_t)0x699460e8, (q31_t)0x30a739ed, (q31_t)0x699dedaf, (q31_t)0x309f0ef8, + (q31_t)0x69a778db, (q31_t)0x3096e223, (q31_t)0x69b1026c, (q31_t)0x308eb36f, + (q31_t)0x69ba8a61, (q31_t)0x308682dc, (q31_t)0x69c410ba, (q31_t)0x307e5069, + (q31_t)0x69cd9578, (q31_t)0x30761c18, (q31_t)0x69d71899, (q31_t)0x306de5e9, + (q31_t)0x69e09a1c, (q31_t)0x3065addb, (q31_t)0x69ea1a03, (q31_t)0x305d73f0, + (q31_t)0x69f3984c, (q31_t)0x30553828, (q31_t)0x69fd14f6, (q31_t)0x304cfa83, + (q31_t)0x6a069003, (q31_t)0x3044bb00, (q31_t)0x6a100970, (q31_t)0x303c79a2, + (q31_t)0x6a19813f, (q31_t)0x30343667, (q31_t)0x6a22f76e, (q31_t)0x302bf151, + (q31_t)0x6a2c6bfd, (q31_t)0x3023aa5f, (q31_t)0x6a35deeb, (q31_t)0x301b6193, + (q31_t)0x6a3f503a, (q31_t)0x301316eb, (q31_t)0x6a48bfe7, (q31_t)0x300aca69, + (q31_t)0x6a522df3, (q31_t)0x30027c0c, (q31_t)0x6a5b9a5d, (q31_t)0x2ffa2bd6, + (q31_t)0x6a650525, (q31_t)0x2ff1d9c7, (q31_t)0x6a6e6e4b, (q31_t)0x2fe985de, + (q31_t)0x6a77d5ce, (q31_t)0x2fe1301c, (q31_t)0x6a813bae, (q31_t)0x2fd8d882, + (q31_t)0x6a8a9fea, (q31_t)0x2fd07f0f, (q31_t)0x6a940283, (q31_t)0x2fc823c5, + (q31_t)0x6a9d6377, (q31_t)0x2fbfc6a3, (q31_t)0x6aa6c2c6, (q31_t)0x2fb767aa, + (q31_t)0x6ab02071, (q31_t)0x2faf06da, (q31_t)0x6ab97c77, (q31_t)0x2fa6a433, + (q31_t)0x6ac2d6d6, (q31_t)0x2f9e3fb6, (q31_t)0x6acc2f90, (q31_t)0x2f95d963, + (q31_t)0x6ad586a3, (q31_t)0x2f8d713a, (q31_t)0x6adedc10, (q31_t)0x2f85073c, + (q31_t)0x6ae82fd5, (q31_t)0x2f7c9b69, (q31_t)0x6af181f3, (q31_t)0x2f742dc1, + (q31_t)0x6afad269, (q31_t)0x2f6bbe45, (q31_t)0x6b042137, (q31_t)0x2f634cf5, + (q31_t)0x6b0d6e5c, (q31_t)0x2f5ad9d1, (q31_t)0x6b16b9d9, (q31_t)0x2f5264da, + (q31_t)0x6b2003ac, (q31_t)0x2f49ee0f, (q31_t)0x6b294bd5, (q31_t)0x2f417573, + (q31_t)0x6b329255, (q31_t)0x2f38fb03, (q31_t)0x6b3bd72a, (q31_t)0x2f307ec2, + (q31_t)0x6b451a55, (q31_t)0x2f2800af, (q31_t)0x6b4e5bd4, (q31_t)0x2f1f80ca, + (q31_t)0x6b579ba8, (q31_t)0x2f16ff14, (q31_t)0x6b60d9d0, (q31_t)0x2f0e7b8e, + (q31_t)0x6b6a164d, (q31_t)0x2f05f637, (q31_t)0x6b73511c, (q31_t)0x2efd6f10, + (q31_t)0x6b7c8a3f, (q31_t)0x2ef4e619, (q31_t)0x6b85c1b5, (q31_t)0x2eec5b53, + (q31_t)0x6b8ef77d, (q31_t)0x2ee3cebe, (q31_t)0x6b982b97, (q31_t)0x2edb405a, + (q31_t)0x6ba15e03, (q31_t)0x2ed2b027, (q31_t)0x6baa8ec0, (q31_t)0x2eca1e27, + (q31_t)0x6bb3bdce, (q31_t)0x2ec18a58, (q31_t)0x6bbceb2d, (q31_t)0x2eb8f4bc, + (q31_t)0x6bc616dd, (q31_t)0x2eb05d53, (q31_t)0x6bcf40dc, (q31_t)0x2ea7c41e, + (q31_t)0x6bd8692b, (q31_t)0x2e9f291b, (q31_t)0x6be18fc9, (q31_t)0x2e968c4d, + (q31_t)0x6beab4b6, (q31_t)0x2e8dedb3, (q31_t)0x6bf3d7f2, (q31_t)0x2e854d4d, + (q31_t)0x6bfcf97c, (q31_t)0x2e7cab1c, (q31_t)0x6c061953, (q31_t)0x2e740720, + (q31_t)0x6c0f3779, (q31_t)0x2e6b615a, (q31_t)0x6c1853eb, (q31_t)0x2e62b9ca, + (q31_t)0x6c216eaa, (q31_t)0x2e5a1070, (q31_t)0x6c2a87b6, (q31_t)0x2e51654c, + (q31_t)0x6c339f0e, (q31_t)0x2e48b860, (q31_t)0x6c3cb4b1, (q31_t)0x2e4009aa, + (q31_t)0x6c45c8a0, (q31_t)0x2e37592c, (q31_t)0x6c4edada, (q31_t)0x2e2ea6e6, + (q31_t)0x6c57eb5e, (q31_t)0x2e25f2d8, (q31_t)0x6c60fa2d, (q31_t)0x2e1d3d03, + (q31_t)0x6c6a0746, (q31_t)0x2e148566, (q31_t)0x6c7312a9, (q31_t)0x2e0bcc03, + (q31_t)0x6c7c1c55, (q31_t)0x2e0310d9, (q31_t)0x6c85244a, (q31_t)0x2dfa53e9, + (q31_t)0x6c8e2a87, (q31_t)0x2df19534, (q31_t)0x6c972f0d, (q31_t)0x2de8d4b8, + (q31_t)0x6ca031da, (q31_t)0x2de01278, (q31_t)0x6ca932ef, (q31_t)0x2dd74e73, + (q31_t)0x6cb2324c, (q31_t)0x2dce88aa, (q31_t)0x6cbb2fef, (q31_t)0x2dc5c11c, + (q31_t)0x6cc42bd9, (q31_t)0x2dbcf7cb, (q31_t)0x6ccd2609, (q31_t)0x2db42cb6, + (q31_t)0x6cd61e7f, (q31_t)0x2dab5fdf, (q31_t)0x6cdf153a, (q31_t)0x2da29144, + (q31_t)0x6ce80a3a, (q31_t)0x2d99c0e7, (q31_t)0x6cf0fd80, (q31_t)0x2d90eec8, + (q31_t)0x6cf9ef09, (q31_t)0x2d881ae8, (q31_t)0x6d02ded7, (q31_t)0x2d7f4545, + (q31_t)0x6d0bcce8, (q31_t)0x2d766de2, (q31_t)0x6d14b93d, (q31_t)0x2d6d94bf, + (q31_t)0x6d1da3d5, (q31_t)0x2d64b9da, (q31_t)0x6d268cb0, (q31_t)0x2d5bdd36, + (q31_t)0x6d2f73cd, (q31_t)0x2d52fed2, (q31_t)0x6d38592c, (q31_t)0x2d4a1eaf, + (q31_t)0x6d413ccd, (q31_t)0x2d413ccd, (q31_t)0x6d4a1eaf, (q31_t)0x2d38592c, + (q31_t)0x6d52fed2, (q31_t)0x2d2f73cd, (q31_t)0x6d5bdd36, (q31_t)0x2d268cb0, + (q31_t)0x6d64b9da, (q31_t)0x2d1da3d5, (q31_t)0x6d6d94bf, (q31_t)0x2d14b93d, + (q31_t)0x6d766de2, (q31_t)0x2d0bcce8, (q31_t)0x6d7f4545, (q31_t)0x2d02ded7, + (q31_t)0x6d881ae8, (q31_t)0x2cf9ef09, (q31_t)0x6d90eec8, (q31_t)0x2cf0fd80, + (q31_t)0x6d99c0e7, (q31_t)0x2ce80a3a, (q31_t)0x6da29144, (q31_t)0x2cdf153a, + (q31_t)0x6dab5fdf, (q31_t)0x2cd61e7f, (q31_t)0x6db42cb6, (q31_t)0x2ccd2609, + (q31_t)0x6dbcf7cb, (q31_t)0x2cc42bd9, (q31_t)0x6dc5c11c, (q31_t)0x2cbb2fef, + (q31_t)0x6dce88aa, (q31_t)0x2cb2324c, (q31_t)0x6dd74e73, (q31_t)0x2ca932ef, + (q31_t)0x6de01278, (q31_t)0x2ca031da, (q31_t)0x6de8d4b8, (q31_t)0x2c972f0d, + (q31_t)0x6df19534, (q31_t)0x2c8e2a87, (q31_t)0x6dfa53e9, (q31_t)0x2c85244a, + (q31_t)0x6e0310d9, (q31_t)0x2c7c1c55, (q31_t)0x6e0bcc03, (q31_t)0x2c7312a9, + (q31_t)0x6e148566, (q31_t)0x2c6a0746, (q31_t)0x6e1d3d03, (q31_t)0x2c60fa2d, + (q31_t)0x6e25f2d8, (q31_t)0x2c57eb5e, (q31_t)0x6e2ea6e6, (q31_t)0x2c4edada, + (q31_t)0x6e37592c, (q31_t)0x2c45c8a0, (q31_t)0x6e4009aa, (q31_t)0x2c3cb4b1, + (q31_t)0x6e48b860, (q31_t)0x2c339f0e, (q31_t)0x6e51654c, (q31_t)0x2c2a87b6, + (q31_t)0x6e5a1070, (q31_t)0x2c216eaa, (q31_t)0x6e62b9ca, (q31_t)0x2c1853eb, + (q31_t)0x6e6b615a, (q31_t)0x2c0f3779, (q31_t)0x6e740720, (q31_t)0x2c061953, + (q31_t)0x6e7cab1c, (q31_t)0x2bfcf97c, (q31_t)0x6e854d4d, (q31_t)0x2bf3d7f2, + (q31_t)0x6e8dedb3, (q31_t)0x2beab4b6, (q31_t)0x6e968c4d, (q31_t)0x2be18fc9, + (q31_t)0x6e9f291b, (q31_t)0x2bd8692b, (q31_t)0x6ea7c41e, (q31_t)0x2bcf40dc, + (q31_t)0x6eb05d53, (q31_t)0x2bc616dd, (q31_t)0x6eb8f4bc, (q31_t)0x2bbceb2d, + (q31_t)0x6ec18a58, (q31_t)0x2bb3bdce, (q31_t)0x6eca1e27, (q31_t)0x2baa8ec0, + (q31_t)0x6ed2b027, (q31_t)0x2ba15e03, (q31_t)0x6edb405a, (q31_t)0x2b982b97, + (q31_t)0x6ee3cebe, (q31_t)0x2b8ef77d, (q31_t)0x6eec5b53, (q31_t)0x2b85c1b5, + (q31_t)0x6ef4e619, (q31_t)0x2b7c8a3f, (q31_t)0x6efd6f10, (q31_t)0x2b73511c, + (q31_t)0x6f05f637, (q31_t)0x2b6a164d, (q31_t)0x6f0e7b8e, (q31_t)0x2b60d9d0, + (q31_t)0x6f16ff14, (q31_t)0x2b579ba8, (q31_t)0x6f1f80ca, (q31_t)0x2b4e5bd4, + (q31_t)0x6f2800af, (q31_t)0x2b451a55, (q31_t)0x6f307ec2, (q31_t)0x2b3bd72a, + (q31_t)0x6f38fb03, (q31_t)0x2b329255, (q31_t)0x6f417573, (q31_t)0x2b294bd5, + (q31_t)0x6f49ee0f, (q31_t)0x2b2003ac, (q31_t)0x6f5264da, (q31_t)0x2b16b9d9, + (q31_t)0x6f5ad9d1, (q31_t)0x2b0d6e5c, (q31_t)0x6f634cf5, (q31_t)0x2b042137, + (q31_t)0x6f6bbe45, (q31_t)0x2afad269, (q31_t)0x6f742dc1, (q31_t)0x2af181f3, + (q31_t)0x6f7c9b69, (q31_t)0x2ae82fd5, (q31_t)0x6f85073c, (q31_t)0x2adedc10, + (q31_t)0x6f8d713a, (q31_t)0x2ad586a3, (q31_t)0x6f95d963, (q31_t)0x2acc2f90, + (q31_t)0x6f9e3fb6, (q31_t)0x2ac2d6d6, (q31_t)0x6fa6a433, (q31_t)0x2ab97c77, + (q31_t)0x6faf06da, (q31_t)0x2ab02071, (q31_t)0x6fb767aa, (q31_t)0x2aa6c2c6, + (q31_t)0x6fbfc6a3, (q31_t)0x2a9d6377, (q31_t)0x6fc823c5, (q31_t)0x2a940283, + (q31_t)0x6fd07f0f, (q31_t)0x2a8a9fea, (q31_t)0x6fd8d882, (q31_t)0x2a813bae, + (q31_t)0x6fe1301c, (q31_t)0x2a77d5ce, (q31_t)0x6fe985de, (q31_t)0x2a6e6e4b, + (q31_t)0x6ff1d9c7, (q31_t)0x2a650525, (q31_t)0x6ffa2bd6, (q31_t)0x2a5b9a5d, + (q31_t)0x70027c0c, (q31_t)0x2a522df3, (q31_t)0x700aca69, (q31_t)0x2a48bfe7, + (q31_t)0x701316eb, (q31_t)0x2a3f503a, (q31_t)0x701b6193, (q31_t)0x2a35deeb, + (q31_t)0x7023aa5f, (q31_t)0x2a2c6bfd, (q31_t)0x702bf151, (q31_t)0x2a22f76e, + (q31_t)0x70343667, (q31_t)0x2a19813f, (q31_t)0x703c79a2, (q31_t)0x2a100970, + (q31_t)0x7044bb00, (q31_t)0x2a069003, (q31_t)0x704cfa83, (q31_t)0x29fd14f6, + (q31_t)0x70553828, (q31_t)0x29f3984c, (q31_t)0x705d73f0, (q31_t)0x29ea1a03, + (q31_t)0x7065addb, (q31_t)0x29e09a1c, (q31_t)0x706de5e9, (q31_t)0x29d71899, + (q31_t)0x70761c18, (q31_t)0x29cd9578, (q31_t)0x707e5069, (q31_t)0x29c410ba, + (q31_t)0x708682dc, (q31_t)0x29ba8a61, (q31_t)0x708eb36f, (q31_t)0x29b1026c, + (q31_t)0x7096e223, (q31_t)0x29a778db, (q31_t)0x709f0ef8, (q31_t)0x299dedaf, + (q31_t)0x70a739ed, (q31_t)0x299460e8, (q31_t)0x70af6302, (q31_t)0x298ad287, + (q31_t)0x70b78a36, (q31_t)0x2981428c, (q31_t)0x70bfaf89, (q31_t)0x2977b0f7, + (q31_t)0x70c7d2fb, (q31_t)0x296e1dc9, (q31_t)0x70cff48c, (q31_t)0x29648902, + (q31_t)0x70d8143b, (q31_t)0x295af2a3, (q31_t)0x70e03208, (q31_t)0x29515aab, + (q31_t)0x70e84df3, (q31_t)0x2947c11c, (q31_t)0x70f067fb, (q31_t)0x293e25f5, + (q31_t)0x70f8801f, (q31_t)0x29348937, (q31_t)0x71009661, (q31_t)0x292aeae3, + (q31_t)0x7108aabf, (q31_t)0x29214af8, (q31_t)0x7110bd39, (q31_t)0x2917a977, + (q31_t)0x7118cdcf, (q31_t)0x290e0661, (q31_t)0x7120dc80, (q31_t)0x290461b5, + (q31_t)0x7128e94c, (q31_t)0x28fabb75, (q31_t)0x7130f433, (q31_t)0x28f113a0, + (q31_t)0x7138fd35, (q31_t)0x28e76a37, (q31_t)0x71410450, (q31_t)0x28ddbf3b, + (q31_t)0x71490986, (q31_t)0x28d412ab, (q31_t)0x71510cd5, (q31_t)0x28ca6488, + (q31_t)0x71590e3e, (q31_t)0x28c0b4d2, (q31_t)0x71610dbf, (q31_t)0x28b7038b, + (q31_t)0x71690b59, (q31_t)0x28ad50b1, (q31_t)0x7171070c, (q31_t)0x28a39c46, + (q31_t)0x717900d6, (q31_t)0x2899e64a, (q31_t)0x7180f8b8, (q31_t)0x28902ebd, + (q31_t)0x7188eeb2, (q31_t)0x288675a0, (q31_t)0x7190e2c3, (q31_t)0x287cbaf3, + (q31_t)0x7198d4ea, (q31_t)0x2872feb6, (q31_t)0x71a0c528, (q31_t)0x286940ea, + (q31_t)0x71a8b37c, (q31_t)0x285f8190, (q31_t)0x71b09fe7, (q31_t)0x2855c0a6, + (q31_t)0x71b88a66, (q31_t)0x284bfe2f, (q31_t)0x71c072fb, (q31_t)0x28423a2a, + (q31_t)0x71c859a5, (q31_t)0x28387498, (q31_t)0x71d03e64, (q31_t)0x282ead78, + (q31_t)0x71d82137, (q31_t)0x2824e4cc, (q31_t)0x71e0021e, (q31_t)0x281b1a94, + (q31_t)0x71e7e118, (q31_t)0x28114ed0, (q31_t)0x71efbe27, (q31_t)0x28078181, + (q31_t)0x71f79948, (q31_t)0x27fdb2a7, (q31_t)0x71ff727c, (q31_t)0x27f3e241, + (q31_t)0x720749c3, (q31_t)0x27ea1052, (q31_t)0x720f1f1c, (q31_t)0x27e03cd8, + (q31_t)0x7216f287, (q31_t)0x27d667d5, (q31_t)0x721ec403, (q31_t)0x27cc9149, + (q31_t)0x72269391, (q31_t)0x27c2b934, (q31_t)0x722e6130, (q31_t)0x27b8df97, + (q31_t)0x72362ce0, (q31_t)0x27af0472, (q31_t)0x723df6a0, (q31_t)0x27a527c4, + (q31_t)0x7245be70, (q31_t)0x279b4990, (q31_t)0x724d8450, (q31_t)0x279169d5, + (q31_t)0x72554840, (q31_t)0x27878893, (q31_t)0x725d0a3e, (q31_t)0x277da5cb, + (q31_t)0x7264ca4c, (q31_t)0x2773c17d, (q31_t)0x726c8868, (q31_t)0x2769dbaa, + (q31_t)0x72744493, (q31_t)0x275ff452, (q31_t)0x727bfecc, (q31_t)0x27560b76, + (q31_t)0x7283b712, (q31_t)0x274c2115, (q31_t)0x728b6d66, (q31_t)0x27423530, + (q31_t)0x729321c7, (q31_t)0x273847c8, (q31_t)0x729ad435, (q31_t)0x272e58dc, + (q31_t)0x72a284b0, (q31_t)0x2724686e, (q31_t)0x72aa3336, (q31_t)0x271a767e, + (q31_t)0x72b1dfc9, (q31_t)0x2710830c, (q31_t)0x72b98a67, (q31_t)0x27068e18, + (q31_t)0x72c13311, (q31_t)0x26fc97a3, (q31_t)0x72c8d9c6, (q31_t)0x26f29fad, + (q31_t)0x72d07e85, (q31_t)0x26e8a637, (q31_t)0x72d82150, (q31_t)0x26deab41, + (q31_t)0x72dfc224, (q31_t)0x26d4aecb, (q31_t)0x72e76102, (q31_t)0x26cab0d6, + (q31_t)0x72eefdea, (q31_t)0x26c0b162, (q31_t)0x72f698db, (q31_t)0x26b6b070, + (q31_t)0x72fe31d5, (q31_t)0x26acadff, (q31_t)0x7305c8d7, (q31_t)0x26a2aa11, + (q31_t)0x730d5de3, (q31_t)0x2698a4a6, (q31_t)0x7314f0f6, (q31_t)0x268e9dbd, + (q31_t)0x731c8211, (q31_t)0x26849558, (q31_t)0x73241134, (q31_t)0x267a8b77, + (q31_t)0x732b9e5e, (q31_t)0x2670801a, (q31_t)0x7333298f, (q31_t)0x26667342, + (q31_t)0x733ab2c6, (q31_t)0x265c64ef, (q31_t)0x73423a04, (q31_t)0x26525521, + (q31_t)0x7349bf48, (q31_t)0x264843d9, (q31_t)0x73514292, (q31_t)0x263e3117, + (q31_t)0x7358c3e2, (q31_t)0x26341cdb, (q31_t)0x73604336, (q31_t)0x262a0727, + (q31_t)0x7367c090, (q31_t)0x261feffa, (q31_t)0x736f3bee, (q31_t)0x2615d754, + (q31_t)0x7376b551, (q31_t)0x260bbd37, (q31_t)0x737e2cb7, (q31_t)0x2601a1a2, + (q31_t)0x7385a222, (q31_t)0x25f78497, (q31_t)0x738d1590, (q31_t)0x25ed6614, + (q31_t)0x73948701, (q31_t)0x25e3461b, (q31_t)0x739bf675, (q31_t)0x25d924ac, + (q31_t)0x73a363ec, (q31_t)0x25cf01c8, (q31_t)0x73aacf65, (q31_t)0x25c4dd6e, + (q31_t)0x73b238e0, (q31_t)0x25bab7a0, (q31_t)0x73b9a05d, (q31_t)0x25b0905d, + (q31_t)0x73c105db, (q31_t)0x25a667a7, (q31_t)0x73c8695b, (q31_t)0x259c3d7c, + (q31_t)0x73cfcadc, (q31_t)0x259211df, (q31_t)0x73d72a5d, (q31_t)0x2587e4cf, + (q31_t)0x73de87de, (q31_t)0x257db64c, (q31_t)0x73e5e360, (q31_t)0x25738657, + (q31_t)0x73ed3ce1, (q31_t)0x256954f1, (q31_t)0x73f49462, (q31_t)0x255f2219, + (q31_t)0x73fbe9e2, (q31_t)0x2554edd1, (q31_t)0x74033d61, (q31_t)0x254ab818, + (q31_t)0x740a8edf, (q31_t)0x254080ef, (q31_t)0x7411de5b, (q31_t)0x25364857, + (q31_t)0x74192bd5, (q31_t)0x252c0e4f, (q31_t)0x7420774d, (q31_t)0x2521d2d8, + (q31_t)0x7427c0c3, (q31_t)0x251795f3, (q31_t)0x742f0836, (q31_t)0x250d57a0, + (q31_t)0x74364da6, (q31_t)0x250317df, (q31_t)0x743d9112, (q31_t)0x24f8d6b0, + (q31_t)0x7444d27b, (q31_t)0x24ee9415, (q31_t)0x744c11e0, (q31_t)0x24e4500e, + (q31_t)0x74534f41, (q31_t)0x24da0a9a, (q31_t)0x745a8a9d, (q31_t)0x24cfc3ba, + (q31_t)0x7461c3f5, (q31_t)0x24c57b6f, (q31_t)0x7468fb47, (q31_t)0x24bb31ba, + (q31_t)0x74703095, (q31_t)0x24b0e699, (q31_t)0x747763dd, (q31_t)0x24a69a0f, + (q31_t)0x747e951f, (q31_t)0x249c4c1b, (q31_t)0x7485c45b, (q31_t)0x2491fcbe, + (q31_t)0x748cf190, (q31_t)0x2487abf7, (q31_t)0x74941cbf, (q31_t)0x247d59c8, + (q31_t)0x749b45e7, (q31_t)0x24730631, (q31_t)0x74a26d08, (q31_t)0x2468b132, + (q31_t)0x74a99221, (q31_t)0x245e5acc, (q31_t)0x74b0b533, (q31_t)0x245402ff, + (q31_t)0x74b7d63c, (q31_t)0x2449a9cc, (q31_t)0x74bef53d, (q31_t)0x243f4f32, + (q31_t)0x74c61236, (q31_t)0x2434f332, (q31_t)0x74cd2d26, (q31_t)0x242a95ce, + (q31_t)0x74d4460c, (q31_t)0x24203704, (q31_t)0x74db5cea, (q31_t)0x2415d6d5, + (q31_t)0x74e271bd, (q31_t)0x240b7543, (q31_t)0x74e98487, (q31_t)0x2401124d, + (q31_t)0x74f09546, (q31_t)0x23f6adf3, (q31_t)0x74f7a3fb, (q31_t)0x23ec4837, + (q31_t)0x74feb0a5, (q31_t)0x23e1e117, (q31_t)0x7505bb44, (q31_t)0x23d77896, + (q31_t)0x750cc3d8, (q31_t)0x23cd0eb3, (q31_t)0x7513ca60, (q31_t)0x23c2a36f, + (q31_t)0x751acedd, (q31_t)0x23b836ca, (q31_t)0x7521d14d, (q31_t)0x23adc8c4, + (q31_t)0x7528d1b1, (q31_t)0x23a3595e, (q31_t)0x752fd008, (q31_t)0x2398e898, + (q31_t)0x7536cc52, (q31_t)0x238e7673, (q31_t)0x753dc68f, (q31_t)0x238402ef, + (q31_t)0x7544bebf, (q31_t)0x23798e0d, (q31_t)0x754bb4e1, (q31_t)0x236f17cc, + (q31_t)0x7552a8f4, (q31_t)0x2364a02e, (q31_t)0x75599afa, (q31_t)0x235a2733, + (q31_t)0x75608af1, (q31_t)0x234facda, (q31_t)0x756778d9, (q31_t)0x23453125, + (q31_t)0x756e64b2, (q31_t)0x233ab414, (q31_t)0x75754e7c, (q31_t)0x233035a7, + (q31_t)0x757c3636, (q31_t)0x2325b5df, (q31_t)0x75831be0, (q31_t)0x231b34bc, + (q31_t)0x7589ff7a, (q31_t)0x2310b23e, (q31_t)0x7590e104, (q31_t)0x23062e67, + (q31_t)0x7597c07d, (q31_t)0x22fba936, (q31_t)0x759e9de5, (q31_t)0x22f122ab, + (q31_t)0x75a5793c, (q31_t)0x22e69ac8, (q31_t)0x75ac5282, (q31_t)0x22dc118c, + (q31_t)0x75b329b5, (q31_t)0x22d186f8, (q31_t)0x75b9fed7, (q31_t)0x22c6fb0c, + (q31_t)0x75c0d1e7, (q31_t)0x22bc6dca, (q31_t)0x75c7a2e3, (q31_t)0x22b1df30, + (q31_t)0x75ce71ce, (q31_t)0x22a74f40, (q31_t)0x75d53ea5, (q31_t)0x229cbdfa, + (q31_t)0x75dc0968, (q31_t)0x22922b5e, (q31_t)0x75e2d219, (q31_t)0x2287976e, + (q31_t)0x75e998b5, (q31_t)0x227d0228, (q31_t)0x75f05d3d, (q31_t)0x22726b8e, + (q31_t)0x75f71fb1, (q31_t)0x2267d3a0, (q31_t)0x75fde011, (q31_t)0x225d3a5e, + (q31_t)0x76049e5b, (q31_t)0x22529fca, (q31_t)0x760b5a90, (q31_t)0x224803e2, + (q31_t)0x761214b0, (q31_t)0x223d66a8, (q31_t)0x7618ccba, (q31_t)0x2232c81c, + (q31_t)0x761f82af, (q31_t)0x2228283f, (q31_t)0x7626368d, (q31_t)0x221d8711, + (q31_t)0x762ce855, (q31_t)0x2212e492, (q31_t)0x76339806, (q31_t)0x220840c2, + (q31_t)0x763a45a0, (q31_t)0x21fd9ba3, (q31_t)0x7640f123, (q31_t)0x21f2f534, + (q31_t)0x76479a8e, (q31_t)0x21e84d76, (q31_t)0x764e41e2, (q31_t)0x21dda46a, + (q31_t)0x7654e71d, (q31_t)0x21d2fa0f, (q31_t)0x765b8a41, (q31_t)0x21c84e67, + (q31_t)0x76622b4c, (q31_t)0x21bda171, (q31_t)0x7668ca3e, (q31_t)0x21b2f32e, + (q31_t)0x766f6717, (q31_t)0x21a8439e, (q31_t)0x767601d7, (q31_t)0x219d92c2, + (q31_t)0x767c9a7e, (q31_t)0x2192e09b, (q31_t)0x7683310b, (q31_t)0x21882d28, + (q31_t)0x7689c57d, (q31_t)0x217d786a, (q31_t)0x769057d6, (q31_t)0x2172c262, + (q31_t)0x7696e814, (q31_t)0x21680b0f, (q31_t)0x769d7637, (q31_t)0x215d5273, + (q31_t)0x76a4023f, (q31_t)0x2152988d, (q31_t)0x76aa8c2c, (q31_t)0x2147dd5f, + (q31_t)0x76b113fd, (q31_t)0x213d20e8, (q31_t)0x76b799b3, (q31_t)0x21326329, + (q31_t)0x76be1d4c, (q31_t)0x2127a423, (q31_t)0x76c49ec9, (q31_t)0x211ce3d5, + (q31_t)0x76cb1e2a, (q31_t)0x21122240, (q31_t)0x76d19b6e, (q31_t)0x21075f65, + (q31_t)0x76d81695, (q31_t)0x20fc9b44, (q31_t)0x76de8f9e, (q31_t)0x20f1d5de, + (q31_t)0x76e5068a, (q31_t)0x20e70f32, (q31_t)0x76eb7b58, (q31_t)0x20dc4742, + (q31_t)0x76f1ee09, (q31_t)0x20d17e0d, (q31_t)0x76f85e9a, (q31_t)0x20c6b395, + (q31_t)0x76fecd0e, (q31_t)0x20bbe7d8, (q31_t)0x77053962, (q31_t)0x20b11ad9, + (q31_t)0x770ba398, (q31_t)0x20a64c97, (q31_t)0x77120bae, (q31_t)0x209b7d13, + (q31_t)0x771871a5, (q31_t)0x2090ac4d, (q31_t)0x771ed57c, (q31_t)0x2085da46, + (q31_t)0x77253733, (q31_t)0x207b06fe, (q31_t)0x772b96ca, (q31_t)0x20703275, + (q31_t)0x7731f440, (q31_t)0x20655cac, (q31_t)0x77384f95, (q31_t)0x205a85a3, + (q31_t)0x773ea8ca, (q31_t)0x204fad5b, (q31_t)0x7744ffdd, (q31_t)0x2044d3d4, + (q31_t)0x774b54ce, (q31_t)0x2039f90f, (q31_t)0x7751a79e, (q31_t)0x202f1d0b, + (q31_t)0x7757f84c, (q31_t)0x20243fca, (q31_t)0x775e46d8, (q31_t)0x2019614c, + (q31_t)0x77649341, (q31_t)0x200e8190, (q31_t)0x776add88, (q31_t)0x2003a099, + (q31_t)0x777125ac, (q31_t)0x1ff8be65, (q31_t)0x77776bac, (q31_t)0x1feddaf6, + (q31_t)0x777daf89, (q31_t)0x1fe2f64c, (q31_t)0x7783f143, (q31_t)0x1fd81067, + (q31_t)0x778a30d8, (q31_t)0x1fcd2948, (q31_t)0x77906e49, (q31_t)0x1fc240ef, + (q31_t)0x7796a996, (q31_t)0x1fb7575c, (q31_t)0x779ce2be, (q31_t)0x1fac6c91, + (q31_t)0x77a319c2, (q31_t)0x1fa1808c, (q31_t)0x77a94ea0, (q31_t)0x1f969350, + (q31_t)0x77af8159, (q31_t)0x1f8ba4dc, (q31_t)0x77b5b1ec, (q31_t)0x1f80b531, + (q31_t)0x77bbe05a, (q31_t)0x1f75c44e, (q31_t)0x77c20ca1, (q31_t)0x1f6ad235, + (q31_t)0x77c836c2, (q31_t)0x1f5fdee6, (q31_t)0x77ce5ebd, (q31_t)0x1f54ea62, + (q31_t)0x77d48490, (q31_t)0x1f49f4a8, (q31_t)0x77daa83d, (q31_t)0x1f3efdb9, + (q31_t)0x77e0c9c3, (q31_t)0x1f340596, (q31_t)0x77e6e921, (q31_t)0x1f290c3f, + (q31_t)0x77ed0657, (q31_t)0x1f1e11b5, (q31_t)0x77f32165, (q31_t)0x1f1315f7, + (q31_t)0x77f93a4b, (q31_t)0x1f081907, (q31_t)0x77ff5109, (q31_t)0x1efd1ae4, + (q31_t)0x7805659e, (q31_t)0x1ef21b90, (q31_t)0x780b780a, (q31_t)0x1ee71b0a, + (q31_t)0x7811884d, (q31_t)0x1edc1953, (q31_t)0x78179666, (q31_t)0x1ed1166b, + (q31_t)0x781da256, (q31_t)0x1ec61254, (q31_t)0x7823ac1d, (q31_t)0x1ebb0d0d, + (q31_t)0x7829b3b9, (q31_t)0x1eb00696, (q31_t)0x782fb92a, (q31_t)0x1ea4fef0, + (q31_t)0x7835bc71, (q31_t)0x1e99f61d, (q31_t)0x783bbd8e, (q31_t)0x1e8eec1b, + (q31_t)0x7841bc7f, (q31_t)0x1e83e0eb, (q31_t)0x7847b946, (q31_t)0x1e78d48e, + (q31_t)0x784db3e0, (q31_t)0x1e6dc705, (q31_t)0x7853ac4f, (q31_t)0x1e62b84f, + (q31_t)0x7859a292, (q31_t)0x1e57a86d, (q31_t)0x785f96a9, (q31_t)0x1e4c9760, + (q31_t)0x78658894, (q31_t)0x1e418528, (q31_t)0x786b7852, (q31_t)0x1e3671c5, + (q31_t)0x787165e3, (q31_t)0x1e2b5d38, (q31_t)0x78775147, (q31_t)0x1e204781, + (q31_t)0x787d3a7e, (q31_t)0x1e1530a1, (q31_t)0x78832187, (q31_t)0x1e0a1898, + (q31_t)0x78890663, (q31_t)0x1dfeff67, (q31_t)0x788ee910, (q31_t)0x1df3e50d, + (q31_t)0x7894c98f, (q31_t)0x1de8c98c, (q31_t)0x789aa7e0, (q31_t)0x1dddace4, + (q31_t)0x78a08402, (q31_t)0x1dd28f15, (q31_t)0x78a65df6, (q31_t)0x1dc7701f, + (q31_t)0x78ac35ba, (q31_t)0x1dbc5004, (q31_t)0x78b20b4f, (q31_t)0x1db12ec3, + (q31_t)0x78b7deb4, (q31_t)0x1da60c5d, (q31_t)0x78bdafea, (q31_t)0x1d9ae8d2, + (q31_t)0x78c37eef, (q31_t)0x1d8fc424, (q31_t)0x78c94bc4, (q31_t)0x1d849e51, + (q31_t)0x78cf1669, (q31_t)0x1d79775c, (q31_t)0x78d4dedd, (q31_t)0x1d6e4f43, + (q31_t)0x78daa520, (q31_t)0x1d632608, (q31_t)0x78e06932, (q31_t)0x1d57fbaa, + (q31_t)0x78e62b13, (q31_t)0x1d4cd02c, (q31_t)0x78ebeac2, (q31_t)0x1d41a38c, + (q31_t)0x78f1a840, (q31_t)0x1d3675cb, (q31_t)0x78f7638b, (q31_t)0x1d2b46ea, + (q31_t)0x78fd1ca4, (q31_t)0x1d2016e9, (q31_t)0x7902d38b, (q31_t)0x1d14e5c9, + (q31_t)0x7908883f, (q31_t)0x1d09b389, (q31_t)0x790e3ac0, (q31_t)0x1cfe802b, + (q31_t)0x7913eb0e, (q31_t)0x1cf34baf, (q31_t)0x79199929, (q31_t)0x1ce81615, + (q31_t)0x791f4510, (q31_t)0x1cdcdf5e, (q31_t)0x7924eec3, (q31_t)0x1cd1a78a, + (q31_t)0x792a9642, (q31_t)0x1cc66e99, (q31_t)0x79303b8e, (q31_t)0x1cbb348d, + (q31_t)0x7935dea4, (q31_t)0x1caff965, (q31_t)0x793b7f86, (q31_t)0x1ca4bd21, + (q31_t)0x79411e33, (q31_t)0x1c997fc4, (q31_t)0x7946baac, (q31_t)0x1c8e414b, + (q31_t)0x794c54ee, (q31_t)0x1c8301b9, (q31_t)0x7951ecfc, (q31_t)0x1c77c10e, + (q31_t)0x795782d3, (q31_t)0x1c6c7f4a, (q31_t)0x795d1675, (q31_t)0x1c613c6d, + (q31_t)0x7962a7e0, (q31_t)0x1c55f878, (q31_t)0x79683715, (q31_t)0x1c4ab36b, + (q31_t)0x796dc414, (q31_t)0x1c3f6d47, (q31_t)0x79734edc, (q31_t)0x1c34260c, + (q31_t)0x7978d76c, (q31_t)0x1c28ddbb, (q31_t)0x797e5dc6, (q31_t)0x1c1d9454, + (q31_t)0x7983e1e8, (q31_t)0x1c1249d8, (q31_t)0x798963d2, (q31_t)0x1c06fe46, + (q31_t)0x798ee385, (q31_t)0x1bfbb1a0, (q31_t)0x799460ff, (q31_t)0x1bf063e6, + (q31_t)0x7999dc42, (q31_t)0x1be51518, (q31_t)0x799f554b, (q31_t)0x1bd9c537, + (q31_t)0x79a4cc1c, (q31_t)0x1bce7442, (q31_t)0x79aa40b4, (q31_t)0x1bc3223c, + (q31_t)0x79afb313, (q31_t)0x1bb7cf23, (q31_t)0x79b52339, (q31_t)0x1bac7af9, + (q31_t)0x79ba9125, (q31_t)0x1ba125bd, (q31_t)0x79bffcd7, (q31_t)0x1b95cf71, + (q31_t)0x79c5664f, (q31_t)0x1b8a7815, (q31_t)0x79cacd8d, (q31_t)0x1b7f1fa9, + (q31_t)0x79d03291, (q31_t)0x1b73c62d, (q31_t)0x79d5955a, (q31_t)0x1b686ba3, + (q31_t)0x79daf5e8, (q31_t)0x1b5d100a, (q31_t)0x79e0543c, (q31_t)0x1b51b363, + (q31_t)0x79e5b054, (q31_t)0x1b4655ae, (q31_t)0x79eb0a31, (q31_t)0x1b3af6ec, + (q31_t)0x79f061d2, (q31_t)0x1b2f971e, (q31_t)0x79f5b737, (q31_t)0x1b243643, + (q31_t)0x79fb0a60, (q31_t)0x1b18d45c, (q31_t)0x7a005b4d, (q31_t)0x1b0d716a, + (q31_t)0x7a05a9fd, (q31_t)0x1b020d6c, (q31_t)0x7a0af671, (q31_t)0x1af6a865, + (q31_t)0x7a1040a8, (q31_t)0x1aeb4253, (q31_t)0x7a1588a2, (q31_t)0x1adfdb37, + (q31_t)0x7a1ace5f, (q31_t)0x1ad47312, (q31_t)0x7a2011de, (q31_t)0x1ac909e5, + (q31_t)0x7a25531f, (q31_t)0x1abd9faf, (q31_t)0x7a2a9223, (q31_t)0x1ab23471, + (q31_t)0x7a2fcee8, (q31_t)0x1aa6c82b, (q31_t)0x7a350970, (q31_t)0x1a9b5adf, + (q31_t)0x7a3a41b9, (q31_t)0x1a8fec8c, (q31_t)0x7a3f77c3, (q31_t)0x1a847d33, + (q31_t)0x7a44ab8e, (q31_t)0x1a790cd4, (q31_t)0x7a49dd1a, (q31_t)0x1a6d9b70, + (q31_t)0x7a4f0c67, (q31_t)0x1a622907, (q31_t)0x7a543974, (q31_t)0x1a56b599, + (q31_t)0x7a596442, (q31_t)0x1a4b4128, (q31_t)0x7a5e8cd0, (q31_t)0x1a3fcbb3, + (q31_t)0x7a63b31d, (q31_t)0x1a34553b, (q31_t)0x7a68d72b, (q31_t)0x1a28ddc0, + (q31_t)0x7a6df8f8, (q31_t)0x1a1d6544, (q31_t)0x7a731884, (q31_t)0x1a11ebc5, + (q31_t)0x7a7835cf, (q31_t)0x1a067145, (q31_t)0x7a7d50da, (q31_t)0x19faf5c5, + (q31_t)0x7a8269a3, (q31_t)0x19ef7944, (q31_t)0x7a87802a, (q31_t)0x19e3fbc3, + (q31_t)0x7a8c9470, (q31_t)0x19d87d42, (q31_t)0x7a91a674, (q31_t)0x19ccfdc2, + (q31_t)0x7a96b636, (q31_t)0x19c17d44, (q31_t)0x7a9bc3b6, (q31_t)0x19b5fbc8, + (q31_t)0x7aa0cef3, (q31_t)0x19aa794d, (q31_t)0x7aa5d7ee, (q31_t)0x199ef5d6, + (q31_t)0x7aaadea6, (q31_t)0x19937161, (q31_t)0x7aafe31b, (q31_t)0x1987ebf0, + (q31_t)0x7ab4e54c, (q31_t)0x197c6584, (q31_t)0x7ab9e53a, (q31_t)0x1970de1b, + (q31_t)0x7abee2e5, (q31_t)0x196555b8, (q31_t)0x7ac3de4c, (q31_t)0x1959cc5a, + (q31_t)0x7ac8d76f, (q31_t)0x194e4201, (q31_t)0x7acdce4d, (q31_t)0x1942b6af, + (q31_t)0x7ad2c2e8, (q31_t)0x19372a64, (q31_t)0x7ad7b53d, (q31_t)0x192b9d1f, + (q31_t)0x7adca54e, (q31_t)0x19200ee3, (q31_t)0x7ae1931a, (q31_t)0x19147fae, + (q31_t)0x7ae67ea1, (q31_t)0x1908ef82, (q31_t)0x7aeb67e3, (q31_t)0x18fd5e5f, + (q31_t)0x7af04edf, (q31_t)0x18f1cc45, (q31_t)0x7af53395, (q31_t)0x18e63935, + (q31_t)0x7afa1605, (q31_t)0x18daa52f, (q31_t)0x7afef630, (q31_t)0x18cf1034, + (q31_t)0x7b03d414, (q31_t)0x18c37a44, (q31_t)0x7b08afb2, (q31_t)0x18b7e35f, + (q31_t)0x7b0d8909, (q31_t)0x18ac4b87, (q31_t)0x7b126019, (q31_t)0x18a0b2bb, + (q31_t)0x7b1734e2, (q31_t)0x189518fc, (q31_t)0x7b1c0764, (q31_t)0x18897e4a, + (q31_t)0x7b20d79e, (q31_t)0x187de2a7, (q31_t)0x7b25a591, (q31_t)0x18724611, + (q31_t)0x7b2a713d, (q31_t)0x1866a88a, (q31_t)0x7b2f3aa0, (q31_t)0x185b0a13, + (q31_t)0x7b3401bb, (q31_t)0x184f6aab, (q31_t)0x7b38c68e, (q31_t)0x1843ca53, + (q31_t)0x7b3d8918, (q31_t)0x1838290c, (q31_t)0x7b42495a, (q31_t)0x182c86d5, + (q31_t)0x7b470753, (q31_t)0x1820e3b0, (q31_t)0x7b4bc303, (q31_t)0x18153f9d, + (q31_t)0x7b507c69, (q31_t)0x18099a9c, (q31_t)0x7b553386, (q31_t)0x17fdf4ae, + (q31_t)0x7b59e85a, (q31_t)0x17f24dd3, (q31_t)0x7b5e9ae4, (q31_t)0x17e6a60c, + (q31_t)0x7b634b23, (q31_t)0x17dafd59, (q31_t)0x7b67f919, (q31_t)0x17cf53bb, + (q31_t)0x7b6ca4c4, (q31_t)0x17c3a931, (q31_t)0x7b714e25, (q31_t)0x17b7fdbd, + (q31_t)0x7b75f53c, (q31_t)0x17ac515f, (q31_t)0x7b7a9a07, (q31_t)0x17a0a417, + (q31_t)0x7b7f3c87, (q31_t)0x1794f5e6, (q31_t)0x7b83dcbc, (q31_t)0x178946cc, + (q31_t)0x7b887aa6, (q31_t)0x177d96ca, (q31_t)0x7b8d1644, (q31_t)0x1771e5e0, + (q31_t)0x7b91af97, (q31_t)0x1766340f, (q31_t)0x7b96469d, (q31_t)0x175a8157, + (q31_t)0x7b9adb57, (q31_t)0x174ecdb8, (q31_t)0x7b9f6dc5, (q31_t)0x17431933, + (q31_t)0x7ba3fde7, (q31_t)0x173763c9, (q31_t)0x7ba88bbc, (q31_t)0x172bad7a, + (q31_t)0x7bad1744, (q31_t)0x171ff646, (q31_t)0x7bb1a080, (q31_t)0x17143e2d, + (q31_t)0x7bb6276e, (q31_t)0x17088531, (q31_t)0x7bbaac0e, (q31_t)0x16fccb51, + (q31_t)0x7bbf2e62, (q31_t)0x16f1108f, (q31_t)0x7bc3ae67, (q31_t)0x16e554ea, + (q31_t)0x7bc82c1f, (q31_t)0x16d99864, (q31_t)0x7bcca789, (q31_t)0x16cddafb, + (q31_t)0x7bd120a4, (q31_t)0x16c21cb2, (q31_t)0x7bd59771, (q31_t)0x16b65d88, + (q31_t)0x7bda0bf0, (q31_t)0x16aa9d7e, (q31_t)0x7bde7e20, (q31_t)0x169edc94, + (q31_t)0x7be2ee01, (q31_t)0x16931acb, (q31_t)0x7be75b93, (q31_t)0x16875823, + (q31_t)0x7bebc6d5, (q31_t)0x167b949d, (q31_t)0x7bf02fc9, (q31_t)0x166fd039, + (q31_t)0x7bf4966c, (q31_t)0x16640af7, (q31_t)0x7bf8fac0, (q31_t)0x165844d8, + (q31_t)0x7bfd5cc4, (q31_t)0x164c7ddd, (q31_t)0x7c01bc78, (q31_t)0x1640b606, + (q31_t)0x7c0619dc, (q31_t)0x1634ed53, (q31_t)0x7c0a74f0, (q31_t)0x162923c5, + (q31_t)0x7c0ecdb2, (q31_t)0x161d595d, (q31_t)0x7c132424, (q31_t)0x16118e1a, + (q31_t)0x7c177845, (q31_t)0x1605c1fd, (q31_t)0x7c1bca16, (q31_t)0x15f9f507, + (q31_t)0x7c201994, (q31_t)0x15ee2738, (q31_t)0x7c2466c2, (q31_t)0x15e25890, + (q31_t)0x7c28b19e, (q31_t)0x15d68911, (q31_t)0x7c2cfa28, (q31_t)0x15cab8ba, + (q31_t)0x7c314060, (q31_t)0x15bee78c, (q31_t)0x7c358446, (q31_t)0x15b31587, + (q31_t)0x7c39c5da, (q31_t)0x15a742ac, (q31_t)0x7c3e051b, (q31_t)0x159b6efb, + (q31_t)0x7c42420a, (q31_t)0x158f9a76, (q31_t)0x7c467ca6, (q31_t)0x1583c51b, + (q31_t)0x7c4ab4ef, (q31_t)0x1577eeec, (q31_t)0x7c4eeae5, (q31_t)0x156c17e9, + (q31_t)0x7c531e88, (q31_t)0x15604013, (q31_t)0x7c574fd8, (q31_t)0x1554676a, + (q31_t)0x7c5b7ed4, (q31_t)0x15488dee, (q31_t)0x7c5fab7c, (q31_t)0x153cb3a0, + (q31_t)0x7c63d5d1, (q31_t)0x1530d881, (q31_t)0x7c67fdd1, (q31_t)0x1524fc90, + (q31_t)0x7c6c237e, (q31_t)0x15191fcf, (q31_t)0x7c7046d6, (q31_t)0x150d423d, + (q31_t)0x7c7467d9, (q31_t)0x150163dc, (q31_t)0x7c788688, (q31_t)0x14f584ac, + (q31_t)0x7c7ca2e2, (q31_t)0x14e9a4ac, (q31_t)0x7c80bce7, (q31_t)0x14ddc3de, + (q31_t)0x7c84d496, (q31_t)0x14d1e242, (q31_t)0x7c88e9f1, (q31_t)0x14c5ffd9, + (q31_t)0x7c8cfcf6, (q31_t)0x14ba1ca3, (q31_t)0x7c910da5, (q31_t)0x14ae38a0, + (q31_t)0x7c951bff, (q31_t)0x14a253d1, (q31_t)0x7c992803, (q31_t)0x14966e36, + (q31_t)0x7c9d31b0, (q31_t)0x148a87d1, (q31_t)0x7ca13908, (q31_t)0x147ea0a0, + (q31_t)0x7ca53e09, (q31_t)0x1472b8a5, (q31_t)0x7ca940b3, (q31_t)0x1466cfe1, + (q31_t)0x7cad4107, (q31_t)0x145ae653, (q31_t)0x7cb13f04, (q31_t)0x144efbfc, + (q31_t)0x7cb53aaa, (q31_t)0x144310dd, (q31_t)0x7cb933f9, (q31_t)0x143724f5, + (q31_t)0x7cbd2af0, (q31_t)0x142b3846, (q31_t)0x7cc11f90, (q31_t)0x141f4ad1, + (q31_t)0x7cc511d9, (q31_t)0x14135c94, (q31_t)0x7cc901c9, (q31_t)0x14076d91, + (q31_t)0x7cccef62, (q31_t)0x13fb7dc9, (q31_t)0x7cd0daa2, (q31_t)0x13ef8d3c, + (q31_t)0x7cd4c38b, (q31_t)0x13e39be9, (q31_t)0x7cd8aa1b, (q31_t)0x13d7a9d3, + (q31_t)0x7cdc8e52, (q31_t)0x13cbb6f8, (q31_t)0x7ce07031, (q31_t)0x13bfc35b, + (q31_t)0x7ce44fb7, (q31_t)0x13b3cefa, (q31_t)0x7ce82ce4, (q31_t)0x13a7d9d7, + (q31_t)0x7cec07b8, (q31_t)0x139be3f2, (q31_t)0x7cefe032, (q31_t)0x138fed4b, + (q31_t)0x7cf3b653, (q31_t)0x1383f5e3, (q31_t)0x7cf78a1b, (q31_t)0x1377fdbb, + (q31_t)0x7cfb5b89, (q31_t)0x136c04d2, (q31_t)0x7cff2a9d, (q31_t)0x13600b2a, + (q31_t)0x7d02f757, (q31_t)0x135410c3, (q31_t)0x7d06c1b6, (q31_t)0x1348159d, + (q31_t)0x7d0a89bc, (q31_t)0x133c19b8, (q31_t)0x7d0e4f67, (q31_t)0x13301d16, + (q31_t)0x7d1212b7, (q31_t)0x13241fb6, (q31_t)0x7d15d3ad, (q31_t)0x1318219a, + (q31_t)0x7d199248, (q31_t)0x130c22c1, (q31_t)0x7d1d4e88, (q31_t)0x1300232c, + (q31_t)0x7d21086c, (q31_t)0x12f422db, (q31_t)0x7d24bff6, (q31_t)0x12e821cf, + (q31_t)0x7d287523, (q31_t)0x12dc2009, (q31_t)0x7d2c27f6, (q31_t)0x12d01d89, + (q31_t)0x7d2fd86c, (q31_t)0x12c41a4f, (q31_t)0x7d338687, (q31_t)0x12b8165b, + (q31_t)0x7d373245, (q31_t)0x12ac11af, (q31_t)0x7d3adba7, (q31_t)0x12a00c4b, + (q31_t)0x7d3e82ae, (q31_t)0x1294062f, (q31_t)0x7d422757, (q31_t)0x1287ff5b, + (q31_t)0x7d45c9a4, (q31_t)0x127bf7d1, (q31_t)0x7d496994, (q31_t)0x126fef90, + (q31_t)0x7d4d0728, (q31_t)0x1263e699, (q31_t)0x7d50a25e, (q31_t)0x1257dced, + (q31_t)0x7d543b37, (q31_t)0x124bd28c, (q31_t)0x7d57d1b3, (q31_t)0x123fc776, + (q31_t)0x7d5b65d2, (q31_t)0x1233bbac, (q31_t)0x7d5ef793, (q31_t)0x1227af2e, + (q31_t)0x7d6286f6, (q31_t)0x121ba1fd, (q31_t)0x7d6613fb, (q31_t)0x120f941a, + (q31_t)0x7d699ea3, (q31_t)0x12038584, (q31_t)0x7d6d26ec, (q31_t)0x11f7763c, + (q31_t)0x7d70acd7, (q31_t)0x11eb6643, (q31_t)0x7d743064, (q31_t)0x11df5599, + (q31_t)0x7d77b192, (q31_t)0x11d3443f, (q31_t)0x7d7b3061, (q31_t)0x11c73235, + (q31_t)0x7d7eacd2, (q31_t)0x11bb1f7c, (q31_t)0x7d8226e4, (q31_t)0x11af0c13, + (q31_t)0x7d859e96, (q31_t)0x11a2f7fc, (q31_t)0x7d8913ea, (q31_t)0x1196e337, + (q31_t)0x7d8c86de, (q31_t)0x118acdc4, (q31_t)0x7d8ff772, (q31_t)0x117eb7a4, + (q31_t)0x7d9365a8, (q31_t)0x1172a0d7, (q31_t)0x7d96d17d, (q31_t)0x1166895f, + (q31_t)0x7d9a3af2, (q31_t)0x115a713a, (q31_t)0x7d9da208, (q31_t)0x114e586a, + (q31_t)0x7da106bd, (q31_t)0x11423ef0, (q31_t)0x7da46912, (q31_t)0x113624cb, + (q31_t)0x7da7c907, (q31_t)0x112a09fc, (q31_t)0x7dab269b, (q31_t)0x111dee84, + (q31_t)0x7dae81cf, (q31_t)0x1111d263, (q31_t)0x7db1daa2, (q31_t)0x1105b599, + (q31_t)0x7db53113, (q31_t)0x10f99827, (q31_t)0x7db88524, (q31_t)0x10ed7a0e, + (q31_t)0x7dbbd6d4, (q31_t)0x10e15b4e, (q31_t)0x7dbf2622, (q31_t)0x10d53be7, + (q31_t)0x7dc2730f, (q31_t)0x10c91bda, (q31_t)0x7dc5bd9b, (q31_t)0x10bcfb28, + (q31_t)0x7dc905c5, (q31_t)0x10b0d9d0, (q31_t)0x7dcc4b8d, (q31_t)0x10a4b7d3, + (q31_t)0x7dcf8ef3, (q31_t)0x10989532, (q31_t)0x7dd2cff7, (q31_t)0x108c71ee, + (q31_t)0x7dd60e99, (q31_t)0x10804e06, (q31_t)0x7dd94ad8, (q31_t)0x1074297b, + (q31_t)0x7ddc84b5, (q31_t)0x1068044e, (q31_t)0x7ddfbc30, (q31_t)0x105bde7f, + (q31_t)0x7de2f148, (q31_t)0x104fb80e, (q31_t)0x7de623fd, (q31_t)0x104390fd, + (q31_t)0x7de9544f, (q31_t)0x1037694b, (q31_t)0x7dec823e, (q31_t)0x102b40f8, + (q31_t)0x7defadca, (q31_t)0x101f1807, (q31_t)0x7df2d6f3, (q31_t)0x1012ee76, + (q31_t)0x7df5fdb8, (q31_t)0x1006c446, (q31_t)0x7df9221a, (q31_t)0xffa9979, + (q31_t)0x7dfc4418, (q31_t)0xfee6e0d, (q31_t)0x7dff63b2, (q31_t)0xfe24205, + (q31_t)0x7e0280e9, (q31_t)0xfd6155f, (q31_t)0x7e059bbb, (q31_t)0xfc9e81e, + (q31_t)0x7e08b42a, (q31_t)0xfbdba40, (q31_t)0x7e0bca34, (q31_t)0xfb18bc8, + (q31_t)0x7e0eddd9, (q31_t)0xfa55cb4, (q31_t)0x7e11ef1b, (q31_t)0xf992d06, + (q31_t)0x7e14fdf7, (q31_t)0xf8cfcbe, (q31_t)0x7e180a6f, (q31_t)0xf80cbdc, + (q31_t)0x7e1b1482, (q31_t)0xf749a61, (q31_t)0x7e1e1c30, (q31_t)0xf68684e, + (q31_t)0x7e212179, (q31_t)0xf5c35a3, (q31_t)0x7e24245d, (q31_t)0xf500260, + (q31_t)0x7e2724db, (q31_t)0xf43ce86, (q31_t)0x7e2a22f4, (q31_t)0xf379a16, + (q31_t)0x7e2d1ea8, (q31_t)0xf2b650f, (q31_t)0x7e3017f6, (q31_t)0xf1f2f73, + (q31_t)0x7e330ede, (q31_t)0xf12f941, (q31_t)0x7e360360, (q31_t)0xf06c27a, + (q31_t)0x7e38f57c, (q31_t)0xefa8b20, (q31_t)0x7e3be532, (q31_t)0xeee5331, + (q31_t)0x7e3ed282, (q31_t)0xee21aaf, (q31_t)0x7e41bd6c, (q31_t)0xed5e19a, + (q31_t)0x7e44a5ef, (q31_t)0xec9a7f3, (q31_t)0x7e478c0b, (q31_t)0xebd6db9, + (q31_t)0x7e4a6fc1, (q31_t)0xeb132ef, (q31_t)0x7e4d5110, (q31_t)0xea4f793, + (q31_t)0x7e502ff9, (q31_t)0xe98bba7, (q31_t)0x7e530c7a, (q31_t)0xe8c7f2a, + (q31_t)0x7e55e694, (q31_t)0xe80421e, (q31_t)0x7e58be47, (q31_t)0xe740483, + (q31_t)0x7e5b9392, (q31_t)0xe67c65a, (q31_t)0x7e5e6676, (q31_t)0xe5b87a2, + (q31_t)0x7e6136f3, (q31_t)0xe4f485c, (q31_t)0x7e640507, (q31_t)0xe430889, + (q31_t)0x7e66d0b4, (q31_t)0xe36c82a, (q31_t)0x7e6999fa, (q31_t)0xe2a873e, + (q31_t)0x7e6c60d7, (q31_t)0xe1e45c6, (q31_t)0x7e6f254c, (q31_t)0xe1203c3, + (q31_t)0x7e71e759, (q31_t)0xe05c135, (q31_t)0x7e74a6fd, (q31_t)0xdf97e1d, + (q31_t)0x7e77643a, (q31_t)0xded3a7b, (q31_t)0x7e7a1f0d, (q31_t)0xde0f64f, + (q31_t)0x7e7cd778, (q31_t)0xdd4b19a, (q31_t)0x7e7f8d7b, (q31_t)0xdc86c5d, + (q31_t)0x7e824114, (q31_t)0xdbc2698, (q31_t)0x7e84f245, (q31_t)0xdafe04b, + (q31_t)0x7e87a10c, (q31_t)0xda39978, (q31_t)0x7e8a4d6a, (q31_t)0xd97521d, + (q31_t)0x7e8cf75f, (q31_t)0xd8b0a3d, (q31_t)0x7e8f9eeb, (q31_t)0xd7ec1d6, + (q31_t)0x7e92440d, (q31_t)0xd7278eb, (q31_t)0x7e94e6c6, (q31_t)0xd662f7b, + (q31_t)0x7e978715, (q31_t)0xd59e586, (q31_t)0x7e9a24fb, (q31_t)0xd4d9b0e, + (q31_t)0x7e9cc076, (q31_t)0xd415013, (q31_t)0x7e9f5988, (q31_t)0xd350495, + (q31_t)0x7ea1f02f, (q31_t)0xd28b894, (q31_t)0x7ea4846c, (q31_t)0xd1c6c11, + (q31_t)0x7ea7163f, (q31_t)0xd101f0e, (q31_t)0x7ea9a5a8, (q31_t)0xd03d189, + (q31_t)0x7eac32a6, (q31_t)0xcf78383, (q31_t)0x7eaebd3a, (q31_t)0xceb34fe, + (q31_t)0x7eb14563, (q31_t)0xcdee5f9, (q31_t)0x7eb3cb21, (q31_t)0xcd29676, + (q31_t)0x7eb64e75, (q31_t)0xcc64673, (q31_t)0x7eb8cf5d, (q31_t)0xcb9f5f3, + (q31_t)0x7ebb4ddb, (q31_t)0xcada4f5, (q31_t)0x7ebdc9ed, (q31_t)0xca1537a, + (q31_t)0x7ec04394, (q31_t)0xc950182, (q31_t)0x7ec2bad0, (q31_t)0xc88af0e, + (q31_t)0x7ec52fa0, (q31_t)0xc7c5c1e, (q31_t)0x7ec7a205, (q31_t)0xc7008b3, + (q31_t)0x7eca11fe, (q31_t)0xc63b4ce, (q31_t)0x7ecc7f8b, (q31_t)0xc57606e, + (q31_t)0x7eceeaad, (q31_t)0xc4b0b94, (q31_t)0x7ed15363, (q31_t)0xc3eb641, + (q31_t)0x7ed3b9ad, (q31_t)0xc326075, (q31_t)0x7ed61d8a, (q31_t)0xc260a31, + (q31_t)0x7ed87efc, (q31_t)0xc19b374, (q31_t)0x7edade01, (q31_t)0xc0d5c41, + (q31_t)0x7edd3a9a, (q31_t)0xc010496, (q31_t)0x7edf94c7, (q31_t)0xbf4ac75, + (q31_t)0x7ee1ec87, (q31_t)0xbe853de, (q31_t)0x7ee441da, (q31_t)0xbdbfad1, + (q31_t)0x7ee694c1, (q31_t)0xbcfa150, (q31_t)0x7ee8e53a, (q31_t)0xbc34759, + (q31_t)0x7eeb3347, (q31_t)0xbb6ecef, (q31_t)0x7eed7ee7, (q31_t)0xbaa9211, + (q31_t)0x7eefc81a, (q31_t)0xb9e36c0, (q31_t)0x7ef20ee0, (q31_t)0xb91dafc, + (q31_t)0x7ef45338, (q31_t)0xb857ec7, (q31_t)0x7ef69523, (q31_t)0xb79221f, + (q31_t)0x7ef8d4a1, (q31_t)0xb6cc506, (q31_t)0x7efb11b1, (q31_t)0xb60677c, + (q31_t)0x7efd4c54, (q31_t)0xb540982, (q31_t)0x7eff8489, (q31_t)0xb47ab19, + (q31_t)0x7f01ba50, (q31_t)0xb3b4c40, (q31_t)0x7f03eda9, (q31_t)0xb2eecf8, + (q31_t)0x7f061e95, (q31_t)0xb228d42, (q31_t)0x7f084d12, (q31_t)0xb162d1d, + (q31_t)0x7f0a7921, (q31_t)0xb09cc8c, (q31_t)0x7f0ca2c2, (q31_t)0xafd6b8d, + (q31_t)0x7f0ec9f5, (q31_t)0xaf10a22, (q31_t)0x7f10eeb9, (q31_t)0xae4a84b, + (q31_t)0x7f13110f, (q31_t)0xad84609, (q31_t)0x7f1530f7, (q31_t)0xacbe35b, + (q31_t)0x7f174e70, (q31_t)0xabf8043, (q31_t)0x7f19697a, (q31_t)0xab31cc1, + (q31_t)0x7f1b8215, (q31_t)0xaa6b8d5, (q31_t)0x7f1d9842, (q31_t)0xa9a5480, + (q31_t)0x7f1fabff, (q31_t)0xa8defc3, (q31_t)0x7f21bd4e, (q31_t)0xa818a9d, + (q31_t)0x7f23cc2e, (q31_t)0xa752510, (q31_t)0x7f25d89e, (q31_t)0xa68bf1b, + (q31_t)0x7f27e29f, (q31_t)0xa5c58c0, (q31_t)0x7f29ea31, (q31_t)0xa4ff1fe, + (q31_t)0x7f2bef53, (q31_t)0xa438ad7, (q31_t)0x7f2df206, (q31_t)0xa37234a, + (q31_t)0x7f2ff24a, (q31_t)0xa2abb59, (q31_t)0x7f31f01d, (q31_t)0xa1e5303, + (q31_t)0x7f33eb81, (q31_t)0xa11ea49, (q31_t)0x7f35e476, (q31_t)0xa05812c, + (q31_t)0x7f37dafa, (q31_t)0x9f917ac, (q31_t)0x7f39cf0e, (q31_t)0x9ecadc9, + (q31_t)0x7f3bc0b3, (q31_t)0x9e04385, (q31_t)0x7f3dafe7, (q31_t)0x9d3d8df, + (q31_t)0x7f3f9cab, (q31_t)0x9c76dd8, (q31_t)0x7f4186ff, (q31_t)0x9bb0271, + (q31_t)0x7f436ee3, (q31_t)0x9ae96aa, (q31_t)0x7f455456, (q31_t)0x9a22a83, + (q31_t)0x7f473759, (q31_t)0x995bdfd, (q31_t)0x7f4917eb, (q31_t)0x9895118, + (q31_t)0x7f4af60d, (q31_t)0x97ce3d5, (q31_t)0x7f4cd1be, (q31_t)0x9707635, + (q31_t)0x7f4eaafe, (q31_t)0x9640837, (q31_t)0x7f5081cd, (q31_t)0x95799dd, + (q31_t)0x7f52562c, (q31_t)0x94b2b27, (q31_t)0x7f54281a, (q31_t)0x93ebc14, + (q31_t)0x7f55f796, (q31_t)0x9324ca7, (q31_t)0x7f57c4a2, (q31_t)0x925dcdf, + (q31_t)0x7f598f3c, (q31_t)0x9196cbc, (q31_t)0x7f5b5765, (q31_t)0x90cfc40, + (q31_t)0x7f5d1d1d, (q31_t)0x9008b6a, (q31_t)0x7f5ee063, (q31_t)0x8f41a3c, + (q31_t)0x7f60a138, (q31_t)0x8e7a8b5, (q31_t)0x7f625f9b, (q31_t)0x8db36d6, + (q31_t)0x7f641b8d, (q31_t)0x8cec4a0, (q31_t)0x7f65d50d, (q31_t)0x8c25213, + (q31_t)0x7f678c1c, (q31_t)0x8b5df30, (q31_t)0x7f6940b8, (q31_t)0x8a96bf6, + (q31_t)0x7f6af2e3, (q31_t)0x89cf867, (q31_t)0x7f6ca29c, (q31_t)0x8908483, + (q31_t)0x7f6e4fe3, (q31_t)0x884104b, (q31_t)0x7f6ffab8, (q31_t)0x8779bbe, + (q31_t)0x7f71a31b, (q31_t)0x86b26de, (q31_t)0x7f73490b, (q31_t)0x85eb1ab, + (q31_t)0x7f74ec8a, (q31_t)0x8523c25, (q31_t)0x7f768d96, (q31_t)0x845c64d, + (q31_t)0x7f782c30, (q31_t)0x8395024, (q31_t)0x7f79c857, (q31_t)0x82cd9a9, + (q31_t)0x7f7b620c, (q31_t)0x82062de, (q31_t)0x7f7cf94e, (q31_t)0x813ebc2, + (q31_t)0x7f7e8e1e, (q31_t)0x8077457, (q31_t)0x7f80207b, (q31_t)0x7fafc9c, + (q31_t)0x7f81b065, (q31_t)0x7ee8493, (q31_t)0x7f833ddd, (q31_t)0x7e20c3b, + (q31_t)0x7f84c8e2, (q31_t)0x7d59396, (q31_t)0x7f865174, (q31_t)0x7c91aa3, + (q31_t)0x7f87d792, (q31_t)0x7bca163, (q31_t)0x7f895b3e, (q31_t)0x7b027d7, + (q31_t)0x7f8adc77, (q31_t)0x7a3adff, (q31_t)0x7f8c5b3d, (q31_t)0x79733dc, + (q31_t)0x7f8dd78f, (q31_t)0x78ab96e, (q31_t)0x7f8f516e, (q31_t)0x77e3eb5, + (q31_t)0x7f90c8da, (q31_t)0x771c3b3, (q31_t)0x7f923dd2, (q31_t)0x7654867, + (q31_t)0x7f93b058, (q31_t)0x758ccd2, (q31_t)0x7f952069, (q31_t)0x74c50f4, + (q31_t)0x7f968e07, (q31_t)0x73fd4cf, (q31_t)0x7f97f932, (q31_t)0x7335862, + (q31_t)0x7f9961e8, (q31_t)0x726dbae, (q31_t)0x7f9ac82c, (q31_t)0x71a5eb3, + (q31_t)0x7f9c2bfb, (q31_t)0x70de172, (q31_t)0x7f9d8d56, (q31_t)0x70163eb, + (q31_t)0x7f9eec3e, (q31_t)0x6f4e620, (q31_t)0x7fa048b2, (q31_t)0x6e86810, + (q31_t)0x7fa1a2b2, (q31_t)0x6dbe9bb, (q31_t)0x7fa2fa3d, (q31_t)0x6cf6b23, + (q31_t)0x7fa44f55, (q31_t)0x6c2ec48, (q31_t)0x7fa5a1f9, (q31_t)0x6b66d29, + (q31_t)0x7fa6f228, (q31_t)0x6a9edc9, (q31_t)0x7fa83fe3, (q31_t)0x69d6e27, + (q31_t)0x7fa98b2a, (q31_t)0x690ee44, (q31_t)0x7faad3fd, (q31_t)0x6846e1f, + (q31_t)0x7fac1a5b, (q31_t)0x677edbb, (q31_t)0x7fad5e45, (q31_t)0x66b6d16, + (q31_t)0x7fae9fbb, (q31_t)0x65eec33, (q31_t)0x7fafdebb, (q31_t)0x6526b10, + (q31_t)0x7fb11b48, (q31_t)0x645e9af, (q31_t)0x7fb2555f, (q31_t)0x6396810, + (q31_t)0x7fb38d02, (q31_t)0x62ce634, (q31_t)0x7fb4c231, (q31_t)0x620641a, + (q31_t)0x7fb5f4ea, (q31_t)0x613e1c5, (q31_t)0x7fb7252f, (q31_t)0x6075f33, + (q31_t)0x7fb852ff, (q31_t)0x5fadc66, (q31_t)0x7fb97e5a, (q31_t)0x5ee595d, + (q31_t)0x7fbaa740, (q31_t)0x5e1d61b, (q31_t)0x7fbbcdb1, (q31_t)0x5d5529e, + (q31_t)0x7fbcf1ad, (q31_t)0x5c8cee7, (q31_t)0x7fbe1334, (q31_t)0x5bc4af8, + (q31_t)0x7fbf3246, (q31_t)0x5afc6d0, (q31_t)0x7fc04ee3, (q31_t)0x5a3426f, + (q31_t)0x7fc1690a, (q31_t)0x596bdd7, (q31_t)0x7fc280bc, (q31_t)0x58a3908, + (q31_t)0x7fc395f9, (q31_t)0x57db403, (q31_t)0x7fc4a8c1, (q31_t)0x5712ec7, + (q31_t)0x7fc5b913, (q31_t)0x564a955, (q31_t)0x7fc6c6f0, (q31_t)0x55823ae, + (q31_t)0x7fc7d258, (q31_t)0x54b9dd3, (q31_t)0x7fc8db4a, (q31_t)0x53f17c3, + (q31_t)0x7fc9e1c6, (q31_t)0x532917f, (q31_t)0x7fcae5cd, (q31_t)0x5260b08, + (q31_t)0x7fcbe75e, (q31_t)0x519845e, (q31_t)0x7fcce67a, (q31_t)0x50cfd82, + (q31_t)0x7fcde320, (q31_t)0x5007674, (q31_t)0x7fcedd50, (q31_t)0x4f3ef35, + (q31_t)0x7fcfd50b, (q31_t)0x4e767c5, (q31_t)0x7fd0ca4f, (q31_t)0x4dae024, + (q31_t)0x7fd1bd1e, (q31_t)0x4ce5854, (q31_t)0x7fd2ad77, (q31_t)0x4c1d054, + (q31_t)0x7fd39b5a, (q31_t)0x4b54825, (q31_t)0x7fd486c7, (q31_t)0x4a8bfc7, + (q31_t)0x7fd56fbe, (q31_t)0x49c373c, (q31_t)0x7fd6563f, (q31_t)0x48fae83, + (q31_t)0x7fd73a4a, (q31_t)0x483259d, (q31_t)0x7fd81bdf, (q31_t)0x4769c8b, + (q31_t)0x7fd8fafe, (q31_t)0x46a134c, (q31_t)0x7fd9d7a7, (q31_t)0x45d89e2, + (q31_t)0x7fdab1d9, (q31_t)0x451004d, (q31_t)0x7fdb8996, (q31_t)0x444768d, + (q31_t)0x7fdc5edc, (q31_t)0x437eca4, (q31_t)0x7fdd31ac, (q31_t)0x42b6290, + (q31_t)0x7fde0205, (q31_t)0x41ed854, (q31_t)0x7fdecfe8, (q31_t)0x4124dee, + (q31_t)0x7fdf9b55, (q31_t)0x405c361, (q31_t)0x7fe0644b, (q31_t)0x3f938ac, + (q31_t)0x7fe12acb, (q31_t)0x3ecadcf, (q31_t)0x7fe1eed5, (q31_t)0x3e022cc, + (q31_t)0x7fe2b067, (q31_t)0x3d397a3, (q31_t)0x7fe36f84, (q31_t)0x3c70c54, + (q31_t)0x7fe42c2a, (q31_t)0x3ba80df, (q31_t)0x7fe4e659, (q31_t)0x3adf546, + (q31_t)0x7fe59e12, (q31_t)0x3a16988, (q31_t)0x7fe65354, (q31_t)0x394dda7, + (q31_t)0x7fe7061f, (q31_t)0x38851a2, (q31_t)0x7fe7b674, (q31_t)0x37bc57b, + (q31_t)0x7fe86452, (q31_t)0x36f3931, (q31_t)0x7fe90fb9, (q31_t)0x362acc5, + (q31_t)0x7fe9b8a9, (q31_t)0x3562038, (q31_t)0x7fea5f23, (q31_t)0x3499389, + (q31_t)0x7feb0326, (q31_t)0x33d06bb, (q31_t)0x7feba4b2, (q31_t)0x33079cc, + (q31_t)0x7fec43c7, (q31_t)0x323ecbe, (q31_t)0x7fece065, (q31_t)0x3175f91, + (q31_t)0x7fed7a8c, (q31_t)0x30ad245, (q31_t)0x7fee123d, (q31_t)0x2fe44dc, + (q31_t)0x7feea776, (q31_t)0x2f1b755, (q31_t)0x7fef3a39, (q31_t)0x2e529b0, + (q31_t)0x7fefca84, (q31_t)0x2d89bf0, (q31_t)0x7ff05858, (q31_t)0x2cc0e13, + (q31_t)0x7ff0e3b6, (q31_t)0x2bf801a, (q31_t)0x7ff16c9c, (q31_t)0x2b2f207, + (q31_t)0x7ff1f30b, (q31_t)0x2a663d8, (q31_t)0x7ff27703, (q31_t)0x299d590, + (q31_t)0x7ff2f884, (q31_t)0x28d472e, (q31_t)0x7ff3778e, (q31_t)0x280b8b3, + (q31_t)0x7ff3f420, (q31_t)0x2742a1f, (q31_t)0x7ff46e3c, (q31_t)0x2679b73, + (q31_t)0x7ff4e5e0, (q31_t)0x25b0caf, (q31_t)0x7ff55b0d, (q31_t)0x24e7dd4, + (q31_t)0x7ff5cdc3, (q31_t)0x241eee2, (q31_t)0x7ff63e01, (q31_t)0x2355fd9, + (q31_t)0x7ff6abc8, (q31_t)0x228d0bb, (q31_t)0x7ff71718, (q31_t)0x21c4188, + (q31_t)0x7ff77ff1, (q31_t)0x20fb240, (q31_t)0x7ff7e652, (q31_t)0x20322e3, + (q31_t)0x7ff84a3c, (q31_t)0x1f69373, (q31_t)0x7ff8abae, (q31_t)0x1ea03ef, + (q31_t)0x7ff90aaa, (q31_t)0x1dd7459, (q31_t)0x7ff9672d, (q31_t)0x1d0e4b0, + (q31_t)0x7ff9c13a, (q31_t)0x1c454f5, (q31_t)0x7ffa18cf, (q31_t)0x1b7c528, + (q31_t)0x7ffa6dec, (q31_t)0x1ab354b, (q31_t)0x7ffac092, (q31_t)0x19ea55d, + (q31_t)0x7ffb10c1, (q31_t)0x192155f, (q31_t)0x7ffb5e78, (q31_t)0x1858552, + (q31_t)0x7ffba9b8, (q31_t)0x178f536, (q31_t)0x7ffbf280, (q31_t)0x16c650b, + (q31_t)0x7ffc38d1, (q31_t)0x15fd4d2, (q31_t)0x7ffc7caa, (q31_t)0x153448c, + (q31_t)0x7ffcbe0c, (q31_t)0x146b438, (q31_t)0x7ffcfcf6, (q31_t)0x13a23d8, + (q31_t)0x7ffd3969, (q31_t)0x12d936c, (q31_t)0x7ffd7364, (q31_t)0x12102f4, + (q31_t)0x7ffdaae7, (q31_t)0x1147271, (q31_t)0x7ffddff3, (q31_t)0x107e1e3, + (q31_t)0x7ffe1288, (q31_t)0xfb514b, (q31_t)0x7ffe42a4, (q31_t)0xeec0aa, + (q31_t)0x7ffe704a, (q31_t)0xe22fff, (q31_t)0x7ffe9b77, (q31_t)0xd59f4c, + (q31_t)0x7ffec42d, (q31_t)0xc90e90, (q31_t)0x7ffeea6c, (q31_t)0xbc7dcc, + (q31_t)0x7fff0e32, (q31_t)0xafed02, (q31_t)0x7fff2f82, (q31_t)0xa35c30, + (q31_t)0x7fff4e59, (q31_t)0x96cb58, (q31_t)0x7fff6ab9, (q31_t)0x8a3a7b, + (q31_t)0x7fff84a1, (q31_t)0x7da998, (q31_t)0x7fff9c12, (q31_t)0x7118b0, + (q31_t)0x7fffb10b, (q31_t)0x6487c4, (q31_t)0x7fffc38c, (q31_t)0x57f6d4, + (q31_t)0x7fffd396, (q31_t)0x4b65e1, (q31_t)0x7fffe128, (q31_t)0x3ed4ea, + (q31_t)0x7fffec43, (q31_t)0x3243f1, (q31_t)0x7ffff4e6, (q31_t)0x25b2f7, + (q31_t)0x7ffffb11, (q31_t)0x1921fb, (q31_t)0x7ffffec4, (q31_t)0xc90fe, + (q31_t)0x7fffffff, (q31_t)0x0, (q31_t)0x7ffffec4, (q31_t)0xfff36f02, + (q31_t)0x7ffffb11, (q31_t)0xffe6de05, (q31_t)0x7ffff4e6, (q31_t)0xffda4d09, + (q31_t)0x7fffec43, (q31_t)0xffcdbc0f, (q31_t)0x7fffe128, (q31_t)0xffc12b16, + (q31_t)0x7fffd396, (q31_t)0xffb49a1f, (q31_t)0x7fffc38c, (q31_t)0xffa8092c, + (q31_t)0x7fffb10b, (q31_t)0xff9b783c, (q31_t)0x7fff9c12, (q31_t)0xff8ee750, + (q31_t)0x7fff84a1, (q31_t)0xff825668, (q31_t)0x7fff6ab9, (q31_t)0xff75c585, + (q31_t)0x7fff4e59, (q31_t)0xff6934a8, (q31_t)0x7fff2f82, (q31_t)0xff5ca3d0, + (q31_t)0x7fff0e32, (q31_t)0xff5012fe, (q31_t)0x7ffeea6c, (q31_t)0xff438234, + (q31_t)0x7ffec42d, (q31_t)0xff36f170, (q31_t)0x7ffe9b77, (q31_t)0xff2a60b4, + (q31_t)0x7ffe704a, (q31_t)0xff1dd001, (q31_t)0x7ffe42a4, (q31_t)0xff113f56, + (q31_t)0x7ffe1288, (q31_t)0xff04aeb5, (q31_t)0x7ffddff3, (q31_t)0xfef81e1d, + (q31_t)0x7ffdaae7, (q31_t)0xfeeb8d8f, (q31_t)0x7ffd7364, (q31_t)0xfedefd0c, + (q31_t)0x7ffd3969, (q31_t)0xfed26c94, (q31_t)0x7ffcfcf6, (q31_t)0xfec5dc28, + (q31_t)0x7ffcbe0c, (q31_t)0xfeb94bc8, (q31_t)0x7ffc7caa, (q31_t)0xfeacbb74, + (q31_t)0x7ffc38d1, (q31_t)0xfea02b2e, (q31_t)0x7ffbf280, (q31_t)0xfe939af5, + (q31_t)0x7ffba9b8, (q31_t)0xfe870aca, (q31_t)0x7ffb5e78, (q31_t)0xfe7a7aae, + (q31_t)0x7ffb10c1, (q31_t)0xfe6deaa1, (q31_t)0x7ffac092, (q31_t)0xfe615aa3, + (q31_t)0x7ffa6dec, (q31_t)0xfe54cab5, (q31_t)0x7ffa18cf, (q31_t)0xfe483ad8, + (q31_t)0x7ff9c13a, (q31_t)0xfe3bab0b, (q31_t)0x7ff9672d, (q31_t)0xfe2f1b50, + (q31_t)0x7ff90aaa, (q31_t)0xfe228ba7, (q31_t)0x7ff8abae, (q31_t)0xfe15fc11, + (q31_t)0x7ff84a3c, (q31_t)0xfe096c8d, (q31_t)0x7ff7e652, (q31_t)0xfdfcdd1d, + (q31_t)0x7ff77ff1, (q31_t)0xfdf04dc0, (q31_t)0x7ff71718, (q31_t)0xfde3be78, + (q31_t)0x7ff6abc8, (q31_t)0xfdd72f45, (q31_t)0x7ff63e01, (q31_t)0xfdcaa027, + (q31_t)0x7ff5cdc3, (q31_t)0xfdbe111e, (q31_t)0x7ff55b0d, (q31_t)0xfdb1822c, + (q31_t)0x7ff4e5e0, (q31_t)0xfda4f351, (q31_t)0x7ff46e3c, (q31_t)0xfd98648d, + (q31_t)0x7ff3f420, (q31_t)0xfd8bd5e1, (q31_t)0x7ff3778e, (q31_t)0xfd7f474d, + (q31_t)0x7ff2f884, (q31_t)0xfd72b8d2, (q31_t)0x7ff27703, (q31_t)0xfd662a70, + (q31_t)0x7ff1f30b, (q31_t)0xfd599c28, (q31_t)0x7ff16c9c, (q31_t)0xfd4d0df9, + (q31_t)0x7ff0e3b6, (q31_t)0xfd407fe6, (q31_t)0x7ff05858, (q31_t)0xfd33f1ed, + (q31_t)0x7fefca84, (q31_t)0xfd276410, (q31_t)0x7fef3a39, (q31_t)0xfd1ad650, + (q31_t)0x7feea776, (q31_t)0xfd0e48ab, (q31_t)0x7fee123d, (q31_t)0xfd01bb24, + (q31_t)0x7fed7a8c, (q31_t)0xfcf52dbb, (q31_t)0x7fece065, (q31_t)0xfce8a06f, + (q31_t)0x7fec43c7, (q31_t)0xfcdc1342, (q31_t)0x7feba4b2, (q31_t)0xfccf8634, + (q31_t)0x7feb0326, (q31_t)0xfcc2f945, (q31_t)0x7fea5f23, (q31_t)0xfcb66c77, + (q31_t)0x7fe9b8a9, (q31_t)0xfca9dfc8, (q31_t)0x7fe90fb9, (q31_t)0xfc9d533b, + (q31_t)0x7fe86452, (q31_t)0xfc90c6cf, (q31_t)0x7fe7b674, (q31_t)0xfc843a85, + (q31_t)0x7fe7061f, (q31_t)0xfc77ae5e, (q31_t)0x7fe65354, (q31_t)0xfc6b2259, + (q31_t)0x7fe59e12, (q31_t)0xfc5e9678, (q31_t)0x7fe4e659, (q31_t)0xfc520aba, + (q31_t)0x7fe42c2a, (q31_t)0xfc457f21, (q31_t)0x7fe36f84, (q31_t)0xfc38f3ac, + (q31_t)0x7fe2b067, (q31_t)0xfc2c685d, (q31_t)0x7fe1eed5, (q31_t)0xfc1fdd34, + (q31_t)0x7fe12acb, (q31_t)0xfc135231, (q31_t)0x7fe0644b, (q31_t)0xfc06c754, + (q31_t)0x7fdf9b55, (q31_t)0xfbfa3c9f, (q31_t)0x7fdecfe8, (q31_t)0xfbedb212, + (q31_t)0x7fde0205, (q31_t)0xfbe127ac, (q31_t)0x7fdd31ac, (q31_t)0xfbd49d70, + (q31_t)0x7fdc5edc, (q31_t)0xfbc8135c, (q31_t)0x7fdb8996, (q31_t)0xfbbb8973, + (q31_t)0x7fdab1d9, (q31_t)0xfbaeffb3, (q31_t)0x7fd9d7a7, (q31_t)0xfba2761e, + (q31_t)0x7fd8fafe, (q31_t)0xfb95ecb4, (q31_t)0x7fd81bdf, (q31_t)0xfb896375, + (q31_t)0x7fd73a4a, (q31_t)0xfb7cda63, (q31_t)0x7fd6563f, (q31_t)0xfb70517d, + (q31_t)0x7fd56fbe, (q31_t)0xfb63c8c4, (q31_t)0x7fd486c7, (q31_t)0xfb574039, + (q31_t)0x7fd39b5a, (q31_t)0xfb4ab7db, (q31_t)0x7fd2ad77, (q31_t)0xfb3e2fac, + (q31_t)0x7fd1bd1e, (q31_t)0xfb31a7ac, (q31_t)0x7fd0ca4f, (q31_t)0xfb251fdc, + (q31_t)0x7fcfd50b, (q31_t)0xfb18983b, (q31_t)0x7fcedd50, (q31_t)0xfb0c10cb, + (q31_t)0x7fcde320, (q31_t)0xfaff898c, (q31_t)0x7fcce67a, (q31_t)0xfaf3027e, + (q31_t)0x7fcbe75e, (q31_t)0xfae67ba2, (q31_t)0x7fcae5cd, (q31_t)0xfad9f4f8, + (q31_t)0x7fc9e1c6, (q31_t)0xfacd6e81, (q31_t)0x7fc8db4a, (q31_t)0xfac0e83d, + (q31_t)0x7fc7d258, (q31_t)0xfab4622d, (q31_t)0x7fc6c6f0, (q31_t)0xfaa7dc52, + (q31_t)0x7fc5b913, (q31_t)0xfa9b56ab, (q31_t)0x7fc4a8c1, (q31_t)0xfa8ed139, + (q31_t)0x7fc395f9, (q31_t)0xfa824bfd, (q31_t)0x7fc280bc, (q31_t)0xfa75c6f8, + (q31_t)0x7fc1690a, (q31_t)0xfa694229, (q31_t)0x7fc04ee3, (q31_t)0xfa5cbd91, + (q31_t)0x7fbf3246, (q31_t)0xfa503930, (q31_t)0x7fbe1334, (q31_t)0xfa43b508, + (q31_t)0x7fbcf1ad, (q31_t)0xfa373119, (q31_t)0x7fbbcdb1, (q31_t)0xfa2aad62, + (q31_t)0x7fbaa740, (q31_t)0xfa1e29e5, (q31_t)0x7fb97e5a, (q31_t)0xfa11a6a3, + (q31_t)0x7fb852ff, (q31_t)0xfa05239a, (q31_t)0x7fb7252f, (q31_t)0xf9f8a0cd, + (q31_t)0x7fb5f4ea, (q31_t)0xf9ec1e3b, (q31_t)0x7fb4c231, (q31_t)0xf9df9be6, + (q31_t)0x7fb38d02, (q31_t)0xf9d319cc, (q31_t)0x7fb2555f, (q31_t)0xf9c697f0, + (q31_t)0x7fb11b48, (q31_t)0xf9ba1651, (q31_t)0x7fafdebb, (q31_t)0xf9ad94f0, + (q31_t)0x7fae9fbb, (q31_t)0xf9a113cd, (q31_t)0x7fad5e45, (q31_t)0xf99492ea, + (q31_t)0x7fac1a5b, (q31_t)0xf9881245, (q31_t)0x7faad3fd, (q31_t)0xf97b91e1, + (q31_t)0x7fa98b2a, (q31_t)0xf96f11bc, (q31_t)0x7fa83fe3, (q31_t)0xf96291d9, + (q31_t)0x7fa6f228, (q31_t)0xf9561237, (q31_t)0x7fa5a1f9, (q31_t)0xf94992d7, + (q31_t)0x7fa44f55, (q31_t)0xf93d13b8, (q31_t)0x7fa2fa3d, (q31_t)0xf93094dd, + (q31_t)0x7fa1a2b2, (q31_t)0xf9241645, (q31_t)0x7fa048b2, (q31_t)0xf91797f0, + (q31_t)0x7f9eec3e, (q31_t)0xf90b19e0, (q31_t)0x7f9d8d56, (q31_t)0xf8fe9c15, + (q31_t)0x7f9c2bfb, (q31_t)0xf8f21e8e, (q31_t)0x7f9ac82c, (q31_t)0xf8e5a14d, + (q31_t)0x7f9961e8, (q31_t)0xf8d92452, (q31_t)0x7f97f932, (q31_t)0xf8cca79e, + (q31_t)0x7f968e07, (q31_t)0xf8c02b31, (q31_t)0x7f952069, (q31_t)0xf8b3af0c, + (q31_t)0x7f93b058, (q31_t)0xf8a7332e, (q31_t)0x7f923dd2, (q31_t)0xf89ab799, + (q31_t)0x7f90c8da, (q31_t)0xf88e3c4d, (q31_t)0x7f8f516e, (q31_t)0xf881c14b, + (q31_t)0x7f8dd78f, (q31_t)0xf8754692, (q31_t)0x7f8c5b3d, (q31_t)0xf868cc24, + (q31_t)0x7f8adc77, (q31_t)0xf85c5201, (q31_t)0x7f895b3e, (q31_t)0xf84fd829, + (q31_t)0x7f87d792, (q31_t)0xf8435e9d, (q31_t)0x7f865174, (q31_t)0xf836e55d, + (q31_t)0x7f84c8e2, (q31_t)0xf82a6c6a, (q31_t)0x7f833ddd, (q31_t)0xf81df3c5, + (q31_t)0x7f81b065, (q31_t)0xf8117b6d, (q31_t)0x7f80207b, (q31_t)0xf8050364, + (q31_t)0x7f7e8e1e, (q31_t)0xf7f88ba9, (q31_t)0x7f7cf94e, (q31_t)0xf7ec143e, + (q31_t)0x7f7b620c, (q31_t)0xf7df9d22, (q31_t)0x7f79c857, (q31_t)0xf7d32657, + (q31_t)0x7f782c30, (q31_t)0xf7c6afdc, (q31_t)0x7f768d96, (q31_t)0xf7ba39b3, + (q31_t)0x7f74ec8a, (q31_t)0xf7adc3db, (q31_t)0x7f73490b, (q31_t)0xf7a14e55, + (q31_t)0x7f71a31b, (q31_t)0xf794d922, (q31_t)0x7f6ffab8, (q31_t)0xf7886442, + (q31_t)0x7f6e4fe3, (q31_t)0xf77befb5, (q31_t)0x7f6ca29c, (q31_t)0xf76f7b7d, + (q31_t)0x7f6af2e3, (q31_t)0xf7630799, (q31_t)0x7f6940b8, (q31_t)0xf756940a, + (q31_t)0x7f678c1c, (q31_t)0xf74a20d0, (q31_t)0x7f65d50d, (q31_t)0xf73daded, + (q31_t)0x7f641b8d, (q31_t)0xf7313b60, (q31_t)0x7f625f9b, (q31_t)0xf724c92a, + (q31_t)0x7f60a138, (q31_t)0xf718574b, (q31_t)0x7f5ee063, (q31_t)0xf70be5c4, + (q31_t)0x7f5d1d1d, (q31_t)0xf6ff7496, (q31_t)0x7f5b5765, (q31_t)0xf6f303c0, + (q31_t)0x7f598f3c, (q31_t)0xf6e69344, (q31_t)0x7f57c4a2, (q31_t)0xf6da2321, + (q31_t)0x7f55f796, (q31_t)0xf6cdb359, (q31_t)0x7f54281a, (q31_t)0xf6c143ec, + (q31_t)0x7f52562c, (q31_t)0xf6b4d4d9, (q31_t)0x7f5081cd, (q31_t)0xf6a86623, + (q31_t)0x7f4eaafe, (q31_t)0xf69bf7c9, (q31_t)0x7f4cd1be, (q31_t)0xf68f89cb, + (q31_t)0x7f4af60d, (q31_t)0xf6831c2b, (q31_t)0x7f4917eb, (q31_t)0xf676aee8, + (q31_t)0x7f473759, (q31_t)0xf66a4203, (q31_t)0x7f455456, (q31_t)0xf65dd57d, + (q31_t)0x7f436ee3, (q31_t)0xf6516956, (q31_t)0x7f4186ff, (q31_t)0xf644fd8f, + (q31_t)0x7f3f9cab, (q31_t)0xf6389228, (q31_t)0x7f3dafe7, (q31_t)0xf62c2721, + (q31_t)0x7f3bc0b3, (q31_t)0xf61fbc7b, (q31_t)0x7f39cf0e, (q31_t)0xf6135237, + (q31_t)0x7f37dafa, (q31_t)0xf606e854, (q31_t)0x7f35e476, (q31_t)0xf5fa7ed4, + (q31_t)0x7f33eb81, (q31_t)0xf5ee15b7, (q31_t)0x7f31f01d, (q31_t)0xf5e1acfd, + (q31_t)0x7f2ff24a, (q31_t)0xf5d544a7, (q31_t)0x7f2df206, (q31_t)0xf5c8dcb6, + (q31_t)0x7f2bef53, (q31_t)0xf5bc7529, (q31_t)0x7f29ea31, (q31_t)0xf5b00e02, + (q31_t)0x7f27e29f, (q31_t)0xf5a3a740, (q31_t)0x7f25d89e, (q31_t)0xf59740e5, + (q31_t)0x7f23cc2e, (q31_t)0xf58adaf0, (q31_t)0x7f21bd4e, (q31_t)0xf57e7563, + (q31_t)0x7f1fabff, (q31_t)0xf572103d, (q31_t)0x7f1d9842, (q31_t)0xf565ab80, + (q31_t)0x7f1b8215, (q31_t)0xf559472b, (q31_t)0x7f19697a, (q31_t)0xf54ce33f, + (q31_t)0x7f174e70, (q31_t)0xf5407fbd, (q31_t)0x7f1530f7, (q31_t)0xf5341ca5, + (q31_t)0x7f13110f, (q31_t)0xf527b9f7, (q31_t)0x7f10eeb9, (q31_t)0xf51b57b5, + (q31_t)0x7f0ec9f5, (q31_t)0xf50ef5de, (q31_t)0x7f0ca2c2, (q31_t)0xf5029473, + (q31_t)0x7f0a7921, (q31_t)0xf4f63374, (q31_t)0x7f084d12, (q31_t)0xf4e9d2e3, + (q31_t)0x7f061e95, (q31_t)0xf4dd72be, (q31_t)0x7f03eda9, (q31_t)0xf4d11308, + (q31_t)0x7f01ba50, (q31_t)0xf4c4b3c0, (q31_t)0x7eff8489, (q31_t)0xf4b854e7, + (q31_t)0x7efd4c54, (q31_t)0xf4abf67e, (q31_t)0x7efb11b1, (q31_t)0xf49f9884, + (q31_t)0x7ef8d4a1, (q31_t)0xf4933afa, (q31_t)0x7ef69523, (q31_t)0xf486dde1, + (q31_t)0x7ef45338, (q31_t)0xf47a8139, (q31_t)0x7ef20ee0, (q31_t)0xf46e2504, + (q31_t)0x7eefc81a, (q31_t)0xf461c940, (q31_t)0x7eed7ee7, (q31_t)0xf4556def, + (q31_t)0x7eeb3347, (q31_t)0xf4491311, (q31_t)0x7ee8e53a, (q31_t)0xf43cb8a7, + (q31_t)0x7ee694c1, (q31_t)0xf4305eb0, (q31_t)0x7ee441da, (q31_t)0xf424052f, + (q31_t)0x7ee1ec87, (q31_t)0xf417ac22, (q31_t)0x7edf94c7, (q31_t)0xf40b538b, + (q31_t)0x7edd3a9a, (q31_t)0xf3fefb6a, (q31_t)0x7edade01, (q31_t)0xf3f2a3bf, + (q31_t)0x7ed87efc, (q31_t)0xf3e64c8c, (q31_t)0x7ed61d8a, (q31_t)0xf3d9f5cf, + (q31_t)0x7ed3b9ad, (q31_t)0xf3cd9f8b, (q31_t)0x7ed15363, (q31_t)0xf3c149bf, + (q31_t)0x7eceeaad, (q31_t)0xf3b4f46c, (q31_t)0x7ecc7f8b, (q31_t)0xf3a89f92, + (q31_t)0x7eca11fe, (q31_t)0xf39c4b32, (q31_t)0x7ec7a205, (q31_t)0xf38ff74d, + (q31_t)0x7ec52fa0, (q31_t)0xf383a3e2, (q31_t)0x7ec2bad0, (q31_t)0xf37750f2, + (q31_t)0x7ec04394, (q31_t)0xf36afe7e, (q31_t)0x7ebdc9ed, (q31_t)0xf35eac86, + (q31_t)0x7ebb4ddb, (q31_t)0xf3525b0b, (q31_t)0x7eb8cf5d, (q31_t)0xf3460a0d, + (q31_t)0x7eb64e75, (q31_t)0xf339b98d, (q31_t)0x7eb3cb21, (q31_t)0xf32d698a, + (q31_t)0x7eb14563, (q31_t)0xf3211a07, (q31_t)0x7eaebd3a, (q31_t)0xf314cb02, + (q31_t)0x7eac32a6, (q31_t)0xf3087c7d, (q31_t)0x7ea9a5a8, (q31_t)0xf2fc2e77, + (q31_t)0x7ea7163f, (q31_t)0xf2efe0f2, (q31_t)0x7ea4846c, (q31_t)0xf2e393ef, + (q31_t)0x7ea1f02f, (q31_t)0xf2d7476c, (q31_t)0x7e9f5988, (q31_t)0xf2cafb6b, + (q31_t)0x7e9cc076, (q31_t)0xf2beafed, (q31_t)0x7e9a24fb, (q31_t)0xf2b264f2, + (q31_t)0x7e978715, (q31_t)0xf2a61a7a, (q31_t)0x7e94e6c6, (q31_t)0xf299d085, + (q31_t)0x7e92440d, (q31_t)0xf28d8715, (q31_t)0x7e8f9eeb, (q31_t)0xf2813e2a, + (q31_t)0x7e8cf75f, (q31_t)0xf274f5c3, (q31_t)0x7e8a4d6a, (q31_t)0xf268ade3, + (q31_t)0x7e87a10c, (q31_t)0xf25c6688, (q31_t)0x7e84f245, (q31_t)0xf2501fb5, + (q31_t)0x7e824114, (q31_t)0xf243d968, (q31_t)0x7e7f8d7b, (q31_t)0xf23793a3, + (q31_t)0x7e7cd778, (q31_t)0xf22b4e66, (q31_t)0x7e7a1f0d, (q31_t)0xf21f09b1, + (q31_t)0x7e77643a, (q31_t)0xf212c585, (q31_t)0x7e74a6fd, (q31_t)0xf20681e3, + (q31_t)0x7e71e759, (q31_t)0xf1fa3ecb, (q31_t)0x7e6f254c, (q31_t)0xf1edfc3d, + (q31_t)0x7e6c60d7, (q31_t)0xf1e1ba3a, (q31_t)0x7e6999fa, (q31_t)0xf1d578c2, + (q31_t)0x7e66d0b4, (q31_t)0xf1c937d6, (q31_t)0x7e640507, (q31_t)0xf1bcf777, + (q31_t)0x7e6136f3, (q31_t)0xf1b0b7a4, (q31_t)0x7e5e6676, (q31_t)0xf1a4785e, + (q31_t)0x7e5b9392, (q31_t)0xf19839a6, (q31_t)0x7e58be47, (q31_t)0xf18bfb7d, + (q31_t)0x7e55e694, (q31_t)0xf17fbde2, (q31_t)0x7e530c7a, (q31_t)0xf17380d6, + (q31_t)0x7e502ff9, (q31_t)0xf1674459, (q31_t)0x7e4d5110, (q31_t)0xf15b086d, + (q31_t)0x7e4a6fc1, (q31_t)0xf14ecd11, (q31_t)0x7e478c0b, (q31_t)0xf1429247, + (q31_t)0x7e44a5ef, (q31_t)0xf136580d, (q31_t)0x7e41bd6c, (q31_t)0xf12a1e66, + (q31_t)0x7e3ed282, (q31_t)0xf11de551, (q31_t)0x7e3be532, (q31_t)0xf111accf, + (q31_t)0x7e38f57c, (q31_t)0xf10574e0, (q31_t)0x7e360360, (q31_t)0xf0f93d86, + (q31_t)0x7e330ede, (q31_t)0xf0ed06bf, (q31_t)0x7e3017f6, (q31_t)0xf0e0d08d, + (q31_t)0x7e2d1ea8, (q31_t)0xf0d49af1, (q31_t)0x7e2a22f4, (q31_t)0xf0c865ea, + (q31_t)0x7e2724db, (q31_t)0xf0bc317a, (q31_t)0x7e24245d, (q31_t)0xf0affda0, + (q31_t)0x7e212179, (q31_t)0xf0a3ca5d, (q31_t)0x7e1e1c30, (q31_t)0xf09797b2, + (q31_t)0x7e1b1482, (q31_t)0xf08b659f, (q31_t)0x7e180a6f, (q31_t)0xf07f3424, + (q31_t)0x7e14fdf7, (q31_t)0xf0730342, (q31_t)0x7e11ef1b, (q31_t)0xf066d2fa, + (q31_t)0x7e0eddd9, (q31_t)0xf05aa34c, (q31_t)0x7e0bca34, (q31_t)0xf04e7438, + (q31_t)0x7e08b42a, (q31_t)0xf04245c0, (q31_t)0x7e059bbb, (q31_t)0xf03617e2, + (q31_t)0x7e0280e9, (q31_t)0xf029eaa1, (q31_t)0x7dff63b2, (q31_t)0xf01dbdfb, + (q31_t)0x7dfc4418, (q31_t)0xf01191f3, (q31_t)0x7df9221a, (q31_t)0xf0056687, + (q31_t)0x7df5fdb8, (q31_t)0xeff93bba, (q31_t)0x7df2d6f3, (q31_t)0xefed118a, + (q31_t)0x7defadca, (q31_t)0xefe0e7f9, (q31_t)0x7dec823e, (q31_t)0xefd4bf08, + (q31_t)0x7de9544f, (q31_t)0xefc896b5, (q31_t)0x7de623fd, (q31_t)0xefbc6f03, + (q31_t)0x7de2f148, (q31_t)0xefb047f2, (q31_t)0x7ddfbc30, (q31_t)0xefa42181, + (q31_t)0x7ddc84b5, (q31_t)0xef97fbb2, (q31_t)0x7dd94ad8, (q31_t)0xef8bd685, + (q31_t)0x7dd60e99, (q31_t)0xef7fb1fa, (q31_t)0x7dd2cff7, (q31_t)0xef738e12, + (q31_t)0x7dcf8ef3, (q31_t)0xef676ace, (q31_t)0x7dcc4b8d, (q31_t)0xef5b482d, + (q31_t)0x7dc905c5, (q31_t)0xef4f2630, (q31_t)0x7dc5bd9b, (q31_t)0xef4304d8, + (q31_t)0x7dc2730f, (q31_t)0xef36e426, (q31_t)0x7dbf2622, (q31_t)0xef2ac419, + (q31_t)0x7dbbd6d4, (q31_t)0xef1ea4b2, (q31_t)0x7db88524, (q31_t)0xef1285f2, + (q31_t)0x7db53113, (q31_t)0xef0667d9, (q31_t)0x7db1daa2, (q31_t)0xeefa4a67, + (q31_t)0x7dae81cf, (q31_t)0xeeee2d9d, (q31_t)0x7dab269b, (q31_t)0xeee2117c, + (q31_t)0x7da7c907, (q31_t)0xeed5f604, (q31_t)0x7da46912, (q31_t)0xeec9db35, + (q31_t)0x7da106bd, (q31_t)0xeebdc110, (q31_t)0x7d9da208, (q31_t)0xeeb1a796, + (q31_t)0x7d9a3af2, (q31_t)0xeea58ec6, (q31_t)0x7d96d17d, (q31_t)0xee9976a1, + (q31_t)0x7d9365a8, (q31_t)0xee8d5f29, (q31_t)0x7d8ff772, (q31_t)0xee81485c, + (q31_t)0x7d8c86de, (q31_t)0xee75323c, (q31_t)0x7d8913ea, (q31_t)0xee691cc9, + (q31_t)0x7d859e96, (q31_t)0xee5d0804, (q31_t)0x7d8226e4, (q31_t)0xee50f3ed, + (q31_t)0x7d7eacd2, (q31_t)0xee44e084, (q31_t)0x7d7b3061, (q31_t)0xee38cdcb, + (q31_t)0x7d77b192, (q31_t)0xee2cbbc1, (q31_t)0x7d743064, (q31_t)0xee20aa67, + (q31_t)0x7d70acd7, (q31_t)0xee1499bd, (q31_t)0x7d6d26ec, (q31_t)0xee0889c4, + (q31_t)0x7d699ea3, (q31_t)0xedfc7a7c, (q31_t)0x7d6613fb, (q31_t)0xedf06be6, + (q31_t)0x7d6286f6, (q31_t)0xede45e03, (q31_t)0x7d5ef793, (q31_t)0xedd850d2, + (q31_t)0x7d5b65d2, (q31_t)0xedcc4454, (q31_t)0x7d57d1b3, (q31_t)0xedc0388a, + (q31_t)0x7d543b37, (q31_t)0xedb42d74, (q31_t)0x7d50a25e, (q31_t)0xeda82313, + (q31_t)0x7d4d0728, (q31_t)0xed9c1967, (q31_t)0x7d496994, (q31_t)0xed901070, + (q31_t)0x7d45c9a4, (q31_t)0xed84082f, (q31_t)0x7d422757, (q31_t)0xed7800a5, + (q31_t)0x7d3e82ae, (q31_t)0xed6bf9d1, (q31_t)0x7d3adba7, (q31_t)0xed5ff3b5, + (q31_t)0x7d373245, (q31_t)0xed53ee51, (q31_t)0x7d338687, (q31_t)0xed47e9a5, + (q31_t)0x7d2fd86c, (q31_t)0xed3be5b1, (q31_t)0x7d2c27f6, (q31_t)0xed2fe277, + (q31_t)0x7d287523, (q31_t)0xed23dff7, (q31_t)0x7d24bff6, (q31_t)0xed17de31, + (q31_t)0x7d21086c, (q31_t)0xed0bdd25, (q31_t)0x7d1d4e88, (q31_t)0xecffdcd4, + (q31_t)0x7d199248, (q31_t)0xecf3dd3f, (q31_t)0x7d15d3ad, (q31_t)0xece7de66, + (q31_t)0x7d1212b7, (q31_t)0xecdbe04a, (q31_t)0x7d0e4f67, (q31_t)0xeccfe2ea, + (q31_t)0x7d0a89bc, (q31_t)0xecc3e648, (q31_t)0x7d06c1b6, (q31_t)0xecb7ea63, + (q31_t)0x7d02f757, (q31_t)0xecabef3d, (q31_t)0x7cff2a9d, (q31_t)0xec9ff4d6, + (q31_t)0x7cfb5b89, (q31_t)0xec93fb2e, (q31_t)0x7cf78a1b, (q31_t)0xec880245, + (q31_t)0x7cf3b653, (q31_t)0xec7c0a1d, (q31_t)0x7cefe032, (q31_t)0xec7012b5, + (q31_t)0x7cec07b8, (q31_t)0xec641c0e, (q31_t)0x7ce82ce4, (q31_t)0xec582629, + (q31_t)0x7ce44fb7, (q31_t)0xec4c3106, (q31_t)0x7ce07031, (q31_t)0xec403ca5, + (q31_t)0x7cdc8e52, (q31_t)0xec344908, (q31_t)0x7cd8aa1b, (q31_t)0xec28562d, + (q31_t)0x7cd4c38b, (q31_t)0xec1c6417, (q31_t)0x7cd0daa2, (q31_t)0xec1072c4, + (q31_t)0x7cccef62, (q31_t)0xec048237, (q31_t)0x7cc901c9, (q31_t)0xebf8926f, + (q31_t)0x7cc511d9, (q31_t)0xebeca36c, (q31_t)0x7cc11f90, (q31_t)0xebe0b52f, + (q31_t)0x7cbd2af0, (q31_t)0xebd4c7ba, (q31_t)0x7cb933f9, (q31_t)0xebc8db0b, + (q31_t)0x7cb53aaa, (q31_t)0xebbcef23, (q31_t)0x7cb13f04, (q31_t)0xebb10404, + (q31_t)0x7cad4107, (q31_t)0xeba519ad, (q31_t)0x7ca940b3, (q31_t)0xeb99301f, + (q31_t)0x7ca53e09, (q31_t)0xeb8d475b, (q31_t)0x7ca13908, (q31_t)0xeb815f60, + (q31_t)0x7c9d31b0, (q31_t)0xeb75782f, (q31_t)0x7c992803, (q31_t)0xeb6991ca, + (q31_t)0x7c951bff, (q31_t)0xeb5dac2f, (q31_t)0x7c910da5, (q31_t)0xeb51c760, + (q31_t)0x7c8cfcf6, (q31_t)0xeb45e35d, (q31_t)0x7c88e9f1, (q31_t)0xeb3a0027, + (q31_t)0x7c84d496, (q31_t)0xeb2e1dbe, (q31_t)0x7c80bce7, (q31_t)0xeb223c22, + (q31_t)0x7c7ca2e2, (q31_t)0xeb165b54, (q31_t)0x7c788688, (q31_t)0xeb0a7b54, + (q31_t)0x7c7467d9, (q31_t)0xeafe9c24, (q31_t)0x7c7046d6, (q31_t)0xeaf2bdc3, + (q31_t)0x7c6c237e, (q31_t)0xeae6e031, (q31_t)0x7c67fdd1, (q31_t)0xeadb0370, + (q31_t)0x7c63d5d1, (q31_t)0xeacf277f, (q31_t)0x7c5fab7c, (q31_t)0xeac34c60, + (q31_t)0x7c5b7ed4, (q31_t)0xeab77212, (q31_t)0x7c574fd8, (q31_t)0xeaab9896, + (q31_t)0x7c531e88, (q31_t)0xea9fbfed, (q31_t)0x7c4eeae5, (q31_t)0xea93e817, + (q31_t)0x7c4ab4ef, (q31_t)0xea881114, (q31_t)0x7c467ca6, (q31_t)0xea7c3ae5, + (q31_t)0x7c42420a, (q31_t)0xea70658a, (q31_t)0x7c3e051b, (q31_t)0xea649105, + (q31_t)0x7c39c5da, (q31_t)0xea58bd54, (q31_t)0x7c358446, (q31_t)0xea4cea79, + (q31_t)0x7c314060, (q31_t)0xea411874, (q31_t)0x7c2cfa28, (q31_t)0xea354746, + (q31_t)0x7c28b19e, (q31_t)0xea2976ef, (q31_t)0x7c2466c2, (q31_t)0xea1da770, + (q31_t)0x7c201994, (q31_t)0xea11d8c8, (q31_t)0x7c1bca16, (q31_t)0xea060af9, + (q31_t)0x7c177845, (q31_t)0xe9fa3e03, (q31_t)0x7c132424, (q31_t)0xe9ee71e6, + (q31_t)0x7c0ecdb2, (q31_t)0xe9e2a6a3, (q31_t)0x7c0a74f0, (q31_t)0xe9d6dc3b, + (q31_t)0x7c0619dc, (q31_t)0xe9cb12ad, (q31_t)0x7c01bc78, (q31_t)0xe9bf49fa, + (q31_t)0x7bfd5cc4, (q31_t)0xe9b38223, (q31_t)0x7bf8fac0, (q31_t)0xe9a7bb28, + (q31_t)0x7bf4966c, (q31_t)0xe99bf509, (q31_t)0x7bf02fc9, (q31_t)0xe9902fc7, + (q31_t)0x7bebc6d5, (q31_t)0xe9846b63, (q31_t)0x7be75b93, (q31_t)0xe978a7dd, + (q31_t)0x7be2ee01, (q31_t)0xe96ce535, (q31_t)0x7bde7e20, (q31_t)0xe961236c, + (q31_t)0x7bda0bf0, (q31_t)0xe9556282, (q31_t)0x7bd59771, (q31_t)0xe949a278, + (q31_t)0x7bd120a4, (q31_t)0xe93de34e, (q31_t)0x7bcca789, (q31_t)0xe9322505, + (q31_t)0x7bc82c1f, (q31_t)0xe926679c, (q31_t)0x7bc3ae67, (q31_t)0xe91aab16, + (q31_t)0x7bbf2e62, (q31_t)0xe90eef71, (q31_t)0x7bbaac0e, (q31_t)0xe90334af, + (q31_t)0x7bb6276e, (q31_t)0xe8f77acf, (q31_t)0x7bb1a080, (q31_t)0xe8ebc1d3, + (q31_t)0x7bad1744, (q31_t)0xe8e009ba, (q31_t)0x7ba88bbc, (q31_t)0xe8d45286, + (q31_t)0x7ba3fde7, (q31_t)0xe8c89c37, (q31_t)0x7b9f6dc5, (q31_t)0xe8bce6cd, + (q31_t)0x7b9adb57, (q31_t)0xe8b13248, (q31_t)0x7b96469d, (q31_t)0xe8a57ea9, + (q31_t)0x7b91af97, (q31_t)0xe899cbf1, (q31_t)0x7b8d1644, (q31_t)0xe88e1a20, + (q31_t)0x7b887aa6, (q31_t)0xe8826936, (q31_t)0x7b83dcbc, (q31_t)0xe876b934, + (q31_t)0x7b7f3c87, (q31_t)0xe86b0a1a, (q31_t)0x7b7a9a07, (q31_t)0xe85f5be9, + (q31_t)0x7b75f53c, (q31_t)0xe853aea1, (q31_t)0x7b714e25, (q31_t)0xe8480243, + (q31_t)0x7b6ca4c4, (q31_t)0xe83c56cf, (q31_t)0x7b67f919, (q31_t)0xe830ac45, + (q31_t)0x7b634b23, (q31_t)0xe82502a7, (q31_t)0x7b5e9ae4, (q31_t)0xe81959f4, + (q31_t)0x7b59e85a, (q31_t)0xe80db22d, (q31_t)0x7b553386, (q31_t)0xe8020b52, + (q31_t)0x7b507c69, (q31_t)0xe7f66564, (q31_t)0x7b4bc303, (q31_t)0xe7eac063, + (q31_t)0x7b470753, (q31_t)0xe7df1c50, (q31_t)0x7b42495a, (q31_t)0xe7d3792b, + (q31_t)0x7b3d8918, (q31_t)0xe7c7d6f4, (q31_t)0x7b38c68e, (q31_t)0xe7bc35ad, + (q31_t)0x7b3401bb, (q31_t)0xe7b09555, (q31_t)0x7b2f3aa0, (q31_t)0xe7a4f5ed, + (q31_t)0x7b2a713d, (q31_t)0xe7995776, (q31_t)0x7b25a591, (q31_t)0xe78db9ef, + (q31_t)0x7b20d79e, (q31_t)0xe7821d59, (q31_t)0x7b1c0764, (q31_t)0xe77681b6, + (q31_t)0x7b1734e2, (q31_t)0xe76ae704, (q31_t)0x7b126019, (q31_t)0xe75f4d45, + (q31_t)0x7b0d8909, (q31_t)0xe753b479, (q31_t)0x7b08afb2, (q31_t)0xe7481ca1, + (q31_t)0x7b03d414, (q31_t)0xe73c85bc, (q31_t)0x7afef630, (q31_t)0xe730efcc, + (q31_t)0x7afa1605, (q31_t)0xe7255ad1, (q31_t)0x7af53395, (q31_t)0xe719c6cb, + (q31_t)0x7af04edf, (q31_t)0xe70e33bb, (q31_t)0x7aeb67e3, (q31_t)0xe702a1a1, + (q31_t)0x7ae67ea1, (q31_t)0xe6f7107e, (q31_t)0x7ae1931a, (q31_t)0xe6eb8052, + (q31_t)0x7adca54e, (q31_t)0xe6dff11d, (q31_t)0x7ad7b53d, (q31_t)0xe6d462e1, + (q31_t)0x7ad2c2e8, (q31_t)0xe6c8d59c, (q31_t)0x7acdce4d, (q31_t)0xe6bd4951, + (q31_t)0x7ac8d76f, (q31_t)0xe6b1bdff, (q31_t)0x7ac3de4c, (q31_t)0xe6a633a6, + (q31_t)0x7abee2e5, (q31_t)0xe69aaa48, (q31_t)0x7ab9e53a, (q31_t)0xe68f21e5, + (q31_t)0x7ab4e54c, (q31_t)0xe6839a7c, (q31_t)0x7aafe31b, (q31_t)0xe6781410, + (q31_t)0x7aaadea6, (q31_t)0xe66c8e9f, (q31_t)0x7aa5d7ee, (q31_t)0xe6610a2a, + (q31_t)0x7aa0cef3, (q31_t)0xe65586b3, (q31_t)0x7a9bc3b6, (q31_t)0xe64a0438, + (q31_t)0x7a96b636, (q31_t)0xe63e82bc, (q31_t)0x7a91a674, (q31_t)0xe633023e, + (q31_t)0x7a8c9470, (q31_t)0xe62782be, (q31_t)0x7a87802a, (q31_t)0xe61c043d, + (q31_t)0x7a8269a3, (q31_t)0xe61086bc, (q31_t)0x7a7d50da, (q31_t)0xe6050a3b, + (q31_t)0x7a7835cf, (q31_t)0xe5f98ebb, (q31_t)0x7a731884, (q31_t)0xe5ee143b, + (q31_t)0x7a6df8f8, (q31_t)0xe5e29abc, (q31_t)0x7a68d72b, (q31_t)0xe5d72240, + (q31_t)0x7a63b31d, (q31_t)0xe5cbaac5, (q31_t)0x7a5e8cd0, (q31_t)0xe5c0344d, + (q31_t)0x7a596442, (q31_t)0xe5b4bed8, (q31_t)0x7a543974, (q31_t)0xe5a94a67, + (q31_t)0x7a4f0c67, (q31_t)0xe59dd6f9, (q31_t)0x7a49dd1a, (q31_t)0xe5926490, + (q31_t)0x7a44ab8e, (q31_t)0xe586f32c, (q31_t)0x7a3f77c3, (q31_t)0xe57b82cd, + (q31_t)0x7a3a41b9, (q31_t)0xe5701374, (q31_t)0x7a350970, (q31_t)0xe564a521, + (q31_t)0x7a2fcee8, (q31_t)0xe55937d5, (q31_t)0x7a2a9223, (q31_t)0xe54dcb8f, + (q31_t)0x7a25531f, (q31_t)0xe5426051, (q31_t)0x7a2011de, (q31_t)0xe536f61b, + (q31_t)0x7a1ace5f, (q31_t)0xe52b8cee, (q31_t)0x7a1588a2, (q31_t)0xe52024c9, + (q31_t)0x7a1040a8, (q31_t)0xe514bdad, (q31_t)0x7a0af671, (q31_t)0xe509579b, + (q31_t)0x7a05a9fd, (q31_t)0xe4fdf294, (q31_t)0x7a005b4d, (q31_t)0xe4f28e96, + (q31_t)0x79fb0a60, (q31_t)0xe4e72ba4, (q31_t)0x79f5b737, (q31_t)0xe4dbc9bd, + (q31_t)0x79f061d2, (q31_t)0xe4d068e2, (q31_t)0x79eb0a31, (q31_t)0xe4c50914, + (q31_t)0x79e5b054, (q31_t)0xe4b9aa52, (q31_t)0x79e0543c, (q31_t)0xe4ae4c9d, + (q31_t)0x79daf5e8, (q31_t)0xe4a2eff6, (q31_t)0x79d5955a, (q31_t)0xe497945d, + (q31_t)0x79d03291, (q31_t)0xe48c39d3, (q31_t)0x79cacd8d, (q31_t)0xe480e057, + (q31_t)0x79c5664f, (q31_t)0xe47587eb, (q31_t)0x79bffcd7, (q31_t)0xe46a308f, + (q31_t)0x79ba9125, (q31_t)0xe45eda43, (q31_t)0x79b52339, (q31_t)0xe4538507, + (q31_t)0x79afb313, (q31_t)0xe44830dd, (q31_t)0x79aa40b4, (q31_t)0xe43cddc4, + (q31_t)0x79a4cc1c, (q31_t)0xe4318bbe, (q31_t)0x799f554b, (q31_t)0xe4263ac9, + (q31_t)0x7999dc42, (q31_t)0xe41aeae8, (q31_t)0x799460ff, (q31_t)0xe40f9c1a, + (q31_t)0x798ee385, (q31_t)0xe4044e60, (q31_t)0x798963d2, (q31_t)0xe3f901ba, + (q31_t)0x7983e1e8, (q31_t)0xe3edb628, (q31_t)0x797e5dc6, (q31_t)0xe3e26bac, + (q31_t)0x7978d76c, (q31_t)0xe3d72245, (q31_t)0x79734edc, (q31_t)0xe3cbd9f4, + (q31_t)0x796dc414, (q31_t)0xe3c092b9, (q31_t)0x79683715, (q31_t)0xe3b54c95, + (q31_t)0x7962a7e0, (q31_t)0xe3aa0788, (q31_t)0x795d1675, (q31_t)0xe39ec393, + (q31_t)0x795782d3, (q31_t)0xe39380b6, (q31_t)0x7951ecfc, (q31_t)0xe3883ef2, + (q31_t)0x794c54ee, (q31_t)0xe37cfe47, (q31_t)0x7946baac, (q31_t)0xe371beb5, + (q31_t)0x79411e33, (q31_t)0xe366803c, (q31_t)0x793b7f86, (q31_t)0xe35b42df, + (q31_t)0x7935dea4, (q31_t)0xe350069b, (q31_t)0x79303b8e, (q31_t)0xe344cb73, + (q31_t)0x792a9642, (q31_t)0xe3399167, (q31_t)0x7924eec3, (q31_t)0xe32e5876, + (q31_t)0x791f4510, (q31_t)0xe32320a2, (q31_t)0x79199929, (q31_t)0xe317e9eb, + (q31_t)0x7913eb0e, (q31_t)0xe30cb451, (q31_t)0x790e3ac0, (q31_t)0xe3017fd5, + (q31_t)0x7908883f, (q31_t)0xe2f64c77, (q31_t)0x7902d38b, (q31_t)0xe2eb1a37, + (q31_t)0x78fd1ca4, (q31_t)0xe2dfe917, (q31_t)0x78f7638b, (q31_t)0xe2d4b916, + (q31_t)0x78f1a840, (q31_t)0xe2c98a35, (q31_t)0x78ebeac2, (q31_t)0xe2be5c74, + (q31_t)0x78e62b13, (q31_t)0xe2b32fd4, (q31_t)0x78e06932, (q31_t)0xe2a80456, + (q31_t)0x78daa520, (q31_t)0xe29cd9f8, (q31_t)0x78d4dedd, (q31_t)0xe291b0bd, + (q31_t)0x78cf1669, (q31_t)0xe28688a4, (q31_t)0x78c94bc4, (q31_t)0xe27b61af, + (q31_t)0x78c37eef, (q31_t)0xe2703bdc, (q31_t)0x78bdafea, (q31_t)0xe265172e, + (q31_t)0x78b7deb4, (q31_t)0xe259f3a3, (q31_t)0x78b20b4f, (q31_t)0xe24ed13d, + (q31_t)0x78ac35ba, (q31_t)0xe243affc, (q31_t)0x78a65df6, (q31_t)0xe2388fe1, + (q31_t)0x78a08402, (q31_t)0xe22d70eb, (q31_t)0x789aa7e0, (q31_t)0xe222531c, + (q31_t)0x7894c98f, (q31_t)0xe2173674, (q31_t)0x788ee910, (q31_t)0xe20c1af3, + (q31_t)0x78890663, (q31_t)0xe2010099, (q31_t)0x78832187, (q31_t)0xe1f5e768, + (q31_t)0x787d3a7e, (q31_t)0xe1eacf5f, (q31_t)0x78775147, (q31_t)0xe1dfb87f, + (q31_t)0x787165e3, (q31_t)0xe1d4a2c8, (q31_t)0x786b7852, (q31_t)0xe1c98e3b, + (q31_t)0x78658894, (q31_t)0xe1be7ad8, (q31_t)0x785f96a9, (q31_t)0xe1b368a0, + (q31_t)0x7859a292, (q31_t)0xe1a85793, (q31_t)0x7853ac4f, (q31_t)0xe19d47b1, + (q31_t)0x784db3e0, (q31_t)0xe19238fb, (q31_t)0x7847b946, (q31_t)0xe1872b72, + (q31_t)0x7841bc7f, (q31_t)0xe17c1f15, (q31_t)0x783bbd8e, (q31_t)0xe17113e5, + (q31_t)0x7835bc71, (q31_t)0xe16609e3, (q31_t)0x782fb92a, (q31_t)0xe15b0110, + (q31_t)0x7829b3b9, (q31_t)0xe14ff96a, (q31_t)0x7823ac1d, (q31_t)0xe144f2f3, + (q31_t)0x781da256, (q31_t)0xe139edac, (q31_t)0x78179666, (q31_t)0xe12ee995, + (q31_t)0x7811884d, (q31_t)0xe123e6ad, (q31_t)0x780b780a, (q31_t)0xe118e4f6, + (q31_t)0x7805659e, (q31_t)0xe10de470, (q31_t)0x77ff5109, (q31_t)0xe102e51c, + (q31_t)0x77f93a4b, (q31_t)0xe0f7e6f9, (q31_t)0x77f32165, (q31_t)0xe0ecea09, + (q31_t)0x77ed0657, (q31_t)0xe0e1ee4b, (q31_t)0x77e6e921, (q31_t)0xe0d6f3c1, + (q31_t)0x77e0c9c3, (q31_t)0xe0cbfa6a, (q31_t)0x77daa83d, (q31_t)0xe0c10247, + (q31_t)0x77d48490, (q31_t)0xe0b60b58, (q31_t)0x77ce5ebd, (q31_t)0xe0ab159e, + (q31_t)0x77c836c2, (q31_t)0xe0a0211a, (q31_t)0x77c20ca1, (q31_t)0xe0952dcb, + (q31_t)0x77bbe05a, (q31_t)0xe08a3bb2, (q31_t)0x77b5b1ec, (q31_t)0xe07f4acf, + (q31_t)0x77af8159, (q31_t)0xe0745b24, (q31_t)0x77a94ea0, (q31_t)0xe0696cb0, + (q31_t)0x77a319c2, (q31_t)0xe05e7f74, (q31_t)0x779ce2be, (q31_t)0xe053936f, + (q31_t)0x7796a996, (q31_t)0xe048a8a4, (q31_t)0x77906e49, (q31_t)0xe03dbf11, + (q31_t)0x778a30d8, (q31_t)0xe032d6b8, (q31_t)0x7783f143, (q31_t)0xe027ef99, + (q31_t)0x777daf89, (q31_t)0xe01d09b4, (q31_t)0x77776bac, (q31_t)0xe012250a, + (q31_t)0x777125ac, (q31_t)0xe007419b, (q31_t)0x776add88, (q31_t)0xdffc5f67, + (q31_t)0x77649341, (q31_t)0xdff17e70, (q31_t)0x775e46d8, (q31_t)0xdfe69eb4, + (q31_t)0x7757f84c, (q31_t)0xdfdbc036, (q31_t)0x7751a79e, (q31_t)0xdfd0e2f5, + (q31_t)0x774b54ce, (q31_t)0xdfc606f1, (q31_t)0x7744ffdd, (q31_t)0xdfbb2c2c, + (q31_t)0x773ea8ca, (q31_t)0xdfb052a5, (q31_t)0x77384f95, (q31_t)0xdfa57a5d, + (q31_t)0x7731f440, (q31_t)0xdf9aa354, (q31_t)0x772b96ca, (q31_t)0xdf8fcd8b, + (q31_t)0x77253733, (q31_t)0xdf84f902, (q31_t)0x771ed57c, (q31_t)0xdf7a25ba, + (q31_t)0x771871a5, (q31_t)0xdf6f53b3, (q31_t)0x77120bae, (q31_t)0xdf6482ed, + (q31_t)0x770ba398, (q31_t)0xdf59b369, (q31_t)0x77053962, (q31_t)0xdf4ee527, + (q31_t)0x76fecd0e, (q31_t)0xdf441828, (q31_t)0x76f85e9a, (q31_t)0xdf394c6b, + (q31_t)0x76f1ee09, (q31_t)0xdf2e81f3, (q31_t)0x76eb7b58, (q31_t)0xdf23b8be, + (q31_t)0x76e5068a, (q31_t)0xdf18f0ce, (q31_t)0x76de8f9e, (q31_t)0xdf0e2a22, + (q31_t)0x76d81695, (q31_t)0xdf0364bc, (q31_t)0x76d19b6e, (q31_t)0xdef8a09b, + (q31_t)0x76cb1e2a, (q31_t)0xdeedddc0, (q31_t)0x76c49ec9, (q31_t)0xdee31c2b, + (q31_t)0x76be1d4c, (q31_t)0xded85bdd, (q31_t)0x76b799b3, (q31_t)0xdecd9cd7, + (q31_t)0x76b113fd, (q31_t)0xdec2df18, (q31_t)0x76aa8c2c, (q31_t)0xdeb822a1, + (q31_t)0x76a4023f, (q31_t)0xdead6773, (q31_t)0x769d7637, (q31_t)0xdea2ad8d, + (q31_t)0x7696e814, (q31_t)0xde97f4f1, (q31_t)0x769057d6, (q31_t)0xde8d3d9e, + (q31_t)0x7689c57d, (q31_t)0xde828796, (q31_t)0x7683310b, (q31_t)0xde77d2d8, + (q31_t)0x767c9a7e, (q31_t)0xde6d1f65, (q31_t)0x767601d7, (q31_t)0xde626d3e, + (q31_t)0x766f6717, (q31_t)0xde57bc62, (q31_t)0x7668ca3e, (q31_t)0xde4d0cd2, + (q31_t)0x76622b4c, (q31_t)0xde425e8f, (q31_t)0x765b8a41, (q31_t)0xde37b199, + (q31_t)0x7654e71d, (q31_t)0xde2d05f1, (q31_t)0x764e41e2, (q31_t)0xde225b96, + (q31_t)0x76479a8e, (q31_t)0xde17b28a, (q31_t)0x7640f123, (q31_t)0xde0d0acc, + (q31_t)0x763a45a0, (q31_t)0xde02645d, (q31_t)0x76339806, (q31_t)0xddf7bf3e, + (q31_t)0x762ce855, (q31_t)0xdded1b6e, (q31_t)0x7626368d, (q31_t)0xdde278ef, + (q31_t)0x761f82af, (q31_t)0xddd7d7c1, (q31_t)0x7618ccba, (q31_t)0xddcd37e4, + (q31_t)0x761214b0, (q31_t)0xddc29958, (q31_t)0x760b5a90, (q31_t)0xddb7fc1e, + (q31_t)0x76049e5b, (q31_t)0xddad6036, (q31_t)0x75fde011, (q31_t)0xdda2c5a2, + (q31_t)0x75f71fb1, (q31_t)0xdd982c60, (q31_t)0x75f05d3d, (q31_t)0xdd8d9472, + (q31_t)0x75e998b5, (q31_t)0xdd82fdd8, (q31_t)0x75e2d219, (q31_t)0xdd786892, + (q31_t)0x75dc0968, (q31_t)0xdd6dd4a2, (q31_t)0x75d53ea5, (q31_t)0xdd634206, + (q31_t)0x75ce71ce, (q31_t)0xdd58b0c0, (q31_t)0x75c7a2e3, (q31_t)0xdd4e20d0, + (q31_t)0x75c0d1e7, (q31_t)0xdd439236, (q31_t)0x75b9fed7, (q31_t)0xdd3904f4, + (q31_t)0x75b329b5, (q31_t)0xdd2e7908, (q31_t)0x75ac5282, (q31_t)0xdd23ee74, + (q31_t)0x75a5793c, (q31_t)0xdd196538, (q31_t)0x759e9de5, (q31_t)0xdd0edd55, + (q31_t)0x7597c07d, (q31_t)0xdd0456ca, (q31_t)0x7590e104, (q31_t)0xdcf9d199, + (q31_t)0x7589ff7a, (q31_t)0xdcef4dc2, (q31_t)0x75831be0, (q31_t)0xdce4cb44, + (q31_t)0x757c3636, (q31_t)0xdcda4a21, (q31_t)0x75754e7c, (q31_t)0xdccfca59, + (q31_t)0x756e64b2, (q31_t)0xdcc54bec, (q31_t)0x756778d9, (q31_t)0xdcbacedb, + (q31_t)0x75608af1, (q31_t)0xdcb05326, (q31_t)0x75599afa, (q31_t)0xdca5d8cd, + (q31_t)0x7552a8f4, (q31_t)0xdc9b5fd2, (q31_t)0x754bb4e1, (q31_t)0xdc90e834, + (q31_t)0x7544bebf, (q31_t)0xdc8671f3, (q31_t)0x753dc68f, (q31_t)0xdc7bfd11, + (q31_t)0x7536cc52, (q31_t)0xdc71898d, (q31_t)0x752fd008, (q31_t)0xdc671768, + (q31_t)0x7528d1b1, (q31_t)0xdc5ca6a2, (q31_t)0x7521d14d, (q31_t)0xdc52373c, + (q31_t)0x751acedd, (q31_t)0xdc47c936, (q31_t)0x7513ca60, (q31_t)0xdc3d5c91, + (q31_t)0x750cc3d8, (q31_t)0xdc32f14d, (q31_t)0x7505bb44, (q31_t)0xdc28876a, + (q31_t)0x74feb0a5, (q31_t)0xdc1e1ee9, (q31_t)0x74f7a3fb, (q31_t)0xdc13b7c9, + (q31_t)0x74f09546, (q31_t)0xdc09520d, (q31_t)0x74e98487, (q31_t)0xdbfeedb3, + (q31_t)0x74e271bd, (q31_t)0xdbf48abd, (q31_t)0x74db5cea, (q31_t)0xdbea292b, + (q31_t)0x74d4460c, (q31_t)0xdbdfc8fc, (q31_t)0x74cd2d26, (q31_t)0xdbd56a32, + (q31_t)0x74c61236, (q31_t)0xdbcb0cce, (q31_t)0x74bef53d, (q31_t)0xdbc0b0ce, + (q31_t)0x74b7d63c, (q31_t)0xdbb65634, (q31_t)0x74b0b533, (q31_t)0xdbabfd01, + (q31_t)0x74a99221, (q31_t)0xdba1a534, (q31_t)0x74a26d08, (q31_t)0xdb974ece, + (q31_t)0x749b45e7, (q31_t)0xdb8cf9cf, (q31_t)0x74941cbf, (q31_t)0xdb82a638, + (q31_t)0x748cf190, (q31_t)0xdb785409, (q31_t)0x7485c45b, (q31_t)0xdb6e0342, + (q31_t)0x747e951f, (q31_t)0xdb63b3e5, (q31_t)0x747763dd, (q31_t)0xdb5965f1, + (q31_t)0x74703095, (q31_t)0xdb4f1967, (q31_t)0x7468fb47, (q31_t)0xdb44ce46, + (q31_t)0x7461c3f5, (q31_t)0xdb3a8491, (q31_t)0x745a8a9d, (q31_t)0xdb303c46, + (q31_t)0x74534f41, (q31_t)0xdb25f566, (q31_t)0x744c11e0, (q31_t)0xdb1baff2, + (q31_t)0x7444d27b, (q31_t)0xdb116beb, (q31_t)0x743d9112, (q31_t)0xdb072950, + (q31_t)0x74364da6, (q31_t)0xdafce821, (q31_t)0x742f0836, (q31_t)0xdaf2a860, + (q31_t)0x7427c0c3, (q31_t)0xdae86a0d, (q31_t)0x7420774d, (q31_t)0xdade2d28, + (q31_t)0x74192bd5, (q31_t)0xdad3f1b1, (q31_t)0x7411de5b, (q31_t)0xdac9b7a9, + (q31_t)0x740a8edf, (q31_t)0xdabf7f11, (q31_t)0x74033d61, (q31_t)0xdab547e8, + (q31_t)0x73fbe9e2, (q31_t)0xdaab122f, (q31_t)0x73f49462, (q31_t)0xdaa0dde7, + (q31_t)0x73ed3ce1, (q31_t)0xda96ab0f, (q31_t)0x73e5e360, (q31_t)0xda8c79a9, + (q31_t)0x73de87de, (q31_t)0xda8249b4, (q31_t)0x73d72a5d, (q31_t)0xda781b31, + (q31_t)0x73cfcadc, (q31_t)0xda6dee21, (q31_t)0x73c8695b, (q31_t)0xda63c284, + (q31_t)0x73c105db, (q31_t)0xda599859, (q31_t)0x73b9a05d, (q31_t)0xda4f6fa3, + (q31_t)0x73b238e0, (q31_t)0xda454860, (q31_t)0x73aacf65, (q31_t)0xda3b2292, + (q31_t)0x73a363ec, (q31_t)0xda30fe38, (q31_t)0x739bf675, (q31_t)0xda26db54, + (q31_t)0x73948701, (q31_t)0xda1cb9e5, (q31_t)0x738d1590, (q31_t)0xda1299ec, + (q31_t)0x7385a222, (q31_t)0xda087b69, (q31_t)0x737e2cb7, (q31_t)0xd9fe5e5e, + (q31_t)0x7376b551, (q31_t)0xd9f442c9, (q31_t)0x736f3bee, (q31_t)0xd9ea28ac, + (q31_t)0x7367c090, (q31_t)0xd9e01006, (q31_t)0x73604336, (q31_t)0xd9d5f8d9, + (q31_t)0x7358c3e2, (q31_t)0xd9cbe325, (q31_t)0x73514292, (q31_t)0xd9c1cee9, + (q31_t)0x7349bf48, (q31_t)0xd9b7bc27, (q31_t)0x73423a04, (q31_t)0xd9adaadf, + (q31_t)0x733ab2c6, (q31_t)0xd9a39b11, (q31_t)0x7333298f, (q31_t)0xd9998cbe, + (q31_t)0x732b9e5e, (q31_t)0xd98f7fe6, (q31_t)0x73241134, (q31_t)0xd9857489, + (q31_t)0x731c8211, (q31_t)0xd97b6aa8, (q31_t)0x7314f0f6, (q31_t)0xd9716243, + (q31_t)0x730d5de3, (q31_t)0xd9675b5a, (q31_t)0x7305c8d7, (q31_t)0xd95d55ef, + (q31_t)0x72fe31d5, (q31_t)0xd9535201, (q31_t)0x72f698db, (q31_t)0xd9494f90, + (q31_t)0x72eefdea, (q31_t)0xd93f4e9e, (q31_t)0x72e76102, (q31_t)0xd9354f2a, + (q31_t)0x72dfc224, (q31_t)0xd92b5135, (q31_t)0x72d82150, (q31_t)0xd92154bf, + (q31_t)0x72d07e85, (q31_t)0xd91759c9, (q31_t)0x72c8d9c6, (q31_t)0xd90d6053, + (q31_t)0x72c13311, (q31_t)0xd903685d, (q31_t)0x72b98a67, (q31_t)0xd8f971e8, + (q31_t)0x72b1dfc9, (q31_t)0xd8ef7cf4, (q31_t)0x72aa3336, (q31_t)0xd8e58982, + (q31_t)0x72a284b0, (q31_t)0xd8db9792, (q31_t)0x729ad435, (q31_t)0xd8d1a724, + (q31_t)0x729321c7, (q31_t)0xd8c7b838, (q31_t)0x728b6d66, (q31_t)0xd8bdcad0, + (q31_t)0x7283b712, (q31_t)0xd8b3deeb, (q31_t)0x727bfecc, (q31_t)0xd8a9f48a, + (q31_t)0x72744493, (q31_t)0xd8a00bae, (q31_t)0x726c8868, (q31_t)0xd8962456, + (q31_t)0x7264ca4c, (q31_t)0xd88c3e83, (q31_t)0x725d0a3e, (q31_t)0xd8825a35, + (q31_t)0x72554840, (q31_t)0xd878776d, (q31_t)0x724d8450, (q31_t)0xd86e962b, + (q31_t)0x7245be70, (q31_t)0xd864b670, (q31_t)0x723df6a0, (q31_t)0xd85ad83c, + (q31_t)0x72362ce0, (q31_t)0xd850fb8e, (q31_t)0x722e6130, (q31_t)0xd8472069, + (q31_t)0x72269391, (q31_t)0xd83d46cc, (q31_t)0x721ec403, (q31_t)0xd8336eb7, + (q31_t)0x7216f287, (q31_t)0xd829982b, (q31_t)0x720f1f1c, (q31_t)0xd81fc328, + (q31_t)0x720749c3, (q31_t)0xd815efae, (q31_t)0x71ff727c, (q31_t)0xd80c1dbf, + (q31_t)0x71f79948, (q31_t)0xd8024d59, (q31_t)0x71efbe27, (q31_t)0xd7f87e7f, + (q31_t)0x71e7e118, (q31_t)0xd7eeb130, (q31_t)0x71e0021e, (q31_t)0xd7e4e56c, + (q31_t)0x71d82137, (q31_t)0xd7db1b34, (q31_t)0x71d03e64, (q31_t)0xd7d15288, + (q31_t)0x71c859a5, (q31_t)0xd7c78b68, (q31_t)0x71c072fb, (q31_t)0xd7bdc5d6, + (q31_t)0x71b88a66, (q31_t)0xd7b401d1, (q31_t)0x71b09fe7, (q31_t)0xd7aa3f5a, + (q31_t)0x71a8b37c, (q31_t)0xd7a07e70, (q31_t)0x71a0c528, (q31_t)0xd796bf16, + (q31_t)0x7198d4ea, (q31_t)0xd78d014a, (q31_t)0x7190e2c3, (q31_t)0xd783450d, + (q31_t)0x7188eeb2, (q31_t)0xd7798a60, (q31_t)0x7180f8b8, (q31_t)0xd76fd143, + (q31_t)0x717900d6, (q31_t)0xd76619b6, (q31_t)0x7171070c, (q31_t)0xd75c63ba, + (q31_t)0x71690b59, (q31_t)0xd752af4f, (q31_t)0x71610dbf, (q31_t)0xd748fc75, + (q31_t)0x71590e3e, (q31_t)0xd73f4b2e, (q31_t)0x71510cd5, (q31_t)0xd7359b78, + (q31_t)0x71490986, (q31_t)0xd72bed55, (q31_t)0x71410450, (q31_t)0xd72240c5, + (q31_t)0x7138fd35, (q31_t)0xd71895c9, (q31_t)0x7130f433, (q31_t)0xd70eec60, + (q31_t)0x7128e94c, (q31_t)0xd705448b, (q31_t)0x7120dc80, (q31_t)0xd6fb9e4b, + (q31_t)0x7118cdcf, (q31_t)0xd6f1f99f, (q31_t)0x7110bd39, (q31_t)0xd6e85689, + (q31_t)0x7108aabf, (q31_t)0xd6deb508, (q31_t)0x71009661, (q31_t)0xd6d5151d, + (q31_t)0x70f8801f, (q31_t)0xd6cb76c9, (q31_t)0x70f067fb, (q31_t)0xd6c1da0b, + (q31_t)0x70e84df3, (q31_t)0xd6b83ee4, (q31_t)0x70e03208, (q31_t)0xd6aea555, + (q31_t)0x70d8143b, (q31_t)0xd6a50d5d, (q31_t)0x70cff48c, (q31_t)0xd69b76fe, + (q31_t)0x70c7d2fb, (q31_t)0xd691e237, (q31_t)0x70bfaf89, (q31_t)0xd6884f09, + (q31_t)0x70b78a36, (q31_t)0xd67ebd74, (q31_t)0x70af6302, (q31_t)0xd6752d79, + (q31_t)0x70a739ed, (q31_t)0xd66b9f18, (q31_t)0x709f0ef8, (q31_t)0xd6621251, + (q31_t)0x7096e223, (q31_t)0xd6588725, (q31_t)0x708eb36f, (q31_t)0xd64efd94, + (q31_t)0x708682dc, (q31_t)0xd645759f, (q31_t)0x707e5069, (q31_t)0xd63bef46, + (q31_t)0x70761c18, (q31_t)0xd6326a88, (q31_t)0x706de5e9, (q31_t)0xd628e767, + (q31_t)0x7065addb, (q31_t)0xd61f65e4, (q31_t)0x705d73f0, (q31_t)0xd615e5fd, + (q31_t)0x70553828, (q31_t)0xd60c67b4, (q31_t)0x704cfa83, (q31_t)0xd602eb0a, + (q31_t)0x7044bb00, (q31_t)0xd5f96ffd, (q31_t)0x703c79a2, (q31_t)0xd5eff690, + (q31_t)0x70343667, (q31_t)0xd5e67ec1, (q31_t)0x702bf151, (q31_t)0xd5dd0892, + (q31_t)0x7023aa5f, (q31_t)0xd5d39403, (q31_t)0x701b6193, (q31_t)0xd5ca2115, + (q31_t)0x701316eb, (q31_t)0xd5c0afc6, (q31_t)0x700aca69, (q31_t)0xd5b74019, + (q31_t)0x70027c0c, (q31_t)0xd5add20d, (q31_t)0x6ffa2bd6, (q31_t)0xd5a465a3, + (q31_t)0x6ff1d9c7, (q31_t)0xd59afadb, (q31_t)0x6fe985de, (q31_t)0xd59191b5, + (q31_t)0x6fe1301c, (q31_t)0xd5882a32, (q31_t)0x6fd8d882, (q31_t)0xd57ec452, + (q31_t)0x6fd07f0f, (q31_t)0xd5756016, (q31_t)0x6fc823c5, (q31_t)0xd56bfd7d, + (q31_t)0x6fbfc6a3, (q31_t)0xd5629c89, (q31_t)0x6fb767aa, (q31_t)0xd5593d3a, + (q31_t)0x6faf06da, (q31_t)0xd54fdf8f, (q31_t)0x6fa6a433, (q31_t)0xd5468389, + (q31_t)0x6f9e3fb6, (q31_t)0xd53d292a, (q31_t)0x6f95d963, (q31_t)0xd533d070, + (q31_t)0x6f8d713a, (q31_t)0xd52a795d, (q31_t)0x6f85073c, (q31_t)0xd52123f0, + (q31_t)0x6f7c9b69, (q31_t)0xd517d02b, (q31_t)0x6f742dc1, (q31_t)0xd50e7e0d, + (q31_t)0x6f6bbe45, (q31_t)0xd5052d97, (q31_t)0x6f634cf5, (q31_t)0xd4fbdec9, + (q31_t)0x6f5ad9d1, (q31_t)0xd4f291a4, (q31_t)0x6f5264da, (q31_t)0xd4e94627, + (q31_t)0x6f49ee0f, (q31_t)0xd4dffc54, (q31_t)0x6f417573, (q31_t)0xd4d6b42b, + (q31_t)0x6f38fb03, (q31_t)0xd4cd6dab, (q31_t)0x6f307ec2, (q31_t)0xd4c428d6, + (q31_t)0x6f2800af, (q31_t)0xd4bae5ab, (q31_t)0x6f1f80ca, (q31_t)0xd4b1a42c, + (q31_t)0x6f16ff14, (q31_t)0xd4a86458, (q31_t)0x6f0e7b8e, (q31_t)0xd49f2630, + (q31_t)0x6f05f637, (q31_t)0xd495e9b3, (q31_t)0x6efd6f10, (q31_t)0xd48caee4, + (q31_t)0x6ef4e619, (q31_t)0xd48375c1, (q31_t)0x6eec5b53, (q31_t)0xd47a3e4b, + (q31_t)0x6ee3cebe, (q31_t)0xd4710883, (q31_t)0x6edb405a, (q31_t)0xd467d469, + (q31_t)0x6ed2b027, (q31_t)0xd45ea1fd, (q31_t)0x6eca1e27, (q31_t)0xd4557140, + (q31_t)0x6ec18a58, (q31_t)0xd44c4232, (q31_t)0x6eb8f4bc, (q31_t)0xd44314d3, + (q31_t)0x6eb05d53, (q31_t)0xd439e923, (q31_t)0x6ea7c41e, (q31_t)0xd430bf24, + (q31_t)0x6e9f291b, (q31_t)0xd42796d5, (q31_t)0x6e968c4d, (q31_t)0xd41e7037, + (q31_t)0x6e8dedb3, (q31_t)0xd4154b4a, (q31_t)0x6e854d4d, (q31_t)0xd40c280e, + (q31_t)0x6e7cab1c, (q31_t)0xd4030684, (q31_t)0x6e740720, (q31_t)0xd3f9e6ad, + (q31_t)0x6e6b615a, (q31_t)0xd3f0c887, (q31_t)0x6e62b9ca, (q31_t)0xd3e7ac15, + (q31_t)0x6e5a1070, (q31_t)0xd3de9156, (q31_t)0x6e51654c, (q31_t)0xd3d5784a, + (q31_t)0x6e48b860, (q31_t)0xd3cc60f2, (q31_t)0x6e4009aa, (q31_t)0xd3c34b4f, + (q31_t)0x6e37592c, (q31_t)0xd3ba3760, (q31_t)0x6e2ea6e6, (q31_t)0xd3b12526, + (q31_t)0x6e25f2d8, (q31_t)0xd3a814a2, (q31_t)0x6e1d3d03, (q31_t)0xd39f05d3, + (q31_t)0x6e148566, (q31_t)0xd395f8ba, (q31_t)0x6e0bcc03, (q31_t)0xd38ced57, + (q31_t)0x6e0310d9, (q31_t)0xd383e3ab, (q31_t)0x6dfa53e9, (q31_t)0xd37adbb6, + (q31_t)0x6df19534, (q31_t)0xd371d579, (q31_t)0x6de8d4b8, (q31_t)0xd368d0f3, + (q31_t)0x6de01278, (q31_t)0xd35fce26, (q31_t)0x6dd74e73, (q31_t)0xd356cd11, + (q31_t)0x6dce88aa, (q31_t)0xd34dcdb4, (q31_t)0x6dc5c11c, (q31_t)0xd344d011, + (q31_t)0x6dbcf7cb, (q31_t)0xd33bd427, (q31_t)0x6db42cb6, (q31_t)0xd332d9f7, + (q31_t)0x6dab5fdf, (q31_t)0xd329e181, (q31_t)0x6da29144, (q31_t)0xd320eac6, + (q31_t)0x6d99c0e7, (q31_t)0xd317f5c6, (q31_t)0x6d90eec8, (q31_t)0xd30f0280, + (q31_t)0x6d881ae8, (q31_t)0xd30610f7, (q31_t)0x6d7f4545, (q31_t)0xd2fd2129, + (q31_t)0x6d766de2, (q31_t)0xd2f43318, (q31_t)0x6d6d94bf, (q31_t)0xd2eb46c3, + (q31_t)0x6d64b9da, (q31_t)0xd2e25c2b, (q31_t)0x6d5bdd36, (q31_t)0xd2d97350, + (q31_t)0x6d52fed2, (q31_t)0xd2d08c33, (q31_t)0x6d4a1eaf, (q31_t)0xd2c7a6d4, + (q31_t)0x6d413ccd, (q31_t)0xd2bec333, (q31_t)0x6d38592c, (q31_t)0xd2b5e151, + (q31_t)0x6d2f73cd, (q31_t)0xd2ad012e, (q31_t)0x6d268cb0, (q31_t)0xd2a422ca, + (q31_t)0x6d1da3d5, (q31_t)0xd29b4626, (q31_t)0x6d14b93d, (q31_t)0xd2926b41, + (q31_t)0x6d0bcce8, (q31_t)0xd289921e, (q31_t)0x6d02ded7, (q31_t)0xd280babb, + (q31_t)0x6cf9ef09, (q31_t)0xd277e518, (q31_t)0x6cf0fd80, (q31_t)0xd26f1138, + (q31_t)0x6ce80a3a, (q31_t)0xd2663f19, (q31_t)0x6cdf153a, (q31_t)0xd25d6ebc, + (q31_t)0x6cd61e7f, (q31_t)0xd254a021, (q31_t)0x6ccd2609, (q31_t)0xd24bd34a, + (q31_t)0x6cc42bd9, (q31_t)0xd2430835, (q31_t)0x6cbb2fef, (q31_t)0xd23a3ee4, + (q31_t)0x6cb2324c, (q31_t)0xd2317756, (q31_t)0x6ca932ef, (q31_t)0xd228b18d, + (q31_t)0x6ca031da, (q31_t)0xd21fed88, (q31_t)0x6c972f0d, (q31_t)0xd2172b48, + (q31_t)0x6c8e2a87, (q31_t)0xd20e6acc, (q31_t)0x6c85244a, (q31_t)0xd205ac17, + (q31_t)0x6c7c1c55, (q31_t)0xd1fcef27, (q31_t)0x6c7312a9, (q31_t)0xd1f433fd, + (q31_t)0x6c6a0746, (q31_t)0xd1eb7a9a, (q31_t)0x6c60fa2d, (q31_t)0xd1e2c2fd, + (q31_t)0x6c57eb5e, (q31_t)0xd1da0d28, (q31_t)0x6c4edada, (q31_t)0xd1d1591a, + (q31_t)0x6c45c8a0, (q31_t)0xd1c8a6d4, (q31_t)0x6c3cb4b1, (q31_t)0xd1bff656, + (q31_t)0x6c339f0e, (q31_t)0xd1b747a0, (q31_t)0x6c2a87b6, (q31_t)0xd1ae9ab4, + (q31_t)0x6c216eaa, (q31_t)0xd1a5ef90, (q31_t)0x6c1853eb, (q31_t)0xd19d4636, + (q31_t)0x6c0f3779, (q31_t)0xd1949ea6, (q31_t)0x6c061953, (q31_t)0xd18bf8e0, + (q31_t)0x6bfcf97c, (q31_t)0xd18354e4, (q31_t)0x6bf3d7f2, (q31_t)0xd17ab2b3, + (q31_t)0x6beab4b6, (q31_t)0xd172124d, (q31_t)0x6be18fc9, (q31_t)0xd16973b3, + (q31_t)0x6bd8692b, (q31_t)0xd160d6e5, (q31_t)0x6bcf40dc, (q31_t)0xd1583be2, + (q31_t)0x6bc616dd, (q31_t)0xd14fa2ad, (q31_t)0x6bbceb2d, (q31_t)0xd1470b44, + (q31_t)0x6bb3bdce, (q31_t)0xd13e75a8, (q31_t)0x6baa8ec0, (q31_t)0xd135e1d9, + (q31_t)0x6ba15e03, (q31_t)0xd12d4fd9, (q31_t)0x6b982b97, (q31_t)0xd124bfa6, + (q31_t)0x6b8ef77d, (q31_t)0xd11c3142, (q31_t)0x6b85c1b5, (q31_t)0xd113a4ad, + (q31_t)0x6b7c8a3f, (q31_t)0xd10b19e7, (q31_t)0x6b73511c, (q31_t)0xd10290f0, + (q31_t)0x6b6a164d, (q31_t)0xd0fa09c9, (q31_t)0x6b60d9d0, (q31_t)0xd0f18472, + (q31_t)0x6b579ba8, (q31_t)0xd0e900ec, (q31_t)0x6b4e5bd4, (q31_t)0xd0e07f36, + (q31_t)0x6b451a55, (q31_t)0xd0d7ff51, (q31_t)0x6b3bd72a, (q31_t)0xd0cf813e, + (q31_t)0x6b329255, (q31_t)0xd0c704fd, (q31_t)0x6b294bd5, (q31_t)0xd0be8a8d, + (q31_t)0x6b2003ac, (q31_t)0xd0b611f1, (q31_t)0x6b16b9d9, (q31_t)0xd0ad9b26, + (q31_t)0x6b0d6e5c, (q31_t)0xd0a5262f, (q31_t)0x6b042137, (q31_t)0xd09cb30b, + (q31_t)0x6afad269, (q31_t)0xd09441bb, (q31_t)0x6af181f3, (q31_t)0xd08bd23f, + (q31_t)0x6ae82fd5, (q31_t)0xd0836497, (q31_t)0x6adedc10, (q31_t)0xd07af8c4, + (q31_t)0x6ad586a3, (q31_t)0xd0728ec6, (q31_t)0x6acc2f90, (q31_t)0xd06a269d, + (q31_t)0x6ac2d6d6, (q31_t)0xd061c04a, (q31_t)0x6ab97c77, (q31_t)0xd0595bcd, + (q31_t)0x6ab02071, (q31_t)0xd050f926, (q31_t)0x6aa6c2c6, (q31_t)0xd0489856, + (q31_t)0x6a9d6377, (q31_t)0xd040395d, (q31_t)0x6a940283, (q31_t)0xd037dc3b, + (q31_t)0x6a8a9fea, (q31_t)0xd02f80f1, (q31_t)0x6a813bae, (q31_t)0xd027277e, + (q31_t)0x6a77d5ce, (q31_t)0xd01ecfe4, (q31_t)0x6a6e6e4b, (q31_t)0xd0167a22, + (q31_t)0x6a650525, (q31_t)0xd00e2639, (q31_t)0x6a5b9a5d, (q31_t)0xd005d42a, + (q31_t)0x6a522df3, (q31_t)0xcffd83f4, (q31_t)0x6a48bfe7, (q31_t)0xcff53597, + (q31_t)0x6a3f503a, (q31_t)0xcfece915, (q31_t)0x6a35deeb, (q31_t)0xcfe49e6d, + (q31_t)0x6a2c6bfd, (q31_t)0xcfdc55a1, (q31_t)0x6a22f76e, (q31_t)0xcfd40eaf, + (q31_t)0x6a19813f, (q31_t)0xcfcbc999, (q31_t)0x6a100970, (q31_t)0xcfc3865e, + (q31_t)0x6a069003, (q31_t)0xcfbb4500, (q31_t)0x69fd14f6, (q31_t)0xcfb3057d, + (q31_t)0x69f3984c, (q31_t)0xcfaac7d8, (q31_t)0x69ea1a03, (q31_t)0xcfa28c10, + (q31_t)0x69e09a1c, (q31_t)0xcf9a5225, (q31_t)0x69d71899, (q31_t)0xcf921a17, + (q31_t)0x69cd9578, (q31_t)0xcf89e3e8, (q31_t)0x69c410ba, (q31_t)0xcf81af97, + (q31_t)0x69ba8a61, (q31_t)0xcf797d24, (q31_t)0x69b1026c, (q31_t)0xcf714c91, + (q31_t)0x69a778db, (q31_t)0xcf691ddd, (q31_t)0x699dedaf, (q31_t)0xcf60f108, + (q31_t)0x699460e8, (q31_t)0xcf58c613, (q31_t)0x698ad287, (q31_t)0xcf509cfe, + (q31_t)0x6981428c, (q31_t)0xcf4875ca, (q31_t)0x6977b0f7, (q31_t)0xcf405077, + (q31_t)0x696e1dc9, (q31_t)0xcf382d05, (q31_t)0x69648902, (q31_t)0xcf300b74, + (q31_t)0x695af2a3, (q31_t)0xcf27ebc5, (q31_t)0x69515aab, (q31_t)0xcf1fcdf8, + (q31_t)0x6947c11c, (q31_t)0xcf17b20d, (q31_t)0x693e25f5, (q31_t)0xcf0f9805, + (q31_t)0x69348937, (q31_t)0xcf077fe1, (q31_t)0x692aeae3, (q31_t)0xceff699f, + (q31_t)0x69214af8, (q31_t)0xcef75541, (q31_t)0x6917a977, (q31_t)0xceef42c7, + (q31_t)0x690e0661, (q31_t)0xcee73231, (q31_t)0x690461b5, (q31_t)0xcedf2380, + (q31_t)0x68fabb75, (q31_t)0xced716b4, (q31_t)0x68f113a0, (q31_t)0xcecf0bcd, + (q31_t)0x68e76a37, (q31_t)0xcec702cb, (q31_t)0x68ddbf3b, (q31_t)0xcebefbb0, + (q31_t)0x68d412ab, (q31_t)0xceb6f67a, (q31_t)0x68ca6488, (q31_t)0xceaef32b, + (q31_t)0x68c0b4d2, (q31_t)0xcea6f1c2, (q31_t)0x68b7038b, (q31_t)0xce9ef241, + (q31_t)0x68ad50b1, (q31_t)0xce96f4a7, (q31_t)0x68a39c46, (q31_t)0xce8ef8f4, + (q31_t)0x6899e64a, (q31_t)0xce86ff2a, (q31_t)0x68902ebd, (q31_t)0xce7f0748, + (q31_t)0x688675a0, (q31_t)0xce77114e, (q31_t)0x687cbaf3, (q31_t)0xce6f1d3d, + (q31_t)0x6872feb6, (q31_t)0xce672b16, (q31_t)0x686940ea, (q31_t)0xce5f3ad8, + (q31_t)0x685f8190, (q31_t)0xce574c84, (q31_t)0x6855c0a6, (q31_t)0xce4f6019, + (q31_t)0x684bfe2f, (q31_t)0xce47759a, (q31_t)0x68423a2a, (q31_t)0xce3f8d05, + (q31_t)0x68387498, (q31_t)0xce37a65b, (q31_t)0x682ead78, (q31_t)0xce2fc19c, + (q31_t)0x6824e4cc, (q31_t)0xce27dec9, (q31_t)0x681b1a94, (q31_t)0xce1ffde2, + (q31_t)0x68114ed0, (q31_t)0xce181ee8, (q31_t)0x68078181, (q31_t)0xce1041d9, + (q31_t)0x67fdb2a7, (q31_t)0xce0866b8, (q31_t)0x67f3e241, (q31_t)0xce008d84, + (q31_t)0x67ea1052, (q31_t)0xcdf8b63d, (q31_t)0x67e03cd8, (q31_t)0xcdf0e0e4, + (q31_t)0x67d667d5, (q31_t)0xcde90d79, (q31_t)0x67cc9149, (q31_t)0xcde13bfd, + (q31_t)0x67c2b934, (q31_t)0xcdd96c6f, (q31_t)0x67b8df97, (q31_t)0xcdd19ed0, + (q31_t)0x67af0472, (q31_t)0xcdc9d320, (q31_t)0x67a527c4, (q31_t)0xcdc20960, + (q31_t)0x679b4990, (q31_t)0xcdba4190, (q31_t)0x679169d5, (q31_t)0xcdb27bb0, + (q31_t)0x67878893, (q31_t)0xcdaab7c0, (q31_t)0x677da5cb, (q31_t)0xcda2f5c2, + (q31_t)0x6773c17d, (q31_t)0xcd9b35b4, (q31_t)0x6769dbaa, (q31_t)0xcd937798, + (q31_t)0x675ff452, (q31_t)0xcd8bbb6d, (q31_t)0x67560b76, (q31_t)0xcd840134, + (q31_t)0x674c2115, (q31_t)0xcd7c48ee, (q31_t)0x67423530, (q31_t)0xcd74929a, + (q31_t)0x673847c8, (q31_t)0xcd6cde39, (q31_t)0x672e58dc, (q31_t)0xcd652bcb, + (q31_t)0x6724686e, (q31_t)0xcd5d7b50, (q31_t)0x671a767e, (q31_t)0xcd55ccca, + (q31_t)0x6710830c, (q31_t)0xcd4e2037, (q31_t)0x67068e18, (q31_t)0xcd467599, + (q31_t)0x66fc97a3, (q31_t)0xcd3eccef, (q31_t)0x66f29fad, (q31_t)0xcd37263a, + (q31_t)0x66e8a637, (q31_t)0xcd2f817b, (q31_t)0x66deab41, (q31_t)0xcd27deb0, + (q31_t)0x66d4aecb, (q31_t)0xcd203ddc, (q31_t)0x66cab0d6, (q31_t)0xcd189efe, + (q31_t)0x66c0b162, (q31_t)0xcd110216, (q31_t)0x66b6b070, (q31_t)0xcd096725, + (q31_t)0x66acadff, (q31_t)0xcd01ce2b, (q31_t)0x66a2aa11, (q31_t)0xccfa3729, + (q31_t)0x6698a4a6, (q31_t)0xccf2a21d, (q31_t)0x668e9dbd, (q31_t)0xcceb0f0a, + (q31_t)0x66849558, (q31_t)0xcce37def, (q31_t)0x667a8b77, (q31_t)0xccdbeecc, + (q31_t)0x6670801a, (q31_t)0xccd461a2, (q31_t)0x66667342, (q31_t)0xccccd671, + (q31_t)0x665c64ef, (q31_t)0xccc54d3a, (q31_t)0x66525521, (q31_t)0xccbdc5fc, + (q31_t)0x664843d9, (q31_t)0xccb640b8, (q31_t)0x663e3117, (q31_t)0xccaebd6e, + (q31_t)0x66341cdb, (q31_t)0xcca73c1e, (q31_t)0x662a0727, (q31_t)0xcc9fbcca, + (q31_t)0x661feffa, (q31_t)0xcc983f70, (q31_t)0x6615d754, (q31_t)0xcc90c412, + (q31_t)0x660bbd37, (q31_t)0xcc894aaf, (q31_t)0x6601a1a2, (q31_t)0xcc81d349, + (q31_t)0x65f78497, (q31_t)0xcc7a5dde, (q31_t)0x65ed6614, (q31_t)0xcc72ea70, + (q31_t)0x65e3461b, (q31_t)0xcc6b78ff, (q31_t)0x65d924ac, (q31_t)0xcc64098b, + (q31_t)0x65cf01c8, (q31_t)0xcc5c9c14, (q31_t)0x65c4dd6e, (q31_t)0xcc55309b, + (q31_t)0x65bab7a0, (q31_t)0xcc4dc720, (q31_t)0x65b0905d, (q31_t)0xcc465fa3, + (q31_t)0x65a667a7, (q31_t)0xcc3efa25, (q31_t)0x659c3d7c, (q31_t)0xcc3796a5, + (q31_t)0x659211df, (q31_t)0xcc303524, (q31_t)0x6587e4cf, (q31_t)0xcc28d5a3, + (q31_t)0x657db64c, (q31_t)0xcc217822, (q31_t)0x65738657, (q31_t)0xcc1a1ca0, + (q31_t)0x656954f1, (q31_t)0xcc12c31f, (q31_t)0x655f2219, (q31_t)0xcc0b6b9e, + (q31_t)0x6554edd1, (q31_t)0xcc04161e, (q31_t)0x654ab818, (q31_t)0xcbfcc29f, + (q31_t)0x654080ef, (q31_t)0xcbf57121, (q31_t)0x65364857, (q31_t)0xcbee21a5, + (q31_t)0x652c0e4f, (q31_t)0xcbe6d42b, (q31_t)0x6521d2d8, (q31_t)0xcbdf88b3, + (q31_t)0x651795f3, (q31_t)0xcbd83f3d, (q31_t)0x650d57a0, (q31_t)0xcbd0f7ca, + (q31_t)0x650317df, (q31_t)0xcbc9b25a, (q31_t)0x64f8d6b0, (q31_t)0xcbc26eee, + (q31_t)0x64ee9415, (q31_t)0xcbbb2d85, (q31_t)0x64e4500e, (q31_t)0xcbb3ee20, + (q31_t)0x64da0a9a, (q31_t)0xcbacb0bf, (q31_t)0x64cfc3ba, (q31_t)0xcba57563, + (q31_t)0x64c57b6f, (q31_t)0xcb9e3c0b, (q31_t)0x64bb31ba, (q31_t)0xcb9704b9, + (q31_t)0x64b0e699, (q31_t)0xcb8fcf6b, (q31_t)0x64a69a0f, (q31_t)0xcb889c23, + (q31_t)0x649c4c1b, (q31_t)0xcb816ae1, (q31_t)0x6491fcbe, (q31_t)0xcb7a3ba5, + (q31_t)0x6487abf7, (q31_t)0xcb730e70, (q31_t)0x647d59c8, (q31_t)0xcb6be341, + (q31_t)0x64730631, (q31_t)0xcb64ba19, (q31_t)0x6468b132, (q31_t)0xcb5d92f8, + (q31_t)0x645e5acc, (q31_t)0xcb566ddf, (q31_t)0x645402ff, (q31_t)0xcb4f4acd, + (q31_t)0x6449a9cc, (q31_t)0xcb4829c4, (q31_t)0x643f4f32, (q31_t)0xcb410ac3, + (q31_t)0x6434f332, (q31_t)0xcb39edca, (q31_t)0x642a95ce, (q31_t)0xcb32d2da, + (q31_t)0x64203704, (q31_t)0xcb2bb9f4, (q31_t)0x6415d6d5, (q31_t)0xcb24a316, + (q31_t)0x640b7543, (q31_t)0xcb1d8e43, (q31_t)0x6401124d, (q31_t)0xcb167b79, + (q31_t)0x63f6adf3, (q31_t)0xcb0f6aba, (q31_t)0x63ec4837, (q31_t)0xcb085c05, + (q31_t)0x63e1e117, (q31_t)0xcb014f5b, (q31_t)0x63d77896, (q31_t)0xcafa44bc, + (q31_t)0x63cd0eb3, (q31_t)0xcaf33c28, (q31_t)0x63c2a36f, (q31_t)0xcaec35a0, + (q31_t)0x63b836ca, (q31_t)0xcae53123, (q31_t)0x63adc8c4, (q31_t)0xcade2eb3, + (q31_t)0x63a3595e, (q31_t)0xcad72e4f, (q31_t)0x6398e898, (q31_t)0xcad02ff8, + (q31_t)0x638e7673, (q31_t)0xcac933ae, (q31_t)0x638402ef, (q31_t)0xcac23971, + (q31_t)0x63798e0d, (q31_t)0xcabb4141, (q31_t)0x636f17cc, (q31_t)0xcab44b1f, + (q31_t)0x6364a02e, (q31_t)0xcaad570c, (q31_t)0x635a2733, (q31_t)0xcaa66506, + (q31_t)0x634facda, (q31_t)0xca9f750f, (q31_t)0x63453125, (q31_t)0xca988727, + (q31_t)0x633ab414, (q31_t)0xca919b4e, (q31_t)0x633035a7, (q31_t)0xca8ab184, + (q31_t)0x6325b5df, (q31_t)0xca83c9ca, (q31_t)0x631b34bc, (q31_t)0xca7ce420, + (q31_t)0x6310b23e, (q31_t)0xca760086, (q31_t)0x63062e67, (q31_t)0xca6f1efc, + (q31_t)0x62fba936, (q31_t)0xca683f83, (q31_t)0x62f122ab, (q31_t)0xca61621b, + (q31_t)0x62e69ac8, (q31_t)0xca5a86c4, (q31_t)0x62dc118c, (q31_t)0xca53ad7e, + (q31_t)0x62d186f8, (q31_t)0xca4cd64b, (q31_t)0x62c6fb0c, (q31_t)0xca460129, + (q31_t)0x62bc6dca, (q31_t)0xca3f2e19, (q31_t)0x62b1df30, (q31_t)0xca385d1d, + (q31_t)0x62a74f40, (q31_t)0xca318e32, (q31_t)0x629cbdfa, (q31_t)0xca2ac15b, + (q31_t)0x62922b5e, (q31_t)0xca23f698, (q31_t)0x6287976e, (q31_t)0xca1d2de7, + (q31_t)0x627d0228, (q31_t)0xca16674b, (q31_t)0x62726b8e, (q31_t)0xca0fa2c3, + (q31_t)0x6267d3a0, (q31_t)0xca08e04f, (q31_t)0x625d3a5e, (q31_t)0xca021fef, + (q31_t)0x62529fca, (q31_t)0xc9fb61a5, (q31_t)0x624803e2, (q31_t)0xc9f4a570, + (q31_t)0x623d66a8, (q31_t)0xc9edeb50, (q31_t)0x6232c81c, (q31_t)0xc9e73346, + (q31_t)0x6228283f, (q31_t)0xc9e07d51, (q31_t)0x621d8711, (q31_t)0xc9d9c973, + (q31_t)0x6212e492, (q31_t)0xc9d317ab, (q31_t)0x620840c2, (q31_t)0xc9cc67fa, + (q31_t)0x61fd9ba3, (q31_t)0xc9c5ba60, (q31_t)0x61f2f534, (q31_t)0xc9bf0edd, + (q31_t)0x61e84d76, (q31_t)0xc9b86572, (q31_t)0x61dda46a, (q31_t)0xc9b1be1e, + (q31_t)0x61d2fa0f, (q31_t)0xc9ab18e3, (q31_t)0x61c84e67, (q31_t)0xc9a475bf, + (q31_t)0x61bda171, (q31_t)0xc99dd4b4, (q31_t)0x61b2f32e, (q31_t)0xc99735c2, + (q31_t)0x61a8439e, (q31_t)0xc99098e9, (q31_t)0x619d92c2, (q31_t)0xc989fe29, + (q31_t)0x6192e09b, (q31_t)0xc9836582, (q31_t)0x61882d28, (q31_t)0xc97ccef5, + (q31_t)0x617d786a, (q31_t)0xc9763a83, (q31_t)0x6172c262, (q31_t)0xc96fa82a, + (q31_t)0x61680b0f, (q31_t)0xc96917ec, (q31_t)0x615d5273, (q31_t)0xc96289c9, + (q31_t)0x6152988d, (q31_t)0xc95bfdc1, (q31_t)0x6147dd5f, (q31_t)0xc95573d4, + (q31_t)0x613d20e8, (q31_t)0xc94eec03, (q31_t)0x61326329, (q31_t)0xc948664d, + (q31_t)0x6127a423, (q31_t)0xc941e2b4, (q31_t)0x611ce3d5, (q31_t)0xc93b6137, + (q31_t)0x61122240, (q31_t)0xc934e1d6, (q31_t)0x61075f65, (q31_t)0xc92e6492, + (q31_t)0x60fc9b44, (q31_t)0xc927e96b, (q31_t)0x60f1d5de, (q31_t)0xc9217062, + (q31_t)0x60e70f32, (q31_t)0xc91af976, (q31_t)0x60dc4742, (q31_t)0xc91484a8, + (q31_t)0x60d17e0d, (q31_t)0xc90e11f7, (q31_t)0x60c6b395, (q31_t)0xc907a166, + (q31_t)0x60bbe7d8, (q31_t)0xc90132f2, (q31_t)0x60b11ad9, (q31_t)0xc8fac69e, + (q31_t)0x60a64c97, (q31_t)0xc8f45c68, (q31_t)0x609b7d13, (q31_t)0xc8edf452, + (q31_t)0x6090ac4d, (q31_t)0xc8e78e5b, (q31_t)0x6085da46, (q31_t)0xc8e12a84, + (q31_t)0x607b06fe, (q31_t)0xc8dac8cd, (q31_t)0x60703275, (q31_t)0xc8d46936, + (q31_t)0x60655cac, (q31_t)0xc8ce0bc0, (q31_t)0x605a85a3, (q31_t)0xc8c7b06b, + (q31_t)0x604fad5b, (q31_t)0xc8c15736, (q31_t)0x6044d3d4, (q31_t)0xc8bb0023, + (q31_t)0x6039f90f, (q31_t)0xc8b4ab32, (q31_t)0x602f1d0b, (q31_t)0xc8ae5862, + (q31_t)0x60243fca, (q31_t)0xc8a807b4, (q31_t)0x6019614c, (q31_t)0xc8a1b928, + (q31_t)0x600e8190, (q31_t)0xc89b6cbf, (q31_t)0x6003a099, (q31_t)0xc8952278, + (q31_t)0x5ff8be65, (q31_t)0xc88eda54, (q31_t)0x5feddaf6, (q31_t)0xc8889454, + (q31_t)0x5fe2f64c, (q31_t)0xc8825077, (q31_t)0x5fd81067, (q31_t)0xc87c0ebd, + (q31_t)0x5fcd2948, (q31_t)0xc875cf28, (q31_t)0x5fc240ef, (q31_t)0xc86f91b7, + (q31_t)0x5fb7575c, (q31_t)0xc869566a, (q31_t)0x5fac6c91, (q31_t)0xc8631d42, + (q31_t)0x5fa1808c, (q31_t)0xc85ce63e, (q31_t)0x5f969350, (q31_t)0xc856b160, + (q31_t)0x5f8ba4dc, (q31_t)0xc8507ea7, (q31_t)0x5f80b531, (q31_t)0xc84a4e14, + (q31_t)0x5f75c44e, (q31_t)0xc8441fa6, (q31_t)0x5f6ad235, (q31_t)0xc83df35f, + (q31_t)0x5f5fdee6, (q31_t)0xc837c93e, (q31_t)0x5f54ea62, (q31_t)0xc831a143, + (q31_t)0x5f49f4a8, (q31_t)0xc82b7b70, (q31_t)0x5f3efdb9, (q31_t)0xc82557c3, + (q31_t)0x5f340596, (q31_t)0xc81f363d, (q31_t)0x5f290c3f, (q31_t)0xc81916df, + (q31_t)0x5f1e11b5, (q31_t)0xc812f9a9, (q31_t)0x5f1315f7, (q31_t)0xc80cde9b, + (q31_t)0x5f081907, (q31_t)0xc806c5b5, (q31_t)0x5efd1ae4, (q31_t)0xc800aef7, + (q31_t)0x5ef21b90, (q31_t)0xc7fa9a62, (q31_t)0x5ee71b0a, (q31_t)0xc7f487f6, + (q31_t)0x5edc1953, (q31_t)0xc7ee77b3, (q31_t)0x5ed1166b, (q31_t)0xc7e8699a, + (q31_t)0x5ec61254, (q31_t)0xc7e25daa, (q31_t)0x5ebb0d0d, (q31_t)0xc7dc53e3, + (q31_t)0x5eb00696, (q31_t)0xc7d64c47, (q31_t)0x5ea4fef0, (q31_t)0xc7d046d6, + (q31_t)0x5e99f61d, (q31_t)0xc7ca438f, (q31_t)0x5e8eec1b, (q31_t)0xc7c44272, + (q31_t)0x5e83e0eb, (q31_t)0xc7be4381, (q31_t)0x5e78d48e, (q31_t)0xc7b846ba, + (q31_t)0x5e6dc705, (q31_t)0xc7b24c20, (q31_t)0x5e62b84f, (q31_t)0xc7ac53b1, + (q31_t)0x5e57a86d, (q31_t)0xc7a65d6e, (q31_t)0x5e4c9760, (q31_t)0xc7a06957, + (q31_t)0x5e418528, (q31_t)0xc79a776c, (q31_t)0x5e3671c5, (q31_t)0xc79487ae, + (q31_t)0x5e2b5d38, (q31_t)0xc78e9a1d, (q31_t)0x5e204781, (q31_t)0xc788aeb9, + (q31_t)0x5e1530a1, (q31_t)0xc782c582, (q31_t)0x5e0a1898, (q31_t)0xc77cde79, + (q31_t)0x5dfeff67, (q31_t)0xc776f99d, (q31_t)0x5df3e50d, (q31_t)0xc77116f0, + (q31_t)0x5de8c98c, (q31_t)0xc76b3671, (q31_t)0x5dddace4, (q31_t)0xc7655820, + (q31_t)0x5dd28f15, (q31_t)0xc75f7bfe, (q31_t)0x5dc7701f, (q31_t)0xc759a20a, + (q31_t)0x5dbc5004, (q31_t)0xc753ca46, (q31_t)0x5db12ec3, (q31_t)0xc74df4b1, + (q31_t)0x5da60c5d, (q31_t)0xc748214c, (q31_t)0x5d9ae8d2, (q31_t)0xc7425016, + (q31_t)0x5d8fc424, (q31_t)0xc73c8111, (q31_t)0x5d849e51, (q31_t)0xc736b43c, + (q31_t)0x5d79775c, (q31_t)0xc730e997, (q31_t)0x5d6e4f43, (q31_t)0xc72b2123, + (q31_t)0x5d632608, (q31_t)0xc7255ae0, (q31_t)0x5d57fbaa, (q31_t)0xc71f96ce, + (q31_t)0x5d4cd02c, (q31_t)0xc719d4ed, (q31_t)0x5d41a38c, (q31_t)0xc714153e, + (q31_t)0x5d3675cb, (q31_t)0xc70e57c0, (q31_t)0x5d2b46ea, (q31_t)0xc7089c75, + (q31_t)0x5d2016e9, (q31_t)0xc702e35c, (q31_t)0x5d14e5c9, (q31_t)0xc6fd2c75, + (q31_t)0x5d09b389, (q31_t)0xc6f777c1, (q31_t)0x5cfe802b, (q31_t)0xc6f1c540, + (q31_t)0x5cf34baf, (q31_t)0xc6ec14f2, (q31_t)0x5ce81615, (q31_t)0xc6e666d7, + (q31_t)0x5cdcdf5e, (q31_t)0xc6e0baf0, (q31_t)0x5cd1a78a, (q31_t)0xc6db113d, + (q31_t)0x5cc66e99, (q31_t)0xc6d569be, (q31_t)0x5cbb348d, (q31_t)0xc6cfc472, + (q31_t)0x5caff965, (q31_t)0xc6ca215c, (q31_t)0x5ca4bd21, (q31_t)0xc6c4807a, + (q31_t)0x5c997fc4, (q31_t)0xc6bee1cd, (q31_t)0x5c8e414b, (q31_t)0xc6b94554, + (q31_t)0x5c8301b9, (q31_t)0xc6b3ab12, (q31_t)0x5c77c10e, (q31_t)0xc6ae1304, + (q31_t)0x5c6c7f4a, (q31_t)0xc6a87d2d, (q31_t)0x5c613c6d, (q31_t)0xc6a2e98b, + (q31_t)0x5c55f878, (q31_t)0xc69d5820, (q31_t)0x5c4ab36b, (q31_t)0xc697c8eb, + (q31_t)0x5c3f6d47, (q31_t)0xc6923bec, (q31_t)0x5c34260c, (q31_t)0xc68cb124, + (q31_t)0x5c28ddbb, (q31_t)0xc6872894, (q31_t)0x5c1d9454, (q31_t)0xc681a23a, + (q31_t)0x5c1249d8, (q31_t)0xc67c1e18, (q31_t)0x5c06fe46, (q31_t)0xc6769c2e, + (q31_t)0x5bfbb1a0, (q31_t)0xc6711c7b, (q31_t)0x5bf063e6, (q31_t)0xc66b9f01, + (q31_t)0x5be51518, (q31_t)0xc66623be, (q31_t)0x5bd9c537, (q31_t)0xc660aab5, + (q31_t)0x5bce7442, (q31_t)0xc65b33e4, (q31_t)0x5bc3223c, (q31_t)0xc655bf4c, + (q31_t)0x5bb7cf23, (q31_t)0xc6504ced, (q31_t)0x5bac7af9, (q31_t)0xc64adcc7, + (q31_t)0x5ba125bd, (q31_t)0xc6456edb, (q31_t)0x5b95cf71, (q31_t)0xc6400329, + (q31_t)0x5b8a7815, (q31_t)0xc63a99b1, (q31_t)0x5b7f1fa9, (q31_t)0xc6353273, + (q31_t)0x5b73c62d, (q31_t)0xc62fcd6f, (q31_t)0x5b686ba3, (q31_t)0xc62a6aa6, + (q31_t)0x5b5d100a, (q31_t)0xc6250a18, (q31_t)0x5b51b363, (q31_t)0xc61fabc4, + (q31_t)0x5b4655ae, (q31_t)0xc61a4fac, (q31_t)0x5b3af6ec, (q31_t)0xc614f5cf, + (q31_t)0x5b2f971e, (q31_t)0xc60f9e2e, (q31_t)0x5b243643, (q31_t)0xc60a48c9, + (q31_t)0x5b18d45c, (q31_t)0xc604f5a0, (q31_t)0x5b0d716a, (q31_t)0xc5ffa4b3, + (q31_t)0x5b020d6c, (q31_t)0xc5fa5603, (q31_t)0x5af6a865, (q31_t)0xc5f5098f, + (q31_t)0x5aeb4253, (q31_t)0xc5efbf58, (q31_t)0x5adfdb37, (q31_t)0xc5ea775e, + (q31_t)0x5ad47312, (q31_t)0xc5e531a1, (q31_t)0x5ac909e5, (q31_t)0xc5dfee22, + (q31_t)0x5abd9faf, (q31_t)0xc5daace1, (q31_t)0x5ab23471, (q31_t)0xc5d56ddd, + (q31_t)0x5aa6c82b, (q31_t)0xc5d03118, (q31_t)0x5a9b5adf, (q31_t)0xc5caf690, + (q31_t)0x5a8fec8c, (q31_t)0xc5c5be47, (q31_t)0x5a847d33, (q31_t)0xc5c0883d, + (q31_t)0x5a790cd4, (q31_t)0xc5bb5472, (q31_t)0x5a6d9b70, (q31_t)0xc5b622e6, + (q31_t)0x5a622907, (q31_t)0xc5b0f399, (q31_t)0x5a56b599, (q31_t)0xc5abc68c, + (q31_t)0x5a4b4128, (q31_t)0xc5a69bbe, (q31_t)0x5a3fcbb3, (q31_t)0xc5a17330, + (q31_t)0x5a34553b, (q31_t)0xc59c4ce3, (q31_t)0x5a28ddc0, (q31_t)0xc59728d5, + (q31_t)0x5a1d6544, (q31_t)0xc5920708, (q31_t)0x5a11ebc5, (q31_t)0xc58ce77c, + (q31_t)0x5a067145, (q31_t)0xc587ca31, (q31_t)0x59faf5c5, (q31_t)0xc582af26, + (q31_t)0x59ef7944, (q31_t)0xc57d965d, (q31_t)0x59e3fbc3, (q31_t)0xc5787fd6, + (q31_t)0x59d87d42, (q31_t)0xc5736b90, (q31_t)0x59ccfdc2, (q31_t)0xc56e598c, + (q31_t)0x59c17d44, (q31_t)0xc56949ca, (q31_t)0x59b5fbc8, (q31_t)0xc5643c4a, + (q31_t)0x59aa794d, (q31_t)0xc55f310d, (q31_t)0x599ef5d6, (q31_t)0xc55a2812, + (q31_t)0x59937161, (q31_t)0xc555215a, (q31_t)0x5987ebf0, (q31_t)0xc5501ce5, + (q31_t)0x597c6584, (q31_t)0xc54b1ab4, (q31_t)0x5970de1b, (q31_t)0xc5461ac6, + (q31_t)0x596555b8, (q31_t)0xc5411d1b, (q31_t)0x5959cc5a, (q31_t)0xc53c21b4, + (q31_t)0x594e4201, (q31_t)0xc5372891, (q31_t)0x5942b6af, (q31_t)0xc53231b3, + (q31_t)0x59372a64, (q31_t)0xc52d3d18, (q31_t)0x592b9d1f, (q31_t)0xc5284ac3, + (q31_t)0x59200ee3, (q31_t)0xc5235ab2, (q31_t)0x59147fae, (q31_t)0xc51e6ce6, + (q31_t)0x5908ef82, (q31_t)0xc519815f, (q31_t)0x58fd5e5f, (q31_t)0xc514981d, + (q31_t)0x58f1cc45, (q31_t)0xc50fb121, (q31_t)0x58e63935, (q31_t)0xc50acc6b, + (q31_t)0x58daa52f, (q31_t)0xc505e9fb, (q31_t)0x58cf1034, (q31_t)0xc50109d0, + (q31_t)0x58c37a44, (q31_t)0xc4fc2bec, (q31_t)0x58b7e35f, (q31_t)0xc4f7504e, + (q31_t)0x58ac4b87, (q31_t)0xc4f276f7, (q31_t)0x58a0b2bb, (q31_t)0xc4ed9fe7, + (q31_t)0x589518fc, (q31_t)0xc4e8cb1e, (q31_t)0x58897e4a, (q31_t)0xc4e3f89c, + (q31_t)0x587de2a7, (q31_t)0xc4df2862, (q31_t)0x58724611, (q31_t)0xc4da5a6f, + (q31_t)0x5866a88a, (q31_t)0xc4d58ec3, (q31_t)0x585b0a13, (q31_t)0xc4d0c560, + (q31_t)0x584f6aab, (q31_t)0xc4cbfe45, (q31_t)0x5843ca53, (q31_t)0xc4c73972, + (q31_t)0x5838290c, (q31_t)0xc4c276e8, (q31_t)0x582c86d5, (q31_t)0xc4bdb6a6, + (q31_t)0x5820e3b0, (q31_t)0xc4b8f8ad, (q31_t)0x58153f9d, (q31_t)0xc4b43cfd, + (q31_t)0x58099a9c, (q31_t)0xc4af8397, (q31_t)0x57fdf4ae, (q31_t)0xc4aacc7a, + (q31_t)0x57f24dd3, (q31_t)0xc4a617a6, (q31_t)0x57e6a60c, (q31_t)0xc4a1651c, + (q31_t)0x57dafd59, (q31_t)0xc49cb4dd, (q31_t)0x57cf53bb, (q31_t)0xc49806e7, + (q31_t)0x57c3a931, (q31_t)0xc4935b3c, (q31_t)0x57b7fdbd, (q31_t)0xc48eb1db, + (q31_t)0x57ac515f, (q31_t)0xc48a0ac4, (q31_t)0x57a0a417, (q31_t)0xc48565f9, + (q31_t)0x5794f5e6, (q31_t)0xc480c379, (q31_t)0x578946cc, (q31_t)0xc47c2344, + (q31_t)0x577d96ca, (q31_t)0xc477855a, (q31_t)0x5771e5e0, (q31_t)0xc472e9bc, + (q31_t)0x5766340f, (q31_t)0xc46e5069, (q31_t)0x575a8157, (q31_t)0xc469b963, + (q31_t)0x574ecdb8, (q31_t)0xc46524a9, (q31_t)0x57431933, (q31_t)0xc460923b, + (q31_t)0x573763c9, (q31_t)0xc45c0219, (q31_t)0x572bad7a, (q31_t)0xc4577444, + (q31_t)0x571ff646, (q31_t)0xc452e8bc, (q31_t)0x57143e2d, (q31_t)0xc44e5f80, + (q31_t)0x57088531, (q31_t)0xc449d892, (q31_t)0x56fccb51, (q31_t)0xc44553f2, + (q31_t)0x56f1108f, (q31_t)0xc440d19e, (q31_t)0x56e554ea, (q31_t)0xc43c5199, + (q31_t)0x56d99864, (q31_t)0xc437d3e1, (q31_t)0x56cddafb, (q31_t)0xc4335877, + (q31_t)0x56c21cb2, (q31_t)0xc42edf5c, (q31_t)0x56b65d88, (q31_t)0xc42a688f, + (q31_t)0x56aa9d7e, (q31_t)0xc425f410, (q31_t)0x569edc94, (q31_t)0xc42181e0, + (q31_t)0x56931acb, (q31_t)0xc41d11ff, (q31_t)0x56875823, (q31_t)0xc418a46d, + (q31_t)0x567b949d, (q31_t)0xc414392b, (q31_t)0x566fd039, (q31_t)0xc40fd037, + (q31_t)0x56640af7, (q31_t)0xc40b6994, (q31_t)0x565844d8, (q31_t)0xc4070540, + (q31_t)0x564c7ddd, (q31_t)0xc402a33c, (q31_t)0x5640b606, (q31_t)0xc3fe4388, + (q31_t)0x5634ed53, (q31_t)0xc3f9e624, (q31_t)0x562923c5, (q31_t)0xc3f58b10, + (q31_t)0x561d595d, (q31_t)0xc3f1324e, (q31_t)0x56118e1a, (q31_t)0xc3ecdbdc, + (q31_t)0x5605c1fd, (q31_t)0xc3e887bb, (q31_t)0x55f9f507, (q31_t)0xc3e435ea, + (q31_t)0x55ee2738, (q31_t)0xc3dfe66c, (q31_t)0x55e25890, (q31_t)0xc3db993e, + (q31_t)0x55d68911, (q31_t)0xc3d74e62, (q31_t)0x55cab8ba, (q31_t)0xc3d305d8, + (q31_t)0x55bee78c, (q31_t)0xc3cebfa0, (q31_t)0x55b31587, (q31_t)0xc3ca7bba, + (q31_t)0x55a742ac, (q31_t)0xc3c63a26, (q31_t)0x559b6efb, (q31_t)0xc3c1fae5, + (q31_t)0x558f9a76, (q31_t)0xc3bdbdf6, (q31_t)0x5583c51b, (q31_t)0xc3b9835a, + (q31_t)0x5577eeec, (q31_t)0xc3b54b11, (q31_t)0x556c17e9, (q31_t)0xc3b1151b, + (q31_t)0x55604013, (q31_t)0xc3ace178, (q31_t)0x5554676a, (q31_t)0xc3a8b028, + (q31_t)0x55488dee, (q31_t)0xc3a4812c, (q31_t)0x553cb3a0, (q31_t)0xc3a05484, + (q31_t)0x5530d881, (q31_t)0xc39c2a2f, (q31_t)0x5524fc90, (q31_t)0xc398022f, + (q31_t)0x55191fcf, (q31_t)0xc393dc82, (q31_t)0x550d423d, (q31_t)0xc38fb92a, + (q31_t)0x550163dc, (q31_t)0xc38b9827, (q31_t)0x54f584ac, (q31_t)0xc3877978, + (q31_t)0x54e9a4ac, (q31_t)0xc3835d1e, (q31_t)0x54ddc3de, (q31_t)0xc37f4319, + (q31_t)0x54d1e242, (q31_t)0xc37b2b6a, (q31_t)0x54c5ffd9, (q31_t)0xc377160f, + (q31_t)0x54ba1ca3, (q31_t)0xc373030a, (q31_t)0x54ae38a0, (q31_t)0xc36ef25b, + (q31_t)0x54a253d1, (q31_t)0xc36ae401, (q31_t)0x54966e36, (q31_t)0xc366d7fd, + (q31_t)0x548a87d1, (q31_t)0xc362ce50, (q31_t)0x547ea0a0, (q31_t)0xc35ec6f8, + (q31_t)0x5472b8a5, (q31_t)0xc35ac1f7, (q31_t)0x5466cfe1, (q31_t)0xc356bf4d, + (q31_t)0x545ae653, (q31_t)0xc352bef9, (q31_t)0x544efbfc, (q31_t)0xc34ec0fc, + (q31_t)0x544310dd, (q31_t)0xc34ac556, (q31_t)0x543724f5, (q31_t)0xc346cc07, + (q31_t)0x542b3846, (q31_t)0xc342d510, (q31_t)0x541f4ad1, (q31_t)0xc33ee070, + (q31_t)0x54135c94, (q31_t)0xc33aee27, (q31_t)0x54076d91, (q31_t)0xc336fe37, + (q31_t)0x53fb7dc9, (q31_t)0xc333109e, (q31_t)0x53ef8d3c, (q31_t)0xc32f255e, + (q31_t)0x53e39be9, (q31_t)0xc32b3c75, (q31_t)0x53d7a9d3, (q31_t)0xc32755e5, + (q31_t)0x53cbb6f8, (q31_t)0xc32371ae, (q31_t)0x53bfc35b, (q31_t)0xc31f8fcf, + (q31_t)0x53b3cefa, (q31_t)0xc31bb049, (q31_t)0x53a7d9d7, (q31_t)0xc317d31c, + (q31_t)0x539be3f2, (q31_t)0xc313f848, (q31_t)0x538fed4b, (q31_t)0xc3101fce, + (q31_t)0x5383f5e3, (q31_t)0xc30c49ad, (q31_t)0x5377fdbb, (q31_t)0xc30875e5, + (q31_t)0x536c04d2, (q31_t)0xc304a477, (q31_t)0x53600b2a, (q31_t)0xc300d563, + (q31_t)0x535410c3, (q31_t)0xc2fd08a9, (q31_t)0x5348159d, (q31_t)0xc2f93e4a, + (q31_t)0x533c19b8, (q31_t)0xc2f57644, (q31_t)0x53301d16, (q31_t)0xc2f1b099, + (q31_t)0x53241fb6, (q31_t)0xc2eded49, (q31_t)0x5318219a, (q31_t)0xc2ea2c53, + (q31_t)0x530c22c1, (q31_t)0xc2e66db8, (q31_t)0x5300232c, (q31_t)0xc2e2b178, + (q31_t)0x52f422db, (q31_t)0xc2def794, (q31_t)0x52e821cf, (q31_t)0xc2db400a, + (q31_t)0x52dc2009, (q31_t)0xc2d78add, (q31_t)0x52d01d89, (q31_t)0xc2d3d80a, + (q31_t)0x52c41a4f, (q31_t)0xc2d02794, (q31_t)0x52b8165b, (q31_t)0xc2cc7979, + (q31_t)0x52ac11af, (q31_t)0xc2c8cdbb, (q31_t)0x52a00c4b, (q31_t)0xc2c52459, + (q31_t)0x5294062f, (q31_t)0xc2c17d52, (q31_t)0x5287ff5b, (q31_t)0xc2bdd8a9, + (q31_t)0x527bf7d1, (q31_t)0xc2ba365c, (q31_t)0x526fef90, (q31_t)0xc2b6966c, + (q31_t)0x5263e699, (q31_t)0xc2b2f8d8, (q31_t)0x5257dced, (q31_t)0xc2af5da2, + (q31_t)0x524bd28c, (q31_t)0xc2abc4c9, (q31_t)0x523fc776, (q31_t)0xc2a82e4d, + (q31_t)0x5233bbac, (q31_t)0xc2a49a2e, (q31_t)0x5227af2e, (q31_t)0xc2a1086d, + (q31_t)0x521ba1fd, (q31_t)0xc29d790a, (q31_t)0x520f941a, (q31_t)0xc299ec05, + (q31_t)0x52038584, (q31_t)0xc296615d, (q31_t)0x51f7763c, (q31_t)0xc292d914, + (q31_t)0x51eb6643, (q31_t)0xc28f5329, (q31_t)0x51df5599, (q31_t)0xc28bcf9c, + (q31_t)0x51d3443f, (q31_t)0xc2884e6e, (q31_t)0x51c73235, (q31_t)0xc284cf9f, + (q31_t)0x51bb1f7c, (q31_t)0xc281532e, (q31_t)0x51af0c13, (q31_t)0xc27dd91c, + (q31_t)0x51a2f7fc, (q31_t)0xc27a616a, (q31_t)0x5196e337, (q31_t)0xc276ec16, + (q31_t)0x518acdc4, (q31_t)0xc2737922, (q31_t)0x517eb7a4, (q31_t)0xc270088e, + (q31_t)0x5172a0d7, (q31_t)0xc26c9a58, (q31_t)0x5166895f, (q31_t)0xc2692e83, + (q31_t)0x515a713a, (q31_t)0xc265c50e, (q31_t)0x514e586a, (q31_t)0xc2625df8, + (q31_t)0x51423ef0, (q31_t)0xc25ef943, (q31_t)0x513624cb, (q31_t)0xc25b96ee, + (q31_t)0x512a09fc, (q31_t)0xc25836f9, (q31_t)0x511dee84, (q31_t)0xc254d965, + (q31_t)0x5111d263, (q31_t)0xc2517e31, (q31_t)0x5105b599, (q31_t)0xc24e255e, + (q31_t)0x50f99827, (q31_t)0xc24aceed, (q31_t)0x50ed7a0e, (q31_t)0xc2477adc, + (q31_t)0x50e15b4e, (q31_t)0xc244292c, (q31_t)0x50d53be7, (q31_t)0xc240d9de, + (q31_t)0x50c91bda, (q31_t)0xc23d8cf1, (q31_t)0x50bcfb28, (q31_t)0xc23a4265, + (q31_t)0x50b0d9d0, (q31_t)0xc236fa3b, (q31_t)0x50a4b7d3, (q31_t)0xc233b473, + (q31_t)0x50989532, (q31_t)0xc230710d, (q31_t)0x508c71ee, (q31_t)0xc22d3009, + (q31_t)0x50804e06, (q31_t)0xc229f167, (q31_t)0x5074297b, (q31_t)0xc226b528, + (q31_t)0x5068044e, (q31_t)0xc2237b4b, (q31_t)0x505bde7f, (q31_t)0xc22043d0, + (q31_t)0x504fb80e, (q31_t)0xc21d0eb8, (q31_t)0x504390fd, (q31_t)0xc219dc03, + (q31_t)0x5037694b, (q31_t)0xc216abb1, (q31_t)0x502b40f8, (q31_t)0xc2137dc2, + (q31_t)0x501f1807, (q31_t)0xc2105236, (q31_t)0x5012ee76, (q31_t)0xc20d290d, + (q31_t)0x5006c446, (q31_t)0xc20a0248, (q31_t)0x4ffa9979, (q31_t)0xc206dde6, + (q31_t)0x4fee6e0d, (q31_t)0xc203bbe8, (q31_t)0x4fe24205, (q31_t)0xc2009c4e, + (q31_t)0x4fd6155f, (q31_t)0xc1fd7f17, (q31_t)0x4fc9e81e, (q31_t)0xc1fa6445, + (q31_t)0x4fbdba40, (q31_t)0xc1f74bd6, (q31_t)0x4fb18bc8, (q31_t)0xc1f435cc, + (q31_t)0x4fa55cb4, (q31_t)0xc1f12227, (q31_t)0x4f992d06, (q31_t)0xc1ee10e5, + (q31_t)0x4f8cfcbe, (q31_t)0xc1eb0209, (q31_t)0x4f80cbdc, (q31_t)0xc1e7f591, + (q31_t)0x4f749a61, (q31_t)0xc1e4eb7e, (q31_t)0x4f68684e, (q31_t)0xc1e1e3d0, + (q31_t)0x4f5c35a3, (q31_t)0xc1dede87, (q31_t)0x4f500260, (q31_t)0xc1dbdba3, + (q31_t)0x4f43ce86, (q31_t)0xc1d8db25, (q31_t)0x4f379a16, (q31_t)0xc1d5dd0c, + (q31_t)0x4f2b650f, (q31_t)0xc1d2e158, (q31_t)0x4f1f2f73, (q31_t)0xc1cfe80a, + (q31_t)0x4f12f941, (q31_t)0xc1ccf122, (q31_t)0x4f06c27a, (q31_t)0xc1c9fca0, + (q31_t)0x4efa8b20, (q31_t)0xc1c70a84, (q31_t)0x4eee5331, (q31_t)0xc1c41ace, + (q31_t)0x4ee21aaf, (q31_t)0xc1c12d7e, (q31_t)0x4ed5e19a, (q31_t)0xc1be4294, + (q31_t)0x4ec9a7f3, (q31_t)0xc1bb5a11, (q31_t)0x4ebd6db9, (q31_t)0xc1b873f5, + (q31_t)0x4eb132ef, (q31_t)0xc1b5903f, (q31_t)0x4ea4f793, (q31_t)0xc1b2aef0, + (q31_t)0x4e98bba7, (q31_t)0xc1afd007, (q31_t)0x4e8c7f2a, (q31_t)0xc1acf386, + (q31_t)0x4e80421e, (q31_t)0xc1aa196c, (q31_t)0x4e740483, (q31_t)0xc1a741b9, + (q31_t)0x4e67c65a, (q31_t)0xc1a46c6e, (q31_t)0x4e5b87a2, (q31_t)0xc1a1998a, + (q31_t)0x4e4f485c, (q31_t)0xc19ec90d, (q31_t)0x4e430889, (q31_t)0xc19bfaf9, + (q31_t)0x4e36c82a, (q31_t)0xc1992f4c, (q31_t)0x4e2a873e, (q31_t)0xc1966606, + (q31_t)0x4e1e45c6, (q31_t)0xc1939f29, (q31_t)0x4e1203c3, (q31_t)0xc190dab4, + (q31_t)0x4e05c135, (q31_t)0xc18e18a7, (q31_t)0x4df97e1d, (q31_t)0xc18b5903, + (q31_t)0x4ded3a7b, (q31_t)0xc1889bc6, (q31_t)0x4de0f64f, (q31_t)0xc185e0f3, + (q31_t)0x4dd4b19a, (q31_t)0xc1832888, (q31_t)0x4dc86c5d, (q31_t)0xc1807285, + (q31_t)0x4dbc2698, (q31_t)0xc17dbeec, (q31_t)0x4dafe04b, (q31_t)0xc17b0dbb, + (q31_t)0x4da39978, (q31_t)0xc1785ef4, (q31_t)0x4d97521d, (q31_t)0xc175b296, + (q31_t)0x4d8b0a3d, (q31_t)0xc17308a1, (q31_t)0x4d7ec1d6, (q31_t)0xc1706115, + (q31_t)0x4d7278eb, (q31_t)0xc16dbbf3, (q31_t)0x4d662f7b, (q31_t)0xc16b193a, + (q31_t)0x4d59e586, (q31_t)0xc16878eb, (q31_t)0x4d4d9b0e, (q31_t)0xc165db05, + (q31_t)0x4d415013, (q31_t)0xc1633f8a, (q31_t)0x4d350495, (q31_t)0xc160a678, + (q31_t)0x4d28b894, (q31_t)0xc15e0fd1, (q31_t)0x4d1c6c11, (q31_t)0xc15b7b94, + (q31_t)0x4d101f0e, (q31_t)0xc158e9c1, (q31_t)0x4d03d189, (q31_t)0xc1565a58, + (q31_t)0x4cf78383, (q31_t)0xc153cd5a, (q31_t)0x4ceb34fe, (q31_t)0xc15142c6, + (q31_t)0x4cdee5f9, (q31_t)0xc14eba9d, (q31_t)0x4cd29676, (q31_t)0xc14c34df, + (q31_t)0x4cc64673, (q31_t)0xc149b18b, (q31_t)0x4cb9f5f3, (q31_t)0xc14730a3, + (q31_t)0x4cada4f5, (q31_t)0xc144b225, (q31_t)0x4ca1537a, (q31_t)0xc1423613, + (q31_t)0x4c950182, (q31_t)0xc13fbc6c, (q31_t)0x4c88af0e, (q31_t)0xc13d4530, + (q31_t)0x4c7c5c1e, (q31_t)0xc13ad060, (q31_t)0x4c7008b3, (q31_t)0xc1385dfb, + (q31_t)0x4c63b4ce, (q31_t)0xc135ee02, (q31_t)0x4c57606e, (q31_t)0xc1338075, + (q31_t)0x4c4b0b94, (q31_t)0xc1311553, (q31_t)0x4c3eb641, (q31_t)0xc12eac9d, + (q31_t)0x4c326075, (q31_t)0xc12c4653, (q31_t)0x4c260a31, (q31_t)0xc129e276, + (q31_t)0x4c19b374, (q31_t)0xc1278104, (q31_t)0x4c0d5c41, (q31_t)0xc12521ff, + (q31_t)0x4c010496, (q31_t)0xc122c566, (q31_t)0x4bf4ac75, (q31_t)0xc1206b39, + (q31_t)0x4be853de, (q31_t)0xc11e1379, (q31_t)0x4bdbfad1, (q31_t)0xc11bbe26, + (q31_t)0x4bcfa150, (q31_t)0xc1196b3f, (q31_t)0x4bc34759, (q31_t)0xc1171ac6, + (q31_t)0x4bb6ecef, (q31_t)0xc114ccb9, (q31_t)0x4baa9211, (q31_t)0xc1128119, + (q31_t)0x4b9e36c0, (q31_t)0xc11037e6, (q31_t)0x4b91dafc, (q31_t)0xc10df120, + (q31_t)0x4b857ec7, (q31_t)0xc10bacc8, (q31_t)0x4b79221f, (q31_t)0xc1096add, + (q31_t)0x4b6cc506, (q31_t)0xc1072b5f, (q31_t)0x4b60677c, (q31_t)0xc104ee4f, + (q31_t)0x4b540982, (q31_t)0xc102b3ac, (q31_t)0x4b47ab19, (q31_t)0xc1007b77, + (q31_t)0x4b3b4c40, (q31_t)0xc0fe45b0, (q31_t)0x4b2eecf8, (q31_t)0xc0fc1257, + (q31_t)0x4b228d42, (q31_t)0xc0f9e16b, (q31_t)0x4b162d1d, (q31_t)0xc0f7b2ee, + (q31_t)0x4b09cc8c, (q31_t)0xc0f586df, (q31_t)0x4afd6b8d, (q31_t)0xc0f35d3e, + (q31_t)0x4af10a22, (q31_t)0xc0f1360b, (q31_t)0x4ae4a84b, (q31_t)0xc0ef1147, + (q31_t)0x4ad84609, (q31_t)0xc0eceef1, (q31_t)0x4acbe35b, (q31_t)0xc0eacf09, + (q31_t)0x4abf8043, (q31_t)0xc0e8b190, (q31_t)0x4ab31cc1, (q31_t)0xc0e69686, + (q31_t)0x4aa6b8d5, (q31_t)0xc0e47deb, (q31_t)0x4a9a5480, (q31_t)0xc0e267be, + (q31_t)0x4a8defc3, (q31_t)0xc0e05401, (q31_t)0x4a818a9d, (q31_t)0xc0de42b2, + (q31_t)0x4a752510, (q31_t)0xc0dc33d2, (q31_t)0x4a68bf1b, (q31_t)0xc0da2762, + (q31_t)0x4a5c58c0, (q31_t)0xc0d81d61, (q31_t)0x4a4ff1fe, (q31_t)0xc0d615cf, + (q31_t)0x4a438ad7, (q31_t)0xc0d410ad, (q31_t)0x4a37234a, (q31_t)0xc0d20dfa, + (q31_t)0x4a2abb59, (q31_t)0xc0d00db6, (q31_t)0x4a1e5303, (q31_t)0xc0ce0fe3, + (q31_t)0x4a11ea49, (q31_t)0xc0cc147f, (q31_t)0x4a05812c, (q31_t)0xc0ca1b8a, + (q31_t)0x49f917ac, (q31_t)0xc0c82506, (q31_t)0x49ecadc9, (q31_t)0xc0c630f2, + (q31_t)0x49e04385, (q31_t)0xc0c43f4d, (q31_t)0x49d3d8df, (q31_t)0xc0c25019, + (q31_t)0x49c76dd8, (q31_t)0xc0c06355, (q31_t)0x49bb0271, (q31_t)0xc0be7901, + (q31_t)0x49ae96aa, (q31_t)0xc0bc911d, (q31_t)0x49a22a83, (q31_t)0xc0baabaa, + (q31_t)0x4995bdfd, (q31_t)0xc0b8c8a7, (q31_t)0x49895118, (q31_t)0xc0b6e815, + (q31_t)0x497ce3d5, (q31_t)0xc0b509f3, (q31_t)0x49707635, (q31_t)0xc0b32e42, + (q31_t)0x49640837, (q31_t)0xc0b15502, (q31_t)0x495799dd, (q31_t)0xc0af7e33, + (q31_t)0x494b2b27, (q31_t)0xc0ada9d4, (q31_t)0x493ebc14, (q31_t)0xc0abd7e6, + (q31_t)0x49324ca7, (q31_t)0xc0aa086a, (q31_t)0x4925dcdf, (q31_t)0xc0a83b5e, + (q31_t)0x49196cbc, (q31_t)0xc0a670c4, (q31_t)0x490cfc40, (q31_t)0xc0a4a89b, + (q31_t)0x49008b6a, (q31_t)0xc0a2e2e3, (q31_t)0x48f41a3c, (q31_t)0xc0a11f9d, + (q31_t)0x48e7a8b5, (q31_t)0xc09f5ec8, (q31_t)0x48db36d6, (q31_t)0xc09da065, + (q31_t)0x48cec4a0, (q31_t)0xc09be473, (q31_t)0x48c25213, (q31_t)0xc09a2af3, + (q31_t)0x48b5df30, (q31_t)0xc09873e4, (q31_t)0x48a96bf6, (q31_t)0xc096bf48, + (q31_t)0x489cf867, (q31_t)0xc0950d1d, (q31_t)0x48908483, (q31_t)0xc0935d64, + (q31_t)0x4884104b, (q31_t)0xc091b01d, (q31_t)0x48779bbe, (q31_t)0xc0900548, + (q31_t)0x486b26de, (q31_t)0xc08e5ce5, (q31_t)0x485eb1ab, (q31_t)0xc08cb6f5, + (q31_t)0x48523c25, (q31_t)0xc08b1376, (q31_t)0x4845c64d, (q31_t)0xc089726a, + (q31_t)0x48395024, (q31_t)0xc087d3d0, (q31_t)0x482cd9a9, (q31_t)0xc08637a9, + (q31_t)0x482062de, (q31_t)0xc0849df4, (q31_t)0x4813ebc2, (q31_t)0xc08306b2, + (q31_t)0x48077457, (q31_t)0xc08171e2, (q31_t)0x47fafc9c, (q31_t)0xc07fdf85, + (q31_t)0x47ee8493, (q31_t)0xc07e4f9b, (q31_t)0x47e20c3b, (q31_t)0xc07cc223, + (q31_t)0x47d59396, (q31_t)0xc07b371e, (q31_t)0x47c91aa3, (q31_t)0xc079ae8c, + (q31_t)0x47bca163, (q31_t)0xc078286e, (q31_t)0x47b027d7, (q31_t)0xc076a4c2, + (q31_t)0x47a3adff, (q31_t)0xc0752389, (q31_t)0x479733dc, (q31_t)0xc073a4c3, + (q31_t)0x478ab96e, (q31_t)0xc0722871, (q31_t)0x477e3eb5, (q31_t)0xc070ae92, + (q31_t)0x4771c3b3, (q31_t)0xc06f3726, (q31_t)0x47654867, (q31_t)0xc06dc22e, + (q31_t)0x4758ccd2, (q31_t)0xc06c4fa8, (q31_t)0x474c50f4, (q31_t)0xc06adf97, + (q31_t)0x473fd4cf, (q31_t)0xc06971f9, (q31_t)0x47335862, (q31_t)0xc06806ce, + (q31_t)0x4726dbae, (q31_t)0xc0669e18, (q31_t)0x471a5eb3, (q31_t)0xc06537d4, + (q31_t)0x470de172, (q31_t)0xc063d405, (q31_t)0x470163eb, (q31_t)0xc06272aa, + (q31_t)0x46f4e620, (q31_t)0xc06113c2, (q31_t)0x46e86810, (q31_t)0xc05fb74e, + (q31_t)0x46dbe9bb, (q31_t)0xc05e5d4e, (q31_t)0x46cf6b23, (q31_t)0xc05d05c3, + (q31_t)0x46c2ec48, (q31_t)0xc05bb0ab, (q31_t)0x46b66d29, (q31_t)0xc05a5e07, + (q31_t)0x46a9edc9, (q31_t)0xc0590dd8, (q31_t)0x469d6e27, (q31_t)0xc057c01d, + (q31_t)0x4690ee44, (q31_t)0xc05674d6, (q31_t)0x46846e1f, (q31_t)0xc0552c03, + (q31_t)0x4677edbb, (q31_t)0xc053e5a5, (q31_t)0x466b6d16, (q31_t)0xc052a1bb, + (q31_t)0x465eec33, (q31_t)0xc0516045, (q31_t)0x46526b10, (q31_t)0xc0502145, + (q31_t)0x4645e9af, (q31_t)0xc04ee4b8, (q31_t)0x46396810, (q31_t)0xc04daaa1, + (q31_t)0x462ce634, (q31_t)0xc04c72fe, (q31_t)0x4620641a, (q31_t)0xc04b3dcf, + (q31_t)0x4613e1c5, (q31_t)0xc04a0b16, (q31_t)0x46075f33, (q31_t)0xc048dad1, + (q31_t)0x45fadc66, (q31_t)0xc047ad01, (q31_t)0x45ee595d, (q31_t)0xc04681a6, + (q31_t)0x45e1d61b, (q31_t)0xc04558c0, (q31_t)0x45d5529e, (q31_t)0xc044324f, + (q31_t)0x45c8cee7, (q31_t)0xc0430e53, (q31_t)0x45bc4af8, (q31_t)0xc041eccc, + (q31_t)0x45afc6d0, (q31_t)0xc040cdba, (q31_t)0x45a3426f, (q31_t)0xc03fb11d, + (q31_t)0x4596bdd7, (q31_t)0xc03e96f6, (q31_t)0x458a3908, (q31_t)0xc03d7f44, + (q31_t)0x457db403, (q31_t)0xc03c6a07, (q31_t)0x45712ec7, (q31_t)0xc03b573f, + (q31_t)0x4564a955, (q31_t)0xc03a46ed, (q31_t)0x455823ae, (q31_t)0xc0393910, + (q31_t)0x454b9dd3, (q31_t)0xc0382da8, (q31_t)0x453f17c3, (q31_t)0xc03724b6, + (q31_t)0x4532917f, (q31_t)0xc0361e3a, (q31_t)0x45260b08, (q31_t)0xc0351a33, + (q31_t)0x4519845e, (q31_t)0xc03418a2, (q31_t)0x450cfd82, (q31_t)0xc0331986, + (q31_t)0x45007674, (q31_t)0xc0321ce0, (q31_t)0x44f3ef35, (q31_t)0xc03122b0, + (q31_t)0x44e767c5, (q31_t)0xc0302af5, (q31_t)0x44dae024, (q31_t)0xc02f35b1, + (q31_t)0x44ce5854, (q31_t)0xc02e42e2, (q31_t)0x44c1d054, (q31_t)0xc02d5289, + (q31_t)0x44b54825, (q31_t)0xc02c64a6, (q31_t)0x44a8bfc7, (q31_t)0xc02b7939, + (q31_t)0x449c373c, (q31_t)0xc02a9042, (q31_t)0x448fae83, (q31_t)0xc029a9c1, + (q31_t)0x4483259d, (q31_t)0xc028c5b6, (q31_t)0x44769c8b, (q31_t)0xc027e421, + (q31_t)0x446a134c, (q31_t)0xc0270502, (q31_t)0x445d89e2, (q31_t)0xc0262859, + (q31_t)0x4451004d, (q31_t)0xc0254e27, (q31_t)0x4444768d, (q31_t)0xc024766a, + (q31_t)0x4437eca4, (q31_t)0xc023a124, (q31_t)0x442b6290, (q31_t)0xc022ce54, + (q31_t)0x441ed854, (q31_t)0xc021fdfb, (q31_t)0x44124dee, (q31_t)0xc0213018, + (q31_t)0x4405c361, (q31_t)0xc02064ab, (q31_t)0x43f938ac, (q31_t)0xc01f9bb5, + (q31_t)0x43ecadcf, (q31_t)0xc01ed535, (q31_t)0x43e022cc, (q31_t)0xc01e112b, + (q31_t)0x43d397a3, (q31_t)0xc01d4f99, (q31_t)0x43c70c54, (q31_t)0xc01c907c, + (q31_t)0x43ba80df, (q31_t)0xc01bd3d6, (q31_t)0x43adf546, (q31_t)0xc01b19a7, + (q31_t)0x43a16988, (q31_t)0xc01a61ee, (q31_t)0x4394dda7, (q31_t)0xc019acac, + (q31_t)0x438851a2, (q31_t)0xc018f9e1, (q31_t)0x437bc57b, (q31_t)0xc018498c, + (q31_t)0x436f3931, (q31_t)0xc0179bae, (q31_t)0x4362acc5, (q31_t)0xc016f047, + (q31_t)0x43562038, (q31_t)0xc0164757, (q31_t)0x43499389, (q31_t)0xc015a0dd, + (q31_t)0x433d06bb, (q31_t)0xc014fcda, (q31_t)0x433079cc, (q31_t)0xc0145b4e, + (q31_t)0x4323ecbe, (q31_t)0xc013bc39, (q31_t)0x43175f91, (q31_t)0xc0131f9b, + (q31_t)0x430ad245, (q31_t)0xc0128574, (q31_t)0x42fe44dc, (q31_t)0xc011edc3, + (q31_t)0x42f1b755, (q31_t)0xc011588a, (q31_t)0x42e529b0, (q31_t)0xc010c5c7, + (q31_t)0x42d89bf0, (q31_t)0xc010357c, (q31_t)0x42cc0e13, (q31_t)0xc00fa7a8, + (q31_t)0x42bf801a, (q31_t)0xc00f1c4a, (q31_t)0x42b2f207, (q31_t)0xc00e9364, + (q31_t)0x42a663d8, (q31_t)0xc00e0cf5, (q31_t)0x4299d590, (q31_t)0xc00d88fd, + (q31_t)0x428d472e, (q31_t)0xc00d077c, (q31_t)0x4280b8b3, (q31_t)0xc00c8872, + (q31_t)0x42742a1f, (q31_t)0xc00c0be0, (q31_t)0x42679b73, (q31_t)0xc00b91c4, + (q31_t)0x425b0caf, (q31_t)0xc00b1a20, (q31_t)0x424e7dd4, (q31_t)0xc00aa4f3, + (q31_t)0x4241eee2, (q31_t)0xc00a323d, (q31_t)0x42355fd9, (q31_t)0xc009c1ff, + (q31_t)0x4228d0bb, (q31_t)0xc0095438, (q31_t)0x421c4188, (q31_t)0xc008e8e8, + (q31_t)0x420fb240, (q31_t)0xc008800f, (q31_t)0x420322e3, (q31_t)0xc00819ae, + (q31_t)0x41f69373, (q31_t)0xc007b5c4, (q31_t)0x41ea03ef, (q31_t)0xc0075452, + (q31_t)0x41dd7459, (q31_t)0xc006f556, (q31_t)0x41d0e4b0, (q31_t)0xc00698d3, + (q31_t)0x41c454f5, (q31_t)0xc0063ec6, (q31_t)0x41b7c528, (q31_t)0xc005e731, + (q31_t)0x41ab354b, (q31_t)0xc0059214, (q31_t)0x419ea55d, (q31_t)0xc0053f6e, + (q31_t)0x4192155f, (q31_t)0xc004ef3f, (q31_t)0x41858552, (q31_t)0xc004a188, + (q31_t)0x4178f536, (q31_t)0xc0045648, (q31_t)0x416c650b, (q31_t)0xc0040d80, + (q31_t)0x415fd4d2, (q31_t)0xc003c72f, (q31_t)0x4153448c, (q31_t)0xc0038356, + (q31_t)0x4146b438, (q31_t)0xc00341f4, (q31_t)0x413a23d8, (q31_t)0xc003030a, + (q31_t)0x412d936c, (q31_t)0xc002c697, (q31_t)0x412102f4, (q31_t)0xc0028c9c, + (q31_t)0x41147271, (q31_t)0xc0025519, (q31_t)0x4107e1e3, (q31_t)0xc002200d, + (q31_t)0x40fb514b, (q31_t)0xc001ed78, (q31_t)0x40eec0aa, (q31_t)0xc001bd5c, + (q31_t)0x40e22fff, (q31_t)0xc0018fb6, (q31_t)0x40d59f4c, (q31_t)0xc0016489, + (q31_t)0x40c90e90, (q31_t)0xc0013bd3, (q31_t)0x40bc7dcc, (q31_t)0xc0011594, + (q31_t)0x40afed02, (q31_t)0xc000f1ce, (q31_t)0x40a35c30, (q31_t)0xc000d07e, + (q31_t)0x4096cb58, (q31_t)0xc000b1a7, (q31_t)0x408a3a7b, (q31_t)0xc0009547, + (q31_t)0x407da998, (q31_t)0xc0007b5f, (q31_t)0x407118b0, (q31_t)0xc00063ee, + (q31_t)0x406487c4, (q31_t)0xc0004ef5, (q31_t)0x4057f6d4, (q31_t)0xc0003c74, + (q31_t)0x404b65e1, (q31_t)0xc0002c6a, (q31_t)0x403ed4ea, (q31_t)0xc0001ed8, + (q31_t)0x403243f1, (q31_t)0xc00013bd, (q31_t)0x4025b2f7, (q31_t)0xc0000b1a, + (q31_t)0x401921fb, (q31_t)0xc00004ef, (q31_t)0x400c90fe, (q31_t)0xc000013c, +}; +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q15) +/** + @par + Generation fixed-point realCoefAQ15 array in Q15 format: + @par + n = 4096 +
for (i = 0; i < n; i++)
+  {
+     pATable[2 * i]     = 0.5 * ( 1.0 - sin (2 * PI / (double) (2 * n) * (double) i));
+     pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
+  }
+ @par + Convert to fixed point Q15 format + round(pATable[i] * pow(2, 15)) + */ +const q15_t __ALIGNED(4) realCoefAQ15[8192] = { + (q15_t)0x4000, (q15_t)0xc000, (q15_t)0x3ff3, (q15_t)0xc000, (q15_t)0x3fe7, (q15_t)0xc000, (q15_t)0x3fda, (q15_t)0xc000, + (q15_t)0x3fce, (q15_t)0xc000, (q15_t)0x3fc1, (q15_t)0xc000, (q15_t)0x3fb5, (q15_t)0xc000, (q15_t)0x3fa8, (q15_t)0xc000, + (q15_t)0x3f9b, (q15_t)0xc000, (q15_t)0x3f8f, (q15_t)0xc000, (q15_t)0x3f82, (q15_t)0xc000, (q15_t)0x3f76, (q15_t)0xc001, + (q15_t)0x3f69, (q15_t)0xc001, (q15_t)0x3f5d, (q15_t)0xc001, (q15_t)0x3f50, (q15_t)0xc001, (q15_t)0x3f44, (q15_t)0xc001, + (q15_t)0x3f37, (q15_t)0xc001, (q15_t)0x3f2a, (q15_t)0xc001, (q15_t)0x3f1e, (q15_t)0xc002, (q15_t)0x3f11, (q15_t)0xc002, + (q15_t)0x3f05, (q15_t)0xc002, (q15_t)0x3ef8, (q15_t)0xc002, (q15_t)0x3eec, (q15_t)0xc002, (q15_t)0x3edf, (q15_t)0xc003, + (q15_t)0x3ed2, (q15_t)0xc003, (q15_t)0x3ec6, (q15_t)0xc003, (q15_t)0x3eb9, (q15_t)0xc003, (q15_t)0x3ead, (q15_t)0xc004, + (q15_t)0x3ea0, (q15_t)0xc004, (q15_t)0x3e94, (q15_t)0xc004, (q15_t)0x3e87, (q15_t)0xc004, (q15_t)0x3e7a, (q15_t)0xc005, + (q15_t)0x3e6e, (q15_t)0xc005, (q15_t)0x3e61, (q15_t)0xc005, (q15_t)0x3e55, (q15_t)0xc006, (q15_t)0x3e48, (q15_t)0xc006, + (q15_t)0x3e3c, (q15_t)0xc006, (q15_t)0x3e2f, (q15_t)0xc007, (q15_t)0x3e23, (q15_t)0xc007, (q15_t)0x3e16, (q15_t)0xc007, + (q15_t)0x3e09, (q15_t)0xc008, (q15_t)0x3dfd, (q15_t)0xc008, (q15_t)0x3df0, (q15_t)0xc009, (q15_t)0x3de4, (q15_t)0xc009, + (q15_t)0x3dd7, (q15_t)0xc009, (q15_t)0x3dcb, (q15_t)0xc00a, (q15_t)0x3dbe, (q15_t)0xc00a, (q15_t)0x3db2, (q15_t)0xc00b, + (q15_t)0x3da5, (q15_t)0xc00b, (q15_t)0x3d98, (q15_t)0xc00c, (q15_t)0x3d8c, (q15_t)0xc00c, (q15_t)0x3d7f, (q15_t)0xc00d, + (q15_t)0x3d73, (q15_t)0xc00d, (q15_t)0x3d66, (q15_t)0xc00e, (q15_t)0x3d5a, (q15_t)0xc00e, (q15_t)0x3d4d, (q15_t)0xc00f, + (q15_t)0x3d40, (q15_t)0xc00f, (q15_t)0x3d34, (q15_t)0xc010, (q15_t)0x3d27, (q15_t)0xc010, (q15_t)0x3d1b, (q15_t)0xc011, + (q15_t)0x3d0e, (q15_t)0xc011, (q15_t)0x3d02, (q15_t)0xc012, (q15_t)0x3cf5, (q15_t)0xc013, (q15_t)0x3ce9, (q15_t)0xc013, + (q15_t)0x3cdc, (q15_t)0xc014, (q15_t)0x3cd0, (q15_t)0xc014, (q15_t)0x3cc3, (q15_t)0xc015, (q15_t)0x3cb6, (q15_t)0xc016, + (q15_t)0x3caa, (q15_t)0xc016, (q15_t)0x3c9d, (q15_t)0xc017, (q15_t)0x3c91, (q15_t)0xc018, (q15_t)0x3c84, (q15_t)0xc018, + (q15_t)0x3c78, (q15_t)0xc019, (q15_t)0x3c6b, (q15_t)0xc01a, (q15_t)0x3c5f, (q15_t)0xc01a, (q15_t)0x3c52, (q15_t)0xc01b, + (q15_t)0x3c45, (q15_t)0xc01c, (q15_t)0x3c39, (q15_t)0xc01d, (q15_t)0x3c2c, (q15_t)0xc01d, (q15_t)0x3c20, (q15_t)0xc01e, + (q15_t)0x3c13, (q15_t)0xc01f, (q15_t)0x3c07, (q15_t)0xc020, (q15_t)0x3bfa, (q15_t)0xc020, (q15_t)0x3bee, (q15_t)0xc021, + (q15_t)0x3be1, (q15_t)0xc022, (q15_t)0x3bd5, (q15_t)0xc023, (q15_t)0x3bc8, (q15_t)0xc024, (q15_t)0x3bbc, (q15_t)0xc024, + (q15_t)0x3baf, (q15_t)0xc025, (q15_t)0x3ba2, (q15_t)0xc026, (q15_t)0x3b96, (q15_t)0xc027, (q15_t)0x3b89, (q15_t)0xc028, + (q15_t)0x3b7d, (q15_t)0xc029, (q15_t)0x3b70, (q15_t)0xc02a, (q15_t)0x3b64, (q15_t)0xc02b, (q15_t)0x3b57, (q15_t)0xc02b, + (q15_t)0x3b4b, (q15_t)0xc02c, (q15_t)0x3b3e, (q15_t)0xc02d, (q15_t)0x3b32, (q15_t)0xc02e, (q15_t)0x3b25, (q15_t)0xc02f, + (q15_t)0x3b19, (q15_t)0xc030, (q15_t)0x3b0c, (q15_t)0xc031, (q15_t)0x3b00, (q15_t)0xc032, (q15_t)0x3af3, (q15_t)0xc033, + (q15_t)0x3ae6, (q15_t)0xc034, (q15_t)0x3ada, (q15_t)0xc035, (q15_t)0x3acd, (q15_t)0xc036, (q15_t)0x3ac1, (q15_t)0xc037, + (q15_t)0x3ab4, (q15_t)0xc038, (q15_t)0x3aa8, (q15_t)0xc039, (q15_t)0x3a9b, (q15_t)0xc03a, (q15_t)0x3a8f, (q15_t)0xc03b, + (q15_t)0x3a82, (q15_t)0xc03c, (q15_t)0x3a76, (q15_t)0xc03d, (q15_t)0x3a69, (q15_t)0xc03f, (q15_t)0x3a5d, (q15_t)0xc040, + (q15_t)0x3a50, (q15_t)0xc041, (q15_t)0x3a44, (q15_t)0xc042, (q15_t)0x3a37, (q15_t)0xc043, (q15_t)0x3a2b, (q15_t)0xc044, + (q15_t)0x3a1e, (q15_t)0xc045, (q15_t)0x3a12, (q15_t)0xc047, (q15_t)0x3a05, (q15_t)0xc048, (q15_t)0x39f9, (q15_t)0xc049, + (q15_t)0x39ec, (q15_t)0xc04a, (q15_t)0x39e0, (q15_t)0xc04b, (q15_t)0x39d3, (q15_t)0xc04c, (q15_t)0x39c7, (q15_t)0xc04e, + (q15_t)0x39ba, (q15_t)0xc04f, (q15_t)0x39ae, (q15_t)0xc050, (q15_t)0x39a1, (q15_t)0xc051, (q15_t)0x3995, (q15_t)0xc053, + (q15_t)0x3988, (q15_t)0xc054, (q15_t)0x397c, (q15_t)0xc055, (q15_t)0x396f, (q15_t)0xc056, (q15_t)0x3963, (q15_t)0xc058, + (q15_t)0x3956, (q15_t)0xc059, (q15_t)0x394a, (q15_t)0xc05a, (q15_t)0x393d, (q15_t)0xc05c, (q15_t)0x3931, (q15_t)0xc05d, + (q15_t)0x3924, (q15_t)0xc05e, (q15_t)0x3918, (q15_t)0xc060, (q15_t)0x390b, (q15_t)0xc061, (q15_t)0x38ff, (q15_t)0xc062, + (q15_t)0x38f2, (q15_t)0xc064, (q15_t)0x38e6, (q15_t)0xc065, (q15_t)0x38d9, (q15_t)0xc067, (q15_t)0x38cd, (q15_t)0xc068, + (q15_t)0x38c0, (q15_t)0xc069, (q15_t)0x38b4, (q15_t)0xc06b, (q15_t)0x38a7, (q15_t)0xc06c, (q15_t)0x389b, (q15_t)0xc06e, + (q15_t)0x388e, (q15_t)0xc06f, (q15_t)0x3882, (q15_t)0xc071, (q15_t)0x3875, (q15_t)0xc072, (q15_t)0x3869, (q15_t)0xc074, + (q15_t)0x385c, (q15_t)0xc075, (q15_t)0x3850, (q15_t)0xc077, (q15_t)0x3843, (q15_t)0xc078, (q15_t)0x3837, (q15_t)0xc07a, + (q15_t)0x382a, (q15_t)0xc07b, (q15_t)0x381e, (q15_t)0xc07d, (q15_t)0x3811, (q15_t)0xc07e, (q15_t)0x3805, (q15_t)0xc080, + (q15_t)0x37f9, (q15_t)0xc081, (q15_t)0x37ec, (q15_t)0xc083, (q15_t)0x37e0, (q15_t)0xc085, (q15_t)0x37d3, (q15_t)0xc086, + (q15_t)0x37c7, (q15_t)0xc088, (q15_t)0x37ba, (q15_t)0xc089, (q15_t)0x37ae, (q15_t)0xc08b, (q15_t)0x37a1, (q15_t)0xc08d, + (q15_t)0x3795, (q15_t)0xc08e, (q15_t)0x3788, (q15_t)0xc090, (q15_t)0x377c, (q15_t)0xc092, (q15_t)0x376f, (q15_t)0xc093, + (q15_t)0x3763, (q15_t)0xc095, (q15_t)0x3757, (q15_t)0xc097, (q15_t)0x374a, (q15_t)0xc098, (q15_t)0x373e, (q15_t)0xc09a, + (q15_t)0x3731, (q15_t)0xc09c, (q15_t)0x3725, (q15_t)0xc09e, (q15_t)0x3718, (q15_t)0xc09f, (q15_t)0x370c, (q15_t)0xc0a1, + (q15_t)0x36ff, (q15_t)0xc0a3, (q15_t)0x36f3, (q15_t)0xc0a5, (q15_t)0x36e7, (q15_t)0xc0a6, (q15_t)0x36da, (q15_t)0xc0a8, + (q15_t)0x36ce, (q15_t)0xc0aa, (q15_t)0x36c1, (q15_t)0xc0ac, (q15_t)0x36b5, (q15_t)0xc0ae, (q15_t)0x36a8, (q15_t)0xc0af, + (q15_t)0x369c, (q15_t)0xc0b1, (q15_t)0x3690, (q15_t)0xc0b3, (q15_t)0x3683, (q15_t)0xc0b5, (q15_t)0x3677, (q15_t)0xc0b7, + (q15_t)0x366a, (q15_t)0xc0b9, (q15_t)0x365e, (q15_t)0xc0bb, (q15_t)0x3651, (q15_t)0xc0bd, (q15_t)0x3645, (q15_t)0xc0be, + (q15_t)0x3639, (q15_t)0xc0c0, (q15_t)0x362c, (q15_t)0xc0c2, (q15_t)0x3620, (q15_t)0xc0c4, (q15_t)0x3613, (q15_t)0xc0c6, + (q15_t)0x3607, (q15_t)0xc0c8, (q15_t)0x35fa, (q15_t)0xc0ca, (q15_t)0x35ee, (q15_t)0xc0cc, (q15_t)0x35e2, (q15_t)0xc0ce, + (q15_t)0x35d5, (q15_t)0xc0d0, (q15_t)0x35c9, (q15_t)0xc0d2, (q15_t)0x35bc, (q15_t)0xc0d4, (q15_t)0x35b0, (q15_t)0xc0d6, + (q15_t)0x35a4, (q15_t)0xc0d8, (q15_t)0x3597, (q15_t)0xc0da, (q15_t)0x358b, (q15_t)0xc0dc, (q15_t)0x357e, (q15_t)0xc0de, + (q15_t)0x3572, (q15_t)0xc0e0, (q15_t)0x3566, (q15_t)0xc0e2, (q15_t)0x3559, (q15_t)0xc0e4, (q15_t)0x354d, (q15_t)0xc0e7, + (q15_t)0x3540, (q15_t)0xc0e9, (q15_t)0x3534, (q15_t)0xc0eb, (q15_t)0x3528, (q15_t)0xc0ed, (q15_t)0x351b, (q15_t)0xc0ef, + (q15_t)0x350f, (q15_t)0xc0f1, (q15_t)0x3503, (q15_t)0xc0f3, (q15_t)0x34f6, (q15_t)0xc0f6, (q15_t)0x34ea, (q15_t)0xc0f8, + (q15_t)0x34dd, (q15_t)0xc0fa, (q15_t)0x34d1, (q15_t)0xc0fc, (q15_t)0x34c5, (q15_t)0xc0fe, (q15_t)0x34b8, (q15_t)0xc100, + (q15_t)0x34ac, (q15_t)0xc103, (q15_t)0x34a0, (q15_t)0xc105, (q15_t)0x3493, (q15_t)0xc107, (q15_t)0x3487, (q15_t)0xc109, + (q15_t)0x347b, (q15_t)0xc10c, (q15_t)0x346e, (q15_t)0xc10e, (q15_t)0x3462, (q15_t)0xc110, (q15_t)0x3455, (q15_t)0xc113, + (q15_t)0x3449, (q15_t)0xc115, (q15_t)0x343d, (q15_t)0xc117, (q15_t)0x3430, (q15_t)0xc119, (q15_t)0x3424, (q15_t)0xc11c, + (q15_t)0x3418, (q15_t)0xc11e, (q15_t)0x340b, (q15_t)0xc120, (q15_t)0x33ff, (q15_t)0xc123, (q15_t)0x33f3, (q15_t)0xc125, + (q15_t)0x33e6, (q15_t)0xc128, (q15_t)0x33da, (q15_t)0xc12a, (q15_t)0x33ce, (q15_t)0xc12c, (q15_t)0x33c1, (q15_t)0xc12f, + (q15_t)0x33b5, (q15_t)0xc131, (q15_t)0x33a9, (q15_t)0xc134, (q15_t)0x339c, (q15_t)0xc136, (q15_t)0x3390, (q15_t)0xc138, + (q15_t)0x3384, (q15_t)0xc13b, (q15_t)0x3377, (q15_t)0xc13d, (q15_t)0x336b, (q15_t)0xc140, (q15_t)0x335f, (q15_t)0xc142, + (q15_t)0x3352, (q15_t)0xc145, (q15_t)0x3346, (q15_t)0xc147, (q15_t)0x333a, (q15_t)0xc14a, (q15_t)0x332d, (q15_t)0xc14c, + (q15_t)0x3321, (q15_t)0xc14f, (q15_t)0x3315, (q15_t)0xc151, (q15_t)0x3308, (q15_t)0xc154, (q15_t)0x32fc, (q15_t)0xc156, + (q15_t)0x32f0, (q15_t)0xc159, (q15_t)0x32e4, (q15_t)0xc15b, (q15_t)0x32d7, (q15_t)0xc15e, (q15_t)0x32cb, (q15_t)0xc161, + (q15_t)0x32bf, (q15_t)0xc163, (q15_t)0x32b2, (q15_t)0xc166, (q15_t)0x32a6, (q15_t)0xc168, (q15_t)0x329a, (q15_t)0xc16b, + (q15_t)0x328e, (q15_t)0xc16e, (q15_t)0x3281, (q15_t)0xc170, (q15_t)0x3275, (q15_t)0xc173, (q15_t)0x3269, (q15_t)0xc176, + (q15_t)0x325c, (q15_t)0xc178, (q15_t)0x3250, (q15_t)0xc17b, (q15_t)0x3244, (q15_t)0xc17e, (q15_t)0x3238, (q15_t)0xc180, + (q15_t)0x322b, (q15_t)0xc183, (q15_t)0x321f, (q15_t)0xc186, (q15_t)0x3213, (q15_t)0xc189, (q15_t)0x3207, (q15_t)0xc18b, + (q15_t)0x31fa, (q15_t)0xc18e, (q15_t)0x31ee, (q15_t)0xc191, (q15_t)0x31e2, (q15_t)0xc194, (q15_t)0x31d5, (q15_t)0xc196, + (q15_t)0x31c9, (q15_t)0xc199, (q15_t)0x31bd, (q15_t)0xc19c, (q15_t)0x31b1, (q15_t)0xc19f, (q15_t)0x31a4, (q15_t)0xc1a2, + (q15_t)0x3198, (q15_t)0xc1a4, (q15_t)0x318c, (q15_t)0xc1a7, (q15_t)0x3180, (q15_t)0xc1aa, (q15_t)0x3174, (q15_t)0xc1ad, + (q15_t)0x3167, (q15_t)0xc1b0, (q15_t)0x315b, (q15_t)0xc1b3, (q15_t)0x314f, (q15_t)0xc1b6, (q15_t)0x3143, (q15_t)0xc1b8, + (q15_t)0x3136, (q15_t)0xc1bb, (q15_t)0x312a, (q15_t)0xc1be, (q15_t)0x311e, (q15_t)0xc1c1, (q15_t)0x3112, (q15_t)0xc1c4, + (q15_t)0x3105, (q15_t)0xc1c7, (q15_t)0x30f9, (q15_t)0xc1ca, (q15_t)0x30ed, (q15_t)0xc1cd, (q15_t)0x30e1, (q15_t)0xc1d0, + (q15_t)0x30d5, (q15_t)0xc1d3, (q15_t)0x30c8, (q15_t)0xc1d6, (q15_t)0x30bc, (q15_t)0xc1d9, (q15_t)0x30b0, (q15_t)0xc1dc, + (q15_t)0x30a4, (q15_t)0xc1df, (q15_t)0x3098, (q15_t)0xc1e2, (q15_t)0x308b, (q15_t)0xc1e5, (q15_t)0x307f, (q15_t)0xc1e8, + (q15_t)0x3073, (q15_t)0xc1eb, (q15_t)0x3067, (q15_t)0xc1ee, (q15_t)0x305b, (q15_t)0xc1f1, (q15_t)0x304e, (q15_t)0xc1f4, + (q15_t)0x3042, (q15_t)0xc1f7, (q15_t)0x3036, (q15_t)0xc1fa, (q15_t)0x302a, (q15_t)0xc1fd, (q15_t)0x301e, (q15_t)0xc201, + (q15_t)0x3012, (q15_t)0xc204, (q15_t)0x3005, (q15_t)0xc207, (q15_t)0x2ff9, (q15_t)0xc20a, (q15_t)0x2fed, (q15_t)0xc20d, + (q15_t)0x2fe1, (q15_t)0xc210, (q15_t)0x2fd5, (q15_t)0xc213, (q15_t)0x2fc9, (q15_t)0xc217, (q15_t)0x2fbc, (q15_t)0xc21a, + (q15_t)0x2fb0, (q15_t)0xc21d, (q15_t)0x2fa4, (q15_t)0xc220, (q15_t)0x2f98, (q15_t)0xc223, (q15_t)0x2f8c, (q15_t)0xc227, + (q15_t)0x2f80, (q15_t)0xc22a, (q15_t)0x2f74, (q15_t)0xc22d, (q15_t)0x2f67, (q15_t)0xc230, (q15_t)0x2f5b, (q15_t)0xc234, + (q15_t)0x2f4f, (q15_t)0xc237, (q15_t)0x2f43, (q15_t)0xc23a, (q15_t)0x2f37, (q15_t)0xc23e, (q15_t)0x2f2b, (q15_t)0xc241, + (q15_t)0x2f1f, (q15_t)0xc244, (q15_t)0x2f13, (q15_t)0xc247, (q15_t)0x2f06, (q15_t)0xc24b, (q15_t)0x2efa, (q15_t)0xc24e, + (q15_t)0x2eee, (q15_t)0xc251, (q15_t)0x2ee2, (q15_t)0xc255, (q15_t)0x2ed6, (q15_t)0xc258, (q15_t)0x2eca, (q15_t)0xc25c, + (q15_t)0x2ebe, (q15_t)0xc25f, (q15_t)0x2eb2, (q15_t)0xc262, (q15_t)0x2ea6, (q15_t)0xc266, (q15_t)0x2e99, (q15_t)0xc269, + (q15_t)0x2e8d, (q15_t)0xc26d, (q15_t)0x2e81, (q15_t)0xc270, (q15_t)0x2e75, (q15_t)0xc273, (q15_t)0x2e69, (q15_t)0xc277, + (q15_t)0x2e5d, (q15_t)0xc27a, (q15_t)0x2e51, (q15_t)0xc27e, (q15_t)0x2e45, (q15_t)0xc281, (q15_t)0x2e39, (q15_t)0xc285, + (q15_t)0x2e2d, (q15_t)0xc288, (q15_t)0x2e21, (q15_t)0xc28c, (q15_t)0x2e15, (q15_t)0xc28f, (q15_t)0x2e09, (q15_t)0xc293, + (q15_t)0x2dfc, (q15_t)0xc296, (q15_t)0x2df0, (q15_t)0xc29a, (q15_t)0x2de4, (q15_t)0xc29d, (q15_t)0x2dd8, (q15_t)0xc2a1, + (q15_t)0x2dcc, (q15_t)0xc2a5, (q15_t)0x2dc0, (q15_t)0xc2a8, (q15_t)0x2db4, (q15_t)0xc2ac, (q15_t)0x2da8, (q15_t)0xc2af, + (q15_t)0x2d9c, (q15_t)0xc2b3, (q15_t)0x2d90, (q15_t)0xc2b7, (q15_t)0x2d84, (q15_t)0xc2ba, (q15_t)0x2d78, (q15_t)0xc2be, + (q15_t)0x2d6c, (q15_t)0xc2c1, (q15_t)0x2d60, (q15_t)0xc2c5, (q15_t)0x2d54, (q15_t)0xc2c9, (q15_t)0x2d48, (q15_t)0xc2cc, + (q15_t)0x2d3c, (q15_t)0xc2d0, (q15_t)0x2d30, (q15_t)0xc2d4, (q15_t)0x2d24, (q15_t)0xc2d8, (q15_t)0x2d18, (q15_t)0xc2db, + (q15_t)0x2d0c, (q15_t)0xc2df, (q15_t)0x2d00, (q15_t)0xc2e3, (q15_t)0x2cf4, (q15_t)0xc2e6, (q15_t)0x2ce8, (q15_t)0xc2ea, + (q15_t)0x2cdc, (q15_t)0xc2ee, (q15_t)0x2cd0, (q15_t)0xc2f2, (q15_t)0x2cc4, (q15_t)0xc2f5, (q15_t)0x2cb8, (q15_t)0xc2f9, + (q15_t)0x2cac, (q15_t)0xc2fd, (q15_t)0x2ca0, (q15_t)0xc301, (q15_t)0x2c94, (q15_t)0xc305, (q15_t)0x2c88, (q15_t)0xc308, + (q15_t)0x2c7c, (q15_t)0xc30c, (q15_t)0x2c70, (q15_t)0xc310, (q15_t)0x2c64, (q15_t)0xc314, (q15_t)0x2c58, (q15_t)0xc318, + (q15_t)0x2c4c, (q15_t)0xc31c, (q15_t)0x2c40, (q15_t)0xc320, (q15_t)0x2c34, (q15_t)0xc323, (q15_t)0x2c28, (q15_t)0xc327, + (q15_t)0x2c1c, (q15_t)0xc32b, (q15_t)0x2c10, (q15_t)0xc32f, (q15_t)0x2c05, (q15_t)0xc333, (q15_t)0x2bf9, (q15_t)0xc337, + (q15_t)0x2bed, (q15_t)0xc33b, (q15_t)0x2be1, (q15_t)0xc33f, (q15_t)0x2bd5, (q15_t)0xc343, (q15_t)0x2bc9, (q15_t)0xc347, + (q15_t)0x2bbd, (q15_t)0xc34b, (q15_t)0x2bb1, (q15_t)0xc34f, (q15_t)0x2ba5, (q15_t)0xc353, (q15_t)0x2b99, (q15_t)0xc357, + (q15_t)0x2b8d, (q15_t)0xc35b, (q15_t)0x2b81, (q15_t)0xc35f, (q15_t)0x2b75, (q15_t)0xc363, (q15_t)0x2b6a, (q15_t)0xc367, + (q15_t)0x2b5e, (q15_t)0xc36b, (q15_t)0x2b52, (q15_t)0xc36f, (q15_t)0x2b46, (q15_t)0xc373, (q15_t)0x2b3a, (q15_t)0xc377, + (q15_t)0x2b2e, (q15_t)0xc37b, (q15_t)0x2b22, (q15_t)0xc37f, (q15_t)0x2b16, (q15_t)0xc383, (q15_t)0x2b0a, (q15_t)0xc387, + (q15_t)0x2aff, (q15_t)0xc38c, (q15_t)0x2af3, (q15_t)0xc390, (q15_t)0x2ae7, (q15_t)0xc394, (q15_t)0x2adb, (q15_t)0xc398, + (q15_t)0x2acf, (q15_t)0xc39c, (q15_t)0x2ac3, (q15_t)0xc3a0, (q15_t)0x2ab7, (q15_t)0xc3a5, (q15_t)0x2aac, (q15_t)0xc3a9, + (q15_t)0x2aa0, (q15_t)0xc3ad, (q15_t)0x2a94, (q15_t)0xc3b1, (q15_t)0x2a88, (q15_t)0xc3b5, (q15_t)0x2a7c, (q15_t)0xc3ba, + (q15_t)0x2a70, (q15_t)0xc3be, (q15_t)0x2a65, (q15_t)0xc3c2, (q15_t)0x2a59, (q15_t)0xc3c6, (q15_t)0x2a4d, (q15_t)0xc3ca, + (q15_t)0x2a41, (q15_t)0xc3cf, (q15_t)0x2a35, (q15_t)0xc3d3, (q15_t)0x2a29, (q15_t)0xc3d7, (q15_t)0x2a1e, (q15_t)0xc3dc, + (q15_t)0x2a12, (q15_t)0xc3e0, (q15_t)0x2a06, (q15_t)0xc3e4, (q15_t)0x29fa, (q15_t)0xc3e9, (q15_t)0x29ee, (q15_t)0xc3ed, + (q15_t)0x29e3, (q15_t)0xc3f1, (q15_t)0x29d7, (q15_t)0xc3f6, (q15_t)0x29cb, (q15_t)0xc3fa, (q15_t)0x29bf, (q15_t)0xc3fe, + (q15_t)0x29b4, (q15_t)0xc403, (q15_t)0x29a8, (q15_t)0xc407, (q15_t)0x299c, (q15_t)0xc40b, (q15_t)0x2990, (q15_t)0xc410, + (q15_t)0x2984, (q15_t)0xc414, (q15_t)0x2979, (q15_t)0xc419, (q15_t)0x296d, (q15_t)0xc41d, (q15_t)0x2961, (q15_t)0xc422, + (q15_t)0x2955, (q15_t)0xc426, (q15_t)0x294a, (q15_t)0xc42a, (q15_t)0x293e, (q15_t)0xc42f, (q15_t)0x2932, (q15_t)0xc433, + (q15_t)0x2926, (q15_t)0xc438, (q15_t)0x291b, (q15_t)0xc43c, (q15_t)0x290f, (q15_t)0xc441, (q15_t)0x2903, (q15_t)0xc445, + (q15_t)0x28f7, (q15_t)0xc44a, (q15_t)0x28ec, (q15_t)0xc44e, (q15_t)0x28e0, (q15_t)0xc453, (q15_t)0x28d4, (q15_t)0xc457, + (q15_t)0x28c9, (q15_t)0xc45c, (q15_t)0x28bd, (q15_t)0xc461, (q15_t)0x28b1, (q15_t)0xc465, (q15_t)0x28a5, (q15_t)0xc46a, + (q15_t)0x289a, (q15_t)0xc46e, (q15_t)0x288e, (q15_t)0xc473, (q15_t)0x2882, (q15_t)0xc478, (q15_t)0x2877, (q15_t)0xc47c, + (q15_t)0x286b, (q15_t)0xc481, (q15_t)0x285f, (q15_t)0xc485, (q15_t)0x2854, (q15_t)0xc48a, (q15_t)0x2848, (q15_t)0xc48f, + (q15_t)0x283c, (q15_t)0xc493, (q15_t)0x2831, (q15_t)0xc498, (q15_t)0x2825, (q15_t)0xc49d, (q15_t)0x2819, (q15_t)0xc4a1, + (q15_t)0x280e, (q15_t)0xc4a6, (q15_t)0x2802, (q15_t)0xc4ab, (q15_t)0x27f6, (q15_t)0xc4b0, (q15_t)0x27eb, (q15_t)0xc4b4, + (q15_t)0x27df, (q15_t)0xc4b9, (q15_t)0x27d3, (q15_t)0xc4be, (q15_t)0x27c8, (q15_t)0xc4c2, (q15_t)0x27bc, (q15_t)0xc4c7, + (q15_t)0x27b1, (q15_t)0xc4cc, (q15_t)0x27a5, (q15_t)0xc4d1, (q15_t)0x2799, (q15_t)0xc4d6, (q15_t)0x278e, (q15_t)0xc4da, + (q15_t)0x2782, (q15_t)0xc4df, (q15_t)0x2777, (q15_t)0xc4e4, (q15_t)0x276b, (q15_t)0xc4e9, (q15_t)0x275f, (q15_t)0xc4ee, + (q15_t)0x2754, (q15_t)0xc4f2, (q15_t)0x2748, (q15_t)0xc4f7, (q15_t)0x273d, (q15_t)0xc4fc, (q15_t)0x2731, (q15_t)0xc501, + (q15_t)0x2725, (q15_t)0xc506, (q15_t)0x271a, (q15_t)0xc50b, (q15_t)0x270e, (q15_t)0xc510, (q15_t)0x2703, (q15_t)0xc515, + (q15_t)0x26f7, (q15_t)0xc51a, (q15_t)0x26ec, (q15_t)0xc51e, (q15_t)0x26e0, (q15_t)0xc523, (q15_t)0x26d4, (q15_t)0xc528, + (q15_t)0x26c9, (q15_t)0xc52d, (q15_t)0x26bd, (q15_t)0xc532, (q15_t)0x26b2, (q15_t)0xc537, (q15_t)0x26a6, (q15_t)0xc53c, + (q15_t)0x269b, (q15_t)0xc541, (q15_t)0x268f, (q15_t)0xc546, (q15_t)0x2684, (q15_t)0xc54b, (q15_t)0x2678, (q15_t)0xc550, + (q15_t)0x266d, (q15_t)0xc555, (q15_t)0x2661, (q15_t)0xc55a, (q15_t)0x2656, (q15_t)0xc55f, (q15_t)0x264a, (q15_t)0xc564, + (q15_t)0x263f, (q15_t)0xc569, (q15_t)0x2633, (q15_t)0xc56e, (q15_t)0x2628, (q15_t)0xc573, (q15_t)0x261c, (q15_t)0xc578, + (q15_t)0x2611, (q15_t)0xc57e, (q15_t)0x2605, (q15_t)0xc583, (q15_t)0x25fa, (q15_t)0xc588, (q15_t)0x25ee, (q15_t)0xc58d, + (q15_t)0x25e3, (q15_t)0xc592, (q15_t)0x25d7, (q15_t)0xc597, (q15_t)0x25cc, (q15_t)0xc59c, (q15_t)0x25c0, (q15_t)0xc5a1, + (q15_t)0x25b5, (q15_t)0xc5a7, (q15_t)0x25a9, (q15_t)0xc5ac, (q15_t)0x259e, (q15_t)0xc5b1, (q15_t)0x2592, (q15_t)0xc5b6, + (q15_t)0x2587, (q15_t)0xc5bb, (q15_t)0x257c, (q15_t)0xc5c1, (q15_t)0x2570, (q15_t)0xc5c6, (q15_t)0x2565, (q15_t)0xc5cb, + (q15_t)0x2559, (q15_t)0xc5d0, (q15_t)0x254e, (q15_t)0xc5d5, (q15_t)0x2542, (q15_t)0xc5db, (q15_t)0x2537, (q15_t)0xc5e0, + (q15_t)0x252c, (q15_t)0xc5e5, (q15_t)0x2520, (q15_t)0xc5ea, (q15_t)0x2515, (q15_t)0xc5f0, (q15_t)0x2509, (q15_t)0xc5f5, + (q15_t)0x24fe, (q15_t)0xc5fa, (q15_t)0x24f3, (q15_t)0xc600, (q15_t)0x24e7, (q15_t)0xc605, (q15_t)0x24dc, (q15_t)0xc60a, + (q15_t)0x24d0, (q15_t)0xc610, (q15_t)0x24c5, (q15_t)0xc615, (q15_t)0x24ba, (q15_t)0xc61a, (q15_t)0x24ae, (q15_t)0xc620, + (q15_t)0x24a3, (q15_t)0xc625, (q15_t)0x2498, (q15_t)0xc62a, (q15_t)0x248c, (q15_t)0xc630, (q15_t)0x2481, (q15_t)0xc635, + (q15_t)0x2476, (q15_t)0xc63b, (q15_t)0x246a, (q15_t)0xc640, (q15_t)0x245f, (q15_t)0xc645, (q15_t)0x2454, (q15_t)0xc64b, + (q15_t)0x2448, (q15_t)0xc650, (q15_t)0x243d, (q15_t)0xc656, (q15_t)0x2432, (q15_t)0xc65b, (q15_t)0x2426, (q15_t)0xc661, + (q15_t)0x241b, (q15_t)0xc666, (q15_t)0x2410, (q15_t)0xc66c, (q15_t)0x2404, (q15_t)0xc671, (q15_t)0x23f9, (q15_t)0xc677, + (q15_t)0x23ee, (q15_t)0xc67c, (q15_t)0x23e2, (q15_t)0xc682, (q15_t)0x23d7, (q15_t)0xc687, (q15_t)0x23cc, (q15_t)0xc68d, + (q15_t)0x23c1, (q15_t)0xc692, (q15_t)0x23b5, (q15_t)0xc698, (q15_t)0x23aa, (q15_t)0xc69d, (q15_t)0x239f, (q15_t)0xc6a3, + (q15_t)0x2394, (q15_t)0xc6a8, (q15_t)0x2388, (q15_t)0xc6ae, (q15_t)0x237d, (q15_t)0xc6b4, (q15_t)0x2372, (q15_t)0xc6b9, + (q15_t)0x2367, (q15_t)0xc6bf, (q15_t)0x235b, (q15_t)0xc6c5, (q15_t)0x2350, (q15_t)0xc6ca, (q15_t)0x2345, (q15_t)0xc6d0, + (q15_t)0x233a, (q15_t)0xc6d5, (q15_t)0x232e, (q15_t)0xc6db, (q15_t)0x2323, (q15_t)0xc6e1, (q15_t)0x2318, (q15_t)0xc6e6, + (q15_t)0x230d, (q15_t)0xc6ec, (q15_t)0x2301, (q15_t)0xc6f2, (q15_t)0x22f6, (q15_t)0xc6f7, (q15_t)0x22eb, (q15_t)0xc6fd, + (q15_t)0x22e0, (q15_t)0xc703, (q15_t)0x22d5, (q15_t)0xc709, (q15_t)0x22ca, (q15_t)0xc70e, (q15_t)0x22be, (q15_t)0xc714, + (q15_t)0x22b3, (q15_t)0xc71a, (q15_t)0x22a8, (q15_t)0xc720, (q15_t)0x229d, (q15_t)0xc725, (q15_t)0x2292, (q15_t)0xc72b, + (q15_t)0x2287, (q15_t)0xc731, (q15_t)0x227b, (q15_t)0xc737, (q15_t)0x2270, (q15_t)0xc73d, (q15_t)0x2265, (q15_t)0xc742, + (q15_t)0x225a, (q15_t)0xc748, (q15_t)0x224f, (q15_t)0xc74e, (q15_t)0x2244, (q15_t)0xc754, (q15_t)0x2239, (q15_t)0xc75a, + (q15_t)0x222d, (q15_t)0xc75f, (q15_t)0x2222, (q15_t)0xc765, (q15_t)0x2217, (q15_t)0xc76b, (q15_t)0x220c, (q15_t)0xc771, + (q15_t)0x2201, (q15_t)0xc777, (q15_t)0x21f6, (q15_t)0xc77d, (q15_t)0x21eb, (q15_t)0xc783, (q15_t)0x21e0, (q15_t)0xc789, + (q15_t)0x21d5, (q15_t)0xc78f, (q15_t)0x21ca, (q15_t)0xc795, (q15_t)0x21be, (q15_t)0xc79a, (q15_t)0x21b3, (q15_t)0xc7a0, + (q15_t)0x21a8, (q15_t)0xc7a6, (q15_t)0x219d, (q15_t)0xc7ac, (q15_t)0x2192, (q15_t)0xc7b2, (q15_t)0x2187, (q15_t)0xc7b8, + (q15_t)0x217c, (q15_t)0xc7be, (q15_t)0x2171, (q15_t)0xc7c4, (q15_t)0x2166, (q15_t)0xc7ca, (q15_t)0x215b, (q15_t)0xc7d0, + (q15_t)0x2150, (q15_t)0xc7d6, (q15_t)0x2145, (q15_t)0xc7dc, (q15_t)0x213a, (q15_t)0xc7e2, (q15_t)0x212f, (q15_t)0xc7e8, + (q15_t)0x2124, (q15_t)0xc7ee, (q15_t)0x2119, (q15_t)0xc7f5, (q15_t)0x210e, (q15_t)0xc7fb, (q15_t)0x2103, (q15_t)0xc801, + (q15_t)0x20f8, (q15_t)0xc807, (q15_t)0x20ed, (q15_t)0xc80d, (q15_t)0x20e2, (q15_t)0xc813, (q15_t)0x20d7, (q15_t)0xc819, + (q15_t)0x20cc, (q15_t)0xc81f, (q15_t)0x20c1, (q15_t)0xc825, (q15_t)0x20b6, (q15_t)0xc82b, (q15_t)0x20ab, (q15_t)0xc832, + (q15_t)0x20a0, (q15_t)0xc838, (q15_t)0x2095, (q15_t)0xc83e, (q15_t)0x208a, (q15_t)0xc844, (q15_t)0x207f, (q15_t)0xc84a, + (q15_t)0x2074, (q15_t)0xc850, (q15_t)0x2069, (q15_t)0xc857, (q15_t)0x205e, (q15_t)0xc85d, (q15_t)0x2054, (q15_t)0xc863, + (q15_t)0x2049, (q15_t)0xc869, (q15_t)0x203e, (q15_t)0xc870, (q15_t)0x2033, (q15_t)0xc876, (q15_t)0x2028, (q15_t)0xc87c, + (q15_t)0x201d, (q15_t)0xc882, (q15_t)0x2012, (q15_t)0xc889, (q15_t)0x2007, (q15_t)0xc88f, (q15_t)0x1ffc, (q15_t)0xc895, + (q15_t)0x1ff1, (q15_t)0xc89b, (q15_t)0x1fe7, (q15_t)0xc8a2, (q15_t)0x1fdc, (q15_t)0xc8a8, (q15_t)0x1fd1, (q15_t)0xc8ae, + (q15_t)0x1fc6, (q15_t)0xc8b5, (q15_t)0x1fbb, (q15_t)0xc8bb, (q15_t)0x1fb0, (q15_t)0xc8c1, (q15_t)0x1fa5, (q15_t)0xc8c8, + (q15_t)0x1f9b, (q15_t)0xc8ce, (q15_t)0x1f90, (q15_t)0xc8d4, (q15_t)0x1f85, (q15_t)0xc8db, (q15_t)0x1f7a, (q15_t)0xc8e1, + (q15_t)0x1f6f, (q15_t)0xc8e8, (q15_t)0x1f65, (q15_t)0xc8ee, (q15_t)0x1f5a, (q15_t)0xc8f4, (q15_t)0x1f4f, (q15_t)0xc8fb, + (q15_t)0x1f44, (q15_t)0xc901, (q15_t)0x1f39, (q15_t)0xc908, (q15_t)0x1f2f, (q15_t)0xc90e, (q15_t)0x1f24, (q15_t)0xc915, + (q15_t)0x1f19, (q15_t)0xc91b, (q15_t)0x1f0e, (q15_t)0xc921, (q15_t)0x1f03, (q15_t)0xc928, (q15_t)0x1ef9, (q15_t)0xc92e, + (q15_t)0x1eee, (q15_t)0xc935, (q15_t)0x1ee3, (q15_t)0xc93b, (q15_t)0x1ed8, (q15_t)0xc942, (q15_t)0x1ece, (q15_t)0xc948, + (q15_t)0x1ec3, (q15_t)0xc94f, (q15_t)0x1eb8, (q15_t)0xc955, (q15_t)0x1ead, (q15_t)0xc95c, (q15_t)0x1ea3, (q15_t)0xc963, + (q15_t)0x1e98, (q15_t)0xc969, (q15_t)0x1e8d, (q15_t)0xc970, (q15_t)0x1e83, (q15_t)0xc976, (q15_t)0x1e78, (q15_t)0xc97d, + (q15_t)0x1e6d, (q15_t)0xc983, (q15_t)0x1e62, (q15_t)0xc98a, (q15_t)0x1e58, (q15_t)0xc991, (q15_t)0x1e4d, (q15_t)0xc997, + (q15_t)0x1e42, (q15_t)0xc99e, (q15_t)0x1e38, (q15_t)0xc9a4, (q15_t)0x1e2d, (q15_t)0xc9ab, (q15_t)0x1e22, (q15_t)0xc9b2, + (q15_t)0x1e18, (q15_t)0xc9b8, (q15_t)0x1e0d, (q15_t)0xc9bf, (q15_t)0x1e02, (q15_t)0xc9c6, (q15_t)0x1df8, (q15_t)0xc9cc, + (q15_t)0x1ded, (q15_t)0xc9d3, (q15_t)0x1de2, (q15_t)0xc9da, (q15_t)0x1dd8, (q15_t)0xc9e0, (q15_t)0x1dcd, (q15_t)0xc9e7, + (q15_t)0x1dc3, (q15_t)0xc9ee, (q15_t)0x1db8, (q15_t)0xc9f5, (q15_t)0x1dad, (q15_t)0xc9fb, (q15_t)0x1da3, (q15_t)0xca02, + (q15_t)0x1d98, (q15_t)0xca09, (q15_t)0x1d8e, (q15_t)0xca10, (q15_t)0x1d83, (q15_t)0xca16, (q15_t)0x1d78, (q15_t)0xca1d, + (q15_t)0x1d6e, (q15_t)0xca24, (q15_t)0x1d63, (q15_t)0xca2b, (q15_t)0x1d59, (q15_t)0xca32, (q15_t)0x1d4e, (q15_t)0xca38, + (q15_t)0x1d44, (q15_t)0xca3f, (q15_t)0x1d39, (q15_t)0xca46, (q15_t)0x1d2e, (q15_t)0xca4d, (q15_t)0x1d24, (q15_t)0xca54, + (q15_t)0x1d19, (q15_t)0xca5b, (q15_t)0x1d0f, (q15_t)0xca61, (q15_t)0x1d04, (q15_t)0xca68, (q15_t)0x1cfa, (q15_t)0xca6f, + (q15_t)0x1cef, (q15_t)0xca76, (q15_t)0x1ce5, (q15_t)0xca7d, (q15_t)0x1cda, (q15_t)0xca84, (q15_t)0x1cd0, (q15_t)0xca8b, + (q15_t)0x1cc5, (q15_t)0xca92, (q15_t)0x1cbb, (q15_t)0xca99, (q15_t)0x1cb0, (q15_t)0xca9f, (q15_t)0x1ca6, (q15_t)0xcaa6, + (q15_t)0x1c9b, (q15_t)0xcaad, (q15_t)0x1c91, (q15_t)0xcab4, (q15_t)0x1c86, (q15_t)0xcabb, (q15_t)0x1c7c, (q15_t)0xcac2, + (q15_t)0x1c72, (q15_t)0xcac9, (q15_t)0x1c67, (q15_t)0xcad0, (q15_t)0x1c5d, (q15_t)0xcad7, (q15_t)0x1c52, (q15_t)0xcade, + (q15_t)0x1c48, (q15_t)0xcae5, (q15_t)0x1c3d, (q15_t)0xcaec, (q15_t)0x1c33, (q15_t)0xcaf3, (q15_t)0x1c29, (q15_t)0xcafa, + (q15_t)0x1c1e, (q15_t)0xcb01, (q15_t)0x1c14, (q15_t)0xcb08, (q15_t)0x1c09, (q15_t)0xcb0f, (q15_t)0x1bff, (q15_t)0xcb16, + (q15_t)0x1bf5, (q15_t)0xcb1e, (q15_t)0x1bea, (q15_t)0xcb25, (q15_t)0x1be0, (q15_t)0xcb2c, (q15_t)0x1bd5, (q15_t)0xcb33, + (q15_t)0x1bcb, (q15_t)0xcb3a, (q15_t)0x1bc1, (q15_t)0xcb41, (q15_t)0x1bb6, (q15_t)0xcb48, (q15_t)0x1bac, (q15_t)0xcb4f, + (q15_t)0x1ba2, (q15_t)0xcb56, (q15_t)0x1b97, (q15_t)0xcb5e, (q15_t)0x1b8d, (q15_t)0xcb65, (q15_t)0x1b83, (q15_t)0xcb6c, + (q15_t)0x1b78, (q15_t)0xcb73, (q15_t)0x1b6e, (q15_t)0xcb7a, (q15_t)0x1b64, (q15_t)0xcb81, (q15_t)0x1b59, (q15_t)0xcb89, + (q15_t)0x1b4f, (q15_t)0xcb90, (q15_t)0x1b45, (q15_t)0xcb97, (q15_t)0x1b3b, (q15_t)0xcb9e, (q15_t)0x1b30, (q15_t)0xcba5, + (q15_t)0x1b26, (q15_t)0xcbad, (q15_t)0x1b1c, (q15_t)0xcbb4, (q15_t)0x1b11, (q15_t)0xcbbb, (q15_t)0x1b07, (q15_t)0xcbc2, + (q15_t)0x1afd, (q15_t)0xcbca, (q15_t)0x1af3, (q15_t)0xcbd1, (q15_t)0x1ae8, (q15_t)0xcbd8, (q15_t)0x1ade, (q15_t)0xcbe0, + (q15_t)0x1ad4, (q15_t)0xcbe7, (q15_t)0x1aca, (q15_t)0xcbee, (q15_t)0x1abf, (q15_t)0xcbf5, (q15_t)0x1ab5, (q15_t)0xcbfd, + (q15_t)0x1aab, (q15_t)0xcc04, (q15_t)0x1aa1, (q15_t)0xcc0b, (q15_t)0x1a97, (q15_t)0xcc13, (q15_t)0x1a8c, (q15_t)0xcc1a, + (q15_t)0x1a82, (q15_t)0xcc21, (q15_t)0x1a78, (q15_t)0xcc29, (q15_t)0x1a6e, (q15_t)0xcc30, (q15_t)0x1a64, (q15_t)0xcc38, + (q15_t)0x1a5a, (q15_t)0xcc3f, (q15_t)0x1a4f, (q15_t)0xcc46, (q15_t)0x1a45, (q15_t)0xcc4e, (q15_t)0x1a3b, (q15_t)0xcc55, + (q15_t)0x1a31, (q15_t)0xcc5d, (q15_t)0x1a27, (q15_t)0xcc64, (q15_t)0x1a1d, (q15_t)0xcc6b, (q15_t)0x1a13, (q15_t)0xcc73, + (q15_t)0x1a08, (q15_t)0xcc7a, (q15_t)0x19fe, (q15_t)0xcc82, (q15_t)0x19f4, (q15_t)0xcc89, (q15_t)0x19ea, (q15_t)0xcc91, + (q15_t)0x19e0, (q15_t)0xcc98, (q15_t)0x19d6, (q15_t)0xcca0, (q15_t)0x19cc, (q15_t)0xcca7, (q15_t)0x19c2, (q15_t)0xccaf, + (q15_t)0x19b8, (q15_t)0xccb6, (q15_t)0x19ae, (q15_t)0xccbe, (q15_t)0x19a4, (q15_t)0xccc5, (q15_t)0x199a, (q15_t)0xcccd, + (q15_t)0x198f, (q15_t)0xccd4, (q15_t)0x1985, (q15_t)0xccdc, (q15_t)0x197b, (q15_t)0xcce3, (q15_t)0x1971, (q15_t)0xcceb, + (q15_t)0x1967, (q15_t)0xccf3, (q15_t)0x195d, (q15_t)0xccfa, (q15_t)0x1953, (q15_t)0xcd02, (q15_t)0x1949, (q15_t)0xcd09, + (q15_t)0x193f, (q15_t)0xcd11, (q15_t)0x1935, (q15_t)0xcd19, (q15_t)0x192b, (q15_t)0xcd20, (q15_t)0x1921, (q15_t)0xcd28, + (q15_t)0x1917, (q15_t)0xcd30, (q15_t)0x190d, (q15_t)0xcd37, (q15_t)0x1903, (q15_t)0xcd3f, (q15_t)0x18f9, (q15_t)0xcd46, + (q15_t)0x18ef, (q15_t)0xcd4e, (q15_t)0x18e6, (q15_t)0xcd56, (q15_t)0x18dc, (q15_t)0xcd5d, (q15_t)0x18d2, (q15_t)0xcd65, + (q15_t)0x18c8, (q15_t)0xcd6d, (q15_t)0x18be, (q15_t)0xcd75, (q15_t)0x18b4, (q15_t)0xcd7c, (q15_t)0x18aa, (q15_t)0xcd84, + (q15_t)0x18a0, (q15_t)0xcd8c, (q15_t)0x1896, (q15_t)0xcd93, (q15_t)0x188c, (q15_t)0xcd9b, (q15_t)0x1882, (q15_t)0xcda3, + (q15_t)0x1878, (q15_t)0xcdab, (q15_t)0x186f, (q15_t)0xcdb2, (q15_t)0x1865, (q15_t)0xcdba, (q15_t)0x185b, (q15_t)0xcdc2, + (q15_t)0x1851, (q15_t)0xcdca, (q15_t)0x1847, (q15_t)0xcdd2, (q15_t)0x183d, (q15_t)0xcdd9, (q15_t)0x1833, (q15_t)0xcde1, + (q15_t)0x182a, (q15_t)0xcde9, (q15_t)0x1820, (q15_t)0xcdf1, (q15_t)0x1816, (q15_t)0xcdf9, (q15_t)0x180c, (q15_t)0xce01, + (q15_t)0x1802, (q15_t)0xce08, (q15_t)0x17f8, (q15_t)0xce10, (q15_t)0x17ef, (q15_t)0xce18, (q15_t)0x17e5, (q15_t)0xce20, + (q15_t)0x17db, (q15_t)0xce28, (q15_t)0x17d1, (q15_t)0xce30, (q15_t)0x17c8, (q15_t)0xce38, (q15_t)0x17be, (q15_t)0xce40, + (q15_t)0x17b4, (q15_t)0xce47, (q15_t)0x17aa, (q15_t)0xce4f, (q15_t)0x17a0, (q15_t)0xce57, (q15_t)0x1797, (q15_t)0xce5f, + (q15_t)0x178d, (q15_t)0xce67, (q15_t)0x1783, (q15_t)0xce6f, (q15_t)0x177a, (q15_t)0xce77, (q15_t)0x1770, (q15_t)0xce7f, + (q15_t)0x1766, (q15_t)0xce87, (q15_t)0x175c, (q15_t)0xce8f, (q15_t)0x1753, (q15_t)0xce97, (q15_t)0x1749, (q15_t)0xce9f, + (q15_t)0x173f, (q15_t)0xcea7, (q15_t)0x1736, (q15_t)0xceaf, (q15_t)0x172c, (q15_t)0xceb7, (q15_t)0x1722, (q15_t)0xcebf, + (q15_t)0x1719, (q15_t)0xcec7, (q15_t)0x170f, (q15_t)0xcecf, (q15_t)0x1705, (q15_t)0xced7, (q15_t)0x16fc, (q15_t)0xcedf, + (q15_t)0x16f2, (q15_t)0xcee7, (q15_t)0x16e8, (q15_t)0xceef, (q15_t)0x16df, (q15_t)0xcef7, (q15_t)0x16d5, (q15_t)0xceff, + (q15_t)0x16cb, (q15_t)0xcf07, (q15_t)0x16c2, (q15_t)0xcf10, (q15_t)0x16b8, (q15_t)0xcf18, (q15_t)0x16af, (q15_t)0xcf20, + (q15_t)0x16a5, (q15_t)0xcf28, (q15_t)0x169b, (q15_t)0xcf30, (q15_t)0x1692, (q15_t)0xcf38, (q15_t)0x1688, (q15_t)0xcf40, + (q15_t)0x167f, (q15_t)0xcf48, (q15_t)0x1675, (q15_t)0xcf51, (q15_t)0x166c, (q15_t)0xcf59, (q15_t)0x1662, (q15_t)0xcf61, + (q15_t)0x1659, (q15_t)0xcf69, (q15_t)0x164f, (q15_t)0xcf71, (q15_t)0x1645, (q15_t)0xcf79, (q15_t)0x163c, (q15_t)0xcf82, + (q15_t)0x1632, (q15_t)0xcf8a, (q15_t)0x1629, (q15_t)0xcf92, (q15_t)0x161f, (q15_t)0xcf9a, (q15_t)0x1616, (q15_t)0xcfa3, + (q15_t)0x160c, (q15_t)0xcfab, (q15_t)0x1603, (q15_t)0xcfb3, (q15_t)0x15f9, (q15_t)0xcfbb, (q15_t)0x15f0, (q15_t)0xcfc4, + (q15_t)0x15e6, (q15_t)0xcfcc, (q15_t)0x15dd, (q15_t)0xcfd4, (q15_t)0x15d4, (q15_t)0xcfdc, (q15_t)0x15ca, (q15_t)0xcfe5, + (q15_t)0x15c1, (q15_t)0xcfed, (q15_t)0x15b7, (q15_t)0xcff5, (q15_t)0x15ae, (q15_t)0xcffe, (q15_t)0x15a4, (q15_t)0xd006, + (q15_t)0x159b, (q15_t)0xd00e, (q15_t)0x1592, (q15_t)0xd016, (q15_t)0x1588, (q15_t)0xd01f, (q15_t)0x157f, (q15_t)0xd027, + (q15_t)0x1575, (q15_t)0xd030, (q15_t)0x156c, (q15_t)0xd038, (q15_t)0x1563, (q15_t)0xd040, (q15_t)0x1559, (q15_t)0xd049, + (q15_t)0x1550, (q15_t)0xd051, (q15_t)0x1547, (q15_t)0xd059, (q15_t)0x153d, (q15_t)0xd062, (q15_t)0x1534, (q15_t)0xd06a, + (q15_t)0x152a, (q15_t)0xd073, (q15_t)0x1521, (q15_t)0xd07b, (q15_t)0x1518, (q15_t)0xd083, (q15_t)0x150e, (q15_t)0xd08c, + (q15_t)0x1505, (q15_t)0xd094, (q15_t)0x14fc, (q15_t)0xd09d, (q15_t)0x14f3, (q15_t)0xd0a5, (q15_t)0x14e9, (q15_t)0xd0ae, + (q15_t)0x14e0, (q15_t)0xd0b6, (q15_t)0x14d7, (q15_t)0xd0bf, (q15_t)0x14cd, (q15_t)0xd0c7, (q15_t)0x14c4, (q15_t)0xd0d0, + (q15_t)0x14bb, (q15_t)0xd0d8, (q15_t)0x14b2, (q15_t)0xd0e0, (q15_t)0x14a8, (q15_t)0xd0e9, (q15_t)0x149f, (q15_t)0xd0f2, + (q15_t)0x1496, (q15_t)0xd0fa, (q15_t)0x148d, (q15_t)0xd103, (q15_t)0x1483, (q15_t)0xd10b, (q15_t)0x147a, (q15_t)0xd114, + (q15_t)0x1471, (q15_t)0xd11c, (q15_t)0x1468, (q15_t)0xd125, (q15_t)0x145f, (q15_t)0xd12d, (q15_t)0x1455, (q15_t)0xd136, + (q15_t)0x144c, (q15_t)0xd13e, (q15_t)0x1443, (q15_t)0xd147, (q15_t)0x143a, (q15_t)0xd150, (q15_t)0x1431, (q15_t)0xd158, + (q15_t)0x1428, (q15_t)0xd161, (q15_t)0x141e, (q15_t)0xd169, (q15_t)0x1415, (q15_t)0xd172, (q15_t)0x140c, (q15_t)0xd17b, + (q15_t)0x1403, (q15_t)0xd183, (q15_t)0x13fa, (q15_t)0xd18c, (q15_t)0x13f1, (q15_t)0xd195, (q15_t)0x13e8, (q15_t)0xd19d, + (q15_t)0x13df, (q15_t)0xd1a6, (q15_t)0x13d5, (q15_t)0xd1af, (q15_t)0x13cc, (q15_t)0xd1b7, (q15_t)0x13c3, (q15_t)0xd1c0, + (q15_t)0x13ba, (q15_t)0xd1c9, (q15_t)0x13b1, (q15_t)0xd1d1, (q15_t)0x13a8, (q15_t)0xd1da, (q15_t)0x139f, (q15_t)0xd1e3, + (q15_t)0x1396, (q15_t)0xd1eb, (q15_t)0x138d, (q15_t)0xd1f4, (q15_t)0x1384, (q15_t)0xd1fd, (q15_t)0x137b, (q15_t)0xd206, + (q15_t)0x1372, (q15_t)0xd20e, (q15_t)0x1369, (q15_t)0xd217, (q15_t)0x1360, (q15_t)0xd220, (q15_t)0x1357, (q15_t)0xd229, + (q15_t)0x134e, (q15_t)0xd231, (q15_t)0x1345, (q15_t)0xd23a, (q15_t)0x133c, (q15_t)0xd243, (q15_t)0x1333, (q15_t)0xd24c, + (q15_t)0x132a, (q15_t)0xd255, (q15_t)0x1321, (q15_t)0xd25d, (q15_t)0x1318, (q15_t)0xd266, (q15_t)0x130f, (q15_t)0xd26f, + (q15_t)0x1306, (q15_t)0xd278, (q15_t)0x12fd, (q15_t)0xd281, (q15_t)0x12f4, (q15_t)0xd28a, (q15_t)0x12eb, (q15_t)0xd292, + (q15_t)0x12e2, (q15_t)0xd29b, (q15_t)0x12d9, (q15_t)0xd2a4, (q15_t)0x12d1, (q15_t)0xd2ad, (q15_t)0x12c8, (q15_t)0xd2b6, + (q15_t)0x12bf, (q15_t)0xd2bf, (q15_t)0x12b6, (q15_t)0xd2c8, (q15_t)0x12ad, (q15_t)0xd2d1, (q15_t)0x12a4, (q15_t)0xd2d9, + (q15_t)0x129b, (q15_t)0xd2e2, (q15_t)0x1292, (q15_t)0xd2eb, (q15_t)0x128a, (q15_t)0xd2f4, (q15_t)0x1281, (q15_t)0xd2fd, + (q15_t)0x1278, (q15_t)0xd306, (q15_t)0x126f, (q15_t)0xd30f, (q15_t)0x1266, (q15_t)0xd318, (q15_t)0x125d, (q15_t)0xd321, + (q15_t)0x1255, (q15_t)0xd32a, (q15_t)0x124c, (q15_t)0xd333, (q15_t)0x1243, (q15_t)0xd33c, (q15_t)0x123a, (q15_t)0xd345, + (q15_t)0x1231, (q15_t)0xd34e, (q15_t)0x1229, (q15_t)0xd357, (q15_t)0x1220, (q15_t)0xd360, (q15_t)0x1217, (q15_t)0xd369, + (q15_t)0x120e, (q15_t)0xd372, (q15_t)0x1206, (q15_t)0xd37b, (q15_t)0x11fd, (q15_t)0xd384, (q15_t)0x11f4, (q15_t)0xd38d, + (q15_t)0x11eb, (q15_t)0xd396, (q15_t)0x11e3, (q15_t)0xd39f, (q15_t)0x11da, (q15_t)0xd3a8, (q15_t)0x11d1, (q15_t)0xd3b1, + (q15_t)0x11c9, (q15_t)0xd3ba, (q15_t)0x11c0, (q15_t)0xd3c3, (q15_t)0x11b7, (q15_t)0xd3cc, (q15_t)0x11af, (q15_t)0xd3d5, + (q15_t)0x11a6, (q15_t)0xd3df, (q15_t)0x119d, (q15_t)0xd3e8, (q15_t)0x1195, (q15_t)0xd3f1, (q15_t)0x118c, (q15_t)0xd3fa, + (q15_t)0x1183, (q15_t)0xd403, (q15_t)0x117b, (q15_t)0xd40c, (q15_t)0x1172, (q15_t)0xd415, (q15_t)0x1169, (q15_t)0xd41e, + (q15_t)0x1161, (q15_t)0xd428, (q15_t)0x1158, (q15_t)0xd431, (q15_t)0x1150, (q15_t)0xd43a, (q15_t)0x1147, (q15_t)0xd443, + (q15_t)0x113e, (q15_t)0xd44c, (q15_t)0x1136, (q15_t)0xd455, (q15_t)0x112d, (q15_t)0xd45f, (q15_t)0x1125, (q15_t)0xd468, + (q15_t)0x111c, (q15_t)0xd471, (q15_t)0x1114, (q15_t)0xd47a, (q15_t)0x110b, (q15_t)0xd483, (q15_t)0x1103, (q15_t)0xd48d, + (q15_t)0x10fa, (q15_t)0xd496, (q15_t)0x10f2, (q15_t)0xd49f, (q15_t)0x10e9, (q15_t)0xd4a8, (q15_t)0x10e0, (q15_t)0xd4b2, + (q15_t)0x10d8, (q15_t)0xd4bb, (q15_t)0x10d0, (q15_t)0xd4c4, (q15_t)0x10c7, (q15_t)0xd4cd, (q15_t)0x10bf, (q15_t)0xd4d7, + (q15_t)0x10b6, (q15_t)0xd4e0, (q15_t)0x10ae, (q15_t)0xd4e9, (q15_t)0x10a5, (q15_t)0xd4f3, (q15_t)0x109d, (q15_t)0xd4fc, + (q15_t)0x1094, (q15_t)0xd505, (q15_t)0x108c, (q15_t)0xd50e, (q15_t)0x1083, (q15_t)0xd518, (q15_t)0x107b, (q15_t)0xd521, + (q15_t)0x1073, (q15_t)0xd52a, (q15_t)0x106a, (q15_t)0xd534, (q15_t)0x1062, (q15_t)0xd53d, (q15_t)0x1059, (q15_t)0xd547, + (q15_t)0x1051, (q15_t)0xd550, (q15_t)0x1049, (q15_t)0xd559, (q15_t)0x1040, (q15_t)0xd563, (q15_t)0x1038, (q15_t)0xd56c, + (q15_t)0x1030, (q15_t)0xd575, (q15_t)0x1027, (q15_t)0xd57f, (q15_t)0x101f, (q15_t)0xd588, (q15_t)0x1016, (q15_t)0xd592, + (q15_t)0x100e, (q15_t)0xd59b, (q15_t)0x1006, (q15_t)0xd5a4, (q15_t)0xffe, (q15_t)0xd5ae, (q15_t)0xff5, (q15_t)0xd5b7, + (q15_t)0xfed, (q15_t)0xd5c1, (q15_t)0xfe5, (q15_t)0xd5ca, (q15_t)0xfdc, (q15_t)0xd5d4, (q15_t)0xfd4, (q15_t)0xd5dd, + (q15_t)0xfcc, (q15_t)0xd5e6, (q15_t)0xfc4, (q15_t)0xd5f0, (q15_t)0xfbb, (q15_t)0xd5f9, (q15_t)0xfb3, (q15_t)0xd603, + (q15_t)0xfab, (q15_t)0xd60c, (q15_t)0xfa3, (q15_t)0xd616, (q15_t)0xf9a, (q15_t)0xd61f, (q15_t)0xf92, (q15_t)0xd629, + (q15_t)0xf8a, (q15_t)0xd632, (q15_t)0xf82, (q15_t)0xd63c, (q15_t)0xf79, (q15_t)0xd645, (q15_t)0xf71, (q15_t)0xd64f, + (q15_t)0xf69, (q15_t)0xd659, (q15_t)0xf61, (q15_t)0xd662, (q15_t)0xf59, (q15_t)0xd66c, (q15_t)0xf51, (q15_t)0xd675, + (q15_t)0xf48, (q15_t)0xd67f, (q15_t)0xf40, (q15_t)0xd688, (q15_t)0xf38, (q15_t)0xd692, (q15_t)0xf30, (q15_t)0xd69b, + (q15_t)0xf28, (q15_t)0xd6a5, (q15_t)0xf20, (q15_t)0xd6af, (q15_t)0xf18, (q15_t)0xd6b8, (q15_t)0xf10, (q15_t)0xd6c2, + (q15_t)0xf07, (q15_t)0xd6cb, (q15_t)0xeff, (q15_t)0xd6d5, (q15_t)0xef7, (q15_t)0xd6df, (q15_t)0xeef, (q15_t)0xd6e8, + (q15_t)0xee7, (q15_t)0xd6f2, (q15_t)0xedf, (q15_t)0xd6fc, (q15_t)0xed7, (q15_t)0xd705, (q15_t)0xecf, (q15_t)0xd70f, + (q15_t)0xec7, (q15_t)0xd719, (q15_t)0xebf, (q15_t)0xd722, (q15_t)0xeb7, (q15_t)0xd72c, (q15_t)0xeaf, (q15_t)0xd736, + (q15_t)0xea7, (q15_t)0xd73f, (q15_t)0xe9f, (q15_t)0xd749, (q15_t)0xe97, (q15_t)0xd753, (q15_t)0xe8f, (q15_t)0xd75c, + (q15_t)0xe87, (q15_t)0xd766, (q15_t)0xe7f, (q15_t)0xd770, (q15_t)0xe77, (q15_t)0xd77a, (q15_t)0xe6f, (q15_t)0xd783, + (q15_t)0xe67, (q15_t)0xd78d, (q15_t)0xe5f, (q15_t)0xd797, (q15_t)0xe57, (q15_t)0xd7a0, (q15_t)0xe4f, (q15_t)0xd7aa, + (q15_t)0xe47, (q15_t)0xd7b4, (q15_t)0xe40, (q15_t)0xd7be, (q15_t)0xe38, (q15_t)0xd7c8, (q15_t)0xe30, (q15_t)0xd7d1, + (q15_t)0xe28, (q15_t)0xd7db, (q15_t)0xe20, (q15_t)0xd7e5, (q15_t)0xe18, (q15_t)0xd7ef, (q15_t)0xe10, (q15_t)0xd7f8, + (q15_t)0xe08, (q15_t)0xd802, (q15_t)0xe01, (q15_t)0xd80c, (q15_t)0xdf9, (q15_t)0xd816, (q15_t)0xdf1, (q15_t)0xd820, + (q15_t)0xde9, (q15_t)0xd82a, (q15_t)0xde1, (q15_t)0xd833, (q15_t)0xdd9, (q15_t)0xd83d, (q15_t)0xdd2, (q15_t)0xd847, + (q15_t)0xdca, (q15_t)0xd851, (q15_t)0xdc2, (q15_t)0xd85b, (q15_t)0xdba, (q15_t)0xd865, (q15_t)0xdb2, (q15_t)0xd86f, + (q15_t)0xdab, (q15_t)0xd878, (q15_t)0xda3, (q15_t)0xd882, (q15_t)0xd9b, (q15_t)0xd88c, (q15_t)0xd93, (q15_t)0xd896, + (q15_t)0xd8c, (q15_t)0xd8a0, (q15_t)0xd84, (q15_t)0xd8aa, (q15_t)0xd7c, (q15_t)0xd8b4, (q15_t)0xd75, (q15_t)0xd8be, + (q15_t)0xd6d, (q15_t)0xd8c8, (q15_t)0xd65, (q15_t)0xd8d2, (q15_t)0xd5d, (q15_t)0xd8dc, (q15_t)0xd56, (q15_t)0xd8e6, + (q15_t)0xd4e, (q15_t)0xd8ef, (q15_t)0xd46, (q15_t)0xd8f9, (q15_t)0xd3f, (q15_t)0xd903, (q15_t)0xd37, (q15_t)0xd90d, + (q15_t)0xd30, (q15_t)0xd917, (q15_t)0xd28, (q15_t)0xd921, (q15_t)0xd20, (q15_t)0xd92b, (q15_t)0xd19, (q15_t)0xd935, + (q15_t)0xd11, (q15_t)0xd93f, (q15_t)0xd09, (q15_t)0xd949, (q15_t)0xd02, (q15_t)0xd953, (q15_t)0xcfa, (q15_t)0xd95d, + (q15_t)0xcf3, (q15_t)0xd967, (q15_t)0xceb, (q15_t)0xd971, (q15_t)0xce3, (q15_t)0xd97b, (q15_t)0xcdc, (q15_t)0xd985, + (q15_t)0xcd4, (q15_t)0xd98f, (q15_t)0xccd, (q15_t)0xd99a, (q15_t)0xcc5, (q15_t)0xd9a4, (q15_t)0xcbe, (q15_t)0xd9ae, + (q15_t)0xcb6, (q15_t)0xd9b8, (q15_t)0xcaf, (q15_t)0xd9c2, (q15_t)0xca7, (q15_t)0xd9cc, (q15_t)0xca0, (q15_t)0xd9d6, + (q15_t)0xc98, (q15_t)0xd9e0, (q15_t)0xc91, (q15_t)0xd9ea, (q15_t)0xc89, (q15_t)0xd9f4, (q15_t)0xc82, (q15_t)0xd9fe, + (q15_t)0xc7a, (q15_t)0xda08, (q15_t)0xc73, (q15_t)0xda13, (q15_t)0xc6b, (q15_t)0xda1d, (q15_t)0xc64, (q15_t)0xda27, + (q15_t)0xc5d, (q15_t)0xda31, (q15_t)0xc55, (q15_t)0xda3b, (q15_t)0xc4e, (q15_t)0xda45, (q15_t)0xc46, (q15_t)0xda4f, + (q15_t)0xc3f, (q15_t)0xda5a, (q15_t)0xc38, (q15_t)0xda64, (q15_t)0xc30, (q15_t)0xda6e, (q15_t)0xc29, (q15_t)0xda78, + (q15_t)0xc21, (q15_t)0xda82, (q15_t)0xc1a, (q15_t)0xda8c, (q15_t)0xc13, (q15_t)0xda97, (q15_t)0xc0b, (q15_t)0xdaa1, + (q15_t)0xc04, (q15_t)0xdaab, (q15_t)0xbfd, (q15_t)0xdab5, (q15_t)0xbf5, (q15_t)0xdabf, (q15_t)0xbee, (q15_t)0xdaca, + (q15_t)0xbe7, (q15_t)0xdad4, (q15_t)0xbe0, (q15_t)0xdade, (q15_t)0xbd8, (q15_t)0xdae8, (q15_t)0xbd1, (q15_t)0xdaf3, + (q15_t)0xbca, (q15_t)0xdafd, (q15_t)0xbc2, (q15_t)0xdb07, (q15_t)0xbbb, (q15_t)0xdb11, (q15_t)0xbb4, (q15_t)0xdb1c, + (q15_t)0xbad, (q15_t)0xdb26, (q15_t)0xba5, (q15_t)0xdb30, (q15_t)0xb9e, (q15_t)0xdb3b, (q15_t)0xb97, (q15_t)0xdb45, + (q15_t)0xb90, (q15_t)0xdb4f, (q15_t)0xb89, (q15_t)0xdb59, (q15_t)0xb81, (q15_t)0xdb64, (q15_t)0xb7a, (q15_t)0xdb6e, + (q15_t)0xb73, (q15_t)0xdb78, (q15_t)0xb6c, (q15_t)0xdb83, (q15_t)0xb65, (q15_t)0xdb8d, (q15_t)0xb5e, (q15_t)0xdb97, + (q15_t)0xb56, (q15_t)0xdba2, (q15_t)0xb4f, (q15_t)0xdbac, (q15_t)0xb48, (q15_t)0xdbb6, (q15_t)0xb41, (q15_t)0xdbc1, + (q15_t)0xb3a, (q15_t)0xdbcb, (q15_t)0xb33, (q15_t)0xdbd5, (q15_t)0xb2c, (q15_t)0xdbe0, (q15_t)0xb25, (q15_t)0xdbea, + (q15_t)0xb1e, (q15_t)0xdbf5, (q15_t)0xb16, (q15_t)0xdbff, (q15_t)0xb0f, (q15_t)0xdc09, (q15_t)0xb08, (q15_t)0xdc14, + (q15_t)0xb01, (q15_t)0xdc1e, (q15_t)0xafa, (q15_t)0xdc29, (q15_t)0xaf3, (q15_t)0xdc33, (q15_t)0xaec, (q15_t)0xdc3d, + (q15_t)0xae5, (q15_t)0xdc48, (q15_t)0xade, (q15_t)0xdc52, (q15_t)0xad7, (q15_t)0xdc5d, (q15_t)0xad0, (q15_t)0xdc67, + (q15_t)0xac9, (q15_t)0xdc72, (q15_t)0xac2, (q15_t)0xdc7c, (q15_t)0xabb, (q15_t)0xdc86, (q15_t)0xab4, (q15_t)0xdc91, + (q15_t)0xaad, (q15_t)0xdc9b, (q15_t)0xaa6, (q15_t)0xdca6, (q15_t)0xa9f, (q15_t)0xdcb0, (q15_t)0xa99, (q15_t)0xdcbb, + (q15_t)0xa92, (q15_t)0xdcc5, (q15_t)0xa8b, (q15_t)0xdcd0, (q15_t)0xa84, (q15_t)0xdcda, (q15_t)0xa7d, (q15_t)0xdce5, + (q15_t)0xa76, (q15_t)0xdcef, (q15_t)0xa6f, (q15_t)0xdcfa, (q15_t)0xa68, (q15_t)0xdd04, (q15_t)0xa61, (q15_t)0xdd0f, + (q15_t)0xa5b, (q15_t)0xdd19, (q15_t)0xa54, (q15_t)0xdd24, (q15_t)0xa4d, (q15_t)0xdd2e, (q15_t)0xa46, (q15_t)0xdd39, + (q15_t)0xa3f, (q15_t)0xdd44, (q15_t)0xa38, (q15_t)0xdd4e, (q15_t)0xa32, (q15_t)0xdd59, (q15_t)0xa2b, (q15_t)0xdd63, + (q15_t)0xa24, (q15_t)0xdd6e, (q15_t)0xa1d, (q15_t)0xdd78, (q15_t)0xa16, (q15_t)0xdd83, (q15_t)0xa10, (q15_t)0xdd8e, + (q15_t)0xa09, (q15_t)0xdd98, (q15_t)0xa02, (q15_t)0xdda3, (q15_t)0x9fb, (q15_t)0xddad, (q15_t)0x9f5, (q15_t)0xddb8, + (q15_t)0x9ee, (q15_t)0xddc3, (q15_t)0x9e7, (q15_t)0xddcd, (q15_t)0x9e0, (q15_t)0xddd8, (q15_t)0x9da, (q15_t)0xdde2, + (q15_t)0x9d3, (q15_t)0xdded, (q15_t)0x9cc, (q15_t)0xddf8, (q15_t)0x9c6, (q15_t)0xde02, (q15_t)0x9bf, (q15_t)0xde0d, + (q15_t)0x9b8, (q15_t)0xde18, (q15_t)0x9b2, (q15_t)0xde22, (q15_t)0x9ab, (q15_t)0xde2d, (q15_t)0x9a4, (q15_t)0xde38, + (q15_t)0x99e, (q15_t)0xde42, (q15_t)0x997, (q15_t)0xde4d, (q15_t)0x991, (q15_t)0xde58, (q15_t)0x98a, (q15_t)0xde62, + (q15_t)0x983, (q15_t)0xde6d, (q15_t)0x97d, (q15_t)0xde78, (q15_t)0x976, (q15_t)0xde83, (q15_t)0x970, (q15_t)0xde8d, + (q15_t)0x969, (q15_t)0xde98, (q15_t)0x963, (q15_t)0xdea3, (q15_t)0x95c, (q15_t)0xdead, (q15_t)0x955, (q15_t)0xdeb8, + (q15_t)0x94f, (q15_t)0xdec3, (q15_t)0x948, (q15_t)0xdece, (q15_t)0x942, (q15_t)0xded8, (q15_t)0x93b, (q15_t)0xdee3, + (q15_t)0x935, (q15_t)0xdeee, (q15_t)0x92e, (q15_t)0xdef9, (q15_t)0x928, (q15_t)0xdf03, (q15_t)0x921, (q15_t)0xdf0e, + (q15_t)0x91b, (q15_t)0xdf19, (q15_t)0x915, (q15_t)0xdf24, (q15_t)0x90e, (q15_t)0xdf2f, (q15_t)0x908, (q15_t)0xdf39, + (q15_t)0x901, (q15_t)0xdf44, (q15_t)0x8fb, (q15_t)0xdf4f, (q15_t)0x8f4, (q15_t)0xdf5a, (q15_t)0x8ee, (q15_t)0xdf65, + (q15_t)0x8e8, (q15_t)0xdf6f, (q15_t)0x8e1, (q15_t)0xdf7a, (q15_t)0x8db, (q15_t)0xdf85, (q15_t)0x8d4, (q15_t)0xdf90, + (q15_t)0x8ce, (q15_t)0xdf9b, (q15_t)0x8c8, (q15_t)0xdfa5, (q15_t)0x8c1, (q15_t)0xdfb0, (q15_t)0x8bb, (q15_t)0xdfbb, + (q15_t)0x8b5, (q15_t)0xdfc6, (q15_t)0x8ae, (q15_t)0xdfd1, (q15_t)0x8a8, (q15_t)0xdfdc, (q15_t)0x8a2, (q15_t)0xdfe7, + (q15_t)0x89b, (q15_t)0xdff1, (q15_t)0x895, (q15_t)0xdffc, (q15_t)0x88f, (q15_t)0xe007, (q15_t)0x889, (q15_t)0xe012, + (q15_t)0x882, (q15_t)0xe01d, (q15_t)0x87c, (q15_t)0xe028, (q15_t)0x876, (q15_t)0xe033, (q15_t)0x870, (q15_t)0xe03e, + (q15_t)0x869, (q15_t)0xe049, (q15_t)0x863, (q15_t)0xe054, (q15_t)0x85d, (q15_t)0xe05e, (q15_t)0x857, (q15_t)0xe069, + (q15_t)0x850, (q15_t)0xe074, (q15_t)0x84a, (q15_t)0xe07f, (q15_t)0x844, (q15_t)0xe08a, (q15_t)0x83e, (q15_t)0xe095, + (q15_t)0x838, (q15_t)0xe0a0, (q15_t)0x832, (q15_t)0xe0ab, (q15_t)0x82b, (q15_t)0xe0b6, (q15_t)0x825, (q15_t)0xe0c1, + (q15_t)0x81f, (q15_t)0xe0cc, (q15_t)0x819, (q15_t)0xe0d7, (q15_t)0x813, (q15_t)0xe0e2, (q15_t)0x80d, (q15_t)0xe0ed, + (q15_t)0x807, (q15_t)0xe0f8, (q15_t)0x801, (q15_t)0xe103, (q15_t)0x7fb, (q15_t)0xe10e, (q15_t)0x7f5, (q15_t)0xe119, + (q15_t)0x7ee, (q15_t)0xe124, (q15_t)0x7e8, (q15_t)0xe12f, (q15_t)0x7e2, (q15_t)0xe13a, (q15_t)0x7dc, (q15_t)0xe145, + (q15_t)0x7d6, (q15_t)0xe150, (q15_t)0x7d0, (q15_t)0xe15b, (q15_t)0x7ca, (q15_t)0xe166, (q15_t)0x7c4, (q15_t)0xe171, + (q15_t)0x7be, (q15_t)0xe17c, (q15_t)0x7b8, (q15_t)0xe187, (q15_t)0x7b2, (q15_t)0xe192, (q15_t)0x7ac, (q15_t)0xe19d, + (q15_t)0x7a6, (q15_t)0xe1a8, (q15_t)0x7a0, (q15_t)0xe1b3, (q15_t)0x79a, (q15_t)0xe1be, (q15_t)0x795, (q15_t)0xe1ca, + (q15_t)0x78f, (q15_t)0xe1d5, (q15_t)0x789, (q15_t)0xe1e0, (q15_t)0x783, (q15_t)0xe1eb, (q15_t)0x77d, (q15_t)0xe1f6, + (q15_t)0x777, (q15_t)0xe201, (q15_t)0x771, (q15_t)0xe20c, (q15_t)0x76b, (q15_t)0xe217, (q15_t)0x765, (q15_t)0xe222, + (q15_t)0x75f, (q15_t)0xe22d, (q15_t)0x75a, (q15_t)0xe239, (q15_t)0x754, (q15_t)0xe244, (q15_t)0x74e, (q15_t)0xe24f, + (q15_t)0x748, (q15_t)0xe25a, (q15_t)0x742, (q15_t)0xe265, (q15_t)0x73d, (q15_t)0xe270, (q15_t)0x737, (q15_t)0xe27b, + (q15_t)0x731, (q15_t)0xe287, (q15_t)0x72b, (q15_t)0xe292, (q15_t)0x725, (q15_t)0xe29d, (q15_t)0x720, (q15_t)0xe2a8, + (q15_t)0x71a, (q15_t)0xe2b3, (q15_t)0x714, (q15_t)0xe2be, (q15_t)0x70e, (q15_t)0xe2ca, (q15_t)0x709, (q15_t)0xe2d5, + (q15_t)0x703, (q15_t)0xe2e0, (q15_t)0x6fd, (q15_t)0xe2eb, (q15_t)0x6f7, (q15_t)0xe2f6, (q15_t)0x6f2, (q15_t)0xe301, + (q15_t)0x6ec, (q15_t)0xe30d, (q15_t)0x6e6, (q15_t)0xe318, (q15_t)0x6e1, (q15_t)0xe323, (q15_t)0x6db, (q15_t)0xe32e, + (q15_t)0x6d5, (q15_t)0xe33a, (q15_t)0x6d0, (q15_t)0xe345, (q15_t)0x6ca, (q15_t)0xe350, (q15_t)0x6c5, (q15_t)0xe35b, + (q15_t)0x6bf, (q15_t)0xe367, (q15_t)0x6b9, (q15_t)0xe372, (q15_t)0x6b4, (q15_t)0xe37d, (q15_t)0x6ae, (q15_t)0xe388, + (q15_t)0x6a8, (q15_t)0xe394, (q15_t)0x6a3, (q15_t)0xe39f, (q15_t)0x69d, (q15_t)0xe3aa, (q15_t)0x698, (q15_t)0xe3b5, + (q15_t)0x692, (q15_t)0xe3c1, (q15_t)0x68d, (q15_t)0xe3cc, (q15_t)0x687, (q15_t)0xe3d7, (q15_t)0x682, (q15_t)0xe3e2, + (q15_t)0x67c, (q15_t)0xe3ee, (q15_t)0x677, (q15_t)0xe3f9, (q15_t)0x671, (q15_t)0xe404, (q15_t)0x66c, (q15_t)0xe410, + (q15_t)0x666, (q15_t)0xe41b, (q15_t)0x661, (q15_t)0xe426, (q15_t)0x65b, (q15_t)0xe432, (q15_t)0x656, (q15_t)0xe43d, + (q15_t)0x650, (q15_t)0xe448, (q15_t)0x64b, (q15_t)0xe454, (q15_t)0x645, (q15_t)0xe45f, (q15_t)0x640, (q15_t)0xe46a, + (q15_t)0x63b, (q15_t)0xe476, (q15_t)0x635, (q15_t)0xe481, (q15_t)0x630, (q15_t)0xe48c, (q15_t)0x62a, (q15_t)0xe498, + (q15_t)0x625, (q15_t)0xe4a3, (q15_t)0x620, (q15_t)0xe4ae, (q15_t)0x61a, (q15_t)0xe4ba, (q15_t)0x615, (q15_t)0xe4c5, + (q15_t)0x610, (q15_t)0xe4d0, (q15_t)0x60a, (q15_t)0xe4dc, (q15_t)0x605, (q15_t)0xe4e7, (q15_t)0x600, (q15_t)0xe4f3, + (q15_t)0x5fa, (q15_t)0xe4fe, (q15_t)0x5f5, (q15_t)0xe509, (q15_t)0x5f0, (q15_t)0xe515, (q15_t)0x5ea, (q15_t)0xe520, + (q15_t)0x5e5, (q15_t)0xe52c, (q15_t)0x5e0, (q15_t)0xe537, (q15_t)0x5db, (q15_t)0xe542, (q15_t)0x5d5, (q15_t)0xe54e, + (q15_t)0x5d0, (q15_t)0xe559, (q15_t)0x5cb, (q15_t)0xe565, (q15_t)0x5c6, (q15_t)0xe570, (q15_t)0x5c1, (q15_t)0xe57c, + (q15_t)0x5bb, (q15_t)0xe587, (q15_t)0x5b6, (q15_t)0xe592, (q15_t)0x5b1, (q15_t)0xe59e, (q15_t)0x5ac, (q15_t)0xe5a9, + (q15_t)0x5a7, (q15_t)0xe5b5, (q15_t)0x5a1, (q15_t)0xe5c0, (q15_t)0x59c, (q15_t)0xe5cc, (q15_t)0x597, (q15_t)0xe5d7, + (q15_t)0x592, (q15_t)0xe5e3, (q15_t)0x58d, (q15_t)0xe5ee, (q15_t)0x588, (q15_t)0xe5fa, (q15_t)0x583, (q15_t)0xe605, + (q15_t)0x57e, (q15_t)0xe611, (q15_t)0x578, (q15_t)0xe61c, (q15_t)0x573, (q15_t)0xe628, (q15_t)0x56e, (q15_t)0xe633, + (q15_t)0x569, (q15_t)0xe63f, (q15_t)0x564, (q15_t)0xe64a, (q15_t)0x55f, (q15_t)0xe656, (q15_t)0x55a, (q15_t)0xe661, + (q15_t)0x555, (q15_t)0xe66d, (q15_t)0x550, (q15_t)0xe678, (q15_t)0x54b, (q15_t)0xe684, (q15_t)0x546, (q15_t)0xe68f, + (q15_t)0x541, (q15_t)0xe69b, (q15_t)0x53c, (q15_t)0xe6a6, (q15_t)0x537, (q15_t)0xe6b2, (q15_t)0x532, (q15_t)0xe6bd, + (q15_t)0x52d, (q15_t)0xe6c9, (q15_t)0x528, (q15_t)0xe6d4, (q15_t)0x523, (q15_t)0xe6e0, (q15_t)0x51e, (q15_t)0xe6ec, + (q15_t)0x51a, (q15_t)0xe6f7, (q15_t)0x515, (q15_t)0xe703, (q15_t)0x510, (q15_t)0xe70e, (q15_t)0x50b, (q15_t)0xe71a, + (q15_t)0x506, (q15_t)0xe725, (q15_t)0x501, (q15_t)0xe731, (q15_t)0x4fc, (q15_t)0xe73d, (q15_t)0x4f7, (q15_t)0xe748, + (q15_t)0x4f2, (q15_t)0xe754, (q15_t)0x4ee, (q15_t)0xe75f, (q15_t)0x4e9, (q15_t)0xe76b, (q15_t)0x4e4, (q15_t)0xe777, + (q15_t)0x4df, (q15_t)0xe782, (q15_t)0x4da, (q15_t)0xe78e, (q15_t)0x4d6, (q15_t)0xe799, (q15_t)0x4d1, (q15_t)0xe7a5, + (q15_t)0x4cc, (q15_t)0xe7b1, (q15_t)0x4c7, (q15_t)0xe7bc, (q15_t)0x4c2, (q15_t)0xe7c8, (q15_t)0x4be, (q15_t)0xe7d3, + (q15_t)0x4b9, (q15_t)0xe7df, (q15_t)0x4b4, (q15_t)0xe7eb, (q15_t)0x4b0, (q15_t)0xe7f6, (q15_t)0x4ab, (q15_t)0xe802, + (q15_t)0x4a6, (q15_t)0xe80e, (q15_t)0x4a1, (q15_t)0xe819, (q15_t)0x49d, (q15_t)0xe825, (q15_t)0x498, (q15_t)0xe831, + (q15_t)0x493, (q15_t)0xe83c, (q15_t)0x48f, (q15_t)0xe848, (q15_t)0x48a, (q15_t)0xe854, (q15_t)0x485, (q15_t)0xe85f, + (q15_t)0x481, (q15_t)0xe86b, (q15_t)0x47c, (q15_t)0xe877, (q15_t)0x478, (q15_t)0xe882, (q15_t)0x473, (q15_t)0xe88e, + (q15_t)0x46e, (q15_t)0xe89a, (q15_t)0x46a, (q15_t)0xe8a5, (q15_t)0x465, (q15_t)0xe8b1, (q15_t)0x461, (q15_t)0xe8bd, + (q15_t)0x45c, (q15_t)0xe8c9, (q15_t)0x457, (q15_t)0xe8d4, (q15_t)0x453, (q15_t)0xe8e0, (q15_t)0x44e, (q15_t)0xe8ec, + (q15_t)0x44a, (q15_t)0xe8f7, (q15_t)0x445, (q15_t)0xe903, (q15_t)0x441, (q15_t)0xe90f, (q15_t)0x43c, (q15_t)0xe91b, + (q15_t)0x438, (q15_t)0xe926, (q15_t)0x433, (q15_t)0xe932, (q15_t)0x42f, (q15_t)0xe93e, (q15_t)0x42a, (q15_t)0xe94a, + (q15_t)0x426, (q15_t)0xe955, (q15_t)0x422, (q15_t)0xe961, (q15_t)0x41d, (q15_t)0xe96d, (q15_t)0x419, (q15_t)0xe979, + (q15_t)0x414, (q15_t)0xe984, (q15_t)0x410, (q15_t)0xe990, (q15_t)0x40b, (q15_t)0xe99c, (q15_t)0x407, (q15_t)0xe9a8, + (q15_t)0x403, (q15_t)0xe9b4, (q15_t)0x3fe, (q15_t)0xe9bf, (q15_t)0x3fa, (q15_t)0xe9cb, (q15_t)0x3f6, (q15_t)0xe9d7, + (q15_t)0x3f1, (q15_t)0xe9e3, (q15_t)0x3ed, (q15_t)0xe9ee, (q15_t)0x3e9, (q15_t)0xe9fa, (q15_t)0x3e4, (q15_t)0xea06, + (q15_t)0x3e0, (q15_t)0xea12, (q15_t)0x3dc, (q15_t)0xea1e, (q15_t)0x3d7, (q15_t)0xea29, (q15_t)0x3d3, (q15_t)0xea35, + (q15_t)0x3cf, (q15_t)0xea41, (q15_t)0x3ca, (q15_t)0xea4d, (q15_t)0x3c6, (q15_t)0xea59, (q15_t)0x3c2, (q15_t)0xea65, + (q15_t)0x3be, (q15_t)0xea70, (q15_t)0x3ba, (q15_t)0xea7c, (q15_t)0x3b5, (q15_t)0xea88, (q15_t)0x3b1, (q15_t)0xea94, + (q15_t)0x3ad, (q15_t)0xeaa0, (q15_t)0x3a9, (q15_t)0xeaac, (q15_t)0x3a5, (q15_t)0xeab7, (q15_t)0x3a0, (q15_t)0xeac3, + (q15_t)0x39c, (q15_t)0xeacf, (q15_t)0x398, (q15_t)0xeadb, (q15_t)0x394, (q15_t)0xeae7, (q15_t)0x390, (q15_t)0xeaf3, + (q15_t)0x38c, (q15_t)0xeaff, (q15_t)0x387, (q15_t)0xeb0a, (q15_t)0x383, (q15_t)0xeb16, (q15_t)0x37f, (q15_t)0xeb22, + (q15_t)0x37b, (q15_t)0xeb2e, (q15_t)0x377, (q15_t)0xeb3a, (q15_t)0x373, (q15_t)0xeb46, (q15_t)0x36f, (q15_t)0xeb52, + (q15_t)0x36b, (q15_t)0xeb5e, (q15_t)0x367, (q15_t)0xeb6a, (q15_t)0x363, (q15_t)0xeb75, (q15_t)0x35f, (q15_t)0xeb81, + (q15_t)0x35b, (q15_t)0xeb8d, (q15_t)0x357, (q15_t)0xeb99, (q15_t)0x353, (q15_t)0xeba5, (q15_t)0x34f, (q15_t)0xebb1, + (q15_t)0x34b, (q15_t)0xebbd, (q15_t)0x347, (q15_t)0xebc9, (q15_t)0x343, (q15_t)0xebd5, (q15_t)0x33f, (q15_t)0xebe1, + (q15_t)0x33b, (q15_t)0xebed, (q15_t)0x337, (q15_t)0xebf9, (q15_t)0x333, (q15_t)0xec05, (q15_t)0x32f, (q15_t)0xec10, + (q15_t)0x32b, (q15_t)0xec1c, (q15_t)0x327, (q15_t)0xec28, (q15_t)0x323, (q15_t)0xec34, (q15_t)0x320, (q15_t)0xec40, + (q15_t)0x31c, (q15_t)0xec4c, (q15_t)0x318, (q15_t)0xec58, (q15_t)0x314, (q15_t)0xec64, (q15_t)0x310, (q15_t)0xec70, + (q15_t)0x30c, (q15_t)0xec7c, (q15_t)0x308, (q15_t)0xec88, (q15_t)0x305, (q15_t)0xec94, (q15_t)0x301, (q15_t)0xeca0, + (q15_t)0x2fd, (q15_t)0xecac, (q15_t)0x2f9, (q15_t)0xecb8, (q15_t)0x2f5, (q15_t)0xecc4, (q15_t)0x2f2, (q15_t)0xecd0, + (q15_t)0x2ee, (q15_t)0xecdc, (q15_t)0x2ea, (q15_t)0xece8, (q15_t)0x2e6, (q15_t)0xecf4, (q15_t)0x2e3, (q15_t)0xed00, + (q15_t)0x2df, (q15_t)0xed0c, (q15_t)0x2db, (q15_t)0xed18, (q15_t)0x2d8, (q15_t)0xed24, (q15_t)0x2d4, (q15_t)0xed30, + (q15_t)0x2d0, (q15_t)0xed3c, (q15_t)0x2cc, (q15_t)0xed48, (q15_t)0x2c9, (q15_t)0xed54, (q15_t)0x2c5, (q15_t)0xed60, + (q15_t)0x2c1, (q15_t)0xed6c, (q15_t)0x2be, (q15_t)0xed78, (q15_t)0x2ba, (q15_t)0xed84, (q15_t)0x2b7, (q15_t)0xed90, + (q15_t)0x2b3, (q15_t)0xed9c, (q15_t)0x2af, (q15_t)0xeda8, (q15_t)0x2ac, (q15_t)0xedb4, (q15_t)0x2a8, (q15_t)0xedc0, + (q15_t)0x2a5, (q15_t)0xedcc, (q15_t)0x2a1, (q15_t)0xedd8, (q15_t)0x29d, (q15_t)0xede4, (q15_t)0x29a, (q15_t)0xedf0, + (q15_t)0x296, (q15_t)0xedfc, (q15_t)0x293, (q15_t)0xee09, (q15_t)0x28f, (q15_t)0xee15, (q15_t)0x28c, (q15_t)0xee21, + (q15_t)0x288, (q15_t)0xee2d, (q15_t)0x285, (q15_t)0xee39, (q15_t)0x281, (q15_t)0xee45, (q15_t)0x27e, (q15_t)0xee51, + (q15_t)0x27a, (q15_t)0xee5d, (q15_t)0x277, (q15_t)0xee69, (q15_t)0x273, (q15_t)0xee75, (q15_t)0x270, (q15_t)0xee81, + (q15_t)0x26d, (q15_t)0xee8d, (q15_t)0x269, (q15_t)0xee99, (q15_t)0x266, (q15_t)0xeea6, (q15_t)0x262, (q15_t)0xeeb2, + (q15_t)0x25f, (q15_t)0xeebe, (q15_t)0x25c, (q15_t)0xeeca, (q15_t)0x258, (q15_t)0xeed6, (q15_t)0x255, (q15_t)0xeee2, + (q15_t)0x251, (q15_t)0xeeee, (q15_t)0x24e, (q15_t)0xeefa, (q15_t)0x24b, (q15_t)0xef06, (q15_t)0x247, (q15_t)0xef13, + (q15_t)0x244, (q15_t)0xef1f, (q15_t)0x241, (q15_t)0xef2b, (q15_t)0x23e, (q15_t)0xef37, (q15_t)0x23a, (q15_t)0xef43, + (q15_t)0x237, (q15_t)0xef4f, (q15_t)0x234, (q15_t)0xef5b, (q15_t)0x230, (q15_t)0xef67, (q15_t)0x22d, (q15_t)0xef74, + (q15_t)0x22a, (q15_t)0xef80, (q15_t)0x227, (q15_t)0xef8c, (q15_t)0x223, (q15_t)0xef98, (q15_t)0x220, (q15_t)0xefa4, + (q15_t)0x21d, (q15_t)0xefb0, (q15_t)0x21a, (q15_t)0xefbc, (q15_t)0x217, (q15_t)0xefc9, (q15_t)0x213, (q15_t)0xefd5, + (q15_t)0x210, (q15_t)0xefe1, (q15_t)0x20d, (q15_t)0xefed, (q15_t)0x20a, (q15_t)0xeff9, (q15_t)0x207, (q15_t)0xf005, + (q15_t)0x204, (q15_t)0xf012, (q15_t)0x201, (q15_t)0xf01e, (q15_t)0x1fd, (q15_t)0xf02a, (q15_t)0x1fa, (q15_t)0xf036, + (q15_t)0x1f7, (q15_t)0xf042, (q15_t)0x1f4, (q15_t)0xf04e, (q15_t)0x1f1, (q15_t)0xf05b, (q15_t)0x1ee, (q15_t)0xf067, + (q15_t)0x1eb, (q15_t)0xf073, (q15_t)0x1e8, (q15_t)0xf07f, (q15_t)0x1e5, (q15_t)0xf08b, (q15_t)0x1e2, (q15_t)0xf098, + (q15_t)0x1df, (q15_t)0xf0a4, (q15_t)0x1dc, (q15_t)0xf0b0, (q15_t)0x1d9, (q15_t)0xf0bc, (q15_t)0x1d6, (q15_t)0xf0c8, + (q15_t)0x1d3, (q15_t)0xf0d5, (q15_t)0x1d0, (q15_t)0xf0e1, (q15_t)0x1cd, (q15_t)0xf0ed, (q15_t)0x1ca, (q15_t)0xf0f9, + (q15_t)0x1c7, (q15_t)0xf105, (q15_t)0x1c4, (q15_t)0xf112, (q15_t)0x1c1, (q15_t)0xf11e, (q15_t)0x1be, (q15_t)0xf12a, + (q15_t)0x1bb, (q15_t)0xf136, (q15_t)0x1b8, (q15_t)0xf143, (q15_t)0x1b6, (q15_t)0xf14f, (q15_t)0x1b3, (q15_t)0xf15b, + (q15_t)0x1b0, (q15_t)0xf167, (q15_t)0x1ad, (q15_t)0xf174, (q15_t)0x1aa, (q15_t)0xf180, (q15_t)0x1a7, (q15_t)0xf18c, + (q15_t)0x1a4, (q15_t)0xf198, (q15_t)0x1a2, (q15_t)0xf1a4, (q15_t)0x19f, (q15_t)0xf1b1, (q15_t)0x19c, (q15_t)0xf1bd, + (q15_t)0x199, (q15_t)0xf1c9, (q15_t)0x196, (q15_t)0xf1d5, (q15_t)0x194, (q15_t)0xf1e2, (q15_t)0x191, (q15_t)0xf1ee, + (q15_t)0x18e, (q15_t)0xf1fa, (q15_t)0x18b, (q15_t)0xf207, (q15_t)0x189, (q15_t)0xf213, (q15_t)0x186, (q15_t)0xf21f, + (q15_t)0x183, (q15_t)0xf22b, (q15_t)0x180, (q15_t)0xf238, (q15_t)0x17e, (q15_t)0xf244, (q15_t)0x17b, (q15_t)0xf250, + (q15_t)0x178, (q15_t)0xf25c, (q15_t)0x176, (q15_t)0xf269, (q15_t)0x173, (q15_t)0xf275, (q15_t)0x170, (q15_t)0xf281, + (q15_t)0x16e, (q15_t)0xf28e, (q15_t)0x16b, (q15_t)0xf29a, (q15_t)0x168, (q15_t)0xf2a6, (q15_t)0x166, (q15_t)0xf2b2, + (q15_t)0x163, (q15_t)0xf2bf, (q15_t)0x161, (q15_t)0xf2cb, (q15_t)0x15e, (q15_t)0xf2d7, (q15_t)0x15b, (q15_t)0xf2e4, + (q15_t)0x159, (q15_t)0xf2f0, (q15_t)0x156, (q15_t)0xf2fc, (q15_t)0x154, (q15_t)0xf308, (q15_t)0x151, (q15_t)0xf315, + (q15_t)0x14f, (q15_t)0xf321, (q15_t)0x14c, (q15_t)0xf32d, (q15_t)0x14a, (q15_t)0xf33a, (q15_t)0x147, (q15_t)0xf346, + (q15_t)0x145, (q15_t)0xf352, (q15_t)0x142, (q15_t)0xf35f, (q15_t)0x140, (q15_t)0xf36b, (q15_t)0x13d, (q15_t)0xf377, + (q15_t)0x13b, (q15_t)0xf384, (q15_t)0x138, (q15_t)0xf390, (q15_t)0x136, (q15_t)0xf39c, (q15_t)0x134, (q15_t)0xf3a9, + (q15_t)0x131, (q15_t)0xf3b5, (q15_t)0x12f, (q15_t)0xf3c1, (q15_t)0x12c, (q15_t)0xf3ce, (q15_t)0x12a, (q15_t)0xf3da, + (q15_t)0x128, (q15_t)0xf3e6, (q15_t)0x125, (q15_t)0xf3f3, (q15_t)0x123, (q15_t)0xf3ff, (q15_t)0x120, (q15_t)0xf40b, + (q15_t)0x11e, (q15_t)0xf418, (q15_t)0x11c, (q15_t)0xf424, (q15_t)0x119, (q15_t)0xf430, (q15_t)0x117, (q15_t)0xf43d, + (q15_t)0x115, (q15_t)0xf449, (q15_t)0x113, (q15_t)0xf455, (q15_t)0x110, (q15_t)0xf462, (q15_t)0x10e, (q15_t)0xf46e, + (q15_t)0x10c, (q15_t)0xf47b, (q15_t)0x109, (q15_t)0xf487, (q15_t)0x107, (q15_t)0xf493, (q15_t)0x105, (q15_t)0xf4a0, + (q15_t)0x103, (q15_t)0xf4ac, (q15_t)0x100, (q15_t)0xf4b8, (q15_t)0xfe, (q15_t)0xf4c5, (q15_t)0xfc, (q15_t)0xf4d1, + (q15_t)0xfa, (q15_t)0xf4dd, (q15_t)0xf8, (q15_t)0xf4ea, (q15_t)0xf6, (q15_t)0xf4f6, (q15_t)0xf3, (q15_t)0xf503, + (q15_t)0xf1, (q15_t)0xf50f, (q15_t)0xef, (q15_t)0xf51b, (q15_t)0xed, (q15_t)0xf528, (q15_t)0xeb, (q15_t)0xf534, + (q15_t)0xe9, (q15_t)0xf540, (q15_t)0xe7, (q15_t)0xf54d, (q15_t)0xe4, (q15_t)0xf559, (q15_t)0xe2, (q15_t)0xf566, + (q15_t)0xe0, (q15_t)0xf572, (q15_t)0xde, (q15_t)0xf57e, (q15_t)0xdc, (q15_t)0xf58b, (q15_t)0xda, (q15_t)0xf597, + (q15_t)0xd8, (q15_t)0xf5a4, (q15_t)0xd6, (q15_t)0xf5b0, (q15_t)0xd4, (q15_t)0xf5bc, (q15_t)0xd2, (q15_t)0xf5c9, + (q15_t)0xd0, (q15_t)0xf5d5, (q15_t)0xce, (q15_t)0xf5e2, (q15_t)0xcc, (q15_t)0xf5ee, (q15_t)0xca, (q15_t)0xf5fa, + (q15_t)0xc8, (q15_t)0xf607, (q15_t)0xc6, (q15_t)0xf613, (q15_t)0xc4, (q15_t)0xf620, (q15_t)0xc2, (q15_t)0xf62c, + (q15_t)0xc0, (q15_t)0xf639, (q15_t)0xbe, (q15_t)0xf645, (q15_t)0xbd, (q15_t)0xf651, (q15_t)0xbb, (q15_t)0xf65e, + (q15_t)0xb9, (q15_t)0xf66a, (q15_t)0xb7, (q15_t)0xf677, (q15_t)0xb5, (q15_t)0xf683, (q15_t)0xb3, (q15_t)0xf690, + (q15_t)0xb1, (q15_t)0xf69c, (q15_t)0xaf, (q15_t)0xf6a8, (q15_t)0xae, (q15_t)0xf6b5, (q15_t)0xac, (q15_t)0xf6c1, + (q15_t)0xaa, (q15_t)0xf6ce, (q15_t)0xa8, (q15_t)0xf6da, (q15_t)0xa6, (q15_t)0xf6e7, (q15_t)0xa5, (q15_t)0xf6f3, + (q15_t)0xa3, (q15_t)0xf6ff, (q15_t)0xa1, (q15_t)0xf70c, (q15_t)0x9f, (q15_t)0xf718, (q15_t)0x9e, (q15_t)0xf725, + (q15_t)0x9c, (q15_t)0xf731, (q15_t)0x9a, (q15_t)0xf73e, (q15_t)0x98, (q15_t)0xf74a, (q15_t)0x97, (q15_t)0xf757, + (q15_t)0x95, (q15_t)0xf763, (q15_t)0x93, (q15_t)0xf76f, (q15_t)0x92, (q15_t)0xf77c, (q15_t)0x90, (q15_t)0xf788, + (q15_t)0x8e, (q15_t)0xf795, (q15_t)0x8d, (q15_t)0xf7a1, (q15_t)0x8b, (q15_t)0xf7ae, (q15_t)0x89, (q15_t)0xf7ba, + (q15_t)0x88, (q15_t)0xf7c7, (q15_t)0x86, (q15_t)0xf7d3, (q15_t)0x85, (q15_t)0xf7e0, (q15_t)0x83, (q15_t)0xf7ec, + (q15_t)0x81, (q15_t)0xf7f9, (q15_t)0x80, (q15_t)0xf805, (q15_t)0x7e, (q15_t)0xf811, (q15_t)0x7d, (q15_t)0xf81e, + (q15_t)0x7b, (q15_t)0xf82a, (q15_t)0x7a, (q15_t)0xf837, (q15_t)0x78, (q15_t)0xf843, (q15_t)0x77, (q15_t)0xf850, + (q15_t)0x75, (q15_t)0xf85c, (q15_t)0x74, (q15_t)0xf869, (q15_t)0x72, (q15_t)0xf875, (q15_t)0x71, (q15_t)0xf882, + (q15_t)0x6f, (q15_t)0xf88e, (q15_t)0x6e, (q15_t)0xf89b, (q15_t)0x6c, (q15_t)0xf8a7, (q15_t)0x6b, (q15_t)0xf8b4, + (q15_t)0x69, (q15_t)0xf8c0, (q15_t)0x68, (q15_t)0xf8cd, (q15_t)0x67, (q15_t)0xf8d9, (q15_t)0x65, (q15_t)0xf8e6, + (q15_t)0x64, (q15_t)0xf8f2, (q15_t)0x62, (q15_t)0xf8ff, (q15_t)0x61, (q15_t)0xf90b, (q15_t)0x60, (q15_t)0xf918, + (q15_t)0x5e, (q15_t)0xf924, (q15_t)0x5d, (q15_t)0xf931, (q15_t)0x5c, (q15_t)0xf93d, (q15_t)0x5a, (q15_t)0xf94a, + (q15_t)0x59, (q15_t)0xf956, (q15_t)0x58, (q15_t)0xf963, (q15_t)0x56, (q15_t)0xf96f, (q15_t)0x55, (q15_t)0xf97c, + (q15_t)0x54, (q15_t)0xf988, (q15_t)0x53, (q15_t)0xf995, (q15_t)0x51, (q15_t)0xf9a1, (q15_t)0x50, (q15_t)0xf9ae, + (q15_t)0x4f, (q15_t)0xf9ba, (q15_t)0x4e, (q15_t)0xf9c7, (q15_t)0x4c, (q15_t)0xf9d3, (q15_t)0x4b, (q15_t)0xf9e0, + (q15_t)0x4a, (q15_t)0xf9ec, (q15_t)0x49, (q15_t)0xf9f9, (q15_t)0x48, (q15_t)0xfa05, (q15_t)0x47, (q15_t)0xfa12, + (q15_t)0x45, (q15_t)0xfa1e, (q15_t)0x44, (q15_t)0xfa2b, (q15_t)0x43, (q15_t)0xfa37, (q15_t)0x42, (q15_t)0xfa44, + (q15_t)0x41, (q15_t)0xfa50, (q15_t)0x40, (q15_t)0xfa5d, (q15_t)0x3f, (q15_t)0xfa69, (q15_t)0x3d, (q15_t)0xfa76, + (q15_t)0x3c, (q15_t)0xfa82, (q15_t)0x3b, (q15_t)0xfa8f, (q15_t)0x3a, (q15_t)0xfa9b, (q15_t)0x39, (q15_t)0xfaa8, + (q15_t)0x38, (q15_t)0xfab4, (q15_t)0x37, (q15_t)0xfac1, (q15_t)0x36, (q15_t)0xfacd, (q15_t)0x35, (q15_t)0xfada, + (q15_t)0x34, (q15_t)0xfae6, (q15_t)0x33, (q15_t)0xfaf3, (q15_t)0x32, (q15_t)0xfb00, (q15_t)0x31, (q15_t)0xfb0c, + (q15_t)0x30, (q15_t)0xfb19, (q15_t)0x2f, (q15_t)0xfb25, (q15_t)0x2e, (q15_t)0xfb32, (q15_t)0x2d, (q15_t)0xfb3e, + (q15_t)0x2c, (q15_t)0xfb4b, (q15_t)0x2b, (q15_t)0xfb57, (q15_t)0x2b, (q15_t)0xfb64, (q15_t)0x2a, (q15_t)0xfb70, + (q15_t)0x29, (q15_t)0xfb7d, (q15_t)0x28, (q15_t)0xfb89, (q15_t)0x27, (q15_t)0xfb96, (q15_t)0x26, (q15_t)0xfba2, + (q15_t)0x25, (q15_t)0xfbaf, (q15_t)0x24, (q15_t)0xfbbc, (q15_t)0x24, (q15_t)0xfbc8, (q15_t)0x23, (q15_t)0xfbd5, + (q15_t)0x22, (q15_t)0xfbe1, (q15_t)0x21, (q15_t)0xfbee, (q15_t)0x20, (q15_t)0xfbfa, (q15_t)0x20, (q15_t)0xfc07, + (q15_t)0x1f, (q15_t)0xfc13, (q15_t)0x1e, (q15_t)0xfc20, (q15_t)0x1d, (q15_t)0xfc2c, (q15_t)0x1d, (q15_t)0xfc39, + (q15_t)0x1c, (q15_t)0xfc45, (q15_t)0x1b, (q15_t)0xfc52, (q15_t)0x1a, (q15_t)0xfc5f, (q15_t)0x1a, (q15_t)0xfc6b, + (q15_t)0x19, (q15_t)0xfc78, (q15_t)0x18, (q15_t)0xfc84, (q15_t)0x18, (q15_t)0xfc91, (q15_t)0x17, (q15_t)0xfc9d, + (q15_t)0x16, (q15_t)0xfcaa, (q15_t)0x16, (q15_t)0xfcb6, (q15_t)0x15, (q15_t)0xfcc3, (q15_t)0x14, (q15_t)0xfcd0, + (q15_t)0x14, (q15_t)0xfcdc, (q15_t)0x13, (q15_t)0xfce9, (q15_t)0x13, (q15_t)0xfcf5, (q15_t)0x12, (q15_t)0xfd02, + (q15_t)0x11, (q15_t)0xfd0e, (q15_t)0x11, (q15_t)0xfd1b, (q15_t)0x10, (q15_t)0xfd27, (q15_t)0x10, (q15_t)0xfd34, + (q15_t)0xf, (q15_t)0xfd40, (q15_t)0xf, (q15_t)0xfd4d, (q15_t)0xe, (q15_t)0xfd5a, (q15_t)0xe, (q15_t)0xfd66, + (q15_t)0xd, (q15_t)0xfd73, (q15_t)0xd, (q15_t)0xfd7f, (q15_t)0xc, (q15_t)0xfd8c, (q15_t)0xc, (q15_t)0xfd98, + (q15_t)0xb, (q15_t)0xfda5, (q15_t)0xb, (q15_t)0xfdb2, (q15_t)0xa, (q15_t)0xfdbe, (q15_t)0xa, (q15_t)0xfdcb, + (q15_t)0x9, (q15_t)0xfdd7, (q15_t)0x9, (q15_t)0xfde4, (q15_t)0x9, (q15_t)0xfdf0, (q15_t)0x8, (q15_t)0xfdfd, + (q15_t)0x8, (q15_t)0xfe09, (q15_t)0x7, (q15_t)0xfe16, (q15_t)0x7, (q15_t)0xfe23, (q15_t)0x7, (q15_t)0xfe2f, + (q15_t)0x6, (q15_t)0xfe3c, (q15_t)0x6, (q15_t)0xfe48, (q15_t)0x6, (q15_t)0xfe55, (q15_t)0x5, (q15_t)0xfe61, + (q15_t)0x5, (q15_t)0xfe6e, (q15_t)0x5, (q15_t)0xfe7a, (q15_t)0x4, (q15_t)0xfe87, (q15_t)0x4, (q15_t)0xfe94, + (q15_t)0x4, (q15_t)0xfea0, (q15_t)0x4, (q15_t)0xfead, (q15_t)0x3, (q15_t)0xfeb9, (q15_t)0x3, (q15_t)0xfec6, + (q15_t)0x3, (q15_t)0xfed2, (q15_t)0x3, (q15_t)0xfedf, (q15_t)0x2, (q15_t)0xfeec, (q15_t)0x2, (q15_t)0xfef8, + (q15_t)0x2, (q15_t)0xff05, (q15_t)0x2, (q15_t)0xff11, (q15_t)0x2, (q15_t)0xff1e, (q15_t)0x1, (q15_t)0xff2a, + (q15_t)0x1, (q15_t)0xff37, (q15_t)0x1, (q15_t)0xff44, (q15_t)0x1, (q15_t)0xff50, (q15_t)0x1, (q15_t)0xff5d, + (q15_t)0x1, (q15_t)0xff69, (q15_t)0x1, (q15_t)0xff76, (q15_t)0x0, (q15_t)0xff82, (q15_t)0x0, (q15_t)0xff8f, + (q15_t)0x0, (q15_t)0xff9b, (q15_t)0x0, (q15_t)0xffa8, (q15_t)0x0, (q15_t)0xffb5, (q15_t)0x0, (q15_t)0xffc1, + (q15_t)0x0, (q15_t)0xffce, (q15_t)0x0, (q15_t)0xffda, (q15_t)0x0, (q15_t)0xffe7, (q15_t)0x0, (q15_t)0xfff3, + (q15_t)0x0, (q15_t)0x0, (q15_t)0x0, (q15_t)0xd, (q15_t)0x0, (q15_t)0x19, (q15_t)0x0, (q15_t)0x26, + (q15_t)0x0, (q15_t)0x32, (q15_t)0x0, (q15_t)0x3f, (q15_t)0x0, (q15_t)0x4b, (q15_t)0x0, (q15_t)0x58, + (q15_t)0x0, (q15_t)0x65, (q15_t)0x0, (q15_t)0x71, (q15_t)0x0, (q15_t)0x7e, (q15_t)0x1, (q15_t)0x8a, + (q15_t)0x1, (q15_t)0x97, (q15_t)0x1, (q15_t)0xa3, (q15_t)0x1, (q15_t)0xb0, (q15_t)0x1, (q15_t)0xbc, + (q15_t)0x1, (q15_t)0xc9, (q15_t)0x1, (q15_t)0xd6, (q15_t)0x2, (q15_t)0xe2, (q15_t)0x2, (q15_t)0xef, + (q15_t)0x2, (q15_t)0xfb, (q15_t)0x2, (q15_t)0x108, (q15_t)0x2, (q15_t)0x114, (q15_t)0x3, (q15_t)0x121, + (q15_t)0x3, (q15_t)0x12e, (q15_t)0x3, (q15_t)0x13a, (q15_t)0x3, (q15_t)0x147, (q15_t)0x4, (q15_t)0x153, + (q15_t)0x4, (q15_t)0x160, (q15_t)0x4, (q15_t)0x16c, (q15_t)0x4, (q15_t)0x179, (q15_t)0x5, (q15_t)0x186, + (q15_t)0x5, (q15_t)0x192, (q15_t)0x5, (q15_t)0x19f, (q15_t)0x6, (q15_t)0x1ab, (q15_t)0x6, (q15_t)0x1b8, + (q15_t)0x6, (q15_t)0x1c4, (q15_t)0x7, (q15_t)0x1d1, (q15_t)0x7, (q15_t)0x1dd, (q15_t)0x7, (q15_t)0x1ea, + (q15_t)0x8, (q15_t)0x1f7, (q15_t)0x8, (q15_t)0x203, (q15_t)0x9, (q15_t)0x210, (q15_t)0x9, (q15_t)0x21c, + (q15_t)0x9, (q15_t)0x229, (q15_t)0xa, (q15_t)0x235, (q15_t)0xa, (q15_t)0x242, (q15_t)0xb, (q15_t)0x24e, + (q15_t)0xb, (q15_t)0x25b, (q15_t)0xc, (q15_t)0x268, (q15_t)0xc, (q15_t)0x274, (q15_t)0xd, (q15_t)0x281, + (q15_t)0xd, (q15_t)0x28d, (q15_t)0xe, (q15_t)0x29a, (q15_t)0xe, (q15_t)0x2a6, (q15_t)0xf, (q15_t)0x2b3, + (q15_t)0xf, (q15_t)0x2c0, (q15_t)0x10, (q15_t)0x2cc, (q15_t)0x10, (q15_t)0x2d9, (q15_t)0x11, (q15_t)0x2e5, + (q15_t)0x11, (q15_t)0x2f2, (q15_t)0x12, (q15_t)0x2fe, (q15_t)0x13, (q15_t)0x30b, (q15_t)0x13, (q15_t)0x317, + (q15_t)0x14, (q15_t)0x324, (q15_t)0x14, (q15_t)0x330, (q15_t)0x15, (q15_t)0x33d, (q15_t)0x16, (q15_t)0x34a, + (q15_t)0x16, (q15_t)0x356, (q15_t)0x17, (q15_t)0x363, (q15_t)0x18, (q15_t)0x36f, (q15_t)0x18, (q15_t)0x37c, + (q15_t)0x19, (q15_t)0x388, (q15_t)0x1a, (q15_t)0x395, (q15_t)0x1a, (q15_t)0x3a1, (q15_t)0x1b, (q15_t)0x3ae, + (q15_t)0x1c, (q15_t)0x3bb, (q15_t)0x1d, (q15_t)0x3c7, (q15_t)0x1d, (q15_t)0x3d4, (q15_t)0x1e, (q15_t)0x3e0, + (q15_t)0x1f, (q15_t)0x3ed, (q15_t)0x20, (q15_t)0x3f9, (q15_t)0x20, (q15_t)0x406, (q15_t)0x21, (q15_t)0x412, + (q15_t)0x22, (q15_t)0x41f, (q15_t)0x23, (q15_t)0x42b, (q15_t)0x24, (q15_t)0x438, (q15_t)0x24, (q15_t)0x444, + (q15_t)0x25, (q15_t)0x451, (q15_t)0x26, (q15_t)0x45e, (q15_t)0x27, (q15_t)0x46a, (q15_t)0x28, (q15_t)0x477, + (q15_t)0x29, (q15_t)0x483, (q15_t)0x2a, (q15_t)0x490, (q15_t)0x2b, (q15_t)0x49c, (q15_t)0x2b, (q15_t)0x4a9, + (q15_t)0x2c, (q15_t)0x4b5, (q15_t)0x2d, (q15_t)0x4c2, (q15_t)0x2e, (q15_t)0x4ce, (q15_t)0x2f, (q15_t)0x4db, + (q15_t)0x30, (q15_t)0x4e7, (q15_t)0x31, (q15_t)0x4f4, (q15_t)0x32, (q15_t)0x500, (q15_t)0x33, (q15_t)0x50d, + (q15_t)0x34, (q15_t)0x51a, (q15_t)0x35, (q15_t)0x526, (q15_t)0x36, (q15_t)0x533, (q15_t)0x37, (q15_t)0x53f, + (q15_t)0x38, (q15_t)0x54c, (q15_t)0x39, (q15_t)0x558, (q15_t)0x3a, (q15_t)0x565, (q15_t)0x3b, (q15_t)0x571, + (q15_t)0x3c, (q15_t)0x57e, (q15_t)0x3d, (q15_t)0x58a, (q15_t)0x3f, (q15_t)0x597, (q15_t)0x40, (q15_t)0x5a3, + (q15_t)0x41, (q15_t)0x5b0, (q15_t)0x42, (q15_t)0x5bc, (q15_t)0x43, (q15_t)0x5c9, (q15_t)0x44, (q15_t)0x5d5, + (q15_t)0x45, (q15_t)0x5e2, (q15_t)0x47, (q15_t)0x5ee, (q15_t)0x48, (q15_t)0x5fb, (q15_t)0x49, (q15_t)0x607, + (q15_t)0x4a, (q15_t)0x614, (q15_t)0x4b, (q15_t)0x620, (q15_t)0x4c, (q15_t)0x62d, (q15_t)0x4e, (q15_t)0x639, + (q15_t)0x4f, (q15_t)0x646, (q15_t)0x50, (q15_t)0x652, (q15_t)0x51, (q15_t)0x65f, (q15_t)0x53, (q15_t)0x66b, + (q15_t)0x54, (q15_t)0x678, (q15_t)0x55, (q15_t)0x684, (q15_t)0x56, (q15_t)0x691, (q15_t)0x58, (q15_t)0x69d, + (q15_t)0x59, (q15_t)0x6aa, (q15_t)0x5a, (q15_t)0x6b6, (q15_t)0x5c, (q15_t)0x6c3, (q15_t)0x5d, (q15_t)0x6cf, + (q15_t)0x5e, (q15_t)0x6dc, (q15_t)0x60, (q15_t)0x6e8, (q15_t)0x61, (q15_t)0x6f5, (q15_t)0x62, (q15_t)0x701, + (q15_t)0x64, (q15_t)0x70e, (q15_t)0x65, (q15_t)0x71a, (q15_t)0x67, (q15_t)0x727, (q15_t)0x68, (q15_t)0x733, + (q15_t)0x69, (q15_t)0x740, (q15_t)0x6b, (q15_t)0x74c, (q15_t)0x6c, (q15_t)0x759, (q15_t)0x6e, (q15_t)0x765, + (q15_t)0x6f, (q15_t)0x772, (q15_t)0x71, (q15_t)0x77e, (q15_t)0x72, (q15_t)0x78b, (q15_t)0x74, (q15_t)0x797, + (q15_t)0x75, (q15_t)0x7a4, (q15_t)0x77, (q15_t)0x7b0, (q15_t)0x78, (q15_t)0x7bd, (q15_t)0x7a, (q15_t)0x7c9, + (q15_t)0x7b, (q15_t)0x7d6, (q15_t)0x7d, (q15_t)0x7e2, (q15_t)0x7e, (q15_t)0x7ef, (q15_t)0x80, (q15_t)0x7fb, + (q15_t)0x81, (q15_t)0x807, (q15_t)0x83, (q15_t)0x814, (q15_t)0x85, (q15_t)0x820, (q15_t)0x86, (q15_t)0x82d, + (q15_t)0x88, (q15_t)0x839, (q15_t)0x89, (q15_t)0x846, (q15_t)0x8b, (q15_t)0x852, (q15_t)0x8d, (q15_t)0x85f, + (q15_t)0x8e, (q15_t)0x86b, (q15_t)0x90, (q15_t)0x878, (q15_t)0x92, (q15_t)0x884, (q15_t)0x93, (q15_t)0x891, + (q15_t)0x95, (q15_t)0x89d, (q15_t)0x97, (q15_t)0x8a9, (q15_t)0x98, (q15_t)0x8b6, (q15_t)0x9a, (q15_t)0x8c2, + (q15_t)0x9c, (q15_t)0x8cf, (q15_t)0x9e, (q15_t)0x8db, (q15_t)0x9f, (q15_t)0x8e8, (q15_t)0xa1, (q15_t)0x8f4, + (q15_t)0xa3, (q15_t)0x901, (q15_t)0xa5, (q15_t)0x90d, (q15_t)0xa6, (q15_t)0x919, (q15_t)0xa8, (q15_t)0x926, + (q15_t)0xaa, (q15_t)0x932, (q15_t)0xac, (q15_t)0x93f, (q15_t)0xae, (q15_t)0x94b, (q15_t)0xaf, (q15_t)0x958, + (q15_t)0xb1, (q15_t)0x964, (q15_t)0xb3, (q15_t)0x970, (q15_t)0xb5, (q15_t)0x97d, (q15_t)0xb7, (q15_t)0x989, + (q15_t)0xb9, (q15_t)0x996, (q15_t)0xbb, (q15_t)0x9a2, (q15_t)0xbd, (q15_t)0x9af, (q15_t)0xbe, (q15_t)0x9bb, + (q15_t)0xc0, (q15_t)0x9c7, (q15_t)0xc2, (q15_t)0x9d4, (q15_t)0xc4, (q15_t)0x9e0, (q15_t)0xc6, (q15_t)0x9ed, + (q15_t)0xc8, (q15_t)0x9f9, (q15_t)0xca, (q15_t)0xa06, (q15_t)0xcc, (q15_t)0xa12, (q15_t)0xce, (q15_t)0xa1e, + (q15_t)0xd0, (q15_t)0xa2b, (q15_t)0xd2, (q15_t)0xa37, (q15_t)0xd4, (q15_t)0xa44, (q15_t)0xd6, (q15_t)0xa50, + (q15_t)0xd8, (q15_t)0xa5c, (q15_t)0xda, (q15_t)0xa69, (q15_t)0xdc, (q15_t)0xa75, (q15_t)0xde, (q15_t)0xa82, + (q15_t)0xe0, (q15_t)0xa8e, (q15_t)0xe2, (q15_t)0xa9a, (q15_t)0xe4, (q15_t)0xaa7, (q15_t)0xe7, (q15_t)0xab3, + (q15_t)0xe9, (q15_t)0xac0, (q15_t)0xeb, (q15_t)0xacc, (q15_t)0xed, (q15_t)0xad8, (q15_t)0xef, (q15_t)0xae5, + (q15_t)0xf1, (q15_t)0xaf1, (q15_t)0xf3, (q15_t)0xafd, (q15_t)0xf6, (q15_t)0xb0a, (q15_t)0xf8, (q15_t)0xb16, + (q15_t)0xfa, (q15_t)0xb23, (q15_t)0xfc, (q15_t)0xb2f, (q15_t)0xfe, (q15_t)0xb3b, (q15_t)0x100, (q15_t)0xb48, + (q15_t)0x103, (q15_t)0xb54, (q15_t)0x105, (q15_t)0xb60, (q15_t)0x107, (q15_t)0xb6d, (q15_t)0x109, (q15_t)0xb79, + (q15_t)0x10c, (q15_t)0xb85, (q15_t)0x10e, (q15_t)0xb92, (q15_t)0x110, (q15_t)0xb9e, (q15_t)0x113, (q15_t)0xbab, + (q15_t)0x115, (q15_t)0xbb7, (q15_t)0x117, (q15_t)0xbc3, (q15_t)0x119, (q15_t)0xbd0, (q15_t)0x11c, (q15_t)0xbdc, + (q15_t)0x11e, (q15_t)0xbe8, (q15_t)0x120, (q15_t)0xbf5, (q15_t)0x123, (q15_t)0xc01, (q15_t)0x125, (q15_t)0xc0d, + (q15_t)0x128, (q15_t)0xc1a, (q15_t)0x12a, (q15_t)0xc26, (q15_t)0x12c, (q15_t)0xc32, (q15_t)0x12f, (q15_t)0xc3f, + (q15_t)0x131, (q15_t)0xc4b, (q15_t)0x134, (q15_t)0xc57, (q15_t)0x136, (q15_t)0xc64, (q15_t)0x138, (q15_t)0xc70, + (q15_t)0x13b, (q15_t)0xc7c, (q15_t)0x13d, (q15_t)0xc89, (q15_t)0x140, (q15_t)0xc95, (q15_t)0x142, (q15_t)0xca1, + (q15_t)0x145, (q15_t)0xcae, (q15_t)0x147, (q15_t)0xcba, (q15_t)0x14a, (q15_t)0xcc6, (q15_t)0x14c, (q15_t)0xcd3, + (q15_t)0x14f, (q15_t)0xcdf, (q15_t)0x151, (q15_t)0xceb, (q15_t)0x154, (q15_t)0xcf8, (q15_t)0x156, (q15_t)0xd04, + (q15_t)0x159, (q15_t)0xd10, (q15_t)0x15b, (q15_t)0xd1c, (q15_t)0x15e, (q15_t)0xd29, (q15_t)0x161, (q15_t)0xd35, + (q15_t)0x163, (q15_t)0xd41, (q15_t)0x166, (q15_t)0xd4e, (q15_t)0x168, (q15_t)0xd5a, (q15_t)0x16b, (q15_t)0xd66, + (q15_t)0x16e, (q15_t)0xd72, (q15_t)0x170, (q15_t)0xd7f, (q15_t)0x173, (q15_t)0xd8b, (q15_t)0x176, (q15_t)0xd97, + (q15_t)0x178, (q15_t)0xda4, (q15_t)0x17b, (q15_t)0xdb0, (q15_t)0x17e, (q15_t)0xdbc, (q15_t)0x180, (q15_t)0xdc8, + (q15_t)0x183, (q15_t)0xdd5, (q15_t)0x186, (q15_t)0xde1, (q15_t)0x189, (q15_t)0xded, (q15_t)0x18b, (q15_t)0xdf9, + (q15_t)0x18e, (q15_t)0xe06, (q15_t)0x191, (q15_t)0xe12, (q15_t)0x194, (q15_t)0xe1e, (q15_t)0x196, (q15_t)0xe2b, + (q15_t)0x199, (q15_t)0xe37, (q15_t)0x19c, (q15_t)0xe43, (q15_t)0x19f, (q15_t)0xe4f, (q15_t)0x1a2, (q15_t)0xe5c, + (q15_t)0x1a4, (q15_t)0xe68, (q15_t)0x1a7, (q15_t)0xe74, (q15_t)0x1aa, (q15_t)0xe80, (q15_t)0x1ad, (q15_t)0xe8c, + (q15_t)0x1b0, (q15_t)0xe99, (q15_t)0x1b3, (q15_t)0xea5, (q15_t)0x1b6, (q15_t)0xeb1, (q15_t)0x1b8, (q15_t)0xebd, + (q15_t)0x1bb, (q15_t)0xeca, (q15_t)0x1be, (q15_t)0xed6, (q15_t)0x1c1, (q15_t)0xee2, (q15_t)0x1c4, (q15_t)0xeee, + (q15_t)0x1c7, (q15_t)0xefb, (q15_t)0x1ca, (q15_t)0xf07, (q15_t)0x1cd, (q15_t)0xf13, (q15_t)0x1d0, (q15_t)0xf1f, + (q15_t)0x1d3, (q15_t)0xf2b, (q15_t)0x1d6, (q15_t)0xf38, (q15_t)0x1d9, (q15_t)0xf44, (q15_t)0x1dc, (q15_t)0xf50, + (q15_t)0x1df, (q15_t)0xf5c, (q15_t)0x1e2, (q15_t)0xf68, (q15_t)0x1e5, (q15_t)0xf75, (q15_t)0x1e8, (q15_t)0xf81, + (q15_t)0x1eb, (q15_t)0xf8d, (q15_t)0x1ee, (q15_t)0xf99, (q15_t)0x1f1, (q15_t)0xfa5, (q15_t)0x1f4, (q15_t)0xfb2, + (q15_t)0x1f7, (q15_t)0xfbe, (q15_t)0x1fa, (q15_t)0xfca, (q15_t)0x1fd, (q15_t)0xfd6, (q15_t)0x201, (q15_t)0xfe2, + (q15_t)0x204, (q15_t)0xfee, (q15_t)0x207, (q15_t)0xffb, (q15_t)0x20a, (q15_t)0x1007, (q15_t)0x20d, (q15_t)0x1013, + (q15_t)0x210, (q15_t)0x101f, (q15_t)0x213, (q15_t)0x102b, (q15_t)0x217, (q15_t)0x1037, (q15_t)0x21a, (q15_t)0x1044, + (q15_t)0x21d, (q15_t)0x1050, (q15_t)0x220, (q15_t)0x105c, (q15_t)0x223, (q15_t)0x1068, (q15_t)0x227, (q15_t)0x1074, + (q15_t)0x22a, (q15_t)0x1080, (q15_t)0x22d, (q15_t)0x108c, (q15_t)0x230, (q15_t)0x1099, (q15_t)0x234, (q15_t)0x10a5, + (q15_t)0x237, (q15_t)0x10b1, (q15_t)0x23a, (q15_t)0x10bd, (q15_t)0x23e, (q15_t)0x10c9, (q15_t)0x241, (q15_t)0x10d5, + (q15_t)0x244, (q15_t)0x10e1, (q15_t)0x247, (q15_t)0x10ed, (q15_t)0x24b, (q15_t)0x10fa, (q15_t)0x24e, (q15_t)0x1106, + (q15_t)0x251, (q15_t)0x1112, (q15_t)0x255, (q15_t)0x111e, (q15_t)0x258, (q15_t)0x112a, (q15_t)0x25c, (q15_t)0x1136, + (q15_t)0x25f, (q15_t)0x1142, (q15_t)0x262, (q15_t)0x114e, (q15_t)0x266, (q15_t)0x115a, (q15_t)0x269, (q15_t)0x1167, + (q15_t)0x26d, (q15_t)0x1173, (q15_t)0x270, (q15_t)0x117f, (q15_t)0x273, (q15_t)0x118b, (q15_t)0x277, (q15_t)0x1197, + (q15_t)0x27a, (q15_t)0x11a3, (q15_t)0x27e, (q15_t)0x11af, (q15_t)0x281, (q15_t)0x11bb, (q15_t)0x285, (q15_t)0x11c7, + (q15_t)0x288, (q15_t)0x11d3, (q15_t)0x28c, (q15_t)0x11df, (q15_t)0x28f, (q15_t)0x11eb, (q15_t)0x293, (q15_t)0x11f7, + (q15_t)0x296, (q15_t)0x1204, (q15_t)0x29a, (q15_t)0x1210, (q15_t)0x29d, (q15_t)0x121c, (q15_t)0x2a1, (q15_t)0x1228, + (q15_t)0x2a5, (q15_t)0x1234, (q15_t)0x2a8, (q15_t)0x1240, (q15_t)0x2ac, (q15_t)0x124c, (q15_t)0x2af, (q15_t)0x1258, + (q15_t)0x2b3, (q15_t)0x1264, (q15_t)0x2b7, (q15_t)0x1270, (q15_t)0x2ba, (q15_t)0x127c, (q15_t)0x2be, (q15_t)0x1288, + (q15_t)0x2c1, (q15_t)0x1294, (q15_t)0x2c5, (q15_t)0x12a0, (q15_t)0x2c9, (q15_t)0x12ac, (q15_t)0x2cc, (q15_t)0x12b8, + (q15_t)0x2d0, (q15_t)0x12c4, (q15_t)0x2d4, (q15_t)0x12d0, (q15_t)0x2d8, (q15_t)0x12dc, (q15_t)0x2db, (q15_t)0x12e8, + (q15_t)0x2df, (q15_t)0x12f4, (q15_t)0x2e3, (q15_t)0x1300, (q15_t)0x2e6, (q15_t)0x130c, (q15_t)0x2ea, (q15_t)0x1318, + (q15_t)0x2ee, (q15_t)0x1324, (q15_t)0x2f2, (q15_t)0x1330, (q15_t)0x2f5, (q15_t)0x133c, (q15_t)0x2f9, (q15_t)0x1348, + (q15_t)0x2fd, (q15_t)0x1354, (q15_t)0x301, (q15_t)0x1360, (q15_t)0x305, (q15_t)0x136c, (q15_t)0x308, (q15_t)0x1378, + (q15_t)0x30c, (q15_t)0x1384, (q15_t)0x310, (q15_t)0x1390, (q15_t)0x314, (q15_t)0x139c, (q15_t)0x318, (q15_t)0x13a8, + (q15_t)0x31c, (q15_t)0x13b4, (q15_t)0x320, (q15_t)0x13c0, (q15_t)0x323, (q15_t)0x13cc, (q15_t)0x327, (q15_t)0x13d8, + (q15_t)0x32b, (q15_t)0x13e4, (q15_t)0x32f, (q15_t)0x13f0, (q15_t)0x333, (q15_t)0x13fb, (q15_t)0x337, (q15_t)0x1407, + (q15_t)0x33b, (q15_t)0x1413, (q15_t)0x33f, (q15_t)0x141f, (q15_t)0x343, (q15_t)0x142b, (q15_t)0x347, (q15_t)0x1437, + (q15_t)0x34b, (q15_t)0x1443, (q15_t)0x34f, (q15_t)0x144f, (q15_t)0x353, (q15_t)0x145b, (q15_t)0x357, (q15_t)0x1467, + (q15_t)0x35b, (q15_t)0x1473, (q15_t)0x35f, (q15_t)0x147f, (q15_t)0x363, (q15_t)0x148b, (q15_t)0x367, (q15_t)0x1496, + (q15_t)0x36b, (q15_t)0x14a2, (q15_t)0x36f, (q15_t)0x14ae, (q15_t)0x373, (q15_t)0x14ba, (q15_t)0x377, (q15_t)0x14c6, + (q15_t)0x37b, (q15_t)0x14d2, (q15_t)0x37f, (q15_t)0x14de, (q15_t)0x383, (q15_t)0x14ea, (q15_t)0x387, (q15_t)0x14f6, + (q15_t)0x38c, (q15_t)0x1501, (q15_t)0x390, (q15_t)0x150d, (q15_t)0x394, (q15_t)0x1519, (q15_t)0x398, (q15_t)0x1525, + (q15_t)0x39c, (q15_t)0x1531, (q15_t)0x3a0, (q15_t)0x153d, (q15_t)0x3a5, (q15_t)0x1549, (q15_t)0x3a9, (q15_t)0x1554, + (q15_t)0x3ad, (q15_t)0x1560, (q15_t)0x3b1, (q15_t)0x156c, (q15_t)0x3b5, (q15_t)0x1578, (q15_t)0x3ba, (q15_t)0x1584, + (q15_t)0x3be, (q15_t)0x1590, (q15_t)0x3c2, (q15_t)0x159b, (q15_t)0x3c6, (q15_t)0x15a7, (q15_t)0x3ca, (q15_t)0x15b3, + (q15_t)0x3cf, (q15_t)0x15bf, (q15_t)0x3d3, (q15_t)0x15cb, (q15_t)0x3d7, (q15_t)0x15d7, (q15_t)0x3dc, (q15_t)0x15e2, + (q15_t)0x3e0, (q15_t)0x15ee, (q15_t)0x3e4, (q15_t)0x15fa, (q15_t)0x3e9, (q15_t)0x1606, (q15_t)0x3ed, (q15_t)0x1612, + (q15_t)0x3f1, (q15_t)0x161d, (q15_t)0x3f6, (q15_t)0x1629, (q15_t)0x3fa, (q15_t)0x1635, (q15_t)0x3fe, (q15_t)0x1641, + (q15_t)0x403, (q15_t)0x164c, (q15_t)0x407, (q15_t)0x1658, (q15_t)0x40b, (q15_t)0x1664, (q15_t)0x410, (q15_t)0x1670, + (q15_t)0x414, (q15_t)0x167c, (q15_t)0x419, (q15_t)0x1687, (q15_t)0x41d, (q15_t)0x1693, (q15_t)0x422, (q15_t)0x169f, + (q15_t)0x426, (q15_t)0x16ab, (q15_t)0x42a, (q15_t)0x16b6, (q15_t)0x42f, (q15_t)0x16c2, (q15_t)0x433, (q15_t)0x16ce, + (q15_t)0x438, (q15_t)0x16da, (q15_t)0x43c, (q15_t)0x16e5, (q15_t)0x441, (q15_t)0x16f1, (q15_t)0x445, (q15_t)0x16fd, + (q15_t)0x44a, (q15_t)0x1709, (q15_t)0x44e, (q15_t)0x1714, (q15_t)0x453, (q15_t)0x1720, (q15_t)0x457, (q15_t)0x172c, + (q15_t)0x45c, (q15_t)0x1737, (q15_t)0x461, (q15_t)0x1743, (q15_t)0x465, (q15_t)0x174f, (q15_t)0x46a, (q15_t)0x175b, + (q15_t)0x46e, (q15_t)0x1766, (q15_t)0x473, (q15_t)0x1772, (q15_t)0x478, (q15_t)0x177e, (q15_t)0x47c, (q15_t)0x1789, + (q15_t)0x481, (q15_t)0x1795, (q15_t)0x485, (q15_t)0x17a1, (q15_t)0x48a, (q15_t)0x17ac, (q15_t)0x48f, (q15_t)0x17b8, + (q15_t)0x493, (q15_t)0x17c4, (q15_t)0x498, (q15_t)0x17cf, (q15_t)0x49d, (q15_t)0x17db, (q15_t)0x4a1, (q15_t)0x17e7, + (q15_t)0x4a6, (q15_t)0x17f2, (q15_t)0x4ab, (q15_t)0x17fe, (q15_t)0x4b0, (q15_t)0x180a, (q15_t)0x4b4, (q15_t)0x1815, + (q15_t)0x4b9, (q15_t)0x1821, (q15_t)0x4be, (q15_t)0x182d, (q15_t)0x4c2, (q15_t)0x1838, (q15_t)0x4c7, (q15_t)0x1844, + (q15_t)0x4cc, (q15_t)0x184f, (q15_t)0x4d1, (q15_t)0x185b, (q15_t)0x4d6, (q15_t)0x1867, (q15_t)0x4da, (q15_t)0x1872, + (q15_t)0x4df, (q15_t)0x187e, (q15_t)0x4e4, (q15_t)0x1889, (q15_t)0x4e9, (q15_t)0x1895, (q15_t)0x4ee, (q15_t)0x18a1, + (q15_t)0x4f2, (q15_t)0x18ac, (q15_t)0x4f7, (q15_t)0x18b8, (q15_t)0x4fc, (q15_t)0x18c3, (q15_t)0x501, (q15_t)0x18cf, + (q15_t)0x506, (q15_t)0x18db, (q15_t)0x50b, (q15_t)0x18e6, (q15_t)0x510, (q15_t)0x18f2, (q15_t)0x515, (q15_t)0x18fd, + (q15_t)0x51a, (q15_t)0x1909, (q15_t)0x51e, (q15_t)0x1914, (q15_t)0x523, (q15_t)0x1920, (q15_t)0x528, (q15_t)0x192c, + (q15_t)0x52d, (q15_t)0x1937, (q15_t)0x532, (q15_t)0x1943, (q15_t)0x537, (q15_t)0x194e, (q15_t)0x53c, (q15_t)0x195a, + (q15_t)0x541, (q15_t)0x1965, (q15_t)0x546, (q15_t)0x1971, (q15_t)0x54b, (q15_t)0x197c, (q15_t)0x550, (q15_t)0x1988, + (q15_t)0x555, (q15_t)0x1993, (q15_t)0x55a, (q15_t)0x199f, (q15_t)0x55f, (q15_t)0x19aa, (q15_t)0x564, (q15_t)0x19b6, + (q15_t)0x569, (q15_t)0x19c1, (q15_t)0x56e, (q15_t)0x19cd, (q15_t)0x573, (q15_t)0x19d8, (q15_t)0x578, (q15_t)0x19e4, + (q15_t)0x57e, (q15_t)0x19ef, (q15_t)0x583, (q15_t)0x19fb, (q15_t)0x588, (q15_t)0x1a06, (q15_t)0x58d, (q15_t)0x1a12, + (q15_t)0x592, (q15_t)0x1a1d, (q15_t)0x597, (q15_t)0x1a29, (q15_t)0x59c, (q15_t)0x1a34, (q15_t)0x5a1, (q15_t)0x1a40, + (q15_t)0x5a7, (q15_t)0x1a4b, (q15_t)0x5ac, (q15_t)0x1a57, (q15_t)0x5b1, (q15_t)0x1a62, (q15_t)0x5b6, (q15_t)0x1a6e, + (q15_t)0x5bb, (q15_t)0x1a79, (q15_t)0x5c1, (q15_t)0x1a84, (q15_t)0x5c6, (q15_t)0x1a90, (q15_t)0x5cb, (q15_t)0x1a9b, + (q15_t)0x5d0, (q15_t)0x1aa7, (q15_t)0x5d5, (q15_t)0x1ab2, (q15_t)0x5db, (q15_t)0x1abe, (q15_t)0x5e0, (q15_t)0x1ac9, + (q15_t)0x5e5, (q15_t)0x1ad4, (q15_t)0x5ea, (q15_t)0x1ae0, (q15_t)0x5f0, (q15_t)0x1aeb, (q15_t)0x5f5, (q15_t)0x1af7, + (q15_t)0x5fa, (q15_t)0x1b02, (q15_t)0x600, (q15_t)0x1b0d, (q15_t)0x605, (q15_t)0x1b19, (q15_t)0x60a, (q15_t)0x1b24, + (q15_t)0x610, (q15_t)0x1b30, (q15_t)0x615, (q15_t)0x1b3b, (q15_t)0x61a, (q15_t)0x1b46, (q15_t)0x620, (q15_t)0x1b52, + (q15_t)0x625, (q15_t)0x1b5d, (q15_t)0x62a, (q15_t)0x1b68, (q15_t)0x630, (q15_t)0x1b74, (q15_t)0x635, (q15_t)0x1b7f, + (q15_t)0x63b, (q15_t)0x1b8a, (q15_t)0x640, (q15_t)0x1b96, (q15_t)0x645, (q15_t)0x1ba1, (q15_t)0x64b, (q15_t)0x1bac, + (q15_t)0x650, (q15_t)0x1bb8, (q15_t)0x656, (q15_t)0x1bc3, (q15_t)0x65b, (q15_t)0x1bce, (q15_t)0x661, (q15_t)0x1bda, + (q15_t)0x666, (q15_t)0x1be5, (q15_t)0x66c, (q15_t)0x1bf0, (q15_t)0x671, (q15_t)0x1bfc, (q15_t)0x677, (q15_t)0x1c07, + (q15_t)0x67c, (q15_t)0x1c12, (q15_t)0x682, (q15_t)0x1c1e, (q15_t)0x687, (q15_t)0x1c29, (q15_t)0x68d, (q15_t)0x1c34, + (q15_t)0x692, (q15_t)0x1c3f, (q15_t)0x698, (q15_t)0x1c4b, (q15_t)0x69d, (q15_t)0x1c56, (q15_t)0x6a3, (q15_t)0x1c61, + (q15_t)0x6a8, (q15_t)0x1c6c, (q15_t)0x6ae, (q15_t)0x1c78, (q15_t)0x6b4, (q15_t)0x1c83, (q15_t)0x6b9, (q15_t)0x1c8e, + (q15_t)0x6bf, (q15_t)0x1c99, (q15_t)0x6c5, (q15_t)0x1ca5, (q15_t)0x6ca, (q15_t)0x1cb0, (q15_t)0x6d0, (q15_t)0x1cbb, + (q15_t)0x6d5, (q15_t)0x1cc6, (q15_t)0x6db, (q15_t)0x1cd2, (q15_t)0x6e1, (q15_t)0x1cdd, (q15_t)0x6e6, (q15_t)0x1ce8, + (q15_t)0x6ec, (q15_t)0x1cf3, (q15_t)0x6f2, (q15_t)0x1cff, (q15_t)0x6f7, (q15_t)0x1d0a, (q15_t)0x6fd, (q15_t)0x1d15, + (q15_t)0x703, (q15_t)0x1d20, (q15_t)0x709, (q15_t)0x1d2b, (q15_t)0x70e, (q15_t)0x1d36, (q15_t)0x714, (q15_t)0x1d42, + (q15_t)0x71a, (q15_t)0x1d4d, (q15_t)0x720, (q15_t)0x1d58, (q15_t)0x725, (q15_t)0x1d63, (q15_t)0x72b, (q15_t)0x1d6e, + (q15_t)0x731, (q15_t)0x1d79, (q15_t)0x737, (q15_t)0x1d85, (q15_t)0x73d, (q15_t)0x1d90, (q15_t)0x742, (q15_t)0x1d9b, + (q15_t)0x748, (q15_t)0x1da6, (q15_t)0x74e, (q15_t)0x1db1, (q15_t)0x754, (q15_t)0x1dbc, (q15_t)0x75a, (q15_t)0x1dc7, + (q15_t)0x75f, (q15_t)0x1dd3, (q15_t)0x765, (q15_t)0x1dde, (q15_t)0x76b, (q15_t)0x1de9, (q15_t)0x771, (q15_t)0x1df4, + (q15_t)0x777, (q15_t)0x1dff, (q15_t)0x77d, (q15_t)0x1e0a, (q15_t)0x783, (q15_t)0x1e15, (q15_t)0x789, (q15_t)0x1e20, + (q15_t)0x78f, (q15_t)0x1e2b, (q15_t)0x795, (q15_t)0x1e36, (q15_t)0x79a, (q15_t)0x1e42, (q15_t)0x7a0, (q15_t)0x1e4d, + (q15_t)0x7a6, (q15_t)0x1e58, (q15_t)0x7ac, (q15_t)0x1e63, (q15_t)0x7b2, (q15_t)0x1e6e, (q15_t)0x7b8, (q15_t)0x1e79, + (q15_t)0x7be, (q15_t)0x1e84, (q15_t)0x7c4, (q15_t)0x1e8f, (q15_t)0x7ca, (q15_t)0x1e9a, (q15_t)0x7d0, (q15_t)0x1ea5, + (q15_t)0x7d6, (q15_t)0x1eb0, (q15_t)0x7dc, (q15_t)0x1ebb, (q15_t)0x7e2, (q15_t)0x1ec6, (q15_t)0x7e8, (q15_t)0x1ed1, + (q15_t)0x7ee, (q15_t)0x1edc, (q15_t)0x7f5, (q15_t)0x1ee7, (q15_t)0x7fb, (q15_t)0x1ef2, (q15_t)0x801, (q15_t)0x1efd, + (q15_t)0x807, (q15_t)0x1f08, (q15_t)0x80d, (q15_t)0x1f13, (q15_t)0x813, (q15_t)0x1f1e, (q15_t)0x819, (q15_t)0x1f29, + (q15_t)0x81f, (q15_t)0x1f34, (q15_t)0x825, (q15_t)0x1f3f, (q15_t)0x82b, (q15_t)0x1f4a, (q15_t)0x832, (q15_t)0x1f55, + (q15_t)0x838, (q15_t)0x1f60, (q15_t)0x83e, (q15_t)0x1f6b, (q15_t)0x844, (q15_t)0x1f76, (q15_t)0x84a, (q15_t)0x1f81, + (q15_t)0x850, (q15_t)0x1f8c, (q15_t)0x857, (q15_t)0x1f97, (q15_t)0x85d, (q15_t)0x1fa2, (q15_t)0x863, (q15_t)0x1fac, + (q15_t)0x869, (q15_t)0x1fb7, (q15_t)0x870, (q15_t)0x1fc2, (q15_t)0x876, (q15_t)0x1fcd, (q15_t)0x87c, (q15_t)0x1fd8, + (q15_t)0x882, (q15_t)0x1fe3, (q15_t)0x889, (q15_t)0x1fee, (q15_t)0x88f, (q15_t)0x1ff9, (q15_t)0x895, (q15_t)0x2004, + (q15_t)0x89b, (q15_t)0x200f, (q15_t)0x8a2, (q15_t)0x2019, (q15_t)0x8a8, (q15_t)0x2024, (q15_t)0x8ae, (q15_t)0x202f, + (q15_t)0x8b5, (q15_t)0x203a, (q15_t)0x8bb, (q15_t)0x2045, (q15_t)0x8c1, (q15_t)0x2050, (q15_t)0x8c8, (q15_t)0x205b, + (q15_t)0x8ce, (q15_t)0x2065, (q15_t)0x8d4, (q15_t)0x2070, (q15_t)0x8db, (q15_t)0x207b, (q15_t)0x8e1, (q15_t)0x2086, + (q15_t)0x8e8, (q15_t)0x2091, (q15_t)0x8ee, (q15_t)0x209b, (q15_t)0x8f4, (q15_t)0x20a6, (q15_t)0x8fb, (q15_t)0x20b1, + (q15_t)0x901, (q15_t)0x20bc, (q15_t)0x908, (q15_t)0x20c7, (q15_t)0x90e, (q15_t)0x20d1, (q15_t)0x915, (q15_t)0x20dc, + (q15_t)0x91b, (q15_t)0x20e7, (q15_t)0x921, (q15_t)0x20f2, (q15_t)0x928, (q15_t)0x20fd, (q15_t)0x92e, (q15_t)0x2107, + (q15_t)0x935, (q15_t)0x2112, (q15_t)0x93b, (q15_t)0x211d, (q15_t)0x942, (q15_t)0x2128, (q15_t)0x948, (q15_t)0x2132, + (q15_t)0x94f, (q15_t)0x213d, (q15_t)0x955, (q15_t)0x2148, (q15_t)0x95c, (q15_t)0x2153, (q15_t)0x963, (q15_t)0x215d, + (q15_t)0x969, (q15_t)0x2168, (q15_t)0x970, (q15_t)0x2173, (q15_t)0x976, (q15_t)0x217d, (q15_t)0x97d, (q15_t)0x2188, + (q15_t)0x983, (q15_t)0x2193, (q15_t)0x98a, (q15_t)0x219e, (q15_t)0x991, (q15_t)0x21a8, (q15_t)0x997, (q15_t)0x21b3, + (q15_t)0x99e, (q15_t)0x21be, (q15_t)0x9a4, (q15_t)0x21c8, (q15_t)0x9ab, (q15_t)0x21d3, (q15_t)0x9b2, (q15_t)0x21de, + (q15_t)0x9b8, (q15_t)0x21e8, (q15_t)0x9bf, (q15_t)0x21f3, (q15_t)0x9c6, (q15_t)0x21fe, (q15_t)0x9cc, (q15_t)0x2208, + (q15_t)0x9d3, (q15_t)0x2213, (q15_t)0x9da, (q15_t)0x221e, (q15_t)0x9e0, (q15_t)0x2228, (q15_t)0x9e7, (q15_t)0x2233, + (q15_t)0x9ee, (q15_t)0x223d, (q15_t)0x9f5, (q15_t)0x2248, (q15_t)0x9fb, (q15_t)0x2253, (q15_t)0xa02, (q15_t)0x225d, + (q15_t)0xa09, (q15_t)0x2268, (q15_t)0xa10, (q15_t)0x2272, (q15_t)0xa16, (q15_t)0x227d, (q15_t)0xa1d, (q15_t)0x2288, + (q15_t)0xa24, (q15_t)0x2292, (q15_t)0xa2b, (q15_t)0x229d, (q15_t)0xa32, (q15_t)0x22a7, (q15_t)0xa38, (q15_t)0x22b2, + (q15_t)0xa3f, (q15_t)0x22bc, (q15_t)0xa46, (q15_t)0x22c7, (q15_t)0xa4d, (q15_t)0x22d2, (q15_t)0xa54, (q15_t)0x22dc, + (q15_t)0xa5b, (q15_t)0x22e7, (q15_t)0xa61, (q15_t)0x22f1, (q15_t)0xa68, (q15_t)0x22fc, (q15_t)0xa6f, (q15_t)0x2306, + (q15_t)0xa76, (q15_t)0x2311, (q15_t)0xa7d, (q15_t)0x231b, (q15_t)0xa84, (q15_t)0x2326, (q15_t)0xa8b, (q15_t)0x2330, + (q15_t)0xa92, (q15_t)0x233b, (q15_t)0xa99, (q15_t)0x2345, (q15_t)0xa9f, (q15_t)0x2350, (q15_t)0xaa6, (q15_t)0x235a, + (q15_t)0xaad, (q15_t)0x2365, (q15_t)0xab4, (q15_t)0x236f, (q15_t)0xabb, (q15_t)0x237a, (q15_t)0xac2, (q15_t)0x2384, + (q15_t)0xac9, (q15_t)0x238e, (q15_t)0xad0, (q15_t)0x2399, (q15_t)0xad7, (q15_t)0x23a3, (q15_t)0xade, (q15_t)0x23ae, + (q15_t)0xae5, (q15_t)0x23b8, (q15_t)0xaec, (q15_t)0x23c3, (q15_t)0xaf3, (q15_t)0x23cd, (q15_t)0xafa, (q15_t)0x23d7, + (q15_t)0xb01, (q15_t)0x23e2, (q15_t)0xb08, (q15_t)0x23ec, (q15_t)0xb0f, (q15_t)0x23f7, (q15_t)0xb16, (q15_t)0x2401, + (q15_t)0xb1e, (q15_t)0x240b, (q15_t)0xb25, (q15_t)0x2416, (q15_t)0xb2c, (q15_t)0x2420, (q15_t)0xb33, (q15_t)0x242b, + (q15_t)0xb3a, (q15_t)0x2435, (q15_t)0xb41, (q15_t)0x243f, (q15_t)0xb48, (q15_t)0x244a, (q15_t)0xb4f, (q15_t)0x2454, + (q15_t)0xb56, (q15_t)0x245e, (q15_t)0xb5e, (q15_t)0x2469, (q15_t)0xb65, (q15_t)0x2473, (q15_t)0xb6c, (q15_t)0x247d, + (q15_t)0xb73, (q15_t)0x2488, (q15_t)0xb7a, (q15_t)0x2492, (q15_t)0xb81, (q15_t)0x249c, (q15_t)0xb89, (q15_t)0x24a7, + (q15_t)0xb90, (q15_t)0x24b1, (q15_t)0xb97, (q15_t)0x24bb, (q15_t)0xb9e, (q15_t)0x24c5, (q15_t)0xba5, (q15_t)0x24d0, + (q15_t)0xbad, (q15_t)0x24da, (q15_t)0xbb4, (q15_t)0x24e4, (q15_t)0xbbb, (q15_t)0x24ef, (q15_t)0xbc2, (q15_t)0x24f9, + (q15_t)0xbca, (q15_t)0x2503, (q15_t)0xbd1, (q15_t)0x250d, (q15_t)0xbd8, (q15_t)0x2518, (q15_t)0xbe0, (q15_t)0x2522, + (q15_t)0xbe7, (q15_t)0x252c, (q15_t)0xbee, (q15_t)0x2536, (q15_t)0xbf5, (q15_t)0x2541, (q15_t)0xbfd, (q15_t)0x254b, + (q15_t)0xc04, (q15_t)0x2555, (q15_t)0xc0b, (q15_t)0x255f, (q15_t)0xc13, (q15_t)0x2569, (q15_t)0xc1a, (q15_t)0x2574, + (q15_t)0xc21, (q15_t)0x257e, (q15_t)0xc29, (q15_t)0x2588, (q15_t)0xc30, (q15_t)0x2592, (q15_t)0xc38, (q15_t)0x259c, + (q15_t)0xc3f, (q15_t)0x25a6, (q15_t)0xc46, (q15_t)0x25b1, (q15_t)0xc4e, (q15_t)0x25bb, (q15_t)0xc55, (q15_t)0x25c5, + (q15_t)0xc5d, (q15_t)0x25cf, (q15_t)0xc64, (q15_t)0x25d9, (q15_t)0xc6b, (q15_t)0x25e3, (q15_t)0xc73, (q15_t)0x25ed, + (q15_t)0xc7a, (q15_t)0x25f8, (q15_t)0xc82, (q15_t)0x2602, (q15_t)0xc89, (q15_t)0x260c, (q15_t)0xc91, (q15_t)0x2616, + (q15_t)0xc98, (q15_t)0x2620, (q15_t)0xca0, (q15_t)0x262a, (q15_t)0xca7, (q15_t)0x2634, (q15_t)0xcaf, (q15_t)0x263e, + (q15_t)0xcb6, (q15_t)0x2648, (q15_t)0xcbe, (q15_t)0x2652, (q15_t)0xcc5, (q15_t)0x265c, (q15_t)0xccd, (q15_t)0x2666, + (q15_t)0xcd4, (q15_t)0x2671, (q15_t)0xcdc, (q15_t)0x267b, (q15_t)0xce3, (q15_t)0x2685, (q15_t)0xceb, (q15_t)0x268f, + (q15_t)0xcf3, (q15_t)0x2699, (q15_t)0xcfa, (q15_t)0x26a3, (q15_t)0xd02, (q15_t)0x26ad, (q15_t)0xd09, (q15_t)0x26b7, + (q15_t)0xd11, (q15_t)0x26c1, (q15_t)0xd19, (q15_t)0x26cb, (q15_t)0xd20, (q15_t)0x26d5, (q15_t)0xd28, (q15_t)0x26df, + (q15_t)0xd30, (q15_t)0x26e9, (q15_t)0xd37, (q15_t)0x26f3, (q15_t)0xd3f, (q15_t)0x26fd, (q15_t)0xd46, (q15_t)0x2707, + (q15_t)0xd4e, (q15_t)0x2711, (q15_t)0xd56, (q15_t)0x271a, (q15_t)0xd5d, (q15_t)0x2724, (q15_t)0xd65, (q15_t)0x272e, + (q15_t)0xd6d, (q15_t)0x2738, (q15_t)0xd75, (q15_t)0x2742, (q15_t)0xd7c, (q15_t)0x274c, (q15_t)0xd84, (q15_t)0x2756, + (q15_t)0xd8c, (q15_t)0x2760, (q15_t)0xd93, (q15_t)0x276a, (q15_t)0xd9b, (q15_t)0x2774, (q15_t)0xda3, (q15_t)0x277e, + (q15_t)0xdab, (q15_t)0x2788, (q15_t)0xdb2, (q15_t)0x2791, (q15_t)0xdba, (q15_t)0x279b, (q15_t)0xdc2, (q15_t)0x27a5, + (q15_t)0xdca, (q15_t)0x27af, (q15_t)0xdd2, (q15_t)0x27b9, (q15_t)0xdd9, (q15_t)0x27c3, (q15_t)0xde1, (q15_t)0x27cd, + (q15_t)0xde9, (q15_t)0x27d6, (q15_t)0xdf1, (q15_t)0x27e0, (q15_t)0xdf9, (q15_t)0x27ea, (q15_t)0xe01, (q15_t)0x27f4, + (q15_t)0xe08, (q15_t)0x27fe, (q15_t)0xe10, (q15_t)0x2808, (q15_t)0xe18, (q15_t)0x2811, (q15_t)0xe20, (q15_t)0x281b, + (q15_t)0xe28, (q15_t)0x2825, (q15_t)0xe30, (q15_t)0x282f, (q15_t)0xe38, (q15_t)0x2838, (q15_t)0xe40, (q15_t)0x2842, + (q15_t)0xe47, (q15_t)0x284c, (q15_t)0xe4f, (q15_t)0x2856, (q15_t)0xe57, (q15_t)0x2860, (q15_t)0xe5f, (q15_t)0x2869, + (q15_t)0xe67, (q15_t)0x2873, (q15_t)0xe6f, (q15_t)0x287d, (q15_t)0xe77, (q15_t)0x2886, (q15_t)0xe7f, (q15_t)0x2890, + (q15_t)0xe87, (q15_t)0x289a, (q15_t)0xe8f, (q15_t)0x28a4, (q15_t)0xe97, (q15_t)0x28ad, (q15_t)0xe9f, (q15_t)0x28b7, + (q15_t)0xea7, (q15_t)0x28c1, (q15_t)0xeaf, (q15_t)0x28ca, (q15_t)0xeb7, (q15_t)0x28d4, (q15_t)0xebf, (q15_t)0x28de, + (q15_t)0xec7, (q15_t)0x28e7, (q15_t)0xecf, (q15_t)0x28f1, (q15_t)0xed7, (q15_t)0x28fb, (q15_t)0xedf, (q15_t)0x2904, + (q15_t)0xee7, (q15_t)0x290e, (q15_t)0xeef, (q15_t)0x2918, (q15_t)0xef7, (q15_t)0x2921, (q15_t)0xeff, (q15_t)0x292b, + (q15_t)0xf07, (q15_t)0x2935, (q15_t)0xf10, (q15_t)0x293e, (q15_t)0xf18, (q15_t)0x2948, (q15_t)0xf20, (q15_t)0x2951, + (q15_t)0xf28, (q15_t)0x295b, (q15_t)0xf30, (q15_t)0x2965, (q15_t)0xf38, (q15_t)0x296e, (q15_t)0xf40, (q15_t)0x2978, + (q15_t)0xf48, (q15_t)0x2981, (q15_t)0xf51, (q15_t)0x298b, (q15_t)0xf59, (q15_t)0x2994, (q15_t)0xf61, (q15_t)0x299e, + (q15_t)0xf69, (q15_t)0x29a7, (q15_t)0xf71, (q15_t)0x29b1, (q15_t)0xf79, (q15_t)0x29bb, (q15_t)0xf82, (q15_t)0x29c4, + (q15_t)0xf8a, (q15_t)0x29ce, (q15_t)0xf92, (q15_t)0x29d7, (q15_t)0xf9a, (q15_t)0x29e1, (q15_t)0xfa3, (q15_t)0x29ea, + (q15_t)0xfab, (q15_t)0x29f4, (q15_t)0xfb3, (q15_t)0x29fd, (q15_t)0xfbb, (q15_t)0x2a07, (q15_t)0xfc4, (q15_t)0x2a10, + (q15_t)0xfcc, (q15_t)0x2a1a, (q15_t)0xfd4, (q15_t)0x2a23, (q15_t)0xfdc, (q15_t)0x2a2c, (q15_t)0xfe5, (q15_t)0x2a36, + (q15_t)0xfed, (q15_t)0x2a3f, (q15_t)0xff5, (q15_t)0x2a49, (q15_t)0xffe, (q15_t)0x2a52, (q15_t)0x1006, (q15_t)0x2a5c, + (q15_t)0x100e, (q15_t)0x2a65, (q15_t)0x1016, (q15_t)0x2a6e, (q15_t)0x101f, (q15_t)0x2a78, (q15_t)0x1027, (q15_t)0x2a81, + (q15_t)0x1030, (q15_t)0x2a8b, (q15_t)0x1038, (q15_t)0x2a94, (q15_t)0x1040, (q15_t)0x2a9d, (q15_t)0x1049, (q15_t)0x2aa7, + (q15_t)0x1051, (q15_t)0x2ab0, (q15_t)0x1059, (q15_t)0x2ab9, (q15_t)0x1062, (q15_t)0x2ac3, (q15_t)0x106a, (q15_t)0x2acc, + (q15_t)0x1073, (q15_t)0x2ad6, (q15_t)0x107b, (q15_t)0x2adf, (q15_t)0x1083, (q15_t)0x2ae8, (q15_t)0x108c, (q15_t)0x2af2, + (q15_t)0x1094, (q15_t)0x2afb, (q15_t)0x109d, (q15_t)0x2b04, (q15_t)0x10a5, (q15_t)0x2b0d, (q15_t)0x10ae, (q15_t)0x2b17, + (q15_t)0x10b6, (q15_t)0x2b20, (q15_t)0x10bf, (q15_t)0x2b29, (q15_t)0x10c7, (q15_t)0x2b33, (q15_t)0x10d0, (q15_t)0x2b3c, + (q15_t)0x10d8, (q15_t)0x2b45, (q15_t)0x10e0, (q15_t)0x2b4e, (q15_t)0x10e9, (q15_t)0x2b58, (q15_t)0x10f2, (q15_t)0x2b61, + (q15_t)0x10fa, (q15_t)0x2b6a, (q15_t)0x1103, (q15_t)0x2b73, (q15_t)0x110b, (q15_t)0x2b7d, (q15_t)0x1114, (q15_t)0x2b86, + (q15_t)0x111c, (q15_t)0x2b8f, (q15_t)0x1125, (q15_t)0x2b98, (q15_t)0x112d, (q15_t)0x2ba1, (q15_t)0x1136, (q15_t)0x2bab, + (q15_t)0x113e, (q15_t)0x2bb4, (q15_t)0x1147, (q15_t)0x2bbd, (q15_t)0x1150, (q15_t)0x2bc6, (q15_t)0x1158, (q15_t)0x2bcf, + (q15_t)0x1161, (q15_t)0x2bd8, (q15_t)0x1169, (q15_t)0x2be2, (q15_t)0x1172, (q15_t)0x2beb, (q15_t)0x117b, (q15_t)0x2bf4, + (q15_t)0x1183, (q15_t)0x2bfd, (q15_t)0x118c, (q15_t)0x2c06, (q15_t)0x1195, (q15_t)0x2c0f, (q15_t)0x119d, (q15_t)0x2c18, + (q15_t)0x11a6, (q15_t)0x2c21, (q15_t)0x11af, (q15_t)0x2c2b, (q15_t)0x11b7, (q15_t)0x2c34, (q15_t)0x11c0, (q15_t)0x2c3d, + (q15_t)0x11c9, (q15_t)0x2c46, (q15_t)0x11d1, (q15_t)0x2c4f, (q15_t)0x11da, (q15_t)0x2c58, (q15_t)0x11e3, (q15_t)0x2c61, + (q15_t)0x11eb, (q15_t)0x2c6a, (q15_t)0x11f4, (q15_t)0x2c73, (q15_t)0x11fd, (q15_t)0x2c7c, (q15_t)0x1206, (q15_t)0x2c85, + (q15_t)0x120e, (q15_t)0x2c8e, (q15_t)0x1217, (q15_t)0x2c97, (q15_t)0x1220, (q15_t)0x2ca0, (q15_t)0x1229, (q15_t)0x2ca9, + (q15_t)0x1231, (q15_t)0x2cb2, (q15_t)0x123a, (q15_t)0x2cbb, (q15_t)0x1243, (q15_t)0x2cc4, (q15_t)0x124c, (q15_t)0x2ccd, + (q15_t)0x1255, (q15_t)0x2cd6, (q15_t)0x125d, (q15_t)0x2cdf, (q15_t)0x1266, (q15_t)0x2ce8, (q15_t)0x126f, (q15_t)0x2cf1, + (q15_t)0x1278, (q15_t)0x2cfa, (q15_t)0x1281, (q15_t)0x2d03, (q15_t)0x128a, (q15_t)0x2d0c, (q15_t)0x1292, (q15_t)0x2d15, + (q15_t)0x129b, (q15_t)0x2d1e, (q15_t)0x12a4, (q15_t)0x2d27, (q15_t)0x12ad, (q15_t)0x2d2f, (q15_t)0x12b6, (q15_t)0x2d38, + (q15_t)0x12bf, (q15_t)0x2d41, (q15_t)0x12c8, (q15_t)0x2d4a, (q15_t)0x12d1, (q15_t)0x2d53, (q15_t)0x12d9, (q15_t)0x2d5c, + (q15_t)0x12e2, (q15_t)0x2d65, (q15_t)0x12eb, (q15_t)0x2d6e, (q15_t)0x12f4, (q15_t)0x2d76, (q15_t)0x12fd, (q15_t)0x2d7f, + (q15_t)0x1306, (q15_t)0x2d88, (q15_t)0x130f, (q15_t)0x2d91, (q15_t)0x1318, (q15_t)0x2d9a, (q15_t)0x1321, (q15_t)0x2da3, + (q15_t)0x132a, (q15_t)0x2dab, (q15_t)0x1333, (q15_t)0x2db4, (q15_t)0x133c, (q15_t)0x2dbd, (q15_t)0x1345, (q15_t)0x2dc6, + (q15_t)0x134e, (q15_t)0x2dcf, (q15_t)0x1357, (q15_t)0x2dd7, (q15_t)0x1360, (q15_t)0x2de0, (q15_t)0x1369, (q15_t)0x2de9, + (q15_t)0x1372, (q15_t)0x2df2, (q15_t)0x137b, (q15_t)0x2dfa, (q15_t)0x1384, (q15_t)0x2e03, (q15_t)0x138d, (q15_t)0x2e0c, + (q15_t)0x1396, (q15_t)0x2e15, (q15_t)0x139f, (q15_t)0x2e1d, (q15_t)0x13a8, (q15_t)0x2e26, (q15_t)0x13b1, (q15_t)0x2e2f, + (q15_t)0x13ba, (q15_t)0x2e37, (q15_t)0x13c3, (q15_t)0x2e40, (q15_t)0x13cc, (q15_t)0x2e49, (q15_t)0x13d5, (q15_t)0x2e51, + (q15_t)0x13df, (q15_t)0x2e5a, (q15_t)0x13e8, (q15_t)0x2e63, (q15_t)0x13f1, (q15_t)0x2e6b, (q15_t)0x13fa, (q15_t)0x2e74, + (q15_t)0x1403, (q15_t)0x2e7d, (q15_t)0x140c, (q15_t)0x2e85, (q15_t)0x1415, (q15_t)0x2e8e, (q15_t)0x141e, (q15_t)0x2e97, + (q15_t)0x1428, (q15_t)0x2e9f, (q15_t)0x1431, (q15_t)0x2ea8, (q15_t)0x143a, (q15_t)0x2eb0, (q15_t)0x1443, (q15_t)0x2eb9, + (q15_t)0x144c, (q15_t)0x2ec2, (q15_t)0x1455, (q15_t)0x2eca, (q15_t)0x145f, (q15_t)0x2ed3, (q15_t)0x1468, (q15_t)0x2edb, + (q15_t)0x1471, (q15_t)0x2ee4, (q15_t)0x147a, (q15_t)0x2eec, (q15_t)0x1483, (q15_t)0x2ef5, (q15_t)0x148d, (q15_t)0x2efd, + (q15_t)0x1496, (q15_t)0x2f06, (q15_t)0x149f, (q15_t)0x2f0e, (q15_t)0x14a8, (q15_t)0x2f17, (q15_t)0x14b2, (q15_t)0x2f20, + (q15_t)0x14bb, (q15_t)0x2f28, (q15_t)0x14c4, (q15_t)0x2f30, (q15_t)0x14cd, (q15_t)0x2f39, (q15_t)0x14d7, (q15_t)0x2f41, + (q15_t)0x14e0, (q15_t)0x2f4a, (q15_t)0x14e9, (q15_t)0x2f52, (q15_t)0x14f3, (q15_t)0x2f5b, (q15_t)0x14fc, (q15_t)0x2f63, + (q15_t)0x1505, (q15_t)0x2f6c, (q15_t)0x150e, (q15_t)0x2f74, (q15_t)0x1518, (q15_t)0x2f7d, (q15_t)0x1521, (q15_t)0x2f85, + (q15_t)0x152a, (q15_t)0x2f8d, (q15_t)0x1534, (q15_t)0x2f96, (q15_t)0x153d, (q15_t)0x2f9e, (q15_t)0x1547, (q15_t)0x2fa7, + (q15_t)0x1550, (q15_t)0x2faf, (q15_t)0x1559, (q15_t)0x2fb7, (q15_t)0x1563, (q15_t)0x2fc0, (q15_t)0x156c, (q15_t)0x2fc8, + (q15_t)0x1575, (q15_t)0x2fd0, (q15_t)0x157f, (q15_t)0x2fd9, (q15_t)0x1588, (q15_t)0x2fe1, (q15_t)0x1592, (q15_t)0x2fea, + (q15_t)0x159b, (q15_t)0x2ff2, (q15_t)0x15a4, (q15_t)0x2ffa, (q15_t)0x15ae, (q15_t)0x3002, (q15_t)0x15b7, (q15_t)0x300b, + (q15_t)0x15c1, (q15_t)0x3013, (q15_t)0x15ca, (q15_t)0x301b, (q15_t)0x15d4, (q15_t)0x3024, (q15_t)0x15dd, (q15_t)0x302c, + (q15_t)0x15e6, (q15_t)0x3034, (q15_t)0x15f0, (q15_t)0x303c, (q15_t)0x15f9, (q15_t)0x3045, (q15_t)0x1603, (q15_t)0x304d, + (q15_t)0x160c, (q15_t)0x3055, (q15_t)0x1616, (q15_t)0x305d, (q15_t)0x161f, (q15_t)0x3066, (q15_t)0x1629, (q15_t)0x306e, + (q15_t)0x1632, (q15_t)0x3076, (q15_t)0x163c, (q15_t)0x307e, (q15_t)0x1645, (q15_t)0x3087, (q15_t)0x164f, (q15_t)0x308f, + (q15_t)0x1659, (q15_t)0x3097, (q15_t)0x1662, (q15_t)0x309f, (q15_t)0x166c, (q15_t)0x30a7, (q15_t)0x1675, (q15_t)0x30af, + (q15_t)0x167f, (q15_t)0x30b8, (q15_t)0x1688, (q15_t)0x30c0, (q15_t)0x1692, (q15_t)0x30c8, (q15_t)0x169b, (q15_t)0x30d0, + (q15_t)0x16a5, (q15_t)0x30d8, (q15_t)0x16af, (q15_t)0x30e0, (q15_t)0x16b8, (q15_t)0x30e8, (q15_t)0x16c2, (q15_t)0x30f0, + (q15_t)0x16cb, (q15_t)0x30f9, (q15_t)0x16d5, (q15_t)0x3101, (q15_t)0x16df, (q15_t)0x3109, (q15_t)0x16e8, (q15_t)0x3111, + (q15_t)0x16f2, (q15_t)0x3119, (q15_t)0x16fc, (q15_t)0x3121, (q15_t)0x1705, (q15_t)0x3129, (q15_t)0x170f, (q15_t)0x3131, + (q15_t)0x1719, (q15_t)0x3139, (q15_t)0x1722, (q15_t)0x3141, (q15_t)0x172c, (q15_t)0x3149, (q15_t)0x1736, (q15_t)0x3151, + (q15_t)0x173f, (q15_t)0x3159, (q15_t)0x1749, (q15_t)0x3161, (q15_t)0x1753, (q15_t)0x3169, (q15_t)0x175c, (q15_t)0x3171, + (q15_t)0x1766, (q15_t)0x3179, (q15_t)0x1770, (q15_t)0x3181, (q15_t)0x177a, (q15_t)0x3189, (q15_t)0x1783, (q15_t)0x3191, + (q15_t)0x178d, (q15_t)0x3199, (q15_t)0x1797, (q15_t)0x31a1, (q15_t)0x17a0, (q15_t)0x31a9, (q15_t)0x17aa, (q15_t)0x31b1, + (q15_t)0x17b4, (q15_t)0x31b9, (q15_t)0x17be, (q15_t)0x31c0, (q15_t)0x17c8, (q15_t)0x31c8, (q15_t)0x17d1, (q15_t)0x31d0, + (q15_t)0x17db, (q15_t)0x31d8, (q15_t)0x17e5, (q15_t)0x31e0, (q15_t)0x17ef, (q15_t)0x31e8, (q15_t)0x17f8, (q15_t)0x31f0, + (q15_t)0x1802, (q15_t)0x31f8, (q15_t)0x180c, (q15_t)0x31ff, (q15_t)0x1816, (q15_t)0x3207, (q15_t)0x1820, (q15_t)0x320f, + (q15_t)0x182a, (q15_t)0x3217, (q15_t)0x1833, (q15_t)0x321f, (q15_t)0x183d, (q15_t)0x3227, (q15_t)0x1847, (q15_t)0x322e, + (q15_t)0x1851, (q15_t)0x3236, (q15_t)0x185b, (q15_t)0x323e, (q15_t)0x1865, (q15_t)0x3246, (q15_t)0x186f, (q15_t)0x324e, + (q15_t)0x1878, (q15_t)0x3255, (q15_t)0x1882, (q15_t)0x325d, (q15_t)0x188c, (q15_t)0x3265, (q15_t)0x1896, (q15_t)0x326d, + (q15_t)0x18a0, (q15_t)0x3274, (q15_t)0x18aa, (q15_t)0x327c, (q15_t)0x18b4, (q15_t)0x3284, (q15_t)0x18be, (q15_t)0x328b, + (q15_t)0x18c8, (q15_t)0x3293, (q15_t)0x18d2, (q15_t)0x329b, (q15_t)0x18dc, (q15_t)0x32a3, (q15_t)0x18e6, (q15_t)0x32aa, + (q15_t)0x18ef, (q15_t)0x32b2, (q15_t)0x18f9, (q15_t)0x32ba, (q15_t)0x1903, (q15_t)0x32c1, (q15_t)0x190d, (q15_t)0x32c9, + (q15_t)0x1917, (q15_t)0x32d0, (q15_t)0x1921, (q15_t)0x32d8, (q15_t)0x192b, (q15_t)0x32e0, (q15_t)0x1935, (q15_t)0x32e7, + (q15_t)0x193f, (q15_t)0x32ef, (q15_t)0x1949, (q15_t)0x32f7, (q15_t)0x1953, (q15_t)0x32fe, (q15_t)0x195d, (q15_t)0x3306, + (q15_t)0x1967, (q15_t)0x330d, (q15_t)0x1971, (q15_t)0x3315, (q15_t)0x197b, (q15_t)0x331d, (q15_t)0x1985, (q15_t)0x3324, + (q15_t)0x198f, (q15_t)0x332c, (q15_t)0x199a, (q15_t)0x3333, (q15_t)0x19a4, (q15_t)0x333b, (q15_t)0x19ae, (q15_t)0x3342, + (q15_t)0x19b8, (q15_t)0x334a, (q15_t)0x19c2, (q15_t)0x3351, (q15_t)0x19cc, (q15_t)0x3359, (q15_t)0x19d6, (q15_t)0x3360, + (q15_t)0x19e0, (q15_t)0x3368, (q15_t)0x19ea, (q15_t)0x336f, (q15_t)0x19f4, (q15_t)0x3377, (q15_t)0x19fe, (q15_t)0x337e, + (q15_t)0x1a08, (q15_t)0x3386, (q15_t)0x1a13, (q15_t)0x338d, (q15_t)0x1a1d, (q15_t)0x3395, (q15_t)0x1a27, (q15_t)0x339c, + (q15_t)0x1a31, (q15_t)0x33a3, (q15_t)0x1a3b, (q15_t)0x33ab, (q15_t)0x1a45, (q15_t)0x33b2, (q15_t)0x1a4f, (q15_t)0x33ba, + (q15_t)0x1a5a, (q15_t)0x33c1, (q15_t)0x1a64, (q15_t)0x33c8, (q15_t)0x1a6e, (q15_t)0x33d0, (q15_t)0x1a78, (q15_t)0x33d7, + (q15_t)0x1a82, (q15_t)0x33df, (q15_t)0x1a8c, (q15_t)0x33e6, (q15_t)0x1a97, (q15_t)0x33ed, (q15_t)0x1aa1, (q15_t)0x33f5, + (q15_t)0x1aab, (q15_t)0x33fc, (q15_t)0x1ab5, (q15_t)0x3403, (q15_t)0x1abf, (q15_t)0x340b, (q15_t)0x1aca, (q15_t)0x3412, + (q15_t)0x1ad4, (q15_t)0x3419, (q15_t)0x1ade, (q15_t)0x3420, (q15_t)0x1ae8, (q15_t)0x3428, (q15_t)0x1af3, (q15_t)0x342f, + (q15_t)0x1afd, (q15_t)0x3436, (q15_t)0x1b07, (q15_t)0x343e, (q15_t)0x1b11, (q15_t)0x3445, (q15_t)0x1b1c, (q15_t)0x344c, + (q15_t)0x1b26, (q15_t)0x3453, (q15_t)0x1b30, (q15_t)0x345b, (q15_t)0x1b3b, (q15_t)0x3462, (q15_t)0x1b45, (q15_t)0x3469, + (q15_t)0x1b4f, (q15_t)0x3470, (q15_t)0x1b59, (q15_t)0x3477, (q15_t)0x1b64, (q15_t)0x347f, (q15_t)0x1b6e, (q15_t)0x3486, + (q15_t)0x1b78, (q15_t)0x348d, (q15_t)0x1b83, (q15_t)0x3494, (q15_t)0x1b8d, (q15_t)0x349b, (q15_t)0x1b97, (q15_t)0x34a2, + (q15_t)0x1ba2, (q15_t)0x34aa, (q15_t)0x1bac, (q15_t)0x34b1, (q15_t)0x1bb6, (q15_t)0x34b8, (q15_t)0x1bc1, (q15_t)0x34bf, + (q15_t)0x1bcb, (q15_t)0x34c6, (q15_t)0x1bd5, (q15_t)0x34cd, (q15_t)0x1be0, (q15_t)0x34d4, (q15_t)0x1bea, (q15_t)0x34db, + (q15_t)0x1bf5, (q15_t)0x34e2, (q15_t)0x1bff, (q15_t)0x34ea, (q15_t)0x1c09, (q15_t)0x34f1, (q15_t)0x1c14, (q15_t)0x34f8, + (q15_t)0x1c1e, (q15_t)0x34ff, (q15_t)0x1c29, (q15_t)0x3506, (q15_t)0x1c33, (q15_t)0x350d, (q15_t)0x1c3d, (q15_t)0x3514, + (q15_t)0x1c48, (q15_t)0x351b, (q15_t)0x1c52, (q15_t)0x3522, (q15_t)0x1c5d, (q15_t)0x3529, (q15_t)0x1c67, (q15_t)0x3530, + (q15_t)0x1c72, (q15_t)0x3537, (q15_t)0x1c7c, (q15_t)0x353e, (q15_t)0x1c86, (q15_t)0x3545, (q15_t)0x1c91, (q15_t)0x354c, + (q15_t)0x1c9b, (q15_t)0x3553, (q15_t)0x1ca6, (q15_t)0x355a, (q15_t)0x1cb0, (q15_t)0x3561, (q15_t)0x1cbb, (q15_t)0x3567, + (q15_t)0x1cc5, (q15_t)0x356e, (q15_t)0x1cd0, (q15_t)0x3575, (q15_t)0x1cda, (q15_t)0x357c, (q15_t)0x1ce5, (q15_t)0x3583, + (q15_t)0x1cef, (q15_t)0x358a, (q15_t)0x1cfa, (q15_t)0x3591, (q15_t)0x1d04, (q15_t)0x3598, (q15_t)0x1d0f, (q15_t)0x359f, + (q15_t)0x1d19, (q15_t)0x35a5, (q15_t)0x1d24, (q15_t)0x35ac, (q15_t)0x1d2e, (q15_t)0x35b3, (q15_t)0x1d39, (q15_t)0x35ba, + (q15_t)0x1d44, (q15_t)0x35c1, (q15_t)0x1d4e, (q15_t)0x35c8, (q15_t)0x1d59, (q15_t)0x35ce, (q15_t)0x1d63, (q15_t)0x35d5, + (q15_t)0x1d6e, (q15_t)0x35dc, (q15_t)0x1d78, (q15_t)0x35e3, (q15_t)0x1d83, (q15_t)0x35ea, (q15_t)0x1d8e, (q15_t)0x35f0, + (q15_t)0x1d98, (q15_t)0x35f7, (q15_t)0x1da3, (q15_t)0x35fe, (q15_t)0x1dad, (q15_t)0x3605, (q15_t)0x1db8, (q15_t)0x360b, + (q15_t)0x1dc3, (q15_t)0x3612, (q15_t)0x1dcd, (q15_t)0x3619, (q15_t)0x1dd8, (q15_t)0x3620, (q15_t)0x1de2, (q15_t)0x3626, + (q15_t)0x1ded, (q15_t)0x362d, (q15_t)0x1df8, (q15_t)0x3634, (q15_t)0x1e02, (q15_t)0x363a, (q15_t)0x1e0d, (q15_t)0x3641, + (q15_t)0x1e18, (q15_t)0x3648, (q15_t)0x1e22, (q15_t)0x364e, (q15_t)0x1e2d, (q15_t)0x3655, (q15_t)0x1e38, (q15_t)0x365c, + (q15_t)0x1e42, (q15_t)0x3662, (q15_t)0x1e4d, (q15_t)0x3669, (q15_t)0x1e58, (q15_t)0x366f, (q15_t)0x1e62, (q15_t)0x3676, + (q15_t)0x1e6d, (q15_t)0x367d, (q15_t)0x1e78, (q15_t)0x3683, (q15_t)0x1e83, (q15_t)0x368a, (q15_t)0x1e8d, (q15_t)0x3690, + (q15_t)0x1e98, (q15_t)0x3697, (q15_t)0x1ea3, (q15_t)0x369d, (q15_t)0x1ead, (q15_t)0x36a4, (q15_t)0x1eb8, (q15_t)0x36ab, + (q15_t)0x1ec3, (q15_t)0x36b1, (q15_t)0x1ece, (q15_t)0x36b8, (q15_t)0x1ed8, (q15_t)0x36be, (q15_t)0x1ee3, (q15_t)0x36c5, + (q15_t)0x1eee, (q15_t)0x36cb, (q15_t)0x1ef9, (q15_t)0x36d2, (q15_t)0x1f03, (q15_t)0x36d8, (q15_t)0x1f0e, (q15_t)0x36df, + (q15_t)0x1f19, (q15_t)0x36e5, (q15_t)0x1f24, (q15_t)0x36eb, (q15_t)0x1f2f, (q15_t)0x36f2, (q15_t)0x1f39, (q15_t)0x36f8, + (q15_t)0x1f44, (q15_t)0x36ff, (q15_t)0x1f4f, (q15_t)0x3705, (q15_t)0x1f5a, (q15_t)0x370c, (q15_t)0x1f65, (q15_t)0x3712, + (q15_t)0x1f6f, (q15_t)0x3718, (q15_t)0x1f7a, (q15_t)0x371f, (q15_t)0x1f85, (q15_t)0x3725, (q15_t)0x1f90, (q15_t)0x372c, + (q15_t)0x1f9b, (q15_t)0x3732, (q15_t)0x1fa5, (q15_t)0x3738, (q15_t)0x1fb0, (q15_t)0x373f, (q15_t)0x1fbb, (q15_t)0x3745, + (q15_t)0x1fc6, (q15_t)0x374b, (q15_t)0x1fd1, (q15_t)0x3752, (q15_t)0x1fdc, (q15_t)0x3758, (q15_t)0x1fe7, (q15_t)0x375e, + (q15_t)0x1ff1, (q15_t)0x3765, (q15_t)0x1ffc, (q15_t)0x376b, (q15_t)0x2007, (q15_t)0x3771, (q15_t)0x2012, (q15_t)0x3777, + (q15_t)0x201d, (q15_t)0x377e, (q15_t)0x2028, (q15_t)0x3784, (q15_t)0x2033, (q15_t)0x378a, (q15_t)0x203e, (q15_t)0x3790, + (q15_t)0x2049, (q15_t)0x3797, (q15_t)0x2054, (q15_t)0x379d, (q15_t)0x205e, (q15_t)0x37a3, (q15_t)0x2069, (q15_t)0x37a9, + (q15_t)0x2074, (q15_t)0x37b0, (q15_t)0x207f, (q15_t)0x37b6, (q15_t)0x208a, (q15_t)0x37bc, (q15_t)0x2095, (q15_t)0x37c2, + (q15_t)0x20a0, (q15_t)0x37c8, (q15_t)0x20ab, (q15_t)0x37ce, (q15_t)0x20b6, (q15_t)0x37d5, (q15_t)0x20c1, (q15_t)0x37db, + (q15_t)0x20cc, (q15_t)0x37e1, (q15_t)0x20d7, (q15_t)0x37e7, (q15_t)0x20e2, (q15_t)0x37ed, (q15_t)0x20ed, (q15_t)0x37f3, + (q15_t)0x20f8, (q15_t)0x37f9, (q15_t)0x2103, (q15_t)0x37ff, (q15_t)0x210e, (q15_t)0x3805, (q15_t)0x2119, (q15_t)0x380b, + (q15_t)0x2124, (q15_t)0x3812, (q15_t)0x212f, (q15_t)0x3818, (q15_t)0x213a, (q15_t)0x381e, (q15_t)0x2145, (q15_t)0x3824, + (q15_t)0x2150, (q15_t)0x382a, (q15_t)0x215b, (q15_t)0x3830, (q15_t)0x2166, (q15_t)0x3836, (q15_t)0x2171, (q15_t)0x383c, + (q15_t)0x217c, (q15_t)0x3842, (q15_t)0x2187, (q15_t)0x3848, (q15_t)0x2192, (q15_t)0x384e, (q15_t)0x219d, (q15_t)0x3854, + (q15_t)0x21a8, (q15_t)0x385a, (q15_t)0x21b3, (q15_t)0x3860, (q15_t)0x21be, (q15_t)0x3866, (q15_t)0x21ca, (q15_t)0x386b, + (q15_t)0x21d5, (q15_t)0x3871, (q15_t)0x21e0, (q15_t)0x3877, (q15_t)0x21eb, (q15_t)0x387d, (q15_t)0x21f6, (q15_t)0x3883, + (q15_t)0x2201, (q15_t)0x3889, (q15_t)0x220c, (q15_t)0x388f, (q15_t)0x2217, (q15_t)0x3895, (q15_t)0x2222, (q15_t)0x389b, + (q15_t)0x222d, (q15_t)0x38a1, (q15_t)0x2239, (q15_t)0x38a6, (q15_t)0x2244, (q15_t)0x38ac, (q15_t)0x224f, (q15_t)0x38b2, + (q15_t)0x225a, (q15_t)0x38b8, (q15_t)0x2265, (q15_t)0x38be, (q15_t)0x2270, (q15_t)0x38c3, (q15_t)0x227b, (q15_t)0x38c9, + (q15_t)0x2287, (q15_t)0x38cf, (q15_t)0x2292, (q15_t)0x38d5, (q15_t)0x229d, (q15_t)0x38db, (q15_t)0x22a8, (q15_t)0x38e0, + (q15_t)0x22b3, (q15_t)0x38e6, (q15_t)0x22be, (q15_t)0x38ec, (q15_t)0x22ca, (q15_t)0x38f2, (q15_t)0x22d5, (q15_t)0x38f7, + (q15_t)0x22e0, (q15_t)0x38fd, (q15_t)0x22eb, (q15_t)0x3903, (q15_t)0x22f6, (q15_t)0x3909, (q15_t)0x2301, (q15_t)0x390e, + (q15_t)0x230d, (q15_t)0x3914, (q15_t)0x2318, (q15_t)0x391a, (q15_t)0x2323, (q15_t)0x391f, (q15_t)0x232e, (q15_t)0x3925, + (q15_t)0x233a, (q15_t)0x392b, (q15_t)0x2345, (q15_t)0x3930, (q15_t)0x2350, (q15_t)0x3936, (q15_t)0x235b, (q15_t)0x393b, + (q15_t)0x2367, (q15_t)0x3941, (q15_t)0x2372, (q15_t)0x3947, (q15_t)0x237d, (q15_t)0x394c, (q15_t)0x2388, (q15_t)0x3952, + (q15_t)0x2394, (q15_t)0x3958, (q15_t)0x239f, (q15_t)0x395d, (q15_t)0x23aa, (q15_t)0x3963, (q15_t)0x23b5, (q15_t)0x3968, + (q15_t)0x23c1, (q15_t)0x396e, (q15_t)0x23cc, (q15_t)0x3973, (q15_t)0x23d7, (q15_t)0x3979, (q15_t)0x23e2, (q15_t)0x397e, + (q15_t)0x23ee, (q15_t)0x3984, (q15_t)0x23f9, (q15_t)0x3989, (q15_t)0x2404, (q15_t)0x398f, (q15_t)0x2410, (q15_t)0x3994, + (q15_t)0x241b, (q15_t)0x399a, (q15_t)0x2426, (q15_t)0x399f, (q15_t)0x2432, (q15_t)0x39a5, (q15_t)0x243d, (q15_t)0x39aa, + (q15_t)0x2448, (q15_t)0x39b0, (q15_t)0x2454, (q15_t)0x39b5, (q15_t)0x245f, (q15_t)0x39bb, (q15_t)0x246a, (q15_t)0x39c0, + (q15_t)0x2476, (q15_t)0x39c5, (q15_t)0x2481, (q15_t)0x39cb, (q15_t)0x248c, (q15_t)0x39d0, (q15_t)0x2498, (q15_t)0x39d6, + (q15_t)0x24a3, (q15_t)0x39db, (q15_t)0x24ae, (q15_t)0x39e0, (q15_t)0x24ba, (q15_t)0x39e6, (q15_t)0x24c5, (q15_t)0x39eb, + (q15_t)0x24d0, (q15_t)0x39f0, (q15_t)0x24dc, (q15_t)0x39f6, (q15_t)0x24e7, (q15_t)0x39fb, (q15_t)0x24f3, (q15_t)0x3a00, + (q15_t)0x24fe, (q15_t)0x3a06, (q15_t)0x2509, (q15_t)0x3a0b, (q15_t)0x2515, (q15_t)0x3a10, (q15_t)0x2520, (q15_t)0x3a16, + (q15_t)0x252c, (q15_t)0x3a1b, (q15_t)0x2537, (q15_t)0x3a20, (q15_t)0x2542, (q15_t)0x3a25, (q15_t)0x254e, (q15_t)0x3a2b, + (q15_t)0x2559, (q15_t)0x3a30, (q15_t)0x2565, (q15_t)0x3a35, (q15_t)0x2570, (q15_t)0x3a3a, (q15_t)0x257c, (q15_t)0x3a3f, + (q15_t)0x2587, (q15_t)0x3a45, (q15_t)0x2592, (q15_t)0x3a4a, (q15_t)0x259e, (q15_t)0x3a4f, (q15_t)0x25a9, (q15_t)0x3a54, + (q15_t)0x25b5, (q15_t)0x3a59, (q15_t)0x25c0, (q15_t)0x3a5f, (q15_t)0x25cc, (q15_t)0x3a64, (q15_t)0x25d7, (q15_t)0x3a69, + (q15_t)0x25e3, (q15_t)0x3a6e, (q15_t)0x25ee, (q15_t)0x3a73, (q15_t)0x25fa, (q15_t)0x3a78, (q15_t)0x2605, (q15_t)0x3a7d, + (q15_t)0x2611, (q15_t)0x3a82, (q15_t)0x261c, (q15_t)0x3a88, (q15_t)0x2628, (q15_t)0x3a8d, (q15_t)0x2633, (q15_t)0x3a92, + (q15_t)0x263f, (q15_t)0x3a97, (q15_t)0x264a, (q15_t)0x3a9c, (q15_t)0x2656, (q15_t)0x3aa1, (q15_t)0x2661, (q15_t)0x3aa6, + (q15_t)0x266d, (q15_t)0x3aab, (q15_t)0x2678, (q15_t)0x3ab0, (q15_t)0x2684, (q15_t)0x3ab5, (q15_t)0x268f, (q15_t)0x3aba, + (q15_t)0x269b, (q15_t)0x3abf, (q15_t)0x26a6, (q15_t)0x3ac4, (q15_t)0x26b2, (q15_t)0x3ac9, (q15_t)0x26bd, (q15_t)0x3ace, + (q15_t)0x26c9, (q15_t)0x3ad3, (q15_t)0x26d4, (q15_t)0x3ad8, (q15_t)0x26e0, (q15_t)0x3add, (q15_t)0x26ec, (q15_t)0x3ae2, + (q15_t)0x26f7, (q15_t)0x3ae6, (q15_t)0x2703, (q15_t)0x3aeb, (q15_t)0x270e, (q15_t)0x3af0, (q15_t)0x271a, (q15_t)0x3af5, + (q15_t)0x2725, (q15_t)0x3afa, (q15_t)0x2731, (q15_t)0x3aff, (q15_t)0x273d, (q15_t)0x3b04, (q15_t)0x2748, (q15_t)0x3b09, + (q15_t)0x2754, (q15_t)0x3b0e, (q15_t)0x275f, (q15_t)0x3b12, (q15_t)0x276b, (q15_t)0x3b17, (q15_t)0x2777, (q15_t)0x3b1c, + (q15_t)0x2782, (q15_t)0x3b21, (q15_t)0x278e, (q15_t)0x3b26, (q15_t)0x2799, (q15_t)0x3b2a, (q15_t)0x27a5, (q15_t)0x3b2f, + (q15_t)0x27b1, (q15_t)0x3b34, (q15_t)0x27bc, (q15_t)0x3b39, (q15_t)0x27c8, (q15_t)0x3b3e, (q15_t)0x27d3, (q15_t)0x3b42, + (q15_t)0x27df, (q15_t)0x3b47, (q15_t)0x27eb, (q15_t)0x3b4c, (q15_t)0x27f6, (q15_t)0x3b50, (q15_t)0x2802, (q15_t)0x3b55, + (q15_t)0x280e, (q15_t)0x3b5a, (q15_t)0x2819, (q15_t)0x3b5f, (q15_t)0x2825, (q15_t)0x3b63, (q15_t)0x2831, (q15_t)0x3b68, + (q15_t)0x283c, (q15_t)0x3b6d, (q15_t)0x2848, (q15_t)0x3b71, (q15_t)0x2854, (q15_t)0x3b76, (q15_t)0x285f, (q15_t)0x3b7b, + (q15_t)0x286b, (q15_t)0x3b7f, (q15_t)0x2877, (q15_t)0x3b84, (q15_t)0x2882, (q15_t)0x3b88, (q15_t)0x288e, (q15_t)0x3b8d, + (q15_t)0x289a, (q15_t)0x3b92, (q15_t)0x28a5, (q15_t)0x3b96, (q15_t)0x28b1, (q15_t)0x3b9b, (q15_t)0x28bd, (q15_t)0x3b9f, + (q15_t)0x28c9, (q15_t)0x3ba4, (q15_t)0x28d4, (q15_t)0x3ba9, (q15_t)0x28e0, (q15_t)0x3bad, (q15_t)0x28ec, (q15_t)0x3bb2, + (q15_t)0x28f7, (q15_t)0x3bb6, (q15_t)0x2903, (q15_t)0x3bbb, (q15_t)0x290f, (q15_t)0x3bbf, (q15_t)0x291b, (q15_t)0x3bc4, + (q15_t)0x2926, (q15_t)0x3bc8, (q15_t)0x2932, (q15_t)0x3bcd, (q15_t)0x293e, (q15_t)0x3bd1, (q15_t)0x294a, (q15_t)0x3bd6, + (q15_t)0x2955, (q15_t)0x3bda, (q15_t)0x2961, (q15_t)0x3bde, (q15_t)0x296d, (q15_t)0x3be3, (q15_t)0x2979, (q15_t)0x3be7, + (q15_t)0x2984, (q15_t)0x3bec, (q15_t)0x2990, (q15_t)0x3bf0, (q15_t)0x299c, (q15_t)0x3bf5, (q15_t)0x29a8, (q15_t)0x3bf9, + (q15_t)0x29b4, (q15_t)0x3bfd, (q15_t)0x29bf, (q15_t)0x3c02, (q15_t)0x29cb, (q15_t)0x3c06, (q15_t)0x29d7, (q15_t)0x3c0a, + (q15_t)0x29e3, (q15_t)0x3c0f, (q15_t)0x29ee, (q15_t)0x3c13, (q15_t)0x29fa, (q15_t)0x3c17, (q15_t)0x2a06, (q15_t)0x3c1c, + (q15_t)0x2a12, (q15_t)0x3c20, (q15_t)0x2a1e, (q15_t)0x3c24, (q15_t)0x2a29, (q15_t)0x3c29, (q15_t)0x2a35, (q15_t)0x3c2d, + (q15_t)0x2a41, (q15_t)0x3c31, (q15_t)0x2a4d, (q15_t)0x3c36, (q15_t)0x2a59, (q15_t)0x3c3a, (q15_t)0x2a65, (q15_t)0x3c3e, + (q15_t)0x2a70, (q15_t)0x3c42, (q15_t)0x2a7c, (q15_t)0x3c46, (q15_t)0x2a88, (q15_t)0x3c4b, (q15_t)0x2a94, (q15_t)0x3c4f, + (q15_t)0x2aa0, (q15_t)0x3c53, (q15_t)0x2aac, (q15_t)0x3c57, (q15_t)0x2ab7, (q15_t)0x3c5b, (q15_t)0x2ac3, (q15_t)0x3c60, + (q15_t)0x2acf, (q15_t)0x3c64, (q15_t)0x2adb, (q15_t)0x3c68, (q15_t)0x2ae7, (q15_t)0x3c6c, (q15_t)0x2af3, (q15_t)0x3c70, + (q15_t)0x2aff, (q15_t)0x3c74, (q15_t)0x2b0a, (q15_t)0x3c79, (q15_t)0x2b16, (q15_t)0x3c7d, (q15_t)0x2b22, (q15_t)0x3c81, + (q15_t)0x2b2e, (q15_t)0x3c85, (q15_t)0x2b3a, (q15_t)0x3c89, (q15_t)0x2b46, (q15_t)0x3c8d, (q15_t)0x2b52, (q15_t)0x3c91, + (q15_t)0x2b5e, (q15_t)0x3c95, (q15_t)0x2b6a, (q15_t)0x3c99, (q15_t)0x2b75, (q15_t)0x3c9d, (q15_t)0x2b81, (q15_t)0x3ca1, + (q15_t)0x2b8d, (q15_t)0x3ca5, (q15_t)0x2b99, (q15_t)0x3ca9, (q15_t)0x2ba5, (q15_t)0x3cad, (q15_t)0x2bb1, (q15_t)0x3cb1, + (q15_t)0x2bbd, (q15_t)0x3cb5, (q15_t)0x2bc9, (q15_t)0x3cb9, (q15_t)0x2bd5, (q15_t)0x3cbd, (q15_t)0x2be1, (q15_t)0x3cc1, + (q15_t)0x2bed, (q15_t)0x3cc5, (q15_t)0x2bf9, (q15_t)0x3cc9, (q15_t)0x2c05, (q15_t)0x3ccd, (q15_t)0x2c10, (q15_t)0x3cd1, + (q15_t)0x2c1c, (q15_t)0x3cd5, (q15_t)0x2c28, (q15_t)0x3cd9, (q15_t)0x2c34, (q15_t)0x3cdd, (q15_t)0x2c40, (q15_t)0x3ce0, + (q15_t)0x2c4c, (q15_t)0x3ce4, (q15_t)0x2c58, (q15_t)0x3ce8, (q15_t)0x2c64, (q15_t)0x3cec, (q15_t)0x2c70, (q15_t)0x3cf0, + (q15_t)0x2c7c, (q15_t)0x3cf4, (q15_t)0x2c88, (q15_t)0x3cf8, (q15_t)0x2c94, (q15_t)0x3cfb, (q15_t)0x2ca0, (q15_t)0x3cff, + (q15_t)0x2cac, (q15_t)0x3d03, (q15_t)0x2cb8, (q15_t)0x3d07, (q15_t)0x2cc4, (q15_t)0x3d0b, (q15_t)0x2cd0, (q15_t)0x3d0e, + (q15_t)0x2cdc, (q15_t)0x3d12, (q15_t)0x2ce8, (q15_t)0x3d16, (q15_t)0x2cf4, (q15_t)0x3d1a, (q15_t)0x2d00, (q15_t)0x3d1d, + (q15_t)0x2d0c, (q15_t)0x3d21, (q15_t)0x2d18, (q15_t)0x3d25, (q15_t)0x2d24, (q15_t)0x3d28, (q15_t)0x2d30, (q15_t)0x3d2c, + (q15_t)0x2d3c, (q15_t)0x3d30, (q15_t)0x2d48, (q15_t)0x3d34, (q15_t)0x2d54, (q15_t)0x3d37, (q15_t)0x2d60, (q15_t)0x3d3b, + (q15_t)0x2d6c, (q15_t)0x3d3f, (q15_t)0x2d78, (q15_t)0x3d42, (q15_t)0x2d84, (q15_t)0x3d46, (q15_t)0x2d90, (q15_t)0x3d49, + (q15_t)0x2d9c, (q15_t)0x3d4d, (q15_t)0x2da8, (q15_t)0x3d51, (q15_t)0x2db4, (q15_t)0x3d54, (q15_t)0x2dc0, (q15_t)0x3d58, + (q15_t)0x2dcc, (q15_t)0x3d5b, (q15_t)0x2dd8, (q15_t)0x3d5f, (q15_t)0x2de4, (q15_t)0x3d63, (q15_t)0x2df0, (q15_t)0x3d66, + (q15_t)0x2dfc, (q15_t)0x3d6a, (q15_t)0x2e09, (q15_t)0x3d6d, (q15_t)0x2e15, (q15_t)0x3d71, (q15_t)0x2e21, (q15_t)0x3d74, + (q15_t)0x2e2d, (q15_t)0x3d78, (q15_t)0x2e39, (q15_t)0x3d7b, (q15_t)0x2e45, (q15_t)0x3d7f, (q15_t)0x2e51, (q15_t)0x3d82, + (q15_t)0x2e5d, (q15_t)0x3d86, (q15_t)0x2e69, (q15_t)0x3d89, (q15_t)0x2e75, (q15_t)0x3d8d, (q15_t)0x2e81, (q15_t)0x3d90, + (q15_t)0x2e8d, (q15_t)0x3d93, (q15_t)0x2e99, (q15_t)0x3d97, (q15_t)0x2ea6, (q15_t)0x3d9a, (q15_t)0x2eb2, (q15_t)0x3d9e, + (q15_t)0x2ebe, (q15_t)0x3da1, (q15_t)0x2eca, (q15_t)0x3da4, (q15_t)0x2ed6, (q15_t)0x3da8, (q15_t)0x2ee2, (q15_t)0x3dab, + (q15_t)0x2eee, (q15_t)0x3daf, (q15_t)0x2efa, (q15_t)0x3db2, (q15_t)0x2f06, (q15_t)0x3db5, (q15_t)0x2f13, (q15_t)0x3db9, + (q15_t)0x2f1f, (q15_t)0x3dbc, (q15_t)0x2f2b, (q15_t)0x3dbf, (q15_t)0x2f37, (q15_t)0x3dc2, (q15_t)0x2f43, (q15_t)0x3dc6, + (q15_t)0x2f4f, (q15_t)0x3dc9, (q15_t)0x2f5b, (q15_t)0x3dcc, (q15_t)0x2f67, (q15_t)0x3dd0, (q15_t)0x2f74, (q15_t)0x3dd3, + (q15_t)0x2f80, (q15_t)0x3dd6, (q15_t)0x2f8c, (q15_t)0x3dd9, (q15_t)0x2f98, (q15_t)0x3ddd, (q15_t)0x2fa4, (q15_t)0x3de0, + (q15_t)0x2fb0, (q15_t)0x3de3, (q15_t)0x2fbc, (q15_t)0x3de6, (q15_t)0x2fc9, (q15_t)0x3de9, (q15_t)0x2fd5, (q15_t)0x3ded, + (q15_t)0x2fe1, (q15_t)0x3df0, (q15_t)0x2fed, (q15_t)0x3df3, (q15_t)0x2ff9, (q15_t)0x3df6, (q15_t)0x3005, (q15_t)0x3df9, + (q15_t)0x3012, (q15_t)0x3dfc, (q15_t)0x301e, (q15_t)0x3dff, (q15_t)0x302a, (q15_t)0x3e03, (q15_t)0x3036, (q15_t)0x3e06, + (q15_t)0x3042, (q15_t)0x3e09, (q15_t)0x304e, (q15_t)0x3e0c, (q15_t)0x305b, (q15_t)0x3e0f, (q15_t)0x3067, (q15_t)0x3e12, + (q15_t)0x3073, (q15_t)0x3e15, (q15_t)0x307f, (q15_t)0x3e18, (q15_t)0x308b, (q15_t)0x3e1b, (q15_t)0x3098, (q15_t)0x3e1e, + (q15_t)0x30a4, (q15_t)0x3e21, (q15_t)0x30b0, (q15_t)0x3e24, (q15_t)0x30bc, (q15_t)0x3e27, (q15_t)0x30c8, (q15_t)0x3e2a, + (q15_t)0x30d5, (q15_t)0x3e2d, (q15_t)0x30e1, (q15_t)0x3e30, (q15_t)0x30ed, (q15_t)0x3e33, (q15_t)0x30f9, (q15_t)0x3e36, + (q15_t)0x3105, (q15_t)0x3e39, (q15_t)0x3112, (q15_t)0x3e3c, (q15_t)0x311e, (q15_t)0x3e3f, (q15_t)0x312a, (q15_t)0x3e42, + (q15_t)0x3136, (q15_t)0x3e45, (q15_t)0x3143, (q15_t)0x3e48, (q15_t)0x314f, (q15_t)0x3e4a, (q15_t)0x315b, (q15_t)0x3e4d, + (q15_t)0x3167, (q15_t)0x3e50, (q15_t)0x3174, (q15_t)0x3e53, (q15_t)0x3180, (q15_t)0x3e56, (q15_t)0x318c, (q15_t)0x3e59, + (q15_t)0x3198, (q15_t)0x3e5c, (q15_t)0x31a4, (q15_t)0x3e5e, (q15_t)0x31b1, (q15_t)0x3e61, (q15_t)0x31bd, (q15_t)0x3e64, + (q15_t)0x31c9, (q15_t)0x3e67, (q15_t)0x31d5, (q15_t)0x3e6a, (q15_t)0x31e2, (q15_t)0x3e6c, (q15_t)0x31ee, (q15_t)0x3e6f, + (q15_t)0x31fa, (q15_t)0x3e72, (q15_t)0x3207, (q15_t)0x3e75, (q15_t)0x3213, (q15_t)0x3e77, (q15_t)0x321f, (q15_t)0x3e7a, + (q15_t)0x322b, (q15_t)0x3e7d, (q15_t)0x3238, (q15_t)0x3e80, (q15_t)0x3244, (q15_t)0x3e82, (q15_t)0x3250, (q15_t)0x3e85, + (q15_t)0x325c, (q15_t)0x3e88, (q15_t)0x3269, (q15_t)0x3e8a, (q15_t)0x3275, (q15_t)0x3e8d, (q15_t)0x3281, (q15_t)0x3e90, + (q15_t)0x328e, (q15_t)0x3e92, (q15_t)0x329a, (q15_t)0x3e95, (q15_t)0x32a6, (q15_t)0x3e98, (q15_t)0x32b2, (q15_t)0x3e9a, + (q15_t)0x32bf, (q15_t)0x3e9d, (q15_t)0x32cb, (q15_t)0x3e9f, (q15_t)0x32d7, (q15_t)0x3ea2, (q15_t)0x32e4, (q15_t)0x3ea5, + (q15_t)0x32f0, (q15_t)0x3ea7, (q15_t)0x32fc, (q15_t)0x3eaa, (q15_t)0x3308, (q15_t)0x3eac, (q15_t)0x3315, (q15_t)0x3eaf, + (q15_t)0x3321, (q15_t)0x3eb1, (q15_t)0x332d, (q15_t)0x3eb4, (q15_t)0x333a, (q15_t)0x3eb6, (q15_t)0x3346, (q15_t)0x3eb9, + (q15_t)0x3352, (q15_t)0x3ebb, (q15_t)0x335f, (q15_t)0x3ebe, (q15_t)0x336b, (q15_t)0x3ec0, (q15_t)0x3377, (q15_t)0x3ec3, + (q15_t)0x3384, (q15_t)0x3ec5, (q15_t)0x3390, (q15_t)0x3ec8, (q15_t)0x339c, (q15_t)0x3eca, (q15_t)0x33a9, (q15_t)0x3ecc, + (q15_t)0x33b5, (q15_t)0x3ecf, (q15_t)0x33c1, (q15_t)0x3ed1, (q15_t)0x33ce, (q15_t)0x3ed4, (q15_t)0x33da, (q15_t)0x3ed6, + (q15_t)0x33e6, (q15_t)0x3ed8, (q15_t)0x33f3, (q15_t)0x3edb, (q15_t)0x33ff, (q15_t)0x3edd, (q15_t)0x340b, (q15_t)0x3ee0, + (q15_t)0x3418, (q15_t)0x3ee2, (q15_t)0x3424, (q15_t)0x3ee4, (q15_t)0x3430, (q15_t)0x3ee7, (q15_t)0x343d, (q15_t)0x3ee9, + (q15_t)0x3449, (q15_t)0x3eeb, (q15_t)0x3455, (q15_t)0x3eed, (q15_t)0x3462, (q15_t)0x3ef0, (q15_t)0x346e, (q15_t)0x3ef2, + (q15_t)0x347b, (q15_t)0x3ef4, (q15_t)0x3487, (q15_t)0x3ef7, (q15_t)0x3493, (q15_t)0x3ef9, (q15_t)0x34a0, (q15_t)0x3efb, + (q15_t)0x34ac, (q15_t)0x3efd, (q15_t)0x34b8, (q15_t)0x3f00, (q15_t)0x34c5, (q15_t)0x3f02, (q15_t)0x34d1, (q15_t)0x3f04, + (q15_t)0x34dd, (q15_t)0x3f06, (q15_t)0x34ea, (q15_t)0x3f08, (q15_t)0x34f6, (q15_t)0x3f0a, (q15_t)0x3503, (q15_t)0x3f0d, + (q15_t)0x350f, (q15_t)0x3f0f, (q15_t)0x351b, (q15_t)0x3f11, (q15_t)0x3528, (q15_t)0x3f13, (q15_t)0x3534, (q15_t)0x3f15, + (q15_t)0x3540, (q15_t)0x3f17, (q15_t)0x354d, (q15_t)0x3f19, (q15_t)0x3559, (q15_t)0x3f1c, (q15_t)0x3566, (q15_t)0x3f1e, + (q15_t)0x3572, (q15_t)0x3f20, (q15_t)0x357e, (q15_t)0x3f22, (q15_t)0x358b, (q15_t)0x3f24, (q15_t)0x3597, (q15_t)0x3f26, + (q15_t)0x35a4, (q15_t)0x3f28, (q15_t)0x35b0, (q15_t)0x3f2a, (q15_t)0x35bc, (q15_t)0x3f2c, (q15_t)0x35c9, (q15_t)0x3f2e, + (q15_t)0x35d5, (q15_t)0x3f30, (q15_t)0x35e2, (q15_t)0x3f32, (q15_t)0x35ee, (q15_t)0x3f34, (q15_t)0x35fa, (q15_t)0x3f36, + (q15_t)0x3607, (q15_t)0x3f38, (q15_t)0x3613, (q15_t)0x3f3a, (q15_t)0x3620, (q15_t)0x3f3c, (q15_t)0x362c, (q15_t)0x3f3e, + (q15_t)0x3639, (q15_t)0x3f40, (q15_t)0x3645, (q15_t)0x3f42, (q15_t)0x3651, (q15_t)0x3f43, (q15_t)0x365e, (q15_t)0x3f45, + (q15_t)0x366a, (q15_t)0x3f47, (q15_t)0x3677, (q15_t)0x3f49, (q15_t)0x3683, (q15_t)0x3f4b, (q15_t)0x3690, (q15_t)0x3f4d, + (q15_t)0x369c, (q15_t)0x3f4f, (q15_t)0x36a8, (q15_t)0x3f51, (q15_t)0x36b5, (q15_t)0x3f52, (q15_t)0x36c1, (q15_t)0x3f54, + (q15_t)0x36ce, (q15_t)0x3f56, (q15_t)0x36da, (q15_t)0x3f58, (q15_t)0x36e7, (q15_t)0x3f5a, (q15_t)0x36f3, (q15_t)0x3f5b, + (q15_t)0x36ff, (q15_t)0x3f5d, (q15_t)0x370c, (q15_t)0x3f5f, (q15_t)0x3718, (q15_t)0x3f61, (q15_t)0x3725, (q15_t)0x3f62, + (q15_t)0x3731, (q15_t)0x3f64, (q15_t)0x373e, (q15_t)0x3f66, (q15_t)0x374a, (q15_t)0x3f68, (q15_t)0x3757, (q15_t)0x3f69, + (q15_t)0x3763, (q15_t)0x3f6b, (q15_t)0x376f, (q15_t)0x3f6d, (q15_t)0x377c, (q15_t)0x3f6e, (q15_t)0x3788, (q15_t)0x3f70, + (q15_t)0x3795, (q15_t)0x3f72, (q15_t)0x37a1, (q15_t)0x3f73, (q15_t)0x37ae, (q15_t)0x3f75, (q15_t)0x37ba, (q15_t)0x3f77, + (q15_t)0x37c7, (q15_t)0x3f78, (q15_t)0x37d3, (q15_t)0x3f7a, (q15_t)0x37e0, (q15_t)0x3f7b, (q15_t)0x37ec, (q15_t)0x3f7d, + (q15_t)0x37f9, (q15_t)0x3f7f, (q15_t)0x3805, (q15_t)0x3f80, (q15_t)0x3811, (q15_t)0x3f82, (q15_t)0x381e, (q15_t)0x3f83, + (q15_t)0x382a, (q15_t)0x3f85, (q15_t)0x3837, (q15_t)0x3f86, (q15_t)0x3843, (q15_t)0x3f88, (q15_t)0x3850, (q15_t)0x3f89, + (q15_t)0x385c, (q15_t)0x3f8b, (q15_t)0x3869, (q15_t)0x3f8c, (q15_t)0x3875, (q15_t)0x3f8e, (q15_t)0x3882, (q15_t)0x3f8f, + (q15_t)0x388e, (q15_t)0x3f91, (q15_t)0x389b, (q15_t)0x3f92, (q15_t)0x38a7, (q15_t)0x3f94, (q15_t)0x38b4, (q15_t)0x3f95, + (q15_t)0x38c0, (q15_t)0x3f97, (q15_t)0x38cd, (q15_t)0x3f98, (q15_t)0x38d9, (q15_t)0x3f99, (q15_t)0x38e6, (q15_t)0x3f9b, + (q15_t)0x38f2, (q15_t)0x3f9c, (q15_t)0x38ff, (q15_t)0x3f9e, (q15_t)0x390b, (q15_t)0x3f9f, (q15_t)0x3918, (q15_t)0x3fa0, + (q15_t)0x3924, (q15_t)0x3fa2, (q15_t)0x3931, (q15_t)0x3fa3, (q15_t)0x393d, (q15_t)0x3fa4, (q15_t)0x394a, (q15_t)0x3fa6, + (q15_t)0x3956, (q15_t)0x3fa7, (q15_t)0x3963, (q15_t)0x3fa8, (q15_t)0x396f, (q15_t)0x3faa, (q15_t)0x397c, (q15_t)0x3fab, + (q15_t)0x3988, (q15_t)0x3fac, (q15_t)0x3995, (q15_t)0x3fad, (q15_t)0x39a1, (q15_t)0x3faf, (q15_t)0x39ae, (q15_t)0x3fb0, + (q15_t)0x39ba, (q15_t)0x3fb1, (q15_t)0x39c7, (q15_t)0x3fb2, (q15_t)0x39d3, (q15_t)0x3fb4, (q15_t)0x39e0, (q15_t)0x3fb5, + (q15_t)0x39ec, (q15_t)0x3fb6, (q15_t)0x39f9, (q15_t)0x3fb7, (q15_t)0x3a05, (q15_t)0x3fb8, (q15_t)0x3a12, (q15_t)0x3fb9, + (q15_t)0x3a1e, (q15_t)0x3fbb, (q15_t)0x3a2b, (q15_t)0x3fbc, (q15_t)0x3a37, (q15_t)0x3fbd, (q15_t)0x3a44, (q15_t)0x3fbe, + (q15_t)0x3a50, (q15_t)0x3fbf, (q15_t)0x3a5d, (q15_t)0x3fc0, (q15_t)0x3a69, (q15_t)0x3fc1, (q15_t)0x3a76, (q15_t)0x3fc3, + (q15_t)0x3a82, (q15_t)0x3fc4, (q15_t)0x3a8f, (q15_t)0x3fc5, (q15_t)0x3a9b, (q15_t)0x3fc6, (q15_t)0x3aa8, (q15_t)0x3fc7, + (q15_t)0x3ab4, (q15_t)0x3fc8, (q15_t)0x3ac1, (q15_t)0x3fc9, (q15_t)0x3acd, (q15_t)0x3fca, (q15_t)0x3ada, (q15_t)0x3fcb, + (q15_t)0x3ae6, (q15_t)0x3fcc, (q15_t)0x3af3, (q15_t)0x3fcd, (q15_t)0x3b00, (q15_t)0x3fce, (q15_t)0x3b0c, (q15_t)0x3fcf, + (q15_t)0x3b19, (q15_t)0x3fd0, (q15_t)0x3b25, (q15_t)0x3fd1, (q15_t)0x3b32, (q15_t)0x3fd2, (q15_t)0x3b3e, (q15_t)0x3fd3, + (q15_t)0x3b4b, (q15_t)0x3fd4, (q15_t)0x3b57, (q15_t)0x3fd5, (q15_t)0x3b64, (q15_t)0x3fd5, (q15_t)0x3b70, (q15_t)0x3fd6, + (q15_t)0x3b7d, (q15_t)0x3fd7, (q15_t)0x3b89, (q15_t)0x3fd8, (q15_t)0x3b96, (q15_t)0x3fd9, (q15_t)0x3ba2, (q15_t)0x3fda, + (q15_t)0x3baf, (q15_t)0x3fdb, (q15_t)0x3bbc, (q15_t)0x3fdc, (q15_t)0x3bc8, (q15_t)0x3fdc, (q15_t)0x3bd5, (q15_t)0x3fdd, + (q15_t)0x3be1, (q15_t)0x3fde, (q15_t)0x3bee, (q15_t)0x3fdf, (q15_t)0x3bfa, (q15_t)0x3fe0, (q15_t)0x3c07, (q15_t)0x3fe0, + (q15_t)0x3c13, (q15_t)0x3fe1, (q15_t)0x3c20, (q15_t)0x3fe2, (q15_t)0x3c2c, (q15_t)0x3fe3, (q15_t)0x3c39, (q15_t)0x3fe3, + (q15_t)0x3c45, (q15_t)0x3fe4, (q15_t)0x3c52, (q15_t)0x3fe5, (q15_t)0x3c5f, (q15_t)0x3fe6, (q15_t)0x3c6b, (q15_t)0x3fe6, + (q15_t)0x3c78, (q15_t)0x3fe7, (q15_t)0x3c84, (q15_t)0x3fe8, (q15_t)0x3c91, (q15_t)0x3fe8, (q15_t)0x3c9d, (q15_t)0x3fe9, + (q15_t)0x3caa, (q15_t)0x3fea, (q15_t)0x3cb6, (q15_t)0x3fea, (q15_t)0x3cc3, (q15_t)0x3feb, (q15_t)0x3cd0, (q15_t)0x3fec, + (q15_t)0x3cdc, (q15_t)0x3fec, (q15_t)0x3ce9, (q15_t)0x3fed, (q15_t)0x3cf5, (q15_t)0x3fed, (q15_t)0x3d02, (q15_t)0x3fee, + (q15_t)0x3d0e, (q15_t)0x3fef, (q15_t)0x3d1b, (q15_t)0x3fef, (q15_t)0x3d27, (q15_t)0x3ff0, (q15_t)0x3d34, (q15_t)0x3ff0, + (q15_t)0x3d40, (q15_t)0x3ff1, (q15_t)0x3d4d, (q15_t)0x3ff1, (q15_t)0x3d5a, (q15_t)0x3ff2, (q15_t)0x3d66, (q15_t)0x3ff2, + (q15_t)0x3d73, (q15_t)0x3ff3, (q15_t)0x3d7f, (q15_t)0x3ff3, (q15_t)0x3d8c, (q15_t)0x3ff4, (q15_t)0x3d98, (q15_t)0x3ff4, + (q15_t)0x3da5, (q15_t)0x3ff5, (q15_t)0x3db2, (q15_t)0x3ff5, (q15_t)0x3dbe, (q15_t)0x3ff6, (q15_t)0x3dcb, (q15_t)0x3ff6, + (q15_t)0x3dd7, (q15_t)0x3ff7, (q15_t)0x3de4, (q15_t)0x3ff7, (q15_t)0x3df0, (q15_t)0x3ff7, (q15_t)0x3dfd, (q15_t)0x3ff8, + (q15_t)0x3e09, (q15_t)0x3ff8, (q15_t)0x3e16, (q15_t)0x3ff9, (q15_t)0x3e23, (q15_t)0x3ff9, (q15_t)0x3e2f, (q15_t)0x3ff9, + (q15_t)0x3e3c, (q15_t)0x3ffa, (q15_t)0x3e48, (q15_t)0x3ffa, (q15_t)0x3e55, (q15_t)0x3ffa, (q15_t)0x3e61, (q15_t)0x3ffb, + (q15_t)0x3e6e, (q15_t)0x3ffb, (q15_t)0x3e7a, (q15_t)0x3ffb, (q15_t)0x3e87, (q15_t)0x3ffc, (q15_t)0x3e94, (q15_t)0x3ffc, + (q15_t)0x3ea0, (q15_t)0x3ffc, (q15_t)0x3ead, (q15_t)0x3ffc, (q15_t)0x3eb9, (q15_t)0x3ffd, (q15_t)0x3ec6, (q15_t)0x3ffd, + (q15_t)0x3ed2, (q15_t)0x3ffd, (q15_t)0x3edf, (q15_t)0x3ffd, (q15_t)0x3eec, (q15_t)0x3ffe, (q15_t)0x3ef8, (q15_t)0x3ffe, + (q15_t)0x3f05, (q15_t)0x3ffe, (q15_t)0x3f11, (q15_t)0x3ffe, (q15_t)0x3f1e, (q15_t)0x3ffe, (q15_t)0x3f2a, (q15_t)0x3fff, + (q15_t)0x3f37, (q15_t)0x3fff, (q15_t)0x3f44, (q15_t)0x3fff, (q15_t)0x3f50, (q15_t)0x3fff, (q15_t)0x3f5d, (q15_t)0x3fff, + (q15_t)0x3f69, (q15_t)0x3fff, (q15_t)0x3f76, (q15_t)0x3fff, (q15_t)0x3f82, (q15_t)0x4000, (q15_t)0x3f8f, (q15_t)0x4000, + (q15_t)0x3f9b, (q15_t)0x4000, (q15_t)0x3fa8, (q15_t)0x4000, (q15_t)0x3fb5, (q15_t)0x4000, (q15_t)0x3fc1, (q15_t)0x4000, + (q15_t)0x3fce, (q15_t)0x4000, (q15_t)0x3fda, (q15_t)0x4000, (q15_t)0x3fe7, (q15_t)0x4000, (q15_t)0x3ff3, (q15_t)0x4000, +}; + +/** + @par + Generation of real_CoefB array: + @par + n = 4096 +
for (i = 0; i < n; i++)
+  {
+     pBTable[2 * i]     = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));
+     pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));
+  }
+ @par + Convert to fixed point Q15 format + round(pBTable[i] * pow(2, 15)) +*/ +const q15_t __ALIGNED(4) realCoefBQ15[8192] = { + (q15_t)0x4000, (q15_t)0x4000, (q15_t)0x400d, (q15_t)0x4000, (q15_t)0x4019, (q15_t)0x4000, (q15_t)0x4026, (q15_t)0x4000, + (q15_t)0x4032, (q15_t)0x4000, (q15_t)0x403f, (q15_t)0x4000, (q15_t)0x404b, (q15_t)0x4000, (q15_t)0x4058, (q15_t)0x4000, + (q15_t)0x4065, (q15_t)0x4000, (q15_t)0x4071, (q15_t)0x4000, (q15_t)0x407e, (q15_t)0x4000, (q15_t)0x408a, (q15_t)0x3fff, + (q15_t)0x4097, (q15_t)0x3fff, (q15_t)0x40a3, (q15_t)0x3fff, (q15_t)0x40b0, (q15_t)0x3fff, (q15_t)0x40bc, (q15_t)0x3fff, + (q15_t)0x40c9, (q15_t)0x3fff, (q15_t)0x40d6, (q15_t)0x3fff, (q15_t)0x40e2, (q15_t)0x3ffe, (q15_t)0x40ef, (q15_t)0x3ffe, + (q15_t)0x40fb, (q15_t)0x3ffe, (q15_t)0x4108, (q15_t)0x3ffe, (q15_t)0x4114, (q15_t)0x3ffe, (q15_t)0x4121, (q15_t)0x3ffd, + (q15_t)0x412e, (q15_t)0x3ffd, (q15_t)0x413a, (q15_t)0x3ffd, (q15_t)0x4147, (q15_t)0x3ffd, (q15_t)0x4153, (q15_t)0x3ffc, + (q15_t)0x4160, (q15_t)0x3ffc, (q15_t)0x416c, (q15_t)0x3ffc, (q15_t)0x4179, (q15_t)0x3ffc, (q15_t)0x4186, (q15_t)0x3ffb, + (q15_t)0x4192, (q15_t)0x3ffb, (q15_t)0x419f, (q15_t)0x3ffb, (q15_t)0x41ab, (q15_t)0x3ffa, (q15_t)0x41b8, (q15_t)0x3ffa, + (q15_t)0x41c4, (q15_t)0x3ffa, (q15_t)0x41d1, (q15_t)0x3ff9, (q15_t)0x41dd, (q15_t)0x3ff9, (q15_t)0x41ea, (q15_t)0x3ff9, + (q15_t)0x41f7, (q15_t)0x3ff8, (q15_t)0x4203, (q15_t)0x3ff8, (q15_t)0x4210, (q15_t)0x3ff7, (q15_t)0x421c, (q15_t)0x3ff7, + (q15_t)0x4229, (q15_t)0x3ff7, (q15_t)0x4235, (q15_t)0x3ff6, (q15_t)0x4242, (q15_t)0x3ff6, (q15_t)0x424e, (q15_t)0x3ff5, + (q15_t)0x425b, (q15_t)0x3ff5, (q15_t)0x4268, (q15_t)0x3ff4, (q15_t)0x4274, (q15_t)0x3ff4, (q15_t)0x4281, (q15_t)0x3ff3, + (q15_t)0x428d, (q15_t)0x3ff3, (q15_t)0x429a, (q15_t)0x3ff2, (q15_t)0x42a6, (q15_t)0x3ff2, (q15_t)0x42b3, (q15_t)0x3ff1, + (q15_t)0x42c0, (q15_t)0x3ff1, (q15_t)0x42cc, (q15_t)0x3ff0, (q15_t)0x42d9, (q15_t)0x3ff0, (q15_t)0x42e5, (q15_t)0x3fef, + (q15_t)0x42f2, (q15_t)0x3fef, (q15_t)0x42fe, (q15_t)0x3fee, (q15_t)0x430b, (q15_t)0x3fed, (q15_t)0x4317, (q15_t)0x3fed, + (q15_t)0x4324, (q15_t)0x3fec, (q15_t)0x4330, (q15_t)0x3fec, (q15_t)0x433d, (q15_t)0x3feb, (q15_t)0x434a, (q15_t)0x3fea, + (q15_t)0x4356, (q15_t)0x3fea, (q15_t)0x4363, (q15_t)0x3fe9, (q15_t)0x436f, (q15_t)0x3fe8, (q15_t)0x437c, (q15_t)0x3fe8, + (q15_t)0x4388, (q15_t)0x3fe7, (q15_t)0x4395, (q15_t)0x3fe6, (q15_t)0x43a1, (q15_t)0x3fe6, (q15_t)0x43ae, (q15_t)0x3fe5, + (q15_t)0x43bb, (q15_t)0x3fe4, (q15_t)0x43c7, (q15_t)0x3fe3, (q15_t)0x43d4, (q15_t)0x3fe3, (q15_t)0x43e0, (q15_t)0x3fe2, + (q15_t)0x43ed, (q15_t)0x3fe1, (q15_t)0x43f9, (q15_t)0x3fe0, (q15_t)0x4406, (q15_t)0x3fe0, (q15_t)0x4412, (q15_t)0x3fdf, + (q15_t)0x441f, (q15_t)0x3fde, (q15_t)0x442b, (q15_t)0x3fdd, (q15_t)0x4438, (q15_t)0x3fdc, (q15_t)0x4444, (q15_t)0x3fdc, + (q15_t)0x4451, (q15_t)0x3fdb, (q15_t)0x445e, (q15_t)0x3fda, (q15_t)0x446a, (q15_t)0x3fd9, (q15_t)0x4477, (q15_t)0x3fd8, + (q15_t)0x4483, (q15_t)0x3fd7, (q15_t)0x4490, (q15_t)0x3fd6, (q15_t)0x449c, (q15_t)0x3fd5, (q15_t)0x44a9, (q15_t)0x3fd5, + (q15_t)0x44b5, (q15_t)0x3fd4, (q15_t)0x44c2, (q15_t)0x3fd3, (q15_t)0x44ce, (q15_t)0x3fd2, (q15_t)0x44db, (q15_t)0x3fd1, + (q15_t)0x44e7, (q15_t)0x3fd0, (q15_t)0x44f4, (q15_t)0x3fcf, (q15_t)0x4500, (q15_t)0x3fce, (q15_t)0x450d, (q15_t)0x3fcd, + (q15_t)0x451a, (q15_t)0x3fcc, (q15_t)0x4526, (q15_t)0x3fcb, (q15_t)0x4533, (q15_t)0x3fca, (q15_t)0x453f, (q15_t)0x3fc9, + (q15_t)0x454c, (q15_t)0x3fc8, (q15_t)0x4558, (q15_t)0x3fc7, (q15_t)0x4565, (q15_t)0x3fc6, (q15_t)0x4571, (q15_t)0x3fc5, + (q15_t)0x457e, (q15_t)0x3fc4, (q15_t)0x458a, (q15_t)0x3fc3, (q15_t)0x4597, (q15_t)0x3fc1, (q15_t)0x45a3, (q15_t)0x3fc0, + (q15_t)0x45b0, (q15_t)0x3fbf, (q15_t)0x45bc, (q15_t)0x3fbe, (q15_t)0x45c9, (q15_t)0x3fbd, (q15_t)0x45d5, (q15_t)0x3fbc, + (q15_t)0x45e2, (q15_t)0x3fbb, (q15_t)0x45ee, (q15_t)0x3fb9, (q15_t)0x45fb, (q15_t)0x3fb8, (q15_t)0x4607, (q15_t)0x3fb7, + (q15_t)0x4614, (q15_t)0x3fb6, (q15_t)0x4620, (q15_t)0x3fb5, (q15_t)0x462d, (q15_t)0x3fb4, (q15_t)0x4639, (q15_t)0x3fb2, + (q15_t)0x4646, (q15_t)0x3fb1, (q15_t)0x4652, (q15_t)0x3fb0, (q15_t)0x465f, (q15_t)0x3faf, (q15_t)0x466b, (q15_t)0x3fad, + (q15_t)0x4678, (q15_t)0x3fac, (q15_t)0x4684, (q15_t)0x3fab, (q15_t)0x4691, (q15_t)0x3faa, (q15_t)0x469d, (q15_t)0x3fa8, + (q15_t)0x46aa, (q15_t)0x3fa7, (q15_t)0x46b6, (q15_t)0x3fa6, (q15_t)0x46c3, (q15_t)0x3fa4, (q15_t)0x46cf, (q15_t)0x3fa3, + (q15_t)0x46dc, (q15_t)0x3fa2, (q15_t)0x46e8, (q15_t)0x3fa0, (q15_t)0x46f5, (q15_t)0x3f9f, (q15_t)0x4701, (q15_t)0x3f9e, + (q15_t)0x470e, (q15_t)0x3f9c, (q15_t)0x471a, (q15_t)0x3f9b, (q15_t)0x4727, (q15_t)0x3f99, (q15_t)0x4733, (q15_t)0x3f98, + (q15_t)0x4740, (q15_t)0x3f97, (q15_t)0x474c, (q15_t)0x3f95, (q15_t)0x4759, (q15_t)0x3f94, (q15_t)0x4765, (q15_t)0x3f92, + (q15_t)0x4772, (q15_t)0x3f91, (q15_t)0x477e, (q15_t)0x3f8f, (q15_t)0x478b, (q15_t)0x3f8e, (q15_t)0x4797, (q15_t)0x3f8c, + (q15_t)0x47a4, (q15_t)0x3f8b, (q15_t)0x47b0, (q15_t)0x3f89, (q15_t)0x47bd, (q15_t)0x3f88, (q15_t)0x47c9, (q15_t)0x3f86, + (q15_t)0x47d6, (q15_t)0x3f85, (q15_t)0x47e2, (q15_t)0x3f83, (q15_t)0x47ef, (q15_t)0x3f82, (q15_t)0x47fb, (q15_t)0x3f80, + (q15_t)0x4807, (q15_t)0x3f7f, (q15_t)0x4814, (q15_t)0x3f7d, (q15_t)0x4820, (q15_t)0x3f7b, (q15_t)0x482d, (q15_t)0x3f7a, + (q15_t)0x4839, (q15_t)0x3f78, (q15_t)0x4846, (q15_t)0x3f77, (q15_t)0x4852, (q15_t)0x3f75, (q15_t)0x485f, (q15_t)0x3f73, + (q15_t)0x486b, (q15_t)0x3f72, (q15_t)0x4878, (q15_t)0x3f70, (q15_t)0x4884, (q15_t)0x3f6e, (q15_t)0x4891, (q15_t)0x3f6d, + (q15_t)0x489d, (q15_t)0x3f6b, (q15_t)0x48a9, (q15_t)0x3f69, (q15_t)0x48b6, (q15_t)0x3f68, (q15_t)0x48c2, (q15_t)0x3f66, + (q15_t)0x48cf, (q15_t)0x3f64, (q15_t)0x48db, (q15_t)0x3f62, (q15_t)0x48e8, (q15_t)0x3f61, (q15_t)0x48f4, (q15_t)0x3f5f, + (q15_t)0x4901, (q15_t)0x3f5d, (q15_t)0x490d, (q15_t)0x3f5b, (q15_t)0x4919, (q15_t)0x3f5a, (q15_t)0x4926, (q15_t)0x3f58, + (q15_t)0x4932, (q15_t)0x3f56, (q15_t)0x493f, (q15_t)0x3f54, (q15_t)0x494b, (q15_t)0x3f52, (q15_t)0x4958, (q15_t)0x3f51, + (q15_t)0x4964, (q15_t)0x3f4f, (q15_t)0x4970, (q15_t)0x3f4d, (q15_t)0x497d, (q15_t)0x3f4b, (q15_t)0x4989, (q15_t)0x3f49, + (q15_t)0x4996, (q15_t)0x3f47, (q15_t)0x49a2, (q15_t)0x3f45, (q15_t)0x49af, (q15_t)0x3f43, (q15_t)0x49bb, (q15_t)0x3f42, + (q15_t)0x49c7, (q15_t)0x3f40, (q15_t)0x49d4, (q15_t)0x3f3e, (q15_t)0x49e0, (q15_t)0x3f3c, (q15_t)0x49ed, (q15_t)0x3f3a, + (q15_t)0x49f9, (q15_t)0x3f38, (q15_t)0x4a06, (q15_t)0x3f36, (q15_t)0x4a12, (q15_t)0x3f34, (q15_t)0x4a1e, (q15_t)0x3f32, + (q15_t)0x4a2b, (q15_t)0x3f30, (q15_t)0x4a37, (q15_t)0x3f2e, (q15_t)0x4a44, (q15_t)0x3f2c, (q15_t)0x4a50, (q15_t)0x3f2a, + (q15_t)0x4a5c, (q15_t)0x3f28, (q15_t)0x4a69, (q15_t)0x3f26, (q15_t)0x4a75, (q15_t)0x3f24, (q15_t)0x4a82, (q15_t)0x3f22, + (q15_t)0x4a8e, (q15_t)0x3f20, (q15_t)0x4a9a, (q15_t)0x3f1e, (q15_t)0x4aa7, (q15_t)0x3f1c, (q15_t)0x4ab3, (q15_t)0x3f19, + (q15_t)0x4ac0, (q15_t)0x3f17, (q15_t)0x4acc, (q15_t)0x3f15, (q15_t)0x4ad8, (q15_t)0x3f13, (q15_t)0x4ae5, (q15_t)0x3f11, + (q15_t)0x4af1, (q15_t)0x3f0f, (q15_t)0x4afd, (q15_t)0x3f0d, (q15_t)0x4b0a, (q15_t)0x3f0a, (q15_t)0x4b16, (q15_t)0x3f08, + (q15_t)0x4b23, (q15_t)0x3f06, (q15_t)0x4b2f, (q15_t)0x3f04, (q15_t)0x4b3b, (q15_t)0x3f02, (q15_t)0x4b48, (q15_t)0x3f00, + (q15_t)0x4b54, (q15_t)0x3efd, (q15_t)0x4b60, (q15_t)0x3efb, (q15_t)0x4b6d, (q15_t)0x3ef9, (q15_t)0x4b79, (q15_t)0x3ef7, + (q15_t)0x4b85, (q15_t)0x3ef4, (q15_t)0x4b92, (q15_t)0x3ef2, (q15_t)0x4b9e, (q15_t)0x3ef0, (q15_t)0x4bab, (q15_t)0x3eed, + (q15_t)0x4bb7, (q15_t)0x3eeb, (q15_t)0x4bc3, (q15_t)0x3ee9, (q15_t)0x4bd0, (q15_t)0x3ee7, (q15_t)0x4bdc, (q15_t)0x3ee4, + (q15_t)0x4be8, (q15_t)0x3ee2, (q15_t)0x4bf5, (q15_t)0x3ee0, (q15_t)0x4c01, (q15_t)0x3edd, (q15_t)0x4c0d, (q15_t)0x3edb, + (q15_t)0x4c1a, (q15_t)0x3ed8, (q15_t)0x4c26, (q15_t)0x3ed6, (q15_t)0x4c32, (q15_t)0x3ed4, (q15_t)0x4c3f, (q15_t)0x3ed1, + (q15_t)0x4c4b, (q15_t)0x3ecf, (q15_t)0x4c57, (q15_t)0x3ecc, (q15_t)0x4c64, (q15_t)0x3eca, (q15_t)0x4c70, (q15_t)0x3ec8, + (q15_t)0x4c7c, (q15_t)0x3ec5, (q15_t)0x4c89, (q15_t)0x3ec3, (q15_t)0x4c95, (q15_t)0x3ec0, (q15_t)0x4ca1, (q15_t)0x3ebe, + (q15_t)0x4cae, (q15_t)0x3ebb, (q15_t)0x4cba, (q15_t)0x3eb9, (q15_t)0x4cc6, (q15_t)0x3eb6, (q15_t)0x4cd3, (q15_t)0x3eb4, + (q15_t)0x4cdf, (q15_t)0x3eb1, (q15_t)0x4ceb, (q15_t)0x3eaf, (q15_t)0x4cf8, (q15_t)0x3eac, (q15_t)0x4d04, (q15_t)0x3eaa, + (q15_t)0x4d10, (q15_t)0x3ea7, (q15_t)0x4d1c, (q15_t)0x3ea5, (q15_t)0x4d29, (q15_t)0x3ea2, (q15_t)0x4d35, (q15_t)0x3e9f, + (q15_t)0x4d41, (q15_t)0x3e9d, (q15_t)0x4d4e, (q15_t)0x3e9a, (q15_t)0x4d5a, (q15_t)0x3e98, (q15_t)0x4d66, (q15_t)0x3e95, + (q15_t)0x4d72, (q15_t)0x3e92, (q15_t)0x4d7f, (q15_t)0x3e90, (q15_t)0x4d8b, (q15_t)0x3e8d, (q15_t)0x4d97, (q15_t)0x3e8a, + (q15_t)0x4da4, (q15_t)0x3e88, (q15_t)0x4db0, (q15_t)0x3e85, (q15_t)0x4dbc, (q15_t)0x3e82, (q15_t)0x4dc8, (q15_t)0x3e80, + (q15_t)0x4dd5, (q15_t)0x3e7d, (q15_t)0x4de1, (q15_t)0x3e7a, (q15_t)0x4ded, (q15_t)0x3e77, (q15_t)0x4df9, (q15_t)0x3e75, + (q15_t)0x4e06, (q15_t)0x3e72, (q15_t)0x4e12, (q15_t)0x3e6f, (q15_t)0x4e1e, (q15_t)0x3e6c, (q15_t)0x4e2b, (q15_t)0x3e6a, + (q15_t)0x4e37, (q15_t)0x3e67, (q15_t)0x4e43, (q15_t)0x3e64, (q15_t)0x4e4f, (q15_t)0x3e61, (q15_t)0x4e5c, (q15_t)0x3e5e, + (q15_t)0x4e68, (q15_t)0x3e5c, (q15_t)0x4e74, (q15_t)0x3e59, (q15_t)0x4e80, (q15_t)0x3e56, (q15_t)0x4e8c, (q15_t)0x3e53, + (q15_t)0x4e99, (q15_t)0x3e50, (q15_t)0x4ea5, (q15_t)0x3e4d, (q15_t)0x4eb1, (q15_t)0x3e4a, (q15_t)0x4ebd, (q15_t)0x3e48, + (q15_t)0x4eca, (q15_t)0x3e45, (q15_t)0x4ed6, (q15_t)0x3e42, (q15_t)0x4ee2, (q15_t)0x3e3f, (q15_t)0x4eee, (q15_t)0x3e3c, + (q15_t)0x4efb, (q15_t)0x3e39, (q15_t)0x4f07, (q15_t)0x3e36, (q15_t)0x4f13, (q15_t)0x3e33, (q15_t)0x4f1f, (q15_t)0x3e30, + (q15_t)0x4f2b, (q15_t)0x3e2d, (q15_t)0x4f38, (q15_t)0x3e2a, (q15_t)0x4f44, (q15_t)0x3e27, (q15_t)0x4f50, (q15_t)0x3e24, + (q15_t)0x4f5c, (q15_t)0x3e21, (q15_t)0x4f68, (q15_t)0x3e1e, (q15_t)0x4f75, (q15_t)0x3e1b, (q15_t)0x4f81, (q15_t)0x3e18, + (q15_t)0x4f8d, (q15_t)0x3e15, (q15_t)0x4f99, (q15_t)0x3e12, (q15_t)0x4fa5, (q15_t)0x3e0f, (q15_t)0x4fb2, (q15_t)0x3e0c, + (q15_t)0x4fbe, (q15_t)0x3e09, (q15_t)0x4fca, (q15_t)0x3e06, (q15_t)0x4fd6, (q15_t)0x3e03, (q15_t)0x4fe2, (q15_t)0x3dff, + (q15_t)0x4fee, (q15_t)0x3dfc, (q15_t)0x4ffb, (q15_t)0x3df9, (q15_t)0x5007, (q15_t)0x3df6, (q15_t)0x5013, (q15_t)0x3df3, + (q15_t)0x501f, (q15_t)0x3df0, (q15_t)0x502b, (q15_t)0x3ded, (q15_t)0x5037, (q15_t)0x3de9, (q15_t)0x5044, (q15_t)0x3de6, + (q15_t)0x5050, (q15_t)0x3de3, (q15_t)0x505c, (q15_t)0x3de0, (q15_t)0x5068, (q15_t)0x3ddd, (q15_t)0x5074, (q15_t)0x3dd9, + (q15_t)0x5080, (q15_t)0x3dd6, (q15_t)0x508c, (q15_t)0x3dd3, (q15_t)0x5099, (q15_t)0x3dd0, (q15_t)0x50a5, (q15_t)0x3dcc, + (q15_t)0x50b1, (q15_t)0x3dc9, (q15_t)0x50bd, (q15_t)0x3dc6, (q15_t)0x50c9, (q15_t)0x3dc2, (q15_t)0x50d5, (q15_t)0x3dbf, + (q15_t)0x50e1, (q15_t)0x3dbc, (q15_t)0x50ed, (q15_t)0x3db9, (q15_t)0x50fa, (q15_t)0x3db5, (q15_t)0x5106, (q15_t)0x3db2, + (q15_t)0x5112, (q15_t)0x3daf, (q15_t)0x511e, (q15_t)0x3dab, (q15_t)0x512a, (q15_t)0x3da8, (q15_t)0x5136, (q15_t)0x3da4, + (q15_t)0x5142, (q15_t)0x3da1, (q15_t)0x514e, (q15_t)0x3d9e, (q15_t)0x515a, (q15_t)0x3d9a, (q15_t)0x5167, (q15_t)0x3d97, + (q15_t)0x5173, (q15_t)0x3d93, (q15_t)0x517f, (q15_t)0x3d90, (q15_t)0x518b, (q15_t)0x3d8d, (q15_t)0x5197, (q15_t)0x3d89, + (q15_t)0x51a3, (q15_t)0x3d86, (q15_t)0x51af, (q15_t)0x3d82, (q15_t)0x51bb, (q15_t)0x3d7f, (q15_t)0x51c7, (q15_t)0x3d7b, + (q15_t)0x51d3, (q15_t)0x3d78, (q15_t)0x51df, (q15_t)0x3d74, (q15_t)0x51eb, (q15_t)0x3d71, (q15_t)0x51f7, (q15_t)0x3d6d, + (q15_t)0x5204, (q15_t)0x3d6a, (q15_t)0x5210, (q15_t)0x3d66, (q15_t)0x521c, (q15_t)0x3d63, (q15_t)0x5228, (q15_t)0x3d5f, + (q15_t)0x5234, (q15_t)0x3d5b, (q15_t)0x5240, (q15_t)0x3d58, (q15_t)0x524c, (q15_t)0x3d54, (q15_t)0x5258, (q15_t)0x3d51, + (q15_t)0x5264, (q15_t)0x3d4d, (q15_t)0x5270, (q15_t)0x3d49, (q15_t)0x527c, (q15_t)0x3d46, (q15_t)0x5288, (q15_t)0x3d42, + (q15_t)0x5294, (q15_t)0x3d3f, (q15_t)0x52a0, (q15_t)0x3d3b, (q15_t)0x52ac, (q15_t)0x3d37, (q15_t)0x52b8, (q15_t)0x3d34, + (q15_t)0x52c4, (q15_t)0x3d30, (q15_t)0x52d0, (q15_t)0x3d2c, (q15_t)0x52dc, (q15_t)0x3d28, (q15_t)0x52e8, (q15_t)0x3d25, + (q15_t)0x52f4, (q15_t)0x3d21, (q15_t)0x5300, (q15_t)0x3d1d, (q15_t)0x530c, (q15_t)0x3d1a, (q15_t)0x5318, (q15_t)0x3d16, + (q15_t)0x5324, (q15_t)0x3d12, (q15_t)0x5330, (q15_t)0x3d0e, (q15_t)0x533c, (q15_t)0x3d0b, (q15_t)0x5348, (q15_t)0x3d07, + (q15_t)0x5354, (q15_t)0x3d03, (q15_t)0x5360, (q15_t)0x3cff, (q15_t)0x536c, (q15_t)0x3cfb, (q15_t)0x5378, (q15_t)0x3cf8, + (q15_t)0x5384, (q15_t)0x3cf4, (q15_t)0x5390, (q15_t)0x3cf0, (q15_t)0x539c, (q15_t)0x3cec, (q15_t)0x53a8, (q15_t)0x3ce8, + (q15_t)0x53b4, (q15_t)0x3ce4, (q15_t)0x53c0, (q15_t)0x3ce0, (q15_t)0x53cc, (q15_t)0x3cdd, (q15_t)0x53d8, (q15_t)0x3cd9, + (q15_t)0x53e4, (q15_t)0x3cd5, (q15_t)0x53f0, (q15_t)0x3cd1, (q15_t)0x53fb, (q15_t)0x3ccd, (q15_t)0x5407, (q15_t)0x3cc9, + (q15_t)0x5413, (q15_t)0x3cc5, (q15_t)0x541f, (q15_t)0x3cc1, (q15_t)0x542b, (q15_t)0x3cbd, (q15_t)0x5437, (q15_t)0x3cb9, + (q15_t)0x5443, (q15_t)0x3cb5, (q15_t)0x544f, (q15_t)0x3cb1, (q15_t)0x545b, (q15_t)0x3cad, (q15_t)0x5467, (q15_t)0x3ca9, + (q15_t)0x5473, (q15_t)0x3ca5, (q15_t)0x547f, (q15_t)0x3ca1, (q15_t)0x548b, (q15_t)0x3c9d, (q15_t)0x5496, (q15_t)0x3c99, + (q15_t)0x54a2, (q15_t)0x3c95, (q15_t)0x54ae, (q15_t)0x3c91, (q15_t)0x54ba, (q15_t)0x3c8d, (q15_t)0x54c6, (q15_t)0x3c89, + (q15_t)0x54d2, (q15_t)0x3c85, (q15_t)0x54de, (q15_t)0x3c81, (q15_t)0x54ea, (q15_t)0x3c7d, (q15_t)0x54f6, (q15_t)0x3c79, + (q15_t)0x5501, (q15_t)0x3c74, (q15_t)0x550d, (q15_t)0x3c70, (q15_t)0x5519, (q15_t)0x3c6c, (q15_t)0x5525, (q15_t)0x3c68, + (q15_t)0x5531, (q15_t)0x3c64, (q15_t)0x553d, (q15_t)0x3c60, (q15_t)0x5549, (q15_t)0x3c5b, (q15_t)0x5554, (q15_t)0x3c57, + (q15_t)0x5560, (q15_t)0x3c53, (q15_t)0x556c, (q15_t)0x3c4f, (q15_t)0x5578, (q15_t)0x3c4b, (q15_t)0x5584, (q15_t)0x3c46, + (q15_t)0x5590, (q15_t)0x3c42, (q15_t)0x559b, (q15_t)0x3c3e, (q15_t)0x55a7, (q15_t)0x3c3a, (q15_t)0x55b3, (q15_t)0x3c36, + (q15_t)0x55bf, (q15_t)0x3c31, (q15_t)0x55cb, (q15_t)0x3c2d, (q15_t)0x55d7, (q15_t)0x3c29, (q15_t)0x55e2, (q15_t)0x3c24, + (q15_t)0x55ee, (q15_t)0x3c20, (q15_t)0x55fa, (q15_t)0x3c1c, (q15_t)0x5606, (q15_t)0x3c17, (q15_t)0x5612, (q15_t)0x3c13, + (q15_t)0x561d, (q15_t)0x3c0f, (q15_t)0x5629, (q15_t)0x3c0a, (q15_t)0x5635, (q15_t)0x3c06, (q15_t)0x5641, (q15_t)0x3c02, + (q15_t)0x564c, (q15_t)0x3bfd, (q15_t)0x5658, (q15_t)0x3bf9, (q15_t)0x5664, (q15_t)0x3bf5, (q15_t)0x5670, (q15_t)0x3bf0, + (q15_t)0x567c, (q15_t)0x3bec, (q15_t)0x5687, (q15_t)0x3be7, (q15_t)0x5693, (q15_t)0x3be3, (q15_t)0x569f, (q15_t)0x3bde, + (q15_t)0x56ab, (q15_t)0x3bda, (q15_t)0x56b6, (q15_t)0x3bd6, (q15_t)0x56c2, (q15_t)0x3bd1, (q15_t)0x56ce, (q15_t)0x3bcd, + (q15_t)0x56da, (q15_t)0x3bc8, (q15_t)0x56e5, (q15_t)0x3bc4, (q15_t)0x56f1, (q15_t)0x3bbf, (q15_t)0x56fd, (q15_t)0x3bbb, + (q15_t)0x5709, (q15_t)0x3bb6, (q15_t)0x5714, (q15_t)0x3bb2, (q15_t)0x5720, (q15_t)0x3bad, (q15_t)0x572c, (q15_t)0x3ba9, + (q15_t)0x5737, (q15_t)0x3ba4, (q15_t)0x5743, (q15_t)0x3b9f, (q15_t)0x574f, (q15_t)0x3b9b, (q15_t)0x575b, (q15_t)0x3b96, + (q15_t)0x5766, (q15_t)0x3b92, (q15_t)0x5772, (q15_t)0x3b8d, (q15_t)0x577e, (q15_t)0x3b88, (q15_t)0x5789, (q15_t)0x3b84, + (q15_t)0x5795, (q15_t)0x3b7f, (q15_t)0x57a1, (q15_t)0x3b7b, (q15_t)0x57ac, (q15_t)0x3b76, (q15_t)0x57b8, (q15_t)0x3b71, + (q15_t)0x57c4, (q15_t)0x3b6d, (q15_t)0x57cf, (q15_t)0x3b68, (q15_t)0x57db, (q15_t)0x3b63, (q15_t)0x57e7, (q15_t)0x3b5f, + (q15_t)0x57f2, (q15_t)0x3b5a, (q15_t)0x57fe, (q15_t)0x3b55, (q15_t)0x580a, (q15_t)0x3b50, (q15_t)0x5815, (q15_t)0x3b4c, + (q15_t)0x5821, (q15_t)0x3b47, (q15_t)0x582d, (q15_t)0x3b42, (q15_t)0x5838, (q15_t)0x3b3e, (q15_t)0x5844, (q15_t)0x3b39, + (q15_t)0x584f, (q15_t)0x3b34, (q15_t)0x585b, (q15_t)0x3b2f, (q15_t)0x5867, (q15_t)0x3b2a, (q15_t)0x5872, (q15_t)0x3b26, + (q15_t)0x587e, (q15_t)0x3b21, (q15_t)0x5889, (q15_t)0x3b1c, (q15_t)0x5895, (q15_t)0x3b17, (q15_t)0x58a1, (q15_t)0x3b12, + (q15_t)0x58ac, (q15_t)0x3b0e, (q15_t)0x58b8, (q15_t)0x3b09, (q15_t)0x58c3, (q15_t)0x3b04, (q15_t)0x58cf, (q15_t)0x3aff, + (q15_t)0x58db, (q15_t)0x3afa, (q15_t)0x58e6, (q15_t)0x3af5, (q15_t)0x58f2, (q15_t)0x3af0, (q15_t)0x58fd, (q15_t)0x3aeb, + (q15_t)0x5909, (q15_t)0x3ae6, (q15_t)0x5914, (q15_t)0x3ae2, (q15_t)0x5920, (q15_t)0x3add, (q15_t)0x592c, (q15_t)0x3ad8, + (q15_t)0x5937, (q15_t)0x3ad3, (q15_t)0x5943, (q15_t)0x3ace, (q15_t)0x594e, (q15_t)0x3ac9, (q15_t)0x595a, (q15_t)0x3ac4, + (q15_t)0x5965, (q15_t)0x3abf, (q15_t)0x5971, (q15_t)0x3aba, (q15_t)0x597c, (q15_t)0x3ab5, (q15_t)0x5988, (q15_t)0x3ab0, + (q15_t)0x5993, (q15_t)0x3aab, (q15_t)0x599f, (q15_t)0x3aa6, (q15_t)0x59aa, (q15_t)0x3aa1, (q15_t)0x59b6, (q15_t)0x3a9c, + (q15_t)0x59c1, (q15_t)0x3a97, (q15_t)0x59cd, (q15_t)0x3a92, (q15_t)0x59d8, (q15_t)0x3a8d, (q15_t)0x59e4, (q15_t)0x3a88, + (q15_t)0x59ef, (q15_t)0x3a82, (q15_t)0x59fb, (q15_t)0x3a7d, (q15_t)0x5a06, (q15_t)0x3a78, (q15_t)0x5a12, (q15_t)0x3a73, + (q15_t)0x5a1d, (q15_t)0x3a6e, (q15_t)0x5a29, (q15_t)0x3a69, (q15_t)0x5a34, (q15_t)0x3a64, (q15_t)0x5a40, (q15_t)0x3a5f, + (q15_t)0x5a4b, (q15_t)0x3a59, (q15_t)0x5a57, (q15_t)0x3a54, (q15_t)0x5a62, (q15_t)0x3a4f, (q15_t)0x5a6e, (q15_t)0x3a4a, + (q15_t)0x5a79, (q15_t)0x3a45, (q15_t)0x5a84, (q15_t)0x3a3f, (q15_t)0x5a90, (q15_t)0x3a3a, (q15_t)0x5a9b, (q15_t)0x3a35, + (q15_t)0x5aa7, (q15_t)0x3a30, (q15_t)0x5ab2, (q15_t)0x3a2b, (q15_t)0x5abe, (q15_t)0x3a25, (q15_t)0x5ac9, (q15_t)0x3a20, + (q15_t)0x5ad4, (q15_t)0x3a1b, (q15_t)0x5ae0, (q15_t)0x3a16, (q15_t)0x5aeb, (q15_t)0x3a10, (q15_t)0x5af7, (q15_t)0x3a0b, + (q15_t)0x5b02, (q15_t)0x3a06, (q15_t)0x5b0d, (q15_t)0x3a00, (q15_t)0x5b19, (q15_t)0x39fb, (q15_t)0x5b24, (q15_t)0x39f6, + (q15_t)0x5b30, (q15_t)0x39f0, (q15_t)0x5b3b, (q15_t)0x39eb, (q15_t)0x5b46, (q15_t)0x39e6, (q15_t)0x5b52, (q15_t)0x39e0, + (q15_t)0x5b5d, (q15_t)0x39db, (q15_t)0x5b68, (q15_t)0x39d6, (q15_t)0x5b74, (q15_t)0x39d0, (q15_t)0x5b7f, (q15_t)0x39cb, + (q15_t)0x5b8a, (q15_t)0x39c5, (q15_t)0x5b96, (q15_t)0x39c0, (q15_t)0x5ba1, (q15_t)0x39bb, (q15_t)0x5bac, (q15_t)0x39b5, + (q15_t)0x5bb8, (q15_t)0x39b0, (q15_t)0x5bc3, (q15_t)0x39aa, (q15_t)0x5bce, (q15_t)0x39a5, (q15_t)0x5bda, (q15_t)0x399f, + (q15_t)0x5be5, (q15_t)0x399a, (q15_t)0x5bf0, (q15_t)0x3994, (q15_t)0x5bfc, (q15_t)0x398f, (q15_t)0x5c07, (q15_t)0x3989, + (q15_t)0x5c12, (q15_t)0x3984, (q15_t)0x5c1e, (q15_t)0x397e, (q15_t)0x5c29, (q15_t)0x3979, (q15_t)0x5c34, (q15_t)0x3973, + (q15_t)0x5c3f, (q15_t)0x396e, (q15_t)0x5c4b, (q15_t)0x3968, (q15_t)0x5c56, (q15_t)0x3963, (q15_t)0x5c61, (q15_t)0x395d, + (q15_t)0x5c6c, (q15_t)0x3958, (q15_t)0x5c78, (q15_t)0x3952, (q15_t)0x5c83, (q15_t)0x394c, (q15_t)0x5c8e, (q15_t)0x3947, + (q15_t)0x5c99, (q15_t)0x3941, (q15_t)0x5ca5, (q15_t)0x393b, (q15_t)0x5cb0, (q15_t)0x3936, (q15_t)0x5cbb, (q15_t)0x3930, + (q15_t)0x5cc6, (q15_t)0x392b, (q15_t)0x5cd2, (q15_t)0x3925, (q15_t)0x5cdd, (q15_t)0x391f, (q15_t)0x5ce8, (q15_t)0x391a, + (q15_t)0x5cf3, (q15_t)0x3914, (q15_t)0x5cff, (q15_t)0x390e, (q15_t)0x5d0a, (q15_t)0x3909, (q15_t)0x5d15, (q15_t)0x3903, + (q15_t)0x5d20, (q15_t)0x38fd, (q15_t)0x5d2b, (q15_t)0x38f7, (q15_t)0x5d36, (q15_t)0x38f2, (q15_t)0x5d42, (q15_t)0x38ec, + (q15_t)0x5d4d, (q15_t)0x38e6, (q15_t)0x5d58, (q15_t)0x38e0, (q15_t)0x5d63, (q15_t)0x38db, (q15_t)0x5d6e, (q15_t)0x38d5, + (q15_t)0x5d79, (q15_t)0x38cf, (q15_t)0x5d85, (q15_t)0x38c9, (q15_t)0x5d90, (q15_t)0x38c3, (q15_t)0x5d9b, (q15_t)0x38be, + (q15_t)0x5da6, (q15_t)0x38b8, (q15_t)0x5db1, (q15_t)0x38b2, (q15_t)0x5dbc, (q15_t)0x38ac, (q15_t)0x5dc7, (q15_t)0x38a6, + (q15_t)0x5dd3, (q15_t)0x38a1, (q15_t)0x5dde, (q15_t)0x389b, (q15_t)0x5de9, (q15_t)0x3895, (q15_t)0x5df4, (q15_t)0x388f, + (q15_t)0x5dff, (q15_t)0x3889, (q15_t)0x5e0a, (q15_t)0x3883, (q15_t)0x5e15, (q15_t)0x387d, (q15_t)0x5e20, (q15_t)0x3877, + (q15_t)0x5e2b, (q15_t)0x3871, (q15_t)0x5e36, (q15_t)0x386b, (q15_t)0x5e42, (q15_t)0x3866, (q15_t)0x5e4d, (q15_t)0x3860, + (q15_t)0x5e58, (q15_t)0x385a, (q15_t)0x5e63, (q15_t)0x3854, (q15_t)0x5e6e, (q15_t)0x384e, (q15_t)0x5e79, (q15_t)0x3848, + (q15_t)0x5e84, (q15_t)0x3842, (q15_t)0x5e8f, (q15_t)0x383c, (q15_t)0x5e9a, (q15_t)0x3836, (q15_t)0x5ea5, (q15_t)0x3830, + (q15_t)0x5eb0, (q15_t)0x382a, (q15_t)0x5ebb, (q15_t)0x3824, (q15_t)0x5ec6, (q15_t)0x381e, (q15_t)0x5ed1, (q15_t)0x3818, + (q15_t)0x5edc, (q15_t)0x3812, (q15_t)0x5ee7, (q15_t)0x380b, (q15_t)0x5ef2, (q15_t)0x3805, (q15_t)0x5efd, (q15_t)0x37ff, + (q15_t)0x5f08, (q15_t)0x37f9, (q15_t)0x5f13, (q15_t)0x37f3, (q15_t)0x5f1e, (q15_t)0x37ed, (q15_t)0x5f29, (q15_t)0x37e7, + (q15_t)0x5f34, (q15_t)0x37e1, (q15_t)0x5f3f, (q15_t)0x37db, (q15_t)0x5f4a, (q15_t)0x37d5, (q15_t)0x5f55, (q15_t)0x37ce, + (q15_t)0x5f60, (q15_t)0x37c8, (q15_t)0x5f6b, (q15_t)0x37c2, (q15_t)0x5f76, (q15_t)0x37bc, (q15_t)0x5f81, (q15_t)0x37b6, + (q15_t)0x5f8c, (q15_t)0x37b0, (q15_t)0x5f97, (q15_t)0x37a9, (q15_t)0x5fa2, (q15_t)0x37a3, (q15_t)0x5fac, (q15_t)0x379d, + (q15_t)0x5fb7, (q15_t)0x3797, (q15_t)0x5fc2, (q15_t)0x3790, (q15_t)0x5fcd, (q15_t)0x378a, (q15_t)0x5fd8, (q15_t)0x3784, + (q15_t)0x5fe3, (q15_t)0x377e, (q15_t)0x5fee, (q15_t)0x3777, (q15_t)0x5ff9, (q15_t)0x3771, (q15_t)0x6004, (q15_t)0x376b, + (q15_t)0x600f, (q15_t)0x3765, (q15_t)0x6019, (q15_t)0x375e, (q15_t)0x6024, (q15_t)0x3758, (q15_t)0x602f, (q15_t)0x3752, + (q15_t)0x603a, (q15_t)0x374b, (q15_t)0x6045, (q15_t)0x3745, (q15_t)0x6050, (q15_t)0x373f, (q15_t)0x605b, (q15_t)0x3738, + (q15_t)0x6065, (q15_t)0x3732, (q15_t)0x6070, (q15_t)0x372c, (q15_t)0x607b, (q15_t)0x3725, (q15_t)0x6086, (q15_t)0x371f, + (q15_t)0x6091, (q15_t)0x3718, (q15_t)0x609b, (q15_t)0x3712, (q15_t)0x60a6, (q15_t)0x370c, (q15_t)0x60b1, (q15_t)0x3705, + (q15_t)0x60bc, (q15_t)0x36ff, (q15_t)0x60c7, (q15_t)0x36f8, (q15_t)0x60d1, (q15_t)0x36f2, (q15_t)0x60dc, (q15_t)0x36eb, + (q15_t)0x60e7, (q15_t)0x36e5, (q15_t)0x60f2, (q15_t)0x36df, (q15_t)0x60fd, (q15_t)0x36d8, (q15_t)0x6107, (q15_t)0x36d2, + (q15_t)0x6112, (q15_t)0x36cb, (q15_t)0x611d, (q15_t)0x36c5, (q15_t)0x6128, (q15_t)0x36be, (q15_t)0x6132, (q15_t)0x36b8, + (q15_t)0x613d, (q15_t)0x36b1, (q15_t)0x6148, (q15_t)0x36ab, (q15_t)0x6153, (q15_t)0x36a4, (q15_t)0x615d, (q15_t)0x369d, + (q15_t)0x6168, (q15_t)0x3697, (q15_t)0x6173, (q15_t)0x3690, (q15_t)0x617d, (q15_t)0x368a, (q15_t)0x6188, (q15_t)0x3683, + (q15_t)0x6193, (q15_t)0x367d, (q15_t)0x619e, (q15_t)0x3676, (q15_t)0x61a8, (q15_t)0x366f, (q15_t)0x61b3, (q15_t)0x3669, + (q15_t)0x61be, (q15_t)0x3662, (q15_t)0x61c8, (q15_t)0x365c, (q15_t)0x61d3, (q15_t)0x3655, (q15_t)0x61de, (q15_t)0x364e, + (q15_t)0x61e8, (q15_t)0x3648, (q15_t)0x61f3, (q15_t)0x3641, (q15_t)0x61fe, (q15_t)0x363a, (q15_t)0x6208, (q15_t)0x3634, + (q15_t)0x6213, (q15_t)0x362d, (q15_t)0x621e, (q15_t)0x3626, (q15_t)0x6228, (q15_t)0x3620, (q15_t)0x6233, (q15_t)0x3619, + (q15_t)0x623d, (q15_t)0x3612, (q15_t)0x6248, (q15_t)0x360b, (q15_t)0x6253, (q15_t)0x3605, (q15_t)0x625d, (q15_t)0x35fe, + (q15_t)0x6268, (q15_t)0x35f7, (q15_t)0x6272, (q15_t)0x35f0, (q15_t)0x627d, (q15_t)0x35ea, (q15_t)0x6288, (q15_t)0x35e3, + (q15_t)0x6292, (q15_t)0x35dc, (q15_t)0x629d, (q15_t)0x35d5, (q15_t)0x62a7, (q15_t)0x35ce, (q15_t)0x62b2, (q15_t)0x35c8, + (q15_t)0x62bc, (q15_t)0x35c1, (q15_t)0x62c7, (q15_t)0x35ba, (q15_t)0x62d2, (q15_t)0x35b3, (q15_t)0x62dc, (q15_t)0x35ac, + (q15_t)0x62e7, (q15_t)0x35a5, (q15_t)0x62f1, (q15_t)0x359f, (q15_t)0x62fc, (q15_t)0x3598, (q15_t)0x6306, (q15_t)0x3591, + (q15_t)0x6311, (q15_t)0x358a, (q15_t)0x631b, (q15_t)0x3583, (q15_t)0x6326, (q15_t)0x357c, (q15_t)0x6330, (q15_t)0x3575, + (q15_t)0x633b, (q15_t)0x356e, (q15_t)0x6345, (q15_t)0x3567, (q15_t)0x6350, (q15_t)0x3561, (q15_t)0x635a, (q15_t)0x355a, + (q15_t)0x6365, (q15_t)0x3553, (q15_t)0x636f, (q15_t)0x354c, (q15_t)0x637a, (q15_t)0x3545, (q15_t)0x6384, (q15_t)0x353e, + (q15_t)0x638e, (q15_t)0x3537, (q15_t)0x6399, (q15_t)0x3530, (q15_t)0x63a3, (q15_t)0x3529, (q15_t)0x63ae, (q15_t)0x3522, + (q15_t)0x63b8, (q15_t)0x351b, (q15_t)0x63c3, (q15_t)0x3514, (q15_t)0x63cd, (q15_t)0x350d, (q15_t)0x63d7, (q15_t)0x3506, + (q15_t)0x63e2, (q15_t)0x34ff, (q15_t)0x63ec, (q15_t)0x34f8, (q15_t)0x63f7, (q15_t)0x34f1, (q15_t)0x6401, (q15_t)0x34ea, + (q15_t)0x640b, (q15_t)0x34e2, (q15_t)0x6416, (q15_t)0x34db, (q15_t)0x6420, (q15_t)0x34d4, (q15_t)0x642b, (q15_t)0x34cd, + (q15_t)0x6435, (q15_t)0x34c6, (q15_t)0x643f, (q15_t)0x34bf, (q15_t)0x644a, (q15_t)0x34b8, (q15_t)0x6454, (q15_t)0x34b1, + (q15_t)0x645e, (q15_t)0x34aa, (q15_t)0x6469, (q15_t)0x34a2, (q15_t)0x6473, (q15_t)0x349b, (q15_t)0x647d, (q15_t)0x3494, + (q15_t)0x6488, (q15_t)0x348d, (q15_t)0x6492, (q15_t)0x3486, (q15_t)0x649c, (q15_t)0x347f, (q15_t)0x64a7, (q15_t)0x3477, + (q15_t)0x64b1, (q15_t)0x3470, (q15_t)0x64bb, (q15_t)0x3469, (q15_t)0x64c5, (q15_t)0x3462, (q15_t)0x64d0, (q15_t)0x345b, + (q15_t)0x64da, (q15_t)0x3453, (q15_t)0x64e4, (q15_t)0x344c, (q15_t)0x64ef, (q15_t)0x3445, (q15_t)0x64f9, (q15_t)0x343e, + (q15_t)0x6503, (q15_t)0x3436, (q15_t)0x650d, (q15_t)0x342f, (q15_t)0x6518, (q15_t)0x3428, (q15_t)0x6522, (q15_t)0x3420, + (q15_t)0x652c, (q15_t)0x3419, (q15_t)0x6536, (q15_t)0x3412, (q15_t)0x6541, (q15_t)0x340b, (q15_t)0x654b, (q15_t)0x3403, + (q15_t)0x6555, (q15_t)0x33fc, (q15_t)0x655f, (q15_t)0x33f5, (q15_t)0x6569, (q15_t)0x33ed, (q15_t)0x6574, (q15_t)0x33e6, + (q15_t)0x657e, (q15_t)0x33df, (q15_t)0x6588, (q15_t)0x33d7, (q15_t)0x6592, (q15_t)0x33d0, (q15_t)0x659c, (q15_t)0x33c8, + (q15_t)0x65a6, (q15_t)0x33c1, (q15_t)0x65b1, (q15_t)0x33ba, (q15_t)0x65bb, (q15_t)0x33b2, (q15_t)0x65c5, (q15_t)0x33ab, + (q15_t)0x65cf, (q15_t)0x33a3, (q15_t)0x65d9, (q15_t)0x339c, (q15_t)0x65e3, (q15_t)0x3395, (q15_t)0x65ed, (q15_t)0x338d, + (q15_t)0x65f8, (q15_t)0x3386, (q15_t)0x6602, (q15_t)0x337e, (q15_t)0x660c, (q15_t)0x3377, (q15_t)0x6616, (q15_t)0x336f, + (q15_t)0x6620, (q15_t)0x3368, (q15_t)0x662a, (q15_t)0x3360, (q15_t)0x6634, (q15_t)0x3359, (q15_t)0x663e, (q15_t)0x3351, + (q15_t)0x6648, (q15_t)0x334a, (q15_t)0x6652, (q15_t)0x3342, (q15_t)0x665c, (q15_t)0x333b, (q15_t)0x6666, (q15_t)0x3333, + (q15_t)0x6671, (q15_t)0x332c, (q15_t)0x667b, (q15_t)0x3324, (q15_t)0x6685, (q15_t)0x331d, (q15_t)0x668f, (q15_t)0x3315, + (q15_t)0x6699, (q15_t)0x330d, (q15_t)0x66a3, (q15_t)0x3306, (q15_t)0x66ad, (q15_t)0x32fe, (q15_t)0x66b7, (q15_t)0x32f7, + (q15_t)0x66c1, (q15_t)0x32ef, (q15_t)0x66cb, (q15_t)0x32e7, (q15_t)0x66d5, (q15_t)0x32e0, (q15_t)0x66df, (q15_t)0x32d8, + (q15_t)0x66e9, (q15_t)0x32d0, (q15_t)0x66f3, (q15_t)0x32c9, (q15_t)0x66fd, (q15_t)0x32c1, (q15_t)0x6707, (q15_t)0x32ba, + (q15_t)0x6711, (q15_t)0x32b2, (q15_t)0x671a, (q15_t)0x32aa, (q15_t)0x6724, (q15_t)0x32a3, (q15_t)0x672e, (q15_t)0x329b, + (q15_t)0x6738, (q15_t)0x3293, (q15_t)0x6742, (q15_t)0x328b, (q15_t)0x674c, (q15_t)0x3284, (q15_t)0x6756, (q15_t)0x327c, + (q15_t)0x6760, (q15_t)0x3274, (q15_t)0x676a, (q15_t)0x326d, (q15_t)0x6774, (q15_t)0x3265, (q15_t)0x677e, (q15_t)0x325d, + (q15_t)0x6788, (q15_t)0x3255, (q15_t)0x6791, (q15_t)0x324e, (q15_t)0x679b, (q15_t)0x3246, (q15_t)0x67a5, (q15_t)0x323e, + (q15_t)0x67af, (q15_t)0x3236, (q15_t)0x67b9, (q15_t)0x322e, (q15_t)0x67c3, (q15_t)0x3227, (q15_t)0x67cd, (q15_t)0x321f, + (q15_t)0x67d6, (q15_t)0x3217, (q15_t)0x67e0, (q15_t)0x320f, (q15_t)0x67ea, (q15_t)0x3207, (q15_t)0x67f4, (q15_t)0x31ff, + (q15_t)0x67fe, (q15_t)0x31f8, (q15_t)0x6808, (q15_t)0x31f0, (q15_t)0x6811, (q15_t)0x31e8, (q15_t)0x681b, (q15_t)0x31e0, + (q15_t)0x6825, (q15_t)0x31d8, (q15_t)0x682f, (q15_t)0x31d0, (q15_t)0x6838, (q15_t)0x31c8, (q15_t)0x6842, (q15_t)0x31c0, + (q15_t)0x684c, (q15_t)0x31b9, (q15_t)0x6856, (q15_t)0x31b1, (q15_t)0x6860, (q15_t)0x31a9, (q15_t)0x6869, (q15_t)0x31a1, + (q15_t)0x6873, (q15_t)0x3199, (q15_t)0x687d, (q15_t)0x3191, (q15_t)0x6886, (q15_t)0x3189, (q15_t)0x6890, (q15_t)0x3181, + (q15_t)0x689a, (q15_t)0x3179, (q15_t)0x68a4, (q15_t)0x3171, (q15_t)0x68ad, (q15_t)0x3169, (q15_t)0x68b7, (q15_t)0x3161, + (q15_t)0x68c1, (q15_t)0x3159, (q15_t)0x68ca, (q15_t)0x3151, (q15_t)0x68d4, (q15_t)0x3149, (q15_t)0x68de, (q15_t)0x3141, + (q15_t)0x68e7, (q15_t)0x3139, (q15_t)0x68f1, (q15_t)0x3131, (q15_t)0x68fb, (q15_t)0x3129, (q15_t)0x6904, (q15_t)0x3121, + (q15_t)0x690e, (q15_t)0x3119, (q15_t)0x6918, (q15_t)0x3111, (q15_t)0x6921, (q15_t)0x3109, (q15_t)0x692b, (q15_t)0x3101, + (q15_t)0x6935, (q15_t)0x30f9, (q15_t)0x693e, (q15_t)0x30f0, (q15_t)0x6948, (q15_t)0x30e8, (q15_t)0x6951, (q15_t)0x30e0, + (q15_t)0x695b, (q15_t)0x30d8, (q15_t)0x6965, (q15_t)0x30d0, (q15_t)0x696e, (q15_t)0x30c8, (q15_t)0x6978, (q15_t)0x30c0, + (q15_t)0x6981, (q15_t)0x30b8, (q15_t)0x698b, (q15_t)0x30af, (q15_t)0x6994, (q15_t)0x30a7, (q15_t)0x699e, (q15_t)0x309f, + (q15_t)0x69a7, (q15_t)0x3097, (q15_t)0x69b1, (q15_t)0x308f, (q15_t)0x69bb, (q15_t)0x3087, (q15_t)0x69c4, (q15_t)0x307e, + (q15_t)0x69ce, (q15_t)0x3076, (q15_t)0x69d7, (q15_t)0x306e, (q15_t)0x69e1, (q15_t)0x3066, (q15_t)0x69ea, (q15_t)0x305d, + (q15_t)0x69f4, (q15_t)0x3055, (q15_t)0x69fd, (q15_t)0x304d, (q15_t)0x6a07, (q15_t)0x3045, (q15_t)0x6a10, (q15_t)0x303c, + (q15_t)0x6a1a, (q15_t)0x3034, (q15_t)0x6a23, (q15_t)0x302c, (q15_t)0x6a2c, (q15_t)0x3024, (q15_t)0x6a36, (q15_t)0x301b, + (q15_t)0x6a3f, (q15_t)0x3013, (q15_t)0x6a49, (q15_t)0x300b, (q15_t)0x6a52, (q15_t)0x3002, (q15_t)0x6a5c, (q15_t)0x2ffa, + (q15_t)0x6a65, (q15_t)0x2ff2, (q15_t)0x6a6e, (q15_t)0x2fea, (q15_t)0x6a78, (q15_t)0x2fe1, (q15_t)0x6a81, (q15_t)0x2fd9, + (q15_t)0x6a8b, (q15_t)0x2fd0, (q15_t)0x6a94, (q15_t)0x2fc8, (q15_t)0x6a9d, (q15_t)0x2fc0, (q15_t)0x6aa7, (q15_t)0x2fb7, + (q15_t)0x6ab0, (q15_t)0x2faf, (q15_t)0x6ab9, (q15_t)0x2fa7, (q15_t)0x6ac3, (q15_t)0x2f9e, (q15_t)0x6acc, (q15_t)0x2f96, + (q15_t)0x6ad6, (q15_t)0x2f8d, (q15_t)0x6adf, (q15_t)0x2f85, (q15_t)0x6ae8, (q15_t)0x2f7d, (q15_t)0x6af2, (q15_t)0x2f74, + (q15_t)0x6afb, (q15_t)0x2f6c, (q15_t)0x6b04, (q15_t)0x2f63, (q15_t)0x6b0d, (q15_t)0x2f5b, (q15_t)0x6b17, (q15_t)0x2f52, + (q15_t)0x6b20, (q15_t)0x2f4a, (q15_t)0x6b29, (q15_t)0x2f41, (q15_t)0x6b33, (q15_t)0x2f39, (q15_t)0x6b3c, (q15_t)0x2f30, + (q15_t)0x6b45, (q15_t)0x2f28, (q15_t)0x6b4e, (q15_t)0x2f20, (q15_t)0x6b58, (q15_t)0x2f17, (q15_t)0x6b61, (q15_t)0x2f0e, + (q15_t)0x6b6a, (q15_t)0x2f06, (q15_t)0x6b73, (q15_t)0x2efd, (q15_t)0x6b7d, (q15_t)0x2ef5, (q15_t)0x6b86, (q15_t)0x2eec, + (q15_t)0x6b8f, (q15_t)0x2ee4, (q15_t)0x6b98, (q15_t)0x2edb, (q15_t)0x6ba1, (q15_t)0x2ed3, (q15_t)0x6bab, (q15_t)0x2eca, + (q15_t)0x6bb4, (q15_t)0x2ec2, (q15_t)0x6bbd, (q15_t)0x2eb9, (q15_t)0x6bc6, (q15_t)0x2eb0, (q15_t)0x6bcf, (q15_t)0x2ea8, + (q15_t)0x6bd8, (q15_t)0x2e9f, (q15_t)0x6be2, (q15_t)0x2e97, (q15_t)0x6beb, (q15_t)0x2e8e, (q15_t)0x6bf4, (q15_t)0x2e85, + (q15_t)0x6bfd, (q15_t)0x2e7d, (q15_t)0x6c06, (q15_t)0x2e74, (q15_t)0x6c0f, (q15_t)0x2e6b, (q15_t)0x6c18, (q15_t)0x2e63, + (q15_t)0x6c21, (q15_t)0x2e5a, (q15_t)0x6c2b, (q15_t)0x2e51, (q15_t)0x6c34, (q15_t)0x2e49, (q15_t)0x6c3d, (q15_t)0x2e40, + (q15_t)0x6c46, (q15_t)0x2e37, (q15_t)0x6c4f, (q15_t)0x2e2f, (q15_t)0x6c58, (q15_t)0x2e26, (q15_t)0x6c61, (q15_t)0x2e1d, + (q15_t)0x6c6a, (q15_t)0x2e15, (q15_t)0x6c73, (q15_t)0x2e0c, (q15_t)0x6c7c, (q15_t)0x2e03, (q15_t)0x6c85, (q15_t)0x2dfa, + (q15_t)0x6c8e, (q15_t)0x2df2, (q15_t)0x6c97, (q15_t)0x2de9, (q15_t)0x6ca0, (q15_t)0x2de0, (q15_t)0x6ca9, (q15_t)0x2dd7, + (q15_t)0x6cb2, (q15_t)0x2dcf, (q15_t)0x6cbb, (q15_t)0x2dc6, (q15_t)0x6cc4, (q15_t)0x2dbd, (q15_t)0x6ccd, (q15_t)0x2db4, + (q15_t)0x6cd6, (q15_t)0x2dab, (q15_t)0x6cdf, (q15_t)0x2da3, (q15_t)0x6ce8, (q15_t)0x2d9a, (q15_t)0x6cf1, (q15_t)0x2d91, + (q15_t)0x6cfa, (q15_t)0x2d88, (q15_t)0x6d03, (q15_t)0x2d7f, (q15_t)0x6d0c, (q15_t)0x2d76, (q15_t)0x6d15, (q15_t)0x2d6e, + (q15_t)0x6d1e, (q15_t)0x2d65, (q15_t)0x6d27, (q15_t)0x2d5c, (q15_t)0x6d2f, (q15_t)0x2d53, (q15_t)0x6d38, (q15_t)0x2d4a, + (q15_t)0x6d41, (q15_t)0x2d41, (q15_t)0x6d4a, (q15_t)0x2d38, (q15_t)0x6d53, (q15_t)0x2d2f, (q15_t)0x6d5c, (q15_t)0x2d27, + (q15_t)0x6d65, (q15_t)0x2d1e, (q15_t)0x6d6e, (q15_t)0x2d15, (q15_t)0x6d76, (q15_t)0x2d0c, (q15_t)0x6d7f, (q15_t)0x2d03, + (q15_t)0x6d88, (q15_t)0x2cfa, (q15_t)0x6d91, (q15_t)0x2cf1, (q15_t)0x6d9a, (q15_t)0x2ce8, (q15_t)0x6da3, (q15_t)0x2cdf, + (q15_t)0x6dab, (q15_t)0x2cd6, (q15_t)0x6db4, (q15_t)0x2ccd, (q15_t)0x6dbd, (q15_t)0x2cc4, (q15_t)0x6dc6, (q15_t)0x2cbb, + (q15_t)0x6dcf, (q15_t)0x2cb2, (q15_t)0x6dd7, (q15_t)0x2ca9, (q15_t)0x6de0, (q15_t)0x2ca0, (q15_t)0x6de9, (q15_t)0x2c97, + (q15_t)0x6df2, (q15_t)0x2c8e, (q15_t)0x6dfa, (q15_t)0x2c85, (q15_t)0x6e03, (q15_t)0x2c7c, (q15_t)0x6e0c, (q15_t)0x2c73, + (q15_t)0x6e15, (q15_t)0x2c6a, (q15_t)0x6e1d, (q15_t)0x2c61, (q15_t)0x6e26, (q15_t)0x2c58, (q15_t)0x6e2f, (q15_t)0x2c4f, + (q15_t)0x6e37, (q15_t)0x2c46, (q15_t)0x6e40, (q15_t)0x2c3d, (q15_t)0x6e49, (q15_t)0x2c34, (q15_t)0x6e51, (q15_t)0x2c2b, + (q15_t)0x6e5a, (q15_t)0x2c21, (q15_t)0x6e63, (q15_t)0x2c18, (q15_t)0x6e6b, (q15_t)0x2c0f, (q15_t)0x6e74, (q15_t)0x2c06, + (q15_t)0x6e7d, (q15_t)0x2bfd, (q15_t)0x6e85, (q15_t)0x2bf4, (q15_t)0x6e8e, (q15_t)0x2beb, (q15_t)0x6e97, (q15_t)0x2be2, + (q15_t)0x6e9f, (q15_t)0x2bd8, (q15_t)0x6ea8, (q15_t)0x2bcf, (q15_t)0x6eb0, (q15_t)0x2bc6, (q15_t)0x6eb9, (q15_t)0x2bbd, + (q15_t)0x6ec2, (q15_t)0x2bb4, (q15_t)0x6eca, (q15_t)0x2bab, (q15_t)0x6ed3, (q15_t)0x2ba1, (q15_t)0x6edb, (q15_t)0x2b98, + (q15_t)0x6ee4, (q15_t)0x2b8f, (q15_t)0x6eec, (q15_t)0x2b86, (q15_t)0x6ef5, (q15_t)0x2b7d, (q15_t)0x6efd, (q15_t)0x2b73, + (q15_t)0x6f06, (q15_t)0x2b6a, (q15_t)0x6f0e, (q15_t)0x2b61, (q15_t)0x6f17, (q15_t)0x2b58, (q15_t)0x6f20, (q15_t)0x2b4e, + (q15_t)0x6f28, (q15_t)0x2b45, (q15_t)0x6f30, (q15_t)0x2b3c, (q15_t)0x6f39, (q15_t)0x2b33, (q15_t)0x6f41, (q15_t)0x2b29, + (q15_t)0x6f4a, (q15_t)0x2b20, (q15_t)0x6f52, (q15_t)0x2b17, (q15_t)0x6f5b, (q15_t)0x2b0d, (q15_t)0x6f63, (q15_t)0x2b04, + (q15_t)0x6f6c, (q15_t)0x2afb, (q15_t)0x6f74, (q15_t)0x2af2, (q15_t)0x6f7d, (q15_t)0x2ae8, (q15_t)0x6f85, (q15_t)0x2adf, + (q15_t)0x6f8d, (q15_t)0x2ad6, (q15_t)0x6f96, (q15_t)0x2acc, (q15_t)0x6f9e, (q15_t)0x2ac3, (q15_t)0x6fa7, (q15_t)0x2ab9, + (q15_t)0x6faf, (q15_t)0x2ab0, (q15_t)0x6fb7, (q15_t)0x2aa7, (q15_t)0x6fc0, (q15_t)0x2a9d, (q15_t)0x6fc8, (q15_t)0x2a94, + (q15_t)0x6fd0, (q15_t)0x2a8b, (q15_t)0x6fd9, (q15_t)0x2a81, (q15_t)0x6fe1, (q15_t)0x2a78, (q15_t)0x6fea, (q15_t)0x2a6e, + (q15_t)0x6ff2, (q15_t)0x2a65, (q15_t)0x6ffa, (q15_t)0x2a5c, (q15_t)0x7002, (q15_t)0x2a52, (q15_t)0x700b, (q15_t)0x2a49, + (q15_t)0x7013, (q15_t)0x2a3f, (q15_t)0x701b, (q15_t)0x2a36, (q15_t)0x7024, (q15_t)0x2a2c, (q15_t)0x702c, (q15_t)0x2a23, + (q15_t)0x7034, (q15_t)0x2a1a, (q15_t)0x703c, (q15_t)0x2a10, (q15_t)0x7045, (q15_t)0x2a07, (q15_t)0x704d, (q15_t)0x29fd, + (q15_t)0x7055, (q15_t)0x29f4, (q15_t)0x705d, (q15_t)0x29ea, (q15_t)0x7066, (q15_t)0x29e1, (q15_t)0x706e, (q15_t)0x29d7, + (q15_t)0x7076, (q15_t)0x29ce, (q15_t)0x707e, (q15_t)0x29c4, (q15_t)0x7087, (q15_t)0x29bb, (q15_t)0x708f, (q15_t)0x29b1, + (q15_t)0x7097, (q15_t)0x29a7, (q15_t)0x709f, (q15_t)0x299e, (q15_t)0x70a7, (q15_t)0x2994, (q15_t)0x70af, (q15_t)0x298b, + (q15_t)0x70b8, (q15_t)0x2981, (q15_t)0x70c0, (q15_t)0x2978, (q15_t)0x70c8, (q15_t)0x296e, (q15_t)0x70d0, (q15_t)0x2965, + (q15_t)0x70d8, (q15_t)0x295b, (q15_t)0x70e0, (q15_t)0x2951, (q15_t)0x70e8, (q15_t)0x2948, (q15_t)0x70f0, (q15_t)0x293e, + (q15_t)0x70f9, (q15_t)0x2935, (q15_t)0x7101, (q15_t)0x292b, (q15_t)0x7109, (q15_t)0x2921, (q15_t)0x7111, (q15_t)0x2918, + (q15_t)0x7119, (q15_t)0x290e, (q15_t)0x7121, (q15_t)0x2904, (q15_t)0x7129, (q15_t)0x28fb, (q15_t)0x7131, (q15_t)0x28f1, + (q15_t)0x7139, (q15_t)0x28e7, (q15_t)0x7141, (q15_t)0x28de, (q15_t)0x7149, (q15_t)0x28d4, (q15_t)0x7151, (q15_t)0x28ca, + (q15_t)0x7159, (q15_t)0x28c1, (q15_t)0x7161, (q15_t)0x28b7, (q15_t)0x7169, (q15_t)0x28ad, (q15_t)0x7171, (q15_t)0x28a4, + (q15_t)0x7179, (q15_t)0x289a, (q15_t)0x7181, (q15_t)0x2890, (q15_t)0x7189, (q15_t)0x2886, (q15_t)0x7191, (q15_t)0x287d, + (q15_t)0x7199, (q15_t)0x2873, (q15_t)0x71a1, (q15_t)0x2869, (q15_t)0x71a9, (q15_t)0x2860, (q15_t)0x71b1, (q15_t)0x2856, + (q15_t)0x71b9, (q15_t)0x284c, (q15_t)0x71c0, (q15_t)0x2842, (q15_t)0x71c8, (q15_t)0x2838, (q15_t)0x71d0, (q15_t)0x282f, + (q15_t)0x71d8, (q15_t)0x2825, (q15_t)0x71e0, (q15_t)0x281b, (q15_t)0x71e8, (q15_t)0x2811, (q15_t)0x71f0, (q15_t)0x2808, + (q15_t)0x71f8, (q15_t)0x27fe, (q15_t)0x71ff, (q15_t)0x27f4, (q15_t)0x7207, (q15_t)0x27ea, (q15_t)0x720f, (q15_t)0x27e0, + (q15_t)0x7217, (q15_t)0x27d6, (q15_t)0x721f, (q15_t)0x27cd, (q15_t)0x7227, (q15_t)0x27c3, (q15_t)0x722e, (q15_t)0x27b9, + (q15_t)0x7236, (q15_t)0x27af, (q15_t)0x723e, (q15_t)0x27a5, (q15_t)0x7246, (q15_t)0x279b, (q15_t)0x724e, (q15_t)0x2791, + (q15_t)0x7255, (q15_t)0x2788, (q15_t)0x725d, (q15_t)0x277e, (q15_t)0x7265, (q15_t)0x2774, (q15_t)0x726d, (q15_t)0x276a, + (q15_t)0x7274, (q15_t)0x2760, (q15_t)0x727c, (q15_t)0x2756, (q15_t)0x7284, (q15_t)0x274c, (q15_t)0x728b, (q15_t)0x2742, + (q15_t)0x7293, (q15_t)0x2738, (q15_t)0x729b, (q15_t)0x272e, (q15_t)0x72a3, (q15_t)0x2724, (q15_t)0x72aa, (q15_t)0x271a, + (q15_t)0x72b2, (q15_t)0x2711, (q15_t)0x72ba, (q15_t)0x2707, (q15_t)0x72c1, (q15_t)0x26fd, (q15_t)0x72c9, (q15_t)0x26f3, + (q15_t)0x72d0, (q15_t)0x26e9, (q15_t)0x72d8, (q15_t)0x26df, (q15_t)0x72e0, (q15_t)0x26d5, (q15_t)0x72e7, (q15_t)0x26cb, + (q15_t)0x72ef, (q15_t)0x26c1, (q15_t)0x72f7, (q15_t)0x26b7, (q15_t)0x72fe, (q15_t)0x26ad, (q15_t)0x7306, (q15_t)0x26a3, + (q15_t)0x730d, (q15_t)0x2699, (q15_t)0x7315, (q15_t)0x268f, (q15_t)0x731d, (q15_t)0x2685, (q15_t)0x7324, (q15_t)0x267b, + (q15_t)0x732c, (q15_t)0x2671, (q15_t)0x7333, (q15_t)0x2666, (q15_t)0x733b, (q15_t)0x265c, (q15_t)0x7342, (q15_t)0x2652, + (q15_t)0x734a, (q15_t)0x2648, (q15_t)0x7351, (q15_t)0x263e, (q15_t)0x7359, (q15_t)0x2634, (q15_t)0x7360, (q15_t)0x262a, + (q15_t)0x7368, (q15_t)0x2620, (q15_t)0x736f, (q15_t)0x2616, (q15_t)0x7377, (q15_t)0x260c, (q15_t)0x737e, (q15_t)0x2602, + (q15_t)0x7386, (q15_t)0x25f8, (q15_t)0x738d, (q15_t)0x25ed, (q15_t)0x7395, (q15_t)0x25e3, (q15_t)0x739c, (q15_t)0x25d9, + (q15_t)0x73a3, (q15_t)0x25cf, (q15_t)0x73ab, (q15_t)0x25c5, (q15_t)0x73b2, (q15_t)0x25bb, (q15_t)0x73ba, (q15_t)0x25b1, + (q15_t)0x73c1, (q15_t)0x25a6, (q15_t)0x73c8, (q15_t)0x259c, (q15_t)0x73d0, (q15_t)0x2592, (q15_t)0x73d7, (q15_t)0x2588, + (q15_t)0x73df, (q15_t)0x257e, (q15_t)0x73e6, (q15_t)0x2574, (q15_t)0x73ed, (q15_t)0x2569, (q15_t)0x73f5, (q15_t)0x255f, + (q15_t)0x73fc, (q15_t)0x2555, (q15_t)0x7403, (q15_t)0x254b, (q15_t)0x740b, (q15_t)0x2541, (q15_t)0x7412, (q15_t)0x2536, + (q15_t)0x7419, (q15_t)0x252c, (q15_t)0x7420, (q15_t)0x2522, (q15_t)0x7428, (q15_t)0x2518, (q15_t)0x742f, (q15_t)0x250d, + (q15_t)0x7436, (q15_t)0x2503, (q15_t)0x743e, (q15_t)0x24f9, (q15_t)0x7445, (q15_t)0x24ef, (q15_t)0x744c, (q15_t)0x24e4, + (q15_t)0x7453, (q15_t)0x24da, (q15_t)0x745b, (q15_t)0x24d0, (q15_t)0x7462, (q15_t)0x24c5, (q15_t)0x7469, (q15_t)0x24bb, + (q15_t)0x7470, (q15_t)0x24b1, (q15_t)0x7477, (q15_t)0x24a7, (q15_t)0x747f, (q15_t)0x249c, (q15_t)0x7486, (q15_t)0x2492, + (q15_t)0x748d, (q15_t)0x2488, (q15_t)0x7494, (q15_t)0x247d, (q15_t)0x749b, (q15_t)0x2473, (q15_t)0x74a2, (q15_t)0x2469, + (q15_t)0x74aa, (q15_t)0x245e, (q15_t)0x74b1, (q15_t)0x2454, (q15_t)0x74b8, (q15_t)0x244a, (q15_t)0x74bf, (q15_t)0x243f, + (q15_t)0x74c6, (q15_t)0x2435, (q15_t)0x74cd, (q15_t)0x242b, (q15_t)0x74d4, (q15_t)0x2420, (q15_t)0x74db, (q15_t)0x2416, + (q15_t)0x74e2, (q15_t)0x240b, (q15_t)0x74ea, (q15_t)0x2401, (q15_t)0x74f1, (q15_t)0x23f7, (q15_t)0x74f8, (q15_t)0x23ec, + (q15_t)0x74ff, (q15_t)0x23e2, (q15_t)0x7506, (q15_t)0x23d7, (q15_t)0x750d, (q15_t)0x23cd, (q15_t)0x7514, (q15_t)0x23c3, + (q15_t)0x751b, (q15_t)0x23b8, (q15_t)0x7522, (q15_t)0x23ae, (q15_t)0x7529, (q15_t)0x23a3, (q15_t)0x7530, (q15_t)0x2399, + (q15_t)0x7537, (q15_t)0x238e, (q15_t)0x753e, (q15_t)0x2384, (q15_t)0x7545, (q15_t)0x237a, (q15_t)0x754c, (q15_t)0x236f, + (q15_t)0x7553, (q15_t)0x2365, (q15_t)0x755a, (q15_t)0x235a, (q15_t)0x7561, (q15_t)0x2350, (q15_t)0x7567, (q15_t)0x2345, + (q15_t)0x756e, (q15_t)0x233b, (q15_t)0x7575, (q15_t)0x2330, (q15_t)0x757c, (q15_t)0x2326, (q15_t)0x7583, (q15_t)0x231b, + (q15_t)0x758a, (q15_t)0x2311, (q15_t)0x7591, (q15_t)0x2306, (q15_t)0x7598, (q15_t)0x22fc, (q15_t)0x759f, (q15_t)0x22f1, + (q15_t)0x75a5, (q15_t)0x22e7, (q15_t)0x75ac, (q15_t)0x22dc, (q15_t)0x75b3, (q15_t)0x22d2, (q15_t)0x75ba, (q15_t)0x22c7, + (q15_t)0x75c1, (q15_t)0x22bc, (q15_t)0x75c8, (q15_t)0x22b2, (q15_t)0x75ce, (q15_t)0x22a7, (q15_t)0x75d5, (q15_t)0x229d, + (q15_t)0x75dc, (q15_t)0x2292, (q15_t)0x75e3, (q15_t)0x2288, (q15_t)0x75ea, (q15_t)0x227d, (q15_t)0x75f0, (q15_t)0x2272, + (q15_t)0x75f7, (q15_t)0x2268, (q15_t)0x75fe, (q15_t)0x225d, (q15_t)0x7605, (q15_t)0x2253, (q15_t)0x760b, (q15_t)0x2248, + (q15_t)0x7612, (q15_t)0x223d, (q15_t)0x7619, (q15_t)0x2233, (q15_t)0x7620, (q15_t)0x2228, (q15_t)0x7626, (q15_t)0x221e, + (q15_t)0x762d, (q15_t)0x2213, (q15_t)0x7634, (q15_t)0x2208, (q15_t)0x763a, (q15_t)0x21fe, (q15_t)0x7641, (q15_t)0x21f3, + (q15_t)0x7648, (q15_t)0x21e8, (q15_t)0x764e, (q15_t)0x21de, (q15_t)0x7655, (q15_t)0x21d3, (q15_t)0x765c, (q15_t)0x21c8, + (q15_t)0x7662, (q15_t)0x21be, (q15_t)0x7669, (q15_t)0x21b3, (q15_t)0x766f, (q15_t)0x21a8, (q15_t)0x7676, (q15_t)0x219e, + (q15_t)0x767d, (q15_t)0x2193, (q15_t)0x7683, (q15_t)0x2188, (q15_t)0x768a, (q15_t)0x217d, (q15_t)0x7690, (q15_t)0x2173, + (q15_t)0x7697, (q15_t)0x2168, (q15_t)0x769d, (q15_t)0x215d, (q15_t)0x76a4, (q15_t)0x2153, (q15_t)0x76ab, (q15_t)0x2148, + (q15_t)0x76b1, (q15_t)0x213d, (q15_t)0x76b8, (q15_t)0x2132, (q15_t)0x76be, (q15_t)0x2128, (q15_t)0x76c5, (q15_t)0x211d, + (q15_t)0x76cb, (q15_t)0x2112, (q15_t)0x76d2, (q15_t)0x2107, (q15_t)0x76d8, (q15_t)0x20fd, (q15_t)0x76df, (q15_t)0x20f2, + (q15_t)0x76e5, (q15_t)0x20e7, (q15_t)0x76eb, (q15_t)0x20dc, (q15_t)0x76f2, (q15_t)0x20d1, (q15_t)0x76f8, (q15_t)0x20c7, + (q15_t)0x76ff, (q15_t)0x20bc, (q15_t)0x7705, (q15_t)0x20b1, (q15_t)0x770c, (q15_t)0x20a6, (q15_t)0x7712, (q15_t)0x209b, + (q15_t)0x7718, (q15_t)0x2091, (q15_t)0x771f, (q15_t)0x2086, (q15_t)0x7725, (q15_t)0x207b, (q15_t)0x772c, (q15_t)0x2070, + (q15_t)0x7732, (q15_t)0x2065, (q15_t)0x7738, (q15_t)0x205b, (q15_t)0x773f, (q15_t)0x2050, (q15_t)0x7745, (q15_t)0x2045, + (q15_t)0x774b, (q15_t)0x203a, (q15_t)0x7752, (q15_t)0x202f, (q15_t)0x7758, (q15_t)0x2024, (q15_t)0x775e, (q15_t)0x2019, + (q15_t)0x7765, (q15_t)0x200f, (q15_t)0x776b, (q15_t)0x2004, (q15_t)0x7771, (q15_t)0x1ff9, (q15_t)0x7777, (q15_t)0x1fee, + (q15_t)0x777e, (q15_t)0x1fe3, (q15_t)0x7784, (q15_t)0x1fd8, (q15_t)0x778a, (q15_t)0x1fcd, (q15_t)0x7790, (q15_t)0x1fc2, + (q15_t)0x7797, (q15_t)0x1fb7, (q15_t)0x779d, (q15_t)0x1fac, (q15_t)0x77a3, (q15_t)0x1fa2, (q15_t)0x77a9, (q15_t)0x1f97, + (q15_t)0x77b0, (q15_t)0x1f8c, (q15_t)0x77b6, (q15_t)0x1f81, (q15_t)0x77bc, (q15_t)0x1f76, (q15_t)0x77c2, (q15_t)0x1f6b, + (q15_t)0x77c8, (q15_t)0x1f60, (q15_t)0x77ce, (q15_t)0x1f55, (q15_t)0x77d5, (q15_t)0x1f4a, (q15_t)0x77db, (q15_t)0x1f3f, + (q15_t)0x77e1, (q15_t)0x1f34, (q15_t)0x77e7, (q15_t)0x1f29, (q15_t)0x77ed, (q15_t)0x1f1e, (q15_t)0x77f3, (q15_t)0x1f13, + (q15_t)0x77f9, (q15_t)0x1f08, (q15_t)0x77ff, (q15_t)0x1efd, (q15_t)0x7805, (q15_t)0x1ef2, (q15_t)0x780b, (q15_t)0x1ee7, + (q15_t)0x7812, (q15_t)0x1edc, (q15_t)0x7818, (q15_t)0x1ed1, (q15_t)0x781e, (q15_t)0x1ec6, (q15_t)0x7824, (q15_t)0x1ebb, + (q15_t)0x782a, (q15_t)0x1eb0, (q15_t)0x7830, (q15_t)0x1ea5, (q15_t)0x7836, (q15_t)0x1e9a, (q15_t)0x783c, (q15_t)0x1e8f, + (q15_t)0x7842, (q15_t)0x1e84, (q15_t)0x7848, (q15_t)0x1e79, (q15_t)0x784e, (q15_t)0x1e6e, (q15_t)0x7854, (q15_t)0x1e63, + (q15_t)0x785a, (q15_t)0x1e58, (q15_t)0x7860, (q15_t)0x1e4d, (q15_t)0x7866, (q15_t)0x1e42, (q15_t)0x786b, (q15_t)0x1e36, + (q15_t)0x7871, (q15_t)0x1e2b, (q15_t)0x7877, (q15_t)0x1e20, (q15_t)0x787d, (q15_t)0x1e15, (q15_t)0x7883, (q15_t)0x1e0a, + (q15_t)0x7889, (q15_t)0x1dff, (q15_t)0x788f, (q15_t)0x1df4, (q15_t)0x7895, (q15_t)0x1de9, (q15_t)0x789b, (q15_t)0x1dde, + (q15_t)0x78a1, (q15_t)0x1dd3, (q15_t)0x78a6, (q15_t)0x1dc7, (q15_t)0x78ac, (q15_t)0x1dbc, (q15_t)0x78b2, (q15_t)0x1db1, + (q15_t)0x78b8, (q15_t)0x1da6, (q15_t)0x78be, (q15_t)0x1d9b, (q15_t)0x78c3, (q15_t)0x1d90, (q15_t)0x78c9, (q15_t)0x1d85, + (q15_t)0x78cf, (q15_t)0x1d79, (q15_t)0x78d5, (q15_t)0x1d6e, (q15_t)0x78db, (q15_t)0x1d63, (q15_t)0x78e0, (q15_t)0x1d58, + (q15_t)0x78e6, (q15_t)0x1d4d, (q15_t)0x78ec, (q15_t)0x1d42, (q15_t)0x78f2, (q15_t)0x1d36, (q15_t)0x78f7, (q15_t)0x1d2b, + (q15_t)0x78fd, (q15_t)0x1d20, (q15_t)0x7903, (q15_t)0x1d15, (q15_t)0x7909, (q15_t)0x1d0a, (q15_t)0x790e, (q15_t)0x1cff, + (q15_t)0x7914, (q15_t)0x1cf3, (q15_t)0x791a, (q15_t)0x1ce8, (q15_t)0x791f, (q15_t)0x1cdd, (q15_t)0x7925, (q15_t)0x1cd2, + (q15_t)0x792b, (q15_t)0x1cc6, (q15_t)0x7930, (q15_t)0x1cbb, (q15_t)0x7936, (q15_t)0x1cb0, (q15_t)0x793b, (q15_t)0x1ca5, + (q15_t)0x7941, (q15_t)0x1c99, (q15_t)0x7947, (q15_t)0x1c8e, (q15_t)0x794c, (q15_t)0x1c83, (q15_t)0x7952, (q15_t)0x1c78, + (q15_t)0x7958, (q15_t)0x1c6c, (q15_t)0x795d, (q15_t)0x1c61, (q15_t)0x7963, (q15_t)0x1c56, (q15_t)0x7968, (q15_t)0x1c4b, + (q15_t)0x796e, (q15_t)0x1c3f, (q15_t)0x7973, (q15_t)0x1c34, (q15_t)0x7979, (q15_t)0x1c29, (q15_t)0x797e, (q15_t)0x1c1e, + (q15_t)0x7984, (q15_t)0x1c12, (q15_t)0x7989, (q15_t)0x1c07, (q15_t)0x798f, (q15_t)0x1bfc, (q15_t)0x7994, (q15_t)0x1bf0, + (q15_t)0x799a, (q15_t)0x1be5, (q15_t)0x799f, (q15_t)0x1bda, (q15_t)0x79a5, (q15_t)0x1bce, (q15_t)0x79aa, (q15_t)0x1bc3, + (q15_t)0x79b0, (q15_t)0x1bb8, (q15_t)0x79b5, (q15_t)0x1bac, (q15_t)0x79bb, (q15_t)0x1ba1, (q15_t)0x79c0, (q15_t)0x1b96, + (q15_t)0x79c5, (q15_t)0x1b8a, (q15_t)0x79cb, (q15_t)0x1b7f, (q15_t)0x79d0, (q15_t)0x1b74, (q15_t)0x79d6, (q15_t)0x1b68, + (q15_t)0x79db, (q15_t)0x1b5d, (q15_t)0x79e0, (q15_t)0x1b52, (q15_t)0x79e6, (q15_t)0x1b46, (q15_t)0x79eb, (q15_t)0x1b3b, + (q15_t)0x79f0, (q15_t)0x1b30, (q15_t)0x79f6, (q15_t)0x1b24, (q15_t)0x79fb, (q15_t)0x1b19, (q15_t)0x7a00, (q15_t)0x1b0d, + (q15_t)0x7a06, (q15_t)0x1b02, (q15_t)0x7a0b, (q15_t)0x1af7, (q15_t)0x7a10, (q15_t)0x1aeb, (q15_t)0x7a16, (q15_t)0x1ae0, + (q15_t)0x7a1b, (q15_t)0x1ad4, (q15_t)0x7a20, (q15_t)0x1ac9, (q15_t)0x7a25, (q15_t)0x1abe, (q15_t)0x7a2b, (q15_t)0x1ab2, + (q15_t)0x7a30, (q15_t)0x1aa7, (q15_t)0x7a35, (q15_t)0x1a9b, (q15_t)0x7a3a, (q15_t)0x1a90, (q15_t)0x7a3f, (q15_t)0x1a84, + (q15_t)0x7a45, (q15_t)0x1a79, (q15_t)0x7a4a, (q15_t)0x1a6e, (q15_t)0x7a4f, (q15_t)0x1a62, (q15_t)0x7a54, (q15_t)0x1a57, + (q15_t)0x7a59, (q15_t)0x1a4b, (q15_t)0x7a5f, (q15_t)0x1a40, (q15_t)0x7a64, (q15_t)0x1a34, (q15_t)0x7a69, (q15_t)0x1a29, + (q15_t)0x7a6e, (q15_t)0x1a1d, (q15_t)0x7a73, (q15_t)0x1a12, (q15_t)0x7a78, (q15_t)0x1a06, (q15_t)0x7a7d, (q15_t)0x19fb, + (q15_t)0x7a82, (q15_t)0x19ef, (q15_t)0x7a88, (q15_t)0x19e4, (q15_t)0x7a8d, (q15_t)0x19d8, (q15_t)0x7a92, (q15_t)0x19cd, + (q15_t)0x7a97, (q15_t)0x19c1, (q15_t)0x7a9c, (q15_t)0x19b6, (q15_t)0x7aa1, (q15_t)0x19aa, (q15_t)0x7aa6, (q15_t)0x199f, + (q15_t)0x7aab, (q15_t)0x1993, (q15_t)0x7ab0, (q15_t)0x1988, (q15_t)0x7ab5, (q15_t)0x197c, (q15_t)0x7aba, (q15_t)0x1971, + (q15_t)0x7abf, (q15_t)0x1965, (q15_t)0x7ac4, (q15_t)0x195a, (q15_t)0x7ac9, (q15_t)0x194e, (q15_t)0x7ace, (q15_t)0x1943, + (q15_t)0x7ad3, (q15_t)0x1937, (q15_t)0x7ad8, (q15_t)0x192c, (q15_t)0x7add, (q15_t)0x1920, (q15_t)0x7ae2, (q15_t)0x1914, + (q15_t)0x7ae6, (q15_t)0x1909, (q15_t)0x7aeb, (q15_t)0x18fd, (q15_t)0x7af0, (q15_t)0x18f2, (q15_t)0x7af5, (q15_t)0x18e6, + (q15_t)0x7afa, (q15_t)0x18db, (q15_t)0x7aff, (q15_t)0x18cf, (q15_t)0x7b04, (q15_t)0x18c3, (q15_t)0x7b09, (q15_t)0x18b8, + (q15_t)0x7b0e, (q15_t)0x18ac, (q15_t)0x7b12, (q15_t)0x18a1, (q15_t)0x7b17, (q15_t)0x1895, (q15_t)0x7b1c, (q15_t)0x1889, + (q15_t)0x7b21, (q15_t)0x187e, (q15_t)0x7b26, (q15_t)0x1872, (q15_t)0x7b2a, (q15_t)0x1867, (q15_t)0x7b2f, (q15_t)0x185b, + (q15_t)0x7b34, (q15_t)0x184f, (q15_t)0x7b39, (q15_t)0x1844, (q15_t)0x7b3e, (q15_t)0x1838, (q15_t)0x7b42, (q15_t)0x182d, + (q15_t)0x7b47, (q15_t)0x1821, (q15_t)0x7b4c, (q15_t)0x1815, (q15_t)0x7b50, (q15_t)0x180a, (q15_t)0x7b55, (q15_t)0x17fe, + (q15_t)0x7b5a, (q15_t)0x17f2, (q15_t)0x7b5f, (q15_t)0x17e7, (q15_t)0x7b63, (q15_t)0x17db, (q15_t)0x7b68, (q15_t)0x17cf, + (q15_t)0x7b6d, (q15_t)0x17c4, (q15_t)0x7b71, (q15_t)0x17b8, (q15_t)0x7b76, (q15_t)0x17ac, (q15_t)0x7b7b, (q15_t)0x17a1, + (q15_t)0x7b7f, (q15_t)0x1795, (q15_t)0x7b84, (q15_t)0x1789, (q15_t)0x7b88, (q15_t)0x177e, (q15_t)0x7b8d, (q15_t)0x1772, + (q15_t)0x7b92, (q15_t)0x1766, (q15_t)0x7b96, (q15_t)0x175b, (q15_t)0x7b9b, (q15_t)0x174f, (q15_t)0x7b9f, (q15_t)0x1743, + (q15_t)0x7ba4, (q15_t)0x1737, (q15_t)0x7ba9, (q15_t)0x172c, (q15_t)0x7bad, (q15_t)0x1720, (q15_t)0x7bb2, (q15_t)0x1714, + (q15_t)0x7bb6, (q15_t)0x1709, (q15_t)0x7bbb, (q15_t)0x16fd, (q15_t)0x7bbf, (q15_t)0x16f1, (q15_t)0x7bc4, (q15_t)0x16e5, + (q15_t)0x7bc8, (q15_t)0x16da, (q15_t)0x7bcd, (q15_t)0x16ce, (q15_t)0x7bd1, (q15_t)0x16c2, (q15_t)0x7bd6, (q15_t)0x16b6, + (q15_t)0x7bda, (q15_t)0x16ab, (q15_t)0x7bde, (q15_t)0x169f, (q15_t)0x7be3, (q15_t)0x1693, (q15_t)0x7be7, (q15_t)0x1687, + (q15_t)0x7bec, (q15_t)0x167c, (q15_t)0x7bf0, (q15_t)0x1670, (q15_t)0x7bf5, (q15_t)0x1664, (q15_t)0x7bf9, (q15_t)0x1658, + (q15_t)0x7bfd, (q15_t)0x164c, (q15_t)0x7c02, (q15_t)0x1641, (q15_t)0x7c06, (q15_t)0x1635, (q15_t)0x7c0a, (q15_t)0x1629, + (q15_t)0x7c0f, (q15_t)0x161d, (q15_t)0x7c13, (q15_t)0x1612, (q15_t)0x7c17, (q15_t)0x1606, (q15_t)0x7c1c, (q15_t)0x15fa, + (q15_t)0x7c20, (q15_t)0x15ee, (q15_t)0x7c24, (q15_t)0x15e2, (q15_t)0x7c29, (q15_t)0x15d7, (q15_t)0x7c2d, (q15_t)0x15cb, + (q15_t)0x7c31, (q15_t)0x15bf, (q15_t)0x7c36, (q15_t)0x15b3, (q15_t)0x7c3a, (q15_t)0x15a7, (q15_t)0x7c3e, (q15_t)0x159b, + (q15_t)0x7c42, (q15_t)0x1590, (q15_t)0x7c46, (q15_t)0x1584, (q15_t)0x7c4b, (q15_t)0x1578, (q15_t)0x7c4f, (q15_t)0x156c, + (q15_t)0x7c53, (q15_t)0x1560, (q15_t)0x7c57, (q15_t)0x1554, (q15_t)0x7c5b, (q15_t)0x1549, (q15_t)0x7c60, (q15_t)0x153d, + (q15_t)0x7c64, (q15_t)0x1531, (q15_t)0x7c68, (q15_t)0x1525, (q15_t)0x7c6c, (q15_t)0x1519, (q15_t)0x7c70, (q15_t)0x150d, + (q15_t)0x7c74, (q15_t)0x1501, (q15_t)0x7c79, (q15_t)0x14f6, (q15_t)0x7c7d, (q15_t)0x14ea, (q15_t)0x7c81, (q15_t)0x14de, + (q15_t)0x7c85, (q15_t)0x14d2, (q15_t)0x7c89, (q15_t)0x14c6, (q15_t)0x7c8d, (q15_t)0x14ba, (q15_t)0x7c91, (q15_t)0x14ae, + (q15_t)0x7c95, (q15_t)0x14a2, (q15_t)0x7c99, (q15_t)0x1496, (q15_t)0x7c9d, (q15_t)0x148b, (q15_t)0x7ca1, (q15_t)0x147f, + (q15_t)0x7ca5, (q15_t)0x1473, (q15_t)0x7ca9, (q15_t)0x1467, (q15_t)0x7cad, (q15_t)0x145b, (q15_t)0x7cb1, (q15_t)0x144f, + (q15_t)0x7cb5, (q15_t)0x1443, (q15_t)0x7cb9, (q15_t)0x1437, (q15_t)0x7cbd, (q15_t)0x142b, (q15_t)0x7cc1, (q15_t)0x141f, + (q15_t)0x7cc5, (q15_t)0x1413, (q15_t)0x7cc9, (q15_t)0x1407, (q15_t)0x7ccd, (q15_t)0x13fb, (q15_t)0x7cd1, (q15_t)0x13f0, + (q15_t)0x7cd5, (q15_t)0x13e4, (q15_t)0x7cd9, (q15_t)0x13d8, (q15_t)0x7cdd, (q15_t)0x13cc, (q15_t)0x7ce0, (q15_t)0x13c0, + (q15_t)0x7ce4, (q15_t)0x13b4, (q15_t)0x7ce8, (q15_t)0x13a8, (q15_t)0x7cec, (q15_t)0x139c, (q15_t)0x7cf0, (q15_t)0x1390, + (q15_t)0x7cf4, (q15_t)0x1384, (q15_t)0x7cf8, (q15_t)0x1378, (q15_t)0x7cfb, (q15_t)0x136c, (q15_t)0x7cff, (q15_t)0x1360, + (q15_t)0x7d03, (q15_t)0x1354, (q15_t)0x7d07, (q15_t)0x1348, (q15_t)0x7d0b, (q15_t)0x133c, (q15_t)0x7d0e, (q15_t)0x1330, + (q15_t)0x7d12, (q15_t)0x1324, (q15_t)0x7d16, (q15_t)0x1318, (q15_t)0x7d1a, (q15_t)0x130c, (q15_t)0x7d1d, (q15_t)0x1300, + (q15_t)0x7d21, (q15_t)0x12f4, (q15_t)0x7d25, (q15_t)0x12e8, (q15_t)0x7d28, (q15_t)0x12dc, (q15_t)0x7d2c, (q15_t)0x12d0, + (q15_t)0x7d30, (q15_t)0x12c4, (q15_t)0x7d34, (q15_t)0x12b8, (q15_t)0x7d37, (q15_t)0x12ac, (q15_t)0x7d3b, (q15_t)0x12a0, + (q15_t)0x7d3f, (q15_t)0x1294, (q15_t)0x7d42, (q15_t)0x1288, (q15_t)0x7d46, (q15_t)0x127c, (q15_t)0x7d49, (q15_t)0x1270, + (q15_t)0x7d4d, (q15_t)0x1264, (q15_t)0x7d51, (q15_t)0x1258, (q15_t)0x7d54, (q15_t)0x124c, (q15_t)0x7d58, (q15_t)0x1240, + (q15_t)0x7d5b, (q15_t)0x1234, (q15_t)0x7d5f, (q15_t)0x1228, (q15_t)0x7d63, (q15_t)0x121c, (q15_t)0x7d66, (q15_t)0x1210, + (q15_t)0x7d6a, (q15_t)0x1204, (q15_t)0x7d6d, (q15_t)0x11f7, (q15_t)0x7d71, (q15_t)0x11eb, (q15_t)0x7d74, (q15_t)0x11df, + (q15_t)0x7d78, (q15_t)0x11d3, (q15_t)0x7d7b, (q15_t)0x11c7, (q15_t)0x7d7f, (q15_t)0x11bb, (q15_t)0x7d82, (q15_t)0x11af, + (q15_t)0x7d86, (q15_t)0x11a3, (q15_t)0x7d89, (q15_t)0x1197, (q15_t)0x7d8d, (q15_t)0x118b, (q15_t)0x7d90, (q15_t)0x117f, + (q15_t)0x7d93, (q15_t)0x1173, (q15_t)0x7d97, (q15_t)0x1167, (q15_t)0x7d9a, (q15_t)0x115a, (q15_t)0x7d9e, (q15_t)0x114e, + (q15_t)0x7da1, (q15_t)0x1142, (q15_t)0x7da4, (q15_t)0x1136, (q15_t)0x7da8, (q15_t)0x112a, (q15_t)0x7dab, (q15_t)0x111e, + (q15_t)0x7daf, (q15_t)0x1112, (q15_t)0x7db2, (q15_t)0x1106, (q15_t)0x7db5, (q15_t)0x10fa, (q15_t)0x7db9, (q15_t)0x10ed, + (q15_t)0x7dbc, (q15_t)0x10e1, (q15_t)0x7dbf, (q15_t)0x10d5, (q15_t)0x7dc2, (q15_t)0x10c9, (q15_t)0x7dc6, (q15_t)0x10bd, + (q15_t)0x7dc9, (q15_t)0x10b1, (q15_t)0x7dcc, (q15_t)0x10a5, (q15_t)0x7dd0, (q15_t)0x1099, (q15_t)0x7dd3, (q15_t)0x108c, + (q15_t)0x7dd6, (q15_t)0x1080, (q15_t)0x7dd9, (q15_t)0x1074, (q15_t)0x7ddd, (q15_t)0x1068, (q15_t)0x7de0, (q15_t)0x105c, + (q15_t)0x7de3, (q15_t)0x1050, (q15_t)0x7de6, (q15_t)0x1044, (q15_t)0x7de9, (q15_t)0x1037, (q15_t)0x7ded, (q15_t)0x102b, + (q15_t)0x7df0, (q15_t)0x101f, (q15_t)0x7df3, (q15_t)0x1013, (q15_t)0x7df6, (q15_t)0x1007, (q15_t)0x7df9, (q15_t)0xffb, + (q15_t)0x7dfc, (q15_t)0xfee, (q15_t)0x7dff, (q15_t)0xfe2, (q15_t)0x7e03, (q15_t)0xfd6, (q15_t)0x7e06, (q15_t)0xfca, + (q15_t)0x7e09, (q15_t)0xfbe, (q15_t)0x7e0c, (q15_t)0xfb2, (q15_t)0x7e0f, (q15_t)0xfa5, (q15_t)0x7e12, (q15_t)0xf99, + (q15_t)0x7e15, (q15_t)0xf8d, (q15_t)0x7e18, (q15_t)0xf81, (q15_t)0x7e1b, (q15_t)0xf75, (q15_t)0x7e1e, (q15_t)0xf68, + (q15_t)0x7e21, (q15_t)0xf5c, (q15_t)0x7e24, (q15_t)0xf50, (q15_t)0x7e27, (q15_t)0xf44, (q15_t)0x7e2a, (q15_t)0xf38, + (q15_t)0x7e2d, (q15_t)0xf2b, (q15_t)0x7e30, (q15_t)0xf1f, (q15_t)0x7e33, (q15_t)0xf13, (q15_t)0x7e36, (q15_t)0xf07, + (q15_t)0x7e39, (q15_t)0xefb, (q15_t)0x7e3c, (q15_t)0xeee, (q15_t)0x7e3f, (q15_t)0xee2, (q15_t)0x7e42, (q15_t)0xed6, + (q15_t)0x7e45, (q15_t)0xeca, (q15_t)0x7e48, (q15_t)0xebd, (q15_t)0x7e4a, (q15_t)0xeb1, (q15_t)0x7e4d, (q15_t)0xea5, + (q15_t)0x7e50, (q15_t)0xe99, (q15_t)0x7e53, (q15_t)0xe8c, (q15_t)0x7e56, (q15_t)0xe80, (q15_t)0x7e59, (q15_t)0xe74, + (q15_t)0x7e5c, (q15_t)0xe68, (q15_t)0x7e5e, (q15_t)0xe5c, (q15_t)0x7e61, (q15_t)0xe4f, (q15_t)0x7e64, (q15_t)0xe43, + (q15_t)0x7e67, (q15_t)0xe37, (q15_t)0x7e6a, (q15_t)0xe2b, (q15_t)0x7e6c, (q15_t)0xe1e, (q15_t)0x7e6f, (q15_t)0xe12, + (q15_t)0x7e72, (q15_t)0xe06, (q15_t)0x7e75, (q15_t)0xdf9, (q15_t)0x7e77, (q15_t)0xded, (q15_t)0x7e7a, (q15_t)0xde1, + (q15_t)0x7e7d, (q15_t)0xdd5, (q15_t)0x7e80, (q15_t)0xdc8, (q15_t)0x7e82, (q15_t)0xdbc, (q15_t)0x7e85, (q15_t)0xdb0, + (q15_t)0x7e88, (q15_t)0xda4, (q15_t)0x7e8a, (q15_t)0xd97, (q15_t)0x7e8d, (q15_t)0xd8b, (q15_t)0x7e90, (q15_t)0xd7f, + (q15_t)0x7e92, (q15_t)0xd72, (q15_t)0x7e95, (q15_t)0xd66, (q15_t)0x7e98, (q15_t)0xd5a, (q15_t)0x7e9a, (q15_t)0xd4e, + (q15_t)0x7e9d, (q15_t)0xd41, (q15_t)0x7e9f, (q15_t)0xd35, (q15_t)0x7ea2, (q15_t)0xd29, (q15_t)0x7ea5, (q15_t)0xd1c, + (q15_t)0x7ea7, (q15_t)0xd10, (q15_t)0x7eaa, (q15_t)0xd04, (q15_t)0x7eac, (q15_t)0xcf8, (q15_t)0x7eaf, (q15_t)0xceb, + (q15_t)0x7eb1, (q15_t)0xcdf, (q15_t)0x7eb4, (q15_t)0xcd3, (q15_t)0x7eb6, (q15_t)0xcc6, (q15_t)0x7eb9, (q15_t)0xcba, + (q15_t)0x7ebb, (q15_t)0xcae, (q15_t)0x7ebe, (q15_t)0xca1, (q15_t)0x7ec0, (q15_t)0xc95, (q15_t)0x7ec3, (q15_t)0xc89, + (q15_t)0x7ec5, (q15_t)0xc7c, (q15_t)0x7ec8, (q15_t)0xc70, (q15_t)0x7eca, (q15_t)0xc64, (q15_t)0x7ecc, (q15_t)0xc57, + (q15_t)0x7ecf, (q15_t)0xc4b, (q15_t)0x7ed1, (q15_t)0xc3f, (q15_t)0x7ed4, (q15_t)0xc32, (q15_t)0x7ed6, (q15_t)0xc26, + (q15_t)0x7ed8, (q15_t)0xc1a, (q15_t)0x7edb, (q15_t)0xc0d, (q15_t)0x7edd, (q15_t)0xc01, (q15_t)0x7ee0, (q15_t)0xbf5, + (q15_t)0x7ee2, (q15_t)0xbe8, (q15_t)0x7ee4, (q15_t)0xbdc, (q15_t)0x7ee7, (q15_t)0xbd0, (q15_t)0x7ee9, (q15_t)0xbc3, + (q15_t)0x7eeb, (q15_t)0xbb7, (q15_t)0x7eed, (q15_t)0xbab, (q15_t)0x7ef0, (q15_t)0xb9e, (q15_t)0x7ef2, (q15_t)0xb92, + (q15_t)0x7ef4, (q15_t)0xb85, (q15_t)0x7ef7, (q15_t)0xb79, (q15_t)0x7ef9, (q15_t)0xb6d, (q15_t)0x7efb, (q15_t)0xb60, + (q15_t)0x7efd, (q15_t)0xb54, (q15_t)0x7f00, (q15_t)0xb48, (q15_t)0x7f02, (q15_t)0xb3b, (q15_t)0x7f04, (q15_t)0xb2f, + (q15_t)0x7f06, (q15_t)0xb23, (q15_t)0x7f08, (q15_t)0xb16, (q15_t)0x7f0a, (q15_t)0xb0a, (q15_t)0x7f0d, (q15_t)0xafd, + (q15_t)0x7f0f, (q15_t)0xaf1, (q15_t)0x7f11, (q15_t)0xae5, (q15_t)0x7f13, (q15_t)0xad8, (q15_t)0x7f15, (q15_t)0xacc, + (q15_t)0x7f17, (q15_t)0xac0, (q15_t)0x7f19, (q15_t)0xab3, (q15_t)0x7f1c, (q15_t)0xaa7, (q15_t)0x7f1e, (q15_t)0xa9a, + (q15_t)0x7f20, (q15_t)0xa8e, (q15_t)0x7f22, (q15_t)0xa82, (q15_t)0x7f24, (q15_t)0xa75, (q15_t)0x7f26, (q15_t)0xa69, + (q15_t)0x7f28, (q15_t)0xa5c, (q15_t)0x7f2a, (q15_t)0xa50, (q15_t)0x7f2c, (q15_t)0xa44, (q15_t)0x7f2e, (q15_t)0xa37, + (q15_t)0x7f30, (q15_t)0xa2b, (q15_t)0x7f32, (q15_t)0xa1e, (q15_t)0x7f34, (q15_t)0xa12, (q15_t)0x7f36, (q15_t)0xa06, + (q15_t)0x7f38, (q15_t)0x9f9, (q15_t)0x7f3a, (q15_t)0x9ed, (q15_t)0x7f3c, (q15_t)0x9e0, (q15_t)0x7f3e, (q15_t)0x9d4, + (q15_t)0x7f40, (q15_t)0x9c7, (q15_t)0x7f42, (q15_t)0x9bb, (q15_t)0x7f43, (q15_t)0x9af, (q15_t)0x7f45, (q15_t)0x9a2, + (q15_t)0x7f47, (q15_t)0x996, (q15_t)0x7f49, (q15_t)0x989, (q15_t)0x7f4b, (q15_t)0x97d, (q15_t)0x7f4d, (q15_t)0x970, + (q15_t)0x7f4f, (q15_t)0x964, (q15_t)0x7f51, (q15_t)0x958, (q15_t)0x7f52, (q15_t)0x94b, (q15_t)0x7f54, (q15_t)0x93f, + (q15_t)0x7f56, (q15_t)0x932, (q15_t)0x7f58, (q15_t)0x926, (q15_t)0x7f5a, (q15_t)0x919, (q15_t)0x7f5b, (q15_t)0x90d, + (q15_t)0x7f5d, (q15_t)0x901, (q15_t)0x7f5f, (q15_t)0x8f4, (q15_t)0x7f61, (q15_t)0x8e8, (q15_t)0x7f62, (q15_t)0x8db, + (q15_t)0x7f64, (q15_t)0x8cf, (q15_t)0x7f66, (q15_t)0x8c2, (q15_t)0x7f68, (q15_t)0x8b6, (q15_t)0x7f69, (q15_t)0x8a9, + (q15_t)0x7f6b, (q15_t)0x89d, (q15_t)0x7f6d, (q15_t)0x891, (q15_t)0x7f6e, (q15_t)0x884, (q15_t)0x7f70, (q15_t)0x878, + (q15_t)0x7f72, (q15_t)0x86b, (q15_t)0x7f73, (q15_t)0x85f, (q15_t)0x7f75, (q15_t)0x852, (q15_t)0x7f77, (q15_t)0x846, + (q15_t)0x7f78, (q15_t)0x839, (q15_t)0x7f7a, (q15_t)0x82d, (q15_t)0x7f7b, (q15_t)0x820, (q15_t)0x7f7d, (q15_t)0x814, + (q15_t)0x7f7f, (q15_t)0x807, (q15_t)0x7f80, (q15_t)0x7fb, (q15_t)0x7f82, (q15_t)0x7ef, (q15_t)0x7f83, (q15_t)0x7e2, + (q15_t)0x7f85, (q15_t)0x7d6, (q15_t)0x7f86, (q15_t)0x7c9, (q15_t)0x7f88, (q15_t)0x7bd, (q15_t)0x7f89, (q15_t)0x7b0, + (q15_t)0x7f8b, (q15_t)0x7a4, (q15_t)0x7f8c, (q15_t)0x797, (q15_t)0x7f8e, (q15_t)0x78b, (q15_t)0x7f8f, (q15_t)0x77e, + (q15_t)0x7f91, (q15_t)0x772, (q15_t)0x7f92, (q15_t)0x765, (q15_t)0x7f94, (q15_t)0x759, (q15_t)0x7f95, (q15_t)0x74c, + (q15_t)0x7f97, (q15_t)0x740, (q15_t)0x7f98, (q15_t)0x733, (q15_t)0x7f99, (q15_t)0x727, (q15_t)0x7f9b, (q15_t)0x71a, + (q15_t)0x7f9c, (q15_t)0x70e, (q15_t)0x7f9e, (q15_t)0x701, (q15_t)0x7f9f, (q15_t)0x6f5, (q15_t)0x7fa0, (q15_t)0x6e8, + (q15_t)0x7fa2, (q15_t)0x6dc, (q15_t)0x7fa3, (q15_t)0x6cf, (q15_t)0x7fa4, (q15_t)0x6c3, (q15_t)0x7fa6, (q15_t)0x6b6, + (q15_t)0x7fa7, (q15_t)0x6aa, (q15_t)0x7fa8, (q15_t)0x69d, (q15_t)0x7faa, (q15_t)0x691, (q15_t)0x7fab, (q15_t)0x684, + (q15_t)0x7fac, (q15_t)0x678, (q15_t)0x7fad, (q15_t)0x66b, (q15_t)0x7faf, (q15_t)0x65f, (q15_t)0x7fb0, (q15_t)0x652, + (q15_t)0x7fb1, (q15_t)0x646, (q15_t)0x7fb2, (q15_t)0x639, (q15_t)0x7fb4, (q15_t)0x62d, (q15_t)0x7fb5, (q15_t)0x620, + (q15_t)0x7fb6, (q15_t)0x614, (q15_t)0x7fb7, (q15_t)0x607, (q15_t)0x7fb8, (q15_t)0x5fb, (q15_t)0x7fb9, (q15_t)0x5ee, + (q15_t)0x7fbb, (q15_t)0x5e2, (q15_t)0x7fbc, (q15_t)0x5d5, (q15_t)0x7fbd, (q15_t)0x5c9, (q15_t)0x7fbe, (q15_t)0x5bc, + (q15_t)0x7fbf, (q15_t)0x5b0, (q15_t)0x7fc0, (q15_t)0x5a3, (q15_t)0x7fc1, (q15_t)0x597, (q15_t)0x7fc3, (q15_t)0x58a, + (q15_t)0x7fc4, (q15_t)0x57e, (q15_t)0x7fc5, (q15_t)0x571, (q15_t)0x7fc6, (q15_t)0x565, (q15_t)0x7fc7, (q15_t)0x558, + (q15_t)0x7fc8, (q15_t)0x54c, (q15_t)0x7fc9, (q15_t)0x53f, (q15_t)0x7fca, (q15_t)0x533, (q15_t)0x7fcb, (q15_t)0x526, + (q15_t)0x7fcc, (q15_t)0x51a, (q15_t)0x7fcd, (q15_t)0x50d, (q15_t)0x7fce, (q15_t)0x500, (q15_t)0x7fcf, (q15_t)0x4f4, + (q15_t)0x7fd0, (q15_t)0x4e7, (q15_t)0x7fd1, (q15_t)0x4db, (q15_t)0x7fd2, (q15_t)0x4ce, (q15_t)0x7fd3, (q15_t)0x4c2, + (q15_t)0x7fd4, (q15_t)0x4b5, (q15_t)0x7fd5, (q15_t)0x4a9, (q15_t)0x7fd5, (q15_t)0x49c, (q15_t)0x7fd6, (q15_t)0x490, + (q15_t)0x7fd7, (q15_t)0x483, (q15_t)0x7fd8, (q15_t)0x477, (q15_t)0x7fd9, (q15_t)0x46a, (q15_t)0x7fda, (q15_t)0x45e, + (q15_t)0x7fdb, (q15_t)0x451, (q15_t)0x7fdc, (q15_t)0x444, (q15_t)0x7fdc, (q15_t)0x438, (q15_t)0x7fdd, (q15_t)0x42b, + (q15_t)0x7fde, (q15_t)0x41f, (q15_t)0x7fdf, (q15_t)0x412, (q15_t)0x7fe0, (q15_t)0x406, (q15_t)0x7fe0, (q15_t)0x3f9, + (q15_t)0x7fe1, (q15_t)0x3ed, (q15_t)0x7fe2, (q15_t)0x3e0, (q15_t)0x7fe3, (q15_t)0x3d4, (q15_t)0x7fe3, (q15_t)0x3c7, + (q15_t)0x7fe4, (q15_t)0x3bb, (q15_t)0x7fe5, (q15_t)0x3ae, (q15_t)0x7fe6, (q15_t)0x3a1, (q15_t)0x7fe6, (q15_t)0x395, + (q15_t)0x7fe7, (q15_t)0x388, (q15_t)0x7fe8, (q15_t)0x37c, (q15_t)0x7fe8, (q15_t)0x36f, (q15_t)0x7fe9, (q15_t)0x363, + (q15_t)0x7fea, (q15_t)0x356, (q15_t)0x7fea, (q15_t)0x34a, (q15_t)0x7feb, (q15_t)0x33d, (q15_t)0x7fec, (q15_t)0x330, + (q15_t)0x7fec, (q15_t)0x324, (q15_t)0x7fed, (q15_t)0x317, (q15_t)0x7fed, (q15_t)0x30b, (q15_t)0x7fee, (q15_t)0x2fe, + (q15_t)0x7fef, (q15_t)0x2f2, (q15_t)0x7fef, (q15_t)0x2e5, (q15_t)0x7ff0, (q15_t)0x2d9, (q15_t)0x7ff0, (q15_t)0x2cc, + (q15_t)0x7ff1, (q15_t)0x2c0, (q15_t)0x7ff1, (q15_t)0x2b3, (q15_t)0x7ff2, (q15_t)0x2a6, (q15_t)0x7ff2, (q15_t)0x29a, + (q15_t)0x7ff3, (q15_t)0x28d, (q15_t)0x7ff3, (q15_t)0x281, (q15_t)0x7ff4, (q15_t)0x274, (q15_t)0x7ff4, (q15_t)0x268, + (q15_t)0x7ff5, (q15_t)0x25b, (q15_t)0x7ff5, (q15_t)0x24e, (q15_t)0x7ff6, (q15_t)0x242, (q15_t)0x7ff6, (q15_t)0x235, + (q15_t)0x7ff7, (q15_t)0x229, (q15_t)0x7ff7, (q15_t)0x21c, (q15_t)0x7ff7, (q15_t)0x210, (q15_t)0x7ff8, (q15_t)0x203, + (q15_t)0x7ff8, (q15_t)0x1f7, (q15_t)0x7ff9, (q15_t)0x1ea, (q15_t)0x7ff9, (q15_t)0x1dd, (q15_t)0x7ff9, (q15_t)0x1d1, + (q15_t)0x7ffa, (q15_t)0x1c4, (q15_t)0x7ffa, (q15_t)0x1b8, (q15_t)0x7ffa, (q15_t)0x1ab, (q15_t)0x7ffb, (q15_t)0x19f, + (q15_t)0x7ffb, (q15_t)0x192, (q15_t)0x7ffb, (q15_t)0x186, (q15_t)0x7ffc, (q15_t)0x179, (q15_t)0x7ffc, (q15_t)0x16c, + (q15_t)0x7ffc, (q15_t)0x160, (q15_t)0x7ffc, (q15_t)0x153, (q15_t)0x7ffd, (q15_t)0x147, (q15_t)0x7ffd, (q15_t)0x13a, + (q15_t)0x7ffd, (q15_t)0x12e, (q15_t)0x7ffd, (q15_t)0x121, (q15_t)0x7ffe, (q15_t)0x114, (q15_t)0x7ffe, (q15_t)0x108, + (q15_t)0x7ffe, (q15_t)0xfb, (q15_t)0x7ffe, (q15_t)0xef, (q15_t)0x7ffe, (q15_t)0xe2, (q15_t)0x7fff, (q15_t)0xd6, + (q15_t)0x7fff, (q15_t)0xc9, (q15_t)0x7fff, (q15_t)0xbc, (q15_t)0x7fff, (q15_t)0xb0, (q15_t)0x7fff, (q15_t)0xa3, + (q15_t)0x7fff, (q15_t)0x97, (q15_t)0x7fff, (q15_t)0x8a, (q15_t)0x7fff, (q15_t)0x7e, (q15_t)0x7fff, (q15_t)0x71, + (q15_t)0x7fff, (q15_t)0x65, (q15_t)0x7fff, (q15_t)0x58, (q15_t)0x7fff, (q15_t)0x4b, (q15_t)0x7fff, (q15_t)0x3f, + (q15_t)0x7fff, (q15_t)0x32, (q15_t)0x7fff, (q15_t)0x26, (q15_t)0x7fff, (q15_t)0x19, (q15_t)0x7fff, (q15_t)0xd, + (q15_t)0x7fff, (q15_t)0x0, (q15_t)0x7fff, (q15_t)0xfff3, (q15_t)0x7fff, (q15_t)0xffe7, (q15_t)0x7fff, (q15_t)0xffda, + (q15_t)0x7fff, (q15_t)0xffce, (q15_t)0x7fff, (q15_t)0xffc1, (q15_t)0x7fff, (q15_t)0xffb5, (q15_t)0x7fff, (q15_t)0xffa8, + (q15_t)0x7fff, (q15_t)0xff9b, (q15_t)0x7fff, (q15_t)0xff8f, (q15_t)0x7fff, (q15_t)0xff82, (q15_t)0x7fff, (q15_t)0xff76, + (q15_t)0x7fff, (q15_t)0xff69, (q15_t)0x7fff, (q15_t)0xff5d, (q15_t)0x7fff, (q15_t)0xff50, (q15_t)0x7fff, (q15_t)0xff44, + (q15_t)0x7fff, (q15_t)0xff37, (q15_t)0x7fff, (q15_t)0xff2a, (q15_t)0x7ffe, (q15_t)0xff1e, (q15_t)0x7ffe, (q15_t)0xff11, + (q15_t)0x7ffe, (q15_t)0xff05, (q15_t)0x7ffe, (q15_t)0xfef8, (q15_t)0x7ffe, (q15_t)0xfeec, (q15_t)0x7ffd, (q15_t)0xfedf, + (q15_t)0x7ffd, (q15_t)0xfed2, (q15_t)0x7ffd, (q15_t)0xfec6, (q15_t)0x7ffd, (q15_t)0xfeb9, (q15_t)0x7ffc, (q15_t)0xfead, + (q15_t)0x7ffc, (q15_t)0xfea0, (q15_t)0x7ffc, (q15_t)0xfe94, (q15_t)0x7ffc, (q15_t)0xfe87, (q15_t)0x7ffb, (q15_t)0xfe7a, + (q15_t)0x7ffb, (q15_t)0xfe6e, (q15_t)0x7ffb, (q15_t)0xfe61, (q15_t)0x7ffa, (q15_t)0xfe55, (q15_t)0x7ffa, (q15_t)0xfe48, + (q15_t)0x7ffa, (q15_t)0xfe3c, (q15_t)0x7ff9, (q15_t)0xfe2f, (q15_t)0x7ff9, (q15_t)0xfe23, (q15_t)0x7ff9, (q15_t)0xfe16, + (q15_t)0x7ff8, (q15_t)0xfe09, (q15_t)0x7ff8, (q15_t)0xfdfd, (q15_t)0x7ff7, (q15_t)0xfdf0, (q15_t)0x7ff7, (q15_t)0xfde4, + (q15_t)0x7ff7, (q15_t)0xfdd7, (q15_t)0x7ff6, (q15_t)0xfdcb, (q15_t)0x7ff6, (q15_t)0xfdbe, (q15_t)0x7ff5, (q15_t)0xfdb2, + (q15_t)0x7ff5, (q15_t)0xfda5, (q15_t)0x7ff4, (q15_t)0xfd98, (q15_t)0x7ff4, (q15_t)0xfd8c, (q15_t)0x7ff3, (q15_t)0xfd7f, + (q15_t)0x7ff3, (q15_t)0xfd73, (q15_t)0x7ff2, (q15_t)0xfd66, (q15_t)0x7ff2, (q15_t)0xfd5a, (q15_t)0x7ff1, (q15_t)0xfd4d, + (q15_t)0x7ff1, (q15_t)0xfd40, (q15_t)0x7ff0, (q15_t)0xfd34, (q15_t)0x7ff0, (q15_t)0xfd27, (q15_t)0x7fef, (q15_t)0xfd1b, + (q15_t)0x7fef, (q15_t)0xfd0e, (q15_t)0x7fee, (q15_t)0xfd02, (q15_t)0x7fed, (q15_t)0xfcf5, (q15_t)0x7fed, (q15_t)0xfce9, + (q15_t)0x7fec, (q15_t)0xfcdc, (q15_t)0x7fec, (q15_t)0xfcd0, (q15_t)0x7feb, (q15_t)0xfcc3, (q15_t)0x7fea, (q15_t)0xfcb6, + (q15_t)0x7fea, (q15_t)0xfcaa, (q15_t)0x7fe9, (q15_t)0xfc9d, (q15_t)0x7fe8, (q15_t)0xfc91, (q15_t)0x7fe8, (q15_t)0xfc84, + (q15_t)0x7fe7, (q15_t)0xfc78, (q15_t)0x7fe6, (q15_t)0xfc6b, (q15_t)0x7fe6, (q15_t)0xfc5f, (q15_t)0x7fe5, (q15_t)0xfc52, + (q15_t)0x7fe4, (q15_t)0xfc45, (q15_t)0x7fe3, (q15_t)0xfc39, (q15_t)0x7fe3, (q15_t)0xfc2c, (q15_t)0x7fe2, (q15_t)0xfc20, + (q15_t)0x7fe1, (q15_t)0xfc13, (q15_t)0x7fe0, (q15_t)0xfc07, (q15_t)0x7fe0, (q15_t)0xfbfa, (q15_t)0x7fdf, (q15_t)0xfbee, + (q15_t)0x7fde, (q15_t)0xfbe1, (q15_t)0x7fdd, (q15_t)0xfbd5, (q15_t)0x7fdc, (q15_t)0xfbc8, (q15_t)0x7fdc, (q15_t)0xfbbc, + (q15_t)0x7fdb, (q15_t)0xfbaf, (q15_t)0x7fda, (q15_t)0xfba2, (q15_t)0x7fd9, (q15_t)0xfb96, (q15_t)0x7fd8, (q15_t)0xfb89, + (q15_t)0x7fd7, (q15_t)0xfb7d, (q15_t)0x7fd6, (q15_t)0xfb70, (q15_t)0x7fd5, (q15_t)0xfb64, (q15_t)0x7fd5, (q15_t)0xfb57, + (q15_t)0x7fd4, (q15_t)0xfb4b, (q15_t)0x7fd3, (q15_t)0xfb3e, (q15_t)0x7fd2, (q15_t)0xfb32, (q15_t)0x7fd1, (q15_t)0xfb25, + (q15_t)0x7fd0, (q15_t)0xfb19, (q15_t)0x7fcf, (q15_t)0xfb0c, (q15_t)0x7fce, (q15_t)0xfb00, (q15_t)0x7fcd, (q15_t)0xfaf3, + (q15_t)0x7fcc, (q15_t)0xfae6, (q15_t)0x7fcb, (q15_t)0xfada, (q15_t)0x7fca, (q15_t)0xfacd, (q15_t)0x7fc9, (q15_t)0xfac1, + (q15_t)0x7fc8, (q15_t)0xfab4, (q15_t)0x7fc7, (q15_t)0xfaa8, (q15_t)0x7fc6, (q15_t)0xfa9b, (q15_t)0x7fc5, (q15_t)0xfa8f, + (q15_t)0x7fc4, (q15_t)0xfa82, (q15_t)0x7fc3, (q15_t)0xfa76, (q15_t)0x7fc1, (q15_t)0xfa69, (q15_t)0x7fc0, (q15_t)0xfa5d, + (q15_t)0x7fbf, (q15_t)0xfa50, (q15_t)0x7fbe, (q15_t)0xfa44, (q15_t)0x7fbd, (q15_t)0xfa37, (q15_t)0x7fbc, (q15_t)0xfa2b, + (q15_t)0x7fbb, (q15_t)0xfa1e, (q15_t)0x7fb9, (q15_t)0xfa12, (q15_t)0x7fb8, (q15_t)0xfa05, (q15_t)0x7fb7, (q15_t)0xf9f9, + (q15_t)0x7fb6, (q15_t)0xf9ec, (q15_t)0x7fb5, (q15_t)0xf9e0, (q15_t)0x7fb4, (q15_t)0xf9d3, (q15_t)0x7fb2, (q15_t)0xf9c7, + (q15_t)0x7fb1, (q15_t)0xf9ba, (q15_t)0x7fb0, (q15_t)0xf9ae, (q15_t)0x7faf, (q15_t)0xf9a1, (q15_t)0x7fad, (q15_t)0xf995, + (q15_t)0x7fac, (q15_t)0xf988, (q15_t)0x7fab, (q15_t)0xf97c, (q15_t)0x7faa, (q15_t)0xf96f, (q15_t)0x7fa8, (q15_t)0xf963, + (q15_t)0x7fa7, (q15_t)0xf956, (q15_t)0x7fa6, (q15_t)0xf94a, (q15_t)0x7fa4, (q15_t)0xf93d, (q15_t)0x7fa3, (q15_t)0xf931, + (q15_t)0x7fa2, (q15_t)0xf924, (q15_t)0x7fa0, (q15_t)0xf918, (q15_t)0x7f9f, (q15_t)0xf90b, (q15_t)0x7f9e, (q15_t)0xf8ff, + (q15_t)0x7f9c, (q15_t)0xf8f2, (q15_t)0x7f9b, (q15_t)0xf8e6, (q15_t)0x7f99, (q15_t)0xf8d9, (q15_t)0x7f98, (q15_t)0xf8cd, + (q15_t)0x7f97, (q15_t)0xf8c0, (q15_t)0x7f95, (q15_t)0xf8b4, (q15_t)0x7f94, (q15_t)0xf8a7, (q15_t)0x7f92, (q15_t)0xf89b, + (q15_t)0x7f91, (q15_t)0xf88e, (q15_t)0x7f8f, (q15_t)0xf882, (q15_t)0x7f8e, (q15_t)0xf875, (q15_t)0x7f8c, (q15_t)0xf869, + (q15_t)0x7f8b, (q15_t)0xf85c, (q15_t)0x7f89, (q15_t)0xf850, (q15_t)0x7f88, (q15_t)0xf843, (q15_t)0x7f86, (q15_t)0xf837, + (q15_t)0x7f85, (q15_t)0xf82a, (q15_t)0x7f83, (q15_t)0xf81e, (q15_t)0x7f82, (q15_t)0xf811, (q15_t)0x7f80, (q15_t)0xf805, + (q15_t)0x7f7f, (q15_t)0xf7f9, (q15_t)0x7f7d, (q15_t)0xf7ec, (q15_t)0x7f7b, (q15_t)0xf7e0, (q15_t)0x7f7a, (q15_t)0xf7d3, + (q15_t)0x7f78, (q15_t)0xf7c7, (q15_t)0x7f77, (q15_t)0xf7ba, (q15_t)0x7f75, (q15_t)0xf7ae, (q15_t)0x7f73, (q15_t)0xf7a1, + (q15_t)0x7f72, (q15_t)0xf795, (q15_t)0x7f70, (q15_t)0xf788, (q15_t)0x7f6e, (q15_t)0xf77c, (q15_t)0x7f6d, (q15_t)0xf76f, + (q15_t)0x7f6b, (q15_t)0xf763, (q15_t)0x7f69, (q15_t)0xf757, (q15_t)0x7f68, (q15_t)0xf74a, (q15_t)0x7f66, (q15_t)0xf73e, + (q15_t)0x7f64, (q15_t)0xf731, (q15_t)0x7f62, (q15_t)0xf725, (q15_t)0x7f61, (q15_t)0xf718, (q15_t)0x7f5f, (q15_t)0xf70c, + (q15_t)0x7f5d, (q15_t)0xf6ff, (q15_t)0x7f5b, (q15_t)0xf6f3, (q15_t)0x7f5a, (q15_t)0xf6e7, (q15_t)0x7f58, (q15_t)0xf6da, + (q15_t)0x7f56, (q15_t)0xf6ce, (q15_t)0x7f54, (q15_t)0xf6c1, (q15_t)0x7f52, (q15_t)0xf6b5, (q15_t)0x7f51, (q15_t)0xf6a8, + (q15_t)0x7f4f, (q15_t)0xf69c, (q15_t)0x7f4d, (q15_t)0xf690, (q15_t)0x7f4b, (q15_t)0xf683, (q15_t)0x7f49, (q15_t)0xf677, + (q15_t)0x7f47, (q15_t)0xf66a, (q15_t)0x7f45, (q15_t)0xf65e, (q15_t)0x7f43, (q15_t)0xf651, (q15_t)0x7f42, (q15_t)0xf645, + (q15_t)0x7f40, (q15_t)0xf639, (q15_t)0x7f3e, (q15_t)0xf62c, (q15_t)0x7f3c, (q15_t)0xf620, (q15_t)0x7f3a, (q15_t)0xf613, + (q15_t)0x7f38, (q15_t)0xf607, (q15_t)0x7f36, (q15_t)0xf5fa, (q15_t)0x7f34, (q15_t)0xf5ee, (q15_t)0x7f32, (q15_t)0xf5e2, + (q15_t)0x7f30, (q15_t)0xf5d5, (q15_t)0x7f2e, (q15_t)0xf5c9, (q15_t)0x7f2c, (q15_t)0xf5bc, (q15_t)0x7f2a, (q15_t)0xf5b0, + (q15_t)0x7f28, (q15_t)0xf5a4, (q15_t)0x7f26, (q15_t)0xf597, (q15_t)0x7f24, (q15_t)0xf58b, (q15_t)0x7f22, (q15_t)0xf57e, + (q15_t)0x7f20, (q15_t)0xf572, (q15_t)0x7f1e, (q15_t)0xf566, (q15_t)0x7f1c, (q15_t)0xf559, (q15_t)0x7f19, (q15_t)0xf54d, + (q15_t)0x7f17, (q15_t)0xf540, (q15_t)0x7f15, (q15_t)0xf534, (q15_t)0x7f13, (q15_t)0xf528, (q15_t)0x7f11, (q15_t)0xf51b, + (q15_t)0x7f0f, (q15_t)0xf50f, (q15_t)0x7f0d, (q15_t)0xf503, (q15_t)0x7f0a, (q15_t)0xf4f6, (q15_t)0x7f08, (q15_t)0xf4ea, + (q15_t)0x7f06, (q15_t)0xf4dd, (q15_t)0x7f04, (q15_t)0xf4d1, (q15_t)0x7f02, (q15_t)0xf4c5, (q15_t)0x7f00, (q15_t)0xf4b8, + (q15_t)0x7efd, (q15_t)0xf4ac, (q15_t)0x7efb, (q15_t)0xf4a0, (q15_t)0x7ef9, (q15_t)0xf493, (q15_t)0x7ef7, (q15_t)0xf487, + (q15_t)0x7ef4, (q15_t)0xf47b, (q15_t)0x7ef2, (q15_t)0xf46e, (q15_t)0x7ef0, (q15_t)0xf462, (q15_t)0x7eed, (q15_t)0xf455, + (q15_t)0x7eeb, (q15_t)0xf449, (q15_t)0x7ee9, (q15_t)0xf43d, (q15_t)0x7ee7, (q15_t)0xf430, (q15_t)0x7ee4, (q15_t)0xf424, + (q15_t)0x7ee2, (q15_t)0xf418, (q15_t)0x7ee0, (q15_t)0xf40b, (q15_t)0x7edd, (q15_t)0xf3ff, (q15_t)0x7edb, (q15_t)0xf3f3, + (q15_t)0x7ed8, (q15_t)0xf3e6, (q15_t)0x7ed6, (q15_t)0xf3da, (q15_t)0x7ed4, (q15_t)0xf3ce, (q15_t)0x7ed1, (q15_t)0xf3c1, + (q15_t)0x7ecf, (q15_t)0xf3b5, (q15_t)0x7ecc, (q15_t)0xf3a9, (q15_t)0x7eca, (q15_t)0xf39c, (q15_t)0x7ec8, (q15_t)0xf390, + (q15_t)0x7ec5, (q15_t)0xf384, (q15_t)0x7ec3, (q15_t)0xf377, (q15_t)0x7ec0, (q15_t)0xf36b, (q15_t)0x7ebe, (q15_t)0xf35f, + (q15_t)0x7ebb, (q15_t)0xf352, (q15_t)0x7eb9, (q15_t)0xf346, (q15_t)0x7eb6, (q15_t)0xf33a, (q15_t)0x7eb4, (q15_t)0xf32d, + (q15_t)0x7eb1, (q15_t)0xf321, (q15_t)0x7eaf, (q15_t)0xf315, (q15_t)0x7eac, (q15_t)0xf308, (q15_t)0x7eaa, (q15_t)0xf2fc, + (q15_t)0x7ea7, (q15_t)0xf2f0, (q15_t)0x7ea5, (q15_t)0xf2e4, (q15_t)0x7ea2, (q15_t)0xf2d7, (q15_t)0x7e9f, (q15_t)0xf2cb, + (q15_t)0x7e9d, (q15_t)0xf2bf, (q15_t)0x7e9a, (q15_t)0xf2b2, (q15_t)0x7e98, (q15_t)0xf2a6, (q15_t)0x7e95, (q15_t)0xf29a, + (q15_t)0x7e92, (q15_t)0xf28e, (q15_t)0x7e90, (q15_t)0xf281, (q15_t)0x7e8d, (q15_t)0xf275, (q15_t)0x7e8a, (q15_t)0xf269, + (q15_t)0x7e88, (q15_t)0xf25c, (q15_t)0x7e85, (q15_t)0xf250, (q15_t)0x7e82, (q15_t)0xf244, (q15_t)0x7e80, (q15_t)0xf238, + (q15_t)0x7e7d, (q15_t)0xf22b, (q15_t)0x7e7a, (q15_t)0xf21f, (q15_t)0x7e77, (q15_t)0xf213, (q15_t)0x7e75, (q15_t)0xf207, + (q15_t)0x7e72, (q15_t)0xf1fa, (q15_t)0x7e6f, (q15_t)0xf1ee, (q15_t)0x7e6c, (q15_t)0xf1e2, (q15_t)0x7e6a, (q15_t)0xf1d5, + (q15_t)0x7e67, (q15_t)0xf1c9, (q15_t)0x7e64, (q15_t)0xf1bd, (q15_t)0x7e61, (q15_t)0xf1b1, (q15_t)0x7e5e, (q15_t)0xf1a4, + (q15_t)0x7e5c, (q15_t)0xf198, (q15_t)0x7e59, (q15_t)0xf18c, (q15_t)0x7e56, (q15_t)0xf180, (q15_t)0x7e53, (q15_t)0xf174, + (q15_t)0x7e50, (q15_t)0xf167, (q15_t)0x7e4d, (q15_t)0xf15b, (q15_t)0x7e4a, (q15_t)0xf14f, (q15_t)0x7e48, (q15_t)0xf143, + (q15_t)0x7e45, (q15_t)0xf136, (q15_t)0x7e42, (q15_t)0xf12a, (q15_t)0x7e3f, (q15_t)0xf11e, (q15_t)0x7e3c, (q15_t)0xf112, + (q15_t)0x7e39, (q15_t)0xf105, (q15_t)0x7e36, (q15_t)0xf0f9, (q15_t)0x7e33, (q15_t)0xf0ed, (q15_t)0x7e30, (q15_t)0xf0e1, + (q15_t)0x7e2d, (q15_t)0xf0d5, (q15_t)0x7e2a, (q15_t)0xf0c8, (q15_t)0x7e27, (q15_t)0xf0bc, (q15_t)0x7e24, (q15_t)0xf0b0, + (q15_t)0x7e21, (q15_t)0xf0a4, (q15_t)0x7e1e, (q15_t)0xf098, (q15_t)0x7e1b, (q15_t)0xf08b, (q15_t)0x7e18, (q15_t)0xf07f, + (q15_t)0x7e15, (q15_t)0xf073, (q15_t)0x7e12, (q15_t)0xf067, (q15_t)0x7e0f, (q15_t)0xf05b, (q15_t)0x7e0c, (q15_t)0xf04e, + (q15_t)0x7e09, (q15_t)0xf042, (q15_t)0x7e06, (q15_t)0xf036, (q15_t)0x7e03, (q15_t)0xf02a, (q15_t)0x7dff, (q15_t)0xf01e, + (q15_t)0x7dfc, (q15_t)0xf012, (q15_t)0x7df9, (q15_t)0xf005, (q15_t)0x7df6, (q15_t)0xeff9, (q15_t)0x7df3, (q15_t)0xefed, + (q15_t)0x7df0, (q15_t)0xefe1, (q15_t)0x7ded, (q15_t)0xefd5, (q15_t)0x7de9, (q15_t)0xefc9, (q15_t)0x7de6, (q15_t)0xefbc, + (q15_t)0x7de3, (q15_t)0xefb0, (q15_t)0x7de0, (q15_t)0xefa4, (q15_t)0x7ddd, (q15_t)0xef98, (q15_t)0x7dd9, (q15_t)0xef8c, + (q15_t)0x7dd6, (q15_t)0xef80, (q15_t)0x7dd3, (q15_t)0xef74, (q15_t)0x7dd0, (q15_t)0xef67, (q15_t)0x7dcc, (q15_t)0xef5b, + (q15_t)0x7dc9, (q15_t)0xef4f, (q15_t)0x7dc6, (q15_t)0xef43, (q15_t)0x7dc2, (q15_t)0xef37, (q15_t)0x7dbf, (q15_t)0xef2b, + (q15_t)0x7dbc, (q15_t)0xef1f, (q15_t)0x7db9, (q15_t)0xef13, (q15_t)0x7db5, (q15_t)0xef06, (q15_t)0x7db2, (q15_t)0xeefa, + (q15_t)0x7daf, (q15_t)0xeeee, (q15_t)0x7dab, (q15_t)0xeee2, (q15_t)0x7da8, (q15_t)0xeed6, (q15_t)0x7da4, (q15_t)0xeeca, + (q15_t)0x7da1, (q15_t)0xeebe, (q15_t)0x7d9e, (q15_t)0xeeb2, (q15_t)0x7d9a, (q15_t)0xeea6, (q15_t)0x7d97, (q15_t)0xee99, + (q15_t)0x7d93, (q15_t)0xee8d, (q15_t)0x7d90, (q15_t)0xee81, (q15_t)0x7d8d, (q15_t)0xee75, (q15_t)0x7d89, (q15_t)0xee69, + (q15_t)0x7d86, (q15_t)0xee5d, (q15_t)0x7d82, (q15_t)0xee51, (q15_t)0x7d7f, (q15_t)0xee45, (q15_t)0x7d7b, (q15_t)0xee39, + (q15_t)0x7d78, (q15_t)0xee2d, (q15_t)0x7d74, (q15_t)0xee21, (q15_t)0x7d71, (q15_t)0xee15, (q15_t)0x7d6d, (q15_t)0xee09, + (q15_t)0x7d6a, (q15_t)0xedfc, (q15_t)0x7d66, (q15_t)0xedf0, (q15_t)0x7d63, (q15_t)0xede4, (q15_t)0x7d5f, (q15_t)0xedd8, + (q15_t)0x7d5b, (q15_t)0xedcc, (q15_t)0x7d58, (q15_t)0xedc0, (q15_t)0x7d54, (q15_t)0xedb4, (q15_t)0x7d51, (q15_t)0xeda8, + (q15_t)0x7d4d, (q15_t)0xed9c, (q15_t)0x7d49, (q15_t)0xed90, (q15_t)0x7d46, (q15_t)0xed84, (q15_t)0x7d42, (q15_t)0xed78, + (q15_t)0x7d3f, (q15_t)0xed6c, (q15_t)0x7d3b, (q15_t)0xed60, (q15_t)0x7d37, (q15_t)0xed54, (q15_t)0x7d34, (q15_t)0xed48, + (q15_t)0x7d30, (q15_t)0xed3c, (q15_t)0x7d2c, (q15_t)0xed30, (q15_t)0x7d28, (q15_t)0xed24, (q15_t)0x7d25, (q15_t)0xed18, + (q15_t)0x7d21, (q15_t)0xed0c, (q15_t)0x7d1d, (q15_t)0xed00, (q15_t)0x7d1a, (q15_t)0xecf4, (q15_t)0x7d16, (q15_t)0xece8, + (q15_t)0x7d12, (q15_t)0xecdc, (q15_t)0x7d0e, (q15_t)0xecd0, (q15_t)0x7d0b, (q15_t)0xecc4, (q15_t)0x7d07, (q15_t)0xecb8, + (q15_t)0x7d03, (q15_t)0xecac, (q15_t)0x7cff, (q15_t)0xeca0, (q15_t)0x7cfb, (q15_t)0xec94, (q15_t)0x7cf8, (q15_t)0xec88, + (q15_t)0x7cf4, (q15_t)0xec7c, (q15_t)0x7cf0, (q15_t)0xec70, (q15_t)0x7cec, (q15_t)0xec64, (q15_t)0x7ce8, (q15_t)0xec58, + (q15_t)0x7ce4, (q15_t)0xec4c, (q15_t)0x7ce0, (q15_t)0xec40, (q15_t)0x7cdd, (q15_t)0xec34, (q15_t)0x7cd9, (q15_t)0xec28, + (q15_t)0x7cd5, (q15_t)0xec1c, (q15_t)0x7cd1, (q15_t)0xec10, (q15_t)0x7ccd, (q15_t)0xec05, (q15_t)0x7cc9, (q15_t)0xebf9, + (q15_t)0x7cc5, (q15_t)0xebed, (q15_t)0x7cc1, (q15_t)0xebe1, (q15_t)0x7cbd, (q15_t)0xebd5, (q15_t)0x7cb9, (q15_t)0xebc9, + (q15_t)0x7cb5, (q15_t)0xebbd, (q15_t)0x7cb1, (q15_t)0xebb1, (q15_t)0x7cad, (q15_t)0xeba5, (q15_t)0x7ca9, (q15_t)0xeb99, + (q15_t)0x7ca5, (q15_t)0xeb8d, (q15_t)0x7ca1, (q15_t)0xeb81, (q15_t)0x7c9d, (q15_t)0xeb75, (q15_t)0x7c99, (q15_t)0xeb6a, + (q15_t)0x7c95, (q15_t)0xeb5e, (q15_t)0x7c91, (q15_t)0xeb52, (q15_t)0x7c8d, (q15_t)0xeb46, (q15_t)0x7c89, (q15_t)0xeb3a, + (q15_t)0x7c85, (q15_t)0xeb2e, (q15_t)0x7c81, (q15_t)0xeb22, (q15_t)0x7c7d, (q15_t)0xeb16, (q15_t)0x7c79, (q15_t)0xeb0a, + (q15_t)0x7c74, (q15_t)0xeaff, (q15_t)0x7c70, (q15_t)0xeaf3, (q15_t)0x7c6c, (q15_t)0xeae7, (q15_t)0x7c68, (q15_t)0xeadb, + (q15_t)0x7c64, (q15_t)0xeacf, (q15_t)0x7c60, (q15_t)0xeac3, (q15_t)0x7c5b, (q15_t)0xeab7, (q15_t)0x7c57, (q15_t)0xeaac, + (q15_t)0x7c53, (q15_t)0xeaa0, (q15_t)0x7c4f, (q15_t)0xea94, (q15_t)0x7c4b, (q15_t)0xea88, (q15_t)0x7c46, (q15_t)0xea7c, + (q15_t)0x7c42, (q15_t)0xea70, (q15_t)0x7c3e, (q15_t)0xea65, (q15_t)0x7c3a, (q15_t)0xea59, (q15_t)0x7c36, (q15_t)0xea4d, + (q15_t)0x7c31, (q15_t)0xea41, (q15_t)0x7c2d, (q15_t)0xea35, (q15_t)0x7c29, (q15_t)0xea29, (q15_t)0x7c24, (q15_t)0xea1e, + (q15_t)0x7c20, (q15_t)0xea12, (q15_t)0x7c1c, (q15_t)0xea06, (q15_t)0x7c17, (q15_t)0xe9fa, (q15_t)0x7c13, (q15_t)0xe9ee, + (q15_t)0x7c0f, (q15_t)0xe9e3, (q15_t)0x7c0a, (q15_t)0xe9d7, (q15_t)0x7c06, (q15_t)0xe9cb, (q15_t)0x7c02, (q15_t)0xe9bf, + (q15_t)0x7bfd, (q15_t)0xe9b4, (q15_t)0x7bf9, (q15_t)0xe9a8, (q15_t)0x7bf5, (q15_t)0xe99c, (q15_t)0x7bf0, (q15_t)0xe990, + (q15_t)0x7bec, (q15_t)0xe984, (q15_t)0x7be7, (q15_t)0xe979, (q15_t)0x7be3, (q15_t)0xe96d, (q15_t)0x7bde, (q15_t)0xe961, + (q15_t)0x7bda, (q15_t)0xe955, (q15_t)0x7bd6, (q15_t)0xe94a, (q15_t)0x7bd1, (q15_t)0xe93e, (q15_t)0x7bcd, (q15_t)0xe932, + (q15_t)0x7bc8, (q15_t)0xe926, (q15_t)0x7bc4, (q15_t)0xe91b, (q15_t)0x7bbf, (q15_t)0xe90f, (q15_t)0x7bbb, (q15_t)0xe903, + (q15_t)0x7bb6, (q15_t)0xe8f7, (q15_t)0x7bb2, (q15_t)0xe8ec, (q15_t)0x7bad, (q15_t)0xe8e0, (q15_t)0x7ba9, (q15_t)0xe8d4, + (q15_t)0x7ba4, (q15_t)0xe8c9, (q15_t)0x7b9f, (q15_t)0xe8bd, (q15_t)0x7b9b, (q15_t)0xe8b1, (q15_t)0x7b96, (q15_t)0xe8a5, + (q15_t)0x7b92, (q15_t)0xe89a, (q15_t)0x7b8d, (q15_t)0xe88e, (q15_t)0x7b88, (q15_t)0xe882, (q15_t)0x7b84, (q15_t)0xe877, + (q15_t)0x7b7f, (q15_t)0xe86b, (q15_t)0x7b7b, (q15_t)0xe85f, (q15_t)0x7b76, (q15_t)0xe854, (q15_t)0x7b71, (q15_t)0xe848, + (q15_t)0x7b6d, (q15_t)0xe83c, (q15_t)0x7b68, (q15_t)0xe831, (q15_t)0x7b63, (q15_t)0xe825, (q15_t)0x7b5f, (q15_t)0xe819, + (q15_t)0x7b5a, (q15_t)0xe80e, (q15_t)0x7b55, (q15_t)0xe802, (q15_t)0x7b50, (q15_t)0xe7f6, (q15_t)0x7b4c, (q15_t)0xe7eb, + (q15_t)0x7b47, (q15_t)0xe7df, (q15_t)0x7b42, (q15_t)0xe7d3, (q15_t)0x7b3e, (q15_t)0xe7c8, (q15_t)0x7b39, (q15_t)0xe7bc, + (q15_t)0x7b34, (q15_t)0xe7b1, (q15_t)0x7b2f, (q15_t)0xe7a5, (q15_t)0x7b2a, (q15_t)0xe799, (q15_t)0x7b26, (q15_t)0xe78e, + (q15_t)0x7b21, (q15_t)0xe782, (q15_t)0x7b1c, (q15_t)0xe777, (q15_t)0x7b17, (q15_t)0xe76b, (q15_t)0x7b12, (q15_t)0xe75f, + (q15_t)0x7b0e, (q15_t)0xe754, (q15_t)0x7b09, (q15_t)0xe748, (q15_t)0x7b04, (q15_t)0xe73d, (q15_t)0x7aff, (q15_t)0xe731, + (q15_t)0x7afa, (q15_t)0xe725, (q15_t)0x7af5, (q15_t)0xe71a, (q15_t)0x7af0, (q15_t)0xe70e, (q15_t)0x7aeb, (q15_t)0xe703, + (q15_t)0x7ae6, (q15_t)0xe6f7, (q15_t)0x7ae2, (q15_t)0xe6ec, (q15_t)0x7add, (q15_t)0xe6e0, (q15_t)0x7ad8, (q15_t)0xe6d4, + (q15_t)0x7ad3, (q15_t)0xe6c9, (q15_t)0x7ace, (q15_t)0xe6bd, (q15_t)0x7ac9, (q15_t)0xe6b2, (q15_t)0x7ac4, (q15_t)0xe6a6, + (q15_t)0x7abf, (q15_t)0xe69b, (q15_t)0x7aba, (q15_t)0xe68f, (q15_t)0x7ab5, (q15_t)0xe684, (q15_t)0x7ab0, (q15_t)0xe678, + (q15_t)0x7aab, (q15_t)0xe66d, (q15_t)0x7aa6, (q15_t)0xe661, (q15_t)0x7aa1, (q15_t)0xe656, (q15_t)0x7a9c, (q15_t)0xe64a, + (q15_t)0x7a97, (q15_t)0xe63f, (q15_t)0x7a92, (q15_t)0xe633, (q15_t)0x7a8d, (q15_t)0xe628, (q15_t)0x7a88, (q15_t)0xe61c, + (q15_t)0x7a82, (q15_t)0xe611, (q15_t)0x7a7d, (q15_t)0xe605, (q15_t)0x7a78, (q15_t)0xe5fa, (q15_t)0x7a73, (q15_t)0xe5ee, + (q15_t)0x7a6e, (q15_t)0xe5e3, (q15_t)0x7a69, (q15_t)0xe5d7, (q15_t)0x7a64, (q15_t)0xe5cc, (q15_t)0x7a5f, (q15_t)0xe5c0, + (q15_t)0x7a59, (q15_t)0xe5b5, (q15_t)0x7a54, (q15_t)0xe5a9, (q15_t)0x7a4f, (q15_t)0xe59e, (q15_t)0x7a4a, (q15_t)0xe592, + (q15_t)0x7a45, (q15_t)0xe587, (q15_t)0x7a3f, (q15_t)0xe57c, (q15_t)0x7a3a, (q15_t)0xe570, (q15_t)0x7a35, (q15_t)0xe565, + (q15_t)0x7a30, (q15_t)0xe559, (q15_t)0x7a2b, (q15_t)0xe54e, (q15_t)0x7a25, (q15_t)0xe542, (q15_t)0x7a20, (q15_t)0xe537, + (q15_t)0x7a1b, (q15_t)0xe52c, (q15_t)0x7a16, (q15_t)0xe520, (q15_t)0x7a10, (q15_t)0xe515, (q15_t)0x7a0b, (q15_t)0xe509, + (q15_t)0x7a06, (q15_t)0xe4fe, (q15_t)0x7a00, (q15_t)0xe4f3, (q15_t)0x79fb, (q15_t)0xe4e7, (q15_t)0x79f6, (q15_t)0xe4dc, + (q15_t)0x79f0, (q15_t)0xe4d0, (q15_t)0x79eb, (q15_t)0xe4c5, (q15_t)0x79e6, (q15_t)0xe4ba, (q15_t)0x79e0, (q15_t)0xe4ae, + (q15_t)0x79db, (q15_t)0xe4a3, (q15_t)0x79d6, (q15_t)0xe498, (q15_t)0x79d0, (q15_t)0xe48c, (q15_t)0x79cb, (q15_t)0xe481, + (q15_t)0x79c5, (q15_t)0xe476, (q15_t)0x79c0, (q15_t)0xe46a, (q15_t)0x79bb, (q15_t)0xe45f, (q15_t)0x79b5, (q15_t)0xe454, + (q15_t)0x79b0, (q15_t)0xe448, (q15_t)0x79aa, (q15_t)0xe43d, (q15_t)0x79a5, (q15_t)0xe432, (q15_t)0x799f, (q15_t)0xe426, + (q15_t)0x799a, (q15_t)0xe41b, (q15_t)0x7994, (q15_t)0xe410, (q15_t)0x798f, (q15_t)0xe404, (q15_t)0x7989, (q15_t)0xe3f9, + (q15_t)0x7984, (q15_t)0xe3ee, (q15_t)0x797e, (q15_t)0xe3e2, (q15_t)0x7979, (q15_t)0xe3d7, (q15_t)0x7973, (q15_t)0xe3cc, + (q15_t)0x796e, (q15_t)0xe3c1, (q15_t)0x7968, (q15_t)0xe3b5, (q15_t)0x7963, (q15_t)0xe3aa, (q15_t)0x795d, (q15_t)0xe39f, + (q15_t)0x7958, (q15_t)0xe394, (q15_t)0x7952, (q15_t)0xe388, (q15_t)0x794c, (q15_t)0xe37d, (q15_t)0x7947, (q15_t)0xe372, + (q15_t)0x7941, (q15_t)0xe367, (q15_t)0x793b, (q15_t)0xe35b, (q15_t)0x7936, (q15_t)0xe350, (q15_t)0x7930, (q15_t)0xe345, + (q15_t)0x792b, (q15_t)0xe33a, (q15_t)0x7925, (q15_t)0xe32e, (q15_t)0x791f, (q15_t)0xe323, (q15_t)0x791a, (q15_t)0xe318, + (q15_t)0x7914, (q15_t)0xe30d, (q15_t)0x790e, (q15_t)0xe301, (q15_t)0x7909, (q15_t)0xe2f6, (q15_t)0x7903, (q15_t)0xe2eb, + (q15_t)0x78fd, (q15_t)0xe2e0, (q15_t)0x78f7, (q15_t)0xe2d5, (q15_t)0x78f2, (q15_t)0xe2ca, (q15_t)0x78ec, (q15_t)0xe2be, + (q15_t)0x78e6, (q15_t)0xe2b3, (q15_t)0x78e0, (q15_t)0xe2a8, (q15_t)0x78db, (q15_t)0xe29d, (q15_t)0x78d5, (q15_t)0xe292, + (q15_t)0x78cf, (q15_t)0xe287, (q15_t)0x78c9, (q15_t)0xe27b, (q15_t)0x78c3, (q15_t)0xe270, (q15_t)0x78be, (q15_t)0xe265, + (q15_t)0x78b8, (q15_t)0xe25a, (q15_t)0x78b2, (q15_t)0xe24f, (q15_t)0x78ac, (q15_t)0xe244, (q15_t)0x78a6, (q15_t)0xe239, + (q15_t)0x78a1, (q15_t)0xe22d, (q15_t)0x789b, (q15_t)0xe222, (q15_t)0x7895, (q15_t)0xe217, (q15_t)0x788f, (q15_t)0xe20c, + (q15_t)0x7889, (q15_t)0xe201, (q15_t)0x7883, (q15_t)0xe1f6, (q15_t)0x787d, (q15_t)0xe1eb, (q15_t)0x7877, (q15_t)0xe1e0, + (q15_t)0x7871, (q15_t)0xe1d5, (q15_t)0x786b, (q15_t)0xe1ca, (q15_t)0x7866, (q15_t)0xe1be, (q15_t)0x7860, (q15_t)0xe1b3, + (q15_t)0x785a, (q15_t)0xe1a8, (q15_t)0x7854, (q15_t)0xe19d, (q15_t)0x784e, (q15_t)0xe192, (q15_t)0x7848, (q15_t)0xe187, + (q15_t)0x7842, (q15_t)0xe17c, (q15_t)0x783c, (q15_t)0xe171, (q15_t)0x7836, (q15_t)0xe166, (q15_t)0x7830, (q15_t)0xe15b, + (q15_t)0x782a, (q15_t)0xe150, (q15_t)0x7824, (q15_t)0xe145, (q15_t)0x781e, (q15_t)0xe13a, (q15_t)0x7818, (q15_t)0xe12f, + (q15_t)0x7812, (q15_t)0xe124, (q15_t)0x780b, (q15_t)0xe119, (q15_t)0x7805, (q15_t)0xe10e, (q15_t)0x77ff, (q15_t)0xe103, + (q15_t)0x77f9, (q15_t)0xe0f8, (q15_t)0x77f3, (q15_t)0xe0ed, (q15_t)0x77ed, (q15_t)0xe0e2, (q15_t)0x77e7, (q15_t)0xe0d7, + (q15_t)0x77e1, (q15_t)0xe0cc, (q15_t)0x77db, (q15_t)0xe0c1, (q15_t)0x77d5, (q15_t)0xe0b6, (q15_t)0x77ce, (q15_t)0xe0ab, + (q15_t)0x77c8, (q15_t)0xe0a0, (q15_t)0x77c2, (q15_t)0xe095, (q15_t)0x77bc, (q15_t)0xe08a, (q15_t)0x77b6, (q15_t)0xe07f, + (q15_t)0x77b0, (q15_t)0xe074, (q15_t)0x77a9, (q15_t)0xe069, (q15_t)0x77a3, (q15_t)0xe05e, (q15_t)0x779d, (q15_t)0xe054, + (q15_t)0x7797, (q15_t)0xe049, (q15_t)0x7790, (q15_t)0xe03e, (q15_t)0x778a, (q15_t)0xe033, (q15_t)0x7784, (q15_t)0xe028, + (q15_t)0x777e, (q15_t)0xe01d, (q15_t)0x7777, (q15_t)0xe012, (q15_t)0x7771, (q15_t)0xe007, (q15_t)0x776b, (q15_t)0xdffc, + (q15_t)0x7765, (q15_t)0xdff1, (q15_t)0x775e, (q15_t)0xdfe7, (q15_t)0x7758, (q15_t)0xdfdc, (q15_t)0x7752, (q15_t)0xdfd1, + (q15_t)0x774b, (q15_t)0xdfc6, (q15_t)0x7745, (q15_t)0xdfbb, (q15_t)0x773f, (q15_t)0xdfb0, (q15_t)0x7738, (q15_t)0xdfa5, + (q15_t)0x7732, (q15_t)0xdf9b, (q15_t)0x772c, (q15_t)0xdf90, (q15_t)0x7725, (q15_t)0xdf85, (q15_t)0x771f, (q15_t)0xdf7a, + (q15_t)0x7718, (q15_t)0xdf6f, (q15_t)0x7712, (q15_t)0xdf65, (q15_t)0x770c, (q15_t)0xdf5a, (q15_t)0x7705, (q15_t)0xdf4f, + (q15_t)0x76ff, (q15_t)0xdf44, (q15_t)0x76f8, (q15_t)0xdf39, (q15_t)0x76f2, (q15_t)0xdf2f, (q15_t)0x76eb, (q15_t)0xdf24, + (q15_t)0x76e5, (q15_t)0xdf19, (q15_t)0x76df, (q15_t)0xdf0e, (q15_t)0x76d8, (q15_t)0xdf03, (q15_t)0x76d2, (q15_t)0xdef9, + (q15_t)0x76cb, (q15_t)0xdeee, (q15_t)0x76c5, (q15_t)0xdee3, (q15_t)0x76be, (q15_t)0xded8, (q15_t)0x76b8, (q15_t)0xdece, + (q15_t)0x76b1, (q15_t)0xdec3, (q15_t)0x76ab, (q15_t)0xdeb8, (q15_t)0x76a4, (q15_t)0xdead, (q15_t)0x769d, (q15_t)0xdea3, + (q15_t)0x7697, (q15_t)0xde98, (q15_t)0x7690, (q15_t)0xde8d, (q15_t)0x768a, (q15_t)0xde83, (q15_t)0x7683, (q15_t)0xde78, + (q15_t)0x767d, (q15_t)0xde6d, (q15_t)0x7676, (q15_t)0xde62, (q15_t)0x766f, (q15_t)0xde58, (q15_t)0x7669, (q15_t)0xde4d, + (q15_t)0x7662, (q15_t)0xde42, (q15_t)0x765c, (q15_t)0xde38, (q15_t)0x7655, (q15_t)0xde2d, (q15_t)0x764e, (q15_t)0xde22, + (q15_t)0x7648, (q15_t)0xde18, (q15_t)0x7641, (q15_t)0xde0d, (q15_t)0x763a, (q15_t)0xde02, (q15_t)0x7634, (q15_t)0xddf8, + (q15_t)0x762d, (q15_t)0xdded, (q15_t)0x7626, (q15_t)0xdde2, (q15_t)0x7620, (q15_t)0xddd8, (q15_t)0x7619, (q15_t)0xddcd, + (q15_t)0x7612, (q15_t)0xddc3, (q15_t)0x760b, (q15_t)0xddb8, (q15_t)0x7605, (q15_t)0xddad, (q15_t)0x75fe, (q15_t)0xdda3, + (q15_t)0x75f7, (q15_t)0xdd98, (q15_t)0x75f0, (q15_t)0xdd8e, (q15_t)0x75ea, (q15_t)0xdd83, (q15_t)0x75e3, (q15_t)0xdd78, + (q15_t)0x75dc, (q15_t)0xdd6e, (q15_t)0x75d5, (q15_t)0xdd63, (q15_t)0x75ce, (q15_t)0xdd59, (q15_t)0x75c8, (q15_t)0xdd4e, + (q15_t)0x75c1, (q15_t)0xdd44, (q15_t)0x75ba, (q15_t)0xdd39, (q15_t)0x75b3, (q15_t)0xdd2e, (q15_t)0x75ac, (q15_t)0xdd24, + (q15_t)0x75a5, (q15_t)0xdd19, (q15_t)0x759f, (q15_t)0xdd0f, (q15_t)0x7598, (q15_t)0xdd04, (q15_t)0x7591, (q15_t)0xdcfa, + (q15_t)0x758a, (q15_t)0xdcef, (q15_t)0x7583, (q15_t)0xdce5, (q15_t)0x757c, (q15_t)0xdcda, (q15_t)0x7575, (q15_t)0xdcd0, + (q15_t)0x756e, (q15_t)0xdcc5, (q15_t)0x7567, (q15_t)0xdcbb, (q15_t)0x7561, (q15_t)0xdcb0, (q15_t)0x755a, (q15_t)0xdca6, + (q15_t)0x7553, (q15_t)0xdc9b, (q15_t)0x754c, (q15_t)0xdc91, (q15_t)0x7545, (q15_t)0xdc86, (q15_t)0x753e, (q15_t)0xdc7c, + (q15_t)0x7537, (q15_t)0xdc72, (q15_t)0x7530, (q15_t)0xdc67, (q15_t)0x7529, (q15_t)0xdc5d, (q15_t)0x7522, (q15_t)0xdc52, + (q15_t)0x751b, (q15_t)0xdc48, (q15_t)0x7514, (q15_t)0xdc3d, (q15_t)0x750d, (q15_t)0xdc33, (q15_t)0x7506, (q15_t)0xdc29, + (q15_t)0x74ff, (q15_t)0xdc1e, (q15_t)0x74f8, (q15_t)0xdc14, (q15_t)0x74f1, (q15_t)0xdc09, (q15_t)0x74ea, (q15_t)0xdbff, + (q15_t)0x74e2, (q15_t)0xdbf5, (q15_t)0x74db, (q15_t)0xdbea, (q15_t)0x74d4, (q15_t)0xdbe0, (q15_t)0x74cd, (q15_t)0xdbd5, + (q15_t)0x74c6, (q15_t)0xdbcb, (q15_t)0x74bf, (q15_t)0xdbc1, (q15_t)0x74b8, (q15_t)0xdbb6, (q15_t)0x74b1, (q15_t)0xdbac, + (q15_t)0x74aa, (q15_t)0xdba2, (q15_t)0x74a2, (q15_t)0xdb97, (q15_t)0x749b, (q15_t)0xdb8d, (q15_t)0x7494, (q15_t)0xdb83, + (q15_t)0x748d, (q15_t)0xdb78, (q15_t)0x7486, (q15_t)0xdb6e, (q15_t)0x747f, (q15_t)0xdb64, (q15_t)0x7477, (q15_t)0xdb59, + (q15_t)0x7470, (q15_t)0xdb4f, (q15_t)0x7469, (q15_t)0xdb45, (q15_t)0x7462, (q15_t)0xdb3b, (q15_t)0x745b, (q15_t)0xdb30, + (q15_t)0x7453, (q15_t)0xdb26, (q15_t)0x744c, (q15_t)0xdb1c, (q15_t)0x7445, (q15_t)0xdb11, (q15_t)0x743e, (q15_t)0xdb07, + (q15_t)0x7436, (q15_t)0xdafd, (q15_t)0x742f, (q15_t)0xdaf3, (q15_t)0x7428, (q15_t)0xdae8, (q15_t)0x7420, (q15_t)0xdade, + (q15_t)0x7419, (q15_t)0xdad4, (q15_t)0x7412, (q15_t)0xdaca, (q15_t)0x740b, (q15_t)0xdabf, (q15_t)0x7403, (q15_t)0xdab5, + (q15_t)0x73fc, (q15_t)0xdaab, (q15_t)0x73f5, (q15_t)0xdaa1, (q15_t)0x73ed, (q15_t)0xda97, (q15_t)0x73e6, (q15_t)0xda8c, + (q15_t)0x73df, (q15_t)0xda82, (q15_t)0x73d7, (q15_t)0xda78, (q15_t)0x73d0, (q15_t)0xda6e, (q15_t)0x73c8, (q15_t)0xda64, + (q15_t)0x73c1, (q15_t)0xda5a, (q15_t)0x73ba, (q15_t)0xda4f, (q15_t)0x73b2, (q15_t)0xda45, (q15_t)0x73ab, (q15_t)0xda3b, + (q15_t)0x73a3, (q15_t)0xda31, (q15_t)0x739c, (q15_t)0xda27, (q15_t)0x7395, (q15_t)0xda1d, (q15_t)0x738d, (q15_t)0xda13, + (q15_t)0x7386, (q15_t)0xda08, (q15_t)0x737e, (q15_t)0xd9fe, (q15_t)0x7377, (q15_t)0xd9f4, (q15_t)0x736f, (q15_t)0xd9ea, + (q15_t)0x7368, (q15_t)0xd9e0, (q15_t)0x7360, (q15_t)0xd9d6, (q15_t)0x7359, (q15_t)0xd9cc, (q15_t)0x7351, (q15_t)0xd9c2, + (q15_t)0x734a, (q15_t)0xd9b8, (q15_t)0x7342, (q15_t)0xd9ae, (q15_t)0x733b, (q15_t)0xd9a4, (q15_t)0x7333, (q15_t)0xd99a, + (q15_t)0x732c, (q15_t)0xd98f, (q15_t)0x7324, (q15_t)0xd985, (q15_t)0x731d, (q15_t)0xd97b, (q15_t)0x7315, (q15_t)0xd971, + (q15_t)0x730d, (q15_t)0xd967, (q15_t)0x7306, (q15_t)0xd95d, (q15_t)0x72fe, (q15_t)0xd953, (q15_t)0x72f7, (q15_t)0xd949, + (q15_t)0x72ef, (q15_t)0xd93f, (q15_t)0x72e7, (q15_t)0xd935, (q15_t)0x72e0, (q15_t)0xd92b, (q15_t)0x72d8, (q15_t)0xd921, + (q15_t)0x72d0, (q15_t)0xd917, (q15_t)0x72c9, (q15_t)0xd90d, (q15_t)0x72c1, (q15_t)0xd903, (q15_t)0x72ba, (q15_t)0xd8f9, + (q15_t)0x72b2, (q15_t)0xd8ef, (q15_t)0x72aa, (q15_t)0xd8e6, (q15_t)0x72a3, (q15_t)0xd8dc, (q15_t)0x729b, (q15_t)0xd8d2, + (q15_t)0x7293, (q15_t)0xd8c8, (q15_t)0x728b, (q15_t)0xd8be, (q15_t)0x7284, (q15_t)0xd8b4, (q15_t)0x727c, (q15_t)0xd8aa, + (q15_t)0x7274, (q15_t)0xd8a0, (q15_t)0x726d, (q15_t)0xd896, (q15_t)0x7265, (q15_t)0xd88c, (q15_t)0x725d, (q15_t)0xd882, + (q15_t)0x7255, (q15_t)0xd878, (q15_t)0x724e, (q15_t)0xd86f, (q15_t)0x7246, (q15_t)0xd865, (q15_t)0x723e, (q15_t)0xd85b, + (q15_t)0x7236, (q15_t)0xd851, (q15_t)0x722e, (q15_t)0xd847, (q15_t)0x7227, (q15_t)0xd83d, (q15_t)0x721f, (q15_t)0xd833, + (q15_t)0x7217, (q15_t)0xd82a, (q15_t)0x720f, (q15_t)0xd820, (q15_t)0x7207, (q15_t)0xd816, (q15_t)0x71ff, (q15_t)0xd80c, + (q15_t)0x71f8, (q15_t)0xd802, (q15_t)0x71f0, (q15_t)0xd7f8, (q15_t)0x71e8, (q15_t)0xd7ef, (q15_t)0x71e0, (q15_t)0xd7e5, + (q15_t)0x71d8, (q15_t)0xd7db, (q15_t)0x71d0, (q15_t)0xd7d1, (q15_t)0x71c8, (q15_t)0xd7c8, (q15_t)0x71c0, (q15_t)0xd7be, + (q15_t)0x71b9, (q15_t)0xd7b4, (q15_t)0x71b1, (q15_t)0xd7aa, (q15_t)0x71a9, (q15_t)0xd7a0, (q15_t)0x71a1, (q15_t)0xd797, + (q15_t)0x7199, (q15_t)0xd78d, (q15_t)0x7191, (q15_t)0xd783, (q15_t)0x7189, (q15_t)0xd77a, (q15_t)0x7181, (q15_t)0xd770, + (q15_t)0x7179, (q15_t)0xd766, (q15_t)0x7171, (q15_t)0xd75c, (q15_t)0x7169, (q15_t)0xd753, (q15_t)0x7161, (q15_t)0xd749, + (q15_t)0x7159, (q15_t)0xd73f, (q15_t)0x7151, (q15_t)0xd736, (q15_t)0x7149, (q15_t)0xd72c, (q15_t)0x7141, (q15_t)0xd722, + (q15_t)0x7139, (q15_t)0xd719, (q15_t)0x7131, (q15_t)0xd70f, (q15_t)0x7129, (q15_t)0xd705, (q15_t)0x7121, (q15_t)0xd6fc, + (q15_t)0x7119, (q15_t)0xd6f2, (q15_t)0x7111, (q15_t)0xd6e8, (q15_t)0x7109, (q15_t)0xd6df, (q15_t)0x7101, (q15_t)0xd6d5, + (q15_t)0x70f9, (q15_t)0xd6cb, (q15_t)0x70f0, (q15_t)0xd6c2, (q15_t)0x70e8, (q15_t)0xd6b8, (q15_t)0x70e0, (q15_t)0xd6af, + (q15_t)0x70d8, (q15_t)0xd6a5, (q15_t)0x70d0, (q15_t)0xd69b, (q15_t)0x70c8, (q15_t)0xd692, (q15_t)0x70c0, (q15_t)0xd688, + (q15_t)0x70b8, (q15_t)0xd67f, (q15_t)0x70af, (q15_t)0xd675, (q15_t)0x70a7, (q15_t)0xd66c, (q15_t)0x709f, (q15_t)0xd662, + (q15_t)0x7097, (q15_t)0xd659, (q15_t)0x708f, (q15_t)0xd64f, (q15_t)0x7087, (q15_t)0xd645, (q15_t)0x707e, (q15_t)0xd63c, + (q15_t)0x7076, (q15_t)0xd632, (q15_t)0x706e, (q15_t)0xd629, (q15_t)0x7066, (q15_t)0xd61f, (q15_t)0x705d, (q15_t)0xd616, + (q15_t)0x7055, (q15_t)0xd60c, (q15_t)0x704d, (q15_t)0xd603, (q15_t)0x7045, (q15_t)0xd5f9, (q15_t)0x703c, (q15_t)0xd5f0, + (q15_t)0x7034, (q15_t)0xd5e6, (q15_t)0x702c, (q15_t)0xd5dd, (q15_t)0x7024, (q15_t)0xd5d4, (q15_t)0x701b, (q15_t)0xd5ca, + (q15_t)0x7013, (q15_t)0xd5c1, (q15_t)0x700b, (q15_t)0xd5b7, (q15_t)0x7002, (q15_t)0xd5ae, (q15_t)0x6ffa, (q15_t)0xd5a4, + (q15_t)0x6ff2, (q15_t)0xd59b, (q15_t)0x6fea, (q15_t)0xd592, (q15_t)0x6fe1, (q15_t)0xd588, (q15_t)0x6fd9, (q15_t)0xd57f, + (q15_t)0x6fd0, (q15_t)0xd575, (q15_t)0x6fc8, (q15_t)0xd56c, (q15_t)0x6fc0, (q15_t)0xd563, (q15_t)0x6fb7, (q15_t)0xd559, + (q15_t)0x6faf, (q15_t)0xd550, (q15_t)0x6fa7, (q15_t)0xd547, (q15_t)0x6f9e, (q15_t)0xd53d, (q15_t)0x6f96, (q15_t)0xd534, + (q15_t)0x6f8d, (q15_t)0xd52a, (q15_t)0x6f85, (q15_t)0xd521, (q15_t)0x6f7d, (q15_t)0xd518, (q15_t)0x6f74, (q15_t)0xd50e, + (q15_t)0x6f6c, (q15_t)0xd505, (q15_t)0x6f63, (q15_t)0xd4fc, (q15_t)0x6f5b, (q15_t)0xd4f3, (q15_t)0x6f52, (q15_t)0xd4e9, + (q15_t)0x6f4a, (q15_t)0xd4e0, (q15_t)0x6f41, (q15_t)0xd4d7, (q15_t)0x6f39, (q15_t)0xd4cd, (q15_t)0x6f30, (q15_t)0xd4c4, + (q15_t)0x6f28, (q15_t)0xd4bb, (q15_t)0x6f20, (q15_t)0xd4b2, (q15_t)0x6f17, (q15_t)0xd4a8, (q15_t)0x6f0e, (q15_t)0xd49f, + (q15_t)0x6f06, (q15_t)0xd496, (q15_t)0x6efd, (q15_t)0xd48d, (q15_t)0x6ef5, (q15_t)0xd483, (q15_t)0x6eec, (q15_t)0xd47a, + (q15_t)0x6ee4, (q15_t)0xd471, (q15_t)0x6edb, (q15_t)0xd468, (q15_t)0x6ed3, (q15_t)0xd45f, (q15_t)0x6eca, (q15_t)0xd455, + (q15_t)0x6ec2, (q15_t)0xd44c, (q15_t)0x6eb9, (q15_t)0xd443, (q15_t)0x6eb0, (q15_t)0xd43a, (q15_t)0x6ea8, (q15_t)0xd431, + (q15_t)0x6e9f, (q15_t)0xd428, (q15_t)0x6e97, (q15_t)0xd41e, (q15_t)0x6e8e, (q15_t)0xd415, (q15_t)0x6e85, (q15_t)0xd40c, + (q15_t)0x6e7d, (q15_t)0xd403, (q15_t)0x6e74, (q15_t)0xd3fa, (q15_t)0x6e6b, (q15_t)0xd3f1, (q15_t)0x6e63, (q15_t)0xd3e8, + (q15_t)0x6e5a, (q15_t)0xd3df, (q15_t)0x6e51, (q15_t)0xd3d5, (q15_t)0x6e49, (q15_t)0xd3cc, (q15_t)0x6e40, (q15_t)0xd3c3, + (q15_t)0x6e37, (q15_t)0xd3ba, (q15_t)0x6e2f, (q15_t)0xd3b1, (q15_t)0x6e26, (q15_t)0xd3a8, (q15_t)0x6e1d, (q15_t)0xd39f, + (q15_t)0x6e15, (q15_t)0xd396, (q15_t)0x6e0c, (q15_t)0xd38d, (q15_t)0x6e03, (q15_t)0xd384, (q15_t)0x6dfa, (q15_t)0xd37b, + (q15_t)0x6df2, (q15_t)0xd372, (q15_t)0x6de9, (q15_t)0xd369, (q15_t)0x6de0, (q15_t)0xd360, (q15_t)0x6dd7, (q15_t)0xd357, + (q15_t)0x6dcf, (q15_t)0xd34e, (q15_t)0x6dc6, (q15_t)0xd345, (q15_t)0x6dbd, (q15_t)0xd33c, (q15_t)0x6db4, (q15_t)0xd333, + (q15_t)0x6dab, (q15_t)0xd32a, (q15_t)0x6da3, (q15_t)0xd321, (q15_t)0x6d9a, (q15_t)0xd318, (q15_t)0x6d91, (q15_t)0xd30f, + (q15_t)0x6d88, (q15_t)0xd306, (q15_t)0x6d7f, (q15_t)0xd2fd, (q15_t)0x6d76, (q15_t)0xd2f4, (q15_t)0x6d6e, (q15_t)0xd2eb, + (q15_t)0x6d65, (q15_t)0xd2e2, (q15_t)0x6d5c, (q15_t)0xd2d9, (q15_t)0x6d53, (q15_t)0xd2d1, (q15_t)0x6d4a, (q15_t)0xd2c8, + (q15_t)0x6d41, (q15_t)0xd2bf, (q15_t)0x6d38, (q15_t)0xd2b6, (q15_t)0x6d2f, (q15_t)0xd2ad, (q15_t)0x6d27, (q15_t)0xd2a4, + (q15_t)0x6d1e, (q15_t)0xd29b, (q15_t)0x6d15, (q15_t)0xd292, (q15_t)0x6d0c, (q15_t)0xd28a, (q15_t)0x6d03, (q15_t)0xd281, + (q15_t)0x6cfa, (q15_t)0xd278, (q15_t)0x6cf1, (q15_t)0xd26f, (q15_t)0x6ce8, (q15_t)0xd266, (q15_t)0x6cdf, (q15_t)0xd25d, + (q15_t)0x6cd6, (q15_t)0xd255, (q15_t)0x6ccd, (q15_t)0xd24c, (q15_t)0x6cc4, (q15_t)0xd243, (q15_t)0x6cbb, (q15_t)0xd23a, + (q15_t)0x6cb2, (q15_t)0xd231, (q15_t)0x6ca9, (q15_t)0xd229, (q15_t)0x6ca0, (q15_t)0xd220, (q15_t)0x6c97, (q15_t)0xd217, + (q15_t)0x6c8e, (q15_t)0xd20e, (q15_t)0x6c85, (q15_t)0xd206, (q15_t)0x6c7c, (q15_t)0xd1fd, (q15_t)0x6c73, (q15_t)0xd1f4, + (q15_t)0x6c6a, (q15_t)0xd1eb, (q15_t)0x6c61, (q15_t)0xd1e3, (q15_t)0x6c58, (q15_t)0xd1da, (q15_t)0x6c4f, (q15_t)0xd1d1, + (q15_t)0x6c46, (q15_t)0xd1c9, (q15_t)0x6c3d, (q15_t)0xd1c0, (q15_t)0x6c34, (q15_t)0xd1b7, (q15_t)0x6c2b, (q15_t)0xd1af, + (q15_t)0x6c21, (q15_t)0xd1a6, (q15_t)0x6c18, (q15_t)0xd19d, (q15_t)0x6c0f, (q15_t)0xd195, (q15_t)0x6c06, (q15_t)0xd18c, + (q15_t)0x6bfd, (q15_t)0xd183, (q15_t)0x6bf4, (q15_t)0xd17b, (q15_t)0x6beb, (q15_t)0xd172, (q15_t)0x6be2, (q15_t)0xd169, + (q15_t)0x6bd8, (q15_t)0xd161, (q15_t)0x6bcf, (q15_t)0xd158, (q15_t)0x6bc6, (q15_t)0xd150, (q15_t)0x6bbd, (q15_t)0xd147, + (q15_t)0x6bb4, (q15_t)0xd13e, (q15_t)0x6bab, (q15_t)0xd136, (q15_t)0x6ba1, (q15_t)0xd12d, (q15_t)0x6b98, (q15_t)0xd125, + (q15_t)0x6b8f, (q15_t)0xd11c, (q15_t)0x6b86, (q15_t)0xd114, (q15_t)0x6b7d, (q15_t)0xd10b, (q15_t)0x6b73, (q15_t)0xd103, + (q15_t)0x6b6a, (q15_t)0xd0fa, (q15_t)0x6b61, (q15_t)0xd0f2, (q15_t)0x6b58, (q15_t)0xd0e9, (q15_t)0x6b4e, (q15_t)0xd0e0, + (q15_t)0x6b45, (q15_t)0xd0d8, (q15_t)0x6b3c, (q15_t)0xd0d0, (q15_t)0x6b33, (q15_t)0xd0c7, (q15_t)0x6b29, (q15_t)0xd0bf, + (q15_t)0x6b20, (q15_t)0xd0b6, (q15_t)0x6b17, (q15_t)0xd0ae, (q15_t)0x6b0d, (q15_t)0xd0a5, (q15_t)0x6b04, (q15_t)0xd09d, + (q15_t)0x6afb, (q15_t)0xd094, (q15_t)0x6af2, (q15_t)0xd08c, (q15_t)0x6ae8, (q15_t)0xd083, (q15_t)0x6adf, (q15_t)0xd07b, + (q15_t)0x6ad6, (q15_t)0xd073, (q15_t)0x6acc, (q15_t)0xd06a, (q15_t)0x6ac3, (q15_t)0xd062, (q15_t)0x6ab9, (q15_t)0xd059, + (q15_t)0x6ab0, (q15_t)0xd051, (q15_t)0x6aa7, (q15_t)0xd049, (q15_t)0x6a9d, (q15_t)0xd040, (q15_t)0x6a94, (q15_t)0xd038, + (q15_t)0x6a8b, (q15_t)0xd030, (q15_t)0x6a81, (q15_t)0xd027, (q15_t)0x6a78, (q15_t)0xd01f, (q15_t)0x6a6e, (q15_t)0xd016, + (q15_t)0x6a65, (q15_t)0xd00e, (q15_t)0x6a5c, (q15_t)0xd006, (q15_t)0x6a52, (q15_t)0xcffe, (q15_t)0x6a49, (q15_t)0xcff5, + (q15_t)0x6a3f, (q15_t)0xcfed, (q15_t)0x6a36, (q15_t)0xcfe5, (q15_t)0x6a2c, (q15_t)0xcfdc, (q15_t)0x6a23, (q15_t)0xcfd4, + (q15_t)0x6a1a, (q15_t)0xcfcc, (q15_t)0x6a10, (q15_t)0xcfc4, (q15_t)0x6a07, (q15_t)0xcfbb, (q15_t)0x69fd, (q15_t)0xcfb3, + (q15_t)0x69f4, (q15_t)0xcfab, (q15_t)0x69ea, (q15_t)0xcfa3, (q15_t)0x69e1, (q15_t)0xcf9a, (q15_t)0x69d7, (q15_t)0xcf92, + (q15_t)0x69ce, (q15_t)0xcf8a, (q15_t)0x69c4, (q15_t)0xcf82, (q15_t)0x69bb, (q15_t)0xcf79, (q15_t)0x69b1, (q15_t)0xcf71, + (q15_t)0x69a7, (q15_t)0xcf69, (q15_t)0x699e, (q15_t)0xcf61, (q15_t)0x6994, (q15_t)0xcf59, (q15_t)0x698b, (q15_t)0xcf51, + (q15_t)0x6981, (q15_t)0xcf48, (q15_t)0x6978, (q15_t)0xcf40, (q15_t)0x696e, (q15_t)0xcf38, (q15_t)0x6965, (q15_t)0xcf30, + (q15_t)0x695b, (q15_t)0xcf28, (q15_t)0x6951, (q15_t)0xcf20, (q15_t)0x6948, (q15_t)0xcf18, (q15_t)0x693e, (q15_t)0xcf10, + (q15_t)0x6935, (q15_t)0xcf07, (q15_t)0x692b, (q15_t)0xceff, (q15_t)0x6921, (q15_t)0xcef7, (q15_t)0x6918, (q15_t)0xceef, + (q15_t)0x690e, (q15_t)0xcee7, (q15_t)0x6904, (q15_t)0xcedf, (q15_t)0x68fb, (q15_t)0xced7, (q15_t)0x68f1, (q15_t)0xcecf, + (q15_t)0x68e7, (q15_t)0xcec7, (q15_t)0x68de, (q15_t)0xcebf, (q15_t)0x68d4, (q15_t)0xceb7, (q15_t)0x68ca, (q15_t)0xceaf, + (q15_t)0x68c1, (q15_t)0xcea7, (q15_t)0x68b7, (q15_t)0xce9f, (q15_t)0x68ad, (q15_t)0xce97, (q15_t)0x68a4, (q15_t)0xce8f, + (q15_t)0x689a, (q15_t)0xce87, (q15_t)0x6890, (q15_t)0xce7f, (q15_t)0x6886, (q15_t)0xce77, (q15_t)0x687d, (q15_t)0xce6f, + (q15_t)0x6873, (q15_t)0xce67, (q15_t)0x6869, (q15_t)0xce5f, (q15_t)0x6860, (q15_t)0xce57, (q15_t)0x6856, (q15_t)0xce4f, + (q15_t)0x684c, (q15_t)0xce47, (q15_t)0x6842, (q15_t)0xce40, (q15_t)0x6838, (q15_t)0xce38, (q15_t)0x682f, (q15_t)0xce30, + (q15_t)0x6825, (q15_t)0xce28, (q15_t)0x681b, (q15_t)0xce20, (q15_t)0x6811, (q15_t)0xce18, (q15_t)0x6808, (q15_t)0xce10, + (q15_t)0x67fe, (q15_t)0xce08, (q15_t)0x67f4, (q15_t)0xce01, (q15_t)0x67ea, (q15_t)0xcdf9, (q15_t)0x67e0, (q15_t)0xcdf1, + (q15_t)0x67d6, (q15_t)0xcde9, (q15_t)0x67cd, (q15_t)0xcde1, (q15_t)0x67c3, (q15_t)0xcdd9, (q15_t)0x67b9, (q15_t)0xcdd2, + (q15_t)0x67af, (q15_t)0xcdca, (q15_t)0x67a5, (q15_t)0xcdc2, (q15_t)0x679b, (q15_t)0xcdba, (q15_t)0x6791, (q15_t)0xcdb2, + (q15_t)0x6788, (q15_t)0xcdab, (q15_t)0x677e, (q15_t)0xcda3, (q15_t)0x6774, (q15_t)0xcd9b, (q15_t)0x676a, (q15_t)0xcd93, + (q15_t)0x6760, (q15_t)0xcd8c, (q15_t)0x6756, (q15_t)0xcd84, (q15_t)0x674c, (q15_t)0xcd7c, (q15_t)0x6742, (q15_t)0xcd75, + (q15_t)0x6738, (q15_t)0xcd6d, (q15_t)0x672e, (q15_t)0xcd65, (q15_t)0x6724, (q15_t)0xcd5d, (q15_t)0x671a, (q15_t)0xcd56, + (q15_t)0x6711, (q15_t)0xcd4e, (q15_t)0x6707, (q15_t)0xcd46, (q15_t)0x66fd, (q15_t)0xcd3f, (q15_t)0x66f3, (q15_t)0xcd37, + (q15_t)0x66e9, (q15_t)0xcd30, (q15_t)0x66df, (q15_t)0xcd28, (q15_t)0x66d5, (q15_t)0xcd20, (q15_t)0x66cb, (q15_t)0xcd19, + (q15_t)0x66c1, (q15_t)0xcd11, (q15_t)0x66b7, (q15_t)0xcd09, (q15_t)0x66ad, (q15_t)0xcd02, (q15_t)0x66a3, (q15_t)0xccfa, + (q15_t)0x6699, (q15_t)0xccf3, (q15_t)0x668f, (q15_t)0xcceb, (q15_t)0x6685, (q15_t)0xcce3, (q15_t)0x667b, (q15_t)0xccdc, + (q15_t)0x6671, (q15_t)0xccd4, (q15_t)0x6666, (q15_t)0xcccd, (q15_t)0x665c, (q15_t)0xccc5, (q15_t)0x6652, (q15_t)0xccbe, + (q15_t)0x6648, (q15_t)0xccb6, (q15_t)0x663e, (q15_t)0xccaf, (q15_t)0x6634, (q15_t)0xcca7, (q15_t)0x662a, (q15_t)0xcca0, + (q15_t)0x6620, (q15_t)0xcc98, (q15_t)0x6616, (q15_t)0xcc91, (q15_t)0x660c, (q15_t)0xcc89, (q15_t)0x6602, (q15_t)0xcc82, + (q15_t)0x65f8, (q15_t)0xcc7a, (q15_t)0x65ed, (q15_t)0xcc73, (q15_t)0x65e3, (q15_t)0xcc6b, (q15_t)0x65d9, (q15_t)0xcc64, + (q15_t)0x65cf, (q15_t)0xcc5d, (q15_t)0x65c5, (q15_t)0xcc55, (q15_t)0x65bb, (q15_t)0xcc4e, (q15_t)0x65b1, (q15_t)0xcc46, + (q15_t)0x65a6, (q15_t)0xcc3f, (q15_t)0x659c, (q15_t)0xcc38, (q15_t)0x6592, (q15_t)0xcc30, (q15_t)0x6588, (q15_t)0xcc29, + (q15_t)0x657e, (q15_t)0xcc21, (q15_t)0x6574, (q15_t)0xcc1a, (q15_t)0x6569, (q15_t)0xcc13, (q15_t)0x655f, (q15_t)0xcc0b, + (q15_t)0x6555, (q15_t)0xcc04, (q15_t)0x654b, (q15_t)0xcbfd, (q15_t)0x6541, (q15_t)0xcbf5, (q15_t)0x6536, (q15_t)0xcbee, + (q15_t)0x652c, (q15_t)0xcbe7, (q15_t)0x6522, (q15_t)0xcbe0, (q15_t)0x6518, (q15_t)0xcbd8, (q15_t)0x650d, (q15_t)0xcbd1, + (q15_t)0x6503, (q15_t)0xcbca, (q15_t)0x64f9, (q15_t)0xcbc2, (q15_t)0x64ef, (q15_t)0xcbbb, (q15_t)0x64e4, (q15_t)0xcbb4, + (q15_t)0x64da, (q15_t)0xcbad, (q15_t)0x64d0, (q15_t)0xcba5, (q15_t)0x64c5, (q15_t)0xcb9e, (q15_t)0x64bb, (q15_t)0xcb97, + (q15_t)0x64b1, (q15_t)0xcb90, (q15_t)0x64a7, (q15_t)0xcb89, (q15_t)0x649c, (q15_t)0xcb81, (q15_t)0x6492, (q15_t)0xcb7a, + (q15_t)0x6488, (q15_t)0xcb73, (q15_t)0x647d, (q15_t)0xcb6c, (q15_t)0x6473, (q15_t)0xcb65, (q15_t)0x6469, (q15_t)0xcb5e, + (q15_t)0x645e, (q15_t)0xcb56, (q15_t)0x6454, (q15_t)0xcb4f, (q15_t)0x644a, (q15_t)0xcb48, (q15_t)0x643f, (q15_t)0xcb41, + (q15_t)0x6435, (q15_t)0xcb3a, (q15_t)0x642b, (q15_t)0xcb33, (q15_t)0x6420, (q15_t)0xcb2c, (q15_t)0x6416, (q15_t)0xcb25, + (q15_t)0x640b, (q15_t)0xcb1e, (q15_t)0x6401, (q15_t)0xcb16, (q15_t)0x63f7, (q15_t)0xcb0f, (q15_t)0x63ec, (q15_t)0xcb08, + (q15_t)0x63e2, (q15_t)0xcb01, (q15_t)0x63d7, (q15_t)0xcafa, (q15_t)0x63cd, (q15_t)0xcaf3, (q15_t)0x63c3, (q15_t)0xcaec, + (q15_t)0x63b8, (q15_t)0xcae5, (q15_t)0x63ae, (q15_t)0xcade, (q15_t)0x63a3, (q15_t)0xcad7, (q15_t)0x6399, (q15_t)0xcad0, + (q15_t)0x638e, (q15_t)0xcac9, (q15_t)0x6384, (q15_t)0xcac2, (q15_t)0x637a, (q15_t)0xcabb, (q15_t)0x636f, (q15_t)0xcab4, + (q15_t)0x6365, (q15_t)0xcaad, (q15_t)0x635a, (q15_t)0xcaa6, (q15_t)0x6350, (q15_t)0xca9f, (q15_t)0x6345, (q15_t)0xca99, + (q15_t)0x633b, (q15_t)0xca92, (q15_t)0x6330, (q15_t)0xca8b, (q15_t)0x6326, (q15_t)0xca84, (q15_t)0x631b, (q15_t)0xca7d, + (q15_t)0x6311, (q15_t)0xca76, (q15_t)0x6306, (q15_t)0xca6f, (q15_t)0x62fc, (q15_t)0xca68, (q15_t)0x62f1, (q15_t)0xca61, + (q15_t)0x62e7, (q15_t)0xca5b, (q15_t)0x62dc, (q15_t)0xca54, (q15_t)0x62d2, (q15_t)0xca4d, (q15_t)0x62c7, (q15_t)0xca46, + (q15_t)0x62bc, (q15_t)0xca3f, (q15_t)0x62b2, (q15_t)0xca38, (q15_t)0x62a7, (q15_t)0xca32, (q15_t)0x629d, (q15_t)0xca2b, + (q15_t)0x6292, (q15_t)0xca24, (q15_t)0x6288, (q15_t)0xca1d, (q15_t)0x627d, (q15_t)0xca16, (q15_t)0x6272, (q15_t)0xca10, + (q15_t)0x6268, (q15_t)0xca09, (q15_t)0x625d, (q15_t)0xca02, (q15_t)0x6253, (q15_t)0xc9fb, (q15_t)0x6248, (q15_t)0xc9f5, + (q15_t)0x623d, (q15_t)0xc9ee, (q15_t)0x6233, (q15_t)0xc9e7, (q15_t)0x6228, (q15_t)0xc9e0, (q15_t)0x621e, (q15_t)0xc9da, + (q15_t)0x6213, (q15_t)0xc9d3, (q15_t)0x6208, (q15_t)0xc9cc, (q15_t)0x61fe, (q15_t)0xc9c6, (q15_t)0x61f3, (q15_t)0xc9bf, + (q15_t)0x61e8, (q15_t)0xc9b8, (q15_t)0x61de, (q15_t)0xc9b2, (q15_t)0x61d3, (q15_t)0xc9ab, (q15_t)0x61c8, (q15_t)0xc9a4, + (q15_t)0x61be, (q15_t)0xc99e, (q15_t)0x61b3, (q15_t)0xc997, (q15_t)0x61a8, (q15_t)0xc991, (q15_t)0x619e, (q15_t)0xc98a, + (q15_t)0x6193, (q15_t)0xc983, (q15_t)0x6188, (q15_t)0xc97d, (q15_t)0x617d, (q15_t)0xc976, (q15_t)0x6173, (q15_t)0xc970, + (q15_t)0x6168, (q15_t)0xc969, (q15_t)0x615d, (q15_t)0xc963, (q15_t)0x6153, (q15_t)0xc95c, (q15_t)0x6148, (q15_t)0xc955, + (q15_t)0x613d, (q15_t)0xc94f, (q15_t)0x6132, (q15_t)0xc948, (q15_t)0x6128, (q15_t)0xc942, (q15_t)0x611d, (q15_t)0xc93b, + (q15_t)0x6112, (q15_t)0xc935, (q15_t)0x6107, (q15_t)0xc92e, (q15_t)0x60fd, (q15_t)0xc928, (q15_t)0x60f2, (q15_t)0xc921, + (q15_t)0x60e7, (q15_t)0xc91b, (q15_t)0x60dc, (q15_t)0xc915, (q15_t)0x60d1, (q15_t)0xc90e, (q15_t)0x60c7, (q15_t)0xc908, + (q15_t)0x60bc, (q15_t)0xc901, (q15_t)0x60b1, (q15_t)0xc8fb, (q15_t)0x60a6, (q15_t)0xc8f4, (q15_t)0x609b, (q15_t)0xc8ee, + (q15_t)0x6091, (q15_t)0xc8e8, (q15_t)0x6086, (q15_t)0xc8e1, (q15_t)0x607b, (q15_t)0xc8db, (q15_t)0x6070, (q15_t)0xc8d4, + (q15_t)0x6065, (q15_t)0xc8ce, (q15_t)0x605b, (q15_t)0xc8c8, (q15_t)0x6050, (q15_t)0xc8c1, (q15_t)0x6045, (q15_t)0xc8bb, + (q15_t)0x603a, (q15_t)0xc8b5, (q15_t)0x602f, (q15_t)0xc8ae, (q15_t)0x6024, (q15_t)0xc8a8, (q15_t)0x6019, (q15_t)0xc8a2, + (q15_t)0x600f, (q15_t)0xc89b, (q15_t)0x6004, (q15_t)0xc895, (q15_t)0x5ff9, (q15_t)0xc88f, (q15_t)0x5fee, (q15_t)0xc889, + (q15_t)0x5fe3, (q15_t)0xc882, (q15_t)0x5fd8, (q15_t)0xc87c, (q15_t)0x5fcd, (q15_t)0xc876, (q15_t)0x5fc2, (q15_t)0xc870, + (q15_t)0x5fb7, (q15_t)0xc869, (q15_t)0x5fac, (q15_t)0xc863, (q15_t)0x5fa2, (q15_t)0xc85d, (q15_t)0x5f97, (q15_t)0xc857, + (q15_t)0x5f8c, (q15_t)0xc850, (q15_t)0x5f81, (q15_t)0xc84a, (q15_t)0x5f76, (q15_t)0xc844, (q15_t)0x5f6b, (q15_t)0xc83e, + (q15_t)0x5f60, (q15_t)0xc838, (q15_t)0x5f55, (q15_t)0xc832, (q15_t)0x5f4a, (q15_t)0xc82b, (q15_t)0x5f3f, (q15_t)0xc825, + (q15_t)0x5f34, (q15_t)0xc81f, (q15_t)0x5f29, (q15_t)0xc819, (q15_t)0x5f1e, (q15_t)0xc813, (q15_t)0x5f13, (q15_t)0xc80d, + (q15_t)0x5f08, (q15_t)0xc807, (q15_t)0x5efd, (q15_t)0xc801, (q15_t)0x5ef2, (q15_t)0xc7fb, (q15_t)0x5ee7, (q15_t)0xc7f5, + (q15_t)0x5edc, (q15_t)0xc7ee, (q15_t)0x5ed1, (q15_t)0xc7e8, (q15_t)0x5ec6, (q15_t)0xc7e2, (q15_t)0x5ebb, (q15_t)0xc7dc, + (q15_t)0x5eb0, (q15_t)0xc7d6, (q15_t)0x5ea5, (q15_t)0xc7d0, (q15_t)0x5e9a, (q15_t)0xc7ca, (q15_t)0x5e8f, (q15_t)0xc7c4, + (q15_t)0x5e84, (q15_t)0xc7be, (q15_t)0x5e79, (q15_t)0xc7b8, (q15_t)0x5e6e, (q15_t)0xc7b2, (q15_t)0x5e63, (q15_t)0xc7ac, + (q15_t)0x5e58, (q15_t)0xc7a6, (q15_t)0x5e4d, (q15_t)0xc7a0, (q15_t)0x5e42, (q15_t)0xc79a, (q15_t)0x5e36, (q15_t)0xc795, + (q15_t)0x5e2b, (q15_t)0xc78f, (q15_t)0x5e20, (q15_t)0xc789, (q15_t)0x5e15, (q15_t)0xc783, (q15_t)0x5e0a, (q15_t)0xc77d, + (q15_t)0x5dff, (q15_t)0xc777, (q15_t)0x5df4, (q15_t)0xc771, (q15_t)0x5de9, (q15_t)0xc76b, (q15_t)0x5dde, (q15_t)0xc765, + (q15_t)0x5dd3, (q15_t)0xc75f, (q15_t)0x5dc7, (q15_t)0xc75a, (q15_t)0x5dbc, (q15_t)0xc754, (q15_t)0x5db1, (q15_t)0xc74e, + (q15_t)0x5da6, (q15_t)0xc748, (q15_t)0x5d9b, (q15_t)0xc742, (q15_t)0x5d90, (q15_t)0xc73d, (q15_t)0x5d85, (q15_t)0xc737, + (q15_t)0x5d79, (q15_t)0xc731, (q15_t)0x5d6e, (q15_t)0xc72b, (q15_t)0x5d63, (q15_t)0xc725, (q15_t)0x5d58, (q15_t)0xc720, + (q15_t)0x5d4d, (q15_t)0xc71a, (q15_t)0x5d42, (q15_t)0xc714, (q15_t)0x5d36, (q15_t)0xc70e, (q15_t)0x5d2b, (q15_t)0xc709, + (q15_t)0x5d20, (q15_t)0xc703, (q15_t)0x5d15, (q15_t)0xc6fd, (q15_t)0x5d0a, (q15_t)0xc6f7, (q15_t)0x5cff, (q15_t)0xc6f2, + (q15_t)0x5cf3, (q15_t)0xc6ec, (q15_t)0x5ce8, (q15_t)0xc6e6, (q15_t)0x5cdd, (q15_t)0xc6e1, (q15_t)0x5cd2, (q15_t)0xc6db, + (q15_t)0x5cc6, (q15_t)0xc6d5, (q15_t)0x5cbb, (q15_t)0xc6d0, (q15_t)0x5cb0, (q15_t)0xc6ca, (q15_t)0x5ca5, (q15_t)0xc6c5, + (q15_t)0x5c99, (q15_t)0xc6bf, (q15_t)0x5c8e, (q15_t)0xc6b9, (q15_t)0x5c83, (q15_t)0xc6b4, (q15_t)0x5c78, (q15_t)0xc6ae, + (q15_t)0x5c6c, (q15_t)0xc6a8, (q15_t)0x5c61, (q15_t)0xc6a3, (q15_t)0x5c56, (q15_t)0xc69d, (q15_t)0x5c4b, (q15_t)0xc698, + (q15_t)0x5c3f, (q15_t)0xc692, (q15_t)0x5c34, (q15_t)0xc68d, (q15_t)0x5c29, (q15_t)0xc687, (q15_t)0x5c1e, (q15_t)0xc682, + (q15_t)0x5c12, (q15_t)0xc67c, (q15_t)0x5c07, (q15_t)0xc677, (q15_t)0x5bfc, (q15_t)0xc671, (q15_t)0x5bf0, (q15_t)0xc66c, + (q15_t)0x5be5, (q15_t)0xc666, (q15_t)0x5bda, (q15_t)0xc661, (q15_t)0x5bce, (q15_t)0xc65b, (q15_t)0x5bc3, (q15_t)0xc656, + (q15_t)0x5bb8, (q15_t)0xc650, (q15_t)0x5bac, (q15_t)0xc64b, (q15_t)0x5ba1, (q15_t)0xc645, (q15_t)0x5b96, (q15_t)0xc640, + (q15_t)0x5b8a, (q15_t)0xc63b, (q15_t)0x5b7f, (q15_t)0xc635, (q15_t)0x5b74, (q15_t)0xc630, (q15_t)0x5b68, (q15_t)0xc62a, + (q15_t)0x5b5d, (q15_t)0xc625, (q15_t)0x5b52, (q15_t)0xc620, (q15_t)0x5b46, (q15_t)0xc61a, (q15_t)0x5b3b, (q15_t)0xc615, + (q15_t)0x5b30, (q15_t)0xc610, (q15_t)0x5b24, (q15_t)0xc60a, (q15_t)0x5b19, (q15_t)0xc605, (q15_t)0x5b0d, (q15_t)0xc600, + (q15_t)0x5b02, (q15_t)0xc5fa, (q15_t)0x5af7, (q15_t)0xc5f5, (q15_t)0x5aeb, (q15_t)0xc5f0, (q15_t)0x5ae0, (q15_t)0xc5ea, + (q15_t)0x5ad4, (q15_t)0xc5e5, (q15_t)0x5ac9, (q15_t)0xc5e0, (q15_t)0x5abe, (q15_t)0xc5db, (q15_t)0x5ab2, (q15_t)0xc5d5, + (q15_t)0x5aa7, (q15_t)0xc5d0, (q15_t)0x5a9b, (q15_t)0xc5cb, (q15_t)0x5a90, (q15_t)0xc5c6, (q15_t)0x5a84, (q15_t)0xc5c1, + (q15_t)0x5a79, (q15_t)0xc5bb, (q15_t)0x5a6e, (q15_t)0xc5b6, (q15_t)0x5a62, (q15_t)0xc5b1, (q15_t)0x5a57, (q15_t)0xc5ac, + (q15_t)0x5a4b, (q15_t)0xc5a7, (q15_t)0x5a40, (q15_t)0xc5a1, (q15_t)0x5a34, (q15_t)0xc59c, (q15_t)0x5a29, (q15_t)0xc597, + (q15_t)0x5a1d, (q15_t)0xc592, (q15_t)0x5a12, (q15_t)0xc58d, (q15_t)0x5a06, (q15_t)0xc588, (q15_t)0x59fb, (q15_t)0xc583, + (q15_t)0x59ef, (q15_t)0xc57e, (q15_t)0x59e4, (q15_t)0xc578, (q15_t)0x59d8, (q15_t)0xc573, (q15_t)0x59cd, (q15_t)0xc56e, + (q15_t)0x59c1, (q15_t)0xc569, (q15_t)0x59b6, (q15_t)0xc564, (q15_t)0x59aa, (q15_t)0xc55f, (q15_t)0x599f, (q15_t)0xc55a, + (q15_t)0x5993, (q15_t)0xc555, (q15_t)0x5988, (q15_t)0xc550, (q15_t)0x597c, (q15_t)0xc54b, (q15_t)0x5971, (q15_t)0xc546, + (q15_t)0x5965, (q15_t)0xc541, (q15_t)0x595a, (q15_t)0xc53c, (q15_t)0x594e, (q15_t)0xc537, (q15_t)0x5943, (q15_t)0xc532, + (q15_t)0x5937, (q15_t)0xc52d, (q15_t)0x592c, (q15_t)0xc528, (q15_t)0x5920, (q15_t)0xc523, (q15_t)0x5914, (q15_t)0xc51e, + (q15_t)0x5909, (q15_t)0xc51a, (q15_t)0x58fd, (q15_t)0xc515, (q15_t)0x58f2, (q15_t)0xc510, (q15_t)0x58e6, (q15_t)0xc50b, + (q15_t)0x58db, (q15_t)0xc506, (q15_t)0x58cf, (q15_t)0xc501, (q15_t)0x58c3, (q15_t)0xc4fc, (q15_t)0x58b8, (q15_t)0xc4f7, + (q15_t)0x58ac, (q15_t)0xc4f2, (q15_t)0x58a1, (q15_t)0xc4ee, (q15_t)0x5895, (q15_t)0xc4e9, (q15_t)0x5889, (q15_t)0xc4e4, + (q15_t)0x587e, (q15_t)0xc4df, (q15_t)0x5872, (q15_t)0xc4da, (q15_t)0x5867, (q15_t)0xc4d6, (q15_t)0x585b, (q15_t)0xc4d1, + (q15_t)0x584f, (q15_t)0xc4cc, (q15_t)0x5844, (q15_t)0xc4c7, (q15_t)0x5838, (q15_t)0xc4c2, (q15_t)0x582d, (q15_t)0xc4be, + (q15_t)0x5821, (q15_t)0xc4b9, (q15_t)0x5815, (q15_t)0xc4b4, (q15_t)0x580a, (q15_t)0xc4b0, (q15_t)0x57fe, (q15_t)0xc4ab, + (q15_t)0x57f2, (q15_t)0xc4a6, (q15_t)0x57e7, (q15_t)0xc4a1, (q15_t)0x57db, (q15_t)0xc49d, (q15_t)0x57cf, (q15_t)0xc498, + (q15_t)0x57c4, (q15_t)0xc493, (q15_t)0x57b8, (q15_t)0xc48f, (q15_t)0x57ac, (q15_t)0xc48a, (q15_t)0x57a1, (q15_t)0xc485, + (q15_t)0x5795, (q15_t)0xc481, (q15_t)0x5789, (q15_t)0xc47c, (q15_t)0x577e, (q15_t)0xc478, (q15_t)0x5772, (q15_t)0xc473, + (q15_t)0x5766, (q15_t)0xc46e, (q15_t)0x575b, (q15_t)0xc46a, (q15_t)0x574f, (q15_t)0xc465, (q15_t)0x5743, (q15_t)0xc461, + (q15_t)0x5737, (q15_t)0xc45c, (q15_t)0x572c, (q15_t)0xc457, (q15_t)0x5720, (q15_t)0xc453, (q15_t)0x5714, (q15_t)0xc44e, + (q15_t)0x5709, (q15_t)0xc44a, (q15_t)0x56fd, (q15_t)0xc445, (q15_t)0x56f1, (q15_t)0xc441, (q15_t)0x56e5, (q15_t)0xc43c, + (q15_t)0x56da, (q15_t)0xc438, (q15_t)0x56ce, (q15_t)0xc433, (q15_t)0x56c2, (q15_t)0xc42f, (q15_t)0x56b6, (q15_t)0xc42a, + (q15_t)0x56ab, (q15_t)0xc426, (q15_t)0x569f, (q15_t)0xc422, (q15_t)0x5693, (q15_t)0xc41d, (q15_t)0x5687, (q15_t)0xc419, + (q15_t)0x567c, (q15_t)0xc414, (q15_t)0x5670, (q15_t)0xc410, (q15_t)0x5664, (q15_t)0xc40b, (q15_t)0x5658, (q15_t)0xc407, + (q15_t)0x564c, (q15_t)0xc403, (q15_t)0x5641, (q15_t)0xc3fe, (q15_t)0x5635, (q15_t)0xc3fa, (q15_t)0x5629, (q15_t)0xc3f6, + (q15_t)0x561d, (q15_t)0xc3f1, (q15_t)0x5612, (q15_t)0xc3ed, (q15_t)0x5606, (q15_t)0xc3e9, (q15_t)0x55fa, (q15_t)0xc3e4, + (q15_t)0x55ee, (q15_t)0xc3e0, (q15_t)0x55e2, (q15_t)0xc3dc, (q15_t)0x55d7, (q15_t)0xc3d7, (q15_t)0x55cb, (q15_t)0xc3d3, + (q15_t)0x55bf, (q15_t)0xc3cf, (q15_t)0x55b3, (q15_t)0xc3ca, (q15_t)0x55a7, (q15_t)0xc3c6, (q15_t)0x559b, (q15_t)0xc3c2, + (q15_t)0x5590, (q15_t)0xc3be, (q15_t)0x5584, (q15_t)0xc3ba, (q15_t)0x5578, (q15_t)0xc3b5, (q15_t)0x556c, (q15_t)0xc3b1, + (q15_t)0x5560, (q15_t)0xc3ad, (q15_t)0x5554, (q15_t)0xc3a9, (q15_t)0x5549, (q15_t)0xc3a5, (q15_t)0x553d, (q15_t)0xc3a0, + (q15_t)0x5531, (q15_t)0xc39c, (q15_t)0x5525, (q15_t)0xc398, (q15_t)0x5519, (q15_t)0xc394, (q15_t)0x550d, (q15_t)0xc390, + (q15_t)0x5501, (q15_t)0xc38c, (q15_t)0x54f6, (q15_t)0xc387, (q15_t)0x54ea, (q15_t)0xc383, (q15_t)0x54de, (q15_t)0xc37f, + (q15_t)0x54d2, (q15_t)0xc37b, (q15_t)0x54c6, (q15_t)0xc377, (q15_t)0x54ba, (q15_t)0xc373, (q15_t)0x54ae, (q15_t)0xc36f, + (q15_t)0x54a2, (q15_t)0xc36b, (q15_t)0x5496, (q15_t)0xc367, (q15_t)0x548b, (q15_t)0xc363, (q15_t)0x547f, (q15_t)0xc35f, + (q15_t)0x5473, (q15_t)0xc35b, (q15_t)0x5467, (q15_t)0xc357, (q15_t)0x545b, (q15_t)0xc353, (q15_t)0x544f, (q15_t)0xc34f, + (q15_t)0x5443, (q15_t)0xc34b, (q15_t)0x5437, (q15_t)0xc347, (q15_t)0x542b, (q15_t)0xc343, (q15_t)0x541f, (q15_t)0xc33f, + (q15_t)0x5413, (q15_t)0xc33b, (q15_t)0x5407, (q15_t)0xc337, (q15_t)0x53fb, (q15_t)0xc333, (q15_t)0x53f0, (q15_t)0xc32f, + (q15_t)0x53e4, (q15_t)0xc32b, (q15_t)0x53d8, (q15_t)0xc327, (q15_t)0x53cc, (q15_t)0xc323, (q15_t)0x53c0, (q15_t)0xc320, + (q15_t)0x53b4, (q15_t)0xc31c, (q15_t)0x53a8, (q15_t)0xc318, (q15_t)0x539c, (q15_t)0xc314, (q15_t)0x5390, (q15_t)0xc310, + (q15_t)0x5384, (q15_t)0xc30c, (q15_t)0x5378, (q15_t)0xc308, (q15_t)0x536c, (q15_t)0xc305, (q15_t)0x5360, (q15_t)0xc301, + (q15_t)0x5354, (q15_t)0xc2fd, (q15_t)0x5348, (q15_t)0xc2f9, (q15_t)0x533c, (q15_t)0xc2f5, (q15_t)0x5330, (q15_t)0xc2f2, + (q15_t)0x5324, (q15_t)0xc2ee, (q15_t)0x5318, (q15_t)0xc2ea, (q15_t)0x530c, (q15_t)0xc2e6, (q15_t)0x5300, (q15_t)0xc2e3, + (q15_t)0x52f4, (q15_t)0xc2df, (q15_t)0x52e8, (q15_t)0xc2db, (q15_t)0x52dc, (q15_t)0xc2d8, (q15_t)0x52d0, (q15_t)0xc2d4, + (q15_t)0x52c4, (q15_t)0xc2d0, (q15_t)0x52b8, (q15_t)0xc2cc, (q15_t)0x52ac, (q15_t)0xc2c9, (q15_t)0x52a0, (q15_t)0xc2c5, + (q15_t)0x5294, (q15_t)0xc2c1, (q15_t)0x5288, (q15_t)0xc2be, (q15_t)0x527c, (q15_t)0xc2ba, (q15_t)0x5270, (q15_t)0xc2b7, + (q15_t)0x5264, (q15_t)0xc2b3, (q15_t)0x5258, (q15_t)0xc2af, (q15_t)0x524c, (q15_t)0xc2ac, (q15_t)0x5240, (q15_t)0xc2a8, + (q15_t)0x5234, (q15_t)0xc2a5, (q15_t)0x5228, (q15_t)0xc2a1, (q15_t)0x521c, (q15_t)0xc29d, (q15_t)0x5210, (q15_t)0xc29a, + (q15_t)0x5204, (q15_t)0xc296, (q15_t)0x51f7, (q15_t)0xc293, (q15_t)0x51eb, (q15_t)0xc28f, (q15_t)0x51df, (q15_t)0xc28c, + (q15_t)0x51d3, (q15_t)0xc288, (q15_t)0x51c7, (q15_t)0xc285, (q15_t)0x51bb, (q15_t)0xc281, (q15_t)0x51af, (q15_t)0xc27e, + (q15_t)0x51a3, (q15_t)0xc27a, (q15_t)0x5197, (q15_t)0xc277, (q15_t)0x518b, (q15_t)0xc273, (q15_t)0x517f, (q15_t)0xc270, + (q15_t)0x5173, (q15_t)0xc26d, (q15_t)0x5167, (q15_t)0xc269, (q15_t)0x515a, (q15_t)0xc266, (q15_t)0x514e, (q15_t)0xc262, + (q15_t)0x5142, (q15_t)0xc25f, (q15_t)0x5136, (q15_t)0xc25c, (q15_t)0x512a, (q15_t)0xc258, (q15_t)0x511e, (q15_t)0xc255, + (q15_t)0x5112, (q15_t)0xc251, (q15_t)0x5106, (q15_t)0xc24e, (q15_t)0x50fa, (q15_t)0xc24b, (q15_t)0x50ed, (q15_t)0xc247, + (q15_t)0x50e1, (q15_t)0xc244, (q15_t)0x50d5, (q15_t)0xc241, (q15_t)0x50c9, (q15_t)0xc23e, (q15_t)0x50bd, (q15_t)0xc23a, + (q15_t)0x50b1, (q15_t)0xc237, (q15_t)0x50a5, (q15_t)0xc234, (q15_t)0x5099, (q15_t)0xc230, (q15_t)0x508c, (q15_t)0xc22d, + (q15_t)0x5080, (q15_t)0xc22a, (q15_t)0x5074, (q15_t)0xc227, (q15_t)0x5068, (q15_t)0xc223, (q15_t)0x505c, (q15_t)0xc220, + (q15_t)0x5050, (q15_t)0xc21d, (q15_t)0x5044, (q15_t)0xc21a, (q15_t)0x5037, (q15_t)0xc217, (q15_t)0x502b, (q15_t)0xc213, + (q15_t)0x501f, (q15_t)0xc210, (q15_t)0x5013, (q15_t)0xc20d, (q15_t)0x5007, (q15_t)0xc20a, (q15_t)0x4ffb, (q15_t)0xc207, + (q15_t)0x4fee, (q15_t)0xc204, (q15_t)0x4fe2, (q15_t)0xc201, (q15_t)0x4fd6, (q15_t)0xc1fd, (q15_t)0x4fca, (q15_t)0xc1fa, + (q15_t)0x4fbe, (q15_t)0xc1f7, (q15_t)0x4fb2, (q15_t)0xc1f4, (q15_t)0x4fa5, (q15_t)0xc1f1, (q15_t)0x4f99, (q15_t)0xc1ee, + (q15_t)0x4f8d, (q15_t)0xc1eb, (q15_t)0x4f81, (q15_t)0xc1e8, (q15_t)0x4f75, (q15_t)0xc1e5, (q15_t)0x4f68, (q15_t)0xc1e2, + (q15_t)0x4f5c, (q15_t)0xc1df, (q15_t)0x4f50, (q15_t)0xc1dc, (q15_t)0x4f44, (q15_t)0xc1d9, (q15_t)0x4f38, (q15_t)0xc1d6, + (q15_t)0x4f2b, (q15_t)0xc1d3, (q15_t)0x4f1f, (q15_t)0xc1d0, (q15_t)0x4f13, (q15_t)0xc1cd, (q15_t)0x4f07, (q15_t)0xc1ca, + (q15_t)0x4efb, (q15_t)0xc1c7, (q15_t)0x4eee, (q15_t)0xc1c4, (q15_t)0x4ee2, (q15_t)0xc1c1, (q15_t)0x4ed6, (q15_t)0xc1be, + (q15_t)0x4eca, (q15_t)0xc1bb, (q15_t)0x4ebd, (q15_t)0xc1b8, (q15_t)0x4eb1, (q15_t)0xc1b6, (q15_t)0x4ea5, (q15_t)0xc1b3, + (q15_t)0x4e99, (q15_t)0xc1b0, (q15_t)0x4e8c, (q15_t)0xc1ad, (q15_t)0x4e80, (q15_t)0xc1aa, (q15_t)0x4e74, (q15_t)0xc1a7, + (q15_t)0x4e68, (q15_t)0xc1a4, (q15_t)0x4e5c, (q15_t)0xc1a2, (q15_t)0x4e4f, (q15_t)0xc19f, (q15_t)0x4e43, (q15_t)0xc19c, + (q15_t)0x4e37, (q15_t)0xc199, (q15_t)0x4e2b, (q15_t)0xc196, (q15_t)0x4e1e, (q15_t)0xc194, (q15_t)0x4e12, (q15_t)0xc191, + (q15_t)0x4e06, (q15_t)0xc18e, (q15_t)0x4df9, (q15_t)0xc18b, (q15_t)0x4ded, (q15_t)0xc189, (q15_t)0x4de1, (q15_t)0xc186, + (q15_t)0x4dd5, (q15_t)0xc183, (q15_t)0x4dc8, (q15_t)0xc180, (q15_t)0x4dbc, (q15_t)0xc17e, (q15_t)0x4db0, (q15_t)0xc17b, + (q15_t)0x4da4, (q15_t)0xc178, (q15_t)0x4d97, (q15_t)0xc176, (q15_t)0x4d8b, (q15_t)0xc173, (q15_t)0x4d7f, (q15_t)0xc170, + (q15_t)0x4d72, (q15_t)0xc16e, (q15_t)0x4d66, (q15_t)0xc16b, (q15_t)0x4d5a, (q15_t)0xc168, (q15_t)0x4d4e, (q15_t)0xc166, + (q15_t)0x4d41, (q15_t)0xc163, (q15_t)0x4d35, (q15_t)0xc161, (q15_t)0x4d29, (q15_t)0xc15e, (q15_t)0x4d1c, (q15_t)0xc15b, + (q15_t)0x4d10, (q15_t)0xc159, (q15_t)0x4d04, (q15_t)0xc156, (q15_t)0x4cf8, (q15_t)0xc154, (q15_t)0x4ceb, (q15_t)0xc151, + (q15_t)0x4cdf, (q15_t)0xc14f, (q15_t)0x4cd3, (q15_t)0xc14c, (q15_t)0x4cc6, (q15_t)0xc14a, (q15_t)0x4cba, (q15_t)0xc147, + (q15_t)0x4cae, (q15_t)0xc145, (q15_t)0x4ca1, (q15_t)0xc142, (q15_t)0x4c95, (q15_t)0xc140, (q15_t)0x4c89, (q15_t)0xc13d, + (q15_t)0x4c7c, (q15_t)0xc13b, (q15_t)0x4c70, (q15_t)0xc138, (q15_t)0x4c64, (q15_t)0xc136, (q15_t)0x4c57, (q15_t)0xc134, + (q15_t)0x4c4b, (q15_t)0xc131, (q15_t)0x4c3f, (q15_t)0xc12f, (q15_t)0x4c32, (q15_t)0xc12c, (q15_t)0x4c26, (q15_t)0xc12a, + (q15_t)0x4c1a, (q15_t)0xc128, (q15_t)0x4c0d, (q15_t)0xc125, (q15_t)0x4c01, (q15_t)0xc123, (q15_t)0x4bf5, (q15_t)0xc120, + (q15_t)0x4be8, (q15_t)0xc11e, (q15_t)0x4bdc, (q15_t)0xc11c, (q15_t)0x4bd0, (q15_t)0xc119, (q15_t)0x4bc3, (q15_t)0xc117, + (q15_t)0x4bb7, (q15_t)0xc115, (q15_t)0x4bab, (q15_t)0xc113, (q15_t)0x4b9e, (q15_t)0xc110, (q15_t)0x4b92, (q15_t)0xc10e, + (q15_t)0x4b85, (q15_t)0xc10c, (q15_t)0x4b79, (q15_t)0xc109, (q15_t)0x4b6d, (q15_t)0xc107, (q15_t)0x4b60, (q15_t)0xc105, + (q15_t)0x4b54, (q15_t)0xc103, (q15_t)0x4b48, (q15_t)0xc100, (q15_t)0x4b3b, (q15_t)0xc0fe, (q15_t)0x4b2f, (q15_t)0xc0fc, + (q15_t)0x4b23, (q15_t)0xc0fa, (q15_t)0x4b16, (q15_t)0xc0f8, (q15_t)0x4b0a, (q15_t)0xc0f6, (q15_t)0x4afd, (q15_t)0xc0f3, + (q15_t)0x4af1, (q15_t)0xc0f1, (q15_t)0x4ae5, (q15_t)0xc0ef, (q15_t)0x4ad8, (q15_t)0xc0ed, (q15_t)0x4acc, (q15_t)0xc0eb, + (q15_t)0x4ac0, (q15_t)0xc0e9, (q15_t)0x4ab3, (q15_t)0xc0e7, (q15_t)0x4aa7, (q15_t)0xc0e4, (q15_t)0x4a9a, (q15_t)0xc0e2, + (q15_t)0x4a8e, (q15_t)0xc0e0, (q15_t)0x4a82, (q15_t)0xc0de, (q15_t)0x4a75, (q15_t)0xc0dc, (q15_t)0x4a69, (q15_t)0xc0da, + (q15_t)0x4a5c, (q15_t)0xc0d8, (q15_t)0x4a50, (q15_t)0xc0d6, (q15_t)0x4a44, (q15_t)0xc0d4, (q15_t)0x4a37, (q15_t)0xc0d2, + (q15_t)0x4a2b, (q15_t)0xc0d0, (q15_t)0x4a1e, (q15_t)0xc0ce, (q15_t)0x4a12, (q15_t)0xc0cc, (q15_t)0x4a06, (q15_t)0xc0ca, + (q15_t)0x49f9, (q15_t)0xc0c8, (q15_t)0x49ed, (q15_t)0xc0c6, (q15_t)0x49e0, (q15_t)0xc0c4, (q15_t)0x49d4, (q15_t)0xc0c2, + (q15_t)0x49c7, (q15_t)0xc0c0, (q15_t)0x49bb, (q15_t)0xc0be, (q15_t)0x49af, (q15_t)0xc0bd, (q15_t)0x49a2, (q15_t)0xc0bb, + (q15_t)0x4996, (q15_t)0xc0b9, (q15_t)0x4989, (q15_t)0xc0b7, (q15_t)0x497d, (q15_t)0xc0b5, (q15_t)0x4970, (q15_t)0xc0b3, + (q15_t)0x4964, (q15_t)0xc0b1, (q15_t)0x4958, (q15_t)0xc0af, (q15_t)0x494b, (q15_t)0xc0ae, (q15_t)0x493f, (q15_t)0xc0ac, + (q15_t)0x4932, (q15_t)0xc0aa, (q15_t)0x4926, (q15_t)0xc0a8, (q15_t)0x4919, (q15_t)0xc0a6, (q15_t)0x490d, (q15_t)0xc0a5, + (q15_t)0x4901, (q15_t)0xc0a3, (q15_t)0x48f4, (q15_t)0xc0a1, (q15_t)0x48e8, (q15_t)0xc09f, (q15_t)0x48db, (q15_t)0xc09e, + (q15_t)0x48cf, (q15_t)0xc09c, (q15_t)0x48c2, (q15_t)0xc09a, (q15_t)0x48b6, (q15_t)0xc098, (q15_t)0x48a9, (q15_t)0xc097, + (q15_t)0x489d, (q15_t)0xc095, (q15_t)0x4891, (q15_t)0xc093, (q15_t)0x4884, (q15_t)0xc092, (q15_t)0x4878, (q15_t)0xc090, + (q15_t)0x486b, (q15_t)0xc08e, (q15_t)0x485f, (q15_t)0xc08d, (q15_t)0x4852, (q15_t)0xc08b, (q15_t)0x4846, (q15_t)0xc089, + (q15_t)0x4839, (q15_t)0xc088, (q15_t)0x482d, (q15_t)0xc086, (q15_t)0x4820, (q15_t)0xc085, (q15_t)0x4814, (q15_t)0xc083, + (q15_t)0x4807, (q15_t)0xc081, (q15_t)0x47fb, (q15_t)0xc080, (q15_t)0x47ef, (q15_t)0xc07e, (q15_t)0x47e2, (q15_t)0xc07d, + (q15_t)0x47d6, (q15_t)0xc07b, (q15_t)0x47c9, (q15_t)0xc07a, (q15_t)0x47bd, (q15_t)0xc078, (q15_t)0x47b0, (q15_t)0xc077, + (q15_t)0x47a4, (q15_t)0xc075, (q15_t)0x4797, (q15_t)0xc074, (q15_t)0x478b, (q15_t)0xc072, (q15_t)0x477e, (q15_t)0xc071, + (q15_t)0x4772, (q15_t)0xc06f, (q15_t)0x4765, (q15_t)0xc06e, (q15_t)0x4759, (q15_t)0xc06c, (q15_t)0x474c, (q15_t)0xc06b, + (q15_t)0x4740, (q15_t)0xc069, (q15_t)0x4733, (q15_t)0xc068, (q15_t)0x4727, (q15_t)0xc067, (q15_t)0x471a, (q15_t)0xc065, + (q15_t)0x470e, (q15_t)0xc064, (q15_t)0x4701, (q15_t)0xc062, (q15_t)0x46f5, (q15_t)0xc061, (q15_t)0x46e8, (q15_t)0xc060, + (q15_t)0x46dc, (q15_t)0xc05e, (q15_t)0x46cf, (q15_t)0xc05d, (q15_t)0x46c3, (q15_t)0xc05c, (q15_t)0x46b6, (q15_t)0xc05a, + (q15_t)0x46aa, (q15_t)0xc059, (q15_t)0x469d, (q15_t)0xc058, (q15_t)0x4691, (q15_t)0xc056, (q15_t)0x4684, (q15_t)0xc055, + (q15_t)0x4678, (q15_t)0xc054, (q15_t)0x466b, (q15_t)0xc053, (q15_t)0x465f, (q15_t)0xc051, (q15_t)0x4652, (q15_t)0xc050, + (q15_t)0x4646, (q15_t)0xc04f, (q15_t)0x4639, (q15_t)0xc04e, (q15_t)0x462d, (q15_t)0xc04c, (q15_t)0x4620, (q15_t)0xc04b, + (q15_t)0x4614, (q15_t)0xc04a, (q15_t)0x4607, (q15_t)0xc049, (q15_t)0x45fb, (q15_t)0xc048, (q15_t)0x45ee, (q15_t)0xc047, + (q15_t)0x45e2, (q15_t)0xc045, (q15_t)0x45d5, (q15_t)0xc044, (q15_t)0x45c9, (q15_t)0xc043, (q15_t)0x45bc, (q15_t)0xc042, + (q15_t)0x45b0, (q15_t)0xc041, (q15_t)0x45a3, (q15_t)0xc040, (q15_t)0x4597, (q15_t)0xc03f, (q15_t)0x458a, (q15_t)0xc03d, + (q15_t)0x457e, (q15_t)0xc03c, (q15_t)0x4571, (q15_t)0xc03b, (q15_t)0x4565, (q15_t)0xc03a, (q15_t)0x4558, (q15_t)0xc039, + (q15_t)0x454c, (q15_t)0xc038, (q15_t)0x453f, (q15_t)0xc037, (q15_t)0x4533, (q15_t)0xc036, (q15_t)0x4526, (q15_t)0xc035, + (q15_t)0x451a, (q15_t)0xc034, (q15_t)0x450d, (q15_t)0xc033, (q15_t)0x4500, (q15_t)0xc032, (q15_t)0x44f4, (q15_t)0xc031, + (q15_t)0x44e7, (q15_t)0xc030, (q15_t)0x44db, (q15_t)0xc02f, (q15_t)0x44ce, (q15_t)0xc02e, (q15_t)0x44c2, (q15_t)0xc02d, + (q15_t)0x44b5, (q15_t)0xc02c, (q15_t)0x44a9, (q15_t)0xc02b, (q15_t)0x449c, (q15_t)0xc02b, (q15_t)0x4490, (q15_t)0xc02a, + (q15_t)0x4483, (q15_t)0xc029, (q15_t)0x4477, (q15_t)0xc028, (q15_t)0x446a, (q15_t)0xc027, (q15_t)0x445e, (q15_t)0xc026, + (q15_t)0x4451, (q15_t)0xc025, (q15_t)0x4444, (q15_t)0xc024, (q15_t)0x4438, (q15_t)0xc024, (q15_t)0x442b, (q15_t)0xc023, + (q15_t)0x441f, (q15_t)0xc022, (q15_t)0x4412, (q15_t)0xc021, (q15_t)0x4406, (q15_t)0xc020, (q15_t)0x43f9, (q15_t)0xc020, + (q15_t)0x43ed, (q15_t)0xc01f, (q15_t)0x43e0, (q15_t)0xc01e, (q15_t)0x43d4, (q15_t)0xc01d, (q15_t)0x43c7, (q15_t)0xc01d, + (q15_t)0x43bb, (q15_t)0xc01c, (q15_t)0x43ae, (q15_t)0xc01b, (q15_t)0x43a1, (q15_t)0xc01a, (q15_t)0x4395, (q15_t)0xc01a, + (q15_t)0x4388, (q15_t)0xc019, (q15_t)0x437c, (q15_t)0xc018, (q15_t)0x436f, (q15_t)0xc018, (q15_t)0x4363, (q15_t)0xc017, + (q15_t)0x4356, (q15_t)0xc016, (q15_t)0x434a, (q15_t)0xc016, (q15_t)0x433d, (q15_t)0xc015, (q15_t)0x4330, (q15_t)0xc014, + (q15_t)0x4324, (q15_t)0xc014, (q15_t)0x4317, (q15_t)0xc013, (q15_t)0x430b, (q15_t)0xc013, (q15_t)0x42fe, (q15_t)0xc012, + (q15_t)0x42f2, (q15_t)0xc011, (q15_t)0x42e5, (q15_t)0xc011, (q15_t)0x42d9, (q15_t)0xc010, (q15_t)0x42cc, (q15_t)0xc010, + (q15_t)0x42c0, (q15_t)0xc00f, (q15_t)0x42b3, (q15_t)0xc00f, (q15_t)0x42a6, (q15_t)0xc00e, (q15_t)0x429a, (q15_t)0xc00e, + (q15_t)0x428d, (q15_t)0xc00d, (q15_t)0x4281, (q15_t)0xc00d, (q15_t)0x4274, (q15_t)0xc00c, (q15_t)0x4268, (q15_t)0xc00c, + (q15_t)0x425b, (q15_t)0xc00b, (q15_t)0x424e, (q15_t)0xc00b, (q15_t)0x4242, (q15_t)0xc00a, (q15_t)0x4235, (q15_t)0xc00a, + (q15_t)0x4229, (q15_t)0xc009, (q15_t)0x421c, (q15_t)0xc009, (q15_t)0x4210, (q15_t)0xc009, (q15_t)0x4203, (q15_t)0xc008, + (q15_t)0x41f7, (q15_t)0xc008, (q15_t)0x41ea, (q15_t)0xc007, (q15_t)0x41dd, (q15_t)0xc007, (q15_t)0x41d1, (q15_t)0xc007, + (q15_t)0x41c4, (q15_t)0xc006, (q15_t)0x41b8, (q15_t)0xc006, (q15_t)0x41ab, (q15_t)0xc006, (q15_t)0x419f, (q15_t)0xc005, + (q15_t)0x4192, (q15_t)0xc005, (q15_t)0x4186, (q15_t)0xc005, (q15_t)0x4179, (q15_t)0xc004, (q15_t)0x416c, (q15_t)0xc004, + (q15_t)0x4160, (q15_t)0xc004, (q15_t)0x4153, (q15_t)0xc004, (q15_t)0x4147, (q15_t)0xc003, (q15_t)0x413a, (q15_t)0xc003, + (q15_t)0x412e, (q15_t)0xc003, (q15_t)0x4121, (q15_t)0xc003, (q15_t)0x4114, (q15_t)0xc002, (q15_t)0x4108, (q15_t)0xc002, + (q15_t)0x40fb, (q15_t)0xc002, (q15_t)0x40ef, (q15_t)0xc002, (q15_t)0x40e2, (q15_t)0xc002, (q15_t)0x40d6, (q15_t)0xc001, + (q15_t)0x40c9, (q15_t)0xc001, (q15_t)0x40bc, (q15_t)0xc001, (q15_t)0x40b0, (q15_t)0xc001, (q15_t)0x40a3, (q15_t)0xc001, + (q15_t)0x4097, (q15_t)0xc001, (q15_t)0x408a, (q15_t)0xc001, (q15_t)0x407e, (q15_t)0xc000, (q15_t)0x4071, (q15_t)0xc000, + (q15_t)0x4065, (q15_t)0xc000, (q15_t)0x4058, (q15_t)0xc000, (q15_t)0x404b, (q15_t)0xc000, (q15_t)0x403f, (q15_t)0xc000, + (q15_t)0x4032, (q15_t)0xc000, (q15_t)0x4026, (q15_t)0xc000, (q15_t)0x4019, (q15_t)0xc000, (q15_t)0x400d, (q15_t)0xc000, +}; + +#endif +/** + @} end of RealFFT_Table group + */ + +/** + @ingroup DCT4_IDCT4 + */ + +/** + @addtogroup DCT4_IDCT4_Table DCT Type IV Tables + @{ + */ + +/** + @brief Weights Table + */ + +/** + @par + Weights tables are generated using the formula :
weights[n] = e^(-j*n*pi/(2*N))
+ @par + C command to generate the table +
+  for(i = 0; i< N; i++)
+  {
+    weights[(2*i)]   =  cos (i*c);
+    weights[(2*i)+1] = -sin (i*c);
+  } 
+ @par + where N is the Number of weights to be calculated and c is pi/(2*N) + @par + In the tables below the real and imaginary values are placed alternatively, hence the + array length is 2*N. + */ + + +/** + @par + cosFactor tables are generated using the formula :
cos_factors[n] = 2 * cos((2n+1)*pi/(4*N))
+ @par + C command to generate the table + @par +
 for(i = 0; i< N; i++)
+  {
+     cos_factors[i]= 2 * cos((2*i+1)*c/2);
+  } 
+ @par + where N is the number of factors to generate and c is pi/(2*N) +*/ + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_128) + const float32_t Weights_128[256] = { + 1.000000000000000000f, 0.000000000000000000f, 0.999924701839144500f, -0.012271538285719925f, + 0.999698818696204250f, -0.024541228522912288f, 0.999322384588349540f, -0.036807222941358832f, + 0.998795456205172410f, -0.049067674327418015f, 0.998118112900149180f, -0.061320736302208578f, + 0.997290456678690210f, -0.073564563599667426f, 0.996312612182778000f, -0.085797312344439894f, + 0.995184726672196930f, -0.098017140329560604f, 0.993906970002356060f, -0.110222207293883060f, + 0.992479534598709970f, -0.122410675199216200f, 0.990902635427780010f, -0.134580708507126170f, + 0.989176509964781010f, -0.146730474455361750f, 0.987301418157858430f, -0.158858143333861450f, + 0.985277642388941220f, -0.170961888760301220f, 0.983105487431216290f, -0.183039887955140950f, + 0.980785280403230430f, -0.195090322016128250f, 0.978317370719627650f, -0.207111376192218560f, + 0.975702130038528570f, -0.219101240156869800f, 0.972939952205560180f, -0.231058108280671110f, + 0.970031253194543970f, -0.242980179903263870f, 0.966976471044852070f, -0.254865659604514570f, + 0.963776065795439840f, -0.266712757474898370f, 0.960430519415565790f, -0.278519689385053060f, + 0.956940335732208820f, -0.290284677254462330f, 0.953306040354193860f, -0.302005949319228080f, + 0.949528180593036670f, -0.313681740398891520f, 0.945607325380521280f, -0.325310292162262930f, + 0.941544065183020810f, -0.336889853392220050f, 0.937339011912574960f, -0.348418680249434560f, + 0.932992798834738960f, -0.359895036534988110f, 0.928506080473215590f, -0.371317193951837540f, + 0.923879532511286740f, -0.382683432365089780f, 0.919113851690057770f, -0.393992040061048100f, + 0.914209755703530690f, -0.405241314004989860f, 0.909167983090522380f, -0.416429560097637150f, + 0.903989293123443340f, -0.427555093430282080f, 0.898674465693953820f, -0.438616238538527660f, + 0.893224301195515320f, -0.449611329654606540f, 0.887639620402853930f, -0.460538710958240010f, + 0.881921264348355050f, -0.471396736825997640f, 0.876070094195406600f, -0.482183772079122720f, + 0.870086991108711460f, -0.492898192229784040f, 0.863972856121586810f, -0.503538383725717580f, + 0.857728610000272120f, -0.514102744193221660f, 0.851355193105265200f, -0.524589682678468950f, + 0.844853565249707120f, -0.534997619887097150f, 0.838224705554838080f, -0.545324988422046460f, + 0.831469612302545240f, -0.555570233019602180f, 0.824589302785025290f, -0.565731810783613120f, + 0.817584813151583710f, -0.575808191417845340f, 0.810457198252594770f, -0.585797857456438860f, + 0.803207531480644940f, -0.595699304492433360f, 0.795836904608883570f, -0.605511041404325550f, + 0.788346427626606340f, -0.615231590580626820f, 0.780737228572094490f, -0.624859488142386340f, + 0.773010453362736990f, -0.634393284163645490f, 0.765167265622458960f, -0.643831542889791390f, + 0.757208846506484570f, -0.653172842953776760f, 0.749136394523459370f, -0.662415777590171780f, + 0.740951125354959110f, -0.671558954847018330f, 0.732654271672412820f, -0.680600997795453020f, + 0.724247082951467000f, -0.689540544737066830f, 0.715730825283818590f, -0.698376249408972920f, + 0.707106781186547570f, -0.707106781186547460f, 0.698376249408972920f, -0.715730825283818590f, + 0.689540544737066940f, -0.724247082951466890f, 0.680600997795453130f, -0.732654271672412820f, + 0.671558954847018330f, -0.740951125354959110f, 0.662415777590171780f, -0.749136394523459260f, + 0.653172842953776760f, -0.757208846506484460f, 0.643831542889791500f, -0.765167265622458960f, + 0.634393284163645490f, -0.773010453362736990f, 0.624859488142386450f, -0.780737228572094380f, + 0.615231590580626820f, -0.788346427626606230f, 0.605511041404325550f, -0.795836904608883460f, + 0.595699304492433470f, -0.803207531480644830f, 0.585797857456438860f, -0.810457198252594770f, + 0.575808191417845340f, -0.817584813151583710f, 0.565731810783613230f, -0.824589302785025290f, + 0.555570233019602290f, -0.831469612302545240f, 0.545324988422046460f, -0.838224705554837970f, + 0.534997619887097260f, -0.844853565249707010f, 0.524589682678468840f, -0.851355193105265200f, + 0.514102744193221660f, -0.857728610000272120f, 0.503538383725717580f, -0.863972856121586700f, + 0.492898192229784090f, -0.870086991108711350f, 0.482183772079122830f, -0.876070094195406600f, + 0.471396736825997810f, -0.881921264348354940f, 0.460538710958240010f, -0.887639620402853930f, + 0.449611329654606600f, -0.893224301195515320f, 0.438616238538527710f, -0.898674465693953820f, + 0.427555093430282200f, -0.903989293123443340f, 0.416429560097637320f, -0.909167983090522270f, + 0.405241314004989860f, -0.914209755703530690f, 0.393992040061048100f, -0.919113851690057770f, + 0.382683432365089840f, -0.923879532511286740f, 0.371317193951837600f, -0.928506080473215480f, + 0.359895036534988280f, -0.932992798834738850f, 0.348418680249434510f, -0.937339011912574960f, + 0.336889853392220050f, -0.941544065183020810f, 0.325310292162262980f, -0.945607325380521280f, + 0.313681740398891570f, -0.949528180593036670f, 0.302005949319228200f, -0.953306040354193750f, + 0.290284677254462330f, -0.956940335732208940f, 0.278519689385053060f, -0.960430519415565790f, + 0.266712757474898420f, -0.963776065795439840f, 0.254865659604514630f, -0.966976471044852070f, + 0.242980179903263980f, -0.970031253194543970f, 0.231058108280671280f, -0.972939952205560070f, + 0.219101240156869770f, -0.975702130038528570f, 0.207111376192218560f, -0.978317370719627650f, + 0.195090322016128330f, -0.980785280403230430f, 0.183039887955141060f, -0.983105487431216290f, + 0.170961888760301360f, -0.985277642388941220f, 0.158858143333861390f, -0.987301418157858430f, + 0.146730474455361750f, -0.989176509964781010f, 0.134580708507126220f, -0.990902635427780010f, + 0.122410675199216280f, -0.992479534598709970f, 0.110222207293883180f, -0.993906970002356060f, + 0.098017140329560770f, -0.995184726672196820f, 0.085797312344439880f, -0.996312612182778000f, + 0.073564563599667454f, -0.997290456678690210f, 0.061320736302208648f, -0.998118112900149180f, + 0.049067674327418126f, -0.998795456205172410f, 0.036807222941358991f, -0.999322384588349540f, + 0.024541228522912264f, -0.999698818696204250f, 0.012271538285719944f, -0.999924701839144500f +}; + + const float32_t cos_factors_128[128] = { + 0.999981175282601110f, 0.999830581795823400f, 0.999529417501093140f, + 0.999077727752645360f, + 0.998475580573294770f, 0.997723066644191640f, 0.996820299291165670f, + 0.995767414467659820f, + 0.994564570734255420f, 0.993211949234794500f, 0.991709753669099530f, + 0.990058210262297120f, + 0.988257567730749460f, 0.986308097244598670f, 0.984210092386929030f, + 0.981963869109555240f, + 0.979569765685440520f, 0.977028142657754390f, 0.974339382785575860f, + 0.971503890986251780f, + 0.968522094274417380f, 0.965394441697689400f, 0.962121404269041580f, + 0.958703474895871600f, + 0.955141168305770780f, 0.951435020969008340f, 0.947585591017741090f, + 0.943593458161960390f, + 0.939459223602189920f, 0.935183509938947610f, 0.930766961078983710f, + 0.926210242138311380f, + 0.921514039342042010f, 0.916679059921042700f, 0.911706032005429880f, + 0.906595704514915330f, + 0.901348847046022030f, 0.895966249756185220f, 0.890448723244757880f, + 0.884797098430937790f, + 0.879012226428633530f, 0.873094978418290090f, 0.867046245515692650f, + 0.860866938637767310f, + 0.854557988365400530f, 0.848120344803297230f, 0.841554977436898440f, + 0.834862874986380010f, + 0.828045045257755800f, 0.821102514991104650f, 0.814036329705948410f, + 0.806847553543799330f, + 0.799537269107905010f, 0.792106577300212390f, 0.784556597155575240f, + 0.776888465673232440f, + 0.769103337645579700f, 0.761202385484261780f, 0.753186799043612520f, + 0.745057785441466060f, + 0.736816568877369900f, 0.728464390448225200f, 0.720002507961381650f, + 0.711432195745216430f, + 0.702754744457225300f, 0.693971460889654000f, 0.685083667772700360f, + 0.676092703575316030f, + 0.666999922303637470f, 0.657806693297078640f, 0.648514401022112550f, + 0.639124444863775730f, + 0.629638238914927100f, 0.620057211763289210f, 0.610382806276309480f, + 0.600616479383868970f, + 0.590759701858874280f, 0.580813958095764530f, 0.570780745886967370f, + 0.560661576197336030f, + 0.550457972936604810f, 0.540171472729892970f, 0.529803624686294830f, + 0.519355990165589530f, + 0.508830142543106990f, 0.498227666972781870f, 0.487550160148436050f, + 0.476799230063322250f, + 0.465976495767966130f, 0.455083587126343840f, 0.444122144570429260f, + 0.433093818853152010f, + 0.422000270799799790f, 0.410843171057903910f, 0.399624199845646790f, + 0.388345046698826300f, + 0.377007410216418310f, 0.365612997804773960f, 0.354163525420490510f, + 0.342660717311994380f, + 0.331106305759876430f, 0.319502030816015750f, 0.307849640041534980f, + 0.296150888243623960f, + 0.284407537211271820f, 0.272621355449948980f, 0.260794117915275570f, + 0.248927605745720260f, + 0.237023605994367340f, 0.225083911359792780f, 0.213110319916091360f, + 0.201104634842091960f, + 0.189068664149806280f, 0.177004220412148860f, 0.164913120489970090f, + 0.152797185258443410f, + 0.140658239332849240f, 0.128498110793793220f, 0.116318630911904880f, + 0.104121633872054730f, + 0.091908956497132696f, 0.079682437971430126f, 0.067443919563664106f, + 0.055195244349690031f, + 0.042938256934940959f, 0.030674803176636581f, 0.018406729905804820f, + 0.006135884649154515f +}; + + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_512) + const float32_t Weights_512[1024] = { + 1.000000000000000000f, 0.000000000000000000f, 0.999995293809576190f, -0.003067956762965976f, + 0.999981175282601110f, -0.006135884649154475f, 0.999957644551963900f, -0.009203754782059819f, + 0.999924701839144500f, -0.012271538285719925f, 0.999882347454212560f, -0.015339206284988100f, + 0.999830581795823400f, -0.018406729905804820f, 0.999769405351215280f, -0.021474080275469508f, + 0.999698818696204250f, -0.024541228522912288f, 0.999618822495178640f, -0.027608145778965740f, + 0.999529417501093140f, -0.030674803176636626f, 0.999430604555461730f, -0.033741171851377580f, + 0.999322384588349540f, -0.036807222941358832f, 0.999204758618363890f, -0.039872927587739811f, + 0.999077727752645360f, -0.042938256934940820f, 0.998941293186856870f, -0.046003182130914623f, + 0.998795456205172410f, -0.049067674327418015f, 0.998640218180265270f, -0.052131704680283324f, + 0.998475580573294770f, -0.055195244349689934f, 0.998301544933892890f, -0.058258264500435752f, + 0.998118112900149180f, -0.061320736302208578f, 0.997925286198596000f, -0.064382630929857465f, + 0.997723066644191640f, -0.067443919563664051f, 0.997511456140303450f, -0.070504573389613856f, + 0.997290456678690210f, -0.073564563599667426f, 0.997060070339482960f, -0.076623861392031492f, + 0.996820299291165670f, -0.079682437971430126f, 0.996571145790554840f, -0.082740264549375692f, + 0.996312612182778000f, -0.085797312344439894f, 0.996044700901251970f, -0.088853552582524600f, + 0.995767414467659820f, -0.091908956497132724f, 0.995480755491926940f, -0.094963495329638992f, + 0.995184726672196930f, -0.098017140329560604f, 0.994879330794805620f, -0.101069862754827820f, + 0.994564570734255420f, -0.104121633872054590f, 0.994240449453187900f, -0.107172424956808840f, + 0.993906970002356060f, -0.110222207293883060f, 0.993564135520595300f, -0.113270952177564350f, + 0.993211949234794500f, -0.116318630911904750f, 0.992850414459865100f, -0.119365214810991350f, + 0.992479534598709970f, -0.122410675199216200f, 0.992099313142191800f, -0.125454983411546230f, + 0.991709753669099530f, -0.128498110793793170f, 0.991310859846115440f, -0.131540028702883120f, + 0.990902635427780010f, -0.134580708507126170f, 0.990485084256457090f, -0.137620121586486040f, + 0.990058210262297120f, -0.140658239332849210f, 0.989622017463200890f, -0.143695033150294470f, + 0.989176509964781010f, -0.146730474455361750f, 0.988721691960323780f, -0.149764534677321510f, + 0.988257567730749460f, -0.152797185258443440f, 0.987784141644572180f, -0.155828397654265230f, + 0.987301418157858430f, -0.158858143333861450f, 0.986809401814185530f, -0.161886393780111830f, + 0.986308097244598670f, -0.164913120489969890f, 0.985797509167567480f, -0.167938294974731170f, + 0.985277642388941220f, -0.170961888760301220f, 0.984748501801904210f, -0.173983873387463820f, + 0.984210092386929030f, -0.177004220412148750f, 0.983662419211730250f, -0.180022901405699510f, + 0.983105487431216290f, -0.183039887955140950f, 0.982539302287441240f, -0.186055151663446630f, + 0.981963869109555240f, -0.189068664149806190f, 0.981379193313754560f, -0.192080397049892440f, + 0.980785280403230430f, -0.195090322016128250f, 0.980182135968117430f, -0.198098410717953560f, + 0.979569765685440520f, -0.201104634842091900f, 0.978948175319062200f, -0.204108966092816870f, + 0.978317370719627650f, -0.207111376192218560f, 0.977677357824509930f, -0.210111836880469610f, + 0.977028142657754390f, -0.213110319916091360f, 0.976369731330021140f, -0.216106797076219520f, + 0.975702130038528570f, -0.219101240156869800f, 0.975025345066994120f, -0.222093620973203510f, + 0.974339382785575860f, -0.225083911359792830f, 0.973644249650811980f, -0.228072083170885730f, + 0.972939952205560180f, -0.231058108280671110f, 0.972226497078936270f, -0.234041958583543430f, + 0.971503890986251780f, -0.237023605994367200f, 0.970772140728950350f, -0.240003022448741500f, + 0.970031253194543970f, -0.242980179903263870f, 0.969281235356548530f, -0.245955050335794590f, + 0.968522094274417380f, -0.248927605745720150f, 0.967753837093475510f, -0.251897818154216970f, + 0.966976471044852070f, -0.254865659604514570f, 0.966190003445412500f, -0.257831102162158990f, + 0.965394441697689400f, -0.260794117915275510f, 0.964589793289812760f, -0.263754678974831350f, + 0.963776065795439840f, -0.266712757474898370f, 0.962953266873683880f, -0.269668325572915090f, + 0.962121404269041580f, -0.272621355449948980f, 0.961280485811320640f, -0.275571819310958140f, + 0.960430519415565790f, -0.278519689385053060f, 0.959571513081984520f, -0.281464937925757940f, + 0.958703474895871600f, -0.284407537211271880f, 0.957826413027532910f, -0.287347459544729510f, + 0.956940335732208820f, -0.290284677254462330f, 0.956045251349996410f, -0.293219162694258630f, + 0.955141168305770780f, -0.296150888243623790f, 0.954228095109105670f, -0.299079826308040480f, + 0.953306040354193860f, -0.302005949319228080f, 0.952375012719765880f, -0.304929229735402370f, + 0.951435020969008340f, -0.307849640041534870f, 0.950486073949481700f, -0.310767152749611470f, + 0.949528180593036670f, -0.313681740398891520f, 0.948561349915730270f, -0.316593375556165850f, + 0.947585591017741090f, -0.319502030816015690f, 0.946600913083283530f, -0.322407678801069850f, + 0.945607325380521280f, -0.325310292162262930f, 0.944604837261480260f, -0.328209843579092500f, + 0.943593458161960390f, -0.331106305759876430f, 0.942573197601446870f, -0.333999651442009380f, + 0.941544065183020810f, -0.336889853392220050f, 0.940506070593268300f, -0.339776884406826850f, + 0.939459223602189920f, -0.342660717311994380f, 0.938403534063108060f, -0.345541324963989090f, + 0.937339011912574960f, -0.348418680249434560f, 0.936265667170278260f, -0.351292756085567090f, + 0.935183509938947610f, -0.354163525420490340f, 0.934092550404258980f, -0.357030961233429980f, + 0.932992798834738960f, -0.359895036534988110f, 0.931884265581668150f, -0.362755724367397230f, + 0.930766961078983710f, -0.365612997804773850f, 0.929640895843181330f, -0.368466829953372320f, + 0.928506080473215590f, -0.371317193951837540f, 0.927362525650401110f, -0.374164062971457930f, + 0.926210242138311380f, -0.377007410216418260f, 0.925049240782677580f, -0.379847208924051160f, + 0.923879532511286740f, -0.382683432365089780f, 0.922701128333878630f, -0.385516053843918850f, + 0.921514039342042010f, -0.388345046698826250f, 0.920318276709110590f, -0.391170384302253870f, + 0.919113851690057770f, -0.393992040061048100f, 0.917900775621390500f, -0.396809987416710310f, + 0.916679059921042700f, -0.399624199845646790f, 0.915448716088267830f, -0.402434650859418430f, + 0.914209755703530690f, -0.405241314004989860f, 0.912962190428398210f, -0.408044162864978690f, + 0.911706032005429880f, -0.410843171057903910f, 0.910441292258067250f, -0.413638312238434500f, + 0.909167983090522380f, -0.416429560097637150f, 0.907886116487666260f, -0.419216888363223910f, + 0.906595704514915330f, -0.422000270799799680f, 0.905296759318118820f, -0.424779681209108810f, + 0.903989293123443340f, -0.427555093430282080f, 0.902673318237258830f, -0.430326481340082610f, + 0.901348847046022030f, -0.433093818853151960f, 0.900015892016160280f, -0.435857079922255470f, + 0.898674465693953820f, -0.438616238538527660f, 0.897324580705418320f, -0.441371268731716670f, + 0.895966249756185220f, -0.444122144570429200f, 0.894599485631382700f, -0.446868840162374160f, + 0.893224301195515320f, -0.449611329654606540f, 0.891840709392342720f, -0.452349587233770890f, + 0.890448723244757880f, -0.455083587126343840f, 0.889048355854664570f, -0.457813303598877170f, + 0.887639620402853930f, -0.460538710958240010f, 0.886222530148880640f, -0.463259783551860150f, + 0.884797098430937790f, -0.465976495767966180f, 0.883363338665731580f, -0.468688822035827900f, + 0.881921264348355050f, -0.471396736825997640f, 0.880470889052160750f, -0.474100214650549970f, + 0.879012226428633530f, -0.476799230063322090f, 0.877545290207261350f, -0.479493757660153010f, + 0.876070094195406600f, -0.482183772079122720f, 0.874586652278176110f, -0.484869248000791060f, + 0.873094978418290090f, -0.487550160148436000f, 0.871595086655950980f, -0.490226483288291160f, + 0.870086991108711460f, -0.492898192229784040f, 0.868570705971340900f, -0.495565261825772540f, + 0.867046245515692650f, -0.498227666972781870f, 0.865513624090569090f, -0.500885382611240710f, + 0.863972856121586810f, -0.503538383725717580f, 0.862423956111040610f, -0.506186645345155230f, + 0.860866938637767310f, -0.508830142543106990f, 0.859301818357008470f, -0.511468850437970300f, + 0.857728610000272120f, -0.514102744193221660f, 0.856147328375194470f, -0.516731799017649870f, + 0.854557988365400530f, -0.519355990165589640f, 0.852960604930363630f, -0.521975292937154390f, + 0.851355193105265200f, -0.524589682678468950f, 0.849741768000852550f, -0.527199134781901280f, + 0.848120344803297230f, -0.529803624686294610f, 0.846490938774052130f, -0.532403127877197900f, + 0.844853565249707120f, -0.534997619887097150f, 0.843208239641845440f, -0.537587076295645390f, + 0.841554977436898440f, -0.540171472729892850f, 0.839893794195999520f, -0.542750784864515890f, + 0.838224705554838080f, -0.545324988422046460f, 0.836547727223512010f, -0.547894059173100190f, + 0.834862874986380010f, -0.550457972936604810f, 0.833170164701913190f, -0.553016705580027470f, + 0.831469612302545240f, -0.555570233019602180f, 0.829761233794523050f, -0.558118531220556100f, + 0.828045045257755800f, -0.560661576197336030f, 0.826321062845663530f, -0.563199344013834090f, + 0.824589302785025290f, -0.565731810783613120f, 0.822849781375826430f, -0.568258952670131490f, + 0.821102514991104650f, -0.570780745886967260f, 0.819347520076796900f, -0.573297166698042200f, + 0.817584813151583710f, -0.575808191417845340f, 0.815814410806733780f, -0.578313796411655590f, + 0.814036329705948410f, -0.580813958095764530f, 0.812250586585203880f, -0.583308652937698290f, + 0.810457198252594770f, -0.585797857456438860f, 0.808656181588174980f, -0.588281548222645220f, + 0.806847553543799330f, -0.590759701858874160f, 0.805031331142963660f, -0.593232295039799800f, + 0.803207531480644940f, -0.595699304492433360f, 0.801376171723140240f, -0.598160706996342270f, + 0.799537269107905010f, -0.600616479383868970f, 0.797690840943391160f, -0.603066598540348160f, + 0.795836904608883570f, -0.605511041404325550f, 0.793975477554337170f, -0.607949784967773630f, + 0.792106577300212390f, -0.610382806276309480f, 0.790230221437310030f, -0.612810082429409710f, + 0.788346427626606340f, -0.615231590580626820f, 0.786455213599085770f, -0.617647307937803870f, + 0.784556597155575240f, -0.620057211763289100f, 0.782650596166575730f, -0.622461279374149970f, + 0.780737228572094490f, -0.624859488142386340f, 0.778816512381475980f, -0.627251815495144080f, + 0.776888465673232440f, -0.629638238914926980f, 0.774953106594873930f, -0.632018735939809060f, + 0.773010453362736990f, -0.634393284163645490f, 0.771060524261813820f, -0.636761861236284200f, + 0.769103337645579700f, -0.639124444863775730f, 0.767138911935820400f, -0.641481012808583160f, + 0.765167265622458960f, -0.643831542889791390f, 0.763188417263381270f, -0.646176012983316280f, + 0.761202385484261780f, -0.648514401022112440f, 0.759209188978388070f, -0.650846684996380880f, + 0.757208846506484570f, -0.653172842953776760f, 0.755201376896536550f, -0.655492852999615350f, + 0.753186799043612520f, -0.657806693297078640f, 0.751165131909686480f, -0.660114342067420480f, + 0.749136394523459370f, -0.662415777590171780f, 0.747100605980180130f, -0.664710978203344790f, + 0.745057785441466060f, -0.666999922303637470f, 0.743007952135121720f, -0.669282588346636010f, + 0.740951125354959110f, -0.671558954847018330f, 0.738887324460615110f, -0.673829000378756040f, + 0.736816568877369900f, -0.676092703575315920f, 0.734738878095963500f, -0.678350043129861470f, + 0.732654271672412820f, -0.680600997795453020f, 0.730562769227827590f, -0.682845546385248080f, + 0.728464390448225200f, -0.685083667772700360f, 0.726359155084346010f, -0.687315340891759050f, + 0.724247082951467000f, -0.689540544737066830f, 0.722128193929215350f, -0.691759258364157750f, + 0.720002507961381650f, -0.693971460889654000f, 0.717870045055731710f, -0.696177131491462990f, + 0.715730825283818590f, -0.698376249408972920f, 0.713584868780793640f, -0.700568793943248340f, + 0.711432195745216430f, -0.702754744457225300f, 0.709272826438865690f, -0.704934080375904880f, + 0.707106781186547570f, -0.707106781186547460f, 0.704934080375904990f, -0.709272826438865580f, + 0.702754744457225300f, -0.711432195745216430f, 0.700568793943248450f, -0.713584868780793520f, + 0.698376249408972920f, -0.715730825283818590f, 0.696177131491462990f, -0.717870045055731710f, + 0.693971460889654000f, -0.720002507961381650f, 0.691759258364157750f, -0.722128193929215350f, + 0.689540544737066940f, -0.724247082951466890f, 0.687315340891759160f, -0.726359155084346010f, + 0.685083667772700360f, -0.728464390448225200f, 0.682845546385248080f, -0.730562769227827590f, + 0.680600997795453130f, -0.732654271672412820f, 0.678350043129861580f, -0.734738878095963390f, + 0.676092703575316030f, -0.736816568877369790f, 0.673829000378756150f, -0.738887324460615110f, + 0.671558954847018330f, -0.740951125354959110f, 0.669282588346636010f, -0.743007952135121720f, + 0.666999922303637470f, -0.745057785441465950f, 0.664710978203344900f, -0.747100605980180130f, + 0.662415777590171780f, -0.749136394523459260f, 0.660114342067420480f, -0.751165131909686370f, + 0.657806693297078640f, -0.753186799043612410f, 0.655492852999615460f, -0.755201376896536550f, + 0.653172842953776760f, -0.757208846506484460f, 0.650846684996380990f, -0.759209188978387960f, + 0.648514401022112550f, -0.761202385484261780f, 0.646176012983316390f, -0.763188417263381270f, + 0.643831542889791500f, -0.765167265622458960f, 0.641481012808583160f, -0.767138911935820400f, + 0.639124444863775730f, -0.769103337645579590f, 0.636761861236284200f, -0.771060524261813710f, + 0.634393284163645490f, -0.773010453362736990f, 0.632018735939809060f, -0.774953106594873820f, + 0.629638238914927100f, -0.776888465673232440f, 0.627251815495144190f, -0.778816512381475870f, + 0.624859488142386450f, -0.780737228572094380f, 0.622461279374150080f, -0.782650596166575730f, + 0.620057211763289210f, -0.784556597155575240f, 0.617647307937803980f, -0.786455213599085770f, + 0.615231590580626820f, -0.788346427626606230f, 0.612810082429409710f, -0.790230221437310030f, + 0.610382806276309480f, -0.792106577300212390f, 0.607949784967773740f, -0.793975477554337170f, + 0.605511041404325550f, -0.795836904608883460f, 0.603066598540348280f, -0.797690840943391040f, + 0.600616479383868970f, -0.799537269107905010f, 0.598160706996342380f, -0.801376171723140130f, + 0.595699304492433470f, -0.803207531480644830f, 0.593232295039799800f, -0.805031331142963660f, + 0.590759701858874280f, -0.806847553543799220f, 0.588281548222645330f, -0.808656181588174980f, + 0.585797857456438860f, -0.810457198252594770f, 0.583308652937698290f, -0.812250586585203880f, + 0.580813958095764530f, -0.814036329705948300f, 0.578313796411655590f, -0.815814410806733780f, + 0.575808191417845340f, -0.817584813151583710f, 0.573297166698042320f, -0.819347520076796900f, + 0.570780745886967370f, -0.821102514991104650f, 0.568258952670131490f, -0.822849781375826320f, + 0.565731810783613230f, -0.824589302785025290f, 0.563199344013834090f, -0.826321062845663420f, + 0.560661576197336030f, -0.828045045257755800f, 0.558118531220556100f, -0.829761233794523050f, + 0.555570233019602290f, -0.831469612302545240f, 0.553016705580027580f, -0.833170164701913190f, + 0.550457972936604810f, -0.834862874986380010f, 0.547894059173100190f, -0.836547727223511890f, + 0.545324988422046460f, -0.838224705554837970f, 0.542750784864516000f, -0.839893794195999410f, + 0.540171472729892970f, -0.841554977436898330f, 0.537587076295645510f, -0.843208239641845440f, + 0.534997619887097260f, -0.844853565249707010f, 0.532403127877198010f, -0.846490938774052020f, + 0.529803624686294830f, -0.848120344803297120f, 0.527199134781901390f, -0.849741768000852440f, + 0.524589682678468840f, -0.851355193105265200f, 0.521975292937154390f, -0.852960604930363630f, + 0.519355990165589530f, -0.854557988365400530f, 0.516731799017649980f, -0.856147328375194470f, + 0.514102744193221660f, -0.857728610000272120f, 0.511468850437970520f, -0.859301818357008360f, + 0.508830142543106990f, -0.860866938637767310f, 0.506186645345155450f, -0.862423956111040500f, + 0.503538383725717580f, -0.863972856121586700f, 0.500885382611240940f, -0.865513624090568980f, + 0.498227666972781870f, -0.867046245515692650f, 0.495565261825772490f, -0.868570705971340900f, + 0.492898192229784090f, -0.870086991108711350f, 0.490226483288291100f, -0.871595086655951090f, + 0.487550160148436050f, -0.873094978418290090f, 0.484869248000791120f, -0.874586652278176110f, + 0.482183772079122830f, -0.876070094195406600f, 0.479493757660153010f, -0.877545290207261240f, + 0.476799230063322250f, -0.879012226428633410f, 0.474100214650550020f, -0.880470889052160750f, + 0.471396736825997810f, -0.881921264348354940f, 0.468688822035827960f, -0.883363338665731580f, + 0.465976495767966130f, -0.884797098430937790f, 0.463259783551860260f, -0.886222530148880640f, + 0.460538710958240010f, -0.887639620402853930f, 0.457813303598877290f, -0.889048355854664570f, + 0.455083587126343840f, -0.890448723244757880f, 0.452349587233771000f, -0.891840709392342720f, + 0.449611329654606600f, -0.893224301195515320f, 0.446868840162374330f, -0.894599485631382580f, + 0.444122144570429260f, -0.895966249756185110f, 0.441371268731716620f, -0.897324580705418320f, + 0.438616238538527710f, -0.898674465693953820f, 0.435857079922255470f, -0.900015892016160280f, + 0.433093818853152010f, -0.901348847046022030f, 0.430326481340082610f, -0.902673318237258830f, + 0.427555093430282200f, -0.903989293123443340f, 0.424779681209108810f, -0.905296759318118820f, + 0.422000270799799790f, -0.906595704514915330f, 0.419216888363223960f, -0.907886116487666150f, + 0.416429560097637320f, -0.909167983090522270f, 0.413638312238434560f, -0.910441292258067140f, + 0.410843171057903910f, -0.911706032005429880f, 0.408044162864978740f, -0.912962190428398100f, + 0.405241314004989860f, -0.914209755703530690f, 0.402434650859418540f, -0.915448716088267830f, + 0.399624199845646790f, -0.916679059921042700f, 0.396809987416710420f, -0.917900775621390390f, + 0.393992040061048100f, -0.919113851690057770f, 0.391170384302253980f, -0.920318276709110480f, + 0.388345046698826300f, -0.921514039342041900f, 0.385516053843919020f, -0.922701128333878520f, + 0.382683432365089840f, -0.923879532511286740f, 0.379847208924051110f, -0.925049240782677580f, + 0.377007410216418310f, -0.926210242138311270f, 0.374164062971457990f, -0.927362525650401110f, + 0.371317193951837600f, -0.928506080473215480f, 0.368466829953372320f, -0.929640895843181330f, + 0.365612997804773960f, -0.930766961078983710f, 0.362755724367397230f, -0.931884265581668150f, + 0.359895036534988280f, -0.932992798834738850f, 0.357030961233430030f, -0.934092550404258870f, + 0.354163525420490510f, -0.935183509938947500f, 0.351292756085567150f, -0.936265667170278260f, + 0.348418680249434510f, -0.937339011912574960f, 0.345541324963989150f, -0.938403534063108060f, + 0.342660717311994380f, -0.939459223602189920f, 0.339776884406826960f, -0.940506070593268300f, + 0.336889853392220050f, -0.941544065183020810f, 0.333999651442009490f, -0.942573197601446870f, + 0.331106305759876430f, -0.943593458161960390f, 0.328209843579092660f, -0.944604837261480260f, + 0.325310292162262980f, -0.945607325380521280f, 0.322407678801070020f, -0.946600913083283530f, + 0.319502030816015750f, -0.947585591017741090f, 0.316593375556165850f, -0.948561349915730270f, + 0.313681740398891570f, -0.949528180593036670f, 0.310767152749611470f, -0.950486073949481700f, + 0.307849640041534980f, -0.951435020969008340f, 0.304929229735402430f, -0.952375012719765880f, + 0.302005949319228200f, -0.953306040354193750f, 0.299079826308040480f, -0.954228095109105670f, + 0.296150888243623960f, -0.955141168305770670f, 0.293219162694258680f, -0.956045251349996410f, + 0.290284677254462330f, -0.956940335732208940f, 0.287347459544729570f, -0.957826413027532910f, + 0.284407537211271820f, -0.958703474895871600f, 0.281464937925758050f, -0.959571513081984520f, + 0.278519689385053060f, -0.960430519415565790f, 0.275571819310958250f, -0.961280485811320640f, + 0.272621355449948980f, -0.962121404269041580f, 0.269668325572915200f, -0.962953266873683880f, + 0.266712757474898420f, -0.963776065795439840f, 0.263754678974831510f, -0.964589793289812650f, + 0.260794117915275570f, -0.965394441697689400f, 0.257831102162158930f, -0.966190003445412620f, + 0.254865659604514630f, -0.966976471044852070f, 0.251897818154216910f, -0.967753837093475510f, + 0.248927605745720260f, -0.968522094274417270f, 0.245955050335794590f, -0.969281235356548530f, + 0.242980179903263980f, -0.970031253194543970f, 0.240003022448741500f, -0.970772140728950350f, + 0.237023605994367340f, -0.971503890986251780f, 0.234041958583543460f, -0.972226497078936270f, + 0.231058108280671280f, -0.972939952205560070f, 0.228072083170885790f, -0.973644249650811870f, + 0.225083911359792780f, -0.974339382785575860f, 0.222093620973203590f, -0.975025345066994120f, + 0.219101240156869770f, -0.975702130038528570f, 0.216106797076219600f, -0.976369731330021140f, + 0.213110319916091360f, -0.977028142657754390f, 0.210111836880469720f, -0.977677357824509930f, + 0.207111376192218560f, -0.978317370719627650f, 0.204108966092817010f, -0.978948175319062200f, + 0.201104634842091960f, -0.979569765685440520f, 0.198098410717953730f, -0.980182135968117320f, + 0.195090322016128330f, -0.980785280403230430f, 0.192080397049892380f, -0.981379193313754560f, + 0.189068664149806280f, -0.981963869109555240f, 0.186055151663446630f, -0.982539302287441240f, + 0.183039887955141060f, -0.983105487431216290f, 0.180022901405699510f, -0.983662419211730250f, + 0.177004220412148860f, -0.984210092386929030f, 0.173983873387463850f, -0.984748501801904210f, + 0.170961888760301360f, -0.985277642388941220f, 0.167938294974731230f, -0.985797509167567370f, + 0.164913120489970090f, -0.986308097244598670f, 0.161886393780111910f, -0.986809401814185420f, + 0.158858143333861390f, -0.987301418157858430f, 0.155828397654265320f, -0.987784141644572180f, + 0.152797185258443410f, -0.988257567730749460f, 0.149764534677321620f, -0.988721691960323780f, + 0.146730474455361750f, -0.989176509964781010f, 0.143695033150294580f, -0.989622017463200780f, + 0.140658239332849240f, -0.990058210262297120f, 0.137620121586486180f, -0.990485084256456980f, + 0.134580708507126220f, -0.990902635427780010f, 0.131540028702883280f, -0.991310859846115440f, + 0.128498110793793220f, -0.991709753669099530f, 0.125454983411546210f, -0.992099313142191800f, + 0.122410675199216280f, -0.992479534598709970f, 0.119365214810991350f, -0.992850414459865100f, + 0.116318630911904880f, -0.993211949234794500f, 0.113270952177564360f, -0.993564135520595300f, + 0.110222207293883180f, -0.993906970002356060f, 0.107172424956808870f, -0.994240449453187900f, + 0.104121633872054730f, -0.994564570734255420f, 0.101069862754827880f, -0.994879330794805620f, + 0.098017140329560770f, -0.995184726672196820f, 0.094963495329639061f, -0.995480755491926940f, + 0.091908956497132696f, -0.995767414467659820f, 0.088853552582524684f, -0.996044700901251970f, + 0.085797312344439880f, -0.996312612182778000f, 0.082740264549375803f, -0.996571145790554840f, + 0.079682437971430126f, -0.996820299291165670f, 0.076623861392031617f, -0.997060070339482960f, + 0.073564563599667454f, -0.997290456678690210f, 0.070504573389614009f, -0.997511456140303450f, + 0.067443919563664106f, -0.997723066644191640f, 0.064382630929857410f, -0.997925286198596000f, + 0.061320736302208648f, -0.998118112900149180f, 0.058258264500435732f, -0.998301544933892890f, + 0.055195244349690031f, -0.998475580573294770f, 0.052131704680283317f, -0.998640218180265270f, + 0.049067674327418126f, -0.998795456205172410f, 0.046003182130914644f, -0.998941293186856870f, + 0.042938256934940959f, -0.999077727752645360f, 0.039872927587739845f, -0.999204758618363890f, + 0.036807222941358991f, -0.999322384588349540f, 0.033741171851377642f, -0.999430604555461730f, + 0.030674803176636581f, -0.999529417501093140f, 0.027608145778965820f, -0.999618822495178640f, + 0.024541228522912264f, -0.999698818696204250f, 0.021474080275469605f, -0.999769405351215280f, + 0.018406729905804820f, -0.999830581795823400f, 0.015339206284988220f, -0.999882347454212560f, + 0.012271538285719944f, -0.999924701839144500f, 0.009203754782059960f, -0.999957644551963900f, + 0.006135884649154515f, -0.999981175282601110f, 0.003067956762966138f, -0.999995293809576190f +}; + + const float32_t cos_factors_512[512] = { + 0.999998823451701880f, 0.999989411081928400f, 0.999970586430974140f, + 0.999942349676023910f, + 0.999904701082852900f, 0.999857641005823860f, 0.999801169887884260f, + 0.999735288260561680f, + 0.999659996743959220f, 0.999575296046749220f, 0.999481186966166950f, + 0.999377670388002850f, + 0.999264747286594420f, 0.999142418724816910f, 0.999010685854073380f, + 0.998869549914283560f, + 0.998719012233872940f, 0.998559074229759310f, 0.998389737407340160f, + 0.998211003360478190f, + 0.998022873771486240f, 0.997825350411111640f, 0.997618435138519550f, + 0.997402129901275300f, + 0.997176436735326190f, 0.996941357764982160f, 0.996696895202896060f, + 0.996443051350042630f, + 0.996179828595696980f, 0.995907229417411720f, 0.995625256380994310f, + 0.995333912140482280f, + 0.995033199438118630f, 0.994723121104325700f, 0.994403680057679100f, + 0.994074879304879370f, + 0.993736721940724600f, 0.993389211148080650f, 0.993032350197851410f, + 0.992666142448948020f, + 0.992290591348257370f, 0.991905700430609330f, 0.991511473318743900f, + 0.991107913723276890f, + 0.990695025442664630f, 0.990272812363169110f, 0.989841278458820530f, + 0.989400427791380380f, + 0.988950264510302990f, 0.988490792852696590f, 0.988022017143283530f, + 0.987543941794359230f, + 0.987056571305750970f, 0.986559910264775410f, 0.986053963346195440f, + 0.985538735312176060f, + 0.985014231012239840f, 0.984480455383220930f, 0.983937413449218920f, + 0.983385110321551180f, + 0.982823551198705240f, 0.982252741366289370f, 0.981672686196983110f, + 0.981083391150486710f, + 0.980484861773469380f, 0.979877103699517640f, 0.979260122649082020f, + 0.978633924429423210f, + 0.977998514934557140f, 0.977353900145199960f, 0.976700086128711840f, + 0.976037079039039020f, + 0.975364885116656980f, 0.974683510688510670f, 0.973992962167955830f, + 0.973293246054698250f, + 0.972584368934732210f, 0.971866337480279400f, 0.971139158449725090f, + 0.970402838687555500f, + 0.969657385124292450f, 0.968902804776428870f, 0.968139104746362440f, + 0.967366292222328510f, + 0.966584374478333120f, 0.965793358874083680f, 0.964993252854920320f, + 0.964184063951745830f, + 0.963365799780954050f, 0.962538468044359160f, 0.961702076529122540f, + 0.960856633107679660f, + 0.960002145737665960f, 0.959138622461841890f, 0.958266071408017670f, + 0.957384500788975860f, + 0.956493918902395100f, 0.955594334130771110f, 0.954685754941338340f, + 0.953768189885990330f, + 0.952841647601198720f, 0.951906136807932350f, 0.950961666311575080f, + 0.950008245001843000f, + 0.949045881852700560f, 0.948074585922276230f, 0.947094366352777220f, + 0.946105232370403450f, + 0.945107193285260610f, 0.944100258491272660f, 0.943084437466093490f, + 0.942059739771017310f, + 0.941026175050889260f, 0.939983753034014050f, 0.938932483532064600f, + 0.937872376439989890f, + 0.936803441735921560f, 0.935725689481080370f, 0.934639129819680780f, + 0.933543772978836170f, + 0.932439629268462360f, 0.931326709081180430f, 0.930205022892219070f, + 0.929074581259315860f, + 0.927935394822617890f, 0.926787474304581750f, 0.925630830509872720f, + 0.924465474325262600f, + 0.923291416719527640f, 0.922108668743345180f, 0.920917241529189520f, + 0.919717146291227360f, + 0.918508394325212250f, 0.917290997008377910f, 0.916064965799331720f, + 0.914830312237946200f, + 0.913587047945250810f, 0.912335184623322750f, 0.911074734055176360f, + 0.909805708104652220f, + 0.908528118716306120f, 0.907241977915295820f, 0.905947297807268460f, + 0.904644090578246240f, + 0.903332368494511820f, 0.902012143902493180f, 0.900683429228646970f, + 0.899346236979341570f, + 0.898000579740739880f, 0.896646470178680150f, 0.895283921038557580f, + 0.893912945145203250f, + 0.892533555402764580f, 0.891145764794583180f, 0.889749586383072780f, + 0.888345033309596350f, + 0.886932118794342190f, 0.885510856136199950f, 0.884081258712634990f, + 0.882643339979562790f, + 0.881197113471222090f, 0.879742592800047410f, 0.878279791656541580f, + 0.876808723809145650f, + 0.875329403104110890f, 0.873841843465366860f, 0.872346058894391540f, + 0.870842063470078980f, + 0.869329871348606840f, 0.867809496763303320f, 0.866280954024512990f, + 0.864744257519462380f, + 0.863199421712124160f, 0.861646461143081300f, 0.860085390429390140f, + 0.858516224264442740f, + 0.856938977417828760f, 0.855353664735196030f, 0.853760301138111410f, + 0.852158901623919830f, + 0.850549481265603480f, 0.848932055211639610f, 0.847306638685858320f, + 0.845673246987299070f, + 0.844031895490066410f, 0.842382599643185850f, 0.840725374970458070f, + 0.839060237070312740f, + 0.837387201615661940f, 0.835706284353752600f, 0.834017501106018130f, + 0.832320867767929680f, + 0.830616400308846310f, 0.828904114771864870f, 0.827184027273669130f, + 0.825456154004377550f, + 0.823720511227391430f, 0.821977115279241550f, 0.820225982569434690f, + 0.818467129580298660f, + 0.816700572866827850f, 0.814926329056526620f, 0.813144414849253590f, + 0.811354847017063730f, + 0.809557642404051260f, 0.807752817926190360f, 0.805940390571176280f, + 0.804120377398265810f, + 0.802292795538115720f, 0.800457662192622820f, 0.798614994634760820f, + 0.796764810208418830f, + 0.794907126328237010f, 0.793041960479443640f, 0.791169330217690200f, + 0.789289253168885650f, + 0.787401747029031430f, 0.785506829564053930f, 0.783604518609638200f, + 0.781694832071059390f, + 0.779777787923014550f, 0.777853404209453150f, 0.775921699043407690f, + 0.773982690606822900f, + 0.772036397150384520f, 0.770082836993347900f, 0.768122028523365420f, + 0.766153990196312920f, + 0.764178740536116670f, 0.762196298134578900f, 0.760206681651202420f, + 0.758209909813015280f, + 0.756206001414394540f, 0.754194975316889170f, 0.752176850449042810f, + 0.750151645806215070f, + 0.748119380450403600f, 0.746080073510063780f, 0.744033744179929290f, + 0.741980411720831070f, + 0.739920095459516200f, 0.737852814788465980f, 0.735778589165713590f, + 0.733697438114660370f, + 0.731609381223892630f, 0.729514438146997010f, 0.727412628602375770f, + 0.725303972373060770f, + 0.723188489306527460f, 0.721066199314508110f, 0.718937122372804490f, + 0.716801278521099540f, + 0.714658687862769090f, 0.712509370564692320f, 0.710353346857062420f, + 0.708190637033195400f, + 0.706021261449339740f, 0.703845240524484940f, 0.701662594740168570f, + 0.699473344640283770f, + 0.697277510830886630f, 0.695075113980000880f, 0.692866174817424740f, + 0.690650714134534720f, + 0.688428752784090550f, 0.686200311680038700f, 0.683965411797315510f, + 0.681724074171649820f, + 0.679476319899365080f, 0.677222170137180450f, 0.674961646102012040f, + 0.672694769070772970f, + 0.670421560380173090f, 0.668142041426518560f, 0.665856233665509720f, + 0.663564158612039880f, + 0.661265837839992270f, 0.658961292982037320f, 0.656650545729429050f, + 0.654333617831800550f, + 0.652010531096959500f, 0.649681307390683190f, 0.647345968636512060f, + 0.645004536815544040f, + 0.642657033966226860f, 0.640303482184151670f, 0.637943903621844170f, + 0.635578320488556230f, + 0.633206755050057190f, 0.630829229628424470f, 0.628445766601832710f, + 0.626056388404343520f, + 0.623661117525694640f, 0.621259976511087660f, 0.618852987960976320f, + 0.616440174530853650f, + 0.614021558931038490f, 0.611597163926462020f, 0.609167012336453210f, + 0.606731127034524480f, + 0.604289530948156070f, 0.601842247058580030f, 0.599389298400564540f, + 0.596930708062196500f, + 0.594466499184664540f, 0.591996694962040990f, 0.589521318641063940f, + 0.587040393520918080f, + 0.584553942953015330f, 0.582061990340775550f, 0.579564559139405740f, + 0.577061672855679550f, + 0.574553355047715760f, 0.572039629324757050f, 0.569520519346947250f, + 0.566996048825108680f, + 0.564466241520519500f, 0.561931121244689470f, 0.559390711859136140f, + 0.556845037275160100f, + 0.554294121453620110f, 0.551737988404707450f, 0.549176662187719770f, + 0.546610166910834860f, + 0.544038526730883930f, 0.541461765853123560f, 0.538879908531008420f, + 0.536292979065963180f, + 0.533701001807152960f, 0.531104001151255000f, 0.528502001542228480f, + 0.525895027471084740f, + 0.523283103475656430f, 0.520666254140367270f, 0.518044504095999340f, + 0.515417878019463150f, + 0.512786400633563070f, 0.510150096706766700f, 0.507508991052970870f, + 0.504863108531267480f, + 0.502212474045710900f, 0.499557112545081890f, 0.496897049022654640f, + 0.494232308515959730f, + 0.491562916106550060f, 0.488888896919763230f, 0.486210276124486530f, + 0.483527078932918740f, + 0.480839330600333900f, 0.478147056424843120f, 0.475450281747155870f, + 0.472749031950342900f, + 0.470043332459595620f, 0.467333208741988530f, 0.464618686306237820f, + 0.461899790702462840f, + 0.459176547521944150f, 0.456448982396883860f, 0.453717121000163930f, + 0.450980989045103810f, + 0.448240612285220000f, 0.445496016513981740f, 0.442747227564570130f, + 0.439994271309633260f, + 0.437237173661044200f, 0.434475960569655710f, 0.431710658025057370f, + 0.428941292055329550f, + 0.426167888726799620f, 0.423390474143796100f, 0.420609074448402510f, + 0.417823715820212380f, + 0.415034424476081630f, 0.412241226669883000f, 0.409444148692257590f, + 0.406643216870369140f, + 0.403838457567654130f, 0.401029897183575790f, 0.398217562153373620f, + 0.395401478947816300f, + 0.392581674072951530f, 0.389758174069856410f, 0.386931005514388690f, + 0.384100195016935040f, + 0.381265769222162490f, 0.378427754808765620f, 0.375586178489217330f, + 0.372741067009515810f, + 0.369892447148934270f, 0.367040345719767240f, 0.364184789567079840f, + 0.361325805568454340f, + 0.358463420633736540f, 0.355597661704783960f, 0.352728555755210730f, + 0.349856129790135030f, + 0.346980410845923680f, 0.344101425989938980f, 0.341219202320282410f, + 0.338333766965541290f, + 0.335445147084531660f, 0.332553369866044220f, 0.329658462528587550f, + 0.326760452320131790f, + 0.323859366517852960f, 0.320955232427875210f, 0.318048077385015060f, + 0.315137928752522440f, + 0.312224813921825050f, 0.309308760312268780f, 0.306389795370861080f, + 0.303467946572011370f, + 0.300543241417273400f, 0.297615707435086310f, 0.294685372180514330f, + 0.291752263234989370f, + 0.288816408206049480f, 0.285877834727080730f, 0.282936570457055390f, + 0.279992643080273380f, + 0.277046080306099950f, 0.274096909868706330f, 0.271145159526808070f, + 0.268190857063403180f, + 0.265234030285511900f, 0.262274707023913590f, 0.259312915132886350f, + 0.256348682489942910f, + 0.253382036995570270f, 0.250413006572965280f, 0.247441619167773440f, + 0.244467902747824210f, + 0.241491885302869300f, 0.238513594844318500f, 0.235533059404975460f, + 0.232550307038775330f, + 0.229565365820518870f, 0.226578263845610110f, 0.223589029229790020f, + 0.220597690108873650f, + 0.217604274638483670f, 0.214608810993786920f, 0.211611327369227610f, + 0.208611851978263460f, + 0.205610413053099320f, 0.202607038844421110f, 0.199601757621131050f, + 0.196594597670080220f, + 0.193585587295803750f, 0.190574754820252800f, 0.187562128582529740f, + 0.184547736938619640f, + 0.181531608261125130f, 0.178513770938997590f, 0.175494253377271400f, + 0.172473083996796030f, + 0.169450291233967930f, 0.166425903540464220f, 0.163399949382973230f, + 0.160372457242928400f, + 0.157343455616238280f, 0.154312973013020240f, 0.151281037957330250f, + 0.148247678986896200f, + 0.145212924652847520f, 0.142176803519448000f, 0.139139344163826280f, + 0.136100575175706200f, + 0.133060525157139180f, 0.130019222722233350f, 0.126976696496885980f, + 0.123932975118512200f, + 0.120888087235777220f, 0.117842061508325020f, 0.114794926606510250f, + 0.111746711211126660f, + 0.108697444013138670f, 0.105647153713410700f, 0.102595869022436280f, + 0.099543618660069444f, + 0.096490431355252607f, 0.093436335845747912f, 0.090381360877865011f, + 0.087325535206192226f, + 0.084268887593324127f, 0.081211446809592386f, 0.078153241632794315f, + 0.075094300847921291f, + 0.072034653246889416f, 0.068974327628266732f, 0.065913352797003930f, + 0.062851757564161420f, + 0.059789570746640007f, 0.056726821166907783f, 0.053663537652730679f, + 0.050599749036899337f, + 0.047535484156959261f, 0.044470771854938744f, 0.041405640977076712f, + 0.038340120373552791f, + 0.035274238898213947f, 0.032208025408304704f, 0.029141508764193740f, + 0.026074717829104040f, + 0.023007681468839410f, 0.019940428551514598f, 0.016872987947281773f, + 0.013805388528060349f, + 0.010737659167264572f, 0.007669828739531077f, 0.004601926120448672f, + 0.001533980186284766f +}; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_2048) + const float32_t Weights_2048[4096] = { + 1.000000000000000000f, 0.000000000000000000f, 0.999999705862882230f, -0.000766990318742704f, + 0.999998823451701880f, -0.001533980186284766f, 0.999997352766978210f, -0.002300969151425805f, + 0.999995293809576190f, -0.003067956762965976f, 0.999992646580707190f, -0.003834942569706228f, + 0.999989411081928400f, -0.004601926120448571f, 0.999985587315143200f, -0.005368906963996343f, + 0.999981175282601110f, -0.006135884649154475f, 0.999976174986897610f, -0.006902858724729756f, + 0.999970586430974140f, -0.007669828739531097f, 0.999964409618118280f, -0.008436794242369799f, + 0.999957644551963900f, -0.009203754782059819f, 0.999950291236490480f, -0.009970709907418031f, + 0.999942349676023910f, -0.010737659167264491f, 0.999933819875236000f, -0.011504602110422714f, + 0.999924701839144500f, -0.012271538285719925f, 0.999914995573113470f, -0.013038467241987334f, + 0.999904701082852900f, -0.013805388528060391f, 0.999893818374418490f, -0.014572301692779064f, + 0.999882347454212560f, -0.015339206284988100f, 0.999870288328982950f, -0.016106101853537287f, + 0.999857641005823860f, -0.016872987947281710f, 0.999844405492175240f, -0.017639864115082053f, + 0.999830581795823400f, -0.018406729905804820f, 0.999816169924900410f, -0.019173584868322623f, + 0.999801169887884260f, -0.019940428551514441f, 0.999785581693599210f, -0.020707260504265895f, + 0.999769405351215280f, -0.021474080275469508f, 0.999752640870248840f, -0.022240887414024961f, + 0.999735288260561680f, -0.023007681468839369f, 0.999717347532362190f, -0.023774461988827555f, + 0.999698818696204250f, -0.024541228522912288f, 0.999679701762987930f, -0.025307980620024571f, + 0.999659996743959220f, -0.026074717829103901f, 0.999639703650710200f, -0.026841439699098531f, + 0.999618822495178640f, -0.027608145778965740f, 0.999597353289648380f, -0.028374835617672099f, + 0.999575296046749220f, -0.029141508764193722f, 0.999552650779456990f, -0.029908164767516555f, + 0.999529417501093140f, -0.030674803176636626f, 0.999505596225325310f, -0.031441423540560301f, + 0.999481186966166950f, -0.032208025408304586f, 0.999456189737977340f, -0.032974608328897335f, + 0.999430604555461730f, -0.033741171851377580f, 0.999404431433671300f, -0.034507715524795750f, + 0.999377670388002850f, -0.035274238898213947f, 0.999350321434199440f, -0.036040741520706229f, + 0.999322384588349540f, -0.036807222941358832f, 0.999293859866887790f, -0.037573682709270494f, + 0.999264747286594420f, -0.038340120373552694f, 0.999235046864595850f, -0.039106535483329888f, + 0.999204758618363890f, -0.039872927587739811f, 0.999173882565716380f, -0.040639296235933736f, + 0.999142418724816910f, -0.041405640977076739f, 0.999110367114174890f, -0.042171961360347947f, + 0.999077727752645360f, -0.042938256934940820f, 0.999044500659429290f, -0.043704527250063421f, + 0.999010685854073380f, -0.044470771854938668f, 0.998976283356469820f, -0.045236990298804590f, + 0.998941293186856870f, -0.046003182130914623f, 0.998905715365818290f, -0.046769346900537863f, + 0.998869549914283560f, -0.047535484156959303f, 0.998832796853527990f, -0.048301593449480144f, + 0.998795456205172410f, -0.049067674327418015f, 0.998757527991183340f, -0.049833726340107277f, + 0.998719012233872940f, -0.050599749036899282f, 0.998679908955899090f, -0.051365741967162593f, + 0.998640218180265270f, -0.052131704680283324f, 0.998599939930320370f, -0.052897636725665324f, + 0.998559074229759310f, -0.053663537652730520f, 0.998517621102622210f, -0.054429407010919133f, + 0.998475580573294770f, -0.055195244349689934f, 0.998432952666508440f, -0.055961049218520569f, + 0.998389737407340160f, -0.056726821166907748f, 0.998345934821212370f, -0.057492559744367566f, + 0.998301544933892890f, -0.058258264500435752f, 0.998256567771495180f, -0.059023934984667931f, + 0.998211003360478190f, -0.059789570746639868f, 0.998164851727646240f, -0.060555171335947788f, + 0.998118112900149180f, -0.061320736302208578f, 0.998070786905482340f, -0.062086265195060088f, + 0.998022873771486240f, -0.062851757564161406f, 0.997974373526346990f, -0.063617212959193106f, + 0.997925286198596000f, -0.064382630929857465f, 0.997875611817110150f, -0.065148011025878833f, + 0.997825350411111640f, -0.065913352797003805f, 0.997774502010167820f, -0.066678655793001557f, + 0.997723066644191640f, -0.067443919563664051f, 0.997671044343441000f, -0.068209143658806329f, + 0.997618435138519550f, -0.068974327628266746f, 0.997565239060375750f, -0.069739471021907307f, + 0.997511456140303450f, -0.070504573389613856f, 0.997457086409941910f, -0.071269634281296401f, + 0.997402129901275300f, -0.072034653246889332f, 0.997346586646633230f, -0.072799629836351673f, + 0.997290456678690210f, -0.073564563599667426f, 0.997233740030466280f, -0.074329454086845756f, + 0.997176436735326190f, -0.075094300847921305f, 0.997118546826979980f, -0.075859103432954447f, + 0.997060070339482960f, -0.076623861392031492f, 0.997001007307235290f, -0.077388574275265049f, + 0.996941357764982160f, -0.078153241632794232f, 0.996881121747813850f, -0.078917863014784942f, + 0.996820299291165670f, -0.079682437971430126f, 0.996758890430818000f, -0.080446966052950014f, + 0.996696895202896060f, -0.081211446809592441f, 0.996634313643869900f, -0.081975879791633066f, + 0.996571145790554840f, -0.082740264549375692f, 0.996507391680110820f, -0.083504600633152432f, + 0.996443051350042630f, -0.084268887593324071f, 0.996378124838200210f, -0.085033124980280275f, + 0.996312612182778000f, -0.085797312344439894f, 0.996246513422315520f, -0.086561449236251170f, + 0.996179828595696980f, -0.087325535206192059f, 0.996112557742151130f, -0.088089569804770507f, + 0.996044700901251970f, -0.088853552582524600f, 0.995976258112917790f, -0.089617483090022959f, + 0.995907229417411720f, -0.090381360877864983f, 0.995837614855341610f, -0.091145185496681005f, + 0.995767414467659820f, -0.091908956497132724f, 0.995696628295663520f, -0.092672673429913310f, + 0.995625256380994310f, -0.093436335845747787f, 0.995553298765638470f, -0.094199943295393204f, + 0.995480755491926940f, -0.094963495329638992f, 0.995407626602534900f, -0.095726991499307162f, + 0.995333912140482280f, -0.096490431355252593f, 0.995259612149133390f, -0.097253814448363271f, + 0.995184726672196930f, -0.098017140329560604f, 0.995109255753726110f, -0.098780408549799623f, + 0.995033199438118630f, -0.099543618660069319f, 0.994956557770116380f, -0.100306770211392860f, + 0.994879330794805620f, -0.101069862754827820f, 0.994801518557617110f, -0.101832895841466530f, + 0.994723121104325700f, -0.102595869022436280f, 0.994644138481050710f, -0.103358781848899610f, + 0.994564570734255420f, -0.104121633872054590f, 0.994484417910747600f, -0.104884424643134970f, + 0.994403680057679100f, -0.105647153713410620f, 0.994322357222545810f, -0.106409820634187680f, + 0.994240449453187900f, -0.107172424956808840f, 0.994157956797789730f, -0.107934966232653650f, + 0.994074879304879370f, -0.108697444013138720f, 0.993991217023329380f, -0.109459857849717980f, + 0.993906970002356060f, -0.110222207293883060f, 0.993822138291519660f, -0.110984491897163390f, + 0.993736721940724600f, -0.111746711211126590f, 0.993650721000219120f, -0.112508864787378690f, + 0.993564135520595300f, -0.113270952177564350f, 0.993476965552789190f, -0.114032972933367200f, + 0.993389211148080650f, -0.114794926606510080f, 0.993300872358093280f, -0.115556812748755260f, + 0.993211949234794500f, -0.116318630911904750f, 0.993122441830495580f, -0.117080380647800590f, + 0.993032350197851410f, -0.117842061508324980f, 0.992941674389860470f, -0.118603673045400720f, + 0.992850414459865100f, -0.119365214810991350f, 0.992758570461551140f, -0.120126686357101500f, + 0.992666142448948020f, -0.120888087235777080f, 0.992573130476428810f, -0.121649416999105530f, + 0.992479534598709970f, -0.122410675199216200f, 0.992385354870851670f, -0.123171861388280480f, + 0.992290591348257370f, -0.123932975118512160f, 0.992195244086673920f, -0.124694015942167640f, + 0.992099313142191800f, -0.125454983411546230f, 0.992002798571244520f, -0.126215877078990350f, + 0.991905700430609330f, -0.126976696496885870f, 0.991808018777406430f, -0.127737441217662310f, + 0.991709753669099530f, -0.128498110793793170f, 0.991610905163495370f, -0.129258704777796140f, + 0.991511473318743900f, -0.130019222722233350f, 0.991411458193338540f, -0.130779664179711710f, + 0.991310859846115440f, -0.131540028702883120f, 0.991209678336254060f, -0.132300315844444650f, + 0.991107913723276890f, -0.133060525157139060f, 0.991005566067049370f, -0.133820656193754720f, + 0.990902635427780010f, -0.134580708507126170f, 0.990799121866020370f, -0.135340681650134210f, + 0.990695025442664630f, -0.136100575175706200f, 0.990590346218950150f, -0.136860388636816380f, + 0.990485084256457090f, -0.137620121586486040f, 0.990379239617108160f, -0.138379773577783890f, + 0.990272812363169110f, -0.139139344163826200f, 0.990165802557248400f, -0.139898832897777210f, + 0.990058210262297120f, -0.140658239332849210f, 0.989950035541608990f, -0.141417563022303020f, + 0.989841278458820530f, -0.142176803519448030f, 0.989731939077910570f, -0.142935960377642670f, + 0.989622017463200890f, -0.143695033150294470f, 0.989511513679355190f, -0.144454021390860470f, + 0.989400427791380380f, -0.145212924652847460f, 0.989288759864625170f, -0.145971742489812210f, + 0.989176509964781010f, -0.146730474455361750f, 0.989063678157881540f, -0.147489120103153570f, + 0.988950264510302990f, -0.148247678986896030f, 0.988836269088763540f, -0.149006150660348450f, + 0.988721691960323780f, -0.149764534677321510f, 0.988606533192386450f, -0.150522830591677400f, + 0.988490792852696590f, -0.151281037957330220f, 0.988374471009341280f, -0.152039156328246050f, + 0.988257567730749460f, -0.152797185258443440f, 0.988140083085692570f, -0.153555124301993450f, + 0.988022017143283530f, -0.154312973013020100f, 0.987903369972977790f, -0.155070730945700510f, + 0.987784141644572180f, -0.155828397654265230f, 0.987664332228205710f, -0.156585972692998430f, + 0.987543941794359230f, -0.157343455616238250f, 0.987422970413855410f, -0.158100845978376980f, + 0.987301418157858430f, -0.158858143333861450f, 0.987179285097874340f, -0.159615347237193060f, + 0.987056571305750970f, -0.160372457242928280f, 0.986933276853677710f, -0.161129472905678810f, + 0.986809401814185530f, -0.161886393780111830f, 0.986684946260146690f, -0.162643219420950310f, + 0.986559910264775410f, -0.163399949382973230f, 0.986434293901627180f, -0.164156583221015810f, + 0.986308097244598670f, -0.164913120489969890f, 0.986181320367928270f, -0.165669560744784120f, + 0.986053963346195440f, -0.166425903540464100f, 0.985926026254321130f, -0.167182148432072940f, + 0.985797509167567480f, -0.167938294974731170f, 0.985668412161537550f, -0.168694342723617330f, + 0.985538735312176060f, -0.169450291233967960f, 0.985408478695768420f, -0.170206140061078070f, + 0.985277642388941220f, -0.170961888760301220f, 0.985146226468662230f, -0.171717536887049970f, + 0.985014231012239840f, -0.172473083996795950f, 0.984881656097323700f, -0.173228529645070320f, + 0.984748501801904210f, -0.173983873387463820f, 0.984614768204312600f, -0.174739114779627200f, + 0.984480455383220930f, -0.175494253377271430f, 0.984345563417641900f, -0.176249288736167880f, + 0.984210092386929030f, -0.177004220412148750f, 0.984074042370776450f, -0.177759047961107170f, + 0.983937413449218920f, -0.178513770938997510f, 0.983800205702631600f, -0.179268388901835750f, + 0.983662419211730250f, -0.180022901405699510f, 0.983524054057571260f, -0.180777308006728590f, + 0.983385110321551180f, -0.181531608261124970f, 0.983245588085407070f, -0.182285801725153300f, + 0.983105487431216290f, -0.183039887955140950f, 0.982964808441396440f, -0.183793866507478450f, + 0.982823551198705240f, -0.184547736938619620f, 0.982681715786240860f, -0.185301498805081900f, + 0.982539302287441240f, -0.186055151663446630f, 0.982396310786084690f, -0.186808695070359270f, + 0.982252741366289370f, -0.187562128582529600f, 0.982108594112513610f, -0.188315451756732120f, + 0.981963869109555240f, -0.189068664149806190f, 0.981818566442552500f, -0.189821765318656410f, + 0.981672686196983110f, -0.190574754820252740f, 0.981526228458664770f, -0.191327632211630900f, + 0.981379193313754560f, -0.192080397049892440f, 0.981231580848749730f, -0.192833048892205230f, + 0.981083391150486710f, -0.193585587295803610f, 0.980934624306141640f, -0.194338011817988600f, + 0.980785280403230430f, -0.195090322016128250f, 0.980635359529608120f, -0.195842517447657850f, + 0.980484861773469380f, -0.196594597670080220f, 0.980333787223347960f, -0.197346562240965920f, + 0.980182135968117430f, -0.198098410717953560f, 0.980029908096990090f, -0.198850142658750090f, + 0.979877103699517640f, -0.199601757621130970f, 0.979723722865591170f, -0.200353255162940450f, + 0.979569765685440520f, -0.201104634842091900f, 0.979415232249634780f, -0.201855896216568050f, + 0.979260122649082020f, -0.202607038844421130f, 0.979104436975029250f, -0.203358062283773320f, + 0.978948175319062200f, -0.204108966092816870f, 0.978791337773105670f, -0.204859749829814420f, + 0.978633924429423210f, -0.205610413053099240f, 0.978475935380616830f, -0.206360955321075510f, + 0.978317370719627650f, -0.207111376192218560f, 0.978158230539735050f, -0.207861675225075070f, + 0.977998514934557140f, -0.208611851978263490f, 0.977838223998050430f, -0.209361906010474160f, + 0.977677357824509930f, -0.210111836880469610f, 0.977515916508569280f, -0.210861644147084860f, + 0.977353900145199960f, -0.211611327369227550f, 0.977191308829712280f, -0.212360886105878420f, + 0.977028142657754390f, -0.213110319916091360f, 0.976864401725312640f, -0.213859628358993750f, + 0.976700086128711840f, -0.214608810993786760f, 0.976535195964614470f, -0.215357867379745550f, + 0.976369731330021140f, -0.216106797076219520f, 0.976203692322270560f, -0.216855599642632620f, + 0.976037079039039020f, -0.217604274638483640f, 0.975869891578341030f, -0.218352821623346320f, + 0.975702130038528570f, -0.219101240156869800f, 0.975533794518291360f, -0.219849529798778700f, + 0.975364885116656980f, -0.220597690108873510f, 0.975195401932990370f, -0.221345720647030810f, + 0.975025345066994120f, -0.222093620973203510f, 0.974854714618708430f, -0.222841390647421120f, + 0.974683510688510670f, -0.223589029229789990f, 0.974511733377115720f, -0.224336536280493600f, + 0.974339382785575860f, -0.225083911359792830f, 0.974166459015280320f, -0.225831154028026170f, + 0.973992962167955830f, -0.226578263845610000f, 0.973818892345666100f, -0.227325240373038860f, + 0.973644249650811980f, -0.228072083170885730f, 0.973469034186131070f, -0.228818791799802220f, + 0.973293246054698250f, -0.229565365820518870f, 0.973116885359925130f, -0.230311804793845440f, + 0.972939952205560180f, -0.231058108280671110f, 0.972762446695688570f, -0.231804275841964780f, + 0.972584368934732210f, -0.232550307038775240f, 0.972405719027449770f, -0.233296201432231590f, + 0.972226497078936270f, -0.234041958583543430f, 0.972046703194623500f, -0.234787578054000970f, + 0.971866337480279400f, -0.235533059404975490f, 0.971685400042008540f, -0.236278402197919570f, + 0.971503890986251780f, -0.237023605994367200f, 0.971321810419786160f, -0.237768670355934190f, + 0.971139158449725090f, -0.238513594844318420f, 0.970955935183517970f, -0.239258379021299980f, + 0.970772140728950350f, -0.240003022448741500f, 0.970587775194143630f, -0.240747524688588430f, + 0.970402838687555500f, -0.241491885302869330f, 0.970217331317979160f, -0.242236103853696010f, + 0.970031253194543970f, -0.242980179903263870f, 0.969844604426714830f, -0.243724113013852160f, + 0.969657385124292450f, -0.244467902747824150f, 0.969469595397413060f, -0.245211548667627540f, + 0.969281235356548530f, -0.245955050335794590f, 0.969092305112506210f, -0.246698407314942410f, + 0.968902804776428870f, -0.247441619167773270f, 0.968712734459794780f, -0.248184685457074780f, + 0.968522094274417380f, -0.248927605745720150f, 0.968330884332445190f, -0.249670379596668570f, + 0.968139104746362440f, -0.250413006572965220f, 0.967946755628987800f, -0.251155486237741920f, + 0.967753837093475510f, -0.251897818154216970f, 0.967560349253314360f, -0.252640001885695520f, + 0.967366292222328510f, -0.253382036995570160f, 0.967171666114676640f, -0.254123923047320620f, + 0.966976471044852070f, -0.254865659604514570f, 0.966780707127683270f, -0.255607246230807380f, + 0.966584374478333120f, -0.256348682489942910f, 0.966387473212298900f, -0.257089967945753120f, + 0.966190003445412500f, -0.257831102162158990f, 0.965991965293840570f, + -0.258572084703170340f, + 0.965793358874083680f, -0.259312915132886230f, 0.965594184302976830f, + -0.260053593015495190f, + 0.965394441697689400f, -0.260794117915275510f, 0.965194131175724720f, + -0.261534489396595520f, + 0.964993252854920320f, -0.262274707023913590f, 0.964791806853447900f, + -0.263014770361779000f, + 0.964589793289812760f, -0.263754678974831350f, 0.964387212282854290f, + -0.264494432427801630f, + 0.964184063951745830f, -0.265234030285511790f, 0.963980348415994110f, + -0.265973472112875590f, + 0.963776065795439840f, -0.266712757474898370f, 0.963571216210257320f, + -0.267451885936677620f, + 0.963365799780954050f, -0.268190857063403180f, 0.963159816628371360f, + -0.268929670420357260f, + 0.962953266873683880f, -0.269668325572915090f, 0.962746150638399410f, + -0.270406822086544820f, + 0.962538468044359160f, -0.271145159526808010f, 0.962330219213737400f, + -0.271883337459359720f, + 0.962121404269041580f, -0.272621355449948980f, 0.961912023333112210f, + -0.273359213064418680f, + 0.961702076529122540f, -0.274096909868706380f, 0.961491563980579000f, + -0.274834445428843940f, + 0.961280485811320640f, -0.275571819310958140f, 0.961068842145519350f, + -0.276309031081271080f, + 0.960856633107679660f, -0.277046080306099900f, 0.960643858822638590f, + -0.277782966551857690f, + 0.960430519415565790f, -0.278519689385053060f, 0.960216615011963430f, + -0.279256248372291180f, + 0.960002145737665960f, -0.279992643080273220f, 0.959787111718839900f, + -0.280728873075797190f, + 0.959571513081984520f, -0.281464937925757940f, 0.959355349953930790f, + -0.282200837197147560f, + 0.959138622461841890f, -0.282936570457055390f, 0.958921330733213170f, + -0.283672137272668430f, + 0.958703474895871600f, -0.284407537211271880f, 0.958485055077976100f, + -0.285142769840248670f, + 0.958266071408017670f, -0.285877834727080620f, 0.958046524014818600f, + -0.286612731439347790f, + 0.957826413027532910f, -0.287347459544729510f, 0.957605738575646350f, + -0.288082018611004130f, + 0.957384500788975860f, -0.288816408206049480f, 0.957162699797670210f, + -0.289550627897843030f, + 0.956940335732208820f, -0.290284677254462330f, 0.956717408723403050f, + -0.291018555844085090f, + 0.956493918902395100f, -0.291752263234989260f, 0.956269866400658030f, + -0.292485798995553880f, + 0.956045251349996410f, -0.293219162694258630f, 0.955820073882545420f, + -0.293952353899684660f, + 0.955594334130771110f, -0.294685372180514330f, 0.955368032227470350f, + -0.295418217105532010f, + 0.955141168305770780f, -0.296150888243623790f, 0.954913742499130520f, + -0.296883385163778270f, + 0.954685754941338340f, -0.297615707435086200f, 0.954457205766513490f, + -0.298347854626741400f, + 0.954228095109105670f, -0.299079826308040480f, 0.953998423103894490f, + -0.299811622048383350f, + 0.953768189885990330f, -0.300543241417273450f, 0.953537395590833280f, + -0.301274683984317950f, + 0.953306040354193860f, -0.302005949319228080f, 0.953074124312172200f, + -0.302737036991819140f, + 0.952841647601198720f, -0.303467946572011320f, 0.952608610358033350f, + -0.304198677629829110f, + 0.952375012719765880f, -0.304929229735402370f, 0.952140854823815830f, + -0.305659602458966120f, + 0.951906136807932350f, -0.306389795370860920f, 0.951670858810193860f, + -0.307119808041533100f, + 0.951435020969008340f, -0.307849640041534870f, 0.951198623423113230f, + -0.308579290941525090f, + 0.950961666311575080f, -0.309308760312268730f, 0.950724149773789610f, + -0.310038047724637890f, + 0.950486073949481700f, -0.310767152749611470f, 0.950247438978705230f, + -0.311496074958275910f, + 0.950008245001843000f, -0.312224813921824880f, 0.949768492159606680f, + -0.312953369211560200f, + 0.949528180593036670f, -0.313681740398891520f, 0.949287310443502120f, + -0.314409927055336660f, + 0.949045881852700560f, -0.315137928752522440f, 0.948803894962658490f, + -0.315865745062183960f, + 0.948561349915730270f, -0.316593375556165850f, 0.948318246854599090f, + -0.317320819806421740f, + 0.948074585922276230f, -0.318048077385014950f, 0.947830367262101010f, + -0.318775147864118480f, + 0.947585591017741090f, -0.319502030816015690f, 0.947340257333192050f, + -0.320228725813099860f, + 0.947094366352777220f, -0.320955232427875210f, 0.946847918221148000f, + -0.321681550232956580f, + 0.946600913083283530f, -0.322407678801069850f, 0.946353351084490590f, + -0.323133617705052330f, + 0.946105232370403450f, -0.323859366517852850f, 0.945856557086983910f, + -0.324584924812532150f, + 0.945607325380521280f, -0.325310292162262930f, 0.945357537397632290f, + -0.326035468140330240f, + 0.945107193285260610f, -0.326760452320131730f, 0.944856293190677210f, + -0.327485244275178000f, + 0.944604837261480260f, -0.328209843579092500f, 0.944352825645594750f, + -0.328934249805612200f, + 0.944100258491272660f, -0.329658462528587490f, 0.943847135947092690f, + -0.330382481321982780f, + 0.943593458161960390f, -0.331106305759876430f, 0.943339225285107720f, + -0.331829935416461110f, + 0.943084437466093490f, -0.332553369866044220f, 0.942829094854802710f, + -0.333276608683047930f, + 0.942573197601446870f, -0.333999651442009380f, 0.942316745856563780f, + -0.334722497717581220f, + 0.942059739771017310f, -0.335445147084531600f, 0.941802179495997650f, + -0.336167599117744520f, + 0.941544065183020810f, -0.336889853392220050f, 0.941285396983928660f, + -0.337611909483074620f, + 0.941026175050889260f, -0.338333766965541130f, 0.940766399536396070f, + -0.339055425414969640f, + 0.940506070593268300f, -0.339776884406826850f, 0.940245188374650880f, + -0.340498143516697160f, + 0.939983753034014050f, -0.341219202320282360f, 0.939721764725153340f, + -0.341940060393402190f, + 0.939459223602189920f, -0.342660717311994380f, 0.939196129819569900f, + -0.343381172652115040f, + 0.938932483532064600f, -0.344101425989938810f, 0.938668284894770170f, + -0.344821476901759290f, + 0.938403534063108060f, -0.345541324963989090f, 0.938138231192824360f, + -0.346260969753160010f, + 0.937872376439989890f, -0.346980410845923680f, 0.937605969960999990f, + -0.347699647819051380f, + 0.937339011912574960f, -0.348418680249434560f, 0.937071502451759190f, + -0.349137507714084970f, + 0.936803441735921560f, -0.349856129790134920f, 0.936534829922755500f, + -0.350574546054837510f, + 0.936265667170278260f, -0.351292756085567090f, 0.935995953636831410f, + -0.352010759459819080f, + 0.935725689481080370f, -0.352728555755210730f, 0.935454874862014620f, + -0.353446144549480810f, + 0.935183509938947610f, -0.354163525420490340f, 0.934911594871516090f, + -0.354880697946222790f, + 0.934639129819680780f, -0.355597661704783850f, 0.934366114943725790f, + -0.356314416274402410f, + 0.934092550404258980f, -0.357030961233429980f, 0.933818436362210960f, + -0.357747296160341900f, + 0.933543772978836170f, -0.358463420633736540f, 0.933268560415712050f, + -0.359179334232336500f, + 0.932992798834738960f, -0.359895036534988110f, 0.932716488398140250f, + -0.360610527120662270f, + 0.932439629268462360f, -0.361325805568454280f, 0.932162221608574430f, + -0.362040871457584180f, + 0.931884265581668150f, -0.362755724367397230f, 0.931605761351257830f, + -0.363470363877363760f, + 0.931326709081180430f, -0.364184789567079890f, 0.931047108935595280f, + -0.364899001016267320f, + 0.930766961078983710f, -0.365612997804773850f, 0.930486265676149780f, + -0.366326779512573590f, + 0.930205022892219070f, -0.367040345719767180f, 0.929923232892639670f, + -0.367753696006581980f, + 0.929640895843181330f, -0.368466829953372320f, 0.929358011909935500f, + -0.369179747140620020f, + 0.929074581259315860f, -0.369892447148934100f, 0.928790604058057020f, + -0.370604929559051670f, + 0.928506080473215590f, -0.371317193951837540f, 0.928221010672169440f, + -0.372029239908285010f, + 0.927935394822617890f, -0.372741067009515760f, 0.927649233092581180f, + -0.373452674836780300f, + 0.927362525650401110f, -0.374164062971457930f, 0.927075272664740100f, + -0.374875230995057540f, + 0.926787474304581750f, -0.375586178489217220f, 0.926499130739230510f, + -0.376296905035704790f, + 0.926210242138311380f, -0.377007410216418260f, 0.925920808671770070f, + -0.377717693613385640f, + 0.925630830509872720f, -0.378427754808765560f, 0.925340307823206310f, + -0.379137593384847320f, + 0.925049240782677580f, -0.379847208924051160f, 0.924757629559513910f, + -0.380556601008928520f, + 0.924465474325262600f, -0.381265769222162380f, 0.924172775251791200f, + -0.381974713146567220f, + 0.923879532511286740f, -0.382683432365089780f, 0.923585746276256670f, + -0.383391926460808660f, + 0.923291416719527640f, -0.384100195016935040f, 0.922996544014246250f, + -0.384808237616812880f, + 0.922701128333878630f, -0.385516053843918850f, 0.922405169852209880f, + -0.386223643281862980f, + 0.922108668743345180f, -0.386931005514388580f, 0.921811625181708120f, + -0.387638140125372730f, + 0.921514039342042010f, -0.388345046698826250f, 0.921215911399408730f, + -0.389051724818894380f, + 0.920917241529189520f, -0.389758174069856410f, 0.920618029907083970f, + -0.390464394036126590f, + 0.920318276709110590f, -0.391170384302253870f, 0.920017982111606570f, + -0.391876144452922350f, + 0.919717146291227360f, -0.392581674072951470f, 0.919415769424947070f, + -0.393286972747296400f, + 0.919113851690057770f, -0.393992040061048100f, 0.918811393264170050f, + -0.394696875599433560f, + 0.918508394325212250f, -0.395401478947816350f, 0.918204855051430900f, + -0.396105849691696270f, + 0.917900775621390500f, -0.396809987416710310f, 0.917596156213972950f, + -0.397513891708632330f, + 0.917290997008377910f, -0.398217562153373560f, 0.916985298184123000f, + -0.398920998336982910f, + 0.916679059921042700f, -0.399624199845646790f, 0.916372282399289140f, + -0.400327166265690090f, + 0.916064965799331720f, -0.401029897183575620f, 0.915757110301956720f, + -0.401732392185905010f, + 0.915448716088267830f, -0.402434650859418430f, 0.915139783339685260f, + -0.403136672790995300f, + 0.914830312237946200f, -0.403838457567654070f, 0.914520302965104450f, + -0.404540004776553000f, + 0.914209755703530690f, -0.405241314004989860f, 0.913898670635911680f, + -0.405942384840402510f, + 0.913587047945250810f, -0.406643216870369030f, 0.913274887814867760f, + -0.407343809682607970f, + 0.912962190428398210f, -0.408044162864978690f, 0.912648955969793900f, + -0.408744276005481360f, + 0.912335184623322750f, -0.409444148692257590f, 0.912020876573568340f, + -0.410143780513590240f, + 0.911706032005429880f, -0.410843171057903910f, 0.911390651104122430f, + -0.411542319913765220f, + 0.911074734055176360f, -0.412241226669882890f, 0.910758281044437570f, + -0.412939890915108080f, + 0.910441292258067250f, -0.413638312238434500f, 0.910123767882541680f, + -0.414336490228999100f, + 0.909805708104652220f, -0.415034424476081630f, 0.909487113111505430f, + -0.415732114569105360f, + 0.909167983090522380f, -0.416429560097637150f, 0.908848318229439120f, + -0.417126760651387870f, + 0.908528118716306120f, -0.417823715820212270f, 0.908207384739488700f, + -0.418520425194109700f, + 0.907886116487666260f, -0.419216888363223910f, 0.907564314149832630f, + -0.419913104917843620f, + 0.907241977915295820f, -0.420609074448402510f, 0.906919107973678140f, + -0.421304796545479640f, + 0.906595704514915330f, -0.422000270799799680f, 0.906271767729257660f, + -0.422695496802232950f, + 0.905947297807268460f, -0.423390474143796050f, 0.905622294939825270f, + -0.424085202415651560f, + 0.905296759318118820f, -0.424779681209108810f, 0.904970691133653250f, + -0.425473910115623800f, + 0.904644090578246240f, -0.426167888726799620f, 0.904316957844028320f, + -0.426861616634386430f, + 0.903989293123443340f, -0.427555093430282080f, 0.903661096609247980f, + -0.428248318706531960f, + 0.903332368494511820f, -0.428941292055329490f, 0.903003108972617150f, + -0.429634013069016380f, + 0.902673318237258830f, -0.430326481340082610f, 0.902342996482444200f, + -0.431018696461167030f, + 0.902012143902493180f, -0.431710658025057260f, 0.901680760692037730f, + -0.432402365624690140f, + 0.901348847046022030f, -0.433093818853151960f, 0.901016403159702330f, + -0.433785017303678520f, + 0.900683429228646970f, -0.434475960569655650f, 0.900349925448735600f, + -0.435166648244619260f, + 0.900015892016160280f, -0.435857079922255470f, 0.899681329127423930f, + -0.436547255196401200f, + 0.899346236979341570f, -0.437237173661044090f, 0.899010615769039070f, + -0.437926834910322860f, + 0.898674465693953820f, -0.438616238538527660f, 0.898337786951834310f, + -0.439305384140099950f, + 0.898000579740739880f, -0.439994271309633260f, 0.897662844259040860f, + -0.440682899641872900f, + 0.897324580705418320f, -0.441371268731716670f, 0.896985789278863970f, + -0.442059378174214700f, + 0.896646470178680150f, -0.442747227564570020f, 0.896306623604479550f, + -0.443434816498138480f, + 0.895966249756185220f, -0.444122144570429200f, 0.895625348834030110f, + -0.444809211377104880f, + 0.895283921038557580f, -0.445496016513981740f, 0.894941966570620750f, + -0.446182559577030070f, + 0.894599485631382700f, -0.446868840162374160f, 0.894256478422316040f, + -0.447554857866293010f, + 0.893912945145203250f, -0.448240612285219890f, 0.893568886002135910f, + -0.448926103015743260f, + 0.893224301195515320f, -0.449611329654606540f, 0.892879190928051680f, + -0.450296291798708610f, + 0.892533555402764580f, -0.450980989045103860f, 0.892187394822982480f, + -0.451665420991002490f, + 0.891840709392342720f, -0.452349587233770890f, 0.891493499314791380f, + -0.453033487370931580f, + 0.891145764794583180f, -0.453717121000163870f, 0.890797506036281490f, + -0.454400487719303580f, + 0.890448723244757880f, -0.455083587126343840f, 0.890099416625192320f, + -0.455766418819434640f, + 0.889749586383072780f, -0.456448982396883920f, 0.889399232724195520f, + -0.457131277457156980f, + 0.889048355854664570f, -0.457813303598877170f, 0.888696955980891600f, + -0.458495060420826270f, + 0.888345033309596350f, -0.459176547521944090f, 0.887992588047805560f, + -0.459857764501329540f, + 0.887639620402853930f, -0.460538710958240010f, 0.887286130582383150f, + -0.461219386492092380f, + 0.886932118794342190f, -0.461899790702462730f, 0.886577585246987040f, + -0.462579923189086810f, + 0.886222530148880640f, -0.463259783551860150f, 0.885866953708892790f, + -0.463939371390838520f, + 0.885510856136199950f, -0.464618686306237820f, 0.885154237640285110f, + -0.465297727898434600f, + 0.884797098430937790f, -0.465976495767966180f, 0.884439438718253810f, + -0.466654989515530920f, + 0.884081258712634990f, -0.467333208741988420f, 0.883722558624789660f, + -0.468011153048359830f, + 0.883363338665731580f, -0.468688822035827900f, 0.883003599046780830f, + -0.469366215305737520f, + 0.882643339979562790f, -0.470043332459595620f, 0.882282561676008710f, + -0.470720173099071600f, + 0.881921264348355050f, -0.471396736825997640f, 0.881559448209143780f, + -0.472073023242368660f, + 0.881197113471222090f, -0.472749031950342790f, 0.880834260347742040f, + -0.473424762552241530f, + 0.880470889052160750f, -0.474100214650549970f, 0.880106999798240360f, + -0.474775387847917120f, + 0.879742592800047410f, -0.475450281747155870f, 0.879377668271953290f, + -0.476124895951243580f, + 0.879012226428633530f, -0.476799230063322090f, 0.878646267485068130f, + -0.477473283686698060f, + 0.878279791656541580f, -0.478147056424843010f, 0.877912799158641840f, + -0.478820547881393890f, + 0.877545290207261350f, -0.479493757660153010f, 0.877177265018595940f, + -0.480166685365088390f, + 0.876808723809145650f, -0.480839330600333960f, 0.876439666795713610f, + -0.481511692970189860f, + 0.876070094195406600f, -0.482183772079122720f, 0.875700006225634600f, + -0.482855567531765670f, + 0.875329403104110890f, -0.483527078932918740f, 0.874958285048851650f, + -0.484198305887549030f, + 0.874586652278176110f, -0.484869248000791060f, 0.874214505010706300f, + -0.485539904877946960f, + 0.873841843465366860f, -0.486210276124486420f, 0.873468667861384880f, + -0.486880361346047340f, + 0.873094978418290090f, -0.487550160148436000f, 0.872720775355914300f, + -0.488219672137626790f, + 0.872346058894391540f, -0.488888896919763170f, 0.871970829254157810f, + -0.489557834101157440f, + 0.871595086655950980f, -0.490226483288291160f, 0.871218831320811020f, + -0.490894844087815090f, + 0.870842063470078980f, -0.491562916106549900f, 0.870464783325397670f, + -0.492230698951486020f, + 0.870086991108711460f, -0.492898192229784040f, 0.869708687042265670f, + -0.493565395548774770f, + 0.869329871348606840f, -0.494232308515959670f, 0.868950544250582380f, + -0.494898930739011260f, + 0.868570705971340900f, -0.495565261825772540f, 0.868190356734331310f, + -0.496231301384258250f, + 0.867809496763303320f, -0.496897049022654470f, 0.867428126282306920f, + -0.497562504349319150f, + 0.867046245515692650f, -0.498227666972781870f, 0.866663854688111130f, + -0.498892536501744590f, + 0.866280954024512990f, -0.499557112545081840f, 0.865897543750148820f, + -0.500221394711840680f, + 0.865513624090569090f, -0.500885382611240710f, 0.865129195271623800f, + -0.501549075852675390f, + 0.864744257519462380f, -0.502212474045710790f, 0.864358811060534030f, + -0.502875576800086990f, + 0.863972856121586810f, -0.503538383725717580f, 0.863586392929668100f, + -0.504200894432690340f, + 0.863199421712124160f, -0.504863108531267590f, 0.862811942696600330f, + -0.505525025631885390f, + 0.862423956111040610f, -0.506186645345155230f, 0.862035462183687210f, + -0.506847967281863210f, + 0.861646461143081300f, -0.507508991052970870f, 0.861256953218062170f, + -0.508169716269614600f, + 0.860866938637767310f, -0.508830142543106990f, 0.860476417631632070f, + -0.509490269484936360f, + 0.860085390429390140f, -0.510150096706766810f, 0.859693857261072610f, + -0.510809623820439040f, + 0.859301818357008470f, -0.511468850437970300f, 0.858909273947823900f, + -0.512127776171554690f, + 0.858516224264442740f, -0.512786400633562960f, 0.858122669538086140f, + -0.513444723436543460f, + 0.857728610000272120f, -0.514102744193221660f, 0.857334045882815590f, + -0.514760462516501200f, + 0.856938977417828760f, -0.515417878019462930f, 0.856543404837719960f, + -0.516074990315366630f, + 0.856147328375194470f, -0.516731799017649870f, 0.855750748263253920f, + -0.517388303739929060f, + 0.855353664735196030f, -0.518044504095999340f, 0.854956078024614930f, + -0.518700399699834950f, + 0.854557988365400530f, -0.519355990165589640f, 0.854159395991738850f, + -0.520011275107596040f, + 0.853760301138111410f, -0.520666254140367160f, 0.853360704039295430f, + -0.521320926878595660f, + 0.852960604930363630f, -0.521975292937154390f, 0.852560004046684080f, + -0.522629351931096610f, + 0.852158901623919830f, -0.523283103475656430f, 0.851757297898029120f, + -0.523936547186248600f, + 0.851355193105265200f, -0.524589682678468950f, 0.850952587482175730f, + -0.525242509568094710f, + 0.850549481265603480f, -0.525895027471084630f, 0.850145874692685210f, + -0.526547236003579440f, + 0.849741768000852550f, -0.527199134781901280f, 0.849337161427830780f, + -0.527850723422555230f, + 0.848932055211639610f, -0.528502001542228480f, 0.848526449590592650f, + -0.529152968757790610f, + 0.848120344803297230f, -0.529803624686294610f, 0.847713741088654380f, + -0.530453968944976320f, + 0.847306638685858320f, -0.531104001151255000f, 0.846899037834397240f, + -0.531753720922733320f, + 0.846490938774052130f, -0.532403127877197900f, 0.846082341744897050f, + -0.533052221632619450f, + 0.845673246987299070f, -0.533701001807152960f, 0.845263654741918220f, + -0.534349468019137520f, + 0.844853565249707120f, -0.534997619887097150f, 0.844442978751910660f, + -0.535645457029741090f, + 0.844031895490066410f, -0.536292979065963180f, 0.843620315706004150f, + -0.536940185614842910f, + 0.843208239641845440f, -0.537587076295645390f, 0.842795667540004120f, + -0.538233650727821700f, + 0.842382599643185850f, -0.538879908531008420f, 0.841969036194387680f, + -0.539525849325028890f, + 0.841554977436898440f, -0.540171472729892850f, 0.841140423614298080f, + -0.540816778365796670f, + 0.840725374970458070f, -0.541461765853123440f, 0.840309831749540770f, + -0.542106434812443920f, + 0.839893794195999520f, -0.542750784864515890f, 0.839477262554578550f, + -0.543394815630284800f, + 0.839060237070312740f, -0.544038526730883820f, 0.838642717988527300f, + -0.544681917787634530f, + 0.838224705554838080f, -0.545324988422046460f, 0.837806200015150940f, + -0.545967738255817570f, + 0.837387201615661940f, -0.546610166910834860f, 0.836967710602857020f, + -0.547252274009174090f, + 0.836547727223512010f, -0.547894059173100190f, 0.836127251724692270f, + -0.548535522025067390f, + 0.835706284353752600f, -0.549176662187719660f, 0.835284825358337370f, + -0.549817479283890910f, + 0.834862874986380010f, -0.550457972936604810f, 0.834440433486103190f, + -0.551098142769075430f, + 0.834017501106018130f, -0.551737988404707340f, 0.833594078094925140f, + -0.552377509467096070f, + 0.833170164701913190f, -0.553016705580027470f, 0.832745761176359460f, + -0.553655576367479310f, + 0.832320867767929680f, -0.554294121453620000f, 0.831895484726577590f, + -0.554932340462810370f, + 0.831469612302545240f, -0.555570233019602180f, 0.831043250746362320f, + -0.556207798748739930f, + 0.830616400308846310f, -0.556845037275160100f, 0.830189061241102370f, + -0.557481948223991550f, + 0.829761233794523050f, -0.558118531220556100f, 0.829332918220788250f, + -0.558754785890368310f, + 0.828904114771864870f, -0.559390711859136140f, 0.828474823700007130f, + -0.560026308752760380f, + 0.828045045257755800f, -0.560661576197336030f, 0.827614779697938400f, + -0.561296513819151470f, + 0.827184027273669130f, -0.561931121244689470f, 0.826752788238348520f, + -0.562565398100626560f, + 0.826321062845663530f, -0.563199344013834090f, 0.825888851349586780f, + -0.563832958611378170f, + 0.825456154004377550f, -0.564466241520519500f, 0.825022971064580220f, + -0.565099192368713980f, + 0.824589302785025290f, -0.565731810783613120f, 0.824155149420828570f, + -0.566364096393063840f, + 0.823720511227391430f, -0.566996048825108680f, 0.823285388460400110f, + -0.567627667707986230f, + 0.822849781375826430f, -0.568258952670131490f, 0.822413690229926390f, + -0.568889903340175860f, + 0.821977115279241550f, -0.569520519346947140f, 0.821540056780597610f, + -0.570150800319470300f, + 0.821102514991104650f, -0.570780745886967260f, 0.820664490168157460f, + -0.571410355678857230f, + 0.820225982569434690f, -0.572039629324757050f, 0.819786992452898990f, + -0.572668566454481160f, + 0.819347520076796900f, -0.573297166698042200f, 0.818907565699658950f, + -0.573925429685650750f, + 0.818467129580298660f, -0.574553355047715760f, 0.818026211977813440f, + -0.575180942414845080f, + 0.817584813151583710f, -0.575808191417845340f, 0.817142933361272970f, + -0.576435101687721830f, + 0.816700572866827850f, -0.577061672855679440f, 0.816257731928477390f, + -0.577687904553122800f, + 0.815814410806733780f, -0.578313796411655590f, 0.815370609762391290f, + -0.578939348063081780f, + 0.814926329056526620f, -0.579564559139405630f, 0.814481568950498610f, + -0.580189429272831680f, + 0.814036329705948410f, -0.580813958095764530f, 0.813590611584798510f, + -0.581438145240810170f, + 0.813144414849253590f, -0.582061990340775440f, 0.812697739761799490f, + -0.582685493028668460f, + 0.812250586585203880f, -0.583308652937698290f, 0.811802955582515470f, + -0.583931469701276180f, + 0.811354847017063730f, -0.584553942953015330f, 0.810906261152459670f, + -0.585176072326730410f, + 0.810457198252594770f, -0.585797857456438860f, 0.810007658581641140f, + -0.586419297976360500f, + 0.809557642404051260f, -0.587040393520917970f, 0.809107149984558240f, + -0.587661143724736660f, + 0.808656181588174980f, -0.588281548222645220f, 0.808204737480194720f, + -0.588901606649675720f, + 0.807752817926190360f, -0.589521318641063940f, 0.807300423192014450f, + -0.590140683832248820f, + 0.806847553543799330f, -0.590759701858874160f, 0.806394209247956240f, + -0.591378372356787580f, + 0.805940390571176280f, -0.591996694962040990f, 0.805486097780429230f, + -0.592614669310891130f, + 0.805031331142963660f, -0.593232295039799800f, 0.804576090926307110f, + -0.593849571785433630f, + 0.804120377398265810f, -0.594466499184664430f, 0.803664190826924090f, + -0.595083076874569960f, + 0.803207531480644940f, -0.595699304492433360f, 0.802750399628069160f, + -0.596315181675743710f, + 0.802292795538115720f, -0.596930708062196500f, 0.801834719479981310f, + -0.597545883289693160f, + 0.801376171723140240f, -0.598160706996342270f, 0.800917152537344300f, + -0.598775178820458720f, + 0.800457662192622820f, -0.599389298400564540f, 0.799997700959281910f, + -0.600003065375388940f, + 0.799537269107905010f, -0.600616479383868970f, 0.799076366909352350f, + -0.601229540065148500f, + 0.798614994634760820f, -0.601842247058580030f, 0.798153152555543750f, + -0.602454600003723750f, + 0.797690840943391160f, -0.603066598540348160f, 0.797228060070268810f, + -0.603678242308430370f, + 0.796764810208418830f, -0.604289530948155960f, 0.796301091630359110f, + -0.604900464099919820f, + 0.795836904608883570f, -0.605511041404325550f, 0.795372249417061310f, + -0.606121262502186120f, + 0.794907126328237010f, -0.606731127034524480f, 0.794441535616030590f, + -0.607340634642572930f, + 0.793975477554337170f, -0.607949784967773630f, 0.793508952417326660f, + -0.608558577651779450f, + 0.793041960479443640f, -0.609167012336453210f, 0.792574502015407690f, + -0.609775088663868430f, + 0.792106577300212390f, -0.610382806276309480f, 0.791638186609125880f, + -0.610990164816271660f, + 0.791169330217690200f, -0.611597163926461910f, 0.790700008401721610f, + -0.612203803249797950f, + 0.790230221437310030f, -0.612810082429409710f, 0.789759969600819070f, + -0.613416001108638590f, + 0.789289253168885650f, -0.614021558931038380f, 0.788818072418420280f, + -0.614626755540375050f, + 0.788346427626606340f, -0.615231590580626820f, 0.787874319070900220f, + -0.615836063695985090f, + 0.787401747029031430f, -0.616440174530853650f, 0.786928711779001810f, + -0.617043922729849760f, + 0.786455213599085770f, -0.617647307937803870f, 0.785981252767830150f, + -0.618250329799760250f, + 0.785506829564053930f, -0.618852987960976320f, 0.785031944266848080f, + -0.619455282066924020f, + 0.784556597155575240f, -0.620057211763289100f, 0.784080788509869950f, + -0.620658776695972140f, + 0.783604518609638200f, -0.621259976511087550f, 0.783127787735057310f, + -0.621860810854965360f, + 0.782650596166575730f, -0.622461279374149970f, 0.782172944184913010f, + -0.623061381715401260f, + 0.781694832071059390f, -0.623661117525694530f, 0.781216260106276090f, + -0.624260486452220650f, + 0.780737228572094490f, -0.624859488142386340f, 0.780257737750316590f, + -0.625458122243814360f, + 0.779777787923014550f, -0.626056388404343520f, 0.779297379372530300f, + -0.626654286272029350f, + 0.778816512381475980f, -0.627251815495144080f, 0.778335187232733210f, + -0.627848975722176460f, + 0.777853404209453150f, -0.628445766601832710f, 0.777371163595056310f, + -0.629042187783036000f, + 0.776888465673232440f, -0.629638238914926980f, 0.776405310727940390f, + -0.630233919646864370f, + 0.775921699043407690f, -0.630829229628424470f, 0.775437630904130540f, + -0.631424168509401860f, + 0.774953106594873930f, -0.632018735939809060f, 0.774468126400670860f, + -0.632612931569877410f, + 0.773982690606822900f, -0.633206755050057190f, 0.773496799498899050f, + -0.633800206031017280f, + 0.773010453362736990f, -0.634393284163645490f, 0.772523652484441330f, + -0.634985989099049460f, + 0.772036397150384520f, -0.635578320488556110f, 0.771548687647206300f, + -0.636170277983712170f, + 0.771060524261813820f, -0.636761861236284200f, 0.770571907281380810f, + -0.637353069898259130f, + 0.770082836993347900f, -0.637943903621844060f, 0.769593313685422940f, + -0.638534362059466790f, + 0.769103337645579700f, -0.639124444863775730f, 0.768612909162058380f, + -0.639714151687640450f, + 0.768122028523365420f, -0.640303482184151670f, 0.767630696018273380f, + -0.640892436006621380f, + 0.767138911935820400f, -0.641481012808583160f, 0.766646676565310380f, + -0.642069212243792540f, + 0.766153990196312920f, -0.642657033966226860f, 0.765660853118662500f, + -0.643244477630085850f, + 0.765167265622458960f, -0.643831542889791390f, 0.764673227998067140f, + -0.644418229399988380f, + 0.764178740536116670f, -0.645004536815543930f, 0.763683803527501870f, + -0.645590464791548690f, + 0.763188417263381270f, -0.646176012983316280f, 0.762692582035177980f, + -0.646761181046383920f, + 0.762196298134578900f, -0.647345968636512060f, 0.761699565853535380f, + -0.647930375409685340f, + 0.761202385484261780f, -0.648514401022112440f, 0.760704757319236920f, + -0.649098045130225950f, + 0.760206681651202420f, -0.649681307390683190f, 0.759708158773163440f, + -0.650264187460365850f, + 0.759209188978388070f, -0.650846684996380880f, 0.758709772560407390f, + -0.651428799656059820f, + 0.758209909813015280f, -0.652010531096959500f, 0.757709601030268080f, + -0.652591878976862440f, + 0.757208846506484570f, -0.653172842953776760f, 0.756707646536245670f, + -0.653753422685936060f, + 0.756206001414394540f, -0.654333617831800440f, 0.755703911436035880f, + -0.654913428050056030f, + 0.755201376896536550f, -0.655492852999615350f, 0.754698398091524500f, + -0.656071892339617600f, + 0.754194975316889170f, -0.656650545729428940f, 0.753691108868781210f, + -0.657228812828642540f, + 0.753186799043612520f, -0.657806693297078640f, 0.752682046138055340f, + -0.658384186794785050f, + 0.752176850449042810f, -0.658961292982037320f, 0.751671212273768430f, + -0.659538011519338660f, + 0.751165131909686480f, -0.660114342067420480f, 0.750658609654510700f, + -0.660690284287242300f, + 0.750151645806215070f, -0.661265837839992270f, 0.749644240663033480f, + -0.661841002387086870f, + 0.749136394523459370f, -0.662415777590171780f, 0.748628107686245440f, + -0.662990163111121470f, + 0.748119380450403600f, -0.663564158612039770f, 0.747610213115205150f, + -0.664137763755260010f, + 0.747100605980180130f, -0.664710978203344790f, 0.746590559345117310f, + -0.665283801619087180f, + 0.746080073510063780f, -0.665856233665509720f, 0.745569148775325430f, + -0.666428274005865240f, + 0.745057785441466060f, -0.666999922303637470f, 0.744545983809307370f, + -0.667571178222540310f, + 0.744033744179929290f, -0.668142041426518450f, 0.743521066854669120f, + -0.668712511579747980f, + 0.743007952135121720f, -0.669282588346636010f, 0.742494400323139180f, + -0.669852271391821020f, + 0.741980411720831070f, -0.670421560380173090f, 0.741465986630563290f, + -0.670990454976794220f, + 0.740951125354959110f, -0.671558954847018330f, 0.740435828196898020f, + -0.672127059656411730f, + 0.739920095459516200f, -0.672694769070772860f, 0.739403927446205760f, + -0.673262082756132970f, + 0.738887324460615110f, -0.673829000378756040f, 0.738370286806648620f, + -0.674395521605139050f, + 0.737852814788465980f, -0.674961646102011930f, 0.737334908710482910f, + -0.675527373536338520f, + 0.736816568877369900f, -0.676092703575315920f, 0.736297795594053170f, + -0.676657635886374950f, + 0.735778589165713590f, -0.677222170137180330f, 0.735258949897786840f, + -0.677786305995631500f, + 0.734738878095963500f, -0.678350043129861470f, 0.734218374066188280f, + -0.678913381208238410f, + 0.733697438114660370f, -0.679476319899364970f, 0.733176070547832740f, + -0.680038858872078930f, + 0.732654271672412820f, -0.680600997795453020f, 0.732132041795361290f, + -0.681162736338795430f, + 0.731609381223892630f, -0.681724074171649710f, 0.731086290265474340f, + -0.682285010963795570f, + 0.730562769227827590f, -0.682845546385248080f, 0.730038818418926260f, + -0.683405680106258680f, + 0.729514438146997010f, -0.683965411797315400f, 0.728989628720519420f, + -0.684524741129142300f, + 0.728464390448225200f, -0.685083667772700360f, 0.727938723639098620f, + -0.685642191399187470f, + 0.727412628602375770f, -0.686200311680038590f, 0.726886105647544970f, + -0.686758028286925890f, + 0.726359155084346010f, -0.687315340891759050f, 0.725831777222770370f, + -0.687872249166685550f, + 0.725303972373060770f, -0.688428752784090440f, 0.724775740845711280f, + -0.688984851416597040f, + 0.724247082951467000f, -0.689540544737066830f, 0.723717999001323500f, + -0.690095832418599950f, + 0.723188489306527460f, -0.690650714134534600f, 0.722658554178575610f, + -0.691205189558448450f, + 0.722128193929215350f, -0.691759258364157750f, 0.721597408870443770f, + -0.692312920225718220f, + 0.721066199314508110f, -0.692866174817424630f, 0.720534565573905270f, + -0.693419021813811760f, + 0.720002507961381650f, -0.693971460889654000f, 0.719470026789932990f, + -0.694523491719965520f, + 0.718937122372804490f, -0.695075113980000880f, 0.718403795023489830f, + -0.695626327345254870f, + 0.717870045055731710f, -0.696177131491462990f, 0.717335872783521730f, + -0.696727526094601200f, + 0.716801278521099540f, -0.697277510830886520f, 0.716266262582953120f, + -0.697827085376777290f, + 0.715730825283818590f, -0.698376249408972920f, 0.715194966938680120f, + -0.698925002604414150f, + 0.714658687862769090f, -0.699473344640283770f, 0.714121988371564820f, + -0.700021275194006250f, + 0.713584868780793640f, -0.700568793943248340f, 0.713047329406429340f, + -0.701115900565918660f, + 0.712509370564692320f, -0.701662594740168450f, 0.711970992572050100f, + -0.702208876144391870f, + 0.711432195745216430f, -0.702754744457225300f, 0.710892980401151680f, + -0.703300199357548730f, + 0.710353346857062420f, -0.703845240524484940f, 0.709813295430400840f, + -0.704389867637400410f, + 0.709272826438865690f, -0.704934080375904880f, 0.708731940200400650f, + -0.705477878419852100f, + 0.708190637033195400f, -0.706021261449339740f, 0.707648917255684350f, + -0.706564229144709510f, + 0.707106781186547570f, -0.707106781186547460f, 0.706564229144709620f, + -0.707648917255684350f, + 0.706021261449339740f, -0.708190637033195290f, 0.705477878419852210f, + -0.708731940200400650f, + 0.704934080375904990f, -0.709272826438865580f, 0.704389867637400410f, + -0.709813295430400840f, + 0.703845240524484940f, -0.710353346857062310f, 0.703300199357548730f, + -0.710892980401151680f, + 0.702754744457225300f, -0.711432195745216430f, 0.702208876144391870f, + -0.711970992572049990f, + 0.701662594740168570f, -0.712509370564692320f, 0.701115900565918660f, + -0.713047329406429230f, + 0.700568793943248450f, -0.713584868780793520f, 0.700021275194006360f, + -0.714121988371564710f, + 0.699473344640283770f, -0.714658687862768980f, 0.698925002604414150f, + -0.715194966938680010f, + 0.698376249408972920f, -0.715730825283818590f, 0.697827085376777290f, + -0.716266262582953120f, + 0.697277510830886630f, -0.716801278521099540f, 0.696727526094601200f, + -0.717335872783521730f, + 0.696177131491462990f, -0.717870045055731710f, 0.695626327345254870f, + -0.718403795023489720f, + 0.695075113980000880f, -0.718937122372804380f, 0.694523491719965520f, + -0.719470026789932990f, + 0.693971460889654000f, -0.720002507961381650f, 0.693419021813811880f, + -0.720534565573905270f, + 0.692866174817424740f, -0.721066199314508110f, 0.692312920225718220f, + -0.721597408870443660f, + 0.691759258364157750f, -0.722128193929215350f, 0.691205189558448450f, + -0.722658554178575610f, + 0.690650714134534720f, -0.723188489306527350f, 0.690095832418599950f, + -0.723717999001323390f, + 0.689540544737066940f, -0.724247082951466890f, 0.688984851416597150f, + -0.724775740845711280f, + 0.688428752784090550f, -0.725303972373060660f, 0.687872249166685550f, + -0.725831777222770370f, + 0.687315340891759160f, -0.726359155084346010f, 0.686758028286925890f, + -0.726886105647544970f, + 0.686200311680038700f, -0.727412628602375770f, 0.685642191399187470f, + -0.727938723639098620f, + 0.685083667772700360f, -0.728464390448225200f, 0.684524741129142300f, + -0.728989628720519310f, + 0.683965411797315510f, -0.729514438146996900f, 0.683405680106258790f, + -0.730038818418926150f, + 0.682845546385248080f, -0.730562769227827590f, 0.682285010963795570f, + -0.731086290265474230f, + 0.681724074171649820f, -0.731609381223892520f, 0.681162736338795430f, + -0.732132041795361290f, + 0.680600997795453130f, -0.732654271672412820f, 0.680038858872079040f, + -0.733176070547832740f, + 0.679476319899365080f, -0.733697438114660260f, 0.678913381208238410f, + -0.734218374066188170f, + 0.678350043129861580f, -0.734738878095963390f, 0.677786305995631500f, + -0.735258949897786730f, + 0.677222170137180450f, -0.735778589165713480f, 0.676657635886374950f, + -0.736297795594053060f, + 0.676092703575316030f, -0.736816568877369790f, 0.675527373536338630f, + -0.737334908710482790f, + 0.674961646102012040f, -0.737852814788465980f, 0.674395521605139050f, + -0.738370286806648510f, + 0.673829000378756150f, -0.738887324460615110f, 0.673262082756132970f, + -0.739403927446205760f, + 0.672694769070772970f, -0.739920095459516090f, 0.672127059656411840f, + -0.740435828196898020f, + 0.671558954847018330f, -0.740951125354959110f, 0.670990454976794220f, + -0.741465986630563290f, + 0.670421560380173090f, -0.741980411720830960f, 0.669852271391821130f, + -0.742494400323139180f, + 0.669282588346636010f, -0.743007952135121720f, 0.668712511579748090f, + -0.743521066854669120f, + 0.668142041426518560f, -0.744033744179929180f, 0.667571178222540310f, + -0.744545983809307250f, + 0.666999922303637470f, -0.745057785441465950f, 0.666428274005865350f, + -0.745569148775325430f, + 0.665856233665509720f, -0.746080073510063780f, 0.665283801619087180f, + -0.746590559345117310f, + 0.664710978203344900f, -0.747100605980180130f, 0.664137763755260010f, + -0.747610213115205150f, + 0.663564158612039880f, -0.748119380450403490f, 0.662990163111121470f, + -0.748628107686245330f, + 0.662415777590171780f, -0.749136394523459260f, 0.661841002387086870f, + -0.749644240663033480f, + 0.661265837839992270f, -0.750151645806214960f, 0.660690284287242300f, + -0.750658609654510590f, + 0.660114342067420480f, -0.751165131909686370f, 0.659538011519338770f, + -0.751671212273768430f, + 0.658961292982037320f, -0.752176850449042700f, 0.658384186794785050f, + -0.752682046138055230f, + 0.657806693297078640f, -0.753186799043612410f, 0.657228812828642650f, + -0.753691108868781210f, + 0.656650545729429050f, -0.754194975316889170f, 0.656071892339617710f, + -0.754698398091524390f, + 0.655492852999615460f, -0.755201376896536550f, 0.654913428050056150f, + -0.755703911436035880f, + 0.654333617831800550f, -0.756206001414394540f, 0.653753422685936170f, + -0.756707646536245670f, + 0.653172842953776760f, -0.757208846506484460f, 0.652591878976862550f, + -0.757709601030268080f, + 0.652010531096959500f, -0.758209909813015280f, 0.651428799656059820f, + -0.758709772560407390f, + 0.650846684996380990f, -0.759209188978387960f, 0.650264187460365960f, + -0.759708158773163440f, + 0.649681307390683190f, -0.760206681651202420f, 0.649098045130226060f, + -0.760704757319236920f, + 0.648514401022112550f, -0.761202385484261780f, 0.647930375409685460f, + -0.761699565853535270f, + 0.647345968636512060f, -0.762196298134578900f, 0.646761181046383920f, + -0.762692582035177870f, + 0.646176012983316390f, -0.763188417263381270f, 0.645590464791548800f, + -0.763683803527501870f, + 0.645004536815544040f, -0.764178740536116670f, 0.644418229399988380f, + -0.764673227998067140f, + 0.643831542889791500f, -0.765167265622458960f, 0.643244477630085850f, + -0.765660853118662390f, + 0.642657033966226860f, -0.766153990196312810f, 0.642069212243792540f, + -0.766646676565310380f, + 0.641481012808583160f, -0.767138911935820400f, 0.640892436006621380f, + -0.767630696018273270f, + 0.640303482184151670f, -0.768122028523365310f, 0.639714151687640450f, + -0.768612909162058270f, + 0.639124444863775730f, -0.769103337645579590f, 0.638534362059466790f, + -0.769593313685422940f, + 0.637943903621844170f, -0.770082836993347900f, 0.637353069898259130f, + -0.770571907281380700f, + 0.636761861236284200f, -0.771060524261813710f, 0.636170277983712170f, + -0.771548687647206300f, + 0.635578320488556230f, -0.772036397150384410f, 0.634985989099049460f, + -0.772523652484441330f, + 0.634393284163645490f, -0.773010453362736990f, 0.633800206031017280f, + -0.773496799498899050f, + 0.633206755050057190f, -0.773982690606822790f, 0.632612931569877520f, + -0.774468126400670860f, + 0.632018735939809060f, -0.774953106594873820f, 0.631424168509401860f, + -0.775437630904130430f, + 0.630829229628424470f, -0.775921699043407580f, 0.630233919646864480f, + -0.776405310727940390f, + 0.629638238914927100f, -0.776888465673232440f, 0.629042187783036000f, + -0.777371163595056200f, + 0.628445766601832710f, -0.777853404209453040f, 0.627848975722176570f, + -0.778335187232733090f, + 0.627251815495144190f, -0.778816512381475870f, 0.626654286272029460f, + -0.779297379372530300f, + 0.626056388404343520f, -0.779777787923014440f, 0.625458122243814360f, + -0.780257737750316590f, + 0.624859488142386450f, -0.780737228572094380f, 0.624260486452220650f, + -0.781216260106276090f, + 0.623661117525694640f, -0.781694832071059390f, 0.623061381715401370f, + -0.782172944184912900f, + 0.622461279374150080f, -0.782650596166575730f, 0.621860810854965360f, + -0.783127787735057310f, + 0.621259976511087660f, -0.783604518609638200f, 0.620658776695972140f, + -0.784080788509869950f, + 0.620057211763289210f, -0.784556597155575240f, 0.619455282066924020f, + -0.785031944266848080f, + 0.618852987960976320f, -0.785506829564053930f, 0.618250329799760250f, + -0.785981252767830150f, + 0.617647307937803980f, -0.786455213599085770f, 0.617043922729849760f, + -0.786928711779001700f, + 0.616440174530853650f, -0.787401747029031320f, 0.615836063695985090f, + -0.787874319070900110f, + 0.615231590580626820f, -0.788346427626606230f, 0.614626755540375050f, + -0.788818072418420170f, + 0.614021558931038490f, -0.789289253168885650f, 0.613416001108638590f, + -0.789759969600819070f, + 0.612810082429409710f, -0.790230221437310030f, 0.612203803249798060f, + -0.790700008401721610f, + 0.611597163926462020f, -0.791169330217690090f, 0.610990164816271770f, + -0.791638186609125770f, + 0.610382806276309480f, -0.792106577300212390f, 0.609775088663868430f, + -0.792574502015407580f, + 0.609167012336453210f, -0.793041960479443640f, 0.608558577651779450f, + -0.793508952417326660f, + 0.607949784967773740f, -0.793975477554337170f, 0.607340634642572930f, + -0.794441535616030590f, + 0.606731127034524480f, -0.794907126328237010f, 0.606121262502186230f, + -0.795372249417061190f, + 0.605511041404325550f, -0.795836904608883460f, 0.604900464099919930f, + -0.796301091630359110f, + 0.604289530948156070f, -0.796764810208418720f, 0.603678242308430370f, + -0.797228060070268700f, + 0.603066598540348280f, -0.797690840943391040f, 0.602454600003723860f, + -0.798153152555543750f, + 0.601842247058580030f, -0.798614994634760820f, 0.601229540065148620f, + -0.799076366909352350f, + 0.600616479383868970f, -0.799537269107905010f, 0.600003065375389060f, + -0.799997700959281910f, + 0.599389298400564540f, -0.800457662192622710f, 0.598775178820458720f, + -0.800917152537344300f, + 0.598160706996342380f, -0.801376171723140130f, 0.597545883289693270f, + -0.801834719479981310f, + 0.596930708062196500f, -0.802292795538115720f, 0.596315181675743820f, + -0.802750399628069160f, + 0.595699304492433470f, -0.803207531480644830f, 0.595083076874569960f, + -0.803664190826924090f, + 0.594466499184664540f, -0.804120377398265700f, 0.593849571785433630f, + -0.804576090926307000f, + 0.593232295039799800f, -0.805031331142963660f, 0.592614669310891130f, + -0.805486097780429120f, + 0.591996694962040990f, -0.805940390571176280f, 0.591378372356787580f, + -0.806394209247956240f, + 0.590759701858874280f, -0.806847553543799220f, 0.590140683832248940f, + -0.807300423192014450f, + 0.589521318641063940f, -0.807752817926190360f, 0.588901606649675840f, + -0.808204737480194720f, + 0.588281548222645330f, -0.808656181588174980f, 0.587661143724736770f, + -0.809107149984558130f, + 0.587040393520918080f, -0.809557642404051260f, 0.586419297976360500f, + -0.810007658581641140f, + 0.585797857456438860f, -0.810457198252594770f, 0.585176072326730410f, + -0.810906261152459670f, + 0.584553942953015330f, -0.811354847017063730f, 0.583931469701276300f, + -0.811802955582515360f, + 0.583308652937698290f, -0.812250586585203880f, 0.582685493028668460f, + -0.812697739761799490f, + 0.582061990340775550f, -0.813144414849253590f, 0.581438145240810280f, + -0.813590611584798510f, + 0.580813958095764530f, -0.814036329705948300f, 0.580189429272831680f, + -0.814481568950498610f, + 0.579564559139405740f, -0.814926329056526620f, 0.578939348063081890f, + -0.815370609762391290f, + 0.578313796411655590f, -0.815814410806733780f, 0.577687904553122800f, + -0.816257731928477390f, + 0.577061672855679550f, -0.816700572866827850f, 0.576435101687721830f, + -0.817142933361272970f, + 0.575808191417845340f, -0.817584813151583710f, 0.575180942414845190f, + -0.818026211977813440f, + 0.574553355047715760f, -0.818467129580298660f, 0.573925429685650750f, + -0.818907565699658950f, + 0.573297166698042320f, -0.819347520076796900f, 0.572668566454481160f, + -0.819786992452898990f, + 0.572039629324757050f, -0.820225982569434690f, 0.571410355678857340f, + -0.820664490168157460f, + 0.570780745886967370f, -0.821102514991104650f, 0.570150800319470300f, + -0.821540056780597610f, + 0.569520519346947250f, -0.821977115279241550f, 0.568889903340175970f, + -0.822413690229926390f, + 0.568258952670131490f, -0.822849781375826320f, 0.567627667707986230f, + -0.823285388460400110f, + 0.566996048825108680f, -0.823720511227391320f, 0.566364096393063950f, + -0.824155149420828570f, + 0.565731810783613230f, -0.824589302785025290f, 0.565099192368714090f, + -0.825022971064580220f, + 0.564466241520519500f, -0.825456154004377440f, 0.563832958611378170f, + -0.825888851349586780f, + 0.563199344013834090f, -0.826321062845663420f, 0.562565398100626560f, + -0.826752788238348520f, + 0.561931121244689470f, -0.827184027273669020f, 0.561296513819151470f, + -0.827614779697938400f, + 0.560661576197336030f, -0.828045045257755800f, 0.560026308752760380f, + -0.828474823700007130f, + 0.559390711859136140f, -0.828904114771864870f, 0.558754785890368310f, + -0.829332918220788250f, + 0.558118531220556100f, -0.829761233794523050f, 0.557481948223991660f, + -0.830189061241102370f, + 0.556845037275160100f, -0.830616400308846200f, 0.556207798748739930f, + -0.831043250746362320f, + 0.555570233019602290f, -0.831469612302545240f, 0.554932340462810370f, + -0.831895484726577590f, + 0.554294121453620110f, -0.832320867767929680f, 0.553655576367479310f, + -0.832745761176359460f, + 0.553016705580027580f, -0.833170164701913190f, 0.552377509467096070f, + -0.833594078094925140f, + 0.551737988404707450f, -0.834017501106018130f, 0.551098142769075430f, + -0.834440433486103190f, + 0.550457972936604810f, -0.834862874986380010f, 0.549817479283891020f, + -0.835284825358337370f, + 0.549176662187719770f, -0.835706284353752600f, 0.548535522025067390f, + -0.836127251724692160f, + 0.547894059173100190f, -0.836547727223511890f, 0.547252274009174090f, + -0.836967710602857020f, + 0.546610166910834860f, -0.837387201615661940f, 0.545967738255817680f, + -0.837806200015150940f, + 0.545324988422046460f, -0.838224705554837970f, 0.544681917787634530f, + -0.838642717988527300f, + 0.544038526730883930f, -0.839060237070312630f, 0.543394815630284800f, + -0.839477262554578550f, + 0.542750784864516000f, -0.839893794195999410f, 0.542106434812444030f, + -0.840309831749540770f, + 0.541461765853123560f, -0.840725374970458070f, 0.540816778365796670f, + -0.841140423614298080f, + 0.540171472729892970f, -0.841554977436898330f, 0.539525849325029010f, + -0.841969036194387680f, + 0.538879908531008420f, -0.842382599643185960f, 0.538233650727821700f, + -0.842795667540004120f, + 0.537587076295645510f, -0.843208239641845440f, 0.536940185614843020f, + -0.843620315706004040f, + 0.536292979065963180f, -0.844031895490066410f, 0.535645457029741090f, + -0.844442978751910660f, + 0.534997619887097260f, -0.844853565249707010f, 0.534349468019137520f, + -0.845263654741918220f, + 0.533701001807152960f, -0.845673246987299070f, 0.533052221632619670f, + -0.846082341744896940f, + 0.532403127877198010f, -0.846490938774052020f, 0.531753720922733320f, + -0.846899037834397350f, + 0.531104001151255000f, -0.847306638685858320f, 0.530453968944976320f, + -0.847713741088654270f, + 0.529803624686294830f, -0.848120344803297120f, 0.529152968757790720f, + -0.848526449590592650f, + 0.528502001542228480f, -0.848932055211639610f, 0.527850723422555460f, + -0.849337161427830670f, + 0.527199134781901390f, -0.849741768000852440f, 0.526547236003579330f, + -0.850145874692685210f, + 0.525895027471084740f, -0.850549481265603370f, 0.525242509568094710f, + -0.850952587482175730f, + 0.524589682678468840f, -0.851355193105265200f, 0.523936547186248600f, + -0.851757297898029120f, + 0.523283103475656430f, -0.852158901623919830f, 0.522629351931096720f, + -0.852560004046683970f, + 0.521975292937154390f, -0.852960604930363630f, 0.521320926878595550f, + -0.853360704039295430f, + 0.520666254140367270f, -0.853760301138111300f, 0.520011275107596040f, + -0.854159395991738730f, + 0.519355990165589530f, -0.854557988365400530f, 0.518700399699835170f, + -0.854956078024614820f, + 0.518044504095999340f, -0.855353664735196030f, 0.517388303739929060f, + -0.855750748263253920f, + 0.516731799017649980f, -0.856147328375194470f, 0.516074990315366630f, + -0.856543404837719960f, + 0.515417878019463150f, -0.856938977417828650f, 0.514760462516501200f, + -0.857334045882815590f, + 0.514102744193221660f, -0.857728610000272120f, 0.513444723436543570f, + -0.858122669538086020f, + 0.512786400633563070f, -0.858516224264442740f, 0.512127776171554690f, + -0.858909273947823900f, + 0.511468850437970520f, -0.859301818357008360f, 0.510809623820439040f, + -0.859693857261072610f, + 0.510150096706766700f, -0.860085390429390140f, 0.509490269484936360f, + -0.860476417631632070f, + 0.508830142543106990f, -0.860866938637767310f, 0.508169716269614710f, + -0.861256953218062060f, + 0.507508991052970870f, -0.861646461143081300f, 0.506847967281863320f, + -0.862035462183687210f, + 0.506186645345155450f, -0.862423956111040500f, 0.505525025631885510f, + -0.862811942696600330f, + 0.504863108531267480f, -0.863199421712124160f, 0.504200894432690560f, + -0.863586392929667990f, + 0.503538383725717580f, -0.863972856121586700f, 0.502875576800086880f, + -0.864358811060534030f, + 0.502212474045710900f, -0.864744257519462380f, 0.501549075852675390f, + -0.865129195271623690f, + 0.500885382611240940f, -0.865513624090568980f, 0.500221394711840680f, + -0.865897543750148820f, + 0.499557112545081890f, -0.866280954024512990f, 0.498892536501744750f, + -0.866663854688111020f, + 0.498227666972781870f, -0.867046245515692650f, 0.497562504349319090f, + -0.867428126282306920f, + 0.496897049022654640f, -0.867809496763303210f, 0.496231301384258310f, + -0.868190356734331310f, + 0.495565261825772490f, -0.868570705971340900f, 0.494898930739011310f, + -0.868950544250582380f, + 0.494232308515959730f, -0.869329871348606730f, 0.493565395548774880f, + -0.869708687042265560f, + 0.492898192229784090f, -0.870086991108711350f, 0.492230698951486080f, + -0.870464783325397670f, + 0.491562916106550060f, -0.870842063470078860f, 0.490894844087815140f, + -0.871218831320810900f, + 0.490226483288291100f, -0.871595086655951090f, 0.489557834101157550f, + -0.871970829254157700f, + 0.488888896919763230f, -0.872346058894391540f, 0.488219672137626740f, + -0.872720775355914300f, + 0.487550160148436050f, -0.873094978418290090f, 0.486880361346047400f, + -0.873468667861384880f, + 0.486210276124486530f, -0.873841843465366750f, 0.485539904877947020f, + -0.874214505010706300f, + 0.484869248000791120f, -0.874586652278176110f, 0.484198305887549140f, + -0.874958285048851540f, + 0.483527078932918740f, -0.875329403104110780f, 0.482855567531765670f, + -0.875700006225634600f, + 0.482183772079122830f, -0.876070094195406600f, 0.481511692970189920f, + -0.876439666795713610f, + 0.480839330600333900f, -0.876808723809145760f, 0.480166685365088440f, + -0.877177265018595940f, + 0.479493757660153010f, -0.877545290207261240f, 0.478820547881394050f, + -0.877912799158641730f, + 0.478147056424843120f, -0.878279791656541460f, 0.477473283686698060f, + -0.878646267485068130f, + 0.476799230063322250f, -0.879012226428633410f, 0.476124895951243630f, + -0.879377668271953180f, + 0.475450281747155870f, -0.879742592800047410f, 0.474775387847917230f, + -0.880106999798240360f, + 0.474100214650550020f, -0.880470889052160750f, 0.473424762552241530f, + -0.880834260347742040f, + 0.472749031950342900f, -0.881197113471221980f, 0.472073023242368660f, + -0.881559448209143780f, + 0.471396736825997810f, -0.881921264348354940f, 0.470720173099071710f, + -0.882282561676008600f, + 0.470043332459595620f, -0.882643339979562790f, 0.469366215305737630f, + -0.883003599046780720f, + 0.468688822035827960f, -0.883363338665731580f, 0.468011153048359830f, + -0.883722558624789660f, + 0.467333208741988530f, -0.884081258712634990f, 0.466654989515530970f, + -0.884439438718253700f, + 0.465976495767966130f, -0.884797098430937790f, 0.465297727898434650f, + -0.885154237640285110f, + 0.464618686306237820f, -0.885510856136199950f, 0.463939371390838460f, + -0.885866953708892790f, + 0.463259783551860260f, -0.886222530148880640f, 0.462579923189086810f, + -0.886577585246987040f, + 0.461899790702462840f, -0.886932118794342080f, 0.461219386492092430f, + -0.887286130582383150f, + 0.460538710958240010f, -0.887639620402853930f, 0.459857764501329650f, + -0.887992588047805560f, + 0.459176547521944150f, -0.888345033309596240f, 0.458495060420826220f, + -0.888696955980891710f, + 0.457813303598877290f, -0.889048355854664570f, 0.457131277457156980f, + -0.889399232724195520f, + 0.456448982396883860f, -0.889749586383072890f, 0.455766418819434750f, + -0.890099416625192210f, + 0.455083587126343840f, -0.890448723244757880f, 0.454400487719303750f, + -0.890797506036281490f, + 0.453717121000163930f, -0.891145764794583180f, 0.453033487370931580f, + -0.891493499314791380f, + 0.452349587233771000f, -0.891840709392342720f, 0.451665420991002540f, + -0.892187394822982480f, + 0.450980989045103810f, -0.892533555402764690f, 0.450296291798708730f, + -0.892879190928051680f, + 0.449611329654606600f, -0.893224301195515320f, 0.448926103015743260f, + -0.893568886002136020f, + 0.448240612285220000f, -0.893912945145203250f, 0.447554857866293010f, + -0.894256478422316040f, + 0.446868840162374330f, -0.894599485631382580f, 0.446182559577030120f, + -0.894941966570620750f, + 0.445496016513981740f, -0.895283921038557580f, 0.444809211377105000f, + -0.895625348834030000f, + 0.444122144570429260f, -0.895966249756185110f, 0.443434816498138430f, + -0.896306623604479660f, + 0.442747227564570130f, -0.896646470178680150f, 0.442059378174214760f, + -0.896985789278863970f, + 0.441371268731716620f, -0.897324580705418320f, 0.440682899641873020f, + -0.897662844259040750f, + 0.439994271309633260f, -0.898000579740739880f, 0.439305384140100060f, + -0.898337786951834190f, + 0.438616238538527710f, -0.898674465693953820f, 0.437926834910322860f, + -0.899010615769039070f, + 0.437237173661044200f, -0.899346236979341460f, 0.436547255196401250f, + -0.899681329127423930f, + 0.435857079922255470f, -0.900015892016160280f, 0.435166648244619370f, + -0.900349925448735600f, + 0.434475960569655710f, -0.900683429228646860f, 0.433785017303678520f, + -0.901016403159702330f, + 0.433093818853152010f, -0.901348847046022030f, 0.432402365624690140f, + -0.901680760692037730f, + 0.431710658025057370f, -0.902012143902493070f, 0.431018696461167080f, + -0.902342996482444200f, + 0.430326481340082610f, -0.902673318237258830f, 0.429634013069016500f, + -0.903003108972617040f, + 0.428941292055329550f, -0.903332368494511820f, 0.428248318706531910f, + -0.903661096609247980f, + 0.427555093430282200f, -0.903989293123443340f, 0.426861616634386490f, + -0.904316957844028320f, + 0.426167888726799620f, -0.904644090578246240f, 0.425473910115623910f, + -0.904970691133653250f, + 0.424779681209108810f, -0.905296759318118820f, 0.424085202415651670f, + -0.905622294939825160f, + 0.423390474143796100f, -0.905947297807268460f, 0.422695496802232950f, + -0.906271767729257660f, + 0.422000270799799790f, -0.906595704514915330f, 0.421304796545479700f, + -0.906919107973678030f, + 0.420609074448402510f, -0.907241977915295930f, 0.419913104917843730f, + -0.907564314149832520f, + 0.419216888363223960f, -0.907886116487666150f, 0.418520425194109700f, + -0.908207384739488700f, + 0.417823715820212380f, -0.908528118716306120f, 0.417126760651387870f, + -0.908848318229439120f, + 0.416429560097637320f, -0.909167983090522270f, 0.415732114569105420f, + -0.909487113111505430f, + 0.415034424476081630f, -0.909805708104652220f, 0.414336490228999210f, + -0.910123767882541570f, + 0.413638312238434560f, -0.910441292258067140f, 0.412939890915108020f, + -0.910758281044437570f, + 0.412241226669883000f, -0.911074734055176250f, 0.411542319913765280f, + -0.911390651104122320f, + 0.410843171057903910f, -0.911706032005429880f, 0.410143780513590350f, + -0.912020876573568230f, + 0.409444148692257590f, -0.912335184623322750f, 0.408744276005481520f, + -0.912648955969793900f, + 0.408044162864978740f, -0.912962190428398100f, 0.407343809682607970f, + -0.913274887814867760f, + 0.406643216870369140f, -0.913587047945250810f, 0.405942384840402570f, + -0.913898670635911680f, + 0.405241314004989860f, -0.914209755703530690f, 0.404540004776553110f, + -0.914520302965104450f, + 0.403838457567654130f, -0.914830312237946090f, 0.403136672790995240f, + -0.915139783339685260f, + 0.402434650859418540f, -0.915448716088267830f, 0.401732392185905010f, + -0.915757110301956720f, + 0.401029897183575790f, -0.916064965799331610f, 0.400327166265690150f, + -0.916372282399289140f, + 0.399624199845646790f, -0.916679059921042700f, 0.398920998336983020f, + -0.916985298184122890f, + 0.398217562153373620f, -0.917290997008377910f, 0.397513891708632330f, + -0.917596156213972950f, + 0.396809987416710420f, -0.917900775621390390f, 0.396105849691696320f, + -0.918204855051430900f, + 0.395401478947816300f, -0.918508394325212250f, 0.394696875599433670f, + -0.918811393264169940f, + 0.393992040061048100f, -0.919113851690057770f, 0.393286972747296570f, + -0.919415769424946960f, + 0.392581674072951530f, -0.919717146291227360f, 0.391876144452922350f, + -0.920017982111606570f, + 0.391170384302253980f, -0.920318276709110480f, 0.390464394036126650f, + -0.920618029907083860f, + 0.389758174069856410f, -0.920917241529189520f, 0.389051724818894500f, + -0.921215911399408730f, + 0.388345046698826300f, -0.921514039342041900f, 0.387638140125372680f, + -0.921811625181708120f, + 0.386931005514388690f, -0.922108668743345070f, 0.386223643281862980f, + -0.922405169852209880f, + 0.385516053843919020f, -0.922701128333878520f, 0.384808237616812930f, + -0.922996544014246250f, + 0.384100195016935040f, -0.923291416719527640f, 0.383391926460808770f, + -0.923585746276256560f, + 0.382683432365089840f, -0.923879532511286740f, 0.381974713146567220f, + -0.924172775251791200f, + 0.381265769222162490f, -0.924465474325262600f, 0.380556601008928570f, + -0.924757629559513910f, + 0.379847208924051110f, -0.925049240782677580f, 0.379137593384847430f, + -0.925340307823206200f, + 0.378427754808765620f, -0.925630830509872720f, 0.377717693613385810f, + -0.925920808671769960f, + 0.377007410216418310f, -0.926210242138311270f, 0.376296905035704790f, + -0.926499130739230510f, + 0.375586178489217330f, -0.926787474304581750f, 0.374875230995057600f, + -0.927075272664740100f, + 0.374164062971457990f, -0.927362525650401110f, 0.373452674836780410f, + -0.927649233092581180f, + 0.372741067009515810f, -0.927935394822617890f, 0.372029239908284960f, + -0.928221010672169440f, + 0.371317193951837600f, -0.928506080473215480f, 0.370604929559051670f, + -0.928790604058057020f, + 0.369892447148934270f, -0.929074581259315750f, 0.369179747140620070f, + -0.929358011909935500f, + 0.368466829953372320f, -0.929640895843181330f, 0.367753696006582090f, + -0.929923232892639560f, + 0.367040345719767240f, -0.930205022892219070f, 0.366326779512573590f, + -0.930486265676149780f, + 0.365612997804773960f, -0.930766961078983710f, 0.364899001016267380f, + -0.931047108935595170f, + 0.364184789567079840f, -0.931326709081180430f, 0.363470363877363870f, + -0.931605761351257830f, + 0.362755724367397230f, -0.931884265581668150f, 0.362040871457584350f, + -0.932162221608574320f, + 0.361325805568454340f, -0.932439629268462360f, 0.360610527120662270f, + -0.932716488398140250f, + 0.359895036534988280f, -0.932992798834738850f, 0.359179334232336560f, + -0.933268560415712050f, + 0.358463420633736540f, -0.933543772978836170f, 0.357747296160342010f, + -0.933818436362210960f, + 0.357030961233430030f, -0.934092550404258870f, 0.356314416274402360f, + -0.934366114943725900f, + 0.355597661704783960f, -0.934639129819680780f, 0.354880697946222790f, + -0.934911594871516090f, + 0.354163525420490510f, -0.935183509938947500f, 0.353446144549480870f, + -0.935454874862014620f, + 0.352728555755210730f, -0.935725689481080370f, 0.352010759459819240f, + -0.935995953636831300f, + 0.351292756085567150f, -0.936265667170278260f, 0.350574546054837570f, + -0.936534829922755500f, + 0.349856129790135030f, -0.936803441735921560f, 0.349137507714085030f, + -0.937071502451759190f, + 0.348418680249434510f, -0.937339011912574960f, 0.347699647819051490f, + -0.937605969960999990f, + 0.346980410845923680f, -0.937872376439989890f, 0.346260969753160170f, + -0.938138231192824360f, + 0.345541324963989150f, -0.938403534063108060f, 0.344821476901759290f, + -0.938668284894770170f, + 0.344101425989938980f, -0.938932483532064490f, 0.343381172652115100f, + -0.939196129819569900f, + 0.342660717311994380f, -0.939459223602189920f, 0.341940060393402300f, + -0.939721764725153340f, + 0.341219202320282410f, -0.939983753034013940f, 0.340498143516697100f, + -0.940245188374650880f, + 0.339776884406826960f, -0.940506070593268300f, 0.339055425414969640f, + -0.940766399536396070f, + 0.338333766965541290f, -0.941026175050889260f, 0.337611909483074680f, + -0.941285396983928660f, + 0.336889853392220050f, -0.941544065183020810f, 0.336167599117744690f, + -0.941802179495997650f, + 0.335445147084531660f, -0.942059739771017310f, 0.334722497717581220f, + -0.942316745856563780f, + 0.333999651442009490f, -0.942573197601446870f, 0.333276608683047980f, + -0.942829094854802710f, + 0.332553369866044220f, -0.943084437466093490f, 0.331829935416461220f, + -0.943339225285107720f, + 0.331106305759876430f, -0.943593458161960390f, 0.330382481321982950f, + -0.943847135947092690f, + 0.329658462528587550f, -0.944100258491272660f, 0.328934249805612200f, + -0.944352825645594750f, + 0.328209843579092660f, -0.944604837261480260f, 0.327485244275178060f, + -0.944856293190677210f, + 0.326760452320131790f, -0.945107193285260610f, 0.326035468140330350f, + -0.945357537397632290f, + 0.325310292162262980f, -0.945607325380521280f, 0.324584924812532150f, + -0.945856557086983910f, + 0.323859366517852960f, -0.946105232370403340f, 0.323133617705052330f, + -0.946353351084490590f, + 0.322407678801070020f, -0.946600913083283530f, 0.321681550232956640f, + -0.946847918221148000f, + 0.320955232427875210f, -0.947094366352777220f, 0.320228725813100020f, + -0.947340257333191940f, + 0.319502030816015750f, -0.947585591017741090f, 0.318775147864118480f, + -0.947830367262101010f, + 0.318048077385015060f, -0.948074585922276230f, 0.317320819806421790f, + -0.948318246854599090f, + 0.316593375556165850f, -0.948561349915730270f, 0.315865745062184070f, + -0.948803894962658380f, + 0.315137928752522440f, -0.949045881852700560f, 0.314409927055336820f, + -0.949287310443502010f, + 0.313681740398891570f, -0.949528180593036670f, 0.312953369211560200f, + -0.949768492159606680f, + 0.312224813921825050f, -0.950008245001843000f, 0.311496074958275970f, + -0.950247438978705230f, + 0.310767152749611470f, -0.950486073949481700f, 0.310038047724638000f, + -0.950724149773789610f, + 0.309308760312268780f, -0.950961666311575080f, 0.308579290941525030f, + -0.951198623423113230f, + 0.307849640041534980f, -0.951435020969008340f, 0.307119808041533100f, + -0.951670858810193860f, + 0.306389795370861080f, -0.951906136807932230f, 0.305659602458966230f, + -0.952140854823815830f, + 0.304929229735402430f, -0.952375012719765880f, 0.304198677629829270f, + -0.952608610358033240f, + 0.303467946572011370f, -0.952841647601198720f, 0.302737036991819140f, + -0.953074124312172200f, + 0.302005949319228200f, -0.953306040354193750f, 0.301274683984318000f, + -0.953537395590833280f, + 0.300543241417273400f, -0.953768189885990330f, 0.299811622048383460f, + -0.953998423103894490f, + 0.299079826308040480f, -0.954228095109105670f, 0.298347854626741570f, + -0.954457205766513490f, + 0.297615707435086310f, -0.954685754941338340f, 0.296883385163778270f, + -0.954913742499130520f, + 0.296150888243623960f, -0.955141168305770670f, 0.295418217105532070f, + -0.955368032227470240f, + 0.294685372180514330f, -0.955594334130771110f, 0.293952353899684770f, + -0.955820073882545420f, + 0.293219162694258680f, -0.956045251349996410f, 0.292485798995553830f, + -0.956269866400658140f, + 0.291752263234989370f, -0.956493918902394990f, 0.291018555844085090f, + -0.956717408723403050f, + 0.290284677254462330f, -0.956940335732208940f, 0.289550627897843140f, + -0.957162699797670100f, + 0.288816408206049480f, -0.957384500788975860f, 0.288082018611004300f, + -0.957605738575646240f, + 0.287347459544729570f, -0.957826413027532910f, 0.286612731439347790f, + -0.958046524014818600f, + 0.285877834727080730f, -0.958266071408017670f, 0.285142769840248720f, + -0.958485055077976100f, + 0.284407537211271820f, -0.958703474895871600f, 0.283672137272668550f, + -0.958921330733213060f, + 0.282936570457055390f, -0.959138622461841890f, 0.282200837197147500f, + -0.959355349953930790f, + 0.281464937925758050f, -0.959571513081984520f, 0.280728873075797190f, + -0.959787111718839900f, + 0.279992643080273380f, -0.960002145737665850f, 0.279256248372291240f, + -0.960216615011963430f, + 0.278519689385053060f, -0.960430519415565790f, 0.277782966551857800f, + -0.960643858822638470f, + 0.277046080306099950f, -0.960856633107679660f, 0.276309031081271030f, + -0.961068842145519350f, + 0.275571819310958250f, -0.961280485811320640f, 0.274834445428843940f, + -0.961491563980579000f, + 0.274096909868706330f, -0.961702076529122540f, 0.273359213064418790f, + -0.961912023333112100f, + 0.272621355449948980f, -0.962121404269041580f, 0.271883337459359890f, + -0.962330219213737400f, + 0.271145159526808070f, -0.962538468044359160f, 0.270406822086544820f, + -0.962746150638399410f, + 0.269668325572915200f, -0.962953266873683880f, 0.268929670420357310f, + -0.963159816628371360f, + 0.268190857063403180f, -0.963365799780954050f, 0.267451885936677740f, + -0.963571216210257210f, + 0.266712757474898420f, -0.963776065795439840f, 0.265973472112875530f, + -0.963980348415994110f, + 0.265234030285511900f, -0.964184063951745720f, 0.264494432427801630f, + -0.964387212282854290f, + 0.263754678974831510f, -0.964589793289812650f, 0.263014770361779060f, + -0.964791806853447900f, + 0.262274707023913590f, -0.964993252854920320f, 0.261534489396595630f, + -0.965194131175724720f, + 0.260794117915275570f, -0.965394441697689400f, 0.260053593015495130f, + -0.965594184302976830f, + 0.259312915132886350f, -0.965793358874083570f, 0.258572084703170390f, + -0.965991965293840570f, + 0.257831102162158930f, -0.966190003445412620f, 0.257089967945753230f, + -0.966387473212298790f, + 0.256348682489942910f, -0.966584374478333120f, 0.255607246230807550f, + -0.966780707127683270f, + 0.254865659604514630f, -0.966976471044852070f, 0.254123923047320620f, + -0.967171666114676640f, + 0.253382036995570270f, -0.967366292222328510f, 0.252640001885695580f, + -0.967560349253314360f, + 0.251897818154216910f, -0.967753837093475510f, 0.251155486237742030f, + -0.967946755628987800f, + 0.250413006572965280f, -0.968139104746362330f, 0.249670379596668520f, + -0.968330884332445300f, + 0.248927605745720260f, -0.968522094274417270f, 0.248184685457074780f, + -0.968712734459794780f, + 0.247441619167773440f, -0.968902804776428870f, 0.246698407314942500f, + -0.969092305112506100f, + 0.245955050335794590f, -0.969281235356548530f, 0.245211548667627680f, + -0.969469595397412950f, + 0.244467902747824210f, -0.969657385124292450f, 0.243724113013852130f, + -0.969844604426714830f, + 0.242980179903263980f, -0.970031253194543970f, 0.242236103853696070f, + -0.970217331317979160f, + 0.241491885302869300f, -0.970402838687555500f, 0.240747524688588540f, + -0.970587775194143630f, + 0.240003022448741500f, -0.970772140728950350f, 0.239258379021300120f, + -0.970955935183517970f, + 0.238513594844318500f, -0.971139158449725090f, 0.237768670355934210f, + -0.971321810419786160f, + 0.237023605994367340f, -0.971503890986251780f, 0.236278402197919620f, + -0.971685400042008540f, + 0.235533059404975460f, -0.971866337480279400f, 0.234787578054001080f, + -0.972046703194623500f, + 0.234041958583543460f, -0.972226497078936270f, 0.233296201432231560f, + -0.972405719027449770f, + 0.232550307038775330f, -0.972584368934732210f, 0.231804275841964780f, + -0.972762446695688570f, + 0.231058108280671280f, -0.972939952205560070f, 0.230311804793845530f, + -0.973116885359925130f, + 0.229565365820518870f, -0.973293246054698250f, 0.228818791799802360f, + -0.973469034186130950f, + 0.228072083170885790f, -0.973644249650811870f, 0.227325240373038830f, + -0.973818892345666100f, + 0.226578263845610110f, -0.973992962167955830f, 0.225831154028026200f, + -0.974166459015280320f, + 0.225083911359792780f, -0.974339382785575860f, 0.224336536280493690f, + -0.974511733377115720f, + 0.223589029229790020f, -0.974683510688510670f, 0.222841390647421280f, + -0.974854714618708430f, + 0.222093620973203590f, -0.975025345066994120f, 0.221345720647030810f, + -0.975195401932990370f, + 0.220597690108873650f, -0.975364885116656870f, 0.219849529798778750f, + -0.975533794518291360f, + 0.219101240156869770f, -0.975702130038528570f, 0.218352821623346430f, + -0.975869891578341030f, + 0.217604274638483670f, -0.976037079039039020f, 0.216855599642632570f, + -0.976203692322270560f, + 0.216106797076219600f, -0.976369731330021140f, 0.215357867379745550f, + -0.976535195964614470f, + 0.214608810993786920f, -0.976700086128711840f, 0.213859628358993830f, + -0.976864401725312640f, + 0.213110319916091360f, -0.977028142657754390f, 0.212360886105878580f, + -0.977191308829712280f, + 0.211611327369227610f, -0.977353900145199960f, 0.210861644147084830f, + -0.977515916508569280f, + 0.210111836880469720f, -0.977677357824509930f, 0.209361906010474190f, + -0.977838223998050430f, + 0.208611851978263460f, -0.977998514934557140f, 0.207861675225075150f, + -0.978158230539735050f, + 0.207111376192218560f, -0.978317370719627650f, 0.206360955321075680f, + -0.978475935380616830f, + 0.205610413053099320f, -0.978633924429423100f, 0.204859749829814420f, + -0.978791337773105670f, + 0.204108966092817010f, -0.978948175319062200f, 0.203358062283773370f, + -0.979104436975029250f, + 0.202607038844421110f, -0.979260122649082020f, 0.201855896216568160f, + -0.979415232249634780f, + 0.201104634842091960f, -0.979569765685440520f, 0.200353255162940420f, + -0.979723722865591170f, + 0.199601757621131050f, -0.979877103699517640f, 0.198850142658750120f, + -0.980029908096989980f, + 0.198098410717953730f, -0.980182135968117320f, 0.197346562240966000f, + -0.980333787223347960f, + 0.196594597670080220f, -0.980484861773469380f, 0.195842517447657990f, + -0.980635359529608120f, + 0.195090322016128330f, -0.980785280403230430f, 0.194338011817988600f, + -0.980934624306141640f, + 0.193585587295803750f, -0.981083391150486590f, 0.192833048892205290f, + -0.981231580848749730f, + 0.192080397049892380f, -0.981379193313754560f, 0.191327632211630990f, + -0.981526228458664660f, + 0.190574754820252800f, -0.981672686196983110f, 0.189821765318656580f, + -0.981818566442552500f, + 0.189068664149806280f, -0.981963869109555240f, 0.188315451756732120f, + -0.982108594112513610f, + 0.187562128582529740f, -0.982252741366289370f, 0.186808695070359330f, + -0.982396310786084690f, + 0.186055151663446630f, -0.982539302287441240f, 0.185301498805082040f, + -0.982681715786240860f, + 0.184547736938619640f, -0.982823551198705240f, 0.183793866507478390f, + -0.982964808441396440f, + 0.183039887955141060f, -0.983105487431216290f, 0.182285801725153320f, + -0.983245588085407070f, + 0.181531608261125130f, -0.983385110321551180f, 0.180777308006728670f, + -0.983524054057571260f, + 0.180022901405699510f, -0.983662419211730250f, 0.179268388901835880f, + -0.983800205702631490f, + 0.178513770938997590f, -0.983937413449218920f, 0.177759047961107140f, + -0.984074042370776450f, + 0.177004220412148860f, -0.984210092386929030f, 0.176249288736167940f, + -0.984345563417641900f, + 0.175494253377271400f, -0.984480455383220930f, 0.174739114779627310f, + -0.984614768204312600f, + 0.173983873387463850f, -0.984748501801904210f, 0.173228529645070490f, + -0.984881656097323700f, + 0.172473083996796030f, -0.985014231012239840f, 0.171717536887049970f, + -0.985146226468662230f, + 0.170961888760301360f, -0.985277642388941220f, 0.170206140061078120f, + -0.985408478695768420f, + 0.169450291233967930f, -0.985538735312176060f, 0.168694342723617440f, + -0.985668412161537550f, + 0.167938294974731230f, -0.985797509167567370f, 0.167182148432072880f, + -0.985926026254321130f, + 0.166425903540464220f, -0.986053963346195440f, 0.165669560744784140f, + -0.986181320367928270f, + 0.164913120489970090f, -0.986308097244598670f, 0.164156583221015890f, + -0.986434293901627070f, + 0.163399949382973230f, -0.986559910264775410f, 0.162643219420950450f, + -0.986684946260146690f, + 0.161886393780111910f, -0.986809401814185420f, 0.161129472905678780f, + -0.986933276853677710f, + 0.160372457242928400f, -0.987056571305750970f, 0.159615347237193090f, + -0.987179285097874340f, + 0.158858143333861390f, -0.987301418157858430f, 0.158100845978377090f, + -0.987422970413855410f, + 0.157343455616238280f, -0.987543941794359230f, 0.156585972692998590f, + -0.987664332228205710f, + 0.155828397654265320f, -0.987784141644572180f, 0.155070730945700510f, + -0.987903369972977790f, + 0.154312973013020240f, -0.988022017143283530f, 0.153555124301993500f, + -0.988140083085692570f, + 0.152797185258443410f, -0.988257567730749460f, 0.152039156328246160f, + -0.988374471009341280f, + 0.151281037957330250f, -0.988490792852696590f, 0.150522830591677370f, + -0.988606533192386450f, + 0.149764534677321620f, -0.988721691960323780f, 0.149006150660348470f, + -0.988836269088763540f, + 0.148247678986896200f, -0.988950264510302990f, 0.147489120103153680f, + -0.989063678157881540f, + 0.146730474455361750f, -0.989176509964781010f, 0.145971742489812370f, + -0.989288759864625170f, + 0.145212924652847520f, -0.989400427791380380f, 0.144454021390860440f, + -0.989511513679355190f, + 0.143695033150294580f, -0.989622017463200780f, 0.142935960377642700f, + -0.989731939077910570f, + 0.142176803519448000f, -0.989841278458820530f, 0.141417563022303130f, + -0.989950035541608990f, + 0.140658239332849240f, -0.990058210262297120f, 0.139898832897777380f, + -0.990165802557248400f, + 0.139139344163826280f, -0.990272812363169110f, 0.138379773577783890f, + -0.990379239617108160f, + 0.137620121586486180f, -0.990485084256456980f, 0.136860388636816430f, + -0.990590346218950150f, + 0.136100575175706200f, -0.990695025442664630f, 0.135340681650134330f, + -0.990799121866020370f, + 0.134580708507126220f, -0.990902635427780010f, 0.133820656193754690f, + -0.991005566067049370f, + 0.133060525157139180f, -0.991107913723276780f, 0.132300315844444680f, + -0.991209678336254060f, + 0.131540028702883280f, -0.991310859846115440f, 0.130779664179711790f, + -0.991411458193338540f, + 0.130019222722233350f, -0.991511473318743900f, 0.129258704777796270f, + -0.991610905163495370f, + 0.128498110793793220f, -0.991709753669099530f, 0.127737441217662280f, + -0.991808018777406430f, + 0.126976696496885980f, -0.991905700430609330f, 0.126215877078990400f, + -0.992002798571244520f, + 0.125454983411546210f, -0.992099313142191800f, 0.124694015942167770f, + -0.992195244086673920f, + 0.123932975118512200f, -0.992290591348257370f, 0.123171861388280650f, + -0.992385354870851670f, + 0.122410675199216280f, -0.992479534598709970f, 0.121649416999105540f, + -0.992573130476428810f, + 0.120888087235777220f, -0.992666142448948020f, 0.120126686357101580f, + -0.992758570461551140f, + 0.119365214810991350f, -0.992850414459865100f, 0.118603673045400840f, + -0.992941674389860470f, + 0.117842061508325020f, -0.993032350197851410f, 0.117080380647800550f, + -0.993122441830495580f, + 0.116318630911904880f, -0.993211949234794500f, 0.115556812748755290f, + -0.993300872358093280f, + 0.114794926606510250f, -0.993389211148080650f, 0.114032972933367300f, + -0.993476965552789190f, + 0.113270952177564360f, -0.993564135520595300f, 0.112508864787378830f, + -0.993650721000219120f, + 0.111746711211126660f, -0.993736721940724600f, 0.110984491897163380f, + -0.993822138291519660f, + 0.110222207293883180f, -0.993906970002356060f, 0.109459857849718030f, + -0.993991217023329380f, + 0.108697444013138670f, -0.994074879304879370f, 0.107934966232653760f, + -0.994157956797789730f, + 0.107172424956808870f, -0.994240449453187900f, 0.106409820634187840f, + -0.994322357222545810f, + 0.105647153713410700f, -0.994403680057679100f, 0.104884424643134970f, + -0.994484417910747600f, + 0.104121633872054730f, -0.994564570734255420f, 0.103358781848899700f, + -0.994644138481050710f, + 0.102595869022436280f, -0.994723121104325700f, 0.101832895841466670f, + -0.994801518557617110f, + 0.101069862754827880f, -0.994879330794805620f, 0.100306770211392820f, + -0.994956557770116380f, + 0.099543618660069444f, -0.995033199438118630f, 0.098780408549799664f, + -0.995109255753726110f, + 0.098017140329560770f, -0.995184726672196820f, 0.097253814448363354f, + -0.995259612149133390f, + 0.096490431355252607f, -0.995333912140482280f, 0.095726991499307315f, + -0.995407626602534900f, + 0.094963495329639061f, -0.995480755491926940f, 0.094199943295393190f, + -0.995553298765638470f, + 0.093436335845747912f, -0.995625256380994310f, 0.092672673429913366f, + -0.995696628295663520f, + 0.091908956497132696f, -0.995767414467659820f, 0.091145185496681130f, + -0.995837614855341610f, + 0.090381360877865011f, -0.995907229417411720f, 0.089617483090022917f, + -0.995976258112917790f, + 0.088853552582524684f, -0.996044700901251970f, 0.088089569804770507f, + -0.996112557742151130f, + 0.087325535206192226f, -0.996179828595696870f, 0.086561449236251239f, + -0.996246513422315520f, + 0.085797312344439880f, -0.996312612182778000f, 0.085033124980280414f, + -0.996378124838200210f, + 0.084268887593324127f, -0.996443051350042630f, 0.083504600633152404f, + -0.996507391680110820f, + 0.082740264549375803f, -0.996571145790554840f, 0.081975879791633108f, + -0.996634313643869900f, + 0.081211446809592386f, -0.996696895202896060f, 0.080446966052950097f, + -0.996758890430818000f, + 0.079682437971430126f, -0.996820299291165670f, 0.078917863014785095f, + -0.996881121747813850f, + 0.078153241632794315f, -0.996941357764982160f, 0.077388574275265049f, + -0.997001007307235290f, + 0.076623861392031617f, -0.997060070339482960f, 0.075859103432954503f, + -0.997118546826979980f, + 0.075094300847921291f, -0.997176436735326190f, 0.074329454086845867f, + -0.997233740030466160f, + 0.073564563599667454f, -0.997290456678690210f, 0.072799629836351618f, + -0.997346586646633230f, + 0.072034653246889416f, -0.997402129901275300f, 0.071269634281296415f, + -0.997457086409941910f, + 0.070504573389614009f, -0.997511456140303450f, 0.069739471021907376f, + -0.997565239060375750f, + 0.068974327628266732f, -0.997618435138519550f, 0.068209143658806454f, + -0.997671044343441000f, + 0.067443919563664106f, -0.997723066644191640f, 0.066678655793001543f, + -0.997774502010167820f, + 0.065913352797003930f, -0.997825350411111640f, 0.065148011025878860f, + -0.997875611817110150f, + 0.064382630929857410f, -0.997925286198596000f, 0.063617212959193190f, + -0.997974373526346990f, + 0.062851757564161420f, -0.998022873771486240f, 0.062086265195060247f, + -0.998070786905482340f, + 0.061320736302208648f, -0.998118112900149180f, 0.060555171335947781f, + -0.998164851727646240f, + 0.059789570746640007f, -0.998211003360478190f, 0.059023934984667986f, + -0.998256567771495180f, + 0.058258264500435732f, -0.998301544933892890f, 0.057492559744367684f, + -0.998345934821212370f, + 0.056726821166907783f, -0.998389737407340160f, 0.055961049218520520f, + -0.998432952666508440f, + 0.055195244349690031f, -0.998475580573294770f, 0.054429407010919147f, + -0.998517621102622210f, + 0.053663537652730679f, -0.998559074229759310f, 0.052897636725665401f, + -0.998599939930320370f, + 0.052131704680283317f, -0.998640218180265270f, 0.051365741967162731f, + -0.998679908955899090f, + 0.050599749036899337f, -0.998719012233872940f, 0.049833726340107257f, + -0.998757527991183340f, + 0.049067674327418126f, -0.998795456205172410f, 0.048301593449480172f, + -0.998832796853527990f, + 0.047535484156959261f, -0.998869549914283560f, 0.046769346900537960f, + -0.998905715365818290f, + 0.046003182130914644f, -0.998941293186856870f, 0.045236990298804750f, + -0.998976283356469820f, + 0.044470771854938744f, -0.999010685854073380f, 0.043704527250063421f, + -0.999044500659429290f, + 0.042938256934940959f, -0.999077727752645360f, 0.042171961360348002f, + -0.999110367114174890f, + 0.041405640977076712f, -0.999142418724816910f, 0.040639296235933854f, + -0.999173882565716380f, + 0.039872927587739845f, -0.999204758618363890f, 0.039106535483329839f, + -0.999235046864595850f, + 0.038340120373552791f, -0.999264747286594420f, 0.037573682709270514f, + -0.999293859866887790f, + 0.036807222941358991f, -0.999322384588349540f, 0.036040741520706299f, + -0.999350321434199440f, + 0.035274238898213947f, -0.999377670388002850f, 0.034507715524795889f, + -0.999404431433671300f, + 0.033741171851377642f, -0.999430604555461730f, 0.032974608328897315f, + -0.999456189737977340f, + 0.032208025408304704f, -0.999481186966166950f, 0.031441423540560343f, + -0.999505596225325310f, + 0.030674803176636581f, -0.999529417501093140f, 0.029908164767516655f, + -0.999552650779456990f, + 0.029141508764193740f, -0.999575296046749220f, 0.028374835617672258f, + -0.999597353289648380f, + 0.027608145778965820f, -0.999618822495178640f, 0.026841439699098527f, + -0.999639703650710200f, + 0.026074717829104040f, -0.999659996743959220f, 0.025307980620024630f, + -0.999679701762987930f, + 0.024541228522912264f, -0.999698818696204250f, 0.023774461988827676f, + -0.999717347532362190f, + 0.023007681468839410f, -0.999735288260561680f, 0.022240887414024919f, + -0.999752640870248840f, + 0.021474080275469605f, -0.999769405351215280f, 0.020707260504265912f, + -0.999785581693599210f, + 0.019940428551514598f, -0.999801169887884260f, 0.019173584868322699f, + -0.999816169924900410f, + 0.018406729905804820f, -0.999830581795823400f, 0.017639864115082195f, + -0.999844405492175240f, + 0.016872987947281773f, -0.999857641005823860f, 0.016106101853537263f, + -0.999870288328982950f, + 0.015339206284988220f, -0.999882347454212560f, 0.014572301692779104f, + -0.999893818374418490f, + 0.013805388528060349f, -0.999904701082852900f, 0.013038467241987433f, + -0.999914995573113470f, + 0.012271538285719944f, -0.999924701839144500f, 0.011504602110422875f, + -0.999933819875236000f, + 0.010737659167264572f, -0.999942349676023910f, 0.009970709907418029f, + -0.999950291236490480f, + 0.009203754782059960f, -0.999957644551963900f, 0.008436794242369860f, + -0.999964409618118280f, + 0.007669828739531077f, -0.999970586430974140f, 0.006902858724729877f, + -0.999976174986897610f, + 0.006135884649154515f, -0.999981175282601110f, 0.005368906963996303f, + -0.999985587315143200f, + 0.004601926120448672f, -0.999989411081928400f, 0.003834942569706248f, + -0.999992646580707190f, + 0.003067956762966138f, -0.999995293809576190f, 0.002300969151425887f, + -0.999997352766978210f, + 0.001533980186284766f, -0.999998823451701880f, 0.000766990318742846f, + -0.999999705862882230f +}; + const float32_t cos_factors_2048[2048] = { + 0.999999926465717890f, 0.999999338191525530f, 0.999998161643486980f, + 0.999996396822294350f, + 0.999994043728985820f, 0.999991102364945590f, 0.999987572731904080f, + 0.999983454831937730f, + 0.999978748667468830f, 0.999973454241265940f, 0.999967571556443780f, + 0.999961100616462820f, + 0.999954041425129780f, 0.999946393986597460f, 0.999938158305364590f, + 0.999929334386276070f, + 0.999919922234522750f, 0.999909921855641540f, 0.999899333255515390f, + 0.999888156440373320f, + 0.999876391416790410f, 0.999864038191687680f, 0.999851096772332190f, + 0.999837567166337090f, + 0.999823449381661570f, 0.999808743426610520f, 0.999793449309835270f, + 0.999777567040332940f, + 0.999761096627446610f, 0.999744038080865430f, 0.999726391410624470f, + 0.999708156627104880f, + 0.999689333741033640f, 0.999669922763483760f, 0.999649923705874240f, + 0.999629336579970110f, + 0.999608161397882110f, 0.999586398172067070f, 0.999564046915327740f, + 0.999541107640812940f, + 0.999517580362016990f, 0.999493465092780590f, 0.999468761847290050f, + 0.999443470640077770f, + 0.999417591486021720f, 0.999391124400346050f, 0.999364069398620550f, + 0.999336426496761240f, + 0.999308195711029470f, 0.999279377058032710f, 0.999249970554724420f, + 0.999219976218403530f, + 0.999189394066714920f, 0.999158224117649430f, 0.999126466389543390f, + 0.999094120901079070f, + 0.999061187671284600f, 0.999027666719533690f, 0.998993558065545680f, + 0.998958861729386080f, + 0.998923577731465780f, 0.998887706092541290f, 0.998851246833715180f, + 0.998814199976435390f, + 0.998776565542495610f, 0.998738343554035230f, 0.998699534033539280f, + 0.998660137003838490f, + 0.998620152488108870f, 0.998579580509872500f, 0.998538421092996730f, + 0.998496674261694640f, + 0.998454340040524800f, 0.998411418454391300f, 0.998367909528543820f, + 0.998323813288577560f, + 0.998279129760433200f, 0.998233858970396850f, 0.998188000945100300f, + 0.998141555711520520f, + 0.998094523296980010f, 0.998046903729146840f, 0.997998697036034390f, + 0.997949903246001190f, + 0.997900522387751620f, 0.997850554490335110f, 0.997799999583146470f, + 0.997748857695925690f, + 0.997697128858758500f, 0.997644813102075420f, 0.997591910456652630f, + 0.997538420953611340f, + 0.997484344624417930f, 0.997429681500884180f, 0.997374431615167150f, + 0.997318594999768600f, + 0.997262171687536170f, 0.997205161711661850f, 0.997147565105683480f, + 0.997089381903483400f, + 0.997030612139289450f, 0.996971255847674320f, 0.996911313063555740f, + 0.996850783822196610f, + 0.996789668159204560f, 0.996727966110532490f, 0.996665677712478160f, + 0.996602803001684130f, + 0.996539342015137940f, 0.996475294790172160f, 0.996410661364464100f, + 0.996345441776035900f, + 0.996279636063254650f, 0.996213244264832040f, 0.996146266419824620f, + 0.996078702567633980f, + 0.996010552748005870f, 0.995941817001031350f, 0.995872495367145730f, + 0.995802587887129160f, + 0.995732094602106430f, 0.995661015553546910f, 0.995589350783264600f, + 0.995517100333418110f, + 0.995444264246510340f, 0.995370842565388990f, 0.995296835333246090f, + 0.995222242593618360f, + 0.995147064390386470f, 0.995071300767776170f, 0.994994951770357020f, + 0.994918017443043200f, + 0.994840497831093180f, 0.994762392980109930f, 0.994683702936040250f, + 0.994604427745175660f, + 0.994524567454151740f, 0.994444122109948040f, 0.994363091759888570f, + 0.994281476451641550f, + 0.994199276233218910f, 0.994116491152977070f, 0.994033121259616400f, + 0.993949166602181130f, + 0.993864627230059750f, 0.993779503192984580f, 0.993693794541031790f, + 0.993607501324621610f, + 0.993520623594518090f, 0.993433161401829360f, 0.993345114798006910f, + 0.993256483834846440f, + 0.993167268564487230f, 0.993077469039412300f, 0.992987085312448390f, + 0.992896117436765980f, + 0.992804565465879140f, 0.992712429453645460f, 0.992619709454266140f, + 0.992526405522286100f, + 0.992432517712593660f, 0.992338046080420420f, 0.992242990681341700f, + 0.992147351571276090f, + 0.992051128806485720f, 0.991954322443575950f, 0.991856932539495470f, + 0.991758959151536110f, + 0.991660402337333210f, 0.991561262154865290f, 0.991461538662453790f, + 0.991361231918763460f, + 0.991260341982802440f, 0.991158868913921350f, 0.991056812771814340f, + 0.990954173616518500f, + 0.990850951508413620f, 0.990747146508222710f, 0.990642758677011570f, + 0.990537788076188750f, + 0.990432234767505970f, 0.990326098813057330f, 0.990219380275280000f, + 0.990112079216953770f, + 0.990004195701200910f, 0.989895729791486660f, 0.989786681551618640f, + 0.989677051045747210f, + 0.989566838338365120f, 0.989456043494307710f, 0.989344666578752640f, + 0.989232707657220050f, + 0.989120166795572690f, 0.989007044060015270f, 0.988893339517095130f, + 0.988779053233701520f, + 0.988664185277066230f, 0.988548735714763200f, 0.988432704614708340f, + 0.988316092045159690f, + 0.988198898074717610f, 0.988081122772324070f, 0.987962766207263420f, + 0.987843828449161740f, + 0.987724309567986960f, 0.987604209634049160f, 0.987483528717999710f, + 0.987362266890832400f, + 0.987240424223882250f, 0.987118000788826280f, 0.986994996657682980f, + 0.986871411902812470f, + 0.986747246596916590f, 0.986622500813038480f, 0.986497174624562880f, + 0.986371268105216030f, + 0.986244781329065460f, 0.986117714370520090f, 0.985990067304330140f, + 0.985861840205586980f, + 0.985733033149723490f, 0.985603646212513400f, 0.985473679470071810f, + 0.985343132998854790f, + 0.985212006875659350f, 0.985080301177623800f, 0.984948015982227030f, + 0.984815151367289140f, + 0.984681707410970940f, 0.984547684191773960f, 0.984413081788540700f, + 0.984277900280454370f, + 0.984142139747038570f, 0.984005800268157870f, 0.983868881924017220f, + 0.983731384795162090f, + 0.983593308962478650f, 0.983454654507193270f, 0.983315421510872810f, + 0.983175610055424420f, + 0.983035220223095640f, 0.982894252096474070f, 0.982752705758487830f, + 0.982610581292404750f, + 0.982467878781833170f, 0.982324598310721280f, 0.982180739963357090f, + 0.982036303824369020f, + 0.981891289978725100f, 0.981745698511732990f, 0.981599529509040720f, + 0.981452783056635520f, + 0.981305459240844670f, 0.981157558148334830f, 0.981009079866112630f, + 0.980860024481523870f, + 0.980710392082253970f, 0.980560182756327840f, 0.980409396592109910f, + 0.980258033678303550f, + 0.980106094103951770f, 0.979953577958436740f, 0.979800485331479790f, + 0.979646816313141210f, + 0.979492570993820810f, 0.979337749464256780f, 0.979182351815526930f, + 0.979026378139047580f, + 0.978869828526574120f, 0.978712703070200420f, 0.978555001862359550f, + 0.978396724995823090f, + 0.978237872563701090f, 0.978078444659442380f, 0.977918441376834370f, + 0.977757862810002760f, + 0.977596709053411890f, 0.977434980201864260f, 0.977272676350500860f, + 0.977109797594800880f, + 0.976946344030581670f, 0.976782315753998650f, 0.976617712861545640f, + 0.976452535450054060f, + 0.976286783616693630f, 0.976120457458971910f, 0.975953557074734300f, + 0.975786082562163930f, + 0.975618034019781750f, 0.975449411546446380f, 0.975280215241354220f, + 0.975110445204038890f, + 0.974940101534371830f, 0.974769184332561770f, 0.974597693699155050f, + 0.974425629735034990f, + 0.974252992541422500f, 0.974079782219875680f, 0.973905998872289570f, + 0.973731642600896400f, + 0.973556713508265560f, 0.973381211697303290f, 0.973205137271252800f, + 0.973028490333694210f, + 0.972851270988544180f, 0.972673479340056430f, 0.972495115492821190f, + 0.972316179551765300f, + 0.972136671622152230f, 0.971956591809581720f, 0.971775940219990140f, + 0.971594716959650160f, + 0.971412922135170940f, 0.971230555853497380f, 0.971047618221911100f, + 0.970864109348029470f, + 0.970680029339806130f, 0.970495378305530560f, 0.970310156353828110f, + 0.970124363593660280f, + 0.969938000134323960f, 0.969751066085452140f, 0.969563561557013180f, + 0.969375486659311280f, + 0.969186841502985950f, 0.968997626199012420f, 0.968807840858700970f, + 0.968617485593697540f, + 0.968426560515983190f, 0.968235065737874320f, 0.968043001372022260f, + 0.967850367531413620f, + 0.967657164329369880f, 0.967463391879547550f, 0.967269050295937790f, + 0.967074139692867040f, + 0.966878660184995910f, 0.966682611887320080f, 0.966485994915169840f, + 0.966288809384209690f, + 0.966091055410438830f, 0.965892733110190860f, 0.965693842600133690f, + 0.965494383997269500f, + 0.965294357418934660f, 0.965093762982799590f, 0.964892600806868890f, + 0.964690871009481030f, + 0.964488573709308410f, 0.964285709025357480f, 0.964082277076968140f, + 0.963878277983814200f, + 0.963673711865903230f, 0.963468578843575950f, 0.963262879037507070f, + 0.963056612568704340f, + 0.962849779558509030f, 0.962642380128595710f, 0.962434414400972100f, + 0.962225882497979020f, + 0.962016784542290560f, 0.961807120656913540f, 0.961596890965187860f, + 0.961386095590786250f, + 0.961174734657714080f, 0.960962808290309780f, 0.960750316613243950f, + 0.960537259751520050f, + 0.960323637830473920f, 0.960109450975773940f, 0.959894699313420530f, + 0.959679382969746750f, + 0.959463502071417510f, 0.959247056745430090f, 0.959030047119113660f, + 0.958812473320129310f, + 0.958594335476470220f, 0.958375633716461170f, 0.958156368168758820f, + 0.957936538962351420f, + 0.957716146226558870f, 0.957495190091032570f, 0.957273670685755200f, + 0.957051588141040970f, + 0.956828942587535370f, 0.956605734156215080f, 0.956381962978387730f, + 0.956157629185692140f, + 0.955932732910098280f, 0.955707274283906560f, 0.955481253439748770f, + 0.955254670510586990f, + 0.955027525629714160f, 0.954799818930753720f, 0.954571550547659630f, + 0.954342720614716480f, + 0.954113329266538800f, 0.953883376638071770f, 0.953652862864590500f, + 0.953421788081700310f, + 0.953190152425336670f, 0.952957956031764700f, 0.952725199037579570f, + 0.952491881579706320f, + 0.952258003795399600f, 0.952023565822243570f, 0.951788567798152130f, + 0.951553009861368590f, + 0.951316892150465550f, 0.951080214804345010f, 0.950842977962238160f, + 0.950605181763705340f, + 0.950366826348635780f, 0.950127911857248100f, 0.949888438430089300f, + 0.949648406208035480f, + 0.949407815332291570f, 0.949166665944390700f, 0.948924958186195160f, + 0.948682692199895090f, + 0.948439868128009620f, 0.948196486113385580f, 0.947952546299198670f, + 0.947708048828952100f, + 0.947462993846477700f, 0.947217381495934820f, 0.946971211921810880f, + 0.946724485268921170f, + 0.946477201682408680f, 0.946229361307743820f, 0.945980964290724760f, + 0.945732010777477150f, + 0.945482500914453740f, 0.945232434848435000f, 0.944981812726528150f, + 0.944730634696167800f, + 0.944478900905115550f, 0.944226611501459810f, 0.943973766633615980f, + 0.943720366450326200f, + 0.943466411100659320f, 0.943211900734010620f, 0.942956835500102120f, + 0.942701215548981900f, + 0.942445041031024890f, 0.942188312096931770f, 0.941931028897729620f, + 0.941673191584771360f, + 0.941414800309736340f, 0.941155855224629190f, 0.940896356481780830f, + 0.940636304233847590f, + 0.940375698633811540f, 0.940114539834980280f, 0.939852827990986680f, + 0.939590563255789270f, + 0.939327745783671400f, 0.939064375729241950f, 0.938800453247434770f, + 0.938535978493508560f, + 0.938270951623047190f, 0.938005372791958840f, 0.937739242156476970f, + 0.937472559873159250f, + 0.937205326098887960f, 0.936937540990869900f, 0.936669204706636170f, + 0.936400317404042060f, + 0.936130879241267030f, 0.935860890376814640f, 0.935590350969512370f, + 0.935319261178511610f, + 0.935047621163287430f, 0.934775431083638700f, 0.934502691099687870f, + 0.934229401371880820f, + 0.933955562060986730f, 0.933681173328098410f, 0.933406235334631520f, + 0.933130748242325230f, + 0.932854712213241120f, 0.932578127409764420f, 0.932300993994602760f, + 0.932023312130786490f, + 0.931745081981668720f, 0.931466303710925090f, 0.931186977482553750f, + 0.930907103460875130f, + 0.930626681810531760f, 0.930345712696488470f, 0.930064196284032360f, + 0.929782132738772190f, + 0.929499522226638560f, 0.929216364913884040f, 0.928932660967082820f, + 0.928648410553130520f, + 0.928363613839244370f, 0.928078270992963140f, 0.927792382182146320f, + 0.927505947574975180f, + 0.927218967339951790f, 0.926931441645899130f, 0.926643370661961230f, + 0.926354754557602860f, + 0.926065593502609310f, 0.925775887667086740f, 0.925485637221461490f, + 0.925194842336480530f, + 0.924903503183210910f, 0.924611619933039970f, 0.924319192757675160f, + 0.924026221829143850f, + 0.923732707319793290f, 0.923438649402290370f, 0.923144048249621930f, + 0.922848904035094120f, + 0.922553216932332830f, 0.922256987115283030f, 0.921960214758209220f, + 0.921662900035694730f, + 0.921365043122642340f, 0.921066644194273640f, 0.920767703426128790f, + 0.920468220994067110f, + 0.920168197074266340f, 0.919867631843222950f, 0.919566525477751530f, + 0.919264878154985370f, + 0.918962690052375630f, 0.918659961347691900f, 0.918356692219021720f, + 0.918052882844770380f, + 0.917748533403661250f, 0.917443644074735220f, 0.917138215037350710f, + 0.916832246471183890f, + 0.916525738556228210f, 0.916218691472794220f, 0.915911105401509880f, + 0.915602980523320230f, + 0.915294317019487050f, 0.914985115071589310f, 0.914675374861522390f, + 0.914365096571498560f, + 0.914054280384046570f, 0.913742926482011390f, 0.913431035048554720f, + 0.913118606267154240f, + 0.912805640321603500f, 0.912492137396012650f, 0.912178097674807180f, + 0.911863521342728520f, + 0.911548408584833990f, 0.911232759586496190f, 0.910916574533403360f, + 0.910599853611558930f, + 0.910282597007281760f, 0.909964804907205660f, 0.909646477498279540f, + 0.909327614967767260f, + 0.909008217503247450f, 0.908688285292613360f, 0.908367818524072890f, + 0.908046817386148340f, + 0.907725282067676440f, 0.907403212757808110f, 0.907080609646008450f, + 0.906757472922056550f, + 0.906433802776045460f, 0.906109599398381980f, 0.905784862979786550f, + 0.905459593711293250f, + 0.905133791784249690f, 0.904807457390316540f, 0.904480590721468250f, + 0.904153191969991780f, + 0.903825261328487510f, 0.903496798989868450f, 0.903167805147360720f, + 0.902838279994502830f, + 0.902508223725145940f, 0.902177636533453620f, 0.901846518613901750f, + 0.901514870161278740f, + 0.901182691370684520f, 0.900849982437531450f, 0.900516743557543520f, + 0.900182974926756810f, + 0.899848676741518580f, 0.899513849198487980f, 0.899178492494635330f, + 0.898842606827242370f, + 0.898506192393901950f, 0.898169249392518080f, 0.897831778021305650f, + 0.897493778478790310f, + 0.897155250963808550f, 0.896816195675507300f, 0.896476612813344120f, + 0.896136502577086770f, + 0.895795865166813530f, 0.895454700782912450f, 0.895113009626081760f, + 0.894770791897329550f, + 0.894428047797973800f, 0.894084777529641990f, 0.893740981294271040f, + 0.893396659294107720f, + 0.893051811731707450f, 0.892706438809935390f, 0.892360540731965360f, + 0.892014117701280470f, + 0.891667169921672280f, 0.891319697597241390f, 0.890971700932396860f, + 0.890623180131855930f, + 0.890274135400644600f, 0.889924566944096720f, 0.889574474967854580f, + 0.889223859677868210f, + 0.888872721280395630f, 0.888521059982002260f, 0.888168875989561730f, + 0.887816169510254440f, + 0.887462940751568840f, 0.887109189921300170f, 0.886754917227550840f, + 0.886400122878730600f, + 0.886044807083555600f, 0.885688970051048960f, 0.885332611990540590f, + 0.884975733111666660f, + 0.884618333624369920f, 0.884260413738899190f, 0.883901973665809470f, + 0.883543013615961880f, + 0.883183533800523390f, 0.882823534430966620f, 0.882463015719070150f, + 0.882101977876917580f, + 0.881740421116898320f, 0.881378345651706920f, 0.881015751694342870f, + 0.880652639458111010f, + 0.880289009156621010f, 0.879924861003786860f, 0.879560195213827890f, + 0.879195012001267480f, + 0.878829311580933360f, 0.878463094167957870f, 0.878096359977777130f, + 0.877729109226131570f, + 0.877361342129065140f, 0.876993058902925890f, 0.876624259764365310f, + 0.876254944930338510f, + 0.875885114618103810f, 0.875514769045222850f, 0.875143908429560360f, + 0.874772532989284150f, + 0.874400642942864790f, 0.874028238509075740f, 0.873655319906992630f, + 0.873281887355994210f, + 0.872907941075761080f, 0.872533481286276170f, 0.872158508207824480f, + 0.871783022060993120f, + 0.871407023066670950f, 0.871030511446048260f, 0.870653487420617430f, + 0.870275951212171940f, + 0.869897903042806340f, 0.869519343134916860f, 0.869140271711200560f, + 0.868760688994655310f, + 0.868380595208579800f, 0.867999990576573510f, 0.867618875322536230f, + 0.867237249670668400f, + 0.866855113845470430f, 0.866472468071743050f, 0.866089312574586770f, + 0.865705647579402380f, + 0.865321473311889800f, 0.864936789998049020f, 0.864551597864179340f, + 0.864165897136879300f, + 0.863779688043046720f, 0.863392970809878420f, 0.863005745664870320f, + 0.862618012835816740f, + 0.862229772550811240f, 0.861841025038245330f, 0.861451770526809320f, + 0.861062009245491480f, + 0.860671741423578380f, 0.860280967290654510f, 0.859889687076602290f, + 0.859497901011601730f, + 0.859105609326130450f, 0.858712812250963520f, 0.858319510017173440f, + 0.857925702856129790f, + 0.857531390999499150f, 0.857136574679244980f, 0.856741254127627470f, + 0.856345429577203610f, + 0.855949101260826910f, 0.855552269411646860f, 0.855154934263109620f, + 0.854757096048957220f, + 0.854358755003227440f, 0.853959911360254180f, 0.853560565354666840f, + 0.853160717221390420f, + 0.852760367195645300f, 0.852359515512947090f, 0.851958162409106380f, + 0.851556308120228980f, + 0.851153952882715340f, 0.850751096933260790f, 0.850347740508854980f, + 0.849943883846782210f, + 0.849539527184620890f, 0.849134670760243630f, 0.848729314811817130f, + 0.848323459577801640f, + 0.847917105296951410f, 0.847510252208314330f, 0.847102900551231500f, + 0.846695050565337450f, + 0.846286702490559710f, 0.845877856567119000f, 0.845468513035528830f, + 0.845058672136595470f, + 0.844648334111417820f, 0.844237499201387020f, 0.843826167648186740f, + 0.843414339693792760f, + 0.843002015580472940f, 0.842589195550786710f, 0.842175879847585570f, + 0.841762068714012490f, + 0.841347762393501950f, 0.840932961129779780f, 0.840517665166862550f, + 0.840101874749058400f, + 0.839685590120966110f, 0.839268811527475230f, 0.838851539213765760f, + 0.838433773425308340f, + 0.838015514407863820f, 0.837596762407483040f, 0.837177517670507300f, + 0.836757780443567190f, + 0.836337550973583530f, 0.835916829507766360f, 0.835495616293615350f, + 0.835073911578919410f, + 0.834651715611756440f, 0.834229028640493420f, 0.833805850913786340f, + 0.833382182680579730f, + 0.832958024190106670f, 0.832533375691888680f, 0.832108237435735590f, + 0.831682609671745120f, + 0.831256492650303210f, 0.830829886622083570f, 0.830402791838047550f, + 0.829975208549443950f, + 0.829547137007808910f, 0.829118577464965980f, 0.828689530173025820f, + 0.828259995384385660f, + 0.827829973351729920f, 0.827399464328029470f, 0.826968468566541600f, + 0.826536986320809960f, + 0.826105017844664610f, 0.825672563392221390f, 0.825239623217882250f, + 0.824806197576334330f, + 0.824372286722551250f, 0.823937890911791370f, 0.823503010399598500f, + 0.823067645441801670f, + 0.822631796294514990f, 0.822195463214137170f, 0.821758646457351750f, + 0.821321346281126740f, + 0.820883562942714580f, 0.820445296699652050f, 0.820006547809759680f, + 0.819567316531142230f, + 0.819127603122188240f, 0.818687407841569680f, 0.818246730948242070f, + 0.817805572701444270f, + 0.817363933360698460f, 0.816921813185809480f, 0.816479212436865390f, + 0.816036131374236810f, + 0.815592570258576790f, 0.815148529350820830f, 0.814704008912187080f, + 0.814259009204175270f, + 0.813813530488567190f, 0.813367573027426570f, 0.812921137083098770f, + 0.812474222918210480f, + 0.812026830795669730f, 0.811578960978665890f, 0.811130613730669190f, + 0.810681789315430780f, + 0.810232487996982330f, 0.809782710039636530f, 0.809332455707985950f, + 0.808881725266903610f, + 0.808430518981542720f, 0.807978837117336310f, 0.807526679939997160f, + 0.807074047715517610f, + 0.806620940710169650f, 0.806167359190504420f, 0.805713303423352230f, + 0.805258773675822210f, + 0.804803770215302920f, 0.804348293309460780f, 0.803892343226241260f, + 0.803435920233868120f, + 0.802979024600843250f, 0.802521656595946430f, 0.802063816488235440f, + 0.801605504547046150f, + 0.801146721041991360f, 0.800687466242961610f, 0.800227740420124790f, + 0.799767543843925680f, + 0.799306876785086160f, 0.798845739514604580f, 0.798384132303756380f, + 0.797922055424093000f, + 0.797459509147442460f, 0.796996493745908750f, 0.796533009491872000f, + 0.796069056657987990f, + 0.795604635517188070f, 0.795139746342679590f, 0.794674389407944550f, + 0.794208564986740640f, + 0.793742273353100210f, 0.793275514781330630f, 0.792808289546014120f, + 0.792340597922007170f, + 0.791872440184440470f, 0.791403816608719500f, 0.790934727470523290f, + 0.790465173045804880f, + 0.789995153610791090f, 0.789524669441982190f, 0.789053720816151880f, + 0.788582308010347120f, + 0.788110431301888070f, 0.787638090968367450f, 0.787165287287651010f, + 0.786692020537876790f, + 0.786218290997455660f, 0.785744098945070360f, 0.785269444659675850f, + 0.784794328420499230f, + 0.784318750507038920f, 0.783842711199065230f, 0.783366210776619720f, + 0.782889249520015480f, + 0.782411827709836530f, 0.781933945626937630f, 0.781455603552444590f, + 0.780976801767753750f, + 0.780497540554531910f, 0.780017820194715990f, 0.779537640970513260f, + 0.779057003164400630f, + 0.778575907059125050f, 0.778094352937702790f, 0.777612341083420030f, + 0.777129871779831620f, + 0.776646945310762060f, 0.776163561960304340f, 0.775679722012820650f, + 0.775195425752941420f, + 0.774710673465565550f, 0.774225465435860680f, 0.773739801949261840f, + 0.773253683291472590f, + 0.772767109748463850f, 0.772280081606474320f, 0.771792599152010150f, + 0.771304662671844830f, + 0.770816272453018540f, 0.770327428782838890f, 0.769838131948879840f, + 0.769348382238982280f, + 0.768858179941253270f, 0.768367525344066270f, 0.767876418736060610f, + 0.767384860406141730f, + 0.766892850643480670f, 0.766400389737514230f, 0.765907477977944340f, + 0.765414115654738270f, + 0.764920303058128410f, 0.764426040478612070f, 0.763931328206951090f, + 0.763436166534172010f, + 0.762940555751565720f, 0.762444496150687210f, 0.761947988023355390f, + 0.761451031661653620f, + 0.760953627357928150f, 0.760455775404789260f, 0.759957476095110330f, + 0.759458729722028210f, + 0.758959536578942440f, 0.758459896959515430f, 0.757959811157672300f, + 0.757459279467600720f, + 0.756958302183750490f, 0.756456879600833740f, 0.755955012013824420f, + 0.755452699717958250f, + 0.754949943008732640f, 0.754446742181906440f, 0.753943097533499640f, + 0.753439009359793580f, + 0.752934477957330150f, 0.752429503622912390f, 0.751924086653603550f, + 0.751418227346727470f, + 0.750911925999867890f, 0.750405182910869330f, 0.749897998377835330f, + 0.749390372699129560f, + 0.748882306173375150f, 0.748373799099454560f, 0.747864851776509410f, + 0.747355464503940190f, + 0.746845637581406540f, 0.746335371308826320f, 0.745824665986376090f, + 0.745313521914490520f, + 0.744801939393862630f, 0.744289918725443260f, 0.743777460210440890f, + 0.743264564150321600f, + 0.742751230846809050f, 0.742237460601884000f, 0.741723253717784140f, + 0.741208610497004260f, + 0.740693531242295760f, 0.740178016256666240f, 0.739662065843380010f, + 0.739145680305957510f, + 0.738628859948174840f, 0.738111605074064260f, 0.737593915987913570f, + 0.737075792994265730f, + 0.736557236397919150f, 0.736038246503927350f, 0.735518823617598900f, + 0.734998968044496710f, + 0.734478680090438370f, 0.733957960061495940f, 0.733436808263995710f, + 0.732915225004517780f, + 0.732393210589896040f, 0.731870765327218290f, 0.731347889523825570f, + 0.730824583487312160f, + 0.730300847525525490f, 0.729776681946566090f, 0.729252087058786970f, + 0.728727063170793830f, + 0.728201610591444610f, 0.727675729629849610f, 0.727149420595371020f, + 0.726622683797622850f, + 0.726095519546471000f, 0.725567928152032300f, 0.725039909924675370f, + 0.724511465175019630f, + 0.723982594213935520f, 0.723453297352544380f, 0.722923574902217700f, + 0.722393427174577550f, + 0.721862854481496340f, 0.721331857135096290f, 0.720800435447749190f, + 0.720268589732077190f, + 0.719736320300951030f, 0.719203627467491220f, 0.718670511545067230f, + 0.718136972847297490f, + 0.717603011688049080f, 0.717068628381437480f, 0.716533823241826680f, + 0.715998596583828690f, + 0.715462948722303760f, 0.714926879972359490f, 0.714390390649351390f, + 0.713853481068882470f, + 0.713316151546802610f, 0.712778402399208980f, 0.712240233942445510f, + 0.711701646493102970f, + 0.711162640368018350f, 0.710623215884275020f, 0.710083373359202800f, + 0.709543113110376770f, + 0.709002435455618250f, 0.708461340712994160f, 0.707919829200816310f, + 0.707377901237642100f, + 0.706835557142273860f, 0.706292797233758480f, 0.705749621831387790f, + 0.705206031254697830f, + 0.704662025823468930f, 0.704117605857725430f, 0.703572771677735580f, + 0.703027523604011220f, + 0.702481861957308000f, 0.701935787058624360f, 0.701389299229202230f, + 0.700842398790526230f, + 0.700295086064323780f, 0.699747361372564990f, 0.699199225037462120f, + 0.698650677381469580f, + 0.698101718727283880f, 0.697552349397843270f, 0.697002569716327460f, + 0.696452380006157830f, + 0.695901780590996830f, 0.695350771794747800f, 0.694799353941554900f, + 0.694247527355803310f, + 0.693695292362118350f, 0.693142649285365510f, 0.692589598450650380f, + 0.692036140183318830f, + 0.691482274808955850f, 0.690928002653386280f, 0.690373324042674040f, + 0.689818239303122470f, + 0.689262748761273470f, 0.688706852743907750f, 0.688150551578044830f, + 0.687593845590942170f, + 0.687036735110095660f, 0.686479220463238950f, 0.685921301978343670f, + 0.685362979983618730f, + 0.684804254807510620f, 0.684245126778703080f, 0.683685596226116690f, + 0.683125663478908800f, + 0.682565328866473250f, 0.682004592718440830f, 0.681443455364677990f, + 0.680881917135287340f, + 0.680319978360607200f, 0.679757639371212030f, 0.679194900497911200f, + 0.678631762071749470f, + 0.678068224424006600f, 0.677504287886197430f, 0.676939952790071240f, + 0.676375219467611700f, + 0.675810088251037060f, 0.675244559472799270f, 0.674678633465584540f, + 0.674112310562312360f, + 0.673545591096136100f, 0.672978475400442090f, 0.672410963808849900f, + 0.671843056655211930f, + 0.671274754273613490f, 0.670706056998372160f, 0.670136965164037760f, + 0.669567479105392490f, + 0.668997599157450270f, 0.668427325655456820f, 0.667856658934889440f, + 0.667285599331456480f, + 0.666714147181097670f, 0.666142302819983540f, 0.665570066584515560f, + 0.664997438811325340f, + 0.664424419837275180f, 0.663851009999457340f, 0.663277209635194100f, + 0.662703019082037440f, + 0.662128438677768720f, 0.661553468760399000f, 0.660978109668168060f, + 0.660402361739545030f, + 0.659826225313227430f, 0.659249700728141490f, 0.658672788323441890f, + 0.658095488438511290f, + 0.657517801412960120f, 0.656939727586627110f, 0.656361267299578000f, + 0.655782420892106030f, + 0.655203188704731930f, 0.654623571078202680f, 0.654043568353492640f, + 0.653463180871802330f, + 0.652882408974558960f, 0.652301253003415460f, 0.651719713300251020f, + 0.651137790207170330f, + 0.650555484066503990f, 0.649972795220807530f, 0.649389724012861770f, + 0.648806270785672550f, + 0.648222435882470420f, 0.647638219646710420f, 0.647053622422071650f, + 0.646468644552457890f, + 0.645883286381996440f, 0.645297548255038380f, 0.644711430516158420f, + 0.644124933510154540f, + 0.643538057582047850f, 0.642950803077082080f, 0.642363170340724320f, + 0.641775159718663500f, + 0.641186771556811250f, 0.640598006201301030f, 0.640008863998488440f, + 0.639419345294950700f, + 0.638829450437486400f, 0.638239179773115390f, 0.637648533649078810f, + 0.637057512412838590f, + 0.636466116412077180f, 0.635874345994697720f, 0.635282201508823530f, + 0.634689683302797850f, + 0.634096791725183740f, 0.633503527124764320f, 0.632909889850541860f, + 0.632315880251737680f, + 0.631721498677792370f, 0.631126745478365340f, 0.630531621003334600f, + 0.629936125602796550f, + 0.629340259627065750f, 0.628744023426674790f, 0.628147417352374120f, + 0.627550441755131530f, + 0.626953096986132770f, 0.626355383396779990f, 0.625757301338692900f, + 0.625158851163707730f, + 0.624560033223877320f, 0.623960847871470770f, 0.623361295458973340f, + 0.622761376339086460f, + 0.622161090864726930f, 0.621560439389027270f, 0.620959422265335180f, + 0.620358039847213830f, + 0.619756292488440660f, 0.619154180543008410f, 0.618551704365123860f, + 0.617948864309208260f, + 0.617345660729896940f, 0.616742093982038830f, 0.616138164420696910f, + 0.615533872401147430f, + 0.614929218278879590f, 0.614324202409595950f, 0.613718825149211830f, + 0.613113086853854910f, + 0.612506987879865570f, 0.611900528583796070f, 0.611293709322411010f, + 0.610686530452686280f, + 0.610078992331809620f, 0.609471095317180240f, 0.608862839766408200f, + 0.608254226037314490f, + 0.607645254487930830f, 0.607035925476499760f, 0.606426239361473550f, + 0.605816196501515080f, + 0.605205797255496500f, 0.604595041982500360f, 0.603983931041818020f, + 0.603372464792950370f, + 0.602760643595607220f, 0.602148467809707320f, 0.601535937795377730f, + 0.600923053912954090f, + 0.600309816522980430f, 0.599696225986208310f, 0.599082282663597310f, + 0.598467986916314310f, + 0.597853339105733910f, 0.597238339593437530f, 0.596622988741213330f, + 0.596007286911056530f, + 0.595391234465168730f, 0.594774831765957580f, 0.594158079176036800f, + 0.593540977058226390f, + 0.592923525775551410f, 0.592305725691242400f, 0.591687577168735550f, + 0.591069080571671510f, + 0.590450236263895920f, 0.589831044609458900f, 0.589211505972615070f, + 0.588591620717822890f, + 0.587971389209745120f, 0.587350811813247660f, 0.586729888893400500f, + 0.586108620815476430f, + 0.585487007944951450f, 0.584865050647504490f, 0.584242749289016980f, + 0.583620104235572760f, + 0.582997115853457700f, 0.582373784509160220f, 0.581750110569369760f, + 0.581126094400977620f, + 0.580501736371076600f, 0.579877036846960350f, 0.579251996196123550f, + 0.578626614786261430f, + 0.578000892985269910f, 0.577374831161244880f, 0.576748429682482520f, + 0.576121688917478390f, + 0.575494609234928230f, 0.574867191003726740f, 0.574239434592967890f, + 0.573611340371944610f, + 0.572982908710148680f, 0.572354139977270030f, 0.571725034543197120f, + 0.571095592778016690f, + 0.570465815052012990f, 0.569835701735668110f, 0.569205253199661200f, + 0.568574469814869250f, + 0.567943351952365670f, 0.567311899983420800f, 0.566680114279501710f, + 0.566047995212271560f, + 0.565415543153589770f, 0.564782758475511400f, 0.564149641550287680f, + 0.563516192750364910f, + 0.562882412448384550f, 0.562248301017183150f, 0.561613858829792420f, + 0.560979086259438260f, + 0.560343983679540860f, 0.559708551463714790f, 0.559072789985768480f, + 0.558436699619704100f, + 0.557800280739717100f, 0.557163533720196340f, 0.556526458935723720f, + 0.555889056761073920f, + 0.555251327571214090f, 0.554613271741304040f, 0.553974889646695610f, + 0.553336181662932410f, + 0.552697148165749770f, 0.552057789531074980f, 0.551418106135026060f, + 0.550778098353912230f, + 0.550137766564233630f, 0.549497111142680960f, 0.548856132466135290f, + 0.548214830911667780f, + 0.547573206856539870f, 0.546931260678202190f, 0.546288992754295210f, + 0.545646403462648590f, + 0.545003493181281160f, 0.544360262288400400f, 0.543716711162402390f, + 0.543072840181871850f, + 0.542428649725581360f, 0.541784140172491660f, 0.541139311901750910f, + 0.540494165292695230f, + 0.539848700724847700f, 0.539202918577918240f, 0.538556819231804210f, + 0.537910403066588990f, + 0.537263670462542530f, 0.536616621800121150f, 0.535969257459966710f, + 0.535321577822907010f, + 0.534673583269955510f, 0.534025274182310380f, 0.533376650941355560f, + 0.532727713928658810f, + 0.532078463525973540f, 0.531428900115236910f, 0.530779024078570250f, + 0.530128835798278850f, + 0.529478335656852090f, 0.528827524036961980f, 0.528176401321464370f, + 0.527524967893398200f, + 0.526873224135984700f, 0.526221170432628170f, 0.525568807166914680f, + 0.524916134722612890f, + 0.524263153483673470f, 0.523609863834228030f, 0.522956266158590140f, + 0.522302360841254700f, + 0.521648148266897090f, 0.520993628820373810f, 0.520338802886721960f, + 0.519683670851158520f, + 0.519028233099080970f, 0.518372490016066220f, 0.517716441987871150f, + 0.517060089400432130f, + 0.516403432639863990f, 0.515746472092461380f, 0.515089208144697270f, + 0.514431641183222930f, + 0.513773771594868030f, 0.513115599766640560f, 0.512457126085725800f, + 0.511798350939487000f, + 0.511139274715464390f, 0.510479897801375700f, 0.509820220585115560f, + 0.509160243454754750f, + 0.508499966798540810f, 0.507839391004897940f, 0.507178516462425290f, + 0.506517343559898530f, + 0.505855872686268860f, 0.505194104230662240f, 0.504532038582380380f, + 0.503869676130898950f, + 0.503207017265869030f, 0.502544062377115800f, 0.501880811854638400f, + 0.501217266088609950f, + 0.500553425469377640f, 0.499889290387461380f, 0.499224861233555030f, + 0.498560138398525200f, + 0.497895122273410930f, 0.497229813249424340f, 0.496564211717949340f, + 0.495898318070542240f, + 0.495232132698931350f, 0.494565655995016010f, 0.493898888350867430f, + 0.493231830158728070f, + 0.492564481811010650f, 0.491896843700299240f, 0.491228916219348330f, + 0.490560699761082080f, + 0.489892194718595300f, 0.489223401485152030f, 0.488554320454186230f, + 0.487884952019301210f, + 0.487215296574268820f, 0.486545354513030270f, 0.485875126229695420f, + 0.485204612118541880f, + 0.484533812574016120f, 0.483862727990732320f, 0.483191358763471910f, + 0.482519705287184520f, + 0.481847767956986080f, 0.481175547168160360f, 0.480503043316157670f, + 0.479830256796594250f, + 0.479157188005253310f, 0.478483837338084080f, 0.477810205191201040f, + 0.477136291960884750f, + 0.476462098043581310f, 0.475787623835901120f, 0.475112869734620470f, + 0.474437836136679340f, + 0.473762523439182850f, 0.473086932039400220f, 0.472411062334764100f, + 0.471734914722871430f, + 0.471058489601482610f, 0.470381787368520710f, 0.469704808422072460f, + 0.469027553160387240f, + 0.468350021981876530f, 0.467672215285114710f, 0.466994133468838110f, + 0.466315776931944480f, + 0.465637146073493770f, 0.464958241292706740f, 0.464279062988965760f, + 0.463599611561814120f, + 0.462919887410955130f, 0.462239890936253280f, 0.461559622537733190f, + 0.460879082615578690f, + 0.460198271570134270f, 0.459517189801903590f, 0.458835837711549120f, + 0.458154215699893230f, + 0.457472324167916110f, 0.456790163516757220f, 0.456107734147714220f, + 0.455425036462242420f, + 0.454742070861955450f, 0.454058837748624540f, 0.453375337524177750f, + 0.452691570590700860f, + 0.452007537350436530f, 0.451323238205783520f, 0.450638673559297760f, + 0.449953843813690580f, + 0.449268749371829920f, 0.448583390636739300f, 0.447897768011597360f, + 0.447211881899738260f, + 0.446525732704651400f, 0.445839320829980350f, 0.445152646679523590f, + 0.444465710657234110f, + 0.443778513167218280f, 0.443091054613736990f, 0.442403335401204130f, + 0.441715355934187310f, + 0.441027116617407340f, 0.440338617855737300f, 0.439649860054203420f, + 0.438960843617984430f, + 0.438271568952410480f, 0.437582036462964340f, 0.436892246555280470f, + 0.436202199635143950f, + 0.435511896108492170f, 0.434821336381412350f, 0.434130520860143310f, + 0.433439449951074200f, + 0.432748124060743760f, 0.432056543595841450f, 0.431364708963206440f, + 0.430672620569826860f, + 0.429980278822840570f, 0.429287684129534720f, 0.428594836897344400f, + 0.427901737533854240f, + 0.427208386446796370f, 0.426514784044051520f, 0.425820930733648350f, + 0.425126826923762410f, + 0.424432473022717420f, 0.423737869438983950f, 0.423043016581179100f, + 0.422347914858067000f, + 0.421652564678558380f, 0.420956966451709440f, 0.420261120586723050f, + 0.419565027492946940f, + 0.418868687579875110f, 0.418172101257146430f, 0.417475268934544340f, + 0.416778191021997590f, + 0.416080867929579320f, 0.415383300067506290f, 0.414685487846140010f, + 0.413987431675985510f, + 0.413289131967690960f, 0.412590589132048380f, 0.411891803579992220f, + 0.411192775722600160f, + 0.410493505971092520f, 0.409793994736831200f, 0.409094242431320920f, + 0.408394249466208110f, + 0.407694016253280170f, 0.406993543204466460f, 0.406292830731837470f, + 0.405591879247603870f, + 0.404890689164117750f, 0.404189260893870750f, 0.403487594849495310f, + 0.402785691443763640f, + 0.402083551089587040f, 0.401381174200016790f, 0.400678561188243350f, + 0.399975712467595390f, + 0.399272628451540930f, 0.398569309553686360f, 0.397865756187775750f, + 0.397161968767691720f, + 0.396457947707453960f, 0.395753693421220080f, 0.395049206323284880f, + 0.394344486828079650f, + 0.393639535350172880f, 0.392934352304269600f, 0.392228938105210370f, + 0.391523293167972350f, + 0.390817417907668610f, 0.390111312739546910f, 0.389404978078991100f, + 0.388698414341519250f, + 0.387991621942784910f, 0.387284601298575890f, 0.386577352824813980f, + 0.385869876937555310f, + 0.385162174052989970f, 0.384454244587440870f, 0.383746088957365010f, + 0.383037707579352130f, + 0.382329100870124510f, 0.381620269246537520f, 0.380911213125578130f, + 0.380201932924366050f, + 0.379492429060152740f, 0.378782701950320600f, 0.378072752012383990f, + 0.377362579663988450f, + 0.376652185322909620f, 0.375941569407054420f, 0.375230732334460030f, + 0.374519674523293210f, + 0.373808396391851370f, 0.373096898358560690f, 0.372385180841977360f, + 0.371673244260786630f, + 0.370961089033802040f, 0.370248715579966360f, 0.369536124318350760f, + 0.368823315668153960f, + 0.368110290048703050f, 0.367397047879452820f, 0.366683589579984930f, + 0.365969915570008910f, + 0.365256026269360380f, 0.364541922098002180f, 0.363827603476023610f, + 0.363113070823639530f, + 0.362398324561191310f, 0.361683365109145950f, 0.360968192888095290f, + 0.360252808318756830f, + 0.359537211821973180f, 0.358821403818710860f, 0.358105384730061760f, + 0.357389154977241000f, + 0.356672714981588260f, 0.355956065164567010f, 0.355239205947763370f, + 0.354522137752887430f, + 0.353804861001772160f, 0.353087376116372530f, 0.352369683518766630f, + 0.351651783631154680f, + 0.350933676875858360f, 0.350215363675321740f, 0.349496844452109600f, + 0.348778119628908420f, + 0.348059189628525780f, 0.347340054873889190f, 0.346620715788047320f, + 0.345901172794169100f, + 0.345181426315542610f, 0.344461476775576480f, 0.343741324597798600f, + 0.343020970205855540f, + 0.342300414023513690f, 0.341579656474657210f, 0.340858697983289440f, + 0.340137538973531880f, + 0.339416179869623410f, 0.338694621095921190f, 0.337972863076899830f, + 0.337250906237150650f, + 0.336528751001382350f, 0.335806397794420560f, 0.335083847041206580f, + 0.334361099166798900f, + 0.333638154596370920f, 0.332915013755212650f, 0.332191677068729320f, + 0.331468144962440920f, + 0.330744417861982890f, 0.330020496193105530f, 0.329296380381672800f, + 0.328572070853663690f, + 0.327847568035170960f, 0.327122872352400510f, 0.326397984231672660f, + 0.325672904099419900f, + 0.324947632382188430f, 0.324222169506637130f, 0.323496515899536760f, + 0.322770671987770710f, + 0.322044638198334620f, 0.321318414958334910f, 0.320592002694990330f, + 0.319865401835630610f, + 0.319138612807695900f, 0.318411636038737960f, 0.317684471956418020f, + 0.316957120988508150f, + 0.316229583562890490f, 0.315501860107556040f, 0.314773951050606070f, + 0.314045856820250820f, + 0.313317577844809070f, 0.312589114552708660f, 0.311860467372486130f, + 0.311131636732785270f, + 0.310402623062358880f, 0.309673426790066490f, 0.308944048344875710f, + 0.308214488155861220f, + 0.307484746652204160f, 0.306754824263192780f, 0.306024721418221900f, + 0.305294438546791720f, + 0.304563976078509050f, 0.303833334443086470f, 0.303102514070341060f, + 0.302371515390196130f, + 0.301640338832678880f, 0.300908984827921890f, 0.300177453806162120f, + 0.299445746197739950f, + 0.298713862433100390f, 0.297981802942791920f, 0.297249568157465890f, + 0.296517158507877410f, + 0.295784574424884370f, 0.295051816339446720f, 0.294318884682627570f, + 0.293585779885591310f, + 0.292852502379604810f, 0.292119052596036540f, 0.291385430966355720f, + 0.290651637922133220f, + 0.289917673895040860f, 0.289183539316850310f, 0.288449234619434170f, + 0.287714760234765280f, + 0.286980116594915570f, 0.286245304132057120f, 0.285510323278461380f, + 0.284775174466498300f, + 0.284039858128637360f, 0.283304374697445790f, 0.282568724605589740f, + 0.281832908285833460f, + 0.281096926171038320f, 0.280360778694163810f, 0.279624466288266700f, + 0.278887989386500280f, + 0.278151348422115090f, 0.277414543828458200f, 0.276677576038972420f, + 0.275940445487197320f, + 0.275203152606767370f, 0.274465697831413220f, 0.273728081594960650f, + 0.272990304331329980f, + 0.272252366474536660f, 0.271514268458690810f, 0.270776010717996010f, + 0.270037593686750510f, + 0.269299017799346230f, 0.268560283490267890f, 0.267821391194094320f, + 0.267082341345496350f, + 0.266343134379238180f, 0.265603770730176440f, 0.264864250833259320f, + 0.264124575123527490f, + 0.263384744036113390f, 0.262644758006240100f, 0.261904617469222560f, + 0.261164322860466590f, + 0.260423874615468010f, 0.259683273169813930f, 0.258942518959180580f, + 0.258201612419334870f, + 0.257460553986133210f, 0.256719344095520720f, 0.255977983183532380f, + 0.255236471686291820f, + 0.254494810040010790f, 0.253752998680989940f, 0.253011038045617980f, + 0.252268928570370810f, + 0.251526670691812780f, 0.250784264846594550f, 0.250041711471454650f, + 0.249299011003218300f, + 0.248556163878796620f, 0.247813170535187620f, 0.247070031409475370f, + 0.246326746938829060f, + 0.245583317560504000f, 0.244839743711840750f, 0.244096025830264210f, + 0.243352164353284880f, + 0.242608159718496890f, 0.241864012363579210f, 0.241119722726294730f, + 0.240375291244489500f, + 0.239630718356093560f, 0.238886004499120170f, 0.238141150111664870f, + 0.237396155631906550f, + 0.236651021498106460f, 0.235905748148607370f, 0.235160336021834860f, + 0.234414785556295250f, + 0.233669097190576820f, 0.232923271363349120f, 0.232177308513361770f, + 0.231431209079445730f, + 0.230684973500512310f, 0.229938602215552260f, 0.229192095663636740f, + 0.228445454283916550f, + 0.227698678515621170f, 0.226951768798059980f, 0.226204725570620270f, + 0.225457549272768540f, + 0.224710240344049570f, 0.223962799224085520f, 0.223215226352576960f, + 0.222467522169301990f, + 0.221719687114115240f, 0.220971721626949060f, 0.220223626147812460f, + 0.219475401116790340f, + 0.218727046974044600f, 0.217978564159812290f, 0.217229953114406790f, + 0.216481214278216900f, + 0.215732348091705940f, 0.214983354995412820f, 0.214234235429951100f, + 0.213484989836008080f, + 0.212735618654345870f, 0.211986122325800410f, 0.211236501291280710f, + 0.210486755991769890f, + 0.209736886868323370f, 0.208986894362070070f, 0.208236778914211470f, + 0.207486540966020700f, + 0.206736180958843660f, 0.205985699334098050f, 0.205235096533272380f, + 0.204484372997927180f, + 0.203733529169694010f, 0.202982565490274460f, 0.202231482401441620f, + 0.201480280345037820f, + 0.200728959762976140f, 0.199977521097239290f, 0.199225964789878890f, + 0.198474291283016360f, + 0.197722501018842030f, 0.196970594439614370f, 0.196218571987660850f, + 0.195466434105377090f, + 0.194714181235225990f, 0.193961813819739010f, 0.193209332301514080f, + 0.192456737123216840f, + 0.191704028727579940f, 0.190951207557401860f, 0.190198274055548120f, + 0.189445228664950340f, + 0.188692071828605260f, 0.187938803989575850f, 0.187185425590990440f, + 0.186431937076041640f, + 0.185678338887987790f, 0.184924631470150870f, 0.184170815265917720f, + 0.183416890718739230f, + 0.182662858272129360f, 0.181908718369666160f, 0.181154471454990920f, + 0.180400117971807270f, + 0.179645658363882100f, 0.178891093075044830f, 0.178136422549186320f, + 0.177381647230260200f, + 0.176626767562280960f, 0.175871783989325040f, 0.175116696955530060f, + 0.174361506905093830f, + 0.173606214282275410f, 0.172850819531394200f, 0.172095323096829040f, + 0.171339725423019260f, + 0.170584026954463700f, 0.169828228135719880f, 0.169072329411405180f, + 0.168316331226194910f, + 0.167560234024823590f, 0.166804038252083870f, 0.166047744352825850f, + 0.165291352771957970f, + 0.164534863954446110f, 0.163778278345312690f, 0.163021596389637810f, + 0.162264818532558110f, + 0.161507945219266150f, 0.160750976895011390f, 0.159993914005098350f, + 0.159236756994887850f, + 0.158479506309796100f, 0.157722162395293690f, 0.156964725696906750f, + 0.156207196660216040f, + 0.155449575730855880f, 0.154691863354515400f, 0.153934059976937460f, + 0.153176166043917870f, + 0.152418182001306500f, 0.151660108295005400f, 0.150901945370970040f, + 0.150143693675208330f, + 0.149385353653779810f, 0.148626925752796540f, 0.147868410418422360f, + 0.147109808096871850f, + 0.146351119234411440f, 0.145592344277358450f, 0.144833483672080240f, + 0.144074537864995330f, + 0.143315507302571590f, 0.142556392431327340f, 0.141797193697830530f, + 0.141037911548697770f, + 0.140278546430595420f, 0.139519098790238600f, 0.138759569074390380f, + 0.137999957729862760f, + 0.137240265203515700f, 0.136480491942256310f, 0.135720638393040080f, + 0.134960705002868830f, + 0.134200692218792020f, 0.133440600487905820f, 0.132680430257352130f, + 0.131920181974319760f, + 0.131159856086043410f, 0.130399453039802740f, 0.129638973282923540f, + 0.128878417262776660f, + 0.128117785426777150f, 0.127357078222385570f, 0.126596296097105960f, + 0.125835439498487020f, + 0.125074508874121300f, 0.124313504671644300f, 0.123552427338735370f, + 0.122791277323116900f, + 0.122030055072553410f, 0.121268761034852550f, 0.120507395657864240f, + 0.119745959389479630f, + 0.118984452677632520f, 0.118222875970297250f, 0.117461229715489990f, + 0.116699514361267840f, + 0.115937730355727850f, 0.115175878147008180f, 0.114413958183287050f, + 0.113651970912781920f, + 0.112889916783750470f, 0.112127796244489750f, 0.111365609743335190f, + 0.110603357728661910f, + 0.109841040648882680f, 0.109078658952449240f, 0.108316213087851300f, + 0.107553703503615710f, + 0.106791130648307380f, 0.106028494970528530f, 0.105265796918917650f, + 0.104503036942150550f, + 0.103740215488939480f, 0.102977333008032250f, 0.102214389948213370f, + 0.101451386758302160f, + 0.100688323887153970f, 0.099925201783659226f, 0.099162020896742573f, + 0.098398781675363881f, + 0.097635484568517339f, 0.096872130025230527f, 0.096108718494565468f, + 0.095345250425617742f, + 0.094581726267515473f, 0.093818146469420494f, 0.093054511480527333f, + 0.092290821750062355f, + 0.091527077727284981f, 0.090763279861485704f, 0.089999428601987341f, + 0.089235524398144139f, + 0.088471567699340822f, 0.087707558954993645f, 0.086943498614549489f, + 0.086179387127484922f, + 0.085415224943307277f, 0.084651012511553700f, 0.083886750281790226f, + 0.083122438703613077f, + 0.082358078226646619f, 0.081593669300544638f, 0.080829212374989468f, + 0.080064707899690932f, + 0.079300156324387569f, 0.078535558098845590f, 0.077770913672857989f, + 0.077006223496245585f, + 0.076241488018856149f, 0.075476707690563416f, 0.074711882961268378f, + 0.073947014280897269f, + 0.073182102099402888f, 0.072417146866763538f, 0.071652149032982254f, + 0.070887109048087787f, + 0.070122027362133646f, 0.069356904425197236f, 0.068591740687380900f, + 0.067826536598810966f, + 0.067061292609636836f, 0.066296009170032283f, 0.065530686730193397f, + 0.064765325740339871f, + 0.063999926650714078f, 0.063234489911580136f, 0.062469015973224969f, + 0.061703505285957416f, + 0.060937958300107238f, 0.060172375466026218f, 0.059406757234087247f, + 0.058641104054683348f, + 0.057875416378229017f, 0.057109694655158132f, 0.056343939335925283f, + 0.055578150871004817f, + 0.054812329710889909f, 0.054046476306093640f, 0.053280591107148056f, + 0.052514674564603257f, + 0.051748727129028414f, 0.050982749251010900f, 0.050216741381155325f, + 0.049450703970084824f, + 0.048684637468439020f, 0.047918542326875327f, 0.047152418996068000f, + 0.046386267926707213f, + 0.045620089569500123f, 0.044853884375169933f, 0.044087652794454979f, + 0.043321395278109784f, + 0.042555112276904117f, 0.041788804241622082f, 0.041022471623063397f, + 0.040256114872041358f, + 0.039489734439384118f, 0.038723330775933762f, 0.037956904332545366f, + 0.037190455560088091f, + 0.036423984909444228f, 0.035657492831508264f, 0.034890979777187955f, + 0.034124446197403423f, + 0.033357892543086159f, 0.032591319265180385f, 0.031824726814640963f, + 0.031058115642434700f, + 0.030291486199539423f, 0.029524838936943035f, 0.028758174305644590f, + 0.027991492756653365f, + 0.027224794740987910f, 0.026458080709677145f, 0.025691351113759395f, + 0.024924606404281485f, + 0.024157847032300020f, 0.023391073448879338f, 0.022624286105092803f, + 0.021857485452021874f, + 0.021090671940755180f, 0.020323846022389572f, 0.019557008148029204f, + 0.018790158768784596f, + 0.018023298335773701f, 0.017256427300120978f, 0.016489546112956454f, + 0.015722655225417017f, + 0.014955755088644378f, 0.014188846153786343f, 0.013421928871995907f, + 0.012655003694430301f, + 0.011888071072252072f, 0.011121131456628141f, 0.010354185298728884f, + 0.009587233049729183f, + 0.008820275160807512f, 0.008053312083144991f, 0.007286344267926684f, + 0.006519372166339549f, + 0.005752396229573737f, 0.004985416908821652f, 0.004218434655277024f, + 0.003451449920135975f, + 0.002684463154596083f, 0.001917474809855460f, 0.001150485337113809f, + 0.000383495187571497f +}; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_8192) + const float32_t Weights_8192[16384] = { + 1.000000000000000000f, -0.000000000000000000f, 0.999999981616429330f, + -0.000191747597310703f, + 0.999999926465717890f, -0.000383495187571396f, 0.999999834547867670f, + -0.000575242763732066f, + 0.999999705862882230f, -0.000766990318742704f, 0.999999540410766110f, + -0.000958737845553301f, + 0.999999338191525530f, -0.001150485337113849f, 0.999999099205167830f, + -0.001342232786374338f, + 0.999998823451701880f, -0.001533980186284766f, 0.999998510931137790f, + -0.001725727529795126f, + 0.999998161643486980f, -0.001917474809855419f, 0.999997775588762350f, + -0.002109222019415644f, + 0.999997352766978210f, -0.002300969151425805f, 0.999996893178149880f, + -0.002492716198835908f, + 0.999996396822294350f, -0.002684463154595962f, 0.999995863699429940f, + -0.002876210011655979f, + 0.999995293809576190f, -0.003067956762965976f, 0.999994687152754080f, + -0.003259703401475973f, + 0.999994043728985820f, -0.003451449920135994f, 0.999993363538295150f, + -0.003643196311896068f, + 0.999992646580707190f, -0.003834942569706228f, 0.999991892856248010f, + -0.004026688686516512f, + 0.999991102364945590f, -0.004218434655276963f, 0.999990275106828920f, + -0.004410180468937631f, + 0.999989411081928400f, -0.004601926120448571f, 0.999988510290275690f, + -0.004793671602759841f, + 0.999987572731904080f, -0.004985416908821511f, 0.999986598406848000f, + -0.005177162031583651f, + 0.999985587315143200f, -0.005368906963996343f, 0.999984539456826970f, + -0.005560651699009674f, + 0.999983454831937730f, -0.005752396229573736f, 0.999982333440515350f, + -0.005944140548638633f, + 0.999981175282601110f, -0.006135884649154475f, 0.999979980358237650f, + -0.006327628524071378f, + 0.999978748667468830f, -0.006519372166339468f, 0.999977480210339940f, + -0.006711115568908879f, + 0.999976174986897610f, -0.006902858724729756f, 0.999974832997189810f, + -0.007094601626752250f, + 0.999973454241265940f, -0.007286344267926521f, 0.999972038719176730f, + -0.007478086641202744f, + 0.999970586430974140f, -0.007669828739531097f, 0.999969097376711580f, + -0.007861570555861772f, + 0.999967571556443780f, -0.008053312083144972f, 0.999966008970226920f, + -0.008245053314330906f, + 0.999964409618118280f, -0.008436794242369799f, 0.999962773500176930f, + -0.008628534860211886f, + 0.999961100616462820f, -0.008820275160807412f, 0.999959390967037450f, + -0.009012015137106633f, + 0.999957644551963900f, -0.009203754782059819f, 0.999955861371306100f, + -0.009395494088617252f, + 0.999954041425129780f, -0.009587233049729225f, 0.999952184713501780f, + -0.009778971658346044f, + 0.999950291236490480f, -0.009970709907418031f, 0.999948360994165400f, + -0.010162447789895513f, + 0.999946393986597460f, -0.010354185298728842f, 0.999944390213859060f, + -0.010545922426868378f, + 0.999942349676023910f, -0.010737659167264491f, 0.999940272373166960f, + -0.010929395512867571f, + 0.999938158305364590f, -0.011121131456628021f, 0.999936007472694620f, + -0.011312866991496258f, + 0.999933819875236000f, -0.011504602110422714f, 0.999931595513069200f, + -0.011696336806357838f, + 0.999929334386276070f, -0.011888071072252092f, 0.999927036494939640f, + -0.012079804901055957f, + 0.999924701839144500f, -0.012271538285719925f, 0.999922330418976490f, + -0.012463271219194511f, + 0.999919922234522750f, -0.012655003694430242f, 0.999917477285871770f, + -0.012846735704377662f, + 0.999914995573113470f, -0.013038467241987334f, 0.999912477096339240f, + -0.013230198300209835f, + 0.999909921855641540f, -0.013421928871995765f, 0.999907329851114300f, + -0.013613658950295740f, + 0.999904701082852900f, -0.013805388528060391f, 0.999902035550953920f, + -0.013997117598240367f, + 0.999899333255515390f, -0.014188846153786345f, 0.999896594196636680f, + -0.014380574187649006f, + 0.999893818374418490f, -0.014572301692779064f, 0.999891005788962950f, + -0.014764028662127246f, + 0.999888156440373320f, -0.014955755088644296f, 0.999885270328754520f, + -0.015147480965280987f, + 0.999882347454212560f, -0.015339206284988100f, 0.999879387816854930f, + -0.015530931040716447f, + 0.999876391416790410f, -0.015722655225416857f, 0.999873358254129260f, + -0.015914378832040183f, + 0.999870288328982950f, -0.016106101853537287f, 0.999867181641464380f, + -0.016297824282859065f, + 0.999864038191687680f, -0.016489546112956437f, 0.999860857979768540f, + -0.016681267336780332f, + 0.999857641005823860f, -0.016872987947281710f, 0.999854387269971890f, + -0.017064707937411563f, + 0.999851096772332190f, -0.017256427300120877f, 0.999847769513025900f, + -0.017448146028360693f, + 0.999844405492175240f, -0.017639864115082053f, 0.999841004709904000f, + -0.017831581553236039f, + 0.999837567166337090f, -0.018023298335773746f, 0.999834092861600960f, + -0.018215014455646290f, + 0.999830581795823400f, -0.018406729905804820f, 0.999827033969133420f, + -0.018598444679200511f, + 0.999823449381661570f, -0.018790158768784555f, 0.999819828033539420f, + -0.018981872167508178f, + 0.999816169924900410f, -0.019173584868322623f, 0.999812475055878780f, + -0.019365296864179156f, + 0.999808743426610520f, -0.019557008148029083f, 0.999804975037232870f, + -0.019748718712823729f, + 0.999801169887884260f, -0.019940428551514441f, 0.999797327978704690f, + -0.020132137657052594f, + 0.999793449309835270f, -0.020323846022389593f, 0.999789533881418780f, + -0.020515553640476875f, + 0.999785581693599210f, -0.020707260504265895f, 0.999781592746521670f, + -0.020898966606708137f, + 0.999777567040332940f, -0.021090671940755121f, 0.999773504575180990f, + -0.021282376499358387f, + 0.999769405351215280f, -0.021474080275469508f, 0.999765269368586450f, + -0.021665783262040078f, + 0.999761096627446610f, -0.021857485452021735f, 0.999756887127949080f, + -0.022049186838366135f, + 0.999752640870248840f, -0.022240887414024961f, 0.999748357854501780f, + -0.022432587171949934f, + 0.999744038080865430f, -0.022624286105092803f, 0.999739681549498660f, + -0.022815984206405345f, + 0.999735288260561680f, -0.023007681468839369f, 0.999730858214216030f, + -0.023199377885346720f, + 0.999726391410624470f, -0.023391073448879258f, 0.999721887849951310f, + -0.023582768152388894f, + 0.999717347532362190f, -0.023774461988827555f, 0.999712770458023870f, + -0.023966154951147210f, + 0.999708156627104880f, -0.024157847032299864f, 0.999703506039774650f, + -0.024349538225237534f, + 0.999698818696204250f, -0.024541228522912288f, 0.999694094596566000f, + -0.024732917918276223f, + 0.999689333741033640f, -0.024924606404281468f, 0.999684536129782140f, + -0.025116293973880186f, + 0.999679701762987930f, -0.025307980620024571f, 0.999674830640828740f, + -0.025499666335666853f, + 0.999669922763483760f, -0.025691351113759295f, 0.999664978131133310f, + -0.025883034947254198f, + 0.999659996743959220f, -0.026074717829103901f, 0.999654978602144690f, + -0.026266399752260760f, + 0.999649923705874240f, -0.026458080709677187f, 0.999644832055333610f, + -0.026649760694305618f, + 0.999639703650710200f, -0.026841439699098531f, 0.999634538492192300f, + -0.027033117717008431f, + 0.999629336579970110f, -0.027224794740987875f, 0.999624097914234570f, + -0.027416470763989436f, + 0.999618822495178640f, -0.027608145778965740f, 0.999613510322995950f, + -0.027799819778869445f, + 0.999608161397882110f, -0.027991492756653243f, 0.999602775720033530f, + -0.028183164705269874f, + 0.999597353289648380f, -0.028374835617672099f, 0.999591894106925950f, + -0.028566505486812728f, + 0.999586398172067070f, -0.028758174305644615f, 0.999580865485273700f, + -0.028949842067120635f, + 0.999575296046749220f, -0.029141508764193722f, 0.999569689856698580f, + -0.029333174389816835f, + 0.999564046915327740f, -0.029524838936942976f, 0.999558367222844300f, + -0.029716502398525191f, + 0.999552650779456990f, -0.029908164767516555f, 0.999546897585375960f, + -0.030099826036870198f, + 0.999541107640812940f, -0.030291486199539284f, 0.999535280945980540f, + -0.030483145248477009f, + 0.999529417501093140f, -0.030674803176636626f, 0.999523517306366350f, + -0.030866459976971412f, + 0.999517580362016990f, -0.031058115642434700f, 0.999511606668263440f, + -0.031249770165979861f, + 0.999505596225325310f, -0.031441423540560301f, 0.999499549033423640f, + -0.031633075759129478f, + 0.999493465092780590f, -0.031824726814640887f, 0.999487344403620080f, + -0.032016376700048060f, + 0.999481186966166950f, -0.032208025408304586f, 0.999474992780647780f, + -0.032399672932364086f, + 0.999468761847290050f, -0.032591319265180226f, 0.999462494166323160f, + -0.032782964399706724f, + 0.999456189737977340f, -0.032974608328897335f, 0.999449848562484530f, + -0.033166251045705857f, + 0.999443470640077770f, -0.033357892543086139f, 0.999437055970991530f, + -0.033549532813992068f, + 0.999430604555461730f, -0.033741171851377580f, 0.999424116393725640f, + -0.033932809648196664f, + 0.999417591486021720f, -0.034124446197403326f, 0.999411029832589780f, + -0.034316081491951651f, + 0.999404431433671300f, -0.034507715524795750f, 0.999397796289508640f, + -0.034699348288889799f, + 0.999391124400346050f, -0.034890979777188004f, 0.999384415766428560f, + -0.035082609982644619f, + 0.999377670388002850f, -0.035274238898213947f, 0.999370888265317170f, + -0.035465866516850353f, + 0.999364069398620550f, -0.035657492831508222f, 0.999357213788164000f, + -0.035849117835142018f, + 0.999350321434199440f, -0.036040741520706229f, 0.999343392336980220f, + -0.036232363881155395f, + 0.999336426496761240f, -0.036423984909444110f, 0.999329423913798420f, + -0.036615604598527030f, + 0.999322384588349540f, -0.036807222941358832f, 0.999315308520673070f, + -0.036998839930894263f, + 0.999308195711029470f, -0.037190455560088119f, 0.999301046159680070f, + -0.037382069821895229f, + 0.999293859866887790f, -0.037573682709270494f, 0.999286636832916740f, + -0.037765294215168860f, + 0.999279377058032710f, -0.037956904332545310f, 0.999272080542502610f, + -0.038148513054354891f, + 0.999264747286594420f, -0.038340120373552694f, 0.999257377290578060f, + -0.038531726283093870f, + 0.999249970554724420f, -0.038723330775933623f, 0.999242527079305830f, + -0.038914933845027193f, + 0.999235046864595850f, -0.039106535483329888f, 0.999227529910869610f, + -0.039298135683797059f, + 0.999219976218403530f, -0.039489734439384118f, 0.999212385787475290f, + -0.039681331743046527f, + 0.999204758618363890f, -0.039872927587739811f, 0.999197094711349880f, + -0.040064521966419520f, + 0.999189394066714920f, -0.040256114872041282f, 0.999181656684742350f, + -0.040447706297560782f, + 0.999173882565716380f, -0.040639296235933736f, 0.999166071709923000f, + -0.040830884680115948f, + 0.999158224117649430f, -0.041022471623063238f, 0.999150339789184110f, + -0.041214057057731519f, + 0.999142418724816910f, -0.041405640977076739f, 0.999134460924839150f, + -0.041597223374054894f, + 0.999126466389543390f, -0.041788804241622061f, 0.999118435119223490f, + -0.041980383572734356f, + 0.999110367114174890f, -0.042171961360347947f, 0.999102262374694130f, + -0.042363537597419072f, + 0.999094120901079070f, -0.042555112276904020f, 0.999085942693629270f, + -0.042746685391759132f, + 0.999077727752645360f, -0.042938256934940820f, 0.999069476078429330f, + -0.043129826899405546f, + 0.999061187671284600f, -0.043321395278109825f, 0.999052862531515930f, + -0.043512962064010237f, + 0.999044500659429290f, -0.043704527250063421f, 0.999036102055332330f, + -0.043896090829226068f, + 0.999027666719533690f, -0.044087652794454944f, 0.999019194652343460f, + -0.044279213138706849f, + 0.999010685854073380f, -0.044470771854938668f, 0.999002140325035980f, + -0.044662328936107325f, + 0.998993558065545680f, -0.044853884375169815f, 0.998984939075918010f, + -0.045045438165083197f, + 0.998976283356469820f, -0.045236990298804590f, 0.998967590907519300f, + -0.045428540769291155f, + 0.998958861729386080f, -0.045620089569500144f, 0.998950095822391250f, + -0.045811636692388844f, + 0.998941293186856870f, -0.046003182130914623f, 0.998932453823106690f, + -0.046194725878034908f, + 0.998923577731465780f, -0.046386267926707157f, 0.998914664912260440f, + -0.046577808269888943f, + 0.998905715365818290f, -0.046769346900537863f, 0.998896729092468410f, + -0.046960883811611592f, + 0.998887706092541290f, -0.047152418996067869f, 0.998878646366368690f, + -0.047343952446864478f, + 0.998869549914283560f, -0.047535484156959303f, 0.998860416736620520f, + -0.047727014119310254f, + 0.998851246833715180f, -0.047918542326875327f, 0.998842040205904840f, + -0.048110068772612591f, + 0.998832796853527990f, -0.048301593449480144f, 0.998823516776924490f, + -0.048493116350436176f, + 0.998814199976435390f, -0.048684637468438943f, 0.998804846452403420f, + -0.048876156796446760f, + 0.998795456205172410f, -0.049067674327418015f, 0.998786029235087640f, + -0.049259190054311140f, + 0.998776565542495610f, -0.049450703970084664f, 0.998767065127744380f, + -0.049642216067697156f, + 0.998757527991183340f, -0.049833726340107277f, 0.998747954133162860f, + -0.050025234780273729f, + 0.998738343554035230f, -0.050216741381155311f, 0.998728696254153720f, + -0.050408246135710856f, + 0.998719012233872940f, -0.050599749036899282f, 0.998709291493549030f, + -0.050791250077679581f, + 0.998699534033539280f, -0.050982749251010803f, 0.998689739854202620f, + -0.051174246549852080f, + 0.998679908955899090f, -0.051365741967162593f, 0.998670041338990070f, + -0.051557235495901611f, + 0.998660137003838490f, -0.051748727129028456f, 0.998650195950808280f, + -0.051940216859502536f, + 0.998640218180265270f, -0.052131704680283324f, 0.998630203692576050f, + -0.052323190584330347f, + 0.998620152488108870f, -0.052514674564603223f, 0.998610064567233340f, + -0.052706156614061632f, + 0.998599939930320370f, -0.052897636725665324f, 0.998589778577742230f, + -0.053089114892374133f, + 0.998579580509872500f, -0.053280591107147945f, 0.998569345727086110f, + -0.053472065362946727f, + 0.998559074229759310f, -0.053663537652730520f, 0.998548766018269920f, + -0.053855007969459440f, + 0.998538421092996730f, -0.054046476306093660f, 0.998528039454320230f, + -0.054237942655593452f, + 0.998517621102622210f, -0.054429407010919133f, 0.998507166038285490f, + -0.054620869365031105f, + 0.998496674261694640f, -0.054812329710889854f, 0.998486145773235360f, + -0.055003788041455920f, + 0.998475580573294770f, -0.055195244349689934f, 0.998464978662261250f, + -0.055386698628552597f, + 0.998454340040524800f, -0.055578150871004678f, 0.998443664708476340f, + -0.055769601070007030f, + 0.998432952666508440f, -0.055961049218520569f, 0.998422203915015020f, + -0.056152495309506292f, + 0.998411418454391300f, -0.056343939335925290f, 0.998400596285033640f, + -0.056535381290738700f, + 0.998389737407340160f, -0.056726821166907748f, 0.998378841821709990f, + -0.056918258957393740f, + 0.998367909528543820f, -0.057109694655158062f, 0.998356940528243420f, + -0.057301128253162158f, + 0.998345934821212370f, -0.057492559744367566f, 0.998334892407855000f, + -0.057683989121735904f, + 0.998323813288577560f, -0.057875416378228857f, 0.998312697463787260f, + -0.058066841506808194f, + 0.998301544933892890f, -0.058258264500435752f, 0.998290355699304350f, + -0.058449685352073476f, + 0.998279129760433200f, -0.058641104054683341f, 0.998267867117692110f, + -0.058832520601227435f, + 0.998256567771495180f, -0.059023934984667931f, 0.998245231722257880f, + -0.059215347197967061f, + 0.998233858970396850f, -0.059406757234087150f, 0.998222449516330550f, + -0.059598165085990591f, + 0.998211003360478190f, -0.059789570746639868f, 0.998199520503260660f, + -0.059980974208997548f, + 0.998188000945100300f, -0.060172375466026259f, 0.998176444686420530f, + -0.060363774510688743f, + 0.998164851727646240f, -0.060555171335947788f, 0.998153222069203760f, + -0.060746565934766288f, + 0.998141555711520520f, -0.060937958300107203f, 0.998129852655025630f, + -0.061129348424933588f, + 0.998118112900149180f, -0.061320736302208578f, 0.998106336447323050f, + -0.061512121924895378f, + 0.998094523296980010f, -0.061703505285957298f, 0.998082673449554590f, + -0.061894886378357716f, + 0.998070786905482340f, -0.062086265195060088f, 0.998058863665200250f, + -0.062277641729027972f, + 0.998046903729146840f, -0.062469015973224996f, 0.998034907097761770f, + -0.062660387920614874f, + 0.998022873771486240f, -0.062851757564161406f, 0.998010803750762450f, + -0.063043124896828492f, + 0.997998697036034390f, -0.063234489911580066f, 0.997986553627747020f, + -0.063425852601380228f, + 0.997974373526346990f, -0.063617212959193106f, 0.997962156732281950f, + -0.063808570977982898f, + 0.997949903246001190f, -0.063999926650713940f, 0.997937613067955250f, + -0.064191279970350637f, + 0.997925286198596000f, -0.064382630929857465f, 0.997912922638376610f, + -0.064573979522198982f, + 0.997900522387751620f, -0.064765325740339885f, 0.997888085447177110f, + -0.064956669577244872f, + 0.997875611817110150f, -0.065148011025878833f, 0.997863101498009500f, + -0.065339350079206632f, + 0.997850554490335110f, -0.065530686730193327f, 0.997837970794548280f, + -0.065722020971803990f, + 0.997825350411111640f, -0.065913352797003805f, 0.997812693340489280f, + -0.066104682198758077f, + 0.997799999583146470f, -0.066296009170032130f, 0.997787269139549960f, + -0.066487333703791451f, + 0.997774502010167820f, -0.066678655793001557f, 0.997761698195469560f, + -0.066869975430628115f, + 0.997748857695925690f, -0.067061292609636822f, 0.997735980512008620f, + -0.067252607322993499f, + 0.997723066644191640f, -0.067443919563664051f, 0.997710116092949570f, + -0.067635229324614479f, + 0.997697128858758500f, -0.067826536598810869f, 0.997684104942096030f, + -0.068017841379219388f, + 0.997671044343441000f, -0.068209143658806329f, 0.997657947063273710f, + -0.068400443430538013f, + 0.997644813102075420f, -0.068591740687380942f, 0.997631642460329320f, + -0.068783035422301630f, + 0.997618435138519550f, -0.068974327628266746f, 0.997605191137131640f, + -0.069165617298242985f, + 0.997591910456652630f, -0.069356904425197208f, 0.997578593097570800f, + -0.069548189002096306f, + 0.997565239060375750f, -0.069739471021907307f, 0.997551848345558430f, + -0.069930750477597309f, + 0.997538420953611340f, -0.070122027362133521f, 0.997524956885027960f, + -0.070313301668483250f, + 0.997511456140303450f, -0.070504573389613856f, 0.997497918719934210f, + -0.070695842518492855f, + 0.997484344624417930f, -0.070887109048087801f, 0.997470733854253670f, + -0.071078372971366405f, + 0.997457086409941910f, -0.071269634281296401f, 0.997443402291984360f, + -0.071460892970845680f, + 0.997429681500884180f, -0.071652149032982212f, 0.997415924037145960f, + -0.071843402460674027f, + 0.997402129901275300f, -0.072034653246889332f, 0.997388299093779460f, + -0.072225901384596322f, + 0.997374431615167150f, -0.072417146866763413f, 0.997360527465947940f, + -0.072608389686358993f, + 0.997346586646633230f, -0.072799629836351673f, 0.997332609157735470f, + -0.072990867309710036f, + 0.997318594999768600f, -0.073182102099402888f, 0.997304544173247990f, + -0.073373334198399032f, + 0.997290456678690210f, -0.073564563599667426f, 0.997276332516613180f, + -0.073755790296177098f, + 0.997262171687536170f, -0.073947014280897200f, 0.997247974191979860f, + -0.074138235546796979f, + 0.997233740030466280f, -0.074329454086845756f, 0.997219469203518670f, + -0.074520669894013000f, + 0.997205161711661850f, -0.074711882961268211f, 0.997190817555421940f, + -0.074903093281581082f, + 0.997176436735326190f, -0.075094300847921305f, 0.997162019251903290f, + -0.075285505653258769f, + 0.997147565105683480f, -0.075476707690563388f, 0.997133074297198110f, + -0.075667906952805231f, + 0.997118546826979980f, -0.075859103432954447f, 0.997103982695563330f, + -0.076050297123981259f, + 0.997089381903483400f, -0.076241488018856066f, 0.997074744451277310f, + -0.076432676110549283f, + 0.997060070339482960f, -0.076623861392031492f, 0.997045359568640040f, + -0.076815043856273343f, + 0.997030612139289450f, -0.077006223496245640f, 0.997015828051973310f, + -0.077197400304919200f, + 0.997001007307235290f, -0.077388574275265049f, 0.996986149905620180f, + -0.077579745400254224f, + 0.996971255847674320f, -0.077770913672857947f, 0.996956325133945280f, + -0.077962079086047492f, + 0.996941357764982160f, -0.078153241632794232f, 0.996926353741335090f, + -0.078344401306069705f, + 0.996911313063555740f, -0.078535558098845479f, 0.996896235732197210f, + -0.078726712004093299f, + 0.996881121747813850f, -0.078917863014784942f, 0.996865971110961310f, + -0.079109011123892375f, + 0.996850783822196610f, -0.079300156324387597f, 0.996835559882078170f, + -0.079491298609242769f, + 0.996820299291165670f, -0.079682437971430126f, 0.996805002050020430f, + -0.079873574403921996f, + 0.996789668159204560f, -0.080064707899690890f, 0.996774297619282050f, + -0.080255838451709319f, + 0.996758890430818000f, -0.080446966052950014f, 0.996743446594378860f, + -0.080638090696385709f, + 0.996727966110532490f, -0.080829212374989329f, 0.996712448979848010f, + -0.081020331081733857f, + 0.996696895202896060f, -0.081211446809592441f, 0.996681304780248300f, + -0.081402559551538245f, + 0.996665677712478160f, -0.081593669300544652f, 0.996650014000160070f, + -0.081784776049585076f, + 0.996634313643869900f, -0.081975879791633066f, 0.996618576644185070f, + -0.082166980519662314f, + 0.996602803001684130f, -0.082358078226646536f, 0.996586992716946950f, + -0.082549172905559673f, + 0.996571145790554840f, -0.082740264549375692f, 0.996555262223090540f, + -0.082931353151068699f, + 0.996539342015137940f, -0.083122438703612911f, 0.996523385167282450f, + -0.083313521199982685f, + 0.996507391680110820f, -0.083504600633152432f, 0.996491361554210920f, + -0.083695676996096716f, + 0.996475294790172160f, -0.083886750281790226f, 0.996459191388585410f, + -0.084077820483207694f, + 0.996443051350042630f, -0.084268887593324071f, 0.996426874675137240f, + -0.084459951605114325f, + 0.996410661364464100f, -0.084651012511553617f, 0.996394411418619290f, + -0.084842070305617134f, + 0.996378124838200210f, -0.085033124980280275f, 0.996361801623805720f, + -0.085224176528518478f, + 0.996345441776035900f, -0.085415224943307333f, 0.996329045295492380f, + -0.085606270217622529f, + 0.996312612182778000f, -0.085797312344439894f, 0.996296142438496850f, + -0.085988351316735337f, + 0.996279636063254650f, -0.086179387127484894f, 0.996263093057658140f, + -0.086370419769664752f, + 0.996246513422315520f, -0.086561449236251170f, 0.996229897157836500f, + -0.086752475520220543f, + 0.996213244264832040f, -0.086943498614549378f, 0.996196554743914220f, + -0.087134518512214307f, + 0.996179828595696980f, -0.087325535206192059f, 0.996163065820794950f, + -0.087516548689459531f, + 0.996146266419824620f, -0.087707558954993659f, 0.996129430393403740f, + -0.087898565995771588f, + 0.996112557742151130f, -0.088089569804770507f, 0.996095648466687300f, + -0.088280570374967740f, + 0.996078702567633980f, -0.088471567699340767f, 0.996061720045614000f, + -0.088662561770867149f, + 0.996044700901251970f, -0.088853552582524600f, 0.996027645135173610f, + -0.089044540127290892f, + 0.996010552748005870f, -0.089235524398144014f, 0.995993423740377360f, + -0.089426505388061961f, + 0.995976258112917790f, -0.089617483090022959f, 0.995959055866258320f, + -0.089808457497005278f, + 0.995941817001031350f, -0.089999428601987341f, 0.995924541517870800f, + -0.090190396397947695f, + 0.995907229417411720f, -0.090381360877864983f, 0.995889880700290720f, + -0.090572322034717989f, + 0.995872495367145730f, -0.090763279861485621f, 0.995855073418615790f, + -0.090954234351146926f, + 0.995837614855341610f, -0.091145185496681005f, 0.995820119677964910f, + -0.091336133291067184f, + 0.995802587887129160f, -0.091527077727284828f, 0.995785019483478750f, + -0.091718018798313455f, + 0.995767414467659820f, -0.091908956497132724f, 0.995749772840319510f, + -0.092099890816722388f, + 0.995732094602106430f, -0.092290821750062355f, 0.995714379753670610f, + -0.092481749290132600f, + 0.995696628295663520f, -0.092672673429913310f, 0.995678840228737540f, + -0.092863594162384724f, + 0.995661015553546910f, -0.093054511480527249f, 0.995643154270746900f, + -0.093245425377321375f, + 0.995625256380994310f, -0.093436335845747787f, 0.995607321884947050f, + -0.093627242878787195f, + 0.995589350783264600f, -0.093818146469420549f, 0.995571343076607770f, + -0.094009046610628838f, + 0.995553298765638470f, -0.094199943295393204f, 0.995535217851020390f, + -0.094390836516694943f, + 0.995517100333418110f, -0.094581726267515445f, 0.995498946213497770f, + -0.094772612540836243f, + 0.995480755491926940f, -0.094963495329638992f, 0.995462528169374420f, + -0.095154374626905486f, + 0.995444264246510340f, -0.095345250425617617f, 0.995425963724006160f, + -0.095536122718757471f, + 0.995407626602534900f, -0.095726991499307162f, 0.995389252882770690f, + -0.095917856760249040f, + 0.995370842565388990f, -0.096108718494565509f, 0.995352395651066810f, + -0.096299576695239128f, + 0.995333912140482280f, -0.096490431355252593f, 0.995315392034315070f, + -0.096681282467588725f, + 0.995296835333246090f, -0.096872130025230471f, 0.995278242037957670f, + -0.097062974021160917f, + 0.995259612149133390f, -0.097253814448363271f, 0.995240945667458130f, + -0.097444651299820870f, + 0.995222242593618360f, -0.097635484568517200f, 0.995203502928301510f, + -0.097826314247435861f, + 0.995184726672196930f, -0.098017140329560604f, 0.995165913825994620f, + -0.098207962807875276f, + 0.995147064390386470f, -0.098398781675363881f, 0.995128178366065490f, + -0.098589596925010584f, + 0.995109255753726110f, -0.098780408549799623f, 0.995090296554064000f, + -0.098971216542715429f, + 0.995071300767776170f, -0.099162020896742503f, 0.995052268395561050f, + -0.099352821604865540f, + 0.995033199438118630f, -0.099543618660069319f, 0.995014093896149700f, + -0.099734412055338825f, + 0.994994951770357020f, -0.099925201783659073f, 0.994975773061444140f, + -0.100115987838015310f, + 0.994956557770116380f, -0.100306770211392860f, 0.994937305897080070f, + -0.100497548896777200f, + 0.994918017443043200f, -0.100688323887153960f, 0.994898692408714870f, + -0.100879095175508860f, + 0.994879330794805620f, -0.101069862754827820f, 0.994859932602027320f, + -0.101260626618096830f, + 0.994840497831093180f, -0.101451386758302080f, 0.994821026482717860f, + -0.101642143168429830f, + 0.994801518557617110f, -0.101832895841466530f, 0.994781974056508260f, + -0.102023644770398740f, + 0.994762392980109930f, -0.102214389948213210f, 0.994742775329142010f, + -0.102405131367896720f, + 0.994723121104325700f, -0.102595869022436280f, 0.994703430306383860f, + -0.102786602904819040f, + 0.994683702936040250f, -0.102977333008032220f, 0.994663938994020390f, + -0.103168059325063230f, + 0.994644138481050710f, -0.103358781848899610f, 0.994624301397859400f, + -0.103549500572529070f, + 0.994604427745175660f, -0.103740215488939370f, 0.994584517523730340f, + -0.103930926591118510f, + 0.994564570734255420f, -0.104121633872054590f, 0.994544587377484300f, + -0.104312337324735800f, + 0.994524567454151740f, -0.104503036942150570f, 0.994504510964993700f, + -0.104693732717287390f, + 0.994484417910747600f, -0.104884424643134970f, 0.994464288292152390f, + -0.105075112712682040f, + 0.994444122109948040f, -0.105265796918917600f, 0.994423919364875950f, + -0.105456477254830710f, + 0.994403680057679100f, -0.105647153713410620f, 0.994383404189101430f, + -0.105837826287646670f, + 0.994363091759888570f, -0.106028494970528410f, 0.994342742770787270f, + -0.106219159755045480f, + 0.994322357222545810f, -0.106409820634187680f, 0.994301935115913580f, + -0.106600477600944960f, + 0.994281476451641550f, -0.106791130648307390f, 0.994260981230481790f, + -0.106981779769265230f, + 0.994240449453187900f, -0.107172424956808840f, 0.994219881120514960f, + -0.107363066203928760f, + 0.994199276233218910f, -0.107553703503615620f, 0.994178634792057590f, + -0.107744336848860280f, + 0.994157956797789730f, -0.107934966232653650f, 0.994137242251175720f, + -0.108125591647986870f, + 0.994116491152977070f, -0.108316213087851170f, 0.994095703503956930f, + -0.108506830545237920f, + 0.994074879304879370f, -0.108697444013138720f, 0.994054018556510210f, + -0.108888053484545190f, + 0.994033121259616400f, -0.109078658952449240f, 0.994012187414966220f, + -0.109269260409842780f, + 0.993991217023329380f, -0.109459857849717980f, 0.993970210085476920f, + -0.109650451265067100f, + 0.993949166602181130f, -0.109841040648882600f, 0.993928086574215830f, + -0.110031625994157000f, + 0.993906970002356060f, -0.110222207293883060f, 0.993885816887378090f, + -0.110412784541053630f, + 0.993864627230059750f, -0.110603357728661730f, 0.993843401031180180f, + -0.110793926849700560f, + 0.993822138291519660f, -0.110984491897163390f, 0.993800839011860120f, + -0.111175052864043720f, + 0.993779503192984580f, -0.111365609743335160f, 0.993758130835677430f, + -0.111556162528031480f, + 0.993736721940724600f, -0.111746711211126590f, 0.993715276508913230f, + -0.111937255785614570f, + 0.993693794541031790f, -0.112127796244489640f, 0.993672276037870010f, + -0.112318332580746170f, + 0.993650721000219120f, -0.112508864787378690f, 0.993629129428871720f, + -0.112699392857381860f, + 0.993607501324621610f, -0.112889916783750520f, 0.993585836688263950f, + -0.113080436559479620f, + 0.993564135520595300f, -0.113270952177564350f, 0.993542397822413600f, + -0.113461463630999950f, + 0.993520623594518090f, -0.113651970912781870f, 0.993498812837709360f, + -0.113842474015905710f, + 0.993476965552789190f, -0.114032972933367200f, 0.993455081740560960f, + -0.114223467658162260f, + 0.993433161401829360f, -0.114413958183286920f, 0.993411204537400060f, + -0.114604444501737420f, + 0.993389211148080650f, -0.114794926606510080f, 0.993367181234679600f, + -0.114985404490601460f, + 0.993345114798006910f, -0.115175878147008190f, 0.993323011838873950f, + -0.115366347568727140f, + 0.993300872358093280f, -0.115556812748755260f, 0.993278696356479030f, + -0.115747273680089720f, + 0.993256483834846440f, -0.115937730355727780f, 0.993234234794012290f, + -0.116128182768666930f, + 0.993211949234794500f, -0.116318630911904750f, 0.993189627158012620f, + -0.116509074778439040f, + 0.993167268564487230f, -0.116699514361267690f, 0.993144873455040430f, + -0.116889949653388780f, + 0.993122441830495580f, -0.117080380647800590f, 0.993099973691677570f, + -0.117270807337501460f, + 0.993077469039412300f, -0.117461229715489990f, 0.993054927874527320f, + -0.117651647774764860f, + 0.993032350197851410f, -0.117842061508324980f, 0.993009736010214580f, + -0.118032470909169340f, + 0.992987085312448390f, -0.118222875970297170f, 0.992964398105385610f, + -0.118413276684707790f, + 0.992941674389860470f, -0.118603673045400720f, 0.992918914166708300f, + -0.118794065045375640f, + 0.992896117436765980f, -0.118984452677632340f, 0.992873284200871730f, + -0.119174835935170880f, + 0.992850414459865100f, -0.119365214810991350f, 0.992827508214586760f, + -0.119555589298094110f, + 0.992804565465879140f, -0.119745959389479600f, 0.992781586214585570f, + -0.119936325078148470f, + 0.992758570461551140f, -0.120126686357101500f, 0.992735518207621850f, + -0.120317043219339680f, + 0.992712429453645460f, -0.120507395657864130f, 0.992689304200470750f, + -0.120697743665676110f, + 0.992666142448948020f, -0.120888087235777080f, 0.992642944199928820f, + -0.121078426361168640f, + 0.992619709454266140f, -0.121268761034852600f, 0.992596438212814290f, + -0.121459091249830840f, + 0.992573130476428810f, -0.121649416999105530f, 0.992549786245966680f, + -0.121839738275678890f, + 0.992526405522286100f, -0.122030055072553360f, 0.992502988306246950f, + -0.122220367382731540f, + 0.992479534598709970f, -0.122410675199216200f, 0.992456044400537700f, + -0.122600978515010240f, + 0.992432517712593660f, -0.122791277323116770f, 0.992408954535742850f, + -0.122981571616539050f, + 0.992385354870851670f, -0.123171861388280480f, 0.992361718718787870f, + -0.123362146631344680f, + 0.992338046080420420f, -0.123552427338735370f, 0.992314336956619640f, + -0.123742703503456510f, + 0.992290591348257370f, -0.123932975118512160f, 0.992266809256206580f, + -0.124123242176906600f, + 0.992242990681341700f, -0.124313504671644230f, 0.992219135624538450f, + -0.124503762595729660f, + 0.992195244086673920f, -0.124694015942167640f, 0.992171316068626520f, + -0.124884264703963130f, + 0.992147351571276090f, -0.125074508874121170f, 0.992123350595503720f, + -0.125264748445647060f, + 0.992099313142191800f, -0.125454983411546230f, 0.992075239212224070f, + -0.125645213764824290f, + 0.992051128806485720f, -0.125835439498487000f, 0.992026981925863360f, + -0.126025660605540320f, + 0.992002798571244520f, -0.126215877078990350f, 0.991978578743518580f, + -0.126406088911843380f, + 0.991954322443575950f, -0.126596296097105850f, 0.991930029672308480f, + -0.126786498627784410f, + 0.991905700430609330f, -0.126976696496885870f, 0.991881334719373010f, + -0.127166889697417160f, + 0.991856932539495470f, -0.127357078222385400f, 0.991832493891873780f, + -0.127547262064797970f, + 0.991808018777406430f, -0.127737441217662310f, 0.991783507196993490f, + -0.127927615673986080f, + 0.991758959151536110f, -0.128117785426777130f, 0.991734374641936810f, + -0.128307950469043420f, + 0.991709753669099530f, -0.128498110793793170f, 0.991685096233929420f, + -0.128688266394034690f, + 0.991660402337333210f, -0.128878417262776550f, 0.991635671980218740f, + -0.129068563393027410f, + 0.991610905163495370f, -0.129258704777796140f, 0.991586101888073500f, + -0.129448841410091780f, + 0.991561262154865290f, -0.129638973282923560f, 0.991536385964783880f, + -0.129829100389300930f, + 0.991511473318743900f, -0.130019222722233350f, 0.991486524217661480f, + -0.130209340274730630f, + 0.991461538662453790f, -0.130399453039802690f, 0.991436516654039420f, + -0.130589561010459650f, + 0.991411458193338540f, -0.130779664179711710f, 0.991386363281272280f, + -0.130969762540569380f, + 0.991361231918763460f, -0.131159856086043270f, 0.991336064106736140f, + -0.131349944809144190f, + 0.991310859846115440f, -0.131540028702883120f, 0.991285619137828200f, + -0.131730107760271160f, + 0.991260341982802440f, -0.131920181974319790f, 0.991235028381967420f, + -0.132110251338040360f, + 0.991209678336254060f, -0.132300315844444650f, 0.991184291846594180f, + -0.132490375486544550f, + 0.991158868913921350f, -0.132680430257352070f, 0.991133409539170170f, + -0.132870480149879430f, + 0.991107913723276890f, -0.133060525157139060f, 0.991082381467178640f, + -0.133250565272143570f, + 0.991056812771814340f, -0.133440600487905680f, 0.991031207638124130f, + -0.133630630797438340f, + 0.991005566067049370f, -0.133820656193754720f, 0.990979888059532740f, + -0.134010676669868130f, + 0.990954173616518500f, -0.134200692218792020f, 0.990928422738951990f, + -0.134390702833540070f, + 0.990902635427780010f, -0.134580708507126170f, 0.990876811683950700f, + -0.134770709232564350f, + 0.990850951508413620f, -0.134960705002868750f, 0.990825054902119470f, + -0.135150695811053850f, + 0.990799121866020370f, -0.135340681650134210f, 0.990773152401069780f, + -0.135530662513124590f, + 0.990747146508222710f, -0.135720638393039910f, 0.990721104188435180f, + -0.135910609282895330f, + 0.990695025442664630f, -0.136100575175706200f, 0.990668910271870100f, + -0.136290536064487960f, + 0.990642758677011570f, -0.136480491942256280f, 0.990616570659050620f, + -0.136670442802027090f, + 0.990590346218950150f, -0.136860388636816380f, 0.990564085357674370f, + -0.137050329439640410f, + 0.990537788076188750f, -0.137240265203515590f, 0.990511454375460290f, + -0.137430195921458550f, + 0.990485084256457090f, -0.137620121586486040f, 0.990458677720148620f, + -0.137810042191615080f, + 0.990432234767505970f, -0.137999957729862790f, 0.990405755399501260f, + -0.138189868194246560f, + 0.990379239617108160f, -0.138379773577783890f, 0.990352687421301450f, + -0.138569673873492500f, + 0.990326098813057330f, -0.138759569074390350f, 0.990299473793353590f, + -0.138949459173495490f, + 0.990272812363169110f, -0.139139344163826200f, 0.990246114523483990f, + -0.139329224038400980f, + 0.990219380275280000f, -0.139519098790238490f, 0.990192609619540030f, + -0.139708968412357550f, + 0.990165802557248400f, -0.139898832897777210f, 0.990138959089390650f, + -0.140088692239516670f, + 0.990112079216953770f, -0.140278546430595420f, 0.990085162940925970f, + -0.140468395464033000f, + 0.990058210262297120f, -0.140658239332849210f, 0.990031221182058000f, + -0.140848078030064080f, + 0.990004195701200910f, -0.141037911548697710f, 0.989977133820719610f, + -0.141227739881770510f, + 0.989950035541608990f, -0.141417563022303020f, 0.989922900864865450f, + -0.141607380963316020f, + 0.989895729791486660f, -0.141797193697830390f, 0.989868522322471580f, + -0.141987001218867290f, + 0.989841278458820530f, -0.142176803519448030f, 0.989813998201535260f, + -0.142366600592594180f, + 0.989786681551618640f, -0.142556392431327340f, 0.989759328510075200f, + -0.142746179028669460f, + 0.989731939077910570f, -0.142935960377642670f, 0.989704513256131850f, + -0.143125736471269190f, + 0.989677051045747210f, -0.143315507302571500f, 0.989649552447766530f, + -0.143505272864572290f, + 0.989622017463200890f, -0.143695033150294470f, 0.989594446093062460f, + -0.143884788152760980f, + 0.989566838338365120f, -0.144074537864995160f, 0.989539194200123930f, + -0.144264282280020440f, + 0.989511513679355190f, -0.144454021390860470f, 0.989483796777076760f, + -0.144643755190539040f, + 0.989456043494307710f, -0.144833483672080210f, 0.989428253832068230f, + -0.145023206828508220f, + 0.989400427791380380f, -0.145212924652847460f, 0.989372565373267010f, + -0.145402637138122570f, + 0.989344666578752640f, -0.145592344277358340f, 0.989316731408863000f, + -0.145782046063579860f, + 0.989288759864625170f, -0.145971742489812210f, 0.989260751947067640f, + -0.146161433549080900f, + 0.989232707657220050f, -0.146351119234411460f, 0.989204626996113780f, + -0.146540799538829760f, + 0.989176509964781010f, -0.146730474455361750f, 0.989148356564255590f, + -0.146920143977033620f, + 0.989120166795572690f, -0.147109808096871820f, 0.989091940659768800f, + -0.147299466807902850f, + 0.989063678157881540f, -0.147489120103153570f, 0.989035379290950310f, + -0.147678767975650970f, + 0.989007044060015270f, -0.147868410418422220f, 0.988978672466118480f, + -0.148058047424494720f, + 0.988950264510302990f, -0.148247678986896030f, 0.988921820193613190f, + -0.148437305098653970f, + 0.988893339517095130f, -0.148626925752796540f, 0.988864822481795640f, + -0.148816540942351920f, + 0.988836269088763540f, -0.149006150660348450f, 0.988807679339048450f, + -0.149195754899814820f, + 0.988779053233701520f, -0.149385353653779720f, 0.988750390773775360f, + -0.149574946915272230f, + 0.988721691960323780f, -0.149764534677321510f, 0.988692956794401940f, + -0.149954116932956960f, + 0.988664185277066230f, -0.150143693675208190f, 0.988635377409374790f, + -0.150333264897105000f, + 0.988606533192386450f, -0.150522830591677400f, 0.988577652627162020f, + -0.150712390751955610f, + 0.988548735714763200f, -0.150901945370970040f, 0.988519782456253270f, + -0.151091494441751300f, + 0.988490792852696590f, -0.151281037957330220f, 0.988461766905159300f, + -0.151470575910737810f, + 0.988432704614708340f, -0.151660108295005310f, 0.988403605982412390f, + -0.151849635103164180f, + 0.988374471009341280f, -0.152039156328246050f, 0.988345299696566150f, + -0.152228671963282740f, + 0.988316092045159690f, -0.152418182001306330f, 0.988286848056195820f, + -0.152607686435349050f, + 0.988257567730749460f, -0.152797185258443440f, 0.988228251069897420f, + -0.152986678463622040f, + 0.988198898074717610f, -0.153176166043917840f, 0.988169508746289060f, + -0.153365647992363880f, + 0.988140083085692570f, -0.153555124301993450f, 0.988110621094009820f, + -0.153744594965840030f, + 0.988081122772324070f, -0.153934059976937350f, 0.988051588121720110f, + -0.154123519328319360f, + 0.988022017143283530f, -0.154312973013020100f, 0.987992409838101880f, + -0.154502421024073940f, + 0.987962766207263420f, -0.154691863354515430f, 0.987933086251858380f, + -0.154881299997379320f, + 0.987903369972977790f, -0.155070730945700510f, 0.987873617371714200f, + -0.155260156192514240f, + 0.987843828449161740f, -0.155449575730855850f, 0.987814003206415550f, + -0.155638989553760900f, + 0.987784141644572180f, -0.155828397654265230f, 0.987754243764729530f, + -0.156017800025404800f, + 0.987724309567986960f, -0.156207196660215900f, 0.987694339055445130f, + -0.156396587551734880f, + 0.987664332228205710f, -0.156585972692998430f, 0.987634289087372160f, + -0.156775352077043350f, + 0.987604209634049160f, -0.156964725696906780f, 0.987574093869342360f, + -0.157154093545625900f, + 0.987543941794359230f, -0.157343455616238250f, 0.987513753410208420f, + -0.157532811901781530f, + 0.987483528717999710f, -0.157722162395293630f, 0.987453267718844560f, + -0.157911507089812660f, + 0.987422970413855410f, -0.158100845978376980f, 0.987392636804146240f, + -0.158290179054025180f, + 0.987362266890832400f, -0.158479506309795960f, 0.987331860675030430f, + -0.158668827738728310f, + 0.987301418157858430f, -0.158858143333861450f, 0.987270939340435420f, + -0.159047453088234760f, + 0.987240424223882250f, -0.159236756994887850f, 0.987209872809320820f, + -0.159426055046860580f, + 0.987179285097874340f, -0.159615347237193060f, 0.987148661090667570f, + -0.159804633558925440f, + 0.987118000788826280f, -0.159993914005098270f, 0.987087304193477900f, + -0.160183188568752220f, + 0.987056571305750970f, -0.160372457242928280f, 0.987025802126775600f, + -0.160561720020667490f, + 0.986994996657682980f, -0.160750976895011220f, 0.986964154899605650f, + -0.160940227859001080f, + 0.986933276853677710f, -0.161129472905678810f, 0.986902362521034470f, + -0.161318712028086400f, + 0.986871411902812470f, -0.161507945219266120f, 0.986840425000149680f, + -0.161697172472260400f, + 0.986809401814185530f, -0.161886393780111830f, 0.986778342346060430f, + -0.162075609135863330f, + 0.986747246596916590f, -0.162264818532558000f, 0.986716114567897100f, + -0.162454021963239190f, + 0.986684946260146690f, -0.162643219420950310f, 0.986653741674811350f, + -0.162832410898735210f, + 0.986622500813038480f, -0.163021596389637840f, 0.986591223675976400f, + -0.163210775886702380f, + 0.986559910264775410f, -0.163399949382973230f, 0.986528560580586690f, + -0.163589116871495020f, + 0.986497174624562880f, -0.163778278345312670f, 0.986465752397857940f, + -0.163967433797471170f, + 0.986434293901627180f, -0.164156583221015810f, 0.986402799137027220f, + -0.164345726608992190f, + 0.986371268105216030f, -0.164534863954446000f, 0.986339700807353000f, + -0.164723995250423170f, + 0.986308097244598670f, -0.164913120489969890f, 0.986276457418115090f, + -0.165102239666132660f, + 0.986244781329065460f, -0.165291352771958000f, 0.986213068978614490f, + -0.165480459800492780f, + 0.986181320367928270f, -0.165669560744784120f, 0.986149535498173860f, + -0.165858655597879300f, + 0.986117714370520090f, -0.166047744352825790f, 0.986085856986136820f, + -0.166236827002671420f, + 0.986053963346195440f, -0.166425903540464100f, 0.986022033451868560f, + -0.166614973959252090f, + 0.985990067304330140f, -0.166804038252083730f, 0.985958064904755460f, + -0.166993096412007710f, + 0.985926026254321130f, -0.167182148432072940f, 0.985893951354205210f, + -0.167371194305328430f, + 0.985861840205586980f, -0.167560234024823560f, 0.985829692809647050f, + -0.167749267583607890f, + 0.985797509167567480f, -0.167938294974731170f, 0.985765289280531310f, + -0.168127316191243410f, + 0.985733033149723490f, -0.168316331226194830f, 0.985700740776329850f, + -0.168505340072635900f, + 0.985668412161537550f, -0.168694342723617330f, 0.985636047306535420f, + -0.168883339172189980f, + 0.985603646212513400f, -0.169072329411405010f, 0.985571208880662740f, + -0.169261313434313830f, + 0.985538735312176060f, -0.169450291233967960f, 0.985506225508247290f, + -0.169639262803419290f, + 0.985473679470071810f, -0.169828228135719850f, 0.985441097198846210f, + -0.170017187223921950f, + 0.985408478695768420f, -0.170206140061078070f, 0.985375823962037710f, + -0.170395086640240940f, + 0.985343132998854790f, -0.170584026954463590f, 0.985310405807421570f, + -0.170772960996799230f, + 0.985277642388941220f, -0.170961888760301220f, 0.985244842744618540f, + -0.171150810238023280f, + 0.985212006875659350f, -0.171339725423019310f, 0.985179134783271130f, + -0.171528634308343420f, + 0.985146226468662230f, -0.171717536887049970f, 0.985113281933042710f, + -0.171906433152193530f, + 0.985080301177623800f, -0.172095323096829010f, 0.985047284203618200f, + -0.172284206714011370f, + 0.985014231012239840f, -0.172473083996795950f, 0.984981141604703960f, + -0.172661954938238270f, + 0.984948015982227030f, -0.172850819531394080f, 0.984914854146027200f, + -0.173039677769319360f, + 0.984881656097323700f, -0.173228529645070320f, 0.984848421837337010f, + -0.173417375151703470f, + 0.984815151367289140f, -0.173606214282275410f, 0.984781844688403350f, + -0.173795047029843160f, + 0.984748501801904210f, -0.173983873387463820f, 0.984715122709017620f, + -0.174172693348194820f, + 0.984681707410970940f, -0.174361506905093750f, 0.984648255908992630f, + -0.174550314051218510f, + 0.984614768204312600f, -0.174739114779627200f, 0.984581244298162180f, + -0.174927909083378160f, + 0.984547684191773960f, -0.175116696955529920f, 0.984514087886381840f, + -0.175305478389141320f, + 0.984480455383220930f, -0.175494253377271430f, 0.984446786683527920f, + -0.175683021912979490f, + 0.984413081788540700f, -0.175871783989325040f, 0.984379340699498510f, + -0.176060539599367820f, + 0.984345563417641900f, -0.176249288736167880f, 0.984311749944212780f, + -0.176438031392785410f, + 0.984277900280454370f, -0.176626767562280880f, 0.984244014427611110f, + -0.176815497237715000f, + 0.984210092386929030f, -0.177004220412148750f, 0.984176134159655320f, + -0.177192937078643280f, + 0.984142139747038570f, -0.177381647230260040f, 0.984108109150328540f, + -0.177570350860060710f, + 0.984074042370776450f, -0.177759047961107170f, 0.984039939409634970f, + -0.177947738526461560f, + 0.984005800268157870f, -0.178136422549186300f, 0.983971624947600270f, + -0.178325100022344000f, + 0.983937413449218920f, -0.178513770938997510f, 0.983903165774271500f, + -0.178702435292209970f, + 0.983868881924017220f, -0.178891093075044720f, 0.983834561899716630f, + -0.179079744280565390f, + 0.983800205702631600f, -0.179268388901835750f, 0.983765813334025240f, + -0.179457026931919890f, + 0.983731384795162090f, -0.179645658363882160f, 0.983696920087308140f, + -0.179834283190787090f, + 0.983662419211730250f, -0.180022901405699510f, 0.983627882169697210f, + -0.180211513001684450f, + 0.983593308962478650f, -0.180400117971807240f, 0.983558699591345900f, + -0.180588716309133340f, + 0.983524054057571260f, -0.180777308006728590f, 0.983489372362428730f, + -0.180965893057658980f, + 0.983454654507193270f, -0.181154471454990810f, 0.983419900493141540f, + -0.181343043191790540f, + 0.983385110321551180f, -0.181531608261124970f, 0.983350283993701500f, + -0.181720166656061110f, + 0.983315421510872810f, -0.181908718369666160f, 0.983280522874346970f, + -0.182097263395007650f, + 0.983245588085407070f, -0.182285801725153300f, 0.983210617145337640f, + -0.182474333353171120f, + 0.983175610055424420f, -0.182662858272129270f, 0.983140566816954500f, + -0.182851376475096330f, + 0.983105487431216290f, -0.183039887955140950f, 0.983070371899499640f, + -0.183228392705332140f, + 0.983035220223095640f, -0.183416890718739100f, 0.983000032403296590f, + -0.183605381988431270f, + 0.982964808441396440f, -0.183793866507478450f, 0.982929548338690170f, + -0.183982344268950520f, + 0.982894252096474070f, -0.184170815265917720f, 0.982858919716046110f, + -0.184359279491450510f, + 0.982823551198705240f, -0.184547736938619620f, 0.982788146545751970f, + -0.184736187600495950f, + 0.982752705758487830f, -0.184924631470150790f, 0.982717228838215990f, + -0.185113068540655540f, + 0.982681715786240860f, -0.185301498805081900f, 0.982646166603868050f, + -0.185489922256501880f, + 0.982610581292404750f, -0.185678338887987630f, 0.982574959853159240f, + -0.185866748692611660f, + 0.982539302287441240f, -0.186055151663446630f, 0.982503608596561830f, + -0.186243547793565560f, + 0.982467878781833170f, -0.186431937076041610f, 0.982432112844569110f, + -0.186620319503948280f, + 0.982396310786084690f, -0.186808695070359270f, 0.982360472607696210f, + -0.186997063768348540f, + 0.982324598310721280f, -0.187185425590990330f, 0.982288687896478830f, + -0.187373780531359110f, + 0.982252741366289370f, -0.187562128582529600f, 0.982216758721474510f, + -0.187750469737576780f, + 0.982180739963357090f, -0.187938803989575910f, 0.982144685093261580f, + -0.188127131331602420f, + 0.982108594112513610f, -0.188315451756732120f, 0.982072467022440000f, + -0.188503765258040940f, + 0.982036303824369020f, -0.188692071828605230f, 0.982000104519630490f, + -0.188880371461501380f, + 0.981963869109555240f, -0.189068664149806190f, 0.981927597595475540f, + -0.189256949886596750f, + 0.981891289978725100f, -0.189445228664950230f, 0.981854946260638630f, + -0.189633500477944190f, + 0.981818566442552500f, -0.189821765318656410f, 0.981782150525804310f, + -0.190010023180164990f, + 0.981745698511732990f, -0.190198274055548150f, 0.981709210401678800f, + -0.190386517937884470f, + 0.981672686196983110f, -0.190574754820252740f, 0.981636125898989080f, + -0.190762984695732110f, + 0.981599529509040720f, -0.190951207557401800f, 0.981562897028483650f, + -0.191139423398341450f, + 0.981526228458664770f, -0.191327632211630900f, 0.981489523800932130f, + -0.191515833990350210f, + 0.981452783056635520f, -0.191704028727579800f, 0.981416006227125550f, + -0.191892216416400220f, + 0.981379193313754560f, -0.192080397049892440f, 0.981342344317876040f, + -0.192268570621137500f, + 0.981305459240844670f, -0.192456737123216840f, 0.981268538084016710f, + -0.192644896549212100f, + 0.981231580848749730f, -0.192833048892205230f, 0.981194587536402320f, + -0.193021194145278380f, + 0.981157558148334830f, -0.193209332301513960f, 0.981120492685908730f, + -0.193397463353994740f, + 0.981083391150486710f, -0.193585587295803610f, 0.981046253543432780f, + -0.193773704120023820f, + 0.981009079866112630f, -0.193961813819738840f, 0.980971870119892840f, + -0.194149916388032450f, + 0.980934624306141640f, -0.194338011817988600f, 0.980897342426228390f, + -0.194526100102691610f, + 0.980860024481523870f, -0.194714181235225960f, 0.980822670473400100f, + -0.194902255208676520f, + 0.980785280403230430f, -0.195090322016128250f, 0.980747854272389750f, + -0.195278381650666550f, + 0.980710392082253970f, -0.195466434105376980f, 0.980672893834200530f, + -0.195654479373345370f, + 0.980635359529608120f, -0.195842517447657850f, 0.980597789169856850f, + -0.196030548321400790f, + 0.980560182756327840f, -0.196218571987660880f, 0.980522540290404090f, + -0.196406588439524970f, + 0.980484861773469380f, -0.196594597670080220f, 0.980447147206909060f, + -0.196782599672414100f, + 0.980409396592109910f, -0.196970594439614340f, 0.980371609930459800f, + -0.197158581964768880f, + 0.980333787223347960f, -0.197346562240965920f, 0.980295928472165290f, + -0.197534535261294030f, + 0.980258033678303550f, -0.197722501018841920f, 0.980220102843156080f, + -0.197910459506698670f, + 0.980182135968117430f, -0.198098410717953560f, 0.980144133054583590f, + -0.198286354645696220f, + 0.980106094103951770f, -0.198474291283016390f, 0.980068019117620650f, + -0.198662220623004200f, + 0.980029908096990090f, -0.198850142658750090f, 0.979991761043461200f, + -0.199038057383344680f, + 0.979953577958436740f, -0.199225964789878830f, 0.979915358843320480f, + -0.199413864871443770f, + 0.979877103699517640f, -0.199601757621130970f, 0.979838812528434740f, + -0.199789643032032090f, + 0.979800485331479790f, -0.199977521097239150f, 0.979762122110061750f, + -0.200165391809844440f, + 0.979723722865591170f, -0.200353255162940450f, 0.979685287599479930f, + -0.200541111149619980f, + 0.979646816313141210f, -0.200728959762976140f, 0.979608309007989450f, + -0.200916800996102230f, + 0.979569765685440520f, -0.201104634842091900f, 0.979531186346911500f, + -0.201292461294039020f, + 0.979492570993820810f, -0.201480280345037730f, 0.979453919627588210f, + -0.201668091988182530f, + 0.979415232249634780f, -0.201855896216568050f, 0.979376508861383170f, + -0.202043693023289260f, + 0.979337749464256780f, -0.202231482401441450f, 0.979298954059681040f, + -0.202419264344120160f, + 0.979260122649082020f, -0.202607038844421130f, 0.979221255233887700f, + -0.202794805895440440f, + 0.979182351815526930f, -0.202982565490274440f, 0.979143412395430230f, + -0.203170317622019790f, + 0.979104436975029250f, -0.203358062283773320f, 0.979065425555756930f, + -0.203545799468632190f, + 0.979026378139047580f, -0.203733529169693920f, 0.978987294726337050f, + -0.203921251380056120f, + 0.978948175319062200f, -0.204108966092816870f, 0.978909019918661310f, + -0.204296673301074370f, + 0.978869828526574120f, -0.204484372997927240f, 0.978830601144241470f, + -0.204672065176474210f, + 0.978791337773105670f, -0.204859749829814420f, 0.978752038414610340f, + -0.205047426951047250f, + 0.978712703070200420f, -0.205235096533272350f, 0.978673331741322210f, + -0.205422758569589610f, + 0.978633924429423210f, -0.205610413053099240f, 0.978594481135952270f, + -0.205798059976901790f, + 0.978555001862359550f, -0.205985699334097910f, 0.978515486610096910f, + -0.206173331117788710f, + 0.978475935380616830f, -0.206360955321075510f, 0.978436348175373730f, + -0.206548571937059890f, + 0.978396724995823090f, -0.206736180958843690f, 0.978357065843421640f, + -0.206923782379529100f, + 0.978317370719627650f, -0.207111376192218560f, 0.978277639625900530f, + -0.207298962390014750f, + 0.978237872563701090f, -0.207486540966020650f, 0.978198069534491400f, + -0.207674111913339570f, + 0.978158230539735050f, -0.207861675225075070f, 0.978118355580896660f, + -0.208049230894330940f, + 0.978078444659442380f, -0.208236778914211330f, 0.978038497776839600f, + -0.208424319277820600f, + 0.977998514934557140f, -0.208611851978263490f, 0.977958496134064830f, + -0.208799377008644900f, + 0.977918441376834370f, -0.208986894362070070f, 0.977878350664338150f, + -0.209174404031644580f, + 0.977838223998050430f, -0.209361906010474160f, 0.977798061379446360f, + -0.209549400291664940f, + 0.977757862810002760f, -0.209736886868323290f, 0.977717628291197460f, + -0.209924365733555880f, + 0.977677357824509930f, -0.210111836880469610f, 0.977637051411420770f, + -0.210299300302171730f, + 0.977596709053411890f, -0.210486755991769720f, 0.977556330751966460f, + -0.210674203942371440f, + 0.977515916508569280f, -0.210861644147084860f, 0.977475466324706170f, + -0.211049076599018390f, + 0.977434980201864260f, -0.211236501291280710f, 0.977394458141532250f, + -0.211423918216980670f, + 0.977353900145199960f, -0.211611327369227550f, 0.977313306214358750f, + -0.211798728741130840f, + 0.977272676350500860f, -0.211986122325800330f, 0.977232010555120320f, + -0.212173508116346080f, + 0.977191308829712280f, -0.212360886105878420f, 0.977150571175773200f, + -0.212548256287508060f, + 0.977109797594800880f, -0.212735618654345930f, 0.977068988088294450f, + -0.212922973199503180f, + 0.977028142657754390f, -0.213110319916091360f, 0.976987261304682390f, + -0.213297658797222320f, + 0.976946344030581670f, -0.213484989836008050f, 0.976905390836956490f, + -0.213672313025560970f, + 0.976864401725312640f, -0.213859628358993750f, 0.976823376697157240f, + -0.214046935829419360f, + 0.976782315753998650f, -0.214234235429950990f, 0.976741218897346550f, + -0.214421527153702160f, + 0.976700086128711840f, -0.214608810993786760f, 0.976658917449606980f, + -0.214796086943318860f, + 0.976617712861545640f, -0.214983354995412820f, 0.976576472366042610f, + -0.215170615143183390f, + 0.976535195964614470f, -0.215357867379745550f, 0.976493883658778650f, + -0.215545111698214500f, + 0.976452535450054060f, -0.215732348091705880f, 0.976411151339961040f, + -0.215919576553335490f, + 0.976369731330021140f, -0.216106797076219520f, 0.976328275421757260f, + -0.216294009653474340f, + 0.976286783616693630f, -0.216481214278216730f, 0.976245255916355800f, + -0.216668410943563730f, + 0.976203692322270560f, -0.216855599642632620f, 0.976162092835966110f, + -0.217042780368540990f, + 0.976120457458971910f, -0.217229953114406790f, 0.976078786192818850f, + -0.217417117873348190f, + 0.976037079039039020f, -0.217604274638483640f, 0.975995335999165990f, + -0.217791423402931950f, + 0.975953557074734300f, -0.217978564159812200f, 0.975911742267280170f, + -0.218165696902243800f, + 0.975869891578341030f, -0.218352821623346320f, 0.975828005009455660f, + -0.218539938316239770f, + 0.975786082562163930f, -0.218727046974044440f, 0.975744124238007270f, + -0.218914147589880840f, + 0.975702130038528570f, -0.219101240156869800f, 0.975660099965271590f, + -0.219288324668132470f, + 0.975618034019781750f, -0.219475401116790310f, 0.975575932203605720f, + -0.219662469495965050f, + 0.975533794518291360f, -0.219849529798778700f, 0.975491620965388110f, + -0.220036582018353580f, + 0.975449411546446380f, -0.220223626147812380f, 0.975407166263018270f, + -0.220410662180277940f, + 0.975364885116656980f, -0.220597690108873510f, 0.975322568108916930f, + -0.220784709926722610f, + 0.975280215241354220f, -0.220971721626949110f, 0.975237826515525820f, + -0.221158725202677010f, + 0.975195401932990370f, -0.221345720647030810f, 0.975152941495307620f, + -0.221532707953135230f, + 0.975110445204038890f, -0.221719687114115220f, 0.975067913060746470f, + -0.221906658123096100f, + 0.975025345066994120f, -0.222093620973203510f, 0.974982741224347140f, + -0.222280575657563370f, + 0.974940101534371830f, -0.222467522169301880f, 0.974897425998635820f, + -0.222654460501545500f, + 0.974854714618708430f, -0.222841390647421120f, 0.974811967396159830f, + -0.223028312600055820f, + 0.974769184332561770f, -0.223215226352576980f, 0.974726365429487320f, + -0.223402131898112370f, + 0.974683510688510670f, -0.223589029229789990f, 0.974640620111207560f, + -0.223775918340738150f, + 0.974597693699155050f, -0.223962799224085460f, 0.974554731453931230f, + -0.224149671872960870f, + 0.974511733377115720f, -0.224336536280493600f, 0.974468699470289580f, + -0.224523392439813170f, + 0.974425629735034990f, -0.224710240344049430f, 0.974382524172935470f, + -0.224897079986332490f, + 0.974339382785575860f, -0.225083911359792830f, 0.974296205574542440f, + -0.225270734457561160f, + 0.974252992541422500f, -0.225457549272768540f, 0.974209743687805220f, + -0.225644355798546330f, + 0.974166459015280320f, -0.225831154028026170f, 0.974123138525439640f, + -0.226017943954340020f, + 0.974079782219875680f, -0.226204725570620190f, 0.974036390100182610f, + -0.226391498869999240f, + 0.973992962167955830f, -0.226578263845610000f, 0.973949498424792170f, + -0.226765020490585690f, + 0.973905998872289570f, -0.226951768798059810f, 0.973862463512047300f, + -0.227138508761166170f, + 0.973818892345666100f, -0.227325240373038860f, 0.973775285374748110f, + -0.227511963626812280f, + 0.973731642600896400f, -0.227698678515621170f, 0.973687964025715670f, + -0.227885385032600530f, + 0.973644249650811980f, -0.228072083170885730f, 0.973600499477792370f, + -0.228258772923612380f, + 0.973556713508265560f, -0.228445454283916470f, 0.973512891743841370f, + -0.228632127244934230f, + 0.973469034186131070f, -0.228818791799802220f, 0.973425140836747030f, + -0.229005447941657340f, + 0.973381211697303290f, -0.229192095663636770f, 0.973337246769414910f, + -0.229378734958878010f, + 0.973293246054698250f, -0.229565365820518870f, 0.973249209554771230f, + -0.229751988241697490f, + 0.973205137271252800f, -0.229938602215552210f, 0.973161029205763530f, + -0.230125207735221850f, + 0.973116885359925130f, -0.230311804793845440f, 0.973072705735360530f, + -0.230498393384562350f, + 0.973028490333694210f, -0.230684973500512200f, 0.972984239156551740f, + -0.230871545134835020f, + 0.972939952205560180f, -0.231058108280671110f, 0.972895629482347760f, + -0.231244662931161050f, + 0.972851270988544180f, -0.231431209079445750f, 0.972806876725780370f, + -0.231617746718666470f, + 0.972762446695688570f, -0.231804275841964780f, 0.972717980899902250f, + -0.231990796442482440f, + 0.972673479340056430f, -0.232177308513361710f, 0.972628942017787270f, + -0.232363812047745030f, + 0.972584368934732210f, -0.232550307038775240f, 0.972539760092530180f, + -0.232736793479595390f, + 0.972495115492821190f, -0.232923271363348980f, 0.972450435137246830f, + -0.233109740683179690f, + 0.972405719027449770f, -0.233296201432231590f, 0.972360967165074140f, + -0.233482653603649090f, + 0.972316179551765300f, -0.233669097190576820f, 0.972271356189170040f, + -0.233855532186159840f, + 0.972226497078936270f, -0.234041958583543430f, 0.972181602222713440f, + -0.234228376375873210f, + 0.972136671622152230f, -0.234414785556295160f, 0.972091705278904430f, + -0.234601186117955550f, + 0.972046703194623500f, -0.234787578054000970f, 0.972001665370963890f, + -0.234973961357578250f, + 0.971956591809581720f, -0.235160336021834730f, 0.971911482512134000f, + -0.235346702039917840f, + 0.971866337480279400f, -0.235533059404975490f, 0.971821156715677700f, + -0.235719408110155820f, + 0.971775940219990140f, -0.235905748148607370f, 0.971730687994879160f, + -0.236092079513478910f, + 0.971685400042008540f, -0.236278402197919570f, 0.971640076363043390f, + -0.236464716195078780f, + 0.971594716959650160f, -0.236651021498106380f, 0.971549321833496630f, + -0.236837318100152380f, + 0.971503890986251780f, -0.237023605994367200f, 0.971458424419585960f, + -0.237209885173901600f, + 0.971412922135170940f, -0.237396155631906610f, 0.971367384134679490f, + -0.237582417361533570f, + 0.971321810419786160f, -0.237768670355934190f, 0.971276200992166490f, + -0.237954914608260540f, + 0.971230555853497380f, -0.238141150111664840f, 0.971184875005457030f, + -0.238327376859299810f, + 0.971139158449725090f, -0.238513594844318420f, 0.971093406187982460f, + -0.238699804059873980f, + 0.971047618221911100f, -0.238886004499120040f, 0.971001794553194690f, + -0.239072196155210610f, + 0.970955935183517970f, -0.239258379021299980f, 0.970910040114567050f, + -0.239444553090542630f, + 0.970864109348029470f, -0.239630718356093560f, 0.970818142885593870f, + -0.239816874811108000f, + 0.970772140728950350f, -0.240003022448741500f, 0.970726102879790110f, + -0.240189161262149900f, + 0.970680029339806130f, -0.240375291244489450f, 0.970633920110692160f, + -0.240561412388916650f, + 0.970587775194143630f, -0.240747524688588430f, 0.970541594591857070f, + -0.240933628136661910f, + 0.970495378305530560f, -0.241119722726294590f, 0.970449126336863090f, + -0.241305808450644370f, + 0.970402838687555500f, -0.241491885302869330f, 0.970356515359309450f, + -0.241677953276128010f, + 0.970310156353828110f, -0.241864012363579180f, 0.970263761672816140f, + -0.242050062558382070f, + 0.970217331317979160f, -0.242236103853696010f, 0.970170865291024480f, + -0.242422136242680890f, + 0.970124363593660280f, -0.242608159718496810f, 0.970077826227596420f, + -0.242794174274304220f, + 0.970031253194543970f, -0.242980179903263870f, 0.969984644496215240f, + -0.243166176598536900f, + 0.969938000134323960f, -0.243352164353284740f, 0.969891320110585100f, + -0.243538143160669130f, + 0.969844604426714830f, -0.243724113013852160f, 0.969797853084430890f, + -0.243910073905996260f, + 0.969751066085452140f, -0.244096025830264210f, 0.969704243431498860f, + -0.244281968779819030f, + 0.969657385124292450f, -0.244467902747824150f, 0.969610491165555870f, + -0.244653827727443320f, + 0.969563561557013180f, -0.244839743711840670f, 0.969516596300390000f, + -0.245025650694180470f, + 0.969469595397413060f, -0.245211548667627540f, 0.969422558849810320f, + -0.245397437625346960f, + 0.969375486659311280f, -0.245583317560504060f, 0.969328378827646660f, + -0.245769188466264580f, + 0.969281235356548530f, -0.245955050335794590f, 0.969234056247750050f, + -0.246140903162260530f, + 0.969186841502985950f, -0.246326746938829030f, 0.969139591123992280f, + -0.246512581658667210f, + 0.969092305112506210f, -0.246698407314942410f, 0.969044983470266240f, + -0.246884223900822430f, + 0.968997626199012420f, -0.247070031409475250f, 0.968950233300485800f, + -0.247255829834069300f, + 0.968902804776428870f, -0.247441619167773270f, 0.968855340628585580f, + -0.247627399403756280f, + 0.968807840858700970f, -0.247813170535187670f, 0.968760305468521430f, + -0.247998932555237110f, + 0.968712734459794780f, -0.248184685457074780f, 0.968665127834270060f, + -0.248370429233870980f, + 0.968617485593697540f, -0.248556163878796560f, 0.968569807739828930f, + -0.248741889385022480f, + 0.968522094274417380f, -0.248927605745720150f, 0.968474345199216820f, + -0.249113312954061360f, + 0.968426560515983190f, -0.249299011003218190f, 0.968378740226473300f, + -0.249484699886362960f, + 0.968330884332445190f, -0.249670379596668550f, 0.968282992835658660f, + -0.249856050127307990f, + 0.968235065737874320f, -0.250041711471454650f, 0.968187103040854420f, + -0.250227363622282370f, + 0.968139104746362440f, -0.250413006572965220f, 0.968091070856162970f, + -0.250598640316677670f, + 0.968043001372022260f, -0.250784264846594500f, 0.967994896295707670f, + -0.250969880155890720f, + 0.967946755628987800f, -0.251155486237741920f, 0.967898579373632660f, + -0.251341083085323880f, + 0.967850367531413620f, -0.251526670691812610f, 0.967802120104103270f, + -0.251712249050384700f, + 0.967753837093475510f, -0.251897818154216970f, 0.967705518501305480f, + -0.252083377996486450f, + 0.967657164329369880f, -0.252268928570370810f, 0.967608774579446500f, + -0.252454469869047740f, + 0.967560349253314360f, -0.252640001885695520f, 0.967511888352754150f, + -0.252825524613492610f, + 0.967463391879547550f, -0.253011038045617860f, 0.967414859835477480f, + -0.253196542175250560f, + 0.967366292222328510f, -0.253382036995570160f, 0.967317689041886310f, + -0.253567522499756560f, + 0.967269050295937790f, -0.253752998680989990f, 0.967220375986271420f, + -0.253938465532451090f, + 0.967171666114676640f, -0.254123923047320620f, 0.967122920682944360f, + -0.254309371218780000f, + 0.967074139692867040f, -0.254494810040010730f, 0.967025323146238010f, + -0.254680239504194830f, + 0.966976471044852070f, -0.254865659604514570f, 0.966927583390505660f, + -0.255051070334152470f, + 0.966878660184995910f, -0.255236471686291710f, 0.966829701430121810f, + -0.255421863654115460f, + 0.966780707127683270f, -0.255607246230807380f, 0.966731677279481840f, + -0.255792619409551610f, + 0.966682611887320080f, -0.255977983183532430f, 0.966633510953002100f, + -0.256163337545934460f, + 0.966584374478333120f, -0.256348682489942910f, 0.966535202465119700f, + -0.256534018008743040f, + 0.966485994915169840f, -0.256719344095520660f, 0.966436751830292650f, + -0.256904660743461910f, + 0.966387473212298900f, -0.257089967945753120f, 0.966338159063000130f, + -0.257275265695581120f, + 0.966288809384209690f, -0.257460553986133100f, 0.966239424177741890f, + -0.257645832810596390f, + 0.966190003445412500f, -0.257831102162158990f, 0.966140547189038750f, + -0.258016362034009020f, + 0.966091055410438830f, -0.258201612419334870f, 0.966041528111432400f, + -0.258386853311325600f, + 0.965991965293840570f, -0.258572084703170340f, 0.965942366959485540f, + -0.258757306588058680f, + 0.965892733110190860f, -0.258942518959180520f, 0.965843063747781510f, + -0.259127721809726150f, + 0.965793358874083680f, -0.259312915132886230f, 0.965743618490924830f, + -0.259498098921851660f, + 0.965693842600133690f, -0.259683273169813770f, 0.965644031203540590f, + -0.259868437869964270f, + 0.965594184302976830f, -0.260053593015495190f, 0.965544301900275180f, + -0.260238738599598840f, + 0.965494383997269500f, -0.260423874615468010f, 0.965444430595795430f, + -0.260609001056295750f, + 0.965394441697689400f, -0.260794117915275510f, 0.965344417304789370f, + -0.260979225185601070f, + 0.965294357418934660f, -0.261164322860466480f, 0.965244262041965780f, + -0.261349410933066350f, + 0.965194131175724720f, -0.261534489396595520f, 0.965143964822054450f, + -0.261719558244249030f, + 0.965093762982799590f, -0.261904617469222610f, 0.965043525659805890f, + -0.262089667064712040f, + 0.964993252854920320f, -0.262274707023913590f, 0.964942944569991410f, + -0.262459737340023980f, + 0.964892600806868890f, -0.262644758006240040f, 0.964842221567403620f, + -0.262829769015759160f, + 0.964791806853447900f, -0.263014770361779000f, 0.964741356666855340f, + -0.263199762037497560f, + 0.964690871009481030f, -0.263384744036113280f, 0.964640349883180930f, + -0.263569716350824880f, + 0.964589793289812760f, -0.263754678974831350f, 0.964539201231235150f, + -0.263939631901332350f, + 0.964488573709308410f, -0.264124575123527550f, 0.964437910725893910f, + -0.264309508634617110f, + 0.964387212282854290f, -0.264494432427801630f, 0.964336478382053720f, + -0.264679346496281890f, + 0.964285709025357480f, -0.264864250833259260f, 0.964234904214632200f, + -0.265049145431935250f, + 0.964184063951745830f, -0.265234030285511790f, 0.964133188238567640f, + -0.265418905387191260f, + 0.964082277076968140f, -0.265603770730176330f, 0.964031330468819280f, + -0.265788626307669920f, + 0.963980348415994110f, -0.265973472112875590f, 0.963929330920367140f, + -0.266158308138996990f, + 0.963878277983814200f, -0.266343134379238180f, 0.963827189608212340f, + -0.266527950826803690f, + 0.963776065795439840f, -0.266712757474898370f, 0.963724906547376530f, + -0.266897554316727350f, + 0.963673711865903230f, -0.267082341345496300f, 0.963622481752902220f, + -0.267267118554410930f, + 0.963571216210257320f, -0.267451885936677620f, 0.963519915239853140f, + -0.267636643485503090f, + 0.963468578843575950f, -0.267821391194094150f, 0.963417207023313350f, + -0.268006129055658290f, + 0.963365799780954050f, -0.268190857063403180f, 0.963314357118388200f, + -0.268375575210536900f, + 0.963262879037507070f, -0.268560283490267890f, 0.963211365540203480f, + -0.268744981895804980f, + 0.963159816628371360f, -0.268929670420357260f, 0.963108232303906190f, + -0.269114349057134380f, + 0.963056612568704340f, -0.269299017799346120f, 0.963004957424663850f, + -0.269483676640202840f, + 0.962953266873683880f, -0.269668325572915090f, 0.962901540917665000f, + -0.269852964590693860f, + 0.962849779558509030f, -0.270037593686750570f, 0.962797982798119010f, + -0.270222212854296870f, + 0.962746150638399410f, -0.270406822086544820f, 0.962694283081255930f, + -0.270591421376706940f, + 0.962642380128595710f, -0.270776010717996010f, 0.962590441782326890f, + -0.270960590103625170f, + 0.962538468044359160f, -0.271145159526808010f, 0.962486458916603450f, + -0.271329718980758420f, + 0.962434414400972100f, -0.271514268458690700f, 0.962382334499378380f, + -0.271698807953819510f, + 0.962330219213737400f, -0.271883337459359720f, 0.962278068545965090f, + -0.272067856968526920f, + 0.962225882497979020f, -0.272252366474536710f, 0.962173661071697880f, + -0.272436865970605240f, + 0.962121404269041580f, -0.272621355449948980f, 0.962069112091931580f, + -0.272805834905784810f, + 0.962016784542290560f, -0.272990304331329920f, 0.961964421622042320f, + -0.273174763719801930f, + 0.961912023333112210f, -0.273359213064418680f, 0.961859589677426570f, + -0.273543652358398730f, + 0.961807120656913540f, -0.273728081594960540f, 0.961754616273502010f, + -0.273912500767323260f, + 0.961702076529122540f, -0.274096909868706380f, 0.961649501425706820f, + -0.274281308892329660f, + 0.961596890965187860f, -0.274465697831413220f, 0.961544245149499990f, + -0.274650076679177680f, + 0.961491563980579000f, -0.274834445428843940f, 0.961438847460361680f, + -0.275018804073633220f, + 0.961386095590786250f, -0.275203152606767310f, 0.961333308373792270f, + -0.275387491021468140f, + 0.961280485811320640f, -0.275571819310958140f, 0.961227627905313460f, + -0.275756137468460120f, + 0.961174734657714080f, -0.275940445487197150f, 0.961121806070467380f, + -0.276124743360392830f, + 0.961068842145519350f, -0.276309031081271080f, 0.961015842884817230f, + -0.276493308643055990f, + 0.960962808290309780f, -0.276677576038972420f, 0.960909738363946770f, + -0.276861833262245280f, + 0.960856633107679660f, -0.277046080306099900f, 0.960803492523460760f, + -0.277230317163762170f, + 0.960750316613243950f, -0.277414543828458090f, 0.960697105378984450f, + -0.277598760293414290f, + 0.960643858822638590f, -0.277782966551857690f, 0.960590576946164120f, + -0.277967162597015370f, + 0.960537259751520050f, -0.278151348422115090f, 0.960483907240666790f, + -0.278335524020384920f, + 0.960430519415565790f, -0.278519689385053060f, 0.960377096278180130f, + -0.278703844509348490f, + 0.960323637830473920f, -0.278887989386500280f, 0.960270144074412800f, + -0.279072124009737800f, + 0.960216615011963430f, -0.279256248372291180f, 0.960163050645094000f, + -0.279440362467390510f, + 0.960109450975773940f, -0.279624466288266590f, 0.960055816005973890f, + -0.279808559828150390f, + 0.960002145737665960f, -0.279992643080273220f, 0.959948440172823210f, + -0.280176716037866980f, + 0.959894699313420530f, -0.280360778694163810f, 0.959840923161433770f, + -0.280544831042396250f, + 0.959787111718839900f, -0.280728873075797190f, 0.959733264987617680f, + -0.280912904787600000f, + 0.959679382969746750f, -0.281096926171038260f, 0.959625465667208190f, + -0.281280937219346110f, + 0.959571513081984520f, -0.281464937925757940f, 0.959517525216059260f, + -0.281648928283508630f, + 0.959463502071417510f, -0.281832908285833350f, 0.959409443650045550f, + -0.282016877925967640f, + 0.959355349953930790f, -0.282200837197147560f, 0.959301220985062210f, + -0.282384786092609360f, + 0.959247056745430090f, -0.282568724605589740f, 0.959192857237025740f, + -0.282752652729325930f, + 0.959138622461841890f, -0.282936570457055390f, 0.959084352421872730f, + -0.283120477782015820f, + 0.959030047119113660f, -0.283304374697445740f, 0.958975706555561080f, + -0.283488261196583550f, + 0.958921330733213170f, -0.283672137272668430f, 0.958866919654069010f, + -0.283856002918939750f, + 0.958812473320129310f, -0.284039858128637190f, 0.958757991733395710f, + -0.284223702895001040f, + 0.958703474895871600f, -0.284407537211271880f, 0.958648922809561150f, + -0.284591361070690440f, + 0.958594335476470220f, -0.284775174466498300f, 0.958539712898605730f, + -0.284958977391937040f, + 0.958485055077976100f, -0.285142769840248670f, 0.958430362016590930f, + -0.285326551804675870f, + 0.958375633716461170f, -0.285510323278461260f, 0.958320870179598880f, + -0.285694084254848320f, + 0.958266071408017670f, -0.285877834727080620f, 0.958211237403732260f, + -0.286061574688402040f, + 0.958156368168758820f, -0.286245304132057120f, 0.958101463705114730f, + -0.286429023051290700f, + 0.958046524014818600f, -0.286612731439347790f, 0.957991549099890370f, + -0.286796429289474080f, + 0.957936538962351420f, -0.286980116594915570f, 0.957881493604224370f, + -0.287163793348918390f, + 0.957826413027532910f, -0.287347459544729510f, 0.957771297234302320f, + -0.287531115175595930f, + 0.957716146226558870f, -0.287714760234765170f, 0.957660960006330610f, + -0.287898394715485170f, + 0.957605738575646350f, -0.288082018611004130f, 0.957550481936536470f, + -0.288265631914570770f, + 0.957495190091032570f, -0.288449234619434220f, 0.957439863041167680f, + -0.288632826718843830f, + 0.957384500788975860f, -0.288816408206049480f, 0.957329103336492790f, + -0.288999979074301420f, + 0.957273670685755200f, -0.289183539316850200f, 0.957218202838801210f, + -0.289367088926947010f, + 0.957162699797670210f, -0.289550627897843030f, 0.957107161564402790f, + -0.289734156222790250f, + 0.957051588141040970f, -0.289917673895040750f, 0.956995979529628230f, + -0.290101180907847090f, + 0.956940335732208820f, -0.290284677254462330f, 0.956884656750828900f, + -0.290468162928139820f, + 0.956828942587535370f, -0.290651637922133220f, 0.956773193244376930f, + -0.290835102229696830f, + 0.956717408723403050f, -0.291018555844085090f, 0.956661589026665090f, + -0.291201998758552900f, + 0.956605734156215080f, -0.291385430966355660f, 0.956549844114106820f, + -0.291568852460749040f, + 0.956493918902395100f, -0.291752263234989260f, 0.956437958523136180f, + -0.291935663282332780f, + 0.956381962978387730f, -0.292119052596036380f, 0.956325932270208230f, + -0.292302431169357560f, + 0.956269866400658030f, -0.292485798995553880f, 0.956213765371798470f, + -0.292669156067883460f, + 0.956157629185692140f, -0.292852502379604810f, 0.956101457844403040f, + -0.293035837923976810f, + 0.956045251349996410f, -0.293219162694258630f, 0.955989009704538930f, + -0.293402476683710110f, + 0.955932732910098280f, -0.293585779885591200f, 0.955876420968743590f, + -0.293769072293162400f, + 0.955820073882545420f, -0.293952353899684660f, 0.955763691653575440f, + -0.294135624698419030f, + 0.955707274283906560f, -0.294318884682627400f, 0.955650821775613330f, + -0.294502133845571670f, + 0.955594334130771110f, -0.294685372180514330f, 0.955537811351456880f, + -0.294868599680718270f, + 0.955481253439748770f, -0.295051816339446720f, 0.955424660397726330f, + -0.295235022149963220f, + 0.955368032227470350f, -0.295418217105532010f, 0.955311368931062720f, + -0.295601401199417360f, + 0.955254670510586990f, -0.295784574424884260f, 0.955197936968127710f, + -0.295967736775197890f, + 0.955141168305770780f, -0.296150888243623790f, 0.955084364525603410f, + -0.296334028823428190f, + 0.955027525629714160f, -0.296517158507877470f, 0.954970651620192790f, + -0.296700277290238350f, + 0.954913742499130520f, -0.296883385163778270f, 0.954856798268619580f, + -0.297066482121764730f, + 0.954799818930753720f, -0.297249568157465840f, 0.954742804487627940f, + -0.297432643264150030f, + 0.954685754941338340f, -0.297615707435086200f, 0.954628670293982680f, + -0.297798760663543550f, + 0.954571550547659630f, -0.297981802942791810f, 0.954514395704469500f, + -0.298164834266100850f, + 0.954457205766513490f, -0.298347854626741400f, 0.954399980735894490f, + -0.298530864017984120f, + 0.954342720614716480f, -0.298713862433100330f, 0.954285425405084650f, + -0.298896849865361800f, + 0.954228095109105670f, -0.299079826308040480f, 0.954170729728887280f, + -0.299262791754408840f, + 0.954113329266538800f, -0.299445746197739890f, 0.954055893724170660f, + -0.299628689631306790f, + 0.953998423103894490f, -0.299811622048383350f, 0.953940917407823500f, + -0.299994543442243580f, + 0.953883376638071770f, -0.300177453806161950f, 0.953825800796755050f, + -0.300360353133413530f, + 0.953768189885990330f, -0.300543241417273450f, 0.953710543907895670f, + -0.300726118651017500f, + 0.953652862864590500f, -0.300908984827921890f, 0.953595146758195680f, + -0.301091839941263100f, + 0.953537395590833280f, -0.301274683984317950f, 0.953479609364626610f, + -0.301457516950363940f, + 0.953421788081700310f, -0.301640338832678770f, 0.953363931744180330f, + -0.301823149624540650f, + 0.953306040354193860f, -0.302005949319228080f, 0.953248113913869320f, + -0.302188737910019990f, + 0.953190152425336670f, -0.302371515390195970f, 0.953132155890726750f, + -0.302554281753035610f, + 0.953074124312172200f, -0.302737036991819140f, 0.953016057691806530f, + -0.302919781099827310f, + 0.952957956031764700f, -0.303102514070341060f, 0.952899819334182880f, + -0.303285235896641750f, + 0.952841647601198720f, -0.303467946572011320f, 0.952783440834950920f, + -0.303650646089731910f, + 0.952725199037579570f, -0.303833334443086360f, 0.952666922211226170f, + -0.304016011625357570f, + 0.952608610358033350f, -0.304198677629829110f, 0.952550263480144930f, + -0.304381332449784880f, + 0.952491881579706320f, -0.304563976078509100f, 0.952433464658864030f, + -0.304746608509286530f, + 0.952375012719765880f, -0.304929229735402370f, 0.952316525764560940f, + -0.305111839750142110f, + 0.952258003795399600f, -0.305294438546791670f, 0.952199446814433580f, + -0.305477026118637420f, + 0.952140854823815830f, -0.305659602458966120f, 0.952082227825700620f, + -0.305842167561065080f, + 0.952023565822243570f, -0.306024721418221790f, 0.951964868815601380f, + -0.306207264023724220f, + 0.951906136807932350f, -0.306389795370860920f, 0.951847369801395620f, + -0.306572315452920740f, + 0.951788567798152130f, -0.306754824263192780f, 0.951729730800363830f, + -0.306937321794966910f, + 0.951670858810193860f, -0.307119808041533100f, 0.951611951829806850f, + -0.307302282996181790f, + 0.951553009861368590f, -0.307484746652204100f, 0.951494032907046370f, + -0.307667199002891190f, + 0.951435020969008340f, -0.307849640041534870f, 0.951375974049424420f, + -0.308032069761427330f, + 0.951316892150465550f, -0.308214488155861050f, 0.951257775274304000f, + -0.308396895218129190f, + 0.951198623423113230f, -0.308579290941525090f, 0.951139436599068190f, + -0.308761675319342450f, + 0.951080214804345010f, -0.308944048344875710f, 0.951020958041121080f, + -0.309126410011419440f, + 0.950961666311575080f, -0.309308760312268730f, 0.950902339617887060f, + -0.309491099240719100f, + 0.950842977962238160f, -0.309673426790066380f, 0.950783581346811070f, + -0.309855742953607070f, + 0.950724149773789610f, -0.310038047724637890f, 0.950664683245358910f, + -0.310220341096455850f, + 0.950605181763705340f, -0.310402623062358720f, 0.950545645331016600f, + -0.310584893615644450f, + 0.950486073949481700f, -0.310767152749611470f, 0.950426467621290900f, + -0.310949400457558640f, + 0.950366826348635780f, -0.311131636732785270f, 0.950307150133709260f, + -0.311313861568590920f, + 0.950247438978705230f, -0.311496074958275910f, 0.950187692885819280f, + -0.311678276895140550f, + 0.950127911857248100f, -0.311860467372486020f, 0.950068095895189590f, + -0.312042646383613510f, + 0.950008245001843000f, -0.312224813921824880f, 0.949948359179409010f, + -0.312406969980422440f, + 0.949888438430089300f, -0.312589114552708710f, 0.949828482756087110f, + -0.312771247631986770f, + 0.949768492159606680f, -0.312953369211560200f, 0.949708466642853800f, + -0.313135479284732840f, + 0.949648406208035480f, -0.313317577844809010f, 0.949588310857359950f, + -0.313499664885093510f, + 0.949528180593036670f, -0.313681740398891520f, 0.949468015417276550f, + -0.313863804379508500f, + 0.949407815332291570f, -0.314045856820250710f, 0.949347580340295210f, + -0.314227897714424440f, + 0.949287310443502120f, -0.314409927055336660f, 0.949227005644128210f, + -0.314591944836294660f, + 0.949166665944390700f, -0.314773951050606070f, 0.949106291346508260f, + -0.314955945691579140f, + 0.949045881852700560f, -0.315137928752522440f, 0.948985437465188710f, + -0.315319900226744890f, + 0.948924958186195160f, -0.315501860107555990f, 0.948864444017943340f, + -0.315683808388265650f, + 0.948803894962658490f, -0.315865745062183960f, 0.948743311022566480f, + -0.316047670122621860f, + 0.948682692199895090f, -0.316229583562890330f, 0.948622038496872990f, + -0.316411485376300980f, + 0.948561349915730270f, -0.316593375556165850f, 0.948500626458698260f, + -0.316775254095797270f, + 0.948439868128009620f, -0.316957120988508150f, 0.948379074925898120f, + -0.317138976227611780f, + 0.948318246854599090f, -0.317320819806421740f, 0.948257383916349060f, + -0.317502651718252260f, + 0.948196486113385580f, -0.317684471956417970f, 0.948135553447947980f, + -0.317866280514233660f, + 0.948074585922276230f, -0.318048077385014950f, 0.948013583538612200f, + -0.318229862562077530f, + 0.947952546299198670f, -0.318411636038737790f, 0.947891474206279840f, + -0.318593397808312420f, + 0.947830367262101010f, -0.318775147864118480f, 0.947769225468909180f, + -0.318956886199473650f, + 0.947708048828952100f, -0.319138612807695900f, 0.947646837344479300f, + -0.319320327682103610f, + 0.947585591017741090f, -0.319502030816015690f, 0.947524309850989570f, + -0.319683722202751430f, + 0.947462993846477700f, -0.319865401835630500f, 0.947401643006459900f, + -0.320047069707973140f, + 0.947340257333192050f, -0.320228725813099860f, 0.947278836828930880f, + -0.320410370144331820f, + 0.947217381495934820f, -0.320592002694990330f, 0.947155891336463270f, + -0.320773623458397330f, + 0.947094366352777220f, -0.320955232427875210f, 0.947032806547138620f, + -0.321136829596746660f, + 0.946971211921810880f, -0.321318414958334850f, 0.946909582479058760f, + -0.321499988505963510f, + 0.946847918221148000f, -0.321681550232956580f, 0.946786219150346000f, + -0.321863100132638580f, + 0.946724485268921170f, -0.322044638198334510f, 0.946662716579143360f, + -0.322226164423369600f, + 0.946600913083283530f, -0.322407678801069850f, 0.946539074783614100f, + -0.322589181324761330f, + 0.946477201682408680f, -0.322770671987770710f, 0.946415293781942110f, + -0.322952150783425260f, + 0.946353351084490590f, -0.323133617705052330f, 0.946291373592331620f, + -0.323315072745979980f, + 0.946229361307743820f, -0.323496515899536710f, 0.946167314233007370f, + -0.323677947159051240f, + 0.946105232370403450f, -0.323859366517852850f, 0.946043115722214560f, + -0.324040773969271450f, + 0.945980964290724760f, -0.324222169506636960f, 0.945918778078219110f, + -0.324403553123280230f, + 0.945856557086983910f, -0.324584924812532150f, 0.945794301319306970f, + -0.324766284567724220f, + 0.945732010777477150f, -0.324947632382188430f, 0.945669685463784710f, + -0.325128968249257080f, + 0.945607325380521280f, -0.325310292162262930f, 0.945544930529979680f, + -0.325491604114539310f, + 0.945482500914453740f, -0.325672904099419850f, 0.945420036536239070f, + -0.325854192110238580f, + 0.945357537397632290f, -0.326035468140330240f, 0.945295003500931210f, + -0.326216732183029710f, + 0.945232434848435000f, -0.326397984231672490f, 0.945169831442444150f, + -0.326579224279594400f, + 0.945107193285260610f, -0.326760452320131730f, 0.945044520379187070f, + -0.326941668346621420f, + 0.944981812726528150f, -0.327122872352400510f, 0.944919070329589220f, + -0.327304064330806670f, + 0.944856293190677210f, -0.327485244275178000f, 0.944793481312100280f, + -0.327666412178853120f, + 0.944730634696167800f, -0.327847568035170840f, 0.944667753345190490f, + -0.328028711837470680f, + 0.944604837261480260f, -0.328209843579092500f, 0.944541886447350490f, + -0.328390963253376580f, + 0.944478900905115550f, -0.328572070853663740f, 0.944415880637091250f, + -0.328753166373294990f, + 0.944352825645594750f, -0.328934249805612200f, 0.944289735932944410f, + -0.329115321143957250f, + 0.944226611501459810f, -0.329296380381672750f, 0.944163452353461770f, + -0.329477427512101740f, + 0.944100258491272660f, -0.329658462528587490f, 0.944037029917215830f, + -0.329839485424473940f, + 0.943973766633615980f, -0.330020496193105420f, 0.943910468642799150f, + -0.330201494827826570f, + 0.943847135947092690f, -0.330382481321982780f, 0.943783768548825060f, + -0.330563455668919540f, + 0.943720366450326200f, -0.330744417861982890f, 0.943656929653927220f, + -0.330925367894519540f, + 0.943593458161960390f, -0.331106305759876430f, 0.943529951976759480f, + -0.331287231451400820f, + 0.943466411100659320f, -0.331468144962440870f, 0.943402835535996240f, + -0.331649046286344670f, + 0.943339225285107720f, -0.331829935416461110f, 0.943275580350332540f, + -0.332010812346139380f, + 0.943211900734010620f, -0.332191677068729150f, 0.943148186438483420f, + -0.332372529577580620f, + 0.943084437466093490f, -0.332553369866044220f, 0.943020653819184650f, + -0.332734197927471050f, + 0.942956835500102120f, -0.332915013755212650f, 0.942892982511192250f, + -0.333095817342620780f, + 0.942829094854802710f, -0.333276608683047930f, 0.942765172533282510f, + -0.333457387769846850f, + 0.942701215548981900f, -0.333638154596370860f, 0.942637223904252530f, + -0.333818909155973620f, + 0.942573197601446870f, -0.333999651442009380f, 0.942509136642919240f, + -0.334180381447832690f, + 0.942445041031024890f, -0.334361099166798740f, 0.942380910768120470f, + -0.334541804592262900f, + 0.942316745856563780f, -0.334722497717581220f, 0.942252546298714020f, + -0.334903178536110180f, + 0.942188312096931770f, -0.335083847041206580f, 0.942124043253578570f, + -0.335264503226227810f, + 0.942059739771017310f, -0.335445147084531600f, 0.941995401651612550f, + -0.335625778609476290f, + 0.941931028897729620f, -0.335806397794420450f, 0.941866621511735280f, + -0.335987004632723350f, + 0.941802179495997650f, -0.336167599117744520f, 0.941737702852886160f, + -0.336348181242844050f, + 0.941673191584771360f, -0.336528751001382410f, 0.941608645694025250f, + -0.336709308386720580f, + 0.941544065183020810f, -0.336889853392220050f, 0.941479450054132580f, + -0.337070386011242620f, + 0.941414800309736340f, -0.337250906237150590f, 0.941350115952208970f, + -0.337431414063306840f, + 0.941285396983928660f, -0.337611909483074620f, 0.941220643407275180f, + -0.337792392489817460f, + 0.941155855224629190f, -0.337972863076899720f, 0.941091032438372780f, + -0.338153321237685930f, + 0.941026175050889260f, -0.338333766965541130f, 0.940961283064563280f, + -0.338514200253830940f, + 0.940896356481780830f, -0.338694621095921190f, 0.940831395304928870f, + -0.338875029485178450f, + 0.940766399536396070f, -0.339055425414969640f, 0.940701369178571940f, + -0.339235808878661950f, + 0.940636304233847590f, -0.339416179869623360f, 0.940571204704615190f, + -0.339596538381222110f, + 0.940506070593268300f, -0.339776884406826850f, 0.940440901902201750f, + -0.339957217939806880f, + 0.940375698633811540f, -0.340137538973531720f, 0.940310460790495070f, + -0.340317847501371670f, + 0.940245188374650880f, -0.340498143516697160f, 0.940179881388678920f, + -0.340678427012879200f, + 0.940114539834980280f, -0.340858697983289440f, 0.940049163715957370f, + -0.341038956421299720f, + 0.939983753034014050f, -0.341219202320282360f, 0.939918307791555050f, + -0.341399435673610420f, + 0.939852827990986680f, -0.341579656474657160f, 0.939787313634716570f, + -0.341759864716796310f, + 0.939721764725153340f, -0.341940060393402190f, 0.939656181264707180f, + -0.342120243497849530f, + 0.939590563255789270f, -0.342300414023513520f, 0.939524910700812230f, + -0.342480571963769800f, + 0.939459223602189920f, -0.342660717311994380f, 0.939393501962337510f, + -0.342840850061563950f, + 0.939327745783671400f, -0.343020970205855540f, 0.939261955068609210f, + -0.343201077738246540f, + 0.939196129819569900f, -0.343381172652115040f, 0.939130270038973650f, + -0.343561254940839390f, + 0.939064375729241950f, -0.343741324597798490f, 0.938998446892797540f, + -0.343921381616371700f, + 0.938932483532064600f, -0.344101425989938810f, 0.938866485649468060f, + -0.344281457711880180f, + 0.938800453247434770f, -0.344461476775576540f, 0.938734386328392460f, + -0.344641483174408960f, + 0.938668284894770170f, -0.344821476901759290f, 0.938602148948998400f, + -0.345001457951009670f, + 0.938535978493508560f, -0.345181426315542550f, 0.938469773530733800f, + -0.345361381988741220f, + 0.938403534063108060f, -0.345541324963989090f, 0.938337260093066950f, + -0.345721255234670120f, + 0.938270951623047190f, -0.345901172794168990f, 0.938204608655486490f, + -0.346081077635870430f, + 0.938138231192824360f, -0.346260969753160010f, 0.938071819237501270f, + -0.346440849139423520f, + 0.938005372791958840f, -0.346620715788047320f, 0.937938891858640320f, + -0.346800569692418290f, + 0.937872376439989890f, -0.346980410845923680f, 0.937805826538453120f, + -0.347160239241951160f, + 0.937739242156476970f, -0.347340054873889140f, 0.937672623296509470f, + -0.347519857735126110f, + 0.937605969960999990f, -0.347699647819051380f, 0.937539282152399230f, + -0.347879425119054510f, + 0.937472559873159250f, -0.348059189628525610f, 0.937405803125732960f, + -0.348238941340855260f, + 0.937339011912574960f, -0.348418680249434560f, 0.937272186236140950f, + -0.348598406347654930f, + 0.937205326098887960f, -0.348778119628908420f, 0.937138431503274140f, + -0.348957820086587490f, + 0.937071502451759190f, -0.349137507714084970f, 0.937004538946803690f, + -0.349317182504794380f, + 0.936937540990869900f, -0.349496844452109550f, 0.936870508586420960f, + -0.349676493549424760f, + 0.936803441735921560f, -0.349856129790134920f, 0.936736340441837620f, + -0.350035753167635240f, + 0.936669204706636170f, -0.350215363675321580f, 0.936602034532785570f, + -0.350394961306590150f, + 0.936534829922755500f, -0.350574546054837510f, 0.936467590879016990f, + -0.350754117913461060f, + 0.936400317404042060f, -0.350933676875858360f, 0.936333009500304180f, + -0.351113222935427460f, + 0.936265667170278260f, -0.351292756085567090f, 0.936198290416440090f, + -0.351472276319676310f, + 0.936130879241267030f, -0.351651783631154570f, 0.936063433647237540f, + -0.351831278013402030f, + 0.935995953636831410f, -0.352010759459819080f, 0.935928439212529660f, + -0.352190227963806830f, + 0.935860890376814640f, -0.352369683518766630f, 0.935793307132169900f, + -0.352549126118100460f, + 0.935725689481080370f, -0.352728555755210730f, 0.935658037426032040f, + -0.352907972423500250f, + 0.935590350969512370f, -0.353087376116372480f, 0.935522630114009930f, + -0.353266766827231240f, + 0.935454874862014620f, -0.353446144549480810f, 0.935387085216017770f, + -0.353625509276525970f, + 0.935319261178511610f, -0.353804861001772050f, 0.935251402751989920f, + -0.353984199718624770f, + 0.935183509938947610f, -0.354163525420490340f, 0.935115582741880890f, + -0.354342838100775550f, + 0.935047621163287430f, -0.354522137752887430f, 0.934979625205665800f, + -0.354701424370233830f, + 0.934911594871516090f, -0.354880697946222790f, 0.934843530163339540f, + -0.355059958474262860f, + 0.934775431083638700f, -0.355239205947763310f, 0.934707297634917440f, + -0.355418440360133650f, + 0.934639129819680780f, -0.355597661704783850f, 0.934570927640435030f, + -0.355776869975124640f, + 0.934502691099687870f, -0.355956065164566850f, 0.934434420199948050f, + -0.356135247266522130f, + 0.934366114943725790f, -0.356314416274402410f, 0.934297775333532530f, + -0.356493572181620090f, + 0.934229401371880820f, -0.356672714981588260f, 0.934160993061284530f, + -0.356851844667720300f, + 0.934092550404258980f, -0.357030961233429980f, 0.934024073403320390f, + -0.357210064672131960f, + 0.933955562060986730f, -0.357389154977240940f, 0.933887016379776890f, + -0.357568232142172260f, + 0.933818436362210960f, -0.357747296160341900f, 0.933749822010810580f, + -0.357926347025166010f, + 0.933681173328098410f, -0.358105384730061590f, 0.933612490316598540f, + -0.358284409268445850f, + 0.933543772978836170f, -0.358463420633736540f, 0.933475021317337950f, + -0.358642418819351990f, + 0.933406235334631520f, -0.358821403818710860f, 0.933337415033246190f, + -0.359000375625232460f, + 0.933268560415712050f, -0.359179334232336500f, 0.933199671484560730f, + -0.359358279633443130f, + 0.933130748242325230f, -0.359537211821973070f, 0.933061790691539380f, + -0.359716130791347570f, + 0.932992798834738960f, -0.359895036534988110f, 0.932923772674460140f, + -0.360073929046317020f, + 0.932854712213241120f, -0.360252808318756890f, 0.932785617453621100f, + -0.360431674345730700f, + 0.932716488398140250f, -0.360610527120662270f, 0.932647325049340450f, + -0.360789366636975580f, + 0.932578127409764420f, -0.360968192888095230f, 0.932508895481956590f, + -0.361147005867446250f, + 0.932439629268462360f, -0.361325805568454280f, 0.932370328771828460f, + -0.361504591984545260f, + 0.932300993994602760f, -0.361683365109145840f, 0.932231624939334540f, + -0.361862124935682980f, + 0.932162221608574430f, -0.362040871457584180f, 0.932092784004874050f, + -0.362219604668277460f, + 0.932023312130786490f, -0.362398324561191310f, 0.931953805988866010f, + -0.362577031129754760f, + 0.931884265581668150f, -0.362755724367397230f, 0.931814690911749730f, + -0.362934404267548640f, + 0.931745081981668720f, -0.363113070823639470f, 0.931675438793984620f, + -0.363291724029100760f, + 0.931605761351257830f, -0.363470363877363760f, 0.931536049656050300f, + -0.363648990361860550f, + 0.931466303710925090f, -0.363827603476023500f, 0.931396523518446600f, + -0.364006203213285470f, + 0.931326709081180430f, -0.364184789567079890f, 0.931256860401693420f, + -0.364363362530840620f, + 0.931186977482553750f, -0.364541922098002120f, 0.931117060326330790f, + -0.364720468261999280f, + 0.931047108935595280f, -0.364899001016267320f, 0.930977123312918930f, + -0.365077520354242180f, + 0.930907103460875130f, -0.365256026269360320f, 0.930837049382038150f, + -0.365434518755058390f, + 0.930766961078983710f, -0.365612997804773850f, 0.930696838554288860f, + -0.365791463411944570f, + 0.930626681810531760f, -0.365969915570008740f, 0.930556490850291800f, + -0.366148354272405330f, + 0.930486265676149780f, -0.366326779512573590f, 0.930416006290687550f, + -0.366505191283953370f, + 0.930345712696488470f, -0.366683589579984930f, 0.930275384896137150f, + -0.366861974394109060f, + 0.930205022892219070f, -0.367040345719767180f, 0.930134626687321390f, + -0.367218703550400980f, + 0.930064196284032360f, -0.367397047879452710f, 0.929993731684941480f, + -0.367575378700365330f, + 0.929923232892639670f, -0.367753696006581980f, 0.929852699909718750f, + -0.367931999791546450f, + 0.929782132738772190f, -0.368110290048703050f, 0.929711531382394370f, + -0.368288566771496570f, + 0.929640895843181330f, -0.368466829953372320f, 0.929570226123729860f, + -0.368645079587776040f, + 0.929499522226638560f, -0.368823315668153910f, 0.929428784154506800f, + -0.369001538187952780f, + 0.929358011909935500f, -0.369179747140620020f, 0.929287205495526790f, + -0.369357942519603130f, + 0.929216364913884040f, -0.369536124318350650f, 0.929145490167611720f, + -0.369714292530311240f, + 0.929074581259315860f, -0.369892447148934100f, 0.929003638191603360f, + -0.370070588167669080f, + 0.928932660967082820f, -0.370248715579966360f, 0.928861649588363700f, + -0.370426829379276790f, + 0.928790604058057020f, -0.370604929559051670f, 0.928719524378774810f, + -0.370783016112742560f, + 0.928648410553130520f, -0.370961089033801980f, 0.928577262583738850f, + -0.371139148315682570f, + 0.928506080473215590f, -0.371317193951837540f, 0.928434864224177980f, + -0.371495225935720760f, + 0.928363613839244370f, -0.371673244260786520f, 0.928292329321034670f, + -0.371851248920489490f, + 0.928221010672169440f, -0.372029239908285010f, 0.928149657895271150f, + -0.372207217217628840f, + 0.928078270992963140f, -0.372385180841977360f, 0.928006849967869970f, + -0.372563130774787250f, + 0.927935394822617890f, -0.372741067009515760f, 0.927863905559833780f, + -0.372918989539620830f, + 0.927792382182146320f, -0.373096898358560640f, 0.927720824692185200f, + -0.373274793459793970f, + 0.927649233092581180f, -0.373452674836780300f, 0.927577607385966730f, + -0.373630542482979280f, + 0.927505947574975180f, -0.373808396391851210f, 0.927434253662241300f, + -0.373986236556857030f, + 0.927362525650401110f, -0.374164062971457930f, 0.927290763542091720f, + -0.374341875629115920f, + 0.927218967339951790f, -0.374519674523293210f, 0.927147137046620880f, + -0.374697459647452600f, + 0.927075272664740100f, -0.374875230995057540f, 0.927003374196951670f, + -0.375052988559571920f, + 0.926931441645899130f, -0.375230732334459920f, 0.926859475014227160f, + -0.375408462313186590f, + 0.926787474304581750f, -0.375586178489217220f, 0.926715439519610330f, + -0.375763880856017700f, + 0.926643370661961230f, -0.375941569407054420f, 0.926571267734284330f, + -0.376119244135794340f, + 0.926499130739230510f, -0.376296905035704790f, 0.926426959679452210f, + -0.376474552100253770f, + 0.926354754557602860f, -0.376652185322909560f, 0.926282515376337210f, + -0.376829804697141280f, + 0.926210242138311380f, -0.377007410216418260f, 0.926137934846182560f, + -0.377185001874210450f, + 0.926065593502609310f, -0.377362579663988340f, 0.925993218110251480f, + -0.377540143579222940f, + 0.925920808671770070f, -0.377717693613385640f, 0.925848365189827270f, + -0.377895229759948490f, + 0.925775887667086740f, -0.378072752012383990f, 0.925703376106213230f, + -0.378250260364165200f, + 0.925630830509872720f, -0.378427754808765560f, 0.925558250880732740f, + -0.378605235339659120f, + 0.925485637221461490f, -0.378782701950320540f, 0.925412989534729060f, + -0.378960154634224720f, + 0.925340307823206310f, -0.379137593384847320f, 0.925267592089565660f, + -0.379315018195664430f, + 0.925194842336480530f, -0.379492429060152630f, 0.925122058566625880f, + -0.379669825971788940f, + 0.925049240782677580f, -0.379847208924051160f, 0.924976388987313160f, + -0.380024577910417270f, + 0.924903503183210910f, -0.380201932924366050f, 0.924830583373050800f, + -0.380379273959376600f, + 0.924757629559513910f, -0.380556601008928520f, 0.924684641745282420f, + -0.380733914066502140f, + 0.924611619933039970f, -0.380911213125578070f, 0.924538564125471420f, + -0.381088498179637520f, + 0.924465474325262600f, -0.381265769222162380f, 0.924392350535101050f, + -0.381443026246634730f, + 0.924319192757675160f, -0.381620269246537360f, 0.924246000995674890f, + -0.381797498215353640f, + 0.924172775251791200f, -0.381974713146567220f, 0.924099515528716280f, + -0.382151914033662610f, + 0.924026221829143850f, -0.382329100870124510f, 0.923952894155768640f, + -0.382506273649438230f, + 0.923879532511286740f, -0.382683432365089780f, 0.923806136898395410f, + -0.382860577010565420f, + 0.923732707319793290f, -0.383037707579352020f, 0.923659243778179980f, + -0.383214824064937180f, + 0.923585746276256670f, -0.383391926460808660f, 0.923512214816725630f, + -0.383569014760454910f, + 0.923438649402290370f, -0.383746088957365010f, 0.923365050035655720f, + -0.383923149045028390f, + 0.923291416719527640f, -0.384100195016935040f, 0.923217749456613500f, + -0.384277226866575510f, + 0.923144048249621930f, -0.384454244587440820f, 0.923070313101262420f, + -0.384631248173022580f, + 0.922996544014246250f, -0.384808237616812880f, 0.922922740991285680f, + -0.384985212912304200f, + 0.922848904035094120f, -0.385162174052989860f, 0.922775033148386380f, + -0.385339121032363340f, + 0.922701128333878630f, -0.385516053843918850f, 0.922627189594287910f, + -0.385692972481151140f, + 0.922553216932332830f, -0.385869876937555310f, 0.922479210350733210f, + -0.386046767206627170f, + 0.922405169852209880f, -0.386223643281862980f, 0.922331095439485440f, + -0.386400505156759440f, + 0.922256987115283030f, -0.386577352824813920f, 0.922182844882327600f, + -0.386754186279524180f, + 0.922108668743345180f, -0.386931005514388580f, 0.922034458701062820f, + -0.387107810522905990f, + 0.921960214758209220f, -0.387284601298575840f, 0.921885936917513970f, + -0.387461377834897870f, + 0.921811625181708120f, -0.387638140125372730f, 0.921737279553523910f, + -0.387814888163501180f, + 0.921662900035694730f, -0.387991621942784860f, 0.921588486630955490f, + -0.388168341456725740f, + 0.921514039342042010f, -0.388345046698826250f, 0.921439558171691430f, + -0.388521737662589570f, + 0.921365043122642340f, -0.388698414341519190f, 0.921290494197634540f, + -0.388875076729119250f, + 0.921215911399408730f, -0.389051724818894380f, 0.921141294730707270f, + -0.389228358604349730f, + 0.921066644194273640f, -0.389404978078990940f, 0.920991959792852310f, + -0.389581583236324300f, + 0.920917241529189520f, -0.389758174069856410f, 0.920842489406032190f, + -0.389934750573094730f, + 0.920767703426128790f, -0.390111312739546910f, 0.920692883592229120f, + -0.390287860562721190f, + 0.920618029907083970f, -0.390464394036126590f, 0.920543142373445480f, + -0.390640913153272430f, + 0.920468220994067110f, -0.390817417907668500f, 0.920393265771703550f, + -0.390993908292825380f, + 0.920318276709110590f, -0.391170384302253870f, 0.920243253809045370f, + -0.391346845929465560f, + 0.920168197074266340f, -0.391523293167972410f, 0.920093106507533180f, + -0.391699726011286940f, + 0.920017982111606570f, -0.391876144452922350f, 0.919942823889248640f, + -0.392052548486392090f, + 0.919867631843222950f, -0.392228938105210310f, 0.919792405976293860f, + -0.392405313302891690f, + 0.919717146291227360f, -0.392581674072951470f, 0.919641852790790470f, + -0.392758020408905280f, + 0.919566525477751530f, -0.392934352304269490f, 0.919491164354880100f, + -0.393110669752560760f, + 0.919415769424947070f, -0.393286972747296400f, 0.919340340690724340f, + -0.393463261281994330f, + 0.919264878154985370f, -0.393639535350172880f, 0.919189381820504470f, + -0.393815794945351020f, + 0.919113851690057770f, -0.393992040061048100f, 0.919038287766422050f, + -0.394168270690784080f, + 0.918962690052375630f, -0.394344486828079600f, 0.918887058550697970f, + -0.394520688466455600f, + 0.918811393264170050f, -0.394696875599433560f, 0.918735694195573550f, + -0.394873048220535760f, + 0.918659961347691900f, -0.395049206323284770f, 0.918584194723309540f, + -0.395225349901203670f, + 0.918508394325212250f, -0.395401478947816350f, 0.918432560156186910f, + -0.395577593456646840f, + 0.918356692219021720f, -0.395753693421220080f, 0.918280790516506130f, + -0.395929778835061250f, + 0.918204855051430900f, -0.396105849691696270f, 0.918128885826588030f, + -0.396281905984651520f, + 0.918052882844770380f, -0.396457947707453910f, 0.917976846108772730f, + -0.396633974853630830f, + 0.917900775621390500f, -0.396809987416710310f, 0.917824671385420570f, + -0.396985985390220900f, + 0.917748533403661250f, -0.397161968767691610f, 0.917672361678911860f, + -0.397337937542652060f, + 0.917596156213972950f, -0.397513891708632330f, 0.917519917011646260f, + -0.397689831259163180f, + 0.917443644074735220f, -0.397865756187775750f, 0.917367337406043930f, + -0.398041666488001770f, + 0.917290997008377910f, -0.398217562153373560f, 0.917214622884544250f, + -0.398393443177423980f, + 0.917138215037350710f, -0.398569309553686300f, 0.917061773469606820f, + -0.398745161275694430f, + 0.916985298184123000f, -0.398920998336982910f, 0.916908789183710990f, + -0.399096820731086540f, + 0.916832246471183890f, -0.399272628451540990f, 0.916755670049355990f, + -0.399448421491882140f, + 0.916679059921042700f, -0.399624199845646790f, 0.916602416089060790f, + -0.399799963506371980f, + 0.916525738556228210f, -0.399975712467595330f, 0.916449027325364150f, + -0.400151446722855130f, + 0.916372282399289140f, -0.400327166265690090f, 0.916295503780824800f, + -0.400502871089639500f, + 0.916218691472794220f, -0.400678561188243240f, 0.916141845478021350f, + -0.400854236555041650f, + 0.916064965799331720f, -0.401029897183575620f, 0.915988052439551950f, + -0.401205543067386710f, + 0.915911105401509880f, -0.401381174200016790f, 0.915834124688034710f, + -0.401556790575008540f, + 0.915757110301956720f, -0.401732392185905010f, 0.915680062246107650f, + -0.401907979026249700f, + 0.915602980523320230f, -0.402083551089586990f, 0.915525865136428530f, + -0.402259108369461490f, + 0.915448716088267830f, -0.402434650859418430f, 0.915371533381674760f, + -0.402610178553003680f, + 0.915294317019487050f, -0.402785691443763530f, 0.915217067004543860f, + -0.402961189525244900f, + 0.915139783339685260f, -0.403136672790995300f, 0.915062466027752760f, + -0.403312141234562550f, + 0.914985115071589310f, -0.403487594849495310f, 0.914907730474038730f, + -0.403663033629342640f, + 0.914830312237946200f, -0.403838457567654070f, 0.914752860366158220f, + -0.404013866657979890f, + 0.914675374861522390f, -0.404189260893870690f, 0.914597855726887790f, + -0.404364640268877810f, + 0.914520302965104450f, -0.404540004776553000f, 0.914442716579023870f, + -0.404715354410448650f, + 0.914365096571498560f, -0.404890689164117580f, 0.914287442945382440f, + -0.405066009031113340f, + 0.914209755703530690f, -0.405241314004989860f, 0.914132034848799460f, + -0.405416604079301630f, + 0.914054280384046570f, -0.405591879247603870f, 0.913976492312130630f, + -0.405767139503452060f, + 0.913898670635911680f, -0.405942384840402510f, 0.913820815358251100f, + -0.406117615252011840f, + 0.913742926482011390f, -0.406292830731837360f, 0.913665004010056350f, + -0.406468031273437000f, + 0.913587047945250810f, -0.406643216870369030f, 0.913509058290461140f, + -0.406818387516192310f, + 0.913431035048554720f, -0.406993543204466510f, 0.913352978222400250f, + -0.407168683928751550f, + 0.913274887814867760f, -0.407343809682607970f, 0.913196763828828200f, + -0.407518920459596920f, + 0.913118606267154240f, -0.407694016253280110f, 0.913040415132719160f, + -0.407869097057219800f, + 0.912962190428398210f, -0.408044162864978690f, 0.912883932157067200f, + -0.408219213670120100f, + 0.912805640321603500f, -0.408394249466208000f, 0.912727314924885900f, + -0.408569270246806780f, + 0.912648955969793900f, -0.408744276005481360f, 0.912570563459208730f, + -0.408919266735797430f, + 0.912492137396012650f, -0.409094242431320980f, 0.912413677783089020f, + -0.409269203085618590f, + 0.912335184623322750f, -0.409444148692257590f, 0.912256657919599760f, + -0.409619079244805670f, + 0.912178097674807180f, -0.409793994736831150f, 0.912099503891833470f, + -0.409968895161902880f, + 0.912020876573568340f, -0.410143780513590240f, 0.911942215722902570f, + -0.410318650785463260f, + 0.911863521342728520f, -0.410493505971092410f, 0.911784793435939430f, + -0.410668346064048730f, + 0.911706032005429880f, -0.410843171057903910f, 0.911627237054095650f, + -0.411017980946230210f, + 0.911548408584833990f, -0.411192775722600160f, 0.911469546600543020f, + -0.411367555380587220f, + 0.911390651104122430f, -0.411542319913765220f, 0.911311722098472780f, + -0.411717069315708560f, + 0.911232759586496190f, -0.411891803579992170f, 0.911153763571095900f, + -0.412066522700191560f, + 0.911074734055176360f, -0.412241226669882890f, 0.910995671041643140f, + -0.412415915482642730f, + 0.910916574533403360f, -0.412590589132048210f, 0.910837444533365010f, + -0.412765247611677270f, + 0.910758281044437570f, -0.412939890915108080f, 0.910679084069531570f, + -0.413114519035919450f, + 0.910599853611558930f, -0.413289131967690960f, 0.910520589673432750f, + -0.413463729704002410f, + 0.910441292258067250f, -0.413638312238434500f, 0.910361961368377990f, + -0.413812879564568300f, + 0.910282597007281760f, -0.413987431675985400f, 0.910203199177696540f, + -0.414161968566268080f, + 0.910123767882541680f, -0.414336490228999100f, 0.910044303124737500f, + -0.414510996657761750f, + 0.909964804907205660f, -0.414685487846140010f, 0.909885273232869160f, + -0.414859963787718330f, + 0.909805708104652220f, -0.415034424476081630f, 0.909726109525480160f, + -0.415208869904815590f, + 0.909646477498279540f, -0.415383300067506230f, 0.909566812025978330f, + -0.415557714957740410f, + 0.909487113111505430f, -0.415732114569105360f, 0.909407380757791260f, + -0.415906498895188770f, + 0.909327614967767260f, -0.416080867929579210f, 0.909247815744366310f, + -0.416255221665865480f, + 0.909167983090522380f, -0.416429560097637150f, 0.909088117009170580f, + -0.416603883218484350f, + 0.909008217503247450f, -0.416778191021997650f, 0.908928284575690640f, + -0.416952483501768170f, + 0.908848318229439120f, -0.417126760651387870f, 0.908768318467432890f, + -0.417301022464448890f, + 0.908688285292613360f, -0.417475268934544290f, 0.908608218707923190f, + -0.417649500055267410f, + 0.908528118716306120f, -0.417823715820212270f, 0.908447985320707250f, + -0.417997916222973550f, + 0.908367818524072890f, -0.418172101257146320f, 0.908287618329350450f, + -0.418346270916326260f, + 0.908207384739488700f, -0.418520425194109700f, 0.908127117757437600f, + -0.418694564084093560f, + 0.908046817386148340f, -0.418868687579875050f, 0.907966483628573350f, + -0.419042795675052370f, + 0.907886116487666260f, -0.419216888363223910f, 0.907805715966381930f, + -0.419390965637988890f, + 0.907725282067676440f, -0.419565027492946880f, 0.907644814794507200f, + -0.419739073921698180f, + 0.907564314149832630f, -0.419913104917843620f, 0.907483780136612570f, + -0.420087120474984530f, + 0.907403212757808110f, -0.420261120586722880f, 0.907322612016381420f, + -0.420435105246661170f, + 0.907241977915295820f, -0.420609074448402510f, 0.907161310457516250f, + -0.420783028185550520f, + 0.907080609646008450f, -0.420956966451709440f, 0.906999875483739610f, + -0.421130889240483970f, + 0.906919107973678140f, -0.421304796545479640f, 0.906838307118793430f, + -0.421478688360302280f, + 0.906757472922056550f, -0.421652564678558330f, 0.906676605386439460f, + -0.421826425493854910f, + 0.906595704514915330f, -0.422000270799799680f, 0.906514770310458800f, + -0.422174100590000770f, + 0.906433802776045460f, -0.422347914858067050f, 0.906352801914652400f, + -0.422521713597607820f, + 0.906271767729257660f, -0.422695496802232950f, 0.906190700222840650f, + -0.422869264465553060f, + 0.906109599398381980f, -0.423043016581179040f, 0.906028465258863600f, + -0.423216753142722610f, + 0.905947297807268460f, -0.423390474143796050f, 0.905866097046580940f, + -0.423564179578011960f, + 0.905784862979786550f, -0.423737869438983840f, 0.905703595609872010f, + -0.423911543720325580f, + 0.905622294939825270f, -0.424085202415651560f, 0.905540960972635590f, + -0.424258845518576950f, + 0.905459593711293250f, -0.424432473022717420f, 0.905378193158790090f, + -0.424606084921689110f, + 0.905296759318118820f, -0.424779681209108810f, 0.905215292192273590f, + -0.424953261878593890f, + 0.905133791784249690f, -0.425126826923762360f, 0.905052258097043590f, + -0.425300376338232640f, + 0.904970691133653250f, -0.425473910115623800f, 0.904889090897077470f, + -0.425647428249555590f, + 0.904807457390316540f, -0.425820930733648240f, 0.904725790616371930f, + -0.425994417561522400f, + 0.904644090578246240f, -0.426167888726799620f, 0.904562357278943300f, + -0.426341344223101830f, + 0.904480590721468250f, -0.426514784044051520f, 0.904398790908827350f, + -0.426688208183271860f, + 0.904316957844028320f, -0.426861616634386430f, 0.904235091530079750f, + -0.427035009391019680f, + 0.904153191969991780f, -0.427208386446796320f, 0.904071259166775440f, + -0.427381747795341770f, + 0.903989293123443340f, -0.427555093430282080f, 0.903907293843009050f, + -0.427728423345243800f, + 0.903825261328487510f, -0.427901737533854080f, 0.903743195582894620f, + -0.428075035989740730f, + 0.903661096609247980f, -0.428248318706531960f, 0.903578964410566070f, + -0.428421585677856650f, + 0.903496798989868450f, -0.428594836897344400f, 0.903414600350176290f, + -0.428768072358625070f, + 0.903332368494511820f, -0.428941292055329490f, 0.903250103425898400f, + -0.429114495981088750f, + 0.903167805147360720f, -0.429287684129534610f, 0.903085473661924600f, + -0.429460856494299490f, + 0.903003108972617150f, -0.429634013069016380f, 0.902920711082466740f, + -0.429807153847318710f, + 0.902838279994502830f, -0.429980278822840620f, 0.902755815711756120f, + -0.430153387989216870f, + 0.902673318237258830f, -0.430326481340082610f, 0.902590787574043870f, + -0.430499558869073820f, + 0.902508223725145940f, -0.430672620569826800f, 0.902425626693600380f, + -0.430845666435978660f, + 0.902342996482444200f, -0.431018696461167030f, 0.902260333094715540f, + -0.431191710639029950f, + 0.902177636533453620f, -0.431364708963206330f, 0.902094906801698900f, + -0.431537691427335500f, + 0.902012143902493180f, -0.431710658025057260f, 0.901929347838879460f, + -0.431883608750012250f, + 0.901846518613901750f, -0.432056543595841500f, 0.901763656230605730f, + -0.432229462556186720f, + 0.901680760692037730f, -0.432402365624690140f, 0.901597832001245660f, + -0.432575252794994650f, + 0.901514870161278740f, -0.432748124060743700f, 0.901431875175186970f, + -0.432920979415581280f, + 0.901348847046022030f, -0.433093818853151960f, 0.901265785776836580f, + -0.433266642367100940f, + 0.901182691370684520f, -0.433439449951074090f, 0.901099563830620950f, + -0.433612241598717580f, + 0.901016403159702330f, -0.433785017303678520f, 0.900933209360986200f, + -0.433957777059604420f, + 0.900849982437531450f, -0.434130520860143310f, 0.900766722392397860f, + -0.434303248698943990f, + 0.900683429228646970f, -0.434475960569655650f, 0.900600102949340900f, + -0.434648656465928320f, + 0.900516743557543520f, -0.434821336381412290f, 0.900433351056319830f, + -0.434994000309758710f, + 0.900349925448735600f, -0.435166648244619260f, 0.900266466737858480f, + -0.435339280179646070f, + 0.900182974926756810f, -0.435511896108492000f, 0.900099450018500450f, + -0.435684496024810460f, + 0.900015892016160280f, -0.435857079922255470f, 0.899932300922808510f, + -0.436029647794481560f, + 0.899848676741518580f, -0.436202199635143950f, 0.899765019475365140f, + -0.436374735437898340f, + 0.899681329127423930f, -0.436547255196401200f, 0.899597605700772180f, + -0.436719758904309360f, + 0.899513849198487980f, -0.436892246555280360f, 0.899430059623650860f, + -0.437064718142972370f, + 0.899346236979341570f, -0.437237173661044090f, 0.899262381268642000f, + -0.437409613103154790f, + 0.899178492494635330f, -0.437582036462964400f, 0.899094570660405770f, + -0.437754443734133410f, + 0.899010615769039070f, -0.437926834910322860f, 0.898926627823621870f, + -0.438099209985194470f, + 0.898842606827242370f, -0.438271568952410430f, 0.898758552782989440f, + -0.438443911805633690f, + 0.898674465693953820f, -0.438616238538527660f, 0.898590345563227030f, + -0.438788549144756290f, + 0.898506192393901950f, -0.438960843617984320f, 0.898422006189072530f, + -0.439133121951876930f, + 0.898337786951834310f, -0.439305384140099950f, 0.898253534685283570f, + -0.439477630176319800f, + 0.898169249392518080f, -0.439649860054203480f, 0.898084931076636780f, + -0.439822073767418500f, + 0.898000579740739880f, -0.439994271309633260f, 0.897916195387928660f, + -0.440166452674516320f, + 0.897831778021305650f, -0.440338617855737250f, 0.897747327643974690f, + -0.440510766846965940f, + 0.897662844259040860f, -0.440682899641872900f, 0.897578327869610230f, + -0.440855016234129430f, + 0.897493778478790310f, -0.441027116617407230f, 0.897409196089689720f, + -0.441199200785378660f, + 0.897324580705418320f, -0.441371268731716670f, 0.897239932329087160f, + -0.441543320450094870f, + 0.897155250963808550f, -0.441715355934187310f, 0.897070536612695870f, + -0.441887375177668850f, + 0.896985789278863970f, -0.442059378174214700f, 0.896901008965428790f, + -0.442231364917500980f, + 0.896816195675507300f, -0.442403335401204080f, 0.896731349412217880f, + -0.442575289619001170f, + 0.896646470178680150f, -0.442747227564570020f, 0.896561557978014960f, + -0.442919149231588980f, + 0.896476612813344120f, -0.443091054613736880f, 0.896391634687790820f, + -0.443262943704693320f, + 0.896306623604479550f, -0.443434816498138480f, 0.896221579566536030f, + -0.443606672987752970f, + 0.896136502577086770f, -0.443778513167218220f, 0.896051392639260150f, + -0.443950337030216140f, + 0.895966249756185220f, -0.444122144570429200f, 0.895881073930992370f, + -0.444293935781540580f, + 0.895795865166813530f, -0.444465710657234000f, 0.895710623466781320f, + -0.444637469191193790f, + 0.895625348834030110f, -0.444809211377104880f, 0.895540041271694950f, + -0.444980937208652730f, + 0.895454700782912450f, -0.445152646679523640f, 0.895369327370820310f, + -0.445324339783404190f, + 0.895283921038557580f, -0.445496016513981740f, 0.895198481789264200f, + -0.445667676864944300f, + 0.895113009626081760f, -0.445839320829980290f, 0.895027504552152630f, + -0.446010948402778940f, + 0.894941966570620750f, -0.446182559577030070f, 0.894856395684631050f, + -0.446354154346423840f, + 0.894770791897329550f, -0.446525732704651350f, 0.894685155211863980f, + -0.446697294645404090f, + 0.894599485631382700f, -0.446868840162374160f, 0.894513783159035620f, + -0.447040369249254440f, + 0.894428047797973800f, -0.447211881899738320f, 0.894342279551349480f, + -0.447383378107519600f, + 0.894256478422316040f, -0.447554857866293010f, 0.894170644414028270f, + -0.447726321169753580f, + 0.894084777529641990f, -0.447897768011597310f, 0.893998877772314240f, + -0.448069198385520400f, + 0.893912945145203250f, -0.448240612285219890f, 0.893826979651468620f, + -0.448412009704393430f, + 0.893740981294271040f, -0.448583390636739240f, 0.893654950076772540f, + -0.448754755075955970f, + 0.893568886002135910f, -0.448926103015743260f, 0.893482789073525850f, + -0.449097434449801050f, + 0.893396659294107720f, -0.449268749371829920f, 0.893310496667048200f, + -0.449440047775531150f, + 0.893224301195515320f, -0.449611329654606540f, 0.893138072882678320f, + -0.449782595002758690f, + 0.893051811731707450f, -0.449953843813690520f, 0.892965517745774370f, + -0.450125076081105690f, + 0.892879190928051680f, -0.450296291798708610f, 0.892792831281713610f, + -0.450467490960204110f, + 0.892706438809935390f, -0.450638673559297600f, 0.892620013515893150f, + -0.450809839589695280f, + 0.892533555402764580f, -0.450980989045103860f, 0.892447064473728680f, + -0.451152121919230600f, + 0.892360540731965360f, -0.451323238205783520f, 0.892273984180655840f, + -0.451494337898471100f, + 0.892187394822982480f, -0.451665420991002490f, 0.892100772662129060f, + -0.451836487477087490f, + 0.892014117701280470f, -0.452007537350436420f, 0.891927429943622510f, + -0.452178570604760350f, + 0.891840709392342720f, -0.452349587233770890f, 0.891753956050629460f, + -0.452520587231180050f, + 0.891667169921672280f, -0.452691570590700920f, 0.891580351008662290f, + -0.452862537306046750f, + 0.891493499314791380f, -0.453033487370931580f, 0.891406614843252900f, + -0.453204420779070190f, + 0.891319697597241390f, -0.453375337524177750f, 0.891232747579952520f, + -0.453546237599970090f, + 0.891145764794583180f, -0.453717121000163870f, 0.891058749244331590f, + -0.453887987718476050f, + 0.890971700932396860f, -0.454058837748624430f, 0.890884619861979530f, + -0.454229671084327320f, + 0.890797506036281490f, -0.454400487719303580f, 0.890710359458505630f, + -0.454571287647272950f, + 0.890623180131855930f, -0.454742070861955450f, 0.890535968059537830f, + -0.454912837357071940f, + 0.890448723244757880f, -0.455083587126343840f, 0.890361445690723840f, + -0.455254320163493100f, + 0.890274135400644600f, -0.455425036462242360f, 0.890186792377730240f, + -0.455595736016314980f, + 0.890099416625192320f, -0.455766418819434640f, 0.890012008146243260f, + -0.455937084865326030f, + 0.889924566944096720f, -0.456107734147714110f, 0.889837093021967900f, + -0.456278366660324620f, + 0.889749586383072780f, -0.456448982396883920f, 0.889662047030628900f, + -0.456619581351118910f, + 0.889574474967854580f, -0.456790163516757160f, 0.889486870197969900f, + -0.456960728887526980f, + 0.889399232724195520f, -0.457131277457156980f, 0.889311562549753850f, + -0.457301809219376630f, + 0.889223859677868210f, -0.457472324167916060f, 0.889136124111763240f, + -0.457642822296505770f, + 0.889048355854664570f, -0.457813303598877170f, 0.888960554909799310f, + -0.457983768068762120f, + 0.888872721280395630f, -0.458154215699893060f, 0.888784854969682850f, + -0.458324646486003240f, + 0.888696955980891600f, -0.458495060420826270f, 0.888609024317253860f, + -0.458665457498096560f, + 0.888521059982002260f, -0.458835837711549120f, 0.888433062978371320f, + -0.459006201054919630f, + 0.888345033309596350f, -0.459176547521944090f, 0.888256970978913870f, + -0.459346877106359630f, + 0.888168875989561730f, -0.459517189801903480f, 0.888080748344778900f, + -0.459687485602313870f, + 0.887992588047805560f, -0.459857764501329540f, 0.887904395101883240f, + -0.460028026492689650f, + 0.887816169510254440f, -0.460198271570134320f, 0.887727911276163020f, + -0.460368499727404010f, + 0.887639620402853930f, -0.460538710958240010f, 0.887551296893573370f, + -0.460708905256384080f, + 0.887462940751568840f, -0.460879082615578690f, 0.887374551980088850f, + -0.461049243029566900f, + 0.887286130582383150f, -0.461219386492092380f, 0.887197676561702900f, + -0.461389512996899450f, + 0.887109189921300170f, -0.461559622537733080f, 0.887020670664428360f, + -0.461729715108338770f, + 0.886932118794342190f, -0.461899790702462730f, 0.886843534314297410f, + -0.462069849313851750f, + 0.886754917227550840f, -0.462239890936253340f, 0.886666267537361000f, + -0.462409915563415430f, + 0.886577585246987040f, -0.462579923189086810f, 0.886488870359689600f, + -0.462749913807016740f, + 0.886400122878730600f, -0.462919887410955080f, 0.886311342807372780f, + -0.463089843994652530f, + 0.886222530148880640f, -0.463259783551860150f, 0.886133684906519340f, + -0.463429706076329830f, + 0.886044807083555600f, -0.463599611561814010f, 0.885955896683257030f, + -0.463769500002065630f, + 0.885866953708892790f, -0.463939371390838520f, 0.885777978163732940f, + -0.464109225721886950f, + 0.885688970051048960f, -0.464279062988965760f, 0.885599929374113360f, + -0.464448883185830660f, + 0.885510856136199950f, -0.464618686306237820f, 0.885421750340583680f, + -0.464788472343943990f, + 0.885332611990540590f, -0.464958241292706690f, 0.885243441089348270f, + -0.465127993146283950f, + 0.885154237640285110f, -0.465297727898434600f, 0.885065001646630930f, + -0.465467445542917800f, + 0.884975733111666660f, -0.465637146073493660f, 0.884886432038674560f, + -0.465806829483922710f, + 0.884797098430937790f, -0.465976495767966180f, 0.884707732291741040f, + -0.466146144919385890f, + 0.884618333624369920f, -0.466315776931944430f, 0.884528902432111460f, + -0.466485391799404900f, + 0.884439438718253810f, -0.466654989515530920f, 0.884349942486086120f, + -0.466824570074086950f, + 0.884260413738899190f, -0.466994133468838000f, 0.884170852479984500f, + -0.467163679693549770f, + 0.884081258712634990f, -0.467333208741988420f, 0.883991632440144890f, + -0.467502720607920920f, + 0.883901973665809470f, -0.467672215285114770f, 0.883812282392925090f, + -0.467841692767338170f, + 0.883722558624789660f, -0.468011153048359830f, 0.883632802364701870f, + -0.468180596121949290f, + 0.883543013615961880f, -0.468350021981876530f, 0.883453192381870920f, + -0.468519430621912310f, + 0.883363338665731580f, -0.468688822035827900f, 0.883273452470847430f, + -0.468858196217395330f, + 0.883183533800523390f, -0.469027553160387130f, 0.883093582658065370f, + -0.469196892858576580f, + 0.883003599046780830f, -0.469366215305737520f, 0.882913582969978020f, + -0.469535520495644450f, + 0.882823534430966620f, -0.469704808422072460f, 0.882733453433057650f, + -0.469874079078797360f, + 0.882643339979562790f, -0.470043332459595620f, 0.882553194073795510f, + -0.470212568558244170f, + 0.882463015719070150f, -0.470381787368520650f, 0.882372804918702290f, + -0.470550988884203550f, + 0.882282561676008710f, -0.470720173099071600f, 0.882192285994307430f, + -0.470889340006904520f, + 0.882101977876917580f, -0.471058489601482500f, 0.882011637327159590f, + -0.471227621876586340f, + 0.881921264348355050f, -0.471396736825997640f, 0.881830858943826620f, + -0.471565834443498420f, + 0.881740421116898320f, -0.471734914722871430f, 0.881649950870895260f, + -0.471903977657900210f, + 0.881559448209143780f, -0.472073023242368660f, 0.881468913134971440f, + -0.472242051470061490f, + 0.881378345651706920f, -0.472411062334764040f, 0.881287745762680100f, + -0.472580055830262250f, + 0.881197113471222090f, -0.472749031950342790f, 0.881106448780665130f, + -0.472917990688792760f, + 0.881015751694342870f, -0.473086932039400050f, 0.880925022215589880f, + -0.473255855995953320f, + 0.880834260347742040f, -0.473424762552241530f, 0.880743466094136340f, + -0.473593651702054530f, + 0.880652639458111010f, -0.473762523439182850f, 0.880561780443005700f, + -0.473931377757417450f, + 0.880470889052160750f, -0.474100214650549970f, 0.880379965288918150f, + -0.474269034112372980f, + 0.880289009156621010f, -0.474437836136679230f, 0.880198020658613190f, + -0.474606620717262560f, + 0.880106999798240360f, -0.474775387847917120f, 0.880015946578849070f, + -0.474944137522437800f, + 0.879924861003786860f, -0.475112869734620300f, 0.879833743076402940f, + -0.475281584478260740f, + 0.879742592800047410f, -0.475450281747155870f, 0.879651410178071580f, + -0.475618961535103300f, + 0.879560195213827890f, -0.475787623835901120f, 0.879468947910670210f, + -0.475956268643348060f, + 0.879377668271953290f, -0.476124895951243580f, 0.879286356301033250f, + -0.476293505753387690f, + 0.879195012001267480f, -0.476462098043581190f, 0.879103635376014330f, + -0.476630672815625320f, + 0.879012226428633530f, -0.476799230063322090f, 0.878920785162485840f, + -0.476967769780474170f, + 0.878829311580933360f, -0.477136291960884810f, 0.878737805687339390f, + -0.477304796598357890f, + 0.878646267485068130f, -0.477473283686698060f, 0.878554696977485450f, + -0.477641753219710470f, + 0.878463094167957870f, -0.477810205191200990f, 0.878371459059853480f, + -0.477978639594976160f, + 0.878279791656541580f, -0.478147056424843010f, 0.878188091961392250f, + -0.478315455674609480f, + 0.878096359977777130f, -0.478483837338083970f, 0.878004595709069080f, + -0.478652201409075500f, + 0.877912799158641840f, -0.478820547881393890f, 0.877820970329870500f, + -0.478988876748849490f, + 0.877729109226131570f, -0.479157188005253310f, 0.877637215850802230f, + -0.479325481644417070f, + 0.877545290207261350f, -0.479493757660153010f, 0.877453332298888560f, + -0.479662016046274180f, + 0.877361342129065140f, -0.479830256796594190f, 0.877269319701173170f, + -0.479998479904927280f, + 0.877177265018595940f, -0.480166685365088390f, 0.877085178084718420f, + -0.480334873170893020f, + 0.876993058902925890f, -0.480503043316157510f, 0.876900907476605650f, + -0.480671195794698640f, + 0.876808723809145650f, -0.480839330600333960f, 0.876716507903935400f, + -0.481007447726881590f, + 0.876624259764365310f, -0.481175547168160300f, 0.876531979393827100f, + -0.481343628917989710f, + 0.876439666795713610f, -0.481511692970189860f, 0.876347321973419020f, + -0.481679739318581490f, + 0.876254944930338510f, -0.481847767956986030f, 0.876162535669868460f, + -0.482015778879225590f, + 0.876070094195406600f, -0.482183772079122720f, 0.875977620510351770f, + -0.482351747550500980f, + 0.875885114618103810f, -0.482519705287184350f, 0.875792576522063880f, + -0.482687645282997460f, + 0.875700006225634600f, -0.482855567531765670f, 0.875607403732219350f, + -0.483023472027314880f, + 0.875514769045222850f, -0.483191358763471860f, 0.875422102168050940f, + -0.483359227734063810f, + 0.875329403104110890f, -0.483527078932918740f, 0.875236671856810870f, + -0.483694912353865140f, + 0.875143908429560360f, -0.483862727990732270f, 0.875051112825769970f, + -0.484030525837350010f, + 0.874958285048851650f, -0.484198305887549030f, 0.874865425102218320f, + -0.484366068135160420f, + 0.874772532989284150f, -0.484533812574016180f, 0.874679608713464510f, + -0.484701539197948670f, + 0.874586652278176110f, -0.484869248000791060f, 0.874493663686836560f, + -0.485036938976377290f, + 0.874400642942864790f, -0.485204612118541820f, 0.874307590049680950f, + -0.485372267421119770f, + 0.874214505010706300f, -0.485539904877946960f, 0.874121387829363330f, + -0.485707524482859750f, + 0.874028238509075740f, -0.485875126229695250f, 0.873935057053268240f, + -0.486042710112291330f, + 0.873841843465366860f, -0.486210276124486420f, 0.873748597748798870f, + -0.486377824260119440f, + 0.873655319906992630f, -0.486545354513030270f, 0.873562009943377850f, + -0.486712866877059170f, + 0.873468667861384880f, -0.486880361346047340f, 0.873375293664446000f, + -0.487047837913836380f, + 0.873281887355994210f, -0.487215296574268760f, 0.873188448939463790f, + -0.487382737321187360f, + 0.873094978418290090f, -0.487550160148436000f, 0.873001475795909920f, + -0.487717565049858800f, + 0.872907941075761080f, -0.487884952019301040f, 0.872814374261282390f, + -0.488052321050608250f, + 0.872720775355914300f, -0.488219672137626790f, 0.872627144363097960f, + -0.488387005274203530f, + 0.872533481286276170f, -0.488554320454186180f, 0.872439786128892280f, + -0.488721617671423080f, + 0.872346058894391540f, -0.488888896919763170f, 0.872252299586219860f, + -0.489056158193056030f, + 0.872158508207824480f, -0.489223401485151980f, 0.872064684762653860f, + -0.489390626789901920f, + 0.871970829254157810f, -0.489557834101157440f, 0.871876941685786890f, + -0.489725023412770910f, + 0.871783022060993120f, -0.489892194718595190f, 0.871689070383229740f, + -0.490059348012483850f, + 0.871595086655950980f, -0.490226483288291160f, 0.871501070882612530f, + -0.490393600539871970f, + 0.871407023066670950f, -0.490560699761082020f, 0.871312943211584030f, + -0.490727780945777400f, + 0.871218831320811020f, -0.490894844087815090f, 0.871124687397811900f, + -0.491061889181052650f, + 0.871030511446048260f, -0.491228916219348280f, 0.870936303468982760f, + -0.491395925196560780f, + 0.870842063470078980f, -0.491562916106549900f, 0.870747791452801790f, + -0.491729888943175760f, + 0.870653487420617430f, -0.491896843700299290f, 0.870559151376993250f, + -0.492063780371782000f, + 0.870464783325397670f, -0.492230698951486020f, 0.870370383269300270f, + -0.492397599433274380f, + 0.870275951212171940f, -0.492564481811010590f, 0.870181487157484560f, + -0.492731346078558840f, + 0.870086991108711460f, -0.492898192229784040f, 0.869992463069326870f, + -0.493065020258551700f, + 0.869897903042806340f, -0.493231830158727900f, 0.869803311032626650f, + -0.493398621924179770f, + 0.869708687042265670f, -0.493565395548774770f, 0.869614031075202300f, + -0.493732151026381020f, + 0.869519343134916860f, -0.493898888350867480f, 0.869424623224890890f, + -0.494065607516103570f, + 0.869329871348606840f, -0.494232308515959670f, 0.869235087509548370f, + -0.494398991344306650f, + 0.869140271711200560f, -0.494565655995015950f, 0.869045423957049530f, + -0.494732302461959870f, + 0.868950544250582380f, -0.494898930739011260f, 0.868855632595287860f, + -0.495065540820043560f, + 0.868760688994655310f, -0.495232132698931180f, 0.868665713452175690f, + -0.495398706369549020f, + 0.868570705971340900f, -0.495565261825772540f, 0.868475666555644120f, + -0.495731799061477960f, + 0.868380595208579800f, -0.495898318070542190f, 0.868285491933643350f, + -0.496064818846842890f, + 0.868190356734331310f, -0.496231301384258250f, 0.868095189614141670f, + -0.496397765676667160f, + 0.867999990576573510f, -0.496564211717949290f, 0.867904759625126920f, + -0.496730639501984760f, + 0.867809496763303320f, -0.496897049022654470f, 0.867714201994605140f, + -0.497063440273840250f, + 0.867618875322536230f, -0.497229813249424220f, 0.867523516750601460f, + -0.497396167943289280f, + 0.867428126282306920f, -0.497562504349319150f, 0.867332703921159800f, + -0.497728822461397940f, + 0.867237249670668400f, -0.497895122273410870f, 0.867141763534342470f, + -0.498061403779243410f, + 0.867046245515692650f, -0.498227666972781870f, 0.866950695618230900f, + -0.498393911847913210f, + 0.866855113845470430f, -0.498560138398525140f, 0.866759500200925400f, + -0.498726346618505900f, + 0.866663854688111130f, -0.498892536501744590f, 0.866568177310544470f, + -0.499058708042130870f, + 0.866472468071743050f, -0.499224861233555080f, 0.866376726975225830f, + -0.499390996069908170f, + 0.866280954024512990f, -0.499557112545081840f, 0.866185149223125840f, + -0.499723210652968540f, + 0.866089312574586770f, -0.499889290387461330f, 0.865993444082419520f, + -0.500055351742453860f, + 0.865897543750148820f, -0.500221394711840680f, 0.865801611581300760f, + -0.500387419289516580f, + 0.865705647579402380f, -0.500553425469377420f, 0.865609651747981990f, + -0.500719413245319880f, + 0.865513624090569090f, -0.500885382611240710f, 0.865417564610694410f, + -0.501051333561038040f, + 0.865321473311889800f, -0.501217266088609950f, 0.865225350197688200f, + -0.501383180187855770f, + 0.865129195271623800f, -0.501549075852675390f, 0.865033008537231860f, + -0.501714953076969120f, + 0.864936789998049020f, -0.501880811854638290f, 0.864840539657612870f, + -0.502046652179584660f, + 0.864744257519462380f, -0.502212474045710790f, 0.864647943587137480f, + -0.502378277446919760f, + 0.864551597864179340f, -0.502544062377115690f, 0.864455220354130360f, + -0.502709828830202990f, + 0.864358811060534030f, -0.502875576800086990f, 0.864262369986934950f, + -0.503041306280673450f, + 0.864165897136879300f, -0.503207017265868920f, 0.864069392513913790f, + -0.503372709749581040f, + 0.863972856121586810f, -0.503538383725717580f, 0.863876287963447510f, + -0.503704039188187070f, + 0.863779688043046720f, -0.503869676130898950f, 0.863683056363935830f, + -0.504035294547763190f, + 0.863586392929668100f, -0.504200894432690340f, 0.863489697743797140f, + -0.504366475779592040f, + 0.863392970809878420f, -0.504532038582380270f, 0.863296212131468230f, + -0.504697582834967570f, + 0.863199421712124160f, -0.504863108531267590f, 0.863102599555404910f, + -0.505028615665194080f, + 0.863005745664870320f, -0.505194104230662240f, 0.862908860044081400f, + -0.505359574221587280f, + 0.862811942696600330f, -0.505525025631885390f, 0.862714993625990690f, + -0.505690458455473450f, + 0.862618012835816740f, -0.505855872686268860f, 0.862521000329644520f, + -0.506021268318189720f, + 0.862423956111040610f, -0.506186645345155230f, 0.862326880183573060f, + -0.506352003761084800f, + 0.862229772550811240f, -0.506517343559898530f, 0.862132633216325380f, + -0.506682664735517600f, + 0.862035462183687210f, -0.506847967281863210f, 0.861938259456469290f, + -0.507013251192858230f, + 0.861841025038245330f, -0.507178516462425180f, 0.861743758932590700f, + -0.507343763084487920f, + 0.861646461143081300f, -0.507508991052970870f, 0.861549131673294720f, + -0.507674200361798890f, + 0.861451770526809320f, -0.507839391004897720f, 0.861354377707204910f, + -0.508004562976194010f, + 0.861256953218062170f, -0.508169716269614600f, 0.861159497062963350f, + -0.508334850879087360f, + 0.861062009245491480f, -0.508499966798540930f, 0.860964489769231010f, + -0.508665064021904030f, + 0.860866938637767310f, -0.508830142543106990f, 0.860769355854687170f, + -0.508995202356080090f, + 0.860671741423578380f, -0.509160243454754640f, 0.860574095348029980f, + -0.509325265833062480f, + 0.860476417631632070f, -0.509490269484936360f, 0.860378708277976130f, + -0.509655254404309250f, + 0.860280967290654510f, -0.509820220585115450f, 0.860183194673260990f, + -0.509985168021289460f, + 0.860085390429390140f, -0.510150096706766810f, 0.859987554562638200f, + -0.510315006635483240f, + 0.859889687076602290f, -0.510479897801375700f, 0.859791787974880650f, + -0.510644770198381610f, + 0.859693857261072610f, -0.510809623820439040f, 0.859595894938779080f, + -0.510974458661486830f, + 0.859497901011601730f, -0.511139274715464390f, 0.859399875483143450f, + -0.511304071976312000f, + 0.859301818357008470f, -0.511468850437970300f, 0.859203729636801920f, + -0.511633610094381240f, + 0.859105609326130450f, -0.511798350939486890f, 0.859007457428601520f, + -0.511963072967230200f, + 0.858909273947823900f, -0.512127776171554690f, 0.858811058887407610f, + -0.512292460546404870f, + 0.858712812250963520f, -0.512457126085725690f, 0.858614534042104190f, + -0.512621772783462990f, + 0.858516224264442740f, -0.512786400633562960f, 0.858417882921593930f, + -0.512951009629972980f, + 0.858319510017173440f, -0.513115599766640560f, 0.858221105554798250f, + -0.513280171037514220f, + 0.858122669538086140f, -0.513444723436543460f, 0.858024201970656540f, + -0.513609256957677780f, + 0.857925702856129790f, -0.513773771594868030f, 0.857827172198127430f, + -0.513938267342065380f, + 0.857728610000272120f, -0.514102744193221660f, 0.857630016266187620f, + -0.514267202142289710f, + 0.857531390999499150f, -0.514431641183222820f, 0.857432734203832700f, + -0.514596061309975040f, + 0.857334045882815590f, -0.514760462516501200f, 0.857235326040076460f, + -0.514924844796756490f, + 0.857136574679244980f, -0.515089208144697160f, 0.857037791803951680f, + -0.515253552554280180f, + 0.856938977417828760f, -0.515417878019462930f, 0.856840131524509220f, + -0.515582184534203790f, + 0.856741254127627470f, -0.515746472092461380f, 0.856642345230818840f, + -0.515910740688195650f, + 0.856543404837719960f, -0.516074990315366630f, 0.856444432951968590f, + -0.516239220967935510f, + 0.856345429577203610f, -0.516403432639863990f, 0.856246394717065210f, + -0.516567625325114350f, + 0.856147328375194470f, -0.516731799017649870f, 0.856048230555233940f, + -0.516895953711434150f, + 0.855949101260826910f, -0.517060089400431910f, 0.855849940495618240f, + -0.517224206078608310f, + 0.855750748263253920f, -0.517388303739929060f, 0.855651524567380690f, + -0.517552382378360880f, + 0.855552269411646860f, -0.517716441987871150f, 0.855452982799701830f, + -0.517880482562427690f, + 0.855353664735196030f, -0.518044504095999340f, 0.855254315221780970f, + -0.518208506582555460f, + 0.855154934263109620f, -0.518372490016066110f, 0.855055521862835950f, + -0.518536454390502220f, + 0.854956078024614930f, -0.518700399699834950f, 0.854856602752102850f, + -0.518864325938036890f, + 0.854757096048957220f, -0.519028233099080860f, 0.854657557918836460f, + -0.519192121176940250f, + 0.854557988365400530f, -0.519355990165589640f, 0.854458387392310170f, + -0.519519840059003760f, + 0.854358755003227440f, -0.519683670851158410f, 0.854259091201815530f, + -0.519847482536030190f, + 0.854159395991738850f, -0.520011275107596040f, 0.854059669376662780f, + -0.520175048559833760f, + 0.853959911360254180f, -0.520338802886721960f, 0.853860121946180770f, + -0.520502538082239670f, + 0.853760301138111410f, -0.520666254140367160f, 0.853660448939716380f, + -0.520829951055084670f, + 0.853560565354666840f, -0.520993628820373920f, 0.853460650386635320f, + -0.521157287430216610f, + 0.853360704039295430f, -0.521320926878595660f, 0.853260726316321880f, + -0.521484547159494330f, + 0.853160717221390420f, -0.521648148266897090f, 0.853060676758178320f, + -0.521811730194788550f, + 0.852960604930363630f, -0.521975292937154390f, 0.852860501741625750f, + -0.522138836487980760f, + 0.852760367195645300f, -0.522302360841254590f, 0.852660201296103760f, + -0.522465865990963780f, + 0.852560004046684080f, -0.522629351931096610f, 0.852459775451070100f, + -0.522792818655642090f, + 0.852359515512947090f, -0.522956266158590140f, 0.852259224236001090f, + -0.523119694433931250f, + 0.852158901623919830f, -0.523283103475656430f, 0.852058547680391690f, + -0.523446493277757830f, + 0.851958162409106380f, -0.523609863834227920f, 0.851857745813754840f, + -0.523773215139060170f, + 0.851757297898029120f, -0.523936547186248600f, 0.851656818665622370f, + -0.524099859969787700f, + 0.851556308120228980f, -0.524263153483673360f, 0.851455766265544310f, + -0.524426427721901400f, + 0.851355193105265200f, -0.524589682678468950f, 0.851254588643089120f, + -0.524752918347373360f, + 0.851153952882715340f, -0.524916134722613000f, 0.851053285827843790f, + -0.525079331798186780f, + 0.850952587482175730f, -0.525242509568094710f, 0.850851857849413530f, + -0.525405668026336930f, + 0.850751096933260790f, -0.525568807166914680f, 0.850650304737422090f, + -0.525731926983829760f, + 0.850549481265603480f, -0.525895027471084630f, 0.850448626521511760f, + -0.526058108622682760f, + 0.850347740508854980f, -0.526221170432628060f, 0.850246823231342710f, + -0.526384212894925100f, + 0.850145874692685210f, -0.526547236003579440f, 0.850044894896594180f, + -0.526710239752597010f, + 0.849943883846782210f, -0.526873224135984590f, 0.849842841546963320f, + -0.527036189147750080f, + 0.849741768000852550f, -0.527199134781901280f, 0.849640663212165910f, + -0.527362061032447540f, + 0.849539527184620890f, -0.527524967893398200f, 0.849438359921936060f, + -0.527687855358763720f, + 0.849337161427830780f, -0.527850723422555230f, 0.849235931706025960f, + -0.528013572078784630f, + 0.849134670760243630f, -0.528176401321464370f, 0.849033378594206800f, + -0.528339211144607690f, + 0.848932055211639610f, -0.528502001542228480f, 0.848830700616267530f, + -0.528664772508341320f, + 0.848729314811817130f, -0.528827524036961870f, 0.848627897802015860f, + -0.528990256122106040f, + 0.848526449590592650f, -0.529152968757790610f, 0.848424970181277600f, + -0.529315661938033260f, + 0.848323459577801640f, -0.529478335656851980f, 0.848221917783896990f, + -0.529640989908265910f, + 0.848120344803297230f, -0.529803624686294610f, 0.848018740639736810f, + -0.529966239984958620f, + 0.847917105296951410f, -0.530128835798278960f, 0.847815438778677930f, + -0.530291412120277310f, + 0.847713741088654380f, -0.530453968944976320f, 0.847612012230619660f, + -0.530616506266399330f, + 0.847510252208314330f, -0.530779024078570140f, 0.847408461025479730f, + -0.530941522375513620f, + 0.847306638685858320f, -0.531104001151255000f, 0.847204785193194090f, + -0.531266460399820390f, + 0.847102900551231500f, -0.531428900115236800f, 0.847000984763716880f, + -0.531591320291531670f, + 0.846899037834397240f, -0.531753720922733320f, 0.846797059767020910f, + -0.531916102002870650f, + 0.846695050565337450f, -0.532078463525973540f, 0.846593010233097190f, + -0.532240805486072220f, + 0.846490938774052130f, -0.532403127877197900f, 0.846388836191954930f, + -0.532565430693382580f, + 0.846286702490559710f, -0.532727713928658810f, 0.846184537673621560f, + -0.532889977577059800f, + 0.846082341744897050f, -0.533052221632619450f, 0.845980114708143270f, + -0.533214446089372960f, + 0.845877856567119000f, -0.533376650941355330f, 0.845775567325584010f, + -0.533538836182603120f, + 0.845673246987299070f, -0.533701001807152960f, 0.845570895556026270f, + -0.533863147809042650f, + 0.845468513035528830f, -0.534025274182310380f, 0.845366099429570970f, + -0.534187380920995380f, + 0.845263654741918220f, -0.534349468019137520f, 0.845161178976337140f, + -0.534511535470777120f, + 0.845058672136595470f, -0.534673583269955510f, 0.844956134226462210f, + -0.534835611410714560f, + 0.844853565249707120f, -0.534997619887097150f, 0.844750965210101510f, + -0.535159608693146600f, + 0.844648334111417820f, -0.535321577822907120f, 0.844545671957429240f, + -0.535483527270423370f, + 0.844442978751910660f, -0.535645457029741090f, 0.844340254498637590f, + -0.535807367094906390f, + 0.844237499201387020f, -0.535969257459966710f, 0.844134712863936930f, + -0.536131128118969460f, + 0.844031895490066410f, -0.536292979065963180f, 0.843929047083555870f, + -0.536454810294997090f, + 0.843826167648186740f, -0.536616621800121040f, 0.843723257187741660f, + -0.536778413575385920f, + 0.843620315706004150f, -0.536940185614842910f, 0.843517343206759200f, + -0.537101937912544130f, + 0.843414339693792760f, -0.537263670462542530f, 0.843311305170892140f, + -0.537425383258891550f, + 0.843208239641845440f, -0.537587076295645390f, 0.843105143110442160f, + -0.537748749566859360f, + 0.843002015580472940f, -0.537910403066588880f, 0.842898857055729310f, + -0.538072036788890600f, + 0.842795667540004120f, -0.538233650727821700f, 0.842692447037091670f, + -0.538395244877439950f, + 0.842589195550786710f, -0.538556819231804100f, 0.842485913084885630f, + -0.538718373784973560f, + 0.842382599643185850f, -0.538879908531008420f, 0.842279255229485990f, + -0.539041423463969440f, + 0.842175879847585570f, -0.539202918577918240f, 0.842072473501285560f, + -0.539364393866917040f, + 0.841969036194387680f, -0.539525849325028890f, 0.841865567930695340f, + -0.539687284946317570f, + 0.841762068714012490f, -0.539848700724847590f, 0.841658538548144760f, + -0.540010096654684020f, + 0.841554977436898440f, -0.540171472729892850f, 0.841451385384081260f, + -0.540332828944540710f, + 0.841347762393501950f, -0.540494165292695230f, 0.841244108468970580f, + -0.540655481768424150f, + 0.841140423614298080f, -0.540816778365796670f, 0.841036707833296650f, + -0.540978055078882080f, + 0.840932961129779780f, -0.541139311901750800f, 0.840829183507561640f, + -0.541300548828474120f, + 0.840725374970458070f, -0.541461765853123440f, 0.840621535522285690f, + -0.541622962969771530f, + 0.840517665166862550f, -0.541784140172491550f, 0.840413763908007480f, + -0.541945297455357360f, + 0.840309831749540770f, -0.542106434812443920f, 0.840205868695283580f, + -0.542267552237826520f, + 0.840101874749058400f, -0.542428649725581250f, 0.839997849914688840f, + -0.542589727269785270f, + 0.839893794195999520f, -0.542750784864515890f, 0.839789707596816370f, + -0.542911822503851730f, + 0.839685590120966110f, -0.543072840181871740f, 0.839581441772277120f, + -0.543233837892655890f, + 0.839477262554578550f, -0.543394815630284800f, 0.839373052471700690f, + -0.543555773388839540f, + 0.839268811527475230f, -0.543716711162402280f, 0.839164539725734680f, + -0.543877628945055980f, + 0.839060237070312740f, -0.544038526730883820f, 0.838955903565044460f, + -0.544199404513970310f, + 0.838851539213765760f, -0.544360262288400400f, 0.838747144020313920f, + -0.544521100048259600f, + 0.838642717988527300f, -0.544681917787634530f, 0.838538261122245280f, + -0.544842715500612360f, + 0.838433773425308340f, -0.545003493181281160f, 0.838329254901558300f, + -0.545164250823729320f, + 0.838224705554838080f, -0.545324988422046460f, 0.838120125388991500f, + -0.545485705970322530f, + 0.838015514407863820f, -0.545646403462648590f, 0.837910872615301170f, + -0.545807080893116140f, + 0.837806200015150940f, -0.545967738255817570f, 0.837701496611261700f, + -0.546128375544845950f, + 0.837596762407483040f, -0.546288992754295210f, 0.837491997407665890f, + -0.546449589878259650f, + 0.837387201615661940f, -0.546610166910834860f, 0.837282375035324320f, + -0.546770723846116800f, + 0.837177517670507300f, -0.546931260678202190f, 0.837072629525066000f, + -0.547091777401188530f, + 0.836967710602857020f, -0.547252274009174090f, 0.836862760907737920f, + -0.547412750496257930f, + 0.836757780443567190f, -0.547573206856539760f, 0.836652769214204950f, + -0.547733643084120090f, + 0.836547727223512010f, -0.547894059173100190f, 0.836442654475350380f, + -0.548054455117581880f, + 0.836337550973583530f, -0.548214830911667780f, 0.836232416722075600f, + -0.548375186549461600f, + 0.836127251724692270f, -0.548535522025067390f, 0.836022055985299880f, + -0.548695837332590090f, + 0.835916829507766360f, -0.548856132466135290f, 0.835811572295960700f, + -0.549016407419809390f, + 0.835706284353752600f, -0.549176662187719660f, 0.835600965685013410f, + -0.549336896763974010f, + 0.835495616293615350f, -0.549497111142680960f, 0.835390236183431890f, + -0.549657305317949870f, + 0.835284825358337370f, -0.549817479283890910f, 0.835179383822207690f, + -0.549977633034614890f, + 0.835073911578919410f, -0.550137766564233630f, 0.834968408632350450f, + -0.550297879866859190f, + 0.834862874986380010f, -0.550457972936604810f, 0.834757310644888230f, + -0.550618045767584330f, + 0.834651715611756440f, -0.550778098353912120f, 0.834546089890866870f, + -0.550938130689703880f, + 0.834440433486103190f, -0.551098142769075430f, 0.834334746401350080f, + -0.551258134586143590f, + 0.834229028640493420f, -0.551418106135026060f, 0.834123280207420100f, + -0.551578057409841000f, + 0.834017501106018130f, -0.551737988404707340f, 0.833911691340176840f, + -0.551897899113745210f, + 0.833805850913786340f, -0.552057789531074980f, 0.833699979830738290f, + -0.552217659650817930f, + 0.833594078094925140f, -0.552377509467096070f, 0.833488145710240770f, + -0.552537338974032120f, + 0.833382182680579730f, -0.552697148165749770f, 0.833276189009838240f, + -0.552856937036373290f, + 0.833170164701913190f, -0.553016705580027470f, 0.833064109760702890f, + -0.553176453790838350f, + 0.832958024190106670f, -0.553336181662932300f, 0.832851907994025090f, + -0.553495889190436570f, + 0.832745761176359460f, -0.553655576367479310f, 0.832639583741012770f, + -0.553815243188189090f, + 0.832533375691888680f, -0.553974889646695500f, 0.832427137032892280f, + -0.554134515737128910f, + 0.832320867767929680f, -0.554294121453620000f, 0.832214567900907980f, + -0.554453706790300930f, + 0.832108237435735590f, -0.554613271741304040f, 0.832001876376321950f, + -0.554772816300762470f, + 0.831895484726577590f, -0.554932340462810370f, 0.831789062490414400f, + -0.555091844221582420f, + 0.831682609671745120f, -0.555251327571213980f, 0.831576126274483740f, + -0.555410790505841630f, + 0.831469612302545240f, -0.555570233019602180f, 0.831363067759845920f, + -0.555729655106633410f, + 0.831256492650303210f, -0.555889056761073810f, 0.831149886977835540f, + -0.556048437977062600f, + 0.831043250746362320f, -0.556207798748739930f, 0.830936583959804410f, + -0.556367139070246370f, + 0.830829886622083570f, -0.556526458935723610f, 0.830723158737122880f, + -0.556685758339313890f, + 0.830616400308846310f, -0.556845037275160100f, 0.830509611341179070f, + -0.557004295737405950f, + 0.830402791838047550f, -0.557163533720196220f, 0.830295941803379070f, + -0.557322751217676160f, + 0.830189061241102370f, -0.557481948223991550f, 0.830082150155146970f, + -0.557641124733289420f, + 0.829975208549443950f, -0.557800280739716990f, 0.829868236427924840f, + -0.557959416237422960f, + 0.829761233794523050f, -0.558118531220556100f, 0.829654200653172640f, + -0.558277625683266330f, + 0.829547137007808910f, -0.558436699619704100f, 0.829440042862368170f, + -0.558595753024020760f, + 0.829332918220788250f, -0.558754785890368310f, 0.829225763087007570f, + -0.558913798212899770f, + 0.829118577464965980f, -0.559072789985768480f, 0.829011361358604430f, + -0.559231761203128900f, + 0.828904114771864870f, -0.559390711859136140f, 0.828796837708690610f, + -0.559549641947945760f, + 0.828689530173025820f, -0.559708551463714680f, 0.828582192168815790f, + -0.559867440400600210f, + 0.828474823700007130f, -0.560026308752760380f, 0.828367424770547480f, + -0.560185156514354080f, + 0.828259995384385660f, -0.560343983679540860f, 0.828152535545471410f, + -0.560502790242481060f, + 0.828045045257755800f, -0.560661576197336030f, 0.827937524525190870f, + -0.560820341538267430f, + 0.827829973351729920f, -0.560979086259438150f, 0.827722391741327220f, + -0.561137810355011420f, + 0.827614779697938400f, -0.561296513819151470f, 0.827507137225519830f, + -0.561455196646023280f, + 0.827399464328029470f, -0.561613858829792420f, 0.827291761009425810f, + -0.561772500364625340f, + 0.827184027273669130f, -0.561931121244689470f, 0.827076263124720270f, + -0.562089721464152480f, + 0.826968468566541600f, -0.562248301017183150f, 0.826860643603096190f, + -0.562406859897951140f, + 0.826752788238348520f, -0.562565398100626560f, 0.826644902476264320f, + -0.562723915619380400f, + 0.826536986320809960f, -0.562882412448384440f, 0.826429039775953500f, + -0.563040888581811230f, + 0.826321062845663530f, -0.563199344013834090f, 0.826213055533910220f, + -0.563357778738627020f, + 0.826105017844664610f, -0.563516192750364800f, 0.825996949781899080f, + -0.563674586043223070f, + 0.825888851349586780f, -0.563832958611378170f, 0.825780722551702430f, + -0.563991310449006970f, + 0.825672563392221390f, -0.564149641550287680f, 0.825564373875120490f, + -0.564307951909398640f, + 0.825456154004377550f, -0.564466241520519500f, 0.825347903783971380f, + -0.564624510377830120f, + 0.825239623217882250f, -0.564782758475511400f, 0.825131312310091070f, + -0.564940985807745210f, + 0.825022971064580220f, -0.565099192368713980f, 0.824914599485333190f, + -0.565257378152600800f, + 0.824806197576334330f, -0.565415543153589660f, 0.824697765341569470f, + -0.565573687365865330f, + 0.824589302785025290f, -0.565731810783613120f, 0.824480809910689500f, + -0.565889913401019570f, + 0.824372286722551250f, -0.566047995212271450f, 0.824263733224600560f, + -0.566206056211556730f, + 0.824155149420828570f, -0.566364096393063840f, 0.824046535315227760f, + -0.566522115750982100f, + 0.823937890911791370f, -0.566680114279501600f, 0.823829216214513990f, + -0.566838091972813320f, + 0.823720511227391430f, -0.566996048825108680f, 0.823611775954420260f, + -0.567153984830580100f, + 0.823503010399598500f, -0.567311899983420800f, 0.823394214566925080f, + -0.567469794277824510f, + 0.823285388460400110f, -0.567627667707986230f, 0.823176532084024860f, + -0.567785520268101140f, + 0.823067645441801670f, -0.567943351952365560f, 0.822958728537734000f, + -0.568101162754976460f, + 0.822849781375826430f, -0.568258952670131490f, 0.822740803960084420f, + -0.568416721692029280f, + 0.822631796294514990f, -0.568574469814869140f, 0.822522758383125940f, + -0.568732197032851050f, + 0.822413690229926390f, -0.568889903340175860f, 0.822304591838926350f, + -0.569047588731045110f, + 0.822195463214137170f, -0.569205253199661200f, 0.822086304359571090f, + -0.569362896740227220f, + 0.821977115279241550f, -0.569520519346947140f, 0.821867895977163250f, + -0.569678121014025600f, + 0.821758646457351750f, -0.569835701735668000f, 0.821649366723823940f, + -0.569993261506080540f, + 0.821540056780597610f, -0.570150800319470300f, 0.821430716631691870f, + -0.570308318170044900f, + 0.821321346281126740f, -0.570465815052012990f, 0.821211945732923550f, + -0.570623290959583750f, + 0.821102514991104650f, -0.570780745886967260f, 0.820993054059693580f, + -0.570938179828374360f, + 0.820883562942714580f, -0.571095592778016690f, 0.820774041644193650f, + -0.571252984730106660f, + 0.820664490168157460f, -0.571410355678857230f, 0.820554908518633890f, + -0.571567705618482580f, + 0.820445296699652050f, -0.571725034543197120f, 0.820335654715241840f, + -0.571882342447216590f, + 0.820225982569434690f, -0.572039629324757050f, 0.820116280266262820f, + -0.572196895170035580f, + 0.820006547809759680f, -0.572354139977269920f, 0.819896785203959810f, + -0.572511363740678790f, + 0.819786992452898990f, -0.572668566454481160f, 0.819677169560613870f, + -0.572825748112897550f, + 0.819567316531142230f, -0.572982908710148560f, 0.819457433368523280f, + -0.573140048240455950f, + 0.819347520076796900f, -0.573297166698042200f, 0.819237576660004520f, + -0.573454264077130400f, + 0.819127603122188240f, -0.573611340371944610f, 0.819017599467391500f, + -0.573768395576709560f, + 0.818907565699658950f, -0.573925429685650750f, 0.818797501823036010f, + -0.574082442692994470f, + 0.818687407841569680f, -0.574239434592967890f, 0.818577283759307610f, + -0.574396405379798750f, + 0.818467129580298660f, -0.574553355047715760f, 0.818356945308593150f, + -0.574710283590948330f, + 0.818246730948242070f, -0.574867191003726740f, 0.818136486503297730f, + -0.575024077280281710f, + 0.818026211977813440f, -0.575180942414845080f, 0.817915907375843850f, + -0.575337786401649450f, + 0.817805572701444270f, -0.575494609234928120f, 0.817695207958671680f, + -0.575651410908915140f, + 0.817584813151583710f, -0.575808191417845340f, 0.817474388284239240f, + -0.575964950755954220f, + 0.817363933360698460f, -0.576121688917478280f, 0.817253448385022340f, + -0.576278405896654910f, + 0.817142933361272970f, -0.576435101687721830f, 0.817032388293513880f, + -0.576591776284917760f, + 0.816921813185809480f, -0.576748429682482410f, 0.816811208042225290f, + -0.576905061874655960f, + 0.816700572866827850f, -0.577061672855679440f, 0.816589907663684890f, + -0.577218262619794920f, + 0.816479212436865390f, -0.577374831161244880f, 0.816368487190439200f, + -0.577531378474272720f, + 0.816257731928477390f, -0.577687904553122800f, 0.816146946655052270f, + -0.577844409392039850f, + 0.816036131374236810f, -0.578000892985269910f, 0.815925286090105510f, + -0.578157355327059360f, + 0.815814410806733780f, -0.578313796411655590f, 0.815703505528198260f, + -0.578470216233306630f, + 0.815592570258576790f, -0.578626614786261430f, 0.815481605001947770f, + -0.578782992064769690f, + 0.815370609762391290f, -0.578939348063081780f, 0.815259584543988280f, + -0.579095682775449090f, + 0.815148529350820830f, -0.579251996196123550f, 0.815037444186972220f, + -0.579408288319357870f, + 0.814926329056526620f, -0.579564559139405630f, 0.814815183963569440f, + -0.579720808650521450f, + 0.814704008912187080f, -0.579877036846960350f, 0.814592803906467270f, + -0.580033243722978150f, + 0.814481568950498610f, -0.580189429272831680f, 0.814370304048371070f, + -0.580345593490778300f, + 0.814259009204175270f, -0.580501736371076490f, 0.814147684422003360f, + -0.580657857907985300f, + 0.814036329705948410f, -0.580813958095764530f, 0.813924945060104600f, + -0.580970036928674770f, + 0.813813530488567190f, -0.581126094400977620f, 0.813702085995432700f, + -0.581282130506935000f, + 0.813590611584798510f, -0.581438145240810170f, 0.813479107260763220f, + -0.581594138596866930f, + 0.813367573027426570f, -0.581750110569369650f, 0.813256008888889380f, + -0.581906061152583810f, + 0.813144414849253590f, -0.582061990340775440f, 0.813032790912622040f, + -0.582217898128211670f, + 0.812921137083098770f, -0.582373784509160110f, 0.812809453364789270f, + -0.582529649477889320f, + 0.812697739761799490f, -0.582685493028668460f, 0.812585996278237130f, + -0.582841315155767650f, + 0.812474222918210480f, -0.582997115853457700f, 0.812362419685829230f, + -0.583152895116010430f, + 0.812250586585203880f, -0.583308652937698290f, 0.812138723620446480f, + -0.583464389312794320f, + 0.812026830795669730f, -0.583620104235572760f, 0.811914908114987790f, + -0.583775797700308070f, + 0.811802955582515470f, -0.583931469701276180f, 0.811690973202369050f, + -0.584087120232753440f, + 0.811578960978665890f, -0.584242749289016980f, 0.811466918915524250f, + -0.584398356864344600f, + 0.811354847017063730f, -0.584553942953015330f, 0.811242745287404810f, + -0.584709507549308390f, + 0.811130613730669190f, -0.584865050647504490f, 0.811018452350979470f, + -0.585020572241884530f, + 0.810906261152459670f, -0.585176072326730410f, 0.810794040139234730f, + -0.585331550896324940f, + 0.810681789315430780f, -0.585487007944951340f, 0.810569508685174630f, + -0.585642443466894420f, + 0.810457198252594770f, -0.585797857456438860f, 0.810344858021820550f, + -0.585953249907870570f, + 0.810232487996982330f, -0.586108620815476430f, 0.810120088182211600f, + -0.586263970173543590f, + 0.810007658581641140f, -0.586419297976360500f, 0.809895199199404450f, + -0.586574604218216170f, + 0.809782710039636530f, -0.586729888893400390f, 0.809670191106473090f, + -0.586885151996203950f, + 0.809557642404051260f, -0.587040393520917970f, 0.809445063936509170f, + -0.587195613461834800f, + 0.809332455707985950f, -0.587350811813247660f, 0.809219817722621750f, + -0.587505988569450020f, + 0.809107149984558240f, -0.587661143724736660f, 0.808994452497937670f, + -0.587816277273402910f, + 0.808881725266903610f, -0.587971389209745010f, 0.808768968295600850f, + -0.588126479528059850f, + 0.808656181588174980f, -0.588281548222645220f, 0.808543365148773010f, + -0.588436595287799790f, + 0.808430518981542720f, -0.588591620717822890f, 0.808317643090633250f, + -0.588746624507014540f, + 0.808204737480194720f, -0.588901606649675720f, 0.808091802154378370f, + -0.589056567140108460f, + 0.807978837117336310f, -0.589211505972614960f, 0.807865842373222120f, + -0.589366423141498790f, + 0.807752817926190360f, -0.589521318641063940f, 0.807639763780396480f, + -0.589676192465615420f, + 0.807526679939997160f, -0.589831044609458790f, 0.807413566409150190f, + -0.589985875066900920f, + 0.807300423192014450f, -0.590140683832248820f, 0.807187250292749960f, + -0.590295470899810830f, + 0.807074047715517610f, -0.590450236263895810f, 0.806960815464479730f, + -0.590604979918813330f, + 0.806847553543799330f, -0.590759701858874160f, 0.806734261957640860f, + -0.590914402078389520f, + 0.806620940710169650f, -0.591069080571671400f, 0.806507589805552260f, + -0.591223737333032910f, + 0.806394209247956240f, -0.591378372356787580f, 0.806280799041550480f, + -0.591532985637249990f, + 0.806167359190504420f, -0.591687577168735430f, 0.806053889698989060f, + -0.591842146945560140f, + 0.805940390571176280f, -0.591996694962040990f, 0.805826861811239300f, + -0.592151221212495530f, + 0.805713303423352230f, -0.592305725691242290f, 0.805599715411690060f, + -0.592460208392600830f, + 0.805486097780429230f, -0.592614669310891130f, 0.805372450533747060f, + -0.592769108440434070f, + 0.805258773675822210f, -0.592923525775551300f, 0.805145067210834230f, + -0.593077921310565470f, + 0.805031331142963660f, -0.593232295039799800f, 0.804917565476392260f, + -0.593386646957578480f, + 0.804803770215302920f, -0.593540977058226390f, 0.804689945363879500f, + -0.593695285336069190f, + 0.804576090926307110f, -0.593849571785433630f, 0.804462206906771840f, + -0.594003836400646690f, + 0.804348293309460780f, -0.594158079176036800f, 0.804234350138562260f, + -0.594312300105932830f, + 0.804120377398265810f, -0.594466499184664430f, 0.804006375092761520f, + -0.594620676406562240f, + 0.803892343226241260f, -0.594774831765957580f, 0.803778281802897570f, + -0.594928965257182420f, + 0.803664190826924090f, -0.595083076874569960f, 0.803550070302515680f, + -0.595237166612453850f, + 0.803435920233868120f, -0.595391234465168730f, 0.803321740625178580f, + -0.595545280427049790f, + 0.803207531480644940f, -0.595699304492433360f, 0.803093292804466400f, + -0.595853306655656280f, + 0.802979024600843250f, -0.596007286911056530f, 0.802864726873976700f, + -0.596161245252972540f, + 0.802750399628069160f, -0.596315181675743710f, 0.802636042867324150f, + -0.596469096173710360f, + 0.802521656595946430f, -0.596622988741213220f, 0.802407240818141300f, + -0.596776859372594390f, + 0.802292795538115720f, -0.596930708062196500f, 0.802178320760077450f, + -0.597084534804362740f, + 0.802063816488235440f, -0.597238339593437420f, 0.801949282726799770f, + -0.597392122423765710f, + 0.801834719479981310f, -0.597545883289693160f, 0.801720126751992330f, + -0.597699622185566830f, + 0.801605504547046150f, -0.597853339105733910f, 0.801490852869356950f, + -0.598007034044542700f, + 0.801376171723140240f, -0.598160706996342270f, 0.801261461112612540f, + -0.598314357955482600f, + 0.801146721041991360f, -0.598467986916314310f, 0.801031951515495330f, + -0.598621593873188920f, + 0.800917152537344300f, -0.598775178820458720f, 0.800802324111759110f, + -0.598928741752476900f, + 0.800687466242961610f, -0.599082282663597310f, 0.800572578935174860f, + -0.599235801548174570f, + 0.800457662192622820f, -0.599389298400564540f, 0.800342716019530660f, + -0.599542773215123390f, + 0.800227740420124790f, -0.599696225986208310f, 0.800112735398632370f, + -0.599849656708177250f, + 0.799997700959281910f, -0.600003065375388940f, 0.799882637106302810f, + -0.600156451982203240f, + 0.799767543843925680f, -0.600309816522980430f, 0.799652421176382240f, + -0.600463158992081580f, + 0.799537269107905010f, -0.600616479383868970f, 0.799422087642728040f, + -0.600769777692705230f, + 0.799306876785086160f, -0.600923053912954090f, 0.799191636539215210f, + -0.601076308038980160f, + 0.799076366909352350f, -0.601229540065148500f, 0.798961067899735760f, + -0.601382749985825420f, + 0.798845739514604580f, -0.601535937795377730f, 0.798730381758199210f, + -0.601689103488172950f, + 0.798614994634760820f, -0.601842247058580030f, 0.798499578148532120f, + -0.601995368500968020f, + 0.798384132303756380f, -0.602148467809707210f, 0.798268657104678430f, + -0.602301544979168550f, + 0.798153152555543750f, -0.602454600003723750f, 0.798037618660599410f, + -0.602607632877745440f, + 0.797922055424093000f, -0.602760643595607220f, 0.797806462850273570f, + -0.602913632151683030f, + 0.797690840943391160f, -0.603066598540348160f, 0.797575189707696700f, + -0.603219542755978440f, + 0.797459509147442460f, -0.603372464792950260f, 0.797343799266881700f, + -0.603525364645641550f, + 0.797228060070268700f, -0.603678242308430370f, 0.797112291561858920f, + -0.603831097775695880f, + 0.796996493745908750f, -0.603983931041818020f, 0.796880666626675780f, + -0.604136742101177520f, + 0.796764810208418830f, -0.604289530948155960f, 0.796648924495397260f, + -0.604442297577135860f, + 0.796533009491872000f, -0.604595041982500360f, 0.796417065202104980f, + -0.604747764158633410f, + 0.796301091630359110f, -0.604900464099919820f, 0.796185088780898440f, + -0.605053141800745320f, + 0.796069056657987990f, -0.605205797255496500f, 0.795952995265893910f, + -0.605358430458560530f, + 0.795836904608883570f, -0.605511041404325550f, 0.795720784691225090f, + -0.605663630087180380f, + 0.795604635517188070f, -0.605816196501514970f, 0.795488457091042990f, + -0.605968740641719680f, + 0.795372249417061310f, -0.606121262502186120f, 0.795256012499515610f, + -0.606273762077306430f, + 0.795139746342679590f, -0.606426239361473550f, 0.795023450950828050f, + -0.606578694349081290f, + 0.794907126328237010f, -0.606731127034524480f, 0.794790772479183170f, + -0.606883537412198470f, + 0.794674389407944550f, -0.607035925476499650f, 0.794557977118800380f, + -0.607188291221825160f, + 0.794441535616030590f, -0.607340634642572930f, 0.794325064903916520f, + -0.607492955733141550f, + 0.794208564986740640f, -0.607645254487930830f, 0.794092035868785960f, + -0.607797530901341140f, + 0.793975477554337170f, -0.607949784967773630f, 0.793858890047679730f, + -0.608102016681630440f, + 0.793742273353100210f, -0.608254226037314490f, 0.793625627474886300f, + -0.608406413029229150f, + 0.793508952417326660f, -0.608558577651779450f, 0.793392248184711100f, + -0.608710719899370310f, + 0.793275514781330630f, -0.608862839766408200f, 0.793158752211477140f, + -0.609014937247299830f, + 0.793041960479443640f, -0.609167012336453210f, 0.792925139589524260f, + -0.609319065028276820f, + 0.792808289546014120f, -0.609471095317180240f, 0.792691410353209450f, + -0.609623103197573730f, + 0.792574502015407690f, -0.609775088663868430f, 0.792457564536907080f, + -0.609927051710476120f, + 0.792340597922007170f, -0.610078992331809620f, 0.792223602175008310f, + -0.610230910522282620f, + 0.792106577300212390f, -0.610382806276309480f, 0.791989523301921850f, + -0.610534679588305320f, + 0.791872440184440470f, -0.610686530452686280f, 0.791755327952073150f, + -0.610838358863869170f, + 0.791638186609125880f, -0.610990164816271660f, 0.791521016159905220f, + -0.611141948304312570f, + 0.791403816608719500f, -0.611293709322410890f, 0.791286587959877830f, + -0.611445447864987000f, + 0.791169330217690200f, -0.611597163926461910f, 0.791052043386467950f, + -0.611748857501257290f, + 0.790934727470523290f, -0.611900528583796070f, 0.790817382474169770f, + -0.612052177168501470f, + 0.790700008401721610f, -0.612203803249797950f, 0.790582605257494460f, + -0.612355406822110650f, + 0.790465173045804880f, -0.612506987879865570f, 0.790347711770970520f, + -0.612658546417489290f, + 0.790230221437310030f, -0.612810082429409710f, 0.790112702049143300f, + -0.612961595910055170f, + 0.789995153610791090f, -0.613113086853854910f, 0.789877576126575280f, + -0.613264555255239040f, + 0.789759969600819070f, -0.613416001108638590f, 0.789642334037846340f, + -0.613567424408485330f, + 0.789524669441982190f, -0.613718825149211720f, 0.789406975817552930f, + -0.613870203325251330f, + 0.789289253168885650f, -0.614021558931038380f, 0.789171501500308900f, + -0.614172891961007990f, + 0.789053720816151880f, -0.614324202409595950f, 0.788935911120745240f, + -0.614475490271239040f, + 0.788818072418420280f, -0.614626755540375050f, 0.788700204713509660f, + -0.614777998211442080f, + 0.788582308010347120f, -0.614929218278879590f, 0.788464382313267540f, + -0.615080415737127460f, + 0.788346427626606340f, -0.615231590580626820f, 0.788228443954700490f, + -0.615382742803819220f, + 0.788110431301888070f, -0.615533872401147320f, 0.787992389672507950f, + -0.615684979367054570f, + 0.787874319070900220f, -0.615836063695985090f, 0.787756219501406060f, + -0.615987125382383760f, + 0.787638090968367450f, -0.616138164420696910f, 0.787519933476127810f, + -0.616289180805370980f, + 0.787401747029031430f, -0.616440174530853650f, 0.787283531631423620f, + -0.616591145591593110f, + 0.787165287287651010f, -0.616742093982038720f, 0.787047014002060790f, + -0.616893019696640680f, + 0.786928711779001810f, -0.617043922729849760f, 0.786810380622823490f, + -0.617194803076117630f, + 0.786692020537876790f, -0.617345660729896830f, 0.786573631528513230f, + -0.617496495685640910f, + 0.786455213599085770f, -0.617647307937803870f, 0.786336766753948260f, + -0.617798097480841020f, + 0.786218290997455660f, -0.617948864309208150f, 0.786099786333963930f, + -0.618099608417362000f, + 0.785981252767830150f, -0.618250329799760250f, 0.785862690303412600f, + -0.618401028450860980f, + 0.785744098945070360f, -0.618551704365123740f, 0.785625478697163700f, + -0.618702357537008530f, + 0.785506829564053930f, -0.618852987960976320f, 0.785388151550103550f, + -0.619003595631488660f, + 0.785269444659675850f, -0.619154180543008410f, 0.785150708897135560f, + -0.619304742689998690f, + 0.785031944266848080f, -0.619455282066924020f, 0.784913150773180020f, + -0.619605798668249270f, + 0.784794328420499230f, -0.619756292488440660f, 0.784675477213174320f, + -0.619906763521964720f, + 0.784556597155575240f, -0.620057211763289100f, 0.784437688252072830f, + -0.620207637206882430f, + 0.784318750507038920f, -0.620358039847213720f, 0.784199783924846570f, + -0.620508419678753360f, + 0.784080788509869950f, -0.620658776695972140f, 0.783961764266484120f, + -0.620809110893341900f, + 0.783842711199065230f, -0.620959422265335180f, 0.783723629311990470f, + -0.621109710806425630f, + 0.783604518609638200f, -0.621259976511087550f, 0.783485379096387820f, + -0.621410219373796150f, + 0.783366210776619720f, -0.621560439389027160f, 0.783247013654715380f, + -0.621710636551257690f, + 0.783127787735057310f, -0.621860810854965360f, 0.783008533022029110f, + -0.622010962294628600f, + 0.782889249520015480f, -0.622161090864726820f, 0.782769937233402050f, + -0.622311196559740320f, + 0.782650596166575730f, -0.622461279374149970f, 0.782531226323924240f, + -0.622611339302437730f, + 0.782411827709836530f, -0.622761376339086350f, 0.782292400328702400f, + -0.622911390478579460f, + 0.782172944184913010f, -0.623061381715401260f, 0.782053459282860300f, + -0.623211350044037270f, + 0.781933945626937630f, -0.623361295458973230f, 0.781814403221538830f, + -0.623511217954696440f, + 0.781694832071059390f, -0.623661117525694530f, 0.781575232179895550f, + -0.623810994166456130f, + 0.781455603552444590f, -0.623960847871470660f, 0.781335946193104870f, + -0.624110678635228510f, + 0.781216260106276090f, -0.624260486452220650f, 0.781096545296358520f, + -0.624410271316939270f, + 0.780976801767753750f, -0.624560033223877210f, 0.780857029524864580f, + -0.624709772167528100f, + 0.780737228572094490f, -0.624859488142386340f, 0.780617398913848400f, + -0.625009181142947460f, + 0.780497540554531910f, -0.625158851163707620f, 0.780377653498552040f, + -0.625308498199164010f, + 0.780257737750316590f, -0.625458122243814360f, 0.780137793314234610f, + -0.625607723292157410f, + 0.780017820194715990f, -0.625757301338692900f, 0.779897818396172000f, + -0.625906856377921090f, + 0.779777787923014550f, -0.626056388404343520f, 0.779657728779656890f, + -0.626205897412462130f, + 0.779537640970513260f, -0.626355383396779990f, 0.779417524499998900f, + -0.626504846351800810f, + 0.779297379372530300f, -0.626654286272029350f, 0.779177205592524680f, + -0.626803703151971200f, + 0.779057003164400630f, -0.626953096986132660f, 0.778936772092577500f, + -0.627102467769020900f, + 0.778816512381475980f, -0.627251815495144080f, 0.778696224035517530f, + -0.627401140159011050f, + 0.778575907059125050f, -0.627550441755131530f, 0.778455561456721900f, + -0.627699720278016240f, + 0.778335187232733210f, -0.627848975722176460f, 0.778214784391584540f, + -0.627998208082124700f, + 0.778094352937702790f, -0.628147417352374000f, 0.777973892875516100f, + -0.628296603527438320f, + 0.777853404209453150f, -0.628445766601832710f, 0.777732886943944050f, + -0.628594906570072550f, + 0.777612341083420030f, -0.628744023426674680f, 0.777491766632313010f, + -0.628893117166156480f, + 0.777371163595056310f, -0.629042187783036000f, 0.777250531976084070f, + -0.629191235271832290f, + 0.777129871779831620f, -0.629340259627065630f, 0.777009183010735290f, + -0.629489260843256630f, + 0.776888465673232440f, -0.629638238914926980f, 0.776767719771761510f, + -0.629787193836599200f, + 0.776646945310762060f, -0.629936125602796440f, 0.776526142294674430f, + -0.630085034208043180f, + 0.776405310727940390f, -0.630233919646864370f, 0.776284450615002510f, + -0.630382781913785940f, + 0.776163561960304340f, -0.630531621003334600f, 0.776042644768290770f, + -0.630680436910037940f, + 0.775921699043407690f, -0.630829229628424470f, 0.775800724790101650f, + -0.630977999153023550f, + 0.775679722012820650f, -0.631126745478365340f, 0.775558690716013580f, + -0.631275468598980760f, + 0.775437630904130540f, -0.631424168509401860f, 0.775316542581622530f, + -0.631572845204161020f, + 0.775195425752941420f, -0.631721498677792260f, 0.775074280422540450f, + -0.631870128924829850f, + 0.774953106594873930f, -0.632018735939809060f, 0.774831904274396850f, + -0.632167319717265920f, + 0.774710673465565550f, -0.632315880251737570f, 0.774589414172837550f, + -0.632464417537761840f, + 0.774468126400670860f, -0.632612931569877410f, 0.774346810153525130f, + -0.632761422342624000f, + 0.774225465435860680f, -0.632909889850541750f, 0.774104092252139050f, + -0.633058334088172140f, + 0.773982690606822900f, -0.633206755050057190f, 0.773861260504375540f, + -0.633355152730739950f, + 0.773739801949261840f, -0.633503527124764320f, 0.773618314945947460f, + -0.633651878226674900f, + 0.773496799498899050f, -0.633800206031017280f, 0.773375255612584470f, + -0.633948510532337810f, + 0.773253683291472590f, -0.634096791725183740f, 0.773132082540033070f, + -0.634245049604103330f, + 0.773010453362736990f, -0.634393284163645490f, 0.772888795764056220f, + -0.634541495398360020f, + 0.772767109748463850f, -0.634689683302797740f, 0.772645395320433860f, + -0.634837847871509990f, + 0.772523652484441330f, -0.634985989099049460f, 0.772401881244962450f, + -0.635134106979969190f, + 0.772280081606474320f, -0.635282201508823420f, 0.772158253573455240f, + -0.635430272680167160f, + 0.772036397150384520f, -0.635578320488556110f, 0.771914512341742350f, + -0.635726344928547070f, + 0.771792599152010150f, -0.635874345994697720f, 0.771670657585670330f, + -0.636022323681566300f, + 0.771548687647206300f, -0.636170277983712170f, 0.771426689341102590f, + -0.636318208895695460f, + 0.771304662671844830f, -0.636466116412077180f, 0.771182607643919330f, + -0.636614000527419120f, + 0.771060524261813820f, -0.636761861236284200f, 0.770938412530016940f, + -0.636909698533235870f, + 0.770816272453018540f, -0.637057512412838590f, 0.770694104035309140f, + -0.637205302869657600f, + 0.770571907281380810f, -0.637353069898259130f, 0.770449682195725960f, + -0.637500813493210190f, + 0.770327428782838890f, -0.637648533649078810f, 0.770205147047214210f, + -0.637796230360433540f, + 0.770082836993347900f, -0.637943903621844060f, 0.769960498625737230f, + -0.638091553427880820f, + 0.769838131948879840f, -0.638239179773115280f, 0.769715736967275130f, + -0.638386782652119570f, + 0.769593313685422940f, -0.638534362059466790f, 0.769470862107824670f, + -0.638681917989730730f, + 0.769348382238982280f, -0.638829450437486290f, 0.769225874083399260f, + -0.638976959397309140f, + 0.769103337645579700f, -0.639124444863775730f, 0.768980772930028870f, + -0.639271906831463510f, + 0.768858179941253270f, -0.639419345294950700f, 0.768735558683760310f, + -0.639566760248816310f, + 0.768612909162058380f, -0.639714151687640450f, 0.768490231380656860f, + -0.639861519606003900f, + 0.768367525344066270f, -0.640008863998488440f, 0.768244791056798330f, + -0.640156184859676510f, + 0.768122028523365420f, -0.640303482184151670f, 0.767999237748281270f, + -0.640450755966498140f, + 0.767876418736060610f, -0.640598006201301030f, 0.767753571491219030f, + -0.640745232883146440f, + 0.767630696018273380f, -0.640892436006621380f, 0.767507792321741270f, + -0.641039615566313390f, + 0.767384860406141730f, -0.641186771556811250f, 0.767261900275994500f, + -0.641333903972704290f, + 0.767138911935820400f, -0.641481012808583160f, 0.767015895390141480f, + -0.641628098059038750f, + 0.766892850643480670f, -0.641775159718663500f, 0.766769777700361920f, + -0.641922197782050170f, + 0.766646676565310380f, -0.642069212243792540f, 0.766523547242852210f, + -0.642216203098485370f, + 0.766400389737514230f, -0.642363170340724320f, 0.766277204053824710f, + -0.642510113965105710f, + 0.766153990196312920f, -0.642657033966226860f, 0.766030748169509000f, + -0.642803930338685990f, + 0.765907477977944340f, -0.642950803077082080f, 0.765784179626150970f, + -0.643097652176015110f, + 0.765660853118662500f, -0.643244477630085850f, 0.765537498460013070f, + -0.643391279433895850f, + 0.765414115654738270f, -0.643538057582047740f, 0.765290704707374370f, + -0.643684812069144850f, + 0.765167265622458960f, -0.643831542889791390f, 0.765043798404530520f, + -0.643978250038592660f, + 0.764920303058128410f, -0.644124933510154540f, 0.764796779587793460f, + -0.644271593299083790f, + 0.764673227998067140f, -0.644418229399988380f, 0.764549648293492150f, + -0.644564841807476640f, + 0.764426040478612070f, -0.644711430516158310f, 0.764302404557971720f, + -0.644857995520643710f, + 0.764178740536116670f, -0.645004536815543930f, 0.764055048417593970f, + -0.645151054395471160f, + 0.763931328206951090f, -0.645297548255038380f, 0.763807579908737160f, + -0.645444018388859230f, + 0.763683803527501870f, -0.645590464791548690f, 0.763559999067796150f, + -0.645736887457722290f, + 0.763436166534172010f, -0.645883286381996320f, 0.763312305931182380f, + -0.646029661558988330f, + 0.763188417263381270f, -0.646176012983316280f, 0.763064500535323710f, + -0.646322340649599480f, + 0.762940555751565720f, -0.646468644552457780f, 0.762816582916664430f, + -0.646614924686512050f, + 0.762692582035177980f, -0.646761181046383920f, 0.762568553111665380f, + -0.646907413626696020f, + 0.762444496150687210f, -0.647053622422071540f, 0.762320411156804270f, + -0.647199807427135230f, + 0.762196298134578900f, -0.647345968636512060f, 0.762072157088574560f, + -0.647492106044828100f, + 0.761947988023355390f, -0.647638219646710310f, 0.761823790943486960f, + -0.647784309436786440f, + 0.761699565853535380f, -0.647930375409685340f, 0.761575312758068000f, + -0.648076417560036530f, + 0.761451031661653620f, -0.648222435882470420f, 0.761326722568861360f, + -0.648368430371618290f, + 0.761202385484261780f, -0.648514401022112440f, 0.761078020412426560f, + -0.648660347828585840f, + 0.760953627357928150f, -0.648806270785672550f, 0.760829206325340010f, + -0.648952169888007300f, + 0.760704757319236920f, -0.649098045130225950f, 0.760580280344194450f, + -0.649243896506964900f, + 0.760455775404789260f, -0.649389724012861660f, 0.760331242505599030f, + -0.649535527642554730f, + 0.760206681651202420f, -0.649681307390683190f, 0.760082092846179340f, + -0.649827063251887100f, + 0.759957476095110330f, -0.649972795220807530f, 0.759832831402577400f, + -0.650118503292086200f, + 0.759708158773163440f, -0.650264187460365850f, 0.759583458211452010f, + -0.650409847720290310f, + 0.759458729722028210f, -0.650555484066503880f, 0.759333973309477940f, + -0.650701096493652040f, + 0.759209188978388070f, -0.650846684996380880f, 0.759084376733346610f, + -0.650992249569337660f, + 0.758959536578942440f, -0.651137790207170330f, 0.758834668519765660f, + -0.651283306904527740f, + 0.758709772560407390f, -0.651428799656059820f, 0.758584848705459610f, + -0.651574268456416970f, + 0.758459896959515430f, -0.651719713300250910f, 0.758334917327168960f, + -0.651865134182213920f, + 0.758209909813015280f, -0.652010531096959500f, 0.758084874421650730f, + -0.652155904039141590f, + 0.757959811157672300f, -0.652301253003415460f, 0.757834720025678310f, + -0.652446577984436730f, + 0.757709601030268080f, -0.652591878976862440f, 0.757584454176041810f, + -0.652737155975350310f, + 0.757459279467600720f, -0.652882408974558850f, 0.757334076909547130f, + -0.653027637969147530f, + 0.757208846506484570f, -0.653172842953776760f, 0.757083588263017140f, + -0.653318023923107670f, + 0.756958302183750490f, -0.653463180871802330f, 0.756832988273290820f, + -0.653608313794523890f, + 0.756707646536245670f, -0.653753422685936060f, 0.756582276977223470f, + -0.653898507540703780f, + 0.756456879600833740f, -0.654043568353492640f, 0.756331454411686920f, + -0.654188605118969040f, + 0.756206001414394540f, -0.654333617831800440f, 0.756080520613569120f, + -0.654478606486655350f, + 0.755955012013824420f, -0.654623571078202680f, 0.755829475619774760f, + -0.654768511601112600f, + 0.755703911436035880f, -0.654913428050056030f, 0.755578319467224540f, + -0.655058320419704910f, + 0.755452699717958250f, -0.655203188704731820f, 0.755327052192855670f, + -0.655348032899810470f, + 0.755201376896536550f, -0.655492852999615350f, 0.755075673833621620f, + -0.655637648998821820f, + 0.754949943008732640f, -0.655782420892106030f, 0.754824184426492350f, + -0.655927168674145360f, + 0.754698398091524500f, -0.656071892339617600f, 0.754572584008453840f, + -0.656216591883201920f, + 0.754446742181906440f, -0.656361267299578000f, 0.754320872616508820f, + -0.656505918583426550f, + 0.754194975316889170f, -0.656650545729428940f, 0.754069050287676120f, + -0.656795148732268070f, + 0.753943097533499640f, -0.656939727586627110f, 0.753817117058990790f, + -0.657084282287190180f, + 0.753691108868781210f, -0.657228812828642540f, 0.753565072967504300f, + -0.657373319205670210f, + 0.753439009359793580f, -0.657517801412960120f, 0.753312918050284330f, + -0.657662259445200070f, + 0.753186799043612520f, -0.657806693297078640f, 0.753060652344415100f, + -0.657951102963285520f, + 0.752934477957330150f, -0.658095488438511180f, 0.752808275886996950f, + -0.658239849717446870f, + 0.752682046138055340f, -0.658384186794785050f, 0.752555788715146390f, + -0.658528499665218650f, + 0.752429503622912390f, -0.658672788323441890f, 0.752303190865996400f, + -0.658817052764149480f, + 0.752176850449042810f, -0.658961292982037320f, 0.752050482376696360f, + -0.659105508971802090f, + 0.751924086653603550f, -0.659249700728141490f, 0.751797663284411550f, + -0.659393868245753860f, + 0.751671212273768430f, -0.659538011519338660f, 0.751544733626323680f, + -0.659682130543596150f, + 0.751418227346727470f, -0.659826225313227320f, 0.751291693439630870f, + -0.659970295822934540f, + 0.751165131909686480f, -0.660114342067420480f, 0.751038542761547360f, + -0.660258364041389050f, + 0.750911925999867890f, -0.660402361739545030f, 0.750785281629303690f, + -0.660546335156593890f, + 0.750658609654510700f, -0.660690284287242300f, 0.750531910080146410f, + -0.660834209126197610f, + 0.750405182910869330f, -0.660978109668168060f, 0.750278428151338720f, + -0.661121985907862860f, + 0.750151645806215070f, -0.661265837839992270f, 0.750024835880159780f, + -0.661409665459266940f, + 0.749897998377835330f, -0.661553468760398890f, 0.749771133303905100f, + -0.661697247738101010f, + 0.749644240663033480f, -0.661841002387086870f, 0.749517320459886170f, + -0.661984732702070920f, + 0.749390372699129560f, -0.662128438677768720f, 0.749263397385431130f, + -0.662272120308896590f, + 0.749136394523459370f, -0.662415777590171780f, 0.749009364117883880f, + -0.662559410516312290f, + 0.748882306173375150f, -0.662703019082037440f, 0.748755220694604760f, + -0.662846603282066900f, + 0.748628107686245440f, -0.662990163111121470f, 0.748500967152970430f, + -0.663133698563923010f, + 0.748373799099454560f, -0.663277209635194100f, 0.748246603530373420f, + -0.663420696319658280f, + 0.748119380450403600f, -0.663564158612039770f, 0.747992129864222700f, + -0.663707596507064010f, + 0.747864851776509410f, -0.663851009999457340f, 0.747737546191943330f, + -0.663994399083946640f, + 0.747610213115205150f, -0.664137763755260010f, 0.747482852550976570f, + -0.664281104008126230f, + 0.747355464503940190f, -0.664424419837275180f, 0.747228048978779920f, + -0.664567711237437520f, + 0.747100605980180130f, -0.664710978203344790f, 0.746973135512826850f, + -0.664854220729729660f, + 0.746845637581406540f, -0.664997438811325340f, 0.746718112190607130f, + -0.665140632442866140f, + 0.746590559345117310f, -0.665283801619087180f, 0.746462979049626770f, + -0.665426946334724660f, + 0.746335371308826320f, -0.665570066584515450f, 0.746207736127407760f, + -0.665713162363197550f, + 0.746080073510063780f, -0.665856233665509720f, 0.745952383461488290f, + -0.665999280486191500f, + 0.745824665986376090f, -0.666142302819983540f, 0.745696921089422760f, + -0.666285300661627280f, + 0.745569148775325430f, -0.666428274005865240f, 0.745441349048781680f, + -0.666571222847440640f, + 0.745313521914490520f, -0.666714147181097670f, 0.745185667377151640f, + -0.666857047001581220f, + 0.745057785441466060f, -0.666999922303637470f, 0.744929876112135350f, + -0.667142773082013310f, + 0.744801939393862630f, -0.667285599331456370f, 0.744673975291351710f, + -0.667428401046715520f, + 0.744545983809307370f, -0.667571178222540310f, 0.744417964952435620f, + -0.667713930853681030f, + 0.744289918725443260f, -0.667856658934889320f, 0.744161845133038180f, + -0.667999362460917400f, + 0.744033744179929290f, -0.668142041426518450f, 0.743905615870826490f, + -0.668284695826446670f, + 0.743777460210440890f, -0.668427325655456820f, 0.743649277203484060f, + -0.668569930908304970f, + 0.743521066854669120f, -0.668712511579747980f, 0.743392829168709970f, + -0.668855067664543610f, + 0.743264564150321600f, -0.668997599157450270f, 0.743136271804219820f, + -0.669140106053227600f, + 0.743007952135121720f, -0.669282588346636010f, 0.742879605147745200f, + -0.669425046032436910f, + 0.742751230846809050f, -0.669567479105392490f, 0.742622829237033490f, + -0.669709887560265840f, + 0.742494400323139180f, -0.669852271391821020f, 0.742365944109848460f, + -0.669994630594823000f, + 0.742237460601884000f, -0.670136965164037650f, 0.742108949803969910f, + -0.670279275094231800f, + 0.741980411720831070f, -0.670421560380173090f, 0.741851846357193480f, + -0.670563821016630040f, + 0.741723253717784140f, -0.670706056998372160f, 0.741594633807331150f, + -0.670848268320169640f, + 0.741465986630563290f, -0.670990454976794220f, 0.741337312192210660f, + -0.671132616963017740f, + 0.741208610497004260f, -0.671274754273613490f, 0.741079881549676080f, + -0.671416866903355450f, + 0.740951125354959110f, -0.671558954847018330f, 0.740822341917587330f, + -0.671701018099378320f, + 0.740693531242295760f, -0.671843056655211930f, 0.740564693333820250f, + -0.671985070509296900f, + 0.740435828196898020f, -0.672127059656411730f, 0.740306935836266940f, + -0.672269024091335930f, + 0.740178016256666240f, -0.672410963808849790f, 0.740049069462835550f, + -0.672552878803734710f, + 0.739920095459516200f, -0.672694769070772860f, 0.739791094251449950f, + -0.672836634604747300f, + 0.739662065843380010f, -0.672978475400442090f, 0.739533010240050250f, + -0.673120291452642070f, + 0.739403927446205760f, -0.673262082756132970f, 0.739274817466592520f, + -0.673403849305701740f, + 0.739145680305957510f, -0.673545591096136100f, 0.739016515969048720f, + -0.673687308122224330f, + 0.738887324460615110f, -0.673829000378756040f, 0.738758105785406900f, + -0.673970667860521620f, + 0.738628859948174840f, -0.674112310562312360f, 0.738499586953671130f, + -0.674253928478920410f, + 0.738370286806648620f, -0.674395521605139050f, 0.738240959511861310f, + -0.674537089935762000f, + 0.738111605074064260f, -0.674678633465584540f, 0.737982223498013570f, + -0.674820152189402170f, + 0.737852814788465980f, -0.674961646102011930f, 0.737723378950179700f, + -0.675103115198211420f, + 0.737593915987913570f, -0.675244559472799270f, 0.737464425906427580f, + -0.675385978920574840f, + 0.737334908710482910f, -0.675527373536338520f, 0.737205364404841190f, + -0.675668743314891910f, + 0.737075792994265730f, -0.675810088251036940f, 0.736946194483520280f, + -0.675951408339577010f, + 0.736816568877369900f, -0.676092703575315920f, 0.736686916180580460f, + -0.676233973953058950f, + 0.736557236397919150f, -0.676375219467611590f, 0.736427529534153690f, + -0.676516440113781090f, + 0.736297795594053170f, -0.676657635886374950f, 0.736168034582387330f, + -0.676798806780201770f, + 0.736038246503927350f, -0.676939952790071130f, 0.735908431363445190f, + -0.677081073910793530f, + 0.735778589165713590f, -0.677222170137180330f, 0.735648719915506510f, + -0.677363241464043920f, + 0.735518823617598900f, -0.677504287886197430f, 0.735388900276766730f, + -0.677645309398454910f, + 0.735258949897786840f, -0.677786305995631500f, 0.735128972485437180f, + -0.677927277672543020f, + 0.734998968044496710f, -0.678068224424006600f, 0.734868936579745170f, + -0.678209146244839860f, + 0.734738878095963500f, -0.678350043129861470f, 0.734608792597933550f, + -0.678490915073891140f, + 0.734478680090438370f, -0.678631762071749360f, 0.734348540578261600f, + -0.678772584118257690f, + 0.734218374066188280f, -0.678913381208238410f, 0.734088180559004040f, + -0.679054153336514870f, + 0.733957960061495940f, -0.679194900497911200f, 0.733827712578451700f, + -0.679335622687252560f, + 0.733697438114660370f, -0.679476319899364970f, 0.733567136674911360f, + -0.679616992129075560f, + 0.733436808263995710f, -0.679757639371212030f, 0.733306452886705260f, + -0.679898261620603290f, + 0.733176070547832740f, -0.680038858872078930f, 0.733045661252172080f, + -0.680179431120469750f, + 0.732915225004517780f, -0.680319978360607200f, 0.732784761809665790f, + -0.680460500587323880f, + 0.732654271672412820f, -0.680600997795453020f, 0.732523754597556700f, + -0.680741469979829090f, + 0.732393210589896040f, -0.680881917135287230f, 0.732262639654230770f, + -0.681022339256663670f, + 0.732132041795361290f, -0.681162736338795430f, 0.732001417018089630f, + -0.681303108376520530f, + 0.731870765327218290f, -0.681443455364677870f, 0.731740086727550980f, + -0.681583777298107480f, + 0.731609381223892630f, -0.681724074171649710f, 0.731478648821048520f, + -0.681864345980146670f, + 0.731347889523825570f, -0.682004592718440830f, 0.731217103337031270f, + -0.682144814381375640f, + 0.731086290265474340f, -0.682285010963795570f, 0.730955450313964360f, + -0.682425182460546060f, + 0.730824583487312160f, -0.682565328866473250f, 0.730693689790329000f, + -0.682705450176424590f, + 0.730562769227827590f, -0.682845546385248080f, 0.730431821804621520f, + -0.682985617487792740f, + 0.730300847525525490f, -0.683125663478908680f, 0.730169846395354870f, + -0.683265684353446700f, + 0.730038818418926260f, -0.683405680106258680f, 0.729907763601057140f, + -0.683545650732197530f, + 0.729776681946566090f, -0.683685596226116580f, 0.729645573460272480f, + -0.683825516582870720f, + 0.729514438146997010f, -0.683965411797315400f, 0.729383276011561050f, + -0.684105281864307080f, + 0.729252087058786970f, -0.684245126778703080f, 0.729120871293498230f, + -0.684384946535361750f, + 0.728989628720519420f, -0.684524741129142300f, 0.728858359344675800f, + -0.684664510554904960f, + 0.728727063170793830f, -0.684804254807510620f, 0.728595740203700770f, + -0.684943973881821490f, + 0.728464390448225200f, -0.685083667772700360f, 0.728333013909196360f, + -0.685223336475011210f, + 0.728201610591444610f, -0.685362979983618730f, 0.728070180499801210f, + -0.685502598293388550f, + 0.727938723639098620f, -0.685642191399187470f, 0.727807240014169960f, + -0.685781759295883030f, + 0.727675729629849610f, -0.685921301978343560f, 0.727544192490972800f, + -0.686060819441438710f, + 0.727412628602375770f, -0.686200311680038590f, 0.727281037968895870f, + -0.686339778689014520f, + 0.727149420595371020f, -0.686479220463238950f, 0.727017776486640680f, + -0.686618636997584630f, + 0.726886105647544970f, -0.686758028286925890f, 0.726754408082925020f, + -0.686897394326137610f, + 0.726622683797622850f, -0.687036735110095660f, 0.726490932796481910f, + -0.687176050633676820f, + 0.726359155084346010f, -0.687315340891759050f, 0.726227350666060370f, + -0.687454605879221030f, + 0.726095519546471000f, -0.687593845590942170f, 0.725963661730424930f, + -0.687733060021803230f, + 0.725831777222770370f, -0.687872249166685550f, 0.725699866028356120f, + -0.688011413020471640f, + 0.725567928152032300f, -0.688150551578044830f, 0.725435963598649810f, + -0.688289664834289330f, + 0.725303972373060770f, -0.688428752784090440f, 0.725171954480117950f, + -0.688567815422334250f, + 0.725039909924675370f, -0.688706852743907750f, 0.724907838711587820f, + -0.688845864743699020f, + 0.724775740845711280f, -0.688984851416597040f, 0.724643616331902550f, + -0.689123812757491570f, + 0.724511465175019630f, -0.689262748761273470f, 0.724379287379921190f, + -0.689401659422834270f, + 0.724247082951467000f, -0.689540544737066830f, 0.724114851894517850f, + -0.689679404698864800f, + 0.723982594213935520f, -0.689818239303122470f, 0.723850309914582880f, + -0.689957048544735390f, + 0.723717999001323500f, -0.690095832418599950f, 0.723585661479022150f, + -0.690234590919613370f, + 0.723453297352544380f, -0.690373324042674040f, 0.723320906626756970f, + -0.690512031782681060f, + 0.723188489306527460f, -0.690650714134534600f, 0.723056045396724410f, + -0.690789371093135650f, + 0.722923574902217700f, -0.690928002653386160f, 0.722791077827877550f, + -0.691066608810189220f, + 0.722658554178575610f, -0.691205189558448450f, 0.722526003959184540f, + -0.691343744893068710f, + 0.722393427174577550f, -0.691482274808955850f, 0.722260823829629310f, + -0.691620779301016290f, + 0.722128193929215350f, -0.691759258364157750f, 0.721995537478211880f, + -0.691897711993288760f, + 0.721862854481496340f, -0.692036140183318720f, 0.721730144943947160f, + -0.692174542929158140f, + 0.721597408870443770f, -0.692312920225718220f, 0.721464646265866370f, + -0.692451272067911130f, + 0.721331857135096290f, -0.692589598450650380f, 0.721199041483015720f, + -0.692727899368849820f, + 0.721066199314508110f, -0.692866174817424630f, 0.720933330634457530f, + -0.693004424791290870f, + 0.720800435447749190f, -0.693142649285365400f, 0.720667513759269520f, + -0.693280848294566040f, + 0.720534565573905270f, -0.693419021813811760f, 0.720401590896544760f, + -0.693557169838022290f, + 0.720268589732077190f, -0.693695292362118240f, 0.720135562085392420f, + -0.693833389381021350f, + 0.720002507961381650f, -0.693971460889654000f, 0.719869427364936860f, + -0.694109506882939820f, + 0.719736320300951030f, -0.694247527355803310f, 0.719603186774318120f, + -0.694385522303169740f, + 0.719470026789932990f, -0.694523491719965520f, 0.719336840352691740f, + -0.694661435601117820f, + 0.719203627467491220f, -0.694799353941554900f, 0.719070388139229190f, + -0.694937246736205830f, + 0.718937122372804490f, -0.695075113980000880f, 0.718803830173116890f, + -0.695212955667870780f, + 0.718670511545067230f, -0.695350771794747690f, 0.718537166493557370f, + -0.695488562355564440f, + 0.718403795023489830f, -0.695626327345254870f, 0.718270397139768260f, + -0.695764066758753690f, + 0.718136972847297490f, -0.695901780590996830f, 0.718003522150983180f, + -0.696039468836920690f, + 0.717870045055731710f, -0.696177131491462990f, 0.717736541566450950f, + -0.696314768549562090f, + 0.717603011688049080f, -0.696452380006157830f, 0.717469455425435830f, + -0.696589965856190370f, + 0.717335872783521730f, -0.696727526094601200f, 0.717202263767218070f, + -0.696865060716332470f, + 0.717068628381437480f, -0.697002569716327460f, 0.716934966631093130f, + -0.697140053089530420f, + 0.716801278521099540f, -0.697277510830886520f, 0.716667564056371890f, + -0.697414942935341790f, + 0.716533823241826680f, -0.697552349397843160f, 0.716400056082381000f, + -0.697689730213338800f, + 0.716266262582953120f, -0.697827085376777290f, 0.716132442748462330f, + -0.697964414883108670f, + 0.715998596583828690f, -0.698101718727283770f, 0.715864724093973500f, + -0.698238996904254280f, + 0.715730825283818590f, -0.698376249408972920f, 0.715596900158287470f, + -0.698513476236393040f, + 0.715462948722303760f, -0.698650677381469460f, 0.715328970980792620f, + -0.698787852839157670f, + 0.715194966938680120f, -0.698925002604414150f, 0.715060936600893090f, + -0.699062126672196140f, + 0.714926879972359490f, -0.699199225037462120f, 0.714792797058008240f, + -0.699336297695171140f, + 0.714658687862769090f, -0.699473344640283770f, 0.714524552391572860f, + -0.699610365867761040f, + 0.714390390649351390f, -0.699747361372564990f, 0.714256202641037510f, + -0.699884331149658760f, + 0.714121988371564820f, -0.700021275194006250f, 0.713987747845867830f, + -0.700158193500572730f, + 0.713853481068882470f, -0.700295086064323780f, 0.713719188045545240f, + -0.700431952880226420f, + 0.713584868780793640f, -0.700568793943248340f, 0.713450523279566260f, + -0.700705609248358450f, + 0.713316151546802610f, -0.700842398790526120f, 0.713181753587443180f, + -0.700979162564722370f, + 0.713047329406429340f, -0.701115900565918660f, 0.712912879008703480f, + -0.701252612789087460f, + 0.712778402399208980f, -0.701389299229202230f, 0.712643899582890210f, + -0.701525959881237340f, + 0.712509370564692320f, -0.701662594740168450f, 0.712374815349561710f, + -0.701799203800971720f, + 0.712240233942445510f, -0.701935787058624360f, 0.712105626348291890f, + -0.702072344508104630f, + 0.711970992572050100f, -0.702208876144391870f, 0.711836332618670080f, + -0.702345381962465880f, + 0.711701646493102970f, -0.702481861957308000f, 0.711566934200300700f, + -0.702618316123900130f, + 0.711432195745216430f, -0.702754744457225300f, 0.711297431132803970f, + -0.702891146952267400f, + 0.711162640368018350f, -0.703027523604011220f, 0.711027823455815280f, + -0.703163874407442770f, + 0.710892980401151680f, -0.703300199357548730f, 0.710758111208985350f, + -0.703436498449316660f, + 0.710623215884275020f, -0.703572771677735580f, 0.710488294431980470f, + -0.703709019037794810f, + 0.710353346857062420f, -0.703845240524484940f, 0.710218373164482220f, + -0.703981436132797620f, + 0.710083373359202800f, -0.704117605857725310f, 0.709948347446187400f, + -0.704253749694261470f, + 0.709813295430400840f, -0.704389867637400410f, 0.709678217316808580f, + -0.704525959682137380f, + 0.709543113110376770f, -0.704662025823468820f, 0.709407982816072980f, + -0.704798066056391950f, + 0.709272826438865690f, -0.704934080375904880f, 0.709137643983724030f, + -0.705070068777006840f, + 0.709002435455618250f, -0.705206031254697830f, 0.708867200859519820f, + -0.705341967803978840f, + 0.708731940200400650f, -0.705477878419852100f, 0.708596653483234080f, + -0.705613763097320490f, + 0.708461340712994160f, -0.705749621831387790f, 0.708326001894655890f, + -0.705885454617058980f, + 0.708190637033195400f, -0.706021261449339740f, 0.708055246133589500f, + -0.706157042323237060f, + 0.707919829200816310f, -0.706292797233758480f, 0.707784386239854620f, + -0.706428526175912790f, + 0.707648917255684350f, -0.706564229144709510f, 0.707513422253286280f, + -0.706699906135159430f, + 0.707377901237642100f, -0.706835557142273750f, 0.707242354213734710f, + -0.706971182161065360f, + 0.707106781186547570f, -0.707106781186547460f, 0.706971182161065360f, + -0.707242354213734600f, + 0.706835557142273860f, -0.707377901237642100f, 0.706699906135159430f, + -0.707513422253286170f, + 0.706564229144709620f, -0.707648917255684350f, 0.706428526175912790f, + -0.707784386239854620f, + 0.706292797233758480f, -0.707919829200816310f, 0.706157042323237060f, + -0.708055246133589500f, + 0.706021261449339740f, -0.708190637033195290f, 0.705885454617058980f, + -0.708326001894655780f, + 0.705749621831387790f, -0.708461340712994050f, 0.705613763097320490f, + -0.708596653483234080f, + 0.705477878419852210f, -0.708731940200400650f, 0.705341967803978950f, + -0.708867200859519820f, + 0.705206031254697830f, -0.709002435455618250f, 0.705070068777006840f, + -0.709137643983723920f, + 0.704934080375904990f, -0.709272826438865580f, 0.704798066056391950f, + -0.709407982816072980f, + 0.704662025823468930f, -0.709543113110376770f, 0.704525959682137380f, + -0.709678217316808470f, + 0.704389867637400410f, -0.709813295430400840f, 0.704253749694261580f, + -0.709948347446187400f, + 0.704117605857725430f, -0.710083373359202690f, 0.703981436132797730f, + -0.710218373164482220f, + 0.703845240524484940f, -0.710353346857062310f, 0.703709019037794810f, + -0.710488294431980470f, + 0.703572771677735580f, -0.710623215884275020f, 0.703436498449316770f, + -0.710758111208985350f, + 0.703300199357548730f, -0.710892980401151680f, 0.703163874407442770f, + -0.711027823455815280f, + 0.703027523604011220f, -0.711162640368018350f, 0.702891146952267400f, + -0.711297431132803970f, + 0.702754744457225300f, -0.711432195745216430f, 0.702618316123900130f, + -0.711566934200300700f, + 0.702481861957308000f, -0.711701646493102970f, 0.702345381962465880f, + -0.711836332618670080f, + 0.702208876144391870f, -0.711970992572049990f, 0.702072344508104740f, + -0.712105626348291890f, + 0.701935787058624360f, -0.712240233942445510f, 0.701799203800971720f, + -0.712374815349561710f, + 0.701662594740168570f, -0.712509370564692320f, 0.701525959881237450f, + -0.712643899582890210f, + 0.701389299229202230f, -0.712778402399208870f, 0.701252612789087460f, + -0.712912879008703370f, + 0.701115900565918660f, -0.713047329406429230f, 0.700979162564722480f, + -0.713181753587443070f, + 0.700842398790526230f, -0.713316151546802610f, 0.700705609248358450f, + -0.713450523279566150f, + 0.700568793943248450f, -0.713584868780793520f, 0.700431952880226420f, + -0.713719188045545130f, + 0.700295086064323780f, -0.713853481068882470f, 0.700158193500572730f, + -0.713987747845867830f, + 0.700021275194006360f, -0.714121988371564710f, 0.699884331149658760f, + -0.714256202641037400f, + 0.699747361372564990f, -0.714390390649351390f, 0.699610365867761040f, + -0.714524552391572860f, + 0.699473344640283770f, -0.714658687862768980f, 0.699336297695171250f, + -0.714792797058008130f, + 0.699199225037462120f, -0.714926879972359370f, 0.699062126672196140f, + -0.715060936600892980f, + 0.698925002604414150f, -0.715194966938680010f, 0.698787852839157790f, + -0.715328970980792620f, + 0.698650677381469580f, -0.715462948722303650f, 0.698513476236393040f, + -0.715596900158287360f, + 0.698376249408972920f, -0.715730825283818590f, 0.698238996904254390f, + -0.715864724093973390f, + 0.698101718727283880f, -0.715998596583828690f, 0.697964414883108790f, + -0.716132442748462330f, + 0.697827085376777290f, -0.716266262582953120f, 0.697689730213338800f, + -0.716400056082380890f, + 0.697552349397843270f, -0.716533823241826570f, 0.697414942935341790f, + -0.716667564056371890f, + 0.697277510830886630f, -0.716801278521099540f, 0.697140053089530530f, + -0.716934966631093130f, + 0.697002569716327460f, -0.717068628381437480f, 0.696865060716332470f, + -0.717202263767218070f, + 0.696727526094601200f, -0.717335872783521730f, 0.696589965856190370f, + -0.717469455425435830f, + 0.696452380006157830f, -0.717603011688049080f, 0.696314768549562200f, + -0.717736541566450840f, + 0.696177131491462990f, -0.717870045055731710f, 0.696039468836920690f, + -0.718003522150983060f, + 0.695901780590996830f, -0.718136972847297490f, 0.695764066758753800f, + -0.718270397139768260f, + 0.695626327345254870f, -0.718403795023489720f, 0.695488562355564440f, + -0.718537166493557370f, + 0.695350771794747800f, -0.718670511545067230f, 0.695212955667870890f, + -0.718803830173116890f, + 0.695075113980000880f, -0.718937122372804380f, 0.694937246736205940f, + -0.719070388139229190f, + 0.694799353941554900f, -0.719203627467491220f, 0.694661435601117930f, + -0.719336840352691740f, + 0.694523491719965520f, -0.719470026789932990f, 0.694385522303169860f, + -0.719603186774318000f, + 0.694247527355803310f, -0.719736320300951030f, 0.694109506882939820f, + -0.719869427364936860f, + 0.693971460889654000f, -0.720002507961381650f, 0.693833389381021350f, + -0.720135562085392310f, + 0.693695292362118350f, -0.720268589732077080f, 0.693557169838022400f, + -0.720401590896544760f, + 0.693419021813811880f, -0.720534565573905270f, 0.693280848294566150f, + -0.720667513759269410f, + 0.693142649285365510f, -0.720800435447749190f, 0.693004424791290870f, + -0.720933330634457530f, + 0.692866174817424740f, -0.721066199314508110f, 0.692727899368849820f, + -0.721199041483015720f, + 0.692589598450650380f, -0.721331857135096180f, 0.692451272067911240f, + -0.721464646265866370f, + 0.692312920225718220f, -0.721597408870443660f, 0.692174542929158140f, + -0.721730144943947160f, + 0.692036140183318830f, -0.721862854481496340f, 0.691897711993288760f, + -0.721995537478211880f, + 0.691759258364157750f, -0.722128193929215350f, 0.691620779301016400f, + -0.722260823829629310f, + 0.691482274808955850f, -0.722393427174577550f, 0.691343744893068820f, + -0.722526003959184430f, + 0.691205189558448450f, -0.722658554178575610f, 0.691066608810189220f, + -0.722791077827877550f, + 0.690928002653386280f, -0.722923574902217700f, 0.690789371093135760f, + -0.723056045396724410f, + 0.690650714134534720f, -0.723188489306527350f, 0.690512031782681170f, + -0.723320906626756850f, + 0.690373324042674040f, -0.723453297352544380f, 0.690234590919613370f, + -0.723585661479022040f, + 0.690095832418599950f, -0.723717999001323390f, 0.689957048544735390f, + -0.723850309914582880f, + 0.689818239303122470f, -0.723982594213935520f, 0.689679404698864800f, + -0.724114851894517850f, + 0.689540544737066940f, -0.724247082951466890f, 0.689401659422834380f, + -0.724379287379921080f, + 0.689262748761273470f, -0.724511465175019520f, 0.689123812757491680f, + -0.724643616331902550f, + 0.688984851416597150f, -0.724775740845711280f, 0.688845864743699130f, + -0.724907838711587820f, + 0.688706852743907750f, -0.725039909924675370f, 0.688567815422334360f, + -0.725171954480117840f, + 0.688428752784090550f, -0.725303972373060660f, 0.688289664834289440f, + -0.725435963598649810f, + 0.688150551578044830f, -0.725567928152032300f, 0.688011413020471640f, + -0.725699866028356120f, + 0.687872249166685550f, -0.725831777222770370f, 0.687733060021803230f, + -0.725963661730424930f, + 0.687593845590942170f, -0.726095519546470890f, 0.687454605879221030f, + -0.726227350666060260f, + 0.687315340891759160f, -0.726359155084346010f, 0.687176050633676930f, + -0.726490932796481910f, + 0.687036735110095660f, -0.726622683797622850f, 0.686897394326137610f, + -0.726754408082924910f, + 0.686758028286925890f, -0.726886105647544970f, 0.686618636997584740f, + -0.727017776486640680f, + 0.686479220463238950f, -0.727149420595371020f, 0.686339778689014630f, + -0.727281037968895760f, + 0.686200311680038700f, -0.727412628602375770f, 0.686060819441438710f, + -0.727544192490972800f, + 0.685921301978343670f, -0.727675729629849610f, 0.685781759295883030f, + -0.727807240014169960f, + 0.685642191399187470f, -0.727938723639098620f, 0.685502598293388670f, + -0.728070180499801210f, + 0.685362979983618730f, -0.728201610591444500f, 0.685223336475011210f, + -0.728333013909196360f, + 0.685083667772700360f, -0.728464390448225200f, 0.684943973881821490f, + -0.728595740203700770f, + 0.684804254807510620f, -0.728727063170793720f, 0.684664510554904960f, + -0.728858359344675690f, + 0.684524741129142300f, -0.728989628720519310f, 0.684384946535361750f, + -0.729120871293498230f, + 0.684245126778703080f, -0.729252087058786970f, 0.684105281864307080f, + -0.729383276011561050f, + 0.683965411797315510f, -0.729514438146996900f, 0.683825516582870830f, + -0.729645573460272480f, + 0.683685596226116690f, -0.729776681946565970f, 0.683545650732197530f, + -0.729907763601057140f, + 0.683405680106258790f, -0.730038818418926150f, 0.683265684353446700f, + -0.730169846395354870f, + 0.683125663478908800f, -0.730300847525525380f, 0.682985617487792850f, + -0.730431821804621520f, + 0.682845546385248080f, -0.730562769227827590f, 0.682705450176424590f, + -0.730693689790328890f, + 0.682565328866473250f, -0.730824583487312050f, 0.682425182460546060f, + -0.730955450313964360f, + 0.682285010963795570f, -0.731086290265474230f, 0.682144814381375640f, + -0.731217103337031160f, + 0.682004592718440830f, -0.731347889523825460f, 0.681864345980146780f, + -0.731478648821048520f, + 0.681724074171649820f, -0.731609381223892520f, 0.681583777298107480f, + -0.731740086727550980f, + 0.681443455364677990f, -0.731870765327218290f, 0.681303108376520530f, + -0.732001417018089520f, + 0.681162736338795430f, -0.732132041795361290f, 0.681022339256663670f, + -0.732262639654230660f, + 0.680881917135287340f, -0.732393210589896040f, 0.680741469979829090f, + -0.732523754597556590f, + 0.680600997795453130f, -0.732654271672412820f, 0.680460500587323880f, + -0.732784761809665790f, + 0.680319978360607200f, -0.732915225004517780f, 0.680179431120469750f, + -0.733045661252171970f, + 0.680038858872079040f, -0.733176070547832740f, 0.679898261620603290f, + -0.733306452886705260f, + 0.679757639371212030f, -0.733436808263995710f, 0.679616992129075560f, + -0.733567136674911360f, + 0.679476319899365080f, -0.733697438114660260f, 0.679335622687252670f, + -0.733827712578451700f, + 0.679194900497911200f, -0.733957960061495940f, 0.679054153336514870f, + -0.734088180559004040f, + 0.678913381208238410f, -0.734218374066188170f, 0.678772584118257690f, + -0.734348540578261600f, + 0.678631762071749470f, -0.734478680090438370f, 0.678490915073891250f, + -0.734608792597933550f, + 0.678350043129861580f, -0.734738878095963390f, 0.678209146244839860f, + -0.734868936579745060f, + 0.678068224424006600f, -0.734998968044496600f, 0.677927277672543130f, + -0.735128972485437180f, + 0.677786305995631500f, -0.735258949897786730f, 0.677645309398454910f, + -0.735388900276766620f, + 0.677504287886197430f, -0.735518823617598900f, 0.677363241464044030f, + -0.735648719915506400f, + 0.677222170137180450f, -0.735778589165713480f, 0.677081073910793530f, + -0.735908431363445190f, + 0.676939952790071240f, -0.736038246503927350f, 0.676798806780201770f, + -0.736168034582387330f, + 0.676657635886374950f, -0.736297795594053060f, 0.676516440113781090f, + -0.736427529534153690f, + 0.676375219467611700f, -0.736557236397919150f, 0.676233973953058950f, + -0.736686916180580460f, + 0.676092703575316030f, -0.736816568877369790f, 0.675951408339577010f, + -0.736946194483520170f, + 0.675810088251037060f, -0.737075792994265620f, 0.675668743314891910f, + -0.737205364404841190f, + 0.675527373536338630f, -0.737334908710482790f, 0.675385978920574950f, + -0.737464425906427580f, + 0.675244559472799270f, -0.737593915987913460f, 0.675103115198211530f, + -0.737723378950179590f, + 0.674961646102012040f, -0.737852814788465980f, 0.674820152189402280f, + -0.737982223498013570f, + 0.674678633465584540f, -0.738111605074064260f, 0.674537089935762110f, + -0.738240959511861310f, + 0.674395521605139050f, -0.738370286806648510f, 0.674253928478920520f, + -0.738499586953671130f, + 0.674112310562312360f, -0.738628859948174840f, 0.673970667860521620f, + -0.738758105785406900f, + 0.673829000378756150f, -0.738887324460615110f, 0.673687308122224330f, + -0.739016515969048600f, + 0.673545591096136100f, -0.739145680305957400f, 0.673403849305701850f, + -0.739274817466592520f, + 0.673262082756132970f, -0.739403927446205760f, 0.673120291452642070f, + -0.739533010240050250f, + 0.672978475400442090f, -0.739662065843379900f, 0.672836634604747410f, + -0.739791094251449950f, + 0.672694769070772970f, -0.739920095459516090f, 0.672552878803734820f, + -0.740049069462835550f, + 0.672410963808849900f, -0.740178016256666240f, 0.672269024091336040f, + -0.740306935836266940f, + 0.672127059656411840f, -0.740435828196898020f, 0.671985070509296900f, + -0.740564693333820250f, + 0.671843056655211930f, -0.740693531242295640f, 0.671701018099378320f, + -0.740822341917587330f, + 0.671558954847018330f, -0.740951125354959110f, 0.671416866903355450f, + -0.741079881549676080f, + 0.671274754273613490f, -0.741208610497004260f, 0.671132616963017850f, + -0.741337312192210660f, + 0.670990454976794220f, -0.741465986630563290f, 0.670848268320169750f, + -0.741594633807331150f, + 0.670706056998372160f, -0.741723253717784140f, 0.670563821016630040f, + -0.741851846357193480f, + 0.670421560380173090f, -0.741980411720830960f, 0.670279275094231910f, + -0.742108949803969800f, + 0.670136965164037760f, -0.742237460601884000f, 0.669994630594823000f, + -0.742365944109848460f, + 0.669852271391821130f, -0.742494400323139180f, 0.669709887560265840f, + -0.742622829237033380f, + 0.669567479105392490f, -0.742751230846809050f, 0.669425046032436910f, + -0.742879605147745090f, + 0.669282588346636010f, -0.743007952135121720f, 0.669140106053227710f, + -0.743136271804219820f, + 0.668997599157450270f, -0.743264564150321490f, 0.668855067664543610f, + -0.743392829168709970f, + 0.668712511579748090f, -0.743521066854669120f, 0.668569930908305080f, + -0.743649277203484060f, + 0.668427325655456820f, -0.743777460210440780f, 0.668284695826446670f, + -0.743905615870826490f, + 0.668142041426518560f, -0.744033744179929180f, 0.667999362460917510f, + -0.744161845133038070f, + 0.667856658934889440f, -0.744289918725443140f, 0.667713930853681140f, + -0.744417964952435620f, + 0.667571178222540310f, -0.744545983809307250f, 0.667428401046715640f, + -0.744673975291351600f, + 0.667285599331456480f, -0.744801939393862630f, 0.667142773082013310f, + -0.744929876112135350f, + 0.666999922303637470f, -0.745057785441465950f, 0.666857047001581220f, + -0.745185667377151640f, + 0.666714147181097670f, -0.745313521914490410f, 0.666571222847440750f, + -0.745441349048781680f, + 0.666428274005865350f, -0.745569148775325430f, 0.666285300661627390f, + -0.745696921089422760f, + 0.666142302819983540f, -0.745824665986375980f, 0.665999280486191500f, + -0.745952383461488180f, + 0.665856233665509720f, -0.746080073510063780f, 0.665713162363197660f, + -0.746207736127407650f, + 0.665570066584515560f, -0.746335371308826320f, 0.665426946334724660f, + -0.746462979049626770f, + 0.665283801619087180f, -0.746590559345117310f, 0.665140632442866140f, + -0.746718112190607020f, + 0.664997438811325340f, -0.746845637581406540f, 0.664854220729729660f, + -0.746973135512826740f, + 0.664710978203344900f, -0.747100605980180130f, 0.664567711237437520f, + -0.747228048978779920f, + 0.664424419837275180f, -0.747355464503940190f, 0.664281104008126230f, + -0.747482852550976570f, + 0.664137763755260010f, -0.747610213115205150f, 0.663994399083946640f, + -0.747737546191943330f, + 0.663851009999457340f, -0.747864851776509410f, 0.663707596507064120f, + -0.747992129864222700f, + 0.663564158612039880f, -0.748119380450403490f, 0.663420696319658280f, + -0.748246603530373420f, + 0.663277209635194100f, -0.748373799099454560f, 0.663133698563923010f, + -0.748500967152970430f, + 0.662990163111121470f, -0.748628107686245330f, 0.662846603282066900f, + -0.748755220694604760f, + 0.662703019082037440f, -0.748882306173375030f, 0.662559410516312400f, + -0.749009364117883770f, + 0.662415777590171780f, -0.749136394523459260f, 0.662272120308896590f, + -0.749263397385431020f, + 0.662128438677768720f, -0.749390372699129560f, 0.661984732702071030f, + -0.749517320459886170f, + 0.661841002387086870f, -0.749644240663033480f, 0.661697247738101120f, + -0.749771133303904990f, + 0.661553468760399000f, -0.749897998377835220f, 0.661409665459266940f, + -0.750024835880159780f, + 0.661265837839992270f, -0.750151645806214960f, 0.661121985907862970f, + -0.750278428151338610f, + 0.660978109668168060f, -0.750405182910869220f, 0.660834209126197610f, + -0.750531910080146410f, + 0.660690284287242300f, -0.750658609654510590f, 0.660546335156593890f, + -0.750785281629303580f, + 0.660402361739545030f, -0.750911925999867890f, 0.660258364041389050f, + -0.751038542761547250f, + 0.660114342067420480f, -0.751165131909686370f, 0.659970295822934540f, + -0.751291693439630870f, + 0.659826225313227430f, -0.751418227346727360f, 0.659682130543596150f, + -0.751544733626323570f, + 0.659538011519338770f, -0.751671212273768430f, 0.659393868245753970f, + -0.751797663284411440f, + 0.659249700728141490f, -0.751924086653603550f, 0.659105508971802200f, + -0.752050482376696360f, + 0.658961292982037320f, -0.752176850449042700f, 0.658817052764149480f, + -0.752303190865996400f, + 0.658672788323441890f, -0.752429503622912390f, 0.658528499665218760f, + -0.752555788715146390f, + 0.658384186794785050f, -0.752682046138055230f, 0.658239849717446980f, + -0.752808275886996950f, + 0.658095488438511290f, -0.752934477957330150f, 0.657951102963285630f, + -0.753060652344415100f, + 0.657806693297078640f, -0.753186799043612410f, 0.657662259445200070f, + -0.753312918050284330f, + 0.657517801412960120f, -0.753439009359793580f, 0.657373319205670210f, + -0.753565072967504190f, + 0.657228812828642650f, -0.753691108868781210f, 0.657084282287190180f, + -0.753817117058990680f, + 0.656939727586627110f, -0.753943097533499640f, 0.656795148732268070f, + -0.754069050287676120f, + 0.656650545729429050f, -0.754194975316889170f, 0.656505918583426550f, + -0.754320872616508820f, + 0.656361267299578000f, -0.754446742181906330f, 0.656216591883202030f, + -0.754572584008453840f, + 0.656071892339617710f, -0.754698398091524390f, 0.655927168674145360f, + -0.754824184426492240f, + 0.655782420892106030f, -0.754949943008732640f, 0.655637648998821820f, + -0.755075673833621510f, + 0.655492852999615460f, -0.755201376896536550f, 0.655348032899810580f, + -0.755327052192855560f, + 0.655203188704731930f, -0.755452699717958140f, 0.655058320419704910f, + -0.755578319467224540f, + 0.654913428050056150f, -0.755703911436035880f, 0.654768511601112600f, + -0.755829475619774760f, + 0.654623571078202680f, -0.755955012013824310f, 0.654478606486655350f, + -0.756080520613569120f, + 0.654333617831800550f, -0.756206001414394540f, 0.654188605118969040f, + -0.756331454411686920f, + 0.654043568353492640f, -0.756456879600833630f, 0.653898507540703890f, + -0.756582276977223470f, + 0.653753422685936170f, -0.756707646536245670f, 0.653608313794523890f, + -0.756832988273290820f, + 0.653463180871802330f, -0.756958302183750490f, 0.653318023923107670f, + -0.757083588263017140f, + 0.653172842953776760f, -0.757208846506484460f, 0.653027637969147650f, + -0.757334076909547130f, + 0.652882408974558960f, -0.757459279467600720f, 0.652737155975350420f, + -0.757584454176041810f, + 0.652591878976862550f, -0.757709601030268080f, 0.652446577984436840f, + -0.757834720025678310f, + 0.652301253003415460f, -0.757959811157672300f, 0.652155904039141700f, + -0.758084874421650620f, + 0.652010531096959500f, -0.758209909813015280f, 0.651865134182214030f, + -0.758334917327168960f, + 0.651719713300251020f, -0.758459896959515320f, 0.651574268456417080f, + -0.758584848705459500f, + 0.651428799656059820f, -0.758709772560407390f, 0.651283306904527850f, + -0.758834668519765660f, + 0.651137790207170330f, -0.758959536578942440f, 0.650992249569337660f, + -0.759084376733346500f, + 0.650846684996380990f, -0.759209188978387960f, 0.650701096493652040f, + -0.759333973309477940f, + 0.650555484066503990f, -0.759458729722028210f, 0.650409847720290420f, + -0.759583458211452010f, + 0.650264187460365960f, -0.759708158773163440f, 0.650118503292086200f, + -0.759832831402577400f, + 0.649972795220807530f, -0.759957476095110330f, 0.649827063251887100f, + -0.760082092846179220f, + 0.649681307390683190f, -0.760206681651202420f, 0.649535527642554730f, + -0.760331242505599030f, + 0.649389724012861770f, -0.760455775404789260f, 0.649243896506965010f, + -0.760580280344194340f, + 0.649098045130226060f, -0.760704757319236920f, 0.648952169888007410f, + -0.760829206325340010f, + 0.648806270785672550f, -0.760953627357928040f, 0.648660347828585840f, + -0.761078020412426560f, + 0.648514401022112550f, -0.761202385484261780f, 0.648368430371618400f, + -0.761326722568861250f, + 0.648222435882470420f, -0.761451031661653510f, 0.648076417560036530f, + -0.761575312758068000f, + 0.647930375409685460f, -0.761699565853535270f, 0.647784309436786550f, + -0.761823790943486840f, + 0.647638219646710420f, -0.761947988023355390f, 0.647492106044828100f, + -0.762072157088574560f, + 0.647345968636512060f, -0.762196298134578900f, 0.647199807427135230f, + -0.762320411156804160f, + 0.647053622422071650f, -0.762444496150687100f, 0.646907413626696020f, + -0.762568553111665380f, + 0.646761181046383920f, -0.762692582035177870f, 0.646614924686512050f, + -0.762816582916664320f, + 0.646468644552457890f, -0.762940555751565720f, 0.646322340649599590f, + -0.763064500535323710f, + 0.646176012983316390f, -0.763188417263381270f, 0.646029661558988330f, + -0.763312305931182380f, + 0.645883286381996440f, -0.763436166534172010f, 0.645736887457722290f, + -0.763559999067796150f, + 0.645590464791548800f, -0.763683803527501870f, 0.645444018388859230f, + -0.763807579908737160f, + 0.645297548255038380f, -0.763931328206951090f, 0.645151054395471270f, + -0.764055048417593860f, + 0.645004536815544040f, -0.764178740536116670f, 0.644857995520643710f, + -0.764302404557971720f, + 0.644711430516158420f, -0.764426040478612070f, 0.644564841807476750f, + -0.764549648293492150f, + 0.644418229399988380f, -0.764673227998067140f, 0.644271593299083900f, + -0.764796779587793460f, + 0.644124933510154540f, -0.764920303058128410f, 0.643978250038592660f, + -0.765043798404530410f, + 0.643831542889791500f, -0.765167265622458960f, 0.643684812069144960f, + -0.765290704707374260f, + 0.643538057582047850f, -0.765414115654738160f, 0.643391279433895960f, + -0.765537498460013070f, + 0.643244477630085850f, -0.765660853118662390f, 0.643097652176015110f, + -0.765784179626150970f, + 0.642950803077082080f, -0.765907477977944230f, 0.642803930338686100f, + -0.766030748169509000f, + 0.642657033966226860f, -0.766153990196312810f, 0.642510113965105710f, + -0.766277204053824710f, + 0.642363170340724320f, -0.766400389737514120f, 0.642216203098485370f, + -0.766523547242852100f, + 0.642069212243792540f, -0.766646676565310380f, 0.641922197782050170f, + -0.766769777700361920f, + 0.641775159718663500f, -0.766892850643480670f, 0.641628098059038860f, + -0.767015895390141480f, + 0.641481012808583160f, -0.767138911935820400f, 0.641333903972704290f, + -0.767261900275994390f, + 0.641186771556811250f, -0.767384860406141620f, 0.641039615566313390f, + -0.767507792321741270f, + 0.640892436006621380f, -0.767630696018273270f, 0.640745232883146440f, + -0.767753571491219030f, + 0.640598006201301030f, -0.767876418736060610f, 0.640450755966498140f, + -0.767999237748281270f, + 0.640303482184151670f, -0.768122028523365310f, 0.640156184859676620f, + -0.768244791056798220f, + 0.640008863998488440f, -0.768367525344066270f, 0.639861519606004010f, + -0.768490231380656750f, + 0.639714151687640450f, -0.768612909162058270f, 0.639566760248816420f, + -0.768735558683760310f, + 0.639419345294950700f, -0.768858179941253270f, 0.639271906831463510f, + -0.768980772930028870f, + 0.639124444863775730f, -0.769103337645579590f, 0.638976959397309140f, + -0.769225874083399260f, + 0.638829450437486400f, -0.769348382238982280f, 0.638681917989730840f, + -0.769470862107824560f, + 0.638534362059466790f, -0.769593313685422940f, 0.638386782652119680f, + -0.769715736967275020f, + 0.638239179773115390f, -0.769838131948879840f, 0.638091553427880930f, + -0.769960498625737230f, + 0.637943903621844170f, -0.770082836993347900f, 0.637796230360433540f, + -0.770205147047214100f, + 0.637648533649078810f, -0.770327428782838770f, 0.637500813493210310f, + -0.770449682195725960f, + 0.637353069898259130f, -0.770571907281380700f, 0.637205302869657600f, + -0.770694104035309140f, + 0.637057512412838590f, -0.770816272453018430f, 0.636909698533235870f, + -0.770938412530016940f, + 0.636761861236284200f, -0.771060524261813710f, 0.636614000527419230f, + -0.771182607643919220f, + 0.636466116412077180f, -0.771304662671844720f, 0.636318208895695570f, + -0.771426689341102590f, + 0.636170277983712170f, -0.771548687647206300f, 0.636022323681566300f, + -0.771670657585670330f, + 0.635874345994697720f, -0.771792599152010150f, 0.635726344928547180f, + -0.771914512341742350f, + 0.635578320488556230f, -0.772036397150384410f, 0.635430272680167160f, + -0.772158253573455240f, + 0.635282201508823530f, -0.772280081606474320f, 0.635134106979969300f, + -0.772401881244962340f, + 0.634985989099049460f, -0.772523652484441330f, 0.634837847871510100f, + -0.772645395320433860f, + 0.634689683302797850f, -0.772767109748463740f, 0.634541495398360130f, + -0.772888795764056220f, + 0.634393284163645490f, -0.773010453362736990f, 0.634245049604103330f, + -0.773132082540033070f, + 0.634096791725183740f, -0.773253683291472590f, 0.633948510532337810f, + -0.773375255612584470f, + 0.633800206031017280f, -0.773496799498899050f, 0.633651878226674900f, + -0.773618314945947460f, + 0.633503527124764320f, -0.773739801949261840f, 0.633355152730740060f, + -0.773861260504375540f, + 0.633206755050057190f, -0.773982690606822790f, 0.633058334088172250f, + -0.774104092252138940f, + 0.632909889850541860f, -0.774225465435860570f, 0.632761422342624000f, + -0.774346810153525020f, + 0.632612931569877520f, -0.774468126400670860f, 0.632464417537761840f, + -0.774589414172837550f, + 0.632315880251737680f, -0.774710673465565550f, 0.632167319717266030f, + -0.774831904274396850f, + 0.632018735939809060f, -0.774953106594873820f, 0.631870128924829850f, + -0.775074280422540450f, + 0.631721498677792370f, -0.775195425752941310f, 0.631572845204161130f, + -0.775316542581622410f, + 0.631424168509401860f, -0.775437630904130430f, 0.631275468598980870f, + -0.775558690716013580f, + 0.631126745478365340f, -0.775679722012820540f, 0.630977999153023660f, + -0.775800724790101540f, + 0.630829229628424470f, -0.775921699043407580f, 0.630680436910038060f, + -0.776042644768290770f, + 0.630531621003334600f, -0.776163561960304340f, 0.630382781913785940f, + -0.776284450615002400f, + 0.630233919646864480f, -0.776405310727940390f, 0.630085034208043290f, + -0.776526142294674430f, + 0.629936125602796550f, -0.776646945310762060f, 0.629787193836599200f, + -0.776767719771761510f, + 0.629638238914927100f, -0.776888465673232440f, 0.629489260843256740f, + -0.777009183010735290f, + 0.629340259627065750f, -0.777129871779831620f, 0.629191235271832410f, + -0.777250531976084070f, + 0.629042187783036000f, -0.777371163595056200f, 0.628893117166156480f, + -0.777491766632312900f, + 0.628744023426674790f, -0.777612341083419920f, 0.628594906570072660f, + -0.777732886943944050f, + 0.628445766601832710f, -0.777853404209453040f, 0.628296603527438440f, + -0.777973892875515990f, + 0.628147417352374120f, -0.778094352937702790f, 0.627998208082124810f, + -0.778214784391584420f, + 0.627848975722176570f, -0.778335187232733090f, 0.627699720278016240f, + -0.778455561456721900f, + 0.627550441755131530f, -0.778575907059124940f, 0.627401140159011160f, + -0.778696224035517530f, + 0.627251815495144190f, -0.778816512381475870f, 0.627102467769021010f, + -0.778936772092577500f, + 0.626953096986132770f, -0.779057003164400630f, 0.626803703151971310f, + -0.779177205592524680f, + 0.626654286272029460f, -0.779297379372530300f, 0.626504846351800930f, + -0.779417524499998900f, + 0.626355383396779990f, -0.779537640970513150f, 0.626205897412462130f, + -0.779657728779656780f, + 0.626056388404343520f, -0.779777787923014440f, 0.625906856377921210f, + -0.779897818396171890f, + 0.625757301338692900f, -0.780017820194715990f, 0.625607723292157410f, + -0.780137793314234500f, + 0.625458122243814360f, -0.780257737750316590f, 0.625308498199164010f, + -0.780377653498552040f, + 0.625158851163707730f, -0.780497540554531910f, 0.625009181142947460f, + -0.780617398913848290f, + 0.624859488142386450f, -0.780737228572094380f, 0.624709772167528100f, + -0.780857029524864470f, + 0.624560033223877320f, -0.780976801767753750f, 0.624410271316939380f, + -0.781096545296358410f, + 0.624260486452220650f, -0.781216260106276090f, 0.624110678635228510f, + -0.781335946193104870f, + 0.623960847871470770f, -0.781455603552444480f, 0.623810994166456130f, + -0.781575232179895550f, + 0.623661117525694640f, -0.781694832071059390f, 0.623511217954696550f, + -0.781814403221538830f, + 0.623361295458973340f, -0.781933945626937630f, 0.623211350044037270f, + -0.782053459282860300f, + 0.623061381715401370f, -0.782172944184912900f, 0.622911390478579460f, + -0.782292400328702400f, + 0.622761376339086460f, -0.782411827709836420f, 0.622611339302437730f, + -0.782531226323924240f, + 0.622461279374150080f, -0.782650596166575730f, 0.622311196559740320f, + -0.782769937233402050f, + 0.622161090864726930f, -0.782889249520015480f, 0.622010962294628600f, + -0.783008533022029110f, + 0.621860810854965360f, -0.783127787735057310f, 0.621710636551257690f, + -0.783247013654715380f, + 0.621560439389027270f, -0.783366210776619720f, 0.621410219373796150f, + -0.783485379096387820f, + 0.621259976511087660f, -0.783604518609638200f, 0.621109710806425740f, + -0.783723629311990470f, + 0.620959422265335180f, -0.783842711199065230f, 0.620809110893341900f, + -0.783961764266484010f, + 0.620658776695972140f, -0.784080788509869950f, 0.620508419678753360f, + -0.784199783924846570f, + 0.620358039847213830f, -0.784318750507038920f, 0.620207637206882430f, + -0.784437688252072720f, + 0.620057211763289210f, -0.784556597155575240f, 0.619906763521964830f, + -0.784675477213174320f, + 0.619756292488440660f, -0.784794328420499230f, 0.619605798668249390f, + -0.784913150773180020f, + 0.619455282066924020f, -0.785031944266848080f, 0.619304742689998690f, + -0.785150708897135560f, + 0.619154180543008410f, -0.785269444659675850f, 0.619003595631488770f, + -0.785388151550103550f, + 0.618852987960976320f, -0.785506829564053930f, 0.618702357537008640f, + -0.785625478697163700f, + 0.618551704365123860f, -0.785744098945070360f, 0.618401028450860980f, + -0.785862690303412600f, + 0.618250329799760250f, -0.785981252767830150f, 0.618099608417362110f, + -0.786099786333963820f, + 0.617948864309208260f, -0.786218290997455550f, 0.617798097480841140f, + -0.786336766753948260f, + 0.617647307937803980f, -0.786455213599085770f, 0.617496495685640910f, + -0.786573631528513230f, + 0.617345660729896940f, -0.786692020537876680f, 0.617194803076117630f, + -0.786810380622823490f, + 0.617043922729849760f, -0.786928711779001700f, 0.616893019696640790f, + -0.787047014002060790f, + 0.616742093982038830f, -0.787165287287650890f, 0.616591145591593230f, + -0.787283531631423620f, + 0.616440174530853650f, -0.787401747029031320f, 0.616289180805370980f, + -0.787519933476127810f, + 0.616138164420696910f, -0.787638090968367450f, 0.615987125382383870f, + -0.787756219501405950f, + 0.615836063695985090f, -0.787874319070900110f, 0.615684979367054570f, + -0.787992389672507950f, + 0.615533872401147430f, -0.788110431301888070f, 0.615382742803819330f, + -0.788228443954700490f, + 0.615231590580626820f, -0.788346427626606230f, 0.615080415737127460f, + -0.788464382313267430f, + 0.614929218278879590f, -0.788582308010347120f, 0.614777998211442190f, + -0.788700204713509660f, + 0.614626755540375050f, -0.788818072418420170f, 0.614475490271239160f, + -0.788935911120745130f, + 0.614324202409595950f, -0.789053720816151880f, 0.614172891961007990f, + -0.789171501500308790f, + 0.614021558931038490f, -0.789289253168885650f, 0.613870203325251440f, + -0.789406975817552810f, + 0.613718825149211830f, -0.789524669441982190f, 0.613567424408485330f, + -0.789642334037846340f, + 0.613416001108638590f, -0.789759969600819070f, 0.613264555255239150f, + -0.789877576126575280f, + 0.613113086853854910f, -0.789995153610791090f, 0.612961595910055170f, + -0.790112702049143300f, + 0.612810082429409710f, -0.790230221437310030f, 0.612658546417489290f, + -0.790347711770970520f, + 0.612506987879865570f, -0.790465173045804880f, 0.612355406822110760f, + -0.790582605257494460f, + 0.612203803249798060f, -0.790700008401721610f, 0.612052177168501580f, + -0.790817382474169660f, + 0.611900528583796070f, -0.790934727470523290f, 0.611748857501257400f, + -0.791052043386467950f, + 0.611597163926462020f, -0.791169330217690090f, 0.611445447864987110f, + -0.791286587959877720f, + 0.611293709322411010f, -0.791403816608719500f, 0.611141948304312570f, + -0.791521016159905220f, + 0.610990164816271770f, -0.791638186609125770f, 0.610838358863869280f, + -0.791755327952073150f, + 0.610686530452686280f, -0.791872440184440470f, 0.610534679588305320f, + -0.791989523301921850f, + 0.610382806276309480f, -0.792106577300212390f, 0.610230910522282620f, + -0.792223602175008310f, + 0.610078992331809620f, -0.792340597922007060f, 0.609927051710476230f, + -0.792457564536906970f, + 0.609775088663868430f, -0.792574502015407580f, 0.609623103197573730f, + -0.792691410353209450f, + 0.609471095317180240f, -0.792808289546014120f, 0.609319065028276820f, + -0.792925139589524260f, + 0.609167012336453210f, -0.793041960479443640f, 0.609014937247299940f, + -0.793158752211477140f, + 0.608862839766408200f, -0.793275514781330630f, 0.608710719899370420f, + -0.793392248184711100f, + 0.608558577651779450f, -0.793508952417326660f, 0.608406413029229260f, + -0.793625627474886190f, + 0.608254226037314490f, -0.793742273353100100f, 0.608102016681630550f, + -0.793858890047679620f, + 0.607949784967773740f, -0.793975477554337170f, 0.607797530901341140f, + -0.794092035868785960f, + 0.607645254487930830f, -0.794208564986740640f, 0.607492955733141660f, + -0.794325064903916520f, + 0.607340634642572930f, -0.794441535616030590f, 0.607188291221825160f, + -0.794557977118800270f, + 0.607035925476499760f, -0.794674389407944550f, 0.606883537412198580f, + -0.794790772479183170f, + 0.606731127034524480f, -0.794907126328237010f, 0.606578694349081400f, + -0.795023450950828050f, + 0.606426239361473550f, -0.795139746342679590f, 0.606273762077306430f, + -0.795256012499515500f, + 0.606121262502186230f, -0.795372249417061190f, 0.605968740641719790f, + -0.795488457091042990f, + 0.605816196501515080f, -0.795604635517188070f, 0.605663630087180490f, + -0.795720784691225090f, + 0.605511041404325550f, -0.795836904608883460f, 0.605358430458560530f, + -0.795952995265893910f, + 0.605205797255496500f, -0.796069056657987990f, 0.605053141800745430f, + -0.796185088780898440f, + 0.604900464099919930f, -0.796301091630359110f, 0.604747764158633410f, + -0.796417065202104980f, + 0.604595041982500360f, -0.796533009491872000f, 0.604442297577135970f, + -0.796648924495397150f, + 0.604289530948156070f, -0.796764810208418720f, 0.604136742101177630f, + -0.796880666626675780f, + 0.603983931041818020f, -0.796996493745908750f, 0.603831097775695880f, + -0.797112291561858920f, + 0.603678242308430370f, -0.797228060070268700f, 0.603525364645641550f, + -0.797343799266881700f, + 0.603372464792950370f, -0.797459509147442460f, 0.603219542755978440f, + -0.797575189707696590f, + 0.603066598540348280f, -0.797690840943391040f, 0.602913632151683140f, + -0.797806462850273570f, + 0.602760643595607220f, -0.797922055424093000f, 0.602607632877745550f, + -0.798037618660599410f, + 0.602454600003723860f, -0.798153152555543750f, 0.602301544979168550f, + -0.798268657104678310f, + 0.602148467809707320f, -0.798384132303756380f, 0.601995368500968130f, + -0.798499578148532010f, + 0.601842247058580030f, -0.798614994634760820f, 0.601689103488173060f, + -0.798730381758199210f, + 0.601535937795377730f, -0.798845739514604580f, 0.601382749985825420f, + -0.798961067899735760f, + 0.601229540065148620f, -0.799076366909352350f, 0.601076308038980160f, + -0.799191636539215210f, + 0.600923053912954090f, -0.799306876785086160f, 0.600769777692705230f, + -0.799422087642728040f, + 0.600616479383868970f, -0.799537269107905010f, 0.600463158992081690f, + -0.799652421176382130f, + 0.600309816522980430f, -0.799767543843925680f, 0.600156451982203350f, + -0.799882637106302810f, + 0.600003065375389060f, -0.799997700959281910f, 0.599849656708177360f, + -0.800112735398632370f, + 0.599696225986208310f, -0.800227740420124790f, 0.599542773215123390f, + -0.800342716019530660f, + 0.599389298400564540f, -0.800457662192622710f, 0.599235801548174570f, + -0.800572578935174750f, + 0.599082282663597310f, -0.800687466242961500f, 0.598928741752476900f, + -0.800802324111759110f, + 0.598775178820458720f, -0.800917152537344300f, 0.598621593873188920f, + -0.801031951515495330f, + 0.598467986916314310f, -0.801146721041991250f, 0.598314357955482600f, + -0.801261461112612540f, + 0.598160706996342380f, -0.801376171723140130f, 0.598007034044542700f, + -0.801490852869356840f, + 0.597853339105733910f, -0.801605504547046040f, 0.597699622185566830f, + -0.801720126751992330f, + 0.597545883289693270f, -0.801834719479981310f, 0.597392122423765710f, + -0.801949282726799660f, + 0.597238339593437530f, -0.802063816488235440f, 0.597084534804362740f, + -0.802178320760077450f, + 0.596930708062196500f, -0.802292795538115720f, 0.596776859372594500f, + -0.802407240818141300f, + 0.596622988741213330f, -0.802521656595946320f, 0.596469096173710360f, + -0.802636042867324150f, + 0.596315181675743820f, -0.802750399628069160f, 0.596161245252972540f, + -0.802864726873976590f, + 0.596007286911056530f, -0.802979024600843140f, 0.595853306655656390f, + -0.803093292804466400f, + 0.595699304492433470f, -0.803207531480644830f, 0.595545280427049790f, + -0.803321740625178470f, + 0.595391234465168730f, -0.803435920233868120f, 0.595237166612453850f, + -0.803550070302515570f, + 0.595083076874569960f, -0.803664190826924090f, 0.594928965257182420f, + -0.803778281802897570f, + 0.594774831765957580f, -0.803892343226241260f, 0.594620676406562240f, + -0.804006375092761520f, + 0.594466499184664540f, -0.804120377398265700f, 0.594312300105932830f, + -0.804234350138562260f, + 0.594158079176036800f, -0.804348293309460780f, 0.594003836400646690f, + -0.804462206906771840f, + 0.593849571785433630f, -0.804576090926307000f, 0.593695285336069300f, + -0.804689945363879500f, + 0.593540977058226390f, -0.804803770215302810f, 0.593386646957578480f, + -0.804917565476392150f, + 0.593232295039799800f, -0.805031331142963660f, 0.593077921310565580f, + -0.805145067210834120f, + 0.592923525775551410f, -0.805258773675822210f, 0.592769108440434070f, + -0.805372450533747060f, + 0.592614669310891130f, -0.805486097780429120f, 0.592460208392600940f, + -0.805599715411689950f, + 0.592305725691242400f, -0.805713303423352120f, 0.592151221212495640f, + -0.805826861811239300f, + 0.591996694962040990f, -0.805940390571176280f, 0.591842146945560250f, + -0.806053889698988950f, + 0.591687577168735550f, -0.806167359190504310f, 0.591532985637249990f, + -0.806280799041550370f, + 0.591378372356787580f, -0.806394209247956240f, 0.591223737333032910f, + -0.806507589805552260f, + 0.591069080571671510f, -0.806620940710169650f, 0.590914402078389520f, + -0.806734261957640750f, + 0.590759701858874280f, -0.806847553543799220f, 0.590604979918813440f, + -0.806960815464479620f, + 0.590450236263895920f, -0.807074047715517610f, 0.590295470899810940f, + -0.807187250292749850f, + 0.590140683832248940f, -0.807300423192014450f, 0.589985875066900920f, + -0.807413566409150190f, + 0.589831044609458900f, -0.807526679939997160f, 0.589676192465615420f, + -0.807639763780396370f, + 0.589521318641063940f, -0.807752817926190360f, 0.589366423141498790f, + -0.807865842373222120f, + 0.589211505972615070f, -0.807978837117336310f, 0.589056567140108460f, + -0.808091802154378260f, + 0.588901606649675840f, -0.808204737480194720f, 0.588746624507014650f, + -0.808317643090633250f, + 0.588591620717822890f, -0.808430518981542720f, 0.588436595287799900f, + -0.808543365148773010f, + 0.588281548222645330f, -0.808656181588174980f, 0.588126479528059850f, + -0.808768968295600850f, + 0.587971389209745120f, -0.808881725266903610f, 0.587816277273403020f, + -0.808994452497937560f, + 0.587661143724736770f, -0.809107149984558130f, 0.587505988569450020f, + -0.809219817722621750f, + 0.587350811813247660f, -0.809332455707985840f, 0.587195613461834910f, + -0.809445063936509170f, + 0.587040393520918080f, -0.809557642404051260f, 0.586885151996203950f, + -0.809670191106473090f, + 0.586729888893400500f, -0.809782710039636420f, 0.586574604218216280f, + -0.809895199199404450f, + 0.586419297976360500f, -0.810007658581641140f, 0.586263970173543700f, + -0.810120088182211600f, + 0.586108620815476430f, -0.810232487996982330f, 0.585953249907870680f, + -0.810344858021820550f, + 0.585797857456438860f, -0.810457198252594770f, 0.585642443466894420f, + -0.810569508685174630f, + 0.585487007944951450f, -0.810681789315430670f, 0.585331550896324940f, + -0.810794040139234730f, + 0.585176072326730410f, -0.810906261152459670f, 0.585020572241884530f, + -0.811018452350979470f, + 0.584865050647504490f, -0.811130613730669190f, 0.584709507549308500f, + -0.811242745287404810f, + 0.584553942953015330f, -0.811354847017063730f, 0.584398356864344710f, + -0.811466918915524250f, + 0.584242749289016980f, -0.811578960978665890f, 0.584087120232753550f, + -0.811690973202369050f, + 0.583931469701276300f, -0.811802955582515360f, 0.583775797700308070f, + -0.811914908114987680f, + 0.583620104235572760f, -0.812026830795669730f, 0.583464389312794430f, + -0.812138723620446480f, + 0.583308652937698290f, -0.812250586585203880f, 0.583152895116010540f, + -0.812362419685829120f, + 0.582997115853457700f, -0.812474222918210480f, 0.582841315155767650f, + -0.812585996278237020f, + 0.582685493028668460f, -0.812697739761799490f, 0.582529649477889320f, + -0.812809453364789160f, + 0.582373784509160220f, -0.812921137083098770f, 0.582217898128211790f, + -0.813032790912621930f, + 0.582061990340775550f, -0.813144414849253590f, 0.581906061152583920f, + -0.813256008888889380f, + 0.581750110569369760f, -0.813367573027426570f, 0.581594138596866930f, + -0.813479107260763220f, + 0.581438145240810280f, -0.813590611584798510f, 0.581282130506935110f, + -0.813702085995432700f, + 0.581126094400977620f, -0.813813530488567190f, 0.580970036928674880f, + -0.813924945060104490f, + 0.580813958095764530f, -0.814036329705948300f, 0.580657857907985410f, + -0.814147684422003360f, + 0.580501736371076600f, -0.814259009204175270f, 0.580345593490778300f, + -0.814370304048371070f, + 0.580189429272831680f, -0.814481568950498610f, 0.580033243722978150f, + -0.814592803906467270f, + 0.579877036846960350f, -0.814704008912187080f, 0.579720808650521560f, + -0.814815183963569330f, + 0.579564559139405740f, -0.814926329056526620f, 0.579408288319357980f, + -0.815037444186972220f, + 0.579251996196123550f, -0.815148529350820830f, 0.579095682775449210f, + -0.815259584543988280f, + 0.578939348063081890f, -0.815370609762391290f, 0.578782992064769690f, + -0.815481605001947770f, + 0.578626614786261430f, -0.815592570258576680f, 0.578470216233306740f, + -0.815703505528198260f, + 0.578313796411655590f, -0.815814410806733780f, 0.578157355327059360f, + -0.815925286090105390f, + 0.578000892985269910f, -0.816036131374236700f, 0.577844409392039850f, + -0.816146946655052160f, + 0.577687904553122800f, -0.816257731928477390f, 0.577531378474272830f, + -0.816368487190439200f, + 0.577374831161244880f, -0.816479212436865390f, 0.577218262619794920f, + -0.816589907663684890f, + 0.577061672855679550f, -0.816700572866827850f, 0.576905061874655960f, + -0.816811208042225290f, + 0.576748429682482520f, -0.816921813185809480f, 0.576591776284917870f, + -0.817032388293513880f, + 0.576435101687721830f, -0.817142933361272970f, 0.576278405896654910f, + -0.817253448385022230f, + 0.576121688917478390f, -0.817363933360698460f, 0.575964950755954330f, + -0.817474388284239240f, + 0.575808191417845340f, -0.817584813151583710f, 0.575651410908915250f, + -0.817695207958671680f, + 0.575494609234928230f, -0.817805572701444270f, 0.575337786401649560f, + -0.817915907375843740f, + 0.575180942414845190f, -0.818026211977813440f, 0.575024077280281820f, + -0.818136486503297620f, + 0.574867191003726740f, -0.818246730948241960f, 0.574710283590948450f, + -0.818356945308593150f, + 0.574553355047715760f, -0.818467129580298660f, 0.574396405379798750f, + -0.818577283759307490f, + 0.574239434592967890f, -0.818687407841569570f, 0.574082442692994470f, + -0.818797501823036010f, + 0.573925429685650750f, -0.818907565699658950f, 0.573768395576709560f, + -0.819017599467391500f, + 0.573611340371944610f, -0.819127603122188240f, 0.573454264077130400f, + -0.819237576660004520f, + 0.573297166698042320f, -0.819347520076796900f, 0.573140048240456060f, + -0.819457433368523280f, + 0.572982908710148680f, -0.819567316531142230f, 0.572825748112897550f, + -0.819677169560613760f, + 0.572668566454481160f, -0.819786992452898990f, 0.572511363740678790f, + -0.819896785203959810f, + 0.572354139977270030f, -0.820006547809759680f, 0.572196895170035580f, + -0.820116280266262710f, + 0.572039629324757050f, -0.820225982569434690f, 0.571882342447216590f, + -0.820335654715241840f, + 0.571725034543197120f, -0.820445296699652050f, 0.571567705618482580f, + -0.820554908518633890f, + 0.571410355678857340f, -0.820664490168157460f, 0.571252984730106660f, + -0.820774041644193650f, + 0.571095592778016690f, -0.820883562942714580f, 0.570938179828374360f, + -0.820993054059693470f, + 0.570780745886967370f, -0.821102514991104650f, 0.570623290959583860f, + -0.821211945732923550f, + 0.570465815052012990f, -0.821321346281126740f, 0.570308318170045010f, + -0.821430716631691760f, + 0.570150800319470300f, -0.821540056780597610f, 0.569993261506080650f, + -0.821649366723823830f, + 0.569835701735668110f, -0.821758646457351640f, 0.569678121014025710f, + -0.821867895977163140f, + 0.569520519346947250f, -0.821977115279241550f, 0.569362896740227330f, + -0.822086304359571090f, + 0.569205253199661200f, -0.822195463214137170f, 0.569047588731045220f, + -0.822304591838926350f, + 0.568889903340175970f, -0.822413690229926390f, 0.568732197032851160f, + -0.822522758383125940f, + 0.568574469814869250f, -0.822631796294514990f, 0.568416721692029390f, + -0.822740803960084420f, + 0.568258952670131490f, -0.822849781375826320f, 0.568101162754976570f, + -0.822958728537734000f, + 0.567943351952365670f, -0.823067645441801670f, 0.567785520268101250f, + -0.823176532084024860f, + 0.567627667707986230f, -0.823285388460400110f, 0.567469794277824620f, + -0.823394214566925080f, + 0.567311899983420800f, -0.823503010399598390f, 0.567153984830580100f, + -0.823611775954420260f, + 0.566996048825108680f, -0.823720511227391320f, 0.566838091972813320f, + -0.823829216214513990f, + 0.566680114279501710f, -0.823937890911791370f, 0.566522115750982100f, + -0.824046535315227760f, + 0.566364096393063950f, -0.824155149420828570f, 0.566206056211556840f, + -0.824263733224600450f, + 0.566047995212271560f, -0.824372286722551250f, 0.565889913401019570f, + -0.824480809910689500f, + 0.565731810783613230f, -0.824589302785025290f, 0.565573687365865440f, + -0.824697765341569470f, + 0.565415543153589770f, -0.824806197576334330f, 0.565257378152600910f, + -0.824914599485333080f, + 0.565099192368714090f, -0.825022971064580220f, 0.564940985807745320f, + -0.825131312310090960f, + 0.564782758475511400f, -0.825239623217882130f, 0.564624510377830120f, + -0.825347903783971380f, + 0.564466241520519500f, -0.825456154004377440f, 0.564307951909398750f, + -0.825564373875120490f, + 0.564149641550287680f, -0.825672563392221390f, 0.563991310449007080f, + -0.825780722551702430f, + 0.563832958611378170f, -0.825888851349586780f, 0.563674586043223180f, + -0.825996949781898970f, + 0.563516192750364910f, -0.826105017844664610f, 0.563357778738627020f, + -0.826213055533910110f, + 0.563199344013834090f, -0.826321062845663420f, 0.563040888581811230f, + -0.826429039775953390f, + 0.562882412448384550f, -0.826536986320809960f, 0.562723915619380400f, + -0.826644902476264210f, + 0.562565398100626560f, -0.826752788238348520f, 0.562406859897951140f, + -0.826860643603096080f, + 0.562248301017183150f, -0.826968468566541490f, 0.562089721464152480f, + -0.827076263124720270f, + 0.561931121244689470f, -0.827184027273669020f, 0.561772500364625450f, + -0.827291761009425810f, + 0.561613858829792420f, -0.827399464328029350f, 0.561455196646023280f, + -0.827507137225519830f, + 0.561296513819151470f, -0.827614779697938400f, 0.561137810355011530f, + -0.827722391741327220f, + 0.560979086259438260f, -0.827829973351729810f, 0.560820341538267540f, + -0.827937524525190870f, + 0.560661576197336030f, -0.828045045257755800f, 0.560502790242481060f, + -0.828152535545471410f, + 0.560343983679540860f, -0.828259995384385550f, 0.560185156514354080f, + -0.828367424770547480f, + 0.560026308752760380f, -0.828474823700007130f, 0.559867440400600320f, + -0.828582192168815790f, + 0.559708551463714790f, -0.828689530173025710f, 0.559549641947945870f, + -0.828796837708690610f, + 0.559390711859136140f, -0.828904114771864870f, 0.559231761203129010f, + -0.829011361358604430f, + 0.559072789985768480f, -0.829118577464965980f, 0.558913798212899770f, + -0.829225763087007570f, + 0.558754785890368310f, -0.829332918220788250f, 0.558595753024020760f, + -0.829440042862368170f, + 0.558436699619704100f, -0.829547137007808800f, 0.558277625683266330f, + -0.829654200653172640f, + 0.558118531220556100f, -0.829761233794523050f, 0.557959416237422960f, + -0.829868236427924840f, + 0.557800280739717100f, -0.829975208549443840f, 0.557641124733289420f, + -0.830082150155146970f, + 0.557481948223991660f, -0.830189061241102370f, 0.557322751217676160f, + -0.830295941803379070f, + 0.557163533720196340f, -0.830402791838047550f, 0.557004295737406060f, + -0.830509611341179070f, + 0.556845037275160100f, -0.830616400308846200f, 0.556685758339313890f, + -0.830723158737122880f, + 0.556526458935723720f, -0.830829886622083570f, 0.556367139070246490f, + -0.830936583959804410f, + 0.556207798748739930f, -0.831043250746362320f, 0.556048437977062720f, + -0.831149886977835430f, + 0.555889056761073920f, -0.831256492650303210f, 0.555729655106633520f, + -0.831363067759845920f, + 0.555570233019602290f, -0.831469612302545240f, 0.555410790505841740f, + -0.831576126274483630f, + 0.555251327571214090f, -0.831682609671745120f, 0.555091844221582420f, + -0.831789062490414400f, + 0.554932340462810370f, -0.831895484726577590f, 0.554772816300762580f, + -0.832001876376321840f, + 0.554613271741304040f, -0.832108237435735480f, 0.554453706790301040f, + -0.832214567900907980f, + 0.554294121453620110f, -0.832320867767929680f, 0.554134515737128910f, + -0.832427137032892280f, + 0.553974889646695610f, -0.832533375691888680f, 0.553815243188189090f, + -0.832639583741012770f, + 0.553655576367479310f, -0.832745761176359460f, 0.553495889190436570f, + -0.832851907994024980f, + 0.553336181662932410f, -0.832958024190106670f, 0.553176453790838460f, + -0.833064109760702890f, + 0.553016705580027580f, -0.833170164701913190f, 0.552856937036373290f, + -0.833276189009838240f, + 0.552697148165749770f, -0.833382182680579730f, 0.552537338974032120f, + -0.833488145710240770f, + 0.552377509467096070f, -0.833594078094925140f, 0.552217659650817930f, + -0.833699979830738290f, + 0.552057789531074980f, -0.833805850913786340f, 0.551897899113745320f, + -0.833911691340176730f, + 0.551737988404707450f, -0.834017501106018130f, 0.551578057409841000f, + -0.834123280207419990f, + 0.551418106135026060f, -0.834229028640493420f, 0.551258134586143700f, + -0.834334746401350080f, + 0.551098142769075430f, -0.834440433486103190f, 0.550938130689703880f, + -0.834546089890866760f, + 0.550778098353912230f, -0.834651715611756330f, 0.550618045767584330f, + -0.834757310644888230f, + 0.550457972936604810f, -0.834862874986380010f, 0.550297879866859190f, + -0.834968408632350450f, + 0.550137766564233630f, -0.835073911578919300f, 0.549977633034615000f, + -0.835179383822207580f, + 0.549817479283891020f, -0.835284825358337370f, 0.549657305317949980f, + -0.835390236183431780f, + 0.549497111142680960f, -0.835495616293615350f, 0.549336896763974010f, + -0.835600965685013410f, + 0.549176662187719770f, -0.835706284353752600f, 0.549016407419809390f, + -0.835811572295960590f, + 0.548856132466135290f, -0.835916829507766360f, 0.548695837332590090f, + -0.836022055985299880f, + 0.548535522025067390f, -0.836127251724692160f, 0.548375186549461600f, + -0.836232416722075600f, + 0.548214830911667780f, -0.836337550973583530f, 0.548054455117581880f, + -0.836442654475350380f, + 0.547894059173100190f, -0.836547727223511890f, 0.547733643084120200f, + -0.836652769214204950f, + 0.547573206856539870f, -0.836757780443567190f, 0.547412750496257930f, + -0.836862760907737810f, + 0.547252274009174090f, -0.836967710602857020f, 0.547091777401188530f, + -0.837072629525066000f, + 0.546931260678202190f, -0.837177517670507190f, 0.546770723846116800f, + -0.837282375035324320f, + 0.546610166910834860f, -0.837387201615661940f, 0.546449589878259760f, + -0.837491997407665890f, + 0.546288992754295210f, -0.837596762407483040f, 0.546128375544846060f, + -0.837701496611261700f, + 0.545967738255817680f, -0.837806200015150940f, 0.545807080893116140f, + -0.837910872615301060f, + 0.545646403462648590f, -0.838015514407863700f, 0.545485705970322530f, + -0.838120125388991500f, + 0.545324988422046460f, -0.838224705554837970f, 0.545164250823729320f, + -0.838329254901558300f, + 0.545003493181281160f, -0.838433773425308340f, 0.544842715500612470f, + -0.838538261122245170f, + 0.544681917787634530f, -0.838642717988527300f, 0.544521100048259710f, + -0.838747144020313920f, + 0.544360262288400400f, -0.838851539213765760f, 0.544199404513970420f, + -0.838955903565044350f, + 0.544038526730883930f, -0.839060237070312630f, 0.543877628945055980f, + -0.839164539725734570f, + 0.543716711162402390f, -0.839268811527475230f, 0.543555773388839650f, + -0.839373052471700690f, + 0.543394815630284800f, -0.839477262554578550f, 0.543233837892656000f, + -0.839581441772277120f, + 0.543072840181871850f, -0.839685590120966110f, 0.542911822503851730f, + -0.839789707596816260f, + 0.542750784864516000f, -0.839893794195999410f, 0.542589727269785270f, + -0.839997849914688730f, + 0.542428649725581360f, -0.840101874749058400f, 0.542267552237826520f, + -0.840205868695283580f, + 0.542106434812444030f, -0.840309831749540770f, 0.541945297455357470f, + -0.840413763908007480f, + 0.541784140172491660f, -0.840517665166862440f, 0.541622962969771640f, + -0.840621535522285690f, + 0.541461765853123560f, -0.840725374970458070f, 0.541300548828474120f, + -0.840829183507561640f, + 0.541139311901750910f, -0.840932961129779670f, 0.540978055078882190f, + -0.841036707833296650f, + 0.540816778365796670f, -0.841140423614298080f, 0.540655481768424260f, + -0.841244108468970580f, + 0.540494165292695230f, -0.841347762393501950f, 0.540332828944540820f, + -0.841451385384081260f, + 0.540171472729892970f, -0.841554977436898330f, 0.540010096654684020f, + -0.841658538548144760f, + 0.539848700724847700f, -0.841762068714012490f, 0.539687284946317570f, + -0.841865567930695340f, + 0.539525849325029010f, -0.841969036194387680f, 0.539364393866917150f, + -0.842072473501285450f, + 0.539202918577918240f, -0.842175879847585570f, 0.539041423463969550f, + -0.842279255229485880f, + 0.538879908531008420f, -0.842382599643185960f, 0.538718373784973670f, + -0.842485913084885630f, + 0.538556819231804210f, -0.842589195550786600f, 0.538395244877439950f, + -0.842692447037091560f, + 0.538233650727821700f, -0.842795667540004120f, 0.538072036788890600f, + -0.842898857055729310f, + 0.537910403066588990f, -0.843002015580472830f, 0.537748749566859470f, + -0.843105143110442050f, + 0.537587076295645510f, -0.843208239641845440f, 0.537425383258891660f, + -0.843311305170892030f, + 0.537263670462542530f, -0.843414339693792760f, 0.537101937912544240f, + -0.843517343206759080f, + 0.536940185614843020f, -0.843620315706004040f, 0.536778413575385920f, + -0.843723257187741550f, + 0.536616621800121150f, -0.843826167648186740f, 0.536454810294997090f, + -0.843929047083555870f, + 0.536292979065963180f, -0.844031895490066410f, 0.536131128118969350f, + -0.844134712863936930f, + 0.535969257459966710f, -0.844237499201387020f, 0.535807367094906620f, + -0.844340254498637590f, + 0.535645457029741090f, -0.844442978751910660f, 0.535483527270423370f, + -0.844545671957429240f, + 0.535321577822907010f, -0.844648334111417820f, 0.535159608693146720f, + -0.844750965210101510f, + 0.534997619887097260f, -0.844853565249707010f, 0.534835611410714670f, + -0.844956134226462100f, + 0.534673583269955510f, -0.845058672136595470f, 0.534511535470777010f, + -0.845161178976337140f, + 0.534349468019137520f, -0.845263654741918220f, 0.534187380920995600f, + -0.845366099429570970f, + 0.534025274182310380f, -0.845468513035528830f, 0.533863147809042650f, + -0.845570895556026270f, + 0.533701001807152960f, -0.845673246987299070f, 0.533538836182603120f, + -0.845775567325583900f, + 0.533376650941355560f, -0.845877856567118890f, 0.533214446089372960f, + -0.845980114708143270f, + 0.533052221632619670f, -0.846082341744896940f, 0.532889977577059690f, + -0.846184537673621670f, + 0.532727713928658810f, -0.846286702490559710f, 0.532565430693382580f, + -0.846388836191954930f, + 0.532403127877198010f, -0.846490938774052020f, 0.532240805486072330f, + -0.846593010233097190f, + 0.532078463525973540f, -0.846695050565337450f, 0.531916102002870760f, + -0.846797059767020910f, + 0.531753720922733320f, -0.846899037834397350f, 0.531591320291531780f, + -0.847000984763716880f, + 0.531428900115236910f, -0.847102900551231500f, 0.531266460399820390f, + -0.847204785193193980f, + 0.531104001151255000f, -0.847306638685858320f, 0.530941522375513510f, + -0.847408461025479730f, + 0.530779024078570250f, -0.847510252208314330f, 0.530616506266399450f, + -0.847612012230619660f, + 0.530453968944976320f, -0.847713741088654270f, 0.530291412120277420f, + -0.847815438778677930f, + 0.530128835798278850f, -0.847917105296951410f, 0.529966239984958620f, + -0.848018740639736810f, + 0.529803624686294830f, -0.848120344803297120f, 0.529640989908265910f, + -0.848221917783896990f, + 0.529478335656852090f, -0.848323459577801530f, 0.529315661938033140f, + -0.848424970181277600f, + 0.529152968757790720f, -0.848526449590592650f, 0.528990256122106040f, + -0.848627897802015860f, + 0.528827524036961980f, -0.848729314811817010f, 0.528664772508341540f, + -0.848830700616267530f, + 0.528502001542228480f, -0.848932055211639610f, 0.528339211144607690f, + -0.849033378594206690f, + 0.528176401321464370f, -0.849134670760243630f, 0.528013572078784740f, + -0.849235931706025960f, + 0.527850723422555460f, -0.849337161427830670f, 0.527687855358763720f, + -0.849438359921935950f, + 0.527524967893398200f, -0.849539527184620890f, 0.527362061032447430f, + -0.849640663212165910f, + 0.527199134781901390f, -0.849741768000852440f, 0.527036189147750190f, + -0.849842841546963210f, + 0.526873224135984700f, -0.849943883846782210f, 0.526710239752597010f, + -0.850044894896594070f, + 0.526547236003579330f, -0.850145874692685210f, 0.526384212894925210f, + -0.850246823231342710f, + 0.526221170432628170f, -0.850347740508854980f, 0.526058108622682760f, + -0.850448626521511650f, + 0.525895027471084740f, -0.850549481265603370f, 0.525731926983829640f, + -0.850650304737422200f, + 0.525568807166914680f, -0.850751096933260790f, 0.525405668026336810f, + -0.850851857849413640f, + 0.525242509568094710f, -0.850952587482175730f, 0.525079331798186890f, + -0.851053285827843790f, + 0.524916134722612890f, -0.851153952882715340f, 0.524752918347373360f, + -0.851254588643089120f, + 0.524589682678468840f, -0.851355193105265200f, 0.524426427721901510f, + -0.851455766265544310f, + 0.524263153483673470f, -0.851556308120228870f, 0.524099859969787810f, + -0.851656818665622370f, + 0.523936547186248600f, -0.851757297898029120f, 0.523773215139060170f, + -0.851857745813754840f, + 0.523609863834228030f, -0.851958162409106380f, 0.523446493277757940f, + -0.852058547680391580f, + 0.523283103475656430f, -0.852158901623919830f, 0.523119694433931250f, + -0.852259224236001090f, + 0.522956266158590140f, -0.852359515512947090f, 0.522792818655642200f, + -0.852459775451070100f, + 0.522629351931096720f, -0.852560004046683970f, 0.522465865990963900f, + -0.852660201296103760f, + 0.522302360841254700f, -0.852760367195645300f, 0.522138836487980650f, + -0.852860501741625860f, + 0.521975292937154390f, -0.852960604930363630f, 0.521811730194788550f, + -0.853060676758178320f, + 0.521648148266897090f, -0.853160717221390420f, 0.521484547159494550f, + -0.853260726316321770f, + 0.521320926878595550f, -0.853360704039295430f, 0.521157287430216610f, + -0.853460650386635320f, + 0.520993628820373810f, -0.853560565354666840f, 0.520829951055084780f, + -0.853660448939716270f, + 0.520666254140367270f, -0.853760301138111300f, 0.520502538082239790f, + -0.853860121946180660f, + 0.520338802886721960f, -0.853959911360254060f, 0.520175048559833760f, + -0.854059669376662780f, + 0.520011275107596040f, -0.854159395991738730f, 0.519847482536030300f, + -0.854259091201815420f, + 0.519683670851158520f, -0.854358755003227440f, 0.519519840059003870f, + -0.854458387392310060f, + 0.519355990165589530f, -0.854557988365400530f, 0.519192121176940360f, + -0.854657557918836460f, + 0.519028233099080970f, -0.854757096048957110f, 0.518864325938037000f, + -0.854856602752102850f, + 0.518700399699835170f, -0.854956078024614820f, 0.518536454390502110f, + -0.855055521862835950f, + 0.518372490016066220f, -0.855154934263109620f, 0.518208506582555460f, + -0.855254315221781080f, + 0.518044504095999340f, -0.855353664735196030f, 0.517880482562427800f, + -0.855452982799701830f, + 0.517716441987871150f, -0.855552269411646970f, 0.517552382378360990f, + -0.855651524567380690f, + 0.517388303739929060f, -0.855750748263253920f, 0.517224206078608310f, + -0.855849940495618240f, + 0.517060089400432130f, -0.855949101260826790f, 0.516895953711434260f, + -0.856048230555233820f, + 0.516731799017649980f, -0.856147328375194470f, 0.516567625325114350f, + -0.856246394717065210f, + 0.516403432639863990f, -0.856345429577203610f, 0.516239220967935620f, + -0.856444432951968480f, + 0.516074990315366630f, -0.856543404837719960f, 0.515910740688195650f, + -0.856642345230818720f, + 0.515746472092461380f, -0.856741254127627470f, 0.515582184534203790f, + -0.856840131524509220f, + 0.515417878019463150f, -0.856938977417828650f, 0.515253552554280290f, + -0.857037791803951680f, + 0.515089208144697270f, -0.857136574679244870f, 0.514924844796756490f, + -0.857235326040076460f, + 0.514760462516501200f, -0.857334045882815590f, 0.514596061309975040f, + -0.857432734203832700f, + 0.514431641183222930f, -0.857531390999499040f, 0.514267202142289830f, + -0.857630016266187620f, + 0.514102744193221660f, -0.857728610000272120f, 0.513938267342065490f, + -0.857827172198127320f, + 0.513773771594868030f, -0.857925702856129790f, 0.513609256957677900f, + -0.858024201970656540f, + 0.513444723436543570f, -0.858122669538086020f, 0.513280171037514330f, + -0.858221105554798250f, + 0.513115599766640560f, -0.858319510017173440f, 0.512951009629972860f, + -0.858417882921594040f, + 0.512786400633563070f, -0.858516224264442740f, 0.512621772783463100f, + -0.858614534042104080f, + 0.512457126085725800f, -0.858712812250963520f, 0.512292460546404980f, + -0.858811058887407500f, + 0.512127776171554690f, -0.858909273947823900f, 0.511963072967230200f, + -0.859007457428601410f, + 0.511798350939487000f, -0.859105609326130340f, 0.511633610094381350f, + -0.859203729636801920f, + 0.511468850437970520f, -0.859301818357008360f, 0.511304071976311890f, + -0.859399875483143450f, + 0.511139274715464390f, -0.859497901011601620f, 0.510974458661486720f, + -0.859595894938779080f, + 0.510809623820439040f, -0.859693857261072610f, 0.510644770198381730f, + -0.859791787974880540f, + 0.510479897801375700f, -0.859889687076602290f, 0.510315006635483350f, + -0.859987554562638200f, + 0.510150096706766700f, -0.860085390429390140f, 0.509985168021289570f, + -0.860183194673260880f, + 0.509820220585115560f, -0.860280967290654510f, 0.509655254404309250f, + -0.860378708277976130f, + 0.509490269484936360f, -0.860476417631632070f, 0.509325265833062480f, + -0.860574095348029980f, + 0.509160243454754750f, -0.860671741423578380f, 0.508995202356080310f, + -0.860769355854687060f, + 0.508830142543106990f, -0.860866938637767310f, 0.508665064021904260f, + -0.860964489769230900f, + 0.508499966798540810f, -0.861062009245491480f, 0.508334850879087470f, + -0.861159497062963350f, + 0.508169716269614710f, -0.861256953218062060f, 0.508004562976194010f, + -0.861354377707204800f, + 0.507839391004897940f, -0.861451770526809210f, 0.507674200361798890f, + -0.861549131673294720f, + 0.507508991052970870f, -0.861646461143081300f, 0.507343763084487920f, + -0.861743758932590700f, + 0.507178516462425290f, -0.861841025038245330f, 0.507013251192858340f, + -0.861938259456469180f, + 0.506847967281863320f, -0.862035462183687210f, 0.506682664735517600f, + -0.862132633216325380f, + 0.506517343559898530f, -0.862229772550811240f, 0.506352003761084800f, + -0.862326880183573060f, + 0.506186645345155450f, -0.862423956111040500f, 0.506021268318189830f, + -0.862521000329644520f, + 0.505855872686268860f, -0.862618012835816740f, 0.505690458455473340f, + -0.862714993625990690f, + 0.505525025631885510f, -0.862811942696600330f, 0.505359574221587390f, + -0.862908860044081290f, + 0.505194104230662240f, -0.863005745664870210f, 0.505028615665194300f, + -0.863102599555404800f, + 0.504863108531267480f, -0.863199421712124160f, 0.504697582834967680f, + -0.863296212131468230f, + 0.504532038582380380f, -0.863392970809878310f, 0.504366475779592150f, + -0.863489697743797140f, + 0.504200894432690560f, -0.863586392929667990f, 0.504035294547763080f, + -0.863683056363935940f, + 0.503869676130898950f, -0.863779688043046610f, 0.503704039188186960f, + -0.863876287963447510f, + 0.503538383725717580f, -0.863972856121586700f, 0.503372709749581150f, + -0.864069392513913680f, + 0.503207017265869030f, -0.864165897136879300f, 0.503041306280673450f, + -0.864262369986934950f, + 0.502875576800086880f, -0.864358811060534030f, 0.502709828830203100f, + -0.864455220354130250f, + 0.502544062377115800f, -0.864551597864179230f, 0.502378277446919870f, + -0.864647943587137480f, + 0.502212474045710900f, -0.864744257519462380f, 0.502046652179584660f, + -0.864840539657612980f, + 0.501880811854638400f, -0.864936789998049020f, 0.501714953076969230f, + -0.865033008537231750f, + 0.501549075852675390f, -0.865129195271623690f, 0.501383180187855880f, + -0.865225350197688090f, + 0.501217266088609950f, -0.865321473311889800f, 0.501051333561038040f, + -0.865417564610694410f, + 0.500885382611240940f, -0.865513624090568980f, 0.500719413245319880f, + -0.865609651747981880f, + 0.500553425469377640f, -0.865705647579402270f, 0.500387419289516580f, + -0.865801611581300760f, + 0.500221394711840680f, -0.865897543750148820f, 0.500055351742453860f, + -0.865993444082419520f, + 0.499889290387461380f, -0.866089312574586770f, 0.499723210652968710f, + -0.866185149223125730f, + 0.499557112545081890f, -0.866280954024512990f, 0.499390996069908220f, + -0.866376726975225830f, + 0.499224861233555030f, -0.866472468071743050f, 0.499058708042130930f, + -0.866568177310544360f, + 0.498892536501744750f, -0.866663854688111020f, 0.498726346618505960f, + -0.866759500200925290f, + 0.498560138398525200f, -0.866855113845470320f, 0.498393911847913150f, + -0.866950695618231020f, + 0.498227666972781870f, -0.867046245515692650f, 0.498061403779243520f, + -0.867141763534342360f, + 0.497895122273410930f, -0.867237249670668400f, 0.497728822461398100f, + -0.867332703921159690f, + 0.497562504349319090f, -0.867428126282306920f, 0.497396167943289340f, + -0.867523516750601460f, + 0.497229813249424340f, -0.867618875322536230f, 0.497063440273840310f, + -0.867714201994605140f, + 0.496897049022654640f, -0.867809496763303210f, 0.496730639501984710f, + -0.867904759625126920f, + 0.496564211717949340f, -0.867999990576573400f, 0.496397765676667160f, + -0.868095189614141670f, + 0.496231301384258310f, -0.868190356734331310f, 0.496064818846843060f, + -0.868285491933643240f, + 0.495898318070542240f, -0.868380595208579800f, 0.495731799061478020f, + -0.868475666555644120f, + 0.495565261825772490f, -0.868570705971340900f, 0.495398706369549080f, + -0.868665713452175580f, + 0.495232132698931350f, -0.868760688994655190f, 0.495065540820043610f, + -0.868855632595287750f, + 0.494898930739011310f, -0.868950544250582380f, 0.494732302461959820f, + -0.869045423957049530f, + 0.494565655995016010f, -0.869140271711200560f, 0.494398991344306760f, + -0.869235087509548250f, + 0.494232308515959730f, -0.869329871348606730f, 0.494065607516103730f, + -0.869424623224890780f, + 0.493898888350867430f, -0.869519343134916970f, 0.493732151026381070f, + -0.869614031075202300f, + 0.493565395548774880f, -0.869708687042265560f, 0.493398621924179830f, + -0.869803311032626650f, + 0.493231830158728070f, -0.869897903042806340f, 0.493065020258551650f, + -0.869992463069326870f, + 0.492898192229784090f, -0.870086991108711350f, 0.492731346078558840f, + -0.870181487157484560f, + 0.492564481811010650f, -0.870275951212171830f, 0.492397599433274550f, + -0.870370383269300160f, + 0.492230698951486080f, -0.870464783325397670f, 0.492063780371782060f, + -0.870559151376993250f, + 0.491896843700299240f, -0.870653487420617540f, 0.491729888943175820f, + -0.870747791452801790f, + 0.491562916106550060f, -0.870842063470078860f, 0.491395925196560830f, + -0.870936303468982760f, + 0.491228916219348330f, -0.871030511446048260f, 0.491061889181052590f, + -0.871124687397811900f, + 0.490894844087815140f, -0.871218831320810900f, 0.490727780945777570f, + -0.871312943211583920f, + 0.490560699761082080f, -0.871407023066670950f, 0.490393600539872130f, + -0.871501070882612530f, + 0.490226483288291100f, -0.871595086655951090f, 0.490059348012483910f, + -0.871689070383229740f, + 0.489892194718595300f, -0.871783022060993010f, 0.489725023412770970f, + -0.871876941685786890f, + 0.489557834101157550f, -0.871970829254157700f, 0.489390626789901920f, + -0.872064684762653970f, + 0.489223401485152030f, -0.872158508207824480f, 0.489056158193055980f, + -0.872252299586219860f, + 0.488888896919763230f, -0.872346058894391540f, 0.488721617671423250f, + -0.872439786128892280f, + 0.488554320454186230f, -0.872533481286276060f, 0.488387005274203590f, + -0.872627144363097960f, + 0.488219672137626740f, -0.872720775355914300f, 0.488052321050608310f, + -0.872814374261282390f, + 0.487884952019301210f, -0.872907941075760970f, 0.487717565049858860f, + -0.873001475795909920f, + 0.487550160148436050f, -0.873094978418290090f, 0.487382737321187310f, + -0.873188448939463790f, + 0.487215296574268820f, -0.873281887355994210f, 0.487047837913836550f, + -0.873375293664446000f, + 0.486880361346047400f, -0.873468667861384880f, 0.486712866877059340f, + -0.873562009943377740f, + 0.486545354513030270f, -0.873655319906992630f, 0.486377824260119500f, + -0.873748597748798870f, + 0.486210276124486530f, -0.873841843465366750f, 0.486042710112291390f, + -0.873935057053268130f, + 0.485875126229695420f, -0.874028238509075630f, 0.485707524482859750f, + -0.874121387829363330f, + 0.485539904877947020f, -0.874214505010706300f, 0.485372267421119770f, + -0.874307590049680950f, + 0.485204612118541880f, -0.874400642942864790f, 0.485036938976377450f, + -0.874493663686836450f, + 0.484869248000791120f, -0.874586652278176110f, 0.484701539197948730f, + -0.874679608713464510f, + 0.484533812574016120f, -0.874772532989284150f, 0.484366068135160480f, + -0.874865425102218210f, + 0.484198305887549140f, -0.874958285048851540f, 0.484030525837350010f, + -0.875051112825769970f, + 0.483862727990732320f, -0.875143908429560250f, 0.483694912353865080f, + -0.875236671856810870f, + 0.483527078932918740f, -0.875329403104110780f, 0.483359227734063980f, + -0.875422102168050830f, + 0.483191358763471910f, -0.875514769045222740f, 0.483023472027315050f, + -0.875607403732219240f, + 0.482855567531765670f, -0.875700006225634600f, 0.482687645282997510f, + -0.875792576522063880f, + 0.482519705287184520f, -0.875885114618103700f, 0.482351747550501030f, + -0.875977620510351660f, + 0.482183772079122830f, -0.876070094195406600f, 0.482015778879225530f, + -0.876162535669868460f, + 0.481847767956986080f, -0.876254944930338400f, 0.481679739318581490f, + -0.876347321973419020f, + 0.481511692970189920f, -0.876439666795713610f, 0.481343628917989870f, + -0.876531979393827100f, + 0.481175547168160360f, -0.876624259764365310f, 0.481007447726881640f, + -0.876716507903935400f, + 0.480839330600333900f, -0.876808723809145760f, 0.480671195794698690f, + -0.876900907476605650f, + 0.480503043316157670f, -0.876993058902925780f, 0.480334873170893070f, + -0.877085178084718310f, + 0.480166685365088440f, -0.877177265018595940f, 0.479998479904927220f, + -0.877269319701173170f, + 0.479830256796594250f, -0.877361342129065140f, 0.479662016046274340f, + -0.877453332298888560f, + 0.479493757660153060f, -0.877545290207261240f, 0.479325481644417130f, + -0.877637215850802120f, + 0.479157188005253310f, -0.877729109226131570f, 0.478988876748849550f, + -0.877820970329870500f, + 0.478820547881394050f, -0.877912799158641730f, 0.478652201409075550f, + -0.878004595709069080f, + 0.478483837338084080f, -0.878096359977777130f, 0.478315455674609480f, + -0.878188091961392250f, + 0.478147056424843120f, -0.878279791656541460f, 0.477978639594976110f, + -0.878371459059853590f, + 0.477810205191201040f, -0.878463094167957870f, 0.477641753219710590f, + -0.878554696977485340f, + 0.477473283686698060f, -0.878646267485068130f, 0.477304796598358010f, + -0.878737805687339280f, + 0.477136291960884750f, -0.878829311580933360f, 0.476967769780474230f, + -0.878920785162485840f, + 0.476799230063322250f, -0.879012226428633410f, 0.476630672815625380f, + -0.879103635376014330f, + 0.476462098043581310f, -0.879195012001267370f, 0.476293505753387750f, + -0.879286356301033250f, + 0.476124895951243630f, -0.879377668271953180f, 0.475956268643348220f, + -0.879468947910670100f, + 0.475787623835901120f, -0.879560195213827890f, 0.475618961535103410f, + -0.879651410178071470f, + 0.475450281747155870f, -0.879742592800047410f, 0.475281584478260800f, + -0.879833743076402940f, + 0.475112869734620470f, -0.879924861003786860f, 0.474944137522437860f, + -0.880015946578848960f, + 0.474775387847917230f, -0.880106999798240360f, 0.474606620717262560f, + -0.880198020658613190f, + 0.474437836136679340f, -0.880289009156620890f, 0.474269034112372920f, + -0.880379965288918260f, + 0.474100214650550020f, -0.880470889052160750f, 0.473931377757417560f, + -0.880561780443005590f, + 0.473762523439182850f, -0.880652639458111010f, 0.473593651702054640f, + -0.880743466094136230f, + 0.473424762552241530f, -0.880834260347742040f, 0.473255855995953380f, + -0.880925022215589880f, + 0.473086932039400220f, -0.881015751694342760f, 0.472917990688792760f, + -0.881106448780665130f, + 0.472749031950342900f, -0.881197113471221980f, 0.472580055830262250f, + -0.881287745762680100f, + 0.472411062334764100f, -0.881378345651706810f, 0.472242051470061650f, + -0.881468913134971330f, + 0.472073023242368660f, -0.881559448209143780f, 0.471903977657900320f, + -0.881649950870895260f, + 0.471734914722871430f, -0.881740421116898320f, 0.471565834443498480f, + -0.881830858943826620f, + 0.471396736825997810f, -0.881921264348354940f, 0.471227621876586400f, + -0.882011637327159590f, + 0.471058489601482610f, -0.882101977876917580f, 0.470889340006904520f, + -0.882192285994307430f, + 0.470720173099071710f, -0.882282561676008600f, 0.470550988884203490f, + -0.882372804918702290f, + 0.470381787368520710f, -0.882463015719070040f, 0.470212568558244280f, + -0.882553194073795400f, + 0.470043332459595620f, -0.882643339979562790f, 0.469874079078797470f, + -0.882733453433057540f, + 0.469704808422072460f, -0.882823534430966730f, 0.469535520495644510f, + -0.882913582969978020f, + 0.469366215305737630f, -0.883003599046780720f, 0.469196892858576630f, + -0.883093582658065370f, + 0.469027553160387240f, -0.883183533800523280f, 0.468858196217395330f, + -0.883273452470847430f, + 0.468688822035827960f, -0.883363338665731580f, 0.468519430621912420f, + -0.883453192381870920f, + 0.468350021981876530f, -0.883543013615961880f, 0.468180596121949400f, + -0.883632802364701760f, + 0.468011153048359830f, -0.883722558624789660f, 0.467841692767338220f, + -0.883812282392925090f, + 0.467672215285114710f, -0.883901973665809470f, 0.467502720607920920f, + -0.883991632440144890f, + 0.467333208741988530f, -0.884081258712634990f, 0.467163679693549770f, + -0.884170852479984500f, + 0.466994133468838110f, -0.884260413738899080f, 0.466824570074086950f, + -0.884349942486086120f, + 0.466654989515530970f, -0.884439438718253700f, 0.466485391799405010f, + -0.884528902432111350f, + 0.466315776931944480f, -0.884618333624369920f, 0.466146144919386000f, + -0.884707732291740930f, + 0.465976495767966130f, -0.884797098430937790f, 0.465806829483922770f, + -0.884886432038674560f, + 0.465637146073493770f, -0.884975733111666660f, 0.465467445542917800f, + -0.885065001646630930f, + 0.465297727898434650f, -0.885154237640285110f, 0.465127993146283950f, + -0.885243441089348270f, + 0.464958241292706740f, -0.885332611990540590f, 0.464788472343944160f, + -0.885421750340583570f, + 0.464618686306237820f, -0.885510856136199950f, 0.464448883185830770f, + -0.885599929374113360f, + 0.464279062988965760f, -0.885688970051048960f, 0.464109225721887010f, + -0.885777978163732940f, + 0.463939371390838460f, -0.885866953708892790f, 0.463769500002065680f, + -0.885955896683257030f, + 0.463599611561814120f, -0.886044807083555490f, 0.463429706076329880f, + -0.886133684906519340f, + 0.463259783551860260f, -0.886222530148880640f, 0.463089843994652470f, + -0.886311342807372890f, + 0.462919887410955130f, -0.886400122878730490f, 0.462749913807016850f, + -0.886488870359689600f, + 0.462579923189086810f, -0.886577585246987040f, 0.462409915563415540f, + -0.886666267537360890f, + 0.462239890936253280f, -0.886754917227550950f, 0.462069849313851810f, + -0.886843534314297300f, + 0.461899790702462840f, -0.886932118794342080f, 0.461729715108338770f, + -0.887020670664428360f, + 0.461559622537733190f, -0.887109189921300060f, 0.461389512996899450f, + -0.887197676561702900f, + 0.461219386492092430f, -0.887286130582383150f, 0.461049243029567010f, + -0.887374551980088740f, + 0.460879082615578690f, -0.887462940751568840f, 0.460708905256384190f, + -0.887551296893573370f, + 0.460538710958240010f, -0.887639620402853930f, 0.460368499727404070f, + -0.887727911276163020f, + 0.460198271570134270f, -0.887816169510254550f, 0.460028026492689700f, + -0.887904395101883240f, + 0.459857764501329650f, -0.887992588047805560f, 0.459687485602313870f, + -0.888080748344778900f, + 0.459517189801903590f, -0.888168875989561620f, 0.459346877106359570f, + -0.888256970978913870f, + 0.459176547521944150f, -0.888345033309596240f, 0.459006201054919680f, + -0.888433062978371320f, + 0.458835837711549120f, -0.888521059982002260f, 0.458665457498096670f, + -0.888609024317253750f, + 0.458495060420826220f, -0.888696955980891710f, 0.458324646486003300f, + -0.888784854969682850f, + 0.458154215699893230f, -0.888872721280395520f, 0.457983768068762180f, + -0.888960554909799310f, + 0.457813303598877290f, -0.889048355854664570f, 0.457642822296505770f, + -0.889136124111763240f, + 0.457472324167916110f, -0.889223859677868210f, 0.457301809219376800f, + -0.889311562549753850f, + 0.457131277457156980f, -0.889399232724195520f, 0.456960728887527030f, + -0.889486870197969790f, + 0.456790163516757220f, -0.889574474967854580f, 0.456619581351118960f, + -0.889662047030628790f, + 0.456448982396883860f, -0.889749586383072890f, 0.456278366660324670f, + -0.889837093021967900f, + 0.456107734147714220f, -0.889924566944096720f, 0.455937084865326030f, + -0.890012008146243260f, + 0.455766418819434750f, -0.890099416625192210f, 0.455595736016314920f, + -0.890186792377730240f, + 0.455425036462242420f, -0.890274135400644480f, 0.455254320163493210f, + -0.890361445690723730f, + 0.455083587126343840f, -0.890448723244757880f, 0.454912837357072050f, + -0.890535968059537830f, + 0.454742070861955450f, -0.890623180131855930f, 0.454571287647273000f, + -0.890710359458505520f, + 0.454400487719303750f, -0.890797506036281490f, 0.454229671084327320f, + -0.890884619861979530f, + 0.454058837748624540f, -0.890971700932396750f, 0.453887987718476050f, + -0.891058749244331590f, + 0.453717121000163930f, -0.891145764794583180f, 0.453546237599970260f, + -0.891232747579952520f, + 0.453375337524177750f, -0.891319697597241390f, 0.453204420779070300f, + -0.891406614843252900f, + 0.453033487370931580f, -0.891493499314791380f, 0.452862537306046810f, + -0.891580351008662290f, + 0.452691570590700860f, -0.891667169921672390f, 0.452520587231180100f, + -0.891753956050629460f, + 0.452349587233771000f, -0.891840709392342720f, 0.452178570604760410f, + -0.891927429943622510f, + 0.452007537350436530f, -0.892014117701280360f, 0.451836487477087430f, + -0.892100772662129170f, + 0.451665420991002540f, -0.892187394822982480f, 0.451494337898471210f, + -0.892273984180655730f, + 0.451323238205783520f, -0.892360540731965360f, 0.451152121919230710f, + -0.892447064473728680f, + 0.450980989045103810f, -0.892533555402764690f, 0.450809839589695340f, + -0.892620013515893040f, + 0.450638673559297760f, -0.892706438809935280f, 0.450467490960204110f, + -0.892792831281713610f, + 0.450296291798708730f, -0.892879190928051680f, 0.450125076081105750f, + -0.892965517745774260f, + 0.449953843813690580f, -0.893051811731707450f, 0.449782595002758860f, + -0.893138072882678210f, + 0.449611329654606600f, -0.893224301195515320f, 0.449440047775531260f, + -0.893310496667048090f, + 0.449268749371829920f, -0.893396659294107610f, 0.449097434449801100f, + -0.893482789073525850f, + 0.448926103015743260f, -0.893568886002136020f, 0.448754755075956020f, + -0.893654950076772430f, + 0.448583390636739300f, -0.893740981294271040f, 0.448412009704393430f, + -0.893826979651468620f, + 0.448240612285220000f, -0.893912945145203250f, 0.448069198385520340f, + -0.893998877772314240f, + 0.447897768011597310f, -0.894084777529641990f, 0.447726321169753750f, + -0.894170644414028270f, + 0.447554857866293010f, -0.894256478422316040f, 0.447383378107519710f, + -0.894342279551349480f, + 0.447211881899738260f, -0.894428047797973800f, 0.447040369249254500f, + -0.894513783159035620f, + 0.446868840162374330f, -0.894599485631382580f, 0.446697294645404090f, + -0.894685155211863980f, + 0.446525732704651400f, -0.894770791897329550f, 0.446354154346423840f, + -0.894856395684630930f, + 0.446182559577030120f, -0.894941966570620750f, 0.446010948402779110f, + -0.895027504552152630f, + 0.445839320829980350f, -0.895113009626081760f, 0.445667676864944350f, + -0.895198481789264200f, + 0.445496016513981740f, -0.895283921038557580f, 0.445324339783404240f, + -0.895369327370820310f, + 0.445152646679523590f, -0.895454700782912450f, 0.444980937208652780f, + -0.895540041271694840f, + 0.444809211377105000f, -0.895625348834030000f, 0.444637469191193790f, + -0.895710623466781320f, + 0.444465710657234110f, -0.895795865166813420f, 0.444293935781540580f, + -0.895881073930992370f, + 0.444122144570429260f, -0.895966249756185110f, 0.443950337030216250f, + -0.896051392639260040f, + 0.443778513167218220f, -0.896136502577086770f, 0.443606672987753080f, + -0.896221579566535920f, + 0.443434816498138430f, -0.896306623604479660f, 0.443262943704693380f, + -0.896391634687790820f, + 0.443091054613736990f, -0.896476612813344010f, 0.442919149231588980f, + -0.896561557978014960f, + 0.442747227564570130f, -0.896646470178680150f, 0.442575289619001170f, + -0.896731349412217880f, + 0.442403335401204130f, -0.896816195675507190f, 0.442231364917501090f, + -0.896901008965428680f, + 0.442059378174214760f, -0.896985789278863970f, 0.441887375177668960f, + -0.897070536612695870f, + 0.441715355934187310f, -0.897155250963808550f, 0.441543320450094920f, + -0.897239932329087050f, + 0.441371268731716620f, -0.897324580705418320f, 0.441199200785378660f, + -0.897409196089689720f, + 0.441027116617407340f, -0.897493778478790190f, 0.440855016234129430f, + -0.897578327869610230f, + 0.440682899641873020f, -0.897662844259040750f, 0.440510766846965880f, + -0.897747327643974690f, + 0.440338617855737300f, -0.897831778021305650f, 0.440166452674516480f, + -0.897916195387928550f, + 0.439994271309633260f, -0.898000579740739880f, 0.439822073767418610f, + -0.898084931076636780f, + 0.439649860054203420f, -0.898169249392518080f, 0.439477630176319860f, + -0.898253534685283570f, + 0.439305384140100060f, -0.898337786951834190f, 0.439133121951876930f, + -0.898422006189072530f, + 0.438960843617984430f, -0.898506192393901840f, 0.438788549144756290f, + -0.898590345563227030f, + 0.438616238538527710f, -0.898674465693953820f, 0.438443911805633860f, + -0.898758552782989440f, + 0.438271568952410480f, -0.898842606827242260f, 0.438099209985194580f, + -0.898926627823621870f, + 0.437926834910322860f, -0.899010615769039070f, 0.437754443734133470f, + -0.899094570660405770f, + 0.437582036462964340f, -0.899178492494635330f, 0.437409613103154850f, + -0.899262381268642000f, + 0.437237173661044200f, -0.899346236979341460f, 0.437064718142972370f, + -0.899430059623650860f, + 0.436892246555280470f, -0.899513849198487870f, 0.436719758904309310f, + -0.899597605700772180f, + 0.436547255196401250f, -0.899681329127423930f, 0.436374735437898510f, + -0.899765019475365020f, + 0.436202199635143950f, -0.899848676741518580f, 0.436029647794481670f, + -0.899932300922808400f, + 0.435857079922255470f, -0.900015892016160280f, 0.435684496024810520f, + -0.900099450018500340f, + 0.435511896108492170f, -0.900182974926756700f, 0.435339280179646070f, + -0.900266466737858480f, + 0.435166648244619370f, -0.900349925448735600f, 0.434994000309758710f, + -0.900433351056319830f, + 0.434821336381412350f, -0.900516743557543520f, 0.434648656465928430f, + -0.900600102949340790f, + 0.434475960569655710f, -0.900683429228646860f, 0.434303248698944100f, + -0.900766722392397860f, + 0.434130520860143310f, -0.900849982437531450f, 0.433957777059604480f, + -0.900933209360986200f, + 0.433785017303678520f, -0.901016403159702330f, 0.433612241598717640f, + -0.901099563830620950f, + 0.433439449951074200f, -0.901182691370684410f, 0.433266642367100940f, + -0.901265785776836580f, + 0.433093818853152010f, -0.901348847046022030f, 0.432920979415581220f, + -0.901431875175186970f, + 0.432748124060743760f, -0.901514870161278630f, 0.432575252794994810f, + -0.901597832001245660f, + 0.432402365624690140f, -0.901680760692037730f, 0.432229462556186770f, + -0.901763656230605610f, + 0.432056543595841450f, -0.901846518613901860f, 0.431883608750012300f, + -0.901929347838879350f, + 0.431710658025057370f, -0.902012143902493070f, 0.431537691427335500f, + -0.902094906801698900f, + 0.431364708963206440f, -0.902177636533453510f, 0.431191710639030000f, + -0.902260333094715540f, + 0.431018696461167080f, -0.902342996482444200f, 0.430845666435978820f, + -0.902425626693600270f, + 0.430672620569826860f, -0.902508223725145830f, 0.430499558869073930f, + -0.902590787574043870f, + 0.430326481340082610f, -0.902673318237258830f, 0.430153387989216930f, + -0.902755815711756120f, + 0.429980278822840570f, -0.902838279994502830f, 0.429807153847318770f, + -0.902920711082466630f, + 0.429634013069016500f, -0.903003108972617040f, 0.429460856494299490f, + -0.903085473661924600f, + 0.429287684129534720f, -0.903167805147360610f, 0.429114495981088690f, + -0.903250103425898400f, + 0.428941292055329550f, -0.903332368494511820f, 0.428768072358625240f, + -0.903414600350176290f, + 0.428594836897344400f, -0.903496798989868450f, 0.428421585677856760f, + -0.903578964410565950f, + 0.428248318706531910f, -0.903661096609247980f, 0.428075035989740780f, + -0.903743195582894620f, + 0.427901737533854240f, -0.903825261328487390f, 0.427728423345243860f, + -0.903907293843009050f, + 0.427555093430282200f, -0.903989293123443340f, 0.427381747795341770f, + -0.904071259166775440f, + 0.427208386446796370f, -0.904153191969991670f, 0.427035009391019790f, + -0.904235091530079750f, + 0.426861616634386490f, -0.904316957844028320f, 0.426688208183271970f, + -0.904398790908827350f, + 0.426514784044051520f, -0.904480590721468250f, 0.426341344223101880f, + -0.904562357278943190f, + 0.426167888726799620f, -0.904644090578246240f, 0.425994417561522450f, + -0.904725790616371930f, + 0.425820930733648300f, -0.904807457390316540f, 0.425647428249555590f, + -0.904889090897077470f, + 0.425473910115623910f, -0.904970691133653250f, 0.425300376338232590f, + -0.905052258097043590f, + 0.425126826923762410f, -0.905133791784249580f, 0.424953261878594060f, + -0.905215292192273480f, + 0.424779681209108810f, -0.905296759318118820f, 0.424606084921689220f, + -0.905378193158789980f, + 0.424432473022717420f, -0.905459593711293250f, 0.424258845518577010f, + -0.905540960972635480f, + 0.424085202415651670f, -0.905622294939825160f, 0.423911543720325580f, + -0.905703595609872010f, + 0.423737869438983950f, -0.905784862979786440f, 0.423564179578011960f, + -0.905866097046580940f, + 0.423390474143796100f, -0.905947297807268460f, 0.423216753142722780f, + -0.906028465258863490f, + 0.423043016581179100f, -0.906109599398381980f, 0.422869264465553170f, + -0.906190700222840540f, + 0.422695496802232950f, -0.906271767729257660f, 0.422521713597607870f, + -0.906352801914652280f, + 0.422347914858067000f, -0.906433802776045460f, 0.422174100590000820f, + -0.906514770310458800f, + 0.422000270799799790f, -0.906595704514915330f, 0.421826425493854910f, + -0.906676605386439460f, + 0.421652564678558380f, -0.906757472922056550f, 0.421478688360302220f, + -0.906838307118793540f, + 0.421304796545479700f, -0.906919107973678030f, 0.421130889240484140f, + -0.906999875483739610f, + 0.420956966451709440f, -0.907080609646008450f, 0.420783028185550630f, + -0.907161310457516250f, + 0.420609074448402510f, -0.907241977915295930f, 0.420435105246661220f, + -0.907322612016381310f, + 0.420261120586723050f, -0.907403212757808000f, 0.420087120474984590f, + -0.907483780136612570f, + 0.419913104917843730f, -0.907564314149832520f, 0.419739073921698180f, + -0.907644814794507090f, + 0.419565027492946940f, -0.907725282067676330f, 0.419390965637989050f, + -0.907805715966381820f, + 0.419216888363223960f, -0.907886116487666150f, 0.419042795675052480f, + -0.907966483628573240f, + 0.418868687579875110f, -0.908046817386148340f, 0.418694564084093610f, + -0.908127117757437600f, + 0.418520425194109700f, -0.908207384739488700f, 0.418346270916326310f, + -0.908287618329350450f, + 0.418172101257146430f, -0.908367818524072780f, 0.417997916222973550f, + -0.908447985320707250f, + 0.417823715820212380f, -0.908528118716306120f, 0.417649500055267410f, + -0.908608218707923190f, + 0.417475268934544340f, -0.908688285292613360f, 0.417301022464449060f, + -0.908768318467432780f, + 0.417126760651387870f, -0.908848318229439120f, 0.416952483501768280f, + -0.908928284575690640f, + 0.416778191021997590f, -0.909008217503247450f, 0.416603883218484410f, + -0.909088117009170580f, + 0.416429560097637320f, -0.909167983090522270f, 0.416255221665865480f, + -0.909247815744366310f, + 0.416080867929579320f, -0.909327614967767260f, 0.415906498895188770f, + -0.909407380757791260f, + 0.415732114569105420f, -0.909487113111505430f, 0.415557714957740580f, + -0.909566812025978220f, + 0.415383300067506290f, -0.909646477498279540f, 0.415208869904815650f, + -0.909726109525480160f, + 0.415034424476081630f, -0.909805708104652220f, 0.414859963787718390f, + -0.909885273232869160f, + 0.414685487846140010f, -0.909964804907205660f, 0.414510996657761810f, + -0.910044303124737390f, + 0.414336490228999210f, -0.910123767882541570f, 0.414161968566268080f, + -0.910203199177696540f, + 0.413987431675985510f, -0.910282597007281760f, 0.413812879564568300f, + -0.910361961368377990f, + 0.413638312238434560f, -0.910441292258067140f, 0.413463729704002580f, + -0.910520589673432630f, + 0.413289131967690960f, -0.910599853611558930f, 0.413114519035919560f, + -0.910679084069531570f, + 0.412939890915108020f, -0.910758281044437570f, 0.412765247611677320f, + -0.910837444533365010f, + 0.412590589132048380f, -0.910916574533403240f, 0.412415915482642730f, + -0.910995671041643140f, + 0.412241226669883000f, -0.911074734055176250f, 0.412066522700191560f, + -0.911153763571095900f, + 0.411891803579992220f, -0.911232759586496190f, 0.411717069315708670f, + -0.911311722098472670f, + 0.411542319913765280f, -0.911390651104122320f, 0.411367555380587340f, + -0.911469546600543020f, + 0.411192775722600160f, -0.911548408584833990f, 0.411017980946230270f, + -0.911627237054095650f, + 0.410843171057903910f, -0.911706032005429880f, 0.410668346064048780f, + -0.911784793435939430f, + 0.410493505971092520f, -0.911863521342728520f, 0.410318650785463260f, + -0.911942215722902570f, + 0.410143780513590350f, -0.912020876573568230f, 0.409968895161902820f, + -0.912099503891833470f, + 0.409793994736831200f, -0.912178097674807060f, 0.409619079244805840f, + -0.912256657919599650f, + 0.409444148692257590f, -0.912335184623322750f, 0.409269203085618700f, + -0.912413677783089020f, + 0.409094242431320920f, -0.912492137396012650f, 0.408919266735797480f, + -0.912570563459208730f, + 0.408744276005481520f, -0.912648955969793900f, 0.408569270246806780f, + -0.912727314924885900f, + 0.408394249466208110f, -0.912805640321603500f, 0.408219213670120100f, + -0.912883932157067200f, + 0.408044162864978740f, -0.912962190428398100f, 0.407869097057219960f, + -0.913040415132719160f, + 0.407694016253280170f, -0.913118606267154130f, 0.407518920459597030f, + -0.913196763828828200f, + 0.407343809682607970f, -0.913274887814867760f, 0.407168683928751610f, + -0.913352978222400250f, + 0.406993543204466460f, -0.913431035048554720f, 0.406818387516192370f, + -0.913509058290461140f, + 0.406643216870369140f, -0.913587047945250810f, 0.406468031273437000f, + -0.913665004010056350f, + 0.406292830731837470f, -0.913742926482011390f, 0.406117615252011790f, + -0.913820815358251100f, + 0.405942384840402570f, -0.913898670635911680f, 0.405767139503452220f, + -0.913976492312130520f, + 0.405591879247603870f, -0.914054280384046460f, 0.405416604079301750f, + -0.914132034848799460f, + 0.405241314004989860f, -0.914209755703530690f, 0.405066009031113390f, + -0.914287442945382440f, + 0.404890689164117750f, -0.914365096571498450f, 0.404715354410448650f, + -0.914442716579023870f, + 0.404540004776553110f, -0.914520302965104450f, 0.404364640268877810f, + -0.914597855726887790f, + 0.404189260893870750f, -0.914675374861522390f, 0.404013866657980060f, + -0.914752860366158100f, + 0.403838457567654130f, -0.914830312237946090f, 0.403663033629342750f, + -0.914907730474038620f, + 0.403487594849495310f, -0.914985115071589310f, 0.403312141234562660f, + -0.915062466027752760f, + 0.403136672790995240f, -0.915139783339685260f, 0.402961189525244960f, + -0.915217067004543750f, + 0.402785691443763640f, -0.915294317019487050f, 0.402610178553003680f, + -0.915371533381674760f, + 0.402434650859418540f, -0.915448716088267830f, 0.402259108369461440f, + -0.915525865136428530f, + 0.402083551089587040f, -0.915602980523320230f, 0.401907979026249860f, + -0.915680062246107650f, + 0.401732392185905010f, -0.915757110301956720f, 0.401556790575008650f, + -0.915834124688034710f, + 0.401381174200016790f, -0.915911105401509880f, 0.401205543067386760f, + -0.915988052439551840f, + 0.401029897183575790f, -0.916064965799331610f, 0.400854236555041650f, + -0.916141845478021350f, + 0.400678561188243350f, -0.916218691472794110f, 0.400502871089639500f, + -0.916295503780824800f, + 0.400327166265690150f, -0.916372282399289140f, 0.400151446722855300f, + -0.916449027325364040f, + 0.399975712467595390f, -0.916525738556228100f, 0.399799963506372090f, + -0.916602416089060680f, + 0.399624199845646790f, -0.916679059921042700f, 0.399448421491882260f, + -0.916755670049355990f, + 0.399272628451540930f, -0.916832246471183890f, 0.399096820731086600f, + -0.916908789183710990f, + 0.398920998336983020f, -0.916985298184122890f, 0.398745161275694480f, + -0.917061773469606820f, + 0.398569309553686360f, -0.917138215037350710f, 0.398393443177423920f, + -0.917214622884544250f, + 0.398217562153373620f, -0.917290997008377910f, 0.398041666488001930f, + -0.917367337406043810f, + 0.397865756187775750f, -0.917443644074735220f, 0.397689831259163240f, + -0.917519917011646260f, + 0.397513891708632330f, -0.917596156213972950f, 0.397337937542652120f, + -0.917672361678911750f, + 0.397161968767691720f, -0.917748533403661250f, 0.396985985390220900f, + -0.917824671385420570f, + 0.396809987416710420f, -0.917900775621390390f, 0.396633974853630830f, + -0.917976846108772730f, + 0.396457947707453960f, -0.918052882844770380f, 0.396281905984651680f, + -0.918128885826587910f, + 0.396105849691696320f, -0.918204855051430900f, 0.395929778835061360f, + -0.918280790516506130f, + 0.395753693421220080f, -0.918356692219021720f, 0.395577593456646950f, + -0.918432560156186790f, + 0.395401478947816300f, -0.918508394325212250f, 0.395225349901203730f, + -0.918584194723309540f, + 0.395049206323284880f, -0.918659961347691900f, 0.394873048220535760f, + -0.918735694195573550f, + 0.394696875599433670f, -0.918811393264169940f, 0.394520688466455550f, + -0.918887058550697970f, + 0.394344486828079650f, -0.918962690052375630f, 0.394168270690784250f, + -0.919038287766421940f, + 0.393992040061048100f, -0.919113851690057770f, 0.393815794945351130f, + -0.919189381820504470f, + 0.393639535350172880f, -0.919264878154985250f, 0.393463261281994380f, + -0.919340340690724230f, + 0.393286972747296570f, -0.919415769424946960f, 0.393110669752560760f, + -0.919491164354880100f, + 0.392934352304269600f, -0.919566525477751530f, 0.392758020408905280f, + -0.919641852790790470f, + 0.392581674072951530f, -0.919717146291227360f, 0.392405313302891860f, + -0.919792405976293750f, + 0.392228938105210370f, -0.919867631843222950f, 0.392052548486392200f, + -0.919942823889248640f, + 0.391876144452922350f, -0.920017982111606570f, 0.391699726011287050f, + -0.920093106507533070f, + 0.391523293167972350f, -0.920168197074266450f, 0.391346845929465610f, + -0.920243253809045370f, + 0.391170384302253980f, -0.920318276709110480f, 0.390993908292825380f, + -0.920393265771703550f, + 0.390817417907668610f, -0.920468220994067110f, 0.390640913153272370f, + -0.920543142373445480f, + 0.390464394036126650f, -0.920618029907083860f, 0.390287860562721360f, + -0.920692883592229010f, + 0.390111312739546910f, -0.920767703426128790f, 0.389934750573094790f, + -0.920842489406032080f, + 0.389758174069856410f, -0.920917241529189520f, 0.389581583236324360f, + -0.920991959792852310f, + 0.389404978078991100f, -0.921066644194273530f, 0.389228358604349730f, + -0.921141294730707270f, + 0.389051724818894500f, -0.921215911399408730f, 0.388875076729119250f, + -0.921290494197634540f, + 0.388698414341519250f, -0.921365043122642340f, 0.388521737662589740f, + -0.921439558171691320f, + 0.388345046698826300f, -0.921514039342041900f, 0.388168341456725850f, + -0.921588486630955380f, + 0.387991621942784910f, -0.921662900035694730f, 0.387814888163501290f, + -0.921737279553523800f, + 0.387638140125372680f, -0.921811625181708120f, 0.387461377834897920f, + -0.921885936917513970f, + 0.387284601298575890f, -0.921960214758209110f, 0.387107810522905990f, + -0.922034458701062820f, + 0.386931005514388690f, -0.922108668743345070f, 0.386754186279524130f, + -0.922182844882327600f, + 0.386577352824813980f, -0.922256987115283030f, 0.386400505156759610f, + -0.922331095439485330f, + 0.386223643281862980f, -0.922405169852209880f, 0.386046767206627280f, + -0.922479210350733100f, + 0.385869876937555310f, -0.922553216932332830f, 0.385692972481151200f, + -0.922627189594287800f, + 0.385516053843919020f, -0.922701128333878520f, 0.385339121032363340f, + -0.922775033148386380f, + 0.385162174052989970f, -0.922848904035094120f, 0.384985212912304200f, + -0.922922740991285680f, + 0.384808237616812930f, -0.922996544014246250f, 0.384631248173022740f, + -0.923070313101262420f, + 0.384454244587440870f, -0.923144048249621820f, 0.384277226866575620f, + -0.923217749456613500f, + 0.384100195016935040f, -0.923291416719527640f, 0.383923149045028500f, + -0.923365050035655610f, + 0.383746088957365010f, -0.923438649402290370f, 0.383569014760454960f, + -0.923512214816725520f, + 0.383391926460808770f, -0.923585746276256560f, 0.383214824064937180f, + -0.923659243778179980f, + 0.383037707579352130f, -0.923732707319793180f, 0.382860577010565360f, + -0.923806136898395410f, + 0.382683432365089840f, -0.923879532511286740f, 0.382506273649438400f, + -0.923952894155768640f, + 0.382329100870124510f, -0.924026221829143850f, 0.382151914033662720f, + -0.924099515528716280f, + 0.381974713146567220f, -0.924172775251791200f, 0.381797498215353690f, + -0.924246000995674890f, + 0.381620269246537520f, -0.924319192757675160f, 0.381443026246634730f, + -0.924392350535101050f, + 0.381265769222162490f, -0.924465474325262600f, 0.381088498179637520f, + -0.924538564125471420f, + 0.380911213125578130f, -0.924611619933039970f, 0.380733914066502090f, + -0.924684641745282530f, + 0.380556601008928570f, -0.924757629559513910f, 0.380379273959376710f, + -0.924830583373050800f, + 0.380201932924366050f, -0.924903503183210910f, 0.380024577910417380f, + -0.924976388987313050f, + 0.379847208924051110f, -0.925049240782677580f, 0.379669825971789000f, + -0.925122058566625770f, + 0.379492429060152740f, -0.925194842336480420f, 0.379315018195664430f, + -0.925267592089565550f, + 0.379137593384847430f, -0.925340307823206200f, 0.378960154634224720f, + -0.925412989534729060f, + 0.378782701950320600f, -0.925485637221461490f, 0.378605235339659290f, + -0.925558250880732620f, + 0.378427754808765620f, -0.925630830509872720f, 0.378250260364165310f, + -0.925703376106213120f, + 0.378072752012383990f, -0.925775887667086740f, 0.377895229759948550f, + -0.925848365189827270f, + 0.377717693613385810f, -0.925920808671769960f, 0.377540143579222940f, + -0.925993218110251480f, + 0.377362579663988450f, -0.926065593502609310f, 0.377185001874210450f, + -0.926137934846182560f, + 0.377007410216418310f, -0.926210242138311270f, 0.376829804697141220f, + -0.926282515376337210f, + 0.376652185322909620f, -0.926354754557602860f, 0.376474552100253880f, + -0.926426959679452100f, + 0.376296905035704790f, -0.926499130739230510f, 0.376119244135794390f, + -0.926571267734284220f, + 0.375941569407054420f, -0.926643370661961230f, 0.375763880856017750f, + -0.926715439519610330f, + 0.375586178489217330f, -0.926787474304581750f, 0.375408462313186590f, + -0.926859475014227160f, + 0.375230732334460030f, -0.926931441645899130f, 0.375052988559571860f, + -0.927003374196951670f, + 0.374875230995057600f, -0.927075272664740100f, 0.374697459647452770f, + -0.927147137046620880f, + 0.374519674523293210f, -0.927218967339951790f, 0.374341875629116030f, + -0.927290763542091720f, + 0.374164062971457990f, -0.927362525650401110f, 0.373986236556857090f, + -0.927434253662241300f, + 0.373808396391851370f, -0.927505947574975180f, 0.373630542482979280f, + -0.927577607385966730f, + 0.373452674836780410f, -0.927649233092581180f, 0.373274793459794030f, + -0.927720824692185200f, + 0.373096898358560690f, -0.927792382182146320f, 0.372918989539620770f, + -0.927863905559833780f, + 0.372741067009515810f, -0.927935394822617890f, 0.372563130774787370f, + -0.928006849967869970f, + 0.372385180841977360f, -0.928078270992963140f, 0.372207217217628950f, + -0.928149657895271150f, + 0.372029239908284960f, -0.928221010672169440f, 0.371851248920489540f, + -0.928292329321034560f, + 0.371673244260786630f, -0.928363613839244370f, 0.371495225935720760f, + -0.928434864224177980f, + 0.371317193951837600f, -0.928506080473215480f, 0.371139148315682510f, + -0.928577262583738850f, + 0.370961089033802040f, -0.928648410553130520f, 0.370783016112742720f, + -0.928719524378774700f, + 0.370604929559051670f, -0.928790604058057020f, 0.370426829379276900f, + -0.928861649588363700f, + 0.370248715579966360f, -0.928932660967082820f, 0.370070588167669130f, + -0.929003638191603360f, + 0.369892447148934270f, -0.929074581259315750f, 0.369714292530311240f, + -0.929145490167611720f, + 0.369536124318350760f, -0.929216364913883930f, 0.369357942519603190f, + -0.929287205495526790f, + 0.369179747140620070f, -0.929358011909935500f, 0.369001538187952780f, + -0.929428784154506800f, + 0.368823315668153960f, -0.929499522226638560f, 0.368645079587776150f, + -0.929570226123729860f, + 0.368466829953372320f, -0.929640895843181330f, 0.368288566771496680f, + -0.929711531382394370f, + 0.368110290048703050f, -0.929782132738772190f, 0.367931999791546500f, + -0.929852699909718750f, + 0.367753696006582090f, -0.929923232892639560f, 0.367575378700365330f, + -0.929993731684941480f, + 0.367397047879452820f, -0.930064196284032360f, 0.367218703550400930f, + -0.930134626687321390f, + 0.367040345719767240f, -0.930205022892219070f, 0.366861974394109220f, + -0.930275384896137040f, + 0.366683589579984930f, -0.930345712696488470f, 0.366505191283953480f, + -0.930416006290687550f, + 0.366326779512573590f, -0.930486265676149780f, 0.366148354272405390f, + -0.930556490850291800f, + 0.365969915570008910f, -0.930626681810531650f, 0.365791463411944570f, + -0.930696838554288860f, + 0.365612997804773960f, -0.930766961078983710f, 0.365434518755058390f, + -0.930837049382038150f, + 0.365256026269360380f, -0.930907103460875020f, 0.365077520354242180f, + -0.930977123312918930f, + 0.364899001016267380f, -0.931047108935595170f, 0.364720468261999390f, + -0.931117060326330790f, + 0.364541922098002180f, -0.931186977482553750f, 0.364363362530840730f, + -0.931256860401693420f, + 0.364184789567079840f, -0.931326709081180430f, 0.364006203213285530f, + -0.931396523518446600f, + 0.363827603476023610f, -0.931466303710925090f, 0.363648990361860550f, + -0.931536049656050300f, + 0.363470363877363870f, -0.931605761351257830f, 0.363291724029100700f, + -0.931675438793984620f, + 0.363113070823639530f, -0.931745081981668720f, 0.362934404267548750f, + -0.931814690911749620f, + 0.362755724367397230f, -0.931884265581668150f, 0.362577031129754870f, + -0.931953805988865900f, + 0.362398324561191310f, -0.932023312130786490f, 0.362219604668277570f, + -0.932092784004874050f, + 0.362040871457584350f, -0.932162221608574320f, 0.361862124935682980f, + -0.932231624939334540f, + 0.361683365109145950f, -0.932300993994602640f, 0.361504591984545260f, + -0.932370328771828460f, + 0.361325805568454340f, -0.932439629268462360f, 0.361147005867446190f, + -0.932508895481956700f, + 0.360968192888095290f, -0.932578127409764420f, 0.360789366636975690f, + -0.932647325049340340f, + 0.360610527120662270f, -0.932716488398140250f, 0.360431674345730810f, + -0.932785617453620990f, + 0.360252808318756830f, -0.932854712213241230f, 0.360073929046317080f, + -0.932923772674460140f, + 0.359895036534988280f, -0.932992798834738850f, 0.359716130791347570f, + -0.933061790691539380f, + 0.359537211821973180f, -0.933130748242325110f, 0.359358279633443080f, + -0.933199671484560730f, + 0.359179334232336560f, -0.933268560415712050f, 0.359000375625232630f, + -0.933337415033246080f, + 0.358821403818710920f, -0.933406235334631520f, 0.358642418819352100f, + -0.933475021317337950f, + 0.358463420633736540f, -0.933543772978836170f, 0.358284409268445900f, + -0.933612490316598540f, + 0.358105384730061760f, -0.933681173328098300f, 0.357926347025166070f, + -0.933749822010810580f, + 0.357747296160342010f, -0.933818436362210960f, 0.357568232142172260f, + -0.933887016379776890f, + 0.357389154977241000f, -0.933955562060986730f, 0.357210064672131900f, + -0.934024073403320500f, + 0.357030961233430030f, -0.934092550404258870f, 0.356851844667720410f, + -0.934160993061284420f, + 0.356672714981588260f, -0.934229401371880820f, 0.356493572181620200f, + -0.934297775333532530f, + 0.356314416274402360f, -0.934366114943725900f, 0.356135247266522180f, + -0.934434420199948050f, + 0.355956065164567010f, -0.934502691099687870f, 0.355776869975124640f, + -0.934570927640435030f, + 0.355597661704783960f, -0.934639129819680780f, 0.355418440360133590f, + -0.934707297634917440f, + 0.355239205947763370f, -0.934775431083638700f, 0.355059958474263030f, + -0.934843530163339430f, + 0.354880697946222790f, -0.934911594871516090f, 0.354701424370233940f, + -0.934979625205665800f, + 0.354522137752887430f, -0.935047621163287430f, 0.354342838100775600f, + -0.935115582741880890f, + 0.354163525420490510f, -0.935183509938947500f, 0.353984199718624830f, + -0.935251402751989810f, + 0.353804861001772160f, -0.935319261178511500f, 0.353625509276525970f, + -0.935387085216017770f, + 0.353446144549480870f, -0.935454874862014620f, 0.353266766827231180f, + -0.935522630114009930f, + 0.353087376116372530f, -0.935590350969512370f, 0.352907972423500360f, + -0.935658037426032040f, + 0.352728555755210730f, -0.935725689481080370f, 0.352549126118100580f, + -0.935793307132169900f, + 0.352369683518766630f, -0.935860890376814640f, 0.352190227963806890f, + -0.935928439212529660f, + 0.352010759459819240f, -0.935995953636831300f, 0.351831278013402030f, + -0.936063433647237540f, + 0.351651783631154680f, -0.936130879241266920f, 0.351472276319676260f, + -0.936198290416440090f, + 0.351292756085567150f, -0.936265667170278260f, 0.351113222935427630f, + -0.936333009500304180f, + 0.350933676875858360f, -0.936400317404042060f, 0.350754117913461170f, + -0.936467590879016880f, + 0.350574546054837570f, -0.936534829922755500f, 0.350394961306590200f, + -0.936602034532785570f, + 0.350215363675321740f, -0.936669204706636060f, 0.350035753167635300f, + -0.936736340441837620f, + 0.349856129790135030f, -0.936803441735921560f, 0.349676493549424760f, + -0.936870508586420960f, + 0.349496844452109600f, -0.936937540990869900f, 0.349317182504794320f, + -0.937004538946803690f, + 0.349137507714085030f, -0.937071502451759190f, 0.348957820086587600f, + -0.937138431503274140f, + 0.348778119628908420f, -0.937205326098887960f, 0.348598406347655040f, + -0.937272186236140950f, + 0.348418680249434510f, -0.937339011912574960f, 0.348238941340855310f, + -0.937405803125732850f, + 0.348059189628525780f, -0.937472559873159140f, 0.347879425119054510f, + -0.937539282152399230f, + 0.347699647819051490f, -0.937605969960999990f, 0.347519857735126110f, + -0.937672623296509470f, + 0.347340054873889190f, -0.937739242156476970f, 0.347160239241951330f, + -0.937805826538453010f, + 0.346980410845923680f, -0.937872376439989890f, 0.346800569692418400f, + -0.937938891858640210f, + 0.346620715788047320f, -0.938005372791958840f, 0.346440849139423580f, + -0.938071819237501160f, + 0.346260969753160170f, -0.938138231192824360f, 0.346081077635870480f, + -0.938204608655486490f, + 0.345901172794169100f, -0.938270951623047080f, 0.345721255234670120f, + -0.938337260093066950f, + 0.345541324963989150f, -0.938403534063108060f, 0.345361381988741170f, + -0.938469773530733800f, + 0.345181426315542610f, -0.938535978493508560f, 0.345001457951009780f, + -0.938602148948998290f, + 0.344821476901759290f, -0.938668284894770170f, 0.344641483174409070f, + -0.938734386328392460f, + 0.344461476775576480f, -0.938800453247434770f, 0.344281457711880230f, + -0.938866485649468060f, + 0.344101425989938980f, -0.938932483532064490f, 0.343921381616371700f, + -0.938998446892797540f, + 0.343741324597798600f, -0.939064375729241950f, 0.343561254940839330f, + -0.939130270038973650f, + 0.343381172652115100f, -0.939196129819569900f, 0.343201077738246710f, + -0.939261955068609100f, + 0.343020970205855540f, -0.939327745783671400f, 0.342840850061564060f, + -0.939393501962337510f, + 0.342660717311994380f, -0.939459223602189920f, 0.342480571963769850f, + -0.939524910700812120f, + 0.342300414023513690f, -0.939590563255789160f, 0.342120243497849590f, + -0.939656181264707070f, + 0.341940060393402300f, -0.939721764725153340f, 0.341759864716796310f, + -0.939787313634716570f, + 0.341579656474657210f, -0.939852827990986680f, 0.341399435673610360f, + -0.939918307791555050f, + 0.341219202320282410f, -0.939983753034013940f, 0.341038956421299830f, + -0.940049163715957370f, + 0.340858697983289440f, -0.940114539834980280f, 0.340678427012879310f, + -0.940179881388678810f, + 0.340498143516697100f, -0.940245188374650880f, 0.340317847501371730f, + -0.940310460790495070f, + 0.340137538973531880f, -0.940375698633811540f, 0.339957217939806880f, + -0.940440901902201750f, + 0.339776884406826960f, -0.940506070593268300f, 0.339596538381222060f, + -0.940571204704615190f, + 0.339416179869623410f, -0.940636304233847590f, 0.339235808878662120f, + -0.940701369178571940f, + 0.339055425414969640f, -0.940766399536396070f, 0.338875029485178560f, + -0.940831395304928870f, + 0.338694621095921190f, -0.940896356481780830f, 0.338514200253831000f, + -0.940961283064563280f, + 0.338333766965541290f, -0.941026175050889260f, 0.338153321237685990f, + -0.941091032438372780f, + 0.337972863076899830f, -0.941155855224629190f, 0.337792392489817460f, + -0.941220643407275180f, + 0.337611909483074680f, -0.941285396983928660f, 0.337431414063306790f, + -0.941350115952208970f, + 0.337250906237150650f, -0.941414800309736230f, 0.337070386011242730f, + -0.941479450054132580f, + 0.336889853392220050f, -0.941544065183020810f, 0.336709308386720700f, + -0.941608645694025140f, + 0.336528751001382350f, -0.941673191584771360f, 0.336348181242844100f, + -0.941737702852886160f, + 0.336167599117744690f, -0.941802179495997650f, 0.335987004632723350f, + -0.941866621511735280f, + 0.335806397794420560f, -0.941931028897729510f, 0.335625778609476230f, + -0.941995401651612550f, + 0.335445147084531660f, -0.942059739771017310f, 0.335264503226227970f, + -0.942124043253578460f, + 0.335083847041206580f, -0.942188312096931770f, 0.334903178536110290f, + -0.942252546298714020f, + 0.334722497717581220f, -0.942316745856563780f, 0.334541804592262960f, + -0.942380910768120470f, + 0.334361099166798900f, -0.942445041031024890f, 0.334180381447832740f, + -0.942509136642919240f, + 0.333999651442009490f, -0.942573197601446870f, 0.333818909155973620f, + -0.942637223904252530f, + 0.333638154596370920f, -0.942701215548981900f, 0.333457387769846790f, + -0.942765172533282510f, + 0.333276608683047980f, -0.942829094854802710f, 0.333095817342620890f, + -0.942892982511192130f, + 0.332915013755212650f, -0.942956835500102120f, 0.332734197927471160f, + -0.943020653819184650f, + 0.332553369866044220f, -0.943084437466093490f, 0.332372529577580680f, + -0.943148186438483420f, + 0.332191677068729320f, -0.943211900734010620f, 0.332010812346139380f, + -0.943275580350332540f, + 0.331829935416461220f, -0.943339225285107720f, 0.331649046286344620f, + -0.943402835535996240f, + 0.331468144962440920f, -0.943466411100659320f, 0.331287231451400990f, + -0.943529951976759370f, + 0.331106305759876430f, -0.943593458161960390f, 0.330925367894519650f, + -0.943656929653927110f, + 0.330744417861982890f, -0.943720366450326200f, 0.330563455668919590f, + -0.943783768548825060f, + 0.330382481321982950f, -0.943847135947092690f, 0.330201494827826620f, + -0.943910468642799150f, + 0.330020496193105530f, -0.943973766633615980f, 0.329839485424473940f, + -0.944037029917215830f, + 0.329658462528587550f, -0.944100258491272660f, 0.329477427512101680f, + -0.944163452353461770f, + 0.329296380381672800f, -0.944226611501459810f, 0.329115321143957360f, + -0.944289735932944410f, + 0.328934249805612200f, -0.944352825645594750f, 0.328753166373295100f, + -0.944415880637091250f, + 0.328572070853663690f, -0.944478900905115550f, 0.328390963253376630f, + -0.944541886447350380f, + 0.328209843579092660f, -0.944604837261480260f, 0.328028711837470730f, + -0.944667753345190490f, + 0.327847568035170960f, -0.944730634696167800f, 0.327666412178853060f, + -0.944793481312100280f, + 0.327485244275178060f, -0.944856293190677210f, 0.327304064330806830f, + -0.944919070329589220f, + 0.327122872352400510f, -0.944981812726528150f, 0.326941668346621530f, + -0.945044520379187070f, + 0.326760452320131790f, -0.945107193285260610f, 0.326579224279594460f, + -0.945169831442444150f, + 0.326397984231672660f, -0.945232434848434890f, 0.326216732183029770f, + -0.945295003500931100f, + 0.326035468140330350f, -0.945357537397632290f, 0.325854192110238580f, + -0.945420036536239070f, + 0.325672904099419900f, -0.945482500914453740f, 0.325491604114539260f, + -0.945544930529979680f, + 0.325310292162262980f, -0.945607325380521280f, 0.325128968249257190f, + -0.945669685463784710f, + 0.324947632382188430f, -0.945732010777477150f, 0.324766284567724330f, + -0.945794301319306860f, + 0.324584924812532150f, -0.945856557086983910f, 0.324403553123280290f, + -0.945918778078219110f, + 0.324222169506637130f, -0.945980964290724760f, 0.324040773969271450f, + -0.946043115722214560f, + 0.323859366517852960f, -0.946105232370403340f, 0.323677947159051180f, + -0.946167314233007370f, + 0.323496515899536760f, -0.946229361307743820f, 0.323315072745980150f, + -0.946291373592331510f, + 0.323133617705052330f, -0.946353351084490590f, 0.322952150783425370f, + -0.946415293781942110f, + 0.322770671987770710f, -0.946477201682408680f, 0.322589181324761390f, + -0.946539074783614100f, + 0.322407678801070020f, -0.946600913083283530f, 0.322226164423369650f, + -0.946662716579143360f, + 0.322044638198334620f, -0.946724485268921170f, 0.321863100132638580f, + -0.946786219150346000f, + 0.321681550232956640f, -0.946847918221148000f, 0.321499988505963450f, + -0.946909582479058760f, + 0.321318414958334910f, -0.946971211921810880f, 0.321136829596746780f, + -0.947032806547138620f, + 0.320955232427875210f, -0.947094366352777220f, 0.320773623458397440f, + -0.947155891336463270f, + 0.320592002694990330f, -0.947217381495934820f, 0.320410370144331880f, + -0.947278836828930880f, + 0.320228725813100020f, -0.947340257333191940f, 0.320047069707973140f, + -0.947401643006459900f, + 0.319865401835630610f, -0.947462993846477700f, 0.319683722202751370f, + -0.947524309850989570f, + 0.319502030816015750f, -0.947585591017741090f, 0.319320327682103720f, + -0.947646837344479190f, + 0.319138612807695900f, -0.947708048828952100f, 0.318956886199473770f, + -0.947769225468909180f, + 0.318775147864118480f, -0.947830367262101010f, 0.318593397808312470f, + -0.947891474206279730f, + 0.318411636038737960f, -0.947952546299198560f, 0.318229862562077580f, + -0.948013583538612200f, + 0.318048077385015060f, -0.948074585922276230f, 0.317866280514233660f, + -0.948135553447947980f, + 0.317684471956418020f, -0.948196486113385580f, 0.317502651718252260f, + -0.948257383916349060f, + 0.317320819806421790f, -0.948318246854599090f, 0.317138976227611890f, + -0.948379074925898120f, + 0.316957120988508150f, -0.948439868128009620f, 0.316775254095797380f, + -0.948500626458698260f, + 0.316593375556165850f, -0.948561349915730270f, 0.316411485376301090f, + -0.948622038496872990f, + 0.316229583562890490f, -0.948682692199895090f, 0.316047670122621860f, + -0.948743311022566480f, + 0.315865745062184070f, -0.948803894962658380f, 0.315683808388265600f, + -0.948864444017943340f, + 0.315501860107556040f, -0.948924958186195160f, 0.315319900226745050f, + -0.948985437465188710f, + 0.315137928752522440f, -0.949045881852700560f, 0.314955945691579250f, + -0.949106291346508260f, + 0.314773951050606070f, -0.949166665944390700f, 0.314591944836294710f, + -0.949227005644128210f, + 0.314409927055336820f, -0.949287310443502010f, 0.314227897714424500f, + -0.949347580340295210f, + 0.314045856820250820f, -0.949407815332291460f, 0.313863804379508500f, + -0.949468015417276550f, + 0.313681740398891570f, -0.949528180593036670f, 0.313499664885093450f, + -0.949588310857359950f, + 0.313317577844809070f, -0.949648406208035480f, 0.313135479284732950f, + -0.949708466642853800f, + 0.312953369211560200f, -0.949768492159606680f, 0.312771247631986880f, + -0.949828482756087000f, + 0.312589114552708660f, -0.949888438430089300f, 0.312406969980422500f, + -0.949948359179409010f, + 0.312224813921825050f, -0.950008245001843000f, 0.312042646383613510f, + -0.950068095895189590f, + 0.311860467372486130f, -0.950127911857248100f, 0.311678276895140550f, + -0.950187692885819280f, + 0.311496074958275970f, -0.950247438978705230f, 0.311313861568591090f, + -0.950307150133709140f, + 0.311131636732785270f, -0.950366826348635780f, 0.310949400457558760f, + -0.950426467621290900f, + 0.310767152749611470f, -0.950486073949481700f, 0.310584893615644560f, + -0.950545645331016600f, + 0.310402623062358880f, -0.950605181763705230f, 0.310220341096455910f, + -0.950664683245358910f, + 0.310038047724638000f, -0.950724149773789610f, 0.309855742953607130f, + -0.950783581346811070f, + 0.309673426790066490f, -0.950842977962238160f, 0.309491099240719050f, + -0.950902339617887060f, + 0.309308760312268780f, -0.950961666311575080f, 0.309126410011419550f, + -0.951020958041121080f, + 0.308944048344875710f, -0.951080214804345010f, 0.308761675319342570f, + -0.951139436599068190f, + 0.308579290941525030f, -0.951198623423113230f, 0.308396895218129240f, + -0.951257775274304000f, + 0.308214488155861220f, -0.951316892150465550f, 0.308032069761427330f, + -0.951375974049424420f, + 0.307849640041534980f, -0.951435020969008340f, 0.307667199002891190f, + -0.951494032907046370f, + 0.307484746652204160f, -0.951553009861368590f, 0.307302282996181950f, + -0.951611951829806730f, + 0.307119808041533100f, -0.951670858810193860f, 0.306937321794967020f, + -0.951729730800363720f, + 0.306754824263192780f, -0.951788567798152130f, 0.306572315452920800f, + -0.951847369801395620f, + 0.306389795370861080f, -0.951906136807932230f, 0.306207264023724280f, + -0.951964868815601380f, + 0.306024721418221900f, -0.952023565822243570f, 0.305842167561065080f, + -0.952082227825700620f, + 0.305659602458966230f, -0.952140854823815830f, 0.305477026118637360f, + -0.952199446814433580f, + 0.305294438546791720f, -0.952258003795399600f, 0.305111839750142220f, + -0.952316525764560830f, + 0.304929229735402430f, -0.952375012719765880f, 0.304746608509286640f, + -0.952433464658864030f, + 0.304563976078509050f, -0.952491881579706320f, 0.304381332449784940f, + -0.952550263480144930f, + 0.304198677629829270f, -0.952608610358033240f, 0.304016011625357570f, + -0.952666922211226170f, + 0.303833334443086470f, -0.952725199037579570f, 0.303650646089731910f, + -0.952783440834950920f, + 0.303467946572011370f, -0.952841647601198720f, 0.303285235896641910f, + -0.952899819334182880f, + 0.303102514070341060f, -0.952957956031764700f, 0.302919781099827420f, + -0.953016057691806530f, + 0.302737036991819140f, -0.953074124312172200f, 0.302554281753035670f, + -0.953132155890726750f, + 0.302371515390196130f, -0.953190152425336560f, 0.302188737910020040f, + -0.953248113913869320f, + 0.302005949319228200f, -0.953306040354193750f, 0.301823149624540650f, + -0.953363931744180330f, + 0.301640338832678880f, -0.953421788081700310f, 0.301457516950363940f, + -0.953479609364626610f, + 0.301274683984318000f, -0.953537395590833280f, 0.301091839941263210f, + -0.953595146758195680f, + 0.300908984827921890f, -0.953652862864590500f, 0.300726118651017620f, + -0.953710543907895560f, + 0.300543241417273400f, -0.953768189885990330f, 0.300360353133413580f, + -0.953825800796755050f, + 0.300177453806162120f, -0.953883376638071770f, 0.299994543442243580f, + -0.953940917407823500f, + 0.299811622048383460f, -0.953998423103894490f, 0.299628689631306790f, + -0.954055893724170660f, + 0.299445746197739950f, -0.954113329266538800f, 0.299262791754409010f, + -0.954170729728887280f, + 0.299079826308040480f, -0.954228095109105670f, 0.298896849865361910f, + -0.954285425405084650f, + 0.298713862433100390f, -0.954342720614716480f, 0.298530864017984230f, + -0.954399980735894490f, + 0.298347854626741570f, -0.954457205766513490f, 0.298164834266100910f, + -0.954514395704469500f, + 0.297981802942791920f, -0.954571550547659630f, 0.297798760663543550f, + -0.954628670293982680f, + 0.297615707435086310f, -0.954685754941338340f, 0.297432643264150030f, + -0.954742804487627940f, + 0.297249568157465890f, -0.954799818930753720f, 0.297066482121764840f, + -0.954856798268619580f, + 0.296883385163778270f, -0.954913742499130520f, 0.296700277290238460f, + -0.954970651620192790f, + 0.296517158507877410f, -0.955027525629714160f, 0.296334028823428240f, + -0.955084364525603410f, + 0.296150888243623960f, -0.955141168305770670f, 0.295967736775197890f, + -0.955197936968127710f, + 0.295784574424884370f, -0.955254670510586990f, 0.295601401199417360f, + -0.955311368931062720f, + 0.295418217105532070f, -0.955368032227470240f, 0.295235022149963390f, + -0.955424660397726330f, + 0.295051816339446720f, -0.955481253439748770f, 0.294868599680718380f, + -0.955537811351456770f, + 0.294685372180514330f, -0.955594334130771110f, 0.294502133845571720f, + -0.955650821775613220f, + 0.294318884682627570f, -0.955707274283906560f, 0.294135624698419080f, + -0.955763691653575440f, + 0.293952353899684770f, -0.955820073882545420f, 0.293769072293162400f, + -0.955876420968743590f, + 0.293585779885591310f, -0.955932732910098170f, 0.293402476683710060f, + -0.955989009704538930f, + 0.293219162694258680f, -0.956045251349996410f, 0.293035837923976920f, + -0.956101457844403040f, + 0.292852502379604810f, -0.956157629185692140f, 0.292669156067883570f, + -0.956213765371798470f, + 0.292485798995553830f, -0.956269866400658140f, 0.292302431169357610f, + -0.956325932270208230f, + 0.292119052596036540f, -0.956381962978387620f, 0.291935663282332780f, + -0.956437958523136180f, + 0.291752263234989370f, -0.956493918902394990f, 0.291568852460749040f, + -0.956549844114106820f, + 0.291385430966355720f, -0.956605734156215080f, 0.291201998758553020f, + -0.956661589026664980f, + 0.291018555844085090f, -0.956717408723403050f, 0.290835102229696940f, + -0.956773193244376930f, + 0.290651637922133220f, -0.956828942587535370f, 0.290468162928139870f, + -0.956884656750828900f, + 0.290284677254462330f, -0.956940335732208940f, 0.290101180907847140f, + -0.956995979529628230f, + 0.289917673895040860f, -0.957051588141040970f, 0.289734156222790250f, + -0.957107161564402790f, + 0.289550627897843140f, -0.957162699797670100f, 0.289367088926946960f, + -0.957218202838801210f, + 0.289183539316850310f, -0.957273670685755200f, 0.288999979074301530f, + -0.957329103336492790f, + 0.288816408206049480f, -0.957384500788975860f, 0.288632826718843940f, + -0.957439863041167570f, + 0.288449234619434170f, -0.957495190091032570f, 0.288265631914570830f, + -0.957550481936536470f, + 0.288082018611004300f, -0.957605738575646240f, 0.287898394715485170f, + -0.957660960006330610f, + 0.287714760234765280f, -0.957716146226558870f, 0.287531115175595930f, + -0.957771297234302320f, + 0.287347459544729570f, -0.957826413027532910f, 0.287163793348918560f, + -0.957881493604224250f, + 0.286980116594915570f, -0.957936538962351420f, 0.286796429289474190f, + -0.957991549099890370f, + 0.286612731439347790f, -0.958046524014818600f, 0.286429023051290750f, + -0.958101463705114620f, + 0.286245304132057120f, -0.958156368168758820f, 0.286061574688402100f, + -0.958211237403732260f, + 0.285877834727080730f, -0.958266071408017670f, 0.285694084254848320f, + -0.958320870179598880f, + 0.285510323278461380f, -0.958375633716461170f, 0.285326551804675810f, + -0.958430362016591040f, + 0.285142769840248720f, -0.958485055077976100f, 0.284958977391937150f, + -0.958539712898605730f, + 0.284775174466498300f, -0.958594335476470220f, 0.284591361070690550f, + -0.958648922809561040f, + 0.284407537211271820f, -0.958703474895871600f, 0.284223702895001100f, + -0.958757991733395710f, + 0.284039858128637360f, -0.958812473320129200f, 0.283856002918939750f, + -0.958866919654069010f, + 0.283672137272668550f, -0.958921330733213060f, 0.283488261196583550f, + -0.958975706555561080f, + 0.283304374697445790f, -0.959030047119113550f, 0.283120477782015990f, + -0.959084352421872730f, + 0.282936570457055390f, -0.959138622461841890f, 0.282752652729326040f, + -0.959192857237025740f, + 0.282568724605589740f, -0.959247056745430090f, 0.282384786092609420f, + -0.959301220985062210f, + 0.282200837197147500f, -0.959355349953930790f, 0.282016877925967690f, + -0.959409443650045550f, + 0.281832908285833460f, -0.959463502071417510f, 0.281648928283508680f, + -0.959517525216059260f, + 0.281464937925758050f, -0.959571513081984520f, 0.281280937219346110f, + -0.959625465667208300f, + 0.281096926171038320f, -0.959679382969746750f, 0.280912904787600120f, + -0.959733264987617680f, + 0.280728873075797190f, -0.959787111718839900f, 0.280544831042396360f, + -0.959840923161433660f, + 0.280360778694163810f, -0.959894699313420530f, 0.280176716037867040f, + -0.959948440172823210f, + 0.279992643080273380f, -0.960002145737665850f, 0.279808559828150390f, + -0.960055816005973890f, + 0.279624466288266700f, -0.960109450975773940f, 0.279440362467390510f, + -0.960163050645094000f, + 0.279256248372291240f, -0.960216615011963430f, 0.279072124009737970f, + -0.960270144074412800f, + 0.278887989386500280f, -0.960323637830473920f, 0.278703844509348600f, + -0.960377096278180130f, + 0.278519689385053060f, -0.960430519415565790f, 0.278335524020384970f, + -0.960483907240666790f, + 0.278151348422115090f, -0.960537259751520050f, 0.277967162597015430f, + -0.960590576946164120f, + 0.277782966551857800f, -0.960643858822638470f, 0.277598760293414290f, + -0.960697105378984450f, + 0.277414543828458200f, -0.960750316613243950f, 0.277230317163762120f, + -0.960803492523460760f, + 0.277046080306099950f, -0.960856633107679660f, 0.276861833262245390f, + -0.960909738363946770f, + 0.276677576038972420f, -0.960962808290309780f, 0.276493308643056100f, + -0.961015842884817230f, + 0.276309031081271030f, -0.961068842145519350f, 0.276124743360392890f, + -0.961121806070467380f, + 0.275940445487197320f, -0.961174734657714080f, 0.275756137468460120f, + -0.961227627905313460f, + 0.275571819310958250f, -0.961280485811320640f, 0.275387491021468140f, + -0.961333308373792270f, + 0.275203152606767370f, -0.961386095590786250f, 0.275018804073633380f, + -0.961438847460361570f, + 0.274834445428843940f, -0.961491563980579000f, 0.274650076679177790f, + -0.961544245149499990f, + 0.274465697831413220f, -0.961596890965187860f, 0.274281308892329710f, + -0.961649501425706820f, + 0.274096909868706330f, -0.961702076529122540f, 0.273912500767323320f, + -0.961754616273502010f, + 0.273728081594960650f, -0.961807120656913540f, 0.273543652358398730f, + -0.961859589677426570f, + 0.273359213064418790f, -0.961912023333112100f, 0.273174763719801870f, + -0.961964421622042320f, + 0.272990304331329980f, -0.962016784542290560f, 0.272805834905784920f, + -0.962069112091931580f, + 0.272621355449948980f, -0.962121404269041580f, 0.272436865970605350f, + -0.962173661071697770f, + 0.272252366474536660f, -0.962225882497979020f, 0.272067856968526980f, + -0.962278068545965090f, + 0.271883337459359890f, -0.962330219213737400f, 0.271698807953819510f, + -0.962382334499378380f, + 0.271514268458690810f, -0.962434414400971990f, 0.271329718980758420f, + -0.962486458916603450f, + 0.271145159526808070f, -0.962538468044359160f, 0.270960590103625330f, + -0.962590441782326780f, + 0.270776010717996010f, -0.962642380128595710f, 0.270591421376707050f, + -0.962694283081255930f, + 0.270406822086544820f, -0.962746150638399410f, 0.270222212854296930f, + -0.962797982798119010f, + 0.270037593686750510f, -0.962849779558509030f, 0.269852964590693910f, + -0.962901540917665000f, + 0.269668325572915200f, -0.962953266873683880f, 0.269483676640202840f, + -0.963004957424663850f, + 0.269299017799346230f, -0.963056612568704340f, 0.269114349057134330f, + -0.963108232303906190f, + 0.268929670420357310f, -0.963159816628371360f, 0.268744981895805090f, + -0.963211365540203480f, + 0.268560283490267890f, -0.963262879037507070f, 0.268375575210537010f, + -0.963314357118388090f, + 0.268190857063403180f, -0.963365799780954050f, 0.268006129055658350f, + -0.963417207023313350f, + 0.267821391194094320f, -0.963468578843575950f, 0.267636643485503090f, + -0.963519915239853140f, + 0.267451885936677740f, -0.963571216210257210f, 0.267267118554410930f, + -0.963622481752902220f, + 0.267082341345496350f, -0.963673711865903230f, 0.266897554316727510f, + -0.963724906547376410f, + 0.266712757474898420f, -0.963776065795439840f, 0.266527950826803810f, + -0.963827189608212340f, + 0.266343134379238180f, -0.963878277983814200f, 0.266158308138997050f, + -0.963929330920367140f, + 0.265973472112875530f, -0.963980348415994110f, 0.265788626307669970f, + -0.964031330468819280f, + 0.265603770730176440f, -0.964082277076968140f, 0.265418905387191260f, + -0.964133188238567640f, + 0.265234030285511900f, -0.964184063951745720f, 0.265049145431935200f, + -0.964234904214632200f, + 0.264864250833259320f, -0.964285709025357370f, 0.264679346496282050f, + -0.964336478382053720f, + 0.264494432427801630f, -0.964387212282854290f, 0.264309508634617220f, + -0.964437910725893910f, + 0.264124575123527490f, -0.964488573709308410f, 0.263939631901332410f, + -0.964539201231235150f, + 0.263754678974831510f, -0.964589793289812650f, 0.263569716350824880f, + -0.964640349883180930f, + 0.263384744036113390f, -0.964690871009480920f, 0.263199762037497560f, + -0.964741356666855340f, + 0.263014770361779060f, -0.964791806853447900f, 0.262829769015759330f, + -0.964842221567403510f, + 0.262644758006240100f, -0.964892600806868890f, 0.262459737340024090f, + -0.964942944569991410f, + 0.262274707023913590f, -0.964993252854920320f, 0.262089667064712100f, + -0.965043525659805890f, + 0.261904617469222560f, -0.965093762982799590f, 0.261719558244249080f, + -0.965143964822054450f, + 0.261534489396595630f, -0.965194131175724720f, 0.261349410933066350f, + -0.965244262041965780f, + 0.261164322860466590f, -0.965294357418934660f, 0.260979225185601020f, + -0.965344417304789370f, + 0.260794117915275570f, -0.965394441697689400f, 0.260609001056295920f, + -0.965444430595795430f, + 0.260423874615468010f, -0.965494383997269500f, 0.260238738599598950f, + -0.965544301900275070f, + 0.260053593015495130f, -0.965594184302976830f, 0.259868437869964330f, + -0.965644031203540590f, + 0.259683273169813930f, -0.965693842600133690f, 0.259498098921851660f, + -0.965743618490924830f, + 0.259312915132886350f, -0.965793358874083570f, 0.259127721809726150f, + -0.965843063747781510f, + 0.258942518959180580f, -0.965892733110190860f, 0.258757306588058840f, + -0.965942366959485540f, + 0.258572084703170390f, -0.965991965293840570f, 0.258386853311325710f, + -0.966041528111432400f, + 0.258201612419334870f, -0.966091055410438830f, 0.258016362034009070f, + -0.966140547189038750f, + 0.257831102162158930f, -0.966190003445412620f, 0.257645832810596440f, + -0.966239424177741890f, + 0.257460553986133210f, -0.966288809384209580f, 0.257275265695581120f, + -0.966338159063000130f, + 0.257089967945753230f, -0.966387473212298790f, 0.256904660743461850f, + -0.966436751830292650f, + 0.256719344095520720f, -0.966485994915169840f, 0.256534018008743200f, + -0.966535202465119700f, + 0.256348682489942910f, -0.966584374478333120f, 0.256163337545934570f, + -0.966633510953002100f, + 0.255977983183532380f, -0.966682611887320190f, 0.255792619409551670f, + -0.966731677279481840f, + 0.255607246230807550f, -0.966780707127683270f, 0.255421863654115460f, + -0.966829701430121810f, + 0.255236471686291820f, -0.966878660184995910f, 0.255051070334152530f, + -0.966927583390505660f, + 0.254865659604514630f, -0.966976471044852070f, 0.254680239504194990f, + -0.967025323146237900f, + 0.254494810040010790f, -0.967074139692867040f, 0.254309371218780110f, + -0.967122920682944360f, + 0.254123923047320620f, -0.967171666114676640f, 0.253938465532451140f, + -0.967220375986271310f, + 0.253752998680989940f, -0.967269050295937790f, 0.253567522499756610f, + -0.967317689041886310f, + 0.253382036995570270f, -0.967366292222328510f, 0.253196542175250560f, + -0.967414859835477480f, + 0.253011038045617980f, -0.967463391879547440f, 0.252825524613492610f, + -0.967511888352754150f, + 0.252640001885695580f, -0.967560349253314360f, 0.252454469869047900f, + -0.967608774579446380f, + 0.252268928570370810f, -0.967657164329369880f, 0.252083377996486560f, + -0.967705518501305480f, + 0.251897818154216910f, -0.967753837093475510f, 0.251712249050384750f, + -0.967802120104103270f, + 0.251526670691812780f, -0.967850367531413620f, 0.251341083085323880f, + -0.967898579373632660f, + 0.251155486237742030f, -0.967946755628987800f, 0.250969880155890720f, + -0.967994896295707670f, + 0.250784264846594550f, -0.968043001372022260f, 0.250598640316677830f, + -0.968091070856162970f, + 0.250413006572965280f, -0.968139104746362330f, 0.250227363622282540f, + -0.968187103040854420f, + 0.250041711471454650f, -0.968235065737874320f, 0.249856050127308050f, + -0.968282992835658660f, + 0.249670379596668520f, -0.968330884332445300f, 0.249484699886363010f, + -0.968378740226473300f, + 0.249299011003218300f, -0.968426560515983190f, 0.249113312954061360f, + -0.968474345199216820f, + 0.248927605745720260f, -0.968522094274417270f, 0.248741889385022420f, + -0.968569807739828930f, + 0.248556163878796620f, -0.968617485593697540f, 0.248370429233871150f, + -0.968665127834269950f, + 0.248184685457074780f, -0.968712734459794780f, 0.247998932555237220f, + -0.968760305468521430f, + 0.247813170535187620f, -0.968807840858700970f, 0.247627399403756330f, + -0.968855340628585580f, + 0.247441619167773440f, -0.968902804776428870f, 0.247255829834069320f, + -0.968950233300485800f, + 0.247070031409475370f, -0.968997626199012310f, 0.246884223900822430f, + -0.969044983470266240f, + 0.246698407314942500f, -0.969092305112506100f, 0.246512581658667380f, + -0.969139591123992280f, + 0.246326746938829060f, -0.969186841502985950f, 0.246140903162260640f, + -0.969234056247750050f, + 0.245955050335794590f, -0.969281235356548530f, 0.245769188466264670f, + -0.969328378827646660f, + 0.245583317560504000f, -0.969375486659311280f, 0.245397437625346990f, + -0.969422558849810320f, + 0.245211548667627680f, -0.969469595397412950f, 0.245025650694180470f, + -0.969516596300390000f, + 0.244839743711840750f, -0.969563561557013180f, 0.244653827727443320f, + -0.969610491165555870f, + 0.244467902747824210f, -0.969657385124292450f, 0.244281968779819170f, + -0.969704243431498750f, + 0.244096025830264210f, -0.969751066085452140f, 0.243910073905996370f, + -0.969797853084430890f, + 0.243724113013852130f, -0.969844604426714830f, 0.243538143160669180f, + -0.969891320110585100f, + 0.243352164353284880f, -0.969938000134323960f, 0.243166176598536930f, + -0.969984644496215240f, + 0.242980179903263980f, -0.970031253194543970f, 0.242794174274304190f, + -0.970077826227596420f, + 0.242608159718496890f, -0.970124363593660280f, 0.242422136242681050f, + -0.970170865291024360f, + 0.242236103853696040f, -0.970217331317979160f, 0.242050062558382180f, + -0.970263761672816140f, + 0.241864012363579210f, -0.970310156353828110f, 0.241677953276128090f, + -0.970356515359309450f, + 0.241491885302869300f, -0.970402838687555500f, 0.241305808450644390f, + -0.970449126336863090f, + 0.241119722726294730f, -0.970495378305530450f, 0.240933628136661910f, + -0.970541594591857070f, + 0.240747524688588540f, -0.970587775194143630f, 0.240561412388916620f, + -0.970633920110692160f, + 0.240375291244489500f, -0.970680029339806130f, 0.240189161262150040f, + -0.970726102879790110f, + 0.240003022448741500f, -0.970772140728950350f, 0.239816874811108110f, + -0.970818142885593870f, + 0.239630718356093560f, -0.970864109348029470f, 0.239444553090542720f, + -0.970910040114567050f, + 0.239258379021300120f, -0.970955935183517970f, 0.239072196155210660f, + -0.971001794553194690f, + 0.238886004499120170f, -0.971047618221911100f, 0.238699804059873950f, + -0.971093406187982460f, + 0.238513594844318500f, -0.971139158449725090f, 0.238327376859299970f, + -0.971184875005457030f, + 0.238141150111664870f, -0.971230555853497380f, 0.237954914608260650f, + -0.971276200992166490f, + 0.237768670355934210f, -0.971321810419786160f, 0.237582417361533650f, + -0.971367384134679490f, + 0.237396155631906550f, -0.971412922135170940f, 0.237209885173901620f, + -0.971458424419585960f, + 0.237023605994367340f, -0.971503890986251780f, 0.236837318100152380f, + -0.971549321833496630f, + 0.236651021498106460f, -0.971594716959650160f, 0.236464716195078750f, + -0.971640076363043390f, + 0.236278402197919620f, -0.971685400042008540f, 0.236092079513479050f, + -0.971730687994879160f, + 0.235905748148607370f, -0.971775940219990140f, 0.235719408110155930f, + -0.971821156715677700f, + 0.235533059404975460f, -0.971866337480279400f, 0.235346702039917920f, + -0.971911482512134000f, + 0.235160336021834860f, -0.971956591809581600f, 0.234973961357578310f, + -0.972001665370963890f, + 0.234787578054001080f, -0.972046703194623380f, 0.234601186117955550f, + -0.972091705278904430f, + 0.234414785556295250f, -0.972136671622152120f, 0.234228376375873380f, + -0.972181602222713440f, + 0.234041958583543460f, -0.972226497078936270f, 0.233855532186159950f, + -0.972271356189170040f, + 0.233669097190576820f, -0.972316179551765300f, 0.233482653603649170f, + -0.972360967165074140f, + 0.233296201432231560f, -0.972405719027449770f, 0.233109740683179740f, + -0.972450435137246830f, + 0.232923271363349120f, -0.972495115492821190f, 0.232736793479595420f, + -0.972539760092530180f, + 0.232550307038775330f, -0.972584368934732210f, 0.232363812047745010f, + -0.972628942017787270f, + 0.232177308513361770f, -0.972673479340056430f, 0.231990796442482580f, + -0.972717980899902250f, + 0.231804275841964780f, -0.972762446695688570f, 0.231617746718666580f, + -0.972806876725780370f, + 0.231431209079445730f, -0.972851270988544180f, 0.231244662931161110f, + -0.972895629482347760f, + 0.231058108280671280f, -0.972939952205560070f, 0.230871545134835070f, + -0.972984239156551740f, + 0.230684973500512310f, -0.973028490333694100f, 0.230498393384562320f, + -0.973072705735360530f, + 0.230311804793845530f, -0.973116885359925130f, 0.230125207735222020f, + -0.973161029205763530f, + 0.229938602215552260f, -0.973205137271252800f, 0.229751988241697600f, + -0.973249209554771120f, + 0.229565365820518870f, -0.973293246054698250f, 0.229378734958878120f, + -0.973337246769414800f, + 0.229192095663636740f, -0.973381211697303290f, 0.229005447941657390f, + -0.973425140836747030f, + 0.228818791799802360f, -0.973469034186130950f, 0.228632127244934230f, + -0.973512891743841370f, + 0.228445454283916550f, -0.973556713508265560f, 0.228258772923612350f, + -0.973600499477792370f, + 0.228072083170885790f, -0.973644249650811870f, 0.227885385032600700f, + -0.973687964025715670f, + 0.227698678515621170f, -0.973731642600896400f, 0.227511963626812390f, + -0.973775285374748000f, + 0.227325240373038830f, -0.973818892345666100f, 0.227138508761166260f, + -0.973862463512047300f, + 0.226951768798059980f, -0.973905998872289460f, 0.226765020490585720f, + -0.973949498424792170f, + 0.226578263845610110f, -0.973992962167955830f, 0.226391498869999210f, + -0.974036390100182610f, + 0.226204725570620270f, -0.974079782219875680f, 0.226017943954340190f, + -0.974123138525439520f, + 0.225831154028026200f, -0.974166459015280320f, 0.225644355798546440f, + -0.974209743687805110f, + 0.225457549272768540f, -0.974252992541422500f, 0.225270734457561240f, + -0.974296205574542330f, + 0.225083911359792780f, -0.974339382785575860f, 0.224897079986332540f, + -0.974382524172935470f, + 0.224710240344049570f, -0.974425629735034990f, 0.224523392439813170f, + -0.974468699470289580f, + 0.224336536280493690f, -0.974511733377115720f, 0.224149671872960840f, + -0.974554731453931230f, + 0.223962799224085520f, -0.974597693699155050f, 0.223775918340738290f, + -0.974640620111207560f, + 0.223589029229790020f, -0.974683510688510670f, 0.223402131898112480f, + -0.974726365429487320f, + 0.223215226352576960f, -0.974769184332561770f, 0.223028312600055870f, + -0.974811967396159830f, + 0.222841390647421280f, -0.974854714618708430f, 0.222654460501545550f, + -0.974897425998635820f, + 0.222467522169301990f, -0.974940101534371720f, 0.222280575657563370f, + -0.974982741224347140f, + 0.222093620973203590f, -0.975025345066994120f, 0.221906658123096260f, + -0.975067913060746360f, + 0.221719687114115240f, -0.975110445204038890f, 0.221532707953135340f, + -0.975152941495307620f, + 0.221345720647030810f, -0.975195401932990370f, 0.221158725202677100f, + -0.975237826515525820f, + 0.220971721626949060f, -0.975280215241354220f, 0.220784709926722670f, + -0.975322568108916930f, + 0.220597690108873650f, -0.975364885116656870f, 0.220410662180277940f, + -0.975407166263018270f, + 0.220223626147812460f, -0.975449411546446380f, 0.220036582018353550f, + -0.975491620965388110f, + 0.219849529798778750f, -0.975533794518291360f, 0.219662469495965180f, + -0.975575932203605610f, + 0.219475401116790340f, -0.975618034019781750f, 0.219288324668132580f, + -0.975660099965271590f, + 0.219101240156869770f, -0.975702130038528570f, 0.218914147589880900f, + -0.975744124238007270f, + 0.218727046974044600f, -0.975786082562163930f, 0.218539938316239830f, + -0.975828005009455550f, + 0.218352821623346430f, -0.975869891578341030f, 0.218165696902243770f, + -0.975911742267280170f, + 0.217978564159812290f, -0.975953557074734300f, 0.217791423402932120f, + -0.975995335999165880f, + 0.217604274638483670f, -0.976037079039039020f, 0.217417117873348300f, + -0.976078786192818850f, + 0.217229953114406790f, -0.976120457458971910f, 0.217042780368541080f, + -0.976162092835966110f, + 0.216855599642632570f, -0.976203692322270560f, 0.216668410943563790f, + -0.976245255916355800f, + 0.216481214278216900f, -0.976286783616693630f, 0.216294009653474370f, + -0.976328275421757260f, + 0.216106797076219600f, -0.976369731330021140f, 0.215919576553335460f, + -0.976411151339961040f, + 0.215732348091705940f, -0.976452535450054060f, 0.215545111698214660f, + -0.976493883658778540f, + 0.215357867379745550f, -0.976535195964614470f, 0.215170615143183500f, + -0.976576472366042610f, + 0.214983354995412820f, -0.976617712861545640f, 0.214796086943318920f, + -0.976658917449606980f, + 0.214608810993786920f, -0.976700086128711840f, 0.214421527153702190f, + -0.976741218897346550f, + 0.214234235429951100f, -0.976782315753998650f, 0.214046935829419330f, + -0.976823376697157240f, + 0.213859628358993830f, -0.976864401725312640f, 0.213672313025561140f, + -0.976905390836956490f, + 0.213484989836008080f, -0.976946344030581560f, 0.213297658797222430f, + -0.976987261304682390f, + 0.213110319916091360f, -0.977028142657754390f, 0.212922973199503260f, + -0.977068988088294450f, + 0.212735618654345870f, -0.977109797594800880f, 0.212548256287508120f, + -0.977150571175773200f, + 0.212360886105878580f, -0.977191308829712280f, 0.212173508116346080f, + -0.977232010555120320f, + 0.211986122325800410f, -0.977272676350500860f, 0.211798728741130820f, + -0.977313306214358750f, + 0.211611327369227610f, -0.977353900145199960f, 0.211423918216980810f, + -0.977394458141532250f, + 0.211236501291280710f, -0.977434980201864260f, 0.211049076599018500f, + -0.977475466324706050f, + 0.210861644147084830f, -0.977515916508569280f, 0.210674203942371490f, + -0.977556330751966460f, + 0.210486755991769890f, -0.977596709053411780f, 0.210299300302171750f, + -0.977637051411420770f, + 0.210111836880469720f, -0.977677357824509930f, 0.209924365733555860f, + -0.977717628291197570f, + 0.209736886868323370f, -0.977757862810002760f, 0.209549400291665110f, + -0.977798061379446360f, + 0.209361906010474190f, -0.977838223998050430f, 0.209174404031644700f, + -0.977878350664338150f, + 0.208986894362070070f, -0.977918441376834370f, 0.208799377008644980f, + -0.977958496134064830f, + 0.208611851978263460f, -0.977998514934557140f, 0.208424319277820650f, + -0.978038497776839600f, + 0.208236778914211470f, -0.978078444659442380f, 0.208049230894330940f, + -0.978118355580896660f, + 0.207861675225075150f, -0.978158230539735050f, 0.207674111913339540f, + -0.978198069534491400f, + 0.207486540966020700f, -0.978237872563701090f, 0.207298962390014880f, + -0.978277639625900420f, + 0.207111376192218560f, -0.978317370719627650f, 0.206923782379529210f, + -0.978357065843421640f, + 0.206736180958843660f, -0.978396724995823090f, 0.206548571937059940f, + -0.978436348175373730f, + 0.206360955321075680f, -0.978475935380616830f, 0.206173331117788770f, + -0.978515486610096910f, + 0.205985699334098050f, -0.978555001862359550f, 0.205798059976901760f, + -0.978594481135952270f, + 0.205610413053099320f, -0.978633924429423100f, 0.205422758569589780f, + -0.978673331741322210f, + 0.205235096533272380f, -0.978712703070200420f, 0.205047426951047380f, + -0.978752038414610340f, + 0.204859749829814420f, -0.978791337773105670f, 0.204672065176474290f, + -0.978830601144241470f, + 0.204484372997927180f, -0.978869828526574120f, 0.204296673301074430f, + -0.978909019918661310f, + 0.204108966092817010f, -0.978948175319062200f, 0.203921251380056150f, + -0.978987294726337050f, + 0.203733529169694010f, -0.979026378139047580f, 0.203545799468632190f, + -0.979065425555756930f, + 0.203358062283773370f, -0.979104436975029250f, 0.203170317622019920f, + -0.979143412395430230f, + 0.202982565490274460f, -0.979182351815526930f, 0.202794805895440550f, + -0.979221255233887700f, + 0.202607038844421110f, -0.979260122649082020f, 0.202419264344120220f, + -0.979298954059681040f, + 0.202231482401441620f, -0.979337749464256780f, 0.202043693023289280f, + -0.979376508861383170f, + 0.201855896216568160f, -0.979415232249634780f, 0.201668091988182500f, + -0.979453919627588210f, + 0.201480280345037820f, -0.979492570993820700f, 0.201292461294039190f, + -0.979531186346911390f, + 0.201104634842091960f, -0.979569765685440520f, 0.200916800996102370f, + -0.979608309007989450f, + 0.200728959762976140f, -0.979646816313141210f, 0.200541111149620090f, + -0.979685287599479930f, + 0.200353255162940420f, -0.979723722865591170f, 0.200165391809844500f, + -0.979762122110061640f, + 0.199977521097239290f, -0.979800485331479680f, 0.199789643032032120f, + -0.979838812528434740f, + 0.199601757621131050f, -0.979877103699517640f, 0.199413864871443750f, + -0.979915358843320480f, + 0.199225964789878890f, -0.979953577958436740f, 0.199038057383344820f, + -0.979991761043461200f, + 0.198850142658750120f, -0.980029908096989980f, 0.198662220623004320f, + -0.980068019117620650f, + 0.198474291283016360f, -0.980106094103951770f, 0.198286354645696270f, + -0.980144133054583590f, + 0.198098410717953730f, -0.980182135968117320f, 0.197910459506698720f, + -0.980220102843155970f, + 0.197722501018842030f, -0.980258033678303550f, 0.197534535261294000f, + -0.980295928472165290f, + 0.197346562240966000f, -0.980333787223347960f, 0.197158581964769040f, + -0.980371609930459690f, + 0.196970594439614370f, -0.980409396592109910f, 0.196782599672414240f, + -0.980447147206909060f, + 0.196594597670080220f, -0.980484861773469380f, 0.196406588439525050f, + -0.980522540290404090f, + 0.196218571987660850f, -0.980560182756327950f, 0.196030548321400880f, + -0.980597789169856850f, + 0.195842517447657990f, -0.980635359529608120f, 0.195654479373345370f, + -0.980672893834200530f, + 0.195466434105377090f, -0.980710392082253970f, 0.195278381650666520f, + -0.980747854272389750f, + 0.195090322016128330f, -0.980785280403230430f, 0.194902255208676660f, + -0.980822670473399990f, + 0.194714181235225990f, -0.980860024481523870f, 0.194526100102691720f, + -0.980897342426228390f, + 0.194338011817988600f, -0.980934624306141640f, 0.194149916388032530f, + -0.980971870119892840f, + 0.193961813819739010f, -0.981009079866112630f, 0.193773704120023840f, + -0.981046253543432780f, + 0.193585587295803750f, -0.981083391150486590f, 0.193397463353994740f, + -0.981120492685908730f, + 0.193209332301514080f, -0.981157558148334830f, 0.193021194145278320f, + -0.981194587536402320f, + 0.192833048892205290f, -0.981231580848749730f, 0.192644896549212240f, + -0.981268538084016710f, + 0.192456737123216840f, -0.981305459240844670f, 0.192268570621137590f, + -0.981342344317875930f, + 0.192080397049892380f, -0.981379193313754560f, 0.191892216416400310f, + -0.981416006227125550f, + 0.191704028727579940f, -0.981452783056635520f, 0.191515833990350240f, + -0.981489523800932130f, + 0.191327632211630990f, -0.981526228458664660f, 0.191139423398341420f, + -0.981562897028483650f, + 0.190951207557401860f, -0.981599529509040720f, 0.190762984695732250f, + -0.981636125898989080f, + 0.190574754820252800f, -0.981672686196983110f, 0.190386517937884580f, + -0.981709210401678800f, + 0.190198274055548120f, -0.981745698511732990f, 0.190010023180165050f, + -0.981782150525804310f, + 0.189821765318656580f, -0.981818566442552500f, 0.189633500477944220f, + -0.981854946260638630f, + 0.189445228664950340f, -0.981891289978724990f, 0.189256949886596720f, + -0.981927597595475540f, + 0.189068664149806280f, -0.981963869109555240f, 0.188880371461501330f, + -0.982000104519630490f, + 0.188692071828605260f, -0.982036303824369020f, 0.188503765258041080f, + -0.982072467022439890f, + 0.188315451756732120f, -0.982108594112513610f, 0.188127131331602530f, + -0.982144685093261580f, + 0.187938803989575850f, -0.982180739963357200f, 0.187750469737576840f, + -0.982216758721474510f, + 0.187562128582529740f, -0.982252741366289370f, 0.187373780531359110f, + -0.982288687896478830f, + 0.187185425590990440f, -0.982324598310721160f, 0.186997063768348510f, + -0.982360472607696210f, + 0.186808695070359330f, -0.982396310786084690f, 0.186620319503948420f, + -0.982432112844569110f, + 0.186431937076041640f, -0.982467878781833170f, 0.186243547793565670f, + -0.982503608596561720f, + 0.186055151663446630f, -0.982539302287441240f, 0.185866748692611720f, + -0.982574959853159240f, + 0.185678338887987790f, -0.982610581292404750f, 0.185489922256501900f, + -0.982646166603868050f, + 0.185301498805082040f, -0.982681715786240860f, 0.185113068540655510f, + -0.982717228838215990f, + 0.184924631470150870f, -0.982752705758487830f, 0.184736187600495930f, + -0.982788146545751970f, + 0.184547736938619640f, -0.982823551198705240f, 0.184359279491450640f, + -0.982858919716046110f, + 0.184170815265917720f, -0.982894252096474070f, 0.183982344268950600f, + -0.982929548338690060f, + 0.183793866507478390f, -0.982964808441396440f, 0.183605381988431350f, + -0.983000032403296590f, + 0.183416890718739230f, -0.983035220223095640f, 0.183228392705332140f, + -0.983070371899499640f, + 0.183039887955141060f, -0.983105487431216290f, 0.182851376475096310f, + -0.983140566816954500f, + 0.182662858272129360f, -0.983175610055424420f, 0.182474333353171260f, + -0.983210617145337640f, + 0.182285801725153320f, -0.983245588085407070f, 0.182097263395007760f, + -0.983280522874346970f, + 0.181908718369666160f, -0.983315421510872810f, 0.181720166656061170f, + -0.983350283993701500f, + 0.181531608261125130f, -0.983385110321551180f, 0.181343043191790590f, + -0.983419900493141540f, + 0.181154471454990920f, -0.983454654507193270f, 0.180965893057658980f, + -0.983489372362428730f, + 0.180777308006728670f, -0.983524054057571260f, 0.180588716309133280f, + -0.983558699591345900f, + 0.180400117971807270f, -0.983593308962478650f, 0.180211513001684590f, + -0.983627882169697210f, + 0.180022901405699510f, -0.983662419211730250f, 0.179834283190787180f, + -0.983696920087308020f, + 0.179645658363882100f, -0.983731384795162090f, 0.179457026931919950f, + -0.983765813334025240f, + 0.179268388901835880f, -0.983800205702631490f, 0.179079744280565390f, + -0.983834561899716630f, + 0.178891093075044830f, -0.983868881924017220f, 0.178702435292209940f, + -0.983903165774271500f, + 0.178513770938997590f, -0.983937413449218920f, 0.178325100022344140f, + -0.983971624947600270f, + 0.178136422549186320f, -0.984005800268157870f, 0.177947738526461670f, + -0.984039939409634970f, + 0.177759047961107140f, -0.984074042370776450f, 0.177570350860060790f, + -0.984108109150328540f, + 0.177381647230260200f, -0.984142139747038570f, 0.177192937078643310f, + -0.984176134159655320f, + 0.177004220412148860f, -0.984210092386929030f, 0.176815497237715000f, + -0.984244014427611110f, + 0.176626767562280960f, -0.984277900280454370f, 0.176438031392785350f, + -0.984311749944212780f, + 0.176249288736167940f, -0.984345563417641900f, 0.176060539599367960f, + -0.984379340699498510f, + 0.175871783989325040f, -0.984413081788540700f, 0.175683021912979580f, + -0.984446786683527920f, + 0.175494253377271400f, -0.984480455383220930f, 0.175305478389141370f, + -0.984514087886381840f, + 0.175116696955530060f, -0.984547684191773960f, 0.174927909083378160f, + -0.984581244298162180f, + 0.174739114779627310f, -0.984614768204312600f, 0.174550314051218490f, + -0.984648255908992630f, + 0.174361506905093830f, -0.984681707410970940f, 0.174172693348194960f, + -0.984715122709017620f, + 0.173983873387463850f, -0.984748501801904210f, 0.173795047029843270f, + -0.984781844688403350f, + 0.173606214282275410f, -0.984815151367289140f, 0.173417375151703520f, + -0.984848421837337010f, + 0.173228529645070490f, -0.984881656097323700f, 0.173039677769319390f, + -0.984914854146027200f, + 0.172850819531394200f, -0.984948015982227030f, 0.172661954938238270f, + -0.984981141604703960f, + 0.172473083996796030f, -0.985014231012239840f, 0.172284206714011350f, + -0.985047284203618200f, + 0.172095323096829040f, -0.985080301177623800f, 0.171906433152193700f, + -0.985113281933042590f, + 0.171717536887049970f, -0.985146226468662230f, 0.171528634308343500f, + -0.985179134783271020f, + 0.171339725423019260f, -0.985212006875659460f, 0.171150810238023340f, + -0.985244842744618540f, + 0.170961888760301360f, -0.985277642388941220f, 0.170772960996799230f, + -0.985310405807421570f, + 0.170584026954463700f, -0.985343132998854790f, 0.170395086640240920f, + -0.985375823962037710f, + 0.170206140061078120f, -0.985408478695768420f, 0.170017187223922090f, + -0.985441097198846210f, + 0.169828228135719880f, -0.985473679470071810f, 0.169639262803419400f, + -0.985506225508247290f, + 0.169450291233967930f, -0.985538735312176060f, 0.169261313434313890f, + -0.985571208880662740f, + 0.169072329411405180f, -0.985603646212513400f, 0.168883339172190010f, + -0.985636047306535420f, + 0.168694342723617440f, -0.985668412161537550f, 0.168505340072635900f, + -0.985700740776329850f, + 0.168316331226194910f, -0.985733033149723490f, 0.168127316191243350f, + -0.985765289280531310f, + 0.167938294974731230f, -0.985797509167567370f, 0.167749267583608030f, + -0.985829692809647050f, + 0.167560234024823590f, -0.985861840205586980f, 0.167371194305328540f, + -0.985893951354205210f, + 0.167182148432072880f, -0.985926026254321130f, 0.166993096412007770f, + -0.985958064904755460f, + 0.166804038252083870f, -0.985990067304330030f, 0.166614973959252090f, + -0.986022033451868560f, + 0.166425903540464220f, -0.986053963346195440f, 0.166236827002671390f, + -0.986085856986136820f, + 0.166047744352825850f, -0.986117714370520090f, 0.165858655597879430f, + -0.986149535498173860f, + 0.165669560744784140f, -0.986181320367928270f, 0.165480459800492890f, + -0.986213068978614490f, + 0.165291352771957970f, -0.986244781329065460f, 0.165102239666132720f, + -0.986276457418114980f, + 0.164913120489970090f, -0.986308097244598670f, 0.164723995250423190f, + -0.986339700807353000f, + 0.164534863954446110f, -0.986371268105216030f, 0.164345726608992190f, + -0.986402799137027220f, + 0.164156583221015890f, -0.986434293901627070f, 0.163967433797471110f, + -0.986465752397857940f, + 0.163778278345312690f, -0.986497174624562880f, 0.163589116871495160f, + -0.986528560580586690f, + 0.163399949382973230f, -0.986559910264775410f, 0.163210775886702460f, + -0.986591223675976400f, + 0.163021596389637810f, -0.986622500813038480f, 0.162832410898735260f, + -0.986653741674811350f, + 0.162643219420950450f, -0.986684946260146690f, 0.162454021963239190f, + -0.986716114567897100f, + 0.162264818532558110f, -0.986747246596916480f, 0.162075609135863330f, + -0.986778342346060430f, + 0.161886393780111910f, -0.986809401814185420f, 0.161697172472260540f, + -0.986840425000149680f, + 0.161507945219266150f, -0.986871411902812470f, 0.161318712028086540f, + -0.986902362521034470f, + 0.161129472905678780f, -0.986933276853677710f, 0.160940227859001140f, + -0.986964154899605650f, + 0.160750976895011390f, -0.986994996657682870f, 0.160561720020667510f, + -0.987025802126775600f, + 0.160372457242928400f, -0.987056571305750970f, 0.160183188568752240f, + -0.987087304193477900f, + 0.159993914005098350f, -0.987118000788826280f, 0.159804633558925380f, + -0.987148661090667570f, + 0.159615347237193090f, -0.987179285097874340f, 0.159426055046860750f, + -0.987209872809320820f, + 0.159236756994887850f, -0.987240424223882250f, 0.159047453088234840f, + -0.987270939340435420f, + 0.158858143333861390f, -0.987301418157858430f, 0.158668827738728370f, + -0.987331860675030430f, + 0.158479506309796100f, -0.987362266890832400f, 0.158290179054025180f, + -0.987392636804146240f, + 0.158100845978377090f, -0.987422970413855410f, 0.157911507089812640f, + -0.987453267718844560f, + 0.157722162395293690f, -0.987483528717999710f, 0.157532811901781670f, + -0.987513753410208420f, + 0.157343455616238280f, -0.987543941794359230f, 0.157154093545626010f, + -0.987574093869342360f, + 0.156964725696906750f, -0.987604209634049160f, 0.156775352077043430f, + -0.987634289087372160f, + 0.156585972692998590f, -0.987664332228205710f, 0.156396587551734940f, + -0.987694339055445130f, + 0.156207196660216040f, -0.987724309567986960f, 0.156017800025404830f, + -0.987754243764729530f, + 0.155828397654265320f, -0.987784141644572180f, 0.155638989553760850f, + -0.987814003206415550f, + 0.155449575730855880f, -0.987843828449161740f, 0.155260156192514380f, + -0.987873617371714200f, + 0.155070730945700510f, -0.987903369972977790f, 0.154881299997379400f, + -0.987933086251858380f, + 0.154691863354515400f, -0.987962766207263420f, 0.154502421024073990f, + -0.987992409838101880f, + 0.154312973013020240f, -0.988022017143283530f, 0.154123519328319360f, + -0.988051588121720110f, + 0.153934059976937460f, -0.988081122772324070f, 0.153744594965840000f, + -0.988110621094009820f, + 0.153555124301993500f, -0.988140083085692570f, 0.153365647992364020f, + -0.988169508746289060f, + 0.153176166043917870f, -0.988198898074717610f, 0.152986678463622160f, + -0.988228251069897420f, + 0.152797185258443410f, -0.988257567730749460f, 0.152607686435349140f, + -0.988286848056195710f, + 0.152418182001306500f, -0.988316092045159690f, 0.152228671963282770f, + -0.988345299696566150f, + 0.152039156328246160f, -0.988374471009341280f, 0.151849635103164180f, + -0.988403605982412390f, + 0.151660108295005400f, -0.988432704614708340f, 0.151470575910737760f, + -0.988461766905159300f, + 0.151281037957330250f, -0.988490792852696590f, 0.151091494441751430f, + -0.988519782456253270f, + 0.150901945370970040f, -0.988548735714763200f, 0.150712390751955720f, + -0.988577652627162020f, + 0.150522830591677370f, -0.988606533192386450f, 0.150333264897105050f, + -0.988635377409374790f, + 0.150143693675208330f, -0.988664185277066230f, 0.149954116932956990f, + -0.988692956794401940f, + 0.149764534677321620f, -0.988721691960323780f, 0.149574946915272210f, + -0.988750390773775360f, + 0.149385353653779810f, -0.988779053233701520f, 0.149195754899814960f, + -0.988807679339048340f, + 0.149006150660348470f, -0.988836269088763540f, 0.148816540942352030f, + -0.988864822481795640f, + 0.148626925752796540f, -0.988893339517095130f, 0.148437305098654050f, + -0.988921820193613190f, + 0.148247678986896200f, -0.988950264510302990f, 0.148058047424494740f, + -0.988978672466118480f, + 0.147868410418422360f, -0.989007044060015270f, 0.147678767975650970f, + -0.989035379290950310f, + 0.147489120103153680f, -0.989063678157881540f, 0.147299466807902820f, + -0.989091940659768800f, + 0.147109808096871850f, -0.989120166795572690f, 0.146920143977033760f, + -0.989148356564255590f, + 0.146730474455361750f, -0.989176509964781010f, 0.146540799538829870f, + -0.989204626996113780f, + 0.146351119234411440f, -0.989232707657220050f, 0.146161433549080950f, + -0.989260751947067640f, + 0.145971742489812370f, -0.989288759864625170f, 0.145782046063579860f, + -0.989316731408863000f, + 0.145592344277358450f, -0.989344666578752640f, 0.145402637138122540f, + -0.989372565373267010f, + 0.145212924652847520f, -0.989400427791380380f, 0.145023206828508360f, + -0.989428253832068230f, + 0.144833483672080240f, -0.989456043494307710f, 0.144643755190539150f, + -0.989483796777076760f, + 0.144454021390860440f, -0.989511513679355190f, 0.144264282280020530f, + -0.989539194200123930f, + 0.144074537864995330f, -0.989566838338365120f, 0.143884788152761010f, + -0.989594446093062460f, + 0.143695033150294580f, -0.989622017463200780f, 0.143505272864572290f, + -0.989649552447766530f, + 0.143315507302571590f, -0.989677051045747210f, 0.143125736471269140f, + -0.989704513256131850f, + 0.142935960377642700f, -0.989731939077910570f, 0.142746179028669620f, + -0.989759328510075200f, + 0.142556392431327340f, -0.989786681551618640f, 0.142366600592594260f, + -0.989813998201535260f, + 0.142176803519448000f, -0.989841278458820530f, 0.141987001218867340f, + -0.989868522322471580f, + 0.141797193697830530f, -0.989895729791486660f, 0.141607380963316020f, + -0.989922900864865450f, + 0.141417563022303130f, -0.989950035541608990f, 0.141227739881770480f, + -0.989977133820719610f, + 0.141037911548697770f, -0.990004195701200910f, 0.140848078030064220f, + -0.990031221182058000f, + 0.140658239332849240f, -0.990058210262297120f, 0.140468395464033110f, + -0.990085162940925970f, + 0.140278546430595420f, -0.990112079216953770f, 0.140088692239516780f, + -0.990138959089390650f, + 0.139898832897777380f, -0.990165802557248400f, 0.139708968412357580f, + -0.990192609619540030f, + 0.139519098790238600f, -0.990219380275280000f, 0.139329224038400980f, + -0.990246114523483990f, + 0.139139344163826280f, -0.990272812363169110f, 0.138949459173495440f, + -0.990299473793353590f, + 0.138759569074390380f, -0.990326098813057330f, 0.138569673873492640f, + -0.990352687421301340f, + 0.138379773577783890f, -0.990379239617108160f, 0.138189868194246640f, + -0.990405755399501260f, + 0.137999957729862760f, -0.990432234767505970f, 0.137810042191615130f, + -0.990458677720148620f, + 0.137620121586486180f, -0.990485084256456980f, 0.137430195921458550f, + -0.990511454375460290f, + 0.137240265203515700f, -0.990537788076188750f, 0.137050329439640380f, + -0.990564085357674370f, + 0.136860388636816430f, -0.990590346218950150f, 0.136670442802027230f, + -0.990616570659050620f, + 0.136480491942256310f, -0.990642758677011570f, 0.136290536064488070f, + -0.990668910271869980f, + 0.136100575175706200f, -0.990695025442664630f, 0.135910609282895440f, + -0.990721104188435180f, + 0.135720638393040080f, -0.990747146508222710f, 0.135530662513124620f, + -0.990773152401069780f, + 0.135340681650134330f, -0.990799121866020370f, 0.135150695811053850f, + -0.990825054902119470f, + 0.134960705002868830f, -0.990850951508413620f, 0.134770709232564290f, + -0.990876811683950810f, + 0.134580708507126220f, -0.990902635427780010f, 0.134390702833540240f, + -0.990928422738951990f, + 0.134200692218792020f, -0.990954173616518500f, 0.134010676669868210f, + -0.990979888059532740f, + 0.133820656193754690f, -0.991005566067049370f, 0.133630630797438390f, + -0.991031207638124130f, + 0.133440600487905820f, -0.991056812771814340f, 0.133250565272143570f, + -0.991082381467178640f, + 0.133060525157139180f, -0.991107913723276780f, 0.132870480149879400f, + -0.991133409539170170f, + 0.132680430257352130f, -0.991158868913921350f, 0.132490375486544710f, + -0.991184291846594180f, + 0.132300315844444680f, -0.991209678336254060f, 0.132110251338040470f, + -0.991235028381967420f, + 0.131920181974319760f, -0.991260341982802440f, 0.131730107760271280f, + -0.991285619137828200f, + 0.131540028702883280f, -0.991310859846115440f, 0.131349944809144220f, + -0.991336064106736140f, + 0.131159856086043410f, -0.991361231918763460f, 0.130969762540569380f, + -0.991386363281272280f, + 0.130779664179711790f, -0.991411458193338540f, 0.130589561010459600f, + -0.991436516654039420f, + 0.130399453039802740f, -0.991461538662453790f, 0.130209340274730770f, + -0.991486524217661480f, + 0.130019222722233350f, -0.991511473318743900f, 0.129829100389301010f, + -0.991536385964783880f, + 0.129638973282923540f, -0.991561262154865290f, 0.129448841410091830f, + -0.991586101888073500f, + 0.129258704777796270f, -0.991610905163495370f, 0.129068563393027410f, + -0.991635671980218740f, + 0.128878417262776660f, -0.991660402337333210f, 0.128688266394034690f, + -0.991685096233929530f, + 0.128498110793793220f, -0.991709753669099530f, 0.128307950469043590f, + -0.991734374641936810f, + 0.128117785426777150f, -0.991758959151536110f, 0.127927615673986190f, + -0.991783507196993490f, + 0.127737441217662280f, -0.991808018777406430f, 0.127547262064798050f, + -0.991832493891873780f, + 0.127357078222385570f, -0.991856932539495360f, 0.127166889697417180f, + -0.991881334719373010f, + 0.126976696496885980f, -0.991905700430609330f, 0.126786498627784430f, + -0.991930029672308480f, + 0.126596296097105960f, -0.991954322443575950f, 0.126406088911843320f, + -0.991978578743518580f, + 0.126215877078990400f, -0.992002798571244520f, 0.126025660605540460f, + -0.992026981925863360f, + 0.125835439498487020f, -0.992051128806485720f, 0.125645213764824380f, + -0.992075239212224070f, + 0.125454983411546210f, -0.992099313142191800f, 0.125264748445647110f, + -0.992123350595503720f, + 0.125074508874121300f, -0.992147351571276090f, 0.124884264703963150f, + -0.992171316068626520f, + 0.124694015942167770f, -0.992195244086673920f, 0.124503762595729650f, + -0.992219135624538450f, + 0.124313504671644300f, -0.992242990681341700f, 0.124123242176906760f, + -0.992266809256206580f, + 0.123932975118512200f, -0.992290591348257370f, 0.123742703503456630f, + -0.992314336956619640f, + 0.123552427338735370f, -0.992338046080420420f, 0.123362146631344750f, + -0.992361718718787870f, + 0.123171861388280650f, -0.992385354870851670f, 0.122981571616539080f, + -0.992408954535742850f, + 0.122791277323116900f, -0.992432517712593550f, 0.122600978515010240f, + -0.992456044400537700f, + 0.122410675199216280f, -0.992479534598709970f, 0.122220367382731500f, + -0.992502988306246950f, + 0.122030055072553410f, -0.992526405522286100f, 0.121839738275679020f, + -0.992549786245966570f, + 0.121649416999105540f, -0.992573130476428810f, 0.121459091249830950f, + -0.992596438212814290f, + 0.121268761034852550f, -0.992619709454266140f, 0.121078426361168710f, + -0.992642944199928820f, + 0.120888087235777220f, -0.992666142448948020f, 0.120697743665676120f, + -0.992689304200470750f, + 0.120507395657864240f, -0.992712429453645460f, 0.120317043219339670f, + -0.992735518207621850f, + 0.120126686357101580f, -0.992758570461551140f, 0.119936325078148620f, + -0.992781586214585570f, + 0.119745959389479630f, -0.992804565465879140f, 0.119555589298094230f, + -0.992827508214586760f, + 0.119365214810991350f, -0.992850414459865100f, 0.119174835935170960f, + -0.992873284200871730f, + 0.118984452677632520f, -0.992896117436765980f, 0.118794065045375670f, + -0.992918914166708300f, + 0.118603673045400840f, -0.992941674389860470f, 0.118413276684707770f, + -0.992964398105385610f, + 0.118222875970297250f, -0.992987085312448390f, 0.118032470909169300f, + -0.993009736010214580f, + 0.117842061508325020f, -0.993032350197851410f, 0.117651647774765000f, + -0.993054927874527320f, + 0.117461229715489990f, -0.993077469039412300f, 0.117270807337501560f, + -0.993099973691677570f, + 0.117080380647800550f, -0.993122441830495580f, 0.116889949653388850f, + -0.993144873455040430f, + 0.116699514361267840f, -0.993167268564487230f, 0.116509074778439050f, + -0.993189627158012620f, + 0.116318630911904880f, -0.993211949234794500f, 0.116128182768666920f, + -0.993234234794012290f, + 0.115937730355727850f, -0.993256483834846440f, 0.115747273680089870f, + -0.993278696356479030f, + 0.115556812748755290f, -0.993300872358093280f, 0.115366347568727250f, + -0.993323011838873950f, + 0.115175878147008180f, -0.993345114798006910f, 0.114985404490601530f, + -0.993367181234679600f, + 0.114794926606510250f, -0.993389211148080650f, 0.114604444501737460f, + -0.993411204537400060f, + 0.114413958183287050f, -0.993433161401829360f, 0.114223467658162260f, + -0.993455081740560960f, + 0.114032972933367300f, -0.993476965552789190f, 0.113842474015905660f, + -0.993498812837709360f, + 0.113651970912781920f, -0.993520623594518090f, 0.113461463631000080f, + -0.993542397822413600f, + 0.113270952177564360f, -0.993564135520595300f, 0.113080436559479720f, + -0.993585836688263950f, + 0.112889916783750470f, -0.993607501324621610f, 0.112699392857381910f, + -0.993629129428871720f, + 0.112508864787378830f, -0.993650721000219120f, 0.112318332580746190f, + -0.993672276037870010f, + 0.112127796244489750f, -0.993693794541031680f, 0.111937255785614560f, + -0.993715276508913230f, + 0.111746711211126660f, -0.993736721940724600f, 0.111556162528031630f, + -0.993758130835677430f, + 0.111365609743335190f, -0.993779503192984580f, 0.111175052864043830f, + -0.993800839011860120f, + 0.110984491897163380f, -0.993822138291519660f, 0.110793926849700630f, + -0.993843401031180180f, + 0.110603357728661910f, -0.993864627230059750f, 0.110412784541053660f, + -0.993885816887378090f, + 0.110222207293883180f, -0.993906970002356060f, 0.110031625994157000f, + -0.993928086574215830f, + 0.109841040648882680f, -0.993949166602181130f, 0.109650451265067080f, + -0.993970210085476920f, + 0.109459857849718030f, -0.993991217023329380f, 0.109269260409842920f, + -0.994012187414966220f, + 0.109078658952449240f, -0.994033121259616400f, 0.108888053484545310f, + -0.994054018556510210f, + 0.108697444013138670f, -0.994074879304879370f, 0.108506830545237980f, + -0.994095703503956930f, + 0.108316213087851300f, -0.994116491152977070f, 0.108125591647986880f, + -0.994137242251175720f, + 0.107934966232653760f, -0.994157956797789730f, 0.107744336848860260f, + -0.994178634792057590f, + 0.107553703503615710f, -0.994199276233218910f, 0.107363066203928920f, + -0.994219881120514850f, + 0.107172424956808870f, -0.994240449453187900f, 0.106981779769265340f, + -0.994260981230481790f, + 0.106791130648307380f, -0.994281476451641550f, 0.106600477600945030f, + -0.994301935115913580f, + 0.106409820634187840f, -0.994322357222545810f, 0.106219159755045520f, + -0.994342742770787270f, + 0.106028494970528530f, -0.994363091759888570f, 0.105837826287646670f, + -0.994383404189101430f, + 0.105647153713410700f, -0.994403680057679100f, 0.105456477254830660f, + -0.994423919364875950f, + 0.105265796918917650f, -0.994444122109948040f, 0.105075112712682180f, + -0.994464288292152390f, + 0.104884424643134970f, -0.994484417910747600f, 0.104693732717287500f, + -0.994504510964993590f, + 0.104503036942150550f, -0.994524567454151740f, 0.104312337324735870f, + -0.994544587377484300f, + 0.104121633872054730f, -0.994564570734255420f, 0.103930926591118540f, + -0.994584517523730340f, + 0.103740215488939480f, -0.994604427745175660f, 0.103549500572529040f, + -0.994624301397859400f, + 0.103358781848899700f, -0.994644138481050710f, 0.103168059325063390f, + -0.994663938994020280f, + 0.102977333008032250f, -0.994683702936040250f, 0.102786602904819150f, + -0.994703430306383860f, + 0.102595869022436280f, -0.994723121104325700f, 0.102405131367896790f, + -0.994742775329142010f, + 0.102214389948213370f, -0.994762392980109930f, 0.102023644770398800f, + -0.994781974056508260f, + 0.101832895841466670f, -0.994801518557617110f, 0.101642143168429830f, + -0.994821026482717860f, + 0.101451386758302160f, -0.994840497831093180f, 0.101260626618096800f, + -0.994859932602027320f, + 0.101069862754827880f, -0.994879330794805620f, 0.100879095175509010f, + -0.994898692408714870f, + 0.100688323887153970f, -0.994918017443043200f, 0.100497548896777310f, + -0.994937305897080070f, + 0.100306770211392820f, -0.994956557770116380f, 0.100115987838015370f, + -0.994975773061444140f, + 0.099925201783659226f, -0.994994951770357020f, 0.099734412055338839f, + -0.995014093896149700f, + 0.099543618660069444f, -0.995033199438118630f, 0.099352821604865513f, + -0.995052268395561160f, + 0.099162020896742573f, -0.995071300767776170f, 0.098971216542715582f, + -0.995090296554063890f, + 0.098780408549799664f, -0.995109255753726110f, 0.098589596925010708f, + -0.995128178366065490f, + 0.098398781675363881f, -0.995147064390386470f, 0.098207962807875346f, + -0.995165913825994620f, + 0.098017140329560770f, -0.995184726672196820f, 0.097826314247435903f, + -0.995203502928301510f, + 0.097635484568517339f, -0.995222242593618240f, 0.097444651299820870f, + -0.995240945667458130f, + 0.097253814448363354f, -0.995259612149133390f, 0.097062974021160875f, + -0.995278242037957670f, + 0.096872130025230527f, -0.995296835333246090f, 0.096681282467588864f, + -0.995315392034315070f, + 0.096490431355252607f, -0.995333912140482280f, 0.096299576695239225f, + -0.995352395651066810f, + 0.096108718494565468f, -0.995370842565388990f, 0.095917856760249096f, + -0.995389252882770690f, + 0.095726991499307315f, -0.995407626602534900f, 0.095536122718757485f, + -0.995425963724006160f, + 0.095345250425617742f, -0.995444264246510340f, 0.095154374626905472f, + -0.995462528169374420f, + 0.094963495329639061f, -0.995480755491926940f, 0.094772612540836410f, + -0.995498946213497770f, + 0.094581726267515473f, -0.995517100333418110f, 0.094390836516695067f, + -0.995535217851020390f, + 0.094199943295393190f, -0.995553298765638470f, 0.094009046610628907f, + -0.995571343076607770f, + 0.093818146469420494f, -0.995589350783264600f, 0.093627242878787237f, + -0.995607321884947050f, + 0.093436335845747912f, -0.995625256380994310f, 0.093245425377321389f, + -0.995643154270746900f, + 0.093054511480527333f, -0.995661015553546910f, 0.092863594162384697f, + -0.995678840228737540f, + 0.092672673429913366f, -0.995696628295663520f, 0.092481749290132753f, + -0.995714379753670610f, + 0.092290821750062355f, -0.995732094602106430f, 0.092099890816722485f, + -0.995749772840319400f, + 0.091908956497132696f, -0.995767414467659820f, 0.091718018798313525f, + -0.995785019483478750f, + 0.091527077727284981f, -0.995802587887129160f, 0.091336133291067212f, + -0.995820119677964910f, + 0.091145185496681130f, -0.995837614855341610f, 0.090954234351146898f, + -0.995855073418615790f, + 0.090763279861485704f, -0.995872495367145730f, 0.090572322034718156f, + -0.995889880700290720f, + 0.090381360877865011f, -0.995907229417411720f, 0.090190396397947820f, + -0.995924541517870690f, + 0.089999428601987341f, -0.995941817001031350f, 0.089808457497005362f, + -0.995959055866258320f, + 0.089617483090022917f, -0.995976258112917790f, 0.089426505388062016f, + -0.995993423740377360f, + 0.089235524398144139f, -0.996010552748005870f, 0.089044540127290905f, + -0.996027645135173610f, + 0.088853552582524684f, -0.996044700901251970f, 0.088662561770867121f, + -0.996061720045614000f, + 0.088471567699340822f, -0.996078702567633980f, 0.088280570374967879f, + -0.996095648466687300f, + 0.088089569804770507f, -0.996112557742151130f, 0.087898565995771685f, + -0.996129430393403740f, + 0.087707558954993645f, -0.996146266419824620f, 0.087516548689459586f, + -0.996163065820794950f, + 0.087325535206192226f, -0.996179828595696870f, 0.087134518512214321f, + -0.996196554743914220f, + 0.086943498614549489f, -0.996213244264832040f, 0.086752475520220515f, + -0.996229897157836500f, + 0.086561449236251239f, -0.996246513422315520f, 0.086370419769664919f, + -0.996263093057658030f, + 0.086179387127484922f, -0.996279636063254650f, 0.085988351316735448f, + -0.996296142438496850f, + 0.085797312344439880f, -0.996312612182778000f, 0.085606270217622613f, + -0.996329045295492380f, + 0.085415224943307277f, -0.996345441776035900f, 0.085224176528518519f, + -0.996361801623805720f, + 0.085033124980280414f, -0.996378124838200210f, 0.084842070305617148f, + -0.996394411418619290f, + 0.084651012511553700f, -0.996410661364464100f, 0.084459951605114297f, + -0.996426874675137240f, + 0.084268887593324127f, -0.996443051350042630f, 0.084077820483207846f, + -0.996459191388585410f, + 0.083886750281790226f, -0.996475294790172160f, 0.083695676996096827f, + -0.996491361554210920f, + 0.083504600633152404f, -0.996507391680110820f, 0.083313521199982740f, + -0.996523385167282450f, + 0.083122438703613077f, -0.996539342015137940f, 0.082931353151068726f, + -0.996555262223090540f, + 0.082740264549375803f, -0.996571145790554840f, 0.082549172905559659f, + -0.996586992716946950f, + 0.082358078226646619f, -0.996602803001684130f, 0.082166980519662466f, + -0.996618576644185070f, + 0.081975879791633108f, -0.996634313643869900f, 0.081784776049585201f, + -0.996650014000160070f, + 0.081593669300544638f, -0.996665677712478160f, 0.081402559551538328f, + -0.996681304780248300f, + 0.081211446809592386f, -0.996696895202896060f, 0.081020331081733912f, + -0.996712448979848010f, + 0.080829212374989468f, -0.996727966110532490f, 0.080638090696385709f, + -0.996743446594378860f, + 0.080446966052950097f, -0.996758890430818000f, 0.080255838451709291f, + -0.996774297619282050f, + 0.080064707899690932f, -0.996789668159204560f, 0.079873574403922148f, + -0.996805002050020320f, + 0.079682437971430126f, -0.996820299291165670f, 0.079491298609242866f, + -0.996835559882078170f, + 0.079300156324387569f, -0.996850783822196610f, 0.079109011123892431f, + -0.996865971110961310f, + 0.078917863014785095f, -0.996881121747813850f, 0.078726712004093313f, + -0.996896235732197210f, + 0.078535558098845590f, -0.996911313063555740f, 0.078344401306069678f, + -0.996926353741335090f, + 0.078153241632794315f, -0.996941357764982160f, 0.077962079086047645f, + -0.996956325133945280f, + 0.077770913672857989f, -0.996971255847674320f, 0.077579745400254363f, + -0.996986149905620180f, + 0.077388574275265049f, -0.997001007307235290f, 0.077197400304919297f, + -0.997015828051973310f, + 0.077006223496245585f, -0.997030612139289450f, 0.076815043856273399f, + -0.997045359568640040f, + 0.076623861392031617f, -0.997060070339482960f, 0.076432676110549283f, + -0.997074744451277310f, + 0.076241488018856149f, -0.997089381903483400f, 0.076050297123981231f, + -0.997103982695563330f, + 0.075859103432954503f, -0.997118546826979980f, 0.075667906952805383f, + -0.997133074297198110f, + 0.075476707690563416f, -0.997147565105683480f, 0.075285505653258880f, + -0.997162019251903290f, + 0.075094300847921291f, -0.997176436735326190f, 0.074903093281581137f, + -0.997190817555421940f, + 0.074711882961268378f, -0.997205161711661850f, 0.074520669894013014f, + -0.997219469203518670f, + 0.074329454086845867f, -0.997233740030466160f, 0.074138235546796952f, + -0.997247974191979860f, + 0.073947014280897269f, -0.997262171687536170f, 0.073755790296177265f, + -0.997276332516613180f, + 0.073564563599667454f, -0.997290456678690210f, 0.073373334198399157f, + -0.997304544173247990f, + 0.073182102099402888f, -0.997318594999768600f, 0.072990867309710133f, + -0.997332609157735470f, + 0.072799629836351618f, -0.997346586646633230f, 0.072608389686359048f, + -0.997360527465947940f, + 0.072417146866763538f, -0.997374431615167030f, 0.072225901384596336f, + -0.997388299093779460f, + 0.072034653246889416f, -0.997402129901275300f, 0.071843402460674000f, + -0.997415924037145960f, + 0.071652149032982254f, -0.997429681500884180f, 0.071460892970845832f, + -0.997443402291984360f, + 0.071269634281296415f, -0.997457086409941910f, 0.071078372971366502f, + -0.997470733854253670f, + 0.070887109048087787f, -0.997484344624417930f, 0.070695842518492924f, + -0.997497918719934210f, + 0.070504573389614009f, -0.997511456140303450f, 0.070313301668483263f, + -0.997524956885027960f, + 0.070122027362133646f, -0.997538420953611230f, 0.069930750477597295f, + -0.997551848345558430f, + 0.069739471021907376f, -0.997565239060375750f, 0.069548189002096472f, + -0.997578593097570800f, + 0.069356904425197236f, -0.997591910456652630f, 0.069165617298243109f, + -0.997605191137131640f, + 0.068974327628266732f, -0.997618435138519550f, 0.068783035422301728f, + -0.997631642460329320f, + 0.068591740687380900f, -0.997644813102075420f, 0.068400443430538069f, + -0.997657947063273710f, + 0.068209143658806454f, -0.997671044343441000f, 0.068017841379219388f, + -0.997684104942096030f, + 0.067826536598810966f, -0.997697128858758500f, 0.067635229324614451f, + -0.997710116092949570f, + 0.067443919563664106f, -0.997723066644191640f, 0.067252607322993652f, + -0.997735980512008620f, + 0.067061292609636836f, -0.997748857695925690f, 0.066869975430628226f, + -0.997761698195469560f, + 0.066678655793001543f, -0.997774502010167820f, 0.066487333703791507f, + -0.997787269139549960f, + 0.066296009170032283f, -0.997799999583146470f, 0.066104682198758091f, + -0.997812693340489280f, + 0.065913352797003930f, -0.997825350411111640f, 0.065722020971803977f, + -0.997837970794548280f, + 0.065530686730193397f, -0.997850554490335110f, 0.065339350079206798f, + -0.997863101498009500f, + 0.065148011025878860f, -0.997875611817110150f, 0.064956669577245010f, + -0.997888085447177110f, + 0.064765325740339871f, -0.997900522387751620f, 0.064573979522199065f, + -0.997912922638376610f, + 0.064382630929857410f, -0.997925286198596000f, 0.064191279970350679f, + -0.997937613067955250f, + 0.063999926650714078f, -0.997949903246001190f, 0.063808570977982898f, + -0.997962156732281950f, + 0.063617212959193190f, -0.997974373526346990f, 0.063425852601380200f, + -0.997986553627747020f, + 0.063234489911580136f, -0.997998697036034390f, 0.063043124896828631f, + -0.998010803750762450f, + 0.062851757564161420f, -0.998022873771486240f, 0.062660387920614985f, + -0.998034907097761770f, + 0.062469015973224969f, -0.998046903729146840f, 0.062277641729028041f, + -0.998058863665200250f, + 0.062086265195060247f, -0.998070786905482340f, 0.061894886378357744f, + -0.998082673449554590f, + 0.061703505285957416f, -0.998094523296980010f, 0.061512121924895365f, + -0.998106336447323050f, + 0.061320736302208648f, -0.998118112900149180f, 0.061129348424933755f, + -0.998129852655025520f, + 0.060937958300107238f, -0.998141555711520520f, 0.060746565934766412f, + -0.998153222069203650f, + 0.060555171335947781f, -0.998164851727646240f, 0.060363774510688827f, + -0.998176444686420530f, + 0.060172375466026218f, -0.998188000945100300f, 0.059980974208997596f, + -0.998199520503260660f, + 0.059789570746640007f, -0.998211003360478190f, 0.059598165085990598f, + -0.998222449516330550f, + 0.059406757234087247f, -0.998233858970396850f, 0.059215347197967026f, + -0.998245231722257880f, + 0.059023934984667986f, -0.998256567771495180f, 0.058832520601227581f, + -0.998267867117692110f, + 0.058641104054683348f, -0.998279129760433200f, 0.058449685352073573f, + -0.998290355699304350f, + 0.058258264500435732f, -0.998301544933892890f, 0.058066841506808263f, + -0.998312697463787260f, + 0.057875416378229017f, -0.998323813288577560f, 0.057683989121735932f, + -0.998334892407855000f, + 0.057492559744367684f, -0.998345934821212370f, 0.057301128253162144f, + -0.998356940528243420f, + 0.057109694655158132f, -0.998367909528543820f, 0.056918258957393907f, + -0.998378841821709990f, + 0.056726821166907783f, -0.998389737407340160f, 0.056535381290738825f, + -0.998400596285033640f, + 0.056343939335925283f, -0.998411418454391300f, 0.056152495309506383f, + -0.998422203915015020f, + 0.055961049218520520f, -0.998432952666508440f, 0.055769601070007072f, + -0.998443664708476340f, + 0.055578150871004817f, -0.998454340040524800f, 0.055386698628552604f, + -0.998464978662261250f, + 0.055195244349690031f, -0.998475580573294770f, 0.055003788041455885f, + -0.998486145773235360f, + 0.054812329710889909f, -0.998496674261694640f, 0.054620869365031251f, + -0.998507166038285490f, + 0.054429407010919147f, -0.998517621102622210f, 0.054237942655593556f, + -0.998528039454320230f, + 0.054046476306093640f, -0.998538421092996730f, 0.053855007969459509f, + -0.998548766018269920f, + 0.053663537652730679f, -0.998559074229759310f, 0.053472065362946755f, + -0.998569345727086110f, + 0.053280591107148056f, -0.998579580509872500f, 0.053089114892374119f, + -0.998589778577742230f, + 0.052897636725665401f, -0.998599939930320370f, 0.052706156614061798f, + -0.998610064567233340f, + 0.052514674564603257f, -0.998620152488108870f, 0.052323190584330471f, + -0.998630203692576050f, + 0.052131704680283317f, -0.998640218180265270f, 0.051940216859502626f, + -0.998650195950808280f, + 0.051748727129028414f, -0.998660137003838490f, 0.051557235495901653f, + -0.998670041338990070f, + 0.051365741967162731f, -0.998679908955899090f, 0.051174246549852087f, + -0.998689739854202620f, + 0.050982749251010900f, -0.998699534033539280f, 0.050791250077679546f, + -0.998709291493549030f, + 0.050599749036899337f, -0.998719012233872940f, 0.050408246135710995f, + -0.998728696254153720f, + 0.050216741381155325f, -0.998738343554035230f, 0.050025234780273840f, + -0.998747954133162860f, + 0.049833726340107257f, -0.998757527991183340f, 0.049642216067697226f, + -0.998767065127744380f, + 0.049450703970084824f, -0.998776565542495610f, 0.049259190054311168f, + -0.998786029235087640f, + 0.049067674327418126f, -0.998795456205172410f, 0.048876156796446746f, + -0.998804846452403420f, + 0.048684637468439020f, -0.998814199976435390f, 0.048493116350436342f, + -0.998823516776924380f, + 0.048301593449480172f, -0.998832796853527990f, 0.048110068772612716f, + -0.998842040205904840f, + 0.047918542326875327f, -0.998851246833715180f, 0.047727014119310344f, + -0.998860416736620520f, + 0.047535484156959261f, -0.998869549914283560f, 0.047343952446864526f, + -0.998878646366368690f, + 0.047152418996068000f, -0.998887706092541290f, 0.046960883811611599f, + -0.998896729092468410f, + 0.046769346900537960f, -0.998905715365818290f, 0.046577808269888908f, + -0.998914664912260440f, + 0.046386267926707213f, -0.998923577731465780f, 0.046194725878035046f, + -0.998932453823106690f, + 0.046003182130914644f, -0.998941293186856870f, 0.045811636692388955f, + -0.998950095822391250f, + 0.045620089569500123f, -0.998958861729386080f, 0.045428540769291224f, + -0.998967590907519300f, + 0.045236990298804750f, -0.998976283356469820f, 0.045045438165083225f, + -0.998984939075918010f, + 0.044853884375169933f, -0.998993558065545680f, 0.044662328936107311f, + -0.999002140325035980f, + 0.044470771854938744f, -0.999010685854073380f, 0.044279213138707016f, + -0.999019194652343460f, + 0.044087652794454979f, -0.999027666719533690f, 0.043896090829226200f, + -0.999036102055332330f, + 0.043704527250063421f, -0.999044500659429290f, 0.043512962064010327f, + -0.999052862531515930f, + 0.043321395278109784f, -0.999061187671284600f, 0.043129826899405595f, + -0.999069476078429330f, + 0.042938256934940959f, -0.999077727752645360f, 0.042746685391759139f, + -0.999085942693629270f, + 0.042555112276904117f, -0.999094120901079070f, 0.042363537597419038f, + -0.999102262374694130f, + 0.042171961360348002f, -0.999110367114174890f, 0.041980383572734502f, + -0.999118435119223490f, + 0.041788804241622082f, -0.999126466389543390f, 0.041597223374055005f, + -0.999134460924839150f, + 0.041405640977076712f, -0.999142418724816910f, 0.041214057057731589f, + -0.999150339789184110f, + 0.041022471623063397f, -0.999158224117649430f, 0.040830884680115968f, + -0.999166071709923000f, + 0.040639296235933854f, -0.999173882565716380f, 0.040447706297560768f, + -0.999181656684742350f, + 0.040256114872041358f, -0.999189394066714920f, 0.040064521966419686f, + -0.999197094711349880f, + 0.039872927587739845f, -0.999204758618363890f, 0.039681331743046659f, + -0.999212385787475290f, + 0.039489734439384118f, -0.999219976218403530f, 0.039298135683797149f, + -0.999227529910869610f, + 0.039106535483329839f, -0.999235046864595850f, 0.038914933845027241f, + -0.999242527079305830f, + 0.038723330775933762f, -0.999249970554724420f, 0.038531726283093877f, + -0.999257377290578060f, + 0.038340120373552791f, -0.999264747286594420f, 0.038148513054354856f, + -0.999272080542502610f, + 0.037956904332545366f, -0.999279377058032710f, 0.037765294215169005f, + -0.999286636832916740f, + 0.037573682709270514f, -0.999293859866887790f, 0.037382069821895340f, + -0.999301046159680070f, + 0.037190455560088091f, -0.999308195711029470f, 0.036998839930894332f, + -0.999315308520673070f, + 0.036807222941358991f, -0.999322384588349540f, 0.036615604598527057f, + -0.999329423913798420f, + 0.036423984909444228f, -0.999336426496761240f, 0.036232363881155374f, + -0.999343392336980220f, + 0.036040741520706299f, -0.999350321434199440f, 0.035849117835142184f, + -0.999357213788164000f, + 0.035657492831508264f, -0.999364069398620550f, 0.035465866516850478f, + -0.999370888265317060f, + 0.035274238898213947f, -0.999377670388002850f, 0.035082609982644702f, + -0.999384415766428560f, + 0.034890979777187955f, -0.999391124400346050f, 0.034699348288889847f, + -0.999397796289508640f, + 0.034507715524795889f, -0.999404431433671300f, 0.034316081491951658f, + -0.999411029832589780f, + 0.034124446197403423f, -0.999417591486021720f, 0.033932809648196623f, + -0.999424116393725640f, + 0.033741171851377642f, -0.999430604555461730f, 0.033549532813992221f, + -0.999437055970991530f, + 0.033357892543086159f, -0.999443470640077770f, 0.033166251045705968f, + -0.999449848562484530f, + 0.032974608328897315f, -0.999456189737977340f, 0.032782964399706793f, + -0.999462494166323160f, + 0.032591319265180385f, -0.999468761847290050f, 0.032399672932364114f, + -0.999474992780647780f, + 0.032208025408304704f, -0.999481186966166950f, 0.032016376700048046f, + -0.999487344403620080f, + 0.031824726814640963f, -0.999493465092780590f, 0.031633075759129645f, + -0.999499549033423640f, + 0.031441423540560343f, -0.999505596225325310f, 0.031249770165979990f, + -0.999511606668263440f, + 0.031058115642434700f, -0.999517580362016990f, 0.030866459976971503f, + -0.999523517306366350f, + 0.030674803176636581f, -0.999529417501093140f, 0.030483145248477058f, + -0.999535280945980540f, + 0.030291486199539423f, -0.999541107640812940f, 0.030099826036870208f, + -0.999546897585375960f, + 0.029908164767516655f, -0.999552650779456990f, 0.029716502398525156f, + -0.999558367222844300f, + 0.029524838936943035f, -0.999564046915327740f, 0.029333174389816984f, + -0.999569689856698580f, + 0.029141508764193740f, -0.999575296046749220f, 0.028949842067120746f, + -0.999580865485273700f, + 0.028758174305644590f, -0.999586398172067070f, 0.028566505486812797f, + -0.999591894106925950f, + 0.028374835617672258f, -0.999597353289648380f, 0.028183164705269902f, + -0.999602775720033530f, + 0.027991492756653365f, -0.999608161397882110f, 0.027799819778869434f, + -0.999613510322995950f, + 0.027608145778965820f, -0.999618822495178640f, 0.027416470763989606f, + -0.999624097914234570f, + 0.027224794740987910f, -0.999629336579970110f, 0.027033117717008563f, + -0.999634538492192300f, + 0.026841439699098527f, -0.999639703650710200f, 0.026649760694305708f, + -0.999644832055333610f, + 0.026458080709677145f, -0.999649923705874240f, 0.026266399752260809f, + -0.999654978602144690f, + 0.026074717829104040f, -0.999659996743959220f, 0.025883034947254208f, + -0.999664978131133310f, + 0.025691351113759395f, -0.999669922763483760f, 0.025499666335666818f, + -0.999674830640828740f, + 0.025307980620024630f, -0.999679701762987930f, 0.025116293973880335f, + -0.999684536129782140f, + 0.024924606404281485f, -0.999689333741033640f, 0.024732917918276334f, + -0.999694094596566000f, + 0.024541228522912264f, -0.999698818696204250f, 0.024349538225237600f, + -0.999703506039774650f, + 0.024157847032300020f, -0.999708156627104880f, 0.023966154951147241f, + -0.999712770458023870f, + 0.023774461988827676f, -0.999717347532362190f, 0.023582768152388880f, + -0.999721887849951310f, + 0.023391073448879338f, -0.999726391410624470f, 0.023199377885346890f, + -0.999730858214216030f, + 0.023007681468839410f, -0.999735288260561680f, 0.022815984206405477f, + -0.999739681549498660f, + 0.022624286105092803f, -0.999744038080865430f, 0.022432587171950024f, + -0.999748357854501780f, + 0.022240887414024919f, -0.999752640870248840f, 0.022049186838366180f, + -0.999756887127949080f, + 0.021857485452021874f, -0.999761096627446610f, 0.021665783262040089f, + -0.999765269368586450f, + 0.021474080275469605f, -0.999769405351215280f, 0.021282376499358355f, + -0.999773504575180990f, + 0.021090671940755180f, -0.999777567040332940f, 0.020898966606708289f, + -0.999781592746521670f, + 0.020707260504265912f, -0.999785581693599210f, 0.020515553640476986f, + -0.999789533881418780f, + 0.020323846022389572f, -0.999793449309835270f, 0.020132137657052664f, + -0.999797327978704690f, + 0.019940428551514598f, -0.999801169887884260f, 0.019748718712823757f, + -0.999804975037232870f, + 0.019557008148029204f, -0.999808743426610520f, 0.019365296864179146f, + -0.999812475055878780f, + 0.019173584868322699f, -0.999816169924900410f, 0.018981872167508348f, + -0.999819828033539420f, + 0.018790158768784596f, -0.999823449381661570f, 0.018598444679200642f, + -0.999827033969133420f, + 0.018406729905804820f, -0.999830581795823400f, 0.018215014455646376f, + -0.999834092861600960f, + 0.018023298335773701f, -0.999837567166337090f, 0.017831581553236088f, + -0.999841004709904000f, + 0.017639864115082195f, -0.999844405492175240f, 0.017448146028360704f, + -0.999847769513025900f, + 0.017256427300120978f, -0.999851096772332190f, 0.017064707937411529f, + -0.999854387269971890f, + 0.016872987947281773f, -0.999857641005823860f, 0.016681267336780482f, + -0.999860857979768540f, + 0.016489546112956454f, -0.999864038191687680f, 0.016297824282859176f, + -0.999867181641464380f, + 0.016106101853537263f, -0.999870288328982950f, 0.015914378832040249f, + -0.999873358254129260f, + 0.015722655225417017f, -0.999876391416790410f, 0.015530931040716478f, + -0.999879387816854930f, + 0.015339206284988220f, -0.999882347454212560f, 0.015147480965280975f, + -0.999885270328754520f, + 0.014955755088644378f, -0.999888156440373320f, 0.014764028662127416f, + -0.999891005788962950f, + 0.014572301692779104f, -0.999893818374418490f, 0.014380574187649138f, + -0.999896594196636680f, + 0.014188846153786343f, -0.999899333255515390f, 0.013997117598240459f, + -0.999902035550953920f, + 0.013805388528060349f, -0.999904701082852900f, 0.013613658950295789f, + -0.999907329851114300f, + 0.013421928871995907f, -0.999909921855641540f, 0.013230198300209845f, + -0.999912477096339240f, + 0.013038467241987433f, -0.999914995573113470f, 0.012846735704377631f, + -0.999917477285871770f, + 0.012655003694430301f, -0.999919922234522750f, 0.012463271219194662f, + -0.999922330418976490f, + 0.012271538285719944f, -0.999924701839144500f, 0.012079804901056066f, + -0.999927036494939640f, + 0.011888071072252072f, -0.999929334386276070f, 0.011696336806357907f, + -0.999931595513069200f, + 0.011504602110422875f, -0.999933819875236000f, 0.011312866991496287f, + -0.999936007472694620f, + 0.011121131456628141f, -0.999938158305364590f, 0.010929395512867561f, + -0.999940272373166960f, + 0.010737659167264572f, -0.999942349676023910f, 0.010545922426868548f, + -0.999944390213859060f, + 0.010354185298728884f, -0.999946393986597460f, 0.010162447789895645f, + -0.999948360994165400f, + 0.009970709907418029f, -0.999950291236490480f, 0.009778971658346134f, + -0.999952184713501780f, + 0.009587233049729183f, -0.999954041425129780f, 0.009395494088617302f, + -0.999955861371306100f, + 0.009203754782059960f, -0.999957644551963900f, 0.009012015137106642f, + -0.999959390967037450f, + 0.008820275160807512f, -0.999961100616462820f, 0.008628534860211857f, + -0.999962773500176930f, + 0.008436794242369860f, -0.999964409618118280f, 0.008245053314331058f, + -0.999966008970226920f, + 0.008053312083144991f, -0.999967571556443780f, 0.007861570555861883f, + -0.999969097376711580f, + 0.007669828739531077f, -0.999970586430974140f, 0.007478086641202815f, + -0.999972038719176730f, + 0.007286344267926684f, -0.999973454241265940f, 0.007094601626752279f, + -0.999974832997189810f, + 0.006902858724729877f, -0.999976174986897610f, 0.006711115568908869f, + -0.999977480210339940f, + 0.006519372166339549f, -0.999978748667468830f, 0.006327628524071549f, + -0.999979980358237650f, + 0.006135884649154515f, -0.999981175282601110f, 0.005944140548638765f, + -0.999982333440515350f, + 0.005752396229573737f, -0.999983454831937730f, 0.005560651699009764f, + -0.999984539456826970f, + 0.005368906963996303f, -0.999985587315143200f, 0.005177162031583702f, + -0.999986598406848000f, + 0.004985416908821652f, -0.999987572731904080f, 0.004793671602759852f, + -0.999988510290275690f, + 0.004601926120448672f, -0.999989411081928400f, 0.004410180468937601f, + -0.999990275106828920f, + 0.004218434655277024f, -0.999991102364945590f, 0.004026688686516664f, + -0.999991892856248010f, + 0.003834942569706248f, -0.999992646580707190f, 0.003643196311896179f, + -0.999993363538295150f, + 0.003451449920135975f, -0.999994043728985820f, 0.003259703401476044f, + -0.999994687152754080f, + 0.003067956762966138f, -0.999995293809576190f, 0.002876210011656010f, + -0.999995863699429940f, + 0.002684463154596083f, -0.999996396822294350f, 0.002492716198835898f, + -0.999996893178149880f, + 0.002300969151425887f, -0.999997352766978210f, 0.002109222019415816f, + -0.999997775588762350f, + 0.001917474809855460f, -0.999998161643486980f, 0.001725727529795258f, + -0.999998510931137790f, + 0.001533980186284766f, -0.999998823451701880f, 0.001342232786374430f, + -0.999999099205167830f, + 0.001150485337113809f, -0.999999338191525530f, 0.000958737845553352f, + -0.999999540410766110f, + 0.000766990318742846f, -0.999999705862882230f, 0.000575242763732077f, + -0.999999834547867670f, + 0.000383495187571497f, -0.999999926465717890f, 0.000191747597310674f, + -0.999999981616429330f +}; + + const float32_t cos_factors_8192[8192] = { + 1.999999990808214700f, 1.999999917273932200f, 1.999999770205369800f, + 1.999999549602533100f, + 1.999999255465430200f, 1.999998887794072000f, 1.999998446588471700f, + 1.999997931848645600f, + 1.999997343574612800f, 1.999996681766395000f, 1.999995946424016200f, + 1.999995137547503600f, + 1.999994255136887000f, 1.999993299192198700f, 1.999992269713474200f, + 1.999991166700750800f, + 1.999989990154069600f, 1.999988740073473500f, 1.999987416459008600f, + 1.999986019310723500f, + 1.999984548628669600f, 1.999983004412901000f, 1.999981386663474400f, + 1.999979695380449400f, + 1.999977930563888100f, 1.999976092213855400f, 1.999974180330418700f, + 1.999972194913648900f, + 1.999970135963618400f, 1.999968003480403000f, 1.999965797464081200f, + 1.999963517914734100f, + 1.999961164832445800f, 1.999958738217302300f, 1.999956238069392900f, + 1.999953664388809800f, + 1.999951017175647600f, 1.999948296430003500f, 1.999945502151977600f, + 1.999942634341672600f, + 1.999939692999193900f, 1.999936678124649700f, 1.999933589718150700f, + 1.999930427779810900f, + 1.999927192309745900f, 1.999923883308075200f, 1.999920500774920300f, + 1.999917044710405500f, + 1.999913515114657900f, 1.999909911987807200f, 1.999906235329986100f, + 1.999902485141329400f, + 1.999898661421975400f, 1.999894764172064600f, 1.999890793391740000f, + 1.999886749081147800f, + 1.999882631240436700f, 1.999878439869758200f, 1.999874174969266300f, + 1.999869836539117700f, + 1.999865424579472000f, 1.999860939090491600f, 1.999856380072341000f, + 1.999851747525188200f, + 1.999847041449203300f, 1.999842261844559700f, 1.999837408711432600f, + 1.999832482050000900f, + 1.999827481860445300f, 1.999822408142949900f, 1.999817260897701400f, + 1.999812040124888700f, + 1.999806745824704000f, 1.999801377997341800f, 1.999795936642999600f, + 1.999790421761877400f, + 1.999784833354177900f, 1.999779171420106700f, 1.999773435959872000f, + 1.999767626973684400f, + 1.999761744461757700f, 1.999755788424308200f, 1.999749758861554900f, + 1.999743655773719400f, + 1.999737479161026100f, 1.999731229023702200f, 1.999724905361977200f, + 1.999718508176084000f, + 1.999712037466257600f, 1.999705493232735800f, 1.999698875475759600f, + 1.999692184195571900f, + 1.999685419392419000f, 1.999678581066549400f, 1.999671669218214600f, + 1.999664683847668800f, + 1.999657624955168700f, 1.999650492540973900f, 1.999643286605346800f, + 1.999636007148552400f, + 1.999628654170857900f, 1.999621227672533800f, 1.999613727653853500f, + 1.999606154115092500f, + 1.999598507056529000f, 1.999590786478444600f, 1.999582992381123000f, + 1.999575124764850800f, + 1.999567183629917100f, 1.999559168976613900f, 1.999551080805236100f, + 1.999542919116081000f, + 1.999534683909448600f, 1.999526375185641800f, 1.999517992944965800f, + 1.999509537187729200f, + 1.999501007914242600f, 1.999492405124819700f, 1.999483728819776900f, + 1.999474978999432800f, + 1.999466155664109600f, 1.999457258814131500f, 1.999448288449825500f, + 1.999439244571521700f, + 1.999430127179552500f, 1.999420936274252800f, 1.999411671855960900f, + 1.999402333925017300f, + 1.999392922481765500f, 1.999383437526551300f, 1.999373879059723500f, + 1.999364247081633500f, + 1.999354541592635500f, 1.999344762593086500f, 1.999334910083345700f, + 1.999324984063775700f, + 1.999314984534741100f, 1.999304911496609700f, 1.999294764949752100f, + 1.999284544894541100f, + 1.999274251331352400f, 1.999263884260564600f, 1.999253443682558900f, + 1.999242929597719200f, + 1.999232342006432000f, 1.999221680909086400f, 1.999210946306074500f, + 1.999200138197791100f, + 1.999189256584633600f, 1.999178301467001900f, 1.999167272845298900f, + 1.999156170719930100f, + 1.999144995091303600f, 1.999133745959830600f, 1.999122423325924200f, + 1.999111027190001000f, + 1.999099557552479900f, 1.999088014413782800f, 1.999076397774334000f, + 1.999064707634560700f, + 1.999052943994892300f, 1.999041106855761900f, 1.999029196217604100f, + 1.999017212080857400f, + 1.999005154445962200f, 1.998993023313361700f, 1.998980818683502100f, + 1.998968540556831800f, + 1.998956188933802800f, 1.998943763814868800f, 1.998931265200486900f, + 1.998918693091116200f, + 1.998906047487219600f, 1.998893328389261400f, 1.998880535797709700f, + 1.998867669713034500f, + 1.998854730135709400f, 1.998841717066209400f, 1.998828630505013400f, + 1.998815470452602400f, + 1.998802236909460500f, 1.998788929876074100f, 1.998775549352932400f, + 1.998762095340527400f, + 1.998748567839354000f, 1.998734966849909000f, 1.998721292372693100f, + 1.998707544408208700f, + 1.998693722956961500f, 1.998679828019459300f, 1.998665859596213500f, + 1.998651817687737300f, + 1.998637702294547000f, 1.998623513417161700f, 1.998609251056103100f, + 1.998594915211895600f, + 1.998580505885066100f, 1.998566023076144600f, 1.998551466785663400f, + 1.998536837014157900f, + 1.998522133762165900f, 1.998507357030227900f, 1.998492506818887200f, + 1.998477583128690100f, + 1.998462585960185000f, 1.998447515313923400f, 1.998432371190459500f, + 1.998417153590349900f, + 1.998401862514154200f, 1.998386497962434800f, 1.998371059935756300f, + 1.998355548434686400f, + 1.998339963459795400f, 1.998324305011656600f, 1.998308573090845200f, + 1.998292767697940100f, + 1.998276888833522300f, 1.998260936498175400f, 1.998244910692486000f, + 1.998228811417043700f, + 1.998212638672439900f, 1.998196392459269400f, 1.998180072778129600f, + 1.998163679629620500f, + 1.998147213014344900f, 1.998130672932908000f, 1.998114059385918400f, + 1.998097372373986300f, + 1.998080611897725700f, 1.998063777957752600f, 1.998046870554686100f, + 1.998029889689147700f, + 1.998012835361761900f, 1.997995707573155600f, 1.997978506323958600f, + 1.997961231614803200f, + 1.997943883446324800f, 1.997926461819161000f, 1.997908966733952500f, + 1.997891398191342400f, + 1.997873756191977000f, 1.997856040736504500f, 1.997838251825576400f, + 1.997820389459846700f, + 1.997802453639972300f, 1.997784444366612600f, 1.997766361640429800f, + 1.997748205462088500f, + 1.997729975832256600f, 1.997711672751604200f, 1.997693296220804000f, + 1.997674846240532000f, + 1.997656322811466500f, 1.997637725934288300f, 1.997619055609681600f, + 1.997600311838332500f, + 1.997581494620930300f, 1.997562603958166600f, 1.997543639850736200f, + 1.997524602299336500f, + 1.997505491304667000f, 1.997486306867430900f, 1.997467048988333000f, + 1.997447717668082000f, + 1.997428312907388200f, 1.997408834706965000f, 1.997389283067528800f, + 1.997369657989798400f, + 1.997349959474495200f, 1.997330187522343700f, 1.997310342134070800f, + 1.997290423310406100f, + 1.997270431052081900f, 1.997250365359833200f, 1.997230226234397900f, + 1.997210013676516700f, + 1.997189727686932400f, 1.997169368266390900f, 1.997148935415640600f, + 1.997128429135433400f, + 1.997107849426522600f, 1.997087196289665000f, 1.997066469725620200f, + 1.997045669735150000f, + 1.997024796319019300f, 1.997003849477995600f, 1.996982829212848900f, + 1.996961735524351900f, + 1.996940568413280600f, 1.996919327880412900f, 1.996898013926530000f, + 1.996876626552415400f, + 1.996855165758855600f, 1.996833631546639300f, 1.996812023916558800f, + 1.996790342869408000f, + 1.996768588405984300f, 1.996746760527087700f, 1.996724859233520500f, + 1.996702884526087900f, + 1.996680836405598100f, 1.996658714872861800f, 1.996636519928692000f, + 1.996614251573904900f, + 1.996591909809319400f, 1.996569494635756600f, 1.996547006054041100f, + 1.996524444064999400f, + 1.996501808669461000f, 1.996479099868258400f, 1.996456317662226300f, + 1.996433462052202600f, + 1.996410533039027400f, 1.996387530623543900f, 1.996364454806597500f, + 1.996341305589037100f, + 1.996318082971713500f, 1.996294786955480800f, 1.996271417541195300f, + 1.996247974729716200f, + 1.996224458521905600f, 1.996200868918628100f, 1.996177205920750800f, + 1.996153469529144100f, + 1.996129659744680300f, 1.996105776568235100f, 1.996081820000686500f, + 1.996057790042915500f, + 1.996033686695805300f, 1.996009509960242400f, 1.995985259837115500f, + 1.995960936327316300f, + 1.995936539431739000f, 1.995912069151280800f, 1.995887525486841300f, + 1.995862908439323100f, + 1.995838218009630800f, 1.995813454198672700f, 1.995788617007359100f, + 1.995763706436603200f, + 1.995738722487320600f, 1.995713665160430600f, 1.995688534456853800f, + 1.995663330377514400f, + 1.995638052923339300f, 1.995612702095257400f, 1.995587277894201400f, + 1.995561780321105600f, + 1.995536209376907600f, 1.995510565062547800f, 1.995484847378968600f, + 1.995459056327116000f, + 1.995433191907938000f, 1.995407254122385700f, 1.995381242971412600f, + 1.995355158455975200f, + 1.995329000577032800f, 1.995302769335546500f, 1.995276464732481200f, + 1.995250086768804100f, + 1.995223635445484900f, 1.995197110763496000f, 1.995170512723813100f, + 1.995143841327413400f, + 1.995117096575278200f, 1.995090278468390600f, 1.995063387007736600f, + 1.995036422194304700f, + 1.995009384029086800f, 1.994982272513076600f, 1.994955087647271000f, + 1.994927829432669800f, + 1.994900497870274900f, 1.994873092961091200f, 1.994845614706126400f, + 1.994818063106391000f, + 1.994790438162897600f, 1.994762739876662100f, 1.994734968248702800f, + 1.994707123280041100f, + 1.994679204971700100f, 1.994651213324707000f, 1.994623148340090700f, + 1.994595010018883000f, + 1.994566798362118300f, 1.994538513370834200f, 1.994510155046070700f, + 1.994481723388870100f, + 1.994453218400277900f, 1.994424640081342100f, 1.994395988433113700f, + 1.994367263456646100f, + 1.994338465152995000f, 1.994309593523219600f, 1.994280648568381500f, + 1.994251630289544600f, + 1.994222538687776100f, 1.994193373764145500f, 1.994164135519725000f, + 1.994134823955589800f, + 1.994105439072817700f, 1.994075980872488800f, 1.994046449355686200f, + 1.994016844523496000f, + 1.993987166377006600f, 1.993957414917308700f, 1.993927590145496900f, + 1.993897692062667200f, + 1.993867720669919400f, 1.993837675968354700f, 1.993807557959078600f, + 1.993777366643197900f, + 1.993747102021822900f, 1.993716764096066200f, 1.993686352867043200f, + 1.993655868335872300f, + 1.993625310503674100f, 1.993594679371572200f, 1.993563974940692800f, + 1.993533197212164800f, + 1.993502346187119700f, 1.993471421866692200f, 1.993440424252018900f, + 1.993409353344239600f, + 1.993378209144496700f, 1.993346991653935300f, 1.993315700873703200f, + 1.993284336804950900f, + 1.993252899448831400f, 1.993221388806500900f, 1.993189804879117500f, + 1.993158147667842800f, + 1.993126417173840500f, 1.993094613398277400f, 1.993062736342323000f, + 1.993030786007148800f, + 1.992998762393930000f, 1.992966665503844000f, 1.992934495338070800f, + 1.992902251897793000f, + 1.992869935184196300f, 1.992837545198469000f, 1.992805081941801700f, + 1.992772545415388200f, + 1.992739935620424700f, 1.992707252558110200f, 1.992674496229646500f, + 1.992641666636237700f, + 1.992608763779091000f, 1.992575787659416100f, 1.992542738278425300f, + 1.992509615637334100f, + 1.992476419737359900f, 1.992443150579723500f, 1.992409808165648100f, + 1.992376392496359300f, + 1.992342903573086000f, 1.992309341397059600f, 1.992275705969513800f, + 1.992241997291685400f, + 1.992208215364813700f, 1.992174360190140900f, 1.992140431768911500f, + 1.992106430102373400f, + 1.992072355191776300f, 1.992038207038373300f, 1.992003985643419700f, + 1.991969691008174100f, + 1.991935323133897000f, 1.991900882021852200f, 1.991866367673306200f, + 1.991831780089527500f, + 1.991797119271788300f, 1.991762385221362600f, 1.991727577939527600f, + 1.991692697427563300f, + 1.991657743686751700f, 1.991622716718378400f, 1.991587616523731000f, + 1.991552443104099800f, + 1.991517196460778500f, 1.991481876595062800f, 1.991446483508251500f, + 1.991411017201645500f, + 1.991375477676549100f, 1.991339864934268800f, 1.991304178976114100f, + 1.991268419803397200f, + 1.991232587417432600f, 1.991196681819537900f, 1.991160703011033200f, + 1.991124650993241400f, + 1.991088525767488200f, 1.991052327335101300f, 1.991016055697411900f, + 1.990979710855753900f, + 1.990943292811463000f, 1.990906801565878600f, 1.990870237120342400f, + 1.990833599476198800f, + 1.990796888634794400f, 1.990760104597479400f, 1.990723247365606200f, + 1.990686316940529800f, + 1.990649313323608100f, 1.990612236516201300f, 1.990575086519673200f, + 1.990537863335389400f, + 1.990500566964718400f, 1.990463197409031700f, 1.990425754669703100f, + 1.990388238748109100f, + 1.990350649645629600f, 1.990312987363646000f, 1.990275251903543600f, + 1.990237443266709400f, + 1.990199561454533600f, 1.990161606468409300f, 1.990123578309731700f, + 1.990085476979899000f, + 1.990047302480312300f, 1.990009054812374800f, 1.989970733977493000f, + 1.989932339977075900f, + 1.989893872812535000f, 1.989855332485284800f, 1.989816718996742200f, + 1.989778032348326700f, + 1.989739272541461100f, 1.989700439577570400f, 1.989661533458082100f, + 1.989622554184426800f, + 1.989583501758037700f, 1.989544376180350600f, 1.989505177452804100f, + 1.989465905576839600f, + 1.989426560553900500f, 1.989387142385433900f, 1.989347651072888900f, + 1.989308086617717500f, + 1.989268449021374300f, 1.989228738285316900f, 1.989188954411005100f, + 1.989149097399901500f, + 1.989109167253472000f, 1.989069163973184300f, 1.989029087560509700f, + 1.988988938016921000f, + 1.988948715343894900f, 1.988908419542910100f, 1.988868050615448100f, + 1.988827608562993200f, + 1.988787093387032600f, 1.988746505089055600f, 1.988705843670554500f, + 1.988665109133024500f, + 1.988624301477963200f, 1.988583420706871100f, 1.988542466821251000f, + 1.988501439822608900f, + 1.988460339712453200f, 1.988419166492295000f, 1.988377920163648000f, + 1.988336600728029000f, + 1.988295208186956700f, 1.988253742541953800f, 1.988212203794544000f, + 1.988170591946255100f, + 1.988128906998616800f, 1.988087148953161700f, 1.988045317811425700f, + 1.988003413574946000f, + 1.987961436245263800f, 1.987919385823922400f, 1.987877262312467600f, + 1.987835065712448600f, + 1.987792796025416500f, 1.987750453252925500f, 1.987708037396532800f, + 1.987665548457797400f, + 1.987622986438281700f, 1.987580351339550700f, 1.987537643163171700f, + 1.987494861910715100f, + 1.987452007583754100f, 1.987409080183863800f, 1.987366079712622900f, + 1.987323006171612500f, + 1.987279859562415900f, 1.987236639886619700f, 1.987193347145813000f, + 1.987149981341587400f, + 1.987106542475537400f, 1.987063030549260300f, 1.987019445564355700f, + 1.986975787522426100f, + 1.986932056425076800f, 1.986888252273915500f, 1.986844375070552900f, + 1.986800424816602200f, + 1.986756401513679400f, 1.986712305163403000f, 1.986668135767394300f, + 1.986623893327277500f, + 1.986579577844678900f, 1.986535189321228000f, 1.986490727758556800f, + 1.986446193158300400f, + 1.986401585522095600f, 1.986356904851583000f, 1.986312151148405200f, + 1.986267324414207500f, + 1.986222424650638400f, 1.986177451859348200f, 1.986132406041990900f, + 1.986087287200222700f, + 1.986042095335702300f, 1.985996830450091200f, 1.985951492545054100f, + 1.985906081622257300f, + 1.985860597683371000f, 1.985815040730067200f, 1.985769410764020900f, + 1.985723707786909900f, + 1.985677931800414500f, 1.985632082806217900f, 1.985586160806005700f, + 1.985540165801466200f, + 1.985494097794290800f, 1.985447956786173100f, 1.985401742778809500f, + 1.985355455773899500f, + 1.985309095773144500f, 1.985262662778249300f, 1.985216156790921000f, + 1.985169577812869500f, + 1.985122925845807400f, 1.985076200891450000f, 1.985029402951515200f, + 1.984982532027723700f, + 1.984935588121798700f, 1.984888571235466200f, 1.984841481370454900f, + 1.984794318528496200f, + 1.984747082711324100f, 1.984699773920675300f, 1.984652392158289500f, + 1.984604937425908300f, + 1.984557409725276700f, 1.984509809058142300f, 1.984462135426255000f, + 1.984414388831367900f, + 1.984366569275236400f, 1.984318676759618400f, 1.984270711286275200f, + 1.984222672856969800f, + 1.984174561473469200f, 1.984126377137541700f, 1.984078119850959200f, + 1.984029789615495900f, + 1.983981386432928800f, 1.983932910305037400f, 1.983884361233604100f, + 1.983835739220414000f, + 1.983787044267254700f, 1.983738276375916800f, 1.983689435548192900f, + 1.983640521785879200f, + 1.983591535090773800f, 1.983542475464678000f, 1.983493342909395500f, + 1.983444137426732600f, + 1.983394859018498900f, 1.983345507686505900f, 1.983296083432567900f, + 1.983246586258502700f, + 1.983197016166129400f, 1.983147373157271300f, 1.983097657233753100f, + 1.983047868397403100f, + 1.982998006650051400f, 1.982948071993531700f, 1.982898064429679900f, + 1.982847983960334600f, + 1.982797830587336800f, 1.982747604312531200f, 1.982697305137763700f, + 1.982646933064884200f, + 1.982596488095744300f, 1.982545970232199000f, 1.982495379476105800f, + 1.982444715829324600f, + 1.982393979293718200f, 1.982343169871152000f, 1.982292287563494300f, + 1.982241332372615600f, + 1.982190304300389400f, 1.982139203348692200f, 1.982088029519402300f, + 1.982036782814401900f, + 1.981985463235574700f, 1.981934070784807400f, 1.981882605463990200f, + 1.981831067275015000f, + 1.981779456219776600f, 1.981727772300172500f, 1.981676015518103500f, + 1.981624185875472000f, + 1.981572283374183800f, 1.981520308016147200f, 1.981468259803273300f, + 1.981416138737475800f, + 1.981363944820670800f, 1.981311678054777500f, 1.981259338441717400f, + 1.981206925983415300f, + 1.981154440681797800f, 1.981101882538794900f, 1.981049251556338900f, + 1.980996547736364900f, + 1.980943771080810700f, 1.980890921591616600f, 1.980837999270726100f, + 1.980785004120084700f, + 1.980731936141640900f, 1.980678795337345900f, 1.980625581709153600f, + 1.980572295259020600f, + 1.980518935988905700f, 1.980465503900771000f, 1.980411998996581200f, + 1.980358421278303200f, + 1.980304770747907300f, 1.980251047407365600f, 1.980197251258653900f, + 1.980143382303749500f, + 1.980089440544633600f, 1.980035425983289300f, 1.979981338621702200f, + 1.979927178461861500f, + 1.979872945505758000f, 1.979818639755386100f, 1.979764261212742400f, + 1.979709809879825800f, + 1.979655285758638900f, 1.979600688851186100f, 1.979546019159474900f, + 1.979491276685515300f, + 1.979436461431320000f, 1.979381573398904400f, 1.979326612590286400f, + 1.979271579007487100f, + 1.979216472652529900f, 1.979161293527440500f, 1.979106041634248100f, + 1.979050716974983800f, + 1.978995319551682100f, 1.978939849366379700f, 1.978884306421115900f, + 1.978828690717932900f, + 1.978773002258875600f, 1.978717241045991700f, 1.978661407081331100f, + 1.978605500366946700f, + 1.978549520904894000f, 1.978493468697231300f, 1.978437343746019600f, + 1.978381146053322000f, + 1.978324875621205300f, 1.978268532451738200f, 1.978212116546992100f, + 1.978155627909041300f, + 1.978099066539962900f, 1.978042432441836400f, 1.977985725616743900f, + 1.977928946066770600f, + 1.977872093794004200f, 1.977815168800534500f, 1.977758171088455100f, + 1.977701100659861300f, + 1.977643957516851400f, 1.977586741661526500f, 1.977529453095990200f, + 1.977472091822348700f, + 1.977414657842711200f, 1.977357151159189400f, 1.977299571773897700f, + 1.977241919688953000f, + 1.977184194906475000f, 1.977126397428586000f, 1.977068527257411300f, + 1.977010584395078300f, + 1.976952568843717700f, 1.976894480605462500f, 1.976836319682448300f, + 1.976778086076813600f, + 1.976719779790699500f, 1.976661400826249500f, 1.976602949185610500f, + 1.976544424870931400f, + 1.976485827884363800f, 1.976427158228062100f, 1.976368415904183900f, + 1.976309600914888400f, + 1.976250713262338600f, 1.976191752948699200f, 1.976132719976138000f, + 1.976073614346825800f, + 1.976014436062935700f, 1.975955185126643300f, 1.975895861540127200f, + 1.975836465305568400f, + 1.975776996425151000f, 1.975717454901061400f, 1.975657840735488800f, + 1.975598153930624900f, + 1.975538394488664200f, 1.975478562411804100f, 1.975418657702244300f, + 1.975358680362187400f, + 1.975298630393838500f, 1.975238507799405500f, 1.975178312581099100f, + 1.975118044741132300f, + 1.975057704281721000f, 1.974997291205083700f, 1.974936805513442000f, + 1.974876247209019100f, + 1.974815616294042200f, 1.974754912770740200f, 1.974694136641345300f, + 1.974633287908091500f, + 1.974572366573216400f, 1.974511372638960000f, 1.974450306107564900f, + 1.974389166981275900f, + 1.974327955262341400f, 1.974266670953011400f, 1.974205314055540000f, + 1.974143884572182400f, + 1.974082382505197400f, 1.974020807856846400f, 1.973959160629393100f, + 1.973897440825104200f, + 1.973835648446248900f, 1.973773783495099500f, 1.973711845973930000f, + 1.973649835885018100f, + 1.973587753230643400f, 1.973525598013088800f, 1.973463370234639600f, + 1.973401069897583200f, + 1.973338697004211100f, 1.973276251556815600f, 1.973213733557693400f, + 1.973151143009142800f, + 1.973088479913465100f, 1.973025744272964200f, 1.972962936089946800f, + 1.972900055366722000f, + 1.972837102105601900f, 1.972774076308901200f, 1.972710977978936900f, + 1.972647807118029300f, + 1.972584563728500700f, 1.972521247812676600f, 1.972457859372884500f, + 1.972394398411455800f, + 1.972330864930723200f, 1.972267258933022600f, 1.972203580420693000f, + 1.972139829396075200f, + 1.972076005861513700f, 1.972012109819354600f, 1.971948141271947500f, + 1.971884100221644300f, + 1.971819986670799500f, 1.971755800621770400f, 1.971691542076916800f, + 1.971627211038601500f, + 1.971562807509189800f, 1.971498331491049700f, 1.971433782986551400f, + 1.971369161998068400f, + 1.971304468527976800f, 1.971239702578655000f, 1.971174864152484400f, + 1.971109953251848600f, + 1.971044969879134600f, 1.970979914036731500f, 1.970914785727030800f, + 1.970849584952427900f, + 1.970784311715319400f, 1.970718966018105500f, 1.970653547863188600f, + 1.970588057252973900f, + 1.970522494189869800f, 1.970456858676286300f, 1.970391150714636800f, + 1.970325370307337100f, + 1.970259517456806100f, 1.970193592165464700f, 1.970127594435737000f, + 1.970061524270049400f, + 1.969995381670831100f, 1.969929166640514100f, 1.969862879181532700f, + 1.969796519296324300f, + 1.969730086987328900f, 1.969663582256988600f, 1.969597005107748900f, + 1.969530355542057800f, + 1.969463633562365400f, 1.969396839171125200f, 1.969329972370792700f, + 1.969263033163826800f, + 1.969196021552688500f, 1.969128937539841500f, 1.969061781127752400f, + 1.968994552318890300f, + 1.968927251115727200f, 1.968859877520737300f, 1.968792431536398000f, + 1.968724913165188900f, + 1.968657322409592500f, 1.968589659272094000f, 1.968521923755181000f, + 1.968454115861344000f, + 1.968386235593076300f, 1.968318282952873600f, 1.968250257943234200f, + 1.968182160566659000f, + 1.968113990825652200f, 1.968045748722719900f, 1.967977434260371300f, + 1.967909047441118100f, + 1.967840588267474500f, 1.967772056741957900f, 1.967703452867087800f, + 1.967634776645386600f, + 1.967566028079379200f, 1.967497207171593500f, 1.967428313924559600f, + 1.967359348340810700f, + 1.967290310422882700f, 1.967221200173313400f, 1.967152017594644200f, + 1.967082762689418500f, + 1.967013435460182700f, 1.966944035909485600f, 1.966874564039879300f, + 1.966805019853917500f, + 1.966735403354157500f, 1.966665714543159000f, 1.966595953423483800f, + 1.966526119997697100f, + 1.966456214268366600f, 1.966386236238062200f, 1.966316185909357200f, + 1.966246063284826700f, + 1.966175868367049400f, 1.966105601158605600f, 1.966035261662079300f, + 1.965964849880056600f, + 1.965894365815126000f, 1.965823809469879400f, 1.965753180846910900f, + 1.965682479948817100f, + 1.965611706778197700f, 1.965540861337654600f, 1.965469943629792700f, + 1.965398953657219600f, + 1.965327891422544900f, 1.965256756928382100f, 1.965185550177345900f, + 1.965114271172054800f, + 1.965042919915129400f, 1.964971496409193100f, 1.964900000656872000f, + 1.964828432660794500f, + 1.964756792423592200f, 1.964685079947899200f, 1.964613295236352000f, + 1.964541438291590000f, + 1.964469509116255000f, 1.964397507712991800f, 1.964325434084447600f, + 1.964253288233272400f, + 1.964181070162119000f, 1.964108779873642100f, 1.964036417370500300f, + 1.963963982655353400f, + 1.963891475730865400f, 1.963818896599701400f, 1.963746245264530700f, + 1.963673521728023900f, + 1.963600725992855200f, 1.963527858061700600f, 1.963454917937239800f, + 1.963381905622154400f, + 1.963308821119128700f, 1.963235664430850200f, 1.963162435560008100f, + 1.963089134509295300f, + 1.963015761281406800f, 1.962942315879040000f, 1.962868798304895400f, + 1.962795208561676200f, + 1.962721546652088200f, 1.962647812578839400f, 1.962574006344640900f, + 1.962500127952206300f, + 1.962426177404252200f, 1.962352154703497200f, 1.962278059852663000f, + 1.962203892854473800f, + 1.962129653711656800f, 1.962055342426941400f, 1.961980959003059500f, + 1.961906503442746300f, + 1.961831975748739200f, 1.961757375923778700f, 1.961682703970607100f, + 1.961607959891970200f, + 1.961533143690616000f, 1.961458255369295400f, 1.961383294930761700f, + 1.961308262377770900f, + 1.961233157713082200f, 1.961157980939456400f, 1.961082732059657800f, + 1.961007411076453000f, + 1.960932017992611500f, 1.960856552810905200f, 1.960781015534108800f, + 1.960705406164999300f, + 1.960629724706357100f, 1.960553971160964500f, 1.960478145531606700f, + 1.960402247821071900f, + 1.960326278032150200f, 1.960250236167635100f, 1.960174122230322400f, + 1.960097936223010400f, + 1.960021678148500500f, 1.959945348009596500f, 1.959868945809104500f, + 1.959792471549834000f, + 1.959715925234596600f, 1.959639306866206600f, 1.959562616447480900f, + 1.959485853981239600f, + 1.959409019470304700f, 1.959332112917501400f, 1.959255134325657000f, + 1.959178083697602300f, + 1.959100961036169800f, 1.959023766344195200f, 1.958946499624516700f, + 1.958869160879975500f, + 1.958791750113414700f, 1.958714267327680500f, 1.958636712525621900f, + 1.958559085710090500f, + 1.958481386883940100f, 1.958403616050027600f, 1.958325773211212300f, + 1.958247858370356400f, + 1.958169871530324600f, 1.958091812693984400f, 1.958013681864205500f, + 1.957935479043860600f, + 1.957857204235825100f, 1.957778857442976900f, 1.957700438668196700f, + 1.957621947914367500f, + 1.957543385184375300f, 1.957464750481108700f, 1.957386043807458800f, + 1.957307265166319500f, + 1.957228414560587200f, 1.957149491993160900f, 1.957070497466942400f, + 1.956991430984836400f, + 1.956912292549749500f, 1.956833082164591600f, 1.956753799832275300f, + 1.956674445555715000f, + 1.956595019337829000f, 1.956515521181537000f, 1.956435951089762200f, + 1.956356309065430100f, + 1.956276595111468900f, 1.956196809230809500f, 1.956116951426385600f, + 1.956037021701132900f, + 1.955957020057990500f, 1.955876946499899700f, 1.955796801029804800f, + 1.955716583650652000f, + 1.955636294365391300f, 1.955555933176974300f, 1.955475500088355900f, + 1.955394995102493100f, + 1.955314418222346100f, 1.955233769450877200f, 1.955153048791052000f, + 1.955072256245838000f, + 1.954991391818206000f, 1.954910455511129000f, 1.954829447327582900f, + 1.954748367270545900f, + 1.954667215342999600f, 1.954585991547927100f, 1.954504695888315000f, + 1.954423328367152600f, + 1.954341888987431100f, 1.954260377752145000f, 1.954178794664291200f, + 1.954097139726869600f, + 1.954015412942881900f, 1.953933614315333200f, 1.953851743847231100f, + 1.953769801541585400f, + 1.953687787401409400f, 1.953605701429718100f, 1.953523543629529700f, + 1.953441314003864900f, + 1.953359012555747200f, 1.953276639288202400f, 1.953194194204259200f, + 1.953111677306948800f, + 1.953029088599305100f, 1.952946428084364900f, 1.952863695765167100f, + 1.952780891644753500f, + 1.952698015726169100f, 1.952615068012460300f, 1.952532048506677300f, + 1.952448957211872200f, + 1.952365794131100300f, 1.952282559267419100f, 1.952199252623889200f, + 1.952115874203572900f, + 1.952032424009536600f, 1.951948902044847900f, 1.951865308312577900f, + 1.951781642815800100f, + 1.951697905557590700f, 1.951614096541028500f, 1.951530215769194700f, + 1.951446263245173500f, + 1.951362238972051500f, 1.951278142952918200f, 1.951193975190865600f, + 1.951109735688987900f, + 1.951025424450382900f, 1.950941041478150100f, 1.950856586775392200f, + 1.950772060345214300f, + 1.950687462190724200f, 1.950602792315032200f, 1.950518050721251600f, + 1.950433237412498000f, + 1.950348352391889600f, 1.950263395662547700f, 1.950178367227595900f, + 1.950093267090159800f, + 1.950008095253369200f, 1.949922851720355100f, 1.949837536494251700f, + 1.949752149578196000f, + 1.949666690975327100f, 1.949581160688787400f, 1.949495558721721500f, + 1.949409885077276500f, + 1.949324139758602700f, 1.949238322768852800f, 1.949152434111181700f, + 1.949066473788747300f, + 1.948980441804710300f, 1.948894338162233900f, 1.948808162864483600f, + 1.948721915914628100f, + 1.948635597315838200f, 1.948549207071288000f, 1.948462745184153400f, + 1.948376211657613500f, + 1.948289606494849800f, 1.948202929699046800f, 1.948116181273391100f, + 1.948029361221072400f, + 1.947942469545282500f, 1.947855506249216700f, 1.947768471336071700f, + 1.947681364809048100f, + 1.947594186671348000f, 1.947506936926177300f, 1.947419615576743600f, + 1.947332222626257500f, + 1.947244758077932200f, 1.947157221934983500f, 1.947069614200629900f, + 1.946981934878092300f, + 1.946894183970594900f, 1.946806361481363500f, 1.946718467413627300f, + 1.946630501770618000f, + 1.946542464555569800f, 1.946454355771719300f, 1.946366175422306500f, + 1.946277923510573200f, + 1.946189600039764300f, 1.946101205013127000f, 1.946012738433911600f, + 1.945924200305370700f, + 1.945835590630759400f, 1.945746909413335900f, 1.945658156656360700f, + 1.945569332363096700f, + 1.945480436536810100f, 1.945391469180769200f, 1.945302430298244900f, + 1.945213319892511200f, + 1.945124137966844200f, 1.945034884524523100f, 1.944945559568829200f, + 1.944856163103046800f, + 1.944766695130463000f, 1.944677155654366900f, 1.944587544678050900f, + 1.944497862204809900f, + 1.944408108237940700f, 1.944318282780743900f, 1.944228385836521700f, + 1.944138417408579400f, + 1.944048377500225100f, 1.943958266114769200f, 1.943868083255524800f, + 1.943777828925807600f, + 1.943687503128936200f, 1.943597105868231500f, 1.943506637147017300f, + 1.943416096968619400f, + 1.943325485336367300f, 1.943234802253592400f, 1.943144047723628400f, + 1.943053221749812400f, + 1.942962324335484100f, 1.942871355483985200f, 1.942780315198660200f, + 1.942689203482856900f, + 1.942598020339924700f, 1.942506765773216500f, 1.942415439786087300f, + 1.942324042381895000f, + 1.942232573564000000f, 1.942141033335765400f, 1.942049421700556600f, + 1.941957738661741900f, + 1.941865984222692900f, 1.941774158386782200f, 1.941682261157386700f, + 1.941590292537884700f, + 1.941498252531658200f, 1.941406141142090600f, 1.941313958372568900f, + 1.941221704226482500f, + 1.941129378707223000f, 1.941036981818185400f, 1.940944513562766300f, + 1.940851973944365900f, + 1.940759362966386600f, 1.940666680632233200f, 1.940573926945313700f, + 1.940481101909038200f, + 1.940388205526819600f, 1.940295237802073500f, 1.940202198738217900f, + 1.940109088338673600f, + 1.940015906606864300f, 1.939922653546215500f, 1.939829329160156500f, + 1.939735933452118000f, + 1.939642466425534300f, 1.939548928083841800f, 1.939455318430479500f, + 1.939361637468889100f, + 1.939267885202515400f, 1.939174061634805000f, 1.939080166769207700f, + 1.938986200609175600f, + 1.938892163158163700f, 1.938798054419629500f, 1.938703874397032800f, + 1.938609623093837000f, + 1.938515300513506700f, 1.938420906659510600f, 1.938326441535318500f, + 1.938231905144404400f, + 1.938137297490243500f, 1.938042618576314400f, 1.937947868406098500f, + 1.937853046983079300f, + 1.937758154310742900f, 1.937663190392578500f, 1.937568155232077600f, + 1.937473048832734500f, + 1.937377871198045600f, 1.937282622331510500f, 1.937187302236631500f, + 1.937091910916912900f, + 1.936996448375861900f, 1.936900914616988900f, 1.936805309643805800f, + 1.936709633459828200f, + 1.936613886068573500f, 1.936518067473562300f, 1.936422177678317300f, + 1.936326216686364400f, + 1.936230184501231500f, 1.936134081126449800f, 1.936037906565552400f, + 1.935941660822075600f, + 1.935845343899558000f, 1.935748955801540800f, 1.935652496531568000f, + 1.935555966093186300f, + 1.935459364489944500f, 1.935362691725394500f, 1.935265947803090900f, + 1.935169132726590500f, + 1.935072246499453000f, 1.934975289125240500f, 1.934878260607517900f, + 1.934781160949852600f, + 1.934683990155814800f, 1.934586748228977100f, 1.934489435172914900f, + 1.934392050991206300f, + 1.934294595687431300f, 1.934197069265173500f, 1.934099471728018700f, + 1.934001803079554700f, + 1.933904063323373300f, 1.933806252463067500f, 1.933708370502233800f, + 1.933610417444471000f, + 1.933512393293380600f, 1.933414298052566600f, 1.933316131725635800f, + 1.933217894316197300f, + 1.933119585827862900f, 1.933021206264247600f, 1.932922755628968100f, + 1.932824233925644300f, + 1.932725641157898600f, 1.932626977329356100f, 1.932528242443643900f, + 1.932429436504392800f, + 1.932330559515235100f, 1.932231611479806800f, 1.932132592401745400f, + 1.932033502284691700f, + 1.931934341132289100f, 1.931835108948183300f, 1.931735805736022800f, + 1.931636431499459000f, + 1.931536986242145200f, 1.931437469967737900f, 1.931337882679895900f, + 1.931238224382281000f, + 1.931138495078557300f, 1.931038694772391200f, 1.930938823467452500f, + 1.930838881167413100f, + 1.930738867875947400f, 1.930638783596732700f, 1.930538628333448900f, + 1.930438402089778200f, + 1.930338104869405900f, 1.930237736676019500f, 1.930137297513309300f, + 1.930036787384968200f, + 1.929936206294691400f, 1.929835554246177400f, 1.929734831243126600f, + 1.929634037289242400f, + 1.929533172388230700f, 1.929432236543799900f, 1.929331229759661200f, + 1.929230152039528500f, + 1.929129003387117800f, 1.929027783806148300f, 1.928926493300341400f, + 1.928825131873421500f, + 1.928723699529115000f, 1.928622196271151800f, 1.928520622103263400f, + 1.928418977029184600f, + 1.928317261052652700f, 1.928215474177407100f, 1.928113616407190600f, + 1.928011687745748300f, + 1.927909688196827400f, 1.927807617764178300f, 1.927705476451554000f, + 1.927603264262709900f, + 1.927500981201404100f, 1.927398627271397000f, 1.927296202476451900f, + 1.927193706820335100f, + 1.927091140306814500f, 1.926988502939661400f, 1.926885794722649600f, + 1.926783015659555300f, + 1.926680165754157500f, 1.926577245010237400f, 1.926474253431579500f, + 1.926371191021970100f, + 1.926268057785198700f, 1.926164853725057300f, 1.926061578845340600f, + 1.925958233149845000f, + 1.925854816642371000f, 1.925751329326720600f, 1.925647771206698600f, + 1.925544142286112800f, + 1.925440442568773000f, 1.925336672058492300f, 1.925232830759086000f, + 1.925128918674371900f, + 1.925024935808170600f, 1.924920882164305300f, 1.924816757746601800f, + 1.924712562558888100f, + 1.924608296604995800f, 1.924503959888757900f, 1.924399552414010700f, + 1.924295074184593000f, + 1.924190525204346300f, 1.924085905477114400f, 1.923981215006744100f, + 1.923876453797084300f, + 1.923771621851986700f, 1.923666719175306100f, 1.923561745770898900f, + 1.923456701642625200f, + 1.923351586794346900f, 1.923246401229928600f, 1.923141144953238300f, + 1.923035817968145300f, + 1.922930420278522500f, 1.922824951888245000f, 1.922719412801190600f, + 1.922613803021239600f, + 1.922508122552275100f, 1.922402371398182600f, 1.922296549562850100f, + 1.922190657050168800f, + 1.922084693864031700f, 1.921978660008334600f, 1.921872555486976700f, + 1.921766380303858500f, + 1.921660134462884100f, 1.921553817967959900f, 1.921447430822994500f, + 1.921340973031900000f, + 1.921234444598590100f, 1.921127845526981600f, 1.921021175820994100f, + 1.920914435484549100f, + 1.920807624521571700f, 1.920700742935988600f, 1.920593790731729600f, + 1.920486767912727300f, + 1.920379674482916500f, 1.920272510446234400f, 1.920165275806621400f, + 1.920057970568020100f, + 1.919950594734376000f, 1.919843148309637000f, 1.919735631297753400f, + 1.919628043702678300f, + 1.919520385528367300f, 1.919412656778779000f, 1.919304857457874200f, + 1.919196987569616200f, + 1.919089047117971100f, 1.918981036106907700f, 1.918872954540397300f, + 1.918764802422413500f, + 1.918656579756932800f, 1.918548286547934400f, 1.918439922799399800f, + 1.918331488515313300f, + 1.918222983699661600f, 1.918114408356434300f, 1.918005762489623400f, + 1.917897046103223200f, + 1.917788259201231200f, 1.917679401787647100f, 1.917570473866473200f, + 1.917461475441714500f, + 1.917352406517378600f, 1.917243267097475700f, 1.917134057186018300f, + 1.917024776787022100f, + 1.916915425904504700f, 1.916806004542486800f, 1.916696512704991500f, + 1.916586950396044400f, + 1.916477317619674100f, 1.916367614379911100f, 1.916257840680788900f, + 1.916147996526343700f, + 1.916038081920614400f, 1.915928096867641800f, 1.915818041371470000f, + 1.915707915436145200f, + 1.915597719065716700f, 1.915487452264236000f, 1.915377115035757200f, + 1.915266707384337200f, + 1.915156229314035200f, 1.915045680828913400f, 1.914935061933036300f, + 1.914824372630470800f, + 1.914713612925287100f, 1.914602782821557000f, 1.914491882323355700f, + 1.914380911434760500f, + 1.914269870159851700f, 1.914158758502712000f, 1.914047576467426500f, + 1.913936324058083100f, + 1.913825001278772100f, 1.913713608133586600f, 1.913602144626622500f, + 1.913490610761977600f, + 1.913379006543752800f, 1.913267331976051400f, 1.913155587062979500f, + 1.913043771808645700f, + 1.912931886217160900f, 1.912819930292639000f, 1.912707904039196300f, + 1.912595807460951500f, + 1.912483640562026200f, 1.912371403346544400f, 1.912259095818632700f, + 1.912146717982420500f, + 1.912034269842039600f, 1.911921751401624200f, 1.911809162665311500f, + 1.911696503637241100f, + 1.911583774321554700f, 1.911470974722397500f, 1.911358104843916500f, + 1.911245164690262000f, + 1.911132154265586100f, 1.911019073574044200f, 1.910905922619793800f, + 1.910792701406995000f, + 1.910679409939810600f, 1.910566048222406300f, 1.910452616258949900f, + 1.910339114053611900f, + 1.910225541610565800f, 1.910111898933986900f, 1.909998186028053700f, + 1.909884402896947100f, + 1.909770549544850500f, 1.909656625975950200f, 1.909542632194434700f, + 1.909428568204495100f, + 1.909314434010325400f, 1.909200229616121700f, 1.909085955026083200f, + 1.908971610244411600f, + 1.908857195275310800f, 1.908742710122987700f, 1.908628154791651300f, + 1.908513529285513500f, + 1.908398833608789100f, 1.908284067765694900f, 1.908169231760450400f, + 1.908054325597278200f, + 1.907939349280402400f, 1.907824302814050900f, 1.907709186202453600f, + 1.907593999449842800f, + 1.907478742560453600f, 1.907363415538523700f, 1.907248018388293400f, + 1.907132551114005600f, + 1.907017013719905600f, 1.906901406210241200f, 1.906785728589263300f, + 1.906669980861224900f, + 1.906554163030381500f, 1.906438275100991600f, 1.906322317077316300f, + 1.906206288963618700f, + 1.906090190764164700f, 1.905974022483223300f, 1.905857784125065500f, + 1.905741475693964800f, + 1.905625097194197900f, 1.905508648630043700f, 1.905392130005783400f, + 1.905275541325701400f, + 1.905158882594083900f, 1.905042153815220700f, 1.904925354993402900f, + 1.904808486132925300f, + 1.904691547238084800f, 1.904574538313180700f, 1.904457459362515200f, + 1.904340310390393100f, + 1.904223091401121600f, 1.904105802399010300f, 1.903988443388371600f, + 1.903871014373520700f, + 1.903753515358774800f, 1.903635946348454500f, 1.903518307346881800f, + 1.903400598358382600f, + 1.903282819387284200f, 1.903164970437917400f, 1.903047051514615000f, + 1.902929062621712600f, + 1.902811003763547900f, 1.902692874944462300f, 1.902574676168798700f, + 1.902456407440902700f, + 1.902338068765123200f, 1.902219660145810800f, 1.902101181587319000f, + 1.901982633094004200f, + 1.901864014670225000f, 1.901745326320342500f, 1.901626568048721000f, + 1.901507739859726200f, + 1.901388841757727600f, 1.901269873747096600f, 1.901150835832207100f, + 1.901031728017436300f, + 1.900912550307162700f, 1.900793302705768900f, 1.900673985217638900f, + 1.900554597847159400f, + 1.900435140598720500f, 1.900315613476714100f, 1.900196016485534700f, + 1.900076349629579600f, + 1.899956612913248800f, 1.899836806340944300f, 1.899716929917071500f, + 1.899596983646037600f, + 1.899476967532252900f, 1.899356881580129800f, 1.899236725794083600f, + 1.899116500178532200f, + 1.898996204737895900f, 1.898875839476597700f, 1.898755404399062900f, + 1.898634899509719500f, + 1.898514324812998300f, 1.898393680313332600f, 1.898272966015157800f, + 1.898152181922912600f, + 1.898031328041037700f, 1.897910404373976500f, 1.897789410926175000f, + 1.897668347702081900f, + 1.897547214706148300f, 1.897426011942827900f, 1.897304739416577200f, + 1.897183397131854600f, + 1.897061985093121800f, 1.896940503304842800f, 1.896818951771484000f, + 1.896697330497514800f, + 1.896575639487406300f, 1.896453878745633100f, 1.896332048276672100f, + 1.896210148085002400f, + 1.896088178175106200f, 1.895966138551467700f, 1.895844029218574100f, + 1.895721850180915000f, + 1.895599601442982600f, 1.895477283009271400f, 1.895354894884279100f, + 1.895232437072505300f, + 1.895109909578452500f, 1.894987312406625700f, 1.894864645561532100f, + 1.894741909047682500f, + 1.894619102869589100f, 1.894496227031767100f, 1.894373281538734400f, + 1.894250266395011600f, + 1.894127181605121100f, 1.894004027173588700f, 1.893880803104942600f, + 1.893757509403713100f, + 1.893634146074433500f, 1.893510713121639300f, 1.893387210549869000f, + 1.893263638363663400f, + 1.893139996567565900f, 1.893016285166122500f, 1.892892504163881600f, + 1.892768653565394300f, + 1.892644733375214300f, 1.892520743597897700f, 1.892396684238003300f, + 1.892272555300092300f, + 1.892148356788728700f, 1.892024088708479200f, 1.891899751063912200f, + 1.891775343859599400f, + 1.891650867100115300f, 1.891526320790036100f, 1.891401704933941100f, + 1.891277019536412400f, + 1.891152264602033800f, 1.891027440135392600f, 1.890902546141078000f, + 1.890777582623682300f, + 1.890652549587799700f, 1.890527447038027300f, 1.890402274978965100f, + 1.890277033415215200f, + 1.890151722351382200f, 1.890026341792073500f, 1.889900891741899100f, + 1.889775372205471300f, + 1.889649783187405100f, 1.889524124692318200f, 1.889398396724830500f, + 1.889272599289564900f, + 1.889146732391146400f, 1.889020796034202700f, 1.888894790223364600f, + 1.888768714963264400f, + 1.888642570258537700f, 1.888516356113822700f, 1.888390072533759700f, + 1.888263719522991900f, + 1.888137297086165000f, 1.888010805227927000f, 1.887884243952928600f, + 1.887757613265823400f, + 1.887630913171267000f, 1.887504143673917700f, 1.887377304778437000f, + 1.887250396489487800f, + 1.887123418811736500f, 1.886996371749851700f, 1.886869255308504200f, + 1.886742069492368000f, + 1.886614814306119400f, 1.886487489754437300f, 1.886360095842002600f, + 1.886232632573499700f, + 1.886105099953614900f, 1.885977497987037000f, 1.885849826678457800f, + 1.885722086032571200f, + 1.885594276054074300f, 1.885466396747665700f, 1.885338448118047700f, + 1.885210430169924200f, + 1.885082342908002400f, 1.884954186336991400f, 1.884825960461603100f, + 1.884697665286552400f, + 1.884569300816556000f, 1.884440867056333700f, 1.884312364010607600f, + 1.884183791684102400f, + 1.884055150081545200f, 1.883926439207665800f, 1.883797659067196800f, + 1.883668809664872600f, + 1.883539891005431100f, 1.883410903093611900f, 1.883281845934157800f, + 1.883152719531813800f, + 1.883023523891327300f, 1.882894259017448900f, 1.882764924914930700f, + 1.882635521588528400f, + 1.882506049042999700f, 1.882376507283104900f, 1.882246896313606800f, + 1.882117216139270700f, + 1.881987466764865100f, 1.881857648195159900f, 1.881727760434928500f, + 1.881597803488946500f, + 1.881467777361992100f, 1.881337682058845700f, 1.881207517584290600f, + 1.881077283943112900f, + 1.880946981140100500f, 1.880816609180044700f, 1.880686168067738500f, + 1.880555657807977800f, + 1.880425078405561600f, 1.880294429865290600f, 1.880163712191968300f, + 1.880032925390400900f, + 1.879902069465397200f, 1.879771144421768200f, 1.879640150264327600f, + 1.879509086997891900f, + 1.879377954627279700f, 1.879246753157312700f, 1.879115482592814500f, + 1.878984142938611600f, + 1.878852734199532900f, 1.878721256380410100f, 1.878589709486077300f, + 1.878458093521370800f, + 1.878326408491130200f, 1.878194654400196600f, 1.878062831253414900f, + 1.877930939055631100f, + 1.877798977811695200f, 1.877666947526458700f, 1.877534848204775800f, + 1.877402679851504000f, + 1.877270442471502100f, 1.877138136069632400f, 1.877005760650759500f, + 1.876873316219750200f, + 1.876740802781474500f, 1.876608220340804100f, 1.876475568902614000f, + 1.876342848471781200f, + 1.876210059053185600f, 1.876077200651709500f, 1.875944273272237800f, + 1.875811276919657500f, + 1.875678211598858800f, 1.875545077314734000f, 1.875411874072178100f, + 1.875278601876088700f, + 1.875145260731365700f, 1.875011850642911600f, 1.874878371615631900f, + 1.874744823654434000f, + 1.874611206764227800f, 1.874477520949926500f, 1.874343766216444800f, + 1.874209942568701100f, + 1.874076050011615400f, 1.873942088550110400f, 1.873808058189111700f, + 1.873673958933546900f, + 1.873539790788347100f, 1.873405553758444600f, 1.873271247848775400f, + 1.873136873064277000f, + 1.873002429409890600f, 1.872867916890558900f, 1.872733335511227700f, + 1.872598685276845000f, + 1.872463966192361900f, 1.872329178262731200f, 1.872194321492908700f, + 1.872059395887852900f, + 1.871924401452524700f, 1.871789338191887100f, 1.871654206110906500f, + 1.871519005214550700f, + 1.871383735507791100f, 1.871248396995601300f, 1.871112989682956800f, + 1.870977513574836500f, + 1.870841968676221400f, 1.870706354992095000f, 1.870570672527443600f, + 1.870434921287255700f, + 1.870299101276522400f, 1.870163212500237900f, 1.870027254963397800f, + 1.869891228671001200f, + 1.869755133628049600f, 1.869618969839546500f, 1.869482737310498100f, + 1.869346436045913800f, + 1.869210066050804600f, 1.869073627330184700f, 1.868937119889070300f, + 1.868800543732480600f, + 1.868663898865437200f, 1.868527185292963700f, 1.868390403020087100f, + 1.868253552051836200f, + 1.868116632393243000f, 1.867979644049341200f, 1.867842587025167800f, + 1.867705461325761800f, + 1.867568266956164800f, 1.867431003921421500f, 1.867293672226578300f, + 1.867156271876684500f, + 1.867018802876792200f, 1.866881265231955500f, 1.866743658947231300f, + 1.866605984027679000f, + 1.866468240478360600f, 1.866330428304340300f, 1.866192547510685300f, + 1.866054598102465000f, + 1.865916580084751500f, 1.865778493462619100f, 1.865640338241145100f, + 1.865502114425408900f, + 1.865363822020492700f, 1.865225461031480900f, 1.865087031463460900f, + 1.864948533321522300f, + 1.864809966610757400f, 1.864671331336260600f, 1.864532627503129100f, + 1.864393855116463200f, + 1.864255014181364500f, 1.864116104702938000f, 1.863977126686291200f, + 1.863838080136534000f, + 1.863698965058778300f, 1.863559781458139300f, 1.863420529339734100f, + 1.863281208708683000f, + 1.863141819570107900f, 1.863002361929134500f, 1.862862835790889400f, + 1.862723241160503300f, + 1.862583578043108100f, 1.862443846443839300f, 1.862304046367834200f, + 1.862164177820232700f, + 1.862024240806177800f, 1.861884235330814300f, 1.861744161399289600f, + 1.861604019016754200f, + 1.861463808188360500f, 1.861323528919263800f, 1.861183181214621600f, + 1.861042765079594200f, + 1.860902280519344500f, 1.860761727539037300f, 1.860621106143840500f, + 1.860480416338924600f, + 1.860339658129461800f, 1.860198831520627900f, 1.860057936517600700f, + 1.859916973125560000f, + 1.859775941349689000f, 1.859634841195173100f, 1.859493672667199800f, + 1.859352435770959900f, + 1.859211130511645900f, 1.859069756894453400f, 1.858928314924580300f, + 1.858786804607227100f, + 1.858645225947596300f, 1.858503578950893900f, 1.858361863622327400f, + 1.858220079967107600f, + 1.858078227990447300f, 1.857936307697561900f, 1.857794319093669900f, + 1.857652262183991000f, + 1.857510136973749000f, 1.857367943468169100f, 1.857225681672479300f, + 1.857083351591910300f, + 1.856940953231694900f, 1.856798486597069000f, 1.856655951693270600f, + 1.856513348525540300f, + 1.856370677099121100f, 1.856227937419258700f, 1.856085129491201100f, + 1.855942253320199200f, + 1.855799308911506100f, 1.855656296270377300f, 1.855513215402071000f, + 1.855370066311848000f, + 1.855226849004971500f, 1.855083563486706900f, 1.854940209762322700f, + 1.854796787837089500f, + 1.854653297716280400f, 1.854509739405171300f, 1.854366112909040300f, + 1.854222418233168400f, + 1.854078655382838300f, 1.853934824363336200f, 1.853790925179950500f, + 1.853646957837971500f, + 1.853502922342692600f, 1.853358818699409900f, 1.853214646913421200f, + 1.853070406990027500f, + 1.852926098934532200f, 1.852781722752241000f, 1.852637278448462200f, + 1.852492766028506400f, + 1.852348185497687300f, 1.852203536861320600f, 1.852058820124724300f, + 1.851914035293219700f, + 1.851769182372129600f, 1.851624261366780400f, 1.851479272282500000f, + 1.851334215124619300f, + 1.851189089898471800f, 1.851043896609393400f, 1.850898635262721900f, + 1.850753305863798800f, + 1.850607908417967200f, 1.850462442930572900f, 1.850316909406964200f, + 1.850171307852492200f, + 1.850025638272510000f, 1.849879900672373600f, 1.849734095057441200f, + 1.849588221433073700f, + 1.849442279804634600f, 1.849296270177489800f, 1.849150192557007300f, + 1.849004046948558200f, + 1.848857833357515900f, 1.848711551789256300f, 1.848565202249157400f, + 1.848418784742600400f, + 1.848272299274968500f, 1.848125745851647800f, 1.847979124478026100f, + 1.847832435159495000f, + 1.847685677901447200f, 1.847538852709279100f, 1.847391959588388300f, + 1.847244998544176300f, + 1.847097969582046200f, 1.846950872707404000f, 1.846803707925657600f, + 1.846656475242218300f, + 1.846509174662499300f, 1.846361806191916000f, 1.846214369835887500f, + 1.846066865599834000f, + 1.845919293489179000f, 1.845771653509348200f, 1.845623945665770100f, + 1.845476169963875500f, + 1.845328326409097400f, 1.845180415006871800f, 1.845032435762637100f, + 1.844884388681833800f, + 1.844736273769905300f, 1.844588091032297400f, 1.844439840474458200f, + 1.844291522101838800f, + 1.844143135919891900f, 1.843994681934073600f, 1.843846160149842200f, + 1.843697570572658200f, + 1.843548913207985000f, 1.843400188061288000f, 1.843251395138035800f, + 1.843102534443698900f, + 1.842953605983750400f, 1.842804609763666100f, 1.842655545788924000f, + 1.842506414065004900f, + 1.842357214597392100f, 1.842207947391570900f, 1.842058612453029600f, + 1.841909209787258900f, + 1.841759739399751800f, 1.841610201296003800f, 1.841460595481513100f, + 1.841310921961780500f, + 1.841161180742308500f, 1.841011371828603200f, 1.840861495226172600f, + 1.840711550940526700f, + 1.840561538977179200f, 1.840411459341645400f, 1.840261312039443100f, + 1.840111097076092800f, + 1.839960814457117600f, 1.839810464188043100f, 1.839660046274397100f, + 1.839509560721709800f, + 1.839359007535514400f, 1.839208386721346500f, 1.839057698284743500f, + 1.838906942231246100f, + 1.838756118566397200f, 1.838605227295741800f, 1.838454268424828400f, + 1.838303241959206700f, + 1.838152147904429800f, 1.838000986266052900f, 1.837849757049633900f, + 1.837698460260732900f, + 1.837547095904912700f, 1.837395663987738700f, 1.837244164514778600f, + 1.837092597491602100f, + 1.836940962923782700f, 1.836789260816895000f, 1.836637491176516600f, + 1.836485654008228200f, + 1.836333749317611700f, 1.836181777110252900f, 1.836029737391738700f, + 1.835877630167659800f, + 1.835725455443608200f, 1.835573213225179400f, 1.835420903517970500f, + 1.835268526327581900f, + 1.835116081659615700f, 1.834963569519677100f, 1.834810989913373500f, + 1.834658342846314800f, + 1.834505628324113200f, 1.834352846352383700f, 1.834199996936744000f, + 1.834047080082813300f, + 1.833894095796214400f, 1.833741044082571900f, 1.833587924947513100f, + 1.833434738396668000f, + 1.833281484435668400f, 1.833128163070149300f, 1.832974774305747600f, + 1.832821318148103500f, + 1.832667794602858400f, 1.832514203675657600f, 1.832360545372147900f, + 1.832206819697979000f, + 1.832053026658802700f, 1.831899166260273700f, 1.831745238508049300f, + 1.831591243407788300f, + 1.831437180965153100f, 1.831283051185808300f, 1.831128854075420500f, + 1.830974589639659000f, + 1.830820257884196100f, 1.830665858814705600f, 1.830511392436864800f, + 1.830356858756352800f, + 1.830202257778851300f, 1.830047589510044500f, 1.829892853955619200f, + 1.829738051121264600f, + 1.829583181012672400f, 1.829428243635536500f, 1.829273238995553700f, + 1.829118167098423100f, + 1.828963027949846100f, 1.828807821555527000f, 1.828652547921171900f, + 1.828497207052490100f, + 1.828341798955192900f, 1.828186323634994200f, 1.828030781097610400f, + 1.827875171348760400f, + 1.827719494394165500f, 1.827563750239549400f, 1.827407938890638600f, + 1.827252060353161500f, + 1.827096114632849700f, 1.826940101735436500f, 1.826784021666658400f, + 1.826627874432253700f, + 1.826471660037963800f, 1.826315378489531800f, 1.826159029792704400f, + 1.826002613953229500f, + 1.825846130976858100f, 1.825689580869344100f, 1.825532963636443000f, + 1.825376279283913200f, + 1.825219527817515800f, 1.825062709243013800f, 1.824905823566173000f, + 1.824748870792761900f, + 1.824591850928550800f, 1.824434763979313300f, 1.824277609950824700f, + 1.824120388848863300f, + 1.823963100679209600f, 1.823805745447646600f, 1.823648323159960100f, + 1.823490833821937600f, + 1.823333277439369600f, 1.823175654018049300f, 1.823017963563772000f, + 1.822860206082335300f, + 1.822702381579539800f, 1.822544490061187800f, 1.822386531533084900f, + 1.822228506001038800f, + 1.822070413470859600f, 1.821912253948359700f, 1.821754027439354400f, + 1.821595733949661100f, + 1.821437373485099900f, 1.821278946051493100f, 1.821120451654665700f, + 1.820961890300445400f, + 1.820803261994661500f, 1.820644566743146800f, 1.820485804551735800f, + 1.820326975426265600f, + 1.820168079372576300f, 1.820009116396509800f, 1.819850086503910700f, + 1.819690989700625900f, + 1.819531825992505500f, 1.819372595385401000f, 1.819213297885166900f, + 1.819053933497660300f, + 1.818894502228740600f, 1.818735004084269600f, 1.818575439070111200f, + 1.818415807192132600f, + 1.818256108456203000f, 1.818096342868193800f, 1.817936510433979300f, + 1.817776611159436000f, + 1.817616645050443000f, 1.817456612112881900f, 1.817296512352636300f, + 1.817136345775592900f, + 1.816976112387640700f, 1.816815812194670700f, 1.816655445202576700f, + 1.816495011417255300f, + 1.816334510844604700f, 1.816173943490526400f, 1.816013309360923900f, + 1.815852608461703300f, + 1.815691840798773000f, 1.815531006378043900f, 1.815370105205429600f, + 1.815209137286846200f, + 1.815048102628211500f, 1.814887001235446600f, 1.814725833114474700f, + 1.814564598271221300f, + 1.814403296711615000f, 1.814241928441585800f, 1.814080493467067300f, + 1.813918991793994900f, + 1.813757423428306000f, 1.813595788375941700f, 1.813434086642844400f, + 1.813272318234959700f, + 1.813110483158235400f, 1.812948581418621500f, 1.812786613022070700f, + 1.812624577974538000f, + 1.812462476281981200f, 1.812300307950360300f, 1.812138072985637800f, + 1.811975771393778300f, + 1.811813403180749300f, 1.811650968352521000f, 1.811488466915065000f, + 1.811325898874356800f, + 1.811163264236372900f, 1.811000563007093100f, 1.810837795192499400f, + 1.810674960798576600f, + 1.810512059831311400f, 1.810349092296693400f, 1.810186058200714100f, + 1.810022957549368000f, + 1.809859790348652200f, 1.809696556604565300f, 1.809533256323109200f, + 1.809369889510288100f, + 1.809206456172108200f, 1.809042956314578900f, 1.808879389943711200f, + 1.808715757065519200f, + 1.808552057686019200f, 1.808388291811230000f, 1.808224459447172800f, + 1.808060560599871200f, + 1.807896595275351200f, 1.807732563479641300f, 1.807568465218772900f, + 1.807404300498778800f, + 1.807240069325695400f, 1.807075771705560800f, 1.806911407644415700f, + 1.806746977148303300f, + 1.806582480223269500f, 1.806417916875362000f, 1.806253287110631600f, + 1.806088590935131000f, + 1.805923828354915900f, 1.805758999376044100f, 1.805594104004575800f, + 1.805429142246573600f, + 1.805264114108102900f, 1.805099019595231200f, 1.804933858714028700f, + 1.804768631470567500f, + 1.804603337870923000f, 1.804437977921172300f, 1.804272551627395400f, + 1.804107058995674500f, + 1.803941500032094200f, 1.803775874742741500f, 1.803610183133706400f, + 1.803444425211080400f, + 1.803278600980958300f, 1.803112710449436900f, 1.802946753622615400f, + 1.802780730506595700f, + 1.802614641107481900f, 1.802448485431380900f, 1.802282263484401300f, + 1.802115975272655000f, + 1.801949620802255600f, 1.801783200079319900f, 1.801616713109966300f, + 1.801450159900316300f, + 1.801283540456493700f, 1.801116854784624400f, 1.800950102890836800f, + 1.800783284781262200f, + 1.800616400462033800f, 1.800449449939287800f, 1.800282433219162000f, + 1.800115350307797600f, + 1.799948201211337500f, 1.799780985935927300f, 1.799613704487715200f, + 1.799446356872851400f, + 1.799278943097489100f, 1.799111463167783400f, 1.798943917089892000f, + 1.798776304869975200f, + 1.798608626514195800f, 1.798440882028718500f, 1.798273071419711000f, + 1.798105194693343500f, + 1.797937251855787700f, 1.797769242913218800f, 1.797601167871813800f, + 1.797433026737752700f, + 1.797264819517217200f, 1.797096546216391900f, 1.796928206841463800f, + 1.796759801398622100f, + 1.796591329894058800f, 1.796422792333968000f, 1.796254188724546500f, + 1.796085519071992900f, + 1.795916783382509200f, 1.795747981662299200f, 1.795579113917569200f, + 1.795410180154527900f, + 1.795241180379386800f, 1.795072114598359200f, 1.794902982817661500f, + 1.794733785043511900f, + 1.794564521282131300f, 1.794395191539743400f, 1.794225795822573600f, + 1.794056334136850300f, + 1.793886806488804100f, 1.793717212884667900f, 1.793547553330677300f, + 1.793377827833070100f, + 1.793208036398086900f, 1.793038179031970000f, 1.792868255740965000f, + 1.792698266531319400f, + 1.792528211409282900f, 1.792358090381108300f, 1.792187903453050100f, + 1.792017650631366100f, + 1.791847331922315600f, 1.791676947332161000f, 1.791506496867166600f, + 1.791335980533599300f, + 1.791165398337728900f, 1.790994750285827000f, 1.790824036384167900f, + 1.790653256639028100f, + 1.790482411056686800f, 1.790311499643425500f, 1.790140522405528200f, + 1.789969479349281100f, + 1.789798370480973000f, 1.789627195806895200f, 1.789455955333341100f, + 1.789284649066606800f, + 1.789113277012990900f, 1.788941839178794100f, 1.788770335570319700f, + 1.788598766193873600f, + 1.788427131055763600f, 1.788255430162300400f, 1.788083663519796800f, + 1.787911831134568300f, + 1.787739933012932900f, 1.787567969161210300f, 1.787395939585723500f, + 1.787223844292797500f, + 1.787051683288759500f, 1.786879456579939700f, 1.786707164172670200f, + 1.786534806073285700f, + 1.786362382288123400f, 1.786189892823522700f, 1.786017337685825700f, + 1.785844716881376700f, + 1.785672030416522300f, 1.785499278297612000f, 1.785326460530997300f, + 1.785153577123032000f, + 1.784980628080072900f, 1.784807613408478300f, 1.784634533114609800f, + 1.784461387204831400f, + 1.784288175685508700f, 1.784114898563010200f, 1.783941555843707100f, + 1.783768147533972200f, + 1.783594673640181800f, 1.783421134168713800f, 1.783247529125948900f, + 1.783073858518269700f, + 1.782900122352062000f, 1.782726320633713200f, 1.782552453369613800f, + 1.782378520566156200f, + 1.782204522229735600f, 1.782030458366749200f, 1.781856328983596900f, + 1.781682134086680900f, + 1.781507873682406200f, 1.781333547777179200f, 1.781159156377410100f, + 1.780984699489510200f, + 1.780810177119894100f, 1.780635589274978600f, 1.780460935961182300f, + 1.780286217184927000f, + 1.780111432952636600f, 1.779936583270737400f, 1.779761668145658300f, + 1.779586687583830200f, + 1.779411641591686500f, 1.779236530175663600f, 1.779061353342199500f, + 1.778886111097735000f, + 1.778710803448713400f, 1.778535430401580100f, 1.778359991962783000f, + 1.778184488138772900f, + 1.778008918936002000f, 1.777833284360925900f, 1.777657584420002000f, + 1.777481819119690200f, + 1.777305988466453000f, 1.777130092466755200f, 1.776954131127064200f, + 1.776778104453849100f, + 1.776602012453582400f, 1.776425855132738100f, 1.776249632497793200f, + 1.776073344555227000f, + 1.775896991311520800f, 1.775720572773158900f, 1.775544088946627600f, + 1.775367539838415700f, + 1.775190925455014400f, 1.775014245802917200f, 1.774837500888620400f, + 1.774660690718622000f, + 1.774483815299423100f, 1.774306874637527000f, 1.774129868739439100f, + 1.773952797611667100f, + 1.773775661260722100f, 1.773598459693116500f, 1.773421192915365400f, + 1.773243860933986400f, + 1.773066463755499800f, 1.772889001386427800f, 1.772711473833295200f, + 1.772533881102629000f, + 1.772356223200959100f, 1.772178500134817100f, 1.772000711910737700f, + 1.771822858535257600f, + 1.771644940014915700f, 1.771466956356254000f, 1.771288907565816000f, + 1.771110793650148500f, + 1.770932614615799800f, 1.770754370469321400f, 1.770576061217266500f, + 1.770397686866191300f, + 1.770219247422653700f, 1.770040742893215000f, 1.769862173284438000f, + 1.769683538602888000f, + 1.769504838855133100f, 1.769326074047743700f, 1.769147244187292200f, + 1.768968349280353800f, + 1.768789389333506000f, 1.768610364353328600f, 1.768431274346403900f, + 1.768252119319316400f, + 1.768072899278653200f, 1.767893614231003800f, 1.767714264182959500f, + 1.767534849141115100f, + 1.767355369112067100f, 1.767175824102414000f, 1.766996214118757800f, + 1.766816539167701800f, + 1.766636799255852300f, 1.766456994389817600f, 1.766277124576209000f, + 1.766097189821639300f, + 1.765917190132724600f, 1.765737125516083000f, 1.765556995978334800f, + 1.765376801526102700f, + 1.765196542166012100f, 1.765016217904690900f, 1.764835828748768400f, + 1.764655374704877700f, + 1.764474855779653200f, 1.764294271979732100f, 1.764113623311754000f, + 1.763932909782361100f, + 1.763752131398197200f, 1.763571288165909400f, 1.763390380092146400f, + 1.763209407183560200f, + 1.763028369446804500f, 1.762847266888535100f, 1.762666099515411100f, + 1.762484867334093400f, + 1.762303570351245300f, 1.762122208573532600f, 1.761940782007623600f, + 1.761759290660188400f, + 1.761577734537900500f, 1.761396113647435000f, 1.761214427995469100f, + 1.761032677588683800f, + 1.760850862433760700f, 1.760668982537384900f, 1.760487037906243600f, + 1.760305028547026500f, + 1.760122954466425600f, 1.759940815671135100f, 1.759758612167851700f, + 1.759576343963274600f, + 1.759394011064105100f, 1.759211613477047200f, 1.759029151208807400f, + 1.758846624266093800f, + 1.758664032655617500f, 1.758481376384092500f, 1.758298655458233600f, + 1.758115869884759700f, + 1.757933019670390800f, 1.757750104821850000f, 1.757567125345862700f, + 1.757384081249156100f, + 1.757200972538460700f, 1.757017799220508500f, 1.756834561302034400f, + 1.756651258789775800f, + 1.756467891690471700f, 1.756284460010864200f, 1.756100963757697900f, + 1.755917402937718900f, + 1.755733777557676500f, 1.755550087624322000f, 1.755366333144409200f, + 1.755182514124693900f, + 1.754998630571935200f, 1.754814682492893600f, 1.754630669894332600f, + 1.754446592783017500f, + 1.754262451165716300f, 1.754078245049199600f, 1.753893974440240000f, + 1.753709639345612600f, + 1.753525239772095100f, 1.753340775726466700f, 1.753156247215510400f, + 1.752971654246010300f, + 1.752786996824753600f, 1.752602274958529500f, 1.752417488654129700f, + 1.752232637918348200f, + 1.752047722757981600f, 1.751862743179828600f, 1.751677699190690400f, + 1.751492590797370600f, + 1.751307418006674800f, 1.751122180825411800f, 1.750936879260391700f, + 1.750751513318427700f, + 1.750566083006335600f, 1.750380588330932500f, 1.750195029299038900f, + 1.750009405917477100f, + 1.749823718193071800f, 1.749637966132650900f, 1.749452149743043100f, + 1.749266269031080700f, + 1.749080324003598100f, 1.748894314667431800f, 1.748708241029421000f, + 1.748522103096407300f, + 1.748335900875233900f, 1.748149634372747200f, 1.747963303595795500f, + 1.747776908551230000f, + 1.747590449245904000f, 1.747403925686672500f, 1.747217337880393900f, + 1.747030685833928200f, + 1.746843969554138200f, 1.746657189047889200f, 1.746470344322048200f, + 1.746283435383485100f, + 1.746096462239072000f, 1.745909424895683200f, 1.745722323360195900f, + 1.745535157639489100f, + 1.745347927740444200f, 1.745160633669945200f, 1.744973275434878300f, + 1.744785853042132300f, + 1.744598366498598200f, 1.744410815811169300f, 1.744223200986741100f, + 1.744035522032211900f, + 1.743847778954482000f, 1.743659971760454200f, 1.743472100457033700f, + 1.743284165051127700f, + 1.743096165549646400f, 1.742908101959502100f, 1.742719974287608900f, + 1.742531782540884100f, + 1.742343526726246800f, 1.742155206850618800f, 1.741966822920923800f, + 1.741778374944088000f, + 1.741589862927040800f, 1.741401286876712800f, 1.741212646800037300f, + 1.741023942703950200f, + 1.740835174595389600f, 1.740646342481295900f, 1.740457446368612000f, + 1.740268486264283200f, + 1.740079462175256900f, 1.739890374108482600f, 1.739701222070913200f, + 1.739512006069502800f, + 1.739322726111208500f, 1.739133382202989500f, 1.738943974351807600f, + 1.738754502564626700f, + 1.738564966848413100f, 1.738375367210135400f, 1.738185703656765200f, + 1.737995976195275000f, + 1.737806184832640900f, 1.737616329575841300f, 1.737426410431856200f, + 1.737236427407668800f, + 1.737046380510263800f, 1.736856269746629000f, 1.736666095123754000f, + 1.736475856648631400f, + 1.736285554328254900f, 1.736095188169622500f, 1.735904758179732400f, + 1.735714264365586700f, + 1.735523706734189100f, 1.735333085292545900f, 1.735142400047666100f, + 1.734951651006560100f, + 1.734760838176241400f, 1.734569961563725600f, 1.734379021176030600f, + 1.734188017020177100f, + 1.733996949103187500f, 1.733805817432086900f, 1.733614622013902600f, + 1.733423362855664100f, + 1.733232039964403900f, 1.733040653347156300f, 1.732849203010957900f, + 1.732657688962847600f, + 1.732466111209867200f, 1.732274469759060200f, 1.732082764617472800f, + 1.731890995792153600f, + 1.731699163290153100f, 1.731507267118524500f, 1.731315307284323700f, + 1.731123283794607800f, + 1.730931196656437600f, 1.730739045876875200f, 1.730546831462985500f, + 1.730354553421835600f, + 1.730162211760495300f, 1.729969806486036500f, 1.729777337605533000f, + 1.729584805126061400f, + 1.729392209054700900f, 1.729199549398532400f, 1.729006826164639400f, + 1.728814039360108100f, + 1.728621188992026400f, 1.728428275067485100f, 1.728235297593577100f, + 1.728042256577397200f, + 1.727849152026043500f, 1.727655983946615700f, 1.727462752346216000f, + 1.727269457231948900f, + 1.727076098610921500f, 1.726882676490243000f, 1.726689190877025000f, + 1.726495641778381200f, + 1.726302029201427900f, 1.726108353153283900f, 1.725914613641069900f, + 1.725720810671909300f, + 1.725526944252927700f, 1.725333014391252900f, 1.725139021094015200f, + 1.724944964368347000f, + 1.724750844221383500f, 1.724556660660261800f, 1.724362413692121400f, + 1.724168103324104300f, + 1.723973729563354600f, 1.723779292417019200f, 1.723584791892246700f, + 1.723390227996188600f, + 1.723195600735998100f, 1.723000910118831300f, 1.722806156151846400f, + 1.722611338842204000f, + 1.722416458197066900f, 1.722221514223600100f, 1.722026506928971500f, + 1.721831436320350800f, + 1.721636302404910200f, 1.721441105189824000f, 1.721245844682269600f, + 1.721050520889425600f, + 1.720855133818473900f, 1.720659683476597900f, 1.720464169870984200f, + 1.720268593008821100f, + 1.720072952897299100f, 1.719877249543611900f, 1.719681482954954500f, + 1.719485653138524800f, + 1.719289760101522900f, 1.719093803851151400f, 1.718897784394614900f, + 1.718701701739120400f, + 1.718505555891877400f, 1.718309346860097600f, 1.718113074650995200f, + 1.717916739271786500f, + 1.717720340729689700f, 1.717523879031926500f, 1.717327354185719900f, + 1.717130766198295700f, + 1.716934115076881800f, 1.716737400828708400f, 1.716540623461008100f, + 1.716343782981016200f, + 1.716146879395969500f, 1.715949912713108100f, 1.715752882939673300f, + 1.715555790082909900f, + 1.715358634150064000f, 1.715161415148384500f, 1.714964133085122900f, + 1.714766787967532600f, + 1.714569379802868900f, 1.714371908598390800f, 1.714174374361358000f, + 1.713976777099033700f, + 1.713779116818682900f, 1.713581393527573000f, 1.713383607232973600f, + 1.713185757942156800f, + 1.712987845662396800f, 1.712789870400970700f, 1.712591832165157200f, + 1.712393730962237500f, + 1.712195566799495500f, 1.711997339684216700f, 1.711799049623689900f, + 1.711600696625205300f, + 1.711402280696055800f, 1.711203801843536700f, 1.711005260074945200f, + 1.710806655397581600f, + 1.710607987818747700f, 1.710409257345748100f, 1.710210463985889500f, + 1.710011607746480600f, + 1.709812688634833300f, 1.709613706658261100f, 1.709414661824080000f, + 1.709215554139608400f, + 1.709016383612166600f, 1.708817150249077900f, 1.708617854057667300f, + 1.708418495045262300f, + 1.708219073219193300f, 1.708019588586791700f, 1.707820041155392500f, + 1.707620430932332400f, + 1.707420757924950300f, 1.707221022140587900f, 1.707021223586588700f, + 1.706821362270298600f, + 1.706621438199066300f, 1.706421451380242000f, 1.706221401821179200f, + 1.706021289529232800f, + 1.705821114511760300f, 1.705620876776121600f, 1.705420576329679000f, + 1.705220213179796900f, + 1.705019787333842200f, 1.704819298799183700f, 1.704618747583193100f, + 1.704418133693243800f, + 1.704217457136711900f, 1.704016717920976000f, 1.703815916053416300f, + 1.703615051541415900f, + 1.703414124392360000f, 1.703213134613636100f, 1.703012082212634000f, + 1.702810967196746000f, + 1.702609789573366300f, 1.702408549349891500f, 1.702207246533721000f, + 1.702005881132255800f, + 1.701804453152900000f, 1.701602962603059100f, 1.701401409490141300f, + 1.701199793821557300f, + 1.700998115604720000f, 1.700796374847044300f, 1.700594571555948100f, + 1.700392705738850400f, + 1.700190777403173700f, 1.699988786556342300f, 1.699786733205783000f, + 1.699584617358924400f, + 1.699382439023197700f, 1.699180198206036600f, 1.698977894914877100f, + 1.698775529157156700f, + 1.698573100940316400f, 1.698370610271798800f, 1.698168057159048700f, + 1.697965441609513300f, + 1.697762763630642700f, 1.697560023229888200f, 1.697357220414704500f, + 1.697154355192547900f, + 1.696951427570877000f, 1.696748437557152900f, 1.696545385158839200f, + 1.696342270383401200f, + 1.696139093238307400f, 1.695935853731027600f, 1.695732551869034300f, + 1.695529187659802400f, + 1.695325761110809200f, 1.695122272229534000f, 1.694918721023458600f, + 1.694715107500066800f, + 1.694511431666845000f, 1.694307693531282000f, 1.694103893100868100f, + 1.693900030383096900f, + 1.693696105385463800f, 1.693492118115466500f, 1.693288068580604900f, + 1.693083956788381500f, + 1.692879782746300700f, 1.692675546461869900f, 1.692471247942597600f, + 1.692266887195995600f, + 1.692062464229577600f, 1.691857979050859900f, 1.691653431667360600f, + 1.691448822086600400f, + 1.691244150316102000f, 1.691039416363390800f, 1.690834620235994300f, + 1.690629761941442100f, + 1.690424841487266700f, 1.690219858881001800f, 1.690014814130184300f, + 1.689809707242353200f, + 1.689604538225049700f, 1.689399307085817300f, 1.689194013832201500f, + 1.688988658471750600f, + 1.688783241012014700f, 1.688577761460546800f, 1.688372219824901400f, + 1.688166616112636100f, + 1.687960950331309800f, 1.687755222488484600f, 1.687549432591724400f, + 1.687343580648595700f, + 1.687137666666667100f, 1.686931690653509000f, 1.686725652616694900f, + 1.686519552563800400f, + 1.686313390502403000f, 1.686107166440082600f, 1.685900880384421800f, + 1.685694532343004600f, + 1.685488122323418400f, 1.685281650333251900f, 1.685075116380096800f, + 1.684868520471546600f, + 1.684661862615197000f, 1.684455142818646700f, 1.684248361089495800f, + 1.684041517435347400f, + 1.683834611863806100f, 1.683627644382479800f, 1.683420614998977900f, + 1.683213523720911800f, + 1.683006370555896400f, 1.682799155511547600f, 1.682591878595484300f, + 1.682384539815327400f, + 1.682177139178700400f, 1.681969676693228600f, 1.681762152366539600f, + 1.681554566206263900f, + 1.681346918220033800f, 1.681139208415483700f, 1.680931436800250600f, + 1.680723603381973500f, + 1.680515708168294200f, 1.680307751166856300f, 1.680099732385305300f, + 1.679891651831290100f, + 1.679683509512460900f, 1.679475305436470600f, 1.679267039610974300f, + 1.679058712043629300f, + 1.678850322742095200f, 1.678641871714033900f, 1.678433358967109400f, + 1.678224784508988400f, + 1.678016148347339300f, 1.677807450489833300f, 1.677598690944143400f, + 1.677389869717945000f, + 1.677180986818916300f, 1.676972042254736900f, 1.676763036033089600f, + 1.676553968161658600f, + 1.676344838648130600f, 1.676135647500194700f, 1.675926394725542700f, + 1.675717080331867900f, + 1.675507704326866200f, 1.675298266718235900f, 1.675088767513677200f, + 1.674879206720892900f, + 1.674669584347587800f, 1.674459900401469700f, 1.674250154890247300f, + 1.674040347821632800f, + 1.673830479203340000f, 1.673620549043085500f, 1.673410557348587600f, + 1.673200504127567000f, + 1.672990389387746700f, 1.672780213136852300f, 1.672569975382611300f, + 1.672359676132753500f, + 1.672149315395010900f, 1.671938893177118000f, 1.671728409486811500f, + 1.671517864331830000f, + 1.671307257719914800f, 1.671096589658809500f, 1.670885860156259300f, + 1.670675069220012500f, + 1.670464216857819200f, 1.670253303077431800f, 1.670042327886605200f, + 1.669831291293095900f, + 1.669620193304663500f, 1.669409033929069500f, 1.669197813174077200f, + 1.668986531047453000f, + 1.668775187556965000f, 1.668563782710383600f, 1.668352316515481700f, + 1.668140788980034400f, + 1.667929200111818400f, 1.667717549918614100f, 1.667505838408202700f, + 1.667294065588368100f, + 1.667082231466896900f, 1.666870336051577800f, 1.666658379350201000f, + 1.666446361370560000f, + 1.666234282120450100f, 1.666022141607668600f, 1.665809939840015500f, + 1.665597676825292700f, + 1.665385352571304500f, 1.665172967085857700f, 1.664960520376761000f, + 1.664748012451825200f, + 1.664535443318863900f, 1.664322812985692600f, 1.664110121460129000f, + 1.663897368749993400f, + 1.663684554863107800f, 1.663471679807296800f, 1.663258743590387400f, + 1.663045746220208600f, + 1.662832687704591800f, 1.662619568051370500f, 1.662406387268380100f, + 1.662193145363459100f, + 1.661979842344447600f, 1.661766478219188300f, 1.661553052995526000f, + 1.661339566681307600f, + 1.661126019284382200f, 1.660912410812601900f, 1.660698741273819700f, + 1.660485010675892400f, + 1.660271219026677700f, 1.660057366334036300f, 1.659843452605831200f, + 1.659629477849926800f, + 1.659415442074190900f, 1.659201345286492900f, 1.658987187494704200f, + 1.658772968706699000f, + 1.658558688930353400f, 1.658344348173546300f, 1.658129946444157700f, + 1.657915483750071100f, + 1.657700960099171200f, 1.657486375499345900f, 1.657271729958484500f, + 1.657057023484479000f, + 1.656842256085223800f, 1.656627427768615000f, 1.656412538542551200f, + 1.656197588414933600f, + 1.655982577393664700f, 1.655767505486650500f, 1.655552372701798200f, + 1.655337179047017700f, + 1.655121924530220900f, 1.654906609159322500f, 1.654691232942238500f, + 1.654475795886888300f, + 1.654260298001192200f, 1.654044739293073900f, 1.653829119770458900f, + 1.653613439441274500f, + 1.653397698313451300f, 1.653181896394921000f, 1.652966033693617800f, + 1.652750110217479100f, + 1.652534125974443000f, 1.652318080972451400f, 1.652101975219447200f, + 1.651885808723375900f, + 1.651669581492185300f, 1.651453293533826000f, 1.651236944856249600f, + 1.651020535467411200f, + 1.650804065375267400f, 1.650587534587776700f, 1.650370943112901000f, + 1.650154290958603300f, + 1.649937578132849400f, 1.649720804643607400f, 1.649503970498847200f, + 1.649287075706541200f, + 1.649070120274664000f, 1.648853104211192700f, 1.648636027524106100f, + 1.648418890221385400f, + 1.648201692311014300f, 1.647984433800978600f, 1.647767114699266100f, + 1.647549735013867000f, + 1.647332294752774200f, 1.647114793923981600f, 1.646897232535486500f, + 1.646679610595287900f, + 1.646461928111387300f, 1.646244185091788400f, 1.646026381544496400f, + 1.645808517477519700f, + 1.645590592898868600f, 1.645372607816555400f, 1.645154562238594800f, + 1.644936456173004000f, + 1.644718289627801600f, 1.644500062611009300f, 1.644281775130650900f, + 1.644063427194751600f, + 1.643845018811340300f, 1.643626549988446200f, 1.643408020734102600f, + 1.643189431056343700f, + 1.642970780963206800f, 1.642752070462730800f, 1.642533299562957100f, + 1.642314468271929300f, + 1.642095576597693200f, 1.641876624548297000f, 1.641657612131790500f, + 1.641438539356226500f, + 1.641219406229659700f, 1.641000212760146800f, 1.640780958955747200f, + 1.640561644824521700f, + 1.640342270374534500f, 1.640122835613851100f, 1.639903340550539200f, + 1.639683785192669600f, + 1.639464169548314100f, 1.639244493625547900f, 1.639024757432447500f, + 1.638804960977092100f, + 1.638585104267562800f, 1.638365187311943400f, 1.638145210118319400f, + 1.637925172694778800f, + 1.637705075049411800f, 1.637484917190310800f, 1.637264699125570200f, + 1.637044420863286600f, + 1.636824082411559600f, 1.636603683778490100f, 1.636383224972181500f, + 1.636162706000739300f, + 1.635942126872271800f, 1.635721487594888400f, 1.635500788176702100f, + 1.635280028625826900f, + 1.635059208950379700f, 1.634838329158479200f, 1.634617389258246700f, + 1.634396389257805700f, + 1.634175329165281400f, 1.633954208988801700f, 1.633733028736496400f, + 1.633511788416498000f, + 1.633290488036940500f, 1.633069127605960800f, 1.632847707131697600f, + 1.632626226622291700f, + 1.632404686085886300f, 1.632183085530627200f, 1.631961424964661700f, + 1.631739704396139900f, + 1.631517923833213400f, 1.631296083284036900f, 1.631074182756766300f, + 1.630852222259560700f, + 1.630630201800580900f, 1.630408121387990000f, 1.630185981029953000f, + 1.629963780734637400f, + 1.629741520510213000f, 1.629519200364851800f, 1.629296820306727700f, + 1.629074380344017100f, + 1.628851880484898200f, 1.628629320737551700f, 1.628406701110161100f, + 1.628184021610910700f, + 1.627961282247988300f, 1.627738483029583100f, 1.627515623963887000f, + 1.627292705059093700f, + 1.627069726323399500f, 1.626846687765002700f, 1.626623589392103500f, + 1.626400431212904800f, + 1.626177213235611400f, 1.625953935468430500f, 1.625730597919571300f, + 1.625507200597245500f, + 1.625283743509666300f, 1.625060226665050000f, 1.624836650071614500f, + 1.624613013737580000f, + 1.624389317671169500f, 1.624165561880607000f, 1.623941746374119500f, + 1.623717871159936300f, + 1.623493936246288300f, 1.623269941641409400f, 1.623045887353534900f, + 1.622821773390902700f, + 1.622597599761753000f, 1.622373366474327800f, 1.622149073536871800f, + 1.621924720957631300f, + 1.621700308744855200f, 1.621475836906794500f, 1.621251305451702400f, + 1.621026714387834300f, + 1.620802063723447700f, 1.620577353466802700f, 1.620352583626160500f, + 1.620127754209786100f, + 1.619902865225945300f, 1.619677916682906700f, 1.619452908588941300f, + 1.619227840952321800f, + 1.619002713781323200f, 1.618777527084222800f, 1.618552280869300300f, + 1.618326975144837000f, + 1.618101609919117200f, 1.617876185200426600f, 1.617650700997053500f, + 1.617425157317288200f, + 1.617199554169423500f, 1.616973891561754200f, 1.616748169502577200f, + 1.616522388000191500f, + 1.616296547062898500f, 1.616070646699001800f, 1.615844686916807300f, + 1.615618667724622700f, + 1.615392589130757900f, 1.615166451143525300f, 1.614940253771239400f, + 1.614713997022216900f, + 1.614487680904776600f, 1.614261305427239200f, 1.614034870597928400f, + 1.613808376425168900f, + 1.613581822917288900f, 1.613355210082617800f, 1.613128537929487500f, + 1.612901806466232200f, + 1.612675015701188000f, 1.612448165642693400f, 1.612221256299089200f, + 1.611994287678718100f, + 1.611767259789925100f, 1.611540172641057200f, 1.611313026240463800f, + 1.611085820596496600f, + 1.610858555717509200f, 1.610631231611857800f, 1.610403848287899700f, + 1.610176405753995800f, + 1.609948904018508200f, 1.609721343089801600f, 1.609493722976242900f, + 1.609266043686200700f, + 1.609038305228046400f, 1.608810507610153100f, 1.608582650840896200f, + 1.608354734928653800f, + 1.608126759881805400f, 1.607898725708732900f, 1.607670632417820500f, + 1.607442480017454700f, + 1.607214268516024000f, 1.606985997921919000f, 1.606757668243532500f, + 1.606529279489259600f, + 1.606300831667497600f, 1.606072324786645500f, 1.605843758855105300f, + 1.605615133881280700f, + 1.605386449873577300f, 1.605157706840403300f, 1.604928904790168700f, + 1.604700043731286200f, + 1.604471123672170500f, 1.604242144621237800f, 1.604013106586907400f, + 1.603784009577600100f, + 1.603554853601739700f, 1.603325638667751000f, 1.603096364784061900f, + 1.602867031959102100f, + 1.602637640201303400f, 1.602408189519099800f, 1.602178679920927900f, + 1.601949111415226000f, + 1.601719484010434300f, 1.601489797714996000f, 1.601260052537355700f, + 1.601030248485960900f, + 1.600800385569260300f, 1.600570463795705700f, 1.600340483173750400f, + 1.600110443711850300f, + 1.599880345418463100f, 1.599650188302049100f, 1.599419972371070500f, + 1.599189697633991400f, + 1.598959364099278700f, 1.598728971775401000f, 1.598498520670828900f, + 1.598268010794035900f, + 1.598037442153496900f, 1.597806814757689200f, 1.597576128615092200f, + 1.597345383734188000f, + 1.597114580123460100f, 1.596883717791394800f, 1.596652796746479600f, + 1.596421816997205500f, + 1.596190778552064800f, 1.595959681419551800f, 1.595728525608163700f, + 1.595497311126399300f, + 1.595266037982759500f, 1.595034706185747500f, 1.594803315743869000f, + 1.594571866665631700f, + 1.594340358959544800f, 1.594108792634120600f, 1.593877167697873100f, + 1.593645484159318200f, + 1.593413742026974500f, 1.593181941309362400f, 1.592950082015004700f, + 1.592718164152426000f, + 1.592486187730153300f, 1.592254152756715600f, 1.592022059240644400f, + 1.591789907190473100f, + 1.591557696614737100f, 1.591325427521974100f, 1.591093099920724200f, + 1.590860713819529400f, + 1.590628269226933600f, 1.590395766151483400f, 1.590163204601727100f, + 1.589930584586215500f, + 1.589697906113501000f, 1.589465169192139100f, 1.589232373830686400f, + 1.588999520037702300f, + 1.588766607821748200f, 1.588533637191387400f, 1.588300608155185600f, + 1.588067520721711000f, + 1.587834374899533400f, 1.587601170697224600f, 1.587367908123358900f, + 1.587134587186513000f, + 1.586901207895265300f, 1.586667770258196600f, 1.586434274283889500f, + 1.586200719980929200f, + 1.585967107357902700f, 1.585733436423399000f, 1.585499707186010200f, + 1.585265919654329300f, + 1.585032073836952100f, 1.584798169742476400f, 1.584564207379502500f, + 1.584330186756632200f, + 1.584096107882470000f, 1.583861970765622100f, 1.583627775414697000f, + 1.583393521838305700f, + 1.583159210045060900f, 1.582924840043577400f, 1.582690411842472700f, + 1.582455925450365600f, + 1.582221380875877800f, 1.581986778127632700f, 1.581752117214255900f, + 1.581517398144375800f, + 1.581282620926621300f, 1.581047785569625400f, 1.580812892082021900f, + 1.580577940472447200f, + 1.580342930749539800f, 1.580107862921940700f, 1.579872736998292100f, + 1.579637552987239100f, + 1.579402310897428900f, 1.579167010737510600f, 1.578931652516135700f, + 1.578696236241957200f, + 1.578460761923630800f, 1.578225229569814700f, 1.577989639189168100f, + 1.577753990790353500f, + 1.577518284382034800f, 1.577282519972878200f, 1.577046697571552000f, + 1.576810817186727000f, + 1.576574878827075700f, 1.576338882501273000f, 1.576102828217995600f, + 1.575866715985922500f, + 1.575630545813735200f, 1.575394317710116600f, 1.575158031683752300f, + 1.574921687743330300f, + 1.574685285897539800f, 1.574448826155072400f, 1.574212308524622500f, + 1.573975733014886000f, + 1.573739099634561500f, 1.573502408392348600f, 1.573265659296950300f, + 1.573028852357070800f, + 1.572791987581417100f, 1.572555064978698100f, 1.572318084557624800f, + 1.572081046326909900f, + 1.571843950295269000f, 1.571606796471419100f, 1.571369584864080100f, + 1.571132315481973200f, + 1.570894988333822400f, 1.570657603428353300f, 1.570420160774294000f, + 1.570182660380374600f, + 1.569945102255327200f, 1.569707486407886600f, 1.569469812846788500f, + 1.569232081580771900f, + 1.568994292618577400f, 1.568756445968948000f, 1.568518541640628400f, + 1.568280579642366000f, + 1.568042559982909500f, 1.567804482671010500f, 1.567566347715422500f, + 1.567328155124900800f, + 1.567089904908203200f, 1.566851597074089500f, 1.566613231631321500f, + 1.566374808588663300f, + 1.566136327954881000f, 1.565897789738742900f, 1.565659193949019400f, + 1.565420540594482800f, + 1.565181829683907700f, 1.564943061226071100f, 1.564704235229751500f, + 1.564465351703730400f, + 1.564226410656790000f, 1.563987412097716200f, 1.563748356035296000f, + 1.563509242478319000f, + 1.563270071435576500f, 1.563030842915862100f, 1.562791556927971800f, + 1.562552213480703300f, + 1.562312812582856500f, 1.562073354243233700f, 1.561833838470639200f, + 1.561594265273878800f, + 1.561354634661761300f, 1.561114946643096900f, 1.560875201226698900f, + 1.560635398421381400f, + 1.560395538235961800f, 1.560155620679258400f, 1.559915645760092900f, + 1.559675613487288200f, + 1.559435523869669500f, 1.559195376916064700f, 1.558955172635302800f, + 1.558714911036215700f, + 1.558474592127637100f, 1.558234215918402600f, 1.557993782417350400f, + 1.557753291633320500f, + 1.557512743575155000f, 1.557272138251698300f, 1.557031475671796400f, + 1.556790755844298400f, + 1.556549978778054300f, 1.556309144481917300f, 1.556068252964741600f, + 1.555827304235384500f, + 1.555586298302704900f, 1.555345235175563900f, 1.555104114862824600f, + 1.554862937373352500f, + 1.554621702716015000f, 1.554380410899681300f, 1.554139061933223200f, + 1.553897655825514600f, + 1.553656192585431100f, 1.553414672221850700f, 1.553173094743653300f, + 1.552931460159721100f, + 1.552689768478938500f, 1.552448019710191300f, 1.552206213862368500f, + 1.551964350944360100f, + 1.551722430965059000f, 1.551480453933359800f, 1.551238419858159700f, + 1.550996328748356800f, + 1.550754180612852900f, 1.550511975460550500f, 1.550269713300355100f, + 1.550027394141174000f, + 1.549785017991916400f, 1.549542584861493900f, 1.549300094758820000f, + 1.549057547692810600f, + 1.548814943672383300f, 1.548572282706457900f, 1.548329564803956300f, + 1.548086789973802700f, + 1.547843958224923000f, 1.547601069566245900f, 1.547358124006701400f, + 1.547115121555221700f, + 1.546872062220741700f, 1.546628946012197800f, 1.546385772938528600f, + 1.546142543008675300f, + 1.545899256231580300f, 1.545655912616188800f, 1.545412512171447700f, + 1.545169054906306200f, + 1.544925540829715600f, 1.544681969950629300f, 1.544438342278002600f, + 1.544194657820792800f, + 1.543950916587959700f, 1.543707118588464800f, 1.543463263831272000f, + 1.543219352325347200f, + 1.542975384079658300f, 1.542731359103175300f, 1.542487277404870100f, + 1.542243138993717000f, + 1.541998943878692300f, 1.541754692068774600f, 1.541510383572944000f, + 1.541266018400183200f, + 1.541021596559476700f, 1.540777118059811100f, 1.540532582910175500f, + 1.540287991119560600f, + 1.540043342696959100f, 1.539798637651366400f, 1.539553875991779300f, + 1.539309057727197300f, + 1.539064182866621400f, 1.538819251419055100f, 1.538574263393503800f, + 1.538329218798974800f, + 1.538084117644477900f, 1.537838959939025200f, 1.537593745691629500f, + 1.537348474911307300f, + 1.537103147607076200f, 1.536857763787956400f, 1.536612323462969800f, + 1.536366826641140800f, + 1.536121273331495300f, 1.535875663543061700f, 1.535629997284870400f, + 1.535384274565953600f, + 1.535138495395346400f, 1.534892659782085100f, 1.534646767735208000f, + 1.534400819263756400f, + 1.534154814376772700f, 1.533908753083302200f, 1.533662635392391700f, + 1.533416461313090100f, + 1.533170230854448400f, 1.532923944025520200f, 1.532677600835360600f, + 1.532431201293027000f, + 1.532184745407578500f, 1.531938233188077100f, 1.531691664643585900f, + 1.531445039783170500f, + 1.531198358615898800f, 1.530951621150840700f, 1.530704827397067800f, + 1.530457977363654000f, + 1.530211071059675200f, 1.529964108494209700f, 1.529717089676337500f, + 1.529470014615140800f, + 1.529222883319703700f, 1.528975695799112500f, 1.528728452062455600f, + 1.528481152118823700f, + 1.528233795977309400f, 1.527986383647006500f, 1.527738915137012400f, + 1.527491390456425600f, + 1.527243809614346600f, 1.526996172619878900f, 1.526748479482126700f, + 1.526500730210197200f, + 1.526252924813199500f, 1.526005063300244900f, 1.525757145680446200f, + 1.525509171962918800f, + 1.525261142156779900f, 1.525013056271149000f, 1.524764914315147200f, + 1.524516716297898300f, + 1.524268462228527900f, 1.524020152116163200f, 1.523771785969934000f, + 1.523523363798972000f, + 1.523274885612411200f, 1.523026351419387100f, 1.522777761229038100f, + 1.522529115050503600f, + 1.522280412892925900f, 1.522031654765448900f, 1.521782840677218700f, + 1.521533970637383800f, + 1.521285044655094300f, 1.521036062739502300f, 1.520787024899762100f, + 1.520537931145030400f, + 1.520288781484465700f, 1.520039575927228500f, 1.519790314482481100f, + 1.519540997159388300f, + 1.519291623967116600f, 1.519042194914835200f, 1.518792710011714500f, + 1.518543169266927600f, + 1.518293572689648900f, 1.518043920289055900f, 1.517794212074327500f, + 1.517544448054644500f, + 1.517294628239190400f, 1.517044752637150000f, 1.516794821257710500f, + 1.516544834110061600f, + 1.516294791203394200f, 1.516044692546901800f, 1.515794538149779700f, + 1.515544328021225500f, + 1.515294062170438700f, 1.515043740606620800f, 1.514793363338975600f, + 1.514542930376708600f, + 1.514292441729027300f, 1.514041897405141700f, 1.513791297414263800f, + 1.513540641765606800f, + 1.513289930468387300f, 1.513039163531823000f, 1.512788340965133500f, + 1.512537462777541200f, + 1.512286528978270300f, 1.512035539576546600f, 1.511784494581598600f, + 1.511533394002656100f, + 1.511282237848951400f, 1.511031026129719100f, 1.510779758854195400f, + 1.510528436031618900f, + 1.510277057671229400f, 1.510025623782270000f, 1.509774134373984800f, + 1.509522589455620600f, + 1.509270989036425800f, 1.509019333125651200f, 1.508767621732549400f, + 1.508515854866375100f, + 1.508264032536385000f, 1.508012154751837700f, 1.507760221521994700f, + 1.507508232856118200f, + 1.507256188763473200f, 1.507004089253327000f, 1.506751934334948000f, + 1.506499724017607900f, + 1.506247458310579400f, 1.505995137223137500f, 1.505742760764559300f, + 1.505490328944124200f, + 1.505237841771113200f, 1.504985299254809800f, 1.504732701404498900f, + 1.504480048229468000f, + 1.504227339739006500f, 1.503974575942405700f, 1.503721756848958700f, + 1.503468882467961600f, + 1.503215952808711500f, 1.502962967880507600f, 1.502709927692651900f, + 1.502456832254447600f, + 1.502203681575200700f, 1.501950475664218600f, 1.501697214530810700f, + 1.501443898184289200f, + 1.501190526633967600f, 1.500937099889161600f, 1.500683617959188900f, + 1.500430080853369500f, + 1.500176488581024900f, 1.499922841151479600f, 1.499669138574058800f, + 1.499415380858090800f, + 1.499161568012905300f, 1.498907700047834600f, 1.498653776972212600f, + 1.498399798795375000f, + 1.498145765526660300f, 1.497891677175408500f, 1.497637533750961300f, + 1.497383335262663300f, + 1.497129081719860400f, 1.496874773131900800f, 1.496620409508134800f, + 1.496365990857914600f, + 1.496111517190594300f, 1.495856988515530400f, 1.495602404842080800f, + 1.495347766179606400f, + 1.495093072537469100f, 1.494838323925033400f, 1.494583520351665500f, + 1.494328661826734200f, + 1.494073748359609600f, 1.493818779959664300f, 1.493563756636272500f, + 1.493308678398810800f, + 1.493053545256657800f, 1.492798357219194100f, 1.492543114295801900f, + 1.492287816495866200f, + 1.492032463828773200f, 1.491777056303911700f, 1.491521593930672100f, + 1.491266076718446900f, + 1.491010504676631500f, 1.490754877814621800f, 1.490499196141816600f, + 1.490243459667616600f, + 1.489987668401424800f, 1.489731822352645500f, 1.489475921530685900f, + 1.489219965944954300f, + 1.488963955604861500f, 1.488707890519820600f, 1.488451770699245900f, + 1.488195596152554800f, + 1.487939366889165600f, 1.487683082918499300f, 1.487426744249978400f, + 1.487170350893028500f, + 1.486913902857075700f, 1.486657400151549600f, 1.486400842785880100f, + 1.486144230769501000f, + 1.485887564111846500f, 1.485630842822354100f, 1.485374066910462500f, + 1.485117236385612200f, + 1.484860351257246500f, 1.484603411534810300f, 1.484346417227750700f, + 1.484089368345516300f, + 1.483832264897558400f, 1.483575106893329600f, 1.483317894342285100f, + 1.483060627253882000f, + 1.482803305637578900f, 1.482545929502837100f, 1.482288498859119400f, + 1.482031013715890700f, + 1.481773474082618300f, 1.481515879968770900f, 1.481258231383819800f, + 1.481000528337237800f, + 1.480742770838499900f, 1.480484958897083200f, 1.480227092522466500f, + 1.479969171724131200f, + 1.479711196511560100f, 1.479453166894238100f, 1.479195082881652200f, + 1.478936944483291600f, + 1.478678751708647000f, 1.478420504567211900f, 1.478162203068481100f, + 1.477903847221951400f, + 1.477645437037121900f, 1.477386972523493800f, 1.477128453690569800f, + 1.476869880547855300f, + 1.476611253104856700f, 1.476352571371083700f, 1.476093835356046700f, + 1.475835045069259000f, + 1.475576200520235500f, 1.475317301718493300f, 1.475058348673551100f, + 1.474799341394929900f, + 1.474540279892153000f, 1.474281164174744900f, 1.474021994252233000f, + 1.473762770134145800f, + 1.473503491830014300f, 1.473244159349371700f, 1.472984772701752900f, + 1.472725331896694400f, + 1.472465836943735600f, 1.472206287852416900f, 1.471946684632281500f, + 1.471687027292874400f, + 1.471427315843742100f, 1.471167550294433700f, 1.470907730654499800f, + 1.470647856933493300f, + 1.470387929140969200f, 1.470127947286484100f, 1.469867911379596900f, + 1.469607821429868500f, + 1.469347677446861500f, 1.469087479440140300f, 1.468827227419272200f, + 1.468566921393825700f, + 1.468306561373371900f, 1.468046147367482600f, 1.467785679385733300f, + 1.467525157437700200f, + 1.467264581532962100f, 1.467003951681099800f, 1.466743267891695800f, + 1.466482530174334500f, + 1.466221738538602500f, 1.465960892994088800f, 1.465699993550383400f, + 1.465439040217079400f, + 1.465178033003770700f, 1.464916971920054100f, 1.464655856975527900f, + 1.464394688179792900f, + 1.464133465542451200f, 1.463872189073107500f, 1.463610858781367900f, + 1.463349474676840700f, + 1.463088036769136600f, 1.462826545067867700f, 1.462564999582648600f, + 1.462303400323095000f, + 1.462041747298825900f, 1.461780040519460800f, 1.461518279994622200f, + 1.461256465733934400f, + 1.460994597747023600f, 1.460732676043517800f, 1.460470700633046800f, + 1.460208671525243400f, + 1.459946588729741100f, 1.459684452256176300f, 1.459422262114186800f, + 1.459160018313412400f, + 1.458897720863495500f, 1.458635369774079500f, 1.458372965054810700f, + 1.458110506715337000f, + 1.457847994765308200f, 1.457585429214375700f, 1.457322810072193800f, + 1.457060137348418000f, + 1.456797411052706200f, 1.456534631194717800f, 1.456271797784114900f, + 1.456008910830560500f, + 1.455745970343720800f, 1.455482976333263100f, 1.455219928808857200f, + 1.454956827780174100f, + 1.454693673256887600f, 1.454430465248673300f, 1.454167203765208000f, + 1.453903888816171900f, + 1.453640520411245900f, 1.453377098560113100f, 1.453113623272459100f, + 1.452850094557971000f, + 1.452586512426338000f, 1.452322876887251400f, 1.452059187950404100f, + 1.451795445625491300f, + 1.451531649922210200f, 1.451267800850259500f, 1.451003898419340500f, + 1.450739942639155800f, + 1.450475933519410400f, 1.450211871069811300f, 1.449947755300067500f, + 1.449683586219889400f, + 1.449419363838989800f, 1.449155088167083600f, 1.448890759213887100f, + 1.448626376989119400f, + 1.448361941502500900f, 1.448097452763754000f, 1.447832910782603100f, + 1.447568315568775100f, + 1.447303667131997900f, 1.447038965482002200f, 1.446774210628520200f, + 1.446509402581286400f, + 1.446244541350036700f, 1.445979626944509300f, 1.445714659374444500f, + 1.445449638649584500f, + 1.445184564779673500f, 1.444919437774456700f, 1.444654257643682900f, + 1.444389024397101600f, + 1.444123738044464900f, 1.443858398595526400f, 1.443593006060042100f, + 1.443327560447769600f, + 1.443062061768468400f, 1.442796510031900500f, 1.442530905247829200f, + 1.442265247426020200f, + 1.441999536576240800f, 1.441733772708260600f, 1.441467955831850800f, + 1.441202085956784900f, + 1.440936163092837900f, 1.440670187249787600f, 1.440404158437412500f, + 1.440138076665494100f, + 1.439871941943815300f, 1.439605754282161400f, 1.439339513690319100f, + 1.439073220178077400f, + 1.438806873755226900f, 1.438540474431560600f, 1.438274022216873500f, + 1.438007517120961900f, + 1.437740959153624500f, 1.437474348324662100f, 1.437207684643876800f, + 1.436940968121073600f, + 1.436674198766058500f, 1.436407376588640000f, 1.436140501598628400f, + 1.435873573805835900f, + 1.435606593220076600f, 1.435339559851166500f, 1.435072473708924000f, + 1.434805334803169100f, + 1.434538143143723200f, 1.434270898740410700f, 1.434003601603057300f, + 1.433736251741490700f, + 1.433468849165540500f, 1.433201393885038500f, 1.432933885909818000f, + 1.432666325249714700f, + 1.432398711914566200f, 1.432131045914211600f, 1.431863327258492400f, + 1.431595555957251700f, + 1.431327732020334800f, 1.431059855457588600f, 1.430791926278862400f, + 1.430523944494007400f, + 1.430255910112876000f, 1.429987823145323100f, 1.429719683601205800f, + 1.429451491490382900f, + 1.429183246822714800f, 1.428914949608064200f, 1.428646599856295400f, + 1.428378197577275100f, + 1.428109742780871800f, 1.427841235476955400f, 1.427572675675398600f, + 1.427304063386075200f, + 1.427035398618861500f, 1.426766681383635500f, 1.426497911690277000f, + 1.426229089548668200f, + 1.425960214968693000f, 1.425691287960236600f, 1.425422308533187200f, + 1.425153276697434000f, + 1.424884192462868800f, 1.424615055839385300f, 1.424345866836878200f, + 1.424076625465245500f, + 1.423807331734385800f, 1.423537985654200800f, 1.423268587234593400f, + 1.422999136485468600f, + 1.422729633416733200f, 1.422460078038296300f, 1.422190470360068300f, + 1.421920810391962500f, + 1.421651098143893000f, 1.421381333625776600f, 1.421111516847531700f, + 1.420841647819078600f, + 1.420571726550339700f, 1.420301753051239400f, 1.420031727331703800f, + 1.419761649401660500f, + 1.419491519271040000f, 1.419221336949774100f, 1.418951102447796800f, + 1.418680815775043500f, + 1.418410476941452100f, 1.418140085956961900f, 1.417869642831514700f, + 1.417599147575054000f, + 1.417328600197524900f, 1.417058000708874700f, 1.416787349119052600f, + 1.416516645438009600f, + 1.416245889675698900f, 1.415975081842075300f, 1.415704221947095700f, + 1.415433310000718600f, + 1.415162346012905000f, 1.414891329993617200f, 1.414620261952819600f, + 1.414349141900479000f, + 1.414077969846563500f, 1.413806745801043500f, 1.413535469773890700f, + 1.413264141775079300f, + 1.412992761814585400f, 1.412721329902386900f, 1.412449846048463600f, + 1.412178310262796900f, + 1.411906722555370500f, 1.411635082936170100f, 1.411363391415182900f, + 1.411091648002398500f, + 1.410819852707807700f, 1.410548005541404100f, 1.410276106513182400f, + 1.410004155633139500f, + 1.409732152911274500f, 1.409460098357588200f, 1.409187991982083100f, + 1.408915833794763800f, + 1.408643623805636800f, 1.408371362024710500f, 1.408099048461995300f, + 1.407826683127503000f, + 1.407554266031248100f, 1.407281797183246500f, 1.407009276593515800f, + 1.406736704272076400f, + 1.406464080228949600f, 1.406191404474159000f, 1.405918677017730100f, + 1.405645897869690400f, + 1.405373067040069300f, 1.405100184538898000f, 1.404827250376209400f, + 1.404554264562038400f, + 1.404281227106422400f, 1.404008138019399800f, 1.403734997311011600f, + 1.403461804991300100f, + 1.403188561070310100f, 1.402915265558087700f, 1.402641918464681400f, + 1.402368519800141200f, + 1.402095069574519800f, 1.401821567797870300f, 1.401548014480249000f, + 1.401274409631713600f, + 1.401000753262323900f, 1.400727045382141400f, 1.400453286001229800f, + 1.400179475129653700f, + 1.399905612777481200f, 1.399631698954780800f, 1.399357733671623900f, + 1.399083716938083600f, + 1.398809648764234100f, 1.398535529160152400f, 1.398261358135917300f, + 1.397987135701609200f, + 1.397712861867310300f, 1.397438536643105000f, 1.397164160039079200f, + 1.396889732065321300f, + 1.396615252731921100f, 1.396340722048970300f, 1.396066140026562800f, + 1.395791506674794100f, + 1.395516822003761700f, 1.395242086023564800f, 1.394967298744304900f, + 1.394692460176085300f, + 1.394417570329010700f, 1.394142629213188000f, 1.393867636838725900f, + 1.393592593215735600f, + 1.393317498354329300f, 1.393042352264621600f, 1.392767154956728400f, + 1.392491906440768600f, + 1.392216606726861800f, 1.391941255825130100f, 1.391665853745697400f, + 1.391390400498689700f, + 1.391114896094234100f, 1.390839340542460600f, 1.390563733853500200f, + 1.390288076037486500f, + 1.390012367104554600f, 1.389736607064841100f, 1.389460795928485500f, + 1.389184933705628300f, + 1.388909020406412100f, 1.388633056040981600f, 1.388357040619483200f, + 1.388080974152065200f, + 1.387804856648877600f, 1.387528688120072600f, 1.387252468575804100f, + 1.386976198026228100f, + 1.386699876481501900f, 1.386423503951785200f, 1.386147080447239600f, + 1.385870605978028100f, + 1.385594080554316100f, 1.385317504186270900f, 1.385040876884061000f, + 1.384764198657857200f, + 1.384487469517832200f, 1.384210689474160600f, 1.383933858537019100f, + 1.383656976716585600f, + 1.383380044023040400f, 1.383103060466565300f, 1.382826026057344600f, + 1.382548940805563800f, + 1.382271804721410600f, 1.381994617815074400f, 1.381717380096746800f, + 1.381440091576620700f, + 1.381162752264891500f, 1.380885362171756300f, 1.380607921307413400f, + 1.380330429682064000f, + 1.380052887305910400f, 1.379775294189157000f, 1.379497650342010400f, + 1.379219955774678700f, + 1.378942210497371600f, 1.378664414520301500f, 1.378386567853681700f, + 1.378108670507728300f, + 1.377830722492658500f, 1.377552723818691500f, 1.377274674496048700f, + 1.376996574534953300f, + 1.376718423945630000f, 1.376440222738305700f, 1.376161970923209400f, + 1.375883668510570900f, + 1.375605315510623200f, 1.375326911933600200f, 1.375048457789738400f, + 1.374769953089275400f, + 1.374491397842451100f, 1.374212792059507100f, 1.373934135750687100f, + 1.373655428926236400f, + 1.373376671596402400f, 1.373097863771434200f, 1.372819005461582500f, + 1.372540096677100200f, + 1.372261137428242300f, 1.371982127725264800f, 1.371703067578426700f, + 1.371423956997988000f, + 1.371144795994210500f, 1.370865584577358300f, 1.370586322757697500f, + 1.370307010545495500f, + 1.370027647951022100f, 1.369748234984548000f, 1.369468771656347200f, + 1.369189257976694200f, + 1.368909693955866000f, 1.368630079604142000f, 1.368350414931802000f, + 1.368070699949128800f, + 1.367790934666406600f, 1.367511119093921800f, 1.367231253241962200f, + 1.366951337120818000f, + 1.366671370740780500f, 1.366391354112143500f, 1.366111287245202400f, + 1.365831170150254300f, + 1.365551002837598600f, 1.365270785317536100f, 1.364990517600369400f, + 1.364710199696403300f, + 1.364429831615944200f, 1.364149413369300600f, 1.363868944966782900f, + 1.363588426418702600f, + 1.363307857735373900f, 1.363027238927112300f, 1.362746570004235400f, + 1.362465850977062900f, + 1.362185081855915600f, 1.361904262651116900f, 1.361623393372991300f, + 1.361342474031866000f, + 1.361061504638069400f, 1.360780485201932300f, 1.360499415733786400f, + 1.360218296243966200f, + 1.359937126742807300f, 1.359655907240648000f, 1.359374637747827700f, + 1.359093318274687800f, + 1.358811948831571500f, 1.358530529428824400f, 1.358249060076792900f, + 1.357967540785826300f, + 1.357685971566275200f, 1.357404352428492000f, 1.357122683382830900f, + 1.356840964439648200f, + 1.356559195609301700f, 1.356277376902151900f, 1.355995508328559500f, + 1.355713589898888800f, + 1.355431621623504700f, 1.355149603512774400f, 1.354867535577067200f, + 1.354585417826753800f, + 1.354303250272206500f, 1.354021032923800300f, 1.353738765791911100f, + 1.353456448886917200f, + 1.353174082219199100f, 1.352891665799137900f, 1.352609199637117500f, + 1.352326683743523300f, + 1.352044118128742600f, 1.351761502803164900f, 1.351478837777180700f, + 1.351196123061183100f, + 1.350913358665566400f, 1.350630544600727200f, 1.350347680877063800f, + 1.350064767504976400f, + 1.349781804494866600f, 1.349498791857138400f, 1.349215729602197400f, + 1.348932617740450600f, + 1.348649456282307700f, 1.348366245238179500f, 1.348082984618478800f, + 1.347799674433620500f, + 1.347516314694020800f, 1.347232905410098200f, 1.346949446592273100f, + 1.346665938250967100f, + 1.346382380396604000f, 1.346098773039609700f, 1.345815116190411300f, + 1.345531409859438200f, + 1.345247654057121700f, 1.344963848793894200f, 1.344679994080190800f, + 1.344396089926448000f, + 1.344112136343103900f, 1.343828133340598800f, 1.343544080929374800f, + 1.343259979119875600f, + 1.342975827922546600f, 1.342691627347835500f, 1.342407377406191500f, + 1.342123078108065700f, + 1.341838729463910900f, 1.341554331484181600f, 1.341269884179334700f, + 1.340985387559828100f, + 1.340700841636122400f, 1.340416246418678800f, 1.340131601917961900f, + 1.339846908144436600f, + 1.339562165108570700f, 1.339277372820833400f, 1.338992531291695500f, + 1.338707640531629800f, + 1.338422700551110900f, 1.338137711360615200f, 1.337852672970621300f, + 1.337567585391608900f, + 1.337282448634059800f, 1.336997262708457900f, 1.336712027625288600f, + 1.336426743395039000f, + 1.336141410028198500f, 1.335856027535258000f, 1.335570595926709700f, + 1.335285115213048500f, + 1.334999585404770700f, 1.334714006512374400f, 1.334428378546359500f, + 1.334142701517227600f, + 1.333856975435482300f, 1.333571200311629100f, 1.333285376156174700f, + 1.332999502979628700f, + 1.332713580792501500f, 1.332427609605305400f, 1.332141589428554900f, + 1.331855520272766200f, + 1.331569402148457400f, 1.331283235066148100f, 1.330997019036359800f, + 1.330710754069615700f, + 1.330424440176441300f, 1.330138077367363200f, 1.329851665652910500f, + 1.329565205043613800f, + 1.329278695550004700f, 1.328992137182618100f, 1.328705529951989400f, + 1.328418873868656900f, + 1.328132168943159800f, 1.327845415186039000f, 1.327558612607838500f, + 1.327271761219102500f, + 1.326984861030378000f, 1.326697912052213500f, 1.326410914295159400f, + 1.326123867769767500f, + 1.325836772486591800f, 1.325549628456188100f, 1.325262435689113600f, + 1.324975194195928000f, + 1.324687903987191900f, 1.324400565073468300f, 1.324113177465321900f, + 1.323825741173318700f, + 1.323538256208027800f, 1.323250722580018500f, 1.322963140299862500f, + 1.322675509378133900f, + 1.322387829825407700f, 1.322100101652261100f, 1.321812324869273500f, + 1.321524499487024800f, + 1.321236625516098100f, 1.320948702967077400f, 1.320660731850549000f, + 1.320372712177100700f, + 1.320084643957322400f, 1.319796527201805300f, 1.319508361921142500f, + 1.319220148125929100f, + 1.318931885826762000f, 1.318643575034239800f, 1.318355215758962900f, + 1.318066808011533200f, + 1.317778351802554800f, 1.317489847142633300f, 1.317201294042376300f, + 1.316912692512393300f, + 1.316624042563294900f, 1.316335344205694200f, 1.316046597450205800f, + 1.315757802307445900f, + 1.315468958788033000f, 1.315180066902586800f, 1.314891126661728900f, + 1.314602138076083300f, + 1.314313101156274800f, 1.314024015912930600f, 1.313734882356679900f, + 1.313445700498152800f, + 1.313156470347981900f, 1.312867191916801100f, 1.312577865215246900f, + 1.312288490253956900f, + 1.311999067043570200f, 1.311709595594728000f, 1.311420075918073900f, + 1.311130508024252400f, + 1.310840891923910100f, 1.310551227627695400f, 1.310261515146258200f, + 1.309971754490250700f, + 1.309681945670326400f, 1.309392088697140900f, 1.309102183581351200f, + 1.308812230333616500f, + 1.308522228964597500f, 1.308232179484956500f, 1.307942081905358000f, + 1.307651936236467800f, + 1.307361742488954300f, 1.307071500673486800f, 1.306781210800736200f, + 1.306490872881376200f, + 1.306200486926081700f, 1.305910052945529200f, 1.305619570950396800f, + 1.305329040951365100f, + 1.305038462959116100f, 1.304747836984333300f, 1.304457163037702200f, + 1.304166441129910300f, + 1.303875671271646400f, 1.303584853473601200f, 1.303293987746467300f, + 1.303003074100939100f, + 1.302712112547712800f, 1.302421103097485900f, 1.302130045760958100f, + 1.301838940548830600f, + 1.301547787471806900f, 1.301256586540591600f, 1.300965337765891600f, + 1.300674041158414800f, + 1.300382696728871400f, 1.300091304487973800f, 1.299799864446435200f, + 1.299508376614971500f, + 1.299216841004299200f, 1.298925257625137800f, 1.298633626488207500f, + 1.298341947604231300f, + 1.298050220983932900f, 1.297758446638038700f, 1.297466624577275900f, + 1.297174754812374400f, + 1.296882837354065100f, 1.296590872213081200f, 1.296298859400157700f, + 1.296006798926030200f, + 1.295714690801437600f, 1.295422535037119800f, 1.295130331643818500f, + 1.294838080632277000f, + 1.294545782013240900f, 1.294253435797456900f, 1.293961041995673700f, + 1.293668600618642000f, + 1.293376111677113900f, 1.293083575181843500f, 1.292790991143586200f, + 1.292498359573099700f, + 1.292205680481143500f, 1.291912953878477900f, 1.291620179775866400f, + 1.291327358184073200f, + 1.291034489113864100f, 1.290741572576007400f, 1.290448608581273000f, + 1.290155597140431700f, + 1.289862538264257700f, 1.289569431963524900f, 1.289276278249010600f, + 1.288983077131493000f, + 1.288689828621752300f, 1.288396532730570400f, 1.288103189468731400f, + 1.287809798847019800f, + 1.287516360876223500f, 1.287222875567130900f, 1.286929342930532800f, + 1.286635762977221800f, + 1.286342135717991600f, 1.286048461163638000f, 1.285754739324958900f, + 1.285460970212753500f, + 1.285167153837822900f, 1.284873290210969900f, 1.284579379342998700f, + 1.284285421244715900f, + 1.283991415926929400f, 1.283697363400448900f, 1.283403263676086100f, + 1.283109116764654000f, + 1.282814922676967400f, 1.282520681423843000f, 1.282226393016099500f, + 1.281932057464557000f, + 1.281637674780037100f, 1.281343244973363700f, 1.281048768055361900f, + 1.280754244036858900f, + 1.280459672928683500f, 1.280165054741666300f, 1.279870389486639400f, + 1.279575677174437100f, + 1.279280917815894600f, 1.278986111421849900f, 1.278691258003142000f, + 1.278396357570611900f, + 1.278101410135101800f, 1.277806415707456700f, 1.277511374298522200f, + 1.277216285919146500f, + 1.276921150580179200f, 1.276625968292471000f, 1.276330739066875400f, + 1.276035462914247000f, + 1.275740139845442400f, 1.275444769871319600f, 1.275149353002738700f, + 1.274853889250561200f, + 1.274558378625650200f, 1.274262821138871300f, 1.273967216801090900f, + 1.273671565623178100f, + 1.273375867616002300f, 1.273080122790436000f, 1.272784331157352800f, + 1.272488492727628100f, + 1.272192607512139300f, 1.271896675521764900f, 1.271600696767385400f, + 1.271304671259883200f, + 1.271008599010142500f, 1.270712480029048800f, 1.270416314327489800f, + 1.270120101916354600f, + 1.269823842806533800f, 1.269527537008920300f, 1.269231184534408200f, + 1.268934785393893700f, + 1.268638339598274500f, 1.268341847158450200f, 1.268045308085321800f, + 1.267748722389792100f, + 1.267452090082765900f, 1.267155411175149500f, 1.266858685677851000f, + 1.266561913601780100f, + 1.266265094957848000f, 1.265968229756968100f, 1.265671318010055400f, + 1.265374359728026500f, + 1.265077354921799300f, 1.264780303602294200f, 1.264483205780432700f, + 1.264186061467138500f, + 1.263888870673336400f, 1.263591633409954000f, 1.263294349687918800f, + 1.262997019518161700f, + 1.262699642911614600f, 1.262402219879211300f, 1.262104750431887000f, + 1.261807234580578900f, + 1.261509672336225600f, 1.261212063709767900f, 1.260914408712147800f, + 1.260616707354309500f, + 1.260318959647198400f, 1.260021165601761900f, 1.259723325228949000f, + 1.259425438539710300f, + 1.259127505544998600f, 1.258829526255768000f, 1.258531500682973800f, + 1.258233428837574300f, + 1.257935310730528000f, 1.257637146372796400f, 1.257338935775342200f, + 1.257040678949129500f, + 1.256742375905124400f, 1.256444026654294400f, 1.256145631207609400f, + 1.255847189576040100f, + 1.255548701770560000f, 1.255250167802143000f, 1.254951587681765600f, + 1.254652961420405600f, + 1.254354289029042900f, 1.254055570518658500f, 1.253756805900235700f, + 1.253457995184759300f, + 1.253159138383215200f, 1.252860235506592100f, 1.252561286565879300f, + 1.252262291572068900f, + 1.251963250536153500f, 1.251664163469128300f, 1.251365030381989700f, + 1.251065851285736200f, + 1.250766626191367500f, 1.250467355109885500f, 1.250168038052293500f, + 1.249868675029596200f, + 1.249569266052800800f, 1.249269811132915200f, 1.248970310280950200f, + 1.248670763507917100f, + 1.248371170824829300f, 1.248071532242702100f, 1.247771847772552300f, + 1.247472117425398700f, + 1.247172341212261500f, 1.246872519144162300f, 1.246572651232124700f, + 1.246272737487174300f, + 1.245972777920338000f, 1.245672772542644400f, 1.245372721365123600f, + 1.245072624398807900f, + 1.244772481654731000f, 1.244472293143928300f, 1.244172058877436800f, + 1.243871778866295400f, + 1.243571453121544000f, 1.243271081654225400f, 1.242970664475383100f, + 1.242670201596062700f, + 1.242369693027311200f, 1.242069138780177400f, 1.241768538865712000f, + 1.241467893294967200f, + 1.241167202078996800f, 1.240866465228856100f, 1.240565682755603100f, + 1.240264854670295900f, + 1.239963980983995300f, 1.239663061707763700f, 1.239362096852665300f, + 1.239061086429765300f, + 1.238760030450130900f, 1.238458928924831600f, 1.238157781864937400f, + 1.237856589281521000f, + 1.237555351185656500f, 1.237254067588419400f, 1.236952738500886900f, + 1.236651363934138300f, + 1.236349943899254000f, 1.236048478407316500f, 1.235746967469409900f, + 1.235445411096619500f, + 1.235143809300033300f, 1.234842162090739700f, 1.234540469479829900f, + 1.234238731478396000f, + 1.233936948097532400f, 1.233635119348334400f, 1.233333245241899200f, + 1.233031325789326400f, + 1.232729361001716500f, 1.232427350890172000f, 1.232125295465796600f, + 1.231823194739696300f, + 1.231521048722978200f, 1.231218857426751700f, 1.230916620862127400f, + 1.230614339040217800f, + 1.230312011972136500f, 1.230009639668999500f, 1.229707222141924100f, + 1.229404759402029400f, + 1.229102251460436400f, 1.228799698328266700f, 1.228497100016644900f, + 1.228194456536696500f, + 1.227891767899548700f, 1.227589034116330700f, 1.227286255198173100f, + 1.226983431156208200f, + 1.226680562001569900f, 1.226377647745394000f, 1.226074688398817600f, + 1.225771683972980200f, + 1.225468634479021500f, 1.225165539928084300f, 1.224862400331312400f, + 1.224559215699851500f, + 1.224255986044848500f, 1.223952711377453100f, 1.223649391708814700f, + 1.223346027050086400f, + 1.223042617412421600f, 1.222739162806975900f, 1.222435663244906700f, + 1.222132118737372400f, + 1.221828529295533800f, 1.221524894930552800f, 1.221221215653593100f, + 1.220917491475820500f, + 1.220613722408401900f, 1.220309908462505800f, 1.220006049649302800f, + 1.219702145979964600f, + 1.219398197465665400f, 1.219094204117580300f, 1.218790165946886100f, + 1.218486082964761500f, + 1.218181955182386500f, 1.217877782610943700f, 1.217573565261616000f, + 1.217269303145589000f, + 1.216964996274049400f, 1.216660644658185600f, 1.216356248309187600f, + 1.216051807238247800f, + 1.215747321456559300f, 1.215442790975316700f, 1.215138215805717300f, + 1.214833595958959300f, + 1.214528931446242600f, 1.214224222278769100f, 1.213919468467741900f, + 1.213614670024366000f, + 1.213309826959847700f, 1.213004939285395400f, 1.212700007012219100f, + 1.212395030151530300f, + 1.212090008714541600f, 1.211784942712468300f, 1.211479832156526800f, + 1.211174677057934800f, + 1.210869477427912300f, 1.210564233277680500f, 1.210258944618462200f, + 1.209953611461482200f, + 1.209648233817966600f, 1.209342811699143600f, 1.209037345116242400f, + 1.208731834080493800f, + 1.208426278603131200f, 1.208120678695388600f, 1.207815034368502100f, + 1.207509345633709600f, + 1.207203612502250300f, 1.206897834985365000f, 1.206592013094296200f, + 1.206286146840288300f, + 1.205980236234587100f, 1.205674281288440000f, 1.205368282013096200f, + 1.205062238419806200f, + 1.204756150519822300f, 1.204450018324398900f, 1.204143841844791200f, + 1.203837621092256800f, + 1.203531356078054100f, 1.203225046813444000f, 1.202918693309688300f, + 1.202612295578050900f, + 1.202305853629797500f, 1.201999367476194400f, 1.201692837128510700f, + 1.201386262598016500f, + 1.201079643895983700f, 1.200772981033685800f, 1.200466274022397900f, + 1.200159522873396800f, + 1.199852727597960700f, 1.199545888207369700f, 1.199239004712905300f, + 1.198932077125851100f, + 1.198625105457491700f, 1.198318089719113200f, 1.198011029922004400f, + 1.197703926077454200f, + 1.197396778196754700f, 1.197089586291198500f, 1.196782350372080300f, + 1.196475070450696100f, + 1.196167746538343600f, 1.195860378646322700f, 1.195552966785933900f, + 1.195245510968480300f, + 1.194938011205265900f, 1.194630467507596500f, 1.194322879886780000f, + 1.194015248354125100f, + 1.193707572920943000f, 1.193399853598545500f, 1.193092090398246900f, + 1.192784283331362700f, + 1.192476432409210100f, 1.192168537643107900f, 1.191860599044376500f, + 1.191552616624337800f, + 1.191244590394315400f, 1.190936520365635000f, 1.190628406549622900f, + 1.190320248957608100f, + 1.190012047600920200f, 1.189703802490891000f, 1.189395513638853900f, + 1.189087181056143900f, + 1.188778804754097300f, 1.188470384744052100f, 1.188161921037348400f, + 1.187853413645327100f, + 1.187544862579331500f, 1.187236267850706000f, 1.186927629470796900f, + 1.186618947450951600f, + 1.186310221802519900f, 1.186001452536852300f, 1.185692639665301600f, + 1.185383783199222000f, + 1.185074883149969100f, 1.184765939528900500f, 1.184456952347374900f, + 1.184147921616753200f, + 1.183838847348397400f, 1.183529729553671500f, 1.183220568243940300f, + 1.182911363430571200f, + 1.182602115124932900f, 1.182292823338395100f, 1.181983488082330300f, + 1.181674109368111300f, + 1.181364687207113100f, 1.181055221610712400f, 1.180745712590287400f, + 1.180436160157217800f, + 1.180126564322885100f, 1.179816925098671900f, 1.179507242495962900f, + 1.179197516526144600f, + 1.178887747200604300f, 1.178577934530731700f, 1.178268078527917200f, + 1.177958179203553800f, + 1.177648236569035300f, 1.177338250635757700f, 1.177028221415118200f, + 1.176718148918515700f, + 1.176408033157350300f, 1.176097874143024600f, 1.175787671886942000f, + 1.175477426400507700f, + 1.175167137695128900f, 1.174856805782213500f, 1.174546430673171900f, + 1.174236012379415600f, + 1.173925550912357800f, 1.173615046283413200f, 1.173304498503998400f, + 1.172993907585530900f, + 1.172683273539430800f, 1.172372596377118800f, 1.172061876110017700f, + 1.171751112749551900f, + 1.171440306307147200f, 1.171129456794231200f, 1.170818564222232800f, + 1.170507628602582800f, + 1.170196649946713100f, 1.169885628266057900f, 1.169574563572052300f, + 1.169263455876133200f, + 1.168952305189739200f, 1.168641111524310700f, 1.168329874891289400f, + 1.168018595302118000f, + 1.167707272768241800f, 1.167395907301107100f, 1.167084498912162300f, + 1.166773047612856400f, + 1.166461553414641000f, 1.166150016328968600f, 1.165838436367293800f, + 1.165526813541072100f, + 1.165215147861761400f, 1.164903439340820900f, 1.164591687989710500f, + 1.164279893819892800f, + 1.163968056842831700f, 1.163656177069992500f, 1.163344254512841800f, + 1.163032289182848800f, + 1.162720281091483000f, 1.162408230250216100f, 1.162096136670521600f, + 1.161784000363874000f, + 1.161471821341749900f, 1.161159599615627000f, 1.160847335196984800f, + 1.160535028097304600f, + 1.160222678328068700f, 1.159910285900761700f, 1.159597850826869200f, + 1.159285373117878500f, + 1.158972852785278500f, 1.158660289840559800f, 1.158347684295214300f, + 1.158035036160735900f, + 1.157722345448619400f, 1.157409612170361600f, 1.157096836337461000f, + 1.156784017961417500f, + 1.156471157053732300f, 1.156158253625908700f, 1.155845307689450800f, + 1.155532319255865300f, + 1.155219288336659400f, 1.154906214943342700f, 1.154593099087426000f, + 1.154279940780421400f, + 1.153966740033842900f, 1.153653496859206000f, 1.153340211268028000f, + 1.153026883271827300f, + 1.152713512882124400f, 1.152400100110440700f, 1.152086644968299400f, + 1.151773147467225300f, + 1.151459607618745300f, 1.151146025434387000f, 1.150832400925680100f, + 1.150518734104155400f, + 1.150205024981345800f, 1.149891273568785400f, 1.149577479878009800f, + 1.149263643920556800f, + 1.148949765707964600f, 1.148635845251773800f, 1.148321882563526400f, + 1.148007877654766200f, + 1.147693830537038100f, 1.147379741221888500f, 1.147065609720865600f, + 1.146751436045519300f, + 1.146437220207400700f, 1.146122962218062600f, 1.145808662089060000f, + 1.145494319831947800f, + 1.145179935458284100f, 1.144865508979627800f, 1.144551040407539400f, + 1.144236529753581000f, + 1.143921977029316500f, 1.143607382246310600f, 1.143292745416130600f, + 1.142978066550344400f, + 1.142663345660522000f, 1.142348582758234900f, 1.142033777855056000f, + 1.141718930962559500f, + 1.141404042092321500f, 1.141089111255919800f, 1.140774138464933700f, + 1.140459123730943200f, + 1.140144067065530700f, 1.139828968480280300f, 1.139513827986776900f, + 1.139198645596607400f, + 1.138883421321360600f, 1.138568155172625700f, 1.138252847161994400f, + 1.137937497301059600f, + 1.137622105601416000f, 1.137306672074659900f, 1.136991196732388200f, + 1.136675679586200500f, + 1.136360120647697200f, 1.136044519928480800f, 1.135728877440154800f, + 1.135413193194324800f, + 1.135097467202597100f, 1.134781699476580300f, 1.134465890027884300f, + 1.134150038868120500f, + 1.133834146008902100f, 1.133518211461843200f, 1.133202235238559800f, + 1.132886217350669500f, + 1.132570157809791500f, 1.132254056627546300f, 1.131937913815556300f, + 1.131621729385444900f, + 1.131305503348837300f, 1.130989235717360100f, 1.130672926502642100f, + 1.130356575716312500f, + 1.130040183370002900f, 1.129723749475346000f, 1.129407274043976200f, + 1.129090757087529500f, + 1.128774198617643200f, 1.128457598645956600f, 1.128140957184109700f, + 1.127824274243744500f, + 1.127507549836505000f, 1.127190783974035800f, 1.126873976667983800f, + 1.126557127929996800f, + 1.126240237771724700f, 1.125923306204818400f, 1.125606333240930700f, + 1.125289318891715900f, + 1.124972263168829500f, 1.124655166083928800f, 1.124338027648672500f, + 1.124020847874721100f, + 1.123703626773736100f, 1.123386364357381200f, 1.123069060637320600f, + 1.122751715625221400f, + 1.122434329332750800f, 1.122116901771578400f, 1.121799432953375600f, + 1.121481922889814300f, + 1.121164371592568300f, 1.120846779073313400f, 1.120529145343726500f, + 1.120211470415486200f, + 1.119893754300272300f, 1.119575997009766300f, 1.119258198555651300f, + 1.118940358949611900f, + 1.118622478203333800f, 1.118304556328505200f, 1.117986593336814700f, + 1.117668589239953200f, + 1.117350544049612300f, 1.117032457777486200f, 1.116714330435269600f, + 1.116396162034659600f, + 1.116077952587353600f, 1.115759702105052000f, 1.115441410599455500f, + 1.115123078082267000f, + 1.114804704565190500f, 1.114486290059931900f, 1.114167834578198200f, + 1.113849338131698300f, + 1.113530800732142100f, 1.113212222391241500f, 1.112893603120710000f, + 1.112574942932261600f, + 1.112256241837613000f, 1.111937499848481900f, 1.111618716976587700f, + 1.111299893233650600f, + 1.110981028631393700f, 1.110662123181539900f, 1.110343176895814500f, + 1.110024189785944900f, + 1.109705161863658600f, 1.109386093140686000f, 1.109066983628758100f, + 1.108747833339607200f, + 1.108428642284968100f, 1.108109410476576300f, 1.107790137926169200f, + 1.107470824645485600f, + 1.107151470646265300f, 1.106832075940250600f, 1.106512640539184100f, + 1.106193164454811100f, + 1.105873647698877300f, 1.105554090283131100f, 1.105234492219321100f, + 1.104914853519198400f, + 1.104595174194514800f, 1.104275454257024300f, 1.103955693718482200f, + 1.103635892590644900f, + 1.103316050885270600f, 1.102996168614119000f, 1.102676245788951400f, + 1.102356282421530300f, + 1.102036278523620000f, 1.101716234106985700f, 1.101396149183395000f, + 1.101076023764616400f, + 1.100755857862419700f, 1.100435651488577100f, 1.100115404654861100f, + 1.099795117373046200f, + 1.099474789654909100f, 1.099154421512226600f, 1.098834012956778200f, + 1.098513564000344300f, + 1.098193074654706800f, 1.097872544931649100f, 1.097551974842956500f, + 1.097231364400415000f, + 1.096910713615813200f, 1.096590022500939700f, 1.096269291067585700f, + 1.095948519327543800f, + 1.095627707292607700f, 1.095306854974572800f, 1.094985962385235800f, + 1.094665029536395100f, + 1.094344056439850600f, 1.094023043107403200f, 1.093701989550856000f, + 1.093380895782013000f, + 1.093059761812680100f, 1.092738587654664300f, 1.092417373319774200f, + 1.092096118819820200f, + 1.091774824166613600f, 1.091453489371968100f, 1.091132114447697300f, + 1.090810699405617900f, + 1.090489244257547300f, 1.090167749015304300f, 1.089846213690709900f, + 1.089524638295585400f, + 1.089203022841754400f, 1.088881367341041800f, 1.088559671805274100f, + 1.088237936246279100f, + 1.087916160675885800f, 1.087594345105925300f, 1.087272489548229700f, + 1.086950594014632700f, + 1.086628658516969500f, 1.086306683067076900f, 1.085984667676792600f, + 1.085662612357956500f, + 1.085340517122409800f, 1.085018381981994500f, 1.084696206948555300f, + 1.084373992033937000f, + 1.084051737249986900f, 1.083729442608553300f, 1.083407108121486000f, + 1.083084733800636200f, + 1.082762319657857100f, 1.082439865705002500f, 1.082117371953928300f, + 1.081794838416491700f, + 1.081472265104551200f, 1.081149652029967000f, 1.080826999204601100f, + 1.080504306640315500f, + 1.080181574348975500f, 1.079858802342446900f, 1.079535990632596800f, + 1.079213139231294500f, + 1.078890248150409700f, 1.078567317401815100f, 1.078244346997383300f, + 1.077921336948988600f, + 1.077598287268508400f, 1.077275197967819000f, 1.076952069058800400f, + 1.076628900553332700f, + 1.076305692463297900f, 1.075982444800579700f, 1.075659157577062200f, + 1.075335830804633000f, + 1.075012464495178800f, 1.074689058660589700f, 1.074365613312755900f, + 1.074042128463569500f, + 1.073718604124924500f, 1.073395040308715400f, 1.073071437026839500f, + 1.072747794291194300f, + 1.072424112113678600f, 1.072100390506194500f, 1.071776629480643500f, + 1.071452829048929800f, + 1.071128989222958500f, 1.070805110014635900f, 1.070481191435870500f, + 1.070157233498571600f, + 1.069833236214650800f, 1.069509199596019800f, 1.069185123654592600f, + 1.068861008402285200f, + 1.068536853851013600f, 1.068212660012696700f, 1.067888426899253500f, + 1.067564154522606000f, + 1.067239842894676100f, 1.066915492027387600f, 1.066591101932666800f, + 1.066266672622439700f, + 1.065942204108635300f, 1.065617696403183400f, 1.065293149518014500f, + 1.064968563465062100f, + 1.064643938256259400f, 1.064319273903543000f, 1.063994570418849400f, + 1.063669827814116300f, + 1.063345046101285000f, 1.063020225292295300f, 1.062695365399091200f, + 1.062370466433616400f, + 1.062045528407815900f, 1.061720551333637600f, 1.061395535223029500f, + 1.061070480087941800f, + 1.060745385940325500f, 1.060420252792134000f, 1.060095080655320900f, + 1.059769869541841800f, + 1.059444619463654400f, 1.059119330432716700f, 1.058794002460989000f, + 1.058468635560432500f, + 1.058143229743009600f, 1.057817785020685100f, 1.057492301405424500f, + 1.057166778909195000f, + 1.056841217543965200f, 1.056515617321704500f, 1.056189978254385100f, + 1.055864300353978900f, + 1.055538583632461100f, 1.055212828101807200f, 1.054887033773993300f, + 1.054561200660999200f, + 1.054235328774803900f, 1.053909418127389400f, 1.053583468730738200f, + 1.053257480596834700f, + 1.052931453737664600f, 1.052605388165214700f, 1.052279283891473600f, + 1.051953140928431100f, + 1.051626959288079100f, 1.051300738982409800f, 1.050974480023417500f, + 1.050648182423098000f, + 1.050321846193448000f, 1.049995471346466300f, 1.049669057894152800f, + 1.049342605848508200f, + 1.049016115221536000f, 1.048689586025239700f, 1.048363018271625300f, + 1.048036411972699500f, + 1.047709767140470500f, 1.047383083786948700f, 1.047056361924144400f, + 1.046729601564071200f, + 1.046402802718742400f, 1.046075965400174300f, 1.045749089620383200f, + 1.045422175391386800f, + 1.045095222725206200f, 1.044768231633861100f, 1.044441202129375200f, + 1.044114134223771900f, + 1.043787027929076000f, 1.043459883257315400f, 1.043132700220517300f, + 1.042805478830712200f, + 1.042478219099930400f, 1.042150921040204200f, 1.041823584663568200f, + 1.041496209982056600f, + 1.041168797007707000f, 1.040841345752557200f, 1.040513856228645800f, + 1.040186328448014800f, + 1.039858762422705600f, 1.039531158164762400f, 1.039203515686230000f, + 1.038875834999155100f, + 1.038548116115585800f, 1.038220359047570500f, 1.037892563807160800f, + 1.037564730406408200f, + 1.037236858857366600f, 1.036908949172090900f, 1.036581001362636600f, + 1.036253015441062700f, + 1.035924991419427100f, 1.035596929309791300f, 1.035268829124216700f, + 1.034940690874766300f, + 1.034612514573505700f, 1.034284300232500000f, 1.033956047863817500f, + 1.033627757479526700f, + 1.033299429091697700f, 1.032971062712402700f, 1.032642658353714300f, + 1.032314216027707700f, + 1.031985735746457900f, 1.031657217522042900f, 1.031328661366541300f, + 1.031000067292032300f, + 1.030671435310598600f, 1.030342765434322200f, 1.030014057675287900f, + 1.029685312045581100f, + 1.029356528557288300f, 1.029027707222499100f, 1.028698848053302100f, + 1.028369951061789600f, + 1.028041016260053500f, 1.027712043660187600f, 1.027383033274288400f, + 1.027053985114451100f, + 1.026724899192775300f, 1.026395775521359500f, 1.026066614112305600f, + 1.025737414977715200f, + 1.025408178129692000f, 1.025078903580341600f, 1.024749591341769700f, + 1.024420241426085200f, + 1.024090853845396800f, 1.023761428611814600f, 1.023431965737451800f, + 1.023102465234420700f, + 1.022772927114837100f, 1.022443351390816400f, 1.022113738074476300f, + 1.021784087177936000f, + 1.021454398713315600f, 1.021124672692737000f, 1.020794909128323000f, + 1.020465108032198300f, + 1.020135269416488700f, 1.019805393293321100f, 1.019475479674824900f, + 1.019145528573129000f, + 1.018815540000365800f, 1.018485513968667500f, 1.018155450490168000f, + 1.017825349577003300f, + 1.017495211241309800f, 1.017165035495226400f, 1.016834822350892300f, + 1.016504571820448000f, + 1.016174283916036800f, 1.015843958649801600f, 1.015513596033888400f, + 1.015183196080442900f, + 1.014852758801613200f, 1.014522284209548900f, 1.014191772316400000f, + 1.013861223134318900f, + 1.013530636675459100f, 1.013200012951974700f, 1.012869351976022300f, + 1.012538653759758900f, + 1.012207918315344300f, 1.011877145654937400f, 1.011546335790700600f, + 1.011215488734796800f, + 1.010884604499389800f, 1.010553683096645900f, 1.010222724538731600f, + 1.009891728837815700f, + 1.009560696006067900f, 1.009229626055658800f, 1.008898518998761800f, + 1.008567374847549900f, + 1.008236193614199000f, 1.007904975310885300f, 1.007573719949786700f, + 1.007242427543082900f, + 1.006911098102953900f, 1.006579731641582500f, 1.006248328171152100f, + 1.005916887703846500f, + 1.005585410251852700f, 1.005253895827357800f, 1.004922344442551000f, + 1.004590756109621900f, + 1.004259130840762700f, 1.003927468648166100f, 1.003595769544025900f, + 1.003264033540538500f, + 1.002932260649900000f, 1.002600450884309800f, 1.002268604255967200f, + 1.001936720777072400f, + 1.001604800459829000f, 1.001272843316440000f, 1.000940849359111000f, + 1.000608818600048100f, + 1.000276751051459200f, 0.999944646725553720f, 0.999612505634541740f, + 0.999280327790635690f, + 0.998948113206048590f, 0.998615861892994560f, 0.998283573863690270f, + 0.997951249130352380f, + 0.997618887705200020f, 0.997286489600452630f, 0.996954054828332210f, + 0.996621583401061110f, + 0.996289075330862860f, 0.995956530629963810f, 0.995623949310589620f, + 0.995291331384969390f, + 0.994958676865332010f, 0.994625985763907820f, 0.994293258092929790f, + 0.993960493864630480f, + 0.993627693091245660f, 0.993294855785010760f, 0.992961981958163210f, + 0.992629071622942340f, + 0.992296124791587690f, 0.991963141476341460f, 0.991630121689446090f, + 0.991297065443145440f, + 0.990963972749685840f, 0.990630843621313260f, 0.990297678070276800f, + 0.989964476108825210f, + 0.989631237749210020f, 0.989297963003683330f, 0.988964651884498000f, + 0.988631304403909890f, + 0.988297920574174430f, 0.987964500407549910f, 0.987631043916294970f, + 0.987297551112669370f, + 0.986964022008935520f, 0.986630456617355380f, 0.986296854950194260f, + 0.985963217019717120f, + 0.985629542838190490f, 0.985295832417883540f, 0.984962085771065030f, + 0.984628302910006580f, + 0.984294483846980150f, 0.983960628594258810f, 0.983626737164118190f, + 0.983292809568833910f, + 0.982958845820684270f, 0.982624845931947320f, 0.982290809914904140f, + 0.981956737781835790f, + 0.981622629545024770f, 0.981288485216756160f, 0.980954304809314670f, + 0.980620088334987930f, + 0.980285835806063770f, 0.979951547234831130f, 0.979617222633581860f, + 0.979282862014607240f, + 0.978948465390201530f, 0.978614032772659240f, 0.978279564174275860f, + 0.977945059607349900f, + 0.977610519084179290f, 0.977275942617064740f, 0.976941330218307540f, + 0.976606681900209830f, + 0.976271997675076550f, 0.975937277555212310f, 0.975602521552924600f, + 0.975267729680520560f, + 0.974932901950310350f, 0.974598038374604350f, 0.974263138965714040f, + 0.973928203735953460f, + 0.973593232697636530f, 0.973258225863079970f, 0.972923183244600480f, + 0.972588104854516410f, + 0.972252990705148370f, 0.971917840808816710f, 0.971582655177844700f, + 0.971247433824555920f, + 0.970912176761274950f, 0.970576884000329040f, 0.970241555554045230f, + 0.969906191434753320f, + 0.969570791654783330f, 0.969235356226466500f, 0.968899885162136650f, + 0.968564378474127350f, + 0.968228836174775060f, 0.967893258276415700f, 0.967557644791388500f, + 0.967221995732032490f, + 0.966886311110688230f, 0.966550590939698640f, 0.966214835231406500f, + 0.965879043998157160f, + 0.965543217252296420f, 0.965207355006171270f, 0.964871457272131190f, + 0.964535524062525410f, + 0.964199555389706030f, 0.963863551266025300f, 0.963527511703836660f, + 0.963191436715496120f, + 0.962855326313359350f, 0.962519180509785130f, 0.962182999317132030f, + 0.961846782747760140f, + 0.961510530814032040f, 0.961174243528309820f, 0.960837920902958720f, + 0.960501562950343390f, + 0.960165169682831830f, 0.959828741112791590f, 0.959492277252591900f, + 0.959155778114604400f, + 0.958819243711200310f, 0.958482674054753960f, 0.958146069157639560f, + 0.957809429032232760f, + 0.957472753690911670f, 0.957136043146054050f, 0.956799297410040440f, + 0.956462516495251940f, + 0.956125700414070300f, 0.955788849178880300f, 0.955451962802066120f, + 0.955115041296014880f, + 0.954778084673113870f, 0.954441092945751630f, 0.954104066126319150f, + 0.953767004227207060f, + 0.953429907260809120f, 0.953092775239518630f, 0.952755608175731570f, + 0.952418406081844360f, + 0.952081168970254520f, 0.951743896853362140f, 0.951406589743566950f, + 0.951069247653271500f, + 0.950731870594878510f, 0.950394458580791970f, 0.950057011623418380f, + 0.949719529735163940f, + 0.949382012928437600f, 0.949044461215648560f, 0.948706874609207220f, + 0.948369253121526420f, + 0.948031596765018910f, 0.947693905552099870f, 0.947356179495185020f, + 0.947018418606691230f, + 0.946680622899037650f, 0.946342792384643360f, 0.946004927075930090f, + 0.945667026985319680f, + 0.945329092125236190f, 0.944991122508104350f, 0.944653118146349890f, + 0.944315079052401090f, + 0.943977005238685770f, 0.943638896717634900f, 0.943300753501679190f, + 0.942962575603250920f, + 0.942624363034784580f, 0.942286115808714690f, 0.941947833937478270f, + 0.941609517433512730f, + 0.941271166309256450f, 0.940932780577150460f, 0.940594360249635500f, + 0.940255905339155150f, + 0.939917415858152920f, 0.939578891819073720f, 0.939240333234364950f, + 0.938901740116473540f, + 0.938563112477849630f, 0.938224450330942590f, 0.937885753688204820f, + 0.937547022562088990f, + 0.937208256965048840f, 0.936869456909540490f, 0.936530622408019990f, + 0.936191753472946030f, + 0.935852850116777430f, 0.935513912351974450f, 0.935174940190999560f, + 0.934835933646314900f, + 0.934496892730385720f, 0.934157817455677160f, 0.933818707834655590f, + 0.933479563879790030f, + 0.933140385603548840f, 0.932801173018403480f, 0.932461926136825660f, + 0.932122644971287830f, + 0.931783329534265240f, 0.931443979838232900f, 0.931104595895668410f, + 0.930765177719049210f, + 0.930425725320855430f, 0.930086238713567440f, 0.929746717909666790f, + 0.929407162921637610f, + 0.929067573761963250f, 0.928727950443130500f, 0.928388292977625930f, + 0.928048601377937210f, + 0.927708875656554800f, 0.927369115825968480f, 0.927029321898671270f, + 0.926689493887155820f, + 0.926349631803916270f, 0.926009735661449170f, 0.925669805472250860f, + 0.925329841248820340f, + 0.924989843003656610f, 0.924649810749260110f, 0.924309744498133750f, + 0.923969644262779830f, + 0.923629510055703820f, 0.923289341889410480f, 0.922949139776407800f, + 0.922608903729203570f, + 0.922268633760306990f, 0.921928329882229390f, 0.921587992107482210f, + 0.921247620448579440f, + 0.920907214918035070f, 0.920566775528364410f, 0.920226302292085460f, + 0.919885795221715540f, + 0.919545254329774850f, 0.919204679628783720f, 0.918864071131263780f, + 0.918523428849739030f, + 0.918182752796733110f, 0.917842042984772340f, 0.917501299426383480f, + 0.917160522134094160f, + 0.916819711120434700f, 0.916478866397934850f, 0.916137987979127270f, + 0.915797075876544350f, + 0.915456130102721200f, 0.915115150670193110f, 0.914774137591496510f, + 0.914433090879170130f, + 0.914092010545752620f, 0.913750896603785280f, 0.913409749065809520f, + 0.913068567944367970f, + 0.912727353252005710f, 0.912386105001267270f, 0.912044823204700370f, + 0.911703507874852440f, + 0.911362159024272310f, 0.911020776665511290f, 0.910679360811120000f, + 0.910337911473652390f, + 0.909996428665661990f, 0.909654912399703860f, 0.909313362688335290f, + 0.908971779544113350f, + 0.908630162979597760f, 0.908288513007348140f, 0.907946829639926790f, + 0.907605112889895870f, + 0.907263362769819000f, 0.906921579292262250f, 0.906579762469791110f, + 0.906237912314974080f, + 0.905896028840379560f, 0.905554112058577170f, 0.905212161982139160f, + 0.904870178623637170f, + 0.904528161995645670f, 0.904186112110739510f, 0.903844028981494190f, + 0.903501912620488070f, + 0.903159763040298880f, 0.902817580253507450f, 0.902475364272694370f, + 0.902133115110441470f, + 0.901790832779333250f, 0.901448517291953520f, 0.901106168660889110f, + 0.900763786898726380f, + 0.900421372018054500f, 0.900078924031462610f, 0.899736442951541320f, + 0.899393928790883420f, + 0.899051381562081310f, 0.898708801277730340f, 0.898366187950425780f, + 0.898023541592764210f, + 0.897680862217344440f, 0.897338149836764960f, 0.896995404463627350f, + 0.896652626110532870f, + 0.896309814790084090f, 0.895966970514885940f, 0.895624093297543110f, + 0.895281183150662960f, + 0.894938240086852970f, 0.894595264118721810f, 0.894252255258880410f, + 0.893909213519939460f, + 0.893566138914512420f, 0.893223031455212530f, 0.892879891154655380f, + 0.892536718025457090f, + 0.892193512080234670f, 0.891850273331607600f, 0.891507001792195000f, + 0.891163697474618880f, + 0.890820360391500920f, 0.890476990555464480f, 0.890133587979135000f, + 0.889790152675137610f, + 0.889446684656100330f, 0.889103183934650930f, 0.888759650523418650f, + 0.888416084435035060f, + 0.888072485682131150f, 0.887728854277341050f, 0.887385190233298650f, + 0.887041493562639060f, + 0.886697764277999840f, 0.886354002392018110f, 0.886010207917333760f, + 0.885666380866586560f, + 0.885322521252418610f, 0.884978629087472270f, 0.884634704384391180f, + 0.884290747155821230f, + 0.883946757414407980f, 0.883602735172799640f, 0.883258680443644530f, + 0.882914593239592320f, + 0.882570473573294660f, 0.882226321457403320f, 0.881882136904572400f, + 0.881537919927456340f, + 0.881193670538710450f, 0.880849388750992610f, 0.880505074576960370f, + 0.880160728029273920f, + 0.879816349120593590f, 0.879471937863580690f, 0.879127494270899090f, + 0.878783018355212220f, + 0.878438510129186170f, 0.878093969605486800f, 0.877749396796782770f, + 0.877404791715742370f, + 0.877060154375035710f, 0.876715484787334630f, 0.876370782965310900f, + 0.876026048921639160f, + 0.875681282668993700f, 0.875336484220050390f, 0.874991653587487090f, + 0.874646790783981660f, + 0.874301895822214290f, 0.873956968714865500f, 0.873612009474616810f, + 0.873267018114152300f, + 0.872921994646155390f, 0.872576939083312460f, 0.872231851438309840f, + 0.871886731723835020f, + 0.871541579952577750f, 0.871196396137227660f, 0.870851180290476810f, + 0.870505932425017060f, + 0.870160652553543020f, 0.869815340688749220f, 0.869469996843331370f, + 0.869124621029987670f, + 0.868779213261415610f, 0.868433773550315810f, 0.868088301909388680f, + 0.867742798351335720f, + 0.867397262888861100f, 0.867051695534668210f, 0.866706096301463340f, + 0.866360465201952980f, + 0.866014802248844420f, 0.865669107454847490f, 0.865323380832671800f, + 0.864977622395029290f, + 0.864631832154632240f, 0.864286010124194040f, 0.863940156316430170f, + 0.863594270744056040f, + 0.863248353419789670f, 0.862902404356348570f, 0.862556423566453230f, + 0.862210411062823810f, + 0.861864366858181910f, 0.861518290965251340f, 0.861172183396755500f, + 0.860826044165420630f, + 0.860479873283972910f, 0.860133670765139580f, 0.859787436621650360f, + 0.859441170866234390f, + 0.859094873511623840f, 0.858748544570550610f, 0.858402184055747750f, + 0.858055791979950740f, + 0.857709368355894840f, 0.857362913196317630f, 0.857016426513956930f, + 0.856669908321551650f, + 0.856323358631843170f, 0.855976777457572280f, 0.855630164811482460f, + 0.855283520706317080f, + 0.854936845154821930f, 0.854590138169742830f, 0.854243399763827020f, + 0.853896629949823630f, + 0.853549828740481690f, 0.853202996148552880f, 0.852856132186788910f, + 0.852509236867942440f, + 0.852162310204768740f, 0.851815352210022470f, 0.851468362896461110f, + 0.851121342276842110f, + 0.850774290363923820f, 0.850427207170467380f, 0.850080092709233130f, + 0.849732946992984290f, + 0.849385770034483680f, 0.849038561846496730f, 0.848691322441788910f, + 0.848344051833126780f, + 0.847996750033279350f, 0.847649417055015060f, 0.847302052911105160f, + 0.846954657614320980f, + 0.846607231177434640f, 0.846259773613221020f, 0.845912284934454140f, + 0.845564765153910990f, + 0.845217214284368690f, 0.844869632338605130f, 0.844522019329400630f, + 0.844174375269535320f, + 0.843826700171791620f, 0.843478994048952440f, 0.843131256913801420f, + 0.842783488779124570f, + 0.842435689657707650f, 0.842087859562339000f, 0.841739998505806610f, + 0.841392106500900900f, + 0.841044183560412770f, 0.840696229697133760f, 0.840348244923857960f, + 0.840000229253379030f, + 0.839652182698493290f, 0.839304105271996950f, 0.838955996986687550f, + 0.838607857855364740f, + 0.838259687890827830f, 0.837911487105878820f, 0.837563255513319780f, + 0.837214993125953600f, + 0.836866699956585690f, 0.836518376018021260f, 0.836170021323067610f, + 0.835821635884532730f, + 0.835473219715225040f, 0.835124772827955830f, 0.834776295235535540f, + 0.834427786950777460f, + 0.834079247986494690f, 0.833730678355502630f, 0.833382078070616820f, + 0.833033447144653880f, + 0.832684785590432690f, 0.832336093420771970f, 0.831987370648492710f, + 0.831638617286416190f, + 0.831289833347364620f, 0.830941018844162600f, 0.830592173789634240f, + 0.830243298196606360f, + 0.829894392077905720f, 0.829545455446360270f, 0.829196488314800080f, + 0.828847490696055010f, + 0.828498462602957340f, 0.828149404048339590f, 0.827800315045035150f, + 0.827451195605879990f, + 0.827102045743709160f, 0.826752865471360950f, 0.826403654801672770f, + 0.826054413747485010f, + 0.825705142321637720f, 0.825355840536972420f, 0.825006508406332490f, + 0.824657145942561230f, + 0.824307753158504460f, 0.823958330067008030f, 0.823608876680918760f, + 0.823259393013085820f, + 0.822909879076357930f, 0.822560334883586490f, 0.822210760447622980f, + 0.821861155781319800f, + 0.821511520897531660f, 0.821161855809112830f, 0.820812160528920360f, + 0.820462435069811090f, + 0.820112679444643060f, 0.819762893666276530f, 0.819413077747571440f, + 0.819063231701390170f, + 0.818713355540594880f, 0.818363449278050270f, 0.818013512926620940f, + 0.817663546499172720f, + 0.817313550008573640f, 0.816963523467691410f, 0.816613466889396070f, + 0.816263380286557980f, + 0.815913263672048310f, 0.815563117058740630f, 0.815212940459508210f, + 0.814862733887226740f, + 0.814512497354771830f, 0.814162230875020380f, 0.813811934460851430f, + 0.813461608125143560f, + 0.813111251880778150f, 0.812760865740636440f, 0.812410449717600570f, + 0.812060003824555230f, + 0.811709528074384460f, 0.811359022479975040f, 0.811008487054213360f, + 0.810657921809988410f, + 0.810307326760189020f, 0.809956701917705080f, 0.809606047295428950f, + 0.809255362906252440f, + 0.808904648763069890f, 0.808553904878775760f, 0.808203131266265420f, + 0.807852327938436750f, + 0.807501494908186900f, 0.807150632188415760f, 0.806799739792023240f, + 0.806448817731910130f, + 0.806097866020979660f, 0.805746884672134620f, 0.805395873698280360f, + 0.805044833112322000f, + 0.804693762927166100f, 0.804342663155721230f, 0.803991533810895500f, + 0.803640374905599810f, + 0.803289186452744390f, 0.802937968465242240f, 0.802586720956006250f, + 0.802235443937950320f, + 0.801884137423990890f, 0.801532801427043530f, 0.801181435960026780f, + 0.800830041035858750f, + 0.800478616667459010f, 0.800127162867749210f, 0.799775679649650460f, + 0.799424167026086540f, + 0.799072625009981330f, 0.798721053614259490f, 0.798369452851848020f, + 0.798017822735673680f, + 0.797666163278665570f, 0.797314474493752810f, 0.796962756393865600f, + 0.796611008991936490f, + 0.796259232300897350f, 0.795907426333682830f, 0.795555591103226930f, + 0.795203726622466520f, + 0.794851832904338360f, 0.794499909961779990f, 0.794147957807731400f, + 0.793795976455132220f, + 0.793443965916924570f, 0.793091926206050400f, 0.792739857335452710f, + 0.792387759318077150f, + 0.792035632166868230f, 0.791683475894773720f, 0.791331290514740830f, + 0.790979076039718180f, + 0.790626832482656310f, 0.790274559856505520f, 0.789922258174218570f, + 0.789569927448748320f, + 0.789217567693048520f, 0.788865178920075130f, 0.788512761142783790f, + 0.788160314374132590f, + 0.787807838627079260f, 0.787455333914584220f, 0.787102800249607550f, + 0.786750237645110430f, + 0.786397646114056490f, 0.786045025669408700f, 0.785692376324132690f, + 0.785339698091194080f, + 0.784986990983559170f, 0.784634255014197040f, 0.784281490196075850f, + 0.783928696542166680f, + 0.783575874065440270f, 0.783223022778868350f, 0.782870142695425320f, + 0.782517233828084580f, + 0.782164296189822530f, 0.781811329793615120f, 0.781458334652439630f, + 0.781105310779275470f, + 0.780752258187101480f, 0.780399176888899150f, 0.780046066897649550f, + 0.779692928226336290f, + 0.779339760887942880f, 0.778986564895453810f, 0.778633340261856040f, + 0.778280087000135730f, + 0.777926805123281830f, 0.777573494644283050f, 0.777220155576129220f, + 0.776866787931812410f, + 0.776513391724324210f, 0.776159966966658680f, 0.775806513671809860f, + 0.775453031852772920f, + 0.775099521522545020f, 0.774745982694123090f, 0.774392415380506400f, + 0.774038819594694230f, + 0.773685195349686940f, 0.773331542658487140f, 0.772977861534096640f, + 0.772624151989520280f, + 0.772270414037761980f, 0.771916647691828660f, 0.771562852964726710f, + 0.771209029869463940f, + 0.770855178419050050f, 0.770501298626494410f, 0.770147390504808960f, + 0.769793454067005500f, + 0.769439489326096850f, 0.769085496295098040f, 0.768731474987023660f, + 0.768377425414890850f, + 0.768023347591716640f, 0.767669241530518850f, 0.767315107244318060f, + 0.766960944746133740f, + 0.766606754048988260f, 0.766252535165903970f, 0.765898288109903900f, + 0.765544012894013530f, + 0.765189709531257760f, 0.764835378034664170f, 0.764481018417259680f, + 0.764126630692073870f, + 0.763772214872136200f, 0.763417770970477140f, 0.763063299000129260f, + 0.762708798974124800f, + 0.762354270905498450f, 0.761999714807284790f, 0.761645130692519490f, + 0.761290518574240350f, + 0.760935878465484720f, 0.760581210379292380f, 0.760226514328703140f, + 0.759871790326757670f, + 0.759517038386499090f, 0.759162258520969860f, 0.758807450743214760f, + 0.758452615066278920f, + 0.758097751503208020f, 0.757742860067050380f, 0.757387940770853360f, + 0.757032993627667290f, + 0.756678018650541630f, 0.756323015852528700f, 0.755967985246680520f, + 0.755612926846050080f, + 0.755257840663692730f, 0.754902726712663120f, 0.754547585006018600f, + 0.754192415556816380f, + 0.753837218378114460f, 0.753481993482973400f, 0.753126740884452970f, + 0.752771460595615500f, + 0.752416152629523330f, 0.752060816999239660f, 0.751705453717829930f, + 0.751350062798359140f, + 0.750994644253894730f, 0.750639198097504010f, 0.750283724342255320f, + 0.749928223001219310f, + 0.749572694087465850f, 0.749217137614067500f, 0.748861553594096340f, + 0.748505942040627040f, + 0.748150302966733790f, 0.747794636385492150f, 0.747438942309979870f, + 0.747083220753273820f, + 0.746727471728453770f, 0.746371695248599140f, 0.746015891326790470f, + 0.745660059976110400f, + 0.745304201209641030f, 0.744948315040467210f, 0.744592401481673270f, + 0.744236460546344850f, + 0.743880492247569580f, 0.743524496598434670f, 0.743168473612029980f, + 0.742812423301444810f, + 0.742456345679769810f, 0.742100240760097840f, 0.741744108555520860f, + 0.741387949079133860f, + 0.741031762344030790f, 0.740675548363308620f, 0.740319307150063780f, + 0.739963038717393880f, + 0.739606743078398690f, 0.739250420246177380f, 0.738894070233831800f, + 0.738537693054463370f, + 0.738181288721174830f, 0.737824857247070810f, 0.737468398645255490f, + 0.737111912928835710f, + 0.736755400110918000f, 0.736398860204609870f, 0.736042293223021060f, + 0.735685699179260850f, + 0.735329078086440880f, 0.734972429957672760f, 0.734615754806068890f, + 0.734259052644744230f, + 0.733902323486812610f, 0.733545567345390890f, 0.733188784233595240f, + 0.732831974164544150f, + 0.732475137151356370f, 0.732118273207151170f, 0.731761382345050280f, + 0.731404464578174760f, + 0.731047519919648340f, 0.730690548382594280f, 0.730333549980137110f, + 0.729976524725403530f, + 0.729619472631519270f, 0.729262393711613280f, 0.728905287978813600f, + 0.728548155446249730f, + 0.728190996127053180f, 0.727833810034354990f, 0.727476597181288540f, + 0.727119357580987220f, + 0.726762091246585200f, 0.726404798191218950f, 0.726047478428024420f, + 0.725690131970139980f, + 0.725332758830703360f, 0.724975359022855150f, 0.724617932559735390f, + 0.724260479454485130f, + 0.723902999720247850f, 0.723545493370166160f, 0.723187960417385530f, + 0.722830400875050790f, + 0.722472814756308090f, 0.722115202074305680f, 0.721757562842191060f, + 0.721399897073114470f, + 0.721042204780225960f, 0.720684485976676230f, 0.720326740675618530f, + 0.719968968890205230f, + 0.719611170633591480f, 0.719253345918932090f, 0.718895494759382860f, + 0.718537617168101610f, + 0.718179713158245800f, 0.717821782742975370f, 0.717463825935449550f, + 0.717105842748830160f, + 0.716747833196278770f, 0.716389797290958090f, 0.716031735046032900f, + 0.715673646474667140f, + 0.715315531590027700f, 0.714957390405280950f, 0.714599222933594240f, + 0.714241029188137260f, + 0.713882809182079030f, 0.713524562928591010f, 0.713166290440844450f, + 0.712807991732011590f, + 0.712449666815266890f, 0.712091315703784260f, 0.711732938410739810f, + 0.711374534949309800f, + 0.711016105332671340f, 0.710657649574003460f, 0.710299167686484930f, + 0.709940659683296890f, + 0.709582125577619790f, 0.709223565382636760f, 0.708864979111530680f, + 0.708506366777485130f, + 0.708147728393686340f, 0.707789063973319310f, 0.707430373529572170f, + 0.707071657075632460f, + 0.706712914624688770f, 0.706354146189931750f, 0.705995351784551530f, + 0.705636531421740880f, + 0.705277685114692020f, 0.704918812876598410f, 0.704559914720655490f, + 0.704200990660058150f, + 0.703842040708003820f, 0.703483064877689630f, 0.703124063182313690f, + 0.702765035635076310f, + 0.702405982249177160f, 0.702046903037818250f, 0.701687798014201110f, + 0.701328667191529980f, + 0.700969510583008600f, 0.700610328201841660f, 0.700251120061236020f, + 0.699891886174398130f, + 0.699532626554536630f, 0.699173341214860190f, 0.698814030168578240f, + 0.698454693428902320f, + 0.698095331009043640f, 0.697735942922215520f, 0.697376529181631400f, + 0.697017089800505250f, + 0.696657624792053730f, 0.696298134169492380f, 0.695938617946039510f, + 0.695579076134912990f, + 0.695219508749331800f, 0.694859915802517050f, 0.694500297307689140f, + 0.694140653278070950f, + 0.693780983726884790f, 0.693421288667355530f, 0.693061568112707690f, + 0.692701822076166820f, + 0.692342050570960430f, 0.691982253610315510f, 0.691622431207461700f, + 0.691262583375628180f, + 0.690902710128045050f, 0.690542811477944610f, 0.690182887438558710f, + 0.689822938023121220f, + 0.689462963244866330f, 0.689102963117028790f, 0.688742937652845550f, + 0.688382886865552930f, + 0.688022810768389670f, 0.687662709374594510f, 0.687302582697406850f, + 0.686942430750068330f, + 0.686582253545819920f, 0.686222051097905130f, 0.685861823419566700f, + 0.685501570524050140f, + 0.685141292424600310f, 0.684780989134463280f, 0.684420660666887120f, + 0.684060307035119440f, + 0.683699928252410110f, 0.683339524332008840f, 0.682979095287166160f, + 0.682618641131135020f, + 0.682258161877167370f, 0.681897657538517720f, 0.681537128128440470f, + 0.681176573660190910f, + 0.680815994147026320f, 0.680455389602203310f, 0.680094760038981280f, + 0.679734105470619080f, + 0.679373425910376310f, 0.679012721371515250f, 0.678651991867297080f, + 0.678291237410985510f, + 0.677930458015843620f, 0.677569653695137220f, 0.677208824462131490f, + 0.676847970330092700f, + 0.676487091312289350f, 0.676126187421989040f, 0.675765258672461950f, + 0.675404305076978020f, + 0.675043326648808170f, 0.674682323401225250f, 0.674321295347501510f, + 0.673960242500911690f, + 0.673599164874730370f, 0.673238062482232950f, 0.672876935336696900f, + 0.672515783451398950f, + 0.672154606839618470f, 0.671793405514634180f, 0.671432179489727110f, + 0.671070928778178090f, + 0.670709653393269050f, 0.670348353348283690f, 0.669987028656505170f, + 0.669625679331219300f, + 0.669264305385711360f, 0.668902906833267590f, 0.668541483687176590f, + 0.668180035960725840f, + 0.667818563667205600f, 0.667457066819905800f, 0.667095545432117240f, + 0.666733999517132860f, + 0.666372429088244790f, 0.666010834158747840f, 0.665649214741936390f, + 0.665287570851105680f, + 0.664925902499553190f, 0.664564209700575500f, 0.664202492467472090f, + 0.663840750813541210f, + 0.663478984752084110f, 0.663117194296401260f, 0.662755379459794350f, + 0.662393540255567070f, + 0.662031676697022450f, 0.661669788797465960f, 0.661307876570202740f, + 0.660945940028538900f, + 0.660583979185782600f, 0.660221994055241400f, 0.659859984650225110f, + 0.659497950984043510f, + 0.659135893070007080f, 0.658773810921428500f, 0.658411704551619570f, + 0.658049573973894850f, + 0.657687419201568260f, 0.657325240247955020f, 0.656963037126372160f, + 0.656600809850135910f, + 0.656238558432565400f, 0.655876282886978410f, 0.655513983226695960f, + 0.655151659465038060f, + 0.654789311615326050f, 0.654426939690883280f, 0.654064543705032310f, + 0.653702123671098150f, + 0.653339679602405470f, 0.652977211512280050f, 0.652614719414049580f, + 0.652252203321041060f, + 0.651889663246583930f, 0.651527099204007310f, 0.651164511206641320f, + 0.650801899267818060f, + 0.650439263400868990f, 0.650076603619127890f, 0.649713919935928420f, + 0.649351212364604910f, + 0.648988480918494040f, 0.648625725610931460f, 0.648262946455255510f, + 0.647900143464803730f, + 0.647537316652916140f, 0.647174466032932490f, 0.646811591618193350f, + 0.646448693422041360f, + 0.646085771457818310f, 0.645722825738868860f, 0.645359856278536980f, + 0.644996863090167570f, + 0.644633846187107620f, 0.644270805582703550f, 0.643907741290304040f, + 0.643544653323257610f, + 0.643181541694913480f, 0.642818406418622980f, 0.642455247507736860f, + 0.642092064975608220f, + 0.641728858835589830f, 0.641365629101035340f, 0.641002375785300500f, + 0.640639098901740200f, + 0.640275798463712080f, 0.639912474484572560f, 0.639549126977681070f, + 0.639185755956396480f, + 0.638822361434078330f, 0.638458943424088490f, 0.638095501939787920f, + 0.637732036994540290f, + 0.637368548601708660f, 0.637005036774657030f, 0.636641501526751590f, + 0.636277942871357530f, + 0.635914360821842830f, 0.635550755391574910f, 0.635187126593922070f, + 0.634823474442254840f, + 0.634459798949942640f, 0.634096100130357660f, 0.633732377996871770f, + 0.633368632562857470f, + 0.633004863841689520f, 0.632641071846741790f, 0.632277256591390780f, + 0.631913418089012020f, + 0.631549556352983710f, 0.631185671396683470f, 0.630821763233490040f, + 0.630457831876783950f, + 0.630093877339945260f, 0.629729899636356280f, 0.629365898779399080f, + 0.629001874782456500f, + 0.628637827658913300f, 0.628273757422153860f, 0.627909664085564810f, + 0.627545547662532230f, + 0.627181408166443410f, 0.626817245610687520f, 0.626453060008652860f, + 0.626088851373730380f, + 0.625724619719310480f, 0.625360365058784670f, 0.624996087405546350f, + 0.624631786772988030f, + 0.624267463174504880f, 0.623903116623491180f, 0.623538747133343780f, + 0.623174354717459190f, + 0.622809939389234460f, 0.622445501162069090f, 0.622081040049361490f, + 0.621716556064512820f, + 0.621352049220923570f, 0.620987519531995270f, 0.620622967011131400f, + 0.620258391671734690f, + 0.619893793527210410f, 0.619529172590963410f, 0.619164528876399280f, + 0.618799862396925750f, + 0.618435173165949760f, 0.618070461196880800f, 0.617705726503127720f, + 0.617340969098100430f, + 0.616976188995210780f, 0.616611386207870040f, 0.616246560749491690f, + 0.615881712633488340f, + 0.615516841873275490f, 0.615151948482267840f, 0.614787032473881110f, + 0.614422093861533010f, + 0.614057132658640590f, 0.613692148878623000f, 0.613327142534899510f, + 0.612962113640889710f, + 0.612597062210015750f, 0.612231988255698470f, 0.611866891791361560f, + 0.611501772830428060f, + 0.611136631386322020f, 0.610771467472469460f, 0.610406281102295440f, + 0.610041072289227990f, + 0.609675841046694030f, 0.609310587388121830f, 0.608945311326941520f, + 0.608580012876582370f, + 0.608214692050476290f, 0.607849348862054220f, 0.607483983324749510f, + 0.607118595451995420f, + 0.606753185257225550f, 0.606387752753876020f, 0.606022297955381760f, + 0.605656820875180360f, + 0.605291321526709060f, 0.604925799923405670f, 0.604560256078710220f, + 0.604194690006061960f, + 0.603829101718902580f, 0.603463491230673220f, 0.603097858554815790f, + 0.602732203704774650f, + 0.602366526693992930f, 0.602000827535916330f, 0.601635106243990190f, + 0.601269362831660550f, + 0.600903597312375640f, 0.600537809699582810f, 0.600172000006731770f, + 0.599806168247271620f, + 0.599440314434653620f, 0.599074438582328780f, 0.598708540703749010f, + 0.598342620812368000f, + 0.597976678921638860f, 0.597610715045016950f, 0.597244729195957500f, + 0.596878721387916090f, + 0.596512691634350830f, 0.596146639948718640f, 0.595780566344478960f, + 0.595414470835091030f, + 0.595048353434014630f, 0.594682214154711790f, 0.594316053010643270f, + 0.593949870015273000f, + 0.593583665182063740f, 0.593217438524479500f, 0.592851190055986300f, + 0.592484919790049140f, + 0.592118627740135460f, 0.591752313919712170f, 0.591385978342248260f, + 0.591019621021212420f, + 0.590653241970074180f, 0.590286841202305120f, 0.589920418731375800f, + 0.589553974570759530f, + 0.589187508733928890f, 0.588821021234357310f, 0.588454512085520460f, + 0.588087981300892900f, + 0.587721428893951850f, 0.587354854878173850f, 0.586988259267036350f, + 0.586621642074019120f, + 0.586255003312600500f, 0.585888342996261690f, 0.585521661138483250f, + 0.585154957752746730f, + 0.584788232852535560f, 0.584421486451332410f, 0.584054718562622140f, + 0.583687929199888990f, + 0.583321118376619710f, 0.582954286106300290f, 0.582587432402417840f, + 0.582220557278461340f, + 0.581853660747918780f, 0.581486742824280810f, 0.581119803521037650f, + 0.580752842851679940f, + 0.580385860829700780f, 0.580018857468592270f, 0.579651832781848730f, + 0.579284786782964360f, + 0.578917719485433800f, 0.578550630902754050f, 0.578183521048421080f, + 0.577816389935933090f, + 0.577449237578788300f, 0.577082063990485340f, 0.576714869184524860f, + 0.576347653174406840f, + 0.575980415973633590f, 0.575613157595706530f, 0.575245878054129520f, + 0.574878577362406000f, + 0.574511255534040030f, 0.574143912582537940f, 0.573776548521405030f, + 0.573409163364148930f, + 0.573041757124277180f, 0.572674329815297640f, 0.572306881450720390f, + 0.571939412044054740f, + 0.571571921608812320f, 0.571204410158504090f, 0.570836877706642270f, + 0.570469324266740570f, + 0.570101749852312100f, 0.569734154476872480f, 0.569366538153936560f, + 0.568998900897020210f, + 0.568631242719641270f, 0.568263563635316600f, 0.567895863657565500f, + 0.567528142799906490f, + 0.567160401075860410f, 0.566792638498947680f, 0.566424855082689470f, + 0.566057050840608870f, + 0.565689225786228160f, 0.565321379933072190f, 0.564953513294665140f, + 0.564585625884531870f, + 0.564217717716199550f, 0.563849788803194140f, 0.563481839159044150f, + 0.563113868797277870f, + 0.562745877731423820f, 0.562377865975012940f, 0.562009833541575080f, + 0.561641780444642640f, + 0.561273706697747450f, 0.560905612314422150f, 0.560537497308201240f, + 0.560169361692618440f, + 0.559801205481210040f, 0.559433028687510990f, 0.559064831325059240f, + 0.558696613407391630f, + 0.558328374948046320f, 0.557960115960563050f, 0.557591836458480870f, + 0.557223536455341280f, + 0.556855215964685120f, 0.556486875000054000f, 0.556118513574991650f, + 0.555750131703040880f, + 0.555381729397746880f, 0.555013306672654360f, 0.554644863541308600f, + 0.554276400017257090f, + 0.553907916114046440f, 0.553539411845225590f, 0.553170887224342820f, + 0.552802342264947400f, + 0.552433776980590490f, 0.552065191384822350f, 0.551696585491195710f, + 0.551327959313262280f, + 0.550959312864576220f, 0.550590646158691240f, 0.550221959209161620f, + 0.549853252029543830f, + 0.549484524633393480f, 0.549115777034268170f, 0.548747009245725500f, + 0.548378221281323520f, + 0.548009413154622370f, 0.547640584879181100f, 0.547271736468561530f, + 0.546902867936324590f, + 0.546533979296032200f, 0.546165070561248080f, 0.545796141745535150f, + 0.545427192862458780f, + 0.545058223925583670f, 0.544689234948475210f, 0.544320225944701200f, + 0.543951196927828010f, + 0.543582147911424560f, 0.543213078909059120f, 0.542843989934301940f, + 0.542474881000723050f, + 0.542105752121893050f, 0.541736603311384620f, 0.541367434582769480f, + 0.540998245949621760f, + 0.540629037425515050f, 0.540259809024023600f, 0.539890560758723770f, + 0.539521292643190930f, + 0.539152004691002770f, 0.538782696915736770f, 0.538413369330970610f, + 0.538044021950284450f, + 0.537674654787257180f, 0.537305267855470390f, 0.536935861168504670f, + 0.536566434739941920f, + 0.536196988583365510f, 0.535827522712358230f, 0.535458037140505110f, + 0.535088531881390050f, + 0.534719006948599860f, 0.534349462355720230f, 0.533979898116337950f, + 0.533610314244041710f, + 0.533240710752419080f, 0.532871087655060300f, 0.532501444965554960f, + 0.532131782697493170f, + 0.531762100864467290f, 0.531392399480068670f, 0.531022678557890980f, + 0.530652938111527360f, + 0.530283178154571710f, 0.529913398700619820f, 0.529543599763266700f, + 0.529173781356109600f, + 0.528803943492745180f, 0.528434086186771010f, 0.528064209451786560f, + 0.527694313301390160f, + 0.527324397749182720f, 0.526954462808764120f, 0.526584508493736840f, + 0.526214534817702310f, + 0.525844541794263210f, 0.525474529437023890f, 0.525104497759587900f, + 0.524734446775560910f, + 0.524364376498548390f, 0.523994286942156220f, 0.523624178119992400f, + 0.523254050045663940f, + 0.522883902732780290f, 0.522513736194950230f, 0.522143550445783310f, + 0.521773345498891090f, + 0.521403121367884030f, 0.521032878066375100f, 0.520662615607976660f, + 0.520292334006301820f, + 0.519922033274965560f, 0.519551713427582000f, 0.519181374477767470f, + 0.518811016439137520f, + 0.518440639325310040f, 0.518070243149902240f, 0.517699827926532130f, + 0.517329393668819580f, + 0.516958940390383700f, 0.516588468104845820f, 0.516217976825826600f, + 0.515847466566947580f, + 0.515476937341832310f, 0.515106389164103120f, 0.514735822047384990f, + 0.514365236005302040f, + 0.513994631051479240f, 0.513624007199543600f, 0.513253364463121090f, + 0.512882702855839920f, + 0.512512022391327980f, 0.512141323083213470f, 0.511770604945127050f, + 0.511399867990697920f, + 0.511029112233557960f, 0.510658337687338040f, 0.510287544365671140f, + 0.509916732282189920f, + 0.509545901450527690f, 0.509175051884319660f, 0.508804183597200140f, + 0.508433296602805670f, + 0.508062390914772230f, 0.507691466546736580f, 0.507320523512337470f, + 0.506949561825212450f, + 0.506578581499001590f, 0.506207582547344550f, 0.505836564983881190f, + 0.505465528822253710f, + 0.505094474076103310f, 0.504723400759073290f, 0.504352308884806750f, + 0.503981198466947000f, + 0.503610069519139780f, 0.503238922055029400f, 0.502867756088262840f, + 0.502496571632486070f, + 0.502125368701347050f, 0.501754147308493770f, 0.501382907467574190f, + 0.501011649192238950f, + 0.500640372496137020f, 0.500269077392920150f, 0.499897763896239410f, + 0.499526432019746450f, + 0.499155081777094940f, 0.498783713181937540f, 0.498412326247929250f, + 0.498040920988724490f, + 0.497669497417978280f, 0.497298055549347750f, 0.496926595396488870f, + 0.496555116973059980f, + 0.496183620292718900f, 0.495812105369124070f, 0.495440572215935850f, + 0.495069020846813650f, + 0.494697451275419140f, 0.494325863515413130f, 0.493954257580458580f, + 0.493582633484217940f, + 0.493210991240354450f, 0.492839330862533120f, 0.492467652364417970f, + 0.492095955759675460f, + 0.491724241061971320f, 0.491352508284972070f, 0.490980757442346090f, + 0.490608988547760690f, + 0.490237201614885710f, 0.489865396657390210f, 0.489493573688943970f, + 0.489121732723218740f, + 0.488749873773885120f, 0.488377996854616250f, 0.488006101979084450f, + 0.487634189160962910f, + 0.487262258413926560f, 0.486890309751649490f, 0.486518343187807900f, + 0.486146358736077200f, + 0.485774356410135000f, 0.485402336223658360f, 0.485030298190324950f, + 0.484658242323814380f, + 0.484286168637805270f, 0.483914077145978560f, 0.483541967862014480f, + 0.483169840799594130f, + 0.482797695972400300f, 0.482425533394114920f, 0.482053353078422120f, + 0.481681155039005550f, + 0.481308939289549380f, 0.480936705843739820f, 0.480564454715261990f, + 0.480192185917803270f, + 0.479819899465050160f, 0.479447595370691370f, 0.479075273648415010f, + 0.478702934311909910f, + 0.478330577374866780f, 0.477958202850975230f, 0.477585810753927250f, + 0.477213401097414220f, + 0.476840973895128200f, 0.476468529160763100f, 0.476096066908011760f, + 0.475723587150569390f, + 0.475351089902130650f, 0.474978575176390750f, 0.474606042987046840f, + 0.474233493347795020f, + 0.473860926272333670f, 0.473488341774360670f, 0.473115739867574380f, + 0.472743120565675250f, + 0.472370483882362520f, 0.471997829831337810f, 0.471625158426301700f, + 0.471252469680957190f, + 0.470879763609006460f, 0.470507040224152460f, 0.470134299540099940f, + 0.469761541570552780f, + 0.469388766329217000f, 0.469015973829798090f, 0.468643164086002100f, + 0.468270337111537040f, + 0.467897492920109850f, 0.467524631525429830f, 0.467151752941205530f, + 0.466778857181146260f, + 0.466405944258963200f, 0.466033014188366350f, 0.465660066983068220f, + 0.465287102656780530f, + 0.464914121223215740f, 0.464541122696088100f, 0.464168107089110940f, + 0.463795074415999760f, + 0.463422024690469060f, 0.463048957926235630f, 0.462675874137015720f, + 0.462302773336526080f, + 0.461929655538485470f, 0.461556520756611410f, 0.461183369004623920f, + 0.460810200296242310f, + 0.460437014645186440f, 0.460063812065178160f, 0.459690592569938270f, + 0.459317356173189750f, + 0.458944102888655060f, 0.458570832730057170f, 0.458197545711121090f, + 0.457824241845570630f, + 0.457450921147131930f, 0.457077583629530550f, 0.456704229306492570f, + 0.456330858191746010f, + 0.455957470299017840f, 0.455584065642037350f, 0.455210644234532610f, + 0.454837206090234200f, + 0.454463751222871910f, 0.454090279646176210f, 0.453716791373879380f, + 0.453343286419712720f, + 0.452969764797409750f, 0.452596226520703360f, 0.452222671603327130f, + 0.451849100059016350f, + 0.451475511901505420f, 0.451101907144530910f, 0.450728285801828830f, + 0.450354647887135640f, + 0.449980993414189900f, 0.449607322396728900f, 0.449233634848492320f, + 0.448859930783219170f, + 0.448486210214649020f, 0.448112473156523420f, 0.447738719622582710f, + 0.447364949626569590f, + 0.446991163182225700f, 0.446617360303294910f, 0.446243541003520480f, + 0.445869705296646270f, + 0.445495853196417930f, 0.445121984716580210f, 0.444748099870879880f, + 0.444374198673063330f, + 0.444000281136877280f, 0.443626347276070590f, 0.443252397104390790f, + 0.442878430635587910f, + 0.442504447883411090f, 0.442130448861610240f, 0.441756433583937120f, + 0.441382402064142250f, + 0.441008354315978680f, 0.440634290353198510f, 0.440260210189554690f, + 0.439886113838801880f, + 0.439512001314693700f, 0.439137872630986080f, 0.438763727801433690f, + 0.438389566839793740f, + 0.438015389759822630f, 0.437641196575277220f, 0.437266987299916590f, + 0.436892761947498260f, + 0.436518520531782470f, 0.436144263066528480f, 0.435769989565496290f, + 0.435395700042447710f, + 0.435021394511143410f, 0.434647072985346380f, 0.434272735478819010f, + 0.433898382005324050f, + 0.433524012578626440f, 0.433149627212489670f, 0.432775225920679740f, + 0.432400808716961900f, + 0.432026375615101930f, 0.431651926628867530f, 0.431277461772025310f, + 0.430902981058344070f, + 0.430528484501591540f, 0.430153972115537800f, 0.429779443913952170f, + 0.429404899910604490f, + 0.429030340119266550f, 0.428655764553708960f, 0.428281173227704760f, + 0.427906566155026040f, + 0.427531943349445720f, 0.427157304824738350f, 0.426782650594677570f, + 0.426407980673039090f, + 0.426033295073598160f, 0.425658593810130330f, 0.425283876896413280f, + 0.424909144346223290f, + 0.424534396173339160f, 0.424159632391538870f, 0.423784853014600950f, + 0.423410058056305830f, + 0.423035247530432810f, 0.422660421450763490f, 0.422285579831078230f, + 0.421910722685159720f, + 0.421535850026790060f, 0.421160961869751720f, 0.420786058227829220f, + 0.420411139114805770f, + 0.420036204544466940f, 0.419661254530597550f, 0.419286289086983070f, + 0.418911308227410740f, + 0.418536311965666650f, 0.418161300315539220f, 0.417786273290816130f, + 0.417411230905285650f, + 0.417036173172737830f, 0.416661100106961610f, 0.416286011721748230f, + 0.415910908030888200f, + 0.415535789048172620f, 0.415160654787394280f, 0.414785505262345030f, + 0.414410340486818910f, + 0.414035160474608700f, 0.413659965239509710f, 0.413284754795316230f, + 0.412909529155823300f, + 0.412534288334827750f, 0.412159032346125280f, 0.411783761203513790f, + 0.411408474920790520f, + 0.411033173511753220f, 0.410657856990201580f, 0.410282525369933980f, + 0.409907178664751180f, + 0.409531816888453190f, 0.409156440054840590f, 0.408781048177715660f, + 0.408405641270879690f, + 0.408030219348136270f, 0.407654782423288010f, 0.407279330510138260f, + 0.406903863622492260f, + 0.406528381774153900f, 0.406152884978929480f, 0.405777373250624070f, + 0.405401846603045010f, + 0.405026305049998980f, 0.404650748605293040f, 0.404275177282736260f, + 0.403899591096136380f, + 0.403523990059303620f, 0.403148374186047210f, 0.402772743490177110f, + 0.402397097985504990f, + 0.402021437685841480f, 0.401645762604999350f, 0.401270072756790610f, + 0.400894368155027990f, + 0.400518648813525830f, 0.400142914746097480f, 0.399767165966558420f, + 0.399391402488723400f, + 0.399015624326407800f, 0.398639831493428740f, 0.398264024003602220f, + 0.397888201870746420f, + 0.397512365108678430f, 0.397136513731217500f, 0.396760647752182230f, + 0.396384767185391620f, + 0.396008872044666730f, 0.395632962343827170f, 0.395257038096694990f, + 0.394881099317091370f, + 0.394505146018838130f, 0.394129178215758820f, 0.393753195921675850f, + 0.393377199150413860f, + 0.393001187915796750f, 0.392625162231649010f, 0.392249122111796800f, + 0.391873067570065240f, + 0.391496998620281590f, 0.391120915276272410f, 0.390744817551864850f, + 0.390368705460887750f, + 0.389992579017168830f, 0.389616438234538010f, 0.389240283126824070f, + 0.388864113707858060f, + 0.388487929991470140f, 0.388111731991491180f, 0.387735519721753690f, + 0.387359293196089140f, + 0.386983052428331030f, 0.386606797432312350f, 0.386230528221866430f, + 0.385854244810828530f, + 0.385477947213032580f, 0.385101635442314900f, 0.384725309512510880f, + 0.384348969437456610f, + 0.383972615230989860f, 0.383596246906947210f, 0.383219864479167560f, + 0.382843467961488940f, + 0.382467057367749940f, 0.382090632711791060f, 0.381714194007451380f, + 0.381337741268572390f, + 0.380961274508994250f, 0.380584793742559550f, 0.380208298983109930f, + 0.379831790244487540f, + 0.379455267540536490f, 0.379078730885099520f, 0.378702180292021630f, + 0.378325615775147170f, + 0.377949037348320800f, 0.377572445025389230f, 0.377195838820197690f, + 0.376819218746593910f, + 0.376442584818424570f, 0.376065937049537060f, 0.375689275453780500f, + 0.375312600045002780f, + 0.374935910837054080f, 0.374559207843783660f, 0.374182491079041500f, + 0.373805760556679190f, + 0.373429016290547200f, 0.373052258294498230f, 0.372675486582383640f, + 0.372298701168057190f, + 0.371921902065371730f, 0.371545089288180640f, 0.371168262850339210f, + 0.370791422765701320f, + 0.370414569048123140f, 0.370037701711460170f, 0.369660820769568240f, + 0.369283926236305070f, + 0.368907018125527120f, 0.368530096451093140f, 0.368153161226860980f, + 0.367776212466689010f, + 0.367399250184437480f, 0.367022274393965340f, 0.366645285109133750f, + 0.366268282343803150f, + 0.365891266111834370f, 0.365514236427090080f, 0.365137193303431750f, + 0.364760136754723020f, + 0.364383066794826350f, 0.364005983437606320f, 0.363628886696926890f, + 0.363251776586652310f, + 0.362874653120648700f, 0.362497516312780990f, 0.362120366176916230f, + 0.361743202726920790f, + 0.361366025976661450f, 0.360988835940006750f, 0.360611632630824020f, + 0.360234416062982840f, + 0.359857186250351960f, 0.359479943206800550f, 0.359102686946199680f, + 0.358725417482419150f, + 0.358348134829330870f, 0.357970839000806010f, 0.357593530010716310f, + 0.357216207872935120f, + 0.356838872601334680f, 0.356461524209789380f, 0.356084162712172360f, + 0.355706788122359060f, + 0.355329400454223950f, 0.354951999721642100f, 0.354574585938490280f, + 0.354197159118644080f, + 0.353819719275981330f, 0.353442266424378930f, 0.353064800577714280f, + 0.352687321749866610f, + 0.352309829954713830f, 0.351932325206136210f, 0.351554807518012990f, + 0.351177276904224070f, + 0.350799733378650890f, 0.350422176955173910f, 0.350044607647675640f, + 0.349667025470037810f, + 0.349289430436142520f, 0.348911822559873850f, 0.348534201855114360f, + 0.348156568335749040f, + 0.347778922015661520f, 0.347401262908737570f, 0.347023591028862320f, + 0.346645906389921150f, + 0.346268209005801410f, 0.345890498890388980f, 0.345512776057572080f, + 0.345135040521238170f, + 0.344757292295274910f, 0.344379531393571970f, 0.344001757830017680f, + 0.343623971618502560f, + 0.343246172772916250f, 0.342868361307148980f, 0.342490537235092600f, + 0.342112700570637750f, + 0.341734851327677280f, 0.341356989520103240f, 0.340979115161808070f, + 0.340601228266685980f, + 0.340223328848629880f, 0.339845416921535030f, 0.339467492499295200f, + 0.339089555595806560f, + 0.338711606224964210f, 0.338333644400663940f, 0.337955670136803170f, + 0.337577683447278010f, + 0.337199684345986910f, 0.336821672846827290f, 0.336443648963697160f, + 0.336065612710496290f, + 0.335687564101123050f, 0.335309503149478110f, 0.334931429869461230f, + 0.334553344274972690f, + 0.334175246379914470f, 0.333797136198187240f, 0.333419013743693980f, + 0.333040879030336690f, + 0.332662732072017800f, 0.332284572882641680f, 0.331906401476111280f, + 0.331528217866331690f, + 0.331150022067206780f, 0.330771814092642610f, 0.330393593956544440f, + 0.330015361672817750f, + 0.329637117255370090f, 0.329258860718107450f, 0.328880592074938190f, + 0.328502311339769700f, + 0.328124018526509800f, 0.327745713649068180f, 0.327367396721353070f, + 0.326989067757275040f, + 0.326610726770743760f, 0.326232373775669270f, 0.325854008785963320f, + 0.325475631815536570f, + 0.325097242878301660f, 0.324718841988170470f, 0.324340429159055250f, + 0.323962004404870050f, + 0.323583567739527570f, 0.323205119176942720f, 0.322826658731029110f, + 0.322448186415702550f, + 0.322069702244877910f, 0.321691206232470550f, 0.321312698392397570f, + 0.320934178738574720f, + 0.320555647284919980f, 0.320177104045350440f, 0.319798549033783570f, + 0.319419982264138650f, + 0.319041403750333630f, 0.318662813506288670f, 0.318284211545923010f, + 0.317905597883156250f, + 0.317526972531909870f, 0.317148335506103940f, 0.316769686819660780f, + 0.316391026486501690f, + 0.316012354520548600f, 0.315633670935725030f, 0.315254975745953180f, + 0.314876268965157470f, + 0.314497550607261090f, 0.314118820686189180f, 0.313740079215866160f, + 0.313361326210216840f, + 0.312982561683167790f, 0.312603785648644220f, 0.312224998120573420f, + 0.311846199112882030f, + 0.311467388639496860f, 0.311088566714346650f, 0.310709733351358600f, + 0.310330888564462340f, + 0.309952032367586390f, 0.309573164774659850f, 0.309194285799613390f, + 0.308815395456376430f, + 0.308436493758880660f, 0.308057580721056660f, 0.307678656356835560f, + 0.307299720680150270f, + 0.306920773704932260f, 0.306541815445115160f, 0.306162845914631390f, + 0.305783865127415400f, + 0.305404873097400780f, 0.305025869838521590f, 0.304646855364713530f, + 0.304267829689911010f, + 0.303888792828050650f, 0.303509744793068030f, 0.303130685598899270f, + 0.302751615259482190f, + 0.302372533788753170f, 0.301993441200650910f, 0.301614337509113100f, + 0.301235222728077840f, + 0.300856096871485010f, 0.300476959953273060f, 0.300097811987382670f, + 0.299718652987753580f, + 0.299339482968325970f, 0.298960301943041680f, 0.298581109925841300f, + 0.298201906930667390f, + 0.297822692971461410f, 0.297443468062166820f, 0.297064232216726120f, + 0.296684985449082390f, + 0.296305727773180260f, 0.295926459202963120f, 0.295547179752376430f, + 0.295167889435364820f, + 0.294788588265873170f, 0.294409276257848300f, 0.294029953425235520f, + 0.293650619781982260f, + 0.293271275342035120f, 0.292891920119341120f, 0.292512554127848930f, + 0.292133177381505850f, + 0.291753789894261320f, 0.291374391680063520f, 0.290994982752862730f, + 0.290615563126608250f, + 0.290236132815249790f, 0.289856691832738880f, 0.289477240193025510f, + 0.289097777910061970f, + 0.288718304997799550f, 0.288338821470189910f, 0.287959327341186510f, + 0.287579822624741350f, + 0.287200307334808670f, 0.286820781485341620f, 0.286441245090293950f, + 0.286061698163620930f, + 0.285682140719276560f, 0.285302572771216960f, 0.284922994333397350f, + 0.284543405419773240f, + 0.284163806044301910f, 0.283784196220939370f, 0.283404575963643550f, + 0.283024945286371230f, + 0.282645304203081090f, 0.282265652727731130f, 0.281885990874279570f, + 0.281506318656686290f, + 0.281126636088910030f, 0.280746943184911340f, 0.280367239958650150f, + 0.279987526424086530f, + 0.279607802595182420f, 0.279228068485898210f, 0.278848324110196550f, + 0.278468569482039130f, + 0.278088804615388040f, 0.277709029524206950f, 0.277329244222458250f, + 0.276949448724106480f, + 0.276569643043115150f, 0.276189827193448200f, 0.275810001189071290f, + 0.275430165043948570f, + 0.275050318772046500f, 0.274670462387330010f, 0.274290595903766200f, + 0.273910719335321300f, + 0.273530832695961790f, 0.273150935999655950f, 0.272771029260370560f, + 0.272391112492074590f, + 0.272011185708736060f, 0.271631248924323390f, 0.271251302152806570f, + 0.270871345408154380f, + 0.270491378704337540f, 0.270111402055325910f, 0.269731415475089780f, + 0.269351418977600950f, + 0.268971412576829990f, 0.268591396286749500f, 0.268211370121331170f, + 0.267831334094547010f, + 0.267451288220370730f, 0.267071232512774700f, 0.266691166985733360f, + 0.266311091653219700f, + 0.265931006529208920f, 0.265550911627675250f, 0.265170806962593210f, + 0.264790692547939020f, + 0.264410568397687560f, 0.264030434525815760f, 0.263650290946299660f, + 0.263270137673115630f, + 0.262889974720241610f, 0.262509802101654310f, 0.262129619831332370f, + 0.261749427923253670f, + 0.261369226391396310f, 0.260989015249740050f, 0.260608794512263380f, + 0.260228564192946710f, + 0.259848324305769600f, 0.259468074864711960f, 0.259087815883755400f, + 0.258707547376880010f, + 0.258327269358068100f, 0.257946981841300490f, 0.257566684840560170f, + 0.257186378369829110f, + 0.256806062443089680f, 0.256425737074325920f, 0.256045402277520320f, + 0.255665058066657680f, + 0.255284704455721660f, 0.254904341458696390f, 0.254523969089567590f, + 0.254143587362319620f, + 0.253763196290938850f, 0.253382795889410710f, 0.253002386171721110f, + 0.252621967151857420f, + 0.252241538843805680f, 0.251861101261554090f, 0.251480654419089730f, + 0.251100198330400150f, + 0.250719733009474530f, 0.250339258470300590f, 0.249958774726868170f, + 0.249578281793165680f, + 0.249197779683183660f, 0.248817268410911650f, 0.248436747990339490f, + 0.248056218435458720f, + 0.247675679760259450f, 0.247295131978733870f, 0.246914575104873220f, + 0.246534009152669040f, + 0.246153434136114490f, 0.245772850069201410f, 0.245392256965923620f, + 0.245011654840274010f, + 0.244631043706245800f, 0.244250423577833860f, 0.243869794469031620f, + 0.243489156393834590f, + 0.243108509366237320f, 0.242727853400234670f, 0.242347188509823150f, + 0.241966514708997830f, + 0.241585832011755900f, 0.241205140432093070f, 0.240824439984007180f, + 0.240443730681495050f, + 0.240063012538553830f, 0.239682285569182310f, 0.239301549787377890f, + 0.238920805207139960f, + 0.238540051842467020f, 0.238159289707357810f, 0.237778518815812740f, + 0.237397739181830820f, + 0.237016950819413100f, 0.236636153742559610f, 0.236255347965270780f, + 0.235874533501548580f, + 0.235493710365393630f, 0.235112878570808560f, 0.234732038131795020f, + 0.234351189062355030f, + 0.233970331376492150f, 0.233589465088208580f, 0.233208590211508550f, + 0.232827706760394850f, + 0.232446814748872410f, 0.232065914190945020f, 0.231685005100616930f, + 0.231304087491893930f, + 0.230923161378780380f, 0.230542226775282770f, 0.230161283695406500f, + 0.229780332153157300f, + 0.229399372162542610f, 0.229018403737568290f, 0.228637426892242400f, + 0.228256441640571880f, + 0.227875447996564060f, 0.227494445974227850f, 0.227113435587570770f, + 0.226732416850602300f, + 0.226351389777330990f, 0.225970354381765690f, 0.225589310677916880f, + 0.225208258679793520f, + 0.224827198401406690f, 0.224446129856766040f, 0.224065053059883250f, + 0.223683968024768950f, + 0.223302874765434120f, 0.222921773295891380f, 0.222540663630151820f, + 0.222159545782228660f, + 0.221778419766134050f, 0.221397285595880480f, 0.221016143285482050f, + 0.220634992848951380f, + 0.220253834300303180f, 0.219872667653551100f, 0.219491492922709110f, + 0.219110310121792800f, + 0.218729119264816280f, 0.218347920365795780f, 0.217966713438746380f, + 0.217585498497683580f, + 0.217204275556624420f, 0.216823044629584520f, 0.216441805730581500f, + 0.216060558873631570f, + 0.215679304072752960f, 0.215298041341962870f, 0.214916770695278810f, + 0.214535492146719880f, + 0.214154205710303750f, 0.213772911400050090f, 0.213391609229977570f, + 0.213010299214105140f, + 0.212628981366453330f, 0.212247655701041290f, 0.211866322231890090f, + 0.211484980973019880f, + 0.211103631938451000f, 0.210722275142205480f, 0.210340910598303870f, + 0.209959538320768660f, + 0.209578158323621420f, 0.209196770620883960f, 0.208815375226579670f, + 0.208433972154730530f, + 0.208052561419360520f, 0.207671143034492080f, 0.207289717014149830f, + 0.206908283372357230f, + 0.206526842123138070f, 0.206145393280517730f, 0.205763936858520150f, + 0.205382472871171230f, + 0.205001001332495910f, 0.204619522256519300f, 0.204238035657268250f, + 0.203856541548768030f, + 0.203475039945045950f, 0.203093530860128300f, 0.202712014308041620f, + 0.202330490302814110f, + 0.201948958858472420f, 0.201567419989045200f, 0.201185873708560170f, + 0.200804320031045230f, + 0.200422758970529910f, 0.200041190541042220f, 0.199659614756612230f, + 0.199278031631268500f, + 0.198896441179041650f, 0.198514843413961220f, 0.198133238350057030f, + 0.197751626001360480f, + 0.197370006381901520f, 0.196988379505712050f, 0.196606745386822960f, + 0.196225104039265410f, + 0.195843455477072190f, 0.195461799714274460f, 0.195080136764905570f, + 0.194698466642997730f, + 0.194316789362583340f, 0.193935104937696560f, 0.193553413382369890f, + 0.193171714710637930f, + 0.192790008936534220f, 0.192408296074092570f, 0.192026576137348330f, + 0.191644849140335360f, + 0.191263115097089540f, 0.190881374021645320f, 0.190499625928039040f, + 0.190117870830306100f, + 0.189736108742482030f, 0.189354339678604100f, 0.188972563652707950f, + 0.188590780678831250f, + 0.188208990771010640f, 0.187827193943283040f, 0.187445390209686870f, + 0.187063579584259070f, + 0.186681762081038650f, 0.186299937714063470f, 0.185918106497371700f, + 0.185536268445003070f, + 0.185154423570995760f, 0.184772571889390000f, 0.184390713414225000f, + 0.184008848159540110f, + 0.183626976139376310f, 0.183245097367773090f, 0.182863211858771880f, + 0.182481319626412670f, + 0.182099420684737420f, 0.181717515047787020f, 0.181335602729602590f, + 0.180953683744226880f, + 0.180571758105701030f, 0.180189825828068250f, 0.179807886925370670f, + 0.179425941411650660f, + 0.179043989300952110f, 0.178662030607317450f, 0.178280065344791100f, + 0.177898093527416370f, + 0.177516115169236820f, 0.177134130284297610f, 0.176752138886642350f, + 0.176370140990316640f, + 0.175988136609365020f, 0.175606125757832240f, 0.175224108449764660f, + 0.174842084699207030f, + 0.174460054520206240f, 0.174078017926807490f, 0.173695974933058080f, + 0.173313925553004180f, + 0.172931869800692250f, 0.172549807690170230f, 0.172167739235484620f, + 0.171785664450683800f, + 0.171403583349815180f, 0.171021495946926340f, 0.170639402256066410f, + 0.170257302291283000f, + 0.169875196066625710f, 0.169493083596143100f, 0.169110964893883830f, + 0.168728839973898290f, + 0.168346708850235140f, 0.167964571536945220f, 0.167582428048078130f, + 0.167200278397683750f, + 0.166818122599813570f, 0.166435960668517400f, 0.166053792617847200f, + 0.165671618461853270f, + 0.165289438214587970f, 0.164907251890102520f, 0.164525059502448390f, + 0.164142861065678550f, + 0.163760656593844480f, 0.163378446100999640f, 0.162996229601196390f, + 0.162614007108487250f, + 0.162231778636926370f, 0.161849544200566300f, 0.161467303813461580f, + 0.161085057489665670f, + 0.160702805243232240f, 0.160320547088216470f, 0.159938283038672050f, + 0.159556013108654580f, + 0.159173737312218650f, 0.158791455663418930f, 0.158409168176311760f, + 0.158026874864951870f, + 0.157644575743395960f, 0.157262270825699210f, 0.156879960125918730f, + 0.156497643658110590f, + 0.156115321436331000f, 0.155732993474637760f, 0.155350659787087090f, + 0.154968320387737170f, + 0.154585975290645110f, 0.154203624509868190f, 0.153821268059465250f, + 0.153438905953493550f, + 0.153056538206012340f, 0.152674164831079730f, 0.152291785842754070f, + 0.151909401255095250f, + 0.151527011082161540f, 0.151144615338013210f, 0.150762214036709470f, + 0.150379807192309620f, + 0.149997394818874590f, 0.149614976930463660f, 0.149232553541138180f, + 0.148850124664957870f, + 0.148467690315984390f, 0.148085250508278370f, 0.147702805255900570f, + 0.147320354572913260f, + 0.146937898473377210f, 0.146555436971355090f, 0.146172970080908520f, + 0.145790497816099230f, + 0.145408020190990560f, 0.145025537219644170f, 0.144643048916123810f, + 0.144260555294492000f, + 0.143878056368811510f, 0.143495552153146630f, 0.143113042661560050f, + 0.142730527908116440f, + 0.142348007906879320f, 0.141965482671912420f, 0.141582952217280980f, + 0.141200416557048680f, + 0.140817875705281120f, 0.140435329676042390f, 0.140052778483398480f, + 0.139670222141414250f, + 0.139287660664154770f, 0.138905094065686600f, 0.138522522360074780f, + 0.138139945561386200f, + 0.137757363683686740f, 0.137374776741042340f, 0.136992184747520560f, + 0.136609587717187310f, + 0.136226985664110460f, 0.135844378602356760f, 0.135461766545993150f, + 0.135079149509088060f, + 0.134696527505708320f, 0.134313900549922760f, 0.133931268655799020f, + 0.133548631837404950f, + 0.133165990108809860f, 0.132783343484081580f, 0.132400691977289760f, + 0.132018035602502530f, + 0.131635374373789940f, 0.131252708305220960f, 0.130870037410864640f, + 0.130487361704791580f, + 0.130104681201070800f, 0.129721995913773260f, 0.129339305856968730f, + 0.128956611044727220f, + 0.128573911491120210f, 0.128191207210217570f, 0.127808498216091110f, + 0.127425784522811530f, + 0.127043066144449680f, 0.126660343095077900f, 0.126277615388766920f, + 0.125894883039589430f, + 0.125512146061616980f, 0.125129404468921260f, 0.124746658275575490f, + 0.124363907495651240f, + 0.123981152143222060f, 0.123598392232359880f, 0.123215627777138580f, + 0.122832858791630880f, + 0.122450085289909640f, 0.122067307286049230f, 0.121684524794122440f, + 0.121301737828203960f, + 0.120918946402367330f, 0.120536150530686250f, 0.120153350227235940f, + 0.119770545506089950f, + 0.119387736381323830f, 0.119004922867011920f, 0.118622104977228730f, + 0.118239282726050290f, + 0.117856456127550970f, 0.117473625195807100f, 0.117090789944893860f, + 0.116707950388886520f, + 0.116325106541861910f, 0.115942258417895240f, 0.115559406031063570f, + 0.115176549395442460f, + 0.114793688525109290f, 0.114410823434140360f, 0.114027954136612060f, + 0.113645080646602280f, + 0.113262202978187320f, 0.112879321145445350f, 0.112496435162453430f, + 0.112113545043288730f, + 0.111730650802029900f, 0.111347752452754000f, 0.110964850009539970f, + 0.110581943486465610f, + 0.110199032897608850f, 0.109816118257049110f, 0.109433199578864170f, + 0.109050276877133770f, + 0.108667350165936400f, 0.108284419459350770f, 0.107901484771457020f, + 0.107518546116333660f, + 0.107135603508061170f, 0.106752656960718350f, 0.106369706488385940f, + 0.105986752105143480f, + 0.105603793825070680f, 0.105220831662248700f, 0.104837865630757090f, + 0.104454895744677270f, + 0.104071922018089540f, 0.103688944465074300f, 0.103305963099713400f, + 0.102922977936087120f, + 0.102539988988277600f, 0.102156996270365800f, 0.101773999796432830f, + 0.101390999580561250f, + 0.101007995636832020f, 0.100624987979327970f, 0.100241976622130760f, + 0.099858961579322170f, + 0.099475942864985456f, 0.099092920493202258f, 0.098709894478056073f, + 0.098326864833628791f, + 0.097943831574004214f, 0.097560794713264939f, 0.097177754265493674f, + 0.096794710244774623f, + 0.096411662665190329f, 0.096028611540825232f, 0.095645556885762609f, + 0.095262498714085819f, + 0.094879437039879722f, 0.094496371877227495f, 0.094113303240214247f, + 0.093730231142923864f, + 0.093347155599440373f, 0.092964076623849271f, 0.092580994230234359f, + 0.092197908432681386f, + 0.091814819245274432f, 0.091431726682099479f, 0.091048630757241303f, + 0.090665531484784803f, + 0.090282428878816323f, 0.089899322953420582f, 0.089516213722684160f, + 0.089133101200692441f, + 0.088749985401530951f, 0.088366866339286629f, 0.087983744028044805f, + 0.087600618481892656f, + 0.087217489714916191f, 0.086834357741201490f, 0.086451222574836131f, + 0.086068084229906014f, + 0.085684942720498897f, 0.085301798060701386f, 0.084918650264600160f, + 0.084535499346283349f, + 0.084152345319837438f, 0.083769188199350780f, 0.083386027998910095f, + 0.083002864732603973f, + 0.082619698414519799f, 0.082236529058745025f, 0.081853356679368619f, + 0.081470181290477811f, + 0.081087002906161790f, 0.080703821540508452f, 0.080320637207605849f, + 0.079937449921543474f, + 0.079554259696409127f, 0.079171066546292510f, 0.078787870485282088f, + 0.078404671527466441f, + 0.078021469686935602f, 0.077638264977777913f, 0.077255057414083589f, + 0.076871847009941652f, + 0.076488633779441206f, 0.076105417736672773f, 0.075722198895725248f, + 0.075338977270689375f, + 0.074955752875654230f, 0.074572525724710764f, 0.074189295831948693f, + 0.073806063211457842f, + 0.073422827877329483f, 0.073039589843653177f, 0.072656349124520389f, + 0.072273105734021334f, + 0.071889859686246352f, 0.071506610995287156f, 0.071123359675233852f, + 0.070740105740178361f, + 0.070356849204211397f, 0.069973590081423773f, 0.069590328385907715f, + 0.069207064131753759f, + 0.068823797333054326f, 0.068440528003900616f, 0.068057256158383886f, + 0.067673981810596848f, + 0.067290704974630494f, 0.066907425664577733f, 0.066524143894529736f, + 0.066140859678579578f, + 0.065757573030819083f, 0.065374283965340146f, 0.064990992496236119f, + 0.064607698637598646f, + 0.064224402403521202f, 0.063841103808096086f, 0.063457802865415636f, + 0.063074499589573618f, + 0.062691193994662109f, 0.062307886094775049f, 0.061924575904005130f, + 0.061541263436445129f, + 0.061157948706189229f, 0.060774631727329942f, 0.060391312513961619f, + 0.060007991080177375f, + 0.059624667440070382f, 0.059241341607735261f, 0.058858013597264912f, + 0.058474683422754095f, + 0.058091351098295878f, 0.057708016637985186f, 0.057324680055915692f, + 0.056941341366181127f, + 0.056558000582876661f, 0.056174657720095743f, 0.055791312791933681f, + 0.055407965812484541f, + 0.055024616795842439f, 0.054641265756102911f, 0.054257912707359794f, + 0.053874557663708772f, + 0.053491200639244271f, 0.053107841648060788f, 0.052724480704254229f, + 0.052341117821918783f, + 0.051957753015150501f, 0.051574386298044173f, 0.051191017684694640f, + 0.050807647189198162f, + 0.050424274825649297f, 0.050040900608144430f, 0.049657524550778251f, + 0.049274146667647289f, + 0.048890766972846805f, 0.048507385480472134f, 0.048124002204620014f, + 0.047740617159385448f, + 0.047357230358865306f, 0.046973841817155179f, 0.046590451548350717f, + 0.046207059566548990f, + 0.045823665885845313f, 0.045440270520336883f, 0.045056873484119603f, + 0.044673474791289434f, + 0.044290074455943754f, 0.043906672492178188f, 0.043523268914090238f, + 0.043139863735776100f, + 0.042756456971332048f, 0.042373048634855741f, 0.041989638740443119f, + 0.041606227302191955f, + 0.041222814334198304f, 0.040839399850560058f, 0.040455983865373815f, + 0.040072566392736257f, + 0.039689147446745419f, 0.039305727041497644f, 0.038922305191091085f, + 0.038538881909622631f, + 0.038155457211189216f, 0.037772031109889144f, 0.037388603619819022f, + 0.037005174755077273f, + 0.036621744529761024f, 0.036238312957967478f, 0.035854880053795196f, + 0.035471445831341021f, + 0.035088010304703626f, 0.034704573487980395f, 0.034321135395268765f, + 0.033937696040667535f, + 0.033554255438273790f, 0.033170813602186440f, 0.032787370546502645f, + 0.032403926285321405f, + 0.032020480832740429f, 0.031637034202857461f, 0.031253586409771626f, + 0.030870137467580314f, + 0.030486687390382738f, 0.030103236192276818f, 0.029719783887360508f, + 0.029336330489733147f, + 0.028952876013492331f, 0.028569420472737472f, 0.028185963881566689f, + 0.027802506254078142f, + 0.027419047604371360f, 0.027035587946544135f, 0.026652127294696067f, + 0.026268665662925468f, + 0.025885203065330677f, 0.025501739516011413f, 0.025118275029065638f, + 0.024734809618593138f, + 0.024351343298691951f, 0.023967876083461924f, 0.023584407987001611f, + 0.023200939023409587f, + 0.022817469206785804f, 0.022433998551228459f, 0.022050527070837558f, + 0.021667054779711814f, + 0.021283581691949955f, 0.020900107821652084f, 0.020516633182916549f, + 0.020133157789843505f, + 0.019749681656531803f, 0.019366204797080316f, 0.018982727225589285f, + 0.018599248956157190f, + 0.018215770002884327f, 0.017832290379869671f, 0.017448810101212228f, + 0.017065329181012358f, + 0.016681847633368677f, 0.016298365472381587f, 0.015914882712149747f, + 0.015531399366773606f, + 0.015147915450352307f, 0.014764430976985016f, 0.014380945960772247f, + 0.013997460415812761f, + 0.013613974356207112f, 0.013230487796054543f, 0.012847000749454314f, + 0.012463513230507034f, + 0.012080025253311559f, 0.011696536831968529f, 0.011313047980577277f, + 0.010929558713237145f, + 0.010546069044048827f, 0.010162578987111254f, 0.009779088556525145f, + 0.009395597766389905f, + 0.009012106630804949f, 0.008628615163871038f, 0.008245123379687167f, + 0.007861631292354124f, + 0.007478138915970929f, 0.007094646264638386f, 0.006711153352455981f, + 0.006327660193523208f, + 0.005944166801940901f, 0.005560673191808128f, 0.005177179377225743f, + 0.004793685372293270f, + 0.004410191191110246f, 0.004026696847777542f, 0.003643202356394263f, + 0.003259707731061291f, + 0.002876212985878184f, 0.002492718134944503f, 0.002109223192361147f, + 0.001725728172227238f, + 0.001342233088643682f, 0.000958737955710053f, 0.000575242787525925f, + 0.000191747598192208f +}; + #endif + +/** + @brief Weights Table + */ + +/** + @par + Weights tables are generated using the formula :
weights[n] = e^(-j*n*pi/(2*N))
+ @par + C command to generate the table +
+  for(i = 0; i< N; i++)
+  { 
+    weights[(2*i)]   =  cos(i*c);
+    weights[(2*i)+1] = -sin(i*c);
+  } 
+ @par + where N is the Number of weights to be calculated and c is pi/(2*N) + @par + Converted the output to q15 format by multiplying with 2^31 and saturated if required. + @par + In the tables below the real and imaginary values are placed alternatively, hence the + array length is 2*N. + */ + +/** + @par + cosFactor tables are generated using the formula :
 cos_factors[n] = 2 * cos((2n+1)*pi/(4*N)) 
+ @par + C command to generate the table +
+  for (i = 0; i< N; i++)
+  {
+    cos_factors[i] = 2 * cos((2*i+1)*c/2);
+  } 
+ @par + where N is the number of factors to generate and c is pi/(2*N) + @par + Then converted to q15 format by multiplying with 2^31 and saturated if required. +*/ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_128) + const q15_t __ALIGNED(4) WeightsQ15_128[256] = { + (q15_t)0x7fff, (q15_t)0x0, (q15_t)0x7ffd, (q15_t)0xfe6e, (q15_t)0x7ff6, (q15_t)0xfcdc, (q15_t)0x7fe9, (q15_t)0xfb4a, + (q15_t)0x7fd8, (q15_t)0xf9b9, (q15_t)0x7fc2, (q15_t)0xf827, (q15_t)0x7fa7, (q15_t)0xf696, (q15_t)0x7f87, (q15_t)0xf505, + (q15_t)0x7f62, (q15_t)0xf375, (q15_t)0x7f38, (q15_t)0xf1e5, (q15_t)0x7f09, (q15_t)0xf055, (q15_t)0x7ed5, (q15_t)0xeec7, + (q15_t)0x7e9d, (q15_t)0xed38, (q15_t)0x7e5f, (q15_t)0xebab, (q15_t)0x7e1d, (q15_t)0xea1e, (q15_t)0x7dd6, (q15_t)0xe893, + (q15_t)0x7d8a, (q15_t)0xe708, (q15_t)0x7d39, (q15_t)0xe57e, (q15_t)0x7ce3, (q15_t)0xe3f5, (q15_t)0x7c89, (q15_t)0xe26d, + (q15_t)0x7c29, (q15_t)0xe0e7, (q15_t)0x7bc5, (q15_t)0xdf61, (q15_t)0x7b5d, (q15_t)0xdddd, (q15_t)0x7aef, (q15_t)0xdc5a, + (q15_t)0x7a7d, (q15_t)0xdad8, (q15_t)0x7a05, (q15_t)0xd958, (q15_t)0x798a, (q15_t)0xd7da, (q15_t)0x7909, (q15_t)0xd65d, + (q15_t)0x7884, (q15_t)0xd4e1, (q15_t)0x77fa, (q15_t)0xd368, (q15_t)0x776c, (q15_t)0xd1ef, (q15_t)0x76d9, (q15_t)0xd079, + (q15_t)0x7641, (q15_t)0xcf05, (q15_t)0x75a5, (q15_t)0xcd92, (q15_t)0x7504, (q15_t)0xcc22, (q15_t)0x745f, (q15_t)0xcab3, + (q15_t)0x73b5, (q15_t)0xc946, (q15_t)0x7307, (q15_t)0xc7dc, (q15_t)0x7255, (q15_t)0xc674, (q15_t)0x719e, (q15_t)0xc50e, + (q15_t)0x70e2, (q15_t)0xc3aa, (q15_t)0x7023, (q15_t)0xc248, (q15_t)0x6f5f, (q15_t)0xc0e9, (q15_t)0x6e96, (q15_t)0xbf8d, + (q15_t)0x6dca, (q15_t)0xbe32, (q15_t)0x6cf9, (q15_t)0xbcdb, (q15_t)0x6c24, (q15_t)0xbb86, (q15_t)0x6b4a, (q15_t)0xba33, + (q15_t)0x6a6d, (q15_t)0xb8e4, (q15_t)0x698c, (q15_t)0xb797, (q15_t)0x68a6, (q15_t)0xb64c, (q15_t)0x67bd, (q15_t)0xb505, + (q15_t)0x66cf, (q15_t)0xb3c1, (q15_t)0x65dd, (q15_t)0xb27f, (q15_t)0x64e8, (q15_t)0xb141, (q15_t)0x63ef, (q15_t)0xb005, + (q15_t)0x62f2, (q15_t)0xaecd, (q15_t)0x61f1, (q15_t)0xad97, (q15_t)0x60ec, (q15_t)0xac65, (q15_t)0x5fe3, (q15_t)0xab36, + (q15_t)0x5ed7, (q15_t)0xaa0b, (q15_t)0x5dc7, (q15_t)0xa8e3, (q15_t)0x5cb4, (q15_t)0xa7be, (q15_t)0x5b9d, (q15_t)0xa69c, + (q15_t)0x5a82, (q15_t)0xa57e, (q15_t)0x5964, (q15_t)0xa463, (q15_t)0x5842, (q15_t)0xa34c, (q15_t)0x571d, (q15_t)0xa239, + (q15_t)0x55f5, (q15_t)0xa129, (q15_t)0x54ca, (q15_t)0xa01d, (q15_t)0x539b, (q15_t)0x9f14, (q15_t)0x5269, (q15_t)0x9e0f, + (q15_t)0x5133, (q15_t)0x9d0e, (q15_t)0x4ffb, (q15_t)0x9c11, (q15_t)0x4ebf, (q15_t)0x9b18, (q15_t)0x4d81, (q15_t)0x9a23, + (q15_t)0x4c3f, (q15_t)0x9931, (q15_t)0x4afb, (q15_t)0x9843, (q15_t)0x49b4, (q15_t)0x975a, (q15_t)0x4869, (q15_t)0x9674, + (q15_t)0x471c, (q15_t)0x9593, (q15_t)0x45cd, (q15_t)0x94b6, (q15_t)0x447a, (q15_t)0x93dc, (q15_t)0x4325, (q15_t)0x9307, + (q15_t)0x41ce, (q15_t)0x9236, (q15_t)0x4073, (q15_t)0x916a, (q15_t)0x3f17, (q15_t)0x90a1, (q15_t)0x3db8, (q15_t)0x8fdd, + (q15_t)0x3c56, (q15_t)0x8f1e, (q15_t)0x3af2, (q15_t)0x8e62, (q15_t)0x398c, (q15_t)0x8dab, (q15_t)0x3824, (q15_t)0x8cf9, + (q15_t)0x36ba, (q15_t)0x8c4b, (q15_t)0x354d, (q15_t)0x8ba1, (q15_t)0x33de, (q15_t)0x8afc, (q15_t)0x326e, (q15_t)0x8a5b, + (q15_t)0x30fb, (q15_t)0x89bf, (q15_t)0x2f87, (q15_t)0x8927, (q15_t)0x2e11, (q15_t)0x8894, (q15_t)0x2c98, (q15_t)0x8806, + (q15_t)0x2b1f, (q15_t)0x877c, (q15_t)0x29a3, (q15_t)0x86f7, (q15_t)0x2826, (q15_t)0x8676, (q15_t)0x26a8, (q15_t)0x85fb, + (q15_t)0x2528, (q15_t)0x8583, (q15_t)0x23a6, (q15_t)0x8511, (q15_t)0x2223, (q15_t)0x84a3, (q15_t)0x209f, (q15_t)0x843b, + (q15_t)0x1f19, (q15_t)0x83d7, (q15_t)0x1d93, (q15_t)0x8377, (q15_t)0x1c0b, (q15_t)0x831d, (q15_t)0x1a82, (q15_t)0x82c7, + (q15_t)0x18f8, (q15_t)0x8276, (q15_t)0x176d, (q15_t)0x822a, (q15_t)0x15e2, (q15_t)0x81e3, (q15_t)0x1455, (q15_t)0x81a1, + (q15_t)0x12c8, (q15_t)0x8163, (q15_t)0x1139, (q15_t)0x812b, (q15_t)0xfab, (q15_t)0x80f7, (q15_t)0xe1b, (q15_t)0x80c8, + (q15_t)0xc8b, (q15_t)0x809e, (q15_t)0xafb, (q15_t)0x8079, (q15_t)0x96a, (q15_t)0x8059, (q15_t)0x7d9, (q15_t)0x803e, + (q15_t)0x647, (q15_t)0x8028, (q15_t)0x4b6, (q15_t)0x8017, (q15_t)0x324, (q15_t)0x800a, (q15_t)0x192, (q15_t)0x8003 +}; + const q15_t __ALIGNED(4) cos_factorsQ15_128[128] = { + (q15_t)0x7fff, (q15_t)0x7ffa, (q15_t)0x7ff0, (q15_t)0x7fe1, (q15_t)0x7fce, (q15_t)0x7fb5, (q15_t)0x7f97, (q15_t)0x7f75, + (q15_t)0x7f4d, (q15_t)0x7f21, (q15_t)0x7ef0, (q15_t)0x7eba, (q15_t)0x7e7f, (q15_t)0x7e3f, (q15_t)0x7dfa, (q15_t)0x7db0, + (q15_t)0x7d62, (q15_t)0x7d0f, (q15_t)0x7cb7, (q15_t)0x7c5a, (q15_t)0x7bf8, (q15_t)0x7b92, (q15_t)0x7b26, (q15_t)0x7ab6, + (q15_t)0x7a42, (q15_t)0x79c8, (q15_t)0x794a, (q15_t)0x78c7, (q15_t)0x7840, (q15_t)0x77b4, (q15_t)0x7723, (q15_t)0x768e, + (q15_t)0x75f4, (q15_t)0x7555, (q15_t)0x74b2, (q15_t)0x740b, (q15_t)0x735f, (q15_t)0x72af, (q15_t)0x71fa, (q15_t)0x7141, + (q15_t)0x7083, (q15_t)0x6fc1, (q15_t)0x6efb, (q15_t)0x6e30, (q15_t)0x6d62, (q15_t)0x6c8f, (q15_t)0x6bb8, (q15_t)0x6adc, + (q15_t)0x69fd, (q15_t)0x6919, (q15_t)0x6832, (q15_t)0x6746, (q15_t)0x6657, (q15_t)0x6563, (q15_t)0x646c, (q15_t)0x6371, + (q15_t)0x6271, (q15_t)0x616f, (q15_t)0x6068, (q15_t)0x5f5e, (q15_t)0x5e50, (q15_t)0x5d3e, (q15_t)0x5c29, (q15_t)0x5b10, + (q15_t)0x59f3, (q15_t)0x58d4, (q15_t)0x57b0, (q15_t)0x568a, (q15_t)0x5560, (q15_t)0x5433, (q15_t)0x5302, (q15_t)0x51ce, + (q15_t)0x5097, (q15_t)0x4f5e, (q15_t)0x4e21, (q15_t)0x4ce1, (q15_t)0x4b9e, (q15_t)0x4a58, (q15_t)0x490f, (q15_t)0x47c3, + (q15_t)0x4675, (q15_t)0x4524, (q15_t)0x43d0, (q15_t)0x427a, (q15_t)0x4121, (q15_t)0x3fc5, (q15_t)0x3e68, (q15_t)0x3d07, + (q15_t)0x3ba5, (q15_t)0x3a40, (q15_t)0x38d8, (q15_t)0x376f, (q15_t)0x3604, (q15_t)0x3496, (q15_t)0x3326, (q15_t)0x31b5, + (q15_t)0x3041, (q15_t)0x2ecc, (q15_t)0x2d55, (q15_t)0x2bdc, (q15_t)0x2a61, (q15_t)0x28e5, (q15_t)0x2767, (q15_t)0x25e8, + (q15_t)0x2467, (q15_t)0x22e5, (q15_t)0x2161, (q15_t)0x1fdc, (q15_t)0x1e56, (q15_t)0x1ccf, (q15_t)0x1b47, (q15_t)0x19bd, + (q15_t)0x1833, (q15_t)0x16a8, (q15_t)0x151b, (q15_t)0x138e, (q15_t)0x1201, (q15_t)0x1072, (q15_t)0xee3, (q15_t)0xd53, + (q15_t)0xbc3, (q15_t)0xa33, (q15_t)0x8a2, (q15_t)0x710, (q15_t)0x57f, (q15_t)0x3ed, (q15_t)0x25b, (q15_t)0xc9 +}; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_512) + const q15_t __ALIGNED(4) WeightsQ15_512[1024] = { + (q15_t)0x7fff, (q15_t)0x0, (q15_t)0x7fff, (q15_t)0xff9c, (q15_t)0x7fff, (q15_t)0xff37, (q15_t)0x7ffe, (q15_t)0xfed3, + (q15_t)0x7ffd, (q15_t)0xfe6e, (q15_t)0x7ffc, (q15_t)0xfe0a, (q15_t)0x7ffa, (q15_t)0xfda5, (q15_t)0x7ff8, (q15_t)0xfd41, + (q15_t)0x7ff6, (q15_t)0xfcdc, (q15_t)0x7ff3, (q15_t)0xfc78, (q15_t)0x7ff0, (q15_t)0xfc13, (q15_t)0x7fed, (q15_t)0xfbaf, + (q15_t)0x7fe9, (q15_t)0xfb4a, (q15_t)0x7fe5, (q15_t)0xfae6, (q15_t)0x7fe1, (q15_t)0xfa81, (q15_t)0x7fdd, (q15_t)0xfa1d, + (q15_t)0x7fd8, (q15_t)0xf9b9, (q15_t)0x7fd3, (q15_t)0xf954, (q15_t)0x7fce, (q15_t)0xf8f0, (q15_t)0x7fc8, (q15_t)0xf88b, + (q15_t)0x7fc2, (q15_t)0xf827, (q15_t)0x7fbc, (q15_t)0xf7c3, (q15_t)0x7fb5, (q15_t)0xf75e, (q15_t)0x7fae, (q15_t)0xf6fa, + (q15_t)0x7fa7, (q15_t)0xf696, (q15_t)0x7f9f, (q15_t)0xf632, (q15_t)0x7f97, (q15_t)0xf5cd, (q15_t)0x7f8f, (q15_t)0xf569, + (q15_t)0x7f87, (q15_t)0xf505, (q15_t)0x7f7e, (q15_t)0xf4a1, (q15_t)0x7f75, (q15_t)0xf43d, (q15_t)0x7f6b, (q15_t)0xf3d9, + (q15_t)0x7f62, (q15_t)0xf375, (q15_t)0x7f58, (q15_t)0xf311, (q15_t)0x7f4d, (q15_t)0xf2ad, (q15_t)0x7f43, (q15_t)0xf249, + (q15_t)0x7f38, (q15_t)0xf1e5, (q15_t)0x7f2d, (q15_t)0xf181, (q15_t)0x7f21, (q15_t)0xf11d, (q15_t)0x7f15, (q15_t)0xf0b9, + (q15_t)0x7f09, (q15_t)0xf055, (q15_t)0x7efd, (q15_t)0xeff2, (q15_t)0x7ef0, (q15_t)0xef8e, (q15_t)0x7ee3, (q15_t)0xef2a, + (q15_t)0x7ed5, (q15_t)0xeec7, (q15_t)0x7ec8, (q15_t)0xee63, (q15_t)0x7eba, (q15_t)0xedff, (q15_t)0x7eab, (q15_t)0xed9c, + (q15_t)0x7e9d, (q15_t)0xed38, (q15_t)0x7e8e, (q15_t)0xecd5, (q15_t)0x7e7f, (q15_t)0xec72, (q15_t)0x7e6f, (q15_t)0xec0e, + (q15_t)0x7e5f, (q15_t)0xebab, (q15_t)0x7e4f, (q15_t)0xeb48, (q15_t)0x7e3f, (q15_t)0xeae5, (q15_t)0x7e2e, (q15_t)0xea81, + (q15_t)0x7e1d, (q15_t)0xea1e, (q15_t)0x7e0c, (q15_t)0xe9bb, (q15_t)0x7dfa, (q15_t)0xe958, (q15_t)0x7de8, (q15_t)0xe8f6, + (q15_t)0x7dd6, (q15_t)0xe893, (q15_t)0x7dc3, (q15_t)0xe830, (q15_t)0x7db0, (q15_t)0xe7cd, (q15_t)0x7d9d, (q15_t)0xe76a, + (q15_t)0x7d8a, (q15_t)0xe708, (q15_t)0x7d76, (q15_t)0xe6a5, (q15_t)0x7d62, (q15_t)0xe643, (q15_t)0x7d4e, (q15_t)0xe5e0, + (q15_t)0x7d39, (q15_t)0xe57e, (q15_t)0x7d24, (q15_t)0xe51c, (q15_t)0x7d0f, (q15_t)0xe4b9, (q15_t)0x7cf9, (q15_t)0xe457, + (q15_t)0x7ce3, (q15_t)0xe3f5, (q15_t)0x7ccd, (q15_t)0xe393, (q15_t)0x7cb7, (q15_t)0xe331, (q15_t)0x7ca0, (q15_t)0xe2cf, + (q15_t)0x7c89, (q15_t)0xe26d, (q15_t)0x7c71, (q15_t)0xe20b, (q15_t)0x7c5a, (q15_t)0xe1aa, (q15_t)0x7c42, (q15_t)0xe148, + (q15_t)0x7c29, (q15_t)0xe0e7, (q15_t)0x7c11, (q15_t)0xe085, (q15_t)0x7bf8, (q15_t)0xe024, (q15_t)0x7bdf, (q15_t)0xdfc2, + (q15_t)0x7bc5, (q15_t)0xdf61, (q15_t)0x7bac, (q15_t)0xdf00, (q15_t)0x7b92, (q15_t)0xde9f, (q15_t)0x7b77, (q15_t)0xde3e, + (q15_t)0x7b5d, (q15_t)0xdddd, (q15_t)0x7b42, (q15_t)0xdd7c, (q15_t)0x7b26, (q15_t)0xdd1b, (q15_t)0x7b0b, (q15_t)0xdcbb, + (q15_t)0x7aef, (q15_t)0xdc5a, (q15_t)0x7ad3, (q15_t)0xdbf9, (q15_t)0x7ab6, (q15_t)0xdb99, (q15_t)0x7a9a, (q15_t)0xdb39, + (q15_t)0x7a7d, (q15_t)0xdad8, (q15_t)0x7a5f, (q15_t)0xda78, (q15_t)0x7a42, (q15_t)0xda18, (q15_t)0x7a24, (q15_t)0xd9b8, + (q15_t)0x7a05, (q15_t)0xd958, (q15_t)0x79e7, (q15_t)0xd8f9, (q15_t)0x79c8, (q15_t)0xd899, (q15_t)0x79a9, (q15_t)0xd839, + (q15_t)0x798a, (q15_t)0xd7da, (q15_t)0x796a, (q15_t)0xd77a, (q15_t)0x794a, (q15_t)0xd71b, (q15_t)0x792a, (q15_t)0xd6bc, + (q15_t)0x7909, (q15_t)0xd65d, (q15_t)0x78e8, (q15_t)0xd5fe, (q15_t)0x78c7, (q15_t)0xd59f, (q15_t)0x78a6, (q15_t)0xd540, + (q15_t)0x7884, (q15_t)0xd4e1, (q15_t)0x7862, (q15_t)0xd483, (q15_t)0x7840, (q15_t)0xd424, (q15_t)0x781d, (q15_t)0xd3c6, + (q15_t)0x77fa, (q15_t)0xd368, (q15_t)0x77d7, (q15_t)0xd309, (q15_t)0x77b4, (q15_t)0xd2ab, (q15_t)0x7790, (q15_t)0xd24d, + (q15_t)0x776c, (q15_t)0xd1ef, (q15_t)0x7747, (q15_t)0xd192, (q15_t)0x7723, (q15_t)0xd134, (q15_t)0x76fe, (q15_t)0xd0d7, + (q15_t)0x76d9, (q15_t)0xd079, (q15_t)0x76b3, (q15_t)0xd01c, (q15_t)0x768e, (q15_t)0xcfbf, (q15_t)0x7668, (q15_t)0xcf62, + (q15_t)0x7641, (q15_t)0xcf05, (q15_t)0x761b, (q15_t)0xcea8, (q15_t)0x75f4, (q15_t)0xce4b, (q15_t)0x75cc, (q15_t)0xcdef, + (q15_t)0x75a5, (q15_t)0xcd92, (q15_t)0x757d, (q15_t)0xcd36, (q15_t)0x7555, (q15_t)0xccda, (q15_t)0x752d, (q15_t)0xcc7e, + (q15_t)0x7504, (q15_t)0xcc22, (q15_t)0x74db, (q15_t)0xcbc6, (q15_t)0x74b2, (q15_t)0xcb6a, (q15_t)0x7489, (q15_t)0xcb0e, + (q15_t)0x745f, (q15_t)0xcab3, (q15_t)0x7435, (q15_t)0xca58, (q15_t)0x740b, (q15_t)0xc9fc, (q15_t)0x73e0, (q15_t)0xc9a1, + (q15_t)0x73b5, (q15_t)0xc946, (q15_t)0x738a, (q15_t)0xc8ec, (q15_t)0x735f, (q15_t)0xc891, (q15_t)0x7333, (q15_t)0xc836, + (q15_t)0x7307, (q15_t)0xc7dc, (q15_t)0x72db, (q15_t)0xc782, (q15_t)0x72af, (q15_t)0xc728, (q15_t)0x7282, (q15_t)0xc6ce, + (q15_t)0x7255, (q15_t)0xc674, (q15_t)0x7227, (q15_t)0xc61a, (q15_t)0x71fa, (q15_t)0xc5c0, (q15_t)0x71cc, (q15_t)0xc567, + (q15_t)0x719e, (q15_t)0xc50e, (q15_t)0x716f, (q15_t)0xc4b4, (q15_t)0x7141, (q15_t)0xc45b, (q15_t)0x7112, (q15_t)0xc403, + (q15_t)0x70e2, (q15_t)0xc3aa, (q15_t)0x70b3, (q15_t)0xc351, (q15_t)0x7083, (q15_t)0xc2f9, (q15_t)0x7053, (q15_t)0xc2a0, + (q15_t)0x7023, (q15_t)0xc248, (q15_t)0x6ff2, (q15_t)0xc1f0, (q15_t)0x6fc1, (q15_t)0xc198, (q15_t)0x6f90, (q15_t)0xc141, + (q15_t)0x6f5f, (q15_t)0xc0e9, (q15_t)0x6f2d, (q15_t)0xc092, (q15_t)0x6efb, (q15_t)0xc03b, (q15_t)0x6ec9, (q15_t)0xbfe3, + (q15_t)0x6e96, (q15_t)0xbf8d, (q15_t)0x6e63, (q15_t)0xbf36, (q15_t)0x6e30, (q15_t)0xbedf, (q15_t)0x6dfd, (q15_t)0xbe89, + (q15_t)0x6dca, (q15_t)0xbe32, (q15_t)0x6d96, (q15_t)0xbddc, (q15_t)0x6d62, (q15_t)0xbd86, (q15_t)0x6d2d, (q15_t)0xbd30, + (q15_t)0x6cf9, (q15_t)0xbcdb, (q15_t)0x6cc4, (q15_t)0xbc85, (q15_t)0x6c8f, (q15_t)0xbc30, (q15_t)0x6c59, (q15_t)0xbbdb, + (q15_t)0x6c24, (q15_t)0xbb86, (q15_t)0x6bee, (q15_t)0xbb31, (q15_t)0x6bb8, (q15_t)0xbadc, (q15_t)0x6b81, (q15_t)0xba88, + (q15_t)0x6b4a, (q15_t)0xba33, (q15_t)0x6b13, (q15_t)0xb9df, (q15_t)0x6adc, (q15_t)0xb98b, (q15_t)0x6aa5, (q15_t)0xb937, + (q15_t)0x6a6d, (q15_t)0xb8e4, (q15_t)0x6a35, (q15_t)0xb890, (q15_t)0x69fd, (q15_t)0xb83d, (q15_t)0x69c4, (q15_t)0xb7ea, + (q15_t)0x698c, (q15_t)0xb797, (q15_t)0x6953, (q15_t)0xb744, (q15_t)0x6919, (q15_t)0xb6f1, (q15_t)0x68e0, (q15_t)0xb69f, + (q15_t)0x68a6, (q15_t)0xb64c, (q15_t)0x686c, (q15_t)0xb5fa, (q15_t)0x6832, (q15_t)0xb5a8, (q15_t)0x67f7, (q15_t)0xb557, + (q15_t)0x67bd, (q15_t)0xb505, (q15_t)0x6782, (q15_t)0xb4b4, (q15_t)0x6746, (q15_t)0xb462, (q15_t)0x670b, (q15_t)0xb411, + (q15_t)0x66cf, (q15_t)0xb3c1, (q15_t)0x6693, (q15_t)0xb370, (q15_t)0x6657, (q15_t)0xb31f, (q15_t)0x661a, (q15_t)0xb2cf, + (q15_t)0x65dd, (q15_t)0xb27f, (q15_t)0x65a0, (q15_t)0xb22f, (q15_t)0x6563, (q15_t)0xb1df, (q15_t)0x6526, (q15_t)0xb190, + (q15_t)0x64e8, (q15_t)0xb141, (q15_t)0x64aa, (q15_t)0xb0f1, (q15_t)0x646c, (q15_t)0xb0a2, (q15_t)0x642d, (q15_t)0xb054, + (q15_t)0x63ef, (q15_t)0xb005, (q15_t)0x63b0, (q15_t)0xafb7, (q15_t)0x6371, (q15_t)0xaf69, (q15_t)0x6331, (q15_t)0xaf1b, + (q15_t)0x62f2, (q15_t)0xaecd, (q15_t)0x62b2, (q15_t)0xae7f, (q15_t)0x6271, (q15_t)0xae32, (q15_t)0x6231, (q15_t)0xade4, + (q15_t)0x61f1, (q15_t)0xad97, (q15_t)0x61b0, (q15_t)0xad4b, (q15_t)0x616f, (q15_t)0xacfe, (q15_t)0x612d, (q15_t)0xacb2, + (q15_t)0x60ec, (q15_t)0xac65, (q15_t)0x60aa, (q15_t)0xac19, (q15_t)0x6068, (q15_t)0xabcd, (q15_t)0x6026, (q15_t)0xab82, + (q15_t)0x5fe3, (q15_t)0xab36, (q15_t)0x5fa0, (q15_t)0xaaeb, (q15_t)0x5f5e, (q15_t)0xaaa0, (q15_t)0x5f1a, (q15_t)0xaa55, + (q15_t)0x5ed7, (q15_t)0xaa0b, (q15_t)0x5e93, (q15_t)0xa9c0, (q15_t)0x5e50, (q15_t)0xa976, (q15_t)0x5e0b, (q15_t)0xa92c, + (q15_t)0x5dc7, (q15_t)0xa8e3, (q15_t)0x5d83, (q15_t)0xa899, (q15_t)0x5d3e, (q15_t)0xa850, (q15_t)0x5cf9, (q15_t)0xa807, + (q15_t)0x5cb4, (q15_t)0xa7be, (q15_t)0x5c6e, (q15_t)0xa775, (q15_t)0x5c29, (q15_t)0xa72c, (q15_t)0x5be3, (q15_t)0xa6e4, + (q15_t)0x5b9d, (q15_t)0xa69c, (q15_t)0x5b56, (q15_t)0xa654, (q15_t)0x5b10, (q15_t)0xa60d, (q15_t)0x5ac9, (q15_t)0xa5c5, + (q15_t)0x5a82, (q15_t)0xa57e, (q15_t)0x5a3b, (q15_t)0xa537, (q15_t)0x59f3, (q15_t)0xa4f0, (q15_t)0x59ac, (q15_t)0xa4aa, + (q15_t)0x5964, (q15_t)0xa463, (q15_t)0x591c, (q15_t)0xa41d, (q15_t)0x58d4, (q15_t)0xa3d7, (q15_t)0x588b, (q15_t)0xa392, + (q15_t)0x5842, (q15_t)0xa34c, (q15_t)0x57f9, (q15_t)0xa307, (q15_t)0x57b0, (q15_t)0xa2c2, (q15_t)0x5767, (q15_t)0xa27d, + (q15_t)0x571d, (q15_t)0xa239, (q15_t)0x56d4, (q15_t)0xa1f5, (q15_t)0x568a, (q15_t)0xa1b0, (q15_t)0x5640, (q15_t)0xa16d, + (q15_t)0x55f5, (q15_t)0xa129, (q15_t)0x55ab, (q15_t)0xa0e6, (q15_t)0x5560, (q15_t)0xa0a2, (q15_t)0x5515, (q15_t)0xa060, + (q15_t)0x54ca, (q15_t)0xa01d, (q15_t)0x547e, (q15_t)0x9fda, (q15_t)0x5433, (q15_t)0x9f98, (q15_t)0x53e7, (q15_t)0x9f56, + (q15_t)0x539b, (q15_t)0x9f14, (q15_t)0x534e, (q15_t)0x9ed3, (q15_t)0x5302, (q15_t)0x9e91, (q15_t)0x52b5, (q15_t)0x9e50, + (q15_t)0x5269, (q15_t)0x9e0f, (q15_t)0x521c, (q15_t)0x9dcf, (q15_t)0x51ce, (q15_t)0x9d8f, (q15_t)0x5181, (q15_t)0x9d4e, + (q15_t)0x5133, (q15_t)0x9d0e, (q15_t)0x50e5, (q15_t)0x9ccf, (q15_t)0x5097, (q15_t)0x9c8f, (q15_t)0x5049, (q15_t)0x9c50, + (q15_t)0x4ffb, (q15_t)0x9c11, (q15_t)0x4fac, (q15_t)0x9bd3, (q15_t)0x4f5e, (q15_t)0x9b94, (q15_t)0x4f0f, (q15_t)0x9b56, + (q15_t)0x4ebf, (q15_t)0x9b18, (q15_t)0x4e70, (q15_t)0x9ada, (q15_t)0x4e21, (q15_t)0x9a9d, (q15_t)0x4dd1, (q15_t)0x9a60, + (q15_t)0x4d81, (q15_t)0x9a23, (q15_t)0x4d31, (q15_t)0x99e6, (q15_t)0x4ce1, (q15_t)0x99a9, (q15_t)0x4c90, (q15_t)0x996d, + (q15_t)0x4c3f, (q15_t)0x9931, (q15_t)0x4bef, (q15_t)0x98f5, (q15_t)0x4b9e, (q15_t)0x98ba, (q15_t)0x4b4c, (q15_t)0x987e, + (q15_t)0x4afb, (q15_t)0x9843, (q15_t)0x4aa9, (q15_t)0x9809, (q15_t)0x4a58, (q15_t)0x97ce, (q15_t)0x4a06, (q15_t)0x9794, + (q15_t)0x49b4, (q15_t)0x975a, (q15_t)0x4961, (q15_t)0x9720, (q15_t)0x490f, (q15_t)0x96e7, (q15_t)0x48bc, (q15_t)0x96ad, + (q15_t)0x4869, (q15_t)0x9674, (q15_t)0x4816, (q15_t)0x963c, (q15_t)0x47c3, (q15_t)0x9603, (q15_t)0x4770, (q15_t)0x95cb, + (q15_t)0x471c, (q15_t)0x9593, (q15_t)0x46c9, (q15_t)0x955b, (q15_t)0x4675, (q15_t)0x9524, (q15_t)0x4621, (q15_t)0x94ed, + (q15_t)0x45cd, (q15_t)0x94b6, (q15_t)0x4578, (q15_t)0x947f, (q15_t)0x4524, (q15_t)0x9448, (q15_t)0x44cf, (q15_t)0x9412, + (q15_t)0x447a, (q15_t)0x93dc, (q15_t)0x4425, (q15_t)0x93a7, (q15_t)0x43d0, (q15_t)0x9371, (q15_t)0x437b, (q15_t)0x933c, + (q15_t)0x4325, (q15_t)0x9307, (q15_t)0x42d0, (q15_t)0x92d3, (q15_t)0x427a, (q15_t)0x929e, (q15_t)0x4224, (q15_t)0x926a, + (q15_t)0x41ce, (q15_t)0x9236, (q15_t)0x4177, (q15_t)0x9203, (q15_t)0x4121, (q15_t)0x91d0, (q15_t)0x40ca, (q15_t)0x919d, + (q15_t)0x4073, (q15_t)0x916a, (q15_t)0x401d, (q15_t)0x9137, (q15_t)0x3fc5, (q15_t)0x9105, (q15_t)0x3f6e, (q15_t)0x90d3, + (q15_t)0x3f17, (q15_t)0x90a1, (q15_t)0x3ebf, (q15_t)0x9070, (q15_t)0x3e68, (q15_t)0x903f, (q15_t)0x3e10, (q15_t)0x900e, + (q15_t)0x3db8, (q15_t)0x8fdd, (q15_t)0x3d60, (q15_t)0x8fad, (q15_t)0x3d07, (q15_t)0x8f7d, (q15_t)0x3caf, (q15_t)0x8f4d, + (q15_t)0x3c56, (q15_t)0x8f1e, (q15_t)0x3bfd, (q15_t)0x8eee, (q15_t)0x3ba5, (q15_t)0x8ebf, (q15_t)0x3b4c, (q15_t)0x8e91, + (q15_t)0x3af2, (q15_t)0x8e62, (q15_t)0x3a99, (q15_t)0x8e34, (q15_t)0x3a40, (q15_t)0x8e06, (q15_t)0x39e6, (q15_t)0x8dd9, + (q15_t)0x398c, (q15_t)0x8dab, (q15_t)0x3932, (q15_t)0x8d7e, (q15_t)0x38d8, (q15_t)0x8d51, (q15_t)0x387e, (q15_t)0x8d25, + (q15_t)0x3824, (q15_t)0x8cf9, (q15_t)0x37ca, (q15_t)0x8ccd, (q15_t)0x376f, (q15_t)0x8ca1, (q15_t)0x3714, (q15_t)0x8c76, + (q15_t)0x36ba, (q15_t)0x8c4b, (q15_t)0x365f, (q15_t)0x8c20, (q15_t)0x3604, (q15_t)0x8bf5, (q15_t)0x35a8, (q15_t)0x8bcb, + (q15_t)0x354d, (q15_t)0x8ba1, (q15_t)0x34f2, (q15_t)0x8b77, (q15_t)0x3496, (q15_t)0x8b4e, (q15_t)0x343a, (q15_t)0x8b25, + (q15_t)0x33de, (q15_t)0x8afc, (q15_t)0x3382, (q15_t)0x8ad3, (q15_t)0x3326, (q15_t)0x8aab, (q15_t)0x32ca, (q15_t)0x8a83, + (q15_t)0x326e, (q15_t)0x8a5b, (q15_t)0x3211, (q15_t)0x8a34, (q15_t)0x31b5, (q15_t)0x8a0c, (q15_t)0x3158, (q15_t)0x89e5, + (q15_t)0x30fb, (q15_t)0x89bf, (q15_t)0x309e, (q15_t)0x8998, (q15_t)0x3041, (q15_t)0x8972, (q15_t)0x2fe4, (q15_t)0x894d, + (q15_t)0x2f87, (q15_t)0x8927, (q15_t)0x2f29, (q15_t)0x8902, (q15_t)0x2ecc, (q15_t)0x88dd, (q15_t)0x2e6e, (q15_t)0x88b9, + (q15_t)0x2e11, (q15_t)0x8894, (q15_t)0x2db3, (q15_t)0x8870, (q15_t)0x2d55, (q15_t)0x884c, (q15_t)0x2cf7, (q15_t)0x8829, + (q15_t)0x2c98, (q15_t)0x8806, (q15_t)0x2c3a, (q15_t)0x87e3, (q15_t)0x2bdc, (q15_t)0x87c0, (q15_t)0x2b7d, (q15_t)0x879e, + (q15_t)0x2b1f, (q15_t)0x877c, (q15_t)0x2ac0, (q15_t)0x875a, (q15_t)0x2a61, (q15_t)0x8739, (q15_t)0x2a02, (q15_t)0x8718, + (q15_t)0x29a3, (q15_t)0x86f7, (q15_t)0x2944, (q15_t)0x86d6, (q15_t)0x28e5, (q15_t)0x86b6, (q15_t)0x2886, (q15_t)0x8696, + (q15_t)0x2826, (q15_t)0x8676, (q15_t)0x27c7, (q15_t)0x8657, (q15_t)0x2767, (q15_t)0x8638, (q15_t)0x2707, (q15_t)0x8619, + (q15_t)0x26a8, (q15_t)0x85fb, (q15_t)0x2648, (q15_t)0x85dc, (q15_t)0x25e8, (q15_t)0x85be, (q15_t)0x2588, (q15_t)0x85a1, + (q15_t)0x2528, (q15_t)0x8583, (q15_t)0x24c7, (q15_t)0x8566, (q15_t)0x2467, (q15_t)0x854a, (q15_t)0x2407, (q15_t)0x852d, + (q15_t)0x23a6, (q15_t)0x8511, (q15_t)0x2345, (q15_t)0x84f5, (q15_t)0x22e5, (q15_t)0x84da, (q15_t)0x2284, (q15_t)0x84be, + (q15_t)0x2223, (q15_t)0x84a3, (q15_t)0x21c2, (q15_t)0x8489, (q15_t)0x2161, (q15_t)0x846e, (q15_t)0x2100, (q15_t)0x8454, + (q15_t)0x209f, (q15_t)0x843b, (q15_t)0x203e, (q15_t)0x8421, (q15_t)0x1fdc, (q15_t)0x8408, (q15_t)0x1f7b, (q15_t)0x83ef, + (q15_t)0x1f19, (q15_t)0x83d7, (q15_t)0x1eb8, (q15_t)0x83be, (q15_t)0x1e56, (q15_t)0x83a6, (q15_t)0x1df5, (q15_t)0x838f, + (q15_t)0x1d93, (q15_t)0x8377, (q15_t)0x1d31, (q15_t)0x8360, (q15_t)0x1ccf, (q15_t)0x8349, (q15_t)0x1c6d, (q15_t)0x8333, + (q15_t)0x1c0b, (q15_t)0x831d, (q15_t)0x1ba9, (q15_t)0x8307, (q15_t)0x1b47, (q15_t)0x82f1, (q15_t)0x1ae4, (q15_t)0x82dc, + (q15_t)0x1a82, (q15_t)0x82c7, (q15_t)0x1a20, (q15_t)0x82b2, (q15_t)0x19bd, (q15_t)0x829e, (q15_t)0x195b, (q15_t)0x828a, + (q15_t)0x18f8, (q15_t)0x8276, (q15_t)0x1896, (q15_t)0x8263, (q15_t)0x1833, (q15_t)0x8250, (q15_t)0x17d0, (q15_t)0x823d, + (q15_t)0x176d, (q15_t)0x822a, (q15_t)0x170a, (q15_t)0x8218, (q15_t)0x16a8, (q15_t)0x8206, (q15_t)0x1645, (q15_t)0x81f4, + (q15_t)0x15e2, (q15_t)0x81e3, (q15_t)0x157f, (q15_t)0x81d2, (q15_t)0x151b, (q15_t)0x81c1, (q15_t)0x14b8, (q15_t)0x81b1, + (q15_t)0x1455, (q15_t)0x81a1, (q15_t)0x13f2, (q15_t)0x8191, (q15_t)0x138e, (q15_t)0x8181, (q15_t)0x132b, (q15_t)0x8172, + (q15_t)0x12c8, (q15_t)0x8163, (q15_t)0x1264, (q15_t)0x8155, (q15_t)0x1201, (q15_t)0x8146, (q15_t)0x119d, (q15_t)0x8138, + (q15_t)0x1139, (q15_t)0x812b, (q15_t)0x10d6, (q15_t)0x811d, (q15_t)0x1072, (q15_t)0x8110, (q15_t)0x100e, (q15_t)0x8103, + (q15_t)0xfab, (q15_t)0x80f7, (q15_t)0xf47, (q15_t)0x80eb, (q15_t)0xee3, (q15_t)0x80df, (q15_t)0xe7f, (q15_t)0x80d3, + (q15_t)0xe1b, (q15_t)0x80c8, (q15_t)0xdb7, (q15_t)0x80bd, (q15_t)0xd53, (q15_t)0x80b3, (q15_t)0xcef, (q15_t)0x80a8, + (q15_t)0xc8b, (q15_t)0x809e, (q15_t)0xc27, (q15_t)0x8095, (q15_t)0xbc3, (q15_t)0x808b, (q15_t)0xb5f, (q15_t)0x8082, + (q15_t)0xafb, (q15_t)0x8079, (q15_t)0xa97, (q15_t)0x8071, (q15_t)0xa33, (q15_t)0x8069, (q15_t)0x9ce, (q15_t)0x8061, + (q15_t)0x96a, (q15_t)0x8059, (q15_t)0x906, (q15_t)0x8052, (q15_t)0x8a2, (q15_t)0x804b, (q15_t)0x83d, (q15_t)0x8044, + (q15_t)0x7d9, (q15_t)0x803e, (q15_t)0x775, (q15_t)0x8038, (q15_t)0x710, (q15_t)0x8032, (q15_t)0x6ac, (q15_t)0x802d, + (q15_t)0x647, (q15_t)0x8028, (q15_t)0x5e3, (q15_t)0x8023, (q15_t)0x57f, (q15_t)0x801f, (q15_t)0x51a, (q15_t)0x801b, + (q15_t)0x4b6, (q15_t)0x8017, (q15_t)0x451, (q15_t)0x8013, (q15_t)0x3ed, (q15_t)0x8010, (q15_t)0x388, (q15_t)0x800d, + (q15_t)0x324, (q15_t)0x800a, (q15_t)0x2bf, (q15_t)0x8008, (q15_t)0x25b, (q15_t)0x8006, (q15_t)0x1f6, (q15_t)0x8004, + (q15_t)0x192, (q15_t)0x8003, (q15_t)0x12d, (q15_t)0x8002, (q15_t)0xc9, (q15_t)0x8001, (q15_t)0x64, (q15_t)0x8001 +}; + + const q15_t __ALIGNED(4) cos_factorsQ15_512[512] = { + (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7ffe, (q15_t)0x7ffc, (q15_t)0x7ffb, (q15_t)0x7ff9, (q15_t)0x7ff7, + (q15_t)0x7ff4, (q15_t)0x7ff2, (q15_t)0x7fee, (q15_t)0x7feb, (q15_t)0x7fe7, (q15_t)0x7fe3, (q15_t)0x7fdf, (q15_t)0x7fda, + (q15_t)0x7fd6, (q15_t)0x7fd0, (q15_t)0x7fcb, (q15_t)0x7fc5, (q15_t)0x7fbf, (q15_t)0x7fb8, (q15_t)0x7fb1, (q15_t)0x7faa, + (q15_t)0x7fa3, (q15_t)0x7f9b, (q15_t)0x7f93, (q15_t)0x7f8b, (q15_t)0x7f82, (q15_t)0x7f79, (q15_t)0x7f70, (q15_t)0x7f67, + (q15_t)0x7f5d, (q15_t)0x7f53, (q15_t)0x7f48, (q15_t)0x7f3d, (q15_t)0x7f32, (q15_t)0x7f27, (q15_t)0x7f1b, (q15_t)0x7f0f, + (q15_t)0x7f03, (q15_t)0x7ef6, (q15_t)0x7ee9, (q15_t)0x7edc, (q15_t)0x7ecf, (q15_t)0x7ec1, (q15_t)0x7eb3, (q15_t)0x7ea4, + (q15_t)0x7e95, (q15_t)0x7e86, (q15_t)0x7e77, (q15_t)0x7e67, (q15_t)0x7e57, (q15_t)0x7e47, (q15_t)0x7e37, (q15_t)0x7e26, + (q15_t)0x7e14, (q15_t)0x7e03, (q15_t)0x7df1, (q15_t)0x7ddf, (q15_t)0x7dcd, (q15_t)0x7dba, (q15_t)0x7da7, (q15_t)0x7d94, + (q15_t)0x7d80, (q15_t)0x7d6c, (q15_t)0x7d58, (q15_t)0x7d43, (q15_t)0x7d2f, (q15_t)0x7d19, (q15_t)0x7d04, (q15_t)0x7cee, + (q15_t)0x7cd8, (q15_t)0x7cc2, (q15_t)0x7cab, (q15_t)0x7c94, (q15_t)0x7c7d, (q15_t)0x7c66, (q15_t)0x7c4e, (q15_t)0x7c36, + (q15_t)0x7c1d, (q15_t)0x7c05, (q15_t)0x7beb, (q15_t)0x7bd2, (q15_t)0x7bb9, (q15_t)0x7b9f, (q15_t)0x7b84, (q15_t)0x7b6a, + (q15_t)0x7b4f, (q15_t)0x7b34, (q15_t)0x7b19, (q15_t)0x7afd, (q15_t)0x7ae1, (q15_t)0x7ac5, (q15_t)0x7aa8, (q15_t)0x7a8b, + (q15_t)0x7a6e, (q15_t)0x7a50, (q15_t)0x7a33, (q15_t)0x7a15, (q15_t)0x79f6, (q15_t)0x79d8, (q15_t)0x79b9, (q15_t)0x7999, + (q15_t)0x797a, (q15_t)0x795a, (q15_t)0x793a, (q15_t)0x7919, (q15_t)0x78f9, (q15_t)0x78d8, (q15_t)0x78b6, (q15_t)0x7895, + (q15_t)0x7873, (q15_t)0x7851, (q15_t)0x782e, (q15_t)0x780c, (q15_t)0x77e9, (q15_t)0x77c5, (q15_t)0x77a2, (q15_t)0x777e, + (q15_t)0x775a, (q15_t)0x7735, (q15_t)0x7710, (q15_t)0x76eb, (q15_t)0x76c6, (q15_t)0x76a0, (q15_t)0x767b, (q15_t)0x7654, + (q15_t)0x762e, (q15_t)0x7607, (q15_t)0x75e0, (q15_t)0x75b9, (q15_t)0x7591, (q15_t)0x7569, (q15_t)0x7541, (q15_t)0x7519, + (q15_t)0x74f0, (q15_t)0x74c7, (q15_t)0x749e, (q15_t)0x7474, (q15_t)0x744a, (q15_t)0x7420, (q15_t)0x73f6, (q15_t)0x73cb, + (q15_t)0x73a0, (q15_t)0x7375, (q15_t)0x7349, (q15_t)0x731d, (q15_t)0x72f1, (q15_t)0x72c5, (q15_t)0x7298, (q15_t)0x726b, + (q15_t)0x723e, (q15_t)0x7211, (q15_t)0x71e3, (q15_t)0x71b5, (q15_t)0x7186, (q15_t)0x7158, (q15_t)0x7129, (q15_t)0x70fa, + (q15_t)0x70cb, (q15_t)0x709b, (q15_t)0x706b, (q15_t)0x703b, (q15_t)0x700a, (q15_t)0x6fda, (q15_t)0x6fa9, (q15_t)0x6f77, + (q15_t)0x6f46, (q15_t)0x6f14, (q15_t)0x6ee2, (q15_t)0x6eaf, (q15_t)0x6e7d, (q15_t)0x6e4a, (q15_t)0x6e17, (q15_t)0x6de3, + (q15_t)0x6db0, (q15_t)0x6d7c, (q15_t)0x6d48, (q15_t)0x6d13, (q15_t)0x6cde, (q15_t)0x6ca9, (q15_t)0x6c74, (q15_t)0x6c3f, + (q15_t)0x6c09, (q15_t)0x6bd3, (q15_t)0x6b9c, (q15_t)0x6b66, (q15_t)0x6b2f, (q15_t)0x6af8, (q15_t)0x6ac1, (q15_t)0x6a89, + (q15_t)0x6a51, (q15_t)0x6a19, (q15_t)0x69e1, (q15_t)0x69a8, (q15_t)0x696f, (q15_t)0x6936, (q15_t)0x68fd, (q15_t)0x68c3, + (q15_t)0x6889, (q15_t)0x684f, (q15_t)0x6815, (q15_t)0x67da, (q15_t)0x679f, (q15_t)0x6764, (q15_t)0x6729, (q15_t)0x66ed, + (q15_t)0x66b1, (q15_t)0x6675, (q15_t)0x6639, (q15_t)0x65fc, (q15_t)0x65bf, (q15_t)0x6582, (q15_t)0x6545, (q15_t)0x6507, + (q15_t)0x64c9, (q15_t)0x648b, (q15_t)0x644d, (q15_t)0x640e, (q15_t)0x63cf, (q15_t)0x6390, (q15_t)0x6351, (q15_t)0x6311, + (q15_t)0x62d2, (q15_t)0x6292, (q15_t)0x6251, (q15_t)0x6211, (q15_t)0x61d0, (q15_t)0x618f, (q15_t)0x614e, (q15_t)0x610d, + (q15_t)0x60cb, (q15_t)0x6089, (q15_t)0x6047, (q15_t)0x6004, (q15_t)0x5fc2, (q15_t)0x5f7f, (q15_t)0x5f3c, (q15_t)0x5ef9, + (q15_t)0x5eb5, (q15_t)0x5e71, (q15_t)0x5e2d, (q15_t)0x5de9, (q15_t)0x5da5, (q15_t)0x5d60, (q15_t)0x5d1b, (q15_t)0x5cd6, + (q15_t)0x5c91, (q15_t)0x5c4b, (q15_t)0x5c06, (q15_t)0x5bc0, (q15_t)0x5b79, (q15_t)0x5b33, (q15_t)0x5aec, (q15_t)0x5aa5, + (q15_t)0x5a5e, (q15_t)0x5a17, (q15_t)0x59d0, (q15_t)0x5988, (q15_t)0x5940, (q15_t)0x58f8, (q15_t)0x58af, (q15_t)0x5867, + (q15_t)0x581e, (q15_t)0x57d5, (q15_t)0x578c, (q15_t)0x5742, (q15_t)0x56f9, (q15_t)0x56af, (q15_t)0x5665, (q15_t)0x561a, + (q15_t)0x55d0, (q15_t)0x5585, (q15_t)0x553a, (q15_t)0x54ef, (q15_t)0x54a4, (q15_t)0x5458, (q15_t)0x540d, (q15_t)0x53c1, + (q15_t)0x5375, (q15_t)0x5328, (q15_t)0x52dc, (q15_t)0x528f, (q15_t)0x5242, (q15_t)0x51f5, (q15_t)0x51a8, (q15_t)0x515a, + (q15_t)0x510c, (q15_t)0x50bf, (q15_t)0x5070, (q15_t)0x5022, (q15_t)0x4fd4, (q15_t)0x4f85, (q15_t)0x4f36, (q15_t)0x4ee7, + (q15_t)0x4e98, (q15_t)0x4e48, (q15_t)0x4df9, (q15_t)0x4da9, (q15_t)0x4d59, (q15_t)0x4d09, (q15_t)0x4cb8, (q15_t)0x4c68, + (q15_t)0x4c17, (q15_t)0x4bc6, (q15_t)0x4b75, (q15_t)0x4b24, (q15_t)0x4ad2, (q15_t)0x4a81, (q15_t)0x4a2f, (q15_t)0x49dd, + (q15_t)0x498a, (q15_t)0x4938, (q15_t)0x48e6, (q15_t)0x4893, (q15_t)0x4840, (q15_t)0x47ed, (q15_t)0x479a, (q15_t)0x4746, + (q15_t)0x46f3, (q15_t)0x469f, (q15_t)0x464b, (q15_t)0x45f7, (q15_t)0x45a3, (q15_t)0x454e, (q15_t)0x44fa, (q15_t)0x44a5, + (q15_t)0x4450, (q15_t)0x43fb, (q15_t)0x43a5, (q15_t)0x4350, (q15_t)0x42fa, (q15_t)0x42a5, (q15_t)0x424f, (q15_t)0x41f9, + (q15_t)0x41a2, (q15_t)0x414c, (q15_t)0x40f6, (q15_t)0x409f, (q15_t)0x4048, (q15_t)0x3ff1, (q15_t)0x3f9a, (q15_t)0x3f43, + (q15_t)0x3eeb, (q15_t)0x3e93, (q15_t)0x3e3c, (q15_t)0x3de4, (q15_t)0x3d8c, (q15_t)0x3d33, (q15_t)0x3cdb, (q15_t)0x3c83, + (q15_t)0x3c2a, (q15_t)0x3bd1, (q15_t)0x3b78, (q15_t)0x3b1f, (q15_t)0x3ac6, (q15_t)0x3a6c, (q15_t)0x3a13, (q15_t)0x39b9, + (q15_t)0x395f, (q15_t)0x3906, (q15_t)0x38ab, (q15_t)0x3851, (q15_t)0x37f7, (q15_t)0x379c, (q15_t)0x3742, (q15_t)0x36e7, + (q15_t)0x368c, (q15_t)0x3631, (q15_t)0x35d6, (q15_t)0x357b, (q15_t)0x351f, (q15_t)0x34c4, (q15_t)0x3468, (q15_t)0x340c, + (q15_t)0x33b0, (q15_t)0x3354, (q15_t)0x32f8, (q15_t)0x329c, (q15_t)0x3240, (q15_t)0x31e3, (q15_t)0x3186, (q15_t)0x312a, + (q15_t)0x30cd, (q15_t)0x3070, (q15_t)0x3013, (q15_t)0x2fb5, (q15_t)0x2f58, (q15_t)0x2efb, (q15_t)0x2e9d, (q15_t)0x2e3f, + (q15_t)0x2de2, (q15_t)0x2d84, (q15_t)0x2d26, (q15_t)0x2cc8, (q15_t)0x2c69, (q15_t)0x2c0b, (q15_t)0x2bad, (q15_t)0x2b4e, + (q15_t)0x2aef, (q15_t)0x2a91, (q15_t)0x2a32, (q15_t)0x29d3, (q15_t)0x2974, (q15_t)0x2915, (q15_t)0x28b5, (q15_t)0x2856, + (q15_t)0x27f6, (q15_t)0x2797, (q15_t)0x2737, (q15_t)0x26d8, (q15_t)0x2678, (q15_t)0x2618, (q15_t)0x25b8, (q15_t)0x2558, + (q15_t)0x24f7, (q15_t)0x2497, (q15_t)0x2437, (q15_t)0x23d6, (q15_t)0x2376, (q15_t)0x2315, (q15_t)0x22b4, (q15_t)0x2254, + (q15_t)0x21f3, (q15_t)0x2192, (q15_t)0x2131, (q15_t)0x20d0, (q15_t)0x206e, (q15_t)0x200d, (q15_t)0x1fac, (q15_t)0x1f4a, + (q15_t)0x1ee9, (q15_t)0x1e87, (q15_t)0x1e25, (q15_t)0x1dc4, (q15_t)0x1d62, (q15_t)0x1d00, (q15_t)0x1c9e, (q15_t)0x1c3c, + (q15_t)0x1bda, (q15_t)0x1b78, (q15_t)0x1b16, (q15_t)0x1ab3, (q15_t)0x1a51, (q15_t)0x19ef, (q15_t)0x198c, (q15_t)0x192a, + (q15_t)0x18c7, (q15_t)0x1864, (q15_t)0x1802, (q15_t)0x179f, (q15_t)0x173c, (q15_t)0x16d9, (q15_t)0x1676, (q15_t)0x1613, + (q15_t)0x15b0, (q15_t)0x154d, (q15_t)0x14ea, (q15_t)0x1487, (q15_t)0x1423, (q15_t)0x13c0, (q15_t)0x135d, (q15_t)0x12f9, + (q15_t)0x1296, (q15_t)0x1232, (q15_t)0x11cf, (q15_t)0x116b, (q15_t)0x1108, (q15_t)0x10a4, (q15_t)0x1040, (q15_t)0xfdd, + (q15_t)0xf79, (q15_t)0xf15, (q15_t)0xeb1, (q15_t)0xe4d, (q15_t)0xde9, (q15_t)0xd85, (q15_t)0xd21, (q15_t)0xcbd, + (q15_t)0xc59, (q15_t)0xbf5, (q15_t)0xb91, (q15_t)0xb2d, (q15_t)0xac9, (q15_t)0xa65, (q15_t)0xa00, (q15_t)0x99c, + (q15_t)0x938, (q15_t)0x8d4, (q15_t)0x86f, (q15_t)0x80b, (q15_t)0x7a7, (q15_t)0x742, (q15_t)0x6de, (q15_t)0x67a, + (q15_t)0x615, (q15_t)0x5b1, (q15_t)0x54c, (q15_t)0x4e8, (q15_t)0x483, (q15_t)0x41f, (q15_t)0x3ba, (q15_t)0x356, + (q15_t)0x2f1, (q15_t)0x28d, (q15_t)0x228, (q15_t)0x1c4, (q15_t)0x15f, (q15_t)0xfb, (q15_t)0x96, (q15_t)0x32 +}; + + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_2048) + const q15_t __ALIGNED(4) WeightsQ15_2048[4096] = { + (q15_t)0x7fff, (q15_t)0x0, (q15_t)0x7fff, (q15_t)0xffe7, (q15_t)0x7fff, (q15_t)0xffce, (q15_t)0x7fff, (q15_t)0xffb5, + (q15_t)0x7fff, (q15_t)0xff9c, (q15_t)0x7fff, (q15_t)0xff83, (q15_t)0x7fff, (q15_t)0xff6a, (q15_t)0x7fff, (q15_t)0xff51, + (q15_t)0x7fff, (q15_t)0xff37, (q15_t)0x7fff, (q15_t)0xff1e, (q15_t)0x7fff, (q15_t)0xff05, (q15_t)0x7ffe, (q15_t)0xfeec, + (q15_t)0x7ffe, (q15_t)0xfed3, (q15_t)0x7ffe, (q15_t)0xfeba, (q15_t)0x7ffe, (q15_t)0xfea1, (q15_t)0x7ffd, (q15_t)0xfe88, + (q15_t)0x7ffd, (q15_t)0xfe6e, (q15_t)0x7ffd, (q15_t)0xfe55, (q15_t)0x7ffc, (q15_t)0xfe3c, (q15_t)0x7ffc, (q15_t)0xfe23, + (q15_t)0x7ffc, (q15_t)0xfe0a, (q15_t)0x7ffb, (q15_t)0xfdf1, (q15_t)0x7ffb, (q15_t)0xfdd8, (q15_t)0x7ffa, (q15_t)0xfdbe, + (q15_t)0x7ffa, (q15_t)0xfda5, (q15_t)0x7ff9, (q15_t)0xfd8c, (q15_t)0x7ff9, (q15_t)0xfd73, (q15_t)0x7ff8, (q15_t)0xfd5a, + (q15_t)0x7ff8, (q15_t)0xfd41, (q15_t)0x7ff7, (q15_t)0xfd28, (q15_t)0x7ff7, (q15_t)0xfd0f, (q15_t)0x7ff6, (q15_t)0xfcf5, + (q15_t)0x7ff6, (q15_t)0xfcdc, (q15_t)0x7ff5, (q15_t)0xfcc3, (q15_t)0x7ff4, (q15_t)0xfcaa, (q15_t)0x7ff4, (q15_t)0xfc91, + (q15_t)0x7ff3, (q15_t)0xfc78, (q15_t)0x7ff2, (q15_t)0xfc5f, (q15_t)0x7ff2, (q15_t)0xfc46, (q15_t)0x7ff1, (q15_t)0xfc2c, + (q15_t)0x7ff0, (q15_t)0xfc13, (q15_t)0x7fef, (q15_t)0xfbfa, (q15_t)0x7fee, (q15_t)0xfbe1, (q15_t)0x7fee, (q15_t)0xfbc8, + (q15_t)0x7fed, (q15_t)0xfbaf, (q15_t)0x7fec, (q15_t)0xfb96, (q15_t)0x7feb, (q15_t)0xfb7d, (q15_t)0x7fea, (q15_t)0xfb64, + (q15_t)0x7fe9, (q15_t)0xfb4a, (q15_t)0x7fe8, (q15_t)0xfb31, (q15_t)0x7fe7, (q15_t)0xfb18, (q15_t)0x7fe6, (q15_t)0xfaff, + (q15_t)0x7fe5, (q15_t)0xfae6, (q15_t)0x7fe4, (q15_t)0xfacd, (q15_t)0x7fe3, (q15_t)0xfab4, (q15_t)0x7fe2, (q15_t)0xfa9b, + (q15_t)0x7fe1, (q15_t)0xfa81, (q15_t)0x7fe0, (q15_t)0xfa68, (q15_t)0x7fdf, (q15_t)0xfa4f, (q15_t)0x7fde, (q15_t)0xfa36, + (q15_t)0x7fdd, (q15_t)0xfa1d, (q15_t)0x7fdc, (q15_t)0xfa04, (q15_t)0x7fda, (q15_t)0xf9eb, (q15_t)0x7fd9, (q15_t)0xf9d2, + (q15_t)0x7fd8, (q15_t)0xf9b9, (q15_t)0x7fd7, (q15_t)0xf9a0, (q15_t)0x7fd6, (q15_t)0xf986, (q15_t)0x7fd4, (q15_t)0xf96d, + (q15_t)0x7fd3, (q15_t)0xf954, (q15_t)0x7fd2, (q15_t)0xf93b, (q15_t)0x7fd0, (q15_t)0xf922, (q15_t)0x7fcf, (q15_t)0xf909, + (q15_t)0x7fce, (q15_t)0xf8f0, (q15_t)0x7fcc, (q15_t)0xf8d7, (q15_t)0x7fcb, (q15_t)0xf8be, (q15_t)0x7fc9, (q15_t)0xf8a5, + (q15_t)0x7fc8, (q15_t)0xf88b, (q15_t)0x7fc6, (q15_t)0xf872, (q15_t)0x7fc5, (q15_t)0xf859, (q15_t)0x7fc3, (q15_t)0xf840, + (q15_t)0x7fc2, (q15_t)0xf827, (q15_t)0x7fc0, (q15_t)0xf80e, (q15_t)0x7fbf, (q15_t)0xf7f5, (q15_t)0x7fbd, (q15_t)0xf7dc, + (q15_t)0x7fbc, (q15_t)0xf7c3, (q15_t)0x7fba, (q15_t)0xf7aa, (q15_t)0x7fb8, (q15_t)0xf791, (q15_t)0x7fb7, (q15_t)0xf778, + (q15_t)0x7fb5, (q15_t)0xf75e, (q15_t)0x7fb3, (q15_t)0xf745, (q15_t)0x7fb1, (q15_t)0xf72c, (q15_t)0x7fb0, (q15_t)0xf713, + (q15_t)0x7fae, (q15_t)0xf6fa, (q15_t)0x7fac, (q15_t)0xf6e1, (q15_t)0x7faa, (q15_t)0xf6c8, (q15_t)0x7fa9, (q15_t)0xf6af, + (q15_t)0x7fa7, (q15_t)0xf696, (q15_t)0x7fa5, (q15_t)0xf67d, (q15_t)0x7fa3, (q15_t)0xf664, (q15_t)0x7fa1, (q15_t)0xf64b, + (q15_t)0x7f9f, (q15_t)0xf632, (q15_t)0x7f9d, (q15_t)0xf619, (q15_t)0x7f9b, (q15_t)0xf600, (q15_t)0x7f99, (q15_t)0xf5e7, + (q15_t)0x7f97, (q15_t)0xf5cd, (q15_t)0x7f95, (q15_t)0xf5b4, (q15_t)0x7f93, (q15_t)0xf59b, (q15_t)0x7f91, (q15_t)0xf582, + (q15_t)0x7f8f, (q15_t)0xf569, (q15_t)0x7f8d, (q15_t)0xf550, (q15_t)0x7f8b, (q15_t)0xf537, (q15_t)0x7f89, (q15_t)0xf51e, + (q15_t)0x7f87, (q15_t)0xf505, (q15_t)0x7f85, (q15_t)0xf4ec, (q15_t)0x7f82, (q15_t)0xf4d3, (q15_t)0x7f80, (q15_t)0xf4ba, + (q15_t)0x7f7e, (q15_t)0xf4a1, (q15_t)0x7f7c, (q15_t)0xf488, (q15_t)0x7f79, (q15_t)0xf46f, (q15_t)0x7f77, (q15_t)0xf456, + (q15_t)0x7f75, (q15_t)0xf43d, (q15_t)0x7f72, (q15_t)0xf424, (q15_t)0x7f70, (q15_t)0xf40b, (q15_t)0x7f6e, (q15_t)0xf3f2, + (q15_t)0x7f6b, (q15_t)0xf3d9, (q15_t)0x7f69, (q15_t)0xf3c0, (q15_t)0x7f67, (q15_t)0xf3a7, (q15_t)0x7f64, (q15_t)0xf38e, + (q15_t)0x7f62, (q15_t)0xf375, (q15_t)0x7f5f, (q15_t)0xf35c, (q15_t)0x7f5d, (q15_t)0xf343, (q15_t)0x7f5a, (q15_t)0xf32a, + (q15_t)0x7f58, (q15_t)0xf311, (q15_t)0x7f55, (q15_t)0xf2f8, (q15_t)0x7f53, (q15_t)0xf2df, (q15_t)0x7f50, (q15_t)0xf2c6, + (q15_t)0x7f4d, (q15_t)0xf2ad, (q15_t)0x7f4b, (q15_t)0xf294, (q15_t)0x7f48, (q15_t)0xf27b, (q15_t)0x7f45, (q15_t)0xf262, + (q15_t)0x7f43, (q15_t)0xf249, (q15_t)0x7f40, (q15_t)0xf230, (q15_t)0x7f3d, (q15_t)0xf217, (q15_t)0x7f3b, (q15_t)0xf1fe, + (q15_t)0x7f38, (q15_t)0xf1e5, (q15_t)0x7f35, (q15_t)0xf1cc, (q15_t)0x7f32, (q15_t)0xf1b3, (q15_t)0x7f2f, (q15_t)0xf19a, + (q15_t)0x7f2d, (q15_t)0xf181, (q15_t)0x7f2a, (q15_t)0xf168, (q15_t)0x7f27, (q15_t)0xf14f, (q15_t)0x7f24, (q15_t)0xf136, + (q15_t)0x7f21, (q15_t)0xf11d, (q15_t)0x7f1e, (q15_t)0xf104, (q15_t)0x7f1b, (q15_t)0xf0eb, (q15_t)0x7f18, (q15_t)0xf0d2, + (q15_t)0x7f15, (q15_t)0xf0b9, (q15_t)0x7f12, (q15_t)0xf0a0, (q15_t)0x7f0f, (q15_t)0xf087, (q15_t)0x7f0c, (q15_t)0xf06e, + (q15_t)0x7f09, (q15_t)0xf055, (q15_t)0x7f06, (q15_t)0xf03c, (q15_t)0x7f03, (q15_t)0xf023, (q15_t)0x7f00, (q15_t)0xf00b, + (q15_t)0x7efd, (q15_t)0xeff2, (q15_t)0x7ef9, (q15_t)0xefd9, (q15_t)0x7ef6, (q15_t)0xefc0, (q15_t)0x7ef3, (q15_t)0xefa7, + (q15_t)0x7ef0, (q15_t)0xef8e, (q15_t)0x7eed, (q15_t)0xef75, (q15_t)0x7ee9, (q15_t)0xef5c, (q15_t)0x7ee6, (q15_t)0xef43, + (q15_t)0x7ee3, (q15_t)0xef2a, (q15_t)0x7edf, (q15_t)0xef11, (q15_t)0x7edc, (q15_t)0xeef8, (q15_t)0x7ed9, (q15_t)0xeedf, + (q15_t)0x7ed5, (q15_t)0xeec7, (q15_t)0x7ed2, (q15_t)0xeeae, (q15_t)0x7ecf, (q15_t)0xee95, (q15_t)0x7ecb, (q15_t)0xee7c, + (q15_t)0x7ec8, (q15_t)0xee63, (q15_t)0x7ec4, (q15_t)0xee4a, (q15_t)0x7ec1, (q15_t)0xee31, (q15_t)0x7ebd, (q15_t)0xee18, + (q15_t)0x7eba, (q15_t)0xedff, (q15_t)0x7eb6, (q15_t)0xede7, (q15_t)0x7eb3, (q15_t)0xedce, (q15_t)0x7eaf, (q15_t)0xedb5, + (q15_t)0x7eab, (q15_t)0xed9c, (q15_t)0x7ea8, (q15_t)0xed83, (q15_t)0x7ea4, (q15_t)0xed6a, (q15_t)0x7ea1, (q15_t)0xed51, + (q15_t)0x7e9d, (q15_t)0xed38, (q15_t)0x7e99, (q15_t)0xed20, (q15_t)0x7e95, (q15_t)0xed07, (q15_t)0x7e92, (q15_t)0xecee, + (q15_t)0x7e8e, (q15_t)0xecd5, (q15_t)0x7e8a, (q15_t)0xecbc, (q15_t)0x7e86, (q15_t)0xeca3, (q15_t)0x7e83, (q15_t)0xec8a, + (q15_t)0x7e7f, (q15_t)0xec72, (q15_t)0x7e7b, (q15_t)0xec59, (q15_t)0x7e77, (q15_t)0xec40, (q15_t)0x7e73, (q15_t)0xec27, + (q15_t)0x7e6f, (q15_t)0xec0e, (q15_t)0x7e6b, (q15_t)0xebf5, (q15_t)0x7e67, (q15_t)0xebdd, (q15_t)0x7e63, (q15_t)0xebc4, + (q15_t)0x7e5f, (q15_t)0xebab, (q15_t)0x7e5b, (q15_t)0xeb92, (q15_t)0x7e57, (q15_t)0xeb79, (q15_t)0x7e53, (q15_t)0xeb61, + (q15_t)0x7e4f, (q15_t)0xeb48, (q15_t)0x7e4b, (q15_t)0xeb2f, (q15_t)0x7e47, (q15_t)0xeb16, (q15_t)0x7e43, (q15_t)0xeafd, + (q15_t)0x7e3f, (q15_t)0xeae5, (q15_t)0x7e3b, (q15_t)0xeacc, (q15_t)0x7e37, (q15_t)0xeab3, (q15_t)0x7e32, (q15_t)0xea9a, + (q15_t)0x7e2e, (q15_t)0xea81, (q15_t)0x7e2a, (q15_t)0xea69, (q15_t)0x7e26, (q15_t)0xea50, (q15_t)0x7e21, (q15_t)0xea37, + (q15_t)0x7e1d, (q15_t)0xea1e, (q15_t)0x7e19, (q15_t)0xea06, (q15_t)0x7e14, (q15_t)0xe9ed, (q15_t)0x7e10, (q15_t)0xe9d4, + (q15_t)0x7e0c, (q15_t)0xe9bb, (q15_t)0x7e07, (q15_t)0xe9a3, (q15_t)0x7e03, (q15_t)0xe98a, (q15_t)0x7dff, (q15_t)0xe971, + (q15_t)0x7dfa, (q15_t)0xe958, (q15_t)0x7df6, (q15_t)0xe940, (q15_t)0x7df1, (q15_t)0xe927, (q15_t)0x7ded, (q15_t)0xe90e, + (q15_t)0x7de8, (q15_t)0xe8f6, (q15_t)0x7de4, (q15_t)0xe8dd, (q15_t)0x7ddf, (q15_t)0xe8c4, (q15_t)0x7dda, (q15_t)0xe8ab, + (q15_t)0x7dd6, (q15_t)0xe893, (q15_t)0x7dd1, (q15_t)0xe87a, (q15_t)0x7dcd, (q15_t)0xe861, (q15_t)0x7dc8, (q15_t)0xe849, + (q15_t)0x7dc3, (q15_t)0xe830, (q15_t)0x7dbf, (q15_t)0xe817, (q15_t)0x7dba, (q15_t)0xe7fe, (q15_t)0x7db5, (q15_t)0xe7e6, + (q15_t)0x7db0, (q15_t)0xe7cd, (q15_t)0x7dac, (q15_t)0xe7b4, (q15_t)0x7da7, (q15_t)0xe79c, (q15_t)0x7da2, (q15_t)0xe783, + (q15_t)0x7d9d, (q15_t)0xe76a, (q15_t)0x7d98, (q15_t)0xe752, (q15_t)0x7d94, (q15_t)0xe739, (q15_t)0x7d8f, (q15_t)0xe720, + (q15_t)0x7d8a, (q15_t)0xe708, (q15_t)0x7d85, (q15_t)0xe6ef, (q15_t)0x7d80, (q15_t)0xe6d6, (q15_t)0x7d7b, (q15_t)0xe6be, + (q15_t)0x7d76, (q15_t)0xe6a5, (q15_t)0x7d71, (q15_t)0xe68d, (q15_t)0x7d6c, (q15_t)0xe674, (q15_t)0x7d67, (q15_t)0xe65b, + (q15_t)0x7d62, (q15_t)0xe643, (q15_t)0x7d5d, (q15_t)0xe62a, (q15_t)0x7d58, (q15_t)0xe611, (q15_t)0x7d53, (q15_t)0xe5f9, + (q15_t)0x7d4e, (q15_t)0xe5e0, (q15_t)0x7d49, (q15_t)0xe5c8, (q15_t)0x7d43, (q15_t)0xe5af, (q15_t)0x7d3e, (q15_t)0xe596, + (q15_t)0x7d39, (q15_t)0xe57e, (q15_t)0x7d34, (q15_t)0xe565, (q15_t)0x7d2f, (q15_t)0xe54d, (q15_t)0x7d29, (q15_t)0xe534, + (q15_t)0x7d24, (q15_t)0xe51c, (q15_t)0x7d1f, (q15_t)0xe503, (q15_t)0x7d19, (q15_t)0xe4ea, (q15_t)0x7d14, (q15_t)0xe4d2, + (q15_t)0x7d0f, (q15_t)0xe4b9, (q15_t)0x7d09, (q15_t)0xe4a1, (q15_t)0x7d04, (q15_t)0xe488, (q15_t)0x7cff, (q15_t)0xe470, + (q15_t)0x7cf9, (q15_t)0xe457, (q15_t)0x7cf4, (q15_t)0xe43f, (q15_t)0x7cee, (q15_t)0xe426, (q15_t)0x7ce9, (q15_t)0xe40e, + (q15_t)0x7ce3, (q15_t)0xe3f5, (q15_t)0x7cde, (q15_t)0xe3dc, (q15_t)0x7cd8, (q15_t)0xe3c4, (q15_t)0x7cd3, (q15_t)0xe3ab, + (q15_t)0x7ccd, (q15_t)0xe393, (q15_t)0x7cc8, (q15_t)0xe37a, (q15_t)0x7cc2, (q15_t)0xe362, (q15_t)0x7cbc, (q15_t)0xe349, + (q15_t)0x7cb7, (q15_t)0xe331, (q15_t)0x7cb1, (q15_t)0xe318, (q15_t)0x7cab, (q15_t)0xe300, (q15_t)0x7ca6, (q15_t)0xe2e8, + (q15_t)0x7ca0, (q15_t)0xe2cf, (q15_t)0x7c9a, (q15_t)0xe2b7, (q15_t)0x7c94, (q15_t)0xe29e, (q15_t)0x7c8f, (q15_t)0xe286, + (q15_t)0x7c89, (q15_t)0xe26d, (q15_t)0x7c83, (q15_t)0xe255, (q15_t)0x7c7d, (q15_t)0xe23c, (q15_t)0x7c77, (q15_t)0xe224, + (q15_t)0x7c71, (q15_t)0xe20b, (q15_t)0x7c6c, (q15_t)0xe1f3, (q15_t)0x7c66, (q15_t)0xe1db, (q15_t)0x7c60, (q15_t)0xe1c2, + (q15_t)0x7c5a, (q15_t)0xe1aa, (q15_t)0x7c54, (q15_t)0xe191, (q15_t)0x7c4e, (q15_t)0xe179, (q15_t)0x7c48, (q15_t)0xe160, + (q15_t)0x7c42, (q15_t)0xe148, (q15_t)0x7c3c, (q15_t)0xe130, (q15_t)0x7c36, (q15_t)0xe117, (q15_t)0x7c30, (q15_t)0xe0ff, + (q15_t)0x7c29, (q15_t)0xe0e7, (q15_t)0x7c23, (q15_t)0xe0ce, (q15_t)0x7c1d, (q15_t)0xe0b6, (q15_t)0x7c17, (q15_t)0xe09d, + (q15_t)0x7c11, (q15_t)0xe085, (q15_t)0x7c0b, (q15_t)0xe06d, (q15_t)0x7c05, (q15_t)0xe054, (q15_t)0x7bfe, (q15_t)0xe03c, + (q15_t)0x7bf8, (q15_t)0xe024, (q15_t)0x7bf2, (q15_t)0xe00b, (q15_t)0x7beb, (q15_t)0xdff3, (q15_t)0x7be5, (q15_t)0xdfdb, + (q15_t)0x7bdf, (q15_t)0xdfc2, (q15_t)0x7bd9, (q15_t)0xdfaa, (q15_t)0x7bd2, (q15_t)0xdf92, (q15_t)0x7bcc, (q15_t)0xdf79, + (q15_t)0x7bc5, (q15_t)0xdf61, (q15_t)0x7bbf, (q15_t)0xdf49, (q15_t)0x7bb9, (q15_t)0xdf30, (q15_t)0x7bb2, (q15_t)0xdf18, + (q15_t)0x7bac, (q15_t)0xdf00, (q15_t)0x7ba5, (q15_t)0xdee8, (q15_t)0x7b9f, (q15_t)0xdecf, (q15_t)0x7b98, (q15_t)0xdeb7, + (q15_t)0x7b92, (q15_t)0xde9f, (q15_t)0x7b8b, (q15_t)0xde87, (q15_t)0x7b84, (q15_t)0xde6e, (q15_t)0x7b7e, (q15_t)0xde56, + (q15_t)0x7b77, (q15_t)0xde3e, (q15_t)0x7b71, (q15_t)0xde26, (q15_t)0x7b6a, (q15_t)0xde0d, (q15_t)0x7b63, (q15_t)0xddf5, + (q15_t)0x7b5d, (q15_t)0xdddd, (q15_t)0x7b56, (q15_t)0xddc5, (q15_t)0x7b4f, (q15_t)0xddac, (q15_t)0x7b48, (q15_t)0xdd94, + (q15_t)0x7b42, (q15_t)0xdd7c, (q15_t)0x7b3b, (q15_t)0xdd64, (q15_t)0x7b34, (q15_t)0xdd4c, (q15_t)0x7b2d, (q15_t)0xdd33, + (q15_t)0x7b26, (q15_t)0xdd1b, (q15_t)0x7b1f, (q15_t)0xdd03, (q15_t)0x7b19, (q15_t)0xdceb, (q15_t)0x7b12, (q15_t)0xdcd3, + (q15_t)0x7b0b, (q15_t)0xdcbb, (q15_t)0x7b04, (q15_t)0xdca2, (q15_t)0x7afd, (q15_t)0xdc8a, (q15_t)0x7af6, (q15_t)0xdc72, + (q15_t)0x7aef, (q15_t)0xdc5a, (q15_t)0x7ae8, (q15_t)0xdc42, (q15_t)0x7ae1, (q15_t)0xdc2a, (q15_t)0x7ada, (q15_t)0xdc12, + (q15_t)0x7ad3, (q15_t)0xdbf9, (q15_t)0x7acc, (q15_t)0xdbe1, (q15_t)0x7ac5, (q15_t)0xdbc9, (q15_t)0x7abd, (q15_t)0xdbb1, + (q15_t)0x7ab6, (q15_t)0xdb99, (q15_t)0x7aaf, (q15_t)0xdb81, (q15_t)0x7aa8, (q15_t)0xdb69, (q15_t)0x7aa1, (q15_t)0xdb51, + (q15_t)0x7a9a, (q15_t)0xdb39, (q15_t)0x7a92, (q15_t)0xdb21, (q15_t)0x7a8b, (q15_t)0xdb09, (q15_t)0x7a84, (q15_t)0xdaf1, + (q15_t)0x7a7d, (q15_t)0xdad8, (q15_t)0x7a75, (q15_t)0xdac0, (q15_t)0x7a6e, (q15_t)0xdaa8, (q15_t)0x7a67, (q15_t)0xda90, + (q15_t)0x7a5f, (q15_t)0xda78, (q15_t)0x7a58, (q15_t)0xda60, (q15_t)0x7a50, (q15_t)0xda48, (q15_t)0x7a49, (q15_t)0xda30, + (q15_t)0x7a42, (q15_t)0xda18, (q15_t)0x7a3a, (q15_t)0xda00, (q15_t)0x7a33, (q15_t)0xd9e8, (q15_t)0x7a2b, (q15_t)0xd9d0, + (q15_t)0x7a24, (q15_t)0xd9b8, (q15_t)0x7a1c, (q15_t)0xd9a0, (q15_t)0x7a15, (q15_t)0xd988, (q15_t)0x7a0d, (q15_t)0xd970, + (q15_t)0x7a05, (q15_t)0xd958, (q15_t)0x79fe, (q15_t)0xd940, (q15_t)0x79f6, (q15_t)0xd928, (q15_t)0x79ef, (q15_t)0xd911, + (q15_t)0x79e7, (q15_t)0xd8f9, (q15_t)0x79df, (q15_t)0xd8e1, (q15_t)0x79d8, (q15_t)0xd8c9, (q15_t)0x79d0, (q15_t)0xd8b1, + (q15_t)0x79c8, (q15_t)0xd899, (q15_t)0x79c0, (q15_t)0xd881, (q15_t)0x79b9, (q15_t)0xd869, (q15_t)0x79b1, (q15_t)0xd851, + (q15_t)0x79a9, (q15_t)0xd839, (q15_t)0x79a1, (q15_t)0xd821, (q15_t)0x7999, (q15_t)0xd80a, (q15_t)0x7992, (q15_t)0xd7f2, + (q15_t)0x798a, (q15_t)0xd7da, (q15_t)0x7982, (q15_t)0xd7c2, (q15_t)0x797a, (q15_t)0xd7aa, (q15_t)0x7972, (q15_t)0xd792, + (q15_t)0x796a, (q15_t)0xd77a, (q15_t)0x7962, (q15_t)0xd763, (q15_t)0x795a, (q15_t)0xd74b, (q15_t)0x7952, (q15_t)0xd733, + (q15_t)0x794a, (q15_t)0xd71b, (q15_t)0x7942, (q15_t)0xd703, (q15_t)0x793a, (q15_t)0xd6eb, (q15_t)0x7932, (q15_t)0xd6d4, + (q15_t)0x792a, (q15_t)0xd6bc, (q15_t)0x7922, (q15_t)0xd6a4, (q15_t)0x7919, (q15_t)0xd68c, (q15_t)0x7911, (q15_t)0xd675, + (q15_t)0x7909, (q15_t)0xd65d, (q15_t)0x7901, (q15_t)0xd645, (q15_t)0x78f9, (q15_t)0xd62d, (q15_t)0x78f1, (q15_t)0xd615, + (q15_t)0x78e8, (q15_t)0xd5fe, (q15_t)0x78e0, (q15_t)0xd5e6, (q15_t)0x78d8, (q15_t)0xd5ce, (q15_t)0x78cf, (q15_t)0xd5b7, + (q15_t)0x78c7, (q15_t)0xd59f, (q15_t)0x78bf, (q15_t)0xd587, (q15_t)0x78b6, (q15_t)0xd56f, (q15_t)0x78ae, (q15_t)0xd558, + (q15_t)0x78a6, (q15_t)0xd540, (q15_t)0x789d, (q15_t)0xd528, (q15_t)0x7895, (q15_t)0xd511, (q15_t)0x788c, (q15_t)0xd4f9, + (q15_t)0x7884, (q15_t)0xd4e1, (q15_t)0x787c, (q15_t)0xd4ca, (q15_t)0x7873, (q15_t)0xd4b2, (q15_t)0x786b, (q15_t)0xd49a, + (q15_t)0x7862, (q15_t)0xd483, (q15_t)0x7859, (q15_t)0xd46b, (q15_t)0x7851, (q15_t)0xd453, (q15_t)0x7848, (q15_t)0xd43c, + (q15_t)0x7840, (q15_t)0xd424, (q15_t)0x7837, (q15_t)0xd40d, (q15_t)0x782e, (q15_t)0xd3f5, (q15_t)0x7826, (q15_t)0xd3dd, + (q15_t)0x781d, (q15_t)0xd3c6, (q15_t)0x7814, (q15_t)0xd3ae, (q15_t)0x780c, (q15_t)0xd397, (q15_t)0x7803, (q15_t)0xd37f, + (q15_t)0x77fa, (q15_t)0xd368, (q15_t)0x77f1, (q15_t)0xd350, (q15_t)0x77e9, (q15_t)0xd338, (q15_t)0x77e0, (q15_t)0xd321, + (q15_t)0x77d7, (q15_t)0xd309, (q15_t)0x77ce, (q15_t)0xd2f2, (q15_t)0x77c5, (q15_t)0xd2da, (q15_t)0x77bc, (q15_t)0xd2c3, + (q15_t)0x77b4, (q15_t)0xd2ab, (q15_t)0x77ab, (q15_t)0xd294, (q15_t)0x77a2, (q15_t)0xd27c, (q15_t)0x7799, (q15_t)0xd265, + (q15_t)0x7790, (q15_t)0xd24d, (q15_t)0x7787, (q15_t)0xd236, (q15_t)0x777e, (q15_t)0xd21e, (q15_t)0x7775, (q15_t)0xd207, + (q15_t)0x776c, (q15_t)0xd1ef, (q15_t)0x7763, (q15_t)0xd1d8, (q15_t)0x775a, (q15_t)0xd1c1, (q15_t)0x7751, (q15_t)0xd1a9, + (q15_t)0x7747, (q15_t)0xd192, (q15_t)0x773e, (q15_t)0xd17a, (q15_t)0x7735, (q15_t)0xd163, (q15_t)0x772c, (q15_t)0xd14b, + (q15_t)0x7723, (q15_t)0xd134, (q15_t)0x771a, (q15_t)0xd11d, (q15_t)0x7710, (q15_t)0xd105, (q15_t)0x7707, (q15_t)0xd0ee, + (q15_t)0x76fe, (q15_t)0xd0d7, (q15_t)0x76f5, (q15_t)0xd0bf, (q15_t)0x76eb, (q15_t)0xd0a8, (q15_t)0x76e2, (q15_t)0xd091, + (q15_t)0x76d9, (q15_t)0xd079, (q15_t)0x76cf, (q15_t)0xd062, (q15_t)0x76c6, (q15_t)0xd04b, (q15_t)0x76bd, (q15_t)0xd033, + (q15_t)0x76b3, (q15_t)0xd01c, (q15_t)0x76aa, (q15_t)0xd005, (q15_t)0x76a0, (q15_t)0xcfed, (q15_t)0x7697, (q15_t)0xcfd6, + (q15_t)0x768e, (q15_t)0xcfbf, (q15_t)0x7684, (q15_t)0xcfa7, (q15_t)0x767b, (q15_t)0xcf90, (q15_t)0x7671, (q15_t)0xcf79, + (q15_t)0x7668, (q15_t)0xcf62, (q15_t)0x765e, (q15_t)0xcf4a, (q15_t)0x7654, (q15_t)0xcf33, (q15_t)0x764b, (q15_t)0xcf1c, + (q15_t)0x7641, (q15_t)0xcf05, (q15_t)0x7638, (q15_t)0xceee, (q15_t)0x762e, (q15_t)0xced6, (q15_t)0x7624, (q15_t)0xcebf, + (q15_t)0x761b, (q15_t)0xcea8, (q15_t)0x7611, (q15_t)0xce91, (q15_t)0x7607, (q15_t)0xce7a, (q15_t)0x75fd, (q15_t)0xce62, + (q15_t)0x75f4, (q15_t)0xce4b, (q15_t)0x75ea, (q15_t)0xce34, (q15_t)0x75e0, (q15_t)0xce1d, (q15_t)0x75d6, (q15_t)0xce06, + (q15_t)0x75cc, (q15_t)0xcdef, (q15_t)0x75c3, (q15_t)0xcdd8, (q15_t)0x75b9, (q15_t)0xcdc0, (q15_t)0x75af, (q15_t)0xcda9, + (q15_t)0x75a5, (q15_t)0xcd92, (q15_t)0x759b, (q15_t)0xcd7b, (q15_t)0x7591, (q15_t)0xcd64, (q15_t)0x7587, (q15_t)0xcd4d, + (q15_t)0x757d, (q15_t)0xcd36, (q15_t)0x7573, (q15_t)0xcd1f, (q15_t)0x7569, (q15_t)0xcd08, (q15_t)0x755f, (q15_t)0xccf1, + (q15_t)0x7555, (q15_t)0xccda, (q15_t)0x754b, (q15_t)0xccc3, (q15_t)0x7541, (q15_t)0xccac, (q15_t)0x7537, (q15_t)0xcc95, + (q15_t)0x752d, (q15_t)0xcc7e, (q15_t)0x7523, (q15_t)0xcc67, (q15_t)0x7519, (q15_t)0xcc50, (q15_t)0x750f, (q15_t)0xcc39, + (q15_t)0x7504, (q15_t)0xcc22, (q15_t)0x74fa, (q15_t)0xcc0b, (q15_t)0x74f0, (q15_t)0xcbf4, (q15_t)0x74e6, (q15_t)0xcbdd, + (q15_t)0x74db, (q15_t)0xcbc6, (q15_t)0x74d1, (q15_t)0xcbaf, (q15_t)0x74c7, (q15_t)0xcb98, (q15_t)0x74bd, (q15_t)0xcb81, + (q15_t)0x74b2, (q15_t)0xcb6a, (q15_t)0x74a8, (q15_t)0xcb53, (q15_t)0x749e, (q15_t)0xcb3c, (q15_t)0x7493, (q15_t)0xcb25, + (q15_t)0x7489, (q15_t)0xcb0e, (q15_t)0x747e, (q15_t)0xcaf8, (q15_t)0x7474, (q15_t)0xcae1, (q15_t)0x746a, (q15_t)0xcaca, + (q15_t)0x745f, (q15_t)0xcab3, (q15_t)0x7455, (q15_t)0xca9c, (q15_t)0x744a, (q15_t)0xca85, (q15_t)0x7440, (q15_t)0xca6e, + (q15_t)0x7435, (q15_t)0xca58, (q15_t)0x742b, (q15_t)0xca41, (q15_t)0x7420, (q15_t)0xca2a, (q15_t)0x7415, (q15_t)0xca13, + (q15_t)0x740b, (q15_t)0xc9fc, (q15_t)0x7400, (q15_t)0xc9e6, (q15_t)0x73f6, (q15_t)0xc9cf, (q15_t)0x73eb, (q15_t)0xc9b8, + (q15_t)0x73e0, (q15_t)0xc9a1, (q15_t)0x73d6, (q15_t)0xc98b, (q15_t)0x73cb, (q15_t)0xc974, (q15_t)0x73c0, (q15_t)0xc95d, + (q15_t)0x73b5, (q15_t)0xc946, (q15_t)0x73ab, (q15_t)0xc930, (q15_t)0x73a0, (q15_t)0xc919, (q15_t)0x7395, (q15_t)0xc902, + (q15_t)0x738a, (q15_t)0xc8ec, (q15_t)0x737f, (q15_t)0xc8d5, (q15_t)0x7375, (q15_t)0xc8be, (q15_t)0x736a, (q15_t)0xc8a8, + (q15_t)0x735f, (q15_t)0xc891, (q15_t)0x7354, (q15_t)0xc87a, (q15_t)0x7349, (q15_t)0xc864, (q15_t)0x733e, (q15_t)0xc84d, + (q15_t)0x7333, (q15_t)0xc836, (q15_t)0x7328, (q15_t)0xc820, (q15_t)0x731d, (q15_t)0xc809, (q15_t)0x7312, (q15_t)0xc7f3, + (q15_t)0x7307, (q15_t)0xc7dc, (q15_t)0x72fc, (q15_t)0xc7c5, (q15_t)0x72f1, (q15_t)0xc7af, (q15_t)0x72e6, (q15_t)0xc798, + (q15_t)0x72db, (q15_t)0xc782, (q15_t)0x72d0, (q15_t)0xc76b, (q15_t)0x72c5, (q15_t)0xc755, (q15_t)0x72ba, (q15_t)0xc73e, + (q15_t)0x72af, (q15_t)0xc728, (q15_t)0x72a3, (q15_t)0xc711, (q15_t)0x7298, (q15_t)0xc6fa, (q15_t)0x728d, (q15_t)0xc6e4, + (q15_t)0x7282, (q15_t)0xc6ce, (q15_t)0x7276, (q15_t)0xc6b7, (q15_t)0x726b, (q15_t)0xc6a1, (q15_t)0x7260, (q15_t)0xc68a, + (q15_t)0x7255, (q15_t)0xc674, (q15_t)0x7249, (q15_t)0xc65d, (q15_t)0x723e, (q15_t)0xc647, (q15_t)0x7233, (q15_t)0xc630, + (q15_t)0x7227, (q15_t)0xc61a, (q15_t)0x721c, (q15_t)0xc603, (q15_t)0x7211, (q15_t)0xc5ed, (q15_t)0x7205, (q15_t)0xc5d7, + (q15_t)0x71fa, (q15_t)0xc5c0, (q15_t)0x71ee, (q15_t)0xc5aa, (q15_t)0x71e3, (q15_t)0xc594, (q15_t)0x71d7, (q15_t)0xc57d, + (q15_t)0x71cc, (q15_t)0xc567, (q15_t)0x71c0, (q15_t)0xc551, (q15_t)0x71b5, (q15_t)0xc53a, (q15_t)0x71a9, (q15_t)0xc524, + (q15_t)0x719e, (q15_t)0xc50e, (q15_t)0x7192, (q15_t)0xc4f7, (q15_t)0x7186, (q15_t)0xc4e1, (q15_t)0x717b, (q15_t)0xc4cb, + (q15_t)0x716f, (q15_t)0xc4b4, (q15_t)0x7164, (q15_t)0xc49e, (q15_t)0x7158, (q15_t)0xc488, (q15_t)0x714c, (q15_t)0xc472, + (q15_t)0x7141, (q15_t)0xc45b, (q15_t)0x7135, (q15_t)0xc445, (q15_t)0x7129, (q15_t)0xc42f, (q15_t)0x711d, (q15_t)0xc419, + (q15_t)0x7112, (q15_t)0xc403, (q15_t)0x7106, (q15_t)0xc3ec, (q15_t)0x70fa, (q15_t)0xc3d6, (q15_t)0x70ee, (q15_t)0xc3c0, + (q15_t)0x70e2, (q15_t)0xc3aa, (q15_t)0x70d6, (q15_t)0xc394, (q15_t)0x70cb, (q15_t)0xc37d, (q15_t)0x70bf, (q15_t)0xc367, + (q15_t)0x70b3, (q15_t)0xc351, (q15_t)0x70a7, (q15_t)0xc33b, (q15_t)0x709b, (q15_t)0xc325, (q15_t)0x708f, (q15_t)0xc30f, + (q15_t)0x7083, (q15_t)0xc2f9, (q15_t)0x7077, (q15_t)0xc2e3, (q15_t)0x706b, (q15_t)0xc2cd, (q15_t)0x705f, (q15_t)0xc2b7, + (q15_t)0x7053, (q15_t)0xc2a0, (q15_t)0x7047, (q15_t)0xc28a, (q15_t)0x703b, (q15_t)0xc274, (q15_t)0x702f, (q15_t)0xc25e, + (q15_t)0x7023, (q15_t)0xc248, (q15_t)0x7016, (q15_t)0xc232, (q15_t)0x700a, (q15_t)0xc21c, (q15_t)0x6ffe, (q15_t)0xc206, + (q15_t)0x6ff2, (q15_t)0xc1f0, (q15_t)0x6fe6, (q15_t)0xc1da, (q15_t)0x6fda, (q15_t)0xc1c4, (q15_t)0x6fcd, (q15_t)0xc1ae, + (q15_t)0x6fc1, (q15_t)0xc198, (q15_t)0x6fb5, (q15_t)0xc183, (q15_t)0x6fa9, (q15_t)0xc16d, (q15_t)0x6f9c, (q15_t)0xc157, + (q15_t)0x6f90, (q15_t)0xc141, (q15_t)0x6f84, (q15_t)0xc12b, (q15_t)0x6f77, (q15_t)0xc115, (q15_t)0x6f6b, (q15_t)0xc0ff, + (q15_t)0x6f5f, (q15_t)0xc0e9, (q15_t)0x6f52, (q15_t)0xc0d3, (q15_t)0x6f46, (q15_t)0xc0bd, (q15_t)0x6f39, (q15_t)0xc0a8, + (q15_t)0x6f2d, (q15_t)0xc092, (q15_t)0x6f20, (q15_t)0xc07c, (q15_t)0x6f14, (q15_t)0xc066, (q15_t)0x6f07, (q15_t)0xc050, + (q15_t)0x6efb, (q15_t)0xc03b, (q15_t)0x6eee, (q15_t)0xc025, (q15_t)0x6ee2, (q15_t)0xc00f, (q15_t)0x6ed5, (q15_t)0xbff9, + (q15_t)0x6ec9, (q15_t)0xbfe3, (q15_t)0x6ebc, (q15_t)0xbfce, (q15_t)0x6eaf, (q15_t)0xbfb8, (q15_t)0x6ea3, (q15_t)0xbfa2, + (q15_t)0x6e96, (q15_t)0xbf8d, (q15_t)0x6e89, (q15_t)0xbf77, (q15_t)0x6e7d, (q15_t)0xbf61, (q15_t)0x6e70, (q15_t)0xbf4b, + (q15_t)0x6e63, (q15_t)0xbf36, (q15_t)0x6e57, (q15_t)0xbf20, (q15_t)0x6e4a, (q15_t)0xbf0a, (q15_t)0x6e3d, (q15_t)0xbef5, + (q15_t)0x6e30, (q15_t)0xbedf, (q15_t)0x6e24, (q15_t)0xbeca, (q15_t)0x6e17, (q15_t)0xbeb4, (q15_t)0x6e0a, (q15_t)0xbe9e, + (q15_t)0x6dfd, (q15_t)0xbe89, (q15_t)0x6df0, (q15_t)0xbe73, (q15_t)0x6de3, (q15_t)0xbe5e, (q15_t)0x6dd6, (q15_t)0xbe48, + (q15_t)0x6dca, (q15_t)0xbe32, (q15_t)0x6dbd, (q15_t)0xbe1d, (q15_t)0x6db0, (q15_t)0xbe07, (q15_t)0x6da3, (q15_t)0xbdf2, + (q15_t)0x6d96, (q15_t)0xbddc, (q15_t)0x6d89, (q15_t)0xbdc7, (q15_t)0x6d7c, (q15_t)0xbdb1, (q15_t)0x6d6f, (q15_t)0xbd9c, + (q15_t)0x6d62, (q15_t)0xbd86, (q15_t)0x6d55, (q15_t)0xbd71, (q15_t)0x6d48, (q15_t)0xbd5b, (q15_t)0x6d3a, (q15_t)0xbd46, + (q15_t)0x6d2d, (q15_t)0xbd30, (q15_t)0x6d20, (q15_t)0xbd1b, (q15_t)0x6d13, (q15_t)0xbd06, (q15_t)0x6d06, (q15_t)0xbcf0, + (q15_t)0x6cf9, (q15_t)0xbcdb, (q15_t)0x6cec, (q15_t)0xbcc5, (q15_t)0x6cde, (q15_t)0xbcb0, (q15_t)0x6cd1, (q15_t)0xbc9b, + (q15_t)0x6cc4, (q15_t)0xbc85, (q15_t)0x6cb7, (q15_t)0xbc70, (q15_t)0x6ca9, (q15_t)0xbc5b, (q15_t)0x6c9c, (q15_t)0xbc45, + (q15_t)0x6c8f, (q15_t)0xbc30, (q15_t)0x6c81, (q15_t)0xbc1b, (q15_t)0x6c74, (q15_t)0xbc05, (q15_t)0x6c67, (q15_t)0xbbf0, + (q15_t)0x6c59, (q15_t)0xbbdb, (q15_t)0x6c4c, (q15_t)0xbbc5, (q15_t)0x6c3f, (q15_t)0xbbb0, (q15_t)0x6c31, (q15_t)0xbb9b, + (q15_t)0x6c24, (q15_t)0xbb86, (q15_t)0x6c16, (q15_t)0xbb70, (q15_t)0x6c09, (q15_t)0xbb5b, (q15_t)0x6bfb, (q15_t)0xbb46, + (q15_t)0x6bee, (q15_t)0xbb31, (q15_t)0x6be0, (q15_t)0xbb1c, (q15_t)0x6bd3, (q15_t)0xbb06, (q15_t)0x6bc5, (q15_t)0xbaf1, + (q15_t)0x6bb8, (q15_t)0xbadc, (q15_t)0x6baa, (q15_t)0xbac7, (q15_t)0x6b9c, (q15_t)0xbab2, (q15_t)0x6b8f, (q15_t)0xba9d, + (q15_t)0x6b81, (q15_t)0xba88, (q15_t)0x6b73, (q15_t)0xba73, (q15_t)0x6b66, (q15_t)0xba5d, (q15_t)0x6b58, (q15_t)0xba48, + (q15_t)0x6b4a, (q15_t)0xba33, (q15_t)0x6b3d, (q15_t)0xba1e, (q15_t)0x6b2f, (q15_t)0xba09, (q15_t)0x6b21, (q15_t)0xb9f4, + (q15_t)0x6b13, (q15_t)0xb9df, (q15_t)0x6b06, (q15_t)0xb9ca, (q15_t)0x6af8, (q15_t)0xb9b5, (q15_t)0x6aea, (q15_t)0xb9a0, + (q15_t)0x6adc, (q15_t)0xb98b, (q15_t)0x6ace, (q15_t)0xb976, (q15_t)0x6ac1, (q15_t)0xb961, (q15_t)0x6ab3, (q15_t)0xb94c, + (q15_t)0x6aa5, (q15_t)0xb937, (q15_t)0x6a97, (q15_t)0xb922, (q15_t)0x6a89, (q15_t)0xb90d, (q15_t)0x6a7b, (q15_t)0xb8f8, + (q15_t)0x6a6d, (q15_t)0xb8e4, (q15_t)0x6a5f, (q15_t)0xb8cf, (q15_t)0x6a51, (q15_t)0xb8ba, (q15_t)0x6a43, (q15_t)0xb8a5, + (q15_t)0x6a35, (q15_t)0xb890, (q15_t)0x6a27, (q15_t)0xb87b, (q15_t)0x6a19, (q15_t)0xb866, (q15_t)0x6a0b, (q15_t)0xb852, + (q15_t)0x69fd, (q15_t)0xb83d, (q15_t)0x69ef, (q15_t)0xb828, (q15_t)0x69e1, (q15_t)0xb813, (q15_t)0x69d3, (q15_t)0xb7fe, + (q15_t)0x69c4, (q15_t)0xb7ea, (q15_t)0x69b6, (q15_t)0xb7d5, (q15_t)0x69a8, (q15_t)0xb7c0, (q15_t)0x699a, (q15_t)0xb7ab, + (q15_t)0x698c, (q15_t)0xb797, (q15_t)0x697d, (q15_t)0xb782, (q15_t)0x696f, (q15_t)0xb76d, (q15_t)0x6961, (q15_t)0xb758, + (q15_t)0x6953, (q15_t)0xb744, (q15_t)0x6944, (q15_t)0xb72f, (q15_t)0x6936, (q15_t)0xb71a, (q15_t)0x6928, (q15_t)0xb706, + (q15_t)0x6919, (q15_t)0xb6f1, (q15_t)0x690b, (q15_t)0xb6dd, (q15_t)0x68fd, (q15_t)0xb6c8, (q15_t)0x68ee, (q15_t)0xb6b3, + (q15_t)0x68e0, (q15_t)0xb69f, (q15_t)0x68d1, (q15_t)0xb68a, (q15_t)0x68c3, (q15_t)0xb676, (q15_t)0x68b5, (q15_t)0xb661, + (q15_t)0x68a6, (q15_t)0xb64c, (q15_t)0x6898, (q15_t)0xb638, (q15_t)0x6889, (q15_t)0xb623, (q15_t)0x687b, (q15_t)0xb60f, + (q15_t)0x686c, (q15_t)0xb5fa, (q15_t)0x685e, (q15_t)0xb5e6, (q15_t)0x684f, (q15_t)0xb5d1, (q15_t)0x6840, (q15_t)0xb5bd, + (q15_t)0x6832, (q15_t)0xb5a8, (q15_t)0x6823, (q15_t)0xb594, (q15_t)0x6815, (q15_t)0xb57f, (q15_t)0x6806, (q15_t)0xb56b, + (q15_t)0x67f7, (q15_t)0xb557, (q15_t)0x67e9, (q15_t)0xb542, (q15_t)0x67da, (q15_t)0xb52e, (q15_t)0x67cb, (q15_t)0xb519, + (q15_t)0x67bd, (q15_t)0xb505, (q15_t)0x67ae, (q15_t)0xb4f1, (q15_t)0x679f, (q15_t)0xb4dc, (q15_t)0x6790, (q15_t)0xb4c8, + (q15_t)0x6782, (q15_t)0xb4b4, (q15_t)0x6773, (q15_t)0xb49f, (q15_t)0x6764, (q15_t)0xb48b, (q15_t)0x6755, (q15_t)0xb477, + (q15_t)0x6746, (q15_t)0xb462, (q15_t)0x6737, (q15_t)0xb44e, (q15_t)0x6729, (q15_t)0xb43a, (q15_t)0x671a, (q15_t)0xb426, + (q15_t)0x670b, (q15_t)0xb411, (q15_t)0x66fc, (q15_t)0xb3fd, (q15_t)0x66ed, (q15_t)0xb3e9, (q15_t)0x66de, (q15_t)0xb3d5, + (q15_t)0x66cf, (q15_t)0xb3c1, (q15_t)0x66c0, (q15_t)0xb3ac, (q15_t)0x66b1, (q15_t)0xb398, (q15_t)0x66a2, (q15_t)0xb384, + (q15_t)0x6693, (q15_t)0xb370, (q15_t)0x6684, (q15_t)0xb35c, (q15_t)0x6675, (q15_t)0xb348, (q15_t)0x6666, (q15_t)0xb334, + (q15_t)0x6657, (q15_t)0xb31f, (q15_t)0x6648, (q15_t)0xb30b, (q15_t)0x6639, (q15_t)0xb2f7, (q15_t)0x6629, (q15_t)0xb2e3, + (q15_t)0x661a, (q15_t)0xb2cf, (q15_t)0x660b, (q15_t)0xb2bb, (q15_t)0x65fc, (q15_t)0xb2a7, (q15_t)0x65ed, (q15_t)0xb293, + (q15_t)0x65dd, (q15_t)0xb27f, (q15_t)0x65ce, (q15_t)0xb26b, (q15_t)0x65bf, (q15_t)0xb257, (q15_t)0x65b0, (q15_t)0xb243, + (q15_t)0x65a0, (q15_t)0xb22f, (q15_t)0x6591, (q15_t)0xb21b, (q15_t)0x6582, (q15_t)0xb207, (q15_t)0x6573, (q15_t)0xb1f3, + (q15_t)0x6563, (q15_t)0xb1df, (q15_t)0x6554, (q15_t)0xb1cc, (q15_t)0x6545, (q15_t)0xb1b8, (q15_t)0x6535, (q15_t)0xb1a4, + (q15_t)0x6526, (q15_t)0xb190, (q15_t)0x6516, (q15_t)0xb17c, (q15_t)0x6507, (q15_t)0xb168, (q15_t)0x64f7, (q15_t)0xb154, + (q15_t)0x64e8, (q15_t)0xb141, (q15_t)0x64d9, (q15_t)0xb12d, (q15_t)0x64c9, (q15_t)0xb119, (q15_t)0x64ba, (q15_t)0xb105, + (q15_t)0x64aa, (q15_t)0xb0f1, (q15_t)0x649b, (q15_t)0xb0de, (q15_t)0x648b, (q15_t)0xb0ca, (q15_t)0x647b, (q15_t)0xb0b6, + (q15_t)0x646c, (q15_t)0xb0a2, (q15_t)0x645c, (q15_t)0xb08f, (q15_t)0x644d, (q15_t)0xb07b, (q15_t)0x643d, (q15_t)0xb067, + (q15_t)0x642d, (q15_t)0xb054, (q15_t)0x641e, (q15_t)0xb040, (q15_t)0x640e, (q15_t)0xb02c, (q15_t)0x63fe, (q15_t)0xb019, + (q15_t)0x63ef, (q15_t)0xb005, (q15_t)0x63df, (q15_t)0xaff1, (q15_t)0x63cf, (q15_t)0xafde, (q15_t)0x63c0, (q15_t)0xafca, + (q15_t)0x63b0, (q15_t)0xafb7, (q15_t)0x63a0, (q15_t)0xafa3, (q15_t)0x6390, (q15_t)0xaf90, (q15_t)0x6380, (q15_t)0xaf7c, + (q15_t)0x6371, (q15_t)0xaf69, (q15_t)0x6361, (q15_t)0xaf55, (q15_t)0x6351, (q15_t)0xaf41, (q15_t)0x6341, (q15_t)0xaf2e, + (q15_t)0x6331, (q15_t)0xaf1b, (q15_t)0x6321, (q15_t)0xaf07, (q15_t)0x6311, (q15_t)0xaef4, (q15_t)0x6301, (q15_t)0xaee0, + (q15_t)0x62f2, (q15_t)0xaecd, (q15_t)0x62e2, (q15_t)0xaeb9, (q15_t)0x62d2, (q15_t)0xaea6, (q15_t)0x62c2, (q15_t)0xae92, + (q15_t)0x62b2, (q15_t)0xae7f, (q15_t)0x62a2, (q15_t)0xae6c, (q15_t)0x6292, (q15_t)0xae58, (q15_t)0x6282, (q15_t)0xae45, + (q15_t)0x6271, (q15_t)0xae32, (q15_t)0x6261, (q15_t)0xae1e, (q15_t)0x6251, (q15_t)0xae0b, (q15_t)0x6241, (q15_t)0xadf8, + (q15_t)0x6231, (q15_t)0xade4, (q15_t)0x6221, (q15_t)0xadd1, (q15_t)0x6211, (q15_t)0xadbe, (q15_t)0x6201, (q15_t)0xadab, + (q15_t)0x61f1, (q15_t)0xad97, (q15_t)0x61e0, (q15_t)0xad84, (q15_t)0x61d0, (q15_t)0xad71, (q15_t)0x61c0, (q15_t)0xad5e, + (q15_t)0x61b0, (q15_t)0xad4b, (q15_t)0x619f, (q15_t)0xad37, (q15_t)0x618f, (q15_t)0xad24, (q15_t)0x617f, (q15_t)0xad11, + (q15_t)0x616f, (q15_t)0xacfe, (q15_t)0x615e, (q15_t)0xaceb, (q15_t)0x614e, (q15_t)0xacd8, (q15_t)0x613e, (q15_t)0xacc5, + (q15_t)0x612d, (q15_t)0xacb2, (q15_t)0x611d, (q15_t)0xac9e, (q15_t)0x610d, (q15_t)0xac8b, (q15_t)0x60fc, (q15_t)0xac78, + (q15_t)0x60ec, (q15_t)0xac65, (q15_t)0x60db, (q15_t)0xac52, (q15_t)0x60cb, (q15_t)0xac3f, (q15_t)0x60ba, (q15_t)0xac2c, + (q15_t)0x60aa, (q15_t)0xac19, (q15_t)0x6099, (q15_t)0xac06, (q15_t)0x6089, (q15_t)0xabf3, (q15_t)0x6078, (q15_t)0xabe0, + (q15_t)0x6068, (q15_t)0xabcd, (q15_t)0x6057, (q15_t)0xabbb, (q15_t)0x6047, (q15_t)0xaba8, (q15_t)0x6036, (q15_t)0xab95, + (q15_t)0x6026, (q15_t)0xab82, (q15_t)0x6015, (q15_t)0xab6f, (q15_t)0x6004, (q15_t)0xab5c, (q15_t)0x5ff4, (q15_t)0xab49, + (q15_t)0x5fe3, (q15_t)0xab36, (q15_t)0x5fd3, (q15_t)0xab24, (q15_t)0x5fc2, (q15_t)0xab11, (q15_t)0x5fb1, (q15_t)0xaafe, + (q15_t)0x5fa0, (q15_t)0xaaeb, (q15_t)0x5f90, (q15_t)0xaad8, (q15_t)0x5f7f, (q15_t)0xaac6, (q15_t)0x5f6e, (q15_t)0xaab3, + (q15_t)0x5f5e, (q15_t)0xaaa0, (q15_t)0x5f4d, (q15_t)0xaa8e, (q15_t)0x5f3c, (q15_t)0xaa7b, (q15_t)0x5f2b, (q15_t)0xaa68, + (q15_t)0x5f1a, (q15_t)0xaa55, (q15_t)0x5f0a, (q15_t)0xaa43, (q15_t)0x5ef9, (q15_t)0xaa30, (q15_t)0x5ee8, (q15_t)0xaa1d, + (q15_t)0x5ed7, (q15_t)0xaa0b, (q15_t)0x5ec6, (q15_t)0xa9f8, (q15_t)0x5eb5, (q15_t)0xa9e6, (q15_t)0x5ea4, (q15_t)0xa9d3, + (q15_t)0x5e93, (q15_t)0xa9c0, (q15_t)0x5e82, (q15_t)0xa9ae, (q15_t)0x5e71, (q15_t)0xa99b, (q15_t)0x5e60, (q15_t)0xa989, + (q15_t)0x5e50, (q15_t)0xa976, (q15_t)0x5e3f, (q15_t)0xa964, (q15_t)0x5e2d, (q15_t)0xa951, (q15_t)0x5e1c, (q15_t)0xa93f, + (q15_t)0x5e0b, (q15_t)0xa92c, (q15_t)0x5dfa, (q15_t)0xa91a, (q15_t)0x5de9, (q15_t)0xa907, (q15_t)0x5dd8, (q15_t)0xa8f5, + (q15_t)0x5dc7, (q15_t)0xa8e3, (q15_t)0x5db6, (q15_t)0xa8d0, (q15_t)0x5da5, (q15_t)0xa8be, (q15_t)0x5d94, (q15_t)0xa8ab, + (q15_t)0x5d83, (q15_t)0xa899, (q15_t)0x5d71, (q15_t)0xa887, (q15_t)0x5d60, (q15_t)0xa874, (q15_t)0x5d4f, (q15_t)0xa862, + (q15_t)0x5d3e, (q15_t)0xa850, (q15_t)0x5d2d, (q15_t)0xa83d, (q15_t)0x5d1b, (q15_t)0xa82b, (q15_t)0x5d0a, (q15_t)0xa819, + (q15_t)0x5cf9, (q15_t)0xa807, (q15_t)0x5ce8, (q15_t)0xa7f4, (q15_t)0x5cd6, (q15_t)0xa7e2, (q15_t)0x5cc5, (q15_t)0xa7d0, + (q15_t)0x5cb4, (q15_t)0xa7be, (q15_t)0x5ca2, (q15_t)0xa7ab, (q15_t)0x5c91, (q15_t)0xa799, (q15_t)0x5c80, (q15_t)0xa787, + (q15_t)0x5c6e, (q15_t)0xa775, (q15_t)0x5c5d, (q15_t)0xa763, (q15_t)0x5c4b, (q15_t)0xa751, (q15_t)0x5c3a, (q15_t)0xa73f, + (q15_t)0x5c29, (q15_t)0xa72c, (q15_t)0x5c17, (q15_t)0xa71a, (q15_t)0x5c06, (q15_t)0xa708, (q15_t)0x5bf4, (q15_t)0xa6f6, + (q15_t)0x5be3, (q15_t)0xa6e4, (q15_t)0x5bd1, (q15_t)0xa6d2, (q15_t)0x5bc0, (q15_t)0xa6c0, (q15_t)0x5bae, (q15_t)0xa6ae, + (q15_t)0x5b9d, (q15_t)0xa69c, (q15_t)0x5b8b, (q15_t)0xa68a, (q15_t)0x5b79, (q15_t)0xa678, (q15_t)0x5b68, (q15_t)0xa666, + (q15_t)0x5b56, (q15_t)0xa654, (q15_t)0x5b45, (q15_t)0xa642, (q15_t)0x5b33, (q15_t)0xa630, (q15_t)0x5b21, (q15_t)0xa61f, + (q15_t)0x5b10, (q15_t)0xa60d, (q15_t)0x5afe, (q15_t)0xa5fb, (q15_t)0x5aec, (q15_t)0xa5e9, (q15_t)0x5adb, (q15_t)0xa5d7, + (q15_t)0x5ac9, (q15_t)0xa5c5, (q15_t)0x5ab7, (q15_t)0xa5b3, (q15_t)0x5aa5, (q15_t)0xa5a2, (q15_t)0x5a94, (q15_t)0xa590, + (q15_t)0x5a82, (q15_t)0xa57e, (q15_t)0x5a70, (q15_t)0xa56c, (q15_t)0x5a5e, (q15_t)0xa55b, (q15_t)0x5a4d, (q15_t)0xa549, + (q15_t)0x5a3b, (q15_t)0xa537, (q15_t)0x5a29, (q15_t)0xa525, (q15_t)0x5a17, (q15_t)0xa514, (q15_t)0x5a05, (q15_t)0xa502, + (q15_t)0x59f3, (q15_t)0xa4f0, (q15_t)0x59e1, (q15_t)0xa4df, (q15_t)0x59d0, (q15_t)0xa4cd, (q15_t)0x59be, (q15_t)0xa4bb, + (q15_t)0x59ac, (q15_t)0xa4aa, (q15_t)0x599a, (q15_t)0xa498, (q15_t)0x5988, (q15_t)0xa487, (q15_t)0x5976, (q15_t)0xa475, + (q15_t)0x5964, (q15_t)0xa463, (q15_t)0x5952, (q15_t)0xa452, (q15_t)0x5940, (q15_t)0xa440, (q15_t)0x592e, (q15_t)0xa42f, + (q15_t)0x591c, (q15_t)0xa41d, (q15_t)0x590a, (q15_t)0xa40c, (q15_t)0x58f8, (q15_t)0xa3fa, (q15_t)0x58e6, (q15_t)0xa3e9, + (q15_t)0x58d4, (q15_t)0xa3d7, (q15_t)0x58c1, (q15_t)0xa3c6, (q15_t)0x58af, (q15_t)0xa3b5, (q15_t)0x589d, (q15_t)0xa3a3, + (q15_t)0x588b, (q15_t)0xa392, (q15_t)0x5879, (q15_t)0xa380, (q15_t)0x5867, (q15_t)0xa36f, (q15_t)0x5855, (q15_t)0xa35e, + (q15_t)0x5842, (q15_t)0xa34c, (q15_t)0x5830, (q15_t)0xa33b, (q15_t)0x581e, (q15_t)0xa32a, (q15_t)0x580c, (q15_t)0xa318, + (q15_t)0x57f9, (q15_t)0xa307, (q15_t)0x57e7, (q15_t)0xa2f6, (q15_t)0x57d5, (q15_t)0xa2e5, (q15_t)0x57c3, (q15_t)0xa2d3, + (q15_t)0x57b0, (q15_t)0xa2c2, (q15_t)0x579e, (q15_t)0xa2b1, (q15_t)0x578c, (q15_t)0xa2a0, (q15_t)0x5779, (q15_t)0xa28f, + (q15_t)0x5767, (q15_t)0xa27d, (q15_t)0x5755, (q15_t)0xa26c, (q15_t)0x5742, (q15_t)0xa25b, (q15_t)0x5730, (q15_t)0xa24a, + (q15_t)0x571d, (q15_t)0xa239, (q15_t)0x570b, (q15_t)0xa228, (q15_t)0x56f9, (q15_t)0xa217, (q15_t)0x56e6, (q15_t)0xa206, + (q15_t)0x56d4, (q15_t)0xa1f5, (q15_t)0x56c1, (q15_t)0xa1e4, (q15_t)0x56af, (q15_t)0xa1d3, (q15_t)0x569c, (q15_t)0xa1c1, + (q15_t)0x568a, (q15_t)0xa1b0, (q15_t)0x5677, (q15_t)0xa1a0, (q15_t)0x5665, (q15_t)0xa18f, (q15_t)0x5652, (q15_t)0xa17e, + (q15_t)0x5640, (q15_t)0xa16d, (q15_t)0x562d, (q15_t)0xa15c, (q15_t)0x561a, (q15_t)0xa14b, (q15_t)0x5608, (q15_t)0xa13a, + (q15_t)0x55f5, (q15_t)0xa129, (q15_t)0x55e3, (q15_t)0xa118, (q15_t)0x55d0, (q15_t)0xa107, (q15_t)0x55bd, (q15_t)0xa0f6, + (q15_t)0x55ab, (q15_t)0xa0e6, (q15_t)0x5598, (q15_t)0xa0d5, (q15_t)0x5585, (q15_t)0xa0c4, (q15_t)0x5572, (q15_t)0xa0b3, + (q15_t)0x5560, (q15_t)0xa0a2, (q15_t)0x554d, (q15_t)0xa092, (q15_t)0x553a, (q15_t)0xa081, (q15_t)0x5528, (q15_t)0xa070, + (q15_t)0x5515, (q15_t)0xa060, (q15_t)0x5502, (q15_t)0xa04f, (q15_t)0x54ef, (q15_t)0xa03e, (q15_t)0x54dc, (q15_t)0xa02d, + (q15_t)0x54ca, (q15_t)0xa01d, (q15_t)0x54b7, (q15_t)0xa00c, (q15_t)0x54a4, (q15_t)0x9ffc, (q15_t)0x5491, (q15_t)0x9feb, + (q15_t)0x547e, (q15_t)0x9fda, (q15_t)0x546b, (q15_t)0x9fca, (q15_t)0x5458, (q15_t)0x9fb9, (q15_t)0x5445, (q15_t)0x9fa9, + (q15_t)0x5433, (q15_t)0x9f98, (q15_t)0x5420, (q15_t)0x9f88, (q15_t)0x540d, (q15_t)0x9f77, (q15_t)0x53fa, (q15_t)0x9f67, + (q15_t)0x53e7, (q15_t)0x9f56, (q15_t)0x53d4, (q15_t)0x9f46, (q15_t)0x53c1, (q15_t)0x9f35, (q15_t)0x53ae, (q15_t)0x9f25, + (q15_t)0x539b, (q15_t)0x9f14, (q15_t)0x5388, (q15_t)0x9f04, (q15_t)0x5375, (q15_t)0x9ef3, (q15_t)0x5362, (q15_t)0x9ee3, + (q15_t)0x534e, (q15_t)0x9ed3, (q15_t)0x533b, (q15_t)0x9ec2, (q15_t)0x5328, (q15_t)0x9eb2, (q15_t)0x5315, (q15_t)0x9ea2, + (q15_t)0x5302, (q15_t)0x9e91, (q15_t)0x52ef, (q15_t)0x9e81, (q15_t)0x52dc, (q15_t)0x9e71, (q15_t)0x52c9, (q15_t)0x9e61, + (q15_t)0x52b5, (q15_t)0x9e50, (q15_t)0x52a2, (q15_t)0x9e40, (q15_t)0x528f, (q15_t)0x9e30, (q15_t)0x527c, (q15_t)0x9e20, + (q15_t)0x5269, (q15_t)0x9e0f, (q15_t)0x5255, (q15_t)0x9dff, (q15_t)0x5242, (q15_t)0x9def, (q15_t)0x522f, (q15_t)0x9ddf, + (q15_t)0x521c, (q15_t)0x9dcf, (q15_t)0x5208, (q15_t)0x9dbf, (q15_t)0x51f5, (q15_t)0x9daf, (q15_t)0x51e2, (q15_t)0x9d9f, + (q15_t)0x51ce, (q15_t)0x9d8f, (q15_t)0x51bb, (q15_t)0x9d7e, (q15_t)0x51a8, (q15_t)0x9d6e, (q15_t)0x5194, (q15_t)0x9d5e, + (q15_t)0x5181, (q15_t)0x9d4e, (q15_t)0x516e, (q15_t)0x9d3e, (q15_t)0x515a, (q15_t)0x9d2e, (q15_t)0x5147, (q15_t)0x9d1e, + (q15_t)0x5133, (q15_t)0x9d0e, (q15_t)0x5120, (q15_t)0x9cff, (q15_t)0x510c, (q15_t)0x9cef, (q15_t)0x50f9, (q15_t)0x9cdf, + (q15_t)0x50e5, (q15_t)0x9ccf, (q15_t)0x50d2, (q15_t)0x9cbf, (q15_t)0x50bf, (q15_t)0x9caf, (q15_t)0x50ab, (q15_t)0x9c9f, + (q15_t)0x5097, (q15_t)0x9c8f, (q15_t)0x5084, (q15_t)0x9c80, (q15_t)0x5070, (q15_t)0x9c70, (q15_t)0x505d, (q15_t)0x9c60, + (q15_t)0x5049, (q15_t)0x9c50, (q15_t)0x5036, (q15_t)0x9c40, (q15_t)0x5022, (q15_t)0x9c31, (q15_t)0x500f, (q15_t)0x9c21, + (q15_t)0x4ffb, (q15_t)0x9c11, (q15_t)0x4fe7, (q15_t)0x9c02, (q15_t)0x4fd4, (q15_t)0x9bf2, (q15_t)0x4fc0, (q15_t)0x9be2, + (q15_t)0x4fac, (q15_t)0x9bd3, (q15_t)0x4f99, (q15_t)0x9bc3, (q15_t)0x4f85, (q15_t)0x9bb3, (q15_t)0x4f71, (q15_t)0x9ba4, + (q15_t)0x4f5e, (q15_t)0x9b94, (q15_t)0x4f4a, (q15_t)0x9b85, (q15_t)0x4f36, (q15_t)0x9b75, (q15_t)0x4f22, (q15_t)0x9b65, + (q15_t)0x4f0f, (q15_t)0x9b56, (q15_t)0x4efb, (q15_t)0x9b46, (q15_t)0x4ee7, (q15_t)0x9b37, (q15_t)0x4ed3, (q15_t)0x9b27, + (q15_t)0x4ebf, (q15_t)0x9b18, (q15_t)0x4eac, (q15_t)0x9b09, (q15_t)0x4e98, (q15_t)0x9af9, (q15_t)0x4e84, (q15_t)0x9aea, + (q15_t)0x4e70, (q15_t)0x9ada, (q15_t)0x4e5c, (q15_t)0x9acb, (q15_t)0x4e48, (q15_t)0x9abb, (q15_t)0x4e34, (q15_t)0x9aac, + (q15_t)0x4e21, (q15_t)0x9a9d, (q15_t)0x4e0d, (q15_t)0x9a8d, (q15_t)0x4df9, (q15_t)0x9a7e, (q15_t)0x4de5, (q15_t)0x9a6f, + (q15_t)0x4dd1, (q15_t)0x9a60, (q15_t)0x4dbd, (q15_t)0x9a50, (q15_t)0x4da9, (q15_t)0x9a41, (q15_t)0x4d95, (q15_t)0x9a32, + (q15_t)0x4d81, (q15_t)0x9a23, (q15_t)0x4d6d, (q15_t)0x9a13, (q15_t)0x4d59, (q15_t)0x9a04, (q15_t)0x4d45, (q15_t)0x99f5, + (q15_t)0x4d31, (q15_t)0x99e6, (q15_t)0x4d1d, (q15_t)0x99d7, (q15_t)0x4d09, (q15_t)0x99c7, (q15_t)0x4cf5, (q15_t)0x99b8, + (q15_t)0x4ce1, (q15_t)0x99a9, (q15_t)0x4ccc, (q15_t)0x999a, (q15_t)0x4cb8, (q15_t)0x998b, (q15_t)0x4ca4, (q15_t)0x997c, + (q15_t)0x4c90, (q15_t)0x996d, (q15_t)0x4c7c, (q15_t)0x995e, (q15_t)0x4c68, (q15_t)0x994f, (q15_t)0x4c54, (q15_t)0x9940, + (q15_t)0x4c3f, (q15_t)0x9931, (q15_t)0x4c2b, (q15_t)0x9922, (q15_t)0x4c17, (q15_t)0x9913, (q15_t)0x4c03, (q15_t)0x9904, + (q15_t)0x4bef, (q15_t)0x98f5, (q15_t)0x4bda, (q15_t)0x98e6, (q15_t)0x4bc6, (q15_t)0x98d7, (q15_t)0x4bb2, (q15_t)0x98c9, + (q15_t)0x4b9e, (q15_t)0x98ba, (q15_t)0x4b89, (q15_t)0x98ab, (q15_t)0x4b75, (q15_t)0x989c, (q15_t)0x4b61, (q15_t)0x988d, + (q15_t)0x4b4c, (q15_t)0x987e, (q15_t)0x4b38, (q15_t)0x9870, (q15_t)0x4b24, (q15_t)0x9861, (q15_t)0x4b0f, (q15_t)0x9852, + (q15_t)0x4afb, (q15_t)0x9843, (q15_t)0x4ae7, (q15_t)0x9835, (q15_t)0x4ad2, (q15_t)0x9826, (q15_t)0x4abe, (q15_t)0x9817, + (q15_t)0x4aa9, (q15_t)0x9809, (q15_t)0x4a95, (q15_t)0x97fa, (q15_t)0x4a81, (q15_t)0x97eb, (q15_t)0x4a6c, (q15_t)0x97dd, + (q15_t)0x4a58, (q15_t)0x97ce, (q15_t)0x4a43, (q15_t)0x97c0, (q15_t)0x4a2f, (q15_t)0x97b1, (q15_t)0x4a1a, (q15_t)0x97a2, + (q15_t)0x4a06, (q15_t)0x9794, (q15_t)0x49f1, (q15_t)0x9785, (q15_t)0x49dd, (q15_t)0x9777, (q15_t)0x49c8, (q15_t)0x9768, + (q15_t)0x49b4, (q15_t)0x975a, (q15_t)0x499f, (q15_t)0x974b, (q15_t)0x498a, (q15_t)0x973d, (q15_t)0x4976, (q15_t)0x972f, + (q15_t)0x4961, (q15_t)0x9720, (q15_t)0x494d, (q15_t)0x9712, (q15_t)0x4938, (q15_t)0x9703, (q15_t)0x4923, (q15_t)0x96f5, + (q15_t)0x490f, (q15_t)0x96e7, (q15_t)0x48fa, (q15_t)0x96d8, (q15_t)0x48e6, (q15_t)0x96ca, (q15_t)0x48d1, (q15_t)0x96bc, + (q15_t)0x48bc, (q15_t)0x96ad, (q15_t)0x48a8, (q15_t)0x969f, (q15_t)0x4893, (q15_t)0x9691, (q15_t)0x487e, (q15_t)0x9683, + (q15_t)0x4869, (q15_t)0x9674, (q15_t)0x4855, (q15_t)0x9666, (q15_t)0x4840, (q15_t)0x9658, (q15_t)0x482b, (q15_t)0x964a, + (q15_t)0x4816, (q15_t)0x963c, (q15_t)0x4802, (q15_t)0x962d, (q15_t)0x47ed, (q15_t)0x961f, (q15_t)0x47d8, (q15_t)0x9611, + (q15_t)0x47c3, (q15_t)0x9603, (q15_t)0x47ae, (q15_t)0x95f5, (q15_t)0x479a, (q15_t)0x95e7, (q15_t)0x4785, (q15_t)0x95d9, + (q15_t)0x4770, (q15_t)0x95cb, (q15_t)0x475b, (q15_t)0x95bd, (q15_t)0x4746, (q15_t)0x95af, (q15_t)0x4731, (q15_t)0x95a1, + (q15_t)0x471c, (q15_t)0x9593, (q15_t)0x4708, (q15_t)0x9585, (q15_t)0x46f3, (q15_t)0x9577, (q15_t)0x46de, (q15_t)0x9569, + (q15_t)0x46c9, (q15_t)0x955b, (q15_t)0x46b4, (q15_t)0x954d, (q15_t)0x469f, (q15_t)0x953f, (q15_t)0x468a, (q15_t)0x9532, + (q15_t)0x4675, (q15_t)0x9524, (q15_t)0x4660, (q15_t)0x9516, (q15_t)0x464b, (q15_t)0x9508, (q15_t)0x4636, (q15_t)0x94fa, + (q15_t)0x4621, (q15_t)0x94ed, (q15_t)0x460c, (q15_t)0x94df, (q15_t)0x45f7, (q15_t)0x94d1, (q15_t)0x45e2, (q15_t)0x94c3, + (q15_t)0x45cd, (q15_t)0x94b6, (q15_t)0x45b8, (q15_t)0x94a8, (q15_t)0x45a3, (q15_t)0x949a, (q15_t)0x458d, (q15_t)0x948d, + (q15_t)0x4578, (q15_t)0x947f, (q15_t)0x4563, (q15_t)0x9471, (q15_t)0x454e, (q15_t)0x9464, (q15_t)0x4539, (q15_t)0x9456, + (q15_t)0x4524, (q15_t)0x9448, (q15_t)0x450f, (q15_t)0x943b, (q15_t)0x44fa, (q15_t)0x942d, (q15_t)0x44e4, (q15_t)0x9420, + (q15_t)0x44cf, (q15_t)0x9412, (q15_t)0x44ba, (q15_t)0x9405, (q15_t)0x44a5, (q15_t)0x93f7, (q15_t)0x4490, (q15_t)0x93ea, + (q15_t)0x447a, (q15_t)0x93dc, (q15_t)0x4465, (q15_t)0x93cf, (q15_t)0x4450, (q15_t)0x93c1, (q15_t)0x443b, (q15_t)0x93b4, + (q15_t)0x4425, (q15_t)0x93a7, (q15_t)0x4410, (q15_t)0x9399, (q15_t)0x43fb, (q15_t)0x938c, (q15_t)0x43e5, (q15_t)0x937f, + (q15_t)0x43d0, (q15_t)0x9371, (q15_t)0x43bb, (q15_t)0x9364, (q15_t)0x43a5, (q15_t)0x9357, (q15_t)0x4390, (q15_t)0x9349, + (q15_t)0x437b, (q15_t)0x933c, (q15_t)0x4365, (q15_t)0x932f, (q15_t)0x4350, (q15_t)0x9322, (q15_t)0x433b, (q15_t)0x9314, + (q15_t)0x4325, (q15_t)0x9307, (q15_t)0x4310, (q15_t)0x92fa, (q15_t)0x42fa, (q15_t)0x92ed, (q15_t)0x42e5, (q15_t)0x92e0, + (q15_t)0x42d0, (q15_t)0x92d3, (q15_t)0x42ba, (q15_t)0x92c6, (q15_t)0x42a5, (q15_t)0x92b8, (q15_t)0x428f, (q15_t)0x92ab, + (q15_t)0x427a, (q15_t)0x929e, (q15_t)0x4264, (q15_t)0x9291, (q15_t)0x424f, (q15_t)0x9284, (q15_t)0x4239, (q15_t)0x9277, + (q15_t)0x4224, (q15_t)0x926a, (q15_t)0x420e, (q15_t)0x925d, (q15_t)0x41f9, (q15_t)0x9250, (q15_t)0x41e3, (q15_t)0x9243, + (q15_t)0x41ce, (q15_t)0x9236, (q15_t)0x41b8, (q15_t)0x922a, (q15_t)0x41a2, (q15_t)0x921d, (q15_t)0x418d, (q15_t)0x9210, + (q15_t)0x4177, (q15_t)0x9203, (q15_t)0x4162, (q15_t)0x91f6, (q15_t)0x414c, (q15_t)0x91e9, (q15_t)0x4136, (q15_t)0x91dc, + (q15_t)0x4121, (q15_t)0x91d0, (q15_t)0x410b, (q15_t)0x91c3, (q15_t)0x40f6, (q15_t)0x91b6, (q15_t)0x40e0, (q15_t)0x91a9, + (q15_t)0x40ca, (q15_t)0x919d, (q15_t)0x40b5, (q15_t)0x9190, (q15_t)0x409f, (q15_t)0x9183, (q15_t)0x4089, (q15_t)0x9177, + (q15_t)0x4073, (q15_t)0x916a, (q15_t)0x405e, (q15_t)0x915d, (q15_t)0x4048, (q15_t)0x9151, (q15_t)0x4032, (q15_t)0x9144, + (q15_t)0x401d, (q15_t)0x9137, (q15_t)0x4007, (q15_t)0x912b, (q15_t)0x3ff1, (q15_t)0x911e, (q15_t)0x3fdb, (q15_t)0x9112, + (q15_t)0x3fc5, (q15_t)0x9105, (q15_t)0x3fb0, (q15_t)0x90f9, (q15_t)0x3f9a, (q15_t)0x90ec, (q15_t)0x3f84, (q15_t)0x90e0, + (q15_t)0x3f6e, (q15_t)0x90d3, (q15_t)0x3f58, (q15_t)0x90c7, (q15_t)0x3f43, (q15_t)0x90ba, (q15_t)0x3f2d, (q15_t)0x90ae, + (q15_t)0x3f17, (q15_t)0x90a1, (q15_t)0x3f01, (q15_t)0x9095, (q15_t)0x3eeb, (q15_t)0x9089, (q15_t)0x3ed5, (q15_t)0x907c, + (q15_t)0x3ebf, (q15_t)0x9070, (q15_t)0x3ea9, (q15_t)0x9064, (q15_t)0x3e93, (q15_t)0x9057, (q15_t)0x3e7d, (q15_t)0x904b, + (q15_t)0x3e68, (q15_t)0x903f, (q15_t)0x3e52, (q15_t)0x9033, (q15_t)0x3e3c, (q15_t)0x9026, (q15_t)0x3e26, (q15_t)0x901a, + (q15_t)0x3e10, (q15_t)0x900e, (q15_t)0x3dfa, (q15_t)0x9002, (q15_t)0x3de4, (q15_t)0x8ff6, (q15_t)0x3dce, (q15_t)0x8fea, + (q15_t)0x3db8, (q15_t)0x8fdd, (q15_t)0x3da2, (q15_t)0x8fd1, (q15_t)0x3d8c, (q15_t)0x8fc5, (q15_t)0x3d76, (q15_t)0x8fb9, + (q15_t)0x3d60, (q15_t)0x8fad, (q15_t)0x3d49, (q15_t)0x8fa1, (q15_t)0x3d33, (q15_t)0x8f95, (q15_t)0x3d1d, (q15_t)0x8f89, + (q15_t)0x3d07, (q15_t)0x8f7d, (q15_t)0x3cf1, (q15_t)0x8f71, (q15_t)0x3cdb, (q15_t)0x8f65, (q15_t)0x3cc5, (q15_t)0x8f59, + (q15_t)0x3caf, (q15_t)0x8f4d, (q15_t)0x3c99, (q15_t)0x8f41, (q15_t)0x3c83, (q15_t)0x8f35, (q15_t)0x3c6c, (q15_t)0x8f2a, + (q15_t)0x3c56, (q15_t)0x8f1e, (q15_t)0x3c40, (q15_t)0x8f12, (q15_t)0x3c2a, (q15_t)0x8f06, (q15_t)0x3c14, (q15_t)0x8efa, + (q15_t)0x3bfd, (q15_t)0x8eee, (q15_t)0x3be7, (q15_t)0x8ee3, (q15_t)0x3bd1, (q15_t)0x8ed7, (q15_t)0x3bbb, (q15_t)0x8ecb, + (q15_t)0x3ba5, (q15_t)0x8ebf, (q15_t)0x3b8e, (q15_t)0x8eb4, (q15_t)0x3b78, (q15_t)0x8ea8, (q15_t)0x3b62, (q15_t)0x8e9c, + (q15_t)0x3b4c, (q15_t)0x8e91, (q15_t)0x3b35, (q15_t)0x8e85, (q15_t)0x3b1f, (q15_t)0x8e7a, (q15_t)0x3b09, (q15_t)0x8e6e, + (q15_t)0x3af2, (q15_t)0x8e62, (q15_t)0x3adc, (q15_t)0x8e57, (q15_t)0x3ac6, (q15_t)0x8e4b, (q15_t)0x3aaf, (q15_t)0x8e40, + (q15_t)0x3a99, (q15_t)0x8e34, (q15_t)0x3a83, (q15_t)0x8e29, (q15_t)0x3a6c, (q15_t)0x8e1d, (q15_t)0x3a56, (q15_t)0x8e12, + (q15_t)0x3a40, (q15_t)0x8e06, (q15_t)0x3a29, (q15_t)0x8dfb, (q15_t)0x3a13, (q15_t)0x8def, (q15_t)0x39fd, (q15_t)0x8de4, + (q15_t)0x39e6, (q15_t)0x8dd9, (q15_t)0x39d0, (q15_t)0x8dcd, (q15_t)0x39b9, (q15_t)0x8dc2, (q15_t)0x39a3, (q15_t)0x8db7, + (q15_t)0x398c, (q15_t)0x8dab, (q15_t)0x3976, (q15_t)0x8da0, (q15_t)0x395f, (q15_t)0x8d95, (q15_t)0x3949, (q15_t)0x8d8a, + (q15_t)0x3932, (q15_t)0x8d7e, (q15_t)0x391c, (q15_t)0x8d73, (q15_t)0x3906, (q15_t)0x8d68, (q15_t)0x38ef, (q15_t)0x8d5d, + (q15_t)0x38d8, (q15_t)0x8d51, (q15_t)0x38c2, (q15_t)0x8d46, (q15_t)0x38ab, (q15_t)0x8d3b, (q15_t)0x3895, (q15_t)0x8d30, + (q15_t)0x387e, (q15_t)0x8d25, (q15_t)0x3868, (q15_t)0x8d1a, (q15_t)0x3851, (q15_t)0x8d0f, (q15_t)0x383b, (q15_t)0x8d04, + (q15_t)0x3824, (q15_t)0x8cf9, (q15_t)0x380d, (q15_t)0x8cee, (q15_t)0x37f7, (q15_t)0x8ce3, (q15_t)0x37e0, (q15_t)0x8cd8, + (q15_t)0x37ca, (q15_t)0x8ccd, (q15_t)0x37b3, (q15_t)0x8cc2, (q15_t)0x379c, (q15_t)0x8cb7, (q15_t)0x3786, (q15_t)0x8cac, + (q15_t)0x376f, (q15_t)0x8ca1, (q15_t)0x3758, (q15_t)0x8c96, (q15_t)0x3742, (q15_t)0x8c8b, (q15_t)0x372b, (q15_t)0x8c81, + (q15_t)0x3714, (q15_t)0x8c76, (q15_t)0x36fe, (q15_t)0x8c6b, (q15_t)0x36e7, (q15_t)0x8c60, (q15_t)0x36d0, (q15_t)0x8c55, + (q15_t)0x36ba, (q15_t)0x8c4b, (q15_t)0x36a3, (q15_t)0x8c40, (q15_t)0x368c, (q15_t)0x8c35, (q15_t)0x3675, (q15_t)0x8c2a, + (q15_t)0x365f, (q15_t)0x8c20, (q15_t)0x3648, (q15_t)0x8c15, (q15_t)0x3631, (q15_t)0x8c0a, (q15_t)0x361a, (q15_t)0x8c00, + (q15_t)0x3604, (q15_t)0x8bf5, (q15_t)0x35ed, (q15_t)0x8beb, (q15_t)0x35d6, (q15_t)0x8be0, (q15_t)0x35bf, (q15_t)0x8bd5, + (q15_t)0x35a8, (q15_t)0x8bcb, (q15_t)0x3592, (q15_t)0x8bc0, (q15_t)0x357b, (q15_t)0x8bb6, (q15_t)0x3564, (q15_t)0x8bab, + (q15_t)0x354d, (q15_t)0x8ba1, (q15_t)0x3536, (q15_t)0x8b96, (q15_t)0x351f, (q15_t)0x8b8c, (q15_t)0x3508, (q15_t)0x8b82, + (q15_t)0x34f2, (q15_t)0x8b77, (q15_t)0x34db, (q15_t)0x8b6d, (q15_t)0x34c4, (q15_t)0x8b62, (q15_t)0x34ad, (q15_t)0x8b58, + (q15_t)0x3496, (q15_t)0x8b4e, (q15_t)0x347f, (q15_t)0x8b43, (q15_t)0x3468, (q15_t)0x8b39, (q15_t)0x3451, (q15_t)0x8b2f, + (q15_t)0x343a, (q15_t)0x8b25, (q15_t)0x3423, (q15_t)0x8b1a, (q15_t)0x340c, (q15_t)0x8b10, (q15_t)0x33f5, (q15_t)0x8b06, + (q15_t)0x33de, (q15_t)0x8afc, (q15_t)0x33c7, (q15_t)0x8af1, (q15_t)0x33b0, (q15_t)0x8ae7, (q15_t)0x3399, (q15_t)0x8add, + (q15_t)0x3382, (q15_t)0x8ad3, (q15_t)0x336b, (q15_t)0x8ac9, (q15_t)0x3354, (q15_t)0x8abf, (q15_t)0x333d, (q15_t)0x8ab5, + (q15_t)0x3326, (q15_t)0x8aab, (q15_t)0x330f, (q15_t)0x8aa1, (q15_t)0x32f8, (q15_t)0x8a97, (q15_t)0x32e1, (q15_t)0x8a8d, + (q15_t)0x32ca, (q15_t)0x8a83, (q15_t)0x32b3, (q15_t)0x8a79, (q15_t)0x329c, (q15_t)0x8a6f, (q15_t)0x3285, (q15_t)0x8a65, + (q15_t)0x326e, (q15_t)0x8a5b, (q15_t)0x3257, (q15_t)0x8a51, (q15_t)0x3240, (q15_t)0x8a47, (q15_t)0x3228, (q15_t)0x8a3d, + (q15_t)0x3211, (q15_t)0x8a34, (q15_t)0x31fa, (q15_t)0x8a2a, (q15_t)0x31e3, (q15_t)0x8a20, (q15_t)0x31cc, (q15_t)0x8a16, + (q15_t)0x31b5, (q15_t)0x8a0c, (q15_t)0x319e, (q15_t)0x8a03, (q15_t)0x3186, (q15_t)0x89f9, (q15_t)0x316f, (q15_t)0x89ef, + (q15_t)0x3158, (q15_t)0x89e5, (q15_t)0x3141, (q15_t)0x89dc, (q15_t)0x312a, (q15_t)0x89d2, (q15_t)0x3112, (q15_t)0x89c8, + (q15_t)0x30fb, (q15_t)0x89bf, (q15_t)0x30e4, (q15_t)0x89b5, (q15_t)0x30cd, (q15_t)0x89ac, (q15_t)0x30b6, (q15_t)0x89a2, + (q15_t)0x309e, (q15_t)0x8998, (q15_t)0x3087, (q15_t)0x898f, (q15_t)0x3070, (q15_t)0x8985, (q15_t)0x3059, (q15_t)0x897c, + (q15_t)0x3041, (q15_t)0x8972, (q15_t)0x302a, (q15_t)0x8969, (q15_t)0x3013, (q15_t)0x8960, (q15_t)0x2ffb, (q15_t)0x8956, + (q15_t)0x2fe4, (q15_t)0x894d, (q15_t)0x2fcd, (q15_t)0x8943, (q15_t)0x2fb5, (q15_t)0x893a, (q15_t)0x2f9e, (q15_t)0x8931, + (q15_t)0x2f87, (q15_t)0x8927, (q15_t)0x2f6f, (q15_t)0x891e, (q15_t)0x2f58, (q15_t)0x8915, (q15_t)0x2f41, (q15_t)0x890b, + (q15_t)0x2f29, (q15_t)0x8902, (q15_t)0x2f12, (q15_t)0x88f9, (q15_t)0x2efb, (q15_t)0x88f0, (q15_t)0x2ee3, (q15_t)0x88e6, + (q15_t)0x2ecc, (q15_t)0x88dd, (q15_t)0x2eb5, (q15_t)0x88d4, (q15_t)0x2e9d, (q15_t)0x88cb, (q15_t)0x2e86, (q15_t)0x88c2, + (q15_t)0x2e6e, (q15_t)0x88b9, (q15_t)0x2e57, (q15_t)0x88af, (q15_t)0x2e3f, (q15_t)0x88a6, (q15_t)0x2e28, (q15_t)0x889d, + (q15_t)0x2e11, (q15_t)0x8894, (q15_t)0x2df9, (q15_t)0x888b, (q15_t)0x2de2, (q15_t)0x8882, (q15_t)0x2dca, (q15_t)0x8879, + (q15_t)0x2db3, (q15_t)0x8870, (q15_t)0x2d9b, (q15_t)0x8867, (q15_t)0x2d84, (q15_t)0x885e, (q15_t)0x2d6c, (q15_t)0x8855, + (q15_t)0x2d55, (q15_t)0x884c, (q15_t)0x2d3d, (q15_t)0x8844, (q15_t)0x2d26, (q15_t)0x883b, (q15_t)0x2d0e, (q15_t)0x8832, + (q15_t)0x2cf7, (q15_t)0x8829, (q15_t)0x2cdf, (q15_t)0x8820, (q15_t)0x2cc8, (q15_t)0x8817, (q15_t)0x2cb0, (q15_t)0x880f, + (q15_t)0x2c98, (q15_t)0x8806, (q15_t)0x2c81, (q15_t)0x87fd, (q15_t)0x2c69, (q15_t)0x87f4, (q15_t)0x2c52, (q15_t)0x87ec, + (q15_t)0x2c3a, (q15_t)0x87e3, (q15_t)0x2c23, (q15_t)0x87da, (q15_t)0x2c0b, (q15_t)0x87d2, (q15_t)0x2bf3, (q15_t)0x87c9, + (q15_t)0x2bdc, (q15_t)0x87c0, (q15_t)0x2bc4, (q15_t)0x87b8, (q15_t)0x2bad, (q15_t)0x87af, (q15_t)0x2b95, (q15_t)0x87a7, + (q15_t)0x2b7d, (q15_t)0x879e, (q15_t)0x2b66, (q15_t)0x8795, (q15_t)0x2b4e, (q15_t)0x878d, (q15_t)0x2b36, (q15_t)0x8784, + (q15_t)0x2b1f, (q15_t)0x877c, (q15_t)0x2b07, (q15_t)0x8774, (q15_t)0x2aef, (q15_t)0x876b, (q15_t)0x2ad8, (q15_t)0x8763, + (q15_t)0x2ac0, (q15_t)0x875a, (q15_t)0x2aa8, (q15_t)0x8752, (q15_t)0x2a91, (q15_t)0x874a, (q15_t)0x2a79, (q15_t)0x8741, + (q15_t)0x2a61, (q15_t)0x8739, (q15_t)0x2a49, (q15_t)0x8731, (q15_t)0x2a32, (q15_t)0x8728, (q15_t)0x2a1a, (q15_t)0x8720, + (q15_t)0x2a02, (q15_t)0x8718, (q15_t)0x29eb, (q15_t)0x870f, (q15_t)0x29d3, (q15_t)0x8707, (q15_t)0x29bb, (q15_t)0x86ff, + (q15_t)0x29a3, (q15_t)0x86f7, (q15_t)0x298b, (q15_t)0x86ef, (q15_t)0x2974, (q15_t)0x86e7, (q15_t)0x295c, (q15_t)0x86de, + (q15_t)0x2944, (q15_t)0x86d6, (q15_t)0x292c, (q15_t)0x86ce, (q15_t)0x2915, (q15_t)0x86c6, (q15_t)0x28fd, (q15_t)0x86be, + (q15_t)0x28e5, (q15_t)0x86b6, (q15_t)0x28cd, (q15_t)0x86ae, (q15_t)0x28b5, (q15_t)0x86a6, (q15_t)0x289d, (q15_t)0x869e, + (q15_t)0x2886, (q15_t)0x8696, (q15_t)0x286e, (q15_t)0x868e, (q15_t)0x2856, (q15_t)0x8686, (q15_t)0x283e, (q15_t)0x867e, + (q15_t)0x2826, (q15_t)0x8676, (q15_t)0x280e, (q15_t)0x866e, (q15_t)0x27f6, (q15_t)0x8667, (q15_t)0x27df, (q15_t)0x865f, + (q15_t)0x27c7, (q15_t)0x8657, (q15_t)0x27af, (q15_t)0x864f, (q15_t)0x2797, (q15_t)0x8647, (q15_t)0x277f, (q15_t)0x8640, + (q15_t)0x2767, (q15_t)0x8638, (q15_t)0x274f, (q15_t)0x8630, (q15_t)0x2737, (q15_t)0x8628, (q15_t)0x271f, (q15_t)0x8621, + (q15_t)0x2707, (q15_t)0x8619, (q15_t)0x26ef, (q15_t)0x8611, (q15_t)0x26d8, (q15_t)0x860a, (q15_t)0x26c0, (q15_t)0x8602, + (q15_t)0x26a8, (q15_t)0x85fb, (q15_t)0x2690, (q15_t)0x85f3, (q15_t)0x2678, (q15_t)0x85eb, (q15_t)0x2660, (q15_t)0x85e4, + (q15_t)0x2648, (q15_t)0x85dc, (q15_t)0x2630, (q15_t)0x85d5, (q15_t)0x2618, (q15_t)0x85cd, (q15_t)0x2600, (q15_t)0x85c6, + (q15_t)0x25e8, (q15_t)0x85be, (q15_t)0x25d0, (q15_t)0x85b7, (q15_t)0x25b8, (q15_t)0x85b0, (q15_t)0x25a0, (q15_t)0x85a8, + (q15_t)0x2588, (q15_t)0x85a1, (q15_t)0x2570, (q15_t)0x8599, (q15_t)0x2558, (q15_t)0x8592, (q15_t)0x2540, (q15_t)0x858b, + (q15_t)0x2528, (q15_t)0x8583, (q15_t)0x250f, (q15_t)0x857c, (q15_t)0x24f7, (q15_t)0x8575, (q15_t)0x24df, (q15_t)0x856e, + (q15_t)0x24c7, (q15_t)0x8566, (q15_t)0x24af, (q15_t)0x855f, (q15_t)0x2497, (q15_t)0x8558, (q15_t)0x247f, (q15_t)0x8551, + (q15_t)0x2467, (q15_t)0x854a, (q15_t)0x244f, (q15_t)0x8543, (q15_t)0x2437, (q15_t)0x853b, (q15_t)0x241f, (q15_t)0x8534, + (q15_t)0x2407, (q15_t)0x852d, (q15_t)0x23ee, (q15_t)0x8526, (q15_t)0x23d6, (q15_t)0x851f, (q15_t)0x23be, (q15_t)0x8518, + (q15_t)0x23a6, (q15_t)0x8511, (q15_t)0x238e, (q15_t)0x850a, (q15_t)0x2376, (q15_t)0x8503, (q15_t)0x235e, (q15_t)0x84fc, + (q15_t)0x2345, (q15_t)0x84f5, (q15_t)0x232d, (q15_t)0x84ee, (q15_t)0x2315, (q15_t)0x84e7, (q15_t)0x22fd, (q15_t)0x84e1, + (q15_t)0x22e5, (q15_t)0x84da, (q15_t)0x22cd, (q15_t)0x84d3, (q15_t)0x22b4, (q15_t)0x84cc, (q15_t)0x229c, (q15_t)0x84c5, + (q15_t)0x2284, (q15_t)0x84be, (q15_t)0x226c, (q15_t)0x84b8, (q15_t)0x2254, (q15_t)0x84b1, (q15_t)0x223b, (q15_t)0x84aa, + (q15_t)0x2223, (q15_t)0x84a3, (q15_t)0x220b, (q15_t)0x849d, (q15_t)0x21f3, (q15_t)0x8496, (q15_t)0x21da, (q15_t)0x848f, + (q15_t)0x21c2, (q15_t)0x8489, (q15_t)0x21aa, (q15_t)0x8482, (q15_t)0x2192, (q15_t)0x847c, (q15_t)0x2179, (q15_t)0x8475, + (q15_t)0x2161, (q15_t)0x846e, (q15_t)0x2149, (q15_t)0x8468, (q15_t)0x2131, (q15_t)0x8461, (q15_t)0x2118, (q15_t)0x845b, + (q15_t)0x2100, (q15_t)0x8454, (q15_t)0x20e8, (q15_t)0x844e, (q15_t)0x20d0, (q15_t)0x8447, (q15_t)0x20b7, (q15_t)0x8441, + (q15_t)0x209f, (q15_t)0x843b, (q15_t)0x2087, (q15_t)0x8434, (q15_t)0x206e, (q15_t)0x842e, (q15_t)0x2056, (q15_t)0x8427, + (q15_t)0x203e, (q15_t)0x8421, (q15_t)0x2025, (q15_t)0x841b, (q15_t)0x200d, (q15_t)0x8415, (q15_t)0x1ff5, (q15_t)0x840e, + (q15_t)0x1fdc, (q15_t)0x8408, (q15_t)0x1fc4, (q15_t)0x8402, (q15_t)0x1fac, (q15_t)0x83fb, (q15_t)0x1f93, (q15_t)0x83f5, + (q15_t)0x1f7b, (q15_t)0x83ef, (q15_t)0x1f63, (q15_t)0x83e9, (q15_t)0x1f4a, (q15_t)0x83e3, (q15_t)0x1f32, (q15_t)0x83dd, + (q15_t)0x1f19, (q15_t)0x83d7, (q15_t)0x1f01, (q15_t)0x83d0, (q15_t)0x1ee9, (q15_t)0x83ca, (q15_t)0x1ed0, (q15_t)0x83c4, + (q15_t)0x1eb8, (q15_t)0x83be, (q15_t)0x1ea0, (q15_t)0x83b8, (q15_t)0x1e87, (q15_t)0x83b2, (q15_t)0x1e6f, (q15_t)0x83ac, + (q15_t)0x1e56, (q15_t)0x83a6, (q15_t)0x1e3e, (q15_t)0x83a0, (q15_t)0x1e25, (q15_t)0x839a, (q15_t)0x1e0d, (q15_t)0x8394, + (q15_t)0x1df5, (q15_t)0x838f, (q15_t)0x1ddc, (q15_t)0x8389, (q15_t)0x1dc4, (q15_t)0x8383, (q15_t)0x1dab, (q15_t)0x837d, + (q15_t)0x1d93, (q15_t)0x8377, (q15_t)0x1d7a, (q15_t)0x8371, (q15_t)0x1d62, (q15_t)0x836c, (q15_t)0x1d49, (q15_t)0x8366, + (q15_t)0x1d31, (q15_t)0x8360, (q15_t)0x1d18, (q15_t)0x835a, (q15_t)0x1d00, (q15_t)0x8355, (q15_t)0x1ce8, (q15_t)0x834f, + (q15_t)0x1ccf, (q15_t)0x8349, (q15_t)0x1cb7, (q15_t)0x8344, (q15_t)0x1c9e, (q15_t)0x833e, (q15_t)0x1c86, (q15_t)0x8338, + (q15_t)0x1c6d, (q15_t)0x8333, (q15_t)0x1c55, (q15_t)0x832d, (q15_t)0x1c3c, (q15_t)0x8328, (q15_t)0x1c24, (q15_t)0x8322, + (q15_t)0x1c0b, (q15_t)0x831d, (q15_t)0x1bf2, (q15_t)0x8317, (q15_t)0x1bda, (q15_t)0x8312, (q15_t)0x1bc1, (q15_t)0x830c, + (q15_t)0x1ba9, (q15_t)0x8307, (q15_t)0x1b90, (q15_t)0x8301, (q15_t)0x1b78, (q15_t)0x82fc, (q15_t)0x1b5f, (q15_t)0x82f7, + (q15_t)0x1b47, (q15_t)0x82f1, (q15_t)0x1b2e, (q15_t)0x82ec, (q15_t)0x1b16, (q15_t)0x82e7, (q15_t)0x1afd, (q15_t)0x82e1, + (q15_t)0x1ae4, (q15_t)0x82dc, (q15_t)0x1acc, (q15_t)0x82d7, (q15_t)0x1ab3, (q15_t)0x82d1, (q15_t)0x1a9b, (q15_t)0x82cc, + (q15_t)0x1a82, (q15_t)0x82c7, (q15_t)0x1a6a, (q15_t)0x82c2, (q15_t)0x1a51, (q15_t)0x82bd, (q15_t)0x1a38, (q15_t)0x82b7, + (q15_t)0x1a20, (q15_t)0x82b2, (q15_t)0x1a07, (q15_t)0x82ad, (q15_t)0x19ef, (q15_t)0x82a8, (q15_t)0x19d6, (q15_t)0x82a3, + (q15_t)0x19bd, (q15_t)0x829e, (q15_t)0x19a5, (q15_t)0x8299, (q15_t)0x198c, (q15_t)0x8294, (q15_t)0x1973, (q15_t)0x828f, + (q15_t)0x195b, (q15_t)0x828a, (q15_t)0x1942, (q15_t)0x8285, (q15_t)0x192a, (q15_t)0x8280, (q15_t)0x1911, (q15_t)0x827b, + (q15_t)0x18f8, (q15_t)0x8276, (q15_t)0x18e0, (q15_t)0x8271, (q15_t)0x18c7, (q15_t)0x826c, (q15_t)0x18ae, (q15_t)0x8268, + (q15_t)0x1896, (q15_t)0x8263, (q15_t)0x187d, (q15_t)0x825e, (q15_t)0x1864, (q15_t)0x8259, (q15_t)0x184c, (q15_t)0x8254, + (q15_t)0x1833, (q15_t)0x8250, (q15_t)0x181a, (q15_t)0x824b, (q15_t)0x1802, (q15_t)0x8246, (q15_t)0x17e9, (q15_t)0x8241, + (q15_t)0x17d0, (q15_t)0x823d, (q15_t)0x17b7, (q15_t)0x8238, (q15_t)0x179f, (q15_t)0x8233, (q15_t)0x1786, (q15_t)0x822f, + (q15_t)0x176d, (q15_t)0x822a, (q15_t)0x1755, (q15_t)0x8226, (q15_t)0x173c, (q15_t)0x8221, (q15_t)0x1723, (q15_t)0x821c, + (q15_t)0x170a, (q15_t)0x8218, (q15_t)0x16f2, (q15_t)0x8213, (q15_t)0x16d9, (q15_t)0x820f, (q15_t)0x16c0, (q15_t)0x820a, + (q15_t)0x16a8, (q15_t)0x8206, (q15_t)0x168f, (q15_t)0x8201, (q15_t)0x1676, (q15_t)0x81fd, (q15_t)0x165d, (q15_t)0x81f9, + (q15_t)0x1645, (q15_t)0x81f4, (q15_t)0x162c, (q15_t)0x81f0, (q15_t)0x1613, (q15_t)0x81ec, (q15_t)0x15fa, (q15_t)0x81e7, + (q15_t)0x15e2, (q15_t)0x81e3, (q15_t)0x15c9, (q15_t)0x81df, (q15_t)0x15b0, (q15_t)0x81da, (q15_t)0x1597, (q15_t)0x81d6, + (q15_t)0x157f, (q15_t)0x81d2, (q15_t)0x1566, (q15_t)0x81ce, (q15_t)0x154d, (q15_t)0x81c9, (q15_t)0x1534, (q15_t)0x81c5, + (q15_t)0x151b, (q15_t)0x81c1, (q15_t)0x1503, (q15_t)0x81bd, (q15_t)0x14ea, (q15_t)0x81b9, (q15_t)0x14d1, (q15_t)0x81b5, + (q15_t)0x14b8, (q15_t)0x81b1, (q15_t)0x149f, (q15_t)0x81ad, (q15_t)0x1487, (q15_t)0x81a9, (q15_t)0x146e, (q15_t)0x81a5, + (q15_t)0x1455, (q15_t)0x81a1, (q15_t)0x143c, (q15_t)0x819d, (q15_t)0x1423, (q15_t)0x8199, (q15_t)0x140b, (q15_t)0x8195, + (q15_t)0x13f2, (q15_t)0x8191, (q15_t)0x13d9, (q15_t)0x818d, (q15_t)0x13c0, (q15_t)0x8189, (q15_t)0x13a7, (q15_t)0x8185, + (q15_t)0x138e, (q15_t)0x8181, (q15_t)0x1376, (q15_t)0x817d, (q15_t)0x135d, (q15_t)0x817a, (q15_t)0x1344, (q15_t)0x8176, + (q15_t)0x132b, (q15_t)0x8172, (q15_t)0x1312, (q15_t)0x816e, (q15_t)0x12f9, (q15_t)0x816b, (q15_t)0x12e0, (q15_t)0x8167, + (q15_t)0x12c8, (q15_t)0x8163, (q15_t)0x12af, (q15_t)0x815f, (q15_t)0x1296, (q15_t)0x815c, (q15_t)0x127d, (q15_t)0x8158, + (q15_t)0x1264, (q15_t)0x8155, (q15_t)0x124b, (q15_t)0x8151, (q15_t)0x1232, (q15_t)0x814d, (q15_t)0x1219, (q15_t)0x814a, + (q15_t)0x1201, (q15_t)0x8146, (q15_t)0x11e8, (q15_t)0x8143, (q15_t)0x11cf, (q15_t)0x813f, (q15_t)0x11b6, (q15_t)0x813c, + (q15_t)0x119d, (q15_t)0x8138, (q15_t)0x1184, (q15_t)0x8135, (q15_t)0x116b, (q15_t)0x8131, (q15_t)0x1152, (q15_t)0x812e, + (q15_t)0x1139, (q15_t)0x812b, (q15_t)0x1121, (q15_t)0x8127, (q15_t)0x1108, (q15_t)0x8124, (q15_t)0x10ef, (q15_t)0x8121, + (q15_t)0x10d6, (q15_t)0x811d, (q15_t)0x10bd, (q15_t)0x811a, (q15_t)0x10a4, (q15_t)0x8117, (q15_t)0x108b, (q15_t)0x8113, + (q15_t)0x1072, (q15_t)0x8110, (q15_t)0x1059, (q15_t)0x810d, (q15_t)0x1040, (q15_t)0x810a, (q15_t)0x1027, (q15_t)0x8107, + (q15_t)0x100e, (q15_t)0x8103, (q15_t)0xff5, (q15_t)0x8100, (q15_t)0xfdd, (q15_t)0x80fd, (q15_t)0xfc4, (q15_t)0x80fa, + (q15_t)0xfab, (q15_t)0x80f7, (q15_t)0xf92, (q15_t)0x80f4, (q15_t)0xf79, (q15_t)0x80f1, (q15_t)0xf60, (q15_t)0x80ee, + (q15_t)0xf47, (q15_t)0x80eb, (q15_t)0xf2e, (q15_t)0x80e8, (q15_t)0xf15, (q15_t)0x80e5, (q15_t)0xefc, (q15_t)0x80e2, + (q15_t)0xee3, (q15_t)0x80df, (q15_t)0xeca, (q15_t)0x80dc, (q15_t)0xeb1, (q15_t)0x80d9, (q15_t)0xe98, (q15_t)0x80d6, + (q15_t)0xe7f, (q15_t)0x80d3, (q15_t)0xe66, (q15_t)0x80d1, (q15_t)0xe4d, (q15_t)0x80ce, (q15_t)0xe34, (q15_t)0x80cb, + (q15_t)0xe1b, (q15_t)0x80c8, (q15_t)0xe02, (q15_t)0x80c5, (q15_t)0xde9, (q15_t)0x80c3, (q15_t)0xdd0, (q15_t)0x80c0, + (q15_t)0xdb7, (q15_t)0x80bd, (q15_t)0xd9e, (q15_t)0x80bb, (q15_t)0xd85, (q15_t)0x80b8, (q15_t)0xd6c, (q15_t)0x80b5, + (q15_t)0xd53, (q15_t)0x80b3, (q15_t)0xd3a, (q15_t)0x80b0, (q15_t)0xd21, (q15_t)0x80ad, (q15_t)0xd08, (q15_t)0x80ab, + (q15_t)0xcef, (q15_t)0x80a8, (q15_t)0xcd6, (q15_t)0x80a6, (q15_t)0xcbd, (q15_t)0x80a3, (q15_t)0xca4, (q15_t)0x80a1, + (q15_t)0xc8b, (q15_t)0x809e, (q15_t)0xc72, (q15_t)0x809c, (q15_t)0xc59, (q15_t)0x8099, (q15_t)0xc40, (q15_t)0x8097, + (q15_t)0xc27, (q15_t)0x8095, (q15_t)0xc0e, (q15_t)0x8092, (q15_t)0xbf5, (q15_t)0x8090, (q15_t)0xbdc, (q15_t)0x808e, + (q15_t)0xbc3, (q15_t)0x808b, (q15_t)0xbaa, (q15_t)0x8089, (q15_t)0xb91, (q15_t)0x8087, (q15_t)0xb78, (q15_t)0x8084, + (q15_t)0xb5f, (q15_t)0x8082, (q15_t)0xb46, (q15_t)0x8080, (q15_t)0xb2d, (q15_t)0x807e, (q15_t)0xb14, (q15_t)0x807b, + (q15_t)0xafb, (q15_t)0x8079, (q15_t)0xae2, (q15_t)0x8077, (q15_t)0xac9, (q15_t)0x8075, (q15_t)0xab0, (q15_t)0x8073, + (q15_t)0xa97, (q15_t)0x8071, (q15_t)0xa7e, (q15_t)0x806f, (q15_t)0xa65, (q15_t)0x806d, (q15_t)0xa4c, (q15_t)0x806b, + (q15_t)0xa33, (q15_t)0x8069, (q15_t)0xa19, (q15_t)0x8067, (q15_t)0xa00, (q15_t)0x8065, (q15_t)0x9e7, (q15_t)0x8063, + (q15_t)0x9ce, (q15_t)0x8061, (q15_t)0x9b5, (q15_t)0x805f, (q15_t)0x99c, (q15_t)0x805d, (q15_t)0x983, (q15_t)0x805b, + (q15_t)0x96a, (q15_t)0x8059, (q15_t)0x951, (q15_t)0x8057, (q15_t)0x938, (q15_t)0x8056, (q15_t)0x91f, (q15_t)0x8054, + (q15_t)0x906, (q15_t)0x8052, (q15_t)0x8ed, (q15_t)0x8050, (q15_t)0x8d4, (q15_t)0x804f, (q15_t)0x8bb, (q15_t)0x804d, + (q15_t)0x8a2, (q15_t)0x804b, (q15_t)0x888, (q15_t)0x8049, (q15_t)0x86f, (q15_t)0x8048, (q15_t)0x856, (q15_t)0x8046, + (q15_t)0x83d, (q15_t)0x8044, (q15_t)0x824, (q15_t)0x8043, (q15_t)0x80b, (q15_t)0x8041, (q15_t)0x7f2, (q15_t)0x8040, + (q15_t)0x7d9, (q15_t)0x803e, (q15_t)0x7c0, (q15_t)0x803d, (q15_t)0x7a7, (q15_t)0x803b, (q15_t)0x78e, (q15_t)0x803a, + (q15_t)0x775, (q15_t)0x8038, (q15_t)0x75b, (q15_t)0x8037, (q15_t)0x742, (q15_t)0x8035, (q15_t)0x729, (q15_t)0x8034, + (q15_t)0x710, (q15_t)0x8032, (q15_t)0x6f7, (q15_t)0x8031, (q15_t)0x6de, (q15_t)0x8030, (q15_t)0x6c5, (q15_t)0x802e, + (q15_t)0x6ac, (q15_t)0x802d, (q15_t)0x693, (q15_t)0x802c, (q15_t)0x67a, (q15_t)0x802a, (q15_t)0x660, (q15_t)0x8029, + (q15_t)0x647, (q15_t)0x8028, (q15_t)0x62e, (q15_t)0x8027, (q15_t)0x615, (q15_t)0x8026, (q15_t)0x5fc, (q15_t)0x8024, + (q15_t)0x5e3, (q15_t)0x8023, (q15_t)0x5ca, (q15_t)0x8022, (q15_t)0x5b1, (q15_t)0x8021, (q15_t)0x598, (q15_t)0x8020, + (q15_t)0x57f, (q15_t)0x801f, (q15_t)0x565, (q15_t)0x801e, (q15_t)0x54c, (q15_t)0x801d, (q15_t)0x533, (q15_t)0x801c, + (q15_t)0x51a, (q15_t)0x801b, (q15_t)0x501, (q15_t)0x801a, (q15_t)0x4e8, (q15_t)0x8019, (q15_t)0x4cf, (q15_t)0x8018, + (q15_t)0x4b6, (q15_t)0x8017, (q15_t)0x49c, (q15_t)0x8016, (q15_t)0x483, (q15_t)0x8015, (q15_t)0x46a, (q15_t)0x8014, + (q15_t)0x451, (q15_t)0x8013, (q15_t)0x438, (q15_t)0x8012, (q15_t)0x41f, (q15_t)0x8012, (q15_t)0x406, (q15_t)0x8011, + (q15_t)0x3ed, (q15_t)0x8010, (q15_t)0x3d4, (q15_t)0x800f, (q15_t)0x3ba, (q15_t)0x800e, (q15_t)0x3a1, (q15_t)0x800e, + (q15_t)0x388, (q15_t)0x800d, (q15_t)0x36f, (q15_t)0x800c, (q15_t)0x356, (q15_t)0x800c, (q15_t)0x33d, (q15_t)0x800b, + (q15_t)0x324, (q15_t)0x800a, (q15_t)0x30b, (q15_t)0x800a, (q15_t)0x2f1, (q15_t)0x8009, (q15_t)0x2d8, (q15_t)0x8009, + (q15_t)0x2bf, (q15_t)0x8008, (q15_t)0x2a6, (q15_t)0x8008, (q15_t)0x28d, (q15_t)0x8007, (q15_t)0x274, (q15_t)0x8007, + (q15_t)0x25b, (q15_t)0x8006, (q15_t)0x242, (q15_t)0x8006, (q15_t)0x228, (q15_t)0x8005, (q15_t)0x20f, (q15_t)0x8005, + (q15_t)0x1f6, (q15_t)0x8004, (q15_t)0x1dd, (q15_t)0x8004, (q15_t)0x1c4, (q15_t)0x8004, (q15_t)0x1ab, (q15_t)0x8003, + (q15_t)0x192, (q15_t)0x8003, (q15_t)0x178, (q15_t)0x8003, (q15_t)0x15f, (q15_t)0x8002, (q15_t)0x146, (q15_t)0x8002, + (q15_t)0x12d, (q15_t)0x8002, (q15_t)0x114, (q15_t)0x8002, (q15_t)0xfb, (q15_t)0x8001, (q15_t)0xe2, (q15_t)0x8001, + (q15_t)0xc9, (q15_t)0x8001, (q15_t)0xaf, (q15_t)0x8001, (q15_t)0x96, (q15_t)0x8001, (q15_t)0x7d, (q15_t)0x8001, + (q15_t)0x64, (q15_t)0x8001, (q15_t)0x4b, (q15_t)0x8001, (q15_t)0x32, (q15_t)0x8001, (q15_t)0x19, (q15_t)0x8001 +}; + const q15_t __ALIGNED(4) cos_factorsQ15_2048[2048] = { + (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, + (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffd, (q15_t)0x7ffd, + (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffc, (q15_t)0x7ffc, (q15_t)0x7ffb, (q15_t)0x7ffb, (q15_t)0x7ffb, (q15_t)0x7ffa, + (q15_t)0x7ffa, (q15_t)0x7ff9, (q15_t)0x7ff9, (q15_t)0x7ff8, (q15_t)0x7ff8, (q15_t)0x7ff7, (q15_t)0x7ff7, (q15_t)0x7ff6, + (q15_t)0x7ff5, (q15_t)0x7ff5, (q15_t)0x7ff4, (q15_t)0x7ff3, (q15_t)0x7ff3, (q15_t)0x7ff2, (q15_t)0x7ff1, (q15_t)0x7ff0, + (q15_t)0x7ff0, (q15_t)0x7fef, (q15_t)0x7fee, (q15_t)0x7fed, (q15_t)0x7fec, (q15_t)0x7fec, (q15_t)0x7feb, (q15_t)0x7fea, + (q15_t)0x7fe9, (q15_t)0x7fe8, (q15_t)0x7fe7, (q15_t)0x7fe6, (q15_t)0x7fe5, (q15_t)0x7fe4, (q15_t)0x7fe3, (q15_t)0x7fe2, + (q15_t)0x7fe1, (q15_t)0x7fe0, (q15_t)0x7fdf, (q15_t)0x7fdd, (q15_t)0x7fdc, (q15_t)0x7fdb, (q15_t)0x7fda, (q15_t)0x7fd9, + (q15_t)0x7fd7, (q15_t)0x7fd6, (q15_t)0x7fd5, (q15_t)0x7fd4, (q15_t)0x7fd2, (q15_t)0x7fd1, (q15_t)0x7fd0, (q15_t)0x7fce, + (q15_t)0x7fcd, (q15_t)0x7fcb, (q15_t)0x7fca, (q15_t)0x7fc9, (q15_t)0x7fc7, (q15_t)0x7fc6, (q15_t)0x7fc4, (q15_t)0x7fc3, + (q15_t)0x7fc1, (q15_t)0x7fc0, (q15_t)0x7fbe, (q15_t)0x7fbc, (q15_t)0x7fbb, (q15_t)0x7fb9, (q15_t)0x7fb7, (q15_t)0x7fb6, + (q15_t)0x7fb4, (q15_t)0x7fb2, (q15_t)0x7fb1, (q15_t)0x7faf, (q15_t)0x7fad, (q15_t)0x7fab, (q15_t)0x7fa9, (q15_t)0x7fa8, + (q15_t)0x7fa6, (q15_t)0x7fa4, (q15_t)0x7fa2, (q15_t)0x7fa0, (q15_t)0x7f9e, (q15_t)0x7f9c, (q15_t)0x7f9a, (q15_t)0x7f98, + (q15_t)0x7f96, (q15_t)0x7f94, (q15_t)0x7f92, (q15_t)0x7f90, (q15_t)0x7f8e, (q15_t)0x7f8c, (q15_t)0x7f8a, (q15_t)0x7f88, + (q15_t)0x7f86, (q15_t)0x7f83, (q15_t)0x7f81, (q15_t)0x7f7f, (q15_t)0x7f7d, (q15_t)0x7f7b, (q15_t)0x7f78, (q15_t)0x7f76, + (q15_t)0x7f74, (q15_t)0x7f71, (q15_t)0x7f6f, (q15_t)0x7f6d, (q15_t)0x7f6a, (q15_t)0x7f68, (q15_t)0x7f65, (q15_t)0x7f63, + (q15_t)0x7f60, (q15_t)0x7f5e, (q15_t)0x7f5b, (q15_t)0x7f59, (q15_t)0x7f56, (q15_t)0x7f54, (q15_t)0x7f51, (q15_t)0x7f4f, + (q15_t)0x7f4c, (q15_t)0x7f49, (q15_t)0x7f47, (q15_t)0x7f44, (q15_t)0x7f41, (q15_t)0x7f3f, (q15_t)0x7f3c, (q15_t)0x7f39, + (q15_t)0x7f36, (q15_t)0x7f34, (q15_t)0x7f31, (q15_t)0x7f2e, (q15_t)0x7f2b, (q15_t)0x7f28, (q15_t)0x7f25, (q15_t)0x7f23, + (q15_t)0x7f20, (q15_t)0x7f1d, (q15_t)0x7f1a, (q15_t)0x7f17, (q15_t)0x7f14, (q15_t)0x7f11, (q15_t)0x7f0e, (q15_t)0x7f0b, + (q15_t)0x7f08, (q15_t)0x7f04, (q15_t)0x7f01, (q15_t)0x7efe, (q15_t)0x7efb, (q15_t)0x7ef8, (q15_t)0x7ef5, (q15_t)0x7ef1, + (q15_t)0x7eee, (q15_t)0x7eeb, (q15_t)0x7ee8, (q15_t)0x7ee4, (q15_t)0x7ee1, (q15_t)0x7ede, (q15_t)0x7eda, (q15_t)0x7ed7, + (q15_t)0x7ed4, (q15_t)0x7ed0, (q15_t)0x7ecd, (q15_t)0x7ec9, (q15_t)0x7ec6, (q15_t)0x7ec3, (q15_t)0x7ebf, (q15_t)0x7ebb, + (q15_t)0x7eb8, (q15_t)0x7eb4, (q15_t)0x7eb1, (q15_t)0x7ead, (q15_t)0x7eaa, (q15_t)0x7ea6, (q15_t)0x7ea2, (q15_t)0x7e9f, + (q15_t)0x7e9b, (q15_t)0x7e97, (q15_t)0x7e94, (q15_t)0x7e90, (q15_t)0x7e8c, (q15_t)0x7e88, (q15_t)0x7e84, (q15_t)0x7e81, + (q15_t)0x7e7d, (q15_t)0x7e79, (q15_t)0x7e75, (q15_t)0x7e71, (q15_t)0x7e6d, (q15_t)0x7e69, (q15_t)0x7e65, (q15_t)0x7e61, + (q15_t)0x7e5d, (q15_t)0x7e59, (q15_t)0x7e55, (q15_t)0x7e51, (q15_t)0x7e4d, (q15_t)0x7e49, (q15_t)0x7e45, (q15_t)0x7e41, + (q15_t)0x7e3d, (q15_t)0x7e39, (q15_t)0x7e34, (q15_t)0x7e30, (q15_t)0x7e2c, (q15_t)0x7e28, (q15_t)0x7e24, (q15_t)0x7e1f, + (q15_t)0x7e1b, (q15_t)0x7e17, (q15_t)0x7e12, (q15_t)0x7e0e, (q15_t)0x7e0a, (q15_t)0x7e05, (q15_t)0x7e01, (q15_t)0x7dfc, + (q15_t)0x7df8, (q15_t)0x7df3, (q15_t)0x7def, (q15_t)0x7dea, (q15_t)0x7de6, (q15_t)0x7de1, (q15_t)0x7ddd, (q15_t)0x7dd8, + (q15_t)0x7dd4, (q15_t)0x7dcf, (q15_t)0x7dca, (q15_t)0x7dc6, (q15_t)0x7dc1, (q15_t)0x7dbc, (q15_t)0x7db8, (q15_t)0x7db3, + (q15_t)0x7dae, (q15_t)0x7da9, (q15_t)0x7da5, (q15_t)0x7da0, (q15_t)0x7d9b, (q15_t)0x7d96, (q15_t)0x7d91, (q15_t)0x7d8c, + (q15_t)0x7d87, (q15_t)0x7d82, (q15_t)0x7d7e, (q15_t)0x7d79, (q15_t)0x7d74, (q15_t)0x7d6f, (q15_t)0x7d6a, (q15_t)0x7d65, + (q15_t)0x7d60, (q15_t)0x7d5a, (q15_t)0x7d55, (q15_t)0x7d50, (q15_t)0x7d4b, (q15_t)0x7d46, (q15_t)0x7d41, (q15_t)0x7d3c, + (q15_t)0x7d36, (q15_t)0x7d31, (q15_t)0x7d2c, (q15_t)0x7d27, (q15_t)0x7d21, (q15_t)0x7d1c, (q15_t)0x7d17, (q15_t)0x7d11, + (q15_t)0x7d0c, (q15_t)0x7d07, (q15_t)0x7d01, (q15_t)0x7cfc, (q15_t)0x7cf6, (q15_t)0x7cf1, (q15_t)0x7cec, (q15_t)0x7ce6, + (q15_t)0x7ce1, (q15_t)0x7cdb, (q15_t)0x7cd5, (q15_t)0x7cd0, (q15_t)0x7cca, (q15_t)0x7cc5, (q15_t)0x7cbf, (q15_t)0x7cb9, + (q15_t)0x7cb4, (q15_t)0x7cae, (q15_t)0x7ca8, (q15_t)0x7ca3, (q15_t)0x7c9d, (q15_t)0x7c97, (q15_t)0x7c91, (q15_t)0x7c8c, + (q15_t)0x7c86, (q15_t)0x7c80, (q15_t)0x7c7a, (q15_t)0x7c74, (q15_t)0x7c6e, (q15_t)0x7c69, (q15_t)0x7c63, (q15_t)0x7c5d, + (q15_t)0x7c57, (q15_t)0x7c51, (q15_t)0x7c4b, (q15_t)0x7c45, (q15_t)0x7c3f, (q15_t)0x7c39, (q15_t)0x7c33, (q15_t)0x7c2d, + (q15_t)0x7c26, (q15_t)0x7c20, (q15_t)0x7c1a, (q15_t)0x7c14, (q15_t)0x7c0e, (q15_t)0x7c08, (q15_t)0x7c01, (q15_t)0x7bfb, + (q15_t)0x7bf5, (q15_t)0x7bef, (q15_t)0x7be8, (q15_t)0x7be2, (q15_t)0x7bdc, (q15_t)0x7bd5, (q15_t)0x7bcf, (q15_t)0x7bc9, + (q15_t)0x7bc2, (q15_t)0x7bbc, (q15_t)0x7bb5, (q15_t)0x7baf, (q15_t)0x7ba8, (q15_t)0x7ba2, (q15_t)0x7b9b, (q15_t)0x7b95, + (q15_t)0x7b8e, (q15_t)0x7b88, (q15_t)0x7b81, (q15_t)0x7b7a, (q15_t)0x7b74, (q15_t)0x7b6d, (q15_t)0x7b67, (q15_t)0x7b60, + (q15_t)0x7b59, (q15_t)0x7b52, (q15_t)0x7b4c, (q15_t)0x7b45, (q15_t)0x7b3e, (q15_t)0x7b37, (q15_t)0x7b31, (q15_t)0x7b2a, + (q15_t)0x7b23, (q15_t)0x7b1c, (q15_t)0x7b15, (q15_t)0x7b0e, (q15_t)0x7b07, (q15_t)0x7b00, (q15_t)0x7af9, (q15_t)0x7af2, + (q15_t)0x7aeb, (q15_t)0x7ae4, (q15_t)0x7add, (q15_t)0x7ad6, (q15_t)0x7acf, (q15_t)0x7ac8, (q15_t)0x7ac1, (q15_t)0x7aba, + (q15_t)0x7ab3, (q15_t)0x7aac, (q15_t)0x7aa4, (q15_t)0x7a9d, (q15_t)0x7a96, (q15_t)0x7a8f, (q15_t)0x7a87, (q15_t)0x7a80, + (q15_t)0x7a79, (q15_t)0x7a72, (q15_t)0x7a6a, (q15_t)0x7a63, (q15_t)0x7a5c, (q15_t)0x7a54, (q15_t)0x7a4d, (q15_t)0x7a45, + (q15_t)0x7a3e, (q15_t)0x7a36, (q15_t)0x7a2f, (q15_t)0x7a27, (q15_t)0x7a20, (q15_t)0x7a18, (q15_t)0x7a11, (q15_t)0x7a09, + (q15_t)0x7a02, (q15_t)0x79fa, (q15_t)0x79f2, (q15_t)0x79eb, (q15_t)0x79e3, (q15_t)0x79db, (q15_t)0x79d4, (q15_t)0x79cc, + (q15_t)0x79c4, (q15_t)0x79bc, (q15_t)0x79b5, (q15_t)0x79ad, (q15_t)0x79a5, (q15_t)0x799d, (q15_t)0x7995, (q15_t)0x798e, + (q15_t)0x7986, (q15_t)0x797e, (q15_t)0x7976, (q15_t)0x796e, (q15_t)0x7966, (q15_t)0x795e, (q15_t)0x7956, (q15_t)0x794e, + (q15_t)0x7946, (q15_t)0x793e, (q15_t)0x7936, (q15_t)0x792e, (q15_t)0x7926, (q15_t)0x791e, (q15_t)0x7915, (q15_t)0x790d, + (q15_t)0x7905, (q15_t)0x78fd, (q15_t)0x78f5, (q15_t)0x78ec, (q15_t)0x78e4, (q15_t)0x78dc, (q15_t)0x78d4, (q15_t)0x78cb, + (q15_t)0x78c3, (q15_t)0x78bb, (q15_t)0x78b2, (q15_t)0x78aa, (q15_t)0x78a2, (q15_t)0x7899, (q15_t)0x7891, (q15_t)0x7888, + (q15_t)0x7880, (q15_t)0x7877, (q15_t)0x786f, (q15_t)0x7866, (q15_t)0x785e, (q15_t)0x7855, (q15_t)0x784d, (q15_t)0x7844, + (q15_t)0x783b, (q15_t)0x7833, (q15_t)0x782a, (q15_t)0x7821, (q15_t)0x7819, (q15_t)0x7810, (q15_t)0x7807, (q15_t)0x77ff, + (q15_t)0x77f6, (q15_t)0x77ed, (q15_t)0x77e4, (q15_t)0x77db, (q15_t)0x77d3, (q15_t)0x77ca, (q15_t)0x77c1, (q15_t)0x77b8, + (q15_t)0x77af, (q15_t)0x77a6, (q15_t)0x779d, (q15_t)0x7794, (q15_t)0x778b, (q15_t)0x7782, (q15_t)0x7779, (q15_t)0x7770, + (q15_t)0x7767, (q15_t)0x775e, (q15_t)0x7755, (q15_t)0x774c, (q15_t)0x7743, (q15_t)0x773a, (q15_t)0x7731, (q15_t)0x7727, + (q15_t)0x771e, (q15_t)0x7715, (q15_t)0x770c, (q15_t)0x7703, (q15_t)0x76f9, (q15_t)0x76f0, (q15_t)0x76e7, (q15_t)0x76dd, + (q15_t)0x76d4, (q15_t)0x76cb, (q15_t)0x76c1, (q15_t)0x76b8, (q15_t)0x76af, (q15_t)0x76a5, (q15_t)0x769c, (q15_t)0x7692, + (q15_t)0x7689, (q15_t)0x767f, (q15_t)0x7676, (q15_t)0x766c, (q15_t)0x7663, (q15_t)0x7659, (q15_t)0x7650, (q15_t)0x7646, + (q15_t)0x763c, (q15_t)0x7633, (q15_t)0x7629, (q15_t)0x761f, (q15_t)0x7616, (q15_t)0x760c, (q15_t)0x7602, (q15_t)0x75f9, + (q15_t)0x75ef, (q15_t)0x75e5, (q15_t)0x75db, (q15_t)0x75d1, (q15_t)0x75c8, (q15_t)0x75be, (q15_t)0x75b4, (q15_t)0x75aa, + (q15_t)0x75a0, (q15_t)0x7596, (q15_t)0x758c, (q15_t)0x7582, (q15_t)0x7578, (q15_t)0x756e, (q15_t)0x7564, (q15_t)0x755a, + (q15_t)0x7550, (q15_t)0x7546, (q15_t)0x753c, (q15_t)0x7532, (q15_t)0x7528, (q15_t)0x751e, (q15_t)0x7514, (q15_t)0x7509, + (q15_t)0x74ff, (q15_t)0x74f5, (q15_t)0x74eb, (q15_t)0x74e1, (q15_t)0x74d6, (q15_t)0x74cc, (q15_t)0x74c2, (q15_t)0x74b7, + (q15_t)0x74ad, (q15_t)0x74a3, (q15_t)0x7498, (q15_t)0x748e, (q15_t)0x7484, (q15_t)0x7479, (q15_t)0x746f, (q15_t)0x7464, + (q15_t)0x745a, (q15_t)0x744f, (q15_t)0x7445, (q15_t)0x743a, (q15_t)0x7430, (q15_t)0x7425, (q15_t)0x741b, (q15_t)0x7410, + (q15_t)0x7406, (q15_t)0x73fb, (q15_t)0x73f0, (q15_t)0x73e6, (q15_t)0x73db, (q15_t)0x73d0, (q15_t)0x73c6, (q15_t)0x73bb, + (q15_t)0x73b0, (q15_t)0x73a5, (q15_t)0x739b, (q15_t)0x7390, (q15_t)0x7385, (q15_t)0x737a, (q15_t)0x736f, (q15_t)0x7364, + (q15_t)0x7359, (q15_t)0x734f, (q15_t)0x7344, (q15_t)0x7339, (q15_t)0x732e, (q15_t)0x7323, (q15_t)0x7318, (q15_t)0x730d, + (q15_t)0x7302, (q15_t)0x72f7, (q15_t)0x72ec, (q15_t)0x72e1, (q15_t)0x72d5, (q15_t)0x72ca, (q15_t)0x72bf, (q15_t)0x72b4, + (q15_t)0x72a9, (q15_t)0x729e, (q15_t)0x7293, (q15_t)0x7287, (q15_t)0x727c, (q15_t)0x7271, (q15_t)0x7266, (q15_t)0x725a, + (q15_t)0x724f, (q15_t)0x7244, (q15_t)0x7238, (q15_t)0x722d, (q15_t)0x7222, (q15_t)0x7216, (q15_t)0x720b, (q15_t)0x71ff, + (q15_t)0x71f4, (q15_t)0x71e9, (q15_t)0x71dd, (q15_t)0x71d2, (q15_t)0x71c6, (q15_t)0x71bb, (q15_t)0x71af, (q15_t)0x71a3, + (q15_t)0x7198, (q15_t)0x718c, (q15_t)0x7181, (q15_t)0x7175, (q15_t)0x7169, (q15_t)0x715e, (q15_t)0x7152, (q15_t)0x7146, + (q15_t)0x713b, (q15_t)0x712f, (q15_t)0x7123, (q15_t)0x7117, (q15_t)0x710c, (q15_t)0x7100, (q15_t)0x70f4, (q15_t)0x70e8, + (q15_t)0x70dc, (q15_t)0x70d1, (q15_t)0x70c5, (q15_t)0x70b9, (q15_t)0x70ad, (q15_t)0x70a1, (q15_t)0x7095, (q15_t)0x7089, + (q15_t)0x707d, (q15_t)0x7071, (q15_t)0x7065, (q15_t)0x7059, (q15_t)0x704d, (q15_t)0x7041, (q15_t)0x7035, (q15_t)0x7029, + (q15_t)0x701d, (q15_t)0x7010, (q15_t)0x7004, (q15_t)0x6ff8, (q15_t)0x6fec, (q15_t)0x6fe0, (q15_t)0x6fd3, (q15_t)0x6fc7, + (q15_t)0x6fbb, (q15_t)0x6faf, (q15_t)0x6fa2, (q15_t)0x6f96, (q15_t)0x6f8a, (q15_t)0x6f7d, (q15_t)0x6f71, (q15_t)0x6f65, + (q15_t)0x6f58, (q15_t)0x6f4c, (q15_t)0x6f3f, (q15_t)0x6f33, (q15_t)0x6f27, (q15_t)0x6f1a, (q15_t)0x6f0e, (q15_t)0x6f01, + (q15_t)0x6ef5, (q15_t)0x6ee8, (q15_t)0x6edc, (q15_t)0x6ecf, (q15_t)0x6ec2, (q15_t)0x6eb6, (q15_t)0x6ea9, (q15_t)0x6e9c, + (q15_t)0x6e90, (q15_t)0x6e83, (q15_t)0x6e76, (q15_t)0x6e6a, (q15_t)0x6e5d, (q15_t)0x6e50, (q15_t)0x6e44, (q15_t)0x6e37, + (q15_t)0x6e2a, (q15_t)0x6e1d, (q15_t)0x6e10, (q15_t)0x6e04, (q15_t)0x6df7, (q15_t)0x6dea, (q15_t)0x6ddd, (q15_t)0x6dd0, + (q15_t)0x6dc3, (q15_t)0x6db6, (q15_t)0x6da9, (q15_t)0x6d9c, (q15_t)0x6d8f, (q15_t)0x6d82, (q15_t)0x6d75, (q15_t)0x6d68, + (q15_t)0x6d5b, (q15_t)0x6d4e, (q15_t)0x6d41, (q15_t)0x6d34, (q15_t)0x6d27, (q15_t)0x6d1a, (q15_t)0x6d0c, (q15_t)0x6cff, + (q15_t)0x6cf2, (q15_t)0x6ce5, (q15_t)0x6cd8, (q15_t)0x6cca, (q15_t)0x6cbd, (q15_t)0x6cb0, (q15_t)0x6ca3, (q15_t)0x6c95, + (q15_t)0x6c88, (q15_t)0x6c7b, (q15_t)0x6c6d, (q15_t)0x6c60, (q15_t)0x6c53, (q15_t)0x6c45, (q15_t)0x6c38, (q15_t)0x6c2a, + (q15_t)0x6c1d, (q15_t)0x6c0f, (q15_t)0x6c02, (q15_t)0x6bf5, (q15_t)0x6be7, (q15_t)0x6bd9, (q15_t)0x6bcc, (q15_t)0x6bbe, + (q15_t)0x6bb1, (q15_t)0x6ba3, (q15_t)0x6b96, (q15_t)0x6b88, (q15_t)0x6b7a, (q15_t)0x6b6d, (q15_t)0x6b5f, (q15_t)0x6b51, + (q15_t)0x6b44, (q15_t)0x6b36, (q15_t)0x6b28, (q15_t)0x6b1a, (q15_t)0x6b0d, (q15_t)0x6aff, (q15_t)0x6af1, (q15_t)0x6ae3, + (q15_t)0x6ad5, (q15_t)0x6ac8, (q15_t)0x6aba, (q15_t)0x6aac, (q15_t)0x6a9e, (q15_t)0x6a90, (q15_t)0x6a82, (q15_t)0x6a74, + (q15_t)0x6a66, (q15_t)0x6a58, (q15_t)0x6a4a, (q15_t)0x6a3c, (q15_t)0x6a2e, (q15_t)0x6a20, (q15_t)0x6a12, (q15_t)0x6a04, + (q15_t)0x69f6, (q15_t)0x69e8, (q15_t)0x69da, (q15_t)0x69cb, (q15_t)0x69bd, (q15_t)0x69af, (q15_t)0x69a1, (q15_t)0x6993, + (q15_t)0x6985, (q15_t)0x6976, (q15_t)0x6968, (q15_t)0x695a, (q15_t)0x694b, (q15_t)0x693d, (q15_t)0x692f, (q15_t)0x6921, + (q15_t)0x6912, (q15_t)0x6904, (q15_t)0x68f5, (q15_t)0x68e7, (q15_t)0x68d9, (q15_t)0x68ca, (q15_t)0x68bc, (q15_t)0x68ad, + (q15_t)0x689f, (q15_t)0x6890, (q15_t)0x6882, (q15_t)0x6873, (q15_t)0x6865, (q15_t)0x6856, (q15_t)0x6848, (q15_t)0x6839, + (q15_t)0x682b, (q15_t)0x681c, (q15_t)0x680d, (q15_t)0x67ff, (q15_t)0x67f0, (q15_t)0x67e1, (q15_t)0x67d3, (q15_t)0x67c4, + (q15_t)0x67b5, (q15_t)0x67a6, (q15_t)0x6798, (q15_t)0x6789, (q15_t)0x677a, (q15_t)0x676b, (q15_t)0x675d, (q15_t)0x674e, + (q15_t)0x673f, (q15_t)0x6730, (q15_t)0x6721, (q15_t)0x6712, (q15_t)0x6703, (q15_t)0x66f4, (q15_t)0x66e5, (q15_t)0x66d6, + (q15_t)0x66c8, (q15_t)0x66b9, (q15_t)0x66aa, (q15_t)0x669b, (q15_t)0x668b, (q15_t)0x667c, (q15_t)0x666d, (q15_t)0x665e, + (q15_t)0x664f, (q15_t)0x6640, (q15_t)0x6631, (q15_t)0x6622, (q15_t)0x6613, (q15_t)0x6603, (q15_t)0x65f4, (q15_t)0x65e5, + (q15_t)0x65d6, (q15_t)0x65c7, (q15_t)0x65b7, (q15_t)0x65a8, (q15_t)0x6599, (q15_t)0x658a, (q15_t)0x657a, (q15_t)0x656b, + (q15_t)0x655c, (q15_t)0x654c, (q15_t)0x653d, (q15_t)0x652d, (q15_t)0x651e, (q15_t)0x650f, (q15_t)0x64ff, (q15_t)0x64f0, + (q15_t)0x64e0, (q15_t)0x64d1, (q15_t)0x64c1, (q15_t)0x64b2, (q15_t)0x64a2, (q15_t)0x6493, (q15_t)0x6483, (q15_t)0x6474, + (q15_t)0x6464, (q15_t)0x6454, (q15_t)0x6445, (q15_t)0x6435, (q15_t)0x6426, (q15_t)0x6416, (q15_t)0x6406, (q15_t)0x63f7, + (q15_t)0x63e7, (q15_t)0x63d7, (q15_t)0x63c7, (q15_t)0x63b8, (q15_t)0x63a8, (q15_t)0x6398, (q15_t)0x6388, (q15_t)0x6378, + (q15_t)0x6369, (q15_t)0x6359, (q15_t)0x6349, (q15_t)0x6339, (q15_t)0x6329, (q15_t)0x6319, (q15_t)0x6309, (q15_t)0x62f9, + (q15_t)0x62ea, (q15_t)0x62da, (q15_t)0x62ca, (q15_t)0x62ba, (q15_t)0x62aa, (q15_t)0x629a, (q15_t)0x628a, (q15_t)0x627a, + (q15_t)0x6269, (q15_t)0x6259, (q15_t)0x6249, (q15_t)0x6239, (q15_t)0x6229, (q15_t)0x6219, (q15_t)0x6209, (q15_t)0x61f9, + (q15_t)0x61e8, (q15_t)0x61d8, (q15_t)0x61c8, (q15_t)0x61b8, (q15_t)0x61a8, (q15_t)0x6197, (q15_t)0x6187, (q15_t)0x6177, + (q15_t)0x6166, (q15_t)0x6156, (q15_t)0x6146, (q15_t)0x6135, (q15_t)0x6125, (q15_t)0x6115, (q15_t)0x6104, (q15_t)0x60f4, + (q15_t)0x60e4, (q15_t)0x60d3, (q15_t)0x60c3, (q15_t)0x60b2, (q15_t)0x60a2, (q15_t)0x6091, (q15_t)0x6081, (q15_t)0x6070, + (q15_t)0x6060, (q15_t)0x604f, (q15_t)0x603f, (q15_t)0x602e, (q15_t)0x601d, (q15_t)0x600d, (q15_t)0x5ffc, (q15_t)0x5fec, + (q15_t)0x5fdb, (q15_t)0x5fca, (q15_t)0x5fba, (q15_t)0x5fa9, (q15_t)0x5f98, (q15_t)0x5f87, (q15_t)0x5f77, (q15_t)0x5f66, + (q15_t)0x5f55, (q15_t)0x5f44, (q15_t)0x5f34, (q15_t)0x5f23, (q15_t)0x5f12, (q15_t)0x5f01, (q15_t)0x5ef0, (q15_t)0x5edf, + (q15_t)0x5ecf, (q15_t)0x5ebe, (q15_t)0x5ead, (q15_t)0x5e9c, (q15_t)0x5e8b, (q15_t)0x5e7a, (q15_t)0x5e69, (q15_t)0x5e58, + (q15_t)0x5e47, (q15_t)0x5e36, (q15_t)0x5e25, (q15_t)0x5e14, (q15_t)0x5e03, (q15_t)0x5df2, (q15_t)0x5de1, (q15_t)0x5dd0, + (q15_t)0x5dbf, (q15_t)0x5dad, (q15_t)0x5d9c, (q15_t)0x5d8b, (q15_t)0x5d7a, (q15_t)0x5d69, (q15_t)0x5d58, (q15_t)0x5d46, + (q15_t)0x5d35, (q15_t)0x5d24, (q15_t)0x5d13, (q15_t)0x5d01, (q15_t)0x5cf0, (q15_t)0x5cdf, (q15_t)0x5cce, (q15_t)0x5cbc, + (q15_t)0x5cab, (q15_t)0x5c9a, (q15_t)0x5c88, (q15_t)0x5c77, (q15_t)0x5c66, (q15_t)0x5c54, (q15_t)0x5c43, (q15_t)0x5c31, + (q15_t)0x5c20, (q15_t)0x5c0e, (q15_t)0x5bfd, (q15_t)0x5beb, (q15_t)0x5bda, (q15_t)0x5bc8, (q15_t)0x5bb7, (q15_t)0x5ba5, + (q15_t)0x5b94, (q15_t)0x5b82, (q15_t)0x5b71, (q15_t)0x5b5f, (q15_t)0x5b4d, (q15_t)0x5b3c, (q15_t)0x5b2a, (q15_t)0x5b19, + (q15_t)0x5b07, (q15_t)0x5af5, (q15_t)0x5ae4, (q15_t)0x5ad2, (q15_t)0x5ac0, (q15_t)0x5aae, (q15_t)0x5a9d, (q15_t)0x5a8b, + (q15_t)0x5a79, (q15_t)0x5a67, (q15_t)0x5a56, (q15_t)0x5a44, (q15_t)0x5a32, (q15_t)0x5a20, (q15_t)0x5a0e, (q15_t)0x59fc, + (q15_t)0x59ea, (q15_t)0x59d9, (q15_t)0x59c7, (q15_t)0x59b5, (q15_t)0x59a3, (q15_t)0x5991, (q15_t)0x597f, (q15_t)0x596d, + (q15_t)0x595b, (q15_t)0x5949, (q15_t)0x5937, (q15_t)0x5925, (q15_t)0x5913, (q15_t)0x5901, (q15_t)0x58ef, (q15_t)0x58dd, + (q15_t)0x58cb, (q15_t)0x58b8, (q15_t)0x58a6, (q15_t)0x5894, (q15_t)0x5882, (q15_t)0x5870, (q15_t)0x585e, (q15_t)0x584b, + (q15_t)0x5839, (q15_t)0x5827, (q15_t)0x5815, (q15_t)0x5803, (q15_t)0x57f0, (q15_t)0x57de, (q15_t)0x57cc, (q15_t)0x57b9, + (q15_t)0x57a7, (q15_t)0x5795, (q15_t)0x5783, (q15_t)0x5770, (q15_t)0x575e, (q15_t)0x574b, (q15_t)0x5739, (q15_t)0x5727, + (q15_t)0x5714, (q15_t)0x5702, (q15_t)0x56ef, (q15_t)0x56dd, (q15_t)0x56ca, (q15_t)0x56b8, (q15_t)0x56a5, (q15_t)0x5693, + (q15_t)0x5680, (q15_t)0x566e, (q15_t)0x565b, (q15_t)0x5649, (q15_t)0x5636, (q15_t)0x5624, (q15_t)0x5611, (q15_t)0x55fe, + (q15_t)0x55ec, (q15_t)0x55d9, (q15_t)0x55c7, (q15_t)0x55b4, (q15_t)0x55a1, (q15_t)0x558f, (q15_t)0x557c, (q15_t)0x5569, + (q15_t)0x5556, (q15_t)0x5544, (q15_t)0x5531, (q15_t)0x551e, (q15_t)0x550b, (q15_t)0x54f9, (q15_t)0x54e6, (q15_t)0x54d3, + (q15_t)0x54c0, (q15_t)0x54ad, (q15_t)0x549a, (q15_t)0x5488, (q15_t)0x5475, (q15_t)0x5462, (q15_t)0x544f, (q15_t)0x543c, + (q15_t)0x5429, (q15_t)0x5416, (q15_t)0x5403, (q15_t)0x53f0, (q15_t)0x53dd, (q15_t)0x53ca, (q15_t)0x53b7, (q15_t)0x53a4, + (q15_t)0x5391, (q15_t)0x537e, (q15_t)0x536b, (q15_t)0x5358, (q15_t)0x5345, (q15_t)0x5332, (q15_t)0x531f, (q15_t)0x530c, + (q15_t)0x52f8, (q15_t)0x52e5, (q15_t)0x52d2, (q15_t)0x52bf, (q15_t)0x52ac, (q15_t)0x5299, (q15_t)0x5285, (q15_t)0x5272, + (q15_t)0x525f, (q15_t)0x524c, (q15_t)0x5238, (q15_t)0x5225, (q15_t)0x5212, (q15_t)0x51ff, (q15_t)0x51eb, (q15_t)0x51d8, + (q15_t)0x51c5, (q15_t)0x51b1, (q15_t)0x519e, (q15_t)0x518b, (q15_t)0x5177, (q15_t)0x5164, (q15_t)0x5150, (q15_t)0x513d, + (q15_t)0x512a, (q15_t)0x5116, (q15_t)0x5103, (q15_t)0x50ef, (q15_t)0x50dc, (q15_t)0x50c8, (q15_t)0x50b5, (q15_t)0x50a1, + (q15_t)0x508e, (q15_t)0x507a, (q15_t)0x5067, (q15_t)0x5053, (q15_t)0x503f, (q15_t)0x502c, (q15_t)0x5018, (q15_t)0x5005, + (q15_t)0x4ff1, (q15_t)0x4fdd, (q15_t)0x4fca, (q15_t)0x4fb6, (q15_t)0x4fa2, (q15_t)0x4f8f, (q15_t)0x4f7b, (q15_t)0x4f67, + (q15_t)0x4f54, (q15_t)0x4f40, (q15_t)0x4f2c, (q15_t)0x4f18, (q15_t)0x4f05, (q15_t)0x4ef1, (q15_t)0x4edd, (q15_t)0x4ec9, + (q15_t)0x4eb6, (q15_t)0x4ea2, (q15_t)0x4e8e, (q15_t)0x4e7a, (q15_t)0x4e66, (q15_t)0x4e52, (q15_t)0x4e3e, (q15_t)0x4e2a, + (q15_t)0x4e17, (q15_t)0x4e03, (q15_t)0x4def, (q15_t)0x4ddb, (q15_t)0x4dc7, (q15_t)0x4db3, (q15_t)0x4d9f, (q15_t)0x4d8b, + (q15_t)0x4d77, (q15_t)0x4d63, (q15_t)0x4d4f, (q15_t)0x4d3b, (q15_t)0x4d27, (q15_t)0x4d13, (q15_t)0x4cff, (q15_t)0x4ceb, + (q15_t)0x4cd6, (q15_t)0x4cc2, (q15_t)0x4cae, (q15_t)0x4c9a, (q15_t)0x4c86, (q15_t)0x4c72, (q15_t)0x4c5e, (q15_t)0x4c49, + (q15_t)0x4c35, (q15_t)0x4c21, (q15_t)0x4c0d, (q15_t)0x4bf9, (q15_t)0x4be4, (q15_t)0x4bd0, (q15_t)0x4bbc, (q15_t)0x4ba8, + (q15_t)0x4b93, (q15_t)0x4b7f, (q15_t)0x4b6b, (q15_t)0x4b56, (q15_t)0x4b42, (q15_t)0x4b2e, (q15_t)0x4b19, (q15_t)0x4b05, + (q15_t)0x4af1, (q15_t)0x4adc, (q15_t)0x4ac8, (q15_t)0x4ab4, (q15_t)0x4a9f, (q15_t)0x4a8b, (q15_t)0x4a76, (q15_t)0x4a62, + (q15_t)0x4a4d, (q15_t)0x4a39, (q15_t)0x4a24, (q15_t)0x4a10, (q15_t)0x49fb, (q15_t)0x49e7, (q15_t)0x49d2, (q15_t)0x49be, + (q15_t)0x49a9, (q15_t)0x4995, (q15_t)0x4980, (q15_t)0x496c, (q15_t)0x4957, (q15_t)0x4942, (q15_t)0x492e, (q15_t)0x4919, + (q15_t)0x4905, (q15_t)0x48f0, (q15_t)0x48db, (q15_t)0x48c7, (q15_t)0x48b2, (q15_t)0x489d, (q15_t)0x4888, (q15_t)0x4874, + (q15_t)0x485f, (q15_t)0x484a, (q15_t)0x4836, (q15_t)0x4821, (q15_t)0x480c, (q15_t)0x47f7, (q15_t)0x47e2, (q15_t)0x47ce, + (q15_t)0x47b9, (q15_t)0x47a4, (q15_t)0x478f, (q15_t)0x477a, (q15_t)0x4765, (q15_t)0x4751, (q15_t)0x473c, (q15_t)0x4727, + (q15_t)0x4712, (q15_t)0x46fd, (q15_t)0x46e8, (q15_t)0x46d3, (q15_t)0x46be, (q15_t)0x46a9, (q15_t)0x4694, (q15_t)0x467f, + (q15_t)0x466a, (q15_t)0x4655, (q15_t)0x4640, (q15_t)0x462b, (q15_t)0x4616, (q15_t)0x4601, (q15_t)0x45ec, (q15_t)0x45d7, + (q15_t)0x45c2, (q15_t)0x45ad, (q15_t)0x4598, (q15_t)0x4583, (q15_t)0x456e, (q15_t)0x4559, (q15_t)0x4544, (q15_t)0x452e, + (q15_t)0x4519, (q15_t)0x4504, (q15_t)0x44ef, (q15_t)0x44da, (q15_t)0x44c5, (q15_t)0x44af, (q15_t)0x449a, (q15_t)0x4485, + (q15_t)0x4470, (q15_t)0x445a, (q15_t)0x4445, (q15_t)0x4430, (q15_t)0x441b, (q15_t)0x4405, (q15_t)0x43f0, (q15_t)0x43db, + (q15_t)0x43c5, (q15_t)0x43b0, (q15_t)0x439b, (q15_t)0x4385, (q15_t)0x4370, (q15_t)0x435b, (q15_t)0x4345, (q15_t)0x4330, + (q15_t)0x431b, (q15_t)0x4305, (q15_t)0x42f0, (q15_t)0x42da, (q15_t)0x42c5, (q15_t)0x42af, (q15_t)0x429a, (q15_t)0x4284, + (q15_t)0x426f, (q15_t)0x425a, (q15_t)0x4244, (q15_t)0x422f, (q15_t)0x4219, (q15_t)0x4203, (q15_t)0x41ee, (q15_t)0x41d8, + (q15_t)0x41c3, (q15_t)0x41ad, (q15_t)0x4198, (q15_t)0x4182, (q15_t)0x416d, (q15_t)0x4157, (q15_t)0x4141, (q15_t)0x412c, + (q15_t)0x4116, (q15_t)0x4100, (q15_t)0x40eb, (q15_t)0x40d5, (q15_t)0x40bf, (q15_t)0x40aa, (q15_t)0x4094, (q15_t)0x407e, + (q15_t)0x4069, (q15_t)0x4053, (q15_t)0x403d, (q15_t)0x4027, (q15_t)0x4012, (q15_t)0x3ffc, (q15_t)0x3fe6, (q15_t)0x3fd0, + (q15_t)0x3fbb, (q15_t)0x3fa5, (q15_t)0x3f8f, (q15_t)0x3f79, (q15_t)0x3f63, (q15_t)0x3f4d, (q15_t)0x3f38, (q15_t)0x3f22, + (q15_t)0x3f0c, (q15_t)0x3ef6, (q15_t)0x3ee0, (q15_t)0x3eca, (q15_t)0x3eb4, (q15_t)0x3e9e, (q15_t)0x3e88, (q15_t)0x3e73, + (q15_t)0x3e5d, (q15_t)0x3e47, (q15_t)0x3e31, (q15_t)0x3e1b, (q15_t)0x3e05, (q15_t)0x3def, (q15_t)0x3dd9, (q15_t)0x3dc3, + (q15_t)0x3dad, (q15_t)0x3d97, (q15_t)0x3d81, (q15_t)0x3d6b, (q15_t)0x3d55, (q15_t)0x3d3e, (q15_t)0x3d28, (q15_t)0x3d12, + (q15_t)0x3cfc, (q15_t)0x3ce6, (q15_t)0x3cd0, (q15_t)0x3cba, (q15_t)0x3ca4, (q15_t)0x3c8e, (q15_t)0x3c77, (q15_t)0x3c61, + (q15_t)0x3c4b, (q15_t)0x3c35, (q15_t)0x3c1f, (q15_t)0x3c09, (q15_t)0x3bf2, (q15_t)0x3bdc, (q15_t)0x3bc6, (q15_t)0x3bb0, + (q15_t)0x3b99, (q15_t)0x3b83, (q15_t)0x3b6d, (q15_t)0x3b57, (q15_t)0x3b40, (q15_t)0x3b2a, (q15_t)0x3b14, (q15_t)0x3afe, + (q15_t)0x3ae7, (q15_t)0x3ad1, (q15_t)0x3abb, (q15_t)0x3aa4, (q15_t)0x3a8e, (q15_t)0x3a78, (q15_t)0x3a61, (q15_t)0x3a4b, + (q15_t)0x3a34, (q15_t)0x3a1e, (q15_t)0x3a08, (q15_t)0x39f1, (q15_t)0x39db, (q15_t)0x39c4, (q15_t)0x39ae, (q15_t)0x3998, + (q15_t)0x3981, (q15_t)0x396b, (q15_t)0x3954, (q15_t)0x393e, (q15_t)0x3927, (q15_t)0x3911, (q15_t)0x38fa, (q15_t)0x38e4, + (q15_t)0x38cd, (q15_t)0x38b7, (q15_t)0x38a0, (q15_t)0x388a, (q15_t)0x3873, (q15_t)0x385d, (q15_t)0x3846, (q15_t)0x382f, + (q15_t)0x3819, (q15_t)0x3802, (q15_t)0x37ec, (q15_t)0x37d5, (q15_t)0x37be, (q15_t)0x37a8, (q15_t)0x3791, (q15_t)0x377a, + (q15_t)0x3764, (q15_t)0x374d, (q15_t)0x3736, (q15_t)0x3720, (q15_t)0x3709, (q15_t)0x36f2, (q15_t)0x36dc, (q15_t)0x36c5, + (q15_t)0x36ae, (q15_t)0x3698, (q15_t)0x3681, (q15_t)0x366a, (q15_t)0x3653, (q15_t)0x363d, (q15_t)0x3626, (q15_t)0x360f, + (q15_t)0x35f8, (q15_t)0x35e1, (q15_t)0x35cb, (q15_t)0x35b4, (q15_t)0x359d, (q15_t)0x3586, (q15_t)0x356f, (q15_t)0x3558, + (q15_t)0x3542, (q15_t)0x352b, (q15_t)0x3514, (q15_t)0x34fd, (q15_t)0x34e6, (q15_t)0x34cf, (q15_t)0x34b8, (q15_t)0x34a1, + (q15_t)0x348b, (q15_t)0x3474, (q15_t)0x345d, (q15_t)0x3446, (q15_t)0x342f, (q15_t)0x3418, (q15_t)0x3401, (q15_t)0x33ea, + (q15_t)0x33d3, (q15_t)0x33bc, (q15_t)0x33a5, (q15_t)0x338e, (q15_t)0x3377, (q15_t)0x3360, (q15_t)0x3349, (q15_t)0x3332, + (q15_t)0x331b, (q15_t)0x3304, (q15_t)0x32ed, (q15_t)0x32d6, (q15_t)0x32bf, (q15_t)0x32a8, (q15_t)0x3290, (q15_t)0x3279, + (q15_t)0x3262, (q15_t)0x324b, (q15_t)0x3234, (q15_t)0x321d, (q15_t)0x3206, (q15_t)0x31ef, (q15_t)0x31d8, (q15_t)0x31c0, + (q15_t)0x31a9, (q15_t)0x3192, (q15_t)0x317b, (q15_t)0x3164, (q15_t)0x314c, (q15_t)0x3135, (q15_t)0x311e, (q15_t)0x3107, + (q15_t)0x30f0, (q15_t)0x30d8, (q15_t)0x30c1, (q15_t)0x30aa, (q15_t)0x3093, (q15_t)0x307b, (q15_t)0x3064, (q15_t)0x304d, + (q15_t)0x3036, (q15_t)0x301e, (q15_t)0x3007, (q15_t)0x2ff0, (q15_t)0x2fd8, (q15_t)0x2fc1, (q15_t)0x2faa, (q15_t)0x2f92, + (q15_t)0x2f7b, (q15_t)0x2f64, (q15_t)0x2f4c, (q15_t)0x2f35, (q15_t)0x2f1e, (q15_t)0x2f06, (q15_t)0x2eef, (q15_t)0x2ed8, + (q15_t)0x2ec0, (q15_t)0x2ea9, (q15_t)0x2e91, (q15_t)0x2e7a, (q15_t)0x2e63, (q15_t)0x2e4b, (q15_t)0x2e34, (q15_t)0x2e1c, + (q15_t)0x2e05, (q15_t)0x2ded, (q15_t)0x2dd6, (q15_t)0x2dbe, (q15_t)0x2da7, (q15_t)0x2d8f, (q15_t)0x2d78, (q15_t)0x2d60, + (q15_t)0x2d49, (q15_t)0x2d31, (q15_t)0x2d1a, (q15_t)0x2d02, (q15_t)0x2ceb, (q15_t)0x2cd3, (q15_t)0x2cbc, (q15_t)0x2ca4, + (q15_t)0x2c8d, (q15_t)0x2c75, (q15_t)0x2c5e, (q15_t)0x2c46, (q15_t)0x2c2e, (q15_t)0x2c17, (q15_t)0x2bff, (q15_t)0x2be8, + (q15_t)0x2bd0, (q15_t)0x2bb8, (q15_t)0x2ba1, (q15_t)0x2b89, (q15_t)0x2b71, (q15_t)0x2b5a, (q15_t)0x2b42, (q15_t)0x2b2b, + (q15_t)0x2b13, (q15_t)0x2afb, (q15_t)0x2ae4, (q15_t)0x2acc, (q15_t)0x2ab4, (q15_t)0x2a9c, (q15_t)0x2a85, (q15_t)0x2a6d, + (q15_t)0x2a55, (q15_t)0x2a3e, (q15_t)0x2a26, (q15_t)0x2a0e, (q15_t)0x29f6, (q15_t)0x29df, (q15_t)0x29c7, (q15_t)0x29af, + (q15_t)0x2997, (q15_t)0x2980, (q15_t)0x2968, (q15_t)0x2950, (q15_t)0x2938, (q15_t)0x2920, (q15_t)0x2909, (q15_t)0x28f1, + (q15_t)0x28d9, (q15_t)0x28c1, (q15_t)0x28a9, (q15_t)0x2892, (q15_t)0x287a, (q15_t)0x2862, (q15_t)0x284a, (q15_t)0x2832, + (q15_t)0x281a, (q15_t)0x2802, (q15_t)0x27eb, (q15_t)0x27d3, (q15_t)0x27bb, (q15_t)0x27a3, (q15_t)0x278b, (q15_t)0x2773, + (q15_t)0x275b, (q15_t)0x2743, (q15_t)0x272b, (q15_t)0x2713, (q15_t)0x26fb, (q15_t)0x26e4, (q15_t)0x26cc, (q15_t)0x26b4, + (q15_t)0x269c, (q15_t)0x2684, (q15_t)0x266c, (q15_t)0x2654, (q15_t)0x263c, (q15_t)0x2624, (q15_t)0x260c, (q15_t)0x25f4, + (q15_t)0x25dc, (q15_t)0x25c4, (q15_t)0x25ac, (q15_t)0x2594, (q15_t)0x257c, (q15_t)0x2564, (q15_t)0x254c, (q15_t)0x2534, + (q15_t)0x251c, (q15_t)0x2503, (q15_t)0x24eb, (q15_t)0x24d3, (q15_t)0x24bb, (q15_t)0x24a3, (q15_t)0x248b, (q15_t)0x2473, + (q15_t)0x245b, (q15_t)0x2443, (q15_t)0x242b, (q15_t)0x2413, (q15_t)0x23fa, (q15_t)0x23e2, (q15_t)0x23ca, (q15_t)0x23b2, + (q15_t)0x239a, (q15_t)0x2382, (q15_t)0x236a, (q15_t)0x2352, (q15_t)0x2339, (q15_t)0x2321, (q15_t)0x2309, (q15_t)0x22f1, + (q15_t)0x22d9, (q15_t)0x22c0, (q15_t)0x22a8, (q15_t)0x2290, (q15_t)0x2278, (q15_t)0x2260, (q15_t)0x2247, (q15_t)0x222f, + (q15_t)0x2217, (q15_t)0x21ff, (q15_t)0x21e7, (q15_t)0x21ce, (q15_t)0x21b6, (q15_t)0x219e, (q15_t)0x2186, (q15_t)0x216d, + (q15_t)0x2155, (q15_t)0x213d, (q15_t)0x2125, (q15_t)0x210c, (q15_t)0x20f4, (q15_t)0x20dc, (q15_t)0x20c3, (q15_t)0x20ab, + (q15_t)0x2093, (q15_t)0x207a, (q15_t)0x2062, (q15_t)0x204a, (q15_t)0x2032, (q15_t)0x2019, (q15_t)0x2001, (q15_t)0x1fe9, + (q15_t)0x1fd0, (q15_t)0x1fb8, (q15_t)0x1f9f, (q15_t)0x1f87, (q15_t)0x1f6f, (q15_t)0x1f56, (q15_t)0x1f3e, (q15_t)0x1f26, + (q15_t)0x1f0d, (q15_t)0x1ef5, (q15_t)0x1edd, (q15_t)0x1ec4, (q15_t)0x1eac, (q15_t)0x1e93, (q15_t)0x1e7b, (q15_t)0x1e62, + (q15_t)0x1e4a, (q15_t)0x1e32, (q15_t)0x1e19, (q15_t)0x1e01, (q15_t)0x1de8, (q15_t)0x1dd0, (q15_t)0x1db7, (q15_t)0x1d9f, + (q15_t)0x1d87, (q15_t)0x1d6e, (q15_t)0x1d56, (q15_t)0x1d3d, (q15_t)0x1d25, (q15_t)0x1d0c, (q15_t)0x1cf4, (q15_t)0x1cdb, + (q15_t)0x1cc3, (q15_t)0x1caa, (q15_t)0x1c92, (q15_t)0x1c79, (q15_t)0x1c61, (q15_t)0x1c48, (q15_t)0x1c30, (q15_t)0x1c17, + (q15_t)0x1bff, (q15_t)0x1be6, (q15_t)0x1bce, (q15_t)0x1bb5, (q15_t)0x1b9d, (q15_t)0x1b84, (q15_t)0x1b6c, (q15_t)0x1b53, + (q15_t)0x1b3a, (q15_t)0x1b22, (q15_t)0x1b09, (q15_t)0x1af1, (q15_t)0x1ad8, (q15_t)0x1ac0, (q15_t)0x1aa7, (q15_t)0x1a8e, + (q15_t)0x1a76, (q15_t)0x1a5d, (q15_t)0x1a45, (q15_t)0x1a2c, (q15_t)0x1a13, (q15_t)0x19fb, (q15_t)0x19e2, (q15_t)0x19ca, + (q15_t)0x19b1, (q15_t)0x1998, (q15_t)0x1980, (q15_t)0x1967, (q15_t)0x194e, (q15_t)0x1936, (q15_t)0x191d, (q15_t)0x1905, + (q15_t)0x18ec, (q15_t)0x18d3, (q15_t)0x18bb, (q15_t)0x18a2, (q15_t)0x1889, (q15_t)0x1871, (q15_t)0x1858, (q15_t)0x183f, + (q15_t)0x1827, (q15_t)0x180e, (q15_t)0x17f5, (q15_t)0x17dd, (q15_t)0x17c4, (q15_t)0x17ab, (q15_t)0x1792, (q15_t)0x177a, + (q15_t)0x1761, (q15_t)0x1748, (q15_t)0x1730, (q15_t)0x1717, (q15_t)0x16fe, (q15_t)0x16e5, (q15_t)0x16cd, (q15_t)0x16b4, + (q15_t)0x169b, (q15_t)0x1682, (q15_t)0x166a, (q15_t)0x1651, (q15_t)0x1638, (q15_t)0x161f, (q15_t)0x1607, (q15_t)0x15ee, + (q15_t)0x15d5, (q15_t)0x15bc, (q15_t)0x15a4, (q15_t)0x158b, (q15_t)0x1572, (q15_t)0x1559, (q15_t)0x1541, (q15_t)0x1528, + (q15_t)0x150f, (q15_t)0x14f6, (q15_t)0x14dd, (q15_t)0x14c5, (q15_t)0x14ac, (q15_t)0x1493, (q15_t)0x147a, (q15_t)0x1461, + (q15_t)0x1449, (q15_t)0x1430, (q15_t)0x1417, (q15_t)0x13fe, (q15_t)0x13e5, (q15_t)0x13cc, (q15_t)0x13b4, (q15_t)0x139b, + (q15_t)0x1382, (q15_t)0x1369, (q15_t)0x1350, (q15_t)0x1337, (q15_t)0x131f, (q15_t)0x1306, (q15_t)0x12ed, (q15_t)0x12d4, + (q15_t)0x12bb, (q15_t)0x12a2, (q15_t)0x1289, (q15_t)0x1271, (q15_t)0x1258, (q15_t)0x123f, (q15_t)0x1226, (q15_t)0x120d, + (q15_t)0x11f4, (q15_t)0x11db, (q15_t)0x11c2, (q15_t)0x11a9, (q15_t)0x1191, (q15_t)0x1178, (q15_t)0x115f, (q15_t)0x1146, + (q15_t)0x112d, (q15_t)0x1114, (q15_t)0x10fb, (q15_t)0x10e2, (q15_t)0x10c9, (q15_t)0x10b0, (q15_t)0x1098, (q15_t)0x107f, + (q15_t)0x1066, (q15_t)0x104d, (q15_t)0x1034, (q15_t)0x101b, (q15_t)0x1002, (q15_t)0xfe9, (q15_t)0xfd0, (q15_t)0xfb7, + (q15_t)0xf9e, (q15_t)0xf85, (q15_t)0xf6c, (q15_t)0xf53, (q15_t)0xf3a, (q15_t)0xf21, (q15_t)0xf08, (q15_t)0xef0, + (q15_t)0xed7, (q15_t)0xebe, (q15_t)0xea5, (q15_t)0xe8c, (q15_t)0xe73, (q15_t)0xe5a, (q15_t)0xe41, (q15_t)0xe28, + (q15_t)0xe0f, (q15_t)0xdf6, (q15_t)0xddd, (q15_t)0xdc4, (q15_t)0xdab, (q15_t)0xd92, (q15_t)0xd79, (q15_t)0xd60, + (q15_t)0xd47, (q15_t)0xd2e, (q15_t)0xd15, (q15_t)0xcfc, (q15_t)0xce3, (q15_t)0xcca, (q15_t)0xcb1, (q15_t)0xc98, + (q15_t)0xc7f, (q15_t)0xc66, (q15_t)0xc4d, (q15_t)0xc34, (q15_t)0xc1b, (q15_t)0xc02, (q15_t)0xbe9, (q15_t)0xbd0, + (q15_t)0xbb7, (q15_t)0xb9e, (q15_t)0xb85, (q15_t)0xb6c, (q15_t)0xb53, (q15_t)0xb3a, (q15_t)0xb20, (q15_t)0xb07, + (q15_t)0xaee, (q15_t)0xad5, (q15_t)0xabc, (q15_t)0xaa3, (q15_t)0xa8a, (q15_t)0xa71, (q15_t)0xa58, (q15_t)0xa3f, + (q15_t)0xa26, (q15_t)0xa0d, (q15_t)0x9f4, (q15_t)0x9db, (q15_t)0x9c2, (q15_t)0x9a9, (q15_t)0x990, (q15_t)0x977, + (q15_t)0x95e, (q15_t)0x944, (q15_t)0x92b, (q15_t)0x912, (q15_t)0x8f9, (q15_t)0x8e0, (q15_t)0x8c7, (q15_t)0x8ae, + (q15_t)0x895, (q15_t)0x87c, (q15_t)0x863, (q15_t)0x84a, (q15_t)0x831, (q15_t)0x818, (q15_t)0x7fe, (q15_t)0x7e5, + (q15_t)0x7cc, (q15_t)0x7b3, (q15_t)0x79a, (q15_t)0x781, (q15_t)0x768, (q15_t)0x74f, (q15_t)0x736, (q15_t)0x71d, + (q15_t)0x704, (q15_t)0x6ea, (q15_t)0x6d1, (q15_t)0x6b8, (q15_t)0x69f, (q15_t)0x686, (q15_t)0x66d, (q15_t)0x654, + (q15_t)0x63b, (q15_t)0x622, (q15_t)0x609, (q15_t)0x5ef, (q15_t)0x5d6, (q15_t)0x5bd, (q15_t)0x5a4, (q15_t)0x58b, + (q15_t)0x572, (q15_t)0x559, (q15_t)0x540, (q15_t)0x527, (q15_t)0x50d, (q15_t)0x4f4, (q15_t)0x4db, (q15_t)0x4c2, + (q15_t)0x4a9, (q15_t)0x490, (q15_t)0x477, (q15_t)0x45e, (q15_t)0x445, (q15_t)0x42b, (q15_t)0x412, (q15_t)0x3f9, + (q15_t)0x3e0, (q15_t)0x3c7, (q15_t)0x3ae, (q15_t)0x395, (q15_t)0x37c, (q15_t)0x362, (q15_t)0x349, (q15_t)0x330, + (q15_t)0x317, (q15_t)0x2fe, (q15_t)0x2e5, (q15_t)0x2cc, (q15_t)0x2b3, (q15_t)0x299, (q15_t)0x280, (q15_t)0x267, + (q15_t)0x24e, (q15_t)0x235, (q15_t)0x21c, (q15_t)0x203, (q15_t)0x1ea, (q15_t)0x1d0, (q15_t)0x1b7, (q15_t)0x19e, + (q15_t)0x185, (q15_t)0x16c, (q15_t)0x153, (q15_t)0x13a, (q15_t)0x121, (q15_t)0x107, (q15_t)0xee, (q15_t)0xd5, + (q15_t)0xbc, (q15_t)0xa3, (q15_t)0x8a, (q15_t)0x71, (q15_t)0x57, (q15_t)0x3e, (q15_t)0x25, (q15_t)0xc + +}; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_8192) + const q15_t __ALIGNED(4) WeightsQ15_8192[16384] = { + (q15_t)0x7fff, (q15_t)0x0, (q15_t)0x7fff, (q15_t)0xfffa, (q15_t)0x7fff, (q15_t)0xfff4, (q15_t)0x7fff, (q15_t)0xffee, + (q15_t)0x7fff, (q15_t)0xffe7, (q15_t)0x7fff, (q15_t)0xffe1, (q15_t)0x7fff, (q15_t)0xffdb, (q15_t)0x7fff, (q15_t)0xffd5, + (q15_t)0x7fff, (q15_t)0xffce, (q15_t)0x7fff, (q15_t)0xffc8, (q15_t)0x7fff, (q15_t)0xffc2, (q15_t)0x7fff, (q15_t)0xffbb, + (q15_t)0x7fff, (q15_t)0xffb5, (q15_t)0x7fff, (q15_t)0xffaf, (q15_t)0x7fff, (q15_t)0xffa9, (q15_t)0x7fff, (q15_t)0xffa2, + (q15_t)0x7fff, (q15_t)0xff9c, (q15_t)0x7fff, (q15_t)0xff96, (q15_t)0x7fff, (q15_t)0xff8f, (q15_t)0x7fff, (q15_t)0xff89, + (q15_t)0x7fff, (q15_t)0xff83, (q15_t)0x7fff, (q15_t)0xff7d, (q15_t)0x7fff, (q15_t)0xff76, (q15_t)0x7fff, (q15_t)0xff70, + (q15_t)0x7fff, (q15_t)0xff6a, (q15_t)0x7fff, (q15_t)0xff63, (q15_t)0x7fff, (q15_t)0xff5d, (q15_t)0x7fff, (q15_t)0xff57, + (q15_t)0x7fff, (q15_t)0xff51, (q15_t)0x7fff, (q15_t)0xff4a, (q15_t)0x7fff, (q15_t)0xff44, (q15_t)0x7fff, (q15_t)0xff3e, + (q15_t)0x7fff, (q15_t)0xff37, (q15_t)0x7fff, (q15_t)0xff31, (q15_t)0x7fff, (q15_t)0xff2b, (q15_t)0x7fff, (q15_t)0xff25, + (q15_t)0x7fff, (q15_t)0xff1e, (q15_t)0x7fff, (q15_t)0xff18, (q15_t)0x7fff, (q15_t)0xff12, (q15_t)0x7fff, (q15_t)0xff0b, + (q15_t)0x7fff, (q15_t)0xff05, (q15_t)0x7ffe, (q15_t)0xfeff, (q15_t)0x7ffe, (q15_t)0xfef9, (q15_t)0x7ffe, (q15_t)0xfef2, + (q15_t)0x7ffe, (q15_t)0xfeec, (q15_t)0x7ffe, (q15_t)0xfee6, (q15_t)0x7ffe, (q15_t)0xfedf, (q15_t)0x7ffe, (q15_t)0xfed9, + (q15_t)0x7ffe, (q15_t)0xfed3, (q15_t)0x7ffe, (q15_t)0xfecd, (q15_t)0x7ffe, (q15_t)0xfec6, (q15_t)0x7ffe, (q15_t)0xfec0, + (q15_t)0x7ffe, (q15_t)0xfeba, (q15_t)0x7ffe, (q15_t)0xfeb3, (q15_t)0x7ffe, (q15_t)0xfead, (q15_t)0x7ffe, (q15_t)0xfea7, + (q15_t)0x7ffe, (q15_t)0xfea1, (q15_t)0x7ffe, (q15_t)0xfe9a, (q15_t)0x7ffd, (q15_t)0xfe94, (q15_t)0x7ffd, (q15_t)0xfe8e, + (q15_t)0x7ffd, (q15_t)0xfe88, (q15_t)0x7ffd, (q15_t)0xfe81, (q15_t)0x7ffd, (q15_t)0xfe7b, (q15_t)0x7ffd, (q15_t)0xfe75, + (q15_t)0x7ffd, (q15_t)0xfe6e, (q15_t)0x7ffd, (q15_t)0xfe68, (q15_t)0x7ffd, (q15_t)0xfe62, (q15_t)0x7ffd, (q15_t)0xfe5c, + (q15_t)0x7ffd, (q15_t)0xfe55, (q15_t)0x7ffd, (q15_t)0xfe4f, (q15_t)0x7ffd, (q15_t)0xfe49, (q15_t)0x7ffc, (q15_t)0xfe42, + (q15_t)0x7ffc, (q15_t)0xfe3c, (q15_t)0x7ffc, (q15_t)0xfe36, (q15_t)0x7ffc, (q15_t)0xfe30, (q15_t)0x7ffc, (q15_t)0xfe29, + (q15_t)0x7ffc, (q15_t)0xfe23, (q15_t)0x7ffc, (q15_t)0xfe1d, (q15_t)0x7ffc, (q15_t)0xfe16, (q15_t)0x7ffc, (q15_t)0xfe10, + (q15_t)0x7ffc, (q15_t)0xfe0a, (q15_t)0x7ffc, (q15_t)0xfe04, (q15_t)0x7ffb, (q15_t)0xfdfd, (q15_t)0x7ffb, (q15_t)0xfdf7, + (q15_t)0x7ffb, (q15_t)0xfdf1, (q15_t)0x7ffb, (q15_t)0xfdea, (q15_t)0x7ffb, (q15_t)0xfde4, (q15_t)0x7ffb, (q15_t)0xfdde, + (q15_t)0x7ffb, (q15_t)0xfdd8, (q15_t)0x7ffb, (q15_t)0xfdd1, (q15_t)0x7ffb, (q15_t)0xfdcb, (q15_t)0x7ffb, (q15_t)0xfdc5, + (q15_t)0x7ffa, (q15_t)0xfdbe, (q15_t)0x7ffa, (q15_t)0xfdb8, (q15_t)0x7ffa, (q15_t)0xfdb2, (q15_t)0x7ffa, (q15_t)0xfdac, + (q15_t)0x7ffa, (q15_t)0xfda5, (q15_t)0x7ffa, (q15_t)0xfd9f, (q15_t)0x7ffa, (q15_t)0xfd99, (q15_t)0x7ffa, (q15_t)0xfd93, + (q15_t)0x7ff9, (q15_t)0xfd8c, (q15_t)0x7ff9, (q15_t)0xfd86, (q15_t)0x7ff9, (q15_t)0xfd80, (q15_t)0x7ff9, (q15_t)0xfd79, + (q15_t)0x7ff9, (q15_t)0xfd73, (q15_t)0x7ff9, (q15_t)0xfd6d, (q15_t)0x7ff9, (q15_t)0xfd67, (q15_t)0x7ff9, (q15_t)0xfd60, + (q15_t)0x7ff8, (q15_t)0xfd5a, (q15_t)0x7ff8, (q15_t)0xfd54, (q15_t)0x7ff8, (q15_t)0xfd4d, (q15_t)0x7ff8, (q15_t)0xfd47, + (q15_t)0x7ff8, (q15_t)0xfd41, (q15_t)0x7ff8, (q15_t)0xfd3b, (q15_t)0x7ff8, (q15_t)0xfd34, (q15_t)0x7ff8, (q15_t)0xfd2e, + (q15_t)0x7ff7, (q15_t)0xfd28, (q15_t)0x7ff7, (q15_t)0xfd21, (q15_t)0x7ff7, (q15_t)0xfd1b, (q15_t)0x7ff7, (q15_t)0xfd15, + (q15_t)0x7ff7, (q15_t)0xfd0f, (q15_t)0x7ff7, (q15_t)0xfd08, (q15_t)0x7ff7, (q15_t)0xfd02, (q15_t)0x7ff6, (q15_t)0xfcfc, + (q15_t)0x7ff6, (q15_t)0xfcf5, (q15_t)0x7ff6, (q15_t)0xfcef, (q15_t)0x7ff6, (q15_t)0xfce9, (q15_t)0x7ff6, (q15_t)0xfce3, + (q15_t)0x7ff6, (q15_t)0xfcdc, (q15_t)0x7ff5, (q15_t)0xfcd6, (q15_t)0x7ff5, (q15_t)0xfcd0, (q15_t)0x7ff5, (q15_t)0xfcc9, + (q15_t)0x7ff5, (q15_t)0xfcc3, (q15_t)0x7ff5, (q15_t)0xfcbd, (q15_t)0x7ff5, (q15_t)0xfcb7, (q15_t)0x7ff5, (q15_t)0xfcb0, + (q15_t)0x7ff4, (q15_t)0xfcaa, (q15_t)0x7ff4, (q15_t)0xfca4, (q15_t)0x7ff4, (q15_t)0xfc9e, (q15_t)0x7ff4, (q15_t)0xfc97, + (q15_t)0x7ff4, (q15_t)0xfc91, (q15_t)0x7ff4, (q15_t)0xfc8b, (q15_t)0x7ff3, (q15_t)0xfc84, (q15_t)0x7ff3, (q15_t)0xfc7e, + (q15_t)0x7ff3, (q15_t)0xfc78, (q15_t)0x7ff3, (q15_t)0xfc72, (q15_t)0x7ff3, (q15_t)0xfc6b, (q15_t)0x7ff2, (q15_t)0xfc65, + (q15_t)0x7ff2, (q15_t)0xfc5f, (q15_t)0x7ff2, (q15_t)0xfc58, (q15_t)0x7ff2, (q15_t)0xfc52, (q15_t)0x7ff2, (q15_t)0xfc4c, + (q15_t)0x7ff2, (q15_t)0xfc46, (q15_t)0x7ff1, (q15_t)0xfc3f, (q15_t)0x7ff1, (q15_t)0xfc39, (q15_t)0x7ff1, (q15_t)0xfc33, + (q15_t)0x7ff1, (q15_t)0xfc2c, (q15_t)0x7ff1, (q15_t)0xfc26, (q15_t)0x7ff0, (q15_t)0xfc20, (q15_t)0x7ff0, (q15_t)0xfc1a, + (q15_t)0x7ff0, (q15_t)0xfc13, (q15_t)0x7ff0, (q15_t)0xfc0d, (q15_t)0x7ff0, (q15_t)0xfc07, (q15_t)0x7fef, (q15_t)0xfc01, + (q15_t)0x7fef, (q15_t)0xfbfa, (q15_t)0x7fef, (q15_t)0xfbf4, (q15_t)0x7fef, (q15_t)0xfbee, (q15_t)0x7fef, (q15_t)0xfbe7, + (q15_t)0x7fee, (q15_t)0xfbe1, (q15_t)0x7fee, (q15_t)0xfbdb, (q15_t)0x7fee, (q15_t)0xfbd5, (q15_t)0x7fee, (q15_t)0xfbce, + (q15_t)0x7fee, (q15_t)0xfbc8, (q15_t)0x7fed, (q15_t)0xfbc2, (q15_t)0x7fed, (q15_t)0xfbbb, (q15_t)0x7fed, (q15_t)0xfbb5, + (q15_t)0x7fed, (q15_t)0xfbaf, (q15_t)0x7fed, (q15_t)0xfba9, (q15_t)0x7fec, (q15_t)0xfba2, (q15_t)0x7fec, (q15_t)0xfb9c, + (q15_t)0x7fec, (q15_t)0xfb96, (q15_t)0x7fec, (q15_t)0xfb8f, (q15_t)0x7fec, (q15_t)0xfb89, (q15_t)0x7feb, (q15_t)0xfb83, + (q15_t)0x7feb, (q15_t)0xfb7d, (q15_t)0x7feb, (q15_t)0xfb76, (q15_t)0x7feb, (q15_t)0xfb70, (q15_t)0x7fea, (q15_t)0xfb6a, + (q15_t)0x7fea, (q15_t)0xfb64, (q15_t)0x7fea, (q15_t)0xfb5d, (q15_t)0x7fea, (q15_t)0xfb57, (q15_t)0x7fea, (q15_t)0xfb51, + (q15_t)0x7fe9, (q15_t)0xfb4a, (q15_t)0x7fe9, (q15_t)0xfb44, (q15_t)0x7fe9, (q15_t)0xfb3e, (q15_t)0x7fe9, (q15_t)0xfb38, + (q15_t)0x7fe8, (q15_t)0xfb31, (q15_t)0x7fe8, (q15_t)0xfb2b, (q15_t)0x7fe8, (q15_t)0xfb25, (q15_t)0x7fe8, (q15_t)0xfb1e, + (q15_t)0x7fe7, (q15_t)0xfb18, (q15_t)0x7fe7, (q15_t)0xfb12, (q15_t)0x7fe7, (q15_t)0xfb0c, (q15_t)0x7fe7, (q15_t)0xfb05, + (q15_t)0x7fe6, (q15_t)0xfaff, (q15_t)0x7fe6, (q15_t)0xfaf9, (q15_t)0x7fe6, (q15_t)0xfaf3, (q15_t)0x7fe6, (q15_t)0xfaec, + (q15_t)0x7fe5, (q15_t)0xfae6, (q15_t)0x7fe5, (q15_t)0xfae0, (q15_t)0x7fe5, (q15_t)0xfad9, (q15_t)0x7fe5, (q15_t)0xfad3, + (q15_t)0x7fe4, (q15_t)0xfacd, (q15_t)0x7fe4, (q15_t)0xfac7, (q15_t)0x7fe4, (q15_t)0xfac0, (q15_t)0x7fe4, (q15_t)0xfaba, + (q15_t)0x7fe3, (q15_t)0xfab4, (q15_t)0x7fe3, (q15_t)0xfaad, (q15_t)0x7fe3, (q15_t)0xfaa7, (q15_t)0x7fe3, (q15_t)0xfaa1, + (q15_t)0x7fe2, (q15_t)0xfa9b, (q15_t)0x7fe2, (q15_t)0xfa94, (q15_t)0x7fe2, (q15_t)0xfa8e, (q15_t)0x7fe2, (q15_t)0xfa88, + (q15_t)0x7fe1, (q15_t)0xfa81, (q15_t)0x7fe1, (q15_t)0xfa7b, (q15_t)0x7fe1, (q15_t)0xfa75, (q15_t)0x7fe0, (q15_t)0xfa6f, + (q15_t)0x7fe0, (q15_t)0xfa68, (q15_t)0x7fe0, (q15_t)0xfa62, (q15_t)0x7fe0, (q15_t)0xfa5c, (q15_t)0x7fdf, (q15_t)0xfa56, + (q15_t)0x7fdf, (q15_t)0xfa4f, (q15_t)0x7fdf, (q15_t)0xfa49, (q15_t)0x7fdf, (q15_t)0xfa43, (q15_t)0x7fde, (q15_t)0xfa3c, + (q15_t)0x7fde, (q15_t)0xfa36, (q15_t)0x7fde, (q15_t)0xfa30, (q15_t)0x7fdd, (q15_t)0xfa2a, (q15_t)0x7fdd, (q15_t)0xfa23, + (q15_t)0x7fdd, (q15_t)0xfa1d, (q15_t)0x7fdd, (q15_t)0xfa17, (q15_t)0x7fdc, (q15_t)0xfa11, (q15_t)0x7fdc, (q15_t)0xfa0a, + (q15_t)0x7fdc, (q15_t)0xfa04, (q15_t)0x7fdb, (q15_t)0xf9fe, (q15_t)0x7fdb, (q15_t)0xf9f7, (q15_t)0x7fdb, (q15_t)0xf9f1, + (q15_t)0x7fda, (q15_t)0xf9eb, (q15_t)0x7fda, (q15_t)0xf9e5, (q15_t)0x7fda, (q15_t)0xf9de, (q15_t)0x7fda, (q15_t)0xf9d8, + (q15_t)0x7fd9, (q15_t)0xf9d2, (q15_t)0x7fd9, (q15_t)0xf9cb, (q15_t)0x7fd9, (q15_t)0xf9c5, (q15_t)0x7fd8, (q15_t)0xf9bf, + (q15_t)0x7fd8, (q15_t)0xf9b9, (q15_t)0x7fd8, (q15_t)0xf9b2, (q15_t)0x7fd7, (q15_t)0xf9ac, (q15_t)0x7fd7, (q15_t)0xf9a6, + (q15_t)0x7fd7, (q15_t)0xf9a0, (q15_t)0x7fd6, (q15_t)0xf999, (q15_t)0x7fd6, (q15_t)0xf993, (q15_t)0x7fd6, (q15_t)0xf98d, + (q15_t)0x7fd6, (q15_t)0xf986, (q15_t)0x7fd5, (q15_t)0xf980, (q15_t)0x7fd5, (q15_t)0xf97a, (q15_t)0x7fd5, (q15_t)0xf974, + (q15_t)0x7fd4, (q15_t)0xf96d, (q15_t)0x7fd4, (q15_t)0xf967, (q15_t)0x7fd4, (q15_t)0xf961, (q15_t)0x7fd3, (q15_t)0xf95b, + (q15_t)0x7fd3, (q15_t)0xf954, (q15_t)0x7fd3, (q15_t)0xf94e, (q15_t)0x7fd2, (q15_t)0xf948, (q15_t)0x7fd2, (q15_t)0xf941, + (q15_t)0x7fd2, (q15_t)0xf93b, (q15_t)0x7fd1, (q15_t)0xf935, (q15_t)0x7fd1, (q15_t)0xf92f, (q15_t)0x7fd1, (q15_t)0xf928, + (q15_t)0x7fd0, (q15_t)0xf922, (q15_t)0x7fd0, (q15_t)0xf91c, (q15_t)0x7fd0, (q15_t)0xf916, (q15_t)0x7fcf, (q15_t)0xf90f, + (q15_t)0x7fcf, (q15_t)0xf909, (q15_t)0x7fcf, (q15_t)0xf903, (q15_t)0x7fce, (q15_t)0xf8fc, (q15_t)0x7fce, (q15_t)0xf8f6, + (q15_t)0x7fce, (q15_t)0xf8f0, (q15_t)0x7fcd, (q15_t)0xf8ea, (q15_t)0x7fcd, (q15_t)0xf8e3, (q15_t)0x7fcd, (q15_t)0xf8dd, + (q15_t)0x7fcc, (q15_t)0xf8d7, (q15_t)0x7fcc, (q15_t)0xf8d0, (q15_t)0x7fcb, (q15_t)0xf8ca, (q15_t)0x7fcb, (q15_t)0xf8c4, + (q15_t)0x7fcb, (q15_t)0xf8be, (q15_t)0x7fca, (q15_t)0xf8b7, (q15_t)0x7fca, (q15_t)0xf8b1, (q15_t)0x7fca, (q15_t)0xf8ab, + (q15_t)0x7fc9, (q15_t)0xf8a5, (q15_t)0x7fc9, (q15_t)0xf89e, (q15_t)0x7fc9, (q15_t)0xf898, (q15_t)0x7fc8, (q15_t)0xf892, + (q15_t)0x7fc8, (q15_t)0xf88b, (q15_t)0x7fc7, (q15_t)0xf885, (q15_t)0x7fc7, (q15_t)0xf87f, (q15_t)0x7fc7, (q15_t)0xf879, + (q15_t)0x7fc6, (q15_t)0xf872, (q15_t)0x7fc6, (q15_t)0xf86c, (q15_t)0x7fc6, (q15_t)0xf866, (q15_t)0x7fc5, (q15_t)0xf860, + (q15_t)0x7fc5, (q15_t)0xf859, (q15_t)0x7fc5, (q15_t)0xf853, (q15_t)0x7fc4, (q15_t)0xf84d, (q15_t)0x7fc4, (q15_t)0xf846, + (q15_t)0x7fc3, (q15_t)0xf840, (q15_t)0x7fc3, (q15_t)0xf83a, (q15_t)0x7fc3, (q15_t)0xf834, (q15_t)0x7fc2, (q15_t)0xf82d, + (q15_t)0x7fc2, (q15_t)0xf827, (q15_t)0x7fc1, (q15_t)0xf821, (q15_t)0x7fc1, (q15_t)0xf81b, (q15_t)0x7fc1, (q15_t)0xf814, + (q15_t)0x7fc0, (q15_t)0xf80e, (q15_t)0x7fc0, (q15_t)0xf808, (q15_t)0x7fc0, (q15_t)0xf802, (q15_t)0x7fbf, (q15_t)0xf7fb, + (q15_t)0x7fbf, (q15_t)0xf7f5, (q15_t)0x7fbe, (q15_t)0xf7ef, (q15_t)0x7fbe, (q15_t)0xf7e8, (q15_t)0x7fbe, (q15_t)0xf7e2, + (q15_t)0x7fbd, (q15_t)0xf7dc, (q15_t)0x7fbd, (q15_t)0xf7d6, (q15_t)0x7fbc, (q15_t)0xf7cf, (q15_t)0x7fbc, (q15_t)0xf7c9, + (q15_t)0x7fbc, (q15_t)0xf7c3, (q15_t)0x7fbb, (q15_t)0xf7bd, (q15_t)0x7fbb, (q15_t)0xf7b6, (q15_t)0x7fba, (q15_t)0xf7b0, + (q15_t)0x7fba, (q15_t)0xf7aa, (q15_t)0x7fb9, (q15_t)0xf7a3, (q15_t)0x7fb9, (q15_t)0xf79d, (q15_t)0x7fb9, (q15_t)0xf797, + (q15_t)0x7fb8, (q15_t)0xf791, (q15_t)0x7fb8, (q15_t)0xf78a, (q15_t)0x7fb7, (q15_t)0xf784, (q15_t)0x7fb7, (q15_t)0xf77e, + (q15_t)0x7fb7, (q15_t)0xf778, (q15_t)0x7fb6, (q15_t)0xf771, (q15_t)0x7fb6, (q15_t)0xf76b, (q15_t)0x7fb5, (q15_t)0xf765, + (q15_t)0x7fb5, (q15_t)0xf75e, (q15_t)0x7fb4, (q15_t)0xf758, (q15_t)0x7fb4, (q15_t)0xf752, (q15_t)0x7fb4, (q15_t)0xf74c, + (q15_t)0x7fb3, (q15_t)0xf745, (q15_t)0x7fb3, (q15_t)0xf73f, (q15_t)0x7fb2, (q15_t)0xf739, (q15_t)0x7fb2, (q15_t)0xf733, + (q15_t)0x7fb1, (q15_t)0xf72c, (q15_t)0x7fb1, (q15_t)0xf726, (q15_t)0x7fb1, (q15_t)0xf720, (q15_t)0x7fb0, (q15_t)0xf71a, + (q15_t)0x7fb0, (q15_t)0xf713, (q15_t)0x7faf, (q15_t)0xf70d, (q15_t)0x7faf, (q15_t)0xf707, (q15_t)0x7fae, (q15_t)0xf700, + (q15_t)0x7fae, (q15_t)0xf6fa, (q15_t)0x7fae, (q15_t)0xf6f4, (q15_t)0x7fad, (q15_t)0xf6ee, (q15_t)0x7fad, (q15_t)0xf6e7, + (q15_t)0x7fac, (q15_t)0xf6e1, (q15_t)0x7fac, (q15_t)0xf6db, (q15_t)0x7fab, (q15_t)0xf6d5, (q15_t)0x7fab, (q15_t)0xf6ce, + (q15_t)0x7faa, (q15_t)0xf6c8, (q15_t)0x7faa, (q15_t)0xf6c2, (q15_t)0x7fa9, (q15_t)0xf6bc, (q15_t)0x7fa9, (q15_t)0xf6b5, + (q15_t)0x7fa9, (q15_t)0xf6af, (q15_t)0x7fa8, (q15_t)0xf6a9, (q15_t)0x7fa8, (q15_t)0xf6a2, (q15_t)0x7fa7, (q15_t)0xf69c, + (q15_t)0x7fa7, (q15_t)0xf696, (q15_t)0x7fa6, (q15_t)0xf690, (q15_t)0x7fa6, (q15_t)0xf689, (q15_t)0x7fa5, (q15_t)0xf683, + (q15_t)0x7fa5, (q15_t)0xf67d, (q15_t)0x7fa4, (q15_t)0xf677, (q15_t)0x7fa4, (q15_t)0xf670, (q15_t)0x7fa3, (q15_t)0xf66a, + (q15_t)0x7fa3, (q15_t)0xf664, (q15_t)0x7fa3, (q15_t)0xf65e, (q15_t)0x7fa2, (q15_t)0xf657, (q15_t)0x7fa2, (q15_t)0xf651, + (q15_t)0x7fa1, (q15_t)0xf64b, (q15_t)0x7fa1, (q15_t)0xf644, (q15_t)0x7fa0, (q15_t)0xf63e, (q15_t)0x7fa0, (q15_t)0xf638, + (q15_t)0x7f9f, (q15_t)0xf632, (q15_t)0x7f9f, (q15_t)0xf62b, (q15_t)0x7f9e, (q15_t)0xf625, (q15_t)0x7f9e, (q15_t)0xf61f, + (q15_t)0x7f9d, (q15_t)0xf619, (q15_t)0x7f9d, (q15_t)0xf612, (q15_t)0x7f9c, (q15_t)0xf60c, (q15_t)0x7f9c, (q15_t)0xf606, + (q15_t)0x7f9b, (q15_t)0xf600, (q15_t)0x7f9b, (q15_t)0xf5f9, (q15_t)0x7f9a, (q15_t)0xf5f3, (q15_t)0x7f9a, (q15_t)0xf5ed, + (q15_t)0x7f99, (q15_t)0xf5e7, (q15_t)0x7f99, (q15_t)0xf5e0, (q15_t)0x7f98, (q15_t)0xf5da, (q15_t)0x7f98, (q15_t)0xf5d4, + (q15_t)0x7f97, (q15_t)0xf5cd, (q15_t)0x7f97, (q15_t)0xf5c7, (q15_t)0x7f96, (q15_t)0xf5c1, (q15_t)0x7f96, (q15_t)0xf5bb, + (q15_t)0x7f95, (q15_t)0xf5b4, (q15_t)0x7f95, (q15_t)0xf5ae, (q15_t)0x7f94, (q15_t)0xf5a8, (q15_t)0x7f94, (q15_t)0xf5a2, + (q15_t)0x7f93, (q15_t)0xf59b, (q15_t)0x7f93, (q15_t)0xf595, (q15_t)0x7f92, (q15_t)0xf58f, (q15_t)0x7f92, (q15_t)0xf589, + (q15_t)0x7f91, (q15_t)0xf582, (q15_t)0x7f91, (q15_t)0xf57c, (q15_t)0x7f90, (q15_t)0xf576, (q15_t)0x7f90, (q15_t)0xf570, + (q15_t)0x7f8f, (q15_t)0xf569, (q15_t)0x7f8f, (q15_t)0xf563, (q15_t)0x7f8e, (q15_t)0xf55d, (q15_t)0x7f8e, (q15_t)0xf556, + (q15_t)0x7f8d, (q15_t)0xf550, (q15_t)0x7f8d, (q15_t)0xf54a, (q15_t)0x7f8c, (q15_t)0xf544, (q15_t)0x7f8b, (q15_t)0xf53d, + (q15_t)0x7f8b, (q15_t)0xf537, (q15_t)0x7f8a, (q15_t)0xf531, (q15_t)0x7f8a, (q15_t)0xf52b, (q15_t)0x7f89, (q15_t)0xf524, + (q15_t)0x7f89, (q15_t)0xf51e, (q15_t)0x7f88, (q15_t)0xf518, (q15_t)0x7f88, (q15_t)0xf512, (q15_t)0x7f87, (q15_t)0xf50b, + (q15_t)0x7f87, (q15_t)0xf505, (q15_t)0x7f86, (q15_t)0xf4ff, (q15_t)0x7f86, (q15_t)0xf4f9, (q15_t)0x7f85, (q15_t)0xf4f2, + (q15_t)0x7f85, (q15_t)0xf4ec, (q15_t)0x7f84, (q15_t)0xf4e6, (q15_t)0x7f83, (q15_t)0xf4e0, (q15_t)0x7f83, (q15_t)0xf4d9, + (q15_t)0x7f82, (q15_t)0xf4d3, (q15_t)0x7f82, (q15_t)0xf4cd, (q15_t)0x7f81, (q15_t)0xf4c6, (q15_t)0x7f81, (q15_t)0xf4c0, + (q15_t)0x7f80, (q15_t)0xf4ba, (q15_t)0x7f80, (q15_t)0xf4b4, (q15_t)0x7f7f, (q15_t)0xf4ad, (q15_t)0x7f7e, (q15_t)0xf4a7, + (q15_t)0x7f7e, (q15_t)0xf4a1, (q15_t)0x7f7d, (q15_t)0xf49b, (q15_t)0x7f7d, (q15_t)0xf494, (q15_t)0x7f7c, (q15_t)0xf48e, + (q15_t)0x7f7c, (q15_t)0xf488, (q15_t)0x7f7b, (q15_t)0xf482, (q15_t)0x7f7b, (q15_t)0xf47b, (q15_t)0x7f7a, (q15_t)0xf475, + (q15_t)0x7f79, (q15_t)0xf46f, (q15_t)0x7f79, (q15_t)0xf469, (q15_t)0x7f78, (q15_t)0xf462, (q15_t)0x7f78, (q15_t)0xf45c, + (q15_t)0x7f77, (q15_t)0xf456, (q15_t)0x7f77, (q15_t)0xf450, (q15_t)0x7f76, (q15_t)0xf449, (q15_t)0x7f75, (q15_t)0xf443, + (q15_t)0x7f75, (q15_t)0xf43d, (q15_t)0x7f74, (q15_t)0xf437, (q15_t)0x7f74, (q15_t)0xf430, (q15_t)0x7f73, (q15_t)0xf42a, + (q15_t)0x7f72, (q15_t)0xf424, (q15_t)0x7f72, (q15_t)0xf41e, (q15_t)0x7f71, (q15_t)0xf417, (q15_t)0x7f71, (q15_t)0xf411, + (q15_t)0x7f70, (q15_t)0xf40b, (q15_t)0x7f70, (q15_t)0xf405, (q15_t)0x7f6f, (q15_t)0xf3fe, (q15_t)0x7f6e, (q15_t)0xf3f8, + (q15_t)0x7f6e, (q15_t)0xf3f2, (q15_t)0x7f6d, (q15_t)0xf3ec, (q15_t)0x7f6d, (q15_t)0xf3e5, (q15_t)0x7f6c, (q15_t)0xf3df, + (q15_t)0x7f6b, (q15_t)0xf3d9, (q15_t)0x7f6b, (q15_t)0xf3d2, (q15_t)0x7f6a, (q15_t)0xf3cc, (q15_t)0x7f6a, (q15_t)0xf3c6, + (q15_t)0x7f69, (q15_t)0xf3c0, (q15_t)0x7f68, (q15_t)0xf3b9, (q15_t)0x7f68, (q15_t)0xf3b3, (q15_t)0x7f67, (q15_t)0xf3ad, + (q15_t)0x7f67, (q15_t)0xf3a7, (q15_t)0x7f66, (q15_t)0xf3a0, (q15_t)0x7f65, (q15_t)0xf39a, (q15_t)0x7f65, (q15_t)0xf394, + (q15_t)0x7f64, (q15_t)0xf38e, (q15_t)0x7f64, (q15_t)0xf387, (q15_t)0x7f63, (q15_t)0xf381, (q15_t)0x7f62, (q15_t)0xf37b, + (q15_t)0x7f62, (q15_t)0xf375, (q15_t)0x7f61, (q15_t)0xf36e, (q15_t)0x7f60, (q15_t)0xf368, (q15_t)0x7f60, (q15_t)0xf362, + (q15_t)0x7f5f, (q15_t)0xf35c, (q15_t)0x7f5f, (q15_t)0xf355, (q15_t)0x7f5e, (q15_t)0xf34f, (q15_t)0x7f5d, (q15_t)0xf349, + (q15_t)0x7f5d, (q15_t)0xf343, (q15_t)0x7f5c, (q15_t)0xf33c, (q15_t)0x7f5b, (q15_t)0xf336, (q15_t)0x7f5b, (q15_t)0xf330, + (q15_t)0x7f5a, (q15_t)0xf32a, (q15_t)0x7f5a, (q15_t)0xf323, (q15_t)0x7f59, (q15_t)0xf31d, (q15_t)0x7f58, (q15_t)0xf317, + (q15_t)0x7f58, (q15_t)0xf311, (q15_t)0x7f57, (q15_t)0xf30a, (q15_t)0x7f56, (q15_t)0xf304, (q15_t)0x7f56, (q15_t)0xf2fe, + (q15_t)0x7f55, (q15_t)0xf2f8, (q15_t)0x7f55, (q15_t)0xf2f1, (q15_t)0x7f54, (q15_t)0xf2eb, (q15_t)0x7f53, (q15_t)0xf2e5, + (q15_t)0x7f53, (q15_t)0xf2df, (q15_t)0x7f52, (q15_t)0xf2d8, (q15_t)0x7f51, (q15_t)0xf2d2, (q15_t)0x7f51, (q15_t)0xf2cc, + (q15_t)0x7f50, (q15_t)0xf2c6, (q15_t)0x7f4f, (q15_t)0xf2bf, (q15_t)0x7f4f, (q15_t)0xf2b9, (q15_t)0x7f4e, (q15_t)0xf2b3, + (q15_t)0x7f4d, (q15_t)0xf2ad, (q15_t)0x7f4d, (q15_t)0xf2a6, (q15_t)0x7f4c, (q15_t)0xf2a0, (q15_t)0x7f4b, (q15_t)0xf29a, + (q15_t)0x7f4b, (q15_t)0xf294, (q15_t)0x7f4a, (q15_t)0xf28d, (q15_t)0x7f49, (q15_t)0xf287, (q15_t)0x7f49, (q15_t)0xf281, + (q15_t)0x7f48, (q15_t)0xf27b, (q15_t)0x7f47, (q15_t)0xf274, (q15_t)0x7f47, (q15_t)0xf26e, (q15_t)0x7f46, (q15_t)0xf268, + (q15_t)0x7f45, (q15_t)0xf262, (q15_t)0x7f45, (q15_t)0xf25b, (q15_t)0x7f44, (q15_t)0xf255, (q15_t)0x7f43, (q15_t)0xf24f, + (q15_t)0x7f43, (q15_t)0xf249, (q15_t)0x7f42, (q15_t)0xf242, (q15_t)0x7f41, (q15_t)0xf23c, (q15_t)0x7f41, (q15_t)0xf236, + (q15_t)0x7f40, (q15_t)0xf230, (q15_t)0x7f3f, (q15_t)0xf229, (q15_t)0x7f3f, (q15_t)0xf223, (q15_t)0x7f3e, (q15_t)0xf21d, + (q15_t)0x7f3d, (q15_t)0xf217, (q15_t)0x7f3d, (q15_t)0xf210, (q15_t)0x7f3c, (q15_t)0xf20a, (q15_t)0x7f3b, (q15_t)0xf204, + (q15_t)0x7f3b, (q15_t)0xf1fe, (q15_t)0x7f3a, (q15_t)0xf1f7, (q15_t)0x7f39, (q15_t)0xf1f1, (q15_t)0x7f39, (q15_t)0xf1eb, + (q15_t)0x7f38, (q15_t)0xf1e5, (q15_t)0x7f37, (q15_t)0xf1de, (q15_t)0x7f36, (q15_t)0xf1d8, (q15_t)0x7f36, (q15_t)0xf1d2, + (q15_t)0x7f35, (q15_t)0xf1cc, (q15_t)0x7f34, (q15_t)0xf1c6, (q15_t)0x7f34, (q15_t)0xf1bf, (q15_t)0x7f33, (q15_t)0xf1b9, + (q15_t)0x7f32, (q15_t)0xf1b3, (q15_t)0x7f32, (q15_t)0xf1ad, (q15_t)0x7f31, (q15_t)0xf1a6, (q15_t)0x7f30, (q15_t)0xf1a0, + (q15_t)0x7f2f, (q15_t)0xf19a, (q15_t)0x7f2f, (q15_t)0xf194, (q15_t)0x7f2e, (q15_t)0xf18d, (q15_t)0x7f2d, (q15_t)0xf187, + (q15_t)0x7f2d, (q15_t)0xf181, (q15_t)0x7f2c, (q15_t)0xf17b, (q15_t)0x7f2b, (q15_t)0xf174, (q15_t)0x7f2a, (q15_t)0xf16e, + (q15_t)0x7f2a, (q15_t)0xf168, (q15_t)0x7f29, (q15_t)0xf162, (q15_t)0x7f28, (q15_t)0xf15b, (q15_t)0x7f28, (q15_t)0xf155, + (q15_t)0x7f27, (q15_t)0xf14f, (q15_t)0x7f26, (q15_t)0xf149, (q15_t)0x7f25, (q15_t)0xf142, (q15_t)0x7f25, (q15_t)0xf13c, + (q15_t)0x7f24, (q15_t)0xf136, (q15_t)0x7f23, (q15_t)0xf130, (q15_t)0x7f23, (q15_t)0xf129, (q15_t)0x7f22, (q15_t)0xf123, + (q15_t)0x7f21, (q15_t)0xf11d, (q15_t)0x7f20, (q15_t)0xf117, (q15_t)0x7f20, (q15_t)0xf110, (q15_t)0x7f1f, (q15_t)0xf10a, + (q15_t)0x7f1e, (q15_t)0xf104, (q15_t)0x7f1d, (q15_t)0xf0fe, (q15_t)0x7f1d, (q15_t)0xf0f8, (q15_t)0x7f1c, (q15_t)0xf0f1, + (q15_t)0x7f1b, (q15_t)0xf0eb, (q15_t)0x7f1a, (q15_t)0xf0e5, (q15_t)0x7f1a, (q15_t)0xf0df, (q15_t)0x7f19, (q15_t)0xf0d8, + (q15_t)0x7f18, (q15_t)0xf0d2, (q15_t)0x7f17, (q15_t)0xf0cc, (q15_t)0x7f17, (q15_t)0xf0c6, (q15_t)0x7f16, (q15_t)0xf0bf, + (q15_t)0x7f15, (q15_t)0xf0b9, (q15_t)0x7f14, (q15_t)0xf0b3, (q15_t)0x7f14, (q15_t)0xf0ad, (q15_t)0x7f13, (q15_t)0xf0a6, + (q15_t)0x7f12, (q15_t)0xf0a0, (q15_t)0x7f11, (q15_t)0xf09a, (q15_t)0x7f11, (q15_t)0xf094, (q15_t)0x7f10, (q15_t)0xf08d, + (q15_t)0x7f0f, (q15_t)0xf087, (q15_t)0x7f0e, (q15_t)0xf081, (q15_t)0x7f0e, (q15_t)0xf07b, (q15_t)0x7f0d, (q15_t)0xf075, + (q15_t)0x7f0c, (q15_t)0xf06e, (q15_t)0x7f0b, (q15_t)0xf068, (q15_t)0x7f0b, (q15_t)0xf062, (q15_t)0x7f0a, (q15_t)0xf05c, + (q15_t)0x7f09, (q15_t)0xf055, (q15_t)0x7f08, (q15_t)0xf04f, (q15_t)0x7f08, (q15_t)0xf049, (q15_t)0x7f07, (q15_t)0xf043, + (q15_t)0x7f06, (q15_t)0xf03c, (q15_t)0x7f05, (q15_t)0xf036, (q15_t)0x7f04, (q15_t)0xf030, (q15_t)0x7f04, (q15_t)0xf02a, + (q15_t)0x7f03, (q15_t)0xf023, (q15_t)0x7f02, (q15_t)0xf01d, (q15_t)0x7f01, (q15_t)0xf017, (q15_t)0x7f01, (q15_t)0xf011, + (q15_t)0x7f00, (q15_t)0xf00b, (q15_t)0x7eff, (q15_t)0xf004, (q15_t)0x7efe, (q15_t)0xeffe, (q15_t)0x7efd, (q15_t)0xeff8, + (q15_t)0x7efd, (q15_t)0xeff2, (q15_t)0x7efc, (q15_t)0xefeb, (q15_t)0x7efb, (q15_t)0xefe5, (q15_t)0x7efa, (q15_t)0xefdf, + (q15_t)0x7ef9, (q15_t)0xefd9, (q15_t)0x7ef9, (q15_t)0xefd2, (q15_t)0x7ef8, (q15_t)0xefcc, (q15_t)0x7ef7, (q15_t)0xefc6, + (q15_t)0x7ef6, (q15_t)0xefc0, (q15_t)0x7ef5, (q15_t)0xefb9, (q15_t)0x7ef5, (q15_t)0xefb3, (q15_t)0x7ef4, (q15_t)0xefad, + (q15_t)0x7ef3, (q15_t)0xefa7, (q15_t)0x7ef2, (q15_t)0xefa1, (q15_t)0x7ef1, (q15_t)0xef9a, (q15_t)0x7ef1, (q15_t)0xef94, + (q15_t)0x7ef0, (q15_t)0xef8e, (q15_t)0x7eef, (q15_t)0xef88, (q15_t)0x7eee, (q15_t)0xef81, (q15_t)0x7eed, (q15_t)0xef7b, + (q15_t)0x7eed, (q15_t)0xef75, (q15_t)0x7eec, (q15_t)0xef6f, (q15_t)0x7eeb, (q15_t)0xef68, (q15_t)0x7eea, (q15_t)0xef62, + (q15_t)0x7ee9, (q15_t)0xef5c, (q15_t)0x7ee9, (q15_t)0xef56, (q15_t)0x7ee8, (q15_t)0xef50, (q15_t)0x7ee7, (q15_t)0xef49, + (q15_t)0x7ee6, (q15_t)0xef43, (q15_t)0x7ee5, (q15_t)0xef3d, (q15_t)0x7ee4, (q15_t)0xef37, (q15_t)0x7ee4, (q15_t)0xef30, + (q15_t)0x7ee3, (q15_t)0xef2a, (q15_t)0x7ee2, (q15_t)0xef24, (q15_t)0x7ee1, (q15_t)0xef1e, (q15_t)0x7ee0, (q15_t)0xef18, + (q15_t)0x7edf, (q15_t)0xef11, (q15_t)0x7edf, (q15_t)0xef0b, (q15_t)0x7ede, (q15_t)0xef05, (q15_t)0x7edd, (q15_t)0xeeff, + (q15_t)0x7edc, (q15_t)0xeef8, (q15_t)0x7edb, (q15_t)0xeef2, (q15_t)0x7eda, (q15_t)0xeeec, (q15_t)0x7eda, (q15_t)0xeee6, + (q15_t)0x7ed9, (q15_t)0xeedf, (q15_t)0x7ed8, (q15_t)0xeed9, (q15_t)0x7ed7, (q15_t)0xeed3, (q15_t)0x7ed6, (q15_t)0xeecd, + (q15_t)0x7ed5, (q15_t)0xeec7, (q15_t)0x7ed5, (q15_t)0xeec0, (q15_t)0x7ed4, (q15_t)0xeeba, (q15_t)0x7ed3, (q15_t)0xeeb4, + (q15_t)0x7ed2, (q15_t)0xeeae, (q15_t)0x7ed1, (q15_t)0xeea7, (q15_t)0x7ed0, (q15_t)0xeea1, (q15_t)0x7ecf, (q15_t)0xee9b, + (q15_t)0x7ecf, (q15_t)0xee95, (q15_t)0x7ece, (q15_t)0xee8f, (q15_t)0x7ecd, (q15_t)0xee88, (q15_t)0x7ecc, (q15_t)0xee82, + (q15_t)0x7ecb, (q15_t)0xee7c, (q15_t)0x7eca, (q15_t)0xee76, (q15_t)0x7ec9, (q15_t)0xee6f, (q15_t)0x7ec9, (q15_t)0xee69, + (q15_t)0x7ec8, (q15_t)0xee63, (q15_t)0x7ec7, (q15_t)0xee5d, (q15_t)0x7ec6, (q15_t)0xee57, (q15_t)0x7ec5, (q15_t)0xee50, + (q15_t)0x7ec4, (q15_t)0xee4a, (q15_t)0x7ec3, (q15_t)0xee44, (q15_t)0x7ec3, (q15_t)0xee3e, (q15_t)0x7ec2, (q15_t)0xee37, + (q15_t)0x7ec1, (q15_t)0xee31, (q15_t)0x7ec0, (q15_t)0xee2b, (q15_t)0x7ebf, (q15_t)0xee25, (q15_t)0x7ebe, (q15_t)0xee1f, + (q15_t)0x7ebd, (q15_t)0xee18, (q15_t)0x7ebc, (q15_t)0xee12, (q15_t)0x7ebb, (q15_t)0xee0c, (q15_t)0x7ebb, (q15_t)0xee06, + (q15_t)0x7eba, (q15_t)0xedff, (q15_t)0x7eb9, (q15_t)0xedf9, (q15_t)0x7eb8, (q15_t)0xedf3, (q15_t)0x7eb7, (q15_t)0xeded, + (q15_t)0x7eb6, (q15_t)0xede7, (q15_t)0x7eb5, (q15_t)0xede0, (q15_t)0x7eb4, (q15_t)0xedda, (q15_t)0x7eb4, (q15_t)0xedd4, + (q15_t)0x7eb3, (q15_t)0xedce, (q15_t)0x7eb2, (q15_t)0xedc7, (q15_t)0x7eb1, (q15_t)0xedc1, (q15_t)0x7eb0, (q15_t)0xedbb, + (q15_t)0x7eaf, (q15_t)0xedb5, (q15_t)0x7eae, (q15_t)0xedaf, (q15_t)0x7ead, (q15_t)0xeda8, (q15_t)0x7eac, (q15_t)0xeda2, + (q15_t)0x7eab, (q15_t)0xed9c, (q15_t)0x7eab, (q15_t)0xed96, (q15_t)0x7eaa, (q15_t)0xed8f, (q15_t)0x7ea9, (q15_t)0xed89, + (q15_t)0x7ea8, (q15_t)0xed83, (q15_t)0x7ea7, (q15_t)0xed7d, (q15_t)0x7ea6, (q15_t)0xed77, (q15_t)0x7ea5, (q15_t)0xed70, + (q15_t)0x7ea4, (q15_t)0xed6a, (q15_t)0x7ea3, (q15_t)0xed64, (q15_t)0x7ea2, (q15_t)0xed5e, (q15_t)0x7ea1, (q15_t)0xed58, + (q15_t)0x7ea1, (q15_t)0xed51, (q15_t)0x7ea0, (q15_t)0xed4b, (q15_t)0x7e9f, (q15_t)0xed45, (q15_t)0x7e9e, (q15_t)0xed3f, + (q15_t)0x7e9d, (q15_t)0xed38, (q15_t)0x7e9c, (q15_t)0xed32, (q15_t)0x7e9b, (q15_t)0xed2c, (q15_t)0x7e9a, (q15_t)0xed26, + (q15_t)0x7e99, (q15_t)0xed20, (q15_t)0x7e98, (q15_t)0xed19, (q15_t)0x7e97, (q15_t)0xed13, (q15_t)0x7e96, (q15_t)0xed0d, + (q15_t)0x7e95, (q15_t)0xed07, (q15_t)0x7e94, (q15_t)0xed01, (q15_t)0x7e94, (q15_t)0xecfa, (q15_t)0x7e93, (q15_t)0xecf4, + (q15_t)0x7e92, (q15_t)0xecee, (q15_t)0x7e91, (q15_t)0xece8, (q15_t)0x7e90, (q15_t)0xece1, (q15_t)0x7e8f, (q15_t)0xecdb, + (q15_t)0x7e8e, (q15_t)0xecd5, (q15_t)0x7e8d, (q15_t)0xeccf, (q15_t)0x7e8c, (q15_t)0xecc9, (q15_t)0x7e8b, (q15_t)0xecc2, + (q15_t)0x7e8a, (q15_t)0xecbc, (q15_t)0x7e89, (q15_t)0xecb6, (q15_t)0x7e88, (q15_t)0xecb0, (q15_t)0x7e87, (q15_t)0xecaa, + (q15_t)0x7e86, (q15_t)0xeca3, (q15_t)0x7e85, (q15_t)0xec9d, (q15_t)0x7e84, (q15_t)0xec97, (q15_t)0x7e84, (q15_t)0xec91, + (q15_t)0x7e83, (q15_t)0xec8a, (q15_t)0x7e82, (q15_t)0xec84, (q15_t)0x7e81, (q15_t)0xec7e, (q15_t)0x7e80, (q15_t)0xec78, + (q15_t)0x7e7f, (q15_t)0xec72, (q15_t)0x7e7e, (q15_t)0xec6b, (q15_t)0x7e7d, (q15_t)0xec65, (q15_t)0x7e7c, (q15_t)0xec5f, + (q15_t)0x7e7b, (q15_t)0xec59, (q15_t)0x7e7a, (q15_t)0xec53, (q15_t)0x7e79, (q15_t)0xec4c, (q15_t)0x7e78, (q15_t)0xec46, + (q15_t)0x7e77, (q15_t)0xec40, (q15_t)0x7e76, (q15_t)0xec3a, (q15_t)0x7e75, (q15_t)0xec34, (q15_t)0x7e74, (q15_t)0xec2d, + (q15_t)0x7e73, (q15_t)0xec27, (q15_t)0x7e72, (q15_t)0xec21, (q15_t)0x7e71, (q15_t)0xec1b, (q15_t)0x7e70, (q15_t)0xec15, + (q15_t)0x7e6f, (q15_t)0xec0e, (q15_t)0x7e6e, (q15_t)0xec08, (q15_t)0x7e6d, (q15_t)0xec02, (q15_t)0x7e6c, (q15_t)0xebfc, + (q15_t)0x7e6b, (q15_t)0xebf5, (q15_t)0x7e6a, (q15_t)0xebef, (q15_t)0x7e69, (q15_t)0xebe9, (q15_t)0x7e68, (q15_t)0xebe3, + (q15_t)0x7e67, (q15_t)0xebdd, (q15_t)0x7e66, (q15_t)0xebd6, (q15_t)0x7e65, (q15_t)0xebd0, (q15_t)0x7e64, (q15_t)0xebca, + (q15_t)0x7e63, (q15_t)0xebc4, (q15_t)0x7e62, (q15_t)0xebbe, (q15_t)0x7e61, (q15_t)0xebb7, (q15_t)0x7e60, (q15_t)0xebb1, + (q15_t)0x7e5f, (q15_t)0xebab, (q15_t)0x7e5e, (q15_t)0xeba5, (q15_t)0x7e5d, (q15_t)0xeb9f, (q15_t)0x7e5c, (q15_t)0xeb98, + (q15_t)0x7e5b, (q15_t)0xeb92, (q15_t)0x7e5a, (q15_t)0xeb8c, (q15_t)0x7e59, (q15_t)0xeb86, (q15_t)0x7e58, (q15_t)0xeb80, + (q15_t)0x7e57, (q15_t)0xeb79, (q15_t)0x7e56, (q15_t)0xeb73, (q15_t)0x7e55, (q15_t)0xeb6d, (q15_t)0x7e54, (q15_t)0xeb67, + (q15_t)0x7e53, (q15_t)0xeb61, (q15_t)0x7e52, (q15_t)0xeb5a, (q15_t)0x7e51, (q15_t)0xeb54, (q15_t)0x7e50, (q15_t)0xeb4e, + (q15_t)0x7e4f, (q15_t)0xeb48, (q15_t)0x7e4e, (q15_t)0xeb42, (q15_t)0x7e4d, (q15_t)0xeb3b, (q15_t)0x7e4c, (q15_t)0xeb35, + (q15_t)0x7e4b, (q15_t)0xeb2f, (q15_t)0x7e4a, (q15_t)0xeb29, (q15_t)0x7e49, (q15_t)0xeb23, (q15_t)0x7e48, (q15_t)0xeb1c, + (q15_t)0x7e47, (q15_t)0xeb16, (q15_t)0x7e46, (q15_t)0xeb10, (q15_t)0x7e45, (q15_t)0xeb0a, (q15_t)0x7e44, (q15_t)0xeb04, + (q15_t)0x7e43, (q15_t)0xeafd, (q15_t)0x7e42, (q15_t)0xeaf7, (q15_t)0x7e41, (q15_t)0xeaf1, (q15_t)0x7e40, (q15_t)0xeaeb, + (q15_t)0x7e3f, (q15_t)0xeae5, (q15_t)0x7e3e, (q15_t)0xeade, (q15_t)0x7e3d, (q15_t)0xead8, (q15_t)0x7e3c, (q15_t)0xead2, + (q15_t)0x7e3b, (q15_t)0xeacc, (q15_t)0x7e3a, (q15_t)0xeac6, (q15_t)0x7e39, (q15_t)0xeabf, (q15_t)0x7e38, (q15_t)0xeab9, + (q15_t)0x7e37, (q15_t)0xeab3, (q15_t)0x7e35, (q15_t)0xeaad, (q15_t)0x7e34, (q15_t)0xeaa7, (q15_t)0x7e33, (q15_t)0xeaa0, + (q15_t)0x7e32, (q15_t)0xea9a, (q15_t)0x7e31, (q15_t)0xea94, (q15_t)0x7e30, (q15_t)0xea8e, (q15_t)0x7e2f, (q15_t)0xea88, + (q15_t)0x7e2e, (q15_t)0xea81, (q15_t)0x7e2d, (q15_t)0xea7b, (q15_t)0x7e2c, (q15_t)0xea75, (q15_t)0x7e2b, (q15_t)0xea6f, + (q15_t)0x7e2a, (q15_t)0xea69, (q15_t)0x7e29, (q15_t)0xea63, (q15_t)0x7e28, (q15_t)0xea5c, (q15_t)0x7e27, (q15_t)0xea56, + (q15_t)0x7e26, (q15_t)0xea50, (q15_t)0x7e25, (q15_t)0xea4a, (q15_t)0x7e24, (q15_t)0xea44, (q15_t)0x7e22, (q15_t)0xea3d, + (q15_t)0x7e21, (q15_t)0xea37, (q15_t)0x7e20, (q15_t)0xea31, (q15_t)0x7e1f, (q15_t)0xea2b, (q15_t)0x7e1e, (q15_t)0xea25, + (q15_t)0x7e1d, (q15_t)0xea1e, (q15_t)0x7e1c, (q15_t)0xea18, (q15_t)0x7e1b, (q15_t)0xea12, (q15_t)0x7e1a, (q15_t)0xea0c, + (q15_t)0x7e19, (q15_t)0xea06, (q15_t)0x7e18, (q15_t)0xe9ff, (q15_t)0x7e17, (q15_t)0xe9f9, (q15_t)0x7e16, (q15_t)0xe9f3, + (q15_t)0x7e14, (q15_t)0xe9ed, (q15_t)0x7e13, (q15_t)0xe9e7, (q15_t)0x7e12, (q15_t)0xe9e1, (q15_t)0x7e11, (q15_t)0xe9da, + (q15_t)0x7e10, (q15_t)0xe9d4, (q15_t)0x7e0f, (q15_t)0xe9ce, (q15_t)0x7e0e, (q15_t)0xe9c8, (q15_t)0x7e0d, (q15_t)0xe9c2, + (q15_t)0x7e0c, (q15_t)0xe9bb, (q15_t)0x7e0b, (q15_t)0xe9b5, (q15_t)0x7e0a, (q15_t)0xe9af, (q15_t)0x7e08, (q15_t)0xe9a9, + (q15_t)0x7e07, (q15_t)0xe9a3, (q15_t)0x7e06, (q15_t)0xe99c, (q15_t)0x7e05, (q15_t)0xe996, (q15_t)0x7e04, (q15_t)0xe990, + (q15_t)0x7e03, (q15_t)0xe98a, (q15_t)0x7e02, (q15_t)0xe984, (q15_t)0x7e01, (q15_t)0xe97e, (q15_t)0x7e00, (q15_t)0xe977, + (q15_t)0x7dff, (q15_t)0xe971, (q15_t)0x7dfd, (q15_t)0xe96b, (q15_t)0x7dfc, (q15_t)0xe965, (q15_t)0x7dfb, (q15_t)0xe95f, + (q15_t)0x7dfa, (q15_t)0xe958, (q15_t)0x7df9, (q15_t)0xe952, (q15_t)0x7df8, (q15_t)0xe94c, (q15_t)0x7df7, (q15_t)0xe946, + (q15_t)0x7df6, (q15_t)0xe940, (q15_t)0x7df5, (q15_t)0xe93a, (q15_t)0x7df3, (q15_t)0xe933, (q15_t)0x7df2, (q15_t)0xe92d, + (q15_t)0x7df1, (q15_t)0xe927, (q15_t)0x7df0, (q15_t)0xe921, (q15_t)0x7def, (q15_t)0xe91b, (q15_t)0x7dee, (q15_t)0xe914, + (q15_t)0x7ded, (q15_t)0xe90e, (q15_t)0x7dec, (q15_t)0xe908, (q15_t)0x7dea, (q15_t)0xe902, (q15_t)0x7de9, (q15_t)0xe8fc, + (q15_t)0x7de8, (q15_t)0xe8f6, (q15_t)0x7de7, (q15_t)0xe8ef, (q15_t)0x7de6, (q15_t)0xe8e9, (q15_t)0x7de5, (q15_t)0xe8e3, + (q15_t)0x7de4, (q15_t)0xe8dd, (q15_t)0x7de2, (q15_t)0xe8d7, (q15_t)0x7de1, (q15_t)0xe8d0, (q15_t)0x7de0, (q15_t)0xe8ca, + (q15_t)0x7ddf, (q15_t)0xe8c4, (q15_t)0x7dde, (q15_t)0xe8be, (q15_t)0x7ddd, (q15_t)0xe8b8, (q15_t)0x7ddc, (q15_t)0xe8b2, + (q15_t)0x7dda, (q15_t)0xe8ab, (q15_t)0x7dd9, (q15_t)0xe8a5, (q15_t)0x7dd8, (q15_t)0xe89f, (q15_t)0x7dd7, (q15_t)0xe899, + (q15_t)0x7dd6, (q15_t)0xe893, (q15_t)0x7dd5, (q15_t)0xe88c, (q15_t)0x7dd4, (q15_t)0xe886, (q15_t)0x7dd2, (q15_t)0xe880, + (q15_t)0x7dd1, (q15_t)0xe87a, (q15_t)0x7dd0, (q15_t)0xe874, (q15_t)0x7dcf, (q15_t)0xe86e, (q15_t)0x7dce, (q15_t)0xe867, + (q15_t)0x7dcd, (q15_t)0xe861, (q15_t)0x7dcc, (q15_t)0xe85b, (q15_t)0x7dca, (q15_t)0xe855, (q15_t)0x7dc9, (q15_t)0xe84f, + (q15_t)0x7dc8, (q15_t)0xe849, (q15_t)0x7dc7, (q15_t)0xe842, (q15_t)0x7dc6, (q15_t)0xe83c, (q15_t)0x7dc5, (q15_t)0xe836, + (q15_t)0x7dc3, (q15_t)0xe830, (q15_t)0x7dc2, (q15_t)0xe82a, (q15_t)0x7dc1, (q15_t)0xe823, (q15_t)0x7dc0, (q15_t)0xe81d, + (q15_t)0x7dbf, (q15_t)0xe817, (q15_t)0x7dbd, (q15_t)0xe811, (q15_t)0x7dbc, (q15_t)0xe80b, (q15_t)0x7dbb, (q15_t)0xe805, + (q15_t)0x7dba, (q15_t)0xe7fe, (q15_t)0x7db9, (q15_t)0xe7f8, (q15_t)0x7db8, (q15_t)0xe7f2, (q15_t)0x7db6, (q15_t)0xe7ec, + (q15_t)0x7db5, (q15_t)0xe7e6, (q15_t)0x7db4, (q15_t)0xe7e0, (q15_t)0x7db3, (q15_t)0xe7d9, (q15_t)0x7db2, (q15_t)0xe7d3, + (q15_t)0x7db0, (q15_t)0xe7cd, (q15_t)0x7daf, (q15_t)0xe7c7, (q15_t)0x7dae, (q15_t)0xe7c1, (q15_t)0x7dad, (q15_t)0xe7bb, + (q15_t)0x7dac, (q15_t)0xe7b4, (q15_t)0x7dab, (q15_t)0xe7ae, (q15_t)0x7da9, (q15_t)0xe7a8, (q15_t)0x7da8, (q15_t)0xe7a2, + (q15_t)0x7da7, (q15_t)0xe79c, (q15_t)0x7da6, (q15_t)0xe796, (q15_t)0x7da5, (q15_t)0xe78f, (q15_t)0x7da3, (q15_t)0xe789, + (q15_t)0x7da2, (q15_t)0xe783, (q15_t)0x7da1, (q15_t)0xe77d, (q15_t)0x7da0, (q15_t)0xe777, (q15_t)0x7d9f, (q15_t)0xe771, + (q15_t)0x7d9d, (q15_t)0xe76a, (q15_t)0x7d9c, (q15_t)0xe764, (q15_t)0x7d9b, (q15_t)0xe75e, (q15_t)0x7d9a, (q15_t)0xe758, + (q15_t)0x7d98, (q15_t)0xe752, (q15_t)0x7d97, (q15_t)0xe74c, (q15_t)0x7d96, (q15_t)0xe745, (q15_t)0x7d95, (q15_t)0xe73f, + (q15_t)0x7d94, (q15_t)0xe739, (q15_t)0x7d92, (q15_t)0xe733, (q15_t)0x7d91, (q15_t)0xe72d, (q15_t)0x7d90, (q15_t)0xe727, + (q15_t)0x7d8f, (q15_t)0xe720, (q15_t)0x7d8e, (q15_t)0xe71a, (q15_t)0x7d8c, (q15_t)0xe714, (q15_t)0x7d8b, (q15_t)0xe70e, + (q15_t)0x7d8a, (q15_t)0xe708, (q15_t)0x7d89, (q15_t)0xe702, (q15_t)0x7d87, (q15_t)0xe6fb, (q15_t)0x7d86, (q15_t)0xe6f5, + (q15_t)0x7d85, (q15_t)0xe6ef, (q15_t)0x7d84, (q15_t)0xe6e9, (q15_t)0x7d82, (q15_t)0xe6e3, (q15_t)0x7d81, (q15_t)0xe6dd, + (q15_t)0x7d80, (q15_t)0xe6d6, (q15_t)0x7d7f, (q15_t)0xe6d0, (q15_t)0x7d7e, (q15_t)0xe6ca, (q15_t)0x7d7c, (q15_t)0xe6c4, + (q15_t)0x7d7b, (q15_t)0xe6be, (q15_t)0x7d7a, (q15_t)0xe6b8, (q15_t)0x7d79, (q15_t)0xe6b2, (q15_t)0x7d77, (q15_t)0xe6ab, + (q15_t)0x7d76, (q15_t)0xe6a5, (q15_t)0x7d75, (q15_t)0xe69f, (q15_t)0x7d74, (q15_t)0xe699, (q15_t)0x7d72, (q15_t)0xe693, + (q15_t)0x7d71, (q15_t)0xe68d, (q15_t)0x7d70, (q15_t)0xe686, (q15_t)0x7d6f, (q15_t)0xe680, (q15_t)0x7d6d, (q15_t)0xe67a, + (q15_t)0x7d6c, (q15_t)0xe674, (q15_t)0x7d6b, (q15_t)0xe66e, (q15_t)0x7d6a, (q15_t)0xe668, (q15_t)0x7d68, (q15_t)0xe661, + (q15_t)0x7d67, (q15_t)0xe65b, (q15_t)0x7d66, (q15_t)0xe655, (q15_t)0x7d65, (q15_t)0xe64f, (q15_t)0x7d63, (q15_t)0xe649, + (q15_t)0x7d62, (q15_t)0xe643, (q15_t)0x7d61, (q15_t)0xe63d, (q15_t)0x7d60, (q15_t)0xe636, (q15_t)0x7d5e, (q15_t)0xe630, + (q15_t)0x7d5d, (q15_t)0xe62a, (q15_t)0x7d5c, (q15_t)0xe624, (q15_t)0x7d5a, (q15_t)0xe61e, (q15_t)0x7d59, (q15_t)0xe618, + (q15_t)0x7d58, (q15_t)0xe611, (q15_t)0x7d57, (q15_t)0xe60b, (q15_t)0x7d55, (q15_t)0xe605, (q15_t)0x7d54, (q15_t)0xe5ff, + (q15_t)0x7d53, (q15_t)0xe5f9, (q15_t)0x7d52, (q15_t)0xe5f3, (q15_t)0x7d50, (q15_t)0xe5ed, (q15_t)0x7d4f, (q15_t)0xe5e6, + (q15_t)0x7d4e, (q15_t)0xe5e0, (q15_t)0x7d4c, (q15_t)0xe5da, (q15_t)0x7d4b, (q15_t)0xe5d4, (q15_t)0x7d4a, (q15_t)0xe5ce, + (q15_t)0x7d49, (q15_t)0xe5c8, (q15_t)0x7d47, (q15_t)0xe5c2, (q15_t)0x7d46, (q15_t)0xe5bb, (q15_t)0x7d45, (q15_t)0xe5b5, + (q15_t)0x7d43, (q15_t)0xe5af, (q15_t)0x7d42, (q15_t)0xe5a9, (q15_t)0x7d41, (q15_t)0xe5a3, (q15_t)0x7d3f, (q15_t)0xe59d, + (q15_t)0x7d3e, (q15_t)0xe596, (q15_t)0x7d3d, (q15_t)0xe590, (q15_t)0x7d3c, (q15_t)0xe58a, (q15_t)0x7d3a, (q15_t)0xe584, + (q15_t)0x7d39, (q15_t)0xe57e, (q15_t)0x7d38, (q15_t)0xe578, (q15_t)0x7d36, (q15_t)0xe572, (q15_t)0x7d35, (q15_t)0xe56b, + (q15_t)0x7d34, (q15_t)0xe565, (q15_t)0x7d32, (q15_t)0xe55f, (q15_t)0x7d31, (q15_t)0xe559, (q15_t)0x7d30, (q15_t)0xe553, + (q15_t)0x7d2f, (q15_t)0xe54d, (q15_t)0x7d2d, (q15_t)0xe547, (q15_t)0x7d2c, (q15_t)0xe540, (q15_t)0x7d2b, (q15_t)0xe53a, + (q15_t)0x7d29, (q15_t)0xe534, (q15_t)0x7d28, (q15_t)0xe52e, (q15_t)0x7d27, (q15_t)0xe528, (q15_t)0x7d25, (q15_t)0xe522, + (q15_t)0x7d24, (q15_t)0xe51c, (q15_t)0x7d23, (q15_t)0xe515, (q15_t)0x7d21, (q15_t)0xe50f, (q15_t)0x7d20, (q15_t)0xe509, + (q15_t)0x7d1f, (q15_t)0xe503, (q15_t)0x7d1d, (q15_t)0xe4fd, (q15_t)0x7d1c, (q15_t)0xe4f7, (q15_t)0x7d1b, (q15_t)0xe4f1, + (q15_t)0x7d19, (q15_t)0xe4ea, (q15_t)0x7d18, (q15_t)0xe4e4, (q15_t)0x7d17, (q15_t)0xe4de, (q15_t)0x7d15, (q15_t)0xe4d8, + (q15_t)0x7d14, (q15_t)0xe4d2, (q15_t)0x7d13, (q15_t)0xe4cc, (q15_t)0x7d11, (q15_t)0xe4c6, (q15_t)0x7d10, (q15_t)0xe4bf, + (q15_t)0x7d0f, (q15_t)0xe4b9, (q15_t)0x7d0d, (q15_t)0xe4b3, (q15_t)0x7d0c, (q15_t)0xe4ad, (q15_t)0x7d0b, (q15_t)0xe4a7, + (q15_t)0x7d09, (q15_t)0xe4a1, (q15_t)0x7d08, (q15_t)0xe49b, (q15_t)0x7d07, (q15_t)0xe494, (q15_t)0x7d05, (q15_t)0xe48e, + (q15_t)0x7d04, (q15_t)0xe488, (q15_t)0x7d03, (q15_t)0xe482, (q15_t)0x7d01, (q15_t)0xe47c, (q15_t)0x7d00, (q15_t)0xe476, + (q15_t)0x7cff, (q15_t)0xe470, (q15_t)0x7cfd, (q15_t)0xe46a, (q15_t)0x7cfc, (q15_t)0xe463, (q15_t)0x7cfb, (q15_t)0xe45d, + (q15_t)0x7cf9, (q15_t)0xe457, (q15_t)0x7cf8, (q15_t)0xe451, (q15_t)0x7cf6, (q15_t)0xe44b, (q15_t)0x7cf5, (q15_t)0xe445, + (q15_t)0x7cf4, (q15_t)0xe43f, (q15_t)0x7cf2, (q15_t)0xe438, (q15_t)0x7cf1, (q15_t)0xe432, (q15_t)0x7cf0, (q15_t)0xe42c, + (q15_t)0x7cee, (q15_t)0xe426, (q15_t)0x7ced, (q15_t)0xe420, (q15_t)0x7cec, (q15_t)0xe41a, (q15_t)0x7cea, (q15_t)0xe414, + (q15_t)0x7ce9, (q15_t)0xe40e, (q15_t)0x7ce7, (q15_t)0xe407, (q15_t)0x7ce6, (q15_t)0xe401, (q15_t)0x7ce5, (q15_t)0xe3fb, + (q15_t)0x7ce3, (q15_t)0xe3f5, (q15_t)0x7ce2, (q15_t)0xe3ef, (q15_t)0x7ce1, (q15_t)0xe3e9, (q15_t)0x7cdf, (q15_t)0xe3e3, + (q15_t)0x7cde, (q15_t)0xe3dc, (q15_t)0x7cdc, (q15_t)0xe3d6, (q15_t)0x7cdb, (q15_t)0xe3d0, (q15_t)0x7cda, (q15_t)0xe3ca, + (q15_t)0x7cd8, (q15_t)0xe3c4, (q15_t)0x7cd7, (q15_t)0xe3be, (q15_t)0x7cd5, (q15_t)0xe3b8, (q15_t)0x7cd4, (q15_t)0xe3b2, + (q15_t)0x7cd3, (q15_t)0xe3ab, (q15_t)0x7cd1, (q15_t)0xe3a5, (q15_t)0x7cd0, (q15_t)0xe39f, (q15_t)0x7ccf, (q15_t)0xe399, + (q15_t)0x7ccd, (q15_t)0xe393, (q15_t)0x7ccc, (q15_t)0xe38d, (q15_t)0x7cca, (q15_t)0xe387, (q15_t)0x7cc9, (q15_t)0xe381, + (q15_t)0x7cc8, (q15_t)0xe37a, (q15_t)0x7cc6, (q15_t)0xe374, (q15_t)0x7cc5, (q15_t)0xe36e, (q15_t)0x7cc3, (q15_t)0xe368, + (q15_t)0x7cc2, (q15_t)0xe362, (q15_t)0x7cc1, (q15_t)0xe35c, (q15_t)0x7cbf, (q15_t)0xe356, (q15_t)0x7cbe, (q15_t)0xe350, + (q15_t)0x7cbc, (q15_t)0xe349, (q15_t)0x7cbb, (q15_t)0xe343, (q15_t)0x7cb9, (q15_t)0xe33d, (q15_t)0x7cb8, (q15_t)0xe337, + (q15_t)0x7cb7, (q15_t)0xe331, (q15_t)0x7cb5, (q15_t)0xe32b, (q15_t)0x7cb4, (q15_t)0xe325, (q15_t)0x7cb2, (q15_t)0xe31f, + (q15_t)0x7cb1, (q15_t)0xe318, (q15_t)0x7cb0, (q15_t)0xe312, (q15_t)0x7cae, (q15_t)0xe30c, (q15_t)0x7cad, (q15_t)0xe306, + (q15_t)0x7cab, (q15_t)0xe300, (q15_t)0x7caa, (q15_t)0xe2fa, (q15_t)0x7ca8, (q15_t)0xe2f4, (q15_t)0x7ca7, (q15_t)0xe2ee, + (q15_t)0x7ca6, (q15_t)0xe2e8, (q15_t)0x7ca4, (q15_t)0xe2e1, (q15_t)0x7ca3, (q15_t)0xe2db, (q15_t)0x7ca1, (q15_t)0xe2d5, + (q15_t)0x7ca0, (q15_t)0xe2cf, (q15_t)0x7c9e, (q15_t)0xe2c9, (q15_t)0x7c9d, (q15_t)0xe2c3, (q15_t)0x7c9c, (q15_t)0xe2bd, + (q15_t)0x7c9a, (q15_t)0xe2b7, (q15_t)0x7c99, (q15_t)0xe2b0, (q15_t)0x7c97, (q15_t)0xe2aa, (q15_t)0x7c96, (q15_t)0xe2a4, + (q15_t)0x7c94, (q15_t)0xe29e, (q15_t)0x7c93, (q15_t)0xe298, (q15_t)0x7c91, (q15_t)0xe292, (q15_t)0x7c90, (q15_t)0xe28c, + (q15_t)0x7c8f, (q15_t)0xe286, (q15_t)0x7c8d, (q15_t)0xe280, (q15_t)0x7c8c, (q15_t)0xe279, (q15_t)0x7c8a, (q15_t)0xe273, + (q15_t)0x7c89, (q15_t)0xe26d, (q15_t)0x7c87, (q15_t)0xe267, (q15_t)0x7c86, (q15_t)0xe261, (q15_t)0x7c84, (q15_t)0xe25b, + (q15_t)0x7c83, (q15_t)0xe255, (q15_t)0x7c82, (q15_t)0xe24f, (q15_t)0x7c80, (q15_t)0xe249, (q15_t)0x7c7f, (q15_t)0xe242, + (q15_t)0x7c7d, (q15_t)0xe23c, (q15_t)0x7c7c, (q15_t)0xe236, (q15_t)0x7c7a, (q15_t)0xe230, (q15_t)0x7c79, (q15_t)0xe22a, + (q15_t)0x7c77, (q15_t)0xe224, (q15_t)0x7c76, (q15_t)0xe21e, (q15_t)0x7c74, (q15_t)0xe218, (q15_t)0x7c73, (q15_t)0xe212, + (q15_t)0x7c71, (q15_t)0xe20b, (q15_t)0x7c70, (q15_t)0xe205, (q15_t)0x7c6e, (q15_t)0xe1ff, (q15_t)0x7c6d, (q15_t)0xe1f9, + (q15_t)0x7c6c, (q15_t)0xe1f3, (q15_t)0x7c6a, (q15_t)0xe1ed, (q15_t)0x7c69, (q15_t)0xe1e7, (q15_t)0x7c67, (q15_t)0xe1e1, + (q15_t)0x7c66, (q15_t)0xe1db, (q15_t)0x7c64, (q15_t)0xe1d4, (q15_t)0x7c63, (q15_t)0xe1ce, (q15_t)0x7c61, (q15_t)0xe1c8, + (q15_t)0x7c60, (q15_t)0xe1c2, (q15_t)0x7c5e, (q15_t)0xe1bc, (q15_t)0x7c5d, (q15_t)0xe1b6, (q15_t)0x7c5b, (q15_t)0xe1b0, + (q15_t)0x7c5a, (q15_t)0xe1aa, (q15_t)0x7c58, (q15_t)0xe1a4, (q15_t)0x7c57, (q15_t)0xe19e, (q15_t)0x7c55, (q15_t)0xe197, + (q15_t)0x7c54, (q15_t)0xe191, (q15_t)0x7c52, (q15_t)0xe18b, (q15_t)0x7c51, (q15_t)0xe185, (q15_t)0x7c4f, (q15_t)0xe17f, + (q15_t)0x7c4e, (q15_t)0xe179, (q15_t)0x7c4c, (q15_t)0xe173, (q15_t)0x7c4b, (q15_t)0xe16d, (q15_t)0x7c49, (q15_t)0xe167, + (q15_t)0x7c48, (q15_t)0xe160, (q15_t)0x7c46, (q15_t)0xe15a, (q15_t)0x7c45, (q15_t)0xe154, (q15_t)0x7c43, (q15_t)0xe14e, + (q15_t)0x7c42, (q15_t)0xe148, (q15_t)0x7c40, (q15_t)0xe142, (q15_t)0x7c3f, (q15_t)0xe13c, (q15_t)0x7c3d, (q15_t)0xe136, + (q15_t)0x7c3c, (q15_t)0xe130, (q15_t)0x7c3a, (q15_t)0xe12a, (q15_t)0x7c39, (q15_t)0xe123, (q15_t)0x7c37, (q15_t)0xe11d, + (q15_t)0x7c36, (q15_t)0xe117, (q15_t)0x7c34, (q15_t)0xe111, (q15_t)0x7c33, (q15_t)0xe10b, (q15_t)0x7c31, (q15_t)0xe105, + (q15_t)0x7c30, (q15_t)0xe0ff, (q15_t)0x7c2e, (q15_t)0xe0f9, (q15_t)0x7c2d, (q15_t)0xe0f3, (q15_t)0x7c2b, (q15_t)0xe0ed, + (q15_t)0x7c29, (q15_t)0xe0e7, (q15_t)0x7c28, (q15_t)0xe0e0, (q15_t)0x7c26, (q15_t)0xe0da, (q15_t)0x7c25, (q15_t)0xe0d4, + (q15_t)0x7c23, (q15_t)0xe0ce, (q15_t)0x7c22, (q15_t)0xe0c8, (q15_t)0x7c20, (q15_t)0xe0c2, (q15_t)0x7c1f, (q15_t)0xe0bc, + (q15_t)0x7c1d, (q15_t)0xe0b6, (q15_t)0x7c1c, (q15_t)0xe0b0, (q15_t)0x7c1a, (q15_t)0xe0aa, (q15_t)0x7c19, (q15_t)0xe0a3, + (q15_t)0x7c17, (q15_t)0xe09d, (q15_t)0x7c16, (q15_t)0xe097, (q15_t)0x7c14, (q15_t)0xe091, (q15_t)0x7c12, (q15_t)0xe08b, + (q15_t)0x7c11, (q15_t)0xe085, (q15_t)0x7c0f, (q15_t)0xe07f, (q15_t)0x7c0e, (q15_t)0xe079, (q15_t)0x7c0c, (q15_t)0xe073, + (q15_t)0x7c0b, (q15_t)0xe06d, (q15_t)0x7c09, (q15_t)0xe067, (q15_t)0x7c08, (q15_t)0xe061, (q15_t)0x7c06, (q15_t)0xe05a, + (q15_t)0x7c05, (q15_t)0xe054, (q15_t)0x7c03, (q15_t)0xe04e, (q15_t)0x7c01, (q15_t)0xe048, (q15_t)0x7c00, (q15_t)0xe042, + (q15_t)0x7bfe, (q15_t)0xe03c, (q15_t)0x7bfd, (q15_t)0xe036, (q15_t)0x7bfb, (q15_t)0xe030, (q15_t)0x7bfa, (q15_t)0xe02a, + (q15_t)0x7bf8, (q15_t)0xe024, (q15_t)0x7bf6, (q15_t)0xe01e, (q15_t)0x7bf5, (q15_t)0xe017, (q15_t)0x7bf3, (q15_t)0xe011, + (q15_t)0x7bf2, (q15_t)0xe00b, (q15_t)0x7bf0, (q15_t)0xe005, (q15_t)0x7bef, (q15_t)0xdfff, (q15_t)0x7bed, (q15_t)0xdff9, + (q15_t)0x7beb, (q15_t)0xdff3, (q15_t)0x7bea, (q15_t)0xdfed, (q15_t)0x7be8, (q15_t)0xdfe7, (q15_t)0x7be7, (q15_t)0xdfe1, + (q15_t)0x7be5, (q15_t)0xdfdb, (q15_t)0x7be4, (q15_t)0xdfd5, (q15_t)0x7be2, (q15_t)0xdfce, (q15_t)0x7be0, (q15_t)0xdfc8, + (q15_t)0x7bdf, (q15_t)0xdfc2, (q15_t)0x7bdd, (q15_t)0xdfbc, (q15_t)0x7bdc, (q15_t)0xdfb6, (q15_t)0x7bda, (q15_t)0xdfb0, + (q15_t)0x7bd9, (q15_t)0xdfaa, (q15_t)0x7bd7, (q15_t)0xdfa4, (q15_t)0x7bd5, (q15_t)0xdf9e, (q15_t)0x7bd4, (q15_t)0xdf98, + (q15_t)0x7bd2, (q15_t)0xdf92, (q15_t)0x7bd1, (q15_t)0xdf8c, (q15_t)0x7bcf, (q15_t)0xdf86, (q15_t)0x7bcd, (q15_t)0xdf7f, + (q15_t)0x7bcc, (q15_t)0xdf79, (q15_t)0x7bca, (q15_t)0xdf73, (q15_t)0x7bc9, (q15_t)0xdf6d, (q15_t)0x7bc7, (q15_t)0xdf67, + (q15_t)0x7bc5, (q15_t)0xdf61, (q15_t)0x7bc4, (q15_t)0xdf5b, (q15_t)0x7bc2, (q15_t)0xdf55, (q15_t)0x7bc1, (q15_t)0xdf4f, + (q15_t)0x7bbf, (q15_t)0xdf49, (q15_t)0x7bbd, (q15_t)0xdf43, (q15_t)0x7bbc, (q15_t)0xdf3d, (q15_t)0x7bba, (q15_t)0xdf37, + (q15_t)0x7bb9, (q15_t)0xdf30, (q15_t)0x7bb7, (q15_t)0xdf2a, (q15_t)0x7bb5, (q15_t)0xdf24, (q15_t)0x7bb4, (q15_t)0xdf1e, + (q15_t)0x7bb2, (q15_t)0xdf18, (q15_t)0x7bb0, (q15_t)0xdf12, (q15_t)0x7baf, (q15_t)0xdf0c, (q15_t)0x7bad, (q15_t)0xdf06, + (q15_t)0x7bac, (q15_t)0xdf00, (q15_t)0x7baa, (q15_t)0xdefa, (q15_t)0x7ba8, (q15_t)0xdef4, (q15_t)0x7ba7, (q15_t)0xdeee, + (q15_t)0x7ba5, (q15_t)0xdee8, (q15_t)0x7ba3, (q15_t)0xdee2, (q15_t)0x7ba2, (q15_t)0xdedb, (q15_t)0x7ba0, (q15_t)0xded5, + (q15_t)0x7b9f, (q15_t)0xdecf, (q15_t)0x7b9d, (q15_t)0xdec9, (q15_t)0x7b9b, (q15_t)0xdec3, (q15_t)0x7b9a, (q15_t)0xdebd, + (q15_t)0x7b98, (q15_t)0xdeb7, (q15_t)0x7b96, (q15_t)0xdeb1, (q15_t)0x7b95, (q15_t)0xdeab, (q15_t)0x7b93, (q15_t)0xdea5, + (q15_t)0x7b92, (q15_t)0xde9f, (q15_t)0x7b90, (q15_t)0xde99, (q15_t)0x7b8e, (q15_t)0xde93, (q15_t)0x7b8d, (q15_t)0xde8d, + (q15_t)0x7b8b, (q15_t)0xde87, (q15_t)0x7b89, (q15_t)0xde80, (q15_t)0x7b88, (q15_t)0xde7a, (q15_t)0x7b86, (q15_t)0xde74, + (q15_t)0x7b84, (q15_t)0xde6e, (q15_t)0x7b83, (q15_t)0xde68, (q15_t)0x7b81, (q15_t)0xde62, (q15_t)0x7b7f, (q15_t)0xde5c, + (q15_t)0x7b7e, (q15_t)0xde56, (q15_t)0x7b7c, (q15_t)0xde50, (q15_t)0x7b7a, (q15_t)0xde4a, (q15_t)0x7b79, (q15_t)0xde44, + (q15_t)0x7b77, (q15_t)0xde3e, (q15_t)0x7b76, (q15_t)0xde38, (q15_t)0x7b74, (q15_t)0xde32, (q15_t)0x7b72, (q15_t)0xde2c, + (q15_t)0x7b71, (q15_t)0xde26, (q15_t)0x7b6f, (q15_t)0xde1f, (q15_t)0x7b6d, (q15_t)0xde19, (q15_t)0x7b6c, (q15_t)0xde13, + (q15_t)0x7b6a, (q15_t)0xde0d, (q15_t)0x7b68, (q15_t)0xde07, (q15_t)0x7b67, (q15_t)0xde01, (q15_t)0x7b65, (q15_t)0xddfb, + (q15_t)0x7b63, (q15_t)0xddf5, (q15_t)0x7b62, (q15_t)0xddef, (q15_t)0x7b60, (q15_t)0xdde9, (q15_t)0x7b5e, (q15_t)0xdde3, + (q15_t)0x7b5d, (q15_t)0xdddd, (q15_t)0x7b5b, (q15_t)0xddd7, (q15_t)0x7b59, (q15_t)0xddd1, (q15_t)0x7b57, (q15_t)0xddcb, + (q15_t)0x7b56, (q15_t)0xddc5, (q15_t)0x7b54, (q15_t)0xddbf, (q15_t)0x7b52, (q15_t)0xddb9, (q15_t)0x7b51, (q15_t)0xddb2, + (q15_t)0x7b4f, (q15_t)0xddac, (q15_t)0x7b4d, (q15_t)0xdda6, (q15_t)0x7b4c, (q15_t)0xdda0, (q15_t)0x7b4a, (q15_t)0xdd9a, + (q15_t)0x7b48, (q15_t)0xdd94, (q15_t)0x7b47, (q15_t)0xdd8e, (q15_t)0x7b45, (q15_t)0xdd88, (q15_t)0x7b43, (q15_t)0xdd82, + (q15_t)0x7b42, (q15_t)0xdd7c, (q15_t)0x7b40, (q15_t)0xdd76, (q15_t)0x7b3e, (q15_t)0xdd70, (q15_t)0x7b3c, (q15_t)0xdd6a, + (q15_t)0x7b3b, (q15_t)0xdd64, (q15_t)0x7b39, (q15_t)0xdd5e, (q15_t)0x7b37, (q15_t)0xdd58, (q15_t)0x7b36, (q15_t)0xdd52, + (q15_t)0x7b34, (q15_t)0xdd4c, (q15_t)0x7b32, (q15_t)0xdd46, (q15_t)0x7b31, (q15_t)0xdd40, (q15_t)0x7b2f, (q15_t)0xdd39, + (q15_t)0x7b2d, (q15_t)0xdd33, (q15_t)0x7b2b, (q15_t)0xdd2d, (q15_t)0x7b2a, (q15_t)0xdd27, (q15_t)0x7b28, (q15_t)0xdd21, + (q15_t)0x7b26, (q15_t)0xdd1b, (q15_t)0x7b25, (q15_t)0xdd15, (q15_t)0x7b23, (q15_t)0xdd0f, (q15_t)0x7b21, (q15_t)0xdd09, + (q15_t)0x7b1f, (q15_t)0xdd03, (q15_t)0x7b1e, (q15_t)0xdcfd, (q15_t)0x7b1c, (q15_t)0xdcf7, (q15_t)0x7b1a, (q15_t)0xdcf1, + (q15_t)0x7b19, (q15_t)0xdceb, (q15_t)0x7b17, (q15_t)0xdce5, (q15_t)0x7b15, (q15_t)0xdcdf, (q15_t)0x7b13, (q15_t)0xdcd9, + (q15_t)0x7b12, (q15_t)0xdcd3, (q15_t)0x7b10, (q15_t)0xdccd, (q15_t)0x7b0e, (q15_t)0xdcc7, (q15_t)0x7b0c, (q15_t)0xdcc1, + (q15_t)0x7b0b, (q15_t)0xdcbb, (q15_t)0x7b09, (q15_t)0xdcb5, (q15_t)0x7b07, (q15_t)0xdcae, (q15_t)0x7b06, (q15_t)0xdca8, + (q15_t)0x7b04, (q15_t)0xdca2, (q15_t)0x7b02, (q15_t)0xdc9c, (q15_t)0x7b00, (q15_t)0xdc96, (q15_t)0x7aff, (q15_t)0xdc90, + (q15_t)0x7afd, (q15_t)0xdc8a, (q15_t)0x7afb, (q15_t)0xdc84, (q15_t)0x7af9, (q15_t)0xdc7e, (q15_t)0x7af8, (q15_t)0xdc78, + (q15_t)0x7af6, (q15_t)0xdc72, (q15_t)0x7af4, (q15_t)0xdc6c, (q15_t)0x7af2, (q15_t)0xdc66, (q15_t)0x7af1, (q15_t)0xdc60, + (q15_t)0x7aef, (q15_t)0xdc5a, (q15_t)0x7aed, (q15_t)0xdc54, (q15_t)0x7aeb, (q15_t)0xdc4e, (q15_t)0x7aea, (q15_t)0xdc48, + (q15_t)0x7ae8, (q15_t)0xdc42, (q15_t)0x7ae6, (q15_t)0xdc3c, (q15_t)0x7ae4, (q15_t)0xdc36, (q15_t)0x7ae3, (q15_t)0xdc30, + (q15_t)0x7ae1, (q15_t)0xdc2a, (q15_t)0x7adf, (q15_t)0xdc24, (q15_t)0x7add, (q15_t)0xdc1e, (q15_t)0x7adc, (q15_t)0xdc18, + (q15_t)0x7ada, (q15_t)0xdc12, (q15_t)0x7ad8, (q15_t)0xdc0c, (q15_t)0x7ad6, (q15_t)0xdc06, (q15_t)0x7ad5, (q15_t)0xdbff, + (q15_t)0x7ad3, (q15_t)0xdbf9, (q15_t)0x7ad1, (q15_t)0xdbf3, (q15_t)0x7acf, (q15_t)0xdbed, (q15_t)0x7acd, (q15_t)0xdbe7, + (q15_t)0x7acc, (q15_t)0xdbe1, (q15_t)0x7aca, (q15_t)0xdbdb, (q15_t)0x7ac8, (q15_t)0xdbd5, (q15_t)0x7ac6, (q15_t)0xdbcf, + (q15_t)0x7ac5, (q15_t)0xdbc9, (q15_t)0x7ac3, (q15_t)0xdbc3, (q15_t)0x7ac1, (q15_t)0xdbbd, (q15_t)0x7abf, (q15_t)0xdbb7, + (q15_t)0x7abd, (q15_t)0xdbb1, (q15_t)0x7abc, (q15_t)0xdbab, (q15_t)0x7aba, (q15_t)0xdba5, (q15_t)0x7ab8, (q15_t)0xdb9f, + (q15_t)0x7ab6, (q15_t)0xdb99, (q15_t)0x7ab5, (q15_t)0xdb93, (q15_t)0x7ab3, (q15_t)0xdb8d, (q15_t)0x7ab1, (q15_t)0xdb87, + (q15_t)0x7aaf, (q15_t)0xdb81, (q15_t)0x7aad, (q15_t)0xdb7b, (q15_t)0x7aac, (q15_t)0xdb75, (q15_t)0x7aaa, (q15_t)0xdb6f, + (q15_t)0x7aa8, (q15_t)0xdb69, (q15_t)0x7aa6, (q15_t)0xdb63, (q15_t)0x7aa4, (q15_t)0xdb5d, (q15_t)0x7aa3, (q15_t)0xdb57, + (q15_t)0x7aa1, (q15_t)0xdb51, (q15_t)0x7a9f, (q15_t)0xdb4b, (q15_t)0x7a9d, (q15_t)0xdb45, (q15_t)0x7a9b, (q15_t)0xdb3f, + (q15_t)0x7a9a, (q15_t)0xdb39, (q15_t)0x7a98, (q15_t)0xdb33, (q15_t)0x7a96, (q15_t)0xdb2d, (q15_t)0x7a94, (q15_t)0xdb27, + (q15_t)0x7a92, (q15_t)0xdb21, (q15_t)0x7a91, (q15_t)0xdb1b, (q15_t)0x7a8f, (q15_t)0xdb15, (q15_t)0x7a8d, (q15_t)0xdb0f, + (q15_t)0x7a8b, (q15_t)0xdb09, (q15_t)0x7a89, (q15_t)0xdb03, (q15_t)0x7a87, (q15_t)0xdafd, (q15_t)0x7a86, (q15_t)0xdaf7, + (q15_t)0x7a84, (q15_t)0xdaf1, (q15_t)0x7a82, (q15_t)0xdaea, (q15_t)0x7a80, (q15_t)0xdae4, (q15_t)0x7a7e, (q15_t)0xdade, + (q15_t)0x7a7d, (q15_t)0xdad8, (q15_t)0x7a7b, (q15_t)0xdad2, (q15_t)0x7a79, (q15_t)0xdacc, (q15_t)0x7a77, (q15_t)0xdac6, + (q15_t)0x7a75, (q15_t)0xdac0, (q15_t)0x7a73, (q15_t)0xdaba, (q15_t)0x7a72, (q15_t)0xdab4, (q15_t)0x7a70, (q15_t)0xdaae, + (q15_t)0x7a6e, (q15_t)0xdaa8, (q15_t)0x7a6c, (q15_t)0xdaa2, (q15_t)0x7a6a, (q15_t)0xda9c, (q15_t)0x7a68, (q15_t)0xda96, + (q15_t)0x7a67, (q15_t)0xda90, (q15_t)0x7a65, (q15_t)0xda8a, (q15_t)0x7a63, (q15_t)0xda84, (q15_t)0x7a61, (q15_t)0xda7e, + (q15_t)0x7a5f, (q15_t)0xda78, (q15_t)0x7a5d, (q15_t)0xda72, (q15_t)0x7a5c, (q15_t)0xda6c, (q15_t)0x7a5a, (q15_t)0xda66, + (q15_t)0x7a58, (q15_t)0xda60, (q15_t)0x7a56, (q15_t)0xda5a, (q15_t)0x7a54, (q15_t)0xda54, (q15_t)0x7a52, (q15_t)0xda4e, + (q15_t)0x7a50, (q15_t)0xda48, (q15_t)0x7a4f, (q15_t)0xda42, (q15_t)0x7a4d, (q15_t)0xda3c, (q15_t)0x7a4b, (q15_t)0xda36, + (q15_t)0x7a49, (q15_t)0xda30, (q15_t)0x7a47, (q15_t)0xda2a, (q15_t)0x7a45, (q15_t)0xda24, (q15_t)0x7a43, (q15_t)0xda1e, + (q15_t)0x7a42, (q15_t)0xda18, (q15_t)0x7a40, (q15_t)0xda12, (q15_t)0x7a3e, (q15_t)0xda0c, (q15_t)0x7a3c, (q15_t)0xda06, + (q15_t)0x7a3a, (q15_t)0xda00, (q15_t)0x7a38, (q15_t)0xd9fa, (q15_t)0x7a36, (q15_t)0xd9f4, (q15_t)0x7a35, (q15_t)0xd9ee, + (q15_t)0x7a33, (q15_t)0xd9e8, (q15_t)0x7a31, (q15_t)0xd9e2, (q15_t)0x7a2f, (q15_t)0xd9dc, (q15_t)0x7a2d, (q15_t)0xd9d6, + (q15_t)0x7a2b, (q15_t)0xd9d0, (q15_t)0x7a29, (q15_t)0xd9ca, (q15_t)0x7a27, (q15_t)0xd9c4, (q15_t)0x7a26, (q15_t)0xd9be, + (q15_t)0x7a24, (q15_t)0xd9b8, (q15_t)0x7a22, (q15_t)0xd9b2, (q15_t)0x7a20, (q15_t)0xd9ac, (q15_t)0x7a1e, (q15_t)0xd9a6, + (q15_t)0x7a1c, (q15_t)0xd9a0, (q15_t)0x7a1a, (q15_t)0xd99a, (q15_t)0x7a18, (q15_t)0xd994, (q15_t)0x7a16, (q15_t)0xd98e, + (q15_t)0x7a15, (q15_t)0xd988, (q15_t)0x7a13, (q15_t)0xd982, (q15_t)0x7a11, (q15_t)0xd97c, (q15_t)0x7a0f, (q15_t)0xd976, + (q15_t)0x7a0d, (q15_t)0xd970, (q15_t)0x7a0b, (q15_t)0xd96a, (q15_t)0x7a09, (q15_t)0xd964, (q15_t)0x7a07, (q15_t)0xd95e, + (q15_t)0x7a05, (q15_t)0xd958, (q15_t)0x7a04, (q15_t)0xd952, (q15_t)0x7a02, (q15_t)0xd94c, (q15_t)0x7a00, (q15_t)0xd946, + (q15_t)0x79fe, (q15_t)0xd940, (q15_t)0x79fc, (q15_t)0xd93a, (q15_t)0x79fa, (q15_t)0xd934, (q15_t)0x79f8, (q15_t)0xd92e, + (q15_t)0x79f6, (q15_t)0xd928, (q15_t)0x79f4, (q15_t)0xd922, (q15_t)0x79f2, (q15_t)0xd91c, (q15_t)0x79f0, (q15_t)0xd917, + (q15_t)0x79ef, (q15_t)0xd911, (q15_t)0x79ed, (q15_t)0xd90b, (q15_t)0x79eb, (q15_t)0xd905, (q15_t)0x79e9, (q15_t)0xd8ff, + (q15_t)0x79e7, (q15_t)0xd8f9, (q15_t)0x79e5, (q15_t)0xd8f3, (q15_t)0x79e3, (q15_t)0xd8ed, (q15_t)0x79e1, (q15_t)0xd8e7, + (q15_t)0x79df, (q15_t)0xd8e1, (q15_t)0x79dd, (q15_t)0xd8db, (q15_t)0x79db, (q15_t)0xd8d5, (q15_t)0x79d9, (q15_t)0xd8cf, + (q15_t)0x79d8, (q15_t)0xd8c9, (q15_t)0x79d6, (q15_t)0xd8c3, (q15_t)0x79d4, (q15_t)0xd8bd, (q15_t)0x79d2, (q15_t)0xd8b7, + (q15_t)0x79d0, (q15_t)0xd8b1, (q15_t)0x79ce, (q15_t)0xd8ab, (q15_t)0x79cc, (q15_t)0xd8a5, (q15_t)0x79ca, (q15_t)0xd89f, + (q15_t)0x79c8, (q15_t)0xd899, (q15_t)0x79c6, (q15_t)0xd893, (q15_t)0x79c4, (q15_t)0xd88d, (q15_t)0x79c2, (q15_t)0xd887, + (q15_t)0x79c0, (q15_t)0xd881, (q15_t)0x79be, (q15_t)0xd87b, (q15_t)0x79bc, (q15_t)0xd875, (q15_t)0x79bb, (q15_t)0xd86f, + (q15_t)0x79b9, (q15_t)0xd869, (q15_t)0x79b7, (q15_t)0xd863, (q15_t)0x79b5, (q15_t)0xd85d, (q15_t)0x79b3, (q15_t)0xd857, + (q15_t)0x79b1, (q15_t)0xd851, (q15_t)0x79af, (q15_t)0xd84b, (q15_t)0x79ad, (q15_t)0xd845, (q15_t)0x79ab, (q15_t)0xd83f, + (q15_t)0x79a9, (q15_t)0xd839, (q15_t)0x79a7, (q15_t)0xd833, (q15_t)0x79a5, (q15_t)0xd82d, (q15_t)0x79a3, (q15_t)0xd827, + (q15_t)0x79a1, (q15_t)0xd821, (q15_t)0x799f, (q15_t)0xd81b, (q15_t)0x799d, (q15_t)0xd815, (q15_t)0x799b, (q15_t)0xd80f, + (q15_t)0x7999, (q15_t)0xd80a, (q15_t)0x7997, (q15_t)0xd804, (q15_t)0x7995, (q15_t)0xd7fe, (q15_t)0x7993, (q15_t)0xd7f8, + (q15_t)0x7992, (q15_t)0xd7f2, (q15_t)0x7990, (q15_t)0xd7ec, (q15_t)0x798e, (q15_t)0xd7e6, (q15_t)0x798c, (q15_t)0xd7e0, + (q15_t)0x798a, (q15_t)0xd7da, (q15_t)0x7988, (q15_t)0xd7d4, (q15_t)0x7986, (q15_t)0xd7ce, (q15_t)0x7984, (q15_t)0xd7c8, + (q15_t)0x7982, (q15_t)0xd7c2, (q15_t)0x7980, (q15_t)0xd7bc, (q15_t)0x797e, (q15_t)0xd7b6, (q15_t)0x797c, (q15_t)0xd7b0, + (q15_t)0x797a, (q15_t)0xd7aa, (q15_t)0x7978, (q15_t)0xd7a4, (q15_t)0x7976, (q15_t)0xd79e, (q15_t)0x7974, (q15_t)0xd798, + (q15_t)0x7972, (q15_t)0xd792, (q15_t)0x7970, (q15_t)0xd78c, (q15_t)0x796e, (q15_t)0xd786, (q15_t)0x796c, (q15_t)0xd780, + (q15_t)0x796a, (q15_t)0xd77a, (q15_t)0x7968, (q15_t)0xd774, (q15_t)0x7966, (q15_t)0xd76e, (q15_t)0x7964, (q15_t)0xd768, + (q15_t)0x7962, (q15_t)0xd763, (q15_t)0x7960, (q15_t)0xd75d, (q15_t)0x795e, (q15_t)0xd757, (q15_t)0x795c, (q15_t)0xd751, + (q15_t)0x795a, (q15_t)0xd74b, (q15_t)0x7958, (q15_t)0xd745, (q15_t)0x7956, (q15_t)0xd73f, (q15_t)0x7954, (q15_t)0xd739, + (q15_t)0x7952, (q15_t)0xd733, (q15_t)0x7950, (q15_t)0xd72d, (q15_t)0x794e, (q15_t)0xd727, (q15_t)0x794c, (q15_t)0xd721, + (q15_t)0x794a, (q15_t)0xd71b, (q15_t)0x7948, (q15_t)0xd715, (q15_t)0x7946, (q15_t)0xd70f, (q15_t)0x7944, (q15_t)0xd709, + (q15_t)0x7942, (q15_t)0xd703, (q15_t)0x7940, (q15_t)0xd6fd, (q15_t)0x793e, (q15_t)0xd6f7, (q15_t)0x793c, (q15_t)0xd6f1, + (q15_t)0x793a, (q15_t)0xd6eb, (q15_t)0x7938, (q15_t)0xd6e5, (q15_t)0x7936, (q15_t)0xd6e0, (q15_t)0x7934, (q15_t)0xd6da, + (q15_t)0x7932, (q15_t)0xd6d4, (q15_t)0x7930, (q15_t)0xd6ce, (q15_t)0x792e, (q15_t)0xd6c8, (q15_t)0x792c, (q15_t)0xd6c2, + (q15_t)0x792a, (q15_t)0xd6bc, (q15_t)0x7928, (q15_t)0xd6b6, (q15_t)0x7926, (q15_t)0xd6b0, (q15_t)0x7924, (q15_t)0xd6aa, + (q15_t)0x7922, (q15_t)0xd6a4, (q15_t)0x7920, (q15_t)0xd69e, (q15_t)0x791e, (q15_t)0xd698, (q15_t)0x791c, (q15_t)0xd692, + (q15_t)0x7919, (q15_t)0xd68c, (q15_t)0x7917, (q15_t)0xd686, (q15_t)0x7915, (q15_t)0xd680, (q15_t)0x7913, (q15_t)0xd67a, + (q15_t)0x7911, (q15_t)0xd675, (q15_t)0x790f, (q15_t)0xd66f, (q15_t)0x790d, (q15_t)0xd669, (q15_t)0x790b, (q15_t)0xd663, + (q15_t)0x7909, (q15_t)0xd65d, (q15_t)0x7907, (q15_t)0xd657, (q15_t)0x7905, (q15_t)0xd651, (q15_t)0x7903, (q15_t)0xd64b, + (q15_t)0x7901, (q15_t)0xd645, (q15_t)0x78ff, (q15_t)0xd63f, (q15_t)0x78fd, (q15_t)0xd639, (q15_t)0x78fb, (q15_t)0xd633, + (q15_t)0x78f9, (q15_t)0xd62d, (q15_t)0x78f7, (q15_t)0xd627, (q15_t)0x78f5, (q15_t)0xd621, (q15_t)0x78f3, (q15_t)0xd61b, + (q15_t)0x78f1, (q15_t)0xd615, (q15_t)0x78ee, (q15_t)0xd610, (q15_t)0x78ec, (q15_t)0xd60a, (q15_t)0x78ea, (q15_t)0xd604, + (q15_t)0x78e8, (q15_t)0xd5fe, (q15_t)0x78e6, (q15_t)0xd5f8, (q15_t)0x78e4, (q15_t)0xd5f2, (q15_t)0x78e2, (q15_t)0xd5ec, + (q15_t)0x78e0, (q15_t)0xd5e6, (q15_t)0x78de, (q15_t)0xd5e0, (q15_t)0x78dc, (q15_t)0xd5da, (q15_t)0x78da, (q15_t)0xd5d4, + (q15_t)0x78d8, (q15_t)0xd5ce, (q15_t)0x78d6, (q15_t)0xd5c8, (q15_t)0x78d4, (q15_t)0xd5c2, (q15_t)0x78d2, (q15_t)0xd5bc, + (q15_t)0x78cf, (q15_t)0xd5b7, (q15_t)0x78cd, (q15_t)0xd5b1, (q15_t)0x78cb, (q15_t)0xd5ab, (q15_t)0x78c9, (q15_t)0xd5a5, + (q15_t)0x78c7, (q15_t)0xd59f, (q15_t)0x78c5, (q15_t)0xd599, (q15_t)0x78c3, (q15_t)0xd593, (q15_t)0x78c1, (q15_t)0xd58d, + (q15_t)0x78bf, (q15_t)0xd587, (q15_t)0x78bd, (q15_t)0xd581, (q15_t)0x78bb, (q15_t)0xd57b, (q15_t)0x78b9, (q15_t)0xd575, + (q15_t)0x78b6, (q15_t)0xd56f, (q15_t)0x78b4, (q15_t)0xd569, (q15_t)0x78b2, (q15_t)0xd564, (q15_t)0x78b0, (q15_t)0xd55e, + (q15_t)0x78ae, (q15_t)0xd558, (q15_t)0x78ac, (q15_t)0xd552, (q15_t)0x78aa, (q15_t)0xd54c, (q15_t)0x78a8, (q15_t)0xd546, + (q15_t)0x78a6, (q15_t)0xd540, (q15_t)0x78a4, (q15_t)0xd53a, (q15_t)0x78a2, (q15_t)0xd534, (q15_t)0x789f, (q15_t)0xd52e, + (q15_t)0x789d, (q15_t)0xd528, (q15_t)0x789b, (q15_t)0xd522, (q15_t)0x7899, (q15_t)0xd51c, (q15_t)0x7897, (q15_t)0xd517, + (q15_t)0x7895, (q15_t)0xd511, (q15_t)0x7893, (q15_t)0xd50b, (q15_t)0x7891, (q15_t)0xd505, (q15_t)0x788f, (q15_t)0xd4ff, + (q15_t)0x788c, (q15_t)0xd4f9, (q15_t)0x788a, (q15_t)0xd4f3, (q15_t)0x7888, (q15_t)0xd4ed, (q15_t)0x7886, (q15_t)0xd4e7, + (q15_t)0x7884, (q15_t)0xd4e1, (q15_t)0x7882, (q15_t)0xd4db, (q15_t)0x7880, (q15_t)0xd4d5, (q15_t)0x787e, (q15_t)0xd4d0, + (q15_t)0x787c, (q15_t)0xd4ca, (q15_t)0x7879, (q15_t)0xd4c4, (q15_t)0x7877, (q15_t)0xd4be, (q15_t)0x7875, (q15_t)0xd4b8, + (q15_t)0x7873, (q15_t)0xd4b2, (q15_t)0x7871, (q15_t)0xd4ac, (q15_t)0x786f, (q15_t)0xd4a6, (q15_t)0x786d, (q15_t)0xd4a0, + (q15_t)0x786b, (q15_t)0xd49a, (q15_t)0x7868, (q15_t)0xd494, (q15_t)0x7866, (q15_t)0xd48f, (q15_t)0x7864, (q15_t)0xd489, + (q15_t)0x7862, (q15_t)0xd483, (q15_t)0x7860, (q15_t)0xd47d, (q15_t)0x785e, (q15_t)0xd477, (q15_t)0x785c, (q15_t)0xd471, + (q15_t)0x7859, (q15_t)0xd46b, (q15_t)0x7857, (q15_t)0xd465, (q15_t)0x7855, (q15_t)0xd45f, (q15_t)0x7853, (q15_t)0xd459, + (q15_t)0x7851, (q15_t)0xd453, (q15_t)0x784f, (q15_t)0xd44e, (q15_t)0x784d, (q15_t)0xd448, (q15_t)0x784a, (q15_t)0xd442, + (q15_t)0x7848, (q15_t)0xd43c, (q15_t)0x7846, (q15_t)0xd436, (q15_t)0x7844, (q15_t)0xd430, (q15_t)0x7842, (q15_t)0xd42a, + (q15_t)0x7840, (q15_t)0xd424, (q15_t)0x783e, (q15_t)0xd41e, (q15_t)0x783b, (q15_t)0xd418, (q15_t)0x7839, (q15_t)0xd412, + (q15_t)0x7837, (q15_t)0xd40d, (q15_t)0x7835, (q15_t)0xd407, (q15_t)0x7833, (q15_t)0xd401, (q15_t)0x7831, (q15_t)0xd3fb, + (q15_t)0x782e, (q15_t)0xd3f5, (q15_t)0x782c, (q15_t)0xd3ef, (q15_t)0x782a, (q15_t)0xd3e9, (q15_t)0x7828, (q15_t)0xd3e3, + (q15_t)0x7826, (q15_t)0xd3dd, (q15_t)0x7824, (q15_t)0xd3d7, (q15_t)0x7821, (q15_t)0xd3d2, (q15_t)0x781f, (q15_t)0xd3cc, + (q15_t)0x781d, (q15_t)0xd3c6, (q15_t)0x781b, (q15_t)0xd3c0, (q15_t)0x7819, (q15_t)0xd3ba, (q15_t)0x7817, (q15_t)0xd3b4, + (q15_t)0x7814, (q15_t)0xd3ae, (q15_t)0x7812, (q15_t)0xd3a8, (q15_t)0x7810, (q15_t)0xd3a2, (q15_t)0x780e, (q15_t)0xd39d, + (q15_t)0x780c, (q15_t)0xd397, (q15_t)0x780a, (q15_t)0xd391, (q15_t)0x7807, (q15_t)0xd38b, (q15_t)0x7805, (q15_t)0xd385, + (q15_t)0x7803, (q15_t)0xd37f, (q15_t)0x7801, (q15_t)0xd379, (q15_t)0x77ff, (q15_t)0xd373, (q15_t)0x77fc, (q15_t)0xd36d, + (q15_t)0x77fa, (q15_t)0xd368, (q15_t)0x77f8, (q15_t)0xd362, (q15_t)0x77f6, (q15_t)0xd35c, (q15_t)0x77f4, (q15_t)0xd356, + (q15_t)0x77f1, (q15_t)0xd350, (q15_t)0x77ef, (q15_t)0xd34a, (q15_t)0x77ed, (q15_t)0xd344, (q15_t)0x77eb, (q15_t)0xd33e, + (q15_t)0x77e9, (q15_t)0xd338, (q15_t)0x77e6, (q15_t)0xd333, (q15_t)0x77e4, (q15_t)0xd32d, (q15_t)0x77e2, (q15_t)0xd327, + (q15_t)0x77e0, (q15_t)0xd321, (q15_t)0x77de, (q15_t)0xd31b, (q15_t)0x77db, (q15_t)0xd315, (q15_t)0x77d9, (q15_t)0xd30f, + (q15_t)0x77d7, (q15_t)0xd309, (q15_t)0x77d5, (q15_t)0xd303, (q15_t)0x77d3, (q15_t)0xd2fe, (q15_t)0x77d0, (q15_t)0xd2f8, + (q15_t)0x77ce, (q15_t)0xd2f2, (q15_t)0x77cc, (q15_t)0xd2ec, (q15_t)0x77ca, (q15_t)0xd2e6, (q15_t)0x77c8, (q15_t)0xd2e0, + (q15_t)0x77c5, (q15_t)0xd2da, (q15_t)0x77c3, (q15_t)0xd2d4, (q15_t)0x77c1, (q15_t)0xd2cf, (q15_t)0x77bf, (q15_t)0xd2c9, + (q15_t)0x77bc, (q15_t)0xd2c3, (q15_t)0x77ba, (q15_t)0xd2bd, (q15_t)0x77b8, (q15_t)0xd2b7, (q15_t)0x77b6, (q15_t)0xd2b1, + (q15_t)0x77b4, (q15_t)0xd2ab, (q15_t)0x77b1, (q15_t)0xd2a5, (q15_t)0x77af, (q15_t)0xd2a0, (q15_t)0x77ad, (q15_t)0xd29a, + (q15_t)0x77ab, (q15_t)0xd294, (q15_t)0x77a8, (q15_t)0xd28e, (q15_t)0x77a6, (q15_t)0xd288, (q15_t)0x77a4, (q15_t)0xd282, + (q15_t)0x77a2, (q15_t)0xd27c, (q15_t)0x77a0, (q15_t)0xd276, (q15_t)0x779d, (q15_t)0xd271, (q15_t)0x779b, (q15_t)0xd26b, + (q15_t)0x7799, (q15_t)0xd265, (q15_t)0x7797, (q15_t)0xd25f, (q15_t)0x7794, (q15_t)0xd259, (q15_t)0x7792, (q15_t)0xd253, + (q15_t)0x7790, (q15_t)0xd24d, (q15_t)0x778e, (q15_t)0xd247, (q15_t)0x778b, (q15_t)0xd242, (q15_t)0x7789, (q15_t)0xd23c, + (q15_t)0x7787, (q15_t)0xd236, (q15_t)0x7785, (q15_t)0xd230, (q15_t)0x7782, (q15_t)0xd22a, (q15_t)0x7780, (q15_t)0xd224, + (q15_t)0x777e, (q15_t)0xd21e, (q15_t)0x777c, (q15_t)0xd219, (q15_t)0x7779, (q15_t)0xd213, (q15_t)0x7777, (q15_t)0xd20d, + (q15_t)0x7775, (q15_t)0xd207, (q15_t)0x7773, (q15_t)0xd201, (q15_t)0x7770, (q15_t)0xd1fb, (q15_t)0x776e, (q15_t)0xd1f5, + (q15_t)0x776c, (q15_t)0xd1ef, (q15_t)0x776a, (q15_t)0xd1ea, (q15_t)0x7767, (q15_t)0xd1e4, (q15_t)0x7765, (q15_t)0xd1de, + (q15_t)0x7763, (q15_t)0xd1d8, (q15_t)0x7760, (q15_t)0xd1d2, (q15_t)0x775e, (q15_t)0xd1cc, (q15_t)0x775c, (q15_t)0xd1c6, + (q15_t)0x775a, (q15_t)0xd1c1, (q15_t)0x7757, (q15_t)0xd1bb, (q15_t)0x7755, (q15_t)0xd1b5, (q15_t)0x7753, (q15_t)0xd1af, + (q15_t)0x7751, (q15_t)0xd1a9, (q15_t)0x774e, (q15_t)0xd1a3, (q15_t)0x774c, (q15_t)0xd19d, (q15_t)0x774a, (q15_t)0xd198, + (q15_t)0x7747, (q15_t)0xd192, (q15_t)0x7745, (q15_t)0xd18c, (q15_t)0x7743, (q15_t)0xd186, (q15_t)0x7741, (q15_t)0xd180, + (q15_t)0x773e, (q15_t)0xd17a, (q15_t)0x773c, (q15_t)0xd174, (q15_t)0x773a, (q15_t)0xd16f, (q15_t)0x7738, (q15_t)0xd169, + (q15_t)0x7735, (q15_t)0xd163, (q15_t)0x7733, (q15_t)0xd15d, (q15_t)0x7731, (q15_t)0xd157, (q15_t)0x772e, (q15_t)0xd151, + (q15_t)0x772c, (q15_t)0xd14b, (q15_t)0x772a, (q15_t)0xd146, (q15_t)0x7727, (q15_t)0xd140, (q15_t)0x7725, (q15_t)0xd13a, + (q15_t)0x7723, (q15_t)0xd134, (q15_t)0x7721, (q15_t)0xd12e, (q15_t)0x771e, (q15_t)0xd128, (q15_t)0x771c, (q15_t)0xd123, + (q15_t)0x771a, (q15_t)0xd11d, (q15_t)0x7717, (q15_t)0xd117, (q15_t)0x7715, (q15_t)0xd111, (q15_t)0x7713, (q15_t)0xd10b, + (q15_t)0x7710, (q15_t)0xd105, (q15_t)0x770e, (q15_t)0xd0ff, (q15_t)0x770c, (q15_t)0xd0fa, (q15_t)0x770a, (q15_t)0xd0f4, + (q15_t)0x7707, (q15_t)0xd0ee, (q15_t)0x7705, (q15_t)0xd0e8, (q15_t)0x7703, (q15_t)0xd0e2, (q15_t)0x7700, (q15_t)0xd0dc, + (q15_t)0x76fe, (q15_t)0xd0d7, (q15_t)0x76fc, (q15_t)0xd0d1, (q15_t)0x76f9, (q15_t)0xd0cb, (q15_t)0x76f7, (q15_t)0xd0c5, + (q15_t)0x76f5, (q15_t)0xd0bf, (q15_t)0x76f2, (q15_t)0xd0b9, (q15_t)0x76f0, (q15_t)0xd0b4, (q15_t)0x76ee, (q15_t)0xd0ae, + (q15_t)0x76eb, (q15_t)0xd0a8, (q15_t)0x76e9, (q15_t)0xd0a2, (q15_t)0x76e7, (q15_t)0xd09c, (q15_t)0x76e4, (q15_t)0xd096, + (q15_t)0x76e2, (q15_t)0xd091, (q15_t)0x76e0, (q15_t)0xd08b, (q15_t)0x76dd, (q15_t)0xd085, (q15_t)0x76db, (q15_t)0xd07f, + (q15_t)0x76d9, (q15_t)0xd079, (q15_t)0x76d6, (q15_t)0xd073, (q15_t)0x76d4, (q15_t)0xd06e, (q15_t)0x76d2, (q15_t)0xd068, + (q15_t)0x76cf, (q15_t)0xd062, (q15_t)0x76cd, (q15_t)0xd05c, (q15_t)0x76cb, (q15_t)0xd056, (q15_t)0x76c8, (q15_t)0xd050, + (q15_t)0x76c6, (q15_t)0xd04b, (q15_t)0x76c4, (q15_t)0xd045, (q15_t)0x76c1, (q15_t)0xd03f, (q15_t)0x76bf, (q15_t)0xd039, + (q15_t)0x76bd, (q15_t)0xd033, (q15_t)0x76ba, (q15_t)0xd02d, (q15_t)0x76b8, (q15_t)0xd028, (q15_t)0x76b6, (q15_t)0xd022, + (q15_t)0x76b3, (q15_t)0xd01c, (q15_t)0x76b1, (q15_t)0xd016, (q15_t)0x76af, (q15_t)0xd010, (q15_t)0x76ac, (q15_t)0xd00a, + (q15_t)0x76aa, (q15_t)0xd005, (q15_t)0x76a8, (q15_t)0xcfff, (q15_t)0x76a5, (q15_t)0xcff9, (q15_t)0x76a3, (q15_t)0xcff3, + (q15_t)0x76a0, (q15_t)0xcfed, (q15_t)0x769e, (q15_t)0xcfe7, (q15_t)0x769c, (q15_t)0xcfe2, (q15_t)0x7699, (q15_t)0xcfdc, + (q15_t)0x7697, (q15_t)0xcfd6, (q15_t)0x7695, (q15_t)0xcfd0, (q15_t)0x7692, (q15_t)0xcfca, (q15_t)0x7690, (q15_t)0xcfc5, + (q15_t)0x768e, (q15_t)0xcfbf, (q15_t)0x768b, (q15_t)0xcfb9, (q15_t)0x7689, (q15_t)0xcfb3, (q15_t)0x7686, (q15_t)0xcfad, + (q15_t)0x7684, (q15_t)0xcfa7, (q15_t)0x7682, (q15_t)0xcfa2, (q15_t)0x767f, (q15_t)0xcf9c, (q15_t)0x767d, (q15_t)0xcf96, + (q15_t)0x767b, (q15_t)0xcf90, (q15_t)0x7678, (q15_t)0xcf8a, (q15_t)0x7676, (q15_t)0xcf85, (q15_t)0x7673, (q15_t)0xcf7f, + (q15_t)0x7671, (q15_t)0xcf79, (q15_t)0x766f, (q15_t)0xcf73, (q15_t)0x766c, (q15_t)0xcf6d, (q15_t)0x766a, (q15_t)0xcf67, + (q15_t)0x7668, (q15_t)0xcf62, (q15_t)0x7665, (q15_t)0xcf5c, (q15_t)0x7663, (q15_t)0xcf56, (q15_t)0x7660, (q15_t)0xcf50, + (q15_t)0x765e, (q15_t)0xcf4a, (q15_t)0x765c, (q15_t)0xcf45, (q15_t)0x7659, (q15_t)0xcf3f, (q15_t)0x7657, (q15_t)0xcf39, + (q15_t)0x7654, (q15_t)0xcf33, (q15_t)0x7652, (q15_t)0xcf2d, (q15_t)0x7650, (q15_t)0xcf28, (q15_t)0x764d, (q15_t)0xcf22, + (q15_t)0x764b, (q15_t)0xcf1c, (q15_t)0x7648, (q15_t)0xcf16, (q15_t)0x7646, (q15_t)0xcf10, (q15_t)0x7644, (q15_t)0xcf0b, + (q15_t)0x7641, (q15_t)0xcf05, (q15_t)0x763f, (q15_t)0xceff, (q15_t)0x763c, (q15_t)0xcef9, (q15_t)0x763a, (q15_t)0xcef3, + (q15_t)0x7638, (q15_t)0xceee, (q15_t)0x7635, (q15_t)0xcee8, (q15_t)0x7633, (q15_t)0xcee2, (q15_t)0x7630, (q15_t)0xcedc, + (q15_t)0x762e, (q15_t)0xced6, (q15_t)0x762b, (q15_t)0xced1, (q15_t)0x7629, (q15_t)0xcecb, (q15_t)0x7627, (q15_t)0xcec5, + (q15_t)0x7624, (q15_t)0xcebf, (q15_t)0x7622, (q15_t)0xceb9, (q15_t)0x761f, (q15_t)0xceb4, (q15_t)0x761d, (q15_t)0xceae, + (q15_t)0x761b, (q15_t)0xcea8, (q15_t)0x7618, (q15_t)0xcea2, (q15_t)0x7616, (q15_t)0xce9c, (q15_t)0x7613, (q15_t)0xce97, + (q15_t)0x7611, (q15_t)0xce91, (q15_t)0x760e, (q15_t)0xce8b, (q15_t)0x760c, (q15_t)0xce85, (q15_t)0x760a, (q15_t)0xce7f, + (q15_t)0x7607, (q15_t)0xce7a, (q15_t)0x7605, (q15_t)0xce74, (q15_t)0x7602, (q15_t)0xce6e, (q15_t)0x7600, (q15_t)0xce68, + (q15_t)0x75fd, (q15_t)0xce62, (q15_t)0x75fb, (q15_t)0xce5d, (q15_t)0x75f9, (q15_t)0xce57, (q15_t)0x75f6, (q15_t)0xce51, + (q15_t)0x75f4, (q15_t)0xce4b, (q15_t)0x75f1, (q15_t)0xce45, (q15_t)0x75ef, (q15_t)0xce40, (q15_t)0x75ec, (q15_t)0xce3a, + (q15_t)0x75ea, (q15_t)0xce34, (q15_t)0x75e7, (q15_t)0xce2e, (q15_t)0x75e5, (q15_t)0xce28, (q15_t)0x75e3, (q15_t)0xce23, + (q15_t)0x75e0, (q15_t)0xce1d, (q15_t)0x75de, (q15_t)0xce17, (q15_t)0x75db, (q15_t)0xce11, (q15_t)0x75d9, (q15_t)0xce0c, + (q15_t)0x75d6, (q15_t)0xce06, (q15_t)0x75d4, (q15_t)0xce00, (q15_t)0x75d1, (q15_t)0xcdfa, (q15_t)0x75cf, (q15_t)0xcdf4, + (q15_t)0x75cc, (q15_t)0xcdef, (q15_t)0x75ca, (q15_t)0xcde9, (q15_t)0x75c8, (q15_t)0xcde3, (q15_t)0x75c5, (q15_t)0xcddd, + (q15_t)0x75c3, (q15_t)0xcdd8, (q15_t)0x75c0, (q15_t)0xcdd2, (q15_t)0x75be, (q15_t)0xcdcc, (q15_t)0x75bb, (q15_t)0xcdc6, + (q15_t)0x75b9, (q15_t)0xcdc0, (q15_t)0x75b6, (q15_t)0xcdbb, (q15_t)0x75b4, (q15_t)0xcdb5, (q15_t)0x75b1, (q15_t)0xcdaf, + (q15_t)0x75af, (q15_t)0xcda9, (q15_t)0x75ac, (q15_t)0xcda3, (q15_t)0x75aa, (q15_t)0xcd9e, (q15_t)0x75a7, (q15_t)0xcd98, + (q15_t)0x75a5, (q15_t)0xcd92, (q15_t)0x75a3, (q15_t)0xcd8c, (q15_t)0x75a0, (q15_t)0xcd87, (q15_t)0x759e, (q15_t)0xcd81, + (q15_t)0x759b, (q15_t)0xcd7b, (q15_t)0x7599, (q15_t)0xcd75, (q15_t)0x7596, (q15_t)0xcd70, (q15_t)0x7594, (q15_t)0xcd6a, + (q15_t)0x7591, (q15_t)0xcd64, (q15_t)0x758f, (q15_t)0xcd5e, (q15_t)0x758c, (q15_t)0xcd58, (q15_t)0x758a, (q15_t)0xcd53, + (q15_t)0x7587, (q15_t)0xcd4d, (q15_t)0x7585, (q15_t)0xcd47, (q15_t)0x7582, (q15_t)0xcd41, (q15_t)0x7580, (q15_t)0xcd3c, + (q15_t)0x757d, (q15_t)0xcd36, (q15_t)0x757b, (q15_t)0xcd30, (q15_t)0x7578, (q15_t)0xcd2a, (q15_t)0x7576, (q15_t)0xcd25, + (q15_t)0x7573, (q15_t)0xcd1f, (q15_t)0x7571, (q15_t)0xcd19, (q15_t)0x756e, (q15_t)0xcd13, (q15_t)0x756c, (q15_t)0xcd0d, + (q15_t)0x7569, (q15_t)0xcd08, (q15_t)0x7567, (q15_t)0xcd02, (q15_t)0x7564, (q15_t)0xccfc, (q15_t)0x7562, (q15_t)0xccf6, + (q15_t)0x755f, (q15_t)0xccf1, (q15_t)0x755d, (q15_t)0xcceb, (q15_t)0x755a, (q15_t)0xcce5, (q15_t)0x7558, (q15_t)0xccdf, + (q15_t)0x7555, (q15_t)0xccda, (q15_t)0x7553, (q15_t)0xccd4, (q15_t)0x7550, (q15_t)0xccce, (q15_t)0x754e, (q15_t)0xccc8, + (q15_t)0x754b, (q15_t)0xccc3, (q15_t)0x7549, (q15_t)0xccbd, (q15_t)0x7546, (q15_t)0xccb7, (q15_t)0x7544, (q15_t)0xccb1, + (q15_t)0x7541, (q15_t)0xccac, (q15_t)0x753f, (q15_t)0xcca6, (q15_t)0x753c, (q15_t)0xcca0, (q15_t)0x753a, (q15_t)0xcc9a, + (q15_t)0x7537, (q15_t)0xcc95, (q15_t)0x7535, (q15_t)0xcc8f, (q15_t)0x7532, (q15_t)0xcc89, (q15_t)0x752f, (q15_t)0xcc83, + (q15_t)0x752d, (q15_t)0xcc7e, (q15_t)0x752a, (q15_t)0xcc78, (q15_t)0x7528, (q15_t)0xcc72, (q15_t)0x7525, (q15_t)0xcc6c, + (q15_t)0x7523, (q15_t)0xcc67, (q15_t)0x7520, (q15_t)0xcc61, (q15_t)0x751e, (q15_t)0xcc5b, (q15_t)0x751b, (q15_t)0xcc55, + (q15_t)0x7519, (q15_t)0xcc50, (q15_t)0x7516, (q15_t)0xcc4a, (q15_t)0x7514, (q15_t)0xcc44, (q15_t)0x7511, (q15_t)0xcc3e, + (q15_t)0x750f, (q15_t)0xcc39, (q15_t)0x750c, (q15_t)0xcc33, (q15_t)0x7509, (q15_t)0xcc2d, (q15_t)0x7507, (q15_t)0xcc27, + (q15_t)0x7504, (q15_t)0xcc22, (q15_t)0x7502, (q15_t)0xcc1c, (q15_t)0x74ff, (q15_t)0xcc16, (q15_t)0x74fd, (q15_t)0xcc10, + (q15_t)0x74fa, (q15_t)0xcc0b, (q15_t)0x74f8, (q15_t)0xcc05, (q15_t)0x74f5, (q15_t)0xcbff, (q15_t)0x74f2, (q15_t)0xcbf9, + (q15_t)0x74f0, (q15_t)0xcbf4, (q15_t)0x74ed, (q15_t)0xcbee, (q15_t)0x74eb, (q15_t)0xcbe8, (q15_t)0x74e8, (q15_t)0xcbe2, + (q15_t)0x74e6, (q15_t)0xcbdd, (q15_t)0x74e3, (q15_t)0xcbd7, (q15_t)0x74e1, (q15_t)0xcbd1, (q15_t)0x74de, (q15_t)0xcbcb, + (q15_t)0x74db, (q15_t)0xcbc6, (q15_t)0x74d9, (q15_t)0xcbc0, (q15_t)0x74d6, (q15_t)0xcbba, (q15_t)0x74d4, (q15_t)0xcbb5, + (q15_t)0x74d1, (q15_t)0xcbaf, (q15_t)0x74cf, (q15_t)0xcba9, (q15_t)0x74cc, (q15_t)0xcba3, (q15_t)0x74c9, (q15_t)0xcb9e, + (q15_t)0x74c7, (q15_t)0xcb98, (q15_t)0x74c4, (q15_t)0xcb92, (q15_t)0x74c2, (q15_t)0xcb8c, (q15_t)0x74bf, (q15_t)0xcb87, + (q15_t)0x74bd, (q15_t)0xcb81, (q15_t)0x74ba, (q15_t)0xcb7b, (q15_t)0x74b7, (q15_t)0xcb75, (q15_t)0x74b5, (q15_t)0xcb70, + (q15_t)0x74b2, (q15_t)0xcb6a, (q15_t)0x74b0, (q15_t)0xcb64, (q15_t)0x74ad, (q15_t)0xcb5f, (q15_t)0x74ab, (q15_t)0xcb59, + (q15_t)0x74a8, (q15_t)0xcb53, (q15_t)0x74a5, (q15_t)0xcb4d, (q15_t)0x74a3, (q15_t)0xcb48, (q15_t)0x74a0, (q15_t)0xcb42, + (q15_t)0x749e, (q15_t)0xcb3c, (q15_t)0x749b, (q15_t)0xcb36, (q15_t)0x7498, (q15_t)0xcb31, (q15_t)0x7496, (q15_t)0xcb2b, + (q15_t)0x7493, (q15_t)0xcb25, (q15_t)0x7491, (q15_t)0xcb20, (q15_t)0x748e, (q15_t)0xcb1a, (q15_t)0x748b, (q15_t)0xcb14, + (q15_t)0x7489, (q15_t)0xcb0e, (q15_t)0x7486, (q15_t)0xcb09, (q15_t)0x7484, (q15_t)0xcb03, (q15_t)0x7481, (q15_t)0xcafd, + (q15_t)0x747e, (q15_t)0xcaf8, (q15_t)0x747c, (q15_t)0xcaf2, (q15_t)0x7479, (q15_t)0xcaec, (q15_t)0x7477, (q15_t)0xcae6, + (q15_t)0x7474, (q15_t)0xcae1, (q15_t)0x7471, (q15_t)0xcadb, (q15_t)0x746f, (q15_t)0xcad5, (q15_t)0x746c, (q15_t)0xcad0, + (q15_t)0x746a, (q15_t)0xcaca, (q15_t)0x7467, (q15_t)0xcac4, (q15_t)0x7464, (q15_t)0xcabe, (q15_t)0x7462, (q15_t)0xcab9, + (q15_t)0x745f, (q15_t)0xcab3, (q15_t)0x745c, (q15_t)0xcaad, (q15_t)0x745a, (q15_t)0xcaa8, (q15_t)0x7457, (q15_t)0xcaa2, + (q15_t)0x7455, (q15_t)0xca9c, (q15_t)0x7452, (q15_t)0xca96, (q15_t)0x744f, (q15_t)0xca91, (q15_t)0x744d, (q15_t)0xca8b, + (q15_t)0x744a, (q15_t)0xca85, (q15_t)0x7448, (q15_t)0xca80, (q15_t)0x7445, (q15_t)0xca7a, (q15_t)0x7442, (q15_t)0xca74, + (q15_t)0x7440, (q15_t)0xca6e, (q15_t)0x743d, (q15_t)0xca69, (q15_t)0x743a, (q15_t)0xca63, (q15_t)0x7438, (q15_t)0xca5d, + (q15_t)0x7435, (q15_t)0xca58, (q15_t)0x7432, (q15_t)0xca52, (q15_t)0x7430, (q15_t)0xca4c, (q15_t)0x742d, (q15_t)0xca46, + (q15_t)0x742b, (q15_t)0xca41, (q15_t)0x7428, (q15_t)0xca3b, (q15_t)0x7425, (q15_t)0xca35, (q15_t)0x7423, (q15_t)0xca30, + (q15_t)0x7420, (q15_t)0xca2a, (q15_t)0x741d, (q15_t)0xca24, (q15_t)0x741b, (q15_t)0xca1f, (q15_t)0x7418, (q15_t)0xca19, + (q15_t)0x7415, (q15_t)0xca13, (q15_t)0x7413, (q15_t)0xca0d, (q15_t)0x7410, (q15_t)0xca08, (q15_t)0x740d, (q15_t)0xca02, + (q15_t)0x740b, (q15_t)0xc9fc, (q15_t)0x7408, (q15_t)0xc9f7, (q15_t)0x7406, (q15_t)0xc9f1, (q15_t)0x7403, (q15_t)0xc9eb, + (q15_t)0x7400, (q15_t)0xc9e6, (q15_t)0x73fe, (q15_t)0xc9e0, (q15_t)0x73fb, (q15_t)0xc9da, (q15_t)0x73f8, (q15_t)0xc9d5, + (q15_t)0x73f6, (q15_t)0xc9cf, (q15_t)0x73f3, (q15_t)0xc9c9, (q15_t)0x73f0, (q15_t)0xc9c3, (q15_t)0x73ee, (q15_t)0xc9be, + (q15_t)0x73eb, (q15_t)0xc9b8, (q15_t)0x73e8, (q15_t)0xc9b2, (q15_t)0x73e6, (q15_t)0xc9ad, (q15_t)0x73e3, (q15_t)0xc9a7, + (q15_t)0x73e0, (q15_t)0xc9a1, (q15_t)0x73de, (q15_t)0xc99c, (q15_t)0x73db, (q15_t)0xc996, (q15_t)0x73d8, (q15_t)0xc990, + (q15_t)0x73d6, (q15_t)0xc98b, (q15_t)0x73d3, (q15_t)0xc985, (q15_t)0x73d0, (q15_t)0xc97f, (q15_t)0x73ce, (q15_t)0xc97a, + (q15_t)0x73cb, (q15_t)0xc974, (q15_t)0x73c8, (q15_t)0xc96e, (q15_t)0x73c6, (q15_t)0xc968, (q15_t)0x73c3, (q15_t)0xc963, + (q15_t)0x73c0, (q15_t)0xc95d, (q15_t)0x73bd, (q15_t)0xc957, (q15_t)0x73bb, (q15_t)0xc952, (q15_t)0x73b8, (q15_t)0xc94c, + (q15_t)0x73b5, (q15_t)0xc946, (q15_t)0x73b3, (q15_t)0xc941, (q15_t)0x73b0, (q15_t)0xc93b, (q15_t)0x73ad, (q15_t)0xc935, + (q15_t)0x73ab, (q15_t)0xc930, (q15_t)0x73a8, (q15_t)0xc92a, (q15_t)0x73a5, (q15_t)0xc924, (q15_t)0x73a3, (q15_t)0xc91f, + (q15_t)0x73a0, (q15_t)0xc919, (q15_t)0x739d, (q15_t)0xc913, (q15_t)0x739b, (q15_t)0xc90e, (q15_t)0x7398, (q15_t)0xc908, + (q15_t)0x7395, (q15_t)0xc902, (q15_t)0x7392, (q15_t)0xc8fd, (q15_t)0x7390, (q15_t)0xc8f7, (q15_t)0x738d, (q15_t)0xc8f1, + (q15_t)0x738a, (q15_t)0xc8ec, (q15_t)0x7388, (q15_t)0xc8e6, (q15_t)0x7385, (q15_t)0xc8e0, (q15_t)0x7382, (q15_t)0xc8db, + (q15_t)0x737f, (q15_t)0xc8d5, (q15_t)0x737d, (q15_t)0xc8cf, (q15_t)0x737a, (q15_t)0xc8ca, (q15_t)0x7377, (q15_t)0xc8c4, + (q15_t)0x7375, (q15_t)0xc8be, (q15_t)0x7372, (q15_t)0xc8b9, (q15_t)0x736f, (q15_t)0xc8b3, (q15_t)0x736c, (q15_t)0xc8ad, + (q15_t)0x736a, (q15_t)0xc8a8, (q15_t)0x7367, (q15_t)0xc8a2, (q15_t)0x7364, (q15_t)0xc89c, (q15_t)0x7362, (q15_t)0xc897, + (q15_t)0x735f, (q15_t)0xc891, (q15_t)0x735c, (q15_t)0xc88b, (q15_t)0x7359, (q15_t)0xc886, (q15_t)0x7357, (q15_t)0xc880, + (q15_t)0x7354, (q15_t)0xc87a, (q15_t)0x7351, (q15_t)0xc875, (q15_t)0x734f, (q15_t)0xc86f, (q15_t)0x734c, (q15_t)0xc869, + (q15_t)0x7349, (q15_t)0xc864, (q15_t)0x7346, (q15_t)0xc85e, (q15_t)0x7344, (q15_t)0xc858, (q15_t)0x7341, (q15_t)0xc853, + (q15_t)0x733e, (q15_t)0xc84d, (q15_t)0x733b, (q15_t)0xc847, (q15_t)0x7339, (q15_t)0xc842, (q15_t)0x7336, (q15_t)0xc83c, + (q15_t)0x7333, (q15_t)0xc836, (q15_t)0x7330, (q15_t)0xc831, (q15_t)0x732e, (q15_t)0xc82b, (q15_t)0x732b, (q15_t)0xc825, + (q15_t)0x7328, (q15_t)0xc820, (q15_t)0x7326, (q15_t)0xc81a, (q15_t)0x7323, (q15_t)0xc814, (q15_t)0x7320, (q15_t)0xc80f, + (q15_t)0x731d, (q15_t)0xc809, (q15_t)0x731b, (q15_t)0xc803, (q15_t)0x7318, (q15_t)0xc7fe, (q15_t)0x7315, (q15_t)0xc7f8, + (q15_t)0x7312, (q15_t)0xc7f3, (q15_t)0x7310, (q15_t)0xc7ed, (q15_t)0x730d, (q15_t)0xc7e7, (q15_t)0x730a, (q15_t)0xc7e2, + (q15_t)0x7307, (q15_t)0xc7dc, (q15_t)0x7305, (q15_t)0xc7d6, (q15_t)0x7302, (q15_t)0xc7d1, (q15_t)0x72ff, (q15_t)0xc7cb, + (q15_t)0x72fc, (q15_t)0xc7c5, (q15_t)0x72f9, (q15_t)0xc7c0, (q15_t)0x72f7, (q15_t)0xc7ba, (q15_t)0x72f4, (q15_t)0xc7b4, + (q15_t)0x72f1, (q15_t)0xc7af, (q15_t)0x72ee, (q15_t)0xc7a9, (q15_t)0x72ec, (q15_t)0xc7a3, (q15_t)0x72e9, (q15_t)0xc79e, + (q15_t)0x72e6, (q15_t)0xc798, (q15_t)0x72e3, (q15_t)0xc793, (q15_t)0x72e1, (q15_t)0xc78d, (q15_t)0x72de, (q15_t)0xc787, + (q15_t)0x72db, (q15_t)0xc782, (q15_t)0x72d8, (q15_t)0xc77c, (q15_t)0x72d5, (q15_t)0xc776, (q15_t)0x72d3, (q15_t)0xc771, + (q15_t)0x72d0, (q15_t)0xc76b, (q15_t)0x72cd, (q15_t)0xc765, (q15_t)0x72ca, (q15_t)0xc760, (q15_t)0x72c8, (q15_t)0xc75a, + (q15_t)0x72c5, (q15_t)0xc755, (q15_t)0x72c2, (q15_t)0xc74f, (q15_t)0x72bf, (q15_t)0xc749, (q15_t)0x72bc, (q15_t)0xc744, + (q15_t)0x72ba, (q15_t)0xc73e, (q15_t)0x72b7, (q15_t)0xc738, (q15_t)0x72b4, (q15_t)0xc733, (q15_t)0x72b1, (q15_t)0xc72d, + (q15_t)0x72af, (q15_t)0xc728, (q15_t)0x72ac, (q15_t)0xc722, (q15_t)0x72a9, (q15_t)0xc71c, (q15_t)0x72a6, (q15_t)0xc717, + (q15_t)0x72a3, (q15_t)0xc711, (q15_t)0x72a1, (q15_t)0xc70b, (q15_t)0x729e, (q15_t)0xc706, (q15_t)0x729b, (q15_t)0xc700, + (q15_t)0x7298, (q15_t)0xc6fa, (q15_t)0x7295, (q15_t)0xc6f5, (q15_t)0x7293, (q15_t)0xc6ef, (q15_t)0x7290, (q15_t)0xc6ea, + (q15_t)0x728d, (q15_t)0xc6e4, (q15_t)0x728a, (q15_t)0xc6de, (q15_t)0x7287, (q15_t)0xc6d9, (q15_t)0x7285, (q15_t)0xc6d3, + (q15_t)0x7282, (q15_t)0xc6ce, (q15_t)0x727f, (q15_t)0xc6c8, (q15_t)0x727c, (q15_t)0xc6c2, (q15_t)0x7279, (q15_t)0xc6bd, + (q15_t)0x7276, (q15_t)0xc6b7, (q15_t)0x7274, (q15_t)0xc6b1, (q15_t)0x7271, (q15_t)0xc6ac, (q15_t)0x726e, (q15_t)0xc6a6, + (q15_t)0x726b, (q15_t)0xc6a1, (q15_t)0x7268, (q15_t)0xc69b, (q15_t)0x7266, (q15_t)0xc695, (q15_t)0x7263, (q15_t)0xc690, + (q15_t)0x7260, (q15_t)0xc68a, (q15_t)0x725d, (q15_t)0xc684, (q15_t)0x725a, (q15_t)0xc67f, (q15_t)0x7257, (q15_t)0xc679, + (q15_t)0x7255, (q15_t)0xc674, (q15_t)0x7252, (q15_t)0xc66e, (q15_t)0x724f, (q15_t)0xc668, (q15_t)0x724c, (q15_t)0xc663, + (q15_t)0x7249, (q15_t)0xc65d, (q15_t)0x7247, (q15_t)0xc658, (q15_t)0x7244, (q15_t)0xc652, (q15_t)0x7241, (q15_t)0xc64c, + (q15_t)0x723e, (q15_t)0xc647, (q15_t)0x723b, (q15_t)0xc641, (q15_t)0x7238, (q15_t)0xc63c, (q15_t)0x7236, (q15_t)0xc636, + (q15_t)0x7233, (q15_t)0xc630, (q15_t)0x7230, (q15_t)0xc62b, (q15_t)0x722d, (q15_t)0xc625, (q15_t)0x722a, (q15_t)0xc620, + (q15_t)0x7227, (q15_t)0xc61a, (q15_t)0x7224, (q15_t)0xc614, (q15_t)0x7222, (q15_t)0xc60f, (q15_t)0x721f, (q15_t)0xc609, + (q15_t)0x721c, (q15_t)0xc603, (q15_t)0x7219, (q15_t)0xc5fe, (q15_t)0x7216, (q15_t)0xc5f8, (q15_t)0x7213, (q15_t)0xc5f3, + (q15_t)0x7211, (q15_t)0xc5ed, (q15_t)0x720e, (q15_t)0xc5e7, (q15_t)0x720b, (q15_t)0xc5e2, (q15_t)0x7208, (q15_t)0xc5dc, + (q15_t)0x7205, (q15_t)0xc5d7, (q15_t)0x7202, (q15_t)0xc5d1, (q15_t)0x71ff, (q15_t)0xc5cc, (q15_t)0x71fd, (q15_t)0xc5c6, + (q15_t)0x71fa, (q15_t)0xc5c0, (q15_t)0x71f7, (q15_t)0xc5bb, (q15_t)0x71f4, (q15_t)0xc5b5, (q15_t)0x71f1, (q15_t)0xc5b0, + (q15_t)0x71ee, (q15_t)0xc5aa, (q15_t)0x71eb, (q15_t)0xc5a4, (q15_t)0x71e9, (q15_t)0xc59f, (q15_t)0x71e6, (q15_t)0xc599, + (q15_t)0x71e3, (q15_t)0xc594, (q15_t)0x71e0, (q15_t)0xc58e, (q15_t)0x71dd, (q15_t)0xc588, (q15_t)0x71da, (q15_t)0xc583, + (q15_t)0x71d7, (q15_t)0xc57d, (q15_t)0x71d4, (q15_t)0xc578, (q15_t)0x71d2, (q15_t)0xc572, (q15_t)0x71cf, (q15_t)0xc56c, + (q15_t)0x71cc, (q15_t)0xc567, (q15_t)0x71c9, (q15_t)0xc561, (q15_t)0x71c6, (q15_t)0xc55c, (q15_t)0x71c3, (q15_t)0xc556, + (q15_t)0x71c0, (q15_t)0xc551, (q15_t)0x71bd, (q15_t)0xc54b, (q15_t)0x71bb, (q15_t)0xc545, (q15_t)0x71b8, (q15_t)0xc540, + (q15_t)0x71b5, (q15_t)0xc53a, (q15_t)0x71b2, (q15_t)0xc535, (q15_t)0x71af, (q15_t)0xc52f, (q15_t)0x71ac, (q15_t)0xc529, + (q15_t)0x71a9, (q15_t)0xc524, (q15_t)0x71a6, (q15_t)0xc51e, (q15_t)0x71a3, (q15_t)0xc519, (q15_t)0x71a1, (q15_t)0xc513, + (q15_t)0x719e, (q15_t)0xc50e, (q15_t)0x719b, (q15_t)0xc508, (q15_t)0x7198, (q15_t)0xc502, (q15_t)0x7195, (q15_t)0xc4fd, + (q15_t)0x7192, (q15_t)0xc4f7, (q15_t)0x718f, (q15_t)0xc4f2, (q15_t)0x718c, (q15_t)0xc4ec, (q15_t)0x7189, (q15_t)0xc4e7, + (q15_t)0x7186, (q15_t)0xc4e1, (q15_t)0x7184, (q15_t)0xc4db, (q15_t)0x7181, (q15_t)0xc4d6, (q15_t)0x717e, (q15_t)0xc4d0, + (q15_t)0x717b, (q15_t)0xc4cb, (q15_t)0x7178, (q15_t)0xc4c5, (q15_t)0x7175, (q15_t)0xc4c0, (q15_t)0x7172, (q15_t)0xc4ba, + (q15_t)0x716f, (q15_t)0xc4b4, (q15_t)0x716c, (q15_t)0xc4af, (q15_t)0x7169, (q15_t)0xc4a9, (q15_t)0x7167, (q15_t)0xc4a4, + (q15_t)0x7164, (q15_t)0xc49e, (q15_t)0x7161, (q15_t)0xc499, (q15_t)0x715e, (q15_t)0xc493, (q15_t)0x715b, (q15_t)0xc48d, + (q15_t)0x7158, (q15_t)0xc488, (q15_t)0x7155, (q15_t)0xc482, (q15_t)0x7152, (q15_t)0xc47d, (q15_t)0x714f, (q15_t)0xc477, + (q15_t)0x714c, (q15_t)0xc472, (q15_t)0x7149, (q15_t)0xc46c, (q15_t)0x7146, (q15_t)0xc467, (q15_t)0x7143, (q15_t)0xc461, + (q15_t)0x7141, (q15_t)0xc45b, (q15_t)0x713e, (q15_t)0xc456, (q15_t)0x713b, (q15_t)0xc450, (q15_t)0x7138, (q15_t)0xc44b, + (q15_t)0x7135, (q15_t)0xc445, (q15_t)0x7132, (q15_t)0xc440, (q15_t)0x712f, (q15_t)0xc43a, (q15_t)0x712c, (q15_t)0xc434, + (q15_t)0x7129, (q15_t)0xc42f, (q15_t)0x7126, (q15_t)0xc429, (q15_t)0x7123, (q15_t)0xc424, (q15_t)0x7120, (q15_t)0xc41e, + (q15_t)0x711d, (q15_t)0xc419, (q15_t)0x711a, (q15_t)0xc413, (q15_t)0x7117, (q15_t)0xc40e, (q15_t)0x7114, (q15_t)0xc408, + (q15_t)0x7112, (q15_t)0xc403, (q15_t)0x710f, (q15_t)0xc3fd, (q15_t)0x710c, (q15_t)0xc3f7, (q15_t)0x7109, (q15_t)0xc3f2, + (q15_t)0x7106, (q15_t)0xc3ec, (q15_t)0x7103, (q15_t)0xc3e7, (q15_t)0x7100, (q15_t)0xc3e1, (q15_t)0x70fd, (q15_t)0xc3dc, + (q15_t)0x70fa, (q15_t)0xc3d6, (q15_t)0x70f7, (q15_t)0xc3d1, (q15_t)0x70f4, (q15_t)0xc3cb, (q15_t)0x70f1, (q15_t)0xc3c5, + (q15_t)0x70ee, (q15_t)0xc3c0, (q15_t)0x70eb, (q15_t)0xc3ba, (q15_t)0x70e8, (q15_t)0xc3b5, (q15_t)0x70e5, (q15_t)0xc3af, + (q15_t)0x70e2, (q15_t)0xc3aa, (q15_t)0x70df, (q15_t)0xc3a4, (q15_t)0x70dc, (q15_t)0xc39f, (q15_t)0x70d9, (q15_t)0xc399, + (q15_t)0x70d6, (q15_t)0xc394, (q15_t)0x70d3, (q15_t)0xc38e, (q15_t)0x70d1, (q15_t)0xc389, (q15_t)0x70ce, (q15_t)0xc383, + (q15_t)0x70cb, (q15_t)0xc37d, (q15_t)0x70c8, (q15_t)0xc378, (q15_t)0x70c5, (q15_t)0xc372, (q15_t)0x70c2, (q15_t)0xc36d, + (q15_t)0x70bf, (q15_t)0xc367, (q15_t)0x70bc, (q15_t)0xc362, (q15_t)0x70b9, (q15_t)0xc35c, (q15_t)0x70b6, (q15_t)0xc357, + (q15_t)0x70b3, (q15_t)0xc351, (q15_t)0x70b0, (q15_t)0xc34c, (q15_t)0x70ad, (q15_t)0xc346, (q15_t)0x70aa, (q15_t)0xc341, + (q15_t)0x70a7, (q15_t)0xc33b, (q15_t)0x70a4, (q15_t)0xc336, (q15_t)0x70a1, (q15_t)0xc330, (q15_t)0x709e, (q15_t)0xc32a, + (q15_t)0x709b, (q15_t)0xc325, (q15_t)0x7098, (q15_t)0xc31f, (q15_t)0x7095, (q15_t)0xc31a, (q15_t)0x7092, (q15_t)0xc314, + (q15_t)0x708f, (q15_t)0xc30f, (q15_t)0x708c, (q15_t)0xc309, (q15_t)0x7089, (q15_t)0xc304, (q15_t)0x7086, (q15_t)0xc2fe, + (q15_t)0x7083, (q15_t)0xc2f9, (q15_t)0x7080, (q15_t)0xc2f3, (q15_t)0x707d, (q15_t)0xc2ee, (q15_t)0x707a, (q15_t)0xc2e8, + (q15_t)0x7077, (q15_t)0xc2e3, (q15_t)0x7074, (q15_t)0xc2dd, (q15_t)0x7071, (q15_t)0xc2d8, (q15_t)0x706e, (q15_t)0xc2d2, + (q15_t)0x706b, (q15_t)0xc2cd, (q15_t)0x7068, (q15_t)0xc2c7, (q15_t)0x7065, (q15_t)0xc2c2, (q15_t)0x7062, (q15_t)0xc2bc, + (q15_t)0x705f, (q15_t)0xc2b7, (q15_t)0x705c, (q15_t)0xc2b1, (q15_t)0x7059, (q15_t)0xc2ab, (q15_t)0x7056, (q15_t)0xc2a6, + (q15_t)0x7053, (q15_t)0xc2a0, (q15_t)0x7050, (q15_t)0xc29b, (q15_t)0x704d, (q15_t)0xc295, (q15_t)0x704a, (q15_t)0xc290, + (q15_t)0x7047, (q15_t)0xc28a, (q15_t)0x7044, (q15_t)0xc285, (q15_t)0x7041, (q15_t)0xc27f, (q15_t)0x703e, (q15_t)0xc27a, + (q15_t)0x703b, (q15_t)0xc274, (q15_t)0x7038, (q15_t)0xc26f, (q15_t)0x7035, (q15_t)0xc269, (q15_t)0x7032, (q15_t)0xc264, + (q15_t)0x702f, (q15_t)0xc25e, (q15_t)0x702c, (q15_t)0xc259, (q15_t)0x7029, (q15_t)0xc253, (q15_t)0x7026, (q15_t)0xc24e, + (q15_t)0x7023, (q15_t)0xc248, (q15_t)0x7020, (q15_t)0xc243, (q15_t)0x701d, (q15_t)0xc23d, (q15_t)0x7019, (q15_t)0xc238, + (q15_t)0x7016, (q15_t)0xc232, (q15_t)0x7013, (q15_t)0xc22d, (q15_t)0x7010, (q15_t)0xc227, (q15_t)0x700d, (q15_t)0xc222, + (q15_t)0x700a, (q15_t)0xc21c, (q15_t)0x7007, (q15_t)0xc217, (q15_t)0x7004, (q15_t)0xc211, (q15_t)0x7001, (q15_t)0xc20c, + (q15_t)0x6ffe, (q15_t)0xc206, (q15_t)0x6ffb, (q15_t)0xc201, (q15_t)0x6ff8, (q15_t)0xc1fb, (q15_t)0x6ff5, (q15_t)0xc1f6, + (q15_t)0x6ff2, (q15_t)0xc1f0, (q15_t)0x6fef, (q15_t)0xc1eb, (q15_t)0x6fec, (q15_t)0xc1e5, (q15_t)0x6fe9, (q15_t)0xc1e0, + (q15_t)0x6fe6, (q15_t)0xc1da, (q15_t)0x6fe3, (q15_t)0xc1d5, (q15_t)0x6fe0, (q15_t)0xc1cf, (q15_t)0x6fdd, (q15_t)0xc1ca, + (q15_t)0x6fda, (q15_t)0xc1c4, (q15_t)0x6fd6, (q15_t)0xc1bf, (q15_t)0x6fd3, (q15_t)0xc1b9, (q15_t)0x6fd0, (q15_t)0xc1b4, + (q15_t)0x6fcd, (q15_t)0xc1ae, (q15_t)0x6fca, (q15_t)0xc1a9, (q15_t)0x6fc7, (q15_t)0xc1a3, (q15_t)0x6fc4, (q15_t)0xc19e, + (q15_t)0x6fc1, (q15_t)0xc198, (q15_t)0x6fbe, (q15_t)0xc193, (q15_t)0x6fbb, (q15_t)0xc18d, (q15_t)0x6fb8, (q15_t)0xc188, + (q15_t)0x6fb5, (q15_t)0xc183, (q15_t)0x6fb2, (q15_t)0xc17d, (q15_t)0x6faf, (q15_t)0xc178, (q15_t)0x6fac, (q15_t)0xc172, + (q15_t)0x6fa9, (q15_t)0xc16d, (q15_t)0x6fa5, (q15_t)0xc167, (q15_t)0x6fa2, (q15_t)0xc162, (q15_t)0x6f9f, (q15_t)0xc15c, + (q15_t)0x6f9c, (q15_t)0xc157, (q15_t)0x6f99, (q15_t)0xc151, (q15_t)0x6f96, (q15_t)0xc14c, (q15_t)0x6f93, (q15_t)0xc146, + (q15_t)0x6f90, (q15_t)0xc141, (q15_t)0x6f8d, (q15_t)0xc13b, (q15_t)0x6f8a, (q15_t)0xc136, (q15_t)0x6f87, (q15_t)0xc130, + (q15_t)0x6f84, (q15_t)0xc12b, (q15_t)0x6f81, (q15_t)0xc125, (q15_t)0x6f7d, (q15_t)0xc120, (q15_t)0x6f7a, (q15_t)0xc11a, + (q15_t)0x6f77, (q15_t)0xc115, (q15_t)0x6f74, (q15_t)0xc10f, (q15_t)0x6f71, (q15_t)0xc10a, (q15_t)0x6f6e, (q15_t)0xc105, + (q15_t)0x6f6b, (q15_t)0xc0ff, (q15_t)0x6f68, (q15_t)0xc0fa, (q15_t)0x6f65, (q15_t)0xc0f4, (q15_t)0x6f62, (q15_t)0xc0ef, + (q15_t)0x6f5f, (q15_t)0xc0e9, (q15_t)0x6f5b, (q15_t)0xc0e4, (q15_t)0x6f58, (q15_t)0xc0de, (q15_t)0x6f55, (q15_t)0xc0d9, + (q15_t)0x6f52, (q15_t)0xc0d3, (q15_t)0x6f4f, (q15_t)0xc0ce, (q15_t)0x6f4c, (q15_t)0xc0c8, (q15_t)0x6f49, (q15_t)0xc0c3, + (q15_t)0x6f46, (q15_t)0xc0bd, (q15_t)0x6f43, (q15_t)0xc0b8, (q15_t)0x6f3f, (q15_t)0xc0b3, (q15_t)0x6f3c, (q15_t)0xc0ad, + (q15_t)0x6f39, (q15_t)0xc0a8, (q15_t)0x6f36, (q15_t)0xc0a2, (q15_t)0x6f33, (q15_t)0xc09d, (q15_t)0x6f30, (q15_t)0xc097, + (q15_t)0x6f2d, (q15_t)0xc092, (q15_t)0x6f2a, (q15_t)0xc08c, (q15_t)0x6f27, (q15_t)0xc087, (q15_t)0x6f23, (q15_t)0xc081, + (q15_t)0x6f20, (q15_t)0xc07c, (q15_t)0x6f1d, (q15_t)0xc077, (q15_t)0x6f1a, (q15_t)0xc071, (q15_t)0x6f17, (q15_t)0xc06c, + (q15_t)0x6f14, (q15_t)0xc066, (q15_t)0x6f11, (q15_t)0xc061, (q15_t)0x6f0e, (q15_t)0xc05b, (q15_t)0x6f0b, (q15_t)0xc056, + (q15_t)0x6f07, (q15_t)0xc050, (q15_t)0x6f04, (q15_t)0xc04b, (q15_t)0x6f01, (q15_t)0xc045, (q15_t)0x6efe, (q15_t)0xc040, + (q15_t)0x6efb, (q15_t)0xc03b, (q15_t)0x6ef8, (q15_t)0xc035, (q15_t)0x6ef5, (q15_t)0xc030, (q15_t)0x6ef1, (q15_t)0xc02a, + (q15_t)0x6eee, (q15_t)0xc025, (q15_t)0x6eeb, (q15_t)0xc01f, (q15_t)0x6ee8, (q15_t)0xc01a, (q15_t)0x6ee5, (q15_t)0xc014, + (q15_t)0x6ee2, (q15_t)0xc00f, (q15_t)0x6edf, (q15_t)0xc00a, (q15_t)0x6edc, (q15_t)0xc004, (q15_t)0x6ed8, (q15_t)0xbfff, + (q15_t)0x6ed5, (q15_t)0xbff9, (q15_t)0x6ed2, (q15_t)0xbff4, (q15_t)0x6ecf, (q15_t)0xbfee, (q15_t)0x6ecc, (q15_t)0xbfe9, + (q15_t)0x6ec9, (q15_t)0xbfe3, (q15_t)0x6ec6, (q15_t)0xbfde, (q15_t)0x6ec2, (q15_t)0xbfd9, (q15_t)0x6ebf, (q15_t)0xbfd3, + (q15_t)0x6ebc, (q15_t)0xbfce, (q15_t)0x6eb9, (q15_t)0xbfc8, (q15_t)0x6eb6, (q15_t)0xbfc3, (q15_t)0x6eb3, (q15_t)0xbfbd, + (q15_t)0x6eaf, (q15_t)0xbfb8, (q15_t)0x6eac, (q15_t)0xbfb3, (q15_t)0x6ea9, (q15_t)0xbfad, (q15_t)0x6ea6, (q15_t)0xbfa8, + (q15_t)0x6ea3, (q15_t)0xbfa2, (q15_t)0x6ea0, (q15_t)0xbf9d, (q15_t)0x6e9c, (q15_t)0xbf97, (q15_t)0x6e99, (q15_t)0xbf92, + (q15_t)0x6e96, (q15_t)0xbf8d, (q15_t)0x6e93, (q15_t)0xbf87, (q15_t)0x6e90, (q15_t)0xbf82, (q15_t)0x6e8d, (q15_t)0xbf7c, + (q15_t)0x6e89, (q15_t)0xbf77, (q15_t)0x6e86, (q15_t)0xbf71, (q15_t)0x6e83, (q15_t)0xbf6c, (q15_t)0x6e80, (q15_t)0xbf67, + (q15_t)0x6e7d, (q15_t)0xbf61, (q15_t)0x6e7a, (q15_t)0xbf5c, (q15_t)0x6e76, (q15_t)0xbf56, (q15_t)0x6e73, (q15_t)0xbf51, + (q15_t)0x6e70, (q15_t)0xbf4b, (q15_t)0x6e6d, (q15_t)0xbf46, (q15_t)0x6e6a, (q15_t)0xbf41, (q15_t)0x6e67, (q15_t)0xbf3b, + (q15_t)0x6e63, (q15_t)0xbf36, (q15_t)0x6e60, (q15_t)0xbf30, (q15_t)0x6e5d, (q15_t)0xbf2b, (q15_t)0x6e5a, (q15_t)0xbf26, + (q15_t)0x6e57, (q15_t)0xbf20, (q15_t)0x6e53, (q15_t)0xbf1b, (q15_t)0x6e50, (q15_t)0xbf15, (q15_t)0x6e4d, (q15_t)0xbf10, + (q15_t)0x6e4a, (q15_t)0xbf0a, (q15_t)0x6e47, (q15_t)0xbf05, (q15_t)0x6e44, (q15_t)0xbf00, (q15_t)0x6e40, (q15_t)0xbefa, + (q15_t)0x6e3d, (q15_t)0xbef5, (q15_t)0x6e3a, (q15_t)0xbeef, (q15_t)0x6e37, (q15_t)0xbeea, (q15_t)0x6e34, (q15_t)0xbee5, + (q15_t)0x6e30, (q15_t)0xbedf, (q15_t)0x6e2d, (q15_t)0xbeda, (q15_t)0x6e2a, (q15_t)0xbed4, (q15_t)0x6e27, (q15_t)0xbecf, + (q15_t)0x6e24, (q15_t)0xbeca, (q15_t)0x6e20, (q15_t)0xbec4, (q15_t)0x6e1d, (q15_t)0xbebf, (q15_t)0x6e1a, (q15_t)0xbeb9, + (q15_t)0x6e17, (q15_t)0xbeb4, (q15_t)0x6e14, (q15_t)0xbeae, (q15_t)0x6e10, (q15_t)0xbea9, (q15_t)0x6e0d, (q15_t)0xbea4, + (q15_t)0x6e0a, (q15_t)0xbe9e, (q15_t)0x6e07, (q15_t)0xbe99, (q15_t)0x6e04, (q15_t)0xbe93, (q15_t)0x6e00, (q15_t)0xbe8e, + (q15_t)0x6dfd, (q15_t)0xbe89, (q15_t)0x6dfa, (q15_t)0xbe83, (q15_t)0x6df7, (q15_t)0xbe7e, (q15_t)0x6df3, (q15_t)0xbe78, + (q15_t)0x6df0, (q15_t)0xbe73, (q15_t)0x6ded, (q15_t)0xbe6e, (q15_t)0x6dea, (q15_t)0xbe68, (q15_t)0x6de7, (q15_t)0xbe63, + (q15_t)0x6de3, (q15_t)0xbe5e, (q15_t)0x6de0, (q15_t)0xbe58, (q15_t)0x6ddd, (q15_t)0xbe53, (q15_t)0x6dda, (q15_t)0xbe4d, + (q15_t)0x6dd6, (q15_t)0xbe48, (q15_t)0x6dd3, (q15_t)0xbe43, (q15_t)0x6dd0, (q15_t)0xbe3d, (q15_t)0x6dcd, (q15_t)0xbe38, + (q15_t)0x6dca, (q15_t)0xbe32, (q15_t)0x6dc6, (q15_t)0xbe2d, (q15_t)0x6dc3, (q15_t)0xbe28, (q15_t)0x6dc0, (q15_t)0xbe22, + (q15_t)0x6dbd, (q15_t)0xbe1d, (q15_t)0x6db9, (q15_t)0xbe17, (q15_t)0x6db6, (q15_t)0xbe12, (q15_t)0x6db3, (q15_t)0xbe0d, + (q15_t)0x6db0, (q15_t)0xbe07, (q15_t)0x6dac, (q15_t)0xbe02, (q15_t)0x6da9, (q15_t)0xbdfd, (q15_t)0x6da6, (q15_t)0xbdf7, + (q15_t)0x6da3, (q15_t)0xbdf2, (q15_t)0x6d9f, (q15_t)0xbdec, (q15_t)0x6d9c, (q15_t)0xbde7, (q15_t)0x6d99, (q15_t)0xbde2, + (q15_t)0x6d96, (q15_t)0xbddc, (q15_t)0x6d92, (q15_t)0xbdd7, (q15_t)0x6d8f, (q15_t)0xbdd1, (q15_t)0x6d8c, (q15_t)0xbdcc, + (q15_t)0x6d89, (q15_t)0xbdc7, (q15_t)0x6d85, (q15_t)0xbdc1, (q15_t)0x6d82, (q15_t)0xbdbc, (q15_t)0x6d7f, (q15_t)0xbdb7, + (q15_t)0x6d7c, (q15_t)0xbdb1, (q15_t)0x6d78, (q15_t)0xbdac, (q15_t)0x6d75, (q15_t)0xbda6, (q15_t)0x6d72, (q15_t)0xbda1, + (q15_t)0x6d6f, (q15_t)0xbd9c, (q15_t)0x6d6b, (q15_t)0xbd96, (q15_t)0x6d68, (q15_t)0xbd91, (q15_t)0x6d65, (q15_t)0xbd8c, + (q15_t)0x6d62, (q15_t)0xbd86, (q15_t)0x6d5e, (q15_t)0xbd81, (q15_t)0x6d5b, (q15_t)0xbd7c, (q15_t)0x6d58, (q15_t)0xbd76, + (q15_t)0x6d55, (q15_t)0xbd71, (q15_t)0x6d51, (q15_t)0xbd6b, (q15_t)0x6d4e, (q15_t)0xbd66, (q15_t)0x6d4b, (q15_t)0xbd61, + (q15_t)0x6d48, (q15_t)0xbd5b, (q15_t)0x6d44, (q15_t)0xbd56, (q15_t)0x6d41, (q15_t)0xbd51, (q15_t)0x6d3e, (q15_t)0xbd4b, + (q15_t)0x6d3a, (q15_t)0xbd46, (q15_t)0x6d37, (q15_t)0xbd40, (q15_t)0x6d34, (q15_t)0xbd3b, (q15_t)0x6d31, (q15_t)0xbd36, + (q15_t)0x6d2d, (q15_t)0xbd30, (q15_t)0x6d2a, (q15_t)0xbd2b, (q15_t)0x6d27, (q15_t)0xbd26, (q15_t)0x6d23, (q15_t)0xbd20, + (q15_t)0x6d20, (q15_t)0xbd1b, (q15_t)0x6d1d, (q15_t)0xbd16, (q15_t)0x6d1a, (q15_t)0xbd10, (q15_t)0x6d16, (q15_t)0xbd0b, + (q15_t)0x6d13, (q15_t)0xbd06, (q15_t)0x6d10, (q15_t)0xbd00, (q15_t)0x6d0c, (q15_t)0xbcfb, (q15_t)0x6d09, (q15_t)0xbcf5, + (q15_t)0x6d06, (q15_t)0xbcf0, (q15_t)0x6d03, (q15_t)0xbceb, (q15_t)0x6cff, (q15_t)0xbce5, (q15_t)0x6cfc, (q15_t)0xbce0, + (q15_t)0x6cf9, (q15_t)0xbcdb, (q15_t)0x6cf5, (q15_t)0xbcd5, (q15_t)0x6cf2, (q15_t)0xbcd0, (q15_t)0x6cef, (q15_t)0xbccb, + (q15_t)0x6cec, (q15_t)0xbcc5, (q15_t)0x6ce8, (q15_t)0xbcc0, (q15_t)0x6ce5, (q15_t)0xbcbb, (q15_t)0x6ce2, (q15_t)0xbcb5, + (q15_t)0x6cde, (q15_t)0xbcb0, (q15_t)0x6cdb, (q15_t)0xbcab, (q15_t)0x6cd8, (q15_t)0xbca5, (q15_t)0x6cd4, (q15_t)0xbca0, + (q15_t)0x6cd1, (q15_t)0xbc9b, (q15_t)0x6cce, (q15_t)0xbc95, (q15_t)0x6cca, (q15_t)0xbc90, (q15_t)0x6cc7, (q15_t)0xbc8b, + (q15_t)0x6cc4, (q15_t)0xbc85, (q15_t)0x6cc1, (q15_t)0xbc80, (q15_t)0x6cbd, (q15_t)0xbc7b, (q15_t)0x6cba, (q15_t)0xbc75, + (q15_t)0x6cb7, (q15_t)0xbc70, (q15_t)0x6cb3, (q15_t)0xbc6b, (q15_t)0x6cb0, (q15_t)0xbc65, (q15_t)0x6cad, (q15_t)0xbc60, + (q15_t)0x6ca9, (q15_t)0xbc5b, (q15_t)0x6ca6, (q15_t)0xbc55, (q15_t)0x6ca3, (q15_t)0xbc50, (q15_t)0x6c9f, (q15_t)0xbc4b, + (q15_t)0x6c9c, (q15_t)0xbc45, (q15_t)0x6c99, (q15_t)0xbc40, (q15_t)0x6c95, (q15_t)0xbc3b, (q15_t)0x6c92, (q15_t)0xbc35, + (q15_t)0x6c8f, (q15_t)0xbc30, (q15_t)0x6c8b, (q15_t)0xbc2b, (q15_t)0x6c88, (q15_t)0xbc25, (q15_t)0x6c85, (q15_t)0xbc20, + (q15_t)0x6c81, (q15_t)0xbc1b, (q15_t)0x6c7e, (q15_t)0xbc15, (q15_t)0x6c7b, (q15_t)0xbc10, (q15_t)0x6c77, (q15_t)0xbc0b, + (q15_t)0x6c74, (q15_t)0xbc05, (q15_t)0x6c71, (q15_t)0xbc00, (q15_t)0x6c6d, (q15_t)0xbbfb, (q15_t)0x6c6a, (q15_t)0xbbf5, + (q15_t)0x6c67, (q15_t)0xbbf0, (q15_t)0x6c63, (q15_t)0xbbeb, (q15_t)0x6c60, (q15_t)0xbbe5, (q15_t)0x6c5d, (q15_t)0xbbe0, + (q15_t)0x6c59, (q15_t)0xbbdb, (q15_t)0x6c56, (q15_t)0xbbd5, (q15_t)0x6c53, (q15_t)0xbbd0, (q15_t)0x6c4f, (q15_t)0xbbcb, + (q15_t)0x6c4c, (q15_t)0xbbc5, (q15_t)0x6c49, (q15_t)0xbbc0, (q15_t)0x6c45, (q15_t)0xbbbb, (q15_t)0x6c42, (q15_t)0xbbb5, + (q15_t)0x6c3f, (q15_t)0xbbb0, (q15_t)0x6c3b, (q15_t)0xbbab, (q15_t)0x6c38, (q15_t)0xbba6, (q15_t)0x6c34, (q15_t)0xbba0, + (q15_t)0x6c31, (q15_t)0xbb9b, (q15_t)0x6c2e, (q15_t)0xbb96, (q15_t)0x6c2a, (q15_t)0xbb90, (q15_t)0x6c27, (q15_t)0xbb8b, + (q15_t)0x6c24, (q15_t)0xbb86, (q15_t)0x6c20, (q15_t)0xbb80, (q15_t)0x6c1d, (q15_t)0xbb7b, (q15_t)0x6c1a, (q15_t)0xbb76, + (q15_t)0x6c16, (q15_t)0xbb70, (q15_t)0x6c13, (q15_t)0xbb6b, (q15_t)0x6c0f, (q15_t)0xbb66, (q15_t)0x6c0c, (q15_t)0xbb61, + (q15_t)0x6c09, (q15_t)0xbb5b, (q15_t)0x6c05, (q15_t)0xbb56, (q15_t)0x6c02, (q15_t)0xbb51, (q15_t)0x6bff, (q15_t)0xbb4b, + (q15_t)0x6bfb, (q15_t)0xbb46, (q15_t)0x6bf8, (q15_t)0xbb41, (q15_t)0x6bf5, (q15_t)0xbb3b, (q15_t)0x6bf1, (q15_t)0xbb36, + (q15_t)0x6bee, (q15_t)0xbb31, (q15_t)0x6bea, (q15_t)0xbb2c, (q15_t)0x6be7, (q15_t)0xbb26, (q15_t)0x6be4, (q15_t)0xbb21, + (q15_t)0x6be0, (q15_t)0xbb1c, (q15_t)0x6bdd, (q15_t)0xbb16, (q15_t)0x6bd9, (q15_t)0xbb11, (q15_t)0x6bd6, (q15_t)0xbb0c, + (q15_t)0x6bd3, (q15_t)0xbb06, (q15_t)0x6bcf, (q15_t)0xbb01, (q15_t)0x6bcc, (q15_t)0xbafc, (q15_t)0x6bc9, (q15_t)0xbaf7, + (q15_t)0x6bc5, (q15_t)0xbaf1, (q15_t)0x6bc2, (q15_t)0xbaec, (q15_t)0x6bbe, (q15_t)0xbae7, (q15_t)0x6bbb, (q15_t)0xbae1, + (q15_t)0x6bb8, (q15_t)0xbadc, (q15_t)0x6bb4, (q15_t)0xbad7, (q15_t)0x6bb1, (q15_t)0xbad2, (q15_t)0x6bad, (q15_t)0xbacc, + (q15_t)0x6baa, (q15_t)0xbac7, (q15_t)0x6ba7, (q15_t)0xbac2, (q15_t)0x6ba3, (q15_t)0xbabc, (q15_t)0x6ba0, (q15_t)0xbab7, + (q15_t)0x6b9c, (q15_t)0xbab2, (q15_t)0x6b99, (q15_t)0xbaad, (q15_t)0x6b96, (q15_t)0xbaa7, (q15_t)0x6b92, (q15_t)0xbaa2, + (q15_t)0x6b8f, (q15_t)0xba9d, (q15_t)0x6b8b, (q15_t)0xba97, (q15_t)0x6b88, (q15_t)0xba92, (q15_t)0x6b85, (q15_t)0xba8d, + (q15_t)0x6b81, (q15_t)0xba88, (q15_t)0x6b7e, (q15_t)0xba82, (q15_t)0x6b7a, (q15_t)0xba7d, (q15_t)0x6b77, (q15_t)0xba78, + (q15_t)0x6b73, (q15_t)0xba73, (q15_t)0x6b70, (q15_t)0xba6d, (q15_t)0x6b6d, (q15_t)0xba68, (q15_t)0x6b69, (q15_t)0xba63, + (q15_t)0x6b66, (q15_t)0xba5d, (q15_t)0x6b62, (q15_t)0xba58, (q15_t)0x6b5f, (q15_t)0xba53, (q15_t)0x6b5c, (q15_t)0xba4e, + (q15_t)0x6b58, (q15_t)0xba48, (q15_t)0x6b55, (q15_t)0xba43, (q15_t)0x6b51, (q15_t)0xba3e, (q15_t)0x6b4e, (q15_t)0xba39, + (q15_t)0x6b4a, (q15_t)0xba33, (q15_t)0x6b47, (q15_t)0xba2e, (q15_t)0x6b44, (q15_t)0xba29, (q15_t)0x6b40, (q15_t)0xba23, + (q15_t)0x6b3d, (q15_t)0xba1e, (q15_t)0x6b39, (q15_t)0xba19, (q15_t)0x6b36, (q15_t)0xba14, (q15_t)0x6b32, (q15_t)0xba0e, + (q15_t)0x6b2f, (q15_t)0xba09, (q15_t)0x6b2c, (q15_t)0xba04, (q15_t)0x6b28, (q15_t)0xb9ff, (q15_t)0x6b25, (q15_t)0xb9f9, + (q15_t)0x6b21, (q15_t)0xb9f4, (q15_t)0x6b1e, (q15_t)0xb9ef, (q15_t)0x6b1a, (q15_t)0xb9ea, (q15_t)0x6b17, (q15_t)0xb9e4, + (q15_t)0x6b13, (q15_t)0xb9df, (q15_t)0x6b10, (q15_t)0xb9da, (q15_t)0x6b0d, (q15_t)0xb9d5, (q15_t)0x6b09, (q15_t)0xb9cf, + (q15_t)0x6b06, (q15_t)0xb9ca, (q15_t)0x6b02, (q15_t)0xb9c5, (q15_t)0x6aff, (q15_t)0xb9c0, (q15_t)0x6afb, (q15_t)0xb9ba, + (q15_t)0x6af8, (q15_t)0xb9b5, (q15_t)0x6af4, (q15_t)0xb9b0, (q15_t)0x6af1, (q15_t)0xb9ab, (q15_t)0x6aee, (q15_t)0xb9a5, + (q15_t)0x6aea, (q15_t)0xb9a0, (q15_t)0x6ae7, (q15_t)0xb99b, (q15_t)0x6ae3, (q15_t)0xb996, (q15_t)0x6ae0, (q15_t)0xb990, + (q15_t)0x6adc, (q15_t)0xb98b, (q15_t)0x6ad9, (q15_t)0xb986, (q15_t)0x6ad5, (q15_t)0xb981, (q15_t)0x6ad2, (q15_t)0xb97b, + (q15_t)0x6ace, (q15_t)0xb976, (q15_t)0x6acb, (q15_t)0xb971, (q15_t)0x6ac8, (q15_t)0xb96c, (q15_t)0x6ac4, (q15_t)0xb966, + (q15_t)0x6ac1, (q15_t)0xb961, (q15_t)0x6abd, (q15_t)0xb95c, (q15_t)0x6aba, (q15_t)0xb957, (q15_t)0x6ab6, (q15_t)0xb951, + (q15_t)0x6ab3, (q15_t)0xb94c, (q15_t)0x6aaf, (q15_t)0xb947, (q15_t)0x6aac, (q15_t)0xb942, (q15_t)0x6aa8, (q15_t)0xb93c, + (q15_t)0x6aa5, (q15_t)0xb937, (q15_t)0x6aa1, (q15_t)0xb932, (q15_t)0x6a9e, (q15_t)0xb92d, (q15_t)0x6a9a, (q15_t)0xb928, + (q15_t)0x6a97, (q15_t)0xb922, (q15_t)0x6a93, (q15_t)0xb91d, (q15_t)0x6a90, (q15_t)0xb918, (q15_t)0x6a8c, (q15_t)0xb913, + (q15_t)0x6a89, (q15_t)0xb90d, (q15_t)0x6a86, (q15_t)0xb908, (q15_t)0x6a82, (q15_t)0xb903, (q15_t)0x6a7f, (q15_t)0xb8fe, + (q15_t)0x6a7b, (q15_t)0xb8f8, (q15_t)0x6a78, (q15_t)0xb8f3, (q15_t)0x6a74, (q15_t)0xb8ee, (q15_t)0x6a71, (q15_t)0xb8e9, + (q15_t)0x6a6d, (q15_t)0xb8e4, (q15_t)0x6a6a, (q15_t)0xb8de, (q15_t)0x6a66, (q15_t)0xb8d9, (q15_t)0x6a63, (q15_t)0xb8d4, + (q15_t)0x6a5f, (q15_t)0xb8cf, (q15_t)0x6a5c, (q15_t)0xb8c9, (q15_t)0x6a58, (q15_t)0xb8c4, (q15_t)0x6a55, (q15_t)0xb8bf, + (q15_t)0x6a51, (q15_t)0xb8ba, (q15_t)0x6a4e, (q15_t)0xb8b5, (q15_t)0x6a4a, (q15_t)0xb8af, (q15_t)0x6a47, (q15_t)0xb8aa, + (q15_t)0x6a43, (q15_t)0xb8a5, (q15_t)0x6a40, (q15_t)0xb8a0, (q15_t)0x6a3c, (q15_t)0xb89b, (q15_t)0x6a39, (q15_t)0xb895, + (q15_t)0x6a35, (q15_t)0xb890, (q15_t)0x6a32, (q15_t)0xb88b, (q15_t)0x6a2e, (q15_t)0xb886, (q15_t)0x6a2b, (q15_t)0xb880, + (q15_t)0x6a27, (q15_t)0xb87b, (q15_t)0x6a24, (q15_t)0xb876, (q15_t)0x6a20, (q15_t)0xb871, (q15_t)0x6a1d, (q15_t)0xb86c, + (q15_t)0x6a19, (q15_t)0xb866, (q15_t)0x6a16, (q15_t)0xb861, (q15_t)0x6a12, (q15_t)0xb85c, (q15_t)0x6a0e, (q15_t)0xb857, + (q15_t)0x6a0b, (q15_t)0xb852, (q15_t)0x6a07, (q15_t)0xb84c, (q15_t)0x6a04, (q15_t)0xb847, (q15_t)0x6a00, (q15_t)0xb842, + (q15_t)0x69fd, (q15_t)0xb83d, (q15_t)0x69f9, (q15_t)0xb838, (q15_t)0x69f6, (q15_t)0xb832, (q15_t)0x69f2, (q15_t)0xb82d, + (q15_t)0x69ef, (q15_t)0xb828, (q15_t)0x69eb, (q15_t)0xb823, (q15_t)0x69e8, (q15_t)0xb81e, (q15_t)0x69e4, (q15_t)0xb818, + (q15_t)0x69e1, (q15_t)0xb813, (q15_t)0x69dd, (q15_t)0xb80e, (q15_t)0x69da, (q15_t)0xb809, (q15_t)0x69d6, (q15_t)0xb804, + (q15_t)0x69d3, (q15_t)0xb7fe, (q15_t)0x69cf, (q15_t)0xb7f9, (q15_t)0x69cb, (q15_t)0xb7f4, (q15_t)0x69c8, (q15_t)0xb7ef, + (q15_t)0x69c4, (q15_t)0xb7ea, (q15_t)0x69c1, (q15_t)0xb7e4, (q15_t)0x69bd, (q15_t)0xb7df, (q15_t)0x69ba, (q15_t)0xb7da, + (q15_t)0x69b6, (q15_t)0xb7d5, (q15_t)0x69b3, (q15_t)0xb7d0, (q15_t)0x69af, (q15_t)0xb7ca, (q15_t)0x69ac, (q15_t)0xb7c5, + (q15_t)0x69a8, (q15_t)0xb7c0, (q15_t)0x69a5, (q15_t)0xb7bb, (q15_t)0x69a1, (q15_t)0xb7b6, (q15_t)0x699d, (q15_t)0xb7b1, + (q15_t)0x699a, (q15_t)0xb7ab, (q15_t)0x6996, (q15_t)0xb7a6, (q15_t)0x6993, (q15_t)0xb7a1, (q15_t)0x698f, (q15_t)0xb79c, + (q15_t)0x698c, (q15_t)0xb797, (q15_t)0x6988, (q15_t)0xb791, (q15_t)0x6985, (q15_t)0xb78c, (q15_t)0x6981, (q15_t)0xb787, + (q15_t)0x697d, (q15_t)0xb782, (q15_t)0x697a, (q15_t)0xb77d, (q15_t)0x6976, (q15_t)0xb778, (q15_t)0x6973, (q15_t)0xb772, + (q15_t)0x696f, (q15_t)0xb76d, (q15_t)0x696c, (q15_t)0xb768, (q15_t)0x6968, (q15_t)0xb763, (q15_t)0x6964, (q15_t)0xb75e, + (q15_t)0x6961, (q15_t)0xb758, (q15_t)0x695d, (q15_t)0xb753, (q15_t)0x695a, (q15_t)0xb74e, (q15_t)0x6956, (q15_t)0xb749, + (q15_t)0x6953, (q15_t)0xb744, (q15_t)0x694f, (q15_t)0xb73f, (q15_t)0x694b, (q15_t)0xb739, (q15_t)0x6948, (q15_t)0xb734, + (q15_t)0x6944, (q15_t)0xb72f, (q15_t)0x6941, (q15_t)0xb72a, (q15_t)0x693d, (q15_t)0xb725, (q15_t)0x693a, (q15_t)0xb720, + (q15_t)0x6936, (q15_t)0xb71a, (q15_t)0x6932, (q15_t)0xb715, (q15_t)0x692f, (q15_t)0xb710, (q15_t)0x692b, (q15_t)0xb70b, + (q15_t)0x6928, (q15_t)0xb706, (q15_t)0x6924, (q15_t)0xb701, (q15_t)0x6921, (q15_t)0xb6fb, (q15_t)0x691d, (q15_t)0xb6f6, + (q15_t)0x6919, (q15_t)0xb6f1, (q15_t)0x6916, (q15_t)0xb6ec, (q15_t)0x6912, (q15_t)0xb6e7, (q15_t)0x690f, (q15_t)0xb6e2, + (q15_t)0x690b, (q15_t)0xb6dd, (q15_t)0x6907, (q15_t)0xb6d7, (q15_t)0x6904, (q15_t)0xb6d2, (q15_t)0x6900, (q15_t)0xb6cd, + (q15_t)0x68fd, (q15_t)0xb6c8, (q15_t)0x68f9, (q15_t)0xb6c3, (q15_t)0x68f5, (q15_t)0xb6be, (q15_t)0x68f2, (q15_t)0xb6b8, + (q15_t)0x68ee, (q15_t)0xb6b3, (q15_t)0x68eb, (q15_t)0xb6ae, (q15_t)0x68e7, (q15_t)0xb6a9, (q15_t)0x68e3, (q15_t)0xb6a4, + (q15_t)0x68e0, (q15_t)0xb69f, (q15_t)0x68dc, (q15_t)0xb69a, (q15_t)0x68d9, (q15_t)0xb694, (q15_t)0x68d5, (q15_t)0xb68f, + (q15_t)0x68d1, (q15_t)0xb68a, (q15_t)0x68ce, (q15_t)0xb685, (q15_t)0x68ca, (q15_t)0xb680, (q15_t)0x68c7, (q15_t)0xb67b, + (q15_t)0x68c3, (q15_t)0xb676, (q15_t)0x68bf, (q15_t)0xb670, (q15_t)0x68bc, (q15_t)0xb66b, (q15_t)0x68b8, (q15_t)0xb666, + (q15_t)0x68b5, (q15_t)0xb661, (q15_t)0x68b1, (q15_t)0xb65c, (q15_t)0x68ad, (q15_t)0xb657, (q15_t)0x68aa, (q15_t)0xb652, + (q15_t)0x68a6, (q15_t)0xb64c, (q15_t)0x68a3, (q15_t)0xb647, (q15_t)0x689f, (q15_t)0xb642, (q15_t)0x689b, (q15_t)0xb63d, + (q15_t)0x6898, (q15_t)0xb638, (q15_t)0x6894, (q15_t)0xb633, (q15_t)0x6890, (q15_t)0xb62e, (q15_t)0x688d, (q15_t)0xb628, + (q15_t)0x6889, (q15_t)0xb623, (q15_t)0x6886, (q15_t)0xb61e, (q15_t)0x6882, (q15_t)0xb619, (q15_t)0x687e, (q15_t)0xb614, + (q15_t)0x687b, (q15_t)0xb60f, (q15_t)0x6877, (q15_t)0xb60a, (q15_t)0x6873, (q15_t)0xb605, (q15_t)0x6870, (q15_t)0xb5ff, + (q15_t)0x686c, (q15_t)0xb5fa, (q15_t)0x6868, (q15_t)0xb5f5, (q15_t)0x6865, (q15_t)0xb5f0, (q15_t)0x6861, (q15_t)0xb5eb, + (q15_t)0x685e, (q15_t)0xb5e6, (q15_t)0x685a, (q15_t)0xb5e1, (q15_t)0x6856, (q15_t)0xb5dc, (q15_t)0x6853, (q15_t)0xb5d6, + (q15_t)0x684f, (q15_t)0xb5d1, (q15_t)0x684b, (q15_t)0xb5cc, (q15_t)0x6848, (q15_t)0xb5c7, (q15_t)0x6844, (q15_t)0xb5c2, + (q15_t)0x6840, (q15_t)0xb5bd, (q15_t)0x683d, (q15_t)0xb5b8, (q15_t)0x6839, (q15_t)0xb5b3, (q15_t)0x6835, (q15_t)0xb5ae, + (q15_t)0x6832, (q15_t)0xb5a8, (q15_t)0x682e, (q15_t)0xb5a3, (q15_t)0x682b, (q15_t)0xb59e, (q15_t)0x6827, (q15_t)0xb599, + (q15_t)0x6823, (q15_t)0xb594, (q15_t)0x6820, (q15_t)0xb58f, (q15_t)0x681c, (q15_t)0xb58a, (q15_t)0x6818, (q15_t)0xb585, + (q15_t)0x6815, (q15_t)0xb57f, (q15_t)0x6811, (q15_t)0xb57a, (q15_t)0x680d, (q15_t)0xb575, (q15_t)0x680a, (q15_t)0xb570, + (q15_t)0x6806, (q15_t)0xb56b, (q15_t)0x6802, (q15_t)0xb566, (q15_t)0x67ff, (q15_t)0xb561, (q15_t)0x67fb, (q15_t)0xb55c, + (q15_t)0x67f7, (q15_t)0xb557, (q15_t)0x67f4, (q15_t)0xb552, (q15_t)0x67f0, (q15_t)0xb54c, (q15_t)0x67ec, (q15_t)0xb547, + (q15_t)0x67e9, (q15_t)0xb542, (q15_t)0x67e5, (q15_t)0xb53d, (q15_t)0x67e1, (q15_t)0xb538, (q15_t)0x67de, (q15_t)0xb533, + (q15_t)0x67da, (q15_t)0xb52e, (q15_t)0x67d6, (q15_t)0xb529, (q15_t)0x67d3, (q15_t)0xb524, (q15_t)0x67cf, (q15_t)0xb51f, + (q15_t)0x67cb, (q15_t)0xb519, (q15_t)0x67c8, (q15_t)0xb514, (q15_t)0x67c4, (q15_t)0xb50f, (q15_t)0x67c0, (q15_t)0xb50a, + (q15_t)0x67bd, (q15_t)0xb505, (q15_t)0x67b9, (q15_t)0xb500, (q15_t)0x67b5, (q15_t)0xb4fb, (q15_t)0x67b2, (q15_t)0xb4f6, + (q15_t)0x67ae, (q15_t)0xb4f1, (q15_t)0x67aa, (q15_t)0xb4ec, (q15_t)0x67a6, (q15_t)0xb4e7, (q15_t)0x67a3, (q15_t)0xb4e1, + (q15_t)0x679f, (q15_t)0xb4dc, (q15_t)0x679b, (q15_t)0xb4d7, (q15_t)0x6798, (q15_t)0xb4d2, (q15_t)0x6794, (q15_t)0xb4cd, + (q15_t)0x6790, (q15_t)0xb4c8, (q15_t)0x678d, (q15_t)0xb4c3, (q15_t)0x6789, (q15_t)0xb4be, (q15_t)0x6785, (q15_t)0xb4b9, + (q15_t)0x6782, (q15_t)0xb4b4, (q15_t)0x677e, (q15_t)0xb4af, (q15_t)0x677a, (q15_t)0xb4aa, (q15_t)0x6776, (q15_t)0xb4a4, + (q15_t)0x6773, (q15_t)0xb49f, (q15_t)0x676f, (q15_t)0xb49a, (q15_t)0x676b, (q15_t)0xb495, (q15_t)0x6768, (q15_t)0xb490, + (q15_t)0x6764, (q15_t)0xb48b, (q15_t)0x6760, (q15_t)0xb486, (q15_t)0x675d, (q15_t)0xb481, (q15_t)0x6759, (q15_t)0xb47c, + (q15_t)0x6755, (q15_t)0xb477, (q15_t)0x6751, (q15_t)0xb472, (q15_t)0x674e, (q15_t)0xb46d, (q15_t)0x674a, (q15_t)0xb468, + (q15_t)0x6746, (q15_t)0xb462, (q15_t)0x6743, (q15_t)0xb45d, (q15_t)0x673f, (q15_t)0xb458, (q15_t)0x673b, (q15_t)0xb453, + (q15_t)0x6737, (q15_t)0xb44e, (q15_t)0x6734, (q15_t)0xb449, (q15_t)0x6730, (q15_t)0xb444, (q15_t)0x672c, (q15_t)0xb43f, + (q15_t)0x6729, (q15_t)0xb43a, (q15_t)0x6725, (q15_t)0xb435, (q15_t)0x6721, (q15_t)0xb430, (q15_t)0x671d, (q15_t)0xb42b, + (q15_t)0x671a, (q15_t)0xb426, (q15_t)0x6716, (q15_t)0xb421, (q15_t)0x6712, (q15_t)0xb41c, (q15_t)0x670e, (q15_t)0xb417, + (q15_t)0x670b, (q15_t)0xb411, (q15_t)0x6707, (q15_t)0xb40c, (q15_t)0x6703, (q15_t)0xb407, (q15_t)0x6700, (q15_t)0xb402, + (q15_t)0x66fc, (q15_t)0xb3fd, (q15_t)0x66f8, (q15_t)0xb3f8, (q15_t)0x66f4, (q15_t)0xb3f3, (q15_t)0x66f1, (q15_t)0xb3ee, + (q15_t)0x66ed, (q15_t)0xb3e9, (q15_t)0x66e9, (q15_t)0xb3e4, (q15_t)0x66e5, (q15_t)0xb3df, (q15_t)0x66e2, (q15_t)0xb3da, + (q15_t)0x66de, (q15_t)0xb3d5, (q15_t)0x66da, (q15_t)0xb3d0, (q15_t)0x66d6, (q15_t)0xb3cb, (q15_t)0x66d3, (q15_t)0xb3c6, + (q15_t)0x66cf, (q15_t)0xb3c1, (q15_t)0x66cb, (q15_t)0xb3bc, (q15_t)0x66c8, (q15_t)0xb3b7, (q15_t)0x66c4, (q15_t)0xb3b1, + (q15_t)0x66c0, (q15_t)0xb3ac, (q15_t)0x66bc, (q15_t)0xb3a7, (q15_t)0x66b9, (q15_t)0xb3a2, (q15_t)0x66b5, (q15_t)0xb39d, + (q15_t)0x66b1, (q15_t)0xb398, (q15_t)0x66ad, (q15_t)0xb393, (q15_t)0x66aa, (q15_t)0xb38e, (q15_t)0x66a6, (q15_t)0xb389, + (q15_t)0x66a2, (q15_t)0xb384, (q15_t)0x669e, (q15_t)0xb37f, (q15_t)0x669b, (q15_t)0xb37a, (q15_t)0x6697, (q15_t)0xb375, + (q15_t)0x6693, (q15_t)0xb370, (q15_t)0x668f, (q15_t)0xb36b, (q15_t)0x668b, (q15_t)0xb366, (q15_t)0x6688, (q15_t)0xb361, + (q15_t)0x6684, (q15_t)0xb35c, (q15_t)0x6680, (q15_t)0xb357, (q15_t)0x667c, (q15_t)0xb352, (q15_t)0x6679, (q15_t)0xb34d, + (q15_t)0x6675, (q15_t)0xb348, (q15_t)0x6671, (q15_t)0xb343, (q15_t)0x666d, (q15_t)0xb33e, (q15_t)0x666a, (q15_t)0xb339, + (q15_t)0x6666, (q15_t)0xb334, (q15_t)0x6662, (q15_t)0xb32f, (q15_t)0x665e, (q15_t)0xb32a, (q15_t)0x665b, (q15_t)0xb325, + (q15_t)0x6657, (q15_t)0xb31f, (q15_t)0x6653, (q15_t)0xb31a, (q15_t)0x664f, (q15_t)0xb315, (q15_t)0x664b, (q15_t)0xb310, + (q15_t)0x6648, (q15_t)0xb30b, (q15_t)0x6644, (q15_t)0xb306, (q15_t)0x6640, (q15_t)0xb301, (q15_t)0x663c, (q15_t)0xb2fc, + (q15_t)0x6639, (q15_t)0xb2f7, (q15_t)0x6635, (q15_t)0xb2f2, (q15_t)0x6631, (q15_t)0xb2ed, (q15_t)0x662d, (q15_t)0xb2e8, + (q15_t)0x6629, (q15_t)0xb2e3, (q15_t)0x6626, (q15_t)0xb2de, (q15_t)0x6622, (q15_t)0xb2d9, (q15_t)0x661e, (q15_t)0xb2d4, + (q15_t)0x661a, (q15_t)0xb2cf, (q15_t)0x6616, (q15_t)0xb2ca, (q15_t)0x6613, (q15_t)0xb2c5, (q15_t)0x660f, (q15_t)0xb2c0, + (q15_t)0x660b, (q15_t)0xb2bb, (q15_t)0x6607, (q15_t)0xb2b6, (q15_t)0x6603, (q15_t)0xb2b1, (q15_t)0x6600, (q15_t)0xb2ac, + (q15_t)0x65fc, (q15_t)0xb2a7, (q15_t)0x65f8, (q15_t)0xb2a2, (q15_t)0x65f4, (q15_t)0xb29d, (q15_t)0x65f0, (q15_t)0xb298, + (q15_t)0x65ed, (q15_t)0xb293, (q15_t)0x65e9, (q15_t)0xb28e, (q15_t)0x65e5, (q15_t)0xb289, (q15_t)0x65e1, (q15_t)0xb284, + (q15_t)0x65dd, (q15_t)0xb27f, (q15_t)0x65da, (q15_t)0xb27a, (q15_t)0x65d6, (q15_t)0xb275, (q15_t)0x65d2, (q15_t)0xb270, + (q15_t)0x65ce, (q15_t)0xb26b, (q15_t)0x65ca, (q15_t)0xb266, (q15_t)0x65c7, (q15_t)0xb261, (q15_t)0x65c3, (q15_t)0xb25c, + (q15_t)0x65bf, (q15_t)0xb257, (q15_t)0x65bb, (q15_t)0xb252, (q15_t)0x65b7, (q15_t)0xb24d, (q15_t)0x65b4, (q15_t)0xb248, + (q15_t)0x65b0, (q15_t)0xb243, (q15_t)0x65ac, (q15_t)0xb23e, (q15_t)0x65a8, (q15_t)0xb239, (q15_t)0x65a4, (q15_t)0xb234, + (q15_t)0x65a0, (q15_t)0xb22f, (q15_t)0x659d, (q15_t)0xb22a, (q15_t)0x6599, (q15_t)0xb225, (q15_t)0x6595, (q15_t)0xb220, + (q15_t)0x6591, (q15_t)0xb21b, (q15_t)0x658d, (q15_t)0xb216, (q15_t)0x658a, (q15_t)0xb211, (q15_t)0x6586, (q15_t)0xb20c, + (q15_t)0x6582, (q15_t)0xb207, (q15_t)0x657e, (q15_t)0xb202, (q15_t)0x657a, (q15_t)0xb1fd, (q15_t)0x6576, (q15_t)0xb1f8, + (q15_t)0x6573, (q15_t)0xb1f3, (q15_t)0x656f, (q15_t)0xb1ee, (q15_t)0x656b, (q15_t)0xb1e9, (q15_t)0x6567, (q15_t)0xb1e4, + (q15_t)0x6563, (q15_t)0xb1df, (q15_t)0x655f, (q15_t)0xb1da, (q15_t)0x655c, (q15_t)0xb1d6, (q15_t)0x6558, (q15_t)0xb1d1, + (q15_t)0x6554, (q15_t)0xb1cc, (q15_t)0x6550, (q15_t)0xb1c7, (q15_t)0x654c, (q15_t)0xb1c2, (q15_t)0x6548, (q15_t)0xb1bd, + (q15_t)0x6545, (q15_t)0xb1b8, (q15_t)0x6541, (q15_t)0xb1b3, (q15_t)0x653d, (q15_t)0xb1ae, (q15_t)0x6539, (q15_t)0xb1a9, + (q15_t)0x6535, (q15_t)0xb1a4, (q15_t)0x6531, (q15_t)0xb19f, (q15_t)0x652d, (q15_t)0xb19a, (q15_t)0x652a, (q15_t)0xb195, + (q15_t)0x6526, (q15_t)0xb190, (q15_t)0x6522, (q15_t)0xb18b, (q15_t)0x651e, (q15_t)0xb186, (q15_t)0x651a, (q15_t)0xb181, + (q15_t)0x6516, (q15_t)0xb17c, (q15_t)0x6513, (q15_t)0xb177, (q15_t)0x650f, (q15_t)0xb172, (q15_t)0x650b, (q15_t)0xb16d, + (q15_t)0x6507, (q15_t)0xb168, (q15_t)0x6503, (q15_t)0xb163, (q15_t)0x64ff, (q15_t)0xb15e, (q15_t)0x64fb, (q15_t)0xb159, + (q15_t)0x64f7, (q15_t)0xb154, (q15_t)0x64f4, (q15_t)0xb14f, (q15_t)0x64f0, (q15_t)0xb14a, (q15_t)0x64ec, (q15_t)0xb146, + (q15_t)0x64e8, (q15_t)0xb141, (q15_t)0x64e4, (q15_t)0xb13c, (q15_t)0x64e0, (q15_t)0xb137, (q15_t)0x64dc, (q15_t)0xb132, + (q15_t)0x64d9, (q15_t)0xb12d, (q15_t)0x64d5, (q15_t)0xb128, (q15_t)0x64d1, (q15_t)0xb123, (q15_t)0x64cd, (q15_t)0xb11e, + (q15_t)0x64c9, (q15_t)0xb119, (q15_t)0x64c5, (q15_t)0xb114, (q15_t)0x64c1, (q15_t)0xb10f, (q15_t)0x64bd, (q15_t)0xb10a, + (q15_t)0x64ba, (q15_t)0xb105, (q15_t)0x64b6, (q15_t)0xb100, (q15_t)0x64b2, (q15_t)0xb0fb, (q15_t)0x64ae, (q15_t)0xb0f6, + (q15_t)0x64aa, (q15_t)0xb0f1, (q15_t)0x64a6, (q15_t)0xb0ec, (q15_t)0x64a2, (q15_t)0xb0e8, (q15_t)0x649e, (q15_t)0xb0e3, + (q15_t)0x649b, (q15_t)0xb0de, (q15_t)0x6497, (q15_t)0xb0d9, (q15_t)0x6493, (q15_t)0xb0d4, (q15_t)0x648f, (q15_t)0xb0cf, + (q15_t)0x648b, (q15_t)0xb0ca, (q15_t)0x6487, (q15_t)0xb0c5, (q15_t)0x6483, (q15_t)0xb0c0, (q15_t)0x647f, (q15_t)0xb0bb, + (q15_t)0x647b, (q15_t)0xb0b6, (q15_t)0x6478, (q15_t)0xb0b1, (q15_t)0x6474, (q15_t)0xb0ac, (q15_t)0x6470, (q15_t)0xb0a7, + (q15_t)0x646c, (q15_t)0xb0a2, (q15_t)0x6468, (q15_t)0xb09e, (q15_t)0x6464, (q15_t)0xb099, (q15_t)0x6460, (q15_t)0xb094, + (q15_t)0x645c, (q15_t)0xb08f, (q15_t)0x6458, (q15_t)0xb08a, (q15_t)0x6454, (q15_t)0xb085, (q15_t)0x6451, (q15_t)0xb080, + (q15_t)0x644d, (q15_t)0xb07b, (q15_t)0x6449, (q15_t)0xb076, (q15_t)0x6445, (q15_t)0xb071, (q15_t)0x6441, (q15_t)0xb06c, + (q15_t)0x643d, (q15_t)0xb067, (q15_t)0x6439, (q15_t)0xb062, (q15_t)0x6435, (q15_t)0xb05e, (q15_t)0x6431, (q15_t)0xb059, + (q15_t)0x642d, (q15_t)0xb054, (q15_t)0x6429, (q15_t)0xb04f, (q15_t)0x6426, (q15_t)0xb04a, (q15_t)0x6422, (q15_t)0xb045, + (q15_t)0x641e, (q15_t)0xb040, (q15_t)0x641a, (q15_t)0xb03b, (q15_t)0x6416, (q15_t)0xb036, (q15_t)0x6412, (q15_t)0xb031, + (q15_t)0x640e, (q15_t)0xb02c, (q15_t)0x640a, (q15_t)0xb027, (q15_t)0x6406, (q15_t)0xb023, (q15_t)0x6402, (q15_t)0xb01e, + (q15_t)0x63fe, (q15_t)0xb019, (q15_t)0x63fa, (q15_t)0xb014, (q15_t)0x63f7, (q15_t)0xb00f, (q15_t)0x63f3, (q15_t)0xb00a, + (q15_t)0x63ef, (q15_t)0xb005, (q15_t)0x63eb, (q15_t)0xb000, (q15_t)0x63e7, (q15_t)0xaffb, (q15_t)0x63e3, (q15_t)0xaff6, + (q15_t)0x63df, (q15_t)0xaff1, (q15_t)0x63db, (q15_t)0xafed, (q15_t)0x63d7, (q15_t)0xafe8, (q15_t)0x63d3, (q15_t)0xafe3, + (q15_t)0x63cf, (q15_t)0xafde, (q15_t)0x63cb, (q15_t)0xafd9, (q15_t)0x63c7, (q15_t)0xafd4, (q15_t)0x63c3, (q15_t)0xafcf, + (q15_t)0x63c0, (q15_t)0xafca, (q15_t)0x63bc, (q15_t)0xafc5, (q15_t)0x63b8, (q15_t)0xafc1, (q15_t)0x63b4, (q15_t)0xafbc, + (q15_t)0x63b0, (q15_t)0xafb7, (q15_t)0x63ac, (q15_t)0xafb2, (q15_t)0x63a8, (q15_t)0xafad, (q15_t)0x63a4, (q15_t)0xafa8, + (q15_t)0x63a0, (q15_t)0xafa3, (q15_t)0x639c, (q15_t)0xaf9e, (q15_t)0x6398, (q15_t)0xaf99, (q15_t)0x6394, (q15_t)0xaf94, + (q15_t)0x6390, (q15_t)0xaf90, (q15_t)0x638c, (q15_t)0xaf8b, (q15_t)0x6388, (q15_t)0xaf86, (q15_t)0x6384, (q15_t)0xaf81, + (q15_t)0x6380, (q15_t)0xaf7c, (q15_t)0x637c, (q15_t)0xaf77, (q15_t)0x6378, (q15_t)0xaf72, (q15_t)0x6375, (q15_t)0xaf6d, + (q15_t)0x6371, (q15_t)0xaf69, (q15_t)0x636d, (q15_t)0xaf64, (q15_t)0x6369, (q15_t)0xaf5f, (q15_t)0x6365, (q15_t)0xaf5a, + (q15_t)0x6361, (q15_t)0xaf55, (q15_t)0x635d, (q15_t)0xaf50, (q15_t)0x6359, (q15_t)0xaf4b, (q15_t)0x6355, (q15_t)0xaf46, + (q15_t)0x6351, (q15_t)0xaf41, (q15_t)0x634d, (q15_t)0xaf3d, (q15_t)0x6349, (q15_t)0xaf38, (q15_t)0x6345, (q15_t)0xaf33, + (q15_t)0x6341, (q15_t)0xaf2e, (q15_t)0x633d, (q15_t)0xaf29, (q15_t)0x6339, (q15_t)0xaf24, (q15_t)0x6335, (q15_t)0xaf1f, + (q15_t)0x6331, (q15_t)0xaf1b, (q15_t)0x632d, (q15_t)0xaf16, (q15_t)0x6329, (q15_t)0xaf11, (q15_t)0x6325, (q15_t)0xaf0c, + (q15_t)0x6321, (q15_t)0xaf07, (q15_t)0x631d, (q15_t)0xaf02, (q15_t)0x6319, (q15_t)0xaefd, (q15_t)0x6315, (q15_t)0xaef8, + (q15_t)0x6311, (q15_t)0xaef4, (q15_t)0x630d, (q15_t)0xaeef, (q15_t)0x6309, (q15_t)0xaeea, (q15_t)0x6305, (q15_t)0xaee5, + (q15_t)0x6301, (q15_t)0xaee0, (q15_t)0x62fd, (q15_t)0xaedb, (q15_t)0x62f9, (q15_t)0xaed6, (q15_t)0x62f5, (q15_t)0xaed2, + (q15_t)0x62f2, (q15_t)0xaecd, (q15_t)0x62ee, (q15_t)0xaec8, (q15_t)0x62ea, (q15_t)0xaec3, (q15_t)0x62e6, (q15_t)0xaebe, + (q15_t)0x62e2, (q15_t)0xaeb9, (q15_t)0x62de, (q15_t)0xaeb4, (q15_t)0x62da, (q15_t)0xaeb0, (q15_t)0x62d6, (q15_t)0xaeab, + (q15_t)0x62d2, (q15_t)0xaea6, (q15_t)0x62ce, (q15_t)0xaea1, (q15_t)0x62ca, (q15_t)0xae9c, (q15_t)0x62c6, (q15_t)0xae97, + (q15_t)0x62c2, (q15_t)0xae92, (q15_t)0x62be, (q15_t)0xae8e, (q15_t)0x62ba, (q15_t)0xae89, (q15_t)0x62b6, (q15_t)0xae84, + (q15_t)0x62b2, (q15_t)0xae7f, (q15_t)0x62ae, (q15_t)0xae7a, (q15_t)0x62aa, (q15_t)0xae75, (q15_t)0x62a6, (q15_t)0xae71, + (q15_t)0x62a2, (q15_t)0xae6c, (q15_t)0x629e, (q15_t)0xae67, (q15_t)0x629a, (q15_t)0xae62, (q15_t)0x6296, (q15_t)0xae5d, + (q15_t)0x6292, (q15_t)0xae58, (q15_t)0x628e, (q15_t)0xae54, (q15_t)0x628a, (q15_t)0xae4f, (q15_t)0x6286, (q15_t)0xae4a, + (q15_t)0x6282, (q15_t)0xae45, (q15_t)0x627e, (q15_t)0xae40, (q15_t)0x627a, (q15_t)0xae3b, (q15_t)0x6275, (q15_t)0xae37, + (q15_t)0x6271, (q15_t)0xae32, (q15_t)0x626d, (q15_t)0xae2d, (q15_t)0x6269, (q15_t)0xae28, (q15_t)0x6265, (q15_t)0xae23, + (q15_t)0x6261, (q15_t)0xae1e, (q15_t)0x625d, (q15_t)0xae1a, (q15_t)0x6259, (q15_t)0xae15, (q15_t)0x6255, (q15_t)0xae10, + (q15_t)0x6251, (q15_t)0xae0b, (q15_t)0x624d, (q15_t)0xae06, (q15_t)0x6249, (q15_t)0xae01, (q15_t)0x6245, (q15_t)0xadfd, + (q15_t)0x6241, (q15_t)0xadf8, (q15_t)0x623d, (q15_t)0xadf3, (q15_t)0x6239, (q15_t)0xadee, (q15_t)0x6235, (q15_t)0xade9, + (q15_t)0x6231, (q15_t)0xade4, (q15_t)0x622d, (q15_t)0xade0, (q15_t)0x6229, (q15_t)0xaddb, (q15_t)0x6225, (q15_t)0xadd6, + (q15_t)0x6221, (q15_t)0xadd1, (q15_t)0x621d, (q15_t)0xadcc, (q15_t)0x6219, (q15_t)0xadc8, (q15_t)0x6215, (q15_t)0xadc3, + (q15_t)0x6211, (q15_t)0xadbe, (q15_t)0x620d, (q15_t)0xadb9, (q15_t)0x6209, (q15_t)0xadb4, (q15_t)0x6205, (q15_t)0xadaf, + (q15_t)0x6201, (q15_t)0xadab, (q15_t)0x61fd, (q15_t)0xada6, (q15_t)0x61f9, (q15_t)0xada1, (q15_t)0x61f5, (q15_t)0xad9c, + (q15_t)0x61f1, (q15_t)0xad97, (q15_t)0x61ec, (q15_t)0xad93, (q15_t)0x61e8, (q15_t)0xad8e, (q15_t)0x61e4, (q15_t)0xad89, + (q15_t)0x61e0, (q15_t)0xad84, (q15_t)0x61dc, (q15_t)0xad7f, (q15_t)0x61d8, (q15_t)0xad7b, (q15_t)0x61d4, (q15_t)0xad76, + (q15_t)0x61d0, (q15_t)0xad71, (q15_t)0x61cc, (q15_t)0xad6c, (q15_t)0x61c8, (q15_t)0xad67, (q15_t)0x61c4, (q15_t)0xad63, + (q15_t)0x61c0, (q15_t)0xad5e, (q15_t)0x61bc, (q15_t)0xad59, (q15_t)0x61b8, (q15_t)0xad54, (q15_t)0x61b4, (q15_t)0xad4f, + (q15_t)0x61b0, (q15_t)0xad4b, (q15_t)0x61ac, (q15_t)0xad46, (q15_t)0x61a8, (q15_t)0xad41, (q15_t)0x61a3, (q15_t)0xad3c, + (q15_t)0x619f, (q15_t)0xad37, (q15_t)0x619b, (q15_t)0xad33, (q15_t)0x6197, (q15_t)0xad2e, (q15_t)0x6193, (q15_t)0xad29, + (q15_t)0x618f, (q15_t)0xad24, (q15_t)0x618b, (q15_t)0xad1f, (q15_t)0x6187, (q15_t)0xad1b, (q15_t)0x6183, (q15_t)0xad16, + (q15_t)0x617f, (q15_t)0xad11, (q15_t)0x617b, (q15_t)0xad0c, (q15_t)0x6177, (q15_t)0xad08, (q15_t)0x6173, (q15_t)0xad03, + (q15_t)0x616f, (q15_t)0xacfe, (q15_t)0x616b, (q15_t)0xacf9, (q15_t)0x6166, (q15_t)0xacf4, (q15_t)0x6162, (q15_t)0xacf0, + (q15_t)0x615e, (q15_t)0xaceb, (q15_t)0x615a, (q15_t)0xace6, (q15_t)0x6156, (q15_t)0xace1, (q15_t)0x6152, (q15_t)0xacdd, + (q15_t)0x614e, (q15_t)0xacd8, (q15_t)0x614a, (q15_t)0xacd3, (q15_t)0x6146, (q15_t)0xacce, (q15_t)0x6142, (q15_t)0xacc9, + (q15_t)0x613e, (q15_t)0xacc5, (q15_t)0x613a, (q15_t)0xacc0, (q15_t)0x6135, (q15_t)0xacbb, (q15_t)0x6131, (q15_t)0xacb6, + (q15_t)0x612d, (q15_t)0xacb2, (q15_t)0x6129, (q15_t)0xacad, (q15_t)0x6125, (q15_t)0xaca8, (q15_t)0x6121, (q15_t)0xaca3, + (q15_t)0x611d, (q15_t)0xac9e, (q15_t)0x6119, (q15_t)0xac9a, (q15_t)0x6115, (q15_t)0xac95, (q15_t)0x6111, (q15_t)0xac90, + (q15_t)0x610d, (q15_t)0xac8b, (q15_t)0x6108, (q15_t)0xac87, (q15_t)0x6104, (q15_t)0xac82, (q15_t)0x6100, (q15_t)0xac7d, + (q15_t)0x60fc, (q15_t)0xac78, (q15_t)0x60f8, (q15_t)0xac74, (q15_t)0x60f4, (q15_t)0xac6f, (q15_t)0x60f0, (q15_t)0xac6a, + (q15_t)0x60ec, (q15_t)0xac65, (q15_t)0x60e8, (q15_t)0xac61, (q15_t)0x60e4, (q15_t)0xac5c, (q15_t)0x60df, (q15_t)0xac57, + (q15_t)0x60db, (q15_t)0xac52, (q15_t)0x60d7, (q15_t)0xac4e, (q15_t)0x60d3, (q15_t)0xac49, (q15_t)0x60cf, (q15_t)0xac44, + (q15_t)0x60cb, (q15_t)0xac3f, (q15_t)0x60c7, (q15_t)0xac3b, (q15_t)0x60c3, (q15_t)0xac36, (q15_t)0x60bf, (q15_t)0xac31, + (q15_t)0x60ba, (q15_t)0xac2c, (q15_t)0x60b6, (q15_t)0xac28, (q15_t)0x60b2, (q15_t)0xac23, (q15_t)0x60ae, (q15_t)0xac1e, + (q15_t)0x60aa, (q15_t)0xac19, (q15_t)0x60a6, (q15_t)0xac15, (q15_t)0x60a2, (q15_t)0xac10, (q15_t)0x609e, (q15_t)0xac0b, + (q15_t)0x6099, (q15_t)0xac06, (q15_t)0x6095, (q15_t)0xac02, (q15_t)0x6091, (q15_t)0xabfd, (q15_t)0x608d, (q15_t)0xabf8, + (q15_t)0x6089, (q15_t)0xabf3, (q15_t)0x6085, (q15_t)0xabef, (q15_t)0x6081, (q15_t)0xabea, (q15_t)0x607d, (q15_t)0xabe5, + (q15_t)0x6078, (q15_t)0xabe0, (q15_t)0x6074, (q15_t)0xabdc, (q15_t)0x6070, (q15_t)0xabd7, (q15_t)0x606c, (q15_t)0xabd2, + (q15_t)0x6068, (q15_t)0xabcd, (q15_t)0x6064, (q15_t)0xabc9, (q15_t)0x6060, (q15_t)0xabc4, (q15_t)0x605c, (q15_t)0xabbf, + (q15_t)0x6057, (q15_t)0xabbb, (q15_t)0x6053, (q15_t)0xabb6, (q15_t)0x604f, (q15_t)0xabb1, (q15_t)0x604b, (q15_t)0xabac, + (q15_t)0x6047, (q15_t)0xaba8, (q15_t)0x6043, (q15_t)0xaba3, (q15_t)0x603f, (q15_t)0xab9e, (q15_t)0x603a, (q15_t)0xab99, + (q15_t)0x6036, (q15_t)0xab95, (q15_t)0x6032, (q15_t)0xab90, (q15_t)0x602e, (q15_t)0xab8b, (q15_t)0x602a, (q15_t)0xab87, + (q15_t)0x6026, (q15_t)0xab82, (q15_t)0x6022, (q15_t)0xab7d, (q15_t)0x601d, (q15_t)0xab78, (q15_t)0x6019, (q15_t)0xab74, + (q15_t)0x6015, (q15_t)0xab6f, (q15_t)0x6011, (q15_t)0xab6a, (q15_t)0x600d, (q15_t)0xab66, (q15_t)0x6009, (q15_t)0xab61, + (q15_t)0x6004, (q15_t)0xab5c, (q15_t)0x6000, (q15_t)0xab57, (q15_t)0x5ffc, (q15_t)0xab53, (q15_t)0x5ff8, (q15_t)0xab4e, + (q15_t)0x5ff4, (q15_t)0xab49, (q15_t)0x5ff0, (q15_t)0xab45, (q15_t)0x5fec, (q15_t)0xab40, (q15_t)0x5fe7, (q15_t)0xab3b, + (q15_t)0x5fe3, (q15_t)0xab36, (q15_t)0x5fdf, (q15_t)0xab32, (q15_t)0x5fdb, (q15_t)0xab2d, (q15_t)0x5fd7, (q15_t)0xab28, + (q15_t)0x5fd3, (q15_t)0xab24, (q15_t)0x5fce, (q15_t)0xab1f, (q15_t)0x5fca, (q15_t)0xab1a, (q15_t)0x5fc6, (q15_t)0xab16, + (q15_t)0x5fc2, (q15_t)0xab11, (q15_t)0x5fbe, (q15_t)0xab0c, (q15_t)0x5fba, (q15_t)0xab07, (q15_t)0x5fb5, (q15_t)0xab03, + (q15_t)0x5fb1, (q15_t)0xaafe, (q15_t)0x5fad, (q15_t)0xaaf9, (q15_t)0x5fa9, (q15_t)0xaaf5, (q15_t)0x5fa5, (q15_t)0xaaf0, + (q15_t)0x5fa0, (q15_t)0xaaeb, (q15_t)0x5f9c, (q15_t)0xaae7, (q15_t)0x5f98, (q15_t)0xaae2, (q15_t)0x5f94, (q15_t)0xaadd, + (q15_t)0x5f90, (q15_t)0xaad8, (q15_t)0x5f8c, (q15_t)0xaad4, (q15_t)0x5f87, (q15_t)0xaacf, (q15_t)0x5f83, (q15_t)0xaaca, + (q15_t)0x5f7f, (q15_t)0xaac6, (q15_t)0x5f7b, (q15_t)0xaac1, (q15_t)0x5f77, (q15_t)0xaabc, (q15_t)0x5f72, (q15_t)0xaab8, + (q15_t)0x5f6e, (q15_t)0xaab3, (q15_t)0x5f6a, (q15_t)0xaaae, (q15_t)0x5f66, (q15_t)0xaaaa, (q15_t)0x5f62, (q15_t)0xaaa5, + (q15_t)0x5f5e, (q15_t)0xaaa0, (q15_t)0x5f59, (q15_t)0xaa9c, (q15_t)0x5f55, (q15_t)0xaa97, (q15_t)0x5f51, (q15_t)0xaa92, + (q15_t)0x5f4d, (q15_t)0xaa8e, (q15_t)0x5f49, (q15_t)0xaa89, (q15_t)0x5f44, (q15_t)0xaa84, (q15_t)0x5f40, (q15_t)0xaa7f, + (q15_t)0x5f3c, (q15_t)0xaa7b, (q15_t)0x5f38, (q15_t)0xaa76, (q15_t)0x5f34, (q15_t)0xaa71, (q15_t)0x5f2f, (q15_t)0xaa6d, + (q15_t)0x5f2b, (q15_t)0xaa68, (q15_t)0x5f27, (q15_t)0xaa63, (q15_t)0x5f23, (q15_t)0xaa5f, (q15_t)0x5f1f, (q15_t)0xaa5a, + (q15_t)0x5f1a, (q15_t)0xaa55, (q15_t)0x5f16, (q15_t)0xaa51, (q15_t)0x5f12, (q15_t)0xaa4c, (q15_t)0x5f0e, (q15_t)0xaa47, + (q15_t)0x5f0a, (q15_t)0xaa43, (q15_t)0x5f05, (q15_t)0xaa3e, (q15_t)0x5f01, (q15_t)0xaa39, (q15_t)0x5efd, (q15_t)0xaa35, + (q15_t)0x5ef9, (q15_t)0xaa30, (q15_t)0x5ef5, (q15_t)0xaa2b, (q15_t)0x5ef0, (q15_t)0xaa27, (q15_t)0x5eec, (q15_t)0xaa22, + (q15_t)0x5ee8, (q15_t)0xaa1d, (q15_t)0x5ee4, (q15_t)0xaa19, (q15_t)0x5edf, (q15_t)0xaa14, (q15_t)0x5edb, (q15_t)0xaa10, + (q15_t)0x5ed7, (q15_t)0xaa0b, (q15_t)0x5ed3, (q15_t)0xaa06, (q15_t)0x5ecf, (q15_t)0xaa02, (q15_t)0x5eca, (q15_t)0xa9fd, + (q15_t)0x5ec6, (q15_t)0xa9f8, (q15_t)0x5ec2, (q15_t)0xa9f4, (q15_t)0x5ebe, (q15_t)0xa9ef, (q15_t)0x5eb9, (q15_t)0xa9ea, + (q15_t)0x5eb5, (q15_t)0xa9e6, (q15_t)0x5eb1, (q15_t)0xa9e1, (q15_t)0x5ead, (q15_t)0xa9dc, (q15_t)0x5ea9, (q15_t)0xa9d8, + (q15_t)0x5ea4, (q15_t)0xa9d3, (q15_t)0x5ea0, (q15_t)0xa9ce, (q15_t)0x5e9c, (q15_t)0xa9ca, (q15_t)0x5e98, (q15_t)0xa9c5, + (q15_t)0x5e93, (q15_t)0xa9c0, (q15_t)0x5e8f, (q15_t)0xa9bc, (q15_t)0x5e8b, (q15_t)0xa9b7, (q15_t)0x5e87, (q15_t)0xa9b3, + (q15_t)0x5e82, (q15_t)0xa9ae, (q15_t)0x5e7e, (q15_t)0xa9a9, (q15_t)0x5e7a, (q15_t)0xa9a5, (q15_t)0x5e76, (q15_t)0xa9a0, + (q15_t)0x5e71, (q15_t)0xa99b, (q15_t)0x5e6d, (q15_t)0xa997, (q15_t)0x5e69, (q15_t)0xa992, (q15_t)0x5e65, (q15_t)0xa98d, + (q15_t)0x5e60, (q15_t)0xa989, (q15_t)0x5e5c, (q15_t)0xa984, (q15_t)0x5e58, (q15_t)0xa980, (q15_t)0x5e54, (q15_t)0xa97b, + (q15_t)0x5e50, (q15_t)0xa976, (q15_t)0x5e4b, (q15_t)0xa972, (q15_t)0x5e47, (q15_t)0xa96d, (q15_t)0x5e43, (q15_t)0xa968, + (q15_t)0x5e3f, (q15_t)0xa964, (q15_t)0x5e3a, (q15_t)0xa95f, (q15_t)0x5e36, (q15_t)0xa95b, (q15_t)0x5e32, (q15_t)0xa956, + (q15_t)0x5e2d, (q15_t)0xa951, (q15_t)0x5e29, (q15_t)0xa94d, (q15_t)0x5e25, (q15_t)0xa948, (q15_t)0x5e21, (q15_t)0xa943, + (q15_t)0x5e1c, (q15_t)0xa93f, (q15_t)0x5e18, (q15_t)0xa93a, (q15_t)0x5e14, (q15_t)0xa936, (q15_t)0x5e10, (q15_t)0xa931, + (q15_t)0x5e0b, (q15_t)0xa92c, (q15_t)0x5e07, (q15_t)0xa928, (q15_t)0x5e03, (q15_t)0xa923, (q15_t)0x5dff, (q15_t)0xa91e, + (q15_t)0x5dfa, (q15_t)0xa91a, (q15_t)0x5df6, (q15_t)0xa915, (q15_t)0x5df2, (q15_t)0xa911, (q15_t)0x5dee, (q15_t)0xa90c, + (q15_t)0x5de9, (q15_t)0xa907, (q15_t)0x5de5, (q15_t)0xa903, (q15_t)0x5de1, (q15_t)0xa8fe, (q15_t)0x5ddc, (q15_t)0xa8fa, + (q15_t)0x5dd8, (q15_t)0xa8f5, (q15_t)0x5dd4, (q15_t)0xa8f0, (q15_t)0x5dd0, (q15_t)0xa8ec, (q15_t)0x5dcb, (q15_t)0xa8e7, + (q15_t)0x5dc7, (q15_t)0xa8e3, (q15_t)0x5dc3, (q15_t)0xa8de, (q15_t)0x5dbf, (q15_t)0xa8d9, (q15_t)0x5dba, (q15_t)0xa8d5, + (q15_t)0x5db6, (q15_t)0xa8d0, (q15_t)0x5db2, (q15_t)0xa8cc, (q15_t)0x5dad, (q15_t)0xa8c7, (q15_t)0x5da9, (q15_t)0xa8c2, + (q15_t)0x5da5, (q15_t)0xa8be, (q15_t)0x5da1, (q15_t)0xa8b9, (q15_t)0x5d9c, (q15_t)0xa8b5, (q15_t)0x5d98, (q15_t)0xa8b0, + (q15_t)0x5d94, (q15_t)0xa8ab, (q15_t)0x5d8f, (q15_t)0xa8a7, (q15_t)0x5d8b, (q15_t)0xa8a2, (q15_t)0x5d87, (q15_t)0xa89e, + (q15_t)0x5d83, (q15_t)0xa899, (q15_t)0x5d7e, (q15_t)0xa894, (q15_t)0x5d7a, (q15_t)0xa890, (q15_t)0x5d76, (q15_t)0xa88b, + (q15_t)0x5d71, (q15_t)0xa887, (q15_t)0x5d6d, (q15_t)0xa882, (q15_t)0x5d69, (q15_t)0xa87d, (q15_t)0x5d65, (q15_t)0xa879, + (q15_t)0x5d60, (q15_t)0xa874, (q15_t)0x5d5c, (q15_t)0xa870, (q15_t)0x5d58, (q15_t)0xa86b, (q15_t)0x5d53, (q15_t)0xa867, + (q15_t)0x5d4f, (q15_t)0xa862, (q15_t)0x5d4b, (q15_t)0xa85d, (q15_t)0x5d46, (q15_t)0xa859, (q15_t)0x5d42, (q15_t)0xa854, + (q15_t)0x5d3e, (q15_t)0xa850, (q15_t)0x5d3a, (q15_t)0xa84b, (q15_t)0x5d35, (q15_t)0xa847, (q15_t)0x5d31, (q15_t)0xa842, + (q15_t)0x5d2d, (q15_t)0xa83d, (q15_t)0x5d28, (q15_t)0xa839, (q15_t)0x5d24, (q15_t)0xa834, (q15_t)0x5d20, (q15_t)0xa830, + (q15_t)0x5d1b, (q15_t)0xa82b, (q15_t)0x5d17, (q15_t)0xa827, (q15_t)0x5d13, (q15_t)0xa822, (q15_t)0x5d0e, (q15_t)0xa81d, + (q15_t)0x5d0a, (q15_t)0xa819, (q15_t)0x5d06, (q15_t)0xa814, (q15_t)0x5d01, (q15_t)0xa810, (q15_t)0x5cfd, (q15_t)0xa80b, + (q15_t)0x5cf9, (q15_t)0xa807, (q15_t)0x5cf5, (q15_t)0xa802, (q15_t)0x5cf0, (q15_t)0xa7fd, (q15_t)0x5cec, (q15_t)0xa7f9, + (q15_t)0x5ce8, (q15_t)0xa7f4, (q15_t)0x5ce3, (q15_t)0xa7f0, (q15_t)0x5cdf, (q15_t)0xa7eb, (q15_t)0x5cdb, (q15_t)0xa7e7, + (q15_t)0x5cd6, (q15_t)0xa7e2, (q15_t)0x5cd2, (q15_t)0xa7de, (q15_t)0x5cce, (q15_t)0xa7d9, (q15_t)0x5cc9, (q15_t)0xa7d4, + (q15_t)0x5cc5, (q15_t)0xa7d0, (q15_t)0x5cc1, (q15_t)0xa7cb, (q15_t)0x5cbc, (q15_t)0xa7c7, (q15_t)0x5cb8, (q15_t)0xa7c2, + (q15_t)0x5cb4, (q15_t)0xa7be, (q15_t)0x5caf, (q15_t)0xa7b9, (q15_t)0x5cab, (q15_t)0xa7b5, (q15_t)0x5ca7, (q15_t)0xa7b0, + (q15_t)0x5ca2, (q15_t)0xa7ab, (q15_t)0x5c9e, (q15_t)0xa7a7, (q15_t)0x5c9a, (q15_t)0xa7a2, (q15_t)0x5c95, (q15_t)0xa79e, + (q15_t)0x5c91, (q15_t)0xa799, (q15_t)0x5c8d, (q15_t)0xa795, (q15_t)0x5c88, (q15_t)0xa790, (q15_t)0x5c84, (q15_t)0xa78c, + (q15_t)0x5c80, (q15_t)0xa787, (q15_t)0x5c7b, (q15_t)0xa783, (q15_t)0x5c77, (q15_t)0xa77e, (q15_t)0x5c73, (q15_t)0xa779, + (q15_t)0x5c6e, (q15_t)0xa775, (q15_t)0x5c6a, (q15_t)0xa770, (q15_t)0x5c66, (q15_t)0xa76c, (q15_t)0x5c61, (q15_t)0xa767, + (q15_t)0x5c5d, (q15_t)0xa763, (q15_t)0x5c58, (q15_t)0xa75e, (q15_t)0x5c54, (q15_t)0xa75a, (q15_t)0x5c50, (q15_t)0xa755, + (q15_t)0x5c4b, (q15_t)0xa751, (q15_t)0x5c47, (q15_t)0xa74c, (q15_t)0x5c43, (q15_t)0xa748, (q15_t)0x5c3e, (q15_t)0xa743, + (q15_t)0x5c3a, (q15_t)0xa73f, (q15_t)0x5c36, (q15_t)0xa73a, (q15_t)0x5c31, (q15_t)0xa735, (q15_t)0x5c2d, (q15_t)0xa731, + (q15_t)0x5c29, (q15_t)0xa72c, (q15_t)0x5c24, (q15_t)0xa728, (q15_t)0x5c20, (q15_t)0xa723, (q15_t)0x5c1b, (q15_t)0xa71f, + (q15_t)0x5c17, (q15_t)0xa71a, (q15_t)0x5c13, (q15_t)0xa716, (q15_t)0x5c0e, (q15_t)0xa711, (q15_t)0x5c0a, (q15_t)0xa70d, + (q15_t)0x5c06, (q15_t)0xa708, (q15_t)0x5c01, (q15_t)0xa704, (q15_t)0x5bfd, (q15_t)0xa6ff, (q15_t)0x5bf9, (q15_t)0xa6fb, + (q15_t)0x5bf4, (q15_t)0xa6f6, (q15_t)0x5bf0, (q15_t)0xa6f2, (q15_t)0x5beb, (q15_t)0xa6ed, (q15_t)0x5be7, (q15_t)0xa6e9, + (q15_t)0x5be3, (q15_t)0xa6e4, (q15_t)0x5bde, (q15_t)0xa6e0, (q15_t)0x5bda, (q15_t)0xa6db, (q15_t)0x5bd6, (q15_t)0xa6d7, + (q15_t)0x5bd1, (q15_t)0xa6d2, (q15_t)0x5bcd, (q15_t)0xa6ce, (q15_t)0x5bc8, (q15_t)0xa6c9, (q15_t)0x5bc4, (q15_t)0xa6c5, + (q15_t)0x5bc0, (q15_t)0xa6c0, (q15_t)0x5bbb, (q15_t)0xa6bc, (q15_t)0x5bb7, (q15_t)0xa6b7, (q15_t)0x5bb2, (q15_t)0xa6b3, + (q15_t)0x5bae, (q15_t)0xa6ae, (q15_t)0x5baa, (q15_t)0xa6aa, (q15_t)0x5ba5, (q15_t)0xa6a5, (q15_t)0x5ba1, (q15_t)0xa6a1, + (q15_t)0x5b9d, (q15_t)0xa69c, (q15_t)0x5b98, (q15_t)0xa698, (q15_t)0x5b94, (q15_t)0xa693, (q15_t)0x5b8f, (q15_t)0xa68f, + (q15_t)0x5b8b, (q15_t)0xa68a, (q15_t)0x5b87, (q15_t)0xa686, (q15_t)0x5b82, (q15_t)0xa681, (q15_t)0x5b7e, (q15_t)0xa67d, + (q15_t)0x5b79, (q15_t)0xa678, (q15_t)0x5b75, (q15_t)0xa674, (q15_t)0x5b71, (q15_t)0xa66f, (q15_t)0x5b6c, (q15_t)0xa66b, + (q15_t)0x5b68, (q15_t)0xa666, (q15_t)0x5b63, (q15_t)0xa662, (q15_t)0x5b5f, (q15_t)0xa65d, (q15_t)0x5b5b, (q15_t)0xa659, + (q15_t)0x5b56, (q15_t)0xa654, (q15_t)0x5b52, (q15_t)0xa650, (q15_t)0x5b4d, (q15_t)0xa64b, (q15_t)0x5b49, (q15_t)0xa647, + (q15_t)0x5b45, (q15_t)0xa642, (q15_t)0x5b40, (q15_t)0xa63e, (q15_t)0x5b3c, (q15_t)0xa639, (q15_t)0x5b37, (q15_t)0xa635, + (q15_t)0x5b33, (q15_t)0xa630, (q15_t)0x5b2f, (q15_t)0xa62c, (q15_t)0x5b2a, (q15_t)0xa627, (q15_t)0x5b26, (q15_t)0xa623, + (q15_t)0x5b21, (q15_t)0xa61f, (q15_t)0x5b1d, (q15_t)0xa61a, (q15_t)0x5b19, (q15_t)0xa616, (q15_t)0x5b14, (q15_t)0xa611, + (q15_t)0x5b10, (q15_t)0xa60d, (q15_t)0x5b0b, (q15_t)0xa608, (q15_t)0x5b07, (q15_t)0xa604, (q15_t)0x5b02, (q15_t)0xa5ff, + (q15_t)0x5afe, (q15_t)0xa5fb, (q15_t)0x5afa, (q15_t)0xa5f6, (q15_t)0x5af5, (q15_t)0xa5f2, (q15_t)0x5af1, (q15_t)0xa5ed, + (q15_t)0x5aec, (q15_t)0xa5e9, (q15_t)0x5ae8, (q15_t)0xa5e4, (q15_t)0x5ae4, (q15_t)0xa5e0, (q15_t)0x5adf, (q15_t)0xa5dc, + (q15_t)0x5adb, (q15_t)0xa5d7, (q15_t)0x5ad6, (q15_t)0xa5d3, (q15_t)0x5ad2, (q15_t)0xa5ce, (q15_t)0x5acd, (q15_t)0xa5ca, + (q15_t)0x5ac9, (q15_t)0xa5c5, (q15_t)0x5ac5, (q15_t)0xa5c1, (q15_t)0x5ac0, (q15_t)0xa5bc, (q15_t)0x5abc, (q15_t)0xa5b8, + (q15_t)0x5ab7, (q15_t)0xa5b3, (q15_t)0x5ab3, (q15_t)0xa5af, (q15_t)0x5aae, (q15_t)0xa5aa, (q15_t)0x5aaa, (q15_t)0xa5a6, + (q15_t)0x5aa5, (q15_t)0xa5a2, (q15_t)0x5aa1, (q15_t)0xa59d, (q15_t)0x5a9d, (q15_t)0xa599, (q15_t)0x5a98, (q15_t)0xa594, + (q15_t)0x5a94, (q15_t)0xa590, (q15_t)0x5a8f, (q15_t)0xa58b, (q15_t)0x5a8b, (q15_t)0xa587, (q15_t)0x5a86, (q15_t)0xa582, + (q15_t)0x5a82, (q15_t)0xa57e, (q15_t)0x5a7e, (q15_t)0xa57a, (q15_t)0x5a79, (q15_t)0xa575, (q15_t)0x5a75, (q15_t)0xa571, + (q15_t)0x5a70, (q15_t)0xa56c, (q15_t)0x5a6c, (q15_t)0xa568, (q15_t)0x5a67, (q15_t)0xa563, (q15_t)0x5a63, (q15_t)0xa55f, + (q15_t)0x5a5e, (q15_t)0xa55b, (q15_t)0x5a5a, (q15_t)0xa556, (q15_t)0x5a56, (q15_t)0xa552, (q15_t)0x5a51, (q15_t)0xa54d, + (q15_t)0x5a4d, (q15_t)0xa549, (q15_t)0x5a48, (q15_t)0xa544, (q15_t)0x5a44, (q15_t)0xa540, (q15_t)0x5a3f, (q15_t)0xa53b, + (q15_t)0x5a3b, (q15_t)0xa537, (q15_t)0x5a36, (q15_t)0xa533, (q15_t)0x5a32, (q15_t)0xa52e, (q15_t)0x5a2d, (q15_t)0xa52a, + (q15_t)0x5a29, (q15_t)0xa525, (q15_t)0x5a24, (q15_t)0xa521, (q15_t)0x5a20, (q15_t)0xa51c, (q15_t)0x5a1c, (q15_t)0xa518, + (q15_t)0x5a17, (q15_t)0xa514, (q15_t)0x5a13, (q15_t)0xa50f, (q15_t)0x5a0e, (q15_t)0xa50b, (q15_t)0x5a0a, (q15_t)0xa506, + (q15_t)0x5a05, (q15_t)0xa502, (q15_t)0x5a01, (q15_t)0xa4fe, (q15_t)0x59fc, (q15_t)0xa4f9, (q15_t)0x59f8, (q15_t)0xa4f5, + (q15_t)0x59f3, (q15_t)0xa4f0, (q15_t)0x59ef, (q15_t)0xa4ec, (q15_t)0x59ea, (q15_t)0xa4e7, (q15_t)0x59e6, (q15_t)0xa4e3, + (q15_t)0x59e1, (q15_t)0xa4df, (q15_t)0x59dd, (q15_t)0xa4da, (q15_t)0x59d9, (q15_t)0xa4d6, (q15_t)0x59d4, (q15_t)0xa4d1, + (q15_t)0x59d0, (q15_t)0xa4cd, (q15_t)0x59cb, (q15_t)0xa4c9, (q15_t)0x59c7, (q15_t)0xa4c4, (q15_t)0x59c2, (q15_t)0xa4c0, + (q15_t)0x59be, (q15_t)0xa4bb, (q15_t)0x59b9, (q15_t)0xa4b7, (q15_t)0x59b5, (q15_t)0xa4b3, (q15_t)0x59b0, (q15_t)0xa4ae, + (q15_t)0x59ac, (q15_t)0xa4aa, (q15_t)0x59a7, (q15_t)0xa4a5, (q15_t)0x59a3, (q15_t)0xa4a1, (q15_t)0x599e, (q15_t)0xa49d, + (q15_t)0x599a, (q15_t)0xa498, (q15_t)0x5995, (q15_t)0xa494, (q15_t)0x5991, (q15_t)0xa48f, (q15_t)0x598c, (q15_t)0xa48b, + (q15_t)0x5988, (q15_t)0xa487, (q15_t)0x5983, (q15_t)0xa482, (q15_t)0x597f, (q15_t)0xa47e, (q15_t)0x597a, (q15_t)0xa479, + (q15_t)0x5976, (q15_t)0xa475, (q15_t)0x5971, (q15_t)0xa471, (q15_t)0x596d, (q15_t)0xa46c, (q15_t)0x5968, (q15_t)0xa468, + (q15_t)0x5964, (q15_t)0xa463, (q15_t)0x595f, (q15_t)0xa45f, (q15_t)0x595b, (q15_t)0xa45b, (q15_t)0x5956, (q15_t)0xa456, + (q15_t)0x5952, (q15_t)0xa452, (q15_t)0x594d, (q15_t)0xa44e, (q15_t)0x5949, (q15_t)0xa449, (q15_t)0x5944, (q15_t)0xa445, + (q15_t)0x5940, (q15_t)0xa440, (q15_t)0x593b, (q15_t)0xa43c, (q15_t)0x5937, (q15_t)0xa438, (q15_t)0x5932, (q15_t)0xa433, + (q15_t)0x592e, (q15_t)0xa42f, (q15_t)0x5929, (q15_t)0xa42a, (q15_t)0x5925, (q15_t)0xa426, (q15_t)0x5920, (q15_t)0xa422, + (q15_t)0x591c, (q15_t)0xa41d, (q15_t)0x5917, (q15_t)0xa419, (q15_t)0x5913, (q15_t)0xa415, (q15_t)0x590e, (q15_t)0xa410, + (q15_t)0x590a, (q15_t)0xa40c, (q15_t)0x5905, (q15_t)0xa407, (q15_t)0x5901, (q15_t)0xa403, (q15_t)0x58fc, (q15_t)0xa3ff, + (q15_t)0x58f8, (q15_t)0xa3fa, (q15_t)0x58f3, (q15_t)0xa3f6, (q15_t)0x58ef, (q15_t)0xa3f2, (q15_t)0x58ea, (q15_t)0xa3ed, + (q15_t)0x58e6, (q15_t)0xa3e9, (q15_t)0x58e1, (q15_t)0xa3e5, (q15_t)0x58dd, (q15_t)0xa3e0, (q15_t)0x58d8, (q15_t)0xa3dc, + (q15_t)0x58d4, (q15_t)0xa3d7, (q15_t)0x58cf, (q15_t)0xa3d3, (q15_t)0x58cb, (q15_t)0xa3cf, (q15_t)0x58c6, (q15_t)0xa3ca, + (q15_t)0x58c1, (q15_t)0xa3c6, (q15_t)0x58bd, (q15_t)0xa3c2, (q15_t)0x58b8, (q15_t)0xa3bd, (q15_t)0x58b4, (q15_t)0xa3b9, + (q15_t)0x58af, (q15_t)0xa3b5, (q15_t)0x58ab, (q15_t)0xa3b0, (q15_t)0x58a6, (q15_t)0xa3ac, (q15_t)0x58a2, (q15_t)0xa3a8, + (q15_t)0x589d, (q15_t)0xa3a3, (q15_t)0x5899, (q15_t)0xa39f, (q15_t)0x5894, (q15_t)0xa39a, (q15_t)0x5890, (q15_t)0xa396, + (q15_t)0x588b, (q15_t)0xa392, (q15_t)0x5887, (q15_t)0xa38d, (q15_t)0x5882, (q15_t)0xa389, (q15_t)0x587d, (q15_t)0xa385, + (q15_t)0x5879, (q15_t)0xa380, (q15_t)0x5874, (q15_t)0xa37c, (q15_t)0x5870, (q15_t)0xa378, (q15_t)0x586b, (q15_t)0xa373, + (q15_t)0x5867, (q15_t)0xa36f, (q15_t)0x5862, (q15_t)0xa36b, (q15_t)0x585e, (q15_t)0xa366, (q15_t)0x5859, (q15_t)0xa362, + (q15_t)0x5855, (q15_t)0xa35e, (q15_t)0x5850, (q15_t)0xa359, (q15_t)0x584b, (q15_t)0xa355, (q15_t)0x5847, (q15_t)0xa351, + (q15_t)0x5842, (q15_t)0xa34c, (q15_t)0x583e, (q15_t)0xa348, (q15_t)0x5839, (q15_t)0xa344, (q15_t)0x5835, (q15_t)0xa33f, + (q15_t)0x5830, (q15_t)0xa33b, (q15_t)0x582c, (q15_t)0xa337, (q15_t)0x5827, (q15_t)0xa332, (q15_t)0x5822, (q15_t)0xa32e, + (q15_t)0x581e, (q15_t)0xa32a, (q15_t)0x5819, (q15_t)0xa325, (q15_t)0x5815, (q15_t)0xa321, (q15_t)0x5810, (q15_t)0xa31d, + (q15_t)0x580c, (q15_t)0xa318, (q15_t)0x5807, (q15_t)0xa314, (q15_t)0x5803, (q15_t)0xa310, (q15_t)0x57fe, (q15_t)0xa30b, + (q15_t)0x57f9, (q15_t)0xa307, (q15_t)0x57f5, (q15_t)0xa303, (q15_t)0x57f0, (q15_t)0xa2ff, (q15_t)0x57ec, (q15_t)0xa2fa, + (q15_t)0x57e7, (q15_t)0xa2f6, (q15_t)0x57e3, (q15_t)0xa2f2, (q15_t)0x57de, (q15_t)0xa2ed, (q15_t)0x57d9, (q15_t)0xa2e9, + (q15_t)0x57d5, (q15_t)0xa2e5, (q15_t)0x57d0, (q15_t)0xa2e0, (q15_t)0x57cc, (q15_t)0xa2dc, (q15_t)0x57c7, (q15_t)0xa2d8, + (q15_t)0x57c3, (q15_t)0xa2d3, (q15_t)0x57be, (q15_t)0xa2cf, (q15_t)0x57b9, (q15_t)0xa2cb, (q15_t)0x57b5, (q15_t)0xa2c6, + (q15_t)0x57b0, (q15_t)0xa2c2, (q15_t)0x57ac, (q15_t)0xa2be, (q15_t)0x57a7, (q15_t)0xa2ba, (q15_t)0x57a3, (q15_t)0xa2b5, + (q15_t)0x579e, (q15_t)0xa2b1, (q15_t)0x5799, (q15_t)0xa2ad, (q15_t)0x5795, (q15_t)0xa2a8, (q15_t)0x5790, (q15_t)0xa2a4, + (q15_t)0x578c, (q15_t)0xa2a0, (q15_t)0x5787, (q15_t)0xa29b, (q15_t)0x5783, (q15_t)0xa297, (q15_t)0x577e, (q15_t)0xa293, + (q15_t)0x5779, (q15_t)0xa28f, (q15_t)0x5775, (q15_t)0xa28a, (q15_t)0x5770, (q15_t)0xa286, (q15_t)0x576c, (q15_t)0xa282, + (q15_t)0x5767, (q15_t)0xa27d, (q15_t)0x5762, (q15_t)0xa279, (q15_t)0x575e, (q15_t)0xa275, (q15_t)0x5759, (q15_t)0xa271, + (q15_t)0x5755, (q15_t)0xa26c, (q15_t)0x5750, (q15_t)0xa268, (q15_t)0x574b, (q15_t)0xa264, (q15_t)0x5747, (q15_t)0xa25f, + (q15_t)0x5742, (q15_t)0xa25b, (q15_t)0x573e, (q15_t)0xa257, (q15_t)0x5739, (q15_t)0xa253, (q15_t)0x5734, (q15_t)0xa24e, + (q15_t)0x5730, (q15_t)0xa24a, (q15_t)0x572b, (q15_t)0xa246, (q15_t)0x5727, (q15_t)0xa241, (q15_t)0x5722, (q15_t)0xa23d, + (q15_t)0x571d, (q15_t)0xa239, (q15_t)0x5719, (q15_t)0xa235, (q15_t)0x5714, (q15_t)0xa230, (q15_t)0x5710, (q15_t)0xa22c, + (q15_t)0x570b, (q15_t)0xa228, (q15_t)0x5706, (q15_t)0xa224, (q15_t)0x5702, (q15_t)0xa21f, (q15_t)0x56fd, (q15_t)0xa21b, + (q15_t)0x56f9, (q15_t)0xa217, (q15_t)0x56f4, (q15_t)0xa212, (q15_t)0x56ef, (q15_t)0xa20e, (q15_t)0x56eb, (q15_t)0xa20a, + (q15_t)0x56e6, (q15_t)0xa206, (q15_t)0x56e2, (q15_t)0xa201, (q15_t)0x56dd, (q15_t)0xa1fd, (q15_t)0x56d8, (q15_t)0xa1f9, + (q15_t)0x56d4, (q15_t)0xa1f5, (q15_t)0x56cf, (q15_t)0xa1f0, (q15_t)0x56ca, (q15_t)0xa1ec, (q15_t)0x56c6, (q15_t)0xa1e8, + (q15_t)0x56c1, (q15_t)0xa1e4, (q15_t)0x56bd, (q15_t)0xa1df, (q15_t)0x56b8, (q15_t)0xa1db, (q15_t)0x56b3, (q15_t)0xa1d7, + (q15_t)0x56af, (q15_t)0xa1d3, (q15_t)0x56aa, (q15_t)0xa1ce, (q15_t)0x56a5, (q15_t)0xa1ca, (q15_t)0x56a1, (q15_t)0xa1c6, + (q15_t)0x569c, (q15_t)0xa1c1, (q15_t)0x5698, (q15_t)0xa1bd, (q15_t)0x5693, (q15_t)0xa1b9, (q15_t)0x568e, (q15_t)0xa1b5, + (q15_t)0x568a, (q15_t)0xa1b0, (q15_t)0x5685, (q15_t)0xa1ac, (q15_t)0x5680, (q15_t)0xa1a8, (q15_t)0x567c, (q15_t)0xa1a4, + (q15_t)0x5677, (q15_t)0xa1a0, (q15_t)0x5673, (q15_t)0xa19b, (q15_t)0x566e, (q15_t)0xa197, (q15_t)0x5669, (q15_t)0xa193, + (q15_t)0x5665, (q15_t)0xa18f, (q15_t)0x5660, (q15_t)0xa18a, (q15_t)0x565b, (q15_t)0xa186, (q15_t)0x5657, (q15_t)0xa182, + (q15_t)0x5652, (q15_t)0xa17e, (q15_t)0x564d, (q15_t)0xa179, (q15_t)0x5649, (q15_t)0xa175, (q15_t)0x5644, (q15_t)0xa171, + (q15_t)0x5640, (q15_t)0xa16d, (q15_t)0x563b, (q15_t)0xa168, (q15_t)0x5636, (q15_t)0xa164, (q15_t)0x5632, (q15_t)0xa160, + (q15_t)0x562d, (q15_t)0xa15c, (q15_t)0x5628, (q15_t)0xa157, (q15_t)0x5624, (q15_t)0xa153, (q15_t)0x561f, (q15_t)0xa14f, + (q15_t)0x561a, (q15_t)0xa14b, (q15_t)0x5616, (q15_t)0xa147, (q15_t)0x5611, (q15_t)0xa142, (q15_t)0x560c, (q15_t)0xa13e, + (q15_t)0x5608, (q15_t)0xa13a, (q15_t)0x5603, (q15_t)0xa136, (q15_t)0x55fe, (q15_t)0xa131, (q15_t)0x55fa, (q15_t)0xa12d, + (q15_t)0x55f5, (q15_t)0xa129, (q15_t)0x55f0, (q15_t)0xa125, (q15_t)0x55ec, (q15_t)0xa121, (q15_t)0x55e7, (q15_t)0xa11c, + (q15_t)0x55e3, (q15_t)0xa118, (q15_t)0x55de, (q15_t)0xa114, (q15_t)0x55d9, (q15_t)0xa110, (q15_t)0x55d5, (q15_t)0xa10b, + (q15_t)0x55d0, (q15_t)0xa107, (q15_t)0x55cb, (q15_t)0xa103, (q15_t)0x55c7, (q15_t)0xa0ff, (q15_t)0x55c2, (q15_t)0xa0fb, + (q15_t)0x55bd, (q15_t)0xa0f6, (q15_t)0x55b9, (q15_t)0xa0f2, (q15_t)0x55b4, (q15_t)0xa0ee, (q15_t)0x55af, (q15_t)0xa0ea, + (q15_t)0x55ab, (q15_t)0xa0e6, (q15_t)0x55a6, (q15_t)0xa0e1, (q15_t)0x55a1, (q15_t)0xa0dd, (q15_t)0x559d, (q15_t)0xa0d9, + (q15_t)0x5598, (q15_t)0xa0d5, (q15_t)0x5593, (q15_t)0xa0d1, (q15_t)0x558f, (q15_t)0xa0cc, (q15_t)0x558a, (q15_t)0xa0c8, + (q15_t)0x5585, (q15_t)0xa0c4, (q15_t)0x5581, (q15_t)0xa0c0, (q15_t)0x557c, (q15_t)0xa0bc, (q15_t)0x5577, (q15_t)0xa0b7, + (q15_t)0x5572, (q15_t)0xa0b3, (q15_t)0x556e, (q15_t)0xa0af, (q15_t)0x5569, (q15_t)0xa0ab, (q15_t)0x5564, (q15_t)0xa0a7, + (q15_t)0x5560, (q15_t)0xa0a2, (q15_t)0x555b, (q15_t)0xa09e, (q15_t)0x5556, (q15_t)0xa09a, (q15_t)0x5552, (q15_t)0xa096, + (q15_t)0x554d, (q15_t)0xa092, (q15_t)0x5548, (q15_t)0xa08e, (q15_t)0x5544, (q15_t)0xa089, (q15_t)0x553f, (q15_t)0xa085, + (q15_t)0x553a, (q15_t)0xa081, (q15_t)0x5536, (q15_t)0xa07d, (q15_t)0x5531, (q15_t)0xa079, (q15_t)0x552c, (q15_t)0xa074, + (q15_t)0x5528, (q15_t)0xa070, (q15_t)0x5523, (q15_t)0xa06c, (q15_t)0x551e, (q15_t)0xa068, (q15_t)0x5519, (q15_t)0xa064, + (q15_t)0x5515, (q15_t)0xa060, (q15_t)0x5510, (q15_t)0xa05b, (q15_t)0x550b, (q15_t)0xa057, (q15_t)0x5507, (q15_t)0xa053, + (q15_t)0x5502, (q15_t)0xa04f, (q15_t)0x54fd, (q15_t)0xa04b, (q15_t)0x54f9, (q15_t)0xa046, (q15_t)0x54f4, (q15_t)0xa042, + (q15_t)0x54ef, (q15_t)0xa03e, (q15_t)0x54ea, (q15_t)0xa03a, (q15_t)0x54e6, (q15_t)0xa036, (q15_t)0x54e1, (q15_t)0xa032, + (q15_t)0x54dc, (q15_t)0xa02d, (q15_t)0x54d8, (q15_t)0xa029, (q15_t)0x54d3, (q15_t)0xa025, (q15_t)0x54ce, (q15_t)0xa021, + (q15_t)0x54ca, (q15_t)0xa01d, (q15_t)0x54c5, (q15_t)0xa019, (q15_t)0x54c0, (q15_t)0xa014, (q15_t)0x54bb, (q15_t)0xa010, + (q15_t)0x54b7, (q15_t)0xa00c, (q15_t)0x54b2, (q15_t)0xa008, (q15_t)0x54ad, (q15_t)0xa004, (q15_t)0x54a9, (q15_t)0xa000, + (q15_t)0x54a4, (q15_t)0x9ffc, (q15_t)0x549f, (q15_t)0x9ff7, (q15_t)0x549a, (q15_t)0x9ff3, (q15_t)0x5496, (q15_t)0x9fef, + (q15_t)0x5491, (q15_t)0x9feb, (q15_t)0x548c, (q15_t)0x9fe7, (q15_t)0x5488, (q15_t)0x9fe3, (q15_t)0x5483, (q15_t)0x9fde, + (q15_t)0x547e, (q15_t)0x9fda, (q15_t)0x5479, (q15_t)0x9fd6, (q15_t)0x5475, (q15_t)0x9fd2, (q15_t)0x5470, (q15_t)0x9fce, + (q15_t)0x546b, (q15_t)0x9fca, (q15_t)0x5467, (q15_t)0x9fc6, (q15_t)0x5462, (q15_t)0x9fc1, (q15_t)0x545d, (q15_t)0x9fbd, + (q15_t)0x5458, (q15_t)0x9fb9, (q15_t)0x5454, (q15_t)0x9fb5, (q15_t)0x544f, (q15_t)0x9fb1, (q15_t)0x544a, (q15_t)0x9fad, + (q15_t)0x5445, (q15_t)0x9fa9, (q15_t)0x5441, (q15_t)0x9fa4, (q15_t)0x543c, (q15_t)0x9fa0, (q15_t)0x5437, (q15_t)0x9f9c, + (q15_t)0x5433, (q15_t)0x9f98, (q15_t)0x542e, (q15_t)0x9f94, (q15_t)0x5429, (q15_t)0x9f90, (q15_t)0x5424, (q15_t)0x9f8c, + (q15_t)0x5420, (q15_t)0x9f88, (q15_t)0x541b, (q15_t)0x9f83, (q15_t)0x5416, (q15_t)0x9f7f, (q15_t)0x5411, (q15_t)0x9f7b, + (q15_t)0x540d, (q15_t)0x9f77, (q15_t)0x5408, (q15_t)0x9f73, (q15_t)0x5403, (q15_t)0x9f6f, (q15_t)0x53fe, (q15_t)0x9f6b, + (q15_t)0x53fa, (q15_t)0x9f67, (q15_t)0x53f5, (q15_t)0x9f62, (q15_t)0x53f0, (q15_t)0x9f5e, (q15_t)0x53eb, (q15_t)0x9f5a, + (q15_t)0x53e7, (q15_t)0x9f56, (q15_t)0x53e2, (q15_t)0x9f52, (q15_t)0x53dd, (q15_t)0x9f4e, (q15_t)0x53d8, (q15_t)0x9f4a, + (q15_t)0x53d4, (q15_t)0x9f46, (q15_t)0x53cf, (q15_t)0x9f41, (q15_t)0x53ca, (q15_t)0x9f3d, (q15_t)0x53c5, (q15_t)0x9f39, + (q15_t)0x53c1, (q15_t)0x9f35, (q15_t)0x53bc, (q15_t)0x9f31, (q15_t)0x53b7, (q15_t)0x9f2d, (q15_t)0x53b2, (q15_t)0x9f29, + (q15_t)0x53ae, (q15_t)0x9f25, (q15_t)0x53a9, (q15_t)0x9f21, (q15_t)0x53a4, (q15_t)0x9f1c, (q15_t)0x539f, (q15_t)0x9f18, + (q15_t)0x539b, (q15_t)0x9f14, (q15_t)0x5396, (q15_t)0x9f10, (q15_t)0x5391, (q15_t)0x9f0c, (q15_t)0x538c, (q15_t)0x9f08, + (q15_t)0x5388, (q15_t)0x9f04, (q15_t)0x5383, (q15_t)0x9f00, (q15_t)0x537e, (q15_t)0x9efc, (q15_t)0x5379, (q15_t)0x9ef8, + (q15_t)0x5375, (q15_t)0x9ef3, (q15_t)0x5370, (q15_t)0x9eef, (q15_t)0x536b, (q15_t)0x9eeb, (q15_t)0x5366, (q15_t)0x9ee7, + (q15_t)0x5362, (q15_t)0x9ee3, (q15_t)0x535d, (q15_t)0x9edf, (q15_t)0x5358, (q15_t)0x9edb, (q15_t)0x5353, (q15_t)0x9ed7, + (q15_t)0x534e, (q15_t)0x9ed3, (q15_t)0x534a, (q15_t)0x9ecf, (q15_t)0x5345, (q15_t)0x9ecb, (q15_t)0x5340, (q15_t)0x9ec6, + (q15_t)0x533b, (q15_t)0x9ec2, (q15_t)0x5337, (q15_t)0x9ebe, (q15_t)0x5332, (q15_t)0x9eba, (q15_t)0x532d, (q15_t)0x9eb6, + (q15_t)0x5328, (q15_t)0x9eb2, (q15_t)0x5323, (q15_t)0x9eae, (q15_t)0x531f, (q15_t)0x9eaa, (q15_t)0x531a, (q15_t)0x9ea6, + (q15_t)0x5315, (q15_t)0x9ea2, (q15_t)0x5310, (q15_t)0x9e9e, (q15_t)0x530c, (q15_t)0x9e9a, (q15_t)0x5307, (q15_t)0x9e95, + (q15_t)0x5302, (q15_t)0x9e91, (q15_t)0x52fd, (q15_t)0x9e8d, (q15_t)0x52f8, (q15_t)0x9e89, (q15_t)0x52f4, (q15_t)0x9e85, + (q15_t)0x52ef, (q15_t)0x9e81, (q15_t)0x52ea, (q15_t)0x9e7d, (q15_t)0x52e5, (q15_t)0x9e79, (q15_t)0x52e1, (q15_t)0x9e75, + (q15_t)0x52dc, (q15_t)0x9e71, (q15_t)0x52d7, (q15_t)0x9e6d, (q15_t)0x52d2, (q15_t)0x9e69, (q15_t)0x52cd, (q15_t)0x9e65, + (q15_t)0x52c9, (q15_t)0x9e61, (q15_t)0x52c4, (q15_t)0x9e5d, (q15_t)0x52bf, (q15_t)0x9e58, (q15_t)0x52ba, (q15_t)0x9e54, + (q15_t)0x52b5, (q15_t)0x9e50, (q15_t)0x52b1, (q15_t)0x9e4c, (q15_t)0x52ac, (q15_t)0x9e48, (q15_t)0x52a7, (q15_t)0x9e44, + (q15_t)0x52a2, (q15_t)0x9e40, (q15_t)0x529d, (q15_t)0x9e3c, (q15_t)0x5299, (q15_t)0x9e38, (q15_t)0x5294, (q15_t)0x9e34, + (q15_t)0x528f, (q15_t)0x9e30, (q15_t)0x528a, (q15_t)0x9e2c, (q15_t)0x5285, (q15_t)0x9e28, (q15_t)0x5281, (q15_t)0x9e24, + (q15_t)0x527c, (q15_t)0x9e20, (q15_t)0x5277, (q15_t)0x9e1c, (q15_t)0x5272, (q15_t)0x9e18, (q15_t)0x526d, (q15_t)0x9e14, + (q15_t)0x5269, (q15_t)0x9e0f, (q15_t)0x5264, (q15_t)0x9e0b, (q15_t)0x525f, (q15_t)0x9e07, (q15_t)0x525a, (q15_t)0x9e03, + (q15_t)0x5255, (q15_t)0x9dff, (q15_t)0x5251, (q15_t)0x9dfb, (q15_t)0x524c, (q15_t)0x9df7, (q15_t)0x5247, (q15_t)0x9df3, + (q15_t)0x5242, (q15_t)0x9def, (q15_t)0x523d, (q15_t)0x9deb, (q15_t)0x5238, (q15_t)0x9de7, (q15_t)0x5234, (q15_t)0x9de3, + (q15_t)0x522f, (q15_t)0x9ddf, (q15_t)0x522a, (q15_t)0x9ddb, (q15_t)0x5225, (q15_t)0x9dd7, (q15_t)0x5220, (q15_t)0x9dd3, + (q15_t)0x521c, (q15_t)0x9dcf, (q15_t)0x5217, (q15_t)0x9dcb, (q15_t)0x5212, (q15_t)0x9dc7, (q15_t)0x520d, (q15_t)0x9dc3, + (q15_t)0x5208, (q15_t)0x9dbf, (q15_t)0x5203, (q15_t)0x9dbb, (q15_t)0x51ff, (q15_t)0x9db7, (q15_t)0x51fa, (q15_t)0x9db3, + (q15_t)0x51f5, (q15_t)0x9daf, (q15_t)0x51f0, (q15_t)0x9dab, (q15_t)0x51eb, (q15_t)0x9da7, (q15_t)0x51e6, (q15_t)0x9da3, + (q15_t)0x51e2, (q15_t)0x9d9f, (q15_t)0x51dd, (q15_t)0x9d9b, (q15_t)0x51d8, (q15_t)0x9d97, (q15_t)0x51d3, (q15_t)0x9d93, + (q15_t)0x51ce, (q15_t)0x9d8f, (q15_t)0x51c9, (q15_t)0x9d8b, (q15_t)0x51c5, (q15_t)0x9d86, (q15_t)0x51c0, (q15_t)0x9d82, + (q15_t)0x51bb, (q15_t)0x9d7e, (q15_t)0x51b6, (q15_t)0x9d7a, (q15_t)0x51b1, (q15_t)0x9d76, (q15_t)0x51ac, (q15_t)0x9d72, + (q15_t)0x51a8, (q15_t)0x9d6e, (q15_t)0x51a3, (q15_t)0x9d6a, (q15_t)0x519e, (q15_t)0x9d66, (q15_t)0x5199, (q15_t)0x9d62, + (q15_t)0x5194, (q15_t)0x9d5e, (q15_t)0x518f, (q15_t)0x9d5a, (q15_t)0x518b, (q15_t)0x9d56, (q15_t)0x5186, (q15_t)0x9d52, + (q15_t)0x5181, (q15_t)0x9d4e, (q15_t)0x517c, (q15_t)0x9d4a, (q15_t)0x5177, (q15_t)0x9d46, (q15_t)0x5172, (q15_t)0x9d42, + (q15_t)0x516e, (q15_t)0x9d3e, (q15_t)0x5169, (q15_t)0x9d3a, (q15_t)0x5164, (q15_t)0x9d36, (q15_t)0x515f, (q15_t)0x9d32, + (q15_t)0x515a, (q15_t)0x9d2e, (q15_t)0x5155, (q15_t)0x9d2a, (q15_t)0x5150, (q15_t)0x9d26, (q15_t)0x514c, (q15_t)0x9d22, + (q15_t)0x5147, (q15_t)0x9d1e, (q15_t)0x5142, (q15_t)0x9d1a, (q15_t)0x513d, (q15_t)0x9d16, (q15_t)0x5138, (q15_t)0x9d12, + (q15_t)0x5133, (q15_t)0x9d0e, (q15_t)0x512e, (q15_t)0x9d0b, (q15_t)0x512a, (q15_t)0x9d07, (q15_t)0x5125, (q15_t)0x9d03, + (q15_t)0x5120, (q15_t)0x9cff, (q15_t)0x511b, (q15_t)0x9cfb, (q15_t)0x5116, (q15_t)0x9cf7, (q15_t)0x5111, (q15_t)0x9cf3, + (q15_t)0x510c, (q15_t)0x9cef, (q15_t)0x5108, (q15_t)0x9ceb, (q15_t)0x5103, (q15_t)0x9ce7, (q15_t)0x50fe, (q15_t)0x9ce3, + (q15_t)0x50f9, (q15_t)0x9cdf, (q15_t)0x50f4, (q15_t)0x9cdb, (q15_t)0x50ef, (q15_t)0x9cd7, (q15_t)0x50ea, (q15_t)0x9cd3, + (q15_t)0x50e5, (q15_t)0x9ccf, (q15_t)0x50e1, (q15_t)0x9ccb, (q15_t)0x50dc, (q15_t)0x9cc7, (q15_t)0x50d7, (q15_t)0x9cc3, + (q15_t)0x50d2, (q15_t)0x9cbf, (q15_t)0x50cd, (q15_t)0x9cbb, (q15_t)0x50c8, (q15_t)0x9cb7, (q15_t)0x50c3, (q15_t)0x9cb3, + (q15_t)0x50bf, (q15_t)0x9caf, (q15_t)0x50ba, (q15_t)0x9cab, (q15_t)0x50b5, (q15_t)0x9ca7, (q15_t)0x50b0, (q15_t)0x9ca3, + (q15_t)0x50ab, (q15_t)0x9c9f, (q15_t)0x50a6, (q15_t)0x9c9b, (q15_t)0x50a1, (q15_t)0x9c97, (q15_t)0x509c, (q15_t)0x9c93, + (q15_t)0x5097, (q15_t)0x9c8f, (q15_t)0x5093, (q15_t)0x9c8b, (q15_t)0x508e, (q15_t)0x9c88, (q15_t)0x5089, (q15_t)0x9c84, + (q15_t)0x5084, (q15_t)0x9c80, (q15_t)0x507f, (q15_t)0x9c7c, (q15_t)0x507a, (q15_t)0x9c78, (q15_t)0x5075, (q15_t)0x9c74, + (q15_t)0x5070, (q15_t)0x9c70, (q15_t)0x506c, (q15_t)0x9c6c, (q15_t)0x5067, (q15_t)0x9c68, (q15_t)0x5062, (q15_t)0x9c64, + (q15_t)0x505d, (q15_t)0x9c60, (q15_t)0x5058, (q15_t)0x9c5c, (q15_t)0x5053, (q15_t)0x9c58, (q15_t)0x504e, (q15_t)0x9c54, + (q15_t)0x5049, (q15_t)0x9c50, (q15_t)0x5044, (q15_t)0x9c4c, (q15_t)0x503f, (q15_t)0x9c48, (q15_t)0x503b, (q15_t)0x9c44, + (q15_t)0x5036, (q15_t)0x9c40, (q15_t)0x5031, (q15_t)0x9c3d, (q15_t)0x502c, (q15_t)0x9c39, (q15_t)0x5027, (q15_t)0x9c35, + (q15_t)0x5022, (q15_t)0x9c31, (q15_t)0x501d, (q15_t)0x9c2d, (q15_t)0x5018, (q15_t)0x9c29, (q15_t)0x5013, (q15_t)0x9c25, + (q15_t)0x500f, (q15_t)0x9c21, (q15_t)0x500a, (q15_t)0x9c1d, (q15_t)0x5005, (q15_t)0x9c19, (q15_t)0x5000, (q15_t)0x9c15, + (q15_t)0x4ffb, (q15_t)0x9c11, (q15_t)0x4ff6, (q15_t)0x9c0d, (q15_t)0x4ff1, (q15_t)0x9c09, (q15_t)0x4fec, (q15_t)0x9c06, + (q15_t)0x4fe7, (q15_t)0x9c02, (q15_t)0x4fe2, (q15_t)0x9bfe, (q15_t)0x4fdd, (q15_t)0x9bfa, (q15_t)0x4fd9, (q15_t)0x9bf6, + (q15_t)0x4fd4, (q15_t)0x9bf2, (q15_t)0x4fcf, (q15_t)0x9bee, (q15_t)0x4fca, (q15_t)0x9bea, (q15_t)0x4fc5, (q15_t)0x9be6, + (q15_t)0x4fc0, (q15_t)0x9be2, (q15_t)0x4fbb, (q15_t)0x9bde, (q15_t)0x4fb6, (q15_t)0x9bda, (q15_t)0x4fb1, (q15_t)0x9bd7, + (q15_t)0x4fac, (q15_t)0x9bd3, (q15_t)0x4fa7, (q15_t)0x9bcf, (q15_t)0x4fa2, (q15_t)0x9bcb, (q15_t)0x4f9e, (q15_t)0x9bc7, + (q15_t)0x4f99, (q15_t)0x9bc3, (q15_t)0x4f94, (q15_t)0x9bbf, (q15_t)0x4f8f, (q15_t)0x9bbb, (q15_t)0x4f8a, (q15_t)0x9bb7, + (q15_t)0x4f85, (q15_t)0x9bb3, (q15_t)0x4f80, (q15_t)0x9baf, (q15_t)0x4f7b, (q15_t)0x9bac, (q15_t)0x4f76, (q15_t)0x9ba8, + (q15_t)0x4f71, (q15_t)0x9ba4, (q15_t)0x4f6c, (q15_t)0x9ba0, (q15_t)0x4f67, (q15_t)0x9b9c, (q15_t)0x4f62, (q15_t)0x9b98, + (q15_t)0x4f5e, (q15_t)0x9b94, (q15_t)0x4f59, (q15_t)0x9b90, (q15_t)0x4f54, (q15_t)0x9b8c, (q15_t)0x4f4f, (q15_t)0x9b88, + (q15_t)0x4f4a, (q15_t)0x9b85, (q15_t)0x4f45, (q15_t)0x9b81, (q15_t)0x4f40, (q15_t)0x9b7d, (q15_t)0x4f3b, (q15_t)0x9b79, + (q15_t)0x4f36, (q15_t)0x9b75, (q15_t)0x4f31, (q15_t)0x9b71, (q15_t)0x4f2c, (q15_t)0x9b6d, (q15_t)0x4f27, (q15_t)0x9b69, + (q15_t)0x4f22, (q15_t)0x9b65, (q15_t)0x4f1d, (q15_t)0x9b62, (q15_t)0x4f18, (q15_t)0x9b5e, (q15_t)0x4f14, (q15_t)0x9b5a, + (q15_t)0x4f0f, (q15_t)0x9b56, (q15_t)0x4f0a, (q15_t)0x9b52, (q15_t)0x4f05, (q15_t)0x9b4e, (q15_t)0x4f00, (q15_t)0x9b4a, + (q15_t)0x4efb, (q15_t)0x9b46, (q15_t)0x4ef6, (q15_t)0x9b43, (q15_t)0x4ef1, (q15_t)0x9b3f, (q15_t)0x4eec, (q15_t)0x9b3b, + (q15_t)0x4ee7, (q15_t)0x9b37, (q15_t)0x4ee2, (q15_t)0x9b33, (q15_t)0x4edd, (q15_t)0x9b2f, (q15_t)0x4ed8, (q15_t)0x9b2b, + (q15_t)0x4ed3, (q15_t)0x9b27, (q15_t)0x4ece, (q15_t)0x9b24, (q15_t)0x4ec9, (q15_t)0x9b20, (q15_t)0x4ec4, (q15_t)0x9b1c, + (q15_t)0x4ebf, (q15_t)0x9b18, (q15_t)0x4eba, (q15_t)0x9b14, (q15_t)0x4eb6, (q15_t)0x9b10, (q15_t)0x4eb1, (q15_t)0x9b0c, + (q15_t)0x4eac, (q15_t)0x9b09, (q15_t)0x4ea7, (q15_t)0x9b05, (q15_t)0x4ea2, (q15_t)0x9b01, (q15_t)0x4e9d, (q15_t)0x9afd, + (q15_t)0x4e98, (q15_t)0x9af9, (q15_t)0x4e93, (q15_t)0x9af5, (q15_t)0x4e8e, (q15_t)0x9af1, (q15_t)0x4e89, (q15_t)0x9aed, + (q15_t)0x4e84, (q15_t)0x9aea, (q15_t)0x4e7f, (q15_t)0x9ae6, (q15_t)0x4e7a, (q15_t)0x9ae2, (q15_t)0x4e75, (q15_t)0x9ade, + (q15_t)0x4e70, (q15_t)0x9ada, (q15_t)0x4e6b, (q15_t)0x9ad6, (q15_t)0x4e66, (q15_t)0x9ad3, (q15_t)0x4e61, (q15_t)0x9acf, + (q15_t)0x4e5c, (q15_t)0x9acb, (q15_t)0x4e57, (q15_t)0x9ac7, (q15_t)0x4e52, (q15_t)0x9ac3, (q15_t)0x4e4d, (q15_t)0x9abf, + (q15_t)0x4e48, (q15_t)0x9abb, (q15_t)0x4e43, (q15_t)0x9ab8, (q15_t)0x4e3e, (q15_t)0x9ab4, (q15_t)0x4e39, (q15_t)0x9ab0, + (q15_t)0x4e34, (q15_t)0x9aac, (q15_t)0x4e2f, (q15_t)0x9aa8, (q15_t)0x4e2a, (q15_t)0x9aa4, (q15_t)0x4e26, (q15_t)0x9aa1, + (q15_t)0x4e21, (q15_t)0x9a9d, (q15_t)0x4e1c, (q15_t)0x9a99, (q15_t)0x4e17, (q15_t)0x9a95, (q15_t)0x4e12, (q15_t)0x9a91, + (q15_t)0x4e0d, (q15_t)0x9a8d, (q15_t)0x4e08, (q15_t)0x9a8a, (q15_t)0x4e03, (q15_t)0x9a86, (q15_t)0x4dfe, (q15_t)0x9a82, + (q15_t)0x4df9, (q15_t)0x9a7e, (q15_t)0x4df4, (q15_t)0x9a7a, (q15_t)0x4def, (q15_t)0x9a76, (q15_t)0x4dea, (q15_t)0x9a73, + (q15_t)0x4de5, (q15_t)0x9a6f, (q15_t)0x4de0, (q15_t)0x9a6b, (q15_t)0x4ddb, (q15_t)0x9a67, (q15_t)0x4dd6, (q15_t)0x9a63, + (q15_t)0x4dd1, (q15_t)0x9a60, (q15_t)0x4dcc, (q15_t)0x9a5c, (q15_t)0x4dc7, (q15_t)0x9a58, (q15_t)0x4dc2, (q15_t)0x9a54, + (q15_t)0x4dbd, (q15_t)0x9a50, (q15_t)0x4db8, (q15_t)0x9a4c, (q15_t)0x4db3, (q15_t)0x9a49, (q15_t)0x4dae, (q15_t)0x9a45, + (q15_t)0x4da9, (q15_t)0x9a41, (q15_t)0x4da4, (q15_t)0x9a3d, (q15_t)0x4d9f, (q15_t)0x9a39, (q15_t)0x4d9a, (q15_t)0x9a36, + (q15_t)0x4d95, (q15_t)0x9a32, (q15_t)0x4d90, (q15_t)0x9a2e, (q15_t)0x4d8b, (q15_t)0x9a2a, (q15_t)0x4d86, (q15_t)0x9a26, + (q15_t)0x4d81, (q15_t)0x9a23, (q15_t)0x4d7c, (q15_t)0x9a1f, (q15_t)0x4d77, (q15_t)0x9a1b, (q15_t)0x4d72, (q15_t)0x9a17, + (q15_t)0x4d6d, (q15_t)0x9a13, (q15_t)0x4d68, (q15_t)0x9a10, (q15_t)0x4d63, (q15_t)0x9a0c, (q15_t)0x4d5e, (q15_t)0x9a08, + (q15_t)0x4d59, (q15_t)0x9a04, (q15_t)0x4d54, (q15_t)0x9a00, (q15_t)0x4d4f, (q15_t)0x99fd, (q15_t)0x4d4a, (q15_t)0x99f9, + (q15_t)0x4d45, (q15_t)0x99f5, (q15_t)0x4d40, (q15_t)0x99f1, (q15_t)0x4d3b, (q15_t)0x99ed, (q15_t)0x4d36, (q15_t)0x99ea, + (q15_t)0x4d31, (q15_t)0x99e6, (q15_t)0x4d2c, (q15_t)0x99e2, (q15_t)0x4d27, (q15_t)0x99de, (q15_t)0x4d22, (q15_t)0x99da, + (q15_t)0x4d1d, (q15_t)0x99d7, (q15_t)0x4d18, (q15_t)0x99d3, (q15_t)0x4d13, (q15_t)0x99cf, (q15_t)0x4d0e, (q15_t)0x99cb, + (q15_t)0x4d09, (q15_t)0x99c7, (q15_t)0x4d04, (q15_t)0x99c4, (q15_t)0x4cff, (q15_t)0x99c0, (q15_t)0x4cfa, (q15_t)0x99bc, + (q15_t)0x4cf5, (q15_t)0x99b8, (q15_t)0x4cf0, (q15_t)0x99b5, (q15_t)0x4ceb, (q15_t)0x99b1, (q15_t)0x4ce6, (q15_t)0x99ad, + (q15_t)0x4ce1, (q15_t)0x99a9, (q15_t)0x4cdb, (q15_t)0x99a5, (q15_t)0x4cd6, (q15_t)0x99a2, (q15_t)0x4cd1, (q15_t)0x999e, + (q15_t)0x4ccc, (q15_t)0x999a, (q15_t)0x4cc7, (q15_t)0x9996, (q15_t)0x4cc2, (q15_t)0x9993, (q15_t)0x4cbd, (q15_t)0x998f, + (q15_t)0x4cb8, (q15_t)0x998b, (q15_t)0x4cb3, (q15_t)0x9987, (q15_t)0x4cae, (q15_t)0x9984, (q15_t)0x4ca9, (q15_t)0x9980, + (q15_t)0x4ca4, (q15_t)0x997c, (q15_t)0x4c9f, (q15_t)0x9978, (q15_t)0x4c9a, (q15_t)0x9975, (q15_t)0x4c95, (q15_t)0x9971, + (q15_t)0x4c90, (q15_t)0x996d, (q15_t)0x4c8b, (q15_t)0x9969, (q15_t)0x4c86, (q15_t)0x9965, (q15_t)0x4c81, (q15_t)0x9962, + (q15_t)0x4c7c, (q15_t)0x995e, (q15_t)0x4c77, (q15_t)0x995a, (q15_t)0x4c72, (q15_t)0x9956, (q15_t)0x4c6d, (q15_t)0x9953, + (q15_t)0x4c68, (q15_t)0x994f, (q15_t)0x4c63, (q15_t)0x994b, (q15_t)0x4c5e, (q15_t)0x9947, (q15_t)0x4c59, (q15_t)0x9944, + (q15_t)0x4c54, (q15_t)0x9940, (q15_t)0x4c4f, (q15_t)0x993c, (q15_t)0x4c49, (q15_t)0x9938, (q15_t)0x4c44, (q15_t)0x9935, + (q15_t)0x4c3f, (q15_t)0x9931, (q15_t)0x4c3a, (q15_t)0x992d, (q15_t)0x4c35, (q15_t)0x992a, (q15_t)0x4c30, (q15_t)0x9926, + (q15_t)0x4c2b, (q15_t)0x9922, (q15_t)0x4c26, (q15_t)0x991e, (q15_t)0x4c21, (q15_t)0x991b, (q15_t)0x4c1c, (q15_t)0x9917, + (q15_t)0x4c17, (q15_t)0x9913, (q15_t)0x4c12, (q15_t)0x990f, (q15_t)0x4c0d, (q15_t)0x990c, (q15_t)0x4c08, (q15_t)0x9908, + (q15_t)0x4c03, (q15_t)0x9904, (q15_t)0x4bfe, (q15_t)0x9900, (q15_t)0x4bf9, (q15_t)0x98fd, (q15_t)0x4bf4, (q15_t)0x98f9, + (q15_t)0x4bef, (q15_t)0x98f5, (q15_t)0x4be9, (q15_t)0x98f2, (q15_t)0x4be4, (q15_t)0x98ee, (q15_t)0x4bdf, (q15_t)0x98ea, + (q15_t)0x4bda, (q15_t)0x98e6, (q15_t)0x4bd5, (q15_t)0x98e3, (q15_t)0x4bd0, (q15_t)0x98df, (q15_t)0x4bcb, (q15_t)0x98db, + (q15_t)0x4bc6, (q15_t)0x98d7, (q15_t)0x4bc1, (q15_t)0x98d4, (q15_t)0x4bbc, (q15_t)0x98d0, (q15_t)0x4bb7, (q15_t)0x98cc, + (q15_t)0x4bb2, (q15_t)0x98c9, (q15_t)0x4bad, (q15_t)0x98c5, (q15_t)0x4ba8, (q15_t)0x98c1, (q15_t)0x4ba3, (q15_t)0x98bd, + (q15_t)0x4b9e, (q15_t)0x98ba, (q15_t)0x4b98, (q15_t)0x98b6, (q15_t)0x4b93, (q15_t)0x98b2, (q15_t)0x4b8e, (q15_t)0x98af, + (q15_t)0x4b89, (q15_t)0x98ab, (q15_t)0x4b84, (q15_t)0x98a7, (q15_t)0x4b7f, (q15_t)0x98a3, (q15_t)0x4b7a, (q15_t)0x98a0, + (q15_t)0x4b75, (q15_t)0x989c, (q15_t)0x4b70, (q15_t)0x9898, (q15_t)0x4b6b, (q15_t)0x9895, (q15_t)0x4b66, (q15_t)0x9891, + (q15_t)0x4b61, (q15_t)0x988d, (q15_t)0x4b5c, (q15_t)0x988a, (q15_t)0x4b56, (q15_t)0x9886, (q15_t)0x4b51, (q15_t)0x9882, + (q15_t)0x4b4c, (q15_t)0x987e, (q15_t)0x4b47, (q15_t)0x987b, (q15_t)0x4b42, (q15_t)0x9877, (q15_t)0x4b3d, (q15_t)0x9873, + (q15_t)0x4b38, (q15_t)0x9870, (q15_t)0x4b33, (q15_t)0x986c, (q15_t)0x4b2e, (q15_t)0x9868, (q15_t)0x4b29, (q15_t)0x9865, + (q15_t)0x4b24, (q15_t)0x9861, (q15_t)0x4b1f, (q15_t)0x985d, (q15_t)0x4b19, (q15_t)0x985a, (q15_t)0x4b14, (q15_t)0x9856, + (q15_t)0x4b0f, (q15_t)0x9852, (q15_t)0x4b0a, (q15_t)0x984e, (q15_t)0x4b05, (q15_t)0x984b, (q15_t)0x4b00, (q15_t)0x9847, + (q15_t)0x4afb, (q15_t)0x9843, (q15_t)0x4af6, (q15_t)0x9840, (q15_t)0x4af1, (q15_t)0x983c, (q15_t)0x4aec, (q15_t)0x9838, + (q15_t)0x4ae7, (q15_t)0x9835, (q15_t)0x4ae1, (q15_t)0x9831, (q15_t)0x4adc, (q15_t)0x982d, (q15_t)0x4ad7, (q15_t)0x982a, + (q15_t)0x4ad2, (q15_t)0x9826, (q15_t)0x4acd, (q15_t)0x9822, (q15_t)0x4ac8, (q15_t)0x981f, (q15_t)0x4ac3, (q15_t)0x981b, + (q15_t)0x4abe, (q15_t)0x9817, (q15_t)0x4ab9, (q15_t)0x9814, (q15_t)0x4ab4, (q15_t)0x9810, (q15_t)0x4aae, (q15_t)0x980c, + (q15_t)0x4aa9, (q15_t)0x9809, (q15_t)0x4aa4, (q15_t)0x9805, (q15_t)0x4a9f, (q15_t)0x9801, (q15_t)0x4a9a, (q15_t)0x97fe, + (q15_t)0x4a95, (q15_t)0x97fa, (q15_t)0x4a90, (q15_t)0x97f6, (q15_t)0x4a8b, (q15_t)0x97f3, (q15_t)0x4a86, (q15_t)0x97ef, + (q15_t)0x4a81, (q15_t)0x97eb, (q15_t)0x4a7b, (q15_t)0x97e8, (q15_t)0x4a76, (q15_t)0x97e4, (q15_t)0x4a71, (q15_t)0x97e0, + (q15_t)0x4a6c, (q15_t)0x97dd, (q15_t)0x4a67, (q15_t)0x97d9, (q15_t)0x4a62, (q15_t)0x97d5, (q15_t)0x4a5d, (q15_t)0x97d2, + (q15_t)0x4a58, (q15_t)0x97ce, (q15_t)0x4a52, (q15_t)0x97cb, (q15_t)0x4a4d, (q15_t)0x97c7, (q15_t)0x4a48, (q15_t)0x97c3, + (q15_t)0x4a43, (q15_t)0x97c0, (q15_t)0x4a3e, (q15_t)0x97bc, (q15_t)0x4a39, (q15_t)0x97b8, (q15_t)0x4a34, (q15_t)0x97b5, + (q15_t)0x4a2f, (q15_t)0x97b1, (q15_t)0x4a2a, (q15_t)0x97ad, (q15_t)0x4a24, (q15_t)0x97aa, (q15_t)0x4a1f, (q15_t)0x97a6, + (q15_t)0x4a1a, (q15_t)0x97a2, (q15_t)0x4a15, (q15_t)0x979f, (q15_t)0x4a10, (q15_t)0x979b, (q15_t)0x4a0b, (q15_t)0x9798, + (q15_t)0x4a06, (q15_t)0x9794, (q15_t)0x4a01, (q15_t)0x9790, (q15_t)0x49fb, (q15_t)0x978d, (q15_t)0x49f6, (q15_t)0x9789, + (q15_t)0x49f1, (q15_t)0x9785, (q15_t)0x49ec, (q15_t)0x9782, (q15_t)0x49e7, (q15_t)0x977e, (q15_t)0x49e2, (q15_t)0x977a, + (q15_t)0x49dd, (q15_t)0x9777, (q15_t)0x49d8, (q15_t)0x9773, (q15_t)0x49d2, (q15_t)0x9770, (q15_t)0x49cd, (q15_t)0x976c, + (q15_t)0x49c8, (q15_t)0x9768, (q15_t)0x49c3, (q15_t)0x9765, (q15_t)0x49be, (q15_t)0x9761, (q15_t)0x49b9, (q15_t)0x975d, + (q15_t)0x49b4, (q15_t)0x975a, (q15_t)0x49ae, (q15_t)0x9756, (q15_t)0x49a9, (q15_t)0x9753, (q15_t)0x49a4, (q15_t)0x974f, + (q15_t)0x499f, (q15_t)0x974b, (q15_t)0x499a, (q15_t)0x9748, (q15_t)0x4995, (q15_t)0x9744, (q15_t)0x4990, (q15_t)0x9741, + (q15_t)0x498a, (q15_t)0x973d, (q15_t)0x4985, (q15_t)0x9739, (q15_t)0x4980, (q15_t)0x9736, (q15_t)0x497b, (q15_t)0x9732, + (q15_t)0x4976, (q15_t)0x972f, (q15_t)0x4971, (q15_t)0x972b, (q15_t)0x496c, (q15_t)0x9727, (q15_t)0x4966, (q15_t)0x9724, + (q15_t)0x4961, (q15_t)0x9720, (q15_t)0x495c, (q15_t)0x971d, (q15_t)0x4957, (q15_t)0x9719, (q15_t)0x4952, (q15_t)0x9715, + (q15_t)0x494d, (q15_t)0x9712, (q15_t)0x4948, (q15_t)0x970e, (q15_t)0x4942, (q15_t)0x970b, (q15_t)0x493d, (q15_t)0x9707, + (q15_t)0x4938, (q15_t)0x9703, (q15_t)0x4933, (q15_t)0x9700, (q15_t)0x492e, (q15_t)0x96fc, (q15_t)0x4929, (q15_t)0x96f9, + (q15_t)0x4923, (q15_t)0x96f5, (q15_t)0x491e, (q15_t)0x96f1, (q15_t)0x4919, (q15_t)0x96ee, (q15_t)0x4914, (q15_t)0x96ea, + (q15_t)0x490f, (q15_t)0x96e7, (q15_t)0x490a, (q15_t)0x96e3, (q15_t)0x4905, (q15_t)0x96df, (q15_t)0x48ff, (q15_t)0x96dc, + (q15_t)0x48fa, (q15_t)0x96d8, (q15_t)0x48f5, (q15_t)0x96d5, (q15_t)0x48f0, (q15_t)0x96d1, (q15_t)0x48eb, (q15_t)0x96ce, + (q15_t)0x48e6, (q15_t)0x96ca, (q15_t)0x48e0, (q15_t)0x96c6, (q15_t)0x48db, (q15_t)0x96c3, (q15_t)0x48d6, (q15_t)0x96bf, + (q15_t)0x48d1, (q15_t)0x96bc, (q15_t)0x48cc, (q15_t)0x96b8, (q15_t)0x48c7, (q15_t)0x96b5, (q15_t)0x48c1, (q15_t)0x96b1, + (q15_t)0x48bc, (q15_t)0x96ad, (q15_t)0x48b7, (q15_t)0x96aa, (q15_t)0x48b2, (q15_t)0x96a6, (q15_t)0x48ad, (q15_t)0x96a3, + (q15_t)0x48a8, (q15_t)0x969f, (q15_t)0x48a2, (q15_t)0x969c, (q15_t)0x489d, (q15_t)0x9698, (q15_t)0x4898, (q15_t)0x9694, + (q15_t)0x4893, (q15_t)0x9691, (q15_t)0x488e, (q15_t)0x968d, (q15_t)0x4888, (q15_t)0x968a, (q15_t)0x4883, (q15_t)0x9686, + (q15_t)0x487e, (q15_t)0x9683, (q15_t)0x4879, (q15_t)0x967f, (q15_t)0x4874, (q15_t)0x967b, (q15_t)0x486f, (q15_t)0x9678, + (q15_t)0x4869, (q15_t)0x9674, (q15_t)0x4864, (q15_t)0x9671, (q15_t)0x485f, (q15_t)0x966d, (q15_t)0x485a, (q15_t)0x966a, + (q15_t)0x4855, (q15_t)0x9666, (q15_t)0x484f, (q15_t)0x9663, (q15_t)0x484a, (q15_t)0x965f, (q15_t)0x4845, (q15_t)0x965b, + (q15_t)0x4840, (q15_t)0x9658, (q15_t)0x483b, (q15_t)0x9654, (q15_t)0x4836, (q15_t)0x9651, (q15_t)0x4830, (q15_t)0x964d, + (q15_t)0x482b, (q15_t)0x964a, (q15_t)0x4826, (q15_t)0x9646, (q15_t)0x4821, (q15_t)0x9643, (q15_t)0x481c, (q15_t)0x963f, + (q15_t)0x4816, (q15_t)0x963c, (q15_t)0x4811, (q15_t)0x9638, (q15_t)0x480c, (q15_t)0x9635, (q15_t)0x4807, (q15_t)0x9631, + (q15_t)0x4802, (q15_t)0x962d, (q15_t)0x47fc, (q15_t)0x962a, (q15_t)0x47f7, (q15_t)0x9626, (q15_t)0x47f2, (q15_t)0x9623, + (q15_t)0x47ed, (q15_t)0x961f, (q15_t)0x47e8, (q15_t)0x961c, (q15_t)0x47e2, (q15_t)0x9618, (q15_t)0x47dd, (q15_t)0x9615, + (q15_t)0x47d8, (q15_t)0x9611, (q15_t)0x47d3, (q15_t)0x960e, (q15_t)0x47ce, (q15_t)0x960a, (q15_t)0x47c8, (q15_t)0x9607, + (q15_t)0x47c3, (q15_t)0x9603, (q15_t)0x47be, (q15_t)0x9600, (q15_t)0x47b9, (q15_t)0x95fc, (q15_t)0x47b4, (q15_t)0x95f9, + (q15_t)0x47ae, (q15_t)0x95f5, (q15_t)0x47a9, (q15_t)0x95f2, (q15_t)0x47a4, (q15_t)0x95ee, (q15_t)0x479f, (q15_t)0x95ea, + (q15_t)0x479a, (q15_t)0x95e7, (q15_t)0x4794, (q15_t)0x95e3, (q15_t)0x478f, (q15_t)0x95e0, (q15_t)0x478a, (q15_t)0x95dc, + (q15_t)0x4785, (q15_t)0x95d9, (q15_t)0x4780, (q15_t)0x95d5, (q15_t)0x477a, (q15_t)0x95d2, (q15_t)0x4775, (q15_t)0x95ce, + (q15_t)0x4770, (q15_t)0x95cb, (q15_t)0x476b, (q15_t)0x95c7, (q15_t)0x4765, (q15_t)0x95c4, (q15_t)0x4760, (q15_t)0x95c0, + (q15_t)0x475b, (q15_t)0x95bd, (q15_t)0x4756, (q15_t)0x95b9, (q15_t)0x4751, (q15_t)0x95b6, (q15_t)0x474b, (q15_t)0x95b2, + (q15_t)0x4746, (q15_t)0x95af, (q15_t)0x4741, (q15_t)0x95ab, (q15_t)0x473c, (q15_t)0x95a8, (q15_t)0x4737, (q15_t)0x95a4, + (q15_t)0x4731, (q15_t)0x95a1, (q15_t)0x472c, (q15_t)0x959d, (q15_t)0x4727, (q15_t)0x959a, (q15_t)0x4722, (q15_t)0x9596, + (q15_t)0x471c, (q15_t)0x9593, (q15_t)0x4717, (q15_t)0x958f, (q15_t)0x4712, (q15_t)0x958c, (q15_t)0x470d, (q15_t)0x9588, + (q15_t)0x4708, (q15_t)0x9585, (q15_t)0x4702, (q15_t)0x9581, (q15_t)0x46fd, (q15_t)0x957e, (q15_t)0x46f8, (q15_t)0x957a, + (q15_t)0x46f3, (q15_t)0x9577, (q15_t)0x46ed, (q15_t)0x9574, (q15_t)0x46e8, (q15_t)0x9570, (q15_t)0x46e3, (q15_t)0x956d, + (q15_t)0x46de, (q15_t)0x9569, (q15_t)0x46d8, (q15_t)0x9566, (q15_t)0x46d3, (q15_t)0x9562, (q15_t)0x46ce, (q15_t)0x955f, + (q15_t)0x46c9, (q15_t)0x955b, (q15_t)0x46c4, (q15_t)0x9558, (q15_t)0x46be, (q15_t)0x9554, (q15_t)0x46b9, (q15_t)0x9551, + (q15_t)0x46b4, (q15_t)0x954d, (q15_t)0x46af, (q15_t)0x954a, (q15_t)0x46a9, (q15_t)0x9546, (q15_t)0x46a4, (q15_t)0x9543, + (q15_t)0x469f, (q15_t)0x953f, (q15_t)0x469a, (q15_t)0x953c, (q15_t)0x4694, (q15_t)0x9538, (q15_t)0x468f, (q15_t)0x9535, + (q15_t)0x468a, (q15_t)0x9532, (q15_t)0x4685, (q15_t)0x952e, (q15_t)0x467f, (q15_t)0x952b, (q15_t)0x467a, (q15_t)0x9527, + (q15_t)0x4675, (q15_t)0x9524, (q15_t)0x4670, (q15_t)0x9520, (q15_t)0x466a, (q15_t)0x951d, (q15_t)0x4665, (q15_t)0x9519, + (q15_t)0x4660, (q15_t)0x9516, (q15_t)0x465b, (q15_t)0x9512, (q15_t)0x4655, (q15_t)0x950f, (q15_t)0x4650, (q15_t)0x950c, + (q15_t)0x464b, (q15_t)0x9508, (q15_t)0x4646, (q15_t)0x9505, (q15_t)0x4640, (q15_t)0x9501, (q15_t)0x463b, (q15_t)0x94fe, + (q15_t)0x4636, (q15_t)0x94fa, (q15_t)0x4631, (q15_t)0x94f7, (q15_t)0x462b, (q15_t)0x94f3, (q15_t)0x4626, (q15_t)0x94f0, + (q15_t)0x4621, (q15_t)0x94ed, (q15_t)0x461c, (q15_t)0x94e9, (q15_t)0x4616, (q15_t)0x94e6, (q15_t)0x4611, (q15_t)0x94e2, + (q15_t)0x460c, (q15_t)0x94df, (q15_t)0x4607, (q15_t)0x94db, (q15_t)0x4601, (q15_t)0x94d8, (q15_t)0x45fc, (q15_t)0x94d4, + (q15_t)0x45f7, (q15_t)0x94d1, (q15_t)0x45f2, (q15_t)0x94ce, (q15_t)0x45ec, (q15_t)0x94ca, (q15_t)0x45e7, (q15_t)0x94c7, + (q15_t)0x45e2, (q15_t)0x94c3, (q15_t)0x45dd, (q15_t)0x94c0, (q15_t)0x45d7, (q15_t)0x94bc, (q15_t)0x45d2, (q15_t)0x94b9, + (q15_t)0x45cd, (q15_t)0x94b6, (q15_t)0x45c7, (q15_t)0x94b2, (q15_t)0x45c2, (q15_t)0x94af, (q15_t)0x45bd, (q15_t)0x94ab, + (q15_t)0x45b8, (q15_t)0x94a8, (q15_t)0x45b2, (q15_t)0x94a4, (q15_t)0x45ad, (q15_t)0x94a1, (q15_t)0x45a8, (q15_t)0x949e, + (q15_t)0x45a3, (q15_t)0x949a, (q15_t)0x459d, (q15_t)0x9497, (q15_t)0x4598, (q15_t)0x9493, (q15_t)0x4593, (q15_t)0x9490, + (q15_t)0x458d, (q15_t)0x948d, (q15_t)0x4588, (q15_t)0x9489, (q15_t)0x4583, (q15_t)0x9486, (q15_t)0x457e, (q15_t)0x9482, + (q15_t)0x4578, (q15_t)0x947f, (q15_t)0x4573, (q15_t)0x947b, (q15_t)0x456e, (q15_t)0x9478, (q15_t)0x4569, (q15_t)0x9475, + (q15_t)0x4563, (q15_t)0x9471, (q15_t)0x455e, (q15_t)0x946e, (q15_t)0x4559, (q15_t)0x946a, (q15_t)0x4553, (q15_t)0x9467, + (q15_t)0x454e, (q15_t)0x9464, (q15_t)0x4549, (q15_t)0x9460, (q15_t)0x4544, (q15_t)0x945d, (q15_t)0x453e, (q15_t)0x9459, + (q15_t)0x4539, (q15_t)0x9456, (q15_t)0x4534, (q15_t)0x9453, (q15_t)0x452e, (q15_t)0x944f, (q15_t)0x4529, (q15_t)0x944c, + (q15_t)0x4524, (q15_t)0x9448, (q15_t)0x451f, (q15_t)0x9445, (q15_t)0x4519, (q15_t)0x9442, (q15_t)0x4514, (q15_t)0x943e, + (q15_t)0x450f, (q15_t)0x943b, (q15_t)0x4509, (q15_t)0x9437, (q15_t)0x4504, (q15_t)0x9434, (q15_t)0x44ff, (q15_t)0x9431, + (q15_t)0x44fa, (q15_t)0x942d, (q15_t)0x44f4, (q15_t)0x942a, (q15_t)0x44ef, (q15_t)0x9427, (q15_t)0x44ea, (q15_t)0x9423, + (q15_t)0x44e4, (q15_t)0x9420, (q15_t)0x44df, (q15_t)0x941c, (q15_t)0x44da, (q15_t)0x9419, (q15_t)0x44d4, (q15_t)0x9416, + (q15_t)0x44cf, (q15_t)0x9412, (q15_t)0x44ca, (q15_t)0x940f, (q15_t)0x44c5, (q15_t)0x940b, (q15_t)0x44bf, (q15_t)0x9408, + (q15_t)0x44ba, (q15_t)0x9405, (q15_t)0x44b5, (q15_t)0x9401, (q15_t)0x44af, (q15_t)0x93fe, (q15_t)0x44aa, (q15_t)0x93fb, + (q15_t)0x44a5, (q15_t)0x93f7, (q15_t)0x449f, (q15_t)0x93f4, (q15_t)0x449a, (q15_t)0x93f1, (q15_t)0x4495, (q15_t)0x93ed, + (q15_t)0x4490, (q15_t)0x93ea, (q15_t)0x448a, (q15_t)0x93e6, (q15_t)0x4485, (q15_t)0x93e3, (q15_t)0x4480, (q15_t)0x93e0, + (q15_t)0x447a, (q15_t)0x93dc, (q15_t)0x4475, (q15_t)0x93d9, (q15_t)0x4470, (q15_t)0x93d6, (q15_t)0x446a, (q15_t)0x93d2, + (q15_t)0x4465, (q15_t)0x93cf, (q15_t)0x4460, (q15_t)0x93cc, (q15_t)0x445a, (q15_t)0x93c8, (q15_t)0x4455, (q15_t)0x93c5, + (q15_t)0x4450, (q15_t)0x93c1, (q15_t)0x444b, (q15_t)0x93be, (q15_t)0x4445, (q15_t)0x93bb, (q15_t)0x4440, (q15_t)0x93b7, + (q15_t)0x443b, (q15_t)0x93b4, (q15_t)0x4435, (q15_t)0x93b1, (q15_t)0x4430, (q15_t)0x93ad, (q15_t)0x442b, (q15_t)0x93aa, + (q15_t)0x4425, (q15_t)0x93a7, (q15_t)0x4420, (q15_t)0x93a3, (q15_t)0x441b, (q15_t)0x93a0, (q15_t)0x4415, (q15_t)0x939d, + (q15_t)0x4410, (q15_t)0x9399, (q15_t)0x440b, (q15_t)0x9396, (q15_t)0x4405, (q15_t)0x9393, (q15_t)0x4400, (q15_t)0x938f, + (q15_t)0x43fb, (q15_t)0x938c, (q15_t)0x43f5, (q15_t)0x9389, (q15_t)0x43f0, (q15_t)0x9385, (q15_t)0x43eb, (q15_t)0x9382, + (q15_t)0x43e5, (q15_t)0x937f, (q15_t)0x43e0, (q15_t)0x937b, (q15_t)0x43db, (q15_t)0x9378, (q15_t)0x43d5, (q15_t)0x9375, + (q15_t)0x43d0, (q15_t)0x9371, (q15_t)0x43cb, (q15_t)0x936e, (q15_t)0x43c5, (q15_t)0x936b, (q15_t)0x43c0, (q15_t)0x9367, + (q15_t)0x43bb, (q15_t)0x9364, (q15_t)0x43b5, (q15_t)0x9361, (q15_t)0x43b0, (q15_t)0x935d, (q15_t)0x43ab, (q15_t)0x935a, + (q15_t)0x43a5, (q15_t)0x9357, (q15_t)0x43a0, (q15_t)0x9353, (q15_t)0x439b, (q15_t)0x9350, (q15_t)0x4395, (q15_t)0x934d, + (q15_t)0x4390, (q15_t)0x9349, (q15_t)0x438b, (q15_t)0x9346, (q15_t)0x4385, (q15_t)0x9343, (q15_t)0x4380, (q15_t)0x933f, + (q15_t)0x437b, (q15_t)0x933c, (q15_t)0x4375, (q15_t)0x9339, (q15_t)0x4370, (q15_t)0x9336, (q15_t)0x436b, (q15_t)0x9332, + (q15_t)0x4365, (q15_t)0x932f, (q15_t)0x4360, (q15_t)0x932c, (q15_t)0x435b, (q15_t)0x9328, (q15_t)0x4355, (q15_t)0x9325, + (q15_t)0x4350, (q15_t)0x9322, (q15_t)0x434b, (q15_t)0x931e, (q15_t)0x4345, (q15_t)0x931b, (q15_t)0x4340, (q15_t)0x9318, + (q15_t)0x433b, (q15_t)0x9314, (q15_t)0x4335, (q15_t)0x9311, (q15_t)0x4330, (q15_t)0x930e, (q15_t)0x432b, (q15_t)0x930b, + (q15_t)0x4325, (q15_t)0x9307, (q15_t)0x4320, (q15_t)0x9304, (q15_t)0x431b, (q15_t)0x9301, (q15_t)0x4315, (q15_t)0x92fd, + (q15_t)0x4310, (q15_t)0x92fa, (q15_t)0x430b, (q15_t)0x92f7, (q15_t)0x4305, (q15_t)0x92f4, (q15_t)0x4300, (q15_t)0x92f0, + (q15_t)0x42fa, (q15_t)0x92ed, (q15_t)0x42f5, (q15_t)0x92ea, (q15_t)0x42f0, (q15_t)0x92e6, (q15_t)0x42ea, (q15_t)0x92e3, + (q15_t)0x42e5, (q15_t)0x92e0, (q15_t)0x42e0, (q15_t)0x92dd, (q15_t)0x42da, (q15_t)0x92d9, (q15_t)0x42d5, (q15_t)0x92d6, + (q15_t)0x42d0, (q15_t)0x92d3, (q15_t)0x42ca, (q15_t)0x92cf, (q15_t)0x42c5, (q15_t)0x92cc, (q15_t)0x42c0, (q15_t)0x92c9, + (q15_t)0x42ba, (q15_t)0x92c6, (q15_t)0x42b5, (q15_t)0x92c2, (q15_t)0x42af, (q15_t)0x92bf, (q15_t)0x42aa, (q15_t)0x92bc, + (q15_t)0x42a5, (q15_t)0x92b8, (q15_t)0x429f, (q15_t)0x92b5, (q15_t)0x429a, (q15_t)0x92b2, (q15_t)0x4295, (q15_t)0x92af, + (q15_t)0x428f, (q15_t)0x92ab, (q15_t)0x428a, (q15_t)0x92a8, (q15_t)0x4284, (q15_t)0x92a5, (q15_t)0x427f, (q15_t)0x92a2, + (q15_t)0x427a, (q15_t)0x929e, (q15_t)0x4274, (q15_t)0x929b, (q15_t)0x426f, (q15_t)0x9298, (q15_t)0x426a, (q15_t)0x9295, + (q15_t)0x4264, (q15_t)0x9291, (q15_t)0x425f, (q15_t)0x928e, (q15_t)0x425a, (q15_t)0x928b, (q15_t)0x4254, (q15_t)0x9288, + (q15_t)0x424f, (q15_t)0x9284, (q15_t)0x4249, (q15_t)0x9281, (q15_t)0x4244, (q15_t)0x927e, (q15_t)0x423f, (q15_t)0x927b, + (q15_t)0x4239, (q15_t)0x9277, (q15_t)0x4234, (q15_t)0x9274, (q15_t)0x422f, (q15_t)0x9271, (q15_t)0x4229, (q15_t)0x926e, + (q15_t)0x4224, (q15_t)0x926a, (q15_t)0x421e, (q15_t)0x9267, (q15_t)0x4219, (q15_t)0x9264, (q15_t)0x4214, (q15_t)0x9261, + (q15_t)0x420e, (q15_t)0x925d, (q15_t)0x4209, (q15_t)0x925a, (q15_t)0x4203, (q15_t)0x9257, (q15_t)0x41fe, (q15_t)0x9254, + (q15_t)0x41f9, (q15_t)0x9250, (q15_t)0x41f3, (q15_t)0x924d, (q15_t)0x41ee, (q15_t)0x924a, (q15_t)0x41e9, (q15_t)0x9247, + (q15_t)0x41e3, (q15_t)0x9243, (q15_t)0x41de, (q15_t)0x9240, (q15_t)0x41d8, (q15_t)0x923d, (q15_t)0x41d3, (q15_t)0x923a, + (q15_t)0x41ce, (q15_t)0x9236, (q15_t)0x41c8, (q15_t)0x9233, (q15_t)0x41c3, (q15_t)0x9230, (q15_t)0x41bd, (q15_t)0x922d, + (q15_t)0x41b8, (q15_t)0x922a, (q15_t)0x41b3, (q15_t)0x9226, (q15_t)0x41ad, (q15_t)0x9223, (q15_t)0x41a8, (q15_t)0x9220, + (q15_t)0x41a2, (q15_t)0x921d, (q15_t)0x419d, (q15_t)0x9219, (q15_t)0x4198, (q15_t)0x9216, (q15_t)0x4192, (q15_t)0x9213, + (q15_t)0x418d, (q15_t)0x9210, (q15_t)0x4188, (q15_t)0x920d, (q15_t)0x4182, (q15_t)0x9209, (q15_t)0x417d, (q15_t)0x9206, + (q15_t)0x4177, (q15_t)0x9203, (q15_t)0x4172, (q15_t)0x9200, (q15_t)0x416d, (q15_t)0x91fc, (q15_t)0x4167, (q15_t)0x91f9, + (q15_t)0x4162, (q15_t)0x91f6, (q15_t)0x415c, (q15_t)0x91f3, (q15_t)0x4157, (q15_t)0x91f0, (q15_t)0x4152, (q15_t)0x91ec, + (q15_t)0x414c, (q15_t)0x91e9, (q15_t)0x4147, (q15_t)0x91e6, (q15_t)0x4141, (q15_t)0x91e3, (q15_t)0x413c, (q15_t)0x91e0, + (q15_t)0x4136, (q15_t)0x91dc, (q15_t)0x4131, (q15_t)0x91d9, (q15_t)0x412c, (q15_t)0x91d6, (q15_t)0x4126, (q15_t)0x91d3, + (q15_t)0x4121, (q15_t)0x91d0, (q15_t)0x411b, (q15_t)0x91cc, (q15_t)0x4116, (q15_t)0x91c9, (q15_t)0x4111, (q15_t)0x91c6, + (q15_t)0x410b, (q15_t)0x91c3, (q15_t)0x4106, (q15_t)0x91c0, (q15_t)0x4100, (q15_t)0x91bc, (q15_t)0x40fb, (q15_t)0x91b9, + (q15_t)0x40f6, (q15_t)0x91b6, (q15_t)0x40f0, (q15_t)0x91b3, (q15_t)0x40eb, (q15_t)0x91b0, (q15_t)0x40e5, (q15_t)0x91ad, + (q15_t)0x40e0, (q15_t)0x91a9, (q15_t)0x40da, (q15_t)0x91a6, (q15_t)0x40d5, (q15_t)0x91a3, (q15_t)0x40d0, (q15_t)0x91a0, + (q15_t)0x40ca, (q15_t)0x919d, (q15_t)0x40c5, (q15_t)0x9199, (q15_t)0x40bf, (q15_t)0x9196, (q15_t)0x40ba, (q15_t)0x9193, + (q15_t)0x40b5, (q15_t)0x9190, (q15_t)0x40af, (q15_t)0x918d, (q15_t)0x40aa, (q15_t)0x918a, (q15_t)0x40a4, (q15_t)0x9186, + (q15_t)0x409f, (q15_t)0x9183, (q15_t)0x4099, (q15_t)0x9180, (q15_t)0x4094, (q15_t)0x917d, (q15_t)0x408f, (q15_t)0x917a, + (q15_t)0x4089, (q15_t)0x9177, (q15_t)0x4084, (q15_t)0x9173, (q15_t)0x407e, (q15_t)0x9170, (q15_t)0x4079, (q15_t)0x916d, + (q15_t)0x4073, (q15_t)0x916a, (q15_t)0x406e, (q15_t)0x9167, (q15_t)0x4069, (q15_t)0x9164, (q15_t)0x4063, (q15_t)0x9160, + (q15_t)0x405e, (q15_t)0x915d, (q15_t)0x4058, (q15_t)0x915a, (q15_t)0x4053, (q15_t)0x9157, (q15_t)0x404d, (q15_t)0x9154, + (q15_t)0x4048, (q15_t)0x9151, (q15_t)0x4043, (q15_t)0x914d, (q15_t)0x403d, (q15_t)0x914a, (q15_t)0x4038, (q15_t)0x9147, + (q15_t)0x4032, (q15_t)0x9144, (q15_t)0x402d, (q15_t)0x9141, (q15_t)0x4027, (q15_t)0x913e, (q15_t)0x4022, (q15_t)0x913a, + (q15_t)0x401d, (q15_t)0x9137, (q15_t)0x4017, (q15_t)0x9134, (q15_t)0x4012, (q15_t)0x9131, (q15_t)0x400c, (q15_t)0x912e, + (q15_t)0x4007, (q15_t)0x912b, (q15_t)0x4001, (q15_t)0x9128, (q15_t)0x3ffc, (q15_t)0x9124, (q15_t)0x3ff6, (q15_t)0x9121, + (q15_t)0x3ff1, (q15_t)0x911e, (q15_t)0x3fec, (q15_t)0x911b, (q15_t)0x3fe6, (q15_t)0x9118, (q15_t)0x3fe1, (q15_t)0x9115, + (q15_t)0x3fdb, (q15_t)0x9112, (q15_t)0x3fd6, (q15_t)0x910f, (q15_t)0x3fd0, (q15_t)0x910b, (q15_t)0x3fcb, (q15_t)0x9108, + (q15_t)0x3fc5, (q15_t)0x9105, (q15_t)0x3fc0, (q15_t)0x9102, (q15_t)0x3fbb, (q15_t)0x90ff, (q15_t)0x3fb5, (q15_t)0x90fc, + (q15_t)0x3fb0, (q15_t)0x90f9, (q15_t)0x3faa, (q15_t)0x90f5, (q15_t)0x3fa5, (q15_t)0x90f2, (q15_t)0x3f9f, (q15_t)0x90ef, + (q15_t)0x3f9a, (q15_t)0x90ec, (q15_t)0x3f94, (q15_t)0x90e9, (q15_t)0x3f8f, (q15_t)0x90e6, (q15_t)0x3f89, (q15_t)0x90e3, + (q15_t)0x3f84, (q15_t)0x90e0, (q15_t)0x3f7f, (q15_t)0x90dd, (q15_t)0x3f79, (q15_t)0x90d9, (q15_t)0x3f74, (q15_t)0x90d6, + (q15_t)0x3f6e, (q15_t)0x90d3, (q15_t)0x3f69, (q15_t)0x90d0, (q15_t)0x3f63, (q15_t)0x90cd, (q15_t)0x3f5e, (q15_t)0x90ca, + (q15_t)0x3f58, (q15_t)0x90c7, (q15_t)0x3f53, (q15_t)0x90c4, (q15_t)0x3f4d, (q15_t)0x90c1, (q15_t)0x3f48, (q15_t)0x90bd, + (q15_t)0x3f43, (q15_t)0x90ba, (q15_t)0x3f3d, (q15_t)0x90b7, (q15_t)0x3f38, (q15_t)0x90b4, (q15_t)0x3f32, (q15_t)0x90b1, + (q15_t)0x3f2d, (q15_t)0x90ae, (q15_t)0x3f27, (q15_t)0x90ab, (q15_t)0x3f22, (q15_t)0x90a8, (q15_t)0x3f1c, (q15_t)0x90a5, + (q15_t)0x3f17, (q15_t)0x90a1, (q15_t)0x3f11, (q15_t)0x909e, (q15_t)0x3f0c, (q15_t)0x909b, (q15_t)0x3f06, (q15_t)0x9098, + (q15_t)0x3f01, (q15_t)0x9095, (q15_t)0x3efb, (q15_t)0x9092, (q15_t)0x3ef6, (q15_t)0x908f, (q15_t)0x3ef1, (q15_t)0x908c, + (q15_t)0x3eeb, (q15_t)0x9089, (q15_t)0x3ee6, (q15_t)0x9086, (q15_t)0x3ee0, (q15_t)0x9083, (q15_t)0x3edb, (q15_t)0x907f, + (q15_t)0x3ed5, (q15_t)0x907c, (q15_t)0x3ed0, (q15_t)0x9079, (q15_t)0x3eca, (q15_t)0x9076, (q15_t)0x3ec5, (q15_t)0x9073, + (q15_t)0x3ebf, (q15_t)0x9070, (q15_t)0x3eba, (q15_t)0x906d, (q15_t)0x3eb4, (q15_t)0x906a, (q15_t)0x3eaf, (q15_t)0x9067, + (q15_t)0x3ea9, (q15_t)0x9064, (q15_t)0x3ea4, (q15_t)0x9061, (q15_t)0x3e9e, (q15_t)0x905e, (q15_t)0x3e99, (q15_t)0x905b, + (q15_t)0x3e93, (q15_t)0x9057, (q15_t)0x3e8e, (q15_t)0x9054, (q15_t)0x3e88, (q15_t)0x9051, (q15_t)0x3e83, (q15_t)0x904e, + (q15_t)0x3e7d, (q15_t)0x904b, (q15_t)0x3e78, (q15_t)0x9048, (q15_t)0x3e73, (q15_t)0x9045, (q15_t)0x3e6d, (q15_t)0x9042, + (q15_t)0x3e68, (q15_t)0x903f, (q15_t)0x3e62, (q15_t)0x903c, (q15_t)0x3e5d, (q15_t)0x9039, (q15_t)0x3e57, (q15_t)0x9036, + (q15_t)0x3e52, (q15_t)0x9033, (q15_t)0x3e4c, (q15_t)0x9030, (q15_t)0x3e47, (q15_t)0x902d, (q15_t)0x3e41, (q15_t)0x902a, + (q15_t)0x3e3c, (q15_t)0x9026, (q15_t)0x3e36, (q15_t)0x9023, (q15_t)0x3e31, (q15_t)0x9020, (q15_t)0x3e2b, (q15_t)0x901d, + (q15_t)0x3e26, (q15_t)0x901a, (q15_t)0x3e20, (q15_t)0x9017, (q15_t)0x3e1b, (q15_t)0x9014, (q15_t)0x3e15, (q15_t)0x9011, + (q15_t)0x3e10, (q15_t)0x900e, (q15_t)0x3e0a, (q15_t)0x900b, (q15_t)0x3e05, (q15_t)0x9008, (q15_t)0x3dff, (q15_t)0x9005, + (q15_t)0x3dfa, (q15_t)0x9002, (q15_t)0x3df4, (q15_t)0x8fff, (q15_t)0x3def, (q15_t)0x8ffc, (q15_t)0x3de9, (q15_t)0x8ff9, + (q15_t)0x3de4, (q15_t)0x8ff6, (q15_t)0x3dde, (q15_t)0x8ff3, (q15_t)0x3dd9, (q15_t)0x8ff0, (q15_t)0x3dd3, (q15_t)0x8fed, + (q15_t)0x3dce, (q15_t)0x8fea, (q15_t)0x3dc8, (q15_t)0x8fe7, (q15_t)0x3dc3, (q15_t)0x8fe3, (q15_t)0x3dbd, (q15_t)0x8fe0, + (q15_t)0x3db8, (q15_t)0x8fdd, (q15_t)0x3db2, (q15_t)0x8fda, (q15_t)0x3dad, (q15_t)0x8fd7, (q15_t)0x3da7, (q15_t)0x8fd4, + (q15_t)0x3da2, (q15_t)0x8fd1, (q15_t)0x3d9c, (q15_t)0x8fce, (q15_t)0x3d97, (q15_t)0x8fcb, (q15_t)0x3d91, (q15_t)0x8fc8, + (q15_t)0x3d8c, (q15_t)0x8fc5, (q15_t)0x3d86, (q15_t)0x8fc2, (q15_t)0x3d81, (q15_t)0x8fbf, (q15_t)0x3d7b, (q15_t)0x8fbc, + (q15_t)0x3d76, (q15_t)0x8fb9, (q15_t)0x3d70, (q15_t)0x8fb6, (q15_t)0x3d6b, (q15_t)0x8fb3, (q15_t)0x3d65, (q15_t)0x8fb0, + (q15_t)0x3d60, (q15_t)0x8fad, (q15_t)0x3d5a, (q15_t)0x8faa, (q15_t)0x3d55, (q15_t)0x8fa7, (q15_t)0x3d4f, (q15_t)0x8fa4, + (q15_t)0x3d49, (q15_t)0x8fa1, (q15_t)0x3d44, (q15_t)0x8f9e, (q15_t)0x3d3e, (q15_t)0x8f9b, (q15_t)0x3d39, (q15_t)0x8f98, + (q15_t)0x3d33, (q15_t)0x8f95, (q15_t)0x3d2e, (q15_t)0x8f92, (q15_t)0x3d28, (q15_t)0x8f8f, (q15_t)0x3d23, (q15_t)0x8f8c, + (q15_t)0x3d1d, (q15_t)0x8f89, (q15_t)0x3d18, (q15_t)0x8f86, (q15_t)0x3d12, (q15_t)0x8f83, (q15_t)0x3d0d, (q15_t)0x8f80, + (q15_t)0x3d07, (q15_t)0x8f7d, (q15_t)0x3d02, (q15_t)0x8f7a, (q15_t)0x3cfc, (q15_t)0x8f77, (q15_t)0x3cf7, (q15_t)0x8f74, + (q15_t)0x3cf1, (q15_t)0x8f71, (q15_t)0x3cec, (q15_t)0x8f6e, (q15_t)0x3ce6, (q15_t)0x8f6b, (q15_t)0x3ce1, (q15_t)0x8f68, + (q15_t)0x3cdb, (q15_t)0x8f65, (q15_t)0x3cd6, (q15_t)0x8f62, (q15_t)0x3cd0, (q15_t)0x8f5f, (q15_t)0x3cca, (q15_t)0x8f5c, + (q15_t)0x3cc5, (q15_t)0x8f59, (q15_t)0x3cbf, (q15_t)0x8f56, (q15_t)0x3cba, (q15_t)0x8f53, (q15_t)0x3cb4, (q15_t)0x8f50, + (q15_t)0x3caf, (q15_t)0x8f4d, (q15_t)0x3ca9, (q15_t)0x8f4a, (q15_t)0x3ca4, (q15_t)0x8f47, (q15_t)0x3c9e, (q15_t)0x8f44, + (q15_t)0x3c99, (q15_t)0x8f41, (q15_t)0x3c93, (q15_t)0x8f3e, (q15_t)0x3c8e, (q15_t)0x8f3b, (q15_t)0x3c88, (q15_t)0x8f38, + (q15_t)0x3c83, (q15_t)0x8f35, (q15_t)0x3c7d, (q15_t)0x8f32, (q15_t)0x3c77, (q15_t)0x8f2f, (q15_t)0x3c72, (q15_t)0x8f2d, + (q15_t)0x3c6c, (q15_t)0x8f2a, (q15_t)0x3c67, (q15_t)0x8f27, (q15_t)0x3c61, (q15_t)0x8f24, (q15_t)0x3c5c, (q15_t)0x8f21, + (q15_t)0x3c56, (q15_t)0x8f1e, (q15_t)0x3c51, (q15_t)0x8f1b, (q15_t)0x3c4b, (q15_t)0x8f18, (q15_t)0x3c46, (q15_t)0x8f15, + (q15_t)0x3c40, (q15_t)0x8f12, (q15_t)0x3c3b, (q15_t)0x8f0f, (q15_t)0x3c35, (q15_t)0x8f0c, (q15_t)0x3c2f, (q15_t)0x8f09, + (q15_t)0x3c2a, (q15_t)0x8f06, (q15_t)0x3c24, (q15_t)0x8f03, (q15_t)0x3c1f, (q15_t)0x8f00, (q15_t)0x3c19, (q15_t)0x8efd, + (q15_t)0x3c14, (q15_t)0x8efa, (q15_t)0x3c0e, (q15_t)0x8ef7, (q15_t)0x3c09, (q15_t)0x8ef4, (q15_t)0x3c03, (q15_t)0x8ef1, + (q15_t)0x3bfd, (q15_t)0x8eee, (q15_t)0x3bf8, (q15_t)0x8eec, (q15_t)0x3bf2, (q15_t)0x8ee9, (q15_t)0x3bed, (q15_t)0x8ee6, + (q15_t)0x3be7, (q15_t)0x8ee3, (q15_t)0x3be2, (q15_t)0x8ee0, (q15_t)0x3bdc, (q15_t)0x8edd, (q15_t)0x3bd7, (q15_t)0x8eda, + (q15_t)0x3bd1, (q15_t)0x8ed7, (q15_t)0x3bcc, (q15_t)0x8ed4, (q15_t)0x3bc6, (q15_t)0x8ed1, (q15_t)0x3bc0, (q15_t)0x8ece, + (q15_t)0x3bbb, (q15_t)0x8ecb, (q15_t)0x3bb5, (q15_t)0x8ec8, (q15_t)0x3bb0, (q15_t)0x8ec5, (q15_t)0x3baa, (q15_t)0x8ec2, + (q15_t)0x3ba5, (q15_t)0x8ebf, (q15_t)0x3b9f, (q15_t)0x8ebd, (q15_t)0x3b99, (q15_t)0x8eba, (q15_t)0x3b94, (q15_t)0x8eb7, + (q15_t)0x3b8e, (q15_t)0x8eb4, (q15_t)0x3b89, (q15_t)0x8eb1, (q15_t)0x3b83, (q15_t)0x8eae, (q15_t)0x3b7e, (q15_t)0x8eab, + (q15_t)0x3b78, (q15_t)0x8ea8, (q15_t)0x3b73, (q15_t)0x8ea5, (q15_t)0x3b6d, (q15_t)0x8ea2, (q15_t)0x3b67, (q15_t)0x8e9f, + (q15_t)0x3b62, (q15_t)0x8e9c, (q15_t)0x3b5c, (q15_t)0x8e99, (q15_t)0x3b57, (q15_t)0x8e97, (q15_t)0x3b51, (q15_t)0x8e94, + (q15_t)0x3b4c, (q15_t)0x8e91, (q15_t)0x3b46, (q15_t)0x8e8e, (q15_t)0x3b40, (q15_t)0x8e8b, (q15_t)0x3b3b, (q15_t)0x8e88, + (q15_t)0x3b35, (q15_t)0x8e85, (q15_t)0x3b30, (q15_t)0x8e82, (q15_t)0x3b2a, (q15_t)0x8e7f, (q15_t)0x3b25, (q15_t)0x8e7c, + (q15_t)0x3b1f, (q15_t)0x8e7a, (q15_t)0x3b19, (q15_t)0x8e77, (q15_t)0x3b14, (q15_t)0x8e74, (q15_t)0x3b0e, (q15_t)0x8e71, + (q15_t)0x3b09, (q15_t)0x8e6e, (q15_t)0x3b03, (q15_t)0x8e6b, (q15_t)0x3afe, (q15_t)0x8e68, (q15_t)0x3af8, (q15_t)0x8e65, + (q15_t)0x3af2, (q15_t)0x8e62, (q15_t)0x3aed, (q15_t)0x8e5f, (q15_t)0x3ae7, (q15_t)0x8e5d, (q15_t)0x3ae2, (q15_t)0x8e5a, + (q15_t)0x3adc, (q15_t)0x8e57, (q15_t)0x3ad7, (q15_t)0x8e54, (q15_t)0x3ad1, (q15_t)0x8e51, (q15_t)0x3acb, (q15_t)0x8e4e, + (q15_t)0x3ac6, (q15_t)0x8e4b, (q15_t)0x3ac0, (q15_t)0x8e48, (q15_t)0x3abb, (q15_t)0x8e45, (q15_t)0x3ab5, (q15_t)0x8e43, + (q15_t)0x3aaf, (q15_t)0x8e40, (q15_t)0x3aaa, (q15_t)0x8e3d, (q15_t)0x3aa4, (q15_t)0x8e3a, (q15_t)0x3a9f, (q15_t)0x8e37, + (q15_t)0x3a99, (q15_t)0x8e34, (q15_t)0x3a94, (q15_t)0x8e31, (q15_t)0x3a8e, (q15_t)0x8e2e, (q15_t)0x3a88, (q15_t)0x8e2c, + (q15_t)0x3a83, (q15_t)0x8e29, (q15_t)0x3a7d, (q15_t)0x8e26, (q15_t)0x3a78, (q15_t)0x8e23, (q15_t)0x3a72, (q15_t)0x8e20, + (q15_t)0x3a6c, (q15_t)0x8e1d, (q15_t)0x3a67, (q15_t)0x8e1a, (q15_t)0x3a61, (q15_t)0x8e17, (q15_t)0x3a5c, (q15_t)0x8e15, + (q15_t)0x3a56, (q15_t)0x8e12, (q15_t)0x3a50, (q15_t)0x8e0f, (q15_t)0x3a4b, (q15_t)0x8e0c, (q15_t)0x3a45, (q15_t)0x8e09, + (q15_t)0x3a40, (q15_t)0x8e06, (q15_t)0x3a3a, (q15_t)0x8e03, (q15_t)0x3a34, (q15_t)0x8e01, (q15_t)0x3a2f, (q15_t)0x8dfe, + (q15_t)0x3a29, (q15_t)0x8dfb, (q15_t)0x3a24, (q15_t)0x8df8, (q15_t)0x3a1e, (q15_t)0x8df5, (q15_t)0x3a19, (q15_t)0x8df2, + (q15_t)0x3a13, (q15_t)0x8def, (q15_t)0x3a0d, (q15_t)0x8ded, (q15_t)0x3a08, (q15_t)0x8dea, (q15_t)0x3a02, (q15_t)0x8de7, + (q15_t)0x39fd, (q15_t)0x8de4, (q15_t)0x39f7, (q15_t)0x8de1, (q15_t)0x39f1, (q15_t)0x8dde, (q15_t)0x39ec, (q15_t)0x8ddc, + (q15_t)0x39e6, (q15_t)0x8dd9, (q15_t)0x39e0, (q15_t)0x8dd6, (q15_t)0x39db, (q15_t)0x8dd3, (q15_t)0x39d5, (q15_t)0x8dd0, + (q15_t)0x39d0, (q15_t)0x8dcd, (q15_t)0x39ca, (q15_t)0x8dca, (q15_t)0x39c4, (q15_t)0x8dc8, (q15_t)0x39bf, (q15_t)0x8dc5, + (q15_t)0x39b9, (q15_t)0x8dc2, (q15_t)0x39b4, (q15_t)0x8dbf, (q15_t)0x39ae, (q15_t)0x8dbc, (q15_t)0x39a8, (q15_t)0x8db9, + (q15_t)0x39a3, (q15_t)0x8db7, (q15_t)0x399d, (q15_t)0x8db4, (q15_t)0x3998, (q15_t)0x8db1, (q15_t)0x3992, (q15_t)0x8dae, + (q15_t)0x398c, (q15_t)0x8dab, (q15_t)0x3987, (q15_t)0x8da9, (q15_t)0x3981, (q15_t)0x8da6, (q15_t)0x397c, (q15_t)0x8da3, + (q15_t)0x3976, (q15_t)0x8da0, (q15_t)0x3970, (q15_t)0x8d9d, (q15_t)0x396b, (q15_t)0x8d9a, (q15_t)0x3965, (q15_t)0x8d98, + (q15_t)0x395f, (q15_t)0x8d95, (q15_t)0x395a, (q15_t)0x8d92, (q15_t)0x3954, (q15_t)0x8d8f, (q15_t)0x394f, (q15_t)0x8d8c, + (q15_t)0x3949, (q15_t)0x8d8a, (q15_t)0x3943, (q15_t)0x8d87, (q15_t)0x393e, (q15_t)0x8d84, (q15_t)0x3938, (q15_t)0x8d81, + (q15_t)0x3932, (q15_t)0x8d7e, (q15_t)0x392d, (q15_t)0x8d7b, (q15_t)0x3927, (q15_t)0x8d79, (q15_t)0x3922, (q15_t)0x8d76, + (q15_t)0x391c, (q15_t)0x8d73, (q15_t)0x3916, (q15_t)0x8d70, (q15_t)0x3911, (q15_t)0x8d6d, (q15_t)0x390b, (q15_t)0x8d6b, + (q15_t)0x3906, (q15_t)0x8d68, (q15_t)0x3900, (q15_t)0x8d65, (q15_t)0x38fa, (q15_t)0x8d62, (q15_t)0x38f5, (q15_t)0x8d5f, + (q15_t)0x38ef, (q15_t)0x8d5d, (q15_t)0x38e9, (q15_t)0x8d5a, (q15_t)0x38e4, (q15_t)0x8d57, (q15_t)0x38de, (q15_t)0x8d54, + (q15_t)0x38d8, (q15_t)0x8d51, (q15_t)0x38d3, (q15_t)0x8d4f, (q15_t)0x38cd, (q15_t)0x8d4c, (q15_t)0x38c8, (q15_t)0x8d49, + (q15_t)0x38c2, (q15_t)0x8d46, (q15_t)0x38bc, (q15_t)0x8d44, (q15_t)0x38b7, (q15_t)0x8d41, (q15_t)0x38b1, (q15_t)0x8d3e, + (q15_t)0x38ab, (q15_t)0x8d3b, (q15_t)0x38a6, (q15_t)0x8d38, (q15_t)0x38a0, (q15_t)0x8d36, (q15_t)0x389b, (q15_t)0x8d33, + (q15_t)0x3895, (q15_t)0x8d30, (q15_t)0x388f, (q15_t)0x8d2d, (q15_t)0x388a, (q15_t)0x8d2b, (q15_t)0x3884, (q15_t)0x8d28, + (q15_t)0x387e, (q15_t)0x8d25, (q15_t)0x3879, (q15_t)0x8d22, (q15_t)0x3873, (q15_t)0x8d1f, (q15_t)0x386d, (q15_t)0x8d1d, + (q15_t)0x3868, (q15_t)0x8d1a, (q15_t)0x3862, (q15_t)0x8d17, (q15_t)0x385d, (q15_t)0x8d14, (q15_t)0x3857, (q15_t)0x8d12, + (q15_t)0x3851, (q15_t)0x8d0f, (q15_t)0x384c, (q15_t)0x8d0c, (q15_t)0x3846, (q15_t)0x8d09, (q15_t)0x3840, (q15_t)0x8d07, + (q15_t)0x383b, (q15_t)0x8d04, (q15_t)0x3835, (q15_t)0x8d01, (q15_t)0x382f, (q15_t)0x8cfe, (q15_t)0x382a, (q15_t)0x8cfb, + (q15_t)0x3824, (q15_t)0x8cf9, (q15_t)0x381e, (q15_t)0x8cf6, (q15_t)0x3819, (q15_t)0x8cf3, (q15_t)0x3813, (q15_t)0x8cf0, + (q15_t)0x380d, (q15_t)0x8cee, (q15_t)0x3808, (q15_t)0x8ceb, (q15_t)0x3802, (q15_t)0x8ce8, (q15_t)0x37fd, (q15_t)0x8ce5, + (q15_t)0x37f7, (q15_t)0x8ce3, (q15_t)0x37f1, (q15_t)0x8ce0, (q15_t)0x37ec, (q15_t)0x8cdd, (q15_t)0x37e6, (q15_t)0x8cda, + (q15_t)0x37e0, (q15_t)0x8cd8, (q15_t)0x37db, (q15_t)0x8cd5, (q15_t)0x37d5, (q15_t)0x8cd2, (q15_t)0x37cf, (q15_t)0x8cd0, + (q15_t)0x37ca, (q15_t)0x8ccd, (q15_t)0x37c4, (q15_t)0x8cca, (q15_t)0x37be, (q15_t)0x8cc7, (q15_t)0x37b9, (q15_t)0x8cc5, + (q15_t)0x37b3, (q15_t)0x8cc2, (q15_t)0x37ad, (q15_t)0x8cbf, (q15_t)0x37a8, (q15_t)0x8cbc, (q15_t)0x37a2, (q15_t)0x8cba, + (q15_t)0x379c, (q15_t)0x8cb7, (q15_t)0x3797, (q15_t)0x8cb4, (q15_t)0x3791, (q15_t)0x8cb1, (q15_t)0x378b, (q15_t)0x8caf, + (q15_t)0x3786, (q15_t)0x8cac, (q15_t)0x3780, (q15_t)0x8ca9, (q15_t)0x377a, (q15_t)0x8ca7, (q15_t)0x3775, (q15_t)0x8ca4, + (q15_t)0x376f, (q15_t)0x8ca1, (q15_t)0x3769, (q15_t)0x8c9e, (q15_t)0x3764, (q15_t)0x8c9c, (q15_t)0x375e, (q15_t)0x8c99, + (q15_t)0x3758, (q15_t)0x8c96, (q15_t)0x3753, (q15_t)0x8c94, (q15_t)0x374d, (q15_t)0x8c91, (q15_t)0x3747, (q15_t)0x8c8e, + (q15_t)0x3742, (q15_t)0x8c8b, (q15_t)0x373c, (q15_t)0x8c89, (q15_t)0x3736, (q15_t)0x8c86, (q15_t)0x3731, (q15_t)0x8c83, + (q15_t)0x372b, (q15_t)0x8c81, (q15_t)0x3725, (q15_t)0x8c7e, (q15_t)0x3720, (q15_t)0x8c7b, (q15_t)0x371a, (q15_t)0x8c78, + (q15_t)0x3714, (q15_t)0x8c76, (q15_t)0x370f, (q15_t)0x8c73, (q15_t)0x3709, (q15_t)0x8c70, (q15_t)0x3703, (q15_t)0x8c6e, + (q15_t)0x36fe, (q15_t)0x8c6b, (q15_t)0x36f8, (q15_t)0x8c68, (q15_t)0x36f2, (q15_t)0x8c65, (q15_t)0x36ed, (q15_t)0x8c63, + (q15_t)0x36e7, (q15_t)0x8c60, (q15_t)0x36e1, (q15_t)0x8c5d, (q15_t)0x36dc, (q15_t)0x8c5b, (q15_t)0x36d6, (q15_t)0x8c58, + (q15_t)0x36d0, (q15_t)0x8c55, (q15_t)0x36cb, (q15_t)0x8c53, (q15_t)0x36c5, (q15_t)0x8c50, (q15_t)0x36bf, (q15_t)0x8c4d, + (q15_t)0x36ba, (q15_t)0x8c4b, (q15_t)0x36b4, (q15_t)0x8c48, (q15_t)0x36ae, (q15_t)0x8c45, (q15_t)0x36a9, (q15_t)0x8c43, + (q15_t)0x36a3, (q15_t)0x8c40, (q15_t)0x369d, (q15_t)0x8c3d, (q15_t)0x3698, (q15_t)0x8c3a, (q15_t)0x3692, (q15_t)0x8c38, + (q15_t)0x368c, (q15_t)0x8c35, (q15_t)0x3686, (q15_t)0x8c32, (q15_t)0x3681, (q15_t)0x8c30, (q15_t)0x367b, (q15_t)0x8c2d, + (q15_t)0x3675, (q15_t)0x8c2a, (q15_t)0x3670, (q15_t)0x8c28, (q15_t)0x366a, (q15_t)0x8c25, (q15_t)0x3664, (q15_t)0x8c22, + (q15_t)0x365f, (q15_t)0x8c20, (q15_t)0x3659, (q15_t)0x8c1d, (q15_t)0x3653, (q15_t)0x8c1a, (q15_t)0x364e, (q15_t)0x8c18, + (q15_t)0x3648, (q15_t)0x8c15, (q15_t)0x3642, (q15_t)0x8c12, (q15_t)0x363d, (q15_t)0x8c10, (q15_t)0x3637, (q15_t)0x8c0d, + (q15_t)0x3631, (q15_t)0x8c0a, (q15_t)0x362b, (q15_t)0x8c08, (q15_t)0x3626, (q15_t)0x8c05, (q15_t)0x3620, (q15_t)0x8c02, + (q15_t)0x361a, (q15_t)0x8c00, (q15_t)0x3615, (q15_t)0x8bfd, (q15_t)0x360f, (q15_t)0x8bfa, (q15_t)0x3609, (q15_t)0x8bf8, + (q15_t)0x3604, (q15_t)0x8bf5, (q15_t)0x35fe, (q15_t)0x8bf3, (q15_t)0x35f8, (q15_t)0x8bf0, (q15_t)0x35f3, (q15_t)0x8bed, + (q15_t)0x35ed, (q15_t)0x8beb, (q15_t)0x35e7, (q15_t)0x8be8, (q15_t)0x35e1, (q15_t)0x8be5, (q15_t)0x35dc, (q15_t)0x8be3, + (q15_t)0x35d6, (q15_t)0x8be0, (q15_t)0x35d0, (q15_t)0x8bdd, (q15_t)0x35cb, (q15_t)0x8bdb, (q15_t)0x35c5, (q15_t)0x8bd8, + (q15_t)0x35bf, (q15_t)0x8bd5, (q15_t)0x35ba, (q15_t)0x8bd3, (q15_t)0x35b4, (q15_t)0x8bd0, (q15_t)0x35ae, (q15_t)0x8bce, + (q15_t)0x35a8, (q15_t)0x8bcb, (q15_t)0x35a3, (q15_t)0x8bc8, (q15_t)0x359d, (q15_t)0x8bc6, (q15_t)0x3597, (q15_t)0x8bc3, + (q15_t)0x3592, (q15_t)0x8bc0, (q15_t)0x358c, (q15_t)0x8bbe, (q15_t)0x3586, (q15_t)0x8bbb, (q15_t)0x3580, (q15_t)0x8bb8, + (q15_t)0x357b, (q15_t)0x8bb6, (q15_t)0x3575, (q15_t)0x8bb3, (q15_t)0x356f, (q15_t)0x8bb1, (q15_t)0x356a, (q15_t)0x8bae, + (q15_t)0x3564, (q15_t)0x8bab, (q15_t)0x355e, (q15_t)0x8ba9, (q15_t)0x3558, (q15_t)0x8ba6, (q15_t)0x3553, (q15_t)0x8ba4, + (q15_t)0x354d, (q15_t)0x8ba1, (q15_t)0x3547, (q15_t)0x8b9e, (q15_t)0x3542, (q15_t)0x8b9c, (q15_t)0x353c, (q15_t)0x8b99, + (q15_t)0x3536, (q15_t)0x8b96, (q15_t)0x3530, (q15_t)0x8b94, (q15_t)0x352b, (q15_t)0x8b91, (q15_t)0x3525, (q15_t)0x8b8f, + (q15_t)0x351f, (q15_t)0x8b8c, (q15_t)0x351a, (q15_t)0x8b89, (q15_t)0x3514, (q15_t)0x8b87, (q15_t)0x350e, (q15_t)0x8b84, + (q15_t)0x3508, (q15_t)0x8b82, (q15_t)0x3503, (q15_t)0x8b7f, (q15_t)0x34fd, (q15_t)0x8b7c, (q15_t)0x34f7, (q15_t)0x8b7a, + (q15_t)0x34f2, (q15_t)0x8b77, (q15_t)0x34ec, (q15_t)0x8b75, (q15_t)0x34e6, (q15_t)0x8b72, (q15_t)0x34e0, (q15_t)0x8b6f, + (q15_t)0x34db, (q15_t)0x8b6d, (q15_t)0x34d5, (q15_t)0x8b6a, (q15_t)0x34cf, (q15_t)0x8b68, (q15_t)0x34ca, (q15_t)0x8b65, + (q15_t)0x34c4, (q15_t)0x8b62, (q15_t)0x34be, (q15_t)0x8b60, (q15_t)0x34b8, (q15_t)0x8b5d, (q15_t)0x34b3, (q15_t)0x8b5b, + (q15_t)0x34ad, (q15_t)0x8b58, (q15_t)0x34a7, (q15_t)0x8b55, (q15_t)0x34a1, (q15_t)0x8b53, (q15_t)0x349c, (q15_t)0x8b50, + (q15_t)0x3496, (q15_t)0x8b4e, (q15_t)0x3490, (q15_t)0x8b4b, (q15_t)0x348b, (q15_t)0x8b49, (q15_t)0x3485, (q15_t)0x8b46, + (q15_t)0x347f, (q15_t)0x8b43, (q15_t)0x3479, (q15_t)0x8b41, (q15_t)0x3474, (q15_t)0x8b3e, (q15_t)0x346e, (q15_t)0x8b3c, + (q15_t)0x3468, (q15_t)0x8b39, (q15_t)0x3462, (q15_t)0x8b37, (q15_t)0x345d, (q15_t)0x8b34, (q15_t)0x3457, (q15_t)0x8b31, + (q15_t)0x3451, (q15_t)0x8b2f, (q15_t)0x344b, (q15_t)0x8b2c, (q15_t)0x3446, (q15_t)0x8b2a, (q15_t)0x3440, (q15_t)0x8b27, + (q15_t)0x343a, (q15_t)0x8b25, (q15_t)0x3435, (q15_t)0x8b22, (q15_t)0x342f, (q15_t)0x8b1f, (q15_t)0x3429, (q15_t)0x8b1d, + (q15_t)0x3423, (q15_t)0x8b1a, (q15_t)0x341e, (q15_t)0x8b18, (q15_t)0x3418, (q15_t)0x8b15, (q15_t)0x3412, (q15_t)0x8b13, + (q15_t)0x340c, (q15_t)0x8b10, (q15_t)0x3407, (q15_t)0x8b0e, (q15_t)0x3401, (q15_t)0x8b0b, (q15_t)0x33fb, (q15_t)0x8b08, + (q15_t)0x33f5, (q15_t)0x8b06, (q15_t)0x33f0, (q15_t)0x8b03, (q15_t)0x33ea, (q15_t)0x8b01, (q15_t)0x33e4, (q15_t)0x8afe, + (q15_t)0x33de, (q15_t)0x8afc, (q15_t)0x33d9, (q15_t)0x8af9, (q15_t)0x33d3, (q15_t)0x8af7, (q15_t)0x33cd, (q15_t)0x8af4, + (q15_t)0x33c7, (q15_t)0x8af1, (q15_t)0x33c2, (q15_t)0x8aef, (q15_t)0x33bc, (q15_t)0x8aec, (q15_t)0x33b6, (q15_t)0x8aea, + (q15_t)0x33b0, (q15_t)0x8ae7, (q15_t)0x33ab, (q15_t)0x8ae5, (q15_t)0x33a5, (q15_t)0x8ae2, (q15_t)0x339f, (q15_t)0x8ae0, + (q15_t)0x3399, (q15_t)0x8add, (q15_t)0x3394, (q15_t)0x8adb, (q15_t)0x338e, (q15_t)0x8ad8, (q15_t)0x3388, (q15_t)0x8ad6, + (q15_t)0x3382, (q15_t)0x8ad3, (q15_t)0x337d, (q15_t)0x8ad1, (q15_t)0x3377, (q15_t)0x8ace, (q15_t)0x3371, (q15_t)0x8acb, + (q15_t)0x336b, (q15_t)0x8ac9, (q15_t)0x3366, (q15_t)0x8ac6, (q15_t)0x3360, (q15_t)0x8ac4, (q15_t)0x335a, (q15_t)0x8ac1, + (q15_t)0x3354, (q15_t)0x8abf, (q15_t)0x334f, (q15_t)0x8abc, (q15_t)0x3349, (q15_t)0x8aba, (q15_t)0x3343, (q15_t)0x8ab7, + (q15_t)0x333d, (q15_t)0x8ab5, (q15_t)0x3338, (q15_t)0x8ab2, (q15_t)0x3332, (q15_t)0x8ab0, (q15_t)0x332c, (q15_t)0x8aad, + (q15_t)0x3326, (q15_t)0x8aab, (q15_t)0x3321, (q15_t)0x8aa8, (q15_t)0x331b, (q15_t)0x8aa6, (q15_t)0x3315, (q15_t)0x8aa3, + (q15_t)0x330f, (q15_t)0x8aa1, (q15_t)0x330a, (q15_t)0x8a9e, (q15_t)0x3304, (q15_t)0x8a9c, (q15_t)0x32fe, (q15_t)0x8a99, + (q15_t)0x32f8, (q15_t)0x8a97, (q15_t)0x32f3, (q15_t)0x8a94, (q15_t)0x32ed, (q15_t)0x8a92, (q15_t)0x32e7, (q15_t)0x8a8f, + (q15_t)0x32e1, (q15_t)0x8a8d, (q15_t)0x32db, (q15_t)0x8a8a, (q15_t)0x32d6, (q15_t)0x8a88, (q15_t)0x32d0, (q15_t)0x8a85, + (q15_t)0x32ca, (q15_t)0x8a83, (q15_t)0x32c4, (q15_t)0x8a80, (q15_t)0x32bf, (q15_t)0x8a7e, (q15_t)0x32b9, (q15_t)0x8a7b, + (q15_t)0x32b3, (q15_t)0x8a79, (q15_t)0x32ad, (q15_t)0x8a76, (q15_t)0x32a8, (q15_t)0x8a74, (q15_t)0x32a2, (q15_t)0x8a71, + (q15_t)0x329c, (q15_t)0x8a6f, (q15_t)0x3296, (q15_t)0x8a6c, (q15_t)0x3290, (q15_t)0x8a6a, (q15_t)0x328b, (q15_t)0x8a67, + (q15_t)0x3285, (q15_t)0x8a65, (q15_t)0x327f, (q15_t)0x8a62, (q15_t)0x3279, (q15_t)0x8a60, (q15_t)0x3274, (q15_t)0x8a5d, + (q15_t)0x326e, (q15_t)0x8a5b, (q15_t)0x3268, (q15_t)0x8a59, (q15_t)0x3262, (q15_t)0x8a56, (q15_t)0x325d, (q15_t)0x8a54, + (q15_t)0x3257, (q15_t)0x8a51, (q15_t)0x3251, (q15_t)0x8a4f, (q15_t)0x324b, (q15_t)0x8a4c, (q15_t)0x3245, (q15_t)0x8a4a, + (q15_t)0x3240, (q15_t)0x8a47, (q15_t)0x323a, (q15_t)0x8a45, (q15_t)0x3234, (q15_t)0x8a42, (q15_t)0x322e, (q15_t)0x8a40, + (q15_t)0x3228, (q15_t)0x8a3d, (q15_t)0x3223, (q15_t)0x8a3b, (q15_t)0x321d, (q15_t)0x8a38, (q15_t)0x3217, (q15_t)0x8a36, + (q15_t)0x3211, (q15_t)0x8a34, (q15_t)0x320c, (q15_t)0x8a31, (q15_t)0x3206, (q15_t)0x8a2f, (q15_t)0x3200, (q15_t)0x8a2c, + (q15_t)0x31fa, (q15_t)0x8a2a, (q15_t)0x31f4, (q15_t)0x8a27, (q15_t)0x31ef, (q15_t)0x8a25, (q15_t)0x31e9, (q15_t)0x8a22, + (q15_t)0x31e3, (q15_t)0x8a20, (q15_t)0x31dd, (q15_t)0x8a1d, (q15_t)0x31d8, (q15_t)0x8a1b, (q15_t)0x31d2, (q15_t)0x8a19, + (q15_t)0x31cc, (q15_t)0x8a16, (q15_t)0x31c6, (q15_t)0x8a14, (q15_t)0x31c0, (q15_t)0x8a11, (q15_t)0x31bb, (q15_t)0x8a0f, + (q15_t)0x31b5, (q15_t)0x8a0c, (q15_t)0x31af, (q15_t)0x8a0a, (q15_t)0x31a9, (q15_t)0x8a07, (q15_t)0x31a3, (q15_t)0x8a05, + (q15_t)0x319e, (q15_t)0x8a03, (q15_t)0x3198, (q15_t)0x8a00, (q15_t)0x3192, (q15_t)0x89fe, (q15_t)0x318c, (q15_t)0x89fb, + (q15_t)0x3186, (q15_t)0x89f9, (q15_t)0x3181, (q15_t)0x89f6, (q15_t)0x317b, (q15_t)0x89f4, (q15_t)0x3175, (q15_t)0x89f2, + (q15_t)0x316f, (q15_t)0x89ef, (q15_t)0x3169, (q15_t)0x89ed, (q15_t)0x3164, (q15_t)0x89ea, (q15_t)0x315e, (q15_t)0x89e8, + (q15_t)0x3158, (q15_t)0x89e5, (q15_t)0x3152, (q15_t)0x89e3, (q15_t)0x314c, (q15_t)0x89e1, (q15_t)0x3147, (q15_t)0x89de, + (q15_t)0x3141, (q15_t)0x89dc, (q15_t)0x313b, (q15_t)0x89d9, (q15_t)0x3135, (q15_t)0x89d7, (q15_t)0x312f, (q15_t)0x89d5, + (q15_t)0x312a, (q15_t)0x89d2, (q15_t)0x3124, (q15_t)0x89d0, (q15_t)0x311e, (q15_t)0x89cd, (q15_t)0x3118, (q15_t)0x89cb, + (q15_t)0x3112, (q15_t)0x89c8, (q15_t)0x310d, (q15_t)0x89c6, (q15_t)0x3107, (q15_t)0x89c4, (q15_t)0x3101, (q15_t)0x89c1, + (q15_t)0x30fb, (q15_t)0x89bf, (q15_t)0x30f5, (q15_t)0x89bc, (q15_t)0x30f0, (q15_t)0x89ba, (q15_t)0x30ea, (q15_t)0x89b8, + (q15_t)0x30e4, (q15_t)0x89b5, (q15_t)0x30de, (q15_t)0x89b3, (q15_t)0x30d8, (q15_t)0x89b0, (q15_t)0x30d3, (q15_t)0x89ae, + (q15_t)0x30cd, (q15_t)0x89ac, (q15_t)0x30c7, (q15_t)0x89a9, (q15_t)0x30c1, (q15_t)0x89a7, (q15_t)0x30bb, (q15_t)0x89a4, + (q15_t)0x30b6, (q15_t)0x89a2, (q15_t)0x30b0, (q15_t)0x89a0, (q15_t)0x30aa, (q15_t)0x899d, (q15_t)0x30a4, (q15_t)0x899b, + (q15_t)0x309e, (q15_t)0x8998, (q15_t)0x3099, (q15_t)0x8996, (q15_t)0x3093, (q15_t)0x8994, (q15_t)0x308d, (q15_t)0x8991, + (q15_t)0x3087, (q15_t)0x898f, (q15_t)0x3081, (q15_t)0x898d, (q15_t)0x307b, (q15_t)0x898a, (q15_t)0x3076, (q15_t)0x8988, + (q15_t)0x3070, (q15_t)0x8985, (q15_t)0x306a, (q15_t)0x8983, (q15_t)0x3064, (q15_t)0x8981, (q15_t)0x305e, (q15_t)0x897e, + (q15_t)0x3059, (q15_t)0x897c, (q15_t)0x3053, (q15_t)0x897a, (q15_t)0x304d, (q15_t)0x8977, (q15_t)0x3047, (q15_t)0x8975, + (q15_t)0x3041, (q15_t)0x8972, (q15_t)0x303b, (q15_t)0x8970, (q15_t)0x3036, (q15_t)0x896e, (q15_t)0x3030, (q15_t)0x896b, + (q15_t)0x302a, (q15_t)0x8969, (q15_t)0x3024, (q15_t)0x8967, (q15_t)0x301e, (q15_t)0x8964, (q15_t)0x3019, (q15_t)0x8962, + (q15_t)0x3013, (q15_t)0x8960, (q15_t)0x300d, (q15_t)0x895d, (q15_t)0x3007, (q15_t)0x895b, (q15_t)0x3001, (q15_t)0x8958, + (q15_t)0x2ffb, (q15_t)0x8956, (q15_t)0x2ff6, (q15_t)0x8954, (q15_t)0x2ff0, (q15_t)0x8951, (q15_t)0x2fea, (q15_t)0x894f, + (q15_t)0x2fe4, (q15_t)0x894d, (q15_t)0x2fde, (q15_t)0x894a, (q15_t)0x2fd8, (q15_t)0x8948, (q15_t)0x2fd3, (q15_t)0x8946, + (q15_t)0x2fcd, (q15_t)0x8943, (q15_t)0x2fc7, (q15_t)0x8941, (q15_t)0x2fc1, (q15_t)0x893f, (q15_t)0x2fbb, (q15_t)0x893c, + (q15_t)0x2fb5, (q15_t)0x893a, (q15_t)0x2fb0, (q15_t)0x8938, (q15_t)0x2faa, (q15_t)0x8935, (q15_t)0x2fa4, (q15_t)0x8933, + (q15_t)0x2f9e, (q15_t)0x8931, (q15_t)0x2f98, (q15_t)0x892e, (q15_t)0x2f92, (q15_t)0x892c, (q15_t)0x2f8d, (q15_t)0x892a, + (q15_t)0x2f87, (q15_t)0x8927, (q15_t)0x2f81, (q15_t)0x8925, (q15_t)0x2f7b, (q15_t)0x8923, (q15_t)0x2f75, (q15_t)0x8920, + (q15_t)0x2f6f, (q15_t)0x891e, (q15_t)0x2f6a, (q15_t)0x891c, (q15_t)0x2f64, (q15_t)0x8919, (q15_t)0x2f5e, (q15_t)0x8917, + (q15_t)0x2f58, (q15_t)0x8915, (q15_t)0x2f52, (q15_t)0x8912, (q15_t)0x2f4c, (q15_t)0x8910, (q15_t)0x2f47, (q15_t)0x890e, + (q15_t)0x2f41, (q15_t)0x890b, (q15_t)0x2f3b, (q15_t)0x8909, (q15_t)0x2f35, (q15_t)0x8907, (q15_t)0x2f2f, (q15_t)0x8904, + (q15_t)0x2f29, (q15_t)0x8902, (q15_t)0x2f24, (q15_t)0x8900, (q15_t)0x2f1e, (q15_t)0x88fd, (q15_t)0x2f18, (q15_t)0x88fb, + (q15_t)0x2f12, (q15_t)0x88f9, (q15_t)0x2f0c, (q15_t)0x88f6, (q15_t)0x2f06, (q15_t)0x88f4, (q15_t)0x2f01, (q15_t)0x88f2, + (q15_t)0x2efb, (q15_t)0x88f0, (q15_t)0x2ef5, (q15_t)0x88ed, (q15_t)0x2eef, (q15_t)0x88eb, (q15_t)0x2ee9, (q15_t)0x88e9, + (q15_t)0x2ee3, (q15_t)0x88e6, (q15_t)0x2edd, (q15_t)0x88e4, (q15_t)0x2ed8, (q15_t)0x88e2, (q15_t)0x2ed2, (q15_t)0x88df, + (q15_t)0x2ecc, (q15_t)0x88dd, (q15_t)0x2ec6, (q15_t)0x88db, (q15_t)0x2ec0, (q15_t)0x88d9, (q15_t)0x2eba, (q15_t)0x88d6, + (q15_t)0x2eb5, (q15_t)0x88d4, (q15_t)0x2eaf, (q15_t)0x88d2, (q15_t)0x2ea9, (q15_t)0x88cf, (q15_t)0x2ea3, (q15_t)0x88cd, + (q15_t)0x2e9d, (q15_t)0x88cb, (q15_t)0x2e97, (q15_t)0x88c8, (q15_t)0x2e91, (q15_t)0x88c6, (q15_t)0x2e8c, (q15_t)0x88c4, + (q15_t)0x2e86, (q15_t)0x88c2, (q15_t)0x2e80, (q15_t)0x88bf, (q15_t)0x2e7a, (q15_t)0x88bd, (q15_t)0x2e74, (q15_t)0x88bb, + (q15_t)0x2e6e, (q15_t)0x88b9, (q15_t)0x2e68, (q15_t)0x88b6, (q15_t)0x2e63, (q15_t)0x88b4, (q15_t)0x2e5d, (q15_t)0x88b2, + (q15_t)0x2e57, (q15_t)0x88af, (q15_t)0x2e51, (q15_t)0x88ad, (q15_t)0x2e4b, (q15_t)0x88ab, (q15_t)0x2e45, (q15_t)0x88a9, + (q15_t)0x2e3f, (q15_t)0x88a6, (q15_t)0x2e3a, (q15_t)0x88a4, (q15_t)0x2e34, (q15_t)0x88a2, (q15_t)0x2e2e, (q15_t)0x88a0, + (q15_t)0x2e28, (q15_t)0x889d, (q15_t)0x2e22, (q15_t)0x889b, (q15_t)0x2e1c, (q15_t)0x8899, (q15_t)0x2e16, (q15_t)0x8896, + (q15_t)0x2e11, (q15_t)0x8894, (q15_t)0x2e0b, (q15_t)0x8892, (q15_t)0x2e05, (q15_t)0x8890, (q15_t)0x2dff, (q15_t)0x888d, + (q15_t)0x2df9, (q15_t)0x888b, (q15_t)0x2df3, (q15_t)0x8889, (q15_t)0x2ded, (q15_t)0x8887, (q15_t)0x2de7, (q15_t)0x8884, + (q15_t)0x2de2, (q15_t)0x8882, (q15_t)0x2ddc, (q15_t)0x8880, (q15_t)0x2dd6, (q15_t)0x887e, (q15_t)0x2dd0, (q15_t)0x887b, + (q15_t)0x2dca, (q15_t)0x8879, (q15_t)0x2dc4, (q15_t)0x8877, (q15_t)0x2dbe, (q15_t)0x8875, (q15_t)0x2db9, (q15_t)0x8872, + (q15_t)0x2db3, (q15_t)0x8870, (q15_t)0x2dad, (q15_t)0x886e, (q15_t)0x2da7, (q15_t)0x886c, (q15_t)0x2da1, (q15_t)0x8869, + (q15_t)0x2d9b, (q15_t)0x8867, (q15_t)0x2d95, (q15_t)0x8865, (q15_t)0x2d8f, (q15_t)0x8863, (q15_t)0x2d8a, (q15_t)0x8860, + (q15_t)0x2d84, (q15_t)0x885e, (q15_t)0x2d7e, (q15_t)0x885c, (q15_t)0x2d78, (q15_t)0x885a, (q15_t)0x2d72, (q15_t)0x8858, + (q15_t)0x2d6c, (q15_t)0x8855, (q15_t)0x2d66, (q15_t)0x8853, (q15_t)0x2d60, (q15_t)0x8851, (q15_t)0x2d5b, (q15_t)0x884f, + (q15_t)0x2d55, (q15_t)0x884c, (q15_t)0x2d4f, (q15_t)0x884a, (q15_t)0x2d49, (q15_t)0x8848, (q15_t)0x2d43, (q15_t)0x8846, + (q15_t)0x2d3d, (q15_t)0x8844, (q15_t)0x2d37, (q15_t)0x8841, (q15_t)0x2d31, (q15_t)0x883f, (q15_t)0x2d2c, (q15_t)0x883d, + (q15_t)0x2d26, (q15_t)0x883b, (q15_t)0x2d20, (q15_t)0x8838, (q15_t)0x2d1a, (q15_t)0x8836, (q15_t)0x2d14, (q15_t)0x8834, + (q15_t)0x2d0e, (q15_t)0x8832, (q15_t)0x2d08, (q15_t)0x8830, (q15_t)0x2d02, (q15_t)0x882d, (q15_t)0x2cfd, (q15_t)0x882b, + (q15_t)0x2cf7, (q15_t)0x8829, (q15_t)0x2cf1, (q15_t)0x8827, (q15_t)0x2ceb, (q15_t)0x8825, (q15_t)0x2ce5, (q15_t)0x8822, + (q15_t)0x2cdf, (q15_t)0x8820, (q15_t)0x2cd9, (q15_t)0x881e, (q15_t)0x2cd3, (q15_t)0x881c, (q15_t)0x2ccd, (q15_t)0x881a, + (q15_t)0x2cc8, (q15_t)0x8817, (q15_t)0x2cc2, (q15_t)0x8815, (q15_t)0x2cbc, (q15_t)0x8813, (q15_t)0x2cb6, (q15_t)0x8811, + (q15_t)0x2cb0, (q15_t)0x880f, (q15_t)0x2caa, (q15_t)0x880c, (q15_t)0x2ca4, (q15_t)0x880a, (q15_t)0x2c9e, (q15_t)0x8808, + (q15_t)0x2c98, (q15_t)0x8806, (q15_t)0x2c93, (q15_t)0x8804, (q15_t)0x2c8d, (q15_t)0x8801, (q15_t)0x2c87, (q15_t)0x87ff, + (q15_t)0x2c81, (q15_t)0x87fd, (q15_t)0x2c7b, (q15_t)0x87fb, (q15_t)0x2c75, (q15_t)0x87f9, (q15_t)0x2c6f, (q15_t)0x87f6, + (q15_t)0x2c69, (q15_t)0x87f4, (q15_t)0x2c63, (q15_t)0x87f2, (q15_t)0x2c5e, (q15_t)0x87f0, (q15_t)0x2c58, (q15_t)0x87ee, + (q15_t)0x2c52, (q15_t)0x87ec, (q15_t)0x2c4c, (q15_t)0x87e9, (q15_t)0x2c46, (q15_t)0x87e7, (q15_t)0x2c40, (q15_t)0x87e5, + (q15_t)0x2c3a, (q15_t)0x87e3, (q15_t)0x2c34, (q15_t)0x87e1, (q15_t)0x2c2e, (q15_t)0x87df, (q15_t)0x2c29, (q15_t)0x87dc, + (q15_t)0x2c23, (q15_t)0x87da, (q15_t)0x2c1d, (q15_t)0x87d8, (q15_t)0x2c17, (q15_t)0x87d6, (q15_t)0x2c11, (q15_t)0x87d4, + (q15_t)0x2c0b, (q15_t)0x87d2, (q15_t)0x2c05, (q15_t)0x87cf, (q15_t)0x2bff, (q15_t)0x87cd, (q15_t)0x2bf9, (q15_t)0x87cb, + (q15_t)0x2bf3, (q15_t)0x87c9, (q15_t)0x2bee, (q15_t)0x87c7, (q15_t)0x2be8, (q15_t)0x87c5, (q15_t)0x2be2, (q15_t)0x87c2, + (q15_t)0x2bdc, (q15_t)0x87c0, (q15_t)0x2bd6, (q15_t)0x87be, (q15_t)0x2bd0, (q15_t)0x87bc, (q15_t)0x2bca, (q15_t)0x87ba, + (q15_t)0x2bc4, (q15_t)0x87b8, (q15_t)0x2bbe, (q15_t)0x87b6, (q15_t)0x2bb8, (q15_t)0x87b3, (q15_t)0x2bb2, (q15_t)0x87b1, + (q15_t)0x2bad, (q15_t)0x87af, (q15_t)0x2ba7, (q15_t)0x87ad, (q15_t)0x2ba1, (q15_t)0x87ab, (q15_t)0x2b9b, (q15_t)0x87a9, + (q15_t)0x2b95, (q15_t)0x87a7, (q15_t)0x2b8f, (q15_t)0x87a4, (q15_t)0x2b89, (q15_t)0x87a2, (q15_t)0x2b83, (q15_t)0x87a0, + (q15_t)0x2b7d, (q15_t)0x879e, (q15_t)0x2b77, (q15_t)0x879c, (q15_t)0x2b71, (q15_t)0x879a, (q15_t)0x2b6c, (q15_t)0x8798, + (q15_t)0x2b66, (q15_t)0x8795, (q15_t)0x2b60, (q15_t)0x8793, (q15_t)0x2b5a, (q15_t)0x8791, (q15_t)0x2b54, (q15_t)0x878f, + (q15_t)0x2b4e, (q15_t)0x878d, (q15_t)0x2b48, (q15_t)0x878b, (q15_t)0x2b42, (q15_t)0x8789, (q15_t)0x2b3c, (q15_t)0x8787, + (q15_t)0x2b36, (q15_t)0x8784, (q15_t)0x2b30, (q15_t)0x8782, (q15_t)0x2b2b, (q15_t)0x8780, (q15_t)0x2b25, (q15_t)0x877e, + (q15_t)0x2b1f, (q15_t)0x877c, (q15_t)0x2b19, (q15_t)0x877a, (q15_t)0x2b13, (q15_t)0x8778, (q15_t)0x2b0d, (q15_t)0x8776, + (q15_t)0x2b07, (q15_t)0x8774, (q15_t)0x2b01, (q15_t)0x8771, (q15_t)0x2afb, (q15_t)0x876f, (q15_t)0x2af5, (q15_t)0x876d, + (q15_t)0x2aef, (q15_t)0x876b, (q15_t)0x2ae9, (q15_t)0x8769, (q15_t)0x2ae4, (q15_t)0x8767, (q15_t)0x2ade, (q15_t)0x8765, + (q15_t)0x2ad8, (q15_t)0x8763, (q15_t)0x2ad2, (q15_t)0x8761, (q15_t)0x2acc, (q15_t)0x875e, (q15_t)0x2ac6, (q15_t)0x875c, + (q15_t)0x2ac0, (q15_t)0x875a, (q15_t)0x2aba, (q15_t)0x8758, (q15_t)0x2ab4, (q15_t)0x8756, (q15_t)0x2aae, (q15_t)0x8754, + (q15_t)0x2aa8, (q15_t)0x8752, (q15_t)0x2aa2, (q15_t)0x8750, (q15_t)0x2a9c, (q15_t)0x874e, (q15_t)0x2a97, (q15_t)0x874c, + (q15_t)0x2a91, (q15_t)0x874a, (q15_t)0x2a8b, (q15_t)0x8747, (q15_t)0x2a85, (q15_t)0x8745, (q15_t)0x2a7f, (q15_t)0x8743, + (q15_t)0x2a79, (q15_t)0x8741, (q15_t)0x2a73, (q15_t)0x873f, (q15_t)0x2a6d, (q15_t)0x873d, (q15_t)0x2a67, (q15_t)0x873b, + (q15_t)0x2a61, (q15_t)0x8739, (q15_t)0x2a5b, (q15_t)0x8737, (q15_t)0x2a55, (q15_t)0x8735, (q15_t)0x2a4f, (q15_t)0x8733, + (q15_t)0x2a49, (q15_t)0x8731, (q15_t)0x2a44, (q15_t)0x872e, (q15_t)0x2a3e, (q15_t)0x872c, (q15_t)0x2a38, (q15_t)0x872a, + (q15_t)0x2a32, (q15_t)0x8728, (q15_t)0x2a2c, (q15_t)0x8726, (q15_t)0x2a26, (q15_t)0x8724, (q15_t)0x2a20, (q15_t)0x8722, + (q15_t)0x2a1a, (q15_t)0x8720, (q15_t)0x2a14, (q15_t)0x871e, (q15_t)0x2a0e, (q15_t)0x871c, (q15_t)0x2a08, (q15_t)0x871a, + (q15_t)0x2a02, (q15_t)0x8718, (q15_t)0x29fc, (q15_t)0x8716, (q15_t)0x29f6, (q15_t)0x8714, (q15_t)0x29f0, (q15_t)0x8712, + (q15_t)0x29eb, (q15_t)0x870f, (q15_t)0x29e5, (q15_t)0x870d, (q15_t)0x29df, (q15_t)0x870b, (q15_t)0x29d9, (q15_t)0x8709, + (q15_t)0x29d3, (q15_t)0x8707, (q15_t)0x29cd, (q15_t)0x8705, (q15_t)0x29c7, (q15_t)0x8703, (q15_t)0x29c1, (q15_t)0x8701, + (q15_t)0x29bb, (q15_t)0x86ff, (q15_t)0x29b5, (q15_t)0x86fd, (q15_t)0x29af, (q15_t)0x86fb, (q15_t)0x29a9, (q15_t)0x86f9, + (q15_t)0x29a3, (q15_t)0x86f7, (q15_t)0x299d, (q15_t)0x86f5, (q15_t)0x2997, (q15_t)0x86f3, (q15_t)0x2991, (q15_t)0x86f1, + (q15_t)0x298b, (q15_t)0x86ef, (q15_t)0x2986, (q15_t)0x86ed, (q15_t)0x2980, (q15_t)0x86eb, (q15_t)0x297a, (q15_t)0x86e9, + (q15_t)0x2974, (q15_t)0x86e7, (q15_t)0x296e, (q15_t)0x86e4, (q15_t)0x2968, (q15_t)0x86e2, (q15_t)0x2962, (q15_t)0x86e0, + (q15_t)0x295c, (q15_t)0x86de, (q15_t)0x2956, (q15_t)0x86dc, (q15_t)0x2950, (q15_t)0x86da, (q15_t)0x294a, (q15_t)0x86d8, + (q15_t)0x2944, (q15_t)0x86d6, (q15_t)0x293e, (q15_t)0x86d4, (q15_t)0x2938, (q15_t)0x86d2, (q15_t)0x2932, (q15_t)0x86d0, + (q15_t)0x292c, (q15_t)0x86ce, (q15_t)0x2926, (q15_t)0x86cc, (q15_t)0x2920, (q15_t)0x86ca, (q15_t)0x291b, (q15_t)0x86c8, + (q15_t)0x2915, (q15_t)0x86c6, (q15_t)0x290f, (q15_t)0x86c4, (q15_t)0x2909, (q15_t)0x86c2, (q15_t)0x2903, (q15_t)0x86c0, + (q15_t)0x28fd, (q15_t)0x86be, (q15_t)0x28f7, (q15_t)0x86bc, (q15_t)0x28f1, (q15_t)0x86ba, (q15_t)0x28eb, (q15_t)0x86b8, + (q15_t)0x28e5, (q15_t)0x86b6, (q15_t)0x28df, (q15_t)0x86b4, (q15_t)0x28d9, (q15_t)0x86b2, (q15_t)0x28d3, (q15_t)0x86b0, + (q15_t)0x28cd, (q15_t)0x86ae, (q15_t)0x28c7, (q15_t)0x86ac, (q15_t)0x28c1, (q15_t)0x86aa, (q15_t)0x28bb, (q15_t)0x86a8, + (q15_t)0x28b5, (q15_t)0x86a6, (q15_t)0x28af, (q15_t)0x86a4, (q15_t)0x28a9, (q15_t)0x86a2, (q15_t)0x28a3, (q15_t)0x86a0, + (q15_t)0x289d, (q15_t)0x869e, (q15_t)0x2898, (q15_t)0x869c, (q15_t)0x2892, (q15_t)0x869a, (q15_t)0x288c, (q15_t)0x8698, + (q15_t)0x2886, (q15_t)0x8696, (q15_t)0x2880, (q15_t)0x8694, (q15_t)0x287a, (q15_t)0x8692, (q15_t)0x2874, (q15_t)0x8690, + (q15_t)0x286e, (q15_t)0x868e, (q15_t)0x2868, (q15_t)0x868c, (q15_t)0x2862, (q15_t)0x868a, (q15_t)0x285c, (q15_t)0x8688, + (q15_t)0x2856, (q15_t)0x8686, (q15_t)0x2850, (q15_t)0x8684, (q15_t)0x284a, (q15_t)0x8682, (q15_t)0x2844, (q15_t)0x8680, + (q15_t)0x283e, (q15_t)0x867e, (q15_t)0x2838, (q15_t)0x867c, (q15_t)0x2832, (q15_t)0x867a, (q15_t)0x282c, (q15_t)0x8678, + (q15_t)0x2826, (q15_t)0x8676, (q15_t)0x2820, (q15_t)0x8674, (q15_t)0x281a, (q15_t)0x8672, (q15_t)0x2814, (q15_t)0x8670, + (q15_t)0x280e, (q15_t)0x866e, (q15_t)0x2808, (q15_t)0x866d, (q15_t)0x2802, (q15_t)0x866b, (q15_t)0x27fc, (q15_t)0x8669, + (q15_t)0x27f6, (q15_t)0x8667, (q15_t)0x27f1, (q15_t)0x8665, (q15_t)0x27eb, (q15_t)0x8663, (q15_t)0x27e5, (q15_t)0x8661, + (q15_t)0x27df, (q15_t)0x865f, (q15_t)0x27d9, (q15_t)0x865d, (q15_t)0x27d3, (q15_t)0x865b, (q15_t)0x27cd, (q15_t)0x8659, + (q15_t)0x27c7, (q15_t)0x8657, (q15_t)0x27c1, (q15_t)0x8655, (q15_t)0x27bb, (q15_t)0x8653, (q15_t)0x27b5, (q15_t)0x8651, + (q15_t)0x27af, (q15_t)0x864f, (q15_t)0x27a9, (q15_t)0x864d, (q15_t)0x27a3, (q15_t)0x864b, (q15_t)0x279d, (q15_t)0x8649, + (q15_t)0x2797, (q15_t)0x8647, (q15_t)0x2791, (q15_t)0x8645, (q15_t)0x278b, (q15_t)0x8644, (q15_t)0x2785, (q15_t)0x8642, + (q15_t)0x277f, (q15_t)0x8640, (q15_t)0x2779, (q15_t)0x863e, (q15_t)0x2773, (q15_t)0x863c, (q15_t)0x276d, (q15_t)0x863a, + (q15_t)0x2767, (q15_t)0x8638, (q15_t)0x2761, (q15_t)0x8636, (q15_t)0x275b, (q15_t)0x8634, (q15_t)0x2755, (q15_t)0x8632, + (q15_t)0x274f, (q15_t)0x8630, (q15_t)0x2749, (q15_t)0x862e, (q15_t)0x2743, (q15_t)0x862c, (q15_t)0x273d, (q15_t)0x862a, + (q15_t)0x2737, (q15_t)0x8628, (q15_t)0x2731, (q15_t)0x8627, (q15_t)0x272b, (q15_t)0x8625, (q15_t)0x2725, (q15_t)0x8623, + (q15_t)0x271f, (q15_t)0x8621, (q15_t)0x2719, (q15_t)0x861f, (q15_t)0x2713, (q15_t)0x861d, (q15_t)0x270d, (q15_t)0x861b, + (q15_t)0x2707, (q15_t)0x8619, (q15_t)0x2701, (q15_t)0x8617, (q15_t)0x26fb, (q15_t)0x8615, (q15_t)0x26f5, (q15_t)0x8613, + (q15_t)0x26ef, (q15_t)0x8611, (q15_t)0x26e9, (q15_t)0x8610, (q15_t)0x26e4, (q15_t)0x860e, (q15_t)0x26de, (q15_t)0x860c, + (q15_t)0x26d8, (q15_t)0x860a, (q15_t)0x26d2, (q15_t)0x8608, (q15_t)0x26cc, (q15_t)0x8606, (q15_t)0x26c6, (q15_t)0x8604, + (q15_t)0x26c0, (q15_t)0x8602, (q15_t)0x26ba, (q15_t)0x8600, (q15_t)0x26b4, (q15_t)0x85fe, (q15_t)0x26ae, (q15_t)0x85fc, + (q15_t)0x26a8, (q15_t)0x85fb, (q15_t)0x26a2, (q15_t)0x85f9, (q15_t)0x269c, (q15_t)0x85f7, (q15_t)0x2696, (q15_t)0x85f5, + (q15_t)0x2690, (q15_t)0x85f3, (q15_t)0x268a, (q15_t)0x85f1, (q15_t)0x2684, (q15_t)0x85ef, (q15_t)0x267e, (q15_t)0x85ed, + (q15_t)0x2678, (q15_t)0x85eb, (q15_t)0x2672, (q15_t)0x85ea, (q15_t)0x266c, (q15_t)0x85e8, (q15_t)0x2666, (q15_t)0x85e6, + (q15_t)0x2660, (q15_t)0x85e4, (q15_t)0x265a, (q15_t)0x85e2, (q15_t)0x2654, (q15_t)0x85e0, (q15_t)0x264e, (q15_t)0x85de, + (q15_t)0x2648, (q15_t)0x85dc, (q15_t)0x2642, (q15_t)0x85da, (q15_t)0x263c, (q15_t)0x85d9, (q15_t)0x2636, (q15_t)0x85d7, + (q15_t)0x2630, (q15_t)0x85d5, (q15_t)0x262a, (q15_t)0x85d3, (q15_t)0x2624, (q15_t)0x85d1, (q15_t)0x261e, (q15_t)0x85cf, + (q15_t)0x2618, (q15_t)0x85cd, (q15_t)0x2612, (q15_t)0x85cb, (q15_t)0x260c, (q15_t)0x85ca, (q15_t)0x2606, (q15_t)0x85c8, + (q15_t)0x2600, (q15_t)0x85c6, (q15_t)0x25fa, (q15_t)0x85c4, (q15_t)0x25f4, (q15_t)0x85c2, (q15_t)0x25ee, (q15_t)0x85c0, + (q15_t)0x25e8, (q15_t)0x85be, (q15_t)0x25e2, (q15_t)0x85bd, (q15_t)0x25dc, (q15_t)0x85bb, (q15_t)0x25d6, (q15_t)0x85b9, + (q15_t)0x25d0, (q15_t)0x85b7, (q15_t)0x25ca, (q15_t)0x85b5, (q15_t)0x25c4, (q15_t)0x85b3, (q15_t)0x25be, (q15_t)0x85b1, + (q15_t)0x25b8, (q15_t)0x85b0, (q15_t)0x25b2, (q15_t)0x85ae, (q15_t)0x25ac, (q15_t)0x85ac, (q15_t)0x25a6, (q15_t)0x85aa, + (q15_t)0x25a0, (q15_t)0x85a8, (q15_t)0x259a, (q15_t)0x85a6, (q15_t)0x2594, (q15_t)0x85a4, (q15_t)0x258e, (q15_t)0x85a3, + (q15_t)0x2588, (q15_t)0x85a1, (q15_t)0x2582, (q15_t)0x859f, (q15_t)0x257c, (q15_t)0x859d, (q15_t)0x2576, (q15_t)0x859b, + (q15_t)0x2570, (q15_t)0x8599, (q15_t)0x256a, (q15_t)0x8598, (q15_t)0x2564, (q15_t)0x8596, (q15_t)0x255e, (q15_t)0x8594, + (q15_t)0x2558, (q15_t)0x8592, (q15_t)0x2552, (q15_t)0x8590, (q15_t)0x254c, (q15_t)0x858e, (q15_t)0x2546, (q15_t)0x858d, + (q15_t)0x2540, (q15_t)0x858b, (q15_t)0x253a, (q15_t)0x8589, (q15_t)0x2534, (q15_t)0x8587, (q15_t)0x252e, (q15_t)0x8585, + (q15_t)0x2528, (q15_t)0x8583, (q15_t)0x2522, (q15_t)0x8582, (q15_t)0x251c, (q15_t)0x8580, (q15_t)0x2516, (q15_t)0x857e, + (q15_t)0x250f, (q15_t)0x857c, (q15_t)0x2509, (q15_t)0x857a, (q15_t)0x2503, (q15_t)0x8579, (q15_t)0x24fd, (q15_t)0x8577, + (q15_t)0x24f7, (q15_t)0x8575, (q15_t)0x24f1, (q15_t)0x8573, (q15_t)0x24eb, (q15_t)0x8571, (q15_t)0x24e5, (q15_t)0x856f, + (q15_t)0x24df, (q15_t)0x856e, (q15_t)0x24d9, (q15_t)0x856c, (q15_t)0x24d3, (q15_t)0x856a, (q15_t)0x24cd, (q15_t)0x8568, + (q15_t)0x24c7, (q15_t)0x8566, (q15_t)0x24c1, (q15_t)0x8565, (q15_t)0x24bb, (q15_t)0x8563, (q15_t)0x24b5, (q15_t)0x8561, + (q15_t)0x24af, (q15_t)0x855f, (q15_t)0x24a9, (q15_t)0x855d, (q15_t)0x24a3, (q15_t)0x855c, (q15_t)0x249d, (q15_t)0x855a, + (q15_t)0x2497, (q15_t)0x8558, (q15_t)0x2491, (q15_t)0x8556, (q15_t)0x248b, (q15_t)0x8554, (q15_t)0x2485, (q15_t)0x8553, + (q15_t)0x247f, (q15_t)0x8551, (q15_t)0x2479, (q15_t)0x854f, (q15_t)0x2473, (q15_t)0x854d, (q15_t)0x246d, (q15_t)0x854b, + (q15_t)0x2467, (q15_t)0x854a, (q15_t)0x2461, (q15_t)0x8548, (q15_t)0x245b, (q15_t)0x8546, (q15_t)0x2455, (q15_t)0x8544, + (q15_t)0x244f, (q15_t)0x8543, (q15_t)0x2449, (q15_t)0x8541, (q15_t)0x2443, (q15_t)0x853f, (q15_t)0x243d, (q15_t)0x853d, + (q15_t)0x2437, (q15_t)0x853b, (q15_t)0x2431, (q15_t)0x853a, (q15_t)0x242b, (q15_t)0x8538, (q15_t)0x2425, (q15_t)0x8536, + (q15_t)0x241f, (q15_t)0x8534, (q15_t)0x2419, (q15_t)0x8533, (q15_t)0x2413, (q15_t)0x8531, (q15_t)0x240d, (q15_t)0x852f, + (q15_t)0x2407, (q15_t)0x852d, (q15_t)0x2401, (q15_t)0x852b, (q15_t)0x23fa, (q15_t)0x852a, (q15_t)0x23f4, (q15_t)0x8528, + (q15_t)0x23ee, (q15_t)0x8526, (q15_t)0x23e8, (q15_t)0x8524, (q15_t)0x23e2, (q15_t)0x8523, (q15_t)0x23dc, (q15_t)0x8521, + (q15_t)0x23d6, (q15_t)0x851f, (q15_t)0x23d0, (q15_t)0x851d, (q15_t)0x23ca, (q15_t)0x851c, (q15_t)0x23c4, (q15_t)0x851a, + (q15_t)0x23be, (q15_t)0x8518, (q15_t)0x23b8, (q15_t)0x8516, (q15_t)0x23b2, (q15_t)0x8515, (q15_t)0x23ac, (q15_t)0x8513, + (q15_t)0x23a6, (q15_t)0x8511, (q15_t)0x23a0, (q15_t)0x850f, (q15_t)0x239a, (q15_t)0x850e, (q15_t)0x2394, (q15_t)0x850c, + (q15_t)0x238e, (q15_t)0x850a, (q15_t)0x2388, (q15_t)0x8508, (q15_t)0x2382, (q15_t)0x8507, (q15_t)0x237c, (q15_t)0x8505, + (q15_t)0x2376, (q15_t)0x8503, (q15_t)0x2370, (q15_t)0x8501, (q15_t)0x236a, (q15_t)0x8500, (q15_t)0x2364, (q15_t)0x84fe, + (q15_t)0x235e, (q15_t)0x84fc, (q15_t)0x2358, (q15_t)0x84fa, (q15_t)0x2352, (q15_t)0x84f9, (q15_t)0x234b, (q15_t)0x84f7, + (q15_t)0x2345, (q15_t)0x84f5, (q15_t)0x233f, (q15_t)0x84f4, (q15_t)0x2339, (q15_t)0x84f2, (q15_t)0x2333, (q15_t)0x84f0, + (q15_t)0x232d, (q15_t)0x84ee, (q15_t)0x2327, (q15_t)0x84ed, (q15_t)0x2321, (q15_t)0x84eb, (q15_t)0x231b, (q15_t)0x84e9, + (q15_t)0x2315, (q15_t)0x84e7, (q15_t)0x230f, (q15_t)0x84e6, (q15_t)0x2309, (q15_t)0x84e4, (q15_t)0x2303, (q15_t)0x84e2, + (q15_t)0x22fd, (q15_t)0x84e1, (q15_t)0x22f7, (q15_t)0x84df, (q15_t)0x22f1, (q15_t)0x84dd, (q15_t)0x22eb, (q15_t)0x84db, + (q15_t)0x22e5, (q15_t)0x84da, (q15_t)0x22df, (q15_t)0x84d8, (q15_t)0x22d9, (q15_t)0x84d6, (q15_t)0x22d3, (q15_t)0x84d5, + (q15_t)0x22cd, (q15_t)0x84d3, (q15_t)0x22c7, (q15_t)0x84d1, (q15_t)0x22c0, (q15_t)0x84cf, (q15_t)0x22ba, (q15_t)0x84ce, + (q15_t)0x22b4, (q15_t)0x84cc, (q15_t)0x22ae, (q15_t)0x84ca, (q15_t)0x22a8, (q15_t)0x84c9, (q15_t)0x22a2, (q15_t)0x84c7, + (q15_t)0x229c, (q15_t)0x84c5, (q15_t)0x2296, (q15_t)0x84c4, (q15_t)0x2290, (q15_t)0x84c2, (q15_t)0x228a, (q15_t)0x84c0, + (q15_t)0x2284, (q15_t)0x84be, (q15_t)0x227e, (q15_t)0x84bd, (q15_t)0x2278, (q15_t)0x84bb, (q15_t)0x2272, (q15_t)0x84b9, + (q15_t)0x226c, (q15_t)0x84b8, (q15_t)0x2266, (q15_t)0x84b6, (q15_t)0x2260, (q15_t)0x84b4, (q15_t)0x225a, (q15_t)0x84b3, + (q15_t)0x2254, (q15_t)0x84b1, (q15_t)0x224e, (q15_t)0x84af, (q15_t)0x2247, (q15_t)0x84ae, (q15_t)0x2241, (q15_t)0x84ac, + (q15_t)0x223b, (q15_t)0x84aa, (q15_t)0x2235, (q15_t)0x84a9, (q15_t)0x222f, (q15_t)0x84a7, (q15_t)0x2229, (q15_t)0x84a5, + (q15_t)0x2223, (q15_t)0x84a3, (q15_t)0x221d, (q15_t)0x84a2, (q15_t)0x2217, (q15_t)0x84a0, (q15_t)0x2211, (q15_t)0x849e, + (q15_t)0x220b, (q15_t)0x849d, (q15_t)0x2205, (q15_t)0x849b, (q15_t)0x21ff, (q15_t)0x8499, (q15_t)0x21f9, (q15_t)0x8498, + (q15_t)0x21f3, (q15_t)0x8496, (q15_t)0x21ed, (q15_t)0x8494, (q15_t)0x21e7, (q15_t)0x8493, (q15_t)0x21e1, (q15_t)0x8491, + (q15_t)0x21da, (q15_t)0x848f, (q15_t)0x21d4, (q15_t)0x848e, (q15_t)0x21ce, (q15_t)0x848c, (q15_t)0x21c8, (q15_t)0x848a, + (q15_t)0x21c2, (q15_t)0x8489, (q15_t)0x21bc, (q15_t)0x8487, (q15_t)0x21b6, (q15_t)0x8486, (q15_t)0x21b0, (q15_t)0x8484, + (q15_t)0x21aa, (q15_t)0x8482, (q15_t)0x21a4, (q15_t)0x8481, (q15_t)0x219e, (q15_t)0x847f, (q15_t)0x2198, (q15_t)0x847d, + (q15_t)0x2192, (q15_t)0x847c, (q15_t)0x218c, (q15_t)0x847a, (q15_t)0x2186, (q15_t)0x8478, (q15_t)0x2180, (q15_t)0x8477, + (q15_t)0x2179, (q15_t)0x8475, (q15_t)0x2173, (q15_t)0x8473, (q15_t)0x216d, (q15_t)0x8472, (q15_t)0x2167, (q15_t)0x8470, + (q15_t)0x2161, (q15_t)0x846e, (q15_t)0x215b, (q15_t)0x846d, (q15_t)0x2155, (q15_t)0x846b, (q15_t)0x214f, (q15_t)0x846a, + (q15_t)0x2149, (q15_t)0x8468, (q15_t)0x2143, (q15_t)0x8466, (q15_t)0x213d, (q15_t)0x8465, (q15_t)0x2137, (q15_t)0x8463, + (q15_t)0x2131, (q15_t)0x8461, (q15_t)0x212b, (q15_t)0x8460, (q15_t)0x2125, (q15_t)0x845e, (q15_t)0x211e, (q15_t)0x845d, + (q15_t)0x2118, (q15_t)0x845b, (q15_t)0x2112, (q15_t)0x8459, (q15_t)0x210c, (q15_t)0x8458, (q15_t)0x2106, (q15_t)0x8456, + (q15_t)0x2100, (q15_t)0x8454, (q15_t)0x20fa, (q15_t)0x8453, (q15_t)0x20f4, (q15_t)0x8451, (q15_t)0x20ee, (q15_t)0x8450, + (q15_t)0x20e8, (q15_t)0x844e, (q15_t)0x20e2, (q15_t)0x844c, (q15_t)0x20dc, (q15_t)0x844b, (q15_t)0x20d6, (q15_t)0x8449, + (q15_t)0x20d0, (q15_t)0x8447, (q15_t)0x20c9, (q15_t)0x8446, (q15_t)0x20c3, (q15_t)0x8444, (q15_t)0x20bd, (q15_t)0x8443, + (q15_t)0x20b7, (q15_t)0x8441, (q15_t)0x20b1, (q15_t)0x843f, (q15_t)0x20ab, (q15_t)0x843e, (q15_t)0x20a5, (q15_t)0x843c, + (q15_t)0x209f, (q15_t)0x843b, (q15_t)0x2099, (q15_t)0x8439, (q15_t)0x2093, (q15_t)0x8437, (q15_t)0x208d, (q15_t)0x8436, + (q15_t)0x2087, (q15_t)0x8434, (q15_t)0x2081, (q15_t)0x8433, (q15_t)0x207a, (q15_t)0x8431, (q15_t)0x2074, (q15_t)0x842f, + (q15_t)0x206e, (q15_t)0x842e, (q15_t)0x2068, (q15_t)0x842c, (q15_t)0x2062, (q15_t)0x842b, (q15_t)0x205c, (q15_t)0x8429, + (q15_t)0x2056, (q15_t)0x8427, (q15_t)0x2050, (q15_t)0x8426, (q15_t)0x204a, (q15_t)0x8424, (q15_t)0x2044, (q15_t)0x8423, + (q15_t)0x203e, (q15_t)0x8421, (q15_t)0x2038, (q15_t)0x8420, (q15_t)0x2032, (q15_t)0x841e, (q15_t)0x202b, (q15_t)0x841c, + (q15_t)0x2025, (q15_t)0x841b, (q15_t)0x201f, (q15_t)0x8419, (q15_t)0x2019, (q15_t)0x8418, (q15_t)0x2013, (q15_t)0x8416, + (q15_t)0x200d, (q15_t)0x8415, (q15_t)0x2007, (q15_t)0x8413, (q15_t)0x2001, (q15_t)0x8411, (q15_t)0x1ffb, (q15_t)0x8410, + (q15_t)0x1ff5, (q15_t)0x840e, (q15_t)0x1fef, (q15_t)0x840d, (q15_t)0x1fe9, (q15_t)0x840b, (q15_t)0x1fe2, (q15_t)0x840a, + (q15_t)0x1fdc, (q15_t)0x8408, (q15_t)0x1fd6, (q15_t)0x8406, (q15_t)0x1fd0, (q15_t)0x8405, (q15_t)0x1fca, (q15_t)0x8403, + (q15_t)0x1fc4, (q15_t)0x8402, (q15_t)0x1fbe, (q15_t)0x8400, (q15_t)0x1fb8, (q15_t)0x83ff, (q15_t)0x1fb2, (q15_t)0x83fd, + (q15_t)0x1fac, (q15_t)0x83fb, (q15_t)0x1fa6, (q15_t)0x83fa, (q15_t)0x1f9f, (q15_t)0x83f8, (q15_t)0x1f99, (q15_t)0x83f7, + (q15_t)0x1f93, (q15_t)0x83f5, (q15_t)0x1f8d, (q15_t)0x83f4, (q15_t)0x1f87, (q15_t)0x83f2, (q15_t)0x1f81, (q15_t)0x83f1, + (q15_t)0x1f7b, (q15_t)0x83ef, (q15_t)0x1f75, (q15_t)0x83ee, (q15_t)0x1f6f, (q15_t)0x83ec, (q15_t)0x1f69, (q15_t)0x83ea, + (q15_t)0x1f63, (q15_t)0x83e9, (q15_t)0x1f5d, (q15_t)0x83e7, (q15_t)0x1f56, (q15_t)0x83e6, (q15_t)0x1f50, (q15_t)0x83e4, + (q15_t)0x1f4a, (q15_t)0x83e3, (q15_t)0x1f44, (q15_t)0x83e1, (q15_t)0x1f3e, (q15_t)0x83e0, (q15_t)0x1f38, (q15_t)0x83de, + (q15_t)0x1f32, (q15_t)0x83dd, (q15_t)0x1f2c, (q15_t)0x83db, (q15_t)0x1f26, (q15_t)0x83da, (q15_t)0x1f20, (q15_t)0x83d8, + (q15_t)0x1f19, (q15_t)0x83d7, (q15_t)0x1f13, (q15_t)0x83d5, (q15_t)0x1f0d, (q15_t)0x83d3, (q15_t)0x1f07, (q15_t)0x83d2, + (q15_t)0x1f01, (q15_t)0x83d0, (q15_t)0x1efb, (q15_t)0x83cf, (q15_t)0x1ef5, (q15_t)0x83cd, (q15_t)0x1eef, (q15_t)0x83cc, + (q15_t)0x1ee9, (q15_t)0x83ca, (q15_t)0x1ee3, (q15_t)0x83c9, (q15_t)0x1edd, (q15_t)0x83c7, (q15_t)0x1ed6, (q15_t)0x83c6, + (q15_t)0x1ed0, (q15_t)0x83c4, (q15_t)0x1eca, (q15_t)0x83c3, (q15_t)0x1ec4, (q15_t)0x83c1, (q15_t)0x1ebe, (q15_t)0x83c0, + (q15_t)0x1eb8, (q15_t)0x83be, (q15_t)0x1eb2, (q15_t)0x83bd, (q15_t)0x1eac, (q15_t)0x83bb, (q15_t)0x1ea6, (q15_t)0x83ba, + (q15_t)0x1ea0, (q15_t)0x83b8, (q15_t)0x1e99, (q15_t)0x83b7, (q15_t)0x1e93, (q15_t)0x83b5, (q15_t)0x1e8d, (q15_t)0x83b4, + (q15_t)0x1e87, (q15_t)0x83b2, (q15_t)0x1e81, (q15_t)0x83b1, (q15_t)0x1e7b, (q15_t)0x83af, (q15_t)0x1e75, (q15_t)0x83ae, + (q15_t)0x1e6f, (q15_t)0x83ac, (q15_t)0x1e69, (q15_t)0x83ab, (q15_t)0x1e62, (q15_t)0x83a9, (q15_t)0x1e5c, (q15_t)0x83a8, + (q15_t)0x1e56, (q15_t)0x83a6, (q15_t)0x1e50, (q15_t)0x83a5, (q15_t)0x1e4a, (q15_t)0x83a3, (q15_t)0x1e44, (q15_t)0x83a2, + (q15_t)0x1e3e, (q15_t)0x83a0, (q15_t)0x1e38, (q15_t)0x839f, (q15_t)0x1e32, (q15_t)0x839d, (q15_t)0x1e2c, (q15_t)0x839c, + (q15_t)0x1e25, (q15_t)0x839a, (q15_t)0x1e1f, (q15_t)0x8399, (q15_t)0x1e19, (q15_t)0x8397, (q15_t)0x1e13, (q15_t)0x8396, + (q15_t)0x1e0d, (q15_t)0x8394, (q15_t)0x1e07, (q15_t)0x8393, (q15_t)0x1e01, (q15_t)0x8392, (q15_t)0x1dfb, (q15_t)0x8390, + (q15_t)0x1df5, (q15_t)0x838f, (q15_t)0x1dee, (q15_t)0x838d, (q15_t)0x1de8, (q15_t)0x838c, (q15_t)0x1de2, (q15_t)0x838a, + (q15_t)0x1ddc, (q15_t)0x8389, (q15_t)0x1dd6, (q15_t)0x8387, (q15_t)0x1dd0, (q15_t)0x8386, (q15_t)0x1dca, (q15_t)0x8384, + (q15_t)0x1dc4, (q15_t)0x8383, (q15_t)0x1dbe, (q15_t)0x8381, (q15_t)0x1db7, (q15_t)0x8380, (q15_t)0x1db1, (q15_t)0x837e, + (q15_t)0x1dab, (q15_t)0x837d, (q15_t)0x1da5, (q15_t)0x837c, (q15_t)0x1d9f, (q15_t)0x837a, (q15_t)0x1d99, (q15_t)0x8379, + (q15_t)0x1d93, (q15_t)0x8377, (q15_t)0x1d8d, (q15_t)0x8376, (q15_t)0x1d87, (q15_t)0x8374, (q15_t)0x1d80, (q15_t)0x8373, + (q15_t)0x1d7a, (q15_t)0x8371, (q15_t)0x1d74, (q15_t)0x8370, (q15_t)0x1d6e, (q15_t)0x836f, (q15_t)0x1d68, (q15_t)0x836d, + (q15_t)0x1d62, (q15_t)0x836c, (q15_t)0x1d5c, (q15_t)0x836a, (q15_t)0x1d56, (q15_t)0x8369, (q15_t)0x1d50, (q15_t)0x8367, + (q15_t)0x1d49, (q15_t)0x8366, (q15_t)0x1d43, (q15_t)0x8364, (q15_t)0x1d3d, (q15_t)0x8363, (q15_t)0x1d37, (q15_t)0x8362, + (q15_t)0x1d31, (q15_t)0x8360, (q15_t)0x1d2b, (q15_t)0x835f, (q15_t)0x1d25, (q15_t)0x835d, (q15_t)0x1d1f, (q15_t)0x835c, + (q15_t)0x1d18, (q15_t)0x835a, (q15_t)0x1d12, (q15_t)0x8359, (q15_t)0x1d0c, (q15_t)0x8358, (q15_t)0x1d06, (q15_t)0x8356, + (q15_t)0x1d00, (q15_t)0x8355, (q15_t)0x1cfa, (q15_t)0x8353, (q15_t)0x1cf4, (q15_t)0x8352, (q15_t)0x1cee, (q15_t)0x8350, + (q15_t)0x1ce8, (q15_t)0x834f, (q15_t)0x1ce1, (q15_t)0x834e, (q15_t)0x1cdb, (q15_t)0x834c, (q15_t)0x1cd5, (q15_t)0x834b, + (q15_t)0x1ccf, (q15_t)0x8349, (q15_t)0x1cc9, (q15_t)0x8348, (q15_t)0x1cc3, (q15_t)0x8347, (q15_t)0x1cbd, (q15_t)0x8345, + (q15_t)0x1cb7, (q15_t)0x8344, (q15_t)0x1cb0, (q15_t)0x8342, (q15_t)0x1caa, (q15_t)0x8341, (q15_t)0x1ca4, (q15_t)0x833f, + (q15_t)0x1c9e, (q15_t)0x833e, (q15_t)0x1c98, (q15_t)0x833d, (q15_t)0x1c92, (q15_t)0x833b, (q15_t)0x1c8c, (q15_t)0x833a, + (q15_t)0x1c86, (q15_t)0x8338, (q15_t)0x1c7f, (q15_t)0x8337, (q15_t)0x1c79, (q15_t)0x8336, (q15_t)0x1c73, (q15_t)0x8334, + (q15_t)0x1c6d, (q15_t)0x8333, (q15_t)0x1c67, (q15_t)0x8331, (q15_t)0x1c61, (q15_t)0x8330, (q15_t)0x1c5b, (q15_t)0x832f, + (q15_t)0x1c55, (q15_t)0x832d, (q15_t)0x1c4e, (q15_t)0x832c, (q15_t)0x1c48, (q15_t)0x832b, (q15_t)0x1c42, (q15_t)0x8329, + (q15_t)0x1c3c, (q15_t)0x8328, (q15_t)0x1c36, (q15_t)0x8326, (q15_t)0x1c30, (q15_t)0x8325, (q15_t)0x1c2a, (q15_t)0x8324, + (q15_t)0x1c24, (q15_t)0x8322, (q15_t)0x1c1d, (q15_t)0x8321, (q15_t)0x1c17, (q15_t)0x831f, (q15_t)0x1c11, (q15_t)0x831e, + (q15_t)0x1c0b, (q15_t)0x831d, (q15_t)0x1c05, (q15_t)0x831b, (q15_t)0x1bff, (q15_t)0x831a, (q15_t)0x1bf9, (q15_t)0x8319, + (q15_t)0x1bf2, (q15_t)0x8317, (q15_t)0x1bec, (q15_t)0x8316, (q15_t)0x1be6, (q15_t)0x8314, (q15_t)0x1be0, (q15_t)0x8313, + (q15_t)0x1bda, (q15_t)0x8312, (q15_t)0x1bd4, (q15_t)0x8310, (q15_t)0x1bce, (q15_t)0x830f, (q15_t)0x1bc8, (q15_t)0x830e, + (q15_t)0x1bc1, (q15_t)0x830c, (q15_t)0x1bbb, (q15_t)0x830b, (q15_t)0x1bb5, (q15_t)0x830a, (q15_t)0x1baf, (q15_t)0x8308, + (q15_t)0x1ba9, (q15_t)0x8307, (q15_t)0x1ba3, (q15_t)0x8305, (q15_t)0x1b9d, (q15_t)0x8304, (q15_t)0x1b96, (q15_t)0x8303, + (q15_t)0x1b90, (q15_t)0x8301, (q15_t)0x1b8a, (q15_t)0x8300, (q15_t)0x1b84, (q15_t)0x82ff, (q15_t)0x1b7e, (q15_t)0x82fd, + (q15_t)0x1b78, (q15_t)0x82fc, (q15_t)0x1b72, (q15_t)0x82fb, (q15_t)0x1b6c, (q15_t)0x82f9, (q15_t)0x1b65, (q15_t)0x82f8, + (q15_t)0x1b5f, (q15_t)0x82f7, (q15_t)0x1b59, (q15_t)0x82f5, (q15_t)0x1b53, (q15_t)0x82f4, (q15_t)0x1b4d, (q15_t)0x82f3, + (q15_t)0x1b47, (q15_t)0x82f1, (q15_t)0x1b41, (q15_t)0x82f0, (q15_t)0x1b3a, (q15_t)0x82ef, (q15_t)0x1b34, (q15_t)0x82ed, + (q15_t)0x1b2e, (q15_t)0x82ec, (q15_t)0x1b28, (q15_t)0x82eb, (q15_t)0x1b22, (q15_t)0x82e9, (q15_t)0x1b1c, (q15_t)0x82e8, + (q15_t)0x1b16, (q15_t)0x82e7, (q15_t)0x1b0f, (q15_t)0x82e5, (q15_t)0x1b09, (q15_t)0x82e4, (q15_t)0x1b03, (q15_t)0x82e3, + (q15_t)0x1afd, (q15_t)0x82e1, (q15_t)0x1af7, (q15_t)0x82e0, (q15_t)0x1af1, (q15_t)0x82df, (q15_t)0x1aeb, (q15_t)0x82dd, + (q15_t)0x1ae4, (q15_t)0x82dc, (q15_t)0x1ade, (q15_t)0x82db, (q15_t)0x1ad8, (q15_t)0x82d9, (q15_t)0x1ad2, (q15_t)0x82d8, + (q15_t)0x1acc, (q15_t)0x82d7, (q15_t)0x1ac6, (q15_t)0x82d5, (q15_t)0x1ac0, (q15_t)0x82d4, (q15_t)0x1ab9, (q15_t)0x82d3, + (q15_t)0x1ab3, (q15_t)0x82d1, (q15_t)0x1aad, (q15_t)0x82d0, (q15_t)0x1aa7, (q15_t)0x82cf, (q15_t)0x1aa1, (q15_t)0x82ce, + (q15_t)0x1a9b, (q15_t)0x82cc, (q15_t)0x1a95, (q15_t)0x82cb, (q15_t)0x1a8e, (q15_t)0x82ca, (q15_t)0x1a88, (q15_t)0x82c8, + (q15_t)0x1a82, (q15_t)0x82c7, (q15_t)0x1a7c, (q15_t)0x82c6, (q15_t)0x1a76, (q15_t)0x82c4, (q15_t)0x1a70, (q15_t)0x82c3, + (q15_t)0x1a6a, (q15_t)0x82c2, (q15_t)0x1a63, (q15_t)0x82c1, (q15_t)0x1a5d, (q15_t)0x82bf, (q15_t)0x1a57, (q15_t)0x82be, + (q15_t)0x1a51, (q15_t)0x82bd, (q15_t)0x1a4b, (q15_t)0x82bb, (q15_t)0x1a45, (q15_t)0x82ba, (q15_t)0x1a3e, (q15_t)0x82b9, + (q15_t)0x1a38, (q15_t)0x82b7, (q15_t)0x1a32, (q15_t)0x82b6, (q15_t)0x1a2c, (q15_t)0x82b5, (q15_t)0x1a26, (q15_t)0x82b4, + (q15_t)0x1a20, (q15_t)0x82b2, (q15_t)0x1a1a, (q15_t)0x82b1, (q15_t)0x1a13, (q15_t)0x82b0, (q15_t)0x1a0d, (q15_t)0x82ae, + (q15_t)0x1a07, (q15_t)0x82ad, (q15_t)0x1a01, (q15_t)0x82ac, (q15_t)0x19fb, (q15_t)0x82ab, (q15_t)0x19f5, (q15_t)0x82a9, + (q15_t)0x19ef, (q15_t)0x82a8, (q15_t)0x19e8, (q15_t)0x82a7, (q15_t)0x19e2, (q15_t)0x82a6, (q15_t)0x19dc, (q15_t)0x82a4, + (q15_t)0x19d6, (q15_t)0x82a3, (q15_t)0x19d0, (q15_t)0x82a2, (q15_t)0x19ca, (q15_t)0x82a0, (q15_t)0x19c3, (q15_t)0x829f, + (q15_t)0x19bd, (q15_t)0x829e, (q15_t)0x19b7, (q15_t)0x829d, (q15_t)0x19b1, (q15_t)0x829b, (q15_t)0x19ab, (q15_t)0x829a, + (q15_t)0x19a5, (q15_t)0x8299, (q15_t)0x199f, (q15_t)0x8298, (q15_t)0x1998, (q15_t)0x8296, (q15_t)0x1992, (q15_t)0x8295, + (q15_t)0x198c, (q15_t)0x8294, (q15_t)0x1986, (q15_t)0x8293, (q15_t)0x1980, (q15_t)0x8291, (q15_t)0x197a, (q15_t)0x8290, + (q15_t)0x1973, (q15_t)0x828f, (q15_t)0x196d, (q15_t)0x828e, (q15_t)0x1967, (q15_t)0x828c, (q15_t)0x1961, (q15_t)0x828b, + (q15_t)0x195b, (q15_t)0x828a, (q15_t)0x1955, (q15_t)0x8289, (q15_t)0x194e, (q15_t)0x8287, (q15_t)0x1948, (q15_t)0x8286, + (q15_t)0x1942, (q15_t)0x8285, (q15_t)0x193c, (q15_t)0x8284, (q15_t)0x1936, (q15_t)0x8282, (q15_t)0x1930, (q15_t)0x8281, + (q15_t)0x192a, (q15_t)0x8280, (q15_t)0x1923, (q15_t)0x827f, (q15_t)0x191d, (q15_t)0x827e, (q15_t)0x1917, (q15_t)0x827c, + (q15_t)0x1911, (q15_t)0x827b, (q15_t)0x190b, (q15_t)0x827a, (q15_t)0x1905, (q15_t)0x8279, (q15_t)0x18fe, (q15_t)0x8277, + (q15_t)0x18f8, (q15_t)0x8276, (q15_t)0x18f2, (q15_t)0x8275, (q15_t)0x18ec, (q15_t)0x8274, (q15_t)0x18e6, (q15_t)0x8272, + (q15_t)0x18e0, (q15_t)0x8271, (q15_t)0x18d9, (q15_t)0x8270, (q15_t)0x18d3, (q15_t)0x826f, (q15_t)0x18cd, (q15_t)0x826e, + (q15_t)0x18c7, (q15_t)0x826c, (q15_t)0x18c1, (q15_t)0x826b, (q15_t)0x18bb, (q15_t)0x826a, (q15_t)0x18b4, (q15_t)0x8269, + (q15_t)0x18ae, (q15_t)0x8268, (q15_t)0x18a8, (q15_t)0x8266, (q15_t)0x18a2, (q15_t)0x8265, (q15_t)0x189c, (q15_t)0x8264, + (q15_t)0x1896, (q15_t)0x8263, (q15_t)0x188f, (q15_t)0x8261, (q15_t)0x1889, (q15_t)0x8260, (q15_t)0x1883, (q15_t)0x825f, + (q15_t)0x187d, (q15_t)0x825e, (q15_t)0x1877, (q15_t)0x825d, (q15_t)0x1871, (q15_t)0x825b, (q15_t)0x186a, (q15_t)0x825a, + (q15_t)0x1864, (q15_t)0x8259, (q15_t)0x185e, (q15_t)0x8258, (q15_t)0x1858, (q15_t)0x8257, (q15_t)0x1852, (q15_t)0x8255, + (q15_t)0x184c, (q15_t)0x8254, (q15_t)0x1845, (q15_t)0x8253, (q15_t)0x183f, (q15_t)0x8252, (q15_t)0x1839, (q15_t)0x8251, + (q15_t)0x1833, (q15_t)0x8250, (q15_t)0x182d, (q15_t)0x824e, (q15_t)0x1827, (q15_t)0x824d, (q15_t)0x1820, (q15_t)0x824c, + (q15_t)0x181a, (q15_t)0x824b, (q15_t)0x1814, (q15_t)0x824a, (q15_t)0x180e, (q15_t)0x8248, (q15_t)0x1808, (q15_t)0x8247, + (q15_t)0x1802, (q15_t)0x8246, (q15_t)0x17fb, (q15_t)0x8245, (q15_t)0x17f5, (q15_t)0x8244, (q15_t)0x17ef, (q15_t)0x8243, + (q15_t)0x17e9, (q15_t)0x8241, (q15_t)0x17e3, (q15_t)0x8240, (q15_t)0x17dd, (q15_t)0x823f, (q15_t)0x17d6, (q15_t)0x823e, + (q15_t)0x17d0, (q15_t)0x823d, (q15_t)0x17ca, (q15_t)0x823b, (q15_t)0x17c4, (q15_t)0x823a, (q15_t)0x17be, (q15_t)0x8239, + (q15_t)0x17b7, (q15_t)0x8238, (q15_t)0x17b1, (q15_t)0x8237, (q15_t)0x17ab, (q15_t)0x8236, (q15_t)0x17a5, (q15_t)0x8234, + (q15_t)0x179f, (q15_t)0x8233, (q15_t)0x1799, (q15_t)0x8232, (q15_t)0x1792, (q15_t)0x8231, (q15_t)0x178c, (q15_t)0x8230, + (q15_t)0x1786, (q15_t)0x822f, (q15_t)0x1780, (q15_t)0x822e, (q15_t)0x177a, (q15_t)0x822c, (q15_t)0x1774, (q15_t)0x822b, + (q15_t)0x176d, (q15_t)0x822a, (q15_t)0x1767, (q15_t)0x8229, (q15_t)0x1761, (q15_t)0x8228, (q15_t)0x175b, (q15_t)0x8227, + (q15_t)0x1755, (q15_t)0x8226, (q15_t)0x174e, (q15_t)0x8224, (q15_t)0x1748, (q15_t)0x8223, (q15_t)0x1742, (q15_t)0x8222, + (q15_t)0x173c, (q15_t)0x8221, (q15_t)0x1736, (q15_t)0x8220, (q15_t)0x1730, (q15_t)0x821f, (q15_t)0x1729, (q15_t)0x821e, + (q15_t)0x1723, (q15_t)0x821c, (q15_t)0x171d, (q15_t)0x821b, (q15_t)0x1717, (q15_t)0x821a, (q15_t)0x1711, (q15_t)0x8219, + (q15_t)0x170a, (q15_t)0x8218, (q15_t)0x1704, (q15_t)0x8217, (q15_t)0x16fe, (q15_t)0x8216, (q15_t)0x16f8, (q15_t)0x8214, + (q15_t)0x16f2, (q15_t)0x8213, (q15_t)0x16ec, (q15_t)0x8212, (q15_t)0x16e5, (q15_t)0x8211, (q15_t)0x16df, (q15_t)0x8210, + (q15_t)0x16d9, (q15_t)0x820f, (q15_t)0x16d3, (q15_t)0x820e, (q15_t)0x16cd, (q15_t)0x820d, (q15_t)0x16c6, (q15_t)0x820b, + (q15_t)0x16c0, (q15_t)0x820a, (q15_t)0x16ba, (q15_t)0x8209, (q15_t)0x16b4, (q15_t)0x8208, (q15_t)0x16ae, (q15_t)0x8207, + (q15_t)0x16a8, (q15_t)0x8206, (q15_t)0x16a1, (q15_t)0x8205, (q15_t)0x169b, (q15_t)0x8204, (q15_t)0x1695, (q15_t)0x8203, + (q15_t)0x168f, (q15_t)0x8201, (q15_t)0x1689, (q15_t)0x8200, (q15_t)0x1682, (q15_t)0x81ff, (q15_t)0x167c, (q15_t)0x81fe, + (q15_t)0x1676, (q15_t)0x81fd, (q15_t)0x1670, (q15_t)0x81fc, (q15_t)0x166a, (q15_t)0x81fb, (q15_t)0x1664, (q15_t)0x81fa, + (q15_t)0x165d, (q15_t)0x81f9, (q15_t)0x1657, (q15_t)0x81f8, (q15_t)0x1651, (q15_t)0x81f6, (q15_t)0x164b, (q15_t)0x81f5, + (q15_t)0x1645, (q15_t)0x81f4, (q15_t)0x163e, (q15_t)0x81f3, (q15_t)0x1638, (q15_t)0x81f2, (q15_t)0x1632, (q15_t)0x81f1, + (q15_t)0x162c, (q15_t)0x81f0, (q15_t)0x1626, (q15_t)0x81ef, (q15_t)0x161f, (q15_t)0x81ee, (q15_t)0x1619, (q15_t)0x81ed, + (q15_t)0x1613, (q15_t)0x81ec, (q15_t)0x160d, (q15_t)0x81ea, (q15_t)0x1607, (q15_t)0x81e9, (q15_t)0x1601, (q15_t)0x81e8, + (q15_t)0x15fa, (q15_t)0x81e7, (q15_t)0x15f4, (q15_t)0x81e6, (q15_t)0x15ee, (q15_t)0x81e5, (q15_t)0x15e8, (q15_t)0x81e4, + (q15_t)0x15e2, (q15_t)0x81e3, (q15_t)0x15db, (q15_t)0x81e2, (q15_t)0x15d5, (q15_t)0x81e1, (q15_t)0x15cf, (q15_t)0x81e0, + (q15_t)0x15c9, (q15_t)0x81df, (q15_t)0x15c3, (q15_t)0x81de, (q15_t)0x15bc, (q15_t)0x81dc, (q15_t)0x15b6, (q15_t)0x81db, + (q15_t)0x15b0, (q15_t)0x81da, (q15_t)0x15aa, (q15_t)0x81d9, (q15_t)0x15a4, (q15_t)0x81d8, (q15_t)0x159d, (q15_t)0x81d7, + (q15_t)0x1597, (q15_t)0x81d6, (q15_t)0x1591, (q15_t)0x81d5, (q15_t)0x158b, (q15_t)0x81d4, (q15_t)0x1585, (q15_t)0x81d3, + (q15_t)0x157f, (q15_t)0x81d2, (q15_t)0x1578, (q15_t)0x81d1, (q15_t)0x1572, (q15_t)0x81d0, (q15_t)0x156c, (q15_t)0x81cf, + (q15_t)0x1566, (q15_t)0x81ce, (q15_t)0x1560, (q15_t)0x81cd, (q15_t)0x1559, (q15_t)0x81cc, (q15_t)0x1553, (q15_t)0x81cb, + (q15_t)0x154d, (q15_t)0x81c9, (q15_t)0x1547, (q15_t)0x81c8, (q15_t)0x1541, (q15_t)0x81c7, (q15_t)0x153a, (q15_t)0x81c6, + (q15_t)0x1534, (q15_t)0x81c5, (q15_t)0x152e, (q15_t)0x81c4, (q15_t)0x1528, (q15_t)0x81c3, (q15_t)0x1522, (q15_t)0x81c2, + (q15_t)0x151b, (q15_t)0x81c1, (q15_t)0x1515, (q15_t)0x81c0, (q15_t)0x150f, (q15_t)0x81bf, (q15_t)0x1509, (q15_t)0x81be, + (q15_t)0x1503, (q15_t)0x81bd, (q15_t)0x14fc, (q15_t)0x81bc, (q15_t)0x14f6, (q15_t)0x81bb, (q15_t)0x14f0, (q15_t)0x81ba, + (q15_t)0x14ea, (q15_t)0x81b9, (q15_t)0x14e4, (q15_t)0x81b8, (q15_t)0x14dd, (q15_t)0x81b7, (q15_t)0x14d7, (q15_t)0x81b6, + (q15_t)0x14d1, (q15_t)0x81b5, (q15_t)0x14cb, (q15_t)0x81b4, (q15_t)0x14c5, (q15_t)0x81b3, (q15_t)0x14be, (q15_t)0x81b2, + (q15_t)0x14b8, (q15_t)0x81b1, (q15_t)0x14b2, (q15_t)0x81b0, (q15_t)0x14ac, (q15_t)0x81af, (q15_t)0x14a6, (q15_t)0x81ae, + (q15_t)0x149f, (q15_t)0x81ad, (q15_t)0x1499, (q15_t)0x81ac, (q15_t)0x1493, (q15_t)0x81ab, (q15_t)0x148d, (q15_t)0x81aa, + (q15_t)0x1487, (q15_t)0x81a9, (q15_t)0x1480, (q15_t)0x81a8, (q15_t)0x147a, (q15_t)0x81a7, (q15_t)0x1474, (q15_t)0x81a6, + (q15_t)0x146e, (q15_t)0x81a5, (q15_t)0x1468, (q15_t)0x81a4, (q15_t)0x1461, (q15_t)0x81a3, (q15_t)0x145b, (q15_t)0x81a2, + (q15_t)0x1455, (q15_t)0x81a1, (q15_t)0x144f, (q15_t)0x81a0, (q15_t)0x1449, (q15_t)0x819f, (q15_t)0x1442, (q15_t)0x819e, + (q15_t)0x143c, (q15_t)0x819d, (q15_t)0x1436, (q15_t)0x819c, (q15_t)0x1430, (q15_t)0x819b, (q15_t)0x142a, (q15_t)0x819a, + (q15_t)0x1423, (q15_t)0x8199, (q15_t)0x141d, (q15_t)0x8198, (q15_t)0x1417, (q15_t)0x8197, (q15_t)0x1411, (q15_t)0x8196, + (q15_t)0x140b, (q15_t)0x8195, (q15_t)0x1404, (q15_t)0x8194, (q15_t)0x13fe, (q15_t)0x8193, (q15_t)0x13f8, (q15_t)0x8192, + (q15_t)0x13f2, (q15_t)0x8191, (q15_t)0x13eb, (q15_t)0x8190, (q15_t)0x13e5, (q15_t)0x818f, (q15_t)0x13df, (q15_t)0x818e, + (q15_t)0x13d9, (q15_t)0x818d, (q15_t)0x13d3, (q15_t)0x818c, (q15_t)0x13cc, (q15_t)0x818b, (q15_t)0x13c6, (q15_t)0x818a, + (q15_t)0x13c0, (q15_t)0x8189, (q15_t)0x13ba, (q15_t)0x8188, (q15_t)0x13b4, (q15_t)0x8187, (q15_t)0x13ad, (q15_t)0x8186, + (q15_t)0x13a7, (q15_t)0x8185, (q15_t)0x13a1, (q15_t)0x8184, (q15_t)0x139b, (q15_t)0x8183, (q15_t)0x1395, (q15_t)0x8182, + (q15_t)0x138e, (q15_t)0x8181, (q15_t)0x1388, (q15_t)0x8180, (q15_t)0x1382, (q15_t)0x817f, (q15_t)0x137c, (q15_t)0x817e, + (q15_t)0x1376, (q15_t)0x817d, (q15_t)0x136f, (q15_t)0x817c, (q15_t)0x1369, (q15_t)0x817c, (q15_t)0x1363, (q15_t)0x817b, + (q15_t)0x135d, (q15_t)0x817a, (q15_t)0x1356, (q15_t)0x8179, (q15_t)0x1350, (q15_t)0x8178, (q15_t)0x134a, (q15_t)0x8177, + (q15_t)0x1344, (q15_t)0x8176, (q15_t)0x133e, (q15_t)0x8175, (q15_t)0x1337, (q15_t)0x8174, (q15_t)0x1331, (q15_t)0x8173, + (q15_t)0x132b, (q15_t)0x8172, (q15_t)0x1325, (q15_t)0x8171, (q15_t)0x131f, (q15_t)0x8170, (q15_t)0x1318, (q15_t)0x816f, + (q15_t)0x1312, (q15_t)0x816e, (q15_t)0x130c, (q15_t)0x816d, (q15_t)0x1306, (q15_t)0x816c, (q15_t)0x12ff, (q15_t)0x816c, + (q15_t)0x12f9, (q15_t)0x816b, (q15_t)0x12f3, (q15_t)0x816a, (q15_t)0x12ed, (q15_t)0x8169, (q15_t)0x12e7, (q15_t)0x8168, + (q15_t)0x12e0, (q15_t)0x8167, (q15_t)0x12da, (q15_t)0x8166, (q15_t)0x12d4, (q15_t)0x8165, (q15_t)0x12ce, (q15_t)0x8164, + (q15_t)0x12c8, (q15_t)0x8163, (q15_t)0x12c1, (q15_t)0x8162, (q15_t)0x12bb, (q15_t)0x8161, (q15_t)0x12b5, (q15_t)0x8160, + (q15_t)0x12af, (q15_t)0x815f, (q15_t)0x12a8, (q15_t)0x815f, (q15_t)0x12a2, (q15_t)0x815e, (q15_t)0x129c, (q15_t)0x815d, + (q15_t)0x1296, (q15_t)0x815c, (q15_t)0x1290, (q15_t)0x815b, (q15_t)0x1289, (q15_t)0x815a, (q15_t)0x1283, (q15_t)0x8159, + (q15_t)0x127d, (q15_t)0x8158, (q15_t)0x1277, (q15_t)0x8157, (q15_t)0x1271, (q15_t)0x8156, (q15_t)0x126a, (q15_t)0x8155, + (q15_t)0x1264, (q15_t)0x8155, (q15_t)0x125e, (q15_t)0x8154, (q15_t)0x1258, (q15_t)0x8153, (q15_t)0x1251, (q15_t)0x8152, + (q15_t)0x124b, (q15_t)0x8151, (q15_t)0x1245, (q15_t)0x8150, (q15_t)0x123f, (q15_t)0x814f, (q15_t)0x1239, (q15_t)0x814e, + (q15_t)0x1232, (q15_t)0x814d, (q15_t)0x122c, (q15_t)0x814c, (q15_t)0x1226, (q15_t)0x814c, (q15_t)0x1220, (q15_t)0x814b, + (q15_t)0x1219, (q15_t)0x814a, (q15_t)0x1213, (q15_t)0x8149, (q15_t)0x120d, (q15_t)0x8148, (q15_t)0x1207, (q15_t)0x8147, + (q15_t)0x1201, (q15_t)0x8146, (q15_t)0x11fa, (q15_t)0x8145, (q15_t)0x11f4, (q15_t)0x8145, (q15_t)0x11ee, (q15_t)0x8144, + (q15_t)0x11e8, (q15_t)0x8143, (q15_t)0x11e1, (q15_t)0x8142, (q15_t)0x11db, (q15_t)0x8141, (q15_t)0x11d5, (q15_t)0x8140, + (q15_t)0x11cf, (q15_t)0x813f, (q15_t)0x11c9, (q15_t)0x813e, (q15_t)0x11c2, (q15_t)0x813d, (q15_t)0x11bc, (q15_t)0x813d, + (q15_t)0x11b6, (q15_t)0x813c, (q15_t)0x11b0, (q15_t)0x813b, (q15_t)0x11a9, (q15_t)0x813a, (q15_t)0x11a3, (q15_t)0x8139, + (q15_t)0x119d, (q15_t)0x8138, (q15_t)0x1197, (q15_t)0x8137, (q15_t)0x1191, (q15_t)0x8137, (q15_t)0x118a, (q15_t)0x8136, + (q15_t)0x1184, (q15_t)0x8135, (q15_t)0x117e, (q15_t)0x8134, (q15_t)0x1178, (q15_t)0x8133, (q15_t)0x1171, (q15_t)0x8132, + (q15_t)0x116b, (q15_t)0x8131, (q15_t)0x1165, (q15_t)0x8131, (q15_t)0x115f, (q15_t)0x8130, (q15_t)0x1159, (q15_t)0x812f, + (q15_t)0x1152, (q15_t)0x812e, (q15_t)0x114c, (q15_t)0x812d, (q15_t)0x1146, (q15_t)0x812c, (q15_t)0x1140, (q15_t)0x812b, + (q15_t)0x1139, (q15_t)0x812b, (q15_t)0x1133, (q15_t)0x812a, (q15_t)0x112d, (q15_t)0x8129, (q15_t)0x1127, (q15_t)0x8128, + (q15_t)0x1121, (q15_t)0x8127, (q15_t)0x111a, (q15_t)0x8126, (q15_t)0x1114, (q15_t)0x8126, (q15_t)0x110e, (q15_t)0x8125, + (q15_t)0x1108, (q15_t)0x8124, (q15_t)0x1101, (q15_t)0x8123, (q15_t)0x10fb, (q15_t)0x8122, (q15_t)0x10f5, (q15_t)0x8121, + (q15_t)0x10ef, (q15_t)0x8121, (q15_t)0x10e8, (q15_t)0x8120, (q15_t)0x10e2, (q15_t)0x811f, (q15_t)0x10dc, (q15_t)0x811e, + (q15_t)0x10d6, (q15_t)0x811d, (q15_t)0x10d0, (q15_t)0x811c, (q15_t)0x10c9, (q15_t)0x811c, (q15_t)0x10c3, (q15_t)0x811b, + (q15_t)0x10bd, (q15_t)0x811a, (q15_t)0x10b7, (q15_t)0x8119, (q15_t)0x10b0, (q15_t)0x8118, (q15_t)0x10aa, (q15_t)0x8117, + (q15_t)0x10a4, (q15_t)0x8117, (q15_t)0x109e, (q15_t)0x8116, (q15_t)0x1098, (q15_t)0x8115, (q15_t)0x1091, (q15_t)0x8114, + (q15_t)0x108b, (q15_t)0x8113, (q15_t)0x1085, (q15_t)0x8113, (q15_t)0x107f, (q15_t)0x8112, (q15_t)0x1078, (q15_t)0x8111, + (q15_t)0x1072, (q15_t)0x8110, (q15_t)0x106c, (q15_t)0x810f, (q15_t)0x1066, (q15_t)0x810f, (q15_t)0x105f, (q15_t)0x810e, + (q15_t)0x1059, (q15_t)0x810d, (q15_t)0x1053, (q15_t)0x810c, (q15_t)0x104d, (q15_t)0x810b, (q15_t)0x1047, (q15_t)0x810b, + (q15_t)0x1040, (q15_t)0x810a, (q15_t)0x103a, (q15_t)0x8109, (q15_t)0x1034, (q15_t)0x8108, (q15_t)0x102e, (q15_t)0x8107, + (q15_t)0x1027, (q15_t)0x8107, (q15_t)0x1021, (q15_t)0x8106, (q15_t)0x101b, (q15_t)0x8105, (q15_t)0x1015, (q15_t)0x8104, + (q15_t)0x100e, (q15_t)0x8103, (q15_t)0x1008, (q15_t)0x8103, (q15_t)0x1002, (q15_t)0x8102, (q15_t)0xffc, (q15_t)0x8101, + (q15_t)0xff5, (q15_t)0x8100, (q15_t)0xfef, (q15_t)0x80ff, (q15_t)0xfe9, (q15_t)0x80ff, (q15_t)0xfe3, (q15_t)0x80fe, + (q15_t)0xfdd, (q15_t)0x80fd, (q15_t)0xfd6, (q15_t)0x80fc, (q15_t)0xfd0, (q15_t)0x80fc, (q15_t)0xfca, (q15_t)0x80fb, + (q15_t)0xfc4, (q15_t)0x80fa, (q15_t)0xfbd, (q15_t)0x80f9, (q15_t)0xfb7, (q15_t)0x80f8, (q15_t)0xfb1, (q15_t)0x80f8, + (q15_t)0xfab, (q15_t)0x80f7, (q15_t)0xfa4, (q15_t)0x80f6, (q15_t)0xf9e, (q15_t)0x80f5, (q15_t)0xf98, (q15_t)0x80f5, + (q15_t)0xf92, (q15_t)0x80f4, (q15_t)0xf8b, (q15_t)0x80f3, (q15_t)0xf85, (q15_t)0x80f2, (q15_t)0xf7f, (q15_t)0x80f2, + (q15_t)0xf79, (q15_t)0x80f1, (q15_t)0xf73, (q15_t)0x80f0, (q15_t)0xf6c, (q15_t)0x80ef, (q15_t)0xf66, (q15_t)0x80ef, + (q15_t)0xf60, (q15_t)0x80ee, (q15_t)0xf5a, (q15_t)0x80ed, (q15_t)0xf53, (q15_t)0x80ec, (q15_t)0xf4d, (q15_t)0x80ec, + (q15_t)0xf47, (q15_t)0x80eb, (q15_t)0xf41, (q15_t)0x80ea, (q15_t)0xf3a, (q15_t)0x80e9, (q15_t)0xf34, (q15_t)0x80e9, + (q15_t)0xf2e, (q15_t)0x80e8, (q15_t)0xf28, (q15_t)0x80e7, (q15_t)0xf21, (q15_t)0x80e6, (q15_t)0xf1b, (q15_t)0x80e6, + (q15_t)0xf15, (q15_t)0x80e5, (q15_t)0xf0f, (q15_t)0x80e4, (q15_t)0xf08, (q15_t)0x80e3, (q15_t)0xf02, (q15_t)0x80e3, + (q15_t)0xefc, (q15_t)0x80e2, (q15_t)0xef6, (q15_t)0x80e1, (q15_t)0xef0, (q15_t)0x80e0, (q15_t)0xee9, (q15_t)0x80e0, + (q15_t)0xee3, (q15_t)0x80df, (q15_t)0xedd, (q15_t)0x80de, (q15_t)0xed7, (q15_t)0x80dd, (q15_t)0xed0, (q15_t)0x80dd, + (q15_t)0xeca, (q15_t)0x80dc, (q15_t)0xec4, (q15_t)0x80db, (q15_t)0xebe, (q15_t)0x80db, (q15_t)0xeb7, (q15_t)0x80da, + (q15_t)0xeb1, (q15_t)0x80d9, (q15_t)0xeab, (q15_t)0x80d8, (q15_t)0xea5, (q15_t)0x80d8, (q15_t)0xe9e, (q15_t)0x80d7, + (q15_t)0xe98, (q15_t)0x80d6, (q15_t)0xe92, (q15_t)0x80d6, (q15_t)0xe8c, (q15_t)0x80d5, (q15_t)0xe85, (q15_t)0x80d4, + (q15_t)0xe7f, (q15_t)0x80d3, (q15_t)0xe79, (q15_t)0x80d3, (q15_t)0xe73, (q15_t)0x80d2, (q15_t)0xe6c, (q15_t)0x80d1, + (q15_t)0xe66, (q15_t)0x80d1, (q15_t)0xe60, (q15_t)0x80d0, (q15_t)0xe5a, (q15_t)0x80cf, (q15_t)0xe53, (q15_t)0x80ce, + (q15_t)0xe4d, (q15_t)0x80ce, (q15_t)0xe47, (q15_t)0x80cd, (q15_t)0xe41, (q15_t)0x80cc, (q15_t)0xe3a, (q15_t)0x80cc, + (q15_t)0xe34, (q15_t)0x80cb, (q15_t)0xe2e, (q15_t)0x80ca, (q15_t)0xe28, (q15_t)0x80ca, (q15_t)0xe22, (q15_t)0x80c9, + (q15_t)0xe1b, (q15_t)0x80c8, (q15_t)0xe15, (q15_t)0x80c7, (q15_t)0xe0f, (q15_t)0x80c7, (q15_t)0xe09, (q15_t)0x80c6, + (q15_t)0xe02, (q15_t)0x80c5, (q15_t)0xdfc, (q15_t)0x80c5, (q15_t)0xdf6, (q15_t)0x80c4, (q15_t)0xdf0, (q15_t)0x80c3, + (q15_t)0xde9, (q15_t)0x80c3, (q15_t)0xde3, (q15_t)0x80c2, (q15_t)0xddd, (q15_t)0x80c1, (q15_t)0xdd7, (q15_t)0x80c1, + (q15_t)0xdd0, (q15_t)0x80c0, (q15_t)0xdca, (q15_t)0x80bf, (q15_t)0xdc4, (q15_t)0x80bf, (q15_t)0xdbe, (q15_t)0x80be, + (q15_t)0xdb7, (q15_t)0x80bd, (q15_t)0xdb1, (q15_t)0x80bd, (q15_t)0xdab, (q15_t)0x80bc, (q15_t)0xda5, (q15_t)0x80bb, + (q15_t)0xd9e, (q15_t)0x80bb, (q15_t)0xd98, (q15_t)0x80ba, (q15_t)0xd92, (q15_t)0x80b9, (q15_t)0xd8c, (q15_t)0x80b9, + (q15_t)0xd85, (q15_t)0x80b8, (q15_t)0xd7f, (q15_t)0x80b7, (q15_t)0xd79, (q15_t)0x80b7, (q15_t)0xd73, (q15_t)0x80b6, + (q15_t)0xd6c, (q15_t)0x80b5, (q15_t)0xd66, (q15_t)0x80b5, (q15_t)0xd60, (q15_t)0x80b4, (q15_t)0xd5a, (q15_t)0x80b3, + (q15_t)0xd53, (q15_t)0x80b3, (q15_t)0xd4d, (q15_t)0x80b2, (q15_t)0xd47, (q15_t)0x80b1, (q15_t)0xd41, (q15_t)0x80b1, + (q15_t)0xd3a, (q15_t)0x80b0, (q15_t)0xd34, (q15_t)0x80af, (q15_t)0xd2e, (q15_t)0x80af, (q15_t)0xd28, (q15_t)0x80ae, + (q15_t)0xd21, (q15_t)0x80ad, (q15_t)0xd1b, (q15_t)0x80ad, (q15_t)0xd15, (q15_t)0x80ac, (q15_t)0xd0f, (q15_t)0x80ab, + (q15_t)0xd08, (q15_t)0x80ab, (q15_t)0xd02, (q15_t)0x80aa, (q15_t)0xcfc, (q15_t)0x80aa, (q15_t)0xcf6, (q15_t)0x80a9, + (q15_t)0xcef, (q15_t)0x80a8, (q15_t)0xce9, (q15_t)0x80a8, (q15_t)0xce3, (q15_t)0x80a7, (q15_t)0xcdd, (q15_t)0x80a6, + (q15_t)0xcd6, (q15_t)0x80a6, (q15_t)0xcd0, (q15_t)0x80a5, (q15_t)0xcca, (q15_t)0x80a5, (q15_t)0xcc4, (q15_t)0x80a4, + (q15_t)0xcbd, (q15_t)0x80a3, (q15_t)0xcb7, (q15_t)0x80a3, (q15_t)0xcb1, (q15_t)0x80a2, (q15_t)0xcab, (q15_t)0x80a1, + (q15_t)0xca4, (q15_t)0x80a1, (q15_t)0xc9e, (q15_t)0x80a0, (q15_t)0xc98, (q15_t)0x80a0, (q15_t)0xc92, (q15_t)0x809f, + (q15_t)0xc8b, (q15_t)0x809e, (q15_t)0xc85, (q15_t)0x809e, (q15_t)0xc7f, (q15_t)0x809d, (q15_t)0xc79, (q15_t)0x809c, + (q15_t)0xc72, (q15_t)0x809c, (q15_t)0xc6c, (q15_t)0x809b, (q15_t)0xc66, (q15_t)0x809b, (q15_t)0xc60, (q15_t)0x809a, + (q15_t)0xc59, (q15_t)0x8099, (q15_t)0xc53, (q15_t)0x8099, (q15_t)0xc4d, (q15_t)0x8098, (q15_t)0xc47, (q15_t)0x8098, + (q15_t)0xc40, (q15_t)0x8097, (q15_t)0xc3a, (q15_t)0x8096, (q15_t)0xc34, (q15_t)0x8096, (q15_t)0xc2e, (q15_t)0x8095, + (q15_t)0xc27, (q15_t)0x8095, (q15_t)0xc21, (q15_t)0x8094, (q15_t)0xc1b, (q15_t)0x8093, (q15_t)0xc14, (q15_t)0x8093, + (q15_t)0xc0e, (q15_t)0x8092, (q15_t)0xc08, (q15_t)0x8092, (q15_t)0xc02, (q15_t)0x8091, (q15_t)0xbfb, (q15_t)0x8090, + (q15_t)0xbf5, (q15_t)0x8090, (q15_t)0xbef, (q15_t)0x808f, (q15_t)0xbe9, (q15_t)0x808f, (q15_t)0xbe2, (q15_t)0x808e, + (q15_t)0xbdc, (q15_t)0x808e, (q15_t)0xbd6, (q15_t)0x808d, (q15_t)0xbd0, (q15_t)0x808c, (q15_t)0xbc9, (q15_t)0x808c, + (q15_t)0xbc3, (q15_t)0x808b, (q15_t)0xbbd, (q15_t)0x808b, (q15_t)0xbb7, (q15_t)0x808a, (q15_t)0xbb0, (q15_t)0x8089, + (q15_t)0xbaa, (q15_t)0x8089, (q15_t)0xba4, (q15_t)0x8088, (q15_t)0xb9e, (q15_t)0x8088, (q15_t)0xb97, (q15_t)0x8087, + (q15_t)0xb91, (q15_t)0x8087, (q15_t)0xb8b, (q15_t)0x8086, (q15_t)0xb85, (q15_t)0x8085, (q15_t)0xb7e, (q15_t)0x8085, + (q15_t)0xb78, (q15_t)0x8084, (q15_t)0xb72, (q15_t)0x8084, (q15_t)0xb6c, (q15_t)0x8083, (q15_t)0xb65, (q15_t)0x8083, + (q15_t)0xb5f, (q15_t)0x8082, (q15_t)0xb59, (q15_t)0x8082, (q15_t)0xb53, (q15_t)0x8081, (q15_t)0xb4c, (q15_t)0x8080, + (q15_t)0xb46, (q15_t)0x8080, (q15_t)0xb40, (q15_t)0x807f, (q15_t)0xb3a, (q15_t)0x807f, (q15_t)0xb33, (q15_t)0x807e, + (q15_t)0xb2d, (q15_t)0x807e, (q15_t)0xb27, (q15_t)0x807d, (q15_t)0xb20, (q15_t)0x807d, (q15_t)0xb1a, (q15_t)0x807c, + (q15_t)0xb14, (q15_t)0x807b, (q15_t)0xb0e, (q15_t)0x807b, (q15_t)0xb07, (q15_t)0x807a, (q15_t)0xb01, (q15_t)0x807a, + (q15_t)0xafb, (q15_t)0x8079, (q15_t)0xaf5, (q15_t)0x8079, (q15_t)0xaee, (q15_t)0x8078, (q15_t)0xae8, (q15_t)0x8078, + (q15_t)0xae2, (q15_t)0x8077, (q15_t)0xadc, (q15_t)0x8077, (q15_t)0xad5, (q15_t)0x8076, (q15_t)0xacf, (q15_t)0x8076, + (q15_t)0xac9, (q15_t)0x8075, (q15_t)0xac3, (q15_t)0x8075, (q15_t)0xabc, (q15_t)0x8074, (q15_t)0xab6, (q15_t)0x8073, + (q15_t)0xab0, (q15_t)0x8073, (q15_t)0xaaa, (q15_t)0x8072, (q15_t)0xaa3, (q15_t)0x8072, (q15_t)0xa9d, (q15_t)0x8071, + (q15_t)0xa97, (q15_t)0x8071, (q15_t)0xa90, (q15_t)0x8070, (q15_t)0xa8a, (q15_t)0x8070, (q15_t)0xa84, (q15_t)0x806f, + (q15_t)0xa7e, (q15_t)0x806f, (q15_t)0xa77, (q15_t)0x806e, (q15_t)0xa71, (q15_t)0x806e, (q15_t)0xa6b, (q15_t)0x806d, + (q15_t)0xa65, (q15_t)0x806d, (q15_t)0xa5e, (q15_t)0x806c, (q15_t)0xa58, (q15_t)0x806c, (q15_t)0xa52, (q15_t)0x806b, + (q15_t)0xa4c, (q15_t)0x806b, (q15_t)0xa45, (q15_t)0x806a, (q15_t)0xa3f, (q15_t)0x806a, (q15_t)0xa39, (q15_t)0x8069, + (q15_t)0xa33, (q15_t)0x8069, (q15_t)0xa2c, (q15_t)0x8068, (q15_t)0xa26, (q15_t)0x8068, (q15_t)0xa20, (q15_t)0x8067, + (q15_t)0xa19, (q15_t)0x8067, (q15_t)0xa13, (q15_t)0x8066, (q15_t)0xa0d, (q15_t)0x8066, (q15_t)0xa07, (q15_t)0x8065, + (q15_t)0xa00, (q15_t)0x8065, (q15_t)0x9fa, (q15_t)0x8064, (q15_t)0x9f4, (q15_t)0x8064, (q15_t)0x9ee, (q15_t)0x8063, + (q15_t)0x9e7, (q15_t)0x8063, (q15_t)0x9e1, (q15_t)0x8062, (q15_t)0x9db, (q15_t)0x8062, (q15_t)0x9d5, (q15_t)0x8061, + (q15_t)0x9ce, (q15_t)0x8061, (q15_t)0x9c8, (q15_t)0x8060, (q15_t)0x9c2, (q15_t)0x8060, (q15_t)0x9bc, (q15_t)0x805f, + (q15_t)0x9b5, (q15_t)0x805f, (q15_t)0x9af, (q15_t)0x805e, (q15_t)0x9a9, (q15_t)0x805e, (q15_t)0x9a2, (q15_t)0x805d, + (q15_t)0x99c, (q15_t)0x805d, (q15_t)0x996, (q15_t)0x805d, (q15_t)0x990, (q15_t)0x805c, (q15_t)0x989, (q15_t)0x805c, + (q15_t)0x983, (q15_t)0x805b, (q15_t)0x97d, (q15_t)0x805b, (q15_t)0x977, (q15_t)0x805a, (q15_t)0x970, (q15_t)0x805a, + (q15_t)0x96a, (q15_t)0x8059, (q15_t)0x964, (q15_t)0x8059, (q15_t)0x95e, (q15_t)0x8058, (q15_t)0x957, (q15_t)0x8058, + (q15_t)0x951, (q15_t)0x8057, (q15_t)0x94b, (q15_t)0x8057, (q15_t)0x944, (q15_t)0x8057, (q15_t)0x93e, (q15_t)0x8056, + (q15_t)0x938, (q15_t)0x8056, (q15_t)0x932, (q15_t)0x8055, (q15_t)0x92b, (q15_t)0x8055, (q15_t)0x925, (q15_t)0x8054, + (q15_t)0x91f, (q15_t)0x8054, (q15_t)0x919, (q15_t)0x8053, (q15_t)0x912, (q15_t)0x8053, (q15_t)0x90c, (q15_t)0x8052, + (q15_t)0x906, (q15_t)0x8052, (q15_t)0x900, (q15_t)0x8052, (q15_t)0x8f9, (q15_t)0x8051, (q15_t)0x8f3, (q15_t)0x8051, + (q15_t)0x8ed, (q15_t)0x8050, (q15_t)0x8e6, (q15_t)0x8050, (q15_t)0x8e0, (q15_t)0x804f, (q15_t)0x8da, (q15_t)0x804f, + (q15_t)0x8d4, (q15_t)0x804f, (q15_t)0x8cd, (q15_t)0x804e, (q15_t)0x8c7, (q15_t)0x804e, (q15_t)0x8c1, (q15_t)0x804d, + (q15_t)0x8bb, (q15_t)0x804d, (q15_t)0x8b4, (q15_t)0x804c, (q15_t)0x8ae, (q15_t)0x804c, (q15_t)0x8a8, (q15_t)0x804c, + (q15_t)0x8a2, (q15_t)0x804b, (q15_t)0x89b, (q15_t)0x804b, (q15_t)0x895, (q15_t)0x804a, (q15_t)0x88f, (q15_t)0x804a, + (q15_t)0x888, (q15_t)0x8049, (q15_t)0x882, (q15_t)0x8049, (q15_t)0x87c, (q15_t)0x8049, (q15_t)0x876, (q15_t)0x8048, + (q15_t)0x86f, (q15_t)0x8048, (q15_t)0x869, (q15_t)0x8047, (q15_t)0x863, (q15_t)0x8047, (q15_t)0x85d, (q15_t)0x8047, + (q15_t)0x856, (q15_t)0x8046, (q15_t)0x850, (q15_t)0x8046, (q15_t)0x84a, (q15_t)0x8045, (q15_t)0x843, (q15_t)0x8045, + (q15_t)0x83d, (q15_t)0x8044, (q15_t)0x837, (q15_t)0x8044, (q15_t)0x831, (q15_t)0x8044, (q15_t)0x82a, (q15_t)0x8043, + (q15_t)0x824, (q15_t)0x8043, (q15_t)0x81e, (q15_t)0x8042, (q15_t)0x818, (q15_t)0x8042, (q15_t)0x811, (q15_t)0x8042, + (q15_t)0x80b, (q15_t)0x8041, (q15_t)0x805, (q15_t)0x8041, (q15_t)0x7fe, (q15_t)0x8040, (q15_t)0x7f8, (q15_t)0x8040, + (q15_t)0x7f2, (q15_t)0x8040, (q15_t)0x7ec, (q15_t)0x803f, (q15_t)0x7e5, (q15_t)0x803f, (q15_t)0x7df, (q15_t)0x803f, + (q15_t)0x7d9, (q15_t)0x803e, (q15_t)0x7d3, (q15_t)0x803e, (q15_t)0x7cc, (q15_t)0x803d, (q15_t)0x7c6, (q15_t)0x803d, + (q15_t)0x7c0, (q15_t)0x803d, (q15_t)0x7ba, (q15_t)0x803c, (q15_t)0x7b3, (q15_t)0x803c, (q15_t)0x7ad, (q15_t)0x803b, + (q15_t)0x7a7, (q15_t)0x803b, (q15_t)0x7a0, (q15_t)0x803b, (q15_t)0x79a, (q15_t)0x803a, (q15_t)0x794, (q15_t)0x803a, + (q15_t)0x78e, (q15_t)0x803a, (q15_t)0x787, (q15_t)0x8039, (q15_t)0x781, (q15_t)0x8039, (q15_t)0x77b, (q15_t)0x8039, + (q15_t)0x775, (q15_t)0x8038, (q15_t)0x76e, (q15_t)0x8038, (q15_t)0x768, (q15_t)0x8037, (q15_t)0x762, (q15_t)0x8037, + (q15_t)0x75b, (q15_t)0x8037, (q15_t)0x755, (q15_t)0x8036, (q15_t)0x74f, (q15_t)0x8036, (q15_t)0x749, (q15_t)0x8036, + (q15_t)0x742, (q15_t)0x8035, (q15_t)0x73c, (q15_t)0x8035, (q15_t)0x736, (q15_t)0x8035, (q15_t)0x730, (q15_t)0x8034, + (q15_t)0x729, (q15_t)0x8034, (q15_t)0x723, (q15_t)0x8033, (q15_t)0x71d, (q15_t)0x8033, (q15_t)0x716, (q15_t)0x8033, + (q15_t)0x710, (q15_t)0x8032, (q15_t)0x70a, (q15_t)0x8032, (q15_t)0x704, (q15_t)0x8032, (q15_t)0x6fd, (q15_t)0x8031, + (q15_t)0x6f7, (q15_t)0x8031, (q15_t)0x6f1, (q15_t)0x8031, (q15_t)0x6ea, (q15_t)0x8030, (q15_t)0x6e4, (q15_t)0x8030, + (q15_t)0x6de, (q15_t)0x8030, (q15_t)0x6d8, (q15_t)0x802f, (q15_t)0x6d1, (q15_t)0x802f, (q15_t)0x6cb, (q15_t)0x802f, + (q15_t)0x6c5, (q15_t)0x802e, (q15_t)0x6bf, (q15_t)0x802e, (q15_t)0x6b8, (q15_t)0x802e, (q15_t)0x6b2, (q15_t)0x802d, + (q15_t)0x6ac, (q15_t)0x802d, (q15_t)0x6a5, (q15_t)0x802d, (q15_t)0x69f, (q15_t)0x802c, (q15_t)0x699, (q15_t)0x802c, + (q15_t)0x693, (q15_t)0x802c, (q15_t)0x68c, (q15_t)0x802b, (q15_t)0x686, (q15_t)0x802b, (q15_t)0x680, (q15_t)0x802b, + (q15_t)0x67a, (q15_t)0x802a, (q15_t)0x673, (q15_t)0x802a, (q15_t)0x66d, (q15_t)0x802a, (q15_t)0x667, (q15_t)0x802a, + (q15_t)0x660, (q15_t)0x8029, (q15_t)0x65a, (q15_t)0x8029, (q15_t)0x654, (q15_t)0x8029, (q15_t)0x64e, (q15_t)0x8028, + (q15_t)0x647, (q15_t)0x8028, (q15_t)0x641, (q15_t)0x8028, (q15_t)0x63b, (q15_t)0x8027, (q15_t)0x635, (q15_t)0x8027, + (q15_t)0x62e, (q15_t)0x8027, (q15_t)0x628, (q15_t)0x8026, (q15_t)0x622, (q15_t)0x8026, (q15_t)0x61b, (q15_t)0x8026, + (q15_t)0x615, (q15_t)0x8026, (q15_t)0x60f, (q15_t)0x8025, (q15_t)0x609, (q15_t)0x8025, (q15_t)0x602, (q15_t)0x8025, + (q15_t)0x5fc, (q15_t)0x8024, (q15_t)0x5f6, (q15_t)0x8024, (q15_t)0x5ef, (q15_t)0x8024, (q15_t)0x5e9, (q15_t)0x8023, + (q15_t)0x5e3, (q15_t)0x8023, (q15_t)0x5dd, (q15_t)0x8023, (q15_t)0x5d6, (q15_t)0x8023, (q15_t)0x5d0, (q15_t)0x8022, + (q15_t)0x5ca, (q15_t)0x8022, (q15_t)0x5c4, (q15_t)0x8022, (q15_t)0x5bd, (q15_t)0x8021, (q15_t)0x5b7, (q15_t)0x8021, + (q15_t)0x5b1, (q15_t)0x8021, (q15_t)0x5aa, (q15_t)0x8021, (q15_t)0x5a4, (q15_t)0x8020, (q15_t)0x59e, (q15_t)0x8020, + (q15_t)0x598, (q15_t)0x8020, (q15_t)0x591, (q15_t)0x8020, (q15_t)0x58b, (q15_t)0x801f, (q15_t)0x585, (q15_t)0x801f, + (q15_t)0x57f, (q15_t)0x801f, (q15_t)0x578, (q15_t)0x801e, (q15_t)0x572, (q15_t)0x801e, (q15_t)0x56c, (q15_t)0x801e, + (q15_t)0x565, (q15_t)0x801e, (q15_t)0x55f, (q15_t)0x801d, (q15_t)0x559, (q15_t)0x801d, (q15_t)0x553, (q15_t)0x801d, + (q15_t)0x54c, (q15_t)0x801d, (q15_t)0x546, (q15_t)0x801c, (q15_t)0x540, (q15_t)0x801c, (q15_t)0x539, (q15_t)0x801c, + (q15_t)0x533, (q15_t)0x801c, (q15_t)0x52d, (q15_t)0x801b, (q15_t)0x527, (q15_t)0x801b, (q15_t)0x520, (q15_t)0x801b, + (q15_t)0x51a, (q15_t)0x801b, (q15_t)0x514, (q15_t)0x801a, (q15_t)0x50d, (q15_t)0x801a, (q15_t)0x507, (q15_t)0x801a, + (q15_t)0x501, (q15_t)0x801a, (q15_t)0x4fb, (q15_t)0x8019, (q15_t)0x4f4, (q15_t)0x8019, (q15_t)0x4ee, (q15_t)0x8019, + (q15_t)0x4e8, (q15_t)0x8019, (q15_t)0x4e2, (q15_t)0x8018, (q15_t)0x4db, (q15_t)0x8018, (q15_t)0x4d5, (q15_t)0x8018, + (q15_t)0x4cf, (q15_t)0x8018, (q15_t)0x4c8, (q15_t)0x8017, (q15_t)0x4c2, (q15_t)0x8017, (q15_t)0x4bc, (q15_t)0x8017, + (q15_t)0x4b6, (q15_t)0x8017, (q15_t)0x4af, (q15_t)0x8016, (q15_t)0x4a9, (q15_t)0x8016, (q15_t)0x4a3, (q15_t)0x8016, + (q15_t)0x49c, (q15_t)0x8016, (q15_t)0x496, (q15_t)0x8016, (q15_t)0x490, (q15_t)0x8015, (q15_t)0x48a, (q15_t)0x8015, + (q15_t)0x483, (q15_t)0x8015, (q15_t)0x47d, (q15_t)0x8015, (q15_t)0x477, (q15_t)0x8014, (q15_t)0x471, (q15_t)0x8014, + (q15_t)0x46a, (q15_t)0x8014, (q15_t)0x464, (q15_t)0x8014, (q15_t)0x45e, (q15_t)0x8014, (q15_t)0x457, (q15_t)0x8013, + (q15_t)0x451, (q15_t)0x8013, (q15_t)0x44b, (q15_t)0x8013, (q15_t)0x445, (q15_t)0x8013, (q15_t)0x43e, (q15_t)0x8013, + (q15_t)0x438, (q15_t)0x8012, (q15_t)0x432, (q15_t)0x8012, (q15_t)0x42b, (q15_t)0x8012, (q15_t)0x425, (q15_t)0x8012, + (q15_t)0x41f, (q15_t)0x8012, (q15_t)0x419, (q15_t)0x8011, (q15_t)0x412, (q15_t)0x8011, (q15_t)0x40c, (q15_t)0x8011, + (q15_t)0x406, (q15_t)0x8011, (q15_t)0x3ff, (q15_t)0x8011, (q15_t)0x3f9, (q15_t)0x8010, (q15_t)0x3f3, (q15_t)0x8010, + (q15_t)0x3ed, (q15_t)0x8010, (q15_t)0x3e6, (q15_t)0x8010, (q15_t)0x3e0, (q15_t)0x8010, (q15_t)0x3da, (q15_t)0x800f, + (q15_t)0x3d4, (q15_t)0x800f, (q15_t)0x3cd, (q15_t)0x800f, (q15_t)0x3c7, (q15_t)0x800f, (q15_t)0x3c1, (q15_t)0x800f, + (q15_t)0x3ba, (q15_t)0x800e, (q15_t)0x3b4, (q15_t)0x800e, (q15_t)0x3ae, (q15_t)0x800e, (q15_t)0x3a8, (q15_t)0x800e, + (q15_t)0x3a1, (q15_t)0x800e, (q15_t)0x39b, (q15_t)0x800e, (q15_t)0x395, (q15_t)0x800d, (q15_t)0x38e, (q15_t)0x800d, + (q15_t)0x388, (q15_t)0x800d, (q15_t)0x382, (q15_t)0x800d, (q15_t)0x37c, (q15_t)0x800d, (q15_t)0x375, (q15_t)0x800c, + (q15_t)0x36f, (q15_t)0x800c, (q15_t)0x369, (q15_t)0x800c, (q15_t)0x362, (q15_t)0x800c, (q15_t)0x35c, (q15_t)0x800c, + (q15_t)0x356, (q15_t)0x800c, (q15_t)0x350, (q15_t)0x800b, (q15_t)0x349, (q15_t)0x800b, (q15_t)0x343, (q15_t)0x800b, + (q15_t)0x33d, (q15_t)0x800b, (q15_t)0x337, (q15_t)0x800b, (q15_t)0x330, (q15_t)0x800b, (q15_t)0x32a, (q15_t)0x800b, + (q15_t)0x324, (q15_t)0x800a, (q15_t)0x31d, (q15_t)0x800a, (q15_t)0x317, (q15_t)0x800a, (q15_t)0x311, (q15_t)0x800a, + (q15_t)0x30b, (q15_t)0x800a, (q15_t)0x304, (q15_t)0x800a, (q15_t)0x2fe, (q15_t)0x8009, (q15_t)0x2f8, (q15_t)0x8009, + (q15_t)0x2f1, (q15_t)0x8009, (q15_t)0x2eb, (q15_t)0x8009, (q15_t)0x2e5, (q15_t)0x8009, (q15_t)0x2df, (q15_t)0x8009, + (q15_t)0x2d8, (q15_t)0x8009, (q15_t)0x2d2, (q15_t)0x8008, (q15_t)0x2cc, (q15_t)0x8008, (q15_t)0x2c5, (q15_t)0x8008, + (q15_t)0x2bf, (q15_t)0x8008, (q15_t)0x2b9, (q15_t)0x8008, (q15_t)0x2b3, (q15_t)0x8008, (q15_t)0x2ac, (q15_t)0x8008, + (q15_t)0x2a6, (q15_t)0x8008, (q15_t)0x2a0, (q15_t)0x8007, (q15_t)0x299, (q15_t)0x8007, (q15_t)0x293, (q15_t)0x8007, + (q15_t)0x28d, (q15_t)0x8007, (q15_t)0x287, (q15_t)0x8007, (q15_t)0x280, (q15_t)0x8007, (q15_t)0x27a, (q15_t)0x8007, + (q15_t)0x274, (q15_t)0x8007, (q15_t)0x26d, (q15_t)0x8006, (q15_t)0x267, (q15_t)0x8006, (q15_t)0x261, (q15_t)0x8006, + (q15_t)0x25b, (q15_t)0x8006, (q15_t)0x254, (q15_t)0x8006, (q15_t)0x24e, (q15_t)0x8006, (q15_t)0x248, (q15_t)0x8006, + (q15_t)0x242, (q15_t)0x8006, (q15_t)0x23b, (q15_t)0x8005, (q15_t)0x235, (q15_t)0x8005, (q15_t)0x22f, (q15_t)0x8005, + (q15_t)0x228, (q15_t)0x8005, (q15_t)0x222, (q15_t)0x8005, (q15_t)0x21c, (q15_t)0x8005, (q15_t)0x216, (q15_t)0x8005, + (q15_t)0x20f, (q15_t)0x8005, (q15_t)0x209, (q15_t)0x8005, (q15_t)0x203, (q15_t)0x8005, (q15_t)0x1fc, (q15_t)0x8004, + (q15_t)0x1f6, (q15_t)0x8004, (q15_t)0x1f0, (q15_t)0x8004, (q15_t)0x1ea, (q15_t)0x8004, (q15_t)0x1e3, (q15_t)0x8004, + (q15_t)0x1dd, (q15_t)0x8004, (q15_t)0x1d7, (q15_t)0x8004, (q15_t)0x1d0, (q15_t)0x8004, (q15_t)0x1ca, (q15_t)0x8004, + (q15_t)0x1c4, (q15_t)0x8004, (q15_t)0x1be, (q15_t)0x8004, (q15_t)0x1b7, (q15_t)0x8003, (q15_t)0x1b1, (q15_t)0x8003, + (q15_t)0x1ab, (q15_t)0x8003, (q15_t)0x1a4, (q15_t)0x8003, (q15_t)0x19e, (q15_t)0x8003, (q15_t)0x198, (q15_t)0x8003, + (q15_t)0x192, (q15_t)0x8003, (q15_t)0x18b, (q15_t)0x8003, (q15_t)0x185, (q15_t)0x8003, (q15_t)0x17f, (q15_t)0x8003, + (q15_t)0x178, (q15_t)0x8003, (q15_t)0x172, (q15_t)0x8003, (q15_t)0x16c, (q15_t)0x8003, (q15_t)0x166, (q15_t)0x8002, + (q15_t)0x15f, (q15_t)0x8002, (q15_t)0x159, (q15_t)0x8002, (q15_t)0x153, (q15_t)0x8002, (q15_t)0x14d, (q15_t)0x8002, + (q15_t)0x146, (q15_t)0x8002, (q15_t)0x140, (q15_t)0x8002, (q15_t)0x13a, (q15_t)0x8002, (q15_t)0x133, (q15_t)0x8002, + (q15_t)0x12d, (q15_t)0x8002, (q15_t)0x127, (q15_t)0x8002, (q15_t)0x121, (q15_t)0x8002, (q15_t)0x11a, (q15_t)0x8002, + (q15_t)0x114, (q15_t)0x8002, (q15_t)0x10e, (q15_t)0x8002, (q15_t)0x107, (q15_t)0x8002, (q15_t)0x101, (q15_t)0x8002, + (q15_t)0xfb, (q15_t)0x8001, (q15_t)0xf5, (q15_t)0x8001, (q15_t)0xee, (q15_t)0x8001, (q15_t)0xe8, (q15_t)0x8001, + (q15_t)0xe2, (q15_t)0x8001, (q15_t)0xdb, (q15_t)0x8001, (q15_t)0xd5, (q15_t)0x8001, (q15_t)0xcf, (q15_t)0x8001, + (q15_t)0xc9, (q15_t)0x8001, (q15_t)0xc2, (q15_t)0x8001, (q15_t)0xbc, (q15_t)0x8001, (q15_t)0xb6, (q15_t)0x8001, + (q15_t)0xaf, (q15_t)0x8001, (q15_t)0xa9, (q15_t)0x8001, (q15_t)0xa3, (q15_t)0x8001, (q15_t)0x9d, (q15_t)0x8001, + (q15_t)0x96, (q15_t)0x8001, (q15_t)0x90, (q15_t)0x8001, (q15_t)0x8a, (q15_t)0x8001, (q15_t)0x83, (q15_t)0x8001, + (q15_t)0x7d, (q15_t)0x8001, (q15_t)0x77, (q15_t)0x8001, (q15_t)0x71, (q15_t)0x8001, (q15_t)0x6a, (q15_t)0x8001, + (q15_t)0x64, (q15_t)0x8001, (q15_t)0x5e, (q15_t)0x8001, (q15_t)0x57, (q15_t)0x8001, (q15_t)0x51, (q15_t)0x8001, + (q15_t)0x4b, (q15_t)0x8001, (q15_t)0x45, (q15_t)0x8001, (q15_t)0x3e, (q15_t)0x8001, (q15_t)0x38, (q15_t)0x8001, + (q15_t)0x32, (q15_t)0x8001, (q15_t)0x2b, (q15_t)0x8001, (q15_t)0x25, (q15_t)0x8001, (q15_t)0x1f, (q15_t)0x8001, + (q15_t)0x19, (q15_t)0x8001, (q15_t)0x12, (q15_t)0x8001, (q15_t)0xc, (q15_t)0x8001, (q15_t)0x6, (q15_t)0x8001 +}; + + const q15_t __ALIGNED(4) cos_factorsQ15_8192[8192] = { + (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, + (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, + (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, + (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, + (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, (q15_t)0x7fff, + (q15_t)0x7fff, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, + (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffe, + (q15_t)0x7ffe, (q15_t)0x7ffe, (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffd, + (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffd, (q15_t)0x7ffc, + (q15_t)0x7ffc, (q15_t)0x7ffc, (q15_t)0x7ffc, (q15_t)0x7ffc, (q15_t)0x7ffc, (q15_t)0x7ffc, (q15_t)0x7ffc, (q15_t)0x7ffc, + (q15_t)0x7ffc, (q15_t)0x7ffb, (q15_t)0x7ffb, (q15_t)0x7ffb, (q15_t)0x7ffb, (q15_t)0x7ffb, (q15_t)0x7ffb, (q15_t)0x7ffb, + (q15_t)0x7ffb, (q15_t)0x7ffb, (q15_t)0x7ffb, (q15_t)0x7ffa, (q15_t)0x7ffa, (q15_t)0x7ffa, (q15_t)0x7ffa, (q15_t)0x7ffa, + (q15_t)0x7ffa, (q15_t)0x7ffa, (q15_t)0x7ffa, (q15_t)0x7ffa, (q15_t)0x7ff9, (q15_t)0x7ff9, (q15_t)0x7ff9, (q15_t)0x7ff9, + (q15_t)0x7ff9, (q15_t)0x7ff9, (q15_t)0x7ff9, (q15_t)0x7ff9, (q15_t)0x7ff8, (q15_t)0x7ff8, (q15_t)0x7ff8, (q15_t)0x7ff8, + (q15_t)0x7ff8, (q15_t)0x7ff8, (q15_t)0x7ff8, (q15_t)0x7ff7, (q15_t)0x7ff7, (q15_t)0x7ff7, (q15_t)0x7ff7, (q15_t)0x7ff7, + (q15_t)0x7ff7, (q15_t)0x7ff7, (q15_t)0x7ff6, (q15_t)0x7ff6, (q15_t)0x7ff6, (q15_t)0x7ff6, (q15_t)0x7ff6, (q15_t)0x7ff6, + (q15_t)0x7ff6, (q15_t)0x7ff5, (q15_t)0x7ff5, (q15_t)0x7ff5, (q15_t)0x7ff5, (q15_t)0x7ff5, (q15_t)0x7ff5, (q15_t)0x7ff4, + (q15_t)0x7ff4, (q15_t)0x7ff4, (q15_t)0x7ff4, (q15_t)0x7ff4, (q15_t)0x7ff4, (q15_t)0x7ff3, (q15_t)0x7ff3, (q15_t)0x7ff3, + (q15_t)0x7ff3, (q15_t)0x7ff3, (q15_t)0x7ff3, (q15_t)0x7ff2, (q15_t)0x7ff2, (q15_t)0x7ff2, (q15_t)0x7ff2, (q15_t)0x7ff2, + (q15_t)0x7ff1, (q15_t)0x7ff1, (q15_t)0x7ff1, (q15_t)0x7ff1, (q15_t)0x7ff1, (q15_t)0x7ff1, (q15_t)0x7ff0, (q15_t)0x7ff0, + (q15_t)0x7ff0, (q15_t)0x7ff0, (q15_t)0x7ff0, (q15_t)0x7fef, (q15_t)0x7fef, (q15_t)0x7fef, (q15_t)0x7fef, (q15_t)0x7fef, + (q15_t)0x7fee, (q15_t)0x7fee, (q15_t)0x7fee, (q15_t)0x7fee, (q15_t)0x7fee, (q15_t)0x7fed, (q15_t)0x7fed, (q15_t)0x7fed, + (q15_t)0x7fed, (q15_t)0x7fed, (q15_t)0x7fec, (q15_t)0x7fec, (q15_t)0x7fec, (q15_t)0x7fec, (q15_t)0x7feb, (q15_t)0x7feb, + (q15_t)0x7feb, (q15_t)0x7feb, (q15_t)0x7feb, (q15_t)0x7fea, (q15_t)0x7fea, (q15_t)0x7fea, (q15_t)0x7fea, (q15_t)0x7fe9, + (q15_t)0x7fe9, (q15_t)0x7fe9, (q15_t)0x7fe9, (q15_t)0x7fe8, (q15_t)0x7fe8, (q15_t)0x7fe8, (q15_t)0x7fe8, (q15_t)0x7fe8, + (q15_t)0x7fe7, (q15_t)0x7fe7, (q15_t)0x7fe7, (q15_t)0x7fe7, (q15_t)0x7fe6, (q15_t)0x7fe6, (q15_t)0x7fe6, (q15_t)0x7fe6, + (q15_t)0x7fe5, (q15_t)0x7fe5, (q15_t)0x7fe5, (q15_t)0x7fe5, (q15_t)0x7fe4, (q15_t)0x7fe4, (q15_t)0x7fe4, (q15_t)0x7fe4, + (q15_t)0x7fe3, (q15_t)0x7fe3, (q15_t)0x7fe3, (q15_t)0x7fe2, (q15_t)0x7fe2, (q15_t)0x7fe2, (q15_t)0x7fe2, (q15_t)0x7fe1, + (q15_t)0x7fe1, (q15_t)0x7fe1, (q15_t)0x7fe1, (q15_t)0x7fe0, (q15_t)0x7fe0, (q15_t)0x7fe0, (q15_t)0x7fdf, (q15_t)0x7fdf, + (q15_t)0x7fdf, (q15_t)0x7fdf, (q15_t)0x7fde, (q15_t)0x7fde, (q15_t)0x7fde, (q15_t)0x7fde, (q15_t)0x7fdd, (q15_t)0x7fdd, + (q15_t)0x7fdd, (q15_t)0x7fdc, (q15_t)0x7fdc, (q15_t)0x7fdc, (q15_t)0x7fdb, (q15_t)0x7fdb, (q15_t)0x7fdb, (q15_t)0x7fdb, + (q15_t)0x7fda, (q15_t)0x7fda, (q15_t)0x7fda, (q15_t)0x7fd9, (q15_t)0x7fd9, (q15_t)0x7fd9, (q15_t)0x7fd8, (q15_t)0x7fd8, + (q15_t)0x7fd8, (q15_t)0x7fd8, (q15_t)0x7fd7, (q15_t)0x7fd7, (q15_t)0x7fd7, (q15_t)0x7fd6, (q15_t)0x7fd6, (q15_t)0x7fd6, + (q15_t)0x7fd5, (q15_t)0x7fd5, (q15_t)0x7fd5, (q15_t)0x7fd4, (q15_t)0x7fd4, (q15_t)0x7fd4, (q15_t)0x7fd3, (q15_t)0x7fd3, + (q15_t)0x7fd3, (q15_t)0x7fd2, (q15_t)0x7fd2, (q15_t)0x7fd2, (q15_t)0x7fd1, (q15_t)0x7fd1, (q15_t)0x7fd1, (q15_t)0x7fd0, + (q15_t)0x7fd0, (q15_t)0x7fd0, (q15_t)0x7fcf, (q15_t)0x7fcf, (q15_t)0x7fcf, (q15_t)0x7fce, (q15_t)0x7fce, (q15_t)0x7fce, + (q15_t)0x7fcd, (q15_t)0x7fcd, (q15_t)0x7fcd, (q15_t)0x7fcc, (q15_t)0x7fcc, (q15_t)0x7fcc, (q15_t)0x7fcb, (q15_t)0x7fcb, + (q15_t)0x7fcb, (q15_t)0x7fca, (q15_t)0x7fca, (q15_t)0x7fc9, (q15_t)0x7fc9, (q15_t)0x7fc9, (q15_t)0x7fc8, (q15_t)0x7fc8, + (q15_t)0x7fc8, (q15_t)0x7fc7, (q15_t)0x7fc7, (q15_t)0x7fc7, (q15_t)0x7fc6, (q15_t)0x7fc6, (q15_t)0x7fc5, (q15_t)0x7fc5, + (q15_t)0x7fc5, (q15_t)0x7fc4, (q15_t)0x7fc4, (q15_t)0x7fc4, (q15_t)0x7fc3, (q15_t)0x7fc3, (q15_t)0x7fc2, (q15_t)0x7fc2, + (q15_t)0x7fc2, (q15_t)0x7fc1, (q15_t)0x7fc1, (q15_t)0x7fc0, (q15_t)0x7fc0, (q15_t)0x7fc0, (q15_t)0x7fbf, (q15_t)0x7fbf, + (q15_t)0x7fbf, (q15_t)0x7fbe, (q15_t)0x7fbe, (q15_t)0x7fbd, (q15_t)0x7fbd, (q15_t)0x7fbd, (q15_t)0x7fbc, (q15_t)0x7fbc, + (q15_t)0x7fbb, (q15_t)0x7fbb, (q15_t)0x7fbb, (q15_t)0x7fba, (q15_t)0x7fba, (q15_t)0x7fb9, (q15_t)0x7fb9, (q15_t)0x7fb8, + (q15_t)0x7fb8, (q15_t)0x7fb8, (q15_t)0x7fb7, (q15_t)0x7fb7, (q15_t)0x7fb6, (q15_t)0x7fb6, (q15_t)0x7fb6, (q15_t)0x7fb5, + (q15_t)0x7fb5, (q15_t)0x7fb4, (q15_t)0x7fb4, (q15_t)0x7fb3, (q15_t)0x7fb3, (q15_t)0x7fb3, (q15_t)0x7fb2, (q15_t)0x7fb2, + (q15_t)0x7fb1, (q15_t)0x7fb1, (q15_t)0x7fb0, (q15_t)0x7fb0, (q15_t)0x7faf, (q15_t)0x7faf, (q15_t)0x7faf, (q15_t)0x7fae, + (q15_t)0x7fae, (q15_t)0x7fad, (q15_t)0x7fad, (q15_t)0x7fac, (q15_t)0x7fac, (q15_t)0x7fac, (q15_t)0x7fab, (q15_t)0x7fab, + (q15_t)0x7faa, (q15_t)0x7faa, (q15_t)0x7fa9, (q15_t)0x7fa9, (q15_t)0x7fa8, (q15_t)0x7fa8, (q15_t)0x7fa7, (q15_t)0x7fa7, + (q15_t)0x7fa6, (q15_t)0x7fa6, (q15_t)0x7fa6, (q15_t)0x7fa5, (q15_t)0x7fa5, (q15_t)0x7fa4, (q15_t)0x7fa4, (q15_t)0x7fa3, + (q15_t)0x7fa3, (q15_t)0x7fa2, (q15_t)0x7fa2, (q15_t)0x7fa1, (q15_t)0x7fa1, (q15_t)0x7fa0, (q15_t)0x7fa0, (q15_t)0x7f9f, + (q15_t)0x7f9f, (q15_t)0x7f9e, (q15_t)0x7f9e, (q15_t)0x7f9d, (q15_t)0x7f9d, (q15_t)0x7f9c, (q15_t)0x7f9c, (q15_t)0x7f9c, + (q15_t)0x7f9b, (q15_t)0x7f9b, (q15_t)0x7f9a, (q15_t)0x7f9a, (q15_t)0x7f99, (q15_t)0x7f99, (q15_t)0x7f98, (q15_t)0x7f98, + (q15_t)0x7f97, (q15_t)0x7f97, (q15_t)0x7f96, (q15_t)0x7f96, (q15_t)0x7f95, (q15_t)0x7f95, (q15_t)0x7f94, (q15_t)0x7f94, + (q15_t)0x7f93, (q15_t)0x7f92, (q15_t)0x7f92, (q15_t)0x7f91, (q15_t)0x7f91, (q15_t)0x7f90, (q15_t)0x7f90, (q15_t)0x7f8f, + (q15_t)0x7f8f, (q15_t)0x7f8e, (q15_t)0x7f8e, (q15_t)0x7f8d, (q15_t)0x7f8d, (q15_t)0x7f8c, (q15_t)0x7f8c, (q15_t)0x7f8b, + (q15_t)0x7f8b, (q15_t)0x7f8a, (q15_t)0x7f8a, (q15_t)0x7f89, (q15_t)0x7f89, (q15_t)0x7f88, (q15_t)0x7f87, (q15_t)0x7f87, + (q15_t)0x7f86, (q15_t)0x7f86, (q15_t)0x7f85, (q15_t)0x7f85, (q15_t)0x7f84, (q15_t)0x7f84, (q15_t)0x7f83, (q15_t)0x7f83, + (q15_t)0x7f82, (q15_t)0x7f81, (q15_t)0x7f81, (q15_t)0x7f80, (q15_t)0x7f80, (q15_t)0x7f7f, (q15_t)0x7f7f, (q15_t)0x7f7e, + (q15_t)0x7f7e, (q15_t)0x7f7d, (q15_t)0x7f7c, (q15_t)0x7f7c, (q15_t)0x7f7b, (q15_t)0x7f7b, (q15_t)0x7f7a, (q15_t)0x7f7a, + (q15_t)0x7f79, (q15_t)0x7f79, (q15_t)0x7f78, (q15_t)0x7f77, (q15_t)0x7f77, (q15_t)0x7f76, (q15_t)0x7f76, (q15_t)0x7f75, + (q15_t)0x7f75, (q15_t)0x7f74, (q15_t)0x7f73, (q15_t)0x7f73, (q15_t)0x7f72, (q15_t)0x7f72, (q15_t)0x7f71, (q15_t)0x7f70, + (q15_t)0x7f70, (q15_t)0x7f6f, (q15_t)0x7f6f, (q15_t)0x7f6e, (q15_t)0x7f6d, (q15_t)0x7f6d, (q15_t)0x7f6c, (q15_t)0x7f6c, + (q15_t)0x7f6b, (q15_t)0x7f6b, (q15_t)0x7f6a, (q15_t)0x7f69, (q15_t)0x7f69, (q15_t)0x7f68, (q15_t)0x7f68, (q15_t)0x7f67, + (q15_t)0x7f66, (q15_t)0x7f66, (q15_t)0x7f65, (q15_t)0x7f64, (q15_t)0x7f64, (q15_t)0x7f63, (q15_t)0x7f63, (q15_t)0x7f62, + (q15_t)0x7f61, (q15_t)0x7f61, (q15_t)0x7f60, (q15_t)0x7f60, (q15_t)0x7f5f, (q15_t)0x7f5e, (q15_t)0x7f5e, (q15_t)0x7f5d, + (q15_t)0x7f5c, (q15_t)0x7f5c, (q15_t)0x7f5b, (q15_t)0x7f5b, (q15_t)0x7f5a, (q15_t)0x7f59, (q15_t)0x7f59, (q15_t)0x7f58, + (q15_t)0x7f57, (q15_t)0x7f57, (q15_t)0x7f56, (q15_t)0x7f55, (q15_t)0x7f55, (q15_t)0x7f54, (q15_t)0x7f54, (q15_t)0x7f53, + (q15_t)0x7f52, (q15_t)0x7f52, (q15_t)0x7f51, (q15_t)0x7f50, (q15_t)0x7f50, (q15_t)0x7f4f, (q15_t)0x7f4e, (q15_t)0x7f4e, + (q15_t)0x7f4d, (q15_t)0x7f4c, (q15_t)0x7f4c, (q15_t)0x7f4b, (q15_t)0x7f4a, (q15_t)0x7f4a, (q15_t)0x7f49, (q15_t)0x7f48, + (q15_t)0x7f48, (q15_t)0x7f47, (q15_t)0x7f46, (q15_t)0x7f46, (q15_t)0x7f45, (q15_t)0x7f44, (q15_t)0x7f44, (q15_t)0x7f43, + (q15_t)0x7f42, (q15_t)0x7f42, (q15_t)0x7f41, (q15_t)0x7f40, (q15_t)0x7f40, (q15_t)0x7f3f, (q15_t)0x7f3e, (q15_t)0x7f3e, + (q15_t)0x7f3d, (q15_t)0x7f3c, (q15_t)0x7f3c, (q15_t)0x7f3b, (q15_t)0x7f3a, (q15_t)0x7f3a, (q15_t)0x7f39, (q15_t)0x7f38, + (q15_t)0x7f37, (q15_t)0x7f37, (q15_t)0x7f36, (q15_t)0x7f35, (q15_t)0x7f35, (q15_t)0x7f34, (q15_t)0x7f33, (q15_t)0x7f33, + (q15_t)0x7f32, (q15_t)0x7f31, (q15_t)0x7f31, (q15_t)0x7f30, (q15_t)0x7f2f, (q15_t)0x7f2e, (q15_t)0x7f2e, (q15_t)0x7f2d, + (q15_t)0x7f2c, (q15_t)0x7f2c, (q15_t)0x7f2b, (q15_t)0x7f2a, (q15_t)0x7f29, (q15_t)0x7f29, (q15_t)0x7f28, (q15_t)0x7f27, + (q15_t)0x7f27, (q15_t)0x7f26, (q15_t)0x7f25, (q15_t)0x7f24, (q15_t)0x7f24, (q15_t)0x7f23, (q15_t)0x7f22, (q15_t)0x7f21, + (q15_t)0x7f21, (q15_t)0x7f20, (q15_t)0x7f1f, (q15_t)0x7f1f, (q15_t)0x7f1e, (q15_t)0x7f1d, (q15_t)0x7f1c, (q15_t)0x7f1c, + (q15_t)0x7f1b, (q15_t)0x7f1a, (q15_t)0x7f19, (q15_t)0x7f19, (q15_t)0x7f18, (q15_t)0x7f17, (q15_t)0x7f16, (q15_t)0x7f16, + (q15_t)0x7f15, (q15_t)0x7f14, (q15_t)0x7f13, (q15_t)0x7f13, (q15_t)0x7f12, (q15_t)0x7f11, (q15_t)0x7f10, (q15_t)0x7f10, + (q15_t)0x7f0f, (q15_t)0x7f0e, (q15_t)0x7f0d, (q15_t)0x7f0d, (q15_t)0x7f0c, (q15_t)0x7f0b, (q15_t)0x7f0a, (q15_t)0x7f09, + (q15_t)0x7f09, (q15_t)0x7f08, (q15_t)0x7f07, (q15_t)0x7f06, (q15_t)0x7f06, (q15_t)0x7f05, (q15_t)0x7f04, (q15_t)0x7f03, + (q15_t)0x7f02, (q15_t)0x7f02, (q15_t)0x7f01, (q15_t)0x7f00, (q15_t)0x7eff, (q15_t)0x7eff, (q15_t)0x7efe, (q15_t)0x7efd, + (q15_t)0x7efc, (q15_t)0x7efb, (q15_t)0x7efb, (q15_t)0x7efa, (q15_t)0x7ef9, (q15_t)0x7ef8, (q15_t)0x7ef7, (q15_t)0x7ef7, + (q15_t)0x7ef6, (q15_t)0x7ef5, (q15_t)0x7ef4, (q15_t)0x7ef3, (q15_t)0x7ef3, (q15_t)0x7ef2, (q15_t)0x7ef1, (q15_t)0x7ef0, + (q15_t)0x7eef, (q15_t)0x7eef, (q15_t)0x7eee, (q15_t)0x7eed, (q15_t)0x7eec, (q15_t)0x7eeb, (q15_t)0x7eeb, (q15_t)0x7eea, + (q15_t)0x7ee9, (q15_t)0x7ee8, (q15_t)0x7ee7, (q15_t)0x7ee6, (q15_t)0x7ee6, (q15_t)0x7ee5, (q15_t)0x7ee4, (q15_t)0x7ee3, + (q15_t)0x7ee2, (q15_t)0x7ee2, (q15_t)0x7ee1, (q15_t)0x7ee0, (q15_t)0x7edf, (q15_t)0x7ede, (q15_t)0x7edd, (q15_t)0x7edd, + (q15_t)0x7edc, (q15_t)0x7edb, (q15_t)0x7eda, (q15_t)0x7ed9, (q15_t)0x7ed8, (q15_t)0x7ed8, (q15_t)0x7ed7, (q15_t)0x7ed6, + (q15_t)0x7ed5, (q15_t)0x7ed4, (q15_t)0x7ed3, (q15_t)0x7ed2, (q15_t)0x7ed2, (q15_t)0x7ed1, (q15_t)0x7ed0, (q15_t)0x7ecf, + (q15_t)0x7ece, (q15_t)0x7ecd, (q15_t)0x7ecc, (q15_t)0x7ecc, (q15_t)0x7ecb, (q15_t)0x7eca, (q15_t)0x7ec9, (q15_t)0x7ec8, + (q15_t)0x7ec7, (q15_t)0x7ec6, (q15_t)0x7ec6, (q15_t)0x7ec5, (q15_t)0x7ec4, (q15_t)0x7ec3, (q15_t)0x7ec2, (q15_t)0x7ec1, + (q15_t)0x7ec0, (q15_t)0x7ebf, (q15_t)0x7ebf, (q15_t)0x7ebe, (q15_t)0x7ebd, (q15_t)0x7ebc, (q15_t)0x7ebb, (q15_t)0x7eba, + (q15_t)0x7eb9, (q15_t)0x7eb8, (q15_t)0x7eb8, (q15_t)0x7eb7, (q15_t)0x7eb6, (q15_t)0x7eb5, (q15_t)0x7eb4, (q15_t)0x7eb3, + (q15_t)0x7eb2, (q15_t)0x7eb1, (q15_t)0x7eb0, (q15_t)0x7eaf, (q15_t)0x7eaf, (q15_t)0x7eae, (q15_t)0x7ead, (q15_t)0x7eac, + (q15_t)0x7eab, (q15_t)0x7eaa, (q15_t)0x7ea9, (q15_t)0x7ea8, (q15_t)0x7ea7, (q15_t)0x7ea6, (q15_t)0x7ea6, (q15_t)0x7ea5, + (q15_t)0x7ea4, (q15_t)0x7ea3, (q15_t)0x7ea2, (q15_t)0x7ea1, (q15_t)0x7ea0, (q15_t)0x7e9f, (q15_t)0x7e9e, (q15_t)0x7e9d, + (q15_t)0x7e9c, (q15_t)0x7e9b, (q15_t)0x7e9b, (q15_t)0x7e9a, (q15_t)0x7e99, (q15_t)0x7e98, (q15_t)0x7e97, (q15_t)0x7e96, + (q15_t)0x7e95, (q15_t)0x7e94, (q15_t)0x7e93, (q15_t)0x7e92, (q15_t)0x7e91, (q15_t)0x7e90, (q15_t)0x7e8f, (q15_t)0x7e8e, + (q15_t)0x7e8d, (q15_t)0x7e8d, (q15_t)0x7e8c, (q15_t)0x7e8b, (q15_t)0x7e8a, (q15_t)0x7e89, (q15_t)0x7e88, (q15_t)0x7e87, + (q15_t)0x7e86, (q15_t)0x7e85, (q15_t)0x7e84, (q15_t)0x7e83, (q15_t)0x7e82, (q15_t)0x7e81, (q15_t)0x7e80, (q15_t)0x7e7f, + (q15_t)0x7e7e, (q15_t)0x7e7d, (q15_t)0x7e7c, (q15_t)0x7e7b, (q15_t)0x7e7a, (q15_t)0x7e79, (q15_t)0x7e78, (q15_t)0x7e77, + (q15_t)0x7e77, (q15_t)0x7e76, (q15_t)0x7e75, (q15_t)0x7e74, (q15_t)0x7e73, (q15_t)0x7e72, (q15_t)0x7e71, (q15_t)0x7e70, + (q15_t)0x7e6f, (q15_t)0x7e6e, (q15_t)0x7e6d, (q15_t)0x7e6c, (q15_t)0x7e6b, (q15_t)0x7e6a, (q15_t)0x7e69, (q15_t)0x7e68, + (q15_t)0x7e67, (q15_t)0x7e66, (q15_t)0x7e65, (q15_t)0x7e64, (q15_t)0x7e63, (q15_t)0x7e62, (q15_t)0x7e61, (q15_t)0x7e60, + (q15_t)0x7e5f, (q15_t)0x7e5e, (q15_t)0x7e5d, (q15_t)0x7e5c, (q15_t)0x7e5b, (q15_t)0x7e5a, (q15_t)0x7e59, (q15_t)0x7e58, + (q15_t)0x7e57, (q15_t)0x7e56, (q15_t)0x7e55, (q15_t)0x7e54, (q15_t)0x7e53, (q15_t)0x7e52, (q15_t)0x7e51, (q15_t)0x7e50, + (q15_t)0x7e4f, (q15_t)0x7e4e, (q15_t)0x7e4d, (q15_t)0x7e4c, (q15_t)0x7e4b, (q15_t)0x7e4a, (q15_t)0x7e49, (q15_t)0x7e48, + (q15_t)0x7e47, (q15_t)0x7e46, (q15_t)0x7e45, (q15_t)0x7e43, (q15_t)0x7e42, (q15_t)0x7e41, (q15_t)0x7e40, (q15_t)0x7e3f, + (q15_t)0x7e3e, (q15_t)0x7e3d, (q15_t)0x7e3c, (q15_t)0x7e3b, (q15_t)0x7e3a, (q15_t)0x7e39, (q15_t)0x7e38, (q15_t)0x7e37, + (q15_t)0x7e36, (q15_t)0x7e35, (q15_t)0x7e34, (q15_t)0x7e33, (q15_t)0x7e32, (q15_t)0x7e31, (q15_t)0x7e30, (q15_t)0x7e2f, + (q15_t)0x7e2e, (q15_t)0x7e2d, (q15_t)0x7e2b, (q15_t)0x7e2a, (q15_t)0x7e29, (q15_t)0x7e28, (q15_t)0x7e27, (q15_t)0x7e26, + (q15_t)0x7e25, (q15_t)0x7e24, (q15_t)0x7e23, (q15_t)0x7e22, (q15_t)0x7e21, (q15_t)0x7e20, (q15_t)0x7e1f, (q15_t)0x7e1e, + (q15_t)0x7e1d, (q15_t)0x7e1b, (q15_t)0x7e1a, (q15_t)0x7e19, (q15_t)0x7e18, (q15_t)0x7e17, (q15_t)0x7e16, (q15_t)0x7e15, + (q15_t)0x7e14, (q15_t)0x7e13, (q15_t)0x7e12, (q15_t)0x7e11, (q15_t)0x7e10, (q15_t)0x7e0e, (q15_t)0x7e0d, (q15_t)0x7e0c, + (q15_t)0x7e0b, (q15_t)0x7e0a, (q15_t)0x7e09, (q15_t)0x7e08, (q15_t)0x7e07, (q15_t)0x7e06, (q15_t)0x7e05, (q15_t)0x7e04, + (q15_t)0x7e02, (q15_t)0x7e01, (q15_t)0x7e00, (q15_t)0x7dff, (q15_t)0x7dfe, (q15_t)0x7dfd, (q15_t)0x7dfc, (q15_t)0x7dfb, + (q15_t)0x7dfa, (q15_t)0x7df8, (q15_t)0x7df7, (q15_t)0x7df6, (q15_t)0x7df5, (q15_t)0x7df4, (q15_t)0x7df3, (q15_t)0x7df2, + (q15_t)0x7df1, (q15_t)0x7def, (q15_t)0x7dee, (q15_t)0x7ded, (q15_t)0x7dec, (q15_t)0x7deb, (q15_t)0x7dea, (q15_t)0x7de9, + (q15_t)0x7de8, (q15_t)0x7de6, (q15_t)0x7de5, (q15_t)0x7de4, (q15_t)0x7de3, (q15_t)0x7de2, (q15_t)0x7de1, (q15_t)0x7de0, + (q15_t)0x7dde, (q15_t)0x7ddd, (q15_t)0x7ddc, (q15_t)0x7ddb, (q15_t)0x7dda, (q15_t)0x7dd9, (q15_t)0x7dd8, (q15_t)0x7dd6, + (q15_t)0x7dd5, (q15_t)0x7dd4, (q15_t)0x7dd3, (q15_t)0x7dd2, (q15_t)0x7dd1, (q15_t)0x7dd0, (q15_t)0x7dce, (q15_t)0x7dcd, + (q15_t)0x7dcc, (q15_t)0x7dcb, (q15_t)0x7dca, (q15_t)0x7dc9, (q15_t)0x7dc7, (q15_t)0x7dc6, (q15_t)0x7dc5, (q15_t)0x7dc4, + (q15_t)0x7dc3, (q15_t)0x7dc2, (q15_t)0x7dc0, (q15_t)0x7dbf, (q15_t)0x7dbe, (q15_t)0x7dbd, (q15_t)0x7dbc, (q15_t)0x7dbb, + (q15_t)0x7db9, (q15_t)0x7db8, (q15_t)0x7db7, (q15_t)0x7db6, (q15_t)0x7db5, (q15_t)0x7db3, (q15_t)0x7db2, (q15_t)0x7db1, + (q15_t)0x7db0, (q15_t)0x7daf, (q15_t)0x7dae, (q15_t)0x7dac, (q15_t)0x7dab, (q15_t)0x7daa, (q15_t)0x7da9, (q15_t)0x7da8, + (q15_t)0x7da6, (q15_t)0x7da5, (q15_t)0x7da4, (q15_t)0x7da3, (q15_t)0x7da2, (q15_t)0x7da0, (q15_t)0x7d9f, (q15_t)0x7d9e, + (q15_t)0x7d9d, (q15_t)0x7d9c, (q15_t)0x7d9a, (q15_t)0x7d99, (q15_t)0x7d98, (q15_t)0x7d97, (q15_t)0x7d95, (q15_t)0x7d94, + (q15_t)0x7d93, (q15_t)0x7d92, (q15_t)0x7d91, (q15_t)0x7d8f, (q15_t)0x7d8e, (q15_t)0x7d8d, (q15_t)0x7d8c, (q15_t)0x7d8a, + (q15_t)0x7d89, (q15_t)0x7d88, (q15_t)0x7d87, (q15_t)0x7d86, (q15_t)0x7d84, (q15_t)0x7d83, (q15_t)0x7d82, (q15_t)0x7d81, + (q15_t)0x7d7f, (q15_t)0x7d7e, (q15_t)0x7d7d, (q15_t)0x7d7c, (q15_t)0x7d7a, (q15_t)0x7d79, (q15_t)0x7d78, (q15_t)0x7d77, + (q15_t)0x7d75, (q15_t)0x7d74, (q15_t)0x7d73, (q15_t)0x7d72, (q15_t)0x7d70, (q15_t)0x7d6f, (q15_t)0x7d6e, (q15_t)0x7d6d, + (q15_t)0x7d6b, (q15_t)0x7d6a, (q15_t)0x7d69, (q15_t)0x7d68, (q15_t)0x7d66, (q15_t)0x7d65, (q15_t)0x7d64, (q15_t)0x7d63, + (q15_t)0x7d61, (q15_t)0x7d60, (q15_t)0x7d5f, (q15_t)0x7d5e, (q15_t)0x7d5c, (q15_t)0x7d5b, (q15_t)0x7d5a, (q15_t)0x7d59, + (q15_t)0x7d57, (q15_t)0x7d56, (q15_t)0x7d55, (q15_t)0x7d53, (q15_t)0x7d52, (q15_t)0x7d51, (q15_t)0x7d50, (q15_t)0x7d4e, + (q15_t)0x7d4d, (q15_t)0x7d4c, (q15_t)0x7d4a, (q15_t)0x7d49, (q15_t)0x7d48, (q15_t)0x7d47, (q15_t)0x7d45, (q15_t)0x7d44, + (q15_t)0x7d43, (q15_t)0x7d41, (q15_t)0x7d40, (q15_t)0x7d3f, (q15_t)0x7d3e, (q15_t)0x7d3c, (q15_t)0x7d3b, (q15_t)0x7d3a, + (q15_t)0x7d38, (q15_t)0x7d37, (q15_t)0x7d36, (q15_t)0x7d34, (q15_t)0x7d33, (q15_t)0x7d32, (q15_t)0x7d31, (q15_t)0x7d2f, + (q15_t)0x7d2e, (q15_t)0x7d2d, (q15_t)0x7d2b, (q15_t)0x7d2a, (q15_t)0x7d29, (q15_t)0x7d27, (q15_t)0x7d26, (q15_t)0x7d25, + (q15_t)0x7d23, (q15_t)0x7d22, (q15_t)0x7d21, (q15_t)0x7d1f, (q15_t)0x7d1e, (q15_t)0x7d1d, (q15_t)0x7d1b, (q15_t)0x7d1a, + (q15_t)0x7d19, (q15_t)0x7d17, (q15_t)0x7d16, (q15_t)0x7d15, (q15_t)0x7d13, (q15_t)0x7d12, (q15_t)0x7d11, (q15_t)0x7d0f, + (q15_t)0x7d0e, (q15_t)0x7d0d, (q15_t)0x7d0b, (q15_t)0x7d0a, (q15_t)0x7d09, (q15_t)0x7d07, (q15_t)0x7d06, (q15_t)0x7d05, + (q15_t)0x7d03, (q15_t)0x7d02, (q15_t)0x7d01, (q15_t)0x7cff, (q15_t)0x7cfe, (q15_t)0x7cfd, (q15_t)0x7cfb, (q15_t)0x7cfa, + (q15_t)0x7cf9, (q15_t)0x7cf7, (q15_t)0x7cf6, (q15_t)0x7cf4, (q15_t)0x7cf3, (q15_t)0x7cf2, (q15_t)0x7cf0, (q15_t)0x7cef, + (q15_t)0x7cee, (q15_t)0x7cec, (q15_t)0x7ceb, (q15_t)0x7ce9, (q15_t)0x7ce8, (q15_t)0x7ce7, (q15_t)0x7ce5, (q15_t)0x7ce4, + (q15_t)0x7ce3, (q15_t)0x7ce1, (q15_t)0x7ce0, (q15_t)0x7cde, (q15_t)0x7cdd, (q15_t)0x7cdc, (q15_t)0x7cda, (q15_t)0x7cd9, + (q15_t)0x7cd8, (q15_t)0x7cd6, (q15_t)0x7cd5, (q15_t)0x7cd3, (q15_t)0x7cd2, (q15_t)0x7cd1, (q15_t)0x7ccf, (q15_t)0x7cce, + (q15_t)0x7ccc, (q15_t)0x7ccb, (q15_t)0x7cca, (q15_t)0x7cc8, (q15_t)0x7cc7, (q15_t)0x7cc5, (q15_t)0x7cc4, (q15_t)0x7cc3, + (q15_t)0x7cc1, (q15_t)0x7cc0, (q15_t)0x7cbe, (q15_t)0x7cbd, (q15_t)0x7cbc, (q15_t)0x7cba, (q15_t)0x7cb9, (q15_t)0x7cb7, + (q15_t)0x7cb6, (q15_t)0x7cb5, (q15_t)0x7cb3, (q15_t)0x7cb2, (q15_t)0x7cb0, (q15_t)0x7caf, (q15_t)0x7cad, (q15_t)0x7cac, + (q15_t)0x7cab, (q15_t)0x7ca9, (q15_t)0x7ca8, (q15_t)0x7ca6, (q15_t)0x7ca5, (q15_t)0x7ca3, (q15_t)0x7ca2, (q15_t)0x7ca1, + (q15_t)0x7c9f, (q15_t)0x7c9e, (q15_t)0x7c9c, (q15_t)0x7c9b, (q15_t)0x7c99, (q15_t)0x7c98, (q15_t)0x7c97, (q15_t)0x7c95, + (q15_t)0x7c94, (q15_t)0x7c92, (q15_t)0x7c91, (q15_t)0x7c8f, (q15_t)0x7c8e, (q15_t)0x7c8c, (q15_t)0x7c8b, (q15_t)0x7c8a, + (q15_t)0x7c88, (q15_t)0x7c87, (q15_t)0x7c85, (q15_t)0x7c84, (q15_t)0x7c82, (q15_t)0x7c81, (q15_t)0x7c7f, (q15_t)0x7c7e, + (q15_t)0x7c7c, (q15_t)0x7c7b, (q15_t)0x7c79, (q15_t)0x7c78, (q15_t)0x7c77, (q15_t)0x7c75, (q15_t)0x7c74, (q15_t)0x7c72, + (q15_t)0x7c71, (q15_t)0x7c6f, (q15_t)0x7c6e, (q15_t)0x7c6c, (q15_t)0x7c6b, (q15_t)0x7c69, (q15_t)0x7c68, (q15_t)0x7c66, + (q15_t)0x7c65, (q15_t)0x7c63, (q15_t)0x7c62, (q15_t)0x7c60, (q15_t)0x7c5f, (q15_t)0x7c5d, (q15_t)0x7c5c, (q15_t)0x7c5a, + (q15_t)0x7c59, (q15_t)0x7c58, (q15_t)0x7c56, (q15_t)0x7c55, (q15_t)0x7c53, (q15_t)0x7c52, (q15_t)0x7c50, (q15_t)0x7c4f, + (q15_t)0x7c4d, (q15_t)0x7c4c, (q15_t)0x7c4a, (q15_t)0x7c49, (q15_t)0x7c47, (q15_t)0x7c46, (q15_t)0x7c44, (q15_t)0x7c43, + (q15_t)0x7c41, (q15_t)0x7c3f, (q15_t)0x7c3e, (q15_t)0x7c3c, (q15_t)0x7c3b, (q15_t)0x7c39, (q15_t)0x7c38, (q15_t)0x7c36, + (q15_t)0x7c35, (q15_t)0x7c33, (q15_t)0x7c32, (q15_t)0x7c30, (q15_t)0x7c2f, (q15_t)0x7c2d, (q15_t)0x7c2c, (q15_t)0x7c2a, + (q15_t)0x7c29, (q15_t)0x7c27, (q15_t)0x7c26, (q15_t)0x7c24, (q15_t)0x7c23, (q15_t)0x7c21, (q15_t)0x7c20, (q15_t)0x7c1e, + (q15_t)0x7c1c, (q15_t)0x7c1b, (q15_t)0x7c19, (q15_t)0x7c18, (q15_t)0x7c16, (q15_t)0x7c15, (q15_t)0x7c13, (q15_t)0x7c12, + (q15_t)0x7c10, (q15_t)0x7c0f, (q15_t)0x7c0d, (q15_t)0x7c0b, (q15_t)0x7c0a, (q15_t)0x7c08, (q15_t)0x7c07, (q15_t)0x7c05, + (q15_t)0x7c04, (q15_t)0x7c02, (q15_t)0x7c01, (q15_t)0x7bff, (q15_t)0x7bfd, (q15_t)0x7bfc, (q15_t)0x7bfa, (q15_t)0x7bf9, + (q15_t)0x7bf7, (q15_t)0x7bf6, (q15_t)0x7bf4, (q15_t)0x7bf3, (q15_t)0x7bf1, (q15_t)0x7bef, (q15_t)0x7bee, (q15_t)0x7bec, + (q15_t)0x7beb, (q15_t)0x7be9, (q15_t)0x7be8, (q15_t)0x7be6, (q15_t)0x7be4, (q15_t)0x7be3, (q15_t)0x7be1, (q15_t)0x7be0, + (q15_t)0x7bde, (q15_t)0x7bdc, (q15_t)0x7bdb, (q15_t)0x7bd9, (q15_t)0x7bd8, (q15_t)0x7bd6, (q15_t)0x7bd5, (q15_t)0x7bd3, + (q15_t)0x7bd1, (q15_t)0x7bd0, (q15_t)0x7bce, (q15_t)0x7bcd, (q15_t)0x7bcb, (q15_t)0x7bc9, (q15_t)0x7bc8, (q15_t)0x7bc6, + (q15_t)0x7bc5, (q15_t)0x7bc3, (q15_t)0x7bc1, (q15_t)0x7bc0, (q15_t)0x7bbe, (q15_t)0x7bbd, (q15_t)0x7bbb, (q15_t)0x7bb9, + (q15_t)0x7bb8, (q15_t)0x7bb6, (q15_t)0x7bb5, (q15_t)0x7bb3, (q15_t)0x7bb1, (q15_t)0x7bb0, (q15_t)0x7bae, (q15_t)0x7bac, + (q15_t)0x7bab, (q15_t)0x7ba9, (q15_t)0x7ba8, (q15_t)0x7ba6, (q15_t)0x7ba4, (q15_t)0x7ba3, (q15_t)0x7ba1, (q15_t)0x7b9f, + (q15_t)0x7b9e, (q15_t)0x7b9c, (q15_t)0x7b9b, (q15_t)0x7b99, (q15_t)0x7b97, (q15_t)0x7b96, (q15_t)0x7b94, (q15_t)0x7b92, + (q15_t)0x7b91, (q15_t)0x7b8f, (q15_t)0x7b8d, (q15_t)0x7b8c, (q15_t)0x7b8a, (q15_t)0x7b89, (q15_t)0x7b87, (q15_t)0x7b85, + (q15_t)0x7b84, (q15_t)0x7b82, (q15_t)0x7b80, (q15_t)0x7b7f, (q15_t)0x7b7d, (q15_t)0x7b7b, (q15_t)0x7b7a, (q15_t)0x7b78, + (q15_t)0x7b76, (q15_t)0x7b75, (q15_t)0x7b73, (q15_t)0x7b71, (q15_t)0x7b70, (q15_t)0x7b6e, (q15_t)0x7b6c, (q15_t)0x7b6b, + (q15_t)0x7b69, (q15_t)0x7b67, (q15_t)0x7b66, (q15_t)0x7b64, (q15_t)0x7b62, (q15_t)0x7b61, (q15_t)0x7b5f, (q15_t)0x7b5d, + (q15_t)0x7b5c, (q15_t)0x7b5a, (q15_t)0x7b58, (q15_t)0x7b57, (q15_t)0x7b55, (q15_t)0x7b53, (q15_t)0x7b52, (q15_t)0x7b50, + (q15_t)0x7b4e, (q15_t)0x7b4d, (q15_t)0x7b4b, (q15_t)0x7b49, (q15_t)0x7b47, (q15_t)0x7b46, (q15_t)0x7b44, (q15_t)0x7b42, + (q15_t)0x7b41, (q15_t)0x7b3f, (q15_t)0x7b3d, (q15_t)0x7b3c, (q15_t)0x7b3a, (q15_t)0x7b38, (q15_t)0x7b37, (q15_t)0x7b35, + (q15_t)0x7b33, (q15_t)0x7b31, (q15_t)0x7b30, (q15_t)0x7b2e, (q15_t)0x7b2c, (q15_t)0x7b2b, (q15_t)0x7b29, (q15_t)0x7b27, + (q15_t)0x7b25, (q15_t)0x7b24, (q15_t)0x7b22, (q15_t)0x7b20, (q15_t)0x7b1f, (q15_t)0x7b1d, (q15_t)0x7b1b, (q15_t)0x7b19, + (q15_t)0x7b18, (q15_t)0x7b16, (q15_t)0x7b14, (q15_t)0x7b13, (q15_t)0x7b11, (q15_t)0x7b0f, (q15_t)0x7b0d, (q15_t)0x7b0c, + (q15_t)0x7b0a, (q15_t)0x7b08, (q15_t)0x7b06, (q15_t)0x7b05, (q15_t)0x7b03, (q15_t)0x7b01, (q15_t)0x7aff, (q15_t)0x7afe, + (q15_t)0x7afc, (q15_t)0x7afa, (q15_t)0x7af8, (q15_t)0x7af7, (q15_t)0x7af5, (q15_t)0x7af3, (q15_t)0x7af2, (q15_t)0x7af0, + (q15_t)0x7aee, (q15_t)0x7aec, (q15_t)0x7aeb, (q15_t)0x7ae9, (q15_t)0x7ae7, (q15_t)0x7ae5, (q15_t)0x7ae3, (q15_t)0x7ae2, + (q15_t)0x7ae0, (q15_t)0x7ade, (q15_t)0x7adc, (q15_t)0x7adb, (q15_t)0x7ad9, (q15_t)0x7ad7, (q15_t)0x7ad5, (q15_t)0x7ad4, + (q15_t)0x7ad2, (q15_t)0x7ad0, (q15_t)0x7ace, (q15_t)0x7acd, (q15_t)0x7acb, (q15_t)0x7ac9, (q15_t)0x7ac7, (q15_t)0x7ac5, + (q15_t)0x7ac4, (q15_t)0x7ac2, (q15_t)0x7ac0, (q15_t)0x7abe, (q15_t)0x7abd, (q15_t)0x7abb, (q15_t)0x7ab9, (q15_t)0x7ab7, + (q15_t)0x7ab5, (q15_t)0x7ab4, (q15_t)0x7ab2, (q15_t)0x7ab0, (q15_t)0x7aae, (q15_t)0x7aac, (q15_t)0x7aab, (q15_t)0x7aa9, + (q15_t)0x7aa7, (q15_t)0x7aa5, (q15_t)0x7aa3, (q15_t)0x7aa2, (q15_t)0x7aa0, (q15_t)0x7a9e, (q15_t)0x7a9c, (q15_t)0x7a9a, + (q15_t)0x7a99, (q15_t)0x7a97, (q15_t)0x7a95, (q15_t)0x7a93, (q15_t)0x7a91, (q15_t)0x7a90, (q15_t)0x7a8e, (q15_t)0x7a8c, + (q15_t)0x7a8a, (q15_t)0x7a88, (q15_t)0x7a87, (q15_t)0x7a85, (q15_t)0x7a83, (q15_t)0x7a81, (q15_t)0x7a7f, (q15_t)0x7a7d, + (q15_t)0x7a7c, (q15_t)0x7a7a, (q15_t)0x7a78, (q15_t)0x7a76, (q15_t)0x7a74, (q15_t)0x7a72, (q15_t)0x7a71, (q15_t)0x7a6f, + (q15_t)0x7a6d, (q15_t)0x7a6b, (q15_t)0x7a69, (q15_t)0x7a67, (q15_t)0x7a66, (q15_t)0x7a64, (q15_t)0x7a62, (q15_t)0x7a60, + (q15_t)0x7a5e, (q15_t)0x7a5c, (q15_t)0x7a5b, (q15_t)0x7a59, (q15_t)0x7a57, (q15_t)0x7a55, (q15_t)0x7a53, (q15_t)0x7a51, + (q15_t)0x7a4f, (q15_t)0x7a4e, (q15_t)0x7a4c, (q15_t)0x7a4a, (q15_t)0x7a48, (q15_t)0x7a46, (q15_t)0x7a44, (q15_t)0x7a42, + (q15_t)0x7a41, (q15_t)0x7a3f, (q15_t)0x7a3d, (q15_t)0x7a3b, (q15_t)0x7a39, (q15_t)0x7a37, (q15_t)0x7a35, (q15_t)0x7a34, + (q15_t)0x7a32, (q15_t)0x7a30, (q15_t)0x7a2e, (q15_t)0x7a2c, (q15_t)0x7a2a, (q15_t)0x7a28, (q15_t)0x7a26, (q15_t)0x7a25, + (q15_t)0x7a23, (q15_t)0x7a21, (q15_t)0x7a1f, (q15_t)0x7a1d, (q15_t)0x7a1b, (q15_t)0x7a19, (q15_t)0x7a17, (q15_t)0x7a16, + (q15_t)0x7a14, (q15_t)0x7a12, (q15_t)0x7a10, (q15_t)0x7a0e, (q15_t)0x7a0c, (q15_t)0x7a0a, (q15_t)0x7a08, (q15_t)0x7a06, + (q15_t)0x7a04, (q15_t)0x7a03, (q15_t)0x7a01, (q15_t)0x79ff, (q15_t)0x79fd, (q15_t)0x79fb, (q15_t)0x79f9, (q15_t)0x79f7, + (q15_t)0x79f5, (q15_t)0x79f3, (q15_t)0x79f1, (q15_t)0x79f0, (q15_t)0x79ee, (q15_t)0x79ec, (q15_t)0x79ea, (q15_t)0x79e8, + (q15_t)0x79e6, (q15_t)0x79e4, (q15_t)0x79e2, (q15_t)0x79e0, (q15_t)0x79de, (q15_t)0x79dc, (q15_t)0x79da, (q15_t)0x79d9, + (q15_t)0x79d7, (q15_t)0x79d5, (q15_t)0x79d3, (q15_t)0x79d1, (q15_t)0x79cf, (q15_t)0x79cd, (q15_t)0x79cb, (q15_t)0x79c9, + (q15_t)0x79c7, (q15_t)0x79c5, (q15_t)0x79c3, (q15_t)0x79c1, (q15_t)0x79bf, (q15_t)0x79bd, (q15_t)0x79bc, (q15_t)0x79ba, + (q15_t)0x79b8, (q15_t)0x79b6, (q15_t)0x79b4, (q15_t)0x79b2, (q15_t)0x79b0, (q15_t)0x79ae, (q15_t)0x79ac, (q15_t)0x79aa, + (q15_t)0x79a8, (q15_t)0x79a6, (q15_t)0x79a4, (q15_t)0x79a2, (q15_t)0x79a0, (q15_t)0x799e, (q15_t)0x799c, (q15_t)0x799a, + (q15_t)0x7998, (q15_t)0x7996, (q15_t)0x7994, (q15_t)0x7992, (q15_t)0x7991, (q15_t)0x798f, (q15_t)0x798d, (q15_t)0x798b, + (q15_t)0x7989, (q15_t)0x7987, (q15_t)0x7985, (q15_t)0x7983, (q15_t)0x7981, (q15_t)0x797f, (q15_t)0x797d, (q15_t)0x797b, + (q15_t)0x7979, (q15_t)0x7977, (q15_t)0x7975, (q15_t)0x7973, (q15_t)0x7971, (q15_t)0x796f, (q15_t)0x796d, (q15_t)0x796b, + (q15_t)0x7969, (q15_t)0x7967, (q15_t)0x7965, (q15_t)0x7963, (q15_t)0x7961, (q15_t)0x795f, (q15_t)0x795d, (q15_t)0x795b, + (q15_t)0x7959, (q15_t)0x7957, (q15_t)0x7955, (q15_t)0x7953, (q15_t)0x7951, (q15_t)0x794f, (q15_t)0x794d, (q15_t)0x794b, + (q15_t)0x7949, (q15_t)0x7947, (q15_t)0x7945, (q15_t)0x7943, (q15_t)0x7941, (q15_t)0x793f, (q15_t)0x793d, (q15_t)0x793b, + (q15_t)0x7939, (q15_t)0x7937, (q15_t)0x7935, (q15_t)0x7933, (q15_t)0x7931, (q15_t)0x792f, (q15_t)0x792d, (q15_t)0x792b, + (q15_t)0x7929, (q15_t)0x7927, (q15_t)0x7925, (q15_t)0x7923, (q15_t)0x7921, (q15_t)0x791f, (q15_t)0x791d, (q15_t)0x791a, + (q15_t)0x7918, (q15_t)0x7916, (q15_t)0x7914, (q15_t)0x7912, (q15_t)0x7910, (q15_t)0x790e, (q15_t)0x790c, (q15_t)0x790a, + (q15_t)0x7908, (q15_t)0x7906, (q15_t)0x7904, (q15_t)0x7902, (q15_t)0x7900, (q15_t)0x78fe, (q15_t)0x78fc, (q15_t)0x78fa, + (q15_t)0x78f8, (q15_t)0x78f6, (q15_t)0x78f4, (q15_t)0x78f2, (q15_t)0x78f0, (q15_t)0x78ed, (q15_t)0x78eb, (q15_t)0x78e9, + (q15_t)0x78e7, (q15_t)0x78e5, (q15_t)0x78e3, (q15_t)0x78e1, (q15_t)0x78df, (q15_t)0x78dd, (q15_t)0x78db, (q15_t)0x78d9, + (q15_t)0x78d7, (q15_t)0x78d5, (q15_t)0x78d3, (q15_t)0x78d1, (q15_t)0x78ce, (q15_t)0x78cc, (q15_t)0x78ca, (q15_t)0x78c8, + (q15_t)0x78c6, (q15_t)0x78c4, (q15_t)0x78c2, (q15_t)0x78c0, (q15_t)0x78be, (q15_t)0x78bc, (q15_t)0x78ba, (q15_t)0x78b8, + (q15_t)0x78b5, (q15_t)0x78b3, (q15_t)0x78b1, (q15_t)0x78af, (q15_t)0x78ad, (q15_t)0x78ab, (q15_t)0x78a9, (q15_t)0x78a7, + (q15_t)0x78a5, (q15_t)0x78a3, (q15_t)0x78a0, (q15_t)0x789e, (q15_t)0x789c, (q15_t)0x789a, (q15_t)0x7898, (q15_t)0x7896, + (q15_t)0x7894, (q15_t)0x7892, (q15_t)0x7890, (q15_t)0x788e, (q15_t)0x788b, (q15_t)0x7889, (q15_t)0x7887, (q15_t)0x7885, + (q15_t)0x7883, (q15_t)0x7881, (q15_t)0x787f, (q15_t)0x787d, (q15_t)0x787a, (q15_t)0x7878, (q15_t)0x7876, (q15_t)0x7874, + (q15_t)0x7872, (q15_t)0x7870, (q15_t)0x786e, (q15_t)0x786c, (q15_t)0x7869, (q15_t)0x7867, (q15_t)0x7865, (q15_t)0x7863, + (q15_t)0x7861, (q15_t)0x785f, (q15_t)0x785d, (q15_t)0x785b, (q15_t)0x7858, (q15_t)0x7856, (q15_t)0x7854, (q15_t)0x7852, + (q15_t)0x7850, (q15_t)0x784e, (q15_t)0x784c, (q15_t)0x7849, (q15_t)0x7847, (q15_t)0x7845, (q15_t)0x7843, (q15_t)0x7841, + (q15_t)0x783f, (q15_t)0x783c, (q15_t)0x783a, (q15_t)0x7838, (q15_t)0x7836, (q15_t)0x7834, (q15_t)0x7832, (q15_t)0x7830, + (q15_t)0x782d, (q15_t)0x782b, (q15_t)0x7829, (q15_t)0x7827, (q15_t)0x7825, (q15_t)0x7823, (q15_t)0x7820, (q15_t)0x781e, + (q15_t)0x781c, (q15_t)0x781a, (q15_t)0x7818, (q15_t)0x7816, (q15_t)0x7813, (q15_t)0x7811, (q15_t)0x780f, (q15_t)0x780d, + (q15_t)0x780b, (q15_t)0x7808, (q15_t)0x7806, (q15_t)0x7804, (q15_t)0x7802, (q15_t)0x7800, (q15_t)0x77fe, (q15_t)0x77fb, + (q15_t)0x77f9, (q15_t)0x77f7, (q15_t)0x77f5, (q15_t)0x77f3, (q15_t)0x77f0, (q15_t)0x77ee, (q15_t)0x77ec, (q15_t)0x77ea, + (q15_t)0x77e8, (q15_t)0x77e5, (q15_t)0x77e3, (q15_t)0x77e1, (q15_t)0x77df, (q15_t)0x77dd, (q15_t)0x77da, (q15_t)0x77d8, + (q15_t)0x77d6, (q15_t)0x77d4, (q15_t)0x77d2, (q15_t)0x77cf, (q15_t)0x77cd, (q15_t)0x77cb, (q15_t)0x77c9, (q15_t)0x77c6, + (q15_t)0x77c4, (q15_t)0x77c2, (q15_t)0x77c0, (q15_t)0x77be, (q15_t)0x77bb, (q15_t)0x77b9, (q15_t)0x77b7, (q15_t)0x77b5, + (q15_t)0x77b2, (q15_t)0x77b0, (q15_t)0x77ae, (q15_t)0x77ac, (q15_t)0x77aa, (q15_t)0x77a7, (q15_t)0x77a5, (q15_t)0x77a3, + (q15_t)0x77a1, (q15_t)0x779e, (q15_t)0x779c, (q15_t)0x779a, (q15_t)0x7798, (q15_t)0x7795, (q15_t)0x7793, (q15_t)0x7791, + (q15_t)0x778f, (q15_t)0x778c, (q15_t)0x778a, (q15_t)0x7788, (q15_t)0x7786, (q15_t)0x7783, (q15_t)0x7781, (q15_t)0x777f, + (q15_t)0x777d, (q15_t)0x777a, (q15_t)0x7778, (q15_t)0x7776, (q15_t)0x7774, (q15_t)0x7771, (q15_t)0x776f, (q15_t)0x776d, + (q15_t)0x776b, (q15_t)0x7768, (q15_t)0x7766, (q15_t)0x7764, (q15_t)0x7762, (q15_t)0x775f, (q15_t)0x775d, (q15_t)0x775b, + (q15_t)0x7759, (q15_t)0x7756, (q15_t)0x7754, (q15_t)0x7752, (q15_t)0x774f, (q15_t)0x774d, (q15_t)0x774b, (q15_t)0x7749, + (q15_t)0x7746, (q15_t)0x7744, (q15_t)0x7742, (q15_t)0x773f, (q15_t)0x773d, (q15_t)0x773b, (q15_t)0x7739, (q15_t)0x7736, + (q15_t)0x7734, (q15_t)0x7732, (q15_t)0x772f, (q15_t)0x772d, (q15_t)0x772b, (q15_t)0x7729, (q15_t)0x7726, (q15_t)0x7724, + (q15_t)0x7722, (q15_t)0x771f, (q15_t)0x771d, (q15_t)0x771b, (q15_t)0x7719, (q15_t)0x7716, (q15_t)0x7714, (q15_t)0x7712, + (q15_t)0x770f, (q15_t)0x770d, (q15_t)0x770b, (q15_t)0x7708, (q15_t)0x7706, (q15_t)0x7704, (q15_t)0x7701, (q15_t)0x76ff, + (q15_t)0x76fd, (q15_t)0x76fa, (q15_t)0x76f8, (q15_t)0x76f6, (q15_t)0x76f4, (q15_t)0x76f1, (q15_t)0x76ef, (q15_t)0x76ed, + (q15_t)0x76ea, (q15_t)0x76e8, (q15_t)0x76e6, (q15_t)0x76e3, (q15_t)0x76e1, (q15_t)0x76df, (q15_t)0x76dc, (q15_t)0x76da, + (q15_t)0x76d8, (q15_t)0x76d5, (q15_t)0x76d3, (q15_t)0x76d1, (q15_t)0x76ce, (q15_t)0x76cc, (q15_t)0x76ca, (q15_t)0x76c7, + (q15_t)0x76c5, (q15_t)0x76c3, (q15_t)0x76c0, (q15_t)0x76be, (q15_t)0x76bc, (q15_t)0x76b9, (q15_t)0x76b7, (q15_t)0x76b4, + (q15_t)0x76b2, (q15_t)0x76b0, (q15_t)0x76ad, (q15_t)0x76ab, (q15_t)0x76a9, (q15_t)0x76a6, (q15_t)0x76a4, (q15_t)0x76a2, + (q15_t)0x769f, (q15_t)0x769d, (q15_t)0x769b, (q15_t)0x7698, (q15_t)0x7696, (q15_t)0x7693, (q15_t)0x7691, (q15_t)0x768f, + (q15_t)0x768c, (q15_t)0x768a, (q15_t)0x7688, (q15_t)0x7685, (q15_t)0x7683, (q15_t)0x7681, (q15_t)0x767e, (q15_t)0x767c, + (q15_t)0x7679, (q15_t)0x7677, (q15_t)0x7675, (q15_t)0x7672, (q15_t)0x7670, (q15_t)0x766d, (q15_t)0x766b, (q15_t)0x7669, + (q15_t)0x7666, (q15_t)0x7664, (q15_t)0x7662, (q15_t)0x765f, (q15_t)0x765d, (q15_t)0x765a, (q15_t)0x7658, (q15_t)0x7656, + (q15_t)0x7653, (q15_t)0x7651, (q15_t)0x764e, (q15_t)0x764c, (q15_t)0x764a, (q15_t)0x7647, (q15_t)0x7645, (q15_t)0x7642, + (q15_t)0x7640, (q15_t)0x763e, (q15_t)0x763b, (q15_t)0x7639, (q15_t)0x7636, (q15_t)0x7634, (q15_t)0x7632, (q15_t)0x762f, + (q15_t)0x762d, (q15_t)0x762a, (q15_t)0x7628, (q15_t)0x7625, (q15_t)0x7623, (q15_t)0x7621, (q15_t)0x761e, (q15_t)0x761c, + (q15_t)0x7619, (q15_t)0x7617, (q15_t)0x7615, (q15_t)0x7612, (q15_t)0x7610, (q15_t)0x760d, (q15_t)0x760b, (q15_t)0x7608, + (q15_t)0x7606, (q15_t)0x7604, (q15_t)0x7601, (q15_t)0x75ff, (q15_t)0x75fc, (q15_t)0x75fa, (q15_t)0x75f7, (q15_t)0x75f5, + (q15_t)0x75f2, (q15_t)0x75f0, (q15_t)0x75ee, (q15_t)0x75eb, (q15_t)0x75e9, (q15_t)0x75e6, (q15_t)0x75e4, (q15_t)0x75e1, + (q15_t)0x75df, (q15_t)0x75dc, (q15_t)0x75da, (q15_t)0x75d8, (q15_t)0x75d5, (q15_t)0x75d3, (q15_t)0x75d0, (q15_t)0x75ce, + (q15_t)0x75cb, (q15_t)0x75c9, (q15_t)0x75c6, (q15_t)0x75c4, (q15_t)0x75c1, (q15_t)0x75bf, (q15_t)0x75bc, (q15_t)0x75ba, + (q15_t)0x75b8, (q15_t)0x75b5, (q15_t)0x75b3, (q15_t)0x75b0, (q15_t)0x75ae, (q15_t)0x75ab, (q15_t)0x75a9, (q15_t)0x75a6, + (q15_t)0x75a4, (q15_t)0x75a1, (q15_t)0x759f, (q15_t)0x759c, (q15_t)0x759a, (q15_t)0x7597, (q15_t)0x7595, (q15_t)0x7592, + (q15_t)0x7590, (q15_t)0x758d, (q15_t)0x758b, (q15_t)0x7588, (q15_t)0x7586, (q15_t)0x7584, (q15_t)0x7581, (q15_t)0x757f, + (q15_t)0x757c, (q15_t)0x757a, (q15_t)0x7577, (q15_t)0x7575, (q15_t)0x7572, (q15_t)0x7570, (q15_t)0x756d, (q15_t)0x756b, + (q15_t)0x7568, (q15_t)0x7566, (q15_t)0x7563, (q15_t)0x7561, (q15_t)0x755e, (q15_t)0x755c, (q15_t)0x7559, (q15_t)0x7556, + (q15_t)0x7554, (q15_t)0x7551, (q15_t)0x754f, (q15_t)0x754c, (q15_t)0x754a, (q15_t)0x7547, (q15_t)0x7545, (q15_t)0x7542, + (q15_t)0x7540, (q15_t)0x753d, (q15_t)0x753b, (q15_t)0x7538, (q15_t)0x7536, (q15_t)0x7533, (q15_t)0x7531, (q15_t)0x752e, + (q15_t)0x752c, (q15_t)0x7529, (q15_t)0x7527, (q15_t)0x7524, (q15_t)0x7522, (q15_t)0x751f, (q15_t)0x751c, (q15_t)0x751a, + (q15_t)0x7517, (q15_t)0x7515, (q15_t)0x7512, (q15_t)0x7510, (q15_t)0x750d, (q15_t)0x750b, (q15_t)0x7508, (q15_t)0x7506, + (q15_t)0x7503, (q15_t)0x7501, (q15_t)0x74fe, (q15_t)0x74fb, (q15_t)0x74f9, (q15_t)0x74f6, (q15_t)0x74f4, (q15_t)0x74f1, + (q15_t)0x74ef, (q15_t)0x74ec, (q15_t)0x74ea, (q15_t)0x74e7, (q15_t)0x74e4, (q15_t)0x74e2, (q15_t)0x74df, (q15_t)0x74dd, + (q15_t)0x74da, (q15_t)0x74d8, (q15_t)0x74d5, (q15_t)0x74d2, (q15_t)0x74d0, (q15_t)0x74cd, (q15_t)0x74cb, (q15_t)0x74c8, + (q15_t)0x74c6, (q15_t)0x74c3, (q15_t)0x74c0, (q15_t)0x74be, (q15_t)0x74bb, (q15_t)0x74b9, (q15_t)0x74b6, (q15_t)0x74b4, + (q15_t)0x74b1, (q15_t)0x74ae, (q15_t)0x74ac, (q15_t)0x74a9, (q15_t)0x74a7, (q15_t)0x74a4, (q15_t)0x74a1, (q15_t)0x749f, + (q15_t)0x749c, (q15_t)0x749a, (q15_t)0x7497, (q15_t)0x7495, (q15_t)0x7492, (q15_t)0x748f, (q15_t)0x748d, (q15_t)0x748a, + (q15_t)0x7488, (q15_t)0x7485, (q15_t)0x7482, (q15_t)0x7480, (q15_t)0x747d, (q15_t)0x747b, (q15_t)0x7478, (q15_t)0x7475, + (q15_t)0x7473, (q15_t)0x7470, (q15_t)0x746d, (q15_t)0x746b, (q15_t)0x7468, (q15_t)0x7466, (q15_t)0x7463, (q15_t)0x7460, + (q15_t)0x745e, (q15_t)0x745b, (q15_t)0x7459, (q15_t)0x7456, (q15_t)0x7453, (q15_t)0x7451, (q15_t)0x744e, (q15_t)0x744b, + (q15_t)0x7449, (q15_t)0x7446, (q15_t)0x7444, (q15_t)0x7441, (q15_t)0x743e, (q15_t)0x743c, (q15_t)0x7439, (q15_t)0x7436, + (q15_t)0x7434, (q15_t)0x7431, (q15_t)0x742f, (q15_t)0x742c, (q15_t)0x7429, (q15_t)0x7427, (q15_t)0x7424, (q15_t)0x7421, + (q15_t)0x741f, (q15_t)0x741c, (q15_t)0x7419, (q15_t)0x7417, (q15_t)0x7414, (q15_t)0x7411, (q15_t)0x740f, (q15_t)0x740c, + (q15_t)0x740a, (q15_t)0x7407, (q15_t)0x7404, (q15_t)0x7402, (q15_t)0x73ff, (q15_t)0x73fc, (q15_t)0x73fa, (q15_t)0x73f7, + (q15_t)0x73f4, (q15_t)0x73f2, (q15_t)0x73ef, (q15_t)0x73ec, (q15_t)0x73ea, (q15_t)0x73e7, (q15_t)0x73e4, (q15_t)0x73e2, + (q15_t)0x73df, (q15_t)0x73dc, (q15_t)0x73da, (q15_t)0x73d7, (q15_t)0x73d4, (q15_t)0x73d2, (q15_t)0x73cf, (q15_t)0x73cc, + (q15_t)0x73ca, (q15_t)0x73c7, (q15_t)0x73c4, (q15_t)0x73c1, (q15_t)0x73bf, (q15_t)0x73bc, (q15_t)0x73b9, (q15_t)0x73b7, + (q15_t)0x73b4, (q15_t)0x73b1, (q15_t)0x73af, (q15_t)0x73ac, (q15_t)0x73a9, (q15_t)0x73a7, (q15_t)0x73a4, (q15_t)0x73a1, + (q15_t)0x739f, (q15_t)0x739c, (q15_t)0x7399, (q15_t)0x7396, (q15_t)0x7394, (q15_t)0x7391, (q15_t)0x738e, (q15_t)0x738c, + (q15_t)0x7389, (q15_t)0x7386, (q15_t)0x7384, (q15_t)0x7381, (q15_t)0x737e, (q15_t)0x737b, (q15_t)0x7379, (q15_t)0x7376, + (q15_t)0x7373, (q15_t)0x7371, (q15_t)0x736e, (q15_t)0x736b, (q15_t)0x7368, (q15_t)0x7366, (q15_t)0x7363, (q15_t)0x7360, + (q15_t)0x735e, (q15_t)0x735b, (q15_t)0x7358, (q15_t)0x7355, (q15_t)0x7353, (q15_t)0x7350, (q15_t)0x734d, (q15_t)0x734a, + (q15_t)0x7348, (q15_t)0x7345, (q15_t)0x7342, (q15_t)0x7340, (q15_t)0x733d, (q15_t)0x733a, (q15_t)0x7337, (q15_t)0x7335, + (q15_t)0x7332, (q15_t)0x732f, (q15_t)0x732c, (q15_t)0x732a, (q15_t)0x7327, (q15_t)0x7324, (q15_t)0x7321, (q15_t)0x731f, + (q15_t)0x731c, (q15_t)0x7319, (q15_t)0x7316, (q15_t)0x7314, (q15_t)0x7311, (q15_t)0x730e, (q15_t)0x730b, (q15_t)0x7309, + (q15_t)0x7306, (q15_t)0x7303, (q15_t)0x7300, (q15_t)0x72fe, (q15_t)0x72fb, (q15_t)0x72f8, (q15_t)0x72f5, (q15_t)0x72f3, + (q15_t)0x72f0, (q15_t)0x72ed, (q15_t)0x72ea, (q15_t)0x72e8, (q15_t)0x72e5, (q15_t)0x72e2, (q15_t)0x72df, (q15_t)0x72dc, + (q15_t)0x72da, (q15_t)0x72d7, (q15_t)0x72d4, (q15_t)0x72d1, (q15_t)0x72cf, (q15_t)0x72cc, (q15_t)0x72c9, (q15_t)0x72c6, + (q15_t)0x72c3, (q15_t)0x72c1, (q15_t)0x72be, (q15_t)0x72bb, (q15_t)0x72b8, (q15_t)0x72b5, (q15_t)0x72b3, (q15_t)0x72b0, + (q15_t)0x72ad, (q15_t)0x72aa, (q15_t)0x72a8, (q15_t)0x72a5, (q15_t)0x72a2, (q15_t)0x729f, (q15_t)0x729c, (q15_t)0x729a, + (q15_t)0x7297, (q15_t)0x7294, (q15_t)0x7291, (q15_t)0x728e, (q15_t)0x728c, (q15_t)0x7289, (q15_t)0x7286, (q15_t)0x7283, + (q15_t)0x7280, (q15_t)0x727e, (q15_t)0x727b, (q15_t)0x7278, (q15_t)0x7275, (q15_t)0x7272, (q15_t)0x726f, (q15_t)0x726d, + (q15_t)0x726a, (q15_t)0x7267, (q15_t)0x7264, (q15_t)0x7261, (q15_t)0x725f, (q15_t)0x725c, (q15_t)0x7259, (q15_t)0x7256, + (q15_t)0x7253, (q15_t)0x7250, (q15_t)0x724e, (q15_t)0x724b, (q15_t)0x7248, (q15_t)0x7245, (q15_t)0x7242, (q15_t)0x723f, + (q15_t)0x723d, (q15_t)0x723a, (q15_t)0x7237, (q15_t)0x7234, (q15_t)0x7231, (q15_t)0x722e, (q15_t)0x722c, (q15_t)0x7229, + (q15_t)0x7226, (q15_t)0x7223, (q15_t)0x7220, (q15_t)0x721d, (q15_t)0x721b, (q15_t)0x7218, (q15_t)0x7215, (q15_t)0x7212, + (q15_t)0x720f, (q15_t)0x720c, (q15_t)0x7209, (q15_t)0x7207, (q15_t)0x7204, (q15_t)0x7201, (q15_t)0x71fe, (q15_t)0x71fb, + (q15_t)0x71f8, (q15_t)0x71f5, (q15_t)0x71f3, (q15_t)0x71f0, (q15_t)0x71ed, (q15_t)0x71ea, (q15_t)0x71e7, (q15_t)0x71e4, + (q15_t)0x71e1, (q15_t)0x71df, (q15_t)0x71dc, (q15_t)0x71d9, (q15_t)0x71d6, (q15_t)0x71d3, (q15_t)0x71d0, (q15_t)0x71cd, + (q15_t)0x71ca, (q15_t)0x71c8, (q15_t)0x71c5, (q15_t)0x71c2, (q15_t)0x71bf, (q15_t)0x71bc, (q15_t)0x71b9, (q15_t)0x71b6, + (q15_t)0x71b3, (q15_t)0x71b0, (q15_t)0x71ae, (q15_t)0x71ab, (q15_t)0x71a8, (q15_t)0x71a5, (q15_t)0x71a2, (q15_t)0x719f, + (q15_t)0x719c, (q15_t)0x7199, (q15_t)0x7196, (q15_t)0x7194, (q15_t)0x7191, (q15_t)0x718e, (q15_t)0x718b, (q15_t)0x7188, + (q15_t)0x7185, (q15_t)0x7182, (q15_t)0x717f, (q15_t)0x717c, (q15_t)0x7179, (q15_t)0x7177, (q15_t)0x7174, (q15_t)0x7171, + (q15_t)0x716e, (q15_t)0x716b, (q15_t)0x7168, (q15_t)0x7165, (q15_t)0x7162, (q15_t)0x715f, (q15_t)0x715c, (q15_t)0x7159, + (q15_t)0x7156, (q15_t)0x7154, (q15_t)0x7151, (q15_t)0x714e, (q15_t)0x714b, (q15_t)0x7148, (q15_t)0x7145, (q15_t)0x7142, + (q15_t)0x713f, (q15_t)0x713c, (q15_t)0x7139, (q15_t)0x7136, (q15_t)0x7133, (q15_t)0x7130, (q15_t)0x712d, (q15_t)0x712b, + (q15_t)0x7128, (q15_t)0x7125, (q15_t)0x7122, (q15_t)0x711f, (q15_t)0x711c, (q15_t)0x7119, (q15_t)0x7116, (q15_t)0x7113, + (q15_t)0x7110, (q15_t)0x710d, (q15_t)0x710a, (q15_t)0x7107, (q15_t)0x7104, (q15_t)0x7101, (q15_t)0x70fe, (q15_t)0x70fb, + (q15_t)0x70f8, (q15_t)0x70f6, (q15_t)0x70f3, (q15_t)0x70f0, (q15_t)0x70ed, (q15_t)0x70ea, (q15_t)0x70e7, (q15_t)0x70e4, + (q15_t)0x70e1, (q15_t)0x70de, (q15_t)0x70db, (q15_t)0x70d8, (q15_t)0x70d5, (q15_t)0x70d2, (q15_t)0x70cf, (q15_t)0x70cc, + (q15_t)0x70c9, (q15_t)0x70c6, (q15_t)0x70c3, (q15_t)0x70c0, (q15_t)0x70bd, (q15_t)0x70ba, (q15_t)0x70b7, (q15_t)0x70b4, + (q15_t)0x70b1, (q15_t)0x70ae, (q15_t)0x70ab, (q15_t)0x70a8, (q15_t)0x70a5, (q15_t)0x70a2, (q15_t)0x709f, (q15_t)0x709c, + (q15_t)0x7099, (q15_t)0x7096, (q15_t)0x7093, (q15_t)0x7090, (q15_t)0x708d, (q15_t)0x708a, (q15_t)0x7087, (q15_t)0x7084, + (q15_t)0x7081, (q15_t)0x707e, (q15_t)0x707b, (q15_t)0x7078, (q15_t)0x7075, (q15_t)0x7072, (q15_t)0x706f, (q15_t)0x706c, + (q15_t)0x7069, (q15_t)0x7066, (q15_t)0x7063, (q15_t)0x7060, (q15_t)0x705d, (q15_t)0x705a, (q15_t)0x7057, (q15_t)0x7054, + (q15_t)0x7051, (q15_t)0x704e, (q15_t)0x704b, (q15_t)0x7048, (q15_t)0x7045, (q15_t)0x7042, (q15_t)0x703f, (q15_t)0x703c, + (q15_t)0x7039, (q15_t)0x7036, (q15_t)0x7033, (q15_t)0x7030, (q15_t)0x702d, (q15_t)0x702a, (q15_t)0x7027, (q15_t)0x7024, + (q15_t)0x7021, (q15_t)0x701e, (q15_t)0x701b, (q15_t)0x7018, (q15_t)0x7015, (q15_t)0x7012, (q15_t)0x700f, (q15_t)0x700c, + (q15_t)0x7009, (q15_t)0x7006, (q15_t)0x7003, (q15_t)0x7000, (q15_t)0x6ffd, (q15_t)0x6ffa, (q15_t)0x6ff7, (q15_t)0x6ff3, + (q15_t)0x6ff0, (q15_t)0x6fed, (q15_t)0x6fea, (q15_t)0x6fe7, (q15_t)0x6fe4, (q15_t)0x6fe1, (q15_t)0x6fde, (q15_t)0x6fdb, + (q15_t)0x6fd8, (q15_t)0x6fd5, (q15_t)0x6fd2, (q15_t)0x6fcf, (q15_t)0x6fcc, (q15_t)0x6fc9, (q15_t)0x6fc6, (q15_t)0x6fc3, + (q15_t)0x6fc0, (q15_t)0x6fbc, (q15_t)0x6fb9, (q15_t)0x6fb6, (q15_t)0x6fb3, (q15_t)0x6fb0, (q15_t)0x6fad, (q15_t)0x6faa, + (q15_t)0x6fa7, (q15_t)0x6fa4, (q15_t)0x6fa1, (q15_t)0x6f9e, (q15_t)0x6f9b, (q15_t)0x6f98, (q15_t)0x6f95, (q15_t)0x6f91, + (q15_t)0x6f8e, (q15_t)0x6f8b, (q15_t)0x6f88, (q15_t)0x6f85, (q15_t)0x6f82, (q15_t)0x6f7f, (q15_t)0x6f7c, (q15_t)0x6f79, + (q15_t)0x6f76, (q15_t)0x6f73, (q15_t)0x6f70, (q15_t)0x6f6c, (q15_t)0x6f69, (q15_t)0x6f66, (q15_t)0x6f63, (q15_t)0x6f60, + (q15_t)0x6f5d, (q15_t)0x6f5a, (q15_t)0x6f57, (q15_t)0x6f54, (q15_t)0x6f51, (q15_t)0x6f4d, (q15_t)0x6f4a, (q15_t)0x6f47, + (q15_t)0x6f44, (q15_t)0x6f41, (q15_t)0x6f3e, (q15_t)0x6f3b, (q15_t)0x6f38, (q15_t)0x6f35, (q15_t)0x6f31, (q15_t)0x6f2e, + (q15_t)0x6f2b, (q15_t)0x6f28, (q15_t)0x6f25, (q15_t)0x6f22, (q15_t)0x6f1f, (q15_t)0x6f1c, (q15_t)0x6f19, (q15_t)0x6f15, + (q15_t)0x6f12, (q15_t)0x6f0f, (q15_t)0x6f0c, (q15_t)0x6f09, (q15_t)0x6f06, (q15_t)0x6f03, (q15_t)0x6f00, (q15_t)0x6efc, + (q15_t)0x6ef9, (q15_t)0x6ef6, (q15_t)0x6ef3, (q15_t)0x6ef0, (q15_t)0x6eed, (q15_t)0x6eea, (q15_t)0x6ee7, (q15_t)0x6ee3, + (q15_t)0x6ee0, (q15_t)0x6edd, (q15_t)0x6eda, (q15_t)0x6ed7, (q15_t)0x6ed4, (q15_t)0x6ed1, (q15_t)0x6ecd, (q15_t)0x6eca, + (q15_t)0x6ec7, (q15_t)0x6ec4, (q15_t)0x6ec1, (q15_t)0x6ebe, (q15_t)0x6eba, (q15_t)0x6eb7, (q15_t)0x6eb4, (q15_t)0x6eb1, + (q15_t)0x6eae, (q15_t)0x6eab, (q15_t)0x6ea8, (q15_t)0x6ea4, (q15_t)0x6ea1, (q15_t)0x6e9e, (q15_t)0x6e9b, (q15_t)0x6e98, + (q15_t)0x6e95, (q15_t)0x6e91, (q15_t)0x6e8e, (q15_t)0x6e8b, (q15_t)0x6e88, (q15_t)0x6e85, (q15_t)0x6e82, (q15_t)0x6e7e, + (q15_t)0x6e7b, (q15_t)0x6e78, (q15_t)0x6e75, (q15_t)0x6e72, (q15_t)0x6e6f, (q15_t)0x6e6b, (q15_t)0x6e68, (q15_t)0x6e65, + (q15_t)0x6e62, (q15_t)0x6e5f, (q15_t)0x6e5b, (q15_t)0x6e58, (q15_t)0x6e55, (q15_t)0x6e52, (q15_t)0x6e4f, (q15_t)0x6e4c, + (q15_t)0x6e48, (q15_t)0x6e45, (q15_t)0x6e42, (q15_t)0x6e3f, (q15_t)0x6e3c, (q15_t)0x6e38, (q15_t)0x6e35, (q15_t)0x6e32, + (q15_t)0x6e2f, (q15_t)0x6e2c, (q15_t)0x6e28, (q15_t)0x6e25, (q15_t)0x6e22, (q15_t)0x6e1f, (q15_t)0x6e1c, (q15_t)0x6e18, + (q15_t)0x6e15, (q15_t)0x6e12, (q15_t)0x6e0f, (q15_t)0x6e0c, (q15_t)0x6e08, (q15_t)0x6e05, (q15_t)0x6e02, (q15_t)0x6dff, + (q15_t)0x6dfb, (q15_t)0x6df8, (q15_t)0x6df5, (q15_t)0x6df2, (q15_t)0x6def, (q15_t)0x6deb, (q15_t)0x6de8, (q15_t)0x6de5, + (q15_t)0x6de2, (q15_t)0x6ddf, (q15_t)0x6ddb, (q15_t)0x6dd8, (q15_t)0x6dd5, (q15_t)0x6dd2, (q15_t)0x6dce, (q15_t)0x6dcb, + (q15_t)0x6dc8, (q15_t)0x6dc5, (q15_t)0x6dc1, (q15_t)0x6dbe, (q15_t)0x6dbb, (q15_t)0x6db8, (q15_t)0x6db5, (q15_t)0x6db1, + (q15_t)0x6dae, (q15_t)0x6dab, (q15_t)0x6da8, (q15_t)0x6da4, (q15_t)0x6da1, (q15_t)0x6d9e, (q15_t)0x6d9b, (q15_t)0x6d97, + (q15_t)0x6d94, (q15_t)0x6d91, (q15_t)0x6d8e, (q15_t)0x6d8a, (q15_t)0x6d87, (q15_t)0x6d84, (q15_t)0x6d81, (q15_t)0x6d7d, + (q15_t)0x6d7a, (q15_t)0x6d77, (q15_t)0x6d74, (q15_t)0x6d70, (q15_t)0x6d6d, (q15_t)0x6d6a, (q15_t)0x6d67, (q15_t)0x6d63, + (q15_t)0x6d60, (q15_t)0x6d5d, (q15_t)0x6d59, (q15_t)0x6d56, (q15_t)0x6d53, (q15_t)0x6d50, (q15_t)0x6d4c, (q15_t)0x6d49, + (q15_t)0x6d46, (q15_t)0x6d43, (q15_t)0x6d3f, (q15_t)0x6d3c, (q15_t)0x6d39, (q15_t)0x6d36, (q15_t)0x6d32, (q15_t)0x6d2f, + (q15_t)0x6d2c, (q15_t)0x6d28, (q15_t)0x6d25, (q15_t)0x6d22, (q15_t)0x6d1f, (q15_t)0x6d1b, (q15_t)0x6d18, (q15_t)0x6d15, + (q15_t)0x6d11, (q15_t)0x6d0e, (q15_t)0x6d0b, (q15_t)0x6d08, (q15_t)0x6d04, (q15_t)0x6d01, (q15_t)0x6cfe, (q15_t)0x6cfa, + (q15_t)0x6cf7, (q15_t)0x6cf4, (q15_t)0x6cf0, (q15_t)0x6ced, (q15_t)0x6cea, (q15_t)0x6ce7, (q15_t)0x6ce3, (q15_t)0x6ce0, + (q15_t)0x6cdd, (q15_t)0x6cd9, (q15_t)0x6cd6, (q15_t)0x6cd3, (q15_t)0x6ccf, (q15_t)0x6ccc, (q15_t)0x6cc9, (q15_t)0x6cc5, + (q15_t)0x6cc2, (q15_t)0x6cbf, (q15_t)0x6cbc, (q15_t)0x6cb8, (q15_t)0x6cb5, (q15_t)0x6cb2, (q15_t)0x6cae, (q15_t)0x6cab, + (q15_t)0x6ca8, (q15_t)0x6ca4, (q15_t)0x6ca1, (q15_t)0x6c9e, (q15_t)0x6c9a, (q15_t)0x6c97, (q15_t)0x6c94, (q15_t)0x6c90, + (q15_t)0x6c8d, (q15_t)0x6c8a, (q15_t)0x6c86, (q15_t)0x6c83, (q15_t)0x6c80, (q15_t)0x6c7c, (q15_t)0x6c79, (q15_t)0x6c76, + (q15_t)0x6c72, (q15_t)0x6c6f, (q15_t)0x6c6c, (q15_t)0x6c68, (q15_t)0x6c65, (q15_t)0x6c62, (q15_t)0x6c5e, (q15_t)0x6c5b, + (q15_t)0x6c58, (q15_t)0x6c54, (q15_t)0x6c51, (q15_t)0x6c4e, (q15_t)0x6c4a, (q15_t)0x6c47, (q15_t)0x6c44, (q15_t)0x6c40, + (q15_t)0x6c3d, (q15_t)0x6c39, (q15_t)0x6c36, (q15_t)0x6c33, (q15_t)0x6c2f, (q15_t)0x6c2c, (q15_t)0x6c29, (q15_t)0x6c25, + (q15_t)0x6c22, (q15_t)0x6c1f, (q15_t)0x6c1b, (q15_t)0x6c18, (q15_t)0x6c15, (q15_t)0x6c11, (q15_t)0x6c0e, (q15_t)0x6c0a, + (q15_t)0x6c07, (q15_t)0x6c04, (q15_t)0x6c00, (q15_t)0x6bfd, (q15_t)0x6bfa, (q15_t)0x6bf6, (q15_t)0x6bf3, (q15_t)0x6bef, + (q15_t)0x6bec, (q15_t)0x6be9, (q15_t)0x6be5, (q15_t)0x6be2, (q15_t)0x6bdf, (q15_t)0x6bdb, (q15_t)0x6bd8, (q15_t)0x6bd4, + (q15_t)0x6bd1, (q15_t)0x6bce, (q15_t)0x6bca, (q15_t)0x6bc7, (q15_t)0x6bc3, (q15_t)0x6bc0, (q15_t)0x6bbd, (q15_t)0x6bb9, + (q15_t)0x6bb6, (q15_t)0x6bb2, (q15_t)0x6baf, (q15_t)0x6bac, (q15_t)0x6ba8, (q15_t)0x6ba5, (q15_t)0x6ba1, (q15_t)0x6b9e, + (q15_t)0x6b9b, (q15_t)0x6b97, (q15_t)0x6b94, (q15_t)0x6b90, (q15_t)0x6b8d, (q15_t)0x6b8a, (q15_t)0x6b86, (q15_t)0x6b83, + (q15_t)0x6b7f, (q15_t)0x6b7c, (q15_t)0x6b79, (q15_t)0x6b75, (q15_t)0x6b72, (q15_t)0x6b6e, (q15_t)0x6b6b, (q15_t)0x6b68, + (q15_t)0x6b64, (q15_t)0x6b61, (q15_t)0x6b5d, (q15_t)0x6b5a, (q15_t)0x6b56, (q15_t)0x6b53, (q15_t)0x6b50, (q15_t)0x6b4c, + (q15_t)0x6b49, (q15_t)0x6b45, (q15_t)0x6b42, (q15_t)0x6b3e, (q15_t)0x6b3b, (q15_t)0x6b38, (q15_t)0x6b34, (q15_t)0x6b31, + (q15_t)0x6b2d, (q15_t)0x6b2a, (q15_t)0x6b26, (q15_t)0x6b23, (q15_t)0x6b20, (q15_t)0x6b1c, (q15_t)0x6b19, (q15_t)0x6b15, + (q15_t)0x6b12, (q15_t)0x6b0e, (q15_t)0x6b0b, (q15_t)0x6b07, (q15_t)0x6b04, (q15_t)0x6b01, (q15_t)0x6afd, (q15_t)0x6afa, + (q15_t)0x6af6, (q15_t)0x6af3, (q15_t)0x6aef, (q15_t)0x6aec, (q15_t)0x6ae8, (q15_t)0x6ae5, (q15_t)0x6ae1, (q15_t)0x6ade, + (q15_t)0x6adb, (q15_t)0x6ad7, (q15_t)0x6ad4, (q15_t)0x6ad0, (q15_t)0x6acd, (q15_t)0x6ac9, (q15_t)0x6ac6, (q15_t)0x6ac2, + (q15_t)0x6abf, (q15_t)0x6abb, (q15_t)0x6ab8, (q15_t)0x6ab4, (q15_t)0x6ab1, (q15_t)0x6aae, (q15_t)0x6aaa, (q15_t)0x6aa7, + (q15_t)0x6aa3, (q15_t)0x6aa0, (q15_t)0x6a9c, (q15_t)0x6a99, (q15_t)0x6a95, (q15_t)0x6a92, (q15_t)0x6a8e, (q15_t)0x6a8b, + (q15_t)0x6a87, (q15_t)0x6a84, (q15_t)0x6a80, (q15_t)0x6a7d, (q15_t)0x6a79, (q15_t)0x6a76, (q15_t)0x6a72, (q15_t)0x6a6f, + (q15_t)0x6a6b, (q15_t)0x6a68, (q15_t)0x6a64, (q15_t)0x6a61, (q15_t)0x6a5d, (q15_t)0x6a5a, (q15_t)0x6a56, (q15_t)0x6a53, + (q15_t)0x6a4f, (q15_t)0x6a4c, (q15_t)0x6a48, (q15_t)0x6a45, (q15_t)0x6a41, (q15_t)0x6a3e, (q15_t)0x6a3a, (q15_t)0x6a37, + (q15_t)0x6a33, (q15_t)0x6a30, (q15_t)0x6a2c, (q15_t)0x6a29, (q15_t)0x6a25, (q15_t)0x6a22, (q15_t)0x6a1e, (q15_t)0x6a1b, + (q15_t)0x6a17, (q15_t)0x6a14, (q15_t)0x6a10, (q15_t)0x6a0d, (q15_t)0x6a09, (q15_t)0x6a06, (q15_t)0x6a02, (q15_t)0x69ff, + (q15_t)0x69fb, (q15_t)0x69f8, (q15_t)0x69f4, (q15_t)0x69f1, (q15_t)0x69ed, (q15_t)0x69e9, (q15_t)0x69e6, (q15_t)0x69e2, + (q15_t)0x69df, (q15_t)0x69db, (q15_t)0x69d8, (q15_t)0x69d4, (q15_t)0x69d1, (q15_t)0x69cd, (q15_t)0x69ca, (q15_t)0x69c6, + (q15_t)0x69c3, (q15_t)0x69bf, (q15_t)0x69bc, (q15_t)0x69b8, (q15_t)0x69b4, (q15_t)0x69b1, (q15_t)0x69ad, (q15_t)0x69aa, + (q15_t)0x69a6, (q15_t)0x69a3, (q15_t)0x699f, (q15_t)0x699c, (q15_t)0x6998, (q15_t)0x6995, (q15_t)0x6991, (q15_t)0x698d, + (q15_t)0x698a, (q15_t)0x6986, (q15_t)0x6983, (q15_t)0x697f, (q15_t)0x697c, (q15_t)0x6978, (q15_t)0x6975, (q15_t)0x6971, + (q15_t)0x696d, (q15_t)0x696a, (q15_t)0x6966, (q15_t)0x6963, (q15_t)0x695f, (q15_t)0x695c, (q15_t)0x6958, (q15_t)0x6954, + (q15_t)0x6951, (q15_t)0x694d, (q15_t)0x694a, (q15_t)0x6946, (q15_t)0x6943, (q15_t)0x693f, (q15_t)0x693b, (q15_t)0x6938, + (q15_t)0x6934, (q15_t)0x6931, (q15_t)0x692d, (q15_t)0x692a, (q15_t)0x6926, (q15_t)0x6922, (q15_t)0x691f, (q15_t)0x691b, + (q15_t)0x6918, (q15_t)0x6914, (q15_t)0x6910, (q15_t)0x690d, (q15_t)0x6909, (q15_t)0x6906, (q15_t)0x6902, (q15_t)0x68fe, + (q15_t)0x68fb, (q15_t)0x68f7, (q15_t)0x68f4, (q15_t)0x68f0, (q15_t)0x68ec, (q15_t)0x68e9, (q15_t)0x68e5, (q15_t)0x68e2, + (q15_t)0x68de, (q15_t)0x68da, (q15_t)0x68d7, (q15_t)0x68d3, (q15_t)0x68d0, (q15_t)0x68cc, (q15_t)0x68c8, (q15_t)0x68c5, + (q15_t)0x68c1, (q15_t)0x68be, (q15_t)0x68ba, (q15_t)0x68b6, (q15_t)0x68b3, (q15_t)0x68af, (q15_t)0x68ac, (q15_t)0x68a8, + (q15_t)0x68a4, (q15_t)0x68a1, (q15_t)0x689d, (q15_t)0x6899, (q15_t)0x6896, (q15_t)0x6892, (q15_t)0x688f, (q15_t)0x688b, + (q15_t)0x6887, (q15_t)0x6884, (q15_t)0x6880, (q15_t)0x687c, (q15_t)0x6879, (q15_t)0x6875, (q15_t)0x6872, (q15_t)0x686e, + (q15_t)0x686a, (q15_t)0x6867, (q15_t)0x6863, (q15_t)0x685f, (q15_t)0x685c, (q15_t)0x6858, (q15_t)0x6854, (q15_t)0x6851, + (q15_t)0x684d, (q15_t)0x684a, (q15_t)0x6846, (q15_t)0x6842, (q15_t)0x683f, (q15_t)0x683b, (q15_t)0x6837, (q15_t)0x6834, + (q15_t)0x6830, (q15_t)0x682c, (q15_t)0x6829, (q15_t)0x6825, (q15_t)0x6821, (q15_t)0x681e, (q15_t)0x681a, (q15_t)0x6816, + (q15_t)0x6813, (q15_t)0x680f, (q15_t)0x680b, (q15_t)0x6808, (q15_t)0x6804, (q15_t)0x6800, (q15_t)0x67fd, (q15_t)0x67f9, + (q15_t)0x67f5, (q15_t)0x67f2, (q15_t)0x67ee, (q15_t)0x67ea, (q15_t)0x67e7, (q15_t)0x67e3, (q15_t)0x67df, (q15_t)0x67dc, + (q15_t)0x67d8, (q15_t)0x67d4, (q15_t)0x67d1, (q15_t)0x67cd, (q15_t)0x67c9, (q15_t)0x67c6, (q15_t)0x67c2, (q15_t)0x67be, + (q15_t)0x67bb, (q15_t)0x67b7, (q15_t)0x67b3, (q15_t)0x67b0, (q15_t)0x67ac, (q15_t)0x67a8, (q15_t)0x67a5, (q15_t)0x67a1, + (q15_t)0x679d, (q15_t)0x679a, (q15_t)0x6796, (q15_t)0x6792, (q15_t)0x678e, (q15_t)0x678b, (q15_t)0x6787, (q15_t)0x6783, + (q15_t)0x6780, (q15_t)0x677c, (q15_t)0x6778, (q15_t)0x6775, (q15_t)0x6771, (q15_t)0x676d, (q15_t)0x6769, (q15_t)0x6766, + (q15_t)0x6762, (q15_t)0x675e, (q15_t)0x675b, (q15_t)0x6757, (q15_t)0x6753, (q15_t)0x6750, (q15_t)0x674c, (q15_t)0x6748, + (q15_t)0x6744, (q15_t)0x6741, (q15_t)0x673d, (q15_t)0x6739, (q15_t)0x6736, (q15_t)0x6732, (q15_t)0x672e, (q15_t)0x672a, + (q15_t)0x6727, (q15_t)0x6723, (q15_t)0x671f, (q15_t)0x671c, (q15_t)0x6718, (q15_t)0x6714, (q15_t)0x6710, (q15_t)0x670d, + (q15_t)0x6709, (q15_t)0x6705, (q15_t)0x6701, (q15_t)0x66fe, (q15_t)0x66fa, (q15_t)0x66f6, (q15_t)0x66f3, (q15_t)0x66ef, + (q15_t)0x66eb, (q15_t)0x66e7, (q15_t)0x66e4, (q15_t)0x66e0, (q15_t)0x66dc, (q15_t)0x66d8, (q15_t)0x66d5, (q15_t)0x66d1, + (q15_t)0x66cd, (q15_t)0x66c9, (q15_t)0x66c6, (q15_t)0x66c2, (q15_t)0x66be, (q15_t)0x66ba, (q15_t)0x66b7, (q15_t)0x66b3, + (q15_t)0x66af, (q15_t)0x66ab, (q15_t)0x66a8, (q15_t)0x66a4, (q15_t)0x66a0, (q15_t)0x669c, (q15_t)0x6699, (q15_t)0x6695, + (q15_t)0x6691, (q15_t)0x668d, (q15_t)0x668a, (q15_t)0x6686, (q15_t)0x6682, (q15_t)0x667e, (q15_t)0x667b, (q15_t)0x6677, + (q15_t)0x6673, (q15_t)0x666f, (q15_t)0x666b, (q15_t)0x6668, (q15_t)0x6664, (q15_t)0x6660, (q15_t)0x665c, (q15_t)0x6659, + (q15_t)0x6655, (q15_t)0x6651, (q15_t)0x664d, (q15_t)0x664a, (q15_t)0x6646, (q15_t)0x6642, (q15_t)0x663e, (q15_t)0x663a, + (q15_t)0x6637, (q15_t)0x6633, (q15_t)0x662f, (q15_t)0x662b, (q15_t)0x6627, (q15_t)0x6624, (q15_t)0x6620, (q15_t)0x661c, + (q15_t)0x6618, (q15_t)0x6615, (q15_t)0x6611, (q15_t)0x660d, (q15_t)0x6609, (q15_t)0x6605, (q15_t)0x6602, (q15_t)0x65fe, + (q15_t)0x65fa, (q15_t)0x65f6, (q15_t)0x65f2, (q15_t)0x65ef, (q15_t)0x65eb, (q15_t)0x65e7, (q15_t)0x65e3, (q15_t)0x65df, + (q15_t)0x65dc, (q15_t)0x65d8, (q15_t)0x65d4, (q15_t)0x65d0, (q15_t)0x65cc, (q15_t)0x65c9, (q15_t)0x65c5, (q15_t)0x65c1, + (q15_t)0x65bd, (q15_t)0x65b9, (q15_t)0x65b5, (q15_t)0x65b2, (q15_t)0x65ae, (q15_t)0x65aa, (q15_t)0x65a6, (q15_t)0x65a2, + (q15_t)0x659f, (q15_t)0x659b, (q15_t)0x6597, (q15_t)0x6593, (q15_t)0x658f, (q15_t)0x658b, (q15_t)0x6588, (q15_t)0x6584, + (q15_t)0x6580, (q15_t)0x657c, (q15_t)0x6578, (q15_t)0x6574, (q15_t)0x6571, (q15_t)0x656d, (q15_t)0x6569, (q15_t)0x6565, + (q15_t)0x6561, (q15_t)0x655d, (q15_t)0x655a, (q15_t)0x6556, (q15_t)0x6552, (q15_t)0x654e, (q15_t)0x654a, (q15_t)0x6546, + (q15_t)0x6543, (q15_t)0x653f, (q15_t)0x653b, (q15_t)0x6537, (q15_t)0x6533, (q15_t)0x652f, (q15_t)0x652c, (q15_t)0x6528, + (q15_t)0x6524, (q15_t)0x6520, (q15_t)0x651c, (q15_t)0x6518, (q15_t)0x6514, (q15_t)0x6511, (q15_t)0x650d, (q15_t)0x6509, + (q15_t)0x6505, (q15_t)0x6501, (q15_t)0x64fd, (q15_t)0x64f9, (q15_t)0x64f6, (q15_t)0x64f2, (q15_t)0x64ee, (q15_t)0x64ea, + (q15_t)0x64e6, (q15_t)0x64e2, (q15_t)0x64de, (q15_t)0x64db, (q15_t)0x64d7, (q15_t)0x64d3, (q15_t)0x64cf, (q15_t)0x64cb, + (q15_t)0x64c7, (q15_t)0x64c3, (q15_t)0x64bf, (q15_t)0x64bc, (q15_t)0x64b8, (q15_t)0x64b4, (q15_t)0x64b0, (q15_t)0x64ac, + (q15_t)0x64a8, (q15_t)0x64a4, (q15_t)0x64a0, (q15_t)0x649c, (q15_t)0x6499, (q15_t)0x6495, (q15_t)0x6491, (q15_t)0x648d, + (q15_t)0x6489, (q15_t)0x6485, (q15_t)0x6481, (q15_t)0x647d, (q15_t)0x6479, (q15_t)0x6476, (q15_t)0x6472, (q15_t)0x646e, + (q15_t)0x646a, (q15_t)0x6466, (q15_t)0x6462, (q15_t)0x645e, (q15_t)0x645a, (q15_t)0x6456, (q15_t)0x6453, (q15_t)0x644f, + (q15_t)0x644b, (q15_t)0x6447, (q15_t)0x6443, (q15_t)0x643f, (q15_t)0x643b, (q15_t)0x6437, (q15_t)0x6433, (q15_t)0x642f, + (q15_t)0x642b, (q15_t)0x6428, (q15_t)0x6424, (q15_t)0x6420, (q15_t)0x641c, (q15_t)0x6418, (q15_t)0x6414, (q15_t)0x6410, + (q15_t)0x640c, (q15_t)0x6408, (q15_t)0x6404, (q15_t)0x6400, (q15_t)0x63fc, (q15_t)0x63f9, (q15_t)0x63f5, (q15_t)0x63f1, + (q15_t)0x63ed, (q15_t)0x63e9, (q15_t)0x63e5, (q15_t)0x63e1, (q15_t)0x63dd, (q15_t)0x63d9, (q15_t)0x63d5, (q15_t)0x63d1, + (q15_t)0x63cd, (q15_t)0x63c9, (q15_t)0x63c5, (q15_t)0x63c1, (q15_t)0x63be, (q15_t)0x63ba, (q15_t)0x63b6, (q15_t)0x63b2, + (q15_t)0x63ae, (q15_t)0x63aa, (q15_t)0x63a6, (q15_t)0x63a2, (q15_t)0x639e, (q15_t)0x639a, (q15_t)0x6396, (q15_t)0x6392, + (q15_t)0x638e, (q15_t)0x638a, (q15_t)0x6386, (q15_t)0x6382, (q15_t)0x637e, (q15_t)0x637a, (q15_t)0x6377, (q15_t)0x6373, + (q15_t)0x636f, (q15_t)0x636b, (q15_t)0x6367, (q15_t)0x6363, (q15_t)0x635f, (q15_t)0x635b, (q15_t)0x6357, (q15_t)0x6353, + (q15_t)0x634f, (q15_t)0x634b, (q15_t)0x6347, (q15_t)0x6343, (q15_t)0x633f, (q15_t)0x633b, (q15_t)0x6337, (q15_t)0x6333, + (q15_t)0x632f, (q15_t)0x632b, (q15_t)0x6327, (q15_t)0x6323, (q15_t)0x631f, (q15_t)0x631b, (q15_t)0x6317, (q15_t)0x6313, + (q15_t)0x630f, (q15_t)0x630b, (q15_t)0x6307, (q15_t)0x6303, (q15_t)0x62ff, (q15_t)0x62fb, (q15_t)0x62f7, (q15_t)0x62f3, + (q15_t)0x62f0, (q15_t)0x62ec, (q15_t)0x62e8, (q15_t)0x62e4, (q15_t)0x62e0, (q15_t)0x62dc, (q15_t)0x62d8, (q15_t)0x62d4, + (q15_t)0x62d0, (q15_t)0x62cc, (q15_t)0x62c8, (q15_t)0x62c4, (q15_t)0x62c0, (q15_t)0x62bc, (q15_t)0x62b8, (q15_t)0x62b4, + (q15_t)0x62b0, (q15_t)0x62ac, (q15_t)0x62a8, (q15_t)0x62a4, (q15_t)0x62a0, (q15_t)0x629c, (q15_t)0x6298, (q15_t)0x6294, + (q15_t)0x6290, (q15_t)0x628c, (q15_t)0x6288, (q15_t)0x6284, (q15_t)0x6280, (q15_t)0x627c, (q15_t)0x6278, (q15_t)0x6273, + (q15_t)0x626f, (q15_t)0x626b, (q15_t)0x6267, (q15_t)0x6263, (q15_t)0x625f, (q15_t)0x625b, (q15_t)0x6257, (q15_t)0x6253, + (q15_t)0x624f, (q15_t)0x624b, (q15_t)0x6247, (q15_t)0x6243, (q15_t)0x623f, (q15_t)0x623b, (q15_t)0x6237, (q15_t)0x6233, + (q15_t)0x622f, (q15_t)0x622b, (q15_t)0x6227, (q15_t)0x6223, (q15_t)0x621f, (q15_t)0x621b, (q15_t)0x6217, (q15_t)0x6213, + (q15_t)0x620f, (q15_t)0x620b, (q15_t)0x6207, (q15_t)0x6203, (q15_t)0x61ff, (q15_t)0x61fb, (q15_t)0x61f7, (q15_t)0x61f3, + (q15_t)0x61ee, (q15_t)0x61ea, (q15_t)0x61e6, (q15_t)0x61e2, (q15_t)0x61de, (q15_t)0x61da, (q15_t)0x61d6, (q15_t)0x61d2, + (q15_t)0x61ce, (q15_t)0x61ca, (q15_t)0x61c6, (q15_t)0x61c2, (q15_t)0x61be, (q15_t)0x61ba, (q15_t)0x61b6, (q15_t)0x61b2, + (q15_t)0x61ae, (q15_t)0x61aa, (q15_t)0x61a6, (q15_t)0x61a1, (q15_t)0x619d, (q15_t)0x6199, (q15_t)0x6195, (q15_t)0x6191, + (q15_t)0x618d, (q15_t)0x6189, (q15_t)0x6185, (q15_t)0x6181, (q15_t)0x617d, (q15_t)0x6179, (q15_t)0x6175, (q15_t)0x6171, + (q15_t)0x616d, (q15_t)0x6168, (q15_t)0x6164, (q15_t)0x6160, (q15_t)0x615c, (q15_t)0x6158, (q15_t)0x6154, (q15_t)0x6150, + (q15_t)0x614c, (q15_t)0x6148, (q15_t)0x6144, (q15_t)0x6140, (q15_t)0x613c, (q15_t)0x6137, (q15_t)0x6133, (q15_t)0x612f, + (q15_t)0x612b, (q15_t)0x6127, (q15_t)0x6123, (q15_t)0x611f, (q15_t)0x611b, (q15_t)0x6117, (q15_t)0x6113, (q15_t)0x610f, + (q15_t)0x610a, (q15_t)0x6106, (q15_t)0x6102, (q15_t)0x60fe, (q15_t)0x60fa, (q15_t)0x60f6, (q15_t)0x60f2, (q15_t)0x60ee, + (q15_t)0x60ea, (q15_t)0x60e6, (q15_t)0x60e1, (q15_t)0x60dd, (q15_t)0x60d9, (q15_t)0x60d5, (q15_t)0x60d1, (q15_t)0x60cd, + (q15_t)0x60c9, (q15_t)0x60c5, (q15_t)0x60c1, (q15_t)0x60bc, (q15_t)0x60b8, (q15_t)0x60b4, (q15_t)0x60b0, (q15_t)0x60ac, + (q15_t)0x60a8, (q15_t)0x60a4, (q15_t)0x60a0, (q15_t)0x609c, (q15_t)0x6097, (q15_t)0x6093, (q15_t)0x608f, (q15_t)0x608b, + (q15_t)0x6087, (q15_t)0x6083, (q15_t)0x607f, (q15_t)0x607b, (q15_t)0x6076, (q15_t)0x6072, (q15_t)0x606e, (q15_t)0x606a, + (q15_t)0x6066, (q15_t)0x6062, (q15_t)0x605e, (q15_t)0x6059, (q15_t)0x6055, (q15_t)0x6051, (q15_t)0x604d, (q15_t)0x6049, + (q15_t)0x6045, (q15_t)0x6041, (q15_t)0x603c, (q15_t)0x6038, (q15_t)0x6034, (q15_t)0x6030, (q15_t)0x602c, (q15_t)0x6028, + (q15_t)0x6024, (q15_t)0x601f, (q15_t)0x601b, (q15_t)0x6017, (q15_t)0x6013, (q15_t)0x600f, (q15_t)0x600b, (q15_t)0x6007, + (q15_t)0x6002, (q15_t)0x5ffe, (q15_t)0x5ffa, (q15_t)0x5ff6, (q15_t)0x5ff2, (q15_t)0x5fee, (q15_t)0x5fe9, (q15_t)0x5fe5, + (q15_t)0x5fe1, (q15_t)0x5fdd, (q15_t)0x5fd9, (q15_t)0x5fd5, (q15_t)0x5fd0, (q15_t)0x5fcc, (q15_t)0x5fc8, (q15_t)0x5fc4, + (q15_t)0x5fc0, (q15_t)0x5fbc, (q15_t)0x5fb7, (q15_t)0x5fb3, (q15_t)0x5faf, (q15_t)0x5fab, (q15_t)0x5fa7, (q15_t)0x5fa3, + (q15_t)0x5f9e, (q15_t)0x5f9a, (q15_t)0x5f96, (q15_t)0x5f92, (q15_t)0x5f8e, (q15_t)0x5f8a, (q15_t)0x5f85, (q15_t)0x5f81, + (q15_t)0x5f7d, (q15_t)0x5f79, (q15_t)0x5f75, (q15_t)0x5f70, (q15_t)0x5f6c, (q15_t)0x5f68, (q15_t)0x5f64, (q15_t)0x5f60, + (q15_t)0x5f5b, (q15_t)0x5f57, (q15_t)0x5f53, (q15_t)0x5f4f, (q15_t)0x5f4b, (q15_t)0x5f46, (q15_t)0x5f42, (q15_t)0x5f3e, + (q15_t)0x5f3a, (q15_t)0x5f36, (q15_t)0x5f31, (q15_t)0x5f2d, (q15_t)0x5f29, (q15_t)0x5f25, (q15_t)0x5f21, (q15_t)0x5f1c, + (q15_t)0x5f18, (q15_t)0x5f14, (q15_t)0x5f10, (q15_t)0x5f0c, (q15_t)0x5f07, (q15_t)0x5f03, (q15_t)0x5eff, (q15_t)0x5efb, + (q15_t)0x5ef7, (q15_t)0x5ef2, (q15_t)0x5eee, (q15_t)0x5eea, (q15_t)0x5ee6, (q15_t)0x5ee2, (q15_t)0x5edd, (q15_t)0x5ed9, + (q15_t)0x5ed5, (q15_t)0x5ed1, (q15_t)0x5ecc, (q15_t)0x5ec8, (q15_t)0x5ec4, (q15_t)0x5ec0, (q15_t)0x5ebc, (q15_t)0x5eb7, + (q15_t)0x5eb3, (q15_t)0x5eaf, (q15_t)0x5eab, (q15_t)0x5ea6, (q15_t)0x5ea2, (q15_t)0x5e9e, (q15_t)0x5e9a, (q15_t)0x5e95, + (q15_t)0x5e91, (q15_t)0x5e8d, (q15_t)0x5e89, (q15_t)0x5e85, (q15_t)0x5e80, (q15_t)0x5e7c, (q15_t)0x5e78, (q15_t)0x5e74, + (q15_t)0x5e6f, (q15_t)0x5e6b, (q15_t)0x5e67, (q15_t)0x5e63, (q15_t)0x5e5e, (q15_t)0x5e5a, (q15_t)0x5e56, (q15_t)0x5e52, + (q15_t)0x5e4d, (q15_t)0x5e49, (q15_t)0x5e45, (q15_t)0x5e41, (q15_t)0x5e3c, (q15_t)0x5e38, (q15_t)0x5e34, (q15_t)0x5e30, + (q15_t)0x5e2b, (q15_t)0x5e27, (q15_t)0x5e23, (q15_t)0x5e1f, (q15_t)0x5e1a, (q15_t)0x5e16, (q15_t)0x5e12, (q15_t)0x5e0e, + (q15_t)0x5e09, (q15_t)0x5e05, (q15_t)0x5e01, (q15_t)0x5dfd, (q15_t)0x5df8, (q15_t)0x5df4, (q15_t)0x5df0, (q15_t)0x5deb, + (q15_t)0x5de7, (q15_t)0x5de3, (q15_t)0x5ddf, (q15_t)0x5dda, (q15_t)0x5dd6, (q15_t)0x5dd2, (q15_t)0x5dce, (q15_t)0x5dc9, + (q15_t)0x5dc5, (q15_t)0x5dc1, (q15_t)0x5dbc, (q15_t)0x5db8, (q15_t)0x5db4, (q15_t)0x5db0, (q15_t)0x5dab, (q15_t)0x5da7, + (q15_t)0x5da3, (q15_t)0x5d9e, (q15_t)0x5d9a, (q15_t)0x5d96, (q15_t)0x5d92, (q15_t)0x5d8d, (q15_t)0x5d89, (q15_t)0x5d85, + (q15_t)0x5d80, (q15_t)0x5d7c, (q15_t)0x5d78, (q15_t)0x5d74, (q15_t)0x5d6f, (q15_t)0x5d6b, (q15_t)0x5d67, (q15_t)0x5d62, + (q15_t)0x5d5e, (q15_t)0x5d5a, (q15_t)0x5d55, (q15_t)0x5d51, (q15_t)0x5d4d, (q15_t)0x5d49, (q15_t)0x5d44, (q15_t)0x5d40, + (q15_t)0x5d3c, (q15_t)0x5d37, (q15_t)0x5d33, (q15_t)0x5d2f, (q15_t)0x5d2a, (q15_t)0x5d26, (q15_t)0x5d22, (q15_t)0x5d1e, + (q15_t)0x5d19, (q15_t)0x5d15, (q15_t)0x5d11, (q15_t)0x5d0c, (q15_t)0x5d08, (q15_t)0x5d04, (q15_t)0x5cff, (q15_t)0x5cfb, + (q15_t)0x5cf7, (q15_t)0x5cf2, (q15_t)0x5cee, (q15_t)0x5cea, (q15_t)0x5ce5, (q15_t)0x5ce1, (q15_t)0x5cdd, (q15_t)0x5cd8, + (q15_t)0x5cd4, (q15_t)0x5cd0, (q15_t)0x5ccb, (q15_t)0x5cc7, (q15_t)0x5cc3, (q15_t)0x5cbe, (q15_t)0x5cba, (q15_t)0x5cb6, + (q15_t)0x5cb1, (q15_t)0x5cad, (q15_t)0x5ca9, (q15_t)0x5ca4, (q15_t)0x5ca0, (q15_t)0x5c9c, (q15_t)0x5c97, (q15_t)0x5c93, + (q15_t)0x5c8f, (q15_t)0x5c8a, (q15_t)0x5c86, (q15_t)0x5c82, (q15_t)0x5c7d, (q15_t)0x5c79, (q15_t)0x5c75, (q15_t)0x5c70, + (q15_t)0x5c6c, (q15_t)0x5c68, (q15_t)0x5c63, (q15_t)0x5c5f, (q15_t)0x5c5b, (q15_t)0x5c56, (q15_t)0x5c52, (q15_t)0x5c4e, + (q15_t)0x5c49, (q15_t)0x5c45, (q15_t)0x5c41, (q15_t)0x5c3c, (q15_t)0x5c38, (q15_t)0x5c33, (q15_t)0x5c2f, (q15_t)0x5c2b, + (q15_t)0x5c26, (q15_t)0x5c22, (q15_t)0x5c1e, (q15_t)0x5c19, (q15_t)0x5c15, (q15_t)0x5c11, (q15_t)0x5c0c, (q15_t)0x5c08, + (q15_t)0x5c03, (q15_t)0x5bff, (q15_t)0x5bfb, (q15_t)0x5bf6, (q15_t)0x5bf2, (q15_t)0x5bee, (q15_t)0x5be9, (q15_t)0x5be5, + (q15_t)0x5be0, (q15_t)0x5bdc, (q15_t)0x5bd8, (q15_t)0x5bd3, (q15_t)0x5bcf, (q15_t)0x5bcb, (q15_t)0x5bc6, (q15_t)0x5bc2, + (q15_t)0x5bbd, (q15_t)0x5bb9, (q15_t)0x5bb5, (q15_t)0x5bb0, (q15_t)0x5bac, (q15_t)0x5ba8, (q15_t)0x5ba3, (q15_t)0x5b9f, + (q15_t)0x5b9a, (q15_t)0x5b96, (q15_t)0x5b92, (q15_t)0x5b8d, (q15_t)0x5b89, (q15_t)0x5b84, (q15_t)0x5b80, (q15_t)0x5b7c, + (q15_t)0x5b77, (q15_t)0x5b73, (q15_t)0x5b6e, (q15_t)0x5b6a, (q15_t)0x5b66, (q15_t)0x5b61, (q15_t)0x5b5d, (q15_t)0x5b58, + (q15_t)0x5b54, (q15_t)0x5b50, (q15_t)0x5b4b, (q15_t)0x5b47, (q15_t)0x5b42, (q15_t)0x5b3e, (q15_t)0x5b3a, (q15_t)0x5b35, + (q15_t)0x5b31, (q15_t)0x5b2c, (q15_t)0x5b28, (q15_t)0x5b24, (q15_t)0x5b1f, (q15_t)0x5b1b, (q15_t)0x5b16, (q15_t)0x5b12, + (q15_t)0x5b0e, (q15_t)0x5b09, (q15_t)0x5b05, (q15_t)0x5b00, (q15_t)0x5afc, (q15_t)0x5af7, (q15_t)0x5af3, (q15_t)0x5aef, + (q15_t)0x5aea, (q15_t)0x5ae6, (q15_t)0x5ae1, (q15_t)0x5add, (q15_t)0x5ad8, (q15_t)0x5ad4, (q15_t)0x5ad0, (q15_t)0x5acb, + (q15_t)0x5ac7, (q15_t)0x5ac2, (q15_t)0x5abe, (q15_t)0x5ab9, (q15_t)0x5ab5, (q15_t)0x5ab1, (q15_t)0x5aac, (q15_t)0x5aa8, + (q15_t)0x5aa3, (q15_t)0x5a9f, (q15_t)0x5a9a, (q15_t)0x5a96, (q15_t)0x5a92, (q15_t)0x5a8d, (q15_t)0x5a89, (q15_t)0x5a84, + (q15_t)0x5a80, (q15_t)0x5a7b, (q15_t)0x5a77, (q15_t)0x5a72, (q15_t)0x5a6e, (q15_t)0x5a6a, (q15_t)0x5a65, (q15_t)0x5a61, + (q15_t)0x5a5c, (q15_t)0x5a58, (q15_t)0x5a53, (q15_t)0x5a4f, (q15_t)0x5a4a, (q15_t)0x5a46, (q15_t)0x5a41, (q15_t)0x5a3d, + (q15_t)0x5a39, (q15_t)0x5a34, (q15_t)0x5a30, (q15_t)0x5a2b, (q15_t)0x5a27, (q15_t)0x5a22, (q15_t)0x5a1e, (q15_t)0x5a19, + (q15_t)0x5a15, (q15_t)0x5a10, (q15_t)0x5a0c, (q15_t)0x5a07, (q15_t)0x5a03, (q15_t)0x59ff, (q15_t)0x59fa, (q15_t)0x59f6, + (q15_t)0x59f1, (q15_t)0x59ed, (q15_t)0x59e8, (q15_t)0x59e4, (q15_t)0x59df, (q15_t)0x59db, (q15_t)0x59d6, (q15_t)0x59d2, + (q15_t)0x59cd, (q15_t)0x59c9, (q15_t)0x59c4, (q15_t)0x59c0, (q15_t)0x59bb, (q15_t)0x59b7, (q15_t)0x59b2, (q15_t)0x59ae, + (q15_t)0x59a9, (q15_t)0x59a5, (q15_t)0x59a1, (q15_t)0x599c, (q15_t)0x5998, (q15_t)0x5993, (q15_t)0x598f, (q15_t)0x598a, + (q15_t)0x5986, (q15_t)0x5981, (q15_t)0x597d, (q15_t)0x5978, (q15_t)0x5974, (q15_t)0x596f, (q15_t)0x596b, (q15_t)0x5966, + (q15_t)0x5962, (q15_t)0x595d, (q15_t)0x5959, (q15_t)0x5954, (q15_t)0x5950, (q15_t)0x594b, (q15_t)0x5947, (q15_t)0x5942, + (q15_t)0x593e, (q15_t)0x5939, (q15_t)0x5935, (q15_t)0x5930, (q15_t)0x592c, (q15_t)0x5927, (q15_t)0x5923, (q15_t)0x591e, + (q15_t)0x591a, (q15_t)0x5915, (q15_t)0x5911, (q15_t)0x590c, (q15_t)0x5908, (q15_t)0x5903, (q15_t)0x58fe, (q15_t)0x58fa, + (q15_t)0x58f5, (q15_t)0x58f1, (q15_t)0x58ec, (q15_t)0x58e8, (q15_t)0x58e3, (q15_t)0x58df, (q15_t)0x58da, (q15_t)0x58d6, + (q15_t)0x58d1, (q15_t)0x58cd, (q15_t)0x58c8, (q15_t)0x58c4, (q15_t)0x58bf, (q15_t)0x58bb, (q15_t)0x58b6, (q15_t)0x58b2, + (q15_t)0x58ad, (q15_t)0x58a9, (q15_t)0x58a4, (q15_t)0x589f, (q15_t)0x589b, (q15_t)0x5896, (q15_t)0x5892, (q15_t)0x588d, + (q15_t)0x5889, (q15_t)0x5884, (q15_t)0x5880, (q15_t)0x587b, (q15_t)0x5877, (q15_t)0x5872, (q15_t)0x586e, (q15_t)0x5869, + (q15_t)0x5864, (q15_t)0x5860, (q15_t)0x585b, (q15_t)0x5857, (q15_t)0x5852, (q15_t)0x584e, (q15_t)0x5849, (q15_t)0x5845, + (q15_t)0x5840, (q15_t)0x583c, (q15_t)0x5837, (q15_t)0x5832, (q15_t)0x582e, (q15_t)0x5829, (q15_t)0x5825, (q15_t)0x5820, + (q15_t)0x581c, (q15_t)0x5817, (q15_t)0x5813, (q15_t)0x580e, (q15_t)0x5809, (q15_t)0x5805, (q15_t)0x5800, (q15_t)0x57fc, + (q15_t)0x57f7, (q15_t)0x57f3, (q15_t)0x57ee, (q15_t)0x57e9, (q15_t)0x57e5, (q15_t)0x57e0, (q15_t)0x57dc, (q15_t)0x57d7, + (q15_t)0x57d3, (q15_t)0x57ce, (q15_t)0x57c9, (q15_t)0x57c5, (q15_t)0x57c0, (q15_t)0x57bc, (q15_t)0x57b7, (q15_t)0x57b3, + (q15_t)0x57ae, (q15_t)0x57a9, (q15_t)0x57a5, (q15_t)0x57a0, (q15_t)0x579c, (q15_t)0x5797, (q15_t)0x5793, (q15_t)0x578e, + (q15_t)0x5789, (q15_t)0x5785, (q15_t)0x5780, (q15_t)0x577c, (q15_t)0x5777, (q15_t)0x5772, (q15_t)0x576e, (q15_t)0x5769, + (q15_t)0x5765, (q15_t)0x5760, (q15_t)0x575c, (q15_t)0x5757, (q15_t)0x5752, (q15_t)0x574e, (q15_t)0x5749, (q15_t)0x5745, + (q15_t)0x5740, (q15_t)0x573b, (q15_t)0x5737, (q15_t)0x5732, (q15_t)0x572e, (q15_t)0x5729, (q15_t)0x5724, (q15_t)0x5720, + (q15_t)0x571b, (q15_t)0x5717, (q15_t)0x5712, (q15_t)0x570d, (q15_t)0x5709, (q15_t)0x5704, (q15_t)0x56ff, (q15_t)0x56fb, + (q15_t)0x56f6, (q15_t)0x56f2, (q15_t)0x56ed, (q15_t)0x56e8, (q15_t)0x56e4, (q15_t)0x56df, (q15_t)0x56db, (q15_t)0x56d6, + (q15_t)0x56d1, (q15_t)0x56cd, (q15_t)0x56c8, (q15_t)0x56c4, (q15_t)0x56bf, (q15_t)0x56ba, (q15_t)0x56b6, (q15_t)0x56b1, + (q15_t)0x56ac, (q15_t)0x56a8, (q15_t)0x56a3, (q15_t)0x569f, (q15_t)0x569a, (q15_t)0x5695, (q15_t)0x5691, (q15_t)0x568c, + (q15_t)0x5687, (q15_t)0x5683, (q15_t)0x567e, (q15_t)0x5679, (q15_t)0x5675, (q15_t)0x5670, (q15_t)0x566c, (q15_t)0x5667, + (q15_t)0x5662, (q15_t)0x565e, (q15_t)0x5659, (q15_t)0x5654, (q15_t)0x5650, (q15_t)0x564b, (q15_t)0x5646, (q15_t)0x5642, + (q15_t)0x563d, (q15_t)0x5639, (q15_t)0x5634, (q15_t)0x562f, (q15_t)0x562b, (q15_t)0x5626, (q15_t)0x5621, (q15_t)0x561d, + (q15_t)0x5618, (q15_t)0x5613, (q15_t)0x560f, (q15_t)0x560a, (q15_t)0x5605, (q15_t)0x5601, (q15_t)0x55fc, (q15_t)0x55f7, + (q15_t)0x55f3, (q15_t)0x55ee, (q15_t)0x55ea, (q15_t)0x55e5, (q15_t)0x55e0, (q15_t)0x55dc, (q15_t)0x55d7, (q15_t)0x55d2, + (q15_t)0x55ce, (q15_t)0x55c9, (q15_t)0x55c4, (q15_t)0x55c0, (q15_t)0x55bb, (q15_t)0x55b6, (q15_t)0x55b2, (q15_t)0x55ad, + (q15_t)0x55a8, (q15_t)0x55a4, (q15_t)0x559f, (q15_t)0x559a, (q15_t)0x5596, (q15_t)0x5591, (q15_t)0x558c, (q15_t)0x5588, + (q15_t)0x5583, (q15_t)0x557e, (q15_t)0x5579, (q15_t)0x5575, (q15_t)0x5570, (q15_t)0x556b, (q15_t)0x5567, (q15_t)0x5562, + (q15_t)0x555d, (q15_t)0x5559, (q15_t)0x5554, (q15_t)0x554f, (q15_t)0x554b, (q15_t)0x5546, (q15_t)0x5541, (q15_t)0x553d, + (q15_t)0x5538, (q15_t)0x5533, (q15_t)0x552f, (q15_t)0x552a, (q15_t)0x5525, (q15_t)0x5520, (q15_t)0x551c, (q15_t)0x5517, + (q15_t)0x5512, (q15_t)0x550e, (q15_t)0x5509, (q15_t)0x5504, (q15_t)0x5500, (q15_t)0x54fb, (q15_t)0x54f6, (q15_t)0x54f2, + (q15_t)0x54ed, (q15_t)0x54e8, (q15_t)0x54e3, (q15_t)0x54df, (q15_t)0x54da, (q15_t)0x54d5, (q15_t)0x54d1, (q15_t)0x54cc, + (q15_t)0x54c7, (q15_t)0x54c2, (q15_t)0x54be, (q15_t)0x54b9, (q15_t)0x54b4, (q15_t)0x54b0, (q15_t)0x54ab, (q15_t)0x54a6, + (q15_t)0x54a2, (q15_t)0x549d, (q15_t)0x5498, (q15_t)0x5493, (q15_t)0x548f, (q15_t)0x548a, (q15_t)0x5485, (q15_t)0x5480, + (q15_t)0x547c, (q15_t)0x5477, (q15_t)0x5472, (q15_t)0x546e, (q15_t)0x5469, (q15_t)0x5464, (q15_t)0x545f, (q15_t)0x545b, + (q15_t)0x5456, (q15_t)0x5451, (q15_t)0x544d, (q15_t)0x5448, (q15_t)0x5443, (q15_t)0x543e, (q15_t)0x543a, (q15_t)0x5435, + (q15_t)0x5430, (q15_t)0x542b, (q15_t)0x5427, (q15_t)0x5422, (q15_t)0x541d, (q15_t)0x5418, (q15_t)0x5414, (q15_t)0x540f, + (q15_t)0x540a, (q15_t)0x5406, (q15_t)0x5401, (q15_t)0x53fc, (q15_t)0x53f7, (q15_t)0x53f3, (q15_t)0x53ee, (q15_t)0x53e9, + (q15_t)0x53e4, (q15_t)0x53e0, (q15_t)0x53db, (q15_t)0x53d6, (q15_t)0x53d1, (q15_t)0x53cd, (q15_t)0x53c8, (q15_t)0x53c3, + (q15_t)0x53be, (q15_t)0x53ba, (q15_t)0x53b5, (q15_t)0x53b0, (q15_t)0x53ab, (q15_t)0x53a7, (q15_t)0x53a2, (q15_t)0x539d, + (q15_t)0x5398, (q15_t)0x5394, (q15_t)0x538f, (q15_t)0x538a, (q15_t)0x5385, (q15_t)0x5380, (q15_t)0x537c, (q15_t)0x5377, + (q15_t)0x5372, (q15_t)0x536d, (q15_t)0x5369, (q15_t)0x5364, (q15_t)0x535f, (q15_t)0x535a, (q15_t)0x5356, (q15_t)0x5351, + (q15_t)0x534c, (q15_t)0x5347, (q15_t)0x5343, (q15_t)0x533e, (q15_t)0x5339, (q15_t)0x5334, (q15_t)0x532f, (q15_t)0x532b, + (q15_t)0x5326, (q15_t)0x5321, (q15_t)0x531c, (q15_t)0x5318, (q15_t)0x5313, (q15_t)0x530e, (q15_t)0x5309, (q15_t)0x5304, + (q15_t)0x5300, (q15_t)0x52fb, (q15_t)0x52f6, (q15_t)0x52f1, (q15_t)0x52ec, (q15_t)0x52e8, (q15_t)0x52e3, (q15_t)0x52de, + (q15_t)0x52d9, (q15_t)0x52d5, (q15_t)0x52d0, (q15_t)0x52cb, (q15_t)0x52c6, (q15_t)0x52c1, (q15_t)0x52bd, (q15_t)0x52b8, + (q15_t)0x52b3, (q15_t)0x52ae, (q15_t)0x52a9, (q15_t)0x52a5, (q15_t)0x52a0, (q15_t)0x529b, (q15_t)0x5296, (q15_t)0x5291, + (q15_t)0x528d, (q15_t)0x5288, (q15_t)0x5283, (q15_t)0x527e, (q15_t)0x5279, (q15_t)0x5275, (q15_t)0x5270, (q15_t)0x526b, + (q15_t)0x5266, (q15_t)0x5261, (q15_t)0x525d, (q15_t)0x5258, (q15_t)0x5253, (q15_t)0x524e, (q15_t)0x5249, (q15_t)0x5244, + (q15_t)0x5240, (q15_t)0x523b, (q15_t)0x5236, (q15_t)0x5231, (q15_t)0x522c, (q15_t)0x5228, (q15_t)0x5223, (q15_t)0x521e, + (q15_t)0x5219, (q15_t)0x5214, (q15_t)0x520f, (q15_t)0x520b, (q15_t)0x5206, (q15_t)0x5201, (q15_t)0x51fc, (q15_t)0x51f7, + (q15_t)0x51f3, (q15_t)0x51ee, (q15_t)0x51e9, (q15_t)0x51e4, (q15_t)0x51df, (q15_t)0x51da, (q15_t)0x51d6, (q15_t)0x51d1, + (q15_t)0x51cc, (q15_t)0x51c7, (q15_t)0x51c2, (q15_t)0x51bd, (q15_t)0x51b9, (q15_t)0x51b4, (q15_t)0x51af, (q15_t)0x51aa, + (q15_t)0x51a5, (q15_t)0x51a0, (q15_t)0x519c, (q15_t)0x5197, (q15_t)0x5192, (q15_t)0x518d, (q15_t)0x5188, (q15_t)0x5183, + (q15_t)0x517e, (q15_t)0x517a, (q15_t)0x5175, (q15_t)0x5170, (q15_t)0x516b, (q15_t)0x5166, (q15_t)0x5161, (q15_t)0x515d, + (q15_t)0x5158, (q15_t)0x5153, (q15_t)0x514e, (q15_t)0x5149, (q15_t)0x5144, (q15_t)0x513f, (q15_t)0x513b, (q15_t)0x5136, + (q15_t)0x5131, (q15_t)0x512c, (q15_t)0x5127, (q15_t)0x5122, (q15_t)0x511d, (q15_t)0x5119, (q15_t)0x5114, (q15_t)0x510f, + (q15_t)0x510a, (q15_t)0x5105, (q15_t)0x5100, (q15_t)0x50fb, (q15_t)0x50f7, (q15_t)0x50f2, (q15_t)0x50ed, (q15_t)0x50e8, + (q15_t)0x50e3, (q15_t)0x50de, (q15_t)0x50d9, (q15_t)0x50d4, (q15_t)0x50d0, (q15_t)0x50cb, (q15_t)0x50c6, (q15_t)0x50c1, + (q15_t)0x50bc, (q15_t)0x50b7, (q15_t)0x50b2, (q15_t)0x50ad, (q15_t)0x50a9, (q15_t)0x50a4, (q15_t)0x509f, (q15_t)0x509a, + (q15_t)0x5095, (q15_t)0x5090, (q15_t)0x508b, (q15_t)0x5086, (q15_t)0x5082, (q15_t)0x507d, (q15_t)0x5078, (q15_t)0x5073, + (q15_t)0x506e, (q15_t)0x5069, (q15_t)0x5064, (q15_t)0x505f, (q15_t)0x505a, (q15_t)0x5056, (q15_t)0x5051, (q15_t)0x504c, + (q15_t)0x5047, (q15_t)0x5042, (q15_t)0x503d, (q15_t)0x5038, (q15_t)0x5033, (q15_t)0x502e, (q15_t)0x5029, (q15_t)0x5025, + (q15_t)0x5020, (q15_t)0x501b, (q15_t)0x5016, (q15_t)0x5011, (q15_t)0x500c, (q15_t)0x5007, (q15_t)0x5002, (q15_t)0x4ffd, + (q15_t)0x4ff8, (q15_t)0x4ff4, (q15_t)0x4fef, (q15_t)0x4fea, (q15_t)0x4fe5, (q15_t)0x4fe0, (q15_t)0x4fdb, (q15_t)0x4fd6, + (q15_t)0x4fd1, (q15_t)0x4fcc, (q15_t)0x4fc7, (q15_t)0x4fc2, (q15_t)0x4fbe, (q15_t)0x4fb9, (q15_t)0x4fb4, (q15_t)0x4faf, + (q15_t)0x4faa, (q15_t)0x4fa5, (q15_t)0x4fa0, (q15_t)0x4f9b, (q15_t)0x4f96, (q15_t)0x4f91, (q15_t)0x4f8c, (q15_t)0x4f87, + (q15_t)0x4f82, (q15_t)0x4f7e, (q15_t)0x4f79, (q15_t)0x4f74, (q15_t)0x4f6f, (q15_t)0x4f6a, (q15_t)0x4f65, (q15_t)0x4f60, + (q15_t)0x4f5b, (q15_t)0x4f56, (q15_t)0x4f51, (q15_t)0x4f4c, (q15_t)0x4f47, (q15_t)0x4f42, (q15_t)0x4f3d, (q15_t)0x4f39, + (q15_t)0x4f34, (q15_t)0x4f2f, (q15_t)0x4f2a, (q15_t)0x4f25, (q15_t)0x4f20, (q15_t)0x4f1b, (q15_t)0x4f16, (q15_t)0x4f11, + (q15_t)0x4f0c, (q15_t)0x4f07, (q15_t)0x4f02, (q15_t)0x4efd, (q15_t)0x4ef8, (q15_t)0x4ef3, (q15_t)0x4eee, (q15_t)0x4ee9, + (q15_t)0x4ee5, (q15_t)0x4ee0, (q15_t)0x4edb, (q15_t)0x4ed6, (q15_t)0x4ed1, (q15_t)0x4ecc, (q15_t)0x4ec7, (q15_t)0x4ec2, + (q15_t)0x4ebd, (q15_t)0x4eb8, (q15_t)0x4eb3, (q15_t)0x4eae, (q15_t)0x4ea9, (q15_t)0x4ea4, (q15_t)0x4e9f, (q15_t)0x4e9a, + (q15_t)0x4e95, (q15_t)0x4e90, (q15_t)0x4e8b, (q15_t)0x4e86, (q15_t)0x4e81, (q15_t)0x4e7c, (q15_t)0x4e78, (q15_t)0x4e73, + (q15_t)0x4e6e, (q15_t)0x4e69, (q15_t)0x4e64, (q15_t)0x4e5f, (q15_t)0x4e5a, (q15_t)0x4e55, (q15_t)0x4e50, (q15_t)0x4e4b, + (q15_t)0x4e46, (q15_t)0x4e41, (q15_t)0x4e3c, (q15_t)0x4e37, (q15_t)0x4e32, (q15_t)0x4e2d, (q15_t)0x4e28, (q15_t)0x4e23, + (q15_t)0x4e1e, (q15_t)0x4e19, (q15_t)0x4e14, (q15_t)0x4e0f, (q15_t)0x4e0a, (q15_t)0x4e05, (q15_t)0x4e00, (q15_t)0x4dfb, + (q15_t)0x4df6, (q15_t)0x4df1, (q15_t)0x4dec, (q15_t)0x4de7, (q15_t)0x4de2, (q15_t)0x4ddd, (q15_t)0x4dd8, (q15_t)0x4dd3, + (q15_t)0x4dce, (q15_t)0x4dc9, (q15_t)0x4dc4, (q15_t)0x4dbf, (q15_t)0x4dba, (q15_t)0x4db5, (q15_t)0x4db0, (q15_t)0x4dab, + (q15_t)0x4da6, (q15_t)0x4da1, (q15_t)0x4d9c, (q15_t)0x4d97, (q15_t)0x4d92, (q15_t)0x4d8d, (q15_t)0x4d88, (q15_t)0x4d83, + (q15_t)0x4d7e, (q15_t)0x4d79, (q15_t)0x4d74, (q15_t)0x4d6f, (q15_t)0x4d6a, (q15_t)0x4d65, (q15_t)0x4d60, (q15_t)0x4d5b, + (q15_t)0x4d56, (q15_t)0x4d51, (q15_t)0x4d4c, (q15_t)0x4d47, (q15_t)0x4d42, (q15_t)0x4d3d, (q15_t)0x4d38, (q15_t)0x4d33, + (q15_t)0x4d2e, (q15_t)0x4d29, (q15_t)0x4d24, (q15_t)0x4d1f, (q15_t)0x4d1a, (q15_t)0x4d15, (q15_t)0x4d10, (q15_t)0x4d0b, + (q15_t)0x4d06, (q15_t)0x4d01, (q15_t)0x4cfc, (q15_t)0x4cf7, (q15_t)0x4cf2, (q15_t)0x4ced, (q15_t)0x4ce8, (q15_t)0x4ce3, + (q15_t)0x4cde, (q15_t)0x4cd9, (q15_t)0x4cd4, (q15_t)0x4ccf, (q15_t)0x4cca, (q15_t)0x4cc5, (q15_t)0x4cc0, (q15_t)0x4cbb, + (q15_t)0x4cb6, (q15_t)0x4cb1, (q15_t)0x4cac, (q15_t)0x4ca7, (q15_t)0x4ca2, (q15_t)0x4c9d, (q15_t)0x4c98, (q15_t)0x4c93, + (q15_t)0x4c8e, (q15_t)0x4c88, (q15_t)0x4c83, (q15_t)0x4c7e, (q15_t)0x4c79, (q15_t)0x4c74, (q15_t)0x4c6f, (q15_t)0x4c6a, + (q15_t)0x4c65, (q15_t)0x4c60, (q15_t)0x4c5b, (q15_t)0x4c56, (q15_t)0x4c51, (q15_t)0x4c4c, (q15_t)0x4c47, (q15_t)0x4c42, + (q15_t)0x4c3d, (q15_t)0x4c38, (q15_t)0x4c33, (q15_t)0x4c2e, (q15_t)0x4c29, (q15_t)0x4c24, (q15_t)0x4c1f, (q15_t)0x4c1a, + (q15_t)0x4c14, (q15_t)0x4c0f, (q15_t)0x4c0a, (q15_t)0x4c05, (q15_t)0x4c00, (q15_t)0x4bfb, (q15_t)0x4bf6, (q15_t)0x4bf1, + (q15_t)0x4bec, (q15_t)0x4be7, (q15_t)0x4be2, (q15_t)0x4bdd, (q15_t)0x4bd8, (q15_t)0x4bd3, (q15_t)0x4bce, (q15_t)0x4bc9, + (q15_t)0x4bc4, (q15_t)0x4bbe, (q15_t)0x4bb9, (q15_t)0x4bb4, (q15_t)0x4baf, (q15_t)0x4baa, (q15_t)0x4ba5, (q15_t)0x4ba0, + (q15_t)0x4b9b, (q15_t)0x4b96, (q15_t)0x4b91, (q15_t)0x4b8c, (q15_t)0x4b87, (q15_t)0x4b82, (q15_t)0x4b7d, (q15_t)0x4b77, + (q15_t)0x4b72, (q15_t)0x4b6d, (q15_t)0x4b68, (q15_t)0x4b63, (q15_t)0x4b5e, (q15_t)0x4b59, (q15_t)0x4b54, (q15_t)0x4b4f, + (q15_t)0x4b4a, (q15_t)0x4b45, (q15_t)0x4b40, (q15_t)0x4b3b, (q15_t)0x4b35, (q15_t)0x4b30, (q15_t)0x4b2b, (q15_t)0x4b26, + (q15_t)0x4b21, (q15_t)0x4b1c, (q15_t)0x4b17, (q15_t)0x4b12, (q15_t)0x4b0d, (q15_t)0x4b08, (q15_t)0x4b03, (q15_t)0x4afd, + (q15_t)0x4af8, (q15_t)0x4af3, (q15_t)0x4aee, (q15_t)0x4ae9, (q15_t)0x4ae4, (q15_t)0x4adf, (q15_t)0x4ada, (q15_t)0x4ad5, + (q15_t)0x4ad0, (q15_t)0x4acb, (q15_t)0x4ac5, (q15_t)0x4ac0, (q15_t)0x4abb, (q15_t)0x4ab6, (q15_t)0x4ab1, (q15_t)0x4aac, + (q15_t)0x4aa7, (q15_t)0x4aa2, (q15_t)0x4a9d, (q15_t)0x4a97, (q15_t)0x4a92, (q15_t)0x4a8d, (q15_t)0x4a88, (q15_t)0x4a83, + (q15_t)0x4a7e, (q15_t)0x4a79, (q15_t)0x4a74, (q15_t)0x4a6f, (q15_t)0x4a6a, (q15_t)0x4a64, (q15_t)0x4a5f, (q15_t)0x4a5a, + (q15_t)0x4a55, (q15_t)0x4a50, (q15_t)0x4a4b, (q15_t)0x4a46, (q15_t)0x4a41, (q15_t)0x4a3b, (q15_t)0x4a36, (q15_t)0x4a31, + (q15_t)0x4a2c, (q15_t)0x4a27, (q15_t)0x4a22, (q15_t)0x4a1d, (q15_t)0x4a18, (q15_t)0x4a12, (q15_t)0x4a0d, (q15_t)0x4a08, + (q15_t)0x4a03, (q15_t)0x49fe, (q15_t)0x49f9, (q15_t)0x49f4, (q15_t)0x49ef, (q15_t)0x49e9, (q15_t)0x49e4, (q15_t)0x49df, + (q15_t)0x49da, (q15_t)0x49d5, (q15_t)0x49d0, (q15_t)0x49cb, (q15_t)0x49c6, (q15_t)0x49c0, (q15_t)0x49bb, (q15_t)0x49b6, + (q15_t)0x49b1, (q15_t)0x49ac, (q15_t)0x49a7, (q15_t)0x49a2, (q15_t)0x499c, (q15_t)0x4997, (q15_t)0x4992, (q15_t)0x498d, + (q15_t)0x4988, (q15_t)0x4983, (q15_t)0x497e, (q15_t)0x4978, (q15_t)0x4973, (q15_t)0x496e, (q15_t)0x4969, (q15_t)0x4964, + (q15_t)0x495f, (q15_t)0x495a, (q15_t)0x4954, (q15_t)0x494f, (q15_t)0x494a, (q15_t)0x4945, (q15_t)0x4940, (q15_t)0x493b, + (q15_t)0x4936, (q15_t)0x4930, (q15_t)0x492b, (q15_t)0x4926, (q15_t)0x4921, (q15_t)0x491c, (q15_t)0x4917, (q15_t)0x4911, + (q15_t)0x490c, (q15_t)0x4907, (q15_t)0x4902, (q15_t)0x48fd, (q15_t)0x48f8, (q15_t)0x48f2, (q15_t)0x48ed, (q15_t)0x48e8, + (q15_t)0x48e3, (q15_t)0x48de, (q15_t)0x48d9, (q15_t)0x48d3, (q15_t)0x48ce, (q15_t)0x48c9, (q15_t)0x48c4, (q15_t)0x48bf, + (q15_t)0x48ba, (q15_t)0x48b4, (q15_t)0x48af, (q15_t)0x48aa, (q15_t)0x48a5, (q15_t)0x48a0, (q15_t)0x489b, (q15_t)0x4895, + (q15_t)0x4890, (q15_t)0x488b, (q15_t)0x4886, (q15_t)0x4881, (q15_t)0x487c, (q15_t)0x4876, (q15_t)0x4871, (q15_t)0x486c, + (q15_t)0x4867, (q15_t)0x4862, (q15_t)0x485c, (q15_t)0x4857, (q15_t)0x4852, (q15_t)0x484d, (q15_t)0x4848, (q15_t)0x4843, + (q15_t)0x483d, (q15_t)0x4838, (q15_t)0x4833, (q15_t)0x482e, (q15_t)0x4829, (q15_t)0x4823, (q15_t)0x481e, (q15_t)0x4819, + (q15_t)0x4814, (q15_t)0x480f, (q15_t)0x4809, (q15_t)0x4804, (q15_t)0x47ff, (q15_t)0x47fa, (q15_t)0x47f5, (q15_t)0x47ef, + (q15_t)0x47ea, (q15_t)0x47e5, (q15_t)0x47e0, (q15_t)0x47db, (q15_t)0x47d5, (q15_t)0x47d0, (q15_t)0x47cb, (q15_t)0x47c6, + (q15_t)0x47c1, (q15_t)0x47bb, (q15_t)0x47b6, (q15_t)0x47b1, (q15_t)0x47ac, (q15_t)0x47a7, (q15_t)0x47a1, (q15_t)0x479c, + (q15_t)0x4797, (q15_t)0x4792, (q15_t)0x478d, (q15_t)0x4787, (q15_t)0x4782, (q15_t)0x477d, (q15_t)0x4778, (q15_t)0x4773, + (q15_t)0x476d, (q15_t)0x4768, (q15_t)0x4763, (q15_t)0x475e, (q15_t)0x4758, (q15_t)0x4753, (q15_t)0x474e, (q15_t)0x4749, + (q15_t)0x4744, (q15_t)0x473e, (q15_t)0x4739, (q15_t)0x4734, (q15_t)0x472f, (q15_t)0x4729, (q15_t)0x4724, (q15_t)0x471f, + (q15_t)0x471a, (q15_t)0x4715, (q15_t)0x470f, (q15_t)0x470a, (q15_t)0x4705, (q15_t)0x4700, (q15_t)0x46fa, (q15_t)0x46f5, + (q15_t)0x46f0, (q15_t)0x46eb, (q15_t)0x46e6, (q15_t)0x46e0, (q15_t)0x46db, (q15_t)0x46d6, (q15_t)0x46d1, (q15_t)0x46cb, + (q15_t)0x46c6, (q15_t)0x46c1, (q15_t)0x46bc, (q15_t)0x46b6, (q15_t)0x46b1, (q15_t)0x46ac, (q15_t)0x46a7, (q15_t)0x46a1, + (q15_t)0x469c, (q15_t)0x4697, (q15_t)0x4692, (q15_t)0x468d, (q15_t)0x4687, (q15_t)0x4682, (q15_t)0x467d, (q15_t)0x4678, + (q15_t)0x4672, (q15_t)0x466d, (q15_t)0x4668, (q15_t)0x4663, (q15_t)0x465d, (q15_t)0x4658, (q15_t)0x4653, (q15_t)0x464e, + (q15_t)0x4648, (q15_t)0x4643, (q15_t)0x463e, (q15_t)0x4639, (q15_t)0x4633, (q15_t)0x462e, (q15_t)0x4629, (q15_t)0x4624, + (q15_t)0x461e, (q15_t)0x4619, (q15_t)0x4614, (q15_t)0x460e, (q15_t)0x4609, (q15_t)0x4604, (q15_t)0x45ff, (q15_t)0x45f9, + (q15_t)0x45f4, (q15_t)0x45ef, (q15_t)0x45ea, (q15_t)0x45e4, (q15_t)0x45df, (q15_t)0x45da, (q15_t)0x45d5, (q15_t)0x45cf, + (q15_t)0x45ca, (q15_t)0x45c5, (q15_t)0x45c0, (q15_t)0x45ba, (q15_t)0x45b5, (q15_t)0x45b0, (q15_t)0x45aa, (q15_t)0x45a5, + (q15_t)0x45a0, (q15_t)0x459b, (q15_t)0x4595, (q15_t)0x4590, (q15_t)0x458b, (q15_t)0x4586, (q15_t)0x4580, (q15_t)0x457b, + (q15_t)0x4576, (q15_t)0x4570, (q15_t)0x456b, (q15_t)0x4566, (q15_t)0x4561, (q15_t)0x455b, (q15_t)0x4556, (q15_t)0x4551, + (q15_t)0x454b, (q15_t)0x4546, (q15_t)0x4541, (q15_t)0x453c, (q15_t)0x4536, (q15_t)0x4531, (q15_t)0x452c, (q15_t)0x4526, + (q15_t)0x4521, (q15_t)0x451c, (q15_t)0x4517, (q15_t)0x4511, (q15_t)0x450c, (q15_t)0x4507, (q15_t)0x4501, (q15_t)0x44fc, + (q15_t)0x44f7, (q15_t)0x44f2, (q15_t)0x44ec, (q15_t)0x44e7, (q15_t)0x44e2, (q15_t)0x44dc, (q15_t)0x44d7, (q15_t)0x44d2, + (q15_t)0x44cd, (q15_t)0x44c7, (q15_t)0x44c2, (q15_t)0x44bd, (q15_t)0x44b7, (q15_t)0x44b2, (q15_t)0x44ad, (q15_t)0x44a7, + (q15_t)0x44a2, (q15_t)0x449d, (q15_t)0x4497, (q15_t)0x4492, (q15_t)0x448d, (q15_t)0x4488, (q15_t)0x4482, (q15_t)0x447d, + (q15_t)0x4478, (q15_t)0x4472, (q15_t)0x446d, (q15_t)0x4468, (q15_t)0x4462, (q15_t)0x445d, (q15_t)0x4458, (q15_t)0x4452, + (q15_t)0x444d, (q15_t)0x4448, (q15_t)0x4443, (q15_t)0x443d, (q15_t)0x4438, (q15_t)0x4433, (q15_t)0x442d, (q15_t)0x4428, + (q15_t)0x4423, (q15_t)0x441d, (q15_t)0x4418, (q15_t)0x4413, (q15_t)0x440d, (q15_t)0x4408, (q15_t)0x4403, (q15_t)0x43fd, + (q15_t)0x43f8, (q15_t)0x43f3, (q15_t)0x43ed, (q15_t)0x43e8, (q15_t)0x43e3, (q15_t)0x43dd, (q15_t)0x43d8, (q15_t)0x43d3, + (q15_t)0x43cd, (q15_t)0x43c8, (q15_t)0x43c3, (q15_t)0x43bd, (q15_t)0x43b8, (q15_t)0x43b3, (q15_t)0x43ad, (q15_t)0x43a8, + (q15_t)0x43a3, (q15_t)0x439d, (q15_t)0x4398, (q15_t)0x4393, (q15_t)0x438d, (q15_t)0x4388, (q15_t)0x4383, (q15_t)0x437d, + (q15_t)0x4378, (q15_t)0x4373, (q15_t)0x436d, (q15_t)0x4368, (q15_t)0x4363, (q15_t)0x435d, (q15_t)0x4358, (q15_t)0x4353, + (q15_t)0x434d, (q15_t)0x4348, (q15_t)0x4343, (q15_t)0x433d, (q15_t)0x4338, (q15_t)0x4333, (q15_t)0x432d, (q15_t)0x4328, + (q15_t)0x4323, (q15_t)0x431d, (q15_t)0x4318, (q15_t)0x4313, (q15_t)0x430d, (q15_t)0x4308, (q15_t)0x4302, (q15_t)0x42fd, + (q15_t)0x42f8, (q15_t)0x42f2, (q15_t)0x42ed, (q15_t)0x42e8, (q15_t)0x42e2, (q15_t)0x42dd, (q15_t)0x42d8, (q15_t)0x42d2, + (q15_t)0x42cd, (q15_t)0x42c8, (q15_t)0x42c2, (q15_t)0x42bd, (q15_t)0x42b7, (q15_t)0x42b2, (q15_t)0x42ad, (q15_t)0x42a7, + (q15_t)0x42a2, (q15_t)0x429d, (q15_t)0x4297, (q15_t)0x4292, (q15_t)0x428d, (q15_t)0x4287, (q15_t)0x4282, (q15_t)0x427c, + (q15_t)0x4277, (q15_t)0x4272, (q15_t)0x426c, (q15_t)0x4267, (q15_t)0x4262, (q15_t)0x425c, (q15_t)0x4257, (q15_t)0x4251, + (q15_t)0x424c, (q15_t)0x4247, (q15_t)0x4241, (q15_t)0x423c, (q15_t)0x4237, (q15_t)0x4231, (q15_t)0x422c, (q15_t)0x4226, + (q15_t)0x4221, (q15_t)0x421c, (q15_t)0x4216, (q15_t)0x4211, (q15_t)0x420c, (q15_t)0x4206, (q15_t)0x4201, (q15_t)0x41fb, + (q15_t)0x41f6, (q15_t)0x41f1, (q15_t)0x41eb, (q15_t)0x41e6, (q15_t)0x41e0, (q15_t)0x41db, (q15_t)0x41d6, (q15_t)0x41d0, + (q15_t)0x41cb, (q15_t)0x41c6, (q15_t)0x41c0, (q15_t)0x41bb, (q15_t)0x41b5, (q15_t)0x41b0, (q15_t)0x41ab, (q15_t)0x41a5, + (q15_t)0x41a0, (q15_t)0x419a, (q15_t)0x4195, (q15_t)0x4190, (q15_t)0x418a, (q15_t)0x4185, (q15_t)0x417f, (q15_t)0x417a, + (q15_t)0x4175, (q15_t)0x416f, (q15_t)0x416a, (q15_t)0x4164, (q15_t)0x415f, (q15_t)0x415a, (q15_t)0x4154, (q15_t)0x414f, + (q15_t)0x4149, (q15_t)0x4144, (q15_t)0x413f, (q15_t)0x4139, (q15_t)0x4134, (q15_t)0x412e, (q15_t)0x4129, (q15_t)0x4124, + (q15_t)0x411e, (q15_t)0x4119, (q15_t)0x4113, (q15_t)0x410e, (q15_t)0x4108, (q15_t)0x4103, (q15_t)0x40fe, (q15_t)0x40f8, + (q15_t)0x40f3, (q15_t)0x40ed, (q15_t)0x40e8, (q15_t)0x40e3, (q15_t)0x40dd, (q15_t)0x40d8, (q15_t)0x40d2, (q15_t)0x40cd, + (q15_t)0x40c8, (q15_t)0x40c2, (q15_t)0x40bd, (q15_t)0x40b7, (q15_t)0x40b2, (q15_t)0x40ac, (q15_t)0x40a7, (q15_t)0x40a2, + (q15_t)0x409c, (q15_t)0x4097, (q15_t)0x4091, (q15_t)0x408c, (q15_t)0x4086, (q15_t)0x4081, (q15_t)0x407c, (q15_t)0x4076, + (q15_t)0x4071, (q15_t)0x406b, (q15_t)0x4066, (q15_t)0x4060, (q15_t)0x405b, (q15_t)0x4056, (q15_t)0x4050, (q15_t)0x404b, + (q15_t)0x4045, (q15_t)0x4040, (q15_t)0x403a, (q15_t)0x4035, (q15_t)0x4030, (q15_t)0x402a, (q15_t)0x4025, (q15_t)0x401f, + (q15_t)0x401a, (q15_t)0x4014, (q15_t)0x400f, (q15_t)0x4009, (q15_t)0x4004, (q15_t)0x3fff, (q15_t)0x3ff9, (q15_t)0x3ff4, + (q15_t)0x3fee, (q15_t)0x3fe9, (q15_t)0x3fe3, (q15_t)0x3fde, (q15_t)0x3fd8, (q15_t)0x3fd3, (q15_t)0x3fce, (q15_t)0x3fc8, + (q15_t)0x3fc3, (q15_t)0x3fbd, (q15_t)0x3fb8, (q15_t)0x3fb2, (q15_t)0x3fad, (q15_t)0x3fa7, (q15_t)0x3fa2, (q15_t)0x3f9d, + (q15_t)0x3f97, (q15_t)0x3f92, (q15_t)0x3f8c, (q15_t)0x3f87, (q15_t)0x3f81, (q15_t)0x3f7c, (q15_t)0x3f76, (q15_t)0x3f71, + (q15_t)0x3f6b, (q15_t)0x3f66, (q15_t)0x3f61, (q15_t)0x3f5b, (q15_t)0x3f56, (q15_t)0x3f50, (q15_t)0x3f4b, (q15_t)0x3f45, + (q15_t)0x3f40, (q15_t)0x3f3a, (q15_t)0x3f35, (q15_t)0x3f2f, (q15_t)0x3f2a, (q15_t)0x3f24, (q15_t)0x3f1f, (q15_t)0x3f1a, + (q15_t)0x3f14, (q15_t)0x3f0f, (q15_t)0x3f09, (q15_t)0x3f04, (q15_t)0x3efe, (q15_t)0x3ef9, (q15_t)0x3ef3, (q15_t)0x3eee, + (q15_t)0x3ee8, (q15_t)0x3ee3, (q15_t)0x3edd, (q15_t)0x3ed8, (q15_t)0x3ed2, (q15_t)0x3ecd, (q15_t)0x3ec7, (q15_t)0x3ec2, + (q15_t)0x3ebd, (q15_t)0x3eb7, (q15_t)0x3eb2, (q15_t)0x3eac, (q15_t)0x3ea7, (q15_t)0x3ea1, (q15_t)0x3e9c, (q15_t)0x3e96, + (q15_t)0x3e91, (q15_t)0x3e8b, (q15_t)0x3e86, (q15_t)0x3e80, (q15_t)0x3e7b, (q15_t)0x3e75, (q15_t)0x3e70, (q15_t)0x3e6a, + (q15_t)0x3e65, (q15_t)0x3e5f, (q15_t)0x3e5a, (q15_t)0x3e54, (q15_t)0x3e4f, (q15_t)0x3e49, (q15_t)0x3e44, (q15_t)0x3e3e, + (q15_t)0x3e39, (q15_t)0x3e33, (q15_t)0x3e2e, (q15_t)0x3e28, (q15_t)0x3e23, (q15_t)0x3e1d, (q15_t)0x3e18, (q15_t)0x3e12, + (q15_t)0x3e0d, (q15_t)0x3e07, (q15_t)0x3e02, (q15_t)0x3dfc, (q15_t)0x3df7, (q15_t)0x3df1, (q15_t)0x3dec, (q15_t)0x3de6, + (q15_t)0x3de1, (q15_t)0x3ddb, (q15_t)0x3dd6, (q15_t)0x3dd0, (q15_t)0x3dcb, (q15_t)0x3dc5, (q15_t)0x3dc0, (q15_t)0x3dba, + (q15_t)0x3db5, (q15_t)0x3daf, (q15_t)0x3daa, (q15_t)0x3da4, (q15_t)0x3d9f, (q15_t)0x3d99, (q15_t)0x3d94, (q15_t)0x3d8e, + (q15_t)0x3d89, (q15_t)0x3d83, (q15_t)0x3d7e, (q15_t)0x3d78, (q15_t)0x3d73, (q15_t)0x3d6d, (q15_t)0x3d68, (q15_t)0x3d62, + (q15_t)0x3d5d, (q15_t)0x3d57, (q15_t)0x3d52, (q15_t)0x3d4c, (q15_t)0x3d47, (q15_t)0x3d41, (q15_t)0x3d3c, (q15_t)0x3d36, + (q15_t)0x3d31, (q15_t)0x3d2b, (q15_t)0x3d26, (q15_t)0x3d20, (q15_t)0x3d1b, (q15_t)0x3d15, (q15_t)0x3d10, (q15_t)0x3d0a, + (q15_t)0x3d04, (q15_t)0x3cff, (q15_t)0x3cf9, (q15_t)0x3cf4, (q15_t)0x3cee, (q15_t)0x3ce9, (q15_t)0x3ce3, (q15_t)0x3cde, + (q15_t)0x3cd8, (q15_t)0x3cd3, (q15_t)0x3ccd, (q15_t)0x3cc8, (q15_t)0x3cc2, (q15_t)0x3cbd, (q15_t)0x3cb7, (q15_t)0x3cb2, + (q15_t)0x3cac, (q15_t)0x3ca7, (q15_t)0x3ca1, (q15_t)0x3c9b, (q15_t)0x3c96, (q15_t)0x3c90, (q15_t)0x3c8b, (q15_t)0x3c85, + (q15_t)0x3c80, (q15_t)0x3c7a, (q15_t)0x3c75, (q15_t)0x3c6f, (q15_t)0x3c6a, (q15_t)0x3c64, (q15_t)0x3c5f, (q15_t)0x3c59, + (q15_t)0x3c53, (q15_t)0x3c4e, (q15_t)0x3c48, (q15_t)0x3c43, (q15_t)0x3c3d, (q15_t)0x3c38, (q15_t)0x3c32, (q15_t)0x3c2d, + (q15_t)0x3c27, (q15_t)0x3c22, (q15_t)0x3c1c, (q15_t)0x3c16, (q15_t)0x3c11, (q15_t)0x3c0b, (q15_t)0x3c06, (q15_t)0x3c00, + (q15_t)0x3bfb, (q15_t)0x3bf5, (q15_t)0x3bf0, (q15_t)0x3bea, (q15_t)0x3be5, (q15_t)0x3bdf, (q15_t)0x3bd9, (q15_t)0x3bd4, + (q15_t)0x3bce, (q15_t)0x3bc9, (q15_t)0x3bc3, (q15_t)0x3bbe, (q15_t)0x3bb8, (q15_t)0x3bb3, (q15_t)0x3bad, (q15_t)0x3ba7, + (q15_t)0x3ba2, (q15_t)0x3b9c, (q15_t)0x3b97, (q15_t)0x3b91, (q15_t)0x3b8c, (q15_t)0x3b86, (q15_t)0x3b80, (q15_t)0x3b7b, + (q15_t)0x3b75, (q15_t)0x3b70, (q15_t)0x3b6a, (q15_t)0x3b65, (q15_t)0x3b5f, (q15_t)0x3b5a, (q15_t)0x3b54, (q15_t)0x3b4e, + (q15_t)0x3b49, (q15_t)0x3b43, (q15_t)0x3b3e, (q15_t)0x3b38, (q15_t)0x3b33, (q15_t)0x3b2d, (q15_t)0x3b27, (q15_t)0x3b22, + (q15_t)0x3b1c, (q15_t)0x3b17, (q15_t)0x3b11, (q15_t)0x3b0c, (q15_t)0x3b06, (q15_t)0x3b00, (q15_t)0x3afb, (q15_t)0x3af5, + (q15_t)0x3af0, (q15_t)0x3aea, (q15_t)0x3ae4, (q15_t)0x3adf, (q15_t)0x3ad9, (q15_t)0x3ad4, (q15_t)0x3ace, (q15_t)0x3ac9, + (q15_t)0x3ac3, (q15_t)0x3abd, (q15_t)0x3ab8, (q15_t)0x3ab2, (q15_t)0x3aad, (q15_t)0x3aa7, (q15_t)0x3aa2, (q15_t)0x3a9c, + (q15_t)0x3a96, (q15_t)0x3a91, (q15_t)0x3a8b, (q15_t)0x3a86, (q15_t)0x3a80, (q15_t)0x3a7a, (q15_t)0x3a75, (q15_t)0x3a6f, + (q15_t)0x3a6a, (q15_t)0x3a64, (q15_t)0x3a5e, (q15_t)0x3a59, (q15_t)0x3a53, (q15_t)0x3a4e, (q15_t)0x3a48, (q15_t)0x3a42, + (q15_t)0x3a3d, (q15_t)0x3a37, (q15_t)0x3a32, (q15_t)0x3a2c, (q15_t)0x3a26, (q15_t)0x3a21, (q15_t)0x3a1b, (q15_t)0x3a16, + (q15_t)0x3a10, (q15_t)0x3a0b, (q15_t)0x3a05, (q15_t)0x39ff, (q15_t)0x39fa, (q15_t)0x39f4, (q15_t)0x39ee, (q15_t)0x39e9, + (q15_t)0x39e3, (q15_t)0x39de, (q15_t)0x39d8, (q15_t)0x39d2, (q15_t)0x39cd, (q15_t)0x39c7, (q15_t)0x39c2, (q15_t)0x39bc, + (q15_t)0x39b6, (q15_t)0x39b1, (q15_t)0x39ab, (q15_t)0x39a6, (q15_t)0x39a0, (q15_t)0x399a, (q15_t)0x3995, (q15_t)0x398f, + (q15_t)0x398a, (q15_t)0x3984, (q15_t)0x397e, (q15_t)0x3979, (q15_t)0x3973, (q15_t)0x396d, (q15_t)0x3968, (q15_t)0x3962, + (q15_t)0x395d, (q15_t)0x3957, (q15_t)0x3951, (q15_t)0x394c, (q15_t)0x3946, (q15_t)0x3941, (q15_t)0x393b, (q15_t)0x3935, + (q15_t)0x3930, (q15_t)0x392a, (q15_t)0x3924, (q15_t)0x391f, (q15_t)0x3919, (q15_t)0x3914, (q15_t)0x390e, (q15_t)0x3908, + (q15_t)0x3903, (q15_t)0x38fd, (q15_t)0x38f7, (q15_t)0x38f2, (q15_t)0x38ec, (q15_t)0x38e7, (q15_t)0x38e1, (q15_t)0x38db, + (q15_t)0x38d6, (q15_t)0x38d0, (q15_t)0x38ca, (q15_t)0x38c5, (q15_t)0x38bf, (q15_t)0x38ba, (q15_t)0x38b4, (q15_t)0x38ae, + (q15_t)0x38a9, (q15_t)0x38a3, (q15_t)0x389d, (q15_t)0x3898, (q15_t)0x3892, (q15_t)0x388c, (q15_t)0x3887, (q15_t)0x3881, + (q15_t)0x387c, (q15_t)0x3876, (q15_t)0x3870, (q15_t)0x386b, (q15_t)0x3865, (q15_t)0x385f, (q15_t)0x385a, (q15_t)0x3854, + (q15_t)0x384e, (q15_t)0x3849, (q15_t)0x3843, (q15_t)0x383d, (q15_t)0x3838, (q15_t)0x3832, (q15_t)0x382d, (q15_t)0x3827, + (q15_t)0x3821, (q15_t)0x381c, (q15_t)0x3816, (q15_t)0x3810, (q15_t)0x380b, (q15_t)0x3805, (q15_t)0x37ff, (q15_t)0x37fa, + (q15_t)0x37f4, (q15_t)0x37ee, (q15_t)0x37e9, (q15_t)0x37e3, (q15_t)0x37dd, (q15_t)0x37d8, (q15_t)0x37d2, (q15_t)0x37cc, + (q15_t)0x37c7, (q15_t)0x37c1, (q15_t)0x37bc, (q15_t)0x37b6, (q15_t)0x37b0, (q15_t)0x37ab, (q15_t)0x37a5, (q15_t)0x379f, + (q15_t)0x379a, (q15_t)0x3794, (q15_t)0x378e, (q15_t)0x3789, (q15_t)0x3783, (q15_t)0x377d, (q15_t)0x3778, (q15_t)0x3772, + (q15_t)0x376c, (q15_t)0x3767, (q15_t)0x3761, (q15_t)0x375b, (q15_t)0x3756, (q15_t)0x3750, (q15_t)0x374a, (q15_t)0x3745, + (q15_t)0x373f, (q15_t)0x3739, (q15_t)0x3734, (q15_t)0x372e, (q15_t)0x3728, (q15_t)0x3723, (q15_t)0x371d, (q15_t)0x3717, + (q15_t)0x3712, (q15_t)0x370c, (q15_t)0x3706, (q15_t)0x3701, (q15_t)0x36fb, (q15_t)0x36f5, (q15_t)0x36f0, (q15_t)0x36ea, + (q15_t)0x36e4, (q15_t)0x36df, (q15_t)0x36d9, (q15_t)0x36d3, (q15_t)0x36ce, (q15_t)0x36c8, (q15_t)0x36c2, (q15_t)0x36bc, + (q15_t)0x36b7, (q15_t)0x36b1, (q15_t)0x36ab, (q15_t)0x36a6, (q15_t)0x36a0, (q15_t)0x369a, (q15_t)0x3695, (q15_t)0x368f, + (q15_t)0x3689, (q15_t)0x3684, (q15_t)0x367e, (q15_t)0x3678, (q15_t)0x3673, (q15_t)0x366d, (q15_t)0x3667, (q15_t)0x3662, + (q15_t)0x365c, (q15_t)0x3656, (q15_t)0x3650, (q15_t)0x364b, (q15_t)0x3645, (q15_t)0x363f, (q15_t)0x363a, (q15_t)0x3634, + (q15_t)0x362e, (q15_t)0x3629, (q15_t)0x3623, (q15_t)0x361d, (q15_t)0x3618, (q15_t)0x3612, (q15_t)0x360c, (q15_t)0x3606, + (q15_t)0x3601, (q15_t)0x35fb, (q15_t)0x35f5, (q15_t)0x35f0, (q15_t)0x35ea, (q15_t)0x35e4, (q15_t)0x35df, (q15_t)0x35d9, + (q15_t)0x35d3, (q15_t)0x35cd, (q15_t)0x35c8, (q15_t)0x35c2, (q15_t)0x35bc, (q15_t)0x35b7, (q15_t)0x35b1, (q15_t)0x35ab, + (q15_t)0x35a6, (q15_t)0x35a0, (q15_t)0x359a, (q15_t)0x3594, (q15_t)0x358f, (q15_t)0x3589, (q15_t)0x3583, (q15_t)0x357e, + (q15_t)0x3578, (q15_t)0x3572, (q15_t)0x356c, (q15_t)0x3567, (q15_t)0x3561, (q15_t)0x355b, (q15_t)0x3556, (q15_t)0x3550, + (q15_t)0x354a, (q15_t)0x3544, (q15_t)0x353f, (q15_t)0x3539, (q15_t)0x3533, (q15_t)0x352e, (q15_t)0x3528, (q15_t)0x3522, + (q15_t)0x351c, (q15_t)0x3517, (q15_t)0x3511, (q15_t)0x350b, (q15_t)0x3506, (q15_t)0x3500, (q15_t)0x34fa, (q15_t)0x34f4, + (q15_t)0x34ef, (q15_t)0x34e9, (q15_t)0x34e3, (q15_t)0x34de, (q15_t)0x34d8, (q15_t)0x34d2, (q15_t)0x34cc, (q15_t)0x34c7, + (q15_t)0x34c1, (q15_t)0x34bb, (q15_t)0x34b6, (q15_t)0x34b0, (q15_t)0x34aa, (q15_t)0x34a4, (q15_t)0x349f, (q15_t)0x3499, + (q15_t)0x3493, (q15_t)0x348d, (q15_t)0x3488, (q15_t)0x3482, (q15_t)0x347c, (q15_t)0x3476, (q15_t)0x3471, (q15_t)0x346b, + (q15_t)0x3465, (q15_t)0x3460, (q15_t)0x345a, (q15_t)0x3454, (q15_t)0x344e, (q15_t)0x3449, (q15_t)0x3443, (q15_t)0x343d, + (q15_t)0x3437, (q15_t)0x3432, (q15_t)0x342c, (q15_t)0x3426, (q15_t)0x3420, (q15_t)0x341b, (q15_t)0x3415, (q15_t)0x340f, + (q15_t)0x340a, (q15_t)0x3404, (q15_t)0x33fe, (q15_t)0x33f8, (q15_t)0x33f3, (q15_t)0x33ed, (q15_t)0x33e7, (q15_t)0x33e1, + (q15_t)0x33dc, (q15_t)0x33d6, (q15_t)0x33d0, (q15_t)0x33ca, (q15_t)0x33c5, (q15_t)0x33bf, (q15_t)0x33b9, (q15_t)0x33b3, + (q15_t)0x33ae, (q15_t)0x33a8, (q15_t)0x33a2, (q15_t)0x339c, (q15_t)0x3397, (q15_t)0x3391, (q15_t)0x338b, (q15_t)0x3385, + (q15_t)0x3380, (q15_t)0x337a, (q15_t)0x3374, (q15_t)0x336e, (q15_t)0x3369, (q15_t)0x3363, (q15_t)0x335d, (q15_t)0x3357, + (q15_t)0x3352, (q15_t)0x334c, (q15_t)0x3346, (q15_t)0x3340, (q15_t)0x333b, (q15_t)0x3335, (q15_t)0x332f, (q15_t)0x3329, + (q15_t)0x3324, (q15_t)0x331e, (q15_t)0x3318, (q15_t)0x3312, (q15_t)0x330c, (q15_t)0x3307, (q15_t)0x3301, (q15_t)0x32fb, + (q15_t)0x32f5, (q15_t)0x32f0, (q15_t)0x32ea, (q15_t)0x32e4, (q15_t)0x32de, (q15_t)0x32d9, (q15_t)0x32d3, (q15_t)0x32cd, + (q15_t)0x32c7, (q15_t)0x32c2, (q15_t)0x32bc, (q15_t)0x32b6, (q15_t)0x32b0, (q15_t)0x32aa, (q15_t)0x32a5, (q15_t)0x329f, + (q15_t)0x3299, (q15_t)0x3293, (q15_t)0x328e, (q15_t)0x3288, (q15_t)0x3282, (q15_t)0x327c, (q15_t)0x3276, (q15_t)0x3271, + (q15_t)0x326b, (q15_t)0x3265, (q15_t)0x325f, (q15_t)0x325a, (q15_t)0x3254, (q15_t)0x324e, (q15_t)0x3248, (q15_t)0x3243, + (q15_t)0x323d, (q15_t)0x3237, (q15_t)0x3231, (q15_t)0x322b, (q15_t)0x3226, (q15_t)0x3220, (q15_t)0x321a, (q15_t)0x3214, + (q15_t)0x320e, (q15_t)0x3209, (q15_t)0x3203, (q15_t)0x31fd, (q15_t)0x31f7, (q15_t)0x31f2, (q15_t)0x31ec, (q15_t)0x31e6, + (q15_t)0x31e0, (q15_t)0x31da, (q15_t)0x31d5, (q15_t)0x31cf, (q15_t)0x31c9, (q15_t)0x31c3, (q15_t)0x31bd, (q15_t)0x31b8, + (q15_t)0x31b2, (q15_t)0x31ac, (q15_t)0x31a6, (q15_t)0x31a1, (q15_t)0x319b, (q15_t)0x3195, (q15_t)0x318f, (q15_t)0x3189, + (q15_t)0x3184, (q15_t)0x317e, (q15_t)0x3178, (q15_t)0x3172, (q15_t)0x316c, (q15_t)0x3167, (q15_t)0x3161, (q15_t)0x315b, + (q15_t)0x3155, (q15_t)0x314f, (q15_t)0x314a, (q15_t)0x3144, (q15_t)0x313e, (q15_t)0x3138, (q15_t)0x3132, (q15_t)0x312d, + (q15_t)0x3127, (q15_t)0x3121, (q15_t)0x311b, (q15_t)0x3115, (q15_t)0x3110, (q15_t)0x310a, (q15_t)0x3104, (q15_t)0x30fe, + (q15_t)0x30f8, (q15_t)0x30f3, (q15_t)0x30ed, (q15_t)0x30e7, (q15_t)0x30e1, (q15_t)0x30db, (q15_t)0x30d6, (q15_t)0x30d0, + (q15_t)0x30ca, (q15_t)0x30c4, (q15_t)0x30be, (q15_t)0x30b8, (q15_t)0x30b3, (q15_t)0x30ad, (q15_t)0x30a7, (q15_t)0x30a1, + (q15_t)0x309b, (q15_t)0x3096, (q15_t)0x3090, (q15_t)0x308a, (q15_t)0x3084, (q15_t)0x307e, (q15_t)0x3079, (q15_t)0x3073, + (q15_t)0x306d, (q15_t)0x3067, (q15_t)0x3061, (q15_t)0x305b, (q15_t)0x3056, (q15_t)0x3050, (q15_t)0x304a, (q15_t)0x3044, + (q15_t)0x303e, (q15_t)0x3039, (q15_t)0x3033, (q15_t)0x302d, (q15_t)0x3027, (q15_t)0x3021, (q15_t)0x301b, (q15_t)0x3016, + (q15_t)0x3010, (q15_t)0x300a, (q15_t)0x3004, (q15_t)0x2ffe, (q15_t)0x2ff8, (q15_t)0x2ff3, (q15_t)0x2fed, (q15_t)0x2fe7, + (q15_t)0x2fe1, (q15_t)0x2fdb, (q15_t)0x2fd6, (q15_t)0x2fd0, (q15_t)0x2fca, (q15_t)0x2fc4, (q15_t)0x2fbe, (q15_t)0x2fb8, + (q15_t)0x2fb3, (q15_t)0x2fad, (q15_t)0x2fa7, (q15_t)0x2fa1, (q15_t)0x2f9b, (q15_t)0x2f95, (q15_t)0x2f90, (q15_t)0x2f8a, + (q15_t)0x2f84, (q15_t)0x2f7e, (q15_t)0x2f78, (q15_t)0x2f72, (q15_t)0x2f6d, (q15_t)0x2f67, (q15_t)0x2f61, (q15_t)0x2f5b, + (q15_t)0x2f55, (q15_t)0x2f4f, (q15_t)0x2f4a, (q15_t)0x2f44, (q15_t)0x2f3e, (q15_t)0x2f38, (q15_t)0x2f32, (q15_t)0x2f2c, + (q15_t)0x2f27, (q15_t)0x2f21, (q15_t)0x2f1b, (q15_t)0x2f15, (q15_t)0x2f0f, (q15_t)0x2f09, (q15_t)0x2f03, (q15_t)0x2efe, + (q15_t)0x2ef8, (q15_t)0x2ef2, (q15_t)0x2eec, (q15_t)0x2ee6, (q15_t)0x2ee0, (q15_t)0x2edb, (q15_t)0x2ed5, (q15_t)0x2ecf, + (q15_t)0x2ec9, (q15_t)0x2ec3, (q15_t)0x2ebd, (q15_t)0x2eb7, (q15_t)0x2eb2, (q15_t)0x2eac, (q15_t)0x2ea6, (q15_t)0x2ea0, + (q15_t)0x2e9a, (q15_t)0x2e94, (q15_t)0x2e8e, (q15_t)0x2e89, (q15_t)0x2e83, (q15_t)0x2e7d, (q15_t)0x2e77, (q15_t)0x2e71, + (q15_t)0x2e6b, (q15_t)0x2e65, (q15_t)0x2e60, (q15_t)0x2e5a, (q15_t)0x2e54, (q15_t)0x2e4e, (q15_t)0x2e48, (q15_t)0x2e42, + (q15_t)0x2e3c, (q15_t)0x2e37, (q15_t)0x2e31, (q15_t)0x2e2b, (q15_t)0x2e25, (q15_t)0x2e1f, (q15_t)0x2e19, (q15_t)0x2e13, + (q15_t)0x2e0e, (q15_t)0x2e08, (q15_t)0x2e02, (q15_t)0x2dfc, (q15_t)0x2df6, (q15_t)0x2df0, (q15_t)0x2dea, (q15_t)0x2de5, + (q15_t)0x2ddf, (q15_t)0x2dd9, (q15_t)0x2dd3, (q15_t)0x2dcd, (q15_t)0x2dc7, (q15_t)0x2dc1, (q15_t)0x2dbb, (q15_t)0x2db6, + (q15_t)0x2db0, (q15_t)0x2daa, (q15_t)0x2da4, (q15_t)0x2d9e, (q15_t)0x2d98, (q15_t)0x2d92, (q15_t)0x2d8d, (q15_t)0x2d87, + (q15_t)0x2d81, (q15_t)0x2d7b, (q15_t)0x2d75, (q15_t)0x2d6f, (q15_t)0x2d69, (q15_t)0x2d63, (q15_t)0x2d5e, (q15_t)0x2d58, + (q15_t)0x2d52, (q15_t)0x2d4c, (q15_t)0x2d46, (q15_t)0x2d40, (q15_t)0x2d3a, (q15_t)0x2d34, (q15_t)0x2d2f, (q15_t)0x2d29, + (q15_t)0x2d23, (q15_t)0x2d1d, (q15_t)0x2d17, (q15_t)0x2d11, (q15_t)0x2d0b, (q15_t)0x2d05, (q15_t)0x2cff, (q15_t)0x2cfa, + (q15_t)0x2cf4, (q15_t)0x2cee, (q15_t)0x2ce8, (q15_t)0x2ce2, (q15_t)0x2cdc, (q15_t)0x2cd6, (q15_t)0x2cd0, (q15_t)0x2ccb, + (q15_t)0x2cc5, (q15_t)0x2cbf, (q15_t)0x2cb9, (q15_t)0x2cb3, (q15_t)0x2cad, (q15_t)0x2ca7, (q15_t)0x2ca1, (q15_t)0x2c9b, + (q15_t)0x2c96, (q15_t)0x2c90, (q15_t)0x2c8a, (q15_t)0x2c84, (q15_t)0x2c7e, (q15_t)0x2c78, (q15_t)0x2c72, (q15_t)0x2c6c, + (q15_t)0x2c66, (q15_t)0x2c61, (q15_t)0x2c5b, (q15_t)0x2c55, (q15_t)0x2c4f, (q15_t)0x2c49, (q15_t)0x2c43, (q15_t)0x2c3d, + (q15_t)0x2c37, (q15_t)0x2c31, (q15_t)0x2c2b, (q15_t)0x2c26, (q15_t)0x2c20, (q15_t)0x2c1a, (q15_t)0x2c14, (q15_t)0x2c0e, + (q15_t)0x2c08, (q15_t)0x2c02, (q15_t)0x2bfc, (q15_t)0x2bf6, (q15_t)0x2bf0, (q15_t)0x2beb, (q15_t)0x2be5, (q15_t)0x2bdf, + (q15_t)0x2bd9, (q15_t)0x2bd3, (q15_t)0x2bcd, (q15_t)0x2bc7, (q15_t)0x2bc1, (q15_t)0x2bbb, (q15_t)0x2bb5, (q15_t)0x2bb0, + (q15_t)0x2baa, (q15_t)0x2ba4, (q15_t)0x2b9e, (q15_t)0x2b98, (q15_t)0x2b92, (q15_t)0x2b8c, (q15_t)0x2b86, (q15_t)0x2b80, + (q15_t)0x2b7a, (q15_t)0x2b74, (q15_t)0x2b6f, (q15_t)0x2b69, (q15_t)0x2b63, (q15_t)0x2b5d, (q15_t)0x2b57, (q15_t)0x2b51, + (q15_t)0x2b4b, (q15_t)0x2b45, (q15_t)0x2b3f, (q15_t)0x2b39, (q15_t)0x2b33, (q15_t)0x2b2d, (q15_t)0x2b28, (q15_t)0x2b22, + (q15_t)0x2b1c, (q15_t)0x2b16, (q15_t)0x2b10, (q15_t)0x2b0a, (q15_t)0x2b04, (q15_t)0x2afe, (q15_t)0x2af8, (q15_t)0x2af2, + (q15_t)0x2aec, (q15_t)0x2ae6, (q15_t)0x2ae1, (q15_t)0x2adb, (q15_t)0x2ad5, (q15_t)0x2acf, (q15_t)0x2ac9, (q15_t)0x2ac3, + (q15_t)0x2abd, (q15_t)0x2ab7, (q15_t)0x2ab1, (q15_t)0x2aab, (q15_t)0x2aa5, (q15_t)0x2a9f, (q15_t)0x2a99, (q15_t)0x2a94, + (q15_t)0x2a8e, (q15_t)0x2a88, (q15_t)0x2a82, (q15_t)0x2a7c, (q15_t)0x2a76, (q15_t)0x2a70, (q15_t)0x2a6a, (q15_t)0x2a64, + (q15_t)0x2a5e, (q15_t)0x2a58, (q15_t)0x2a52, (q15_t)0x2a4c, (q15_t)0x2a47, (q15_t)0x2a41, (q15_t)0x2a3b, (q15_t)0x2a35, + (q15_t)0x2a2f, (q15_t)0x2a29, (q15_t)0x2a23, (q15_t)0x2a1d, (q15_t)0x2a17, (q15_t)0x2a11, (q15_t)0x2a0b, (q15_t)0x2a05, + (q15_t)0x29ff, (q15_t)0x29f9, (q15_t)0x29f3, (q15_t)0x29ee, (q15_t)0x29e8, (q15_t)0x29e2, (q15_t)0x29dc, (q15_t)0x29d6, + (q15_t)0x29d0, (q15_t)0x29ca, (q15_t)0x29c4, (q15_t)0x29be, (q15_t)0x29b8, (q15_t)0x29b2, (q15_t)0x29ac, (q15_t)0x29a6, + (q15_t)0x29a0, (q15_t)0x299a, (q15_t)0x2994, (q15_t)0x298e, (q15_t)0x2989, (q15_t)0x2983, (q15_t)0x297d, (q15_t)0x2977, + (q15_t)0x2971, (q15_t)0x296b, (q15_t)0x2965, (q15_t)0x295f, (q15_t)0x2959, (q15_t)0x2953, (q15_t)0x294d, (q15_t)0x2947, + (q15_t)0x2941, (q15_t)0x293b, (q15_t)0x2935, (q15_t)0x292f, (q15_t)0x2929, (q15_t)0x2923, (q15_t)0x291d, (q15_t)0x2918, + (q15_t)0x2912, (q15_t)0x290c, (q15_t)0x2906, (q15_t)0x2900, (q15_t)0x28fa, (q15_t)0x28f4, (q15_t)0x28ee, (q15_t)0x28e8, + (q15_t)0x28e2, (q15_t)0x28dc, (q15_t)0x28d6, (q15_t)0x28d0, (q15_t)0x28ca, (q15_t)0x28c4, (q15_t)0x28be, (q15_t)0x28b8, + (q15_t)0x28b2, (q15_t)0x28ac, (q15_t)0x28a6, (q15_t)0x28a0, (q15_t)0x289a, (q15_t)0x2895, (q15_t)0x288f, (q15_t)0x2889, + (q15_t)0x2883, (q15_t)0x287d, (q15_t)0x2877, (q15_t)0x2871, (q15_t)0x286b, (q15_t)0x2865, (q15_t)0x285f, (q15_t)0x2859, + (q15_t)0x2853, (q15_t)0x284d, (q15_t)0x2847, (q15_t)0x2841, (q15_t)0x283b, (q15_t)0x2835, (q15_t)0x282f, (q15_t)0x2829, + (q15_t)0x2823, (q15_t)0x281d, (q15_t)0x2817, (q15_t)0x2811, (q15_t)0x280b, (q15_t)0x2805, (q15_t)0x27ff, (q15_t)0x27f9, + (q15_t)0x27f3, (q15_t)0x27ee, (q15_t)0x27e8, (q15_t)0x27e2, (q15_t)0x27dc, (q15_t)0x27d6, (q15_t)0x27d0, (q15_t)0x27ca, + (q15_t)0x27c4, (q15_t)0x27be, (q15_t)0x27b8, (q15_t)0x27b2, (q15_t)0x27ac, (q15_t)0x27a6, (q15_t)0x27a0, (q15_t)0x279a, + (q15_t)0x2794, (q15_t)0x278e, (q15_t)0x2788, (q15_t)0x2782, (q15_t)0x277c, (q15_t)0x2776, (q15_t)0x2770, (q15_t)0x276a, + (q15_t)0x2764, (q15_t)0x275e, (q15_t)0x2758, (q15_t)0x2752, (q15_t)0x274c, (q15_t)0x2746, (q15_t)0x2740, (q15_t)0x273a, + (q15_t)0x2734, (q15_t)0x272e, (q15_t)0x2728, (q15_t)0x2722, (q15_t)0x271c, (q15_t)0x2716, (q15_t)0x2710, (q15_t)0x270a, + (q15_t)0x2704, (q15_t)0x26fe, (q15_t)0x26f8, (q15_t)0x26f2, (q15_t)0x26ec, (q15_t)0x26e7, (q15_t)0x26e1, (q15_t)0x26db, + (q15_t)0x26d5, (q15_t)0x26cf, (q15_t)0x26c9, (q15_t)0x26c3, (q15_t)0x26bd, (q15_t)0x26b7, (q15_t)0x26b1, (q15_t)0x26ab, + (q15_t)0x26a5, (q15_t)0x269f, (q15_t)0x2699, (q15_t)0x2693, (q15_t)0x268d, (q15_t)0x2687, (q15_t)0x2681, (q15_t)0x267b, + (q15_t)0x2675, (q15_t)0x266f, (q15_t)0x2669, (q15_t)0x2663, (q15_t)0x265d, (q15_t)0x2657, (q15_t)0x2651, (q15_t)0x264b, + (q15_t)0x2645, (q15_t)0x263f, (q15_t)0x2639, (q15_t)0x2633, (q15_t)0x262d, (q15_t)0x2627, (q15_t)0x2621, (q15_t)0x261b, + (q15_t)0x2615, (q15_t)0x260f, (q15_t)0x2609, (q15_t)0x2603, (q15_t)0x25fd, (q15_t)0x25f7, (q15_t)0x25f1, (q15_t)0x25eb, + (q15_t)0x25e5, (q15_t)0x25df, (q15_t)0x25d9, (q15_t)0x25d3, (q15_t)0x25cd, (q15_t)0x25c7, (q15_t)0x25c1, (q15_t)0x25bb, + (q15_t)0x25b5, (q15_t)0x25af, (q15_t)0x25a9, (q15_t)0x25a3, (q15_t)0x259d, (q15_t)0x2597, (q15_t)0x2591, (q15_t)0x258b, + (q15_t)0x2585, (q15_t)0x257f, (q15_t)0x2579, (q15_t)0x2573, (q15_t)0x256d, (q15_t)0x2567, (q15_t)0x2561, (q15_t)0x255b, + (q15_t)0x2555, (q15_t)0x254f, (q15_t)0x2549, (q15_t)0x2543, (q15_t)0x253d, (q15_t)0x2537, (q15_t)0x2531, (q15_t)0x252b, + (q15_t)0x2525, (q15_t)0x251f, (q15_t)0x2519, (q15_t)0x2513, (q15_t)0x250c, (q15_t)0x2506, (q15_t)0x2500, (q15_t)0x24fa, + (q15_t)0x24f4, (q15_t)0x24ee, (q15_t)0x24e8, (q15_t)0x24e2, (q15_t)0x24dc, (q15_t)0x24d6, (q15_t)0x24d0, (q15_t)0x24ca, + (q15_t)0x24c4, (q15_t)0x24be, (q15_t)0x24b8, (q15_t)0x24b2, (q15_t)0x24ac, (q15_t)0x24a6, (q15_t)0x24a0, (q15_t)0x249a, + (q15_t)0x2494, (q15_t)0x248e, (q15_t)0x2488, (q15_t)0x2482, (q15_t)0x247c, (q15_t)0x2476, (q15_t)0x2470, (q15_t)0x246a, + (q15_t)0x2464, (q15_t)0x245e, (q15_t)0x2458, (q15_t)0x2452, (q15_t)0x244c, (q15_t)0x2446, (q15_t)0x2440, (q15_t)0x243a, + (q15_t)0x2434, (q15_t)0x242e, (q15_t)0x2428, (q15_t)0x2422, (q15_t)0x241c, (q15_t)0x2416, (q15_t)0x2410, (q15_t)0x240a, + (q15_t)0x2404, (q15_t)0x23fd, (q15_t)0x23f7, (q15_t)0x23f1, (q15_t)0x23eb, (q15_t)0x23e5, (q15_t)0x23df, (q15_t)0x23d9, + (q15_t)0x23d3, (q15_t)0x23cd, (q15_t)0x23c7, (q15_t)0x23c1, (q15_t)0x23bb, (q15_t)0x23b5, (q15_t)0x23af, (q15_t)0x23a9, + (q15_t)0x23a3, (q15_t)0x239d, (q15_t)0x2397, (q15_t)0x2391, (q15_t)0x238b, (q15_t)0x2385, (q15_t)0x237f, (q15_t)0x2379, + (q15_t)0x2373, (q15_t)0x236d, (q15_t)0x2367, (q15_t)0x2361, (q15_t)0x235b, (q15_t)0x2355, (q15_t)0x234e, (q15_t)0x2348, + (q15_t)0x2342, (q15_t)0x233c, (q15_t)0x2336, (q15_t)0x2330, (q15_t)0x232a, (q15_t)0x2324, (q15_t)0x231e, (q15_t)0x2318, + (q15_t)0x2312, (q15_t)0x230c, (q15_t)0x2306, (q15_t)0x2300, (q15_t)0x22fa, (q15_t)0x22f4, (q15_t)0x22ee, (q15_t)0x22e8, + (q15_t)0x22e2, (q15_t)0x22dc, (q15_t)0x22d6, (q15_t)0x22d0, (q15_t)0x22ca, (q15_t)0x22c4, (q15_t)0x22bd, (q15_t)0x22b7, + (q15_t)0x22b1, (q15_t)0x22ab, (q15_t)0x22a5, (q15_t)0x229f, (q15_t)0x2299, (q15_t)0x2293, (q15_t)0x228d, (q15_t)0x2287, + (q15_t)0x2281, (q15_t)0x227b, (q15_t)0x2275, (q15_t)0x226f, (q15_t)0x2269, (q15_t)0x2263, (q15_t)0x225d, (q15_t)0x2257, + (q15_t)0x2251, (q15_t)0x224a, (q15_t)0x2244, (q15_t)0x223e, (q15_t)0x2238, (q15_t)0x2232, (q15_t)0x222c, (q15_t)0x2226, + (q15_t)0x2220, (q15_t)0x221a, (q15_t)0x2214, (q15_t)0x220e, (q15_t)0x2208, (q15_t)0x2202, (q15_t)0x21fc, (q15_t)0x21f6, + (q15_t)0x21f0, (q15_t)0x21ea, (q15_t)0x21e4, (q15_t)0x21dd, (q15_t)0x21d7, (q15_t)0x21d1, (q15_t)0x21cb, (q15_t)0x21c5, + (q15_t)0x21bf, (q15_t)0x21b9, (q15_t)0x21b3, (q15_t)0x21ad, (q15_t)0x21a7, (q15_t)0x21a1, (q15_t)0x219b, (q15_t)0x2195, + (q15_t)0x218f, (q15_t)0x2189, (q15_t)0x2183, (q15_t)0x217c, (q15_t)0x2176, (q15_t)0x2170, (q15_t)0x216a, (q15_t)0x2164, + (q15_t)0x215e, (q15_t)0x2158, (q15_t)0x2152, (q15_t)0x214c, (q15_t)0x2146, (q15_t)0x2140, (q15_t)0x213a, (q15_t)0x2134, + (q15_t)0x212e, (q15_t)0x2128, (q15_t)0x2121, (q15_t)0x211b, (q15_t)0x2115, (q15_t)0x210f, (q15_t)0x2109, (q15_t)0x2103, + (q15_t)0x20fd, (q15_t)0x20f7, (q15_t)0x20f1, (q15_t)0x20eb, (q15_t)0x20e5, (q15_t)0x20df, (q15_t)0x20d9, (q15_t)0x20d3, + (q15_t)0x20cc, (q15_t)0x20c6, (q15_t)0x20c0, (q15_t)0x20ba, (q15_t)0x20b4, (q15_t)0x20ae, (q15_t)0x20a8, (q15_t)0x20a2, + (q15_t)0x209c, (q15_t)0x2096, (q15_t)0x2090, (q15_t)0x208a, (q15_t)0x2084, (q15_t)0x207e, (q15_t)0x2077, (q15_t)0x2071, + (q15_t)0x206b, (q15_t)0x2065, (q15_t)0x205f, (q15_t)0x2059, (q15_t)0x2053, (q15_t)0x204d, (q15_t)0x2047, (q15_t)0x2041, + (q15_t)0x203b, (q15_t)0x2035, (q15_t)0x202e, (q15_t)0x2028, (q15_t)0x2022, (q15_t)0x201c, (q15_t)0x2016, (q15_t)0x2010, + (q15_t)0x200a, (q15_t)0x2004, (q15_t)0x1ffe, (q15_t)0x1ff8, (q15_t)0x1ff2, (q15_t)0x1fec, (q15_t)0x1fe5, (q15_t)0x1fdf, + (q15_t)0x1fd9, (q15_t)0x1fd3, (q15_t)0x1fcd, (q15_t)0x1fc7, (q15_t)0x1fc1, (q15_t)0x1fbb, (q15_t)0x1fb5, (q15_t)0x1faf, + (q15_t)0x1fa9, (q15_t)0x1fa3, (q15_t)0x1f9c, (q15_t)0x1f96, (q15_t)0x1f90, (q15_t)0x1f8a, (q15_t)0x1f84, (q15_t)0x1f7e, + (q15_t)0x1f78, (q15_t)0x1f72, (q15_t)0x1f6c, (q15_t)0x1f66, (q15_t)0x1f60, (q15_t)0x1f59, (q15_t)0x1f53, (q15_t)0x1f4d, + (q15_t)0x1f47, (q15_t)0x1f41, (q15_t)0x1f3b, (q15_t)0x1f35, (q15_t)0x1f2f, (q15_t)0x1f29, (q15_t)0x1f23, (q15_t)0x1f1d, + (q15_t)0x1f16, (q15_t)0x1f10, (q15_t)0x1f0a, (q15_t)0x1f04, (q15_t)0x1efe, (q15_t)0x1ef8, (q15_t)0x1ef2, (q15_t)0x1eec, + (q15_t)0x1ee6, (q15_t)0x1ee0, (q15_t)0x1ed9, (q15_t)0x1ed3, (q15_t)0x1ecd, (q15_t)0x1ec7, (q15_t)0x1ec1, (q15_t)0x1ebb, + (q15_t)0x1eb5, (q15_t)0x1eaf, (q15_t)0x1ea9, (q15_t)0x1ea3, (q15_t)0x1e9c, (q15_t)0x1e96, (q15_t)0x1e90, (q15_t)0x1e8a, + (q15_t)0x1e84, (q15_t)0x1e7e, (q15_t)0x1e78, (q15_t)0x1e72, (q15_t)0x1e6c, (q15_t)0x1e66, (q15_t)0x1e5f, (q15_t)0x1e59, + (q15_t)0x1e53, (q15_t)0x1e4d, (q15_t)0x1e47, (q15_t)0x1e41, (q15_t)0x1e3b, (q15_t)0x1e35, (q15_t)0x1e2f, (q15_t)0x1e29, + (q15_t)0x1e22, (q15_t)0x1e1c, (q15_t)0x1e16, (q15_t)0x1e10, (q15_t)0x1e0a, (q15_t)0x1e04, (q15_t)0x1dfe, (q15_t)0x1df8, + (q15_t)0x1df2, (q15_t)0x1deb, (q15_t)0x1de5, (q15_t)0x1ddf, (q15_t)0x1dd9, (q15_t)0x1dd3, (q15_t)0x1dcd, (q15_t)0x1dc7, + (q15_t)0x1dc1, (q15_t)0x1dbb, (q15_t)0x1db4, (q15_t)0x1dae, (q15_t)0x1da8, (q15_t)0x1da2, (q15_t)0x1d9c, (q15_t)0x1d96, + (q15_t)0x1d90, (q15_t)0x1d8a, (q15_t)0x1d84, (q15_t)0x1d7d, (q15_t)0x1d77, (q15_t)0x1d71, (q15_t)0x1d6b, (q15_t)0x1d65, + (q15_t)0x1d5f, (q15_t)0x1d59, (q15_t)0x1d53, (q15_t)0x1d4c, (q15_t)0x1d46, (q15_t)0x1d40, (q15_t)0x1d3a, (q15_t)0x1d34, + (q15_t)0x1d2e, (q15_t)0x1d28, (q15_t)0x1d22, (q15_t)0x1d1c, (q15_t)0x1d15, (q15_t)0x1d0f, (q15_t)0x1d09, (q15_t)0x1d03, + (q15_t)0x1cfd, (q15_t)0x1cf7, (q15_t)0x1cf1, (q15_t)0x1ceb, (q15_t)0x1ce4, (q15_t)0x1cde, (q15_t)0x1cd8, (q15_t)0x1cd2, + (q15_t)0x1ccc, (q15_t)0x1cc6, (q15_t)0x1cc0, (q15_t)0x1cba, (q15_t)0x1cb3, (q15_t)0x1cad, (q15_t)0x1ca7, (q15_t)0x1ca1, + (q15_t)0x1c9b, (q15_t)0x1c95, (q15_t)0x1c8f, (q15_t)0x1c89, (q15_t)0x1c83, (q15_t)0x1c7c, (q15_t)0x1c76, (q15_t)0x1c70, + (q15_t)0x1c6a, (q15_t)0x1c64, (q15_t)0x1c5e, (q15_t)0x1c58, (q15_t)0x1c51, (q15_t)0x1c4b, (q15_t)0x1c45, (q15_t)0x1c3f, + (q15_t)0x1c39, (q15_t)0x1c33, (q15_t)0x1c2d, (q15_t)0x1c27, (q15_t)0x1c20, (q15_t)0x1c1a, (q15_t)0x1c14, (q15_t)0x1c0e, + (q15_t)0x1c08, (q15_t)0x1c02, (q15_t)0x1bfc, (q15_t)0x1bf6, (q15_t)0x1bef, (q15_t)0x1be9, (q15_t)0x1be3, (q15_t)0x1bdd, + (q15_t)0x1bd7, (q15_t)0x1bd1, (q15_t)0x1bcb, (q15_t)0x1bc4, (q15_t)0x1bbe, (q15_t)0x1bb8, (q15_t)0x1bb2, (q15_t)0x1bac, + (q15_t)0x1ba6, (q15_t)0x1ba0, (q15_t)0x1b9a, (q15_t)0x1b93, (q15_t)0x1b8d, (q15_t)0x1b87, (q15_t)0x1b81, (q15_t)0x1b7b, + (q15_t)0x1b75, (q15_t)0x1b6f, (q15_t)0x1b68, (q15_t)0x1b62, (q15_t)0x1b5c, (q15_t)0x1b56, (q15_t)0x1b50, (q15_t)0x1b4a, + (q15_t)0x1b44, (q15_t)0x1b3d, (q15_t)0x1b37, (q15_t)0x1b31, (q15_t)0x1b2b, (q15_t)0x1b25, (q15_t)0x1b1f, (q15_t)0x1b19, + (q15_t)0x1b13, (q15_t)0x1b0c, (q15_t)0x1b06, (q15_t)0x1b00, (q15_t)0x1afa, (q15_t)0x1af4, (q15_t)0x1aee, (q15_t)0x1ae8, + (q15_t)0x1ae1, (q15_t)0x1adb, (q15_t)0x1ad5, (q15_t)0x1acf, (q15_t)0x1ac9, (q15_t)0x1ac3, (q15_t)0x1abd, (q15_t)0x1ab6, + (q15_t)0x1ab0, (q15_t)0x1aaa, (q15_t)0x1aa4, (q15_t)0x1a9e, (q15_t)0x1a98, (q15_t)0x1a91, (q15_t)0x1a8b, (q15_t)0x1a85, + (q15_t)0x1a7f, (q15_t)0x1a79, (q15_t)0x1a73, (q15_t)0x1a6d, (q15_t)0x1a66, (q15_t)0x1a60, (q15_t)0x1a5a, (q15_t)0x1a54, + (q15_t)0x1a4e, (q15_t)0x1a48, (q15_t)0x1a42, (q15_t)0x1a3b, (q15_t)0x1a35, (q15_t)0x1a2f, (q15_t)0x1a29, (q15_t)0x1a23, + (q15_t)0x1a1d, (q15_t)0x1a17, (q15_t)0x1a10, (q15_t)0x1a0a, (q15_t)0x1a04, (q15_t)0x19fe, (q15_t)0x19f8, (q15_t)0x19f2, + (q15_t)0x19eb, (q15_t)0x19e5, (q15_t)0x19df, (q15_t)0x19d9, (q15_t)0x19d3, (q15_t)0x19cd, (q15_t)0x19c7, (q15_t)0x19c0, + (q15_t)0x19ba, (q15_t)0x19b4, (q15_t)0x19ae, (q15_t)0x19a8, (q15_t)0x19a2, (q15_t)0x199b, (q15_t)0x1995, (q15_t)0x198f, + (q15_t)0x1989, (q15_t)0x1983, (q15_t)0x197d, (q15_t)0x1977, (q15_t)0x1970, (q15_t)0x196a, (q15_t)0x1964, (q15_t)0x195e, + (q15_t)0x1958, (q15_t)0x1952, (q15_t)0x194b, (q15_t)0x1945, (q15_t)0x193f, (q15_t)0x1939, (q15_t)0x1933, (q15_t)0x192d, + (q15_t)0x1926, (q15_t)0x1920, (q15_t)0x191a, (q15_t)0x1914, (q15_t)0x190e, (q15_t)0x1908, (q15_t)0x1901, (q15_t)0x18fb, + (q15_t)0x18f5, (q15_t)0x18ef, (q15_t)0x18e9, (q15_t)0x18e3, (q15_t)0x18dc, (q15_t)0x18d6, (q15_t)0x18d0, (q15_t)0x18ca, + (q15_t)0x18c4, (q15_t)0x18be, (q15_t)0x18b8, (q15_t)0x18b1, (q15_t)0x18ab, (q15_t)0x18a5, (q15_t)0x189f, (q15_t)0x1899, + (q15_t)0x1893, (q15_t)0x188c, (q15_t)0x1886, (q15_t)0x1880, (q15_t)0x187a, (q15_t)0x1874, (q15_t)0x186e, (q15_t)0x1867, + (q15_t)0x1861, (q15_t)0x185b, (q15_t)0x1855, (q15_t)0x184f, (q15_t)0x1848, (q15_t)0x1842, (q15_t)0x183c, (q15_t)0x1836, + (q15_t)0x1830, (q15_t)0x182a, (q15_t)0x1823, (q15_t)0x181d, (q15_t)0x1817, (q15_t)0x1811, (q15_t)0x180b, (q15_t)0x1805, + (q15_t)0x17fe, (q15_t)0x17f8, (q15_t)0x17f2, (q15_t)0x17ec, (q15_t)0x17e6, (q15_t)0x17e0, (q15_t)0x17d9, (q15_t)0x17d3, + (q15_t)0x17cd, (q15_t)0x17c7, (q15_t)0x17c1, (q15_t)0x17bb, (q15_t)0x17b4, (q15_t)0x17ae, (q15_t)0x17a8, (q15_t)0x17a2, + (q15_t)0x179c, (q15_t)0x1795, (q15_t)0x178f, (q15_t)0x1789, (q15_t)0x1783, (q15_t)0x177d, (q15_t)0x1777, (q15_t)0x1770, + (q15_t)0x176a, (q15_t)0x1764, (q15_t)0x175e, (q15_t)0x1758, (q15_t)0x1752, (q15_t)0x174b, (q15_t)0x1745, (q15_t)0x173f, + (q15_t)0x1739, (q15_t)0x1733, (q15_t)0x172c, (q15_t)0x1726, (q15_t)0x1720, (q15_t)0x171a, (q15_t)0x1714, (q15_t)0x170e, + (q15_t)0x1707, (q15_t)0x1701, (q15_t)0x16fb, (q15_t)0x16f5, (q15_t)0x16ef, (q15_t)0x16e8, (q15_t)0x16e2, (q15_t)0x16dc, + (q15_t)0x16d6, (q15_t)0x16d0, (q15_t)0x16ca, (q15_t)0x16c3, (q15_t)0x16bd, (q15_t)0x16b7, (q15_t)0x16b1, (q15_t)0x16ab, + (q15_t)0x16a4, (q15_t)0x169e, (q15_t)0x1698, (q15_t)0x1692, (q15_t)0x168c, (q15_t)0x1686, (q15_t)0x167f, (q15_t)0x1679, + (q15_t)0x1673, (q15_t)0x166d, (q15_t)0x1667, (q15_t)0x1660, (q15_t)0x165a, (q15_t)0x1654, (q15_t)0x164e, (q15_t)0x1648, + (q15_t)0x1642, (q15_t)0x163b, (q15_t)0x1635, (q15_t)0x162f, (q15_t)0x1629, (q15_t)0x1623, (q15_t)0x161c, (q15_t)0x1616, + (q15_t)0x1610, (q15_t)0x160a, (q15_t)0x1604, (q15_t)0x15fd, (q15_t)0x15f7, (q15_t)0x15f1, (q15_t)0x15eb, (q15_t)0x15e5, + (q15_t)0x15de, (q15_t)0x15d8, (q15_t)0x15d2, (q15_t)0x15cc, (q15_t)0x15c6, (q15_t)0x15c0, (q15_t)0x15b9, (q15_t)0x15b3, + (q15_t)0x15ad, (q15_t)0x15a7, (q15_t)0x15a1, (q15_t)0x159a, (q15_t)0x1594, (q15_t)0x158e, (q15_t)0x1588, (q15_t)0x1582, + (q15_t)0x157b, (q15_t)0x1575, (q15_t)0x156f, (q15_t)0x1569, (q15_t)0x1563, (q15_t)0x155c, (q15_t)0x1556, (q15_t)0x1550, + (q15_t)0x154a, (q15_t)0x1544, (q15_t)0x153d, (q15_t)0x1537, (q15_t)0x1531, (q15_t)0x152b, (q15_t)0x1525, (q15_t)0x151e, + (q15_t)0x1518, (q15_t)0x1512, (q15_t)0x150c, (q15_t)0x1506, (q15_t)0x14ff, (q15_t)0x14f9, (q15_t)0x14f3, (q15_t)0x14ed, + (q15_t)0x14e7, (q15_t)0x14e0, (q15_t)0x14da, (q15_t)0x14d4, (q15_t)0x14ce, (q15_t)0x14c8, (q15_t)0x14c1, (q15_t)0x14bb, + (q15_t)0x14b5, (q15_t)0x14af, (q15_t)0x14a9, (q15_t)0x14a2, (q15_t)0x149c, (q15_t)0x1496, (q15_t)0x1490, (q15_t)0x148a, + (q15_t)0x1483, (q15_t)0x147d, (q15_t)0x1477, (q15_t)0x1471, (q15_t)0x146b, (q15_t)0x1464, (q15_t)0x145e, (q15_t)0x1458, + (q15_t)0x1452, (q15_t)0x144c, (q15_t)0x1445, (q15_t)0x143f, (q15_t)0x1439, (q15_t)0x1433, (q15_t)0x142d, (q15_t)0x1426, + (q15_t)0x1420, (q15_t)0x141a, (q15_t)0x1414, (q15_t)0x140e, (q15_t)0x1407, (q15_t)0x1401, (q15_t)0x13fb, (q15_t)0x13f5, + (q15_t)0x13ef, (q15_t)0x13e8, (q15_t)0x13e2, (q15_t)0x13dc, (q15_t)0x13d6, (q15_t)0x13d0, (q15_t)0x13c9, (q15_t)0x13c3, + (q15_t)0x13bd, (q15_t)0x13b7, (q15_t)0x13b1, (q15_t)0x13aa, (q15_t)0x13a4, (q15_t)0x139e, (q15_t)0x1398, (q15_t)0x1391, + (q15_t)0x138b, (q15_t)0x1385, (q15_t)0x137f, (q15_t)0x1379, (q15_t)0x1372, (q15_t)0x136c, (q15_t)0x1366, (q15_t)0x1360, + (q15_t)0x135a, (q15_t)0x1353, (q15_t)0x134d, (q15_t)0x1347, (q15_t)0x1341, (q15_t)0x133b, (q15_t)0x1334, (q15_t)0x132e, + (q15_t)0x1328, (q15_t)0x1322, (q15_t)0x131b, (q15_t)0x1315, (q15_t)0x130f, (q15_t)0x1309, (q15_t)0x1303, (q15_t)0x12fc, + (q15_t)0x12f6, (q15_t)0x12f0, (q15_t)0x12ea, (q15_t)0x12e4, (q15_t)0x12dd, (q15_t)0x12d7, (q15_t)0x12d1, (q15_t)0x12cb, + (q15_t)0x12c4, (q15_t)0x12be, (q15_t)0x12b8, (q15_t)0x12b2, (q15_t)0x12ac, (q15_t)0x12a5, (q15_t)0x129f, (q15_t)0x1299, + (q15_t)0x1293, (q15_t)0x128d, (q15_t)0x1286, (q15_t)0x1280, (q15_t)0x127a, (q15_t)0x1274, (q15_t)0x126d, (q15_t)0x1267, + (q15_t)0x1261, (q15_t)0x125b, (q15_t)0x1255, (q15_t)0x124e, (q15_t)0x1248, (q15_t)0x1242, (q15_t)0x123c, (q15_t)0x1235, + (q15_t)0x122f, (q15_t)0x1229, (q15_t)0x1223, (q15_t)0x121d, (q15_t)0x1216, (q15_t)0x1210, (q15_t)0x120a, (q15_t)0x1204, + (q15_t)0x11fd, (q15_t)0x11f7, (q15_t)0x11f1, (q15_t)0x11eb, (q15_t)0x11e5, (q15_t)0x11de, (q15_t)0x11d8, (q15_t)0x11d2, + (q15_t)0x11cc, (q15_t)0x11c5, (q15_t)0x11bf, (q15_t)0x11b9, (q15_t)0x11b3, (q15_t)0x11ad, (q15_t)0x11a6, (q15_t)0x11a0, + (q15_t)0x119a, (q15_t)0x1194, (q15_t)0x118d, (q15_t)0x1187, (q15_t)0x1181, (q15_t)0x117b, (q15_t)0x1175, (q15_t)0x116e, + (q15_t)0x1168, (q15_t)0x1162, (q15_t)0x115c, (q15_t)0x1155, (q15_t)0x114f, (q15_t)0x1149, (q15_t)0x1143, (q15_t)0x113d, + (q15_t)0x1136, (q15_t)0x1130, (q15_t)0x112a, (q15_t)0x1124, (q15_t)0x111d, (q15_t)0x1117, (q15_t)0x1111, (q15_t)0x110b, + (q15_t)0x1105, (q15_t)0x10fe, (q15_t)0x10f8, (q15_t)0x10f2, (q15_t)0x10ec, (q15_t)0x10e5, (q15_t)0x10df, (q15_t)0x10d9, + (q15_t)0x10d3, (q15_t)0x10cc, (q15_t)0x10c6, (q15_t)0x10c0, (q15_t)0x10ba, (q15_t)0x10b4, (q15_t)0x10ad, (q15_t)0x10a7, + (q15_t)0x10a1, (q15_t)0x109b, (q15_t)0x1094, (q15_t)0x108e, (q15_t)0x1088, (q15_t)0x1082, (q15_t)0x107b, (q15_t)0x1075, + (q15_t)0x106f, (q15_t)0x1069, (q15_t)0x1063, (q15_t)0x105c, (q15_t)0x1056, (q15_t)0x1050, (q15_t)0x104a, (q15_t)0x1043, + (q15_t)0x103d, (q15_t)0x1037, (q15_t)0x1031, (q15_t)0x102a, (q15_t)0x1024, (q15_t)0x101e, (q15_t)0x1018, (q15_t)0x1012, + (q15_t)0x100b, (q15_t)0x1005, (q15_t)0xfff, (q15_t)0xff9, (q15_t)0xff2, (q15_t)0xfec, (q15_t)0xfe6, (q15_t)0xfe0, + (q15_t)0xfd9, (q15_t)0xfd3, (q15_t)0xfcd, (q15_t)0xfc7, (q15_t)0xfc0, (q15_t)0xfba, (q15_t)0xfb4, (q15_t)0xfae, + (q15_t)0xfa8, (q15_t)0xfa1, (q15_t)0xf9b, (q15_t)0xf95, (q15_t)0xf8f, (q15_t)0xf88, (q15_t)0xf82, (q15_t)0xf7c, + (q15_t)0xf76, (q15_t)0xf6f, (q15_t)0xf69, (q15_t)0xf63, (q15_t)0xf5d, (q15_t)0xf56, (q15_t)0xf50, (q15_t)0xf4a, + (q15_t)0xf44, (q15_t)0xf3e, (q15_t)0xf37, (q15_t)0xf31, (q15_t)0xf2b, (q15_t)0xf25, (q15_t)0xf1e, (q15_t)0xf18, + (q15_t)0xf12, (q15_t)0xf0c, (q15_t)0xf05, (q15_t)0xeff, (q15_t)0xef9, (q15_t)0xef3, (q15_t)0xeec, (q15_t)0xee6, + (q15_t)0xee0, (q15_t)0xeda, (q15_t)0xed3, (q15_t)0xecd, (q15_t)0xec7, (q15_t)0xec1, (q15_t)0xeba, (q15_t)0xeb4, + (q15_t)0xeae, (q15_t)0xea8, (q15_t)0xea1, (q15_t)0xe9b, (q15_t)0xe95, (q15_t)0xe8f, (q15_t)0xe89, (q15_t)0xe82, + (q15_t)0xe7c, (q15_t)0xe76, (q15_t)0xe70, (q15_t)0xe69, (q15_t)0xe63, (q15_t)0xe5d, (q15_t)0xe57, (q15_t)0xe50, + (q15_t)0xe4a, (q15_t)0xe44, (q15_t)0xe3e, (q15_t)0xe37, (q15_t)0xe31, (q15_t)0xe2b, (q15_t)0xe25, (q15_t)0xe1e, + (q15_t)0xe18, (q15_t)0xe12, (q15_t)0xe0c, (q15_t)0xe05, (q15_t)0xdff, (q15_t)0xdf9, (q15_t)0xdf3, (q15_t)0xdec, + (q15_t)0xde6, (q15_t)0xde0, (q15_t)0xdda, (q15_t)0xdd3, (q15_t)0xdcd, (q15_t)0xdc7, (q15_t)0xdc1, (q15_t)0xdba, + (q15_t)0xdb4, (q15_t)0xdae, (q15_t)0xda8, (q15_t)0xda1, (q15_t)0xd9b, (q15_t)0xd95, (q15_t)0xd8f, (q15_t)0xd88, + (q15_t)0xd82, (q15_t)0xd7c, (q15_t)0xd76, (q15_t)0xd6f, (q15_t)0xd69, (q15_t)0xd63, (q15_t)0xd5d, (q15_t)0xd56, + (q15_t)0xd50, (q15_t)0xd4a, (q15_t)0xd44, (q15_t)0xd3d, (q15_t)0xd37, (q15_t)0xd31, (q15_t)0xd2b, (q15_t)0xd24, + (q15_t)0xd1e, (q15_t)0xd18, (q15_t)0xd12, (q15_t)0xd0b, (q15_t)0xd05, (q15_t)0xcff, (q15_t)0xcf9, (q15_t)0xcf2, + (q15_t)0xcec, (q15_t)0xce6, (q15_t)0xce0, (q15_t)0xcd9, (q15_t)0xcd3, (q15_t)0xccd, (q15_t)0xcc7, (q15_t)0xcc0, + (q15_t)0xcba, (q15_t)0xcb4, (q15_t)0xcae, (q15_t)0xca7, (q15_t)0xca1, (q15_t)0xc9b, (q15_t)0xc95, (q15_t)0xc8e, + (q15_t)0xc88, (q15_t)0xc82, (q15_t)0xc7c, (q15_t)0xc75, (q15_t)0xc6f, (q15_t)0xc69, (q15_t)0xc63, (q15_t)0xc5c, + (q15_t)0xc56, (q15_t)0xc50, (q15_t)0xc4a, (q15_t)0xc43, (q15_t)0xc3d, (q15_t)0xc37, (q15_t)0xc31, (q15_t)0xc2a, + (q15_t)0xc24, (q15_t)0xc1e, (q15_t)0xc18, (q15_t)0xc11, (q15_t)0xc0b, (q15_t)0xc05, (q15_t)0xbff, (q15_t)0xbf8, + (q15_t)0xbf2, (q15_t)0xbec, (q15_t)0xbe6, (q15_t)0xbdf, (q15_t)0xbd9, (q15_t)0xbd3, (q15_t)0xbcd, (q15_t)0xbc6, + (q15_t)0xbc0, (q15_t)0xbba, (q15_t)0xbb4, (q15_t)0xbad, (q15_t)0xba7, (q15_t)0xba1, (q15_t)0xb9b, (q15_t)0xb94, + (q15_t)0xb8e, (q15_t)0xb88, (q15_t)0xb81, (q15_t)0xb7b, (q15_t)0xb75, (q15_t)0xb6f, (q15_t)0xb68, (q15_t)0xb62, + (q15_t)0xb5c, (q15_t)0xb56, (q15_t)0xb4f, (q15_t)0xb49, (q15_t)0xb43, (q15_t)0xb3d, (q15_t)0xb36, (q15_t)0xb30, + (q15_t)0xb2a, (q15_t)0xb24, (q15_t)0xb1d, (q15_t)0xb17, (q15_t)0xb11, (q15_t)0xb0b, (q15_t)0xb04, (q15_t)0xafe, + (q15_t)0xaf8, (q15_t)0xaf2, (q15_t)0xaeb, (q15_t)0xae5, (q15_t)0xadf, (q15_t)0xad8, (q15_t)0xad2, (q15_t)0xacc, + (q15_t)0xac6, (q15_t)0xabf, (q15_t)0xab9, (q15_t)0xab3, (q15_t)0xaad, (q15_t)0xaa6, (q15_t)0xaa0, (q15_t)0xa9a, + (q15_t)0xa94, (q15_t)0xa8d, (q15_t)0xa87, (q15_t)0xa81, (q15_t)0xa7b, (q15_t)0xa74, (q15_t)0xa6e, (q15_t)0xa68, + (q15_t)0xa62, (q15_t)0xa5b, (q15_t)0xa55, (q15_t)0xa4f, (q15_t)0xa48, (q15_t)0xa42, (q15_t)0xa3c, (q15_t)0xa36, + (q15_t)0xa2f, (q15_t)0xa29, (q15_t)0xa23, (q15_t)0xa1d, (q15_t)0xa16, (q15_t)0xa10, (q15_t)0xa0a, (q15_t)0xa04, + (q15_t)0x9fd, (q15_t)0x9f7, (q15_t)0x9f1, (q15_t)0x9eb, (q15_t)0x9e4, (q15_t)0x9de, (q15_t)0x9d8, (q15_t)0x9d1, + (q15_t)0x9cb, (q15_t)0x9c5, (q15_t)0x9bf, (q15_t)0x9b8, (q15_t)0x9b2, (q15_t)0x9ac, (q15_t)0x9a6, (q15_t)0x99f, + (q15_t)0x999, (q15_t)0x993, (q15_t)0x98d, (q15_t)0x986, (q15_t)0x980, (q15_t)0x97a, (q15_t)0x973, (q15_t)0x96d, + (q15_t)0x967, (q15_t)0x961, (q15_t)0x95a, (q15_t)0x954, (q15_t)0x94e, (q15_t)0x948, (q15_t)0x941, (q15_t)0x93b, + (q15_t)0x935, (q15_t)0x92f, (q15_t)0x928, (q15_t)0x922, (q15_t)0x91c, (q15_t)0x915, (q15_t)0x90f, (q15_t)0x909, + (q15_t)0x903, (q15_t)0x8fc, (q15_t)0x8f6, (q15_t)0x8f0, (q15_t)0x8ea, (q15_t)0x8e3, (q15_t)0x8dd, (q15_t)0x8d7, + (q15_t)0x8d1, (q15_t)0x8ca, (q15_t)0x8c4, (q15_t)0x8be, (q15_t)0x8b7, (q15_t)0x8b1, (q15_t)0x8ab, (q15_t)0x8a5, + (q15_t)0x89e, (q15_t)0x898, (q15_t)0x892, (q15_t)0x88c, (q15_t)0x885, (q15_t)0x87f, (q15_t)0x879, (q15_t)0x872, + (q15_t)0x86c, (q15_t)0x866, (q15_t)0x860, (q15_t)0x859, (q15_t)0x853, (q15_t)0x84d, (q15_t)0x847, (q15_t)0x840, + (q15_t)0x83a, (q15_t)0x834, (q15_t)0x82e, (q15_t)0x827, (q15_t)0x821, (q15_t)0x81b, (q15_t)0x814, (q15_t)0x80e, + (q15_t)0x808, (q15_t)0x802, (q15_t)0x7fb, (q15_t)0x7f5, (q15_t)0x7ef, (q15_t)0x7e9, (q15_t)0x7e2, (q15_t)0x7dc, + (q15_t)0x7d6, (q15_t)0x7cf, (q15_t)0x7c9, (q15_t)0x7c3, (q15_t)0x7bd, (q15_t)0x7b6, (q15_t)0x7b0, (q15_t)0x7aa, + (q15_t)0x7a4, (q15_t)0x79d, (q15_t)0x797, (q15_t)0x791, (q15_t)0x78a, (q15_t)0x784, (q15_t)0x77e, (q15_t)0x778, + (q15_t)0x771, (q15_t)0x76b, (q15_t)0x765, (q15_t)0x75f, (q15_t)0x758, (q15_t)0x752, (q15_t)0x74c, (q15_t)0x745, + (q15_t)0x73f, (q15_t)0x739, (q15_t)0x733, (q15_t)0x72c, (q15_t)0x726, (q15_t)0x720, (q15_t)0x71a, (q15_t)0x713, + (q15_t)0x70d, (q15_t)0x707, (q15_t)0x700, (q15_t)0x6fa, (q15_t)0x6f4, (q15_t)0x6ee, (q15_t)0x6e7, (q15_t)0x6e1, + (q15_t)0x6db, (q15_t)0x6d5, (q15_t)0x6ce, (q15_t)0x6c8, (q15_t)0x6c2, (q15_t)0x6bb, (q15_t)0x6b5, (q15_t)0x6af, + (q15_t)0x6a9, (q15_t)0x6a2, (q15_t)0x69c, (q15_t)0x696, (q15_t)0x690, (q15_t)0x689, (q15_t)0x683, (q15_t)0x67d, + (q15_t)0x676, (q15_t)0x670, (q15_t)0x66a, (q15_t)0x664, (q15_t)0x65d, (q15_t)0x657, (q15_t)0x651, (q15_t)0x64a, + (q15_t)0x644, (q15_t)0x63e, (q15_t)0x638, (q15_t)0x631, (q15_t)0x62b, (q15_t)0x625, (q15_t)0x61f, (q15_t)0x618, + (q15_t)0x612, (q15_t)0x60c, (q15_t)0x605, (q15_t)0x5ff, (q15_t)0x5f9, (q15_t)0x5f3, (q15_t)0x5ec, (q15_t)0x5e6, + (q15_t)0x5e0, (q15_t)0x5da, (q15_t)0x5d3, (q15_t)0x5cd, (q15_t)0x5c7, (q15_t)0x5c0, (q15_t)0x5ba, (q15_t)0x5b4, + (q15_t)0x5ae, (q15_t)0x5a7, (q15_t)0x5a1, (q15_t)0x59b, (q15_t)0x594, (q15_t)0x58e, (q15_t)0x588, (q15_t)0x582, + (q15_t)0x57b, (q15_t)0x575, (q15_t)0x56f, (q15_t)0x569, (q15_t)0x562, (q15_t)0x55c, (q15_t)0x556, (q15_t)0x54f, + (q15_t)0x549, (q15_t)0x543, (q15_t)0x53d, (q15_t)0x536, (q15_t)0x530, (q15_t)0x52a, (q15_t)0x523, (q15_t)0x51d, + (q15_t)0x517, (q15_t)0x511, (q15_t)0x50a, (q15_t)0x504, (q15_t)0x4fe, (q15_t)0x4f8, (q15_t)0x4f1, (q15_t)0x4eb, + (q15_t)0x4e5, (q15_t)0x4de, (q15_t)0x4d8, (q15_t)0x4d2, (q15_t)0x4cc, (q15_t)0x4c5, (q15_t)0x4bf, (q15_t)0x4b9, + (q15_t)0x4b2, (q15_t)0x4ac, (q15_t)0x4a6, (q15_t)0x4a0, (q15_t)0x499, (q15_t)0x493, (q15_t)0x48d, (q15_t)0x487, + (q15_t)0x480, (q15_t)0x47a, (q15_t)0x474, (q15_t)0x46d, (q15_t)0x467, (q15_t)0x461, (q15_t)0x45b, (q15_t)0x454, + (q15_t)0x44e, (q15_t)0x448, (q15_t)0x441, (q15_t)0x43b, (q15_t)0x435, (q15_t)0x42f, (q15_t)0x428, (q15_t)0x422, + (q15_t)0x41c, (q15_t)0x415, (q15_t)0x40f, (q15_t)0x409, (q15_t)0x403, (q15_t)0x3fc, (q15_t)0x3f6, (q15_t)0x3f0, + (q15_t)0x3ea, (q15_t)0x3e3, (q15_t)0x3dd, (q15_t)0x3d7, (q15_t)0x3d0, (q15_t)0x3ca, (q15_t)0x3c4, (q15_t)0x3be, + (q15_t)0x3b7, (q15_t)0x3b1, (q15_t)0x3ab, (q15_t)0x3a4, (q15_t)0x39e, (q15_t)0x398, (q15_t)0x392, (q15_t)0x38b, + (q15_t)0x385, (q15_t)0x37f, (q15_t)0x378, (q15_t)0x372, (q15_t)0x36c, (q15_t)0x366, (q15_t)0x35f, (q15_t)0x359, + (q15_t)0x353, (q15_t)0x34c, (q15_t)0x346, (q15_t)0x340, (q15_t)0x33a, (q15_t)0x333, (q15_t)0x32d, (q15_t)0x327, + (q15_t)0x321, (q15_t)0x31a, (q15_t)0x314, (q15_t)0x30e, (q15_t)0x307, (q15_t)0x301, (q15_t)0x2fb, (q15_t)0x2f5, + (q15_t)0x2ee, (q15_t)0x2e8, (q15_t)0x2e2, (q15_t)0x2db, (q15_t)0x2d5, (q15_t)0x2cf, (q15_t)0x2c9, (q15_t)0x2c2, + (q15_t)0x2bc, (q15_t)0x2b6, (q15_t)0x2af, (q15_t)0x2a9, (q15_t)0x2a3, (q15_t)0x29d, (q15_t)0x296, (q15_t)0x290, + (q15_t)0x28a, (q15_t)0x283, (q15_t)0x27d, (q15_t)0x277, (q15_t)0x271, (q15_t)0x26a, (q15_t)0x264, (q15_t)0x25e, + (q15_t)0x258, (q15_t)0x251, (q15_t)0x24b, (q15_t)0x245, (q15_t)0x23e, (q15_t)0x238, (q15_t)0x232, (q15_t)0x22c, + (q15_t)0x225, (q15_t)0x21f, (q15_t)0x219, (q15_t)0x212, (q15_t)0x20c, (q15_t)0x206, (q15_t)0x200, (q15_t)0x1f9, + (q15_t)0x1f3, (q15_t)0x1ed, (q15_t)0x1e6, (q15_t)0x1e0, (q15_t)0x1da, (q15_t)0x1d4, (q15_t)0x1cd, (q15_t)0x1c7, + (q15_t)0x1c1, (q15_t)0x1ba, (q15_t)0x1b4, (q15_t)0x1ae, (q15_t)0x1a8, (q15_t)0x1a1, (q15_t)0x19b, (q15_t)0x195, + (q15_t)0x18e, (q15_t)0x188, (q15_t)0x182, (q15_t)0x17c, (q15_t)0x175, (q15_t)0x16f, (q15_t)0x169, (q15_t)0x162, + (q15_t)0x15c, (q15_t)0x156, (q15_t)0x150, (q15_t)0x149, (q15_t)0x143, (q15_t)0x13d, (q15_t)0x137, (q15_t)0x130, + (q15_t)0x12a, (q15_t)0x124, (q15_t)0x11d, (q15_t)0x117, (q15_t)0x111, (q15_t)0x10b, (q15_t)0x104, (q15_t)0xfe, + (q15_t)0xf8, (q15_t)0xf1, (q15_t)0xeb, (q15_t)0xe5, (q15_t)0xdf, (q15_t)0xd8, (q15_t)0xd2, (q15_t)0xcc, + (q15_t)0xc5, (q15_t)0xbf, (q15_t)0xb9, (q15_t)0xb3, (q15_t)0xac, (q15_t)0xa6, (q15_t)0xa0, (q15_t)0x99, + (q15_t)0x93, (q15_t)0x8d, (q15_t)0x87, (q15_t)0x80, (q15_t)0x7a, (q15_t)0x74, (q15_t)0x6d, (q15_t)0x67, + (q15_t)0x61, (q15_t)0x5b, (q15_t)0x54, (q15_t)0x4e, (q15_t)0x48, (q15_t)0x41, (q15_t)0x3b, (q15_t)0x35, + (q15_t)0x2f, (q15_t)0x28, (q15_t)0x22, (q15_t)0x1c, (q15_t)0x15, (q15_t)0xf, (q15_t)0x9, (q15_t)0x3 +}; + #endif + +/** + @par + Weights tables are generated using the formula :
weights[n] = e^(-j*n*pi/(2*N))
+ @par + C command to generate the table +
+  for (i = 0; i< N; i++)
+  {
+    weights[(2*i)]   =  cos(i*c);
+    weights[(2*i)+1] = -sin(i*c);
+  } 
+ @par + where N is the Number of weights to be calculated and c is pi/(2*N) + @par + Convert the output to q31 format by multiplying with 2^31 and saturated if required. + @par + In the tables below the real and imaginary values are placed alternatively, hence the + array length is 2*N. + */ + +/** + @par + cosFactor tables are generated using the formula :
cos_factors[n] = 2 * cos((2n+1)*pi/(4*N))
+ @par + C command to generate the table +
+  for (i = 0; i< N; i++)
+  {
+    cos_factors[i] = 2 * cos((2*i+1)*c/2);
+  } 
+ @par + where N is the number of factors to generate and c is pi/(2*N) + @par + Then converted to q31 format by multiplying with 2^31 and saturated if required. +*/ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_128) + const q31_t WeightsQ31_128[256] = { + (q31_t)0x7fffffff, (q31_t)0x00000000, (q31_t)0x7ffd885a, (q31_t)0xfe6de2e0, (q31_t)0x7ff62182, (q31_t)0xfcdbd541, (q31_t)0x7fe9cbc0, (q31_t)0xfb49e6a3, + (q31_t)0x7fd8878e, (q31_t)0xf9b82684, (q31_t)0x7fc25596, (q31_t)0xf826a462, (q31_t)0x7fa736b4, (q31_t)0xf6956fb7, (q31_t)0x7f872bf3, (q31_t)0xf50497fb, + (q31_t)0x7f62368f, (q31_t)0xf3742ca2, (q31_t)0x7f3857f6, (q31_t)0xf1e43d1c, (q31_t)0x7f0991c4, (q31_t)0xf054d8d5, (q31_t)0x7ed5e5c6, (q31_t)0xeec60f31, + (q31_t)0x7e9d55fc, (q31_t)0xed37ef91, (q31_t)0x7e5fe493, (q31_t)0xebaa894f, (q31_t)0x7e1d93ea, (q31_t)0xea1debbb, (q31_t)0x7dd6668f, (q31_t)0xe8922622, + (q31_t)0x7d8a5f40, (q31_t)0xe70747c4, (q31_t)0x7d3980ec, (q31_t)0xe57d5fda, (q31_t)0x7ce3ceb2, (q31_t)0xe3f47d96, (q31_t)0x7c894bde, (q31_t)0xe26cb01b, + (q31_t)0x7c29fbee, (q31_t)0xe0e60685, (q31_t)0x7bc5e290, (q31_t)0xdf608fe4, (q31_t)0x7b5d039e, (q31_t)0xdddc5b3b, (q31_t)0x7aef6323, (q31_t)0xdc597781, + (q31_t)0x7a7d055b, (q31_t)0xdad7f3a2, (q31_t)0x7a05eead, (q31_t)0xd957de7a, (q31_t)0x798a23b1, (q31_t)0xd7d946d8, (q31_t)0x7909a92d, (q31_t)0xd65c3b7b, + (q31_t)0x78848414, (q31_t)0xd4e0cb15, (q31_t)0x77fab989, (q31_t)0xd3670446, (q31_t)0x776c4edb, (q31_t)0xd1eef59e, (q31_t)0x76d94989, (q31_t)0xd078ad9e, + (q31_t)0x7641af3d, (q31_t)0xcf043ab3, (q31_t)0x75a585cf, (q31_t)0xcd91ab39, (q31_t)0x7504d345, (q31_t)0xcc210d79, (q31_t)0x745f9dd1, (q31_t)0xcab26fa9, + (q31_t)0x73b5ebd1, (q31_t)0xc945dfec, (q31_t)0x7307c3d0, (q31_t)0xc7db6c50, (q31_t)0x72552c85, (q31_t)0xc67322ce, (q31_t)0x719e2cd2, (q31_t)0xc50d1149, + (q31_t)0x70e2cbc6, (q31_t)0xc3a94590, (q31_t)0x7023109a, (q31_t)0xc247cd5a, (q31_t)0x6f5f02b2, (q31_t)0xc0e8b648, (q31_t)0x6e96a99d, (q31_t)0xbf8c0de3, + (q31_t)0x6dca0d14, (q31_t)0xbe31e19b, (q31_t)0x6cf934fc, (q31_t)0xbcda3ecb, (q31_t)0x6c242960, (q31_t)0xbb8532b0, (q31_t)0x6b4af279, (q31_t)0xba32ca71, + (q31_t)0x6a6d98a4, (q31_t)0xb8e31319, (q31_t)0x698c246c, (q31_t)0xb796199b, (q31_t)0x68a69e81, (q31_t)0xb64beacd, (q31_t)0x67bd0fbd, (q31_t)0xb5049368, + (q31_t)0x66cf8120, (q31_t)0xb3c0200c, (q31_t)0x65ddfbd3, (q31_t)0xb27e9d3c, (q31_t)0x64e88926, (q31_t)0xb140175b, (q31_t)0x63ef3290, (q31_t)0xb0049ab3, + (q31_t)0x62f201ac, (q31_t)0xaecc336c, (q31_t)0x61f1003f, (q31_t)0xad96ed92, (q31_t)0x60ec3830, (q31_t)0xac64d510, (q31_t)0x5fe3b38d, (q31_t)0xab35f5b5, + (q31_t)0x5ed77c8a, (q31_t)0xaa0a5b2e, (q31_t)0x5dc79d7c, (q31_t)0xa8e21106, (q31_t)0x5cb420e0, (q31_t)0xa7bd22ac, (q31_t)0x5b9d1154, (q31_t)0xa69b9b68, + (q31_t)0x5a82799a, (q31_t)0xa57d8666, (q31_t)0x59646498, (q31_t)0xa462eeac, (q31_t)0x5842dd54, (q31_t)0xa34bdf20, (q31_t)0x571deefa, (q31_t)0xa2386284, + (q31_t)0x55f5a4d2, (q31_t)0xa1288376, (q31_t)0x54ca0a4b, (q31_t)0xa01c4c73, (q31_t)0x539b2af0, (q31_t)0x9f13c7d0, (q31_t)0x5269126e, (q31_t)0x9e0effc1, + (q31_t)0x5133cc94, (q31_t)0x9d0dfe54, (q31_t)0x4ffb654d, (q31_t)0x9c10cd70, (q31_t)0x4ebfe8a5, (q31_t)0x9b1776da, (q31_t)0x4d8162c4, (q31_t)0x9a22042d, + (q31_t)0x4c3fdff4, (q31_t)0x99307ee0, (q31_t)0x4afb6c98, (q31_t)0x9842f043, (q31_t)0x49b41533, (q31_t)0x9759617f, (q31_t)0x4869e665, (q31_t)0x9673db94, + (q31_t)0x471cece7, (q31_t)0x9592675c, (q31_t)0x45cd358f, (q31_t)0x94b50d87, (q31_t)0x447acd50, (q31_t)0x93dbd6a0, (q31_t)0x4325c135, (q31_t)0x9306cb04, + (q31_t)0x41ce1e65, (q31_t)0x9235f2ec, (q31_t)0x4073f21d, (q31_t)0x91695663, (q31_t)0x3f1749b8, (q31_t)0x90a0fd4e, (q31_t)0x3db832a6, (q31_t)0x8fdcef66, + (q31_t)0x3c56ba70, (q31_t)0x8f1d343a, (q31_t)0x3af2eeb7, (q31_t)0x8e61d32e, (q31_t)0x398cdd32, (q31_t)0x8daad37b, (q31_t)0x382493b0, (q31_t)0x8cf83c30, + (q31_t)0x36ba2014, (q31_t)0x8c4a142f, (q31_t)0x354d9057, (q31_t)0x8ba0622f, (q31_t)0x33def287, (q31_t)0x8afb2cbb, (q31_t)0x326e54c7, (q31_t)0x8a5a7a31, + (q31_t)0x30fbc54d, (q31_t)0x89be50c3, (q31_t)0x2f875262, (q31_t)0x8926b677, (q31_t)0x2e110a62, (q31_t)0x8893b125, (q31_t)0x2c98fbba, (q31_t)0x88054677, + (q31_t)0x2b1f34eb, (q31_t)0x877b7bec, (q31_t)0x29a3c485, (q31_t)0x86f656d3, (q31_t)0x2826b928, (q31_t)0x8675dc4f, (q31_t)0x26a82186, (q31_t)0x85fa1153, + (q31_t)0x25280c5e, (q31_t)0x8582faa5, (q31_t)0x23a6887f, (q31_t)0x85109cdd, (q31_t)0x2223a4c5, (q31_t)0x84a2fc62, (q31_t)0x209f701c, (q31_t)0x843a1d70, + (q31_t)0x1f19f97b, (q31_t)0x83d60412, (q31_t)0x1d934fe5, (q31_t)0x8376b422, (q31_t)0x1c0b826a, (q31_t)0x831c314e, (q31_t)0x1a82a026, (q31_t)0x82c67f14, + (q31_t)0x18f8b83c, (q31_t)0x8275a0c0, (q31_t)0x176dd9de, (q31_t)0x82299971, (q31_t)0x15e21445, (q31_t)0x81e26c16, (q31_t)0x145576b1, (q31_t)0x81a01b6d, + (q31_t)0x12c8106f, (q31_t)0x8162aa04, (q31_t)0x1139f0cf, (q31_t)0x812a1a3a, (q31_t)0x0fab272b, (q31_t)0x80f66e3c, (q31_t)0x0e1bc2e4, (q31_t)0x80c7a80a, + (q31_t)0x0c8bd35e, (q31_t)0x809dc971, (q31_t)0x0afb6805, (q31_t)0x8078d40d, (q31_t)0x096a9049, (q31_t)0x8058c94c, (q31_t)0x07d95b9e, (q31_t)0x803daa6a, + (q31_t)0x0647d97c, (q31_t)0x80277872, (q31_t)0x04b6195d, (q31_t)0x80163440, (q31_t)0x03242abf, (q31_t)0x8009de7e, (q31_t)0x01921d20, (q31_t)0x800277a6 +}; + const q31_t cos_factorsQ31_128[128] = { + (q31_t)0x7fff6216, (q31_t)0x7ffa72d1, (q31_t)0x7ff09478, (q31_t)0x7fe1c76b, (q31_t)0x7fce0c3e, (q31_t)0x7fb563b3, + (q31_t)0x7f97cebd, (q31_t)0x7f754e80, + (q31_t)0x7f4de451, (q31_t)0x7f2191b4, (q31_t)0x7ef05860, (q31_t)0x7eba3a39, (q31_t)0x7e7f3957, (q31_t)0x7e3f57ff, + (q31_t)0x7dfa98a8, (q31_t)0x7db0fdf8, + (q31_t)0x7d628ac6, (q31_t)0x7d0f4218, (q31_t)0x7cb72724, (q31_t)0x7c5a3d50, (q31_t)0x7bf88830, (q31_t)0x7b920b89, + (q31_t)0x7b26cb4f, (q31_t)0x7ab6cba4, + (q31_t)0x7a4210d8, (q31_t)0x79c89f6e, (q31_t)0x794a7c12, (q31_t)0x78c7aba2, (q31_t)0x78403329, (q31_t)0x77b417df, + (q31_t)0x77235f2d, (q31_t)0x768e0ea6, + (q31_t)0x75f42c0b, (q31_t)0x7555bd4c, (q31_t)0x74b2c884, (q31_t)0x740b53fb, (q31_t)0x735f6626, (q31_t)0x72af05a7, + (q31_t)0x71fa3949, (q31_t)0x71410805, + (q31_t)0x708378ff, (q31_t)0x6fc19385, (q31_t)0x6efb5f12, (q31_t)0x6e30e34a, (q31_t)0x6d6227fa, (q31_t)0x6c8f351c, + (q31_t)0x6bb812d1, (q31_t)0x6adcc964, + (q31_t)0x69fd614a, (q31_t)0x6919e320, (q31_t)0x683257ab, (q31_t)0x6746c7d8, (q31_t)0x66573cbb, (q31_t)0x6563bf92, + (q31_t)0x646c59bf, (q31_t)0x637114cc, + (q31_t)0x6271fa69, (q31_t)0x616f146c, (q31_t)0x60686ccf, (q31_t)0x5f5e0db3, (q31_t)0x5e50015d, (q31_t)0x5d3e5237, + (q31_t)0x5c290acc, (q31_t)0x5b1035cf, + (q31_t)0x59f3de12, (q31_t)0x58d40e8c, (q31_t)0x57b0d256, (q31_t)0x568a34a9, (q31_t)0x556040e2, (q31_t)0x5433027d, + (q31_t)0x53028518, (q31_t)0x51ced46e, + (q31_t)0x5097fc5e, (q31_t)0x4f5e08e3, (q31_t)0x4e210617, (q31_t)0x4ce10034, (q31_t)0x4b9e0390, (q31_t)0x4a581c9e, + (q31_t)0x490f57ee, (q31_t)0x47c3c22f, + (q31_t)0x46756828, (q31_t)0x452456bd, (q31_t)0x43d09aed, (q31_t)0x427a41d0, (q31_t)0x4121589b, (q31_t)0x3fc5ec98, + (q31_t)0x3e680b2c, (q31_t)0x3d07c1d6, + (q31_t)0x3ba51e29, (q31_t)0x3a402dd2, (q31_t)0x38d8fe93, (q31_t)0x376f9e46, (q31_t)0x36041ad9, (q31_t)0x34968250, + (q31_t)0x3326e2c3, (q31_t)0x31b54a5e, + (q31_t)0x3041c761, (q31_t)0x2ecc681e, (q31_t)0x2d553afc, (q31_t)0x2bdc4e6f, (q31_t)0x2a61b101, (q31_t)0x28e5714b, + (q31_t)0x27679df4, (q31_t)0x25e845b6, + (q31_t)0x24677758, (q31_t)0x22e541af, (q31_t)0x2161b3a0, (q31_t)0x1fdcdc1b, (q31_t)0x1e56ca1e, (q31_t)0x1ccf8cb3, + (q31_t)0x1b4732ef, (q31_t)0x19bdcbf3, + (q31_t)0x183366e9, (q31_t)0x16a81305, (q31_t)0x151bdf86, (q31_t)0x138edbb1, (q31_t)0x120116d5, (q31_t)0x1072a048, + (q31_t)0xee38766, (q31_t)0xd53db92, + (q31_t)0xbc3ac35, (q31_t)0xa3308bd, (q31_t)0x8a2009a, (q31_t)0x710a345, (q31_t)0x57f0035, (q31_t)0x3ed26e6, (q31_t)0x25b26d7, + (q31_t)0xc90f88 +}; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_512) + const q31_t WeightsQ31_512[1024] = { + (q31_t)0x7fffffff, (q31_t)0x00000000, (q31_t)0x7fffd886, (q31_t)0xff9b781d, (q31_t)0x7fff6216, (q31_t)0xff36f078, (q31_t)0x7ffe9cb2, (q31_t)0xfed2694f, + (q31_t)0x7ffd885a, (q31_t)0xfe6de2e0, (q31_t)0x7ffc250f, (q31_t)0xfe095d69, (q31_t)0x7ffa72d1, (q31_t)0xfda4d929, (q31_t)0x7ff871a2, (q31_t)0xfd40565c, + (q31_t)0x7ff62182, (q31_t)0xfcdbd541, (q31_t)0x7ff38274, (q31_t)0xfc775616, (q31_t)0x7ff09478, (q31_t)0xfc12d91a, (q31_t)0x7fed5791, (q31_t)0xfbae5e89, + (q31_t)0x7fe9cbc0, (q31_t)0xfb49e6a3, (q31_t)0x7fe5f108, (q31_t)0xfae571a4, (q31_t)0x7fe1c76b, (q31_t)0xfa80ffcb, (q31_t)0x7fdd4eec, (q31_t)0xfa1c9157, + (q31_t)0x7fd8878e, (q31_t)0xf9b82684, (q31_t)0x7fd37153, (q31_t)0xf953bf91, (q31_t)0x7fce0c3e, (q31_t)0xf8ef5cbb, (q31_t)0x7fc85854, (q31_t)0xf88afe42, + (q31_t)0x7fc25596, (q31_t)0xf826a462, (q31_t)0x7fbc040a, (q31_t)0xf7c24f59, (q31_t)0x7fb563b3, (q31_t)0xf75dff66, (q31_t)0x7fae7495, (q31_t)0xf6f9b4c6, + (q31_t)0x7fa736b4, (q31_t)0xf6956fb7, (q31_t)0x7f9faa15, (q31_t)0xf6313077, (q31_t)0x7f97cebd, (q31_t)0xf5ccf743, (q31_t)0x7f8fa4b0, (q31_t)0xf568c45b, + (q31_t)0x7f872bf3, (q31_t)0xf50497fb, (q31_t)0x7f7e648c, (q31_t)0xf4a07261, (q31_t)0x7f754e80, (q31_t)0xf43c53cb, (q31_t)0x7f6be9d4, (q31_t)0xf3d83c77, + (q31_t)0x7f62368f, (q31_t)0xf3742ca2, (q31_t)0x7f5834b7, (q31_t)0xf310248a, (q31_t)0x7f4de451, (q31_t)0xf2ac246e, (q31_t)0x7f434563, (q31_t)0xf2482c8a, + (q31_t)0x7f3857f6, (q31_t)0xf1e43d1c, (q31_t)0x7f2d1c0e, (q31_t)0xf1805662, (q31_t)0x7f2191b4, (q31_t)0xf11c789a, (q31_t)0x7f15b8ee, (q31_t)0xf0b8a401, + (q31_t)0x7f0991c4, (q31_t)0xf054d8d5, (q31_t)0x7efd1c3c, (q31_t)0xeff11753, (q31_t)0x7ef05860, (q31_t)0xef8d5fb8, (q31_t)0x7ee34636, (q31_t)0xef29b243, + (q31_t)0x7ed5e5c6, (q31_t)0xeec60f31, (q31_t)0x7ec8371a, (q31_t)0xee6276bf, (q31_t)0x7eba3a39, (q31_t)0xedfee92b, (q31_t)0x7eabef2c, (q31_t)0xed9b66b2, + (q31_t)0x7e9d55fc, (q31_t)0xed37ef91, (q31_t)0x7e8e6eb2, (q31_t)0xecd48407, (q31_t)0x7e7f3957, (q31_t)0xec71244f, (q31_t)0x7e6fb5f4, (q31_t)0xec0dd0a8, + (q31_t)0x7e5fe493, (q31_t)0xebaa894f, (q31_t)0x7e4fc53e, (q31_t)0xeb474e81, (q31_t)0x7e3f57ff, (q31_t)0xeae4207a, (q31_t)0x7e2e9cdf, (q31_t)0xea80ff7a, + (q31_t)0x7e1d93ea, (q31_t)0xea1debbb, (q31_t)0x7e0c3d29, (q31_t)0xe9bae57d, (q31_t)0x7dfa98a8, (q31_t)0xe957ecfb, (q31_t)0x7de8a670, (q31_t)0xe8f50273, + (q31_t)0x7dd6668f, (q31_t)0xe8922622, (q31_t)0x7dc3d90d, (q31_t)0xe82f5844, (q31_t)0x7db0fdf8, (q31_t)0xe7cc9917, (q31_t)0x7d9dd55a, (q31_t)0xe769e8d8, + (q31_t)0x7d8a5f40, (q31_t)0xe70747c4, (q31_t)0x7d769bb5, (q31_t)0xe6a4b616, (q31_t)0x7d628ac6, (q31_t)0xe642340d, (q31_t)0x7d4e2c7f, (q31_t)0xe5dfc1e5, + (q31_t)0x7d3980ec, (q31_t)0xe57d5fda, (q31_t)0x7d24881b, (q31_t)0xe51b0e2a, (q31_t)0x7d0f4218, (q31_t)0xe4b8cd11, (q31_t)0x7cf9aef0, (q31_t)0xe4569ccb, + (q31_t)0x7ce3ceb2, (q31_t)0xe3f47d96, (q31_t)0x7ccda169, (q31_t)0xe3926fad, (q31_t)0x7cb72724, (q31_t)0xe330734d, (q31_t)0x7ca05ff1, (q31_t)0xe2ce88b3, + (q31_t)0x7c894bde, (q31_t)0xe26cb01b, (q31_t)0x7c71eaf9, (q31_t)0xe20ae9c1, (q31_t)0x7c5a3d50, (q31_t)0xe1a935e2, (q31_t)0x7c4242f2, (q31_t)0xe14794ba, + (q31_t)0x7c29fbee, (q31_t)0xe0e60685, (q31_t)0x7c116853, (q31_t)0xe0848b7f, (q31_t)0x7bf88830, (q31_t)0xe02323e5, (q31_t)0x7bdf5b94, (q31_t)0xdfc1cff3, + (q31_t)0x7bc5e290, (q31_t)0xdf608fe4, (q31_t)0x7bac1d31, (q31_t)0xdeff63f4, (q31_t)0x7b920b89, (q31_t)0xde9e4c60, (q31_t)0x7b77ada8, (q31_t)0xde3d4964, + (q31_t)0x7b5d039e, (q31_t)0xdddc5b3b, (q31_t)0x7b420d7a, (q31_t)0xdd7b8220, (q31_t)0x7b26cb4f, (q31_t)0xdd1abe51, (q31_t)0x7b0b3d2c, (q31_t)0xdcba1008, + (q31_t)0x7aef6323, (q31_t)0xdc597781, (q31_t)0x7ad33d45, (q31_t)0xdbf8f4f8, (q31_t)0x7ab6cba4, (q31_t)0xdb9888a8, (q31_t)0x7a9a0e50, (q31_t)0xdb3832cd, + (q31_t)0x7a7d055b, (q31_t)0xdad7f3a2, (q31_t)0x7a5fb0d8, (q31_t)0xda77cb63, (q31_t)0x7a4210d8, (q31_t)0xda17ba4a, (q31_t)0x7a24256f, (q31_t)0xd9b7c094, + (q31_t)0x7a05eead, (q31_t)0xd957de7a, (q31_t)0x79e76ca7, (q31_t)0xd8f81439, (q31_t)0x79c89f6e, (q31_t)0xd898620c, (q31_t)0x79a98715, (q31_t)0xd838c82d, + (q31_t)0x798a23b1, (q31_t)0xd7d946d8, (q31_t)0x796a7554, (q31_t)0xd779de47, (q31_t)0x794a7c12, (q31_t)0xd71a8eb5, (q31_t)0x792a37fe, (q31_t)0xd6bb585e, + (q31_t)0x7909a92d, (q31_t)0xd65c3b7b, (q31_t)0x78e8cfb2, (q31_t)0xd5fd3848, (q31_t)0x78c7aba2, (q31_t)0xd59e4eff, (q31_t)0x78a63d11, (q31_t)0xd53f7fda, + (q31_t)0x78848414, (q31_t)0xd4e0cb15, (q31_t)0x786280bf, (q31_t)0xd48230e9, (q31_t)0x78403329, (q31_t)0xd423b191, (q31_t)0x781d9b65, (q31_t)0xd3c54d47, + (q31_t)0x77fab989, (q31_t)0xd3670446, (q31_t)0x77d78daa, (q31_t)0xd308d6c7, (q31_t)0x77b417df, (q31_t)0xd2aac504, (q31_t)0x7790583e, (q31_t)0xd24ccf39, + (q31_t)0x776c4edb, (q31_t)0xd1eef59e, (q31_t)0x7747fbce, (q31_t)0xd191386e, (q31_t)0x77235f2d, (q31_t)0xd13397e2, (q31_t)0x76fe790e, (q31_t)0xd0d61434, + (q31_t)0x76d94989, (q31_t)0xd078ad9e, (q31_t)0x76b3d0b4, (q31_t)0xd01b6459, (q31_t)0x768e0ea6, (q31_t)0xcfbe389f, (q31_t)0x76680376, (q31_t)0xcf612aaa, + (q31_t)0x7641af3d, (q31_t)0xcf043ab3, (q31_t)0x761b1211, (q31_t)0xcea768f2, (q31_t)0x75f42c0b, (q31_t)0xce4ab5a2, (q31_t)0x75ccfd42, (q31_t)0xcdee20fc, + (q31_t)0x75a585cf, (q31_t)0xcd91ab39, (q31_t)0x757dc5ca, (q31_t)0xcd355491, (q31_t)0x7555bd4c, (q31_t)0xccd91d3d, (q31_t)0x752d6c6c, (q31_t)0xcc7d0578, + (q31_t)0x7504d345, (q31_t)0xcc210d79, (q31_t)0x74dbf1ef, (q31_t)0xcbc53579, (q31_t)0x74b2c884, (q31_t)0xcb697db0, (q31_t)0x7489571c, (q31_t)0xcb0de658, + (q31_t)0x745f9dd1, (q31_t)0xcab26fa9, (q31_t)0x74359cbd, (q31_t)0xca5719db, (q31_t)0x740b53fb, (q31_t)0xc9fbe527, (q31_t)0x73e0c3a3, (q31_t)0xc9a0d1c5, + (q31_t)0x73b5ebd1, (q31_t)0xc945dfec, (q31_t)0x738acc9e, (q31_t)0xc8eb0fd6, (q31_t)0x735f6626, (q31_t)0xc89061ba, (q31_t)0x7333b883, (q31_t)0xc835d5d0, + (q31_t)0x7307c3d0, (q31_t)0xc7db6c50, (q31_t)0x72db8828, (q31_t)0xc7812572, (q31_t)0x72af05a7, (q31_t)0xc727016d, (q31_t)0x72823c67, (q31_t)0xc6cd0079, + (q31_t)0x72552c85, (q31_t)0xc67322ce, (q31_t)0x7227d61c, (q31_t)0xc61968a2, (q31_t)0x71fa3949, (q31_t)0xc5bfd22e, (q31_t)0x71cc5626, (q31_t)0xc5665fa9, + (q31_t)0x719e2cd2, (q31_t)0xc50d1149, (q31_t)0x716fbd68, (q31_t)0xc4b3e746, (q31_t)0x71410805, (q31_t)0xc45ae1d7, (q31_t)0x71120cc5, (q31_t)0xc4020133, + (q31_t)0x70e2cbc6, (q31_t)0xc3a94590, (q31_t)0x70b34525, (q31_t)0xc350af26, (q31_t)0x708378ff, (q31_t)0xc2f83e2a, (q31_t)0x70536771, (q31_t)0xc29ff2d4, + (q31_t)0x7023109a, (q31_t)0xc247cd5a, (q31_t)0x6ff27497, (q31_t)0xc1efcdf3, (q31_t)0x6fc19385, (q31_t)0xc197f4d4, (q31_t)0x6f906d84, (q31_t)0xc1404233, + (q31_t)0x6f5f02b2, (q31_t)0xc0e8b648, (q31_t)0x6f2d532c, (q31_t)0xc0915148, (q31_t)0x6efb5f12, (q31_t)0xc03a1368, (q31_t)0x6ec92683, (q31_t)0xbfe2fcdf, + (q31_t)0x6e96a99d, (q31_t)0xbf8c0de3, (q31_t)0x6e63e87f, (q31_t)0xbf3546a8, (q31_t)0x6e30e34a, (q31_t)0xbedea765, (q31_t)0x6dfd9a1c, (q31_t)0xbe88304f, + (q31_t)0x6dca0d14, (q31_t)0xbe31e19b, (q31_t)0x6d963c54, (q31_t)0xbddbbb7f, (q31_t)0x6d6227fa, (q31_t)0xbd85be30, (q31_t)0x6d2dd027, (q31_t)0xbd2fe9e2, + (q31_t)0x6cf934fc, (q31_t)0xbcda3ecb, (q31_t)0x6cc45698, (q31_t)0xbc84bd1f, (q31_t)0x6c8f351c, (q31_t)0xbc2f6513, (q31_t)0x6c59d0a9, (q31_t)0xbbda36dd, + (q31_t)0x6c242960, (q31_t)0xbb8532b0, (q31_t)0x6bee3f62, (q31_t)0xbb3058c0, (q31_t)0x6bb812d1, (q31_t)0xbadba943, (q31_t)0x6b81a3cd, (q31_t)0xba87246d, + (q31_t)0x6b4af279, (q31_t)0xba32ca71, (q31_t)0x6b13fef5, (q31_t)0xb9de9b83, (q31_t)0x6adcc964, (q31_t)0xb98a97d8, (q31_t)0x6aa551e9, (q31_t)0xb936bfa4, + (q31_t)0x6a6d98a4, (q31_t)0xb8e31319, (q31_t)0x6a359db9, (q31_t)0xb88f926d, (q31_t)0x69fd614a, (q31_t)0xb83c3dd1, (q31_t)0x69c4e37a, (q31_t)0xb7e9157a, + (q31_t)0x698c246c, (q31_t)0xb796199b, (q31_t)0x69532442, (q31_t)0xb7434a67, (q31_t)0x6919e320, (q31_t)0xb6f0a812, (q31_t)0x68e06129, (q31_t)0xb69e32cd, + (q31_t)0x68a69e81, (q31_t)0xb64beacd, (q31_t)0x686c9b4b, (q31_t)0xb5f9d043, (q31_t)0x683257ab, (q31_t)0xb5a7e362, (q31_t)0x67f7d3c5, (q31_t)0xb556245e, + (q31_t)0x67bd0fbd, (q31_t)0xb5049368, (q31_t)0x67820bb7, (q31_t)0xb4b330b3, (q31_t)0x6746c7d8, (q31_t)0xb461fc70, (q31_t)0x670b4444, (q31_t)0xb410f6d3, + (q31_t)0x66cf8120, (q31_t)0xb3c0200c, (q31_t)0x66937e91, (q31_t)0xb36f784f, (q31_t)0x66573cbb, (q31_t)0xb31effcc, (q31_t)0x661abbc5, (q31_t)0xb2ceb6b5, + (q31_t)0x65ddfbd3, (q31_t)0xb27e9d3c, (q31_t)0x65a0fd0b, (q31_t)0xb22eb392, (q31_t)0x6563bf92, (q31_t)0xb1def9e9, (q31_t)0x6526438f, (q31_t)0xb18f7071, + (q31_t)0x64e88926, (q31_t)0xb140175b, (q31_t)0x64aa907f, (q31_t)0xb0f0eeda, (q31_t)0x646c59bf, (q31_t)0xb0a1f71d, (q31_t)0x642de50d, (q31_t)0xb0533055, + (q31_t)0x63ef3290, (q31_t)0xb0049ab3, (q31_t)0x63b0426d, (q31_t)0xafb63667, (q31_t)0x637114cc, (q31_t)0xaf6803a2, (q31_t)0x6331a9d4, (q31_t)0xaf1a0293, + (q31_t)0x62f201ac, (q31_t)0xaecc336c, (q31_t)0x62b21c7b, (q31_t)0xae7e965b, (q31_t)0x6271fa69, (q31_t)0xae312b92, (q31_t)0x62319b9d, (q31_t)0xade3f33e, + (q31_t)0x61f1003f, (q31_t)0xad96ed92, (q31_t)0x61b02876, (q31_t)0xad4a1aba, (q31_t)0x616f146c, (q31_t)0xacfd7ae8, (q31_t)0x612dc447, (q31_t)0xacb10e4b, + (q31_t)0x60ec3830, (q31_t)0xac64d510, (q31_t)0x60aa7050, (q31_t)0xac18cf69, (q31_t)0x60686ccf, (q31_t)0xabccfd83, (q31_t)0x60262dd6, (q31_t)0xab815f8d, + (q31_t)0x5fe3b38d, (q31_t)0xab35f5b5, (q31_t)0x5fa0fe1f, (q31_t)0xaaeac02c, (q31_t)0x5f5e0db3, (q31_t)0xaa9fbf1e, (q31_t)0x5f1ae274, (q31_t)0xaa54f2ba, + (q31_t)0x5ed77c8a, (q31_t)0xaa0a5b2e, (q31_t)0x5e93dc1f, (q31_t)0xa9bff8a8, (q31_t)0x5e50015d, (q31_t)0xa975cb57, (q31_t)0x5e0bec6e, (q31_t)0xa92bd367, + (q31_t)0x5dc79d7c, (q31_t)0xa8e21106, (q31_t)0x5d8314b1, (q31_t)0xa8988463, (q31_t)0x5d3e5237, (q31_t)0xa84f2daa, (q31_t)0x5cf95638, (q31_t)0xa8060d08, + (q31_t)0x5cb420e0, (q31_t)0xa7bd22ac, (q31_t)0x5c6eb258, (q31_t)0xa7746ec0, (q31_t)0x5c290acc, (q31_t)0xa72bf174, (q31_t)0x5be32a67, (q31_t)0xa6e3aaf2, + (q31_t)0x5b9d1154, (q31_t)0xa69b9b68, (q31_t)0x5b56bfbd, (q31_t)0xa653c303, (q31_t)0x5b1035cf, (q31_t)0xa60c21ee, (q31_t)0x5ac973b5, (q31_t)0xa5c4b855, + (q31_t)0x5a82799a, (q31_t)0xa57d8666, (q31_t)0x5a3b47ab, (q31_t)0xa5368c4b, (q31_t)0x59f3de12, (q31_t)0xa4efca31, (q31_t)0x59ac3cfd, (q31_t)0xa4a94043, + (q31_t)0x59646498, (q31_t)0xa462eeac, (q31_t)0x591c550e, (q31_t)0xa41cd599, (q31_t)0x58d40e8c, (q31_t)0xa3d6f534, (q31_t)0x588b9140, (q31_t)0xa3914da8, + (q31_t)0x5842dd54, (q31_t)0xa34bdf20, (q31_t)0x57f9f2f8, (q31_t)0xa306a9c8, (q31_t)0x57b0d256, (q31_t)0xa2c1adc9, (q31_t)0x57677b9d, (q31_t)0xa27ceb4f, + (q31_t)0x571deefa, (q31_t)0xa2386284, (q31_t)0x56d42c99, (q31_t)0xa1f41392, (q31_t)0x568a34a9, (q31_t)0xa1affea3, (q31_t)0x56400758, (q31_t)0xa16c23e1, + (q31_t)0x55f5a4d2, (q31_t)0xa1288376, (q31_t)0x55ab0d46, (q31_t)0xa0e51d8c, (q31_t)0x556040e2, (q31_t)0xa0a1f24d, (q31_t)0x55153fd4, (q31_t)0xa05f01e1, + (q31_t)0x54ca0a4b, (q31_t)0xa01c4c73, (q31_t)0x547ea073, (q31_t)0x9fd9d22a, (q31_t)0x5433027d, (q31_t)0x9f979331, (q31_t)0x53e73097, (q31_t)0x9f558fb0, + (q31_t)0x539b2af0, (q31_t)0x9f13c7d0, (q31_t)0x534ef1b5, (q31_t)0x9ed23bb9, (q31_t)0x53028518, (q31_t)0x9e90eb94, (q31_t)0x52b5e546, (q31_t)0x9e4fd78a, + (q31_t)0x5269126e, (q31_t)0x9e0effc1, (q31_t)0x521c0cc2, (q31_t)0x9dce6463, (q31_t)0x51ced46e, (q31_t)0x9d8e0597, (q31_t)0x518169a5, (q31_t)0x9d4de385, + (q31_t)0x5133cc94, (q31_t)0x9d0dfe54, (q31_t)0x50e5fd6d, (q31_t)0x9cce562c, (q31_t)0x5097fc5e, (q31_t)0x9c8eeb34, (q31_t)0x5049c999, (q31_t)0x9c4fbd93, + (q31_t)0x4ffb654d, (q31_t)0x9c10cd70, (q31_t)0x4faccfab, (q31_t)0x9bd21af3, (q31_t)0x4f5e08e3, (q31_t)0x9b93a641, (q31_t)0x4f0f1126, (q31_t)0x9b556f81, + (q31_t)0x4ebfe8a5, (q31_t)0x9b1776da, (q31_t)0x4e708f8f, (q31_t)0x9ad9bc71, (q31_t)0x4e210617, (q31_t)0x9a9c406e, (q31_t)0x4dd14c6e, (q31_t)0x9a5f02f5, + (q31_t)0x4d8162c4, (q31_t)0x9a22042d, (q31_t)0x4d31494b, (q31_t)0x99e5443b, (q31_t)0x4ce10034, (q31_t)0x99a8c345, (q31_t)0x4c9087b1, (q31_t)0x996c816f, + (q31_t)0x4c3fdff4, (q31_t)0x99307ee0, (q31_t)0x4bef092d, (q31_t)0x98f4bbbc, (q31_t)0x4b9e0390, (q31_t)0x98b93828, (q31_t)0x4b4ccf4d, (q31_t)0x987df449, + (q31_t)0x4afb6c98, (q31_t)0x9842f043, (q31_t)0x4aa9dba2, (q31_t)0x98082c3b, (q31_t)0x4a581c9e, (q31_t)0x97cda855, (q31_t)0x4a062fbd, (q31_t)0x979364b5, + (q31_t)0x49b41533, (q31_t)0x9759617f, (q31_t)0x4961cd33, (q31_t)0x971f9ed7, (q31_t)0x490f57ee, (q31_t)0x96e61ce0, (q31_t)0x48bcb599, (q31_t)0x96acdbbe, + (q31_t)0x4869e665, (q31_t)0x9673db94, (q31_t)0x4816ea86, (q31_t)0x963b1c86, (q31_t)0x47c3c22f, (q31_t)0x96029eb6, (q31_t)0x47706d93, (q31_t)0x95ca6247, + (q31_t)0x471cece7, (q31_t)0x9592675c, (q31_t)0x46c9405c, (q31_t)0x955aae17, (q31_t)0x46756828, (q31_t)0x9523369c, (q31_t)0x4621647d, (q31_t)0x94ec010b, + (q31_t)0x45cd358f, (q31_t)0x94b50d87, (q31_t)0x4578db93, (q31_t)0x947e5c33, (q31_t)0x452456bd, (q31_t)0x9447ed2f, (q31_t)0x44cfa740, (q31_t)0x9411c09e, + (q31_t)0x447acd50, (q31_t)0x93dbd6a0, (q31_t)0x4425c923, (q31_t)0x93a62f57, (q31_t)0x43d09aed, (q31_t)0x9370cae4, (q31_t)0x437b42e1, (q31_t)0x933ba968, + (q31_t)0x4325c135, (q31_t)0x9306cb04, (q31_t)0x42d0161e, (q31_t)0x92d22fd9, (q31_t)0x427a41d0, (q31_t)0x929dd806, (q31_t)0x42244481, (q31_t)0x9269c3ac, + (q31_t)0x41ce1e65, (q31_t)0x9235f2ec, (q31_t)0x4177cfb1, (q31_t)0x920265e4, (q31_t)0x4121589b, (q31_t)0x91cf1cb6, (q31_t)0x40cab958, (q31_t)0x919c1781, + (q31_t)0x4073f21d, (q31_t)0x91695663, (q31_t)0x401d0321, (q31_t)0x9136d97d, (q31_t)0x3fc5ec98, (q31_t)0x9104a0ee, (q31_t)0x3f6eaeb8, (q31_t)0x90d2acd4, + (q31_t)0x3f1749b8, (q31_t)0x90a0fd4e, (q31_t)0x3ebfbdcd, (q31_t)0x906f927c, (q31_t)0x3e680b2c, (q31_t)0x903e6c7b, (q31_t)0x3e10320d, (q31_t)0x900d8b69, + (q31_t)0x3db832a6, (q31_t)0x8fdcef66, (q31_t)0x3d600d2c, (q31_t)0x8fac988f, (q31_t)0x3d07c1d6, (q31_t)0x8f7c8701, (q31_t)0x3caf50da, (q31_t)0x8f4cbadb, + (q31_t)0x3c56ba70, (q31_t)0x8f1d343a, (q31_t)0x3bfdfecd, (q31_t)0x8eedf33b, (q31_t)0x3ba51e29, (q31_t)0x8ebef7fb, (q31_t)0x3b4c18ba, (q31_t)0x8e904298, + (q31_t)0x3af2eeb7, (q31_t)0x8e61d32e, (q31_t)0x3a99a057, (q31_t)0x8e33a9da, (q31_t)0x3a402dd2, (q31_t)0x8e05c6b7, (q31_t)0x39e6975e, (q31_t)0x8dd829e4, + (q31_t)0x398cdd32, (q31_t)0x8daad37b, (q31_t)0x3932ff87, (q31_t)0x8d7dc399, (q31_t)0x38d8fe93, (q31_t)0x8d50fa59, (q31_t)0x387eda8e, (q31_t)0x8d2477d8, + (q31_t)0x382493b0, (q31_t)0x8cf83c30, (q31_t)0x37ca2a30, (q31_t)0x8ccc477d, (q31_t)0x376f9e46, (q31_t)0x8ca099da, (q31_t)0x3714f02a, (q31_t)0x8c753362, + (q31_t)0x36ba2014, (q31_t)0x8c4a142f, (q31_t)0x365f2e3b, (q31_t)0x8c1f3c5d, (q31_t)0x36041ad9, (q31_t)0x8bf4ac05, (q31_t)0x35a8e625, (q31_t)0x8bca6343, + (q31_t)0x354d9057, (q31_t)0x8ba0622f, (q31_t)0x34f219a8, (q31_t)0x8b76a8e4, (q31_t)0x34968250, (q31_t)0x8b4d377c, (q31_t)0x343aca87, (q31_t)0x8b240e11, + (q31_t)0x33def287, (q31_t)0x8afb2cbb, (q31_t)0x3382fa88, (q31_t)0x8ad29394, (q31_t)0x3326e2c3, (q31_t)0x8aaa42b4, (q31_t)0x32caab6f, (q31_t)0x8a823a36, + (q31_t)0x326e54c7, (q31_t)0x8a5a7a31, (q31_t)0x3211df04, (q31_t)0x8a3302be, (q31_t)0x31b54a5e, (q31_t)0x8a0bd3f5, (q31_t)0x3158970e, (q31_t)0x89e4edef, + (q31_t)0x30fbc54d, (q31_t)0x89be50c3, (q31_t)0x309ed556, (q31_t)0x8997fc8a, (q31_t)0x3041c761, (q31_t)0x8971f15a, (q31_t)0x2fe49ba7, (q31_t)0x894c2f4c, + (q31_t)0x2f875262, (q31_t)0x8926b677, (q31_t)0x2f29ebcc, (q31_t)0x890186f2, (q31_t)0x2ecc681e, (q31_t)0x88dca0d3, (q31_t)0x2e6ec792, (q31_t)0x88b80432, + (q31_t)0x2e110a62, (q31_t)0x8893b125, (q31_t)0x2db330c7, (q31_t)0x886fa7c2, (q31_t)0x2d553afc, (q31_t)0x884be821, (q31_t)0x2cf72939, (q31_t)0x88287256, + (q31_t)0x2c98fbba, (q31_t)0x88054677, (q31_t)0x2c3ab2b9, (q31_t)0x87e2649b, (q31_t)0x2bdc4e6f, (q31_t)0x87bfccd7, (q31_t)0x2b7dcf17, (q31_t)0x879d7f41, + (q31_t)0x2b1f34eb, (q31_t)0x877b7bec, (q31_t)0x2ac08026, (q31_t)0x8759c2ef, (q31_t)0x2a61b101, (q31_t)0x8738545e, (q31_t)0x2a02c7b8, (q31_t)0x8717304e, + (q31_t)0x29a3c485, (q31_t)0x86f656d3, (q31_t)0x2944a7a2, (q31_t)0x86d5c802, (q31_t)0x28e5714b, (q31_t)0x86b583ee, (q31_t)0x288621b9, (q31_t)0x86958aac, + (q31_t)0x2826b928, (q31_t)0x8675dc4f, (q31_t)0x27c737d3, (q31_t)0x865678eb, (q31_t)0x27679df4, (q31_t)0x86376092, (q31_t)0x2707ebc7, (q31_t)0x86189359, + (q31_t)0x26a82186, (q31_t)0x85fa1153, (q31_t)0x26483f6c, (q31_t)0x85dbda91, (q31_t)0x25e845b6, (q31_t)0x85bdef28, (q31_t)0x2588349d, (q31_t)0x85a04f28, + (q31_t)0x25280c5e, (q31_t)0x8582faa5, (q31_t)0x24c7cd33, (q31_t)0x8565f1b0, (q31_t)0x24677758, (q31_t)0x8549345c, (q31_t)0x24070b08, (q31_t)0x852cc2bb, + (q31_t)0x23a6887f, (q31_t)0x85109cdd, (q31_t)0x2345eff8, (q31_t)0x84f4c2d4, (q31_t)0x22e541af, (q31_t)0x84d934b1, (q31_t)0x22847de0, (q31_t)0x84bdf286, + (q31_t)0x2223a4c5, (q31_t)0x84a2fc62, (q31_t)0x21c2b69c, (q31_t)0x84885258, (q31_t)0x2161b3a0, (q31_t)0x846df477, (q31_t)0x21009c0c, (q31_t)0x8453e2cf, + (q31_t)0x209f701c, (q31_t)0x843a1d70, (q31_t)0x203e300d, (q31_t)0x8420a46c, (q31_t)0x1fdcdc1b, (q31_t)0x840777d0, (q31_t)0x1f7b7481, (q31_t)0x83ee97ad, + (q31_t)0x1f19f97b, (q31_t)0x83d60412, (q31_t)0x1eb86b46, (q31_t)0x83bdbd0e, (q31_t)0x1e56ca1e, (q31_t)0x83a5c2b0, (q31_t)0x1df5163f, (q31_t)0x838e1507, + (q31_t)0x1d934fe5, (q31_t)0x8376b422, (q31_t)0x1d31774d, (q31_t)0x835fa00f, (q31_t)0x1ccf8cb3, (q31_t)0x8348d8dc, (q31_t)0x1c6d9053, (q31_t)0x83325e97, + (q31_t)0x1c0b826a, (q31_t)0x831c314e, (q31_t)0x1ba96335, (q31_t)0x83065110, (q31_t)0x1b4732ef, (q31_t)0x82f0bde8, (q31_t)0x1ae4f1d6, (q31_t)0x82db77e5, + (q31_t)0x1a82a026, (q31_t)0x82c67f14, (q31_t)0x1a203e1b, (q31_t)0x82b1d381, (q31_t)0x19bdcbf3, (q31_t)0x829d753a, (q31_t)0x195b49ea, (q31_t)0x8289644b, + (q31_t)0x18f8b83c, (q31_t)0x8275a0c0, (q31_t)0x18961728, (q31_t)0x82622aa6, (q31_t)0x183366e9, (q31_t)0x824f0208, (q31_t)0x17d0a7bc, (q31_t)0x823c26f3, + (q31_t)0x176dd9de, (q31_t)0x82299971, (q31_t)0x170afd8d, (q31_t)0x82175990, (q31_t)0x16a81305, (q31_t)0x82056758, (q31_t)0x16451a83, (q31_t)0x81f3c2d7, + (q31_t)0x15e21445, (q31_t)0x81e26c16, (q31_t)0x157f0086, (q31_t)0x81d16321, (q31_t)0x151bdf86, (q31_t)0x81c0a801, (q31_t)0x14b8b17f, (q31_t)0x81b03ac2, + (q31_t)0x145576b1, (q31_t)0x81a01b6d, (q31_t)0x13f22f58, (q31_t)0x81904a0c, (q31_t)0x138edbb1, (q31_t)0x8180c6a9, (q31_t)0x132b7bf9, (q31_t)0x8171914e, + (q31_t)0x12c8106f, (q31_t)0x8162aa04, (q31_t)0x1264994e, (q31_t)0x815410d4, (q31_t)0x120116d5, (q31_t)0x8145c5c7, (q31_t)0x119d8941, (q31_t)0x8137c8e6, + (q31_t)0x1139f0cf, (q31_t)0x812a1a3a, (q31_t)0x10d64dbd, (q31_t)0x811cb9ca, (q31_t)0x1072a048, (q31_t)0x810fa7a0, (q31_t)0x100ee8ad, (q31_t)0x8102e3c4, + (q31_t)0x0fab272b, (q31_t)0x80f66e3c, (q31_t)0x0f475bff, (q31_t)0x80ea4712, (q31_t)0x0ee38766, (q31_t)0x80de6e4c, (q31_t)0x0e7fa99e, (q31_t)0x80d2e3f2, + (q31_t)0x0e1bc2e4, (q31_t)0x80c7a80a, (q31_t)0x0db7d376, (q31_t)0x80bcba9d, (q31_t)0x0d53db92, (q31_t)0x80b21baf, (q31_t)0x0cefdb76, (q31_t)0x80a7cb49, + (q31_t)0x0c8bd35e, (q31_t)0x809dc971, (q31_t)0x0c27c389, (q31_t)0x8094162c, (q31_t)0x0bc3ac35, (q31_t)0x808ab180, (q31_t)0x0b5f8d9f, (q31_t)0x80819b74, + (q31_t)0x0afb6805, (q31_t)0x8078d40d, (q31_t)0x0a973ba5, (q31_t)0x80705b50, (q31_t)0x0a3308bd, (q31_t)0x80683143, (q31_t)0x09cecf89, (q31_t)0x806055eb, + (q31_t)0x096a9049, (q31_t)0x8058c94c, (q31_t)0x09064b3a, (q31_t)0x80518b6b, (q31_t)0x08a2009a, (q31_t)0x804a9c4d, (q31_t)0x083db0a7, (q31_t)0x8043fbf6, + (q31_t)0x07d95b9e, (q31_t)0x803daa6a, (q31_t)0x077501be, (q31_t)0x8037a7ac, (q31_t)0x0710a345, (q31_t)0x8031f3c2, (q31_t)0x06ac406f, (q31_t)0x802c8ead, + (q31_t)0x0647d97c, (q31_t)0x80277872, (q31_t)0x05e36ea9, (q31_t)0x8022b114, (q31_t)0x057f0035, (q31_t)0x801e3895, (q31_t)0x051a8e5c, (q31_t)0x801a0ef8, + (q31_t)0x04b6195d, (q31_t)0x80163440, (q31_t)0x0451a177, (q31_t)0x8012a86f, (q31_t)0x03ed26e6, (q31_t)0x800f6b88, (q31_t)0x0388a9ea, (q31_t)0x800c7d8c, + (q31_t)0x03242abf, (q31_t)0x8009de7e, (q31_t)0x02bfa9a4, (q31_t)0x80078e5e, (q31_t)0x025b26d7, (q31_t)0x80058d2f, (q31_t)0x01f6a297, (q31_t)0x8003daf1, + (q31_t)0x01921d20, (q31_t)0x800277a6, (q31_t)0x012d96b1, (q31_t)0x8001634e, (q31_t)0x00c90f88, (q31_t)0x80009dea, (q31_t)0x006487e3, (q31_t)0x8000277a +}; + const q31_t cos_factorsQ31_512[512] = { + (q31_t)0x7ffff621, (q31_t)0x7fffa72c, (q31_t)0x7fff0943, (q31_t)0x7ffe1c65, (q31_t)0x7ffce093, (q31_t)0x7ffb55ce, + (q31_t)0x7ff97c18, (q31_t)0x7ff75370, + (q31_t)0x7ff4dbd9, (q31_t)0x7ff21553, (q31_t)0x7feeffe1, (q31_t)0x7feb9b85, (q31_t)0x7fe7e841, (q31_t)0x7fe3e616, + (q31_t)0x7fdf9508, (q31_t)0x7fdaf519, + (q31_t)0x7fd6064c, (q31_t)0x7fd0c8a3, (q31_t)0x7fcb3c23, (q31_t)0x7fc560cf, (q31_t)0x7fbf36aa, (q31_t)0x7fb8bdb8, + (q31_t)0x7fb1f5fc, (q31_t)0x7faadf7c, + (q31_t)0x7fa37a3c, (q31_t)0x7f9bc640, (q31_t)0x7f93c38c, (q31_t)0x7f8b7227, (q31_t)0x7f82d214, (q31_t)0x7f79e35a, + (q31_t)0x7f70a5fe, (q31_t)0x7f671a05, + (q31_t)0x7f5d3f75, (q31_t)0x7f531655, (q31_t)0x7f489eaa, (q31_t)0x7f3dd87c, (q31_t)0x7f32c3d1, (q31_t)0x7f2760af, + (q31_t)0x7f1baf1e, (q31_t)0x7f0faf25, + (q31_t)0x7f0360cb, (q31_t)0x7ef6c418, (q31_t)0x7ee9d914, (q31_t)0x7edc9fc6, (q31_t)0x7ecf1837, (q31_t)0x7ec14270, + (q31_t)0x7eb31e78, (q31_t)0x7ea4ac58, + (q31_t)0x7e95ec1a, (q31_t)0x7e86ddc6, (q31_t)0x7e778166, (q31_t)0x7e67d703, (q31_t)0x7e57dea7, (q31_t)0x7e47985b, + (q31_t)0x7e37042a, (q31_t)0x7e26221f, + (q31_t)0x7e14f242, (q31_t)0x7e0374a0, (q31_t)0x7df1a942, (q31_t)0x7ddf9034, (q31_t)0x7dcd2981, (q31_t)0x7dba7534, + (q31_t)0x7da77359, (q31_t)0x7d9423fc, + (q31_t)0x7d808728, (q31_t)0x7d6c9ce9, (q31_t)0x7d58654d, (q31_t)0x7d43e05e, (q31_t)0x7d2f0e2b, (q31_t)0x7d19eebf, + (q31_t)0x7d048228, (q31_t)0x7ceec873, + (q31_t)0x7cd8c1ae, (q31_t)0x7cc26de5, (q31_t)0x7cabcd28, (q31_t)0x7c94df83, (q31_t)0x7c7da505, (q31_t)0x7c661dbc, + (q31_t)0x7c4e49b7, (q31_t)0x7c362904, + (q31_t)0x7c1dbbb3, (q31_t)0x7c0501d2, (q31_t)0x7bebfb70, (q31_t)0x7bd2a89e, (q31_t)0x7bb9096b, (q31_t)0x7b9f1de6, + (q31_t)0x7b84e61f, (q31_t)0x7b6a6227, + (q31_t)0x7b4f920e, (q31_t)0x7b3475e5, (q31_t)0x7b190dbc, (q31_t)0x7afd59a4, (q31_t)0x7ae159ae, (q31_t)0x7ac50dec, + (q31_t)0x7aa8766f, (q31_t)0x7a8b9348, + (q31_t)0x7a6e648a, (q31_t)0x7a50ea47, (q31_t)0x7a332490, (q31_t)0x7a151378, (q31_t)0x79f6b711, (q31_t)0x79d80f6f, + (q31_t)0x79b91ca4, (q31_t)0x7999dec4, + (q31_t)0x797a55e0, (q31_t)0x795a820e, (q31_t)0x793a6361, (q31_t)0x7919f9ec, (q31_t)0x78f945c3, (q31_t)0x78d846fb, + (q31_t)0x78b6fda8, (q31_t)0x789569df, + (q31_t)0x78738bb3, (q31_t)0x7851633b, (q31_t)0x782ef08b, (q31_t)0x780c33b8, (q31_t)0x77e92cd9, (q31_t)0x77c5dc01, + (q31_t)0x77a24148, (q31_t)0x777e5cc3, + (q31_t)0x775a2e89, (q31_t)0x7735b6af, (q31_t)0x7710f54c, (q31_t)0x76ebea77, (q31_t)0x76c69647, (q31_t)0x76a0f8d2, + (q31_t)0x767b1231, (q31_t)0x7654e279, + (q31_t)0x762e69c4, (q31_t)0x7607a828, (q31_t)0x75e09dbd, (q31_t)0x75b94a9c, (q31_t)0x7591aedd, (q31_t)0x7569ca99, + (q31_t)0x75419de7, (q31_t)0x751928e0, + (q31_t)0x74f06b9e, (q31_t)0x74c7663a, (q31_t)0x749e18cd, (q31_t)0x74748371, (q31_t)0x744aa63f, (q31_t)0x74208150, + (q31_t)0x73f614c0, (q31_t)0x73cb60a8, + (q31_t)0x73a06522, (q31_t)0x73752249, (q31_t)0x73499838, (q31_t)0x731dc70a, (q31_t)0x72f1aed9, (q31_t)0x72c54fc1, + (q31_t)0x7298a9dd, (q31_t)0x726bbd48, + (q31_t)0x723e8a20, (q31_t)0x7211107e, (q31_t)0x71e35080, (q31_t)0x71b54a41, (q31_t)0x7186fdde, (q31_t)0x71586b74, + (q31_t)0x7129931f, (q31_t)0x70fa74fc, + (q31_t)0x70cb1128, (q31_t)0x709b67c0, (q31_t)0x706b78e3, (q31_t)0x703b44ad, (q31_t)0x700acb3c, (q31_t)0x6fda0cae, + (q31_t)0x6fa90921, (q31_t)0x6f77c0b3, + (q31_t)0x6f463383, (q31_t)0x6f1461b0, (q31_t)0x6ee24b57, (q31_t)0x6eaff099, (q31_t)0x6e7d5193, (q31_t)0x6e4a6e66, + (q31_t)0x6e174730, (q31_t)0x6de3dc11, + (q31_t)0x6db02d29, (q31_t)0x6d7c3a98, (q31_t)0x6d48047e, (q31_t)0x6d138afb, (q31_t)0x6cdece2f, (q31_t)0x6ca9ce3b, + (q31_t)0x6c748b3f, (q31_t)0x6c3f055d, + (q31_t)0x6c093cb6, (q31_t)0x6bd3316a, (q31_t)0x6b9ce39b, (q31_t)0x6b66536b, (q31_t)0x6b2f80fb, (q31_t)0x6af86c6c, + (q31_t)0x6ac115e2, (q31_t)0x6a897d7d, + (q31_t)0x6a51a361, (q31_t)0x6a1987b0, (q31_t)0x69e12a8c, (q31_t)0x69a88c19, (q31_t)0x696fac78, (q31_t)0x69368bce, + (q31_t)0x68fd2a3d, (q31_t)0x68c387e9, + (q31_t)0x6889a4f6, (q31_t)0x684f8186, (q31_t)0x68151dbe, (q31_t)0x67da79c3, (q31_t)0x679f95b7, (q31_t)0x676471c0, + (q31_t)0x67290e02, (q31_t)0x66ed6aa1, + (q31_t)0x66b187c3, (q31_t)0x6675658c, (q31_t)0x66390422, (q31_t)0x65fc63a9, (q31_t)0x65bf8447, (q31_t)0x65826622, + (q31_t)0x6545095f, (q31_t)0x65076e25, + (q31_t)0x64c99498, (q31_t)0x648b7ce0, (q31_t)0x644d2722, (q31_t)0x640e9386, (q31_t)0x63cfc231, (q31_t)0x6390b34a, + (q31_t)0x635166f9, (q31_t)0x6311dd64, + (q31_t)0x62d216b3, (q31_t)0x6292130c, (q31_t)0x6251d298, (q31_t)0x6211557e, (q31_t)0x61d09be5, (q31_t)0x618fa5f7, + (q31_t)0x614e73da, (q31_t)0x610d05b7, + (q31_t)0x60cb5bb7, (q31_t)0x60897601, (q31_t)0x604754bf, (q31_t)0x6004f819, (q31_t)0x5fc26038, (q31_t)0x5f7f8d46, + (q31_t)0x5f3c7f6b, (q31_t)0x5ef936d1, + (q31_t)0x5eb5b3a2, (q31_t)0x5e71f606, (q31_t)0x5e2dfe29, (q31_t)0x5de9cc33, (q31_t)0x5da5604f, (q31_t)0x5d60baa7, + (q31_t)0x5d1bdb65, (q31_t)0x5cd6c2b5, + (q31_t)0x5c9170bf, (q31_t)0x5c4be5b0, (q31_t)0x5c0621b2, (q31_t)0x5bc024f0, (q31_t)0x5b79ef96, (q31_t)0x5b3381ce, + (q31_t)0x5aecdbc5, (q31_t)0x5aa5fda5, + (q31_t)0x5a5ee79a, (q31_t)0x5a1799d1, (q31_t)0x59d01475, (q31_t)0x598857b2, (q31_t)0x594063b5, (q31_t)0x58f838a9, + (q31_t)0x58afd6bd, (q31_t)0x58673e1b, + (q31_t)0x581e6ef1, (q31_t)0x57d5696d, (q31_t)0x578c2dba, (q31_t)0x5742bc06, (q31_t)0x56f9147e, (q31_t)0x56af3750, + (q31_t)0x566524aa, (q31_t)0x561adcb9, + (q31_t)0x55d05faa, (q31_t)0x5585adad, (q31_t)0x553ac6ee, (q31_t)0x54efab9c, (q31_t)0x54a45be6, (q31_t)0x5458d7f9, + (q31_t)0x540d2005, (q31_t)0x53c13439, + (q31_t)0x537514c2, (q31_t)0x5328c1d0, (q31_t)0x52dc3b92, (q31_t)0x528f8238, (q31_t)0x524295f0, (q31_t)0x51f576ea, + (q31_t)0x51a82555, (q31_t)0x515aa162, + (q31_t)0x510ceb40, (q31_t)0x50bf031f, (q31_t)0x5070e92f, (q31_t)0x50229da1, (q31_t)0x4fd420a4, (q31_t)0x4f857269, + (q31_t)0x4f369320, (q31_t)0x4ee782fb, + (q31_t)0x4e984229, (q31_t)0x4e48d0dd, (q31_t)0x4df92f46, (q31_t)0x4da95d96, (q31_t)0x4d595bfe, (q31_t)0x4d092ab0, + (q31_t)0x4cb8c9dd, (q31_t)0x4c6839b7, + (q31_t)0x4c177a6e, (q31_t)0x4bc68c36, (q31_t)0x4b756f40, (q31_t)0x4b2423be, (q31_t)0x4ad2a9e2, (q31_t)0x4a8101de, + (q31_t)0x4a2f2be6, (q31_t)0x49dd282a, + (q31_t)0x498af6df, (q31_t)0x49389836, (q31_t)0x48e60c62, (q31_t)0x48935397, (q31_t)0x48406e08, (q31_t)0x47ed5be6, + (q31_t)0x479a1d67, (q31_t)0x4746b2bc, + (q31_t)0x46f31c1a, (q31_t)0x469f59b4, (q31_t)0x464b6bbe, (q31_t)0x45f7526b, (q31_t)0x45a30df0, (q31_t)0x454e9e80, + (q31_t)0x44fa0450, (q31_t)0x44a53f93, + (q31_t)0x4450507e, (q31_t)0x43fb3746, (q31_t)0x43a5f41e, (q31_t)0x4350873c, (q31_t)0x42faf0d4, (q31_t)0x42a5311b, + (q31_t)0x424f4845, (q31_t)0x41f93689, + (q31_t)0x41a2fc1a, (q31_t)0x414c992f, (q31_t)0x40f60dfb, (q31_t)0x409f5ab6, (q31_t)0x40487f94, (q31_t)0x3ff17cca, + (q31_t)0x3f9a5290, (q31_t)0x3f430119, + (q31_t)0x3eeb889c, (q31_t)0x3e93e950, (q31_t)0x3e3c2369, (q31_t)0x3de4371f, (q31_t)0x3d8c24a8, (q31_t)0x3d33ec39, + (q31_t)0x3cdb8e09, (q31_t)0x3c830a50, + (q31_t)0x3c2a6142, (q31_t)0x3bd19318, (q31_t)0x3b78a007, (q31_t)0x3b1f8848, (q31_t)0x3ac64c0f, (q31_t)0x3a6ceb96, + (q31_t)0x3a136712, (q31_t)0x39b9bebc, + (q31_t)0x395ff2c9, (q31_t)0x39060373, (q31_t)0x38abf0ef, (q31_t)0x3851bb77, (q31_t)0x37f76341, (q31_t)0x379ce885, + (q31_t)0x37424b7b, (q31_t)0x36e78c5b, + (q31_t)0x368cab5c, (q31_t)0x3631a8b8, (q31_t)0x35d684a6, (q31_t)0x357b3f5d, (q31_t)0x351fd918, (q31_t)0x34c4520d, + (q31_t)0x3468aa76, (q31_t)0x340ce28b, + (q31_t)0x33b0fa84, (q31_t)0x3354f29b, (q31_t)0x32f8cb07, (q31_t)0x329c8402, (q31_t)0x32401dc6, (q31_t)0x31e39889, + (q31_t)0x3186f487, (q31_t)0x312a31f8, + (q31_t)0x30cd5115, (q31_t)0x30705217, (q31_t)0x30133539, (q31_t)0x2fb5fab2, (q31_t)0x2f58a2be, (q31_t)0x2efb2d95, + (q31_t)0x2e9d9b70, (q31_t)0x2e3fec8b, + (q31_t)0x2de2211e, (q31_t)0x2d843964, (q31_t)0x2d263596, (q31_t)0x2cc815ee, (q31_t)0x2c69daa6, (q31_t)0x2c0b83fa, + (q31_t)0x2bad1221, (q31_t)0x2b4e8558, + (q31_t)0x2aefddd8, (q31_t)0x2a911bdc, (q31_t)0x2a323f9e, (q31_t)0x29d34958, (q31_t)0x29743946, (q31_t)0x29150fa1, + (q31_t)0x28b5cca5, (q31_t)0x2856708d, + (q31_t)0x27f6fb92, (q31_t)0x27976df1, (q31_t)0x2737c7e3, (q31_t)0x26d809a5, (q31_t)0x26783370, (q31_t)0x26184581, + (q31_t)0x25b84012, (q31_t)0x2558235f, + (q31_t)0x24f7efa2, (q31_t)0x2497a517, (q31_t)0x243743fa, (q31_t)0x23d6cc87, (q31_t)0x23763ef7, (q31_t)0x23159b88, + (q31_t)0x22b4e274, (q31_t)0x225413f8, + (q31_t)0x21f3304f, (q31_t)0x219237b5, (q31_t)0x21312a65, (q31_t)0x20d0089c, (q31_t)0x206ed295, (q31_t)0x200d888d, + (q31_t)0x1fac2abf, (q31_t)0x1f4ab968, + (q31_t)0x1ee934c3, (q31_t)0x1e879d0d, (q31_t)0x1e25f282, (q31_t)0x1dc4355e, (q31_t)0x1d6265dd, (q31_t)0x1d00843d, + (q31_t)0x1c9e90b8, (q31_t)0x1c3c8b8c, + (q31_t)0x1bda74f6, (q31_t)0x1b784d30, (q31_t)0x1b161479, (q31_t)0x1ab3cb0d, (q31_t)0x1a517128, (q31_t)0x19ef0707, + (q31_t)0x198c8ce7, (q31_t)0x192a0304, + (q31_t)0x18c7699b, (q31_t)0x1864c0ea, (q31_t)0x1802092c, (q31_t)0x179f429f, (q31_t)0x173c6d80, (q31_t)0x16d98a0c, + (q31_t)0x1676987f, (q31_t)0x16139918, + (q31_t)0x15b08c12, (q31_t)0x154d71aa, (q31_t)0x14ea4a1f, (q31_t)0x148715ae, (q31_t)0x1423d492, (q31_t)0x13c0870a, + (q31_t)0x135d2d53, (q31_t)0x12f9c7aa, + (q31_t)0x1296564d, (q31_t)0x1232d979, (q31_t)0x11cf516a, (q31_t)0x116bbe60, (q31_t)0x11082096, (q31_t)0x10a4784b, + (q31_t)0x1040c5bb, (q31_t)0xfdd0926, + (q31_t)0xf7942c7, (q31_t)0xf1572dc, (q31_t)0xeb199a4, (q31_t)0xe4db75b, (q31_t)0xde9cc40, (q31_t)0xd85d88f, (q31_t)0xd21dc87, + (q31_t)0xcbdd865, + (q31_t)0xc59cc68, (q31_t)0xbf5b8cb, (q31_t)0xb919dcf, (q31_t)0xb2d7baf, (q31_t)0xac952aa, (q31_t)0xa6522fe, (q31_t)0xa00ece8, + (q31_t)0x99cb0a7, + (q31_t)0x9386e78, (q31_t)0x8d42699, (q31_t)0x86fd947, (q31_t)0x80b86c2, (q31_t)0x7a72f45, (q31_t)0x742d311, (q31_t)0x6de7262, + (q31_t)0x67a0d76, + (q31_t)0x615a48b, (q31_t)0x5b137df, (q31_t)0x54cc7b1, (q31_t)0x4e8543e, (q31_t)0x483ddc3, (q31_t)0x41f6480, (q31_t)0x3bae8b2, + (q31_t)0x3566a96, + (q31_t)0x2f1ea6c, (q31_t)0x28d6870, (q31_t)0x228e4e2, (q31_t)0x1c45ffe, (q31_t)0x15fda03, (q31_t)0xfb5330, (q31_t)0x96cbc1, + (q31_t)0x3243f5 +}; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_2048) + const q31_t WeightsQ31_2048[4096] = { + (q31_t)0x7fffffff, (q31_t)0x00000000, (q31_t)0x7ffffd88, (q31_t)0xffe6de05, (q31_t)0x7ffff621, (q31_t)0xffcdbc0b, (q31_t)0x7fffe9cb, (q31_t)0xffb49a12, + (q31_t)0x7fffd886, (q31_t)0xff9b781d, (q31_t)0x7fffc251, (q31_t)0xff82562c, (q31_t)0x7fffa72c, (q31_t)0xff69343f, (q31_t)0x7fff8719, (q31_t)0xff501258, + (q31_t)0x7fff6216, (q31_t)0xff36f078, (q31_t)0x7fff3824, (q31_t)0xff1dcea0, (q31_t)0x7fff0943, (q31_t)0xff04acd0, (q31_t)0x7ffed572, (q31_t)0xfeeb8b0a, + (q31_t)0x7ffe9cb2, (q31_t)0xfed2694f, (q31_t)0x7ffe5f03, (q31_t)0xfeb947a0, (q31_t)0x7ffe1c65, (q31_t)0xfea025fd, (q31_t)0x7ffdd4d7, (q31_t)0xfe870467, + (q31_t)0x7ffd885a, (q31_t)0xfe6de2e0, (q31_t)0x7ffd36ee, (q31_t)0xfe54c169, (q31_t)0x7ffce093, (q31_t)0xfe3ba002, (q31_t)0x7ffc8549, (q31_t)0xfe227eac, + (q31_t)0x7ffc250f, (q31_t)0xfe095d69, (q31_t)0x7ffbbfe6, (q31_t)0xfdf03c3a, (q31_t)0x7ffb55ce, (q31_t)0xfdd71b1e, (q31_t)0x7ffae6c7, (q31_t)0xfdbdfa18, + (q31_t)0x7ffa72d1, (q31_t)0xfda4d929, (q31_t)0x7ff9f9ec, (q31_t)0xfd8bb850, (q31_t)0x7ff97c18, (q31_t)0xfd729790, (q31_t)0x7ff8f954, (q31_t)0xfd5976e9, + (q31_t)0x7ff871a2, (q31_t)0xfd40565c, (q31_t)0x7ff7e500, (q31_t)0xfd2735ea, (q31_t)0x7ff75370, (q31_t)0xfd0e1594, (q31_t)0x7ff6bcf0, (q31_t)0xfcf4f55c, + (q31_t)0x7ff62182, (q31_t)0xfcdbd541, (q31_t)0x7ff58125, (q31_t)0xfcc2b545, (q31_t)0x7ff4dbd9, (q31_t)0xfca9956a, (q31_t)0x7ff4319d, (q31_t)0xfc9075af, + (q31_t)0x7ff38274, (q31_t)0xfc775616, (q31_t)0x7ff2ce5b, (q31_t)0xfc5e36a0, (q31_t)0x7ff21553, (q31_t)0xfc45174e, (q31_t)0x7ff1575d, (q31_t)0xfc2bf821, + (q31_t)0x7ff09478, (q31_t)0xfc12d91a, (q31_t)0x7fefcca4, (q31_t)0xfbf9ba39, (q31_t)0x7feeffe1, (q31_t)0xfbe09b80, (q31_t)0x7fee2e30, (q31_t)0xfbc77cf0, + (q31_t)0x7fed5791, (q31_t)0xfbae5e89, (q31_t)0x7fec7c02, (q31_t)0xfb95404d, (q31_t)0x7feb9b85, (q31_t)0xfb7c223d, (q31_t)0x7feab61a, (q31_t)0xfb630459, + (q31_t)0x7fe9cbc0, (q31_t)0xfb49e6a3, (q31_t)0x7fe8dc78, (q31_t)0xfb30c91b, (q31_t)0x7fe7e841, (q31_t)0xfb17abc2, (q31_t)0x7fe6ef1c, (q31_t)0xfafe8e9b, + (q31_t)0x7fe5f108, (q31_t)0xfae571a4, (q31_t)0x7fe4ee06, (q31_t)0xfacc54e0, (q31_t)0x7fe3e616, (q31_t)0xfab3384f, (q31_t)0x7fe2d938, (q31_t)0xfa9a1bf3, + (q31_t)0x7fe1c76b, (q31_t)0xfa80ffcb, (q31_t)0x7fe0b0b1, (q31_t)0xfa67e3da, (q31_t)0x7fdf9508, (q31_t)0xfa4ec821, (q31_t)0x7fde7471, (q31_t)0xfa35ac9f, + (q31_t)0x7fdd4eec, (q31_t)0xfa1c9157, (q31_t)0x7fdc247a, (q31_t)0xfa037648, (q31_t)0x7fdaf519, (q31_t)0xf9ea5b75, (q31_t)0x7fd9c0ca, (q31_t)0xf9d140de, + (q31_t)0x7fd8878e, (q31_t)0xf9b82684, (q31_t)0x7fd74964, (q31_t)0xf99f0c68, (q31_t)0x7fd6064c, (q31_t)0xf985f28a, (q31_t)0x7fd4be46, (q31_t)0xf96cd8ed, + (q31_t)0x7fd37153, (q31_t)0xf953bf91, (q31_t)0x7fd21f72, (q31_t)0xf93aa676, (q31_t)0x7fd0c8a3, (q31_t)0xf9218d9e, (q31_t)0x7fcf6ce8, (q31_t)0xf908750a, + (q31_t)0x7fce0c3e, (q31_t)0xf8ef5cbb, (q31_t)0x7fcca6a7, (q31_t)0xf8d644b2, (q31_t)0x7fcb3c23, (q31_t)0xf8bd2cef, (q31_t)0x7fc9ccb2, (q31_t)0xf8a41574, + (q31_t)0x7fc85854, (q31_t)0xf88afe42, (q31_t)0x7fc6df08, (q31_t)0xf871e759, (q31_t)0x7fc560cf, (q31_t)0xf858d0bb, (q31_t)0x7fc3dda9, (q31_t)0xf83fba68, + (q31_t)0x7fc25596, (q31_t)0xf826a462, (q31_t)0x7fc0c896, (q31_t)0xf80d8ea9, (q31_t)0x7fbf36aa, (q31_t)0xf7f4793e, (q31_t)0x7fbd9fd0, (q31_t)0xf7db6423, + (q31_t)0x7fbc040a, (q31_t)0xf7c24f59, (q31_t)0x7fba6357, (q31_t)0xf7a93ae0, (q31_t)0x7fb8bdb8, (q31_t)0xf79026b9, (q31_t)0x7fb7132b, (q31_t)0xf77712e5, + (q31_t)0x7fb563b3, (q31_t)0xf75dff66, (q31_t)0x7fb3af4e, (q31_t)0xf744ec3b, (q31_t)0x7fb1f5fc, (q31_t)0xf72bd967, (q31_t)0x7fb037bf, (q31_t)0xf712c6ea, + (q31_t)0x7fae7495, (q31_t)0xf6f9b4c6, (q31_t)0x7facac7f, (q31_t)0xf6e0a2fa, (q31_t)0x7faadf7c, (q31_t)0xf6c79188, (q31_t)0x7fa90d8e, (q31_t)0xf6ae8071, + (q31_t)0x7fa736b4, (q31_t)0xf6956fb7, (q31_t)0x7fa55aee, (q31_t)0xf67c5f59, (q31_t)0x7fa37a3c, (q31_t)0xf6634f59, (q31_t)0x7fa1949e, (q31_t)0xf64a3fb8, + (q31_t)0x7f9faa15, (q31_t)0xf6313077, (q31_t)0x7f9dbaa0, (q31_t)0xf6182196, (q31_t)0x7f9bc640, (q31_t)0xf5ff1318, (q31_t)0x7f99ccf4, (q31_t)0xf5e604fc, + (q31_t)0x7f97cebd, (q31_t)0xf5ccf743, (q31_t)0x7f95cb9a, (q31_t)0xf5b3e9f0, (q31_t)0x7f93c38c, (q31_t)0xf59add02, (q31_t)0x7f91b694, (q31_t)0xf581d07b, + (q31_t)0x7f8fa4b0, (q31_t)0xf568c45b, (q31_t)0x7f8d8de1, (q31_t)0xf54fb8a4, (q31_t)0x7f8b7227, (q31_t)0xf536ad56, (q31_t)0x7f895182, (q31_t)0xf51da273, + (q31_t)0x7f872bf3, (q31_t)0xf50497fb, (q31_t)0x7f850179, (q31_t)0xf4eb8def, (q31_t)0x7f82d214, (q31_t)0xf4d28451, (q31_t)0x7f809dc5, (q31_t)0xf4b97b21, + (q31_t)0x7f7e648c, (q31_t)0xf4a07261, (q31_t)0x7f7c2668, (q31_t)0xf4876a10, (q31_t)0x7f79e35a, (q31_t)0xf46e6231, (q31_t)0x7f779b62, (q31_t)0xf4555ac5, + (q31_t)0x7f754e80, (q31_t)0xf43c53cb, (q31_t)0x7f72fcb4, (q31_t)0xf4234d45, (q31_t)0x7f70a5fe, (q31_t)0xf40a4735, (q31_t)0x7f6e4a5e, (q31_t)0xf3f1419a, + (q31_t)0x7f6be9d4, (q31_t)0xf3d83c77, (q31_t)0x7f698461, (q31_t)0xf3bf37cb, (q31_t)0x7f671a05, (q31_t)0xf3a63398, (q31_t)0x7f64aabf, (q31_t)0xf38d2fe0, + (q31_t)0x7f62368f, (q31_t)0xf3742ca2, (q31_t)0x7f5fbd77, (q31_t)0xf35b29e0, (q31_t)0x7f5d3f75, (q31_t)0xf342279b, (q31_t)0x7f5abc8a, (q31_t)0xf32925d3, + (q31_t)0x7f5834b7, (q31_t)0xf310248a, (q31_t)0x7f55a7fa, (q31_t)0xf2f723c1, (q31_t)0x7f531655, (q31_t)0xf2de2379, (q31_t)0x7f507fc7, (q31_t)0xf2c523b2, + (q31_t)0x7f4de451, (q31_t)0xf2ac246e, (q31_t)0x7f4b43f2, (q31_t)0xf29325ad, (q31_t)0x7f489eaa, (q31_t)0xf27a2771, (q31_t)0x7f45f47b, (q31_t)0xf26129ba, + (q31_t)0x7f434563, (q31_t)0xf2482c8a, (q31_t)0x7f409164, (q31_t)0xf22f2fe1, (q31_t)0x7f3dd87c, (q31_t)0xf21633c0, (q31_t)0x7f3b1aad, (q31_t)0xf1fd3829, + (q31_t)0x7f3857f6, (q31_t)0xf1e43d1c, (q31_t)0x7f359057, (q31_t)0xf1cb429a, (q31_t)0x7f32c3d1, (q31_t)0xf1b248a5, (q31_t)0x7f2ff263, (q31_t)0xf1994f3d, + (q31_t)0x7f2d1c0e, (q31_t)0xf1805662, (q31_t)0x7f2a40d2, (q31_t)0xf1675e17, (q31_t)0x7f2760af, (q31_t)0xf14e665c, (q31_t)0x7f247ba5, (q31_t)0xf1356f32, + (q31_t)0x7f2191b4, (q31_t)0xf11c789a, (q31_t)0x7f1ea2dc, (q31_t)0xf1038295, (q31_t)0x7f1baf1e, (q31_t)0xf0ea8d24, (q31_t)0x7f18b679, (q31_t)0xf0d19848, + (q31_t)0x7f15b8ee, (q31_t)0xf0b8a401, (q31_t)0x7f12b67c, (q31_t)0xf09fb051, (q31_t)0x7f0faf25, (q31_t)0xf086bd39, (q31_t)0x7f0ca2e7, (q31_t)0xf06dcaba, + (q31_t)0x7f0991c4, (q31_t)0xf054d8d5, (q31_t)0x7f067bba, (q31_t)0xf03be78a, (q31_t)0x7f0360cb, (q31_t)0xf022f6da, (q31_t)0x7f0040f6, (q31_t)0xf00a06c8, + (q31_t)0x7efd1c3c, (q31_t)0xeff11753, (q31_t)0x7ef9f29d, (q31_t)0xefd8287c, (q31_t)0x7ef6c418, (q31_t)0xefbf3a45, (q31_t)0x7ef390ae, (q31_t)0xefa64cae, + (q31_t)0x7ef05860, (q31_t)0xef8d5fb8, (q31_t)0x7eed1b2c, (q31_t)0xef747365, (q31_t)0x7ee9d914, (q31_t)0xef5b87b5, (q31_t)0x7ee69217, (q31_t)0xef429caa, + (q31_t)0x7ee34636, (q31_t)0xef29b243, (q31_t)0x7edff570, (q31_t)0xef10c883, (q31_t)0x7edc9fc6, (q31_t)0xeef7df6a, (q31_t)0x7ed94538, (q31_t)0xeedef6f9, + (q31_t)0x7ed5e5c6, (q31_t)0xeec60f31, (q31_t)0x7ed28171, (q31_t)0xeead2813, (q31_t)0x7ecf1837, (q31_t)0xee9441a0, (q31_t)0x7ecbaa1a, (q31_t)0xee7b5bd9, + (q31_t)0x7ec8371a, (q31_t)0xee6276bf, (q31_t)0x7ec4bf36, (q31_t)0xee499253, (q31_t)0x7ec14270, (q31_t)0xee30ae96, (q31_t)0x7ebdc0c6, (q31_t)0xee17cb88, + (q31_t)0x7eba3a39, (q31_t)0xedfee92b, (q31_t)0x7eb6aeca, (q31_t)0xede60780, (q31_t)0x7eb31e78, (q31_t)0xedcd2687, (q31_t)0x7eaf8943, (q31_t)0xedb44642, + (q31_t)0x7eabef2c, (q31_t)0xed9b66b2, (q31_t)0x7ea85033, (q31_t)0xed8287d7, (q31_t)0x7ea4ac58, (q31_t)0xed69a9b3, (q31_t)0x7ea1039b, (q31_t)0xed50cc46, + (q31_t)0x7e9d55fc, (q31_t)0xed37ef91, (q31_t)0x7e99a37c, (q31_t)0xed1f1396, (q31_t)0x7e95ec1a, (q31_t)0xed063856, (q31_t)0x7e922fd6, (q31_t)0xeced5dd0, + (q31_t)0x7e8e6eb2, (q31_t)0xecd48407, (q31_t)0x7e8aa8ac, (q31_t)0xecbbaafb, (q31_t)0x7e86ddc6, (q31_t)0xeca2d2ad, (q31_t)0x7e830dff, (q31_t)0xec89fb1e, + (q31_t)0x7e7f3957, (q31_t)0xec71244f, (q31_t)0x7e7b5fce, (q31_t)0xec584e41, (q31_t)0x7e778166, (q31_t)0xec3f78f6, (q31_t)0x7e739e1d, (q31_t)0xec26a46d, + (q31_t)0x7e6fb5f4, (q31_t)0xec0dd0a8, (q31_t)0x7e6bc8eb, (q31_t)0xebf4fda8, (q31_t)0x7e67d703, (q31_t)0xebdc2b6e, (q31_t)0x7e63e03b, (q31_t)0xebc359fb, + (q31_t)0x7e5fe493, (q31_t)0xebaa894f, (q31_t)0x7e5be40c, (q31_t)0xeb91b96c, (q31_t)0x7e57dea7, (q31_t)0xeb78ea52, (q31_t)0x7e53d462, (q31_t)0xeb601c04, + (q31_t)0x7e4fc53e, (q31_t)0xeb474e81, (q31_t)0x7e4bb13c, (q31_t)0xeb2e81ca, (q31_t)0x7e47985b, (q31_t)0xeb15b5e1, (q31_t)0x7e437a9c, (q31_t)0xeafceac6, + (q31_t)0x7e3f57ff, (q31_t)0xeae4207a, (q31_t)0x7e3b3083, (q31_t)0xeacb56ff, (q31_t)0x7e37042a, (q31_t)0xeab28e56, (q31_t)0x7e32d2f4, (q31_t)0xea99c67e, + (q31_t)0x7e2e9cdf, (q31_t)0xea80ff7a, (q31_t)0x7e2a61ed, (q31_t)0xea683949, (q31_t)0x7e26221f, (q31_t)0xea4f73ee, (q31_t)0x7e21dd73, (q31_t)0xea36af69, + (q31_t)0x7e1d93ea, (q31_t)0xea1debbb, (q31_t)0x7e194584, (q31_t)0xea0528e5, (q31_t)0x7e14f242, (q31_t)0xe9ec66e8, (q31_t)0x7e109a24, (q31_t)0xe9d3a5c5, + (q31_t)0x7e0c3d29, (q31_t)0xe9bae57d, (q31_t)0x7e07db52, (q31_t)0xe9a22610, (q31_t)0x7e0374a0, (q31_t)0xe9896781, (q31_t)0x7dff0911, (q31_t)0xe970a9ce, + (q31_t)0x7dfa98a8, (q31_t)0xe957ecfb, (q31_t)0x7df62362, (q31_t)0xe93f3107, (q31_t)0x7df1a942, (q31_t)0xe92675f4, (q31_t)0x7ded2a47, (q31_t)0xe90dbbc2, + (q31_t)0x7de8a670, (q31_t)0xe8f50273, (q31_t)0x7de41dc0, (q31_t)0xe8dc4a07, (q31_t)0x7ddf9034, (q31_t)0xe8c39280, (q31_t)0x7ddafdce, (q31_t)0xe8aadbde, + (q31_t)0x7dd6668f, (q31_t)0xe8922622, (q31_t)0x7dd1ca75, (q31_t)0xe879714d, (q31_t)0x7dcd2981, (q31_t)0xe860bd61, (q31_t)0x7dc883b4, (q31_t)0xe8480a5d, + (q31_t)0x7dc3d90d, (q31_t)0xe82f5844, (q31_t)0x7dbf298d, (q31_t)0xe816a716, (q31_t)0x7dba7534, (q31_t)0xe7fdf6d4, (q31_t)0x7db5bc02, (q31_t)0xe7e5477f, + (q31_t)0x7db0fdf8, (q31_t)0xe7cc9917, (q31_t)0x7dac3b15, (q31_t)0xe7b3eb9f, (q31_t)0x7da77359, (q31_t)0xe79b3f16, (q31_t)0x7da2a6c6, (q31_t)0xe782937e, + (q31_t)0x7d9dd55a, (q31_t)0xe769e8d8, (q31_t)0x7d98ff17, (q31_t)0xe7513f25, (q31_t)0x7d9423fc, (q31_t)0xe7389665, (q31_t)0x7d8f4409, (q31_t)0xe71fee99, + (q31_t)0x7d8a5f40, (q31_t)0xe70747c4, (q31_t)0x7d85759f, (q31_t)0xe6eea1e4, (q31_t)0x7d808728, (q31_t)0xe6d5fcfc, (q31_t)0x7d7b93da, (q31_t)0xe6bd590d, + (q31_t)0x7d769bb5, (q31_t)0xe6a4b616, (q31_t)0x7d719eba, (q31_t)0xe68c141a, (q31_t)0x7d6c9ce9, (q31_t)0xe6737319, (q31_t)0x7d679642, (q31_t)0xe65ad315, + (q31_t)0x7d628ac6, (q31_t)0xe642340d, (q31_t)0x7d5d7a74, (q31_t)0xe6299604, (q31_t)0x7d58654d, (q31_t)0xe610f8f9, (q31_t)0x7d534b50, (q31_t)0xe5f85cef, + (q31_t)0x7d4e2c7f, (q31_t)0xe5dfc1e5, (q31_t)0x7d4908d9, (q31_t)0xe5c727dd, (q31_t)0x7d43e05e, (q31_t)0xe5ae8ed8, (q31_t)0x7d3eb30f, (q31_t)0xe595f6d7, + (q31_t)0x7d3980ec, (q31_t)0xe57d5fda, (q31_t)0x7d3449f5, (q31_t)0xe564c9e3, (q31_t)0x7d2f0e2b, (q31_t)0xe54c34f3, (q31_t)0x7d29cd8c, (q31_t)0xe533a10a, + (q31_t)0x7d24881b, (q31_t)0xe51b0e2a, (q31_t)0x7d1f3dd6, (q31_t)0xe5027c53, (q31_t)0x7d19eebf, (q31_t)0xe4e9eb87, (q31_t)0x7d149ad5, (q31_t)0xe4d15bc6, + (q31_t)0x7d0f4218, (q31_t)0xe4b8cd11, (q31_t)0x7d09e489, (q31_t)0xe4a03f69, (q31_t)0x7d048228, (q31_t)0xe487b2d0, (q31_t)0x7cff1af5, (q31_t)0xe46f2745, + (q31_t)0x7cf9aef0, (q31_t)0xe4569ccb, (q31_t)0x7cf43e1a, (q31_t)0xe43e1362, (q31_t)0x7ceec873, (q31_t)0xe4258b0a, (q31_t)0x7ce94dfb, (q31_t)0xe40d03c6, + (q31_t)0x7ce3ceb2, (q31_t)0xe3f47d96, (q31_t)0x7cde4a98, (q31_t)0xe3dbf87a, (q31_t)0x7cd8c1ae, (q31_t)0xe3c37474, (q31_t)0x7cd333f3, (q31_t)0xe3aaf184, + (q31_t)0x7ccda169, (q31_t)0xe3926fad, (q31_t)0x7cc80a0f, (q31_t)0xe379eeed, (q31_t)0x7cc26de5, (q31_t)0xe3616f48, (q31_t)0x7cbcccec, (q31_t)0xe348f0bd, + (q31_t)0x7cb72724, (q31_t)0xe330734d, (q31_t)0x7cb17c8d, (q31_t)0xe317f6fa, (q31_t)0x7cabcd28, (q31_t)0xe2ff7bc3, (q31_t)0x7ca618f3, (q31_t)0xe2e701ac, + (q31_t)0x7ca05ff1, (q31_t)0xe2ce88b3, (q31_t)0x7c9aa221, (q31_t)0xe2b610da, (q31_t)0x7c94df83, (q31_t)0xe29d9a23, (q31_t)0x7c8f1817, (q31_t)0xe285248d, + (q31_t)0x7c894bde, (q31_t)0xe26cb01b, (q31_t)0x7c837ad8, (q31_t)0xe2543ccc, (q31_t)0x7c7da505, (q31_t)0xe23bcaa2, (q31_t)0x7c77ca65, (q31_t)0xe223599e, + (q31_t)0x7c71eaf9, (q31_t)0xe20ae9c1, (q31_t)0x7c6c06c0, (q31_t)0xe1f27b0b, (q31_t)0x7c661dbc, (q31_t)0xe1da0d7e, (q31_t)0x7c602fec, (q31_t)0xe1c1a11b, + (q31_t)0x7c5a3d50, (q31_t)0xe1a935e2, (q31_t)0x7c5445e9, (q31_t)0xe190cbd4, (q31_t)0x7c4e49b7, (q31_t)0xe17862f3, (q31_t)0x7c4848ba, (q31_t)0xe15ffb3f, + (q31_t)0x7c4242f2, (q31_t)0xe14794ba, (q31_t)0x7c3c3860, (q31_t)0xe12f2f63, (q31_t)0x7c362904, (q31_t)0xe116cb3d, (q31_t)0x7c3014de, (q31_t)0xe0fe6848, + (q31_t)0x7c29fbee, (q31_t)0xe0e60685, (q31_t)0x7c23de35, (q31_t)0xe0cda5f5, (q31_t)0x7c1dbbb3, (q31_t)0xe0b54698, (q31_t)0x7c179467, (q31_t)0xe09ce871, + (q31_t)0x7c116853, (q31_t)0xe0848b7f, (q31_t)0x7c0b3777, (q31_t)0xe06c2fc4, (q31_t)0x7c0501d2, (q31_t)0xe053d541, (q31_t)0x7bfec765, (q31_t)0xe03b7bf6, + (q31_t)0x7bf88830, (q31_t)0xe02323e5, (q31_t)0x7bf24434, (q31_t)0xe00acd0e, (q31_t)0x7bebfb70, (q31_t)0xdff27773, (q31_t)0x7be5ade6, (q31_t)0xdfda2314, + (q31_t)0x7bdf5b94, (q31_t)0xdfc1cff3, (q31_t)0x7bd9047c, (q31_t)0xdfa97e0f, (q31_t)0x7bd2a89e, (q31_t)0xdf912d6b, (q31_t)0x7bcc47fa, (q31_t)0xdf78de07, + (q31_t)0x7bc5e290, (q31_t)0xdf608fe4, (q31_t)0x7bbf7860, (q31_t)0xdf484302, (q31_t)0x7bb9096b, (q31_t)0xdf2ff764, (q31_t)0x7bb295b0, (q31_t)0xdf17ad0a, + (q31_t)0x7bac1d31, (q31_t)0xdeff63f4, (q31_t)0x7ba59fee, (q31_t)0xdee71c24, (q31_t)0x7b9f1de6, (q31_t)0xdeced59b, (q31_t)0x7b989719, (q31_t)0xdeb69059, + (q31_t)0x7b920b89, (q31_t)0xde9e4c60, (q31_t)0x7b8b7b36, (q31_t)0xde8609b1, (q31_t)0x7b84e61f, (q31_t)0xde6dc84b, (q31_t)0x7b7e4c45, (q31_t)0xde558831, + (q31_t)0x7b77ada8, (q31_t)0xde3d4964, (q31_t)0x7b710a49, (q31_t)0xde250be3, (q31_t)0x7b6a6227, (q31_t)0xde0ccfb1, (q31_t)0x7b63b543, (q31_t)0xddf494ce, + (q31_t)0x7b5d039e, (q31_t)0xdddc5b3b, (q31_t)0x7b564d36, (q31_t)0xddc422f8, (q31_t)0x7b4f920e, (q31_t)0xddabec08, (q31_t)0x7b48d225, (q31_t)0xdd93b66a, + (q31_t)0x7b420d7a, (q31_t)0xdd7b8220, (q31_t)0x7b3b4410, (q31_t)0xdd634f2b, (q31_t)0x7b3475e5, (q31_t)0xdd4b1d8c, (q31_t)0x7b2da2fa, (q31_t)0xdd32ed43, + (q31_t)0x7b26cb4f, (q31_t)0xdd1abe51, (q31_t)0x7b1feee5, (q31_t)0xdd0290b8, (q31_t)0x7b190dbc, (q31_t)0xdcea6478, (q31_t)0x7b1227d3, (q31_t)0xdcd23993, + (q31_t)0x7b0b3d2c, (q31_t)0xdcba1008, (q31_t)0x7b044dc7, (q31_t)0xdca1e7da, (q31_t)0x7afd59a4, (q31_t)0xdc89c109, (q31_t)0x7af660c2, (q31_t)0xdc719b96, + (q31_t)0x7aef6323, (q31_t)0xdc597781, (q31_t)0x7ae860c7, (q31_t)0xdc4154cd, (q31_t)0x7ae159ae, (q31_t)0xdc293379, (q31_t)0x7ada4dd8, (q31_t)0xdc111388, + (q31_t)0x7ad33d45, (q31_t)0xdbf8f4f8, (q31_t)0x7acc27f7, (q31_t)0xdbe0d7cd, (q31_t)0x7ac50dec, (q31_t)0xdbc8bc06, (q31_t)0x7abdef25, (q31_t)0xdbb0a1a4, + (q31_t)0x7ab6cba4, (q31_t)0xdb9888a8, (q31_t)0x7aafa367, (q31_t)0xdb807114, (q31_t)0x7aa8766f, (q31_t)0xdb685ae9, (q31_t)0x7aa144bc, (q31_t)0xdb504626, + (q31_t)0x7a9a0e50, (q31_t)0xdb3832cd, (q31_t)0x7a92d329, (q31_t)0xdb2020e0, (q31_t)0x7a8b9348, (q31_t)0xdb08105e, (q31_t)0x7a844eae, (q31_t)0xdaf00149, + (q31_t)0x7a7d055b, (q31_t)0xdad7f3a2, (q31_t)0x7a75b74f, (q31_t)0xdabfe76a, (q31_t)0x7a6e648a, (q31_t)0xdaa7dca1, (q31_t)0x7a670d0d, (q31_t)0xda8fd349, + (q31_t)0x7a5fb0d8, (q31_t)0xda77cb63, (q31_t)0x7a584feb, (q31_t)0xda5fc4ef, (q31_t)0x7a50ea47, (q31_t)0xda47bfee, (q31_t)0x7a497feb, (q31_t)0xda2fbc61, + (q31_t)0x7a4210d8, (q31_t)0xda17ba4a, (q31_t)0x7a3a9d0f, (q31_t)0xd9ffb9a9, (q31_t)0x7a332490, (q31_t)0xd9e7ba7f, (q31_t)0x7a2ba75a, (q31_t)0xd9cfbccd, + (q31_t)0x7a24256f, (q31_t)0xd9b7c094, (q31_t)0x7a1c9ece, (q31_t)0xd99fc5d4, (q31_t)0x7a151378, (q31_t)0xd987cc90, (q31_t)0x7a0d836d, (q31_t)0xd96fd4c7, + (q31_t)0x7a05eead, (q31_t)0xd957de7a, (q31_t)0x79fe5539, (q31_t)0xd93fe9ab, (q31_t)0x79f6b711, (q31_t)0xd927f65b, (q31_t)0x79ef1436, (q31_t)0xd910048a, + (q31_t)0x79e76ca7, (q31_t)0xd8f81439, (q31_t)0x79dfc064, (q31_t)0xd8e0256a, (q31_t)0x79d80f6f, (q31_t)0xd8c8381d, (q31_t)0x79d059c8, (q31_t)0xd8b04c52, + (q31_t)0x79c89f6e, (q31_t)0xd898620c, (q31_t)0x79c0e062, (q31_t)0xd880794b, (q31_t)0x79b91ca4, (q31_t)0xd868920f, (q31_t)0x79b15435, (q31_t)0xd850ac5a, + (q31_t)0x79a98715, (q31_t)0xd838c82d, (q31_t)0x79a1b545, (q31_t)0xd820e589, (q31_t)0x7999dec4, (q31_t)0xd809046e, (q31_t)0x79920392, (q31_t)0xd7f124dd, + (q31_t)0x798a23b1, (q31_t)0xd7d946d8, (q31_t)0x79823f20, (q31_t)0xd7c16a5f, (q31_t)0x797a55e0, (q31_t)0xd7a98f73, (q31_t)0x797267f2, (q31_t)0xd791b616, + (q31_t)0x796a7554, (q31_t)0xd779de47, (q31_t)0x79627e08, (q31_t)0xd7620808, (q31_t)0x795a820e, (q31_t)0xd74a335b, (q31_t)0x79528167, (q31_t)0xd732603f, + (q31_t)0x794a7c12, (q31_t)0xd71a8eb5, (q31_t)0x79427210, (q31_t)0xd702bec0, (q31_t)0x793a6361, (q31_t)0xd6eaf05f, (q31_t)0x79325006, (q31_t)0xd6d32393, + (q31_t)0x792a37fe, (q31_t)0xd6bb585e, (q31_t)0x79221b4b, (q31_t)0xd6a38ec0, (q31_t)0x7919f9ec, (q31_t)0xd68bc6ba, (q31_t)0x7911d3e2, (q31_t)0xd674004e, + (q31_t)0x7909a92d, (q31_t)0xd65c3b7b, (q31_t)0x790179cd, (q31_t)0xd6447844, (q31_t)0x78f945c3, (q31_t)0xd62cb6a8, (q31_t)0x78f10d0f, (q31_t)0xd614f6a9, + (q31_t)0x78e8cfb2, (q31_t)0xd5fd3848, (q31_t)0x78e08dab, (q31_t)0xd5e57b85, (q31_t)0x78d846fb, (q31_t)0xd5cdc062, (q31_t)0x78cffba3, (q31_t)0xd5b606e0, + (q31_t)0x78c7aba2, (q31_t)0xd59e4eff, (q31_t)0x78bf56f9, (q31_t)0xd58698c0, (q31_t)0x78b6fda8, (q31_t)0xd56ee424, (q31_t)0x78ae9fb0, (q31_t)0xd557312d, + (q31_t)0x78a63d11, (q31_t)0xd53f7fda, (q31_t)0x789dd5cb, (q31_t)0xd527d02e, (q31_t)0x789569df, (q31_t)0xd5102228, (q31_t)0x788cf94c, (q31_t)0xd4f875ca, + (q31_t)0x78848414, (q31_t)0xd4e0cb15, (q31_t)0x787c0a36, (q31_t)0xd4c92209, (q31_t)0x78738bb3, (q31_t)0xd4b17aa8, (q31_t)0x786b088c, (q31_t)0xd499d4f2, + (q31_t)0x786280bf, (q31_t)0xd48230e9, (q31_t)0x7859f44f, (q31_t)0xd46a8e8d, (q31_t)0x7851633b, (q31_t)0xd452eddf, (q31_t)0x7848cd83, (q31_t)0xd43b4ee0, + (q31_t)0x78403329, (q31_t)0xd423b191, (q31_t)0x7837942b, (q31_t)0xd40c15f3, (q31_t)0x782ef08b, (q31_t)0xd3f47c06, (q31_t)0x78264849, (q31_t)0xd3dce3cd, + (q31_t)0x781d9b65, (q31_t)0xd3c54d47, (q31_t)0x7814e9df, (q31_t)0xd3adb876, (q31_t)0x780c33b8, (q31_t)0xd396255a, (q31_t)0x780378f1, (q31_t)0xd37e93f4, + (q31_t)0x77fab989, (q31_t)0xd3670446, (q31_t)0x77f1f581, (q31_t)0xd34f764f, (q31_t)0x77e92cd9, (q31_t)0xd337ea12, (q31_t)0x77e05f91, (q31_t)0xd3205f8f, + (q31_t)0x77d78daa, (q31_t)0xd308d6c7, (q31_t)0x77ceb725, (q31_t)0xd2f14fba, (q31_t)0x77c5dc01, (q31_t)0xd2d9ca6a, (q31_t)0x77bcfc3f, (q31_t)0xd2c246d8, + (q31_t)0x77b417df, (q31_t)0xd2aac504, (q31_t)0x77ab2ee2, (q31_t)0xd29344f0, (q31_t)0x77a24148, (q31_t)0xd27bc69c, (q31_t)0x77994f11, (q31_t)0xd2644a0a, + (q31_t)0x7790583e, (q31_t)0xd24ccf39, (q31_t)0x77875cce, (q31_t)0xd235562b, (q31_t)0x777e5cc3, (q31_t)0xd21ddee2, (q31_t)0x7775581d, (q31_t)0xd206695d, + (q31_t)0x776c4edb, (q31_t)0xd1eef59e, (q31_t)0x776340ff, (q31_t)0xd1d783a6, (q31_t)0x775a2e89, (q31_t)0xd1c01375, (q31_t)0x77511778, (q31_t)0xd1a8a50d, + (q31_t)0x7747fbce, (q31_t)0xd191386e, (q31_t)0x773edb8b, (q31_t)0xd179cd99, (q31_t)0x7735b6af, (q31_t)0xd1626490, (q31_t)0x772c8d3a, (q31_t)0xd14afd52, + (q31_t)0x77235f2d, (q31_t)0xd13397e2, (q31_t)0x771a2c88, (q31_t)0xd11c343f, (q31_t)0x7710f54c, (q31_t)0xd104d26b, (q31_t)0x7707b979, (q31_t)0xd0ed7267, + (q31_t)0x76fe790e, (q31_t)0xd0d61434, (q31_t)0x76f5340e, (q31_t)0xd0beb7d2, (q31_t)0x76ebea77, (q31_t)0xd0a75d42, (q31_t)0x76e29c4b, (q31_t)0xd0900486, + (q31_t)0x76d94989, (q31_t)0xd078ad9e, (q31_t)0x76cff232, (q31_t)0xd061588b, (q31_t)0x76c69647, (q31_t)0xd04a054e, (q31_t)0x76bd35c7, (q31_t)0xd032b3e7, + (q31_t)0x76b3d0b4, (q31_t)0xd01b6459, (q31_t)0x76aa670d, (q31_t)0xd00416a3, (q31_t)0x76a0f8d2, (q31_t)0xcfeccac7, (q31_t)0x76978605, (q31_t)0xcfd580c6, + (q31_t)0x768e0ea6, (q31_t)0xcfbe389f, (q31_t)0x768492b4, (q31_t)0xcfa6f255, (q31_t)0x767b1231, (q31_t)0xcf8fade9, (q31_t)0x76718d1c, (q31_t)0xcf786b5a, + (q31_t)0x76680376, (q31_t)0xcf612aaa, (q31_t)0x765e7540, (q31_t)0xcf49ebda, (q31_t)0x7654e279, (q31_t)0xcf32aeeb, (q31_t)0x764b4b23, (q31_t)0xcf1b73de, + (q31_t)0x7641af3d, (q31_t)0xcf043ab3, (q31_t)0x76380ec8, (q31_t)0xceed036b, (q31_t)0x762e69c4, (q31_t)0xced5ce08, (q31_t)0x7624c031, (q31_t)0xcebe9a8a, + (q31_t)0x761b1211, (q31_t)0xcea768f2, (q31_t)0x76115f63, (q31_t)0xce903942, (q31_t)0x7607a828, (q31_t)0xce790b79, (q31_t)0x75fdec60, (q31_t)0xce61df99, + (q31_t)0x75f42c0b, (q31_t)0xce4ab5a2, (q31_t)0x75ea672a, (q31_t)0xce338d97, (q31_t)0x75e09dbd, (q31_t)0xce1c6777, (q31_t)0x75d6cfc5, (q31_t)0xce054343, + (q31_t)0x75ccfd42, (q31_t)0xcdee20fc, (q31_t)0x75c32634, (q31_t)0xcdd700a4, (q31_t)0x75b94a9c, (q31_t)0xcdbfe23a, (q31_t)0x75af6a7b, (q31_t)0xcda8c5c1, + (q31_t)0x75a585cf, (q31_t)0xcd91ab39, (q31_t)0x759b9c9b, (q31_t)0xcd7a92a2, (q31_t)0x7591aedd, (q31_t)0xcd637bfe, (q31_t)0x7587bc98, (q31_t)0xcd4c674d, + (q31_t)0x757dc5ca, (q31_t)0xcd355491, (q31_t)0x7573ca75, (q31_t)0xcd1e43ca, (q31_t)0x7569ca99, (q31_t)0xcd0734f9, (q31_t)0x755fc635, (q31_t)0xccf0281f, + (q31_t)0x7555bd4c, (q31_t)0xccd91d3d, (q31_t)0x754bafdc, (q31_t)0xccc21455, (q31_t)0x75419de7, (q31_t)0xccab0d65, (q31_t)0x7537876c, (q31_t)0xcc940871, + (q31_t)0x752d6c6c, (q31_t)0xcc7d0578, (q31_t)0x75234ce8, (q31_t)0xcc66047b, (q31_t)0x751928e0, (q31_t)0xcc4f057c, (q31_t)0x750f0054, (q31_t)0xcc38087b, + (q31_t)0x7504d345, (q31_t)0xcc210d79, (q31_t)0x74faa1b3, (q31_t)0xcc0a1477, (q31_t)0x74f06b9e, (q31_t)0xcbf31d75, (q31_t)0x74e63108, (q31_t)0xcbdc2876, + (q31_t)0x74dbf1ef, (q31_t)0xcbc53579, (q31_t)0x74d1ae55, (q31_t)0xcbae447f, (q31_t)0x74c7663a, (q31_t)0xcb97558a, (q31_t)0x74bd199f, (q31_t)0xcb80689a, + (q31_t)0x74b2c884, (q31_t)0xcb697db0, (q31_t)0x74a872e8, (q31_t)0xcb5294ce, (q31_t)0x749e18cd, (q31_t)0xcb3badf3, (q31_t)0x7493ba34, (q31_t)0xcb24c921, + (q31_t)0x7489571c, (q31_t)0xcb0de658, (q31_t)0x747eef85, (q31_t)0xcaf7059a, (q31_t)0x74748371, (q31_t)0xcae026e8, (q31_t)0x746a12df, (q31_t)0xcac94a42, + (q31_t)0x745f9dd1, (q31_t)0xcab26fa9, (q31_t)0x74552446, (q31_t)0xca9b971e, (q31_t)0x744aa63f, (q31_t)0xca84c0a3, (q31_t)0x744023bc, (q31_t)0xca6dec37, + (q31_t)0x74359cbd, (q31_t)0xca5719db, (q31_t)0x742b1144, (q31_t)0xca404992, (q31_t)0x74208150, (q31_t)0xca297b5a, (q31_t)0x7415ece2, (q31_t)0xca12af37, + (q31_t)0x740b53fb, (q31_t)0xc9fbe527, (q31_t)0x7400b69a, (q31_t)0xc9e51d2d, (q31_t)0x73f614c0, (q31_t)0xc9ce5748, (q31_t)0x73eb6e6e, (q31_t)0xc9b7937a, + (q31_t)0x73e0c3a3, (q31_t)0xc9a0d1c5, (q31_t)0x73d61461, (q31_t)0xc98a1227, (q31_t)0x73cb60a8, (q31_t)0xc97354a4, (q31_t)0x73c0a878, (q31_t)0xc95c993a, + (q31_t)0x73b5ebd1, (q31_t)0xc945dfec, (q31_t)0x73ab2ab4, (q31_t)0xc92f28ba, (q31_t)0x73a06522, (q31_t)0xc91873a5, (q31_t)0x73959b1b, (q31_t)0xc901c0ae, + (q31_t)0x738acc9e, (q31_t)0xc8eb0fd6, (q31_t)0x737ff9ae, (q31_t)0xc8d4611d, (q31_t)0x73752249, (q31_t)0xc8bdb485, (q31_t)0x736a4671, (q31_t)0xc8a70a0e, + (q31_t)0x735f6626, (q31_t)0xc89061ba, (q31_t)0x73548168, (q31_t)0xc879bb89, (q31_t)0x73499838, (q31_t)0xc863177b, (q31_t)0x733eaa96, (q31_t)0xc84c7593, + (q31_t)0x7333b883, (q31_t)0xc835d5d0, (q31_t)0x7328c1ff, (q31_t)0xc81f3834, (q31_t)0x731dc70a, (q31_t)0xc8089cbf, (q31_t)0x7312c7a5, (q31_t)0xc7f20373, + (q31_t)0x7307c3d0, (q31_t)0xc7db6c50, (q31_t)0x72fcbb8c, (q31_t)0xc7c4d757, (q31_t)0x72f1aed9, (q31_t)0xc7ae4489, (q31_t)0x72e69db7, (q31_t)0xc797b3e7, + (q31_t)0x72db8828, (q31_t)0xc7812572, (q31_t)0x72d06e2b, (q31_t)0xc76a992a, (q31_t)0x72c54fc1, (q31_t)0xc7540f11, (q31_t)0x72ba2cea, (q31_t)0xc73d8727, + (q31_t)0x72af05a7, (q31_t)0xc727016d, (q31_t)0x72a3d9f7, (q31_t)0xc7107de4, (q31_t)0x7298a9dd, (q31_t)0xc6f9fc8d, (q31_t)0x728d7557, (q31_t)0xc6e37d69, + (q31_t)0x72823c67, (q31_t)0xc6cd0079, (q31_t)0x7276ff0d, (q31_t)0xc6b685bd, (q31_t)0x726bbd48, (q31_t)0xc6a00d37, (q31_t)0x7260771b, (q31_t)0xc68996e7, + (q31_t)0x72552c85, (q31_t)0xc67322ce, (q31_t)0x7249dd86, (q31_t)0xc65cb0ed, (q31_t)0x723e8a20, (q31_t)0xc6464144, (q31_t)0x72333251, (q31_t)0xc62fd3d6, + (q31_t)0x7227d61c, (q31_t)0xc61968a2, (q31_t)0x721c7580, (q31_t)0xc602ffaa, (q31_t)0x7211107e, (q31_t)0xc5ec98ee, (q31_t)0x7205a716, (q31_t)0xc5d6346f, + (q31_t)0x71fa3949, (q31_t)0xc5bfd22e, (q31_t)0x71eec716, (q31_t)0xc5a9722c, (q31_t)0x71e35080, (q31_t)0xc593146a, (q31_t)0x71d7d585, (q31_t)0xc57cb8e9, + (q31_t)0x71cc5626, (q31_t)0xc5665fa9, (q31_t)0x71c0d265, (q31_t)0xc55008ab, (q31_t)0x71b54a41, (q31_t)0xc539b3f1, (q31_t)0x71a9bdba, (q31_t)0xc523617a, + (q31_t)0x719e2cd2, (q31_t)0xc50d1149, (q31_t)0x71929789, (q31_t)0xc4f6c35d, (q31_t)0x7186fdde, (q31_t)0xc4e077b8, (q31_t)0x717b5fd3, (q31_t)0xc4ca2e5b, + (q31_t)0x716fbd68, (q31_t)0xc4b3e746, (q31_t)0x7164169d, (q31_t)0xc49da27a, (q31_t)0x71586b74, (q31_t)0xc4875ff9, (q31_t)0x714cbbeb, (q31_t)0xc4711fc2, + (q31_t)0x71410805, (q31_t)0xc45ae1d7, (q31_t)0x71354fc0, (q31_t)0xc444a639, (q31_t)0x7129931f, (q31_t)0xc42e6ce8, (q31_t)0x711dd220, (q31_t)0xc41835e6, + (q31_t)0x71120cc5, (q31_t)0xc4020133, (q31_t)0x7106430e, (q31_t)0xc3ebced0, (q31_t)0x70fa74fc, (q31_t)0xc3d59ebe, (q31_t)0x70eea28e, (q31_t)0xc3bf70fd, + (q31_t)0x70e2cbc6, (q31_t)0xc3a94590, (q31_t)0x70d6f0a4, (q31_t)0xc3931c76, (q31_t)0x70cb1128, (q31_t)0xc37cf5b0, (q31_t)0x70bf2d53, (q31_t)0xc366d140, + (q31_t)0x70b34525, (q31_t)0xc350af26, (q31_t)0x70a7589f, (q31_t)0xc33a8f62, (q31_t)0x709b67c0, (q31_t)0xc32471f7, (q31_t)0x708f728b, (q31_t)0xc30e56e4, + (q31_t)0x708378ff, (q31_t)0xc2f83e2a, (q31_t)0x70777b1c, (q31_t)0xc2e227cb, (q31_t)0x706b78e3, (q31_t)0xc2cc13c7, (q31_t)0x705f7255, (q31_t)0xc2b6021f, + (q31_t)0x70536771, (q31_t)0xc29ff2d4, (q31_t)0x70475839, (q31_t)0xc289e5e7, (q31_t)0x703b44ad, (q31_t)0xc273db58, (q31_t)0x702f2ccd, (q31_t)0xc25dd329, + (q31_t)0x7023109a, (q31_t)0xc247cd5a, (q31_t)0x7016f014, (q31_t)0xc231c9ec, (q31_t)0x700acb3c, (q31_t)0xc21bc8e1, (q31_t)0x6ffea212, (q31_t)0xc205ca38, + (q31_t)0x6ff27497, (q31_t)0xc1efcdf3, (q31_t)0x6fe642ca, (q31_t)0xc1d9d412, (q31_t)0x6fda0cae, (q31_t)0xc1c3dc97, (q31_t)0x6fcdd241, (q31_t)0xc1ade781, + (q31_t)0x6fc19385, (q31_t)0xc197f4d4, (q31_t)0x6fb5507a, (q31_t)0xc182048d, (q31_t)0x6fa90921, (q31_t)0xc16c16b0, (q31_t)0x6f9cbd79, (q31_t)0xc1562b3d, + (q31_t)0x6f906d84, (q31_t)0xc1404233, (q31_t)0x6f841942, (q31_t)0xc12a5b95, (q31_t)0x6f77c0b3, (q31_t)0xc1147764, (q31_t)0x6f6b63d8, (q31_t)0xc0fe959f, + (q31_t)0x6f5f02b2, (q31_t)0xc0e8b648, (q31_t)0x6f529d40, (q31_t)0xc0d2d960, (q31_t)0x6f463383, (q31_t)0xc0bcfee7, (q31_t)0x6f39c57d, (q31_t)0xc0a726df, + (q31_t)0x6f2d532c, (q31_t)0xc0915148, (q31_t)0x6f20dc92, (q31_t)0xc07b7e23, (q31_t)0x6f1461b0, (q31_t)0xc065ad70, (q31_t)0x6f07e285, (q31_t)0xc04fdf32, + (q31_t)0x6efb5f12, (q31_t)0xc03a1368, (q31_t)0x6eeed758, (q31_t)0xc0244a14, (q31_t)0x6ee24b57, (q31_t)0xc00e8336, (q31_t)0x6ed5bb10, (q31_t)0xbff8bece, + (q31_t)0x6ec92683, (q31_t)0xbfe2fcdf, (q31_t)0x6ebc8db0, (q31_t)0xbfcd3d69, (q31_t)0x6eaff099, (q31_t)0xbfb7806c, (q31_t)0x6ea34f3d, (q31_t)0xbfa1c5ea, + (q31_t)0x6e96a99d, (q31_t)0xbf8c0de3, (q31_t)0x6e89ffb9, (q31_t)0xbf765858, (q31_t)0x6e7d5193, (q31_t)0xbf60a54a, (q31_t)0x6e709f2a, (q31_t)0xbf4af4ba, + (q31_t)0x6e63e87f, (q31_t)0xbf3546a8, (q31_t)0x6e572d93, (q31_t)0xbf1f9b16, (q31_t)0x6e4a6e66, (q31_t)0xbf09f205, (q31_t)0x6e3daaf8, (q31_t)0xbef44b74, + (q31_t)0x6e30e34a, (q31_t)0xbedea765, (q31_t)0x6e24175c, (q31_t)0xbec905d9, (q31_t)0x6e174730, (q31_t)0xbeb366d1, (q31_t)0x6e0a72c5, (q31_t)0xbe9dca4e, + (q31_t)0x6dfd9a1c, (q31_t)0xbe88304f, (q31_t)0x6df0bd35, (q31_t)0xbe7298d7, (q31_t)0x6de3dc11, (q31_t)0xbe5d03e6, (q31_t)0x6dd6f6b1, (q31_t)0xbe47717c, + (q31_t)0x6dca0d14, (q31_t)0xbe31e19b, (q31_t)0x6dbd1f3c, (q31_t)0xbe1c5444, (q31_t)0x6db02d29, (q31_t)0xbe06c977, (q31_t)0x6da336dc, (q31_t)0xbdf14135, + (q31_t)0x6d963c54, (q31_t)0xbddbbb7f, (q31_t)0x6d893d93, (q31_t)0xbdc63856, (q31_t)0x6d7c3a98, (q31_t)0xbdb0b7bb, (q31_t)0x6d6f3365, (q31_t)0xbd9b39ad, + (q31_t)0x6d6227fa, (q31_t)0xbd85be30, (q31_t)0x6d551858, (q31_t)0xbd704542, (q31_t)0x6d48047e, (q31_t)0xbd5acee5, (q31_t)0x6d3aec6e, (q31_t)0xbd455b1a, + (q31_t)0x6d2dd027, (q31_t)0xbd2fe9e2, (q31_t)0x6d20afac, (q31_t)0xbd1a7b3d, (q31_t)0x6d138afb, (q31_t)0xbd050f2c, (q31_t)0x6d066215, (q31_t)0xbcefa5b0, + (q31_t)0x6cf934fc, (q31_t)0xbcda3ecb, (q31_t)0x6cec03af, (q31_t)0xbcc4da7b, (q31_t)0x6cdece2f, (q31_t)0xbcaf78c4, (q31_t)0x6cd1947c, (q31_t)0xbc9a19a5, + (q31_t)0x6cc45698, (q31_t)0xbc84bd1f, (q31_t)0x6cb71482, (q31_t)0xbc6f6333, (q31_t)0x6ca9ce3b, (q31_t)0xbc5a0be2, (q31_t)0x6c9c83c3, (q31_t)0xbc44b72c, + (q31_t)0x6c8f351c, (q31_t)0xbc2f6513, (q31_t)0x6c81e245, (q31_t)0xbc1a1598, (q31_t)0x6c748b3f, (q31_t)0xbc04c8ba, (q31_t)0x6c67300b, (q31_t)0xbbef7e7c, + (q31_t)0x6c59d0a9, (q31_t)0xbbda36dd, (q31_t)0x6c4c6d1a, (q31_t)0xbbc4f1df, (q31_t)0x6c3f055d, (q31_t)0xbbafaf82, (q31_t)0x6c319975, (q31_t)0xbb9a6fc7, + (q31_t)0x6c242960, (q31_t)0xbb8532b0, (q31_t)0x6c16b521, (q31_t)0xbb6ff83c, (q31_t)0x6c093cb6, (q31_t)0xbb5ac06d, (q31_t)0x6bfbc021, (q31_t)0xbb458b43, + (q31_t)0x6bee3f62, (q31_t)0xbb3058c0, (q31_t)0x6be0ba7b, (q31_t)0xbb1b28e4, (q31_t)0x6bd3316a, (q31_t)0xbb05fbb0, (q31_t)0x6bc5a431, (q31_t)0xbaf0d125, + (q31_t)0x6bb812d1, (q31_t)0xbadba943, (q31_t)0x6baa7d49, (q31_t)0xbac6840c, (q31_t)0x6b9ce39b, (q31_t)0xbab16180, (q31_t)0x6b8f45c7, (q31_t)0xba9c41a0, + (q31_t)0x6b81a3cd, (q31_t)0xba87246d, (q31_t)0x6b73fdae, (q31_t)0xba7209e7, (q31_t)0x6b66536b, (q31_t)0xba5cf210, (q31_t)0x6b58a503, (q31_t)0xba47dce8, + (q31_t)0x6b4af279, (q31_t)0xba32ca71, (q31_t)0x6b3d3bcb, (q31_t)0xba1dbaaa, (q31_t)0x6b2f80fb, (q31_t)0xba08ad95, (q31_t)0x6b21c208, (q31_t)0xb9f3a332, + (q31_t)0x6b13fef5, (q31_t)0xb9de9b83, (q31_t)0x6b0637c1, (q31_t)0xb9c99688, (q31_t)0x6af86c6c, (q31_t)0xb9b49442, (q31_t)0x6aea9cf8, (q31_t)0xb99f94b2, + (q31_t)0x6adcc964, (q31_t)0xb98a97d8, (q31_t)0x6acef1b2, (q31_t)0xb9759db6, (q31_t)0x6ac115e2, (q31_t)0xb960a64c, (q31_t)0x6ab335f4, (q31_t)0xb94bb19b, + (q31_t)0x6aa551e9, (q31_t)0xb936bfa4, (q31_t)0x6a9769c1, (q31_t)0xb921d067, (q31_t)0x6a897d7d, (q31_t)0xb90ce3e6, (q31_t)0x6a7b8d1e, (q31_t)0xb8f7fa21, + (q31_t)0x6a6d98a4, (q31_t)0xb8e31319, (q31_t)0x6a5fa010, (q31_t)0xb8ce2ecf, (q31_t)0x6a51a361, (q31_t)0xb8b94d44, (q31_t)0x6a43a29a, (q31_t)0xb8a46e78, + (q31_t)0x6a359db9, (q31_t)0xb88f926d, (q31_t)0x6a2794c1, (q31_t)0xb87ab922, (q31_t)0x6a1987b0, (q31_t)0xb865e299, (q31_t)0x6a0b7689, (q31_t)0xb8510ed4, + (q31_t)0x69fd614a, (q31_t)0xb83c3dd1, (q31_t)0x69ef47f6, (q31_t)0xb8276f93, (q31_t)0x69e12a8c, (q31_t)0xb812a41a, (q31_t)0x69d3090e, (q31_t)0xb7fddb67, + (q31_t)0x69c4e37a, (q31_t)0xb7e9157a, (q31_t)0x69b6b9d3, (q31_t)0xb7d45255, (q31_t)0x69a88c19, (q31_t)0xb7bf91f8, (q31_t)0x699a5a4c, (q31_t)0xb7aad465, + (q31_t)0x698c246c, (q31_t)0xb796199b, (q31_t)0x697dea7b, (q31_t)0xb781619c, (q31_t)0x696fac78, (q31_t)0xb76cac69, (q31_t)0x69616a65, (q31_t)0xb757fa01, + (q31_t)0x69532442, (q31_t)0xb7434a67, (q31_t)0x6944da10, (q31_t)0xb72e9d9b, (q31_t)0x69368bce, (q31_t)0xb719f39e, (q31_t)0x6928397e, (q31_t)0xb7054c6f, + (q31_t)0x6919e320, (q31_t)0xb6f0a812, (q31_t)0x690b88b5, (q31_t)0xb6dc0685, (q31_t)0x68fd2a3d, (q31_t)0xb6c767ca, (q31_t)0x68eec7b9, (q31_t)0xb6b2cbe2, + (q31_t)0x68e06129, (q31_t)0xb69e32cd, (q31_t)0x68d1f68f, (q31_t)0xb6899c8d, (q31_t)0x68c387e9, (q31_t)0xb6750921, (q31_t)0x68b5153a, (q31_t)0xb660788c, + (q31_t)0x68a69e81, (q31_t)0xb64beacd, (q31_t)0x689823bf, (q31_t)0xb6375fe5, (q31_t)0x6889a4f6, (q31_t)0xb622d7d6, (q31_t)0x687b2224, (q31_t)0xb60e529f, + (q31_t)0x686c9b4b, (q31_t)0xb5f9d043, (q31_t)0x685e106c, (q31_t)0xb5e550c1, (q31_t)0x684f8186, (q31_t)0xb5d0d41a, (q31_t)0x6840ee9b, (q31_t)0xb5bc5a50, + (q31_t)0x683257ab, (q31_t)0xb5a7e362, (q31_t)0x6823bcb7, (q31_t)0xb5936f53, (q31_t)0x68151dbe, (q31_t)0xb57efe22, (q31_t)0x68067ac3, (q31_t)0xb56a8fd0, + (q31_t)0x67f7d3c5, (q31_t)0xb556245e, (q31_t)0x67e928c5, (q31_t)0xb541bbcd, (q31_t)0x67da79c3, (q31_t)0xb52d561e, (q31_t)0x67cbc6c0, (q31_t)0xb518f351, + (q31_t)0x67bd0fbd, (q31_t)0xb5049368, (q31_t)0x67ae54ba, (q31_t)0xb4f03663, (q31_t)0x679f95b7, (q31_t)0xb4dbdc42, (q31_t)0x6790d2b6, (q31_t)0xb4c78507, + (q31_t)0x67820bb7, (q31_t)0xb4b330b3, (q31_t)0x677340ba, (q31_t)0xb49edf45, (q31_t)0x676471c0, (q31_t)0xb48a90c0, (q31_t)0x67559eca, (q31_t)0xb4764523, + (q31_t)0x6746c7d8, (q31_t)0xb461fc70, (q31_t)0x6737ecea, (q31_t)0xb44db6a8, (q31_t)0x67290e02, (q31_t)0xb43973ca, (q31_t)0x671a2b20, (q31_t)0xb42533d8, + (q31_t)0x670b4444, (q31_t)0xb410f6d3, (q31_t)0x66fc596f, (q31_t)0xb3fcbcbb, (q31_t)0x66ed6aa1, (q31_t)0xb3e88592, (q31_t)0x66de77dc, (q31_t)0xb3d45157, + (q31_t)0x66cf8120, (q31_t)0xb3c0200c, (q31_t)0x66c0866d, (q31_t)0xb3abf1b2, (q31_t)0x66b187c3, (q31_t)0xb397c649, (q31_t)0x66a28524, (q31_t)0xb3839dd3, + (q31_t)0x66937e91, (q31_t)0xb36f784f, (q31_t)0x66847408, (q31_t)0xb35b55bf, (q31_t)0x6675658c, (q31_t)0xb3473623, (q31_t)0x6666531d, (q31_t)0xb333197c, + (q31_t)0x66573cbb, (q31_t)0xb31effcc, (q31_t)0x66482267, (q31_t)0xb30ae912, (q31_t)0x66390422, (q31_t)0xb2f6d550, (q31_t)0x6629e1ec, (q31_t)0xb2e2c486, + (q31_t)0x661abbc5, (q31_t)0xb2ceb6b5, (q31_t)0x660b91af, (q31_t)0xb2baabde, (q31_t)0x65fc63a9, (q31_t)0xb2a6a402, (q31_t)0x65ed31b5, (q31_t)0xb2929f21, + (q31_t)0x65ddfbd3, (q31_t)0xb27e9d3c, (q31_t)0x65cec204, (q31_t)0xb26a9e54, (q31_t)0x65bf8447, (q31_t)0xb256a26a, (q31_t)0x65b0429f, (q31_t)0xb242a97e, + (q31_t)0x65a0fd0b, (q31_t)0xb22eb392, (q31_t)0x6591b38c, (q31_t)0xb21ac0a6, (q31_t)0x65826622, (q31_t)0xb206d0ba, (q31_t)0x657314cf, (q31_t)0xb1f2e3d0, + (q31_t)0x6563bf92, (q31_t)0xb1def9e9, (q31_t)0x6554666d, (q31_t)0xb1cb1304, (q31_t)0x6545095f, (q31_t)0xb1b72f23, (q31_t)0x6535a86b, (q31_t)0xb1a34e47, + (q31_t)0x6526438f, (q31_t)0xb18f7071, (q31_t)0x6516dacd, (q31_t)0xb17b95a0, (q31_t)0x65076e25, (q31_t)0xb167bdd7, (q31_t)0x64f7fd98, (q31_t)0xb153e915, + (q31_t)0x64e88926, (q31_t)0xb140175b, (q31_t)0x64d910d1, (q31_t)0xb12c48ab, (q31_t)0x64c99498, (q31_t)0xb1187d05, (q31_t)0x64ba147d, (q31_t)0xb104b46a, + (q31_t)0x64aa907f, (q31_t)0xb0f0eeda, (q31_t)0x649b08a0, (q31_t)0xb0dd2c56, (q31_t)0x648b7ce0, (q31_t)0xb0c96ce0, (q31_t)0x647bed3f, (q31_t)0xb0b5b077, + (q31_t)0x646c59bf, (q31_t)0xb0a1f71d, (q31_t)0x645cc260, (q31_t)0xb08e40d2, (q31_t)0x644d2722, (q31_t)0xb07a8d97, (q31_t)0x643d8806, (q31_t)0xb066dd6d, + (q31_t)0x642de50d, (q31_t)0xb0533055, (q31_t)0x641e3e38, (q31_t)0xb03f864f, (q31_t)0x640e9386, (q31_t)0xb02bdf5c, (q31_t)0x63fee4f8, (q31_t)0xb0183b7d, + (q31_t)0x63ef3290, (q31_t)0xb0049ab3, (q31_t)0x63df7c4d, (q31_t)0xaff0fcfe, (q31_t)0x63cfc231, (q31_t)0xafdd625f, (q31_t)0x63c0043b, (q31_t)0xafc9cad7, + (q31_t)0x63b0426d, (q31_t)0xafb63667, (q31_t)0x63a07cc7, (q31_t)0xafa2a50f, (q31_t)0x6390b34a, (q31_t)0xaf8f16d1, (q31_t)0x6380e5f6, (q31_t)0xaf7b8bac, + (q31_t)0x637114cc, (q31_t)0xaf6803a2, (q31_t)0x63613fcd, (q31_t)0xaf547eb3, (q31_t)0x635166f9, (q31_t)0xaf40fce1, (q31_t)0x63418a50, (q31_t)0xaf2d7e2b, + (q31_t)0x6331a9d4, (q31_t)0xaf1a0293, (q31_t)0x6321c585, (q31_t)0xaf068a1a, (q31_t)0x6311dd64, (q31_t)0xaef314c0, (q31_t)0x6301f171, (q31_t)0xaedfa285, + (q31_t)0x62f201ac, (q31_t)0xaecc336c, (q31_t)0x62e20e17, (q31_t)0xaeb8c774, (q31_t)0x62d216b3, (q31_t)0xaea55e9e, (q31_t)0x62c21b7e, (q31_t)0xae91f8eb, + (q31_t)0x62b21c7b, (q31_t)0xae7e965b, (q31_t)0x62a219aa, (q31_t)0xae6b36f0, (q31_t)0x6292130c, (q31_t)0xae57daab, (q31_t)0x628208a1, (q31_t)0xae44818b, + (q31_t)0x6271fa69, (q31_t)0xae312b92, (q31_t)0x6261e866, (q31_t)0xae1dd8c0, (q31_t)0x6251d298, (q31_t)0xae0a8916, (q31_t)0x6241b8ff, (q31_t)0xadf73c96, + (q31_t)0x62319b9d, (q31_t)0xade3f33e, (q31_t)0x62217a72, (q31_t)0xadd0ad12, (q31_t)0x6211557e, (q31_t)0xadbd6a10, (q31_t)0x62012cc2, (q31_t)0xadaa2a3b, + (q31_t)0x61f1003f, (q31_t)0xad96ed92, (q31_t)0x61e0cff5, (q31_t)0xad83b416, (q31_t)0x61d09be5, (q31_t)0xad707dc8, (q31_t)0x61c06410, (q31_t)0xad5d4aaa, + (q31_t)0x61b02876, (q31_t)0xad4a1aba, (q31_t)0x619fe918, (q31_t)0xad36edfc, (q31_t)0x618fa5f7, (q31_t)0xad23c46e, (q31_t)0x617f5f12, (q31_t)0xad109e12, + (q31_t)0x616f146c, (q31_t)0xacfd7ae8, (q31_t)0x615ec603, (q31_t)0xacea5af2, (q31_t)0x614e73da, (q31_t)0xacd73e30, (q31_t)0x613e1df0, (q31_t)0xacc424a3, + (q31_t)0x612dc447, (q31_t)0xacb10e4b, (q31_t)0x611d66de, (q31_t)0xac9dfb29, (q31_t)0x610d05b7, (q31_t)0xac8aeb3e, (q31_t)0x60fca0d2, (q31_t)0xac77de8b, + (q31_t)0x60ec3830, (q31_t)0xac64d510, (q31_t)0x60dbcbd1, (q31_t)0xac51cecf, (q31_t)0x60cb5bb7, (q31_t)0xac3ecbc7, (q31_t)0x60bae7e1, (q31_t)0xac2bcbfa, + (q31_t)0x60aa7050, (q31_t)0xac18cf69, (q31_t)0x6099f505, (q31_t)0xac05d613, (q31_t)0x60897601, (q31_t)0xabf2dffb, (q31_t)0x6078f344, (q31_t)0xabdfed1f, + (q31_t)0x60686ccf, (q31_t)0xabccfd83, (q31_t)0x6057e2a2, (q31_t)0xabba1125, (q31_t)0x604754bf, (q31_t)0xaba72807, (q31_t)0x6036c325, (q31_t)0xab944229, + (q31_t)0x60262dd6, (q31_t)0xab815f8d, (q31_t)0x601594d1, (q31_t)0xab6e8032, (q31_t)0x6004f819, (q31_t)0xab5ba41a, (q31_t)0x5ff457ad, (q31_t)0xab48cb46, + (q31_t)0x5fe3b38d, (q31_t)0xab35f5b5, (q31_t)0x5fd30bbc, (q31_t)0xab23236a, (q31_t)0x5fc26038, (q31_t)0xab105464, (q31_t)0x5fb1b104, (q31_t)0xaafd88a4, + (q31_t)0x5fa0fe1f, (q31_t)0xaaeac02c, (q31_t)0x5f90478a, (q31_t)0xaad7fafb, (q31_t)0x5f7f8d46, (q31_t)0xaac53912, (q31_t)0x5f6ecf53, (q31_t)0xaab27a73, + (q31_t)0x5f5e0db3, (q31_t)0xaa9fbf1e, (q31_t)0x5f4d4865, (q31_t)0xaa8d0713, (q31_t)0x5f3c7f6b, (q31_t)0xaa7a5253, (q31_t)0x5f2bb2c5, (q31_t)0xaa67a0e0, + (q31_t)0x5f1ae274, (q31_t)0xaa54f2ba, (q31_t)0x5f0a0e77, (q31_t)0xaa4247e1, (q31_t)0x5ef936d1, (q31_t)0xaa2fa056, (q31_t)0x5ee85b82, (q31_t)0xaa1cfc1a, + (q31_t)0x5ed77c8a, (q31_t)0xaa0a5b2e, (q31_t)0x5ec699e9, (q31_t)0xa9f7bd92, (q31_t)0x5eb5b3a2, (q31_t)0xa9e52347, (q31_t)0x5ea4c9b3, (q31_t)0xa9d28c4e, + (q31_t)0x5e93dc1f, (q31_t)0xa9bff8a8, (q31_t)0x5e82eae5, (q31_t)0xa9ad6855, (q31_t)0x5e71f606, (q31_t)0xa99adb56, (q31_t)0x5e60fd84, (q31_t)0xa98851ac, + (q31_t)0x5e50015d, (q31_t)0xa975cb57, (q31_t)0x5e3f0194, (q31_t)0xa9634858, (q31_t)0x5e2dfe29, (q31_t)0xa950c8b0, (q31_t)0x5e1cf71c, (q31_t)0xa93e4c5f, + (q31_t)0x5e0bec6e, (q31_t)0xa92bd367, (q31_t)0x5dfade20, (q31_t)0xa9195dc7, (q31_t)0x5de9cc33, (q31_t)0xa906eb82, (q31_t)0x5dd8b6a7, (q31_t)0xa8f47c97, + (q31_t)0x5dc79d7c, (q31_t)0xa8e21106, (q31_t)0x5db680b4, (q31_t)0xa8cfa8d2, (q31_t)0x5da5604f, (q31_t)0xa8bd43fa, (q31_t)0x5d943c4e, (q31_t)0xa8aae280, + (q31_t)0x5d8314b1, (q31_t)0xa8988463, (q31_t)0x5d71e979, (q31_t)0xa88629a5, (q31_t)0x5d60baa7, (q31_t)0xa873d246, (q31_t)0x5d4f883b, (q31_t)0xa8617e48, + (q31_t)0x5d3e5237, (q31_t)0xa84f2daa, (q31_t)0x5d2d189a, (q31_t)0xa83ce06e, (q31_t)0x5d1bdb65, (q31_t)0xa82a9693, (q31_t)0x5d0a9a9a, (q31_t)0xa818501c, + (q31_t)0x5cf95638, (q31_t)0xa8060d08, (q31_t)0x5ce80e41, (q31_t)0xa7f3cd59, (q31_t)0x5cd6c2b5, (q31_t)0xa7e1910f, (q31_t)0x5cc57394, (q31_t)0xa7cf582a, + (q31_t)0x5cb420e0, (q31_t)0xa7bd22ac, (q31_t)0x5ca2ca99, (q31_t)0xa7aaf094, (q31_t)0x5c9170bf, (q31_t)0xa798c1e5, (q31_t)0x5c801354, (q31_t)0xa786969e, + (q31_t)0x5c6eb258, (q31_t)0xa7746ec0, (q31_t)0x5c5d4dcc, (q31_t)0xa7624a4d, (q31_t)0x5c4be5b0, (q31_t)0xa7502943, (q31_t)0x5c3a7a05, (q31_t)0xa73e0ba5, + (q31_t)0x5c290acc, (q31_t)0xa72bf174, (q31_t)0x5c179806, (q31_t)0xa719daae, (q31_t)0x5c0621b2, (q31_t)0xa707c757, (q31_t)0x5bf4a7d2, (q31_t)0xa6f5b76d, + (q31_t)0x5be32a67, (q31_t)0xa6e3aaf2, (q31_t)0x5bd1a971, (q31_t)0xa6d1a1e7, (q31_t)0x5bc024f0, (q31_t)0xa6bf9c4b, (q31_t)0x5bae9ce7, (q31_t)0xa6ad9a21, + (q31_t)0x5b9d1154, (q31_t)0xa69b9b68, (q31_t)0x5b8b8239, (q31_t)0xa689a022, (q31_t)0x5b79ef96, (q31_t)0xa677a84e, (q31_t)0x5b68596d, (q31_t)0xa665b3ee, + (q31_t)0x5b56bfbd, (q31_t)0xa653c303, (q31_t)0x5b452288, (q31_t)0xa641d58c, (q31_t)0x5b3381ce, (q31_t)0xa62feb8b, (q31_t)0x5b21dd90, (q31_t)0xa61e0501, + (q31_t)0x5b1035cf, (q31_t)0xa60c21ee, (q31_t)0x5afe8a8b, (q31_t)0xa5fa4252, (q31_t)0x5aecdbc5, (q31_t)0xa5e8662f, (q31_t)0x5adb297d, (q31_t)0xa5d68d85, + (q31_t)0x5ac973b5, (q31_t)0xa5c4b855, (q31_t)0x5ab7ba6c, (q31_t)0xa5b2e6a0, (q31_t)0x5aa5fda5, (q31_t)0xa5a11866, (q31_t)0x5a943d5e, (q31_t)0xa58f4da8, + (q31_t)0x5a82799a, (q31_t)0xa57d8666, (q31_t)0x5a70b258, (q31_t)0xa56bc2a2, (q31_t)0x5a5ee79a, (q31_t)0xa55a025b, (q31_t)0x5a4d1960, (q31_t)0xa5484594, + (q31_t)0x5a3b47ab, (q31_t)0xa5368c4b, (q31_t)0x5a29727b, (q31_t)0xa524d683, (q31_t)0x5a1799d1, (q31_t)0xa513243b, (q31_t)0x5a05bdae, (q31_t)0xa5017575, + (q31_t)0x59f3de12, (q31_t)0xa4efca31, (q31_t)0x59e1faff, (q31_t)0xa4de2270, (q31_t)0x59d01475, (q31_t)0xa4cc7e32, (q31_t)0x59be2a74, (q31_t)0xa4badd78, + (q31_t)0x59ac3cfd, (q31_t)0xa4a94043, (q31_t)0x599a4c12, (q31_t)0xa497a693, (q31_t)0x598857b2, (q31_t)0xa486106a, (q31_t)0x59765fde, (q31_t)0xa4747dc7, + (q31_t)0x59646498, (q31_t)0xa462eeac, (q31_t)0x595265df, (q31_t)0xa4516319, (q31_t)0x594063b5, (q31_t)0xa43fdb10, (q31_t)0x592e5e19, (q31_t)0xa42e568f, + (q31_t)0x591c550e, (q31_t)0xa41cd599, (q31_t)0x590a4893, (q31_t)0xa40b582e, (q31_t)0x58f838a9, (q31_t)0xa3f9de4e, (q31_t)0x58e62552, (q31_t)0xa3e867fa, + (q31_t)0x58d40e8c, (q31_t)0xa3d6f534, (q31_t)0x58c1f45b, (q31_t)0xa3c585fb, (q31_t)0x58afd6bd, (q31_t)0xa3b41a50, (q31_t)0x589db5b3, (q31_t)0xa3a2b234, + (q31_t)0x588b9140, (q31_t)0xa3914da8, (q31_t)0x58796962, (q31_t)0xa37fecac, (q31_t)0x58673e1b, (q31_t)0xa36e8f41, (q31_t)0x58550f6c, (q31_t)0xa35d3567, + (q31_t)0x5842dd54, (q31_t)0xa34bdf20, (q31_t)0x5830a7d6, (q31_t)0xa33a8c6c, (q31_t)0x581e6ef1, (q31_t)0xa3293d4b, (q31_t)0x580c32a7, (q31_t)0xa317f1bf, + (q31_t)0x57f9f2f8, (q31_t)0xa306a9c8, (q31_t)0x57e7afe4, (q31_t)0xa2f56566, (q31_t)0x57d5696d, (q31_t)0xa2e4249b, (q31_t)0x57c31f92, (q31_t)0xa2d2e766, + (q31_t)0x57b0d256, (q31_t)0xa2c1adc9, (q31_t)0x579e81b8, (q31_t)0xa2b077c5, (q31_t)0x578c2dba, (q31_t)0xa29f4559, (q31_t)0x5779d65b, (q31_t)0xa28e1687, + (q31_t)0x57677b9d, (q31_t)0xa27ceb4f, (q31_t)0x57551d80, (q31_t)0xa26bc3b2, (q31_t)0x5742bc06, (q31_t)0xa25a9fb1, (q31_t)0x5730572e, (q31_t)0xa2497f4c, + (q31_t)0x571deefa, (q31_t)0xa2386284, (q31_t)0x570b8369, (q31_t)0xa2274959, (q31_t)0x56f9147e, (q31_t)0xa21633cd, (q31_t)0x56e6a239, (q31_t)0xa20521e0, + (q31_t)0x56d42c99, (q31_t)0xa1f41392, (q31_t)0x56c1b3a1, (q31_t)0xa1e308e4, (q31_t)0x56af3750, (q31_t)0xa1d201d7, (q31_t)0x569cb7a8, (q31_t)0xa1c0fe6c, + (q31_t)0x568a34a9, (q31_t)0xa1affea3, (q31_t)0x5677ae54, (q31_t)0xa19f027c, (q31_t)0x566524aa, (q31_t)0xa18e09fa, (q31_t)0x565297ab, (q31_t)0xa17d151b, + (q31_t)0x56400758, (q31_t)0xa16c23e1, (q31_t)0x562d73b2, (q31_t)0xa15b364d, (q31_t)0x561adcb9, (q31_t)0xa14a4c5e, (q31_t)0x5608426e, (q31_t)0xa1396617, + (q31_t)0x55f5a4d2, (q31_t)0xa1288376, (q31_t)0x55e303e6, (q31_t)0xa117a47e, (q31_t)0x55d05faa, (q31_t)0xa106c92f, (q31_t)0x55bdb81f, (q31_t)0xa0f5f189, + (q31_t)0x55ab0d46, (q31_t)0xa0e51d8c, (q31_t)0x55985f20, (q31_t)0xa0d44d3b, (q31_t)0x5585adad, (q31_t)0xa0c38095, (q31_t)0x5572f8ed, (q31_t)0xa0b2b79b, + (q31_t)0x556040e2, (q31_t)0xa0a1f24d, (q31_t)0x554d858d, (q31_t)0xa09130ad, (q31_t)0x553ac6ee, (q31_t)0xa08072ba, (q31_t)0x55280505, (q31_t)0xa06fb876, + (q31_t)0x55153fd4, (q31_t)0xa05f01e1, (q31_t)0x5502775c, (q31_t)0xa04e4efc, (q31_t)0x54efab9c, (q31_t)0xa03d9fc8, (q31_t)0x54dcdc96, (q31_t)0xa02cf444, + (q31_t)0x54ca0a4b, (q31_t)0xa01c4c73, (q31_t)0x54b734ba, (q31_t)0xa00ba853, (q31_t)0x54a45be6, (q31_t)0x9ffb07e7, (q31_t)0x54917fce, (q31_t)0x9fea6b2f, + (q31_t)0x547ea073, (q31_t)0x9fd9d22a, (q31_t)0x546bbdd7, (q31_t)0x9fc93cdb, (q31_t)0x5458d7f9, (q31_t)0x9fb8ab41, (q31_t)0x5445eedb, (q31_t)0x9fa81d5e, + (q31_t)0x5433027d, (q31_t)0x9f979331, (q31_t)0x542012e1, (q31_t)0x9f870cbc, (q31_t)0x540d2005, (q31_t)0x9f7689ff, (q31_t)0x53fa29ed, (q31_t)0x9f660afb, + (q31_t)0x53e73097, (q31_t)0x9f558fb0, (q31_t)0x53d43406, (q31_t)0x9f45181f, (q31_t)0x53c13439, (q31_t)0x9f34a449, (q31_t)0x53ae3131, (q31_t)0x9f24342f, + (q31_t)0x539b2af0, (q31_t)0x9f13c7d0, (q31_t)0x53882175, (q31_t)0x9f035f2e, (q31_t)0x537514c2, (q31_t)0x9ef2fa49, (q31_t)0x536204d7, (q31_t)0x9ee29922, + (q31_t)0x534ef1b5, (q31_t)0x9ed23bb9, (q31_t)0x533bdb5d, (q31_t)0x9ec1e210, (q31_t)0x5328c1d0, (q31_t)0x9eb18c26, (q31_t)0x5315a50e, (q31_t)0x9ea139fd, + (q31_t)0x53028518, (q31_t)0x9e90eb94, (q31_t)0x52ef61ee, (q31_t)0x9e80a0ee, (q31_t)0x52dc3b92, (q31_t)0x9e705a09, (q31_t)0x52c91204, (q31_t)0x9e6016e8, + (q31_t)0x52b5e546, (q31_t)0x9e4fd78a, (q31_t)0x52a2b556, (q31_t)0x9e3f9bf0, (q31_t)0x528f8238, (q31_t)0x9e2f641b, (q31_t)0x527c4bea, (q31_t)0x9e1f300b, + (q31_t)0x5269126e, (q31_t)0x9e0effc1, (q31_t)0x5255d5c5, (q31_t)0x9dfed33e, (q31_t)0x524295f0, (q31_t)0x9deeaa82, (q31_t)0x522f52ee, (q31_t)0x9dde858e, + (q31_t)0x521c0cc2, (q31_t)0x9dce6463, (q31_t)0x5208c36a, (q31_t)0x9dbe4701, (q31_t)0x51f576ea, (q31_t)0x9dae2d68, (q31_t)0x51e22740, (q31_t)0x9d9e179a, + (q31_t)0x51ced46e, (q31_t)0x9d8e0597, (q31_t)0x51bb7e75, (q31_t)0x9d7df75f, (q31_t)0x51a82555, (q31_t)0x9d6decf4, (q31_t)0x5194c910, (q31_t)0x9d5de656, + (q31_t)0x518169a5, (q31_t)0x9d4de385, (q31_t)0x516e0715, (q31_t)0x9d3de482, (q31_t)0x515aa162, (q31_t)0x9d2de94d, (q31_t)0x5147388c, (q31_t)0x9d1df1e9, + (q31_t)0x5133cc94, (q31_t)0x9d0dfe54, (q31_t)0x51205d7b, (q31_t)0x9cfe0e8f, (q31_t)0x510ceb40, (q31_t)0x9cee229c, (q31_t)0x50f975e6, (q31_t)0x9cde3a7b, + (q31_t)0x50e5fd6d, (q31_t)0x9cce562c, (q31_t)0x50d281d5, (q31_t)0x9cbe75b0, (q31_t)0x50bf031f, (q31_t)0x9cae9907, (q31_t)0x50ab814d, (q31_t)0x9c9ec033, + (q31_t)0x5097fc5e, (q31_t)0x9c8eeb34, (q31_t)0x50847454, (q31_t)0x9c7f1a0a, (q31_t)0x5070e92f, (q31_t)0x9c6f4cb6, (q31_t)0x505d5af1, (q31_t)0x9c5f8339, + (q31_t)0x5049c999, (q31_t)0x9c4fbd93, (q31_t)0x50363529, (q31_t)0x9c3ffbc5, (q31_t)0x50229da1, (q31_t)0x9c303dcf, (q31_t)0x500f0302, (q31_t)0x9c2083b3, + (q31_t)0x4ffb654d, (q31_t)0x9c10cd70, (q31_t)0x4fe7c483, (q31_t)0x9c011b08, (q31_t)0x4fd420a4, (q31_t)0x9bf16c7a, (q31_t)0x4fc079b1, (q31_t)0x9be1c1c8, + (q31_t)0x4faccfab, (q31_t)0x9bd21af3, (q31_t)0x4f992293, (q31_t)0x9bc277fa, (q31_t)0x4f857269, (q31_t)0x9bb2d8de, (q31_t)0x4f71bf2e, (q31_t)0x9ba33da0, + (q31_t)0x4f5e08e3, (q31_t)0x9b93a641, (q31_t)0x4f4a4f89, (q31_t)0x9b8412c1, (q31_t)0x4f369320, (q31_t)0x9b748320, (q31_t)0x4f22d3aa, (q31_t)0x9b64f760, + (q31_t)0x4f0f1126, (q31_t)0x9b556f81, (q31_t)0x4efb4b96, (q31_t)0x9b45eb83, (q31_t)0x4ee782fb, (q31_t)0x9b366b68, (q31_t)0x4ed3b755, (q31_t)0x9b26ef2f, + (q31_t)0x4ebfe8a5, (q31_t)0x9b1776da, (q31_t)0x4eac16eb, (q31_t)0x9b080268, (q31_t)0x4e984229, (q31_t)0x9af891db, (q31_t)0x4e846a60, (q31_t)0x9ae92533, + (q31_t)0x4e708f8f, (q31_t)0x9ad9bc71, (q31_t)0x4e5cb1b9, (q31_t)0x9aca5795, (q31_t)0x4e48d0dd, (q31_t)0x9abaf6a1, (q31_t)0x4e34ecfc, (q31_t)0x9aab9993, + (q31_t)0x4e210617, (q31_t)0x9a9c406e, (q31_t)0x4e0d1c30, (q31_t)0x9a8ceb31, (q31_t)0x4df92f46, (q31_t)0x9a7d99de, (q31_t)0x4de53f5a, (q31_t)0x9a6e4c74, + (q31_t)0x4dd14c6e, (q31_t)0x9a5f02f5, (q31_t)0x4dbd5682, (q31_t)0x9a4fbd61, (q31_t)0x4da95d96, (q31_t)0x9a407bb9, (q31_t)0x4d9561ac, (q31_t)0x9a313dfc, + (q31_t)0x4d8162c4, (q31_t)0x9a22042d, (q31_t)0x4d6d60df, (q31_t)0x9a12ce4b, (q31_t)0x4d595bfe, (q31_t)0x9a039c57, (q31_t)0x4d455422, (q31_t)0x99f46e51, + (q31_t)0x4d31494b, (q31_t)0x99e5443b, (q31_t)0x4d1d3b7a, (q31_t)0x99d61e14, (q31_t)0x4d092ab0, (q31_t)0x99c6fbde, (q31_t)0x4cf516ee, (q31_t)0x99b7dd99, + (q31_t)0x4ce10034, (q31_t)0x99a8c345, (q31_t)0x4ccce684, (q31_t)0x9999ace3, (q31_t)0x4cb8c9dd, (q31_t)0x998a9a74, (q31_t)0x4ca4aa41, (q31_t)0x997b8bf8, + (q31_t)0x4c9087b1, (q31_t)0x996c816f, (q31_t)0x4c7c622d, (q31_t)0x995d7adc, (q31_t)0x4c6839b7, (q31_t)0x994e783d, (q31_t)0x4c540e4e, (q31_t)0x993f7993, + (q31_t)0x4c3fdff4, (q31_t)0x99307ee0, (q31_t)0x4c2baea9, (q31_t)0x99218824, (q31_t)0x4c177a6e, (q31_t)0x9912955f, (q31_t)0x4c034345, (q31_t)0x9903a691, + (q31_t)0x4bef092d, (q31_t)0x98f4bbbc, (q31_t)0x4bdacc28, (q31_t)0x98e5d4e0, (q31_t)0x4bc68c36, (q31_t)0x98d6f1fe, (q31_t)0x4bb24958, (q31_t)0x98c81316, + (q31_t)0x4b9e0390, (q31_t)0x98b93828, (q31_t)0x4b89badd, (q31_t)0x98aa6136, (q31_t)0x4b756f40, (q31_t)0x989b8e40, (q31_t)0x4b6120bb, (q31_t)0x988cbf46, + (q31_t)0x4b4ccf4d, (q31_t)0x987df449, (q31_t)0x4b387af9, (q31_t)0x986f2d4a, (q31_t)0x4b2423be, (q31_t)0x98606a49, (q31_t)0x4b0fc99d, (q31_t)0x9851ab46, + (q31_t)0x4afb6c98, (q31_t)0x9842f043, (q31_t)0x4ae70caf, (q31_t)0x98343940, (q31_t)0x4ad2a9e2, (q31_t)0x9825863d, (q31_t)0x4abe4433, (q31_t)0x9816d73b, + (q31_t)0x4aa9dba2, (q31_t)0x98082c3b, (q31_t)0x4a957030, (q31_t)0x97f9853d, (q31_t)0x4a8101de, (q31_t)0x97eae242, (q31_t)0x4a6c90ad, (q31_t)0x97dc4349, + (q31_t)0x4a581c9e, (q31_t)0x97cda855, (q31_t)0x4a43a5b0, (q31_t)0x97bf1165, (q31_t)0x4a2f2be6, (q31_t)0x97b07e7a, (q31_t)0x4a1aaf3f, (q31_t)0x97a1ef94, + (q31_t)0x4a062fbd, (q31_t)0x979364b5, (q31_t)0x49f1ad61, (q31_t)0x9784dddc, (q31_t)0x49dd282a, (q31_t)0x97765b0a, (q31_t)0x49c8a01b, (q31_t)0x9767dc41, + (q31_t)0x49b41533, (q31_t)0x9759617f, (q31_t)0x499f8774, (q31_t)0x974aeac6, (q31_t)0x498af6df, (q31_t)0x973c7817, (q31_t)0x49766373, (q31_t)0x972e0971, + (q31_t)0x4961cd33, (q31_t)0x971f9ed7, (q31_t)0x494d341e, (q31_t)0x97113847, (q31_t)0x49389836, (q31_t)0x9702d5c3, (q31_t)0x4923f97b, (q31_t)0x96f4774b, + (q31_t)0x490f57ee, (q31_t)0x96e61ce0, (q31_t)0x48fab391, (q31_t)0x96d7c682, (q31_t)0x48e60c62, (q31_t)0x96c97432, (q31_t)0x48d16265, (q31_t)0x96bb25f0, + (q31_t)0x48bcb599, (q31_t)0x96acdbbe, (q31_t)0x48a805ff, (q31_t)0x969e959b, (q31_t)0x48935397, (q31_t)0x96905388, (q31_t)0x487e9e64, (q31_t)0x96821585, + (q31_t)0x4869e665, (q31_t)0x9673db94, (q31_t)0x48552b9b, (q31_t)0x9665a5b4, (q31_t)0x48406e08, (q31_t)0x965773e7, (q31_t)0x482badab, (q31_t)0x9649462d, + (q31_t)0x4816ea86, (q31_t)0x963b1c86, (q31_t)0x48022499, (q31_t)0x962cf6f2, (q31_t)0x47ed5be6, (q31_t)0x961ed574, (q31_t)0x47d8906d, (q31_t)0x9610b80a, + (q31_t)0x47c3c22f, (q31_t)0x96029eb6, (q31_t)0x47aef12c, (q31_t)0x95f48977, (q31_t)0x479a1d67, (q31_t)0x95e67850, (q31_t)0x478546de, (q31_t)0x95d86b3f, + (q31_t)0x47706d93, (q31_t)0x95ca6247, (q31_t)0x475b9188, (q31_t)0x95bc5d66, (q31_t)0x4746b2bc, (q31_t)0x95ae5c9f, (q31_t)0x4731d131, (q31_t)0x95a05ff0, + (q31_t)0x471cece7, (q31_t)0x9592675c, (q31_t)0x470805df, (q31_t)0x958472e2, (q31_t)0x46f31c1a, (q31_t)0x95768283, (q31_t)0x46de2f99, (q31_t)0x9568963f, + (q31_t)0x46c9405c, (q31_t)0x955aae17, (q31_t)0x46b44e65, (q31_t)0x954cca0c, (q31_t)0x469f59b4, (q31_t)0x953eea1e, (q31_t)0x468a624a, (q31_t)0x95310e4e, + (q31_t)0x46756828, (q31_t)0x9523369c, (q31_t)0x46606b4e, (q31_t)0x95156308, (q31_t)0x464b6bbe, (q31_t)0x95079394, (q31_t)0x46366978, (q31_t)0x94f9c83f, + (q31_t)0x4621647d, (q31_t)0x94ec010b, (q31_t)0x460c5cce, (q31_t)0x94de3df8, (q31_t)0x45f7526b, (q31_t)0x94d07f05, (q31_t)0x45e24556, (q31_t)0x94c2c435, + (q31_t)0x45cd358f, (q31_t)0x94b50d87, (q31_t)0x45b82318, (q31_t)0x94a75afd, (q31_t)0x45a30df0, (q31_t)0x9499ac95, (q31_t)0x458df619, (q31_t)0x948c0252, + (q31_t)0x4578db93, (q31_t)0x947e5c33, (q31_t)0x4563be60, (q31_t)0x9470ba39, (q31_t)0x454e9e80, (q31_t)0x94631c65, (q31_t)0x45397bf4, (q31_t)0x945582b7, + (q31_t)0x452456bd, (q31_t)0x9447ed2f, (q31_t)0x450f2edb, (q31_t)0x943a5bcf, (q31_t)0x44fa0450, (q31_t)0x942cce96, (q31_t)0x44e4d71c, (q31_t)0x941f4585, + (q31_t)0x44cfa740, (q31_t)0x9411c09e, (q31_t)0x44ba74bd, (q31_t)0x94043fdf, (q31_t)0x44a53f93, (q31_t)0x93f6c34a, (q31_t)0x449007c4, (q31_t)0x93e94adf, + (q31_t)0x447acd50, (q31_t)0x93dbd6a0, (q31_t)0x44659039, (q31_t)0x93ce668b, (q31_t)0x4450507e, (q31_t)0x93c0faa3, (q31_t)0x443b0e21, (q31_t)0x93b392e6, + (q31_t)0x4425c923, (q31_t)0x93a62f57, (q31_t)0x44108184, (q31_t)0x9398cff5, (q31_t)0x43fb3746, (q31_t)0x938b74c1, (q31_t)0x43e5ea68, (q31_t)0x937e1dbb, + (q31_t)0x43d09aed, (q31_t)0x9370cae4, (q31_t)0x43bb48d4, (q31_t)0x93637c3d, (q31_t)0x43a5f41e, (q31_t)0x935631c5, (q31_t)0x43909ccd, (q31_t)0x9348eb7e, + (q31_t)0x437b42e1, (q31_t)0x933ba968, (q31_t)0x4365e65b, (q31_t)0x932e6b84, (q31_t)0x4350873c, (q31_t)0x932131d1, (q31_t)0x433b2585, (q31_t)0x9313fc51, + (q31_t)0x4325c135, (q31_t)0x9306cb04, (q31_t)0x43105a50, (q31_t)0x92f99deb, (q31_t)0x42faf0d4, (q31_t)0x92ec7505, (q31_t)0x42e584c3, (q31_t)0x92df5054, + (q31_t)0x42d0161e, (q31_t)0x92d22fd9, (q31_t)0x42baa4e6, (q31_t)0x92c51392, (q31_t)0x42a5311b, (q31_t)0x92b7fb82, (q31_t)0x428fbabe, (q31_t)0x92aae7a8, + (q31_t)0x427a41d0, (q31_t)0x929dd806, (q31_t)0x4264c653, (q31_t)0x9290cc9b, (q31_t)0x424f4845, (q31_t)0x9283c568, (q31_t)0x4239c7aa, (q31_t)0x9276c26d, + (q31_t)0x42244481, (q31_t)0x9269c3ac, (q31_t)0x420ebecb, (q31_t)0x925cc924, (q31_t)0x41f93689, (q31_t)0x924fd2d7, (q31_t)0x41e3abbc, (q31_t)0x9242e0c4, + (q31_t)0x41ce1e65, (q31_t)0x9235f2ec, (q31_t)0x41b88e84, (q31_t)0x9229094f, (q31_t)0x41a2fc1a, (q31_t)0x921c23ef, (q31_t)0x418d6729, (q31_t)0x920f42cb, + (q31_t)0x4177cfb1, (q31_t)0x920265e4, (q31_t)0x416235b2, (q31_t)0x91f58d3b, (q31_t)0x414c992f, (q31_t)0x91e8b8d0, (q31_t)0x4136fa27, (q31_t)0x91dbe8a4, + (q31_t)0x4121589b, (q31_t)0x91cf1cb6, (q31_t)0x410bb48c, (q31_t)0x91c25508, (q31_t)0x40f60dfb, (q31_t)0x91b5919a, (q31_t)0x40e064ea, (q31_t)0x91a8d26d, + (q31_t)0x40cab958, (q31_t)0x919c1781, (q31_t)0x40b50b46, (q31_t)0x918f60d6, (q31_t)0x409f5ab6, (q31_t)0x9182ae6d, (q31_t)0x4089a7a8, (q31_t)0x91760047, + (q31_t)0x4073f21d, (q31_t)0x91695663, (q31_t)0x405e3a16, (q31_t)0x915cb0c3, (q31_t)0x40487f94, (q31_t)0x91500f67, (q31_t)0x4032c297, (q31_t)0x91437250, + (q31_t)0x401d0321, (q31_t)0x9136d97d, (q31_t)0x40074132, (q31_t)0x912a44f0, (q31_t)0x3ff17cca, (q31_t)0x911db4a9, (q31_t)0x3fdbb5ec, (q31_t)0x911128a8, + (q31_t)0x3fc5ec98, (q31_t)0x9104a0ee, (q31_t)0x3fb020ce, (q31_t)0x90f81d7b, (q31_t)0x3f9a5290, (q31_t)0x90eb9e50, (q31_t)0x3f8481dd, (q31_t)0x90df236e, + (q31_t)0x3f6eaeb8, (q31_t)0x90d2acd4, (q31_t)0x3f58d921, (q31_t)0x90c63a83, (q31_t)0x3f430119, (q31_t)0x90b9cc7d, (q31_t)0x3f2d26a0, (q31_t)0x90ad62c0, + (q31_t)0x3f1749b8, (q31_t)0x90a0fd4e, (q31_t)0x3f016a61, (q31_t)0x90949c28, (q31_t)0x3eeb889c, (q31_t)0x90883f4d, (q31_t)0x3ed5a46b, (q31_t)0x907be6be, + (q31_t)0x3ebfbdcd, (q31_t)0x906f927c, (q31_t)0x3ea9d4c3, (q31_t)0x90634287, (q31_t)0x3e93e950, (q31_t)0x9056f6df, (q31_t)0x3e7dfb73, (q31_t)0x904aaf86, + (q31_t)0x3e680b2c, (q31_t)0x903e6c7b, (q31_t)0x3e52187f, (q31_t)0x90322dbf, (q31_t)0x3e3c2369, (q31_t)0x9025f352, (q31_t)0x3e262bee, (q31_t)0x9019bd36, + (q31_t)0x3e10320d, (q31_t)0x900d8b69, (q31_t)0x3dfa35c8, (q31_t)0x90015dee, (q31_t)0x3de4371f, (q31_t)0x8ff534c4, (q31_t)0x3dce3614, (q31_t)0x8fe90fec, + (q31_t)0x3db832a6, (q31_t)0x8fdcef66, (q31_t)0x3da22cd7, (q31_t)0x8fd0d333, (q31_t)0x3d8c24a8, (q31_t)0x8fc4bb53, (q31_t)0x3d761a19, (q31_t)0x8fb8a7c7, + (q31_t)0x3d600d2c, (q31_t)0x8fac988f, (q31_t)0x3d49fde1, (q31_t)0x8fa08dab, (q31_t)0x3d33ec39, (q31_t)0x8f94871d, (q31_t)0x3d1dd835, (q31_t)0x8f8884e4, + (q31_t)0x3d07c1d6, (q31_t)0x8f7c8701, (q31_t)0x3cf1a91c, (q31_t)0x8f708d75, (q31_t)0x3cdb8e09, (q31_t)0x8f649840, (q31_t)0x3cc5709e, (q31_t)0x8f58a761, + (q31_t)0x3caf50da, (q31_t)0x8f4cbadb, (q31_t)0x3c992ec0, (q31_t)0x8f40d2ad, (q31_t)0x3c830a50, (q31_t)0x8f34eed8, (q31_t)0x3c6ce38a, (q31_t)0x8f290f5c, + (q31_t)0x3c56ba70, (q31_t)0x8f1d343a, (q31_t)0x3c408f03, (q31_t)0x8f115d72, (q31_t)0x3c2a6142, (q31_t)0x8f058b04, (q31_t)0x3c143130, (q31_t)0x8ef9bcf2, + (q31_t)0x3bfdfecd, (q31_t)0x8eedf33b, (q31_t)0x3be7ca1a, (q31_t)0x8ee22de0, (q31_t)0x3bd19318, (q31_t)0x8ed66ce1, (q31_t)0x3bbb59c7, (q31_t)0x8ecab040, + (q31_t)0x3ba51e29, (q31_t)0x8ebef7fb, (q31_t)0x3b8ee03e, (q31_t)0x8eb34415, (q31_t)0x3b78a007, (q31_t)0x8ea7948c, (q31_t)0x3b625d86, (q31_t)0x8e9be963, + (q31_t)0x3b4c18ba, (q31_t)0x8e904298, (q31_t)0x3b35d1a5, (q31_t)0x8e84a02d, (q31_t)0x3b1f8848, (q31_t)0x8e790222, (q31_t)0x3b093ca3, (q31_t)0x8e6d6877, + (q31_t)0x3af2eeb7, (q31_t)0x8e61d32e, (q31_t)0x3adc9e86, (q31_t)0x8e564246, (q31_t)0x3ac64c0f, (q31_t)0x8e4ab5bf, (q31_t)0x3aaff755, (q31_t)0x8e3f2d9b, + (q31_t)0x3a99a057, (q31_t)0x8e33a9da, (q31_t)0x3a834717, (q31_t)0x8e282a7b, (q31_t)0x3a6ceb96, (q31_t)0x8e1caf80, (q31_t)0x3a568dd4, (q31_t)0x8e1138ea, + (q31_t)0x3a402dd2, (q31_t)0x8e05c6b7, (q31_t)0x3a29cb91, (q31_t)0x8dfa58ea, (q31_t)0x3a136712, (q31_t)0x8deeef82, (q31_t)0x39fd0056, (q31_t)0x8de38a80, + (q31_t)0x39e6975e, (q31_t)0x8dd829e4, (q31_t)0x39d02c2a, (q31_t)0x8dcccdaf, (q31_t)0x39b9bebc, (q31_t)0x8dc175e0, (q31_t)0x39a34f13, (q31_t)0x8db6227a, + (q31_t)0x398cdd32, (q31_t)0x8daad37b, (q31_t)0x39766919, (q31_t)0x8d9f88e5, (q31_t)0x395ff2c9, (q31_t)0x8d9442b8, (q31_t)0x39497a43, (q31_t)0x8d8900f3, + (q31_t)0x3932ff87, (q31_t)0x8d7dc399, (q31_t)0x391c8297, (q31_t)0x8d728aa9, (q31_t)0x39060373, (q31_t)0x8d675623, (q31_t)0x38ef821c, (q31_t)0x8d5c2609, + (q31_t)0x38d8fe93, (q31_t)0x8d50fa59, (q31_t)0x38c278d9, (q31_t)0x8d45d316, (q31_t)0x38abf0ef, (q31_t)0x8d3ab03f, (q31_t)0x389566d6, (q31_t)0x8d2f91d5, + (q31_t)0x387eda8e, (q31_t)0x8d2477d8, (q31_t)0x38684c19, (q31_t)0x8d196249, (q31_t)0x3851bb77, (q31_t)0x8d0e5127, (q31_t)0x383b28a9, (q31_t)0x8d034474, + (q31_t)0x382493b0, (q31_t)0x8cf83c30, (q31_t)0x380dfc8d, (q31_t)0x8ced385b, (q31_t)0x37f76341, (q31_t)0x8ce238f6, (q31_t)0x37e0c7cc, (q31_t)0x8cd73e01, + (q31_t)0x37ca2a30, (q31_t)0x8ccc477d, (q31_t)0x37b38a6d, (q31_t)0x8cc1556a, (q31_t)0x379ce885, (q31_t)0x8cb667c8, (q31_t)0x37864477, (q31_t)0x8cab7e98, + (q31_t)0x376f9e46, (q31_t)0x8ca099da, (q31_t)0x3758f5f2, (q31_t)0x8c95b98f, (q31_t)0x37424b7b, (q31_t)0x8c8addb7, (q31_t)0x372b9ee3, (q31_t)0x8c800652, + (q31_t)0x3714f02a, (q31_t)0x8c753362, (q31_t)0x36fe3f52, (q31_t)0x8c6a64e5, (q31_t)0x36e78c5b, (q31_t)0x8c5f9ade, (q31_t)0x36d0d746, (q31_t)0x8c54d54c, + (q31_t)0x36ba2014, (q31_t)0x8c4a142f, (q31_t)0x36a366c6, (q31_t)0x8c3f5788, (q31_t)0x368cab5c, (q31_t)0x8c349f58, (q31_t)0x3675edd9, (q31_t)0x8c29eb9f, + (q31_t)0x365f2e3b, (q31_t)0x8c1f3c5d, (q31_t)0x36486c86, (q31_t)0x8c149192, (q31_t)0x3631a8b8, (q31_t)0x8c09eb40, (q31_t)0x361ae2d3, (q31_t)0x8bff4966, + (q31_t)0x36041ad9, (q31_t)0x8bf4ac05, (q31_t)0x35ed50c9, (q31_t)0x8bea131e, (q31_t)0x35d684a6, (q31_t)0x8bdf7eb0, (q31_t)0x35bfb66e, (q31_t)0x8bd4eebc, + (q31_t)0x35a8e625, (q31_t)0x8bca6343, (q31_t)0x359213c9, (q31_t)0x8bbfdc44, (q31_t)0x357b3f5d, (q31_t)0x8bb559c1, (q31_t)0x356468e2, (q31_t)0x8baadbba, + (q31_t)0x354d9057, (q31_t)0x8ba0622f, (q31_t)0x3536b5be, (q31_t)0x8b95ed21, (q31_t)0x351fd918, (q31_t)0x8b8b7c8f, (q31_t)0x3508fa66, (q31_t)0x8b81107b, + (q31_t)0x34f219a8, (q31_t)0x8b76a8e4, (q31_t)0x34db36df, (q31_t)0x8b6c45cc, (q31_t)0x34c4520d, (q31_t)0x8b61e733, (q31_t)0x34ad6b32, (q31_t)0x8b578d18, + (q31_t)0x34968250, (q31_t)0x8b4d377c, (q31_t)0x347f9766, (q31_t)0x8b42e661, (q31_t)0x3468aa76, (q31_t)0x8b3899c6, (q31_t)0x3451bb81, (q31_t)0x8b2e51ab, + (q31_t)0x343aca87, (q31_t)0x8b240e11, (q31_t)0x3423d78a, (q31_t)0x8b19cef8, (q31_t)0x340ce28b, (q31_t)0x8b0f9462, (q31_t)0x33f5eb89, (q31_t)0x8b055e4d, + (q31_t)0x33def287, (q31_t)0x8afb2cbb, (q31_t)0x33c7f785, (q31_t)0x8af0ffac, (q31_t)0x33b0fa84, (q31_t)0x8ae6d720, (q31_t)0x3399fb85, (q31_t)0x8adcb318, + (q31_t)0x3382fa88, (q31_t)0x8ad29394, (q31_t)0x336bf78f, (q31_t)0x8ac87894, (q31_t)0x3354f29b, (q31_t)0x8abe6219, (q31_t)0x333debab, (q31_t)0x8ab45024, + (q31_t)0x3326e2c3, (q31_t)0x8aaa42b4, (q31_t)0x330fd7e1, (q31_t)0x8aa039cb, (q31_t)0x32f8cb07, (q31_t)0x8a963567, (q31_t)0x32e1bc36, (q31_t)0x8a8c358b, + (q31_t)0x32caab6f, (q31_t)0x8a823a36, (q31_t)0x32b398b3, (q31_t)0x8a784368, (q31_t)0x329c8402, (q31_t)0x8a6e5123, (q31_t)0x32856d5e, (q31_t)0x8a646365, + (q31_t)0x326e54c7, (q31_t)0x8a5a7a31, (q31_t)0x32573a3f, (q31_t)0x8a509585, (q31_t)0x32401dc6, (q31_t)0x8a46b564, (q31_t)0x3228ff5c, (q31_t)0x8a3cd9cc, + (q31_t)0x3211df04, (q31_t)0x8a3302be, (q31_t)0x31fabcbd, (q31_t)0x8a29303b, (q31_t)0x31e39889, (q31_t)0x8a1f6243, (q31_t)0x31cc7269, (q31_t)0x8a1598d6, + (q31_t)0x31b54a5e, (q31_t)0x8a0bd3f5, (q31_t)0x319e2067, (q31_t)0x8a0213a0, (q31_t)0x3186f487, (q31_t)0x89f857d8, (q31_t)0x316fc6be, (q31_t)0x89eea09d, + (q31_t)0x3158970e, (q31_t)0x89e4edef, (q31_t)0x31416576, (q31_t)0x89db3fcf, (q31_t)0x312a31f8, (q31_t)0x89d1963c, (q31_t)0x3112fc95, (q31_t)0x89c7f138, + (q31_t)0x30fbc54d, (q31_t)0x89be50c3, (q31_t)0x30e48c22, (q31_t)0x89b4b4dd, (q31_t)0x30cd5115, (q31_t)0x89ab1d87, (q31_t)0x30b61426, (q31_t)0x89a18ac0, + (q31_t)0x309ed556, (q31_t)0x8997fc8a, (q31_t)0x308794a6, (q31_t)0x898e72e4, (q31_t)0x30705217, (q31_t)0x8984edcf, (q31_t)0x30590dab, (q31_t)0x897b6d4c, + (q31_t)0x3041c761, (q31_t)0x8971f15a, (q31_t)0x302a7f3a, (q31_t)0x896879fb, (q31_t)0x30133539, (q31_t)0x895f072e, (q31_t)0x2ffbe95d, (q31_t)0x895598f3, + (q31_t)0x2fe49ba7, (q31_t)0x894c2f4c, (q31_t)0x2fcd4c19, (q31_t)0x8942ca39, (q31_t)0x2fb5fab2, (q31_t)0x893969b9, (q31_t)0x2f9ea775, (q31_t)0x89300dce, + (q31_t)0x2f875262, (q31_t)0x8926b677, (q31_t)0x2f6ffb7a, (q31_t)0x891d63b5, (q31_t)0x2f58a2be, (q31_t)0x89141589, (q31_t)0x2f41482e, (q31_t)0x890acbf2, + (q31_t)0x2f29ebcc, (q31_t)0x890186f2, (q31_t)0x2f128d99, (q31_t)0x88f84687, (q31_t)0x2efb2d95, (q31_t)0x88ef0ab4, (q31_t)0x2ee3cbc1, (q31_t)0x88e5d378, + (q31_t)0x2ecc681e, (q31_t)0x88dca0d3, (q31_t)0x2eb502ae, (q31_t)0x88d372c6, (q31_t)0x2e9d9b70, (q31_t)0x88ca4951, (q31_t)0x2e863267, (q31_t)0x88c12475, + (q31_t)0x2e6ec792, (q31_t)0x88b80432, (q31_t)0x2e575af3, (q31_t)0x88aee888, (q31_t)0x2e3fec8b, (q31_t)0x88a5d177, (q31_t)0x2e287c5a, (q31_t)0x889cbf01, + (q31_t)0x2e110a62, (q31_t)0x8893b125, (q31_t)0x2df996a3, (q31_t)0x888aa7e3, (q31_t)0x2de2211e, (q31_t)0x8881a33d, (q31_t)0x2dcaa9d5, (q31_t)0x8878a332, + (q31_t)0x2db330c7, (q31_t)0x886fa7c2, (q31_t)0x2d9bb5f6, (q31_t)0x8866b0ef, (q31_t)0x2d843964, (q31_t)0x885dbeb8, (q31_t)0x2d6cbb10, (q31_t)0x8854d11e, + (q31_t)0x2d553afc, (q31_t)0x884be821, (q31_t)0x2d3db928, (q31_t)0x884303c1, (q31_t)0x2d263596, (q31_t)0x883a23ff, (q31_t)0x2d0eb046, (q31_t)0x883148db, + (q31_t)0x2cf72939, (q31_t)0x88287256, (q31_t)0x2cdfa071, (q31_t)0x881fa06f, (q31_t)0x2cc815ee, (q31_t)0x8816d327, (q31_t)0x2cb089b1, (q31_t)0x880e0a7f, + (q31_t)0x2c98fbba, (q31_t)0x88054677, (q31_t)0x2c816c0c, (q31_t)0x87fc870f, (q31_t)0x2c69daa6, (q31_t)0x87f3cc48, (q31_t)0x2c52478a, (q31_t)0x87eb1621, + (q31_t)0x2c3ab2b9, (q31_t)0x87e2649b, (q31_t)0x2c231c33, (q31_t)0x87d9b7b7, (q31_t)0x2c0b83fa, (q31_t)0x87d10f75, (q31_t)0x2bf3ea0d, (q31_t)0x87c86bd5, + (q31_t)0x2bdc4e6f, (q31_t)0x87bfccd7, (q31_t)0x2bc4b120, (q31_t)0x87b7327d, (q31_t)0x2bad1221, (q31_t)0x87ae9cc5, (q31_t)0x2b957173, (q31_t)0x87a60bb1, + (q31_t)0x2b7dcf17, (q31_t)0x879d7f41, (q31_t)0x2b662b0e, (q31_t)0x8794f774, (q31_t)0x2b4e8558, (q31_t)0x878c744d, (q31_t)0x2b36ddf7, (q31_t)0x8783f5ca, + (q31_t)0x2b1f34eb, (q31_t)0x877b7bec, (q31_t)0x2b078a36, (q31_t)0x877306b4, (q31_t)0x2aefddd8, (q31_t)0x876a9621, (q31_t)0x2ad82fd2, (q31_t)0x87622a35, + (q31_t)0x2ac08026, (q31_t)0x8759c2ef, (q31_t)0x2aa8ced3, (q31_t)0x87516050, (q31_t)0x2a911bdc, (q31_t)0x87490258, (q31_t)0x2a796740, (q31_t)0x8740a907, + (q31_t)0x2a61b101, (q31_t)0x8738545e, (q31_t)0x2a49f920, (q31_t)0x8730045d, (q31_t)0x2a323f9e, (q31_t)0x8727b905, (q31_t)0x2a1a847b, (q31_t)0x871f7255, + (q31_t)0x2a02c7b8, (q31_t)0x8717304e, (q31_t)0x29eb0957, (q31_t)0x870ef2f1, (q31_t)0x29d34958, (q31_t)0x8706ba3d, (q31_t)0x29bb87bc, (q31_t)0x86fe8633, + (q31_t)0x29a3c485, (q31_t)0x86f656d3, (q31_t)0x298bffb2, (q31_t)0x86ee2c1e, (q31_t)0x29743946, (q31_t)0x86e60614, (q31_t)0x295c7140, (q31_t)0x86dde4b5, + (q31_t)0x2944a7a2, (q31_t)0x86d5c802, (q31_t)0x292cdc6d, (q31_t)0x86cdaffa, (q31_t)0x29150fa1, (q31_t)0x86c59c9f, (q31_t)0x28fd4140, (q31_t)0x86bd8df0, + (q31_t)0x28e5714b, (q31_t)0x86b583ee, (q31_t)0x28cd9fc1, (q31_t)0x86ad7e99, (q31_t)0x28b5cca5, (q31_t)0x86a57df2, (q31_t)0x289df7f8, (q31_t)0x869d81f8, + (q31_t)0x288621b9, (q31_t)0x86958aac, (q31_t)0x286e49ea, (q31_t)0x868d980e, (q31_t)0x2856708d, (q31_t)0x8685aa20, (q31_t)0x283e95a1, (q31_t)0x867dc0e0, + (q31_t)0x2826b928, (q31_t)0x8675dc4f, (q31_t)0x280edb23, (q31_t)0x866dfc6e, (q31_t)0x27f6fb92, (q31_t)0x8666213c, (q31_t)0x27df1a77, (q31_t)0x865e4abb, + (q31_t)0x27c737d3, (q31_t)0x865678eb, (q31_t)0x27af53a6, (q31_t)0x864eabcb, (q31_t)0x27976df1, (q31_t)0x8646e35c, (q31_t)0x277f86b5, (q31_t)0x863f1f9e, + (q31_t)0x27679df4, (q31_t)0x86376092, (q31_t)0x274fb3ae, (q31_t)0x862fa638, (q31_t)0x2737c7e3, (q31_t)0x8627f091, (q31_t)0x271fda96, (q31_t)0x86203f9c, + (q31_t)0x2707ebc7, (q31_t)0x86189359, (q31_t)0x26effb76, (q31_t)0x8610ebca, (q31_t)0x26d809a5, (q31_t)0x860948ef, (q31_t)0x26c01655, (q31_t)0x8601aac7, + (q31_t)0x26a82186, (q31_t)0x85fa1153, (q31_t)0x26902b39, (q31_t)0x85f27c93, (q31_t)0x26783370, (q31_t)0x85eaec88, (q31_t)0x26603a2c, (q31_t)0x85e36132, + (q31_t)0x26483f6c, (q31_t)0x85dbda91, (q31_t)0x26304333, (q31_t)0x85d458a6, (q31_t)0x26184581, (q31_t)0x85ccdb70, (q31_t)0x26004657, (q31_t)0x85c562f1, + (q31_t)0x25e845b6, (q31_t)0x85bdef28, (q31_t)0x25d0439f, (q31_t)0x85b68015, (q31_t)0x25b84012, (q31_t)0x85af15b9, (q31_t)0x25a03b11, (q31_t)0x85a7b015, + (q31_t)0x2588349d, (q31_t)0x85a04f28, (q31_t)0x25702cb7, (q31_t)0x8598f2f3, (q31_t)0x2558235f, (q31_t)0x85919b76, (q31_t)0x25401896, (q31_t)0x858a48b1, + (q31_t)0x25280c5e, (q31_t)0x8582faa5, (q31_t)0x250ffeb7, (q31_t)0x857bb152, (q31_t)0x24f7efa2, (q31_t)0x85746cb8, (q31_t)0x24dfdf20, (q31_t)0x856d2cd7, + (q31_t)0x24c7cd33, (q31_t)0x8565f1b0, (q31_t)0x24afb9da, (q31_t)0x855ebb44, (q31_t)0x2497a517, (q31_t)0x85578991, (q31_t)0x247f8eec, (q31_t)0x85505c99, + (q31_t)0x24677758, (q31_t)0x8549345c, (q31_t)0x244f5e5c, (q31_t)0x854210db, (q31_t)0x243743fa, (q31_t)0x853af214, (q31_t)0x241f2833, (q31_t)0x8533d809, + (q31_t)0x24070b08, (q31_t)0x852cc2bb, (q31_t)0x23eeec78, (q31_t)0x8525b228, (q31_t)0x23d6cc87, (q31_t)0x851ea652, (q31_t)0x23beab33, (q31_t)0x85179f39, + (q31_t)0x23a6887f, (q31_t)0x85109cdd, (q31_t)0x238e646a, (q31_t)0x85099f3e, (q31_t)0x23763ef7, (q31_t)0x8502a65c, (q31_t)0x235e1826, (q31_t)0x84fbb239, + (q31_t)0x2345eff8, (q31_t)0x84f4c2d4, (q31_t)0x232dc66d, (q31_t)0x84edd82d, (q31_t)0x23159b88, (q31_t)0x84e6f244, (q31_t)0x22fd6f48, (q31_t)0x84e0111b, + (q31_t)0x22e541af, (q31_t)0x84d934b1, (q31_t)0x22cd12bd, (q31_t)0x84d25d06, (q31_t)0x22b4e274, (q31_t)0x84cb8a1b, (q31_t)0x229cb0d5, (q31_t)0x84c4bbf0, + (q31_t)0x22847de0, (q31_t)0x84bdf286, (q31_t)0x226c4996, (q31_t)0x84b72ddb, (q31_t)0x225413f8, (q31_t)0x84b06df2, (q31_t)0x223bdd08, (q31_t)0x84a9b2ca, + (q31_t)0x2223a4c5, (q31_t)0x84a2fc62, (q31_t)0x220b6b32, (q31_t)0x849c4abd, (q31_t)0x21f3304f, (q31_t)0x84959dd9, (q31_t)0x21daf41d, (q31_t)0x848ef5b7, + (q31_t)0x21c2b69c, (q31_t)0x84885258, (q31_t)0x21aa77cf, (q31_t)0x8481b3bb, (q31_t)0x219237b5, (q31_t)0x847b19e1, (q31_t)0x2179f64f, (q31_t)0x847484ca, + (q31_t)0x2161b3a0, (q31_t)0x846df477, (q31_t)0x21496fa7, (q31_t)0x846768e7, (q31_t)0x21312a65, (q31_t)0x8460e21a, (q31_t)0x2118e3dc, (q31_t)0x845a6012, + (q31_t)0x21009c0c, (q31_t)0x8453e2cf, (q31_t)0x20e852f6, (q31_t)0x844d6a50, (q31_t)0x20d0089c, (q31_t)0x8446f695, (q31_t)0x20b7bcfe, (q31_t)0x844087a0, + (q31_t)0x209f701c, (q31_t)0x843a1d70, (q31_t)0x208721f9, (q31_t)0x8433b806, (q31_t)0x206ed295, (q31_t)0x842d5762, (q31_t)0x205681f1, (q31_t)0x8426fb84, + (q31_t)0x203e300d, (q31_t)0x8420a46c, (q31_t)0x2025dcec, (q31_t)0x841a521a, (q31_t)0x200d888d, (q31_t)0x84140490, (q31_t)0x1ff532f2, (q31_t)0x840dbbcc, + (q31_t)0x1fdcdc1b, (q31_t)0x840777d0, (q31_t)0x1fc4840a, (q31_t)0x8401389b, (q31_t)0x1fac2abf, (q31_t)0x83fafe2e, (q31_t)0x1f93d03c, (q31_t)0x83f4c889, + (q31_t)0x1f7b7481, (q31_t)0x83ee97ad, (q31_t)0x1f63178f, (q31_t)0x83e86b99, (q31_t)0x1f4ab968, (q31_t)0x83e2444d, (q31_t)0x1f325a0b, (q31_t)0x83dc21cb, + (q31_t)0x1f19f97b, (q31_t)0x83d60412, (q31_t)0x1f0197b8, (q31_t)0x83cfeb22, (q31_t)0x1ee934c3, (q31_t)0x83c9d6fc, (q31_t)0x1ed0d09d, (q31_t)0x83c3c7a0, + (q31_t)0x1eb86b46, (q31_t)0x83bdbd0e, (q31_t)0x1ea004c1, (q31_t)0x83b7b746, (q31_t)0x1e879d0d, (q31_t)0x83b1b649, (q31_t)0x1e6f342c, (q31_t)0x83abba17, + (q31_t)0x1e56ca1e, (q31_t)0x83a5c2b0, (q31_t)0x1e3e5ee5, (q31_t)0x839fd014, (q31_t)0x1e25f282, (q31_t)0x8399e244, (q31_t)0x1e0d84f5, (q31_t)0x8393f940, + (q31_t)0x1df5163f, (q31_t)0x838e1507, (q31_t)0x1ddca662, (q31_t)0x8388359b, (q31_t)0x1dc4355e, (q31_t)0x83825afb, (q31_t)0x1dabc334, (q31_t)0x837c8528, + (q31_t)0x1d934fe5, (q31_t)0x8376b422, (q31_t)0x1d7adb73, (q31_t)0x8370e7e9, (q31_t)0x1d6265dd, (q31_t)0x836b207d, (q31_t)0x1d49ef26, (q31_t)0x83655ddf, + (q31_t)0x1d31774d, (q31_t)0x835fa00f, (q31_t)0x1d18fe54, (q31_t)0x8359e70d, (q31_t)0x1d00843d, (q31_t)0x835432d8, (q31_t)0x1ce80906, (q31_t)0x834e8373, + (q31_t)0x1ccf8cb3, (q31_t)0x8348d8dc, (q31_t)0x1cb70f43, (q31_t)0x83433314, (q31_t)0x1c9e90b8, (q31_t)0x833d921b, (q31_t)0x1c861113, (q31_t)0x8337f5f1, + (q31_t)0x1c6d9053, (q31_t)0x83325e97, (q31_t)0x1c550e7c, (q31_t)0x832ccc0d, (q31_t)0x1c3c8b8c, (q31_t)0x83273e52, (q31_t)0x1c240786, (q31_t)0x8321b568, + (q31_t)0x1c0b826a, (q31_t)0x831c314e, (q31_t)0x1bf2fc3a, (q31_t)0x8316b205, (q31_t)0x1bda74f6, (q31_t)0x8311378d, (q31_t)0x1bc1ec9e, (q31_t)0x830bc1e6, + (q31_t)0x1ba96335, (q31_t)0x83065110, (q31_t)0x1b90d8bb, (q31_t)0x8300e50b, (q31_t)0x1b784d30, (q31_t)0x82fb7dd8, (q31_t)0x1b5fc097, (q31_t)0x82f61b77, + (q31_t)0x1b4732ef, (q31_t)0x82f0bde8, (q31_t)0x1b2ea43a, (q31_t)0x82eb652b, (q31_t)0x1b161479, (q31_t)0x82e61141, (q31_t)0x1afd83ad, (q31_t)0x82e0c22a, + (q31_t)0x1ae4f1d6, (q31_t)0x82db77e5, (q31_t)0x1acc5ef6, (q31_t)0x82d63274, (q31_t)0x1ab3cb0d, (q31_t)0x82d0f1d5, (q31_t)0x1a9b361d, (q31_t)0x82cbb60b, + (q31_t)0x1a82a026, (q31_t)0x82c67f14, (q31_t)0x1a6a0929, (q31_t)0x82c14cf1, (q31_t)0x1a517128, (q31_t)0x82bc1fa2, (q31_t)0x1a38d823, (q31_t)0x82b6f727, + (q31_t)0x1a203e1b, (q31_t)0x82b1d381, (q31_t)0x1a07a311, (q31_t)0x82acb4b0, (q31_t)0x19ef0707, (q31_t)0x82a79ab3, (q31_t)0x19d669fc, (q31_t)0x82a2858c, + (q31_t)0x19bdcbf3, (q31_t)0x829d753a, (q31_t)0x19a52ceb, (q31_t)0x829869be, (q31_t)0x198c8ce7, (q31_t)0x82936317, (q31_t)0x1973ebe6, (q31_t)0x828e6146, + (q31_t)0x195b49ea, (q31_t)0x8289644b, (q31_t)0x1942a6f3, (q31_t)0x82846c26, (q31_t)0x192a0304, (q31_t)0x827f78d8, (q31_t)0x19115e1c, (q31_t)0x827a8a61, + (q31_t)0x18f8b83c, (q31_t)0x8275a0c0, (q31_t)0x18e01167, (q31_t)0x8270bbf7, (q31_t)0x18c7699b, (q31_t)0x826bdc04, (q31_t)0x18aec0db, (q31_t)0x826700e9, + (q31_t)0x18961728, (q31_t)0x82622aa6, (q31_t)0x187d6c82, (q31_t)0x825d593a, (q31_t)0x1864c0ea, (q31_t)0x82588ca7, (q31_t)0x184c1461, (q31_t)0x8253c4eb, + (q31_t)0x183366e9, (q31_t)0x824f0208, (q31_t)0x181ab881, (q31_t)0x824a43fe, (q31_t)0x1802092c, (q31_t)0x82458acc, (q31_t)0x17e958ea, (q31_t)0x8240d673, + (q31_t)0x17d0a7bc, (q31_t)0x823c26f3, (q31_t)0x17b7f5a3, (q31_t)0x82377c4c, (q31_t)0x179f429f, (q31_t)0x8232d67f, (q31_t)0x17868eb3, (q31_t)0x822e358b, + (q31_t)0x176dd9de, (q31_t)0x82299971, (q31_t)0x17552422, (q31_t)0x82250232, (q31_t)0x173c6d80, (q31_t)0x82206fcc, (q31_t)0x1723b5f9, (q31_t)0x821be240, + (q31_t)0x170afd8d, (q31_t)0x82175990, (q31_t)0x16f2443e, (q31_t)0x8212d5b9, (q31_t)0x16d98a0c, (q31_t)0x820e56be, (q31_t)0x16c0cef9, (q31_t)0x8209dc9e, + (q31_t)0x16a81305, (q31_t)0x82056758, (q31_t)0x168f5632, (q31_t)0x8200f6ef, (q31_t)0x1676987f, (q31_t)0x81fc8b60, (q31_t)0x165dd9f0, (q31_t)0x81f824ae, + (q31_t)0x16451a83, (q31_t)0x81f3c2d7, (q31_t)0x162c5a3b, (q31_t)0x81ef65dc, (q31_t)0x16139918, (q31_t)0x81eb0dbe, (q31_t)0x15fad71b, (q31_t)0x81e6ba7c, + (q31_t)0x15e21445, (q31_t)0x81e26c16, (q31_t)0x15c95097, (q31_t)0x81de228d, (q31_t)0x15b08c12, (q31_t)0x81d9dde1, (q31_t)0x1597c6b7, (q31_t)0x81d59e13, + (q31_t)0x157f0086, (q31_t)0x81d16321, (q31_t)0x15663982, (q31_t)0x81cd2d0c, (q31_t)0x154d71aa, (q31_t)0x81c8fbd6, (q31_t)0x1534a901, (q31_t)0x81c4cf7d, + (q31_t)0x151bdf86, (q31_t)0x81c0a801, (q31_t)0x1503153a, (q31_t)0x81bc8564, (q31_t)0x14ea4a1f, (q31_t)0x81b867a5, (q31_t)0x14d17e36, (q31_t)0x81b44ec4, + (q31_t)0x14b8b17f, (q31_t)0x81b03ac2, (q31_t)0x149fe3fc, (q31_t)0x81ac2b9e, (q31_t)0x148715ae, (q31_t)0x81a82159, (q31_t)0x146e4694, (q31_t)0x81a41bf4, + (q31_t)0x145576b1, (q31_t)0x81a01b6d, (q31_t)0x143ca605, (q31_t)0x819c1fc5, (q31_t)0x1423d492, (q31_t)0x819828fd, (q31_t)0x140b0258, (q31_t)0x81943715, + (q31_t)0x13f22f58, (q31_t)0x81904a0c, (q31_t)0x13d95b93, (q31_t)0x818c61e3, (q31_t)0x13c0870a, (q31_t)0x81887e9a, (q31_t)0x13a7b1bf, (q31_t)0x8184a032, + (q31_t)0x138edbb1, (q31_t)0x8180c6a9, (q31_t)0x137604e2, (q31_t)0x817cf201, (q31_t)0x135d2d53, (q31_t)0x8179223a, (q31_t)0x13445505, (q31_t)0x81755754, + (q31_t)0x132b7bf9, (q31_t)0x8171914e, (q31_t)0x1312a230, (q31_t)0x816dd02a, (q31_t)0x12f9c7aa, (q31_t)0x816a13e6, (q31_t)0x12e0ec6a, (q31_t)0x81665c84, + (q31_t)0x12c8106f, (q31_t)0x8162aa04, (q31_t)0x12af33ba, (q31_t)0x815efc65, (q31_t)0x1296564d, (q31_t)0x815b53a8, (q31_t)0x127d7829, (q31_t)0x8157afcd, + (q31_t)0x1264994e, (q31_t)0x815410d4, (q31_t)0x124bb9be, (q31_t)0x815076bd, (q31_t)0x1232d979, (q31_t)0x814ce188, (q31_t)0x1219f880, (q31_t)0x81495136, + (q31_t)0x120116d5, (q31_t)0x8145c5c7, (q31_t)0x11e83478, (q31_t)0x81423f3a, (q31_t)0x11cf516a, (q31_t)0x813ebd90, (q31_t)0x11b66dad, (q31_t)0x813b40ca, + (q31_t)0x119d8941, (q31_t)0x8137c8e6, (q31_t)0x1184a427, (q31_t)0x813455e6, (q31_t)0x116bbe60, (q31_t)0x8130e7c9, (q31_t)0x1152d7ed, (q31_t)0x812d7e8f, + (q31_t)0x1139f0cf, (q31_t)0x812a1a3a, (q31_t)0x11210907, (q31_t)0x8126bac8, (q31_t)0x11082096, (q31_t)0x8123603a, (q31_t)0x10ef377d, (q31_t)0x81200a90, + (q31_t)0x10d64dbd, (q31_t)0x811cb9ca, (q31_t)0x10bd6356, (q31_t)0x81196de9, (q31_t)0x10a4784b, (q31_t)0x811626ec, (q31_t)0x108b8c9b, (q31_t)0x8112e4d4, + (q31_t)0x1072a048, (q31_t)0x810fa7a0, (q31_t)0x1059b352, (q31_t)0x810c6f52, (q31_t)0x1040c5bb, (q31_t)0x81093be8, (q31_t)0x1027d784, (q31_t)0x81060d63, + (q31_t)0x100ee8ad, (q31_t)0x8102e3c4, (q31_t)0xff5f938, (q31_t)0x80ffbf0a, (q31_t)0xfdd0926, (q31_t)0x80fc9f35, (q31_t)0xfc41876, (q31_t)0x80f98446, + (q31_t)0xfab272b, (q31_t)0x80f66e3c, (q31_t)0xf923546, (q31_t)0x80f35d19, (q31_t)0xf7942c7, (q31_t)0x80f050db, (q31_t)0xf604faf, (q31_t)0x80ed4984, + (q31_t)0xf475bff, (q31_t)0x80ea4712, (q31_t)0xf2e67b8, (q31_t)0x80e74987, (q31_t)0xf1572dc, (q31_t)0x80e450e2, (q31_t)0xefc7d6b, (q31_t)0x80e15d24, + (q31_t)0xee38766, (q31_t)0x80de6e4c, (q31_t)0xeca90ce, (q31_t)0x80db845b, (q31_t)0xeb199a4, (q31_t)0x80d89f51, (q31_t)0xe98a1e9, (q31_t)0x80d5bf2e, + (q31_t)0xe7fa99e, (q31_t)0x80d2e3f2, (q31_t)0xe66b0c3, (q31_t)0x80d00d9d, (q31_t)0xe4db75b, (q31_t)0x80cd3c2f, (q31_t)0xe34bd66, (q31_t)0x80ca6fa9, + (q31_t)0xe1bc2e4, (q31_t)0x80c7a80a, (q31_t)0xe02c7d7, (q31_t)0x80c4e553, (q31_t)0xde9cc40, (q31_t)0x80c22784, (q31_t)0xdd0d01f, (q31_t)0x80bf6e9c, + (q31_t)0xdb7d376, (q31_t)0x80bcba9d, (q31_t)0xd9ed646, (q31_t)0x80ba0b85, (q31_t)0xd85d88f, (q31_t)0x80b76156, (q31_t)0xd6cda53, (q31_t)0x80b4bc0e, + (q31_t)0xd53db92, (q31_t)0x80b21baf, (q31_t)0xd3adc4e, (q31_t)0x80af8039, (q31_t)0xd21dc87, (q31_t)0x80ace9ab, (q31_t)0xd08dc3f, (q31_t)0x80aa5806, + (q31_t)0xcefdb76, (q31_t)0x80a7cb49, (q31_t)0xcd6da2d, (q31_t)0x80a54376, (q31_t)0xcbdd865, (q31_t)0x80a2c08b, (q31_t)0xca4d620, (q31_t)0x80a04289, + (q31_t)0xc8bd35e, (q31_t)0x809dc971, (q31_t)0xc72d020, (q31_t)0x809b5541, (q31_t)0xc59cc68, (q31_t)0x8098e5fb, (q31_t)0xc40c835, (q31_t)0x80967b9f, + (q31_t)0xc27c389, (q31_t)0x8094162c, (q31_t)0xc0ebe66, (q31_t)0x8091b5a2, (q31_t)0xbf5b8cb, (q31_t)0x808f5a02, (q31_t)0xbdcb2bb, (q31_t)0x808d034c, + (q31_t)0xbc3ac35, (q31_t)0x808ab180, (q31_t)0xbaaa53b, (q31_t)0x8088649e, (q31_t)0xb919dcf, (q31_t)0x80861ca6, (q31_t)0xb7895f0, (q31_t)0x8083d998, + (q31_t)0xb5f8d9f, (q31_t)0x80819b74, (q31_t)0xb4684df, (q31_t)0x807f623b, (q31_t)0xb2d7baf, (q31_t)0x807d2dec, (q31_t)0xb147211, (q31_t)0x807afe87, + (q31_t)0xafb6805, (q31_t)0x8078d40d, (q31_t)0xae25d8d, (q31_t)0x8076ae7e, (q31_t)0xac952aa, (q31_t)0x80748dd9, (q31_t)0xab0475c, (q31_t)0x8072721f, + (q31_t)0xa973ba5, (q31_t)0x80705b50, (q31_t)0xa7e2f85, (q31_t)0x806e496c, (q31_t)0xa6522fe, (q31_t)0x806c3c74, (q31_t)0xa4c1610, (q31_t)0x806a3466, + (q31_t)0xa3308bd, (q31_t)0x80683143, (q31_t)0xa19fb04, (q31_t)0x8066330c, (q31_t)0xa00ece8, (q31_t)0x806439c0, (q31_t)0x9e7de6a, (q31_t)0x80624560, + (q31_t)0x9cecf89, (q31_t)0x806055eb, (q31_t)0x9b5c048, (q31_t)0x805e6b62, (q31_t)0x99cb0a7, (q31_t)0x805c85c4, (q31_t)0x983a0a7, (q31_t)0x805aa512, + (q31_t)0x96a9049, (q31_t)0x8058c94c, (q31_t)0x9517f8f, (q31_t)0x8056f272, (q31_t)0x9386e78, (q31_t)0x80552084, (q31_t)0x91f5d06, (q31_t)0x80535381, + (q31_t)0x9064b3a, (q31_t)0x80518b6b, (q31_t)0x8ed3916, (q31_t)0x804fc841, (q31_t)0x8d42699, (q31_t)0x804e0a04, (q31_t)0x8bb13c5, (q31_t)0x804c50b2, + (q31_t)0x8a2009a, (q31_t)0x804a9c4d, (q31_t)0x888ed1b, (q31_t)0x8048ecd5, (q31_t)0x86fd947, (q31_t)0x80474248, (q31_t)0x856c520, (q31_t)0x80459ca9, + (q31_t)0x83db0a7, (q31_t)0x8043fbf6, (q31_t)0x8249bdd, (q31_t)0x80426030, (q31_t)0x80b86c2, (q31_t)0x8040c956, (q31_t)0x7f27157, (q31_t)0x803f376a, + (q31_t)0x7d95b9e, (q31_t)0x803daa6a, (q31_t)0x7c04598, (q31_t)0x803c2257, (q31_t)0x7a72f45, (q31_t)0x803a9f31, (q31_t)0x78e18a7, (q31_t)0x803920f8, + (q31_t)0x77501be, (q31_t)0x8037a7ac, (q31_t)0x75bea8c, (q31_t)0x8036334e, (q31_t)0x742d311, (q31_t)0x8034c3dd, (q31_t)0x729bb4e, (q31_t)0x80335959, + (q31_t)0x710a345, (q31_t)0x8031f3c2, (q31_t)0x6f78af6, (q31_t)0x80309318, (q31_t)0x6de7262, (q31_t)0x802f375d, (q31_t)0x6c5598a, (q31_t)0x802de08e, + (q31_t)0x6ac406f, (q31_t)0x802c8ead, (q31_t)0x6932713, (q31_t)0x802b41ba, (q31_t)0x67a0d76, (q31_t)0x8029f9b4, (q31_t)0x660f398, (q31_t)0x8028b69c, + (q31_t)0x647d97c, (q31_t)0x80277872, (q31_t)0x62ebf22, (q31_t)0x80263f36, (q31_t)0x615a48b, (q31_t)0x80250ae7, (q31_t)0x5fc89b8, (q31_t)0x8023db86, + (q31_t)0x5e36ea9, (q31_t)0x8022b114, (q31_t)0x5ca5361, (q31_t)0x80218b8f, (q31_t)0x5b137df, (q31_t)0x80206af8, (q31_t)0x5981c26, (q31_t)0x801f4f4f, + (q31_t)0x57f0035, (q31_t)0x801e3895, (q31_t)0x565e40d, (q31_t)0x801d26c8, (q31_t)0x54cc7b1, (q31_t)0x801c19ea, (q31_t)0x533ab20, (q31_t)0x801b11fa, + (q31_t)0x51a8e5c, (q31_t)0x801a0ef8, (q31_t)0x5017165, (q31_t)0x801910e4, (q31_t)0x4e8543e, (q31_t)0x801817bf, (q31_t)0x4cf36e5, (q31_t)0x80172388, + (q31_t)0x4b6195d, (q31_t)0x80163440, (q31_t)0x49cfba7, (q31_t)0x801549e6, (q31_t)0x483ddc3, (q31_t)0x8014647b, (q31_t)0x46abfb3, (q31_t)0x801383fe, + (q31_t)0x451a177, (q31_t)0x8012a86f, (q31_t)0x4388310, (q31_t)0x8011d1d0, (q31_t)0x41f6480, (q31_t)0x8011001f, (q31_t)0x40645c7, (q31_t)0x8010335c, + (q31_t)0x3ed26e6, (q31_t)0x800f6b88, (q31_t)0x3d407df, (q31_t)0x800ea8a3, (q31_t)0x3bae8b2, (q31_t)0x800deaad, (q31_t)0x3a1c960, (q31_t)0x800d31a5, + (q31_t)0x388a9ea, (q31_t)0x800c7d8c, (q31_t)0x36f8a51, (q31_t)0x800bce63, (q31_t)0x3566a96, (q31_t)0x800b2427, (q31_t)0x33d4abb, (q31_t)0x800a7edb, + (q31_t)0x3242abf, (q31_t)0x8009de7e, (q31_t)0x30b0aa4, (q31_t)0x80094310, (q31_t)0x2f1ea6c, (q31_t)0x8008ac90, (q31_t)0x2d8ca16, (q31_t)0x80081b00, + (q31_t)0x2bfa9a4, (q31_t)0x80078e5e, (q31_t)0x2a68917, (q31_t)0x800706ac, (q31_t)0x28d6870, (q31_t)0x800683e8, (q31_t)0x27447b0, (q31_t)0x80060614, + (q31_t)0x25b26d7, (q31_t)0x80058d2f, (q31_t)0x24205e8, (q31_t)0x80051939, (q31_t)0x228e4e2, (q31_t)0x8004aa32, (q31_t)0x20fc3c6, (q31_t)0x8004401a, + (q31_t)0x1f6a297, (q31_t)0x8003daf1, (q31_t)0x1dd8154, (q31_t)0x80037ab7, (q31_t)0x1c45ffe, (q31_t)0x80031f6d, (q31_t)0x1ab3e97, (q31_t)0x8002c912, + (q31_t)0x1921d20, (q31_t)0x800277a6, (q31_t)0x178fb99, (q31_t)0x80022b29, (q31_t)0x15fda03, (q31_t)0x8001e39b, (q31_t)0x146b860, (q31_t)0x8001a0fd, + (q31_t)0x12d96b1, (q31_t)0x8001634e, (q31_t)0x11474f6, (q31_t)0x80012a8e, (q31_t)0x0fb5330, (q31_t)0x8000f6bd, (q31_t)0xe23160, (q31_t)0x8000c7dc, + (q31_t)0x0c90f88, (q31_t)0x80009dea, (q31_t)0x0afeda8, (q31_t)0x800078e7, (q31_t)0x096cbc1, (q31_t)0x800058d4, (q31_t)0x7da9d4, (q31_t)0x80003daf, + (q31_t)0x06487e3, (q31_t)0x8000277a, (q31_t)0x04b65ee, (q31_t)0x80001635, (q31_t)0x03243f5, (q31_t)0x800009df, (q31_t)0x1921fb, (q31_t)0x80000278 +}; + const q31_t cos_factorsQ31_2048[2048] = { + (q31_t)0x7fffff62, (q31_t)0x7ffffa73, (q31_t)0x7ffff094, (q31_t)0x7fffe1c6, (q31_t)0x7fffce09, (q31_t)0x7fffb55c, + (q31_t)0x7fff97c1, (q31_t)0x7fff7536, + (q31_t)0x7fff4dbb, (q31_t)0x7fff2151, (q31_t)0x7ffeeff8, (q31_t)0x7ffeb9b0, (q31_t)0x7ffe7e79, (q31_t)0x7ffe3e52, + (q31_t)0x7ffdf93c, (q31_t)0x7ffdaf37, + (q31_t)0x7ffd6042, (q31_t)0x7ffd0c5f, (q31_t)0x7ffcb38c, (q31_t)0x7ffc55ca, (q31_t)0x7ffbf319, (q31_t)0x7ffb8b78, + (q31_t)0x7ffb1ee9, (q31_t)0x7ffaad6a, + (q31_t)0x7ffa36fc, (q31_t)0x7ff9bba0, (q31_t)0x7ff93b54, (q31_t)0x7ff8b619, (q31_t)0x7ff82bef, (q31_t)0x7ff79cd6, + (q31_t)0x7ff708ce, (q31_t)0x7ff66fd7, + (q31_t)0x7ff5d1f1, (q31_t)0x7ff52f1d, (q31_t)0x7ff48759, (q31_t)0x7ff3daa6, (q31_t)0x7ff32905, (q31_t)0x7ff27275, + (q31_t)0x7ff1b6f6, (q31_t)0x7ff0f688, + (q31_t)0x7ff0312c, (q31_t)0x7fef66e1, (q31_t)0x7fee97a7, (q31_t)0x7fedc37e, (q31_t)0x7fecea67, (q31_t)0x7fec0c62, + (q31_t)0x7feb296d, (q31_t)0x7fea418b, + (q31_t)0x7fe954ba, (q31_t)0x7fe862fa, (q31_t)0x7fe76c4c, (q31_t)0x7fe670b0, (q31_t)0x7fe57025, (q31_t)0x7fe46aac, + (q31_t)0x7fe36045, (q31_t)0x7fe250ef, + (q31_t)0x7fe13cac, (q31_t)0x7fe0237a, (q31_t)0x7fdf055a, (q31_t)0x7fdde24d, (q31_t)0x7fdcba51, (q31_t)0x7fdb8d67, + (q31_t)0x7fda5b8f, (q31_t)0x7fd924ca, + (q31_t)0x7fd7e917, (q31_t)0x7fd6a875, (q31_t)0x7fd562e7, (q31_t)0x7fd4186a, (q31_t)0x7fd2c900, (q31_t)0x7fd174a8, + (q31_t)0x7fd01b63, (q31_t)0x7fcebd31, + (q31_t)0x7fcd5a11, (q31_t)0x7fcbf203, (q31_t)0x7fca8508, (q31_t)0x7fc91320, (q31_t)0x7fc79c4b, (q31_t)0x7fc62089, + (q31_t)0x7fc49fda, (q31_t)0x7fc31a3d, + (q31_t)0x7fc18fb4, (q31_t)0x7fc0003e, (q31_t)0x7fbe6bdb, (q31_t)0x7fbcd28b, (q31_t)0x7fbb344e, (q31_t)0x7fb99125, + (q31_t)0x7fb7e90f, (q31_t)0x7fb63c0d, + (q31_t)0x7fb48a1e, (q31_t)0x7fb2d343, (q31_t)0x7fb1177b, (q31_t)0x7faf56c7, (q31_t)0x7fad9127, (q31_t)0x7fabc69b, + (q31_t)0x7fa9f723, (q31_t)0x7fa822bf, + (q31_t)0x7fa6496e, (q31_t)0x7fa46b32, (q31_t)0x7fa2880b, (q31_t)0x7fa09ff7, (q31_t)0x7f9eb2f8, (q31_t)0x7f9cc10d, + (q31_t)0x7f9aca37, (q31_t)0x7f98ce76, + (q31_t)0x7f96cdc9, (q31_t)0x7f94c831, (q31_t)0x7f92bdad, (q31_t)0x7f90ae3f, (q31_t)0x7f8e99e6, (q31_t)0x7f8c80a1, + (q31_t)0x7f8a6272, (q31_t)0x7f883f58, + (q31_t)0x7f861753, (q31_t)0x7f83ea64, (q31_t)0x7f81b88a, (q31_t)0x7f7f81c6, (q31_t)0x7f7d4617, (q31_t)0x7f7b057e, + (q31_t)0x7f78bffb, (q31_t)0x7f76758e, + (q31_t)0x7f742637, (q31_t)0x7f71d1f6, (q31_t)0x7f6f78cb, (q31_t)0x7f6d1ab6, (q31_t)0x7f6ab7b8, (q31_t)0x7f684fd0, + (q31_t)0x7f65e2ff, (q31_t)0x7f637144, + (q31_t)0x7f60faa0, (q31_t)0x7f5e7f13, (q31_t)0x7f5bfe9d, (q31_t)0x7f59793e, (q31_t)0x7f56eef5, (q31_t)0x7f545fc5, + (q31_t)0x7f51cbab, (q31_t)0x7f4f32a9, + (q31_t)0x7f4c94be, (q31_t)0x7f49f1eb, (q31_t)0x7f474a30, (q31_t)0x7f449d8c, (q31_t)0x7f41ec01, (q31_t)0x7f3f358d, + (q31_t)0x7f3c7a31, (q31_t)0x7f39b9ee, + (q31_t)0x7f36f4c3, (q31_t)0x7f342ab1, (q31_t)0x7f315bb7, (q31_t)0x7f2e87d6, (q31_t)0x7f2baf0d, (q31_t)0x7f28d15d, + (q31_t)0x7f25eec7, (q31_t)0x7f230749, + (q31_t)0x7f201ae5, (q31_t)0x7f1d299a, (q31_t)0x7f1a3368, (q31_t)0x7f173850, (q31_t)0x7f143852, (q31_t)0x7f11336d, + (q31_t)0x7f0e29a3, (q31_t)0x7f0b1af2, + (q31_t)0x7f08075c, (q31_t)0x7f04eedf, (q31_t)0x7f01d17d, (q31_t)0x7efeaf36, (q31_t)0x7efb8809, (q31_t)0x7ef85bf7, + (q31_t)0x7ef52b00, (q31_t)0x7ef1f524, + (q31_t)0x7eeeba62, (q31_t)0x7eeb7abc, (q31_t)0x7ee83632, (q31_t)0x7ee4ecc3, (q31_t)0x7ee19e6f, (q31_t)0x7ede4b38, + (q31_t)0x7edaf31c, (q31_t)0x7ed7961c, + (q31_t)0x7ed43438, (q31_t)0x7ed0cd70, (q31_t)0x7ecd61c5, (q31_t)0x7ec9f137, (q31_t)0x7ec67bc5, (q31_t)0x7ec3016f, + (q31_t)0x7ebf8237, (q31_t)0x7ebbfe1c, + (q31_t)0x7eb8751e, (q31_t)0x7eb4e73d, (q31_t)0x7eb1547a, (q31_t)0x7eadbcd4, (q31_t)0x7eaa204c, (q31_t)0x7ea67ee2, + (q31_t)0x7ea2d896, (q31_t)0x7e9f2d68, + (q31_t)0x7e9b7d58, (q31_t)0x7e97c867, (q31_t)0x7e940e94, (q31_t)0x7e904fe0, (q31_t)0x7e8c8c4b, (q31_t)0x7e88c3d5, + (q31_t)0x7e84f67e, (q31_t)0x7e812447, + (q31_t)0x7e7d4d2f, (q31_t)0x7e797136, (q31_t)0x7e75905d, (q31_t)0x7e71aaa4, (q31_t)0x7e6dc00c, (q31_t)0x7e69d093, + (q31_t)0x7e65dc3b, (q31_t)0x7e61e303, + (q31_t)0x7e5de4ec, (q31_t)0x7e59e1f5, (q31_t)0x7e55da20, (q31_t)0x7e51cd6c, (q31_t)0x7e4dbbd9, (q31_t)0x7e49a567, + (q31_t)0x7e458a17, (q31_t)0x7e4169e9, + (q31_t)0x7e3d44dd, (q31_t)0x7e391af3, (q31_t)0x7e34ec2b, (q31_t)0x7e30b885, (q31_t)0x7e2c8002, (q31_t)0x7e2842a2, + (q31_t)0x7e240064, (q31_t)0x7e1fb94a, + (q31_t)0x7e1b6d53, (q31_t)0x7e171c7f, (q31_t)0x7e12c6ce, (q31_t)0x7e0e6c42, (q31_t)0x7e0a0cd9, (q31_t)0x7e05a894, + (q31_t)0x7e013f74, (q31_t)0x7dfcd178, + (q31_t)0x7df85ea0, (q31_t)0x7df3e6ee, (q31_t)0x7def6a60, (q31_t)0x7deae8f7, (q31_t)0x7de662b3, (q31_t)0x7de1d795, + (q31_t)0x7ddd479d, (q31_t)0x7dd8b2ca, + (q31_t)0x7dd4191d, (q31_t)0x7dcf7a96, (q31_t)0x7dcad736, (q31_t)0x7dc62efc, (q31_t)0x7dc181e8, (q31_t)0x7dbccffc, + (q31_t)0x7db81936, (q31_t)0x7db35d98, + (q31_t)0x7dae9d21, (q31_t)0x7da9d7d2, (q31_t)0x7da50dab, (q31_t)0x7da03eab, (q31_t)0x7d9b6ad3, (q31_t)0x7d969224, + (q31_t)0x7d91b49e, (q31_t)0x7d8cd240, + (q31_t)0x7d87eb0a, (q31_t)0x7d82fefe, (q31_t)0x7d7e0e1c, (q31_t)0x7d791862, (q31_t)0x7d741dd2, (q31_t)0x7d6f1e6c, + (q31_t)0x7d6a1a31, (q31_t)0x7d65111f, + (q31_t)0x7d600338, (q31_t)0x7d5af07b, (q31_t)0x7d55d8e9, (q31_t)0x7d50bc82, (q31_t)0x7d4b9b46, (q31_t)0x7d467536, + (q31_t)0x7d414a51, (q31_t)0x7d3c1a98, + (q31_t)0x7d36e60b, (q31_t)0x7d31acaa, (q31_t)0x7d2c6e76, (q31_t)0x7d272b6e, (q31_t)0x7d21e393, (q31_t)0x7d1c96e5, + (q31_t)0x7d174564, (q31_t)0x7d11ef11, + (q31_t)0x7d0c93eb, (q31_t)0x7d0733f3, (q31_t)0x7d01cf29, (q31_t)0x7cfc658d, (q31_t)0x7cf6f720, (q31_t)0x7cf183e1, + (q31_t)0x7cec0bd1, (q31_t)0x7ce68ef0, + (q31_t)0x7ce10d3f, (q31_t)0x7cdb86bd, (q31_t)0x7cd5fb6a, (q31_t)0x7cd06b48, (q31_t)0x7ccad656, (q31_t)0x7cc53c94, + (q31_t)0x7cbf9e03, (q31_t)0x7cb9faa2, + (q31_t)0x7cb45272, (q31_t)0x7caea574, (q31_t)0x7ca8f3a7, (q31_t)0x7ca33d0c, (q31_t)0x7c9d81a3, (q31_t)0x7c97c16b, + (q31_t)0x7c91fc66, (q31_t)0x7c8c3294, + (q31_t)0x7c8663f4, (q31_t)0x7c809088, (q31_t)0x7c7ab84e, (q31_t)0x7c74db48, (q31_t)0x7c6ef976, (q31_t)0x7c6912d7, + (q31_t)0x7c63276d, (q31_t)0x7c5d3737, + (q31_t)0x7c574236, (q31_t)0x7c514869, (q31_t)0x7c4b49d2, (q31_t)0x7c45466f, (q31_t)0x7c3f3e42, (q31_t)0x7c39314b, + (q31_t)0x7c331f8a, (q31_t)0x7c2d08ff, + (q31_t)0x7c26edab, (q31_t)0x7c20cd8d, (q31_t)0x7c1aa8a6, (q31_t)0x7c147ef6, (q31_t)0x7c0e507e, (q31_t)0x7c081d3d, + (q31_t)0x7c01e534, (q31_t)0x7bfba863, + (q31_t)0x7bf566cb, (q31_t)0x7bef206b, (q31_t)0x7be8d544, (q31_t)0x7be28556, (q31_t)0x7bdc30a1, (q31_t)0x7bd5d726, + (q31_t)0x7bcf78e5, (q31_t)0x7bc915dd, + (q31_t)0x7bc2ae10, (q31_t)0x7bbc417e, (q31_t)0x7bb5d026, (q31_t)0x7baf5a09, (q31_t)0x7ba8df28, (q31_t)0x7ba25f82, + (q31_t)0x7b9bdb18, (q31_t)0x7b9551ea, + (q31_t)0x7b8ec3f8, (q31_t)0x7b883143, (q31_t)0x7b8199ca, (q31_t)0x7b7afd8f, (q31_t)0x7b745c91, (q31_t)0x7b6db6d0, + (q31_t)0x7b670c4d, (q31_t)0x7b605d09, + (q31_t)0x7b59a902, (q31_t)0x7b52f03a, (q31_t)0x7b4c32b1, (q31_t)0x7b457068, (q31_t)0x7b3ea95d, (q31_t)0x7b37dd92, + (q31_t)0x7b310d07, (q31_t)0x7b2a37bc, + (q31_t)0x7b235db2, (q31_t)0x7b1c7ee8, (q31_t)0x7b159b5f, (q31_t)0x7b0eb318, (q31_t)0x7b07c612, (q31_t)0x7b00d44d, + (q31_t)0x7af9ddcb, (q31_t)0x7af2e28b, + (q31_t)0x7aebe28d, (q31_t)0x7ae4ddd2, (q31_t)0x7addd45b, (q31_t)0x7ad6c626, (q31_t)0x7acfb336, (q31_t)0x7ac89b89, + (q31_t)0x7ac17f20, (q31_t)0x7aba5dfc, + (q31_t)0x7ab3381d, (q31_t)0x7aac0d82, (q31_t)0x7aa4de2d, (q31_t)0x7a9daa1d, (q31_t)0x7a967153, (q31_t)0x7a8f33d0, + (q31_t)0x7a87f192, (q31_t)0x7a80aa9c, + (q31_t)0x7a795eec, (q31_t)0x7a720e84, (q31_t)0x7a6ab963, (q31_t)0x7a635f8a, (q31_t)0x7a5c00f9, (q31_t)0x7a549db0, + (q31_t)0x7a4d35b0, (q31_t)0x7a45c8f9, + (q31_t)0x7a3e578b, (q31_t)0x7a36e166, (q31_t)0x7a2f668c, (q31_t)0x7a27e6fb, (q31_t)0x7a2062b5, (q31_t)0x7a18d9b9, + (q31_t)0x7a114c09, (q31_t)0x7a09b9a4, + (q31_t)0x7a02228a, (q31_t)0x79fa86bc, (q31_t)0x79f2e63a, (q31_t)0x79eb4105, (q31_t)0x79e3971c, (q31_t)0x79dbe880, + (q31_t)0x79d43532, (q31_t)0x79cc7d31, + (q31_t)0x79c4c07e, (q31_t)0x79bcff19, (q31_t)0x79b53903, (q31_t)0x79ad6e3c, (q31_t)0x79a59ec3, (q31_t)0x799dca9a, + (q31_t)0x7995f1c1, (q31_t)0x798e1438, + (q31_t)0x798631ff, (q31_t)0x797e4b16, (q31_t)0x79765f7f, (q31_t)0x796e6f39, (q31_t)0x79667a44, (q31_t)0x795e80a1, + (q31_t)0x79568250, (q31_t)0x794e7f52, + (q31_t)0x794677a6, (q31_t)0x793e6b4e, (q31_t)0x79365a49, (q31_t)0x792e4497, (q31_t)0x79262a3a, (q31_t)0x791e0b31, + (q31_t)0x7915e77c, (q31_t)0x790dbf1d, + (q31_t)0x79059212, (q31_t)0x78fd605d, (q31_t)0x78f529fe, (q31_t)0x78eceef6, (q31_t)0x78e4af44, (q31_t)0x78dc6ae8, + (q31_t)0x78d421e4, (q31_t)0x78cbd437, + (q31_t)0x78c381e2, (q31_t)0x78bb2ae5, (q31_t)0x78b2cf41, (q31_t)0x78aa6ef5, (q31_t)0x78a20a03, (q31_t)0x7899a06a, + (q31_t)0x7891322a, (q31_t)0x7888bf45, + (q31_t)0x788047ba, (q31_t)0x7877cb89, (q31_t)0x786f4ab4, (q31_t)0x7866c53a, (q31_t)0x785e3b1c, (q31_t)0x7855ac5a, + (q31_t)0x784d18f4, (q31_t)0x784480ea, + (q31_t)0x783be43e, (q31_t)0x783342ef, (q31_t)0x782a9cfe, (q31_t)0x7821f26b, (q31_t)0x78194336, (q31_t)0x78108f60, + (q31_t)0x7807d6e9, (q31_t)0x77ff19d1, + (q31_t)0x77f65819, (q31_t)0x77ed91c0, (q31_t)0x77e4c6c9, (q31_t)0x77dbf732, (q31_t)0x77d322fc, (q31_t)0x77ca4a27, + (q31_t)0x77c16cb4, (q31_t)0x77b88aa3, + (q31_t)0x77afa3f5, (q31_t)0x77a6b8a9, (q31_t)0x779dc8c0, (q31_t)0x7794d43b, (q31_t)0x778bdb19, (q31_t)0x7782dd5c, + (q31_t)0x7779db03, (q31_t)0x7770d40f, + (q31_t)0x7767c880, (q31_t)0x775eb857, (q31_t)0x7755a394, (q31_t)0x774c8a36, (q31_t)0x77436c40, (q31_t)0x773a49b0, + (q31_t)0x77312287, (q31_t)0x7727f6c6, + (q31_t)0x771ec66e, (q31_t)0x7715917d, (q31_t)0x770c57f5, (q31_t)0x770319d6, (q31_t)0x76f9d721, (q31_t)0x76f08fd5, + (q31_t)0x76e743f4, (q31_t)0x76ddf37c, + (q31_t)0x76d49e70, (q31_t)0x76cb44cf, (q31_t)0x76c1e699, (q31_t)0x76b883d0, (q31_t)0x76af1c72, (q31_t)0x76a5b082, + (q31_t)0x769c3ffe, (q31_t)0x7692cae8, + (q31_t)0x7689513f, (q31_t)0x767fd304, (q31_t)0x76765038, (q31_t)0x766cc8db, (q31_t)0x76633ced, (q31_t)0x7659ac6f, + (q31_t)0x76501760, (q31_t)0x76467dc2, + (q31_t)0x763cdf94, (q31_t)0x76333cd8, (q31_t)0x7629958c, (q31_t)0x761fe9b3, (q31_t)0x7616394c, (q31_t)0x760c8457, + (q31_t)0x7602cad5, (q31_t)0x75f90cc7, + (q31_t)0x75ef4a2c, (q31_t)0x75e58305, (q31_t)0x75dbb753, (q31_t)0x75d1e715, (q31_t)0x75c8124d, (q31_t)0x75be38fa, + (q31_t)0x75b45b1d, (q31_t)0x75aa78b6, + (q31_t)0x75a091c6, (q31_t)0x7596a64d, (q31_t)0x758cb64c, (q31_t)0x7582c1c2, (q31_t)0x7578c8b0, (q31_t)0x756ecb18, + (q31_t)0x7564c8f8, (q31_t)0x755ac251, + (q31_t)0x7550b725, (q31_t)0x7546a772, (q31_t)0x753c933a, (q31_t)0x75327a7d, (q31_t)0x75285d3b, (q31_t)0x751e3b75, + (q31_t)0x7514152b, (q31_t)0x7509ea5d, + (q31_t)0x74ffbb0d, (q31_t)0x74f58739, (q31_t)0x74eb4ee3, (q31_t)0x74e1120c, (q31_t)0x74d6d0b2, (q31_t)0x74cc8ad8, + (q31_t)0x74c2407d, (q31_t)0x74b7f1a1, + (q31_t)0x74ad9e46, (q31_t)0x74a3466b, (q31_t)0x7498ea11, (q31_t)0x748e8938, (q31_t)0x748423e0, (q31_t)0x7479ba0b, + (q31_t)0x746f4bb8, (q31_t)0x7464d8e8, + (q31_t)0x745a619b, (q31_t)0x744fe5d2, (q31_t)0x7445658d, (q31_t)0x743ae0cc, (q31_t)0x74305790, (q31_t)0x7425c9da, + (q31_t)0x741b37a9, (q31_t)0x7410a0fe, + (q31_t)0x740605d9, (q31_t)0x73fb663c, (q31_t)0x73f0c226, (q31_t)0x73e61997, (q31_t)0x73db6c91, (q31_t)0x73d0bb13, + (q31_t)0x73c6051f, (q31_t)0x73bb4ab3, + (q31_t)0x73b08bd1, (q31_t)0x73a5c87a, (q31_t)0x739b00ad, (q31_t)0x7390346b, (q31_t)0x738563b5, (q31_t)0x737a8e8a, + (q31_t)0x736fb4ec, (q31_t)0x7364d6da, + (q31_t)0x7359f456, (q31_t)0x734f0d5f, (q31_t)0x734421f6, (q31_t)0x7339321b, (q31_t)0x732e3dcf, (q31_t)0x73234512, + (q31_t)0x731847e5, (q31_t)0x730d4648, + (q31_t)0x7302403c, (q31_t)0x72f735c0, (q31_t)0x72ec26d6, (q31_t)0x72e1137d, (q31_t)0x72d5fbb7, (q31_t)0x72cadf83, + (q31_t)0x72bfbee3, (q31_t)0x72b499d6, + (q31_t)0x72a9705c, (q31_t)0x729e4277, (q31_t)0x72931027, (q31_t)0x7287d96c, (q31_t)0x727c9e47, (q31_t)0x72715eb8, + (q31_t)0x72661abf, (q31_t)0x725ad25d, + (q31_t)0x724f8593, (q31_t)0x72443460, (q31_t)0x7238dec5, (q31_t)0x722d84c4, (q31_t)0x7222265b, (q31_t)0x7216c38c, + (q31_t)0x720b5c57, (q31_t)0x71fff0bc, + (q31_t)0x71f480bc, (q31_t)0x71e90c57, (q31_t)0x71dd938f, (q31_t)0x71d21662, (q31_t)0x71c694d2, (q31_t)0x71bb0edf, + (q31_t)0x71af848a, (q31_t)0x71a3f5d2, + (q31_t)0x719862b9, (q31_t)0x718ccb3f, (q31_t)0x71812f65, (q31_t)0x71758f29, (q31_t)0x7169ea8f, (q31_t)0x715e4194, + (q31_t)0x7152943b, (q31_t)0x7146e284, + (q31_t)0x713b2c6e, (q31_t)0x712f71fb, (q31_t)0x7123b32b, (q31_t)0x7117effe, (q31_t)0x710c2875, (q31_t)0x71005c90, + (q31_t)0x70f48c50, (q31_t)0x70e8b7b5, + (q31_t)0x70dcdec0, (q31_t)0x70d10171, (q31_t)0x70c51fc8, (q31_t)0x70b939c7, (q31_t)0x70ad4f6d, (q31_t)0x70a160ba, + (q31_t)0x70956db1, (q31_t)0x70897650, + (q31_t)0x707d7a98, (q31_t)0x70717a8a, (q31_t)0x70657626, (q31_t)0x70596d6d, (q31_t)0x704d6060, (q31_t)0x70414efd, + (q31_t)0x70353947, (q31_t)0x70291f3e, + (q31_t)0x701d00e1, (q31_t)0x7010de32, (q31_t)0x7004b731, (q31_t)0x6ff88bde, (q31_t)0x6fec5c3b, (q31_t)0x6fe02846, + (q31_t)0x6fd3f001, (q31_t)0x6fc7b36d, + (q31_t)0x6fbb728a, (q31_t)0x6faf2d57, (q31_t)0x6fa2e3d7, (q31_t)0x6f969608, (q31_t)0x6f8a43ed, (q31_t)0x6f7ded84, + (q31_t)0x6f7192cf, (q31_t)0x6f6533ce, + (q31_t)0x6f58d082, (q31_t)0x6f4c68eb, (q31_t)0x6f3ffd09, (q31_t)0x6f338cde, (q31_t)0x6f271868, (q31_t)0x6f1a9faa, + (q31_t)0x6f0e22a3, (q31_t)0x6f01a155, + (q31_t)0x6ef51bbe, (q31_t)0x6ee891e1, (q31_t)0x6edc03bc, (q31_t)0x6ecf7152, (q31_t)0x6ec2daa2, (q31_t)0x6eb63fad, + (q31_t)0x6ea9a073, (q31_t)0x6e9cfcf5, + (q31_t)0x6e905534, (q31_t)0x6e83a92f, (q31_t)0x6e76f8e7, (q31_t)0x6e6a445d, (q31_t)0x6e5d8b91, (q31_t)0x6e50ce84, + (q31_t)0x6e440d37, (q31_t)0x6e3747a9, + (q31_t)0x6e2a7ddb, (q31_t)0x6e1dafce, (q31_t)0x6e10dd82, (q31_t)0x6e0406f8, (q31_t)0x6df72c30, (q31_t)0x6dea4d2b, + (q31_t)0x6ddd69e9, (q31_t)0x6dd0826a, + (q31_t)0x6dc396b0, (q31_t)0x6db6a6ba, (q31_t)0x6da9b28a, (q31_t)0x6d9cba1f, (q31_t)0x6d8fbd7a, (q31_t)0x6d82bc9d, + (q31_t)0x6d75b786, (q31_t)0x6d68ae37, + (q31_t)0x6d5ba0b0, (q31_t)0x6d4e8ef2, (q31_t)0x6d4178fd, (q31_t)0x6d345ed1, (q31_t)0x6d274070, (q31_t)0x6d1a1dda, + (q31_t)0x6d0cf70f, (q31_t)0x6cffcc0f, + (q31_t)0x6cf29cdc, (q31_t)0x6ce56975, (q31_t)0x6cd831dc, (q31_t)0x6ccaf610, (q31_t)0x6cbdb613, (q31_t)0x6cb071e4, + (q31_t)0x6ca32985, (q31_t)0x6c95dcf6, + (q31_t)0x6c888c36, (q31_t)0x6c7b3748, (q31_t)0x6c6dde2b, (q31_t)0x6c6080e0, (q31_t)0x6c531f67, (q31_t)0x6c45b9c1, + (q31_t)0x6c384fef, (q31_t)0x6c2ae1f0, + (q31_t)0x6c1d6fc6, (q31_t)0x6c0ff971, (q31_t)0x6c027ef1, (q31_t)0x6bf50047, (q31_t)0x6be77d74, (q31_t)0x6bd9f677, + (q31_t)0x6bcc6b53, (q31_t)0x6bbedc06, + (q31_t)0x6bb14892, (q31_t)0x6ba3b0f7, (q31_t)0x6b961536, (q31_t)0x6b88754f, (q31_t)0x6b7ad142, (q31_t)0x6b6d2911, + (q31_t)0x6b5f7cbc, (q31_t)0x6b51cc42, + (q31_t)0x6b4417a6, (q31_t)0x6b365ee7, (q31_t)0x6b28a206, (q31_t)0x6b1ae103, (q31_t)0x6b0d1bdf, (q31_t)0x6aff529a, + (q31_t)0x6af18536, (q31_t)0x6ae3b3b2, + (q31_t)0x6ad5de0f, (q31_t)0x6ac8044e, (q31_t)0x6aba266e, (q31_t)0x6aac4472, (q31_t)0x6a9e5e58, (q31_t)0x6a907423, + (q31_t)0x6a8285d1, (q31_t)0x6a749365, + (q31_t)0x6a669cdd, (q31_t)0x6a58a23c, (q31_t)0x6a4aa381, (q31_t)0x6a3ca0ad, (q31_t)0x6a2e99c0, (q31_t)0x6a208ebb, + (q31_t)0x6a127f9f, (q31_t)0x6a046c6c, + (q31_t)0x69f65523, (q31_t)0x69e839c4, (q31_t)0x69da1a50, (q31_t)0x69cbf6c7, (q31_t)0x69bdcf29, (q31_t)0x69afa378, + (q31_t)0x69a173b5, (q31_t)0x69933fde, + (q31_t)0x698507f6, (q31_t)0x6976cbfc, (q31_t)0x69688bf1, (q31_t)0x695a47d6, (q31_t)0x694bffab, (q31_t)0x693db371, + (q31_t)0x692f6328, (q31_t)0x69210ed1, + (q31_t)0x6912b66c, (q31_t)0x690459fb, (q31_t)0x68f5f97d, (q31_t)0x68e794f3, (q31_t)0x68d92c5d, (q31_t)0x68cabfbd, + (q31_t)0x68bc4f13, (q31_t)0x68adda5f, + (q31_t)0x689f61a1, (q31_t)0x6890e4dc, (q31_t)0x6882640e, (q31_t)0x6873df38, (q31_t)0x6865565c, (q31_t)0x6856c979, + (q31_t)0x68483891, (q31_t)0x6839a3a4, + (q31_t)0x682b0ab1, (q31_t)0x681c6dbb, (q31_t)0x680dccc1, (q31_t)0x67ff27c4, (q31_t)0x67f07ec5, (q31_t)0x67e1d1c4, + (q31_t)0x67d320c1, (q31_t)0x67c46bbe, + (q31_t)0x67b5b2bb, (q31_t)0x67a6f5b8, (q31_t)0x679834b6, (q31_t)0x67896fb6, (q31_t)0x677aa6b8, (q31_t)0x676bd9bd, + (q31_t)0x675d08c4, (q31_t)0x674e33d0, + (q31_t)0x673f5ae0, (q31_t)0x67307df5, (q31_t)0x67219d10, (q31_t)0x6712b831, (q31_t)0x6703cf58, (q31_t)0x66f4e287, + (q31_t)0x66e5f1be, (q31_t)0x66d6fcfd, + (q31_t)0x66c80445, (q31_t)0x66b90797, (q31_t)0x66aa06f3, (q31_t)0x669b0259, (q31_t)0x668bf9cb, (q31_t)0x667ced49, + (q31_t)0x666ddcd3, (q31_t)0x665ec86b, + (q31_t)0x664fb010, (q31_t)0x664093c3, (q31_t)0x66317385, (q31_t)0x66224f56, (q31_t)0x66132738, (q31_t)0x6603fb2a, + (q31_t)0x65f4cb2d, (q31_t)0x65e59742, + (q31_t)0x65d65f69, (q31_t)0x65c723a3, (q31_t)0x65b7e3f1, (q31_t)0x65a8a052, (q31_t)0x659958c9, (q31_t)0x658a0d54, + (q31_t)0x657abdf6, (q31_t)0x656b6aae, + (q31_t)0x655c137d, (q31_t)0x654cb863, (q31_t)0x653d5962, (q31_t)0x652df679, (q31_t)0x651e8faa, (q31_t)0x650f24f5, + (q31_t)0x64ffb65b, (q31_t)0x64f043dc, + (q31_t)0x64e0cd78, (q31_t)0x64d15331, (q31_t)0x64c1d507, (q31_t)0x64b252fa, (q31_t)0x64a2cd0c, (q31_t)0x6493433c, + (q31_t)0x6483b58c, (q31_t)0x647423fb, + (q31_t)0x64648e8c, (q31_t)0x6454f53d, (q31_t)0x64455810, (q31_t)0x6435b706, (q31_t)0x6426121e, (q31_t)0x6416695a, + (q31_t)0x6406bcba, (q31_t)0x63f70c3f, + (q31_t)0x63e757ea, (q31_t)0x63d79fba, (q31_t)0x63c7e3b1, (q31_t)0x63b823cf, (q31_t)0x63a86015, (q31_t)0x63989884, + (q31_t)0x6388cd1b, (q31_t)0x6378fddc, + (q31_t)0x63692ac7, (q31_t)0x635953dd, (q31_t)0x6349791f, (q31_t)0x63399a8d, (q31_t)0x6329b827, (q31_t)0x6319d1ef, + (q31_t)0x6309e7e4, (q31_t)0x62f9fa09, + (q31_t)0x62ea085c, (q31_t)0x62da12df, (q31_t)0x62ca1992, (q31_t)0x62ba1c77, (q31_t)0x62aa1b8d, (q31_t)0x629a16d5, + (q31_t)0x628a0e50, (q31_t)0x627a01fe, + (q31_t)0x6269f1e1, (q31_t)0x6259ddf8, (q31_t)0x6249c645, (q31_t)0x6239aac7, (q31_t)0x62298b81, (q31_t)0x62196871, + (q31_t)0x62094199, (q31_t)0x61f916f9, + (q31_t)0x61e8e893, (q31_t)0x61d8b666, (q31_t)0x61c88074, (q31_t)0x61b846bc, (q31_t)0x61a80940, (q31_t)0x6197c800, + (q31_t)0x618782fd, (q31_t)0x61773a37, + (q31_t)0x6166edb0, (q31_t)0x61569d67, (q31_t)0x6146495d, (q31_t)0x6135f193, (q31_t)0x6125960a, (q31_t)0x611536c2, + (q31_t)0x6104d3bc, (q31_t)0x60f46cf9, + (q31_t)0x60e40278, (q31_t)0x60d3943b, (q31_t)0x60c32243, (q31_t)0x60b2ac8f, (q31_t)0x60a23322, (q31_t)0x6091b5fa, + (q31_t)0x60813519, (q31_t)0x6070b080, + (q31_t)0x6060282f, (q31_t)0x604f9c27, (q31_t)0x603f0c69, (q31_t)0x602e78f4, (q31_t)0x601de1ca, (q31_t)0x600d46ec, + (q31_t)0x5ffca859, (q31_t)0x5fec0613, + (q31_t)0x5fdb601b, (q31_t)0x5fcab670, (q31_t)0x5fba0914, (q31_t)0x5fa95807, (q31_t)0x5f98a34a, (q31_t)0x5f87eade, + (q31_t)0x5f772ec2, (q31_t)0x5f666ef9, + (q31_t)0x5f55ab82, (q31_t)0x5f44e45e, (q31_t)0x5f34198e, (q31_t)0x5f234b12, (q31_t)0x5f1278eb, (q31_t)0x5f01a31a, + (q31_t)0x5ef0c99f, (q31_t)0x5edfec7b, + (q31_t)0x5ecf0baf, (q31_t)0x5ebe273b, (q31_t)0x5ead3f1f, (q31_t)0x5e9c535e, (q31_t)0x5e8b63f7, (q31_t)0x5e7a70ea, + (q31_t)0x5e697a39, (q31_t)0x5e587fe5, + (q31_t)0x5e4781ed, (q31_t)0x5e368053, (q31_t)0x5e257b17, (q31_t)0x5e147239, (q31_t)0x5e0365bb, (q31_t)0x5df2559e, + (q31_t)0x5de141e1, (q31_t)0x5dd02a85, + (q31_t)0x5dbf0f8c, (q31_t)0x5dadf0f5, (q31_t)0x5d9ccec2, (q31_t)0x5d8ba8f3, (q31_t)0x5d7a7f88, (q31_t)0x5d695283, + (q31_t)0x5d5821e4, (q31_t)0x5d46edac, + (q31_t)0x5d35b5db, (q31_t)0x5d247a72, (q31_t)0x5d133b72, (q31_t)0x5d01f8dc, (q31_t)0x5cf0b2af, (q31_t)0x5cdf68ed, + (q31_t)0x5cce1b97, (q31_t)0x5cbccaac, + (q31_t)0x5cab762f, (q31_t)0x5c9a1e1e, (q31_t)0x5c88c27c, (q31_t)0x5c776348, (q31_t)0x5c660084, (q31_t)0x5c549a30, + (q31_t)0x5c43304d, (q31_t)0x5c31c2db, + (q31_t)0x5c2051db, (q31_t)0x5c0edd4e, (q31_t)0x5bfd6534, (q31_t)0x5bebe98e, (q31_t)0x5bda6a5d, (q31_t)0x5bc8e7a2, + (q31_t)0x5bb7615d, (q31_t)0x5ba5d78e, + (q31_t)0x5b944a37, (q31_t)0x5b82b958, (q31_t)0x5b7124f2, (q31_t)0x5b5f8d06, (q31_t)0x5b4df193, (q31_t)0x5b3c529c, + (q31_t)0x5b2ab020, (q31_t)0x5b190a20, + (q31_t)0x5b07609d, (q31_t)0x5af5b398, (q31_t)0x5ae40311, (q31_t)0x5ad24f09, (q31_t)0x5ac09781, (q31_t)0x5aaedc78, + (q31_t)0x5a9d1df1, (q31_t)0x5a8b5bec, + (q31_t)0x5a799669, (q31_t)0x5a67cd69, (q31_t)0x5a5600ec, (q31_t)0x5a4430f5, (q31_t)0x5a325d82, (q31_t)0x5a208695, + (q31_t)0x5a0eac2e, (q31_t)0x59fcce4f, + (q31_t)0x59eaecf8, (q31_t)0x59d90829, (q31_t)0x59c71fe3, (q31_t)0x59b53427, (q31_t)0x59a344f6, (q31_t)0x59915250, + (q31_t)0x597f5c36, (q31_t)0x596d62a9, + (q31_t)0x595b65aa, (q31_t)0x59496538, (q31_t)0x59376155, (q31_t)0x59255a02, (q31_t)0x59134f3e, (q31_t)0x5901410c, + (q31_t)0x58ef2f6b, (q31_t)0x58dd1a5d, + (q31_t)0x58cb01e1, (q31_t)0x58b8e5f9, (q31_t)0x58a6c6a5, (q31_t)0x5894a3e7, (q31_t)0x58827dbe, (q31_t)0x5870542c, + (q31_t)0x585e2730, (q31_t)0x584bf6cd, + (q31_t)0x5839c302, (q31_t)0x58278bd1, (q31_t)0x58155139, (q31_t)0x5803133c, (q31_t)0x57f0d1da, (q31_t)0x57de8d15, + (q31_t)0x57cc44ec, (q31_t)0x57b9f960, + (q31_t)0x57a7aa73, (q31_t)0x57955825, (q31_t)0x57830276, (q31_t)0x5770a968, (q31_t)0x575e4cfa, (q31_t)0x574bed2f, + (q31_t)0x57398a05, (q31_t)0x5727237f, + (q31_t)0x5714b99d, (q31_t)0x57024c5f, (q31_t)0x56efdbc7, (q31_t)0x56dd67d4, (q31_t)0x56caf088, (q31_t)0x56b875e4, + (q31_t)0x56a5f7e7, (q31_t)0x56937694, + (q31_t)0x5680f1ea, (q31_t)0x566e69ea, (q31_t)0x565bde95, (q31_t)0x56494fec, (q31_t)0x5636bdef, (q31_t)0x5624289f, + (q31_t)0x56118ffe, (q31_t)0x55fef40a, + (q31_t)0x55ec54c6, (q31_t)0x55d9b232, (q31_t)0x55c70c4f, (q31_t)0x55b4631d, (q31_t)0x55a1b69d, (q31_t)0x558f06d0, + (q31_t)0x557c53b6, (q31_t)0x55699d51, + (q31_t)0x5556e3a1, (q31_t)0x554426a7, (q31_t)0x55316663, (q31_t)0x551ea2d6, (q31_t)0x550bdc01, (q31_t)0x54f911e5, + (q31_t)0x54e64482, (q31_t)0x54d373d9, + (q31_t)0x54c09feb, (q31_t)0x54adc8b8, (q31_t)0x549aee42, (q31_t)0x54881089, (q31_t)0x54752f8d, (q31_t)0x54624b50, + (q31_t)0x544f63d2, (q31_t)0x543c7914, + (q31_t)0x54298b17, (q31_t)0x541699db, (q31_t)0x5403a561, (q31_t)0x53f0adaa, (q31_t)0x53ddb2b6, (q31_t)0x53cab486, + (q31_t)0x53b7b31c, (q31_t)0x53a4ae77, + (q31_t)0x5391a699, (q31_t)0x537e9b82, (q31_t)0x536b8d33, (q31_t)0x53587bad, (q31_t)0x534566f0, (q31_t)0x53324efd, + (q31_t)0x531f33d5, (q31_t)0x530c1579, + (q31_t)0x52f8f3e9, (q31_t)0x52e5cf27, (q31_t)0x52d2a732, (q31_t)0x52bf7c0b, (q31_t)0x52ac4db4, (q31_t)0x52991c2d, + (q31_t)0x5285e777, (q31_t)0x5272af92, + (q31_t)0x525f7480, (q31_t)0x524c3640, (q31_t)0x5238f4d4, (q31_t)0x5225b03d, (q31_t)0x5212687b, (q31_t)0x51ff1d8f, + (q31_t)0x51ebcf7a, (q31_t)0x51d87e3c, + (q31_t)0x51c529d7, (q31_t)0x51b1d24a, (q31_t)0x519e7797, (q31_t)0x518b19bf, (q31_t)0x5177b8c2, (q31_t)0x516454a0, + (q31_t)0x5150ed5c, (q31_t)0x513d82f4, + (q31_t)0x512a156b, (q31_t)0x5116a4c1, (q31_t)0x510330f7, (q31_t)0x50efba0d, (q31_t)0x50dc4005, (q31_t)0x50c8c2de, + (q31_t)0x50b5429a, (q31_t)0x50a1bf39, + (q31_t)0x508e38bd, (q31_t)0x507aaf25, (q31_t)0x50672273, (q31_t)0x505392a8, (q31_t)0x503fffc4, (q31_t)0x502c69c8, + (q31_t)0x5018d0b4, (q31_t)0x5005348a, + (q31_t)0x4ff1954b, (q31_t)0x4fddf2f6, (q31_t)0x4fca4d8d, (q31_t)0x4fb6a510, (q31_t)0x4fa2f981, (q31_t)0x4f8f4ae0, + (q31_t)0x4f7b992d, (q31_t)0x4f67e46a, + (q31_t)0x4f542c98, (q31_t)0x4f4071b6, (q31_t)0x4f2cb3c7, (q31_t)0x4f18f2c9, (q31_t)0x4f052ec0, (q31_t)0x4ef167aa, + (q31_t)0x4edd9d89, (q31_t)0x4ec9d05e, + (q31_t)0x4eb60029, (q31_t)0x4ea22ceb, (q31_t)0x4e8e56a5, (q31_t)0x4e7a7d58, (q31_t)0x4e66a105, (q31_t)0x4e52c1ab, + (q31_t)0x4e3edf4d, (q31_t)0x4e2af9ea, + (q31_t)0x4e171184, (q31_t)0x4e03261b, (q31_t)0x4def37b0, (q31_t)0x4ddb4644, (q31_t)0x4dc751d8, (q31_t)0x4db35a6c, + (q31_t)0x4d9f6001, (q31_t)0x4d8b6298, + (q31_t)0x4d776231, (q31_t)0x4d635ece, (q31_t)0x4d4f5870, (q31_t)0x4d3b4f16, (q31_t)0x4d2742c2, (q31_t)0x4d133374, + (q31_t)0x4cff212e, (q31_t)0x4ceb0bf0, + (q31_t)0x4cd6f3bb, (q31_t)0x4cc2d88f, (q31_t)0x4caeba6e, (q31_t)0x4c9a9958, (q31_t)0x4c86754e, (q31_t)0x4c724e50, + (q31_t)0x4c5e2460, (q31_t)0x4c49f77f, + (q31_t)0x4c35c7ac, (q31_t)0x4c2194e9, (q31_t)0x4c0d5f37, (q31_t)0x4bf92697, (q31_t)0x4be4eb08, (q31_t)0x4bd0ac8d, + (q31_t)0x4bbc6b25, (q31_t)0x4ba826d1, + (q31_t)0x4b93df93, (q31_t)0x4b7f956b, (q31_t)0x4b6b485a, (q31_t)0x4b56f861, (q31_t)0x4b42a580, (q31_t)0x4b2e4fb8, + (q31_t)0x4b19f70a, (q31_t)0x4b059b77, + (q31_t)0x4af13d00, (q31_t)0x4adcdba5, (q31_t)0x4ac87767, (q31_t)0x4ab41046, (q31_t)0x4a9fa645, (q31_t)0x4a8b3963, + (q31_t)0x4a76c9a2, (q31_t)0x4a625701, + (q31_t)0x4a4de182, (q31_t)0x4a396926, (q31_t)0x4a24edee, (q31_t)0x4a106fda, (q31_t)0x49fbeeea, (q31_t)0x49e76b21, + (q31_t)0x49d2e47e, (q31_t)0x49be5b02, + (q31_t)0x49a9ceaf, (q31_t)0x49953f84, (q31_t)0x4980ad84, (q31_t)0x496c18ae, (q31_t)0x49578103, (q31_t)0x4942e684, + (q31_t)0x492e4933, (q31_t)0x4919a90f, + (q31_t)0x4905061a, (q31_t)0x48f06054, (q31_t)0x48dbb7be, (q31_t)0x48c70c59, (q31_t)0x48b25e25, (q31_t)0x489dad25, + (q31_t)0x4888f957, (q31_t)0x487442be, + (q31_t)0x485f8959, (q31_t)0x484acd2a, (q31_t)0x48360e32, (q31_t)0x48214c71, (q31_t)0x480c87e8, (q31_t)0x47f7c099, + (q31_t)0x47e2f682, (q31_t)0x47ce29a7, + (q31_t)0x47b95a06, (q31_t)0x47a487a2, (q31_t)0x478fb27b, (q31_t)0x477ada91, (q31_t)0x4765ffe6, (q31_t)0x4751227a, + (q31_t)0x473c424e, (q31_t)0x47275f63, + (q31_t)0x471279ba, (q31_t)0x46fd9154, (q31_t)0x46e8a631, (q31_t)0x46d3b852, (q31_t)0x46bec7b8, (q31_t)0x46a9d464, + (q31_t)0x4694de56, (q31_t)0x467fe590, + (q31_t)0x466aea12, (q31_t)0x4655ebdd, (q31_t)0x4640eaf2, (q31_t)0x462be751, (q31_t)0x4616e0fc, (q31_t)0x4601d7f3, + (q31_t)0x45eccc37, (q31_t)0x45d7bdc9, + (q31_t)0x45c2acaa, (q31_t)0x45ad98da, (q31_t)0x4598825a, (q31_t)0x4583692c, (q31_t)0x456e4d4f, (q31_t)0x45592ec6, + (q31_t)0x45440d90, (q31_t)0x452ee9ae, + (q31_t)0x4519c321, (q31_t)0x450499eb, (q31_t)0x44ef6e0b, (q31_t)0x44da3f83, (q31_t)0x44c50e53, (q31_t)0x44afda7d, + (q31_t)0x449aa400, (q31_t)0x44856adf, + (q31_t)0x44702f19, (q31_t)0x445af0b0, (q31_t)0x4445afa4, (q31_t)0x44306bf6, (q31_t)0x441b25a8, (q31_t)0x4405dcb9, + (q31_t)0x43f0912b, (q31_t)0x43db42fe, + (q31_t)0x43c5f234, (q31_t)0x43b09ecc, (q31_t)0x439b48c9, (q31_t)0x4385f02a, (q31_t)0x437094f1, (q31_t)0x435b371f, + (q31_t)0x4345d6b3, (q31_t)0x433073b0, + (q31_t)0x431b0e15, (q31_t)0x4305a5e5, (q31_t)0x42f03b1e, (q31_t)0x42dacdc3, (q31_t)0x42c55dd4, (q31_t)0x42afeb53, + (q31_t)0x429a763f, (q31_t)0x4284fe99, + (q31_t)0x426f8463, (q31_t)0x425a079e, (q31_t)0x42448849, (q31_t)0x422f0667, (q31_t)0x421981f7, (q31_t)0x4203fafb, + (q31_t)0x41ee7174, (q31_t)0x41d8e561, + (q31_t)0x41c356c5, (q31_t)0x41adc5a0, (q31_t)0x419831f3, (q31_t)0x41829bbe, (q31_t)0x416d0302, (q31_t)0x415767c1, + (q31_t)0x4141c9fb, (q31_t)0x412c29b1, + (q31_t)0x411686e4, (q31_t)0x4100e194, (q31_t)0x40eb39c3, (q31_t)0x40d58f71, (q31_t)0x40bfe29f, (q31_t)0x40aa334e, + (q31_t)0x4094817f, (q31_t)0x407ecd32, + (q31_t)0x40691669, (q31_t)0x40535d24, (q31_t)0x403da165, (q31_t)0x4027e32b, (q31_t)0x40122278, (q31_t)0x3ffc5f4d, + (q31_t)0x3fe699aa, (q31_t)0x3fd0d191, + (q31_t)0x3fbb0702, (q31_t)0x3fa539fd, (q31_t)0x3f8f6a85, (q31_t)0x3f799899, (q31_t)0x3f63c43b, (q31_t)0x3f4ded6b, + (q31_t)0x3f38142a, (q31_t)0x3f22387a, + (q31_t)0x3f0c5a5a, (q31_t)0x3ef679cc, (q31_t)0x3ee096d1, (q31_t)0x3ecab169, (q31_t)0x3eb4c995, (q31_t)0x3e9edf57, + (q31_t)0x3e88f2ae, (q31_t)0x3e73039d, + (q31_t)0x3e5d1222, (q31_t)0x3e471e41, (q31_t)0x3e3127f9, (q31_t)0x3e1b2f4a, (q31_t)0x3e053437, (q31_t)0x3def36c0, + (q31_t)0x3dd936e6, (q31_t)0x3dc334a9, + (q31_t)0x3dad300b, (q31_t)0x3d97290b, (q31_t)0x3d811fac, (q31_t)0x3d6b13ee, (q31_t)0x3d5505d2, (q31_t)0x3d3ef559, + (q31_t)0x3d28e282, (q31_t)0x3d12cd51, + (q31_t)0x3cfcb5c4, (q31_t)0x3ce69bde, (q31_t)0x3cd07f9f, (q31_t)0x3cba6107, (q31_t)0x3ca44018, (q31_t)0x3c8e1cd3, + (q31_t)0x3c77f737, (q31_t)0x3c61cf48, + (q31_t)0x3c4ba504, (q31_t)0x3c35786d, (q31_t)0x3c1f4983, (q31_t)0x3c091849, (q31_t)0x3bf2e4be, (q31_t)0x3bdcaee3, + (q31_t)0x3bc676b9, (q31_t)0x3bb03c42, + (q31_t)0x3b99ff7d, (q31_t)0x3b83c06c, (q31_t)0x3b6d7f10, (q31_t)0x3b573b69, (q31_t)0x3b40f579, (q31_t)0x3b2aad3f, + (q31_t)0x3b1462be, (q31_t)0x3afe15f6, + (q31_t)0x3ae7c6e7, (q31_t)0x3ad17593, (q31_t)0x3abb21fb, (q31_t)0x3aa4cc1e, (q31_t)0x3a8e7400, (q31_t)0x3a78199f, + (q31_t)0x3a61bcfd, (q31_t)0x3a4b5e1b, + (q31_t)0x3a34fcf9, (q31_t)0x3a1e9999, (q31_t)0x3a0833fc, (q31_t)0x39f1cc21, (q31_t)0x39db620b, (q31_t)0x39c4f5ba, + (q31_t)0x39ae872f, (q31_t)0x3998166a, + (q31_t)0x3981a36d, (q31_t)0x396b2e38, (q31_t)0x3954b6cd, (q31_t)0x393e3d2c, (q31_t)0x3927c155, (q31_t)0x3911434b, + (q31_t)0x38fac30e, (q31_t)0x38e4409e, + (q31_t)0x38cdbbfc, (q31_t)0x38b7352a, (q31_t)0x38a0ac29, (q31_t)0x388a20f8, (q31_t)0x38739399, (q31_t)0x385d040d, + (q31_t)0x38467255, (q31_t)0x382fde72, + (q31_t)0x38194864, (q31_t)0x3802b02c, (q31_t)0x37ec15cb, (q31_t)0x37d57943, (q31_t)0x37beda93, (q31_t)0x37a839be, + (q31_t)0x379196c3, (q31_t)0x377af1a3, + (q31_t)0x37644a60, (q31_t)0x374da0fa, (q31_t)0x3736f573, (q31_t)0x372047ca, (q31_t)0x37099802, (q31_t)0x36f2e61a, + (q31_t)0x36dc3214, (q31_t)0x36c57bf0, + (q31_t)0x36aec3b0, (q31_t)0x36980954, (q31_t)0x36814cde, (q31_t)0x366a8e4d, (q31_t)0x3653cda3, (q31_t)0x363d0ae2, + (q31_t)0x36264609, (q31_t)0x360f7f19, + (q31_t)0x35f8b614, (q31_t)0x35e1eafa, (q31_t)0x35cb1dcc, (q31_t)0x35b44e8c, (q31_t)0x359d7d39, (q31_t)0x3586a9d5, + (q31_t)0x356fd461, (q31_t)0x3558fcde, + (q31_t)0x3542234c, (q31_t)0x352b47ad, (q31_t)0x35146a00, (q31_t)0x34fd8a48, (q31_t)0x34e6a885, (q31_t)0x34cfc4b7, + (q31_t)0x34b8dee1, (q31_t)0x34a1f702, + (q31_t)0x348b0d1c, (q31_t)0x3474212f, (q31_t)0x345d333c, (q31_t)0x34464345, (q31_t)0x342f5149, (q31_t)0x34185d4b, + (q31_t)0x3401674a, (q31_t)0x33ea6f48, + (q31_t)0x33d37546, (q31_t)0x33bc7944, (q31_t)0x33a57b44, (q31_t)0x338e7b46, (q31_t)0x3377794b, (q31_t)0x33607554, + (q31_t)0x33496f62, (q31_t)0x33326776, + (q31_t)0x331b5d91, (q31_t)0x330451b3, (q31_t)0x32ed43de, (q31_t)0x32d63412, (q31_t)0x32bf2250, (q31_t)0x32a80e99, + (q31_t)0x3290f8ef, (q31_t)0x3279e151, + (q31_t)0x3262c7c1, (q31_t)0x324bac40, (q31_t)0x32348ecf, (q31_t)0x321d6f6e, (q31_t)0x32064e1e, (q31_t)0x31ef2ae1, + (q31_t)0x31d805b7, (q31_t)0x31c0dea1, + (q31_t)0x31a9b5a0, (q31_t)0x31928ab4, (q31_t)0x317b5de0, (q31_t)0x31642f23, (q31_t)0x314cfe7f, (q31_t)0x3135cbf4, + (q31_t)0x311e9783, (q31_t)0x3107612e, + (q31_t)0x30f028f4, (q31_t)0x30d8eed8, (q31_t)0x30c1b2da, (q31_t)0x30aa74fa, (q31_t)0x3093353a, (q31_t)0x307bf39b, + (q31_t)0x3064b01d, (q31_t)0x304d6ac1, + (q31_t)0x30362389, (q31_t)0x301eda75, (q31_t)0x30078f86, (q31_t)0x2ff042bd, (q31_t)0x2fd8f41b, (q31_t)0x2fc1a3a0, + (q31_t)0x2faa514f, (q31_t)0x2f92fd26, + (q31_t)0x2f7ba729, (q31_t)0x2f644f56, (q31_t)0x2f4cf5b0, (q31_t)0x2f359a37, (q31_t)0x2f1e3ced, (q31_t)0x2f06ddd1, + (q31_t)0x2eef7ce5, (q31_t)0x2ed81a29, + (q31_t)0x2ec0b5a0, (q31_t)0x2ea94f49, (q31_t)0x2e91e725, (q31_t)0x2e7a7d36, (q31_t)0x2e63117c, (q31_t)0x2e4ba3f8, + (q31_t)0x2e3434ac, (q31_t)0x2e1cc397, + (q31_t)0x2e0550bb, (q31_t)0x2deddc19, (q31_t)0x2dd665b2, (q31_t)0x2dbeed86, (q31_t)0x2da77397, (q31_t)0x2d8ff7e5, + (q31_t)0x2d787a72, (q31_t)0x2d60fb3e, + (q31_t)0x2d497a4a, (q31_t)0x2d31f797, (q31_t)0x2d1a7325, (q31_t)0x2d02ecf7, (q31_t)0x2ceb650d, (q31_t)0x2cd3db67, + (q31_t)0x2cbc5006, (q31_t)0x2ca4c2ed, + (q31_t)0x2c8d341a, (q31_t)0x2c75a390, (q31_t)0x2c5e114f, (q31_t)0x2c467d58, (q31_t)0x2c2ee7ad, (q31_t)0x2c17504d, + (q31_t)0x2bffb73a, (q31_t)0x2be81c74, + (q31_t)0x2bd07ffe, (q31_t)0x2bb8e1d7, (q31_t)0x2ba14200, (q31_t)0x2b89a07b, (q31_t)0x2b71fd48, (q31_t)0x2b5a5868, + (q31_t)0x2b42b1dd, (q31_t)0x2b2b09a6, + (q31_t)0x2b135fc6, (q31_t)0x2afbb43c, (q31_t)0x2ae4070a, (q31_t)0x2acc5831, (q31_t)0x2ab4a7b1, (q31_t)0x2a9cf58c, + (q31_t)0x2a8541c3, (q31_t)0x2a6d8c55, + (q31_t)0x2a55d545, (q31_t)0x2a3e1c93, (q31_t)0x2a266240, (q31_t)0x2a0ea64d, (q31_t)0x29f6e8bb, (q31_t)0x29df298b, + (q31_t)0x29c768be, (q31_t)0x29afa654, + (q31_t)0x2997e24f, (q31_t)0x29801caf, (q31_t)0x29685576, (q31_t)0x29508ca4, (q31_t)0x2938c23a, (q31_t)0x2920f63a, + (q31_t)0x290928a3, (q31_t)0x28f15978, + (q31_t)0x28d988b8, (q31_t)0x28c1b666, (q31_t)0x28a9e281, (q31_t)0x28920d0a, (q31_t)0x287a3604, (q31_t)0x28625d6d, + (q31_t)0x284a8349, (q31_t)0x2832a796, + (q31_t)0x281aca57, (q31_t)0x2802eb8c, (q31_t)0x27eb0b36, (q31_t)0x27d32956, (q31_t)0x27bb45ed, (q31_t)0x27a360fc, + (q31_t)0x278b7a84, (q31_t)0x27739285, + (q31_t)0x275ba901, (q31_t)0x2743bdf9, (q31_t)0x272bd16d, (q31_t)0x2713e35f, (q31_t)0x26fbf3ce, (q31_t)0x26e402bd, + (q31_t)0x26cc102d, (q31_t)0x26b41c1d, + (q31_t)0x269c268f, (q31_t)0x26842f84, (q31_t)0x266c36fe, (q31_t)0x26543cfb, (q31_t)0x263c417f, (q31_t)0x26244489, + (q31_t)0x260c461b, (q31_t)0x25f44635, + (q31_t)0x25dc44d9, (q31_t)0x25c44207, (q31_t)0x25ac3dc0, (q31_t)0x25943806, (q31_t)0x257c30d8, (q31_t)0x25642839, + (q31_t)0x254c1e28, (q31_t)0x253412a8, + (q31_t)0x251c05b8, (q31_t)0x2503f75a, (q31_t)0x24ebe78f, (q31_t)0x24d3d657, (q31_t)0x24bbc3b4, (q31_t)0x24a3afa6, + (q31_t)0x248b9a2f, (q31_t)0x2473834f, + (q31_t)0x245b6b07, (q31_t)0x24435158, (q31_t)0x242b3644, (q31_t)0x241319ca, (q31_t)0x23fafbec, (q31_t)0x23e2dcac, + (q31_t)0x23cabc09, (q31_t)0x23b29a05, + (q31_t)0x239a76a0, (q31_t)0x238251dd, (q31_t)0x236a2bba, (q31_t)0x2352043b, (q31_t)0x2339db5e, (q31_t)0x2321b126, + (q31_t)0x23098593, (q31_t)0x22f158a7, + (q31_t)0x22d92a61, (q31_t)0x22c0fac4, (q31_t)0x22a8c9cf, (q31_t)0x22909785, (q31_t)0x227863e5, (q31_t)0x22602ef1, + (q31_t)0x2247f8aa, (q31_t)0x222fc111, + (q31_t)0x22178826, (q31_t)0x21ff4dea, (q31_t)0x21e71260, (q31_t)0x21ced586, (q31_t)0x21b6975f, (q31_t)0x219e57eb, + (q31_t)0x2186172b, (q31_t)0x216dd521, + (q31_t)0x215591cc, (q31_t)0x213d4d2f, (q31_t)0x21250749, (q31_t)0x210cc01d, (q31_t)0x20f477aa, (q31_t)0x20dc2df2, + (q31_t)0x20c3e2f5, (q31_t)0x20ab96b5, + (q31_t)0x20934933, (q31_t)0x207afa6f, (q31_t)0x2062aa6b, (q31_t)0x204a5927, (q31_t)0x203206a4, (q31_t)0x2019b2e4, + (q31_t)0x20015de7, (q31_t)0x1fe907ae, + (q31_t)0x1fd0b03a, (q31_t)0x1fb8578b, (q31_t)0x1f9ffda4, (q31_t)0x1f87a285, (q31_t)0x1f6f462f, (q31_t)0x1f56e8a2, + (q31_t)0x1f3e89e0, (q31_t)0x1f2629ea, + (q31_t)0x1f0dc8c0, (q31_t)0x1ef56664, (q31_t)0x1edd02d6, (q31_t)0x1ec49e17, (q31_t)0x1eac3829, (q31_t)0x1e93d10c, + (q31_t)0x1e7b68c2, (q31_t)0x1e62ff4a, + (q31_t)0x1e4a94a7, (q31_t)0x1e3228d9, (q31_t)0x1e19bbe0, (q31_t)0x1e014dbf, (q31_t)0x1de8de75, (q31_t)0x1dd06e04, + (q31_t)0x1db7fc6d, (q31_t)0x1d9f89b1, + (q31_t)0x1d8715d0, (q31_t)0x1d6ea0cc, (q31_t)0x1d562aa6, (q31_t)0x1d3db35e, (q31_t)0x1d253af5, (q31_t)0x1d0cc16c, + (q31_t)0x1cf446c5, (q31_t)0x1cdbcb00, + (q31_t)0x1cc34e1f, (q31_t)0x1caad021, (q31_t)0x1c925109, (q31_t)0x1c79d0d6, (q31_t)0x1c614f8b, (q31_t)0x1c48cd27, + (q31_t)0x1c3049ac, (q31_t)0x1c17c51b, + (q31_t)0x1bff3f75, (q31_t)0x1be6b8ba, (q31_t)0x1bce30ec, (q31_t)0x1bb5a80c, (q31_t)0x1b9d1e1a, (q31_t)0x1b849317, + (q31_t)0x1b6c0705, (q31_t)0x1b5379e5, + (q31_t)0x1b3aebb6, (q31_t)0x1b225c7b, (q31_t)0x1b09cc34, (q31_t)0x1af13ae3, (q31_t)0x1ad8a887, (q31_t)0x1ac01522, + (q31_t)0x1aa780b6, (q31_t)0x1a8eeb42, + (q31_t)0x1a7654c8, (q31_t)0x1a5dbd49, (q31_t)0x1a4524c6, (q31_t)0x1a2c8b3f, (q31_t)0x1a13f0b6, (q31_t)0x19fb552c, + (q31_t)0x19e2b8a2, (q31_t)0x19ca1b17, + (q31_t)0x19b17c8f, (q31_t)0x1998dd09, (q31_t)0x19803c86, (q31_t)0x19679b07, (q31_t)0x194ef88e, (q31_t)0x1936551b, + (q31_t)0x191db0af, (q31_t)0x19050b4b, + (q31_t)0x18ec64f0, (q31_t)0x18d3bda0, (q31_t)0x18bb155a, (q31_t)0x18a26c20, (q31_t)0x1889c1f3, (q31_t)0x187116d4, + (q31_t)0x18586ac3, (q31_t)0x183fbdc3, + (q31_t)0x18270fd3, (q31_t)0x180e60f4, (q31_t)0x17f5b129, (q31_t)0x17dd0070, (q31_t)0x17c44ecd, (q31_t)0x17ab9c3e, + (q31_t)0x1792e8c6, (q31_t)0x177a3466, + (q31_t)0x17617f1d, (q31_t)0x1748c8ee, (q31_t)0x173011d9, (q31_t)0x171759df, (q31_t)0x16fea102, (q31_t)0x16e5e741, + (q31_t)0x16cd2c9f, (q31_t)0x16b4711b, + (q31_t)0x169bb4b7, (q31_t)0x1682f774, (q31_t)0x166a3953, (q31_t)0x16517a55, (q31_t)0x1638ba7a, (q31_t)0x161ff9c4, + (q31_t)0x16073834, (q31_t)0x15ee75cb, + (q31_t)0x15d5b288, (q31_t)0x15bcee6f, (q31_t)0x15a4297f, (q31_t)0x158b63b9, (q31_t)0x15729d1f, (q31_t)0x1559d5b1, + (q31_t)0x15410d70, (q31_t)0x1528445d, + (q31_t)0x150f7a7a, (q31_t)0x14f6afc7, (q31_t)0x14dde445, (q31_t)0x14c517f4, (q31_t)0x14ac4ad7, (q31_t)0x14937cee, + (q31_t)0x147aae3a, (q31_t)0x1461debc, + (q31_t)0x14490e74, (q31_t)0x14303d65, (q31_t)0x14176b8e, (q31_t)0x13fe98f1, (q31_t)0x13e5c58e, (q31_t)0x13ccf167, + (q31_t)0x13b41c7d, (q31_t)0x139b46d0, + (q31_t)0x13827062, (q31_t)0x13699933, (q31_t)0x1350c144, (q31_t)0x1337e897, (q31_t)0x131f0f2c, (q31_t)0x13063505, + (q31_t)0x12ed5a21, (q31_t)0x12d47e83, + (q31_t)0x12bba22b, (q31_t)0x12a2c51b, (q31_t)0x1289e752, (q31_t)0x127108d2, (q31_t)0x1258299c, (q31_t)0x123f49b2, + (q31_t)0x12266913, (q31_t)0x120d87c1, + (q31_t)0x11f4a5bd, (q31_t)0x11dbc307, (q31_t)0x11c2dfa2, (q31_t)0x11a9fb8d, (q31_t)0x119116c9, (q31_t)0x11783159, + (q31_t)0x115f4b3c, (q31_t)0x11466473, + (q31_t)0x112d7d00, (q31_t)0x111494e4, (q31_t)0x10fbac1e, (q31_t)0x10e2c2b2, (q31_t)0x10c9d89e, (q31_t)0x10b0ede5, + (q31_t)0x10980287, (q31_t)0x107f1686, + (q31_t)0x106629e1, (q31_t)0x104d3c9b, (q31_t)0x10344eb4, (q31_t)0x101b602d, (q31_t)0x10027107, (q31_t)0xfe98143, + (q31_t)0xfd090e1, (q31_t)0xfb79fe4, + (q31_t)0xf9eae4c, (q31_t)0xf85bc19, (q31_t)0xf6cc94e, (q31_t)0xf53d5ea, (q31_t)0xf3ae1ee, (q31_t)0xf21ed5d, (q31_t)0xf08f836, + (q31_t)0xef0027b, + (q31_t)0xed70c2c, (q31_t)0xebe154b, (q31_t)0xea51dd8, (q31_t)0xe8c25d5, (q31_t)0xe732d42, (q31_t)0xe5a3421, (q31_t)0xe413a72, + (q31_t)0xe284036, + (q31_t)0xe0f456f, (q31_t)0xdf64a1c, (q31_t)0xddd4e40, (q31_t)0xdc451dc, (q31_t)0xdab54ef, (q31_t)0xd92577b, (q31_t)0xd795982, + (q31_t)0xd605b03, + (q31_t)0xd475c00, (q31_t)0xd2e5c7b, (q31_t)0xd155c73, (q31_t)0xcfc5bea, (q31_t)0xce35ae1, (q31_t)0xcca5959, (q31_t)0xcb15752, + (q31_t)0xc9854cf, + (q31_t)0xc7f51cf, (q31_t)0xc664e53, (q31_t)0xc4d4a5d, (q31_t)0xc3445ee, (q31_t)0xc1b4107, (q31_t)0xc023ba7, (q31_t)0xbe935d2, + (q31_t)0xbd02f87, + (q31_t)0xbb728c7, (q31_t)0xb9e2193, (q31_t)0xb8519ed, (q31_t)0xb6c11d5, (q31_t)0xb53094d, (q31_t)0xb3a0055, (q31_t)0xb20f6ee, + (q31_t)0xb07ed19, + (q31_t)0xaeee2d7, (q31_t)0xad5d829, (q31_t)0xabccd11, (q31_t)0xaa3c18e, (q31_t)0xa8ab5a2, (q31_t)0xa71a94f, (q31_t)0xa589c94, + (q31_t)0xa3f8f73, + (q31_t)0xa2681ed, (q31_t)0xa0d7403, (q31_t)0x9f465b5, (q31_t)0x9db5706, (q31_t)0x9c247f5, (q31_t)0x9a93884, (q31_t)0x99028b3, + (q31_t)0x9771884, + (q31_t)0x95e07f8, (q31_t)0x944f70f, (q31_t)0x92be5ca, (q31_t)0x912d42c, (q31_t)0x8f9c233, (q31_t)0x8e0afe2, (q31_t)0x8c79d3a, + (q31_t)0x8ae8a3a, + (q31_t)0x89576e5, (q31_t)0x87c633c, (q31_t)0x8634f3e, (q31_t)0x84a3aee, (q31_t)0x831264c, (q31_t)0x8181159, (q31_t)0x7fefc16, + (q31_t)0x7e5e685, + (q31_t)0x7ccd0a5, (q31_t)0x7b3ba78, (q31_t)0x79aa400, (q31_t)0x7818d3c, (q31_t)0x768762e, (q31_t)0x74f5ed7, (q31_t)0x7364738, + (q31_t)0x71d2f52, + (q31_t)0x7041726, (q31_t)0x6eafeb4, (q31_t)0x6d1e5fe, (q31_t)0x6b8cd05, (q31_t)0x69fb3c9, (q31_t)0x6869a4c, (q31_t)0x66d808f, + (q31_t)0x6546692, + (q31_t)0x63b4c57, (q31_t)0x62231de, (q31_t)0x6091729, (q31_t)0x5effc38, (q31_t)0x5d6e10c, (q31_t)0x5bdc5a7, (q31_t)0x5a4aa09, + (q31_t)0x58b8e34, + (q31_t)0x5727228, (q31_t)0x55955e6, (q31_t)0x540396f, (q31_t)0x5271cc4, (q31_t)0x50dffe7, (q31_t)0x4f4e2d8, (q31_t)0x4dbc597, + (q31_t)0x4c2a827, + (q31_t)0x4a98a88, (q31_t)0x4906cbb, (q31_t)0x4774ec1, (q31_t)0x45e309a, (q31_t)0x4451249, (q31_t)0x42bf3cd, (q31_t)0x412d528, + (q31_t)0x3f9b65b, + (q31_t)0x3e09767, (q31_t)0x3c7784d, (q31_t)0x3ae590d, (q31_t)0x39539a9, (q31_t)0x37c1a22, (q31_t)0x362fa78, (q31_t)0x349daac, + (q31_t)0x330bac1, + (q31_t)0x3179ab5, (q31_t)0x2fe7a8c, (q31_t)0x2e55a44, (q31_t)0x2cc39e1, (q31_t)0x2b31961, (q31_t)0x299f8c7, (q31_t)0x280d813, + (q31_t)0x267b747, + (q31_t)0x24e9662, (q31_t)0x2357567, (q31_t)0x21c5457, (q31_t)0x2033331, (q31_t)0x1ea11f7, (q31_t)0x1d0f0ab, (q31_t)0x1b7cf4d, + (q31_t)0x19eaddd, + (q31_t)0x1858c5e, (q31_t)0x16c6ad0, (q31_t)0x1534934, (q31_t)0x13a278a, (q31_t)0x12105d5, (q31_t)0x107e414, (q31_t)0xeec249, + (q31_t)0xd5a075, + (q31_t)0xbc7e99, (q31_t)0xa35cb5, (q31_t)0x8a3acb, (q31_t)0x7118dc, (q31_t)0x57f6e9, (q31_t)0x3ed4f2, (q31_t)0x25b2f8, + (q31_t)0xc90fe +}; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_8192) + const q31_t WeightsQ31_8192[16384] = { + (q31_t)0x7fffffff, (q31_t)0x00000000, (q31_t)0x7fffffd9, (q31_t)0xfff9b781, (q31_t)0x7fffff62, (q31_t)0xfff36f02, (q31_t)0x7ffffe9d, (q31_t)0xffed2684, + (q31_t)0x7ffffd88, (q31_t)0xffe6de05, (q31_t)0x7ffffc25, (q31_t)0xffe09586, (q31_t)0x7ffffa73, (q31_t)0xffda4d08, (q31_t)0x7ffff872, (q31_t)0xffd40489, + (q31_t)0x7ffff621, (q31_t)0xffcdbc0b, (q31_t)0x7ffff382, (q31_t)0xffc7738c, (q31_t)0x7ffff094, (q31_t)0xffc12b0e, (q31_t)0x7fffed57, (q31_t)0xffbae290, + (q31_t)0x7fffe9cb, (q31_t)0xffb49a12, (q31_t)0x7fffe5f0, (q31_t)0xffae5195, (q31_t)0x7fffe1c6, (q31_t)0xffa80917, (q31_t)0x7fffdd4d, (q31_t)0xffa1c09a, + (q31_t)0x7fffd886, (q31_t)0xff9b781d, (q31_t)0x7fffd36f, (q31_t)0xff952fa0, (q31_t)0x7fffce09, (q31_t)0xff8ee724, (q31_t)0x7fffc854, (q31_t)0xff889ea7, + (q31_t)0x7fffc251, (q31_t)0xff82562c, (q31_t)0x7fffbbfe, (q31_t)0xff7c0db0, (q31_t)0x7fffb55c, (q31_t)0xff75c535, (q31_t)0x7fffae6c, (q31_t)0xff6f7cba, + (q31_t)0x7fffa72c, (q31_t)0xff69343f, (q31_t)0x7fff9f9e, (q31_t)0xff62ebc5, (q31_t)0x7fff97c1, (q31_t)0xff5ca34b, (q31_t)0x7fff8f94, (q31_t)0xff565ad1, + (q31_t)0x7fff8719, (q31_t)0xff501258, (q31_t)0x7fff7e4f, (q31_t)0xff49c9df, (q31_t)0x7fff7536, (q31_t)0xff438167, (q31_t)0x7fff6bcd, (q31_t)0xff3d38ef, + (q31_t)0x7fff6216, (q31_t)0xff36f078, (q31_t)0x7fff5810, (q31_t)0xff30a801, (q31_t)0x7fff4dbb, (q31_t)0xff2a5f8b, (q31_t)0x7fff4317, (q31_t)0xff241715, + (q31_t)0x7fff3824, (q31_t)0xff1dcea0, (q31_t)0x7fff2ce2, (q31_t)0xff17862b, (q31_t)0x7fff2151, (q31_t)0xff113db7, (q31_t)0x7fff1572, (q31_t)0xff0af543, + (q31_t)0x7fff0943, (q31_t)0xff04acd0, (q31_t)0x7ffefcc5, (q31_t)0xfefe645e, (q31_t)0x7ffeeff8, (q31_t)0xfef81bec, (q31_t)0x7ffee2dd, (q31_t)0xfef1d37b, + (q31_t)0x7ffed572, (q31_t)0xfeeb8b0a, (q31_t)0x7ffec7b9, (q31_t)0xfee5429a, (q31_t)0x7ffeb9b0, (q31_t)0xfedefa2b, (q31_t)0x7ffeab59, (q31_t)0xfed8b1bd, + (q31_t)0x7ffe9cb2, (q31_t)0xfed2694f, (q31_t)0x7ffe8dbd, (q31_t)0xfecc20e2, (q31_t)0x7ffe7e79, (q31_t)0xfec5d876, (q31_t)0x7ffe6ee5, (q31_t)0xfebf900a, + (q31_t)0x7ffe5f03, (q31_t)0xfeb947a0, (q31_t)0x7ffe4ed2, (q31_t)0xfeb2ff36, (q31_t)0x7ffe3e52, (q31_t)0xfeacb6cc, (q31_t)0x7ffe2d83, (q31_t)0xfea66e64, + (q31_t)0x7ffe1c65, (q31_t)0xfea025fd, (q31_t)0x7ffe0af8, (q31_t)0xfe99dd96, (q31_t)0x7ffdf93c, (q31_t)0xfe939530, (q31_t)0x7ffde731, (q31_t)0xfe8d4ccb, + (q31_t)0x7ffdd4d7, (q31_t)0xfe870467, (q31_t)0x7ffdc22e, (q31_t)0xfe80bc04, (q31_t)0x7ffdaf37, (q31_t)0xfe7a73a2, (q31_t)0x7ffd9bf0, (q31_t)0xfe742b41, + (q31_t)0x7ffd885a, (q31_t)0xfe6de2e0, (q31_t)0x7ffd7476, (q31_t)0xfe679a81, (q31_t)0x7ffd6042, (q31_t)0xfe615223, (q31_t)0x7ffd4bc0, (q31_t)0xfe5b09c5, + (q31_t)0x7ffd36ee, (q31_t)0xfe54c169, (q31_t)0x7ffd21ce, (q31_t)0xfe4e790d, (q31_t)0x7ffd0c5f, (q31_t)0xfe4830b3, (q31_t)0x7ffcf6a0, (q31_t)0xfe41e85a, + (q31_t)0x7ffce093, (q31_t)0xfe3ba002, (q31_t)0x7ffcca37, (q31_t)0xfe3557ab, (q31_t)0x7ffcb38c, (q31_t)0xfe2f0f55, (q31_t)0x7ffc9c92, (q31_t)0xfe28c700, + (q31_t)0x7ffc8549, (q31_t)0xfe227eac, (q31_t)0x7ffc6db1, (q31_t)0xfe1c365a, (q31_t)0x7ffc55ca, (q31_t)0xfe15ee09, (q31_t)0x7ffc3d94, (q31_t)0xfe0fa5b8, + (q31_t)0x7ffc250f, (q31_t)0xfe095d69, (q31_t)0x7ffc0c3b, (q31_t)0xfe03151c, (q31_t)0x7ffbf319, (q31_t)0xfdfccccf, (q31_t)0x7ffbd9a7, (q31_t)0xfdf68484, + (q31_t)0x7ffbbfe6, (q31_t)0xfdf03c3a, (q31_t)0x7ffba5d7, (q31_t)0xfde9f3f1, (q31_t)0x7ffb8b78, (q31_t)0xfde3aba9, (q31_t)0x7ffb70cb, (q31_t)0xfddd6363, + (q31_t)0x7ffb55ce, (q31_t)0xfdd71b1e, (q31_t)0x7ffb3a83, (q31_t)0xfdd0d2db, (q31_t)0x7ffb1ee9, (q31_t)0xfdca8a99, (q31_t)0x7ffb0300, (q31_t)0xfdc44258, + (q31_t)0x7ffae6c7, (q31_t)0xfdbdfa18, (q31_t)0x7ffaca40, (q31_t)0xfdb7b1da, (q31_t)0x7ffaad6a, (q31_t)0xfdb1699e, (q31_t)0x7ffa9045, (q31_t)0xfdab2162, + (q31_t)0x7ffa72d1, (q31_t)0xfda4d929, (q31_t)0x7ffa550e, (q31_t)0xfd9e90f0, (q31_t)0x7ffa36fc, (q31_t)0xfd9848b9, (q31_t)0x7ffa189c, (q31_t)0xfd920084, + (q31_t)0x7ff9f9ec, (q31_t)0xfd8bb850, (q31_t)0x7ff9daed, (q31_t)0xfd85701e, (q31_t)0x7ff9bba0, (q31_t)0xfd7f27ed, (q31_t)0x7ff99c03, (q31_t)0xfd78dfbd, + (q31_t)0x7ff97c18, (q31_t)0xfd729790, (q31_t)0x7ff95bdd, (q31_t)0xfd6c4f64, (q31_t)0x7ff93b54, (q31_t)0xfd660739, (q31_t)0x7ff91a7b, (q31_t)0xfd5fbf10, + (q31_t)0x7ff8f954, (q31_t)0xfd5976e9, (q31_t)0x7ff8d7de, (q31_t)0xfd532ec3, (q31_t)0x7ff8b619, (q31_t)0xfd4ce69f, (q31_t)0x7ff89405, (q31_t)0xfd469e7c, + (q31_t)0x7ff871a2, (q31_t)0xfd40565c, (q31_t)0x7ff84ef0, (q31_t)0xfd3a0e3d, (q31_t)0x7ff82bef, (q31_t)0xfd33c61f, (q31_t)0x7ff8089f, (q31_t)0xfd2d7e04, + (q31_t)0x7ff7e500, (q31_t)0xfd2735ea, (q31_t)0x7ff7c113, (q31_t)0xfd20edd2, (q31_t)0x7ff79cd6, (q31_t)0xfd1aa5bc, (q31_t)0x7ff7784a, (q31_t)0xfd145da7, + (q31_t)0x7ff75370, (q31_t)0xfd0e1594, (q31_t)0x7ff72e46, (q31_t)0xfd07cd83, (q31_t)0x7ff708ce, (q31_t)0xfd018574, (q31_t)0x7ff6e307, (q31_t)0xfcfb3d67, + (q31_t)0x7ff6bcf0, (q31_t)0xfcf4f55c, (q31_t)0x7ff6968b, (q31_t)0xfceead52, (q31_t)0x7ff66fd7, (q31_t)0xfce8654b, (q31_t)0x7ff648d4, (q31_t)0xfce21d45, + (q31_t)0x7ff62182, (q31_t)0xfcdbd541, (q31_t)0x7ff5f9e1, (q31_t)0xfcd58d3f, (q31_t)0x7ff5d1f1, (q31_t)0xfccf453f, (q31_t)0x7ff5a9b2, (q31_t)0xfcc8fd41, + (q31_t)0x7ff58125, (q31_t)0xfcc2b545, (q31_t)0x7ff55848, (q31_t)0xfcbc6d4c, (q31_t)0x7ff52f1d, (q31_t)0xfcb62554, (q31_t)0x7ff505a2, (q31_t)0xfcafdd5e, + (q31_t)0x7ff4dbd9, (q31_t)0xfca9956a, (q31_t)0x7ff4b1c0, (q31_t)0xfca34d78, (q31_t)0x7ff48759, (q31_t)0xfc9d0588, (q31_t)0x7ff45ca3, (q31_t)0xfc96bd9b, + (q31_t)0x7ff4319d, (q31_t)0xfc9075af, (q31_t)0x7ff40649, (q31_t)0xfc8a2dc6, (q31_t)0x7ff3daa6, (q31_t)0xfc83e5de, (q31_t)0x7ff3aeb4, (q31_t)0xfc7d9df9, + (q31_t)0x7ff38274, (q31_t)0xfc775616, (q31_t)0x7ff355e4, (q31_t)0xfc710e36, (q31_t)0x7ff32905, (q31_t)0xfc6ac657, (q31_t)0x7ff2fbd7, (q31_t)0xfc647e7b, + (q31_t)0x7ff2ce5b, (q31_t)0xfc5e36a0, (q31_t)0x7ff2a08f, (q31_t)0xfc57eec9, (q31_t)0x7ff27275, (q31_t)0xfc51a6f3, (q31_t)0x7ff2440b, (q31_t)0xfc4b5f20, + (q31_t)0x7ff21553, (q31_t)0xfc45174e, (q31_t)0x7ff1e64c, (q31_t)0xfc3ecf80, (q31_t)0x7ff1b6f6, (q31_t)0xfc3887b3, (q31_t)0x7ff18751, (q31_t)0xfc323fe9, + (q31_t)0x7ff1575d, (q31_t)0xfc2bf821, (q31_t)0x7ff1271a, (q31_t)0xfc25b05c, (q31_t)0x7ff0f688, (q31_t)0xfc1f6899, (q31_t)0x7ff0c5a7, (q31_t)0xfc1920d8, + (q31_t)0x7ff09478, (q31_t)0xfc12d91a, (q31_t)0x7ff062f9, (q31_t)0xfc0c915e, (q31_t)0x7ff0312c, (q31_t)0xfc0649a5, (q31_t)0x7fefff0f, (q31_t)0xfc0001ee, + (q31_t)0x7fefcca4, (q31_t)0xfbf9ba39, (q31_t)0x7fef99ea, (q31_t)0xfbf37287, (q31_t)0x7fef66e1, (q31_t)0xfbed2ad8, (q31_t)0x7fef3388, (q31_t)0xfbe6e32b, + (q31_t)0x7feeffe1, (q31_t)0xfbe09b80, (q31_t)0x7feecbec, (q31_t)0xfbda53d8, (q31_t)0x7fee97a7, (q31_t)0xfbd40c33, (q31_t)0x7fee6313, (q31_t)0xfbcdc490, + (q31_t)0x7fee2e30, (q31_t)0xfbc77cf0, (q31_t)0x7fedf8ff, (q31_t)0xfbc13552, (q31_t)0x7fedc37e, (q31_t)0xfbbaedb7, (q31_t)0x7fed8daf, (q31_t)0xfbb4a61f, + (q31_t)0x7fed5791, (q31_t)0xfbae5e89, (q31_t)0x7fed2123, (q31_t)0xfba816f6, (q31_t)0x7fecea67, (q31_t)0xfba1cf66, (q31_t)0x7fecb35c, (q31_t)0xfb9b87d8, + (q31_t)0x7fec7c02, (q31_t)0xfb95404d, (q31_t)0x7fec4459, (q31_t)0xfb8ef8c5, (q31_t)0x7fec0c62, (q31_t)0xfb88b13f, (q31_t)0x7febd41b, (q31_t)0xfb8269bd, + (q31_t)0x7feb9b85, (q31_t)0xfb7c223d, (q31_t)0x7feb62a1, (q31_t)0xfb75dac0, (q31_t)0x7feb296d, (q31_t)0xfb6f9345, (q31_t)0x7feaefeb, (q31_t)0xfb694bce, + (q31_t)0x7feab61a, (q31_t)0xfb630459, (q31_t)0x7fea7bfa, (q31_t)0xfb5cbce7, (q31_t)0x7fea418b, (q31_t)0xfb567578, (q31_t)0x7fea06cd, (q31_t)0xfb502e0c, + (q31_t)0x7fe9cbc0, (q31_t)0xfb49e6a3, (q31_t)0x7fe99064, (q31_t)0xfb439f3c, (q31_t)0x7fe954ba, (q31_t)0xfb3d57d9, (q31_t)0x7fe918c0, (q31_t)0xfb371078, + (q31_t)0x7fe8dc78, (q31_t)0xfb30c91b, (q31_t)0x7fe89fe0, (q31_t)0xfb2a81c0, (q31_t)0x7fe862fa, (q31_t)0xfb243a69, (q31_t)0x7fe825c5, (q31_t)0xfb1df314, + (q31_t)0x7fe7e841, (q31_t)0xfb17abc2, (q31_t)0x7fe7aa6e, (q31_t)0xfb116474, (q31_t)0x7fe76c4c, (q31_t)0xfb0b1d28, (q31_t)0x7fe72ddb, (q31_t)0xfb04d5e0, + (q31_t)0x7fe6ef1c, (q31_t)0xfafe8e9b, (q31_t)0x7fe6b00d, (q31_t)0xfaf84758, (q31_t)0x7fe670b0, (q31_t)0xfaf20019, (q31_t)0x7fe63103, (q31_t)0xfaebb8dd, + (q31_t)0x7fe5f108, (q31_t)0xfae571a4, (q31_t)0x7fe5b0be, (q31_t)0xfadf2a6e, (q31_t)0x7fe57025, (q31_t)0xfad8e33c, (q31_t)0x7fe52f3d, (q31_t)0xfad29c0c, + (q31_t)0x7fe4ee06, (q31_t)0xfacc54e0, (q31_t)0x7fe4ac81, (q31_t)0xfac60db7, (q31_t)0x7fe46aac, (q31_t)0xfabfc691, (q31_t)0x7fe42889, (q31_t)0xfab97f6e, + (q31_t)0x7fe3e616, (q31_t)0xfab3384f, (q31_t)0x7fe3a355, (q31_t)0xfaacf133, (q31_t)0x7fe36045, (q31_t)0xfaa6aa1a, (q31_t)0x7fe31ce6, (q31_t)0xfaa06305, + (q31_t)0x7fe2d938, (q31_t)0xfa9a1bf3, (q31_t)0x7fe2953b, (q31_t)0xfa93d4e4, (q31_t)0x7fe250ef, (q31_t)0xfa8d8dd8, (q31_t)0x7fe20c55, (q31_t)0xfa8746d0, + (q31_t)0x7fe1c76b, (q31_t)0xfa80ffcb, (q31_t)0x7fe18233, (q31_t)0xfa7ab8ca, (q31_t)0x7fe13cac, (q31_t)0xfa7471cc, (q31_t)0x7fe0f6d6, (q31_t)0xfa6e2ad1, + (q31_t)0x7fe0b0b1, (q31_t)0xfa67e3da, (q31_t)0x7fe06a3d, (q31_t)0xfa619ce7, (q31_t)0x7fe0237a, (q31_t)0xfa5b55f7, (q31_t)0x7fdfdc69, (q31_t)0xfa550f0a, + (q31_t)0x7fdf9508, (q31_t)0xfa4ec821, (q31_t)0x7fdf4d59, (q31_t)0xfa48813b, (q31_t)0x7fdf055a, (q31_t)0xfa423a59, (q31_t)0x7fdebd0d, (q31_t)0xfa3bf37a, + (q31_t)0x7fde7471, (q31_t)0xfa35ac9f, (q31_t)0x7fde2b86, (q31_t)0xfa2f65c8, (q31_t)0x7fdde24d, (q31_t)0xfa291ef4, (q31_t)0x7fdd98c4, (q31_t)0xfa22d823, + (q31_t)0x7fdd4eec, (q31_t)0xfa1c9157, (q31_t)0x7fdd04c6, (q31_t)0xfa164a8e, (q31_t)0x7fdcba51, (q31_t)0xfa1003c8, (q31_t)0x7fdc6f8d, (q31_t)0xfa09bd06, + (q31_t)0x7fdc247a, (q31_t)0xfa037648, (q31_t)0x7fdbd918, (q31_t)0xf9fd2f8e, (q31_t)0x7fdb8d67, (q31_t)0xf9f6e8d7, (q31_t)0x7fdb4167, (q31_t)0xf9f0a224, + (q31_t)0x7fdaf519, (q31_t)0xf9ea5b75, (q31_t)0x7fdaa87c, (q31_t)0xf9e414ca, (q31_t)0x7fda5b8f, (q31_t)0xf9ddce22, (q31_t)0x7fda0e54, (q31_t)0xf9d7877e, + (q31_t)0x7fd9c0ca, (q31_t)0xf9d140de, (q31_t)0x7fd972f2, (q31_t)0xf9cafa42, (q31_t)0x7fd924ca, (q31_t)0xf9c4b3a9, (q31_t)0x7fd8d653, (q31_t)0xf9be6d15, + (q31_t)0x7fd8878e, (q31_t)0xf9b82684, (q31_t)0x7fd8387a, (q31_t)0xf9b1dff7, (q31_t)0x7fd7e917, (q31_t)0xf9ab996e, (q31_t)0x7fd79965, (q31_t)0xf9a552e9, + (q31_t)0x7fd74964, (q31_t)0xf99f0c68, (q31_t)0x7fd6f914, (q31_t)0xf998c5ea, (q31_t)0x7fd6a875, (q31_t)0xf9927f71, (q31_t)0x7fd65788, (q31_t)0xf98c38fc, + (q31_t)0x7fd6064c, (q31_t)0xf985f28a, (q31_t)0x7fd5b4c1, (q31_t)0xf97fac1d, (q31_t)0x7fd562e7, (q31_t)0xf97965b4, (q31_t)0x7fd510be, (q31_t)0xf9731f4e, + (q31_t)0x7fd4be46, (q31_t)0xf96cd8ed, (q31_t)0x7fd46b80, (q31_t)0xf9669290, (q31_t)0x7fd4186a, (q31_t)0xf9604c37, (q31_t)0x7fd3c506, (q31_t)0xf95a05e2, + (q31_t)0x7fd37153, (q31_t)0xf953bf91, (q31_t)0x7fd31d51, (q31_t)0xf94d7944, (q31_t)0x7fd2c900, (q31_t)0xf94732fb, (q31_t)0x7fd27460, (q31_t)0xf940ecb7, + (q31_t)0x7fd21f72, (q31_t)0xf93aa676, (q31_t)0x7fd1ca35, (q31_t)0xf934603a, (q31_t)0x7fd174a8, (q31_t)0xf92e1a02, (q31_t)0x7fd11ecd, (q31_t)0xf927d3ce, + (q31_t)0x7fd0c8a3, (q31_t)0xf9218d9e, (q31_t)0x7fd0722b, (q31_t)0xf91b4773, (q31_t)0x7fd01b63, (q31_t)0xf915014c, (q31_t)0x7fcfc44d, (q31_t)0xf90ebb29, + (q31_t)0x7fcf6ce8, (q31_t)0xf908750a, (q31_t)0x7fcf1533, (q31_t)0xf9022ef0, (q31_t)0x7fcebd31, (q31_t)0xf8fbe8da, (q31_t)0x7fce64df, (q31_t)0xf8f5a2c9, + (q31_t)0x7fce0c3e, (q31_t)0xf8ef5cbb, (q31_t)0x7fcdb34f, (q31_t)0xf8e916b2, (q31_t)0x7fcd5a11, (q31_t)0xf8e2d0ae, (q31_t)0x7fcd0083, (q31_t)0xf8dc8aae, + (q31_t)0x7fcca6a7, (q31_t)0xf8d644b2, (q31_t)0x7fcc4c7d, (q31_t)0xf8cffebb, (q31_t)0x7fcbf203, (q31_t)0xf8c9b8c8, (q31_t)0x7fcb973b, (q31_t)0xf8c372d9, + (q31_t)0x7fcb3c23, (q31_t)0xf8bd2cef, (q31_t)0x7fcae0bd, (q31_t)0xf8b6e70a, (q31_t)0x7fca8508, (q31_t)0xf8b0a129, (q31_t)0x7fca2905, (q31_t)0xf8aa5b4c, + (q31_t)0x7fc9ccb2, (q31_t)0xf8a41574, (q31_t)0x7fc97011, (q31_t)0xf89dcfa1, (q31_t)0x7fc91320, (q31_t)0xf89789d2, (q31_t)0x7fc8b5e1, (q31_t)0xf8914407, + (q31_t)0x7fc85854, (q31_t)0xf88afe42, (q31_t)0x7fc7fa77, (q31_t)0xf884b880, (q31_t)0x7fc79c4b, (q31_t)0xf87e72c4, (q31_t)0x7fc73dd1, (q31_t)0xf8782d0c, + (q31_t)0x7fc6df08, (q31_t)0xf871e759, (q31_t)0x7fc67ff0, (q31_t)0xf86ba1aa, (q31_t)0x7fc62089, (q31_t)0xf8655c00, (q31_t)0x7fc5c0d3, (q31_t)0xf85f165b, + (q31_t)0x7fc560cf, (q31_t)0xf858d0bb, (q31_t)0x7fc5007c, (q31_t)0xf8528b1f, (q31_t)0x7fc49fda, (q31_t)0xf84c4588, (q31_t)0x7fc43ee9, (q31_t)0xf845fff5, + (q31_t)0x7fc3dda9, (q31_t)0xf83fba68, (q31_t)0x7fc37c1b, (q31_t)0xf83974df, (q31_t)0x7fc31a3d, (q31_t)0xf8332f5b, (q31_t)0x7fc2b811, (q31_t)0xf82ce9dc, + (q31_t)0x7fc25596, (q31_t)0xf826a462, (q31_t)0x7fc1f2cc, (q31_t)0xf8205eec, (q31_t)0x7fc18fb4, (q31_t)0xf81a197b, (q31_t)0x7fc12c4d, (q31_t)0xf813d410, + (q31_t)0x7fc0c896, (q31_t)0xf80d8ea9, (q31_t)0x7fc06491, (q31_t)0xf8074947, (q31_t)0x7fc0003e, (q31_t)0xf80103ea, (q31_t)0x7fbf9b9b, (q31_t)0xf7fabe92, + (q31_t)0x7fbf36aa, (q31_t)0xf7f4793e, (q31_t)0x7fbed16a, (q31_t)0xf7ee33f0, (q31_t)0x7fbe6bdb, (q31_t)0xf7e7eea7, (q31_t)0x7fbe05fd, (q31_t)0xf7e1a963, + (q31_t)0x7fbd9fd0, (q31_t)0xf7db6423, (q31_t)0x7fbd3955, (q31_t)0xf7d51ee9, (q31_t)0x7fbcd28b, (q31_t)0xf7ced9b4, (q31_t)0x7fbc6b72, (q31_t)0xf7c89484, + (q31_t)0x7fbc040a, (q31_t)0xf7c24f59, (q31_t)0x7fbb9c53, (q31_t)0xf7bc0a33, (q31_t)0x7fbb344e, (q31_t)0xf7b5c512, (q31_t)0x7fbacbfa, (q31_t)0xf7af7ff6, + (q31_t)0x7fba6357, (q31_t)0xf7a93ae0, (q31_t)0x7fb9fa65, (q31_t)0xf7a2f5ce, (q31_t)0x7fb99125, (q31_t)0xf79cb0c2, (q31_t)0x7fb92796, (q31_t)0xf7966bbb, + (q31_t)0x7fb8bdb8, (q31_t)0xf79026b9, (q31_t)0x7fb8538b, (q31_t)0xf789e1bc, (q31_t)0x7fb7e90f, (q31_t)0xf7839cc4, (q31_t)0x7fb77e45, (q31_t)0xf77d57d2, + (q31_t)0x7fb7132b, (q31_t)0xf77712e5, (q31_t)0x7fb6a7c3, (q31_t)0xf770cdfd, (q31_t)0x7fb63c0d, (q31_t)0xf76a891b, (q31_t)0x7fb5d007, (q31_t)0xf764443d, + (q31_t)0x7fb563b3, (q31_t)0xf75dff66, (q31_t)0x7fb4f710, (q31_t)0xf757ba93, (q31_t)0x7fb48a1e, (q31_t)0xf75175c6, (q31_t)0x7fb41cdd, (q31_t)0xf74b30fe, + (q31_t)0x7fb3af4e, (q31_t)0xf744ec3b, (q31_t)0x7fb34170, (q31_t)0xf73ea77e, (q31_t)0x7fb2d343, (q31_t)0xf73862c6, (q31_t)0x7fb264c7, (q31_t)0xf7321e14, + (q31_t)0x7fb1f5fc, (q31_t)0xf72bd967, (q31_t)0x7fb186e3, (q31_t)0xf72594c0, (q31_t)0x7fb1177b, (q31_t)0xf71f501e, (q31_t)0x7fb0a7c4, (q31_t)0xf7190b81, + (q31_t)0x7fb037bf, (q31_t)0xf712c6ea, (q31_t)0x7fafc76a, (q31_t)0xf70c8259, (q31_t)0x7faf56c7, (q31_t)0xf7063dcd, (q31_t)0x7faee5d5, (q31_t)0xf6fff946, + (q31_t)0x7fae7495, (q31_t)0xf6f9b4c6, (q31_t)0x7fae0305, (q31_t)0xf6f3704a, (q31_t)0x7fad9127, (q31_t)0xf6ed2bd4, (q31_t)0x7fad1efa, (q31_t)0xf6e6e764, + (q31_t)0x7facac7f, (q31_t)0xf6e0a2fa, (q31_t)0x7fac39b4, (q31_t)0xf6da5e95, (q31_t)0x7fabc69b, (q31_t)0xf6d41a36, (q31_t)0x7fab5333, (q31_t)0xf6cdd5dc, + (q31_t)0x7faadf7c, (q31_t)0xf6c79188, (q31_t)0x7faa6b77, (q31_t)0xf6c14d3a, (q31_t)0x7fa9f723, (q31_t)0xf6bb08f1, (q31_t)0x7fa98280, (q31_t)0xf6b4c4ae, + (q31_t)0x7fa90d8e, (q31_t)0xf6ae8071, (q31_t)0x7fa8984e, (q31_t)0xf6a83c3a, (q31_t)0x7fa822bf, (q31_t)0xf6a1f808, (q31_t)0x7fa7ace1, (q31_t)0xf69bb3dd, + (q31_t)0x7fa736b4, (q31_t)0xf6956fb7, (q31_t)0x7fa6c039, (q31_t)0xf68f2b96, (q31_t)0x7fa6496e, (q31_t)0xf688e77c, (q31_t)0x7fa5d256, (q31_t)0xf682a367, + (q31_t)0x7fa55aee, (q31_t)0xf67c5f59, (q31_t)0x7fa4e338, (q31_t)0xf6761b50, (q31_t)0x7fa46b32, (q31_t)0xf66fd74d, (q31_t)0x7fa3f2df, (q31_t)0xf6699350, + (q31_t)0x7fa37a3c, (q31_t)0xf6634f59, (q31_t)0x7fa3014b, (q31_t)0xf65d0b68, (q31_t)0x7fa2880b, (q31_t)0xf656c77c, (q31_t)0x7fa20e7c, (q31_t)0xf6508397, + (q31_t)0x7fa1949e, (q31_t)0xf64a3fb8, (q31_t)0x7fa11a72, (q31_t)0xf643fbdf, (q31_t)0x7fa09ff7, (q31_t)0xf63db80b, (q31_t)0x7fa0252e, (q31_t)0xf637743e, + (q31_t)0x7f9faa15, (q31_t)0xf6313077, (q31_t)0x7f9f2eae, (q31_t)0xf62aecb5, (q31_t)0x7f9eb2f8, (q31_t)0xf624a8fa, (q31_t)0x7f9e36f4, (q31_t)0xf61e6545, + (q31_t)0x7f9dbaa0, (q31_t)0xf6182196, (q31_t)0x7f9d3dfe, (q31_t)0xf611dded, (q31_t)0x7f9cc10d, (q31_t)0xf60b9a4b, (q31_t)0x7f9c43ce, (q31_t)0xf60556ae, + (q31_t)0x7f9bc640, (q31_t)0xf5ff1318, (q31_t)0x7f9b4863, (q31_t)0xf5f8cf87, (q31_t)0x7f9aca37, (q31_t)0xf5f28bfd, (q31_t)0x7f9a4bbd, (q31_t)0xf5ec4879, + (q31_t)0x7f99ccf4, (q31_t)0xf5e604fc, (q31_t)0x7f994ddc, (q31_t)0xf5dfc184, (q31_t)0x7f98ce76, (q31_t)0xf5d97e13, (q31_t)0x7f984ec1, (q31_t)0xf5d33aa8, + (q31_t)0x7f97cebd, (q31_t)0xf5ccf743, (q31_t)0x7f974e6a, (q31_t)0xf5c6b3e5, (q31_t)0x7f96cdc9, (q31_t)0xf5c0708d, (q31_t)0x7f964cd9, (q31_t)0xf5ba2d3b, + (q31_t)0x7f95cb9a, (q31_t)0xf5b3e9f0, (q31_t)0x7f954a0d, (q31_t)0xf5ada6ab, (q31_t)0x7f94c831, (q31_t)0xf5a7636c, (q31_t)0x7f944606, (q31_t)0xf5a12034, + (q31_t)0x7f93c38c, (q31_t)0xf59add02, (q31_t)0x7f9340c4, (q31_t)0xf59499d6, (q31_t)0x7f92bdad, (q31_t)0xf58e56b1, (q31_t)0x7f923a48, (q31_t)0xf5881393, + (q31_t)0x7f91b694, (q31_t)0xf581d07b, (q31_t)0x7f913291, (q31_t)0xf57b8d69, (q31_t)0x7f90ae3f, (q31_t)0xf5754a5e, (q31_t)0x7f90299f, (q31_t)0xf56f0759, + (q31_t)0x7f8fa4b0, (q31_t)0xf568c45b, (q31_t)0x7f8f1f72, (q31_t)0xf5628163, (q31_t)0x7f8e99e6, (q31_t)0xf55c3e72, (q31_t)0x7f8e140a, (q31_t)0xf555fb88, + (q31_t)0x7f8d8de1, (q31_t)0xf54fb8a4, (q31_t)0x7f8d0768, (q31_t)0xf54975c6, (q31_t)0x7f8c80a1, (q31_t)0xf54332ef, (q31_t)0x7f8bf98b, (q31_t)0xf53cf01f, + (q31_t)0x7f8b7227, (q31_t)0xf536ad56, (q31_t)0x7f8aea74, (q31_t)0xf5306a93, (q31_t)0x7f8a6272, (q31_t)0xf52a27d7, (q31_t)0x7f89da21, (q31_t)0xf523e521, + (q31_t)0x7f895182, (q31_t)0xf51da273, (q31_t)0x7f88c894, (q31_t)0xf5175fca, (q31_t)0x7f883f58, (q31_t)0xf5111d29, (q31_t)0x7f87b5cd, (q31_t)0xf50ada8f, + (q31_t)0x7f872bf3, (q31_t)0xf50497fb, (q31_t)0x7f86a1ca, (q31_t)0xf4fe556e, (q31_t)0x7f861753, (q31_t)0xf4f812e7, (q31_t)0x7f858c8d, (q31_t)0xf4f1d068, + (q31_t)0x7f850179, (q31_t)0xf4eb8def, (q31_t)0x7f847616, (q31_t)0xf4e54b7d, (q31_t)0x7f83ea64, (q31_t)0xf4df0912, (q31_t)0x7f835e64, (q31_t)0xf4d8c6ae, + (q31_t)0x7f82d214, (q31_t)0xf4d28451, (q31_t)0x7f824577, (q31_t)0xf4cc41fb, (q31_t)0x7f81b88a, (q31_t)0xf4c5ffab, (q31_t)0x7f812b4f, (q31_t)0xf4bfbd63, + (q31_t)0x7f809dc5, (q31_t)0xf4b97b21, (q31_t)0x7f800fed, (q31_t)0xf4b338e7, (q31_t)0x7f7f81c6, (q31_t)0xf4acf6b3, (q31_t)0x7f7ef350, (q31_t)0xf4a6b486, + (q31_t)0x7f7e648c, (q31_t)0xf4a07261, (q31_t)0x7f7dd579, (q31_t)0xf49a3042, (q31_t)0x7f7d4617, (q31_t)0xf493ee2b, (q31_t)0x7f7cb667, (q31_t)0xf48dac1a, + (q31_t)0x7f7c2668, (q31_t)0xf4876a10, (q31_t)0x7f7b961b, (q31_t)0xf481280e, (q31_t)0x7f7b057e, (q31_t)0xf47ae613, (q31_t)0x7f7a7494, (q31_t)0xf474a41f, + (q31_t)0x7f79e35a, (q31_t)0xf46e6231, (q31_t)0x7f7951d2, (q31_t)0xf468204b, (q31_t)0x7f78bffb, (q31_t)0xf461de6d, (q31_t)0x7f782dd6, (q31_t)0xf45b9c95, + (q31_t)0x7f779b62, (q31_t)0xf4555ac5, (q31_t)0x7f77089f, (q31_t)0xf44f18fb, (q31_t)0x7f76758e, (q31_t)0xf448d739, (q31_t)0x7f75e22e, (q31_t)0xf442957e, + (q31_t)0x7f754e80, (q31_t)0xf43c53cb, (q31_t)0x7f74ba83, (q31_t)0xf436121e, (q31_t)0x7f742637, (q31_t)0xf42fd079, (q31_t)0x7f73919d, (q31_t)0xf4298edc, + (q31_t)0x7f72fcb4, (q31_t)0xf4234d45, (q31_t)0x7f72677c, (q31_t)0xf41d0bb6, (q31_t)0x7f71d1f6, (q31_t)0xf416ca2e, (q31_t)0x7f713c21, (q31_t)0xf41088ae, + (q31_t)0x7f70a5fe, (q31_t)0xf40a4735, (q31_t)0x7f700f8c, (q31_t)0xf40405c3, (q31_t)0x7f6f78cb, (q31_t)0xf3fdc459, (q31_t)0x7f6ee1bc, (q31_t)0xf3f782f6, + (q31_t)0x7f6e4a5e, (q31_t)0xf3f1419a, (q31_t)0x7f6db2b1, (q31_t)0xf3eb0046, (q31_t)0x7f6d1ab6, (q31_t)0xf3e4bef9, (q31_t)0x7f6c826d, (q31_t)0xf3de7db4, + (q31_t)0x7f6be9d4, (q31_t)0xf3d83c77, (q31_t)0x7f6b50ed, (q31_t)0xf3d1fb40, (q31_t)0x7f6ab7b8, (q31_t)0xf3cbba12, (q31_t)0x7f6a1e34, (q31_t)0xf3c578eb, + (q31_t)0x7f698461, (q31_t)0xf3bf37cb, (q31_t)0x7f68ea40, (q31_t)0xf3b8f6b3, (q31_t)0x7f684fd0, (q31_t)0xf3b2b5a3, (q31_t)0x7f67b512, (q31_t)0xf3ac749a, + (q31_t)0x7f671a05, (q31_t)0xf3a63398, (q31_t)0x7f667ea9, (q31_t)0xf39ff29f, (q31_t)0x7f65e2ff, (q31_t)0xf399b1ad, (q31_t)0x7f654706, (q31_t)0xf39370c2, + (q31_t)0x7f64aabf, (q31_t)0xf38d2fe0, (q31_t)0x7f640e29, (q31_t)0xf386ef05, (q31_t)0x7f637144, (q31_t)0xf380ae31, (q31_t)0x7f62d411, (q31_t)0xf37a6d66, + (q31_t)0x7f62368f, (q31_t)0xf3742ca2, (q31_t)0x7f6198bf, (q31_t)0xf36debe6, (q31_t)0x7f60faa0, (q31_t)0xf367ab31, (q31_t)0x7f605c33, (q31_t)0xf3616a85, + (q31_t)0x7f5fbd77, (q31_t)0xf35b29e0, (q31_t)0x7f5f1e6c, (q31_t)0xf354e943, (q31_t)0x7f5e7f13, (q31_t)0xf34ea8ae, (q31_t)0x7f5ddf6b, (q31_t)0xf3486820, + (q31_t)0x7f5d3f75, (q31_t)0xf342279b, (q31_t)0x7f5c9f30, (q31_t)0xf33be71d, (q31_t)0x7f5bfe9d, (q31_t)0xf335a6a7, (q31_t)0x7f5b5dbb, (q31_t)0xf32f6639, + (q31_t)0x7f5abc8a, (q31_t)0xf32925d3, (q31_t)0x7f5a1b0b, (q31_t)0xf322e575, (q31_t)0x7f59793e, (q31_t)0xf31ca51f, (q31_t)0x7f58d721, (q31_t)0xf31664d1, + (q31_t)0x7f5834b7, (q31_t)0xf310248a, (q31_t)0x7f5791fd, (q31_t)0xf309e44c, (q31_t)0x7f56eef5, (q31_t)0xf303a416, (q31_t)0x7f564b9f, (q31_t)0xf2fd63e8, + (q31_t)0x7f55a7fa, (q31_t)0xf2f723c1, (q31_t)0x7f550407, (q31_t)0xf2f0e3a3, (q31_t)0x7f545fc5, (q31_t)0xf2eaa38d, (q31_t)0x7f53bb34, (q31_t)0xf2e4637f, + (q31_t)0x7f531655, (q31_t)0xf2de2379, (q31_t)0x7f527127, (q31_t)0xf2d7e37b, (q31_t)0x7f51cbab, (q31_t)0xf2d1a385, (q31_t)0x7f5125e0, (q31_t)0xf2cb6398, + (q31_t)0x7f507fc7, (q31_t)0xf2c523b2, (q31_t)0x7f4fd95f, (q31_t)0xf2bee3d5, (q31_t)0x7f4f32a9, (q31_t)0xf2b8a400, (q31_t)0x7f4e8ba4, (q31_t)0xf2b26433, + (q31_t)0x7f4de451, (q31_t)0xf2ac246e, (q31_t)0x7f4d3caf, (q31_t)0xf2a5e4b1, (q31_t)0x7f4c94be, (q31_t)0xf29fa4fd, (q31_t)0x7f4bec7f, (q31_t)0xf2996551, + (q31_t)0x7f4b43f2, (q31_t)0xf29325ad, (q31_t)0x7f4a9b16, (q31_t)0xf28ce612, (q31_t)0x7f49f1eb, (q31_t)0xf286a67e, (q31_t)0x7f494872, (q31_t)0xf28066f4, + (q31_t)0x7f489eaa, (q31_t)0xf27a2771, (q31_t)0x7f47f494, (q31_t)0xf273e7f7, (q31_t)0x7f474a30, (q31_t)0xf26da885, (q31_t)0x7f469f7d, (q31_t)0xf267691b, + (q31_t)0x7f45f47b, (q31_t)0xf26129ba, (q31_t)0x7f45492b, (q31_t)0xf25aea61, (q31_t)0x7f449d8c, (q31_t)0xf254ab11, (q31_t)0x7f43f19f, (q31_t)0xf24e6bc9, + (q31_t)0x7f434563, (q31_t)0xf2482c8a, (q31_t)0x7f4298d9, (q31_t)0xf241ed53, (q31_t)0x7f41ec01, (q31_t)0xf23bae24, (q31_t)0x7f413ed9, (q31_t)0xf2356efe, + (q31_t)0x7f409164, (q31_t)0xf22f2fe1, (q31_t)0x7f3fe3a0, (q31_t)0xf228f0cc, (q31_t)0x7f3f358d, (q31_t)0xf222b1c0, (q31_t)0x7f3e872c, (q31_t)0xf21c72bc, + (q31_t)0x7f3dd87c, (q31_t)0xf21633c0, (q31_t)0x7f3d297e, (q31_t)0xf20ff4ce, (q31_t)0x7f3c7a31, (q31_t)0xf209b5e4, (q31_t)0x7f3bca96, (q31_t)0xf2037702, + (q31_t)0x7f3b1aad, (q31_t)0xf1fd3829, (q31_t)0x7f3a6a75, (q31_t)0xf1f6f959, (q31_t)0x7f39b9ee, (q31_t)0xf1f0ba91, (q31_t)0x7f390919, (q31_t)0xf1ea7bd2, + (q31_t)0x7f3857f6, (q31_t)0xf1e43d1c, (q31_t)0x7f37a684, (q31_t)0xf1ddfe6f, (q31_t)0x7f36f4c3, (q31_t)0xf1d7bfca, (q31_t)0x7f3642b4, (q31_t)0xf1d1812e, + (q31_t)0x7f359057, (q31_t)0xf1cb429a, (q31_t)0x7f34ddab, (q31_t)0xf1c50410, (q31_t)0x7f342ab1, (q31_t)0xf1bec58e, (q31_t)0x7f337768, (q31_t)0xf1b88715, + (q31_t)0x7f32c3d1, (q31_t)0xf1b248a5, (q31_t)0x7f320feb, (q31_t)0xf1ac0a3e, (q31_t)0x7f315bb7, (q31_t)0xf1a5cbdf, (q31_t)0x7f30a734, (q31_t)0xf19f8d89, + (q31_t)0x7f2ff263, (q31_t)0xf1994f3d, (q31_t)0x7f2f3d44, (q31_t)0xf19310f9, (q31_t)0x7f2e87d6, (q31_t)0xf18cd2be, (q31_t)0x7f2dd219, (q31_t)0xf186948c, + (q31_t)0x7f2d1c0e, (q31_t)0xf1805662, (q31_t)0x7f2c65b5, (q31_t)0xf17a1842, (q31_t)0x7f2baf0d, (q31_t)0xf173da2b, (q31_t)0x7f2af817, (q31_t)0xf16d9c1d, + (q31_t)0x7f2a40d2, (q31_t)0xf1675e17, (q31_t)0x7f29893f, (q31_t)0xf161201b, (q31_t)0x7f28d15d, (q31_t)0xf15ae228, (q31_t)0x7f28192d, (q31_t)0xf154a43d, + (q31_t)0x7f2760af, (q31_t)0xf14e665c, (q31_t)0x7f26a7e2, (q31_t)0xf1482884, (q31_t)0x7f25eec7, (q31_t)0xf141eab5, (q31_t)0x7f25355d, (q31_t)0xf13bacef, + (q31_t)0x7f247ba5, (q31_t)0xf1356f32, (q31_t)0x7f23c19e, (q31_t)0xf12f317e, (q31_t)0x7f230749, (q31_t)0xf128f3d4, (q31_t)0x7f224ca6, (q31_t)0xf122b632, + (q31_t)0x7f2191b4, (q31_t)0xf11c789a, (q31_t)0x7f20d674, (q31_t)0xf1163b0b, (q31_t)0x7f201ae5, (q31_t)0xf10ffd85, (q31_t)0x7f1f5f08, (q31_t)0xf109c009, + (q31_t)0x7f1ea2dc, (q31_t)0xf1038295, (q31_t)0x7f1de662, (q31_t)0xf0fd452b, (q31_t)0x7f1d299a, (q31_t)0xf0f707ca, (q31_t)0x7f1c6c83, (q31_t)0xf0f0ca72, + (q31_t)0x7f1baf1e, (q31_t)0xf0ea8d24, (q31_t)0x7f1af16a, (q31_t)0xf0e44fdf, (q31_t)0x7f1a3368, (q31_t)0xf0de12a3, (q31_t)0x7f197518, (q31_t)0xf0d7d571, + (q31_t)0x7f18b679, (q31_t)0xf0d19848, (q31_t)0x7f17f78c, (q31_t)0xf0cb5b28, (q31_t)0x7f173850, (q31_t)0xf0c51e12, (q31_t)0x7f1678c6, (q31_t)0xf0bee105, + (q31_t)0x7f15b8ee, (q31_t)0xf0b8a401, (q31_t)0x7f14f8c7, (q31_t)0xf0b26707, (q31_t)0x7f143852, (q31_t)0xf0ac2a16, (q31_t)0x7f13778e, (q31_t)0xf0a5ed2f, + (q31_t)0x7f12b67c, (q31_t)0xf09fb051, (q31_t)0x7f11f51c, (q31_t)0xf099737d, (q31_t)0x7f11336d, (q31_t)0xf09336b2, (q31_t)0x7f107170, (q31_t)0xf08cf9f1, + (q31_t)0x7f0faf25, (q31_t)0xf086bd39, (q31_t)0x7f0eec8b, (q31_t)0xf080808b, (q31_t)0x7f0e29a3, (q31_t)0xf07a43e7, (q31_t)0x7f0d666c, (q31_t)0xf074074c, + (q31_t)0x7f0ca2e7, (q31_t)0xf06dcaba, (q31_t)0x7f0bdf14, (q31_t)0xf0678e32, (q31_t)0x7f0b1af2, (q31_t)0xf06151b4, (q31_t)0x7f0a5682, (q31_t)0xf05b1540, + (q31_t)0x7f0991c4, (q31_t)0xf054d8d5, (q31_t)0x7f08ccb7, (q31_t)0xf04e9c73, (q31_t)0x7f08075c, (q31_t)0xf048601c, (q31_t)0x7f0741b2, (q31_t)0xf04223ce, + (q31_t)0x7f067bba, (q31_t)0xf03be78a, (q31_t)0x7f05b574, (q31_t)0xf035ab4f, (q31_t)0x7f04eedf, (q31_t)0xf02f6f1f, (q31_t)0x7f0427fc, (q31_t)0xf02932f8, + (q31_t)0x7f0360cb, (q31_t)0xf022f6da, (q31_t)0x7f02994b, (q31_t)0xf01cbac7, (q31_t)0x7f01d17d, (q31_t)0xf0167ebd, (q31_t)0x7f010961, (q31_t)0xf01042be, + (q31_t)0x7f0040f6, (q31_t)0xf00a06c8, (q31_t)0x7eff783d, (q31_t)0xf003cadc, (q31_t)0x7efeaf36, (q31_t)0xeffd8ef9, (q31_t)0x7efde5e0, (q31_t)0xeff75321, + (q31_t)0x7efd1c3c, (q31_t)0xeff11753, (q31_t)0x7efc524a, (q31_t)0xefeadb8e, (q31_t)0x7efb8809, (q31_t)0xefe49fd3, (q31_t)0x7efabd7a, (q31_t)0xefde6423, + (q31_t)0x7ef9f29d, (q31_t)0xefd8287c, (q31_t)0x7ef92771, (q31_t)0xefd1ecdf, (q31_t)0x7ef85bf7, (q31_t)0xefcbb14c, (q31_t)0x7ef7902f, (q31_t)0xefc575c3, + (q31_t)0x7ef6c418, (q31_t)0xefbf3a45, (q31_t)0x7ef5f7b3, (q31_t)0xefb8fed0, (q31_t)0x7ef52b00, (q31_t)0xefb2c365, (q31_t)0x7ef45dfe, (q31_t)0xefac8804, + (q31_t)0x7ef390ae, (q31_t)0xefa64cae, (q31_t)0x7ef2c310, (q31_t)0xefa01161, (q31_t)0x7ef1f524, (q31_t)0xef99d61f, (q31_t)0x7ef126e9, (q31_t)0xef939ae6, + (q31_t)0x7ef05860, (q31_t)0xef8d5fb8, (q31_t)0x7eef8988, (q31_t)0xef872494, (q31_t)0x7eeeba62, (q31_t)0xef80e97a, (q31_t)0x7eedeaee, (q31_t)0xef7aae6b, + (q31_t)0x7eed1b2c, (q31_t)0xef747365, (q31_t)0x7eec4b1b, (q31_t)0xef6e386a, (q31_t)0x7eeb7abc, (q31_t)0xef67fd79, (q31_t)0x7eeaaa0f, (q31_t)0xef61c292, + (q31_t)0x7ee9d914, (q31_t)0xef5b87b5, (q31_t)0x7ee907ca, (q31_t)0xef554ce3, (q31_t)0x7ee83632, (q31_t)0xef4f121b, (q31_t)0x7ee7644c, (q31_t)0xef48d75d, + (q31_t)0x7ee69217, (q31_t)0xef429caa, (q31_t)0x7ee5bf94, (q31_t)0xef3c6201, (q31_t)0x7ee4ecc3, (q31_t)0xef362762, (q31_t)0x7ee419a3, (q31_t)0xef2feccd, + (q31_t)0x7ee34636, (q31_t)0xef29b243, (q31_t)0x7ee2727a, (q31_t)0xef2377c4, (q31_t)0x7ee19e6f, (q31_t)0xef1d3d4e, (q31_t)0x7ee0ca17, (q31_t)0xef1702e4, + (q31_t)0x7edff570, (q31_t)0xef10c883, (q31_t)0x7edf207b, (q31_t)0xef0a8e2d, (q31_t)0x7ede4b38, (q31_t)0xef0453e2, (q31_t)0x7edd75a6, (q31_t)0xeefe19a1, + (q31_t)0x7edc9fc6, (q31_t)0xeef7df6a, (q31_t)0x7edbc998, (q31_t)0xeef1a53e, (q31_t)0x7edaf31c, (q31_t)0xeeeb6b1c, (q31_t)0x7eda1c51, (q31_t)0xeee53105, + (q31_t)0x7ed94538, (q31_t)0xeedef6f9, (q31_t)0x7ed86dd1, (q31_t)0xeed8bcf7, (q31_t)0x7ed7961c, (q31_t)0xeed28300, (q31_t)0x7ed6be18, (q31_t)0xeecc4913, + (q31_t)0x7ed5e5c6, (q31_t)0xeec60f31, (q31_t)0x7ed50d26, (q31_t)0xeebfd55a, (q31_t)0x7ed43438, (q31_t)0xeeb99b8d, (q31_t)0x7ed35afb, (q31_t)0xeeb361cb, + (q31_t)0x7ed28171, (q31_t)0xeead2813, (q31_t)0x7ed1a798, (q31_t)0xeea6ee66, (q31_t)0x7ed0cd70, (q31_t)0xeea0b4c4, (q31_t)0x7ecff2fb, (q31_t)0xee9a7b2d, + (q31_t)0x7ecf1837, (q31_t)0xee9441a0, (q31_t)0x7ece3d25, (q31_t)0xee8e081e, (q31_t)0x7ecd61c5, (q31_t)0xee87cea7, (q31_t)0x7ecc8617, (q31_t)0xee81953b, + (q31_t)0x7ecbaa1a, (q31_t)0xee7b5bd9, (q31_t)0x7ecacdd0, (q31_t)0xee752283, (q31_t)0x7ec9f137, (q31_t)0xee6ee937, (q31_t)0x7ec9144f, (q31_t)0xee68aff6, + (q31_t)0x7ec8371a, (q31_t)0xee6276bf, (q31_t)0x7ec75996, (q31_t)0xee5c3d94, (q31_t)0x7ec67bc5, (q31_t)0xee560473, (q31_t)0x7ec59da5, (q31_t)0xee4fcb5e, + (q31_t)0x7ec4bf36, (q31_t)0xee499253, (q31_t)0x7ec3e07a, (q31_t)0xee435953, (q31_t)0x7ec3016f, (q31_t)0xee3d205e, (q31_t)0x7ec22217, (q31_t)0xee36e775, + (q31_t)0x7ec14270, (q31_t)0xee30ae96, (q31_t)0x7ec0627a, (q31_t)0xee2a75c2, (q31_t)0x7ebf8237, (q31_t)0xee243cf9, (q31_t)0x7ebea1a6, (q31_t)0xee1e043b, + (q31_t)0x7ebdc0c6, (q31_t)0xee17cb88, (q31_t)0x7ebcdf98, (q31_t)0xee1192e0, (q31_t)0x7ebbfe1c, (q31_t)0xee0b5a43, (q31_t)0x7ebb1c52, (q31_t)0xee0521b2, + (q31_t)0x7eba3a39, (q31_t)0xedfee92b, (q31_t)0x7eb957d2, (q31_t)0xedf8b0b0, (q31_t)0x7eb8751e, (q31_t)0xedf2783f, (q31_t)0x7eb7921b, (q31_t)0xedec3fda, + (q31_t)0x7eb6aeca, (q31_t)0xede60780, (q31_t)0x7eb5cb2a, (q31_t)0xeddfcf31, (q31_t)0x7eb4e73d, (q31_t)0xedd996ed, (q31_t)0x7eb40301, (q31_t)0xedd35eb5, + (q31_t)0x7eb31e78, (q31_t)0xedcd2687, (q31_t)0x7eb239a0, (q31_t)0xedc6ee65, (q31_t)0x7eb1547a, (q31_t)0xedc0b64e, (q31_t)0x7eb06f05, (q31_t)0xedba7e43, + (q31_t)0x7eaf8943, (q31_t)0xedb44642, (q31_t)0x7eaea333, (q31_t)0xedae0e4d, (q31_t)0x7eadbcd4, (q31_t)0xeda7d664, (q31_t)0x7eacd627, (q31_t)0xeda19e85, + (q31_t)0x7eabef2c, (q31_t)0xed9b66b2, (q31_t)0x7eab07e3, (q31_t)0xed952eea, (q31_t)0x7eaa204c, (q31_t)0xed8ef72e, (q31_t)0x7ea93867, (q31_t)0xed88bf7d, + (q31_t)0x7ea85033, (q31_t)0xed8287d7, (q31_t)0x7ea767b2, (q31_t)0xed7c503d, (q31_t)0x7ea67ee2, (q31_t)0xed7618ae, (q31_t)0x7ea595c4, (q31_t)0xed6fe12b, + (q31_t)0x7ea4ac58, (q31_t)0xed69a9b3, (q31_t)0x7ea3c29e, (q31_t)0xed637246, (q31_t)0x7ea2d896, (q31_t)0xed5d3ae5, (q31_t)0x7ea1ee3f, (q31_t)0xed570390, + (q31_t)0x7ea1039b, (q31_t)0xed50cc46, (q31_t)0x7ea018a8, (q31_t)0xed4a9507, (q31_t)0x7e9f2d68, (q31_t)0xed445dd5, (q31_t)0x7e9e41d9, (q31_t)0xed3e26ad, + (q31_t)0x7e9d55fc, (q31_t)0xed37ef91, (q31_t)0x7e9c69d1, (q31_t)0xed31b881, (q31_t)0x7e9b7d58, (q31_t)0xed2b817d, (q31_t)0x7e9a9091, (q31_t)0xed254a84, + (q31_t)0x7e99a37c, (q31_t)0xed1f1396, (q31_t)0x7e98b618, (q31_t)0xed18dcb5, (q31_t)0x7e97c867, (q31_t)0xed12a5df, (q31_t)0x7e96da67, (q31_t)0xed0c6f14, + (q31_t)0x7e95ec1a, (q31_t)0xed063856, (q31_t)0x7e94fd7e, (q31_t)0xed0001a3, (q31_t)0x7e940e94, (q31_t)0xecf9cafb, (q31_t)0x7e931f5c, (q31_t)0xecf39460, + (q31_t)0x7e922fd6, (q31_t)0xeced5dd0, (q31_t)0x7e914002, (q31_t)0xece7274c, (q31_t)0x7e904fe0, (q31_t)0xece0f0d4, (q31_t)0x7e8f5f70, (q31_t)0xecdaba67, + (q31_t)0x7e8e6eb2, (q31_t)0xecd48407, (q31_t)0x7e8d7da6, (q31_t)0xecce4db2, (q31_t)0x7e8c8c4b, (q31_t)0xecc81769, (q31_t)0x7e8b9aa3, (q31_t)0xecc1e12c, + (q31_t)0x7e8aa8ac, (q31_t)0xecbbaafb, (q31_t)0x7e89b668, (q31_t)0xecb574d5, (q31_t)0x7e88c3d5, (q31_t)0xecaf3ebc, (q31_t)0x7e87d0f5, (q31_t)0xeca908ae, + (q31_t)0x7e86ddc6, (q31_t)0xeca2d2ad, (q31_t)0x7e85ea49, (q31_t)0xec9c9cb7, (q31_t)0x7e84f67e, (q31_t)0xec9666cd, (q31_t)0x7e840265, (q31_t)0xec9030f0, + (q31_t)0x7e830dff, (q31_t)0xec89fb1e, (q31_t)0x7e82194a, (q31_t)0xec83c558, (q31_t)0x7e812447, (q31_t)0xec7d8f9e, (q31_t)0x7e802ef6, (q31_t)0xec7759f1, + (q31_t)0x7e7f3957, (q31_t)0xec71244f, (q31_t)0x7e7e436a, (q31_t)0xec6aeeba, (q31_t)0x7e7d4d2f, (q31_t)0xec64b930, (q31_t)0x7e7c56a5, (q31_t)0xec5e83b3, + (q31_t)0x7e7b5fce, (q31_t)0xec584e41, (q31_t)0x7e7a68a9, (q31_t)0xec5218dc, (q31_t)0x7e797136, (q31_t)0xec4be383, (q31_t)0x7e787975, (q31_t)0xec45ae36, + (q31_t)0x7e778166, (q31_t)0xec3f78f6, (q31_t)0x7e768908, (q31_t)0xec3943c1, (q31_t)0x7e75905d, (q31_t)0xec330e99, (q31_t)0x7e749764, (q31_t)0xec2cd97d, + (q31_t)0x7e739e1d, (q31_t)0xec26a46d, (q31_t)0x7e72a488, (q31_t)0xec206f69, (q31_t)0x7e71aaa4, (q31_t)0xec1a3a72, (q31_t)0x7e70b073, (q31_t)0xec140587, + (q31_t)0x7e6fb5f4, (q31_t)0xec0dd0a8, (q31_t)0x7e6ebb27, (q31_t)0xec079bd6, (q31_t)0x7e6dc00c, (q31_t)0xec01670f, (q31_t)0x7e6cc4a2, (q31_t)0xebfb3256, + (q31_t)0x7e6bc8eb, (q31_t)0xebf4fda8, (q31_t)0x7e6acce6, (q31_t)0xebeec907, (q31_t)0x7e69d093, (q31_t)0xebe89472, (q31_t)0x7e68d3f2, (q31_t)0xebe25fea, + (q31_t)0x7e67d703, (q31_t)0xebdc2b6e, (q31_t)0x7e66d9c6, (q31_t)0xebd5f6fe, (q31_t)0x7e65dc3b, (q31_t)0xebcfc29b, (q31_t)0x7e64de62, (q31_t)0xebc98e45, + (q31_t)0x7e63e03b, (q31_t)0xebc359fb, (q31_t)0x7e62e1c6, (q31_t)0xebbd25bd, (q31_t)0x7e61e303, (q31_t)0xebb6f18c, (q31_t)0x7e60e3f2, (q31_t)0xebb0bd67, + (q31_t)0x7e5fe493, (q31_t)0xebaa894f, (q31_t)0x7e5ee4e6, (q31_t)0xeba45543, (q31_t)0x7e5de4ec, (q31_t)0xeb9e2144, (q31_t)0x7e5ce4a3, (q31_t)0xeb97ed52, + (q31_t)0x7e5be40c, (q31_t)0xeb91b96c, (q31_t)0x7e5ae328, (q31_t)0xeb8b8593, (q31_t)0x7e59e1f5, (q31_t)0xeb8551c6, (q31_t)0x7e58e075, (q31_t)0xeb7f1e06, + (q31_t)0x7e57dea7, (q31_t)0xeb78ea52, (q31_t)0x7e56dc8a, (q31_t)0xeb72b6ac, (q31_t)0x7e55da20, (q31_t)0xeb6c8312, (q31_t)0x7e54d768, (q31_t)0xeb664f84, + (q31_t)0x7e53d462, (q31_t)0xeb601c04, (q31_t)0x7e52d10e, (q31_t)0xeb59e890, (q31_t)0x7e51cd6c, (q31_t)0xeb53b529, (q31_t)0x7e50c97c, (q31_t)0xeb4d81ce, + (q31_t)0x7e4fc53e, (q31_t)0xeb474e81, (q31_t)0x7e4ec0b2, (q31_t)0xeb411b40, (q31_t)0x7e4dbbd9, (q31_t)0xeb3ae80c, (q31_t)0x7e4cb6b1, (q31_t)0xeb34b4e4, + (q31_t)0x7e4bb13c, (q31_t)0xeb2e81ca, (q31_t)0x7e4aab78, (q31_t)0xeb284ebc, (q31_t)0x7e49a567, (q31_t)0xeb221bbb, (q31_t)0x7e489f08, (q31_t)0xeb1be8c8, + (q31_t)0x7e47985b, (q31_t)0xeb15b5e1, (q31_t)0x7e469160, (q31_t)0xeb0f8307, (q31_t)0x7e458a17, (q31_t)0xeb095039, (q31_t)0x7e448281, (q31_t)0xeb031d79, + (q31_t)0x7e437a9c, (q31_t)0xeafceac6, (q31_t)0x7e427269, (q31_t)0xeaf6b81f, (q31_t)0x7e4169e9, (q31_t)0xeaf08586, (q31_t)0x7e40611b, (q31_t)0xeaea52fa, + (q31_t)0x7e3f57ff, (q31_t)0xeae4207a, (q31_t)0x7e3e4e95, (q31_t)0xeaddee08, (q31_t)0x7e3d44dd, (q31_t)0xead7bba3, (q31_t)0x7e3c3ad7, (q31_t)0xead1894b, + (q31_t)0x7e3b3083, (q31_t)0xeacb56ff, (q31_t)0x7e3a25e2, (q31_t)0xeac524c1, (q31_t)0x7e391af3, (q31_t)0xeabef290, (q31_t)0x7e380fb5, (q31_t)0xeab8c06c, + (q31_t)0x7e37042a, (q31_t)0xeab28e56, (q31_t)0x7e35f851, (q31_t)0xeaac5c4c, (q31_t)0x7e34ec2b, (q31_t)0xeaa62a4f, (q31_t)0x7e33dfb6, (q31_t)0xea9ff860, + (q31_t)0x7e32d2f4, (q31_t)0xea99c67e, (q31_t)0x7e31c5e3, (q31_t)0xea9394a9, (q31_t)0x7e30b885, (q31_t)0xea8d62e1, (q31_t)0x7e2faad9, (q31_t)0xea873127, + (q31_t)0x7e2e9cdf, (q31_t)0xea80ff7a, (q31_t)0x7e2d8e97, (q31_t)0xea7acdda, (q31_t)0x7e2c8002, (q31_t)0xea749c47, (q31_t)0x7e2b711f, (q31_t)0xea6e6ac2, + (q31_t)0x7e2a61ed, (q31_t)0xea683949, (q31_t)0x7e29526e, (q31_t)0xea6207df, (q31_t)0x7e2842a2, (q31_t)0xea5bd681, (q31_t)0x7e273287, (q31_t)0xea55a531, + (q31_t)0x7e26221f, (q31_t)0xea4f73ee, (q31_t)0x7e251168, (q31_t)0xea4942b9, (q31_t)0x7e240064, (q31_t)0xea431191, (q31_t)0x7e22ef12, (q31_t)0xea3ce077, + (q31_t)0x7e21dd73, (q31_t)0xea36af69, (q31_t)0x7e20cb85, (q31_t)0xea307e6a, (q31_t)0x7e1fb94a, (q31_t)0xea2a4d78, (q31_t)0x7e1ea6c1, (q31_t)0xea241c93, + (q31_t)0x7e1d93ea, (q31_t)0xea1debbb, (q31_t)0x7e1c80c5, (q31_t)0xea17baf2, (q31_t)0x7e1b6d53, (q31_t)0xea118a35, (q31_t)0x7e1a5992, (q31_t)0xea0b5987, + (q31_t)0x7e194584, (q31_t)0xea0528e5, (q31_t)0x7e183128, (q31_t)0xe9fef852, (q31_t)0x7e171c7f, (q31_t)0xe9f8c7cc, (q31_t)0x7e160787, (q31_t)0xe9f29753, + (q31_t)0x7e14f242, (q31_t)0xe9ec66e8, (q31_t)0x7e13dcaf, (q31_t)0xe9e6368b, (q31_t)0x7e12c6ce, (q31_t)0xe9e0063c, (q31_t)0x7e11b0a0, (q31_t)0xe9d9d5fa, + (q31_t)0x7e109a24, (q31_t)0xe9d3a5c5, (q31_t)0x7e0f835a, (q31_t)0xe9cd759f, (q31_t)0x7e0e6c42, (q31_t)0xe9c74586, (q31_t)0x7e0d54dc, (q31_t)0xe9c1157a, + (q31_t)0x7e0c3d29, (q31_t)0xe9bae57d, (q31_t)0x7e0b2528, (q31_t)0xe9b4b58d, (q31_t)0x7e0a0cd9, (q31_t)0xe9ae85ab, (q31_t)0x7e08f43d, (q31_t)0xe9a855d7, + (q31_t)0x7e07db52, (q31_t)0xe9a22610, (q31_t)0x7e06c21a, (q31_t)0xe99bf658, (q31_t)0x7e05a894, (q31_t)0xe995c6ad, (q31_t)0x7e048ec1, (q31_t)0xe98f9710, + (q31_t)0x7e0374a0, (q31_t)0xe9896781, (q31_t)0x7e025a31, (q31_t)0xe98337ff, (q31_t)0x7e013f74, (q31_t)0xe97d088c, (q31_t)0x7e00246a, (q31_t)0xe976d926, + (q31_t)0x7dff0911, (q31_t)0xe970a9ce, (q31_t)0x7dfded6c, (q31_t)0xe96a7a85, (q31_t)0x7dfcd178, (q31_t)0xe9644b49, (q31_t)0x7dfbb537, (q31_t)0xe95e1c1b, + (q31_t)0x7dfa98a8, (q31_t)0xe957ecfb, (q31_t)0x7df97bcb, (q31_t)0xe951bde9, (q31_t)0x7df85ea0, (q31_t)0xe94b8ee5, (q31_t)0x7df74128, (q31_t)0xe9455fef, + (q31_t)0x7df62362, (q31_t)0xe93f3107, (q31_t)0x7df5054f, (q31_t)0xe939022d, (q31_t)0x7df3e6ee, (q31_t)0xe932d361, (q31_t)0x7df2c83f, (q31_t)0xe92ca4a4, + (q31_t)0x7df1a942, (q31_t)0xe92675f4, (q31_t)0x7df089f8, (q31_t)0xe9204752, (q31_t)0x7def6a60, (q31_t)0xe91a18bf, (q31_t)0x7dee4a7a, (q31_t)0xe913ea39, + (q31_t)0x7ded2a47, (q31_t)0xe90dbbc2, (q31_t)0x7dec09c6, (q31_t)0xe9078d59, (q31_t)0x7deae8f7, (q31_t)0xe9015efe, (q31_t)0x7de9c7da, (q31_t)0xe8fb30b1, + (q31_t)0x7de8a670, (q31_t)0xe8f50273, (q31_t)0x7de784b9, (q31_t)0xe8eed443, (q31_t)0x7de662b3, (q31_t)0xe8e8a621, (q31_t)0x7de54060, (q31_t)0xe8e2780d, + (q31_t)0x7de41dc0, (q31_t)0xe8dc4a07, (q31_t)0x7de2fad1, (q31_t)0xe8d61c10, (q31_t)0x7de1d795, (q31_t)0xe8cfee27, (q31_t)0x7de0b40b, (q31_t)0xe8c9c04c, + (q31_t)0x7ddf9034, (q31_t)0xe8c39280, (q31_t)0x7dde6c0f, (q31_t)0xe8bd64c2, (q31_t)0x7ddd479d, (q31_t)0xe8b73712, (q31_t)0x7ddc22dc, (q31_t)0xe8b10971, + (q31_t)0x7ddafdce, (q31_t)0xe8aadbde, (q31_t)0x7dd9d873, (q31_t)0xe8a4ae59, (q31_t)0x7dd8b2ca, (q31_t)0xe89e80e3, (q31_t)0x7dd78cd3, (q31_t)0xe898537b, + (q31_t)0x7dd6668f, (q31_t)0xe8922622, (q31_t)0x7dd53ffc, (q31_t)0xe88bf8d7, (q31_t)0x7dd4191d, (q31_t)0xe885cb9a, (q31_t)0x7dd2f1f0, (q31_t)0xe87f9e6c, + (q31_t)0x7dd1ca75, (q31_t)0xe879714d, (q31_t)0x7dd0a2ac, (q31_t)0xe873443c, (q31_t)0x7dcf7a96, (q31_t)0xe86d173a, (q31_t)0x7dce5232, (q31_t)0xe866ea46, + (q31_t)0x7dcd2981, (q31_t)0xe860bd61, (q31_t)0x7dcc0082, (q31_t)0xe85a908a, (q31_t)0x7dcad736, (q31_t)0xe85463c2, (q31_t)0x7dc9ad9c, (q31_t)0xe84e3708, + (q31_t)0x7dc883b4, (q31_t)0xe8480a5d, (q31_t)0x7dc7597f, (q31_t)0xe841ddc1, (q31_t)0x7dc62efc, (q31_t)0xe83bb133, (q31_t)0x7dc5042b, (q31_t)0xe83584b4, + (q31_t)0x7dc3d90d, (q31_t)0xe82f5844, (q31_t)0x7dc2ada2, (q31_t)0xe8292be3, (q31_t)0x7dc181e8, (q31_t)0xe822ff90, (q31_t)0x7dc055e2, (q31_t)0xe81cd34b, + (q31_t)0x7dbf298d, (q31_t)0xe816a716, (q31_t)0x7dbdfceb, (q31_t)0xe8107aef, (q31_t)0x7dbccffc, (q31_t)0xe80a4ed7, (q31_t)0x7dbba2bf, (q31_t)0xe80422ce, + (q31_t)0x7dba7534, (q31_t)0xe7fdf6d4, (q31_t)0x7db9475c, (q31_t)0xe7f7cae8, (q31_t)0x7db81936, (q31_t)0xe7f19f0c, (q31_t)0x7db6eac3, (q31_t)0xe7eb733e, + (q31_t)0x7db5bc02, (q31_t)0xe7e5477f, (q31_t)0x7db48cf4, (q31_t)0xe7df1bcf, (q31_t)0x7db35d98, (q31_t)0xe7d8f02d, (q31_t)0x7db22def, (q31_t)0xe7d2c49b, + (q31_t)0x7db0fdf8, (q31_t)0xe7cc9917, (q31_t)0x7dafcdb3, (q31_t)0xe7c66da3, (q31_t)0x7dae9d21, (q31_t)0xe7c0423d, (q31_t)0x7dad6c42, (q31_t)0xe7ba16e7, + (q31_t)0x7dac3b15, (q31_t)0xe7b3eb9f, (q31_t)0x7dab099a, (q31_t)0xe7adc066, (q31_t)0x7da9d7d2, (q31_t)0xe7a7953d, (q31_t)0x7da8a5bc, (q31_t)0xe7a16a22, + (q31_t)0x7da77359, (q31_t)0xe79b3f16, (q31_t)0x7da640a9, (q31_t)0xe795141a, (q31_t)0x7da50dab, (q31_t)0xe78ee92c, (q31_t)0x7da3da5f, (q31_t)0xe788be4e, + (q31_t)0x7da2a6c6, (q31_t)0xe782937e, (q31_t)0x7da172df, (q31_t)0xe77c68be, (q31_t)0x7da03eab, (q31_t)0xe7763e0d, (q31_t)0x7d9f0a29, (q31_t)0xe770136b, + (q31_t)0x7d9dd55a, (q31_t)0xe769e8d8, (q31_t)0x7d9ca03e, (q31_t)0xe763be55, (q31_t)0x7d9b6ad3, (q31_t)0xe75d93e0, (q31_t)0x7d9a351c, (q31_t)0xe757697b, + (q31_t)0x7d98ff17, (q31_t)0xe7513f25, (q31_t)0x7d97c8c4, (q31_t)0xe74b14de, (q31_t)0x7d969224, (q31_t)0xe744eaa6, (q31_t)0x7d955b37, (q31_t)0xe73ec07e, + (q31_t)0x7d9423fc, (q31_t)0xe7389665, (q31_t)0x7d92ec73, (q31_t)0xe7326c5b, (q31_t)0x7d91b49e, (q31_t)0xe72c4260, (q31_t)0x7d907c7a, (q31_t)0xe7261875, + (q31_t)0x7d8f4409, (q31_t)0xe71fee99, (q31_t)0x7d8e0b4b, (q31_t)0xe719c4cd, (q31_t)0x7d8cd240, (q31_t)0xe7139b10, (q31_t)0x7d8b98e6, (q31_t)0xe70d7162, + (q31_t)0x7d8a5f40, (q31_t)0xe70747c4, (q31_t)0x7d89254c, (q31_t)0xe7011e35, (q31_t)0x7d87eb0a, (q31_t)0xe6faf4b5, (q31_t)0x7d86b07c, (q31_t)0xe6f4cb45, + (q31_t)0x7d85759f, (q31_t)0xe6eea1e4, (q31_t)0x7d843a76, (q31_t)0xe6e87893, (q31_t)0x7d82fefe, (q31_t)0xe6e24f51, (q31_t)0x7d81c33a, (q31_t)0xe6dc261f, + (q31_t)0x7d808728, (q31_t)0xe6d5fcfc, (q31_t)0x7d7f4ac8, (q31_t)0xe6cfd3e9, (q31_t)0x7d7e0e1c, (q31_t)0xe6c9aae5, (q31_t)0x7d7cd121, (q31_t)0xe6c381f1, + (q31_t)0x7d7b93da, (q31_t)0xe6bd590d, (q31_t)0x7d7a5645, (q31_t)0xe6b73038, (q31_t)0x7d791862, (q31_t)0xe6b10772, (q31_t)0x7d77da32, (q31_t)0xe6aadebc, + (q31_t)0x7d769bb5, (q31_t)0xe6a4b616, (q31_t)0x7d755cea, (q31_t)0xe69e8d80, (q31_t)0x7d741dd2, (q31_t)0xe69864f9, (q31_t)0x7d72de6d, (q31_t)0xe6923c82, + (q31_t)0x7d719eba, (q31_t)0xe68c141a, (q31_t)0x7d705eba, (q31_t)0xe685ebc2, (q31_t)0x7d6f1e6c, (q31_t)0xe67fc37a, (q31_t)0x7d6dddd2, (q31_t)0xe6799b42, + (q31_t)0x7d6c9ce9, (q31_t)0xe6737319, (q31_t)0x7d6b5bb4, (q31_t)0xe66d4b01, (q31_t)0x7d6a1a31, (q31_t)0xe66722f7, (q31_t)0x7d68d860, (q31_t)0xe660fafe, + (q31_t)0x7d679642, (q31_t)0xe65ad315, (q31_t)0x7d6653d7, (q31_t)0xe654ab3b, (q31_t)0x7d65111f, (q31_t)0xe64e8371, (q31_t)0x7d63ce19, (q31_t)0xe6485bb7, + (q31_t)0x7d628ac6, (q31_t)0xe642340d, (q31_t)0x7d614725, (q31_t)0xe63c0c73, (q31_t)0x7d600338, (q31_t)0xe635e4e9, (q31_t)0x7d5ebefc, (q31_t)0xe62fbd6e, + (q31_t)0x7d5d7a74, (q31_t)0xe6299604, (q31_t)0x7d5c359e, (q31_t)0xe6236ea9, (q31_t)0x7d5af07b, (q31_t)0xe61d475e, (q31_t)0x7d59ab0a, (q31_t)0xe6172024, + (q31_t)0x7d58654d, (q31_t)0xe610f8f9, (q31_t)0x7d571f41, (q31_t)0xe60ad1de, (q31_t)0x7d55d8e9, (q31_t)0xe604aad4, (q31_t)0x7d549243, (q31_t)0xe5fe83d9, + (q31_t)0x7d534b50, (q31_t)0xe5f85cef, (q31_t)0x7d520410, (q31_t)0xe5f23614, (q31_t)0x7d50bc82, (q31_t)0xe5ec0f4a, (q31_t)0x7d4f74a7, (q31_t)0xe5e5e88f, + (q31_t)0x7d4e2c7f, (q31_t)0xe5dfc1e5, (q31_t)0x7d4ce409, (q31_t)0xe5d99b4b, (q31_t)0x7d4b9b46, (q31_t)0xe5d374c1, (q31_t)0x7d4a5236, (q31_t)0xe5cd4e47, + (q31_t)0x7d4908d9, (q31_t)0xe5c727dd, (q31_t)0x7d47bf2e, (q31_t)0xe5c10184, (q31_t)0x7d467536, (q31_t)0xe5badb3a, (q31_t)0x7d452af1, (q31_t)0xe5b4b501, + (q31_t)0x7d43e05e, (q31_t)0xe5ae8ed8, (q31_t)0x7d42957e, (q31_t)0xe5a868bf, (q31_t)0x7d414a51, (q31_t)0xe5a242b7, (q31_t)0x7d3ffed7, (q31_t)0xe59c1cbf, + (q31_t)0x7d3eb30f, (q31_t)0xe595f6d7, (q31_t)0x7d3d66fa, (q31_t)0xe58fd0ff, (q31_t)0x7d3c1a98, (q31_t)0xe589ab38, (q31_t)0x7d3acde9, (q31_t)0xe5838581, + (q31_t)0x7d3980ec, (q31_t)0xe57d5fda, (q31_t)0x7d3833a2, (q31_t)0xe5773a44, (q31_t)0x7d36e60b, (q31_t)0xe57114be, (q31_t)0x7d359827, (q31_t)0xe56aef49, + (q31_t)0x7d3449f5, (q31_t)0xe564c9e3, (q31_t)0x7d32fb76, (q31_t)0xe55ea48f, (q31_t)0x7d31acaa, (q31_t)0xe5587f4a, (q31_t)0x7d305d91, (q31_t)0xe5525a17, + (q31_t)0x7d2f0e2b, (q31_t)0xe54c34f3, (q31_t)0x7d2dbe77, (q31_t)0xe5460fe0, (q31_t)0x7d2c6e76, (q31_t)0xe53feade, (q31_t)0x7d2b1e28, (q31_t)0xe539c5ec, + (q31_t)0x7d29cd8c, (q31_t)0xe533a10a, (q31_t)0x7d287ca4, (q31_t)0xe52d7c39, (q31_t)0x7d272b6e, (q31_t)0xe5275779, (q31_t)0x7d25d9eb, (q31_t)0xe52132c9, + (q31_t)0x7d24881b, (q31_t)0xe51b0e2a, (q31_t)0x7d2335fe, (q31_t)0xe514e99b, (q31_t)0x7d21e393, (q31_t)0xe50ec51d, (q31_t)0x7d2090db, (q31_t)0xe508a0b0, + (q31_t)0x7d1f3dd6, (q31_t)0xe5027c53, (q31_t)0x7d1dea84, (q31_t)0xe4fc5807, (q31_t)0x7d1c96e5, (q31_t)0xe4f633cc, (q31_t)0x7d1b42f9, (q31_t)0xe4f00fa1, + (q31_t)0x7d19eebf, (q31_t)0xe4e9eb87, (q31_t)0x7d189a38, (q31_t)0xe4e3c77d, (q31_t)0x7d174564, (q31_t)0xe4dda385, (q31_t)0x7d15f043, (q31_t)0xe4d77f9d, + (q31_t)0x7d149ad5, (q31_t)0xe4d15bc6, (q31_t)0x7d134519, (q31_t)0xe4cb37ff, (q31_t)0x7d11ef11, (q31_t)0xe4c5144a, (q31_t)0x7d1098bb, (q31_t)0xe4bef0a5, + (q31_t)0x7d0f4218, (q31_t)0xe4b8cd11, (q31_t)0x7d0deb28, (q31_t)0xe4b2a98e, (q31_t)0x7d0c93eb, (q31_t)0xe4ac861b, (q31_t)0x7d0b3c60, (q31_t)0xe4a662ba, + (q31_t)0x7d09e489, (q31_t)0xe4a03f69, (q31_t)0x7d088c64, (q31_t)0xe49a1c29, (q31_t)0x7d0733f3, (q31_t)0xe493f8fb, (q31_t)0x7d05db34, (q31_t)0xe48dd5dd, + (q31_t)0x7d048228, (q31_t)0xe487b2d0, (q31_t)0x7d0328cf, (q31_t)0xe4818fd4, (q31_t)0x7d01cf29, (q31_t)0xe47b6ce9, (q31_t)0x7d007535, (q31_t)0xe4754a0e, + (q31_t)0x7cff1af5, (q31_t)0xe46f2745, (q31_t)0x7cfdc068, (q31_t)0xe469048d, (q31_t)0x7cfc658d, (q31_t)0xe462e1e6, (q31_t)0x7cfb0a65, (q31_t)0xe45cbf50, + (q31_t)0x7cf9aef0, (q31_t)0xe4569ccb, (q31_t)0x7cf8532f, (q31_t)0xe4507a57, (q31_t)0x7cf6f720, (q31_t)0xe44a57f4, (q31_t)0x7cf59ac4, (q31_t)0xe44435a2, + (q31_t)0x7cf43e1a, (q31_t)0xe43e1362, (q31_t)0x7cf2e124, (q31_t)0xe437f132, (q31_t)0x7cf183e1, (q31_t)0xe431cf14, (q31_t)0x7cf02651, (q31_t)0xe42bad07, + (q31_t)0x7ceec873, (q31_t)0xe4258b0a, (q31_t)0x7ced6a49, (q31_t)0xe41f6920, (q31_t)0x7cec0bd1, (q31_t)0xe4194746, (q31_t)0x7ceaad0c, (q31_t)0xe413257d, + (q31_t)0x7ce94dfb, (q31_t)0xe40d03c6, (q31_t)0x7ce7ee9c, (q31_t)0xe406e220, (q31_t)0x7ce68ef0, (q31_t)0xe400c08b, (q31_t)0x7ce52ef7, (q31_t)0xe3fa9f08, + (q31_t)0x7ce3ceb2, (q31_t)0xe3f47d96, (q31_t)0x7ce26e1f, (q31_t)0xe3ee5c35, (q31_t)0x7ce10d3f, (q31_t)0xe3e83ae5, (q31_t)0x7cdfac12, (q31_t)0xe3e219a7, + (q31_t)0x7cde4a98, (q31_t)0xe3dbf87a, (q31_t)0x7cdce8d1, (q31_t)0xe3d5d75e, (q31_t)0x7cdb86bd, (q31_t)0xe3cfb654, (q31_t)0x7cda245c, (q31_t)0xe3c9955b, + (q31_t)0x7cd8c1ae, (q31_t)0xe3c37474, (q31_t)0x7cd75eb3, (q31_t)0xe3bd539e, (q31_t)0x7cd5fb6a, (q31_t)0xe3b732d9, (q31_t)0x7cd497d5, (q31_t)0xe3b11226, + (q31_t)0x7cd333f3, (q31_t)0xe3aaf184, (q31_t)0x7cd1cfc4, (q31_t)0xe3a4d0f4, (q31_t)0x7cd06b48, (q31_t)0xe39eb075, (q31_t)0x7ccf067f, (q31_t)0xe3989008, + (q31_t)0x7ccda169, (q31_t)0xe3926fad, (q31_t)0x7ccc3c06, (q31_t)0xe38c4f63, (q31_t)0x7ccad656, (q31_t)0xe3862f2a, (q31_t)0x7cc97059, (q31_t)0xe3800f03, + (q31_t)0x7cc80a0f, (q31_t)0xe379eeed, (q31_t)0x7cc6a378, (q31_t)0xe373ceea, (q31_t)0x7cc53c94, (q31_t)0xe36daef7, (q31_t)0x7cc3d563, (q31_t)0xe3678f17, + (q31_t)0x7cc26de5, (q31_t)0xe3616f48, (q31_t)0x7cc1061a, (q31_t)0xe35b4f8b, (q31_t)0x7cbf9e03, (q31_t)0xe3552fdf, (q31_t)0x7cbe359e, (q31_t)0xe34f1045, + (q31_t)0x7cbcccec, (q31_t)0xe348f0bd, (q31_t)0x7cbb63ee, (q31_t)0xe342d146, (q31_t)0x7cb9faa2, (q31_t)0xe33cb1e1, (q31_t)0x7cb8910a, (q31_t)0xe336928e, + (q31_t)0x7cb72724, (q31_t)0xe330734d, (q31_t)0x7cb5bcf2, (q31_t)0xe32a541d, (q31_t)0x7cb45272, (q31_t)0xe3243500, (q31_t)0x7cb2e7a6, (q31_t)0xe31e15f4, + (q31_t)0x7cb17c8d, (q31_t)0xe317f6fa, (q31_t)0x7cb01127, (q31_t)0xe311d811, (q31_t)0x7caea574, (q31_t)0xe30bb93b, (q31_t)0x7cad3974, (q31_t)0xe3059a76, + (q31_t)0x7cabcd28, (q31_t)0xe2ff7bc3, (q31_t)0x7caa608e, (q31_t)0xe2f95d23, (q31_t)0x7ca8f3a7, (q31_t)0xe2f33e94, (q31_t)0x7ca78674, (q31_t)0xe2ed2017, + (q31_t)0x7ca618f3, (q31_t)0xe2e701ac, (q31_t)0x7ca4ab26, (q31_t)0xe2e0e352, (q31_t)0x7ca33d0c, (q31_t)0xe2dac50b, (q31_t)0x7ca1cea5, (q31_t)0xe2d4a6d6, + (q31_t)0x7ca05ff1, (q31_t)0xe2ce88b3, (q31_t)0x7c9ef0f0, (q31_t)0xe2c86aa2, (q31_t)0x7c9d81a3, (q31_t)0xe2c24ca2, (q31_t)0x7c9c1208, (q31_t)0xe2bc2eb5, + (q31_t)0x7c9aa221, (q31_t)0xe2b610da, (q31_t)0x7c9931ec, (q31_t)0xe2aff311, (q31_t)0x7c97c16b, (q31_t)0xe2a9d55a, (q31_t)0x7c96509d, (q31_t)0xe2a3b7b5, + (q31_t)0x7c94df83, (q31_t)0xe29d9a23, (q31_t)0x7c936e1b, (q31_t)0xe2977ca2, (q31_t)0x7c91fc66, (q31_t)0xe2915f34, (q31_t)0x7c908a65, (q31_t)0xe28b41d7, + (q31_t)0x7c8f1817, (q31_t)0xe285248d, (q31_t)0x7c8da57c, (q31_t)0xe27f0755, (q31_t)0x7c8c3294, (q31_t)0xe278ea30, (q31_t)0x7c8abf5f, (q31_t)0xe272cd1c, + (q31_t)0x7c894bde, (q31_t)0xe26cb01b, (q31_t)0x7c87d810, (q31_t)0xe266932c, (q31_t)0x7c8663f4, (q31_t)0xe260764f, (q31_t)0x7c84ef8c, (q31_t)0xe25a5984, + (q31_t)0x7c837ad8, (q31_t)0xe2543ccc, (q31_t)0x7c8205d6, (q31_t)0xe24e2026, (q31_t)0x7c809088, (q31_t)0xe2480393, (q31_t)0x7c7f1aed, (q31_t)0xe241e711, + (q31_t)0x7c7da505, (q31_t)0xe23bcaa2, (q31_t)0x7c7c2ed0, (q31_t)0xe235ae46, (q31_t)0x7c7ab84e, (q31_t)0xe22f91fc, (q31_t)0x7c794180, (q31_t)0xe22975c4, + (q31_t)0x7c77ca65, (q31_t)0xe223599e, (q31_t)0x7c7652fd, (q31_t)0xe21d3d8b, (q31_t)0x7c74db48, (q31_t)0xe217218b, (q31_t)0x7c736347, (q31_t)0xe211059d, + (q31_t)0x7c71eaf9, (q31_t)0xe20ae9c1, (q31_t)0x7c70725e, (q31_t)0xe204cdf8, (q31_t)0x7c6ef976, (q31_t)0xe1feb241, (q31_t)0x7c6d8041, (q31_t)0xe1f8969d, + (q31_t)0x7c6c06c0, (q31_t)0xe1f27b0b, (q31_t)0x7c6a8cf2, (q31_t)0xe1ec5f8c, (q31_t)0x7c6912d7, (q31_t)0xe1e64420, (q31_t)0x7c679870, (q31_t)0xe1e028c6, + (q31_t)0x7c661dbc, (q31_t)0xe1da0d7e, (q31_t)0x7c64a2bb, (q31_t)0xe1d3f24a, (q31_t)0x7c63276d, (q31_t)0xe1cdd727, (q31_t)0x7c61abd3, (q31_t)0xe1c7bc18, + (q31_t)0x7c602fec, (q31_t)0xe1c1a11b, (q31_t)0x7c5eb3b8, (q31_t)0xe1bb8631, (q31_t)0x7c5d3737, (q31_t)0xe1b56b59, (q31_t)0x7c5bba6a, (q31_t)0xe1af5094, + (q31_t)0x7c5a3d50, (q31_t)0xe1a935e2, (q31_t)0x7c58bfe9, (q31_t)0xe1a31b42, (q31_t)0x7c574236, (q31_t)0xe19d00b6, (q31_t)0x7c55c436, (q31_t)0xe196e63c, + (q31_t)0x7c5445e9, (q31_t)0xe190cbd4, (q31_t)0x7c52c74f, (q31_t)0xe18ab180, (q31_t)0x7c514869, (q31_t)0xe184973e, (q31_t)0x7c4fc936, (q31_t)0xe17e7d0f, + (q31_t)0x7c4e49b7, (q31_t)0xe17862f3, (q31_t)0x7c4cc9ea, (q31_t)0xe17248ea, (q31_t)0x7c4b49d2, (q31_t)0xe16c2ef4, (q31_t)0x7c49c96c, (q31_t)0xe1661510, + (q31_t)0x7c4848ba, (q31_t)0xe15ffb3f, (q31_t)0x7c46c7bb, (q31_t)0xe159e182, (q31_t)0x7c45466f, (q31_t)0xe153c7d7, (q31_t)0x7c43c4d7, (q31_t)0xe14dae3f, + (q31_t)0x7c4242f2, (q31_t)0xe14794ba, (q31_t)0x7c40c0c1, (q31_t)0xe1417b48, (q31_t)0x7c3f3e42, (q31_t)0xe13b61e9, (q31_t)0x7c3dbb78, (q31_t)0xe135489d, + (q31_t)0x7c3c3860, (q31_t)0xe12f2f63, (q31_t)0x7c3ab4fc, (q31_t)0xe129163d, (q31_t)0x7c39314b, (q31_t)0xe122fd2a, (q31_t)0x7c37ad4e, (q31_t)0xe11ce42a, + (q31_t)0x7c362904, (q31_t)0xe116cb3d, (q31_t)0x7c34a46d, (q31_t)0xe110b263, (q31_t)0x7c331f8a, (q31_t)0xe10a999c, (q31_t)0x7c319a5a, (q31_t)0xe10480e9, + (q31_t)0x7c3014de, (q31_t)0xe0fe6848, (q31_t)0x7c2e8f15, (q31_t)0xe0f84fbb, (q31_t)0x7c2d08ff, (q31_t)0xe0f23740, (q31_t)0x7c2b829d, (q31_t)0xe0ec1ed9, + (q31_t)0x7c29fbee, (q31_t)0xe0e60685, (q31_t)0x7c2874f3, (q31_t)0xe0dfee44, (q31_t)0x7c26edab, (q31_t)0xe0d9d616, (q31_t)0x7c256616, (q31_t)0xe0d3bdfc, + (q31_t)0x7c23de35, (q31_t)0xe0cda5f5, (q31_t)0x7c225607, (q31_t)0xe0c78e01, (q31_t)0x7c20cd8d, (q31_t)0xe0c17620, (q31_t)0x7c1f44c6, (q31_t)0xe0bb5e53, + (q31_t)0x7c1dbbb3, (q31_t)0xe0b54698, (q31_t)0x7c1c3253, (q31_t)0xe0af2ef2, (q31_t)0x7c1aa8a6, (q31_t)0xe0a9175e, (q31_t)0x7c191ead, (q31_t)0xe0a2ffde, + (q31_t)0x7c179467, (q31_t)0xe09ce871, (q31_t)0x7c1609d5, (q31_t)0xe096d117, (q31_t)0x7c147ef6, (q31_t)0xe090b9d1, (q31_t)0x7c12f3cb, (q31_t)0xe08aa29f, + (q31_t)0x7c116853, (q31_t)0xe0848b7f, (q31_t)0x7c0fdc8f, (q31_t)0xe07e7473, (q31_t)0x7c0e507e, (q31_t)0xe0785d7b, (q31_t)0x7c0cc421, (q31_t)0xe0724696, + (q31_t)0x7c0b3777, (q31_t)0xe06c2fc4, (q31_t)0x7c09aa80, (q31_t)0xe0661906, (q31_t)0x7c081d3d, (q31_t)0xe060025c, (q31_t)0x7c068fae, (q31_t)0xe059ebc5, + (q31_t)0x7c0501d2, (q31_t)0xe053d541, (q31_t)0x7c0373a9, (q31_t)0xe04dbed1, (q31_t)0x7c01e534, (q31_t)0xe047a875, (q31_t)0x7c005673, (q31_t)0xe041922c, + (q31_t)0x7bfec765, (q31_t)0xe03b7bf6, (q31_t)0x7bfd380a, (q31_t)0xe03565d5, (q31_t)0x7bfba863, (q31_t)0xe02f4fc6, (q31_t)0x7bfa1870, (q31_t)0xe02939cc, + (q31_t)0x7bf88830, (q31_t)0xe02323e5, (q31_t)0x7bf6f7a4, (q31_t)0xe01d0e12, (q31_t)0x7bf566cb, (q31_t)0xe016f852, (q31_t)0x7bf3d5a6, (q31_t)0xe010e2a7, + (q31_t)0x7bf24434, (q31_t)0xe00acd0e, (q31_t)0x7bf0b276, (q31_t)0xe004b78a, (q31_t)0x7bef206b, (q31_t)0xdffea219, (q31_t)0x7bed8e14, (q31_t)0xdff88cbc, + (q31_t)0x7bebfb70, (q31_t)0xdff27773, (q31_t)0x7bea6880, (q31_t)0xdfec623e, (q31_t)0x7be8d544, (q31_t)0xdfe64d1c, (q31_t)0x7be741bb, (q31_t)0xdfe0380e, + (q31_t)0x7be5ade6, (q31_t)0xdfda2314, (q31_t)0x7be419c4, (q31_t)0xdfd40e2e, (q31_t)0x7be28556, (q31_t)0xdfcdf95c, (q31_t)0x7be0f09b, (q31_t)0xdfc7e49d, + (q31_t)0x7bdf5b94, (q31_t)0xdfc1cff3, (q31_t)0x7bddc641, (q31_t)0xdfbbbb5c, (q31_t)0x7bdc30a1, (q31_t)0xdfb5a6d9, (q31_t)0x7bda9ab5, (q31_t)0xdfaf926a, + (q31_t)0x7bd9047c, (q31_t)0xdfa97e0f, (q31_t)0x7bd76df7, (q31_t)0xdfa369c8, (q31_t)0x7bd5d726, (q31_t)0xdf9d5595, (q31_t)0x7bd44008, (q31_t)0xdf974176, + (q31_t)0x7bd2a89e, (q31_t)0xdf912d6b, (q31_t)0x7bd110e8, (q31_t)0xdf8b1974, (q31_t)0x7bcf78e5, (q31_t)0xdf850591, (q31_t)0x7bcde095, (q31_t)0xdf7ef1c2, + (q31_t)0x7bcc47fa, (q31_t)0xdf78de07, (q31_t)0x7bcaaf12, (q31_t)0xdf72ca60, (q31_t)0x7bc915dd, (q31_t)0xdf6cb6cd, (q31_t)0x7bc77c5d, (q31_t)0xdf66a34e, + (q31_t)0x7bc5e290, (q31_t)0xdf608fe4, (q31_t)0x7bc44876, (q31_t)0xdf5a7c8d, (q31_t)0x7bc2ae10, (q31_t)0xdf54694b, (q31_t)0x7bc1135e, (q31_t)0xdf4e561c, + (q31_t)0x7bbf7860, (q31_t)0xdf484302, (q31_t)0x7bbddd15, (q31_t)0xdf422ffd, (q31_t)0x7bbc417e, (q31_t)0xdf3c1d0b, (q31_t)0x7bbaa59a, (q31_t)0xdf360a2d, + (q31_t)0x7bb9096b, (q31_t)0xdf2ff764, (q31_t)0x7bb76cef, (q31_t)0xdf29e4af, (q31_t)0x7bb5d026, (q31_t)0xdf23d20e, (q31_t)0x7bb43311, (q31_t)0xdf1dbf82, + (q31_t)0x7bb295b0, (q31_t)0xdf17ad0a, (q31_t)0x7bb0f803, (q31_t)0xdf119aa6, (q31_t)0x7baf5a09, (q31_t)0xdf0b8856, (q31_t)0x7badbbc3, (q31_t)0xdf05761b, + (q31_t)0x7bac1d31, (q31_t)0xdeff63f4, (q31_t)0x7baa7e53, (q31_t)0xdef951e2, (q31_t)0x7ba8df28, (q31_t)0xdef33fe3, (q31_t)0x7ba73fb1, (q31_t)0xdeed2dfa, + (q31_t)0x7ba59fee, (q31_t)0xdee71c24, (q31_t)0x7ba3ffde, (q31_t)0xdee10a63, (q31_t)0x7ba25f82, (q31_t)0xdedaf8b7, (q31_t)0x7ba0beda, (q31_t)0xded4e71f, + (q31_t)0x7b9f1de6, (q31_t)0xdeced59b, (q31_t)0x7b9d7ca5, (q31_t)0xdec8c42c, (q31_t)0x7b9bdb18, (q31_t)0xdec2b2d1, (q31_t)0x7b9a393f, (q31_t)0xdebca18b, + (q31_t)0x7b989719, (q31_t)0xdeb69059, (q31_t)0x7b96f4a8, (q31_t)0xdeb07f3c, (q31_t)0x7b9551ea, (q31_t)0xdeaa6e34, (q31_t)0x7b93aee0, (q31_t)0xdea45d40, + (q31_t)0x7b920b89, (q31_t)0xde9e4c60, (q31_t)0x7b9067e7, (q31_t)0xde983b95, (q31_t)0x7b8ec3f8, (q31_t)0xde922adf, (q31_t)0x7b8d1fbd, (q31_t)0xde8c1a3e, + (q31_t)0x7b8b7b36, (q31_t)0xde8609b1, (q31_t)0x7b89d662, (q31_t)0xde7ff938, (q31_t)0x7b883143, (q31_t)0xde79e8d5, (q31_t)0x7b868bd7, (q31_t)0xde73d886, + (q31_t)0x7b84e61f, (q31_t)0xde6dc84b, (q31_t)0x7b83401b, (q31_t)0xde67b826, (q31_t)0x7b8199ca, (q31_t)0xde61a815, (q31_t)0x7b7ff32e, (q31_t)0xde5b9819, + (q31_t)0x7b7e4c45, (q31_t)0xde558831, (q31_t)0x7b7ca510, (q31_t)0xde4f785f, (q31_t)0x7b7afd8f, (q31_t)0xde4968a1, (q31_t)0x7b7955c2, (q31_t)0xde4358f8, + (q31_t)0x7b77ada8, (q31_t)0xde3d4964, (q31_t)0x7b760542, (q31_t)0xde3739e4, (q31_t)0x7b745c91, (q31_t)0xde312a7a, (q31_t)0x7b72b393, (q31_t)0xde2b1b24, + (q31_t)0x7b710a49, (q31_t)0xde250be3, (q31_t)0x7b6f60b2, (q31_t)0xde1efcb7, (q31_t)0x7b6db6d0, (q31_t)0xde18eda0, (q31_t)0x7b6c0ca2, (q31_t)0xde12de9e, + (q31_t)0x7b6a6227, (q31_t)0xde0ccfb1, (q31_t)0x7b68b760, (q31_t)0xde06c0d9, (q31_t)0x7b670c4d, (q31_t)0xde00b216, (q31_t)0x7b6560ee, (q31_t)0xddfaa367, + (q31_t)0x7b63b543, (q31_t)0xddf494ce, (q31_t)0x7b62094c, (q31_t)0xddee8649, (q31_t)0x7b605d09, (q31_t)0xdde877da, (q31_t)0x7b5eb079, (q31_t)0xdde26980, + (q31_t)0x7b5d039e, (q31_t)0xdddc5b3b, (q31_t)0x7b5b5676, (q31_t)0xddd64d0a, (q31_t)0x7b59a902, (q31_t)0xddd03eef, (q31_t)0x7b57fb42, (q31_t)0xddca30e9, + (q31_t)0x7b564d36, (q31_t)0xddc422f8, (q31_t)0x7b549ede, (q31_t)0xddbe151d, (q31_t)0x7b52f03a, (q31_t)0xddb80756, (q31_t)0x7b51414a, (q31_t)0xddb1f9a4, + (q31_t)0x7b4f920e, (q31_t)0xddabec08, (q31_t)0x7b4de286, (q31_t)0xdda5de81, (q31_t)0x7b4c32b1, (q31_t)0xdd9fd10f, (q31_t)0x7b4a8291, (q31_t)0xdd99c3b2, + (q31_t)0x7b48d225, (q31_t)0xdd93b66a, (q31_t)0x7b47216c, (q31_t)0xdd8da938, (q31_t)0x7b457068, (q31_t)0xdd879c1b, (q31_t)0x7b43bf17, (q31_t)0xdd818f13, + (q31_t)0x7b420d7a, (q31_t)0xdd7b8220, (q31_t)0x7b405b92, (q31_t)0xdd757543, (q31_t)0x7b3ea95d, (q31_t)0xdd6f687b, (q31_t)0x7b3cf6dc, (q31_t)0xdd695bc9, + (q31_t)0x7b3b4410, (q31_t)0xdd634f2b, (q31_t)0x7b3990f7, (q31_t)0xdd5d42a3, (q31_t)0x7b37dd92, (q31_t)0xdd573631, (q31_t)0x7b3629e1, (q31_t)0xdd5129d4, + (q31_t)0x7b3475e5, (q31_t)0xdd4b1d8c, (q31_t)0x7b32c19c, (q31_t)0xdd451159, (q31_t)0x7b310d07, (q31_t)0xdd3f053c, (q31_t)0x7b2f5826, (q31_t)0xdd38f935, + (q31_t)0x7b2da2fa, (q31_t)0xdd32ed43, (q31_t)0x7b2bed81, (q31_t)0xdd2ce166, (q31_t)0x7b2a37bc, (q31_t)0xdd26d59f, (q31_t)0x7b2881ac, (q31_t)0xdd20c9ed, + (q31_t)0x7b26cb4f, (q31_t)0xdd1abe51, (q31_t)0x7b2514a6, (q31_t)0xdd14b2ca, (q31_t)0x7b235db2, (q31_t)0xdd0ea759, (q31_t)0x7b21a671, (q31_t)0xdd089bfe, + (q31_t)0x7b1feee5, (q31_t)0xdd0290b8, (q31_t)0x7b1e370d, (q31_t)0xdcfc8588, (q31_t)0x7b1c7ee8, (q31_t)0xdcf67a6d, (q31_t)0x7b1ac678, (q31_t)0xdcf06f68, + (q31_t)0x7b190dbc, (q31_t)0xdcea6478, (q31_t)0x7b1754b3, (q31_t)0xdce4599e, (q31_t)0x7b159b5f, (q31_t)0xdcde4eda, (q31_t)0x7b13e1bf, (q31_t)0xdcd8442b, + (q31_t)0x7b1227d3, (q31_t)0xdcd23993, (q31_t)0x7b106d9b, (q31_t)0xdccc2f0f, (q31_t)0x7b0eb318, (q31_t)0xdcc624a2, (q31_t)0x7b0cf848, (q31_t)0xdcc01a4a, + (q31_t)0x7b0b3d2c, (q31_t)0xdcba1008, (q31_t)0x7b0981c5, (q31_t)0xdcb405dc, (q31_t)0x7b07c612, (q31_t)0xdcadfbc5, (q31_t)0x7b060a12, (q31_t)0xdca7f1c5, + (q31_t)0x7b044dc7, (q31_t)0xdca1e7da, (q31_t)0x7b029130, (q31_t)0xdc9bde05, (q31_t)0x7b00d44d, (q31_t)0xdc95d446, (q31_t)0x7aff171e, (q31_t)0xdc8fca9c, + (q31_t)0x7afd59a4, (q31_t)0xdc89c109, (q31_t)0x7afb9bdd, (q31_t)0xdc83b78b, (q31_t)0x7af9ddcb, (q31_t)0xdc7dae23, (q31_t)0x7af81f6c, (q31_t)0xdc77a4d2, + (q31_t)0x7af660c2, (q31_t)0xdc719b96, (q31_t)0x7af4a1cc, (q31_t)0xdc6b9270, (q31_t)0x7af2e28b, (q31_t)0xdc658960, (q31_t)0x7af122fd, (q31_t)0xdc5f8066, + (q31_t)0x7aef6323, (q31_t)0xdc597781, (q31_t)0x7aeda2fe, (q31_t)0xdc536eb3, (q31_t)0x7aebe28d, (q31_t)0xdc4d65fb, (q31_t)0x7aea21d0, (q31_t)0xdc475d59, + (q31_t)0x7ae860c7, (q31_t)0xdc4154cd, (q31_t)0x7ae69f73, (q31_t)0xdc3b4c57, (q31_t)0x7ae4ddd2, (q31_t)0xdc3543f7, (q31_t)0x7ae31be6, (q31_t)0xdc2f3bad, + (q31_t)0x7ae159ae, (q31_t)0xdc293379, (q31_t)0x7adf972a, (q31_t)0xdc232b5c, (q31_t)0x7addd45b, (q31_t)0xdc1d2354, (q31_t)0x7adc113f, (q31_t)0xdc171b63, + (q31_t)0x7ada4dd8, (q31_t)0xdc111388, (q31_t)0x7ad88a25, (q31_t)0xdc0b0bc2, (q31_t)0x7ad6c626, (q31_t)0xdc050414, (q31_t)0x7ad501dc, (q31_t)0xdbfefc7b, + (q31_t)0x7ad33d45, (q31_t)0xdbf8f4f8, (q31_t)0x7ad17863, (q31_t)0xdbf2ed8c, (q31_t)0x7acfb336, (q31_t)0xdbece636, (q31_t)0x7acdedbc, (q31_t)0xdbe6def6, + (q31_t)0x7acc27f7, (q31_t)0xdbe0d7cd, (q31_t)0x7aca61e6, (q31_t)0xdbdad0b9, (q31_t)0x7ac89b89, (q31_t)0xdbd4c9bc, (q31_t)0x7ac6d4e0, (q31_t)0xdbcec2d6, + (q31_t)0x7ac50dec, (q31_t)0xdbc8bc06, (q31_t)0x7ac346ac, (q31_t)0xdbc2b54c, (q31_t)0x7ac17f20, (q31_t)0xdbbcaea8, (q31_t)0x7abfb749, (q31_t)0xdbb6a81b, + (q31_t)0x7abdef25, (q31_t)0xdbb0a1a4, (q31_t)0x7abc26b7, (q31_t)0xdbaa9b43, (q31_t)0x7aba5dfc, (q31_t)0xdba494f9, (q31_t)0x7ab894f6, (q31_t)0xdb9e8ec6, + (q31_t)0x7ab6cba4, (q31_t)0xdb9888a8, (q31_t)0x7ab50206, (q31_t)0xdb9282a2, (q31_t)0x7ab3381d, (q31_t)0xdb8c7cb1, (q31_t)0x7ab16de7, (q31_t)0xdb8676d8, + (q31_t)0x7aafa367, (q31_t)0xdb807114, (q31_t)0x7aadd89a, (q31_t)0xdb7a6b68, (q31_t)0x7aac0d82, (q31_t)0xdb7465d1, (q31_t)0x7aaa421e, (q31_t)0xdb6e6052, + (q31_t)0x7aa8766f, (q31_t)0xdb685ae9, (q31_t)0x7aa6aa74, (q31_t)0xdb625596, (q31_t)0x7aa4de2d, (q31_t)0xdb5c505a, (q31_t)0x7aa3119a, (q31_t)0xdb564b35, + (q31_t)0x7aa144bc, (q31_t)0xdb504626, (q31_t)0x7a9f7793, (q31_t)0xdb4a412e, (q31_t)0x7a9daa1d, (q31_t)0xdb443c4c, (q31_t)0x7a9bdc5c, (q31_t)0xdb3e3781, + (q31_t)0x7a9a0e50, (q31_t)0xdb3832cd, (q31_t)0x7a983ff7, (q31_t)0xdb322e30, (q31_t)0x7a967153, (q31_t)0xdb2c29a9, (q31_t)0x7a94a264, (q31_t)0xdb262539, + (q31_t)0x7a92d329, (q31_t)0xdb2020e0, (q31_t)0x7a9103a2, (q31_t)0xdb1a1c9d, (q31_t)0x7a8f33d0, (q31_t)0xdb141871, (q31_t)0x7a8d63b2, (q31_t)0xdb0e145c, + (q31_t)0x7a8b9348, (q31_t)0xdb08105e, (q31_t)0x7a89c293, (q31_t)0xdb020c77, (q31_t)0x7a87f192, (q31_t)0xdafc08a6, (q31_t)0x7a862046, (q31_t)0xdaf604ec, + (q31_t)0x7a844eae, (q31_t)0xdaf00149, (q31_t)0x7a827ccb, (q31_t)0xdae9fdbd, (q31_t)0x7a80aa9c, (q31_t)0xdae3fa48, (q31_t)0x7a7ed821, (q31_t)0xdaddf6ea, + (q31_t)0x7a7d055b, (q31_t)0xdad7f3a2, (q31_t)0x7a7b3249, (q31_t)0xdad1f072, (q31_t)0x7a795eec, (q31_t)0xdacbed58, (q31_t)0x7a778b43, (q31_t)0xdac5ea56, + (q31_t)0x7a75b74f, (q31_t)0xdabfe76a, (q31_t)0x7a73e30f, (q31_t)0xdab9e495, (q31_t)0x7a720e84, (q31_t)0xdab3e1d8, (q31_t)0x7a7039ad, (q31_t)0xdaaddf31, + (q31_t)0x7a6e648a, (q31_t)0xdaa7dca1, (q31_t)0x7a6c8f1c, (q31_t)0xdaa1da29, (q31_t)0x7a6ab963, (q31_t)0xda9bd7c7, (q31_t)0x7a68e35e, (q31_t)0xda95d57d, + (q31_t)0x7a670d0d, (q31_t)0xda8fd349, (q31_t)0x7a653671, (q31_t)0xda89d12d, (q31_t)0x7a635f8a, (q31_t)0xda83cf28, (q31_t)0x7a618857, (q31_t)0xda7dcd3a, + (q31_t)0x7a5fb0d8, (q31_t)0xda77cb63, (q31_t)0x7a5dd90e, (q31_t)0xda71c9a3, (q31_t)0x7a5c00f9, (q31_t)0xda6bc7fa, (q31_t)0x7a5a2898, (q31_t)0xda65c669, + (q31_t)0x7a584feb, (q31_t)0xda5fc4ef, (q31_t)0x7a5676f3, (q31_t)0xda59c38c, (q31_t)0x7a549db0, (q31_t)0xda53c240, (q31_t)0x7a52c421, (q31_t)0xda4dc10b, + (q31_t)0x7a50ea47, (q31_t)0xda47bfee, (q31_t)0x7a4f1021, (q31_t)0xda41bee8, (q31_t)0x7a4d35b0, (q31_t)0xda3bbdf9, (q31_t)0x7a4b5af3, (q31_t)0xda35bd22, + (q31_t)0x7a497feb, (q31_t)0xda2fbc61, (q31_t)0x7a47a498, (q31_t)0xda29bbb9, (q31_t)0x7a45c8f9, (q31_t)0xda23bb27, (q31_t)0x7a43ed0e, (q31_t)0xda1dbaad, + (q31_t)0x7a4210d8, (q31_t)0xda17ba4a, (q31_t)0x7a403457, (q31_t)0xda11b9ff, (q31_t)0x7a3e578b, (q31_t)0xda0bb9cb, (q31_t)0x7a3c7a73, (q31_t)0xda05b9ae, + (q31_t)0x7a3a9d0f, (q31_t)0xd9ffb9a9, (q31_t)0x7a38bf60, (q31_t)0xd9f9b9bb, (q31_t)0x7a36e166, (q31_t)0xd9f3b9e5, (q31_t)0x7a350321, (q31_t)0xd9edba26, + (q31_t)0x7a332490, (q31_t)0xd9e7ba7f, (q31_t)0x7a3145b3, (q31_t)0xd9e1baef, (q31_t)0x7a2f668c, (q31_t)0xd9dbbb77, (q31_t)0x7a2d8719, (q31_t)0xd9d5bc16, + (q31_t)0x7a2ba75a, (q31_t)0xd9cfbccd, (q31_t)0x7a29c750, (q31_t)0xd9c9bd9b, (q31_t)0x7a27e6fb, (q31_t)0xd9c3be81, (q31_t)0x7a26065b, (q31_t)0xd9bdbf7e, + (q31_t)0x7a24256f, (q31_t)0xd9b7c094, (q31_t)0x7a224437, (q31_t)0xd9b1c1c0, (q31_t)0x7a2062b5, (q31_t)0xd9abc305, (q31_t)0x7a1e80e7, (q31_t)0xd9a5c461, + (q31_t)0x7a1c9ece, (q31_t)0xd99fc5d4, (q31_t)0x7a1abc69, (q31_t)0xd999c75f, (q31_t)0x7a18d9b9, (q31_t)0xd993c902, (q31_t)0x7a16f6be, (q31_t)0xd98dcabd, + (q31_t)0x7a151378, (q31_t)0xd987cc90, (q31_t)0x7a132fe6, (q31_t)0xd981ce7a, (q31_t)0x7a114c09, (q31_t)0xd97bd07c, (q31_t)0x7a0f67e0, (q31_t)0xd975d295, + (q31_t)0x7a0d836d, (q31_t)0xd96fd4c7, (q31_t)0x7a0b9eae, (q31_t)0xd969d710, (q31_t)0x7a09b9a4, (q31_t)0xd963d971, (q31_t)0x7a07d44e, (q31_t)0xd95ddbea, + (q31_t)0x7a05eead, (q31_t)0xd957de7a, (q31_t)0x7a0408c1, (q31_t)0xd951e123, (q31_t)0x7a02228a, (q31_t)0xd94be3e3, (q31_t)0x7a003c07, (q31_t)0xd945e6bb, + (q31_t)0x79fe5539, (q31_t)0xd93fe9ab, (q31_t)0x79fc6e20, (q31_t)0xd939ecb3, (q31_t)0x79fa86bc, (q31_t)0xd933efd3, (q31_t)0x79f89f0c, (q31_t)0xd92df30b, + (q31_t)0x79f6b711, (q31_t)0xd927f65b, (q31_t)0x79f4cecb, (q31_t)0xd921f9c3, (q31_t)0x79f2e63a, (q31_t)0xd91bfd43, (q31_t)0x79f0fd5d, (q31_t)0xd91600da, + (q31_t)0x79ef1436, (q31_t)0xd910048a, (q31_t)0x79ed2ac3, (q31_t)0xd90a0852, (q31_t)0x79eb4105, (q31_t)0xd9040c32, (q31_t)0x79e956fb, (q31_t)0xd8fe1029, + (q31_t)0x79e76ca7, (q31_t)0xd8f81439, (q31_t)0x79e58207, (q31_t)0xd8f21861, (q31_t)0x79e3971c, (q31_t)0xd8ec1ca1, (q31_t)0x79e1abe6, (q31_t)0xd8e620fa, + (q31_t)0x79dfc064, (q31_t)0xd8e0256a, (q31_t)0x79ddd498, (q31_t)0xd8da29f2, (q31_t)0x79dbe880, (q31_t)0xd8d42e93, (q31_t)0x79d9fc1d, (q31_t)0xd8ce334c, + (q31_t)0x79d80f6f, (q31_t)0xd8c8381d, (q31_t)0x79d62276, (q31_t)0xd8c23d06, (q31_t)0x79d43532, (q31_t)0xd8bc4207, (q31_t)0x79d247a2, (q31_t)0xd8b64720, + (q31_t)0x79d059c8, (q31_t)0xd8b04c52, (q31_t)0x79ce6ba2, (q31_t)0xd8aa519c, (q31_t)0x79cc7d31, (q31_t)0xd8a456ff, (q31_t)0x79ca8e75, (q31_t)0xd89e5c79, + (q31_t)0x79c89f6e, (q31_t)0xd898620c, (q31_t)0x79c6b01b, (q31_t)0xd89267b7, (q31_t)0x79c4c07e, (q31_t)0xd88c6d7b, (q31_t)0x79c2d095, (q31_t)0xd8867356, + (q31_t)0x79c0e062, (q31_t)0xd880794b, (q31_t)0x79beefe3, (q31_t)0xd87a7f57, (q31_t)0x79bcff19, (q31_t)0xd874857c, (q31_t)0x79bb0e04, (q31_t)0xd86e8bb9, + (q31_t)0x79b91ca4, (q31_t)0xd868920f, (q31_t)0x79b72af9, (q31_t)0xd862987d, (q31_t)0x79b53903, (q31_t)0xd85c9f04, (q31_t)0x79b346c2, (q31_t)0xd856a5a3, + (q31_t)0x79b15435, (q31_t)0xd850ac5a, (q31_t)0x79af615e, (q31_t)0xd84ab32a, (q31_t)0x79ad6e3c, (q31_t)0xd844ba13, (q31_t)0x79ab7ace, (q31_t)0xd83ec114, + (q31_t)0x79a98715, (q31_t)0xd838c82d, (q31_t)0x79a79312, (q31_t)0xd832cf5f, (q31_t)0x79a59ec3, (q31_t)0xd82cd6aa, (q31_t)0x79a3aa29, (q31_t)0xd826de0d, + (q31_t)0x79a1b545, (q31_t)0xd820e589, (q31_t)0x799fc015, (q31_t)0xd81aed1d, (q31_t)0x799dca9a, (q31_t)0xd814f4ca, (q31_t)0x799bd4d4, (q31_t)0xd80efc8f, + (q31_t)0x7999dec4, (q31_t)0xd809046e, (q31_t)0x7997e868, (q31_t)0xd8030c64, (q31_t)0x7995f1c1, (q31_t)0xd7fd1474, (q31_t)0x7993facf, (q31_t)0xd7f71c9c, + (q31_t)0x79920392, (q31_t)0xd7f124dd, (q31_t)0x79900c0a, (q31_t)0xd7eb2d37, (q31_t)0x798e1438, (q31_t)0xd7e535a9, (q31_t)0x798c1c1a, (q31_t)0xd7df3e34, + (q31_t)0x798a23b1, (q31_t)0xd7d946d8, (q31_t)0x79882afd, (q31_t)0xd7d34f94, (q31_t)0x798631ff, (q31_t)0xd7cd586a, (q31_t)0x798438b5, (q31_t)0xd7c76158, + (q31_t)0x79823f20, (q31_t)0xd7c16a5f, (q31_t)0x79804541, (q31_t)0xd7bb737f, (q31_t)0x797e4b16, (q31_t)0xd7b57cb7, (q31_t)0x797c50a1, (q31_t)0xd7af8609, + (q31_t)0x797a55e0, (q31_t)0xd7a98f73, (q31_t)0x79785ad5, (q31_t)0xd7a398f6, (q31_t)0x79765f7f, (q31_t)0xd79da293, (q31_t)0x797463de, (q31_t)0xd797ac48, + (q31_t)0x797267f2, (q31_t)0xd791b616, (q31_t)0x79706bbb, (q31_t)0xd78bbffc, (q31_t)0x796e6f39, (q31_t)0xd785c9fc, (q31_t)0x796c726c, (q31_t)0xd77fd415, + (q31_t)0x796a7554, (q31_t)0xd779de47, (q31_t)0x796877f1, (q31_t)0xd773e892, (q31_t)0x79667a44, (q31_t)0xd76df2f6, (q31_t)0x79647c4c, (q31_t)0xd767fd72, + (q31_t)0x79627e08, (q31_t)0xd7620808, (q31_t)0x79607f7a, (q31_t)0xd75c12b7, (q31_t)0x795e80a1, (q31_t)0xd7561d7f, (q31_t)0x795c817d, (q31_t)0xd7502860, + (q31_t)0x795a820e, (q31_t)0xd74a335b, (q31_t)0x79588255, (q31_t)0xd7443e6e, (q31_t)0x79568250, (q31_t)0xd73e499a, (q31_t)0x79548201, (q31_t)0xd73854e0, + (q31_t)0x79528167, (q31_t)0xd732603f, (q31_t)0x79508082, (q31_t)0xd72c6bb6, (q31_t)0x794e7f52, (q31_t)0xd7267748, (q31_t)0x794c7dd7, (q31_t)0xd72082f2, + (q31_t)0x794a7c12, (q31_t)0xd71a8eb5, (q31_t)0x79487a01, (q31_t)0xd7149a92, (q31_t)0x794677a6, (q31_t)0xd70ea688, (q31_t)0x79447500, (q31_t)0xd708b297, + (q31_t)0x79427210, (q31_t)0xd702bec0, (q31_t)0x79406ed4, (q31_t)0xd6fccb01, (q31_t)0x793e6b4e, (q31_t)0xd6f6d75d, (q31_t)0x793c677d, (q31_t)0xd6f0e3d1, + (q31_t)0x793a6361, (q31_t)0xd6eaf05f, (q31_t)0x79385efa, (q31_t)0xd6e4fd06, (q31_t)0x79365a49, (q31_t)0xd6df09c6, (q31_t)0x7934554d, (q31_t)0xd6d916a0, + (q31_t)0x79325006, (q31_t)0xd6d32393, (q31_t)0x79304a74, (q31_t)0xd6cd30a0, (q31_t)0x792e4497, (q31_t)0xd6c73dc6, (q31_t)0x792c3e70, (q31_t)0xd6c14b05, + (q31_t)0x792a37fe, (q31_t)0xd6bb585e, (q31_t)0x79283141, (q31_t)0xd6b565d0, (q31_t)0x79262a3a, (q31_t)0xd6af735c, (q31_t)0x792422e8, (q31_t)0xd6a98101, + (q31_t)0x79221b4b, (q31_t)0xd6a38ec0, (q31_t)0x79201363, (q31_t)0xd69d9c98, (q31_t)0x791e0b31, (q31_t)0xd697aa8a, (q31_t)0x791c02b4, (q31_t)0xd691b895, + (q31_t)0x7919f9ec, (q31_t)0xd68bc6ba, (q31_t)0x7917f0d9, (q31_t)0xd685d4f9, (q31_t)0x7915e77c, (q31_t)0xd67fe351, (q31_t)0x7913ddd4, (q31_t)0xd679f1c2, + (q31_t)0x7911d3e2, (q31_t)0xd674004e, (q31_t)0x790fc9a4, (q31_t)0xd66e0ef2, (q31_t)0x790dbf1d, (q31_t)0xd6681db1, (q31_t)0x790bb44a, (q31_t)0xd6622c89, + (q31_t)0x7909a92d, (q31_t)0xd65c3b7b, (q31_t)0x79079dc5, (q31_t)0xd6564a87, (q31_t)0x79059212, (q31_t)0xd65059ac, (q31_t)0x79038615, (q31_t)0xd64a68eb, + (q31_t)0x790179cd, (q31_t)0xd6447844, (q31_t)0x78ff6d3b, (q31_t)0xd63e87b6, (q31_t)0x78fd605d, (q31_t)0xd6389742, (q31_t)0x78fb5336, (q31_t)0xd632a6e8, + (q31_t)0x78f945c3, (q31_t)0xd62cb6a8, (q31_t)0x78f73806, (q31_t)0xd626c681, (q31_t)0x78f529fe, (q31_t)0xd620d675, (q31_t)0x78f31bac, (q31_t)0xd61ae682, + (q31_t)0x78f10d0f, (q31_t)0xd614f6a9, (q31_t)0x78eefe28, (q31_t)0xd60f06ea, (q31_t)0x78eceef6, (q31_t)0xd6091745, (q31_t)0x78eadf79, (q31_t)0xd60327b9, + (q31_t)0x78e8cfb2, (q31_t)0xd5fd3848, (q31_t)0x78e6bfa0, (q31_t)0xd5f748f0, (q31_t)0x78e4af44, (q31_t)0xd5f159b3, (q31_t)0x78e29e9d, (q31_t)0xd5eb6a8f, + (q31_t)0x78e08dab, (q31_t)0xd5e57b85, (q31_t)0x78de7c6f, (q31_t)0xd5df8c96, (q31_t)0x78dc6ae8, (q31_t)0xd5d99dc0, (q31_t)0x78da5917, (q31_t)0xd5d3af04, + (q31_t)0x78d846fb, (q31_t)0xd5cdc062, (q31_t)0x78d63495, (q31_t)0xd5c7d1db, (q31_t)0x78d421e4, (q31_t)0xd5c1e36d, (q31_t)0x78d20ee9, (q31_t)0xd5bbf519, + (q31_t)0x78cffba3, (q31_t)0xd5b606e0, (q31_t)0x78cde812, (q31_t)0xd5b018c0, (q31_t)0x78cbd437, (q31_t)0xd5aa2abb, (q31_t)0x78c9c012, (q31_t)0xd5a43cd0, + (q31_t)0x78c7aba2, (q31_t)0xd59e4eff, (q31_t)0x78c596e7, (q31_t)0xd5986148, (q31_t)0x78c381e2, (q31_t)0xd59273ab, (q31_t)0x78c16c93, (q31_t)0xd58c8628, + (q31_t)0x78bf56f9, (q31_t)0xd58698c0, (q31_t)0x78bd4114, (q31_t)0xd580ab72, (q31_t)0x78bb2ae5, (q31_t)0xd57abe3d, (q31_t)0x78b9146c, (q31_t)0xd574d124, + (q31_t)0x78b6fda8, (q31_t)0xd56ee424, (q31_t)0x78b4e69a, (q31_t)0xd568f73f, (q31_t)0x78b2cf41, (q31_t)0xd5630a74, (q31_t)0x78b0b79e, (q31_t)0xd55d1dc3, + (q31_t)0x78ae9fb0, (q31_t)0xd557312d, (q31_t)0x78ac8778, (q31_t)0xd55144b0, (q31_t)0x78aa6ef5, (q31_t)0xd54b584f, (q31_t)0x78a85628, (q31_t)0xd5456c07, + (q31_t)0x78a63d11, (q31_t)0xd53f7fda, (q31_t)0x78a423af, (q31_t)0xd53993c7, (q31_t)0x78a20a03, (q31_t)0xd533a7cf, (q31_t)0x789ff00c, (q31_t)0xd52dbbf1, + (q31_t)0x789dd5cb, (q31_t)0xd527d02e, (q31_t)0x789bbb3f, (q31_t)0xd521e484, (q31_t)0x7899a06a, (q31_t)0xd51bf8f6, (q31_t)0x78978549, (q31_t)0xd5160d82, + (q31_t)0x789569df, (q31_t)0xd5102228, (q31_t)0x78934e2a, (q31_t)0xd50a36e9, (q31_t)0x7891322a, (q31_t)0xd5044bc4, (q31_t)0x788f15e0, (q31_t)0xd4fe60ba, + (q31_t)0x788cf94c, (q31_t)0xd4f875ca, (q31_t)0x788adc6e, (q31_t)0xd4f28af5, (q31_t)0x7888bf45, (q31_t)0xd4eca03a, (q31_t)0x7886a1d1, (q31_t)0xd4e6b59a, + (q31_t)0x78848414, (q31_t)0xd4e0cb15, (q31_t)0x7882660c, (q31_t)0xd4dae0aa, (q31_t)0x788047ba, (q31_t)0xd4d4f65a, (q31_t)0x787e291d, (q31_t)0xd4cf0c24, + (q31_t)0x787c0a36, (q31_t)0xd4c92209, (q31_t)0x7879eb05, (q31_t)0xd4c33809, (q31_t)0x7877cb89, (q31_t)0xd4bd4e23, (q31_t)0x7875abc3, (q31_t)0xd4b76458, + (q31_t)0x78738bb3, (q31_t)0xd4b17aa8, (q31_t)0x78716b59, (q31_t)0xd4ab9112, (q31_t)0x786f4ab4, (q31_t)0xd4a5a798, (q31_t)0x786d29c5, (q31_t)0xd49fbe37, + (q31_t)0x786b088c, (q31_t)0xd499d4f2, (q31_t)0x7868e708, (q31_t)0xd493ebc8, (q31_t)0x7866c53a, (q31_t)0xd48e02b8, (q31_t)0x7864a322, (q31_t)0xd48819c3, + (q31_t)0x786280bf, (q31_t)0xd48230e9, (q31_t)0x78605e13, (q31_t)0xd47c4829, (q31_t)0x785e3b1c, (q31_t)0xd4765f85, (q31_t)0x785c17db, (q31_t)0xd47076fb, + (q31_t)0x7859f44f, (q31_t)0xd46a8e8d, (q31_t)0x7857d079, (q31_t)0xd464a639, (q31_t)0x7855ac5a, (q31_t)0xd45ebe00, (q31_t)0x785387ef, (q31_t)0xd458d5e2, + (q31_t)0x7851633b, (q31_t)0xd452eddf, (q31_t)0x784f3e3c, (q31_t)0xd44d05f6, (q31_t)0x784d18f4, (q31_t)0xd4471e29, (q31_t)0x784af361, (q31_t)0xd4413677, + (q31_t)0x7848cd83, (q31_t)0xd43b4ee0, (q31_t)0x7846a75c, (q31_t)0xd4356763, (q31_t)0x784480ea, (q31_t)0xd42f8002, (q31_t)0x78425a2f, (q31_t)0xd42998bc, + (q31_t)0x78403329, (q31_t)0xd423b191, (q31_t)0x783e0bd9, (q31_t)0xd41dca81, (q31_t)0x783be43e, (q31_t)0xd417e38c, (q31_t)0x7839bc5a, (q31_t)0xd411fcb2, + (q31_t)0x7837942b, (q31_t)0xd40c15f3, (q31_t)0x78356bb2, (q31_t)0xd4062f4f, (q31_t)0x783342ef, (q31_t)0xd40048c6, (q31_t)0x783119e2, (q31_t)0xd3fa6259, + (q31_t)0x782ef08b, (q31_t)0xd3f47c06, (q31_t)0x782cc6ea, (q31_t)0xd3ee95cf, (q31_t)0x782a9cfe, (q31_t)0xd3e8afb3, (q31_t)0x782872c8, (q31_t)0xd3e2c9b2, + (q31_t)0x78264849, (q31_t)0xd3dce3cd, (q31_t)0x78241d7f, (q31_t)0xd3d6fe03, (q31_t)0x7821f26b, (q31_t)0xd3d11853, (q31_t)0x781fc70d, (q31_t)0xd3cb32c0, + (q31_t)0x781d9b65, (q31_t)0xd3c54d47, (q31_t)0x781b6f72, (q31_t)0xd3bf67ea, (q31_t)0x78194336, (q31_t)0xd3b982a8, (q31_t)0x781716b0, (q31_t)0xd3b39d81, + (q31_t)0x7814e9df, (q31_t)0xd3adb876, (q31_t)0x7812bcc4, (q31_t)0xd3a7d385, (q31_t)0x78108f60, (q31_t)0xd3a1eeb1, (q31_t)0x780e61b1, (q31_t)0xd39c09f7, + (q31_t)0x780c33b8, (q31_t)0xd396255a, (q31_t)0x780a0575, (q31_t)0xd39040d7, (q31_t)0x7807d6e9, (q31_t)0xd38a5c70, (q31_t)0x7805a812, (q31_t)0xd3847824, + (q31_t)0x780378f1, (q31_t)0xd37e93f4, (q31_t)0x78014986, (q31_t)0xd378afdf, (q31_t)0x77ff19d1, (q31_t)0xd372cbe6, (q31_t)0x77fce9d2, (q31_t)0xd36ce808, + (q31_t)0x77fab989, (q31_t)0xd3670446, (q31_t)0x77f888f6, (q31_t)0xd361209f, (q31_t)0x77f65819, (q31_t)0xd35b3d13, (q31_t)0x77f426f2, (q31_t)0xd35559a4, + (q31_t)0x77f1f581, (q31_t)0xd34f764f, (q31_t)0x77efc3c5, (q31_t)0xd3499317, (q31_t)0x77ed91c0, (q31_t)0xd343affa, (q31_t)0x77eb5f71, (q31_t)0xd33dccf8, + (q31_t)0x77e92cd9, (q31_t)0xd337ea12, (q31_t)0x77e6f9f6, (q31_t)0xd3320748, (q31_t)0x77e4c6c9, (q31_t)0xd32c2499, (q31_t)0x77e29352, (q31_t)0xd3264206, + (q31_t)0x77e05f91, (q31_t)0xd3205f8f, (q31_t)0x77de2b86, (q31_t)0xd31a7d33, (q31_t)0x77dbf732, (q31_t)0xd3149af3, (q31_t)0x77d9c293, (q31_t)0xd30eb8cf, + (q31_t)0x77d78daa, (q31_t)0xd308d6c7, (q31_t)0x77d55878, (q31_t)0xd302f4da, (q31_t)0x77d322fc, (q31_t)0xd2fd1309, (q31_t)0x77d0ed35, (q31_t)0xd2f73154, + (q31_t)0x77ceb725, (q31_t)0xd2f14fba, (q31_t)0x77cc80cb, (q31_t)0xd2eb6e3c, (q31_t)0x77ca4a27, (q31_t)0xd2e58cdb, (q31_t)0x77c81339, (q31_t)0xd2dfab95, + (q31_t)0x77c5dc01, (q31_t)0xd2d9ca6a, (q31_t)0x77c3a47f, (q31_t)0xd2d3e95c, (q31_t)0x77c16cb4, (q31_t)0xd2ce0869, (q31_t)0x77bf349f, (q31_t)0xd2c82793, + (q31_t)0x77bcfc3f, (q31_t)0xd2c246d8, (q31_t)0x77bac396, (q31_t)0xd2bc6639, (q31_t)0x77b88aa3, (q31_t)0xd2b685b6, (q31_t)0x77b65166, (q31_t)0xd2b0a54f, + (q31_t)0x77b417df, (q31_t)0xd2aac504, (q31_t)0x77b1de0f, (q31_t)0xd2a4e4d5, (q31_t)0x77afa3f5, (q31_t)0xd29f04c2, (q31_t)0x77ad6990, (q31_t)0xd29924cb, + (q31_t)0x77ab2ee2, (q31_t)0xd29344f0, (q31_t)0x77a8f3ea, (q31_t)0xd28d6531, (q31_t)0x77a6b8a9, (q31_t)0xd287858e, (q31_t)0x77a47d1d, (q31_t)0xd281a607, + (q31_t)0x77a24148, (q31_t)0xd27bc69c, (q31_t)0x77a00529, (q31_t)0xd275e74d, (q31_t)0x779dc8c0, (q31_t)0xd270081b, (q31_t)0x779b8c0e, (q31_t)0xd26a2904, + (q31_t)0x77994f11, (q31_t)0xd2644a0a, (q31_t)0x779711cb, (q31_t)0xd25e6b2b, (q31_t)0x7794d43b, (q31_t)0xd2588c69, (q31_t)0x77929661, (q31_t)0xd252adc3, + (q31_t)0x7790583e, (q31_t)0xd24ccf39, (q31_t)0x778e19d0, (q31_t)0xd246f0cb, (q31_t)0x778bdb19, (q31_t)0xd241127a, (q31_t)0x77899c19, (q31_t)0xd23b3444, + (q31_t)0x77875cce, (q31_t)0xd235562b, (q31_t)0x77851d3a, (q31_t)0xd22f782f, (q31_t)0x7782dd5c, (q31_t)0xd2299a4e, (q31_t)0x77809d35, (q31_t)0xd223bc8a, + (q31_t)0x777e5cc3, (q31_t)0xd21ddee2, (q31_t)0x777c1c08, (q31_t)0xd2180156, (q31_t)0x7779db03, (q31_t)0xd21223e7, (q31_t)0x777799b5, (q31_t)0xd20c4694, + (q31_t)0x7775581d, (q31_t)0xd206695d, (q31_t)0x7773163b, (q31_t)0xd2008c43, (q31_t)0x7770d40f, (q31_t)0xd1faaf45, (q31_t)0x776e919a, (q31_t)0xd1f4d263, + (q31_t)0x776c4edb, (q31_t)0xd1eef59e, (q31_t)0x776a0bd3, (q31_t)0xd1e918f5, (q31_t)0x7767c880, (q31_t)0xd1e33c69, (q31_t)0x776584e5, (q31_t)0xd1dd5ff9, + (q31_t)0x776340ff, (q31_t)0xd1d783a6, (q31_t)0x7760fcd0, (q31_t)0xd1d1a76f, (q31_t)0x775eb857, (q31_t)0xd1cbcb54, (q31_t)0x775c7395, (q31_t)0xd1c5ef56, + (q31_t)0x775a2e89, (q31_t)0xd1c01375, (q31_t)0x7757e933, (q31_t)0xd1ba37b0, (q31_t)0x7755a394, (q31_t)0xd1b45c08, (q31_t)0x77535dab, (q31_t)0xd1ae807c, + (q31_t)0x77511778, (q31_t)0xd1a8a50d, (q31_t)0x774ed0fc, (q31_t)0xd1a2c9ba, (q31_t)0x774c8a36, (q31_t)0xd19cee84, (q31_t)0x774a4327, (q31_t)0xd197136b, + (q31_t)0x7747fbce, (q31_t)0xd191386e, (q31_t)0x7745b42c, (q31_t)0xd18b5d8e, (q31_t)0x77436c40, (q31_t)0xd18582ca, (q31_t)0x7741240a, (q31_t)0xd17fa823, + (q31_t)0x773edb8b, (q31_t)0xd179cd99, (q31_t)0x773c92c2, (q31_t)0xd173f32c, (q31_t)0x773a49b0, (q31_t)0xd16e18db, (q31_t)0x77380054, (q31_t)0xd1683ea7, + (q31_t)0x7735b6af, (q31_t)0xd1626490, (q31_t)0x77336cc0, (q31_t)0xd15c8a95, (q31_t)0x77312287, (q31_t)0xd156b0b7, (q31_t)0x772ed805, (q31_t)0xd150d6f6, + (q31_t)0x772c8d3a, (q31_t)0xd14afd52, (q31_t)0x772a4225, (q31_t)0xd14523cb, (q31_t)0x7727f6c6, (q31_t)0xd13f4a60, (q31_t)0x7725ab1f, (q31_t)0xd1397113, + (q31_t)0x77235f2d, (q31_t)0xd13397e2, (q31_t)0x772112f2, (q31_t)0xd12dbece, (q31_t)0x771ec66e, (q31_t)0xd127e5d7, (q31_t)0x771c79a0, (q31_t)0xd1220cfc, + (q31_t)0x771a2c88, (q31_t)0xd11c343f, (q31_t)0x7717df27, (q31_t)0xd1165b9f, (q31_t)0x7715917d, (q31_t)0xd110831b, (q31_t)0x77134389, (q31_t)0xd10aaab5, + (q31_t)0x7710f54c, (q31_t)0xd104d26b, (q31_t)0x770ea6c5, (q31_t)0xd0fefa3f, (q31_t)0x770c57f5, (q31_t)0xd0f9222f, (q31_t)0x770a08dc, (q31_t)0xd0f34a3d, + (q31_t)0x7707b979, (q31_t)0xd0ed7267, (q31_t)0x770569cc, (q31_t)0xd0e79aaf, (q31_t)0x770319d6, (q31_t)0xd0e1c313, (q31_t)0x7700c997, (q31_t)0xd0dbeb95, + (q31_t)0x76fe790e, (q31_t)0xd0d61434, (q31_t)0x76fc283c, (q31_t)0xd0d03cf0, (q31_t)0x76f9d721, (q31_t)0xd0ca65c9, (q31_t)0x76f785bc, (q31_t)0xd0c48ebf, + (q31_t)0x76f5340e, (q31_t)0xd0beb7d2, (q31_t)0x76f2e216, (q31_t)0xd0b8e102, (q31_t)0x76f08fd5, (q31_t)0xd0b30a50, (q31_t)0x76ee3d4b, (q31_t)0xd0ad33ba, + (q31_t)0x76ebea77, (q31_t)0xd0a75d42, (q31_t)0x76e9975a, (q31_t)0xd0a186e7, (q31_t)0x76e743f4, (q31_t)0xd09bb0aa, (q31_t)0x76e4f044, (q31_t)0xd095da89, + (q31_t)0x76e29c4b, (q31_t)0xd0900486, (q31_t)0x76e04808, (q31_t)0xd08a2ea0, (q31_t)0x76ddf37c, (q31_t)0xd08458d7, (q31_t)0x76db9ea7, (q31_t)0xd07e832c, + (q31_t)0x76d94989, (q31_t)0xd078ad9e, (q31_t)0x76d6f421, (q31_t)0xd072d82d, (q31_t)0x76d49e70, (q31_t)0xd06d02da, (q31_t)0x76d24876, (q31_t)0xd0672da3, + (q31_t)0x76cff232, (q31_t)0xd061588b, (q31_t)0x76cd9ba5, (q31_t)0xd05b838f, (q31_t)0x76cb44cf, (q31_t)0xd055aeb1, (q31_t)0x76c8edb0, (q31_t)0xd04fd9f1, + (q31_t)0x76c69647, (q31_t)0xd04a054e, (q31_t)0x76c43e95, (q31_t)0xd04430c8, (q31_t)0x76c1e699, (q31_t)0xd03e5c60, (q31_t)0x76bf8e55, (q31_t)0xd0388815, + (q31_t)0x76bd35c7, (q31_t)0xd032b3e7, (q31_t)0x76badcf0, (q31_t)0xd02cdfd8, (q31_t)0x76b883d0, (q31_t)0xd0270be5, (q31_t)0x76b62a66, (q31_t)0xd0213810, + (q31_t)0x76b3d0b4, (q31_t)0xd01b6459, (q31_t)0x76b176b8, (q31_t)0xd01590bf, (q31_t)0x76af1c72, (q31_t)0xd00fbd43, (q31_t)0x76acc1e4, (q31_t)0xd009e9e4, + (q31_t)0x76aa670d, (q31_t)0xd00416a3, (q31_t)0x76a80bec, (q31_t)0xcffe4380, (q31_t)0x76a5b082, (q31_t)0xcff8707a, (q31_t)0x76a354cf, (q31_t)0xcff29d92, + (q31_t)0x76a0f8d2, (q31_t)0xcfeccac7, (q31_t)0x769e9c8d, (q31_t)0xcfe6f81a, (q31_t)0x769c3ffe, (q31_t)0xcfe1258b, (q31_t)0x7699e326, (q31_t)0xcfdb531a, + (q31_t)0x76978605, (q31_t)0xcfd580c6, (q31_t)0x7695289b, (q31_t)0xcfcfae8f, (q31_t)0x7692cae8, (q31_t)0xcfc9dc77, (q31_t)0x76906ceb, (q31_t)0xcfc40a7c, + (q31_t)0x768e0ea6, (q31_t)0xcfbe389f, (q31_t)0x768bb017, (q31_t)0xcfb866e0, (q31_t)0x7689513f, (q31_t)0xcfb2953f, (q31_t)0x7686f21e, (q31_t)0xcfacc3bb, + (q31_t)0x768492b4, (q31_t)0xcfa6f255, (q31_t)0x76823301, (q31_t)0xcfa1210d, (q31_t)0x767fd304, (q31_t)0xcf9b4fe3, (q31_t)0x767d72bf, (q31_t)0xcf957ed7, + (q31_t)0x767b1231, (q31_t)0xcf8fade9, (q31_t)0x7678b159, (q31_t)0xcf89dd18, (q31_t)0x76765038, (q31_t)0xcf840c65, (q31_t)0x7673eecf, (q31_t)0xcf7e3bd1, + (q31_t)0x76718d1c, (q31_t)0xcf786b5a, (q31_t)0x766f2b20, (q31_t)0xcf729b01, (q31_t)0x766cc8db, (q31_t)0xcf6ccac6, (q31_t)0x766a664d, (q31_t)0xcf66faa9, + (q31_t)0x76680376, (q31_t)0xcf612aaa, (q31_t)0x7665a056, (q31_t)0xcf5b5ac9, (q31_t)0x76633ced, (q31_t)0xcf558b06, (q31_t)0x7660d93b, (q31_t)0xcf4fbb61, + (q31_t)0x765e7540, (q31_t)0xcf49ebda, (q31_t)0x765c10fc, (q31_t)0xcf441c71, (q31_t)0x7659ac6f, (q31_t)0xcf3e4d26, (q31_t)0x76574798, (q31_t)0xcf387dfa, + (q31_t)0x7654e279, (q31_t)0xcf32aeeb, (q31_t)0x76527d11, (q31_t)0xcf2cdffa, (q31_t)0x76501760, (q31_t)0xcf271128, (q31_t)0x764db166, (q31_t)0xcf214274, + (q31_t)0x764b4b23, (q31_t)0xcf1b73de, (q31_t)0x7648e497, (q31_t)0xcf15a566, (q31_t)0x76467dc2, (q31_t)0xcf0fd70c, (q31_t)0x764416a4, (q31_t)0xcf0a08d0, + (q31_t)0x7641af3d, (q31_t)0xcf043ab3, (q31_t)0x763f478d, (q31_t)0xcefe6cb3, (q31_t)0x763cdf94, (q31_t)0xcef89ed2, (q31_t)0x763a7752, (q31_t)0xcef2d110, + (q31_t)0x76380ec8, (q31_t)0xceed036b, (q31_t)0x7635a5f4, (q31_t)0xcee735e5, (q31_t)0x76333cd8, (q31_t)0xcee1687d, (q31_t)0x7630d372, (q31_t)0xcedb9b33, + (q31_t)0x762e69c4, (q31_t)0xced5ce08, (q31_t)0x762bffcd, (q31_t)0xced000fb, (q31_t)0x7629958c, (q31_t)0xceca340c, (q31_t)0x76272b03, (q31_t)0xcec4673c, + (q31_t)0x7624c031, (q31_t)0xcebe9a8a, (q31_t)0x76225517, (q31_t)0xceb8cdf7, (q31_t)0x761fe9b3, (q31_t)0xceb30181, (q31_t)0x761d7e06, (q31_t)0xcead352b, + (q31_t)0x761b1211, (q31_t)0xcea768f2, (q31_t)0x7618a5d3, (q31_t)0xcea19cd8, (q31_t)0x7616394c, (q31_t)0xce9bd0dd, (q31_t)0x7613cc7c, (q31_t)0xce960500, + (q31_t)0x76115f63, (q31_t)0xce903942, (q31_t)0x760ef201, (q31_t)0xce8a6da2, (q31_t)0x760c8457, (q31_t)0xce84a220, (q31_t)0x760a1664, (q31_t)0xce7ed6bd, + (q31_t)0x7607a828, (q31_t)0xce790b79, (q31_t)0x760539a3, (q31_t)0xce734053, (q31_t)0x7602cad5, (q31_t)0xce6d754c, (q31_t)0x76005bbf, (q31_t)0xce67aa63, + (q31_t)0x75fdec60, (q31_t)0xce61df99, (q31_t)0x75fb7cb8, (q31_t)0xce5c14ed, (q31_t)0x75f90cc7, (q31_t)0xce564a60, (q31_t)0x75f69c8d, (q31_t)0xce507ff2, + (q31_t)0x75f42c0b, (q31_t)0xce4ab5a2, (q31_t)0x75f1bb40, (q31_t)0xce44eb71, (q31_t)0x75ef4a2c, (q31_t)0xce3f215f, (q31_t)0x75ecd8cf, (q31_t)0xce39576c, + (q31_t)0x75ea672a, (q31_t)0xce338d97, (q31_t)0x75e7f53c, (q31_t)0xce2dc3e1, (q31_t)0x75e58305, (q31_t)0xce27fa49, (q31_t)0x75e31086, (q31_t)0xce2230d0, + (q31_t)0x75e09dbd, (q31_t)0xce1c6777, (q31_t)0x75de2aac, (q31_t)0xce169e3b, (q31_t)0x75dbb753, (q31_t)0xce10d51f, (q31_t)0x75d943b0, (q31_t)0xce0b0c21, + (q31_t)0x75d6cfc5, (q31_t)0xce054343, (q31_t)0x75d45b92, (q31_t)0xcdff7a83, (q31_t)0x75d1e715, (q31_t)0xcdf9b1e2, (q31_t)0x75cf7250, (q31_t)0xcdf3e95f, + (q31_t)0x75ccfd42, (q31_t)0xcdee20fc, (q31_t)0x75ca87ec, (q31_t)0xcde858b8, (q31_t)0x75c8124d, (q31_t)0xcde29092, (q31_t)0x75c59c65, (q31_t)0xcddcc88b, + (q31_t)0x75c32634, (q31_t)0xcdd700a4, (q31_t)0x75c0afbb, (q31_t)0xcdd138db, (q31_t)0x75be38fa, (q31_t)0xcdcb7131, (q31_t)0x75bbc1ef, (q31_t)0xcdc5a9a6, + (q31_t)0x75b94a9c, (q31_t)0xcdbfe23a, (q31_t)0x75b6d301, (q31_t)0xcdba1aee, (q31_t)0x75b45b1d, (q31_t)0xcdb453c0, (q31_t)0x75b1e2f0, (q31_t)0xcdae8cb1, + (q31_t)0x75af6a7b, (q31_t)0xcda8c5c1, (q31_t)0x75acf1bd, (q31_t)0xcda2fef0, (q31_t)0x75aa78b6, (q31_t)0xcd9d383f, (q31_t)0x75a7ff67, (q31_t)0xcd9771ac, + (q31_t)0x75a585cf, (q31_t)0xcd91ab39, (q31_t)0x75a30bef, (q31_t)0xcd8be4e4, (q31_t)0x75a091c6, (q31_t)0xcd861eaf, (q31_t)0x759e1755, (q31_t)0xcd805899, + (q31_t)0x759b9c9b, (q31_t)0xcd7a92a2, (q31_t)0x75992198, (q31_t)0xcd74ccca, (q31_t)0x7596a64d, (q31_t)0xcd6f0711, (q31_t)0x75942ab9, (q31_t)0xcd694178, + (q31_t)0x7591aedd, (q31_t)0xcd637bfe, (q31_t)0x758f32b9, (q31_t)0xcd5db6a3, (q31_t)0x758cb64c, (q31_t)0xcd57f167, (q31_t)0x758a3996, (q31_t)0xcd522c4a, + (q31_t)0x7587bc98, (q31_t)0xcd4c674d, (q31_t)0x75853f51, (q31_t)0xcd46a26f, (q31_t)0x7582c1c2, (q31_t)0xcd40ddb0, (q31_t)0x758043ea, (q31_t)0xcd3b1911, + (q31_t)0x757dc5ca, (q31_t)0xcd355491, (q31_t)0x757b4762, (q31_t)0xcd2f9030, (q31_t)0x7578c8b0, (q31_t)0xcd29cbee, (q31_t)0x757649b7, (q31_t)0xcd2407cc, + (q31_t)0x7573ca75, (q31_t)0xcd1e43ca, (q31_t)0x75714aea, (q31_t)0xcd187fe6, (q31_t)0x756ecb18, (q31_t)0xcd12bc22, (q31_t)0x756c4afc, (q31_t)0xcd0cf87e, + (q31_t)0x7569ca99, (q31_t)0xcd0734f9, (q31_t)0x756749ec, (q31_t)0xcd017193, (q31_t)0x7564c8f8, (q31_t)0xccfbae4d, (q31_t)0x756247bb, (q31_t)0xccf5eb26, + (q31_t)0x755fc635, (q31_t)0xccf0281f, (q31_t)0x755d4467, (q31_t)0xccea6538, (q31_t)0x755ac251, (q31_t)0xcce4a26f, (q31_t)0x75583ff3, (q31_t)0xccdedfc7, + (q31_t)0x7555bd4c, (q31_t)0xccd91d3d, (q31_t)0x75533a5c, (q31_t)0xccd35ad4, (q31_t)0x7550b725, (q31_t)0xcccd988a, (q31_t)0x754e33a4, (q31_t)0xccc7d65f, + (q31_t)0x754bafdc, (q31_t)0xccc21455, (q31_t)0x75492bcb, (q31_t)0xccbc5269, (q31_t)0x7546a772, (q31_t)0xccb6909e, (q31_t)0x754422d0, (q31_t)0xccb0cef2, + (q31_t)0x75419de7, (q31_t)0xccab0d65, (q31_t)0x753f18b4, (q31_t)0xcca54bf9, (q31_t)0x753c933a, (q31_t)0xcc9f8aac, (q31_t)0x753a0d77, (q31_t)0xcc99c97e, + (q31_t)0x7537876c, (q31_t)0xcc940871, (q31_t)0x75350118, (q31_t)0xcc8e4783, (q31_t)0x75327a7d, (q31_t)0xcc8886b5, (q31_t)0x752ff399, (q31_t)0xcc82c607, + (q31_t)0x752d6c6c, (q31_t)0xcc7d0578, (q31_t)0x752ae4f8, (q31_t)0xcc774509, (q31_t)0x75285d3b, (q31_t)0xcc7184ba, (q31_t)0x7525d536, (q31_t)0xcc6bc48b, + (q31_t)0x75234ce8, (q31_t)0xcc66047b, (q31_t)0x7520c453, (q31_t)0xcc60448c, (q31_t)0x751e3b75, (q31_t)0xcc5a84bc, (q31_t)0x751bb24f, (q31_t)0xcc54c50c, + (q31_t)0x751928e0, (q31_t)0xcc4f057c, (q31_t)0x75169f2a, (q31_t)0xcc49460c, (q31_t)0x7514152b, (q31_t)0xcc4386bc, (q31_t)0x75118ae4, (q31_t)0xcc3dc78b, + (q31_t)0x750f0054, (q31_t)0xcc38087b, (q31_t)0x750c757d, (q31_t)0xcc32498a, (q31_t)0x7509ea5d, (q31_t)0xcc2c8aba, (q31_t)0x75075ef5, (q31_t)0xcc26cc09, + (q31_t)0x7504d345, (q31_t)0xcc210d79, (q31_t)0x7502474d, (q31_t)0xcc1b4f08, (q31_t)0x74ffbb0d, (q31_t)0xcc1590b8, (q31_t)0x74fd2e84, (q31_t)0xcc0fd287, + (q31_t)0x74faa1b3, (q31_t)0xcc0a1477, (q31_t)0x74f8149a, (q31_t)0xcc045686, (q31_t)0x74f58739, (q31_t)0xcbfe98b6, (q31_t)0x74f2f990, (q31_t)0xcbf8db05, + (q31_t)0x74f06b9e, (q31_t)0xcbf31d75, (q31_t)0x74eddd65, (q31_t)0xcbed6005, (q31_t)0x74eb4ee3, (q31_t)0xcbe7a2b5, (q31_t)0x74e8c01a, (q31_t)0xcbe1e585, + (q31_t)0x74e63108, (q31_t)0xcbdc2876, (q31_t)0x74e3a1ae, (q31_t)0xcbd66b86, (q31_t)0x74e1120c, (q31_t)0xcbd0aeb7, (q31_t)0x74de8221, (q31_t)0xcbcaf208, + (q31_t)0x74dbf1ef, (q31_t)0xcbc53579, (q31_t)0x74d96175, (q31_t)0xcbbf790a, (q31_t)0x74d6d0b2, (q31_t)0xcbb9bcbb, (q31_t)0x74d43fa8, (q31_t)0xcbb4008d, + (q31_t)0x74d1ae55, (q31_t)0xcbae447f, (q31_t)0x74cf1cbb, (q31_t)0xcba88891, (q31_t)0x74cc8ad8, (q31_t)0xcba2ccc4, (q31_t)0x74c9f8ad, (q31_t)0xcb9d1117, + (q31_t)0x74c7663a, (q31_t)0xcb97558a, (q31_t)0x74c4d380, (q31_t)0xcb919a1d, (q31_t)0x74c2407d, (q31_t)0xcb8bded1, (q31_t)0x74bfad32, (q31_t)0xcb8623a5, + (q31_t)0x74bd199f, (q31_t)0xcb80689a, (q31_t)0x74ba85c4, (q31_t)0xcb7aadaf, (q31_t)0x74b7f1a1, (q31_t)0xcb74f2e4, (q31_t)0x74b55d36, (q31_t)0xcb6f383a, + (q31_t)0x74b2c884, (q31_t)0xcb697db0, (q31_t)0x74b03389, (q31_t)0xcb63c347, (q31_t)0x74ad9e46, (q31_t)0xcb5e08fe, (q31_t)0x74ab08bb, (q31_t)0xcb584ed6, + (q31_t)0x74a872e8, (q31_t)0xcb5294ce, (q31_t)0x74a5dccd, (q31_t)0xcb4cdae6, (q31_t)0x74a3466b, (q31_t)0xcb47211f, (q31_t)0x74a0afc0, (q31_t)0xcb416779, + (q31_t)0x749e18cd, (q31_t)0xcb3badf3, (q31_t)0x749b8193, (q31_t)0xcb35f48d, (q31_t)0x7498ea11, (q31_t)0xcb303b49, (q31_t)0x74965246, (q31_t)0xcb2a8224, + (q31_t)0x7493ba34, (q31_t)0xcb24c921, (q31_t)0x749121da, (q31_t)0xcb1f103e, (q31_t)0x748e8938, (q31_t)0xcb19577b, (q31_t)0x748bf04d, (q31_t)0xcb139ed9, + (q31_t)0x7489571c, (q31_t)0xcb0de658, (q31_t)0x7486bda2, (q31_t)0xcb082df8, (q31_t)0x748423e0, (q31_t)0xcb0275b8, (q31_t)0x748189d7, (q31_t)0xcafcbd99, + (q31_t)0x747eef85, (q31_t)0xcaf7059a, (q31_t)0x747c54ec, (q31_t)0xcaf14dbd, (q31_t)0x7479ba0b, (q31_t)0xcaeb9600, (q31_t)0x74771ee2, (q31_t)0xcae5de64, + (q31_t)0x74748371, (q31_t)0xcae026e8, (q31_t)0x7471e7b8, (q31_t)0xcada6f8d, (q31_t)0x746f4bb8, (q31_t)0xcad4b853, (q31_t)0x746caf70, (q31_t)0xcacf013a, + (q31_t)0x746a12df, (q31_t)0xcac94a42, (q31_t)0x74677608, (q31_t)0xcac3936b, (q31_t)0x7464d8e8, (q31_t)0xcabddcb4, (q31_t)0x74623b80, (q31_t)0xcab8261e, + (q31_t)0x745f9dd1, (q31_t)0xcab26fa9, (q31_t)0x745cffda, (q31_t)0xcaacb955, (q31_t)0x745a619b, (q31_t)0xcaa70322, (q31_t)0x7457c314, (q31_t)0xcaa14d10, + (q31_t)0x74552446, (q31_t)0xca9b971e, (q31_t)0x74528530, (q31_t)0xca95e14e, (q31_t)0x744fe5d2, (q31_t)0xca902b9f, (q31_t)0x744d462c, (q31_t)0xca8a7610, + (q31_t)0x744aa63f, (q31_t)0xca84c0a3, (q31_t)0x7448060a, (q31_t)0xca7f0b56, (q31_t)0x7445658d, (q31_t)0xca79562b, (q31_t)0x7442c4c8, (q31_t)0xca73a120, + (q31_t)0x744023bc, (q31_t)0xca6dec37, (q31_t)0x743d8268, (q31_t)0xca68376e, (q31_t)0x743ae0cc, (q31_t)0xca6282c7, (q31_t)0x74383ee9, (q31_t)0xca5cce40, + (q31_t)0x74359cbd, (q31_t)0xca5719db, (q31_t)0x7432fa4b, (q31_t)0xca516597, (q31_t)0x74305790, (q31_t)0xca4bb174, (q31_t)0x742db48e, (q31_t)0xca45fd72, + (q31_t)0x742b1144, (q31_t)0xca404992, (q31_t)0x74286db3, (q31_t)0xca3a95d2, (q31_t)0x7425c9da, (q31_t)0xca34e234, (q31_t)0x742325b9, (q31_t)0xca2f2eb6, + (q31_t)0x74208150, (q31_t)0xca297b5a, (q31_t)0x741ddca0, (q31_t)0xca23c820, (q31_t)0x741b37a9, (q31_t)0xca1e1506, (q31_t)0x74189269, (q31_t)0xca18620e, + (q31_t)0x7415ece2, (q31_t)0xca12af37, (q31_t)0x74134714, (q31_t)0xca0cfc81, (q31_t)0x7410a0fe, (q31_t)0xca0749ec, (q31_t)0x740dfaa0, (q31_t)0xca019779, + (q31_t)0x740b53fb, (q31_t)0xc9fbe527, (q31_t)0x7408ad0e, (q31_t)0xc9f632f6, (q31_t)0x740605d9, (q31_t)0xc9f080e7, (q31_t)0x74035e5d, (q31_t)0xc9eacef9, + (q31_t)0x7400b69a, (q31_t)0xc9e51d2d, (q31_t)0x73fe0e8f, (q31_t)0xc9df6b81, (q31_t)0x73fb663c, (q31_t)0xc9d9b9f7, (q31_t)0x73f8bda2, (q31_t)0xc9d4088f, + (q31_t)0x73f614c0, (q31_t)0xc9ce5748, (q31_t)0x73f36b97, (q31_t)0xc9c8a622, (q31_t)0x73f0c226, (q31_t)0xc9c2f51e, (q31_t)0x73ee186e, (q31_t)0xc9bd443c, + (q31_t)0x73eb6e6e, (q31_t)0xc9b7937a, (q31_t)0x73e8c426, (q31_t)0xc9b1e2db, (q31_t)0x73e61997, (q31_t)0xc9ac325d, (q31_t)0x73e36ec1, (q31_t)0xc9a68200, + (q31_t)0x73e0c3a3, (q31_t)0xc9a0d1c5, (q31_t)0x73de183e, (q31_t)0xc99b21ab, (q31_t)0x73db6c91, (q31_t)0xc99571b3, (q31_t)0x73d8c09d, (q31_t)0xc98fc1dc, + (q31_t)0x73d61461, (q31_t)0xc98a1227, (q31_t)0x73d367de, (q31_t)0xc9846294, (q31_t)0x73d0bb13, (q31_t)0xc97eb322, (q31_t)0x73ce0e01, (q31_t)0xc97903d2, + (q31_t)0x73cb60a8, (q31_t)0xc97354a4, (q31_t)0x73c8b307, (q31_t)0xc96da597, (q31_t)0x73c6051f, (q31_t)0xc967f6ac, (q31_t)0x73c356ef, (q31_t)0xc96247e2, + (q31_t)0x73c0a878, (q31_t)0xc95c993a, (q31_t)0x73bdf9b9, (q31_t)0xc956eab4, (q31_t)0x73bb4ab3, (q31_t)0xc9513c50, (q31_t)0x73b89b66, (q31_t)0xc94b8e0d, + (q31_t)0x73b5ebd1, (q31_t)0xc945dfec, (q31_t)0x73b33bf5, (q31_t)0xc94031ed, (q31_t)0x73b08bd1, (q31_t)0xc93a8410, (q31_t)0x73addb67, (q31_t)0xc934d654, + (q31_t)0x73ab2ab4, (q31_t)0xc92f28ba, (q31_t)0x73a879bb, (q31_t)0xc9297b42, (q31_t)0x73a5c87a, (q31_t)0xc923cdec, (q31_t)0x73a316f2, (q31_t)0xc91e20b8, + (q31_t)0x73a06522, (q31_t)0xc91873a5, (q31_t)0x739db30b, (q31_t)0xc912c6b5, (q31_t)0x739b00ad, (q31_t)0xc90d19e6, (q31_t)0x73984e07, (q31_t)0xc9076d39, + (q31_t)0x73959b1b, (q31_t)0xc901c0ae, (q31_t)0x7392e7e6, (q31_t)0xc8fc1445, (q31_t)0x7390346b, (q31_t)0xc8f667fe, (q31_t)0x738d80a8, (q31_t)0xc8f0bbd9, + (q31_t)0x738acc9e, (q31_t)0xc8eb0fd6, (q31_t)0x7388184d, (q31_t)0xc8e563f5, (q31_t)0x738563b5, (q31_t)0xc8dfb836, (q31_t)0x7382aed5, (q31_t)0xc8da0c99, + (q31_t)0x737ff9ae, (q31_t)0xc8d4611d, (q31_t)0x737d4440, (q31_t)0xc8ceb5c4, (q31_t)0x737a8e8a, (q31_t)0xc8c90a8d, (q31_t)0x7377d88d, (q31_t)0xc8c35f78, + (q31_t)0x73752249, (q31_t)0xc8bdb485, (q31_t)0x73726bbe, (q31_t)0xc8b809b4, (q31_t)0x736fb4ec, (q31_t)0xc8b25f06, (q31_t)0x736cfdd2, (q31_t)0xc8acb479, + (q31_t)0x736a4671, (q31_t)0xc8a70a0e, (q31_t)0x73678ec9, (q31_t)0xc8a15fc6, (q31_t)0x7364d6da, (q31_t)0xc89bb5a0, (q31_t)0x73621ea4, (q31_t)0xc8960b9c, + (q31_t)0x735f6626, (q31_t)0xc89061ba, (q31_t)0x735cad61, (q31_t)0xc88ab7fa, (q31_t)0x7359f456, (q31_t)0xc8850e5d, (q31_t)0x73573b03, (q31_t)0xc87f64e2, + (q31_t)0x73548168, (q31_t)0xc879bb89, (q31_t)0x7351c787, (q31_t)0xc8741252, (q31_t)0x734f0d5f, (q31_t)0xc86e693d, (q31_t)0x734c52ef, (q31_t)0xc868c04b, + (q31_t)0x73499838, (q31_t)0xc863177b, (q31_t)0x7346dd3a, (q31_t)0xc85d6ece, (q31_t)0x734421f6, (q31_t)0xc857c642, (q31_t)0x7341666a, (q31_t)0xc8521dd9, + (q31_t)0x733eaa96, (q31_t)0xc84c7593, (q31_t)0x733bee7c, (q31_t)0xc846cd6e, (q31_t)0x7339321b, (q31_t)0xc841256d, (q31_t)0x73367572, (q31_t)0xc83b7d8d, + (q31_t)0x7333b883, (q31_t)0xc835d5d0, (q31_t)0x7330fb4d, (q31_t)0xc8302e35, (q31_t)0x732e3dcf, (q31_t)0xc82a86bd, (q31_t)0x732b800a, (q31_t)0xc824df67, + (q31_t)0x7328c1ff, (q31_t)0xc81f3834, (q31_t)0x732603ac, (q31_t)0xc8199123, (q31_t)0x73234512, (q31_t)0xc813ea35, (q31_t)0x73208632, (q31_t)0xc80e4369, + (q31_t)0x731dc70a, (q31_t)0xc8089cbf, (q31_t)0x731b079b, (q31_t)0xc802f638, (q31_t)0x731847e5, (q31_t)0xc7fd4fd4, (q31_t)0x731587e8, (q31_t)0xc7f7a992, + (q31_t)0x7312c7a5, (q31_t)0xc7f20373, (q31_t)0x7310071a, (q31_t)0xc7ec5d76, (q31_t)0x730d4648, (q31_t)0xc7e6b79c, (q31_t)0x730a8530, (q31_t)0xc7e111e5, + (q31_t)0x7307c3d0, (q31_t)0xc7db6c50, (q31_t)0x73050229, (q31_t)0xc7d5c6de, (q31_t)0x7302403c, (q31_t)0xc7d0218e, (q31_t)0x72ff7e07, (q31_t)0xc7ca7c61, + (q31_t)0x72fcbb8c, (q31_t)0xc7c4d757, (q31_t)0x72f9f8c9, (q31_t)0xc7bf3270, (q31_t)0x72f735c0, (q31_t)0xc7b98dab, (q31_t)0x72f47270, (q31_t)0xc7b3e909, + (q31_t)0x72f1aed9, (q31_t)0xc7ae4489, (q31_t)0x72eeeafb, (q31_t)0xc7a8a02c, (q31_t)0x72ec26d6, (q31_t)0xc7a2fbf3, (q31_t)0x72e9626a, (q31_t)0xc79d57db, + (q31_t)0x72e69db7, (q31_t)0xc797b3e7, (q31_t)0x72e3d8be, (q31_t)0xc7921015, (q31_t)0x72e1137d, (q31_t)0xc78c6c67, (q31_t)0x72de4df6, (q31_t)0xc786c8db, + (q31_t)0x72db8828, (q31_t)0xc7812572, (q31_t)0x72d8c213, (q31_t)0xc77b822b, (q31_t)0x72d5fbb7, (q31_t)0xc775df08, (q31_t)0x72d33514, (q31_t)0xc7703c08, + (q31_t)0x72d06e2b, (q31_t)0xc76a992a, (q31_t)0x72cda6fb, (q31_t)0xc764f66f, (q31_t)0x72cadf83, (q31_t)0xc75f53d7, (q31_t)0x72c817c6, (q31_t)0xc759b163, + (q31_t)0x72c54fc1, (q31_t)0xc7540f11, (q31_t)0x72c28775, (q31_t)0xc74e6ce2, (q31_t)0x72bfbee3, (q31_t)0xc748cad6, (q31_t)0x72bcf60a, (q31_t)0xc74328ed, + (q31_t)0x72ba2cea, (q31_t)0xc73d8727, (q31_t)0x72b76383, (q31_t)0xc737e584, (q31_t)0x72b499d6, (q31_t)0xc7324404, (q31_t)0x72b1cfe1, (q31_t)0xc72ca2a7, + (q31_t)0x72af05a7, (q31_t)0xc727016d, (q31_t)0x72ac3b25, (q31_t)0xc7216056, (q31_t)0x72a9705c, (q31_t)0xc71bbf62, (q31_t)0x72a6a54d, (q31_t)0xc7161e92, + (q31_t)0x72a3d9f7, (q31_t)0xc7107de4, (q31_t)0x72a10e5b, (q31_t)0xc70add5a, (q31_t)0x729e4277, (q31_t)0xc7053cf2, (q31_t)0x729b764d, (q31_t)0xc6ff9cae, + (q31_t)0x7298a9dd, (q31_t)0xc6f9fc8d, (q31_t)0x7295dd25, (q31_t)0xc6f45c8f, (q31_t)0x72931027, (q31_t)0xc6eebcb5, (q31_t)0x729042e3, (q31_t)0xc6e91cfd, + (q31_t)0x728d7557, (q31_t)0xc6e37d69, (q31_t)0x728aa785, (q31_t)0xc6ddddf8, (q31_t)0x7287d96c, (q31_t)0xc6d83eab, (q31_t)0x72850b0d, (q31_t)0xc6d29f80, + (q31_t)0x72823c67, (q31_t)0xc6cd0079, (q31_t)0x727f6d7a, (q31_t)0xc6c76195, (q31_t)0x727c9e47, (q31_t)0xc6c1c2d4, (q31_t)0x7279cecd, (q31_t)0xc6bc2437, + (q31_t)0x7276ff0d, (q31_t)0xc6b685bd, (q31_t)0x72742f05, (q31_t)0xc6b0e767, (q31_t)0x72715eb8, (q31_t)0xc6ab4933, (q31_t)0x726e8e23, (q31_t)0xc6a5ab23, + (q31_t)0x726bbd48, (q31_t)0xc6a00d37, (q31_t)0x7268ec27, (q31_t)0xc69a6f6e, (q31_t)0x72661abf, (q31_t)0xc694d1c8, (q31_t)0x72634910, (q31_t)0xc68f3446, + (q31_t)0x7260771b, (q31_t)0xc68996e7, (q31_t)0x725da4df, (q31_t)0xc683f9ab, (q31_t)0x725ad25d, (q31_t)0xc67e5c93, (q31_t)0x7257ff94, (q31_t)0xc678bf9f, + (q31_t)0x72552c85, (q31_t)0xc67322ce, (q31_t)0x7252592f, (q31_t)0xc66d8620, (q31_t)0x724f8593, (q31_t)0xc667e996, (q31_t)0x724cb1b0, (q31_t)0xc6624d30, + (q31_t)0x7249dd86, (q31_t)0xc65cb0ed, (q31_t)0x72470916, (q31_t)0xc65714cd, (q31_t)0x72443460, (q31_t)0xc65178d1, (q31_t)0x72415f63, (q31_t)0xc64bdcf9, + (q31_t)0x723e8a20, (q31_t)0xc6464144, (q31_t)0x723bb496, (q31_t)0xc640a5b3, (q31_t)0x7238dec5, (q31_t)0xc63b0a46, (q31_t)0x723608af, (q31_t)0xc6356efc, + (q31_t)0x72333251, (q31_t)0xc62fd3d6, (q31_t)0x72305bae, (q31_t)0xc62a38d4, (q31_t)0x722d84c4, (q31_t)0xc6249df5, (q31_t)0x722aad93, (q31_t)0xc61f033a, + (q31_t)0x7227d61c, (q31_t)0xc61968a2, (q31_t)0x7224fe5f, (q31_t)0xc613ce2f, (q31_t)0x7222265b, (q31_t)0xc60e33df, (q31_t)0x721f4e11, (q31_t)0xc60899b2, + (q31_t)0x721c7580, (q31_t)0xc602ffaa, (q31_t)0x72199ca9, (q31_t)0xc5fd65c5, (q31_t)0x7216c38c, (q31_t)0xc5f7cc04, (q31_t)0x7213ea28, (q31_t)0xc5f23267, + (q31_t)0x7211107e, (q31_t)0xc5ec98ee, (q31_t)0x720e368d, (q31_t)0xc5e6ff98, (q31_t)0x720b5c57, (q31_t)0xc5e16667, (q31_t)0x720881d9, (q31_t)0xc5dbcd59, + (q31_t)0x7205a716, (q31_t)0xc5d6346f, (q31_t)0x7202cc0c, (q31_t)0xc5d09ba9, (q31_t)0x71fff0bc, (q31_t)0xc5cb0307, (q31_t)0x71fd1525, (q31_t)0xc5c56a89, + (q31_t)0x71fa3949, (q31_t)0xc5bfd22e, (q31_t)0x71f75d25, (q31_t)0xc5ba39f8, (q31_t)0x71f480bc, (q31_t)0xc5b4a1e5, (q31_t)0x71f1a40c, (q31_t)0xc5af09f7, + (q31_t)0x71eec716, (q31_t)0xc5a9722c, (q31_t)0x71ebe9da, (q31_t)0xc5a3da86, (q31_t)0x71e90c57, (q31_t)0xc59e4303, (q31_t)0x71e62e8f, (q31_t)0xc598aba5, + (q31_t)0x71e35080, (q31_t)0xc593146a, (q31_t)0x71e0722a, (q31_t)0xc58d7d54, (q31_t)0x71dd938f, (q31_t)0xc587e661, (q31_t)0x71dab4ad, (q31_t)0xc5824f93, + (q31_t)0x71d7d585, (q31_t)0xc57cb8e9, (q31_t)0x71d4f617, (q31_t)0xc5772263, (q31_t)0x71d21662, (q31_t)0xc5718c00, (q31_t)0x71cf3667, (q31_t)0xc56bf5c2, + (q31_t)0x71cc5626, (q31_t)0xc5665fa9, (q31_t)0x71c9759f, (q31_t)0xc560c9b3, (q31_t)0x71c694d2, (q31_t)0xc55b33e2, (q31_t)0x71c3b3bf, (q31_t)0xc5559e34, + (q31_t)0x71c0d265, (q31_t)0xc55008ab, (q31_t)0x71bdf0c5, (q31_t)0xc54a7346, (q31_t)0x71bb0edf, (q31_t)0xc544de05, (q31_t)0x71b82cb3, (q31_t)0xc53f48e9, + (q31_t)0x71b54a41, (q31_t)0xc539b3f1, (q31_t)0x71b26788, (q31_t)0xc5341f1d, (q31_t)0x71af848a, (q31_t)0xc52e8a6d, (q31_t)0x71aca145, (q31_t)0xc528f5e1, + (q31_t)0x71a9bdba, (q31_t)0xc523617a, (q31_t)0x71a6d9e9, (q31_t)0xc51dcd37, (q31_t)0x71a3f5d2, (q31_t)0xc5183919, (q31_t)0x71a11175, (q31_t)0xc512a51f, + (q31_t)0x719e2cd2, (q31_t)0xc50d1149, (q31_t)0x719b47e9, (q31_t)0xc5077d97, (q31_t)0x719862b9, (q31_t)0xc501ea0a, (q31_t)0x71957d44, (q31_t)0xc4fc56a2, + (q31_t)0x71929789, (q31_t)0xc4f6c35d, (q31_t)0x718fb187, (q31_t)0xc4f1303d, (q31_t)0x718ccb3f, (q31_t)0xc4eb9d42, (q31_t)0x7189e4b2, (q31_t)0xc4e60a6b, + (q31_t)0x7186fdde, (q31_t)0xc4e077b8, (q31_t)0x718416c4, (q31_t)0xc4dae52a, (q31_t)0x71812f65, (q31_t)0xc4d552c1, (q31_t)0x717e47bf, (q31_t)0xc4cfc07c, + (q31_t)0x717b5fd3, (q31_t)0xc4ca2e5b, (q31_t)0x717877a1, (q31_t)0xc4c49c5f, (q31_t)0x71758f29, (q31_t)0xc4bf0a87, (q31_t)0x7172a66c, (q31_t)0xc4b978d4, + (q31_t)0x716fbd68, (q31_t)0xc4b3e746, (q31_t)0x716cd41e, (q31_t)0xc4ae55dc, (q31_t)0x7169ea8f, (q31_t)0xc4a8c497, (q31_t)0x716700b9, (q31_t)0xc4a33376, + (q31_t)0x7164169d, (q31_t)0xc49da27a, (q31_t)0x71612c3c, (q31_t)0xc49811a3, (q31_t)0x715e4194, (q31_t)0xc49280f0, (q31_t)0x715b56a7, (q31_t)0xc48cf062, + (q31_t)0x71586b74, (q31_t)0xc4875ff9, (q31_t)0x71557ffa, (q31_t)0xc481cfb4, (q31_t)0x7152943b, (q31_t)0xc47c3f94, (q31_t)0x714fa836, (q31_t)0xc476af98, + (q31_t)0x714cbbeb, (q31_t)0xc4711fc2, (q31_t)0x7149cf5a, (q31_t)0xc46b9010, (q31_t)0x7146e284, (q31_t)0xc4660083, (q31_t)0x7143f567, (q31_t)0xc460711b, + (q31_t)0x71410805, (q31_t)0xc45ae1d7, (q31_t)0x713e1a5c, (q31_t)0xc45552b8, (q31_t)0x713b2c6e, (q31_t)0xc44fc3be, (q31_t)0x71383e3a, (q31_t)0xc44a34e9, + (q31_t)0x71354fc0, (q31_t)0xc444a639, (q31_t)0x71326101, (q31_t)0xc43f17ad, (q31_t)0x712f71fb, (q31_t)0xc4398947, (q31_t)0x712c82b0, (q31_t)0xc433fb05, + (q31_t)0x7129931f, (q31_t)0xc42e6ce8, (q31_t)0x7126a348, (q31_t)0xc428def0, (q31_t)0x7123b32b, (q31_t)0xc423511d, (q31_t)0x7120c2c8, (q31_t)0xc41dc36f, + (q31_t)0x711dd220, (q31_t)0xc41835e6, (q31_t)0x711ae132, (q31_t)0xc412a882, (q31_t)0x7117effe, (q31_t)0xc40d1b42, (q31_t)0x7114fe84, (q31_t)0xc4078e28, + (q31_t)0x71120cc5, (q31_t)0xc4020133, (q31_t)0x710f1ac0, (q31_t)0xc3fc7462, (q31_t)0x710c2875, (q31_t)0xc3f6e7b7, (q31_t)0x710935e4, (q31_t)0xc3f15b31, + (q31_t)0x7106430e, (q31_t)0xc3ebced0, (q31_t)0x71034ff2, (q31_t)0xc3e64294, (q31_t)0x71005c90, (q31_t)0xc3e0b67d, (q31_t)0x70fd68e9, (q31_t)0xc3db2a8b, + (q31_t)0x70fa74fc, (q31_t)0xc3d59ebe, (q31_t)0x70f780c9, (q31_t)0xc3d01316, (q31_t)0x70f48c50, (q31_t)0xc3ca8793, (q31_t)0x70f19792, (q31_t)0xc3c4fc36, + (q31_t)0x70eea28e, (q31_t)0xc3bf70fd, (q31_t)0x70ebad45, (q31_t)0xc3b9e5ea, (q31_t)0x70e8b7b5, (q31_t)0xc3b45afc, (q31_t)0x70e5c1e1, (q31_t)0xc3aed034, + (q31_t)0x70e2cbc6, (q31_t)0xc3a94590, (q31_t)0x70dfd566, (q31_t)0xc3a3bb12, (q31_t)0x70dcdec0, (q31_t)0xc39e30b8, (q31_t)0x70d9e7d5, (q31_t)0xc398a685, + (q31_t)0x70d6f0a4, (q31_t)0xc3931c76, (q31_t)0x70d3f92d, (q31_t)0xc38d928d, (q31_t)0x70d10171, (q31_t)0xc38808c9, (q31_t)0x70ce096f, (q31_t)0xc3827f2a, + (q31_t)0x70cb1128, (q31_t)0xc37cf5b0, (q31_t)0x70c8189b, (q31_t)0xc3776c5c, (q31_t)0x70c51fc8, (q31_t)0xc371e32d, (q31_t)0x70c226b0, (q31_t)0xc36c5a24, + (q31_t)0x70bf2d53, (q31_t)0xc366d140, (q31_t)0x70bc33b0, (q31_t)0xc3614881, (q31_t)0x70b939c7, (q31_t)0xc35bbfe8, (q31_t)0x70b63f99, (q31_t)0xc3563774, + (q31_t)0x70b34525, (q31_t)0xc350af26, (q31_t)0x70b04a6b, (q31_t)0xc34b26fc, (q31_t)0x70ad4f6d, (q31_t)0xc3459ef9, (q31_t)0x70aa5428, (q31_t)0xc340171b, + (q31_t)0x70a7589f, (q31_t)0xc33a8f62, (q31_t)0x70a45ccf, (q31_t)0xc33507cf, (q31_t)0x70a160ba, (q31_t)0xc32f8061, (q31_t)0x709e6460, (q31_t)0xc329f919, + (q31_t)0x709b67c0, (q31_t)0xc32471f7, (q31_t)0x70986adb, (q31_t)0xc31eeaf9, (q31_t)0x70956db1, (q31_t)0xc3196422, (q31_t)0x70927041, (q31_t)0xc313dd70, + (q31_t)0x708f728b, (q31_t)0xc30e56e4, (q31_t)0x708c7490, (q31_t)0xc308d07d, (q31_t)0x70897650, (q31_t)0xc3034a3c, (q31_t)0x708677ca, (q31_t)0xc2fdc420, + (q31_t)0x708378ff, (q31_t)0xc2f83e2a, (q31_t)0x708079ee, (q31_t)0xc2f2b85a, (q31_t)0x707d7a98, (q31_t)0xc2ed32af, (q31_t)0x707a7afd, (q31_t)0xc2e7ad2a, + (q31_t)0x70777b1c, (q31_t)0xc2e227cb, (q31_t)0x70747af6, (q31_t)0xc2dca291, (q31_t)0x70717a8a, (q31_t)0xc2d71d7e, (q31_t)0x706e79d9, (q31_t)0xc2d1988f, + (q31_t)0x706b78e3, (q31_t)0xc2cc13c7, (q31_t)0x706877a7, (q31_t)0xc2c68f24, (q31_t)0x70657626, (q31_t)0xc2c10aa7, (q31_t)0x70627460, (q31_t)0xc2bb8650, + (q31_t)0x705f7255, (q31_t)0xc2b6021f, (q31_t)0x705c7004, (q31_t)0xc2b07e14, (q31_t)0x70596d6d, (q31_t)0xc2aafa2e, (q31_t)0x70566a92, (q31_t)0xc2a5766e, + (q31_t)0x70536771, (q31_t)0xc29ff2d4, (q31_t)0x7050640b, (q31_t)0xc29a6f60, (q31_t)0x704d6060, (q31_t)0xc294ec12, (q31_t)0x704a5c6f, (q31_t)0xc28f68e9, + (q31_t)0x70475839, (q31_t)0xc289e5e7, (q31_t)0x704453be, (q31_t)0xc284630a, (q31_t)0x70414efd, (q31_t)0xc27ee054, (q31_t)0x703e49f8, (q31_t)0xc2795dc3, + (q31_t)0x703b44ad, (q31_t)0xc273db58, (q31_t)0x70383f1d, (q31_t)0xc26e5913, (q31_t)0x70353947, (q31_t)0xc268d6f5, (q31_t)0x7032332d, (q31_t)0xc26354fc, + (q31_t)0x702f2ccd, (q31_t)0xc25dd329, (q31_t)0x702c2628, (q31_t)0xc258517c, (q31_t)0x70291f3e, (q31_t)0xc252cff5, (q31_t)0x7026180e, (q31_t)0xc24d4e95, + (q31_t)0x7023109a, (q31_t)0xc247cd5a, (q31_t)0x702008e0, (q31_t)0xc2424c46, (q31_t)0x701d00e1, (q31_t)0xc23ccb57, (q31_t)0x7019f89d, (q31_t)0xc2374a8f, + (q31_t)0x7016f014, (q31_t)0xc231c9ec, (q31_t)0x7013e746, (q31_t)0xc22c4970, (q31_t)0x7010de32, (q31_t)0xc226c91a, (q31_t)0x700dd4da, (q31_t)0xc22148ea, + (q31_t)0x700acb3c, (q31_t)0xc21bc8e1, (q31_t)0x7007c159, (q31_t)0xc21648fd, (q31_t)0x7004b731, (q31_t)0xc210c940, (q31_t)0x7001acc4, (q31_t)0xc20b49a9, + (q31_t)0x6ffea212, (q31_t)0xc205ca38, (q31_t)0x6ffb971b, (q31_t)0xc2004aed, (q31_t)0x6ff88bde, (q31_t)0xc1facbc9, (q31_t)0x6ff5805d, (q31_t)0xc1f54cca, + (q31_t)0x6ff27497, (q31_t)0xc1efcdf3, (q31_t)0x6fef688b, (q31_t)0xc1ea4f41, (q31_t)0x6fec5c3b, (q31_t)0xc1e4d0b6, (q31_t)0x6fe94fa5, (q31_t)0xc1df5251, + (q31_t)0x6fe642ca, (q31_t)0xc1d9d412, (q31_t)0x6fe335ab, (q31_t)0xc1d455f9, (q31_t)0x6fe02846, (q31_t)0xc1ced807, (q31_t)0x6fdd1a9c, (q31_t)0xc1c95a3c, + (q31_t)0x6fda0cae, (q31_t)0xc1c3dc97, (q31_t)0x6fd6fe7a, (q31_t)0xc1be5f18, (q31_t)0x6fd3f001, (q31_t)0xc1b8e1bf, (q31_t)0x6fd0e144, (q31_t)0xc1b3648d, + (q31_t)0x6fcdd241, (q31_t)0xc1ade781, (q31_t)0x6fcac2fa, (q31_t)0xc1a86a9c, (q31_t)0x6fc7b36d, (q31_t)0xc1a2edde, (q31_t)0x6fc4a39c, (q31_t)0xc19d7145, + (q31_t)0x6fc19385, (q31_t)0xc197f4d4, (q31_t)0x6fbe832a, (q31_t)0xc1927888, (q31_t)0x6fbb728a, (q31_t)0xc18cfc63, (q31_t)0x6fb861a4, (q31_t)0xc1878065, + (q31_t)0x6fb5507a, (q31_t)0xc182048d, (q31_t)0x6fb23f0b, (q31_t)0xc17c88dc, (q31_t)0x6faf2d57, (q31_t)0xc1770d52, (q31_t)0x6fac1b5f, (q31_t)0xc17191ee, + (q31_t)0x6fa90921, (q31_t)0xc16c16b0, (q31_t)0x6fa5f69e, (q31_t)0xc1669b99, (q31_t)0x6fa2e3d7, (q31_t)0xc16120a9, (q31_t)0x6f9fd0cb, (q31_t)0xc15ba5df, + (q31_t)0x6f9cbd79, (q31_t)0xc1562b3d, (q31_t)0x6f99a9e3, (q31_t)0xc150b0c0, (q31_t)0x6f969608, (q31_t)0xc14b366b, (q31_t)0x6f9381e9, (q31_t)0xc145bc3c, + (q31_t)0x6f906d84, (q31_t)0xc1404233, (q31_t)0x6f8d58db, (q31_t)0xc13ac852, (q31_t)0x6f8a43ed, (q31_t)0xc1354e97, (q31_t)0x6f872eba, (q31_t)0xc12fd503, + (q31_t)0x6f841942, (q31_t)0xc12a5b95, (q31_t)0x6f810386, (q31_t)0xc124e24f, (q31_t)0x6f7ded84, (q31_t)0xc11f692f, (q31_t)0x6f7ad73e, (q31_t)0xc119f036, + (q31_t)0x6f77c0b3, (q31_t)0xc1147764, (q31_t)0x6f74a9e4, (q31_t)0xc10efeb8, (q31_t)0x6f7192cf, (q31_t)0xc1098634, (q31_t)0x6f6e7b76, (q31_t)0xc1040dd6, + (q31_t)0x6f6b63d8, (q31_t)0xc0fe959f, (q31_t)0x6f684bf6, (q31_t)0xc0f91d8f, (q31_t)0x6f6533ce, (q31_t)0xc0f3a5a6, (q31_t)0x6f621b62, (q31_t)0xc0ee2de3, + (q31_t)0x6f5f02b2, (q31_t)0xc0e8b648, (q31_t)0x6f5be9bc, (q31_t)0xc0e33ed4, (q31_t)0x6f58d082, (q31_t)0xc0ddc786, (q31_t)0x6f55b703, (q31_t)0xc0d8505f, + (q31_t)0x6f529d40, (q31_t)0xc0d2d960, (q31_t)0x6f4f8338, (q31_t)0xc0cd6287, (q31_t)0x6f4c68eb, (q31_t)0xc0c7ebd6, (q31_t)0x6f494e5a, (q31_t)0xc0c2754b, + (q31_t)0x6f463383, (q31_t)0xc0bcfee7, (q31_t)0x6f431869, (q31_t)0xc0b788ab, (q31_t)0x6f3ffd09, (q31_t)0xc0b21295, (q31_t)0x6f3ce165, (q31_t)0xc0ac9ca6, + (q31_t)0x6f39c57d, (q31_t)0xc0a726df, (q31_t)0x6f36a94f, (q31_t)0xc0a1b13e, (q31_t)0x6f338cde, (q31_t)0xc09c3bc5, (q31_t)0x6f307027, (q31_t)0xc096c673, + (q31_t)0x6f2d532c, (q31_t)0xc0915148, (q31_t)0x6f2a35ed, (q31_t)0xc08bdc44, (q31_t)0x6f271868, (q31_t)0xc0866767, (q31_t)0x6f23faa0, (q31_t)0xc080f2b1, + (q31_t)0x6f20dc92, (q31_t)0xc07b7e23, (q31_t)0x6f1dbe41, (q31_t)0xc07609bb, (q31_t)0x6f1a9faa, (q31_t)0xc070957b, (q31_t)0x6f1780cf, (q31_t)0xc06b2162, + (q31_t)0x6f1461b0, (q31_t)0xc065ad70, (q31_t)0x6f11424c, (q31_t)0xc06039a6, (q31_t)0x6f0e22a3, (q31_t)0xc05ac603, (q31_t)0x6f0b02b6, (q31_t)0xc0555287, + (q31_t)0x6f07e285, (q31_t)0xc04fdf32, (q31_t)0x6f04c20f, (q31_t)0xc04a6c05, (q31_t)0x6f01a155, (q31_t)0xc044f8fe, (q31_t)0x6efe8056, (q31_t)0xc03f8620, + (q31_t)0x6efb5f12, (q31_t)0xc03a1368, (q31_t)0x6ef83d8a, (q31_t)0xc034a0d8, (q31_t)0x6ef51bbe, (q31_t)0xc02f2e6f, (q31_t)0x6ef1f9ad, (q31_t)0xc029bc2e, + (q31_t)0x6eeed758, (q31_t)0xc0244a14, (q31_t)0x6eebb4bf, (q31_t)0xc01ed821, (q31_t)0x6ee891e1, (q31_t)0xc0196656, (q31_t)0x6ee56ebe, (q31_t)0xc013f4b2, + (q31_t)0x6ee24b57, (q31_t)0xc00e8336, (q31_t)0x6edf27ac, (q31_t)0xc00911e1, (q31_t)0x6edc03bc, (q31_t)0xc003a0b3, (q31_t)0x6ed8df88, (q31_t)0xbffe2fad, + (q31_t)0x6ed5bb10, (q31_t)0xbff8bece, (q31_t)0x6ed29653, (q31_t)0xbff34e17, (q31_t)0x6ecf7152, (q31_t)0xbfeddd88, (q31_t)0x6ecc4c0d, (q31_t)0xbfe86d20, + (q31_t)0x6ec92683, (q31_t)0xbfe2fcdf, (q31_t)0x6ec600b5, (q31_t)0xbfdd8cc6, (q31_t)0x6ec2daa2, (q31_t)0xbfd81cd5, (q31_t)0x6ebfb44b, (q31_t)0xbfd2ad0b, + (q31_t)0x6ebc8db0, (q31_t)0xbfcd3d69, (q31_t)0x6eb966d1, (q31_t)0xbfc7cdee, (q31_t)0x6eb63fad, (q31_t)0xbfc25e9b, (q31_t)0x6eb31845, (q31_t)0xbfbcef70, + (q31_t)0x6eaff099, (q31_t)0xbfb7806c, (q31_t)0x6eacc8a8, (q31_t)0xbfb21190, (q31_t)0x6ea9a073, (q31_t)0xbfaca2dc, (q31_t)0x6ea677fa, (q31_t)0xbfa7344f, + (q31_t)0x6ea34f3d, (q31_t)0xbfa1c5ea, (q31_t)0x6ea0263b, (q31_t)0xbf9c57ac, (q31_t)0x6e9cfcf5, (q31_t)0xbf96e997, (q31_t)0x6e99d36b, (q31_t)0xbf917ba9, + (q31_t)0x6e96a99d, (q31_t)0xbf8c0de3, (q31_t)0x6e937f8a, (q31_t)0xbf86a044, (q31_t)0x6e905534, (q31_t)0xbf8132ce, (q31_t)0x6e8d2a99, (q31_t)0xbf7bc57f, + (q31_t)0x6e89ffb9, (q31_t)0xbf765858, (q31_t)0x6e86d496, (q31_t)0xbf70eb59, (q31_t)0x6e83a92f, (q31_t)0xbf6b7e81, (q31_t)0x6e807d83, (q31_t)0xbf6611d2, + (q31_t)0x6e7d5193, (q31_t)0xbf60a54a, (q31_t)0x6e7a255f, (q31_t)0xbf5b38ea, (q31_t)0x6e76f8e7, (q31_t)0xbf55ccb2, (q31_t)0x6e73cc2b, (q31_t)0xbf5060a2, + (q31_t)0x6e709f2a, (q31_t)0xbf4af4ba, (q31_t)0x6e6d71e6, (q31_t)0xbf4588fa, (q31_t)0x6e6a445d, (q31_t)0xbf401d61, (q31_t)0x6e671690, (q31_t)0xbf3ab1f1, + (q31_t)0x6e63e87f, (q31_t)0xbf3546a8, (q31_t)0x6e60ba2a, (q31_t)0xbf2fdb88, (q31_t)0x6e5d8b91, (q31_t)0xbf2a708f, (q31_t)0x6e5a5cb4, (q31_t)0xbf2505bf, + (q31_t)0x6e572d93, (q31_t)0xbf1f9b16, (q31_t)0x6e53fe2e, (q31_t)0xbf1a3096, (q31_t)0x6e50ce84, (q31_t)0xbf14c63d, (q31_t)0x6e4d9e97, (q31_t)0xbf0f5c0d, + (q31_t)0x6e4a6e66, (q31_t)0xbf09f205, (q31_t)0x6e473df0, (q31_t)0xbf048824, (q31_t)0x6e440d37, (q31_t)0xbeff1e6c, (q31_t)0x6e40dc39, (q31_t)0xbef9b4dc, + (q31_t)0x6e3daaf8, (q31_t)0xbef44b74, (q31_t)0x6e3a7972, (q31_t)0xbeeee234, (q31_t)0x6e3747a9, (q31_t)0xbee9791c, (q31_t)0x6e34159b, (q31_t)0xbee4102d, + (q31_t)0x6e30e34a, (q31_t)0xbedea765, (q31_t)0x6e2db0b4, (q31_t)0xbed93ec6, (q31_t)0x6e2a7ddb, (q31_t)0xbed3d64f, (q31_t)0x6e274abe, (q31_t)0xbece6e00, + (q31_t)0x6e24175c, (q31_t)0xbec905d9, (q31_t)0x6e20e3b7, (q31_t)0xbec39ddb, (q31_t)0x6e1dafce, (q31_t)0xbebe3605, (q31_t)0x6e1a7ba1, (q31_t)0xbeb8ce57, + (q31_t)0x6e174730, (q31_t)0xbeb366d1, (q31_t)0x6e14127b, (q31_t)0xbeadff74, (q31_t)0x6e10dd82, (q31_t)0xbea8983f, (q31_t)0x6e0da845, (q31_t)0xbea33132, + (q31_t)0x6e0a72c5, (q31_t)0xbe9dca4e, (q31_t)0x6e073d00, (q31_t)0xbe986391, (q31_t)0x6e0406f8, (q31_t)0xbe92fcfe, (q31_t)0x6e00d0ac, (q31_t)0xbe8d9692, + (q31_t)0x6dfd9a1c, (q31_t)0xbe88304f, (q31_t)0x6dfa6348, (q31_t)0xbe82ca35, (q31_t)0x6df72c30, (q31_t)0xbe7d6442, (q31_t)0x6df3f4d4, (q31_t)0xbe77fe78, + (q31_t)0x6df0bd35, (q31_t)0xbe7298d7, (q31_t)0x6ded8552, (q31_t)0xbe6d335e, (q31_t)0x6dea4d2b, (q31_t)0xbe67ce0d, (q31_t)0x6de714c0, (q31_t)0xbe6268e5, + (q31_t)0x6de3dc11, (q31_t)0xbe5d03e6, (q31_t)0x6de0a31f, (q31_t)0xbe579f0f, (q31_t)0x6ddd69e9, (q31_t)0xbe523a60, (q31_t)0x6dda306f, (q31_t)0xbe4cd5da, + (q31_t)0x6dd6f6b1, (q31_t)0xbe47717c, (q31_t)0x6dd3bcaf, (q31_t)0xbe420d47, (q31_t)0x6dd0826a, (q31_t)0xbe3ca93b, (q31_t)0x6dcd47e1, (q31_t)0xbe374557, + (q31_t)0x6dca0d14, (q31_t)0xbe31e19b, (q31_t)0x6dc6d204, (q31_t)0xbe2c7e09, (q31_t)0x6dc396b0, (q31_t)0xbe271a9f, (q31_t)0x6dc05b18, (q31_t)0xbe21b75d, + (q31_t)0x6dbd1f3c, (q31_t)0xbe1c5444, (q31_t)0x6db9e31d, (q31_t)0xbe16f154, (q31_t)0x6db6a6ba, (q31_t)0xbe118e8c, (q31_t)0x6db36a14, (q31_t)0xbe0c2bed, + (q31_t)0x6db02d29, (q31_t)0xbe06c977, (q31_t)0x6daceffb, (q31_t)0xbe01672a, (q31_t)0x6da9b28a, (q31_t)0xbdfc0505, (q31_t)0x6da674d5, (q31_t)0xbdf6a309, + (q31_t)0x6da336dc, (q31_t)0xbdf14135, (q31_t)0x6d9ff89f, (q31_t)0xbdebdf8b, (q31_t)0x6d9cba1f, (q31_t)0xbde67e09, (q31_t)0x6d997b5b, (q31_t)0xbde11cb0, + (q31_t)0x6d963c54, (q31_t)0xbddbbb7f, (q31_t)0x6d92fd09, (q31_t)0xbdd65a78, (q31_t)0x6d8fbd7a, (q31_t)0xbdd0f999, (q31_t)0x6d8c7da8, (q31_t)0xbdcb98e3, + (q31_t)0x6d893d93, (q31_t)0xbdc63856, (q31_t)0x6d85fd39, (q31_t)0xbdc0d7f2, (q31_t)0x6d82bc9d, (q31_t)0xbdbb77b7, (q31_t)0x6d7f7bbc, (q31_t)0xbdb617a4, + (q31_t)0x6d7c3a98, (q31_t)0xbdb0b7bb, (q31_t)0x6d78f931, (q31_t)0xbdab57fa, (q31_t)0x6d75b786, (q31_t)0xbda5f862, (q31_t)0x6d727597, (q31_t)0xbda098f3, + (q31_t)0x6d6f3365, (q31_t)0xbd9b39ad, (q31_t)0x6d6bf0f0, (q31_t)0xbd95da91, (q31_t)0x6d68ae37, (q31_t)0xbd907b9d, (q31_t)0x6d656b3a, (q31_t)0xbd8b1cd2, + (q31_t)0x6d6227fa, (q31_t)0xbd85be30, (q31_t)0x6d5ee477, (q31_t)0xbd805fb7, (q31_t)0x6d5ba0b0, (q31_t)0xbd7b0167, (q31_t)0x6d585ca6, (q31_t)0xbd75a340, + (q31_t)0x6d551858, (q31_t)0xbd704542, (q31_t)0x6d51d3c6, (q31_t)0xbd6ae76d, (q31_t)0x6d4e8ef2, (q31_t)0xbd6589c1, (q31_t)0x6d4b49da, (q31_t)0xbd602c3f, + (q31_t)0x6d48047e, (q31_t)0xbd5acee5, (q31_t)0x6d44bedf, (q31_t)0xbd5571b5, (q31_t)0x6d4178fd, (q31_t)0xbd5014ad, (q31_t)0x6d3e32d7, (q31_t)0xbd4ab7cf, + (q31_t)0x6d3aec6e, (q31_t)0xbd455b1a, (q31_t)0x6d37a5c1, (q31_t)0xbd3ffe8e, (q31_t)0x6d345ed1, (q31_t)0xbd3aa22c, (q31_t)0x6d31179e, (q31_t)0xbd3545f2, + (q31_t)0x6d2dd027, (q31_t)0xbd2fe9e2, (q31_t)0x6d2a886e, (q31_t)0xbd2a8dfb, (q31_t)0x6d274070, (q31_t)0xbd25323d, (q31_t)0x6d23f830, (q31_t)0xbd1fd6a8, + (q31_t)0x6d20afac, (q31_t)0xbd1a7b3d, (q31_t)0x6d1d66e4, (q31_t)0xbd151ffb, (q31_t)0x6d1a1dda, (q31_t)0xbd0fc4e2, (q31_t)0x6d16d48c, (q31_t)0xbd0a69f2, + (q31_t)0x6d138afb, (q31_t)0xbd050f2c, (q31_t)0x6d104126, (q31_t)0xbcffb48f, (q31_t)0x6d0cf70f, (q31_t)0xbcfa5a1b, (q31_t)0x6d09acb4, (q31_t)0xbcf4ffd1, + (q31_t)0x6d066215, (q31_t)0xbcefa5b0, (q31_t)0x6d031734, (q31_t)0xbcea4bb9, (q31_t)0x6cffcc0f, (q31_t)0xbce4f1eb, (q31_t)0x6cfc80a7, (q31_t)0xbcdf9846, + (q31_t)0x6cf934fc, (q31_t)0xbcda3ecb, (q31_t)0x6cf5e90d, (q31_t)0xbcd4e579, (q31_t)0x6cf29cdc, (q31_t)0xbccf8c50, (q31_t)0x6cef5067, (q31_t)0xbcca3351, + (q31_t)0x6cec03af, (q31_t)0xbcc4da7b, (q31_t)0x6ce8b6b4, (q31_t)0xbcbf81cf, (q31_t)0x6ce56975, (q31_t)0xbcba294d, (q31_t)0x6ce21bf4, (q31_t)0xbcb4d0f4, + (q31_t)0x6cdece2f, (q31_t)0xbcaf78c4, (q31_t)0x6cdb8027, (q31_t)0xbcaa20be, (q31_t)0x6cd831dc, (q31_t)0xbca4c8e1, (q31_t)0x6cd4e34e, (q31_t)0xbc9f712e, + (q31_t)0x6cd1947c, (q31_t)0xbc9a19a5, (q31_t)0x6cce4568, (q31_t)0xbc94c245, (q31_t)0x6ccaf610, (q31_t)0xbc8f6b0f, (q31_t)0x6cc7a676, (q31_t)0xbc8a1402, + (q31_t)0x6cc45698, (q31_t)0xbc84bd1f, (q31_t)0x6cc10677, (q31_t)0xbc7f6665, (q31_t)0x6cbdb613, (q31_t)0xbc7a0fd6, (q31_t)0x6cba656c, (q31_t)0xbc74b96f, + (q31_t)0x6cb71482, (q31_t)0xbc6f6333, (q31_t)0x6cb3c355, (q31_t)0xbc6a0d20, (q31_t)0x6cb071e4, (q31_t)0xbc64b737, (q31_t)0x6cad2031, (q31_t)0xbc5f6177, + (q31_t)0x6ca9ce3b, (q31_t)0xbc5a0be2, (q31_t)0x6ca67c01, (q31_t)0xbc54b676, (q31_t)0x6ca32985, (q31_t)0xbc4f6134, (q31_t)0x6c9fd6c6, (q31_t)0xbc4a0c1b, + (q31_t)0x6c9c83c3, (q31_t)0xbc44b72c, (q31_t)0x6c99307e, (q31_t)0xbc3f6267, (q31_t)0x6c95dcf6, (q31_t)0xbc3a0dcc, (q31_t)0x6c92892a, (q31_t)0xbc34b95b, + (q31_t)0x6c8f351c, (q31_t)0xbc2f6513, (q31_t)0x6c8be0cb, (q31_t)0xbc2a10f6, (q31_t)0x6c888c36, (q31_t)0xbc24bd02, (q31_t)0x6c85375f, (q31_t)0xbc1f6938, + (q31_t)0x6c81e245, (q31_t)0xbc1a1598, (q31_t)0x6c7e8ce8, (q31_t)0xbc14c221, (q31_t)0x6c7b3748, (q31_t)0xbc0f6ed5, (q31_t)0x6c77e165, (q31_t)0xbc0a1bb3, + (q31_t)0x6c748b3f, (q31_t)0xbc04c8ba, (q31_t)0x6c7134d7, (q31_t)0xbbff75ec, (q31_t)0x6c6dde2b, (q31_t)0xbbfa2347, (q31_t)0x6c6a873d, (q31_t)0xbbf4d0cc, + (q31_t)0x6c67300b, (q31_t)0xbbef7e7c, (q31_t)0x6c63d897, (q31_t)0xbbea2c55, (q31_t)0x6c6080e0, (q31_t)0xbbe4da58, (q31_t)0x6c5d28e6, (q31_t)0xbbdf8885, + (q31_t)0x6c59d0a9, (q31_t)0xbbda36dd, (q31_t)0x6c56782a, (q31_t)0xbbd4e55e, (q31_t)0x6c531f67, (q31_t)0xbbcf940a, (q31_t)0x6c4fc662, (q31_t)0xbbca42df, + (q31_t)0x6c4c6d1a, (q31_t)0xbbc4f1df, (q31_t)0x6c49138f, (q31_t)0xbbbfa108, (q31_t)0x6c45b9c1, (q31_t)0xbbba505c, (q31_t)0x6c425fb1, (q31_t)0xbbb4ffda, + (q31_t)0x6c3f055d, (q31_t)0xbbafaf82, (q31_t)0x6c3baac7, (q31_t)0xbbaa5f54, (q31_t)0x6c384fef, (q31_t)0xbba50f50, (q31_t)0x6c34f4d3, (q31_t)0xbb9fbf77, + (q31_t)0x6c319975, (q31_t)0xbb9a6fc7, (q31_t)0x6c2e3dd4, (q31_t)0xbb952042, (q31_t)0x6c2ae1f0, (q31_t)0xbb8fd0e7, (q31_t)0x6c2785ca, (q31_t)0xbb8a81b6, + (q31_t)0x6c242960, (q31_t)0xbb8532b0, (q31_t)0x6c20ccb4, (q31_t)0xbb7fe3d3, (q31_t)0x6c1d6fc6, (q31_t)0xbb7a9521, (q31_t)0x6c1a1295, (q31_t)0xbb754699, + (q31_t)0x6c16b521, (q31_t)0xbb6ff83c, (q31_t)0x6c13576a, (q31_t)0xbb6aaa09, (q31_t)0x6c0ff971, (q31_t)0xbb655c00, (q31_t)0x6c0c9b35, (q31_t)0xbb600e21, + (q31_t)0x6c093cb6, (q31_t)0xbb5ac06d, (q31_t)0x6c05ddf5, (q31_t)0xbb5572e3, (q31_t)0x6c027ef1, (q31_t)0xbb502583, (q31_t)0x6bff1faa, (q31_t)0xbb4ad84e, + (q31_t)0x6bfbc021, (q31_t)0xbb458b43, (q31_t)0x6bf86055, (q31_t)0xbb403e63, (q31_t)0x6bf50047, (q31_t)0xbb3af1ad, (q31_t)0x6bf19ff6, (q31_t)0xbb35a521, + (q31_t)0x6bee3f62, (q31_t)0xbb3058c0, (q31_t)0x6beade8c, (q31_t)0xbb2b0c8a, (q31_t)0x6be77d74, (q31_t)0xbb25c07d, (q31_t)0x6be41c18, (q31_t)0xbb20749c, + (q31_t)0x6be0ba7b, (q31_t)0xbb1b28e4, (q31_t)0x6bdd589a, (q31_t)0xbb15dd57, (q31_t)0x6bd9f677, (q31_t)0xbb1091f5, (q31_t)0x6bd69412, (q31_t)0xbb0b46bd, + (q31_t)0x6bd3316a, (q31_t)0xbb05fbb0, (q31_t)0x6bcfce80, (q31_t)0xbb00b0ce, (q31_t)0x6bcc6b53, (q31_t)0xbafb6615, (q31_t)0x6bc907e3, (q31_t)0xbaf61b88, + (q31_t)0x6bc5a431, (q31_t)0xbaf0d125, (q31_t)0x6bc2403d, (q31_t)0xbaeb86ed, (q31_t)0x6bbedc06, (q31_t)0xbae63cdf, (q31_t)0x6bbb778d, (q31_t)0xbae0f2fc, + (q31_t)0x6bb812d1, (q31_t)0xbadba943, (q31_t)0x6bb4add3, (q31_t)0xbad65fb5, (q31_t)0x6bb14892, (q31_t)0xbad11652, (q31_t)0x6bade30f, (q31_t)0xbacbcd1a, + (q31_t)0x6baa7d49, (q31_t)0xbac6840c, (q31_t)0x6ba71741, (q31_t)0xbac13b29, (q31_t)0x6ba3b0f7, (q31_t)0xbabbf270, (q31_t)0x6ba04a6a, (q31_t)0xbab6a9e3, + (q31_t)0x6b9ce39b, (q31_t)0xbab16180, (q31_t)0x6b997c8a, (q31_t)0xbaac1948, (q31_t)0x6b961536, (q31_t)0xbaa6d13a, (q31_t)0x6b92ada0, (q31_t)0xbaa18958, + (q31_t)0x6b8f45c7, (q31_t)0xba9c41a0, (q31_t)0x6b8bddac, (q31_t)0xba96fa13, (q31_t)0x6b88754f, (q31_t)0xba91b2b1, (q31_t)0x6b850caf, (q31_t)0xba8c6b79, + (q31_t)0x6b81a3cd, (q31_t)0xba87246d, (q31_t)0x6b7e3aa9, (q31_t)0xba81dd8b, (q31_t)0x6b7ad142, (q31_t)0xba7c96d4, (q31_t)0x6b776799, (q31_t)0xba775048, + (q31_t)0x6b73fdae, (q31_t)0xba7209e7, (q31_t)0x6b709381, (q31_t)0xba6cc3b1, (q31_t)0x6b6d2911, (q31_t)0xba677da6, (q31_t)0x6b69be5f, (q31_t)0xba6237c5, + (q31_t)0x6b66536b, (q31_t)0xba5cf210, (q31_t)0x6b62e834, (q31_t)0xba57ac86, (q31_t)0x6b5f7cbc, (q31_t)0xba526726, (q31_t)0x6b5c1101, (q31_t)0xba4d21f2, + (q31_t)0x6b58a503, (q31_t)0xba47dce8, (q31_t)0x6b5538c4, (q31_t)0xba42980a, (q31_t)0x6b51cc42, (q31_t)0xba3d5356, (q31_t)0x6b4e5f7f, (q31_t)0xba380ece, + (q31_t)0x6b4af279, (q31_t)0xba32ca71, (q31_t)0x6b478530, (q31_t)0xba2d863e, (q31_t)0x6b4417a6, (q31_t)0xba284237, (q31_t)0x6b40a9d9, (q31_t)0xba22fe5b, + (q31_t)0x6b3d3bcb, (q31_t)0xba1dbaaa, (q31_t)0x6b39cd7a, (q31_t)0xba187724, (q31_t)0x6b365ee7, (q31_t)0xba1333c9, (q31_t)0x6b32f012, (q31_t)0xba0df099, + (q31_t)0x6b2f80fb, (q31_t)0xba08ad95, (q31_t)0x6b2c11a1, (q31_t)0xba036abb, (q31_t)0x6b28a206, (q31_t)0xb9fe280d, (q31_t)0x6b253228, (q31_t)0xb9f8e58a, + (q31_t)0x6b21c208, (q31_t)0xb9f3a332, (q31_t)0x6b1e51a7, (q31_t)0xb9ee6106, (q31_t)0x6b1ae103, (q31_t)0xb9e91f04, (q31_t)0x6b17701d, (q31_t)0xb9e3dd2e, + (q31_t)0x6b13fef5, (q31_t)0xb9de9b83, (q31_t)0x6b108d8b, (q31_t)0xb9d95a03, (q31_t)0x6b0d1bdf, (q31_t)0xb9d418af, (q31_t)0x6b09a9f1, (q31_t)0xb9ced786, + (q31_t)0x6b0637c1, (q31_t)0xb9c99688, (q31_t)0x6b02c54f, (q31_t)0xb9c455b6, (q31_t)0x6aff529a, (q31_t)0xb9bf150e, (q31_t)0x6afbdfa4, (q31_t)0xb9b9d493, + (q31_t)0x6af86c6c, (q31_t)0xb9b49442, (q31_t)0x6af4f8f2, (q31_t)0xb9af541d, (q31_t)0x6af18536, (q31_t)0xb9aa1423, (q31_t)0x6aee1138, (q31_t)0xb9a4d455, + (q31_t)0x6aea9cf8, (q31_t)0xb99f94b2, (q31_t)0x6ae72876, (q31_t)0xb99a553a, (q31_t)0x6ae3b3b2, (q31_t)0xb99515ee, (q31_t)0x6ae03eac, (q31_t)0xb98fd6cd, + (q31_t)0x6adcc964, (q31_t)0xb98a97d8, (q31_t)0x6ad953db, (q31_t)0xb985590e, (q31_t)0x6ad5de0f, (q31_t)0xb9801a70, (q31_t)0x6ad26802, (q31_t)0xb97adbfd, + (q31_t)0x6acef1b2, (q31_t)0xb9759db6, (q31_t)0x6acb7b21, (q31_t)0xb9705f9a, (q31_t)0x6ac8044e, (q31_t)0xb96b21aa, (q31_t)0x6ac48d39, (q31_t)0xb965e3e5, + (q31_t)0x6ac115e2, (q31_t)0xb960a64c, (q31_t)0x6abd9e49, (q31_t)0xb95b68de, (q31_t)0x6aba266e, (q31_t)0xb9562b9c, (q31_t)0x6ab6ae52, (q31_t)0xb950ee86, + (q31_t)0x6ab335f4, (q31_t)0xb94bb19b, (q31_t)0x6aafbd54, (q31_t)0xb94674dc, (q31_t)0x6aac4472, (q31_t)0xb9413848, (q31_t)0x6aa8cb4e, (q31_t)0xb93bfbe0, + (q31_t)0x6aa551e9, (q31_t)0xb936bfa4, (q31_t)0x6aa1d841, (q31_t)0xb9318393, (q31_t)0x6a9e5e58, (q31_t)0xb92c47ae, (q31_t)0x6a9ae42e, (q31_t)0xb9270bf5, + (q31_t)0x6a9769c1, (q31_t)0xb921d067, (q31_t)0x6a93ef13, (q31_t)0xb91c9505, (q31_t)0x6a907423, (q31_t)0xb91759cf, (q31_t)0x6a8cf8f1, (q31_t)0xb9121ec5, + (q31_t)0x6a897d7d, (q31_t)0xb90ce3e6, (q31_t)0x6a8601c8, (q31_t)0xb907a933, (q31_t)0x6a8285d1, (q31_t)0xb9026eac, (q31_t)0x6a7f0999, (q31_t)0xb8fd3451, + (q31_t)0x6a7b8d1e, (q31_t)0xb8f7fa21, (q31_t)0x6a781062, (q31_t)0xb8f2c01d, (q31_t)0x6a749365, (q31_t)0xb8ed8646, (q31_t)0x6a711625, (q31_t)0xb8e84c99, + (q31_t)0x6a6d98a4, (q31_t)0xb8e31319, (q31_t)0x6a6a1ae2, (q31_t)0xb8ddd9c5, (q31_t)0x6a669cdd, (q31_t)0xb8d8a09d, (q31_t)0x6a631e97, (q31_t)0xb8d367a0, + (q31_t)0x6a5fa010, (q31_t)0xb8ce2ecf, (q31_t)0x6a5c2147, (q31_t)0xb8c8f62b, (q31_t)0x6a58a23c, (q31_t)0xb8c3bdb2, (q31_t)0x6a5522ef, (q31_t)0xb8be8565, + (q31_t)0x6a51a361, (q31_t)0xb8b94d44, (q31_t)0x6a4e2392, (q31_t)0xb8b4154f, (q31_t)0x6a4aa381, (q31_t)0xb8aedd86, (q31_t)0x6a47232e, (q31_t)0xb8a9a5e9, + (q31_t)0x6a43a29a, (q31_t)0xb8a46e78, (q31_t)0x6a4021c4, (q31_t)0xb89f3733, (q31_t)0x6a3ca0ad, (q31_t)0xb89a001a, (q31_t)0x6a391f54, (q31_t)0xb894c92d, + (q31_t)0x6a359db9, (q31_t)0xb88f926d, (q31_t)0x6a321bdd, (q31_t)0xb88a5bd8, (q31_t)0x6a2e99c0, (q31_t)0xb885256f, (q31_t)0x6a2b1761, (q31_t)0xb87fef33, + (q31_t)0x6a2794c1, (q31_t)0xb87ab922, (q31_t)0x6a2411df, (q31_t)0xb875833e, (q31_t)0x6a208ebb, (q31_t)0xb8704d85, (q31_t)0x6a1d0b57, (q31_t)0xb86b17f9, + (q31_t)0x6a1987b0, (q31_t)0xb865e299, (q31_t)0x6a1603c8, (q31_t)0xb860ad66, (q31_t)0x6a127f9f, (q31_t)0xb85b785e, (q31_t)0x6a0efb35, (q31_t)0xb8564383, + (q31_t)0x6a0b7689, (q31_t)0xb8510ed4, (q31_t)0x6a07f19b, (q31_t)0xb84bda51, (q31_t)0x6a046c6c, (q31_t)0xb846a5fa, (q31_t)0x6a00e6fc, (q31_t)0xb84171cf, + (q31_t)0x69fd614a, (q31_t)0xb83c3dd1, (q31_t)0x69f9db57, (q31_t)0xb83709ff, (q31_t)0x69f65523, (q31_t)0xb831d659, (q31_t)0x69f2cead, (q31_t)0xb82ca2e0, + (q31_t)0x69ef47f6, (q31_t)0xb8276f93, (q31_t)0x69ebc0fe, (q31_t)0xb8223c72, (q31_t)0x69e839c4, (q31_t)0xb81d097e, (q31_t)0x69e4b249, (q31_t)0xb817d6b6, + (q31_t)0x69e12a8c, (q31_t)0xb812a41a, (q31_t)0x69dda28f, (q31_t)0xb80d71aa, (q31_t)0x69da1a50, (q31_t)0xb8083f67, (q31_t)0x69d691cf, (q31_t)0xb8030d51, + (q31_t)0x69d3090e, (q31_t)0xb7fddb67, (q31_t)0x69cf800b, (q31_t)0xb7f8a9a9, (q31_t)0x69cbf6c7, (q31_t)0xb7f37818, (q31_t)0x69c86d41, (q31_t)0xb7ee46b3, + (q31_t)0x69c4e37a, (q31_t)0xb7e9157a, (q31_t)0x69c15973, (q31_t)0xb7e3e46e, (q31_t)0x69bdcf29, (q31_t)0xb7deb38f, (q31_t)0x69ba449f, (q31_t)0xb7d982dc, + (q31_t)0x69b6b9d3, (q31_t)0xb7d45255, (q31_t)0x69b32ec7, (q31_t)0xb7cf21fb, (q31_t)0x69afa378, (q31_t)0xb7c9f1ce, (q31_t)0x69ac17e9, (q31_t)0xb7c4c1cd, + (q31_t)0x69a88c19, (q31_t)0xb7bf91f8, (q31_t)0x69a50007, (q31_t)0xb7ba6251, (q31_t)0x69a173b5, (q31_t)0xb7b532d6, (q31_t)0x699de721, (q31_t)0xb7b00387, + (q31_t)0x699a5a4c, (q31_t)0xb7aad465, (q31_t)0x6996cd35, (q31_t)0xb7a5a570, (q31_t)0x69933fde, (q31_t)0xb7a076a7, (q31_t)0x698fb246, (q31_t)0xb79b480b, + (q31_t)0x698c246c, (q31_t)0xb796199b, (q31_t)0x69889651, (q31_t)0xb790eb58, (q31_t)0x698507f6, (q31_t)0xb78bbd42, (q31_t)0x69817959, (q31_t)0xb7868f59, + (q31_t)0x697dea7b, (q31_t)0xb781619c, (q31_t)0x697a5b5c, (q31_t)0xb77c340c, (q31_t)0x6976cbfc, (q31_t)0xb77706a9, (q31_t)0x69733c5b, (q31_t)0xb771d972, + (q31_t)0x696fac78, (q31_t)0xb76cac69, (q31_t)0x696c1c55, (q31_t)0xb7677f8c, (q31_t)0x69688bf1, (q31_t)0xb76252db, (q31_t)0x6964fb4c, (q31_t)0xb75d2658, + (q31_t)0x69616a65, (q31_t)0xb757fa01, (q31_t)0x695dd93e, (q31_t)0xb752cdd8, (q31_t)0x695a47d6, (q31_t)0xb74da1db, (q31_t)0x6956b62d, (q31_t)0xb748760b, + (q31_t)0x69532442, (q31_t)0xb7434a67, (q31_t)0x694f9217, (q31_t)0xb73e1ef1, (q31_t)0x694bffab, (q31_t)0xb738f3a7, (q31_t)0x69486cfe, (q31_t)0xb733c88b, + (q31_t)0x6944da10, (q31_t)0xb72e9d9b, (q31_t)0x694146e1, (q31_t)0xb72972d8, (q31_t)0x693db371, (q31_t)0xb7244842, (q31_t)0x693a1fc0, (q31_t)0xb71f1dd9, + (q31_t)0x69368bce, (q31_t)0xb719f39e, (q31_t)0x6932f79b, (q31_t)0xb714c98e, (q31_t)0x692f6328, (q31_t)0xb70f9fac, (q31_t)0x692bce73, (q31_t)0xb70a75f7, + (q31_t)0x6928397e, (q31_t)0xb7054c6f, (q31_t)0x6924a448, (q31_t)0xb7002314, (q31_t)0x69210ed1, (q31_t)0xb6faf9e6, (q31_t)0x691d7919, (q31_t)0xb6f5d0e5, + (q31_t)0x6919e320, (q31_t)0xb6f0a812, (q31_t)0x69164ce7, (q31_t)0xb6eb7f6b, (q31_t)0x6912b66c, (q31_t)0xb6e656f1, (q31_t)0x690f1fb1, (q31_t)0xb6e12ea4, + (q31_t)0x690b88b5, (q31_t)0xb6dc0685, (q31_t)0x6907f178, (q31_t)0xb6d6de92, (q31_t)0x690459fb, (q31_t)0xb6d1b6cd, (q31_t)0x6900c23c, (q31_t)0xb6cc8f35, + (q31_t)0x68fd2a3d, (q31_t)0xb6c767ca, (q31_t)0x68f991fd, (q31_t)0xb6c2408c, (q31_t)0x68f5f97d, (q31_t)0xb6bd197c, (q31_t)0x68f260bb, (q31_t)0xb6b7f298, + (q31_t)0x68eec7b9, (q31_t)0xb6b2cbe2, (q31_t)0x68eb2e76, (q31_t)0xb6ada559, (q31_t)0x68e794f3, (q31_t)0xb6a87efd, (q31_t)0x68e3fb2e, (q31_t)0xb6a358ce, + (q31_t)0x68e06129, (q31_t)0xb69e32cd, (q31_t)0x68dcc6e4, (q31_t)0xb6990cf9, (q31_t)0x68d92c5d, (q31_t)0xb693e752, (q31_t)0x68d59196, (q31_t)0xb68ec1d9, + (q31_t)0x68d1f68f, (q31_t)0xb6899c8d, (q31_t)0x68ce5b46, (q31_t)0xb684776e, (q31_t)0x68cabfbd, (q31_t)0xb67f527c, (q31_t)0x68c723f3, (q31_t)0xb67a2db8, + (q31_t)0x68c387e9, (q31_t)0xb6750921, (q31_t)0x68bfeb9e, (q31_t)0xb66fe4b8, (q31_t)0x68bc4f13, (q31_t)0xb66ac07c, (q31_t)0x68b8b247, (q31_t)0xb6659c6d, + (q31_t)0x68b5153a, (q31_t)0xb660788c, (q31_t)0x68b177ed, (q31_t)0xb65b54d8, (q31_t)0x68adda5f, (q31_t)0xb6563151, (q31_t)0x68aa3c90, (q31_t)0xb6510df8, + (q31_t)0x68a69e81, (q31_t)0xb64beacd, (q31_t)0x68a30031, (q31_t)0xb646c7ce, (q31_t)0x689f61a1, (q31_t)0xb641a4fe, (q31_t)0x689bc2d1, (q31_t)0xb63c825b, + (q31_t)0x689823bf, (q31_t)0xb6375fe5, (q31_t)0x6894846e, (q31_t)0xb6323d9d, (q31_t)0x6890e4dc, (q31_t)0xb62d1b82, (q31_t)0x688d4509, (q31_t)0xb627f995, + (q31_t)0x6889a4f6, (q31_t)0xb622d7d6, (q31_t)0x688604a2, (q31_t)0xb61db644, (q31_t)0x6882640e, (q31_t)0xb61894df, (q31_t)0x687ec339, (q31_t)0xb61373a9, + (q31_t)0x687b2224, (q31_t)0xb60e529f, (q31_t)0x687780ce, (q31_t)0xb60931c4, (q31_t)0x6873df38, (q31_t)0xb6041116, (q31_t)0x68703d62, (q31_t)0xb5fef095, + (q31_t)0x686c9b4b, (q31_t)0xb5f9d043, (q31_t)0x6868f8f4, (q31_t)0xb5f4b01e, (q31_t)0x6865565c, (q31_t)0xb5ef9026, (q31_t)0x6861b384, (q31_t)0xb5ea705d, + (q31_t)0x685e106c, (q31_t)0xb5e550c1, (q31_t)0x685a6d13, (q31_t)0xb5e03153, (q31_t)0x6856c979, (q31_t)0xb5db1212, (q31_t)0x685325a0, (q31_t)0xb5d5f2ff, + (q31_t)0x684f8186, (q31_t)0xb5d0d41a, (q31_t)0x684bdd2c, (q31_t)0xb5cbb563, (q31_t)0x68483891, (q31_t)0xb5c696da, (q31_t)0x684493b6, (q31_t)0xb5c1787e, + (q31_t)0x6840ee9b, (q31_t)0xb5bc5a50, (q31_t)0x683d493f, (q31_t)0xb5b73c50, (q31_t)0x6839a3a4, (q31_t)0xb5b21e7e, (q31_t)0x6835fdc7, (q31_t)0xb5ad00d9, + (q31_t)0x683257ab, (q31_t)0xb5a7e362, (q31_t)0x682eb14e, (q31_t)0xb5a2c61a, (q31_t)0x682b0ab1, (q31_t)0xb59da8ff, (q31_t)0x682763d4, (q31_t)0xb5988c12, + (q31_t)0x6823bcb7, (q31_t)0xb5936f53, (q31_t)0x68201559, (q31_t)0xb58e52c2, (q31_t)0x681c6dbb, (q31_t)0xb589365e, (q31_t)0x6818c5dd, (q31_t)0xb5841a29, + (q31_t)0x68151dbe, (q31_t)0xb57efe22, (q31_t)0x68117560, (q31_t)0xb579e248, (q31_t)0x680dccc1, (q31_t)0xb574c69d, (q31_t)0x680a23e2, (q31_t)0xb56fab1f, + (q31_t)0x68067ac3, (q31_t)0xb56a8fd0, (q31_t)0x6802d164, (q31_t)0xb56574ae, (q31_t)0x67ff27c4, (q31_t)0xb56059bb, (q31_t)0x67fb7de5, (q31_t)0xb55b3ef5, + (q31_t)0x67f7d3c5, (q31_t)0xb556245e, (q31_t)0x67f42965, (q31_t)0xb55109f5, (q31_t)0x67f07ec5, (q31_t)0xb54befba, (q31_t)0x67ecd3e5, (q31_t)0xb546d5ac, + (q31_t)0x67e928c5, (q31_t)0xb541bbcd, (q31_t)0x67e57d64, (q31_t)0xb53ca21c, (q31_t)0x67e1d1c4, (q31_t)0xb5378899, (q31_t)0x67de25e3, (q31_t)0xb5326f45, + (q31_t)0x67da79c3, (q31_t)0xb52d561e, (q31_t)0x67d6cd62, (q31_t)0xb5283d26, (q31_t)0x67d320c1, (q31_t)0xb523245b, (q31_t)0x67cf73e1, (q31_t)0xb51e0bbf, + (q31_t)0x67cbc6c0, (q31_t)0xb518f351, (q31_t)0x67c8195f, (q31_t)0xb513db12, (q31_t)0x67c46bbe, (q31_t)0xb50ec300, (q31_t)0x67c0bddd, (q31_t)0xb509ab1d, + (q31_t)0x67bd0fbd, (q31_t)0xb5049368, (q31_t)0x67b9615c, (q31_t)0xb4ff7be1, (q31_t)0x67b5b2bb, (q31_t)0xb4fa6489, (q31_t)0x67b203da, (q31_t)0xb4f54d5f, + (q31_t)0x67ae54ba, (q31_t)0xb4f03663, (q31_t)0x67aaa559, (q31_t)0xb4eb1f95, (q31_t)0x67a6f5b8, (q31_t)0xb4e608f6, (q31_t)0x67a345d8, (q31_t)0xb4e0f285, + (q31_t)0x679f95b7, (q31_t)0xb4dbdc42, (q31_t)0x679be557, (q31_t)0xb4d6c62e, (q31_t)0x679834b6, (q31_t)0xb4d1b048, (q31_t)0x679483d6, (q31_t)0xb4cc9a90, + (q31_t)0x6790d2b6, (q31_t)0xb4c78507, (q31_t)0x678d2156, (q31_t)0xb4c26fad, (q31_t)0x67896fb6, (q31_t)0xb4bd5a80, (q31_t)0x6785bdd6, (q31_t)0xb4b84582, + (q31_t)0x67820bb7, (q31_t)0xb4b330b3, (q31_t)0x677e5957, (q31_t)0xb4ae1c12, (q31_t)0x677aa6b8, (q31_t)0xb4a9079f, (q31_t)0x6776f3d9, (q31_t)0xb4a3f35b, + (q31_t)0x677340ba, (q31_t)0xb49edf45, (q31_t)0x676f8d5b, (q31_t)0xb499cb5e, (q31_t)0x676bd9bd, (q31_t)0xb494b7a6, (q31_t)0x676825de, (q31_t)0xb48fa41c, + (q31_t)0x676471c0, (q31_t)0xb48a90c0, (q31_t)0x6760bd62, (q31_t)0xb4857d93, (q31_t)0x675d08c4, (q31_t)0xb4806a95, (q31_t)0x675953e7, (q31_t)0xb47b57c5, + (q31_t)0x67559eca, (q31_t)0xb4764523, (q31_t)0x6751e96d, (q31_t)0xb47132b1, (q31_t)0x674e33d0, (q31_t)0xb46c206d, (q31_t)0x674a7df4, (q31_t)0xb4670e57, + (q31_t)0x6746c7d8, (q31_t)0xb461fc70, (q31_t)0x6743117c, (q31_t)0xb45ceab8, (q31_t)0x673f5ae0, (q31_t)0xb457d92f, (q31_t)0x673ba405, (q31_t)0xb452c7d4, + (q31_t)0x6737ecea, (q31_t)0xb44db6a8, (q31_t)0x67343590, (q31_t)0xb448a5aa, (q31_t)0x67307df5, (q31_t)0xb44394db, (q31_t)0x672cc61c, (q31_t)0xb43e843b, + (q31_t)0x67290e02, (q31_t)0xb43973ca, (q31_t)0x672555a9, (q31_t)0xb4346387, (q31_t)0x67219d10, (q31_t)0xb42f5373, (q31_t)0x671de438, (q31_t)0xb42a438e, + (q31_t)0x671a2b20, (q31_t)0xb42533d8, (q31_t)0x671671c8, (q31_t)0xb4202451, (q31_t)0x6712b831, (q31_t)0xb41b14f8, (q31_t)0x670efe5a, (q31_t)0xb41605ce, + (q31_t)0x670b4444, (q31_t)0xb410f6d3, (q31_t)0x670789ee, (q31_t)0xb40be807, (q31_t)0x6703cf58, (q31_t)0xb406d969, (q31_t)0x67001483, (q31_t)0xb401cafb, + (q31_t)0x66fc596f, (q31_t)0xb3fcbcbb, (q31_t)0x66f89e1b, (q31_t)0xb3f7aeaa, (q31_t)0x66f4e287, (q31_t)0xb3f2a0c9, (q31_t)0x66f126b4, (q31_t)0xb3ed9316, + (q31_t)0x66ed6aa1, (q31_t)0xb3e88592, (q31_t)0x66e9ae4f, (q31_t)0xb3e3783d, (q31_t)0x66e5f1be, (q31_t)0xb3de6b17, (q31_t)0x66e234ed, (q31_t)0xb3d95e1f, + (q31_t)0x66de77dc, (q31_t)0xb3d45157, (q31_t)0x66daba8c, (q31_t)0xb3cf44be, (q31_t)0x66d6fcfd, (q31_t)0xb3ca3854, (q31_t)0x66d33f2e, (q31_t)0xb3c52c19, + (q31_t)0x66cf8120, (q31_t)0xb3c0200c, (q31_t)0x66cbc2d2, (q31_t)0xb3bb142f, (q31_t)0x66c80445, (q31_t)0xb3b60881, (q31_t)0x66c44579, (q31_t)0xb3b0fd02, + (q31_t)0x66c0866d, (q31_t)0xb3abf1b2, (q31_t)0x66bcc721, (q31_t)0xb3a6e691, (q31_t)0x66b90797, (q31_t)0xb3a1dba0, (q31_t)0x66b547cd, (q31_t)0xb39cd0dd, + (q31_t)0x66b187c3, (q31_t)0xb397c649, (q31_t)0x66adc77b, (q31_t)0xb392bbe5, (q31_t)0x66aa06f3, (q31_t)0xb38db1b0, (q31_t)0x66a6462b, (q31_t)0xb388a7aa, + (q31_t)0x66a28524, (q31_t)0xb3839dd3, (q31_t)0x669ec3de, (q31_t)0xb37e942b, (q31_t)0x669b0259, (q31_t)0xb3798ab2, (q31_t)0x66974095, (q31_t)0xb3748169, + (q31_t)0x66937e91, (q31_t)0xb36f784f, (q31_t)0x668fbc4e, (q31_t)0xb36a6f64, (q31_t)0x668bf9cb, (q31_t)0xb36566a8, (q31_t)0x66883709, (q31_t)0xb3605e1c, + (q31_t)0x66847408, (q31_t)0xb35b55bf, (q31_t)0x6680b0c8, (q31_t)0xb3564d91, (q31_t)0x667ced49, (q31_t)0xb3514592, (q31_t)0x6679298a, (q31_t)0xb34c3dc3, + (q31_t)0x6675658c, (q31_t)0xb3473623, (q31_t)0x6671a14f, (q31_t)0xb3422eb2, (q31_t)0x666ddcd3, (q31_t)0xb33d2771, (q31_t)0x666a1818, (q31_t)0xb338205f, + (q31_t)0x6666531d, (q31_t)0xb333197c, (q31_t)0x66628de4, (q31_t)0xb32e12c9, (q31_t)0x665ec86b, (q31_t)0xb3290c45, (q31_t)0x665b02b3, (q31_t)0xb32405f1, + (q31_t)0x66573cbb, (q31_t)0xb31effcc, (q31_t)0x66537685, (q31_t)0xb319f9d6, (q31_t)0x664fb010, (q31_t)0xb314f410, (q31_t)0x664be95b, (q31_t)0xb30fee79, + (q31_t)0x66482267, (q31_t)0xb30ae912, (q31_t)0x66445b35, (q31_t)0xb305e3da, (q31_t)0x664093c3, (q31_t)0xb300ded2, (q31_t)0x663ccc12, (q31_t)0xb2fbd9f9, + (q31_t)0x66390422, (q31_t)0xb2f6d550, (q31_t)0x66353bf3, (q31_t)0xb2f1d0d6, (q31_t)0x66317385, (q31_t)0xb2eccc8c, (q31_t)0x662daad8, (q31_t)0xb2e7c871, + (q31_t)0x6629e1ec, (q31_t)0xb2e2c486, (q31_t)0x662618c1, (q31_t)0xb2ddc0ca, (q31_t)0x66224f56, (q31_t)0xb2d8bd3e, (q31_t)0x661e85ad, (q31_t)0xb2d3b9e2, + (q31_t)0x661abbc5, (q31_t)0xb2ceb6b5, (q31_t)0x6616f19e, (q31_t)0xb2c9b3b8, (q31_t)0x66132738, (q31_t)0xb2c4b0ea, (q31_t)0x660f5c93, (q31_t)0xb2bfae4c, + (q31_t)0x660b91af, (q31_t)0xb2baabde, (q31_t)0x6607c68c, (q31_t)0xb2b5a99f, (q31_t)0x6603fb2a, (q31_t)0xb2b0a790, (q31_t)0x66002f89, (q31_t)0xb2aba5b1, + (q31_t)0x65fc63a9, (q31_t)0xb2a6a402, (q31_t)0x65f8978b, (q31_t)0xb2a1a282, (q31_t)0x65f4cb2d, (q31_t)0xb29ca132, (q31_t)0x65f0fe91, (q31_t)0xb297a011, + (q31_t)0x65ed31b5, (q31_t)0xb2929f21, (q31_t)0x65e9649b, (q31_t)0xb28d9e60, (q31_t)0x65e59742, (q31_t)0xb2889dcf, (q31_t)0x65e1c9aa, (q31_t)0xb2839d6d, + (q31_t)0x65ddfbd3, (q31_t)0xb27e9d3c, (q31_t)0x65da2dbd, (q31_t)0xb2799d3a, (q31_t)0x65d65f69, (q31_t)0xb2749d68, (q31_t)0x65d290d6, (q31_t)0xb26f9dc6, + (q31_t)0x65cec204, (q31_t)0xb26a9e54, (q31_t)0x65caf2f3, (q31_t)0xb2659f12, (q31_t)0x65c723a3, (q31_t)0xb2609fff, (q31_t)0x65c35415, (q31_t)0xb25ba11d, + (q31_t)0x65bf8447, (q31_t)0xb256a26a, (q31_t)0x65bbb43b, (q31_t)0xb251a3e7, (q31_t)0x65b7e3f1, (q31_t)0xb24ca594, (q31_t)0x65b41367, (q31_t)0xb247a771, + (q31_t)0x65b0429f, (q31_t)0xb242a97e, (q31_t)0x65ac7198, (q31_t)0xb23dabbb, (q31_t)0x65a8a052, (q31_t)0xb238ae28, (q31_t)0x65a4cece, (q31_t)0xb233b0c5, + (q31_t)0x65a0fd0b, (q31_t)0xb22eb392, (q31_t)0x659d2b09, (q31_t)0xb229b68f, (q31_t)0x659958c9, (q31_t)0xb224b9bc, (q31_t)0x6595864a, (q31_t)0xb21fbd19, + (q31_t)0x6591b38c, (q31_t)0xb21ac0a6, (q31_t)0x658de08f, (q31_t)0xb215c463, (q31_t)0x658a0d54, (q31_t)0xb210c850, (q31_t)0x658639db, (q31_t)0xb20bcc6d, + (q31_t)0x65826622, (q31_t)0xb206d0ba, (q31_t)0x657e922b, (q31_t)0xb201d537, (q31_t)0x657abdf6, (q31_t)0xb1fcd9e5, (q31_t)0x6576e982, (q31_t)0xb1f7dec2, + (q31_t)0x657314cf, (q31_t)0xb1f2e3d0, (q31_t)0x656f3fde, (q31_t)0xb1ede90e, (q31_t)0x656b6aae, (q31_t)0xb1e8ee7c, (q31_t)0x6567953f, (q31_t)0xb1e3f41a, + (q31_t)0x6563bf92, (q31_t)0xb1def9e9, (q31_t)0x655fe9a7, (q31_t)0xb1d9ffe7, (q31_t)0x655c137d, (q31_t)0xb1d50616, (q31_t)0x65583d14, (q31_t)0xb1d00c75, + (q31_t)0x6554666d, (q31_t)0xb1cb1304, (q31_t)0x65508f87, (q31_t)0xb1c619c3, (q31_t)0x654cb863, (q31_t)0xb1c120b3, (q31_t)0x6548e101, (q31_t)0xb1bc27d3, + (q31_t)0x6545095f, (q31_t)0xb1b72f23, (q31_t)0x65413180, (q31_t)0xb1b236a4, (q31_t)0x653d5962, (q31_t)0xb1ad3e55, (q31_t)0x65398105, (q31_t)0xb1a84636, + (q31_t)0x6535a86b, (q31_t)0xb1a34e47, (q31_t)0x6531cf91, (q31_t)0xb19e5689, (q31_t)0x652df679, (q31_t)0xb1995efb, (q31_t)0x652a1d23, (q31_t)0xb194679e, + (q31_t)0x6526438f, (q31_t)0xb18f7071, (q31_t)0x652269bc, (q31_t)0xb18a7974, (q31_t)0x651e8faa, (q31_t)0xb18582a8, (q31_t)0x651ab55b, (q31_t)0xb1808c0c, + (q31_t)0x6516dacd, (q31_t)0xb17b95a0, (q31_t)0x65130000, (q31_t)0xb1769f65, (q31_t)0x650f24f5, (q31_t)0xb171a95b, (q31_t)0x650b49ac, (q31_t)0xb16cb380, + (q31_t)0x65076e25, (q31_t)0xb167bdd7, (q31_t)0x6503925f, (q31_t)0xb162c85d, (q31_t)0x64ffb65b, (q31_t)0xb15dd315, (q31_t)0x64fbda18, (q31_t)0xb158ddfd, + (q31_t)0x64f7fd98, (q31_t)0xb153e915, (q31_t)0x64f420d9, (q31_t)0xb14ef45e, (q31_t)0x64f043dc, (q31_t)0xb149ffd7, (q31_t)0x64ec66a0, (q31_t)0xb1450b81, + (q31_t)0x64e88926, (q31_t)0xb140175b, (q31_t)0x64e4ab6e, (q31_t)0xb13b2367, (q31_t)0x64e0cd78, (q31_t)0xb1362fa2, (q31_t)0x64dcef44, (q31_t)0xb1313c0e, + (q31_t)0x64d910d1, (q31_t)0xb12c48ab, (q31_t)0x64d53220, (q31_t)0xb1275579, (q31_t)0x64d15331, (q31_t)0xb1226277, (q31_t)0x64cd7404, (q31_t)0xb11d6fa6, + (q31_t)0x64c99498, (q31_t)0xb1187d05, (q31_t)0x64c5b4ef, (q31_t)0xb1138a95, (q31_t)0x64c1d507, (q31_t)0xb10e9856, (q31_t)0x64bdf4e1, (q31_t)0xb109a648, + (q31_t)0x64ba147d, (q31_t)0xb104b46a, (q31_t)0x64b633da, (q31_t)0xb0ffc2bd, (q31_t)0x64b252fa, (q31_t)0xb0fad140, (q31_t)0x64ae71dc, (q31_t)0xb0f5dff5, + (q31_t)0x64aa907f, (q31_t)0xb0f0eeda, (q31_t)0x64a6aee4, (q31_t)0xb0ebfdf0, (q31_t)0x64a2cd0c, (q31_t)0xb0e70d37, (q31_t)0x649eeaf5, (q31_t)0xb0e21cae, + (q31_t)0x649b08a0, (q31_t)0xb0dd2c56, (q31_t)0x6497260d, (q31_t)0xb0d83c2f, (q31_t)0x6493433c, (q31_t)0xb0d34c39, (q31_t)0x648f602d, (q31_t)0xb0ce5c74, + (q31_t)0x648b7ce0, (q31_t)0xb0c96ce0, (q31_t)0x64879955, (q31_t)0xb0c47d7c, (q31_t)0x6483b58c, (q31_t)0xb0bf8e4a, (q31_t)0x647fd185, (q31_t)0xb0ba9f48, + (q31_t)0x647bed3f, (q31_t)0xb0b5b077, (q31_t)0x647808bc, (q31_t)0xb0b0c1d7, (q31_t)0x647423fb, (q31_t)0xb0abd368, (q31_t)0x64703efc, (q31_t)0xb0a6e52a, + (q31_t)0x646c59bf, (q31_t)0xb0a1f71d, (q31_t)0x64687444, (q31_t)0xb09d0941, (q31_t)0x64648e8c, (q31_t)0xb0981b96, (q31_t)0x6460a895, (q31_t)0xb0932e1b, + (q31_t)0x645cc260, (q31_t)0xb08e40d2, (q31_t)0x6458dbed, (q31_t)0xb08953ba, (q31_t)0x6454f53d, (q31_t)0xb08466d3, (q31_t)0x64510e4e, (q31_t)0xb07f7a1c, + (q31_t)0x644d2722, (q31_t)0xb07a8d97, (q31_t)0x64493fb8, (q31_t)0xb075a143, (q31_t)0x64455810, (q31_t)0xb070b520, (q31_t)0x6441702a, (q31_t)0xb06bc92e, + (q31_t)0x643d8806, (q31_t)0xb066dd6d, (q31_t)0x64399fa5, (q31_t)0xb061f1de, (q31_t)0x6435b706, (q31_t)0xb05d067f, (q31_t)0x6431ce28, (q31_t)0xb0581b51, + (q31_t)0x642de50d, (q31_t)0xb0533055, (q31_t)0x6429fbb5, (q31_t)0xb04e458a, (q31_t)0x6426121e, (q31_t)0xb0495af0, (q31_t)0x6422284a, (q31_t)0xb0447087, + (q31_t)0x641e3e38, (q31_t)0xb03f864f, (q31_t)0x641a53e8, (q31_t)0xb03a9c49, (q31_t)0x6416695a, (q31_t)0xb035b273, (q31_t)0x64127e8f, (q31_t)0xb030c8cf, + (q31_t)0x640e9386, (q31_t)0xb02bdf5c, (q31_t)0x640aa83f, (q31_t)0xb026f61b, (q31_t)0x6406bcba, (q31_t)0xb0220d0a, (q31_t)0x6402d0f8, (q31_t)0xb01d242b, + (q31_t)0x63fee4f8, (q31_t)0xb0183b7d, (q31_t)0x63faf8bb, (q31_t)0xb0135301, (q31_t)0x63f70c3f, (q31_t)0xb00e6ab5, (q31_t)0x63f31f86, (q31_t)0xb009829c, + (q31_t)0x63ef3290, (q31_t)0xb0049ab3, (q31_t)0x63eb455c, (q31_t)0xafffb2fc, (q31_t)0x63e757ea, (q31_t)0xaffacb76, (q31_t)0x63e36a3a, (q31_t)0xaff5e421, + (q31_t)0x63df7c4d, (q31_t)0xaff0fcfe, (q31_t)0x63db8e22, (q31_t)0xafec160c, (q31_t)0x63d79fba, (q31_t)0xafe72f4c, (q31_t)0x63d3b114, (q31_t)0xafe248bd, + (q31_t)0x63cfc231, (q31_t)0xafdd625f, (q31_t)0x63cbd310, (q31_t)0xafd87c33, (q31_t)0x63c7e3b1, (q31_t)0xafd39638, (q31_t)0x63c3f415, (q31_t)0xafceb06f, + (q31_t)0x63c0043b, (q31_t)0xafc9cad7, (q31_t)0x63bc1424, (q31_t)0xafc4e571, (q31_t)0x63b823cf, (q31_t)0xafc0003c, (q31_t)0x63b4333d, (q31_t)0xafbb1b39, + (q31_t)0x63b0426d, (q31_t)0xafb63667, (q31_t)0x63ac5160, (q31_t)0xafb151c7, (q31_t)0x63a86015, (q31_t)0xafac6d58, (q31_t)0x63a46e8d, (q31_t)0xafa7891b, + (q31_t)0x63a07cc7, (q31_t)0xafa2a50f, (q31_t)0x639c8ac4, (q31_t)0xaf9dc135, (q31_t)0x63989884, (q31_t)0xaf98dd8d, (q31_t)0x6394a606, (q31_t)0xaf93fa16, + (q31_t)0x6390b34a, (q31_t)0xaf8f16d1, (q31_t)0x638cc051, (q31_t)0xaf8a33bd, (q31_t)0x6388cd1b, (q31_t)0xaf8550db, (q31_t)0x6384d9a7, (q31_t)0xaf806e2b, + (q31_t)0x6380e5f6, (q31_t)0xaf7b8bac, (q31_t)0x637cf208, (q31_t)0xaf76a95f, (q31_t)0x6378fddc, (q31_t)0xaf71c743, (q31_t)0x63750973, (q31_t)0xaf6ce55a, + (q31_t)0x637114cc, (q31_t)0xaf6803a2, (q31_t)0x636d1fe9, (q31_t)0xaf63221c, (q31_t)0x63692ac7, (q31_t)0xaf5e40c7, (q31_t)0x63653569, (q31_t)0xaf595fa4, + (q31_t)0x63613fcd, (q31_t)0xaf547eb3, (q31_t)0x635d49f4, (q31_t)0xaf4f9df4, (q31_t)0x635953dd, (q31_t)0xaf4abd66, (q31_t)0x63555d8a, (q31_t)0xaf45dd0b, + (q31_t)0x635166f9, (q31_t)0xaf40fce1, (q31_t)0x634d702b, (q31_t)0xaf3c1ce9, (q31_t)0x6349791f, (q31_t)0xaf373d22, (q31_t)0x634581d6, (q31_t)0xaf325d8e, + (q31_t)0x63418a50, (q31_t)0xaf2d7e2b, (q31_t)0x633d928d, (q31_t)0xaf289efa, (q31_t)0x63399a8d, (q31_t)0xaf23bffb, (q31_t)0x6335a24f, (q31_t)0xaf1ee12e, + (q31_t)0x6331a9d4, (q31_t)0xaf1a0293, (q31_t)0x632db11c, (q31_t)0xaf15242a, (q31_t)0x6329b827, (q31_t)0xaf1045f3, (q31_t)0x6325bef5, (q31_t)0xaf0b67ed, + (q31_t)0x6321c585, (q31_t)0xaf068a1a, (q31_t)0x631dcbd9, (q31_t)0xaf01ac78, (q31_t)0x6319d1ef, (q31_t)0xaefccf09, (q31_t)0x6315d7c8, (q31_t)0xaef7f1cb, + (q31_t)0x6311dd64, (q31_t)0xaef314c0, (q31_t)0x630de2c3, (q31_t)0xaeee37e6, (q31_t)0x6309e7e4, (q31_t)0xaee95b3f, (q31_t)0x6305ecc9, (q31_t)0xaee47ec9, + (q31_t)0x6301f171, (q31_t)0xaedfa285, (q31_t)0x62fdf5db, (q31_t)0xaedac674, (q31_t)0x62f9fa09, (q31_t)0xaed5ea95, (q31_t)0x62f5fdf9, (q31_t)0xaed10ee7, + (q31_t)0x62f201ac, (q31_t)0xaecc336c, (q31_t)0x62ee0523, (q31_t)0xaec75823, (q31_t)0x62ea085c, (q31_t)0xaec27d0c, (q31_t)0x62e60b58, (q31_t)0xaebda227, + (q31_t)0x62e20e17, (q31_t)0xaeb8c774, (q31_t)0x62de109a, (q31_t)0xaeb3ecf3, (q31_t)0x62da12df, (q31_t)0xaeaf12a4, (q31_t)0x62d614e7, (q31_t)0xaeaa3888, + (q31_t)0x62d216b3, (q31_t)0xaea55e9e, (q31_t)0x62ce1841, (q31_t)0xaea084e6, (q31_t)0x62ca1992, (q31_t)0xae9bab60, (q31_t)0x62c61aa7, (q31_t)0xae96d20c, + (q31_t)0x62c21b7e, (q31_t)0xae91f8eb, (q31_t)0x62be1c19, (q31_t)0xae8d1ffb, (q31_t)0x62ba1c77, (q31_t)0xae88473e, (q31_t)0x62b61c98, (q31_t)0xae836eb4, + (q31_t)0x62b21c7b, (q31_t)0xae7e965b, (q31_t)0x62ae1c23, (q31_t)0xae79be35, (q31_t)0x62aa1b8d, (q31_t)0xae74e641, (q31_t)0x62a61aba, (q31_t)0xae700e80, + (q31_t)0x62a219aa, (q31_t)0xae6b36f0, (q31_t)0x629e185e, (q31_t)0xae665f93, (q31_t)0x629a16d5, (q31_t)0xae618869, (q31_t)0x6296150f, (q31_t)0xae5cb171, + (q31_t)0x6292130c, (q31_t)0xae57daab, (q31_t)0x628e10cc, (q31_t)0xae530417, (q31_t)0x628a0e50, (q31_t)0xae4e2db6, (q31_t)0x62860b97, (q31_t)0xae495787, + (q31_t)0x628208a1, (q31_t)0xae44818b, (q31_t)0x627e056e, (q31_t)0xae3fabc1, (q31_t)0x627a01fe, (q31_t)0xae3ad629, (q31_t)0x6275fe52, (q31_t)0xae3600c4, + (q31_t)0x6271fa69, (q31_t)0xae312b92, (q31_t)0x626df643, (q31_t)0xae2c5691, (q31_t)0x6269f1e1, (q31_t)0xae2781c4, (q31_t)0x6265ed42, (q31_t)0xae22ad29, + (q31_t)0x6261e866, (q31_t)0xae1dd8c0, (q31_t)0x625de34e, (q31_t)0xae19048a, (q31_t)0x6259ddf8, (q31_t)0xae143086, (q31_t)0x6255d866, (q31_t)0xae0f5cb5, + (q31_t)0x6251d298, (q31_t)0xae0a8916, (q31_t)0x624dcc8d, (q31_t)0xae05b5aa, (q31_t)0x6249c645, (q31_t)0xae00e271, (q31_t)0x6245bfc0, (q31_t)0xadfc0f6a, + (q31_t)0x6241b8ff, (q31_t)0xadf73c96, (q31_t)0x623db202, (q31_t)0xadf269f4, (q31_t)0x6239aac7, (q31_t)0xaded9785, (q31_t)0x6235a351, (q31_t)0xade8c548, + (q31_t)0x62319b9d, (q31_t)0xade3f33e, (q31_t)0x622d93ad, (q31_t)0xaddf2167, (q31_t)0x62298b81, (q31_t)0xadda4fc3, (q31_t)0x62258317, (q31_t)0xadd57e51, + (q31_t)0x62217a72, (q31_t)0xadd0ad12, (q31_t)0x621d7190, (q31_t)0xadcbdc05, (q31_t)0x62196871, (q31_t)0xadc70b2c, (q31_t)0x62155f16, (q31_t)0xadc23a85, + (q31_t)0x6211557e, (q31_t)0xadbd6a10, (q31_t)0x620d4baa, (q31_t)0xadb899cf, (q31_t)0x62094199, (q31_t)0xadb3c9c0, (q31_t)0x6205374c, (q31_t)0xadaef9e4, + (q31_t)0x62012cc2, (q31_t)0xadaa2a3b, (q31_t)0x61fd21fc, (q31_t)0xada55ac4, (q31_t)0x61f916f9, (q31_t)0xada08b80, (q31_t)0x61f50bba, (q31_t)0xad9bbc70, + (q31_t)0x61f1003f, (q31_t)0xad96ed92, (q31_t)0x61ecf487, (q31_t)0xad921ee6, (q31_t)0x61e8e893, (q31_t)0xad8d506e, (q31_t)0x61e4dc62, (q31_t)0xad888229, + (q31_t)0x61e0cff5, (q31_t)0xad83b416, (q31_t)0x61dcc34c, (q31_t)0xad7ee636, (q31_t)0x61d8b666, (q31_t)0xad7a1889, (q31_t)0x61d4a944, (q31_t)0xad754b0f, + (q31_t)0x61d09be5, (q31_t)0xad707dc8, (q31_t)0x61cc8e4b, (q31_t)0xad6bb0b4, (q31_t)0x61c88074, (q31_t)0xad66e3d3, (q31_t)0x61c47260, (q31_t)0xad621725, + (q31_t)0x61c06410, (q31_t)0xad5d4aaa, (q31_t)0x61bc5584, (q31_t)0xad587e61, (q31_t)0x61b846bc, (q31_t)0xad53b24c, (q31_t)0x61b437b7, (q31_t)0xad4ee66a, + (q31_t)0x61b02876, (q31_t)0xad4a1aba, (q31_t)0x61ac18f9, (q31_t)0xad454f3e, (q31_t)0x61a80940, (q31_t)0xad4083f5, (q31_t)0x61a3f94a, (q31_t)0xad3bb8df, + (q31_t)0x619fe918, (q31_t)0xad36edfc, (q31_t)0x619bd8aa, (q31_t)0xad32234b, (q31_t)0x6197c800, (q31_t)0xad2d58ce, (q31_t)0x6193b719, (q31_t)0xad288e85, + (q31_t)0x618fa5f7, (q31_t)0xad23c46e, (q31_t)0x618b9498, (q31_t)0xad1efa8a, (q31_t)0x618782fd, (q31_t)0xad1a30d9, (q31_t)0x61837126, (q31_t)0xad15675c, + (q31_t)0x617f5f12, (q31_t)0xad109e12, (q31_t)0x617b4cc3, (q31_t)0xad0bd4fb, (q31_t)0x61773a37, (q31_t)0xad070c17, (q31_t)0x61732770, (q31_t)0xad024366, + (q31_t)0x616f146c, (q31_t)0xacfd7ae8, (q31_t)0x616b012c, (q31_t)0xacf8b29e, (q31_t)0x6166edb0, (q31_t)0xacf3ea87, (q31_t)0x6162d9f8, (q31_t)0xacef22a3, + (q31_t)0x615ec603, (q31_t)0xacea5af2, (q31_t)0x615ab1d3, (q31_t)0xace59375, (q31_t)0x61569d67, (q31_t)0xace0cc2b, (q31_t)0x615288be, (q31_t)0xacdc0514, + (q31_t)0x614e73da, (q31_t)0xacd73e30, (q31_t)0x614a5eba, (q31_t)0xacd27780, (q31_t)0x6146495d, (q31_t)0xaccdb103, (q31_t)0x614233c5, (q31_t)0xacc8eab9, + (q31_t)0x613e1df0, (q31_t)0xacc424a3, (q31_t)0x613a07e0, (q31_t)0xacbf5ec0, (q31_t)0x6135f193, (q31_t)0xacba9910, (q31_t)0x6131db0b, (q31_t)0xacb5d394, + (q31_t)0x612dc447, (q31_t)0xacb10e4b, (q31_t)0x6129ad46, (q31_t)0xacac4935, (q31_t)0x6125960a, (q31_t)0xaca78453, (q31_t)0x61217e92, (q31_t)0xaca2bfa4, + (q31_t)0x611d66de, (q31_t)0xac9dfb29, (q31_t)0x61194eee, (q31_t)0xac9936e1, (q31_t)0x611536c2, (q31_t)0xac9472cd, (q31_t)0x61111e5b, (q31_t)0xac8faeec, + (q31_t)0x610d05b7, (q31_t)0xac8aeb3e, (q31_t)0x6108ecd8, (q31_t)0xac8627c4, (q31_t)0x6104d3bc, (q31_t)0xac81647e, (q31_t)0x6100ba65, (q31_t)0xac7ca16b, + (q31_t)0x60fca0d2, (q31_t)0xac77de8b, (q31_t)0x60f88703, (q31_t)0xac731bdf, (q31_t)0x60f46cf9, (q31_t)0xac6e5967, (q31_t)0x60f052b2, (q31_t)0xac699722, + (q31_t)0x60ec3830, (q31_t)0xac64d510, (q31_t)0x60e81d72, (q31_t)0xac601333, (q31_t)0x60e40278, (q31_t)0xac5b5189, (q31_t)0x60dfe743, (q31_t)0xac569012, + (q31_t)0x60dbcbd1, (q31_t)0xac51cecf, (q31_t)0x60d7b024, (q31_t)0xac4d0dc0, (q31_t)0x60d3943b, (q31_t)0xac484ce4, (q31_t)0x60cf7817, (q31_t)0xac438c3c, + (q31_t)0x60cb5bb7, (q31_t)0xac3ecbc7, (q31_t)0x60c73f1b, (q31_t)0xac3a0b87, (q31_t)0x60c32243, (q31_t)0xac354b7a, (q31_t)0x60bf0530, (q31_t)0xac308ba0, + (q31_t)0x60bae7e1, (q31_t)0xac2bcbfa, (q31_t)0x60b6ca56, (q31_t)0xac270c88, (q31_t)0x60b2ac8f, (q31_t)0xac224d4a, (q31_t)0x60ae8e8d, (q31_t)0xac1d8e40, + (q31_t)0x60aa7050, (q31_t)0xac18cf69, (q31_t)0x60a651d7, (q31_t)0xac1410c6, (q31_t)0x60a23322, (q31_t)0xac0f5256, (q31_t)0x609e1431, (q31_t)0xac0a941b, + (q31_t)0x6099f505, (q31_t)0xac05d613, (q31_t)0x6095d59d, (q31_t)0xac01183f, (q31_t)0x6091b5fa, (q31_t)0xabfc5a9f, (q31_t)0x608d961b, (q31_t)0xabf79d33, + (q31_t)0x60897601, (q31_t)0xabf2dffb, (q31_t)0x608555ab, (q31_t)0xabee22f6, (q31_t)0x60813519, (q31_t)0xabe96625, (q31_t)0x607d144c, (q31_t)0xabe4a988, + (q31_t)0x6078f344, (q31_t)0xabdfed1f, (q31_t)0x6074d200, (q31_t)0xabdb30ea, (q31_t)0x6070b080, (q31_t)0xabd674e9, (q31_t)0x606c8ec5, (q31_t)0xabd1b91c, + (q31_t)0x60686ccf, (q31_t)0xabccfd83, (q31_t)0x60644a9d, (q31_t)0xabc8421d, (q31_t)0x6060282f, (q31_t)0xabc386ec, (q31_t)0x605c0587, (q31_t)0xabbecbee, + (q31_t)0x6057e2a2, (q31_t)0xabba1125, (q31_t)0x6053bf82, (q31_t)0xabb5568f, (q31_t)0x604f9c27, (q31_t)0xabb09c2e, (q31_t)0x604b7891, (q31_t)0xababe200, + (q31_t)0x604754bf, (q31_t)0xaba72807, (q31_t)0x604330b1, (q31_t)0xaba26e41, (q31_t)0x603f0c69, (q31_t)0xab9db4b0, (q31_t)0x603ae7e5, (q31_t)0xab98fb52, + (q31_t)0x6036c325, (q31_t)0xab944229, (q31_t)0x60329e2a, (q31_t)0xab8f8934, (q31_t)0x602e78f4, (q31_t)0xab8ad073, (q31_t)0x602a5383, (q31_t)0xab8617e6, + (q31_t)0x60262dd6, (q31_t)0xab815f8d, (q31_t)0x602207ee, (q31_t)0xab7ca768, (q31_t)0x601de1ca, (q31_t)0xab77ef77, (q31_t)0x6019bb6b, (q31_t)0xab7337bb, + (q31_t)0x601594d1, (q31_t)0xab6e8032, (q31_t)0x60116dfc, (q31_t)0xab69c8de, (q31_t)0x600d46ec, (q31_t)0xab6511be, (q31_t)0x60091fa0, (q31_t)0xab605ad2, + (q31_t)0x6004f819, (q31_t)0xab5ba41a, (q31_t)0x6000d057, (q31_t)0xab56ed97, (q31_t)0x5ffca859, (q31_t)0xab523748, (q31_t)0x5ff88021, (q31_t)0xab4d812d, + (q31_t)0x5ff457ad, (q31_t)0xab48cb46, (q31_t)0x5ff02efe, (q31_t)0xab441593, (q31_t)0x5fec0613, (q31_t)0xab3f6015, (q31_t)0x5fe7dcee, (q31_t)0xab3aaacb, + (q31_t)0x5fe3b38d, (q31_t)0xab35f5b5, (q31_t)0x5fdf89f2, (q31_t)0xab3140d4, (q31_t)0x5fdb601b, (q31_t)0xab2c8c27, (q31_t)0x5fd73609, (q31_t)0xab27d7ae, + (q31_t)0x5fd30bbc, (q31_t)0xab23236a, (q31_t)0x5fcee133, (q31_t)0xab1e6f5a, (q31_t)0x5fcab670, (q31_t)0xab19bb7e, (q31_t)0x5fc68b72, (q31_t)0xab1507d7, + (q31_t)0x5fc26038, (q31_t)0xab105464, (q31_t)0x5fbe34c4, (q31_t)0xab0ba125, (q31_t)0x5fba0914, (q31_t)0xab06ee1b, (q31_t)0x5fb5dd29, (q31_t)0xab023b46, + (q31_t)0x5fb1b104, (q31_t)0xaafd88a4, (q31_t)0x5fad84a3, (q31_t)0xaaf8d637, (q31_t)0x5fa95807, (q31_t)0xaaf423ff, (q31_t)0x5fa52b31, (q31_t)0xaaef71fb, + (q31_t)0x5fa0fe1f, (q31_t)0xaaeac02c, (q31_t)0x5f9cd0d2, (q31_t)0xaae60e91, (q31_t)0x5f98a34a, (q31_t)0xaae15d2a, (q31_t)0x5f947588, (q31_t)0xaadcabf8, + (q31_t)0x5f90478a, (q31_t)0xaad7fafb, (q31_t)0x5f8c1951, (q31_t)0xaad34a32, (q31_t)0x5f87eade, (q31_t)0xaace999d, (q31_t)0x5f83bc2f, (q31_t)0xaac9e93e, + (q31_t)0x5f7f8d46, (q31_t)0xaac53912, (q31_t)0x5f7b5e22, (q31_t)0xaac0891c, (q31_t)0x5f772ec2, (q31_t)0xaabbd959, (q31_t)0x5f72ff28, (q31_t)0xaab729cc, + (q31_t)0x5f6ecf53, (q31_t)0xaab27a73, (q31_t)0x5f6a9f44, (q31_t)0xaaadcb4f, (q31_t)0x5f666ef9, (q31_t)0xaaa91c5f, (q31_t)0x5f623e73, (q31_t)0xaaa46da4, + (q31_t)0x5f5e0db3, (q31_t)0xaa9fbf1e, (q31_t)0x5f59dcb8, (q31_t)0xaa9b10cc, (q31_t)0x5f55ab82, (q31_t)0xaa9662af, (q31_t)0x5f517a11, (q31_t)0xaa91b4c7, + (q31_t)0x5f4d4865, (q31_t)0xaa8d0713, (q31_t)0x5f49167f, (q31_t)0xaa885994, (q31_t)0x5f44e45e, (q31_t)0xaa83ac4a, (q31_t)0x5f40b202, (q31_t)0xaa7eff34, + (q31_t)0x5f3c7f6b, (q31_t)0xaa7a5253, (q31_t)0x5f384c9a, (q31_t)0xaa75a5a8, (q31_t)0x5f34198e, (q31_t)0xaa70f930, (q31_t)0x5f2fe647, (q31_t)0xaa6c4cee, + (q31_t)0x5f2bb2c5, (q31_t)0xaa67a0e0, (q31_t)0x5f277f09, (q31_t)0xaa62f507, (q31_t)0x5f234b12, (q31_t)0xaa5e4963, (q31_t)0x5f1f16e0, (q31_t)0xaa599df4, + (q31_t)0x5f1ae274, (q31_t)0xaa54f2ba, (q31_t)0x5f16adcc, (q31_t)0xaa5047b4, (q31_t)0x5f1278eb, (q31_t)0xaa4b9ce3, (q31_t)0x5f0e43ce, (q31_t)0xaa46f248, + (q31_t)0x5f0a0e77, (q31_t)0xaa4247e1, (q31_t)0x5f05d8e6, (q31_t)0xaa3d9daf, (q31_t)0x5f01a31a, (q31_t)0xaa38f3b1, (q31_t)0x5efd6d13, (q31_t)0xaa3449e9, + (q31_t)0x5ef936d1, (q31_t)0xaa2fa056, (q31_t)0x5ef50055, (q31_t)0xaa2af6f7, (q31_t)0x5ef0c99f, (q31_t)0xaa264dce, (q31_t)0x5eec92ae, (q31_t)0xaa21a4d9, + (q31_t)0x5ee85b82, (q31_t)0xaa1cfc1a, (q31_t)0x5ee4241c, (q31_t)0xaa18538f, (q31_t)0x5edfec7b, (q31_t)0xaa13ab3a, (q31_t)0x5edbb49f, (q31_t)0xaa0f0319, + (q31_t)0x5ed77c8a, (q31_t)0xaa0a5b2e, (q31_t)0x5ed34439, (q31_t)0xaa05b377, (q31_t)0x5ecf0baf, (q31_t)0xaa010bf6, (q31_t)0x5ecad2e9, (q31_t)0xa9fc64a9, + (q31_t)0x5ec699e9, (q31_t)0xa9f7bd92, (q31_t)0x5ec260af, (q31_t)0xa9f316b0, (q31_t)0x5ebe273b, (q31_t)0xa9ee7002, (q31_t)0x5eb9ed8b, (q31_t)0xa9e9c98a, + (q31_t)0x5eb5b3a2, (q31_t)0xa9e52347, (q31_t)0x5eb1797e, (q31_t)0xa9e07d39, (q31_t)0x5ead3f1f, (q31_t)0xa9dbd761, (q31_t)0x5ea90487, (q31_t)0xa9d731bd, + (q31_t)0x5ea4c9b3, (q31_t)0xa9d28c4e, (q31_t)0x5ea08ea6, (q31_t)0xa9cde715, (q31_t)0x5e9c535e, (q31_t)0xa9c94211, (q31_t)0x5e9817dc, (q31_t)0xa9c49d42, + (q31_t)0x5e93dc1f, (q31_t)0xa9bff8a8, (q31_t)0x5e8fa028, (q31_t)0xa9bb5444, (q31_t)0x5e8b63f7, (q31_t)0xa9b6b014, (q31_t)0x5e87278b, (q31_t)0xa9b20c1a, + (q31_t)0x5e82eae5, (q31_t)0xa9ad6855, (q31_t)0x5e7eae05, (q31_t)0xa9a8c4c5, (q31_t)0x5e7a70ea, (q31_t)0xa9a4216b, (q31_t)0x5e763395, (q31_t)0xa99f7e46, + (q31_t)0x5e71f606, (q31_t)0xa99adb56, (q31_t)0x5e6db83d, (q31_t)0xa996389b, (q31_t)0x5e697a39, (q31_t)0xa9919616, (q31_t)0x5e653bfc, (q31_t)0xa98cf3c6, + (q31_t)0x5e60fd84, (q31_t)0xa98851ac, (q31_t)0x5e5cbed1, (q31_t)0xa983afc6, (q31_t)0x5e587fe5, (q31_t)0xa97f0e16, (q31_t)0x5e5440be, (q31_t)0xa97a6c9c, + (q31_t)0x5e50015d, (q31_t)0xa975cb57, (q31_t)0x5e4bc1c2, (q31_t)0xa9712a47, (q31_t)0x5e4781ed, (q31_t)0xa96c896c, (q31_t)0x5e4341de, (q31_t)0xa967e8c7, + (q31_t)0x5e3f0194, (q31_t)0xa9634858, (q31_t)0x5e3ac110, (q31_t)0xa95ea81d, (q31_t)0x5e368053, (q31_t)0xa95a0819, (q31_t)0x5e323f5b, (q31_t)0xa9556849, + (q31_t)0x5e2dfe29, (q31_t)0xa950c8b0, (q31_t)0x5e29bcbd, (q31_t)0xa94c294b, (q31_t)0x5e257b17, (q31_t)0xa9478a1c, (q31_t)0x5e213936, (q31_t)0xa942eb23, + (q31_t)0x5e1cf71c, (q31_t)0xa93e4c5f, (q31_t)0x5e18b4c8, (q31_t)0xa939add1, (q31_t)0x5e147239, (q31_t)0xa9350f78, (q31_t)0x5e102f71, (q31_t)0xa9307155, + (q31_t)0x5e0bec6e, (q31_t)0xa92bd367, (q31_t)0x5e07a932, (q31_t)0xa92735af, (q31_t)0x5e0365bb, (q31_t)0xa922982c, (q31_t)0x5dff220b, (q31_t)0xa91dfadf, + (q31_t)0x5dfade20, (q31_t)0xa9195dc7, (q31_t)0x5df699fc, (q31_t)0xa914c0e6, (q31_t)0x5df2559e, (q31_t)0xa9102439, (q31_t)0x5dee1105, (q31_t)0xa90b87c3, + (q31_t)0x5de9cc33, (q31_t)0xa906eb82, (q31_t)0x5de58727, (q31_t)0xa9024f76, (q31_t)0x5de141e1, (q31_t)0xa8fdb3a1, (q31_t)0x5ddcfc61, (q31_t)0xa8f91801, + (q31_t)0x5dd8b6a7, (q31_t)0xa8f47c97, (q31_t)0x5dd470b3, (q31_t)0xa8efe162, (q31_t)0x5dd02a85, (q31_t)0xa8eb4663, (q31_t)0x5dcbe41d, (q31_t)0xa8e6ab9a, + (q31_t)0x5dc79d7c, (q31_t)0xa8e21106, (q31_t)0x5dc356a1, (q31_t)0xa8dd76a9, (q31_t)0x5dbf0f8c, (q31_t)0xa8d8dc81, (q31_t)0x5dbac83d, (q31_t)0xa8d4428f, + (q31_t)0x5db680b4, (q31_t)0xa8cfa8d2, (q31_t)0x5db238f1, (q31_t)0xa8cb0f4b, (q31_t)0x5dadf0f5, (q31_t)0xa8c675fb, (q31_t)0x5da9a8bf, (q31_t)0xa8c1dce0, + (q31_t)0x5da5604f, (q31_t)0xa8bd43fa, (q31_t)0x5da117a5, (q31_t)0xa8b8ab4b, (q31_t)0x5d9ccec2, (q31_t)0xa8b412d1, (q31_t)0x5d9885a5, (q31_t)0xa8af7a8e, + (q31_t)0x5d943c4e, (q31_t)0xa8aae280, (q31_t)0x5d8ff2bd, (q31_t)0xa8a64aa8, (q31_t)0x5d8ba8f3, (q31_t)0xa8a1b306, (q31_t)0x5d875eef, (q31_t)0xa89d1b99, + (q31_t)0x5d8314b1, (q31_t)0xa8988463, (q31_t)0x5d7eca39, (q31_t)0xa893ed63, (q31_t)0x5d7a7f88, (q31_t)0xa88f5698, (q31_t)0x5d76349d, (q31_t)0xa88ac004, + (q31_t)0x5d71e979, (q31_t)0xa88629a5, (q31_t)0x5d6d9e1b, (q31_t)0xa881937c, (q31_t)0x5d695283, (q31_t)0xa87cfd8a, (q31_t)0x5d6506b2, (q31_t)0xa87867cd, + (q31_t)0x5d60baa7, (q31_t)0xa873d246, (q31_t)0x5d5c6e62, (q31_t)0xa86f3cf6, (q31_t)0x5d5821e4, (q31_t)0xa86aa7db, (q31_t)0x5d53d52d, (q31_t)0xa86612f6, + (q31_t)0x5d4f883b, (q31_t)0xa8617e48, (q31_t)0x5d4b3b10, (q31_t)0xa85ce9cf, (q31_t)0x5d46edac, (q31_t)0xa858558d, (q31_t)0x5d42a00e, (q31_t)0xa853c180, + (q31_t)0x5d3e5237, (q31_t)0xa84f2daa, (q31_t)0x5d3a0426, (q31_t)0xa84a9a0a, (q31_t)0x5d35b5db, (q31_t)0xa84606a0, (q31_t)0x5d316757, (q31_t)0xa841736c, + (q31_t)0x5d2d189a, (q31_t)0xa83ce06e, (q31_t)0x5d28c9a3, (q31_t)0xa8384da6, (q31_t)0x5d247a72, (q31_t)0xa833bb14, (q31_t)0x5d202b09, (q31_t)0xa82f28b9, + (q31_t)0x5d1bdb65, (q31_t)0xa82a9693, (q31_t)0x5d178b89, (q31_t)0xa82604a4, (q31_t)0x5d133b72, (q31_t)0xa82172eb, (q31_t)0x5d0eeb23, (q31_t)0xa81ce169, + (q31_t)0x5d0a9a9a, (q31_t)0xa818501c, (q31_t)0x5d0649d7, (q31_t)0xa813bf06, (q31_t)0x5d01f8dc, (q31_t)0xa80f2e26, (q31_t)0x5cfda7a7, (q31_t)0xa80a9d7c, + (q31_t)0x5cf95638, (q31_t)0xa8060d08, (q31_t)0x5cf50490, (q31_t)0xa8017ccb, (q31_t)0x5cf0b2af, (q31_t)0xa7fcecc4, (q31_t)0x5cec6095, (q31_t)0xa7f85cf3, + (q31_t)0x5ce80e41, (q31_t)0xa7f3cd59, (q31_t)0x5ce3bbb4, (q31_t)0xa7ef3df5, (q31_t)0x5cdf68ed, (q31_t)0xa7eaaec7, (q31_t)0x5cdb15ed, (q31_t)0xa7e61fd0, + (q31_t)0x5cd6c2b5, (q31_t)0xa7e1910f, (q31_t)0x5cd26f42, (q31_t)0xa7dd0284, (q31_t)0x5cce1b97, (q31_t)0xa7d8742f, (q31_t)0x5cc9c7b2, (q31_t)0xa7d3e611, + (q31_t)0x5cc57394, (q31_t)0xa7cf582a, (q31_t)0x5cc11f3d, (q31_t)0xa7caca79, (q31_t)0x5cbccaac, (q31_t)0xa7c63cfe, (q31_t)0x5cb875e3, (q31_t)0xa7c1afb9, + (q31_t)0x5cb420e0, (q31_t)0xa7bd22ac, (q31_t)0x5cafcba4, (q31_t)0xa7b895d4, (q31_t)0x5cab762f, (q31_t)0xa7b40933, (q31_t)0x5ca72080, (q31_t)0xa7af7cc8, + (q31_t)0x5ca2ca99, (q31_t)0xa7aaf094, (q31_t)0x5c9e7478, (q31_t)0xa7a66497, (q31_t)0x5c9a1e1e, (q31_t)0xa7a1d8d0, (q31_t)0x5c95c78b, (q31_t)0xa79d4d3f, + (q31_t)0x5c9170bf, (q31_t)0xa798c1e5, (q31_t)0x5c8d19ba, (q31_t)0xa79436c1, (q31_t)0x5c88c27c, (q31_t)0xa78fabd4, (q31_t)0x5c846b05, (q31_t)0xa78b211e, + (q31_t)0x5c801354, (q31_t)0xa786969e, (q31_t)0x5c7bbb6b, (q31_t)0xa7820c55, (q31_t)0x5c776348, (q31_t)0xa77d8242, (q31_t)0x5c730aed, (q31_t)0xa778f866, + (q31_t)0x5c6eb258, (q31_t)0xa7746ec0, (q31_t)0x5c6a598b, (q31_t)0xa76fe551, (q31_t)0x5c660084, (q31_t)0xa76b5c19, (q31_t)0x5c61a745, (q31_t)0xa766d317, + (q31_t)0x5c5d4dcc, (q31_t)0xa7624a4d, (q31_t)0x5c58f41a, (q31_t)0xa75dc1b8, (q31_t)0x5c549a30, (q31_t)0xa759395b, (q31_t)0x5c50400d, (q31_t)0xa754b134, + (q31_t)0x5c4be5b0, (q31_t)0xa7502943, (q31_t)0x5c478b1b, (q31_t)0xa74ba18a, (q31_t)0x5c43304d, (q31_t)0xa7471a07, (q31_t)0x5c3ed545, (q31_t)0xa74292bb, + (q31_t)0x5c3a7a05, (q31_t)0xa73e0ba5, (q31_t)0x5c361e8c, (q31_t)0xa73984c7, (q31_t)0x5c31c2db, (q31_t)0xa734fe1f, (q31_t)0x5c2d66f0, (q31_t)0xa73077ae, + (q31_t)0x5c290acc, (q31_t)0xa72bf174, (q31_t)0x5c24ae70, (q31_t)0xa7276b70, (q31_t)0x5c2051db, (q31_t)0xa722e5a3, (q31_t)0x5c1bf50d, (q31_t)0xa71e600d, + (q31_t)0x5c179806, (q31_t)0xa719daae, (q31_t)0x5c133ac6, (q31_t)0xa7155586, (q31_t)0x5c0edd4e, (q31_t)0xa710d095, (q31_t)0x5c0a7f9c, (q31_t)0xa70c4bda, + (q31_t)0x5c0621b2, (q31_t)0xa707c757, (q31_t)0x5c01c38f, (q31_t)0xa703430a, (q31_t)0x5bfd6534, (q31_t)0xa6febef4, (q31_t)0x5bf906a0, (q31_t)0xa6fa3b15, + (q31_t)0x5bf4a7d2, (q31_t)0xa6f5b76d, (q31_t)0x5bf048cd, (q31_t)0xa6f133fc, (q31_t)0x5bebe98e, (q31_t)0xa6ecb0c2, (q31_t)0x5be78a17, (q31_t)0xa6e82dbe, + (q31_t)0x5be32a67, (q31_t)0xa6e3aaf2, (q31_t)0x5bdeca7f, (q31_t)0xa6df285d, (q31_t)0x5bda6a5d, (q31_t)0xa6daa5fe, (q31_t)0x5bd60a03, (q31_t)0xa6d623d7, + (q31_t)0x5bd1a971, (q31_t)0xa6d1a1e7, (q31_t)0x5bcd48a6, (q31_t)0xa6cd202d, (q31_t)0x5bc8e7a2, (q31_t)0xa6c89eab, (q31_t)0x5bc48666, (q31_t)0xa6c41d60, + (q31_t)0x5bc024f0, (q31_t)0xa6bf9c4b, (q31_t)0x5bbbc343, (q31_t)0xa6bb1b6e, (q31_t)0x5bb7615d, (q31_t)0xa6b69ac8, (q31_t)0x5bb2ff3e, (q31_t)0xa6b21a59, + (q31_t)0x5bae9ce7, (q31_t)0xa6ad9a21, (q31_t)0x5baa3a57, (q31_t)0xa6a91a20, (q31_t)0x5ba5d78e, (q31_t)0xa6a49a56, (q31_t)0x5ba1748d, (q31_t)0xa6a01ac4, + (q31_t)0x5b9d1154, (q31_t)0xa69b9b68, (q31_t)0x5b98ade2, (q31_t)0xa6971c44, (q31_t)0x5b944a37, (q31_t)0xa6929d57, (q31_t)0x5b8fe654, (q31_t)0xa68e1ea1, + (q31_t)0x5b8b8239, (q31_t)0xa689a022, (q31_t)0x5b871de5, (q31_t)0xa68521da, (q31_t)0x5b82b958, (q31_t)0xa680a3ca, (q31_t)0x5b7e5493, (q31_t)0xa67c25f0, + (q31_t)0x5b79ef96, (q31_t)0xa677a84e, (q31_t)0x5b758a60, (q31_t)0xa6732ae3, (q31_t)0x5b7124f2, (q31_t)0xa66eadb0, (q31_t)0x5b6cbf4c, (q31_t)0xa66a30b3, + (q31_t)0x5b68596d, (q31_t)0xa665b3ee, (q31_t)0x5b63f355, (q31_t)0xa6613760, (q31_t)0x5b5f8d06, (q31_t)0xa65cbb0a, (q31_t)0x5b5b267e, (q31_t)0xa6583eeb, + (q31_t)0x5b56bfbd, (q31_t)0xa653c303, (q31_t)0x5b5258c4, (q31_t)0xa64f4752, (q31_t)0x5b4df193, (q31_t)0xa64acbd9, (q31_t)0x5b498a2a, (q31_t)0xa6465097, + (q31_t)0x5b452288, (q31_t)0xa641d58c, (q31_t)0x5b40baae, (q31_t)0xa63d5ab9, (q31_t)0x5b3c529c, (q31_t)0xa638e01d, (q31_t)0x5b37ea51, (q31_t)0xa63465b9, + (q31_t)0x5b3381ce, (q31_t)0xa62feb8b, (q31_t)0x5b2f1913, (q31_t)0xa62b7196, (q31_t)0x5b2ab020, (q31_t)0xa626f7d7, (q31_t)0x5b2646f4, (q31_t)0xa6227e50, + (q31_t)0x5b21dd90, (q31_t)0xa61e0501, (q31_t)0x5b1d73f4, (q31_t)0xa6198be9, (q31_t)0x5b190a20, (q31_t)0xa6151308, (q31_t)0x5b14a014, (q31_t)0xa6109a5f, + (q31_t)0x5b1035cf, (q31_t)0xa60c21ee, (q31_t)0x5b0bcb52, (q31_t)0xa607a9b4, (q31_t)0x5b07609d, (q31_t)0xa60331b1, (q31_t)0x5b02f5b0, (q31_t)0xa5feb9e6, + (q31_t)0x5afe8a8b, (q31_t)0xa5fa4252, (q31_t)0x5afa1f2e, (q31_t)0xa5f5caf6, (q31_t)0x5af5b398, (q31_t)0xa5f153d2, (q31_t)0x5af147ca, (q31_t)0xa5ecdce5, + (q31_t)0x5aecdbc5, (q31_t)0xa5e8662f, (q31_t)0x5ae86f87, (q31_t)0xa5e3efb1, (q31_t)0x5ae40311, (q31_t)0xa5df796b, (q31_t)0x5adf9663, (q31_t)0xa5db035c, + (q31_t)0x5adb297d, (q31_t)0xa5d68d85, (q31_t)0x5ad6bc5f, (q31_t)0xa5d217e6, (q31_t)0x5ad24f09, (q31_t)0xa5cda27e, (q31_t)0x5acde17b, (q31_t)0xa5c92d4e, + (q31_t)0x5ac973b5, (q31_t)0xa5c4b855, (q31_t)0x5ac505b7, (q31_t)0xa5c04395, (q31_t)0x5ac09781, (q31_t)0xa5bbcf0b, (q31_t)0x5abc2912, (q31_t)0xa5b75aba, + (q31_t)0x5ab7ba6c, (q31_t)0xa5b2e6a0, (q31_t)0x5ab34b8e, (q31_t)0xa5ae72be, (q31_t)0x5aaedc78, (q31_t)0xa5a9ff14, (q31_t)0x5aaa6d2b, (q31_t)0xa5a58ba1, + (q31_t)0x5aa5fda5, (q31_t)0xa5a11866, (q31_t)0x5aa18de7, (q31_t)0xa59ca563, (q31_t)0x5a9d1df1, (q31_t)0xa5983297, (q31_t)0x5a98adc4, (q31_t)0xa593c004, + (q31_t)0x5a943d5e, (q31_t)0xa58f4da8, (q31_t)0x5a8fccc1, (q31_t)0xa58adb84, (q31_t)0x5a8b5bec, (q31_t)0xa5866997, (q31_t)0x5a86eadf, (q31_t)0xa581f7e3, + (q31_t)0x5a82799a, (q31_t)0xa57d8666, (q31_t)0x5a7e081d, (q31_t)0xa5791521, (q31_t)0x5a799669, (q31_t)0xa574a414, (q31_t)0x5a75247c, (q31_t)0xa570333f, + (q31_t)0x5a70b258, (q31_t)0xa56bc2a2, (q31_t)0x5a6c3ffc, (q31_t)0xa567523c, (q31_t)0x5a67cd69, (q31_t)0xa562e20f, (q31_t)0x5a635a9d, (q31_t)0xa55e7219, + (q31_t)0x5a5ee79a, (q31_t)0xa55a025b, (q31_t)0x5a5a745f, (q31_t)0xa55592d5, (q31_t)0x5a5600ec, (q31_t)0xa5512388, (q31_t)0x5a518d42, (q31_t)0xa54cb472, + (q31_t)0x5a4d1960, (q31_t)0xa5484594, (q31_t)0x5a48a546, (q31_t)0xa543d6ee, (q31_t)0x5a4430f5, (q31_t)0xa53f687f, (q31_t)0x5a3fbc6b, (q31_t)0xa53afa49, + (q31_t)0x5a3b47ab, (q31_t)0xa5368c4b, (q31_t)0x5a36d2b2, (q31_t)0xa5321e85, (q31_t)0x5a325d82, (q31_t)0xa52db0f7, (q31_t)0x5a2de81a, (q31_t)0xa52943a1, + (q31_t)0x5a29727b, (q31_t)0xa524d683, (q31_t)0x5a24fca4, (q31_t)0xa520699d, (q31_t)0x5a208695, (q31_t)0xa51bfcef, (q31_t)0x5a1c104f, (q31_t)0xa5179079, + (q31_t)0x5a1799d1, (q31_t)0xa513243b, (q31_t)0x5a13231b, (q31_t)0xa50eb836, (q31_t)0x5a0eac2e, (q31_t)0xa50a4c68, (q31_t)0x5a0a350a, (q31_t)0xa505e0d2, + (q31_t)0x5a05bdae, (q31_t)0xa5017575, (q31_t)0x5a01461a, (q31_t)0xa4fd0a50, (q31_t)0x59fcce4f, (q31_t)0xa4f89f63, (q31_t)0x59f8564c, (q31_t)0xa4f434ae, + (q31_t)0x59f3de12, (q31_t)0xa4efca31, (q31_t)0x59ef65a1, (q31_t)0xa4eb5fec, (q31_t)0x59eaecf8, (q31_t)0xa4e6f5e0, (q31_t)0x59e67417, (q31_t)0xa4e28c0c, + (q31_t)0x59e1faff, (q31_t)0xa4de2270, (q31_t)0x59dd81b0, (q31_t)0xa4d9b90c, (q31_t)0x59d90829, (q31_t)0xa4d54fe0, (q31_t)0x59d48e6a, (q31_t)0xa4d0e6ed, + (q31_t)0x59d01475, (q31_t)0xa4cc7e32, (q31_t)0x59cb9a47, (q31_t)0xa4c815af, (q31_t)0x59c71fe3, (q31_t)0xa4c3ad64, (q31_t)0x59c2a547, (q31_t)0xa4bf4552, + (q31_t)0x59be2a74, (q31_t)0xa4badd78, (q31_t)0x59b9af69, (q31_t)0xa4b675d6, (q31_t)0x59b53427, (q31_t)0xa4b20e6d, (q31_t)0x59b0b8ae, (q31_t)0xa4ada73c, + (q31_t)0x59ac3cfd, (q31_t)0xa4a94043, (q31_t)0x59a7c115, (q31_t)0xa4a4d982, (q31_t)0x59a344f6, (q31_t)0xa4a072fa, (q31_t)0x599ec8a0, (q31_t)0xa49c0cab, + (q31_t)0x599a4c12, (q31_t)0xa497a693, (q31_t)0x5995cf4d, (q31_t)0xa49340b4, (q31_t)0x59915250, (q31_t)0xa48edb0e, (q31_t)0x598cd51d, (q31_t)0xa48a75a0, + (q31_t)0x598857b2, (q31_t)0xa486106a, (q31_t)0x5983da10, (q31_t)0xa481ab6d, (q31_t)0x597f5c36, (q31_t)0xa47d46a8, (q31_t)0x597ade26, (q31_t)0xa478e21b, + (q31_t)0x59765fde, (q31_t)0xa4747dc7, (q31_t)0x5971e15f, (q31_t)0xa47019ac, (q31_t)0x596d62a9, (q31_t)0xa46bb5c9, (q31_t)0x5968e3bc, (q31_t)0xa467521e, + (q31_t)0x59646498, (q31_t)0xa462eeac, (q31_t)0x595fe53c, (q31_t)0xa45e8b73, (q31_t)0x595b65aa, (q31_t)0xa45a2872, (q31_t)0x5956e5e0, (q31_t)0xa455c5a9, + (q31_t)0x595265df, (q31_t)0xa4516319, (q31_t)0x594de5a7, (q31_t)0xa44d00c2, (q31_t)0x59496538, (q31_t)0xa4489ea3, (q31_t)0x5944e492, (q31_t)0xa4443cbd, + (q31_t)0x594063b5, (q31_t)0xa43fdb10, (q31_t)0x593be2a0, (q31_t)0xa43b799a, (q31_t)0x59376155, (q31_t)0xa437185e, (q31_t)0x5932dfd3, (q31_t)0xa432b75a, + (q31_t)0x592e5e19, (q31_t)0xa42e568f, (q31_t)0x5929dc29, (q31_t)0xa429f5fd, (q31_t)0x59255a02, (q31_t)0xa42595a3, (q31_t)0x5920d7a3, (q31_t)0xa4213581, + (q31_t)0x591c550e, (q31_t)0xa41cd599, (q31_t)0x5917d242, (q31_t)0xa41875e9, (q31_t)0x59134f3e, (q31_t)0xa4141672, (q31_t)0x590ecc04, (q31_t)0xa40fb733, + (q31_t)0x590a4893, (q31_t)0xa40b582e, (q31_t)0x5905c4eb, (q31_t)0xa406f960, (q31_t)0x5901410c, (q31_t)0xa4029acc, (q31_t)0x58fcbcf6, (q31_t)0xa3fe3c71, + (q31_t)0x58f838a9, (q31_t)0xa3f9de4e, (q31_t)0x58f3b426, (q31_t)0xa3f58064, (q31_t)0x58ef2f6b, (q31_t)0xa3f122b2, (q31_t)0x58eaaa7a, (q31_t)0xa3ecc53a, + (q31_t)0x58e62552, (q31_t)0xa3e867fa, (q31_t)0x58e19ff3, (q31_t)0xa3e40af3, (q31_t)0x58dd1a5d, (q31_t)0xa3dfae25, (q31_t)0x58d89490, (q31_t)0xa3db5190, + (q31_t)0x58d40e8c, (q31_t)0xa3d6f534, (q31_t)0x58cf8852, (q31_t)0xa3d29910, (q31_t)0x58cb01e1, (q31_t)0xa3ce3d25, (q31_t)0x58c67b39, (q31_t)0xa3c9e174, + (q31_t)0x58c1f45b, (q31_t)0xa3c585fb, (q31_t)0x58bd6d45, (q31_t)0xa3c12abb, (q31_t)0x58b8e5f9, (q31_t)0xa3bccfb3, (q31_t)0x58b45e76, (q31_t)0xa3b874e5, + (q31_t)0x58afd6bd, (q31_t)0xa3b41a50, (q31_t)0x58ab4ecc, (q31_t)0xa3afbff3, (q31_t)0x58a6c6a5, (q31_t)0xa3ab65d0, (q31_t)0x58a23e48, (q31_t)0xa3a70be6, + (q31_t)0x589db5b3, (q31_t)0xa3a2b234, (q31_t)0x58992ce9, (q31_t)0xa39e58bb, (q31_t)0x5894a3e7, (q31_t)0xa399ff7c, (q31_t)0x58901aaf, (q31_t)0xa395a675, + (q31_t)0x588b9140, (q31_t)0xa3914da8, (q31_t)0x5887079a, (q31_t)0xa38cf513, (q31_t)0x58827dbe, (q31_t)0xa3889cb8, (q31_t)0x587df3ab, (q31_t)0xa3844495, + (q31_t)0x58796962, (q31_t)0xa37fecac, (q31_t)0x5874dee2, (q31_t)0xa37b94fb, (q31_t)0x5870542c, (q31_t)0xa3773d84, (q31_t)0x586bc93f, (q31_t)0xa372e646, + (q31_t)0x58673e1b, (q31_t)0xa36e8f41, (q31_t)0x5862b2c1, (q31_t)0xa36a3875, (q31_t)0x585e2730, (q31_t)0xa365e1e2, (q31_t)0x58599b69, (q31_t)0xa3618b88, + (q31_t)0x58550f6c, (q31_t)0xa35d3567, (q31_t)0x58508338, (q31_t)0xa358df80, (q31_t)0x584bf6cd, (q31_t)0xa35489d1, (q31_t)0x58476a2c, (q31_t)0xa350345c, + (q31_t)0x5842dd54, (q31_t)0xa34bdf20, (q31_t)0x583e5047, (q31_t)0xa3478a1d, (q31_t)0x5839c302, (q31_t)0xa3433554, (q31_t)0x58353587, (q31_t)0xa33ee0c3, + (q31_t)0x5830a7d6, (q31_t)0xa33a8c6c, (q31_t)0x582c19ef, (q31_t)0xa336384e, (q31_t)0x58278bd1, (q31_t)0xa331e469, (q31_t)0x5822fd7c, (q31_t)0xa32d90be, + (q31_t)0x581e6ef1, (q31_t)0xa3293d4b, (q31_t)0x5819e030, (q31_t)0xa324ea13, (q31_t)0x58155139, (q31_t)0xa3209713, (q31_t)0x5810c20b, (q31_t)0xa31c444c, + (q31_t)0x580c32a7, (q31_t)0xa317f1bf, (q31_t)0x5807a30d, (q31_t)0xa3139f6b, (q31_t)0x5803133c, (q31_t)0xa30f4d51, (q31_t)0x57fe8335, (q31_t)0xa30afb70, + (q31_t)0x57f9f2f8, (q31_t)0xa306a9c8, (q31_t)0x57f56284, (q31_t)0xa3025859, (q31_t)0x57f0d1da, (q31_t)0xa2fe0724, (q31_t)0x57ec40fa, (q31_t)0xa2f9b629, + (q31_t)0x57e7afe4, (q31_t)0xa2f56566, (q31_t)0x57e31e97, (q31_t)0xa2f114dd, (q31_t)0x57de8d15, (q31_t)0xa2ecc48e, (q31_t)0x57d9fb5c, (q31_t)0xa2e87477, + (q31_t)0x57d5696d, (q31_t)0xa2e4249b, (q31_t)0x57d0d747, (q31_t)0xa2dfd4f7, (q31_t)0x57cc44ec, (q31_t)0xa2db858e, (q31_t)0x57c7b25a, (q31_t)0xa2d7365d, + (q31_t)0x57c31f92, (q31_t)0xa2d2e766, (q31_t)0x57be8c94, (q31_t)0xa2ce98a9, (q31_t)0x57b9f960, (q31_t)0xa2ca4a25, (q31_t)0x57b565f6, (q31_t)0xa2c5fbda, + (q31_t)0x57b0d256, (q31_t)0xa2c1adc9, (q31_t)0x57ac3e80, (q31_t)0xa2bd5ff2, (q31_t)0x57a7aa73, (q31_t)0xa2b91254, (q31_t)0x57a31631, (q31_t)0xa2b4c4f0, + (q31_t)0x579e81b8, (q31_t)0xa2b077c5, (q31_t)0x5799ed0a, (q31_t)0xa2ac2ad3, (q31_t)0x57955825, (q31_t)0xa2a7de1c, (q31_t)0x5790c30a, (q31_t)0xa2a3919e, + (q31_t)0x578c2dba, (q31_t)0xa29f4559, (q31_t)0x57879833, (q31_t)0xa29af94e, (q31_t)0x57830276, (q31_t)0xa296ad7d, (q31_t)0x577e6c84, (q31_t)0xa29261e5, + (q31_t)0x5779d65b, (q31_t)0xa28e1687, (q31_t)0x57753ffc, (q31_t)0xa289cb63, (q31_t)0x5770a968, (q31_t)0xa2858078, (q31_t)0x576c129d, (q31_t)0xa28135c7, + (q31_t)0x57677b9d, (q31_t)0xa27ceb4f, (q31_t)0x5762e467, (q31_t)0xa278a111, (q31_t)0x575e4cfa, (q31_t)0xa274570d, (q31_t)0x5759b558, (q31_t)0xa2700d43, + (q31_t)0x57551d80, (q31_t)0xa26bc3b2, (q31_t)0x57508572, (q31_t)0xa2677a5b, (q31_t)0x574bed2f, (q31_t)0xa263313e, (q31_t)0x574754b5, (q31_t)0xa25ee85b, + (q31_t)0x5742bc06, (q31_t)0xa25a9fb1, (q31_t)0x573e2320, (q31_t)0xa2565741, (q31_t)0x57398a05, (q31_t)0xa2520f0b, (q31_t)0x5734f0b5, (q31_t)0xa24dc70f, + (q31_t)0x5730572e, (q31_t)0xa2497f4c, (q31_t)0x572bbd71, (q31_t)0xa24537c3, (q31_t)0x5727237f, (q31_t)0xa240f074, (q31_t)0x57228957, (q31_t)0xa23ca95f, + (q31_t)0x571deefa, (q31_t)0xa2386284, (q31_t)0x57195466, (q31_t)0xa2341be3, (q31_t)0x5714b99d, (q31_t)0xa22fd57b, (q31_t)0x57101e9e, (q31_t)0xa22b8f4d, + (q31_t)0x570b8369, (q31_t)0xa2274959, (q31_t)0x5706e7ff, (q31_t)0xa223039f, (q31_t)0x57024c5f, (q31_t)0xa21ebe1f, (q31_t)0x56fdb08a, (q31_t)0xa21a78d9, + (q31_t)0x56f9147e, (q31_t)0xa21633cd, (q31_t)0x56f4783d, (q31_t)0xa211eefb, (q31_t)0x56efdbc7, (q31_t)0xa20daa62, (q31_t)0x56eb3f1a, (q31_t)0xa2096604, + (q31_t)0x56e6a239, (q31_t)0xa20521e0, (q31_t)0x56e20521, (q31_t)0xa200ddf5, (q31_t)0x56dd67d4, (q31_t)0xa1fc9a45, (q31_t)0x56d8ca51, (q31_t)0xa1f856ce, + (q31_t)0x56d42c99, (q31_t)0xa1f41392, (q31_t)0x56cf8eab, (q31_t)0xa1efd08f, (q31_t)0x56caf088, (q31_t)0xa1eb8dc7, (q31_t)0x56c6522f, (q31_t)0xa1e74b38, + (q31_t)0x56c1b3a1, (q31_t)0xa1e308e4, (q31_t)0x56bd14dd, (q31_t)0xa1dec6ca, (q31_t)0x56b875e4, (q31_t)0xa1da84e9, (q31_t)0x56b3d6b5, (q31_t)0xa1d64343, + (q31_t)0x56af3750, (q31_t)0xa1d201d7, (q31_t)0x56aa97b7, (q31_t)0xa1cdc0a5, (q31_t)0x56a5f7e7, (q31_t)0xa1c97fad, (q31_t)0x56a157e3, (q31_t)0xa1c53ef0, + (q31_t)0x569cb7a8, (q31_t)0xa1c0fe6c, (q31_t)0x56981739, (q31_t)0xa1bcbe22, (q31_t)0x56937694, (q31_t)0xa1b87e13, (q31_t)0x568ed5b9, (q31_t)0xa1b43e3e, + (q31_t)0x568a34a9, (q31_t)0xa1affea3, (q31_t)0x56859364, (q31_t)0xa1abbf42, (q31_t)0x5680f1ea, (q31_t)0xa1a7801b, (q31_t)0x567c503a, (q31_t)0xa1a3412f, + (q31_t)0x5677ae54, (q31_t)0xa19f027c, (q31_t)0x56730c3a, (q31_t)0xa19ac404, (q31_t)0x566e69ea, (q31_t)0xa19685c7, (q31_t)0x5669c765, (q31_t)0xa19247c3, + (q31_t)0x566524aa, (q31_t)0xa18e09fa, (q31_t)0x566081ba, (q31_t)0xa189cc6b, (q31_t)0x565bde95, (q31_t)0xa1858f16, (q31_t)0x56573b3b, (q31_t)0xa18151fb, + (q31_t)0x565297ab, (q31_t)0xa17d151b, (q31_t)0x564df3e6, (q31_t)0xa178d875, (q31_t)0x56494fec, (q31_t)0xa1749c09, (q31_t)0x5644abbc, (q31_t)0xa1705fd8, + (q31_t)0x56400758, (q31_t)0xa16c23e1, (q31_t)0x563b62be, (q31_t)0xa167e824, (q31_t)0x5636bdef, (q31_t)0xa163aca2, (q31_t)0x563218eb, (q31_t)0xa15f715a, + (q31_t)0x562d73b2, (q31_t)0xa15b364d, (q31_t)0x5628ce43, (q31_t)0xa156fb79, (q31_t)0x5624289f, (q31_t)0xa152c0e1, (q31_t)0x561f82c7, (q31_t)0xa14e8682, + (q31_t)0x561adcb9, (q31_t)0xa14a4c5e, (q31_t)0x56163676, (q31_t)0xa1461275, (q31_t)0x56118ffe, (q31_t)0xa141d8c5, (q31_t)0x560ce950, (q31_t)0xa13d9f51, + (q31_t)0x5608426e, (q31_t)0xa1396617, (q31_t)0x56039b57, (q31_t)0xa1352d17, (q31_t)0x55fef40a, (q31_t)0xa130f451, (q31_t)0x55fa4c89, (q31_t)0xa12cbbc7, + (q31_t)0x55f5a4d2, (q31_t)0xa1288376, (q31_t)0x55f0fce7, (q31_t)0xa1244b61, (q31_t)0x55ec54c6, (q31_t)0xa1201385, (q31_t)0x55e7ac71, (q31_t)0xa11bdbe4, + (q31_t)0x55e303e6, (q31_t)0xa117a47e, (q31_t)0x55de5b27, (q31_t)0xa1136d52, (q31_t)0x55d9b232, (q31_t)0xa10f3661, (q31_t)0x55d50909, (q31_t)0xa10affab, + (q31_t)0x55d05faa, (q31_t)0xa106c92f, (q31_t)0x55cbb617, (q31_t)0xa10292ed, (q31_t)0x55c70c4f, (q31_t)0xa0fe5ce6, (q31_t)0x55c26251, (q31_t)0xa0fa271a, + (q31_t)0x55bdb81f, (q31_t)0xa0f5f189, (q31_t)0x55b90db8, (q31_t)0xa0f1bc32, (q31_t)0x55b4631d, (q31_t)0xa0ed8715, (q31_t)0x55afb84c, (q31_t)0xa0e95234, + (q31_t)0x55ab0d46, (q31_t)0xa0e51d8c, (q31_t)0x55a6620c, (q31_t)0xa0e0e920, (q31_t)0x55a1b69d, (q31_t)0xa0dcb4ee, (q31_t)0x559d0af9, (q31_t)0xa0d880f7, + (q31_t)0x55985f20, (q31_t)0xa0d44d3b, (q31_t)0x5593b312, (q31_t)0xa0d019b9, (q31_t)0x558f06d0, (q31_t)0xa0cbe672, (q31_t)0x558a5a58, (q31_t)0xa0c7b366, + (q31_t)0x5585adad, (q31_t)0xa0c38095, (q31_t)0x558100cc, (q31_t)0xa0bf4dfe, (q31_t)0x557c53b6, (q31_t)0xa0bb1ba2, (q31_t)0x5577a66c, (q31_t)0xa0b6e981, + (q31_t)0x5572f8ed, (q31_t)0xa0b2b79b, (q31_t)0x556e4b39, (q31_t)0xa0ae85ef, (q31_t)0x55699d51, (q31_t)0xa0aa547e, (q31_t)0x5564ef34, (q31_t)0xa0a62348, + (q31_t)0x556040e2, (q31_t)0xa0a1f24d, (q31_t)0x555b925c, (q31_t)0xa09dc18d, (q31_t)0x5556e3a1, (q31_t)0xa0999107, (q31_t)0x555234b1, (q31_t)0xa09560bc, + (q31_t)0x554d858d, (q31_t)0xa09130ad, (q31_t)0x5548d634, (q31_t)0xa08d00d8, (q31_t)0x554426a7, (q31_t)0xa088d13e, (q31_t)0x553f76e4, (q31_t)0xa084a1de, + (q31_t)0x553ac6ee, (q31_t)0xa08072ba, (q31_t)0x553616c2, (q31_t)0xa07c43d1, (q31_t)0x55316663, (q31_t)0xa0781522, (q31_t)0x552cb5ce, (q31_t)0xa073e6af, + (q31_t)0x55280505, (q31_t)0xa06fb876, (q31_t)0x55235408, (q31_t)0xa06b8a78, (q31_t)0x551ea2d6, (q31_t)0xa0675cb6, (q31_t)0x5519f16f, (q31_t)0xa0632f2e, + (q31_t)0x55153fd4, (q31_t)0xa05f01e1, (q31_t)0x55108e05, (q31_t)0xa05ad4cf, (q31_t)0x550bdc01, (q31_t)0xa056a7f9, (q31_t)0x550729c9, (q31_t)0xa0527b5d, + (q31_t)0x5502775c, (q31_t)0xa04e4efc, (q31_t)0x54fdc4ba, (q31_t)0xa04a22d7, (q31_t)0x54f911e5, (q31_t)0xa045f6ec, (q31_t)0x54f45edb, (q31_t)0xa041cb3c, + (q31_t)0x54efab9c, (q31_t)0xa03d9fc8, (q31_t)0x54eaf829, (q31_t)0xa039748e, (q31_t)0x54e64482, (q31_t)0xa0354990, (q31_t)0x54e190a6, (q31_t)0xa0311ecd, + (q31_t)0x54dcdc96, (q31_t)0xa02cf444, (q31_t)0x54d82852, (q31_t)0xa028c9f7, (q31_t)0x54d373d9, (q31_t)0xa0249fe5, (q31_t)0x54cebf2c, (q31_t)0xa020760e, + (q31_t)0x54ca0a4b, (q31_t)0xa01c4c73, (q31_t)0x54c55535, (q31_t)0xa0182312, (q31_t)0x54c09feb, (q31_t)0xa013f9ed, (q31_t)0x54bbea6d, (q31_t)0xa00fd102, + (q31_t)0x54b734ba, (q31_t)0xa00ba853, (q31_t)0x54b27ed3, (q31_t)0xa0077fdf, (q31_t)0x54adc8b8, (q31_t)0xa00357a7, (q31_t)0x54a91269, (q31_t)0x9fff2fa9, + (q31_t)0x54a45be6, (q31_t)0x9ffb07e7, (q31_t)0x549fa52e, (q31_t)0x9ff6e060, (q31_t)0x549aee42, (q31_t)0x9ff2b914, (q31_t)0x54963722, (q31_t)0x9fee9204, + (q31_t)0x54917fce, (q31_t)0x9fea6b2f, (q31_t)0x548cc845, (q31_t)0x9fe64495, (q31_t)0x54881089, (q31_t)0x9fe21e36, (q31_t)0x54835898, (q31_t)0x9fddf812, + (q31_t)0x547ea073, (q31_t)0x9fd9d22a, (q31_t)0x5479e81a, (q31_t)0x9fd5ac7d, (q31_t)0x54752f8d, (q31_t)0x9fd1870c, (q31_t)0x547076cc, (q31_t)0x9fcd61d6, + (q31_t)0x546bbdd7, (q31_t)0x9fc93cdb, (q31_t)0x546704ae, (q31_t)0x9fc5181b, (q31_t)0x54624b50, (q31_t)0x9fc0f397, (q31_t)0x545d91bf, (q31_t)0x9fbccf4f, + (q31_t)0x5458d7f9, (q31_t)0x9fb8ab41, (q31_t)0x54541e00, (q31_t)0x9fb4876f, (q31_t)0x544f63d2, (q31_t)0x9fb063d9, (q31_t)0x544aa971, (q31_t)0x9fac407e, + (q31_t)0x5445eedb, (q31_t)0x9fa81d5e, (q31_t)0x54413412, (q31_t)0x9fa3fa79, (q31_t)0x543c7914, (q31_t)0x9f9fd7d1, (q31_t)0x5437bde3, (q31_t)0x9f9bb563, + (q31_t)0x5433027d, (q31_t)0x9f979331, (q31_t)0x542e46e4, (q31_t)0x9f93713b, (q31_t)0x54298b17, (q31_t)0x9f8f4f80, (q31_t)0x5424cf16, (q31_t)0x9f8b2e00, + (q31_t)0x542012e1, (q31_t)0x9f870cbc, (q31_t)0x541b5678, (q31_t)0x9f82ebb4, (q31_t)0x541699db, (q31_t)0x9f7ecae7, (q31_t)0x5411dd0a, (q31_t)0x9f7aaa55, + (q31_t)0x540d2005, (q31_t)0x9f7689ff, (q31_t)0x540862cd, (q31_t)0x9f7269e5, (q31_t)0x5403a561, (q31_t)0x9f6e4a06, (q31_t)0x53fee7c1, (q31_t)0x9f6a2a63, + (q31_t)0x53fa29ed, (q31_t)0x9f660afb, (q31_t)0x53f56be5, (q31_t)0x9f61ebcf, (q31_t)0x53f0adaa, (q31_t)0x9f5dccde, (q31_t)0x53ebef3a, (q31_t)0x9f59ae29, + (q31_t)0x53e73097, (q31_t)0x9f558fb0, (q31_t)0x53e271c0, (q31_t)0x9f517173, (q31_t)0x53ddb2b6, (q31_t)0x9f4d5371, (q31_t)0x53d8f378, (q31_t)0x9f4935aa, + (q31_t)0x53d43406, (q31_t)0x9f45181f, (q31_t)0x53cf7460, (q31_t)0x9f40fad0, (q31_t)0x53cab486, (q31_t)0x9f3cddbd, (q31_t)0x53c5f479, (q31_t)0x9f38c0e5, + (q31_t)0x53c13439, (q31_t)0x9f34a449, (q31_t)0x53bc73c4, (q31_t)0x9f3087e9, (q31_t)0x53b7b31c, (q31_t)0x9f2c6bc5, (q31_t)0x53b2f240, (q31_t)0x9f284fdc, + (q31_t)0x53ae3131, (q31_t)0x9f24342f, (q31_t)0x53a96fee, (q31_t)0x9f2018bd, (q31_t)0x53a4ae77, (q31_t)0x9f1bfd88, (q31_t)0x539feccd, (q31_t)0x9f17e28e, + (q31_t)0x539b2af0, (q31_t)0x9f13c7d0, (q31_t)0x539668de, (q31_t)0x9f0fad4e, (q31_t)0x5391a699, (q31_t)0x9f0b9307, (q31_t)0x538ce421, (q31_t)0x9f0778fd, + (q31_t)0x53882175, (q31_t)0x9f035f2e, (q31_t)0x53835e95, (q31_t)0x9eff459b, (q31_t)0x537e9b82, (q31_t)0x9efb2c44, (q31_t)0x5379d83c, (q31_t)0x9ef71328, + (q31_t)0x537514c2, (q31_t)0x9ef2fa49, (q31_t)0x53705114, (q31_t)0x9eeee1a5, (q31_t)0x536b8d33, (q31_t)0x9eeac93e, (q31_t)0x5366c91f, (q31_t)0x9ee6b112, + (q31_t)0x536204d7, (q31_t)0x9ee29922, (q31_t)0x535d405c, (q31_t)0x9ede816e, (q31_t)0x53587bad, (q31_t)0x9eda69f6, (q31_t)0x5353b6cb, (q31_t)0x9ed652ba, + (q31_t)0x534ef1b5, (q31_t)0x9ed23bb9, (q31_t)0x534a2c6c, (q31_t)0x9ece24f5, (q31_t)0x534566f0, (q31_t)0x9eca0e6d, (q31_t)0x5340a140, (q31_t)0x9ec5f820, + (q31_t)0x533bdb5d, (q31_t)0x9ec1e210, (q31_t)0x53371547, (q31_t)0x9ebdcc3b, (q31_t)0x53324efd, (q31_t)0x9eb9b6a3, (q31_t)0x532d8880, (q31_t)0x9eb5a146, + (q31_t)0x5328c1d0, (q31_t)0x9eb18c26, (q31_t)0x5323faec, (q31_t)0x9ead7742, (q31_t)0x531f33d5, (q31_t)0x9ea96299, (q31_t)0x531a6c8b, (q31_t)0x9ea54e2d, + (q31_t)0x5315a50e, (q31_t)0x9ea139fd, (q31_t)0x5310dd5d, (q31_t)0x9e9d2608, (q31_t)0x530c1579, (q31_t)0x9e991250, (q31_t)0x53074d62, (q31_t)0x9e94fed4, + (q31_t)0x53028518, (q31_t)0x9e90eb94, (q31_t)0x52fdbc9a, (q31_t)0x9e8cd890, (q31_t)0x52f8f3e9, (q31_t)0x9e88c5c9, (q31_t)0x52f42b05, (q31_t)0x9e84b33d, + (q31_t)0x52ef61ee, (q31_t)0x9e80a0ee, (q31_t)0x52ea98a4, (q31_t)0x9e7c8eda, (q31_t)0x52e5cf27, (q31_t)0x9e787d03, (q31_t)0x52e10576, (q31_t)0x9e746b68, + (q31_t)0x52dc3b92, (q31_t)0x9e705a09, (q31_t)0x52d7717b, (q31_t)0x9e6c48e7, (q31_t)0x52d2a732, (q31_t)0x9e683800, (q31_t)0x52cddcb5, (q31_t)0x9e642756, + (q31_t)0x52c91204, (q31_t)0x9e6016e8, (q31_t)0x52c44721, (q31_t)0x9e5c06b6, (q31_t)0x52bf7c0b, (q31_t)0x9e57f6c0, (q31_t)0x52bab0c2, (q31_t)0x9e53e707, + (q31_t)0x52b5e546, (q31_t)0x9e4fd78a, (q31_t)0x52b11996, (q31_t)0x9e4bc849, (q31_t)0x52ac4db4, (q31_t)0x9e47b944, (q31_t)0x52a7819f, (q31_t)0x9e43aa7c, + (q31_t)0x52a2b556, (q31_t)0x9e3f9bf0, (q31_t)0x529de8db, (q31_t)0x9e3b8da0, (q31_t)0x52991c2d, (q31_t)0x9e377f8c, (q31_t)0x52944f4c, (q31_t)0x9e3371b5, + (q31_t)0x528f8238, (q31_t)0x9e2f641b, (q31_t)0x528ab4f1, (q31_t)0x9e2b56bc, (q31_t)0x5285e777, (q31_t)0x9e27499a, (q31_t)0x528119ca, (q31_t)0x9e233cb4, + (q31_t)0x527c4bea, (q31_t)0x9e1f300b, (q31_t)0x52777dd7, (q31_t)0x9e1b239e, (q31_t)0x5272af92, (q31_t)0x9e17176d, (q31_t)0x526de11a, (q31_t)0x9e130b79, + (q31_t)0x5269126e, (q31_t)0x9e0effc1, (q31_t)0x52644390, (q31_t)0x9e0af446, (q31_t)0x525f7480, (q31_t)0x9e06e907, (q31_t)0x525aa53c, (q31_t)0x9e02de04, + (q31_t)0x5255d5c5, (q31_t)0x9dfed33e, (q31_t)0x5251061c, (q31_t)0x9dfac8b4, (q31_t)0x524c3640, (q31_t)0x9df6be67, (q31_t)0x52476631, (q31_t)0x9df2b456, + (q31_t)0x524295f0, (q31_t)0x9deeaa82, (q31_t)0x523dc57b, (q31_t)0x9deaa0ea, (q31_t)0x5238f4d4, (q31_t)0x9de6978f, (q31_t)0x523423fb, (q31_t)0x9de28e70, + (q31_t)0x522f52ee, (q31_t)0x9dde858e, (q31_t)0x522a81af, (q31_t)0x9dda7ce9, (q31_t)0x5225b03d, (q31_t)0x9dd6747f, (q31_t)0x5220de99, (q31_t)0x9dd26c53, + (q31_t)0x521c0cc2, (q31_t)0x9dce6463, (q31_t)0x52173ab8, (q31_t)0x9dca5caf, (q31_t)0x5212687b, (q31_t)0x9dc65539, (q31_t)0x520d960c, (q31_t)0x9dc24dfe, + (q31_t)0x5208c36a, (q31_t)0x9dbe4701, (q31_t)0x5203f096, (q31_t)0x9dba4040, (q31_t)0x51ff1d8f, (q31_t)0x9db639bb, (q31_t)0x51fa4a56, (q31_t)0x9db23373, + (q31_t)0x51f576ea, (q31_t)0x9dae2d68, (q31_t)0x51f0a34b, (q31_t)0x9daa279a, (q31_t)0x51ebcf7a, (q31_t)0x9da62208, (q31_t)0x51e6fb76, (q31_t)0x9da21cb2, + (q31_t)0x51e22740, (q31_t)0x9d9e179a, (q31_t)0x51dd52d7, (q31_t)0x9d9a12be, (q31_t)0x51d87e3c, (q31_t)0x9d960e1f, (q31_t)0x51d3a96f, (q31_t)0x9d9209bd, + (q31_t)0x51ced46e, (q31_t)0x9d8e0597, (q31_t)0x51c9ff3c, (q31_t)0x9d8a01ae, (q31_t)0x51c529d7, (q31_t)0x9d85fe02, (q31_t)0x51c0543f, (q31_t)0x9d81fa92, + (q31_t)0x51bb7e75, (q31_t)0x9d7df75f, (q31_t)0x51b6a879, (q31_t)0x9d79f469, (q31_t)0x51b1d24a, (q31_t)0x9d75f1b0, (q31_t)0x51acfbe9, (q31_t)0x9d71ef34, + (q31_t)0x51a82555, (q31_t)0x9d6decf4, (q31_t)0x51a34e8f, (q31_t)0x9d69eaf1, (q31_t)0x519e7797, (q31_t)0x9d65e92b, (q31_t)0x5199a06d, (q31_t)0x9d61e7a2, + (q31_t)0x5194c910, (q31_t)0x9d5de656, (q31_t)0x518ff180, (q31_t)0x9d59e546, (q31_t)0x518b19bf, (q31_t)0x9d55e473, (q31_t)0x518641cb, (q31_t)0x9d51e3dd, + (q31_t)0x518169a5, (q31_t)0x9d4de385, (q31_t)0x517c914c, (q31_t)0x9d49e368, (q31_t)0x5177b8c2, (q31_t)0x9d45e389, (q31_t)0x5172e005, (q31_t)0x9d41e3e7, + (q31_t)0x516e0715, (q31_t)0x9d3de482, (q31_t)0x51692df4, (q31_t)0x9d39e559, (q31_t)0x516454a0, (q31_t)0x9d35e66e, (q31_t)0x515f7b1a, (q31_t)0x9d31e7bf, + (q31_t)0x515aa162, (q31_t)0x9d2de94d, (q31_t)0x5155c778, (q31_t)0x9d29eb19, (q31_t)0x5150ed5c, (q31_t)0x9d25ed21, (q31_t)0x514c130d, (q31_t)0x9d21ef66, + (q31_t)0x5147388c, (q31_t)0x9d1df1e9, (q31_t)0x51425dd9, (q31_t)0x9d19f4a8, (q31_t)0x513d82f4, (q31_t)0x9d15f7a4, (q31_t)0x5138a7dd, (q31_t)0x9d11fadd, + (q31_t)0x5133cc94, (q31_t)0x9d0dfe54, (q31_t)0x512ef119, (q31_t)0x9d0a0207, (q31_t)0x512a156b, (q31_t)0x9d0605f7, (q31_t)0x5125398c, (q31_t)0x9d020a25, + (q31_t)0x51205d7b, (q31_t)0x9cfe0e8f, (q31_t)0x511b8137, (q31_t)0x9cfa1337, (q31_t)0x5116a4c1, (q31_t)0x9cf6181c, (q31_t)0x5111c81a, (q31_t)0x9cf21d3d, + (q31_t)0x510ceb40, (q31_t)0x9cee229c, (q31_t)0x51080e35, (q31_t)0x9cea2838, (q31_t)0x510330f7, (q31_t)0x9ce62e11, (q31_t)0x50fe5388, (q31_t)0x9ce23427, + (q31_t)0x50f975e6, (q31_t)0x9cde3a7b, (q31_t)0x50f49813, (q31_t)0x9cda410b, (q31_t)0x50efba0d, (q31_t)0x9cd647d9, (q31_t)0x50eadbd6, (q31_t)0x9cd24ee4, + (q31_t)0x50e5fd6d, (q31_t)0x9cce562c, (q31_t)0x50e11ed2, (q31_t)0x9cca5db1, (q31_t)0x50dc4005, (q31_t)0x9cc66573, (q31_t)0x50d76106, (q31_t)0x9cc26d73, + (q31_t)0x50d281d5, (q31_t)0x9cbe75b0, (q31_t)0x50cda272, (q31_t)0x9cba7e2a, (q31_t)0x50c8c2de, (q31_t)0x9cb686e1, (q31_t)0x50c3e317, (q31_t)0x9cb28fd5, + (q31_t)0x50bf031f, (q31_t)0x9cae9907, (q31_t)0x50ba22f5, (q31_t)0x9caaa276, (q31_t)0x50b5429a, (q31_t)0x9ca6ac23, (q31_t)0x50b0620c, (q31_t)0x9ca2b60c, + (q31_t)0x50ab814d, (q31_t)0x9c9ec033, (q31_t)0x50a6a05c, (q31_t)0x9c9aca97, (q31_t)0x50a1bf39, (q31_t)0x9c96d539, (q31_t)0x509cdde4, (q31_t)0x9c92e017, + (q31_t)0x5097fc5e, (q31_t)0x9c8eeb34, (q31_t)0x50931aa6, (q31_t)0x9c8af68d, (q31_t)0x508e38bd, (q31_t)0x9c870224, (q31_t)0x508956a1, (q31_t)0x9c830df8, + (q31_t)0x50847454, (q31_t)0x9c7f1a0a, (q31_t)0x507f91d5, (q31_t)0x9c7b2659, (q31_t)0x507aaf25, (q31_t)0x9c7732e5, (q31_t)0x5075cc43, (q31_t)0x9c733faf, + (q31_t)0x5070e92f, (q31_t)0x9c6f4cb6, (q31_t)0x506c05ea, (q31_t)0x9c6b59fa, (q31_t)0x50672273, (q31_t)0x9c67677c, (q31_t)0x50623ecb, (q31_t)0x9c63753c, + (q31_t)0x505d5af1, (q31_t)0x9c5f8339, (q31_t)0x505876e5, (q31_t)0x9c5b9173, (q31_t)0x505392a8, (q31_t)0x9c579feb, (q31_t)0x504eae39, (q31_t)0x9c53aea0, + (q31_t)0x5049c999, (q31_t)0x9c4fbd93, (q31_t)0x5044e4c7, (q31_t)0x9c4bccc3, (q31_t)0x503fffc4, (q31_t)0x9c47dc31, (q31_t)0x503b1a8f, (q31_t)0x9c43ebdc, + (q31_t)0x50363529, (q31_t)0x9c3ffbc5, (q31_t)0x50314f91, (q31_t)0x9c3c0beb, (q31_t)0x502c69c8, (q31_t)0x9c381c4f, (q31_t)0x502783cd, (q31_t)0x9c342cf0, + (q31_t)0x50229da1, (q31_t)0x9c303dcf, (q31_t)0x501db743, (q31_t)0x9c2c4eec, (q31_t)0x5018d0b4, (q31_t)0x9c286046, (q31_t)0x5013e9f4, (q31_t)0x9c2471de, + (q31_t)0x500f0302, (q31_t)0x9c2083b3, (q31_t)0x500a1bdf, (q31_t)0x9c1c95c6, (q31_t)0x5005348a, (q31_t)0x9c18a816, (q31_t)0x50004d04, (q31_t)0x9c14baa4, + (q31_t)0x4ffb654d, (q31_t)0x9c10cd70, (q31_t)0x4ff67d64, (q31_t)0x9c0ce07a, (q31_t)0x4ff1954b, (q31_t)0x9c08f3c1, (q31_t)0x4fecacff, (q31_t)0x9c050745, + (q31_t)0x4fe7c483, (q31_t)0x9c011b08, (q31_t)0x4fe2dbd5, (q31_t)0x9bfd2f08, (q31_t)0x4fddf2f6, (q31_t)0x9bf94346, (q31_t)0x4fd909e5, (q31_t)0x9bf557c1, + (q31_t)0x4fd420a4, (q31_t)0x9bf16c7a, (q31_t)0x4fcf3731, (q31_t)0x9bed8171, (q31_t)0x4fca4d8d, (q31_t)0x9be996a6, (q31_t)0x4fc563b7, (q31_t)0x9be5ac18, + (q31_t)0x4fc079b1, (q31_t)0x9be1c1c8, (q31_t)0x4fbb8f79, (q31_t)0x9bddd7b6, (q31_t)0x4fb6a510, (q31_t)0x9bd9ede2, (q31_t)0x4fb1ba76, (q31_t)0x9bd6044b, + (q31_t)0x4faccfab, (q31_t)0x9bd21af3, (q31_t)0x4fa7e4af, (q31_t)0x9bce31d8, (q31_t)0x4fa2f981, (q31_t)0x9bca48fa, (q31_t)0x4f9e0e22, (q31_t)0x9bc6605b, + (q31_t)0x4f992293, (q31_t)0x9bc277fa, (q31_t)0x4f9436d2, (q31_t)0x9bbe8fd6, (q31_t)0x4f8f4ae0, (q31_t)0x9bbaa7f0, (q31_t)0x4f8a5ebd, (q31_t)0x9bb6c048, + (q31_t)0x4f857269, (q31_t)0x9bb2d8de, (q31_t)0x4f8085e4, (q31_t)0x9baef1b2, (q31_t)0x4f7b992d, (q31_t)0x9bab0ac3, (q31_t)0x4f76ac46, (q31_t)0x9ba72413, + (q31_t)0x4f71bf2e, (q31_t)0x9ba33da0, (q31_t)0x4f6cd1e5, (q31_t)0x9b9f576b, (q31_t)0x4f67e46a, (q31_t)0x9b9b7174, (q31_t)0x4f62f6bf, (q31_t)0x9b978bbc, + (q31_t)0x4f5e08e3, (q31_t)0x9b93a641, (q31_t)0x4f591ad6, (q31_t)0x9b8fc104, (q31_t)0x4f542c98, (q31_t)0x9b8bdc05, (q31_t)0x4f4f3e29, (q31_t)0x9b87f744, + (q31_t)0x4f4a4f89, (q31_t)0x9b8412c1, (q31_t)0x4f4560b8, (q31_t)0x9b802e7b, (q31_t)0x4f4071b6, (q31_t)0x9b7c4a74, (q31_t)0x4f3b8284, (q31_t)0x9b7866ab, + (q31_t)0x4f369320, (q31_t)0x9b748320, (q31_t)0x4f31a38c, (q31_t)0x9b709fd3, (q31_t)0x4f2cb3c7, (q31_t)0x9b6cbcc4, (q31_t)0x4f27c3d1, (q31_t)0x9b68d9f3, + (q31_t)0x4f22d3aa, (q31_t)0x9b64f760, (q31_t)0x4f1de352, (q31_t)0x9b61150b, (q31_t)0x4f18f2c9, (q31_t)0x9b5d32f4, (q31_t)0x4f140210, (q31_t)0x9b59511c, + (q31_t)0x4f0f1126, (q31_t)0x9b556f81, (q31_t)0x4f0a200b, (q31_t)0x9b518e24, (q31_t)0x4f052ec0, (q31_t)0x9b4dad06, (q31_t)0x4f003d43, (q31_t)0x9b49cc26, + (q31_t)0x4efb4b96, (q31_t)0x9b45eb83, (q31_t)0x4ef659b8, (q31_t)0x9b420b1f, (q31_t)0x4ef167aa, (q31_t)0x9b3e2af9, (q31_t)0x4eec756b, (q31_t)0x9b3a4b11, + (q31_t)0x4ee782fb, (q31_t)0x9b366b68, (q31_t)0x4ee2905a, (q31_t)0x9b328bfc, (q31_t)0x4edd9d89, (q31_t)0x9b2eaccf, (q31_t)0x4ed8aa87, (q31_t)0x9b2acde0, + (q31_t)0x4ed3b755, (q31_t)0x9b26ef2f, (q31_t)0x4ecec3f2, (q31_t)0x9b2310bc, (q31_t)0x4ec9d05e, (q31_t)0x9b1f3288, (q31_t)0x4ec4dc99, (q31_t)0x9b1b5492, + (q31_t)0x4ebfe8a5, (q31_t)0x9b1776da, (q31_t)0x4ebaf47f, (q31_t)0x9b139960, (q31_t)0x4eb60029, (q31_t)0x9b0fbc24, (q31_t)0x4eb10ba2, (q31_t)0x9b0bdf27, + (q31_t)0x4eac16eb, (q31_t)0x9b080268, (q31_t)0x4ea72203, (q31_t)0x9b0425e8, (q31_t)0x4ea22ceb, (q31_t)0x9b0049a5, (q31_t)0x4e9d37a3, (q31_t)0x9afc6da1, + (q31_t)0x4e984229, (q31_t)0x9af891db, (q31_t)0x4e934c80, (q31_t)0x9af4b654, (q31_t)0x4e8e56a5, (q31_t)0x9af0db0b, (q31_t)0x4e89609b, (q31_t)0x9aed0000, + (q31_t)0x4e846a60, (q31_t)0x9ae92533, (q31_t)0x4e7f73f4, (q31_t)0x9ae54aa5, (q31_t)0x4e7a7d58, (q31_t)0x9ae17056, (q31_t)0x4e75868c, (q31_t)0x9add9644, + (q31_t)0x4e708f8f, (q31_t)0x9ad9bc71, (q31_t)0x4e6b9862, (q31_t)0x9ad5e2dd, (q31_t)0x4e66a105, (q31_t)0x9ad20987, (q31_t)0x4e61a977, (q31_t)0x9ace306f, + (q31_t)0x4e5cb1b9, (q31_t)0x9aca5795, (q31_t)0x4e57b9ca, (q31_t)0x9ac67efb, (q31_t)0x4e52c1ab, (q31_t)0x9ac2a69e, (q31_t)0x4e4dc95c, (q31_t)0x9abece80, + (q31_t)0x4e48d0dd, (q31_t)0x9abaf6a1, (q31_t)0x4e43d82d, (q31_t)0x9ab71eff, (q31_t)0x4e3edf4d, (q31_t)0x9ab3479d, (q31_t)0x4e39e63d, (q31_t)0x9aaf7079, + (q31_t)0x4e34ecfc, (q31_t)0x9aab9993, (q31_t)0x4e2ff38b, (q31_t)0x9aa7c2ec, (q31_t)0x4e2af9ea, (q31_t)0x9aa3ec83, (q31_t)0x4e260019, (q31_t)0x9aa01659, + (q31_t)0x4e210617, (q31_t)0x9a9c406e, (q31_t)0x4e1c0be6, (q31_t)0x9a986ac1, (q31_t)0x4e171184, (q31_t)0x9a949552, (q31_t)0x4e1216f2, (q31_t)0x9a90c022, + (q31_t)0x4e0d1c30, (q31_t)0x9a8ceb31, (q31_t)0x4e08213e, (q31_t)0x9a89167e, (q31_t)0x4e03261b, (q31_t)0x9a85420a, (q31_t)0x4dfe2ac9, (q31_t)0x9a816dd5, + (q31_t)0x4df92f46, (q31_t)0x9a7d99de, (q31_t)0x4df43393, (q31_t)0x9a79c625, (q31_t)0x4def37b0, (q31_t)0x9a75f2ac, (q31_t)0x4dea3b9d, (q31_t)0x9a721f71, + (q31_t)0x4de53f5a, (q31_t)0x9a6e4c74, (q31_t)0x4de042e7, (q31_t)0x9a6a79b6, (q31_t)0x4ddb4644, (q31_t)0x9a66a737, (q31_t)0x4dd64971, (q31_t)0x9a62d4f7, + (q31_t)0x4dd14c6e, (q31_t)0x9a5f02f5, (q31_t)0x4dcc4f3b, (q31_t)0x9a5b3132, (q31_t)0x4dc751d8, (q31_t)0x9a575fae, (q31_t)0x4dc25445, (q31_t)0x9a538e68, + (q31_t)0x4dbd5682, (q31_t)0x9a4fbd61, (q31_t)0x4db8588f, (q31_t)0x9a4bec99, (q31_t)0x4db35a6c, (q31_t)0x9a481c0f, (q31_t)0x4dae5c19, (q31_t)0x9a444bc5, + (q31_t)0x4da95d96, (q31_t)0x9a407bb9, (q31_t)0x4da45ee3, (q31_t)0x9a3cabeb, (q31_t)0x4d9f6001, (q31_t)0x9a38dc5d, (q31_t)0x4d9a60ee, (q31_t)0x9a350d0d, + (q31_t)0x4d9561ac, (q31_t)0x9a313dfc, (q31_t)0x4d90623a, (q31_t)0x9a2d6f2a, (q31_t)0x4d8b6298, (q31_t)0x9a29a097, (q31_t)0x4d8662c6, (q31_t)0x9a25d243, + (q31_t)0x4d8162c4, (q31_t)0x9a22042d, (q31_t)0x4d7c6293, (q31_t)0x9a1e3656, (q31_t)0x4d776231, (q31_t)0x9a1a68be, (q31_t)0x4d7261a0, (q31_t)0x9a169b65, + (q31_t)0x4d6d60df, (q31_t)0x9a12ce4b, (q31_t)0x4d685fef, (q31_t)0x9a0f016f, (q31_t)0x4d635ece, (q31_t)0x9a0b34d3, (q31_t)0x4d5e5d7e, (q31_t)0x9a076875, + (q31_t)0x4d595bfe, (q31_t)0x9a039c57, (q31_t)0x4d545a4f, (q31_t)0x99ffd077, (q31_t)0x4d4f5870, (q31_t)0x99fc04d6, (q31_t)0x4d4a5661, (q31_t)0x99f83974, + (q31_t)0x4d455422, (q31_t)0x99f46e51, (q31_t)0x4d4051b4, (q31_t)0x99f0a36d, (q31_t)0x4d3b4f16, (q31_t)0x99ecd8c8, (q31_t)0x4d364c48, (q31_t)0x99e90e62, + (q31_t)0x4d31494b, (q31_t)0x99e5443b, (q31_t)0x4d2c461e, (q31_t)0x99e17a53, (q31_t)0x4d2742c2, (q31_t)0x99ddb0aa, (q31_t)0x4d223f36, (q31_t)0x99d9e73f, + (q31_t)0x4d1d3b7a, (q31_t)0x99d61e14, (q31_t)0x4d18378f, (q31_t)0x99d25528, (q31_t)0x4d133374, (q31_t)0x99ce8c7b, (q31_t)0x4d0e2f2a, (q31_t)0x99cac40d, + (q31_t)0x4d092ab0, (q31_t)0x99c6fbde, (q31_t)0x4d042607, (q31_t)0x99c333ee, (q31_t)0x4cff212e, (q31_t)0x99bf6c3d, (q31_t)0x4cfa1c26, (q31_t)0x99bba4cb, + (q31_t)0x4cf516ee, (q31_t)0x99b7dd99, (q31_t)0x4cf01187, (q31_t)0x99b416a5, (q31_t)0x4ceb0bf0, (q31_t)0x99b04ff0, (q31_t)0x4ce6062a, (q31_t)0x99ac897b, + (q31_t)0x4ce10034, (q31_t)0x99a8c345, (q31_t)0x4cdbfa0f, (q31_t)0x99a4fd4d, (q31_t)0x4cd6f3bb, (q31_t)0x99a13795, (q31_t)0x4cd1ed37, (q31_t)0x999d721c, + (q31_t)0x4ccce684, (q31_t)0x9999ace3, (q31_t)0x4cc7dfa1, (q31_t)0x9995e7e8, (q31_t)0x4cc2d88f, (q31_t)0x9992232d, (q31_t)0x4cbdd14e, (q31_t)0x998e5eb1, + (q31_t)0x4cb8c9dd, (q31_t)0x998a9a74, (q31_t)0x4cb3c23d, (q31_t)0x9986d676, (q31_t)0x4caeba6e, (q31_t)0x998312b7, (q31_t)0x4ca9b26f, (q31_t)0x997f4f38, + (q31_t)0x4ca4aa41, (q31_t)0x997b8bf8, (q31_t)0x4c9fa1e4, (q31_t)0x9977c8f7, (q31_t)0x4c9a9958, (q31_t)0x99740635, (q31_t)0x4c95909c, (q31_t)0x997043b2, + (q31_t)0x4c9087b1, (q31_t)0x996c816f, (q31_t)0x4c8b7e97, (q31_t)0x9968bf6b, (q31_t)0x4c86754e, (q31_t)0x9964fda7, (q31_t)0x4c816bd5, (q31_t)0x99613c22, + (q31_t)0x4c7c622d, (q31_t)0x995d7adc, (q31_t)0x4c775856, (q31_t)0x9959b9d5, (q31_t)0x4c724e50, (q31_t)0x9955f90d, (q31_t)0x4c6d441b, (q31_t)0x99523885, + (q31_t)0x4c6839b7, (q31_t)0x994e783d, (q31_t)0x4c632f23, (q31_t)0x994ab833, (q31_t)0x4c5e2460, (q31_t)0x9946f869, (q31_t)0x4c59196f, (q31_t)0x994338df, + (q31_t)0x4c540e4e, (q31_t)0x993f7993, (q31_t)0x4c4f02fe, (q31_t)0x993bba87, (q31_t)0x4c49f77f, (q31_t)0x9937fbbb, (q31_t)0x4c44ebd1, (q31_t)0x99343d2e, + (q31_t)0x4c3fdff4, (q31_t)0x99307ee0, (q31_t)0x4c3ad3e7, (q31_t)0x992cc0d2, (q31_t)0x4c35c7ac, (q31_t)0x99290303, (q31_t)0x4c30bb42, (q31_t)0x99254574, + (q31_t)0x4c2baea9, (q31_t)0x99218824, (q31_t)0x4c26a1e1, (q31_t)0x991dcb13, (q31_t)0x4c2194e9, (q31_t)0x991a0e42, (q31_t)0x4c1c87c3, (q31_t)0x991651b1, + (q31_t)0x4c177a6e, (q31_t)0x9912955f, (q31_t)0x4c126cea, (q31_t)0x990ed94c, (q31_t)0x4c0d5f37, (q31_t)0x990b1d79, (q31_t)0x4c085156, (q31_t)0x990761e5, + (q31_t)0x4c034345, (q31_t)0x9903a691, (q31_t)0x4bfe3505, (q31_t)0x98ffeb7d, (q31_t)0x4bf92697, (q31_t)0x98fc30a8, (q31_t)0x4bf417f9, (q31_t)0x98f87612, + (q31_t)0x4bef092d, (q31_t)0x98f4bbbc, (q31_t)0x4be9fa32, (q31_t)0x98f101a6, (q31_t)0x4be4eb08, (q31_t)0x98ed47cf, (q31_t)0x4bdfdbaf, (q31_t)0x98e98e38, + (q31_t)0x4bdacc28, (q31_t)0x98e5d4e0, (q31_t)0x4bd5bc72, (q31_t)0x98e21bc8, (q31_t)0x4bd0ac8d, (q31_t)0x98de62f0, (q31_t)0x4bcb9c79, (q31_t)0x98daaa57, + (q31_t)0x4bc68c36, (q31_t)0x98d6f1fe, (q31_t)0x4bc17bc5, (q31_t)0x98d339e4, (q31_t)0x4bbc6b25, (q31_t)0x98cf820b, (q31_t)0x4bb75a56, (q31_t)0x98cbca70, + (q31_t)0x4bb24958, (q31_t)0x98c81316, (q31_t)0x4bad382c, (q31_t)0x98c45bfb, (q31_t)0x4ba826d1, (q31_t)0x98c0a520, (q31_t)0x4ba31548, (q31_t)0x98bcee84, + (q31_t)0x4b9e0390, (q31_t)0x98b93828, (q31_t)0x4b98f1a9, (q31_t)0x98b5820c, (q31_t)0x4b93df93, (q31_t)0x98b1cc30, (q31_t)0x4b8ecd4f, (q31_t)0x98ae1693, + (q31_t)0x4b89badd, (q31_t)0x98aa6136, (q31_t)0x4b84a83b, (q31_t)0x98a6ac19, (q31_t)0x4b7f956b, (q31_t)0x98a2f73c, (q31_t)0x4b7a826d, (q31_t)0x989f429e, + (q31_t)0x4b756f40, (q31_t)0x989b8e40, (q31_t)0x4b705be4, (q31_t)0x9897da22, (q31_t)0x4b6b485a, (q31_t)0x98942643, (q31_t)0x4b6634a2, (q31_t)0x989072a5, + (q31_t)0x4b6120bb, (q31_t)0x988cbf46, (q31_t)0x4b5c0ca5, (q31_t)0x98890c27, (q31_t)0x4b56f861, (q31_t)0x98855948, (q31_t)0x4b51e3ee, (q31_t)0x9881a6a9, + (q31_t)0x4b4ccf4d, (q31_t)0x987df449, (q31_t)0x4b47ba7e, (q31_t)0x987a422a, (q31_t)0x4b42a580, (q31_t)0x9876904a, (q31_t)0x4b3d9053, (q31_t)0x9872deaa, + (q31_t)0x4b387af9, (q31_t)0x986f2d4a, (q31_t)0x4b336570, (q31_t)0x986b7c2a, (q31_t)0x4b2e4fb8, (q31_t)0x9867cb4a, (q31_t)0x4b2939d2, (q31_t)0x98641aa9, + (q31_t)0x4b2423be, (q31_t)0x98606a49, (q31_t)0x4b1f0d7b, (q31_t)0x985cba28, (q31_t)0x4b19f70a, (q31_t)0x98590a48, (q31_t)0x4b14e06b, (q31_t)0x98555aa7, + (q31_t)0x4b0fc99d, (q31_t)0x9851ab46, (q31_t)0x4b0ab2a1, (q31_t)0x984dfc26, (q31_t)0x4b059b77, (q31_t)0x984a4d45, (q31_t)0x4b00841f, (q31_t)0x98469ea4, + (q31_t)0x4afb6c98, (q31_t)0x9842f043, (q31_t)0x4af654e3, (q31_t)0x983f4223, (q31_t)0x4af13d00, (q31_t)0x983b9442, (q31_t)0x4aec24ee, (q31_t)0x9837e6a1, + (q31_t)0x4ae70caf, (q31_t)0x98343940, (q31_t)0x4ae1f441, (q31_t)0x98308c1f, (q31_t)0x4adcdba5, (q31_t)0x982cdf3f, (q31_t)0x4ad7c2da, (q31_t)0x9829329e, + (q31_t)0x4ad2a9e2, (q31_t)0x9825863d, (q31_t)0x4acd90bb, (q31_t)0x9821da1d, (q31_t)0x4ac87767, (q31_t)0x981e2e3c, (q31_t)0x4ac35de4, (q31_t)0x981a829c, + (q31_t)0x4abe4433, (q31_t)0x9816d73b, (q31_t)0x4ab92a54, (q31_t)0x98132c1b, (q31_t)0x4ab41046, (q31_t)0x980f813b, (q31_t)0x4aaef60b, (q31_t)0x980bd69b, + (q31_t)0x4aa9dba2, (q31_t)0x98082c3b, (q31_t)0x4aa4c10b, (q31_t)0x9804821b, (q31_t)0x4a9fa645, (q31_t)0x9800d83c, (q31_t)0x4a9a8b52, (q31_t)0x97fd2e9c, + (q31_t)0x4a957030, (q31_t)0x97f9853d, (q31_t)0x4a9054e1, (q31_t)0x97f5dc1e, (q31_t)0x4a8b3963, (q31_t)0x97f2333f, (q31_t)0x4a861db8, (q31_t)0x97ee8aa0, + (q31_t)0x4a8101de, (q31_t)0x97eae242, (q31_t)0x4a7be5d7, (q31_t)0x97e73a23, (q31_t)0x4a76c9a2, (q31_t)0x97e39245, (q31_t)0x4a71ad3e, (q31_t)0x97dfeaa7, + (q31_t)0x4a6c90ad, (q31_t)0x97dc4349, (q31_t)0x4a6773ee, (q31_t)0x97d89c2c, (q31_t)0x4a625701, (q31_t)0x97d4f54f, (q31_t)0x4a5d39e6, (q31_t)0x97d14eb2, + (q31_t)0x4a581c9e, (q31_t)0x97cda855, (q31_t)0x4a52ff27, (q31_t)0x97ca0239, (q31_t)0x4a4de182, (q31_t)0x97c65c5c, (q31_t)0x4a48c3b0, (q31_t)0x97c2b6c1, + (q31_t)0x4a43a5b0, (q31_t)0x97bf1165, (q31_t)0x4a3e8782, (q31_t)0x97bb6c4a, (q31_t)0x4a396926, (q31_t)0x97b7c76f, (q31_t)0x4a344a9d, (q31_t)0x97b422d4, + (q31_t)0x4a2f2be6, (q31_t)0x97b07e7a, (q31_t)0x4a2a0d01, (q31_t)0x97acda60, (q31_t)0x4a24edee, (q31_t)0x97a93687, (q31_t)0x4a1fcead, (q31_t)0x97a592ed, + (q31_t)0x4a1aaf3f, (q31_t)0x97a1ef94, (q31_t)0x4a158fa3, (q31_t)0x979e4c7c, (q31_t)0x4a106fda, (q31_t)0x979aa9a4, (q31_t)0x4a0b4fe2, (q31_t)0x9797070c, + (q31_t)0x4a062fbd, (q31_t)0x979364b5, (q31_t)0x4a010f6b, (q31_t)0x978fc29e, (q31_t)0x49fbeeea, (q31_t)0x978c20c8, (q31_t)0x49f6ce3c, (q31_t)0x97887f32, + (q31_t)0x49f1ad61, (q31_t)0x9784dddc, (q31_t)0x49ec8c57, (q31_t)0x97813cc7, (q31_t)0x49e76b21, (q31_t)0x977d9bf2, (q31_t)0x49e249bc, (q31_t)0x9779fb5e, + (q31_t)0x49dd282a, (q31_t)0x97765b0a, (q31_t)0x49d8066b, (q31_t)0x9772baf7, (q31_t)0x49d2e47e, (q31_t)0x976f1b24, (q31_t)0x49cdc263, (q31_t)0x976b7b92, + (q31_t)0x49c8a01b, (q31_t)0x9767dc41, (q31_t)0x49c37da5, (q31_t)0x97643d2f, (q31_t)0x49be5b02, (q31_t)0x97609e5f, (q31_t)0x49b93832, (q31_t)0x975cffcf, + (q31_t)0x49b41533, (q31_t)0x9759617f, (q31_t)0x49aef208, (q31_t)0x9755c370, (q31_t)0x49a9ceaf, (q31_t)0x975225a1, (q31_t)0x49a4ab28, (q31_t)0x974e8813, + (q31_t)0x499f8774, (q31_t)0x974aeac6, (q31_t)0x499a6393, (q31_t)0x97474db9, (q31_t)0x49953f84, (q31_t)0x9743b0ed, (q31_t)0x49901b48, (q31_t)0x97401462, + (q31_t)0x498af6df, (q31_t)0x973c7817, (q31_t)0x4985d248, (q31_t)0x9738dc0d, (q31_t)0x4980ad84, (q31_t)0x97354043, (q31_t)0x497b8892, (q31_t)0x9731a4ba, + (q31_t)0x49766373, (q31_t)0x972e0971, (q31_t)0x49713e27, (q31_t)0x972a6e6a, (q31_t)0x496c18ae, (q31_t)0x9726d3a3, (q31_t)0x4966f307, (q31_t)0x9723391c, + (q31_t)0x4961cd33, (q31_t)0x971f9ed7, (q31_t)0x495ca732, (q31_t)0x971c04d2, (q31_t)0x49578103, (q31_t)0x97186b0d, (q31_t)0x49525aa7, (q31_t)0x9714d18a, + (q31_t)0x494d341e, (q31_t)0x97113847, (q31_t)0x49480d68, (q31_t)0x970d9f45, (q31_t)0x4942e684, (q31_t)0x970a0683, (q31_t)0x493dbf74, (q31_t)0x97066e03, + (q31_t)0x49389836, (q31_t)0x9702d5c3, (q31_t)0x493370cb, (q31_t)0x96ff3dc4, (q31_t)0x492e4933, (q31_t)0x96fba605, (q31_t)0x4929216e, (q31_t)0x96f80e88, + (q31_t)0x4923f97b, (q31_t)0x96f4774b, (q31_t)0x491ed15c, (q31_t)0x96f0e04f, (q31_t)0x4919a90f, (q31_t)0x96ed4994, (q31_t)0x49148095, (q31_t)0x96e9b319, + (q31_t)0x490f57ee, (q31_t)0x96e61ce0, (q31_t)0x490a2f1b, (q31_t)0x96e286e7, (q31_t)0x4905061a, (q31_t)0x96def12f, (q31_t)0x48ffdcec, (q31_t)0x96db5bb8, + (q31_t)0x48fab391, (q31_t)0x96d7c682, (q31_t)0x48f58a09, (q31_t)0x96d4318d, (q31_t)0x48f06054, (q31_t)0x96d09cd8, (q31_t)0x48eb3672, (q31_t)0x96cd0865, + (q31_t)0x48e60c62, (q31_t)0x96c97432, (q31_t)0x48e0e227, (q31_t)0x96c5e040, (q31_t)0x48dbb7be, (q31_t)0x96c24c8f, (q31_t)0x48d68d28, (q31_t)0x96beb91f, + (q31_t)0x48d16265, (q31_t)0x96bb25f0, (q31_t)0x48cc3775, (q31_t)0x96b79302, (q31_t)0x48c70c59, (q31_t)0x96b40055, (q31_t)0x48c1e10f, (q31_t)0x96b06de9, + (q31_t)0x48bcb599, (q31_t)0x96acdbbe, (q31_t)0x48b789f5, (q31_t)0x96a949d3, (q31_t)0x48b25e25, (q31_t)0x96a5b82a, (q31_t)0x48ad3228, (q31_t)0x96a226c2, + (q31_t)0x48a805ff, (q31_t)0x969e959b, (q31_t)0x48a2d9a8, (q31_t)0x969b04b4, (q31_t)0x489dad25, (q31_t)0x9697740f, (q31_t)0x48988074, (q31_t)0x9693e3ab, + (q31_t)0x48935397, (q31_t)0x96905388, (q31_t)0x488e268e, (q31_t)0x968cc3a5, (q31_t)0x4888f957, (q31_t)0x96893404, (q31_t)0x4883cbf4, (q31_t)0x9685a4a4, + (q31_t)0x487e9e64, (q31_t)0x96821585, (q31_t)0x487970a7, (q31_t)0x967e86a7, (q31_t)0x487442be, (q31_t)0x967af80a, (q31_t)0x486f14a8, (q31_t)0x967769af, + (q31_t)0x4869e665, (q31_t)0x9673db94, (q31_t)0x4864b7f5, (q31_t)0x96704dba, (q31_t)0x485f8959, (q31_t)0x966cc022, (q31_t)0x485a5a90, (q31_t)0x966932cb, + (q31_t)0x48552b9b, (q31_t)0x9665a5b4, (q31_t)0x484ffc79, (q31_t)0x966218df, (q31_t)0x484acd2a, (q31_t)0x965e8c4b, (q31_t)0x48459daf, (q31_t)0x965afff9, + (q31_t)0x48406e08, (q31_t)0x965773e7, (q31_t)0x483b3e33, (q31_t)0x9653e817, (q31_t)0x48360e32, (q31_t)0x96505c88, (q31_t)0x4830de05, (q31_t)0x964cd139, + (q31_t)0x482badab, (q31_t)0x9649462d, (q31_t)0x48267d24, (q31_t)0x9645bb61, (q31_t)0x48214c71, (q31_t)0x964230d7, (q31_t)0x481c1b92, (q31_t)0x963ea68d, + (q31_t)0x4816ea86, (q31_t)0x963b1c86, (q31_t)0x4811b94d, (q31_t)0x963792bf, (q31_t)0x480c87e8, (q31_t)0x96340939, (q31_t)0x48075657, (q31_t)0x96307ff5, + (q31_t)0x48022499, (q31_t)0x962cf6f2, (q31_t)0x47fcf2af, (q31_t)0x96296e31, (q31_t)0x47f7c099, (q31_t)0x9625e5b0, (q31_t)0x47f28e56, (q31_t)0x96225d71, + (q31_t)0x47ed5be6, (q31_t)0x961ed574, (q31_t)0x47e8294a, (q31_t)0x961b4db7, (q31_t)0x47e2f682, (q31_t)0x9617c63c, (q31_t)0x47ddc38e, (q31_t)0x96143f02, + (q31_t)0x47d8906d, (q31_t)0x9610b80a, (q31_t)0x47d35d20, (q31_t)0x960d3153, (q31_t)0x47ce29a7, (q31_t)0x9609aadd, (q31_t)0x47c8f601, (q31_t)0x960624a9, + (q31_t)0x47c3c22f, (q31_t)0x96029eb6, (q31_t)0x47be8e31, (q31_t)0x95ff1904, (q31_t)0x47b95a06, (q31_t)0x95fb9394, (q31_t)0x47b425af, (q31_t)0x95f80e65, + (q31_t)0x47aef12c, (q31_t)0x95f48977, (q31_t)0x47a9bc7d, (q31_t)0x95f104cb, (q31_t)0x47a487a2, (q31_t)0x95ed8061, (q31_t)0x479f529a, (q31_t)0x95e9fc38, + (q31_t)0x479a1d67, (q31_t)0x95e67850, (q31_t)0x4794e807, (q31_t)0x95e2f4a9, (q31_t)0x478fb27b, (q31_t)0x95df7145, (q31_t)0x478a7cc2, (q31_t)0x95dbee21, + (q31_t)0x478546de, (q31_t)0x95d86b3f, (q31_t)0x478010cd, (q31_t)0x95d4e89f, (q31_t)0x477ada91, (q31_t)0x95d16640, (q31_t)0x4775a428, (q31_t)0x95cde423, + (q31_t)0x47706d93, (q31_t)0x95ca6247, (q31_t)0x476b36d3, (q31_t)0x95c6e0ac, (q31_t)0x4765ffe6, (q31_t)0x95c35f53, (q31_t)0x4760c8cd, (q31_t)0x95bfde3c, + (q31_t)0x475b9188, (q31_t)0x95bc5d66, (q31_t)0x47565a17, (q31_t)0x95b8dcd2, (q31_t)0x4751227a, (q31_t)0x95b55c7f, (q31_t)0x474beab1, (q31_t)0x95b1dc6e, + (q31_t)0x4746b2bc, (q31_t)0x95ae5c9f, (q31_t)0x47417a9b, (q31_t)0x95aadd11, (q31_t)0x473c424e, (q31_t)0x95a75dc4, (q31_t)0x473709d5, (q31_t)0x95a3deb9, + (q31_t)0x4731d131, (q31_t)0x95a05ff0, (q31_t)0x472c9860, (q31_t)0x959ce169, (q31_t)0x47275f63, (q31_t)0x95996323, (q31_t)0x4722263b, (q31_t)0x9595e51e, + (q31_t)0x471cece7, (q31_t)0x9592675c, (q31_t)0x4717b367, (q31_t)0x958ee9db, (q31_t)0x471279ba, (q31_t)0x958b6c9b, (q31_t)0x470d3fe3, (q31_t)0x9587ef9e, + (q31_t)0x470805df, (q31_t)0x958472e2, (q31_t)0x4702cbaf, (q31_t)0x9580f667, (q31_t)0x46fd9154, (q31_t)0x957d7a2f, (q31_t)0x46f856cd, (q31_t)0x9579fe38, + (q31_t)0x46f31c1a, (q31_t)0x95768283, (q31_t)0x46ede13b, (q31_t)0x9573070f, (q31_t)0x46e8a631, (q31_t)0x956f8bdd, (q31_t)0x46e36afb, (q31_t)0x956c10ed, + (q31_t)0x46de2f99, (q31_t)0x9568963f, (q31_t)0x46d8f40b, (q31_t)0x95651bd2, (q31_t)0x46d3b852, (q31_t)0x9561a1a8, (q31_t)0x46ce7c6d, (q31_t)0x955e27bf, + (q31_t)0x46c9405c, (q31_t)0x955aae17, (q31_t)0x46c40420, (q31_t)0x955734b2, (q31_t)0x46bec7b8, (q31_t)0x9553bb8e, (q31_t)0x46b98b24, (q31_t)0x955042ac, + (q31_t)0x46b44e65, (q31_t)0x954cca0c, (q31_t)0x46af117a, (q31_t)0x954951ae, (q31_t)0x46a9d464, (q31_t)0x9545d992, (q31_t)0x46a49722, (q31_t)0x954261b7, + (q31_t)0x469f59b4, (q31_t)0x953eea1e, (q31_t)0x469a1c1b, (q31_t)0x953b72c7, (q31_t)0x4694de56, (q31_t)0x9537fbb2, (q31_t)0x468fa066, (q31_t)0x953484df, + (q31_t)0x468a624a, (q31_t)0x95310e4e, (q31_t)0x46852403, (q31_t)0x952d97fe, (q31_t)0x467fe590, (q31_t)0x952a21f1, (q31_t)0x467aa6f2, (q31_t)0x9526ac25, + (q31_t)0x46756828, (q31_t)0x9523369c, (q31_t)0x46702933, (q31_t)0x951fc154, (q31_t)0x466aea12, (q31_t)0x951c4c4e, (q31_t)0x4665aac6, (q31_t)0x9518d78a, + (q31_t)0x46606b4e, (q31_t)0x95156308, (q31_t)0x465b2bab, (q31_t)0x9511eec8, (q31_t)0x4655ebdd, (q31_t)0x950e7aca, (q31_t)0x4650abe3, (q31_t)0x950b070e, + (q31_t)0x464b6bbe, (q31_t)0x95079394, (q31_t)0x46462b6d, (q31_t)0x9504205c, (q31_t)0x4640eaf2, (q31_t)0x9500ad66, (q31_t)0x463baa4a, (q31_t)0x94fd3ab1, + (q31_t)0x46366978, (q31_t)0x94f9c83f, (q31_t)0x4631287a, (q31_t)0x94f6560f, (q31_t)0x462be751, (q31_t)0x94f2e421, (q31_t)0x4626a5fd, (q31_t)0x94ef7275, + (q31_t)0x4621647d, (q31_t)0x94ec010b, (q31_t)0x461c22d2, (q31_t)0x94e88fe3, (q31_t)0x4616e0fc, (q31_t)0x94e51efd, (q31_t)0x46119efa, (q31_t)0x94e1ae59, + (q31_t)0x460c5cce, (q31_t)0x94de3df8, (q31_t)0x46071a76, (q31_t)0x94dacdd8, (q31_t)0x4601d7f3, (q31_t)0x94d75dfa, (q31_t)0x45fc9545, (q31_t)0x94d3ee5f, + (q31_t)0x45f7526b, (q31_t)0x94d07f05, (q31_t)0x45f20f67, (q31_t)0x94cd0fee, (q31_t)0x45eccc37, (q31_t)0x94c9a119, (q31_t)0x45e788dc, (q31_t)0x94c63286, + (q31_t)0x45e24556, (q31_t)0x94c2c435, (q31_t)0x45dd01a5, (q31_t)0x94bf5627, (q31_t)0x45d7bdc9, (q31_t)0x94bbe85a, (q31_t)0x45d279c2, (q31_t)0x94b87ad0, + (q31_t)0x45cd358f, (q31_t)0x94b50d87, (q31_t)0x45c7f132, (q31_t)0x94b1a081, (q31_t)0x45c2acaa, (q31_t)0x94ae33be, (q31_t)0x45bd67f6, (q31_t)0x94aac73c, + (q31_t)0x45b82318, (q31_t)0x94a75afd, (q31_t)0x45b2de0e, (q31_t)0x94a3eeff, (q31_t)0x45ad98da, (q31_t)0x94a08344, (q31_t)0x45a8537a, (q31_t)0x949d17cc, + (q31_t)0x45a30df0, (q31_t)0x9499ac95, (q31_t)0x459dc83b, (q31_t)0x949641a1, (q31_t)0x4598825a, (q31_t)0x9492d6ef, (q31_t)0x45933c4f, (q31_t)0x948f6c7f, + (q31_t)0x458df619, (q31_t)0x948c0252, (q31_t)0x4588afb8, (q31_t)0x94889867, (q31_t)0x4583692c, (q31_t)0x94852ebe, (q31_t)0x457e2275, (q31_t)0x9481c557, + (q31_t)0x4578db93, (q31_t)0x947e5c33, (q31_t)0x45739487, (q31_t)0x947af351, (q31_t)0x456e4d4f, (q31_t)0x94778ab1, (q31_t)0x456905ed, (q31_t)0x94742254, + (q31_t)0x4563be60, (q31_t)0x9470ba39, (q31_t)0x455e76a8, (q31_t)0x946d5260, (q31_t)0x45592ec6, (q31_t)0x9469eaca, (q31_t)0x4553e6b8, (q31_t)0x94668376, + (q31_t)0x454e9e80, (q31_t)0x94631c65, (q31_t)0x4549561d, (q31_t)0x945fb596, (q31_t)0x45440d90, (q31_t)0x945c4f09, (q31_t)0x453ec4d7, (q31_t)0x9458e8bf, + (q31_t)0x45397bf4, (q31_t)0x945582b7, (q31_t)0x453432e6, (q31_t)0x94521cf1, (q31_t)0x452ee9ae, (q31_t)0x944eb76e, (q31_t)0x4529a04b, (q31_t)0x944b522d, + (q31_t)0x452456bd, (q31_t)0x9447ed2f, (q31_t)0x451f0d04, (q31_t)0x94448873, (q31_t)0x4519c321, (q31_t)0x944123fa, (q31_t)0x45147913, (q31_t)0x943dbfc3, + (q31_t)0x450f2edb, (q31_t)0x943a5bcf, (q31_t)0x4509e478, (q31_t)0x9436f81d, (q31_t)0x450499eb, (q31_t)0x943394ad, (q31_t)0x44ff4f32, (q31_t)0x94303180, + (q31_t)0x44fa0450, (q31_t)0x942cce96, (q31_t)0x44f4b943, (q31_t)0x94296bee, (q31_t)0x44ef6e0b, (q31_t)0x94260989, (q31_t)0x44ea22a9, (q31_t)0x9422a766, + (q31_t)0x44e4d71c, (q31_t)0x941f4585, (q31_t)0x44df8b64, (q31_t)0x941be3e8, (q31_t)0x44da3f83, (q31_t)0x9418828c, (q31_t)0x44d4f376, (q31_t)0x94152174, + (q31_t)0x44cfa740, (q31_t)0x9411c09e, (q31_t)0x44ca5adf, (q31_t)0x940e600a, (q31_t)0x44c50e53, (q31_t)0x940affb9, (q31_t)0x44bfc19d, (q31_t)0x94079fab, + (q31_t)0x44ba74bd, (q31_t)0x94043fdf, (q31_t)0x44b527b2, (q31_t)0x9400e056, (q31_t)0x44afda7d, (q31_t)0x93fd810f, (q31_t)0x44aa8d1d, (q31_t)0x93fa220b, + (q31_t)0x44a53f93, (q31_t)0x93f6c34a, (q31_t)0x449ff1df, (q31_t)0x93f364cb, (q31_t)0x449aa400, (q31_t)0x93f0068f, (q31_t)0x449555f7, (q31_t)0x93eca896, + (q31_t)0x449007c4, (q31_t)0x93e94adf, (q31_t)0x448ab967, (q31_t)0x93e5ed6b, (q31_t)0x44856adf, (q31_t)0x93e2903a, (q31_t)0x44801c2d, (q31_t)0x93df334c, + (q31_t)0x447acd50, (q31_t)0x93dbd6a0, (q31_t)0x44757e4a, (q31_t)0x93d87a36, (q31_t)0x44702f19, (q31_t)0x93d51e10, (q31_t)0x446adfbe, (q31_t)0x93d1c22c, + (q31_t)0x44659039, (q31_t)0x93ce668b, (q31_t)0x44604089, (q31_t)0x93cb0b2d, (q31_t)0x445af0b0, (q31_t)0x93c7b011, (q31_t)0x4455a0ac, (q31_t)0x93c45539, + (q31_t)0x4450507e, (q31_t)0x93c0faa3, (q31_t)0x444b0026, (q31_t)0x93bda04f, (q31_t)0x4445afa4, (q31_t)0x93ba463f, (q31_t)0x44405ef8, (q31_t)0x93b6ec71, + (q31_t)0x443b0e21, (q31_t)0x93b392e6, (q31_t)0x4435bd21, (q31_t)0x93b0399e, (q31_t)0x44306bf6, (q31_t)0x93ace099, (q31_t)0x442b1aa2, (q31_t)0x93a987d6, + (q31_t)0x4425c923, (q31_t)0x93a62f57, (q31_t)0x4420777b, (q31_t)0x93a2d71a, (q31_t)0x441b25a8, (q31_t)0x939f7f20, (q31_t)0x4415d3ab, (q31_t)0x939c2769, + (q31_t)0x44108184, (q31_t)0x9398cff5, (q31_t)0x440b2f34, (q31_t)0x939578c3, (q31_t)0x4405dcb9, (q31_t)0x939221d5, (q31_t)0x44008a14, (q31_t)0x938ecb29, + (q31_t)0x43fb3746, (q31_t)0x938b74c1, (q31_t)0x43f5e44d, (q31_t)0x93881e9b, (q31_t)0x43f0912b, (q31_t)0x9384c8b8, (q31_t)0x43eb3ddf, (q31_t)0x93817318, + (q31_t)0x43e5ea68, (q31_t)0x937e1dbb, (q31_t)0x43e096c8, (q31_t)0x937ac8a1, (q31_t)0x43db42fe, (q31_t)0x937773ca, (q31_t)0x43d5ef0a, (q31_t)0x93741f35, + (q31_t)0x43d09aed, (q31_t)0x9370cae4, (q31_t)0x43cb46a5, (q31_t)0x936d76d6, (q31_t)0x43c5f234, (q31_t)0x936a230a, (q31_t)0x43c09d99, (q31_t)0x9366cf82, + (q31_t)0x43bb48d4, (q31_t)0x93637c3d, (q31_t)0x43b5f3e5, (q31_t)0x9360293a, (q31_t)0x43b09ecc, (q31_t)0x935cd67b, (q31_t)0x43ab498a, (q31_t)0x935983ff, + (q31_t)0x43a5f41e, (q31_t)0x935631c5, (q31_t)0x43a09e89, (q31_t)0x9352dfcf, (q31_t)0x439b48c9, (q31_t)0x934f8e1c, (q31_t)0x4395f2e0, (q31_t)0x934c3cab, + (q31_t)0x43909ccd, (q31_t)0x9348eb7e, (q31_t)0x438b4691, (q31_t)0x93459a94, (q31_t)0x4385f02a, (q31_t)0x934249ed, (q31_t)0x4380999b, (q31_t)0x933ef989, + (q31_t)0x437b42e1, (q31_t)0x933ba968, (q31_t)0x4375ebfe, (q31_t)0x9338598a, (q31_t)0x437094f1, (q31_t)0x933509f0, (q31_t)0x436b3dbb, (q31_t)0x9331ba98, + (q31_t)0x4365e65b, (q31_t)0x932e6b84, (q31_t)0x43608ed2, (q31_t)0x932b1cb2, (q31_t)0x435b371f, (q31_t)0x9327ce24, (q31_t)0x4355df42, (q31_t)0x93247fd9, + (q31_t)0x4350873c, (q31_t)0x932131d1, (q31_t)0x434b2f0c, (q31_t)0x931de40c, (q31_t)0x4345d6b3, (q31_t)0x931a968b, (q31_t)0x43407e31, (q31_t)0x9317494c, + (q31_t)0x433b2585, (q31_t)0x9313fc51, (q31_t)0x4335ccaf, (q31_t)0x9310af99, (q31_t)0x433073b0, (q31_t)0x930d6324, (q31_t)0x432b1a87, (q31_t)0x930a16f3, + (q31_t)0x4325c135, (q31_t)0x9306cb04, (q31_t)0x432067ba, (q31_t)0x93037f59, (q31_t)0x431b0e15, (q31_t)0x930033f1, (q31_t)0x4315b447, (q31_t)0x92fce8cc, + (q31_t)0x43105a50, (q31_t)0x92f99deb, (q31_t)0x430b002f, (q31_t)0x92f6534c, (q31_t)0x4305a5e5, (q31_t)0x92f308f1, (q31_t)0x43004b71, (q31_t)0x92efbeda, + (q31_t)0x42faf0d4, (q31_t)0x92ec7505, (q31_t)0x42f5960e, (q31_t)0x92e92b74, (q31_t)0x42f03b1e, (q31_t)0x92e5e226, (q31_t)0x42eae005, (q31_t)0x92e2991c, + (q31_t)0x42e584c3, (q31_t)0x92df5054, (q31_t)0x42e02958, (q31_t)0x92dc07d0, (q31_t)0x42dacdc3, (q31_t)0x92d8bf90, (q31_t)0x42d57205, (q31_t)0x92d57792, + (q31_t)0x42d0161e, (q31_t)0x92d22fd9, (q31_t)0x42caba0e, (q31_t)0x92cee862, (q31_t)0x42c55dd4, (q31_t)0x92cba12f, (q31_t)0x42c00172, (q31_t)0x92c85a3f, + (q31_t)0x42baa4e6, (q31_t)0x92c51392, (q31_t)0x42b54831, (q31_t)0x92c1cd29, (q31_t)0x42afeb53, (q31_t)0x92be8703, (q31_t)0x42aa8e4b, (q31_t)0x92bb4121, + (q31_t)0x42a5311b, (q31_t)0x92b7fb82, (q31_t)0x429fd3c1, (q31_t)0x92b4b626, (q31_t)0x429a763f, (q31_t)0x92b1710e, (q31_t)0x42951893, (q31_t)0x92ae2c3a, + (q31_t)0x428fbabe, (q31_t)0x92aae7a8, (q31_t)0x428a5cc0, (q31_t)0x92a7a35a, (q31_t)0x4284fe99, (q31_t)0x92a45f50, (q31_t)0x427fa049, (q31_t)0x92a11b89, + (q31_t)0x427a41d0, (q31_t)0x929dd806, (q31_t)0x4274e32e, (q31_t)0x929a94c6, (q31_t)0x426f8463, (q31_t)0x929751c9, (q31_t)0x426a256f, (q31_t)0x92940f10, + (q31_t)0x4264c653, (q31_t)0x9290cc9b, (q31_t)0x425f670d, (q31_t)0x928d8a69, (q31_t)0x425a079e, (q31_t)0x928a487a, (q31_t)0x4254a806, (q31_t)0x928706cf, + (q31_t)0x424f4845, (q31_t)0x9283c568, (q31_t)0x4249e85c, (q31_t)0x92808444, (q31_t)0x42448849, (q31_t)0x927d4363, (q31_t)0x423f280e, (q31_t)0x927a02c7, + (q31_t)0x4239c7aa, (q31_t)0x9276c26d, (q31_t)0x4234671d, (q31_t)0x92738258, (q31_t)0x422f0667, (q31_t)0x92704286, (q31_t)0x4229a588, (q31_t)0x926d02f7, + (q31_t)0x42244481, (q31_t)0x9269c3ac, (q31_t)0x421ee350, (q31_t)0x926684a5, (q31_t)0x421981f7, (q31_t)0x926345e1, (q31_t)0x42142075, (q31_t)0x92600761, + (q31_t)0x420ebecb, (q31_t)0x925cc924, (q31_t)0x42095cf7, (q31_t)0x92598b2b, (q31_t)0x4203fafb, (q31_t)0x92564d76, (q31_t)0x41fe98d6, (q31_t)0x92531005, + (q31_t)0x41f93689, (q31_t)0x924fd2d7, (q31_t)0x41f3d413, (q31_t)0x924c95ec, (q31_t)0x41ee7174, (q31_t)0x92495946, (q31_t)0x41e90eac, (q31_t)0x92461ce3, + (q31_t)0x41e3abbc, (q31_t)0x9242e0c4, (q31_t)0x41de48a3, (q31_t)0x923fa4e8, (q31_t)0x41d8e561, (q31_t)0x923c6950, (q31_t)0x41d381f7, (q31_t)0x92392dfc, + (q31_t)0x41ce1e65, (q31_t)0x9235f2ec, (q31_t)0x41c8baa9, (q31_t)0x9232b81f, (q31_t)0x41c356c5, (q31_t)0x922f7d96, (q31_t)0x41bdf2b9, (q31_t)0x922c4351, + (q31_t)0x41b88e84, (q31_t)0x9229094f, (q31_t)0x41b32a26, (q31_t)0x9225cf91, (q31_t)0x41adc5a0, (q31_t)0x92229617, (q31_t)0x41a860f1, (q31_t)0x921f5ce1, + (q31_t)0x41a2fc1a, (q31_t)0x921c23ef, (q31_t)0x419d971b, (q31_t)0x9218eb40, (q31_t)0x419831f3, (q31_t)0x9215b2d5, (q31_t)0x4192cca2, (q31_t)0x92127aae, + (q31_t)0x418d6729, (q31_t)0x920f42cb, (q31_t)0x41880188, (q31_t)0x920c0b2c, (q31_t)0x41829bbe, (q31_t)0x9208d3d0, (q31_t)0x417d35cb, (q31_t)0x92059cb8, + (q31_t)0x4177cfb1, (q31_t)0x920265e4, (q31_t)0x4172696e, (q31_t)0x91ff2f54, (q31_t)0x416d0302, (q31_t)0x91fbf908, (q31_t)0x41679c6f, (q31_t)0x91f8c300, + (q31_t)0x416235b2, (q31_t)0x91f58d3b, (q31_t)0x415ccece, (q31_t)0x91f257bb, (q31_t)0x415767c1, (q31_t)0x91ef227e, (q31_t)0x4152008c, (q31_t)0x91ebed85, + (q31_t)0x414c992f, (q31_t)0x91e8b8d0, (q31_t)0x414731a9, (q31_t)0x91e5845f, (q31_t)0x4141c9fb, (q31_t)0x91e25032, (q31_t)0x413c6225, (q31_t)0x91df1c49, + (q31_t)0x4136fa27, (q31_t)0x91dbe8a4, (q31_t)0x41319200, (q31_t)0x91d8b542, (q31_t)0x412c29b1, (q31_t)0x91d58225, (q31_t)0x4126c13a, (q31_t)0x91d24f4c, + (q31_t)0x4121589b, (q31_t)0x91cf1cb6, (q31_t)0x411befd3, (q31_t)0x91cbea65, (q31_t)0x411686e4, (q31_t)0x91c8b857, (q31_t)0x41111dcc, (q31_t)0x91c5868e, + (q31_t)0x410bb48c, (q31_t)0x91c25508, (q31_t)0x41064b24, (q31_t)0x91bf23c7, (q31_t)0x4100e194, (q31_t)0x91bbf2c9, (q31_t)0x40fb77dc, (q31_t)0x91b8c210, + (q31_t)0x40f60dfb, (q31_t)0x91b5919a, (q31_t)0x40f0a3f3, (q31_t)0x91b26169, (q31_t)0x40eb39c3, (q31_t)0x91af317c, (q31_t)0x40e5cf6a, (q31_t)0x91ac01d2, + (q31_t)0x40e064ea, (q31_t)0x91a8d26d, (q31_t)0x40dafa41, (q31_t)0x91a5a34c, (q31_t)0x40d58f71, (q31_t)0x91a2746f, (q31_t)0x40d02478, (q31_t)0x919f45d6, + (q31_t)0x40cab958, (q31_t)0x919c1781, (q31_t)0x40c54e0f, (q31_t)0x9198e970, (q31_t)0x40bfe29f, (q31_t)0x9195bba3, (q31_t)0x40ba7706, (q31_t)0x91928e1a, + (q31_t)0x40b50b46, (q31_t)0x918f60d6, (q31_t)0x40af9f5e, (q31_t)0x918c33d5, (q31_t)0x40aa334e, (q31_t)0x91890719, (q31_t)0x40a4c716, (q31_t)0x9185daa1, + (q31_t)0x409f5ab6, (q31_t)0x9182ae6d, (q31_t)0x4099ee2e, (q31_t)0x917f827d, (q31_t)0x4094817f, (q31_t)0x917c56d1, (q31_t)0x408f14a7, (q31_t)0x91792b6a, + (q31_t)0x4089a7a8, (q31_t)0x91760047, (q31_t)0x40843a81, (q31_t)0x9172d567, (q31_t)0x407ecd32, (q31_t)0x916faacc, (q31_t)0x40795fbc, (q31_t)0x916c8076, + (q31_t)0x4073f21d, (q31_t)0x91695663, (q31_t)0x406e8457, (q31_t)0x91662c95, (q31_t)0x40691669, (q31_t)0x9163030b, (q31_t)0x4063a854, (q31_t)0x915fd9c5, + (q31_t)0x405e3a16, (q31_t)0x915cb0c3, (q31_t)0x4058cbb1, (q31_t)0x91598806, (q31_t)0x40535d24, (q31_t)0x91565f8d, (q31_t)0x404dee70, (q31_t)0x91533758, + (q31_t)0x40487f94, (q31_t)0x91500f67, (q31_t)0x40431090, (q31_t)0x914ce7bb, (q31_t)0x403da165, (q31_t)0x9149c053, (q31_t)0x40383212, (q31_t)0x9146992f, + (q31_t)0x4032c297, (q31_t)0x91437250, (q31_t)0x402d52f5, (q31_t)0x91404bb5, (q31_t)0x4027e32b, (q31_t)0x913d255e, (q31_t)0x4022733a, (q31_t)0x9139ff4b, + (q31_t)0x401d0321, (q31_t)0x9136d97d, (q31_t)0x401792e0, (q31_t)0x9133b3f3, (q31_t)0x40122278, (q31_t)0x91308eae, (q31_t)0x400cb1e9, (q31_t)0x912d69ad, + (q31_t)0x40074132, (q31_t)0x912a44f0, (q31_t)0x4001d053, (q31_t)0x91272078, (q31_t)0x3ffc5f4d, (q31_t)0x9123fc44, (q31_t)0x3ff6ee1f, (q31_t)0x9120d854, + (q31_t)0x3ff17cca, (q31_t)0x911db4a9, (q31_t)0x3fec0b4e, (q31_t)0x911a9142, (q31_t)0x3fe699aa, (q31_t)0x91176e1f, (q31_t)0x3fe127df, (q31_t)0x91144b41, + (q31_t)0x3fdbb5ec, (q31_t)0x911128a8, (q31_t)0x3fd643d2, (q31_t)0x910e0653, (q31_t)0x3fd0d191, (q31_t)0x910ae442, (q31_t)0x3fcb5f28, (q31_t)0x9107c276, + (q31_t)0x3fc5ec98, (q31_t)0x9104a0ee, (q31_t)0x3fc079e0, (q31_t)0x91017faa, (q31_t)0x3fbb0702, (q31_t)0x90fe5eab, (q31_t)0x3fb593fb, (q31_t)0x90fb3df1, + (q31_t)0x3fb020ce, (q31_t)0x90f81d7b, (q31_t)0x3faaad79, (q31_t)0x90f4fd4a, (q31_t)0x3fa539fd, (q31_t)0x90f1dd5d, (q31_t)0x3f9fc65a, (q31_t)0x90eebdb4, + (q31_t)0x3f9a5290, (q31_t)0x90eb9e50, (q31_t)0x3f94de9e, (q31_t)0x90e87f31, (q31_t)0x3f8f6a85, (q31_t)0x90e56056, (q31_t)0x3f89f645, (q31_t)0x90e241bf, + (q31_t)0x3f8481dd, (q31_t)0x90df236e, (q31_t)0x3f7f0d4f, (q31_t)0x90dc0560, (q31_t)0x3f799899, (q31_t)0x90d8e798, (q31_t)0x3f7423bc, (q31_t)0x90d5ca13, + (q31_t)0x3f6eaeb8, (q31_t)0x90d2acd4, (q31_t)0x3f69398d, (q31_t)0x90cf8fd9, (q31_t)0x3f63c43b, (q31_t)0x90cc7322, (q31_t)0x3f5e4ec2, (q31_t)0x90c956b1, + (q31_t)0x3f58d921, (q31_t)0x90c63a83, (q31_t)0x3f53635a, (q31_t)0x90c31e9b, (q31_t)0x3f4ded6b, (q31_t)0x90c002f7, (q31_t)0x3f487755, (q31_t)0x90bce797, + (q31_t)0x3f430119, (q31_t)0x90b9cc7d, (q31_t)0x3f3d8ab5, (q31_t)0x90b6b1a6, (q31_t)0x3f38142a, (q31_t)0x90b39715, (q31_t)0x3f329d79, (q31_t)0x90b07cc8, + (q31_t)0x3f2d26a0, (q31_t)0x90ad62c0, (q31_t)0x3f27afa1, (q31_t)0x90aa48fd, (q31_t)0x3f22387a, (q31_t)0x90a72f7e, (q31_t)0x3f1cc12c, (q31_t)0x90a41644, + (q31_t)0x3f1749b8, (q31_t)0x90a0fd4e, (q31_t)0x3f11d21d, (q31_t)0x909de49e, (q31_t)0x3f0c5a5a, (q31_t)0x909acc32, (q31_t)0x3f06e271, (q31_t)0x9097b40a, + (q31_t)0x3f016a61, (q31_t)0x90949c28, (q31_t)0x3efbf22a, (q31_t)0x9091848a, (q31_t)0x3ef679cc, (q31_t)0x908e6d31, (q31_t)0x3ef10148, (q31_t)0x908b561c, + (q31_t)0x3eeb889c, (q31_t)0x90883f4d, (q31_t)0x3ee60fca, (q31_t)0x908528c2, (q31_t)0x3ee096d1, (q31_t)0x9082127c, (q31_t)0x3edb1db1, (q31_t)0x907efc7a, + (q31_t)0x3ed5a46b, (q31_t)0x907be6be, (q31_t)0x3ed02afd, (q31_t)0x9078d146, (q31_t)0x3ecab169, (q31_t)0x9075bc13, (q31_t)0x3ec537ae, (q31_t)0x9072a725, + (q31_t)0x3ebfbdcd, (q31_t)0x906f927c, (q31_t)0x3eba43c4, (q31_t)0x906c7e17, (q31_t)0x3eb4c995, (q31_t)0x906969f8, (q31_t)0x3eaf4f40, (q31_t)0x9066561d, + (q31_t)0x3ea9d4c3, (q31_t)0x90634287, (q31_t)0x3ea45a21, (q31_t)0x90602f35, (q31_t)0x3e9edf57, (q31_t)0x905d1c29, (q31_t)0x3e996467, (q31_t)0x905a0962, + (q31_t)0x3e93e950, (q31_t)0x9056f6df, (q31_t)0x3e8e6e12, (q31_t)0x9053e4a1, (q31_t)0x3e88f2ae, (q31_t)0x9050d2a9, (q31_t)0x3e837724, (q31_t)0x904dc0f5, + (q31_t)0x3e7dfb73, (q31_t)0x904aaf86, (q31_t)0x3e787f9b, (q31_t)0x90479e5c, (q31_t)0x3e73039d, (q31_t)0x90448d76, (q31_t)0x3e6d8778, (q31_t)0x90417cd6, + (q31_t)0x3e680b2c, (q31_t)0x903e6c7b, (q31_t)0x3e628ebb, (q31_t)0x903b5c64, (q31_t)0x3e5d1222, (q31_t)0x90384c93, (q31_t)0x3e579564, (q31_t)0x90353d06, + (q31_t)0x3e52187f, (q31_t)0x90322dbf, (q31_t)0x3e4c9b73, (q31_t)0x902f1ebc, (q31_t)0x3e471e41, (q31_t)0x902c0fff, (q31_t)0x3e41a0e8, (q31_t)0x90290186, + (q31_t)0x3e3c2369, (q31_t)0x9025f352, (q31_t)0x3e36a5c4, (q31_t)0x9022e564, (q31_t)0x3e3127f9, (q31_t)0x901fd7ba, (q31_t)0x3e2baa07, (q31_t)0x901cca55, + (q31_t)0x3e262bee, (q31_t)0x9019bd36, (q31_t)0x3e20adaf, (q31_t)0x9016b05b, (q31_t)0x3e1b2f4a, (q31_t)0x9013a3c5, (q31_t)0x3e15b0bf, (q31_t)0x90109775, + (q31_t)0x3e10320d, (q31_t)0x900d8b69, (q31_t)0x3e0ab336, (q31_t)0x900a7fa3, (q31_t)0x3e053437, (q31_t)0x90077422, (q31_t)0x3dffb513, (q31_t)0x900468e5, + (q31_t)0x3dfa35c8, (q31_t)0x90015dee, (q31_t)0x3df4b657, (q31_t)0x8ffe533c, (q31_t)0x3def36c0, (q31_t)0x8ffb48cf, (q31_t)0x3de9b703, (q31_t)0x8ff83ea7, + (q31_t)0x3de4371f, (q31_t)0x8ff534c4, (q31_t)0x3ddeb716, (q31_t)0x8ff22b26, (q31_t)0x3dd936e6, (q31_t)0x8fef21ce, (q31_t)0x3dd3b690, (q31_t)0x8fec18ba, + (q31_t)0x3dce3614, (q31_t)0x8fe90fec, (q31_t)0x3dc8b571, (q31_t)0x8fe60763, (q31_t)0x3dc334a9, (q31_t)0x8fe2ff1f, (q31_t)0x3dbdb3ba, (q31_t)0x8fdff720, + (q31_t)0x3db832a6, (q31_t)0x8fdcef66, (q31_t)0x3db2b16b, (q31_t)0x8fd9e7f2, (q31_t)0x3dad300b, (q31_t)0x8fd6e0c2, (q31_t)0x3da7ae84, (q31_t)0x8fd3d9d8, + (q31_t)0x3da22cd7, (q31_t)0x8fd0d333, (q31_t)0x3d9cab04, (q31_t)0x8fcdccd3, (q31_t)0x3d97290b, (q31_t)0x8fcac6b9, (q31_t)0x3d91a6ed, (q31_t)0x8fc7c0e3, + (q31_t)0x3d8c24a8, (q31_t)0x8fc4bb53, (q31_t)0x3d86a23d, (q31_t)0x8fc1b608, (q31_t)0x3d811fac, (q31_t)0x8fbeb103, (q31_t)0x3d7b9cf6, (q31_t)0x8fbbac42, + (q31_t)0x3d761a19, (q31_t)0x8fb8a7c7, (q31_t)0x3d709717, (q31_t)0x8fb5a391, (q31_t)0x3d6b13ee, (q31_t)0x8fb29fa0, (q31_t)0x3d6590a0, (q31_t)0x8faf9bf5, + (q31_t)0x3d600d2c, (q31_t)0x8fac988f, (q31_t)0x3d5a8992, (q31_t)0x8fa9956e, (q31_t)0x3d5505d2, (q31_t)0x8fa69293, (q31_t)0x3d4f81ec, (q31_t)0x8fa38ffc, + (q31_t)0x3d49fde1, (q31_t)0x8fa08dab, (q31_t)0x3d4479b0, (q31_t)0x8f9d8ba0, (q31_t)0x3d3ef559, (q31_t)0x8f9a89da, (q31_t)0x3d3970dc, (q31_t)0x8f978859, + (q31_t)0x3d33ec39, (q31_t)0x8f94871d, (q31_t)0x3d2e6771, (q31_t)0x8f918627, (q31_t)0x3d28e282, (q31_t)0x8f8e8576, (q31_t)0x3d235d6f, (q31_t)0x8f8b850a, + (q31_t)0x3d1dd835, (q31_t)0x8f8884e4, (q31_t)0x3d1852d6, (q31_t)0x8f858503, (q31_t)0x3d12cd51, (q31_t)0x8f828568, (q31_t)0x3d0d47a6, (q31_t)0x8f7f8612, + (q31_t)0x3d07c1d6, (q31_t)0x8f7c8701, (q31_t)0x3d023be0, (q31_t)0x8f798836, (q31_t)0x3cfcb5c4, (q31_t)0x8f7689b0, (q31_t)0x3cf72f83, (q31_t)0x8f738b70, + (q31_t)0x3cf1a91c, (q31_t)0x8f708d75, (q31_t)0x3cec2290, (q31_t)0x8f6d8fbf, (q31_t)0x3ce69bde, (q31_t)0x8f6a924f, (q31_t)0x3ce11507, (q31_t)0x8f679525, + (q31_t)0x3cdb8e09, (q31_t)0x8f649840, (q31_t)0x3cd606e7, (q31_t)0x8f619ba0, (q31_t)0x3cd07f9f, (q31_t)0x8f5e9f46, (q31_t)0x3ccaf831, (q31_t)0x8f5ba331, + (q31_t)0x3cc5709e, (q31_t)0x8f58a761, (q31_t)0x3cbfe8e5, (q31_t)0x8f55abd8, (q31_t)0x3cba6107, (q31_t)0x8f52b093, (q31_t)0x3cb4d904, (q31_t)0x8f4fb595, + (q31_t)0x3caf50da, (q31_t)0x8f4cbadb, (q31_t)0x3ca9c88c, (q31_t)0x8f49c067, (q31_t)0x3ca44018, (q31_t)0x8f46c639, (q31_t)0x3c9eb77f, (q31_t)0x8f43cc50, + (q31_t)0x3c992ec0, (q31_t)0x8f40d2ad, (q31_t)0x3c93a5dc, (q31_t)0x8f3dd950, (q31_t)0x3c8e1cd3, (q31_t)0x8f3ae038, (q31_t)0x3c8893a4, (q31_t)0x8f37e765, + (q31_t)0x3c830a50, (q31_t)0x8f34eed8, (q31_t)0x3c7d80d6, (q31_t)0x8f31f691, (q31_t)0x3c77f737, (q31_t)0x8f2efe8f, (q31_t)0x3c726d73, (q31_t)0x8f2c06d3, + (q31_t)0x3c6ce38a, (q31_t)0x8f290f5c, (q31_t)0x3c67597b, (q31_t)0x8f26182b, (q31_t)0x3c61cf48, (q31_t)0x8f232140, (q31_t)0x3c5c44ee, (q31_t)0x8f202a9a, + (q31_t)0x3c56ba70, (q31_t)0x8f1d343a, (q31_t)0x3c512fcc, (q31_t)0x8f1a3e1f, (q31_t)0x3c4ba504, (q31_t)0x8f17484b, (q31_t)0x3c461a16, (q31_t)0x8f1452bb, + (q31_t)0x3c408f03, (q31_t)0x8f115d72, (q31_t)0x3c3b03ca, (q31_t)0x8f0e686e, (q31_t)0x3c35786d, (q31_t)0x8f0b73b0, (q31_t)0x3c2fecea, (q31_t)0x8f087f37, + (q31_t)0x3c2a6142, (q31_t)0x8f058b04, (q31_t)0x3c24d575, (q31_t)0x8f029717, (q31_t)0x3c1f4983, (q31_t)0x8effa370, (q31_t)0x3c19bd6c, (q31_t)0x8efcb00e, + (q31_t)0x3c143130, (q31_t)0x8ef9bcf2, (q31_t)0x3c0ea4cf, (q31_t)0x8ef6ca1c, (q31_t)0x3c091849, (q31_t)0x8ef3d78b, (q31_t)0x3c038b9e, (q31_t)0x8ef0e540, + (q31_t)0x3bfdfecd, (q31_t)0x8eedf33b, (q31_t)0x3bf871d8, (q31_t)0x8eeb017c, (q31_t)0x3bf2e4be, (q31_t)0x8ee81002, (q31_t)0x3bed577e, (q31_t)0x8ee51ece, + (q31_t)0x3be7ca1a, (q31_t)0x8ee22de0, (q31_t)0x3be23c91, (q31_t)0x8edf3d38, (q31_t)0x3bdcaee3, (q31_t)0x8edc4cd5, (q31_t)0x3bd72110, (q31_t)0x8ed95cb8, + (q31_t)0x3bd19318, (q31_t)0x8ed66ce1, (q31_t)0x3bcc04fb, (q31_t)0x8ed37d50, (q31_t)0x3bc676b9, (q31_t)0x8ed08e05, (q31_t)0x3bc0e853, (q31_t)0x8ecd9eff, + (q31_t)0x3bbb59c7, (q31_t)0x8ecab040, (q31_t)0x3bb5cb17, (q31_t)0x8ec7c1c6, (q31_t)0x3bb03c42, (q31_t)0x8ec4d392, (q31_t)0x3baaad48, (q31_t)0x8ec1e5a4, + (q31_t)0x3ba51e29, (q31_t)0x8ebef7fb, (q31_t)0x3b9f8ee5, (q31_t)0x8ebc0a99, (q31_t)0x3b99ff7d, (q31_t)0x8eb91d7c, (q31_t)0x3b946ff0, (q31_t)0x8eb630a6, + (q31_t)0x3b8ee03e, (q31_t)0x8eb34415, (q31_t)0x3b895068, (q31_t)0x8eb057ca, (q31_t)0x3b83c06c, (q31_t)0x8ead6bc5, (q31_t)0x3b7e304c, (q31_t)0x8eaa8006, + (q31_t)0x3b78a007, (q31_t)0x8ea7948c, (q31_t)0x3b730f9e, (q31_t)0x8ea4a959, (q31_t)0x3b6d7f10, (q31_t)0x8ea1be6c, (q31_t)0x3b67ee5d, (q31_t)0x8e9ed3c4, + (q31_t)0x3b625d86, (q31_t)0x8e9be963, (q31_t)0x3b5ccc8a, (q31_t)0x8e98ff47, (q31_t)0x3b573b69, (q31_t)0x8e961571, (q31_t)0x3b51aa24, (q31_t)0x8e932be2, + (q31_t)0x3b4c18ba, (q31_t)0x8e904298, (q31_t)0x3b46872c, (q31_t)0x8e8d5994, (q31_t)0x3b40f579, (q31_t)0x8e8a70d7, (q31_t)0x3b3b63a1, (q31_t)0x8e87885f, + (q31_t)0x3b35d1a5, (q31_t)0x8e84a02d, (q31_t)0x3b303f84, (q31_t)0x8e81b841, (q31_t)0x3b2aad3f, (q31_t)0x8e7ed09b, (q31_t)0x3b251ad6, (q31_t)0x8e7be93c, + (q31_t)0x3b1f8848, (q31_t)0x8e790222, (q31_t)0x3b19f595, (q31_t)0x8e761b4e, (q31_t)0x3b1462be, (q31_t)0x8e7334c1, (q31_t)0x3b0ecfc3, (q31_t)0x8e704e79, + (q31_t)0x3b093ca3, (q31_t)0x8e6d6877, (q31_t)0x3b03a95e, (q31_t)0x8e6a82bc, (q31_t)0x3afe15f6, (q31_t)0x8e679d47, (q31_t)0x3af88269, (q31_t)0x8e64b817, + (q31_t)0x3af2eeb7, (q31_t)0x8e61d32e, (q31_t)0x3aed5ae1, (q31_t)0x8e5eee8b, (q31_t)0x3ae7c6e7, (q31_t)0x8e5c0a2e, (q31_t)0x3ae232c9, (q31_t)0x8e592617, + (q31_t)0x3adc9e86, (q31_t)0x8e564246, (q31_t)0x3ad70a1f, (q31_t)0x8e535ebb, (q31_t)0x3ad17593, (q31_t)0x8e507b76, (q31_t)0x3acbe0e3, (q31_t)0x8e4d9878, + (q31_t)0x3ac64c0f, (q31_t)0x8e4ab5bf, (q31_t)0x3ac0b717, (q31_t)0x8e47d34d, (q31_t)0x3abb21fb, (q31_t)0x8e44f121, (q31_t)0x3ab58cba, (q31_t)0x8e420f3b, + (q31_t)0x3aaff755, (q31_t)0x8e3f2d9b, (q31_t)0x3aaa61cc, (q31_t)0x8e3c4c41, (q31_t)0x3aa4cc1e, (q31_t)0x8e396b2e, (q31_t)0x3a9f364d, (q31_t)0x8e368a61, + (q31_t)0x3a99a057, (q31_t)0x8e33a9da, (q31_t)0x3a940a3e, (q31_t)0x8e30c999, (q31_t)0x3a8e7400, (q31_t)0x8e2de99e, (q31_t)0x3a88dd9d, (q31_t)0x8e2b09e9, + (q31_t)0x3a834717, (q31_t)0x8e282a7b, (q31_t)0x3a7db06d, (q31_t)0x8e254b53, (q31_t)0x3a78199f, (q31_t)0x8e226c71, (q31_t)0x3a7282ac, (q31_t)0x8e1f8dd6, + (q31_t)0x3a6ceb96, (q31_t)0x8e1caf80, (q31_t)0x3a67545b, (q31_t)0x8e19d171, (q31_t)0x3a61bcfd, (q31_t)0x8e16f3a9, (q31_t)0x3a5c257a, (q31_t)0x8e141626, + (q31_t)0x3a568dd4, (q31_t)0x8e1138ea, (q31_t)0x3a50f609, (q31_t)0x8e0e5bf4, (q31_t)0x3a4b5e1b, (q31_t)0x8e0b7f44, (q31_t)0x3a45c608, (q31_t)0x8e08a2db, + (q31_t)0x3a402dd2, (q31_t)0x8e05c6b7, (q31_t)0x3a3a9577, (q31_t)0x8e02eadb, (q31_t)0x3a34fcf9, (q31_t)0x8e000f44, (q31_t)0x3a2f6457, (q31_t)0x8dfd33f4, + (q31_t)0x3a29cb91, (q31_t)0x8dfa58ea, (q31_t)0x3a2432a7, (q31_t)0x8df77e27, (q31_t)0x3a1e9999, (q31_t)0x8df4a3a9, (q31_t)0x3a190068, (q31_t)0x8df1c973, + (q31_t)0x3a136712, (q31_t)0x8deeef82, (q31_t)0x3a0dcd99, (q31_t)0x8dec15d8, (q31_t)0x3a0833fc, (q31_t)0x8de93c74, (q31_t)0x3a029a3b, (q31_t)0x8de66357, + (q31_t)0x39fd0056, (q31_t)0x8de38a80, (q31_t)0x39f7664e, (q31_t)0x8de0b1ef, (q31_t)0x39f1cc21, (q31_t)0x8dddd9a5, (q31_t)0x39ec31d1, (q31_t)0x8ddb01a1, + (q31_t)0x39e6975e, (q31_t)0x8dd829e4, (q31_t)0x39e0fcc6, (q31_t)0x8dd5526d, (q31_t)0x39db620b, (q31_t)0x8dd27b3c, (q31_t)0x39d5c72c, (q31_t)0x8dcfa452, + (q31_t)0x39d02c2a, (q31_t)0x8dcccdaf, (q31_t)0x39ca9104, (q31_t)0x8dc9f751, (q31_t)0x39c4f5ba, (q31_t)0x8dc7213b, (q31_t)0x39bf5a4d, (q31_t)0x8dc44b6a, + (q31_t)0x39b9bebc, (q31_t)0x8dc175e0, (q31_t)0x39b42307, (q31_t)0x8dbea09d, (q31_t)0x39ae872f, (q31_t)0x8dbbcba0, (q31_t)0x39a8eb33, (q31_t)0x8db8f6ea, + (q31_t)0x39a34f13, (q31_t)0x8db6227a, (q31_t)0x399db2d0, (q31_t)0x8db34e50, (q31_t)0x3998166a, (q31_t)0x8db07a6d, (q31_t)0x399279e0, (q31_t)0x8dada6d1, + (q31_t)0x398cdd32, (q31_t)0x8daad37b, (q31_t)0x39874061, (q31_t)0x8da8006c, (q31_t)0x3981a36d, (q31_t)0x8da52da3, (q31_t)0x397c0655, (q31_t)0x8da25b21, + (q31_t)0x39766919, (q31_t)0x8d9f88e5, (q31_t)0x3970cbba, (q31_t)0x8d9cb6f0, (q31_t)0x396b2e38, (q31_t)0x8d99e541, (q31_t)0x39659092, (q31_t)0x8d9713d9, + (q31_t)0x395ff2c9, (q31_t)0x8d9442b8, (q31_t)0x395a54dd, (q31_t)0x8d9171dd, (q31_t)0x3954b6cd, (q31_t)0x8d8ea148, (q31_t)0x394f1899, (q31_t)0x8d8bd0fb, + (q31_t)0x39497a43, (q31_t)0x8d8900f3, (q31_t)0x3943dbc9, (q31_t)0x8d863133, (q31_t)0x393e3d2c, (q31_t)0x8d8361b9, (q31_t)0x39389e6b, (q31_t)0x8d809286, + (q31_t)0x3932ff87, (q31_t)0x8d7dc399, (q31_t)0x392d6080, (q31_t)0x8d7af4f3, (q31_t)0x3927c155, (q31_t)0x8d782694, (q31_t)0x39222208, (q31_t)0x8d75587b, + (q31_t)0x391c8297, (q31_t)0x8d728aa9, (q31_t)0x3916e303, (q31_t)0x8d6fbd1d, (q31_t)0x3911434b, (q31_t)0x8d6cefd9, (q31_t)0x390ba371, (q31_t)0x8d6a22db, + (q31_t)0x39060373, (q31_t)0x8d675623, (q31_t)0x39006352, (q31_t)0x8d6489b3, (q31_t)0x38fac30e, (q31_t)0x8d61bd89, (q31_t)0x38f522a6, (q31_t)0x8d5ef1a5, + (q31_t)0x38ef821c, (q31_t)0x8d5c2609, (q31_t)0x38e9e16e, (q31_t)0x8d595ab3, (q31_t)0x38e4409e, (q31_t)0x8d568fa4, (q31_t)0x38de9faa, (q31_t)0x8d53c4db, + (q31_t)0x38d8fe93, (q31_t)0x8d50fa59, (q31_t)0x38d35d59, (q31_t)0x8d4e301f, (q31_t)0x38cdbbfc, (q31_t)0x8d4b662a, (q31_t)0x38c81a7c, (q31_t)0x8d489c7d, + (q31_t)0x38c278d9, (q31_t)0x8d45d316, (q31_t)0x38bcd713, (q31_t)0x8d4309f6, (q31_t)0x38b7352a, (q31_t)0x8d40411d, (q31_t)0x38b1931e, (q31_t)0x8d3d788b, + (q31_t)0x38abf0ef, (q31_t)0x8d3ab03f, (q31_t)0x38a64e9d, (q31_t)0x8d37e83a, (q31_t)0x38a0ac29, (q31_t)0x8d35207d, (q31_t)0x389b0991, (q31_t)0x8d325905, + (q31_t)0x389566d6, (q31_t)0x8d2f91d5, (q31_t)0x388fc3f8, (q31_t)0x8d2ccaec, (q31_t)0x388a20f8, (q31_t)0x8d2a0449, (q31_t)0x38847dd5, (q31_t)0x8d273ded, + (q31_t)0x387eda8e, (q31_t)0x8d2477d8, (q31_t)0x38793725, (q31_t)0x8d21b20a, (q31_t)0x38739399, (q31_t)0x8d1eec83, (q31_t)0x386defeb, (q31_t)0x8d1c2742, + (q31_t)0x38684c19, (q31_t)0x8d196249, (q31_t)0x3862a825, (q31_t)0x8d169d96, (q31_t)0x385d040d, (q31_t)0x8d13d92a, (q31_t)0x38575fd4, (q31_t)0x8d111505, + (q31_t)0x3851bb77, (q31_t)0x8d0e5127, (q31_t)0x384c16f7, (q31_t)0x8d0b8d90, (q31_t)0x38467255, (q31_t)0x8d08ca40, (q31_t)0x3840cd90, (q31_t)0x8d060737, + (q31_t)0x383b28a9, (q31_t)0x8d034474, (q31_t)0x3835839f, (q31_t)0x8d0081f9, (q31_t)0x382fde72, (q31_t)0x8cfdbfc4, (q31_t)0x382a3922, (q31_t)0x8cfafdd7, + (q31_t)0x382493b0, (q31_t)0x8cf83c30, (q31_t)0x381eee1b, (q31_t)0x8cf57ad0, (q31_t)0x38194864, (q31_t)0x8cf2b9b8, (q31_t)0x3813a28a, (q31_t)0x8ceff8e6, + (q31_t)0x380dfc8d, (q31_t)0x8ced385b, (q31_t)0x3808566e, (q31_t)0x8cea7818, (q31_t)0x3802b02c, (q31_t)0x8ce7b81b, (q31_t)0x37fd09c8, (q31_t)0x8ce4f865, + (q31_t)0x37f76341, (q31_t)0x8ce238f6, (q31_t)0x37f1bc97, (q31_t)0x8cdf79ce, (q31_t)0x37ec15cb, (q31_t)0x8cdcbaee, (q31_t)0x37e66edd, (q31_t)0x8cd9fc54, + (q31_t)0x37e0c7cc, (q31_t)0x8cd73e01, (q31_t)0x37db2099, (q31_t)0x8cd47ff6, (q31_t)0x37d57943, (q31_t)0x8cd1c231, (q31_t)0x37cfd1cb, (q31_t)0x8ccf04b3, + (q31_t)0x37ca2a30, (q31_t)0x8ccc477d, (q31_t)0x37c48273, (q31_t)0x8cc98a8e, (q31_t)0x37beda93, (q31_t)0x8cc6cde5, (q31_t)0x37b93292, (q31_t)0x8cc41184, + (q31_t)0x37b38a6d, (q31_t)0x8cc1556a, (q31_t)0x37ade227, (q31_t)0x8cbe9996, (q31_t)0x37a839be, (q31_t)0x8cbbde0a, (q31_t)0x37a29132, (q31_t)0x8cb922c6, + (q31_t)0x379ce885, (q31_t)0x8cb667c8, (q31_t)0x37973fb5, (q31_t)0x8cb3ad11, (q31_t)0x379196c3, (q31_t)0x8cb0f2a1, (q31_t)0x378bedae, (q31_t)0x8cae3879, + (q31_t)0x37864477, (q31_t)0x8cab7e98, (q31_t)0x37809b1e, (q31_t)0x8ca8c4fd, (q31_t)0x377af1a3, (q31_t)0x8ca60baa, (q31_t)0x37754806, (q31_t)0x8ca3529f, + (q31_t)0x376f9e46, (q31_t)0x8ca099da, (q31_t)0x3769f464, (q31_t)0x8c9de15c, (q31_t)0x37644a60, (q31_t)0x8c9b2926, (q31_t)0x375ea03a, (q31_t)0x8c987137, + (q31_t)0x3758f5f2, (q31_t)0x8c95b98f, (q31_t)0x37534b87, (q31_t)0x8c93022e, (q31_t)0x374da0fa, (q31_t)0x8c904b14, (q31_t)0x3747f64c, (q31_t)0x8c8d9442, + (q31_t)0x37424b7b, (q31_t)0x8c8addb7, (q31_t)0x373ca088, (q31_t)0x8c882773, (q31_t)0x3736f573, (q31_t)0x8c857176, (q31_t)0x37314a3c, (q31_t)0x8c82bbc0, + (q31_t)0x372b9ee3, (q31_t)0x8c800652, (q31_t)0x3725f367, (q31_t)0x8c7d512b, (q31_t)0x372047ca, (q31_t)0x8c7a9c4b, (q31_t)0x371a9c0b, (q31_t)0x8c77e7b3, + (q31_t)0x3714f02a, (q31_t)0x8c753362, (q31_t)0x370f4427, (q31_t)0x8c727f58, (q31_t)0x37099802, (q31_t)0x8c6fcb95, (q31_t)0x3703ebbb, (q31_t)0x8c6d181a, + (q31_t)0x36fe3f52, (q31_t)0x8c6a64e5, (q31_t)0x36f892c7, (q31_t)0x8c67b1f9, (q31_t)0x36f2e61a, (q31_t)0x8c64ff53, (q31_t)0x36ed394b, (q31_t)0x8c624cf5, + (q31_t)0x36e78c5b, (q31_t)0x8c5f9ade, (q31_t)0x36e1df48, (q31_t)0x8c5ce90e, (q31_t)0x36dc3214, (q31_t)0x8c5a3786, (q31_t)0x36d684be, (q31_t)0x8c578645, + (q31_t)0x36d0d746, (q31_t)0x8c54d54c, (q31_t)0x36cb29ac, (q31_t)0x8c522499, (q31_t)0x36c57bf0, (q31_t)0x8c4f742f, (q31_t)0x36bfce13, (q31_t)0x8c4cc40b, + (q31_t)0x36ba2014, (q31_t)0x8c4a142f, (q31_t)0x36b471f3, (q31_t)0x8c47649a, (q31_t)0x36aec3b0, (q31_t)0x8c44b54d, (q31_t)0x36a9154c, (q31_t)0x8c420647, + (q31_t)0x36a366c6, (q31_t)0x8c3f5788, (q31_t)0x369db81e, (q31_t)0x8c3ca911, (q31_t)0x36980954, (q31_t)0x8c39fae1, (q31_t)0x36925a69, (q31_t)0x8c374cf9, + (q31_t)0x368cab5c, (q31_t)0x8c349f58, (q31_t)0x3686fc2e, (q31_t)0x8c31f1ff, (q31_t)0x36814cde, (q31_t)0x8c2f44ed, (q31_t)0x367b9d6c, (q31_t)0x8c2c9822, + (q31_t)0x3675edd9, (q31_t)0x8c29eb9f, (q31_t)0x36703e24, (q31_t)0x8c273f63, (q31_t)0x366a8e4d, (q31_t)0x8c24936f, (q31_t)0x3664de55, (q31_t)0x8c21e7c2, + (q31_t)0x365f2e3b, (q31_t)0x8c1f3c5d, (q31_t)0x36597e00, (q31_t)0x8c1c913f, (q31_t)0x3653cda3, (q31_t)0x8c19e669, (q31_t)0x364e1d25, (q31_t)0x8c173bda, + (q31_t)0x36486c86, (q31_t)0x8c149192, (q31_t)0x3642bbc4, (q31_t)0x8c11e792, (q31_t)0x363d0ae2, (q31_t)0x8c0f3dda, (q31_t)0x363759de, (q31_t)0x8c0c9469, + (q31_t)0x3631a8b8, (q31_t)0x8c09eb40, (q31_t)0x362bf771, (q31_t)0x8c07425e, (q31_t)0x36264609, (q31_t)0x8c0499c4, (q31_t)0x3620947f, (q31_t)0x8c01f171, + (q31_t)0x361ae2d3, (q31_t)0x8bff4966, (q31_t)0x36153107, (q31_t)0x8bfca1a3, (q31_t)0x360f7f19, (q31_t)0x8bf9fa27, (q31_t)0x3609cd0a, (q31_t)0x8bf752f2, + (q31_t)0x36041ad9, (q31_t)0x8bf4ac05, (q31_t)0x35fe6887, (q31_t)0x8bf20560, (q31_t)0x35f8b614, (q31_t)0x8bef5f02, (q31_t)0x35f3037f, (q31_t)0x8becb8ec, + (q31_t)0x35ed50c9, (q31_t)0x8bea131e, (q31_t)0x35e79df2, (q31_t)0x8be76d97, (q31_t)0x35e1eafa, (q31_t)0x8be4c857, (q31_t)0x35dc37e0, (q31_t)0x8be22360, + (q31_t)0x35d684a6, (q31_t)0x8bdf7eb0, (q31_t)0x35d0d14a, (q31_t)0x8bdcda47, (q31_t)0x35cb1dcc, (q31_t)0x8bda3626, (q31_t)0x35c56a2e, (q31_t)0x8bd7924d, + (q31_t)0x35bfb66e, (q31_t)0x8bd4eebc, (q31_t)0x35ba028e, (q31_t)0x8bd24b72, (q31_t)0x35b44e8c, (q31_t)0x8bcfa870, (q31_t)0x35ae9a69, (q31_t)0x8bcd05b5, + (q31_t)0x35a8e625, (q31_t)0x8bca6343, (q31_t)0x35a331c0, (q31_t)0x8bc7c117, (q31_t)0x359d7d39, (q31_t)0x8bc51f34, (q31_t)0x3597c892, (q31_t)0x8bc27d98, + (q31_t)0x359213c9, (q31_t)0x8bbfdc44, (q31_t)0x358c5ee0, (q31_t)0x8bbd3b38, (q31_t)0x3586a9d5, (q31_t)0x8bba9a73, (q31_t)0x3580f4aa, (q31_t)0x8bb7f9f6, + (q31_t)0x357b3f5d, (q31_t)0x8bb559c1, (q31_t)0x357589f0, (q31_t)0x8bb2b9d4, (q31_t)0x356fd461, (q31_t)0x8bb01a2e, (q31_t)0x356a1eb2, (q31_t)0x8bad7ad0, + (q31_t)0x356468e2, (q31_t)0x8baadbba, (q31_t)0x355eb2f0, (q31_t)0x8ba83cec, (q31_t)0x3558fcde, (q31_t)0x8ba59e65, (q31_t)0x355346ab, (q31_t)0x8ba30026, + (q31_t)0x354d9057, (q31_t)0x8ba0622f, (q31_t)0x3547d9e2, (q31_t)0x8b9dc480, (q31_t)0x3542234c, (q31_t)0x8b9b2718, (q31_t)0x353c6c95, (q31_t)0x8b9889f8, + (q31_t)0x3536b5be, (q31_t)0x8b95ed21, (q31_t)0x3530fec6, (q31_t)0x8b935090, (q31_t)0x352b47ad, (q31_t)0x8b90b448, (q31_t)0x35259073, (q31_t)0x8b8e1848, + (q31_t)0x351fd918, (q31_t)0x8b8b7c8f, (q31_t)0x351a219c, (q31_t)0x8b88e11e, (q31_t)0x35146a00, (q31_t)0x8b8645f5, (q31_t)0x350eb243, (q31_t)0x8b83ab14, + (q31_t)0x3508fa66, (q31_t)0x8b81107b, (q31_t)0x35034267, (q31_t)0x8b7e7629, (q31_t)0x34fd8a48, (q31_t)0x8b7bdc20, (q31_t)0x34f7d208, (q31_t)0x8b79425e, + (q31_t)0x34f219a8, (q31_t)0x8b76a8e4, (q31_t)0x34ec6127, (q31_t)0x8b740fb3, (q31_t)0x34e6a885, (q31_t)0x8b7176c8, (q31_t)0x34e0efc2, (q31_t)0x8b6ede26, + (q31_t)0x34db36df, (q31_t)0x8b6c45cc, (q31_t)0x34d57ddc, (q31_t)0x8b69adba, (q31_t)0x34cfc4b7, (q31_t)0x8b6715ef, (q31_t)0x34ca0b73, (q31_t)0x8b647e6d, + (q31_t)0x34c4520d, (q31_t)0x8b61e733, (q31_t)0x34be9887, (q31_t)0x8b5f5040, (q31_t)0x34b8dee1, (q31_t)0x8b5cb995, (q31_t)0x34b3251a, (q31_t)0x8b5a2333, + (q31_t)0x34ad6b32, (q31_t)0x8b578d18, (q31_t)0x34a7b12a, (q31_t)0x8b54f745, (q31_t)0x34a1f702, (q31_t)0x8b5261ba, (q31_t)0x349c3cb9, (q31_t)0x8b4fcc77, + (q31_t)0x34968250, (q31_t)0x8b4d377c, (q31_t)0x3490c7c6, (q31_t)0x8b4aa2ca, (q31_t)0x348b0d1c, (q31_t)0x8b480e5f, (q31_t)0x34855251, (q31_t)0x8b457a3c, + (q31_t)0x347f9766, (q31_t)0x8b42e661, (q31_t)0x3479dc5b, (q31_t)0x8b4052ce, (q31_t)0x3474212f, (q31_t)0x8b3dbf83, (q31_t)0x346e65e3, (q31_t)0x8b3b2c80, + (q31_t)0x3468aa76, (q31_t)0x8b3899c6, (q31_t)0x3462eee9, (q31_t)0x8b360753, (q31_t)0x345d333c, (q31_t)0x8b337528, (q31_t)0x3457776f, (q31_t)0x8b30e345, + (q31_t)0x3451bb81, (q31_t)0x8b2e51ab, (q31_t)0x344bff73, (q31_t)0x8b2bc058, (q31_t)0x34464345, (q31_t)0x8b292f4e, (q31_t)0x344086f6, (q31_t)0x8b269e8b, + (q31_t)0x343aca87, (q31_t)0x8b240e11, (q31_t)0x34350df8, (q31_t)0x8b217ddf, (q31_t)0x342f5149, (q31_t)0x8b1eedf4, (q31_t)0x3429947a, (q31_t)0x8b1c5e52, + (q31_t)0x3423d78a, (q31_t)0x8b19cef8, (q31_t)0x341e1a7b, (q31_t)0x8b173fe6, (q31_t)0x34185d4b, (q31_t)0x8b14b11d, (q31_t)0x34129ffb, (q31_t)0x8b12229b, + (q31_t)0x340ce28b, (q31_t)0x8b0f9462, (q31_t)0x340724fb, (q31_t)0x8b0d0670, (q31_t)0x3401674a, (q31_t)0x8b0a78c7, (q31_t)0x33fba97a, (q31_t)0x8b07eb66, + (q31_t)0x33f5eb89, (q31_t)0x8b055e4d, (q31_t)0x33f02d79, (q31_t)0x8b02d17c, (q31_t)0x33ea6f48, (q31_t)0x8b0044f3, (q31_t)0x33e4b0f8, (q31_t)0x8afdb8b3, + (q31_t)0x33def287, (q31_t)0x8afb2cbb, (q31_t)0x33d933f7, (q31_t)0x8af8a10b, (q31_t)0x33d37546, (q31_t)0x8af615a3, (q31_t)0x33cdb676, (q31_t)0x8af38a83, + (q31_t)0x33c7f785, (q31_t)0x8af0ffac, (q31_t)0x33c23875, (q31_t)0x8aee751c, (q31_t)0x33bc7944, (q31_t)0x8aebead5, (q31_t)0x33b6b9f4, (q31_t)0x8ae960d6, + (q31_t)0x33b0fa84, (q31_t)0x8ae6d720, (q31_t)0x33ab3af4, (q31_t)0x8ae44db1, (q31_t)0x33a57b44, (q31_t)0x8ae1c48b, (q31_t)0x339fbb74, (q31_t)0x8adf3bad, + (q31_t)0x3399fb85, (q31_t)0x8adcb318, (q31_t)0x33943b75, (q31_t)0x8ada2aca, (q31_t)0x338e7b46, (q31_t)0x8ad7a2c5, (q31_t)0x3388baf7, (q31_t)0x8ad51b08, + (q31_t)0x3382fa88, (q31_t)0x8ad29394, (q31_t)0x337d39f9, (q31_t)0x8ad00c67, (q31_t)0x3377794b, (q31_t)0x8acd8583, (q31_t)0x3371b87d, (q31_t)0x8acafee8, + (q31_t)0x336bf78f, (q31_t)0x8ac87894, (q31_t)0x33663682, (q31_t)0x8ac5f289, (q31_t)0x33607554, (q31_t)0x8ac36cc6, (q31_t)0x335ab407, (q31_t)0x8ac0e74c, + (q31_t)0x3354f29b, (q31_t)0x8abe6219, (q31_t)0x334f310e, (q31_t)0x8abbdd30, (q31_t)0x33496f62, (q31_t)0x8ab9588e, (q31_t)0x3343ad97, (q31_t)0x8ab6d435, + (q31_t)0x333debab, (q31_t)0x8ab45024, (q31_t)0x333829a1, (q31_t)0x8ab1cc5c, (q31_t)0x33326776, (q31_t)0x8aaf48db, (q31_t)0x332ca52c, (q31_t)0x8aacc5a4, + (q31_t)0x3326e2c3, (q31_t)0x8aaa42b4, (q31_t)0x33212039, (q31_t)0x8aa7c00d, (q31_t)0x331b5d91, (q31_t)0x8aa53daf, (q31_t)0x33159ac8, (q31_t)0x8aa2bb99, + (q31_t)0x330fd7e1, (q31_t)0x8aa039cb, (q31_t)0x330a14da, (q31_t)0x8a9db845, (q31_t)0x330451b3, (q31_t)0x8a9b3708, (q31_t)0x32fe8e6d, (q31_t)0x8a98b614, + (q31_t)0x32f8cb07, (q31_t)0x8a963567, (q31_t)0x32f30782, (q31_t)0x8a93b504, (q31_t)0x32ed43de, (q31_t)0x8a9134e8, (q31_t)0x32e7801a, (q31_t)0x8a8eb516, + (q31_t)0x32e1bc36, (q31_t)0x8a8c358b, (q31_t)0x32dbf834, (q31_t)0x8a89b649, (q31_t)0x32d63412, (q31_t)0x8a873750, (q31_t)0x32d06fd0, (q31_t)0x8a84b89e, + (q31_t)0x32caab6f, (q31_t)0x8a823a36, (q31_t)0x32c4e6ef, (q31_t)0x8a7fbc16, (q31_t)0x32bf2250, (q31_t)0x8a7d3e3e, (q31_t)0x32b95d91, (q31_t)0x8a7ac0af, + (q31_t)0x32b398b3, (q31_t)0x8a784368, (q31_t)0x32add3b6, (q31_t)0x8a75c66a, (q31_t)0x32a80e99, (q31_t)0x8a7349b4, (q31_t)0x32a2495d, (q31_t)0x8a70cd47, + (q31_t)0x329c8402, (q31_t)0x8a6e5123, (q31_t)0x3296be88, (q31_t)0x8a6bd547, (q31_t)0x3290f8ef, (q31_t)0x8a6959b3, (q31_t)0x328b3336, (q31_t)0x8a66de68, + (q31_t)0x32856d5e, (q31_t)0x8a646365, (q31_t)0x327fa767, (q31_t)0x8a61e8ab, (q31_t)0x3279e151, (q31_t)0x8a5f6e3a, (q31_t)0x32741b1c, (q31_t)0x8a5cf411, + (q31_t)0x326e54c7, (q31_t)0x8a5a7a31, (q31_t)0x32688e54, (q31_t)0x8a580099, (q31_t)0x3262c7c1, (q31_t)0x8a55874a, (q31_t)0x325d0110, (q31_t)0x8a530e43, + (q31_t)0x32573a3f, (q31_t)0x8a509585, (q31_t)0x3251734f, (q31_t)0x8a4e1d10, (q31_t)0x324bac40, (q31_t)0x8a4ba4e3, (q31_t)0x3245e512, (q31_t)0x8a492cff, + (q31_t)0x32401dc6, (q31_t)0x8a46b564, (q31_t)0x323a565a, (q31_t)0x8a443e11, (q31_t)0x32348ecf, (q31_t)0x8a41c706, (q31_t)0x322ec725, (q31_t)0x8a3f5045, + (q31_t)0x3228ff5c, (q31_t)0x8a3cd9cc, (q31_t)0x32233775, (q31_t)0x8a3a639b, (q31_t)0x321d6f6e, (q31_t)0x8a37edb3, (q31_t)0x3217a748, (q31_t)0x8a357814, + (q31_t)0x3211df04, (q31_t)0x8a3302be, (q31_t)0x320c16a1, (q31_t)0x8a308db0, (q31_t)0x32064e1e, (q31_t)0x8a2e18eb, (q31_t)0x3200857d, (q31_t)0x8a2ba46e, + (q31_t)0x31fabcbd, (q31_t)0x8a29303b, (q31_t)0x31f4f3df, (q31_t)0x8a26bc50, (q31_t)0x31ef2ae1, (q31_t)0x8a2448ad, (q31_t)0x31e961c5, (q31_t)0x8a21d554, + (q31_t)0x31e39889, (q31_t)0x8a1f6243, (q31_t)0x31ddcf30, (q31_t)0x8a1cef7a, (q31_t)0x31d805b7, (q31_t)0x8a1a7cfb, (q31_t)0x31d23c1f, (q31_t)0x8a180ac4, + (q31_t)0x31cc7269, (q31_t)0x8a1598d6, (q31_t)0x31c6a894, (q31_t)0x8a132731, (q31_t)0x31c0dea1, (q31_t)0x8a10b5d4, (q31_t)0x31bb148f, (q31_t)0x8a0e44c0, + (q31_t)0x31b54a5e, (q31_t)0x8a0bd3f5, (q31_t)0x31af800e, (q31_t)0x8a096373, (q31_t)0x31a9b5a0, (q31_t)0x8a06f339, (q31_t)0x31a3eb13, (q31_t)0x8a048348, + (q31_t)0x319e2067, (q31_t)0x8a0213a0, (q31_t)0x3198559d, (q31_t)0x89ffa441, (q31_t)0x31928ab4, (q31_t)0x89fd352b, (q31_t)0x318cbfad, (q31_t)0x89fac65d, + (q31_t)0x3186f487, (q31_t)0x89f857d8, (q31_t)0x31812943, (q31_t)0x89f5e99c, (q31_t)0x317b5de0, (q31_t)0x89f37ba9, (q31_t)0x3175925e, (q31_t)0x89f10dff, + (q31_t)0x316fc6be, (q31_t)0x89eea09d, (q31_t)0x3169fb00, (q31_t)0x89ec3384, (q31_t)0x31642f23, (q31_t)0x89e9c6b4, (q31_t)0x315e6328, (q31_t)0x89e75a2d, + (q31_t)0x3158970e, (q31_t)0x89e4edef, (q31_t)0x3152cad5, (q31_t)0x89e281fa, (q31_t)0x314cfe7f, (q31_t)0x89e0164d, (q31_t)0x31473209, (q31_t)0x89ddaae9, + (q31_t)0x31416576, (q31_t)0x89db3fcf, (q31_t)0x313b98c4, (q31_t)0x89d8d4fd, (q31_t)0x3135cbf4, (q31_t)0x89d66a74, (q31_t)0x312fff05, (q31_t)0x89d40033, + (q31_t)0x312a31f8, (q31_t)0x89d1963c, (q31_t)0x312464cd, (q31_t)0x89cf2c8e, (q31_t)0x311e9783, (q31_t)0x89ccc328, (q31_t)0x3118ca1b, (q31_t)0x89ca5a0c, + (q31_t)0x3112fc95, (q31_t)0x89c7f138, (q31_t)0x310d2ef0, (q31_t)0x89c588ae, (q31_t)0x3107612e, (q31_t)0x89c3206c, (q31_t)0x3101934d, (q31_t)0x89c0b873, + (q31_t)0x30fbc54d, (q31_t)0x89be50c3, (q31_t)0x30f5f730, (q31_t)0x89bbe95c, (q31_t)0x30f028f4, (q31_t)0x89b9823e, (q31_t)0x30ea5a9a, (q31_t)0x89b71b69, + (q31_t)0x30e48c22, (q31_t)0x89b4b4dd, (q31_t)0x30debd8c, (q31_t)0x89b24e9a, (q31_t)0x30d8eed8, (q31_t)0x89afe8a0, (q31_t)0x30d32006, (q31_t)0x89ad82ef, + (q31_t)0x30cd5115, (q31_t)0x89ab1d87, (q31_t)0x30c78206, (q31_t)0x89a8b868, (q31_t)0x30c1b2da, (q31_t)0x89a65391, (q31_t)0x30bbe38f, (q31_t)0x89a3ef04, + (q31_t)0x30b61426, (q31_t)0x89a18ac0, (q31_t)0x30b0449f, (q31_t)0x899f26c5, (q31_t)0x30aa74fa, (q31_t)0x899cc313, (q31_t)0x30a4a537, (q31_t)0x899a5faa, + (q31_t)0x309ed556, (q31_t)0x8997fc8a, (q31_t)0x30990557, (q31_t)0x899599b3, (q31_t)0x3093353a, (q31_t)0x89933725, (q31_t)0x308d64ff, (q31_t)0x8990d4e0, + (q31_t)0x308794a6, (q31_t)0x898e72e4, (q31_t)0x3081c42f, (q31_t)0x898c1131, (q31_t)0x307bf39b, (q31_t)0x8989afc8, (q31_t)0x307622e8, (q31_t)0x89874ea7, + (q31_t)0x30705217, (q31_t)0x8984edcf, (q31_t)0x306a8129, (q31_t)0x89828d41, (q31_t)0x3064b01d, (q31_t)0x89802cfc, (q31_t)0x305edef3, (q31_t)0x897dccff, + (q31_t)0x30590dab, (q31_t)0x897b6d4c, (q31_t)0x30533c45, (q31_t)0x89790de2, (q31_t)0x304d6ac1, (q31_t)0x8976aec1, (q31_t)0x30479920, (q31_t)0x89744fe9, + (q31_t)0x3041c761, (q31_t)0x8971f15a, (q31_t)0x303bf584, (q31_t)0x896f9315, (q31_t)0x30362389, (q31_t)0x896d3518, (q31_t)0x30305171, (q31_t)0x896ad765, + (q31_t)0x302a7f3a, (q31_t)0x896879fb, (q31_t)0x3024ace6, (q31_t)0x89661cda, (q31_t)0x301eda75, (q31_t)0x8963c002, (q31_t)0x301907e6, (q31_t)0x89616373, + (q31_t)0x30133539, (q31_t)0x895f072e, (q31_t)0x300d626e, (q31_t)0x895cab31, (q31_t)0x30078f86, (q31_t)0x895a4f7e, (q31_t)0x3001bc80, (q31_t)0x8957f414, + (q31_t)0x2ffbe95d, (q31_t)0x895598f3, (q31_t)0x2ff6161c, (q31_t)0x89533e1c, (q31_t)0x2ff042bd, (q31_t)0x8950e38e, (q31_t)0x2fea6f41, (q31_t)0x894e8948, + (q31_t)0x2fe49ba7, (q31_t)0x894c2f4c, (q31_t)0x2fdec7f0, (q31_t)0x8949d59a, (q31_t)0x2fd8f41b, (q31_t)0x89477c30, (q31_t)0x2fd32028, (q31_t)0x89452310, + (q31_t)0x2fcd4c19, (q31_t)0x8942ca39, (q31_t)0x2fc777eb, (q31_t)0x894071ab, (q31_t)0x2fc1a3a0, (q31_t)0x893e1967, (q31_t)0x2fbbcf38, (q31_t)0x893bc16b, + (q31_t)0x2fb5fab2, (q31_t)0x893969b9, (q31_t)0x2fb0260f, (q31_t)0x89371250, (q31_t)0x2faa514f, (q31_t)0x8934bb31, (q31_t)0x2fa47c71, (q31_t)0x8932645b, + (q31_t)0x2f9ea775, (q31_t)0x89300dce, (q31_t)0x2f98d25d, (q31_t)0x892db78a, (q31_t)0x2f92fd26, (q31_t)0x892b6190, (q31_t)0x2f8d27d3, (q31_t)0x89290bdf, + (q31_t)0x2f875262, (q31_t)0x8926b677, (q31_t)0x2f817cd4, (q31_t)0x89246159, (q31_t)0x2f7ba729, (q31_t)0x89220c84, (q31_t)0x2f75d160, (q31_t)0x891fb7f8, + (q31_t)0x2f6ffb7a, (q31_t)0x891d63b5, (q31_t)0x2f6a2577, (q31_t)0x891b0fbc, (q31_t)0x2f644f56, (q31_t)0x8918bc0c, (q31_t)0x2f5e7919, (q31_t)0x891668a6, + (q31_t)0x2f58a2be, (q31_t)0x89141589, (q31_t)0x2f52cc46, (q31_t)0x8911c2b5, (q31_t)0x2f4cf5b0, (q31_t)0x890f702b, (q31_t)0x2f471efe, (q31_t)0x890d1dea, + (q31_t)0x2f41482e, (q31_t)0x890acbf2, (q31_t)0x2f3b7141, (q31_t)0x89087a44, (q31_t)0x2f359a37, (q31_t)0x890628df, (q31_t)0x2f2fc310, (q31_t)0x8903d7c4, + (q31_t)0x2f29ebcc, (q31_t)0x890186f2, (q31_t)0x2f24146b, (q31_t)0x88ff3669, (q31_t)0x2f1e3ced, (q31_t)0x88fce62a, (q31_t)0x2f186551, (q31_t)0x88fa9634, + (q31_t)0x2f128d99, (q31_t)0x88f84687, (q31_t)0x2f0cb5c3, (q31_t)0x88f5f724, (q31_t)0x2f06ddd1, (q31_t)0x88f3a80b, (q31_t)0x2f0105c1, (q31_t)0x88f1593b, + (q31_t)0x2efb2d95, (q31_t)0x88ef0ab4, (q31_t)0x2ef5554b, (q31_t)0x88ecbc77, (q31_t)0x2eef7ce5, (q31_t)0x88ea6e83, (q31_t)0x2ee9a461, (q31_t)0x88e820d9, + (q31_t)0x2ee3cbc1, (q31_t)0x88e5d378, (q31_t)0x2eddf304, (q31_t)0x88e38660, (q31_t)0x2ed81a29, (q31_t)0x88e13992, (q31_t)0x2ed24132, (q31_t)0x88deed0e, + (q31_t)0x2ecc681e, (q31_t)0x88dca0d3, (q31_t)0x2ec68eed, (q31_t)0x88da54e1, (q31_t)0x2ec0b5a0, (q31_t)0x88d8093a, (q31_t)0x2ebadc35, (q31_t)0x88d5bddb, + (q31_t)0x2eb502ae, (q31_t)0x88d372c6, (q31_t)0x2eaf290a, (q31_t)0x88d127fb, (q31_t)0x2ea94f49, (q31_t)0x88cedd79, (q31_t)0x2ea3756b, (q31_t)0x88cc9340, + (q31_t)0x2e9d9b70, (q31_t)0x88ca4951, (q31_t)0x2e97c159, (q31_t)0x88c7ffac, (q31_t)0x2e91e725, (q31_t)0x88c5b650, (q31_t)0x2e8c0cd4, (q31_t)0x88c36d3e, + (q31_t)0x2e863267, (q31_t)0x88c12475, (q31_t)0x2e8057dd, (q31_t)0x88bedbf6, (q31_t)0x2e7a7d36, (q31_t)0x88bc93c0, (q31_t)0x2e74a272, (q31_t)0x88ba4bd4, + (q31_t)0x2e6ec792, (q31_t)0x88b80432, (q31_t)0x2e68ec95, (q31_t)0x88b5bcd9, (q31_t)0x2e63117c, (q31_t)0x88b375ca, (q31_t)0x2e5d3646, (q31_t)0x88b12f04, + (q31_t)0x2e575af3, (q31_t)0x88aee888, (q31_t)0x2e517f84, (q31_t)0x88aca255, (q31_t)0x2e4ba3f8, (q31_t)0x88aa5c6c, (q31_t)0x2e45c850, (q31_t)0x88a816cd, + (q31_t)0x2e3fec8b, (q31_t)0x88a5d177, (q31_t)0x2e3a10aa, (q31_t)0x88a38c6b, (q31_t)0x2e3434ac, (q31_t)0x88a147a9, (q31_t)0x2e2e5891, (q31_t)0x889f0330, + (q31_t)0x2e287c5a, (q31_t)0x889cbf01, (q31_t)0x2e22a007, (q31_t)0x889a7b1b, (q31_t)0x2e1cc397, (q31_t)0x88983780, (q31_t)0x2e16e70b, (q31_t)0x8895f42d, + (q31_t)0x2e110a62, (q31_t)0x8893b125, (q31_t)0x2e0b2d9d, (q31_t)0x88916e66, (q31_t)0x2e0550bb, (q31_t)0x888f2bf1, (q31_t)0x2dff73bd, (q31_t)0x888ce9c5, + (q31_t)0x2df996a3, (q31_t)0x888aa7e3, (q31_t)0x2df3b96c, (q31_t)0x8888664b, (q31_t)0x2deddc19, (q31_t)0x888624fd, (q31_t)0x2de7feaa, (q31_t)0x8883e3f8, + (q31_t)0x2de2211e, (q31_t)0x8881a33d, (q31_t)0x2ddc4376, (q31_t)0x887f62cb, (q31_t)0x2dd665b2, (q31_t)0x887d22a4, (q31_t)0x2dd087d1, (q31_t)0x887ae2c6, + (q31_t)0x2dcaa9d5, (q31_t)0x8878a332, (q31_t)0x2dc4cbbc, (q31_t)0x887663e7, (q31_t)0x2dbeed86, (q31_t)0x887424e7, (q31_t)0x2db90f35, (q31_t)0x8871e630, + (q31_t)0x2db330c7, (q31_t)0x886fa7c2, (q31_t)0x2dad523d, (q31_t)0x886d699f, (q31_t)0x2da77397, (q31_t)0x886b2bc5, (q31_t)0x2da194d5, (q31_t)0x8868ee35, + (q31_t)0x2d9bb5f6, (q31_t)0x8866b0ef, (q31_t)0x2d95d6fc, (q31_t)0x886473f2, (q31_t)0x2d8ff7e5, (q31_t)0x88623740, (q31_t)0x2d8a18b3, (q31_t)0x885ffad7, + (q31_t)0x2d843964, (q31_t)0x885dbeb8, (q31_t)0x2d7e59f9, (q31_t)0x885b82e3, (q31_t)0x2d787a72, (q31_t)0x88594757, (q31_t)0x2d729acf, (q31_t)0x88570c16, + (q31_t)0x2d6cbb10, (q31_t)0x8854d11e, (q31_t)0x2d66db35, (q31_t)0x88529670, (q31_t)0x2d60fb3e, (q31_t)0x88505c0b, (q31_t)0x2d5b1b2b, (q31_t)0x884e21f1, + (q31_t)0x2d553afc, (q31_t)0x884be821, (q31_t)0x2d4f5ab1, (q31_t)0x8849ae9a, (q31_t)0x2d497a4a, (q31_t)0x8847755d, (q31_t)0x2d4399c7, (q31_t)0x88453c6a, + (q31_t)0x2d3db928, (q31_t)0x884303c1, (q31_t)0x2d37d86d, (q31_t)0x8840cb61, (q31_t)0x2d31f797, (q31_t)0x883e934c, (q31_t)0x2d2c16a4, (q31_t)0x883c5b81, + (q31_t)0x2d263596, (q31_t)0x883a23ff, (q31_t)0x2d20546b, (q31_t)0x8837ecc7, (q31_t)0x2d1a7325, (q31_t)0x8835b5d9, (q31_t)0x2d1491c4, (q31_t)0x88337f35, + (q31_t)0x2d0eb046, (q31_t)0x883148db, (q31_t)0x2d08ceac, (q31_t)0x882f12cb, (q31_t)0x2d02ecf7, (q31_t)0x882cdd04, (q31_t)0x2cfd0b26, (q31_t)0x882aa788, + (q31_t)0x2cf72939, (q31_t)0x88287256, (q31_t)0x2cf14731, (q31_t)0x88263d6d, (q31_t)0x2ceb650d, (q31_t)0x882408ce, (q31_t)0x2ce582cd, (q31_t)0x8821d47a, + (q31_t)0x2cdfa071, (q31_t)0x881fa06f, (q31_t)0x2cd9bdfa, (q31_t)0x881d6cae, (q31_t)0x2cd3db67, (q31_t)0x881b3937, (q31_t)0x2ccdf8b8, (q31_t)0x8819060a, + (q31_t)0x2cc815ee, (q31_t)0x8816d327, (q31_t)0x2cc23308, (q31_t)0x8814a08f, (q31_t)0x2cbc5006, (q31_t)0x88126e40, (q31_t)0x2cb66ce9, (q31_t)0x88103c3b, + (q31_t)0x2cb089b1, (q31_t)0x880e0a7f, (q31_t)0x2caaa65c, (q31_t)0x880bd90e, (q31_t)0x2ca4c2ed, (q31_t)0x8809a7e7, (q31_t)0x2c9edf61, (q31_t)0x8807770a, + (q31_t)0x2c98fbba, (q31_t)0x88054677, (q31_t)0x2c9317f8, (q31_t)0x8803162e, (q31_t)0x2c8d341a, (q31_t)0x8800e62f, (q31_t)0x2c875021, (q31_t)0x87feb67a, + (q31_t)0x2c816c0c, (q31_t)0x87fc870f, (q31_t)0x2c7b87dc, (q31_t)0x87fa57ee, (q31_t)0x2c75a390, (q31_t)0x87f82917, (q31_t)0x2c6fbf29, (q31_t)0x87f5fa8b, + (q31_t)0x2c69daa6, (q31_t)0x87f3cc48, (q31_t)0x2c63f609, (q31_t)0x87f19e4f, (q31_t)0x2c5e114f, (q31_t)0x87ef70a0, (q31_t)0x2c582c7b, (q31_t)0x87ed433c, + (q31_t)0x2c52478a, (q31_t)0x87eb1621, (q31_t)0x2c4c627f, (q31_t)0x87e8e950, (q31_t)0x2c467d58, (q31_t)0x87e6bcca, (q31_t)0x2c409816, (q31_t)0x87e4908e, + (q31_t)0x2c3ab2b9, (q31_t)0x87e2649b, (q31_t)0x2c34cd40, (q31_t)0x87e038f3, (q31_t)0x2c2ee7ad, (q31_t)0x87de0d95, (q31_t)0x2c2901fd, (q31_t)0x87dbe281, + (q31_t)0x2c231c33, (q31_t)0x87d9b7b7, (q31_t)0x2c1d364e, (q31_t)0x87d78d38, (q31_t)0x2c17504d, (q31_t)0x87d56302, (q31_t)0x2c116a31, (q31_t)0x87d33916, + (q31_t)0x2c0b83fa, (q31_t)0x87d10f75, (q31_t)0x2c059da7, (q31_t)0x87cee61e, (q31_t)0x2bffb73a, (q31_t)0x87ccbd11, (q31_t)0x2bf9d0b1, (q31_t)0x87ca944e, + (q31_t)0x2bf3ea0d, (q31_t)0x87c86bd5, (q31_t)0x2bee034e, (q31_t)0x87c643a6, (q31_t)0x2be81c74, (q31_t)0x87c41bc2, (q31_t)0x2be2357f, (q31_t)0x87c1f427, + (q31_t)0x2bdc4e6f, (q31_t)0x87bfccd7, (q31_t)0x2bd66744, (q31_t)0x87bda5d1, (q31_t)0x2bd07ffe, (q31_t)0x87bb7f16, (q31_t)0x2bca989d, (q31_t)0x87b958a4, + (q31_t)0x2bc4b120, (q31_t)0x87b7327d, (q31_t)0x2bbec989, (q31_t)0x87b50c9f, (q31_t)0x2bb8e1d7, (q31_t)0x87b2e70c, (q31_t)0x2bb2fa0a, (q31_t)0x87b0c1c4, + (q31_t)0x2bad1221, (q31_t)0x87ae9cc5, (q31_t)0x2ba72a1e, (q31_t)0x87ac7811, (q31_t)0x2ba14200, (q31_t)0x87aa53a6, (q31_t)0x2b9b59c7, (q31_t)0x87a82f87, + (q31_t)0x2b957173, (q31_t)0x87a60bb1, (q31_t)0x2b8f8905, (q31_t)0x87a3e825, (q31_t)0x2b89a07b, (q31_t)0x87a1c4e4, (q31_t)0x2b83b7d7, (q31_t)0x879fa1ed, + (q31_t)0x2b7dcf17, (q31_t)0x879d7f41, (q31_t)0x2b77e63d, (q31_t)0x879b5cde, (q31_t)0x2b71fd48, (q31_t)0x87993ac6, (q31_t)0x2b6c1438, (q31_t)0x879718f8, + (q31_t)0x2b662b0e, (q31_t)0x8794f774, (q31_t)0x2b6041c9, (q31_t)0x8792d63b, (q31_t)0x2b5a5868, (q31_t)0x8790b54c, (q31_t)0x2b546eee, (q31_t)0x878e94a7, + (q31_t)0x2b4e8558, (q31_t)0x878c744d, (q31_t)0x2b489ba8, (q31_t)0x878a543d, (q31_t)0x2b42b1dd, (q31_t)0x87883477, (q31_t)0x2b3cc7f7, (q31_t)0x878614fb, + (q31_t)0x2b36ddf7, (q31_t)0x8783f5ca, (q31_t)0x2b30f3dc, (q31_t)0x8781d6e3, (q31_t)0x2b2b09a6, (q31_t)0x877fb846, (q31_t)0x2b251f56, (q31_t)0x877d99f4, + (q31_t)0x2b1f34eb, (q31_t)0x877b7bec, (q31_t)0x2b194a66, (q31_t)0x87795e2f, (q31_t)0x2b135fc6, (q31_t)0x877740bb, (q31_t)0x2b0d750b, (q31_t)0x87752392, + (q31_t)0x2b078a36, (q31_t)0x877306b4, (q31_t)0x2b019f46, (q31_t)0x8770ea20, (q31_t)0x2afbb43c, (q31_t)0x876ecdd6, (q31_t)0x2af5c917, (q31_t)0x876cb1d6, + (q31_t)0x2aefddd8, (q31_t)0x876a9621, (q31_t)0x2ae9f27e, (q31_t)0x87687ab7, (q31_t)0x2ae4070a, (q31_t)0x87665f96, (q31_t)0x2ade1b7c, (q31_t)0x876444c1, + (q31_t)0x2ad82fd2, (q31_t)0x87622a35, (q31_t)0x2ad2440f, (q31_t)0x87600ff4, (q31_t)0x2acc5831, (q31_t)0x875df5fd, (q31_t)0x2ac66c39, (q31_t)0x875bdc51, + (q31_t)0x2ac08026, (q31_t)0x8759c2ef, (q31_t)0x2aba93f9, (q31_t)0x8757a9d8, (q31_t)0x2ab4a7b1, (q31_t)0x8755910b, (q31_t)0x2aaebb50, (q31_t)0x87537888, + (q31_t)0x2aa8ced3, (q31_t)0x87516050, (q31_t)0x2aa2e23d, (q31_t)0x874f4862, (q31_t)0x2a9cf58c, (q31_t)0x874d30bf, (q31_t)0x2a9708c1, (q31_t)0x874b1966, + (q31_t)0x2a911bdc, (q31_t)0x87490258, (q31_t)0x2a8b2edc, (q31_t)0x8746eb94, (q31_t)0x2a8541c3, (q31_t)0x8744d51b, (q31_t)0x2a7f548e, (q31_t)0x8742beec, + (q31_t)0x2a796740, (q31_t)0x8740a907, (q31_t)0x2a7379d8, (q31_t)0x873e936d, (q31_t)0x2a6d8c55, (q31_t)0x873c7e1e, (q31_t)0x2a679eb8, (q31_t)0x873a6919, + (q31_t)0x2a61b101, (q31_t)0x8738545e, (q31_t)0x2a5bc330, (q31_t)0x87363fee, (q31_t)0x2a55d545, (q31_t)0x87342bc9, (q31_t)0x2a4fe740, (q31_t)0x873217ee, + (q31_t)0x2a49f920, (q31_t)0x8730045d, (q31_t)0x2a440ae7, (q31_t)0x872df117, (q31_t)0x2a3e1c93, (q31_t)0x872bde1c, (q31_t)0x2a382e25, (q31_t)0x8729cb6b, + (q31_t)0x2a323f9e, (q31_t)0x8727b905, (q31_t)0x2a2c50fc, (q31_t)0x8725a6e9, (q31_t)0x2a266240, (q31_t)0x87239518, (q31_t)0x2a20736a, (q31_t)0x87218391, + (q31_t)0x2a1a847b, (q31_t)0x871f7255, (q31_t)0x2a149571, (q31_t)0x871d6163, (q31_t)0x2a0ea64d, (q31_t)0x871b50bc, (q31_t)0x2a08b710, (q31_t)0x87194060, + (q31_t)0x2a02c7b8, (q31_t)0x8717304e, (q31_t)0x29fcd847, (q31_t)0x87152087, (q31_t)0x29f6e8bb, (q31_t)0x8713110a, (q31_t)0x29f0f916, (q31_t)0x871101d8, + (q31_t)0x29eb0957, (q31_t)0x870ef2f1, (q31_t)0x29e5197e, (q31_t)0x870ce454, (q31_t)0x29df298b, (q31_t)0x870ad602, (q31_t)0x29d9397f, (q31_t)0x8708c7fa, + (q31_t)0x29d34958, (q31_t)0x8706ba3d, (q31_t)0x29cd5918, (q31_t)0x8704acca, (q31_t)0x29c768be, (q31_t)0x87029fa3, (q31_t)0x29c1784a, (q31_t)0x870092c5, + (q31_t)0x29bb87bc, (q31_t)0x86fe8633, (q31_t)0x29b59715, (q31_t)0x86fc79eb, (q31_t)0x29afa654, (q31_t)0x86fa6dee, (q31_t)0x29a9b579, (q31_t)0x86f8623b, + (q31_t)0x29a3c485, (q31_t)0x86f656d3, (q31_t)0x299dd377, (q31_t)0x86f44bb6, (q31_t)0x2997e24f, (q31_t)0x86f240e3, (q31_t)0x2991f10e, (q31_t)0x86f0365c, + (q31_t)0x298bffb2, (q31_t)0x86ee2c1e, (q31_t)0x29860e3e, (q31_t)0x86ec222c, (q31_t)0x29801caf, (q31_t)0x86ea1884, (q31_t)0x297a2b07, (q31_t)0x86e80f27, + (q31_t)0x29743946, (q31_t)0x86e60614, (q31_t)0x296e476b, (q31_t)0x86e3fd4c, (q31_t)0x29685576, (q31_t)0x86e1f4cf, (q31_t)0x29626368, (q31_t)0x86dfec9d, + (q31_t)0x295c7140, (q31_t)0x86dde4b5, (q31_t)0x29567eff, (q31_t)0x86dbdd18, (q31_t)0x29508ca4, (q31_t)0x86d9d5c6, (q31_t)0x294a9a30, (q31_t)0x86d7cebf, + (q31_t)0x2944a7a2, (q31_t)0x86d5c802, (q31_t)0x293eb4fb, (q31_t)0x86d3c190, (q31_t)0x2938c23a, (q31_t)0x86d1bb69, (q31_t)0x2932cf60, (q31_t)0x86cfb58c, + (q31_t)0x292cdc6d, (q31_t)0x86cdaffa, (q31_t)0x2926e960, (q31_t)0x86cbaab3, (q31_t)0x2920f63a, (q31_t)0x86c9a5b7, (q31_t)0x291b02fa, (q31_t)0x86c7a106, + (q31_t)0x29150fa1, (q31_t)0x86c59c9f, (q31_t)0x290f1c2f, (q31_t)0x86c39883, (q31_t)0x290928a3, (q31_t)0x86c194b2, (q31_t)0x290334ff, (q31_t)0x86bf912c, + (q31_t)0x28fd4140, (q31_t)0x86bd8df0, (q31_t)0x28f74d69, (q31_t)0x86bb8b00, (q31_t)0x28f15978, (q31_t)0x86b9885a, (q31_t)0x28eb656e, (q31_t)0x86b785ff, + (q31_t)0x28e5714b, (q31_t)0x86b583ee, (q31_t)0x28df7d0e, (q31_t)0x86b38229, (q31_t)0x28d988b8, (q31_t)0x86b180ae, (q31_t)0x28d3944a, (q31_t)0x86af7f7e, + (q31_t)0x28cd9fc1, (q31_t)0x86ad7e99, (q31_t)0x28c7ab20, (q31_t)0x86ab7dff, (q31_t)0x28c1b666, (q31_t)0x86a97db0, (q31_t)0x28bbc192, (q31_t)0x86a77dab, + (q31_t)0x28b5cca5, (q31_t)0x86a57df2, (q31_t)0x28afd7a0, (q31_t)0x86a37e83, (q31_t)0x28a9e281, (q31_t)0x86a17f5f, (q31_t)0x28a3ed49, (q31_t)0x869f8086, + (q31_t)0x289df7f8, (q31_t)0x869d81f8, (q31_t)0x2898028e, (q31_t)0x869b83b4, (q31_t)0x28920d0a, (q31_t)0x869985bc, (q31_t)0x288c176e, (q31_t)0x8697880f, + (q31_t)0x288621b9, (q31_t)0x86958aac, (q31_t)0x28802beb, (q31_t)0x86938d94, (q31_t)0x287a3604, (q31_t)0x869190c7, (q31_t)0x28744004, (q31_t)0x868f9445, + (q31_t)0x286e49ea, (q31_t)0x868d980e, (q31_t)0x286853b8, (q31_t)0x868b9c22, (q31_t)0x28625d6d, (q31_t)0x8689a081, (q31_t)0x285c670a, (q31_t)0x8687a52b, + (q31_t)0x2856708d, (q31_t)0x8685aa20, (q31_t)0x285079f7, (q31_t)0x8683af5f, (q31_t)0x284a8349, (q31_t)0x8681b4ea, (q31_t)0x28448c81, (q31_t)0x867fbabf, + (q31_t)0x283e95a1, (q31_t)0x867dc0e0, (q31_t)0x28389ea8, (q31_t)0x867bc74b, (q31_t)0x2832a796, (q31_t)0x8679ce01, (q31_t)0x282cb06c, (q31_t)0x8677d503, + (q31_t)0x2826b928, (q31_t)0x8675dc4f, (q31_t)0x2820c1cc, (q31_t)0x8673e3e6, (q31_t)0x281aca57, (q31_t)0x8671ebc8, (q31_t)0x2814d2c9, (q31_t)0x866ff3f6, + (q31_t)0x280edb23, (q31_t)0x866dfc6e, (q31_t)0x2808e364, (q31_t)0x866c0531, (q31_t)0x2802eb8c, (q31_t)0x866a0e3f, (q31_t)0x27fcf39c, (q31_t)0x86681798, + (q31_t)0x27f6fb92, (q31_t)0x8666213c, (q31_t)0x27f10371, (q31_t)0x86642b2c, (q31_t)0x27eb0b36, (q31_t)0x86623566, (q31_t)0x27e512e3, (q31_t)0x86603feb, + (q31_t)0x27df1a77, (q31_t)0x865e4abb, (q31_t)0x27d921f3, (q31_t)0x865c55d7, (q31_t)0x27d32956, (q31_t)0x865a613d, (q31_t)0x27cd30a1, (q31_t)0x86586cee, + (q31_t)0x27c737d3, (q31_t)0x865678eb, (q31_t)0x27c13eec, (q31_t)0x86548532, (q31_t)0x27bb45ed, (q31_t)0x865291c4, (q31_t)0x27b54cd6, (q31_t)0x86509ea2, + (q31_t)0x27af53a6, (q31_t)0x864eabcb, (q31_t)0x27a95a5d, (q31_t)0x864cb93e, (q31_t)0x27a360fc, (q31_t)0x864ac6fd, (q31_t)0x279d6783, (q31_t)0x8648d507, + (q31_t)0x27976df1, (q31_t)0x8646e35c, (q31_t)0x27917447, (q31_t)0x8644f1fc, (q31_t)0x278b7a84, (q31_t)0x864300e7, (q31_t)0x278580a9, (q31_t)0x8641101d, + (q31_t)0x277f86b5, (q31_t)0x863f1f9e, (q31_t)0x27798caa, (q31_t)0x863d2f6b, (q31_t)0x27739285, (q31_t)0x863b3f82, (q31_t)0x276d9849, (q31_t)0x86394fe5, + (q31_t)0x27679df4, (q31_t)0x86376092, (q31_t)0x2761a387, (q31_t)0x8635718b, (q31_t)0x275ba901, (q31_t)0x863382cf, (q31_t)0x2755ae64, (q31_t)0x8631945e, + (q31_t)0x274fb3ae, (q31_t)0x862fa638, (q31_t)0x2749b8e0, (q31_t)0x862db85e, (q31_t)0x2743bdf9, (q31_t)0x862bcace, (q31_t)0x273dc2fa, (q31_t)0x8629dd8a, + (q31_t)0x2737c7e3, (q31_t)0x8627f091, (q31_t)0x2731ccb4, (q31_t)0x862603e3, (q31_t)0x272bd16d, (q31_t)0x86241780, (q31_t)0x2725d60e, (q31_t)0x86222b68, + (q31_t)0x271fda96, (q31_t)0x86203f9c, (q31_t)0x2719df06, (q31_t)0x861e541a, (q31_t)0x2713e35f, (q31_t)0x861c68e4, (q31_t)0x270de79f, (q31_t)0x861a7df9, + (q31_t)0x2707ebc7, (q31_t)0x86189359, (q31_t)0x2701efd7, (q31_t)0x8616a905, (q31_t)0x26fbf3ce, (q31_t)0x8614befb, (q31_t)0x26f5f7ae, (q31_t)0x8612d53d, + (q31_t)0x26effb76, (q31_t)0x8610ebca, (q31_t)0x26e9ff26, (q31_t)0x860f02a3, (q31_t)0x26e402bd, (q31_t)0x860d19c6, (q31_t)0x26de063d, (q31_t)0x860b3135, + (q31_t)0x26d809a5, (q31_t)0x860948ef, (q31_t)0x26d20cf5, (q31_t)0x860760f4, (q31_t)0x26cc102d, (q31_t)0x86057944, (q31_t)0x26c6134d, (q31_t)0x860391e0, + (q31_t)0x26c01655, (q31_t)0x8601aac7, (q31_t)0x26ba1945, (q31_t)0x85ffc3f9, (q31_t)0x26b41c1d, (q31_t)0x85fddd76, (q31_t)0x26ae1edd, (q31_t)0x85fbf73f, + (q31_t)0x26a82186, (q31_t)0x85fa1153, (q31_t)0x26a22416, (q31_t)0x85f82bb2, (q31_t)0x269c268f, (q31_t)0x85f6465c, (q31_t)0x269628f0, (q31_t)0x85f46152, + (q31_t)0x26902b39, (q31_t)0x85f27c93, (q31_t)0x268a2d6b, (q31_t)0x85f09820, (q31_t)0x26842f84, (q31_t)0x85eeb3f7, (q31_t)0x267e3186, (q31_t)0x85ecd01a, + (q31_t)0x26783370, (q31_t)0x85eaec88, (q31_t)0x26723543, (q31_t)0x85e90942, (q31_t)0x266c36fe, (q31_t)0x85e72647, (q31_t)0x266638a1, (q31_t)0x85e54397, + (q31_t)0x26603a2c, (q31_t)0x85e36132, (q31_t)0x265a3b9f, (q31_t)0x85e17f19, (q31_t)0x26543cfb, (q31_t)0x85df9d4b, (q31_t)0x264e3e40, (q31_t)0x85ddbbc9, + (q31_t)0x26483f6c, (q31_t)0x85dbda91, (q31_t)0x26424082, (q31_t)0x85d9f9a5, (q31_t)0x263c417f, (q31_t)0x85d81905, (q31_t)0x26364265, (q31_t)0x85d638b0, + (q31_t)0x26304333, (q31_t)0x85d458a6, (q31_t)0x262a43ea, (q31_t)0x85d278e7, (q31_t)0x26244489, (q31_t)0x85d09974, (q31_t)0x261e4511, (q31_t)0x85ceba4d, + (q31_t)0x26184581, (q31_t)0x85ccdb70, (q31_t)0x261245da, (q31_t)0x85cafcdf, (q31_t)0x260c461b, (q31_t)0x85c91e9a, (q31_t)0x26064645, (q31_t)0x85c740a0, + (q31_t)0x26004657, (q31_t)0x85c562f1, (q31_t)0x25fa4652, (q31_t)0x85c3858d, (q31_t)0x25f44635, (q31_t)0x85c1a875, (q31_t)0x25ee4601, (q31_t)0x85bfcba9, + (q31_t)0x25e845b6, (q31_t)0x85bdef28, (q31_t)0x25e24553, (q31_t)0x85bc12f2, (q31_t)0x25dc44d9, (q31_t)0x85ba3707, (q31_t)0x25d64447, (q31_t)0x85b85b68, + (q31_t)0x25d0439f, (q31_t)0x85b68015, (q31_t)0x25ca42de, (q31_t)0x85b4a50d, (q31_t)0x25c44207, (q31_t)0x85b2ca50, (q31_t)0x25be4118, (q31_t)0x85b0efdf, + (q31_t)0x25b84012, (q31_t)0x85af15b9, (q31_t)0x25b23ef5, (q31_t)0x85ad3bdf, (q31_t)0x25ac3dc0, (q31_t)0x85ab6250, (q31_t)0x25a63c74, (q31_t)0x85a9890d, + (q31_t)0x25a03b11, (q31_t)0x85a7b015, (q31_t)0x259a3997, (q31_t)0x85a5d768, (q31_t)0x25943806, (q31_t)0x85a3ff07, (q31_t)0x258e365d, (q31_t)0x85a226f2, + (q31_t)0x2588349d, (q31_t)0x85a04f28, (q31_t)0x258232c6, (q31_t)0x859e77a9, (q31_t)0x257c30d8, (q31_t)0x859ca076, (q31_t)0x25762ed3, (q31_t)0x859ac98f, + (q31_t)0x25702cb7, (q31_t)0x8598f2f3, (q31_t)0x256a2a83, (q31_t)0x85971ca2, (q31_t)0x25642839, (q31_t)0x8595469d, (q31_t)0x255e25d7, (q31_t)0x859370e4, + (q31_t)0x2558235f, (q31_t)0x85919b76, (q31_t)0x255220cf, (q31_t)0x858fc653, (q31_t)0x254c1e28, (q31_t)0x858df17c, (q31_t)0x25461b6b, (q31_t)0x858c1cf1, + (q31_t)0x25401896, (q31_t)0x858a48b1, (q31_t)0x253a15aa, (q31_t)0x858874bd, (q31_t)0x253412a8, (q31_t)0x8586a114, (q31_t)0x252e0f8e, (q31_t)0x8584cdb7, + (q31_t)0x25280c5e, (q31_t)0x8582faa5, (q31_t)0x25220916, (q31_t)0x858127df, (q31_t)0x251c05b8, (q31_t)0x857f5564, (q31_t)0x25160243, (q31_t)0x857d8335, + (q31_t)0x250ffeb7, (q31_t)0x857bb152, (q31_t)0x2509fb14, (q31_t)0x8579dfba, (q31_t)0x2503f75a, (q31_t)0x85780e6e, (q31_t)0x24fdf389, (q31_t)0x85763d6d, + (q31_t)0x24f7efa2, (q31_t)0x85746cb8, (q31_t)0x24f1eba4, (q31_t)0x85729c4e, (q31_t)0x24ebe78f, (q31_t)0x8570cc30, (q31_t)0x24e5e363, (q31_t)0x856efc5e, + (q31_t)0x24dfdf20, (q31_t)0x856d2cd7, (q31_t)0x24d9dac7, (q31_t)0x856b5d9c, (q31_t)0x24d3d657, (q31_t)0x85698ead, (q31_t)0x24cdd1d0, (q31_t)0x8567c009, + (q31_t)0x24c7cd33, (q31_t)0x8565f1b0, (q31_t)0x24c1c87f, (q31_t)0x856423a4, (q31_t)0x24bbc3b4, (q31_t)0x856255e3, (q31_t)0x24b5bed2, (q31_t)0x8560886d, + (q31_t)0x24afb9da, (q31_t)0x855ebb44, (q31_t)0x24a9b4cb, (q31_t)0x855cee66, (q31_t)0x24a3afa6, (q31_t)0x855b21d3, (q31_t)0x249daa6a, (q31_t)0x8559558c, + (q31_t)0x2497a517, (q31_t)0x85578991, (q31_t)0x24919fae, (q31_t)0x8555bde2, (q31_t)0x248b9a2f, (q31_t)0x8553f27e, (q31_t)0x24859498, (q31_t)0x85522766, + (q31_t)0x247f8eec, (q31_t)0x85505c99, (q31_t)0x24798928, (q31_t)0x854e9219, (q31_t)0x2473834f, (q31_t)0x854cc7e3, (q31_t)0x246d7d5e, (q31_t)0x854afdfa, + (q31_t)0x24677758, (q31_t)0x8549345c, (q31_t)0x2461713a, (q31_t)0x85476b0a, (q31_t)0x245b6b07, (q31_t)0x8545a204, (q31_t)0x245564bd, (q31_t)0x8543d949, + (q31_t)0x244f5e5c, (q31_t)0x854210db, (q31_t)0x244957e5, (q31_t)0x854048b7, (q31_t)0x24435158, (q31_t)0x853e80e0, (q31_t)0x243d4ab4, (q31_t)0x853cb954, + (q31_t)0x243743fa, (q31_t)0x853af214, (q31_t)0x24313d2a, (q31_t)0x85392b20, (q31_t)0x242b3644, (q31_t)0x85376477, (q31_t)0x24252f47, (q31_t)0x85359e1a, + (q31_t)0x241f2833, (q31_t)0x8533d809, (q31_t)0x2419210a, (q31_t)0x85321244, (q31_t)0x241319ca, (q31_t)0x85304cca, (q31_t)0x240d1274, (q31_t)0x852e879d, + (q31_t)0x24070b08, (q31_t)0x852cc2bb, (q31_t)0x24010385, (q31_t)0x852afe24, (q31_t)0x23fafbec, (q31_t)0x852939da, (q31_t)0x23f4f43e, (q31_t)0x852775db, + (q31_t)0x23eeec78, (q31_t)0x8525b228, (q31_t)0x23e8e49d, (q31_t)0x8523eec1, (q31_t)0x23e2dcac, (q31_t)0x85222ba5, (q31_t)0x23dcd4a4, (q31_t)0x852068d6, + (q31_t)0x23d6cc87, (q31_t)0x851ea652, (q31_t)0x23d0c453, (q31_t)0x851ce41a, (q31_t)0x23cabc09, (q31_t)0x851b222e, (q31_t)0x23c4b3a9, (q31_t)0x8519608d, + (q31_t)0x23beab33, (q31_t)0x85179f39, (q31_t)0x23b8a2a7, (q31_t)0x8515de30, (q31_t)0x23b29a05, (q31_t)0x85141d73, (q31_t)0x23ac914d, (q31_t)0x85125d02, + (q31_t)0x23a6887f, (q31_t)0x85109cdd, (q31_t)0x23a07f9a, (q31_t)0x850edd03, (q31_t)0x239a76a0, (q31_t)0x850d1d75, (q31_t)0x23946d90, (q31_t)0x850b5e34, + (q31_t)0x238e646a, (q31_t)0x85099f3e, (q31_t)0x23885b2e, (q31_t)0x8507e094, (q31_t)0x238251dd, (q31_t)0x85062235, (q31_t)0x237c4875, (q31_t)0x85046423, + (q31_t)0x23763ef7, (q31_t)0x8502a65c, (q31_t)0x23703564, (q31_t)0x8500e8e2, (q31_t)0x236a2bba, (q31_t)0x84ff2bb3, (q31_t)0x236421fb, (q31_t)0x84fd6ed0, + (q31_t)0x235e1826, (q31_t)0x84fbb239, (q31_t)0x23580e3b, (q31_t)0x84f9f5ee, (q31_t)0x2352043b, (q31_t)0x84f839ee, (q31_t)0x234bfa24, (q31_t)0x84f67e3b, + (q31_t)0x2345eff8, (q31_t)0x84f4c2d4, (q31_t)0x233fe5b6, (q31_t)0x84f307b8, (q31_t)0x2339db5e, (q31_t)0x84f14ce8, (q31_t)0x2333d0f1, (q31_t)0x84ef9265, + (q31_t)0x232dc66d, (q31_t)0x84edd82d, (q31_t)0x2327bbd5, (q31_t)0x84ec1e41, (q31_t)0x2321b126, (q31_t)0x84ea64a1, (q31_t)0x231ba662, (q31_t)0x84e8ab4d, + (q31_t)0x23159b88, (q31_t)0x84e6f244, (q31_t)0x230f9098, (q31_t)0x84e53988, (q31_t)0x23098593, (q31_t)0x84e38118, (q31_t)0x23037a78, (q31_t)0x84e1c8f3, + (q31_t)0x22fd6f48, (q31_t)0x84e0111b, (q31_t)0x22f76402, (q31_t)0x84de598f, (q31_t)0x22f158a7, (q31_t)0x84dca24e, (q31_t)0x22eb4d36, (q31_t)0x84daeb5a, + (q31_t)0x22e541af, (q31_t)0x84d934b1, (q31_t)0x22df3613, (q31_t)0x84d77e54, (q31_t)0x22d92a61, (q31_t)0x84d5c844, (q31_t)0x22d31e9a, (q31_t)0x84d4127f, + (q31_t)0x22cd12bd, (q31_t)0x84d25d06, (q31_t)0x22c706cb, (q31_t)0x84d0a7da, (q31_t)0x22c0fac4, (q31_t)0x84cef2f9, (q31_t)0x22baeea7, (q31_t)0x84cd3e64, + (q31_t)0x22b4e274, (q31_t)0x84cb8a1b, (q31_t)0x22aed62c, (q31_t)0x84c9d61f, (q31_t)0x22a8c9cf, (q31_t)0x84c8226e, (q31_t)0x22a2bd5d, (q31_t)0x84c66f09, + (q31_t)0x229cb0d5, (q31_t)0x84c4bbf0, (q31_t)0x2296a437, (q31_t)0x84c30924, (q31_t)0x22909785, (q31_t)0x84c156a3, (q31_t)0x228a8abd, (q31_t)0x84bfa46e, + (q31_t)0x22847de0, (q31_t)0x84bdf286, (q31_t)0x227e70ed, (q31_t)0x84bc40e9, (q31_t)0x227863e5, (q31_t)0x84ba8f98, (q31_t)0x227256c8, (q31_t)0x84b8de94, + (q31_t)0x226c4996, (q31_t)0x84b72ddb, (q31_t)0x22663c4e, (q31_t)0x84b57d6f, (q31_t)0x22602ef1, (q31_t)0x84b3cd4f, (q31_t)0x225a217f, (q31_t)0x84b21d7a, + (q31_t)0x225413f8, (q31_t)0x84b06df2, (q31_t)0x224e065c, (q31_t)0x84aebeb6, (q31_t)0x2247f8aa, (q31_t)0x84ad0fc6, (q31_t)0x2241eae3, (q31_t)0x84ab6122, + (q31_t)0x223bdd08, (q31_t)0x84a9b2ca, (q31_t)0x2235cf17, (q31_t)0x84a804be, (q31_t)0x222fc111, (q31_t)0x84a656fe, (q31_t)0x2229b2f6, (q31_t)0x84a4a98a, + (q31_t)0x2223a4c5, (q31_t)0x84a2fc62, (q31_t)0x221d9680, (q31_t)0x84a14f87, (q31_t)0x22178826, (q31_t)0x849fa2f7, (q31_t)0x221179b7, (q31_t)0x849df6b4, + (q31_t)0x220b6b32, (q31_t)0x849c4abd, (q31_t)0x22055c99, (q31_t)0x849a9f12, (q31_t)0x21ff4dea, (q31_t)0x8498f3b3, (q31_t)0x21f93f27, (q31_t)0x849748a0, + (q31_t)0x21f3304f, (q31_t)0x84959dd9, (q31_t)0x21ed2162, (q31_t)0x8493f35e, (q31_t)0x21e71260, (q31_t)0x84924930, (q31_t)0x21e10349, (q31_t)0x84909f4e, + (q31_t)0x21daf41d, (q31_t)0x848ef5b7, (q31_t)0x21d4e4dc, (q31_t)0x848d4c6d, (q31_t)0x21ced586, (q31_t)0x848ba36f, (q31_t)0x21c8c61c, (q31_t)0x8489fabe, + (q31_t)0x21c2b69c, (q31_t)0x84885258, (q31_t)0x21bca708, (q31_t)0x8486aa3e, (q31_t)0x21b6975f, (q31_t)0x84850271, (q31_t)0x21b087a1, (q31_t)0x84835af0, + (q31_t)0x21aa77cf, (q31_t)0x8481b3bb, (q31_t)0x21a467e7, (q31_t)0x84800cd2, (q31_t)0x219e57eb, (q31_t)0x847e6636, (q31_t)0x219847da, (q31_t)0x847cbfe5, + (q31_t)0x219237b5, (q31_t)0x847b19e1, (q31_t)0x218c277a, (q31_t)0x84797429, (q31_t)0x2186172b, (q31_t)0x8477cebd, (q31_t)0x218006c8, (q31_t)0x8476299e, + (q31_t)0x2179f64f, (q31_t)0x847484ca, (q31_t)0x2173e5c2, (q31_t)0x8472e043, (q31_t)0x216dd521, (q31_t)0x84713c08, (q31_t)0x2167c46b, (q31_t)0x846f9819, + (q31_t)0x2161b3a0, (q31_t)0x846df477, (q31_t)0x215ba2c0, (q31_t)0x846c5120, (q31_t)0x215591cc, (q31_t)0x846aae16, (q31_t)0x214f80c4, (q31_t)0x84690b58, + (q31_t)0x21496fa7, (q31_t)0x846768e7, (q31_t)0x21435e75, (q31_t)0x8465c6c1, (q31_t)0x213d4d2f, (q31_t)0x846424e8, (q31_t)0x21373bd4, (q31_t)0x8462835b, + (q31_t)0x21312a65, (q31_t)0x8460e21a, (q31_t)0x212b18e1, (q31_t)0x845f4126, (q31_t)0x21250749, (q31_t)0x845da07e, (q31_t)0x211ef59d, (q31_t)0x845c0022, + (q31_t)0x2118e3dc, (q31_t)0x845a6012, (q31_t)0x2112d206, (q31_t)0x8458c04f, (q31_t)0x210cc01d, (q31_t)0x845720d8, (q31_t)0x2106ae1e, (q31_t)0x845581ad, + (q31_t)0x21009c0c, (q31_t)0x8453e2cf, (q31_t)0x20fa89e5, (q31_t)0x8452443d, (q31_t)0x20f477aa, (q31_t)0x8450a5f7, (q31_t)0x20ee655a, (q31_t)0x844f07fd, + (q31_t)0x20e852f6, (q31_t)0x844d6a50, (q31_t)0x20e2407e, (q31_t)0x844bccef, (q31_t)0x20dc2df2, (q31_t)0x844a2fda, (q31_t)0x20d61b51, (q31_t)0x84489311, + (q31_t)0x20d0089c, (q31_t)0x8446f695, (q31_t)0x20c9f5d3, (q31_t)0x84455a66, (q31_t)0x20c3e2f5, (q31_t)0x8443be82, (q31_t)0x20bdd003, (q31_t)0x844222eb, + (q31_t)0x20b7bcfe, (q31_t)0x844087a0, (q31_t)0x20b1a9e4, (q31_t)0x843eeca2, (q31_t)0x20ab96b5, (q31_t)0x843d51f0, (q31_t)0x20a58373, (q31_t)0x843bb78a, + (q31_t)0x209f701c, (q31_t)0x843a1d70, (q31_t)0x20995cb2, (q31_t)0x843883a3, (q31_t)0x20934933, (q31_t)0x8436ea23, (q31_t)0x208d35a0, (q31_t)0x843550ee, + (q31_t)0x208721f9, (q31_t)0x8433b806, (q31_t)0x20810e3e, (q31_t)0x84321f6b, (q31_t)0x207afa6f, (q31_t)0x8430871b, (q31_t)0x2074e68c, (q31_t)0x842eef18, + (q31_t)0x206ed295, (q31_t)0x842d5762, (q31_t)0x2068be8a, (q31_t)0x842bbff8, (q31_t)0x2062aa6b, (q31_t)0x842a28da, (q31_t)0x205c9638, (q31_t)0x84289209, + (q31_t)0x205681f1, (q31_t)0x8426fb84, (q31_t)0x20506d96, (q31_t)0x8425654b, (q31_t)0x204a5927, (q31_t)0x8423cf5f, (q31_t)0x204444a4, (q31_t)0x842239bf, + (q31_t)0x203e300d, (q31_t)0x8420a46c, (q31_t)0x20381b63, (q31_t)0x841f0f65, (q31_t)0x203206a4, (q31_t)0x841d7aaa, (q31_t)0x202bf1d2, (q31_t)0x841be63c, + (q31_t)0x2025dcec, (q31_t)0x841a521a, (q31_t)0x201fc7f2, (q31_t)0x8418be45, (q31_t)0x2019b2e4, (q31_t)0x84172abc, (q31_t)0x20139dc2, (q31_t)0x84159780, + (q31_t)0x200d888d, (q31_t)0x84140490, (q31_t)0x20077344, (q31_t)0x841271ec, (q31_t)0x20015de7, (q31_t)0x8410df95, (q31_t)0x1ffb4876, (q31_t)0x840f4d8a, + (q31_t)0x1ff532f2, (q31_t)0x840dbbcc, (q31_t)0x1fef1d59, (q31_t)0x840c2a5a, (q31_t)0x1fe907ae, (q31_t)0x840a9935, (q31_t)0x1fe2f1ee, (q31_t)0x8409085c, + (q31_t)0x1fdcdc1b, (q31_t)0x840777d0, (q31_t)0x1fd6c634, (q31_t)0x8405e790, (q31_t)0x1fd0b03a, (q31_t)0x8404579d, (q31_t)0x1fca9a2b, (q31_t)0x8402c7f6, + (q31_t)0x1fc4840a, (q31_t)0x8401389b, (q31_t)0x1fbe6dd4, (q31_t)0x83ffa98d, (q31_t)0x1fb8578b, (q31_t)0x83fe1acc, (q31_t)0x1fb2412f, (q31_t)0x83fc8c57, + (q31_t)0x1fac2abf, (q31_t)0x83fafe2e, (q31_t)0x1fa6143b, (q31_t)0x83f97052, (q31_t)0x1f9ffda4, (q31_t)0x83f7e2c3, (q31_t)0x1f99e6fa, (q31_t)0x83f65580, + (q31_t)0x1f93d03c, (q31_t)0x83f4c889, (q31_t)0x1f8db96a, (q31_t)0x83f33bdf, (q31_t)0x1f87a285, (q31_t)0x83f1af82, (q31_t)0x1f818b8d, (q31_t)0x83f02371, + (q31_t)0x1f7b7481, (q31_t)0x83ee97ad, (q31_t)0x1f755d61, (q31_t)0x83ed0c35, (q31_t)0x1f6f462f, (q31_t)0x83eb810a, (q31_t)0x1f692ee9, (q31_t)0x83e9f62b, + (q31_t)0x1f63178f, (q31_t)0x83e86b99, (q31_t)0x1f5d0022, (q31_t)0x83e6e153, (q31_t)0x1f56e8a2, (q31_t)0x83e5575a, (q31_t)0x1f50d10e, (q31_t)0x83e3cdad, + (q31_t)0x1f4ab968, (q31_t)0x83e2444d, (q31_t)0x1f44a1ad, (q31_t)0x83e0bb3a, (q31_t)0x1f3e89e0, (q31_t)0x83df3273, (q31_t)0x1f3871ff, (q31_t)0x83dda9f9, + (q31_t)0x1f325a0b, (q31_t)0x83dc21cb, (q31_t)0x1f2c4204, (q31_t)0x83da99ea, (q31_t)0x1f2629ea, (q31_t)0x83d91255, (q31_t)0x1f2011bc, (q31_t)0x83d78b0d, + (q31_t)0x1f19f97b, (q31_t)0x83d60412, (q31_t)0x1f13e127, (q31_t)0x83d47d63, (q31_t)0x1f0dc8c0, (q31_t)0x83d2f701, (q31_t)0x1f07b045, (q31_t)0x83d170eb, + (q31_t)0x1f0197b8, (q31_t)0x83cfeb22, (q31_t)0x1efb7f17, (q31_t)0x83ce65a6, (q31_t)0x1ef56664, (q31_t)0x83cce076, (q31_t)0x1eef4d9d, (q31_t)0x83cb5b93, + (q31_t)0x1ee934c3, (q31_t)0x83c9d6fc, (q31_t)0x1ee31bd6, (q31_t)0x83c852b2, (q31_t)0x1edd02d6, (q31_t)0x83c6ceb5, (q31_t)0x1ed6e9c3, (q31_t)0x83c54b04, + (q31_t)0x1ed0d09d, (q31_t)0x83c3c7a0, (q31_t)0x1ecab763, (q31_t)0x83c24488, (q31_t)0x1ec49e17, (q31_t)0x83c0c1be, (q31_t)0x1ebe84b8, (q31_t)0x83bf3f3f, + (q31_t)0x1eb86b46, (q31_t)0x83bdbd0e, (q31_t)0x1eb251c1, (q31_t)0x83bc3b29, (q31_t)0x1eac3829, (q31_t)0x83bab991, (q31_t)0x1ea61e7e, (q31_t)0x83b93845, + (q31_t)0x1ea004c1, (q31_t)0x83b7b746, (q31_t)0x1e99eaf0, (q31_t)0x83b63694, (q31_t)0x1e93d10c, (q31_t)0x83b4b62e, (q31_t)0x1e8db716, (q31_t)0x83b33616, + (q31_t)0x1e879d0d, (q31_t)0x83b1b649, (q31_t)0x1e8182f1, (q31_t)0x83b036ca, (q31_t)0x1e7b68c2, (q31_t)0x83aeb797, (q31_t)0x1e754e80, (q31_t)0x83ad38b1, + (q31_t)0x1e6f342c, (q31_t)0x83abba17, (q31_t)0x1e6919c4, (q31_t)0x83aa3bca, (q31_t)0x1e62ff4a, (q31_t)0x83a8bdca, (q31_t)0x1e5ce4be, (q31_t)0x83a74017, + (q31_t)0x1e56ca1e, (q31_t)0x83a5c2b0, (q31_t)0x1e50af6c, (q31_t)0x83a44596, (q31_t)0x1e4a94a7, (q31_t)0x83a2c8c9, (q31_t)0x1e4479cf, (q31_t)0x83a14c48, + (q31_t)0x1e3e5ee5, (q31_t)0x839fd014, (q31_t)0x1e3843e8, (q31_t)0x839e542d, (q31_t)0x1e3228d9, (q31_t)0x839cd893, (q31_t)0x1e2c0db6, (q31_t)0x839b5d45, + (q31_t)0x1e25f282, (q31_t)0x8399e244, (q31_t)0x1e1fd73a, (q31_t)0x83986790, (q31_t)0x1e19bbe0, (q31_t)0x8396ed29, (q31_t)0x1e13a074, (q31_t)0x8395730e, + (q31_t)0x1e0d84f5, (q31_t)0x8393f940, (q31_t)0x1e076963, (q31_t)0x83927fbf, (q31_t)0x1e014dbf, (q31_t)0x8391068a, (q31_t)0x1dfb3208, (q31_t)0x838f8da2, + (q31_t)0x1df5163f, (q31_t)0x838e1507, (q31_t)0x1deefa63, (q31_t)0x838c9cb9, (q31_t)0x1de8de75, (q31_t)0x838b24b8, (q31_t)0x1de2c275, (q31_t)0x8389ad03, + (q31_t)0x1ddca662, (q31_t)0x8388359b, (q31_t)0x1dd68a3c, (q31_t)0x8386be80, (q31_t)0x1dd06e04, (q31_t)0x838547b2, (q31_t)0x1dca51ba, (q31_t)0x8383d130, + (q31_t)0x1dc4355e, (q31_t)0x83825afb, (q31_t)0x1dbe18ef, (q31_t)0x8380e513, (q31_t)0x1db7fc6d, (q31_t)0x837f6f78, (q31_t)0x1db1dfda, (q31_t)0x837dfa2a, + (q31_t)0x1dabc334, (q31_t)0x837c8528, (q31_t)0x1da5a67c, (q31_t)0x837b1074, (q31_t)0x1d9f89b1, (q31_t)0x83799c0c, (q31_t)0x1d996cd4, (q31_t)0x837827f0, + (q31_t)0x1d934fe5, (q31_t)0x8376b422, (q31_t)0x1d8d32e4, (q31_t)0x837540a1, (q31_t)0x1d8715d0, (q31_t)0x8373cd6c, (q31_t)0x1d80f8ab, (q31_t)0x83725a84, + (q31_t)0x1d7adb73, (q31_t)0x8370e7e9, (q31_t)0x1d74be29, (q31_t)0x836f759b, (q31_t)0x1d6ea0cc, (q31_t)0x836e039a, (q31_t)0x1d68835e, (q31_t)0x836c91e5, + (q31_t)0x1d6265dd, (q31_t)0x836b207d, (q31_t)0x1d5c484b, (q31_t)0x8369af63, (q31_t)0x1d562aa6, (q31_t)0x83683e95, (q31_t)0x1d500cef, (q31_t)0x8366ce14, + (q31_t)0x1d49ef26, (q31_t)0x83655ddf, (q31_t)0x1d43d14b, (q31_t)0x8363edf8, (q31_t)0x1d3db35e, (q31_t)0x83627e5d, (q31_t)0x1d37955e, (q31_t)0x83610f10, + (q31_t)0x1d31774d, (q31_t)0x835fa00f, (q31_t)0x1d2b592a, (q31_t)0x835e315b, (q31_t)0x1d253af5, (q31_t)0x835cc2f4, (q31_t)0x1d1f1cae, (q31_t)0x835b54da, + (q31_t)0x1d18fe54, (q31_t)0x8359e70d, (q31_t)0x1d12dfe9, (q31_t)0x8358798c, (q31_t)0x1d0cc16c, (q31_t)0x83570c59, (q31_t)0x1d06a2dd, (q31_t)0x83559f72, + (q31_t)0x1d00843d, (q31_t)0x835432d8, (q31_t)0x1cfa658a, (q31_t)0x8352c68c, (q31_t)0x1cf446c5, (q31_t)0x83515a8c, (q31_t)0x1cee27ef, (q31_t)0x834feed9, + (q31_t)0x1ce80906, (q31_t)0x834e8373, (q31_t)0x1ce1ea0c, (q31_t)0x834d185a, (q31_t)0x1cdbcb00, (q31_t)0x834bad8e, (q31_t)0x1cd5abe3, (q31_t)0x834a430e, + (q31_t)0x1ccf8cb3, (q31_t)0x8348d8dc, (q31_t)0x1cc96d72, (q31_t)0x83476ef6, (q31_t)0x1cc34e1f, (q31_t)0x8346055e, (q31_t)0x1cbd2eba, (q31_t)0x83449c12, + (q31_t)0x1cb70f43, (q31_t)0x83433314, (q31_t)0x1cb0efbb, (q31_t)0x8341ca62, (q31_t)0x1caad021, (q31_t)0x834061fd, (q31_t)0x1ca4b075, (q31_t)0x833ef9e6, + (q31_t)0x1c9e90b8, (q31_t)0x833d921b, (q31_t)0x1c9870e9, (q31_t)0x833c2a9d, (q31_t)0x1c925109, (q31_t)0x833ac36c, (q31_t)0x1c8c3116, (q31_t)0x83395c88, + (q31_t)0x1c861113, (q31_t)0x8337f5f1, (q31_t)0x1c7ff0fd, (q31_t)0x83368fa7, (q31_t)0x1c79d0d6, (q31_t)0x833529aa, (q31_t)0x1c73b09d, (q31_t)0x8333c3fa, + (q31_t)0x1c6d9053, (q31_t)0x83325e97, (q31_t)0x1c676ff8, (q31_t)0x8330f981, (q31_t)0x1c614f8b, (q31_t)0x832f94b8, (q31_t)0x1c5b2f0c, (q31_t)0x832e303c, + (q31_t)0x1c550e7c, (q31_t)0x832ccc0d, (q31_t)0x1c4eedda, (q31_t)0x832b682b, (q31_t)0x1c48cd27, (q31_t)0x832a0496, (q31_t)0x1c42ac62, (q31_t)0x8328a14d, + (q31_t)0x1c3c8b8c, (q31_t)0x83273e52, (q31_t)0x1c366aa5, (q31_t)0x8325dba4, (q31_t)0x1c3049ac, (q31_t)0x83247943, (q31_t)0x1c2a28a2, (q31_t)0x8323172f, + (q31_t)0x1c240786, (q31_t)0x8321b568, (q31_t)0x1c1de659, (q31_t)0x832053ee, (q31_t)0x1c17c51b, (q31_t)0x831ef2c1, (q31_t)0x1c11a3cb, (q31_t)0x831d91e1, + (q31_t)0x1c0b826a, (q31_t)0x831c314e, (q31_t)0x1c0560f8, (q31_t)0x831ad109, (q31_t)0x1bff3f75, (q31_t)0x83197110, (q31_t)0x1bf91de0, (q31_t)0x83181164, + (q31_t)0x1bf2fc3a, (q31_t)0x8316b205, (q31_t)0x1becda83, (q31_t)0x831552f4, (q31_t)0x1be6b8ba, (q31_t)0x8313f42f, (q31_t)0x1be096e0, (q31_t)0x831295b7, + (q31_t)0x1bda74f6, (q31_t)0x8311378d, (q31_t)0x1bd452f9, (q31_t)0x830fd9af, (q31_t)0x1bce30ec, (q31_t)0x830e7c1f, (q31_t)0x1bc80ece, (q31_t)0x830d1edc, + (q31_t)0x1bc1ec9e, (q31_t)0x830bc1e6, (q31_t)0x1bbbca5e, (q31_t)0x830a653c, (q31_t)0x1bb5a80c, (q31_t)0x830908e0, (q31_t)0x1baf85a9, (q31_t)0x8307acd1, + (q31_t)0x1ba96335, (q31_t)0x83065110, (q31_t)0x1ba340b0, (q31_t)0x8304f59b, (q31_t)0x1b9d1e1a, (q31_t)0x83039a73, (q31_t)0x1b96fb73, (q31_t)0x83023f98, + (q31_t)0x1b90d8bb, (q31_t)0x8300e50b, (q31_t)0x1b8ab5f2, (q31_t)0x82ff8acb, (q31_t)0x1b849317, (q31_t)0x82fe30d7, (q31_t)0x1b7e702c, (q31_t)0x82fcd731, + (q31_t)0x1b784d30, (q31_t)0x82fb7dd8, (q31_t)0x1b722a23, (q31_t)0x82fa24cc, (q31_t)0x1b6c0705, (q31_t)0x82f8cc0d, (q31_t)0x1b65e3d7, (q31_t)0x82f7739c, + (q31_t)0x1b5fc097, (q31_t)0x82f61b77, (q31_t)0x1b599d46, (q31_t)0x82f4c3a0, (q31_t)0x1b5379e5, (q31_t)0x82f36c15, (q31_t)0x1b4d5672, (q31_t)0x82f214d8, + (q31_t)0x1b4732ef, (q31_t)0x82f0bde8, (q31_t)0x1b410f5b, (q31_t)0x82ef6745, (q31_t)0x1b3aebb6, (q31_t)0x82ee10ef, (q31_t)0x1b34c801, (q31_t)0x82ecbae7, + (q31_t)0x1b2ea43a, (q31_t)0x82eb652b, (q31_t)0x1b288063, (q31_t)0x82ea0fbd, (q31_t)0x1b225c7b, (q31_t)0x82e8ba9c, (q31_t)0x1b1c3883, (q31_t)0x82e765c8, + (q31_t)0x1b161479, (q31_t)0x82e61141, (q31_t)0x1b0ff05f, (q31_t)0x82e4bd07, (q31_t)0x1b09cc34, (q31_t)0x82e3691b, (q31_t)0x1b03a7f9, (q31_t)0x82e2157c, + (q31_t)0x1afd83ad, (q31_t)0x82e0c22a, (q31_t)0x1af75f50, (q31_t)0x82df6f25, (q31_t)0x1af13ae3, (q31_t)0x82de1c6d, (q31_t)0x1aeb1665, (q31_t)0x82dcca02, + (q31_t)0x1ae4f1d6, (q31_t)0x82db77e5, (q31_t)0x1adecd37, (q31_t)0x82da2615, (q31_t)0x1ad8a887, (q31_t)0x82d8d492, (q31_t)0x1ad283c7, (q31_t)0x82d7835c, + (q31_t)0x1acc5ef6, (q31_t)0x82d63274, (q31_t)0x1ac63a14, (q31_t)0x82d4e1d8, (q31_t)0x1ac01522, (q31_t)0x82d3918a, (q31_t)0x1ab9f020, (q31_t)0x82d24189, + (q31_t)0x1ab3cb0d, (q31_t)0x82d0f1d5, (q31_t)0x1aada5e9, (q31_t)0x82cfa26f, (q31_t)0x1aa780b6, (q31_t)0x82ce5356, (q31_t)0x1aa15b71, (q31_t)0x82cd048a, + (q31_t)0x1a9b361d, (q31_t)0x82cbb60b, (q31_t)0x1a9510b7, (q31_t)0x82ca67d9, (q31_t)0x1a8eeb42, (q31_t)0x82c919f5, (q31_t)0x1a88c5bc, (q31_t)0x82c7cc5e, + (q31_t)0x1a82a026, (q31_t)0x82c67f14, (q31_t)0x1a7c7a7f, (q31_t)0x82c53217, (q31_t)0x1a7654c8, (q31_t)0x82c3e568, (q31_t)0x1a702f01, (q31_t)0x82c29906, + (q31_t)0x1a6a0929, (q31_t)0x82c14cf1, (q31_t)0x1a63e341, (q31_t)0x82c00129, (q31_t)0x1a5dbd49, (q31_t)0x82beb5af, (q31_t)0x1a579741, (q31_t)0x82bd6a82, + (q31_t)0x1a517128, (q31_t)0x82bc1fa2, (q31_t)0x1a4b4aff, (q31_t)0x82bad50f, (q31_t)0x1a4524c6, (q31_t)0x82b98aca, (q31_t)0x1a3efe7c, (q31_t)0x82b840d2, + (q31_t)0x1a38d823, (q31_t)0x82b6f727, (q31_t)0x1a32b1b9, (q31_t)0x82b5adca, (q31_t)0x1a2c8b3f, (q31_t)0x82b464ba, (q31_t)0x1a2664b5, (q31_t)0x82b31bf7, + (q31_t)0x1a203e1b, (q31_t)0x82b1d381, (q31_t)0x1a1a1771, (q31_t)0x82b08b59, (q31_t)0x1a13f0b6, (q31_t)0x82af437e, (q31_t)0x1a0dc9ec, (q31_t)0x82adfbf0, + (q31_t)0x1a07a311, (q31_t)0x82acb4b0, (q31_t)0x1a017c27, (q31_t)0x82ab6dbd, (q31_t)0x19fb552c, (q31_t)0x82aa2717, (q31_t)0x19f52e22, (q31_t)0x82a8e0bf, + (q31_t)0x19ef0707, (q31_t)0x82a79ab3, (q31_t)0x19e8dfdc, (q31_t)0x82a654f6, (q31_t)0x19e2b8a2, (q31_t)0x82a50f85, (q31_t)0x19dc9157, (q31_t)0x82a3ca62, + (q31_t)0x19d669fc, (q31_t)0x82a2858c, (q31_t)0x19d04292, (q31_t)0x82a14104, (q31_t)0x19ca1b17, (q31_t)0x829ffcc8, (q31_t)0x19c3f38d, (q31_t)0x829eb8db, + (q31_t)0x19bdcbf3, (q31_t)0x829d753a, (q31_t)0x19b7a449, (q31_t)0x829c31e7, (q31_t)0x19b17c8f, (q31_t)0x829aeee1, (q31_t)0x19ab54c5, (q31_t)0x8299ac29, + (q31_t)0x19a52ceb, (q31_t)0x829869be, (q31_t)0x199f0502, (q31_t)0x829727a0, (q31_t)0x1998dd09, (q31_t)0x8295e5cf, (q31_t)0x1992b4ff, (q31_t)0x8294a44c, + (q31_t)0x198c8ce7, (q31_t)0x82936317, (q31_t)0x198664be, (q31_t)0x8292222e, (q31_t)0x19803c86, (q31_t)0x8290e194, (q31_t)0x197a143e, (q31_t)0x828fa146, + (q31_t)0x1973ebe6, (q31_t)0x828e6146, (q31_t)0x196dc37e, (q31_t)0x828d2193, (q31_t)0x19679b07, (q31_t)0x828be22e, (q31_t)0x19617280, (q31_t)0x828aa316, + (q31_t)0x195b49ea, (q31_t)0x8289644b, (q31_t)0x19552144, (q31_t)0x828825ce, (q31_t)0x194ef88e, (q31_t)0x8286e79e, (q31_t)0x1948cfc8, (q31_t)0x8285a9bb, + (q31_t)0x1942a6f3, (q31_t)0x82846c26, (q31_t)0x193c7e0f, (q31_t)0x82832edf, (q31_t)0x1936551b, (q31_t)0x8281f1e4, (q31_t)0x19302c17, (q31_t)0x8280b538, + (q31_t)0x192a0304, (q31_t)0x827f78d8, (q31_t)0x1923d9e1, (q31_t)0x827e3cc6, (q31_t)0x191db0af, (q31_t)0x827d0102, (q31_t)0x1917876d, (q31_t)0x827bc58a, + (q31_t)0x19115e1c, (q31_t)0x827a8a61, (q31_t)0x190b34bb, (q31_t)0x82794f84, (q31_t)0x19050b4b, (q31_t)0x827814f6, (q31_t)0x18fee1cb, (q31_t)0x8276dab4, + (q31_t)0x18f8b83c, (q31_t)0x8275a0c0, (q31_t)0x18f28e9e, (q31_t)0x8274671a, (q31_t)0x18ec64f0, (q31_t)0x82732dc0, (q31_t)0x18e63b33, (q31_t)0x8271f4b5, + (q31_t)0x18e01167, (q31_t)0x8270bbf7, (q31_t)0x18d9e78b, (q31_t)0x826f8386, (q31_t)0x18d3bda0, (q31_t)0x826e4b62, (q31_t)0x18cd93a5, (q31_t)0x826d138d, + (q31_t)0x18c7699b, (q31_t)0x826bdc04, (q31_t)0x18c13f82, (q31_t)0x826aa4c9, (q31_t)0x18bb155a, (q31_t)0x82696ddc, (q31_t)0x18b4eb22, (q31_t)0x8268373c, + (q31_t)0x18aec0db, (q31_t)0x826700e9, (q31_t)0x18a89685, (q31_t)0x8265cae4, (q31_t)0x18a26c20, (q31_t)0x8264952d, (q31_t)0x189c41ab, (q31_t)0x82635fc2, + (q31_t)0x18961728, (q31_t)0x82622aa6, (q31_t)0x188fec95, (q31_t)0x8260f5d7, (q31_t)0x1889c1f3, (q31_t)0x825fc155, (q31_t)0x18839742, (q31_t)0x825e8d21, + (q31_t)0x187d6c82, (q31_t)0x825d593a, (q31_t)0x187741b2, (q31_t)0x825c25a1, (q31_t)0x187116d4, (q31_t)0x825af255, (q31_t)0x186aebe6, (q31_t)0x8259bf57, + (q31_t)0x1864c0ea, (q31_t)0x82588ca7, (q31_t)0x185e95de, (q31_t)0x82575a44, (q31_t)0x18586ac3, (q31_t)0x8256282e, (q31_t)0x18523f9a, (q31_t)0x8254f666, + (q31_t)0x184c1461, (q31_t)0x8253c4eb, (q31_t)0x1845e919, (q31_t)0x825293be, (q31_t)0x183fbdc3, (q31_t)0x825162df, (q31_t)0x1839925d, (q31_t)0x8250324d, + (q31_t)0x183366e9, (q31_t)0x824f0208, (q31_t)0x182d3b65, (q31_t)0x824dd211, (q31_t)0x18270fd3, (q31_t)0x824ca268, (q31_t)0x1820e431, (q31_t)0x824b730c, + (q31_t)0x181ab881, (q31_t)0x824a43fe, (q31_t)0x18148cc2, (q31_t)0x8249153d, (q31_t)0x180e60f4, (q31_t)0x8247e6ca, (q31_t)0x18083518, (q31_t)0x8246b8a4, + (q31_t)0x1802092c, (q31_t)0x82458acc, (q31_t)0x17fbdd32, (q31_t)0x82445d41, (q31_t)0x17f5b129, (q31_t)0x82433004, (q31_t)0x17ef8511, (q31_t)0x82420315, + (q31_t)0x17e958ea, (q31_t)0x8240d673, (q31_t)0x17e32cb5, (q31_t)0x823faa1e, (q31_t)0x17dd0070, (q31_t)0x823e7e18, (q31_t)0x17d6d41d, (q31_t)0x823d525e, + (q31_t)0x17d0a7bc, (q31_t)0x823c26f3, (q31_t)0x17ca7b4c, (q31_t)0x823afbd5, (q31_t)0x17c44ecd, (q31_t)0x8239d104, (q31_t)0x17be223f, (q31_t)0x8238a681, + (q31_t)0x17b7f5a3, (q31_t)0x82377c4c, (q31_t)0x17b1c8f8, (q31_t)0x82365264, (q31_t)0x17ab9c3e, (q31_t)0x823528ca, (q31_t)0x17a56f76, (q31_t)0x8233ff7e, + (q31_t)0x179f429f, (q31_t)0x8232d67f, (q31_t)0x179915ba, (q31_t)0x8231adce, (q31_t)0x1792e8c6, (q31_t)0x8230856a, (q31_t)0x178cbbc4, (q31_t)0x822f5d54, + (q31_t)0x17868eb3, (q31_t)0x822e358b, (q31_t)0x17806194, (q31_t)0x822d0e10, (q31_t)0x177a3466, (q31_t)0x822be6e3, (q31_t)0x17740729, (q31_t)0x822ac004, + (q31_t)0x176dd9de, (q31_t)0x82299971, (q31_t)0x1767ac85, (q31_t)0x8228732d, (q31_t)0x17617f1d, (q31_t)0x82274d36, (q31_t)0x175b51a7, (q31_t)0x8226278d, + (q31_t)0x17552422, (q31_t)0x82250232, (q31_t)0x174ef68f, (q31_t)0x8223dd24, (q31_t)0x1748c8ee, (q31_t)0x8222b863, (q31_t)0x17429b3e, (q31_t)0x822193f1, + (q31_t)0x173c6d80, (q31_t)0x82206fcc, (q31_t)0x17363fb4, (q31_t)0x821f4bf5, (q31_t)0x173011d9, (q31_t)0x821e286b, (q31_t)0x1729e3f0, (q31_t)0x821d052f, + (q31_t)0x1723b5f9, (q31_t)0x821be240, (q31_t)0x171d87f3, (q31_t)0x821abfa0, (q31_t)0x171759df, (q31_t)0x82199d4d, (q31_t)0x17112bbd, (q31_t)0x82187b47, + (q31_t)0x170afd8d, (q31_t)0x82175990, (q31_t)0x1704cf4f, (q31_t)0x82163826, (q31_t)0x16fea102, (q31_t)0x82151709, (q31_t)0x16f872a7, (q31_t)0x8213f63a, + (q31_t)0x16f2443e, (q31_t)0x8212d5b9, (q31_t)0x16ec15c7, (q31_t)0x8211b586, (q31_t)0x16e5e741, (q31_t)0x821095a0, (q31_t)0x16dfb8ae, (q31_t)0x820f7608, + (q31_t)0x16d98a0c, (q31_t)0x820e56be, (q31_t)0x16d35b5c, (q31_t)0x820d37c1, (q31_t)0x16cd2c9f, (q31_t)0x820c1912, (q31_t)0x16c6fdd3, (q31_t)0x820afab1, + (q31_t)0x16c0cef9, (q31_t)0x8209dc9e, (q31_t)0x16baa011, (q31_t)0x8208bed8, (q31_t)0x16b4711b, (q31_t)0x8207a160, (q31_t)0x16ae4217, (q31_t)0x82068435, + (q31_t)0x16a81305, (q31_t)0x82056758, (q31_t)0x16a1e3e5, (q31_t)0x82044ac9, (q31_t)0x169bb4b7, (q31_t)0x82032e88, (q31_t)0x1695857b, (q31_t)0x82021294, + (q31_t)0x168f5632, (q31_t)0x8200f6ef, (q31_t)0x168926da, (q31_t)0x81ffdb96, (q31_t)0x1682f774, (q31_t)0x81fec08c, (q31_t)0x167cc801, (q31_t)0x81fda5cf, + (q31_t)0x1676987f, (q31_t)0x81fc8b60, (q31_t)0x167068f0, (q31_t)0x81fb713f, (q31_t)0x166a3953, (q31_t)0x81fa576c, (q31_t)0x166409a8, (q31_t)0x81f93de6, + (q31_t)0x165dd9f0, (q31_t)0x81f824ae, (q31_t)0x1657aa29, (q31_t)0x81f70bc3, (q31_t)0x16517a55, (q31_t)0x81f5f327, (q31_t)0x164b4a73, (q31_t)0x81f4dad8, + (q31_t)0x16451a83, (q31_t)0x81f3c2d7, (q31_t)0x163eea86, (q31_t)0x81f2ab24, (q31_t)0x1638ba7a, (q31_t)0x81f193be, (q31_t)0x16328a61, (q31_t)0x81f07ca6, + (q31_t)0x162c5a3b, (q31_t)0x81ef65dc, (q31_t)0x16262a06, (q31_t)0x81ee4f60, (q31_t)0x161ff9c4, (q31_t)0x81ed3932, (q31_t)0x1619c975, (q31_t)0x81ec2351, + (q31_t)0x16139918, (q31_t)0x81eb0dbe, (q31_t)0x160d68ad, (q31_t)0x81e9f879, (q31_t)0x16073834, (q31_t)0x81e8e381, (q31_t)0x160107ae, (q31_t)0x81e7ced8, + (q31_t)0x15fad71b, (q31_t)0x81e6ba7c, (q31_t)0x15f4a679, (q31_t)0x81e5a66e, (q31_t)0x15ee75cb, (q31_t)0x81e492ad, (q31_t)0x15e8450e, (q31_t)0x81e37f3b, + (q31_t)0x15e21445, (q31_t)0x81e26c16, (q31_t)0x15dbe36d, (q31_t)0x81e1593f, (q31_t)0x15d5b288, (q31_t)0x81e046b6, (q31_t)0x15cf8196, (q31_t)0x81df347b, + (q31_t)0x15c95097, (q31_t)0x81de228d, (q31_t)0x15c31f89, (q31_t)0x81dd10ee, (q31_t)0x15bcee6f, (q31_t)0x81dbff9c, (q31_t)0x15b6bd47, (q31_t)0x81daee98, + (q31_t)0x15b08c12, (q31_t)0x81d9dde1, (q31_t)0x15aa5acf, (q31_t)0x81d8cd79, (q31_t)0x15a4297f, (q31_t)0x81d7bd5e, (q31_t)0x159df821, (q31_t)0x81d6ad92, + (q31_t)0x1597c6b7, (q31_t)0x81d59e13, (q31_t)0x1591953e, (q31_t)0x81d48ee1, (q31_t)0x158b63b9, (q31_t)0x81d37ffe, (q31_t)0x15853226, (q31_t)0x81d27169, + (q31_t)0x157f0086, (q31_t)0x81d16321, (q31_t)0x1578ced9, (q31_t)0x81d05527, (q31_t)0x15729d1f, (q31_t)0x81cf477b, (q31_t)0x156c6b57, (q31_t)0x81ce3a1d, + (q31_t)0x15663982, (q31_t)0x81cd2d0c, (q31_t)0x156007a0, (q31_t)0x81cc204a, (q31_t)0x1559d5b1, (q31_t)0x81cb13d5, (q31_t)0x1553a3b4, (q31_t)0x81ca07af, + (q31_t)0x154d71aa, (q31_t)0x81c8fbd6, (q31_t)0x15473f94, (q31_t)0x81c7f04b, (q31_t)0x15410d70, (q31_t)0x81c6e50d, (q31_t)0x153adb3f, (q31_t)0x81c5da1e, + (q31_t)0x1534a901, (q31_t)0x81c4cf7d, (q31_t)0x152e76b5, (q31_t)0x81c3c529, (q31_t)0x1528445d, (q31_t)0x81c2bb23, (q31_t)0x152211f8, (q31_t)0x81c1b16b, + (q31_t)0x151bdf86, (q31_t)0x81c0a801, (q31_t)0x1515ad06, (q31_t)0x81bf9ee5, (q31_t)0x150f7a7a, (q31_t)0x81be9617, (q31_t)0x150947e1, (q31_t)0x81bd8d97, + (q31_t)0x1503153a, (q31_t)0x81bc8564, (q31_t)0x14fce287, (q31_t)0x81bb7d7f, (q31_t)0x14f6afc7, (q31_t)0x81ba75e9, (q31_t)0x14f07cf9, (q31_t)0x81b96ea0, + (q31_t)0x14ea4a1f, (q31_t)0x81b867a5, (q31_t)0x14e41738, (q31_t)0x81b760f8, (q31_t)0x14dde445, (q31_t)0x81b65a99, (q31_t)0x14d7b144, (q31_t)0x81b55488, + (q31_t)0x14d17e36, (q31_t)0x81b44ec4, (q31_t)0x14cb4b1c, (q31_t)0x81b3494f, (q31_t)0x14c517f4, (q31_t)0x81b24427, (q31_t)0x14bee4c0, (q31_t)0x81b13f4e, + (q31_t)0x14b8b17f, (q31_t)0x81b03ac2, (q31_t)0x14b27e32, (q31_t)0x81af3684, (q31_t)0x14ac4ad7, (q31_t)0x81ae3294, (q31_t)0x14a61770, (q31_t)0x81ad2ef2, + (q31_t)0x149fe3fc, (q31_t)0x81ac2b9e, (q31_t)0x1499b07c, (q31_t)0x81ab2898, (q31_t)0x14937cee, (q31_t)0x81aa25e0, (q31_t)0x148d4954, (q31_t)0x81a92376, + (q31_t)0x148715ae, (q31_t)0x81a82159, (q31_t)0x1480e1fa, (q31_t)0x81a71f8b, (q31_t)0x147aae3a, (q31_t)0x81a61e0b, (q31_t)0x14747a6d, (q31_t)0x81a51cd8, + (q31_t)0x146e4694, (q31_t)0x81a41bf4, (q31_t)0x146812ae, (q31_t)0x81a31b5d, (q31_t)0x1461debc, (q31_t)0x81a21b14, (q31_t)0x145baabd, (q31_t)0x81a11b1a, + (q31_t)0x145576b1, (q31_t)0x81a01b6d, (q31_t)0x144f4299, (q31_t)0x819f1c0e, (q31_t)0x14490e74, (q31_t)0x819e1cfd, (q31_t)0x1442da43, (q31_t)0x819d1e3a, + (q31_t)0x143ca605, (q31_t)0x819c1fc5, (q31_t)0x143671bb, (q31_t)0x819b219e, (q31_t)0x14303d65, (q31_t)0x819a23c5, (q31_t)0x142a0902, (q31_t)0x8199263a, + (q31_t)0x1423d492, (q31_t)0x819828fd, (q31_t)0x141da016, (q31_t)0x81972c0e, (q31_t)0x14176b8e, (q31_t)0x81962f6d, (q31_t)0x141136f9, (q31_t)0x8195331a, + (q31_t)0x140b0258, (q31_t)0x81943715, (q31_t)0x1404cdaa, (q31_t)0x81933b5e, (q31_t)0x13fe98f1, (q31_t)0x81923ff4, (q31_t)0x13f8642a, (q31_t)0x819144d9, + (q31_t)0x13f22f58, (q31_t)0x81904a0c, (q31_t)0x13ebfa79, (q31_t)0x818f4f8d, (q31_t)0x13e5c58e, (q31_t)0x818e555c, (q31_t)0x13df9097, (q31_t)0x818d5b78, + (q31_t)0x13d95b93, (q31_t)0x818c61e3, (q31_t)0x13d32683, (q31_t)0x818b689c, (q31_t)0x13ccf167, (q31_t)0x818a6fa3, (q31_t)0x13c6bc3f, (q31_t)0x818976f8, + (q31_t)0x13c0870a, (q31_t)0x81887e9a, (q31_t)0x13ba51ca, (q31_t)0x8187868b, (q31_t)0x13b41c7d, (q31_t)0x81868eca, (q31_t)0x13ade724, (q31_t)0x81859757, + (q31_t)0x13a7b1bf, (q31_t)0x8184a032, (q31_t)0x13a17c4d, (q31_t)0x8183a95b, (q31_t)0x139b46d0, (q31_t)0x8182b2d1, (q31_t)0x13951146, (q31_t)0x8181bc96, + (q31_t)0x138edbb1, (q31_t)0x8180c6a9, (q31_t)0x1388a60f, (q31_t)0x817fd10a, (q31_t)0x13827062, (q31_t)0x817edbb9, (q31_t)0x137c3aa8, (q31_t)0x817de6b6, + (q31_t)0x137604e2, (q31_t)0x817cf201, (q31_t)0x136fcf10, (q31_t)0x817bfd9b, (q31_t)0x13699933, (q31_t)0x817b0982, (q31_t)0x13636349, (q31_t)0x817a15b7, + (q31_t)0x135d2d53, (q31_t)0x8179223a, (q31_t)0x1356f752, (q31_t)0x81782f0b, (q31_t)0x1350c144, (q31_t)0x81773c2b, (q31_t)0x134a8b2b, (q31_t)0x81764998, + (q31_t)0x13445505, (q31_t)0x81755754, (q31_t)0x133e1ed4, (q31_t)0x8174655d, (q31_t)0x1337e897, (q31_t)0x817373b5, (q31_t)0x1331b24e, (q31_t)0x8172825a, + (q31_t)0x132b7bf9, (q31_t)0x8171914e, (q31_t)0x13254599, (q31_t)0x8170a090, (q31_t)0x131f0f2c, (q31_t)0x816fb020, (q31_t)0x1318d8b4, (q31_t)0x816ebffe, + (q31_t)0x1312a230, (q31_t)0x816dd02a, (q31_t)0x130c6ba0, (q31_t)0x816ce0a4, (q31_t)0x13063505, (q31_t)0x816bf16c, (q31_t)0x12fffe5d, (q31_t)0x816b0282, + (q31_t)0x12f9c7aa, (q31_t)0x816a13e6, (q31_t)0x12f390ec, (q31_t)0x81692599, (q31_t)0x12ed5a21, (q31_t)0x81683799, (q31_t)0x12e7234b, (q31_t)0x816749e8, + (q31_t)0x12e0ec6a, (q31_t)0x81665c84, (q31_t)0x12dab57c, (q31_t)0x81656f6f, (q31_t)0x12d47e83, (q31_t)0x816482a8, (q31_t)0x12ce477f, (q31_t)0x8163962f, + (q31_t)0x12c8106f, (q31_t)0x8162aa04, (q31_t)0x12c1d953, (q31_t)0x8161be27, (q31_t)0x12bba22b, (q31_t)0x8160d298, (q31_t)0x12b56af9, (q31_t)0x815fe758, + (q31_t)0x12af33ba, (q31_t)0x815efc65, (q31_t)0x12a8fc70, (q31_t)0x815e11c1, (q31_t)0x12a2c51b, (q31_t)0x815d276a, (q31_t)0x129c8dba, (q31_t)0x815c3d62, + (q31_t)0x1296564d, (q31_t)0x815b53a8, (q31_t)0x12901ed5, (q31_t)0x815a6a3c, (q31_t)0x1289e752, (q31_t)0x8159811e, (q31_t)0x1283afc3, (q31_t)0x8158984e, + (q31_t)0x127d7829, (q31_t)0x8157afcd, (q31_t)0x12774083, (q31_t)0x8156c799, (q31_t)0x127108d2, (q31_t)0x8155dfb4, (q31_t)0x126ad116, (q31_t)0x8154f81d, + (q31_t)0x1264994e, (q31_t)0x815410d4, (q31_t)0x125e617b, (q31_t)0x815329d9, (q31_t)0x1258299c, (q31_t)0x8152432c, (q31_t)0x1251f1b3, (q31_t)0x81515ccd, + (q31_t)0x124bb9be, (q31_t)0x815076bd, (q31_t)0x124581bd, (q31_t)0x814f90fb, (q31_t)0x123f49b2, (q31_t)0x814eab86, (q31_t)0x1239119b, (q31_t)0x814dc660, + (q31_t)0x1232d979, (q31_t)0x814ce188, (q31_t)0x122ca14b, (q31_t)0x814bfcff, (q31_t)0x12266913, (q31_t)0x814b18c3, (q31_t)0x122030cf, (q31_t)0x814a34d6, + (q31_t)0x1219f880, (q31_t)0x81495136, (q31_t)0x1213c026, (q31_t)0x81486de5, (q31_t)0x120d87c1, (q31_t)0x81478ae2, (q31_t)0x12074f50, (q31_t)0x8146a82e, + (q31_t)0x120116d5, (q31_t)0x8145c5c7, (q31_t)0x11fade4e, (q31_t)0x8144e3ae, (q31_t)0x11f4a5bd, (q31_t)0x814401e4, (q31_t)0x11ee6d20, (q31_t)0x81432068, + (q31_t)0x11e83478, (q31_t)0x81423f3a, (q31_t)0x11e1fbc5, (q31_t)0x81415e5a, (q31_t)0x11dbc307, (q31_t)0x81407dc9, (q31_t)0x11d58a3e, (q31_t)0x813f9d86, + (q31_t)0x11cf516a, (q31_t)0x813ebd90, (q31_t)0x11c9188b, (q31_t)0x813ddde9, (q31_t)0x11c2dfa2, (q31_t)0x813cfe91, (q31_t)0x11bca6ad, (q31_t)0x813c1f86, + (q31_t)0x11b66dad, (q31_t)0x813b40ca, (q31_t)0x11b034a2, (q31_t)0x813a625b, (q31_t)0x11a9fb8d, (q31_t)0x8139843b, (q31_t)0x11a3c26c, (q31_t)0x8138a66a, + (q31_t)0x119d8941, (q31_t)0x8137c8e6, (q31_t)0x1197500a, (q31_t)0x8136ebb1, (q31_t)0x119116c9, (q31_t)0x81360ec9, (q31_t)0x118add7d, (q31_t)0x81353230, + (q31_t)0x1184a427, (q31_t)0x813455e6, (q31_t)0x117e6ac5, (q31_t)0x813379e9, (q31_t)0x11783159, (q31_t)0x81329e3b, (q31_t)0x1171f7e2, (q31_t)0x8131c2db, + (q31_t)0x116bbe60, (q31_t)0x8130e7c9, (q31_t)0x116584d3, (q31_t)0x81300d05, (q31_t)0x115f4b3c, (q31_t)0x812f3290, (q31_t)0x1159119a, (q31_t)0x812e5868, + (q31_t)0x1152d7ed, (q31_t)0x812d7e8f, (q31_t)0x114c9e35, (q31_t)0x812ca505, (q31_t)0x11466473, (q31_t)0x812bcbc8, (q31_t)0x11402aa6, (q31_t)0x812af2da, + (q31_t)0x1139f0cf, (q31_t)0x812a1a3a, (q31_t)0x1133b6ed, (q31_t)0x812941e8, (q31_t)0x112d7d00, (q31_t)0x812869e4, (q31_t)0x11274309, (q31_t)0x8127922f, + (q31_t)0x11210907, (q31_t)0x8126bac8, (q31_t)0x111acefb, (q31_t)0x8125e3af, (q31_t)0x111494e4, (q31_t)0x81250ce4, (q31_t)0x110e5ac2, (q31_t)0x81243668, + (q31_t)0x11082096, (q31_t)0x8123603a, (q31_t)0x1101e65f, (q31_t)0x81228a5a, (q31_t)0x10fbac1e, (q31_t)0x8121b4c8, (q31_t)0x10f571d3, (q31_t)0x8120df85, + (q31_t)0x10ef377d, (q31_t)0x81200a90, (q31_t)0x10e8fd1c, (q31_t)0x811f35e9, (q31_t)0x10e2c2b2, (q31_t)0x811e6191, (q31_t)0x10dc883c, (q31_t)0x811d8d86, + (q31_t)0x10d64dbd, (q31_t)0x811cb9ca, (q31_t)0x10d01333, (q31_t)0x811be65d, (q31_t)0x10c9d89e, (q31_t)0x811b133d, (q31_t)0x10c39dff, (q31_t)0x811a406c, + (q31_t)0x10bd6356, (q31_t)0x81196de9, (q31_t)0x10b728a3, (q31_t)0x81189bb4, (q31_t)0x10b0ede5, (q31_t)0x8117c9ce, (q31_t)0x10aab31d, (q31_t)0x8116f836, + (q31_t)0x10a4784b, (q31_t)0x811626ec, (q31_t)0x109e3d6e, (q31_t)0x811555f1, (q31_t)0x10980287, (q31_t)0x81148544, (q31_t)0x1091c796, (q31_t)0x8113b4e5, + (q31_t)0x108b8c9b, (q31_t)0x8112e4d4, (q31_t)0x10855195, (q31_t)0x81121512, (q31_t)0x107f1686, (q31_t)0x8111459e, (q31_t)0x1078db6c, (q31_t)0x81107678, + (q31_t)0x1072a048, (q31_t)0x810fa7a0, (q31_t)0x106c651a, (q31_t)0x810ed917, (q31_t)0x106629e1, (q31_t)0x810e0adc, (q31_t)0x105fee9f, (q31_t)0x810d3cf0, + (q31_t)0x1059b352, (q31_t)0x810c6f52, (q31_t)0x105377fc, (q31_t)0x810ba202, (q31_t)0x104d3c9b, (q31_t)0x810ad500, (q31_t)0x10470130, (q31_t)0x810a084d, + (q31_t)0x1040c5bb, (q31_t)0x81093be8, (q31_t)0x103a8a3d, (q31_t)0x81086fd1, (q31_t)0x10344eb4, (q31_t)0x8107a409, (q31_t)0x102e1321, (q31_t)0x8106d88f, + (q31_t)0x1027d784, (q31_t)0x81060d63, (q31_t)0x10219bdd, (q31_t)0x81054286, (q31_t)0x101b602d, (q31_t)0x810477f7, (q31_t)0x10152472, (q31_t)0x8103adb6, + (q31_t)0x100ee8ad, (q31_t)0x8102e3c4, (q31_t)0x1008acdf, (q31_t)0x81021a20, (q31_t)0x10027107, (q31_t)0x810150ca, (q31_t)0xffc3524, (q31_t)0x810087c3, + (q31_t)0xff5f938, (q31_t)0x80ffbf0a, (q31_t)0xfefbd42, (q31_t)0x80fef69f, (q31_t)0xfe98143, (q31_t)0x80fe2e83, (q31_t)0xfe34539, (q31_t)0x80fd66b5, + (q31_t)0xfdd0926, (q31_t)0x80fc9f35, (q31_t)0xfd6cd08, (q31_t)0x80fbd804, (q31_t)0xfd090e1, (q31_t)0x80fb1121, (q31_t)0xfca54b1, (q31_t)0x80fa4a8c, + (q31_t)0xfc41876, (q31_t)0x80f98446, (q31_t)0xfbddc32, (q31_t)0x80f8be4e, (q31_t)0xfb79fe4, (q31_t)0x80f7f8a4, (q31_t)0xfb1638d, (q31_t)0x80f73349, + (q31_t)0xfab272b, (q31_t)0x80f66e3c, (q31_t)0xfa4eac0, (q31_t)0x80f5a97e, (q31_t)0xf9eae4c, (q31_t)0x80f4e50e, (q31_t)0xf9871ce, (q31_t)0x80f420ec, + (q31_t)0xf923546, (q31_t)0x80f35d19, (q31_t)0xf8bf8b4, (q31_t)0x80f29994, (q31_t)0xf85bc19, (q31_t)0x80f1d65d, (q31_t)0xf7f7f75, (q31_t)0x80f11375, + (q31_t)0xf7942c7, (q31_t)0x80f050db, (q31_t)0xf73060f, (q31_t)0x80ef8e90, (q31_t)0xf6cc94e, (q31_t)0x80eecc93, (q31_t)0xf668c83, (q31_t)0x80ee0ae4, + (q31_t)0xf604faf, (q31_t)0x80ed4984, (q31_t)0xf5a12d1, (q31_t)0x80ec8872, (q31_t)0xf53d5ea, (q31_t)0x80ebc7ae, (q31_t)0xf4d98f9, (q31_t)0x80eb0739, + (q31_t)0xf475bff, (q31_t)0x80ea4712, (q31_t)0xf411efb, (q31_t)0x80e9873a, (q31_t)0xf3ae1ee, (q31_t)0x80e8c7b0, (q31_t)0xf34a4d8, (q31_t)0x80e80874, + (q31_t)0xf2e67b8, (q31_t)0x80e74987, (q31_t)0xf282a8f, (q31_t)0x80e68ae8, (q31_t)0xf21ed5d, (q31_t)0x80e5cc98, (q31_t)0xf1bb021, (q31_t)0x80e50e96, + (q31_t)0xf1572dc, (q31_t)0x80e450e2, (q31_t)0xf0f358e, (q31_t)0x80e3937d, (q31_t)0xf08f836, (q31_t)0x80e2d666, (q31_t)0xf02bad5, (q31_t)0x80e2199e, + (q31_t)0xefc7d6b, (q31_t)0x80e15d24, (q31_t)0xef63ff7, (q31_t)0x80e0a0f8, (q31_t)0xef0027b, (q31_t)0x80dfe51b, (q31_t)0xee9c4f5, (q31_t)0x80df298c, + (q31_t)0xee38766, (q31_t)0x80de6e4c, (q31_t)0xedd49ce, (q31_t)0x80ddb35a, (q31_t)0xed70c2c, (q31_t)0x80dcf8b7, (q31_t)0xed0ce82, (q31_t)0x80dc3e62, + (q31_t)0xeca90ce, (q31_t)0x80db845b, (q31_t)0xec45311, (q31_t)0x80dacaa3, (q31_t)0xebe154b, (q31_t)0x80da1139, (q31_t)0xeb7d77c, (q31_t)0x80d9581e, + (q31_t)0xeb199a4, (q31_t)0x80d89f51, (q31_t)0xeab5bc3, (q31_t)0x80d7e6d3, (q31_t)0xea51dd8, (q31_t)0x80d72ea3, (q31_t)0xe9edfe5, (q31_t)0x80d676c1, + (q31_t)0xe98a1e9, (q31_t)0x80d5bf2e, (q31_t)0xe9263e3, (q31_t)0x80d507e9, (q31_t)0xe8c25d5, (q31_t)0x80d450f3, (q31_t)0xe85e7be, (q31_t)0x80d39a4b, + (q31_t)0xe7fa99e, (q31_t)0x80d2e3f2, (q31_t)0xe796b74, (q31_t)0x80d22de7, (q31_t)0xe732d42, (q31_t)0x80d1782a, (q31_t)0xe6cef07, (q31_t)0x80d0c2bc, + (q31_t)0xe66b0c3, (q31_t)0x80d00d9d, (q31_t)0xe607277, (q31_t)0x80cf58cc, (q31_t)0xe5a3421, (q31_t)0x80cea449, (q31_t)0xe53f5c2, (q31_t)0x80cdf015, + (q31_t)0xe4db75b, (q31_t)0x80cd3c2f, (q31_t)0xe4778eb, (q31_t)0x80cc8898, (q31_t)0xe413a72, (q31_t)0x80cbd54f, (q31_t)0xe3afbf0, (q31_t)0x80cb2255, + (q31_t)0xe34bd66, (q31_t)0x80ca6fa9, (q31_t)0xe2e7ed2, (q31_t)0x80c9bd4c, (q31_t)0xe284036, (q31_t)0x80c90b3d, (q31_t)0xe220191, (q31_t)0x80c8597c, + (q31_t)0xe1bc2e4, (q31_t)0x80c7a80a, (q31_t)0xe15842e, (q31_t)0x80c6f6e7, (q31_t)0xe0f456f, (q31_t)0x80c64612, (q31_t)0xe0906a7, (q31_t)0x80c5958b, + (q31_t)0xe02c7d7, (q31_t)0x80c4e553, (q31_t)0xdfc88fe, (q31_t)0x80c4356a, (q31_t)0xdf64a1c, (q31_t)0x80c385cf, (q31_t)0xdf00b32, (q31_t)0x80c2d682, + (q31_t)0xde9cc40, (q31_t)0x80c22784, (q31_t)0xde38d44, (q31_t)0x80c178d4, (q31_t)0xddd4e40, (q31_t)0x80c0ca73, (q31_t)0xdd70f34, (q31_t)0x80c01c60, + (q31_t)0xdd0d01f, (q31_t)0x80bf6e9c, (q31_t)0xdca9102, (q31_t)0x80bec127, (q31_t)0xdc451dc, (q31_t)0x80be13ff, (q31_t)0xdbe12ad, (q31_t)0x80bd6727, + (q31_t)0xdb7d376, (q31_t)0x80bcba9d, (q31_t)0xdb19437, (q31_t)0x80bc0e61, (q31_t)0xdab54ef, (q31_t)0x80bb6274, (q31_t)0xda5159f, (q31_t)0x80bab6d5, + (q31_t)0xd9ed646, (q31_t)0x80ba0b85, (q31_t)0xd9896e5, (q31_t)0x80b96083, (q31_t)0xd92577b, (q31_t)0x80b8b5d0, (q31_t)0xd8c1809, (q31_t)0x80b80b6c, + (q31_t)0xd85d88f, (q31_t)0x80b76156, (q31_t)0xd7f990c, (q31_t)0x80b6b78e, (q31_t)0xd795982, (q31_t)0x80b60e15, (q31_t)0xd7319ee, (q31_t)0x80b564ea, + (q31_t)0xd6cda53, (q31_t)0x80b4bc0e, (q31_t)0xd669aaf, (q31_t)0x80b41381, (q31_t)0xd605b03, (q31_t)0x80b36b42, (q31_t)0xd5a1b4f, (q31_t)0x80b2c351, + (q31_t)0xd53db92, (q31_t)0x80b21baf, (q31_t)0xd4d9bcd, (q31_t)0x80b1745c, (q31_t)0xd475c00, (q31_t)0x80b0cd57, (q31_t)0xd411c2b, (q31_t)0x80b026a1, + (q31_t)0xd3adc4e, (q31_t)0x80af8039, (q31_t)0xd349c68, (q31_t)0x80aeda20, (q31_t)0xd2e5c7b, (q31_t)0x80ae3455, (q31_t)0xd281c85, (q31_t)0x80ad8ed9, + (q31_t)0xd21dc87, (q31_t)0x80ace9ab, (q31_t)0xd1b9c81, (q31_t)0x80ac44cc, (q31_t)0xd155c73, (q31_t)0x80aba03b, (q31_t)0xd0f1c5d, (q31_t)0x80aafbf9, + (q31_t)0xd08dc3f, (q31_t)0x80aa5806, (q31_t)0xd029c18, (q31_t)0x80a9b461, (q31_t)0xcfc5bea, (q31_t)0x80a9110b, (q31_t)0xcf61bb4, (q31_t)0x80a86e03, + (q31_t)0xcefdb76, (q31_t)0x80a7cb49, (q31_t)0xce99b2f, (q31_t)0x80a728df, (q31_t)0xce35ae1, (q31_t)0x80a686c2, (q31_t)0xcdd1a8b, (q31_t)0x80a5e4f5, + (q31_t)0xcd6da2d, (q31_t)0x80a54376, (q31_t)0xcd099c7, (q31_t)0x80a4a245, (q31_t)0xcca5959, (q31_t)0x80a40163, (q31_t)0xcc418e3, (q31_t)0x80a360d0, + (q31_t)0xcbdd865, (q31_t)0x80a2c08b, (q31_t)0xcb797e0, (q31_t)0x80a22095, (q31_t)0xcb15752, (q31_t)0x80a180ed, (q31_t)0xcab16bd, (q31_t)0x80a0e194, + (q31_t)0xca4d620, (q31_t)0x80a04289, (q31_t)0xc9e957b, (q31_t)0x809fa3cd, (q31_t)0xc9854cf, (q31_t)0x809f0560, (q31_t)0xc92141a, (q31_t)0x809e6741, + (q31_t)0xc8bd35e, (q31_t)0x809dc971, (q31_t)0xc85929a, (q31_t)0x809d2bef, (q31_t)0xc7f51cf, (q31_t)0x809c8ebc, (q31_t)0xc7910fb, (q31_t)0x809bf1d7, + (q31_t)0xc72d020, (q31_t)0x809b5541, (q31_t)0xc6c8f3e, (q31_t)0x809ab8fa, (q31_t)0xc664e53, (q31_t)0x809a1d01, (q31_t)0xc600d61, (q31_t)0x80998157, + (q31_t)0xc59cc68, (q31_t)0x8098e5fb, (q31_t)0xc538b66, (q31_t)0x80984aee, (q31_t)0xc4d4a5d, (q31_t)0x8097b030, (q31_t)0xc47094d, (q31_t)0x809715c0, + (q31_t)0xc40c835, (q31_t)0x80967b9f, (q31_t)0xc3a8715, (q31_t)0x8095e1cc, (q31_t)0xc3445ee, (q31_t)0x80954848, (q31_t)0xc2e04c0, (q31_t)0x8094af13, + (q31_t)0xc27c389, (q31_t)0x8094162c, (q31_t)0xc21824c, (q31_t)0x80937d93, (q31_t)0xc1b4107, (q31_t)0x8092e54a, (q31_t)0xc14ffba, (q31_t)0x80924d4f, + (q31_t)0xc0ebe66, (q31_t)0x8091b5a2, (q31_t)0xc087d0a, (q31_t)0x80911e44, (q31_t)0xc023ba7, (q31_t)0x80908735, (q31_t)0xbfbfa3d, (q31_t)0x808ff074, + (q31_t)0xbf5b8cb, (q31_t)0x808f5a02, (q31_t)0xbef7752, (q31_t)0x808ec3df, (q31_t)0xbe935d2, (q31_t)0x808e2e0a, (q31_t)0xbe2f44a, (q31_t)0x808d9884, + (q31_t)0xbdcb2bb, (q31_t)0x808d034c, (q31_t)0xbd67124, (q31_t)0x808c6e63, (q31_t)0xbd02f87, (q31_t)0x808bd9c9, (q31_t)0xbc9ede2, (q31_t)0x808b457d, + (q31_t)0xbc3ac35, (q31_t)0x808ab180, (q31_t)0xbbd6a82, (q31_t)0x808a1dd2, (q31_t)0xbb728c7, (q31_t)0x80898a72, (q31_t)0xbb0e705, (q31_t)0x8088f761, + (q31_t)0xbaaa53b, (q31_t)0x8088649e, (q31_t)0xba4636b, (q31_t)0x8087d22a, (q31_t)0xb9e2193, (q31_t)0x80874005, (q31_t)0xb97dfb5, (q31_t)0x8086ae2e, + (q31_t)0xb919dcf, (q31_t)0x80861ca6, (q31_t)0xb8b5be1, (q31_t)0x80858b6c, (q31_t)0xb8519ed, (q31_t)0x8084fa82, (q31_t)0xb7ed7f2, (q31_t)0x808469e5, + (q31_t)0xb7895f0, (q31_t)0x8083d998, (q31_t)0xb7253e6, (q31_t)0x80834999, (q31_t)0xb6c11d5, (q31_t)0x8082b9e9, (q31_t)0xb65cfbe, (q31_t)0x80822a87, + (q31_t)0xb5f8d9f, (q31_t)0x80819b74, (q31_t)0xb594b7a, (q31_t)0x80810cb0, (q31_t)0xb53094d, (q31_t)0x80807e3a, (q31_t)0xb4cc719, (q31_t)0x807ff013, + (q31_t)0xb4684df, (q31_t)0x807f623b, (q31_t)0xb40429d, (q31_t)0x807ed4b1, (q31_t)0xb3a0055, (q31_t)0x807e4776, (q31_t)0xb33be05, (q31_t)0x807dba89, + (q31_t)0xb2d7baf, (q31_t)0x807d2dec, (q31_t)0xb273952, (q31_t)0x807ca19c, (q31_t)0xb20f6ee, (q31_t)0x807c159c, (q31_t)0xb1ab483, (q31_t)0x807b89ea, + (q31_t)0xb147211, (q31_t)0x807afe87, (q31_t)0xb0e2f98, (q31_t)0x807a7373, (q31_t)0xb07ed19, (q31_t)0x8079e8ad, (q31_t)0xb01aa92, (q31_t)0x80795e36, + (q31_t)0xafb6805, (q31_t)0x8078d40d, (q31_t)0xaf52571, (q31_t)0x80784a33, (q31_t)0xaeee2d7, (q31_t)0x8077c0a8, (q31_t)0xae8a036, (q31_t)0x8077376c, + (q31_t)0xae25d8d, (q31_t)0x8076ae7e, (q31_t)0xadc1adf, (q31_t)0x807625df, (q31_t)0xad5d829, (q31_t)0x80759d8e, (q31_t)0xacf956d, (q31_t)0x8075158c, + (q31_t)0xac952aa, (q31_t)0x80748dd9, (q31_t)0xac30fe1, (q31_t)0x80740675, (q31_t)0xabccd11, (q31_t)0x80737f5f, (q31_t)0xab68a3a, (q31_t)0x8072f898, + (q31_t)0xab0475c, (q31_t)0x8072721f, (q31_t)0xaaa0478, (q31_t)0x8071ebf6, (q31_t)0xaa3c18e, (q31_t)0x8071661a, (q31_t)0xa9d7e9d, (q31_t)0x8070e08e, + (q31_t)0xa973ba5, (q31_t)0x80705b50, (q31_t)0xa90f8a7, (q31_t)0x806fd661, (q31_t)0xa8ab5a2, (q31_t)0x806f51c1, (q31_t)0xa847297, (q31_t)0x806ecd6f, + (q31_t)0xa7e2f85, (q31_t)0x806e496c, (q31_t)0xa77ec6d, (q31_t)0x806dc5b8, (q31_t)0xa71a94f, (q31_t)0x806d4253, (q31_t)0xa6b662a, (q31_t)0x806cbf3c, + (q31_t)0xa6522fe, (q31_t)0x806c3c74, (q31_t)0xa5edfcc, (q31_t)0x806bb9fa, (q31_t)0xa589c94, (q31_t)0x806b37cf, (q31_t)0xa525955, (q31_t)0x806ab5f3, + (q31_t)0xa4c1610, (q31_t)0x806a3466, (q31_t)0xa45d2c5, (q31_t)0x8069b327, (q31_t)0xa3f8f73, (q31_t)0x80693237, (q31_t)0xa394c1b, (q31_t)0x8068b196, + (q31_t)0xa3308bd, (q31_t)0x80683143, (q31_t)0xa2cc558, (q31_t)0x8067b13f, (q31_t)0xa2681ed, (q31_t)0x8067318a, (q31_t)0xa203e7c, (q31_t)0x8066b224, + (q31_t)0xa19fb04, (q31_t)0x8066330c, (q31_t)0xa13b787, (q31_t)0x8065b443, (q31_t)0xa0d7403, (q31_t)0x806535c9, (q31_t)0xa073079, (q31_t)0x8064b79d, + (q31_t)0xa00ece8, (q31_t)0x806439c0, (q31_t)0x9faa952, (q31_t)0x8063bc32, (q31_t)0x9f465b5, (q31_t)0x80633ef3, (q31_t)0x9ee2213, (q31_t)0x8062c202, + (q31_t)0x9e7de6a, (q31_t)0x80624560, (q31_t)0x9e19abb, (q31_t)0x8061c90c, (q31_t)0x9db5706, (q31_t)0x80614d08, (q31_t)0x9d5134b, (q31_t)0x8060d152, + (q31_t)0x9cecf89, (q31_t)0x806055eb, (q31_t)0x9c88bc2, (q31_t)0x805fdad2, (q31_t)0x9c247f5, (q31_t)0x805f6009, (q31_t)0x9bc0421, (q31_t)0x805ee58e, + (q31_t)0x9b5c048, (q31_t)0x805e6b62, (q31_t)0x9af7c69, (q31_t)0x805df184, (q31_t)0x9a93884, (q31_t)0x805d77f5, (q31_t)0x9a2f498, (q31_t)0x805cfeb5, + (q31_t)0x99cb0a7, (q31_t)0x805c85c4, (q31_t)0x9966cb0, (q31_t)0x805c0d21, (q31_t)0x99028b3, (q31_t)0x805b94ce, (q31_t)0x989e4b0, (q31_t)0x805b1cc8, + (q31_t)0x983a0a7, (q31_t)0x805aa512, (q31_t)0x97d5c99, (q31_t)0x805a2daa, (q31_t)0x9771884, (q31_t)0x8059b692, (q31_t)0x970d46a, (q31_t)0x80593fc7, + (q31_t)0x96a9049, (q31_t)0x8058c94c, (q31_t)0x9644c23, (q31_t)0x8058531f, (q31_t)0x95e07f8, (q31_t)0x8057dd41, (q31_t)0x957c3c6, (q31_t)0x805767b2, + (q31_t)0x9517f8f, (q31_t)0x8056f272, (q31_t)0x94b3b52, (q31_t)0x80567d80, (q31_t)0x944f70f, (q31_t)0x805608dd, (q31_t)0x93eb2c6, (q31_t)0x80559489, + (q31_t)0x9386e78, (q31_t)0x80552084, (q31_t)0x9322a24, (q31_t)0x8054accd, (q31_t)0x92be5ca, (q31_t)0x80543965, (q31_t)0x925a16b, (q31_t)0x8053c64c, + (q31_t)0x91f5d06, (q31_t)0x80535381, (q31_t)0x919189c, (q31_t)0x8052e106, (q31_t)0x912d42c, (q31_t)0x80526ed9, (q31_t)0x90c8fb6, (q31_t)0x8051fcfb, + (q31_t)0x9064b3a, (q31_t)0x80518b6b, (q31_t)0x90006ba, (q31_t)0x80511a2b, (q31_t)0x8f9c233, (q31_t)0x8050a939, (q31_t)0x8f37da7, (q31_t)0x80503896, + (q31_t)0x8ed3916, (q31_t)0x804fc841, (q31_t)0x8e6f47f, (q31_t)0x804f583c, (q31_t)0x8e0afe2, (q31_t)0x804ee885, (q31_t)0x8da6b40, (q31_t)0x804e791d, + (q31_t)0x8d42699, (q31_t)0x804e0a04, (q31_t)0x8cde1ec, (q31_t)0x804d9b39, (q31_t)0x8c79d3a, (q31_t)0x804d2cbd, (q31_t)0x8c15882, (q31_t)0x804cbe90, + (q31_t)0x8bb13c5, (q31_t)0x804c50b2, (q31_t)0x8b4cf02, (q31_t)0x804be323, (q31_t)0x8ae8a3a, (q31_t)0x804b75e2, (q31_t)0x8a8456d, (q31_t)0x804b08f0, + (q31_t)0x8a2009a, (q31_t)0x804a9c4d, (q31_t)0x89bbbc3, (q31_t)0x804a2ff9, (q31_t)0x89576e5, (q31_t)0x8049c3f3, (q31_t)0x88f3203, (q31_t)0x8049583d, + (q31_t)0x888ed1b, (q31_t)0x8048ecd5, (q31_t)0x882a82e, (q31_t)0x804881bb, (q31_t)0x87c633c, (q31_t)0x804816f1, (q31_t)0x8761e44, (q31_t)0x8047ac75, + (q31_t)0x86fd947, (q31_t)0x80474248, (q31_t)0x8699445, (q31_t)0x8046d86a, (q31_t)0x8634f3e, (q31_t)0x80466edb, (q31_t)0x85d0a32, (q31_t)0x8046059b, + (q31_t)0x856c520, (q31_t)0x80459ca9, (q31_t)0x850800a, (q31_t)0x80453406, (q31_t)0x84a3aee, (q31_t)0x8044cbb2, (q31_t)0x843f5cd, (q31_t)0x804463ad, + (q31_t)0x83db0a7, (q31_t)0x8043fbf6, (q31_t)0x8376b7c, (q31_t)0x8043948e, (q31_t)0x831264c, (q31_t)0x80432d75, (q31_t)0x82ae117, (q31_t)0x8042c6ab, + (q31_t)0x8249bdd, (q31_t)0x80426030, (q31_t)0x81e569d, (q31_t)0x8041fa03, (q31_t)0x8181159, (q31_t)0x80419425, (q31_t)0x811cc10, (q31_t)0x80412e96, + (q31_t)0x80b86c2, (q31_t)0x8040c956, (q31_t)0x805416e, (q31_t)0x80406465, (q31_t)0x7fefc16, (q31_t)0x803fffc2, (q31_t)0x7f8b6b9, (q31_t)0x803f9b6f, + (q31_t)0x7f27157, (q31_t)0x803f376a, (q31_t)0x7ec2bf0, (q31_t)0x803ed3b3, (q31_t)0x7e5e685, (q31_t)0x803e704c, (q31_t)0x7dfa114, (q31_t)0x803e0d34, + (q31_t)0x7d95b9e, (q31_t)0x803daa6a, (q31_t)0x7d31624, (q31_t)0x803d47ef, (q31_t)0x7ccd0a5, (q31_t)0x803ce5c3, (q31_t)0x7c68b21, (q31_t)0x803c83e5, + (q31_t)0x7c04598, (q31_t)0x803c2257, (q31_t)0x7ba000b, (q31_t)0x803bc117, (q31_t)0x7b3ba78, (q31_t)0x803b6026, (q31_t)0x7ad74e1, (q31_t)0x803aff84, + (q31_t)0x7a72f45, (q31_t)0x803a9f31, (q31_t)0x7a0e9a5, (q31_t)0x803a3f2d, (q31_t)0x79aa400, (q31_t)0x8039df77, (q31_t)0x7945e56, (q31_t)0x80398010, + (q31_t)0x78e18a7, (q31_t)0x803920f8, (q31_t)0x787d2f4, (q31_t)0x8038c22f, (q31_t)0x7818d3c, (q31_t)0x803863b5, (q31_t)0x77b4780, (q31_t)0x80380589, + (q31_t)0x77501be, (q31_t)0x8037a7ac, (q31_t)0x76ebbf9, (q31_t)0x80374a1f, (q31_t)0x768762e, (q31_t)0x8036ece0, (q31_t)0x762305f, (q31_t)0x80368fef, + (q31_t)0x75bea8c, (q31_t)0x8036334e, (q31_t)0x755a4b4, (q31_t)0x8035d6fb, (q31_t)0x74f5ed7, (q31_t)0x80357af8, (q31_t)0x74918f6, (q31_t)0x80351f43, + (q31_t)0x742d311, (q31_t)0x8034c3dd, (q31_t)0x73c8d27, (q31_t)0x803468c5, (q31_t)0x7364738, (q31_t)0x80340dfd, (q31_t)0x7300145, (q31_t)0x8033b383, + (q31_t)0x729bb4e, (q31_t)0x80335959, (q31_t)0x7237552, (q31_t)0x8032ff7d, (q31_t)0x71d2f52, (q31_t)0x8032a5ef, (q31_t)0x716e94e, (q31_t)0x80324cb1, + (q31_t)0x710a345, (q31_t)0x8031f3c2, (q31_t)0x70a5d37, (q31_t)0x80319b21, (q31_t)0x7041726, (q31_t)0x803142cf, (q31_t)0x6fdd110, (q31_t)0x8030eacd, + (q31_t)0x6f78af6, (q31_t)0x80309318, (q31_t)0x6f144d7, (q31_t)0x80303bb3, (q31_t)0x6eafeb4, (q31_t)0x802fe49d, (q31_t)0x6e4b88d, (q31_t)0x802f8dd5, + (q31_t)0x6de7262, (q31_t)0x802f375d, (q31_t)0x6d82c32, (q31_t)0x802ee133, (q31_t)0x6d1e5fe, (q31_t)0x802e8b58, (q31_t)0x6cb9fc6, (q31_t)0x802e35cb, + (q31_t)0x6c5598a, (q31_t)0x802de08e, (q31_t)0x6bf1349, (q31_t)0x802d8ba0, (q31_t)0x6b8cd05, (q31_t)0x802d3700, (q31_t)0x6b286bc, (q31_t)0x802ce2af, + (q31_t)0x6ac406f, (q31_t)0x802c8ead, (q31_t)0x6a5fa1e, (q31_t)0x802c3afa, (q31_t)0x69fb3c9, (q31_t)0x802be796, (q31_t)0x6996d70, (q31_t)0x802b9480, + (q31_t)0x6932713, (q31_t)0x802b41ba, (q31_t)0x68ce0b2, (q31_t)0x802aef42, (q31_t)0x6869a4c, (q31_t)0x802a9d19, (q31_t)0x68053e3, (q31_t)0x802a4b3f, + (q31_t)0x67a0d76, (q31_t)0x8029f9b4, (q31_t)0x673c704, (q31_t)0x8029a878, (q31_t)0x66d808f, (q31_t)0x8029578b, (q31_t)0x6673a16, (q31_t)0x802906ec, + (q31_t)0x660f398, (q31_t)0x8028b69c, (q31_t)0x65aad17, (q31_t)0x8028669b, (q31_t)0x6546692, (q31_t)0x802816e9, (q31_t)0x64e2009, (q31_t)0x8027c786, + (q31_t)0x647d97c, (q31_t)0x80277872, (q31_t)0x64192eb, (q31_t)0x802729ad, (q31_t)0x63b4c57, (q31_t)0x8026db36, (q31_t)0x63505be, (q31_t)0x80268d0e, + (q31_t)0x62ebf22, (q31_t)0x80263f36, (q31_t)0x6287882, (q31_t)0x8025f1ac, (q31_t)0x62231de, (q31_t)0x8025a471, (q31_t)0x61beb36, (q31_t)0x80255784, + (q31_t)0x615a48b, (q31_t)0x80250ae7, (q31_t)0x60f5ddc, (q31_t)0x8024be99, (q31_t)0x6091729, (q31_t)0x80247299, (q31_t)0x602d072, (q31_t)0x802426e8, + (q31_t)0x5fc89b8, (q31_t)0x8023db86, (q31_t)0x5f642fa, (q31_t)0x80239073, (q31_t)0x5effc38, (q31_t)0x802345af, (q31_t)0x5e9b572, (q31_t)0x8022fb3a, + (q31_t)0x5e36ea9, (q31_t)0x8022b114, (q31_t)0x5dd27dd, (q31_t)0x8022673c, (q31_t)0x5d6e10c, (q31_t)0x80221db3, (q31_t)0x5d09a38, (q31_t)0x8021d47a, + (q31_t)0x5ca5361, (q31_t)0x80218b8f, (q31_t)0x5c40c86, (q31_t)0x802142f3, (q31_t)0x5bdc5a7, (q31_t)0x8020faa6, (q31_t)0x5b77ec5, (q31_t)0x8020b2a7, + (q31_t)0x5b137df, (q31_t)0x80206af8, (q31_t)0x5aaf0f6, (q31_t)0x80202397, (q31_t)0x5a4aa09, (q31_t)0x801fdc86, (q31_t)0x59e6319, (q31_t)0x801f95c3, + (q31_t)0x5981c26, (q31_t)0x801f4f4f, (q31_t)0x591d52f, (q31_t)0x801f092a, (q31_t)0x58b8e34, (q31_t)0x801ec354, (q31_t)0x5854736, (q31_t)0x801e7dcd, + (q31_t)0x57f0035, (q31_t)0x801e3895, (q31_t)0x578b930, (q31_t)0x801df3ab, (q31_t)0x5727228, (q31_t)0x801daf11, (q31_t)0x56c2b1c, (q31_t)0x801d6ac5, + (q31_t)0x565e40d, (q31_t)0x801d26c8, (q31_t)0x55f9cfb, (q31_t)0x801ce31a, (q31_t)0x55955e6, (q31_t)0x801c9fbb, (q31_t)0x5530ecd, (q31_t)0x801c5cab, + (q31_t)0x54cc7b1, (q31_t)0x801c19ea, (q31_t)0x5468092, (q31_t)0x801bd777, (q31_t)0x540396f, (q31_t)0x801b9554, (q31_t)0x539f249, (q31_t)0x801b537f, + (q31_t)0x533ab20, (q31_t)0x801b11fa, (q31_t)0x52d63f4, (q31_t)0x801ad0c3, (q31_t)0x5271cc4, (q31_t)0x801a8fdb, (q31_t)0x520d592, (q31_t)0x801a4f42, + (q31_t)0x51a8e5c, (q31_t)0x801a0ef8, (q31_t)0x5144723, (q31_t)0x8019cefd, (q31_t)0x50dffe7, (q31_t)0x80198f50, (q31_t)0x507b8a8, (q31_t)0x80194ff3, + (q31_t)0x5017165, (q31_t)0x801910e4, (q31_t)0x4fb2a20, (q31_t)0x8018d225, (q31_t)0x4f4e2d8, (q31_t)0x801893b4, (q31_t)0x4ee9b8c, (q31_t)0x80185592, + (q31_t)0x4e8543e, (q31_t)0x801817bf, (q31_t)0x4e20cec, (q31_t)0x8017da3b, (q31_t)0x4dbc597, (q31_t)0x80179d06, (q31_t)0x4d57e40, (q31_t)0x80176020, + (q31_t)0x4cf36e5, (q31_t)0x80172388, (q31_t)0x4c8ef88, (q31_t)0x8016e740, (q31_t)0x4c2a827, (q31_t)0x8016ab46, (q31_t)0x4bc60c4, (q31_t)0x80166f9c, + (q31_t)0x4b6195d, (q31_t)0x80163440, (q31_t)0x4afd1f4, (q31_t)0x8015f933, (q31_t)0x4a98a88, (q31_t)0x8015be75, (q31_t)0x4a34319, (q31_t)0x80158406, + (q31_t)0x49cfba7, (q31_t)0x801549e6, (q31_t)0x496b432, (q31_t)0x80151015, (q31_t)0x4906cbb, (q31_t)0x8014d693, (q31_t)0x48a2540, (q31_t)0x80149d5f, + (q31_t)0x483ddc3, (q31_t)0x8014647b, (q31_t)0x47d9643, (q31_t)0x80142be5, (q31_t)0x4774ec1, (q31_t)0x8013f39e, (q31_t)0x471073b, (q31_t)0x8013bba7, + (q31_t)0x46abfb3, (q31_t)0x801383fe, (q31_t)0x4647828, (q31_t)0x80134ca4, (q31_t)0x45e309a, (q31_t)0x80131599, (q31_t)0x457e90a, (q31_t)0x8012dedd, + (q31_t)0x451a177, (q31_t)0x8012a86f, (q31_t)0x44b59e1, (q31_t)0x80127251, (q31_t)0x4451249, (q31_t)0x80123c82, (q31_t)0x43ecaae, (q31_t)0x80120701, + (q31_t)0x4388310, (q31_t)0x8011d1d0, (q31_t)0x4323b70, (q31_t)0x80119ced, (q31_t)0x42bf3cd, (q31_t)0x80116859, (q31_t)0x425ac28, (q31_t)0x80113414, + (q31_t)0x41f6480, (q31_t)0x8011001f, (q31_t)0x4191cd5, (q31_t)0x8010cc78, (q31_t)0x412d528, (q31_t)0x8010991f, (q31_t)0x40c8d79, (q31_t)0x80106616, + (q31_t)0x40645c7, (q31_t)0x8010335c, (q31_t)0x3fffe12, (q31_t)0x801000f1, (q31_t)0x3f9b65b, (q31_t)0x800fced4, (q31_t)0x3f36ea2, (q31_t)0x800f9d07, + (q31_t)0x3ed26e6, (q31_t)0x800f6b88, (q31_t)0x3e6df28, (q31_t)0x800f3a59, (q31_t)0x3e09767, (q31_t)0x800f0978, (q31_t)0x3da4fa4, (q31_t)0x800ed8e6, + (q31_t)0x3d407df, (q31_t)0x800ea8a3, (q31_t)0x3cdc017, (q31_t)0x800e78af, (q31_t)0x3c7784d, (q31_t)0x800e490a, (q31_t)0x3c13080, (q31_t)0x800e19b4, + (q31_t)0x3bae8b2, (q31_t)0x800deaad, (q31_t)0x3b4a0e0, (q31_t)0x800dbbf5, (q31_t)0x3ae590d, (q31_t)0x800d8d8b, (q31_t)0x3a81137, (q31_t)0x800d5f71, + (q31_t)0x3a1c960, (q31_t)0x800d31a5, (q31_t)0x39b8185, (q31_t)0x800d0429, (q31_t)0x39539a9, (q31_t)0x800cd6fb, (q31_t)0x38ef1ca, (q31_t)0x800caa1c, + (q31_t)0x388a9ea, (q31_t)0x800c7d8c, (q31_t)0x3826207, (q31_t)0x800c514c, (q31_t)0x37c1a22, (q31_t)0x800c255a, (q31_t)0x375d23a, (q31_t)0x800bf9b7, + (q31_t)0x36f8a51, (q31_t)0x800bce63, (q31_t)0x3694265, (q31_t)0x800ba35d, (q31_t)0x362fa78, (q31_t)0x800b78a7, (q31_t)0x35cb288, (q31_t)0x800b4e40, + (q31_t)0x3566a96, (q31_t)0x800b2427, (q31_t)0x35022a2, (q31_t)0x800afa5e, (q31_t)0x349daac, (q31_t)0x800ad0e3, (q31_t)0x34392b4, (q31_t)0x800aa7b8, + (q31_t)0x33d4abb, (q31_t)0x800a7edb, (q31_t)0x33702bf, (q31_t)0x800a564e, (q31_t)0x330bac1, (q31_t)0x800a2e0f, (q31_t)0x32a72c1, (q31_t)0x800a061f, + (q31_t)0x3242abf, (q31_t)0x8009de7e, (q31_t)0x31de2bb, (q31_t)0x8009b72c, (q31_t)0x3179ab5, (q31_t)0x80099029, (q31_t)0x31152ae, (q31_t)0x80096975, + (q31_t)0x30b0aa4, (q31_t)0x80094310, (q31_t)0x304c299, (q31_t)0x80091cf9, (q31_t)0x2fe7a8c, (q31_t)0x8008f732, (q31_t)0x2f8327d, (q31_t)0x8008d1ba, + (q31_t)0x2f1ea6c, (q31_t)0x8008ac90, (q31_t)0x2eba259, (q31_t)0x800887b6, (q31_t)0x2e55a44, (q31_t)0x8008632a, (q31_t)0x2df122e, (q31_t)0x80083eed, + (q31_t)0x2d8ca16, (q31_t)0x80081b00, (q31_t)0x2d281fc, (q31_t)0x8007f761, (q31_t)0x2cc39e1, (q31_t)0x8007d411, (q31_t)0x2c5f1c3, (q31_t)0x8007b110, + (q31_t)0x2bfa9a4, (q31_t)0x80078e5e, (q31_t)0x2b96184, (q31_t)0x80076bfb, (q31_t)0x2b31961, (q31_t)0x800749e7, (q31_t)0x2acd13d, (q31_t)0x80072822, + (q31_t)0x2a68917, (q31_t)0x800706ac, (q31_t)0x2a040f0, (q31_t)0x8006e585, (q31_t)0x299f8c7, (q31_t)0x8006c4ac, (q31_t)0x293b09c, (q31_t)0x8006a423, + (q31_t)0x28d6870, (q31_t)0x800683e8, (q31_t)0x2872043, (q31_t)0x800663fd, (q31_t)0x280d813, (q31_t)0x80064460, (q31_t)0x27a8fe2, (q31_t)0x80062513, + (q31_t)0x27447b0, (q31_t)0x80060614, (q31_t)0x26dff7c, (q31_t)0x8005e764, (q31_t)0x267b747, (q31_t)0x8005c904, (q31_t)0x2616f10, (q31_t)0x8005aaf2, + (q31_t)0x25b26d7, (q31_t)0x80058d2f, (q31_t)0x254de9e, (q31_t)0x80056fbb, (q31_t)0x24e9662, (q31_t)0x80055296, (q31_t)0x2484e26, (q31_t)0x800535c0, + (q31_t)0x24205e8, (q31_t)0x80051939, (q31_t)0x23bbda8, (q31_t)0x8004fd00, (q31_t)0x2357567, (q31_t)0x8004e117, (q31_t)0x22f2d25, (q31_t)0x8004c57d, + (q31_t)0x228e4e2, (q31_t)0x8004aa32, (q31_t)0x2229c9d, (q31_t)0x80048f35, (q31_t)0x21c5457, (q31_t)0x80047488, (q31_t)0x2160c0f, (q31_t)0x80045a29, + (q31_t)0x20fc3c6, (q31_t)0x8004401a, (q31_t)0x2097b7c, (q31_t)0x80042659, (q31_t)0x2033331, (q31_t)0x80040ce7, (q31_t)0x1fceae4, (q31_t)0x8003f3c5, + (q31_t)0x1f6a297, (q31_t)0x8003daf1, (q31_t)0x1f05a48, (q31_t)0x8003c26c, (q31_t)0x1ea11f7, (q31_t)0x8003aa36, (q31_t)0x1e3c9a6, (q31_t)0x8003924f, + (q31_t)0x1dd8154, (q31_t)0x80037ab7, (q31_t)0x1d73900, (q31_t)0x8003636e, (q31_t)0x1d0f0ab, (q31_t)0x80034c74, (q31_t)0x1caa855, (q31_t)0x800335c9, + (q31_t)0x1c45ffe, (q31_t)0x80031f6d, (q31_t)0x1be17a6, (q31_t)0x80030960, (q31_t)0x1b7cf4d, (q31_t)0x8002f3a1, (q31_t)0x1b186f3, (q31_t)0x8002de32, + (q31_t)0x1ab3e97, (q31_t)0x8002c912, (q31_t)0x1a4f63b, (q31_t)0x8002b440, (q31_t)0x19eaddd, (q31_t)0x80029fbe, (q31_t)0x198657f, (q31_t)0x80028b8a, + (q31_t)0x1921d20, (q31_t)0x800277a6, (q31_t)0x18bd4bf, (q31_t)0x80026410, (q31_t)0x1858c5e, (q31_t)0x800250c9, (q31_t)0x17f43fc, (q31_t)0x80023dd2, + (q31_t)0x178fb99, (q31_t)0x80022b29, (q31_t)0x172b335, (q31_t)0x800218cf, (q31_t)0x16c6ad0, (q31_t)0x800206c4, (q31_t)0x166226a, (q31_t)0x8001f508, + (q31_t)0x15fda03, (q31_t)0x8001e39b, (q31_t)0x159919c, (q31_t)0x8001d27d, (q31_t)0x1534934, (q31_t)0x8001c1ae, (q31_t)0x14d00ca, (q31_t)0x8001b12e, + (q31_t)0x146b860, (q31_t)0x8001a0fd, (q31_t)0x1406ff6, (q31_t)0x8001911b, (q31_t)0x13a278a, (q31_t)0x80018187, (q31_t)0x133df1e, (q31_t)0x80017243, + (q31_t)0x12d96b1, (q31_t)0x8001634e, (q31_t)0x1274e43, (q31_t)0x800154a7, (q31_t)0x12105d5, (q31_t)0x80014650, (q31_t)0x11abd66, (q31_t)0x80013847, + (q31_t)0x11474f6, (q31_t)0x80012a8e, (q31_t)0x10e2c85, (q31_t)0x80011d23, (q31_t)0x107e414, (q31_t)0x80011008, (q31_t)0x1019ba2, (q31_t)0x8001033b, + (q31_t)0x0fb5330, (q31_t)0x8000f6bd, (q31_t)0x0f50abd, (q31_t)0x8000ea8e, (q31_t)0x0eec249, (q31_t)0x8000deaf, (q31_t)0x0e879d5, (q31_t)0x8000d31e, + (q31_t)0x0e23160, (q31_t)0x8000c7dc, (q31_t)0x0dbe8eb, (q31_t)0x8000bce9, (q31_t)0x0d5a075, (q31_t)0x8000b245, (q31_t)0x0cf57ff, (q31_t)0x8000a7f0, + (q31_t)0x0c90f88, (q31_t)0x80009dea, (q31_t)0x0c2c711, (q31_t)0x80009433, (q31_t)0x0bc7e99, (q31_t)0x80008aca, (q31_t)0x0b63621, (q31_t)0x800081b1, + (q31_t)0x0afeda8, (q31_t)0x800078e7, (q31_t)0x0a9a52f, (q31_t)0x8000706c, (q31_t)0x0a35cb5, (q31_t)0x8000683f, (q31_t)0x09d143b, (q31_t)0x80006062, + (q31_t)0x096cbc1, (q31_t)0x800058d4, (q31_t)0x0908346, (q31_t)0x80005194, (q31_t)0x08a3acb, (q31_t)0x80004aa4, (q31_t)0x083f250, (q31_t)0x80004402, + (q31_t)0x07da9d4, (q31_t)0x80003daf, (q31_t)0x0776159, (q31_t)0x800037ac, (q31_t)0x07118dc, (q31_t)0x800031f7, (q31_t)0x06ad060, (q31_t)0x80002c91, + (q31_t)0x06487e3, (q31_t)0x8000277a, (q31_t)0x05e3f66, (q31_t)0x800022b3, (q31_t)0x057f6e9, (q31_t)0x80001e3a, (q31_t)0x051ae6b, (q31_t)0x80001a10, + (q31_t)0x04b65ee, (q31_t)0x80001635, (q31_t)0x0451d70, (q31_t)0x800012a9, (q31_t)0x03ed4f2, (q31_t)0x80000f6c, (q31_t)0x0388c74, (q31_t)0x80000c7e, + (q31_t)0x03243f5, (q31_t)0x800009df, (q31_t)0x02bfb77, (q31_t)0x8000078e, (q31_t)0x025b2f8, (q31_t)0x8000058d, (q31_t)0x01f6a7a, (q31_t)0x800003db, + (q31_t)0x01921fb, (q31_t)0x80000278, (q31_t)0x012d97c, (q31_t)0x80000163, (q31_t)0x00c90fe, (q31_t)0x8000009e, (q31_t)0x006487f, (q31_t)0x80000027 +}; + const q31_t cos_factorsQ31_8192[8192] = { + (q31_t)0x7ffffff6, (q31_t)0x7fffffa7, (q31_t)0x7fffff09, (q31_t)0x7ffffe1c, (q31_t)0x7ffffce1, (q31_t)0x7ffffb56, (q31_t)0x7ffff97c, (q31_t)0x7ffff753, + (q31_t)0x7ffff4dc, (q31_t)0x7ffff215, (q31_t)0x7fffef00, (q31_t)0x7fffeb9b, (q31_t)0x7fffe7e8, (q31_t)0x7fffe3e5, (q31_t)0x7fffdf94, (q31_t)0x7fffdaf3, + (q31_t)0x7fffd604, (q31_t)0x7fffd0c6, (q31_t)0x7fffcb39, (q31_t)0x7fffc55c, (q31_t)0x7fffbf31, (q31_t)0x7fffb8b7, (q31_t)0x7fffb1ee, (q31_t)0x7fffaad6, + (q31_t)0x7fffa36f, (q31_t)0x7fff9bb9, (q31_t)0x7fff93b4, (q31_t)0x7fff8b61, (q31_t)0x7fff82be, (q31_t)0x7fff79cc, (q31_t)0x7fff708b, (q31_t)0x7fff66fc, + (q31_t)0x7fff5d1d, (q31_t)0x7fff52ef, (q31_t)0x7fff4873, (q31_t)0x7fff3da8, (q31_t)0x7fff328d, (q31_t)0x7fff2724, (q31_t)0x7fff1b6b, (q31_t)0x7fff0f64, + (q31_t)0x7fff030e, (q31_t)0x7ffef669, (q31_t)0x7ffee975, (q31_t)0x7ffedc31, (q31_t)0x7ffece9f, (q31_t)0x7ffec0be, (q31_t)0x7ffeb28e, (q31_t)0x7ffea40f, + (q31_t)0x7ffe9542, (q31_t)0x7ffe8625, (q31_t)0x7ffe76b9, (q31_t)0x7ffe66fe, (q31_t)0x7ffe56f5, (q31_t)0x7ffe469c, (q31_t)0x7ffe35f4, (q31_t)0x7ffe24fe, + (q31_t)0x7ffe13b8, (q31_t)0x7ffe0224, (q31_t)0x7ffdf040, (q31_t)0x7ffdde0e, (q31_t)0x7ffdcb8d, (q31_t)0x7ffdb8bc, (q31_t)0x7ffda59d, (q31_t)0x7ffd922f, + (q31_t)0x7ffd7e72, (q31_t)0x7ffd6a66, (q31_t)0x7ffd560b, (q31_t)0x7ffd4161, (q31_t)0x7ffd2c68, (q31_t)0x7ffd1720, (q31_t)0x7ffd0189, (q31_t)0x7ffceba4, + (q31_t)0x7ffcd56f, (q31_t)0x7ffcbeeb, (q31_t)0x7ffca819, (q31_t)0x7ffc90f7, (q31_t)0x7ffc7987, (q31_t)0x7ffc61c7, (q31_t)0x7ffc49b9, (q31_t)0x7ffc315b, + (q31_t)0x7ffc18af, (q31_t)0x7ffbffb4, (q31_t)0x7ffbe66a, (q31_t)0x7ffbccd0, (q31_t)0x7ffbb2e8, (q31_t)0x7ffb98b1, (q31_t)0x7ffb7e2b, (q31_t)0x7ffb6356, + (q31_t)0x7ffb4833, (q31_t)0x7ffb2cc0, (q31_t)0x7ffb10fe, (q31_t)0x7ffaf4ed, (q31_t)0x7ffad88e, (q31_t)0x7ffabbdf, (q31_t)0x7ffa9ee2, (q31_t)0x7ffa8195, + (q31_t)0x7ffa63fa, (q31_t)0x7ffa460f, (q31_t)0x7ffa27d6, (q31_t)0x7ffa094e, (q31_t)0x7ff9ea76, (q31_t)0x7ff9cb50, (q31_t)0x7ff9abdb, (q31_t)0x7ff98c17, + (q31_t)0x7ff96c04, (q31_t)0x7ff94ba2, (q31_t)0x7ff92af1, (q31_t)0x7ff909f2, (q31_t)0x7ff8e8a3, (q31_t)0x7ff8c705, (q31_t)0x7ff8a519, (q31_t)0x7ff882dd, + (q31_t)0x7ff86053, (q31_t)0x7ff83d79, (q31_t)0x7ff81a51, (q31_t)0x7ff7f6da, (q31_t)0x7ff7d313, (q31_t)0x7ff7aefe, (q31_t)0x7ff78a9a, (q31_t)0x7ff765e7, + (q31_t)0x7ff740e5, (q31_t)0x7ff71b94, (q31_t)0x7ff6f5f4, (q31_t)0x7ff6d005, (q31_t)0x7ff6a9c8, (q31_t)0x7ff6833b, (q31_t)0x7ff65c5f, (q31_t)0x7ff63535, + (q31_t)0x7ff60dbb, (q31_t)0x7ff5e5f3, (q31_t)0x7ff5bddc, (q31_t)0x7ff59576, (q31_t)0x7ff56cc0, (q31_t)0x7ff543bc, (q31_t)0x7ff51a69, (q31_t)0x7ff4f0c7, + (q31_t)0x7ff4c6d6, (q31_t)0x7ff49c96, (q31_t)0x7ff47208, (q31_t)0x7ff4472a, (q31_t)0x7ff41bfd, (q31_t)0x7ff3f082, (q31_t)0x7ff3c4b7, (q31_t)0x7ff3989e, + (q31_t)0x7ff36c36, (q31_t)0x7ff33f7e, (q31_t)0x7ff31278, (q31_t)0x7ff2e523, (q31_t)0x7ff2b77f, (q31_t)0x7ff2898c, (q31_t)0x7ff25b4a, (q31_t)0x7ff22cb9, + (q31_t)0x7ff1fdd9, (q31_t)0x7ff1ceab, (q31_t)0x7ff19f2d, (q31_t)0x7ff16f61, (q31_t)0x7ff13f45, (q31_t)0x7ff10edb, (q31_t)0x7ff0de22, (q31_t)0x7ff0ad19, + (q31_t)0x7ff07bc2, (q31_t)0x7ff04a1c, (q31_t)0x7ff01827, (q31_t)0x7fefe5e4, (q31_t)0x7fefb351, (q31_t)0x7fef806f, (q31_t)0x7fef4d3e, (q31_t)0x7fef19bf, + (q31_t)0x7feee5f0, (q31_t)0x7feeb1d3, (q31_t)0x7fee7d67, (q31_t)0x7fee48ac, (q31_t)0x7fee13a1, (q31_t)0x7fedde48, (q31_t)0x7feda8a0, (q31_t)0x7fed72aa, + (q31_t)0x7fed3c64, (q31_t)0x7fed05cf, (q31_t)0x7fecceec, (q31_t)0x7fec97b9, (q31_t)0x7fec6038, (q31_t)0x7fec2867, (q31_t)0x7febf048, (q31_t)0x7febb7da, + (q31_t)0x7feb7f1d, (q31_t)0x7feb4611, (q31_t)0x7feb0cb6, (q31_t)0x7fead30c, (q31_t)0x7fea9914, (q31_t)0x7fea5ecc, (q31_t)0x7fea2436, (q31_t)0x7fe9e950, + (q31_t)0x7fe9ae1c, (q31_t)0x7fe97299, (q31_t)0x7fe936c7, (q31_t)0x7fe8faa6, (q31_t)0x7fe8be36, (q31_t)0x7fe88177, (q31_t)0x7fe84469, (q31_t)0x7fe8070d, + (q31_t)0x7fe7c961, (q31_t)0x7fe78b67, (q31_t)0x7fe74d1e, (q31_t)0x7fe70e85, (q31_t)0x7fe6cf9e, (q31_t)0x7fe69068, (q31_t)0x7fe650e3, (q31_t)0x7fe61110, + (q31_t)0x7fe5d0ed, (q31_t)0x7fe5907b, (q31_t)0x7fe54fbb, (q31_t)0x7fe50eac, (q31_t)0x7fe4cd4d, (q31_t)0x7fe48ba0, (q31_t)0x7fe449a4, (q31_t)0x7fe40759, + (q31_t)0x7fe3c4bf, (q31_t)0x7fe381d7, (q31_t)0x7fe33e9f, (q31_t)0x7fe2fb19, (q31_t)0x7fe2b743, (q31_t)0x7fe2731f, (q31_t)0x7fe22eac, (q31_t)0x7fe1e9ea, + (q31_t)0x7fe1a4d9, (q31_t)0x7fe15f79, (q31_t)0x7fe119cb, (q31_t)0x7fe0d3cd, (q31_t)0x7fe08d81, (q31_t)0x7fe046e5, (q31_t)0x7fdffffb, (q31_t)0x7fdfb8c2, + (q31_t)0x7fdf713a, (q31_t)0x7fdf2963, (q31_t)0x7fdee13e, (q31_t)0x7fde98c9, (q31_t)0x7fde5006, (q31_t)0x7fde06f3, (q31_t)0x7fddbd92, (q31_t)0x7fdd73e2, + (q31_t)0x7fdd29e3, (q31_t)0x7fdcdf95, (q31_t)0x7fdc94f9, (q31_t)0x7fdc4a0d, (q31_t)0x7fdbfed3, (q31_t)0x7fdbb349, (q31_t)0x7fdb6771, (q31_t)0x7fdb1b4a, + (q31_t)0x7fdaced4, (q31_t)0x7fda820f, (q31_t)0x7fda34fc, (q31_t)0x7fd9e799, (q31_t)0x7fd999e8, (q31_t)0x7fd94be8, (q31_t)0x7fd8fd98, (q31_t)0x7fd8aefa, + (q31_t)0x7fd8600e, (q31_t)0x7fd810d2, (q31_t)0x7fd7c147, (q31_t)0x7fd7716e, (q31_t)0x7fd72146, (q31_t)0x7fd6d0cf, (q31_t)0x7fd68009, (q31_t)0x7fd62ef4, + (q31_t)0x7fd5dd90, (q31_t)0x7fd58bdd, (q31_t)0x7fd539dc, (q31_t)0x7fd4e78c, (q31_t)0x7fd494ed, (q31_t)0x7fd441ff, (q31_t)0x7fd3eec2, (q31_t)0x7fd39b36, + (q31_t)0x7fd3475c, (q31_t)0x7fd2f332, (q31_t)0x7fd29eba, (q31_t)0x7fd249f3, (q31_t)0x7fd1f4dd, (q31_t)0x7fd19f78, (q31_t)0x7fd149c5, (q31_t)0x7fd0f3c2, + (q31_t)0x7fd09d71, (q31_t)0x7fd046d1, (q31_t)0x7fcfefe2, (q31_t)0x7fcf98a4, (q31_t)0x7fcf4117, (q31_t)0x7fcee93c, (q31_t)0x7fce9112, (q31_t)0x7fce3898, + (q31_t)0x7fcddfd0, (q31_t)0x7fcd86b9, (q31_t)0x7fcd2d54, (q31_t)0x7fccd39f, (q31_t)0x7fcc799c, (q31_t)0x7fcc1f4a, (q31_t)0x7fcbc4a9, (q31_t)0x7fcb69b9, + (q31_t)0x7fcb0e7a, (q31_t)0x7fcab2ed, (q31_t)0x7fca5710, (q31_t)0x7fc9fae5, (q31_t)0x7fc99e6b, (q31_t)0x7fc941a2, (q31_t)0x7fc8e48b, (q31_t)0x7fc88724, + (q31_t)0x7fc8296f, (q31_t)0x7fc7cb6b, (q31_t)0x7fc76d18, (q31_t)0x7fc70e76, (q31_t)0x7fc6af86, (q31_t)0x7fc65046, (q31_t)0x7fc5f0b8, (q31_t)0x7fc590db, + (q31_t)0x7fc530af, (q31_t)0x7fc4d035, (q31_t)0x7fc46f6b, (q31_t)0x7fc40e53, (q31_t)0x7fc3acec, (q31_t)0x7fc34b36, (q31_t)0x7fc2e931, (q31_t)0x7fc286de, + (q31_t)0x7fc2243b, (q31_t)0x7fc1c14a, (q31_t)0x7fc15e0a, (q31_t)0x7fc0fa7b, (q31_t)0x7fc0969e, (q31_t)0x7fc03271, (q31_t)0x7fbfcdf6, (q31_t)0x7fbf692c, + (q31_t)0x7fbf0414, (q31_t)0x7fbe9eac, (q31_t)0x7fbe38f6, (q31_t)0x7fbdd2f0, (q31_t)0x7fbd6c9c, (q31_t)0x7fbd05fa, (q31_t)0x7fbc9f08, (q31_t)0x7fbc37c8, + (q31_t)0x7fbbd039, (q31_t)0x7fbb685b, (q31_t)0x7fbb002e, (q31_t)0x7fba97b2, (q31_t)0x7fba2ee8, (q31_t)0x7fb9c5cf, (q31_t)0x7fb95c67, (q31_t)0x7fb8f2b0, + (q31_t)0x7fb888ab, (q31_t)0x7fb81e57, (q31_t)0x7fb7b3b4, (q31_t)0x7fb748c2, (q31_t)0x7fb6dd81, (q31_t)0x7fb671f2, (q31_t)0x7fb60614, (q31_t)0x7fb599e7, + (q31_t)0x7fb52d6b, (q31_t)0x7fb4c0a1, (q31_t)0x7fb45387, (q31_t)0x7fb3e61f, (q31_t)0x7fb37869, (q31_t)0x7fb30a63, (q31_t)0x7fb29c0f, (q31_t)0x7fb22d6c, + (q31_t)0x7fb1be7a, (q31_t)0x7fb14f39, (q31_t)0x7fb0dfaa, (q31_t)0x7fb06fcb, (q31_t)0x7fafff9e, (q31_t)0x7faf8f23, (q31_t)0x7faf1e58, (q31_t)0x7faead3f, + (q31_t)0x7fae3bd7, (q31_t)0x7fadca20, (q31_t)0x7fad581b, (q31_t)0x7face5c6, (q31_t)0x7fac7323, (q31_t)0x7fac0031, (q31_t)0x7fab8cf1, (q31_t)0x7fab1962, + (q31_t)0x7faaa584, (q31_t)0x7faa3157, (q31_t)0x7fa9bcdb, (q31_t)0x7fa94811, (q31_t)0x7fa8d2f8, (q31_t)0x7fa85d90, (q31_t)0x7fa7e7d9, (q31_t)0x7fa771d4, + (q31_t)0x7fa6fb80, (q31_t)0x7fa684dd, (q31_t)0x7fa60dec, (q31_t)0x7fa596ac, (q31_t)0x7fa51f1d, (q31_t)0x7fa4a73f, (q31_t)0x7fa42f12, (q31_t)0x7fa3b697, + (q31_t)0x7fa33dcd, (q31_t)0x7fa2c4b5, (q31_t)0x7fa24b4d, (q31_t)0x7fa1d197, (q31_t)0x7fa15792, (q31_t)0x7fa0dd3f, (q31_t)0x7fa0629c, (q31_t)0x7f9fe7ab, + (q31_t)0x7f9f6c6b, (q31_t)0x7f9ef0dd, (q31_t)0x7f9e7500, (q31_t)0x7f9df8d4, (q31_t)0x7f9d7c59, (q31_t)0x7f9cff90, (q31_t)0x7f9c8278, (q31_t)0x7f9c0511, + (q31_t)0x7f9b875b, (q31_t)0x7f9b0957, (q31_t)0x7f9a8b04, (q31_t)0x7f9a0c62, (q31_t)0x7f998d72, (q31_t)0x7f990e33, (q31_t)0x7f988ea5, (q31_t)0x7f980ec8, + (q31_t)0x7f978e9d, (q31_t)0x7f970e23, (q31_t)0x7f968d5b, (q31_t)0x7f960c43, (q31_t)0x7f958add, (q31_t)0x7f950929, (q31_t)0x7f948725, (q31_t)0x7f9404d3, + (q31_t)0x7f938232, (q31_t)0x7f92ff43, (q31_t)0x7f927c04, (q31_t)0x7f91f878, (q31_t)0x7f91749c, (q31_t)0x7f90f072, (q31_t)0x7f906bf9, (q31_t)0x7f8fe731, + (q31_t)0x7f8f621b, (q31_t)0x7f8edcb6, (q31_t)0x7f8e5702, (q31_t)0x7f8dd0ff, (q31_t)0x7f8d4aae, (q31_t)0x7f8cc40f, (q31_t)0x7f8c3d20, (q31_t)0x7f8bb5e3, + (q31_t)0x7f8b2e57, (q31_t)0x7f8aa67d, (q31_t)0x7f8a1e54, (q31_t)0x7f8995dc, (q31_t)0x7f890d15, (q31_t)0x7f888400, (q31_t)0x7f87fa9c, (q31_t)0x7f8770ea, + (q31_t)0x7f86e6e9, (q31_t)0x7f865c99, (q31_t)0x7f85d1fa, (q31_t)0x7f85470d, (q31_t)0x7f84bbd1, (q31_t)0x7f843047, (q31_t)0x7f83a46e, (q31_t)0x7f831846, + (q31_t)0x7f828bcf, (q31_t)0x7f81ff0a, (q31_t)0x7f8171f6, (q31_t)0x7f80e494, (q31_t)0x7f8056e3, (q31_t)0x7f7fc8e3, (q31_t)0x7f7f3a95, (q31_t)0x7f7eabf8, + (q31_t)0x7f7e1d0c, (q31_t)0x7f7d8dd2, (q31_t)0x7f7cfe49, (q31_t)0x7f7c6e71, (q31_t)0x7f7bde4b, (q31_t)0x7f7b4dd6, (q31_t)0x7f7abd13, (q31_t)0x7f7a2c01, + (q31_t)0x7f799aa0, (q31_t)0x7f7908f0, (q31_t)0x7f7876f2, (q31_t)0x7f77e4a6, (q31_t)0x7f77520a, (q31_t)0x7f76bf21, (q31_t)0x7f762be8, (q31_t)0x7f759861, + (q31_t)0x7f75048b, (q31_t)0x7f747067, (q31_t)0x7f73dbf4, (q31_t)0x7f734732, (q31_t)0x7f72b222, (q31_t)0x7f721cc3, (q31_t)0x7f718715, (q31_t)0x7f70f119, + (q31_t)0x7f705ace, (q31_t)0x7f6fc435, (q31_t)0x7f6f2d4d, (q31_t)0x7f6e9617, (q31_t)0x7f6dfe91, (q31_t)0x7f6d66be, (q31_t)0x7f6cce9b, (q31_t)0x7f6c362a, + (q31_t)0x7f6b9d6b, (q31_t)0x7f6b045d, (q31_t)0x7f6a6b00, (q31_t)0x7f69d154, (q31_t)0x7f69375a, (q31_t)0x7f689d12, (q31_t)0x7f68027b, (q31_t)0x7f676795, + (q31_t)0x7f66cc61, (q31_t)0x7f6630de, (q31_t)0x7f65950c, (q31_t)0x7f64f8ec, (q31_t)0x7f645c7d, (q31_t)0x7f63bfc0, (q31_t)0x7f6322b4, (q31_t)0x7f62855a, + (q31_t)0x7f61e7b1, (q31_t)0x7f6149b9, (q31_t)0x7f60ab73, (q31_t)0x7f600cdf, (q31_t)0x7f5f6dfb, (q31_t)0x7f5ecec9, (q31_t)0x7f5e2f49, (q31_t)0x7f5d8f7a, + (q31_t)0x7f5cef5c, (q31_t)0x7f5c4ef0, (q31_t)0x7f5bae36, (q31_t)0x7f5b0d2c, (q31_t)0x7f5a6bd5, (q31_t)0x7f59ca2e, (q31_t)0x7f592839, (q31_t)0x7f5885f6, + (q31_t)0x7f57e364, (q31_t)0x7f574083, (q31_t)0x7f569d54, (q31_t)0x7f55f9d6, (q31_t)0x7f55560a, (q31_t)0x7f54b1ef, (q31_t)0x7f540d86, (q31_t)0x7f5368ce, + (q31_t)0x7f52c3c8, (q31_t)0x7f521e73, (q31_t)0x7f5178cf, (q31_t)0x7f50d2dd, (q31_t)0x7f502c9d, (q31_t)0x7f4f860e, (q31_t)0x7f4edf30, (q31_t)0x7f4e3804, + (q31_t)0x7f4d9089, (q31_t)0x7f4ce8c0, (q31_t)0x7f4c40a8, (q31_t)0x7f4b9842, (q31_t)0x7f4aef8d, (q31_t)0x7f4a468a, (q31_t)0x7f499d38, (q31_t)0x7f48f398, + (q31_t)0x7f4849a9, (q31_t)0x7f479f6c, (q31_t)0x7f46f4e0, (q31_t)0x7f464a06, (q31_t)0x7f459edd, (q31_t)0x7f44f365, (q31_t)0x7f44479f, (q31_t)0x7f439b8b, + (q31_t)0x7f42ef28, (q31_t)0x7f424277, (q31_t)0x7f419577, (q31_t)0x7f40e828, (q31_t)0x7f403a8b, (q31_t)0x7f3f8ca0, (q31_t)0x7f3ede66, (q31_t)0x7f3e2fde, + (q31_t)0x7f3d8107, (q31_t)0x7f3cd1e2, (q31_t)0x7f3c226e, (q31_t)0x7f3b72ab, (q31_t)0x7f3ac29b, (q31_t)0x7f3a123b, (q31_t)0x7f39618e, (q31_t)0x7f38b091, + (q31_t)0x7f37ff47, (q31_t)0x7f374dad, (q31_t)0x7f369bc6, (q31_t)0x7f35e990, (q31_t)0x7f35370b, (q31_t)0x7f348438, (q31_t)0x7f33d116, (q31_t)0x7f331da6, + (q31_t)0x7f3269e8, (q31_t)0x7f31b5db, (q31_t)0x7f31017f, (q31_t)0x7f304cd6, (q31_t)0x7f2f97dd, (q31_t)0x7f2ee296, (q31_t)0x7f2e2d01, (q31_t)0x7f2d771e, + (q31_t)0x7f2cc0eb, (q31_t)0x7f2c0a6b, (q31_t)0x7f2b539c, (q31_t)0x7f2a9c7e, (q31_t)0x7f29e512, (q31_t)0x7f292d58, (q31_t)0x7f28754f, (q31_t)0x7f27bcf8, + (q31_t)0x7f270452, (q31_t)0x7f264b5e, (q31_t)0x7f25921c, (q31_t)0x7f24d88b, (q31_t)0x7f241eab, (q31_t)0x7f23647e, (q31_t)0x7f22aa01, (q31_t)0x7f21ef37, + (q31_t)0x7f21341e, (q31_t)0x7f2078b6, (q31_t)0x7f1fbd00, (q31_t)0x7f1f00fc, (q31_t)0x7f1e44a9, (q31_t)0x7f1d8808, (q31_t)0x7f1ccb18, (q31_t)0x7f1c0dda, + (q31_t)0x7f1b504e, (q31_t)0x7f1a9273, (q31_t)0x7f19d44a, (q31_t)0x7f1915d2, (q31_t)0x7f18570c, (q31_t)0x7f1797f8, (q31_t)0x7f16d895, (q31_t)0x7f1618e4, + (q31_t)0x7f1558e4, (q31_t)0x7f149896, (q31_t)0x7f13d7fa, (q31_t)0x7f13170f, (q31_t)0x7f1255d6, (q31_t)0x7f11944f, (q31_t)0x7f10d279, (q31_t)0x7f101054, + (q31_t)0x7f0f4de2, (q31_t)0x7f0e8b21, (q31_t)0x7f0dc811, (q31_t)0x7f0d04b3, (q31_t)0x7f0c4107, (q31_t)0x7f0b7d0d, (q31_t)0x7f0ab8c4, (q31_t)0x7f09f42d, + (q31_t)0x7f092f47, (q31_t)0x7f086a13, (q31_t)0x7f07a491, (q31_t)0x7f06dec0, (q31_t)0x7f0618a1, (q31_t)0x7f055233, (q31_t)0x7f048b78, (q31_t)0x7f03c46d, + (q31_t)0x7f02fd15, (q31_t)0x7f02356e, (q31_t)0x7f016d79, (q31_t)0x7f00a535, (q31_t)0x7effdca4, (q31_t)0x7eff13c3, (q31_t)0x7efe4a95, (q31_t)0x7efd8118, + (q31_t)0x7efcb74d, (q31_t)0x7efbed33, (q31_t)0x7efb22cb, (q31_t)0x7efa5815, (q31_t)0x7ef98d11, (q31_t)0x7ef8c1be, (q31_t)0x7ef7f61d, (q31_t)0x7ef72a2d, + (q31_t)0x7ef65def, (q31_t)0x7ef59163, (q31_t)0x7ef4c489, (q31_t)0x7ef3f760, (q31_t)0x7ef329e9, (q31_t)0x7ef25c24, (q31_t)0x7ef18e10, (q31_t)0x7ef0bfae, + (q31_t)0x7eeff0fe, (q31_t)0x7eef21ff, (q31_t)0x7eee52b2, (q31_t)0x7eed8317, (q31_t)0x7eecb32d, (q31_t)0x7eebe2f6, (q31_t)0x7eeb1270, (q31_t)0x7eea419b, + (q31_t)0x7ee97079, (q31_t)0x7ee89f08, (q31_t)0x7ee7cd49, (q31_t)0x7ee6fb3b, (q31_t)0x7ee628df, (q31_t)0x7ee55635, (q31_t)0x7ee4833d, (q31_t)0x7ee3aff6, + (q31_t)0x7ee2dc61, (q31_t)0x7ee2087e, (q31_t)0x7ee1344d, (q31_t)0x7ee05fcd, (q31_t)0x7edf8aff, (q31_t)0x7edeb5e3, (q31_t)0x7edde079, (q31_t)0x7edd0ac0, + (q31_t)0x7edc34b9, (q31_t)0x7edb5e64, (q31_t)0x7eda87c0, (q31_t)0x7ed9b0ce, (q31_t)0x7ed8d98e, (q31_t)0x7ed80200, (q31_t)0x7ed72a24, (q31_t)0x7ed651f9, + (q31_t)0x7ed57980, (q31_t)0x7ed4a0b9, (q31_t)0x7ed3c7a3, (q31_t)0x7ed2ee40, (q31_t)0x7ed2148e, (q31_t)0x7ed13a8e, (q31_t)0x7ed0603f, (q31_t)0x7ecf85a3, + (q31_t)0x7eceaab8, (q31_t)0x7ecdcf7f, (q31_t)0x7eccf3f8, (q31_t)0x7ecc1822, (q31_t)0x7ecb3bff, (q31_t)0x7eca5f8d, (q31_t)0x7ec982cd, (q31_t)0x7ec8a5bf, + (q31_t)0x7ec7c862, (q31_t)0x7ec6eab7, (q31_t)0x7ec60cbe, (q31_t)0x7ec52e77, (q31_t)0x7ec44fe2, (q31_t)0x7ec370fe, (q31_t)0x7ec291cd, (q31_t)0x7ec1b24d, + (q31_t)0x7ec0d27f, (q31_t)0x7ebff263, (q31_t)0x7ebf11f8, (q31_t)0x7ebe313f, (q31_t)0x7ebd5039, (q31_t)0x7ebc6ee4, (q31_t)0x7ebb8d40, (q31_t)0x7ebaab4f, + (q31_t)0x7eb9c910, (q31_t)0x7eb8e682, (q31_t)0x7eb803a6, (q31_t)0x7eb7207c, (q31_t)0x7eb63d04, (q31_t)0x7eb5593d, (q31_t)0x7eb47529, (q31_t)0x7eb390c6, + (q31_t)0x7eb2ac15, (q31_t)0x7eb1c716, (q31_t)0x7eb0e1c9, (q31_t)0x7eaffc2e, (q31_t)0x7eaf1645, (q31_t)0x7eae300d, (q31_t)0x7ead4987, (q31_t)0x7eac62b3, + (q31_t)0x7eab7b91, (q31_t)0x7eaa9421, (q31_t)0x7ea9ac63, (q31_t)0x7ea8c457, (q31_t)0x7ea7dbfc, (q31_t)0x7ea6f353, (q31_t)0x7ea60a5d, (q31_t)0x7ea52118, + (q31_t)0x7ea43785, (q31_t)0x7ea34da4, (q31_t)0x7ea26374, (q31_t)0x7ea178f7, (q31_t)0x7ea08e2b, (q31_t)0x7e9fa312, (q31_t)0x7e9eb7aa, (q31_t)0x7e9dcbf4, + (q31_t)0x7e9cdff0, (q31_t)0x7e9bf39e, (q31_t)0x7e9b06fe, (q31_t)0x7e9a1a10, (q31_t)0x7e992cd4, (q31_t)0x7e983f49, (q31_t)0x7e975171, (q31_t)0x7e96634a, + (q31_t)0x7e9574d6, (q31_t)0x7e948613, (q31_t)0x7e939702, (q31_t)0x7e92a7a3, (q31_t)0x7e91b7f6, (q31_t)0x7e90c7fb, (q31_t)0x7e8fd7b2, (q31_t)0x7e8ee71b, + (q31_t)0x7e8df636, (q31_t)0x7e8d0502, (q31_t)0x7e8c1381, (q31_t)0x7e8b21b1, (q31_t)0x7e8a2f94, (q31_t)0x7e893d28, (q31_t)0x7e884a6f, (q31_t)0x7e875767, + (q31_t)0x7e866411, (q31_t)0x7e85706d, (q31_t)0x7e847c7c, (q31_t)0x7e83883c, (q31_t)0x7e8293ae, (q31_t)0x7e819ed2, (q31_t)0x7e80a9a8, (q31_t)0x7e7fb430, + (q31_t)0x7e7ebe6a, (q31_t)0x7e7dc856, (q31_t)0x7e7cd1f4, (q31_t)0x7e7bdb44, (q31_t)0x7e7ae446, (q31_t)0x7e79ecf9, (q31_t)0x7e78f55f, (q31_t)0x7e77fd77, + (q31_t)0x7e770541, (q31_t)0x7e760cbd, (q31_t)0x7e7513ea, (q31_t)0x7e741aca, (q31_t)0x7e73215c, (q31_t)0x7e7227a0, (q31_t)0x7e712d96, (q31_t)0x7e70333d, + (q31_t)0x7e6f3897, (q31_t)0x7e6e3da3, (q31_t)0x7e6d4261, (q31_t)0x7e6c46d1, (q31_t)0x7e6b4af2, (q31_t)0x7e6a4ec6, (q31_t)0x7e69524c, (q31_t)0x7e685584, + (q31_t)0x7e67586e, (q31_t)0x7e665b0a, (q31_t)0x7e655d58, (q31_t)0x7e645f58, (q31_t)0x7e63610a, (q31_t)0x7e62626e, (q31_t)0x7e616384, (q31_t)0x7e60644c, + (q31_t)0x7e5f64c7, (q31_t)0x7e5e64f3, (q31_t)0x7e5d64d1, (q31_t)0x7e5c6461, (q31_t)0x7e5b63a4, (q31_t)0x7e5a6298, (q31_t)0x7e59613f, (q31_t)0x7e585f97, + (q31_t)0x7e575da2, (q31_t)0x7e565b5f, (q31_t)0x7e5558ce, (q31_t)0x7e5455ef, (q31_t)0x7e5352c1, (q31_t)0x7e524f46, (q31_t)0x7e514b7e, (q31_t)0x7e504767, + (q31_t)0x7e4f4302, (q31_t)0x7e4e3e4f, (q31_t)0x7e4d394f, (q31_t)0x7e4c3400, (q31_t)0x7e4b2e64, (q31_t)0x7e4a287a, (q31_t)0x7e492241, (q31_t)0x7e481bbb, + (q31_t)0x7e4714e7, (q31_t)0x7e460dc5, (q31_t)0x7e450656, (q31_t)0x7e43fe98, (q31_t)0x7e42f68c, (q31_t)0x7e41ee33, (q31_t)0x7e40e58c, (q31_t)0x7e3fdc97, + (q31_t)0x7e3ed353, (q31_t)0x7e3dc9c3, (q31_t)0x7e3cbfe4, (q31_t)0x7e3bb5b7, (q31_t)0x7e3aab3c, (q31_t)0x7e39a074, (q31_t)0x7e38955e, (q31_t)0x7e3789fa, + (q31_t)0x7e367e48, (q31_t)0x7e357248, (q31_t)0x7e3465fa, (q31_t)0x7e33595e, (q31_t)0x7e324c75, (q31_t)0x7e313f3e, (q31_t)0x7e3031b9, (q31_t)0x7e2f23e6, + (q31_t)0x7e2e15c5, (q31_t)0x7e2d0756, (q31_t)0x7e2bf89a, (q31_t)0x7e2ae990, (q31_t)0x7e29da38, (q31_t)0x7e28ca92, (q31_t)0x7e27ba9e, (q31_t)0x7e26aa5d, + (q31_t)0x7e2599cd, (q31_t)0x7e2488f0, (q31_t)0x7e2377c5, (q31_t)0x7e22664c, (q31_t)0x7e215486, (q31_t)0x7e204271, (q31_t)0x7e1f300f, (q31_t)0x7e1e1d5f, + (q31_t)0x7e1d0a61, (q31_t)0x7e1bf716, (q31_t)0x7e1ae37c, (q31_t)0x7e19cf95, (q31_t)0x7e18bb60, (q31_t)0x7e17a6dd, (q31_t)0x7e16920d, (q31_t)0x7e157cee, + (q31_t)0x7e146782, (q31_t)0x7e1351c9, (q31_t)0x7e123bc1, (q31_t)0x7e11256c, (q31_t)0x7e100ec8, (q31_t)0x7e0ef7d7, (q31_t)0x7e0de099, (q31_t)0x7e0cc90c, + (q31_t)0x7e0bb132, (q31_t)0x7e0a990a, (q31_t)0x7e098095, (q31_t)0x7e0867d1, (q31_t)0x7e074ec0, (q31_t)0x7e063561, (q31_t)0x7e051bb4, (q31_t)0x7e0401ba, + (q31_t)0x7e02e772, (q31_t)0x7e01ccdc, (q31_t)0x7e00b1f9, (q31_t)0x7dff96c7, (q31_t)0x7dfe7b48, (q31_t)0x7dfd5f7b, (q31_t)0x7dfc4361, (q31_t)0x7dfb26f9, + (q31_t)0x7dfa0a43, (q31_t)0x7df8ed3f, (q31_t)0x7df7cfee, (q31_t)0x7df6b24f, (q31_t)0x7df59462, (q31_t)0x7df47628, (q31_t)0x7df357a0, (q31_t)0x7df238ca, + (q31_t)0x7df119a7, (q31_t)0x7deffa35, (q31_t)0x7deeda77, (q31_t)0x7dedba6a, (q31_t)0x7dec9a10, (q31_t)0x7deb7968, (q31_t)0x7dea5872, (q31_t)0x7de9372f, + (q31_t)0x7de8159e, (q31_t)0x7de6f3c0, (q31_t)0x7de5d193, (q31_t)0x7de4af1a, (q31_t)0x7de38c52, (q31_t)0x7de2693d, (q31_t)0x7de145da, (q31_t)0x7de02229, + (q31_t)0x7ddefe2b, (q31_t)0x7dddd9e0, (q31_t)0x7ddcb546, (q31_t)0x7ddb905f, (q31_t)0x7dda6b2a, (q31_t)0x7dd945a8, (q31_t)0x7dd81fd8, (q31_t)0x7dd6f9ba, + (q31_t)0x7dd5d34f, (q31_t)0x7dd4ac96, (q31_t)0x7dd38590, (q31_t)0x7dd25e3c, (q31_t)0x7dd1369a, (q31_t)0x7dd00eab, (q31_t)0x7dcee66e, (q31_t)0x7dcdbde3, + (q31_t)0x7dcc950b, (q31_t)0x7dcb6be6, (q31_t)0x7dca4272, (q31_t)0x7dc918b1, (q31_t)0x7dc7eea3, (q31_t)0x7dc6c447, (q31_t)0x7dc5999d, (q31_t)0x7dc46ea6, + (q31_t)0x7dc34361, (q31_t)0x7dc217cf, (q31_t)0x7dc0ebef, (q31_t)0x7dbfbfc1, (q31_t)0x7dbe9346, (q31_t)0x7dbd667d, (q31_t)0x7dbc3967, (q31_t)0x7dbb0c03, + (q31_t)0x7db9de52, (q31_t)0x7db8b053, (q31_t)0x7db78207, (q31_t)0x7db6536d, (q31_t)0x7db52485, (q31_t)0x7db3f550, (q31_t)0x7db2c5cd, (q31_t)0x7db195fd, + (q31_t)0x7db065df, (q31_t)0x7daf3574, (q31_t)0x7dae04bb, (q31_t)0x7dacd3b5, (q31_t)0x7daba261, (q31_t)0x7daa70c0, (q31_t)0x7da93ed1, (q31_t)0x7da80c95, + (q31_t)0x7da6da0b, (q31_t)0x7da5a733, (q31_t)0x7da4740e, (q31_t)0x7da3409c, (q31_t)0x7da20cdc, (q31_t)0x7da0d8cf, (q31_t)0x7d9fa474, (q31_t)0x7d9e6fcb, + (q31_t)0x7d9d3ad6, (q31_t)0x7d9c0592, (q31_t)0x7d9ad001, (q31_t)0x7d999a23, (q31_t)0x7d9863f7, (q31_t)0x7d972d7e, (q31_t)0x7d95f6b7, (q31_t)0x7d94bfa3, + (q31_t)0x7d938841, (q31_t)0x7d925092, (q31_t)0x7d911896, (q31_t)0x7d8fe04c, (q31_t)0x7d8ea7b4, (q31_t)0x7d8d6ecf, (q31_t)0x7d8c359d, (q31_t)0x7d8afc1d, + (q31_t)0x7d89c250, (q31_t)0x7d888835, (q31_t)0x7d874dcd, (q31_t)0x7d861317, (q31_t)0x7d84d814, (q31_t)0x7d839cc4, (q31_t)0x7d826126, (q31_t)0x7d81253a, + (q31_t)0x7d7fe902, (q31_t)0x7d7eac7c, (q31_t)0x7d7d6fa8, (q31_t)0x7d7c3287, (q31_t)0x7d7af519, (q31_t)0x7d79b75d, (q31_t)0x7d787954, (q31_t)0x7d773afd, + (q31_t)0x7d75fc59, (q31_t)0x7d74bd68, (q31_t)0x7d737e29, (q31_t)0x7d723e9d, (q31_t)0x7d70fec4, (q31_t)0x7d6fbe9d, (q31_t)0x7d6e7e29, (q31_t)0x7d6d3d67, + (q31_t)0x7d6bfc58, (q31_t)0x7d6abafc, (q31_t)0x7d697952, (q31_t)0x7d68375b, (q31_t)0x7d66f517, (q31_t)0x7d65b285, (q31_t)0x7d646fa6, (q31_t)0x7d632c79, + (q31_t)0x7d61e8ff, (q31_t)0x7d60a538, (q31_t)0x7d5f6124, (q31_t)0x7d5e1cc2, (q31_t)0x7d5cd813, (q31_t)0x7d5b9316, (q31_t)0x7d5a4dcc, (q31_t)0x7d590835, + (q31_t)0x7d57c251, (q31_t)0x7d567c1f, (q31_t)0x7d5535a0, (q31_t)0x7d53eed3, (q31_t)0x7d52a7ba, (q31_t)0x7d516053, (q31_t)0x7d50189e, (q31_t)0x7d4ed09d, + (q31_t)0x7d4d884e, (q31_t)0x7d4c3fb1, (q31_t)0x7d4af6c8, (q31_t)0x7d49ad91, (q31_t)0x7d48640d, (q31_t)0x7d471a3c, (q31_t)0x7d45d01d, (q31_t)0x7d4485b1, + (q31_t)0x7d433af8, (q31_t)0x7d41eff1, (q31_t)0x7d40a49e, (q31_t)0x7d3f58fd, (q31_t)0x7d3e0d0e, (q31_t)0x7d3cc0d3, (q31_t)0x7d3b744a, (q31_t)0x7d3a2774, + (q31_t)0x7d38da51, (q31_t)0x7d378ce0, (q31_t)0x7d363f23, (q31_t)0x7d34f118, (q31_t)0x7d33a2bf, (q31_t)0x7d32541a, (q31_t)0x7d310527, (q31_t)0x7d2fb5e7, + (q31_t)0x7d2e665a, (q31_t)0x7d2d1680, (q31_t)0x7d2bc659, (q31_t)0x7d2a75e4, (q31_t)0x7d292522, (q31_t)0x7d27d413, (q31_t)0x7d2682b6, (q31_t)0x7d25310d, + (q31_t)0x7d23df16, (q31_t)0x7d228cd2, (q31_t)0x7d213a41, (q31_t)0x7d1fe762, (q31_t)0x7d1e9437, (q31_t)0x7d1d40be, (q31_t)0x7d1becf8, (q31_t)0x7d1a98e5, + (q31_t)0x7d194485, (q31_t)0x7d17efd8, (q31_t)0x7d169add, (q31_t)0x7d154595, (q31_t)0x7d13f001, (q31_t)0x7d129a1f, (q31_t)0x7d1143ef, (q31_t)0x7d0fed73, + (q31_t)0x7d0e96aa, (q31_t)0x7d0d3f93, (q31_t)0x7d0be82f, (q31_t)0x7d0a907e, (q31_t)0x7d093880, (q31_t)0x7d07e035, (q31_t)0x7d06879d, (q31_t)0x7d052eb8, + (q31_t)0x7d03d585, (q31_t)0x7d027c05, (q31_t)0x7d012239, (q31_t)0x7cffc81f, (q31_t)0x7cfe6db8, (q31_t)0x7cfd1304, (q31_t)0x7cfbb803, (q31_t)0x7cfa5cb4, + (q31_t)0x7cf90119, (q31_t)0x7cf7a531, (q31_t)0x7cf648fb, (q31_t)0x7cf4ec79, (q31_t)0x7cf38fa9, (q31_t)0x7cf2328c, (q31_t)0x7cf0d522, (q31_t)0x7cef776b, + (q31_t)0x7cee1967, (q31_t)0x7cecbb16, (q31_t)0x7ceb5c78, (q31_t)0x7ce9fd8d, (q31_t)0x7ce89e55, (q31_t)0x7ce73ed0, (q31_t)0x7ce5defd, (q31_t)0x7ce47ede, + (q31_t)0x7ce31e72, (q31_t)0x7ce1bdb8, (q31_t)0x7ce05cb2, (q31_t)0x7cdefb5e, (q31_t)0x7cdd99be, (q31_t)0x7cdc37d0, (q31_t)0x7cdad596, (q31_t)0x7cd9730e, + (q31_t)0x7cd8103a, (q31_t)0x7cd6ad18, (q31_t)0x7cd549aa, (q31_t)0x7cd3e5ee, (q31_t)0x7cd281e5, (q31_t)0x7cd11d90, (q31_t)0x7ccfb8ed, (q31_t)0x7cce53fe, + (q31_t)0x7ccceec1, (q31_t)0x7ccb8937, (q31_t)0x7cca2361, (q31_t)0x7cc8bd3d, (q31_t)0x7cc756cd, (q31_t)0x7cc5f010, (q31_t)0x7cc48905, (q31_t)0x7cc321ae, + (q31_t)0x7cc1ba09, (q31_t)0x7cc05218, (q31_t)0x7cbee9da, (q31_t)0x7cbd814f, (q31_t)0x7cbc1877, (q31_t)0x7cbaaf51, (q31_t)0x7cb945df, (q31_t)0x7cb7dc20, + (q31_t)0x7cb67215, (q31_t)0x7cb507bc, (q31_t)0x7cb39d16, (q31_t)0x7cb23223, (q31_t)0x7cb0c6e4, (q31_t)0x7caf5b57, (q31_t)0x7cadef7e, (q31_t)0x7cac8358, + (q31_t)0x7cab16e4, (q31_t)0x7ca9aa24, (q31_t)0x7ca83d17, (q31_t)0x7ca6cfbd, (q31_t)0x7ca56216, (q31_t)0x7ca3f423, (q31_t)0x7ca285e2, (q31_t)0x7ca11755, + (q31_t)0x7c9fa87a, (q31_t)0x7c9e3953, (q31_t)0x7c9cc9df, (q31_t)0x7c9b5a1e, (q31_t)0x7c99ea10, (q31_t)0x7c9879b6, (q31_t)0x7c97090e, (q31_t)0x7c95981a, + (q31_t)0x7c9426d8, (q31_t)0x7c92b54a, (q31_t)0x7c91436f, (q31_t)0x7c8fd148, (q31_t)0x7c8e5ed3, (q31_t)0x7c8cec12, (q31_t)0x7c8b7903, (q31_t)0x7c8a05a8, + (q31_t)0x7c889200, (q31_t)0x7c871e0c, (q31_t)0x7c85a9ca, (q31_t)0x7c84353c, (q31_t)0x7c82c060, (q31_t)0x7c814b39, (q31_t)0x7c7fd5c4, (q31_t)0x7c7e6002, + (q31_t)0x7c7ce9f4, (q31_t)0x7c7b7399, (q31_t)0x7c79fcf1, (q31_t)0x7c7885fc, (q31_t)0x7c770eba, (q31_t)0x7c75972c, (q31_t)0x7c741f51, (q31_t)0x7c72a729, + (q31_t)0x7c712eb5, (q31_t)0x7c6fb5f3, (q31_t)0x7c6e3ce5, (q31_t)0x7c6cc38a, (q31_t)0x7c6b49e3, (q31_t)0x7c69cfee, (q31_t)0x7c6855ad, (q31_t)0x7c66db1f, + (q31_t)0x7c656045, (q31_t)0x7c63e51e, (q31_t)0x7c6269aa, (q31_t)0x7c60ede9, (q31_t)0x7c5f71db, (q31_t)0x7c5df581, (q31_t)0x7c5c78da, (q31_t)0x7c5afbe6, + (q31_t)0x7c597ea6, (q31_t)0x7c580119, (q31_t)0x7c56833f, (q31_t)0x7c550519, (q31_t)0x7c5386a6, (q31_t)0x7c5207e6, (q31_t)0x7c5088d9, (q31_t)0x7c4f0980, + (q31_t)0x7c4d89da, (q31_t)0x7c4c09e8, (q31_t)0x7c4a89a8, (q31_t)0x7c49091c, (q31_t)0x7c478844, (q31_t)0x7c46071f, (q31_t)0x7c4485ad, (q31_t)0x7c4303ee, + (q31_t)0x7c4181e3, (q31_t)0x7c3fff8b, (q31_t)0x7c3e7ce7, (q31_t)0x7c3cf9f5, (q31_t)0x7c3b76b8, (q31_t)0x7c39f32d, (q31_t)0x7c386f56, (q31_t)0x7c36eb33, + (q31_t)0x7c3566c2, (q31_t)0x7c33e205, (q31_t)0x7c325cfc, (q31_t)0x7c30d7a6, (q31_t)0x7c2f5203, (q31_t)0x7c2dcc14, (q31_t)0x7c2c45d8, (q31_t)0x7c2abf4f, + (q31_t)0x7c29387a, (q31_t)0x7c27b158, (q31_t)0x7c2629ea, (q31_t)0x7c24a22f, (q31_t)0x7c231a28, (q31_t)0x7c2191d4, (q31_t)0x7c200933, (q31_t)0x7c1e8046, + (q31_t)0x7c1cf70c, (q31_t)0x7c1b6d86, (q31_t)0x7c19e3b3, (q31_t)0x7c185994, (q31_t)0x7c16cf28, (q31_t)0x7c15446f, (q31_t)0x7c13b96a, (q31_t)0x7c122e19, + (q31_t)0x7c10a27b, (q31_t)0x7c0f1690, (q31_t)0x7c0d8a59, (q31_t)0x7c0bfdd5, (q31_t)0x7c0a7105, (q31_t)0x7c08e3e8, (q31_t)0x7c07567f, (q31_t)0x7c05c8c9, + (q31_t)0x7c043ac7, (q31_t)0x7c02ac78, (q31_t)0x7c011ddd, (q31_t)0x7bff8ef5, (q31_t)0x7bfdffc1, (q31_t)0x7bfc7041, (q31_t)0x7bfae073, (q31_t)0x7bf9505a, + (q31_t)0x7bf7bff4, (q31_t)0x7bf62f41, (q31_t)0x7bf49e42, (q31_t)0x7bf30cf6, (q31_t)0x7bf17b5e, (q31_t)0x7befe97a, (q31_t)0x7bee5749, (q31_t)0x7becc4cc, + (q31_t)0x7beb3202, (q31_t)0x7be99eec, (q31_t)0x7be80b89, (q31_t)0x7be677da, (q31_t)0x7be4e3df, (q31_t)0x7be34f97, (q31_t)0x7be1bb02, (q31_t)0x7be02621, + (q31_t)0x7bde90f4, (q31_t)0x7bdcfb7b, (q31_t)0x7bdb65b5, (q31_t)0x7bd9cfa2, (q31_t)0x7bd83944, (q31_t)0x7bd6a298, (q31_t)0x7bd50ba1, (q31_t)0x7bd3745d, + (q31_t)0x7bd1dccc, (q31_t)0x7bd044f0, (q31_t)0x7bceacc7, (q31_t)0x7bcd1451, (q31_t)0x7bcb7b8f, (q31_t)0x7bc9e281, (q31_t)0x7bc84927, (q31_t)0x7bc6af80, + (q31_t)0x7bc5158c, (q31_t)0x7bc37b4d, (q31_t)0x7bc1e0c1, (q31_t)0x7bc045e9, (q31_t)0x7bbeaac4, (q31_t)0x7bbd0f53, (q31_t)0x7bbb7396, (q31_t)0x7bb9d78c, + (q31_t)0x7bb83b36, (q31_t)0x7bb69e94, (q31_t)0x7bb501a5, (q31_t)0x7bb3646a, (q31_t)0x7bb1c6e3, (q31_t)0x7bb02910, (q31_t)0x7bae8af0, (q31_t)0x7bacec84, + (q31_t)0x7bab4dcc, (q31_t)0x7ba9aec7, (q31_t)0x7ba80f76, (q31_t)0x7ba66fd9, (q31_t)0x7ba4cfef, (q31_t)0x7ba32fba, (q31_t)0x7ba18f38, (q31_t)0x7b9fee69, + (q31_t)0x7b9e4d4f, (q31_t)0x7b9cabe8, (q31_t)0x7b9b0a35, (q31_t)0x7b996836, (q31_t)0x7b97c5ea, (q31_t)0x7b962352, (q31_t)0x7b94806e, (q31_t)0x7b92dd3e, + (q31_t)0x7b9139c2, (q31_t)0x7b8f95f9, (q31_t)0x7b8df1e4, (q31_t)0x7b8c4d83, (q31_t)0x7b8aa8d6, (q31_t)0x7b8903dc, (q31_t)0x7b875e96, (q31_t)0x7b85b904, + (q31_t)0x7b841326, (q31_t)0x7b826cfc, (q31_t)0x7b80c686, (q31_t)0x7b7f1fc3, (q31_t)0x7b7d78b4, (q31_t)0x7b7bd159, (q31_t)0x7b7a29b2, (q31_t)0x7b7881be, + (q31_t)0x7b76d97f, (q31_t)0x7b7530f3, (q31_t)0x7b73881b, (q31_t)0x7b71def7, (q31_t)0x7b703587, (q31_t)0x7b6e8bcb, (q31_t)0x7b6ce1c2, (q31_t)0x7b6b376e, + (q31_t)0x7b698ccd, (q31_t)0x7b67e1e0, (q31_t)0x7b6636a7, (q31_t)0x7b648b22, (q31_t)0x7b62df51, (q31_t)0x7b613334, (q31_t)0x7b5f86ca, (q31_t)0x7b5dda15, + (q31_t)0x7b5c2d13, (q31_t)0x7b5a7fc6, (q31_t)0x7b58d22c, (q31_t)0x7b572446, (q31_t)0x7b557614, (q31_t)0x7b53c796, (q31_t)0x7b5218cc, (q31_t)0x7b5069b6, + (q31_t)0x7b4eba53, (q31_t)0x7b4d0aa5, (q31_t)0x7b4b5aab, (q31_t)0x7b49aa64, (q31_t)0x7b47f9d2, (q31_t)0x7b4648f3, (q31_t)0x7b4497c9, (q31_t)0x7b42e652, + (q31_t)0x7b413490, (q31_t)0x7b3f8281, (q31_t)0x7b3dd026, (q31_t)0x7b3c1d80, (q31_t)0x7b3a6a8d, (q31_t)0x7b38b74e, (q31_t)0x7b3703c3, (q31_t)0x7b354fed, + (q31_t)0x7b339bca, (q31_t)0x7b31e75b, (q31_t)0x7b3032a0, (q31_t)0x7b2e7d9a, (q31_t)0x7b2cc847, (q31_t)0x7b2b12a8, (q31_t)0x7b295cbe, (q31_t)0x7b27a687, + (q31_t)0x7b25f004, (q31_t)0x7b243936, (q31_t)0x7b22821b, (q31_t)0x7b20cab5, (q31_t)0x7b1f1302, (q31_t)0x7b1d5b04, (q31_t)0x7b1ba2b9, (q31_t)0x7b19ea23, + (q31_t)0x7b183141, (q31_t)0x7b167813, (q31_t)0x7b14be99, (q31_t)0x7b1304d3, (q31_t)0x7b114ac1, (q31_t)0x7b0f9063, (q31_t)0x7b0dd5b9, (q31_t)0x7b0c1ac4, + (q31_t)0x7b0a5f82, (q31_t)0x7b08a3f5, (q31_t)0x7b06e81b, (q31_t)0x7b052bf6, (q31_t)0x7b036f85, (q31_t)0x7b01b2c8, (q31_t)0x7afff5bf, (q31_t)0x7afe386a, + (q31_t)0x7afc7aca, (q31_t)0x7afabcdd, (q31_t)0x7af8fea5, (q31_t)0x7af74021, (q31_t)0x7af58151, (q31_t)0x7af3c235, (q31_t)0x7af202cd, (q31_t)0x7af0431a, + (q31_t)0x7aee831a, (q31_t)0x7aecc2cf, (q31_t)0x7aeb0238, (q31_t)0x7ae94155, (q31_t)0x7ae78026, (q31_t)0x7ae5beac, (q31_t)0x7ae3fce6, (q31_t)0x7ae23ad4, + (q31_t)0x7ae07876, (q31_t)0x7adeb5cc, (q31_t)0x7adcf2d6, (q31_t)0x7adb2f95, (q31_t)0x7ad96c08, (q31_t)0x7ad7a82f, (q31_t)0x7ad5e40a, (q31_t)0x7ad41f9a, + (q31_t)0x7ad25ade, (q31_t)0x7ad095d6, (q31_t)0x7aced082, (q31_t)0x7acd0ae3, (q31_t)0x7acb44f8, (q31_t)0x7ac97ec1, (q31_t)0x7ac7b83e, (q31_t)0x7ac5f170, + (q31_t)0x7ac42a55, (q31_t)0x7ac262ef, (q31_t)0x7ac09b3e, (q31_t)0x7abed341, (q31_t)0x7abd0af7, (q31_t)0x7abb4263, (q31_t)0x7ab97982, (q31_t)0x7ab7b056, + (q31_t)0x7ab5e6de, (q31_t)0x7ab41d1b, (q31_t)0x7ab2530b, (q31_t)0x7ab088b0, (q31_t)0x7aaebe0a, (q31_t)0x7aacf318, (q31_t)0x7aab27da, (q31_t)0x7aa95c50, + (q31_t)0x7aa7907b, (q31_t)0x7aa5c45a, (q31_t)0x7aa3f7ed, (q31_t)0x7aa22b35, (q31_t)0x7aa05e31, (q31_t)0x7a9e90e1, (q31_t)0x7a9cc346, (q31_t)0x7a9af55f, + (q31_t)0x7a99272d, (q31_t)0x7a9758af, (q31_t)0x7a9589e5, (q31_t)0x7a93bad0, (q31_t)0x7a91eb6f, (q31_t)0x7a901bc2, (q31_t)0x7a8e4bca, (q31_t)0x7a8c7b87, + (q31_t)0x7a8aaaf7, (q31_t)0x7a88da1c, (q31_t)0x7a8708f6, (q31_t)0x7a853784, (q31_t)0x7a8365c6, (q31_t)0x7a8193bd, (q31_t)0x7a7fc168, (q31_t)0x7a7deec8, + (q31_t)0x7a7c1bdc, (q31_t)0x7a7a48a4, (q31_t)0x7a787521, (q31_t)0x7a76a153, (q31_t)0x7a74cd38, (q31_t)0x7a72f8d3, (q31_t)0x7a712422, (q31_t)0x7a6f4f25, + (q31_t)0x7a6d79dd, (q31_t)0x7a6ba449, (q31_t)0x7a69ce6a, (q31_t)0x7a67f83f, (q31_t)0x7a6621c9, (q31_t)0x7a644b07, (q31_t)0x7a6273fa, (q31_t)0x7a609ca1, + (q31_t)0x7a5ec4fc, (q31_t)0x7a5ced0d, (q31_t)0x7a5b14d1, (q31_t)0x7a593c4b, (q31_t)0x7a576379, (q31_t)0x7a558a5b, (q31_t)0x7a53b0f2, (q31_t)0x7a51d73d, + (q31_t)0x7a4ffd3d, (q31_t)0x7a4e22f2, (q31_t)0x7a4c485b, (q31_t)0x7a4a6d78, (q31_t)0x7a48924b, (q31_t)0x7a46b6d1, (q31_t)0x7a44db0d, (q31_t)0x7a42fefd, + (q31_t)0x7a4122a1, (q31_t)0x7a3f45fa, (q31_t)0x7a3d6908, (q31_t)0x7a3b8bca, (q31_t)0x7a39ae41, (q31_t)0x7a37d06d, (q31_t)0x7a35f24d, (q31_t)0x7a3413e2, + (q31_t)0x7a32352b, (q31_t)0x7a305629, (q31_t)0x7a2e76dc, (q31_t)0x7a2c9743, (q31_t)0x7a2ab75f, (q31_t)0x7a28d72f, (q31_t)0x7a26f6b4, (q31_t)0x7a2515ee, + (q31_t)0x7a2334dd, (q31_t)0x7a215380, (q31_t)0x7a1f71d7, (q31_t)0x7a1d8fe4, (q31_t)0x7a1bada5, (q31_t)0x7a19cb1b, (q31_t)0x7a17e845, (q31_t)0x7a160524, + (q31_t)0x7a1421b8, (q31_t)0x7a123e01, (q31_t)0x7a1059fe, (q31_t)0x7a0e75b0, (q31_t)0x7a0c9117, (q31_t)0x7a0aac32, (q31_t)0x7a08c702, (q31_t)0x7a06e187, + (q31_t)0x7a04fbc1, (q31_t)0x7a0315af, (q31_t)0x7a012f52, (q31_t)0x79ff48aa, (q31_t)0x79fd61b6, (q31_t)0x79fb7a77, (q31_t)0x79f992ed, (q31_t)0x79f7ab18, + (q31_t)0x79f5c2f8, (q31_t)0x79f3da8c, (q31_t)0x79f1f1d5, (q31_t)0x79f008d3, (q31_t)0x79ee1f86, (q31_t)0x79ec35ed, (q31_t)0x79ea4c09, (q31_t)0x79e861da, + (q31_t)0x79e67760, (q31_t)0x79e48c9b, (q31_t)0x79e2a18a, (q31_t)0x79e0b62e, (q31_t)0x79deca87, (q31_t)0x79dcde95, (q31_t)0x79daf258, (q31_t)0x79d905d0, + (q31_t)0x79d718fc, (q31_t)0x79d52bdd, (q31_t)0x79d33e73, (q31_t)0x79d150be, (q31_t)0x79cf62be, (q31_t)0x79cd7473, (q31_t)0x79cb85dc, (q31_t)0x79c996fb, + (q31_t)0x79c7a7ce, (q31_t)0x79c5b856, (q31_t)0x79c3c893, (q31_t)0x79c1d885, (q31_t)0x79bfe82c, (q31_t)0x79bdf788, (q31_t)0x79bc0698, (q31_t)0x79ba155e, + (q31_t)0x79b823d8, (q31_t)0x79b63207, (q31_t)0x79b43fec, (q31_t)0x79b24d85, (q31_t)0x79b05ad3, (q31_t)0x79ae67d6, (q31_t)0x79ac748e, (q31_t)0x79aa80fb, + (q31_t)0x79a88d1d, (q31_t)0x79a698f4, (q31_t)0x79a4a480, (q31_t)0x79a2afc1, (q31_t)0x79a0bab6, (q31_t)0x799ec561, (q31_t)0x799ccfc1, (q31_t)0x799ad9d5, + (q31_t)0x7998e39f, (q31_t)0x7996ed1e, (q31_t)0x7994f651, (q31_t)0x7992ff3a, (q31_t)0x799107d8, (q31_t)0x798f102a, (q31_t)0x798d1832, (q31_t)0x798b1fef, + (q31_t)0x79892761, (q31_t)0x79872e87, (q31_t)0x79853563, (q31_t)0x79833bf4, (q31_t)0x7981423a, (q31_t)0x797f4835, (q31_t)0x797d4de5, (q31_t)0x797b534a, + (q31_t)0x79795864, (q31_t)0x79775d33, (q31_t)0x797561b8, (q31_t)0x797365f1, (q31_t)0x797169df, (q31_t)0x796f6d83, (q31_t)0x796d70dc, (q31_t)0x796b73e9, + (q31_t)0x796976ac, (q31_t)0x79677924, (q31_t)0x79657b51, (q31_t)0x79637d33, (q31_t)0x79617eca, (q31_t)0x795f8017, (q31_t)0x795d8118, (q31_t)0x795b81cf, + (q31_t)0x7959823b, (q31_t)0x7957825c, (q31_t)0x79558232, (q31_t)0x795381bd, (q31_t)0x795180fe, (q31_t)0x794f7ff3, (q31_t)0x794d7e9e, (q31_t)0x794b7cfe, + (q31_t)0x79497b13, (q31_t)0x794778dd, (q31_t)0x7945765d, (q31_t)0x79437391, (q31_t)0x7941707b, (q31_t)0x793f6d1a, (q31_t)0x793d696f, (q31_t)0x793b6578, + (q31_t)0x79396137, (q31_t)0x79375cab, (q31_t)0x793557d4, (q31_t)0x793352b2, (q31_t)0x79314d46, (q31_t)0x792f478f, (q31_t)0x792d418d, (q31_t)0x792b3b40, + (q31_t)0x792934a9, (q31_t)0x79272dc7, (q31_t)0x7925269a, (q31_t)0x79231f22, (q31_t)0x79211760, (q31_t)0x791f0f53, (q31_t)0x791d06fb, (q31_t)0x791afe59, + (q31_t)0x7918f56c, (q31_t)0x7916ec34, (q31_t)0x7914e2b2, (q31_t)0x7912d8e4, (q31_t)0x7910cecc, (q31_t)0x790ec46a, (q31_t)0x790cb9bd, (q31_t)0x790aaec5, + (q31_t)0x7908a382, (q31_t)0x790697f5, (q31_t)0x79048c1d, (q31_t)0x79027ffa, (q31_t)0x7900738d, (q31_t)0x78fe66d5, (q31_t)0x78fc59d3, (q31_t)0x78fa4c86, + (q31_t)0x78f83eee, (q31_t)0x78f6310c, (q31_t)0x78f422df, (q31_t)0x78f21467, (q31_t)0x78f005a5, (q31_t)0x78edf698, (q31_t)0x78ebe741, (q31_t)0x78e9d79f, + (q31_t)0x78e7c7b2, (q31_t)0x78e5b77b, (q31_t)0x78e3a6f9, (q31_t)0x78e1962d, (q31_t)0x78df8516, (q31_t)0x78dd73b5, (q31_t)0x78db6209, (q31_t)0x78d95012, + (q31_t)0x78d73dd1, (q31_t)0x78d52b46, (q31_t)0x78d31870, (q31_t)0x78d1054f, (q31_t)0x78cef1e4, (q31_t)0x78ccde2e, (q31_t)0x78caca2e, (q31_t)0x78c8b5e3, + (q31_t)0x78c6a14e, (q31_t)0x78c48c6e, (q31_t)0x78c27744, (q31_t)0x78c061cf, (q31_t)0x78be4c10, (q31_t)0x78bc3606, (q31_t)0x78ba1fb2, (q31_t)0x78b80913, + (q31_t)0x78b5f22a, (q31_t)0x78b3daf7, (q31_t)0x78b1c379, (q31_t)0x78afabb0, (q31_t)0x78ad939d, (q31_t)0x78ab7b40, (q31_t)0x78a96298, (q31_t)0x78a749a6, + (q31_t)0x78a53069, (q31_t)0x78a316e2, (q31_t)0x78a0fd11, (q31_t)0x789ee2f5, (q31_t)0x789cc88f, (q31_t)0x789aadde, (q31_t)0x789892e3, (q31_t)0x7896779d, + (q31_t)0x78945c0d, (q31_t)0x78924033, (q31_t)0x7890240e, (q31_t)0x788e07a0, (q31_t)0x788beae6, (q31_t)0x7889cde2, (q31_t)0x7887b094, (q31_t)0x788592fc, + (q31_t)0x78837519, (q31_t)0x788156ec, (q31_t)0x787f3875, (q31_t)0x787d19b3, (q31_t)0x787afaa7, (q31_t)0x7878db50, (q31_t)0x7876bbb0, (q31_t)0x78749bc5, + (q31_t)0x78727b8f, (q31_t)0x78705b10, (q31_t)0x786e3a46, (q31_t)0x786c1932, (q31_t)0x7869f7d3, (q31_t)0x7867d62a, (q31_t)0x7865b437, (q31_t)0x786391fa, + (q31_t)0x78616f72, (q31_t)0x785f4ca1, (q31_t)0x785d2984, (q31_t)0x785b061e, (q31_t)0x7858e26e, (q31_t)0x7856be73, (q31_t)0x78549a2e, (q31_t)0x7852759e, + (q31_t)0x785050c5, (q31_t)0x784e2ba1, (q31_t)0x784c0633, (q31_t)0x7849e07b, (q31_t)0x7847ba79, (q31_t)0x7845942c, (q31_t)0x78436d96, (q31_t)0x784146b5, + (q31_t)0x783f1f8a, (q31_t)0x783cf815, (q31_t)0x783ad055, (q31_t)0x7838a84c, (q31_t)0x78367ff8, (q31_t)0x7834575a, (q31_t)0x78322e72, (q31_t)0x78300540, + (q31_t)0x782ddbc4, (q31_t)0x782bb1fd, (q31_t)0x782987ed, (q31_t)0x78275d92, (q31_t)0x782532ed, (q31_t)0x782307fe, (q31_t)0x7820dcc5, (q31_t)0x781eb142, + (q31_t)0x781c8575, (q31_t)0x781a595d, (q31_t)0x78182cfc, (q31_t)0x78160051, (q31_t)0x7813d35b, (q31_t)0x7811a61b, (q31_t)0x780f7892, (q31_t)0x780d4abe, + (q31_t)0x780b1ca0, (q31_t)0x7808ee38, (q31_t)0x7806bf86, (q31_t)0x7804908a, (q31_t)0x78026145, (q31_t)0x780031b5, (q31_t)0x77fe01db, (q31_t)0x77fbd1b6, + (q31_t)0x77f9a148, (q31_t)0x77f77090, (q31_t)0x77f53f8e, (q31_t)0x77f30e42, (q31_t)0x77f0dcac, (q31_t)0x77eeaacc, (q31_t)0x77ec78a2, (q31_t)0x77ea462e, + (q31_t)0x77e81370, (q31_t)0x77e5e068, (q31_t)0x77e3ad17, (q31_t)0x77e1797b, (q31_t)0x77df4595, (q31_t)0x77dd1165, (q31_t)0x77dadcec, (q31_t)0x77d8a828, + (q31_t)0x77d6731a, (q31_t)0x77d43dc3, (q31_t)0x77d20822, (q31_t)0x77cfd236, (q31_t)0x77cd9c01, (q31_t)0x77cb6582, (q31_t)0x77c92eb9, (q31_t)0x77c6f7a6, + (q31_t)0x77c4c04a, (q31_t)0x77c288a3, (q31_t)0x77c050b2, (q31_t)0x77be1878, (q31_t)0x77bbdff4, (q31_t)0x77b9a726, (q31_t)0x77b76e0e, (q31_t)0x77b534ac, + (q31_t)0x77b2fb00, (q31_t)0x77b0c10b, (q31_t)0x77ae86cc, (q31_t)0x77ac4c43, (q31_t)0x77aa1170, (q31_t)0x77a7d653, (q31_t)0x77a59aec, (q31_t)0x77a35f3c, + (q31_t)0x77a12342, (q31_t)0x779ee6fe, (q31_t)0x779caa70, (q31_t)0x779a6d99, (q31_t)0x77983077, (q31_t)0x7795f30c, (q31_t)0x7793b557, (q31_t)0x77917759, + (q31_t)0x778f3910, (q31_t)0x778cfa7e, (q31_t)0x778abba2, (q31_t)0x77887c7d, (q31_t)0x77863d0d, (q31_t)0x7783fd54, (q31_t)0x7781bd52, (q31_t)0x777f7d05, + (q31_t)0x777d3c6f, (q31_t)0x777afb8f, (q31_t)0x7778ba65, (q31_t)0x777678f2, (q31_t)0x77743735, (q31_t)0x7771f52e, (q31_t)0x776fb2de, (q31_t)0x776d7044, + (q31_t)0x776b2d60, (q31_t)0x7768ea33, (q31_t)0x7766a6bc, (q31_t)0x776462fb, (q31_t)0x77621ef1, (q31_t)0x775fda9d, (q31_t)0x775d95ff, (q31_t)0x775b5118, + (q31_t)0x77590be7, (q31_t)0x7756c66c, (q31_t)0x775480a8, (q31_t)0x77523a9b, (q31_t)0x774ff443, (q31_t)0x774dada2, (q31_t)0x774b66b8, (q31_t)0x77491f84, + (q31_t)0x7746d806, (q31_t)0x7744903f, (q31_t)0x7742482e, (q31_t)0x773fffd4, (q31_t)0x773db730, (q31_t)0x773b6e42, (q31_t)0x7739250b, (q31_t)0x7736db8b, + (q31_t)0x773491c0, (q31_t)0x773247ad, (q31_t)0x772ffd50, (q31_t)0x772db2a9, (q31_t)0x772b67b9, (q31_t)0x77291c7f, (q31_t)0x7726d0fc, (q31_t)0x7724852f, + (q31_t)0x77223919, (q31_t)0x771fecb9, (q31_t)0x771da010, (q31_t)0x771b531d, (q31_t)0x771905e1, (q31_t)0x7716b85b, (q31_t)0x77146a8c, (q31_t)0x77121c74, + (q31_t)0x770fce12, (q31_t)0x770d7f66, (q31_t)0x770b3072, (q31_t)0x7708e133, (q31_t)0x770691ab, (q31_t)0x770441da, (q31_t)0x7701f1c0, (q31_t)0x76ffa15c, + (q31_t)0x76fd50ae, (q31_t)0x76faffb8, (q31_t)0x76f8ae78, (q31_t)0x76f65cee, (q31_t)0x76f40b1b, (q31_t)0x76f1b8ff, (q31_t)0x76ef6699, (q31_t)0x76ed13ea, + (q31_t)0x76eac0f2, (q31_t)0x76e86db0, (q31_t)0x76e61a25, (q31_t)0x76e3c650, (q31_t)0x76e17233, (q31_t)0x76df1dcb, (q31_t)0x76dcc91b, (q31_t)0x76da7421, + (q31_t)0x76d81ede, (q31_t)0x76d5c952, (q31_t)0x76d3737c, (q31_t)0x76d11d5d, (q31_t)0x76cec6f5, (q31_t)0x76cc7043, (q31_t)0x76ca1948, (q31_t)0x76c7c204, + (q31_t)0x76c56a77, (q31_t)0x76c312a0, (q31_t)0x76c0ba80, (q31_t)0x76be6217, (q31_t)0x76bc0965, (q31_t)0x76b9b069, (q31_t)0x76b75724, (q31_t)0x76b4fd96, + (q31_t)0x76b2a3bf, (q31_t)0x76b0499e, (q31_t)0x76adef34, (q31_t)0x76ab9481, (q31_t)0x76a93985, (q31_t)0x76a6de40, (q31_t)0x76a482b1, (q31_t)0x76a226da, + (q31_t)0x769fcab9, (q31_t)0x769d6e4f, (q31_t)0x769b119b, (q31_t)0x7698b49f, (q31_t)0x76965759, (q31_t)0x7693f9ca, (q31_t)0x76919bf3, (q31_t)0x768f3dd2, + (q31_t)0x768cdf67, (q31_t)0x768a80b4, (q31_t)0x768821b8, (q31_t)0x7685c272, (q31_t)0x768362e4, (q31_t)0x7681030c, (q31_t)0x767ea2eb, (q31_t)0x767c4281, + (q31_t)0x7679e1ce, (q31_t)0x767780d2, (q31_t)0x76751f8d, (q31_t)0x7672bdfe, (q31_t)0x76705c27, (q31_t)0x766dfa07, (q31_t)0x766b979d, (q31_t)0x766934eb, + (q31_t)0x7666d1ef, (q31_t)0x76646eab, (q31_t)0x76620b1d, (q31_t)0x765fa747, (q31_t)0x765d4327, (q31_t)0x765adebe, (q31_t)0x76587a0d, (q31_t)0x76561512, + (q31_t)0x7653afce, (q31_t)0x76514a42, (q31_t)0x764ee46c, (q31_t)0x764c7e4d, (q31_t)0x764a17e6, (q31_t)0x7647b135, (q31_t)0x76454a3c, (q31_t)0x7642e2f9, + (q31_t)0x76407b6e, (q31_t)0x763e139a, (q31_t)0x763bab7c, (q31_t)0x76394316, (q31_t)0x7636da67, (q31_t)0x7634716f, (q31_t)0x7632082e, (q31_t)0x762f9ea4, + (q31_t)0x762d34d1, (q31_t)0x762acab6, (q31_t)0x76286051, (q31_t)0x7625f5a3, (q31_t)0x76238aad, (q31_t)0x76211f6e, (q31_t)0x761eb3e6, (q31_t)0x761c4815, + (q31_t)0x7619dbfb, (q31_t)0x76176f98, (q31_t)0x761502ed, (q31_t)0x761295f9, (q31_t)0x761028bb, (q31_t)0x760dbb35, (q31_t)0x760b4d67, (q31_t)0x7608df4f, + (q31_t)0x760670ee, (q31_t)0x76040245, (q31_t)0x76019353, (q31_t)0x75ff2418, (q31_t)0x75fcb495, (q31_t)0x75fa44c8, (q31_t)0x75f7d4b3, (q31_t)0x75f56455, + (q31_t)0x75f2f3ae, (q31_t)0x75f082bf, (q31_t)0x75ee1187, (q31_t)0x75eba006, (q31_t)0x75e92e3c, (q31_t)0x75e6bc2a, (q31_t)0x75e449ce, (q31_t)0x75e1d72b, + (q31_t)0x75df643e, (q31_t)0x75dcf109, (q31_t)0x75da7d8b, (q31_t)0x75d809c4, (q31_t)0x75d595b4, (q31_t)0x75d3215c, (q31_t)0x75d0acbc, (q31_t)0x75ce37d2, + (q31_t)0x75cbc2a0, (q31_t)0x75c94d25, (q31_t)0x75c6d762, (q31_t)0x75c46156, (q31_t)0x75c1eb01, (q31_t)0x75bf7464, (q31_t)0x75bcfd7e, (q31_t)0x75ba864f, + (q31_t)0x75b80ed8, (q31_t)0x75b59718, (q31_t)0x75b31f0f, (q31_t)0x75b0a6be, (q31_t)0x75ae2e25, (q31_t)0x75abb542, (q31_t)0x75a93c18, (q31_t)0x75a6c2a4, + (q31_t)0x75a448e8, (q31_t)0x75a1cee4, (q31_t)0x759f5496, (q31_t)0x759cda01, (q31_t)0x759a5f22, (q31_t)0x7597e3fc, (q31_t)0x7595688c, (q31_t)0x7592ecd4, + (q31_t)0x759070d4, (q31_t)0x758df48b, (q31_t)0x758b77fa, (q31_t)0x7588fb20, (q31_t)0x75867dfd, (q31_t)0x75840093, (q31_t)0x758182df, (q31_t)0x757f04e3, + (q31_t)0x757c869f, (q31_t)0x757a0812, (q31_t)0x7577893d, (q31_t)0x75750a1f, (q31_t)0x75728ab9, (q31_t)0x75700b0a, (q31_t)0x756d8b13, (q31_t)0x756b0ad3, + (q31_t)0x75688a4b, (q31_t)0x7566097b, (q31_t)0x75638862, (q31_t)0x75610701, (q31_t)0x755e8557, (q31_t)0x755c0365, (q31_t)0x7559812b, (q31_t)0x7556fea8, + (q31_t)0x75547bdd, (q31_t)0x7551f8c9, (q31_t)0x754f756e, (q31_t)0x754cf1c9, (q31_t)0x754a6ddd, (q31_t)0x7547e9a8, (q31_t)0x7545652a, (q31_t)0x7542e065, + (q31_t)0x75405b57, (q31_t)0x753dd600, (q31_t)0x753b5061, (q31_t)0x7538ca7b, (q31_t)0x7536444b, (q31_t)0x7533bdd4, (q31_t)0x75313714, (q31_t)0x752eb00c, + (q31_t)0x752c28bb, (q31_t)0x7529a122, (q31_t)0x75271941, (q31_t)0x75249118, (q31_t)0x752208a7, (q31_t)0x751f7fed, (q31_t)0x751cf6eb, (q31_t)0x751a6da0, + (q31_t)0x7517e40e, (q31_t)0x75155a33, (q31_t)0x7512d010, (q31_t)0x751045a5, (q31_t)0x750dbaf2, (q31_t)0x750b2ff6, (q31_t)0x7508a4b2, (q31_t)0x75061926, + (q31_t)0x75038d52, (q31_t)0x75010136, (q31_t)0x74fe74d1, (q31_t)0x74fbe825, (q31_t)0x74f95b30, (q31_t)0x74f6cdf3, (q31_t)0x74f4406d, (q31_t)0x74f1b2a0, + (q31_t)0x74ef248b, (q31_t)0x74ec962d, (q31_t)0x74ea0787, (q31_t)0x74e7789a, (q31_t)0x74e4e964, (q31_t)0x74e259e6, (q31_t)0x74dfca20, (q31_t)0x74dd3a11, + (q31_t)0x74daa9bb, (q31_t)0x74d8191d, (q31_t)0x74d58836, (q31_t)0x74d2f708, (q31_t)0x74d06591, (q31_t)0x74cdd3d2, (q31_t)0x74cb41cc, (q31_t)0x74c8af7d, + (q31_t)0x74c61ce6, (q31_t)0x74c38a07, (q31_t)0x74c0f6e0, (q31_t)0x74be6372, (q31_t)0x74bbcfbb, (q31_t)0x74b93bbc, (q31_t)0x74b6a775, (q31_t)0x74b412e6, + (q31_t)0x74b17e0f, (q31_t)0x74aee8f0, (q31_t)0x74ac5389, (q31_t)0x74a9bddb, (q31_t)0x74a727e4, (q31_t)0x74a491a5, (q31_t)0x74a1fb1e, (q31_t)0x749f6450, + (q31_t)0x749ccd39, (q31_t)0x749a35db, (q31_t)0x74979e34, (q31_t)0x74950646, (q31_t)0x74926e10, (q31_t)0x748fd592, (q31_t)0x748d3ccb, (q31_t)0x748aa3be, + (q31_t)0x74880a68, (q31_t)0x748570ca, (q31_t)0x7482d6e4, (q31_t)0x74803cb7, (q31_t)0x747da242, (q31_t)0x747b0784, (q31_t)0x74786c7f, (q31_t)0x7475d132, + (q31_t)0x7473359e, (q31_t)0x747099c1, (q31_t)0x746dfd9d, (q31_t)0x746b6131, (q31_t)0x7468c47c, (q31_t)0x74662781, (q31_t)0x74638a3d, (q31_t)0x7460ecb2, + (q31_t)0x745e4ede, (q31_t)0x745bb0c3, (q31_t)0x74591261, (q31_t)0x745673b6, (q31_t)0x7453d4c4, (q31_t)0x7451358a, (q31_t)0x744e9608, (q31_t)0x744bf63e, + (q31_t)0x7449562d, (q31_t)0x7446b5d4, (q31_t)0x74441533, (q31_t)0x7441744b, (q31_t)0x743ed31b, (q31_t)0x743c31a3, (q31_t)0x74398fe3, (q31_t)0x7436eddc, + (q31_t)0x74344b8d, (q31_t)0x7431a8f6, (q31_t)0x742f0618, (q31_t)0x742c62f2, (q31_t)0x7429bf84, (q31_t)0x74271bcf, (q31_t)0x742477d2, (q31_t)0x7421d38e, + (q31_t)0x741f2f01, (q31_t)0x741c8a2d, (q31_t)0x7419e512, (q31_t)0x74173faf, (q31_t)0x74149a04, (q31_t)0x7411f412, (q31_t)0x740f4dd8, (q31_t)0x740ca756, + (q31_t)0x740a008d, (q31_t)0x7407597d, (q31_t)0x7404b224, (q31_t)0x74020a85, (q31_t)0x73ff629d, (q31_t)0x73fcba6e, (q31_t)0x73fa11f8, (q31_t)0x73f7693a, + (q31_t)0x73f4c034, (q31_t)0x73f216e7, (q31_t)0x73ef6d53, (q31_t)0x73ecc377, (q31_t)0x73ea1953, (q31_t)0x73e76ee8, (q31_t)0x73e4c435, (q31_t)0x73e2193b, + (q31_t)0x73df6df9, (q31_t)0x73dcc270, (q31_t)0x73da16a0, (q31_t)0x73d76a88, (q31_t)0x73d4be28, (q31_t)0x73d21182, (q31_t)0x73cf6493, (q31_t)0x73ccb75d, + (q31_t)0x73ca09e0, (q31_t)0x73c75c1c, (q31_t)0x73c4ae10, (q31_t)0x73c1ffbc, (q31_t)0x73bf5121, (q31_t)0x73bca23f, (q31_t)0x73b9f315, (q31_t)0x73b743a4, + (q31_t)0x73b493ec, (q31_t)0x73b1e3ec, (q31_t)0x73af33a5, (q31_t)0x73ac8316, (q31_t)0x73a9d240, (q31_t)0x73a72123, (q31_t)0x73a46fbf, (q31_t)0x73a1be13, + (q31_t)0x739f0c20, (q31_t)0x739c59e5, (q31_t)0x7399a763, (q31_t)0x7396f49a, (q31_t)0x73944189, (q31_t)0x73918e32, (q31_t)0x738eda93, (q31_t)0x738c26ac, + (q31_t)0x7389727f, (q31_t)0x7386be0a, (q31_t)0x7384094e, (q31_t)0x7381544a, (q31_t)0x737e9f00, (q31_t)0x737be96e, (q31_t)0x73793395, (q31_t)0x73767d74, + (q31_t)0x7373c70d, (q31_t)0x7371105e, (q31_t)0x736e5968, (q31_t)0x736ba22b, (q31_t)0x7368eaa6, (q31_t)0x736632db, (q31_t)0x73637ac8, (q31_t)0x7360c26e, + (q31_t)0x735e09cd, (q31_t)0x735b50e4, (q31_t)0x735897b5, (q31_t)0x7355de3e, (q31_t)0x73532481, (q31_t)0x73506a7c, (q31_t)0x734db030, (q31_t)0x734af59d, + (q31_t)0x73483ac2, (q31_t)0x73457fa1, (q31_t)0x7342c438, (q31_t)0x73400889, (q31_t)0x733d4c92, (q31_t)0x733a9054, (q31_t)0x7337d3d0, (q31_t)0x73351704, + (q31_t)0x733259f1, (q31_t)0x732f9c97, (q31_t)0x732cdef6, (q31_t)0x732a210d, (q31_t)0x732762de, (q31_t)0x7324a468, (q31_t)0x7321e5ab, (q31_t)0x731f26a7, + (q31_t)0x731c675b, (q31_t)0x7319a7c9, (q31_t)0x7316e7f0, (q31_t)0x731427cf, (q31_t)0x73116768, (q31_t)0x730ea6ba, (q31_t)0x730be5c5, (q31_t)0x73092489, + (q31_t)0x73066306, (q31_t)0x7303a13b, (q31_t)0x7300df2a, (q31_t)0x72fe1cd2, (q31_t)0x72fb5a34, (q31_t)0x72f8974e, (q31_t)0x72f5d421, (q31_t)0x72f310ad, + (q31_t)0x72f04cf3, (q31_t)0x72ed88f1, (q31_t)0x72eac4a9, (q31_t)0x72e8001a, (q31_t)0x72e53b44, (q31_t)0x72e27627, (q31_t)0x72dfb0c3, (q31_t)0x72dceb18, + (q31_t)0x72da2526, (q31_t)0x72d75eee, (q31_t)0x72d4986f, (q31_t)0x72d1d1a9, (q31_t)0x72cf0a9c, (q31_t)0x72cc4348, (q31_t)0x72c97bad, (q31_t)0x72c6b3cc, + (q31_t)0x72c3eba4, (q31_t)0x72c12335, (q31_t)0x72be5a7f, (q31_t)0x72bb9183, (q31_t)0x72b8c83f, (q31_t)0x72b5feb5, (q31_t)0x72b334e4, (q31_t)0x72b06acd, + (q31_t)0x72ada06f, (q31_t)0x72aad5c9, (q31_t)0x72a80ade, (q31_t)0x72a53fab, (q31_t)0x72a27432, (q31_t)0x729fa872, (q31_t)0x729cdc6b, (q31_t)0x729a101e, + (q31_t)0x7297438a, (q31_t)0x729476af, (q31_t)0x7291a98e, (q31_t)0x728edc26, (q31_t)0x728c0e77, (q31_t)0x72894082, (q31_t)0x72867245, (q31_t)0x7283a3c3, + (q31_t)0x7280d4f9, (q31_t)0x727e05e9, (q31_t)0x727b3693, (q31_t)0x727866f6, (q31_t)0x72759712, (q31_t)0x7272c6e7, (q31_t)0x726ff676, (q31_t)0x726d25bf, + (q31_t)0x726a54c1, (q31_t)0x7267837c, (q31_t)0x7264b1f0, (q31_t)0x7261e01e, (q31_t)0x725f0e06, (q31_t)0x725c3ba7, (q31_t)0x72596901, (q31_t)0x72569615, + (q31_t)0x7253c2e3, (q31_t)0x7250ef6a, (q31_t)0x724e1baa, (q31_t)0x724b47a4, (q31_t)0x72487357, (q31_t)0x72459ec4, (q31_t)0x7242c9ea, (q31_t)0x723ff4ca, + (q31_t)0x723d1f63, (q31_t)0x723a49b6, (q31_t)0x723773c3, (q31_t)0x72349d89, (q31_t)0x7231c708, (q31_t)0x722ef041, (q31_t)0x722c1934, (q31_t)0x722941e0, + (q31_t)0x72266a46, (q31_t)0x72239266, (q31_t)0x7220ba3f, (q31_t)0x721de1d1, (q31_t)0x721b091d, (q31_t)0x72183023, (q31_t)0x721556e3, (q31_t)0x72127d5c, + (q31_t)0x720fa38e, (q31_t)0x720cc97b, (q31_t)0x7209ef21, (q31_t)0x72071480, (q31_t)0x7204399a, (q31_t)0x72015e6d, (q31_t)0x71fe82f9, (q31_t)0x71fba740, + (q31_t)0x71f8cb40, (q31_t)0x71f5eefa, (q31_t)0x71f3126d, (q31_t)0x71f0359a, (q31_t)0x71ed5881, (q31_t)0x71ea7b22, (q31_t)0x71e79d7c, (q31_t)0x71e4bf90, + (q31_t)0x71e1e15e, (q31_t)0x71df02e5, (q31_t)0x71dc2427, (q31_t)0x71d94522, (q31_t)0x71d665d6, (q31_t)0x71d38645, (q31_t)0x71d0a66d, (q31_t)0x71cdc650, + (q31_t)0x71cae5ec, (q31_t)0x71c80542, (q31_t)0x71c52451, (q31_t)0x71c2431b, (q31_t)0x71bf619e, (q31_t)0x71bc7fdb, (q31_t)0x71b99dd2, (q31_t)0x71b6bb83, + (q31_t)0x71b3d8ed, (q31_t)0x71b0f612, (q31_t)0x71ae12f0, (q31_t)0x71ab2f89, (q31_t)0x71a84bdb, (q31_t)0x71a567e7, (q31_t)0x71a283ad, (q31_t)0x719f9f2c, + (q31_t)0x719cba66, (q31_t)0x7199d55a, (q31_t)0x7196f008, (q31_t)0x71940a6f, (q31_t)0x71912490, (q31_t)0x718e3e6c, (q31_t)0x718b5801, (q31_t)0x71887151, + (q31_t)0x71858a5a, (q31_t)0x7182a31d, (q31_t)0x717fbb9a, (q31_t)0x717cd3d2, (q31_t)0x7179ebc3, (q31_t)0x7177036e, (q31_t)0x71741ad3, (q31_t)0x717131f3, + (q31_t)0x716e48cc, (q31_t)0x716b5f5f, (q31_t)0x716875ad, (q31_t)0x71658bb4, (q31_t)0x7162a175, (q31_t)0x715fb6f1, (q31_t)0x715ccc26, (q31_t)0x7159e116, + (q31_t)0x7156f5c0, (q31_t)0x71540a24, (q31_t)0x71511e42, (q31_t)0x714e321a, (q31_t)0x714b45ac, (q31_t)0x714858f8, (q31_t)0x71456bfe, (q31_t)0x71427ebf, + (q31_t)0x713f9139, (q31_t)0x713ca36e, (q31_t)0x7139b55d, (q31_t)0x7136c706, (q31_t)0x7133d869, (q31_t)0x7130e987, (q31_t)0x712dfa5e, (q31_t)0x712b0af0, + (q31_t)0x71281b3c, (q31_t)0x71252b42, (q31_t)0x71223b02, (q31_t)0x711f4a7d, (q31_t)0x711c59b2, (q31_t)0x711968a1, (q31_t)0x7116774a, (q31_t)0x711385ad, + (q31_t)0x711093cb, (q31_t)0x710da1a3, (q31_t)0x710aaf35, (q31_t)0x7107bc82, (q31_t)0x7104c989, (q31_t)0x7101d64a, (q31_t)0x70fee2c5, (q31_t)0x70fbeefb, + (q31_t)0x70f8faeb, (q31_t)0x70f60695, (q31_t)0x70f311fa, (q31_t)0x70f01d19, (q31_t)0x70ed27f2, (q31_t)0x70ea3286, (q31_t)0x70e73cd4, (q31_t)0x70e446dc, + (q31_t)0x70e1509f, (q31_t)0x70de5a1c, (q31_t)0x70db6353, (q31_t)0x70d86c45, (q31_t)0x70d574f1, (q31_t)0x70d27d58, (q31_t)0x70cf8579, (q31_t)0x70cc8d54, + (q31_t)0x70c994ea, (q31_t)0x70c69c3a, (q31_t)0x70c3a345, (q31_t)0x70c0aa0a, (q31_t)0x70bdb08a, (q31_t)0x70bab6c4, (q31_t)0x70b7bcb8, (q31_t)0x70b4c267, + (q31_t)0x70b1c7d1, (q31_t)0x70aeccf5, (q31_t)0x70abd1d3, (q31_t)0x70a8d66c, (q31_t)0x70a5dac0, (q31_t)0x70a2dece, (q31_t)0x709fe296, (q31_t)0x709ce619, + (q31_t)0x7099e957, (q31_t)0x7096ec4f, (q31_t)0x7093ef01, (q31_t)0x7090f16e, (q31_t)0x708df396, (q31_t)0x708af579, (q31_t)0x7087f715, (q31_t)0x7084f86d, + (q31_t)0x7081f97f, (q31_t)0x707efa4c, (q31_t)0x707bfad3, (q31_t)0x7078fb15, (q31_t)0x7075fb11, (q31_t)0x7072fac9, (q31_t)0x706ffa3a, (q31_t)0x706cf967, + (q31_t)0x7069f84e, (q31_t)0x7066f6f0, (q31_t)0x7063f54c, (q31_t)0x7060f363, (q31_t)0x705df135, (q31_t)0x705aeec1, (q31_t)0x7057ec08, (q31_t)0x7054e90a, + (q31_t)0x7051e5c7, (q31_t)0x704ee23e, (q31_t)0x704bde70, (q31_t)0x7048da5d, (q31_t)0x7045d604, (q31_t)0x7042d166, (q31_t)0x703fcc83, (q31_t)0x703cc75b, + (q31_t)0x7039c1ed, (q31_t)0x7036bc3b, (q31_t)0x7033b643, (q31_t)0x7030b005, (q31_t)0x702da983, (q31_t)0x702aa2bb, (q31_t)0x70279baf, (q31_t)0x7024945d, + (q31_t)0x70218cc6, (q31_t)0x701e84e9, (q31_t)0x701b7cc8, (q31_t)0x70187461, (q31_t)0x70156bb5, (q31_t)0x701262c4, (q31_t)0x700f598e, (q31_t)0x700c5013, + (q31_t)0x70094653, (q31_t)0x70063c4e, (q31_t)0x70033203, (q31_t)0x70002774, (q31_t)0x6ffd1c9f, (q31_t)0x6ffa1185, (q31_t)0x6ff70626, (q31_t)0x6ff3fa82, + (q31_t)0x6ff0ee99, (q31_t)0x6fede26b, (q31_t)0x6fead5f8, (q31_t)0x6fe7c940, (q31_t)0x6fe4bc43, (q31_t)0x6fe1af01, (q31_t)0x6fdea17a, (q31_t)0x6fdb93ae, + (q31_t)0x6fd8859d, (q31_t)0x6fd57746, (q31_t)0x6fd268ab, (q31_t)0x6fcf59cb, (q31_t)0x6fcc4aa6, (q31_t)0x6fc93b3c, (q31_t)0x6fc62b8d, (q31_t)0x6fc31b99, + (q31_t)0x6fc00b60, (q31_t)0x6fbcfae2, (q31_t)0x6fb9ea20, (q31_t)0x6fb6d918, (q31_t)0x6fb3c7cb, (q31_t)0x6fb0b63a, (q31_t)0x6fada464, (q31_t)0x6faa9248, + (q31_t)0x6fa77fe8, (q31_t)0x6fa46d43, (q31_t)0x6fa15a59, (q31_t)0x6f9e472b, (q31_t)0x6f9b33b7, (q31_t)0x6f981fff, (q31_t)0x6f950c01, (q31_t)0x6f91f7bf, + (q31_t)0x6f8ee338, (q31_t)0x6f8bce6c, (q31_t)0x6f88b95c, (q31_t)0x6f85a407, (q31_t)0x6f828e6c, (q31_t)0x6f7f788d, (q31_t)0x6f7c626a, (q31_t)0x6f794c01, + (q31_t)0x6f763554, (q31_t)0x6f731e62, (q31_t)0x6f70072b, (q31_t)0x6f6cefb0, (q31_t)0x6f69d7f0, (q31_t)0x6f66bfeb, (q31_t)0x6f63a7a1, (q31_t)0x6f608f13, + (q31_t)0x6f5d7640, (q31_t)0x6f5a5d28, (q31_t)0x6f5743cb, (q31_t)0x6f542a2a, (q31_t)0x6f511044, (q31_t)0x6f4df61a, (q31_t)0x6f4adbab, (q31_t)0x6f47c0f7, + (q31_t)0x6f44a5ff, (q31_t)0x6f418ac2, (q31_t)0x6f3e6f40, (q31_t)0x6f3b537a, (q31_t)0x6f38376f, (q31_t)0x6f351b1f, (q31_t)0x6f31fe8b, (q31_t)0x6f2ee1b2, + (q31_t)0x6f2bc495, (q31_t)0x6f28a733, (q31_t)0x6f25898d, (q31_t)0x6f226ba2, (q31_t)0x6f1f4d72, (q31_t)0x6f1c2efe, (q31_t)0x6f191045, (q31_t)0x6f15f148, + (q31_t)0x6f12d206, (q31_t)0x6f0fb280, (q31_t)0x6f0c92b6, (q31_t)0x6f0972a6, (q31_t)0x6f065253, (q31_t)0x6f0331ba, (q31_t)0x6f0010de, (q31_t)0x6efcefbd, + (q31_t)0x6ef9ce57, (q31_t)0x6ef6acad, (q31_t)0x6ef38abe, (q31_t)0x6ef0688b, (q31_t)0x6eed4614, (q31_t)0x6eea2358, (q31_t)0x6ee70058, (q31_t)0x6ee3dd13, + (q31_t)0x6ee0b98a, (q31_t)0x6edd95bd, (q31_t)0x6eda71ab, (q31_t)0x6ed74d55, (q31_t)0x6ed428ba, (q31_t)0x6ed103db, (q31_t)0x6ecddeb8, (q31_t)0x6ecab950, + (q31_t)0x6ec793a4, (q31_t)0x6ec46db4, (q31_t)0x6ec1477f, (q31_t)0x6ebe2106, (q31_t)0x6ebafa49, (q31_t)0x6eb7d347, (q31_t)0x6eb4ac02, (q31_t)0x6eb18477, + (q31_t)0x6eae5ca9, (q31_t)0x6eab3496, (q31_t)0x6ea80c3f, (q31_t)0x6ea4e3a4, (q31_t)0x6ea1bac4, (q31_t)0x6e9e91a1, (q31_t)0x6e9b6839, (q31_t)0x6e983e8d, + (q31_t)0x6e95149c, (q31_t)0x6e91ea67, (q31_t)0x6e8ebfef, (q31_t)0x6e8b9532, (q31_t)0x6e886a30, (q31_t)0x6e853eeb, (q31_t)0x6e821361, (q31_t)0x6e7ee794, + (q31_t)0x6e7bbb82, (q31_t)0x6e788f2c, (q31_t)0x6e756291, (q31_t)0x6e7235b3, (q31_t)0x6e6f0890, (q31_t)0x6e6bdb2a, (q31_t)0x6e68ad7f, (q31_t)0x6e657f90, + (q31_t)0x6e62515d, (q31_t)0x6e5f22e6, (q31_t)0x6e5bf42b, (q31_t)0x6e58c52c, (q31_t)0x6e5595e9, (q31_t)0x6e526662, (q31_t)0x6e4f3696, (q31_t)0x6e4c0687, + (q31_t)0x6e48d633, (q31_t)0x6e45a59c, (q31_t)0x6e4274c1, (q31_t)0x6e3f43a1, (q31_t)0x6e3c123e, (q31_t)0x6e38e096, (q31_t)0x6e35aeab, (q31_t)0x6e327c7b, + (q31_t)0x6e2f4a08, (q31_t)0x6e2c1750, (q31_t)0x6e28e455, (q31_t)0x6e25b115, (q31_t)0x6e227d92, (q31_t)0x6e1f49cb, (q31_t)0x6e1c15c0, (q31_t)0x6e18e171, + (q31_t)0x6e15acde, (q31_t)0x6e127807, (q31_t)0x6e0f42ec, (q31_t)0x6e0c0d8e, (q31_t)0x6e08d7eb, (q31_t)0x6e05a205, (q31_t)0x6e026bda, (q31_t)0x6dff356c, + (q31_t)0x6dfbfeba, (q31_t)0x6df8c7c4, (q31_t)0x6df5908b, (q31_t)0x6df2590d, (q31_t)0x6def214c, (q31_t)0x6debe947, (q31_t)0x6de8b0fe, (q31_t)0x6de57871, + (q31_t)0x6de23fa0, (q31_t)0x6ddf068c, (q31_t)0x6ddbcd34, (q31_t)0x6dd89398, (q31_t)0x6dd559b9, (q31_t)0x6dd21f95, (q31_t)0x6dcee52e, (q31_t)0x6dcbaa83, + (q31_t)0x6dc86f95, (q31_t)0x6dc53462, (q31_t)0x6dc1f8ec, (q31_t)0x6dbebd33, (q31_t)0x6dbb8135, (q31_t)0x6db844f4, (q31_t)0x6db5086f, (q31_t)0x6db1cba7, + (q31_t)0x6dae8e9b, (q31_t)0x6dab514b, (q31_t)0x6da813b8, (q31_t)0x6da4d5e1, (q31_t)0x6da197c6, (q31_t)0x6d9e5968, (q31_t)0x6d9b1ac6, (q31_t)0x6d97dbe0, + (q31_t)0x6d949cb7, (q31_t)0x6d915d4a, (q31_t)0x6d8e1d9a, (q31_t)0x6d8adda6, (q31_t)0x6d879d6e, (q31_t)0x6d845cf3, (q31_t)0x6d811c35, (q31_t)0x6d7ddb33, + (q31_t)0x6d7a99ed, (q31_t)0x6d775864, (q31_t)0x6d741697, (q31_t)0x6d70d487, (q31_t)0x6d6d9233, (q31_t)0x6d6a4f9c, (q31_t)0x6d670cc1, (q31_t)0x6d63c9a3, + (q31_t)0x6d608641, (q31_t)0x6d5d429c, (q31_t)0x6d59feb3, (q31_t)0x6d56ba87, (q31_t)0x6d537617, (q31_t)0x6d503164, (q31_t)0x6d4cec6e, (q31_t)0x6d49a734, + (q31_t)0x6d4661b7, (q31_t)0x6d431bf6, (q31_t)0x6d3fd5f2, (q31_t)0x6d3c8fab, (q31_t)0x6d394920, (q31_t)0x6d360252, (q31_t)0x6d32bb40, (q31_t)0x6d2f73eb, + (q31_t)0x6d2c2c53, (q31_t)0x6d28e477, (q31_t)0x6d259c58, (q31_t)0x6d2253f6, (q31_t)0x6d1f0b50, (q31_t)0x6d1bc267, (q31_t)0x6d18793b, (q31_t)0x6d152fcc, + (q31_t)0x6d11e619, (q31_t)0x6d0e9c23, (q31_t)0x6d0b51e9, (q31_t)0x6d08076d, (q31_t)0x6d04bcad, (q31_t)0x6d0171aa, (q31_t)0x6cfe2663, (q31_t)0x6cfadada, + (q31_t)0x6cf78f0d, (q31_t)0x6cf442fd, (q31_t)0x6cf0f6aa, (q31_t)0x6cedaa13, (q31_t)0x6cea5d3a, (q31_t)0x6ce7101d, (q31_t)0x6ce3c2bd, (q31_t)0x6ce0751a, + (q31_t)0x6cdd2733, (q31_t)0x6cd9d90a, (q31_t)0x6cd68a9d, (q31_t)0x6cd33bed, (q31_t)0x6ccfecfa, (q31_t)0x6ccc9dc4, (q31_t)0x6cc94e4b, (q31_t)0x6cc5fe8f, + (q31_t)0x6cc2ae90, (q31_t)0x6cbf5e4d, (q31_t)0x6cbc0dc8, (q31_t)0x6cb8bcff, (q31_t)0x6cb56bf4, (q31_t)0x6cb21aa5, (q31_t)0x6caec913, (q31_t)0x6cab773e, + (q31_t)0x6ca82527, (q31_t)0x6ca4d2cc, (q31_t)0x6ca1802e, (q31_t)0x6c9e2d4d, (q31_t)0x6c9ada29, (q31_t)0x6c9786c2, (q31_t)0x6c943318, (q31_t)0x6c90df2c, + (q31_t)0x6c8d8afc, (q31_t)0x6c8a3689, (q31_t)0x6c86e1d3, (q31_t)0x6c838cdb, (q31_t)0x6c80379f, (q31_t)0x6c7ce220, (q31_t)0x6c798c5f, (q31_t)0x6c76365b, + (q31_t)0x6c72e013, (q31_t)0x6c6f8989, (q31_t)0x6c6c32bc, (q31_t)0x6c68dbac, (q31_t)0x6c658459, (q31_t)0x6c622cc4, (q31_t)0x6c5ed4eb, (q31_t)0x6c5b7cd0, + (q31_t)0x6c582472, (q31_t)0x6c54cbd1, (q31_t)0x6c5172ed, (q31_t)0x6c4e19c6, (q31_t)0x6c4ac05d, (q31_t)0x6c4766b0, (q31_t)0x6c440cc1, (q31_t)0x6c40b28f, + (q31_t)0x6c3d581b, (q31_t)0x6c39fd63, (q31_t)0x6c36a269, (q31_t)0x6c33472c, (q31_t)0x6c2febad, (q31_t)0x6c2c8fea, (q31_t)0x6c2933e5, (q31_t)0x6c25d79d, + (q31_t)0x6c227b13, (q31_t)0x6c1f1e45, (q31_t)0x6c1bc136, (q31_t)0x6c1863e3, (q31_t)0x6c15064e, (q31_t)0x6c11a876, (q31_t)0x6c0e4a5b, (q31_t)0x6c0aebfe, + (q31_t)0x6c078d5e, (q31_t)0x6c042e7b, (q31_t)0x6c00cf56, (q31_t)0x6bfd6fee, (q31_t)0x6bfa1044, (q31_t)0x6bf6b056, (q31_t)0x6bf35027, (q31_t)0x6befefb5, + (q31_t)0x6bec8f00, (q31_t)0x6be92e08, (q31_t)0x6be5ccce, (q31_t)0x6be26b52, (q31_t)0x6bdf0993, (q31_t)0x6bdba791, (q31_t)0x6bd8454d, (q31_t)0x6bd4e2c6, + (q31_t)0x6bd17ffd, (q31_t)0x6bce1cf1, (q31_t)0x6bcab9a3, (q31_t)0x6bc75613, (q31_t)0x6bc3f23f, (q31_t)0x6bc08e2a, (q31_t)0x6bbd29d2, (q31_t)0x6bb9c537, + (q31_t)0x6bb6605a, (q31_t)0x6bb2fb3b, (q31_t)0x6baf95d9, (q31_t)0x6bac3034, (q31_t)0x6ba8ca4e, (q31_t)0x6ba56425, (q31_t)0x6ba1fdb9, (q31_t)0x6b9e970b, + (q31_t)0x6b9b301b, (q31_t)0x6b97c8e8, (q31_t)0x6b946173, (q31_t)0x6b90f9bc, (q31_t)0x6b8d91c2, (q31_t)0x6b8a2986, (q31_t)0x6b86c107, (q31_t)0x6b835846, + (q31_t)0x6b7fef43, (q31_t)0x6b7c85fe, (q31_t)0x6b791c76, (q31_t)0x6b75b2ac, (q31_t)0x6b7248a0, (q31_t)0x6b6ede51, (q31_t)0x6b6b73c0, (q31_t)0x6b6808ed, + (q31_t)0x6b649dd8, (q31_t)0x6b613280, (q31_t)0x6b5dc6e6, (q31_t)0x6b5a5b0a, (q31_t)0x6b56eeec, (q31_t)0x6b53828b, (q31_t)0x6b5015e9, (q31_t)0x6b4ca904, + (q31_t)0x6b493bdd, (q31_t)0x6b45ce73, (q31_t)0x6b4260c8, (q31_t)0x6b3ef2da, (q31_t)0x6b3b84ab, (q31_t)0x6b381639, (q31_t)0x6b34a785, (q31_t)0x6b31388e, + (q31_t)0x6b2dc956, (q31_t)0x6b2a59dc, (q31_t)0x6b26ea1f, (q31_t)0x6b237a21, (q31_t)0x6b2009e0, (q31_t)0x6b1c995d, (q31_t)0x6b192898, (q31_t)0x6b15b791, + (q31_t)0x6b124648, (q31_t)0x6b0ed4bd, (q31_t)0x6b0b62f0, (q31_t)0x6b07f0e1, (q31_t)0x6b047e90, (q31_t)0x6b010bfd, (q31_t)0x6afd9928, (q31_t)0x6afa2610, + (q31_t)0x6af6b2b7, (q31_t)0x6af33f1c, (q31_t)0x6aefcb3f, (q31_t)0x6aec5720, (q31_t)0x6ae8e2bf, (q31_t)0x6ae56e1c, (q31_t)0x6ae1f937, (q31_t)0x6ade8410, + (q31_t)0x6adb0ea8, (q31_t)0x6ad798fd, (q31_t)0x6ad42311, (q31_t)0x6ad0ace2, (q31_t)0x6acd3672, (q31_t)0x6ac9bfc0, (q31_t)0x6ac648cb, (q31_t)0x6ac2d195, + (q31_t)0x6abf5a1e, (q31_t)0x6abbe264, (q31_t)0x6ab86a68, (q31_t)0x6ab4f22b, (q31_t)0x6ab179ac, (q31_t)0x6aae00eb, (q31_t)0x6aaa87e8, (q31_t)0x6aa70ea4, + (q31_t)0x6aa3951d, (q31_t)0x6aa01b55, (q31_t)0x6a9ca14b, (q31_t)0x6a992700, (q31_t)0x6a95ac72, (q31_t)0x6a9231a3, (q31_t)0x6a8eb692, (q31_t)0x6a8b3b3f, + (q31_t)0x6a87bfab, (q31_t)0x6a8443d5, (q31_t)0x6a80c7bd, (q31_t)0x6a7d4b64, (q31_t)0x6a79cec8, (q31_t)0x6a7651ec, (q31_t)0x6a72d4cd, (q31_t)0x6a6f576d, + (q31_t)0x6a6bd9cb, (q31_t)0x6a685be8, (q31_t)0x6a64ddc2, (q31_t)0x6a615f5c, (q31_t)0x6a5de0b3, (q31_t)0x6a5a61c9, (q31_t)0x6a56e29e, (q31_t)0x6a536331, + (q31_t)0x6a4fe382, (q31_t)0x6a4c6391, (q31_t)0x6a48e360, (q31_t)0x6a4562ec, (q31_t)0x6a41e237, (q31_t)0x6a3e6140, (q31_t)0x6a3ae008, (q31_t)0x6a375e8f, + (q31_t)0x6a33dcd4, (q31_t)0x6a305ad7, (q31_t)0x6a2cd899, (q31_t)0x6a295619, (q31_t)0x6a25d358, (q31_t)0x6a225055, (q31_t)0x6a1ecd11, (q31_t)0x6a1b498c, + (q31_t)0x6a17c5c5, (q31_t)0x6a1441bc, (q31_t)0x6a10bd72, (q31_t)0x6a0d38e7, (q31_t)0x6a09b41a, (q31_t)0x6a062f0c, (q31_t)0x6a02a9bc, (q31_t)0x69ff242b, + (q31_t)0x69fb9e59, (q31_t)0x69f81845, (q31_t)0x69f491f0, (q31_t)0x69f10b5a, (q31_t)0x69ed8482, (q31_t)0x69e9fd69, (q31_t)0x69e6760f, (q31_t)0x69e2ee73, + (q31_t)0x69df6696, (q31_t)0x69dbde77, (q31_t)0x69d85618, (q31_t)0x69d4cd77, (q31_t)0x69d14494, (q31_t)0x69cdbb71, (q31_t)0x69ca320c, (q31_t)0x69c6a866, + (q31_t)0x69c31e7f, (q31_t)0x69bf9456, (q31_t)0x69bc09ec, (q31_t)0x69b87f41, (q31_t)0x69b4f455, (q31_t)0x69b16928, (q31_t)0x69adddb9, (q31_t)0x69aa5209, + (q31_t)0x69a6c618, (q31_t)0x69a339e6, (q31_t)0x699fad73, (q31_t)0x699c20be, (q31_t)0x699893c9, (q31_t)0x69950692, (q31_t)0x6991791a, (q31_t)0x698deb61, + (q31_t)0x698a5d67, (q31_t)0x6986cf2c, (q31_t)0x698340af, (q31_t)0x697fb1f2, (q31_t)0x697c22f3, (q31_t)0x697893b4, (q31_t)0x69750433, (q31_t)0x69717472, + (q31_t)0x696de46f, (q31_t)0x696a542b, (q31_t)0x6966c3a6, (q31_t)0x696332e1, (q31_t)0x695fa1da, (q31_t)0x695c1092, (q31_t)0x69587f09, (q31_t)0x6954ed40, + (q31_t)0x69515b35, (q31_t)0x694dc8e9, (q31_t)0x694a365c, (q31_t)0x6946a38f, (q31_t)0x69431080, (q31_t)0x693f7d31, (q31_t)0x693be9a0, (q31_t)0x693855cf, + (q31_t)0x6934c1bd, (q31_t)0x69312d6a, (q31_t)0x692d98d6, (q31_t)0x692a0401, (q31_t)0x69266eeb, (q31_t)0x6922d995, (q31_t)0x691f43fd, (q31_t)0x691bae25, + (q31_t)0x6918180c, (q31_t)0x691481b2, (q31_t)0x6910eb17, (q31_t)0x690d543b, (q31_t)0x6909bd1f, (q31_t)0x690625c2, (q31_t)0x69028e24, (q31_t)0x68fef645, + (q31_t)0x68fb5e25, (q31_t)0x68f7c5c5, (q31_t)0x68f42d24, (q31_t)0x68f09442, (q31_t)0x68ecfb20, (q31_t)0x68e961bd, (q31_t)0x68e5c819, (q31_t)0x68e22e34, + (q31_t)0x68de940f, (q31_t)0x68daf9a9, (q31_t)0x68d75f02, (q31_t)0x68d3c41b, (q31_t)0x68d028f2, (q31_t)0x68cc8d8a, (q31_t)0x68c8f1e0, (q31_t)0x68c555f6, + (q31_t)0x68c1b9cc, (q31_t)0x68be1d61, (q31_t)0x68ba80b5, (q31_t)0x68b6e3c8, (q31_t)0x68b3469b, (q31_t)0x68afa92e, (q31_t)0x68ac0b7f, (q31_t)0x68a86d91, + (q31_t)0x68a4cf61, (q31_t)0x68a130f1, (q31_t)0x689d9241, (q31_t)0x6899f350, (q31_t)0x6896541f, (q31_t)0x6892b4ad, (q31_t)0x688f14fa, (q31_t)0x688b7507, + (q31_t)0x6887d4d4, (q31_t)0x68843460, (q31_t)0x688093ab, (q31_t)0x687cf2b6, (q31_t)0x68795181, (q31_t)0x6875b00b, (q31_t)0x68720e55, (q31_t)0x686e6c5e, + (q31_t)0x686aca27, (q31_t)0x686727b0, (q31_t)0x686384f8, (q31_t)0x685fe200, (q31_t)0x685c3ec7, (q31_t)0x68589b4e, (q31_t)0x6854f795, (q31_t)0x6851539b, + (q31_t)0x684daf61, (q31_t)0x684a0ae6, (q31_t)0x6846662c, (q31_t)0x6842c131, (q31_t)0x683f1bf5, (q31_t)0x683b7679, (q31_t)0x6837d0bd, (q31_t)0x68342ac1, + (q31_t)0x68308485, (q31_t)0x682cde08, (q31_t)0x6829374b, (q31_t)0x6825904d, (q31_t)0x6821e910, (q31_t)0x681e4192, (q31_t)0x681a99d4, (q31_t)0x6816f1d6, + (q31_t)0x68134997, (q31_t)0x680fa118, (q31_t)0x680bf85a, (q31_t)0x68084f5a, (q31_t)0x6804a61b, (q31_t)0x6800fc9c, (q31_t)0x67fd52dc, (q31_t)0x67f9a8dd, + (q31_t)0x67f5fe9d, (q31_t)0x67f2541d, (q31_t)0x67eea95d, (q31_t)0x67eafe5d, (q31_t)0x67e7531c, (q31_t)0x67e3a79c, (q31_t)0x67dffbdc, (q31_t)0x67dc4fdb, + (q31_t)0x67d8a39a, (q31_t)0x67d4f71a, (q31_t)0x67d14a59, (q31_t)0x67cd9d58, (q31_t)0x67c9f017, (q31_t)0x67c64297, (q31_t)0x67c294d6, (q31_t)0x67bee6d5, + (q31_t)0x67bb3894, (q31_t)0x67b78a13, (q31_t)0x67b3db53, (q31_t)0x67b02c52, (q31_t)0x67ac7d11, (q31_t)0x67a8cd91, (q31_t)0x67a51dd0, (q31_t)0x67a16dcf, + (q31_t)0x679dbd8f, (q31_t)0x679a0d0f, (q31_t)0x67965c4e, (q31_t)0x6792ab4e, (q31_t)0x678efa0e, (q31_t)0x678b488e, (q31_t)0x678796ce, (q31_t)0x6783e4cf, + (q31_t)0x6780328f, (q31_t)0x677c8010, (q31_t)0x6778cd50, (q31_t)0x67751a51, (q31_t)0x67716713, (q31_t)0x676db394, (q31_t)0x6769ffd5, (q31_t)0x67664bd7, + (q31_t)0x67629799, (q31_t)0x675ee31b, (q31_t)0x675b2e5e, (q31_t)0x67577960, (q31_t)0x6753c423, (q31_t)0x67500ea7, (q31_t)0x674c58ea, (q31_t)0x6748a2ee, + (q31_t)0x6744ecb2, (q31_t)0x67413636, (q31_t)0x673d7f7b, (q31_t)0x6739c880, (q31_t)0x67361145, (q31_t)0x673259ca, (q31_t)0x672ea210, (q31_t)0x672aea17, + (q31_t)0x672731dd, (q31_t)0x67237964, (q31_t)0x671fc0ac, (q31_t)0x671c07b4, (q31_t)0x67184e7c, (q31_t)0x67149504, (q31_t)0x6710db4d, (q31_t)0x670d2157, + (q31_t)0x67096721, (q31_t)0x6705acab, (q31_t)0x6701f1f6, (q31_t)0x66fe3701, (q31_t)0x66fa7bcd, (q31_t)0x66f6c059, (q31_t)0x66f304a6, (q31_t)0x66ef48b3, + (q31_t)0x66eb8c80, (q31_t)0x66e7d00f, (q31_t)0x66e4135d, (q31_t)0x66e0566c, (q31_t)0x66dc993c, (q31_t)0x66d8dbcd, (q31_t)0x66d51e1d, (q31_t)0x66d1602f, + (q31_t)0x66cda201, (q31_t)0x66c9e393, (q31_t)0x66c624e7, (q31_t)0x66c265fa, (q31_t)0x66bea6cf, (q31_t)0x66bae764, (q31_t)0x66b727ba, (q31_t)0x66b367d0, + (q31_t)0x66afa7a7, (q31_t)0x66abe73f, (q31_t)0x66a82697, (q31_t)0x66a465b0, (q31_t)0x66a0a489, (q31_t)0x669ce324, (q31_t)0x6699217f, (q31_t)0x66955f9b, + (q31_t)0x66919d77, (q31_t)0x668ddb14, (q31_t)0x668a1872, (q31_t)0x66865591, (q31_t)0x66829270, (q31_t)0x667ecf11, (q31_t)0x667b0b72, (q31_t)0x66774793, + (q31_t)0x66738376, (q31_t)0x666fbf19, (q31_t)0x666bfa7d, (q31_t)0x666835a2, (q31_t)0x66647088, (q31_t)0x6660ab2f, (q31_t)0x665ce596, (q31_t)0x66591fbf, + (q31_t)0x665559a8, (q31_t)0x66519352, (q31_t)0x664dccbd, (q31_t)0x664a05e9, (q31_t)0x66463ed6, (q31_t)0x66427784, (q31_t)0x663eaff2, (q31_t)0x663ae822, + (q31_t)0x66372012, (q31_t)0x663357c4, (q31_t)0x662f8f36, (q31_t)0x662bc66a, (q31_t)0x6627fd5e, (q31_t)0x66243413, (q31_t)0x66206a8a, (q31_t)0x661ca0c1, + (q31_t)0x6618d6b9, (q31_t)0x66150c73, (q31_t)0x661141ed, (q31_t)0x660d7729, (q31_t)0x6609ac25, (q31_t)0x6605e0e3, (q31_t)0x66021561, (q31_t)0x65fe49a1, + (q31_t)0x65fa7da2, (q31_t)0x65f6b164, (q31_t)0x65f2e4e7, (q31_t)0x65ef182b, (q31_t)0x65eb4b30, (q31_t)0x65e77df6, (q31_t)0x65e3b07e, (q31_t)0x65dfe2c6, + (q31_t)0x65dc14d0, (q31_t)0x65d8469b, (q31_t)0x65d47827, (q31_t)0x65d0a975, (q31_t)0x65ccda83, (q31_t)0x65c90b53, (q31_t)0x65c53be4, (q31_t)0x65c16c36, + (q31_t)0x65bd9c49, (q31_t)0x65b9cc1e, (q31_t)0x65b5fbb4, (q31_t)0x65b22b0b, (q31_t)0x65ae5a23, (q31_t)0x65aa88fd, (q31_t)0x65a6b798, (q31_t)0x65a2e5f4, + (q31_t)0x659f1412, (q31_t)0x659b41f1, (q31_t)0x65976f91, (q31_t)0x65939cf3, (q31_t)0x658fca15, (q31_t)0x658bf6fa, (q31_t)0x6588239f, (q31_t)0x65845006, + (q31_t)0x65807c2f, (q31_t)0x657ca818, (q31_t)0x6578d3c4, (q31_t)0x6574ff30, (q31_t)0x65712a5e, (q31_t)0x656d554d, (q31_t)0x65697ffe, (q31_t)0x6565aa71, + (q31_t)0x6561d4a4, (q31_t)0x655dfe99, (q31_t)0x655a2850, (q31_t)0x655651c8, (q31_t)0x65527b02, (q31_t)0x654ea3fd, (q31_t)0x654accba, (q31_t)0x6546f538, + (q31_t)0x65431d77, (q31_t)0x653f4579, (q31_t)0x653b6d3b, (q31_t)0x653794c0, (q31_t)0x6533bc06, (q31_t)0x652fe30d, (q31_t)0x652c09d6, (q31_t)0x65283061, + (q31_t)0x652456ad, (q31_t)0x65207cbb, (q31_t)0x651ca28a, (q31_t)0x6518c81b, (q31_t)0x6514ed6e, (q31_t)0x65111283, (q31_t)0x650d3759, (q31_t)0x65095bf0, + (q31_t)0x6505804a, (q31_t)0x6501a465, (q31_t)0x64fdc841, (q31_t)0x64f9ebe0, (q31_t)0x64f60f40, (q31_t)0x64f23262, (q31_t)0x64ee5546, (q31_t)0x64ea77eb, + (q31_t)0x64e69a52, (q31_t)0x64e2bc7b, (q31_t)0x64dede66, (q31_t)0x64db0012, (q31_t)0x64d72180, (q31_t)0x64d342b0, (q31_t)0x64cf63a2, (q31_t)0x64cb8456, + (q31_t)0x64c7a4cb, (q31_t)0x64c3c502, (q31_t)0x64bfe4fc, (q31_t)0x64bc04b6, (q31_t)0x64b82433, (q31_t)0x64b44372, (q31_t)0x64b06273, (q31_t)0x64ac8135, + (q31_t)0x64a89fba, (q31_t)0x64a4be00, (q31_t)0x64a0dc08, (q31_t)0x649cf9d2, (q31_t)0x6499175e, (q31_t)0x649534ac, (q31_t)0x649151bc, (q31_t)0x648d6e8e, + (q31_t)0x64898b22, (q31_t)0x6485a778, (q31_t)0x6481c390, (q31_t)0x647ddf6a, (q31_t)0x6479fb06, (q31_t)0x64761664, (q31_t)0x64723184, (q31_t)0x646e4c66, + (q31_t)0x646a670a, (q31_t)0x64668170, (q31_t)0x64629b98, (q31_t)0x645eb582, (q31_t)0x645acf2e, (q31_t)0x6456e89d, (q31_t)0x645301cd, (q31_t)0x644f1ac0, + (q31_t)0x644b3375, (q31_t)0x64474bec, (q31_t)0x64436425, (q31_t)0x643f7c20, (q31_t)0x643b93dd, (q31_t)0x6437ab5d, (q31_t)0x6433c29f, (q31_t)0x642fd9a3, + (q31_t)0x642bf069, (q31_t)0x642806f1, (q31_t)0x64241d3c, (q31_t)0x64203348, (q31_t)0x641c4917, (q31_t)0x64185ea9, (q31_t)0x641473fc, (q31_t)0x64108912, + (q31_t)0x640c9dea, (q31_t)0x6408b284, (q31_t)0x6404c6e1, (q31_t)0x6400db00, (q31_t)0x63fceee1, (q31_t)0x63f90285, (q31_t)0x63f515eb, (q31_t)0x63f12913, + (q31_t)0x63ed3bfd, (q31_t)0x63e94eaa, (q31_t)0x63e5611a, (q31_t)0x63e1734b, (q31_t)0x63dd853f, (q31_t)0x63d996f6, (q31_t)0x63d5a86f, (q31_t)0x63d1b9aa, + (q31_t)0x63cdcaa8, (q31_t)0x63c9db68, (q31_t)0x63c5ebeb, (q31_t)0x63c1fc30, (q31_t)0x63be0c37, (q31_t)0x63ba1c01, (q31_t)0x63b62b8e, (q31_t)0x63b23add, + (q31_t)0x63ae49ee, (q31_t)0x63aa58c2, (q31_t)0x63a66759, (q31_t)0x63a275b2, (q31_t)0x639e83cd, (q31_t)0x639a91ac, (q31_t)0x63969f4c, (q31_t)0x6392acaf, + (q31_t)0x638eb9d5, (q31_t)0x638ac6be, (q31_t)0x6386d369, (q31_t)0x6382dfd6, (q31_t)0x637eec07, (q31_t)0x637af7fa, (q31_t)0x637703af, (q31_t)0x63730f27, + (q31_t)0x636f1a62, (q31_t)0x636b2560, (q31_t)0x63673020, (q31_t)0x63633aa3, (q31_t)0x635f44e8, (q31_t)0x635b4ef0, (q31_t)0x635758bb, (q31_t)0x63536249, + (q31_t)0x634f6b99, (q31_t)0x634b74ad, (q31_t)0x63477d82, (q31_t)0x6343861b, (q31_t)0x633f8e76, (q31_t)0x633b9695, (q31_t)0x63379e76, (q31_t)0x6333a619, + (q31_t)0x632fad80, (q31_t)0x632bb4a9, (q31_t)0x6327bb96, (q31_t)0x6323c245, (q31_t)0x631fc8b7, (q31_t)0x631bceeb, (q31_t)0x6317d4e3, (q31_t)0x6313da9e, + (q31_t)0x630fe01b, (q31_t)0x630be55b, (q31_t)0x6307ea5e, (q31_t)0x6303ef25, (q31_t)0x62fff3ae, (q31_t)0x62fbf7fa, (q31_t)0x62f7fc08, (q31_t)0x62f3ffda, + (q31_t)0x62f0036f, (q31_t)0x62ec06c7, (q31_t)0x62e809e2, (q31_t)0x62e40cbf, (q31_t)0x62e00f60, (q31_t)0x62dc11c4, (q31_t)0x62d813eb, (q31_t)0x62d415d4, + (q31_t)0x62d01781, (q31_t)0x62cc18f1, (q31_t)0x62c81a24, (q31_t)0x62c41b1a, (q31_t)0x62c01bd3, (q31_t)0x62bc1c4f, (q31_t)0x62b81c8f, (q31_t)0x62b41c91, + (q31_t)0x62b01c57, (q31_t)0x62ac1bdf, (q31_t)0x62a81b2b, (q31_t)0x62a41a3a, (q31_t)0x62a0190c, (q31_t)0x629c17a1, (q31_t)0x629815fa, (q31_t)0x62941415, + (q31_t)0x629011f4, (q31_t)0x628c0f96, (q31_t)0x62880cfb, (q31_t)0x62840a23, (q31_t)0x6280070f, (q31_t)0x627c03be, (q31_t)0x62780030, (q31_t)0x6273fc65, + (q31_t)0x626ff85e, (q31_t)0x626bf41a, (q31_t)0x6267ef99, (q31_t)0x6263eadc, (q31_t)0x625fe5e1, (q31_t)0x625be0ab, (q31_t)0x6257db37, (q31_t)0x6253d587, + (q31_t)0x624fcf9a, (q31_t)0x624bc970, (q31_t)0x6247c30a, (q31_t)0x6243bc68, (q31_t)0x623fb588, (q31_t)0x623bae6c, (q31_t)0x6237a714, (q31_t)0x62339f7e, + (q31_t)0x622f97ad, (q31_t)0x622b8f9e, (q31_t)0x62278754, (q31_t)0x62237ecc, (q31_t)0x621f7608, (q31_t)0x621b6d08, (q31_t)0x621763cb, (q31_t)0x62135a51, + (q31_t)0x620f509b, (q31_t)0x620b46a9, (q31_t)0x62073c7a, (q31_t)0x6203320e, (q31_t)0x61ff2766, (q31_t)0x61fb1c82, (q31_t)0x61f71161, (q31_t)0x61f30604, + (q31_t)0x61eefa6b, (q31_t)0x61eaee95, (q31_t)0x61e6e282, (q31_t)0x61e2d633, (q31_t)0x61dec9a8, (q31_t)0x61dabce0, (q31_t)0x61d6afdd, (q31_t)0x61d2a29c, + (q31_t)0x61ce9520, (q31_t)0x61ca8767, (q31_t)0x61c67971, (q31_t)0x61c26b40, (q31_t)0x61be5cd2, (q31_t)0x61ba4e28, (q31_t)0x61b63f41, (q31_t)0x61b2301e, + (q31_t)0x61ae20bf, (q31_t)0x61aa1124, (q31_t)0x61a6014d, (q31_t)0x61a1f139, (q31_t)0x619de0e9, (q31_t)0x6199d05d, (q31_t)0x6195bf94, (q31_t)0x6191ae90, + (q31_t)0x618d9d4f, (q31_t)0x61898bd2, (q31_t)0x61857a19, (q31_t)0x61816824, (q31_t)0x617d55f2, (q31_t)0x61794385, (q31_t)0x617530db, (q31_t)0x61711df5, + (q31_t)0x616d0ad3, (q31_t)0x6168f775, (q31_t)0x6164e3db, (q31_t)0x6160d005, (q31_t)0x615cbbf3, (q31_t)0x6158a7a4, (q31_t)0x6154931a, (q31_t)0x61507e54, + (q31_t)0x614c6951, (q31_t)0x61485413, (q31_t)0x61443e98, (q31_t)0x614028e2, (q31_t)0x613c12f0, (q31_t)0x6137fcc1, (q31_t)0x6133e657, (q31_t)0x612fcfb0, + (q31_t)0x612bb8ce, (q31_t)0x6127a1b0, (q31_t)0x61238a56, (q31_t)0x611f72c0, (q31_t)0x611b5aee, (q31_t)0x611742e0, (q31_t)0x61132a96, (q31_t)0x610f1210, + (q31_t)0x610af94f, (q31_t)0x6106e051, (q31_t)0x6102c718, (q31_t)0x60feada3, (q31_t)0x60fa93f2, (q31_t)0x60f67a05, (q31_t)0x60f25fdd, (q31_t)0x60ee4579, + (q31_t)0x60ea2ad8, (q31_t)0x60e60ffd, (q31_t)0x60e1f4e5, (q31_t)0x60ddd991, (q31_t)0x60d9be02, (q31_t)0x60d5a237, (q31_t)0x60d18631, (q31_t)0x60cd69ee, + (q31_t)0x60c94d70, (q31_t)0x60c530b6, (q31_t)0x60c113c1, (q31_t)0x60bcf690, (q31_t)0x60b8d923, (q31_t)0x60b4bb7a, (q31_t)0x60b09d96, (q31_t)0x60ac7f76, + (q31_t)0x60a8611b, (q31_t)0x60a44284, (q31_t)0x60a023b1, (q31_t)0x609c04a3, (q31_t)0x6097e559, (q31_t)0x6093c5d3, (q31_t)0x608fa612, (q31_t)0x608b8616, + (q31_t)0x608765dd, (q31_t)0x6083456a, (q31_t)0x607f24ba, (q31_t)0x607b03d0, (q31_t)0x6076e2a9, (q31_t)0x6072c148, (q31_t)0x606e9faa, (q31_t)0x606a7dd2, + (q31_t)0x60665bbd, (q31_t)0x6062396e, (q31_t)0x605e16e2, (q31_t)0x6059f41c, (q31_t)0x6055d11a, (q31_t)0x6051addc, (q31_t)0x604d8a63, (q31_t)0x604966af, + (q31_t)0x604542bf, (q31_t)0x60411e94, (q31_t)0x603cfa2e, (q31_t)0x6038d58c, (q31_t)0x6034b0af, (q31_t)0x60308b97, (q31_t)0x602c6643, (q31_t)0x602840b4, + (q31_t)0x60241ae9, (q31_t)0x601ff4e3, (q31_t)0x601bcea2, (q31_t)0x6017a826, (q31_t)0x6013816e, (q31_t)0x600f5a7b, (q31_t)0x600b334d, (q31_t)0x60070be4, + (q31_t)0x6002e43f, (q31_t)0x5ffebc5f, (q31_t)0x5ffa9444, (q31_t)0x5ff66bee, (q31_t)0x5ff2435d, (q31_t)0x5fee1a90, (q31_t)0x5fe9f188, (q31_t)0x5fe5c845, + (q31_t)0x5fe19ec7, (q31_t)0x5fdd750e, (q31_t)0x5fd94b19, (q31_t)0x5fd520ea, (q31_t)0x5fd0f67f, (q31_t)0x5fcccbd9, (q31_t)0x5fc8a0f8, (q31_t)0x5fc475dc, + (q31_t)0x5fc04a85, (q31_t)0x5fbc1ef3, (q31_t)0x5fb7f326, (q31_t)0x5fb3c71e, (q31_t)0x5faf9adb, (q31_t)0x5fab6e5d, (q31_t)0x5fa741a3, (q31_t)0x5fa314af, + (q31_t)0x5f9ee780, (q31_t)0x5f9aba16, (q31_t)0x5f968c70, (q31_t)0x5f925e90, (q31_t)0x5f8e3075, (q31_t)0x5f8a021f, (q31_t)0x5f85d38e, (q31_t)0x5f81a4c2, + (q31_t)0x5f7d75bb, (q31_t)0x5f794679, (q31_t)0x5f7516fd, (q31_t)0x5f70e745, (q31_t)0x5f6cb753, (q31_t)0x5f688726, (q31_t)0x5f6456be, (q31_t)0x5f60261b, + (q31_t)0x5f5bf53d, (q31_t)0x5f57c424, (q31_t)0x5f5392d1, (q31_t)0x5f4f6143, (q31_t)0x5f4b2f7a, (q31_t)0x5f46fd76, (q31_t)0x5f42cb37, (q31_t)0x5f3e98be, + (q31_t)0x5f3a660a, (q31_t)0x5f36331b, (q31_t)0x5f31fff1, (q31_t)0x5f2dcc8d, (q31_t)0x5f2998ee, (q31_t)0x5f256515, (q31_t)0x5f213100, (q31_t)0x5f1cfcb1, + (q31_t)0x5f18c827, (q31_t)0x5f149363, (q31_t)0x5f105e64, (q31_t)0x5f0c292a, (q31_t)0x5f07f3b6, (q31_t)0x5f03be07, (q31_t)0x5eff881d, (q31_t)0x5efb51f9, + (q31_t)0x5ef71b9b, (q31_t)0x5ef2e501, (q31_t)0x5eeeae2d, (q31_t)0x5eea771f, (q31_t)0x5ee63fd6, (q31_t)0x5ee20853, (q31_t)0x5eddd094, (q31_t)0x5ed9989c, + (q31_t)0x5ed56069, (q31_t)0x5ed127fb, (q31_t)0x5eccef53, (q31_t)0x5ec8b671, (q31_t)0x5ec47d54, (q31_t)0x5ec043fc, (q31_t)0x5ebc0a6a, (q31_t)0x5eb7d09e, + (q31_t)0x5eb39697, (q31_t)0x5eaf5c56, (q31_t)0x5eab21da, (q31_t)0x5ea6e724, (q31_t)0x5ea2ac34, (q31_t)0x5e9e7109, (q31_t)0x5e9a35a4, (q31_t)0x5e95fa05, + (q31_t)0x5e91be2b, (q31_t)0x5e8d8217, (q31_t)0x5e8945c8, (q31_t)0x5e85093f, (q31_t)0x5e80cc7c, (q31_t)0x5e7c8f7f, (q31_t)0x5e785247, (q31_t)0x5e7414d5, + (q31_t)0x5e6fd729, (q31_t)0x5e6b9943, (q31_t)0x5e675b22, (q31_t)0x5e631cc7, (q31_t)0x5e5ede32, (q31_t)0x5e5a9f62, (q31_t)0x5e566059, (q31_t)0x5e522115, + (q31_t)0x5e4de197, (q31_t)0x5e49a1df, (q31_t)0x5e4561ed, (q31_t)0x5e4121c0, (q31_t)0x5e3ce15a, (q31_t)0x5e38a0b9, (q31_t)0x5e345fde, (q31_t)0x5e301ec9, + (q31_t)0x5e2bdd7a, (q31_t)0x5e279bf1, (q31_t)0x5e235a2e, (q31_t)0x5e1f1830, (q31_t)0x5e1ad5f9, (q31_t)0x5e169388, (q31_t)0x5e1250dc, (q31_t)0x5e0e0df7, + (q31_t)0x5e09cad7, (q31_t)0x5e05877e, (q31_t)0x5e0143ea, (q31_t)0x5dfd001d, (q31_t)0x5df8bc15, (q31_t)0x5df477d4, (q31_t)0x5df03359, (q31_t)0x5debeea3, + (q31_t)0x5de7a9b4, (q31_t)0x5de3648b, (q31_t)0x5ddf1f28, (q31_t)0x5ddad98b, (q31_t)0x5dd693b4, (q31_t)0x5dd24da3, (q31_t)0x5dce0759, (q31_t)0x5dc9c0d4, + (q31_t)0x5dc57a16, (q31_t)0x5dc1331d, (q31_t)0x5dbcebeb, (q31_t)0x5db8a480, (q31_t)0x5db45cda, (q31_t)0x5db014fa, (q31_t)0x5dabcce1, (q31_t)0x5da7848e, + (q31_t)0x5da33c01, (q31_t)0x5d9ef33b, (q31_t)0x5d9aaa3a, (q31_t)0x5d966100, (q31_t)0x5d92178d, (q31_t)0x5d8dcddf, (q31_t)0x5d8983f8, (q31_t)0x5d8539d7, + (q31_t)0x5d80ef7c, (q31_t)0x5d7ca4e8, (q31_t)0x5d785a1a, (q31_t)0x5d740f12, (q31_t)0x5d6fc3d1, (q31_t)0x5d6b7856, (q31_t)0x5d672ca2, (q31_t)0x5d62e0b4, + (q31_t)0x5d5e948c, (q31_t)0x5d5a482a, (q31_t)0x5d55fb90, (q31_t)0x5d51aebb, (q31_t)0x5d4d61ad, (q31_t)0x5d491465, (q31_t)0x5d44c6e4, (q31_t)0x5d40792a, + (q31_t)0x5d3c2b35, (q31_t)0x5d37dd08, (q31_t)0x5d338ea0, (q31_t)0x5d2f4000, (q31_t)0x5d2af125, (q31_t)0x5d26a212, (q31_t)0x5d2252c5, (q31_t)0x5d1e033e, + (q31_t)0x5d19b37e, (q31_t)0x5d156385, (q31_t)0x5d111352, (q31_t)0x5d0cc2e5, (q31_t)0x5d087240, (q31_t)0x5d042161, (q31_t)0x5cffd048, (q31_t)0x5cfb7ef7, + (q31_t)0x5cf72d6b, (q31_t)0x5cf2dba7, (q31_t)0x5cee89a9, (q31_t)0x5cea3772, (q31_t)0x5ce5e501, (q31_t)0x5ce19258, (q31_t)0x5cdd3f75, (q31_t)0x5cd8ec58, + (q31_t)0x5cd49903, (q31_t)0x5cd04574, (q31_t)0x5ccbf1ab, (q31_t)0x5cc79daa, (q31_t)0x5cc3496f, (q31_t)0x5cbef4fc, (q31_t)0x5cbaa04f, (q31_t)0x5cb64b68, + (q31_t)0x5cb1f649, (q31_t)0x5cada0f0, (q31_t)0x5ca94b5e, (q31_t)0x5ca4f594, (q31_t)0x5ca09f8f, (q31_t)0x5c9c4952, (q31_t)0x5c97f2dc, (q31_t)0x5c939c2c, + (q31_t)0x5c8f4544, (q31_t)0x5c8aee22, (q31_t)0x5c8696c7, (q31_t)0x5c823f34, (q31_t)0x5c7de767, (q31_t)0x5c798f61, (q31_t)0x5c753722, (q31_t)0x5c70deaa, + (q31_t)0x5c6c85f9, (q31_t)0x5c682d0f, (q31_t)0x5c63d3eb, (q31_t)0x5c5f7a8f, (q31_t)0x5c5b20fa, (q31_t)0x5c56c72c, (q31_t)0x5c526d25, (q31_t)0x5c4e12e5, + (q31_t)0x5c49b86d, (q31_t)0x5c455dbb, (q31_t)0x5c4102d0, (q31_t)0x5c3ca7ad, (q31_t)0x5c384c50, (q31_t)0x5c33f0bb, (q31_t)0x5c2f94ec, (q31_t)0x5c2b38e5, + (q31_t)0x5c26dca5, (q31_t)0x5c22802c, (q31_t)0x5c1e237b, (q31_t)0x5c19c690, (q31_t)0x5c15696d, (q31_t)0x5c110c11, (q31_t)0x5c0cae7c, (q31_t)0x5c0850ae, + (q31_t)0x5c03f2a8, (q31_t)0x5bff9469, (q31_t)0x5bfb35f1, (q31_t)0x5bf6d740, (q31_t)0x5bf27857, (q31_t)0x5bee1935, (q31_t)0x5be9b9da, (q31_t)0x5be55a46, + (q31_t)0x5be0fa7a, (q31_t)0x5bdc9a75, (q31_t)0x5bd83a37, (q31_t)0x5bd3d9c1, (q31_t)0x5bcf7912, (q31_t)0x5bcb182b, (q31_t)0x5bc6b70b, (q31_t)0x5bc255b2, + (q31_t)0x5bbdf421, (q31_t)0x5bb99257, (q31_t)0x5bb53054, (q31_t)0x5bb0ce19, (q31_t)0x5bac6ba6, (q31_t)0x5ba808f9, (q31_t)0x5ba3a615, (q31_t)0x5b9f42f7, + (q31_t)0x5b9adfa2, (q31_t)0x5b967c13, (q31_t)0x5b92184d, (q31_t)0x5b8db44d, (q31_t)0x5b895016, (q31_t)0x5b84eba6, (q31_t)0x5b8086fd, (q31_t)0x5b7c221c, + (q31_t)0x5b77bd02, (q31_t)0x5b7357b0, (q31_t)0x5b6ef226, (q31_t)0x5b6a8c63, (q31_t)0x5b662668, (q31_t)0x5b61c035, (q31_t)0x5b5d59c9, (q31_t)0x5b58f324, + (q31_t)0x5b548c48, (q31_t)0x5b502533, (q31_t)0x5b4bbde6, (q31_t)0x5b475660, (q31_t)0x5b42eea2, (q31_t)0x5b3e86ac, (q31_t)0x5b3a1e7e, (q31_t)0x5b35b617, + (q31_t)0x5b314d78, (q31_t)0x5b2ce4a1, (q31_t)0x5b287b91, (q31_t)0x5b241249, (q31_t)0x5b1fa8c9, (q31_t)0x5b1b3f11, (q31_t)0x5b16d521, (q31_t)0x5b126af8, + (q31_t)0x5b0e0098, (q31_t)0x5b0995ff, (q31_t)0x5b052b2e, (q31_t)0x5b00c025, (q31_t)0x5afc54e3, (q31_t)0x5af7e96a, (q31_t)0x5af37db8, (q31_t)0x5aef11cf, + (q31_t)0x5aeaa5ad, (q31_t)0x5ae63953, (q31_t)0x5ae1ccc1, (q31_t)0x5add5ff7, (q31_t)0x5ad8f2f5, (q31_t)0x5ad485bb, (q31_t)0x5ad01849, (q31_t)0x5acbaa9f, + (q31_t)0x5ac73cbd, (q31_t)0x5ac2cea3, (q31_t)0x5abe6050, (q31_t)0x5ab9f1c6, (q31_t)0x5ab58304, (q31_t)0x5ab1140a, (q31_t)0x5aaca4d8, (q31_t)0x5aa8356f, + (q31_t)0x5aa3c5cd, (q31_t)0x5a9f55f3, (q31_t)0x5a9ae5e2, (q31_t)0x5a967598, (q31_t)0x5a920517, (q31_t)0x5a8d945d, (q31_t)0x5a89236c, (q31_t)0x5a84b243, + (q31_t)0x5a8040e3, (q31_t)0x5a7bcf4a, (q31_t)0x5a775d7a, (q31_t)0x5a72eb71, (q31_t)0x5a6e7931, (q31_t)0x5a6a06ba, (q31_t)0x5a65940a, (q31_t)0x5a612123, + (q31_t)0x5a5cae04, (q31_t)0x5a583aad, (q31_t)0x5a53c71e, (q31_t)0x5a4f5358, (q31_t)0x5a4adf5a, (q31_t)0x5a466b24, (q31_t)0x5a41f6b7, (q31_t)0x5a3d8212, + (q31_t)0x5a390d35, (q31_t)0x5a349821, (q31_t)0x5a3022d5, (q31_t)0x5a2bad51, (q31_t)0x5a273796, (q31_t)0x5a22c1a3, (q31_t)0x5a1e4b79, (q31_t)0x5a19d517, + (q31_t)0x5a155e7d, (q31_t)0x5a10e7ac, (q31_t)0x5a0c70a3, (q31_t)0x5a07f963, (q31_t)0x5a0381eb, (q31_t)0x59ff0a3c, (q31_t)0x59fa9255, (q31_t)0x59f61a36, + (q31_t)0x59f1a1e0, (q31_t)0x59ed2953, (q31_t)0x59e8b08e, (q31_t)0x59e43792, (q31_t)0x59dfbe5e, (q31_t)0x59db44f3, (q31_t)0x59d6cb50, (q31_t)0x59d25176, + (q31_t)0x59cdd765, (q31_t)0x59c95d1c, (q31_t)0x59c4e29c, (q31_t)0x59c067e4, (q31_t)0x59bbecf5, (q31_t)0x59b771cf, (q31_t)0x59b2f671, (q31_t)0x59ae7add, + (q31_t)0x59a9ff10, (q31_t)0x59a5830d, (q31_t)0x59a106d2, (q31_t)0x599c8a60, (q31_t)0x59980db6, (q31_t)0x599390d5, (q31_t)0x598f13bd, (q31_t)0x598a966e, + (q31_t)0x598618e8, (q31_t)0x59819b2a, (q31_t)0x597d1d35, (q31_t)0x59789f09, (q31_t)0x597420a6, (q31_t)0x596fa20b, (q31_t)0x596b233a, (q31_t)0x5966a431, + (q31_t)0x596224f1, (q31_t)0x595da57a, (q31_t)0x595925cc, (q31_t)0x5954a5e6, (q31_t)0x595025ca, (q31_t)0x594ba576, (q31_t)0x594724ec, (q31_t)0x5942a42a, + (q31_t)0x593e2331, (q31_t)0x5939a202, (q31_t)0x5935209b, (q31_t)0x59309efd, (q31_t)0x592c1d28, (q31_t)0x59279b1c, (q31_t)0x592318d9, (q31_t)0x591e9660, + (q31_t)0x591a13af, (q31_t)0x591590c7, (q31_t)0x59110da8, (q31_t)0x590c8a53, (q31_t)0x590806c6, (q31_t)0x59038302, (q31_t)0x58feff08, (q31_t)0x58fa7ad7, + (q31_t)0x58f5f66e, (q31_t)0x58f171cf, (q31_t)0x58ececf9, (q31_t)0x58e867ed, (q31_t)0x58e3e2a9, (q31_t)0x58df5d2e, (q31_t)0x58dad77d, (q31_t)0x58d65195, + (q31_t)0x58d1cb76, (q31_t)0x58cd4520, (q31_t)0x58c8be94, (q31_t)0x58c437d1, (q31_t)0x58bfb0d7, (q31_t)0x58bb29a6, (q31_t)0x58b6a23e, (q31_t)0x58b21aa0, + (q31_t)0x58ad92cb, (q31_t)0x58a90ac0, (q31_t)0x58a4827d, (q31_t)0x589ffa04, (q31_t)0x589b7155, (q31_t)0x5896e86f, (q31_t)0x58925f52, (q31_t)0x588dd5fe, + (q31_t)0x58894c74, (q31_t)0x5884c2b3, (q31_t)0x588038bb, (q31_t)0x587bae8d, (q31_t)0x58772429, (q31_t)0x5872998e, (q31_t)0x586e0ebc, (q31_t)0x586983b4, + (q31_t)0x5864f875, (q31_t)0x58606d00, (q31_t)0x585be154, (q31_t)0x58575571, (q31_t)0x5852c958, (q31_t)0x584e3d09, (q31_t)0x5849b083, (q31_t)0x584523c7, + (q31_t)0x584096d4, (q31_t)0x583c09ab, (q31_t)0x58377c4c, (q31_t)0x5832eeb6, (q31_t)0x582e60e9, (q31_t)0x5829d2e6, (q31_t)0x582544ad, (q31_t)0x5820b63e, + (q31_t)0x581c2798, (q31_t)0x581798bb, (q31_t)0x581309a9, (q31_t)0x580e7a60, (q31_t)0x5809eae1, (q31_t)0x58055b2b, (q31_t)0x5800cb3f, (q31_t)0x57fc3b1d, + (q31_t)0x57f7aac5, (q31_t)0x57f31a36, (q31_t)0x57ee8971, (q31_t)0x57e9f876, (q31_t)0x57e56744, (q31_t)0x57e0d5dd, (q31_t)0x57dc443f, (q31_t)0x57d7b26b, + (q31_t)0x57d32061, (q31_t)0x57ce8e20, (q31_t)0x57c9fbaa, (q31_t)0x57c568fd, (q31_t)0x57c0d61a, (q31_t)0x57bc4301, (q31_t)0x57b7afb2, (q31_t)0x57b31c2d, + (q31_t)0x57ae8872, (q31_t)0x57a9f480, (q31_t)0x57a56059, (q31_t)0x57a0cbfb, (q31_t)0x579c3768, (q31_t)0x5797a29e, (q31_t)0x57930d9e, (q31_t)0x578e7869, + (q31_t)0x5789e2fd, (q31_t)0x57854d5b, (q31_t)0x5780b784, (q31_t)0x577c2176, (q31_t)0x57778b32, (q31_t)0x5772f4b9, (q31_t)0x576e5e09, (q31_t)0x5769c724, + (q31_t)0x57653009, (q31_t)0x576098b7, (q31_t)0x575c0130, (q31_t)0x57576973, (q31_t)0x5752d180, (q31_t)0x574e3957, (q31_t)0x5749a0f9, (q31_t)0x57450864, + (q31_t)0x57406f9a, (q31_t)0x573bd69a, (q31_t)0x57373d64, (q31_t)0x5732a3f8, (q31_t)0x572e0a56, (q31_t)0x5729707f, (q31_t)0x5724d672, (q31_t)0x57203c2f, + (q31_t)0x571ba1b7, (q31_t)0x57170708, (q31_t)0x57126c24, (q31_t)0x570dd10a, (q31_t)0x570935bb, (q31_t)0x57049a36, (q31_t)0x56fffe7b, (q31_t)0x56fb628b, + (q31_t)0x56f6c664, (q31_t)0x56f22a09, (q31_t)0x56ed8d77, (q31_t)0x56e8f0b0, (q31_t)0x56e453b4, (q31_t)0x56dfb681, (q31_t)0x56db1919, (q31_t)0x56d67b7c, + (q31_t)0x56d1dda9, (q31_t)0x56cd3fa1, (q31_t)0x56c8a162, (q31_t)0x56c402ef, (q31_t)0x56bf6446, (q31_t)0x56bac567, (q31_t)0x56b62653, (q31_t)0x56b18709, + (q31_t)0x56ace78a, (q31_t)0x56a847d6, (q31_t)0x56a3a7ec, (q31_t)0x569f07cc, (q31_t)0x569a6777, (q31_t)0x5695c6ed, (q31_t)0x5691262d, (q31_t)0x568c8538, + (q31_t)0x5687e40e, (q31_t)0x568342ae, (q31_t)0x567ea118, (q31_t)0x5679ff4e, (q31_t)0x56755d4e, (q31_t)0x5670bb19, (q31_t)0x566c18ae, (q31_t)0x5667760e, + (q31_t)0x5662d339, (q31_t)0x565e302e, (q31_t)0x56598cee, (q31_t)0x5654e979, (q31_t)0x565045cf, (q31_t)0x564ba1f0, (q31_t)0x5646fddb, (q31_t)0x56425991, + (q31_t)0x563db512, (q31_t)0x5639105d, (q31_t)0x56346b74, (q31_t)0x562fc655, (q31_t)0x562b2101, (q31_t)0x56267b78, (q31_t)0x5621d5ba, (q31_t)0x561d2fc6, + (q31_t)0x5618899e, (q31_t)0x5613e340, (q31_t)0x560f3cae, (q31_t)0x560a95e6, (q31_t)0x5605eee9, (q31_t)0x560147b7, (q31_t)0x55fca050, (q31_t)0x55f7f8b4, + (q31_t)0x55f350e3, (q31_t)0x55eea8dd, (q31_t)0x55ea00a2, (q31_t)0x55e55832, (q31_t)0x55e0af8d, (q31_t)0x55dc06b3, (q31_t)0x55d75da4, (q31_t)0x55d2b460, + (q31_t)0x55ce0ae7, (q31_t)0x55c96139, (q31_t)0x55c4b757, (q31_t)0x55c00d3f, (q31_t)0x55bb62f3, (q31_t)0x55b6b871, (q31_t)0x55b20dbb, (q31_t)0x55ad62d0, + (q31_t)0x55a8b7b0, (q31_t)0x55a40c5b, (q31_t)0x559f60d1, (q31_t)0x559ab513, (q31_t)0x55960920, (q31_t)0x55915cf8, (q31_t)0x558cb09b, (q31_t)0x55880409, + (q31_t)0x55835743, (q31_t)0x557eaa48, (q31_t)0x5579fd18, (q31_t)0x55754fb3, (q31_t)0x5570a21a, (q31_t)0x556bf44c, (q31_t)0x55674649, (q31_t)0x55629812, + (q31_t)0x555de9a6, (q31_t)0x55593b05, (q31_t)0x55548c30, (q31_t)0x554fdd26, (q31_t)0x554b2de7, (q31_t)0x55467e74, (q31_t)0x5541cecc, (q31_t)0x553d1ef0, + (q31_t)0x55386edf, (q31_t)0x5533be99, (q31_t)0x552f0e1f, (q31_t)0x552a5d70, (q31_t)0x5525ac8d, (q31_t)0x5520fb75, (q31_t)0x551c4a29, (q31_t)0x551798a8, + (q31_t)0x5512e6f3, (q31_t)0x550e3509, (q31_t)0x550982eb, (q31_t)0x5504d099, (q31_t)0x55001e12, (q31_t)0x54fb6b56, (q31_t)0x54f6b866, (q31_t)0x54f20542, + (q31_t)0x54ed51e9, (q31_t)0x54e89e5c, (q31_t)0x54e3ea9a, (q31_t)0x54df36a5, (q31_t)0x54da827a, (q31_t)0x54d5ce1c, (q31_t)0x54d11989, (q31_t)0x54cc64c2, + (q31_t)0x54c7afc6, (q31_t)0x54c2fa96, (q31_t)0x54be4532, (q31_t)0x54b98f9a, (q31_t)0x54b4d9cd, (q31_t)0x54b023cc, (q31_t)0x54ab6d97, (q31_t)0x54a6b72e, + (q31_t)0x54a20090, (q31_t)0x549d49bf, (q31_t)0x549892b9, (q31_t)0x5493db7f, (q31_t)0x548f2410, (q31_t)0x548a6c6e, (q31_t)0x5485b497, (q31_t)0x5480fc8c, + (q31_t)0x547c444d, (q31_t)0x54778bda, (q31_t)0x5472d333, (q31_t)0x546e1a58, (q31_t)0x54696149, (q31_t)0x5464a805, (q31_t)0x545fee8e, (q31_t)0x545b34e3, + (q31_t)0x54567b03, (q31_t)0x5451c0f0, (q31_t)0x544d06a8, (q31_t)0x54484c2d, (q31_t)0x5443917d, (q31_t)0x543ed699, (q31_t)0x543a1b82, (q31_t)0x54356037, + (q31_t)0x5430a4b7, (q31_t)0x542be904, (q31_t)0x54272d1d, (q31_t)0x54227102, (q31_t)0x541db4b3, (q31_t)0x5418f830, (q31_t)0x54143b79, (q31_t)0x540f7e8e, + (q31_t)0x540ac170, (q31_t)0x5406041d, (q31_t)0x54014697, (q31_t)0x53fc88dd, (q31_t)0x53f7caef, (q31_t)0x53f30cce, (q31_t)0x53ee4e78, (q31_t)0x53e98fef, + (q31_t)0x53e4d132, (q31_t)0x53e01242, (q31_t)0x53db531d, (q31_t)0x53d693c5, (q31_t)0x53d1d439, (q31_t)0x53cd147a, (q31_t)0x53c85486, (q31_t)0x53c3945f, + (q31_t)0x53bed405, (q31_t)0x53ba1377, (q31_t)0x53b552b5, (q31_t)0x53b091bf, (q31_t)0x53abd096, (q31_t)0x53a70f39, (q31_t)0x53a24da9, (q31_t)0x539d8be5, + (q31_t)0x5398c9ed, (q31_t)0x539407c2, (q31_t)0x538f4564, (q31_t)0x538a82d1, (q31_t)0x5385c00c, (q31_t)0x5380fd12, (q31_t)0x537c39e6, (q31_t)0x53777685, + (q31_t)0x5372b2f2, (q31_t)0x536def2a, (q31_t)0x53692b30, (q31_t)0x53646701, (q31_t)0x535fa2a0, (q31_t)0x535ade0b, (q31_t)0x53561942, (q31_t)0x53515447, + (q31_t)0x534c8f17, (q31_t)0x5347c9b5, (q31_t)0x5343041f, (q31_t)0x533e3e55, (q31_t)0x53397859, (q31_t)0x5334b229, (q31_t)0x532febc5, (q31_t)0x532b252f, + (q31_t)0x53265e65, (q31_t)0x53219767, (q31_t)0x531cd037, (q31_t)0x531808d3, (q31_t)0x5313413c, (q31_t)0x530e7972, (q31_t)0x5309b174, (q31_t)0x5304e943, + (q31_t)0x530020df, (q31_t)0x52fb5848, (q31_t)0x52f68f7e, (q31_t)0x52f1c680, (q31_t)0x52ecfd4f, (q31_t)0x52e833ec, (q31_t)0x52e36a55, (q31_t)0x52dea08a, + (q31_t)0x52d9d68d, (q31_t)0x52d50c5d, (q31_t)0x52d041f9, (q31_t)0x52cb7763, (q31_t)0x52c6ac99, (q31_t)0x52c1e19d, (q31_t)0x52bd166d, (q31_t)0x52b84b0a, + (q31_t)0x52b37f74, (q31_t)0x52aeb3ac, (q31_t)0x52a9e7b0, (q31_t)0x52a51b81, (q31_t)0x52a04f1f, (q31_t)0x529b828a, (q31_t)0x5296b5c3, (q31_t)0x5291e8c8, + (q31_t)0x528d1b9b, (q31_t)0x52884e3a, (q31_t)0x528380a7, (q31_t)0x527eb2e0, (q31_t)0x5279e4e7, (q31_t)0x527516bb, (q31_t)0x5270485c, (q31_t)0x526b79ca, + (q31_t)0x5266ab06, (q31_t)0x5261dc0e, (q31_t)0x525d0ce4, (q31_t)0x52583d87, (q31_t)0x52536df7, (q31_t)0x524e9e34, (q31_t)0x5249ce3f, (q31_t)0x5244fe17, + (q31_t)0x52402dbc, (q31_t)0x523b5d2e, (q31_t)0x52368c6e, (q31_t)0x5231bb7b, (q31_t)0x522cea55, (q31_t)0x522818fc, (q31_t)0x52234771, (q31_t)0x521e75b3, + (q31_t)0x5219a3c3, (q31_t)0x5214d1a0, (q31_t)0x520fff4a, (q31_t)0x520b2cc2, (q31_t)0x52065a07, (q31_t)0x52018719, (q31_t)0x51fcb3f9, (q31_t)0x51f7e0a6, + (q31_t)0x51f30d21, (q31_t)0x51ee3969, (q31_t)0x51e9657e, (q31_t)0x51e49162, (q31_t)0x51dfbd12, (q31_t)0x51dae890, (q31_t)0x51d613dc, (q31_t)0x51d13ef5, + (q31_t)0x51cc69db, (q31_t)0x51c79490, (q31_t)0x51c2bf11, (q31_t)0x51bde960, (q31_t)0x51b9137d, (q31_t)0x51b43d68, (q31_t)0x51af6720, (q31_t)0x51aa90a5, + (q31_t)0x51a5b9f9, (q31_t)0x51a0e31a, (q31_t)0x519c0c08, (q31_t)0x519734c4, (q31_t)0x51925d4e, (q31_t)0x518d85a6, (q31_t)0x5188adcb, (q31_t)0x5183d5be, + (q31_t)0x517efd7f, (q31_t)0x517a250d, (q31_t)0x51754c69, (q31_t)0x51707393, (q31_t)0x516b9a8b, (q31_t)0x5166c150, (q31_t)0x5161e7e4, (q31_t)0x515d0e45, + (q31_t)0x51583473, (q31_t)0x51535a70, (q31_t)0x514e803b, (q31_t)0x5149a5d3, (q31_t)0x5144cb39, (q31_t)0x513ff06d, (q31_t)0x513b156f, (q31_t)0x51363a3f, + (q31_t)0x51315edd, (q31_t)0x512c8348, (q31_t)0x5127a782, (q31_t)0x5122cb8a, (q31_t)0x511def5f, (q31_t)0x51191302, (q31_t)0x51143674, (q31_t)0x510f59b3, + (q31_t)0x510a7cc1, (q31_t)0x51059f9c, (q31_t)0x5100c246, (q31_t)0x50fbe4bd, (q31_t)0x50f70703, (q31_t)0x50f22916, (q31_t)0x50ed4af8, (q31_t)0x50e86ca8, + (q31_t)0x50e38e25, (q31_t)0x50deaf71, (q31_t)0x50d9d08b, (q31_t)0x50d4f173, (q31_t)0x50d0122a, (q31_t)0x50cb32ae, (q31_t)0x50c65301, (q31_t)0x50c17322, + (q31_t)0x50bc9311, (q31_t)0x50b7b2ce, (q31_t)0x50b2d259, (q31_t)0x50adf1b3, (q31_t)0x50a910db, (q31_t)0x50a42fd1, (q31_t)0x509f4e95, (q31_t)0x509a6d28, + (q31_t)0x50958b88, (q31_t)0x5090a9b8, (q31_t)0x508bc7b5, (q31_t)0x5086e581, (q31_t)0x5082031b, (q31_t)0x507d2083, (q31_t)0x50783dba, (q31_t)0x50735abf, + (q31_t)0x506e7793, (q31_t)0x50699435, (q31_t)0x5064b0a5, (q31_t)0x505fcce4, (q31_t)0x505ae8f1, (q31_t)0x505604cd, (q31_t)0x50512077, (q31_t)0x504c3bef, + (q31_t)0x50475736, (q31_t)0x5042724c, (q31_t)0x503d8d30, (q31_t)0x5038a7e2, (q31_t)0x5033c263, (q31_t)0x502edcb2, (q31_t)0x5029f6d1, (q31_t)0x502510bd, + (q31_t)0x50202a78, (q31_t)0x501b4402, (q31_t)0x50165d5a, (q31_t)0x50117681, (q31_t)0x500c8f77, (q31_t)0x5007a83b, (q31_t)0x5002c0cd, (q31_t)0x4ffdd92f, + (q31_t)0x4ff8f15f, (q31_t)0x4ff4095e, (q31_t)0x4fef212b, (q31_t)0x4fea38c7, (q31_t)0x4fe55032, (q31_t)0x4fe0676c, (q31_t)0x4fdb7e74, (q31_t)0x4fd6954b, + (q31_t)0x4fd1abf0, (q31_t)0x4fccc265, (q31_t)0x4fc7d8a8, (q31_t)0x4fc2eeba, (q31_t)0x4fbe049b, (q31_t)0x4fb91a4b, (q31_t)0x4fb42fc9, (q31_t)0x4faf4517, + (q31_t)0x4faa5a33, (q31_t)0x4fa56f1e, (q31_t)0x4fa083d8, (q31_t)0x4f9b9861, (q31_t)0x4f96acb8, (q31_t)0x4f91c0df, (q31_t)0x4f8cd4d4, (q31_t)0x4f87e899, + (q31_t)0x4f82fc2c, (q31_t)0x4f7e0f8f, (q31_t)0x4f7922c0, (q31_t)0x4f7435c0, (q31_t)0x4f6f488f, (q31_t)0x4f6a5b2e, (q31_t)0x4f656d9b, (q31_t)0x4f607fd7, + (q31_t)0x4f5b91e3, (q31_t)0x4f56a3bd, (q31_t)0x4f51b566, (q31_t)0x4f4cc6df, (q31_t)0x4f47d827, (q31_t)0x4f42e93d, (q31_t)0x4f3dfa23, (q31_t)0x4f390ad8, + (q31_t)0x4f341b5c, (q31_t)0x4f2f2baf, (q31_t)0x4f2a3bd2, (q31_t)0x4f254bc3, (q31_t)0x4f205b84, (q31_t)0x4f1b6b14, (q31_t)0x4f167a73, (q31_t)0x4f1189a1, + (q31_t)0x4f0c989f, (q31_t)0x4f07a76b, (q31_t)0x4f02b608, (q31_t)0x4efdc473, (q31_t)0x4ef8d2ad, (q31_t)0x4ef3e0b7, (q31_t)0x4eeeee90, (q31_t)0x4ee9fc39, + (q31_t)0x4ee509b1, (q31_t)0x4ee016f8, (q31_t)0x4edb240e, (q31_t)0x4ed630f4, (q31_t)0x4ed13da9, (q31_t)0x4ecc4a2e, (q31_t)0x4ec75682, (q31_t)0x4ec262a5, + (q31_t)0x4ebd6e98, (q31_t)0x4eb87a5a, (q31_t)0x4eb385ec, (q31_t)0x4eae914d, (q31_t)0x4ea99c7d, (q31_t)0x4ea4a77d, (q31_t)0x4e9fb24d, (q31_t)0x4e9abcec, + (q31_t)0x4e95c75b, (q31_t)0x4e90d199, (q31_t)0x4e8bdba6, (q31_t)0x4e86e583, (q31_t)0x4e81ef30, (q31_t)0x4e7cf8ac, (q31_t)0x4e7801f8, (q31_t)0x4e730b14, + (q31_t)0x4e6e13ff, (q31_t)0x4e691cba, (q31_t)0x4e642544, (q31_t)0x4e5f2d9e, (q31_t)0x4e5a35c7, (q31_t)0x4e553dc1, (q31_t)0x4e50458a, (q31_t)0x4e4b4d22, + (q31_t)0x4e46548b, (q31_t)0x4e415bc3, (q31_t)0x4e3c62cb, (q31_t)0x4e3769a2, (q31_t)0x4e32704a, (q31_t)0x4e2d76c1, (q31_t)0x4e287d08, (q31_t)0x4e23831e, + (q31_t)0x4e1e8905, (q31_t)0x4e198ebb, (q31_t)0x4e149441, (q31_t)0x4e0f9997, (q31_t)0x4e0a9ebd, (q31_t)0x4e05a3b2, (q31_t)0x4e00a878, (q31_t)0x4dfbad0d, + (q31_t)0x4df6b173, (q31_t)0x4df1b5a8, (q31_t)0x4decb9ad, (q31_t)0x4de7bd82, (q31_t)0x4de2c127, (q31_t)0x4dddc49c, (q31_t)0x4dd8c7e1, (q31_t)0x4dd3caf6, + (q31_t)0x4dcecdda, (q31_t)0x4dc9d08f, (q31_t)0x4dc4d314, (q31_t)0x4dbfd569, (q31_t)0x4dbad78e, (q31_t)0x4db5d983, (q31_t)0x4db0db48, (q31_t)0x4dabdcdd, + (q31_t)0x4da6de43, (q31_t)0x4da1df78, (q31_t)0x4d9ce07d, (q31_t)0x4d97e153, (q31_t)0x4d92e1f9, (q31_t)0x4d8de26f, (q31_t)0x4d88e2b5, (q31_t)0x4d83e2cb, + (q31_t)0x4d7ee2b1, (q31_t)0x4d79e268, (q31_t)0x4d74e1ef, (q31_t)0x4d6fe146, (q31_t)0x4d6ae06d, (q31_t)0x4d65df64, (q31_t)0x4d60de2c, (q31_t)0x4d5bdcc4, + (q31_t)0x4d56db2d, (q31_t)0x4d51d965, (q31_t)0x4d4cd76e, (q31_t)0x4d47d547, (q31_t)0x4d42d2f1, (q31_t)0x4d3dd06b, (q31_t)0x4d38cdb5, (q31_t)0x4d33cad0, + (q31_t)0x4d2ec7bb, (q31_t)0x4d29c476, (q31_t)0x4d24c102, (q31_t)0x4d1fbd5e, (q31_t)0x4d1ab98b, (q31_t)0x4d15b588, (q31_t)0x4d10b155, (q31_t)0x4d0bacf3, + (q31_t)0x4d06a862, (q31_t)0x4d01a3a0, (q31_t)0x4cfc9eb0, (q31_t)0x4cf79990, (q31_t)0x4cf29440, (q31_t)0x4ced8ec1, (q31_t)0x4ce88913, (q31_t)0x4ce38335, + (q31_t)0x4cde7d28, (q31_t)0x4cd976eb, (q31_t)0x4cd4707f, (q31_t)0x4ccf69e3, (q31_t)0x4cca6318, (q31_t)0x4cc55c1e, (q31_t)0x4cc054f4, (q31_t)0x4cbb4d9b, + (q31_t)0x4cb64613, (q31_t)0x4cb13e5b, (q31_t)0x4cac3674, (q31_t)0x4ca72e5e, (q31_t)0x4ca22619, (q31_t)0x4c9d1da4, (q31_t)0x4c981500, (q31_t)0x4c930c2d, + (q31_t)0x4c8e032a, (q31_t)0x4c88f9f8, (q31_t)0x4c83f097, (q31_t)0x4c7ee707, (q31_t)0x4c79dd48, (q31_t)0x4c74d359, (q31_t)0x4c6fc93b, (q31_t)0x4c6abeef, + (q31_t)0x4c65b473, (q31_t)0x4c60a9c8, (q31_t)0x4c5b9eed, (q31_t)0x4c5693e4, (q31_t)0x4c5188ac, (q31_t)0x4c4c7d44, (q31_t)0x4c4771ae, (q31_t)0x4c4265e8, + (q31_t)0x4c3d59f3, (q31_t)0x4c384dd0, (q31_t)0x4c33417d, (q31_t)0x4c2e34fb, (q31_t)0x4c29284b, (q31_t)0x4c241b6b, (q31_t)0x4c1f0e5c, (q31_t)0x4c1a011f, + (q31_t)0x4c14f3b2, (q31_t)0x4c0fe617, (q31_t)0x4c0ad84c, (q31_t)0x4c05ca53, (q31_t)0x4c00bc2b, (q31_t)0x4bfbadd4, (q31_t)0x4bf69f4e, (q31_t)0x4bf19099, + (q31_t)0x4bec81b5, (q31_t)0x4be772a3, (q31_t)0x4be26362, (q31_t)0x4bdd53f2, (q31_t)0x4bd84453, (q31_t)0x4bd33485, (q31_t)0x4bce2488, (q31_t)0x4bc9145d, + (q31_t)0x4bc40403, (q31_t)0x4bbef37b, (q31_t)0x4bb9e2c3, (q31_t)0x4bb4d1dd, (q31_t)0x4bafc0c8, (q31_t)0x4baaaf85, (q31_t)0x4ba59e12, (q31_t)0x4ba08c72, + (q31_t)0x4b9b7aa2, (q31_t)0x4b9668a4, (q31_t)0x4b915677, (q31_t)0x4b8c441c, (q31_t)0x4b873192, (q31_t)0x4b821ed9, (q31_t)0x4b7d0bf2, (q31_t)0x4b77f8dc, + (q31_t)0x4b72e598, (q31_t)0x4b6dd225, (q31_t)0x4b68be84, (q31_t)0x4b63aab4, (q31_t)0x4b5e96b6, (q31_t)0x4b598289, (q31_t)0x4b546e2d, (q31_t)0x4b4f59a4, + (q31_t)0x4b4a44eb, (q31_t)0x4b453005, (q31_t)0x4b401aef, (q31_t)0x4b3b05ac, (q31_t)0x4b35f03a, (q31_t)0x4b30da9a, (q31_t)0x4b2bc4cb, (q31_t)0x4b26aece, + (q31_t)0x4b2198a2, (q31_t)0x4b1c8248, (q31_t)0x4b176bc0, (q31_t)0x4b12550a, (q31_t)0x4b0d3e25, (q31_t)0x4b082712, (q31_t)0x4b030fd1, (q31_t)0x4afdf861, + (q31_t)0x4af8e0c3, (q31_t)0x4af3c8f7, (q31_t)0x4aeeb0fd, (q31_t)0x4ae998d4, (q31_t)0x4ae4807d, (q31_t)0x4adf67f8, (q31_t)0x4ada4f45, (q31_t)0x4ad53664, + (q31_t)0x4ad01d54, (q31_t)0x4acb0417, (q31_t)0x4ac5eaab, (q31_t)0x4ac0d111, (q31_t)0x4abbb749, (q31_t)0x4ab69d53, (q31_t)0x4ab1832f, (q31_t)0x4aac68dc, + (q31_t)0x4aa74e5c, (q31_t)0x4aa233ae, (q31_t)0x4a9d18d1, (q31_t)0x4a97fdc7, (q31_t)0x4a92e28e, (q31_t)0x4a8dc728, (q31_t)0x4a88ab93, (q31_t)0x4a838fd1, + (q31_t)0x4a7e73e0, (q31_t)0x4a7957c2, (q31_t)0x4a743b76, (q31_t)0x4a6f1efc, (q31_t)0x4a6a0253, (q31_t)0x4a64e57d, (q31_t)0x4a5fc879, (q31_t)0x4a5aab48, + (q31_t)0x4a558de8, (q31_t)0x4a50705a, (q31_t)0x4a4b529f, (q31_t)0x4a4634b6, (q31_t)0x4a41169f, (q31_t)0x4a3bf85a, (q31_t)0x4a36d9e7, (q31_t)0x4a31bb47, + (q31_t)0x4a2c9c79, (q31_t)0x4a277d7d, (q31_t)0x4a225e53, (q31_t)0x4a1d3efc, (q31_t)0x4a181f77, (q31_t)0x4a12ffc4, (q31_t)0x4a0ddfe4, (q31_t)0x4a08bfd5, + (q31_t)0x4a039f9a, (q31_t)0x49fe7f30, (q31_t)0x49f95e99, (q31_t)0x49f43dd4, (q31_t)0x49ef1ce2, (q31_t)0x49e9fbc2, (q31_t)0x49e4da74, (q31_t)0x49dfb8f9, + (q31_t)0x49da9750, (q31_t)0x49d5757a, (q31_t)0x49d05376, (q31_t)0x49cb3145, (q31_t)0x49c60ee6, (q31_t)0x49c0ec59, (q31_t)0x49bbc9a0, (q31_t)0x49b6a6b8, + (q31_t)0x49b183a3, (q31_t)0x49ac6061, (q31_t)0x49a73cf1, (q31_t)0x49a21954, (q31_t)0x499cf589, (q31_t)0x4997d191, (q31_t)0x4992ad6c, (q31_t)0x498d8919, + (q31_t)0x49886499, (q31_t)0x49833fec, (q31_t)0x497e1b11, (q31_t)0x4978f609, (q31_t)0x4973d0d3, (q31_t)0x496eab70, (q31_t)0x496985e0, (q31_t)0x49646023, + (q31_t)0x495f3a38, (q31_t)0x495a1420, (q31_t)0x4954eddb, (q31_t)0x494fc768, (q31_t)0x494aa0c9, (q31_t)0x494579fc, (q31_t)0x49405302, (q31_t)0x493b2bdb, + (q31_t)0x49360486, (q31_t)0x4930dd05, (q31_t)0x492bb556, (q31_t)0x49268d7a, (q31_t)0x49216571, (q31_t)0x491c3d3b, (q31_t)0x491714d8, (q31_t)0x4911ec47, + (q31_t)0x490cc38a, (q31_t)0x49079aa0, (q31_t)0x49027188, (q31_t)0x48fd4844, (q31_t)0x48f81ed2, (q31_t)0x48f2f534, (q31_t)0x48edcb68, (q31_t)0x48e8a170, + (q31_t)0x48e3774a, (q31_t)0x48de4cf8, (q31_t)0x48d92278, (q31_t)0x48d3f7cc, (q31_t)0x48ceccf3, (q31_t)0x48c9a1ed, (q31_t)0x48c476b9, (q31_t)0x48bf4b59, + (q31_t)0x48ba1fcd, (q31_t)0x48b4f413, (q31_t)0x48afc82c, (q31_t)0x48aa9c19, (q31_t)0x48a56fd9, (q31_t)0x48a0436c, (q31_t)0x489b16d2, (q31_t)0x4895ea0b, + (q31_t)0x4890bd18, (q31_t)0x488b8ff8, (q31_t)0x488662ab, (q31_t)0x48813531, (q31_t)0x487c078b, (q31_t)0x4876d9b8, (q31_t)0x4871abb8, (q31_t)0x486c7d8c, + (q31_t)0x48674f33, (q31_t)0x486220ad, (q31_t)0x485cf1fa, (q31_t)0x4857c31b, (q31_t)0x48529410, (q31_t)0x484d64d7, (q31_t)0x48483572, (q31_t)0x484305e1, + (q31_t)0x483dd623, (q31_t)0x4838a638, (q31_t)0x48337621, (q31_t)0x482e45dd, (q31_t)0x4829156d, (q31_t)0x4823e4d0, (q31_t)0x481eb407, (q31_t)0x48198311, + (q31_t)0x481451ef, (q31_t)0x480f20a0, (q31_t)0x4809ef25, (q31_t)0x4804bd7e, (q31_t)0x47ff8baa, (q31_t)0x47fa59a9, (q31_t)0x47f5277d, (q31_t)0x47eff523, + (q31_t)0x47eac29e, (q31_t)0x47e58fec, (q31_t)0x47e05d0e, (q31_t)0x47db2a03, (q31_t)0x47d5f6cc, (q31_t)0x47d0c369, (q31_t)0x47cb8fd9, (q31_t)0x47c65c1d, + (q31_t)0x47c12835, (q31_t)0x47bbf421, (q31_t)0x47b6bfe0, (q31_t)0x47b18b74, (q31_t)0x47ac56da, (q31_t)0x47a72215, (q31_t)0x47a1ed24, (q31_t)0x479cb806, + (q31_t)0x479782bc, (q31_t)0x47924d46, (q31_t)0x478d17a4, (q31_t)0x4787e1d6, (q31_t)0x4782abdb, (q31_t)0x477d75b5, (q31_t)0x47783f62, (q31_t)0x477308e3, + (q31_t)0x476dd239, (q31_t)0x47689b62, (q31_t)0x4763645f, (q31_t)0x475e2d30, (q31_t)0x4758f5d5, (q31_t)0x4753be4e, (q31_t)0x474e869b, (q31_t)0x47494ebc, + (q31_t)0x474416b1, (q31_t)0x473ede7a, (q31_t)0x4739a617, (q31_t)0x47346d89, (q31_t)0x472f34ce, (q31_t)0x4729fbe7, (q31_t)0x4724c2d5, (q31_t)0x471f8996, + (q31_t)0x471a502c, (q31_t)0x47151696, (q31_t)0x470fdcd4, (q31_t)0x470aa2e6, (q31_t)0x470568cd, (q31_t)0x47002e87, (q31_t)0x46faf416, (q31_t)0x46f5b979, + (q31_t)0x46f07eb0, (q31_t)0x46eb43bc, (q31_t)0x46e6089b, (q31_t)0x46e0cd4f, (q31_t)0x46db91d8, (q31_t)0x46d65634, (q31_t)0x46d11a65, (q31_t)0x46cbde6a, + (q31_t)0x46c6a244, (q31_t)0x46c165f1, (q31_t)0x46bc2974, (q31_t)0x46b6ecca, (q31_t)0x46b1aff5, (q31_t)0x46ac72f4, (q31_t)0x46a735c8, (q31_t)0x46a1f870, + (q31_t)0x469cbaed, (q31_t)0x46977d3e, (q31_t)0x46923f63, (q31_t)0x468d015d, (q31_t)0x4687c32c, (q31_t)0x468284cf, (q31_t)0x467d4646, (q31_t)0x46780792, + (q31_t)0x4672c8b3, (q31_t)0x466d89a8, (q31_t)0x46684a71, (q31_t)0x46630b0f, (q31_t)0x465dcb82, (q31_t)0x46588bc9, (q31_t)0x46534be5, (q31_t)0x464e0bd6, + (q31_t)0x4648cb9b, (q31_t)0x46438b35, (q31_t)0x463e4aa3, (q31_t)0x463909e7, (q31_t)0x4633c8fe, (q31_t)0x462e87eb, (q31_t)0x462946ac, (q31_t)0x46240542, + (q31_t)0x461ec3ad, (q31_t)0x461981ec, (q31_t)0x46144001, (q31_t)0x460efde9, (q31_t)0x4609bba7, (q31_t)0x4604793a, (q31_t)0x45ff36a1, (q31_t)0x45f9f3dd, + (q31_t)0x45f4b0ee, (q31_t)0x45ef6dd4, (q31_t)0x45ea2a8f, (q31_t)0x45e4e71f, (q31_t)0x45dfa383, (q31_t)0x45da5fbc, (q31_t)0x45d51bcb, (q31_t)0x45cfd7ae, + (q31_t)0x45ca9366, (q31_t)0x45c54ef3, (q31_t)0x45c00a55, (q31_t)0x45bac58c, (q31_t)0x45b58098, (q31_t)0x45b03b79, (q31_t)0x45aaf630, (q31_t)0x45a5b0bb, + (q31_t)0x45a06b1b, (q31_t)0x459b2550, (q31_t)0x4595df5a, (q31_t)0x45909939, (q31_t)0x458b52ee, (q31_t)0x45860c77, (q31_t)0x4580c5d6, (q31_t)0x457b7f0a, + (q31_t)0x45763813, (q31_t)0x4570f0f1, (q31_t)0x456ba9a4, (q31_t)0x4566622c, (q31_t)0x45611a8a, (q31_t)0x455bd2bc, (q31_t)0x45568ac4, (q31_t)0x455142a2, + (q31_t)0x454bfa54, (q31_t)0x4546b1dc, (q31_t)0x45416939, (q31_t)0x453c206b, (q31_t)0x4536d773, (q31_t)0x45318e4f, (q31_t)0x452c4502, (q31_t)0x4526fb89, + (q31_t)0x4521b1e6, (q31_t)0x451c6818, (q31_t)0x45171e20, (q31_t)0x4511d3fd, (q31_t)0x450c89af, (q31_t)0x45073f37, (q31_t)0x4501f494, (q31_t)0x44fca9c6, + (q31_t)0x44f75ecf, (q31_t)0x44f213ac, (q31_t)0x44ecc85f, (q31_t)0x44e77ce7, (q31_t)0x44e23145, (q31_t)0x44dce579, (q31_t)0x44d79982, (q31_t)0x44d24d60, + (q31_t)0x44cd0114, (q31_t)0x44c7b49e, (q31_t)0x44c267fd, (q31_t)0x44bd1b32, (q31_t)0x44b7ce3c, (q31_t)0x44b2811c, (q31_t)0x44ad33d2, (q31_t)0x44a7e65d, + (q31_t)0x44a298be, (q31_t)0x449d4af5, (q31_t)0x4497fd01, (q31_t)0x4492aee3, (q31_t)0x448d609b, (q31_t)0x44881228, (q31_t)0x4482c38b, (q31_t)0x447d74c4, + (q31_t)0x447825d2, (q31_t)0x4472d6b7, (q31_t)0x446d8771, (q31_t)0x44683801, (q31_t)0x4462e866, (q31_t)0x445d98a2, (q31_t)0x445848b3, (q31_t)0x4452f89b, + (q31_t)0x444da858, (q31_t)0x444857ea, (q31_t)0x44430753, (q31_t)0x443db692, (q31_t)0x443865a7, (q31_t)0x44331491, (q31_t)0x442dc351, (q31_t)0x442871e8, + (q31_t)0x44232054, (q31_t)0x441dce96, (q31_t)0x44187caf, (q31_t)0x44132a9d, (q31_t)0x440dd861, (q31_t)0x440885fc, (q31_t)0x4403336c, (q31_t)0x43fde0b2, + (q31_t)0x43f88dcf, (q31_t)0x43f33ac1, (q31_t)0x43ede78a, (q31_t)0x43e89429, (q31_t)0x43e3409d, (q31_t)0x43ddece8, (q31_t)0x43d8990a, (q31_t)0x43d34501, + (q31_t)0x43cdf0ce, (q31_t)0x43c89c72, (q31_t)0x43c347eb, (q31_t)0x43bdf33b, (q31_t)0x43b89e62, (q31_t)0x43b3495e, (q31_t)0x43adf431, (q31_t)0x43a89ed9, + (q31_t)0x43a34959, (q31_t)0x439df3ae, (q31_t)0x43989dda, (q31_t)0x439347dc, (q31_t)0x438df1b4, (q31_t)0x43889b63, (q31_t)0x438344e8, (q31_t)0x437dee43, + (q31_t)0x43789775, (q31_t)0x4373407d, (q31_t)0x436de95b, (q31_t)0x43689210, (q31_t)0x43633a9c, (q31_t)0x435de2fd, (q31_t)0x43588b36, (q31_t)0x43533344, + (q31_t)0x434ddb29, (q31_t)0x434882e5, (q31_t)0x43432a77, (q31_t)0x433dd1e0, (q31_t)0x4338791f, (q31_t)0x43332035, (q31_t)0x432dc721, (q31_t)0x43286de4, + (q31_t)0x4323147d, (q31_t)0x431dbaed, (q31_t)0x43186133, (q31_t)0x43130751, (q31_t)0x430dad44, (q31_t)0x4308530f, (q31_t)0x4302f8b0, (q31_t)0x42fd9e28, + (q31_t)0x42f84376, (q31_t)0x42f2e89b, (q31_t)0x42ed8d97, (q31_t)0x42e83269, (q31_t)0x42e2d713, (q31_t)0x42dd7b93, (q31_t)0x42d81fe9, (q31_t)0x42d2c417, + (q31_t)0x42cd681b, (q31_t)0x42c80bf6, (q31_t)0x42c2afa8, (q31_t)0x42bd5331, (q31_t)0x42b7f690, (q31_t)0x42b299c7, (q31_t)0x42ad3cd4, (q31_t)0x42a7dfb8, + (q31_t)0x42a28273, (q31_t)0x429d2505, (q31_t)0x4297c76e, (q31_t)0x429269ae, (q31_t)0x428d0bc4, (q31_t)0x4287adb2, (q31_t)0x42824f76, (q31_t)0x427cf112, + (q31_t)0x42779285, (q31_t)0x427233ce, (q31_t)0x426cd4ef, (q31_t)0x426775e6, (q31_t)0x426216b5, (q31_t)0x425cb75a, (q31_t)0x425757d7, (q31_t)0x4251f82b, + (q31_t)0x424c9856, (q31_t)0x42473858, (q31_t)0x4241d831, (q31_t)0x423c77e1, (q31_t)0x42371769, (q31_t)0x4231b6c7, (q31_t)0x422c55fd, (q31_t)0x4226f50a, + (q31_t)0x422193ee, (q31_t)0x421c32a9, (q31_t)0x4216d13c, (q31_t)0x42116fa5, (q31_t)0x420c0de6, (q31_t)0x4206abfe, (q31_t)0x420149ee, (q31_t)0x41fbe7b5, + (q31_t)0x41f68553, (q31_t)0x41f122c8, (q31_t)0x41ebc015, (q31_t)0x41e65d39, (q31_t)0x41e0fa35, (q31_t)0x41db9707, (q31_t)0x41d633b1, (q31_t)0x41d0d033, + (q31_t)0x41cb6c8c, (q31_t)0x41c608bc, (q31_t)0x41c0a4c4, (q31_t)0x41bb40a3, (q31_t)0x41b5dc5a, (q31_t)0x41b077e8, (q31_t)0x41ab134e, (q31_t)0x41a5ae8b, + (q31_t)0x41a049a0, (q31_t)0x419ae48c, (q31_t)0x41957f4f, (q31_t)0x419019eb, (q31_t)0x418ab45d, (q31_t)0x41854ea8, (q31_t)0x417fe8ca, (q31_t)0x417a82c3, + (q31_t)0x41751c94, (q31_t)0x416fb63d, (q31_t)0x416a4fbd, (q31_t)0x4164e916, (q31_t)0x415f8245, (q31_t)0x415a1b4d, (q31_t)0x4154b42c, (q31_t)0x414f4ce2, + (q31_t)0x4149e571, (q31_t)0x41447dd7, (q31_t)0x413f1615, (q31_t)0x4139ae2b, (q31_t)0x41344618, (q31_t)0x412edddd, (q31_t)0x4129757b, (q31_t)0x41240cef, + (q31_t)0x411ea43c, (q31_t)0x41193b61, (q31_t)0x4113d25d, (q31_t)0x410e6931, (q31_t)0x4108ffdd, (q31_t)0x41039661, (q31_t)0x40fe2cbd, (q31_t)0x40f8c2f1, + (q31_t)0x40f358fc, (q31_t)0x40edeee0, (q31_t)0x40e8849b, (q31_t)0x40e31a2f, (q31_t)0x40ddaf9b, (q31_t)0x40d844de, (q31_t)0x40d2d9f9, (q31_t)0x40cd6eed, + (q31_t)0x40c803b8, (q31_t)0x40c2985c, (q31_t)0x40bd2cd8, (q31_t)0x40b7c12b, (q31_t)0x40b25557, (q31_t)0x40ace95b, (q31_t)0x40a77d37, (q31_t)0x40a210eb, + (q31_t)0x409ca477, (q31_t)0x409737dc, (q31_t)0x4091cb18, (q31_t)0x408c5e2d, (q31_t)0x4086f11a, (q31_t)0x408183df, (q31_t)0x407c167c, (q31_t)0x4076a8f1, + (q31_t)0x40713b3f, (q31_t)0x406bcd65, (q31_t)0x40665f63, (q31_t)0x4060f13a, (q31_t)0x405b82e9, (q31_t)0x40561470, (q31_t)0x4050a5cf, (q31_t)0x404b3707, + (q31_t)0x4045c817, (q31_t)0x404058ff, (q31_t)0x403ae9c0, (q31_t)0x40357a59, (q31_t)0x40300acb, (q31_t)0x402a9b15, (q31_t)0x40252b37, (q31_t)0x401fbb32, + (q31_t)0x401a4b05, (q31_t)0x4014dab1, (q31_t)0x400f6a35, (q31_t)0x4009f992, (q31_t)0x400488c7, (q31_t)0x3fff17d5, (q31_t)0x3ff9a6bb, (q31_t)0x3ff4357a, + (q31_t)0x3feec411, (q31_t)0x3fe95281, (q31_t)0x3fe3e0c9, (q31_t)0x3fde6eeb, (q31_t)0x3fd8fce4, (q31_t)0x3fd38ab6, (q31_t)0x3fce1861, (q31_t)0x3fc8a5e5, + (q31_t)0x3fc33341, (q31_t)0x3fbdc076, (q31_t)0x3fb84d83, (q31_t)0x3fb2da6a, (q31_t)0x3fad6729, (q31_t)0x3fa7f3c0, (q31_t)0x3fa28031, (q31_t)0x3f9d0c7a, + (q31_t)0x3f97989c, (q31_t)0x3f922496, (q31_t)0x3f8cb06a, (q31_t)0x3f873c16, (q31_t)0x3f81c79b, (q31_t)0x3f7c52f9, (q31_t)0x3f76de30, (q31_t)0x3f71693f, + (q31_t)0x3f6bf428, (q31_t)0x3f667ee9, (q31_t)0x3f610983, (q31_t)0x3f5b93f6, (q31_t)0x3f561e42, (q31_t)0x3f50a867, (q31_t)0x3f4b3265, (q31_t)0x3f45bc3c, + (q31_t)0x3f4045ec, (q31_t)0x3f3acf75, (q31_t)0x3f3558d7, (q31_t)0x3f2fe211, (q31_t)0x3f2a6b25, (q31_t)0x3f24f412, (q31_t)0x3f1f7cd8, (q31_t)0x3f1a0577, + (q31_t)0x3f148def, (q31_t)0x3f0f1640, (q31_t)0x3f099e6b, (q31_t)0x3f04266e, (q31_t)0x3efeae4a, (q31_t)0x3ef93600, (q31_t)0x3ef3bd8f, (q31_t)0x3eee44f7, + (q31_t)0x3ee8cc38, (q31_t)0x3ee35352, (q31_t)0x3eddda46, (q31_t)0x3ed86113, (q31_t)0x3ed2e7b9, (q31_t)0x3ecd6e38, (q31_t)0x3ec7f491, (q31_t)0x3ec27ac2, + (q31_t)0x3ebd00cd, (q31_t)0x3eb786b2, (q31_t)0x3eb20c6f, (q31_t)0x3eac9206, (q31_t)0x3ea71777, (q31_t)0x3ea19cc1, (q31_t)0x3e9c21e4, (q31_t)0x3e96a6e0, + (q31_t)0x3e912bb6, (q31_t)0x3e8bb065, (q31_t)0x3e8634ee, (q31_t)0x3e80b950, (q31_t)0x3e7b3d8c, (q31_t)0x3e75c1a1, (q31_t)0x3e70458f, (q31_t)0x3e6ac957, + (q31_t)0x3e654cf8, (q31_t)0x3e5fd073, (q31_t)0x3e5a53c8, (q31_t)0x3e54d6f6, (q31_t)0x3e4f59fe, (q31_t)0x3e49dcdf, (q31_t)0x3e445f99, (q31_t)0x3e3ee22e, + (q31_t)0x3e39649c, (q31_t)0x3e33e6e3, (q31_t)0x3e2e6904, (q31_t)0x3e28eaff, (q31_t)0x3e236cd4, (q31_t)0x3e1dee82, (q31_t)0x3e18700a, (q31_t)0x3e12f16b, + (q31_t)0x3e0d72a6, (q31_t)0x3e07f3bb, (q31_t)0x3e0274aa, (q31_t)0x3dfcf572, (q31_t)0x3df77615, (q31_t)0x3df1f691, (q31_t)0x3dec76e6, (q31_t)0x3de6f716, + (q31_t)0x3de1771f, (q31_t)0x3ddbf703, (q31_t)0x3dd676c0, (q31_t)0x3dd0f656, (q31_t)0x3dcb75c7, (q31_t)0x3dc5f512, (q31_t)0x3dc07436, (q31_t)0x3dbaf335, + (q31_t)0x3db5720d, (q31_t)0x3daff0c0, (q31_t)0x3daa6f4c, (q31_t)0x3da4edb2, (q31_t)0x3d9f6bf2, (q31_t)0x3d99ea0d, (q31_t)0x3d946801, (q31_t)0x3d8ee5cf, + (q31_t)0x3d896377, (q31_t)0x3d83e0f9, (q31_t)0x3d7e5e56, (q31_t)0x3d78db8c, (q31_t)0x3d73589d, (q31_t)0x3d6dd587, (q31_t)0x3d68524c, (q31_t)0x3d62ceeb, + (q31_t)0x3d5d4b64, (q31_t)0x3d57c7b7, (q31_t)0x3d5243e4, (q31_t)0x3d4cbfeb, (q31_t)0x3d473bcd, (q31_t)0x3d41b789, (q31_t)0x3d3c331f, (q31_t)0x3d36ae8f, + (q31_t)0x3d3129da, (q31_t)0x3d2ba4fe, (q31_t)0x3d261ffd, (q31_t)0x3d209ad7, (q31_t)0x3d1b158a, (q31_t)0x3d159018, (q31_t)0x3d100a80, (q31_t)0x3d0a84c3, + (q31_t)0x3d04fee0, (q31_t)0x3cff78d7, (q31_t)0x3cf9f2a9, (q31_t)0x3cf46c55, (q31_t)0x3ceee5db, (q31_t)0x3ce95f3c, (q31_t)0x3ce3d877, (q31_t)0x3cde518d, + (q31_t)0x3cd8ca7d, (q31_t)0x3cd34347, (q31_t)0x3ccdbbed, (q31_t)0x3cc8346c, (q31_t)0x3cc2acc6, (q31_t)0x3cbd24fb, (q31_t)0x3cb79d0a, (q31_t)0x3cb214f4, + (q31_t)0x3cac8cb8, (q31_t)0x3ca70457, (q31_t)0x3ca17bd0, (q31_t)0x3c9bf324, (q31_t)0x3c966a53, (q31_t)0x3c90e15c, (q31_t)0x3c8b5840, (q31_t)0x3c85cefe, + (q31_t)0x3c804598, (q31_t)0x3c7abc0c, (q31_t)0x3c75325a, (q31_t)0x3c6fa883, (q31_t)0x3c6a1e87, (q31_t)0x3c649466, (q31_t)0x3c5f0a20, (q31_t)0x3c597fb4, + (q31_t)0x3c53f523, (q31_t)0x3c4e6a6d, (q31_t)0x3c48df91, (q31_t)0x3c435491, (q31_t)0x3c3dc96b, (q31_t)0x3c383e20, (q31_t)0x3c32b2b0, (q31_t)0x3c2d271b, + (q31_t)0x3c279b61, (q31_t)0x3c220f81, (q31_t)0x3c1c837d, (q31_t)0x3c16f753, (q31_t)0x3c116b04, (q31_t)0x3c0bde91, (q31_t)0x3c0651f8, (q31_t)0x3c00c53a, + (q31_t)0x3bfb3857, (q31_t)0x3bf5ab50, (q31_t)0x3bf01e23, (q31_t)0x3bea90d1, (q31_t)0x3be5035a, (q31_t)0x3bdf75bf, (q31_t)0x3bd9e7fe, (q31_t)0x3bd45a19, + (q31_t)0x3bcecc0e, (q31_t)0x3bc93ddf, (q31_t)0x3bc3af8b, (q31_t)0x3bbe2112, (q31_t)0x3bb89274, (q31_t)0x3bb303b1, (q31_t)0x3bad74c9, (q31_t)0x3ba7e5bd, + (q31_t)0x3ba2568c, (q31_t)0x3b9cc736, (q31_t)0x3b9737bb, (q31_t)0x3b91a81c, (q31_t)0x3b8c1857, (q31_t)0x3b86886e, (q31_t)0x3b80f861, (q31_t)0x3b7b682e, + (q31_t)0x3b75d7d7, (q31_t)0x3b70475c, (q31_t)0x3b6ab6bb, (q31_t)0x3b6525f6, (q31_t)0x3b5f950c, (q31_t)0x3b5a03fe, (q31_t)0x3b5472cb, (q31_t)0x3b4ee173, + (q31_t)0x3b494ff7, (q31_t)0x3b43be57, (q31_t)0x3b3e2c91, (q31_t)0x3b389aa8, (q31_t)0x3b330899, (q31_t)0x3b2d7666, (q31_t)0x3b27e40f, (q31_t)0x3b225193, + (q31_t)0x3b1cbef3, (q31_t)0x3b172c2e, (q31_t)0x3b119945, (q31_t)0x3b0c0637, (q31_t)0x3b067305, (q31_t)0x3b00dfaf, (q31_t)0x3afb4c34, (q31_t)0x3af5b894, + (q31_t)0x3af024d1, (q31_t)0x3aea90e9, (q31_t)0x3ae4fcdc, (q31_t)0x3adf68ac, (q31_t)0x3ad9d457, (q31_t)0x3ad43fdd, (q31_t)0x3aceab40, (q31_t)0x3ac9167e, + (q31_t)0x3ac38198, (q31_t)0x3abdec8d, (q31_t)0x3ab8575f, (q31_t)0x3ab2c20c, (q31_t)0x3aad2c95, (q31_t)0x3aa796fa, (q31_t)0x3aa2013a, (q31_t)0x3a9c6b57, + (q31_t)0x3a96d54f, (q31_t)0x3a913f23, (q31_t)0x3a8ba8d3, (q31_t)0x3a86125f, (q31_t)0x3a807bc7, (q31_t)0x3a7ae50a, (q31_t)0x3a754e2a, (q31_t)0x3a6fb726, + (q31_t)0x3a6a1ffd, (q31_t)0x3a6488b1, (q31_t)0x3a5ef140, (q31_t)0x3a5959ab, (q31_t)0x3a53c1f3, (q31_t)0x3a4e2a16, (q31_t)0x3a489216, (q31_t)0x3a42f9f2, + (q31_t)0x3a3d61a9, (q31_t)0x3a37c93d, (q31_t)0x3a3230ad, (q31_t)0x3a2c97f9, (q31_t)0x3a26ff21, (q31_t)0x3a216625, (q31_t)0x3a1bcd05, (q31_t)0x3a1633c1, + (q31_t)0x3a109a5a, (q31_t)0x3a0b00cf, (q31_t)0x3a056720, (q31_t)0x39ffcd4d, (q31_t)0x39fa3356, (q31_t)0x39f4993c, (q31_t)0x39eefefe, (q31_t)0x39e9649c, + (q31_t)0x39e3ca17, (q31_t)0x39de2f6d, (q31_t)0x39d894a0, (q31_t)0x39d2f9b0, (q31_t)0x39cd5e9b, (q31_t)0x39c7c363, (q31_t)0x39c22808, (q31_t)0x39bc8c89, + (q31_t)0x39b6f0e6, (q31_t)0x39b1551f, (q31_t)0x39abb935, (q31_t)0x39a61d28, (q31_t)0x39a080f6, (q31_t)0x399ae4a2, (q31_t)0x39954829, (q31_t)0x398fab8e, + (q31_t)0x398a0ece, (q31_t)0x398471ec, (q31_t)0x397ed4e5, (q31_t)0x397937bc, (q31_t)0x39739a6e, (q31_t)0x396dfcfe, (q31_t)0x39685f6a, (q31_t)0x3962c1b2, + (q31_t)0x395d23d7, (q31_t)0x395785d9, (q31_t)0x3951e7b8, (q31_t)0x394c4973, (q31_t)0x3946ab0a, (q31_t)0x39410c7f, (q31_t)0x393b6dd0, (q31_t)0x3935cefd, + (q31_t)0x39303008, (q31_t)0x392a90ef, (q31_t)0x3924f1b3, (q31_t)0x391f5254, (q31_t)0x3919b2d1, (q31_t)0x3914132b, (q31_t)0x390e7362, (q31_t)0x3908d376, + (q31_t)0x39033367, (q31_t)0x38fd9334, (q31_t)0x38f7f2de, (q31_t)0x38f25266, (q31_t)0x38ecb1ca, (q31_t)0x38e7110a, (q31_t)0x38e17028, (q31_t)0x38dbcf23, + (q31_t)0x38d62dfb, (q31_t)0x38d08caf, (q31_t)0x38caeb41, (q31_t)0x38c549af, (q31_t)0x38bfa7fb, (q31_t)0x38ba0623, (q31_t)0x38b46429, (q31_t)0x38aec20b, + (q31_t)0x38a91fcb, (q31_t)0x38a37d67, (q31_t)0x389ddae1, (q31_t)0x38983838, (q31_t)0x3892956c, (q31_t)0x388cf27d, (q31_t)0x38874f6b, (q31_t)0x3881ac36, + (q31_t)0x387c08de, (q31_t)0x38766564, (q31_t)0x3870c1c6, (q31_t)0x386b1e06, (q31_t)0x38657a23, (q31_t)0x385fd61d, (q31_t)0x385a31f5, (q31_t)0x38548daa, + (q31_t)0x384ee93b, (q31_t)0x384944ab, (q31_t)0x38439ff7, (q31_t)0x383dfb21, (q31_t)0x38385628, (q31_t)0x3832b10d, (q31_t)0x382d0bce, (q31_t)0x3827666d, + (q31_t)0x3821c0ea, (q31_t)0x381c1b44, (q31_t)0x3816757b, (q31_t)0x3810cf90, (q31_t)0x380b2982, (q31_t)0x38058351, (q31_t)0x37ffdcfe, (q31_t)0x37fa3688, + (q31_t)0x37f48ff0, (q31_t)0x37eee936, (q31_t)0x37e94259, (q31_t)0x37e39b59, (q31_t)0x37ddf437, (q31_t)0x37d84cf2, (q31_t)0x37d2a58b, (q31_t)0x37ccfe02, + (q31_t)0x37c75656, (q31_t)0x37c1ae87, (q31_t)0x37bc0697, (q31_t)0x37b65e84, (q31_t)0x37b0b64e, (q31_t)0x37ab0df6, (q31_t)0x37a5657c, (q31_t)0x379fbce0, + (q31_t)0x379a1421, (q31_t)0x37946b40, (q31_t)0x378ec23d, (q31_t)0x37891917, (q31_t)0x37836fcf, (q31_t)0x377dc665, (q31_t)0x37781cd9, (q31_t)0x3772732a, + (q31_t)0x376cc959, (q31_t)0x37671f66, (q31_t)0x37617551, (q31_t)0x375bcb1a, (q31_t)0x375620c1, (q31_t)0x37507645, (q31_t)0x374acba7, (q31_t)0x374520e7, + (q31_t)0x373f7606, (q31_t)0x3739cb02, (q31_t)0x37341fdc, (q31_t)0x372e7493, (q31_t)0x3728c929, (q31_t)0x37231d9d, (q31_t)0x371d71ef, (q31_t)0x3717c61f, + (q31_t)0x37121a2d, (q31_t)0x370c6e19, (q31_t)0x3706c1e2, (q31_t)0x3701158a, (q31_t)0x36fb6910, (q31_t)0x36f5bc75, (q31_t)0x36f00fb7, (q31_t)0x36ea62d7, + (q31_t)0x36e4b5d6, (q31_t)0x36df08b2, (q31_t)0x36d95b6d, (q31_t)0x36d3ae06, (q31_t)0x36ce007d, (q31_t)0x36c852d2, (q31_t)0x36c2a506, (q31_t)0x36bcf718, + (q31_t)0x36b74908, (q31_t)0x36b19ad6, (q31_t)0x36abec82, (q31_t)0x36a63e0d, (q31_t)0x36a08f76, (q31_t)0x369ae0bd, (q31_t)0x369531e3, (q31_t)0x368f82e7, + (q31_t)0x3689d3c9, (q31_t)0x3684248a, (q31_t)0x367e7529, (q31_t)0x3678c5a7, (q31_t)0x36731602, (q31_t)0x366d663d, (q31_t)0x3667b655, (q31_t)0x3662064c, + (q31_t)0x365c5622, (q31_t)0x3656a5d6, (q31_t)0x3650f569, (q31_t)0x364b44da, (q31_t)0x36459429, (q31_t)0x363fe357, (q31_t)0x363a3264, (q31_t)0x3634814f, + (q31_t)0x362ed019, (q31_t)0x36291ec1, (q31_t)0x36236d48, (q31_t)0x361dbbad, (q31_t)0x361809f1, (q31_t)0x36125814, (q31_t)0x360ca615, (q31_t)0x3606f3f5, + (q31_t)0x360141b4, (q31_t)0x35fb8f52, (q31_t)0x35f5dcce, (q31_t)0x35f02a28, (q31_t)0x35ea7762, (q31_t)0x35e4c47a, (q31_t)0x35df1171, (q31_t)0x35d95e47, + (q31_t)0x35d3aafc, (q31_t)0x35cdf78f, (q31_t)0x35c84401, (q31_t)0x35c29052, (q31_t)0x35bcdc82, (q31_t)0x35b72891, (q31_t)0x35b1747e, (q31_t)0x35abc04b, + (q31_t)0x35a60bf6, (q31_t)0x35a05781, (q31_t)0x359aa2ea, (q31_t)0x3594ee32, (q31_t)0x358f3959, (q31_t)0x3589845f, (q31_t)0x3583cf44, (q31_t)0x357e1a08, + (q31_t)0x357864ab, (q31_t)0x3572af2d, (q31_t)0x356cf98e, (q31_t)0x356743ce, (q31_t)0x35618ded, (q31_t)0x355bd7eb, (q31_t)0x355621c9, (q31_t)0x35506b85, + (q31_t)0x354ab520, (q31_t)0x3544fe9b, (q31_t)0x353f47f5, (q31_t)0x3539912e, (q31_t)0x3533da46, (q31_t)0x352e233d, (q31_t)0x35286c14, (q31_t)0x3522b4c9, + (q31_t)0x351cfd5e, (q31_t)0x351745d2, (q31_t)0x35118e26, (q31_t)0x350bd658, (q31_t)0x35061e6a, (q31_t)0x3500665c, (q31_t)0x34faae2c, (q31_t)0x34f4f5dc, + (q31_t)0x34ef3d6b, (q31_t)0x34e984da, (q31_t)0x34e3cc28, (q31_t)0x34de1355, (q31_t)0x34d85a62, (q31_t)0x34d2a14e, (q31_t)0x34cce819, (q31_t)0x34c72ec4, + (q31_t)0x34c1754e, (q31_t)0x34bbbbb8, (q31_t)0x34b60202, (q31_t)0x34b0482a, (q31_t)0x34aa8e33, (q31_t)0x34a4d41a, (q31_t)0x349f19e2, (q31_t)0x34995f88, + (q31_t)0x3493a50f, (q31_t)0x348dea75, (q31_t)0x34882fba, (q31_t)0x348274e0, (q31_t)0x347cb9e4, (q31_t)0x3476fec9, (q31_t)0x3471438d, (q31_t)0x346b8830, + (q31_t)0x3465ccb4, (q31_t)0x34601117, (q31_t)0x345a5559, (q31_t)0x3454997c, (q31_t)0x344edd7e, (q31_t)0x34492160, (q31_t)0x34436521, (q31_t)0x343da8c3, + (q31_t)0x3437ec44, (q31_t)0x34322fa5, (q31_t)0x342c72e6, (q31_t)0x3426b606, (q31_t)0x3420f907, (q31_t)0x341b3be7, (q31_t)0x34157ea7, (q31_t)0x340fc147, + (q31_t)0x340a03c7, (q31_t)0x34044626, (q31_t)0x33fe8866, (q31_t)0x33f8ca86, (q31_t)0x33f30c85, (q31_t)0x33ed4e65, (q31_t)0x33e79024, (q31_t)0x33e1d1c4, + (q31_t)0x33dc1343, (q31_t)0x33d654a2, (q31_t)0x33d095e2, (q31_t)0x33cad701, (q31_t)0x33c51801, (q31_t)0x33bf58e1, (q31_t)0x33b999a0, (q31_t)0x33b3da40, + (q31_t)0x33ae1ac0, (q31_t)0x33a85b20, (q31_t)0x33a29b60, (q31_t)0x339cdb81, (q31_t)0x33971b81, (q31_t)0x33915b62, (q31_t)0x338b9b22, (q31_t)0x3385dac4, + (q31_t)0x33801a45, (q31_t)0x337a59a6, (q31_t)0x337498e8, (q31_t)0x336ed80a, (q31_t)0x3369170c, (q31_t)0x336355ef, (q31_t)0x335d94b2, (q31_t)0x3357d355, + (q31_t)0x335211d8, (q31_t)0x334c503c, (q31_t)0x33468e80, (q31_t)0x3340cca5, (q31_t)0x333b0aaa, (q31_t)0x3335488f, (q31_t)0x332f8655, (q31_t)0x3329c3fb, + (q31_t)0x33240182, (q31_t)0x331e3ee9, (q31_t)0x33187c31, (q31_t)0x3312b959, (q31_t)0x330cf661, (q31_t)0x3307334a, (q31_t)0x33017014, (q31_t)0x32fbacbe, + (q31_t)0x32f5e948, (q31_t)0x32f025b4, (q31_t)0x32ea61ff, (q31_t)0x32e49e2c, (q31_t)0x32deda39, (q31_t)0x32d91626, (q31_t)0x32d351f5, (q31_t)0x32cd8da4, + (q31_t)0x32c7c933, (q31_t)0x32c204a3, (q31_t)0x32bc3ff4, (q31_t)0x32b67b26, (q31_t)0x32b0b638, (q31_t)0x32aaf12b, (q31_t)0x32a52bff, (q31_t)0x329f66b4, + (q31_t)0x3299a149, (q31_t)0x3293dbbf, (q31_t)0x328e1616, (q31_t)0x3288504e, (q31_t)0x32828a67, (q31_t)0x327cc460, (q31_t)0x3276fe3a, (q31_t)0x327137f6, + (q31_t)0x326b7192, (q31_t)0x3265ab0f, (q31_t)0x325fe46c, (q31_t)0x325a1dab, (q31_t)0x325456cb, (q31_t)0x324e8fcc, (q31_t)0x3248c8ad, (q31_t)0x32430170, + (q31_t)0x323d3a14, (q31_t)0x32377298, (q31_t)0x3231aafe, (q31_t)0x322be345, (q31_t)0x32261b6c, (q31_t)0x32205375, (q31_t)0x321a8b5f, (q31_t)0x3214c32a, + (q31_t)0x320efad6, (q31_t)0x32093263, (q31_t)0x320369d2, (q31_t)0x31fda121, (q31_t)0x31f7d852, (q31_t)0x31f20f64, (q31_t)0x31ec4657, (q31_t)0x31e67d2b, + (q31_t)0x31e0b3e0, (q31_t)0x31daea77, (q31_t)0x31d520ef, (q31_t)0x31cf5748, (q31_t)0x31c98d83, (q31_t)0x31c3c39e, (q31_t)0x31bdf99b, (q31_t)0x31b82f7a, + (q31_t)0x31b2653a, (q31_t)0x31ac9adb, (q31_t)0x31a6d05d, (q31_t)0x31a105c1, (q31_t)0x319b3b06, (q31_t)0x3195702d, (q31_t)0x318fa535, (q31_t)0x3189da1e, + (q31_t)0x31840ee9, (q31_t)0x317e4395, (q31_t)0x31787823, (q31_t)0x3172ac92, (q31_t)0x316ce0e3, (q31_t)0x31671515, (q31_t)0x31614929, (q31_t)0x315b7d1e, + (q31_t)0x3155b0f5, (q31_t)0x314fe4ae, (q31_t)0x314a1848, (q31_t)0x31444bc3, (q31_t)0x313e7f21, (q31_t)0x3138b260, (q31_t)0x3132e580, (q31_t)0x312d1882, + (q31_t)0x31274b66, (q31_t)0x31217e2c, (q31_t)0x311bb0d3, (q31_t)0x3115e35c, (q31_t)0x311015c6, (q31_t)0x310a4813, (q31_t)0x31047a41, (q31_t)0x30feac51, + (q31_t)0x30f8de42, (q31_t)0x30f31016, (q31_t)0x30ed41cb, (q31_t)0x30e77362, (q31_t)0x30e1a4db, (q31_t)0x30dbd636, (q31_t)0x30d60772, (q31_t)0x30d03891, + (q31_t)0x30ca6991, (q31_t)0x30c49a74, (q31_t)0x30becb38, (q31_t)0x30b8fbde, (q31_t)0x30b32c66, (q31_t)0x30ad5cd0, (q31_t)0x30a78d1c, (q31_t)0x30a1bd4a, + (q31_t)0x309bed5a, (q31_t)0x30961d4c, (q31_t)0x30904d20, (q31_t)0x308a7cd6, (q31_t)0x3084ac6e, (q31_t)0x307edbe9, (q31_t)0x30790b45, (q31_t)0x30733a83, + (q31_t)0x306d69a4, (q31_t)0x306798a7, (q31_t)0x3061c78b, (q31_t)0x305bf652, (q31_t)0x305624fb, (q31_t)0x30505387, (q31_t)0x304a81f4, (q31_t)0x3044b044, + (q31_t)0x303ede76, (q31_t)0x30390c8a, (q31_t)0x30333a80, (q31_t)0x302d6859, (q31_t)0x30279614, (q31_t)0x3021c3b1, (q31_t)0x301bf131, (q31_t)0x30161e93, + (q31_t)0x30104bd7, (q31_t)0x300a78fe, (q31_t)0x3004a607, (q31_t)0x2ffed2f2, (q31_t)0x2ff8ffc0, (q31_t)0x2ff32c70, (q31_t)0x2fed5902, (q31_t)0x2fe78577, + (q31_t)0x2fe1b1cf, (q31_t)0x2fdbde09, (q31_t)0x2fd60a25, (q31_t)0x2fd03624, (q31_t)0x2fca6206, (q31_t)0x2fc48dc9, (q31_t)0x2fbeb970, (q31_t)0x2fb8e4f9, + (q31_t)0x2fb31064, (q31_t)0x2fad3bb3, (q31_t)0x2fa766e3, (q31_t)0x2fa191f7, (q31_t)0x2f9bbced, (q31_t)0x2f95e7c5, (q31_t)0x2f901280, (q31_t)0x2f8a3d1e, + (q31_t)0x2f84679f, (q31_t)0x2f7e9202, (q31_t)0x2f78bc48, (q31_t)0x2f72e671, (q31_t)0x2f6d107c, (q31_t)0x2f673a6a, (q31_t)0x2f61643b, (q31_t)0x2f5b8def, + (q31_t)0x2f55b785, (q31_t)0x2f4fe0ff, (q31_t)0x2f4a0a5b, (q31_t)0x2f44339a, (q31_t)0x2f3e5cbb, (q31_t)0x2f3885c0, (q31_t)0x2f32aea8, (q31_t)0x2f2cd772, + (q31_t)0x2f27001f, (q31_t)0x2f2128af, (q31_t)0x2f1b5122, (q31_t)0x2f157979, (q31_t)0x2f0fa1b2, (q31_t)0x2f09c9ce, (q31_t)0x2f03f1cd, (q31_t)0x2efe19ae, + (q31_t)0x2ef84173, (q31_t)0x2ef2691b, (q31_t)0x2eec90a7, (q31_t)0x2ee6b815, (q31_t)0x2ee0df66, (q31_t)0x2edb069a, (q31_t)0x2ed52db1, (q31_t)0x2ecf54ac, + (q31_t)0x2ec97b89, (q31_t)0x2ec3a24a, (q31_t)0x2ebdc8ee, (q31_t)0x2eb7ef75, (q31_t)0x2eb215df, (q31_t)0x2eac3c2d, (q31_t)0x2ea6625d, (q31_t)0x2ea08871, + (q31_t)0x2e9aae68, (q31_t)0x2e94d443, (q31_t)0x2e8efa00, (q31_t)0x2e891fa1, (q31_t)0x2e834525, (q31_t)0x2e7d6a8d, (q31_t)0x2e778fd8, (q31_t)0x2e71b506, + (q31_t)0x2e6bda17, (q31_t)0x2e65ff0c, (q31_t)0x2e6023e5, (q31_t)0x2e5a48a0, (q31_t)0x2e546d3f, (q31_t)0x2e4e91c2, (q31_t)0x2e48b628, (q31_t)0x2e42da71, + (q31_t)0x2e3cfe9e, (q31_t)0x2e3722ae, (q31_t)0x2e3146a2, (q31_t)0x2e2b6a79, (q31_t)0x2e258e34, (q31_t)0x2e1fb1d3, (q31_t)0x2e19d554, (q31_t)0x2e13f8ba, + (q31_t)0x2e0e1c03, (q31_t)0x2e083f30, (q31_t)0x2e026240, (q31_t)0x2dfc8534, (q31_t)0x2df6a80b, (q31_t)0x2df0cac6, (q31_t)0x2deaed65, (q31_t)0x2de50fe8, + (q31_t)0x2ddf324e, (q31_t)0x2dd95498, (q31_t)0x2dd376c5, (q31_t)0x2dcd98d7, (q31_t)0x2dc7bacc, (q31_t)0x2dc1dca4, (q31_t)0x2dbbfe61, (q31_t)0x2db62001, + (q31_t)0x2db04186, (q31_t)0x2daa62ee, (q31_t)0x2da4843a, (q31_t)0x2d9ea569, (q31_t)0x2d98c67d, (q31_t)0x2d92e774, (q31_t)0x2d8d084f, (q31_t)0x2d87290f, + (q31_t)0x2d8149b2, (q31_t)0x2d7b6a39, (q31_t)0x2d758aa4, (q31_t)0x2d6faaf3, (q31_t)0x2d69cb26, (q31_t)0x2d63eb3d, (q31_t)0x2d5e0b38, (q31_t)0x2d582b17, + (q31_t)0x2d524ada, (q31_t)0x2d4c6a81, (q31_t)0x2d468a0c, (q31_t)0x2d40a97b, (q31_t)0x2d3ac8ce, (q31_t)0x2d34e805, (q31_t)0x2d2f0721, (q31_t)0x2d292620, + (q31_t)0x2d234504, (q31_t)0x2d1d63cc, (q31_t)0x2d178278, (q31_t)0x2d11a108, (q31_t)0x2d0bbf7d, (q31_t)0x2d05ddd5, (q31_t)0x2cfffc12, (q31_t)0x2cfa1a33, + (q31_t)0x2cf43839, (q31_t)0x2cee5622, (q31_t)0x2ce873f0, (q31_t)0x2ce291a2, (q31_t)0x2cdcaf39, (q31_t)0x2cd6ccb4, (q31_t)0x2cd0ea13, (q31_t)0x2ccb0756, + (q31_t)0x2cc5247e, (q31_t)0x2cbf418b, (q31_t)0x2cb95e7b, (q31_t)0x2cb37b51, (q31_t)0x2cad980a, (q31_t)0x2ca7b4a8, (q31_t)0x2ca1d12a, (q31_t)0x2c9bed91, + (q31_t)0x2c9609dd, (q31_t)0x2c90260d, (q31_t)0x2c8a4221, (q31_t)0x2c845e1a, (q31_t)0x2c7e79f7, (q31_t)0x2c7895b9, (q31_t)0x2c72b160, (q31_t)0x2c6ccceb, + (q31_t)0x2c66e85b, (q31_t)0x2c6103af, (q31_t)0x2c5b1ee8, (q31_t)0x2c553a06, (q31_t)0x2c4f5508, (q31_t)0x2c496fef, (q31_t)0x2c438abb, (q31_t)0x2c3da56b, + (q31_t)0x2c37c000, (q31_t)0x2c31da7a, (q31_t)0x2c2bf4d8, (q31_t)0x2c260f1c, (q31_t)0x2c202944, (q31_t)0x2c1a4351, (q31_t)0x2c145d42, (q31_t)0x2c0e7719, + (q31_t)0x2c0890d4, (q31_t)0x2c02aa74, (q31_t)0x2bfcc3f9, (q31_t)0x2bf6dd63, (q31_t)0x2bf0f6b1, (q31_t)0x2beb0fe5, (q31_t)0x2be528fd, (q31_t)0x2bdf41fb, + (q31_t)0x2bd95add, (q31_t)0x2bd373a4, (q31_t)0x2bcd8c51, (q31_t)0x2bc7a4e2, (q31_t)0x2bc1bd58, (q31_t)0x2bbbd5b3, (q31_t)0x2bb5edf4, (q31_t)0x2bb00619, + (q31_t)0x2baa1e23, (q31_t)0x2ba43613, (q31_t)0x2b9e4de7, (q31_t)0x2b9865a1, (q31_t)0x2b927d3f, (q31_t)0x2b8c94c3, (q31_t)0x2b86ac2c, (q31_t)0x2b80c37a, + (q31_t)0x2b7adaae, (q31_t)0x2b74f1c6, (q31_t)0x2b6f08c4, (q31_t)0x2b691fa6, (q31_t)0x2b63366f, (q31_t)0x2b5d4d1c, (q31_t)0x2b5763ae, (q31_t)0x2b517a26, + (q31_t)0x2b4b9083, (q31_t)0x2b45a6c6, (q31_t)0x2b3fbced, (q31_t)0x2b39d2fa, (q31_t)0x2b33e8ed, (q31_t)0x2b2dfec5, (q31_t)0x2b281482, (q31_t)0x2b222a24, + (q31_t)0x2b1c3fac, (q31_t)0x2b165519, (q31_t)0x2b106a6c, (q31_t)0x2b0a7fa4, (q31_t)0x2b0494c2, (q31_t)0x2afea9c5, (q31_t)0x2af8bead, (q31_t)0x2af2d37b, + (q31_t)0x2aece82f, (q31_t)0x2ae6fcc8, (q31_t)0x2ae11146, (q31_t)0x2adb25aa, (q31_t)0x2ad539f4, (q31_t)0x2acf4e23, (q31_t)0x2ac96238, (q31_t)0x2ac37633, + (q31_t)0x2abd8a13, (q31_t)0x2ab79dd8, (q31_t)0x2ab1b184, (q31_t)0x2aabc515, (q31_t)0x2aa5d88b, (q31_t)0x2a9febe8, (q31_t)0x2a99ff2a, (q31_t)0x2a941252, + (q31_t)0x2a8e255f, (q31_t)0x2a883853, (q31_t)0x2a824b2c, (q31_t)0x2a7c5deb, (q31_t)0x2a76708f, (q31_t)0x2a70831a, (q31_t)0x2a6a958a, (q31_t)0x2a64a7e0, + (q31_t)0x2a5eba1c, (q31_t)0x2a58cc3e, (q31_t)0x2a52de46, (q31_t)0x2a4cf033, (q31_t)0x2a470207, (q31_t)0x2a4113c0, (q31_t)0x2a3b2560, (q31_t)0x2a3536e5, + (q31_t)0x2a2f4850, (q31_t)0x2a2959a1, (q31_t)0x2a236ad9, (q31_t)0x2a1d7bf6, (q31_t)0x2a178cf9, (q31_t)0x2a119de2, (q31_t)0x2a0baeb2, (q31_t)0x2a05bf67, + (q31_t)0x29ffd003, (q31_t)0x29f9e084, (q31_t)0x29f3f0ec, (q31_t)0x29ee013a, (q31_t)0x29e8116e, (q31_t)0x29e22188, (q31_t)0x29dc3188, (q31_t)0x29d6416f, + (q31_t)0x29d0513b, (q31_t)0x29ca60ee, (q31_t)0x29c47087, (q31_t)0x29be8007, (q31_t)0x29b88f6c, (q31_t)0x29b29eb8, (q31_t)0x29acadea, (q31_t)0x29a6bd02, + (q31_t)0x29a0cc01, (q31_t)0x299adae6, (q31_t)0x2994e9b1, (q31_t)0x298ef863, (q31_t)0x298906fb, (q31_t)0x2983157a, (q31_t)0x297d23df, (q31_t)0x2977322a, + (q31_t)0x2971405b, (q31_t)0x296b4e74, (q31_t)0x29655c72, (q31_t)0x295f6a57, (q31_t)0x29597823, (q31_t)0x295385d5, (q31_t)0x294d936d, (q31_t)0x2947a0ec, + (q31_t)0x2941ae52, (q31_t)0x293bbb9e, (q31_t)0x2935c8d1, (q31_t)0x292fd5ea, (q31_t)0x2929e2ea, (q31_t)0x2923efd0, (q31_t)0x291dfc9d, (q31_t)0x29180951, + (q31_t)0x291215eb, (q31_t)0x290c226c, (q31_t)0x29062ed4, (q31_t)0x29003b23, (q31_t)0x28fa4758, (q31_t)0x28f45374, (q31_t)0x28ee5f76, (q31_t)0x28e86b5f, + (q31_t)0x28e27730, (q31_t)0x28dc82e6, (q31_t)0x28d68e84, (q31_t)0x28d09a09, (q31_t)0x28caa574, (q31_t)0x28c4b0c6, (q31_t)0x28bebbff, (q31_t)0x28b8c71f, + (q31_t)0x28b2d226, (q31_t)0x28acdd13, (q31_t)0x28a6e7e8, (q31_t)0x28a0f2a3, (q31_t)0x289afd46, (q31_t)0x289507cf, (q31_t)0x288f123f, (q31_t)0x28891c97, + (q31_t)0x288326d5, (q31_t)0x287d30fa, (q31_t)0x28773b07, (q31_t)0x287144fa, (q31_t)0x286b4ed5, (q31_t)0x28655896, (q31_t)0x285f623f, (q31_t)0x28596bce, + (q31_t)0x28537545, (q31_t)0x284d7ea3, (q31_t)0x284787e8, (q31_t)0x28419114, (q31_t)0x283b9a28, (q31_t)0x2835a322, (q31_t)0x282fac04, (q31_t)0x2829b4cd, + (q31_t)0x2823bd7d, (q31_t)0x281dc615, (q31_t)0x2817ce93, (q31_t)0x2811d6f9, (q31_t)0x280bdf46, (q31_t)0x2805e77b, (q31_t)0x27ffef97, (q31_t)0x27f9f79a, + (q31_t)0x27f3ff85, (q31_t)0x27ee0756, (q31_t)0x27e80f10, (q31_t)0x27e216b0, (q31_t)0x27dc1e38, (q31_t)0x27d625a8, (q31_t)0x27d02cff, (q31_t)0x27ca343d, + (q31_t)0x27c43b63, (q31_t)0x27be4270, (q31_t)0x27b84965, (q31_t)0x27b25041, (q31_t)0x27ac5705, (q31_t)0x27a65db0, (q31_t)0x27a06443, (q31_t)0x279a6abd, + (q31_t)0x2794711f, (q31_t)0x278e7768, (q31_t)0x27887d99, (q31_t)0x278283b2, (q31_t)0x277c89b3, (q31_t)0x27768f9b, (q31_t)0x2770956a, (q31_t)0x276a9b21, + (q31_t)0x2764a0c0, (q31_t)0x275ea647, (q31_t)0x2758abb6, (q31_t)0x2752b10c, (q31_t)0x274cb64a, (q31_t)0x2746bb6f, (q31_t)0x2740c07d, (q31_t)0x273ac572, + (q31_t)0x2734ca4f, (q31_t)0x272ecf14, (q31_t)0x2728d3c0, (q31_t)0x2722d855, (q31_t)0x271cdcd1, (q31_t)0x2716e136, (q31_t)0x2710e582, (q31_t)0x270ae9b6, + (q31_t)0x2704edd2, (q31_t)0x26fef1d5, (q31_t)0x26f8f5c1, (q31_t)0x26f2f995, (q31_t)0x26ecfd51, (q31_t)0x26e700f5, (q31_t)0x26e10480, (q31_t)0x26db07f4, + (q31_t)0x26d50b50, (q31_t)0x26cf0e94, (q31_t)0x26c911c0, (q31_t)0x26c314d4, (q31_t)0x26bd17d0, (q31_t)0x26b71ab4, (q31_t)0x26b11d80, (q31_t)0x26ab2034, + (q31_t)0x26a522d1, (q31_t)0x269f2556, (q31_t)0x269927c3, (q31_t)0x26932a18, (q31_t)0x268d2c55, (q31_t)0x26872e7b, (q31_t)0x26813088, (q31_t)0x267b327e, + (q31_t)0x2675345d, (q31_t)0x266f3623, (q31_t)0x266937d2, (q31_t)0x26633969, (q31_t)0x265d3ae9, (q31_t)0x26573c50, (q31_t)0x26513da1, (q31_t)0x264b3ed9, + (q31_t)0x26453ffa, (q31_t)0x263f4103, (q31_t)0x263941f5, (q31_t)0x263342cf, (q31_t)0x262d4392, (q31_t)0x2627443d, (q31_t)0x262144d0, (q31_t)0x261b454c, + (q31_t)0x261545b0, (q31_t)0x260f45fd, (q31_t)0x26094633, (q31_t)0x26034651, (q31_t)0x25fd4657, (q31_t)0x25f74646, (q31_t)0x25f1461e, (q31_t)0x25eb45de, + (q31_t)0x25e54587, (q31_t)0x25df4519, (q31_t)0x25d94493, (q31_t)0x25d343f6, (q31_t)0x25cd4341, (q31_t)0x25c74276, (q31_t)0x25c14192, (q31_t)0x25bb4098, + (q31_t)0x25b53f86, (q31_t)0x25af3e5d, (q31_t)0x25a93d1d, (q31_t)0x25a33bc6, (q31_t)0x259d3a57, (q31_t)0x259738d1, (q31_t)0x25913734, (q31_t)0x258b3580, + (q31_t)0x258533b5, (q31_t)0x257f31d2, (q31_t)0x25792fd8, (q31_t)0x25732dc8, (q31_t)0x256d2ba0, (q31_t)0x25672961, (q31_t)0x2561270b, (q31_t)0x255b249e, + (q31_t)0x2555221a, (q31_t)0x254f1f7e, (q31_t)0x25491ccc, (q31_t)0x25431a03, (q31_t)0x253d1723, (q31_t)0x2537142c, (q31_t)0x2531111e, (q31_t)0x252b0df9, + (q31_t)0x25250abd, (q31_t)0x251f076a, (q31_t)0x25190400, (q31_t)0x25130080, (q31_t)0x250cfce8, (q31_t)0x2506f93a, (q31_t)0x2500f574, (q31_t)0x24faf198, + (q31_t)0x24f4eda6, (q31_t)0x24eee99c, (q31_t)0x24e8e57c, (q31_t)0x24e2e144, (q31_t)0x24dcdcf6, (q31_t)0x24d6d892, (q31_t)0x24d0d416, (q31_t)0x24cacf84, + (q31_t)0x24c4cadb, (q31_t)0x24bec61c, (q31_t)0x24b8c146, (q31_t)0x24b2bc59, (q31_t)0x24acb756, (q31_t)0x24a6b23b, (q31_t)0x24a0ad0b, (q31_t)0x249aa7c4, + (q31_t)0x2494a266, (q31_t)0x248e9cf1, (q31_t)0x24889766, (q31_t)0x248291c5, (q31_t)0x247c8c0d, (q31_t)0x2476863e, (q31_t)0x24708059, (q31_t)0x246a7a5e, + (q31_t)0x2464744c, (q31_t)0x245e6e23, (q31_t)0x245867e4, (q31_t)0x2452618f, (q31_t)0x244c5b24, (q31_t)0x244654a1, (q31_t)0x24404e09, (q31_t)0x243a475a, + (q31_t)0x24344095, (q31_t)0x242e39ba, (q31_t)0x242832c8, (q31_t)0x24222bc0, (q31_t)0x241c24a1, (q31_t)0x24161d6d, (q31_t)0x24101622, (q31_t)0x240a0ec1, + (q31_t)0x24040749, (q31_t)0x23fdffbc, (q31_t)0x23f7f818, (q31_t)0x23f1f05e, (q31_t)0x23ebe88e, (q31_t)0x23e5e0a7, (q31_t)0x23dfd8ab, (q31_t)0x23d9d098, + (q31_t)0x23d3c86f, (q31_t)0x23cdc031, (q31_t)0x23c7b7dc, (q31_t)0x23c1af71, (q31_t)0x23bba6f0, (q31_t)0x23b59e59, (q31_t)0x23af95ac, (q31_t)0x23a98ce8, + (q31_t)0x23a3840f, (q31_t)0x239d7b20, (q31_t)0x2397721b, (q31_t)0x23916900, (q31_t)0x238b5fcf, (q31_t)0x23855688, (q31_t)0x237f4d2b, (q31_t)0x237943b9, + (q31_t)0x23733a30, (q31_t)0x236d3092, (q31_t)0x236726dd, (q31_t)0x23611d13, (q31_t)0x235b1333, (q31_t)0x2355093e, (q31_t)0x234eff32, (q31_t)0x2348f511, + (q31_t)0x2342eada, (q31_t)0x233ce08d, (q31_t)0x2336d62a, (q31_t)0x2330cbb2, (q31_t)0x232ac124, (q31_t)0x2324b680, (q31_t)0x231eabc7, (q31_t)0x2318a0f8, + (q31_t)0x23129613, (q31_t)0x230c8b19, (q31_t)0x23068009, (q31_t)0x230074e3, (q31_t)0x22fa69a8, (q31_t)0x22f45e57, (q31_t)0x22ee52f1, (q31_t)0x22e84775, + (q31_t)0x22e23be4, (q31_t)0x22dc303d, (q31_t)0x22d62480, (q31_t)0x22d018ae, (q31_t)0x22ca0cc7, (q31_t)0x22c400ca, (q31_t)0x22bdf4b8, (q31_t)0x22b7e890, + (q31_t)0x22b1dc53, (q31_t)0x22abd001, (q31_t)0x22a5c399, (q31_t)0x229fb71b, (q31_t)0x2299aa89, (q31_t)0x22939de1, (q31_t)0x228d9123, (q31_t)0x22878451, + (q31_t)0x22817769, (q31_t)0x227b6a6c, (q31_t)0x22755d59, (q31_t)0x226f5032, (q31_t)0x226942f5, (q31_t)0x226335a2, (q31_t)0x225d283b, (q31_t)0x22571abe, + (q31_t)0x22510d2d, (q31_t)0x224aff86, (q31_t)0x2244f1c9, (q31_t)0x223ee3f8, (q31_t)0x2238d612, (q31_t)0x2232c816, (q31_t)0x222cba06, (q31_t)0x2226abe0, + (q31_t)0x22209da5, (q31_t)0x221a8f56, (q31_t)0x221480f1, (q31_t)0x220e7277, (q31_t)0x220863e8, (q31_t)0x22025544, (q31_t)0x21fc468b, (q31_t)0x21f637be, + (q31_t)0x21f028db, (q31_t)0x21ea19e3, (q31_t)0x21e40ad7, (q31_t)0x21ddfbb5, (q31_t)0x21d7ec7f, (q31_t)0x21d1dd34, (q31_t)0x21cbcdd3, (q31_t)0x21c5be5e, + (q31_t)0x21bfaed5, (q31_t)0x21b99f36, (q31_t)0x21b38f83, (q31_t)0x21ad7fba, (q31_t)0x21a76fdd, (q31_t)0x21a15fec, (q31_t)0x219b4fe5, (q31_t)0x21953fca, + (q31_t)0x218f2f9a, (q31_t)0x21891f55, (q31_t)0x21830efc, (q31_t)0x217cfe8e, (q31_t)0x2176ee0b, (q31_t)0x2170dd74, (q31_t)0x216accc8, (q31_t)0x2164bc08, + (q31_t)0x215eab33, (q31_t)0x21589a49, (q31_t)0x2152894b, (q31_t)0x214c7838, (q31_t)0x21466710, (q31_t)0x214055d4, (q31_t)0x213a4484, (q31_t)0x2134331f, + (q31_t)0x212e21a6, (q31_t)0x21281018, (q31_t)0x2121fe76, (q31_t)0x211becbf, (q31_t)0x2115daf4, (q31_t)0x210fc914, (q31_t)0x2109b720, (q31_t)0x2103a518, + (q31_t)0x20fd92fb, (q31_t)0x20f780ca, (q31_t)0x20f16e84, (q31_t)0x20eb5c2b, (q31_t)0x20e549bd, (q31_t)0x20df373a, (q31_t)0x20d924a4, (q31_t)0x20d311f9, + (q31_t)0x20ccff3a, (q31_t)0x20c6ec66, (q31_t)0x20c0d97f, (q31_t)0x20bac683, (q31_t)0x20b4b373, (q31_t)0x20aea04f, (q31_t)0x20a88d17, (q31_t)0x20a279ca, + (q31_t)0x209c666a, (q31_t)0x209652f5, (q31_t)0x20903f6c, (q31_t)0x208a2bcf, (q31_t)0x2084181e, (q31_t)0x207e0459, (q31_t)0x2077f080, (q31_t)0x2071dc93, + (q31_t)0x206bc892, (q31_t)0x2065b47d, (q31_t)0x205fa054, (q31_t)0x20598c17, (q31_t)0x205377c6, (q31_t)0x204d6361, (q31_t)0x20474ee8, (q31_t)0x20413a5b, + (q31_t)0x203b25bb, (q31_t)0x20351106, (q31_t)0x202efc3e, (q31_t)0x2028e761, (q31_t)0x2022d271, (q31_t)0x201cbd6d, (q31_t)0x2016a856, (q31_t)0x2010932a, + (q31_t)0x200a7deb, (q31_t)0x20046898, (q31_t)0x1ffe5331, (q31_t)0x1ff83db6, (q31_t)0x1ff22828, (q31_t)0x1fec1286, (q31_t)0x1fe5fcd0, (q31_t)0x1fdfe707, + (q31_t)0x1fd9d12a, (q31_t)0x1fd3bb39, (q31_t)0x1fcda535, (q31_t)0x1fc78f1d, (q31_t)0x1fc178f1, (q31_t)0x1fbb62b2, (q31_t)0x1fb54c60, (q31_t)0x1faf35f9, + (q31_t)0x1fa91f80, (q31_t)0x1fa308f2, (q31_t)0x1f9cf252, (q31_t)0x1f96db9d, (q31_t)0x1f90c4d5, (q31_t)0x1f8aadfa, (q31_t)0x1f84970b, (q31_t)0x1f7e8009, + (q31_t)0x1f7868f4, (q31_t)0x1f7251ca, (q31_t)0x1f6c3a8e, (q31_t)0x1f66233e, (q31_t)0x1f600bdb, (q31_t)0x1f59f465, (q31_t)0x1f53dcdb, (q31_t)0x1f4dc53d, + (q31_t)0x1f47ad8d, (q31_t)0x1f4195c9, (q31_t)0x1f3b7df2, (q31_t)0x1f356608, (q31_t)0x1f2f4e0a, (q31_t)0x1f2935f9, (q31_t)0x1f231dd5, (q31_t)0x1f1d059e, + (q31_t)0x1f16ed54, (q31_t)0x1f10d4f6, (q31_t)0x1f0abc85, (q31_t)0x1f04a401, (q31_t)0x1efe8b6a, (q31_t)0x1ef872c0, (q31_t)0x1ef25a03, (q31_t)0x1eec4132, + (q31_t)0x1ee6284f, (q31_t)0x1ee00f58, (q31_t)0x1ed9f64f, (q31_t)0x1ed3dd32, (q31_t)0x1ecdc402, (q31_t)0x1ec7aac0, (q31_t)0x1ec1916a, (q31_t)0x1ebb7802, + (q31_t)0x1eb55e86, (q31_t)0x1eaf44f8, (q31_t)0x1ea92b56, (q31_t)0x1ea311a2, (q31_t)0x1e9cf7db, (q31_t)0x1e96de01, (q31_t)0x1e90c414, (q31_t)0x1e8aaa14, + (q31_t)0x1e849001, (q31_t)0x1e7e75dc, (q31_t)0x1e785ba3, (q31_t)0x1e724158, (q31_t)0x1e6c26fa, (q31_t)0x1e660c8a, (q31_t)0x1e5ff206, (q31_t)0x1e59d770, + (q31_t)0x1e53bcc7, (q31_t)0x1e4da20c, (q31_t)0x1e47873d, (q31_t)0x1e416c5d, (q31_t)0x1e3b5169, (q31_t)0x1e353663, (q31_t)0x1e2f1b4a, (q31_t)0x1e29001e, + (q31_t)0x1e22e4e0, (q31_t)0x1e1cc990, (q31_t)0x1e16ae2c, (q31_t)0x1e1092b6, (q31_t)0x1e0a772e, (q31_t)0x1e045b93, (q31_t)0x1dfe3fe6, (q31_t)0x1df82426, + (q31_t)0x1df20853, (q31_t)0x1debec6f, (q31_t)0x1de5d077, (q31_t)0x1ddfb46e, (q31_t)0x1dd99851, (q31_t)0x1dd37c23, (q31_t)0x1dcd5fe2, (q31_t)0x1dc7438e, + (q31_t)0x1dc12729, (q31_t)0x1dbb0ab0, (q31_t)0x1db4ee26, (q31_t)0x1daed189, (q31_t)0x1da8b4da, (q31_t)0x1da29819, (q31_t)0x1d9c7b45, (q31_t)0x1d965e5f, + (q31_t)0x1d904167, (q31_t)0x1d8a245c, (q31_t)0x1d840740, (q31_t)0x1d7dea11, (q31_t)0x1d77ccd0, (q31_t)0x1d71af7d, (q31_t)0x1d6b9217, (q31_t)0x1d6574a0, + (q31_t)0x1d5f5716, (q31_t)0x1d59397a, (q31_t)0x1d531bcc, (q31_t)0x1d4cfe0d, (q31_t)0x1d46e03a, (q31_t)0x1d40c256, (q31_t)0x1d3aa460, (q31_t)0x1d348658, + (q31_t)0x1d2e683e, (q31_t)0x1d284a12, (q31_t)0x1d222bd3, (q31_t)0x1d1c0d83, (q31_t)0x1d15ef21, (q31_t)0x1d0fd0ad, (q31_t)0x1d09b227, (q31_t)0x1d03938f, + (q31_t)0x1cfd74e5, (q31_t)0x1cf7562a, (q31_t)0x1cf1375c, (q31_t)0x1ceb187d, (q31_t)0x1ce4f98c, (q31_t)0x1cdeda89, (q31_t)0x1cd8bb74, (q31_t)0x1cd29c4d, + (q31_t)0x1ccc7d15, (q31_t)0x1cc65dca, (q31_t)0x1cc03e6e, (q31_t)0x1cba1f01, (q31_t)0x1cb3ff81, (q31_t)0x1caddff0, (q31_t)0x1ca7c04d, (q31_t)0x1ca1a099, + (q31_t)0x1c9b80d3, (q31_t)0x1c9560fb, (q31_t)0x1c8f4112, (q31_t)0x1c892117, (q31_t)0x1c83010a, (q31_t)0x1c7ce0ec, (q31_t)0x1c76c0bc, (q31_t)0x1c70a07b, + (q31_t)0x1c6a8028, (q31_t)0x1c645fc3, (q31_t)0x1c5e3f4d, (q31_t)0x1c581ec6, (q31_t)0x1c51fe2d, (q31_t)0x1c4bdd83, (q31_t)0x1c45bcc7, (q31_t)0x1c3f9bf9, + (q31_t)0x1c397b1b, (q31_t)0x1c335a2b, (q31_t)0x1c2d3929, (q31_t)0x1c271816, (q31_t)0x1c20f6f2, (q31_t)0x1c1ad5bc, (q31_t)0x1c14b475, (q31_t)0x1c0e931d, + (q31_t)0x1c0871b4, (q31_t)0x1c025039, (q31_t)0x1bfc2ead, (q31_t)0x1bf60d0f, (q31_t)0x1befeb60, (q31_t)0x1be9c9a1, (q31_t)0x1be3a7cf, (q31_t)0x1bdd85ed, + (q31_t)0x1bd763fa, (q31_t)0x1bd141f5, (q31_t)0x1bcb1fdf, (q31_t)0x1bc4fdb8, (q31_t)0x1bbedb80, (q31_t)0x1bb8b937, (q31_t)0x1bb296dc, (q31_t)0x1bac7471, + (q31_t)0x1ba651f5, (q31_t)0x1ba02f67, (q31_t)0x1b9a0cc8, (q31_t)0x1b93ea19, (q31_t)0x1b8dc758, (q31_t)0x1b87a487, (q31_t)0x1b8181a4, (q31_t)0x1b7b5eb0, + (q31_t)0x1b753bac, (q31_t)0x1b6f1897, (q31_t)0x1b68f570, (q31_t)0x1b62d239, (q31_t)0x1b5caef1, (q31_t)0x1b568b98, (q31_t)0x1b50682e, (q31_t)0x1b4a44b3, + (q31_t)0x1b442127, (q31_t)0x1b3dfd8b, (q31_t)0x1b37d9de, (q31_t)0x1b31b620, (q31_t)0x1b2b9251, (q31_t)0x1b256e71, (q31_t)0x1b1f4a81, (q31_t)0x1b192680, + (q31_t)0x1b13026e, (q31_t)0x1b0cde4c, (q31_t)0x1b06ba19, (q31_t)0x1b0095d5, (q31_t)0x1afa7180, (q31_t)0x1af44d1b, (q31_t)0x1aee28a6, (q31_t)0x1ae8041f, + (q31_t)0x1ae1df88, (q31_t)0x1adbbae1, (q31_t)0x1ad59629, (q31_t)0x1acf7160, (q31_t)0x1ac94c87, (q31_t)0x1ac3279d, (q31_t)0x1abd02a3, (q31_t)0x1ab6dd98, + (q31_t)0x1ab0b87d, (q31_t)0x1aaa9352, (q31_t)0x1aa46e16, (q31_t)0x1a9e48c9, (q31_t)0x1a98236c, (q31_t)0x1a91fdff, (q31_t)0x1a8bd881, (q31_t)0x1a85b2f3, + (q31_t)0x1a7f8d54, (q31_t)0x1a7967a6, (q31_t)0x1a7341e6, (q31_t)0x1a6d1c17, (q31_t)0x1a66f637, (q31_t)0x1a60d047, (q31_t)0x1a5aaa47, (q31_t)0x1a548436, + (q31_t)0x1a4e5e15, (q31_t)0x1a4837e4, (q31_t)0x1a4211a3, (q31_t)0x1a3beb52, (q31_t)0x1a35c4f0, (q31_t)0x1a2f9e7e, (q31_t)0x1a2977fc, (q31_t)0x1a23516a, + (q31_t)0x1a1d2ac8, (q31_t)0x1a170416, (q31_t)0x1a10dd53, (q31_t)0x1a0ab681, (q31_t)0x1a048f9e, (q31_t)0x19fe68ac, (q31_t)0x19f841a9, (q31_t)0x19f21a96, + (q31_t)0x19ebf374, (q31_t)0x19e5cc41, (q31_t)0x19dfa4fe, (q31_t)0x19d97dac, (q31_t)0x19d35649, (q31_t)0x19cd2ed7, (q31_t)0x19c70754, (q31_t)0x19c0dfc2, + (q31_t)0x19bab820, (q31_t)0x19b4906e, (q31_t)0x19ae68ac, (q31_t)0x19a840da, (q31_t)0x19a218f9, (q31_t)0x199bf107, (q31_t)0x1995c906, (q31_t)0x198fa0f5, + (q31_t)0x198978d4, (q31_t)0x198350a4, (q31_t)0x197d2864, (q31_t)0x19770014, (q31_t)0x1970d7b4, (q31_t)0x196aaf45, (q31_t)0x196486c6, (q31_t)0x195e5e37, + (q31_t)0x19583599, (q31_t)0x19520ceb, (q31_t)0x194be42d, (q31_t)0x1945bb60, (q31_t)0x193f9283, (q31_t)0x19396997, (q31_t)0x1933409b, (q31_t)0x192d178f, + (q31_t)0x1926ee74, (q31_t)0x1920c54a, (q31_t)0x191a9c10, (q31_t)0x191472c6, (q31_t)0x190e496d, (q31_t)0x19082005, (q31_t)0x1901f68d, (q31_t)0x18fbcd06, + (q31_t)0x18f5a36f, (q31_t)0x18ef79c9, (q31_t)0x18e95014, (q31_t)0x18e3264f, (q31_t)0x18dcfc7b, (q31_t)0x18d6d297, (q31_t)0x18d0a8a4, (q31_t)0x18ca7ea2, + (q31_t)0x18c45491, (q31_t)0x18be2a70, (q31_t)0x18b80040, (q31_t)0x18b1d601, (q31_t)0x18ababb2, (q31_t)0x18a58154, (q31_t)0x189f56e8, (q31_t)0x18992c6b, + (q31_t)0x189301e0, (q31_t)0x188cd746, (q31_t)0x1886ac9c, (q31_t)0x188081e4, (q31_t)0x187a571c, (q31_t)0x18742c45, (q31_t)0x186e015f, (q31_t)0x1867d66a, + (q31_t)0x1861ab66, (q31_t)0x185b8053, (q31_t)0x18555530, (q31_t)0x184f29ff, (q31_t)0x1848febf, (q31_t)0x1842d370, (q31_t)0x183ca812, (q31_t)0x18367ca5, + (q31_t)0x18305129, (q31_t)0x182a259e, (q31_t)0x1823fa04, (q31_t)0x181dce5b, (q31_t)0x1817a2a4, (q31_t)0x181176dd, (q31_t)0x180b4b08, (q31_t)0x18051f24, + (q31_t)0x17fef331, (q31_t)0x17f8c72f, (q31_t)0x17f29b1e, (q31_t)0x17ec6eff, (q31_t)0x17e642d1, (q31_t)0x17e01694, (q31_t)0x17d9ea49, (q31_t)0x17d3bdee, + (q31_t)0x17cd9186, (q31_t)0x17c7650e, (q31_t)0x17c13888, (q31_t)0x17bb0bf3, (q31_t)0x17b4df4f, (q31_t)0x17aeb29d, (q31_t)0x17a885dc, (q31_t)0x17a2590d, + (q31_t)0x179c2c2f, (q31_t)0x1795ff42, (q31_t)0x178fd247, (q31_t)0x1789a53d, (q31_t)0x17837825, (q31_t)0x177d4afe, (q31_t)0x17771dc9, (q31_t)0x1770f086, + (q31_t)0x176ac333, (q31_t)0x176495d3, (q31_t)0x175e6864, (q31_t)0x17583ae7, (q31_t)0x17520d5b, (q31_t)0x174bdfc1, (q31_t)0x1745b218, (q31_t)0x173f8461, + (q31_t)0x1739569c, (q31_t)0x173328c8, (q31_t)0x172cfae6, (q31_t)0x1726ccf6, (q31_t)0x17209ef8, (q31_t)0x171a70eb, (q31_t)0x171442d0, (q31_t)0x170e14a7, + (q31_t)0x1707e670, (q31_t)0x1701b82a, (q31_t)0x16fb89d6, (q31_t)0x16f55b74, (q31_t)0x16ef2d04, (q31_t)0x16e8fe86, (q31_t)0x16e2cff9, (q31_t)0x16dca15f, + (q31_t)0x16d672b6, (q31_t)0x16d043ff, (q31_t)0x16ca153a, (q31_t)0x16c3e667, (q31_t)0x16bdb787, (q31_t)0x16b78898, (q31_t)0x16b1599b, (q31_t)0x16ab2a90, + (q31_t)0x16a4fb77, (q31_t)0x169ecc50, (q31_t)0x16989d1b, (q31_t)0x16926dd8, (q31_t)0x168c3e87, (q31_t)0x16860f29, (q31_t)0x167fdfbc, (q31_t)0x1679b042, + (q31_t)0x167380ba, (q31_t)0x166d5123, (q31_t)0x1667217f, (q31_t)0x1660f1ce, (q31_t)0x165ac20e, (q31_t)0x16549241, (q31_t)0x164e6266, (q31_t)0x1648327d, + (q31_t)0x16420286, (q31_t)0x163bd282, (q31_t)0x1635a270, (q31_t)0x162f7250, (q31_t)0x16294222, (q31_t)0x162311e7, (q31_t)0x161ce19e, (q31_t)0x1616b148, + (q31_t)0x161080e4, (q31_t)0x160a5072, (q31_t)0x16041ff3, (q31_t)0x15fdef66, (q31_t)0x15f7becc, (q31_t)0x15f18e24, (q31_t)0x15eb5d6e, (q31_t)0x15e52cab, + (q31_t)0x15defbdb, (q31_t)0x15d8cafd, (q31_t)0x15d29a11, (q31_t)0x15cc6918, (q31_t)0x15c63812, (q31_t)0x15c006fe, (q31_t)0x15b9d5dd, (q31_t)0x15b3a4ae, + (q31_t)0x15ad7372, (q31_t)0x15a74228, (q31_t)0x15a110d2, (q31_t)0x159adf6e, (q31_t)0x1594adfc, (q31_t)0x158e7c7d, (q31_t)0x15884af1, (q31_t)0x15821958, + (q31_t)0x157be7b1, (q31_t)0x1575b5fe, (q31_t)0x156f843c, (q31_t)0x1569526e, (q31_t)0x15632093, (q31_t)0x155ceeaa, (q31_t)0x1556bcb4, (q31_t)0x15508ab1, + (q31_t)0x154a58a1, (q31_t)0x15442683, (q31_t)0x153df459, (q31_t)0x1537c221, (q31_t)0x15318fdd, (q31_t)0x152b5d8b, (q31_t)0x15252b2c, (q31_t)0x151ef8c0, + (q31_t)0x1518c648, (q31_t)0x151293c2, (q31_t)0x150c612f, (q31_t)0x15062e8f, (q31_t)0x14fffbe2, (q31_t)0x14f9c928, (q31_t)0x14f39662, (q31_t)0x14ed638e, + (q31_t)0x14e730ae, (q31_t)0x14e0fdc0, (q31_t)0x14dacac6, (q31_t)0x14d497bf, (q31_t)0x14ce64ab, (q31_t)0x14c8318a, (q31_t)0x14c1fe5c, (q31_t)0x14bbcb22, + (q31_t)0x14b597da, (q31_t)0x14af6486, (q31_t)0x14a93125, (q31_t)0x14a2fdb8, (q31_t)0x149cca3e, (q31_t)0x149696b7, (q31_t)0x14906323, (q31_t)0x148a2f82, + (q31_t)0x1483fbd5, (q31_t)0x147dc81c, (q31_t)0x14779455, (q31_t)0x14716082, (q31_t)0x146b2ca3, (q31_t)0x1464f8b7, (q31_t)0x145ec4be, (q31_t)0x145890b9, + (q31_t)0x14525ca7, (q31_t)0x144c2888, (q31_t)0x1445f45d, (q31_t)0x143fc026, (q31_t)0x14398be2, (q31_t)0x14335792, (q31_t)0x142d2335, (q31_t)0x1426eecb, + (q31_t)0x1420ba56, (q31_t)0x141a85d3, (q31_t)0x14145145, (q31_t)0x140e1caa, (q31_t)0x1407e803, (q31_t)0x1401b34f, (q31_t)0x13fb7e8f, (q31_t)0x13f549c3, + (q31_t)0x13ef14ea, (q31_t)0x13e8e005, (q31_t)0x13e2ab14, (q31_t)0x13dc7616, (q31_t)0x13d6410d, (q31_t)0x13d00bf7, (q31_t)0x13c9d6d4, (q31_t)0x13c3a1a6, + (q31_t)0x13bd6c6b, (q31_t)0x13b73725, (q31_t)0x13b101d2, (q31_t)0x13aacc73, (q31_t)0x13a49707, (q31_t)0x139e6190, (q31_t)0x13982c0d, (q31_t)0x1391f67d, + (q31_t)0x138bc0e1, (q31_t)0x13858b3a, (q31_t)0x137f5586, (q31_t)0x13791fc6, (q31_t)0x1372e9fb, (q31_t)0x136cb423, (q31_t)0x13667e3f, (q31_t)0x13604850, + (q31_t)0x135a1254, (q31_t)0x1353dc4c, (q31_t)0x134da639, (q31_t)0x1347701a, (q31_t)0x134139ee, (q31_t)0x133b03b7, (q31_t)0x1334cd74, (q31_t)0x132e9725, + (q31_t)0x132860ca, (q31_t)0x13222a64, (q31_t)0x131bf3f2, (q31_t)0x1315bd73, (q31_t)0x130f86ea, (q31_t)0x13095054, (q31_t)0x130319b3, (q31_t)0x12fce305, + (q31_t)0x12f6ac4d, (q31_t)0x12f07588, (q31_t)0x12ea3eb8, (q31_t)0x12e407dc, (q31_t)0x12ddd0f4, (q31_t)0x12d79a01, (q31_t)0x12d16303, (q31_t)0x12cb2bf8, + (q31_t)0x12c4f4e2, (q31_t)0x12bebdc1, (q31_t)0x12b88693, (q31_t)0x12b24f5b, (q31_t)0x12ac1817, (q31_t)0x12a5e0c7, (q31_t)0x129fa96c, (q31_t)0x12997205, + (q31_t)0x12933a93, (q31_t)0x128d0315, (q31_t)0x1286cb8c, (q31_t)0x128093f7, (q31_t)0x127a5c57, (q31_t)0x127424ac, (q31_t)0x126decf5, (q31_t)0x1267b533, + (q31_t)0x12617d66, (q31_t)0x125b458d, (q31_t)0x12550da9, (q31_t)0x124ed5ba, (q31_t)0x12489dbf, (q31_t)0x124265b9, (q31_t)0x123c2da8, (q31_t)0x1235f58b, + (q31_t)0x122fbd63, (q31_t)0x12298530, (q31_t)0x12234cf2, (q31_t)0x121d14a9, (q31_t)0x1216dc54, (q31_t)0x1210a3f5, (q31_t)0x120a6b8a, (q31_t)0x12043314, + (q31_t)0x11fdfa93, (q31_t)0x11f7c207, (q31_t)0x11f18970, (q31_t)0x11eb50cd, (q31_t)0x11e51820, (q31_t)0x11dedf68, (q31_t)0x11d8a6a4, (q31_t)0x11d26dd6, + (q31_t)0x11cc34fc, (q31_t)0x11c5fc18, (q31_t)0x11bfc329, (q31_t)0x11b98a2e, (q31_t)0x11b35129, (q31_t)0x11ad1819, (q31_t)0x11a6defe, (q31_t)0x11a0a5d8, + (q31_t)0x119a6ca7, (q31_t)0x1194336b, (q31_t)0x118dfa25, (q31_t)0x1187c0d3, (q31_t)0x11818777, (q31_t)0x117b4e10, (q31_t)0x1175149e, (q31_t)0x116edb22, + (q31_t)0x1168a19b, (q31_t)0x11626809, (q31_t)0x115c2e6c, (q31_t)0x1155f4c4, (q31_t)0x114fbb12, (q31_t)0x11498156, (q31_t)0x1143478e, (q31_t)0x113d0dbc, + (q31_t)0x1136d3df, (q31_t)0x113099f8, (q31_t)0x112a6006, (q31_t)0x11242609, (q31_t)0x111dec02, (q31_t)0x1117b1f0, (q31_t)0x111177d4, (q31_t)0x110b3dad, + (q31_t)0x1105037c, (q31_t)0x10fec940, (q31_t)0x10f88efa, (q31_t)0x10f254a9, (q31_t)0x10ec1a4e, (q31_t)0x10e5dfe8, (q31_t)0x10dfa578, (q31_t)0x10d96afe, + (q31_t)0x10d33079, (q31_t)0x10ccf5ea, (q31_t)0x10c6bb50, (q31_t)0x10c080ac, (q31_t)0x10ba45fe, (q31_t)0x10b40b45, (q31_t)0x10add082, (q31_t)0x10a795b5, + (q31_t)0x10a15ade, (q31_t)0x109b1ffc, (q31_t)0x1094e510, (q31_t)0x108eaa1a, (q31_t)0x10886f19, (q31_t)0x1082340f, (q31_t)0x107bf8fa, (q31_t)0x1075bddb, + (q31_t)0x106f82b2, (q31_t)0x1069477f, (q31_t)0x10630c41, (q31_t)0x105cd0fa, (q31_t)0x105695a8, (q31_t)0x10505a4d, (q31_t)0x104a1ee7, (q31_t)0x1043e377, + (q31_t)0x103da7fd, (q31_t)0x10376c79, (q31_t)0x103130ec, (q31_t)0x102af554, (q31_t)0x1024b9b2, (q31_t)0x101e7e06, (q31_t)0x10184251, (q31_t)0x10120691, + (q31_t)0x100bcac7, (q31_t)0x10058ef4, (q31_t)0xfff5317, (q31_t)0xff91730, (q31_t)0xff2db3e, (q31_t)0xfec9f44, (q31_t)0xfe6633f, (q31_t)0xfe02730, + (q31_t)0xfd9eb18, (q31_t)0xfd3aef6, (q31_t)0xfcd72ca, (q31_t)0xfc73695, (q31_t)0xfc0fa55, (q31_t)0xfbabe0c, (q31_t)0xfb481ba, (q31_t)0xfae455d, + (q31_t)0xfa808f7, (q31_t)0xfa1cc87, (q31_t)0xf9b900e, (q31_t)0xf95538b, (q31_t)0xf8f16fe, (q31_t)0xf88da68, (q31_t)0xf829dc8, (q31_t)0xf7c611f, + (q31_t)0xf76246c, (q31_t)0xf6fe7af, (q31_t)0xf69aae9, (q31_t)0xf636e1a, (q31_t)0xf5d3141, (q31_t)0xf56f45e, (q31_t)0xf50b773, (q31_t)0xf4a7a7d, + (q31_t)0xf443d7e, (q31_t)0xf3e0076, (q31_t)0xf37c365, (q31_t)0xf318649, (q31_t)0xf2b4925, (q31_t)0xf250bf7, (q31_t)0xf1ecec0, (q31_t)0xf189180, + (q31_t)0xf125436, (q31_t)0xf0c16e3, (q31_t)0xf05d987, (q31_t)0xeff9c21, (q31_t)0xef95eb2, (q31_t)0xef3213a, (q31_t)0xeece3b9, (q31_t)0xee6a62f, + (q31_t)0xee0689b, (q31_t)0xeda2afe, (q31_t)0xed3ed58, (q31_t)0xecdafa9, (q31_t)0xec771f1, (q31_t)0xec1342f, (q31_t)0xebaf665, (q31_t)0xeb4b891, + (q31_t)0xeae7ab4, (q31_t)0xea83ccf, (q31_t)0xea1fee0, (q31_t)0xe9bc0e8, (q31_t)0xe9582e7, (q31_t)0xe8f44dd, (q31_t)0xe8906cb, (q31_t)0xe82c8af, + (q31_t)0xe7c8a8a, (q31_t)0xe764c5c, (q31_t)0xe700e26, (q31_t)0xe69cfe6, (q31_t)0xe63919e, (q31_t)0xe5d534d, (q31_t)0xe5714f3, (q31_t)0xe50d690, + (q31_t)0xe4a9824, (q31_t)0xe4459af, (q31_t)0xe3e1b32, (q31_t)0xe37dcac, (q31_t)0xe319e1d, (q31_t)0xe2b5f85, (q31_t)0xe2520e5, (q31_t)0xe1ee23c, + (q31_t)0xe18a38a, (q31_t)0xe1264cf, (q31_t)0xe0c260c, (q31_t)0xe05e740, (q31_t)0xdffa86b, (q31_t)0xdf9698e, (q31_t)0xdf32aa8, (q31_t)0xdecebba, + (q31_t)0xde6acc3, (q31_t)0xde06dc3, (q31_t)0xdda2ebb, (q31_t)0xdd3efab, (q31_t)0xdcdb091, (q31_t)0xdc77170, (q31_t)0xdc13245, (q31_t)0xdbaf313, + (q31_t)0xdb4b3d7, (q31_t)0xdae7494, (q31_t)0xda83548, (q31_t)0xda1f5f3, (q31_t)0xd9bb696, (q31_t)0xd957731, (q31_t)0xd8f37c3, (q31_t)0xd88f84d, + (q31_t)0xd82b8cf, (q31_t)0xd7c7948, (q31_t)0xd7639b9, (q31_t)0xd6ffa22, (q31_t)0xd69ba82, (q31_t)0xd637ada, (q31_t)0xd5d3b2a, (q31_t)0xd56fb71, + (q31_t)0xd50bbb1, (q31_t)0xd4a7be8, (q31_t)0xd443c17, (q31_t)0xd3dfc3e, (q31_t)0xd37bc5c, (q31_t)0xd317c73, (q31_t)0xd2b3c81, (q31_t)0xd24fc87, + (q31_t)0xd1ebc85, (q31_t)0xd187c7b, (q31_t)0xd123c69, (q31_t)0xd0bfc4f, (q31_t)0xd05bc2d, (q31_t)0xcff7c02, (q31_t)0xcf93bd0, (q31_t)0xcf2fb96, + (q31_t)0xcecbb53, (q31_t)0xce67b09, (q31_t)0xce03ab7, (q31_t)0xcd9fa5d, (q31_t)0xcd3b9fb, (q31_t)0xccd7991, (q31_t)0xcc7391f, (q31_t)0xcc0f8a5, + (q31_t)0xcbab824, (q31_t)0xcb4779a, (q31_t)0xcae3709, (q31_t)0xca7f670, (q31_t)0xca1b5cf, (q31_t)0xc9b7526, (q31_t)0xc953475, (q31_t)0xc8ef3bd, + (q31_t)0xc88b2fd, (q31_t)0xc827235, (q31_t)0xc7c3166, (q31_t)0xc75f08f, (q31_t)0xc6fafb0, (q31_t)0xc696ec9, (q31_t)0xc632ddb, (q31_t)0xc5cece5, + (q31_t)0xc56abe8, (q31_t)0xc506ae3, (q31_t)0xc4a29d6, (q31_t)0xc43e8c2, (q31_t)0xc3da7a6, (q31_t)0xc376683, (q31_t)0xc312558, (q31_t)0xc2ae425, + (q31_t)0xc24a2eb, (q31_t)0xc1e61aa, (q31_t)0xc182061, (q31_t)0xc11df11, (q31_t)0xc0b9db9, (q31_t)0xc055c5a, (q31_t)0xbff1af3, (q31_t)0xbf8d985, + (q31_t)0xbf29810, (q31_t)0xbec5693, (q31_t)0xbe6150f, (q31_t)0xbdfd383, (q31_t)0xbd991f0, (q31_t)0xbd35056, (q31_t)0xbcd0eb5, (q31_t)0xbc6cd0c, + (q31_t)0xbc08b5c, (q31_t)0xbba49a5, (q31_t)0xbb407e7, (q31_t)0xbadc621, (q31_t)0xba78454, (q31_t)0xba14280, (q31_t)0xb9b00a5, (q31_t)0xb94bec2, + (q31_t)0xb8e7cd9, (q31_t)0xb883ae8, (q31_t)0xb81f8f0, (q31_t)0xb7bb6f2, (q31_t)0xb7574ec, (q31_t)0xb6f32df, (q31_t)0xb68f0cb, (q31_t)0xb62aeaf, + (q31_t)0xb5c6c8d, (q31_t)0xb562a64, (q31_t)0xb4fe834, (q31_t)0xb49a5fd, (q31_t)0xb4363bf, (q31_t)0xb3d217a, (q31_t)0xb36df2e, (q31_t)0xb309cdb, + (q31_t)0xb2a5a81, (q31_t)0xb241820, (q31_t)0xb1dd5b9, (q31_t)0xb17934b, (q31_t)0xb1150d5, (q31_t)0xb0b0e59, (q31_t)0xb04cbd6, (q31_t)0xafe894d, + (q31_t)0xaf846bc, (q31_t)0xaf20425, (q31_t)0xaebc187, (q31_t)0xae57ee2, (q31_t)0xadf3c37, (q31_t)0xad8f985, (q31_t)0xad2b6cc, (q31_t)0xacc740c, + (q31_t)0xac63146, (q31_t)0xabfee79, (q31_t)0xab9aba6, (q31_t)0xab368cc, (q31_t)0xaad25eb, (q31_t)0xaa6e304, (q31_t)0xaa0a016, (q31_t)0xa9a5d22, + (q31_t)0xa941a27, (q31_t)0xa8dd725, (q31_t)0xa87941d, (q31_t)0xa81510f, (q31_t)0xa7b0dfa, (q31_t)0xa74cadf, (q31_t)0xa6e87bd, (q31_t)0xa684495, + (q31_t)0xa620166, (q31_t)0xa5bbe31, (q31_t)0xa557af5, (q31_t)0xa4f37b3, (q31_t)0xa48f46b, (q31_t)0xa42b11d, (q31_t)0xa3c6dc8, (q31_t)0xa362a6d, + (q31_t)0xa2fe70b, (q31_t)0xa29a3a3, (q31_t)0xa236035, (q31_t)0xa1d1cc1, (q31_t)0xa16d946, (q31_t)0xa1095c6, (q31_t)0xa0a523f, (q31_t)0xa040eb1, + (q31_t)0x9fdcb1e, (q31_t)0x9f78784, (q31_t)0x9f143e5, (q31_t)0x9eb003f, (q31_t)0x9e4bc93, (q31_t)0x9de78e1, (q31_t)0x9d83529, (q31_t)0x9d1f16b, + (q31_t)0x9cbada7, (q31_t)0x9c569dc, (q31_t)0x9bf260c, (q31_t)0x9b8e236, (q31_t)0x9b29e59, (q31_t)0x9ac5a77, (q31_t)0x9a6168f, (q31_t)0x99fd2a0, + (q31_t)0x9998eac, (q31_t)0x9934ab2, (q31_t)0x98d06b2, (q31_t)0x986c2ac, (q31_t)0x9807ea1, (q31_t)0x97a3a8f, (q31_t)0x973f678, (q31_t)0x96db25a, + (q31_t)0x9676e37, (q31_t)0x9612a0e, (q31_t)0x95ae5e0, (q31_t)0x954a1ab, (q31_t)0x94e5d71, (q31_t)0x9481931, (q31_t)0x941d4eb, (q31_t)0x93b90a0, + (q31_t)0x9354c4f, (q31_t)0x92f07f8, (q31_t)0x928c39b, (q31_t)0x9227f39, (q31_t)0x91c3ad2, (q31_t)0x915f664, (q31_t)0x90fb1f1, (q31_t)0x9096d79, + (q31_t)0x90328fb, (q31_t)0x8fce477, (q31_t)0x8f69fee, (q31_t)0x8f05b5f, (q31_t)0x8ea16cb, (q31_t)0x8e3d231, (q31_t)0x8dd8d92, (q31_t)0x8d748ed, + (q31_t)0x8d10443, (q31_t)0x8cabf93, (q31_t)0x8c47ade, (q31_t)0x8be3624, (q31_t)0x8b7f164, (q31_t)0x8b1ac9f, (q31_t)0x8ab67d4, (q31_t)0x8a52304, + (q31_t)0x89ede2f, (q31_t)0x8989955, (q31_t)0x8925475, (q31_t)0x88c0f90, (q31_t)0x885caa5, (q31_t)0x87f85b5, (q31_t)0x87940c1, (q31_t)0x872fbc6, + (q31_t)0x86cb6c7, (q31_t)0x86671c2, (q31_t)0x8602cb9, (q31_t)0x859e7aa, (q31_t)0x853a296, (q31_t)0x84d5d7d, (q31_t)0x847185e, (q31_t)0x840d33b, + (q31_t)0x83a8e12, (q31_t)0x83448e5, (q31_t)0x82e03b2, (q31_t)0x827be7a, (q31_t)0x821793e, (q31_t)0x81b33fc, (q31_t)0x814eeb5, (q31_t)0x80ea969, + (q31_t)0x8086419, (q31_t)0x8021ec3, (q31_t)0x7fbd968, (q31_t)0x7f59409, (q31_t)0x7ef4ea4, (q31_t)0x7e9093b, (q31_t)0x7e2c3cd, (q31_t)0x7dc7e5a, + (q31_t)0x7d638e2, (q31_t)0x7cff365, (q31_t)0x7c9ade4, (q31_t)0x7c3685d, (q31_t)0x7bd22d2, (q31_t)0x7b6dd42, (q31_t)0x7b097ad, (q31_t)0x7aa5214, + (q31_t)0x7a40c76, (q31_t)0x79dc6d3, (q31_t)0x797812b, (q31_t)0x7913b7f, (q31_t)0x78af5ce, (q31_t)0x784b019, (q31_t)0x77e6a5e, (q31_t)0x77824a0, + (q31_t)0x771dedc, (q31_t)0x76b9914, (q31_t)0x7655347, (q31_t)0x75f0d76, (q31_t)0x758c7a1, (q31_t)0x75281c6, (q31_t)0x74c3be7, (q31_t)0x745f604, + (q31_t)0x73fb01c, (q31_t)0x7396a30, (q31_t)0x733243f, (q31_t)0x72cde4a, (q31_t)0x7269851, (q31_t)0x7205253, (q31_t)0x71a0c50, (q31_t)0x713c64a, + (q31_t)0x70d803f, (q31_t)0x7073a2f, (q31_t)0x700f41b, (q31_t)0x6faae03, (q31_t)0x6f467e7, (q31_t)0x6ee21c6, (q31_t)0x6e7dba1, (q31_t)0x6e19578, + (q31_t)0x6db4f4a, (q31_t)0x6d50919, (q31_t)0x6cec2e3, (q31_t)0x6c87ca9, (q31_t)0x6c2366a, (q31_t)0x6bbf028, (q31_t)0x6b5a9e1, (q31_t)0x6af6396, + (q31_t)0x6a91d47, (q31_t)0x6a2d6f4, (q31_t)0x69c909d, (q31_t)0x6964a42, (q31_t)0x69003e3, (q31_t)0x689bd80, (q31_t)0x6837718, (q31_t)0x67d30ad, + (q31_t)0x676ea3d, (q31_t)0x670a3ca, (q31_t)0x66a5d53, (q31_t)0x66416d8, (q31_t)0x65dd058, (q31_t)0x65789d5, (q31_t)0x651434e, (q31_t)0x64afcc3, + (q31_t)0x644b634, (q31_t)0x63e6fa2, (q31_t)0x638290b, (q31_t)0x631e271, (q31_t)0x62b9bd3, (q31_t)0x6255531, (q31_t)0x61f0e8b, (q31_t)0x618c7e1, + (q31_t)0x6128134, (q31_t)0x60c3a83, (q31_t)0x605f3ce, (q31_t)0x5ffad15, (q31_t)0x5f96659, (q31_t)0x5f31f99, (q31_t)0x5ecd8d6, (q31_t)0x5e6920e, + (q31_t)0x5e04b43, (q31_t)0x5da0475, (q31_t)0x5d3bda3, (q31_t)0x5cd76cd, (q31_t)0x5c72ff4, (q31_t)0x5c0e917, (q31_t)0x5baa237, (q31_t)0x5b45b53, + (q31_t)0x5ae146b, (q31_t)0x5a7cd80, (q31_t)0x5a18692, (q31_t)0x59b3fa0, (q31_t)0x594f8aa, (q31_t)0x58eb1b2, (q31_t)0x5886ab5, (q31_t)0x58223b6, + (q31_t)0x57bdcb3, (q31_t)0x57595ac, (q31_t)0x56f4ea2, (q31_t)0x5690795, (q31_t)0x562c085, (q31_t)0x55c7971, (q31_t)0x556325a, (q31_t)0x54feb3f, + (q31_t)0x549a422, (q31_t)0x5435d01, (q31_t)0x53d15dd, (q31_t)0x536ceb5, (q31_t)0x530878a, (q31_t)0x52a405d, (q31_t)0x523f92c, (q31_t)0x51db1f7, + (q31_t)0x5176ac0, (q31_t)0x5112385, (q31_t)0x50adc48, (q31_t)0x5049507, (q31_t)0x4fe4dc3, (q31_t)0x4f8067c, (q31_t)0x4f1bf32, (q31_t)0x4eb77e5, + (q31_t)0x4e53095, (q31_t)0x4dee942, (q31_t)0x4d8a1ec, (q31_t)0x4d25a93, (q31_t)0x4cc1337, (q31_t)0x4c5cbd8, (q31_t)0x4bf8476, (q31_t)0x4b93d11, + (q31_t)0x4b2f5a9, (q31_t)0x4acae3e, (q31_t)0x4a666d1, (q31_t)0x4a01f60, (q31_t)0x499d7ed, (q31_t)0x4939077, (q31_t)0x48d48fe, (q31_t)0x4870182, + (q31_t)0x480ba04, (q31_t)0x47a7282, (q31_t)0x4742afe, (q31_t)0x46de377, (q31_t)0x4679bee, (q31_t)0x4615461, (q31_t)0x45b0cd2, (q31_t)0x454c541, + (q31_t)0x44e7dac, (q31_t)0x4483615, (q31_t)0x441ee7c, (q31_t)0x43ba6df, (q31_t)0x4355f40, (q31_t)0x42f179f, (q31_t)0x428cffb, (q31_t)0x4228854, + (q31_t)0x41c40ab, (q31_t)0x415f8ff, (q31_t)0x40fb151, (q31_t)0x40969a0, (q31_t)0x40321ed, (q31_t)0x3fcda37, (q31_t)0x3f6927f, (q31_t)0x3f04ac4, + (q31_t)0x3ea0307, (q31_t)0x3e3bb48, (q31_t)0x3dd7386, (q31_t)0x3d72bc2, (q31_t)0x3d0e3fb, (q31_t)0x3ca9c32, (q31_t)0x3c45467, (q31_t)0x3be0c99, + (q31_t)0x3b7c4c9, (q31_t)0x3b17cf7, (q31_t)0x3ab3523, (q31_t)0x3a4ed4c, (q31_t)0x39ea573, (q31_t)0x3985d97, (q31_t)0x39215ba, (q31_t)0x38bcdda, + (q31_t)0x38585f8, (q31_t)0x37f3e14, (q31_t)0x378f62e, (q31_t)0x372ae46, (q31_t)0x36c665b, (q31_t)0x3661e6f, (q31_t)0x35fd680, (q31_t)0x3598e8f, + (q31_t)0x353469c, (q31_t)0x34cfea8, (q31_t)0x346b6b1, (q31_t)0x3406eb8, (q31_t)0x33a26bd, (q31_t)0x333dec0, (q31_t)0x32d96c1, (q31_t)0x3274ec0, + (q31_t)0x32106bd, (q31_t)0x31abeb9, (q31_t)0x31476b2, (q31_t)0x30e2ea9, (q31_t)0x307e69f, (q31_t)0x3019e93, (q31_t)0x2fb5684, (q31_t)0x2f50e74, + (q31_t)0x2eec663, (q31_t)0x2e87e4f, (q31_t)0x2e2363a, (q31_t)0x2dbee22, (q31_t)0x2d5a609, (q31_t)0x2cf5def, (q31_t)0x2c915d2, (q31_t)0x2c2cdb4, + (q31_t)0x2bc8594, (q31_t)0x2b63d73, (q31_t)0x2aff54f, (q31_t)0x2a9ad2a, (q31_t)0x2a36504, (q31_t)0x29d1cdc, (q31_t)0x296d4b2, (q31_t)0x2908c87, + (q31_t)0x28a445a, (q31_t)0x283fc2b, (q31_t)0x27db3fb, (q31_t)0x2776bc9, (q31_t)0x2712396, (q31_t)0x26adb62, (q31_t)0x264932b, (q31_t)0x25e4af4, + (q31_t)0x25802bb, (q31_t)0x251ba80, (q31_t)0x24b7244, (q31_t)0x2452a07, (q31_t)0x23ee1c8, (q31_t)0x2389988, (q31_t)0x2325147, (q31_t)0x22c0904, + (q31_t)0x225c0bf, (q31_t)0x21f787a, (q31_t)0x2193033, (q31_t)0x212e7eb, (q31_t)0x20c9fa1, (q31_t)0x2065757, (q31_t)0x2000f0b, (q31_t)0x1f9c6be, + (q31_t)0x1f37e6f, (q31_t)0x1ed3620, (q31_t)0x1e6edcf, (q31_t)0x1e0a57d, (q31_t)0x1da5d2a, (q31_t)0x1d414d6, (q31_t)0x1cdcc80, (q31_t)0x1c7842a, + (q31_t)0x1c13bd2, (q31_t)0x1baf37a, (q31_t)0x1b4ab20, (q31_t)0x1ae62c5, (q31_t)0x1a81a69, (q31_t)0x1a1d20c, (q31_t)0x19b89ae, (q31_t)0x1954150, + (q31_t)0x18ef8f0, (q31_t)0x188b08f, (q31_t)0x182682d, (q31_t)0x17c1fcb, (q31_t)0x175d767, (q31_t)0x16f8f03, (q31_t)0x169469d, (q31_t)0x162fe37, + (q31_t)0x15cb5d0, (q31_t)0x1566d68, (q31_t)0x15024ff, (q31_t)0x149dc96, (q31_t)0x143942b, (q31_t)0x13d4bc0, (q31_t)0x1370354, (q31_t)0x130bae7, + (q31_t)0x12a727a, (q31_t)0x1242a0c, (q31_t)0x11de19d, (q31_t)0x117992e, (q31_t)0x11150be, (q31_t)0x10b084d, (q31_t)0x104bfdb, (q31_t)0xfe7769, + (q31_t)0xf82ef6, (q31_t)0xf1e683, (q31_t)0xeb9e0f, (q31_t)0xe5559b, (q31_t)0xdf0d26, (q31_t)0xd8c4b0, (q31_t)0xd27c3a, (q31_t)0xcc33c3, + (q31_t)0xc5eb4c, (q31_t)0xbfa2d5, (q31_t)0xb95a5d, (q31_t)0xb311e4, (q31_t)0xacc96b, (q31_t)0xa680f2, (q31_t)0xa03878, (q31_t)0x99effe, + (q31_t)0x93a784, (q31_t)0x8d5f09, (q31_t)0x87168e, (q31_t)0x80ce12, (q31_t)0x7a8597, (q31_t)0x743d1a, (q31_t)0x6df49e, (q31_t)0x67ac21, + (q31_t)0x6163a5, (q31_t)0x5b1b27, (q31_t)0x54d2aa, (q31_t)0x4e8a2c, (q31_t)0x4841af, (q31_t)0x41f931, (q31_t)0x3bb0b3, (q31_t)0x356835, + (q31_t)0x2f1fb6, (q31_t)0x28d738, (q31_t)0x228eb9, (q31_t)0x1c463b, (q31_t)0x15fdbc, (q31_t)0xfb53d, (q31_t)0x96cbe, (q31_t)0x3243f +}; + #endif + +/** + @} end of DCT4_IDCT4_Table group + */ + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_ALLOW_TABLES) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q15) +/** + @brief Q15 table for reciprocal +*/ +const q15_t __ALIGNED(4) armRecipTableQ15[64] = { + 0x7F03, 0x7D13, 0x7B31, 0x795E, 0x7798, 0x75E0, + 0x7434, 0x7294, 0x70FF, 0x6F76, 0x6DF6, 0x6C82, + 0x6B16, 0x69B5, 0x685C, 0x670C, 0x65C4, 0x6484, + 0x634C, 0x621C, 0x60F3, 0x5FD0, 0x5EB5, 0x5DA0, + 0x5C91, 0x5B88, 0x5A85, 0x5988, 0x5890, 0x579E, + 0x56B0, 0x55C8, 0x54E4, 0x5405, 0x532B, 0x5255, + 0x5183, 0x50B6, 0x4FEC, 0x4F26, 0x4E64, 0x4DA6, + 0x4CEC, 0x4C34, 0x4B81, 0x4AD0, 0x4A23, 0x4978, + 0x48D1, 0x482D, 0x478C, 0x46ED, 0x4651, 0x45B8, + 0x4521, 0x448D, 0x43FC, 0x436C, 0x42DF, 0x4255, + 0x41CC, 0x4146, 0x40C2, 0x4040 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q31) + +/** + @brief Q31 table for reciprocal +*/ +const q31_t armRecipTableQ31[64] = { + 0x7F03F03F, 0x7D137420, 0x7B31E739, 0x795E9F94, 0x7798FD29, 0x75E06928, + 0x7434554D, 0x72943B4B, 0x70FF9C40, 0x6F760031, 0x6DF6F593, 0x6C8210E3, + 0x6B16EC3A, 0x69B526F6, 0x685C655F, 0x670C505D, 0x65C4952D, 0x6484E519, + 0x634CF53E, 0x621C7E4F, 0x60F33C61, 0x5FD0EEB3, 0x5EB55785, 0x5DA03BEB, + 0x5C9163A1, 0x5B8898E6, 0x5A85A85A, 0x598860DF, 0x58909373, 0x579E1318, + 0x56B0B4B8, 0x55C84F0B, 0x54E4BA80, 0x5405D124, 0x532B6E8F, 0x52556FD0, + 0x5183B35A, 0x50B618F3, 0x4FEC81A2, 0x4F26CFA2, 0x4E64E64E, 0x4DA6AA1D, + 0x4CEC008B, 0x4C34D010, 0x4B810016, 0x4AD078EF, 0x4A2323C4, 0x4978EA96, + 0x48D1B827, 0x482D77FE, 0x478C1657, 0x46ED801D, 0x4651A2E5, 0x45B86CE2, + 0x4521CCE1, 0x448DB244, 0x43FC0CFA, 0x436CCD78, 0x42DFE4B4, 0x42554426, + 0x41CCDDB6, 0x4146A3C6, 0x40C28923, 0x40408102 +}; + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_F32) +/** + @par + Example code for the generation of the floating-point sine table: +
+  tableSize = 512;
+  for (n = 0; n < (tableSize + 1); n++)
+  {
+ 	sinTable[n] = sin(2*PI*n/tableSize);
+  }
+ @par + where PI value is 3.14159265358979 + */ +const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1] = { + 0.00000000f, 0.01227154f, 0.02454123f, 0.03680722f, 0.04906767f, 0.06132074f, + 0.07356456f, 0.08579731f, 0.09801714f, 0.11022221f, 0.12241068f, 0.13458071f, + 0.14673047f, 0.15885814f, 0.17096189f, 0.18303989f, 0.19509032f, 0.20711138f, + 0.21910124f, 0.23105811f, 0.24298018f, 0.25486566f, 0.26671276f, 0.27851969f, + 0.29028468f, 0.30200595f, 0.31368174f, 0.32531029f, 0.33688985f, 0.34841868f, + 0.35989504f, 0.37131719f, 0.38268343f, 0.39399204f, 0.40524131f, 0.41642956f, + 0.42755509f, 0.43861624f, 0.44961133f, 0.46053871f, 0.47139674f, 0.48218377f, + 0.49289819f, 0.50353838f, 0.51410274f, 0.52458968f, 0.53499762f, 0.54532499f, + 0.55557023f, 0.56573181f, 0.57580819f, 0.58579786f, 0.59569930f, 0.60551104f, + 0.61523159f, 0.62485949f, 0.63439328f, 0.64383154f, 0.65317284f, 0.66241578f, + 0.67155895f, 0.68060100f, 0.68954054f, 0.69837625f, 0.70710678f, 0.71573083f, + 0.72424708f, 0.73265427f, 0.74095113f, 0.74913639f, 0.75720885f, 0.76516727f, + 0.77301045f, 0.78073723f, 0.78834643f, 0.79583690f, 0.80320753f, 0.81045720f, + 0.81758481f, 0.82458930f, 0.83146961f, 0.83822471f, 0.84485357f, 0.85135519f, + 0.85772861f, 0.86397286f, 0.87008699f, 0.87607009f, 0.88192126f, 0.88763962f, + 0.89322430f, 0.89867447f, 0.90398929f, 0.90916798f, 0.91420976f, 0.91911385f, + 0.92387953f, 0.92850608f, 0.93299280f, 0.93733901f, 0.94154407f, 0.94560733f, + 0.94952818f, 0.95330604f, 0.95694034f, 0.96043052f, 0.96377607f, 0.96697647f, + 0.97003125f, 0.97293995f, 0.97570213f, 0.97831737f, 0.98078528f, 0.98310549f, + 0.98527764f, 0.98730142f, 0.98917651f, 0.99090264f, 0.99247953f, 0.99390697f, + 0.99518473f, 0.99631261f, 0.99729046f, 0.99811811f, 0.99879546f, 0.99932238f, + 0.99969882f, 0.99992470f, 1.00000000f, 0.99992470f, 0.99969882f, 0.99932238f, + 0.99879546f, 0.99811811f, 0.99729046f, 0.99631261f, 0.99518473f, 0.99390697f, + 0.99247953f, 0.99090264f, 0.98917651f, 0.98730142f, 0.98527764f, 0.98310549f, + 0.98078528f, 0.97831737f, 0.97570213f, 0.97293995f, 0.97003125f, 0.96697647f, + 0.96377607f, 0.96043052f, 0.95694034f, 0.95330604f, 0.94952818f, 0.94560733f, + 0.94154407f, 0.93733901f, 0.93299280f, 0.92850608f, 0.92387953f, 0.91911385f, + 0.91420976f, 0.90916798f, 0.90398929f, 0.89867447f, 0.89322430f, 0.88763962f, + 0.88192126f, 0.87607009f, 0.87008699f, 0.86397286f, 0.85772861f, 0.85135519f, + 0.84485357f, 0.83822471f, 0.83146961f, 0.82458930f, 0.81758481f, 0.81045720f, + 0.80320753f, 0.79583690f, 0.78834643f, 0.78073723f, 0.77301045f, 0.76516727f, + 0.75720885f, 0.74913639f, 0.74095113f, 0.73265427f, 0.72424708f, 0.71573083f, + 0.70710678f, 0.69837625f, 0.68954054f, 0.68060100f, 0.67155895f, 0.66241578f, + 0.65317284f, 0.64383154f, 0.63439328f, 0.62485949f, 0.61523159f, 0.60551104f, + 0.59569930f, 0.58579786f, 0.57580819f, 0.56573181f, 0.55557023f, 0.54532499f, + 0.53499762f, 0.52458968f, 0.51410274f, 0.50353838f, 0.49289819f, 0.48218377f, + 0.47139674f, 0.46053871f, 0.44961133f, 0.43861624f, 0.42755509f, 0.41642956f, + 0.40524131f, 0.39399204f, 0.38268343f, 0.37131719f, 0.35989504f, 0.34841868f, + 0.33688985f, 0.32531029f, 0.31368174f, 0.30200595f, 0.29028468f, 0.27851969f, + 0.26671276f, 0.25486566f, 0.24298018f, 0.23105811f, 0.21910124f, 0.20711138f, + 0.19509032f, 0.18303989f, 0.17096189f, 0.15885814f, 0.14673047f, 0.13458071f, + 0.12241068f, 0.11022221f, 0.09801714f, 0.08579731f, 0.07356456f, 0.06132074f, + 0.04906767f, 0.03680722f, 0.02454123f, 0.01227154f, 0.00000000f, -0.01227154f, + -0.02454123f, -0.03680722f, -0.04906767f, -0.06132074f, -0.07356456f, + -0.08579731f, -0.09801714f, -0.11022221f, -0.12241068f, -0.13458071f, + -0.14673047f, -0.15885814f, -0.17096189f, -0.18303989f, -0.19509032f, + -0.20711138f, -0.21910124f, -0.23105811f, -0.24298018f, -0.25486566f, + -0.26671276f, -0.27851969f, -0.29028468f, -0.30200595f, -0.31368174f, + -0.32531029f, -0.33688985f, -0.34841868f, -0.35989504f, -0.37131719f, + -0.38268343f, -0.39399204f, -0.40524131f, -0.41642956f, -0.42755509f, + -0.43861624f, -0.44961133f, -0.46053871f, -0.47139674f, -0.48218377f, + -0.49289819f, -0.50353838f, -0.51410274f, -0.52458968f, -0.53499762f, + -0.54532499f, -0.55557023f, -0.56573181f, -0.57580819f, -0.58579786f, + -0.59569930f, -0.60551104f, -0.61523159f, -0.62485949f, -0.63439328f, + -0.64383154f, -0.65317284f, -0.66241578f, -0.67155895f, -0.68060100f, + -0.68954054f, -0.69837625f, -0.70710678f, -0.71573083f, -0.72424708f, + -0.73265427f, -0.74095113f, -0.74913639f, -0.75720885f, -0.76516727f, + -0.77301045f, -0.78073723f, -0.78834643f, -0.79583690f, -0.80320753f, + -0.81045720f, -0.81758481f, -0.82458930f, -0.83146961f, -0.83822471f, + -0.84485357f, -0.85135519f, -0.85772861f, -0.86397286f, -0.87008699f, + -0.87607009f, -0.88192126f, -0.88763962f, -0.89322430f, -0.89867447f, + -0.90398929f, -0.90916798f, -0.91420976f, -0.91911385f, -0.92387953f, + -0.92850608f, -0.93299280f, -0.93733901f, -0.94154407f, -0.94560733f, + -0.94952818f, -0.95330604f, -0.95694034f, -0.96043052f, -0.96377607f, + -0.96697647f, -0.97003125f, -0.97293995f, -0.97570213f, -0.97831737f, + -0.98078528f, -0.98310549f, -0.98527764f, -0.98730142f, -0.98917651f, + -0.99090264f, -0.99247953f, -0.99390697f, -0.99518473f, -0.99631261f, + -0.99729046f, -0.99811811f, -0.99879546f, -0.99932238f, -0.99969882f, + -0.99992470f, -1.00000000f, -0.99992470f, -0.99969882f, -0.99932238f, + -0.99879546f, -0.99811811f, -0.99729046f, -0.99631261f, -0.99518473f, + -0.99390697f, -0.99247953f, -0.99090264f, -0.98917651f, -0.98730142f, + -0.98527764f, -0.98310549f, -0.98078528f, -0.97831737f, -0.97570213f, + -0.97293995f, -0.97003125f, -0.96697647f, -0.96377607f, -0.96043052f, + -0.95694034f, -0.95330604f, -0.94952818f, -0.94560733f, -0.94154407f, + -0.93733901f, -0.93299280f, -0.92850608f, -0.92387953f, -0.91911385f, + -0.91420976f, -0.90916798f, -0.90398929f, -0.89867447f, -0.89322430f, + -0.88763962f, -0.88192126f, -0.87607009f, -0.87008699f, -0.86397286f, + -0.85772861f, -0.85135519f, -0.84485357f, -0.83822471f, -0.83146961f, + -0.82458930f, -0.81758481f, -0.81045720f, -0.80320753f, -0.79583690f, + -0.78834643f, -0.78073723f, -0.77301045f, -0.76516727f, -0.75720885f, + -0.74913639f, -0.74095113f, -0.73265427f, -0.72424708f, -0.71573083f, + -0.70710678f, -0.69837625f, -0.68954054f, -0.68060100f, -0.67155895f, + -0.66241578f, -0.65317284f, -0.64383154f, -0.63439328f, -0.62485949f, + -0.61523159f, -0.60551104f, -0.59569930f, -0.58579786f, -0.57580819f, + -0.56573181f, -0.55557023f, -0.54532499f, -0.53499762f, -0.52458968f, + -0.51410274f, -0.50353838f, -0.49289819f, -0.48218377f, -0.47139674f, + -0.46053871f, -0.44961133f, -0.43861624f, -0.42755509f, -0.41642956f, + -0.40524131f, -0.39399204f, -0.38268343f, -0.37131719f, -0.35989504f, + -0.34841868f, -0.33688985f, -0.32531029f, -0.31368174f, -0.30200595f, + -0.29028468f, -0.27851969f, -0.26671276f, -0.25486566f, -0.24298018f, + -0.23105811f, -0.21910124f, -0.20711138f, -0.19509032f, -0.18303989f, + -0.17096189f, -0.15885814f, -0.14673047f, -0.13458071f, -0.12241068f, + -0.11022221f, -0.09801714f, -0.08579731f, -0.07356456f, -0.06132074f, + -0.04906767f, -0.03680722f, -0.02454123f, -0.01227154f, -0.00000000f +}; +#endif /* defined(ARM_ALL_FAST_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q31) +/** + @par + Table values are in Q31 (1.31 fixed-point format) and generation is done in + three steps. First, generate sin values in floating point: +
+  tableSize = 512;
+  for (n = 0; n < (tableSize + 1); n++)
+  {
+ 	sinTable[n] = sin(2*PI*n/tableSize);
+  } 
+ where PI value is 3.14159265358979 + @par + Second, convert floating-point to Q31 (Fixed point): + (sinTable[i] * pow(2, 31)) + @par + Finally, round to the nearest integer value: + sinTable[i] += (sinTable[i] > 0 ? 0.5 : -0.5); + */ +const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1] = { + 0L, 26352928L, 52701887L, 79042909L, 105372028L, 131685278L, 157978697L, + 184248325L, 210490206L, 236700388L, 262874923L, 289009871L, 315101295L, + 341145265L, 367137861L, 393075166L, 418953276L, 444768294L, 470516330L, + 496193509L, 521795963L, 547319836L, 572761285L, 598116479L, 623381598L, + 648552838L, 673626408L, 698598533L, 723465451L, 748223418L, 772868706L, + 797397602L, 821806413L, 846091463L, 870249095L, 894275671L, 918167572L, + 941921200L, 965532978L, 988999351L, 1012316784L, 1035481766L, 1058490808L, + 1081340445L, 1104027237L, 1126547765L, 1148898640L, 1171076495L, 1193077991L, + 1214899813L, 1236538675L, 1257991320L, 1279254516L, 1300325060L, 1321199781L, + 1341875533L, 1362349204L, 1382617710L, 1402678000L, 1422527051L, 1442161874L, + 1461579514L, 1480777044L, 1499751576L, 1518500250L, 1537020244L, 1555308768L, + 1573363068L, 1591180426L, 1608758157L, 1626093616L, 1643184191L, 1660027308L, + 1676620432L, 1692961062L, 1709046739L, 1724875040L, 1740443581L, 1755750017L, + 1770792044L, 1785567396L, 1800073849L, 1814309216L, 1828271356L, 1841958164L, + 1855367581L, 1868497586L, 1881346202L, 1893911494L, 1906191570L, 1918184581L, + 1929888720L, 1941302225L, 1952423377L, 1963250501L, 1973781967L, 1984016189L, + 1993951625L, 2003586779L, 2012920201L, 2021950484L, 2030676269L, 2039096241L, + 2047209133L, 2055013723L, 2062508835L, 2069693342L, 2076566160L, 2083126254L, + 2089372638L, 2095304370L, 2100920556L, 2106220352L, 2111202959L, 2115867626L, + 2120213651L, 2124240380L, 2127947206L, 2131333572L, 2134398966L, 2137142927L, + 2139565043L, 2141664948L, 2143442326L, 2144896910L, 2146028480L, 2146836866L, + 2147321946L, 2147483647L, 2147321946L, 2146836866L, 2146028480L, 2144896910L, + 2143442326L, 2141664948L, 2139565043L, 2137142927L, 2134398966L, 2131333572L, + 2127947206L, 2124240380L, 2120213651L, 2115867626L, 2111202959L, 2106220352L, + 2100920556L, 2095304370L, 2089372638L, 2083126254L, 2076566160L, 2069693342L, + 2062508835L, 2055013723L, 2047209133L, 2039096241L, 2030676269L, 2021950484L, + 2012920201L, 2003586779L, 1993951625L, 1984016189L, 1973781967L, 1963250501L, + 1952423377L, 1941302225L, 1929888720L, 1918184581L, 1906191570L, 1893911494L, + 1881346202L, 1868497586L, 1855367581L, 1841958164L, 1828271356L, 1814309216L, + 1800073849L, 1785567396L, 1770792044L, 1755750017L, 1740443581L, 1724875040L, + 1709046739L, 1692961062L, 1676620432L, 1660027308L, 1643184191L, 1626093616L, + 1608758157L, 1591180426L, 1573363068L, 1555308768L, 1537020244L, 1518500250L, + 1499751576L, 1480777044L, 1461579514L, 1442161874L, 1422527051L, 1402678000L, + 1382617710L, 1362349204L, 1341875533L, 1321199781L, 1300325060L, 1279254516L, + 1257991320L, 1236538675L, 1214899813L, 1193077991L, 1171076495L, 1148898640L, + 1126547765L, 1104027237L, 1081340445L, 1058490808L, 1035481766L, 1012316784L, + 988999351L, 965532978L, 941921200L, 918167572L, 894275671L, 870249095L, + 846091463L, 821806413L, 797397602L, 772868706L, 748223418L, 723465451L, + 698598533L, 673626408L, 648552838L, 623381598L, 598116479L, 572761285L, + 547319836L, 521795963L, 496193509L, 470516330L, 444768294L, 418953276L, + 393075166L, 367137861L, 341145265L, 315101295L, 289009871L, 262874923L, + 236700388L, 210490206L, 184248325L, 157978697L, 131685278L, 105372028L, + 79042909L, 52701887L, 26352928L, 0L, -26352928L, -52701887L, -79042909L, + -105372028L, -131685278L, -157978697L, -184248325L, -210490206L, -236700388L, + -262874923L, -289009871L, -315101295L, -341145265L, -367137861L, -393075166L, + -418953276L, -444768294L, -470516330L, -496193509L, -521795963L, -547319836L, + -572761285L, -598116479L, -623381598L, -648552838L, -673626408L, -698598533L, + -723465451L, -748223418L, -772868706L, -797397602L, -821806413L, -846091463L, + -870249095L, -894275671L, -918167572L, -941921200L, -965532978L, -988999351L, + -1012316784L, -1035481766L, -1058490808L, -1081340445L, -1104027237L, + -1126547765L, -1148898640L, -1171076495L, -1193077991L, -1214899813L, + -1236538675L, -1257991320L, -1279254516L, -1300325060L, -1321199781L, + -1341875533L, -1362349204L, -1382617710L, -1402678000L, -1422527051L, + -1442161874L, -1461579514L, -1480777044L, -1499751576L, -1518500250L, + -1537020244L, -1555308768L, -1573363068L, -1591180426L, -1608758157L, + -1626093616L, -1643184191L, -1660027308L, -1676620432L, -1692961062L, + -1709046739L, -1724875040L, -1740443581L, -1755750017L, -1770792044L, + -1785567396L, -1800073849L, -1814309216L, -1828271356L, -1841958164L, + -1855367581L, -1868497586L, -1881346202L, -1893911494L, -1906191570L, + -1918184581L, -1929888720L, -1941302225L, -1952423377L, -1963250501L, + -1973781967L, -1984016189L, -1993951625L, -2003586779L, -2012920201L, + -2021950484L, -2030676269L, -2039096241L, -2047209133L, -2055013723L, + -2062508835L, -2069693342L, -2076566160L, -2083126254L, -2089372638L, + -2095304370L, -2100920556L, -2106220352L, -2111202959L, -2115867626L, + -2120213651L, -2124240380L, -2127947206L, -2131333572L, -2134398966L, + -2137142927L, -2139565043L, -2141664948L, -2143442326L, -2144896910L, + -2146028480L, -2146836866L, -2147321946L, (q31_t)0x80000000, -2147321946L, + -2146836866L, -2146028480L, -2144896910L, -2143442326L, -2141664948L, + -2139565043L, -2137142927L, -2134398966L, -2131333572L, -2127947206L, + -2124240380L, -2120213651L, -2115867626L, -2111202959L, -2106220352L, + -2100920556L, -2095304370L, -2089372638L, -2083126254L, -2076566160L, + -2069693342L, -2062508835L, -2055013723L, -2047209133L, -2039096241L, + -2030676269L, -2021950484L, -2012920201L, -2003586779L, -1993951625L, + -1984016189L, -1973781967L, -1963250501L, -1952423377L, -1941302225L, + -1929888720L, -1918184581L, -1906191570L, -1893911494L, -1881346202L, + -1868497586L, -1855367581L, -1841958164L, -1828271356L, -1814309216L, + -1800073849L, -1785567396L, -1770792044L, -1755750017L, -1740443581L, + -1724875040L, -1709046739L, -1692961062L, -1676620432L, -1660027308L, + -1643184191L, -1626093616L, -1608758157L, -1591180426L, -1573363068L, + -1555308768L, -1537020244L, -1518500250L, -1499751576L, -1480777044L, + -1461579514L, -1442161874L, -1422527051L, -1402678000L, -1382617710L, + -1362349204L, -1341875533L, -1321199781L, -1300325060L, -1279254516L, + -1257991320L, -1236538675L, -1214899813L, -1193077991L, -1171076495L, + -1148898640L, -1126547765L, -1104027237L, -1081340445L, -1058490808L, + -1035481766L, -1012316784L, -988999351L, -965532978L, -941921200L, + -918167572L, -894275671L, -870249095L, -846091463L, -821806413L, -797397602L, + -772868706L, -748223418L, -723465451L, -698598533L, -673626408L, -648552838L, + -623381598L, -598116479L, -572761285L, -547319836L, -521795963L, -496193509L, + -470516330L, -444768294L, -418953276L, -393075166L, -367137861L, -341145265L, + -315101295L, -289009871L, -262874923L, -236700388L, -210490206L, -184248325L, + -157978697L, -131685278L, -105372028L, -79042909L, -52701887L, -26352928L, 0 +}; + +#endif /* defined(ARM_ALL_FAST_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q15) +/** + @par + Table values are in Q15 (1.15 fixed-point format) and generation is done in + three steps. First, generate sin values in floating point: +
+  tableSize = 512;
+  for (n = 0; n < (tableSize + 1); n++)
+  {
+ 	sinTable[n] = sin(2*PI*n/tableSize);
+  } 
+ where PI value is 3.14159265358979 + @par + Second, convert floating-point to Q15 (Fixed point): + (sinTable[i] * pow(2, 15)) + @par + Finally, round to the nearest integer value: + sinTable[i] += (sinTable[i] > 0 ? 0.5 :-0.5); + */ +const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1] = { + 0, 402, 804, 1206, 1608, 2009, 2411, 2811, 3212, 3612, 4011, 4410, 4808, + 5205, 5602, 5998, 6393, 6787, 7180, 7571, 7962, 8351, 8740, 9127, 9512, + 9896, 10279, 10660, 11039, 11417, 11793, 12167, 12540, 12910, 13279, + 13646, 14010, 14373, 14733, 15091, 15447, 15800, 16151, 16500, 16846, + 17190, 17531, 17869, 18205, 18538, 18868, 19195, 19520, 19841, 20160, + 20475, 20788, 21097, 21403, 21706, 22006, 22302, 22595, 22884, 23170, + 23453, 23732, 24008, 24279, 24548, 24812, 25073, 25330, 25583, 25833, + 26078, 26320, 26557, 26791, 27020, 27246, 27467, 27684, 27897, 28106, + 28311, 28511, 28707, 28899, 29086, 29269, 29448, 29622, 29792, 29957, + 30118, 30274, 30425, 30572, 30715, 30853, 30986, 31114, 31238, 31357, + 31471, 31581, 31686, 31786, 31881, 31972, 32058, 32138, 32214, 32286, + 32352, 32413, 32470, 32522, 32568, 32610, 32647, 32679, 32706, 32729, + 32746, 32758, 32766, 32767, 32766, 32758, 32746, 32729, 32706, 32679, + 32647, 32610, 32568, 32522, 32470, 32413, 32352, 32286, 32214, 32138, + 32058, 31972, 31881, 31786, 31686, 31581, 31471, 31357, 31238, 31114, + 30986, 30853, 30715, 30572, 30425, 30274, 30118, 29957, 29792, 29622, + 29448, 29269, 29086, 28899, 28707, 28511, 28311, 28106, 27897, 27684, + 27467, 27246, 27020, 26791, 26557, 26320, 26078, 25833, 25583, 25330, + 25073, 24812, 24548, 24279, 24008, 23732, 23453, 23170, 22884, 22595, + 22302, 22006, 21706, 21403, 21097, 20788, 20475, 20160, 19841, 19520, + 19195, 18868, 18538, 18205, 17869, 17531, 17190, 16846, 16500, 16151, + 15800, 15447, 15091, 14733, 14373, 14010, 13646, 13279, 12910, 12540, + 12167, 11793, 11417, 11039, 10660, 10279, 9896, 9512, 9127, 8740, 8351, + 7962, 7571, 7180, 6787, 6393, 5998, 5602, 5205, 4808, 4410, 4011, 3612, + 3212, 2811, 2411, 2009, 1608, 1206, 804, 402, 0, -402, -804, -1206, + -1608, -2009, -2411, -2811, -3212, -3612, -4011, -4410, -4808, -5205, + -5602, -5998, -6393, -6787, -7180, -7571, -7962, -8351, -8740, -9127, + -9512, -9896, -10279, -10660, -11039, -11417, -11793, -12167, -12540, + -12910, -13279, -13646, -14010, -14373, -14733, -15091, -15447, -15800, + -16151, -16500, -16846, -17190, -17531, -17869, -18205, -18538, -18868, + -19195, -19520, -19841, -20160, -20475, -20788, -21097, -21403, -21706, + -22006, -22302, -22595, -22884, -23170, -23453, -23732, -24008, -24279, + -24548, -24812, -25073, -25330, -25583, -25833, -26078, -26320, -26557, + -26791, -27020, -27246, -27467, -27684, -27897, -28106, -28311, -28511, + -28707, -28899, -29086, -29269, -29448, -29622, -29792, -29957, -30118, + -30274, -30425, -30572, -30715, -30853, -30986, -31114, -31238, -31357, + -31471, -31581, -31686, -31786, -31881, -31972, -32058, -32138, -32214, + -32286, -32352, -32413, -32470, -32522, -32568, -32610, -32647, -32679, + -32706, -32729, -32746, -32758, -32766, -32768, -32766, -32758, -32746, + -32729, -32706, -32679, -32647, -32610, -32568, -32522, -32470, -32413, + -32352, -32286, -32214, -32138, -32058, -31972, -31881, -31786, -31686, + -31581, -31471, -31357, -31238, -31114, -30986, -30853, -30715, -30572, + -30425, -30274, -30118, -29957, -29792, -29622, -29448, -29269, -29086, + -28899, -28707, -28511, -28311, -28106, -27897, -27684, -27467, -27246, + -27020, -26791, -26557, -26320, -26078, -25833, -25583, -25330, -25073, + -24812, -24548, -24279, -24008, -23732, -23453, -23170, -22884, -22595, + -22302, -22006, -21706, -21403, -21097, -20788, -20475, -20160, -19841, + -19520, -19195, -18868, -18538, -18205, -17869, -17531, -17190, -16846, + -16500, -16151, -15800, -15447, -15091, -14733, -14373, -14010, -13646, + -13279, -12910, -12540, -12167, -11793, -11417, -11039, -10660, -10279, + -9896, -9512, -9127, -8740, -8351, -7962, -7571, -7180, -6787, -6393, + -5998, -5602, -5205, -4808, -4410, -4011, -3612, -3212, -2811, -2411, + -2009, -1608, -1206, -804, -402, 0 +}; +#endif /* defined(ARM_ALL_FAST_TABLES) */ + +#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_TABLES) */ diff --git a/CMSIS/DSP/Source/CommonTables/arm_const_structs.c b/CMSIS/DSP/Source/CommonTables/arm_const_structs.c new file mode 100644 index 0000000..6887da4 --- /dev/null +++ b/CMSIS/DSP/Source/CommonTables/arm_const_structs.c @@ -0,0 +1,486 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_const_structs.c + * Description: Constant structs that are initialized for user convenience. + * For example, some can be given as arguments to the arm_cfft_f32() or arm_rfft_f32() functions. + * + * $Date: 27. January 2017 + * $Revision: V.1.5.1 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2017 ARM Limited or its affiliates. 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. + */ + +#include "arm_const_structs.h" + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + +/* Floating-point structs */ +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16)) +const arm_cfft_instance_f32 arm_cfft_sR_f32_len16 = { + 16, twiddleCoef_16, armBitRevIndexTable16, ARMBITREVINDEXTABLE_16_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32)) +const arm_cfft_instance_f32 arm_cfft_sR_f32_len32 = { + 32, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE_32_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64)) +const arm_cfft_instance_f32 arm_cfft_sR_f32_len64 = { + 64, twiddleCoef_64, armBitRevIndexTable64, ARMBITREVINDEXTABLE_64_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128)) +const arm_cfft_instance_f32 arm_cfft_sR_f32_len128 = { + 128, twiddleCoef_128, armBitRevIndexTable128, ARMBITREVINDEXTABLE_128_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256)) +const arm_cfft_instance_f32 arm_cfft_sR_f32_len256 = { + 256, twiddleCoef_256, armBitRevIndexTable256, ARMBITREVINDEXTABLE_256_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512)) +const arm_cfft_instance_f32 arm_cfft_sR_f32_len512 = { + 512, twiddleCoef_512, armBitRevIndexTable512, ARMBITREVINDEXTABLE_512_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024)) +const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024 = { + 1024, twiddleCoef_1024, armBitRevIndexTable1024, ARMBITREVINDEXTABLE_1024_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048)) +const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048 = { + 2048, twiddleCoef_2048, armBitRevIndexTable2048, ARMBITREVINDEXTABLE_2048_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_4096) && defined(ARM_TABLE_BITREVIDX_FLT_4096)) +const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096 = { + 4096, twiddleCoef_4096, armBitRevIndexTable4096, ARMBITREVINDEXTABLE_4096_TABLE_LENGTH +}; +#endif + +/* Fixed-point structs */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_16) && defined(ARM_TABLE_BITREVIDX_FXT_16)) +const arm_cfft_instance_q31 arm_cfft_sR_q31_len16 = { + 16, twiddleCoef_16_q31, armBitRevIndexTable_fixed_16, ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_32) && defined(ARM_TABLE_BITREVIDX_FXT_32)) +const arm_cfft_instance_q31 arm_cfft_sR_q31_len32 = { + 32, twiddleCoef_32_q31, armBitRevIndexTable_fixed_32, ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_64) && defined(ARM_TABLE_BITREVIDX_FXT_64)) +const arm_cfft_instance_q31 arm_cfft_sR_q31_len64 = { + 64, twiddleCoef_64_q31, armBitRevIndexTable_fixed_64, ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_128) && defined(ARM_TABLE_BITREVIDX_FXT_128)) +const arm_cfft_instance_q31 arm_cfft_sR_q31_len128 = { + 128, twiddleCoef_128_q31, armBitRevIndexTable_fixed_128, ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_256) && defined(ARM_TABLE_BITREVIDX_FXT_256)) +const arm_cfft_instance_q31 arm_cfft_sR_q31_len256 = { + 256, twiddleCoef_256_q31, armBitRevIndexTable_fixed_256, ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_512) && defined(ARM_TABLE_BITREVIDX_FXT_512)) +const arm_cfft_instance_q31 arm_cfft_sR_q31_len512 = { + 512, twiddleCoef_512_q31, armBitRevIndexTable_fixed_512, ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024)) +const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024 = { + 1024, twiddleCoef_1024_q31, armBitRevIndexTable_fixed_1024, ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048)) +const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048 = { + 2048, twiddleCoef_2048_q31, armBitRevIndexTable_fixed_2048, ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096)) +const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096 = { + 4096, twiddleCoef_4096_q31, armBitRevIndexTable_fixed_4096, ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_16) && defined(ARM_TABLE_BITREVIDX_FXT_16)) +const arm_cfft_instance_q15 arm_cfft_sR_q15_len16 = { + 16, twiddleCoef_16_q15, armBitRevIndexTable_fixed_16, ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_32) && defined(ARM_TABLE_BITREVIDX_FXT_32)) +const arm_cfft_instance_q15 arm_cfft_sR_q15_len32 = { + 32, twiddleCoef_32_q15, armBitRevIndexTable_fixed_32, ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_64) && defined(ARM_TABLE_BITREVIDX_FXT_64)) +const arm_cfft_instance_q15 arm_cfft_sR_q15_len64 = { + 64, twiddleCoef_64_q15, armBitRevIndexTable_fixed_64, ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_128) && defined(ARM_TABLE_BITREVIDX_FXT_128)) +const arm_cfft_instance_q15 arm_cfft_sR_q15_len128 = { + 128, twiddleCoef_128_q15, armBitRevIndexTable_fixed_128, ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_256) && defined(ARM_TABLE_BITREVIDX_FXT_256)) +const arm_cfft_instance_q15 arm_cfft_sR_q15_len256 = { + 256, twiddleCoef_256_q15, armBitRevIndexTable_fixed_256, ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_512) && defined(ARM_TABLE_BITREVIDX_FXT_512)) +const arm_cfft_instance_q15 arm_cfft_sR_q15_len512 = { + 512, twiddleCoef_512_q15, armBitRevIndexTable_fixed_512, ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024)) +const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024 = { + 1024, twiddleCoef_1024_q15, armBitRevIndexTable_fixed_1024, ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048)) +const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048 = { + 2048, twiddleCoef_2048_q15, armBitRevIndexTable_fixed_2048, ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096)) +const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096 = { + 4096, twiddleCoef_4096_q15, armBitRevIndexTable_fixed_4096, ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH +}; +#endif + +/* Structure for real-value inputs */ +/* Floating-point structs */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32)) +const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len32 = { + { 16, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE_16_TABLE_LENGTH }, + 32U, + (float32_t *)twiddleCoef_rfft_32 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64)) +const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len64 = { + { 32, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE_32_TABLE_LENGTH }, + 64U, + (float32_t *)twiddleCoef_rfft_64 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128)) +const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len128 = { + { 64, twiddleCoef_64, armBitRevIndexTable64, ARMBITREVINDEXTABLE_64_TABLE_LENGTH }, + 128U, + (float32_t *)twiddleCoef_rfft_128 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256)) +const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len256 = { + { 128, twiddleCoef_128, armBitRevIndexTable128, ARMBITREVINDEXTABLE_128_TABLE_LENGTH }, + 256U, + (float32_t *)twiddleCoef_rfft_256 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512)) +const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len512 = { + { 256, twiddleCoef_256, armBitRevIndexTable256, ARMBITREVINDEXTABLE_256_TABLE_LENGTH }, + 512U, + (float32_t *)twiddleCoef_rfft_512 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024)) +const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len1024 = { + { 512, twiddleCoef_512, armBitRevIndexTable512, ARMBITREVINDEXTABLE_512_TABLE_LENGTH }, + 1024U, + (float32_t *)twiddleCoef_rfft_1024 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048)) +const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len2048 = { + { 1024, twiddleCoef_1024, armBitRevIndexTable1024, ARMBITREVINDEXTABLE_1024_TABLE_LENGTH }, + 2048U, + (float32_t *)twiddleCoef_rfft_2048 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_4096) && defined(ARM_TABLE_BITREVIDX_FLT_4096) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096)) +const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len4096 = { + { 2048, twiddleCoef_2048, armBitRevIndexTable2048, ARMBITREVINDEXTABLE_2048_TABLE_LENGTH }, + 4096U, + (float32_t *)twiddleCoef_rfft_4096 +}; +#endif + +/* Fixed-point structs */ +/* q31_t */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_16) && defined(ARM_TABLE_BITREVIDX_FXT_16)) +const arm_rfft_instance_q31 arm_rfft_sR_q31_len32 = { + 32U, + 0, + 1, + 256U, + (q31_t*)realCoefAQ31, + (q31_t*)realCoefBQ31, + &arm_cfft_sR_q31_len16 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_32) && defined(ARM_TABLE_BITREVIDX_FXT_32)) +const arm_rfft_instance_q31 arm_rfft_sR_q31_len64 = { + 64U, + 0, + 1, + 128U, + (q31_t*)realCoefAQ31, + (q31_t*)realCoefBQ31, + &arm_cfft_sR_q31_len32 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_64) && defined(ARM_TABLE_BITREVIDX_FXT_64)) +const arm_rfft_instance_q31 arm_rfft_sR_q31_len128 = { + 128U, + 0, + 1, + 64U, + (q31_t*)realCoefAQ31, + (q31_t*)realCoefBQ31, + &arm_cfft_sR_q31_len64 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_128) && defined(ARM_TABLE_BITREVIDX_FXT_128)) +const arm_rfft_instance_q31 arm_rfft_sR_q31_len256 = { + 256U, + 0, + 1, + 32U, + (q31_t*)realCoefAQ31, + (q31_t*)realCoefBQ31, + &arm_cfft_sR_q31_len128 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_256) && defined(ARM_TABLE_BITREVIDX_FXT_256)) +const arm_rfft_instance_q31 arm_rfft_sR_q31_len512 = { + 512U, + 0, + 1, + 16U, + (q31_t*)realCoefAQ31, + (q31_t*)realCoefBQ31, + &arm_cfft_sR_q31_len256 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_512) && defined(ARM_TABLE_BITREVIDX_FXT_512)) +const arm_rfft_instance_q31 arm_rfft_sR_q31_len1024 = { + 1024U, + 0, + 1, + 8U, + (q31_t*)realCoefAQ31, + (q31_t*)realCoefBQ31, + &arm_cfft_sR_q31_len512 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024)) +const arm_rfft_instance_q31 arm_rfft_sR_q31_len2048 = { + 2048U, + 0, + 1, + 4U, + (q31_t*)realCoefAQ31, + (q31_t*)realCoefBQ31, + &arm_cfft_sR_q31_len1024 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048)) +const arm_rfft_instance_q31 arm_rfft_sR_q31_len4096 = { + 4096U, + 0, + 1, + 2U, + (q31_t*)realCoefAQ31, + (q31_t*)realCoefBQ31, + &arm_cfft_sR_q31_len2048 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096)) +const arm_rfft_instance_q31 arm_rfft_sR_q31_len8192 = { + 8192U, + 0, + 1, + 1U, + (q31_t*)realCoefAQ31, + (q31_t*)realCoefBQ31, + &arm_cfft_sR_q31_len4096 +}; +#endif + +/* q15_t */ +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_16) && defined(ARM_TABLE_BITREVIDX_FXT_16)) +const arm_rfft_instance_q15 arm_rfft_sR_q15_len32 = { + 32U, + 0, + 1, + 256U, + (q15_t*)realCoefAQ15, + (q15_t*)realCoefBQ15, + &arm_cfft_sR_q15_len16 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_32) && defined(ARM_TABLE_BITREVIDX_FXT_32)) +const arm_rfft_instance_q15 arm_rfft_sR_q15_len64 = { + 64U, + 0, + 1, + 128U, + (q15_t*)realCoefAQ15, + (q15_t*)realCoefBQ15, + &arm_cfft_sR_q15_len32 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_64) && defined(ARM_TABLE_BITREVIDX_FXT_64)) +const arm_rfft_instance_q15 arm_rfft_sR_q15_len128 = { + 128U, + 0, + 1, + 64U, + (q15_t*)realCoefAQ15, + (q15_t*)realCoefBQ15, + &arm_cfft_sR_q15_len64 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_128) && defined(ARM_TABLE_BITREVIDX_FXT_128)) +const arm_rfft_instance_q15 arm_rfft_sR_q15_len256 = { + 256U, + 0, + 1, + 32U, + (q15_t*)realCoefAQ15, + (q15_t*)realCoefBQ15, + &arm_cfft_sR_q15_len128 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_256) && defined(ARM_TABLE_BITREVIDX_FXT_256)) +const arm_rfft_instance_q15 arm_rfft_sR_q15_len512 = { + 512U, + 0, + 1, + 16U, + (q15_t*)realCoefAQ15, + (q15_t*)realCoefBQ15, + &arm_cfft_sR_q15_len256 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_512) && defined(ARM_TABLE_BITREVIDX_FXT_512)) +const arm_rfft_instance_q15 arm_rfft_sR_q15_len1024 = { + 1024U, + 0, + 1, + 8U, + (q15_t*)realCoefAQ15, + (q15_t*)realCoefBQ15, + &arm_cfft_sR_q15_len512 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024)) +const arm_rfft_instance_q15 arm_rfft_sR_q15_len2048 = { + 2048U, + 0, + 1, + 4U, + (q15_t*)realCoefAQ15, + (q15_t*)realCoefBQ15, + &arm_cfft_sR_q15_len1024 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048)) +const arm_rfft_instance_q15 arm_rfft_sR_q15_len4096 = { + 4096U, + 0, + 1, + 2U, + (q15_t*)realCoefAQ15, + (q15_t*)realCoefBQ15, + &arm_cfft_sR_q15_len2048 +}; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096)) +const arm_rfft_instance_q15 arm_rfft_sR_q15_len8192 = { + 8192U, + 0, + 1, + 1U, + (q15_t*)realCoefAQ15, + (q15_t*)realCoefBQ15, + &arm_cfft_sR_q15_len4096 +}; +#endif + +#endif diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/CMakeLists.txt b/CMSIS/DSP/Source/ComplexMathFunctions/CMakeLists.txt new file mode 100644 index 0000000..16e06c6 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPComplexMath) + + +file(GLOB SRC "./*_*.c") + +add_library(CMSISDSPComplexMath STATIC ${SRC}) + +configdsp(CMSISDSPComplexMath ..) + +### Includes +target_include_directories(CMSISDSPComplexMath PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/ComplexMathFunctions.c b/CMSIS/DSP/Source/ComplexMathFunctions/ComplexMathFunctions.c new file mode 100644 index 0000000..2210533 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/ComplexMathFunctions.c @@ -0,0 +1,46 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: CompexMathFunctions.c + * Description: Combination of all comlex math function source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_cmplx_conj_f32.c" +#include "arm_cmplx_conj_q15.c" +#include "arm_cmplx_conj_q31.c" +#include "arm_cmplx_dot_prod_f32.c" +#include "arm_cmplx_dot_prod_q15.c" +#include "arm_cmplx_dot_prod_q31.c" +#include "arm_cmplx_mag_f32.c" +#include "arm_cmplx_mag_q15.c" +#include "arm_cmplx_mag_q31.c" +#include "arm_cmplx_mag_squared_f32.c" +#include "arm_cmplx_mag_squared_q15.c" +#include "arm_cmplx_mag_squared_q31.c" +#include "arm_cmplx_mult_cmplx_f32.c" +#include "arm_cmplx_mult_cmplx_q15.c" +#include "arm_cmplx_mult_cmplx_q31.c" +#include "arm_cmplx_mult_real_f32.c" +#include "arm_cmplx_mult_real_q15.c" +#include "arm_cmplx_mult_real_q31.c" diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c new file mode 100644 index 0000000..df5db00 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c @@ -0,0 +1,161 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_conj_f32.c + * Description: Floating-point complex conjugate + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @defgroup cmplx_conj Complex Conjugate + + Conjugates the elements of a complex data vector. + + The pSrc points to the source data and + pDst points to the destination data where the result should be written. + numSamples specifies the number of complex samples + and the data in each array is stored in an interleaved fashion + (real, imag, real, imag, ...). + Each array has a total of 2*numSamples values. + + The underlying algorithm is used: +
+  for (n = 0; n < numSamples; n++) {
+      pDst[(2*n)  ] =  pSrc[(2*n)  ];    // real part
+      pDst[(2*n)+1] = -pSrc[(2*n)+1];    // imag part
+  }
+  
+ + There are separate functions for floating-point, Q15, and Q31 data types. + */ + +/** + @addtogroup cmplx_conj + @{ + */ + +/** + @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 samples in each vector + @return none + */ + + +void arm_cmplx_conj_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined(ARM_MATH_NEON) + float32x4_t zero; + float32x4x2_t vec; + + zero = vdupq_n_f32(0.0); + + /* Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0]+jC[1] = A[0]+(-1)*jA[1] */ + /* Calculate Complex Conjugate and then store the results in the destination buffer. */ + vec = vld2q_f32(pSrc); + vec.val[1] = vsubq_f32(zero,vec.val[1]); + vst2q_f32(pDst,vec); + + /* Increment pointers */ + pSrc += 8; + pDst += 8; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Tail */ + blkCnt = numSamples & 0x3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0] + jC[1] = A[0]+ j(-1)A[1] */ + + /* Calculate Complex Conjugate and store result in destination buffer. */ + *pDst++ = *pSrc++; + *pDst++ = -*pSrc++; + + *pDst++ = *pSrc++; + *pDst++ = -*pSrc++; + + *pDst++ = *pSrc++; + *pDst++ = -*pSrc++; + + *pDst++ = *pSrc++; + *pDst++ = -*pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined (ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C[0] + jC[1] = A[0]+ j(-1)A[1] */ + + /* Calculate Complex Conjugate and store result in destination buffer. */ + *pDst++ = *pSrc++; + *pDst++ = -*pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of cmplx_conj group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c new file mode 100644 index 0000000..073a337 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c @@ -0,0 +1,157 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_conj_q15.c + * Description: Q15 complex conjugate + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup cmplx_conj + @{ + */ + +/** + @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 samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + The Q15 value -1 (0x8000) is saturated to the maximum allowable positive value 0x7FFF. + */ + +void arm_cmplx_conj_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t in1; /* Temporary input variable */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t in2, in3, in4; /* Temporary input variables */ +#endif + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0] + jC[1] = A[0]+ j(-1)A[1] */ + + /* Calculate Complex Conjugate and store result in destination buffer. */ + + #if defined (ARM_MATH_DSP) + in1 = read_q15x2_ia ((q15_t **) &pSrc); + in2 = read_q15x2_ia ((q15_t **) &pSrc); + in3 = read_q15x2_ia ((q15_t **) &pSrc); + in4 = read_q15x2_ia ((q15_t **) &pSrc); + +#ifndef ARM_MATH_BIG_ENDIAN + in1 = __QASX(0, in1); + in2 = __QASX(0, in2); + in3 = __QASX(0, in3); + in4 = __QASX(0, in4); +#else + in1 = __QSAX(0, in1); + in2 = __QSAX(0, in2); + in3 = __QSAX(0, in3); + in4 = __QSAX(0, in4); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + in1 = ((uint32_t) in1 >> 16) | ((uint32_t) in1 << 16); + in2 = ((uint32_t) in2 >> 16) | ((uint32_t) in2 << 16); + in3 = ((uint32_t) in3 >> 16) | ((uint32_t) in3 << 16); + in4 = ((uint32_t) in4 >> 16) | ((uint32_t) in4 << 16); + + write_q15x2_ia (&pDst, in1); + write_q15x2_ia (&pDst, in2); + write_q15x2_ia (&pDst, in3); + write_q15x2_ia (&pDst, in4); +#else + *pDst++ = *pSrc++; + in1 = *pSrc++; + *pDst++ = (in1 == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in1; + + *pDst++ = *pSrc++; + in1 = *pSrc++; + *pDst++ = (in1 == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in1; + + *pDst++ = *pSrc++; + in1 = *pSrc++; + *pDst++ = (in1 == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in1; + + *pDst++ = *pSrc++; + in1 = *pSrc++; + *pDst++ = (in1 == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in1; + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[0] + jC[1] = A[0]+ j(-1)A[1] */ + + /* Calculate Complex Conjugate and store result in destination buffer. */ + *pDst++ = *pSrc++; + in1 = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __SSAT(-in1, 16); +#else + *pDst++ = (in1 == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in1; +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of cmplx_conj group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c new file mode 100644 index 0000000..6ef1ddb --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c @@ -0,0 +1,137 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_conj_q31.c + * Description: Q31 complex conjugate + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup cmplx_conj + @{ + */ + +/** + @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 samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + The Q31 value -1 (0x80000000) is saturated to the maximum allowable positive value 0x7FFFFFFF. + */ + +void arm_cmplx_conj_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t in; /* Temporary input variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0] + jC[1] = A[0]+ j(-1)A[1] */ + + /* Calculate Complex Conjugate and store result in destination buffer. */ + *pDst++ = *pSrc++; + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + *pDst++ = *pSrc++; + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + *pDst++ = *pSrc++; + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + *pDst++ = *pSrc++; + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[0] + jC[1] = A[0]+ j(-1)A[1] */ + + /* Calculate Complex Conjugate and store result in destination buffer. */ + *pDst++ = *pSrc++; + in = *pSrc++; +#if defined (ARM_MATH_DSP) + *pDst++ = __QSUB(0, in); +#else + *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of cmplx_conj group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c new file mode 100644 index 0000000..06f1bfa --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c @@ -0,0 +1,233 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_dot_prod_f32.c + * Description: Floating-point complex dot product + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @defgroup cmplx_dot_prod Complex Dot Product + + Computes the dot product of two complex vectors. + The vectors are multiplied element-by-element and then summed. + + The pSrcA points to the first complex input vector and + pSrcB points to the second complex input vector. + numSamples specifies the number of complex samples + and the data in each array is stored in an interleaved fashion + (real, imag, real, imag, ...). + Each array has a total of 2*numSamples values. + + The underlying algorithm is used: + +
+  realResult = 0;
+  imagResult = 0;
+  for (n = 0; n < numSamples; n++) {
+      realResult += pSrcA[(2*n)+0] * pSrcB[(2*n)+0] - pSrcA[(2*n)+1] * pSrcB[(2*n)+1];
+      imagResult += pSrcA[(2*n)+0] * pSrcB[(2*n)+1] + pSrcA[(2*n)+1] * pSrcB[(2*n)+0];
+  }
+  
+ + There are separate functions for floating-point, Q15, and Q31 data types. + */ + +/** + @addtogroup cmplx_dot_prod + @{ + */ + +/** + @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 samples in each vector + @param[out] realResult real part of the result returned here + @param[out] imagResult imaginary part of the result returned here + @return none + */ + +void arm_cmplx_dot_prod_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + uint32_t numSamples, + float32_t * realResult, + float32_t * imagResult) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t real_sum = 0.0f, imag_sum = 0.0f; /* Temporary result variables */ + float32_t a0,b0,c0,d0; + +#if defined(ARM_MATH_NEON) + float32x4x2_t vec1,vec2,vec3,vec4; + float32x4_t accR,accI; + float32x2_t accum = vdup_n_f32(0); + + accR = vdupq_n_f32(0.0); + accI = vdupq_n_f32(0.0); + + /* Loop unrolling: Compute 8 outputs at a time */ + blkCnt = numSamples >> 3U; + + while (blkCnt > 0U) + { + /* C = (A[0]+jA[1])*(B[0]+jB[1]) + ... */ + /* Calculate dot product and then store the result in a temporary buffer. */ + + vec1 = vld2q_f32(pSrcA); + vec2 = vld2q_f32(pSrcB); + + /* Increment pointers */ + pSrcA += 8; + pSrcB += 8; + + /* Re{C} = Re{A}*Re{B} - Im{A}*Im{B} */ + accR = vmlaq_f32(accR,vec1.val[0],vec2.val[0]); + accR = vmlsq_f32(accR,vec1.val[1],vec2.val[1]); + + /* Im{C} = Re{A}*Im{B} + Im{A}*Re{B} */ + accI = vmlaq_f32(accI,vec1.val[1],vec2.val[0]); + accI = vmlaq_f32(accI,vec1.val[0],vec2.val[1]); + + vec3 = vld2q_f32(pSrcA); + vec4 = vld2q_f32(pSrcB); + + /* Increment pointers */ + pSrcA += 8; + pSrcB += 8; + + /* Re{C} = Re{A}*Re{B} - Im{A}*Im{B} */ + accR = vmlaq_f32(accR,vec3.val[0],vec4.val[0]); + accR = vmlsq_f32(accR,vec3.val[1],vec4.val[1]); + + /* Im{C} = Re{A}*Im{B} + Im{A}*Re{B} */ + accI = vmlaq_f32(accI,vec3.val[1],vec4.val[0]); + accI = vmlaq_f32(accI,vec3.val[0],vec4.val[1]); + + /* Decrement the loop counter */ + blkCnt--; + } + + accum = vpadd_f32(vget_low_f32(accR), vget_high_f32(accR)); + real_sum += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(accI), vget_high_f32(accI)); + imag_sum += accum[0] + accum[1]; + + /* Tail */ + blkCnt = numSamples & 0x7; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += a0 * c0; + imag_sum += a0 * d0; + real_sum -= b0 * d0; + imag_sum += b0 * c0; + + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += a0 * c0; + imag_sum += a0 * d0; + real_sum -= b0 * d0; + imag_sum += b0 * c0; + + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += a0 * c0; + imag_sum += a0 * d0; + real_sum -= b0 * d0; + imag_sum += b0 * c0; + + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += a0 * c0; + imag_sum += a0 * d0; + real_sum -= b0 * d0; + imag_sum += b0 * c0; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += a0 * c0; + imag_sum += a0 * d0; + real_sum -= b0 * d0; + imag_sum += b0 * c0; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store real and imaginary result in destination buffer. */ + *realResult = real_sum; + *imagResult = imag_sum; +} + +/** + @} end of cmplx_dot_prod group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c new file mode 100644 index 0000000..2ecd801 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c @@ -0,0 +1,154 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_dot_prod_q15.c + * Description: Processing function for the Q15 Complex Dot product + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup cmplx_dot_prod + @{ + */ + +/** + @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 samples in each vector + @param[out] realResult real part of the result returned here + @param[out] imagResult imaginary part of the result returned her + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. + The intermediate 1.15 by 1.15 multiplications are performed with full precision and yield a 2.30 result. + These are accumulated in a 64-bit accumulator with 34.30 precision. + As a final step, the accumulators are converted to 8.24 format. + The return results realResult and imagResult are in 8.24 format. + */ + +void arm_cmplx_dot_prod_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + uint32_t numSamples, + q31_t * realResult, + q31_t * imagResult) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t real_sum = 0, imag_sum = 0; /* Temporary result variables */ + q15_t a0,b0,c0,d0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += (q31_t)a0 * c0; + imag_sum += (q31_t)a0 * d0; + real_sum -= (q31_t)b0 * d0; + imag_sum += (q31_t)b0 * c0; + + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += (q31_t)a0 * c0; + imag_sum += (q31_t)a0 * d0; + real_sum -= (q31_t)b0 * d0; + imag_sum += (q31_t)b0 * c0; + + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += (q31_t)a0 * c0; + imag_sum += (q31_t)a0 * d0; + real_sum -= (q31_t)b0 * d0; + imag_sum += (q31_t)b0 * c0; + + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += (q31_t)a0 * c0; + imag_sum += (q31_t)a0 * d0; + real_sum -= (q31_t)b0 * d0; + imag_sum += (q31_t)b0 * c0; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += (q31_t)a0 * c0; + imag_sum += (q31_t)a0 * d0; + real_sum -= (q31_t)b0 * d0; + imag_sum += (q31_t)b0 * c0; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store real and imaginary result in 8.24 format */ + /* Convert real data in 34.30 to 8.24 by 6 right shifts */ + *realResult = (q31_t) (real_sum >> 6); + /* Convert imaginary data in 34.30 to 8.24 by 6 right shifts */ + *imagResult = (q31_t) (imag_sum >> 6); +} + +/** + @} end of cmplx_dot_prod group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c new file mode 100644 index 0000000..d715d98 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c @@ -0,0 +1,153 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_dot_prod_q31.c + * Description: Q31 complex dot product + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup cmplx_dot_prod + @{ + */ + +/** + @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 samples in each vector + @param[out] realResult real part of the result returned here + @param[out] imagResult imaginary part of the result returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. + The intermediate 1.31 by 1.31 multiplications are performed with 64-bit precision and then shifted to 16.48 format. + The internal real and imaginary accumulators are in 16.48 format and provide 15 guard bits. + Additions are nonsaturating and no overflow will occur as long as numSamples is less than 32768. + The return results realResult and imagResult are in 16.48 format. + Input down scaling is not required. + */ + +void arm_cmplx_dot_prod_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + uint32_t numSamples, + q63_t * realResult, + q63_t * imagResult) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t real_sum = 0, imag_sum = 0; /* Temporary result variables */ + q31_t a0,b0,c0,d0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += ((q63_t)a0 * c0) >> 14; + imag_sum += ((q63_t)a0 * d0) >> 14; + real_sum -= ((q63_t)b0 * d0) >> 14; + imag_sum += ((q63_t)b0 * c0) >> 14; + + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += ((q63_t)a0 * c0) >> 14; + imag_sum += ((q63_t)a0 * d0) >> 14; + real_sum -= ((q63_t)b0 * d0) >> 14; + imag_sum += ((q63_t)b0 * c0) >> 14; + + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += ((q63_t)a0 * c0) >> 14; + imag_sum += ((q63_t)a0 * d0) >> 14; + real_sum -= ((q63_t)b0 * d0) >> 14; + imag_sum += ((q63_t)b0 * c0) >> 14; + + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += ((q63_t)a0 * c0) >> 14; + imag_sum += ((q63_t)a0 * d0) >> 14; + real_sum -= ((q63_t)b0 * d0) >> 14; + imag_sum += ((q63_t)b0 * c0) >> 14; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + a0 = *pSrcA++; + b0 = *pSrcA++; + c0 = *pSrcB++; + d0 = *pSrcB++; + + real_sum += ((q63_t)a0 * c0) >> 14; + imag_sum += ((q63_t)a0 * d0) >> 14; + real_sum -= ((q63_t)b0 * d0) >> 14; + imag_sum += ((q63_t)b0 * c0) >> 14; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store real and imaginary result in 16.48 format */ + *realResult = real_sum; + *imagResult = imag_sum; +} + +/** + @} end of cmplx_dot_prod group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c new file mode 100644 index 0000000..84812dc --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c @@ -0,0 +1,188 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mag_f32.c + * Description: Floating-point complex magnitude + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @defgroup cmplx_mag Complex Magnitude + + Computes the magnitude of the elements of a complex data vector. + + The pSrc points to the source data and + pDst points to the where the result should be written. + numSamples specifies the number of complex samples + in the input array and the data is stored in an interleaved fashion + (real, imag, real, imag, ...). + The input array has a total of 2*numSamples values; + the output array has a total of numSamples values. + + The underlying algorithm is used: + +
+  for (n = 0; n < numSamples; n++) {
+      pDst[n] = sqrt(pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2);
+  }
+  
+ + There are separate functions for floating-point, Q15, and Q31 data types. + */ + +/** + @addtogroup cmplx_mag + @{ + */ + +/** + @brief Floating-point complex magnitude. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + */ + +void arm_cmplx_mag_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* loop counter */ + float32_t real, imag; /* Temporary variables to hold input values */ + +#if defined(ARM_MATH_NEON) + + float32x4x2_t vecA; + float32x4_t vRealA; + float32x4_t vImagA; + float32x4_t vMagSqA; + + float32x4x2_t vecB; + float32x4_t vRealB; + float32x4_t vImagB; + float32x4_t vMagSqB; + + /* Loop unrolling: Compute 8 outputs at a time */ + blkCnt = numSamples >> 3; + + while (blkCnt > 0U) + { + /* out = sqrt((real * real) + (imag * imag)) */ + + vecA = vld2q_f32(pSrc); + pSrc += 8; + + vecB = vld2q_f32(pSrc); + pSrc += 8; + + vRealA = vmulq_f32(vecA.val[0], vecA.val[0]); + vImagA = vmulq_f32(vecA.val[1], vecA.val[1]); + vMagSqA = vaddq_f32(vRealA, vImagA); + + vRealB = vmulq_f32(vecB.val[0], vecB.val[0]); + vImagB = vmulq_f32(vecB.val[1], vecB.val[1]); + vMagSqB = vaddq_f32(vRealB, vImagB); + + /* Store the result in the destination buffer. */ + vst1q_f32(pDst, __arm_vec_sqrt_f32_neon(vMagSqA)); + pDst += 4; + + vst1q_f32(pDst, __arm_vec_sqrt_f32_neon(vMagSqB)); + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + blkCnt = numSamples & 7; + +#else + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */ + + real = *pSrc++; + imag = *pSrc++; + + /* store result in destination buffer. */ + arm_sqrt_f32((real * real) + (imag * imag), pDst++); + + real = *pSrc++; + imag = *pSrc++; + arm_sqrt_f32((real * real) + (imag * imag), pDst++); + + real = *pSrc++; + imag = *pSrc++; + arm_sqrt_f32((real * real) + (imag * imag), pDst++); + + real = *pSrc++; + imag = *pSrc++; + arm_sqrt_f32((real * real) + (imag * imag), pDst++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */ + + real = *pSrc++; + imag = *pSrc++; + + /* store result in destination buffer. */ + arm_sqrt_f32((real * real) + (imag * imag), pDst++); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of cmplx_mag group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c new file mode 100644 index 0000000..a493274 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c @@ -0,0 +1,162 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mag_q15.c + * Description: Q15 complex magnitude + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup cmplx_mag + @{ + */ + +/** + @brief Q15 complex magnitude. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function implements 1.15 by 1.15 multiplications and finally output is converted into 2.14 format. + */ + +void arm_cmplx_mag_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_DSP) + q31_t in; + q31_t acc0; /* Accumulators */ +#else + q15_t real, imag; /* Temporary input variables */ + q31_t acc0, acc1; /* Accumulators */ +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */ + +#if defined (ARM_MATH_DSP) + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + /* store result in 2.14 format in destination buffer. */ + arm_sqrt_q15((q15_t) (acc0 >> 17), pDst++); + + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + arm_sqrt_q15((q15_t) (acc0 >> 17), pDst++); + + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + arm_sqrt_q15((q15_t) (acc0 >> 17), pDst++); + + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + arm_sqrt_q15((q15_t) (acc0 >> 17), pDst++); +#else + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + + /* store result in 2.14 format in destination buffer. */ + arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++); + + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++); + + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++); + + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++); +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */ + +#if defined (ARM_MATH_DSP) + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + + /* store result in 2.14 format in destination buffer. */ + arm_sqrt_q15((q15_t) (acc0 >> 17), pDst++); +#else + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + + /* store result in 2.14 format in destination buffer. */ + arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of cmplx_mag group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c new file mode 100644 index 0000000..873e566 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c @@ -0,0 +1,130 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mag_q31.c + * Description: Q31 complex magnitude + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup cmplx_mag + @{ + */ + +/** + @brief Q31 complex magnitude. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function implements 1.31 by 1.31 multiplications and finally output is converted into 2.30 format. + Input down scaling is not required. + */ + +void arm_cmplx_mag_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t real, imag; /* Temporary input variables */ + q31_t acc0, acc1; /* Accumulators */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */ + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + + /* store result in 2.30 format in destination buffer. */ + arm_sqrt_q31(acc0 + acc1, pDst++); + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + arm_sqrt_q31(acc0 + acc1, pDst++); + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + arm_sqrt_q31(acc0 + acc1, pDst++); + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + arm_sqrt_q31(acc0 + acc1, pDst++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */ + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + + /* store result in 2.30 format in destination buffer. */ + arm_sqrt_q31(acc0 + acc1, pDst++); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of cmplx_mag group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c new file mode 100644 index 0000000..99f051c --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c @@ -0,0 +1,184 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mag_squared_f32.c + * Description: Floating-point complex magnitude squared + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @defgroup cmplx_mag_squared Complex Magnitude Squared + + Computes the magnitude squared of the elements of a complex data vector. + + The pSrc points to the source data and + pDst points to the where the result should be written. + numSamples specifies the number of complex samples + in the input array and the data is stored in an interleaved fashion + (real, imag, real, imag, ...). + The input array has a total of 2*numSamples values; + the output array has a total of numSamples values. + + The underlying algorithm is used: + +
+  for (n = 0; n < numSamples; n++) {
+      pDst[n] = pSrc[(2*n)+0]^2 + pSrc[(2*n)+1]^2;
+  }
+  
+ + There are separate functions for floating-point, Q15, and Q31 data types. + */ + +/** + @addtogroup cmplx_mag_squared + @{ + */ + +/** + @brief Floating-point complex magnitude squared. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + */ + +void arm_cmplx_mag_squared_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t real, imag; /* Temporary input variables */ + +#if defined(ARM_MATH_NEON) + float32x4x2_t vecA; + float32x4_t vRealA; + float32x4_t vImagA; + float32x4_t vMagSqA; + + float32x4x2_t vecB; + float32x4_t vRealB; + float32x4_t vImagB; + float32x4_t vMagSqB; + + /* Loop unrolling: Compute 8 outputs at a time */ + blkCnt = numSamples >> 3; + + while (blkCnt > 0U) + { + /* out = sqrt((real * real) + (imag * imag)) */ + + vecA = vld2q_f32(pSrc); + pSrc += 8; + + vRealA = vmulq_f32(vecA.val[0], vecA.val[0]); + vImagA = vmulq_f32(vecA.val[1], vecA.val[1]); + vMagSqA = vaddq_f32(vRealA, vImagA); + + vecB = vld2q_f32(pSrc); + pSrc += 8; + + vRealB = vmulq_f32(vecB.val[0], vecB.val[0]); + vImagB = vmulq_f32(vecB.val[1], vecB.val[1]); + vMagSqB = vaddq_f32(vRealB, vImagB); + + /* Store the result in the destination buffer. */ + vst1q_f32(pDst, vMagSqA); + pDst += 4; + + vst1q_f32(pDst, vMagSqB); + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + blkCnt = numSamples & 7; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0] = (A[0] * A[0] + A[1] * A[1]) */ + + real = *pSrc++; + imag = *pSrc++; + *pDst++ = (real * real) + (imag * imag); + + real = *pSrc++; + imag = *pSrc++; + *pDst++ = (real * real) + (imag * imag); + + real = *pSrc++; + imag = *pSrc++; + *pDst++ = (real * real) + (imag * imag); + + real = *pSrc++; + imag = *pSrc++; + *pDst++ = (real * real) + (imag * imag); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C[0] = (A[0] * A[0] + A[1] * A[1]) */ + + real = *pSrc++; + imag = *pSrc++; + + /* store result in destination buffer. */ + *pDst++ = (real * real) + (imag * imag); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of cmplx_mag_squared group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c new file mode 100644 index 0000000..fa5f4e6 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c @@ -0,0 +1,161 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mag_squared_q15.c + * Description: Q15 complex magnitude squared + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup cmplx_mag_squared + @{ + */ + +/** + @brief Q15 complex magnitude squared. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function implements 1.15 by 1.15 multiplications and finally output is converted into 3.13 format. + */ + +void arm_cmplx_mag_squared_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_DSP) + q31_t in; + q31_t acc0; /* Accumulators */ +#else + q15_t real, imag; /* Temporary input variables */ + q31_t acc0, acc1; /* Accumulators */ +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0] = (A[0] * A[0] + A[1] * A[1]) */ + +#if defined (ARM_MATH_DSP) + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + /* store result in 3.13 format in destination buffer. */ + *pDst++ = (q15_t) (acc0 >> 17); + + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + *pDst++ = (q15_t) (acc0 >> 17); + + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + *pDst++ = (q15_t) (acc0 >> 17); + + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + *pDst++ = (q15_t) (acc0 >> 17); +#else + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + /* store result in 3.13 format in destination buffer. */ + *pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17); + + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + *pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17); + + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + *pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17); + + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + *pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17); +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[0] = (A[0] * A[0] + A[1] * A[1]) */ + +#if defined (ARM_MATH_DSP) + in = read_q15x2_ia ((q15_t **) &pSrc); + acc0 = __SMUAD(in, in); + + /* store result in 3.13 format in destination buffer. */ + *pDst++ = (q15_t) (acc0 >> 17); +#else + real = *pSrc++; + imag = *pSrc++; + acc0 = ((q31_t) real * real); + acc1 = ((q31_t) imag * imag); + + /* store result in 3.13 format in destination buffer. */ + *pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of cmplx_mag_squared group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c new file mode 100644 index 0000000..54863ef --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c @@ -0,0 +1,129 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mag_squared_q31.c + * Description: Q31 complex magnitude squared + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup cmplx_mag_squared + @{ + */ + +/** + @brief Q31 complex magnitude squared. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function implements 1.31 by 1.31 multiplications and finally output is converted into 3.29 format. + Input down scaling is not required. + */ + +void arm_cmplx_mag_squared_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t real, imag; /* Temporary input variables */ + q31_t acc0, acc1; /* Accumulators */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[0] = (A[0] * A[0] + A[1] * A[1]) */ + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + /* store the result in 3.29 format in the destination buffer. */ + *pDst++ = acc0 + acc1; + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + *pDst++ = acc0 + acc1; + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + *pDst++ = acc0 + acc1; + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + *pDst++ = acc0 + acc1; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[0] = (A[0] * A[0] + A[1] * A[1]) */ + + real = *pSrc++; + imag = *pSrc++; + acc0 = (q31_t) (((q63_t) real * real) >> 33); + acc1 = (q31_t) (((q63_t) imag * imag) >> 33); + + /* store result in 3.29 format in destination buffer. */ + *pDst++ = acc0 + acc1; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of cmplx_mag_squared group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c new file mode 100644 index 0000000..8d14821 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c @@ -0,0 +1,194 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mult_cmplx_f32.c + * Description: Floating-point complex-by-complex multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @defgroup CmplxByCmplxMult Complex-by-Complex Multiplication + + Multiplies a complex vector by another complex vector and generates a complex result. + The data in the complex arrays is stored in an interleaved fashion + (real, imag, real, imag, ...). + The parameter numSamples represents the number of complex + samples processed. The complex arrays have a total of 2*numSamples + real values. + + The underlying algorithm is used: + +
+  for (n = 0; n < numSamples; n++) {
+      pDst[(2*n)+0] = pSrcA[(2*n)+0] * pSrcB[(2*n)+0] - pSrcA[(2*n)+1] * pSrcB[(2*n)+1];
+      pDst[(2*n)+1] = pSrcA[(2*n)+0] * pSrcB[(2*n)+1] + pSrcA[(2*n)+1] * pSrcB[(2*n)+0];
+  }
+  
+ + There are separate functions for floating-point, Q15, and Q31 data types. + */ + +/** + @addtogroup CmplxByCmplxMult + @{ + */ + +/** + @brief Floating-point complex-by-complex multiplication. + @param[in] pSrcA points to first input vector + @param[in] pSrcB points to second input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + */ + +void arm_cmplx_mult_cmplx_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t a, b, c, d; /* Temporary variables to store real and imaginary values */ + +#if defined(ARM_MATH_NEON) + float32x4x2_t va, vb; + float32x4_t real, imag; + float32x4x2_t outCplx; + + /* Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + va = vld2q_f32(pSrcA); // load & separate real/imag pSrcA (de-interleave 2) + vb = vld2q_f32(pSrcB); // load & separate real/imag pSrcB + + /* Increment pointers */ + pSrcA += 8; + pSrcB += 8; + + /* Re{C} = Re{A}*Re{B} - Im{A}*Im{B} */ + outCplx.val[0] = vmulq_f32(va.val[0], vb.val[0]); + outCplx.val[0] = vmlsq_f32(outCplx.val[0], va.val[1], vb.val[1]); + + /* Im{C} = Re{A}*Im{B} + Im{A}*Re{B} */ + outCplx.val[1] = vmulq_f32(va.val[0], vb.val[1]); + outCplx.val[1] = vmlaq_f32(outCplx.val[1], va.val[1], vb.val[0]); + + vst2q_f32(pDst, outCplx); + + /* Increment pointer */ + pDst += 8; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Tail */ + blkCnt = numSamples & 3; + +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i] * B[2 * i ] - A[2 * i + 1] * B[2 * i + 1]. */ + /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i ]. */ + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + /* store result in destination buffer. */ + *pDst++ = (a * c) - (b * d); + *pDst++ = (a * d) + (b * c); + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + *pDst++ = (a * c) - (b * d); + *pDst++ = (a * d) + (b * c); + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + *pDst++ = (a * c) - (b * d); + *pDst++ = (a * d) + (b * c); + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + *pDst++ = (a * c) - (b * d); + *pDst++ = (a * d) + (b * c); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i] * B[2 * i ] - A[2 * i + 1] * B[2 * i + 1]. */ + /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i ]. */ + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + + /* store result in destination buffer. */ + *pDst++ = (a * c) - (b * d); + *pDst++ = (a * d) + (b * c); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of CmplxByCmplxMult group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c new file mode 100644 index 0000000..6659427 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c @@ -0,0 +1,136 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mult_cmplx_q15.c + * Description: Q15 complex-by-complex multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup CmplxByCmplxMult + @{ + */ + +/** + @brief Q15 complex-by-complex multiplication. + @param[in] pSrcA points to first input vector + @param[in] pSrcB points to second input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function implements 1.15 by 1.15 multiplications and finally output is converted into 3.13 format. + */ + +void arm_cmplx_mult_cmplx_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + q15_t a, b, c, d; /* Temporary variables */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i] * B[2 * i ] - A[2 * i + 1] * B[2 * i + 1]. */ + /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i ]. */ + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + /* store result in 3.13 format in destination buffer. */ + *pDst++ = (q15_t) ( (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17) ); + *pDst++ = (q15_t) ( (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17) ); + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + *pDst++ = (q15_t) ( (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17) ); + *pDst++ = (q15_t) ( (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17) ); + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + *pDst++ = (q15_t) ( (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17) ); + *pDst++ = (q15_t) ( (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17) ); + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + *pDst++ = (q15_t) ( (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17) ); + *pDst++ = (q15_t) ( (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17) ); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i] * B[2 * i ] - A[2 * i + 1] * B[2 * i + 1]. */ + /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i ]. */ + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + + /* store result in 3.13 format in destination buffer. */ + *pDst++ = (q15_t) ( (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17) ); + *pDst++ = (q15_t) ( (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17) ); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of CmplxByCmplxMult group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c new file mode 100644 index 0000000..f6d6dc6 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c @@ -0,0 +1,137 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mult_cmplx_q31.c + * Description: Q31 complex-by-complex multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup CmplxByCmplxMult + @{ + */ + +/** + @brief Q31 complex-by-complex multiplication. + @param[in] pSrcA points to first input vector + @param[in] pSrcB points to second input vector + @param[out] pDst points to output vector + @param[in] numSamples number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function implements 1.31 by 1.31 multiplications and finally output is converted into 3.29 format. + Input down scaling is not required. + */ + +void arm_cmplx_mult_cmplx_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t a, b, c, d; /* Temporary variables */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i] * B[2 * i ] - A[2 * i + 1] * B[2 * i + 1]. */ + /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i ]. */ + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + /* store result in 3.29 format in destination buffer. */ + *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); + *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); + *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); + *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); + *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i] * B[2 * i ] - A[2 * i + 1] * B[2 * i + 1]. */ + /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i ]. */ + + a = *pSrcA++; + b = *pSrcA++; + c = *pSrcB++; + d = *pSrcB++; + + /* store result in 3.29 format in destination buffer. */ + *pDst++ = (q31_t) ( (((q63_t) a * c) >> 33) - (((q63_t) b * d) >> 33) ); + *pDst++ = (q31_t) ( (((q63_t) a * d) >> 33) + (((q63_t) b * c) >> 33) ); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of CmplxByCmplxMult group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c new file mode 100644 index 0000000..9651999 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c @@ -0,0 +1,169 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mult_real_f32.c + * Description: Floating-point complex by real multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @defgroup CmplxByRealMult Complex-by-Real Multiplication + + Multiplies a complex vector by a real vector and generates a complex result. + The data in the complex arrays is stored in an interleaved fashion + (real, imag, real, imag, ...). + The parameter numSamples represents the number of complex + samples processed. The complex arrays have a total of 2*numSamples + real values while the real array has a total of numSamples + real values. + + The underlying algorithm is used: + +
+  for (n = 0; n < numSamples; n++) {
+      pCmplxDst[(2*n)+0] = pSrcCmplx[(2*n)+0] * pSrcReal[n];
+      pCmplxDst[(2*n)+1] = pSrcCmplx[(2*n)+1] * pSrcReal[n];
+  }
+  
+ + There are separate functions for floating-point, Q15, and Q31 data types. + */ + +/** + @addtogroup CmplxByRealMult + @{ + */ + +/** + @brief Floating-point complex-by-real multiplication. + @param[in] pSrcCmplx points to complex input vector + @param[in] pSrcReal points to real input vector + @param[out] pCmplxDst points to complex output vector + @param[in] numSamples number of samples in each vector + @return none + */ + +void arm_cmplx_mult_real_f32( + const float32_t * pSrcCmplx, + const float32_t * pSrcReal, + float32_t * pCmplxDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t in; /* Temporary variable */ + +#if defined(ARM_MATH_NEON) + float32x4_t r; + float32x4x2_t ab,outCplx; + + /* Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + ab = vld2q_f32(pSrcCmplx); // load & separate real/imag pSrcA (de-interleave 2) + r = vld1q_f32(pSrcReal); // load & separate real/imag pSrcB + + /* Increment pointers */ + pSrcCmplx += 8; + pSrcReal += 4; + + outCplx.val[0] = vmulq_f32(ab.val[0], r); + outCplx.val[1] = vmulq_f32(ab.val[1], r); + + vst2q_f32(pCmplxDst, outCplx); + pCmplxDst += 8; + + blkCnt--; + } + + /* Tail */ + blkCnt = numSamples & 3; +#else +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i ] * B[i]. */ + /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */ + + in = *pSrcReal++; + /* store result in destination buffer. */ + *pCmplxDst++ = *pSrcCmplx++ * in; + *pCmplxDst++ = *pSrcCmplx++ * in; + + in = *pSrcReal++; + *pCmplxDst++ = *pSrcCmplx++ * in; + *pCmplxDst++ = *pSrcCmplx++ * in; + + in = *pSrcReal++; + *pCmplxDst++ = *pSrcCmplx++ * in; + *pCmplxDst++ = *pSrcCmplx++ * in; + + in = *pSrcReal++; + *pCmplxDst++ = *pSrcCmplx++* in; + *pCmplxDst++ = *pSrcCmplx++ * in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i ] * B[i]. */ + /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */ + + in = *pSrcReal++; + /* store result in destination buffer. */ + *pCmplxDst++ = *pSrcCmplx++ * in; + *pCmplxDst++ = *pSrcCmplx++ * in; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of CmplxByRealMult group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c new file mode 100644 index 0000000..4877d20 --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c @@ -0,0 +1,182 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mult_real_q15.c + * Description: Q15 complex by real multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup CmplxByRealMult + @{ + */ + +/** + @brief Q15 complex-by-real multiplication. + @param[in] pSrcCmplx points to complex input vector + @param[in] pSrcReal points to real input vector + @param[out] pCmplxDst points to complex output vector + @param[in] numSamples number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. + */ + +void arm_cmplx_mult_real_q15( + const q15_t * pSrcCmplx, + const q15_t * pSrcReal, + q15_t * pCmplxDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + q15_t in; /* Temporary variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + +#if defined (ARM_MATH_DSP) + q31_t inA1, inA2; /* Temporary variables to hold input data */ + q31_t inB1; /* Temporary variables to hold input data */ + q15_t out1, out2, out3, out4; /* Temporary variables to hold output data */ + q31_t mul1, mul2, mul3, mul4; /* Temporary variables to hold intermediate data */ +#endif + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i ] * B[i]. */ + /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */ + +#if defined (ARM_MATH_DSP) + /* read 2 complex numbers both real and imaginary from complex input buffer */ + inA1 = read_q15x2_ia ((q15_t **) &pSrcCmplx); + inA2 = read_q15x2_ia ((q15_t **) &pSrcCmplx); + /* read 2 real values at a time from real input buffer */ + inB1 = read_q15x2_ia ((q15_t **) &pSrcReal); + + /* multiply complex number with real numbers */ +#ifndef ARM_MATH_BIG_ENDIAN + mul1 = (q31_t) ((q15_t) (inA1) * (q15_t) (inB1)); + mul2 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1)); + mul3 = (q31_t) ((q15_t) (inA2) * (q15_t) (inB1 >> 16)); + mul4 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) (inB1 >> 16)); +#else + mul2 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1 >> 16)); + mul1 = (q31_t) ((q15_t) inA1 * (q15_t) (inB1 >> 16)); + mul4 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) inB1); + mul3 = (q31_t) ((q15_t) inA2 * (q15_t) inB1); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* saturate the result */ + out1 = (q15_t) __SSAT(mul1 >> 15U, 16); + out2 = (q15_t) __SSAT(mul2 >> 15U, 16); + out3 = (q15_t) __SSAT(mul3 >> 15U, 16); + out4 = (q15_t) __SSAT(mul4 >> 15U, 16); + + /* pack real and imaginary outputs and store them to destination */ + write_q15x2_ia (&pCmplxDst, __PKHBT(out1, out2, 16)); + write_q15x2_ia (&pCmplxDst, __PKHBT(out3, out4, 16)); + + inA1 = read_q15x2_ia ((q15_t **) &pSrcCmplx); + inA2 = read_q15x2_ia ((q15_t **) &pSrcCmplx); + inB1 = read_q15x2_ia ((q15_t **) &pSrcReal); + +#ifndef ARM_MATH_BIG_ENDIAN + mul1 = (q31_t) ((q15_t) (inA1) * (q15_t) (inB1)); + mul2 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1)); + mul3 = (q31_t) ((q15_t) (inA2) * (q15_t) (inB1 >> 16)); + mul4 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) (inB1 >> 16)); +#else + mul2 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1 >> 16)); + mul1 = (q31_t) ((q15_t) inA1 * (q15_t) (inB1 >> 16)); + mul4 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) inB1); + mul3 = (q31_t) ((q15_t) inA2 * (q15_t) inB1); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + out1 = (q15_t) __SSAT(mul1 >> 15U, 16); + out2 = (q15_t) __SSAT(mul2 >> 15U, 16); + out3 = (q15_t) __SSAT(mul3 >> 15U, 16); + out4 = (q15_t) __SSAT(mul4 >> 15U, 16); + + write_q15x2_ia (&pCmplxDst, __PKHBT(out1, out2, 16)); + write_q15x2_ia (&pCmplxDst, __PKHBT(out3, out4, 16)); +#else + in = *pSrcReal++; + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); + + in = *pSrcReal++; + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); + + in = *pSrcReal++; + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); + + in = *pSrcReal++; + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i ] * B[i]. */ + /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */ + + in = *pSrcReal++; + /* store the result in the destination buffer. */ + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); + *pCmplxDst++ = (q15_t) __SSAT((((q31_t) *pSrcCmplx++ * in) >> 15), 16); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of CmplxByRealMult group + */ diff --git a/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c new file mode 100644 index 0000000..906410f --- /dev/null +++ b/CMSIS/DSP/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mult_real_q31.c + * Description: Q31 complex by real multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupCmplxMath + */ + +/** + @addtogroup CmplxByRealMult + @{ + */ + +/** + @brief Q31 complex-by-real multiplication. + @param[in] pSrcCmplx points to complex input vector + @param[in] pSrcReal points to real input vector + @param[out] pCmplxDst points to complex output vector + @param[in] numSamples number of samples in each vector + @return none + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] are saturated. + */ + +void arm_cmplx_mult_real_q31( + const q31_t * pSrcCmplx, + const q31_t * pSrcReal, + q31_t * pCmplxDst, + uint32_t numSamples) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t in; /* Temporary variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i ] * B[i]. */ + /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */ + + in = *pSrcReal++; +#if defined (ARM_MATH_DSP) + /* store saturated result in 1.31 format to destination buffer */ + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); +#else + /* store result in destination buffer. */ + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); +#endif + + in = *pSrcReal++; +#if defined (ARM_MATH_DSP) + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); +#else + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); +#endif + + in = *pSrcReal++; +#if defined (ARM_MATH_DSP) + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); +#else + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); +#endif + + in = *pSrcReal++; +#if defined (ARM_MATH_DSP) + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); +#else + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C[2 * i ] = A[2 * i ] * B[i]. */ + /* C[2 * i + 1] = A[2 * i + 1] * B[i]. */ + + in = *pSrcReal++; +#if defined (ARM_MATH_DSP) + /* store saturated result in 1.31 format to destination buffer */ + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); + *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); +#else + /* store result in destination buffer. */ + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); + *pCmplxDst++ = (q31_t) clip_q63_to_q31(((q63_t) *pSrcCmplx++ * in) >> 31); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of CmplxByRealMult group + */ diff --git a/CMSIS/DSP/Source/ControllerFunctions/CMakeLists.txt b/CMSIS/DSP/Source/ControllerFunctions/CMakeLists.txt new file mode 100644 index 0000000..705f5b8 --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPController) + +add_library(CMSISDSPController STATIC) + +configdsp(CMSISDSPController ..) + +include(interpol) +interpol(CMSISDSPController) + +if (CONFIGTABLE AND ALLFAST) + target_compile_definitions(CMSISDSPController PUBLIC ARM_ALL_FAST_TABLES) +endif() + +target_sources(CMSISDSPController PRIVATE arm_pid_init_f32.c) +target_sources(CMSISDSPController PRIVATE arm_pid_init_q15.c) +target_sources(CMSISDSPController PRIVATE arm_pid_init_q31.c) +target_sources(CMSISDSPController PRIVATE arm_pid_reset_f32.c) +target_sources(CMSISDSPController PRIVATE arm_pid_reset_q15.c) +target_sources(CMSISDSPController PRIVATE arm_pid_reset_q31.c) + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_SIN_COS_F32) +target_sources(CMSISDSPController PRIVATE arm_sin_cos_f32.c) +endif() + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_SIN_COS_Q31) +target_sources(CMSISDSPController PRIVATE arm_sin_cos_q31.c) +endif() + + + +### Includes +target_include_directories(CMSISDSPController PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/ControllerFunctions/ControllerFunctions.c b/CMSIS/DSP/Source/ControllerFunctions/ControllerFunctions.c new file mode 100644 index 0000000..51720bc --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/ControllerFunctions.c @@ -0,0 +1,37 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: ControllerFunctions.c + * Description: Combination of all controller function source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_pid_init_f32.c" +#include "arm_pid_init_q15.c" +#include "arm_pid_init_q31.c" +#include "arm_pid_reset_f32.c" +#include "arm_pid_reset_q15.c" +#include "arm_pid_reset_q31.c" +#include "arm_sin_cos_f32.c" +#include "arm_sin_cos_q31.c" + diff --git a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_f32.c b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_f32.c new file mode 100644 index 0000000..433a65a --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_f32.c @@ -0,0 +1,75 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_pid_init_f32.c + * Description: Floating-point PID Control initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @addtogroup PID + @{ + */ + +/** + @brief Initialization function for the floating-point PID Control. + @param[in,out] S points to an instance of the PID structure + @param[in] resetStateFlag + - value = 0: no change in state + - value = 1: reset state + @return none + + @par Details + The resetStateFlag specifies whether to set state to zero or not. \n + The function computes the structure fields: A0, A1 A2 + using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd) + also sets the state variables to all zeros. + */ + +void arm_pid_init_f32( + arm_pid_instance_f32 * S, + int32_t resetStateFlag) +{ + /* Derived coefficient A0 */ + S->A0 = S->Kp + S->Ki + S->Kd; + + /* Derived coefficient A1 */ + S->A1 = (-S->Kp) - ((float32_t) 2.0 * S->Kd); + + /* Derived coefficient A2 */ + S->A2 = S->Kd; + + /* Check whether state needs reset or not */ + if (resetStateFlag) + { + /* Reset state to zero, The size will be always 3 samples */ + memset(S->state, 0, 3U * sizeof(float32_t)); + } + +} + +/** + @} end of PID group + */ diff --git a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q15.c b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q15.c new file mode 100644 index 0000000..c88a3d9 --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q15.c @@ -0,0 +1,95 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_pid_init_q15.c + * Description: Q15 PID Control initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @addtogroup PID + @{ + */ + +/** + @brief Initialization function for the Q15 PID Control. + @param[in,out] S points to an instance of the Q15 PID structure + @param[in] resetStateFlag + - value = 0: no change in state + - value = 1: reset state + @return none + + @par Details + The resetStateFlag specifies whether to set state to zero or not. \n + The function computes the structure fields: A0, A1 A2 + using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd) + also sets the state variables to all zeros. + */ + +void arm_pid_init_q15( + arm_pid_instance_q15 * S, + int32_t resetStateFlag) +{ + +#if defined (ARM_MATH_DSP) + + /* Derived coefficient A0 */ + S->A0 = __QADD16(__QADD16(S->Kp, S->Ki), S->Kd); + + /* Derived coefficients and pack into A1 */ + +#ifndef ARM_MATH_BIG_ENDIAN + S->A1 = __PKHBT(-__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), S->Kd, 16); +#else + S->A1 = __PKHBT(S->Kd, -__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), 16); +#endif + +#else + + q31_t temp; /* to store the sum */ + + /* Derived coefficient A0 */ + temp = S->Kp + S->Ki + S->Kd; + S->A0 = (q15_t) __SSAT(temp, 16); + + /* Derived coefficients and pack into A1 */ + temp = -(S->Kd + S->Kd + S->Kp); + S->A1 = (q15_t) __SSAT(temp, 16); + S->A2 = S->Kd; + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Check whether state needs reset or not */ + if (resetStateFlag) + { + /* Reset state to zero, The size will be always 3 samples */ + memset(S->state, 0, 3U * sizeof(q15_t)); + } + +} + +/** + @} end of PID group + */ diff --git a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q31.c b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q31.c new file mode 100644 index 0000000..1625a5f --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_init_q31.c @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_pid_init_q31.c + * Description: Q31 PID Control initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @addtogroup PID + @{ + */ + +/** + @brief Initialization function for the Q31 PID Control. + @param[in,out] S points to an instance of the Q31 PID structure + @param[in] resetStateFlag + - value = 0: no change in state + - value = 1: reset state + @return none + + @par Details + The resetStateFlag specifies whether to set state to zero or not. \n + The function computes the structure fields: A0, A1 A2 + using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd) + also sets the state variables to all zeros. + */ + +void arm_pid_init_q31( + arm_pid_instance_q31 * S, + int32_t resetStateFlag) +{ + +#if defined (ARM_MATH_DSP) + + /* Derived coefficient A0 */ + S->A0 = __QADD(__QADD(S->Kp, S->Ki), S->Kd); + + /* Derived coefficient A1 */ + S->A1 = -__QADD(__QADD(S->Kd, S->Kd), S->Kp); + +#else + + q31_t temp; /* to store the sum */ + + /* Derived coefficient A0 */ + temp = clip_q63_to_q31((q63_t) S->Kp + S->Ki); + S->A0 = clip_q63_to_q31((q63_t) temp + S->Kd); + + /* Derived coefficient A1 */ + temp = clip_q63_to_q31((q63_t) S->Kd + S->Kd); + S->A1 = -clip_q63_to_q31((q63_t) temp + S->Kp); + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Derived coefficient A2 */ + S->A2 = S->Kd; + + /* Check whether state needs reset or not */ + if (resetStateFlag) + { + /* Reset state to zero, The size will be always 3 samples */ + memset(S->state, 0, 3U * sizeof(q31_t)); + } + +} + +/** + @} end of PID group + */ diff --git a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_f32.c b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_f32.c new file mode 100644 index 0000000..d839e55 --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_f32.c @@ -0,0 +1,54 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_pid_reset_f32.c + * Description: Floating-point PID Control reset function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @addtogroup PID + @{ + */ + +/** + @brief Reset function for the floating-point PID Control. + @param[in,out] S points to an instance of the floating-point PID structure + @return none + + @par Details + The function resets the state buffer to zeros. + */ + +void arm_pid_reset_f32( + arm_pid_instance_f32 * S) +{ + /* Reset state to zero, The size will be always 3 samples */ + memset(S->state, 0, 3U * sizeof(float32_t)); +} + +/** + @} end of PID group + */ diff --git a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q15.c b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q15.c new file mode 100644 index 0000000..256fd8c --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q15.c @@ -0,0 +1,54 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_pid_reset_q15.c + * Description: Q15 PID Control reset function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @addtogroup PID + @{ + */ + +/** + @brief Reset function for the Q15 PID Control. + @param[in,out] S points to an instance of the Q15 PID structure + @return none + + @par Details + The function resets the state buffer to zeros. + */ + +void arm_pid_reset_q15( + arm_pid_instance_q15 * S) +{ + /* Reset state to zero, The size will be always 3 samples */ + memset(S->state, 0, 3U * sizeof(q15_t)); +} + +/** + @} end of PID group + */ diff --git a/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q31.c b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q31.c new file mode 100644 index 0000000..2aa391c --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/arm_pid_reset_q31.c @@ -0,0 +1,54 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_pid_reset_q31.c + * Description: Q31 PID Control reset function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @addtogroup PID + @{ + */ + +/** + @brief Reset function for the Q31 PID Control. + @param[in,out] S points to an instance of the Q31 PID structure + @return none + + @par Details + The function resets the state buffer to zeros. + */ + +void arm_pid_reset_q31( + arm_pid_instance_q31 * S) +{ + /* Reset state to zero, The size will be always 3 samples */ + memset(S->state, 0, 3U * sizeof(q31_t)); +} + +/** + @} end of PID group + */ diff --git a/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_f32.c b/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_f32.c new file mode 100644 index 0000000..12a1c83 --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_f32.c @@ -0,0 +1,146 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sin_cos_f32.c + * Description: Sine and Cosine calculation for floating-point values + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupController + */ + +/** + @defgroup SinCos Sine Cosine + + Computes the trigonometric sine and cosine values using a combination of table lookup + and linear interpolation. + There are separate functions for Q31 and floating-point data types. + The input to the floating-point version is in degrees while the + fixed-point Q31 have a scaled input with the range + [-1 0.9999] mapping to [-180 +180] degrees. + + The floating point function also allows values that are out of the usual range. When this happens, the function will + take extra time to adjust the input value to the range of [-180 180]. + + The result is accurate to 5 digits after the decimal point. + + The implementation is based on table lookup using 360 values together with linear interpolation. + The steps used are: + -# Calculation of the nearest integer table index. + -# Compute the fractional portion (fract) of the input. + -# Fetch the value corresponding to \c index from sine table to \c y0 and also value from \c index+1 to \c y1. + -# Sine value is computed as *psinVal = y0 + (fract * (y1 - y0)). + -# Fetch the value corresponding to \c index from cosine table to \c y0 and also value from \c index+1 to \c y1. + -# Cosine value is computed as *pcosVal = y0 + (fract * (y1 - y0)). + */ + +/** + @addtogroup SinCos + @{ + */ + +/** + @brief Floating-point sin_cos function. + @param[in] theta input value in degrees + @param[out] pSinVal points to processed sine output + @param[out] pCosVal points to processed cosine output + @return none + */ + +void arm_sin_cos_f32( + float32_t theta, + float32_t * pSinVal, + float32_t * pCosVal) +{ + float32_t fract, in; /* Temporary input, output variables */ + uint16_t indexS, indexC; /* Index variable */ + float32_t f1, f2, d1, d2; /* Two nearest output values */ + float32_t Dn, Df; + float32_t temp, findex; + + /* input x is in degrees */ + /* Scale input, divide input by 360, for cosine add 0.25 (pi/2) to read sine table */ + in = theta * 0.00277777777778f; + + if (in < 0.0f) + { + in = -in; + } + + in = in - (int32_t)in; + + /* Calculate the nearest index */ + findex = (float32_t)FAST_MATH_TABLE_SIZE * in; + indexS = ((uint16_t)findex) & 0x1ff; + indexC = (indexS + (FAST_MATH_TABLE_SIZE / 4)) & 0x1ff; + + /* Calculation of fractional value */ + fract = findex - (float32_t) indexS; + + /* Read two nearest values of input value from the cos & sin tables */ + f1 = sinTable_f32[indexC ]; + f2 = sinTable_f32[indexC+1]; + d1 = -sinTable_f32[indexS ]; + d2 = -sinTable_f32[indexS+1]; + + temp = (1.0f - fract) * f1 + fract * f2; + + Dn = 0.0122718463030f; /* delta between the two points (fixed), in this case 2*pi/FAST_MATH_TABLE_SIZE */ + Df = f2 - f1; /* delta between the values of the functions */ + + temp = Dn * (d1 + d2) - 2 * Df; + temp = fract * temp + (3 * Df - (d2 + 2 * d1) * Dn); + temp = fract * temp + d1 * Dn; + + /* Calculation of cosine value */ + *pCosVal = fract * temp + f1; + + /* Read two nearest values of input value from the cos & sin tables */ + f1 = sinTable_f32[indexS ]; + f2 = sinTable_f32[indexS+1]; + d1 = sinTable_f32[indexC ]; + d2 = sinTable_f32[indexC+1]; + + temp = (1.0f - fract) * f1 + fract * f2; + + Df = f2 - f1; // delta between the values of the functions + temp = Dn * (d1 + d2) - 2 * Df; + temp = fract * temp + (3 * Df - (d2 + 2 * d1) * Dn); + temp = fract * temp + d1 * Dn; + + /* Calculation of sine value */ + *pSinVal = fract * temp + f1; + + if (theta < 0.0f) + { + *pSinVal = -*pSinVal; + } +} + +/** + @} end of SinCos group + */ diff --git a/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_q31.c b/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_q31.c new file mode 100644 index 0000000..84ee3d2 --- /dev/null +++ b/CMSIS/DSP/Source/ControllerFunctions/arm_sin_cos_q31.c @@ -0,0 +1,110 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sin_cos_q31.c + * Description: Cosine & Sine calculation for Q31 values + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupController + */ + +/** + @addtogroup SinCos + @{ + */ + +/** + @brief Q31 sin_cos function. + @param[in] theta scaled input value in degrees + @param[out] pSinVal points to processed sine output + @param[out] pCosVal points to processed cosine output + @return none + + The Q31 input value is in the range [-1 0.999999] and is mapped to a degree value in the range [-180 179]. + */ + +void arm_sin_cos_q31( + q31_t theta, + q31_t * pSinVal, + q31_t * pCosVal) +{ + q31_t fract; /* Temporary input, output variables */ + uint16_t indexS, indexC; /* Index variable */ + q31_t f1, f2, d1, d2; /* Two nearest output values */ + q31_t Dn, Df; + q63_t temp; + + /* Calculate the nearest index */ + indexS = (uint32_t)theta >> CONTROLLER_Q31_SHIFT; + indexC = (indexS + 128) & 0x1ff; + + /* Calculation of fractional value */ + fract = (theta - (indexS << CONTROLLER_Q31_SHIFT)) << 8; + + /* Read two nearest values of input value from the cos & sin tables */ + f1 = sinTable_q31[indexC ]; + f2 = sinTable_q31[indexC+1]; + d1 = -sinTable_q31[indexS ]; + d2 = -sinTable_q31[indexS+1]; + + Dn = 0x1921FB5; /* delta between the two points (fixed), in this case 2*pi/FAST_MATH_TABLE_SIZE */ + Df = f2 - f1; /* delta between the values of the functions */ + + temp = Dn * ((q63_t)d1 + d2); + temp = temp - ((q63_t)Df << 32); + temp = (q63_t)fract * (temp >> 31); + temp = temp + ((3 * (q63_t)Df << 31) - (d2 + ((q63_t)d1 << 1)) * Dn); + temp = (q63_t)fract * (temp >> 31); + temp = temp + (q63_t)d1 * Dn; + temp = (q63_t)fract * (temp >> 31); + + /* Calculation of cosine value */ + *pCosVal = clip_q63_to_q31((temp >> 31) + (q63_t)f1); + + /* Read two nearest values of input value from the cos & sin tables */ + f1 = sinTable_q31[indexS ]; + f2 = sinTable_q31[indexS+1]; + d1 = sinTable_q31[indexC ]; + d2 = sinTable_q31[indexC+1]; + + Df = f2 - f1; // delta between the values of the functions + temp = Dn * ((q63_t)d1 + d2); + temp = temp - ((q63_t)Df << 32); + temp = (q63_t)fract * (temp >> 31); + temp = temp + ((3 * (q63_t)Df << 31) - (d2 + ((q63_t)d1 << 1)) * Dn); + temp = (q63_t)fract * (temp >> 31); + temp = temp + (q63_t)d1 * Dn; + temp = (q63_t)fract * (temp >> 31); + + /* Calculation of sine value */ + *pSinVal = clip_q63_to_q31((temp >> 31) + (q63_t)f1); +} + +/** + @} end of SinCos group + */ diff --git a/CMSIS/DSP/Source/FastMathFunctions/CMakeLists.txt b/CMSIS/DSP/Source/FastMathFunctions/CMakeLists.txt new file mode 100644 index 0000000..6719b41 --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPFastMath) + + +file(GLOB SRC "./*_*.c") + +add_library(CMSISDSPFastMath STATIC) + +include(interpol) +interpol(CMSISDSPFastMath) + +if (CONFIGTABLE AND ALLFAST) + target_compile_definitions(CMSISDSPFastMath PUBLIC ARM_ALL_FAST_TABLES) +endif() + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_COS_F32) +target_sources(CMSISDSPFastMath PRIVATE arm_cos_f32.c) +endif() + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_COS_Q15) +target_sources(CMSISDSPFastMath PRIVATE arm_cos_q15.c) +endif() + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_COS_Q31) +target_sources(CMSISDSPFastMath PRIVATE arm_cos_q31.c) +endif() + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_SIN_F32) +target_sources(CMSISDSPFastMath PRIVATE arm_sin_f32.c) +endif() + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_SIN_Q15) +target_sources(CMSISDSPFastMath PRIVATE arm_sin_q15.c) +endif() + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_SIN_Q31) +target_sources(CMSISDSPFastMath PRIVATE arm_sin_q31.c) +endif() + +target_sources(CMSISDSPFastMath PRIVATE arm_sqrt_q15.c) +target_sources(CMSISDSPFastMath PRIVATE arm_sqrt_q31.c) + + +configdsp(CMSISDSPFastMath ..) + +### Includes +target_include_directories(CMSISDSPFastMath PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/FastMathFunctions/FastMathFunctions.c b/CMSIS/DSP/Source/FastMathFunctions/FastMathFunctions.c new file mode 100644 index 0000000..abd919e --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/FastMathFunctions.c @@ -0,0 +1,37 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: FastMathFunctions.c + * Description: Combination of all fast math function source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_cos_f32.c" +#include "arm_cos_q15.c" +#include "arm_cos_q31.c" +#include "arm_sin_f32.c" +#include "arm_sin_q15.c" +#include "arm_sin_q31.c" +#include "arm_sqrt_q15.c" +#include "arm_sqrt_q31.c" + diff --git a/CMSIS/DSP/Source/FastMathFunctions/arm_cos_f32.c b/CMSIS/DSP/Source/FastMathFunctions/arm_cos_f32.c new file mode 100644 index 0000000..26bd66e --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/arm_cos_f32.c @@ -0,0 +1,122 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cos_f32.c + * Description: Fast cosine calculation for floating-point values + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupFastMath + */ + +/** + @defgroup cos Cosine + + Computes the trigonometric cosine function using a combination of table lookup + and linear interpolation. There are separate functions for + Q15, Q31, and floating-point data types. + The input to the floating-point version is in radians while the + fixed-point Q15 and Q31 have a scaled input with the range + [0 +0.9999] mapping to [0 2*pi). The fixed-point range is chosen so that a + value of 2*pi wraps around to 0. + + The implementation is based on table lookup using 256 values together with linear interpolation. + The steps used are: + -# Calculation of the nearest integer table index + -# Compute the fractional portion (fract) of the table index. + -# The final result equals (1.0f-fract)*a + fract*b; + + where +
+     b = Table[index];
+     c = Table[index+1];
+  
+ */ + +/** + @addtogroup cos + @{ + */ + +/** + @brief Fast approximation to the trigonometric cosine function for floating-point data. + @param[in] x input value in radians + @return cos(x) + */ + +float32_t arm_cos_f32( + float32_t x) +{ + float32_t cosVal, fract, in; /* Temporary input, output variables */ + uint16_t index; /* Index variable */ + float32_t a, b; /* Two nearest output values */ + int32_t n; + float32_t findex; + + /* input x is in radians */ + /* Scale input to [0 1] range from [0 2*PI] , divide input by 2*pi, add 0.25 (pi/2) to read sine table */ + in = x * 0.159154943092f + 0.25f; + + /* Calculation of floor value of input */ + n = (int32_t) in; + + /* Make negative values towards -infinity */ + if (in < 0.0f) + { + n--; + } + + /* Map input value to [0 1] */ + in = in - (float32_t) n; + + /* Calculation of index of the table */ + findex = (float32_t)FAST_MATH_TABLE_SIZE * in; + index = (uint16_t)findex; + + /* when "in" is exactly 1, we need to rotate the index down to 0 */ + if (index >= FAST_MATH_TABLE_SIZE) { + index = 0; + findex -= (float32_t)FAST_MATH_TABLE_SIZE; + } + + /* fractional value calculation */ + fract = findex - (float32_t) index; + + /* Read two nearest values of input value from the cos table */ + a = sinTable_f32[index]; + b = sinTable_f32[index+1]; + + /* Linear interpolation process */ + cosVal = (1.0f - fract) * a + fract * b; + + /* Return output value */ + return (cosVal); +} + +/** + @} end of cos group + */ diff --git a/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q15.c b/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q15.c new file mode 100644 index 0000000..3bb829c --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q15.c @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cos_q15.c + * Description: Fast cosine calculation for Q15 values + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupFastMath + */ + +/** + @addtogroup cos + @{ + */ + +/** + @brief Fast approximation to the trigonometric cosine function for Q15 data. + @param[in] x Scaled input value in radians + @return cos(x) + + The Q15 input value is in the range [0 +0.9999] and is mapped to a radian value in the range [0 2*PI). + */ + +q15_t arm_cos_q15( + q15_t x) +{ + q15_t cosVal; /* Temporary input, output variables */ + int32_t index; /* Index variable */ + q15_t a, b; /* Two nearest output values */ + q15_t fract; /* Temporary values for fractional values */ + + /* add 0.25 (pi/2) to read sine table */ + x = (uint16_t)x + 0x2000; + if (x < 0) + { /* convert negative numbers to corresponding positive ones */ + x = (uint16_t)x + 0x8000; + } + + /* Calculate the nearest index */ + index = (uint32_t)x >> FAST_MATH_Q15_SHIFT; + + /* Calculation of fractional value */ + fract = (x - (index << FAST_MATH_Q15_SHIFT)) << 9; + + /* Read two nearest values of input value from the sin table */ + a = sinTable_q15[index]; + b = sinTable_q15[index+1]; + + /* Linear interpolation process */ + cosVal = (q31_t) (0x8000 - fract) * a >> 16; + cosVal = (q15_t) ((((q31_t) cosVal << 16) + ((q31_t) fract * b)) >> 16); + + /* Return output value */ + return (cosVal << 1); +} + +/** + @} end of cos group + */ diff --git a/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q31.c b/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q31.c new file mode 100644 index 0000000..8b7ff78 --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/arm_cos_q31.c @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cos_q31.c + * Description: Fast cosine calculation for Q31 values + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupFastMath + */ + +/** + @addtogroup cos + @{ + */ + +/** + @brief Fast approximation to the trigonometric cosine function for Q31 data. + @param[in] x Scaled input value in radians + @return cos(x) + + The Q31 input value is in the range [0 +0.9999] and is mapped to a radian value in the range [0 2*PI). + */ + +q31_t arm_cos_q31( + q31_t x) +{ + q31_t cosVal; /* Temporary input, output variables */ + int32_t index; /* Index variable */ + q31_t a, b; /* Two nearest output values */ + q31_t fract; /* Temporary values for fractional values */ + + /* add 0.25 (pi/2) to read sine table */ + x = (uint32_t)x + 0x20000000; + if (x < 0) + { /* convert negative numbers to corresponding positive ones */ + x = (uint32_t)x + 0x80000000; + } + + /* Calculate the nearest index */ + index = (uint32_t)x >> FAST_MATH_Q31_SHIFT; + + /* Calculation of fractional value */ + fract = (x - (index << FAST_MATH_Q31_SHIFT)) << 9; + + /* Read two nearest values of input value from the sin table */ + a = sinTable_q31[index]; + b = sinTable_q31[index+1]; + + /* Linear interpolation process */ + cosVal = (q63_t) (0x80000000 - fract) * a >> 32; + cosVal = (q31_t) ((((q63_t) cosVal << 32) + ((q63_t) fract * b)) >> 32); + + /* Return output value */ + return (cosVal << 1); +} + +/** + @} end of cos group + */ diff --git a/CMSIS/DSP/Source/FastMathFunctions/arm_sin_f32.c b/CMSIS/DSP/Source/FastMathFunctions/arm_sin_f32.c new file mode 100644 index 0000000..97c6902 --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/arm_sin_f32.c @@ -0,0 +1,122 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sin_f32.c + * Description: Fast sine calculation for floating-point values + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupFastMath + */ + +/** + @defgroup sin Sine + + Computes the trigonometric sine function using a combination of table lookup + and linear interpolation. There are separate functions for + Q15, Q31, and floating-point data types. + The input to the floating-point version is in radians while the + fixed-point Q15 and Q31 have a scaled input with the range + [0 +0.9999] mapping to [0 2*pi). The fixed-point range is chosen so that a + value of 2*pi wraps around to 0. + + The implementation is based on table lookup using 256 values together with linear interpolation. + The steps used are: + -# Calculation of the nearest integer table index + -# Compute the fractional portion (fract) of the table index. + -# The final result equals (1.0f-fract)*a + fract*b; + + where +
+     b = Table[index];
+     c = Table[index+1];
+  
+ */ + +/** + @addtogroup sin + @{ + */ + +/** + @brief Fast approximation to the trigonometric sine function for floating-point data. + @param[in] x input value in radians. + @return sin(x) + */ + +float32_t arm_sin_f32( + float32_t x) +{ + float32_t sinVal, fract, in; /* Temporary input, output variables */ + uint16_t index; /* Index variable */ + float32_t a, b; /* Two nearest output values */ + int32_t n; + float32_t findex; + + /* input x is in radians */ + /* Scale input to [0 1] range from [0 2*PI] , divide input by 2*pi */ + in = x * 0.159154943092f; + + /* Calculation of floor value of input */ + n = (int32_t) in; + + /* Make negative values towards -infinity */ + if (in < 0.0f) + { + n--; + } + + /* Map input value to [0 1] */ + in = in - (float32_t) n; + + /* Calculation of index of the table */ + findex = (float32_t)FAST_MATH_TABLE_SIZE * in; + index = (uint16_t)findex; + + /* when "in" is exactly 1, we need to rotate the index down to 0 */ + if (index >= FAST_MATH_TABLE_SIZE) { + index = 0; + findex -= (float32_t)FAST_MATH_TABLE_SIZE; + } + + /* fractional value calculation */ + fract = findex - (float32_t) index; + + /* Read two nearest values of input value from the sin table */ + a = sinTable_f32[index]; + b = sinTable_f32[index+1]; + + /* Linear interpolation process */ + sinVal = (1.0f - fract) * a + fract * b; + + /* Return output value */ + return (sinVal); +} + +/** + @} end of sin group + */ diff --git a/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q15.c b/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q15.c new file mode 100644 index 0000000..1f0c2bf --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q15.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sin_q15.c + * Description: Fast sine calculation for Q15 values + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupFastMath + */ + +/** + @addtogroup sin + @{ + */ + +/** + @brief Fast approximation to the trigonometric sine function for Q15 data. + @param[in] x Scaled input value in radians + @return sin(x) + + The Q15 input value is in the range [0 +0.9999] and is mapped to a radian value in the range [0 2*PI). + */ + +q15_t arm_sin_q15( + q15_t x) +{ + q15_t sinVal; /* Temporary input, output variables */ + int32_t index; /* Index variable */ + q15_t a, b; /* Two nearest output values */ + q15_t fract; /* Temporary values for fractional values */ + + /* Calculate the nearest index */ + index = (uint32_t)x >> FAST_MATH_Q15_SHIFT; + + /* Calculation of fractional value */ + fract = (x - (index << FAST_MATH_Q15_SHIFT)) << 9; + + /* Read two nearest values of input value from the sin table */ + a = sinTable_q15[index]; + b = sinTable_q15[index+1]; + + /* Linear interpolation process */ + sinVal = (q31_t) (0x8000 - fract) * a >> 16; + sinVal = (q15_t) ((((q31_t) sinVal << 16) + ((q31_t) fract * b)) >> 16); + + /* Return output value */ + return (sinVal << 1); +} + +/** + @} end of sin group + */ diff --git a/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q31.c b/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q31.c new file mode 100644 index 0000000..8cefabb --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/arm_sin_q31.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sin_q31.c + * Description: Fast sine calculation for Q31 values + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupFastMath + */ + +/** + @addtogroup sin + @{ + */ + +/** + @brief Fast approximation to the trigonometric sine function for Q31 data. + @param[in] x Scaled input value in radians + @return sin(x) + + The Q31 input value is in the range [0 +0.9999] and is mapped to a radian value in the range [0 2*PI). + */ + +q31_t arm_sin_q31( + q31_t x) +{ + q31_t sinVal; /* Temporary variables for input, output */ + int32_t index; /* Index variable */ + q31_t a, b; /* Two nearest output values */ + q31_t fract; /* Temporary values for fractional values */ + + /* Calculate the nearest index */ + index = (uint32_t)x >> FAST_MATH_Q31_SHIFT; + + /* Calculation of fractional value */ + fract = (x - (index << FAST_MATH_Q31_SHIFT)) << 9; + + /* Read two nearest values of input value from the sin table */ + a = sinTable_q31[index]; + b = sinTable_q31[index+1]; + + /* Linear interpolation process */ + sinVal = (q63_t) (0x80000000 - fract) * a >> 32; + sinVal = (q31_t) ((((q63_t) sinVal << 32) + ((q63_t) fract * b)) >> 32); + + /* Return output value */ + return (sinVal << 1); +} + +/** + @} end of sin group + */ diff --git a/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q15.c b/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q15.c new file mode 100644 index 0000000..fab0a32 --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q15.c @@ -0,0 +1,144 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sqrt_q15.c + * Description: Q15 square root function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupFastMath + */ + +/** + @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 ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ + +arm_status arm_sqrt_q15( + q15_t in, + q15_t * pOut) +{ + q31_t bits_val1; + q15_t number, temp1, var1, signBits1, half; + float32_t temp_float1; + union + { + q31_t fracval; + float32_t floatval; + } tempconv; + + number = in; + + /* If the input is a positive number then compute the signBits. */ + if (number > 0) + { + signBits1 = __CLZ(number) - 17; + + /* Shift by the number of signBits1 */ + if ((signBits1 % 2) == 0) + { + number = number << signBits1; + } + else + { + number = number << (signBits1 - 1); + } + + /* Calculate half value of the number */ + half = number >> 1; + /* Store the number for later use */ + temp1 = number; + + /* Convert to float */ + temp_float1 = number * 3.051757812500000e-005f; + /* Store as integer */ + tempconv.floatval = temp_float1; + bits_val1 = tempconv.fracval; + /* Subtract the shifted value from the magic number to give intial guess */ + bits_val1 = 0x5f3759df - (bits_val1 >> 1); /* gives initial guess */ + /* Store as float */ + tempconv.fracval = bits_val1; + temp_float1 = tempconv.floatval; + /* Convert to integer format */ + var1 = (q31_t) (temp_float1 * 16384); + + /* 1st iteration */ + var1 = ((q15_t) ((q31_t) var1 * (0x3000 - + ((q15_t) + ((((q15_t) + (((q31_t) var1 * var1) >> 15)) * + (q31_t) half) >> 15))) >> 15)) << 2; + /* 2nd iteration */ + var1 = ((q15_t) ((q31_t) var1 * (0x3000 - + ((q15_t) + ((((q15_t) + (((q31_t) var1 * var1) >> 15)) * + (q31_t) half) >> 15))) >> 15)) << 2; + /* 3rd iteration */ + var1 = ((q15_t) ((q31_t) var1 * (0x3000 - + ((q15_t) + ((((q15_t) + (((q31_t) var1 * var1) >> 15)) * + (q31_t) half) >> 15))) >> 15)) << 2; + + /* Multiply the inverse square root with the original value */ + var1 = ((q15_t) (((q31_t) temp1 * var1) >> 15)) << 1; + + /* Shift the output down accordingly */ + if ((signBits1 % 2) == 0) + { + var1 = var1 >> (signBits1 / 2); + } + else + { + var1 = var1 >> ((signBits1 - 1) / 2); + } + *pOut = var1; + + return (ARM_MATH_SUCCESS); + } + /* If the number is a negative number then store zero as its square root value */ + else + { + *pOut = 0; + + return (ARM_MATH_ARGUMENT_ERROR); + } +} + +/** + @} end of SQRT group + */ diff --git a/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q31.c b/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q31.c new file mode 100644 index 0000000..9889b13 --- /dev/null +++ b/CMSIS/DSP/Source/FastMathFunctions/arm_sqrt_q31.c @@ -0,0 +1,144 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_sqrt_q31.c + * Description: Q31 square root function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupFastMath + */ + +/** + @addtogroup SQRT + @{ + */ + +/** + @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 ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ + +arm_status arm_sqrt_q31( + q31_t in, + q31_t * pOut) +{ + q31_t bits_val1; + q31_t number, temp1, var1, signBits1, half; + float32_t temp_float1; + union + { + q31_t fracval; + float32_t floatval; + } tempconv; + + number = in; + + /* If the input is a positive number then compute the signBits. */ + if (number > 0) + { + signBits1 = __CLZ(number) - 1; + + /* Shift by the number of signBits1 */ + if ((signBits1 % 2) == 0) + { + number = number << signBits1; + } + else + { + number = number << (signBits1 - 1); + } + + /* Calculate half value of the number */ + half = number >> 1; + /* Store the number for later use */ + temp1 = number; + + /* Convert to float */ + temp_float1 = number * 4.6566128731e-010f; + /* Store as integer */ + tempconv.floatval = temp_float1; + bits_val1 = tempconv.fracval; + /* Subtract the shifted value from the magic number to give intial guess */ + bits_val1 = 0x5f3759df - (bits_val1 >> 1); /* gives initial guess */ + /* Store as float */ + tempconv.fracval = bits_val1; + temp_float1 = tempconv.floatval; + /* Convert to integer format */ + var1 = (q31_t) (temp_float1 * 1073741824); + + /* 1st iteration */ + var1 = ((q31_t) ((q63_t) var1 * (0x30000000 - + ((q31_t) + ((((q31_t) + (((q63_t) var1 * var1) >> 31)) * + (q63_t) half) >> 31))) >> 31)) << 2; + /* 2nd iteration */ + var1 = ((q31_t) ((q63_t) var1 * (0x30000000 - + ((q31_t) + ((((q31_t) + (((q63_t) var1 * var1) >> 31)) * + (q63_t) half) >> 31))) >> 31)) << 2; + /* 3rd iteration */ + var1 = ((q31_t) ((q63_t) var1 * (0x30000000 - + ((q31_t) + ((((q31_t) + (((q63_t) var1 * var1) >> 31)) * + (q63_t) half) >> 31))) >> 31)) << 2; + + /* Multiply the inverse square root with the original value */ + var1 = ((q31_t) (((q63_t) temp1 * var1) >> 31)) << 1; + + /* Shift the output down accordingly */ + if ((signBits1 % 2) == 0) + { + var1 = var1 >> (signBits1 / 2); + } + else + { + var1 = var1 >> ((signBits1 - 1) / 2); + } + *pOut = var1; + + return (ARM_MATH_SUCCESS); + } + /* If the number is a negative number then store zero as its square root value */ + else + { + *pOut = 0; + + return (ARM_MATH_ARGUMENT_ERROR); + } +} + +/** + @} end of SQRT group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/CMakeLists.txt b/CMSIS/DSP/Source/FilteringFunctions/CMakeLists.txt new file mode 100644 index 0000000..59471ad --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/CMakeLists.txt @@ -0,0 +1,128 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPFiltering) + + +add_library(CMSISDSPFiltering STATIC) + +include(interpol) +interpol(CMSISDSPFiltering) + +configdsp(CMSISDSPFiltering ..) + +if (CONFIGTABLE AND ALLFAST) +target_compile_definitions(CMSISDSPFiltering PUBLIC ARM_ALL_FAST_TABLES) +endif() + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_LMS_NORM_Q31) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_norm_init_q31.c) +endif() + +if (NOT CONFIGTABLE OR ALLFAST OR ARM_LMS_NORM_Q15) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_norm_init_q15.c) +endif() + +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_32x64_init_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_32x64_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_fast_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_fast_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_init_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_init_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df1_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df2T_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df2T_f64.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df2T_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_df2T_init_f64.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_stereo_df2T_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_biquad_cascade_stereo_df2T_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_fast_opt_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_fast_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_fast_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_opt_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_opt_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_partial_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_partial_fast_opt_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_partial_fast_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_partial_fast_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_partial_opt_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_partial_opt_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_partial_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_partial_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_partial_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_conv_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_correlate_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_correlate_fast_opt_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_correlate_fast_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_correlate_fast_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_correlate_opt_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_correlate_opt_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_correlate_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_correlate_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_correlate_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_decimate_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_decimate_fast_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_decimate_fast_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_decimate_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_decimate_init_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_decimate_init_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_decimate_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_decimate_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_fast_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_fast_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_init_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_init_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_init_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_interpolate_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_interpolate_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_interpolate_init_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_interpolate_init_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_interpolate_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_interpolate_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_lattice_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_lattice_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_lattice_init_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_lattice_init_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_lattice_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_lattice_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_sparse_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_sparse_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_sparse_init_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_sparse_init_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_sparse_init_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_sparse_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_sparse_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_fir_sparse_q7.c) +target_sources(CMSISDSPFiltering PRIVATE arm_iir_lattice_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_iir_lattice_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_iir_lattice_init_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_iir_lattice_init_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_iir_lattice_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_iir_lattice_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_init_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_init_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_norm_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_norm_init_f32.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_norm_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_norm_q31.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_q15.c) +target_sources(CMSISDSPFiltering PRIVATE arm_lms_q31.c) + + +### Includes +target_include_directories(CMSISDSPFiltering PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/FilteringFunctions/FilteringFunctions.c b/CMSIS/DSP/Source/FilteringFunctions/FilteringFunctions.c new file mode 100644 index 0000000..7ce0cdb --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/FilteringFunctions.c @@ -0,0 +1,127 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: FilteringFunctions.c + * Description: Combination of all filtering function source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_biquad_cascade_df1_32x64_init_q31.c" +#include "arm_biquad_cascade_df1_32x64_q31.c" +#include "arm_biquad_cascade_df1_f32.c" +#include "arm_biquad_cascade_df1_fast_q15.c" +#include "arm_biquad_cascade_df1_fast_q31.c" +#include "arm_biquad_cascade_df1_init_f32.c" +#include "arm_biquad_cascade_df1_init_q15.c" +#include "arm_biquad_cascade_df1_init_q31.c" +#include "arm_biquad_cascade_df1_q15.c" +#include "arm_biquad_cascade_df1_q31.c" +#include "arm_biquad_cascade_df2T_f32.c" +#include "arm_biquad_cascade_df2T_f64.c" +#include "arm_biquad_cascade_df2T_init_f32.c" +#include "arm_biquad_cascade_df2T_init_f64.c" +#include "arm_biquad_cascade_stereo_df2T_f32.c" +#include "arm_biquad_cascade_stereo_df2T_init_f32.c" +#include "arm_conv_f32.c" +#include "arm_conv_fast_opt_q15.c" +#include "arm_conv_fast_q15.c" +#include "arm_conv_fast_q31.c" +#include "arm_conv_opt_q15.c" +#include "arm_conv_opt_q7.c" +#include "arm_conv_partial_f32.c" +#include "arm_conv_partial_fast_opt_q15.c" +#include "arm_conv_partial_fast_q15.c" +#include "arm_conv_partial_fast_q31.c" +#include "arm_conv_partial_opt_q15.c" +#include "arm_conv_partial_opt_q7.c" +#include "arm_conv_partial_q15.c" +#include "arm_conv_partial_q31.c" +#include "arm_conv_partial_q7.c" +#include "arm_conv_q15.c" +#include "arm_conv_q31.c" +#include "arm_conv_q7.c" +#include "arm_correlate_f32.c" +#include "arm_correlate_fast_opt_q15.c" +#include "arm_correlate_fast_q15.c" +#include "arm_correlate_fast_q31.c" +#include "arm_correlate_opt_q15.c" +#include "arm_correlate_opt_q7.c" +#include "arm_correlate_q15.c" +#include "arm_correlate_q31.c" +#include "arm_correlate_q7.c" +#include "arm_fir_decimate_f32.c" +#include "arm_fir_decimate_fast_q15.c" +#include "arm_fir_decimate_fast_q31.c" +#include "arm_fir_decimate_init_f32.c" +#include "arm_fir_decimate_init_q15.c" +#include "arm_fir_decimate_init_q31.c" +#include "arm_fir_decimate_q15.c" +#include "arm_fir_decimate_q31.c" +#include "arm_fir_f32.c" +#include "arm_fir_fast_q15.c" +#include "arm_fir_fast_q31.c" +#include "arm_fir_init_f32.c" +#include "arm_fir_init_q15.c" +#include "arm_fir_init_q31.c" +#include "arm_fir_init_q7.c" +#include "arm_fir_interpolate_f32.c" +#include "arm_fir_interpolate_init_f32.c" +#include "arm_fir_interpolate_init_q15.c" +#include "arm_fir_interpolate_init_q31.c" +#include "arm_fir_interpolate_q15.c" +#include "arm_fir_interpolate_q31.c" +#include "arm_fir_lattice_f32.c" +#include "arm_fir_lattice_init_f32.c" +#include "arm_fir_lattice_init_q15.c" +#include "arm_fir_lattice_init_q31.c" +#include "arm_fir_lattice_q15.c" +#include "arm_fir_lattice_q31.c" +#include "arm_fir_q15.c" +#include "arm_fir_q31.c" +#include "arm_fir_q7.c" +#include "arm_fir_sparse_f32.c" +#include "arm_fir_sparse_init_f32.c" +#include "arm_fir_sparse_init_q15.c" +#include "arm_fir_sparse_init_q31.c" +#include "arm_fir_sparse_init_q7.c" +#include "arm_fir_sparse_q15.c" +#include "arm_fir_sparse_q31.c" +#include "arm_fir_sparse_q7.c" +#include "arm_iir_lattice_f32.c" +#include "arm_iir_lattice_init_f32.c" +#include "arm_iir_lattice_init_q15.c" +#include "arm_iir_lattice_init_q31.c" +#include "arm_iir_lattice_q15.c" +#include "arm_iir_lattice_q31.c" +#include "arm_lms_f32.c" +#include "arm_lms_init_f32.c" +#include "arm_lms_init_q15.c" +#include "arm_lms_init_q31.c" +#include "arm_lms_norm_f32.c" +#include "arm_lms_norm_init_f32.c" +#include "arm_lms_norm_init_q15.c" +#include "arm_lms_norm_init_q31.c" +#include "arm_lms_norm_q15.c" +#include "arm_lms_norm_q31.c" +#include "arm_lms_q15.c" +#include "arm_lms_q31.c" diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c new file mode 100644 index 0000000..ac2313f --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c @@ -0,0 +1,94 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_32x64_init_q31.c + * Description: High precision Q31 Biquad cascade filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF1_32x64 + @{ + */ + +/** + @brief Initialization function for the Q31 Biquad cascade 32x64 filter. + @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 after the accumulator. Varies according to the coefficients format + @return none + + @par Coefficient and State Ordering + The coefficients are stored in the array pCoeffs in the following order: +
+      {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
+  
+ where b1x and a1x are the coefficients for the first stage, + b2x and a2x are the coefficients for the second stage, + and so on. The pCoeffs array contains a total of 5*numStages values. + @par + The pState points to state variables array and size of each state variable is 1.63 format. + Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. + The state variables are arranged in the state array as: +
+      {x[n-1], x[n-2], y[n-1], y[n-2]}
+  
+ The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. + The state array has a total length of 4*numStages values. + The state variables are updated after each block of data is processed; the coefficients are untouched. + */ + +void arm_biquad_cas_df1_32x64_init_q31( + arm_biquad_cas_df1_32x64_ins_q31 * S, + uint8_t numStages, + const q31_t * pCoeffs, + q63_t * pState, + uint8_t postShift) +{ + /* Assign filter stages */ + S->numStages = numStages; + + /* Assign postShift to be applied to the output */ + S->postShift = postShift; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always 4 * numStages */ + memset(pState, 0, (4U * (uint32_t) numStages) * sizeof(q63_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of BiquadCascadeDF1_32x64 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c new file mode 100644 index 0000000..9a284b8 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c @@ -0,0 +1,458 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_32x64_q31.c + * Description: High precision Q31 Biquad cascade filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup BiquadCascadeDF1_32x64 High Precision Q31 Biquad Cascade Filter + + This function implements a high precision Biquad cascade filter which operates on + Q31 data values. The filter coefficients are in 1.31 format and the state variables + are in 1.63 format. The double precision state variables reduce quantization noise + in the filter and provide a cleaner output. + These filters are particularly useful when implementing filters in which the + singularities are close to the unit circle. This is common for low pass or high + pass filters with very low cutoff frequencies. + + The function operates on blocks of input and output data + and each call to the function processes blockSize samples through + the filter. pSrc and pDst points to input and output arrays + containing blockSize Q31 values. + + @par Algorithm + Each Biquad stage implements a second order filter using the difference equation: +
+      y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]
+  
+ A Direct Form I algorithm is used with 5 coefficients and 4 state variables per stage. + \image html Biquad.gif "Single Biquad filter stage" + Coefficients b0, b1 and b2 multiply the input signal x[n] and are referred to as the feedforward coefficients. + Coefficients a1 and a2 multiply the output signal y[n] and are referred to as the feedback coefficients. + Pay careful attention to the sign of the feedback coefficients. + Some design tools use the difference equation +
+      y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]
+  
+ In this case the feedback coefficients a1 and a2 must be negated when used with the CMSIS DSP Library. + @par + Higher order filters are realized as a cascade of second order sections. + numStages refers to the number of second order stages used. + For example, an 8th order filter would be realized with numStages=4 second order stages. + \image html BiquadCascade.gif "8th order filter using a cascade of Biquad stages" + A 9th order filter would be realized with numStages=5 second order stages + with the coefficients for one of the stages configured as a first order filter + (b2=0 and a2=0). + @par + The pState points to state variables array. + Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2] and each state variable in 1.63 format to improve precision. + The state variables are arranged in the array as: +
+      {x[n-1], x[n-2], y[n-1], y[n-2]}
+  
+ @par + The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. + The state array has a total length of 4*numStages values of data in 1.63 format. + The state variables are updated after each block of data is processed, the coefficients are untouched. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter. + Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. + + @par Init Function + There is also an associated initialization function which performs the following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numStages, pCoeffs, postShift, pState. Also set all of the values in pState to zero. + + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + Set the values in the state buffer to zeros before static initialization. + For example, to statically initialize the filter instance structure use +
+      arm_biquad_cas_df1_32x64_ins_q31 S1 = {numStages, pState, pCoeffs, postShift};
+  
+ where numStages is the number of Biquad stages in the filter; + pState is the address of the state buffer; + pCoeffs is the address of the coefficient buffer; + postShift shift to be applied which is described in detail below. + @par Fixed-Point Behavior + Care must be taken while using Biquad Cascade 32x64 filter function. + Following issues must be considered: + - Scaling of coefficients + - Filter gain + - Overflow and saturation + + @par + Filter coefficients are represented as fractional values and + restricted to lie in the range [-1 +1). + The processing function has an additional scaling parameter postShift + which allows the filter coefficients to exceed the range [+1 -1). + At the output of the filter's accumulator is a shift register which shifts the result by postShift bits. + \image html BiquadPostshift.gif "Fixed-point Biquad with shift by postShift bits after accumulator" + This essentially scales the filter coefficients by 2^postShift. + For example, to realize the coefficients +
+     {1.5, -0.8, 1.2, 1.6, -0.9}
+  
+ set the Coefficient array to: +
+     {0.75, -0.4, 0.6, 0.8, -0.45}
+  
+ and set postShift=1 + @par + The second thing to keep in mind is the gain through the filter. + The frequency response of a Biquad filter is a function of its coefficients. + It is possible for the gain through the filter to exceed 1.0 meaning that the + filter increases the amplitude of certain frequencies. + This means that an input signal with amplitude < 1.0 may result in an output > 1.0 + and these are saturated or overflowed based on the implementation of the filter. + To avoid this behavior the filter needs to be scaled down such that its peak gain < 1.0 + or the input signal must be scaled down so that the combination of input and filter are never overflowed. + @par + The third item to consider is the overflow and saturation behavior of the fixed-point Q31 version. + This is described in the function specific documentation below. + */ + +/** + @addtogroup BiquadCascadeDF1_32x64 + @{ + */ + +/** + @brief Processing function for the Q31 Biquad cascade 32x64 filter. + @param[in] S points to an instance of the high precision Q31 Biquad cascade filter + @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 + @return none + + @par Details + 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 and lie in the range [-0.25 +0.25). + After all 5 multiply-accumulates are performed, the 2.62 accumulator is shifted by postShift bits and the result truncated to + 1.31 format by discarding the low 32 bits. + @par + Two related functions are provided in the CMSIS DSP library. + - \ref arm_biquad_cascade_df1_q31() implements a Biquad cascade with 32-bit coefficients and state variables with a Q63 accumulator. + - \ref arm_biquad_cascade_df1_fast_q31() implements a Biquad cascade with 32-bit coefficients and state variables with a Q31 accumulator. + */ + +void arm_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pIn = pSrc; /* input pointer initialization */ + q31_t *pOut = pDst; /* output pointer initialization */ + q63_t *pState = S->pState; /* state pointer initialization */ + const q31_t *pCoeffs = S->pCoeffs; /* coeff pointer initialization */ + q63_t acc; /* accumulator */ + q31_t Xn1, Xn2; /* Input Filter state variables */ + q63_t Yn1, Yn2; /* Output Filter state variables */ + q31_t b0, b1, b2, a1, a2; /* Filter coefficients */ + q31_t Xn; /* temporary input */ + int32_t shift = (int32_t) S->postShift + 1; /* Shift to be applied to the output */ + uint32_t sample, stage = S->numStages; /* loop counters */ + q31_t acc_l, acc_h; /* temporary output */ + uint32_t uShift = ((uint32_t) S->postShift + 1U); + uint32_t lShift = 32U - uShift; /* Shift to be applied to the output */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the state values */ + Xn1 = (q31_t) (pState[0]); + Xn2 = (q31_t) (pState[1]); + Yn1 = pState[2]; + Yn2 = pState[3]; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Apply loop unrolling and compute 4 output values simultaneously. */ + /* Variable acc hold output value that is being computed and stored in destination buffer + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + + /* Loop unrolling: Compute 4 outputs at a time */ + sample = blockSize >> 2U; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + + /* acc = b0 * x[n] */ + acc = (q63_t) Xn * b0; + + /* acc += b1 * x[n-1] */ + acc += (q63_t) Xn1 * b1; + + /* acc += b[2] * x[n-2] */ + acc += (q63_t) Xn2 * b2; + + /* acc += a1 * y[n-1] */ + acc += mult32x64(Yn1, a1); + + /* acc += a2 * y[n-2] */ + acc += mult32x64(Yn2, a2); + + /* The result is converted to 1.63 , Yn2 variable is reused */ + Yn2 = acc << shift; + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store the output in the destination buffer in 1.31 format. */ + *pOut = acc_h; + + /* Read the second input into Xn2, to reuse the value */ + Xn2 = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + + /* acc += b1 * x[n-1] */ + acc = (q63_t) Xn * b1; + + /* acc = b0 * x[n] */ + acc += (q63_t) Xn2 * b0; + + /* acc += b[2] * x[n-2] */ + acc += (q63_t) Xn1 * b2; + + /* acc += a1 * y[n-1] */ + acc += mult32x64(Yn2, a1); + + /* acc += a2 * y[n-2] */ + acc += mult32x64(Yn1, a2); + + /* The result is converted to 1.63, Yn1 variable is reused */ + Yn1 = acc << shift; + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Read the third input into Xn1, to reuse the value */ + Xn1 = *pIn++; + + /* The result is converted to 1.31 */ + /* Store the output in the destination buffer. */ + *(pOut + 1U) = acc_h; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + + /* acc = b0 * x[n] */ + acc = (q63_t) Xn1 * b0; + + /* acc += b1 * x[n-1] */ + acc += (q63_t) Xn2 * b1; + + /* acc += b[2] * x[n-2] */ + acc += (q63_t) Xn * b2; + + /* acc += a1 * y[n-1] */ + acc += mult32x64(Yn1, a1); + + /* acc += a2 * y[n-2] */ + acc += mult32x64(Yn2, a2); + + /* The result is converted to 1.63, Yn2 variable is reused */ + Yn2 = acc << shift; + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store the output in the destination buffer in 1.31 format. */ + *(pOut + 2U) = acc_h; + + /* Read the fourth input into Xn, to reuse the value */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + /* acc = b0 * x[n] */ + acc = (q63_t) Xn * b0; + + /* acc += b1 * x[n-1] */ + acc += (q63_t) Xn1 * b1; + + /* acc += b[2] * x[n-2] */ + acc += (q63_t) Xn2 * b2; + + /* acc += a1 * y[n-1] */ + acc += mult32x64(Yn2, a1); + + /* acc += a2 * y[n-2] */ + acc += mult32x64(Yn1, a2); + + /* The result is converted to 1.63, Yn1 variable is reused */ + Yn1 = acc << shift; + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store the output in the destination buffer in 1.31 format. */ + *(pOut + 3U) = acc_h; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + + /* update output pointer */ + pOut += 4U; + + /* decrement loop counter */ + sample--; + } + + /* Loop unrolling: Compute remaining outputs */ + sample = blockSize & 0x3U; + +#else + + /* Initialize blkCnt with number of samples */ + sample = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + + /* acc = b0 * x[n] */ + acc = (q63_t) Xn * b0; + /* acc += b1 * x[n-1] */ + acc += (q63_t) Xn1 * b1; + /* acc += b[2] * x[n-2] */ + acc += (q63_t) Xn2 * b2; + /* acc += a1 * y[n-1] */ + acc += mult32x64(Yn1, a1); + /* acc += a2 * y[n-2] */ + acc += mult32x64(Yn2, a2); + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + + /* The result is converted to 1.63, Yn1 variable is reused */ + Yn1 = acc << shift; + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store the output in the destination buffer in 1.31 format. */ + *pOut++ = acc_h; + /* Yn1 = acc << shift; */ + + /* Store the output in the destination buffer in 1.31 format. */ +/* *pOut++ = (q31_t) (acc >> (32 - shift)); */ + + /* decrement loop counter */ + sample--; + } + + /* The first stage output is given as input to the second stage. */ + pIn = pDst; + + /* Reset to destination buffer working pointer */ + pOut = pDst; + + /* Store the updated state variables back into the pState array */ + *pState++ = (q63_t) Xn1; + *pState++ = (q63_t) Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + } while (--stage); + +} + +/** + @} end of BiquadCascadeDF1_32x64 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c new file mode 100644 index 0000000..d28509d --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c @@ -0,0 +1,495 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_f32.c + * Description: Processing function for the floating-point Biquad cascade DirectFormI(DF1) filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup BiquadCascadeDF1 Biquad Cascade IIR Filters Using Direct Form I Structure + + This set of functions implements arbitrary order recursive (IIR) filters. + The filters are implemented as a cascade of second order Biquad sections. + The functions support Q15, Q31 and floating-point data types. + Fast version of Q15 and Q31 also available. + + The functions operate on blocks of input and output data and each call to the function + processes blockSize samples through the filter. + pSrc points to the array of input data and + pDst points to the array of output data. + Both arrays contain blockSize values. + + @par Algorithm + Each Biquad stage implements a second order filter using the difference equation: +
+      y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]
+  
+ A Direct Form I algorithm is used with 5 coefficients and 4 state variables per stage. + \image html Biquad.gif "Single Biquad filter stage" + Coefficients b0, b1 and b2 multiply the input signal x[n] and are referred to as the feedforward coefficients. + Coefficients a1 and a2 multiply the output signal y[n] and are referred to as the feedback coefficients. + Pay careful attention to the sign of the feedback coefficients. + Some design tools use the difference equation +
+      y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]
+  
+ In this case the feedback coefficients a1 and a2 + must be negated when used with the CMSIS DSP Library. + + @par + Higher order filters are realized as a cascade of second order sections. + numStages refers to the number of second order stages used. + For example, an 8th order filter would be realized with numStages=4 second order stages. + \image html BiquadCascade.gif "8th order filter using a cascade of Biquad stages" + A 9th order filter would be realized with numStages=5 second order stages with the coefficients for one of the stages configured as a first order filter (b2=0 and a2=0). + + @par + The pState points to state variables array. + Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. + The state variables are arranged in the pState array as: +
+      {x[n-1], x[n-2], y[n-1], y[n-2]}
+  
+ + @par + The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. + The state array has a total length of 4*numStages values. + The state variables are updated after each block of data is processed, the coefficients are untouched. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter. + Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. + There are separate instance structure declarations for each of the 3 supported data types. + + @par Init Function + There is also an associated initialization function for each data type. + The initialization function performs following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numStages, pCoeffs, pState. Also set all of the values in pState to zero. + + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + Set the values in the state buffer to zeros before static initialization. + The code below statically initializes each of the 3 different data type filter instance structures +
+      arm_biquad_casd_df1_inst_f32 S1 = {numStages, pState, pCoeffs};
+      arm_biquad_casd_df1_inst_q15 S2 = {numStages, pState, pCoeffs, postShift};
+      arm_biquad_casd_df1_inst_q31 S3 = {numStages, pState, pCoeffs, postShift};
+  
+ where numStages is the number of Biquad stages in the filter; + pState is the address of the state buffer; + pCoeffs is the address of the coefficient buffer; + postShift shift to be applied. + + @par Fixed-Point Behavior + Care must be taken when using the Q15 and Q31 versions of the Biquad Cascade filter functions. + Following issues must be considered: + - Scaling of coefficients + - Filter gain + - Overflow and saturation + + @par Scaling of coefficients + Filter coefficients are represented as fractional values and + coefficients are restricted to lie in the range [-1 +1). + The fixed-point functions have an additional scaling parameter postShift + which allow the filter coefficients to exceed the range [+1 -1). + At the output of the filter's accumulator is a shift register which shifts the result by postShift bits. + \image html BiquadPostshift.gif "Fixed-point Biquad with shift by postShift bits after accumulator" + This essentially scales the filter coefficients by 2^postShift. + For example, to realize the coefficients +
+     {1.5, -0.8, 1.2, 1.6, -0.9}
+  
+ set the pCoeffs array to: +
+     {0.75, -0.4, 0.6, 0.8, -0.45}
+  
+ and set postShift=1 + + @par Filter gain + The frequency response of a Biquad filter is a function of its coefficients. + It is possible for the gain through the filter to exceed 1.0 meaning that the filter increases the amplitude of certain frequencies. + This means that an input signal with amplitude < 1.0 may result in an output > 1.0 and these are saturated or overflowed based on the implementation of the filter. + To avoid this behavior the filter needs to be scaled down such that its peak gain < 1.0 or the input signal must be scaled down so that the combination of input and filter are never overflowed. + + @par Overflow and saturation + For Q15 and Q31 versions, it is described separately as part of the function specific documentation below. + */ + +/** + @addtogroup BiquadCascadeDF1 + @{ + */ + +/** + @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 + @return none + */ + +#if defined(ARM_MATH_NEON) +void arm_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + + const float32_t *pIn = pSrc; /* source pointer */ + float32_t *pOut = pDst; /* destination pointer */ + float32_t *pState = S->pState; /* pState pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ + float32_t acc; /* Simulates the accumulator */ + + uint32_t sample, stage = S->numStages; /* loop counters */ + + float32x4_t Xn; + float32x2_t Yn; + float32x2_t a; + float32x4_t b; + + float32x4_t x,tmp; + float32x2_t t; + float32x2x2_t y; + + float32_t Xns; + + while (stage > 0U) + { + /* Reading the coefficients */ + Xn = vld1q_f32(pState); + Yn = vld1_f32(pState + 2); + + b = vld1q_f32(pCoeffs); + b = vrev64q_f32(b); + b = vcombine_f32(vget_high_f32(b), vget_low_f32(b)); + + a = vld1_f32(pCoeffs + 3); + a = vrev64_f32(a); + b[0] = 0.0; + pCoeffs += 5; + + /* Reading the pState values */ + + /* Apply loop unrolling and compute 4 output values simultaneously. */ + /* The variable acc hold output values that are being computed: + * + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + sample = blockSize >> 2U; + + while (sample > 0U) + { + /* Read the first 4 inputs */ + x = vld1q_f32(pIn); + + pIn += 4; + + tmp = vextq_f32(Xn, x, 1); + t = vmul_f32(vget_high_f32(b), vget_high_f32(tmp)); + t = vmla_f32(t, vget_low_f32(b), vget_low_f32(tmp)); + t = vmla_f32(t, a, Yn); + t = vpadd_f32(t, t); + Yn = vext_f32(Yn, t, 1); + + tmp = vextq_f32(Xn, x, 2); + t = vmul_f32(vget_high_f32(b), vget_high_f32(tmp)); + t = vmla_f32(t, vget_low_f32(b), vget_low_f32(tmp)); + t = vmla_f32(t, a, Yn); + t = vpadd_f32(t, t); + Yn = vext_f32(Yn, t, 1); + + y.val[0] = Yn; + + tmp = vextq_f32(Xn, x, 3); + t = vmul_f32(vget_high_f32(b), vget_high_f32(tmp)); + t = vmla_f32(t, vget_low_f32(b), vget_low_f32(tmp)); + t = vmla_f32(t, a, Yn); + t = vpadd_f32(t, t); + Yn = vext_f32(Yn, t, 1); + + Xn = x; + t = vmul_f32(vget_high_f32(b), vget_high_f32(Xn)); + t = vmla_f32(t, vget_low_f32(b), vget_low_f32(Xn)); + t = vmla_f32(t, a, Yn); + t = vpadd_f32(t, t); + Yn = vext_f32(Yn, t, 1); + + y.val[1] = Yn; + + tmp = vcombine_f32(y.val[0], y.val[1]); + + /* Store the 4 outputs and increment the pointer */ + vst1q_f32(pOut, tmp); + pOut += 4; + + /* Decrement the loop counter */ + sample--; + } + + /* If the block size is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + sample = blockSize & 0x3U; + + while (sample > 0U) + { + /* Read the input */ + Xns = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = (b[1] * Xn[2]) + (b[2] * Xn[3]) + (b[3] * Xns) + (a[0] * Yn[0]) + (a[1] * Yn[1]); + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = acc; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn[2] = Xn[3]; + Xn[3] = Xns; + Yn[0] = Yn[1]; + Yn[1] = acc; + + /* Decrement the loop counter */ + sample--; + + } + + vst1q_f32(pState,vcombine_f32(vrev64_f32(vget_high_f32(Xn)),vrev64_f32(Yn))); + pState += 4; + /* Store the updated state variables back into the pState array */ + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent numStages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset the output pointer */ + pOut = pDst; + + /* Decrement the loop counter */ + stage--; + } +} + +#else +void arm_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + const float32_t *pIn = pSrc; /* Source pointer */ + float32_t *pOut = pDst; /* Destination pointer */ + float32_t *pState = S->pState; /* pState pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t acc; /* Accumulator */ + float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ + float32_t Xn1, Xn2, Yn1, Yn2; /* Filter pState variables */ + float32_t Xn; /* Temporary input */ + uint32_t sample, stage = S->numStages; /* Loop counters */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the pState values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Apply loop unrolling and compute 4 output values simultaneously. */ + /* Variable acc hold output values that are being computed: + * + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + + /* Loop unrolling: Compute 4 outputs at a time */ + sample = blockSize >> 2U; + + while (sample > 0U) + { + /* Read the first input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + Yn2 = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn1) + (a2 * Yn2); + + /* Store output in destination buffer. */ + *pOut++ = Yn2; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + + /* Read the second input */ + Xn2 = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + Yn1 = (b0 * Xn2) + (b1 * Xn) + (b2 * Xn1) + (a1 * Yn2) + (a2 * Yn1); + + /* Store output in destination buffer. */ + *pOut++ = Yn1; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + + /* Read the third input */ + Xn1 = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + Yn2 = (b0 * Xn1) + (b1 * Xn2) + (b2 * Xn) + (a1 * Yn1) + (a2 * Yn2); + + /* Store output in destination buffer. */ + *pOut++ = Yn2; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + + /* Read the forth input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + Yn1 = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn2) + (a2 * Yn1); + + /* Store output in destination buffer. */ + *pOut++ = Yn1; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + + /* decrement loop counter */ + sample--; + } + + /* Loop unrolling: Compute remaining outputs */ + sample = blockSize & 0x3U; + +#else + + /* Initialize blkCnt with number of samples */ + sample = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn1) + (a2 * Yn2); + + /* Store output in destination buffer. */ + *pOut++ = acc; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + Yn1 = acc; + + /* decrement loop counter */ + sample--; + } + + /* Store the updated state variables back into the pState array */ + *pState++ = Xn1; + *pState++ = Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent numStages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset output pointer */ + pOut = pDst; + + /* decrement loop counter */ + stage--; + + } while (stage > 0U); + +} + +#endif /* #if defined(ARM_MATH_NEON) */ +/** + @} end of BiquadCascadeDF1 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c new file mode 100644 index 0000000..1a568d7 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c @@ -0,0 +1,250 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_fast_q15.c + * Description: Fast processing function for the Q15 Biquad cascade filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF1 + @{ + */ + +/** + @brief Processing function for the Q15 Biquad cascade filter (fast variant). + @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 per call + @return none + + @par Scaling and Overflow Behavior + This fast version uses a 32-bit accumulator with 2.30 format. + The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. + Thus, if the accumulator result overflows it wraps around and distorts the result. + In order to avoid overflows completely the input signal must be scaled down by two bits and lie in the range [-0.25 +0.25). + The 2.30 accumulator is then shifted by postShift bits and the result truncated to 1.15 format by discarding the low 16 bits. + @remark + Refer to \ref arm_biquad_cascade_df1_q15() for a slower implementation of this function + which uses 64-bit accumulation to avoid wrap around distortion. Both the slow and the fast versions use the same instance structure. + Use the function \ref arm_biquad_cascade_df1_init_q15() to initialize the filter structure. + */ + +void arm_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + const q15_t *pIn = pSrc; /* Source pointer */ + q15_t *pOut = pDst; /* Destination pointer */ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t acc; /* Accumulator */ + q31_t in; /* Temporary variable to hold input value */ + q31_t out; /* Temporary variable to hold output value */ + q31_t b0; /* Temporary variable to hold bo value */ + q31_t b1, a1; /* Filter coefficients */ + q31_t state_in, state_out; /* Filter state variables */ + int32_t shift = (int32_t) (15 - S->postShift); /* Post shift */ + uint32_t sample, stage = S->numStages; /* Loop counters */ + + do + { + /* Read the b0 and 0 coefficients using SIMD */ + b0 = read_q15x2_ia ((q15_t **) &pCoeffs); + + /* Read the b1 and b2 coefficients using SIMD */ + b1 = read_q15x2_ia ((q15_t **) &pCoeffs); + + /* Read the a1 and a2 coefficients using SIMD */ + a1 = read_q15x2_ia ((q15_t **) &pCoeffs); + + /* Read the input state values from the state buffer: x[n-1], x[n-2] */ + state_in = read_q15x2_ia (&pState); + + /* Read the output state values from the state buffer: y[n-1], y[n-2] */ + state_out = read_q15x2_da (&pState); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Apply loop unrolling and compute 2 output values simultaneously. */ + /* Variable acc hold output values that are being computed: + * + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + + /* Loop unrolling: Compute 2 outputs at a time */ + sample = blockSize >> 1U; + + while (sample > 0U) + { + + /* Read the input */ + in = read_q15x2_ia ((q15_t **) &pIn); + + /* out = b0 * x[n] + 0 * 0 */ + out = __SMUAD(b0, in); + /* acc = b1 * x[n-1] + acc += b2 * x[n-2] + out */ + acc = __SMLAD(b1, state_in, out); + /* acc += a1 * y[n-1] + acc += a2 * y[n-2] */ + acc = __SMLAD(a1, state_out, acc); + + /* The result is converted from 3.29 to 1.31 and then saturation is applied */ + out = __SSAT((acc >> shift), 16); + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ + /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ + +#ifndef ARM_MATH_BIG_ENDIAN + state_in = __PKHBT(in, state_in, 16); + state_out = __PKHBT(out, state_out, 16); +#else + state_in = __PKHBT(state_in >> 16, (in >> 16), 16); + state_out = __PKHBT(state_out >> 16, (out), 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* out = b0 * x[n] + 0 * 0 */ + out = __SMUADX(b0, in); + /* acc0 = b1 * x[n-1] , acc0 += b2 * x[n-2] + out */ + acc = __SMLAD(b1, state_in, out); + /* acc += a1 * y[n-1] + acc += a2 * y[n-2] */ + acc = __SMLAD(a1, state_out, acc); + + /* The result is converted from 3.29 to 1.31 and then saturation is applied */ + out = __SSAT((acc >> shift), 16); + + /* Store the output in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT(state_out, out, 16)); +#else + write_q15x2_ia (&pOut, __PKHBT(out, state_out >> 16, 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ + /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ +#ifndef ARM_MATH_BIG_ENDIAN + state_in = __PKHBT(in >> 16, state_in, 16); + state_out = __PKHBT(out, state_out, 16); +#else + state_in = __PKHBT(state_in >> 16, in, 16); + state_out = __PKHBT(state_out >> 16, out, 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Decrement loop counter */ + sample--; + } + + /* Loop unrolling: Compute remaining outputs */ + sample = (blockSize & 0x1U); + +#else + + /* Initialize blkCnt with number of samples */ + sample = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (sample > 0U) + { + /* Read the input */ + in = *pIn++; + + /* out = b0 * x[n] + 0 * 0 */ +#ifndef ARM_MATH_BIG_ENDIAN + out = __SMUAD(b0, in); +#else + out = __SMUADX(b0, in); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* acc = b1 * x[n-1], acc += b2 * x[n-2] + out */ + acc = __SMLAD(b1, state_in, out); + /* acc += a1 * y[n-1] + acc += a2 * y[n-2] */ + acc = __SMLAD(a1, state_out, acc); + + /* The result is converted from 3.29 to 1.31 and then saturation is applied */ + out = __SSAT((acc >> shift), 16); + + /* Store the output in the destination buffer. */ + *pOut++ = (q15_t) out; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ + /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ +#ifndef ARM_MATH_BIG_ENDIAN + state_in = __PKHBT(in, state_in, 16); + state_out = __PKHBT(out, state_out, 16); +#else + state_in = __PKHBT(state_in >> 16, in, 16); + state_out = __PKHBT(state_out >> 16, out, 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* decrement loop counter */ + sample--; + } + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent (numStages - 1) occur in-place in the output buffer */ + pIn = pDst; + + /* Reset the output pointer */ + pOut = pDst; + + /* Store the updated state variables back into the state array */ + write_q15x2_ia(&pState, state_in); + write_q15x2_ia(&pState, state_out); + + /* Decrement loop counter */ + stage--; + + } while (stage > 0U); +} + +/** + @} end of BiquadCascadeDF1 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c new file mode 100644 index 0000000..586296b --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c @@ -0,0 +1,296 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_fast_q31.c + * Description: Processing function for the Q31 Fast Biquad cascade DirectFormI(DF1) filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF1 + @{ + */ + +/** + @brief Processing function for the Q31 Biquad cascade filter (fast variant). + @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 per call + @return none + + @par Scaling and Overflow Behavior + This function is optimized for speed at the expense of fixed-point precision and overflow protection. + The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. + These intermediate results are added to a 2.30 accumulator. + Finally, the accumulator is saturated and converted to a 1.31 result. + The fast version has the same overflow behavior as the standard version and provides less precision since it discards the low 32 bits of each multiplication result. + In order to avoid overflows completely the input signal must be scaled down by two bits and lie in the range [-0.25 +0.25). Use the intialization function + arm_biquad_cascade_df1_init_q31() to initialize filter structure. + @remark + Refer to \ref arm_biquad_cascade_df1_q31() for a slower implementation of this function + which uses 64-bit accumulation to provide higher precision. Both the slow and the fast versions use the same instance structure. + Use the function \ref arm_biquad_cascade_df1_init_q31() to initialize the filter structure. + */ + +void arm_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + const q31_t *pIn = pSrc; /* Source pointer */ + q31_t *pOut = pDst; /* Destination pointer */ + q31_t *pState = S->pState; /* pState pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t acc = 0; /* Accumulator */ + q31_t b0, b1, b2, a1, a2; /* Filter coefficients */ + q31_t Xn1, Xn2, Yn1, Yn2; /* Filter pState variables */ + q31_t Xn; /* Temporary input */ + int32_t shift = (int32_t) S->postShift + 1; /* Shift to be applied to the output */ + uint32_t sample, stage = S->numStages; /* Loop counters */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the pState values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Apply loop unrolling and compute 4 output values simultaneously. */ + /* Variables acc ... acc3 hold output values that are being computed: + * + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + + /* Loop unrolling: Compute 4 outputs at a time */ + sample = blockSize >> 2U; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + /* acc = b0 * x[n] */ + /* acc = (q31_t) (((q63_t) b1 * Xn1) >> 32);*/ + mult_32x32_keep32_R(acc, b1, Xn1); + /* acc += b1 * x[n-1] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b0 * (Xn))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b0, Xn); + /* acc += b[2] * x[n-2] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn2))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b2, Xn2); + /* acc += a1 * y[n-1] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn1))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a1, Yn1); + /* acc += a2 * y[n-2] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn2))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a2, Yn2); + + /* The result is converted to 1.31 , Yn2 variable is reused */ + Yn2 = acc << shift; + + /* Read the second input */ + Xn2 = *(pIn + 1U); + + /* Store the output in the destination buffer. */ + *pOut = Yn2; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + /* acc = b0 * x[n] */ + /* acc = (q31_t) (((q63_t) b0 * (Xn2)) >> 32);*/ + mult_32x32_keep32_R(acc, b0, Xn2); + /* acc += b1 * x[n-1] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b1 * (Xn))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b1, Xn); + /* acc += b[2] * x[n-2] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn1))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b2, Xn1); + /* acc += a1 * y[n-1] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn2))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a1, Yn2); + /* acc += a2 * y[n-2] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn1))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a2, Yn1); + + /* The result is converted to 1.31, Yn1 variable is reused */ + Yn1 = acc << shift; + + /* Read the third input */ + Xn1 = *(pIn + 2U); + + /* Store the output in the destination buffer. */ + *(pOut + 1U) = Yn1; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + /* acc = b0 * x[n] */ + /* acc = (q31_t) (((q63_t) b0 * (Xn1)) >> 32);*/ + mult_32x32_keep32_R(acc, b0, Xn1); + /* acc += b1 * x[n-1] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b1 * (Xn2))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b1, Xn2); + /* acc += b[2] * x[n-2] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b2, Xn); + /* acc += a1 * y[n-1] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn1))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a1, Yn1); + /* acc += a2 * y[n-2] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn2))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a2, Yn2); + + /* The result is converted to 1.31, Yn2 variable is reused */ + Yn2 = acc << shift; + + /* Read the forth input */ + Xn = *(pIn + 3U); + + /* Store the output in the destination buffer. */ + *(pOut + 2U) = Yn2; + pIn += 4U; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + /* acc = b0 * x[n] */ + /* acc = (q31_t) (((q63_t) b0 * (Xn)) >> 32);*/ + mult_32x32_keep32_R(acc, b0, Xn); + /* acc += b1 * x[n-1] */ + /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b1 * (Xn1))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b1, Xn1); + /* acc += b[2] * x[n-2] */ + /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn2))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b2, Xn2); + /* acc += a1 * y[n-1] */ + /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn2))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a1, Yn2); + /* acc += a2 * y[n-2] */ + /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn1))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a2, Yn1); + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + Xn2 = Xn1; + + /* The result is converted to 1.31, Yn1 variable is reused */ + Yn1 = acc << shift; + + /* Xn1 = Xn */ + Xn1 = Xn; + + /* Store the output in the destination buffer. */ + *(pOut + 3U) = Yn1; + pOut += 4U; + + /* decrement loop counter */ + sample--; + } + + /* Loop unrolling: Compute remaining outputs */ + sample = (blockSize & 0x3U); + +#else + + /* Initialize blkCnt with number of samples */ + sample = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + /* acc = b0 * x[n] */ + /* acc = (q31_t) (((q63_t) b0 * (Xn)) >> 32);*/ + mult_32x32_keep32_R(acc, b0, Xn); + /* acc += b1 * x[n-1] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b1 * (Xn1))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b1, Xn1); + /* acc += b[2] * x[n-2] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn2))) >> 32);*/ + multAcc_32x32_keep32_R(acc, b2, Xn2); + /* acc += a1 * y[n-1] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn1))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a1, Yn1); + /* acc += a2 * y[n-2] */ + /* acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn2))) >> 32);*/ + multAcc_32x32_keep32_R(acc, a2, Yn2); + + /* The result is converted to 1.31 */ + acc = acc << shift; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + Yn1 = acc; + + /* Store the output in the destination buffer. */ + *pOut++ = acc; + + /* decrement loop counter */ + sample--; + } + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent stages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset to destination pointer */ + pOut = pDst; + + /* Store the updated state variables back into the pState array */ + *pState++ = Xn1; + *pState++ = Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + } while (--stage); +} + +/** + @} end of BiquadCascadeDF1 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c new file mode 100644 index 0000000..f51c262 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c @@ -0,0 +1,91 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_init_f32.c + * Description: Floating-point Biquad cascade DirectFormI(DF1) filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF1 + @{ + */ + +/** + @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. + @return none + + @par Coefficient and State Ordering + The coefficients are stored in the array pCoeffs in the following order: +
+      {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
+  
+ + @par + where b1x and a1x are the coefficients for the first stage, + b2x and a2x are the coefficients for the second stage, + and so on. The pCoeffs array contains a total of 5*numStages values. + @par + The pState is a pointer to state array. + Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. + The state variables are arranged in the pState array as: +
+      {x[n-1], x[n-2], y[n-1], y[n-2]}
+  
+ The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. + The state array has a total length of 4*numStages values. + The state variables are updated after each block of data is processed; the coefficients are untouched. + */ + +void arm_biquad_cascade_df1_init_f32( + arm_biquad_casd_df1_inst_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pState) +{ + /* Assign filter stages */ + S->numStages = numStages; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always 4 * numStages */ + memset(pState, 0, (4U * (uint32_t) numStages) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of BiquadCascadeDF1 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c new file mode 100644 index 0000000..c2e542c --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c @@ -0,0 +1,96 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_init_q15.c + * Description: Q15 Biquad cascade DirectFormI(DF1) filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF1 + @{ + */ + +/** + @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 accumulator result. Varies according to the coefficients format + @return none + + @par Coefficient and State Ordering + The coefficients are stored in the array pCoeffs in the following order: +
+      {b10, 0, b11, b12, a11, a12, b20, 0, b21, b22, a21, a22, ...}
+  
+ @par + where b1x and a1x are the coefficients for the first stage, + b2x and a2x are the coefficients for the second stage, + and so on. The pCoeffs array contains a total of 6*numStages values. + The zero coefficient between b1 and b2 facilities use of 16-bit SIMD instructions on the Cortex-M4. + @par + The state variables are stored in the array pState. + Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. + The state variables are arranged in the pState array as: +
+      {x[n-1], x[n-2], y[n-1], y[n-2]}
+  
+ The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. + The state array has a total length of 4*numStages values. + The state variables are updated after each block of data is processed; the coefficients are untouched. + */ + +void arm_biquad_cascade_df1_init_q15( + arm_biquad_casd_df1_inst_q15 * S, + uint8_t numStages, + const q15_t * pCoeffs, + q15_t * pState, + int8_t postShift) +{ + /* Assign filter stages */ + S->numStages = numStages; + + /* Assign postShift to be applied to the output */ + S->postShift = postShift; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always 4 * numStages */ + memset(pState, 0, (4U * (uint32_t) numStages) * sizeof(q15_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of BiquadCascadeDF1 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c new file mode 100644 index 0000000..8637889 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c @@ -0,0 +1,95 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_init_q31.c + * Description: Q31 Biquad cascade DirectFormI(DF1) filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF1 + @{ + */ + +/** + @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 after the accumulator. Varies according to the coefficients format + @return none + + @par Coefficient and State Ordering + The coefficients are stored in the array pCoeffs in the following order: +
+      {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
+  
+ @par + where b1x and a1x are the coefficients for the first stage, + b2x and a2x are the coefficients for the second stage, + and so on. The pCoeffs array contains a total of 5*numStages values. + @par + The pState points to state variables array. + Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. + The state variables are arranged in the pState array as: +
+      {x[n-1], x[n-2], y[n-1], y[n-2]}
+  
+ The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. + The state array has a total length of 4*numStages values. + The state variables are updated after each block of data is processed; the coefficients are untouched. + */ + +void arm_biquad_cascade_df1_init_q31( + arm_biquad_casd_df1_inst_q31 * S, + uint8_t numStages, + const q31_t * pCoeffs, + q31_t * pState, + int8_t postShift) +{ + /* Assign filter stages */ + S->numStages = numStages; + + /* Assign postShift to be applied to the output */ + S->postShift = postShift; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always 4 * numStages */ + memset(pState, 0, (4U * (uint32_t) numStages) * sizeof(q31_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of BiquadCascadeDF1 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c new file mode 100644 index 0000000..9e23897 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c @@ -0,0 +1,363 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_q15.c + * Description: Processing function for the Q15 Biquad cascade DirectFormI(DF1) filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF1 + @{ + */ + +/** + @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 location where the output result is written + @param[in] blockSize number of samples to process + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both coefficients 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. + The accumulator is then shifted by postShift bits to truncate the result to 1.15 format by discarding the low 16 bits. + Finally, the result is saturated to 1.15 format. + @remark + Refer to \ref arm_biquad_cascade_df1_fast_q15() for a faster but less precise implementation of this filter. + */ + +void arm_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + + +#if defined (ARM_MATH_DSP) + + const q15_t *pIn = pSrc; /* Source pointer */ + q15_t *pOut = pDst; /* Destination pointer */ + q31_t in; /* Temporary variable to hold input value */ + q31_t out; /* Temporary variable to hold output value */ + q31_t b0; /* Temporary variable to hold bo value */ + q31_t b1, a1; /* Filter coefficients */ + q31_t state_in, state_out; /* Filter state variables */ + q31_t acc_l, acc_h; + q63_t acc; /* Accumulator */ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + int32_t lShift = (15 - (int32_t) S->postShift); /* Post shift */ + uint32_t sample, stage = (uint32_t) S->numStages; /* Stage loop counter */ + int32_t uShift = (32 - lShift); + + do + { + /* Read the b0 and 0 coefficients using SIMD */ + b0 = read_q15x2_ia ((q15_t **) &pCoeffs); + + /* Read the b1 and b2 coefficients using SIMD */ + b1 = read_q15x2_ia ((q15_t **) &pCoeffs); + + /* Read the a1 and a2 coefficients using SIMD */ + a1 = read_q15x2_ia ((q15_t **) &pCoeffs); + + /* Read the input state values from the state buffer: x[n-1], x[n-2] */ + state_in = read_q15x2_ia (&pState); + + /* Read the output state values from the state buffer: y[n-1], y[n-2] */ + state_out = read_q15x2_da (&pState); + + /* Apply loop unrolling and compute 2 output values simultaneously. */ + /* The variable acc hold output values that are being computed: + * + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + sample = blockSize >> 1U; + + /* First part of the processing with loop unrolling. Compute 2 outputs at a time. + ** a second loop below computes the remaining 1 sample. */ + while (sample > 0U) + { + + /* Read the input */ + in = read_q15x2_ia ((q15_t **) &pIn); + + /* out = b0 * x[n] + 0 * 0 */ + out = __SMUAD(b0, in); + + /* acc += b1 * x[n-1] + b2 * x[n-2] + out */ + acc = __SMLALD(b1, state_in, out); + /* acc += a1 * y[n-1] + a2 * y[n-2] */ + acc = __SMLALD(a1, state_out, acc); + + /* The result is converted from 3.29 to 1.31 if postShift = 1, and then saturation is applied */ + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + out = (uint32_t) acc_l >> lShift | acc_h << uShift; + + out = __SSAT(out, 16); + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ + /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ + +#ifndef ARM_MATH_BIG_ENDIAN + state_in = __PKHBT(in, state_in, 16); + state_out = __PKHBT(out, state_out, 16); +#else + state_in = __PKHBT(state_in >> 16, (in >> 16), 16); + state_out = __PKHBT(state_out >> 16, (out), 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* out = b0 * x[n] + 0 * 0 */ + out = __SMUADX(b0, in); + /* acc += b1 * x[n-1] + b2 * x[n-2] + out */ + acc = __SMLALD(b1, state_in, out); + /* acc += a1 * y[n-1] + a2 * y[n-2] */ + acc = __SMLALD(a1, state_out, acc); + + /* The result is converted from 3.29 to 1.31 if postShift = 1, and then saturation is applied */ + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + out = (uint32_t) acc_l >> lShift | acc_h << uShift; + + out = __SSAT(out, 16); + + /* Store the output in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT(state_out, out, 16)); +#else + write_q15x2_ia (&pOut, __PKHBT(out, state_out >> 16, 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ + /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ +#ifndef ARM_MATH_BIG_ENDIAN + state_in = __PKHBT(in >> 16, state_in, 16); + state_out = __PKHBT(out, state_out, 16); +#else + state_in = __PKHBT(state_in >> 16, in, 16); + state_out = __PKHBT(state_out >> 16, out, 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Decrement loop counter */ + sample--; + } + + /* If the blockSize is not a multiple of 2, compute any remaining output samples here. + ** No loop unrolling is used. */ + + if ((blockSize & 0x1U) != 0U) + { + /* Read the input */ + in = *pIn++; + + /* out = b0 * x[n] + 0 * 0 */ +#ifndef ARM_MATH_BIG_ENDIAN + out = __SMUAD(b0, in); +#else + out = __SMUADX(b0, in); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* acc = b1 * x[n-1] + b2 * x[n-2] + out */ + acc = __SMLALD(b1, state_in, out); + /* acc += a1 * y[n-1] + a2 * y[n-2] */ + acc = __SMLALD(a1, state_out, acc); + + /* The result is converted from 3.29 to 1.31 if postShift = 1, and then saturation is applied */ + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + out = (uint32_t) acc_l >> lShift | acc_h << uShift; + + out = __SSAT(out, 16); + + /* Store the output in the destination buffer. */ + *pOut++ = (q15_t) out; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ + /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ +#ifndef ARM_MATH_BIG_ENDIAN + state_in = __PKHBT(in, state_in, 16); + state_out = __PKHBT(out, state_out, 16); +#else + state_in = __PKHBT(state_in >> 16, in, 16); + state_out = __PKHBT(state_out >> 16, out, 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + } + + /* The first stage goes from the input wire to the output wire. */ + /* Subsequent numStages occur in-place in the output wire */ + pIn = pDst; + + /* Reset the output pointer */ + pOut = pDst; + + /* Store the updated state variables back into the state array */ + write_q15x2_ia (&pState, state_in); + write_q15x2_ia (&pState, state_out); + + /* Decrement loop counter */ + stage--; + + } while (stage > 0U); + +#else + + const q15_t *pIn = pSrc; /* Source pointer */ + q15_t *pOut = pDst; /* Destination pointer */ + q15_t b0, b1, b2, a1, a2; /* Filter coefficients */ + q15_t Xn1, Xn2, Yn1, Yn2; /* Filter state variables */ + q15_t Xn; /* temporary input */ + q63_t acc; /* Accumulator */ + int32_t shift = (15 - (int32_t) S->postShift); /* Post shift */ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + uint32_t sample, stage = (uint32_t) S->numStages; /* Stage loop counter */ + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + pCoeffs++; // skip the 0 coefficient + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the state values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + + /* The variables acc holds the output value that is computed: + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + /* acc = b0 * x[n] */ + acc = (q31_t) b0 *Xn; + + /* acc += b1 * x[n-1] */ + acc += (q31_t) b1 *Xn1; + /* acc += b[2] * x[n-2] */ + acc += (q31_t) b2 *Xn2; + /* acc += a1 * y[n-1] */ + acc += (q31_t) a1 *Yn1; + /* acc += a2 * y[n-2] */ + acc += (q31_t) a2 *Yn2; + + /* The result is converted to 1.31 */ + acc = __SSAT((acc >> shift), 16); + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + Yn1 = (q15_t) acc; + + /* Store the output in the destination buffer. */ + *pOut++ = (q15_t) acc; + + /* decrement the loop counter */ + sample--; + } + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent stages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset to destination pointer */ + pOut = pDst; + + /* Store the updated state variables back into the pState array */ + *pState++ = Xn1; + *pState++ = Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + } while (--stage); + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + +/** + @} end of BiquadCascadeDF1 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c new file mode 100644 index 0000000..011e21d --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c @@ -0,0 +1,247 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df1_q31.c + * Description: Processing function for the Q31 Biquad cascade filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF1 + @{ + */ + +/** + @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 + @return none + + @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 and lie in the range [-0.25 +0.25). + After all 5 multiply-accumulates are performed, the 2.62 accumulator is shifted by postShift bits and the result truncated to + 1.31 format by discarding the low 32 bits. + @remark + Refer to \ref arm_biquad_cascade_df1_fast_q31() for a faster but less precise implementation of this filter. + */ + +void arm_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + const q31_t *pIn = pSrc; /* Source pointer */ + q31_t *pOut = pDst; /* Destination pointer */ + q31_t *pState = S->pState; /* pState pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q63_t acc; /* Accumulator */ + q31_t b0, b1, b2, a1, a2; /* Filter coefficients */ + q31_t Xn1, Xn2, Yn1, Yn2; /* Filter pState variables */ + q31_t Xn; /* Temporary input */ + uint32_t uShift = ((uint32_t) S->postShift + 1U); + uint32_t lShift = 32U - uShift; /* Shift to be applied to the output */ + uint32_t sample, stage = S->numStages; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc_l, acc_h; /* temporary output variables */ +#endif + + do + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /* Reading the pState values */ + Xn1 = pState[0]; + Xn2 = pState[1]; + Yn1 = pState[2]; + Yn2 = pState[3]; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Apply loop unrolling and compute 4 output values simultaneously. */ + /* Variable acc hold output values that are being computed: + * + * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] + */ + + /* Loop unrolling: Compute 4 outputs at a time */ + sample = blockSize >> 2U; + + while (sample > 0U) + { + /* Read the first input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = ((q63_t) b0 * Xn) + ((q63_t) b1 * Xn1) + ((q63_t) b2 * Xn2) + ((q63_t) a1 * Yn1) + ((q63_t) a2 * Yn2); + + /* The result is converted to 1.31 , Yn2 variable is reused */ + acc_l = (acc ) & 0xffffffff; /* Calc lower part of acc */ + acc_h = (acc >> 32) & 0xffffffff; /* Calc upper part of acc */ + + /* Apply shift for lower part of acc and upper part of acc */ + Yn2 = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store output in destination buffer. */ + *pOut++ = Yn2; + + /* Read the second input */ + Xn2 = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = ((q63_t) b0 * Xn2) + ((q63_t) b1 * Xn) + ((q63_t) b2 * Xn1) + ((q63_t) a1 * Yn2) + ((q63_t) a2 * Yn1); + + /* The result is converted to 1.31, Yn1 variable is reused */ + acc_l = (acc ) & 0xffffffff; /* Calc lower part of acc */ + acc_h = (acc >> 32) & 0xffffffff; /* Calc upper part of acc */ + + /* Apply shift for lower part of acc and upper part of acc */ + Yn1 = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store output in destination buffer. */ + *pOut++ = Yn1; + + /* Read the third input */ + Xn1 = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = ((q63_t) b0 * Xn1) + ((q63_t) b1 * Xn2) + ((q63_t) b2 * Xn) + ((q63_t) a1 * Yn1) + ((q63_t) a2 * Yn2); + + /* The result is converted to 1.31, Yn2 variable is reused */ + acc_l = (acc ) & 0xffffffff; /* Calc lower part of acc */ + acc_h = (acc >> 32) & 0xffffffff; /* Calc upper part of acc */ + + /* Apply shift for lower part of acc and upper part of acc */ + Yn2 = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store output in destination buffer. */ + *pOut++ = Yn2; + + /* Read the forth input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = ((q63_t) b0 * Xn) + ((q63_t) b1 * Xn1) + ((q63_t) b2 * Xn2) + ((q63_t) a1 * Yn2) + ((q63_t) a2 * Yn1); + + /* The result is converted to 1.31, Yn1 variable is reused */ + acc_l = (acc ) & 0xffffffff; /* Calc lower part of acc */ + acc_h = (acc >> 32) & 0xffffffff; /* Calc upper part of acc */ + + /* Apply shift for lower part of acc and upper part of acc */ + Yn1 = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store output in destination buffer. */ + *pOut++ = Yn1; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + + /* decrement loop counter */ + sample--; + } + + /* Loop unrolling: Compute remaining outputs */ + sample = blockSize & 0x3U; + +#else + + /* Initialize blkCnt with number of samples */ + sample = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (sample > 0U) + { + /* Read the input */ + Xn = *pIn++; + + /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ + acc = ((q63_t) b0 * Xn) + ((q63_t) b1 * Xn1) + ((q63_t) b2 * Xn2) + ((q63_t) a1 * Yn1) + ((q63_t) a2 * Yn2); + + /* The result is converted to 1.31 */ + acc = acc >> lShift; + + /* Store output in destination buffer. */ + *pOut++ = (q31_t) acc; + + /* Every time after the output is computed state should be updated. */ + /* The states should be updated as: */ + /* Xn2 = Xn1 */ + /* Xn1 = Xn */ + /* Yn2 = Yn1 */ + /* Yn1 = acc */ + Xn2 = Xn1; + Xn1 = Xn; + Yn2 = Yn1; + Yn1 = (q31_t) acc; + + /* decrement loop counter */ + sample--; + } + + /* Store the updated state variables back into the pState array */ + *pState++ = Xn1; + *pState++ = Xn2; + *pState++ = Yn1; + *pState++ = Yn2; + + /* The first stage goes from the input buffer to the output buffer. */ + /* Subsequent numStages occur in-place in the output buffer */ + pIn = pDst; + + /* Reset output pointer */ + pOut = pDst; + + /* decrement loop counter */ + stage--; + + } while (stage > 0U); + +} + +/** + @} end of BiquadCascadeDF1 group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c new file mode 100644 index 0000000..596b434 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c @@ -0,0 +1,523 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df2T_f32.c + * Description: Processing function for floating-point transposed direct form II Biquad cascade filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters +*/ + +/** + @addtogroup BiquadCascadeDF2T + @{ + */ + +/** + @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 + @return none + */ + +#if defined(ARM_MATH_NEON) + +void arm_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + const float32_t *pIn = pSrc; /* source pointer */ + float32_t *pOut = pDst; /* destination pointer */ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ + float32_t acc1; /* accumulator */ + float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ + float32_t Xn1; /* temporary input */ + float32_t d1, d2; /* state variables */ + uint32_t sample, stageCnt,stage = S->numStages; /* loop counters */ + + + float32_t Xn2, Xn3, Xn4; /* Input State variables */ + float32_t acc2, acc3, acc4; /* accumulator */ + + + float32_t p0, p1, p2, p3, p4, A1; + + float32x4_t XnV, YnV; + float32x4x2_t dV; + float32x4_t zeroV = vdupq_n_f32(0.0); + float32x4_t t1,t2,t3,t4,b1V,b2V,a1V,a2V,s; + + /* Loop unrolling. Compute 4 outputs at a time */ + stageCnt = stage >> 2; + + while (stageCnt > 0U) + { + /* Reading the coefficients */ + t1 = vld1q_f32(pCoeffs); + pCoeffs += 4; + + t2 = vld1q_f32(pCoeffs); + pCoeffs += 4; + + t3 = vld1q_f32(pCoeffs); + pCoeffs += 4; + + t4 = vld1q_f32(pCoeffs); + pCoeffs += 4; + + b1V = vld1q_f32(pCoeffs); + pCoeffs += 4; + + b2V = vld1q_f32(pCoeffs); + pCoeffs += 4; + + a1V = vld1q_f32(pCoeffs); + pCoeffs += 4; + + a2V = vld1q_f32(pCoeffs); + pCoeffs += 4; + + /* Reading the state values */ + dV = vld2q_f32(pState); + + sample = blockSize; + + while (sample > 0U) { + /* y[n] = b0 * x[n] + d1 */ + /* d1 = b1 * x[n] + a1 * y[n] + d2 */ + /* d2 = b2 * x[n] + a2 * y[n] */ + + XnV = vdupq_n_f32(*pIn++); + + s = dV.val[0]; + YnV = s; + + s = vextq_f32(zeroV,dV.val[0],3); + YnV = vmlaq_f32(YnV, t1, s); + + s = vextq_f32(zeroV,dV.val[0],2); + YnV = vmlaq_f32(YnV, t2, s); + + s = vextq_f32(zeroV,dV.val[0],1); + YnV = vmlaq_f32(YnV, t3, s); + + YnV = vmlaq_f32(YnV, t4, XnV); + + s = vextq_f32(XnV,YnV,3); + + dV.val[0] = vmlaq_f32(dV.val[1], s, b1V); + dV.val[0] = vmlaq_f32(dV.val[0], YnV, a1V); + + dV.val[1] = vmulq_f32(s, b2V); + dV.val[1] = vmlaq_f32(dV.val[1], YnV, a2V); + + *pOut++ = YnV[3]; + + sample--; + } + + /* Store the updated state variables back into the state array */ + vst2q_f32(pState,dV); + pState += 8; + + /* The current stage input is given as the output to the next stage */ + pIn = pDst; + + /*Reset the output working pointer */ + pOut = pDst; + + /* decrement the loop counter */ + stageCnt--; + + } + + /* Tail */ + stageCnt = stage & 3; + + while (stageCnt > 0U) + { + /* Reading the coefficients */ + b0 = *pCoeffs++; + b1 = *pCoeffs++; + b2 = *pCoeffs++; + a1 = *pCoeffs++; + a2 = *pCoeffs++; + + /*Reading the state values */ + d1 = pState[0]; + d2 = pState[1]; + + sample = blockSize; + + while (sample > 0U) + { + /* Read the input */ + Xn1 = *pIn++; + + /* y[n] = b0 * x[n] + d1 */ + acc1 = (b0 * Xn1) + d1; + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = acc1; + + /* Every time after the output is computed state should be updated. */ + /* d1 = b1 * x[n] + a1 * y[n] + d2 */ + d1 = ((b1 * Xn1) + (a1 * acc1)) + d2; + + /* d2 = b2 * x[n] + a2 * y[n] */ + d2 = (b2 * Xn1) + (a2 * acc1); + + /* decrement the loop counter */ + sample--; + } + + /* Store the updated state variables back into the state array */ + *pState++ = d1; + *pState++ = d2; + + /* The current stage input is given as the output to the next stage */ + pIn = pDst; + + /*Reset the output working pointer */ + pOut = pDst; + + /* decrement the loop counter */ + stageCnt--; + } +} +#else +LOW_OPTIMIZATION_ENTER +void arm_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + const float32_t *pIn = pSrc; /* Source pointer */ + float32_t *pOut = pDst; /* Destination pointer */ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t acc1; /* Accumulator */ + float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ + float32_t Xn1; /* Temporary input */ + float32_t d1, d2; /* State variables */ + uint32_t sample, stage = S->numStages; /* Loop counters */ + + do + { + /* Reading the coefficients */ + b0 = pCoeffs[0]; + b1 = pCoeffs[1]; + b2 = pCoeffs[2]; + a1 = pCoeffs[3]; + a2 = pCoeffs[4]; + + /* Reading the state values */ + d1 = pState[0]; + d2 = pState[1]; + + pCoeffs += 5U; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 16 outputs at a time */ + sample = blockSize >> 4U; + + while (sample > 0U) { + + /* y[n] = b0 * x[n] + d1 */ + /* d1 = b1 * x[n] + a1 * y[n] + d2 */ + /* d2 = b2 * x[n] + a2 * y[n] */ + +/* 1 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 2 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 3 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 4 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 5 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 6 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 7 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 8 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 9 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 10 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 11 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 12 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 13 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 14 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 15 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 16 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + + /* decrement loop counter */ + sample--; + } + + /* Loop unrolling: Compute remaining outputs */ + sample = blockSize & 0xFU; + +#else + + /* Initialize blkCnt with number of samples */ + sample = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (sample > 0U) { + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + + /* decrement loop counter */ + sample--; + } + + /* Store the updated state variables back into the state array */ + pState[0] = d1; + pState[1] = d2; + + pState += 2U; + + /* The current stage input is given as the output to the next stage */ + pIn = pDst; + + /* Reset the output working pointer */ + pOut = pDst; + + /* decrement loop counter */ + stage--; + + } while (stage > 0U); + +} +LOW_OPTIMIZATION_EXIT +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of BiquadCascadeDF2T group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c new file mode 100644 index 0000000..a8af8ce --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c @@ -0,0 +1,443 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df2T_f64.c + * Description: Processing function for floating-point transposed direct form II Biquad cascade filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters +*/ + +/** + @defgroup BiquadCascadeDF2T Biquad Cascade IIR Filters Using a Direct Form II Transposed Structure + + This set of functions implements arbitrary order recursive (IIR) filters using a transposed direct form II structure. + The filters are implemented as a cascade of second order Biquad sections. + These functions provide a slight memory savings as compared to the direct form I Biquad filter functions. + Only floating-point data is supported. + + This function operate on blocks of input and output data and each call to the function + processes blockSize samples through the filter. + pSrc points to the array of input data and + pDst points to the array of output data. + Both arrays contain blockSize values. + + @par Algorithm + Each Biquad stage implements a second order filter using the difference equation: +
+     y[n] = b0 * x[n] + d1
+     d1 = b1 * x[n] + a1 * y[n] + d2
+     d2 = b2 * x[n] + a2 * y[n]
+  
+ where d1 and d2 represent the two state values. + @par + A Biquad filter using a transposed Direct Form II structure is shown below. + \image html BiquadDF2Transposed.gif "Single transposed Direct Form II Biquad" + Coefficients b0, b1, and b2 multiply the input signal x[n] and are referred to as the feedforward coefficients. + Coefficients a1 and a2 multiply the output signal y[n] and are referred to as the feedback coefficients. + Pay careful attention to the sign of the feedback coefficients. + Some design tools flip the sign of the feedback coefficients: +
+     y[n] = b0 * x[n] + d1;
+     d1 = b1 * x[n] - a1 * y[n] + d2;
+     d2 = b2 * x[n] - a2 * y[n];
+  
+ In this case the feedback coefficients a1 and a2 must be negated when used with the CMSIS DSP Library. + @par + Higher order filters are realized as a cascade of second order sections. + numStages refers to the number of second order stages used. + For example, an 8th order filter would be realized with numStages=4 second order stages. + A 9th order filter would be realized with numStages=5 second order stages with the + coefficients for one of the stages configured as a first order filter (b2=0 and a2=0). + @par + pState points to the state variable array. + Each Biquad stage has 2 state variables d1 and d2. + The state variables are arranged in the pState array as: +
+      {d11, d12, d21, d22, ...}
+  
+ where d1x refers to the state variables for the first Biquad and + d2x refers to the state variables for the second Biquad. + The state array has a total length of 2*numStages values. + The state variables are updated after each block of data is processed; the coefficients are untouched. + @par + The CMSIS library contains Biquad filters in both Direct Form I and transposed Direct Form II. + The advantage of the Direct Form I structure is that it is numerically more robust for fixed-point data types. + That is why the Direct Form I structure supports Q15 and Q31 data types. + The transposed Direct Form II structure, on the other hand, requires a wide dynamic range for the state variables d1 and d2. + Because of this, the CMSIS library only has a floating-point version of the Direct Form II Biquad. + The advantage of the Direct Form II Biquad is that it requires half the number of state variables, 2 rather than 4, per Biquad stage. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter. + Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. + + @par Init Functions + There is also an associated initialization function. + The initialization function performs following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numStages, pCoeffs, pState. Also set all of the values in pState to zero. + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + Set the values in the state buffer to zeros before static initialization. + For example, to statically initialize the instance structure use +
+      arm_biquad_cascade_df2T_instance_f64 S1 = {numStages, pState, pCoeffs};
+      arm_biquad_cascade_df2T_instance_f32 S1 = {numStages, pState, pCoeffs};
+  
+ where numStages is the number of Biquad stages in the filter; + pState is the address of the state buffer. + pCoeffs is the address of the coefficient buffer; +*/ + +/** + @addtogroup BiquadCascadeDF2T + @{ + */ + +/** + @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 + @return none + */ + +LOW_OPTIMIZATION_ENTER +void arm_biquad_cascade_df2T_f64( + const arm_biquad_cascade_df2T_instance_f64 * S, + float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize) +{ + + float64_t *pIn = pSrc; /* Source pointer */ + float64_t *pOut = pDst; /* Destination pointer */ + float64_t *pState = S->pState; /* State pointer */ + float64_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float64_t acc1; /* Accumulator */ + float64_t b0, b1, b2, a1, a2; /* Filter coefficients */ + float64_t Xn1; /* Temporary input */ + float64_t d1, d2; /* State variables */ + uint32_t sample, stage = S->numStages; /* Loop counters */ + + + do + { + /* Reading the coefficients */ + b0 = pCoeffs[0]; + b1 = pCoeffs[1]; + b2 = pCoeffs[2]; + a1 = pCoeffs[3]; + a2 = pCoeffs[4]; + + /* Reading the state values */ + d1 = pState[0]; + d2 = pState[1]; + + pCoeffs += 5U; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 16 outputs at a time */ + sample = blockSize >> 4U; + + while (sample > 0U) { + + /* y[n] = b0 * x[n] + d1 */ + /* d1 = b1 * x[n] + a1 * y[n] + d2 */ + /* d2 = b2 * x[n] + a2 * y[n] */ + +/* 1 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + + +/* 2 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 3 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 4 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 5 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 6 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 7 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 8 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 9 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 10 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 11 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 12 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 13 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 14 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 15 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + +/* 16 */ + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + + /* decrement loop counter */ + sample--; + } + + /* Loop unrolling: Compute remaining outputs */ + sample = blockSize & 0xFU; + +#else + + /* Initialize blkCnt with number of samples */ + sample = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (sample > 0U) { + Xn1 = *pIn++; + + acc1 = b0 * Xn1 + d1; + + d1 = b1 * Xn1 + d2; + d1 += a1 * acc1; + + d2 = b2 * Xn1; + d2 += a2 * acc1; + + *pOut++ = acc1; + + /* decrement loop counter */ + sample--; + } + + /* Store the updated state variables back into the state array */ + pState[0] = d1; + pState[1] = d2; + + pState += 2U; + + /* The current stage input is given as the output to the next stage */ + pIn = pDst; + + /* Reset the output working pointer */ + pOut = pDst; + + /* decrement loop counter */ + stage--; + + } while (stage > 0U); + +} +LOW_OPTIMIZATION_EXIT + +/** + @} end of BiquadCascadeDF2T group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c new file mode 100644 index 0000000..23cf2d2 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c @@ -0,0 +1,211 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df2T_init_f32.c + * Description: Initialization function for floating-point transposed direct form II Biquad cascade filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF2T + @{ + */ + +/** + @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. + @return none + + @par Coefficient and State Ordering + The coefficients are stored in the array pCoeffs in the following order + in the not Neon version. +
+      {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
+  
+ + @par + where b1x and a1x are the coefficients for the first stage, + b2x and a2x are the coefficients for the second stage, + and so on. The pCoeffs array contains a total of 5*numStages values. + + For Neon version, this array is bigger. If numstages = 4x + y, then the array has size: + 32*x + 5*y + and it must be initialized using the function + arm_biquad_cascade_df2T_compute_coefs_f32 which is taking the + standard array coefficient as parameters. + + But, an array of 8*numstages is a good approximation. + + Then, the initialization can be done with: +
+                   arm_biquad_cascade_df2T_init_f32(&SNeon, nbCascade, neonCoefs, stateNeon);
+                   arm_biquad_cascade_df2T_compute_coefs_f32(&SNeon,nbCascade,coefs);
+  
+ + @par In this example, neonCoefs is a bigger array of size 8 * numStages. + coefs is the standard array: + +
+      {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
+  
+ + + @par + The pState is a pointer to state array. + Each Biquad stage has 2 state variables d1, and d2. + The 2 state variables for stage 1 are first, then the 2 state variables for stage 2, and so on. + The state array has a total length of 2*numStages values. + The state variables are updated after each block of data is processed; the coefficients are untouched. + */ + +#if defined(ARM_MATH_NEON) +/* + +Must be called after initializing the biquad instance. +pCoeffs has size 5 * nbCascade +Whereas the pCoeffs for the init has size (4*4 + 4*4)* nbCascade + +So this pCoeffs is the one which would be used for the not Neon version. +The pCoeffs passed in init is bigger than the one for the not Neon version. + +*/ +void arm_biquad_cascade_df2T_compute_coefs_f32( + arm_biquad_cascade_df2T_instance_f32 * S, + uint8_t numStages, + float32_t * pCoeffs) +{ + uint8_t cnt; + float32_t *pDstCoeffs; + float32_t b0[4],b1[4],b2[4],a1[4],a2[4]; + + pDstCoeffs = S->pCoeffs; + + cnt = numStages >> 2; + while(cnt > 0) + { + for(int i=0;i<4;i++) + { + b0[i] = pCoeffs[0]; + b1[i] = pCoeffs[1]; + b2[i] = pCoeffs[2]; + a1[i] = pCoeffs[3]; + a2[i] = pCoeffs[4]; + pCoeffs += 5; + } + + /* Vec 1 */ + *pDstCoeffs++ = 0; + *pDstCoeffs++ = b0[1]; + *pDstCoeffs++ = b0[2]; + *pDstCoeffs++ = b0[3]; + + /* Vec 2 */ + *pDstCoeffs++ = 0; + *pDstCoeffs++ = 0; + *pDstCoeffs++ = b0[1] * b0[2]; + *pDstCoeffs++ = b0[2] * b0[3]; + + /* Vec 3 */ + *pDstCoeffs++ = 0; + *pDstCoeffs++ = 0; + *pDstCoeffs++ = 0; + *pDstCoeffs++ = b0[1] * b0[2] * b0[3]; + + /* Vec 4 */ + *pDstCoeffs++ = b0[0]; + *pDstCoeffs++ = b0[0] * b0[1]; + *pDstCoeffs++ = b0[0] * b0[1] * b0[2]; + *pDstCoeffs++ = b0[0] * b0[1] * b0[2] * b0[3]; + + /* Vec 5 */ + *pDstCoeffs++ = b1[0]; + *pDstCoeffs++ = b1[1]; + *pDstCoeffs++ = b1[2]; + *pDstCoeffs++ = b1[3]; + + /* Vec 6 */ + *pDstCoeffs++ = b2[0]; + *pDstCoeffs++ = b2[1]; + *pDstCoeffs++ = b2[2]; + *pDstCoeffs++ = b2[3]; + + /* Vec 7 */ + *pDstCoeffs++ = a1[0]; + *pDstCoeffs++ = a1[1]; + *pDstCoeffs++ = a1[2]; + *pDstCoeffs++ = a1[3]; + + /* Vec 8 */ + *pDstCoeffs++ = a2[0]; + *pDstCoeffs++ = a2[1]; + *pDstCoeffs++ = a2[2]; + *pDstCoeffs++ = a2[3]; + + cnt--; + } + + cnt = numStages & 0x3; + while(cnt > 0) + { + *pDstCoeffs++ = *pCoeffs++; + *pDstCoeffs++ = *pCoeffs++; + *pDstCoeffs++ = *pCoeffs++; + *pDstCoeffs++ = *pCoeffs++; + *pDstCoeffs++ = *pCoeffs++; + cnt--; + } + +} +#endif + +void arm_biquad_cascade_df2T_init_f32( + arm_biquad_cascade_df2T_instance_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pState) +{ + /* Assign filter stages */ + S->numStages = numStages; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always 2 * numStages */ + memset(pState, 0, (2U * (uint32_t) numStages) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of BiquadCascadeDF2T group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c new file mode 100644 index 0000000..fe6901e --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c @@ -0,0 +1,86 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_df2T_init_f64.c + * Description: Initialization function for floating-point transposed direct form II Biquad cascade filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF2T + @{ + */ + +/** + @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 + @return none + + @par Coefficient and State Ordering + The coefficients are stored in the array pCoeffs in the following order: +
+      {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
+  
+ @par + where b1x and a1x are the coefficients for the first stage, + b2x and a2x are the coefficients for the second stage, + and so on. The pCoeffs array contains a total of 5*numStages values. + @par + The pState is a pointer to state array. + Each Biquad stage has 2 state variables d1, and d2. + The 2 state variables for stage 1 are first, then the 2 state variables for stage 2, and so on. + The state array has a total length of 2*numStages values. + The state variables are updated after each block of data is processed; the coefficients are untouched. + */ + +void arm_biquad_cascade_df2T_init_f64( + arm_biquad_cascade_df2T_instance_f64 * S, + uint8_t numStages, + float64_t * pCoeffs, + float64_t * pState) +{ + /* Assign filter stages */ + S->numStages = numStages; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always 2 * numStages */ + memset(pState, 0, (2U * (uint32_t) numStages) * sizeof(float64_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of BiquadCascadeDF2T group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c new file mode 100644 index 0000000..14ae008 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c @@ -0,0 +1,285 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_stereo_df2T_f32.c + * Description: Processing function for floating-point transposed direct form II Biquad cascade filter. 2 channels + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters +*/ + +/** + @addtogroup BiquadCascadeDF2T + @{ + */ + +/** + @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 + @return none + */ + +LOW_OPTIMIZATION_ENTER +void arm_biquad_cascade_stereo_df2T_f32( + const arm_biquad_cascade_stereo_df2T_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + const float32_t *pIn = pSrc; /* Source pointer */ + float32_t *pOut = pDst; /* Destination pointer */ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t acc1a, acc1b; /* Accumulator */ + float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ + float32_t Xn1a, Xn1b; /* Temporary input */ + float32_t d1a, d2a, d1b, d2b; /* State variables */ + uint32_t sample, stage = S->numStages; /* Loop counters */ + + do + { + /* Reading the coefficients */ + b0 = pCoeffs[0]; + b1 = pCoeffs[1]; + b2 = pCoeffs[2]; + a1 = pCoeffs[3]; + a2 = pCoeffs[4]; + + /* Reading the state values */ + d1a = pState[0]; + d2a = pState[1]; + d1b = pState[2]; + d2b = pState[3]; + + pCoeffs += 5U; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 8 outputs at a time */ + sample = blockSize >> 3U; + + while (sample > 0U) { + /* y[n] = b0 * x[n] + d1 */ + /* d1 = b1 * x[n] + a1 * y[n] + d2 */ + /* d2 = b2 * x[n] + a2 * y[n] */ + +/* 1 */ + Xn1a = *pIn++; /* Channel a */ + Xn1b = *pIn++; /* Channel b */ + + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + *pOut++ = acc1a; + *pOut++ = acc1b; + + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + +/* 2 */ + Xn1a = *pIn++; /* Channel a */ + Xn1b = *pIn++; /* Channel b */ + + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + *pOut++ = acc1a; + *pOut++ = acc1b; + + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + +/* 3 */ + Xn1a = *pIn++; /* Channel a */ + Xn1b = *pIn++; /* Channel b */ + + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + *pOut++ = acc1a; + *pOut++ = acc1b; + + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + +/* 4 */ + Xn1a = *pIn++; /* Channel a */ + Xn1b = *pIn++; /* Channel b */ + + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + *pOut++ = acc1a; + *pOut++ = acc1b; + + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + +/* 5 */ + Xn1a = *pIn++; /* Channel a */ + Xn1b = *pIn++; /* Channel b */ + + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + *pOut++ = acc1a; + *pOut++ = acc1b; + + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + +/* 6 */ + Xn1a = *pIn++; /* Channel a */ + Xn1b = *pIn++; /* Channel b */ + + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + *pOut++ = acc1a; + *pOut++ = acc1b; + + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + +/* 7 */ + Xn1a = *pIn++; /* Channel a */ + Xn1b = *pIn++; /* Channel b */ + + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + *pOut++ = acc1a; + *pOut++ = acc1b; + + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + +/* 8 */ + Xn1a = *pIn++; /* Channel a */ + Xn1b = *pIn++; /* Channel b */ + + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + *pOut++ = acc1a; + *pOut++ = acc1b; + + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + + /* decrement loop counter */ + sample--; + } + + /* Loop unrolling: Compute remaining outputs */ + sample = blockSize & 0x7U; + +#else + + /* Initialize blkCnt with number of samples */ + sample = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (sample > 0U) { + /* Read the input */ + Xn1a = *pIn++; /* Channel a */ + Xn1b = *pIn++; /* Channel b */ + + /* y[n] = b0 * x[n] + d1 */ + acc1a = (b0 * Xn1a) + d1a; + acc1b = (b0 * Xn1b) + d1b; + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = acc1a; + *pOut++ = acc1b; + + /* Every time after the output is computed state should be updated. */ + /* d1 = b1 * x[n] + a1 * y[n] + d2 */ + d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; + d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; + + /* d2 = b2 * x[n] + a2 * y[n] */ + d2a = (b2 * Xn1a) + (a2 * acc1a); + d2b = (b2 * Xn1b) + (a2 * acc1b); + + /* decrement loop counter */ + sample--; + } + + /* Store the updated state variables back into the state array */ + pState[0] = d1a; + pState[1] = d2a; + + pState[2] = d1b; + pState[3] = d2b; + + pState += 4U; + + /* The current stage input is given as the output to the next stage */ + pIn = pDst; + + /* Reset the output working pointer */ + pOut = pDst; + + /* Decrement the loop counter */ + stage--; + + } while (stage > 0U); + +} +LOW_OPTIMIZATION_EXIT +/** + @} end of BiquadCascadeDF2T group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c new file mode 100644 index 0000000..d398f18 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c @@ -0,0 +1,86 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_biquad_cascade_stereo_df2T_init_f32.c + * Description: Initialization function for floating-point transposed direct form II Biquad cascade filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup BiquadCascadeDF2T + @{ + */ + +/** + @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. + @return none + + @par Coefficient and State Ordering + The coefficients are stored in the array pCoeffs in the following order: +
+      {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
+  
+ @par + where b1x and a1x are the coefficients for the first stage, + b2x and a2x are the coefficients for the second stage, + and so on. The pCoeffs array contains a total of 5*numStages values. + @par + The pState is a pointer to state array. + Each Biquad stage has 2 state variables d1, and d2 for each channel. + The 2 state variables for stage 1 are first, then the 2 state variables for stage 2, and so on. + The state array has a total length of 2*numStages values. + The state variables are updated after each block of data is processed; the coefficients are untouched. + */ + +void arm_biquad_cascade_stereo_df2T_init_f32( + arm_biquad_cascade_stereo_df2T_instance_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pState) +{ + /* Assign filter stages */ + S->numStages = numStages; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always 4 * numStages */ + memset(pState, 0, (4U * (uint32_t) numStages) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of BiquadCascadeDF2T group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_f32.c new file mode 100644 index 0000000..8fa1308 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_f32.c @@ -0,0 +1,816 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_f32.c + * Description: Convolution of floating-point sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup Conv Convolution + + Convolution is a mathematical operation that operates on two finite length vectors to generate a finite length output vector. + Convolution is similar to correlation and is frequently used in filtering and data analysis. + The CMSIS DSP library contains functions for convolving Q7, Q15, Q31, and floating-point data types. + The library also provides fast versions of the Q15 and Q31 functions. + + @par Algorithm + Let a[n] and b[n] be sequences of length srcALen and + srcBLen samples respectively. Then the convolution +
+     c[n] = a[n] * b[n]
+  
+ @par + is defined as + \image html ConvolutionEquation.gif + @par + Note that c[n] is of length srcALen + srcBLen - 1 and is defined over the interval n=0, 1, 2, ..., srcALen + srcBLen - 2. + pSrcA points to the first input vector of length srcALen and + pSrcB points to the second input vector of length srcBLen. + The output result is written to pDst and the calling function must allocate srcALen+srcBLen-1 words for the result. + @par + Conceptually, when two signals a[n] and b[n] are convolved, + the signal b[n] slides over a[n]. + For each offset \c n, the overlapping portions of a[n] and b[n] are multiplied and summed together. + @par + Note that convolution is a commutative operation: +
+     a[n] * b[n] = b[n] * a[n].
+  
+ @par + This means that switching the A and B arguments to the convolution functions has no effect. + + @par Fixed-Point Behavior + Convolution requires summing up a large number of intermediate products. + As such, the Q7, Q15, and Q31 functions run a risk of overflow and saturation. + Refer to the function specific documentation below for further details of the particular algorithm used. + + @par Fast Versions + Fast versions are supported for Q31 and Q15. Cycles for Fast versions are less compared to Q31 and Q15 of conv and the design requires + the input signals should be scaled down to avoid intermediate overflows. + + @par Opt Versions + Opt versions are supported for Q15 and Q7. Design uses internal scratch buffer for getting good optimisation. + These versions are optimised in cycles and consumes more memory (Scratch memory) compared to Q15 and Q7 versions + */ + +/** + @addtogroup Conv + @{ + */ + +/** + @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. + @return none + */ + +void arm_conv_f32( + const float32_t * pSrcA, + uint32_t srcALen, + const float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst) +{ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + const float32_t *pIn1; /* InputA pointer */ + const float32_t *pIn2; /* InputB pointer */ + float32_t *pOut = pDst; /* Output pointer */ + const float32_t *px; /* Intermediate inputA pointer */ + const float32_t *py; /* Intermediate inputB pointer */ + const float32_t *pSrc1, *pSrc2; /* Intermediate pointers */ + float32_t sum; /* Accumulators */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) + float32_t acc0, acc1, acc2, acc3; /* Accumulators */ + float32_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ +#endif + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + + /* ------------------------ + * Stage1 process + * ----------------------*/ +#if defined(ARM_MATH_NEON) + float32x4_t vec1; + float32x4_t vec2; + float32x4_t res = vdupq_n_f32(0) ; + float32x2_t accum = vdup_n_f32(0); +#endif /* #if defined(ARM_MATH_NEON) */ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + +#if defined(ARM_MATH_NEON) + res = vdupq_n_f32(0) ; + accum = vdup_n_f32(0); + + /* Compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + + while (k > 0U) + { + vec1 = vld1q_f32(px); + vec2 = vld1q_f32(py-3); + vec2 = vrev64q_f32(vec2); + vec2 = vcombine_f32(vget_high_f32(vec2), vget_low_f32(vec2)); + + res = vmlaq_f32(res,vec1, vec2); + + /* Increment pointers */ + px += 4; + py -= 4; + + /* Decrement the loop counter */ + k--; + } + + accum = vpadd_f32(vget_low_f32(res), vget_high_f32(res)); + sum += accum[0] + accum[1]; + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count & 3; +#else + while (k > 0U) + { + /* x[0] * y[srcBLen - 1] */ + sum += *px++ * *py--; + + /* x[1] * y[srcBLen - 2] */ + sum += *px++ * *py--; + + /* x[2] * y[srcBLen - 3] */ + sum += *px++ * *py--; + + /* x[3] * y[srcBLen - 4] */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#endif /* #if defined(ARM_MATH_NEON) */ + +#else + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pIn2 + count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { + +#if defined(ARM_MATH_NEON) + float32x4_t c; + float32x4_t x1v; + float32x4_t x2v; + uint32x4_t x1v_u; + uint32x4_t x2v_u; + uint32x4_t x_u; + float32x4_t x; + float32x4_t res = vdupq_n_f32(0) ; +#endif /* #if defined(ARM_MATH_NEON) */ + +#if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize2 >> 2U; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0.0f; + acc1 = 0.0f; + acc2 = 0.0f; + acc3 = 0.0f; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + +#if defined(ARM_MATH_NEON) + res = vdupq_n_f32(0) ; + + x1v = vld1q_f32(px); + x2v = vld1q_f32(px+4); + + do + { + c = vld1q_f32(py-3); + + px += 4; + x = x1v; + res = vmlaq_n_f32(res,x,c[3]); + + x = vextq_f32(x1v,x2v,1); + + res = vmlaq_n_f32(res,x,c[2]); + + x = vextq_f32(x1v,x2v,2); + + res = vmlaq_n_f32(res,x,c[1]); + + x = vextq_f32(x1v,x2v,3); + + res = vmlaq_n_f32(res,x,c[0]); + + py -= 4; + + x1v = x2v ; + x2v = vld1q_f32(px+4); + + } while (--k); + + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen & 0x3; + + x1v = vld1q_f32(px); + px += 4; + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *(py--); + + res = vmlaq_n_f32(res,x1v,c0); + + /* Reuse the present samples for the next MAC */ + x1v[0] = x1v[1]; + x1v[1] = x1v[2]; + x1v[2] = x1v[3]; + + x1v[3] = *(px++); + + /* Decrement the loop counter */ + k--; + } + + acc0 = res[0]; + acc1 = res[1]; + acc2 = res[2]; + acc3 = res[3]; + +#else + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read y[srcBLen - 1] sample */ + c0 = *py--; + /* Read x[3] sample */ + x3 = *(px); + + /* Perform the multiply-accumulate */ + /* acc0 += x[0] * y[srcBLen - 1] */ + acc0 += x0 * c0; + /* acc1 += x[1] * y[srcBLen - 1] */ + acc1 += x1 * c0; + /* acc2 += x[2] * y[srcBLen - 1] */ + acc2 += x2 * c0; + /* acc3 += x[3] * y[srcBLen - 1] */ + acc3 += x3 * c0; + + /* Read y[srcBLen - 2] sample */ + c0 = *py--; + /* Read x[4] sample */ + x0 = *(px + 1U); + + /* Perform the multiply-accumulate */ + /* acc0 += x[1] * y[srcBLen - 2] */ + acc0 += x1 * c0; + /* acc1 += x[2] * y[srcBLen - 2] */ + acc1 += x2 * c0; + /* acc2 += x[3] * y[srcBLen - 2] */ + acc2 += x3 * c0; + /* acc3 += x[4] * y[srcBLen - 2] */ + acc3 += x0 * c0; + + /* Read y[srcBLen - 3] sample */ + c0 = *py--; + /* Read x[5] sample */ + x1 = *(px + 2U); + + /* Perform the multiply-accumulate */ + /* acc0 += x[2] * y[srcBLen - 3] */ + acc0 += x2 * c0; + /* acc1 += x[3] * y[srcBLen - 2] */ + acc1 += x3 * c0; + /* acc2 += x[4] * y[srcBLen - 2] */ + acc2 += x0 * c0; + /* acc3 += x[5] * y[srcBLen - 2] */ + acc3 += x1 * c0; + + /* Read y[srcBLen - 4] sample */ + c0 = *py--; + /* Read x[6] sample */ + x2 = *(px + 3U); + px += 4U; + + /* Perform the multiply-accumulate */ + /* acc0 += x[3] * y[srcBLen - 4] */ + acc0 += x3 * c0; + /* acc1 += x[4] * y[srcBLen - 4] */ + acc1 += x0 * c0; + /* acc2 += x[5] * y[srcBLen - 4] */ + acc2 += x1 * c0; + /* acc3 += x[6] * y[srcBLen - 4] */ + acc3 += x2 * c0; + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *py--; + /* Read x[7] sample */ + x3 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[4] * y[srcBLen - 5] */ + acc0 += x0 * c0; + /* acc1 += x[5] * y[srcBLen - 5] */ + acc1 += x1 * c0; + /* acc2 += x[6] * y[srcBLen - 5] */ + acc2 += x2 * c0; + /* acc3 += x[7] * y[srcBLen - 5] */ + acc3 += x3 * c0; + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement the loop counter */ + k--; + } +#endif /* #if defined(ARM_MATH_NEON) */ + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = acc0; + *pOut++ = acc1; + *pOut++ = acc2; + *pOut++ = acc3; + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize2 % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) || defined (ARM_MATH_NEON)*/ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + +#if defined(ARM_MATH_NEON) || defined (ARM_MATH_LOOPUNROLL) + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + +#if defined (ARM_MATH_NEON) + float32x4_t res = vdupq_n_f32(0) ; + float32x4_t x = vdupq_n_f32(0) ; + float32x4_t y = vdupq_n_f32(0) ; + float32x2_t accum = vdup_n_f32(0) ; + + /* First part of the processing. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + x = vld1q_f32(px); + y = vld1q_f32(py-3); + + y = vrev64q_f32(y); + y = vcombine_f32(vget_high_f32(y), vget_low_f32(y)); + + res = vmlaq_f32(res,x,y); + + px += 4 ; + py -= 4 ; + + /* Decrement the loop counter */ + k--; + } + + accum = vpadd_f32(vget_low_f32(res), vget_high_f32(res)); + sum += accum[0] + accum[1]; + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen & 0x3U; + +#else + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py--; + sum += *px++ * *py--; + sum += *px++ * *py--; + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#endif /* if defined (ARM_MATH_NEON) */ +#else + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined(ARM_MATH_NEON) || defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py--; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum; + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py--; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum; + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The blockSize3 variable holds the number of MAC operations performed */ + + /* Working pointer of inputA */ + pSrc1 = pIn1 + (srcALen - (srcBLen - 1U)); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* ------------------- + * Stage3 process + * ------------------*/ + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) + /* Loop unrolling: Compute 4 outputs at a time */ + k = blockSize3 >> 2U; + +#if defined(ARM_MATH_NEON) + float32x4_t res = vdupq_n_f32(0) ; + float32x4_t x = vdupq_n_f32(0) ; + float32x4_t y = vdupq_n_f32(0) ; + float32x2_t accum = vdup_n_f32(0) ; + + while (k > 0U) + { + x = vld1q_f32(px); + y = vld1q_f32(py-3); + + y = vrev64q_f32(y); + y = vcombine_f32(vget_high_f32(y), vget_low_f32(y)); + + res = vmlaq_f32(res,x,y); + + px += 4 ; + py -= 4 ; + + /* Decrement the loop counter */ + k--; + } + + accum = vpadd_f32(vget_low_f32(res), vget_high_f32(res)); + sum += accum[0] + accum[1]; + +#else + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ + sum += *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ + sum += *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ + sum += *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } +#endif /* #if defined (ARM_MATH_NEON) */ + + /* Loop unrolling: Compute remaining outputs */ + k = blockSize3 % 0x4U; +#else + + /* Initialize blkCnt with number of samples */ + k = blockSize3; + +#endif /* #if defined (ARM_MATH_NEON) || defined (ARM_MATH_LOOPUNROLL)*/ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement the loop counter */ + blockSize3--; + } + +#else +/* alternate version for CM0_FAMILY */ + + const float32_t *pIn1 = pSrcA; /* InputA pointer */ + const float32_t *pIn2 = pSrcB; /* InputB pointer */ + float32_t sum; /* Accumulator */ + uint32_t i, j; /* Loop counters */ + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i < (srcALen + srcBLen - 1U); i++) + { + /* Initialize sum with zero to carry out MAC operations */ + sum = 0.0f; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ( pIn1[j] * pIn2[i - j]); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = sum; + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of Conv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_opt_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_opt_q15.c new file mode 100644 index 0000000..ed2aea9 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_opt_q15.c @@ -0,0 +1,366 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_fast_opt_q15.c + * Description: Fast Q15 Convolution + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Conv + @{ + */ + +/** + @brief Convolution 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 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 + @return none + + @par Scaling and Overflow Behavior + This fast version uses a 32-bit accumulator with 2.30 format. + The accumulator maintains full precision of the intermediate multiplication results + but provides only a single guard bit. There is no saturation on intermediate additions. + Thus, if the accumulator overflows it wraps around and distorts the result. + The input signals should be scaled down to avoid intermediate overflows. + Scale down the inputs by log2(min(srcALen, srcBLen)) (log2 is read as log to the base 2) times to avoid overflows, + as maximum of min(srcALen, srcBLen) number of additions are carried internally. + The 2.30 accumulator is right shifted by 15 bits and then saturated to 1.15 format to yield the final result. + + @remark + Refer to \ref arm_conv_q15() for a slower implementation of this function which uses 64-bit accumulation to avoid wrap around distortion. + */ + +void arm_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) +{ + q31_t acc0; /* Accumulators */ + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + q15_t *pOut = pDst; /* Output pointer */ + q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ + q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ + const q15_t *px; /* Intermediate inputA pointer */ + q15_t *py; /* Intermediate inputB pointer */ + uint32_t j, k, blkCnt; /* Loop counter */ + uint32_t tapCnt; /* Loop count */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc1, acc2, acc3; /* Accumulators */ + q31_t x1, x2, x3; /* Temporary variables to hold state and coefficient values */ + q31_t y1, y2; /* State variables */ +#endif + + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Pointer to take end of scratch2 buffer */ + pScr2 = pScratch2 + srcBLen - 1; + + /* points to smaller length sequence */ + px = pIn2; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + /* Copy smaller length input sequence in reverse order into second scratch buffer */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + *pScr2-- = *px++; + *pScr2-- = *px++; + *pScr2-- = *px++; + *pScr2-- = *px++; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + *pScr2-- = *px++; + + /* Decrement loop counter */ + k--; + } + + /* Initialze temporary scratch pointer */ + pScr1 = pScratch1; + + /* Assuming scratch1 buffer is aligned by 32-bit */ + /* Fill (srcBLen - 1U) zeros in scratch1 buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update temporary scratch pointer */ + pScr1 += (srcBLen - 1U); + + /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ + + /* Copy (srcALen) samples in scratch buffer */ + arm_copy_q15(pIn1, pScr1, srcALen); + + /* Update pointers */ + pScr1 += srcALen; + + + /* Fill (srcBLen - 1U) zeros at end of scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update pointer */ + pScr1 += (srcBLen - 1U); + + /* Temporary pointer for scratch2 */ + py = pScratch2; + + + /* Initialization of pIn2 pointer */ + pIn2 = py; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (srcALen + srcBLen - 1U) >> 2; + + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Read two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read next two samples from scratch1 buffer */ + x2 = read_q15x2_ia (&pScr1); + + tapCnt = (srcBLen) >> 2U; + + while (tapCnt > 0U) + { + + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia ((q15_t **) &pIn2); + y2 = read_q15x2_ia ((q15_t **) &pIn2); + + /* multiply and accumlate */ + acc0 = __SMLAD(x1, y1, acc0); + acc2 = __SMLAD(x2, y1, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc1 = __SMLADX(x3, y1, acc1); + + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* multiply and accumlate */ + acc0 = __SMLAD(x2, y2, acc0); + acc2 = __SMLAD(x1, y2, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x1, x2, 0); +#else + x3 = __PKHBT(x2, x1, 0); +#endif + + acc3 = __SMLADX(x3, y1, acc3); + acc1 = __SMLADX(x3, y2, acc1); + + x2 = read_q15x2_ia (&pScr1); + +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + acc3 = __SMLADX(x3, y2, acc3); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Update scratch pointer for remaining samples of smaller length sequence */ + pScr1 -= 4U; + + /* apply same above for remaining samples of smaller length sequence */ + tapCnt = (srcBLen) & 3U; + + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2); + acc1 += (*pScr1++ * *pIn2); + acc2 += (*pScr1++ * *pIn2); + acc3 += (*pScr1++ * *pIn2++); + + pScr1 -= 3U; + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the results in the accumulators in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16)); +#else + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch1 += 4U; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (srcALen + srcBLen - 1U) & 0x3; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (srcALen + srcBLen - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Calculate convolution for remaining samples of Bigger length sequence */ + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + + tapCnt = (srcBLen) >> 1U; + + while (tapCnt > 0U) + { + + /* Read next two samples from scratch1 buffer */ + acc0 += (*pScr1++ * *pIn2++); + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + tapCnt = (srcBLen) & 1U; + + /* apply same above for remaining samples of smaller length sequence */ + while (tapCnt > 0U) + { + + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* The result is in 2.30 format. Convert to 1.15 with saturation. + Then store the output in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch1 += 1U; + } + +} + +/** + @} end of Conv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q15.c new file mode 100644 index 0000000..3102a05 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q15.c @@ -0,0 +1,663 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_fast_q15.c + * Description: Fast Q15 Convolution + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Conv + @{ + */ + +/** + @brief Convolution 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 srcALen+srcBLen-1 + @return none + + @par Scaling and Overflow Behavior + This fast version uses a 32-bit accumulator with 2.30 format. + The accumulator maintains full precision of the intermediate multiplication results + but provides only a single guard bit. There is no saturation on intermediate additions. + Thus, if the accumulator overflows it wraps around and distorts the result. + The input signals should be scaled down to avoid intermediate overflows. + Scale down the inputs by log2(min(srcALen, srcBLen)) (log2 is read as log to the base 2) times to avoid overflows, + as maximum of min(srcALen, srcBLen) number of additions are carried internally. + The 2.30 accumulator is right shifted by 15 bits and then saturated to 1.15 format to yield the final result. + + @remark + Refer to \ref arm_conv_q15() for a slower implementation of this function which uses 64-bit accumulation to avoid wrap around distortion. + */ + +void arm_conv_fast_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst) +{ + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + q15_t *pOut = pDst; /* Output pointer */ + q31_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ + const q15_t *px; /* Intermediate inputA pointer */ + const q15_t *py; /* Intermediate inputB pointer */ + const q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q31_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* For loop unrolling by 4, this stage is divided into two. */ + /* First part of this stage computes the MAC operations less than 4 */ + /* Second part of this stage computes the MAC operations greater than or equal to 4 */ + + /* The first part of the stage starts here */ + while ((count < 4U) && (blockSize1 > 0U)) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Loop over number of MAC operations between + * inputA samples and inputB samples */ + k = count; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = __SMLAD(*px++, *py--, sum); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pIn2 + count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* The second part of the stage starts here */ + /* The internal loop, over count, is unrolled by 4 */ + /* To, read the last two inputB samples using SIMD: + * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ + py = py - 1; + + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + /* x[0], x[1] are multiplied with y[srcBLen - 1], y[srcBLen - 2] respectively */ + sum = __SMLADX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + /* x[2], x[3] are multiplied with y[srcBLen - 3], y[srcBLen - 4] respectively */ + sum = __SMLADX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* For the next MAC operations, the pointer py is used without SIMD + * So, py is incremented by 1 */ + py = py + 1U; + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = __SMLAD(*px++, *py--, sum); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pIn2 + (count - 1U); + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is the index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* -------------------- + * Stage2 process + * -------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { + /* Loop unroll over blockSize2, by 4 */ + blkCnt = blockSize2 >> 2U; + + while (blkCnt > 0U) + { + py = py - 1U; + + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1] samples */ + x0 = read_q15x2 ((q15_t *) px); + /* read x[1], x[2] samples */ + x1 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read the last two inputB samples using SIMD: + * y[srcBLen - 1] and y[srcBLen - 2] */ + c0 = read_q15x2_da ((q15_t **) &py); + + /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ + acc0 = __SMLADX(x0, c0, acc0); + + /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ + acc1 = __SMLADX(x1, c0, acc1); + + /* Read x[2], x[3] */ + x2 = read_q15x2 ((q15_t *) px); + + /* Read x[3], x[4] */ + x3 = read_q15x2 ((q15_t *) px + 1); + + /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ + acc2 = __SMLADX(x2, c0, acc2); + + /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ + acc3 = __SMLADX(x3, c0, acc3); + + /* Read y[srcBLen - 3] and y[srcBLen - 4] */ + c0 = read_q15x2_da ((q15_t **) &py); + + /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ + acc0 = __SMLADX(x2, c0, acc0); + + /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ + acc1 = __SMLADX(x3, c0, acc1); + + /* Read x[4], x[5] */ + x0 = read_q15x2 ((q15_t *) px + 2); + + /* Read x[5], x[6] */ + x1 = read_q15x2 ((q15_t *) px + 3); + px += 4U; + + /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ + acc2 = __SMLADX(x0, c0, acc2); + + /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ + acc3 = __SMLADX(x1, c0, acc3); + + } while (--k); + + /* For the next MAC operations, SIMD is not used + * So, the 16 bit pointer if inputB, py is updated */ + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + if (k == 1U) + { + /* Read y[srcBLen - 5] */ + c0 = *(py+1); + +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[7] */ + x3 = read_q15x2 ((q15_t *) px); + px++; + + /* Perform the multiply-accumulates */ + acc0 = __SMLAD(x0, c0, acc0); + acc1 = __SMLAD(x1, c0, acc1); + acc2 = __SMLADX(x1, c0, acc2); + acc3 = __SMLADX(x3, c0, acc3); + } + + if (k == 2U) + { + /* Read y[srcBLen - 5], y[srcBLen - 6] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Perform the multiply-accumulates */ + acc0 = __SMLADX(x0, c0, acc0); + acc1 = __SMLADX(x1, c0, acc1); + acc2 = __SMLADX(x3, c0, acc2); + acc3 = __SMLADX(x2, c0, acc3); + } + + if (k == 3U) + { + /* Read y[srcBLen - 5], y[srcBLen - 6] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + + /* Perform the multiply-accumulates */ + acc0 = __SMLADX(x0, c0, acc0); + acc1 = __SMLADX(x1, c0, acc1); + acc2 = __SMLADX(x3, c0, acc2); + acc3 = __SMLADX(x2, c0, acc3); + + /* Read y[srcBLen - 7] */ + c0 = *(py-1); +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[10] */ + x3 = read_q15x2 ((q15_t *) px + 2); + px += 3U; + + /* Perform the multiply-accumulates */ + acc0 = __SMLADX(x1, c0, acc0); + acc1 = __SMLAD(x2, c0, acc1); + acc2 = __SMLADX(x2, c0, acc2); + acc3 = __SMLADX(x3, c0, acc3); + } + + /* Store the result in the accumulator in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT((acc0 >> 15), (acc1 >> 15), 16)); + write_q15x2_ia (&pOut, __PKHBT((acc2 >> 15), (acc3 >> 15), 16)); +#else + write_q15x2_ia (&pOut, __PKHBT((acc1 >> 15), (acc0 >> 15), 16)); + write_q15x2_ia (&pOut, __PKHBT((acc3 >> 15), (acc2 >> 15), 16)); +#endif /*#ifndef ARM_MATH_BIG_ENDIAN*/ + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize2 % 0x4U; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += ((q31_t) *px++ * *py--); + sum += ((q31_t) *px++ * *py--); + sum += ((q31_t) *px++ * *py--); + sum += ((q31_t) *px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += ((q31_t) *px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q31_t) *px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The blockSize3 variable holds the number of MAC operations performed */ + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + pIn2 = pSrc2 - 1U; + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + /* For loop unrolling by 4, this stage is divided into two. */ + /* First part of this stage computes the MAC operations greater than 4 */ + /* Second part of this stage computes the MAC operations less than or equal to 4 */ + + /* The first part of the stage starts here */ + j = blockSize3 >> 2U; + + while ((j > 0U) && (blockSize3 > 0U)) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = blockSize3 >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* x[srcALen - srcBLen + 1], x[srcALen - srcBLen + 2] are multiplied + * with y[srcBLen - 1], y[srcBLen - 2] respectively */ + sum = __SMLADX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + /* x[srcALen - srcBLen + 3], x[srcALen - srcBLen + 4] are multiplied + * with y[srcBLen - 3], y[srcBLen - 4] respectively */ + sum = __SMLADX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* For the next MAC operations, the pointer py is used without SIMD + * So, py is incremented by 1 */ + py = py + 1U; + + /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = blockSize3 % 0x4U; + + while (k > 0U) + { + /* sum += x[srcALen - srcBLen + 5] * y[srcBLen - 5] */ + sum = __SMLAD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement loop counter */ + blockSize3--; + + j--; + } + + /* The second part of the stage starts here */ + /* SIMD is not used for the next MAC operations, + * so pointer py is updated to read only one sample at a time */ + py = py + 1U; + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = blockSize3; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum = __SMLAD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement the loop counter */ + blockSize3--; + } + +} + +/** + @} end of Conv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q31.c new file mode 100644 index 0000000..e87eddc --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_fast_q31.c @@ -0,0 +1,558 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_fast_q31.c + * Description: Fast Q31 Convolution + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Conv + @{ + */ + +/** + @brief Convolution 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 location where the output result is written. Length srcALen+srcBLen-1. + @return none + + @par Scaling and Overflow Behavior + This function is optimized for speed at the expense of fixed-point precision and overflow protection. + The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. + These intermediate results are accumulated in a 32-bit register in 2.30 format. + Finally, the accumulator is saturated and converted to a 1.31 result. + @par + The fast version has the same overflow behavior as the standard version but provides less precision since it discards the low 32 bits of each multiplication result. + In order to avoid overflows completely the input signals must be scaled down. + Scale down the inputs by log2(min(srcALen, srcBLen)) (log2 is read as log to the base 2) times to avoid overflows, + as maximum of min(srcALen, srcBLen) number of additions are carried internally. + @remark + Refer to \ref arm_conv_q31() for a slower implementation of this function which uses 64-bit accumulation to provide higher precision. + */ + +void arm_conv_fast_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst) +{ + const q31_t *pIn1; /* InputA pointer */ + const q31_t *pIn2; /* InputB pointer */ + q31_t *pOut = pDst; /* Output pointer */ + const q31_t *px; /* Intermediate inputA pointer */ + const q31_t *py; /* Intermediate inputB pointer */ + const q31_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q31_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ + q31_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* x[0] * y[srcBLen - 1] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* x[1] * y[srcBLen - 2] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* x[2] * y[srcBLen - 3] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* x[3] * y[srcBLen - 4] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum << 1; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pIn2 + count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { + /* Loop unroll over blockSize2, by 4 */ + blkCnt = blockSize2 >> 2U; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read y[srcBLen - 1] sample */ + c0 = *py--; + /* Read x[3] sample */ + x3 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[0] * y[srcBLen - 1] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc1 += x[1] * y[srcBLen - 1] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc2 += x[2] * y[srcBLen - 1] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc3 += x[3] * y[srcBLen - 1] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + + /* Read y[srcBLen - 2] sample */ + c0 = *py--; + /* Read x[4] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[1] * y[srcBLen - 2] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc1 += x[2] * y[srcBLen - 2] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc2 += x[3] * y[srcBLen - 2] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x3 * c0)) >> 32); + /* acc3 += x[4] * y[srcBLen - 2] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x0 * c0)) >> 32); + + + /* Read y[srcBLen - 3] sample */ + c0 = *py--; + /* Read x[5] sample */ + x1 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[2] * y[srcBLen - 3] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc1 += x[3] * y[srcBLen - 3] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x3 * c0)) >> 32); + /* acc2 += x[4] * y[srcBLen - 3] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc3 += x[5] * y[srcBLen - 3] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x1 * c0)) >> 32); + + + /* Read y[srcBLen - 4] sample */ + c0 = *py--; + /* Read x[6] sample */ + x2 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[3] * y[srcBLen - 4] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x3 * c0)) >> 32); + /* acc1 += x[4] * y[srcBLen - 4] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc2 += x[5] * y[srcBLen - 4] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc3 += x[6] * y[srcBLen - 4] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x2 * c0)) >> 32); + + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *py--; + /* Read x[7] sample */ + x3 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[srcBLen - 5] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc1 += x[5] * y[srcBLen - 5] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc2 += x[6] * y[srcBLen - 5] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc3 += x[7] * y[srcBLen - 5] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (acc0 << 1); + *pOut++ = (q31_t) (acc1 << 1); + *pOut++ = (q31_t) (acc2 << 1); + *pOut++ = (q31_t) (acc3 << 1); + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize2 % 0x4U; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum << 1; + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum << 1; + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The blockSize3 variable holds the number of MAC operations performed */ + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = blockSize3 >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = blockSize3 % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum << 1; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement loop counter */ + blockSize3--; + } + +} + +/** + @} end of Conv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q15.c new file mode 100644 index 0000000..6ad34cd --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q15.c @@ -0,0 +1,362 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_opt_q15.c + * Description: Convolution of Q15 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Conv + @{ + */ + +/** + @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. + @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 none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both inputs are 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. + This approach provides 33 guard bits and there is no risk of overflow. + The 34.30 result is then truncated to 34.15 format by discarding the low 15 bits and then saturated to 1.15 format. + @remark + Refer to \ref arm_conv_fast_q15() for a faster but less precise version of this function. + */ + +void arm_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) +{ + q63_t acc0; /* Accumulators */ + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + q15_t *pOut = pDst; /* Output pointer */ + q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ + q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ + const q15_t *px; /* Intermediate inputA pointer */ + q15_t *py; /* Intermediate inputB pointer */ + uint32_t j, k, blkCnt; /* Loop counter */ + uint32_t tapCnt; /* Loop count */ + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc1, acc2, acc3; /* Accumulators */ + q31_t x1, x2, x3; /* Temporary variables to hold state and coefficient values */ + q31_t y1, y2; /* State variables */ +#endif + + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Pointer to take end of scratch2 buffer */ + pScr2 = pScratch2 + srcBLen - 1; + + /* points to smaller length sequence */ + px = pIn2; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + /* Copy smaller length input sequence in reverse order into second scratch buffer */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + *pScr2-- = *px++; + *pScr2-- = *px++; + *pScr2-- = *px++; + *pScr2-- = *px++; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + *pScr2-- = *px++; + + /* Decrement loop counter */ + k--; + } + + /* Initialze temporary scratch pointer */ + pScr1 = pScratch1; + + /* Assuming scratch1 buffer is aligned by 32-bit */ + /* Fill (srcBLen - 1U) zeros in scratch1 buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update temporary scratch pointer */ + pScr1 += (srcBLen - 1U); + + /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ + + /* Copy (srcALen) samples in scratch buffer */ + arm_copy_q15(pIn1, pScr1, srcALen); + + /* Update pointers */ + pScr1 += srcALen; + + + /* Fill (srcBLen - 1U) zeros at end of scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update pointer */ + pScr1 += (srcBLen - 1U); + + /* Temporary pointer for scratch2 */ + py = pScratch2; + + + /* Initialization of pIn2 pointer */ + pIn2 = py; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (srcALen + srcBLen - 1U) >> 2; + + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Read two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read next two samples from scratch1 buffer */ + x2 = read_q15x2_ia (&pScr1); + + tapCnt = (srcBLen) >> 2U; + + while (tapCnt > 0U) + { + + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia ((q15_t **) &pIn2); + y2 = read_q15x2_ia ((q15_t **) &pIn2); + + /* multiply and accumlate */ + acc0 = __SMLALD(x1, y1, acc0); + acc2 = __SMLALD(x2, y1, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc1 = __SMLALDX(x3, y1, acc1); + + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* multiply and accumlate */ + acc0 = __SMLALD(x2, y2, acc0); + acc2 = __SMLALD(x1, y2, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x1, x2, 0); +#else + x3 = __PKHBT(x2, x1, 0); +#endif + + acc3 = __SMLALDX(x3, y1, acc3); + acc1 = __SMLALDX(x3, y2, acc1); + + x2 = read_q15x2_ia (&pScr1); + +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + acc3 = __SMLALDX(x3, y2, acc3); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Update scratch pointer for remaining samples of smaller length sequence */ + pScr1 -= 4U; + + /* apply same above for remaining samples of smaller length sequence */ + tapCnt = (srcBLen) & 3U; + + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2); + acc1 += (*pScr1++ * *pIn2); + acc2 += (*pScr1++ * *pIn2); + acc3 += (*pScr1++ * *pIn2++); + + pScr1 -= 3U; + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the results in the accumulators in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16)); +#else + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch1 += 4U; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (srcALen + srcBLen - 1U) & 0x3; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (srcALen + srcBLen - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Calculate convolution for remaining samples of Bigger length sequence */ + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + + tapCnt = (srcBLen) >> 1U; + + while (tapCnt > 0U) + { + + /* Read next two samples from scratch1 buffer */ + acc0 += (*pScr1++ * *pIn2++); + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + tapCnt = (srcBLen) & 1U; + + /* apply same above for remaining samples of smaller length sequence */ + while (tapCnt > 0U) + { + + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* The result is in 2.30 format. Convert to 1.15 with saturation. + Then store the output in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch1 += 1U; + } + +} + +/** + @} end of Conv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q7.c new file mode 100644 index 0000000..fb9e2ec --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_opt_q7.c @@ -0,0 +1,360 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_opt_q7.c + * Description: Convolution of Q7 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Conv + @{ + */ + +/** + @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 location where the output result is written. 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). + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 32-bit internal accumulator. + Both the inputs are represented in 1.7 format and multiplications yield a 2.14 result. + The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. + This approach provides 17 guard bits and there is no risk of overflow as long as max(srcALen, srcBLen)<131072. + The 18.14 result is then truncated to 18.7 format by discarding the low 7 bits and then saturated to 1.7 format. + */ + +void arm_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) +{ + q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch */ + q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch */ + q15_t x4; /* Temporary input variable */ + q15_t *py; /* Temporary input2 pointer */ + q31_t acc0, acc1, acc2, acc3; /* Accumulators */ + const q7_t *pIn1, *pIn2; /* InputA and inputB pointer */ + uint32_t j, k, blkCnt, tapCnt; /* Loop counter */ + q31_t x1, x2, x3, y1; /* Temporary input variables */ + const q7_t *px; /* Temporary input1 pointer */ + q7_t *pOut = pDst; /* Output pointer */ + q7_t out0, out1, out2, out3; /* Temporary variables */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* points to smaller length sequence */ + px = pIn2 + srcBLen - 1; + + /* Apply loop unrolling and do 4 Copies simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling copies 4 data points at a time. + ** a second loop below copies for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + x4 = (q15_t) *px--; + *pScr2++ = x4; + x4 = (q15_t) *px--; + *pScr2++ = x4; + x4 = (q15_t) *px--; + *pScr2++ = x4; + x4 = (q15_t) *px--; + *pScr2++ = x4; + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, copy remaining samples here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + x4 = (q15_t) *px--; + *pScr2++ = x4; + + /* Decrement loop counter */ + k--; + } + + /* Fill (srcBLen - 1U) zeros in scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update temporary scratch pointer */ + pScr1 += (srcBLen - 1U); + + /* Copy (srcALen) samples in scratch buffer */ + /* Apply loop unrolling and do 4 Copies simultaneously. */ + k = srcALen >> 2U; + + /* First part of the processing with loop unrolling copies 4 data points at a time. + ** a second loop below copies for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, copy remaining samples here. + ** No loop unrolling is used. */ + k = srcALen % 0x4U; + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + x4 = (q15_t) * pIn1++; + *pScr1++ = x4; + + /* Decrement the loop counter */ + k--; + } + + /* Fill (srcBLen - 1U) zeros at end of scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update pointer */ + pScr1 += (srcBLen - 1U); + + /* Temporary pointer for scratch2 */ + py = pScratch2; + + /* Initialization of pIn2 pointer */ + pIn2 = (q7_t *) py; + + pScr2 = py; + + /* Actual convolution process starts here */ + blkCnt = (srcALen + srcBLen - 1U) >> 2U; + + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Read two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read next two samples from scratch1 buffer */ + x2 = read_q15x2_ia (&pScr1); + + tapCnt = (srcBLen) >> 2U; + + while (tapCnt > 0U) + { + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia (&pScr2); + + /* multiply and accumlate */ + acc0 = __SMLAD(x1, y1, acc0); + acc2 = __SMLAD(x2, y1, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc1 = __SMLADX(x3, y1, acc1); + + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x1, x2, 0); +#else + x3 = __PKHBT(x2, x1, 0); +#endif + + acc3 = __SMLADX(x3, y1, acc3); + + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia (&pScr2); + + acc0 = __SMLAD(x2, y1, acc0); + + acc2 = __SMLAD(x1, y1, acc2); + + acc1 = __SMLADX(x3, y1, acc1); + + x2 = read_q15x2_ia (&pScr1); + +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + acc3 = __SMLADX(x3, y1, acc3); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Update scratch pointer for remaining samples of smaller length sequence */ + pScr1 -= 4U; + + /* apply same above for remaining samples of smaller length sequence */ + tapCnt = (srcBLen) & 3U; + + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pScr2); + acc1 += (*pScr1++ * *pScr2); + acc2 += (*pScr1++ * *pScr2); + acc3 += (*pScr1++ * *pScr2++); + + pScr1 -= 3U; + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the result in the accumulator in the destination buffer. */ + out0 = (q7_t) (__SSAT(acc0 >> 7U, 8)); + out1 = (q7_t) (__SSAT(acc1 >> 7U, 8)); + out2 = (q7_t) (__SSAT(acc2 >> 7U, 8)); + out3 = (q7_t) (__SSAT(acc3 >> 7U, 8)); + + write_q7x4_ia (&pOut, __PACKq7(out0, out1, out2, out3)); + + /* Initialization of inputB pointer */ + pScr2 = py; + + pScratch1 += 4U; + } + + blkCnt = (srcALen + srcBLen - 1U) & 0x3; + + /* Calculate convolution for remaining samples of Bigger length sequence */ + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + + tapCnt = (srcBLen) >> 1U; + + while (tapCnt > 0U) + { + acc0 += (*pScr1++ * *pScr2++); + acc0 += (*pScr1++ * *pScr2++); + + /* Decrement loop counter */ + tapCnt--; + } + + tapCnt = (srcBLen) & 1U; + + /* apply same above for remaining samples of smaller length sequence */ + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pScr2++); + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(acc0 >> 7U, 8)); + + /* Initialization of inputB pointer */ + pScr2 = py; + + pScratch1 += 1U; + } + +} + +/** + @} end of Conv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_f32.c new file mode 100644 index 0000000..e25f9ab --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_f32.c @@ -0,0 +1,676 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_partial_f32.c + * Description: Partial convolution of floating-point sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup PartialConv Partial Convolution + + Partial Convolution is equivalent to Convolution except that a subset of the output samples is generated. + Each function has two additional arguments. + firstIndex specifies the starting index of the subset of output samples. + numPoints is the number of output samples to compute. + The function computes the output in the range + [firstIndex, ..., firstIndex+numPoints-1]. + The output array pDst contains numPoints values. + + The allowable range of output indices is [0 srcALen+srcBLen-2]. + If the requested subset does not fall in this range then the functions return ARM_MATH_ARGUMENT_ERROR. + Otherwise the functions return ARM_MATH_SUCCESS. + \note Refer to \ref arm_conv_f32() for details on fixed point behavior. + + @par Fast Versions + Fast versions are supported for Q31 and Q15 of partial convolution. + Cycles for Fast versions are less compared to Q31 and Q15 of partial conv and the design requires + the input signals should be scaled down to avoid intermediate overflows. + + @par Opt Versions + Opt versions are supported for Q15 and Q7. Design uses internal scratch buffer for getting good optimisation. + These versions are optimised in cycles and consumes more memory (Scratch memory) compared to Q15 and Q7 versions of partial convolution + */ + +/** + @addtogroup PartialConv + @{ + */ + +/** + @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 location where the output result is written + @param[in] firstIndex is the first output sample to start with + @param[in] numPoints is the number of output points to be computed + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : requested subset is not in the range [0 srcALen+srcBLen-2] + */ + +arm_status arm_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) +{ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + const float32_t *pIn1 = pSrcA; /* InputA pointer */ + const float32_t *pIn2 = pSrcB; /* InputB pointer */ + float32_t *pOut = pDst; /* Output pointer */ + const float32_t *px; /* Intermediate inputA pointer */ + const float32_t *py; /* Intermediate inputB pointer */ + const float32_t *pSrc1, *pSrc2; /* Intermediate pointers */ + float32_t sum; /* Accumulator */ + uint32_t j, k, count, blkCnt, check; + int32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + arm_status status; /* Status of Partial convolution */ + +#if defined (ARM_MATH_LOOPUNROLL) + float32_t acc0, acc1, acc2, acc3; /* Accumulator */ + float32_t x0, x1, x2, x3, c0; /* Temporary variables */ +#endif + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Conditions to check which loopCounter holds + * the first and last indices of the output samples to be calculated. */ + check = firstIndex + numPoints; + blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; + blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; + blockSize1 = ((int32_t) srcBLen - 1) - (int32_t) firstIndex; + blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1U)) ? blockSize1 : (int32_t) numPoints) : 0; + blockSize2 = ((int32_t) check - blockSize3) - (blockSize1 + (int32_t) firstIndex); + blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* Set the output pointer to point to the firstIndex + * of the output sample to be calculated. */ + pOut = pDst + firstIndex; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed. + Since the partial convolution starts from firstIndex + Number of Macs to be performed is firstIndex + 1 */ + count = 1U + firstIndex; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc1 = pIn2 + firstIndex; + py = pSrc1; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* x[0] * y[srcBLen - 1] */ + sum += *px++ * *py--; + + /* x[1] * y[srcBLen - 2] */ + sum += *px++ * *py--; + + /* x[2] * y[srcBLen - 3] */ + sum += *px++ * *py--; + + /* x[3] * y[srcBLen - 4] */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = ++pSrc1; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + if ((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) + { + pSrc1 = pIn1 + firstIndex - srcBLen + 1; + } + else + { + pSrc1 = pIn1; + } + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = ((uint32_t) blockSize2 >> 2U); + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0.0f; + acc1 = 0.0f; + acc2 = 0.0f; + acc3 = 0.0f; + + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read y[srcBLen - 1] sample */ + c0 = *py--; + /* Read x[3] sample */ + x3 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[0] * y[srcBLen - 1] */ + acc0 += x0 * c0; + /* acc1 += x[1] * y[srcBLen - 1] */ + acc1 += x1 * c0; + /* acc2 += x[2] * y[srcBLen - 1] */ + acc2 += x2 * c0; + /* acc3 += x[3] * y[srcBLen - 1] */ + acc3 += x3 * c0; + + /* Read y[srcBLen - 2] sample */ + c0 = *py--; + /* Read x[4] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[1] * y[srcBLen - 2] */ + acc0 += x1 * c0; + /* acc1 += x[2] * y[srcBLen - 2] */ + acc1 += x2 * c0; + /* acc2 += x[3] * y[srcBLen - 2] */ + acc2 += x3 * c0; + /* acc3 += x[4] * y[srcBLen - 2] */ + acc3 += x0 * c0; + + /* Read y[srcBLen - 3] sample */ + c0 = *py--; + /* Read x[5] sample */ + x1 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[2] * y[srcBLen - 3] */ + acc0 += x2 * c0; + /* acc1 += x[3] * y[srcBLen - 2] */ + acc1 += x3 * c0; + /* acc2 += x[4] * y[srcBLen - 2] */ + acc2 += x0 * c0; + /* acc3 += x[5] * y[srcBLen - 2] */ + acc3 += x1 * c0; + + /* Read y[srcBLen - 4] sample */ + c0 = *py--; + /* Read x[6] sample */ + x2 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[3] * y[srcBLen - 4] */ + acc0 += x3 * c0; + /* acc1 += x[4] * y[srcBLen - 4] */ + acc1 += x0 * c0; + /* acc2 += x[5] * y[srcBLen - 4] */ + acc2 += x1 * c0; + /* acc3 += x[6] * y[srcBLen - 4] */ + acc3 += x2 * c0; + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *py--; + /* Read x[7] sample */ + x3 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[srcBLen - 5] */ + acc0 += x0 * c0; + /* acc1 += x[5] * y[srcBLen - 5] */ + acc1 += x1 * c0; + /* acc2 += x[6] * y[srcBLen - 5] */ + acc2 += x2 * c0; + /* acc3 += x[7] * y[srcBLen - 5] */ + acc3 += x3 * c0; + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = acc0; + *pOut++ = acc1; + *pOut++ = acc2; + *pOut++ = acc3; + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (uint32_t) blockSize2 % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += *px++ * *py--; + sum += *px++ * *py--; + sum += *px++ * *py--; + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum; + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = (uint32_t) blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum; + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The blockSize3 variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ + sum += *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ + sum += *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ + sum += *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum += *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement MAC count */ + count--; + + /* Decrement the loop counter */ + blockSize3--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +#else +/* alternate version for CM0_FAMILY */ + + const float32_t *pIn1 = pSrcA; /* InputA pointer */ + const float32_t *pIn2 = pSrcB; /* InputB pointer */ + float32_t sum; /* Accumulator */ + uint32_t i, j; /* Loop counters */ + arm_status status; /* Status of Partial convolution */ + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* Loop to calculate convolution for output length number of values */ + for (i = firstIndex; i <= (firstIndex + numPoints - 1); i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0.0f; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ( pIn1[j] * pIn2[i - j]); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = sum; + } + + /* Set status as ARM_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of PartialConv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c new file mode 100644 index 0000000..7166b57 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c @@ -0,0 +1,387 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_partial_fast_opt_q15.c + * Description: Fast Q15 Partial convolution + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup PartialConv + @{ + */ + +/** + @brief Partial convolution 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 + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : requested subset is not in the range [0 srcALen+srcBLen-2] + + @remark + Refer to \ref arm_conv_partial_q15() for a slower implementation of this function which uses a 64-bit accumulator to avoid wrap around distortion. + */ + +arm_status arm_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) +{ + q15_t *pOut = pDst; /* Output pointer */ + q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ + q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ + q31_t acc0; /* Accumulator */ + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + const q15_t *px; /* Intermediate inputA pointer */ + q15_t *py; /* Intermediate inputB pointer */ + uint32_t j, k, blkCnt; /* Loop counter */ + uint32_t tapCnt; /* Loop count */ + arm_status status; /* Status variable */ + q31_t x1; /* Temporary variables to hold state and coefficient values */ + q31_t y1; /* State variables */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc1, acc2, acc3; /* Accumulator */ + q31_t x2, x3; /* Temporary variables to hold state and coefficient values */ + q31_t y2; /* State variables */ +#endif + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Temporary pointer for scratch2 */ + py = pScratch2; + + /* pointer to take end of scratch2 buffer */ + pScr2 = pScratch2 + srcBLen - 1; + + /* points to smaller length sequence */ + px = pIn2; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + /* Copy smaller length input sequence in reverse order into second scratch buffer */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + *pScr2-- = *px++; + *pScr2-- = *px++; + *pScr2-- = *px++; + *pScr2-- = *px++; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + *pScr2-- = *px++; + + /* Decrement loop counter */ + k--; + } + + /* Initialze temporary scratch pointer */ + pScr1 = pScratch1; + + /* Assuming scratch1 buffer is aligned by 32-bit */ + /* Fill (srcBLen - 1U) zeros in scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update temporary scratch pointer */ + pScr1 += (srcBLen - 1U); + + /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ + + /* Copy (srcALen) samples in scratch buffer */ + arm_copy_q15(pIn1, pScr1, srcALen); + + /* Update pointers */ + pScr1 += srcALen; + + /* Fill (srcBLen - 1U) zeros at end of scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update pointer */ + pScr1 += (srcBLen - 1U); + + /* Initialization of pIn2 pointer */ + pIn2 = py; + + pScratch1 += firstIndex; + + pOut = pDst + firstIndex; + + /* Actual convolution process starts here */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (numPoints) >> 2; + + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Read two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read next two samples from scratch1 buffer */ + x2 = read_q15x2_ia (&pScr1); + + tapCnt = (srcBLen) >> 2U; + + while (tapCnt > 0U) + { + + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia ((q15_t **) &pIn2); + y2 = read_q15x2_ia ((q15_t **) &pIn2); + + /* multiply and accumlate */ + acc0 = __SMLAD(x1, y1, acc0); + acc2 = __SMLAD(x2, y1, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc1 = __SMLADX(x3, y1, acc1); + + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* multiply and accumlate */ + acc0 = __SMLAD(x2, y2, acc0); + acc2 = __SMLAD(x1, y2, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x1, x2, 0); +#else + x3 = __PKHBT(x2, x1, 0); +#endif + + acc3 = __SMLADX(x3, y1, acc3); + acc1 = __SMLADX(x3, y2, acc1); + + x2 = read_q15x2_ia (&pScr1); + +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc3 = __SMLADX(x3, y2, acc3); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Update scratch pointer for remaining samples of smaller length sequence */ + pScr1 -= 4U; + + /* apply same above for remaining samples of smaller length sequence */ + tapCnt = (srcBLen) & 3U; + + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2); + acc1 += (*pScr1++ * *pIn2); + acc2 += (*pScr1++ * *pIn2); + acc3 += (*pScr1++ * *pIn2++); + + pScr1 -= 3U; + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the results in the accumulators in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16)); +#else + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch1 += 4U; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numPoints & 0x3; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numPoints; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Calculate convolution for remaining samples of Bigger length sequence */ + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + + tapCnt = (srcBLen) >> 1U; + + while (tapCnt > 0U) + { + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read two samples from smaller buffer */ + y1 = read_q15x2_ia ((q15_t **) &pIn2); + + /* multiply and accumlate */ + acc0 = __SMLAD(x1, y1, acc0); + + /* Decrement loop counter */ + tapCnt--; + } + + tapCnt = (srcBLen) & 1U; + + /* apply same above for remaining samples of smaller length sequence */ + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* The result is in 2.30 format. Convert to 1.15 with saturation. + ** Then store the output in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch1 += 1U; + + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of PartialConv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q15.c new file mode 100644 index 0000000..535fbc7 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q15.c @@ -0,0 +1,700 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_partial_fast_q15.c + * Description: Fast Q15 Partial convolution + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup PartialConv + @{ + */ + +/** + @brief Partial convolution 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 + @param[in] firstIndex is the first output sample to start with + @param[in] numPoints is the number of output points to be computed + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : requested subset is not in the range [0 srcALen+srcBLen-2] + @remark + Refer to \ref arm_conv_partial_q15() for a slower implementation of this function which uses a 64-bit accumulator to avoid wrap around distortion. + */ + +arm_status arm_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) +{ + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + q15_t *pOut = pDst; /* Output pointer */ + q31_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ + const q15_t *px; /* Intermediate inputA pointer */ + const q15_t *py; /* Intermediate inputB pointer */ + const q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q31_t x0, x1, x2, x3, c0; /* Temporary input variables */ + uint32_t j, k, count, blkCnt, check; + int32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + arm_status status; /* Status of Partial convolution */ + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Conditions to check which loopCounter holds + * the first and last indices of the output samples to be calculated. */ + check = firstIndex + numPoints; + blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; + blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; + blockSize1 = ((int32_t) srcBLen - 1) - (int32_t) firstIndex; + blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1U)) ? blockSize1 : (int32_t) numPoints) : 0; + blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + (int32_t) firstIndex); + blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* Set the output pointer to point to the firstIndex + * of the output sample to be calculated. */ + pOut = pDst + firstIndex; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed. + Since the partial convolution starts from firstIndex + Number of Macs to be performed is firstIndex + 1 */ + count = 1U + firstIndex; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + firstIndex; + py = pSrc2; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* For loop unrolling by 4, this stage is divided into two. */ + /* First part of this stage computes the MAC operations less than 4 */ + /* Second part of this stage computes the MAC operations greater than or equal to 4 */ + + /* The first part of the stage starts here */ + while ((count < 4U) && (blockSize1 > 0)) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Loop over number of MAC operations between + * inputA samples and inputB samples */ + k = count; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = __SMLAD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = ++pSrc2; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* The second part of the stage starts here */ + /* The internal loop, over count, is unrolled by 4 */ + /* To, read the last two inputB samples using SIMD: + * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ + py = py - 1; + + while (blockSize1 > 0) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[0], x[1] are multiplied with y[srcBLen - 1], y[srcBLen - 2] respectively */ + sum = __SMLADX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + /* x[2], x[3] are multiplied with y[srcBLen - 3], y[srcBLen - 4] respectively */ + sum = __SMLADX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* For the next MAC operations, the pointer py is used without SIMD + So, py is incremented by 1 */ + py = py + 1U; + + /* If the count is not a multiple of 4, compute any remaining MACs here. + No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = __SMLAD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = ++pSrc2 - 1U; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + if ((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) + { + pSrc1 = pIn1 + firstIndex - srcBLen + 1; + } + else + { + pSrc1 = pIn1; + } + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is the index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = ((uint32_t) blockSize2 >> 2U); + + while (blkCnt > 0U) + { + py = py - 1U; + + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + + /* read x[0], x[1] samples */ + x0 = read_q15x2 ((q15_t *) px); + /* read x[1], x[2] samples */ + x1 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read the last two inputB samples using SIMD: + * y[srcBLen - 1] and y[srcBLen - 2] */ + c0 = read_q15x2_da ((q15_t **) &py); + + /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ + acc0 = __SMLADX(x0, c0, acc0); + + /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ + acc1 = __SMLADX(x1, c0, acc1); + + /* Read x[2], x[3] */ + x2 = read_q15x2 ((q15_t *) px); + + /* Read x[3], x[4] */ + x3 = read_q15x2 ((q15_t *) px + 1); + + /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ + acc2 = __SMLADX(x2, c0, acc2); + + /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ + acc3 = __SMLADX(x3, c0, acc3); + + /* Read y[srcBLen - 3] and y[srcBLen - 4] */ + c0 = read_q15x2_da ((q15_t **) &py); + + /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ + acc0 = __SMLADX(x2, c0, acc0); + + /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ + acc1 = __SMLADX(x3, c0, acc1); + + /* Read x[4], x[5] */ + x0 = read_q15x2 ((q15_t *) px + 2); + + /* Read x[5], x[6] */ + x1 = read_q15x2 ((q15_t *) px + 3); + px += 4U; + + /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ + acc2 = __SMLADX(x0, c0, acc2); + + /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ + acc3 = __SMLADX(x1, c0, acc3); + + } while (--k); + + /* For the next MAC operations, SIMD is not used + So, the 16 bit pointer if inputB, py is updated */ + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + No loop unrolling is used. */ + k = srcBLen % 0x4U; + + if (k == 1U) + { + /* Read y[srcBLen - 5] */ + c0 = *(py + 1); +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[7] */ + x3 = read_q15x2 ((q15_t *) px); + px++; + + /* Perform the multiply-accumulate */ + acc0 = __SMLAD (x0, c0, acc0); + acc1 = __SMLAD (x1, c0, acc1); + acc2 = __SMLADX(x1, c0, acc2); + acc3 = __SMLADX(x3, c0, acc3); + } + + if (k == 2U) + { + /* Read y[srcBLen - 5], y[srcBLen - 6] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Perform the multiply-accumulate */ + acc0 = __SMLADX(x0, c0, acc0); + acc1 = __SMLADX(x1, c0, acc1); + acc2 = __SMLADX(x3, c0, acc2); + acc3 = __SMLADX(x2, c0, acc3); + } + + if (k == 3U) + { + /* Read y[srcBLen - 5], y[srcBLen - 6] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + + /* Perform the multiply-accumulate */ + acc0 = __SMLADX(x0, c0, acc0); + acc1 = __SMLADX(x1, c0, acc1); + acc2 = __SMLADX(x3, c0, acc2); + acc3 = __SMLADX(x2, c0, acc3); + + c0 = *(py-1); +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[10] */ + x3 = read_q15x2 ((q15_t *) px + 2); + px += 3U; + + /* Perform the multiply-accumulates */ + acc0 = __SMLADX(x1, c0, acc0); + acc1 = __SMLAD (x2, c0, acc1); + acc2 = __SMLADX(x2, c0, acc2); + acc3 = __SMLADX(x3, c0, acc3); + } + + /* Store the results in the accumulators in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT(acc0 >> 15, acc1 >> 15, 16)); + write_q15x2_ia (&pOut, __PKHBT(acc2 >> 15, acc3 >> 15, 16)); +#else + write_q15x2_ia (&pOut, __PKHBT(acc1 >> 15, acc0 >> 15, 16)); + write_q15x2_ia (&pOut, __PKHBT(acc3 >> 15, acc2 >> 15, 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. + No loop unrolling is used. */ + blkCnt = (uint32_t) blockSize2 % 0x4U; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += ((q31_t) *px++ * *py--); + sum += ((q31_t) *px++ * *py--); + sum += ((q31_t) *px++ * *py--); + sum += ((q31_t) *px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += ((q31_t) *px++ * *py--); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = (uint32_t) blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q31_t) *px++ * *py--); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + pIn2 = pSrc2 - 1U; + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + /* For loop unrolling by 4, this stage is divided into two. */ + /* First part of this stage computes the MAC operations greater than 4 */ + /* Second part of this stage computes the MAC operations less than or equal to 4 */ + + /* The first part of the stage starts here */ + j = count >> 2U; + + while ((j > 0U) && (blockSize3 > 0)) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* x[srcALen - srcBLen + 1], x[srcALen - srcBLen + 2] are multiplied + * with y[srcBLen - 1], y[srcBLen - 2] respectively */ + sum = __SMLADX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + /* x[srcALen - srcBLen + 3], x[srcALen - srcBLen + 4] are multiplied + * with y[srcBLen - 3], y[srcBLen - 4] respectively */ + sum = __SMLADX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* For the next MAC operations, the pointer py is used without SIMD + So, py is incremented by 1 */ + py = py + 1U; + + /* If the count is not a multiple of 4, compute any remaining MACs here. + No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* sum += x[srcALen - srcBLen + 5] * y[srcBLen - 5] */ + sum = __SMLAD(*px++, *py--, sum); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement the MAC count */ + count--; + + /* Decrement the loop counter */ + blockSize3--; + + j--; + } + + /* The second part of the stage starts here */ + /* SIMD is not used for the next MAC operations, + * so pointer py is updated to read only one sample at a time */ + py = py + 1U; + + while (blockSize3 > 0) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum = __SMLAD(*px++, *py--, sum); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (sum >> 15); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement the MAC count */ + count--; + + /* Decrement the loop counter */ + blockSize3--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +} + +/** + @} end of PartialConv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q31.c new file mode 100644 index 0000000..f232d51 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_fast_q31.c @@ -0,0 +1,618 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_partial_fast_q31.c + * Description: Fast Q31 Partial convolution + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup PartialConv + @{ + */ + +/** + @brief Partial convolution 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 location where the output result is written + @param[in] firstIndex is the first output sample to start with + @param[in] numPoints is the number of output points to be computed + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : requested subset is not in the range [0 srcALen+srcBLen-2] + + @remark + Refer to \ref arm_conv_partial_q31() for a slower implementation of this function which uses a 64-bit accumulator to provide higher precision. + */ + +arm_status arm_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) +{ + const q31_t *pIn1; /* InputA pointer */ + const q31_t *pIn2; /* InputB pointer */ + q31_t *pOut = pDst; /* Output pointer */ + const q31_t *px; /* Intermediate inputA pointer */ + const q31_t *py; /* Intermediate inputB pointer */ + const q31_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q31_t sum; /* Accumulators */ + uint32_t j, k, count, check, blkCnt; + int32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + arm_status status; /* Status of Partial convolution */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc0, acc1, acc2, acc3; /* Accumulators */ + q31_t x0, x1, x2, x3, c0; +#endif + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Conditions to check which loopCounter holds + * the first and last indices of the output samples to be calculated. */ + check = firstIndex + numPoints; + blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; + blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; + blockSize1 = ((int32_t) srcBLen - 1) - (int32_t) firstIndex; + blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1U)) ? blockSize1 : (int32_t) numPoints) : 0; + blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + (int32_t) firstIndex); + blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* Set the output pointer to point to the firstIndex + * of the output sample to be calculated. */ + pOut = pDst + firstIndex; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed. + Since the partial convolution starts from firstIndex + Number of Macs to be performed is firstIndex + 1 */ + count = 1U + firstIndex; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + firstIndex; + py = pSrc2; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* x[0] * y[srcBLen - 1] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* x[1] * y[srcBLen - 2] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* x[2] * y[srcBLen - 3] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* x[3] * y[srcBLen - 4] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum << 1; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = ++pSrc2; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + if ((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) + { + pSrc1 = pIn1 + firstIndex - srcBLen + 1; + } + else + { + pSrc1 = pIn1; + } + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = ((uint32_t) blockSize2 >> 2U); + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read y[srcBLen - 1] sample */ + c0 = *py--; + /* Read x[3] sample */ + x3 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[0] * y[srcBLen - 1] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc1 += x[1] * y[srcBLen - 1] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc2 += x[2] * y[srcBLen - 1] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc3 += x[3] * y[srcBLen - 1] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + /* Read y[srcBLen - 2] sample */ + c0 = *py--; + /* Read x[4] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[1] * y[srcBLen - 2] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc1 += x[2] * y[srcBLen - 2] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc2 += x[3] * y[srcBLen - 2] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x3 * c0)) >> 32); + /* acc3 += x[4] * y[srcBLen - 2] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x0 * c0)) >> 32); + + /* Read y[srcBLen - 3] sample */ + c0 = *py--; + /* Read x[5] sample */ + x1 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[2] * y[srcBLen - 3] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc1 += x[3] * y[srcBLen - 2] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x3 * c0)) >> 32); + /* acc2 += x[4] * y[srcBLen - 2] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc3 += x[5] * y[srcBLen - 2] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x1 * c0)) >> 32); + + /* Read y[srcBLen - 4] sample */ + c0 = *py--; + /* Read x[6] sample */ + x2 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[3] * y[srcBLen - 4] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x3 * c0)) >> 32); + /* acc1 += x[4] * y[srcBLen - 4] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc2 += x[5] * y[srcBLen - 4] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc3 += x[6] * y[srcBLen - 4] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x2 * c0)) >> 32); + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *py--; + /* Read x[7] sample */ + x3 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[srcBLen - 5] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc1 += x[5] * y[srcBLen - 5] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc2 += x[6] * y[srcBLen - 5] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc3 += x[7] * y[srcBLen - 5] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (acc0 << 1); + *pOut++ = (q31_t) (acc1 << 1); + *pOut++ = (q31_t) (acc2 << 1); + *pOut++ = (q31_t) (acc3 << 1); + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (uint32_t) blockSize2 % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) * px++ * (*py--))) >> 32); + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) * px++ * (*py--))) >> 32); + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) * px++ * (*py--))) >> 32); + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) * px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum << 1; + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = (uint32_t) blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum << 1; + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py--))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = sum << 1; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement MAC count */ + count--; + + /* Decrement the loop counter */ + blockSize3--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +} + +/** + @} end of PartialConv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q15.c new file mode 100644 index 0000000..21999d2 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q15.c @@ -0,0 +1,386 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_partial_opt_q15.c + * Description: Partial convolution of Q15 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup PartialConv + @{ + */ + +/** + @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 location where the output result is written + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : requested subset is not in the range [0 srcALen+srcBLen-2] + + @remark + Refer to \ref arm_conv_partial_fast_q15() for a faster but less precise version of this function. + */ + +arm_status arm_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) +{ + + q15_t *pOut = pDst; /* Output pointer */ + q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ + q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ + q63_t acc0; /* Accumulator */ + q31_t x1; /* Temporary variables to hold state and coefficient values */ + q31_t y1; /* State variables */ + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + const q15_t *px; /* Intermediate inputA pointer */ + q15_t *py; /* Intermediate inputB pointer */ + uint32_t j, k, blkCnt; /* Loop counter */ + uint32_t tapCnt; /* Loop count */ + arm_status status; /* Status variable */ + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc1, acc2, acc3; /* Accumulator */ + q31_t x2, x3; /* Temporary variables to hold state and coefficient values */ + q31_t y2; /* State variables */ +#endif + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Temporary pointer for scratch2 */ + py = pScratch2; + + /* pointer to take end of scratch2 buffer */ + pScr2 = pScratch2 + srcBLen - 1; + + /* points to smaller length sequence */ + px = pIn2; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + /* Copy smaller length input sequence in reverse order into second scratch buffer */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + *pScr2-- = *px++; + *pScr2-- = *px++; + *pScr2-- = *px++; + *pScr2-- = *px++; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + *pScr2-- = *px++; + + /* Decrement loop counter */ + k--; + } + + /* Initialze temporary scratch pointer */ + pScr1 = pScratch1; + + /* Assuming scratch1 buffer is aligned by 32-bit */ + /* Fill (srcBLen - 1U) zeros in scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update temporary scratch pointer */ + pScr1 += (srcBLen - 1U); + + /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ + + /* Copy (srcALen) samples in scratch buffer */ + arm_copy_q15(pIn1, pScr1, srcALen); + + /* Update pointers */ + pScr1 += srcALen; + + /* Fill (srcBLen - 1U) zeros at end of scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update pointer */ + pScr1 += (srcBLen - 1U); + + /* Initialization of pIn2 pointer */ + pIn2 = py; + + pScratch1 += firstIndex; + + pOut = pDst + firstIndex; + + /* Actual convolution process starts here */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (numPoints) >> 2; + + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Read two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read next two samples from scratch1 buffer */ + x2 = read_q15x2_ia (&pScr1); + + tapCnt = (srcBLen) >> 2U; + + while (tapCnt > 0U) + { + + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia ((q15_t **) &pIn2); + y2 = read_q15x2_ia ((q15_t **) &pIn2); + + /* multiply and accumlate */ + acc0 = __SMLALD(x1, y1, acc0); + acc2 = __SMLALD(x2, y1, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc1 = __SMLALDX(x3, y1, acc1); + + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* multiply and accumlate */ + acc0 = __SMLALD(x2, y2, acc0); + acc2 = __SMLALD(x1, y2, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x1, x2, 0); +#else + x3 = __PKHBT(x2, x1, 0); +#endif + + acc3 = __SMLALDX(x3, y1, acc3); + acc1 = __SMLALDX(x3, y2, acc1); + + x2 = read_q15x2_ia (&pScr1); + +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + acc3 = __SMLALDX(x3, y2, acc3); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Update scratch pointer for remaining samples of smaller length sequence */ + pScr1 -= 4U; + + /* apply same above for remaining samples of smaller length sequence */ + tapCnt = (srcBLen) & 3U; + + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2); + acc1 += (*pScr1++ * *pIn2); + acc2 += (*pScr1++ * *pIn2); + acc3 += (*pScr1++ * *pIn2++); + + pScr1 -= 3U; + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the results in the accumulators in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16)); +#else + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch1 += 4U; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numPoints & 0x3; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numPoints; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Calculate convolution for remaining samples of Bigger length sequence */ + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + + tapCnt = (srcBLen) >> 1U; + + while (tapCnt > 0U) + { + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read two samples from smaller buffer */ + y1 = read_q15x2_ia ((q15_t **) &pIn2); + + acc0 = __SMLALD(x1, y1, acc0); + + /* Decrement the loop counter */ + tapCnt--; + } + + tapCnt = (srcBLen) & 1U; + + /* apply same above for remaining samples of smaller length sequence */ + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* The result is in 2.30 format. Convert to 1.15 with saturation. + ** Then store the output in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch1 += 1U; + + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of PartialConv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q7.c new file mode 100644 index 0000000..811f386 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_opt_q7.c @@ -0,0 +1,390 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_partial_opt_q7.c + * Description: Partial convolution of Q7 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup PartialConv + @{ + */ + +/** + @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 location where the output result is written + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : requested subset is not in the range [0 srcALen+srcBLen-2] + */ + +arm_status arm_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) +{ + q15_t *pScr2, *pScr1; /* Intermediate pointers for scratch pointers */ + q15_t x4; /* Temporary input variable */ + const q7_t *pIn1, *pIn2; /* InputA and inputB pointer */ + uint32_t j, k, blkCnt, tapCnt; /* Loop counter */ + const q7_t *px; /* Temporary input1 pointer */ + q15_t *py; /* Temporary input2 pointer */ + q31_t acc0, acc1, acc2, acc3; /* Accumulator */ + q31_t x1, x2, x3, y1; /* Temporary input variables */ + arm_status status; + q7_t *pOut = pDst; /* Output pointer */ + q7_t out0, out1, out2, out3; /* Temporary variables */ + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* pointer to take end of scratch2 buffer */ + pScr2 = pScratch2; + + /* points to smaller length sequence */ + px = pIn2 + srcBLen - 1; + + /* Apply loop unrolling and do 4 Copies simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling copies 4 data points at a time. + ** a second loop below copies for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + x4 = (q15_t) *px--; + *pScr2++ = x4; + x4 = (q15_t) *px--; + *pScr2++ = x4; + x4 = (q15_t) *px--; + *pScr2++ = x4; + x4 = (q15_t) *px--; + *pScr2++ = x4; + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, copy remaining samples here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + x4 = (q15_t) *px--; + *pScr2++ = x4; + + /* Decrement loop counter */ + k--; + } + + /* Initialze temporary scratch pointer */ + pScr1 = pScratch1; + + /* Fill (srcBLen - 1U) zeros in scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update temporary scratch pointer */ + pScr1 += (srcBLen - 1U); + + /* Copy (srcALen) samples in scratch buffer */ + /* Apply loop unrolling and do 4 Copies simultaneously. */ + k = srcALen >> 2U; + + /* First part of the processing with loop unrolling copies 4 data points at a time. + ** a second loop below copies for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, copy remaining samples here. + ** No loop unrolling is used. */ + k = srcALen % 0x4U; + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + + /* Decrement the loop counter */ + k--; + } + + /* Fill (srcBLen - 1U) zeros at end of scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update pointer */ + pScr1 += (srcBLen - 1U); + + + /* Temporary pointer for scratch2 */ + py = pScratch2; + + /* Initialization of pIn2 pointer */ + pIn2 = (q7_t *) py; + + pScr2 = py; + + pOut = pDst + firstIndex; + + pScratch1 += firstIndex; + + /* Actual convolution process starts here */ + blkCnt = (numPoints) >> 2; + + while (blkCnt > 0) + { + /* Initialize temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumulators */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Read two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read next two samples from scratch1 buffer */ + x2 = read_q15x2_ia (&pScr1); + + tapCnt = (srcBLen) >> 2U; + + while (tapCnt > 0U) + { + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia (&pScr2); + + /* multiply and accumlate */ + acc0 = __SMLAD(x1, y1, acc0); + acc2 = __SMLAD(x2, y1, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc1 = __SMLADX(x3, y1, acc1); + + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x1, x2, 0); +#else + x3 = __PKHBT(x2, x1, 0); +#endif + + acc3 = __SMLADX(x3, y1, acc3); + + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia (&pScr2); + + acc0 = __SMLAD(x2, y1, acc0); + + acc2 = __SMLAD(x1, y1, acc2); + + acc1 = __SMLADX(x3, y1, acc1); + + x2 = read_q15x2_ia (&pScr1); + +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + acc3 = __SMLADX(x3, y1, acc3); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Update scratch pointer for remaining samples of smaller length sequence */ + pScr1 -= 4U; + + /* apply same above for remaining samples of smaller length sequence */ + tapCnt = (srcBLen) & 3U; + + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pScr2); + acc1 += (*pScr1++ * *pScr2); + acc2 += (*pScr1++ * *pScr2); + acc3 += (*pScr1++ * *pScr2++); + + pScr1 -= 3U; + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the result in the accumulator in the destination buffer. */ + out0 = (q7_t) (__SSAT(acc0 >> 7U, 8)); + out1 = (q7_t) (__SSAT(acc1 >> 7U, 8)); + out2 = (q7_t) (__SSAT(acc2 >> 7U, 8)); + out3 = (q7_t) (__SSAT(acc3 >> 7U, 8)); + + write_q7x4_ia (&pOut, __PACKq7(out0, out1, out2, out3)); + + /* Initialization of inputB pointer */ + pScr2 = py; + + pScratch1 += 4U; + } + + blkCnt = (numPoints) & 0x3; + + /* Calculate convolution for remaining samples of Bigger length sequence */ + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + + tapCnt = (srcBLen) >> 1U; + + while (tapCnt > 0U) + { + + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read two samples from smaller buffer */ + y1 = read_q15x2_ia (&pScr2); + + acc0 = __SMLAD(x1, y1, acc0); + + /* Decrement the loop counter */ + tapCnt--; + } + + tapCnt = (srcBLen) & 1U; + + /* apply same above for remaining samples of smaller length sequence */ + while (tapCnt > 0U) + { + + /* accumlate the results */ + acc0 += (*pScr1++ * *pScr2++); + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(acc0 >> 7U, 8)); + + /* Initialization of inputB pointer */ + pScr2 = py; + + pScratch1 += 1U; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + return (status); +} + +/** + @} end of PartialConv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q15.c new file mode 100644 index 0000000..55272ea --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q15.c @@ -0,0 +1,752 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_partial_q15.c + * Description: Partial convolution of Q15 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup PartialConv + @{ + */ + +/** + @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 location where the output result is written + @param[in] firstIndex is the first output sample to start with + @param[in] numPoints is the number of output points to be computed + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : requested subset is not in the range [0 srcALen+srcBLen-2] + + @remark + Refer to \ref arm_conv_partial_fast_q15() for a faster but less precise version of this function. + @remark + Refer to \ref arm_conv_partial_opt_q15() for a faster implementation of this function using scratch buffers. + */ + +arm_status arm_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) +{ + +#if defined (ARM_MATH_DSP) + + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + q15_t *pOut = pDst; /* Output pointer */ + q63_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ + const q15_t *px; /* Intermediate inputA pointer */ + const q15_t *py; /* Intermediate inputB pointer */ + const q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q31_t x0, x1, x2, x3, c0; /* Temporary input variables to hold state and coefficient values */ + int32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt, check; + arm_status status; /* Status of Partial convolution */ + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Conditions to check which loopCounter holds + * the first and last indices of the output samples to be calculated. */ + check = firstIndex + numPoints; + blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; + blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; + blockSize1 = ((int32_t) srcBLen - 1) - (int32_t) firstIndex; + blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1U)) ? blockSize1 : (int32_t) numPoints) : 0; + blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + (int32_t) firstIndex); + blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* Set the output pointer to point to the firstIndex + * of the output sample to be calculated. */ + pOut = pDst + firstIndex; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed. + Since the partial convolution starts from firstIndex + Number of Macs to be performed is firstIndex + 1 */ + count = 1U + firstIndex; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + firstIndex; + py = pSrc2; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* For loop unrolling by 4, this stage is divided into two. */ + /* First part of this stage computes the MAC operations less than 4 */ + /* Second part of this stage computes the MAC operations greater than or equal to 4 */ + + /* The first part of the stage starts here */ + while ((count < 4U) && (blockSize1 > 0U)) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Loop over number of MAC operations between + * inputA samples and inputB samples */ + k = count; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = __SMLALD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = ++pSrc2; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* The second part of the stage starts here */ + /* The internal loop, over count, is unrolled by 4 */ + /* To, read the last two inputB samples using SIMD: + * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ + py = py - 1; + + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[0], x[1] are multiplied with y[srcBLen - 1], y[srcBLen - 2] respectively */ + sum = __SMLALDX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + /* x[2], x[3] are multiplied with y[srcBLen - 3], y[srcBLen - 4] respectively */ + sum = __SMLALDX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* For the next MAC operations, the pointer py is used without SIMD + * So, py is incremented by 1 */ + py = py + 1U; + + /* If the count is not a multiple of 4, compute any remaining MACs here. + No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = __SMLALD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = ++pSrc2 - 1U; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + if ((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) + { + pSrc1 = pIn1 + firstIndex - srcBLen + 1; + } + else + { + pSrc1 = pIn1; + } + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is the index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = ((uint32_t) blockSize2 >> 2U); + + while (blkCnt > 0U) + { + py = py - 1U; + + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + + /* read x[0], x[1] samples */ + x0 = read_q15x2 ((q15_t *) px); + /* read x[1], x[2] samples */ + x1 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read the last two inputB samples using SIMD: + * y[srcBLen - 1] and y[srcBLen - 2] */ + c0 = read_q15x2_da ((q15_t **) &py); + + /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ + acc0 = __SMLALDX(x0, c0, acc0); + + /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ + acc1 = __SMLALDX(x1, c0, acc1); + + /* Read x[2], x[3] */ + x2 = read_q15x2 ((q15_t *) px); + + /* Read x[3], x[4] */ + x3 = read_q15x2 ((q15_t *) px + 1); + + /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ + acc2 = __SMLALDX(x2, c0, acc2); + + /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ + acc3 = __SMLALDX(x3, c0, acc3); + + /* Read y[srcBLen - 3] and y[srcBLen - 4] */ + c0 = read_q15x2_da ((q15_t **) &py); + + /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ + acc0 = __SMLALDX(x2, c0, acc0); + + /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ + acc1 = __SMLALDX(x3, c0, acc1); + + /* Read x[4], x[5] */ + x0 = read_q15x2 ((q15_t *) px + 2); + + /* Read x[5], x[6] */ + x1 = read_q15x2 ((q15_t *) px + 3); + px += 4U; + + /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ + acc2 = __SMLALDX(x0, c0, acc2); + + /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ + acc3 = __SMLALDX(x1, c0, acc3); + + } while (--k); + + /* For the next MAC operations, SIMD is not used + * So, the 16 bit pointer if inputB, py is updated */ + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + if (k == 1U) + { + /* Read y[srcBLen - 5] */ + c0 = *(py+1); +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[7] */ + x3 = read_q15x2 ((q15_t *) px); + px++; + + /* Perform the multiply-accumulate */ + acc0 = __SMLALD (x0, c0, acc0); + acc1 = __SMLALD (x1, c0, acc1); + acc2 = __SMLALDX(x1, c0, acc2); + acc3 = __SMLALDX(x3, c0, acc3); + } + + if (k == 2U) + { + /* Read y[srcBLen - 5], y[srcBLen - 6] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Perform the multiply-accumulate */ + acc0 = __SMLALDX(x0, c0, acc0); + acc1 = __SMLALDX(x1, c0, acc1); + acc2 = __SMLALDX(x3, c0, acc2); + acc3 = __SMLALDX(x2, c0, acc3); + } + + if (k == 3U) + { + /* Read y[srcBLen - 5], y[srcBLen - 6] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + + /* Perform the multiply-accumulate */ + acc0 = __SMLALDX(x0, c0, acc0); + acc1 = __SMLALDX(x1, c0, acc1); + acc2 = __SMLALDX(x3, c0, acc2); + acc3 = __SMLALDX(x2, c0, acc3); + + c0 = *(py-1); +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[10] */ + x3 = read_q15x2 ((q15_t *) px + 2); + px += 3U; + + /* Perform the multiply-accumulates */ + acc0 = __SMLALDX(x1, c0, acc0); + acc1 = __SMLALD (x2, c0, acc1); + acc2 = __SMLALDX(x2, c0, acc2); + acc3 = __SMLALDX(x3, c0, acc3); + } + + /* Store the results in the accumulators in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16)); +#else + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. + No loop unrolling is used. */ + blkCnt = (uint32_t) blockSize2 % 0x4U; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += (q63_t) ((q31_t) *px++ * *py--); + sum += (q63_t) ((q31_t) *px++ * *py--); + sum += (q63_t) ((q31_t) *px++ * *py--); + sum += (q63_t) ((q31_t) *px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) ((q31_t) *px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT(sum >> 15, 16)); + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = (uint32_t) blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) ((q31_t) *px++ * *py--); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT(sum >> 15, 16)); + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + pIn2 = pSrc2 - 1U; + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + /* For loop unrolling by 4, this stage is divided into two. */ + /* First part of this stage computes the MAC operations greater than 4 */ + /* Second part of this stage computes the MAC operations less than or equal to 4 */ + + /* The first part of the stage starts here */ + j = count >> 2U; + + while ((j > 0U) && (blockSize3 > 0U)) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* x[srcALen - srcBLen + 1], x[srcALen - srcBLen + 2] are multiplied + * with y[srcBLen - 1], y[srcBLen - 2] respectively */ + sum = __SMLALDX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + /* x[srcALen - srcBLen + 3], x[srcALen - srcBLen + 4] are multiplied + * with y[srcBLen - 3], y[srcBLen - 4] respectively */ + sum = __SMLALDX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* For the next MAC operations, the pointer py is used without SIMD + * So, py is incremented by 1 */ + py = py + 1U; + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* sum += x[srcALen - srcBLen + 5] * y[srcBLen - 5] */ + sum = __SMLALD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement MAC count */ + count--; + + /* Decrement loop counter */ + blockSize3--; + + j--; + } + + /* The second part of the stage starts here */ + /* SIMD is not used for the next MAC operations, + * so pointer py is updated to read only one sample at a time */ + py = py + 1U; + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum = __SMLALD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement MAC count */ + count--; + + /* Decrement the loop counter */ + blockSize3--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +#else /* #if defined (ARM_MATH_DSP) */ + + const q15_t *pIn1 = pSrcA; /* InputA pointer */ + const q15_t *pIn2 = pSrcB; /* InputB pointer */ + q63_t sum; /* Accumulator */ + uint32_t i, j; /* Loop counters */ + arm_status status; /* Status of Partial convolution */ + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* Loop to calculate convolution for output length number of values */ + for (i = firstIndex; i <= (firstIndex + numPoints - 1); i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q31_t) pIn1[j] * pIn2[i - j]); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = (q15_t) __SSAT((sum >> 15U), 16U); + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + +/** + @} end of PartialConv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q31.c new file mode 100644 index 0000000..d0f0122 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q31.c @@ -0,0 +1,634 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_partial_q31.c + * Description: Partial convolution of Q31 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup PartialConv + @{ + */ + +/** + @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 location where the output result is written + @param[in] firstIndex is the first output sample to start with + @param[in] numPoints is the number of output points to be computed + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : requested subset is not in the range [0 srcALen+srcBLen-2] + + @remark + Refer to \ref arm_conv_partial_fast_q31() for a faster but less precise implementation of this function. + */ + +arm_status arm_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) +{ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + const q31_t *pIn1; /* InputA pointer */ + const q31_t *pIn2; /* InputB pointer */ + q31_t *pOut = pDst; /* Output pointer */ + const q31_t *px; /* Intermediate inputA pointer */ + const q31_t *py; /* Intermediate inputB pointer */ + const q31_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q63_t sum; /* Accumulator */ + uint32_t j, k, count, blkCnt, check; + int32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + arm_status status; /* Status of Partial convolution */ + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc0, acc1, acc2; /* Accumulator */ + q31_t x0, x1, x2, c0; /* Temporary variables */ +#endif + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Conditions to check which loopCounter holds + * the first and last indices of the output samples to be calculated. */ + check = firstIndex + numPoints; + blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; + blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; + blockSize1 = ((int32_t) srcBLen - 1) - (int32_t) firstIndex; + blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1U)) ? blockSize1 : (int32_t) numPoints) : 0; + blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + (int32_t) firstIndex); + blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* Set the output pointer to point to the firstIndex + * of the output sample to be calculated. */ + pOut = pDst + firstIndex; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed. + Since the partial convolution starts from firstIndex + Number of Macs to be performed is firstIndex + 1 */ + count = 1U + firstIndex; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + firstIndex; + py = pSrc2; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* x[0] * y[srcBLen - 1] */ + sum += (q63_t) *px++ * (*py--); + + /* x[1] * y[srcBLen - 2] */ + sum += (q63_t) *px++ * (*py--); + + /* x[2] * y[srcBLen - 3] */ + sum += (q63_t) *px++ * (*py--); + + /* x[3] * y[srcBLen - 4] */ + sum += (q63_t) *px++ * (*py--); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) *px++ * (*py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (sum >> 31); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = ++pSrc2; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + if ((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) + { + pSrc1 = pIn1 + firstIndex - srcBLen + 1; + } + else + { + pSrc1 = pIn1; + } + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unroll over blkCnt */ + blkCnt = blockSize2 / 3; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + + /* read x[0], x[1] samples */ + x0 = *px++; + x1 = *px++; + + /* Apply loop unrolling and compute 3 MACs simultaneously. */ + k = srcBLen / 3; + + /* First part of the processing with loop unrolling. Compute 3 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 2 samples. */ + do + { + /* Read y[srcBLen - 1] sample */ + c0 = *(py); + + /* Read x[2] sample */ + x2 = *(px); + + /* Perform the multiply-accumulate */ + /* acc0 += x[0] * y[srcBLen - 1] */ + acc0 += (q63_t) x0 * c0; + /* acc1 += x[1] * y[srcBLen - 1] */ + acc1 += (q63_t) x1 * c0; + /* acc2 += x[2] * y[srcBLen - 1] */ + acc2 += (q63_t) x2 * c0; + + /* Read y[srcBLen - 2] sample */ + c0 = *(py - 1U); + + /* Read x[3] sample */ + x0 = *(px + 1U); + + /* Perform the multiply-accumulate */ + /* acc0 += x[1] * y[srcBLen - 2] */ + acc0 += (q63_t) x1 * c0; + /* acc1 += x[2] * y[srcBLen - 2] */ + acc1 += (q63_t) x2 * c0; + /* acc2 += x[3] * y[srcBLen - 2] */ + acc2 += (q63_t) x0 * c0; + + /* Read y[srcBLen - 3] sample */ + c0 = *(py - 2U); + + /* Read x[4] sample */ + x1 = *(px + 2U); + + /* Perform the multiply-accumulate */ + /* acc0 += x[2] * y[srcBLen - 3] */ + acc0 += (q63_t) x2 * c0; + /* acc1 += x[3] * y[srcBLen - 2] */ + acc1 += (q63_t) x0 * c0; + /* acc2 += x[4] * y[srcBLen - 2] */ + acc2 += (q63_t) x1 * c0; + + + px += 3U; + + py -= 3U; + + } while (--k); + + /* If the srcBLen is not a multiple of 3, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen - (3 * (srcBLen / 3)); + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *py--; + /* Read x[7] sample */ + x2 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[srcBLen - 5] */ + acc0 += (q63_t) x0 * c0; + /* acc1 += x[5] * y[srcBLen - 5] */ + acc1 += (q63_t) x1 * c0; + /* acc2 += x[6] * y[srcBLen - 5] */ + acc2 += (q63_t) x2 * c0; + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (acc0 >> 31); + *pOut++ = (q31_t) (acc1 >> 31); + *pOut++ = (q31_t) (acc2 >> 31); + + /* Increment the pointer pIn1 index, count by 3 */ + count += 3U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize2 - 3 * (blockSize2 / 3); + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += (q63_t) *px++ * (*py--); + sum += (q63_t) *px++ * (*py--); + sum += (q63_t) *px++ * (*py--); + sum += (q63_t) *px++ * (*py--); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (sum >> 31); + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = (uint32_t) blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (sum >> 31); + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The blockSize3 variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ + sum += (q63_t) *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ + sum += (q63_t) *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ + sum += (q63_t) *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ + sum += (q63_t) *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum += (q63_t) *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (sum >> 31); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement MAC count */ + count--; + + /* Decrement the loop counter */ + blockSize3--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +#else +/* alternate version for CM0_FAMILY */ + + const q31_t *pIn1 = pSrcA; /* InputA pointer */ + const q31_t *pIn2 = pSrcB; /* InputB pointer */ + q63_t sum; /* Accumulator */ + uint32_t i, j; /* Loop counters */ + arm_status status; /* Status of Partial convolution */ + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* Loop to calculate convolution for output length number of values */ + for (i = firstIndex; i <= (firstIndex + numPoints - 1); i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q63_t) pIn1[j] * pIn2[i - j]); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = (q31_t) (sum >> 31U); + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of PartialConv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q7.c new file mode 100644 index 0000000..9b0228c --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_partial_q7.c @@ -0,0 +1,753 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_partial_q7.c + * Description: Partial convolution of Q7 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup PartialConv + @{ + */ + +/** + @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 location where the output result is written + @param[in] firstIndex is the first output sample to start with + @param[in] numPoints is the number of output points to be computed + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : requested subset is not in the range [0 srcALen+srcBLen-2] + + @remark + Refer to \ref arm_conv_partial_opt_q7() for a faster implementation of this function. + */ + +arm_status arm_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) +{ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + const q7_t *pIn1; /* InputA pointer */ + const q7_t *pIn2; /* InputB pointer */ + q7_t *pOut = pDst; /* Output pointer */ + const q7_t *px; /* Intermediate inputA pointer */ + const q7_t *py; /* Intermediate inputB pointer */ + const q7_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q31_t sum; /* Accumulator */ + uint32_t j, k, count, blkCnt, check; /* Loop counters */ + int32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + arm_status status; /* Status of Partial convolution */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc0, acc1, acc2, acc3; /* Accumulator */ + q31_t input1, input2; /* Temporary input variables */ + q15_t in1, in2; /* Temporary input variables */ + q7_t x0, x1, x2, x3, c0, c1; /* Temporary variables to hold state and coefficient values */ +#endif + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* Conditions to check which loopCounter holds + * the first and last indices of the output samples to be calculated. */ + check = firstIndex + numPoints; + blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; + blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; + blockSize1 = ((int32_t) srcBLen - 1) - (int32_t) firstIndex; + blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1U)) ? blockSize1 : (int32_t) numPoints) : 0; + blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + (int32_t) firstIndex); + blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* Set the output pointer to point to the firstIndex + * of the output sample to be calculated. */ + pOut = pDst + firstIndex; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed. + Since the partial convolution starts from firstIndex + Number of Macs to be performed is firstIndex + 1 */ + count = 1U + firstIndex; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + firstIndex; + py = pSrc2; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* x[0] , x[1] */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* y[srcBLen - 1] , y[srcBLen - 2] */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* x[0] * y[srcBLen - 1] */ + /* x[1] * y[srcBLen - 2] */ + sum = __SMLAD(input1, input2, sum); + + /* x[2] , x[3] */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* y[srcBLen - 3] , y[srcBLen - 4] */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* x[2] * y[srcBLen - 3] */ + /* x[3] * y[srcBLen - 4] */ + sum = __SMLAD(input1, input2, sum); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q31_t) * px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(sum >> 7, 8)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = ++pSrc2; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + if ((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) + { + pSrc1 = pIn1 + firstIndex - srcBLen + 1; + } + else + { + pSrc1 = pIn1; + } + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is the index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = ((uint32_t) blockSize2 >> 2U); + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read y[srcBLen - 1] sample */ + c0 = *py--; + /* Read y[srcBLen - 2] sample */ + c1 = *py--; + + /* Read x[3] sample */ + x3 = *px++; + + /* x[0] and x[1] are packed */ + in1 = (q15_t) x0; + in2 = (q15_t) x1; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* y[srcBLen - 1] and y[srcBLen - 2] are packed */ + in1 = (q15_t) c0; + in2 = (q15_t) c1; + + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ + acc0 = __SMLAD(input1, input2, acc0); + + /* x[1] and x[2] are packed */ + in1 = (q15_t) x1; + in2 = (q15_t) x2; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ + acc1 = __SMLAD(input1, input2, acc1); + + /* x[2] and x[3] are packed */ + in1 = (q15_t) x2; + in2 = (q15_t) x3; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ + acc2 = __SMLAD(input1, input2, acc2); + + /* Read x[4] sample */ + x0 = *px++; + + /* x[3] and x[4] are packed */ + in1 = (q15_t) x3; + in2 = (q15_t) x0; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ + acc3 = __SMLAD(input1, input2, acc3); + + /* Read y[srcBLen - 3] sample */ + c0 = *py--; + /* Read y[srcBLen - 4] sample */ + c1 = *py--; + + /* Read x[5] sample */ + x1 = *px++; + + /* x[2] and x[3] are packed */ + in1 = (q15_t) x2; + in2 = (q15_t) x3; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* y[srcBLen - 3] and y[srcBLen - 4] are packed */ + in1 = (q15_t) c0; + in2 = (q15_t) c1; + + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ + acc0 = __SMLAD(input1, input2, acc0); + + /* x[3] and x[4] are packed */ + in1 = (q15_t) x3; + in2 = (q15_t) x0; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ + acc1 = __SMLAD(input1, input2, acc1); + + /* x[4] and x[5] are packed */ + in1 = (q15_t) x0; + in2 = (q15_t) x1; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ + acc2 = __SMLAD(input1, input2, acc2); + + /* Read x[6] sample */ + x2 = *px++; + + /* x[5] and x[6] are packed */ + in1 = (q15_t) x1; + in2 = (q15_t) x2; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ + acc3 = __SMLAD(input1, input2, acc3); + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *py--; + /* Read x[7] sample */ + x3 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[srcBLen - 5] */ + acc0 += ((q31_t) x0 * c0); + /* acc1 += x[5] * y[srcBLen - 5] */ + acc1 += ((q31_t) x1 * c0); + /* acc2 += x[6] * y[srcBLen - 5] */ + acc2 += ((q31_t) x2 * c0); + /* acc3 += x[7] * y[srcBLen - 5] */ + acc3 += ((q31_t) x3 * c0); + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(acc0 >> 7, 8)); + *pOut++ = (q7_t) (__SSAT(acc1 >> 7, 8)); + *pOut++ = (q7_t) (__SSAT(acc2 >> 7, 8)); + *pOut++ = (q7_t) (__SSAT(acc3 >> 7, 8)); + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (uint32_t) blockSize2 % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + while (k > 0U) + { + /* Reading two inputs of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* Reading two inputs of SrcB buffer and packing */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* Perform the multiply-accumulate */ + sum = __SMLAD(input1, input2, sum); + + /* Reading two inputs of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* Reading two inputs of SrcB buffer and packing */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* Perform the multiply-accumulate */ + sum = __SMLAD(input1, input2, sum); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q31_t) * px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(sum >> 7, 8)); + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = (uint32_t) blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q31_t) * px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(sum >> 7, 8)); + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pSrc1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* Reading two inputs, x[srcALen - srcBLen + 1] and x[srcALen - srcBLen + 2] of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* Reading two inputs, y[srcBLen - 1] and y[srcBLen - 2] of SrcB buffer and packing */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ + /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ + sum = __SMLAD(input1, input2, sum); + + /* Reading two inputs, x[srcALen - srcBLen + 3] and x[srcALen - srcBLen + 4] of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* Reading two inputs, y[srcBLen - 3] and y[srcBLen - 4] of SrcB buffer and packing */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ + /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ + sum = __SMLAD(input1, input2, sum); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum += ((q31_t) * px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(sum >> 7, 8)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement MAC count */ + count--; + + /* Decrement the loop counter */ + blockSize3--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +#else +/* alternate version for CM0_FAMILY */ + + const q7_t *pIn1 = pSrcA; /* InputA pointer */ + const q7_t *pIn2 = pSrcB; /* InputB pointer */ + q31_t sum; /* Accumulator */ + uint32_t i, j; /* Loop counters */ + arm_status status; /* Status of Partial convolution */ + + /* Check for range of output samples to be calculated */ + if ((firstIndex + numPoints) > ((srcALen + (srcBLen - 1U)))) + { + /* Set status as ARM_MATH_ARGUMENT_ERROR */ + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* Loop to calculate convolution for output length number of values */ + for (i = firstIndex; i <= (firstIndex + numPoints - 1); i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q15_t) pIn1[j] * (pIn2[i - j])); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = (q7_t) __SSAT((sum >> 7U), 8U); + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of PartialConv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q15.c new file mode 100644 index 0000000..ad2b629 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q15.c @@ -0,0 +1,696 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_q15.c + * Description: Convolution of Q15 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Conv + @{ + */ + +/** + @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. + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both inputs are 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. + This approach provides 33 guard bits and there is no risk of overflow. + The 34.30 result is then truncated to 34.15 format by discarding the low 15 bits and then saturated to 1.15 format. + + @remark + Refer to \ref arm_conv_fast_q15() for a faster but less precise version of this function. + @remark + Refer to \ref arm_conv_opt_q15() for a faster implementation of this function using scratch buffers. + */ + +void arm_conv_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst) +{ + +#if defined (ARM_MATH_DSP) + + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + q15_t *pOut = pDst; /* Output pointer */ + q63_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ + const q15_t *px; /* Intermediate inputA pointer */ + const q15_t *py; /* Intermediate inputB pointer */ + const q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q31_t x0, x1, x2, x3, c0; /* Temporary input variables to hold state and coefficient values */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* For loop unrolling by 4, this stage is divided into two. */ + /* First part of this stage computes the MAC operations less than 4 */ + /* Second part of this stage computes the MAC operations greater than or equal to 4 */ + + /* The first part of the stage starts here */ + while ((count < 4U) && (blockSize1 > 0U)) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Loop over number of MAC operations between + * inputA samples and inputB samples */ + k = count; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = __SMLALD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pIn2 + count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* The second part of the stage starts here */ + /* The internal loop, over count, is unrolled by 4 */ + /* To, read the last two inputB samples using SIMD: + * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ + py = py - 1; + + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[0], x[1] are multiplied with y[srcBLen - 1], y[srcBLen - 2] respectively */ + sum = __SMLALDX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + /* x[2], x[3] are multiplied with y[srcBLen - 3], y[srcBLen - 4] respectively */ + sum = __SMLALDX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* For the next MAC operations, the pointer py is used without SIMD + * So, py is incremented by 1 */ + py = py + 1U; + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = __SMLALD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pIn2 + (count - 1U); + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is the index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize2 >> 2U; + + while (blkCnt > 0U) + { + py = py - 1U; + + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1] samples */ + x0 = read_q15x2 ((q15_t *) px); + + /* read x[1], x[2] samples */ + x1 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read the last two inputB samples using SIMD: + * y[srcBLen - 1] and y[srcBLen - 2] */ + c0 = read_q15x2_da ((q15_t **) &py); + + /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ + acc0 = __SMLALDX(x0, c0, acc0); + + /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ + acc1 = __SMLALDX(x1, c0, acc1); + + /* Read x[2], x[3] */ + x2 = read_q15x2 ((q15_t *) px); + + /* Read x[3], x[4] */ + x3 = read_q15x2 ((q15_t *) px + 1); + + /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ + acc2 = __SMLALDX(x2, c0, acc2); + + /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ + acc3 = __SMLALDX(x3, c0, acc3); + + /* Read y[srcBLen - 3] and y[srcBLen - 4] */ + c0 = read_q15x2_da ((q15_t **) &py); + + /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ + acc0 = __SMLALDX(x2, c0, acc0); + + /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ + acc1 = __SMLALDX(x3, c0, acc1); + + /* Read x[4], x[5] */ + x0 = read_q15x2 ((q15_t *) px + 2); + + /* Read x[5], x[6] */ + x1 = read_q15x2 ((q15_t *) px + 3); + + px += 4U; + + /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ + acc2 = __SMLALDX(x0, c0, acc2); + + /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ + acc3 = __SMLALDX(x1, c0, acc3); + + } while (--k); + + /* For the next MAC operations, SIMD is not used + * So, the 16 bit pointer if inputB, py is updated */ + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + if (k == 1U) + { + /* Read y[srcBLen - 5] */ + c0 = *(py + 1); +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[7] */ + x3 = read_q15x2 ((q15_t *) px); + px++; + + /* Perform the multiply-accumulate */ + acc0 = __SMLALD(x0, c0, acc0); + acc1 = __SMLALD(x1, c0, acc1); + acc2 = __SMLALDX(x1, c0, acc2); + acc3 = __SMLALDX(x3, c0, acc3); + } + + if (k == 2U) + { + /* Read y[srcBLen - 5], y[srcBLen - 6] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Perform the multiply-accumulate */ + acc0 = __SMLALDX(x0, c0, acc0); + acc1 = __SMLALDX(x1, c0, acc1); + acc2 = __SMLALDX(x3, c0, acc2); + acc3 = __SMLALDX(x2, c0, acc3); + } + + if (k == 3U) + { + /* Read y[srcBLen - 5], y[srcBLen - 6] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + + /* Perform the multiply-accumulate */ + acc0 = __SMLALDX(x0, c0, acc0); + acc1 = __SMLALDX(x1, c0, acc1); + acc2 = __SMLALDX(x3, c0, acc2); + acc3 = __SMLALDX(x2, c0, acc3); + + c0 = *(py-1); +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[10] */ + x3 = read_q15x2 ((q15_t *) px + 2); + px += 3U; + + /* Perform the multiply-accumulates */ + acc0 = __SMLALDX(x1, c0, acc0); + acc1 = __SMLALD(x2, c0, acc1); + acc2 = __SMLALDX(x2, c0, acc2); + acc3 = __SMLALDX(x3, c0, acc3); + } + + /* Store the result in the accumulator in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16)); +#else + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16)); + write_q15x2_ia (&pOut, __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize2 % 0x4U; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += (q63_t) ((q31_t) *px++ * *py--); + sum += (q63_t) ((q31_t) *px++ * *py--); + sum += (q63_t) ((q31_t) *px++ * *py--); + sum += (q63_t) ((q31_t) *px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += (q63_t) ((q31_t) *px++ * *py--); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT(sum >> 15, 16)); + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) ((q31_t) *px++ * *py--); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT(sum >> 15, 16)); + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The blockSize3 variable holds the number of MAC operations performed */ + blockSize3 = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + pIn2 = pSrc2 - 1U; + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + /* For loop unrolling by 4, this stage is divided into two. */ + /* First part of this stage computes the MAC operations greater than 4 */ + /* Second part of this stage computes the MAC operations less than or equal to 4 */ + + /* The first part of the stage starts here */ + j = blockSize3 >> 2U; + + while ((j > 0U) && (blockSize3 > 0U)) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = blockSize3 >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[srcALen - srcBLen + 1], x[srcALen - srcBLen + 2] are multiplied + * with y[srcBLen - 1], y[srcBLen - 2] respectively */ + sum = __SMLALDX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + /* x[srcALen - srcBLen + 3], x[srcALen - srcBLen + 4] are multiplied + * with y[srcBLen - 3], y[srcBLen - 4] respectively */ + sum = __SMLALDX(read_q15x2_ia ((q15_t **) &px), read_q15x2_da ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* For the next MAC operations, the pointer py is used without SIMD + * So, py is incremented by 1 */ + py = py + 1U; + + /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = blockSize3 % 0x4U; + + while (k > 0U) + { + /* sum += x[srcALen - srcBLen + 5] * y[srcBLen - 5] */ + sum = __SMLALD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement loop counter */ + blockSize3--; + + j--; + } + + /* The second part of the stage starts here */ + /* SIMD is not used for the next MAC operations, + * so pointer py is updated to read only one sample at a time */ + py = py + 1U; + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = blockSize3; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum = __SMLALD(*px++, *py--, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement loop counter */ + blockSize3--; + } + +#else /* #if defined (ARM_MATH_DSP) */ + + const q15_t *pIn1 = pSrcA; /* InputA pointer */ + const q15_t *pIn2 = pSrcB; /* InputB pointer */ + q63_t sum; /* Accumulator */ + uint32_t i, j; /* Loop counters */ + + /* Loop to calculate convolution for output length number of values */ + for (i = 0; i < (srcALen + srcBLen - 1); i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q31_t) pIn1[j] * pIn2[i - j]); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = (q15_t) __SSAT((sum >> 15U), 16U); + } + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + +/** + @} end of Conv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q31.c new file mode 100644 index 0000000..39550ec --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q31.c @@ -0,0 +1,581 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_q31.c + * Description: Convolution of Q31 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Conv + @{ + */ + +/** + @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 location where the output result is written. Length srcALen+srcBLen-1. + @return none + + @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. + There is no saturation on intermediate additions. + Thus, if the accumulator overflows it wraps around and distorts the result. + The input signals should be scaled down to avoid intermediate overflows. + Scale down the inputs by log2(min(srcALen, srcBLen)) (log2 is read as log to the base 2) times to avoid overflows, + as maximum of min(srcALen, srcBLen) number of additions are carried internally. + The 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. + + @remark + Refer to \ref arm_conv_fast_q31() for a faster but less precise implementation of this function. + */ + +void arm_conv_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst) +{ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + const q31_t *pIn1; /* InputA pointer */ + const q31_t *pIn2; /* InputB pointer */ + q31_t *pOut = pDst; /* Output pointer */ + const q31_t *px; /* Intermediate inputA pointer */ + const q31_t *py; /* Intermediate inputB pointer */ + const q31_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q63_t sum; /* Accumulators */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc0, acc1, acc2; /* Accumulators */ + q31_t x0, x1, x2, c0; /* Temporary variables to hold state and coefficient values */ +#endif + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* x[0] * y[srcBLen - 1] */ + sum += (q63_t) *px++ * (*py--); + + /* x[1] * y[srcBLen - 2] */ + sum += (q63_t) *px++ * (*py--); + + /* x[2] * y[srcBLen - 3] */ + sum += (q63_t) *px++ * (*py--); + + /* x[3] * y[srcBLen - 4] */ + sum += (q63_t) *px++ * (*py--); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (sum >> 31); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pIn2 + count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unroll by 3 */ + blkCnt = blockSize2 / 3; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + + /* Apply loop unrolling and compute 3 MACs simultaneously. */ + k = srcBLen / 3; + + /* First part of the processing with loop unrolling. Compute 3 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 2 samples. */ + do + { + /* Read y[srcBLen - 1] sample */ + c0 = *(py); + /* Read x[3] sample */ + x2 = *(px); + + /* Perform the multiply-accumulate */ + /* acc0 += x[0] * y[srcBLen - 1] */ + acc0 += ((q63_t) x0 * c0); + /* acc1 += x[1] * y[srcBLen - 1] */ + acc1 += ((q63_t) x1 * c0); + /* acc2 += x[2] * y[srcBLen - 1] */ + acc2 += ((q63_t) x2 * c0); + + /* Read y[srcBLen - 2] sample */ + c0 = *(py - 1U); + /* Read x[4] sample */ + x0 = *(px + 1U); + + /* Perform the multiply-accumulate */ + /* acc0 += x[1] * y[srcBLen - 2] */ + acc0 += ((q63_t) x1 * c0); + /* acc1 += x[2] * y[srcBLen - 2] */ + acc1 += ((q63_t) x2 * c0); + /* acc2 += x[3] * y[srcBLen - 2] */ + acc2 += ((q63_t) x0 * c0); + + /* Read y[srcBLen - 3] sample */ + c0 = *(py - 2U); + /* Read x[5] sample */ + x1 = *(px + 2U); + + /* Perform the multiply-accumulate */ + /* acc0 += x[2] * y[srcBLen - 3] */ + acc0 += ((q63_t) x2 * c0); + /* acc1 += x[3] * y[srcBLen - 2] */ + acc1 += ((q63_t) x0 * c0); + /* acc2 += x[4] * y[srcBLen - 2] */ + acc2 += ((q63_t) x1 * c0); + + /* update scratch pointers */ + px += 3U; + py -= 3U; + + } while (--k); + + /* If the srcBLen is not a multiple of 3, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen - (3 * (srcBLen / 3)); + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *py--; + /* Read x[7] sample */ + x2 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[srcBLen - 5] */ + acc0 += ((q63_t) x0 * c0); + /* acc1 += x[5] * y[srcBLen - 5] */ + acc1 += ((q63_t) x1 * c0); + /* acc2 += x[6] * y[srcBLen - 5] */ + acc2 += ((q63_t) x2 * c0); + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (acc0 >> 31); + *pOut++ = (q31_t) (acc1 >> 31); + *pOut++ = (q31_t) (acc2 >> 31); + + /* Increment the pointer pIn1 index, count by 3 */ + count += 3U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize2 - 3 * (blockSize2 / 3); + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += (q63_t) *px++ * *py--; + sum += (q63_t) *px++ * *py--; + sum += (q63_t) *px++ * *py--; + sum += (q63_t) *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) *px++ * *py--; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (sum >> 31); + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) *px++ * *py--; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (sum >> 31); + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The blockSize3 variable holds the number of MAC operations performed */ + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = blockSize3 >> 2U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ + sum += (q63_t) *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ + sum += (q63_t) *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ + sum += (q63_t) *px++ * *py--; + + /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ + sum += (q63_t) *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = blockSize3 % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = blockSize3; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum += (q63_t) *px++ * *py--; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q31_t) (sum >> 31); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement loop counter */ + blockSize3--; + } + +#else +/* alternate version for CM0_FAMILY */ + + const q31_t *pIn1 = pSrcA; /* InputA pointer */ + const q31_t *pIn2 = pSrcB; /* InputB pointer */ + q63_t sum; /* Accumulators */ + uint32_t i, j; /* Loop counters */ + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i < (srcALen + srcBLen - 1U); i++) + { + /* Initialize sum with zero to carry out MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q63_t) pIn1[j] * pIn2[i - j]); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = (q31_t) (sum >> 31U); + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of Conv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q7.c new file mode 100644 index 0000000..bdd1cab --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_conv_q7.c @@ -0,0 +1,700 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_conv_q7.c + * Description: Convolution of Q7 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Conv + @{ + */ + +/** + @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 location where the output result is written. Length srcALen+srcBLen-1. + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 32-bit internal accumulator. + Both the inputs are represented in 1.7 format and multiplications yield a 2.14 result. + The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. + This approach provides 17 guard bits and there is no risk of overflow as long as max(srcALen, srcBLen)<131072. + The 18.14 result is then truncated to 18.7 format by discarding the low 7 bits and then saturated to 1.7 format. + @remark + Refer to \ref arm_conv_opt_q7() for a faster implementation of this function. + */ + +void arm_conv_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst) +{ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + const q7_t *pIn1; /* InputA pointer */ + const q7_t *pIn2; /* InputB pointer */ + q7_t *pOut = pDst; /* Output pointer */ + const q7_t *px; /* Intermediate inputA pointer */ + const q7_t *py; /* Intermediate inputB pointer */ + const q7_t *pSrc1, *pSrc2; /* Intermediate pointers */ + q31_t sum; /* Accumulators */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc0, acc1, acc2, acc3; /* Accumulators */ + q31_t input1, input2; /* Temporary input variables */ + q15_t in1, in2; /* Temporary input variables */ + q7_t x0, x1, x2, x3, c0, c1; /* Temporary variables to hold state and coefficient values */ +#endif + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + } + + /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[0] + * sum = x[0] * y[1] + x[1] * y[0] + * .... + * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* x[0] , x[1] */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* y[srcBLen - 1] , y[srcBLen - 2] */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* x[0] * y[srcBLen - 1] */ + /* x[1] * y[srcBLen - 2] */ + sum = __SMLAD(input1, input2, sum); + + /* x[2] , x[3] */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* y[srcBLen - 3] , y[srcBLen - 4] */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* x[2] * y[srcBLen - 3] */ + /* x[3] * y[srcBLen - 4] */ + sum = __SMLAD(input1, input2, sum); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q15_t) *px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(sum >> 7U, 8)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pIn2 + count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] + * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] + * .... + * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize2 >> 2U; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read y[srcBLen - 1] sample */ + c0 = *py--; + /* Read y[srcBLen - 2] sample */ + c1 = *py--; + + /* Read x[3] sample */ + x3 = *px++; + + /* x[0] and x[1] are packed */ + in1 = (q15_t) x0; + in2 = (q15_t) x1; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* y[srcBLen - 1] and y[srcBLen - 2] are packed */ + in1 = (q15_t) c0; + in2 = (q15_t) c1; + + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ + acc0 = __SMLAD(input1, input2, acc0); + + /* x[1] and x[2] are packed */ + in1 = (q15_t) x1; + in2 = (q15_t) x2; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ + acc1 = __SMLAD(input1, input2, acc1); + + /* x[2] and x[3] are packed */ + in1 = (q15_t) x2; + in2 = (q15_t) x3; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ + acc2 = __SMLAD(input1, input2, acc2); + + /* Read x[4] sample */ + x0 = *px++; + + /* x[3] and x[4] are packed */ + in1 = (q15_t) x3; + in2 = (q15_t) x0; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ + acc3 = __SMLAD(input1, input2, acc3); + + /* Read y[srcBLen - 3] sample */ + c0 = *py--; + /* Read y[srcBLen - 4] sample */ + c1 = *py--; + + /* Read x[5] sample */ + x1 = *px++; + + /* x[2] and x[3] are packed */ + in1 = (q15_t) x2; + in2 = (q15_t) x3; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* y[srcBLen - 3] and y[srcBLen - 4] are packed */ + in1 = (q15_t) c0; + in2 = (q15_t) c1; + + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ + acc0 = __SMLAD(input1, input2, acc0); + + /* x[3] and x[4] are packed */ + in1 = (q15_t) x3; + in2 = (q15_t) x0; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ + acc1 = __SMLAD(input1, input2, acc1); + + /* x[4] and x[5] are packed */ + in1 = (q15_t) x0; + in2 = (q15_t) x1; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ + acc2 = __SMLAD(input1, input2, acc2); + + /* Read x[6] sample */ + x2 = *px++; + + /* x[5] and x[6] are packed */ + in1 = (q15_t) x1; + in2 = (q15_t) x2; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ + acc3 = __SMLAD(input1, input2, acc3); + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *py--; + /* Read x[7] sample */ + x3 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[srcBLen - 5] */ + acc0 += ((q15_t) x0 * c0); + /* acc1 += x[5] * y[srcBLen - 5] */ + acc1 += ((q15_t) x1 * c0); + /* acc2 += x[6] * y[srcBLen - 5] */ + acc2 += ((q15_t) x2 * c0); + /* acc3 += x[7] * y[srcBLen - 5] */ + acc3 += ((q15_t) x3 * c0); + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(acc0 >> 7U, 8)); + *pOut++ = (q7_t) (__SSAT(acc1 >> 7U, 8)); + *pOut++ = (q7_t) (__SSAT(acc2 >> 7U, 8)); + *pOut++ = (q7_t) (__SSAT(acc3 >> 7U, 8)); + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize2 % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + while (k > 0U) + { + + /* Reading two inputs of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Reading two inputs of SrcB buffer and packing */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Perform the multiply-accumulate */ + sum = __SMLAD(input1, input2, sum); + + /* Reading two inputs of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Reading two inputs of SrcB buffer and packing */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Perform the multiply-accumulate */ + sum = __SMLAD(input1, input2, sum); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q15_t) *px++ * *py--); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(sum >> 7U, 8)); + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q15_t) *px++ * *py--); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(sum >> 7U, 8)); + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pSrc2; + + /* Decrement loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] + * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] + * .... + * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] + * sum += x[srcALen-1] * y[srcBLen-1] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The blockSize3 variable holds the number of MAC operations performed */ + + /* Working pointer of inputA */ + pSrc1 = pIn1 + (srcALen - (srcBLen - 1U)); + px = pSrc1; + + /* Working pointer of inputB */ + pSrc2 = pIn2 + (srcBLen - 1U); + py = pSrc2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = blockSize3 >> 2U; + + while (k > 0U) + { + /* Reading two inputs, x[srcALen - srcBLen + 1] and x[srcALen - srcBLen + 2] of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Reading two inputs, y[srcBLen - 1] and y[srcBLen - 2] of SrcB buffer and packing */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ + /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ + sum = __SMLAD(input1, input2, sum); + + /* Reading two inputs, x[srcALen - srcBLen + 3] and x[srcALen - srcBLen + 4] of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Reading two inputs, y[srcBLen - 3] and y[srcBLen - 4] of SrcB buffer and packing */ + in1 = (q15_t) *py--; + in2 = (q15_t) *py--; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ + /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ + sum = __SMLAD(input1, input2, sum); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = blockSize3 % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = blockSize3; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen-1] * y[srcBLen-1] */ + sum += ((q15_t) *px++ * *py--); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut++ = (q7_t) (__SSAT(sum >> 7U, 8)); + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pSrc2; + + /* Decrement loop counter */ + blockSize3--; + } + +#else +/* alternate version for CM0_FAMILY */ + + const q7_t *pIn1 = pSrcA; /* InputA pointer */ + const q7_t *pIn2 = pSrcB; /* InputB pointer */ + q31_t sum; /* Accumulator */ + uint32_t i, j; /* Loop counters */ + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i < (srcALen + srcBLen - 1U); i++) + { + /* Initialize sum with zero to carry out MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q15_t) pIn1[j] * pIn2[i - j]); + } + } + + /* Store the output in the destination buffer */ + pDst[i] = (q7_t) __SSAT((sum >> 7U), 8U); + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of Conv group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_f32.c new file mode 100644 index 0000000..1096526 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_f32.c @@ -0,0 +1,893 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_correlate_f32.c + * Description: Correlation of floating-point sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup Corr Correlation + + Correlation is a mathematical operation that is similar to convolution. + As with convolution, correlation uses two signals to produce a third signal. + The underlying algorithms in correlation and convolution are identical except that one of the inputs is flipped in convolution. + Correlation is commonly used to measure the similarity between two signals. + It has applications in pattern recognition, cryptanalysis, and searching. + The CMSIS library provides correlation functions for Q7, Q15, Q31 and floating-point data types. + Fast versions of the Q15 and Q31 functions are also provided. + + @par Algorithm + Let a[n] and b[n] be sequences of length srcALen and srcBLen samples respectively. + The convolution of the two signals is denoted by +
+      c[n] = a[n] * b[n]
+  
+ In correlation, one of the signals is flipped in time +
+       c[n] = a[n] * b[-n]
+  
+ @par + and this is mathematically defined as + \image html CorrelateEquation.gif + @par + The pSrcA points to the first input vector of length srcALen and pSrcB points to the second input vector of length srcBLen. + The result c[n] is of length 2 * max(srcALen, srcBLen) - 1 and is defined over the interval n=0, 1, 2, ..., (2 * max(srcALen, srcBLen) - 2). + The output result is written to pDst and the calling function must allocate 2 * max(srcALen, srcBLen) - 1 words for the result. + + @note + The pDst should be initialized to all zeros before being used. + + @par Fixed-Point Behavior + Correlation requires summing up a large number of intermediate products. + As such, the Q7, Q15, and Q31 functions run a risk of overflow and saturation. + Refer to the function specific documentation below for further details of the particular algorithm used. + + @par Fast Versions + Fast versions are supported for Q31 and Q15. Cycles for Fast versions are less compared to Q31 and Q15 of correlate and the design requires + the input signals should be scaled down to avoid intermediate overflows. + + @par Opt Versions + Opt versions are supported for Q15 and Q7. Design uses internal scratch buffer for getting good optimisation. + These versions are optimised in cycles and consumes more memory (Scratch memory) compared to Q15 and Q7 versions of correlate + */ + +/** + @addtogroup Corr + @{ + */ + +/** + @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 location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. + @return none + */ + +void arm_correlate_f32( + const float32_t * pSrcA, + uint32_t srcALen, + const float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst) +{ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + const float32_t *pIn1; /* InputA pointer */ + const float32_t *pIn2; /* InputB pointer */ + float32_t *pOut = pDst; /* Output pointer */ + const float32_t *px; /* Intermediate inputA pointer */ + const float32_t *py; /* Intermediate inputB pointer */ + const float32_t *pSrc1; + float32_t sum; + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + uint32_t outBlockSize; /* Loop counter */ + int32_t inc = 1; /* Destination address modifier */ + +#if defined (ARM_MATH_LOOPUNROLL) || defined (ARM_MATH_NEON) + float32_t acc0, acc1, acc2, acc3; /* Accumulators */ + float32_t x0, x1, x2, x3, c0; /* temporary variables for holding input and coefficient values */ +#endif + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and the destination pointer modifier, inc is set to -1 */ + /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ + /* But to improve the performance, + * we assume zeroes in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, + * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ + /* If srcALen < srcBLen, + * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + + /* Number of output samples is calculated */ + outBlockSize = (2U * srcALen) - 1U; + + /* When srcALen > srcBLen, zero padding has to be done to srcB + * to make their lengths equal. + * Instead, (outBlockSize - (srcALen + srcBLen - 1)) + * number of output samples are made zero */ + j = outBlockSize - (srcALen + (srcBLen - 1U)); + + /* Updating the pointer position to non zero value */ + pOut += j; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + + /* CORR(x, y) = Reverse order(CORR(y, x)) */ + /* Hence set the destination pointer to point to the last output sample */ + pOut = pDst + ((srcALen + srcBLen) - 2U); + + /* Destination address modifier is set to -1 */ + inc = -1; + } + + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[srcBlen - 1] + * sum = x[0] * y[srcBlen-2] + x[1] * y[srcBlen - 1] + * .... + * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc1 = pIn2 + (srcBLen - 1U); + py = pSrc1; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + +#if defined(ARM_MATH_NEON) + float32x4_t x,y; + float32x4_t res = vdupq_n_f32(0) ; + float32x2_t accum = vdup_n_f32(0); + + while (k > 0U) + { + x = vld1q_f32(px); + y = vld1q_f32(py); + + res = vmlaq_f32(res,x, y); + + px += 4; + py += 4; + + /* Decrement the loop counter */ + k--; + } + + accum = vpadd_f32(vget_low_f32(res), vget_high_f32(res)); + sum += accum[0] + accum[1]; + + k = count & 0x3; +#else + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* x[0] * y[srcBLen - 4] */ + sum += *px++ * *py++; + + /* x[1] * y[srcBLen - 3] */ + sum += *px++ * *py++; + + /* x[2] * y[srcBLen - 2] */ + sum += *px++ * *py++; + + /* x[3] * y[srcBLen - 1] */ + sum += *px++ * *py++; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#endif /* #if defined(ARM_MATH_NEON) */ +#else + + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[0] * y[srcBLen - 1] */ + sum += *px++ * *py++; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = sum; + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pSrc1 - count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] + * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] + * .... + * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { +#if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize2 >> 2U; + +#if defined(ARM_MATH_NEON) + float32x4_t c; + float32x4_t x1v; + float32x4_t x2v; + uint32x4_t x1v_u; + uint32x4_t x2v_u; + float32x4_t x; + uint32x4_t x_u; + float32x4_t res = vdupq_n_f32(0) ; +#endif /* #if defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0.0f; + acc1 = 0.0f; + acc2 = 0.0f; + acc3 = 0.0f; + +#if defined(ARM_MATH_NEON) + /* Compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + res = vdupq_n_f32(0) ; + + x1v = vld1q_f32(px); + px += 4; + do + { + x2v = vld1q_f32(px); + c = vld1q_f32(py); + + py += 4; + + x = x1v; + res = vmlaq_n_f32(res,x,c[0]); + + x = vextq_f32(x1v,x2v,1); + + res = vmlaq_n_f32(res,x,c[1]); + + x = vextq_f32(x1v,x2v,2); + + res = vmlaq_n_f32(res,x,c[2]); + + x = vextq_f32(x1v,x2v,3); + + res = vmlaq_n_f32(res,x,c[3]); + + x1v = x2v; + px+=4; + x2v = vld1q_f32(px); + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen & 0x3; + + while (k > 0U) + { + /* Read y[srcBLen - 5] sample */ + c0 = *(py++); + + res = vmlaq_n_f32(res,x1v,c0); + + /* Reuse the present samples for the next MAC */ + x1v[0] = x1v[1]; + x1v[1] = x1v[2]; + x1v[2] = x1v[3]; + + x1v[3] = *(px++); + + /* Decrement the loop counter */ + k--; + } + + px-=1; + + acc0 = res[0]; + acc1 = res[1]; + acc2 = res[2]; + acc3 = res[3]; +#else + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read y[0] sample */ + c0 = *(py++); + /* Read x[3] sample */ + x3 = *(px++); + + /* Perform the multiply-accumulate */ + /* acc0 += x[0] * y[0] */ + acc0 += x0 * c0; + /* acc1 += x[1] * y[0] */ + acc1 += x1 * c0; + /* acc2 += x[2] * y[0] */ + acc2 += x2 * c0; + /* acc3 += x[3] * y[0] */ + acc3 += x3 * c0; + + /* Read y[1] sample */ + c0 = *(py++); + /* Read x[4] sample */ + x0 = *(px++); + + /* Perform the multiply-accumulate */ + /* acc0 += x[1] * y[1] */ + acc0 += x1 * c0; + /* acc1 += x[2] * y[1] */ + acc1 += x2 * c0; + /* acc2 += x[3] * y[1] */ + acc2 += x3 * c0; + /* acc3 += x[4] * y[1] */ + acc3 += x0 * c0; + + /* Read y[2] sample */ + c0 = *(py++); + /* Read x[5] sample */ + x1 = *(px++); + + /* Perform the multiply-accumulate */ + /* acc0 += x[2] * y[2] */ + acc0 += x2 * c0; + /* acc1 += x[3] * y[2] */ + acc1 += x3 * c0; + /* acc2 += x[4] * y[2] */ + acc2 += x0 * c0; + /* acc3 += x[5] * y[2] */ + acc3 += x1 * c0; + + /* Read y[3] sample */ + c0 = *(py++); + /* Read x[6] sample */ + x2 = *(px++); + + /* Perform the multiply-accumulate */ + /* acc0 += x[3] * y[3] */ + acc0 += x3 * c0; + /* acc1 += x[4] * y[3] */ + acc1 += x0 * c0; + /* acc2 += x[5] * y[3] */ + acc2 += x1 * c0; + /* acc3 += x[6] * y[3] */ + acc3 += x2 * c0; + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Read y[4] sample */ + c0 = *(py++); + /* Read x[7] sample */ + x3 = *(px++); + + /* Perform the multiply-accumulate */ + /* acc0 += x[4] * y[4] */ + acc0 += x0 * c0; + /* acc1 += x[5] * y[4] */ + acc1 += x1 * c0; + /* acc2 += x[6] * y[4] */ + acc2 += x2 * c0; + /* acc3 += x[7] * y[4] */ + acc3 += x3 * c0; + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement the loop counter */ + k--; + } + +#endif /* #if defined(ARM_MATH_NEON) */ + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = acc0; + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + *pOut = acc1; + pOut += inc; + + *pOut = acc2; + pOut += inc; + + *pOut = acc3; + pOut += inc; + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize2 % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) */ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + +#if defined(ARM_MATH_NEON) + float32x4_t x,y; + float32x4_t res = vdupq_n_f32(0) ; + float32x2_t accum = vdup_n_f32(0); + + while (k > 0U) + { + x = vld1q_f32(px); + y = vld1q_f32(py); + + res = vmlaq_f32(res,x, y); + + px += 4; + py += 4; + /* Decrement the loop counter */ + k--; + } + + accum = vpadd_f32(vget_low_f32(res), vget_high_f32(res)); + sum += accum[0] + accum[1]; +#else + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py++; + sum += *px++ * *py++; + sum += *px++ * *py++; + sum += *px++ * *py++; + + /* Decrement loop counter */ + k--; + } +#endif /* #if defined(ARM_MATH_NEON) */ + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; +#else + + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py++; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = sum; + + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + + /* Loop over srcBLen */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py++; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = sum; + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * .... + * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] + * sum += x[srcALen-1] * y[0] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = pIn1 + (srcALen - (srcBLen - 1U)); + px = pSrc1; + + /* Working pointer of inputB */ + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + +#if defined(ARM_MATH_NEON) + float32x4_t x,y; + float32x4_t res = vdupq_n_f32(0) ; + float32x2_t accum = vdup_n_f32(0); + + while (k > 0U) + { + x = vld1q_f32(px); + y = vld1q_f32(py); + + res = vmlaq_f32(res,x, y); + + px += 4; + py += 4; + + /* Decrement the loop counter */ + k--; + } + + accum = vpadd_f32(vget_low_f32(res), vget_high_f32(res)); + sum += accum[0] + accum[1]; +#else + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen - srcBLen + 4] * y[3] */ + sum += *px++ * *py++; + + /* sum += x[srcALen - srcBLen + 3] * y[2] */ + sum += *px++ * *py++; + + /* sum += x[srcALen - srcBLen + 2] * y[1] */ + sum += *px++ * *py++; + + /* sum += x[srcALen - srcBLen + 1] * y[0] */ + sum += *px++ * *py++; + + /* Decrement loop counter */ + k--; + } + +#endif /* #if defined (ARM_MATH_NEON) */ + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) || defined(ARM_MATH_NEON) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += *px++ * *py++; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = sum; + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement MAC count */ + count--; + + /* Decrement the loop counter */ + blockSize3--; + } + +#else +/* alternate version for CM0_FAMILY */ + + const float32_t *pIn1 = pSrcA; /* inputA pointer */ + const float32_t *pIn2 = pSrcB + (srcBLen - 1U); /* inputB pointer */ + float32_t sum; /* Accumulator */ + uint32_t i = 0U, j; /* Loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and a varaible, inv is set to 1 */ + /* If lengths are not equal then zero pad has to be done to make the two + * inputs of same length. But to improve the performance, we assume zeroes + * in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the + * starting of the output buffer */ + /* If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the + * ending of the output buffer */ + /* Once the zero padding is done the remaining of the output is calcualted + * using convolution but with the shorter signal time shifted. */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + + } + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry out MAC operations */ + sum = 0.0f; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if ((((i - j) < srcBLen) && (j < srcALen))) + { + /* z[i] += x[i-j] * y[j] */ + sum += pIn1[j] * pIn2[-((int32_t) i - j)]; + } + } + + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = sum; + else + *pDst++ = sum; + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of Corr group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c new file mode 100644 index 0000000..13661cb --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c @@ -0,0 +1,345 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_correlate_fast_opt_q15.c + * Description: Fast Q15 Correlation + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Corr + @{ + */ + +/** + @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. + @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + @return none + + @par Scaling and Overflow Behavior + This fast version uses a 32-bit accumulator with 2.30 format. + The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. + There is no saturation on intermediate additions. + Thus, if the accumulator overflows it wraps around and distorts the result. + The input signals should be scaled down to avoid intermediate overflows. + Scale down one of the inputs by 1/min(srcALen, srcBLen) to avoid overflow since a + maximum of min(srcALen, srcBLen) number of additions is carried internally. + The 2.30 accumulator is right shifted by 15 bits and then saturated to 1.15 format to yield the final result. + + @remark + Refer to \ref arm_correlate_q15() for a slower implementation of this function which uses a 64-bit accumulator to avoid wrap around distortion. + */ + +void arm_correlate_fast_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch) +{ + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + q31_t acc0; /* Accumulators */ + q15_t *pOut = pDst; /* Output pointer */ + q15_t *pScr1 = pScratch; /* Temporary pointer for scratch */ + const q15_t *py; /* Intermediate inputB pointer */ + uint32_t j, blkCnt, outBlockSize; /* Loop counter */ + int32_t inc = 1; /* Destination address modifier */ + uint32_t tapCnt; /* Loop count */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc1, acc2, acc3; /* Accumulators */ + q31_t x1, x2, x3; /* Temporary variables for holding input and coefficient values */ + q31_t y1, y2; /* State variables */ +#endif + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and the destination pointer modifier, inc is set to -1 */ + /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ + /* But to improve the performance, + * we include zeroes in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, + * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ + /* If srcALen < srcBLen, + * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + + /* Number of output samples is calculated */ + outBlockSize = (2U * srcALen) - 1U; + + /* When srcALen > srcBLen, zero padding is done to srcB + * to make their lengths equal. + * Instead, (outBlockSize - (srcALen + srcBLen - 1)) + * number of output samples are made zero */ + j = outBlockSize - (srcALen + (srcBLen - 1U)); + + /* Updating the pointer position to non zero value */ + pOut += j; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + + /* CORR(x, y) = Reverse order(CORR(y, x)) */ + /* Hence set the destination pointer to point to the last output sample */ + pOut = pDst + ((srcALen + srcBLen) - 2U); + + /* Destination address modifier is set to -1 */ + inc = -1; + } + + pScr1 = pScratch; + + /* Fill (srcBLen - 1U) zeros in scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update temporary scratch pointer */ + pScr1 += (srcBLen - 1U); + + + /* Copy (srcALen) samples in scratch buffer */ + arm_copy_q15(pIn1, pScr1, srcALen); + + /* Update pointers */ + pScr1 += srcALen; + + + /* Fill (srcBLen - 1U) zeros at end of scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update pointer */ + pScr1 += (srcBLen - 1U); + + /* Temporary pointer for scratch2 */ + py = pIn2; + + + /* Actual correlation process starts here */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (srcALen + srcBLen - 1U) >> 2; + + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch; + + /* Clear Accumlators */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Read two samples from scratch buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read next two samples from scratch buffer */ + x2 = read_q15x2_ia (&pScr1); + + tapCnt = (srcBLen) >> 2U; + + while (tapCnt > 0U) + { + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia ((q15_t **) &pIn2); + y2 = read_q15x2_ia ((q15_t **) &pIn2); + + /* multiply and accumlate */ + acc0 = __SMLAD(x1, y1, acc0); + acc2 = __SMLAD(x2, y1, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc1 = __SMLADX(x3, y1, acc1); + + /* Read next two samples from scratch buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* multiply and accumlate */ + acc0 = __SMLAD(x2, y2, acc0); + acc2 = __SMLAD(x1, y2, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x1, x2, 0); +#else + x3 = __PKHBT(x2, x1, 0); +#endif + + acc3 = __SMLADX(x3, y1, acc3); + acc1 = __SMLADX(x3, y2, acc1); + + x2 = read_q15x2_ia (&pScr1); + +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + acc3 = __SMLADX(x3, y2, acc3); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Update scratch pointer for remaining samples of smaller length sequence */ + pScr1 -= 4U; + + /* apply same above for remaining samples of smaller length sequence */ + tapCnt = (srcBLen) & 3U; + + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2); + acc1 += (*pScr1++ * *pIn2); + acc2 += (*pScr1++ * *pIn2); + acc3 += (*pScr1++ * *pIn2++); + + pScr1 -= 3U; + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the results in the accumulators in the destination buffer. */ + *pOut = (__SSAT(acc0 >> 15U, 16)); + pOut += inc; + *pOut = (__SSAT(acc1 >> 15U, 16)); + pOut += inc; + *pOut = (__SSAT(acc2 >> 15U, 16)); + pOut += inc; + *pOut = (__SSAT(acc3 >> 15U, 16)); + pOut += inc; + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch += 4U; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (srcALen + srcBLen - 1U) & 0x3; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (srcALen + srcBLen - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Calculate correlation for remaining samples of Bigger length sequence */ + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch; + + /* Clear Accumlators */ + acc0 = 0; + + tapCnt = (srcBLen) >> 1U; + + while (tapCnt > 0U) + { + + /* Read next two samples from scratch buffer */ + acc0 += (*pScr1++ * *pIn2++); + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + tapCnt = (srcBLen) & 1U; + + /* apply same above for remaining samples of smaller length sequence */ + while (tapCnt > 0U) + { + + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* The result is in 2.30 format. Convert to 1.15 with saturation. + ** Then store the output in the destination buffer. */ + *pOut = (q15_t) (__SSAT((acc0 >> 15), 16)); + pOut += inc; + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch += 1U; + } + +} + +/** + @} end of Corr group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q15.c new file mode 100644 index 0000000..6898618 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q15.c @@ -0,0 +1,614 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_correlate_fast_q15.c + * Description: Fast Q15 Correlation + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Corr + @{ + */ + +/** + @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 + + @par Scaling and Overflow Behavior + This fast version uses a 32-bit accumulator with 2.30 format. + The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. + There is no saturation on intermediate additions. + Thus, if the accumulator overflows it wraps around and distorts the result. + The input signals should be scaled down to avoid intermediate overflows. + Scale down one of the inputs by 1/min(srcALen, srcBLen) to avoid overflow since a + maximum of min(srcALen, srcBLen) number of additions is carried internally. + The 2.30 accumulator is right shifted by 15 bits and then saturated to 1.15 format to yield the final result. + + @remark + Refer to \ref arm_correlate_q15() for a slower implementation of this function which uses a 64-bit accumulator to avoid wrap around distortion. + */ + +void arm_correlate_fast_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst) +{ + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + q15_t *pOut = pDst; /* Output pointer */ + q31_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ + const q15_t *px; /* Intermediate inputA pointer */ + const q15_t *py; /* Intermediate inputB pointer */ + const q15_t *pSrc1; /* Intermediate pointers */ + q31_t x0, x1, x2, x3, c0; /* Temporary variables for holding input and coefficient values */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + uint32_t outBlockSize; + int32_t inc = 1; /* Destination address modifier */ + + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and the destination pointer modifier, inc is set to -1 */ + /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ + /* But to improve the performance, + * we include zeroes in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, + * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ + /* If srcALen < srcBLen, + * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + + /* Number of output samples is calculated */ + outBlockSize = (2U * srcALen) - 1U; + + /* When srcALen > srcBLen, zero padding is done to srcB + * to make their lengths equal. + * Instead, (outBlockSize - (srcALen + srcBLen - 1)) + * number of output samples are made zero */ + j = outBlockSize - (srcALen + (srcBLen - 1U)); + + /* Updating the pointer position to non zero value */ + pOut += j; + + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + + /* CORR(x, y) = Reverse order(CORR(y, x)) */ + /* Hence set the destination pointer to point to the last output sample */ + pOut = pDst + ((srcALen + srcBLen) - 2U); + + /* Destination address modifier is set to -1 */ + inc = -1; + + } + + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[srcBlen - 1] + * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] + * .... + * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc1 = pIn2 + (srcBLen - 1U); + py = pSrc1; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first loop starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* x[0] * y[srcBLen - 4] , x[1] * y[srcBLen - 3] */ + sum = __SMLAD(read_q15x2_ia ((q15_t **) &px), read_q15x2_ia ((q15_t **) &py), sum); + /* x[3] * y[srcBLen - 1] , x[2] * y[srcBLen - 2] */ + sum = __SMLAD(read_q15x2_ia ((q15_t **) &px), read_q15x2_ia ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, compute any remaining MACs here. + No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + /* x[0] * y[srcBLen - 1] */ + sum = __SMLAD(*px++, *py++, sum); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (sum >> 15); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pSrc1 - count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] + * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] + * .... + * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + /* count is the index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* -------------------- + * Stage2 process + * -------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { + /* Loop unroll over blockSize2, by 4 */ + blkCnt = blockSize2 >> 2U; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1] samples */ + x0 = read_q15x2 ((q15_t *) px); + /* read x[1], x[2] samples */ + x1 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read the first two inputB samples using SIMD: + * y[0] and y[1] */ + c0 = read_q15x2_ia ((q15_t **) &py); + + /* acc0 += x[0] * y[0] + x[1] * y[1] */ + acc0 = __SMLAD(x0, c0, acc0); + + /* acc1 += x[1] * y[0] + x[2] * y[1] */ + acc1 = __SMLAD(x1, c0, acc1); + + /* Read x[2], x[3] */ + x2 = read_q15x2 ((q15_t *) px); + + /* Read x[3], x[4] */ + x3 = read_q15x2 ((q15_t *) px + 1); + + /* acc2 += x[2] * y[0] + x[3] * y[1] */ + acc2 = __SMLAD(x2, c0, acc2); + + /* acc3 += x[3] * y[0] + x[4] * y[1] */ + acc3 = __SMLAD(x3, c0, acc3); + + /* Read y[2] and y[3] */ + c0 = read_q15x2_ia ((q15_t **) &py); + + /* acc0 += x[2] * y[2] + x[3] * y[3] */ + acc0 = __SMLAD(x2, c0, acc0); + + /* acc1 += x[3] * y[2] + x[4] * y[3] */ + acc1 = __SMLAD(x3, c0, acc1); + + /* Read x[4], x[5] */ + x0 = read_q15x2 ((q15_t *) px + 2); + + /* Read x[5], x[6] */ + x1 = read_q15x2 ((q15_t *) px + 3); + px += 4U; + + /* acc2 += x[4] * y[2] + x[5] * y[3] */ + acc2 = __SMLAD(x0, c0, acc2); + + /* acc3 += x[5] * y[2] + x[6] * y[3] */ + acc3 = __SMLAD(x1, c0, acc3); + + } while (--k); + + /* For the next MAC operations, SIMD is not used + * So, the 16 bit pointer if inputB, py is updated */ + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + if (k == 1U) + { + /* Read y[4] */ + c0 = *py; + +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[7] */ + x3 = read_q15x2 ((q15_t *) px); + px++; + + /* Perform the multiply-accumulates */ + acc0 = __SMLAD (x0, c0, acc0); + acc1 = __SMLAD (x1, c0, acc1); + acc2 = __SMLADX(x1, c0, acc2); + acc3 = __SMLADX(x3, c0, acc3); + } + + if (k == 2U) + { + /* Read y[4], y[5] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Perform the multiply-accumulates */ + acc0 = __SMLAD(x0, c0, acc0); + acc1 = __SMLAD(x1, c0, acc1); + acc2 = __SMLAD(x3, c0, acc2); + acc3 = __SMLAD(x2, c0, acc3); + } + + if (k == 3U) + { + /* Read y[4], y[5] */ + c0 = read_q15x2_ia ((q15_t **) &py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + + /* Perform the multiply-accumulates */ + acc0 = __SMLAD(x0, c0, acc0); + acc1 = __SMLAD(x1, c0, acc1); + acc2 = __SMLAD(x3, c0, acc2); + acc3 = __SMLAD(x2, c0, acc3); + + c0 = (*py); + /* Read y[6] */ +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[10] */ + x3 = read_q15x2 ((q15_t *) px + 2); + px += 3U; + + /* Perform the multiply-accumulates */ + acc0 = __SMLADX(x1, c0, acc0); + acc1 = __SMLAD (x2, c0, acc1); + acc2 = __SMLADX(x2, c0, acc2); + acc3 = __SMLADX(x3, c0, acc3); + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (acc0 >> 15); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + *pOut = (q15_t) (acc1 >> 15); + pOut += inc; + + *pOut = (q15_t) (acc2 >> 15); + pOut += inc; + + *pOut = (q15_t) (acc3 >> 15); + pOut += inc; + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize2 % 0x4U; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += ((q31_t) *px++ * *py++); + sum += ((q31_t) *px++ * *py++); + sum += ((q31_t) *px++ * *py++); + sum += ((q31_t) *px++ * *py++); + + /* Decrement loop counter */ + k--; + } + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += ((q31_t) * px++ * *py++); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (sum >> 15); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q31_t) *px++ * *py++); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (sum >> 15); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + } + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * .... + * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] + * sum += x[srcALen-1] * y[0] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + /* sum += x[srcALen - srcBLen + 4] * y[3] , sum += x[srcALen - srcBLen + 3] * y[2] */ + sum = __SMLAD(read_q15x2_ia ((q15_t **) &px), read_q15x2_ia ((q15_t **) &py), sum); + /* sum += x[srcALen - srcBLen + 2] * y[1] , sum += x[srcALen - srcBLen + 1] * y[0] */ + sum = __SMLAD(read_q15x2_ia ((q15_t **) &px), read_q15x2_ia ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = __SMLAD(*px++, *py++, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (sum >> 15); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement the MAC count */ + count--; + + /* Decrement the loop counter */ + blockSize3--; + } + +} + +/** + @} end of Corr group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q31.c new file mode 100644 index 0000000..a5840b7 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_fast_q31.c @@ -0,0 +1,601 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_correlate_fast_q31.c + * Description: Fast Q31 Correlation + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Corr + @{ + */ + +/** + @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 location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. + @return none + + @par Scaling and Overflow Behavior + This function is optimized for speed at the expense of fixed-point precision and overflow protection. + The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. + These intermediate results are accumulated in a 32-bit register in 2.30 format. + Finally, the accumulator is saturated and converted to a 1.31 result. + @par + The fast version has the same overflow behavior as the standard version but provides less precision since it discards the low 32 bits of each multiplication result. + In order to avoid overflows completely the input signals must be scaled down. + The input signals should be scaled down to avoid intermediate overflows. + Scale down one of the inputs by 1/min(srcALen, srcBLen)to avoid overflows since a + maximum of min(srcALen, srcBLen) number of additions is carried internally. + + @remark + Refer to \ref arm_correlate_q31() for a slower implementation of this function which uses 64-bit accumulation to provide higher precision. + */ + +void arm_correlate_fast_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst) +{ + const q31_t *pIn1; /* InputA pointer */ + const q31_t *pIn2; /* InputB pointer */ + q31_t *pOut = pDst; /* Output pointer */ + const q31_t *px; /* Intermediate inputA pointer */ + const q31_t *py; /* Intermediate inputB pointer */ + const q31_t *pSrc1; /* Intermediate pointers */ + q31_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ + q31_t x0, x1, x2, x3, c0; /* Temporary variables for holding input and coefficient values */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + uint32_t outBlockSize; + int32_t inc = 1; /* Destination address modifier */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + + /* Number of output samples is calculated */ + outBlockSize = (2U * srcALen) - 1U; + + /* When srcALen > srcBLen, zero padding is done to srcB + * to make their lengths equal. + * Instead, (outBlockSize - (srcALen + srcBLen - 1)) + * number of output samples are made zero */ + j = outBlockSize - (srcALen + (srcBLen - 1U)); + + /* Updating the pointer position to non zero value */ + pOut += j; + + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + + /* CORR(x, y) = Reverse order(CORR(y, x)) */ + /* Hence set the destination pointer to point to the last output sample */ + pOut = pDst + ((srcALen + srcBLen) - 2U); + + /* Destination address modifier is set to -1 */ + inc = -1; + + } + + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[srcBlen - 1] + * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] + * .... + * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc1 = pIn2 + (srcBLen - 1U); + py = pSrc1; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* x[0] * y[srcBLen - 4] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* x[1] * y[srcBLen - 3] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* x[2] * y[srcBLen - 2] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* x[3] * y[srcBLen - 1] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[0] * y[srcBLen - 1] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = sum << 1; + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pSrc1 - count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] + * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] + * .... + * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { + /* Loop unroll over blockSize2, by 4 */ + blkCnt = blockSize2 >> 2U; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read y[0] sample */ + c0 = *py++; + /* Read x[3] sample */ + x3 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[0] * y[0] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc1 += x[1] * y[0] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc2 += x[2] * y[0] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc3 += x[3] * y[0] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + + /* Read y[1] sample */ + c0 = *py++; + /* Read x[4] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + /* acc0 += x[1] * y[1] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc1 += x[2] * y[1] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc2 += x[3] * y[1] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x3 * c0)) >> 32); + /* acc3 += x[4] * y[1] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x0 * c0)) >> 32); + + + /* Read y[2] sample */ + c0 = *py++; + /* Read x[5] sample */ + x1 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[2] * y[2] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc1 += x[3] * y[2] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x3 * c0)) >> 32); + /* acc2 += x[4] * y[2] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc3 += x[5] * y[2] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x1 * c0)) >> 32); + + + /* Read y[3] sample */ + c0 = *py++; + /* Read x[6] sample */ + x2 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[3] * y[3] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x3 * c0)) >> 32); + /* acc1 += x[4] * y[3] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc2 += x[5] * y[3] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc3 += x[6] * y[3] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x2 * c0)) >> 32); + + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Read y[4] sample */ + c0 = *py++; + /* Read x[7] sample */ + x3 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[4] */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + /* acc1 += x[5] * y[4] */ + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + /* acc2 += x[6] * y[4] */ + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + /* acc3 += x[7] * y[4] */ + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q31_t) (acc0 << 1); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + *pOut = (q31_t) (acc1 << 1); + pOut += inc; + + *pOut = (q31_t) (acc2 << 1); + pOut += inc; + + *pOut = (q31_t) (acc3 << 1); + pOut += inc; + + /* Increment the pointer pIn1 index, count by 4 */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize2 % 0x4U; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = sum << 1; + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = sum << 1; + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * .... + * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] + * sum += x[srcALen-1] * y[0] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = ((pIn1 + srcALen) - srcBLen) + 1U; + px = pSrc1; + + /* Working pointer of inputB */ + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen - srcBLen + 4] * y[3] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* sum += x[srcALen - srcBLen + 3] * y[2] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* sum += x[srcALen - srcBLen + 2] * y[1] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* sum += x[srcALen - srcBLen + 1] * y[0] */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = (q31_t) ((((q63_t) sum << 32) + + ((q63_t) *px++ * (*py++))) >> 32); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = sum << 1; + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement MAC count */ + count--; + + /* Decrement loop counter */ + blockSize3--; + } + +} + +/** + @} end of Corr group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q15.c new file mode 100644 index 0000000..d46d9a0 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q15.c @@ -0,0 +1,341 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_correlate_opt_q15.c + * Description: Correlation of Q15 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Corr + @{ + */ + +/** + @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 location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. + @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both inputs are 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. + This approach provides 33 guard bits and there is no risk of overflow. + The 34.30 result is then truncated to 34.15 format by discarding the low 15 bits and then saturated to 1.15 format. + + @remark + Refer to \ref arm_correlate_fast_q15() for a faster but less precise version of this function. + */ + +void arm_correlate_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch) +{ + q63_t acc0; /* Accumulators */ + q15_t *pOut = pDst; /* Output pointer */ + q15_t *pScr1; /* Temporary pointer for scratch1 */ + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + const q15_t *py; /* Intermediate inputB pointer */ + uint32_t j, blkCnt, outBlockSize; /* Loop counter */ + int32_t inc = 1; /* Output pointer increment */ + uint32_t tapCnt; + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc1, acc2, acc3; /* Accumulators */ + q31_t x1, x2, x3; /* Temporary variables for holding input1 and input2 values */ + q31_t y1, y2; /* State variables */ +#endif + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and the destination pointer modifier, inc is set to -1 */ + /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ + /* But to improve the performance, + * we include zeroes in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, + * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ + /* If srcALen < srcBLen, + * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + + /* Number of output samples is calculated */ + outBlockSize = (srcALen * 2U) - 1U; + + /* When srcALen > srcBLen, zero padding is done to srcB + * to make their lengths equal. + * Instead, (outBlockSize - (srcALen + srcBLen - 1)) + * number of output samples are made zero */ + j = outBlockSize - (srcALen + (srcBLen - 1U)); + + /* Updating the pointer position to non zero value */ + pOut += j; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + + /* CORR(x, y) = Reverse order(CORR(y, x)) */ + /* Hence set the destination pointer to point to the last output sample */ + pOut = pDst + ((srcALen + srcBLen) - 2U); + + /* Destination address modifier is set to -1 */ + inc = -1; + } + + pScr1 = pScratch; + + /* Fill (srcBLen - 1U) zeros in scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update temporary scratch pointer */ + pScr1 += (srcBLen - 1U); + + /* Copy (srcALen) samples in scratch buffer */ + arm_copy_q15(pIn1, pScr1, srcALen); + + /* Update pointers */ + pScr1 += srcALen; + + + /* Fill (srcBLen - 1U) zeros at end of scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update pointer */ + pScr1 += (srcBLen - 1U); + + /* Temporary pointer for scratch2 */ + py = pIn2; + + + /* Actual correlation process starts here */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (srcALen + srcBLen - 1U) >> 2; + + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch; + + /* Clear Accumlators */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Read two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read next two samples from scratch1 buffer */ + x2 = read_q15x2_ia (&pScr1); + + tapCnt = (srcBLen) >> 2U; + + while (tapCnt > 0U) + { + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia ((q15_t **) &pIn2); + y2 = read_q15x2_ia ((q15_t **) &pIn2); + + /* multiply and accumlate */ + acc0 = __SMLALD(x1, y1, acc0); + acc2 = __SMLALD(x2, y1, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc1 = __SMLALDX(x3, y1, acc1); + + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* multiply and accumlate */ + acc0 = __SMLALD(x2, y2, acc0); + acc2 = __SMLALD(x1, y2, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x1, x2, 0); +#else + x3 = __PKHBT(x2, x1, 0); +#endif + + acc3 = __SMLALDX(x3, y1, acc3); + acc1 = __SMLALDX(x3, y2, acc1); + + x2 = read_q15x2_ia (&pScr1); + +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + acc3 = __SMLALDX(x3, y2, acc3); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Update scratch pointer for remaining samples of smaller length sequence */ + pScr1 -= 4U; + + /* apply same above for remaining samples of smaller length sequence */ + tapCnt = (srcBLen) & 3U; + + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2); + acc1 += (*pScr1++ * *pIn2); + acc2 += (*pScr1++ * *pIn2); + acc3 += (*pScr1++ * *pIn2++); + + pScr1 -= 3U; + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + + /* Store the results in the accumulators in the destination buffer. */ + *pOut = (__SSAT(acc0 >> 15U, 16)); + pOut += inc; + *pOut = (__SSAT(acc1 >> 15U, 16)); + pOut += inc; + *pOut = (__SSAT(acc2 >> 15U, 16)); + pOut += inc; + *pOut = (__SSAT(acc3 >> 15U, 16)); + pOut += inc; + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch += 4U; + } + + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (srcALen + srcBLen - 1U) & 0x3; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (srcALen + srcBLen - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Calculate correlation for remaining samples of Bigger length sequence */ + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch; + + /* Clear Accumlators */ + acc0 = 0; + + tapCnt = (srcBLen) >> 1U; + + while (tapCnt > 0U) + { + + /* Read next two samples from scratch1 buffer */ + acc0 += (*pScr1++ * *pIn2++); + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + tapCnt = (srcBLen) & 1U; + + /* apply same above for remaining samples of smaller length sequence */ + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pIn2++); + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* The result is in 2.30 format. Convert to 1.15 with saturation. + Then store the output in the destination buffer. */ + *pOut = (q15_t) (__SSAT((acc0 >> 15), 16)); + pOut += inc; + + /* Initialization of inputB pointer */ + pIn2 = py; + + pScratch += 1U; + } + +} + +/** + @} end of Corr group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q7.c new file mode 100644 index 0000000..035bfba --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_opt_q7.c @@ -0,0 +1,388 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_correlate_opt_q7.c + * Description: Correlation of Q7 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Corr + @{ + */ + +/** + @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 location where the output result is written. 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). + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 32-bit internal accumulator. + Both the inputs are represented in 1.7 format and multiplications yield a 2.14 result. + The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. + This approach provides 17 guard bits and there is no risk of overflow as long as max(srcALen, srcBLen)<131072. + The 18.14 result is then truncated to 18.7 format by discarding the low 7 bits and then saturated to 1.7 format. + */ + +void arm_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) +{ + q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch */ + q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch */ + q15_t x4; /* Temporary input variable */ + q15_t *py; /* Temporary input2 pointer */ + q31_t acc0, acc1, acc2, acc3; /* Accumulators */ + const q7_t *pIn1, *pIn2; /* InputA and inputB pointer */ + uint32_t j, k, blkCnt, tapCnt; /* Loop counter */ + int32_t inc = 1; /* Output pointer increment */ + uint32_t outBlockSize; /* Loop counter */ + q31_t x1, x2, x3, y1; /* Temporary input variables */ + q7_t *pOut = pDst; /* Output pointer */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and the destination pointer modifier, inc is set to -1 */ + /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ + /* But to improve the performance, + * we include zeroes in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, + * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ + /* If srcALen < srcBLen, + * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + + /* Number of output samples is calculated */ + outBlockSize = (srcALen * 2U) - 1U; + + /* When srcALen > srcBLen, zero padding is done to srcB + * to make their lengths equal. + * Instead, (outBlockSize - (srcALen + srcBLen - 1)) + * number of output samples are made zero */ + j = outBlockSize - (srcALen + (srcBLen - 1U)); + + /* Updating the pointer position to non zero value */ + pOut += j; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + + /* CORR(x, y) = Reverse order(CORR(y, x)) */ + /* Hence set the destination pointer to point to the last output sample */ + pOut = pDst + ((srcALen + srcBLen) - 2U); + + /* Destination address modifier is set to -1 */ + inc = -1; + } + + + /* Copy (srcBLen) samples in scratch buffer */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling copies 4 data points at a time. + a second loop below copies for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + x4 = (q15_t) *pIn2++; + *pScr2++ = x4; + x4 = (q15_t) *pIn2++; + *pScr2++ = x4; + x4 = (q15_t) *pIn2++; + *pScr2++ = x4; + x4 = (q15_t) *pIn2++; + *pScr2++ = x4; + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, copy remaining samples here. + No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + x4 = (q15_t) *pIn2++; + *pScr2++ = x4; + + /* Decrement loop counter */ + k--; + } + + /* Fill (srcBLen - 1U) zeros in scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update temporary scratch pointer */ + pScr1 += (srcBLen - 1U); + + /* Copy (srcALen) samples in scratch buffer */ + /* Apply loop unrolling and do 4 Copies simultaneously. */ + k = srcALen >> 2U; + + /* First part of the processing with loop unrolling copies 4 data points at a time. + a second loop below copies for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* copy second buffer in reversal manner */ + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + x4 = (q15_t) *pIn1++; + *pScr1++ = x4; + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, copy remaining samples here. + No loop unrolling is used. */ + k = srcALen % 0x4U; + + while (k > 0U) + { + /* copy second buffer in reversal manner for remaining samples */ + x4 = (q15_t) * pIn1++; + *pScr1++ = x4; + + /* Decrement the loop counter */ + k--; + } + + /* Fill (srcBLen - 1U) zeros at end of scratch buffer */ + arm_fill_q15(0, pScr1, (srcBLen - 1U)); + + /* Update pointer */ + pScr1 += (srcBLen - 1U); + + /* Temporary pointer for scratch2 */ + py = pScratch2; + + /* Initialization of pScr2 pointer */ + pScr2 = pScratch2; + + /* Actual correlation process starts here */ + blkCnt = (srcALen + srcBLen - 1U) >> 2; + + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Read two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* Read next two samples from scratch1 buffer */ + x2 = read_q15x2_ia (&pScr1); + + tapCnt = (srcBLen) >> 2U; + + while (tapCnt > 0U) + { + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia (&pScr2); + + /* multiply and accumlate */ + acc0 = __SMLAD(x1, y1, acc0); + acc2 = __SMLAD(x2, y1, acc2); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + /* multiply and accumlate */ + acc1 = __SMLADX(x3, y1, acc1); + + /* Read next two samples from scratch1 buffer */ + x1 = read_q15x2_ia (&pScr1); + + /* pack input data */ +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x1, x2, 0); +#else + x3 = __PKHBT(x2, x1, 0); +#endif + + acc3 = __SMLADX(x3, y1, acc3); + + /* Read four samples from smaller buffer */ + y1 = read_q15x2_ia (&pScr2); + + acc0 = __SMLAD(x2, y1, acc0); + + acc2 = __SMLAD(x1, y1, acc2); + + acc1 = __SMLADX(x3, y1, acc1); + + x2 = read_q15x2_ia (&pScr1); + +#ifndef ARM_MATH_BIG_ENDIAN + x3 = __PKHBT(x2, x1, 0); +#else + x3 = __PKHBT(x1, x2, 0); +#endif + + acc3 = __SMLADX(x3, y1, acc3); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Update scratch pointer for remaining samples of smaller length sequence */ + pScr1 -= 4U; + + /* apply same above for remaining samples of smaller length sequence */ + tapCnt = (srcBLen) & 3U; + + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pScr2); + acc1 += (*pScr1++ * *pScr2); + acc2 += (*pScr1++ * *pScr2); + acc3 += (*pScr1++ * *pScr2++); + + pScr1 -= 3U; + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q7_t) (__SSAT(acc0 >> 7U, 8)); + pOut += inc; + *pOut = (q7_t) (__SSAT(acc1 >> 7U, 8)); + pOut += inc; + *pOut = (q7_t) (__SSAT(acc2 >> 7U, 8)); + pOut += inc; + *pOut = (q7_t) (__SSAT(acc3 >> 7U, 8)); + pOut += inc; + + /* Initialization of inputB pointer */ + pScr2 = py; + + pScratch1 += 4U; + } + + blkCnt = (srcALen + srcBLen - 1U) & 0x3; + + /* Calculate correlation for remaining samples of Bigger length sequence */ + while (blkCnt > 0) + { + /* Initialze temporary scratch pointer as scratch1 */ + pScr1 = pScratch1; + + /* Clear Accumlators */ + acc0 = 0; + + tapCnt = (srcBLen) >> 1U; + + while (tapCnt > 0U) + { + acc0 += (*pScr1++ * *pScr2++); + acc0 += (*pScr1++ * *pScr2++); + + /* Decrement loop counter */ + tapCnt--; + } + + tapCnt = (srcBLen) & 1U; + + /* apply same above for remaining samples of smaller length sequence */ + while (tapCnt > 0U) + { + /* accumlate the results */ + acc0 += (*pScr1++ * *pScr2++); + + /* Decrement loop counter */ + tapCnt--; + } + + blkCnt--; + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q7_t) (__SSAT(acc0 >> 7U, 8)); + pOut += inc; + + /* Initialization of inputB pointer */ + pScr2 = py; + + pScratch1 += 1U; + } + +} + +/** + @} end of Corr group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q15.c new file mode 100644 index 0000000..9837875 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q15.c @@ -0,0 +1,696 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_correlate_q15.c + * Description: Correlation of Q15 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Corr + @{ + */ + +/** + @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 location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both inputs are 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. + This approach provides 33 guard bits and there is no risk of overflow. + The 34.30 result is then truncated to 34.15 format by discarding the low 15 bits and then saturated to 1.15 format. + + @remark + Refer to \ref arm_correlate_fast_q15() for a faster but less precise version of this function. + @remark + Refer to \ref arm_correlate_opt_q15() for a faster implementation of this function using scratch buffers. + */ + +void arm_correlate_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst) +{ + +#if defined (ARM_MATH_DSP) + + const q15_t *pIn1; /* InputA pointer */ + const q15_t *pIn2; /* InputB pointer */ + q15_t *pOut = pDst; /* Output pointer */ + q63_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ + const q15_t *px; /* Intermediate inputA pointer */ + const q15_t *py; /* Intermediate inputB pointer */ + const q15_t *pSrc1; /* Intermediate pointers */ + q31_t x0, x1, x2, x3, c0; /* Temporary input variables for holding input and coefficient values */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + uint32_t outBlockSize; + int32_t inc = 1; /* Destination address modifier */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and the destination pointer modifier, inc is set to -1 */ + /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ + /* But to improve the performance, + * we include zeroes in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, + * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ + /* If srcALen < srcBLen, + * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + + /* Number of output samples is calculated */ + outBlockSize = (srcALen * 2U) - 1U; + + /* When srcALen > srcBLen, zero padding is done to srcB + * to make their lengths equal. + * Instead, (outBlockSize - (srcALen + srcBLen - 1)) + * number of output samples are made zero */ + j = outBlockSize - (srcALen + (srcBLen - 1U)); + + /* Updating the pointer position to non zero value */ + pOut += j; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + + /* CORR(x, y) = Reverse order(CORR(y, x)) */ + /* Hence set the destination pointer to point to the last output sample */ + pOut = pDst + ((srcALen + srcBLen) - 2U); + + /* Destination address modifier is set to -1 */ + inc = -1; + } + + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[srcBlen - 1] + * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] + * .... + * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc1 = pIn2 + (srcBLen - 1U); + py = pSrc1; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first loop starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[0] * y[srcBLen - 4] , x[1] * y[srcBLen - 3] */ + sum = __SMLALD(read_q15x2_ia ((q15_t **) &px), read_q15x2_ia ((q15_t **) &py), sum); + /* x[3] * y[srcBLen - 1] , x[2] * y[srcBLen - 2] */ + sum = __SMLALD(read_q15x2_ia ((q15_t **) &px), read_q15x2_ia ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[0] * y[srcBLen - 1] */ + sum = __SMLALD(*px++, *py++, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (__SSAT((sum >> 15), 16)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pSrc1 - count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] + * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] + * .... + * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + /* count is the index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize2 >> 2U; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1] samples */ + x0 = read_q15x2 ((q15_t *) px); + + /* read x[1], x[2] samples */ + x1 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read the first two inputB samples using SIMD: + * y[0] and y[1] */ + c0 = read_q15x2_ia ((q15_t **) &py); + + /* acc0 += x[0] * y[0] + x[1] * y[1] */ + acc0 = __SMLALD(x0, c0, acc0); + + /* acc1 += x[1] * y[0] + x[2] * y[1] */ + acc1 = __SMLALD(x1, c0, acc1); + + /* Read x[2], x[3] */ + x2 = read_q15x2 ((q15_t *) px); + + /* Read x[3], x[4] */ + x3 = read_q15x2 ((q15_t *) px + 1); + + /* acc2 += x[2] * y[0] + x[3] * y[1] */ + acc2 = __SMLALD(x2, c0, acc2); + + /* acc3 += x[3] * y[0] + x[4] * y[1] */ + acc3 = __SMLALD(x3, c0, acc3); + + /* Read y[2] and y[3] */ + c0 = read_q15x2_ia ((q15_t **) &py); + + /* acc0 += x[2] * y[2] + x[3] * y[3] */ + acc0 = __SMLALD(x2, c0, acc0); + + /* acc1 += x[3] * y[2] + x[4] * y[3] */ + acc1 = __SMLALD(x3, c0, acc1); + + /* Read x[4], x[5] */ + x0 = read_q15x2 ((q15_t *) px + 2); + + /* Read x[5], x[6] */ + x1 = read_q15x2 ((q15_t *) px + 3); + px += 4U; + + /* acc2 += x[4] * y[2] + x[5] * y[3] */ + acc2 = __SMLALD(x0, c0, acc2); + + /* acc3 += x[5] * y[2] + x[6] * y[3] */ + acc3 = __SMLALD(x1, c0, acc3); + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + if (k == 1U) + { + /* Read y[4] */ + c0 = *py; +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[7] */ + x3 = read_q15x2 ((q15_t *) px); + px++; + + /* Perform the multiply-accumulate */ + acc0 = __SMLALD (x0, c0, acc0); + acc1 = __SMLALD (x1, c0, acc1); + acc2 = __SMLALDX(x1, c0, acc2); + acc3 = __SMLALDX(x3, c0, acc3); + } + + if (k == 2U) + { + /* Read y[4], y[5] */ + c0 = read_q15x2 ((q15_t *) py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + px += 2U; + + /* Perform the multiply-accumulate */ + acc0 = __SMLALD(x0, c0, acc0); + acc1 = __SMLALD(x1, c0, acc1); + acc2 = __SMLALD(x3, c0, acc2); + acc3 = __SMLALD(x2, c0, acc3); + } + + if (k == 3U) + { + /* Read y[4], y[5] */ + c0 = read_q15x2_ia ((q15_t **) &py); + + /* Read x[7], x[8] */ + x3 = read_q15x2 ((q15_t *) px); + + /* Read x[9] */ + x2 = read_q15x2 ((q15_t *) px + 1); + + /* Perform the multiply-accumulate */ + acc0 = __SMLALD(x0, c0, acc0); + acc1 = __SMLALD(x1, c0, acc1); + acc2 = __SMLALD(x3, c0, acc2); + acc3 = __SMLALD(x2, c0, acc3); + + c0 = (*py); + + /* Read y[6] */ +#ifdef ARM_MATH_BIG_ENDIAN + c0 = c0 << 16U; +#else + c0 = c0 & 0x0000FFFF; +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + /* Read x[10] */ + x3 = read_q15x2 ((q15_t *) px + 2); + px += 3U; + + /* Perform the multiply-accumulates */ + acc0 = __SMLALDX(x1, c0, acc0); + acc1 = __SMLALD (x2, c0, acc1); + acc2 = __SMLALDX(x2, c0, acc2); + acc3 = __SMLALDX(x3, c0, acc3); + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (__SSAT(acc0 >> 15, 16)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + *pOut = (q15_t) (__SSAT(acc1 >> 15, 16)); + pOut += inc; + + *pOut = (q15_t) (__SSAT(acc2 >> 15, 16)); + pOut += inc; + + *pOut = (q15_t) (__SSAT(acc3 >> 15, 16)); + pOut += inc; + + /* Increment the count by 4 as 4 output values are computed */ + count += 4U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize2 % 0x4U; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += ((q63_t) *px++ * *py++); + sum += ((q63_t) *px++ * *py++); + sum += ((q63_t) *px++ * *py++); + sum += ((q63_t) *px++ * *py++); + + /* Decrement loop counter */ + k--; + } + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += ((q63_t) *px++ * *py++); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (__SSAT(sum >> 15, 16)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment count by 1, as one output value is computed */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q63_t) *px++ * *py++); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (__SSAT(sum >> 15, 16)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * .... + * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] + * sum += x[srcALen-1] * y[0] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = (pIn1 + srcALen) - (srcBLen - 1U); + px = pSrc1; + + /* Working pointer of inputB */ + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = count >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen - srcBLen + 4] * y[3] , sum += x[srcALen - srcBLen + 3] * y[2] */ + sum = __SMLALD(read_q15x2_ia ((q15_t **) &px), read_q15x2_ia ((q15_t **) &py), sum); + /* sum += x[srcALen - srcBLen + 2] * y[1] , sum += x[srcALen - srcBLen + 1] * y[0] */ + sum = __SMLALD(read_q15x2_ia ((q15_t **) &px), read_q15x2_ia ((q15_t **) &py), sum); + + /* Decrement loop counter */ + k--; + } + + /* If the count is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = count % 0x4U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum = __SMLALD(*px++, *py++, sum); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q15_t) (__SSAT((sum >> 15), 16)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement MAC count */ + count--; + + /* Decrement loop counter */ + blockSize3--; + } + +#else /* #if defined (ARM_MATH_DSP) */ + + const q15_t *pIn1 = pSrcA; /* InputA pointer */ + const q15_t *pIn2 = pSrcB + (srcBLen - 1U); /* InputB pointer */ + q63_t sum; /* Accumulators */ + uint32_t i = 0U, j; /* Loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and a varaible, inv is set to 1 */ + /* If lengths are not equal then zero pad has to be done to make the two + * inputs of same length. But to improve the performance, we include zeroes + * in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the + * starting of the output buffer */ + /* If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the + * ending of the output buffer */ + /* Once the zero padding is done the remaining of the output is calcualted + * using convolution but with the shorter signal time shifted. */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + } + + /* Loop to calculate convolution for output length number of values */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry on MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q31_t) pIn1[j] * pIn2[-((int32_t) i - j)]); + } + } + + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = (q15_t) __SSAT((sum >> 15U), 16U); + else + *pDst++ = (q15_t) __SSAT((sum >> 15U), 16U); + } + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + +/** + @} end of Corr group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q31.c new file mode 100644 index 0000000..caa2f51 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q31.c @@ -0,0 +1,682 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_correlate_q31.c + * Description: Correlation of Q31 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Corr + @{ + */ + +/** + @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 location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. + @return none + + @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. + There is no saturation on intermediate additions. + Thus, if the accumulator overflows it wraps around and distorts the result. + The input signals should be scaled down to avoid intermediate overflows. + Scale down one of the inputs by 1/min(srcALen, srcBLen)to avoid overflows since a + maximum of min(srcALen, srcBLen) number of additions is carried internally. + The 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. + + @remark + Refer to \ref arm_correlate_fast_q31() for a faster but less precise implementation of this function. + */ + +void arm_correlate_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst) +{ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + const q31_t *pIn1; /* InputA pointer */ + const q31_t *pIn2; /* InputB pointer */ + q31_t *pOut = pDst; /* Output pointer */ + const q31_t *px; /* Intermediate inputA pointer */ + const q31_t *py; /* Intermediate inputB pointer */ + const q31_t *pSrc1; /* Intermediate pointers */ + q63_t sum; /* Accumulators */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + uint32_t outBlockSize; + int32_t inc = 1; /* Destination address modifier */ + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc0, acc1, acc2; /* Accumulators */ + q31_t x0, x1, x2, c0; /* Temporary variables for holding input and coefficient values */ +#endif + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and the destination pointer modifier, inc is set to -1 */ + /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ + /* But to improve the performance, + * we include zeroes in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, + * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ + /* If srcALen < srcBLen, + * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + + /* Number of output samples is calculated */ + outBlockSize = (2U * srcALen) - 1U; + + /* When srcALen > srcBLen, zero padding is done to srcB + * to make their lengths equal. + * Instead, (outBlockSize - (srcALen + srcBLen - 1)) + * number of output samples are made zero */ + j = outBlockSize - (srcALen + (srcBLen - 1U)); + + /* Updating the pointer position to non zero value */ + pOut += j; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + + /* CORR(x, y) = Reverse order(CORR(y, x)) */ + /* Hence set the destination pointer to point to the last output sample */ + pOut = pDst + ((srcALen + srcBLen) - 2U); + + /* Destination address modifier is set to -1 */ + inc = -1; + } + + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[srcBlen - 1] + * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] + * .... + * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc1 = pIn2 + (srcBLen - 1U); + py = pSrc1; + + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* x[0] * y[srcBLen - 4] */ + sum += (q63_t) *px++ * (*py++); + + /* x[1] * y[srcBLen - 3] */ + sum += (q63_t) *px++ * (*py++); + + /* x[2] * y[srcBLen - 2] */ + sum += (q63_t) *px++ * (*py++); + + /* x[3] * y[srcBLen - 1] */ + sum += (q63_t) *px++ * (*py++); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[0] * y[srcBLen - 1] */ + sum += (q63_t) *px++ * (*py++); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q31_t) (sum >> 31); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pSrc1 - count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] + * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] + * .... + * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unroll by 3 */ + blkCnt = blockSize2 / 3; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + + /* read x[0], x[1] samples */ + x0 = *px++; + x1 = *px++; + + /* Apply loop unrolling and compute 3 MACs simultaneously. */ + k = srcBLen / 3; + + /* First part of the processing with loop unrolling. Compute 3 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 2 samples. */ + do + { + /* Read y[0] sample */ + c0 = *(py); + /* Read x[2] sample */ + x2 = *(px); + + /* Perform the multiply-accumulate */ + /* acc0 += x[0] * y[0] */ + acc0 += ((q63_t) x0 * c0); + /* acc1 += x[1] * y[0] */ + acc1 += ((q63_t) x1 * c0); + /* acc2 += x[2] * y[0] */ + acc2 += ((q63_t) x2 * c0); + + /* Read y[1] sample */ + c0 = *(py + 1U); + /* Read x[3] sample */ + x0 = *(px + 1U); + + /* Perform the multiply-accumulate */ + /* acc0 += x[1] * y[1] */ + acc0 += ((q63_t) x1 * c0); + /* acc1 += x[2] * y[1] */ + acc1 += ((q63_t) x2 * c0); + /* acc2 += x[3] * y[1] */ + acc2 += ((q63_t) x0 * c0); + + /* Read y[2] sample */ + c0 = *(py + 2U); + /* Read x[4] sample */ + x1 = *(px + 2U); + + /* Perform the multiply-accumulate */ + /* acc0 += x[2] * y[2] */ + acc0 += ((q63_t) x2 * c0); + /* acc1 += x[3] * y[2] */ + acc1 += ((q63_t) x0 * c0); + /* acc2 += x[4] * y[2] */ + acc2 += ((q63_t) x1 * c0); + + /* update scratch pointers */ + px += 3U; + py += 3U; + + } while (--k); + + /* If the srcBLen is not a multiple of 3, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen - (3 * (srcBLen / 3)); + + while (k > 0U) + { + /* Read y[4] sample */ + c0 = *(py++); + + /* Read x[7] sample */ + x2 = *(px++); + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[4] */ + acc0 += ((q63_t) x0 * c0); + /* acc1 += x[5] * y[4] */ + acc1 += ((q63_t) x1 * c0); + /* acc2 += x[6] * y[4] */ + acc2 += ((q63_t) x2 * c0); + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q31_t) (acc0 >> 31); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + *pOut = (q31_t) (acc1 >> 31); + pOut += inc; + + *pOut = (q31_t) (acc2 >> 31); + pOut += inc; + + /* Increment the pointer pIn1 index, count by 3 */ + count += 3U; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize2 - 3 * (blockSize2 / 3); + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + while (k > 0U) + { + /* Perform the multiply-accumulates */ + sum += (q63_t) *px++ * *py++; + sum += (q63_t) *px++ * *py++; + sum += (q63_t) *px++ * *py++; + sum += (q63_t) *px++ * *py++; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) *px++ * *py++; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q31_t) (sum >> 31); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) *px++ * *py++; + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q31_t) (sum >> 31); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * .... + * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] + * sum += x[srcALen-1] * y[0] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = pIn1 + (srcALen - (srcBLen - 1U)); + px = pSrc1; + + /* Working pointer of inputB */ + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* sum += x[srcALen - srcBLen + 4] * y[3] */ + sum += (q63_t) *px++ * *py++; + + /* sum += x[srcALen - srcBLen + 3] * y[2] */ + sum += (q63_t) *px++ * *py++; + + /* sum += x[srcALen - srcBLen + 2] * y[1] */ + sum += (q63_t) *px++ * *py++; + + /* sum += x[srcALen - srcBLen + 1] * y[0] */ + sum += (q63_t) *px++ * *py++; + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += (q63_t) *px++ * *py++; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q31_t) (sum >> 31); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement MAC count */ + count--; + + /* Decrement loop counter */ + blockSize3--; + } + +#else +/* alternate version for CM0_FAMILY */ + + const q31_t *pIn1 = pSrcA; /* InputA pointer */ + const q31_t *pIn2 = pSrcB + (srcBLen - 1U); /* InputB pointer */ + q63_t sum; /* Accumulators */ + uint32_t i = 0U, j; /* Loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and a varaible, inv is set to 1 */ + /* If lengths are not equal then zero pad has to be done to make the two + * inputs of same length. But to improve the performance, we include zeroes + * in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the + * starting of the output buffer */ + /* If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the + * ending of the output buffer */ + /* Once the zero padding is done the remaining of the output is calcualted + * using correlation but with the shorter signal time shifted. */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + } + + /* Loop to calculate correlation for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry out MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to correlation equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q63_t) pIn1[j] * pIn2[-((int32_t) i - j)]); + } + } + + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = (q31_t) (sum >> 31U); + else + *pDst++ = (q31_t) (sum >> 31U); + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of Corr group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q7.c new file mode 100644 index 0000000..e5881ac --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_correlate_q7.c @@ -0,0 +1,800 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_correlate_q7.c + * Description: Correlation of Q7 sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup Corr + @{ + */ + +/** + @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 location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 32-bit internal accumulator. + Both the inputs are represented in 1.7 format and multiplications yield a 2.14 result. + The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. + This approach provides 17 guard bits and there is no risk of overflow as long as max(srcALen, srcBLen)<131072. + The 18.14 result is then truncated to 18.7 format by discarding the low 7 bits and saturated to 1.7 format. + + @remark + Refer to \ref arm_correlate_opt_q7() for a faster implementation of this function. + */ + +void arm_correlate_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst) +{ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + const q7_t *pIn1; /* InputA pointer */ + const q7_t *pIn2; /* InputB pointer */ + q7_t *pOut = pDst; /* Output pointer */ + const q7_t *px; /* Intermediate inputA pointer */ + const q7_t *py; /* Intermediate inputB pointer */ + const q7_t *pSrc1; /* Intermediate pointers */ + q31_t sum; /* Accumulators */ + uint32_t blockSize1, blockSize2, blockSize3; /* Loop counters */ + uint32_t j, k, count, blkCnt; /* Loop counters */ + uint32_t outBlockSize; + int32_t inc = 1; + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc0, acc1, acc2, acc3; /* Accumulators */ + q31_t input1, input2; /* Temporary input variables */ + q15_t in1, in2; /* Temporary input variables */ + q7_t x0, x1, x2, x3, c0, c1; /* Temporary variables for holding input and coefficient values */ +#endif + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and the destination pointer modifier, inc is set to -1 */ + /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ + /* But to improve the performance, + * we include zeroes in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, + * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ + /* If srcALen < srcBLen, + * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ + if (srcALen >= srcBLen) + { + /* Initialization of inputA pointer */ + pIn1 = pSrcA; + + /* Initialization of inputB pointer */ + pIn2 = pSrcB; + + /* Number of output samples is calculated */ + outBlockSize = (2U * srcALen) - 1U; + + /* When srcALen > srcBLen, zero padding is done to srcB + * to make their lengths equal. + * Instead, (outBlockSize - (srcALen + srcBLen - 1)) + * number of output samples are made zero */ + j = outBlockSize - (srcALen + (srcBLen - 1U)); + + /* Updating the pointer position to non zero value */ + pOut += j; + } + else + { + /* Initialization of inputA pointer */ + pIn1 = pSrcB; + + /* Initialization of inputB pointer */ + pIn2 = pSrcA; + + /* srcBLen is always considered as shorter or equal to srcALen */ + j = srcBLen; + srcBLen = srcALen; + srcALen = j; + + /* CORR(x, y) = Reverse order(CORR(y, x)) */ + /* Hence set the destination pointer to point to the last output sample */ + pOut = pDst + ((srcALen + srcBLen) - 2U); + + /* Destination address modifier is set to -1 */ + inc = -1; + } + + /* The function is internally + * divided into three stages according to the number of multiplications that has to be + * taken place between inputA samples and inputB samples. In the first stage of the + * algorithm, the multiplications increase by one for every iteration. + * In the second stage of the algorithm, srcBLen number of multiplications are done. + * In the third stage of the algorithm, the multiplications decrease by one + * for every iteration. */ + + /* The algorithm is implemented in three stages. + The loop counters of each stage is initiated here. */ + blockSize1 = srcBLen - 1U; + blockSize2 = srcALen - (srcBLen - 1U); + blockSize3 = blockSize1; + + /* -------------------------- + * Initializations of stage1 + * -------------------------*/ + + /* sum = x[0] * y[srcBlen - 1] + * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] + * .... + * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] + */ + + /* In this stage the MAC operations are increased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = 1U; + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + pSrc1 = pIn2 + (srcBLen - 1U); + py = pSrc1; + + /* ------------------------ + * Stage1 process + * ----------------------*/ + + /* The first stage starts here */ + while (blockSize1 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* x[0] , x[1] */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* y[srcBLen - 4] , y[srcBLen - 3] */ + in1 = (q15_t) *py++; + in2 = (q15_t) *py++; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* x[0] * y[srcBLen - 4] */ + /* x[1] * y[srcBLen - 3] */ + sum = __SMLAD(input1, input2, sum); + + /* x[2] , x[3] */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* y[srcBLen - 2] , y[srcBLen - 1] */ + in1 = (q15_t) *py++; + in2 = (q15_t) *py++; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); + + /* x[2] * y[srcBLen - 2] */ + /* x[3] * y[srcBLen - 1] */ + sum = __SMLAD(input1, input2, sum); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize k with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + /* x[0] * y[srcBLen - 1] */ + sum += (q31_t) ((q15_t) *px++ * *py++); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q7_t) (__SSAT(sum >> 7U, 8)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + py = pSrc1 - count; + px = pIn1; + + /* Increment MAC count */ + count++; + + /* Decrement loop counter */ + blockSize1--; + } + + /* -------------------------- + * Initializations of stage2 + * ------------------------*/ + + /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] + * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] + * .... + * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + */ + + /* Working pointer of inputA */ + px = pIn1; + + /* Working pointer of inputB */ + py = pIn2; + + /* count is index by which the pointer pIn1 to be incremented */ + count = 0U; + + /* ------------------- + * Stage2 process + * ------------------*/ + + /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. + * So, to loop unroll over blockSize2, + * srcBLen should be greater than or equal to 4 */ + if (srcBLen >= 4U) + { +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize2 >> 2U; + + while (blkCnt > 0U) + { + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* read x[0], x[1], x[2] samples */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + k = srcBLen >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 MACs at a time. + ** a second loop below computes MACs for the remaining 1 to 3 samples. */ + do + { + /* Read y[0] sample */ + c0 = *py++; + /* Read y[1] sample */ + c1 = *py++; + + /* Read x[3] sample */ + x3 = *px++; + + /* x[0] and x[1] are packed */ + in1 = (q15_t) x0; + in2 = (q15_t) x1; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* y[0] and y[1] are packed */ + in1 = (q15_t) c0; + in2 = (q15_t) c1; + + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc0 += x[0] * y[0] + x[1] * y[1] */ + acc0 = __SMLAD(input1, input2, acc0); + + /* x[1] and x[2] are packed */ + in1 = (q15_t) x1; + in2 = (q15_t) x2; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc1 += x[1] * y[0] + x[2] * y[1] */ + acc1 = __SMLAD(input1, input2, acc1); + + /* x[2] and x[3] are packed */ + in1 = (q15_t) x2; + in2 = (q15_t) x3; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc2 += x[2] * y[0] + x[3] * y[1] */ + acc2 = __SMLAD(input1, input2, acc2); + + /* Read x[4] sample */ + x0 = *px++; + + /* x[3] and x[4] are packed */ + in1 = (q15_t) x3; + in2 = (q15_t) x0; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc3 += x[3] * y[0] + x[4] * y[1] */ + acc3 = __SMLAD(input1, input2, acc3); + + /* Read y[2] sample */ + c0 = *py++; + /* Read y[3] sample */ + c1 = *py++; + + /* Read x[5] sample */ + x1 = *px++; + + /* x[2] and x[3] are packed */ + in1 = (q15_t) x2; + in2 = (q15_t) x3; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* y[2] and y[3] are packed */ + in1 = (q15_t) c0; + in2 = (q15_t) c1; + + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc0 += x[2] * y[2] + x[3] * y[3] */ + acc0 = __SMLAD(input1, input2, acc0); + + /* x[3] and x[4] are packed */ + in1 = (q15_t) x3; + in2 = (q15_t) x0; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc1 += x[3] * y[2] + x[4] * y[3] */ + acc1 = __SMLAD(input1, input2, acc1); + + /* x[4] and x[5] are packed */ + in1 = (q15_t) x0; + in2 = (q15_t) x1; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc2 += x[4] * y[2] + x[5] * y[3] */ + acc2 = __SMLAD(input1, input2, acc2); + + /* Read x[6] sample */ + x2 = *px++; + + /* x[5] and x[6] are packed */ + in1 = (q15_t) x1; + in2 = (q15_t) x2; + + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* acc3 += x[5] * y[2] + x[6] * y[3] */ + acc3 = __SMLAD(input1, input2, acc3); + + } while (--k); + + /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + k = srcBLen % 0x4U; + + while (k > 0U) + { + /* Read y[4] sample */ + c0 = *py++; + /* Read x[7] sample */ + x3 = *px++; + + /* Perform the multiply-accumulates */ + /* acc0 += x[4] * y[4] */ + acc0 += ((q15_t) x0 * c0); + /* acc1 += x[5] * y[4] */ + acc1 += ((q15_t) x1 * c0); + /* acc2 += x[6] * y[4] */ + acc2 += ((q15_t) x2 * c0); + /* acc3 += x[7] * y[4] */ + acc3 += ((q15_t) x3 * c0); + + /* Reuse the present samples for the next MAC */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q7_t) (__SSAT(acc0 >> 7, 8)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + *pOut = (q7_t) (__SSAT(acc1 >> 7, 8)); + pOut += inc; + + *pOut = (q7_t) (__SSAT(acc2 >> 7, 8)); + pOut += inc; + + *pOut = (q7_t) (__SSAT(acc3 >> 7, 8)); + pOut += inc; + + count += 4U; + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize2 % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize2; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = srcBLen >> 2U; + + while (k > 0U) + { + + /* Reading two inputs of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Reading two inputs of SrcB buffer and packing */ + in1 = (q15_t) *py++; + in2 = (q15_t) *py++; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Perform the multiply-accumulate */ + sum = __SMLAD(input1, input2, sum); + + /* Reading two inputs of SrcA buffer and packing */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Reading two inputs of SrcB buffer and packing */ + in1 = (q15_t) *py++; + in2 = (q15_t) *py++; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* Perform the multiply-accumulate */ + sum = __SMLAD(input1, input2, sum); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = srcBLen % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = srcBLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q15_t) *px++ * *py++); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q7_t) (__SSAT(sum >> 7U, 8)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment the pointer pIn1 index, count by 1 */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement the loop counter */ + blkCnt--; + } + } + else + { + /* If the srcBLen is not a multiple of 4, + * the blockSize2 loop cannot be unrolled by 4 */ + blkCnt = blockSize2; + + while (blkCnt > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + + /* srcBLen number of MACS should be performed */ + k = srcBLen; + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q15_t) *px++ * *py++); + + /* Decrement the loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q7_t) (__SSAT(sum >> 7U, 8)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Increment the MAC count */ + count++; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = pIn1 + count; + py = pIn2; + + /* Decrement loop counter */ + blkCnt--; + } + } + + + /* -------------------------- + * Initializations of stage3 + * -------------------------*/ + + /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] + * .... + * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] + * sum += x[srcALen-1] * y[0] + */ + + /* In this stage the MAC operations are decreased by 1 for every iteration. + The count variable holds the number of MAC operations performed */ + count = srcBLen - 1U; + + /* Working pointer of inputA */ + pSrc1 = pIn1 + (srcALen - (srcBLen - 1U)); + px = pSrc1; + + /* Working pointer of inputB */ + py = pIn2; + + /* ------------------- + * Stage3 process + * ------------------*/ + + while (blockSize3 > 0U) + { + /* Accumulator is made zero for every iteration */ + sum = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + k = count >> 2U; + + while (k > 0U) + { + /* x[srcALen - srcBLen + 1] , x[srcALen - srcBLen + 2] */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* y[0] , y[1] */ + in1 = (q15_t) *py++; + in2 = (q15_t) *py++; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* sum += x[srcALen - srcBLen + 1] * y[0] */ + /* sum += x[srcALen - srcBLen + 2] * y[1] */ + sum = __SMLAD(input1, input2, sum); + + /* x[srcALen - srcBLen + 3] , x[srcALen - srcBLen + 4] */ + in1 = (q15_t) *px++; + in2 = (q15_t) *px++; + input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* y[2] , y[3] */ + in1 = (q15_t) *py++; + in2 = (q15_t) *py++; + input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16U); + + /* sum += x[srcALen - srcBLen + 3] * y[2] */ + /* sum += x[srcALen - srcBLen + 4] * y[3] */ + sum = __SMLAD(input1, input2, sum); + + /* Decrement loop counter */ + k--; + } + + /* Loop unrolling: Compute remaining outputs */ + k = count % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + k = count; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (k > 0U) + { + /* Perform the multiply-accumulate */ + sum += ((q15_t) *px++ * *py++); + + /* Decrement loop counter */ + k--; + } + + /* Store the result in the accumulator in the destination buffer. */ + *pOut = (q7_t) (__SSAT(sum >> 7U, 8)); + /* Destination pointer is updated according to the address modifier, inc */ + pOut += inc; + + /* Update the inputA and inputB pointers for next MAC calculation */ + px = ++pSrc1; + py = pIn2; + + /* Decrement MAC count */ + count--; + + /* Decrement loop counter */ + blockSize3--; + } + +#else +/* alternate version for CM0_FAMILY */ + + const q7_t *pIn1 = pSrcA; /* InputA pointer */ + const q7_t *pIn2 = pSrcB + (srcBLen - 1U); /* InputB pointer */ + q31_t sum; /* Accumulator */ + uint32_t i = 0U, j; /* Loop counters */ + uint32_t inv = 0U; /* Reverse order flag */ + uint32_t tot = 0U; /* Length */ + + /* The algorithm implementation is based on the lengths of the inputs. */ + /* srcB is always made to slide across srcA. */ + /* So srcBLen is always considered as shorter or equal to srcALen */ + /* But CORR(x, y) is reverse of CORR(y, x) */ + /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ + /* and a varaible, inv is set to 1 */ + /* If lengths are not equal then zero pad has to be done to make the two + * inputs of same length. But to improve the performance, we include zeroes + * in the output instead of zero padding either of the the inputs*/ + /* If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the + * starting of the output buffer */ + /* If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the + * ending of the output buffer */ + /* Once the zero padding is done the remaining of the output is calcualted + * using convolution but with the shorter signal time shifted. */ + + /* Calculate the length of the remaining sequence */ + tot = ((srcALen + srcBLen) - 2U); + + if (srcALen > srcBLen) + { + /* Calculating the number of zeros to be padded to the output */ + j = srcALen - srcBLen; + + /* Initialise the pointer after zero padding */ + pDst += j; + } + + else if (srcALen < srcBLen) + { + /* Initialization to inputB pointer */ + pIn1 = pSrcB; + + /* Initialization to the end of inputA pointer */ + pIn2 = pSrcA + (srcALen - 1U); + + /* Initialisation of the pointer after zero padding */ + pDst = pDst + tot; + + /* Swapping the lengths */ + j = srcALen; + srcALen = srcBLen; + srcBLen = j; + + /* Setting the reverse flag */ + inv = 1; + } + + /* Loop to calculate convolution for output length number of times */ + for (i = 0U; i <= tot; i++) + { + /* Initialize sum with zero to carry out MAC operations */ + sum = 0; + + /* Loop to perform MAC operations according to convolution equation */ + for (j = 0U; j <= i; j++) + { + /* Check the array limitations */ + if (((i - j) < srcBLen) && (j < srcALen)) + { + /* z[i] += x[i-j] * y[j] */ + sum += ((q15_t) pIn1[j] * pIn2[-((int32_t) i - j)]); + } + } + + /* Store the output in the destination buffer */ + if (inv == 1) + *pDst-- = (q7_t) __SSAT((sum >> 7U), 8U); + else + *pDst++ = (q7_t) __SSAT((sum >> 7U), 8U); + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of Corr group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_f32.c new file mode 100644 index 0000000..218ca34 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_f32.c @@ -0,0 +1,703 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_decimate_f32.c + * Description: FIR decimation for floating-point sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup FIR_decimate Finite Impulse Response (FIR) Decimator + + These functions combine an FIR filter together with a decimator. + They are used in multirate systems for reducing the sample rate of a signal without introducing aliasing distortion. + Conceptually, the functions are equivalent to the block diagram below: + \image html FIRDecimator.gif "Components included in the FIR Decimator functions" + When decimating by a factor of M, the signal should be prefiltered by a lowpass filter with a normalized + cutoff frequency of 1/M in order to prevent aliasing distortion. + The user of the function is responsible for providing the filter coefficients. + + The FIR decimator functions provided in the CMSIS DSP Library combine the FIR filter and the decimator in an efficient manner. + Instead of calculating all of the FIR filter outputs and discarding M-1 out of every M, only the + samples output by the decimator are computed. + The functions operate on blocks of input and output data. + pSrc points to an array of blockSize input values and + pDst points to an array of blockSize/M output values. + In order to have an integer number of output samples blockSize + must always be a multiple of the decimation factor M. + + The library provides separate functions for Q15, Q31 and floating-point data types. + + @par Algorithm: + The FIR portion of the algorithm uses the standard form filter: +
+      y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]
+  
+ where, b[n] are the filter coefficients. + @par + The pCoeffs points to a coefficient array of size numTaps. + Coefficients are stored in time reversed order. + @par +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to a state array of size numTaps + blockSize - 1. + Samples in the state buffer are stored in the order: + @par +
+      {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[0], x[1], ..., x[blockSize-1]}
+  
+ The state variables are updated after each block of data is processed, the coefficients are untouched. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter. + Coefficient arrays may be shared among several instances while state variable array should be allocated separately. + There are separate instance structure declarations for each of the 3 supported data types. + + @par Initialization Functions + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + - Checks to make sure that the size of the input is a multiple of the decimation factor. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numTaps, pCoeffs, M (decimation factor), pState. Also set all of the values in pState to zero. + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + The code below statically initializes each of the 3 different data type filter instance structures +
+      arm_fir_decimate_instance_f32 S = {M, numTaps, pCoeffs, pState};
+      arm_fir_decimate_instance_q31 S = {M, numTaps, pCoeffs, pState};
+      arm_fir_decimate_instance_q15 S = {M, numTaps, pCoeffs, pState};
+  
+ where M is the decimation factor; numTaps is the number of filter coefficients in the filter; + pCoeffs is the address of the coefficient buffer; + pState is the address of the state buffer. + Be sure to set the values in the state buffer to zeros when doing static initialization. + + @par Fixed-Point Behavior + Care must be taken when using the fixed-point versions of the FIR decimate filter 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 FIR_decimate + @{ + */ + +/** + @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 + @return none + */ + +#if defined(ARM_MATH_NEON) +void arm_fir_decimate_f32( + const arm_fir_decimate_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t *px; /* Temporary pointer for state buffer */ + const float32_t *pb; /* Temporary pointer for coefficient buffer */ + float32_t sum0; /* Accumulator */ + float32_t x0, c0; /* Temporary variables to hold state and coefficient values */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, tapCnt, blkCnt, outBlockSize = blockSize / S->M; /* Loop counters */ + + uint32_t blkCntN4; + float32_t *px0, *px1, *px2, *px3; + float32_t acc0, acc1, acc2, acc3; + float32_t x1, x2, x3; + + float32x4_t accv,acc0v,acc1v,acc2v,acc3v; + float32x4_t x0v, x1v, x2v, x3v; + float32x4_t c0v; + float32x2_t temp; + float32x4_t sum0v; + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + (numTaps - 1U); + + /* Total number of output samples to be computed */ + blkCnt = outBlockSize / 4; + blkCntN4 = outBlockSize - (4 * blkCnt); + + while (blkCnt > 0U) + { + /* Copy 4 * decimation factor number of new input samples into the state buffer */ + i = 4 * S->M; + + do + { + *pStateCurnt++ = *pSrc++; + + } while (--i); + + /* Set accumulators to zero */ + acc0v = vdupq_n_f32(0.0); + acc1v = vdupq_n_f32(0.0); + acc2v = vdupq_n_f32(0.0); + acc3v = vdupq_n_f32(0.0); + + /* Initialize state pointer for all the samples */ + px0 = pState; + px1 = pState + S->M; + px2 = pState + 2 * S->M; + px3 = pState + 3 * S->M; + + /* Initialize coeff pointer */ + pb = pCoeffs; + + /* Process 4 taps at a time. */ + tapCnt = numTaps >> 2; + + /* Loop over the number of taps. + ** Repeat until we've computed numTaps-4 coefficients. */ + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0v = vld1q_f32(pb); + pb += 4; + + /* Read x[n-numTaps-1] sample for acc0 */ + x0v = vld1q_f32(px0); + x1v = vld1q_f32(px1); + x2v = vld1q_f32(px2); + x3v = vld1q_f32(px3); + + px0 += 4; + px1 += 4; + px2 += 4; + px3 += 4; + + acc0v = vmlaq_f32(acc0v, x0v, c0v); + acc1v = vmlaq_f32(acc1v, x1v, c0v); + acc2v = vmlaq_f32(acc2v, x2v, c0v); + acc3v = vmlaq_f32(acc3v, x3v, c0v); + + /* Decrement the loop counter */ + tapCnt--; + } + + temp = vpadd_f32(vget_low_f32(acc0v),vget_high_f32(acc0v)); + accv[0] = temp[0] + temp[1]; + + temp = vpadd_f32(vget_low_f32(acc1v),vget_high_f32(acc1v)); + accv[1] = temp[0] + temp[1]; + + temp = vpadd_f32(vget_low_f32(acc2v),vget_high_f32(acc2v)); + accv[2] = temp[0] + temp[1]; + + temp = vpadd_f32(vget_low_f32(acc3v),vget_high_f32(acc3v)); + accv[3] = temp[0] + temp[1]; + + /* If the filter length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *(pb++); + + /* Fetch state variables for acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + accv[0] += x0 * c0; + accv[1] += x1 * c0; + accv[2] += x2 * c0; + accv[3] += x3 * c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + 4 * S->M; + + /* The result is in the accumulator, store in the destination buffer. */ + vst1q_f32(pDst,accv); + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + while (blkCntN4 > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCurnt++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + sum0v = vdupq_n_f32(0.0); + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + + /* Process 4 taps at a time. */ + tapCnt = numTaps >> 2; + + /* Loop over the number of taps. + ** Repeat until we've computed numTaps-4 coefficients. */ + while (tapCnt > 0U) + { + c0v = vld1q_f32(pb); + pb += 4; + + x0v = vld1q_f32(px); + px += 4; + + sum0v = vmlaq_f32(sum0v, x0v, c0v); + + /* Decrement the loop counter */ + tapCnt--; + } + + temp = vpadd_f32(vget_low_f32(sum0v),vget_high_f32(sum0v)); + sum0 = temp[0] + temp[1]; + + /* If the filter length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *(pb++); + + /* Fetch 1 state variable */ + x0 = *(px++); + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = sum0; + + /* Decrement the loop counter */ + blkCntN4--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + i = (numTaps - 1U) >> 2; + + /* Copy data */ + while (i > 0U) + { + sum0v = vld1q_f32(pState); + vst1q_f32(pStateCurnt,sum0v); + pState += 4; + pStateCurnt += 4; + + /* Decrement the loop counter */ + i--; + } + + i = (numTaps - 1U) % 0x04U; + + /* Copy data */ + while (i > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + i--; + } +} +#else +void arm_fir_decimate_f32( + const arm_fir_decimate_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCur; /* Points to the current sample of the state */ + float32_t *px0; /* Temporary pointer for state buffer */ + const float32_t *pb; /* Temporary pointer for coefficient buffer */ + float32_t x0, c0; /* Temporary variables to hold state and coefficient values */ + float32_t acc0; /* Accumulator */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, tapCnt, blkCnt, outBlockSize = blockSize / S->M; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + float32_t *px1, *px2, *px3; + float32_t x1, x2, x3; + float32_t acc1, acc2, acc3; +#endif + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (numTaps - 1U); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 samples at a time */ + blkCnt = outBlockSize >> 2U; + + /* Samples loop unrolled by 4 */ + while (blkCnt > 0U) + { + /* Copy 4 * decimation factor number of new input samples into the state buffer */ + i = S->M * 4; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulators to zero */ + acc0 = 0.0f; + acc1 = 0.0f; + acc2 = 0.0f; + acc3 = 0.0f; + + /* Initialize state pointer for all the samples */ + px0 = pState; + px1 = pState + S->M; + px2 = pState + 2 * S->M; + px3 = pState + 3 * S->M; + + /* Initialize coeff pointer */ + pb = pCoeffs; + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-1] sample for acc0 */ + x0 = *(px0++); + /* Read x[n-numTaps-1] sample for acc1 */ + x1 = *(px1++); + /* Read x[n-numTaps-1] sample for acc2 */ + x2 = *(px2++); + /* Read x[n-numTaps-1] sample for acc3 */ + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + acc2 += x2 * c0; + acc3 += x3 * c0; + + /* Read the b[numTaps-2] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-2] sample for acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + acc2 += x2 * c0; + acc3 += x3 * c0; + + /* Read the b[numTaps-3] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-3] sample acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + acc2 += x2 * c0; + acc3 += x3 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-4] sample acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + acc2 += x2 * c0; + acc3 += x3 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *(pb++); + + /* Fetch state variables for acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + acc2 += x2 * c0; + acc3 += x3 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M * 4; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = acc0; + *pDst++ = acc1; + *pDst++ = acc2; + *pDst++ = acc3; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining samples */ + blkCnt = outBlockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = outBlockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + acc0 = 0.0f; + + /* Initialize state pointer */ + px0 = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-1] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + + /* Read the b[numTaps-2] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-2] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + + /* Read the b[numTaps-3] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-3] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-4] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch 1 state variable */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = acc0; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the satrt of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = (numTaps - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numTaps - 1U) % 0x04U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of FIR_decimate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c new file mode 100644 index 0000000..948b15c --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c @@ -0,0 +1,595 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_decimate_fast_q15.c + * Description: Fast Q15 FIR Decimator + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_decimate + @{ + */ + +/** + @brief Processing function for the Q15 FIR decimator (fast variant). + @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 + @return none + + @par Scaling and Overflow Behavior + This fast version uses a 32-bit accumulator with 2.30 format. + The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. + Thus, if the accumulator result overflows it wraps around and distorts the result. + In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits (log2 is read as log to the base 2). + The 2.30 accumulator is then truncated to 2.15 format and saturated to yield the 1.15 result. + @remark + Refer to \ref arm_fir_decimate_q15() for a slower implementation of this function which uses 64-bit accumulation to avoid wrap around distortion. + Both the slow and the fast versions use the same instance structure. + Use function \ref arm_fir_decimate_init_q15() to initialize the filter structure. + */ + +#if defined (ARM_MATH_DSP) + +void arm_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCur; /* Points to the current sample of the state */ + q15_t *px; /* Temporary pointer for state buffer */ + const q15_t *pb; /* Temporary pointer for coefficient buffer */ + q31_t x0, x1, c0; /* Temporary variables to hold state and coefficient values */ + q31_t sum0; /* Accumulators */ + q31_t acc0, acc1; + q15_t *px0, *px1; + uint32_t blkCntN3; + uint32_t numTaps = S->numTaps; /* Number of taps */ + uint32_t i, blkCnt, tapCnt, outBlockSize = blockSize / S->M; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t c1; /* Temporary variables to hold state and coefficient values */ +#endif + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (numTaps - 1U); + + /* Total number of output samples to be computed */ + blkCnt = outBlockSize / 2; + blkCntN3 = outBlockSize - (2 * blkCnt); + + while (blkCnt > 0U) + { + /* Copy 2 * decimation factor number of new input samples into the state buffer */ + i = S->M * 2; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + acc0 = 0; + acc1 = 0; + + /* Initialize state pointer for all the samples */ + px0 = pState; + px1 = pState + S->M; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] and b[numTaps-2] coefficients */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* Read x[n-numTaps-1] and x[n-numTaps-2]sample */ + x0 = read_q15x2_ia (&px0); + x1 = read_q15x2_ia (&px1); + + /* Perform the multiply-accumulate */ + acc0 = __SMLAD(x0, c0, acc0); + acc1 = __SMLAD(x1, c0, acc1); + + /* Read the b[numTaps-3] and b[numTaps-4] coefficient */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* Read x[n-numTaps-2] and x[n-numTaps-3] sample */ + x0 = read_q15x2_ia (&px0); + x1 = read_q15x2_ia (&px1); + + /* Perform the multiply-accumulate */ + acc0 = __SMLAD(x0, c0, acc0); + acc1 = __SMLAD(x1, c0, acc1); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch state variables for acc0, acc1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 = __SMLAD(x0, c0, acc0); + acc1 = __SMLAD(x1, c0, acc1); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M * 2; + + /* Store filter output, smlad returns the values in 2.14 format */ + /* so downsacle by 15 to get output in 1.15 */ + *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + *pDst++ = (q15_t) (__SSAT((acc1 >> 15), 16)); + + /* Decrement loop counter */ + blkCnt--; + } + + while (blkCntN3 > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + sum0 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] and b[numTaps-2] coefficients */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* Read x[n-numTaps-1] and x[n-numTaps-2] sample */ + x0 = read_q15x2_ia (&px); + + /* Read the b[numTaps-3] and b[numTaps-4] coefficients */ + c1 = read_q15x2_ia ((q15_t **) &pb); + + /* Perform the multiply-accumulate */ + sum0 = __SMLAD(x0, c0, sum0); + + /* Read x[n-numTaps-2] and x[n-numTaps-3] sample */ + x0 = read_q15x2_ia (&px); + + /* Perform the multiply-accumulate */ + sum0 = __SMLAD(x0, c1, sum0); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch 1 state variable */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 = __SMLAD(x0, c0, sum0); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M; + + /* Store filter output, smlad returns the values in 2.14 format */ + /* so downsacle by 15 to get output in 1.15 */ + *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); + + /* Decrement loop counter */ + blkCntN3--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the satrt of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + + i = (numTaps - 1U) >> 2U; + + /* copy data */ + while (i > 0U) + { + write_q15x2_ia (&pStateCur, read_q15x2_ia (&pState)); + write_q15x2_ia (&pStateCur, read_q15x2_ia (&pState)); + + /* Decrement loop counter */ + i--; + } + + i = (numTaps - 1U) % 0x04U; + + /* Copy data */ + while (i > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + i--; + } + +} + +#else /* #if defined (ARM_MATH_DSP) */ + +void arm_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCur; /* Points to the current sample of the state */ + q15_t *px; /* Temporary pointer for state buffer */ + const q15_t *pb; /* Temporary pointer for coefficient buffer */ + q15_t x0, x1, c0; /* Temporary variables to hold state and coefficient values */ + q31_t sum0; /* Accumulators */ + q31_t acc0, acc1; + q15_t *px0, *px1; + uint32_t blkCntN3; + uint32_t numTaps = S->numTaps; /* Number of taps */ + uint32_t i, blkCnt, tapCnt, outBlockSize = blockSize / S->M; /* Loop counters */ + + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (numTaps - 1U); + + /* Total number of output samples to be computed */ + blkCnt = outBlockSize / 2; + blkCntN3 = outBlockSize - (2 * blkCnt); + + while (blkCnt > 0U) + { + /* Copy 2 * decimation factor number of new input samples into the state buffer */ + i = S->M * 2; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + acc0 = 0; + acc1 = 0; + + /* Initialize state pointer */ + px0 = pState; + px1 = pState + S->M; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the Read b[numTaps-1] coefficients */ + c0 = *pb++; + + /* Read x[n-numTaps-1] for sample 0 and for sample 1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Read the b[numTaps-2] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-2] for sample 0 and sample 1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Read the b[numTaps-3] coefficients */ + c0 = *pb++; + + /* Read x[n-numTaps-3] for sample 0 and sample 1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-4] for sample 0 and sample 1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch 1 state variable */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M * 2; + + /* Store filter output, smlad returns the values in 2.14 format */ + /* so downsacle by 15 to get output in 1.15 */ + + *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + *pDst++ = (q15_t) (__SSAT((acc1 >> 15), 16)); + + /* Decrement loop counter */ + blkCnt--; + } + + while (blkCntN3 > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + sum0 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-1] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Read the b[numTaps-2] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-2] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Read the b[numTaps-3] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-3] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-4] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch 1 state variable */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M; + + /* Store filter output, smlad returns the values in 2.14 format */ + /* so downsacle by 15 to get output in 1.15 */ + *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); + + /* Decrement loop counter */ + blkCntN3--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + + i = (numTaps - 1U) >> 2U; + + /* copy data */ + while (i > 0U) + { + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + i--; + } + + i = (numTaps - 1U) % 0x04U; + + /* copy data */ + while (i > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + i--; + } +} + +#endif /* #if defined (ARM_MATH_DSP) */ + +/** + @} end of FIR_decimate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c new file mode 100644 index 0000000..2c3a28a --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c @@ -0,0 +1,390 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_decimate_fast_q31.c + * Description: Fast Q31 FIR Decimator + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_decimate + @{ + */ + +/** + @brief Processing function for the Q31 FIR decimator (fast variant). + @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 samples to process + @return none + + @par Scaling and Overflow Behavior + This function is optimized for speed at the expense of fixed-point precision and overflow protection. + The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. + These intermediate results are added to a 2.30 accumulator. + Finally, the accumulator is saturated and converted to a 1.31 result. + The fast version has the same overflow behavior as the standard version and provides less precision since it discards the low 32 bits of each multiplication result. + In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits (where log2 is read as log to the base 2). + + @remark + Refer to \ref arm_fir_decimate_q31() for a slower implementation of this function which uses a 64-bit accumulator to provide higher precision. + Both the slow and the fast versions use the same instance structure. + Use function \ref arm_fir_decimate_init_q31() to initialize the filter structure. + */ + +void arm_fir_decimate_fast_q31( + const arm_fir_decimate_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCur; /* Points to the current sample of the state */ + q31_t *px0; /* Temporary pointer for state buffer */ + const q31_t *pb; /* Temporary pointer for coefficient buffer */ + q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ + q63_t acc0; /* Accumulator */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, tapCnt, blkCnt, outBlockSize = blockSize / S->M; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t *px1, *px2, *px3; + q31_t x1, x2, x3; + q63_t acc1, acc2, acc3; +#endif + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (numTaps - 1U); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 samples at a time */ + blkCnt = outBlockSize >> 2U; + + /* Samples loop unrolled by 4 */ + while (blkCnt > 0U) + { + /* Copy 4 * decimation factor number of new input samples into the state buffer */ + i = S->M * 4; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Initialize state pointer for all the samples */ + px0 = pState; + px1 = pState + S->M; + px2 = pState + 2 * S->M; + px3 = pState + 3 * S->M; + + /* Initialize coeff pointer */ + pb = pCoeffs; + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-1] sample for acc0 */ + x0 = *(px0++); + /* Read x[n-numTaps-1] sample for acc1 */ + x1 = *(px1++); + /* Read x[n-numTaps-1] sample for acc2 */ + x2 = *(px2++); + /* Read x[n-numTaps-1] sample for acc3 */ + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + /* Read the b[numTaps-2] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-2] sample for acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + /* Read the b[numTaps-3] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-3] sample acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + /* Read the b[numTaps-4] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-4] sample acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *(pb++); + + /* Fetch state variables for acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); + acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); + acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M * 4; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q31_t) (acc0 << 1); + *pDst++ = (q31_t) (acc1 << 1); + *pDst++ = (q31_t) (acc2 << 1); + *pDst++ = (q31_t) (acc3 << 1); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining samples */ + blkCnt = outBlockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = outBlockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + acc0 = 0; + + /* Initialize state pointer */ + px0 = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-1] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + + /* Read the b[numTaps-2] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-2] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + + /* Read the b[numTaps-3] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-3] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + + /* Read the b[numTaps-4] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-4] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch 1 state variable */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q31_t) (acc0 << 1); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the satrt of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = (numTaps - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numTaps - 1U) % 0x04U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of FIR_decimate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_f32.c new file mode 100644 index 0000000..9382f09 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_f32.c @@ -0,0 +1,105 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_decimate_init_f32.c + * Description: Floating-point FIR Decimator initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_decimate + @{ + */ + +/** + @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 ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to the array of state variables. + pState is of length numTaps+blockSize-1 words where blockSize is the number of input samples passed to arm_fir_decimate_f32(). + M is the decimation factor. + */ + +arm_status arm_fir_decimate_init_f32( + arm_fir_decimate_instance_f32 * S, + uint16_t numTaps, + uint8_t M, + const float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize) +{ + arm_status status; + + /* The size of the input block must be a multiple of the decimation factor */ + if ((blockSize % M) != 0U) + { + /* Set status as ARM_MATH_LENGTH_ERROR */ + status = ARM_MATH_LENGTH_ERROR; + } + else + { + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear the state buffer. The size is always (blockSize + numTaps - 1) */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; + + /* Assign Decimation Factor */ + S->M = M; + + status = ARM_MATH_SUCCESS; + } + + return (status); + +} + +/** + @} end of FIR_decimate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q15.c new file mode 100644 index 0000000..f583a03 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q15.c @@ -0,0 +1,106 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_decimate_init_q15.c + * Description: Initialization function for the Q15 FIR Decimator + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_decimate + @{ + */ + +/** + @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 + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to the array of state variables. + pState is of length numTaps+blockSize-1 words where blockSize is the number of input samples + to the call arm_fir_decimate_q15(). + M is the decimation factor. + */ + +arm_status arm_fir_decimate_init_q15( + arm_fir_decimate_instance_q15 * S, + uint16_t numTaps, + uint8_t M, + const q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize) +{ + arm_status status; + + /* The size of the input block must be a multiple of the decimation factor */ + if ((blockSize % M) != 0U) + { + /* Set status as ARM_MATH_LENGTH_ERROR */ + status = ARM_MATH_LENGTH_ERROR; + } + else + { + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear the state buffer. The size is always (blockSize + numTaps - 1) */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q15_t)); + + /* Assign state pointer */ + S->pState = pState; + + /* Assign Decimation Factor */ + S->M = M; + + status = ARM_MATH_SUCCESS; + } + + return (status); + +} + +/** + @} end of FIR_decimate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q31.c new file mode 100644 index 0000000..5ee69c6 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_init_q31.c @@ -0,0 +1,105 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_decimate_init_q31.c + * Description: Initialization function for Q31 FIR Decimation filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_decimate + @{ + */ + +/** + @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 + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to the array of state variables. + pState is of length numTaps+blockSize-1 words where blockSize is the number of input samples passed to arm_fir_decimate_q31(). + M is the decimation factor. + */ + +arm_status arm_fir_decimate_init_q31( + arm_fir_decimate_instance_q31 * S, + uint16_t numTaps, + uint8_t M, + const q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize) +{ + arm_status status; + + /* The size of the input block must be a multiple of the decimation factor */ + if ((blockSize % M) != 0U) + { + /* Set status as ARM_MATH_LENGTH_ERROR */ + status = ARM_MATH_LENGTH_ERROR; + } + else + { + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear the state buffer. The size is always (blockSize + numTaps - 1) */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q31_t)); + + /* Assign state pointer */ + S->pState = pState; + + /* Assign Decimation Factor */ + S->M = M; + + status = ARM_MATH_SUCCESS; + } + + return (status); + +} + +/** + @} end of FIR_decimate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q15.c new file mode 100644 index 0000000..f9d92c0 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q15.c @@ -0,0 +1,595 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_decimate_q15.c + * Description: Q15 FIR Decimator + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_decimate + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both coefficients 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. + + @remark + Refer to \ref arm_fir_decimate_fast_q15() for a faster but less precise implementation of this function. + */ + +#if defined (ARM_MATH_DSP) + +void arm_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCur; /* Points to the current sample of the state */ + q15_t *px; /* Temporary pointer for state buffer */ + const q15_t *pb; /* Temporary pointer for coefficient buffer */ + q31_t x0, x1, c0; /* Temporary variables to hold state and coefficient values */ + q63_t sum0; /* Accumulators */ + q63_t acc0, acc1; + q15_t *px0, *px1; + uint32_t blkCntN3; + uint32_t numTaps = S->numTaps; /* Number of taps */ + uint32_t i, blkCnt, tapCnt, outBlockSize = blockSize / S->M; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t c1; /* Temporary variables to hold state and coefficient values */ +#endif + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (numTaps - 1U); + + /* Total number of output samples to be computed */ + blkCnt = outBlockSize / 2; + blkCntN3 = outBlockSize - (2 * blkCnt); + + while (blkCnt > 0U) + { + /* Copy 2 * decimation factor number of new input samples into the state buffer */ + i = S->M * 2; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + acc0 = 0; + acc1 = 0; + + /* Initialize state pointer for all the samples */ + px0 = pState; + px1 = pState + S->M; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] and b[numTaps-2] coefficients */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* Read x[n-numTaps-1] and x[n-numTaps-2]sample */ + x0 = read_q15x2_ia (&px0); + x1 = read_q15x2_ia (&px1); + + /* Perform the multiply-accumulate */ + acc0 = __SMLALD(x0, c0, acc0); + acc1 = __SMLALD(x1, c0, acc1); + + /* Read the b[numTaps-3] and b[numTaps-4] coefficient */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* Read x[n-numTaps-2] and x[n-numTaps-3] sample */ + x0 = read_q15x2_ia (&px0); + x1 = read_q15x2_ia (&px1); + + /* Perform the multiply-accumulate */ + acc0 = __SMLALD(x0, c0, acc0); + acc1 = __SMLALD(x1, c0, acc1); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch state variables for acc0, acc1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 = __SMLALD(x0, c0, acc0); + acc1 = __SMLALD(x1, c0, acc1); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M * 2; + + /* Store filter output, smlad returns the values in 2.14 format */ + /* so downsacle by 15 to get output in 1.15 */ + *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + *pDst++ = (q15_t) (__SSAT((acc1 >> 15), 16)); + + /* Decrement loop counter */ + blkCnt--; + } + + while (blkCntN3 > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + sum0 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] and b[numTaps-2] coefficients */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* Read x[n-numTaps-1] and x[n-numTaps-2] sample */ + x0 = read_q15x2_ia (&px); + + /* Read the b[numTaps-3] and b[numTaps-4] coefficients */ + c1 = read_q15x2_ia ((q15_t **) &pb); + + /* Perform the multiply-accumulate */ + sum0 = __SMLALD(x0, c0, sum0); + + /* Read x[n-numTaps-2] and x[n-numTaps-3] sample */ + x0 = read_q15x2_ia (&px); + + /* Perform the multiply-accumulate */ + sum0 = __SMLALD(x0, c1, sum0); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch 1 state variable */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 = __SMLALD(x0, c0, sum0); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M; + + /* Store filter output, smlad returns the values in 2.14 format */ + /* so downsacle by 15 to get output in 1.15 */ + *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); + + /* Decrement loop counter */ + blkCntN3--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the satrt of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + + i = (numTaps - 1U) >> 2U; + + /* copy data */ + while (i > 0U) + { + write_q15x2_ia (&pStateCur, read_q15x2_ia (&pState)); + write_q15x2_ia (&pStateCur, read_q15x2_ia (&pState)); + + /* Decrement loop counter */ + i--; + } + + i = (numTaps - 1U) % 0x04U; + + /* Copy data */ + while (i > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + i--; + } + +} + +#else /* #if defined (ARM_MATH_DSP) */ + +void arm_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCur; /* Points to the current sample of the state */ + q15_t *px; /* Temporary pointer for state buffer */ + const q15_t *pb; /* Temporary pointer for coefficient buffer */ + q15_t x0, x1, c0; /* Temporary variables to hold state and coefficient values */ + q63_t sum0; /* Accumulators */ + q63_t acc0, acc1; + q15_t *px0, *px1; + uint32_t blkCntN3; + uint32_t numTaps = S->numTaps; /* Number of taps */ + uint32_t i, blkCnt, tapCnt, outBlockSize = blockSize / S->M; /* Loop counters */ + + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (numTaps - 1U); + + /* Total number of output samples to be computed */ + blkCnt = outBlockSize / 2; + blkCntN3 = outBlockSize - (2 * blkCnt); + + while (blkCnt > 0U) + { + /* Copy 2 * decimation factor number of new input samples into the state buffer */ + i = S->M * 2; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + acc0 = 0; + acc1 = 0; + + /* Initialize state pointer */ + px0 = pState; + px1 = pState + S->M; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the Read b[numTaps-1] coefficients */ + c0 = *pb++; + + /* Read x[n-numTaps-1] for sample 0 and for sample 1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Read the b[numTaps-2] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-2] for sample 0 and sample 1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Read the b[numTaps-3] coefficients */ + c0 = *pb++; + + /* Read x[n-numTaps-3] for sample 0 and sample 1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-4] for sample 0 and sample 1 */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch 1 state variable */ + x0 = *px0++; + x1 = *px1++; + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M * 2; + + /* Store filter output, smlad returns the values in 2.14 format */ + /* so downsacle by 15 to get output in 1.15 */ + + *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + *pDst++ = (q15_t) (__SSAT((acc1 >> 15), 16)); + + /* Decrement loop counter */ + blkCnt--; + } + + while (blkCntN3 > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + sum0 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-1] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Read the b[numTaps-2] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-2] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Read the b[numTaps-3] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-3] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-4] sample */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch 1 state variable */ + x0 = *px++; + + /* Perform the multiply-accumulate */ + sum0 += x0 * c0; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M; + + /* Store filter output, smlad returns the values in 2.14 format */ + /* so downsacle by 15 to get output in 1.15 */ + *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); + + /* Decrement loop counter */ + blkCntN3--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + + i = (numTaps - 1U) >> 2U; + + /* copy data */ + while (i > 0U) + { + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + i--; + } + + i = (numTaps - 1U) % 0x04U; + + /* copy data */ + while (i > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + i--; + } +} + +#endif /* #if defined (ARM_MATH_DSP) */ + +/** + @} end of FIR_decimate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q31.c new file mode 100644 index 0000000..7af8a44 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_decimate_q31.c @@ -0,0 +1,387 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_decimate_q31.c + * Description: Q31 FIR Decimator + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_decimate + @{ + */ + +/** + @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 samples to process + @return none + + @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 log2(numTaps) bits (where log2 is read as log to the base 2). + After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. + + @remark + Refer to \ref arm_fir_decimate_fast_q31() for a faster but less precise implementation of this function. + */ + +void arm_fir_decimate_q31( + const arm_fir_decimate_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCur; /* Points to the current sample of the state */ + q31_t *px0; /* Temporary pointer for state buffer */ + const q31_t *pb; /* Temporary pointer for coefficient buffer */ + q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ + q63_t acc0; /* Accumulator */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, tapCnt, blkCnt, outBlockSize = blockSize / S->M; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t *px1, *px2, *px3; + q31_t x1, x2, x3; + q63_t acc1, acc2, acc3; +#endif + + /* S->pState buffer contains previous frame (numTaps - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (numTaps - 1U); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 samples at a time */ + blkCnt = outBlockSize >> 2U; + + /* Samples loop unrolled by 4 */ + while (blkCnt > 0U) + { + /* Copy 4 * decimation factor number of new input samples into the state buffer */ + i = S->M * 4; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Initialize state pointer for all the samples */ + px0 = pState; + px1 = pState + S->M; + px2 = pState + 2 * S->M; + px3 = pState + 3 * S->M; + + /* Initialize coeff pointer */ + pb = pCoeffs; + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-1] sample for acc0 */ + x0 = *(px0++); + /* Read x[n-numTaps-1] sample for acc1 */ + x1 = *(px1++); + /* Read x[n-numTaps-1] sample for acc2 */ + x2 = *(px2++); + /* Read x[n-numTaps-1] sample for acc3 */ + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + acc1 += (q63_t) x1 * c0; + acc2 += (q63_t) x2 * c0; + acc3 += (q63_t) x3 * c0; + + /* Read the b[numTaps-2] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-2] sample for acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + acc1 += (q63_t) x1 * c0; + acc2 += (q63_t) x2 * c0; + acc3 += (q63_t) x3 * c0; + + /* Read the b[numTaps-3] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-3] sample acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + acc1 += (q63_t) x1 * c0; + acc2 += (q63_t) x2 * c0; + acc3 += (q63_t) x3 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-4] sample acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + acc1 += (q63_t) x1 * c0; + acc2 += (q63_t) x2 * c0; + acc3 += (q63_t) x3 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *(pb++); + + /* Fetch state variables for acc0, acc1, acc2, acc3 */ + x0 = *(px0++); + x1 = *(px1++); + x2 = *(px2++); + x3 = *(px3++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + acc1 += (q63_t) x1 * c0; + acc2 += (q63_t) x2 * c0; + acc3 += (q63_t) x3 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M * 4; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q31_t) (acc0 >> 31); + *pDst++ = (q31_t) (acc1 >> 31); + *pDst++ = (q31_t) (acc2 >> 31); + *pDst++ = (q31_t) (acc3 >> 31); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining samples */ + blkCnt = outBlockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = outBlockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy decimation factor number of new input samples into the state buffer */ + i = S->M; + + do + { + *pStateCur++ = *pSrc++; + + } while (--i); + + /* Set accumulator to zero */ + acc0 = 0; + + /* Initialize state pointer */ + px0 = pState; + + /* Initialize coeff pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-1] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + + /* Read the b[numTaps-2] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-2] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + + /* Read the b[numTaps-3] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-3] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *pb++; + + /* Read x[n-numTaps-4] sample */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *pb++; + + /* Fetch 1 state variable */ + x0 = *px0++; + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by the decimation factor + * to process the next group of decimation factor number samples */ + pState = pState + S->M; + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q31_t) (acc0 >> 31); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the satrt of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = (numTaps - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numTaps - 1U) % 0x04U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of FIR_decimate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_f32.c new file mode 100644 index 0000000..0531cfe --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_f32.c @@ -0,0 +1,715 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_f32.c + * Description: Floating-point FIR filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup FIR Finite Impulse Response (FIR) Filters + + This set of functions implements Finite Impulse Response (FIR) filters + for Q7, Q15, Q31, and floating-point data types. Fast versions of Q15 and Q31 are also provided. + The functions operate on blocks of input and output data and each call to the function processes + blockSize samples through the filter. pSrc and + pDst points to input and output arrays containing blockSize values. + + @par Algorithm + The FIR filter algorithm is based upon a sequence of multiply-accumulate (MAC) operations. + Each filter coefficient b[n] is multiplied by a state variable which equals a previous input sample x[n]. +
+      y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]
+  
+ @par + \image html FIR.GIF "Finite Impulse Response filter" + @par + pCoeffs points to a coefficient array of size numTaps. + Coefficients are stored in time reversed order. + @par +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to a state array of size numTaps + blockSize - 1. + Samples in the state buffer are stored in the following order. + @par +
+      {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[0], x[1], ..., x[blockSize-1]}
+  
+ @par + Note that the length of the state buffer exceeds the length of the coefficient array by blockSize-1. + The increased state buffer length allows circular addressing, which is traditionally used in the FIR filters, + to be avoided and yields a significant speed improvement. + The state variables are updated after each block of data is processed; the coefficients are untouched. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter. + Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. + There are separate instance structure declarations for each of the 4 supported data types. + + @par Initialization Functions + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numTaps, pCoeffs, pState. Also set all of the values in pState to zero. + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + Set the values in the state buffer to zeros before static initialization. + The code below statically initializes each of the 4 different data type filter instance structures +
+      arm_fir_instance_f32 S = {numTaps, pState, pCoeffs};
+      arm_fir_instance_q31 S = {numTaps, pState, pCoeffs};
+      arm_fir_instance_q15 S = {numTaps, pState, pCoeffs};
+      arm_fir_instance_q7 S =  {numTaps, pState, pCoeffs};
+  
+ where numTaps is the number of filter coefficients in the filter; pState is the address of the state buffer; + pCoeffs is the address of the coefficient buffer. + + @par Fixed-Point Behavior + Care must be taken when using the fixed-point versions of the FIR filter 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 FIR + @{ + */ + +/** + @brief Processing function for floating-point FIR filter. + @param[in] S points to an instance of the floating-point 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 + @return none + */ +#if defined(ARM_MATH_NEON) + +void arm_fir_f32( +const arm_fir_instance_f32 * S, +const float32_t * pSrc, +float32_t * pDst, +uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t *px; /* Temporary pointers for state buffer */ + const float32_t *pb; /* Temporary pointers for coefficient buffer */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, tapCnt, blkCnt; /* Loop counters */ + + float32x4_t accv0,accv1,samples0,samples1,x0,x1,x2,xa,xb,x,b,accv; + uint32x4_t x0_u,x1_u,x2_u,xa_u,xb_u; + float32_t acc; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + /* Loop unrolling */ + blkCnt = blockSize >> 3; + + while (blkCnt > 0U) + { + /* Copy 8 samples at a time into state buffers */ + samples0 = vld1q_f32(pSrc); + vst1q_f32(pStateCurnt,samples0); + + pStateCurnt += 4; + pSrc += 4 ; + + samples1 = vld1q_f32(pSrc); + vst1q_f32(pStateCurnt,samples1); + + pStateCurnt += 4; + pSrc += 4 ; + + /* Set the accumulators to zero */ + accv0 = vdupq_n_f32(0); + accv1 = vdupq_n_f32(0); + + /* Initialize state pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Loop unroling */ + i = numTaps >> 2; + + /* Perform the multiply-accumulates */ + x0 = vld1q_f32(px); + x1 = vld1q_f32(px + 4); + + while(i > 0) + { + /* acc = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] */ + x2 = vld1q_f32(px + 8); + b = vld1q_f32(pb); + xa = x0; + xb = x1; + accv0 = vmlaq_n_f32(accv0,xa,b[0]); + accv1 = vmlaq_n_f32(accv1,xb,b[0]); + + xa = vextq_f32(x0,x1,1); + xb = vextq_f32(x1,x2,1); + + accv0 = vmlaq_n_f32(accv0,xa,b[1]); + accv1 = vmlaq_n_f32(accv1,xb,b[1]); + + xa = vextq_f32(x0,x1,2); + xb = vextq_f32(x1,x2,2); + + accv0 = vmlaq_n_f32(accv0,xa,b[2]); + accv1 = vmlaq_n_f32(accv1,xb,b[2]); + + xa = vextq_f32(x0,x1,3); + xb = vextq_f32(x1,x2,3); + + accv0 = vmlaq_n_f32(accv0,xa,b[3]); + accv1 = vmlaq_n_f32(accv1,xb,b[3]); + + pb += 4; + x0 = x1; + x1 = x2; + px += 4; + i--; + + } + + /* Tail */ + i = numTaps & 3; + x2 = vld1q_f32(px + 8); + + /* Perform the multiply-accumulates */ + switch(i) + { + case 3: + { + accv0 = vmlaq_n_f32(accv0,x0,*pb); + accv1 = vmlaq_n_f32(accv1,x1,*pb); + + pb++; + + xa = vextq_f32(x0,x1,1); + xb = vextq_f32(x1,x2,1); + + accv0 = vmlaq_n_f32(accv0,xa,*pb); + accv1 = vmlaq_n_f32(accv1,xb,*pb); + + pb++; + + xa = vextq_f32(x0,x1,2); + xb = vextq_f32(x1,x2,2); + + accv0 = vmlaq_n_f32(accv0,xa,*pb); + accv1 = vmlaq_n_f32(accv1,xb,*pb); + + } + break; + case 2: + { + accv0 = vmlaq_n_f32(accv0,x0,*pb); + accv1 = vmlaq_n_f32(accv1,x1,*pb); + + pb++; + + xa = vextq_f32(x0,x1,1); + xb = vextq_f32(x1,x2,1); + + accv0 = vmlaq_n_f32(accv0,xa,*pb); + accv1 = vmlaq_n_f32(accv1,xb,*pb); + + } + break; + case 1: + { + + accv0 = vmlaq_n_f32(accv0,x0,*pb); + accv1 = vmlaq_n_f32(accv1,x1,*pb); + + } + break; + default: + break; + } + + /* The result is stored in the destination buffer. */ + vst1q_f32(pDst,accv0); + pDst += 4; + vst1q_f32(pDst,accv1); + pDst += 4; + + /* Advance state pointer by 8 for the next 8 samples */ + pState = pState + 8; + + blkCnt--; + } + + /* Tail */ + blkCnt = blockSize & 0x7; + + while (blkCnt > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc = 0.0f; + + /* Initialize state pointer */ + px = pState; + + /* Initialize Coefficient pointer */ + pb = pCoeffs; + + i = numTaps; + + /* Perform the multiply-accumulates */ + do + { + /* acc = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] */ + acc += *px++ * *pb++; + i--; + + } while (i > 0U); + + /* The result is stored in the destination buffer. */ + *pDst++ = acc; + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1; + + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last numTaps - 1 samples to the starting of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + /* Copy numTaps number of values */ + tapCnt = numTaps - 1U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } + +} +#else +void arm_fir_f32( + const arm_fir_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t *px; /* Temporary pointer for state buffer */ + const float32_t *pb; /* Temporary pointer for coefficient buffer */ + float32_t acc0; /* Accumulator */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, tapCnt, blkCnt; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + float32_t acc1, acc2, acc3, acc4, acc5, acc6, acc7; /* Accumulators */ + float32_t x0, x1, x2, x3, x4, x5, x6, x7; /* Temporary variables to hold state values */ + float32_t c0; /* Temporary variable to hold coefficient value */ +#endif + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 8 output values simultaneously. + * The variables acc0 ... acc7 hold output values that are being computed: + * + * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] + * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] + * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] + * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] + */ + + blkCnt = blockSize >> 3U; + + while (blkCnt > 0U) + { + /* Copy 4 new input samples into the state buffer. */ + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + + /* Set all accumulators to zero */ + acc0 = 0.0f; + acc1 = 0.0f; + acc2 = 0.0f; + acc3 = 0.0f; + acc4 = 0.0f; + acc5 = 0.0f; + acc6 = 0.0f; + acc7 = 0.0f; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* This is separated from the others to avoid + * a call to __aeabi_memmove which would be slower + */ + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + + /* Read the first 7 samples from the state buffer: x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2] */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + x3 = *px++; + x4 = *px++; + x5 = *px++; + x6 = *px++; + + /* Loop unrolling: process 8 taps at a time. */ + tapCnt = numTaps >> 3U; + + while (tapCnt > 0U) + { + /* Read the b[numTaps-1] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-3] sample */ + x7 = *(px++); + + /* acc0 += b[numTaps-1] * x[n-numTaps] */ + acc0 += x0 * c0; + + /* acc1 += b[numTaps-1] * x[n-numTaps-1] */ + acc1 += x1 * c0; + + /* acc2 += b[numTaps-1] * x[n-numTaps-2] */ + acc2 += x2 * c0; + + /* acc3 += b[numTaps-1] * x[n-numTaps-3] */ + acc3 += x3 * c0; + + /* acc4 += b[numTaps-1] * x[n-numTaps-4] */ + acc4 += x4 * c0; + + /* acc1 += b[numTaps-1] * x[n-numTaps-5] */ + acc5 += x5 * c0; + + /* acc2 += b[numTaps-1] * x[n-numTaps-6] */ + acc6 += x6 * c0; + + /* acc3 += b[numTaps-1] * x[n-numTaps-7] */ + acc7 += x7 * c0; + + /* Read the b[numTaps-2] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-4] sample */ + x0 = *(px++); + + /* Perform the multiply-accumulate */ + acc0 += x1 * c0; + acc1 += x2 * c0; + acc2 += x3 * c0; + acc3 += x4 * c0; + acc4 += x5 * c0; + acc5 += x6 * c0; + acc6 += x7 * c0; + acc7 += x0 * c0; + + /* Read the b[numTaps-3] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-5] sample */ + x1 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += x2 * c0; + acc1 += x3 * c0; + acc2 += x4 * c0; + acc3 += x5 * c0; + acc4 += x6 * c0; + acc5 += x7 * c0; + acc6 += x0 * c0; + acc7 += x1 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-6] sample */ + x2 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += x3 * c0; + acc1 += x4 * c0; + acc2 += x5 * c0; + acc3 += x6 * c0; + acc4 += x7 * c0; + acc5 += x0 * c0; + acc6 += x1 * c0; + acc7 += x2 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-6] sample */ + x3 = *(px++); + /* Perform the multiply-accumulates */ + acc0 += x4 * c0; + acc1 += x5 * c0; + acc2 += x6 * c0; + acc3 += x7 * c0; + acc4 += x0 * c0; + acc5 += x1 * c0; + acc6 += x2 * c0; + acc7 += x3 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-6] sample */ + x4 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += x5 * c0; + acc1 += x6 * c0; + acc2 += x7 * c0; + acc3 += x0 * c0; + acc4 += x1 * c0; + acc5 += x2 * c0; + acc6 += x3 * c0; + acc7 += x4 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-6] sample */ + x5 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += x6 * c0; + acc1 += x7 * c0; + acc2 += x0 * c0; + acc3 += x1 * c0; + acc4 += x2 * c0; + acc5 += x3 * c0; + acc6 += x4 * c0; + acc7 += x5 * c0; + + /* Read the b[numTaps-4] coefficient */ + c0 = *(pb++); + + /* Read x[n-numTaps-6] sample */ + x6 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += x7 * c0; + acc1 += x0 * c0; + acc2 += x1 * c0; + acc3 += x2 * c0; + acc4 += x3 * c0; + acc5 += x4 * c0; + acc6 += x5 * c0; + acc7 += x6 * c0; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + tapCnt = numTaps % 0x8U; + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *(pb++); + + /* Fetch 1 state variable */ + x7 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += x0 * c0; + acc1 += x1 * c0; + acc2 += x2 * c0; + acc3 += x3 * c0; + acc4 += x4 * c0; + acc5 += x5 * c0; + acc6 += x6 * c0; + acc7 += x7 * c0; + + /* Reuse the present sample states for next sample */ + x0 = x1; + x1 = x2; + x2 = x3; + x3 = x4; + x4 = x5; + x5 = x6; + x6 = x7; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by 8 to process the next group of 8 samples */ + pState = pState + 8; + + /* The results in the 8 accumulators, store in the destination buffer. */ + *pDst++ = acc0; + *pDst++ = acc1; + *pDst++ = acc2; + *pDst++ = acc3; + *pDst++ = acc4; + *pDst++ = acc5; + *pDst++ = acc6; + *pDst++ = acc7; + + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining output samples */ + blkCnt = blockSize % 0x8U; + +#else + + /* Initialize blkCnt with number of taps */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc0 = 0.0f; + + /* Initialize state pointer */ + px = pState; + + /* Initialize Coefficient pointer */ + pb = pCoeffs; + + i = numTaps; + + /* Perform the multiply-accumulates */ + do + { + /* acc = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] */ + acc0 += *px++ * *pb++; + + i--; + } while (i > 0U); + + /* Store result in destination buffer. */ + *pDst++ = acc0; + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = (numTaps - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Calculate remaining number of copies */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy remaining data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +#endif /* #if defined(ARM_MATH_NEON) */ +/** +* @} end of FIR group +*/ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q15.c new file mode 100644 index 0000000..5f8df95 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q15.c @@ -0,0 +1,332 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_fast_q15.c + * Description: Q15 Fast FIR filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR + @{ + */ + +/** + @brief Processing function for the 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 + @return none + + @par Scaling and Overflow Behavior + This fast version uses a 32-bit accumulator with 2.30 format. + The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. + Thus, if the accumulator result overflows it wraps around and distorts the result. + In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits. + The 2.30 accumulator is then truncated to 2.15 format and saturated to yield the 1.15 result. + + @remark + Refer to \ref arm_fir_q15() for a slower implementation of this function which uses 64-bit accumulation to avoid wrap around distortion. Both the slow and the fast versions use the same instance structure. + Use function \ref arm_fir_init_q15() to initialize the filter structure. + */ + +void arm_fir_fast_q15( + const arm_fir_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + q15_t *px; /* Temporary pointer for state buffer */ + const q15_t *pb; /* Temporary pointer for coefficient buffer */ + q31_t acc0; /* Accumulators */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc1, acc2, acc3; /* Accumulators */ + q31_t x0, x1, x2, c0; /* Temporary variables to hold state and coefficient values */ +#endif + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 output values simultaneously. + * The variables acc0 ... acc3 hold output values that are being computed: + * + * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] + * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] + * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] + * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] + */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Copy 4 new input samples into the state buffer. */ + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Typecast q15_t pointer to q31_t pointer for state reading in q31_t */ + px = pState; + + /* Typecast q15_t pointer to q31_t pointer for coefficient reading in q31_t */ + pb = pCoeffs; + + /* Read the first two samples from the state buffer: x[n-N], x[n-N-1] */ + x0 = read_q15x2_ia (&px); + + /* Read the third and forth samples from the state buffer: x[n-N-2], x[n-N-3] */ + x2 = read_q15x2_ia (&px); + + /* Loop over the number of taps. Unroll by a factor of 4. + Repeat until we've computed numTaps-(numTaps%4) coefficients. */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the first two coefficients using SIMD: b[N] and b[N-1] coefficients */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* acc0 += b[N] * x[n-N] + b[N-1] * x[n-N-1] */ + acc0 = __SMLAD(x0, c0, acc0); + + /* acc2 += b[N] * x[n-N-2] + b[N-1] * x[n-N-3] */ + acc2 = __SMLAD(x2, c0, acc2); + + /* pack x[n-N-1] and x[n-N-2] */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x2, x0, 0); +#else + x1 = __PKHBT(x0, x2, 0); +#endif + + /* Read state x[n-N-4], x[n-N-5] */ + x0 = read_q15x2_ia (&px); + + /* acc1 += b[N] * x[n-N-1] + b[N-1] * x[n-N-2] */ + acc1 = __SMLADX(x1, c0, acc1); + + /* pack x[n-N-3] and x[n-N-4] */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x0, x2, 0); +#else + x1 = __PKHBT(x2, x0, 0); +#endif + + /* acc3 += b[N] * x[n-N-3] + b[N-1] * x[n-N-4] */ + acc3 = __SMLADX(x1, c0, acc3); + + /* Read coefficients b[N-2], b[N-3] */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* acc0 += b[N-2] * x[n-N-2] + b[N-3] * x[n-N-3] */ + acc0 = __SMLAD(x2, c0, acc0); + + /* Read state x[n-N-6], x[n-N-7] with offset */ + x2 = read_q15x2_ia (&px); + + /* acc2 += b[N-2] * x[n-N-4] + b[N-3] * x[n-N-5] */ + acc2 = __SMLAD(x0, c0, acc2); + + /* acc1 += b[N-2] * x[n-N-3] + b[N-3] * x[n-N-4] */ + acc1 = __SMLADX(x1, c0, acc1); + + /* pack x[n-N-5] and x[n-N-6] */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x2, x0, 0); +#else + x1 = __PKHBT(x0, x2, 0); +#endif + + /* acc3 += b[N-2] * x[n-N-5] + b[N-3] * x[n-N-6] */ + acc3 = __SMLADX(x1, c0, acc3); + + /* Decrement tap count */ + tapCnt--; + } + + /* If the filter length is not a multiple of 4, compute the remaining filter taps. + This is always be 2 taps since the filter length is even. */ + if ((numTaps & 0x3U) != 0U) + { + /* Read last two coefficients */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* Perform the multiply-accumulates */ + acc0 = __SMLAD(x0, c0, acc0); + acc2 = __SMLAD(x2, c0, acc2); + + /* pack state variables */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x2, x0, 0); +#else + x1 = __PKHBT(x0, x2, 0); +#endif + + /* Read last state variables */ + x0 = read_q15x2 (px); + + /* Perform the multiply-accumulates */ + acc1 = __SMLADX(x1, c0, acc1); + + /* pack state variables */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x0, x2, 0); +#else + x1 = __PKHBT(x2, x0, 0); +#endif + + /* Perform the multiply-accumulates */ + acc3 = __SMLADX(x1, c0, acc3); + } + + /* The results in the 4 accumulators are in 2.30 format. Convert to 1.15 with saturation. + Then store the 4 outputs in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pDst, __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16)); + write_q15x2_ia (&pDst, __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16)); +#else + write_q15x2_ia (&pDst, __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16)); + write_q15x2_ia (&pDst, __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Advance the state pointer by 4 to process the next group of 4 samples */ + pState = pState + 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining output samples */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of taps */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy two samples into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc0 = 0; + + /* Use SIMD to hold states and coefficients */ + px = pState; + pb = pCoeffs; + + tapCnt = numTaps >> 1U; + + do + { + acc0 += (q31_t) *px++ * *pb++; + acc0 += (q31_t) *px++ * *pb++; + + tapCnt--; + } + while (tapCnt > 0U); + + /* The result is in 2.30 format. Convert to 1.15 with saturation. + Then store the output in the destination buffer. */ + *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = (numTaps - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Calculate remaining number of copies */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy remaining data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of FIR group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q31.c new file mode 100644 index 0000000..513cb72 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_fast_q31.c @@ -0,0 +1,324 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_fast_q31.c + * Description: Processing function for the Q31 Fast FIR filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR + @{ + */ + +/** + @brief Processing function for the Q31 FIR filter (fast version). + @param[in] S points to an instance of the Q31 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 + @return none + + @par Scaling and Overflow Behavior + This function is optimized for speed at the expense of fixed-point precision and overflow protection. + The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. + These intermediate results are added to a 2.30 accumulator. + Finally, the accumulator is saturated and converted to a 1.31 result. + The fast version has the same overflow behavior as the standard version and provides less precision since it discards the low 32 bits of each multiplication result. + In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits. + + @remark + Refer to \ref arm_fir_q31() for a slower implementation of this function which uses a 64-bit accumulator to provide higher precision. Both the slow and the fast versions use the same instance structure. + Use function \ref arm_fir_init_q31() to initialize the filter structure. + */ + +IAR_ONLY_LOW_OPTIMIZATION_ENTER +void arm_fir_fast_q31( + const arm_fir_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t *px; /* Temporary pointer for state buffer */ + const q31_t *pb; /* Temporary pointer for coefficient buffer */ + q31_t acc0; /* Accumulators */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, tapCnt, blkCnt; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc1, acc2, acc3; /* Accumulators */ + q31_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ +#endif + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 output values simultaneously. + * The variables acc0 ... acc3 hold output values that are being computed: + * + * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] + * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] + * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] + * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] + */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Copy 4 new input samples into the state buffer. */ + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Read the first 3 samples from the state buffer: + * x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2] */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Loop unrolling. Process 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + /* Loop over the number of taps. Unroll by a factor of 4. + Repeat until we've computed numTaps-4 coefficients. */ + while (tapCnt > 0U) + { + /* Read the b[numTaps] coefficient */ + c0 = *pb; + + /* Read x[n-numTaps-3] sample */ + x3 = *px; + + /* acc0 += b[numTaps] * x[n-numTaps] */ + multAcc_32x32_keep32_R(acc0, x0, c0); + + /* acc1 += b[numTaps] * x[n-numTaps-1] */ + multAcc_32x32_keep32_R(acc1, x1, c0); + + /* acc2 += b[numTaps] * x[n-numTaps-2] */ + multAcc_32x32_keep32_R(acc2, x2, c0); + + /* acc3 += b[numTaps] * x[n-numTaps-3] */ + multAcc_32x32_keep32_R(acc3, x3, c0); + + /* Read the b[numTaps-1] coefficient */ + c0 = *(pb + 1U); + + /* Read x[n-numTaps-4] sample */ + x0 = *(px + 1U); + + /* Perform the multiply-accumulates */ + multAcc_32x32_keep32_R(acc0, x1, c0); + multAcc_32x32_keep32_R(acc1, x2, c0); + multAcc_32x32_keep32_R(acc2, x3, c0); + multAcc_32x32_keep32_R(acc3, x0, c0); + + /* Read the b[numTaps-2] coefficient */ + c0 = *(pb + 2U); + + /* Read x[n-numTaps-5] sample */ + x1 = *(px + 2U); + + /* Perform the multiply-accumulates */ + multAcc_32x32_keep32_R(acc0, x2, c0); + multAcc_32x32_keep32_R(acc1, x3, c0); + multAcc_32x32_keep32_R(acc2, x0, c0); + multAcc_32x32_keep32_R(acc3, x1, c0); + + /* Read the b[numTaps-3] coefficients */ + c0 = *(pb + 3U); + + /* Read x[n-numTaps-6] sample */ + x2 = *(px + 3U); + + /* Perform the multiply-accumulates */ + multAcc_32x32_keep32_R(acc0, x3, c0); + multAcc_32x32_keep32_R(acc1, x0, c0); + multAcc_32x32_keep32_R(acc2, x1, c0); + multAcc_32x32_keep32_R(acc3, x2, c0); + + /* update coefficient pointer */ + pb += 4U; + px += 4U; + + /* Decrement loop counter */ + tapCnt--; + } + + /* If the filter length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *(pb++); + + /* Fetch 1 state variable */ + x3 = *(px++); + + /* Perform the multiply-accumulates */ + multAcc_32x32_keep32_R(acc0, x0, c0); + multAcc_32x32_keep32_R(acc1, x1, c0); + multAcc_32x32_keep32_R(acc2, x2, c0); + multAcc_32x32_keep32_R(acc3, x3, c0); + + /* Reuse the present sample states for next sample */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement loop counter */ + tapCnt--; + } + + /* The results in the 4 accumulators are in 2.30 format. Convert to 1.31 + Then store the 4 outputs in the destination buffer. */ + *pDst++ = (q31_t) (acc0 << 1); + *pDst++ = (q31_t) (acc1 << 1); + *pDst++ = (q31_t) (acc2 << 1); + *pDst++ = (q31_t) (acc3 << 1); + + /* Advance the state pointer by 4 to process the next group of 4 samples */ + pState = pState + 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining output samples */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of taps */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc0 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize Coefficient pointer */ + pb = pCoeffs; + + i = numTaps; + + /* Perform the multiply-accumulates */ + do + { + multAcc_32x32_keep32_R(acc0, (*px++), (*pb++)); + i--; + } while (i > 0U); + + /* The result is in 2.30 format. Convert to 1.31 + Then store the output in the destination buffer. */ + *pDst++ = (q31_t) (acc0 << 1); + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = (numTaps - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Calculate remaining number of copies */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy remaining data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } + +} +IAR_ONLY_LOW_OPTIMIZATION_EXIT +/** + @} end of FIR group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_f32.c new file mode 100644 index 0000000..02e82ad --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_f32.c @@ -0,0 +1,81 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_init_f32.c + * Description: Floating-point FIR filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR + @{ + */ + +/** + @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 buffer + @param[in] pState points to the state buffer + @param[in] blockSize number of samples processed per call + @return none + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to the array of state variables. + pState is of length numTaps+blockSize-1 samples, where blockSize is the number of input samples processed by each call to arm_fir_f32(). + */ + +void arm_fir_init_f32( + arm_fir_instance_f32 * S, + uint16_t numTaps, + const float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer. The size is always (blockSize + numTaps - 1) */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q15.c new file mode 100644 index 0000000..a5b2d06 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q15.c @@ -0,0 +1,137 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_init_q15.c + * Description: Q15 FIR filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR + @{ + */ + +/** + @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 buffer. + @param[in] pState points to the state buffer. + @param[in] blockSize number of samples processed per call. + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : numTaps is not greater than or equal to 4 and even + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ Note that numTaps must be even and greater than or equal to 4. + To implement an odd length filter simply increase numTaps by 1 and set the last coefficient to zero. + For example, to implement a filter with numTaps=3 and coefficients +
+      {0.3, -0.8, 0.3}
+  
+ set numTaps=4 and use the coefficients: +
+      {0.3, -0.8, 0.3, 0}.
+  
+ Similarly, to implement a two point filter +
+      {0.3, -0.3}
+  
+ set numTaps=4 and use the coefficients: +
+      {0.3, -0.3, 0, 0}.
+  
+ pState points to the array of state variables. + pState is of length numTaps+blockSize, when running on Cortex-M4 and Cortex-M3 and is of length numTaps+blockSize-1, when running on Cortex-M0 where blockSize is the number of input samples processed by each call to arm_fir_q15(). + */ + +arm_status arm_fir_init_q15( + arm_fir_instance_q15 * S, + uint16_t numTaps, + const q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize) +{ + arm_status status; + +#if defined (ARM_MATH_DSP) + + /* The Number of filter coefficients in the filter must be even and at least 4 */ + if (numTaps & 0x1U) + { + status = ARM_MATH_ARGUMENT_ERROR; + } + else + { + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear the state buffer. The size is always (blockSize + numTaps ) */ + memset(pState, 0, (numTaps + (blockSize)) * sizeof(q15_t)); + + /* Assign state pointer */ + S->pState = pState; + + status = ARM_MATH_SUCCESS; + } + + return (status); + +#else + + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer. The size is always (blockSize + numTaps - 1) */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q15_t)); + + /* Assign state pointer */ + S->pState = pState; + + status = ARM_MATH_SUCCESS; + + return (status); + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + +/** + @} end of FIR group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q31.c new file mode 100644 index 0000000..7d8376f --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q31.c @@ -0,0 +1,80 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_init_q31.c + * Description: Q31 FIR filter initialization function. + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR + @{ + */ + +/** + @brief Initialization function for the Q31 FIR filter. + @param[in,out] S points to an instance of the Q31 FIR filter structure + @param[in] numTaps number of filter coefficients in the filter + @param[in] pCoeffs points to the filter coefficients buffer + @param[in] pState points to the state buffer + @param[in] blockSize number of samples processed + @return none + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ pState points to the array of state variables. + pState is of length numTaps+blockSize-1 samples, where blockSize is the number of input samples processed by each call to arm_fir_q31(). + */ + +void arm_fir_init_q31( + arm_fir_instance_q31 * S, + uint16_t numTaps, + const q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer. The size is always (blockSize + numTaps - 1) */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q31_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q7.c new file mode 100644 index 0000000..f96d250 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_init_q7.c @@ -0,0 +1,81 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_init_q7.c + * Description: Q7 FIR filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR + @{ + */ + +/** + @brief Initialization function for the Q7 FIR filter. + @param[in,out] S points to an instance of the Q7 FIR filter structure + @param[in] numTaps number of filter coefficients in the filter + @param[in] pCoeffs points to the filter coefficients buffer + @param[in] pState points to the state buffer + @param[in] blockSize number of samples processed + @return none + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to the array of state variables. + pState is of length numTaps+blockSize-1 samples, where blockSize is the number of input samples processed by each call to arm_fir_q7(). + */ + +void arm_fir_init_q7( + arm_fir_instance_q7 * S, + uint16_t numTaps, + const q7_t * pCoeffs, + q7_t * pState, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer. The size is always (blockSize + numTaps - 1) */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q7_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_f32.c new file mode 100644 index 0000000..ee0ed27 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_f32.c @@ -0,0 +1,914 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_interpolate_f32.c + * Description: Floating-point FIR interpolation sequences + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @defgroup FIR_Interpolate Finite Impulse Response (FIR) Interpolator + + These functions combine an upsampler (zero stuffer) and an FIR filter. + They are used in multirate systems for increasing the sample rate of a signal without introducing high frequency images. + Conceptually, the functions are equivalent to the block diagram below: + \image html FIRInterpolator.gif "Components included in the FIR Interpolator functions" + After upsampling by a factor of L, the signal should be filtered by a lowpass filter with a normalized + cutoff frequency of 1/L in order to eliminate high frequency copies of the spectrum. + The user of the function is responsible for providing the filter coefficients. + + The FIR interpolator functions provided in the CMSIS DSP Library combine the upsampler and FIR filter in an efficient manner. + The upsampler inserts L-1 zeros between each sample. + Instead of multiplying by these zero values, the FIR filter is designed to skip them. + This leads to an efficient implementation without any wasted effort. + The functions operate on blocks of input and output data. + pSrc points to an array of blockSize input values and + pDst points to an array of blockSize*L output values. + + The library provides separate functions for Q15, Q31, and floating-point data types. + + @par Algorithm + The functions use a polyphase filter structure: +
+      y[n] = b[0] * x[n] + b[L]   * x[n-1] + ... + b[L*(phaseLength-1)] * x[n-phaseLength+1]
+      y[n+1] = b[1] * x[n] + b[L+1] * x[n-1] + ... + b[L*(phaseLength-1)+1] * x[n-phaseLength+1]
+      ...
+      y[n+(L-1)] = b[L-1] * x[n] + b[2*L-1] * x[n-1] + ....+ b[L*(phaseLength-1)+(L-1)] * x[n-phaseLength+1]
+  
+ This approach is more efficient than straightforward upsample-then-filter algorithms. + With this method the computation is reduced by a factor of 1/L when compared to using a standard FIR filter. + @par + pCoeffs points to a coefficient array of size numTaps. + numTaps must be a multiple of the interpolation factor L and this is checked by the + initialization functions. + Internally, the function divides the FIR filter's impulse response into shorter filters of length + phaseLength=numTaps/L. + Coefficients are stored in time reversed order. +
+      {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to a state array of size blockSize + phaseLength - 1. + Samples in the state buffer are stored in the order: +
+     {x[n-phaseLength+1], x[n-phaseLength], x[n-phaseLength-1], x[n-phaseLength-2]....x[0], x[1], ..., x[blockSize-1]}
+  
+ @par + The state variables are updated after each block of data is processed, the coefficients are untouched. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter. + Coefficient arrays may be shared among several instances while state variable array should be allocated separately. + There are separate instance structure declarations for each of the 3 supported data types. + + @par Initialization Functions + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + - Checks to make sure that the length of the filter is a multiple of the interpolation factor. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + L (interpolation factor), pCoeffs, phaseLength (numTaps / L), pState. Also set all of the values in pState to zero. + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + The code below statically initializes each of the 3 different data type filter instance structures +
+      arm_fir_interpolate_instance_f32 S = {L, phaseLength, pCoeffs, pState};
+      arm_fir_interpolate_instance_q31 S = {L, phaseLength, pCoeffs, pState};
+      arm_fir_interpolate_instance_q15 S = {L, phaseLength, pCoeffs, pState};
+  
+ @par + where L is the interpolation factor; phaseLength=numTaps/L is the + length of each of the shorter FIR filters used internally, + pCoeffs is the address of the coefficient buffer; + pState is the address of the state buffer. + Be sure to set the values in the state buffer to zeros when doing static initialization. + + @par Fixed-Point Behavior + Care must be taken when using the fixed-point versions of the FIR interpolate filter 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 FIR_Interpolate + @{ + */ + +/** + @brief Processing function for 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 samples to process + @return none + */ +#if defined(ARM_MATH_NEON) +void arm_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t *ptr1; /* Temporary pointers for state buffer */ + const float32_t *ptr2; /* Temporary pointers for coefficient buffer */ + float32_t sum0; /* Accumulators */ + float32_t x0, c0; /* Temporary variables to hold state and coefficient values */ + uint32_t i, blkCnt, j; /* Loop counters */ + uint16_t phaseLen = S->phaseLength, tapCnt; /* Length of each polyphase filter component */ + float32_t acc0, acc1, acc2, acc3; + float32_t x1, x2, x3; + uint32_t blkCntN4; + float32_t c1, c2, c3; + + float32x4_t sum0v; + float32x4_t accV,accV0,accV1; + float32x4_t x0v,x1v,x2v,xa,xb; + uint32x4_t x0v_u,x1v_u,x2v_u,xa_u,xb_u; + float32x2_t tempV; + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = S->pState + (phaseLen - 1U); + + /* Initialise blkCnt */ + blkCnt = blockSize >> 3; + blkCntN4 = blockSize & 7; + + /* Loop unrolling */ + while (blkCnt > 0U) + { + /* Copy new input samples into the state buffer */ + sum0v = vld1q_f32(pSrc); + vst1q_f32(pStateCurnt,sum0v); + pSrc += 4; + pStateCurnt += 4; + + sum0v = vld1q_f32(pSrc); + vst1q_f32(pStateCurnt,sum0v); + pSrc += 4; + pStateCurnt += 4; + + /* Address modifier index of coefficient buffer */ + j = 1U; + + /* Loop over the Interpolation factor. */ + i = (S->L); + + while (i > 0U) + { + /* Set accumulator to zero */ + accV0 = vdupq_n_f32(0.0); + accV1 = vdupq_n_f32(0.0); + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (S->L - j); + + /* Loop over the polyPhase length. Unroll by a factor of 4. + ** Repeat until we've computed numTaps-(4*S->L) coefficients. */ + tapCnt = phaseLen >> 2U; + + x0v = vld1q_f32(ptr1); + x1v = vld1q_f32(ptr1 + 4); + + while (tapCnt > 0U) + { + /* Read the input samples */ + x2v = vld1q_f32(ptr1 + 8); + + /* Read the coefficients */ + c0 = *(ptr2); + + /* Perform the multiply-accumulate */ + accV0 = vmlaq_n_f32(accV0,x0v,c0); + accV1 = vmlaq_n_f32(accV1,x1v,c0); + + /* Read the coefficients, inputs and perform multiply-accumulate */ + c1 = *(ptr2 + S->L); + + xa = vextq_f32(x0v,x1v,1); + xb = vextq_f32(x1v,x2v,1); + + accV0 = vmlaq_n_f32(accV0,xa,c1); + accV1 = vmlaq_n_f32(accV1,xb,c1); + + /* Read the coefficients, inputs and perform multiply-accumulate */ + c2 = *(ptr2 + S->L * 2); + + xa = vextq_f32(x0v,x1v,2); + xb = vextq_f32(x1v,x2v,2); + + accV0 = vmlaq_n_f32(accV0,xa,c2); + accV1 = vmlaq_n_f32(accV1,xb,c2); + + /* Read the coefficients, inputs and perform multiply-accumulate */ + c3 = *(ptr2 + S->L * 3); + + xa = vextq_f32(x0v,x1v,3); + xb = vextq_f32(x1v,x2v,3); + + accV0 = vmlaq_n_f32(accV0,xa,c3); + accV1 = vmlaq_n_f32(accV1,xb,c3); + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += 4 * S->L; + ptr1 += 4; + x0v = x1v; + x1v = x2v; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = phaseLen % 0x4U; + + x2v = vld1q_f32(ptr1 + 8); + + switch (tapCnt) + { + case 3: + c0 = *(ptr2); + accV0 = vmlaq_n_f32(accV0,x0v,c0); + accV1 = vmlaq_n_f32(accV1,x1v,c0); + ptr2 += S->L; + + c0 = *(ptr2); + + xa = vextq_f32(x0v,x1v,1); + xb = vextq_f32(x1v,x2v,1); + + accV0 = vmlaq_n_f32(accV0,xa,c0); + accV1 = vmlaq_n_f32(accV1,xb,c0); + ptr2 += S->L; + + c0 = *(ptr2); + + xa = vextq_f32(x0v,x1v,2); + xb = vextq_f32(x1v,x2v,2); + + accV0 = vmlaq_n_f32(accV0,xa,c0); + accV1 = vmlaq_n_f32(accV1,xb,c0); + ptr2 += S->L; + + break; + + case 2: + c0 = *(ptr2); + accV0 = vmlaq_n_f32(accV0,x0v,c0); + accV1 = vmlaq_n_f32(accV1,x1v,c0); + ptr2 += S->L; + + c0 = *(ptr2); + + xa = vextq_f32(x0v,x1v,1); + xb = vextq_f32(x1v,x2v,1); + + accV0 = vmlaq_n_f32(accV0,xa,c0); + accV1 = vmlaq_n_f32(accV1,xb,c0); + ptr2 += S->L; + + break; + + case 1: + c0 = *(ptr2); + accV0 = vmlaq_n_f32(accV0,x0v,c0); + accV1 = vmlaq_n_f32(accV1,x1v,c0); + ptr2 += S->L; + + break; + + default: + break; + + } + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst = accV0[0]; + *(pDst + S->L) = accV0[1]; + *(pDst + 2 * S->L) = accV0[2]; + *(pDst + 3 * S->L) = accV0[3]; + + *(pDst + 4 * S->L) = accV1[0]; + *(pDst + 5 * S->L) = accV1[1]; + *(pDst + 6 * S->L) = accV1[2]; + *(pDst + 7 * S->L) = accV1[3]; + + pDst++; + + /* Increment the address modifier index of coefficient buffer */ + j++; + + /* Decrement the loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 8; + + pDst += S->L * 7; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + + while (blkCntN4 > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Address modifier index of coefficient buffer */ + j = 1U; + + /* Loop over the Interpolation factor. */ + i = S->L; + + while (i > 0U) + { + /* Set accumulator to zero */ + sum0v = vdupq_n_f32(0.0); + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (S->L - j); + + /* Loop over the polyPhase length. Unroll by a factor of 4. + ** Repeat until we've computed numTaps-(4*S->L) coefficients. */ + tapCnt = phaseLen >> 2U; + + while (tapCnt > 0U) + { + /* Read the coefficient */ + x1v[0] = *(ptr2); + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Read the input sample */ + x0v = vld1q_f32(ptr1); + ptr1 += 4; + + /* Read the coefficient */ + x1v[1] = *(ptr2); + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Read the coefficient */ + x1v[2] = *(ptr2); + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Read the coefficient */ + x1v[3] = *(ptr2); + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + sum0v = vmlaq_f32(sum0v,x0v,x1v); + + /* Decrement the loop counter */ + tapCnt--; + } + + tempV = vpadd_f32(vget_low_f32(sum0v),vget_high_f32(sum0v)); + sum0 = tempV[0] + tempV[1]; + + /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = phaseLen % 0x4U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += *(ptr1++) * (*ptr2); + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = sum0; + + /* Increment the address modifier index of coefficient buffer */ + j++; + + /* Decrement the loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement the loop counter */ + blkCntN4--; + } + + /* Processing is complete. + ** Now copy the last phaseLen - 1 samples to the satrt of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + + tapCnt = (phaseLen - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + sum0v = vld1q_f32(pState); + vst1q_f32(pStateCurnt,sum0v); + pState += 4; + pStateCurnt += 4; + + /* Decrement the loop counter */ + tapCnt--; + } + + tapCnt = (phaseLen - 1U) % 0x04U; + + /* copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } + +} +#else + +void arm_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCur; /* Points to the current sample of the state */ + float32_t *ptr1; /* Temporary pointer for state buffer */ + const float32_t *ptr2; /* Temporary pointer for coefficient buffer */ + float32_t sum0; /* Accumulators */ + uint32_t i, blkCnt, tapCnt; /* Loop counters */ + uint32_t phaseLen = S->phaseLength; /* Length of each polyphase filter component */ + uint32_t j; + +#if defined (ARM_MATH_LOOPUNROLL) + float32_t acc0, acc1, acc2, acc3; + float32_t x0, x1, x2, x3; + float32_t c0, c1, c2, c3; +#endif + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (phaseLen - 1U); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCur++ = *pSrc++; + *pStateCur++ = *pSrc++; + *pStateCur++ = *pSrc++; + *pStateCur++ = *pSrc++; + + /* Address modifier index of coefficient buffer */ + j = 1U; + + /* Loop over the Interpolation factor. */ + i = (S->L); + + while (i > 0U) + { + /* Set accumulator to zero */ + acc0 = 0.0f; + acc1 = 0.0f; + acc2 = 0.0f; + acc3 = 0.0f; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (S->L - j); + + /* Loop over the polyPhase length. Unroll by a factor of 4. + Repeat until we've computed numTaps-(4*S->L) coefficients. */ + tapCnt = phaseLen >> 2U; + + x0 = *(ptr1++); + x1 = *(ptr1++); + x2 = *(ptr1++); + + while (tapCnt > 0U) + { + /* Read the input sample */ + x3 = *(ptr1++); + + /* Read the coefficient */ + c0 = *(ptr2); + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + acc2 += x2 * c0; + acc3 += x3 * c0; + + /* Read the coefficient */ + c1 = *(ptr2 + S->L); + + /* Read the input sample */ + x0 = *(ptr1++); + + /* Perform the multiply-accumulate */ + acc0 += x1 * c1; + acc1 += x2 * c1; + acc2 += x3 * c1; + acc3 += x0 * c1; + + /* Read the coefficient */ + c2 = *(ptr2 + S->L * 2); + + /* Read the input sample */ + x1 = *(ptr1++); + + /* Perform the multiply-accumulate */ + acc0 += x2 * c2; + acc1 += x3 * c2; + acc2 += x0 * c2; + acc3 += x1 * c2; + + /* Read the coefficient */ + c3 = *(ptr2 + S->L * 3); + + /* Read the input sample */ + x2 = *(ptr1++); + + /* Perform the multiply-accumulate */ + acc0 += x3 * c3; + acc1 += x0 * c3; + acc2 += x1 * c3; + acc3 += x2 * c3; + + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += 4 * S->L; + + /* Decrement loop counter */ + tapCnt--; + } + + /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = phaseLen % 0x4U; + + while (tapCnt > 0U) + { + /* Read the input sample */ + x3 = *(ptr1++); + + /* Read the coefficient */ + c0 = *(ptr2); + + /* Perform the multiply-accumulate */ + acc0 += x0 * c0; + acc1 += x1 * c0; + acc2 += x2 * c0; + acc3 += x3 * c0; + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* update states for next sample processing */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *(pDst ) = acc0; + *(pDst + S->L) = acc1; + *(pDst + 2 * S->L) = acc2; + *(pDst + 3 * S->L) = acc3; + + pDst++; + + /* Increment the address modifier index of coefficient buffer */ + j++; + + /* Decrement loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 4; + + pDst += S->L * 3; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCur++ = *pSrc++; + + /* Address modifier index of coefficient buffer */ + j = 1U; + + /* Loop over the Interpolation factor. */ + i = S->L; + + while (i > 0U) + { + /* Set accumulator to zero */ + sum0 = 0.0f; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (S->L - j); + + /* Loop over the polyPhase length. + Repeat until we've computed numTaps-(4*S->L) coefficients. */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + tapCnt = phaseLen >> 2U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += *ptr1++ * *ptr2; + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + sum0 += *ptr1++ * *ptr2; + ptr2 += S->L; + + sum0 += *ptr1++ * *ptr2; + ptr2 += S->L; + + sum0 += *ptr1++ * *ptr2; + ptr2 += S->L; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + tapCnt = phaseLen % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = phaseLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += *ptr1++ * *ptr2; + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Decrement loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = sum0; + + /* Increment the address modifier index of coefficient buffer */ + j++; + + /* Decrement the loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last phaseLen - 1 samples to the satrt of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + tapCnt = (phaseLen - 1U) >> 2U; + + /* copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + tapCnt = (phaseLen - 1U) % 0x04U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = (phaseLen - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#else +/* alternate version for CM0_FAMILY */ + + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCur; /* Points to the current sample of the state */ + float32_t *ptr1; /* Temporary pointer for state buffer */ + const float32_t *ptr2; /* Temporary pointer for coefficient buffer */ + float32_t sum0; /* Accumulators */ + uint32_t i, blkCnt, tapCnt; /* Loop counters */ + uint32_t phaseLen = S->phaseLength; /* Length of each polyphase filter component */ + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (phaseLen - 1U); + + /* Total number of intput samples */ + blkCnt = blockSize; + + /* Loop over the blockSize. */ + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCur++ = *pSrc++; + + /* Loop over the Interpolation factor. */ + i = S->L; + + while (i > 0U) + { + /* Set accumulator to zero */ + sum0 = 0.0f; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (i - 1U); + + /* Loop over the polyPhase length */ + tapCnt = phaseLen; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += *ptr1++ * *ptr2; + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = sum0; + + /* Decrement loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last phaseLen - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + + tapCnt = phaseLen - 1U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of FIR_Interpolate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c new file mode 100644 index 0000000..287d347 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c @@ -0,0 +1,106 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_interpolate_init_f32.c + * Description: Floating-point FIR interpolator initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Interpolate + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : filter length numTaps is not a multiple of the interpolation factor L + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[numTaps-2], ..., b[1], b[0]}
+  
+ @par + The length of the filter numTaps must be a multiple of the interpolation factor L. + @par + pState points to the array of state variables. + pState is of length (numTaps/L)+blockSize-1 words + where blockSize is the number of input samples processed by each call to arm_fir_interpolate_f32(). + */ + +arm_status arm_fir_interpolate_init_f32( + arm_fir_interpolate_instance_f32 * S, + uint8_t L, + uint16_t numTaps, + const float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize) +{ + arm_status status; + + /* The filter length must be a multiple of the interpolation factor */ + if ((numTaps % L) != 0U) + { + /* Set status as ARM_MATH_LENGTH_ERROR */ + status = ARM_MATH_LENGTH_ERROR; + } + else + { + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Assign Interpolation factor */ + S->L = L; + + /* Assign polyPhaseLength */ + S->phaseLength = numTaps / L; + + /* Clear state buffer and size of buffer is always phaseLength + blockSize - 1 */ + memset(pState, 0, (blockSize + ((uint32_t) S->phaseLength - 1U)) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; + + status = ARM_MATH_SUCCESS; + } + + return (status); +} + +/** + @} end of FIR_Interpolate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c new file mode 100644 index 0000000..7f43bbf --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c @@ -0,0 +1,106 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_interpolate_init_q15.c + * Description: Q15 FIR interpolator initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Interpolate + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : filter length numTaps is not a multiple of the interpolation factor L + + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[numTaps-2], ..., b[1], b[0]}
+  
+ The length of the filter numTaps must be a multiple of the interpolation factor L. + @par + pState points to the array of state variables. + pState is of length (numTaps/L)+blockSize-1 words + where blockSize is the number of input samples processed by each call to arm_fir_interpolate_q15(). + */ + +arm_status arm_fir_interpolate_init_q15( + arm_fir_interpolate_instance_q15 * S, + uint8_t L, + uint16_t numTaps, + const q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize) +{ + arm_status status; + + /* The filter length must be a multiple of the interpolation factor */ + if ((numTaps % L) != 0U) + { + /* Set status as ARM_MATH_LENGTH_ERROR */ + status = ARM_MATH_LENGTH_ERROR; + } + else + { + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Assign Interpolation factor */ + S->L = L; + + /* Assign polyPhaseLength */ + S->phaseLength = numTaps / L; + + /* Clear state buffer and size of buffer is always phaseLength + blockSize - 1 */ + memset(pState, 0, (blockSize + ((uint32_t) S->phaseLength - 1U)) * sizeof(q15_t)); + + /* Assign state pointer */ + S->pState = pState; + + status = ARM_MATH_SUCCESS; + } + + return (status); +} + +/** + @} end of FIR_Interpolate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c new file mode 100644 index 0000000..973e715 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c @@ -0,0 +1,105 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_interpolate_init_q31.c + * Description: Q31 FIR interpolator initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Interpolate + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : filter length numTaps is not a multiple of the interpolation factor L + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+      {b[numTaps-1], b[numTaps-2], b[numTaps-2], ..., b[1], b[0]}
+  
+ The length of the filter numTaps must be a multiple of the interpolation factor L. + @par + pState points to the array of state variables. + pState is of length (numTaps/L)+blockSize-1 words + where blockSize is the number of input samples processed by each call to arm_fir_interpolate_q31(). + */ + +arm_status arm_fir_interpolate_init_q31( + arm_fir_interpolate_instance_q31 * S, + uint8_t L, + uint16_t numTaps, + const q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize) +{ + arm_status status; + + /* The filter length must be a multiple of the interpolation factor */ + if ((numTaps % L) != 0U) + { + /* Set status as ARM_MATH_LENGTH_ERROR */ + status = ARM_MATH_LENGTH_ERROR; + } + else + { + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Assign Interpolation factor */ + S->L = L; + + /* Assign polyPhaseLength */ + S->phaseLength = numTaps / L; + + /* Clear state buffer and size of buffer is always phaseLength + blockSize - 1 */ + memset(pState, 0, (blockSize + ((uint32_t) S->phaseLength - 1U)) * sizeof(q31_t)); + + /* Assign state pointer */ + S->pState = pState; + + status = ARM_MATH_SUCCESS; + } + + return (status); +} + +/** + @} end of FIR_Interpolate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q15.c new file mode 100644 index 0000000..7efec94 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q15.c @@ -0,0 +1,479 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_interpolate_q15.c + * Description: Q15 FIR interpolation + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Interpolate + @{ + */ + +/** + @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 samples to process + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both coefficients 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. + */ + +void arm_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCur; /* Points to the current sample of the state */ + q15_t *ptr1; /* Temporary pointer for state buffer */ + const q15_t *ptr2; /* Temporary pointer for coefficient buffer */ + q63_t sum0; /* Accumulators */ + uint32_t i, blkCnt, tapCnt; /* Loop counters */ + uint32_t phaseLen = S->phaseLength; /* Length of each polyphase filter component */ + uint32_t j; + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc0, acc1, acc2, acc3; + q15_t x0, x1, x2, x3; + q15_t c0, c1, c2, c3; +#endif + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (phaseLen - 1U); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCur++ = *pSrc++; + *pStateCur++ = *pSrc++; + *pStateCur++ = *pSrc++; + *pStateCur++ = *pSrc++; + + /* Address modifier index of coefficient buffer */ + j = 1U; + + /* Loop over the Interpolation factor. */ + i = (S->L); + + while (i > 0U) + { + /* Set accumulator to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (S->L - j); + + /* Loop over the polyPhase length. Unroll by a factor of 4. + Repeat until we've computed numTaps-(4*S->L) coefficients. */ + tapCnt = phaseLen >> 2U; + + x0 = *(ptr1++); + x1 = *(ptr1++); + x2 = *(ptr1++); + + while (tapCnt > 0U) + { + /* Read the input sample */ + x3 = *(ptr1++); + + /* Read the coefficient */ + c0 = *(ptr2); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + acc1 += (q63_t) x1 * c0; + acc2 += (q63_t) x2 * c0; + acc3 += (q63_t) x3 * c0; + + /* Read the coefficient */ + c1 = *(ptr2 + S->L); + + /* Read the input sample */ + x0 = *(ptr1++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x1 * c1; + acc1 += (q63_t) x2 * c1; + acc2 += (q63_t) x3 * c1; + acc3 += (q63_t) x0 * c1; + + /* Read the coefficient */ + c2 = *(ptr2 + S->L * 2); + + /* Read the input sample */ + x1 = *(ptr1++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x2 * c2; + acc1 += (q63_t) x3 * c2; + acc2 += (q63_t) x0 * c2; + acc3 += (q63_t) x1 * c2; + + /* Read the coefficient */ + c3 = *(ptr2 + S->L * 3); + + /* Read the input sample */ + x2 = *(ptr1++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x3 * c3; + acc1 += (q63_t) x0 * c3; + acc2 += (q63_t) x1 * c3; + acc3 += (q63_t) x2 * c3; + + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += 4 * S->L; + + /* Decrement loop counter */ + tapCnt--; + } + + /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = phaseLen % 0x4U; + + while (tapCnt > 0U) + { + /* Read the input sample */ + x3 = *(ptr1++); + + /* Read the coefficient */ + c0 = *(ptr2); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + acc1 += (q63_t) x1 * c0; + acc2 += (q63_t) x2 * c0; + acc3 += (q63_t) x3 * c0; + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* update states for next sample processing */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *(pDst ) = (q15_t) (__SSAT((acc0 >> 15), 16)); + *(pDst + S->L) = (q15_t) (__SSAT((acc1 >> 15), 16)); + *(pDst + 2 * S->L) = (q15_t) (__SSAT((acc2 >> 15), 16)); + *(pDst + 3 * S->L) = (q15_t) (__SSAT((acc3 >> 15), 16)); + + pDst++; + + /* Increment the address modifier index of coefficient buffer */ + j++; + + /* Decrement loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 4; + + pDst += S->L * 3; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCur++ = *pSrc++; + + /* Address modifier index of coefficient buffer */ + j = 1U; + + /* Loop over the Interpolation factor. */ + i = S->L; + while (i > 0U) + { + /* Set accumulator to zero */ + sum0 = 0; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (S->L - j); + + /* Loop over the polyPhase length. + Repeat until we've computed numTaps-(4*S->L) coefficients. */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + tapCnt = phaseLen >> 2U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += (q63_t) *ptr1++ * *ptr2; + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + sum0 += (q63_t) *ptr1++ * *ptr2; + ptr2 += S->L; + + sum0 += (q63_t) *ptr1++ * *ptr2; + ptr2 += S->L; + + sum0 += (q63_t) *ptr1++ * *ptr2; + ptr2 += S->L; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + tapCnt = phaseLen % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = phaseLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += (q63_t) *ptr1++ * *ptr2; + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Decrement loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); + + /* Increment the address modifier index of coefficient buffer */ + j++; + + /* Decrement the loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last phaseLen - 1 samples to the satrt of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + tapCnt = (phaseLen - 1U) >> 2U; + + /* copy data */ + while (tapCnt > 0U) + { + write_q15x2_ia (&pStateCur, read_q15x2_ia (&pState)); + write_q15x2_ia (&pStateCur, read_q15x2_ia (&pState)); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + tapCnt = (phaseLen - 1U) % 0x04U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = (phaseLen - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#else +/* alternate version for CM0_FAMILY */ + + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCur; /* Points to the current sample of the state */ + q15_t *ptr1; /* Temporary pointer for state buffer */ + const q15_t *ptr2; /* Temporary pointer for coefficient buffer */ + q63_t sum0; /* Accumulators */ + uint32_t i, blkCnt, tapCnt; /* Loop counters */ + uint32_t phaseLen = S->phaseLength; /* Length of each polyphase filter component */ + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (phaseLen - 1U); + + /* Total number of intput samples */ + blkCnt = blockSize; + + /* Loop over the blockSize. */ + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCur++ = *pSrc++; + + /* Loop over the Interpolation factor. */ + i = S->L; + + while (i > 0U) + { + /* Set accumulator to zero */ + sum0 = 0; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (i - 1U); + + /* Loop over the polyPhase length */ + tapCnt = phaseLen; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += ((q63_t) *ptr1++ * *ptr2); + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Store the result after converting to 1.15 format in the destination buffer. */ + *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); + + /* Decrement loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last phaseLen - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + + tapCnt = phaseLen - 1U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of FIR_Interpolate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q31.c new file mode 100644 index 0000000..d6a8ca3 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_interpolate_q31.c @@ -0,0 +1,481 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_interpolate_q31.c + * Description: Q31 FIR interpolation + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Interpolate + @{ + */ + +/** + @brief Processing function for the Q31 FIR interpolator. + @param[in] S points to an instance of the Q31 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 samples to process + @return none + + @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 1/(numTaps/L). + since numTaps/L additions occur per output sample. + After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. + */ + +void arm_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCur; /* Points to the current sample of the state */ + q31_t *ptr1; /* Temporary pointer for state buffer */ + const q31_t *ptr2; /* Temporary pointer for coefficient buffer */ + q63_t sum0; /* Accumulators */ + uint32_t i, blkCnt, tapCnt; /* Loop counters */ + uint32_t phaseLen = S->phaseLength; /* Length of each polyphase filter component */ + uint32_t j; + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc0, acc1, acc2, acc3; + q31_t x0, x1, x2, x3; + q31_t c0, c1, c2, c3; +#endif + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (phaseLen - 1U); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCur++ = *pSrc++; + *pStateCur++ = *pSrc++; + *pStateCur++ = *pSrc++; + *pStateCur++ = *pSrc++; + + /* Address modifier index of coefficient buffer */ + j = 1U; + + /* Loop over the Interpolation factor. */ + i = (S->L); + + while (i > 0U) + { + /* Set accumulator to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (S->L - j); + + /* Loop over the polyPhase length. Unroll by a factor of 4. + Repeat until we've computed numTaps-(4*S->L) coefficients. */ + tapCnt = phaseLen >> 2U; + + x0 = *(ptr1++); + x1 = *(ptr1++); + x2 = *(ptr1++); + + while (tapCnt > 0U) + { + /* Read the input sample */ + x3 = *(ptr1++); + + /* Read the coefficient */ + c0 = *(ptr2); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + acc1 += (q63_t) x1 * c0; + acc2 += (q63_t) x2 * c0; + acc3 += (q63_t) x3 * c0; + + /* Read the coefficient */ + c1 = *(ptr2 + S->L); + + /* Read the input sample */ + x0 = *(ptr1++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x1 * c1; + acc1 += (q63_t) x2 * c1; + acc2 += (q63_t) x3 * c1; + acc3 += (q63_t) x0 * c1; + + /* Read the coefficient */ + c2 = *(ptr2 + S->L * 2); + + /* Read the input sample */ + x1 = *(ptr1++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x2 * c2; + acc1 += (q63_t) x3 * c2; + acc2 += (q63_t) x0 * c2; + acc3 += (q63_t) x1 * c2; + + /* Read the coefficient */ + c3 = *(ptr2 + S->L * 3); + + /* Read the input sample */ + x2 = *(ptr1++); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x3 * c3; + acc1 += (q63_t) x0 * c3; + acc2 += (q63_t) x1 * c3; + acc3 += (q63_t) x2 * c3; + + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += 4 * S->L; + + /* Decrement loop counter */ + tapCnt--; + } + + /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = phaseLen % 0x4U; + + while (tapCnt > 0U) + { + /* Read the input sample */ + x3 = *(ptr1++); + + /* Read the coefficient */ + c0 = *(ptr2); + + /* Perform the multiply-accumulate */ + acc0 += (q63_t) x0 * c0; + acc1 += (q63_t) x1 * c0; + acc2 += (q63_t) x2 * c0; + acc3 += (q63_t) x3 * c0; + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* update states for next sample processing */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *(pDst ) = (q31_t) (acc0 >> 31); + *(pDst + S->L) = (q31_t) (acc1 >> 31); + *(pDst + 2 * S->L) = (q31_t) (acc2 >> 31); + *(pDst + 3 * S->L) = (q31_t) (acc3 >> 31); + + pDst++; + + /* Increment the address modifier index of coefficient buffer */ + j++; + + /* Decrement loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 4; + + pDst += S->L * 3; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCur++ = *pSrc++; + + /* Address modifier index of coefficient buffer */ + j = 1U; + + /* Loop over the Interpolation factor. */ + i = S->L; + while (i > 0U) + { + /* Set accumulator to zero */ + sum0 = 0; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (S->L - j); + + /* Loop over the polyPhase length. + Repeat until we've computed numTaps-(4*S->L) coefficients. */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + tapCnt = phaseLen >> 2U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += (q63_t) *ptr1++ * *ptr2; + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + sum0 += (q63_t) *ptr1++ * *ptr2; + ptr2 += S->L; + + sum0 += (q63_t) *ptr1++ * *ptr2; + ptr2 += S->L; + + sum0 += (q63_t) *ptr1++ * *ptr2; + ptr2 += S->L; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + tapCnt = phaseLen % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = phaseLen; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += (q63_t) *ptr1++ * *ptr2; + + /* Upsampling is done by stuffing L-1 zeros between each sample. + * So instead of multiplying zeros with coefficients, + * Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Decrement loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q31_t) (sum0 >> 31); + + /* Increment the address modifier index of coefficient buffer */ + j++; + + /* Decrement the loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last phaseLen - 1 samples to the satrt of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + tapCnt = (phaseLen - 1U) >> 2U; + + /* copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + tapCnt = (phaseLen - 1U) % 0x04U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = (phaseLen - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#else +/* alternate version for CM0_FAMILY */ + + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCur; /* Points to the current sample of the state */ + q31_t *ptr1; /* Temporary pointer for state buffer */ + const q31_t *ptr2; /* Temporary pointer for coefficient buffer */ + q63_t sum0; /* Accumulators */ + uint32_t i, blkCnt, tapCnt; /* Loop counters */ + uint32_t phaseLen = S->phaseLength; /* Length of each polyphase filter component */ + + /* S->pState buffer contains previous frame (phaseLen - 1) samples */ + /* pStateCur points to the location where the new input data should be written */ + pStateCur = S->pState + (phaseLen - 1U); + + /* Total number of intput samples */ + blkCnt = blockSize; + + /* Loop over the blockSize. */ + while (blkCnt > 0U) + { + /* Copy new input sample into the state buffer */ + *pStateCur++ = *pSrc++; + + /* Loop over the Interpolation factor. */ + i = S->L; + + while (i > 0U) + { + /* Set accumulator to zero */ + sum0 = 0; + + /* Initialize state pointer */ + ptr1 = pState; + + /* Initialize coefficient pointer */ + ptr2 = pCoeffs + (i - 1U); + + /* Loop over the polyPhase length */ + tapCnt = phaseLen; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum0 += ((q63_t) *ptr1++ * *ptr2); + + /* Increment the coefficient pointer by interpolation factor times. */ + ptr2 += S->L; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* The result is in the accumulator, store in the destination buffer. */ + *pDst++ = (q31_t) (sum0 >> 31); + + /* Decrement loop counter */ + i--; + } + + /* Advance the state pointer by 1 + * to process the next group of interpolation factor number samples */ + pState = pState + 1; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + ** Now copy the last phaseLen - 1 samples to the start of the state buffer. + ** This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCur = S->pState; + + tapCnt = phaseLen - 1U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of FIR_Interpolate group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_f32.c new file mode 100644 index 0000000..a3d95c1 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_f32.c @@ -0,0 +1,453 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_lattice_f32.c + * Description: Processing function for floating-point FIR Lattice filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup FIR_Lattice Finite Impulse Response (FIR) Lattice Filters + + This set of functions implements Finite Impulse Response (FIR) lattice filters + for Q15, Q31 and floating-point data types. Lattice filters are used in a + variety of adaptive filter applications. The filter structure is feedforward and + the net impulse response is finite length. + The functions operate on blocks + of input and output data and each call to the function processes + blockSize samples through the filter. pSrc and + pDst point to input and output arrays containing blockSize values. + + @par Algorithm + \image html FIRLattice.gif "Finite Impulse Response Lattice filter" + The following difference equation is implemented: + @par +
+      f0[n] = g0[n] = x[n]
+      fm[n] = fm-1[n] + km * gm-1[n-1] for m = 1, 2, ...M
+      gm[n] = km * fm-1[n] + gm-1[n-1] for m = 1, 2, ...M
+      y[n] = fM[n]
+  
+ @par + pCoeffs points to tha array of reflection coefficients of size numStages. + Reflection Coefficients are stored in the following order. + @par +
+      {k1, k2, ..., kM}
+  
+ where M is number of stages + @par + pState points to a state array of size numStages. + The state variables (g values) hold previous inputs and are stored in the following order. +
+    {g0[n], g1[n], g2[n] ...gM-1[n]}
+  
+ The state variables are updated after each block of data is processed; the coefficients are untouched. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter. + Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. + There are separate instance structure declarations for each of the 3 supported data types. + + @par Initialization Functions + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numStages, pCoeffs, pState. Also set all of the values in pState to zero. + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + Set the values in the state buffer to zeros and then manually initialize the instance structure as follows: +
+      arm_fir_lattice_instance_f32 S = {numStages, pState, pCoeffs};
+      arm_fir_lattice_instance_q31 S = {numStages, pState, pCoeffs};
+      arm_fir_lattice_instance_q15 S = {numStages, pState, pCoeffs};
+  
+ @par + where numStages is the number of stages in the filter; + pState is the address of the state buffer; + pCoeffs is the address of the coefficient buffer. + + @par Fixed-Point Behavior + Care must be taken when using the fixed-point versions of the FIR Lattice filter 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 FIR_Lattice + @{ + */ + +/** + @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 + @return none + */ + +void arm_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *px; /* Temporary state pointer */ + const float32_t *pk; /* Temporary coefficient pointer */ + uint32_t numStages = S->numStages; /* Number of stages in the filter */ + uint32_t blkCnt, stageCnt; /* Loop counters */ + float32_t fcurr0, fnext0, gnext0, gcurr0; /* Temporary variables */ + +#if defined (ARM_MATH_LOOPUNROLL) + float32_t fcurr1, fnext1, gnext1; /* Temporary variables for second sample in loop unrolling */ + float32_t fcurr2, fnext2, gnext2; /* Temporary variables for third sample in loop unrolling */ + float32_t fcurr3, fnext3, gnext3; /* Temporary variables for fourth sample in loop unrolling */ +#endif + + gcurr0 = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Read two samples from input buffer */ + /* f0(n) = x(n) */ + fcurr0 = *pSrc++; + fcurr1 = *pSrc++; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* Read g0(n-1) from state buffer */ + gcurr0 = *px; + + /* Process first sample for first tap */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = (gcurr0 * (*pk)) + fcurr0; + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext0 = (fcurr0 * (*pk)) + gcurr0; + + /* Process second sample for first tap */ + fnext1 = (fcurr0 * (*pk)) + fcurr1; + gnext1 = (fcurr1 * (*pk)) + fcurr0; + + /* Read next two samples from input buffer */ + /* f0(n+2) = x(n+2) */ + fcurr2 = *pSrc++; + fcurr3 = *pSrc++; + + /* Process third sample for first tap */ + fnext2 = (fcurr1 * (*pk)) + fcurr2; + gnext2 = (fcurr2 * (*pk)) + fcurr1; + + /* Process fourth sample for first tap */ + fnext3 = (fcurr2 * (*pk )) + fcurr3; + gnext3 = (fcurr3 * (*pk++)) + fcurr2; + + /* Copy only last input sample into the state buffer + which will be used for next samples processing */ + *px++ = fcurr3; + + /* Update of f values for next coefficient set processing */ + fcurr0 = fnext0; + fcurr1 = fnext1; + fcurr2 = fnext2; + fcurr3 = fnext3; + + /* Loop unrolling. Process 4 taps at a time . */ + stageCnt = (numStages - 1U) >> 2U; + + /* Loop over the number of taps. Unroll by a factor of 4. + Repeat until we've computed numStages-3 coefficients. */ + + /* Process 2nd, 3rd, 4th and 5th taps ... here */ + while (stageCnt > 0U) + { + /* Read g1(n-1), g3(n-1) .... from state */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = gnext3; + + /* Process first sample for 2nd, 6th .. tap */ + /* Sample processing for K2, K6.... */ + /* f2(n) = f1(n) + K2 * g1(n-1) */ + fnext0 = (gcurr0 * (*pk)) + fcurr0; + + /* Process second sample for 2nd, 6th .. tap */ + /* for sample 2 processing */ + fnext1 = (gnext0 * (*pk)) + fcurr1; + + /* Process third sample for 2nd, 6th .. tap */ + fnext2 = (gnext1 * (*pk)) + fcurr2; + + /* Process fourth sample for 2nd, 6th .. tap */ + fnext3 = (gnext2 * (*pk)) + fcurr3; + + /* g2(n) = f1(n) * K2 + g1(n-1) */ + /* Calculation of state values for next stage */ + gnext3 = (fcurr3 * (*pk)) + gnext2; + + gnext2 = (fcurr2 * (*pk)) + gnext1; + + gnext1 = (fcurr1 * (*pk)) + gnext0; + + gnext0 = (fcurr0 * (*pk++)) + gcurr0; + + + /* Read g2(n-1), g4(n-1) .... from state */ + gcurr0 = *px; + + /* save g2(n) in state buffer */ + *px++ = gnext3; + + /* Sample processing for K3, K7.... */ + /* Process first sample for 3rd, 7th .. tap */ + /* f3(n) = f2(n) + K3 * g2(n-1) */ + fcurr0 = (gcurr0 * (*pk)) + fnext0; + + /* Process second sample for 3rd, 7th .. tap */ + fcurr1 = (gnext0 * (*pk)) + fnext1; + + /* Process third sample for 3rd, 7th .. tap */ + fcurr2 = (gnext1 * (*pk)) + fnext2; + + /* Process fourth sample for 3rd, 7th .. tap */ + fcurr3 = (gnext2 * (*pk)) + fnext3; + + /* Calculation of state values for next stage */ + /* g3(n) = f2(n) * K3 + g2(n-1) */ + gnext3 = (fnext3 * (*pk)) + gnext2; + + gnext2 = (fnext2 * (*pk)) + gnext1; + + gnext1 = (fnext1 * (*pk)) + gnext0; + + gnext0 = (fnext0 * (*pk++)) + gcurr0; + + + /* Read g1(n-1), g3(n-1) .... from state */ + gcurr0 = *px; + + /* save g3(n) in state buffer */ + *px++ = gnext3; + + /* Sample processing for K4, K8.... */ + /* Process first sample for 4th, 8th .. tap */ + /* f4(n) = f3(n) + K4 * g3(n-1) */ + fnext0 = (gcurr0 * (*pk)) + fcurr0; + + /* Process second sample for 4th, 8th .. tap */ + /* for sample 2 processing */ + fnext1 = (gnext0 * (*pk)) + fcurr1; + + /* Process third sample for 4th, 8th .. tap */ + fnext2 = (gnext1 * (*pk)) + fcurr2; + + /* Process fourth sample for 4th, 8th .. tap */ + fnext3 = (gnext2 * (*pk)) + fcurr3; + + /* g4(n) = f3(n) * K4 + g3(n-1) */ + /* Calculation of state values for next stage */ + gnext3 = (fcurr3 * (*pk)) + gnext2; + + gnext2 = (fcurr2 * (*pk)) + gnext1; + + gnext1 = (fcurr1 * (*pk)) + gnext0; + + gnext0 = (fcurr0 * (*pk++)) + gcurr0; + + + /* Read g2(n-1), g4(n-1) .... from state */ + gcurr0 = *px; + + /* save g4(n) in state buffer */ + *px++ = gnext3; + + /* Sample processing for K5, K9.... */ + /* Process first sample for 5th, 9th .. tap */ + /* f5(n) = f4(n) + K5 * g4(n-1) */ + fcurr0 = (gcurr0 * (*pk)) + fnext0; + + /* Process second sample for 5th, 9th .. tap */ + fcurr1 = (gnext0 * (*pk)) + fnext1; + + /* Process third sample for 5th, 9th .. tap */ + fcurr2 = (gnext1 * (*pk)) + fnext2; + + /* Process fourth sample for 5th, 9th .. tap */ + fcurr3 = (gnext2 * (*pk)) + fnext3; + + /* Calculation of state values for next stage */ + /* g5(n) = f4(n) * K5 + g4(n-1) */ + gnext3 = (fnext3 * (*pk)) + gnext2; + + gnext2 = (fnext2 * (*pk)) + gnext1; + + gnext1 = (fnext1 * (*pk)) + gnext0; + + gnext0 = (fnext0 * (*pk++)) + gcurr0; + + stageCnt--; + } + + /* If the (filter length -1) is not a multiple of 4, compute the remaining filter taps */ + stageCnt = (numStages - 1U) % 0x4U; + + while (stageCnt > 0U) + { + gcurr0 = *px; + + /* save g value in state buffer */ + *px++ = gnext3; + + /* Process four samples for last three taps here */ + fnext0 = (gcurr0 * (*pk)) + fcurr0; + + fnext1 = (gnext0 * (*pk)) + fcurr1; + + fnext2 = (gnext1 * (*pk)) + fcurr2; + + fnext3 = (gnext2 * (*pk)) + fcurr3; + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext3 = (fcurr3 * (*pk)) + gnext2; + + gnext2 = (fcurr2 * (*pk)) + gnext1; + + gnext1 = (fcurr1 * (*pk)) + gnext0; + + gnext0 = (fcurr0 * (*pk++)) + gcurr0; + + /* Update of f values for next coefficient set processing */ + fcurr0 = fnext0; + fcurr1 = fnext1; + fcurr2 = fnext2; + fcurr3 = fnext3; + + stageCnt--; + } + + /* The results in the 4 accumulators, store in the destination buffer. */ + /* y(n) = fN(n) */ + *pDst++ = fcurr0; + *pDst++ = fcurr1; + *pDst++ = fcurr2; + *pDst++ = fcurr3; + + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* f0(n) = x(n) */ + fcurr0 = *pSrc++; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* read g2(n) from state buffer */ + gcurr0 = *px; + + /* for sample 1 processing */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = (gcurr0 * (*pk)) + fcurr0; + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext0 = (fcurr0 * (*pk++)) + gcurr0; + + /* save g1(n) in state buffer */ + *px++ = fcurr0; + + /* f1(n) is saved in fcurr0 for next stage processing */ + fcurr0 = fnext0; + + stageCnt = (numStages - 1U); + + /* stage loop */ + while (stageCnt > 0U) + { + /* read g2(n) from state buffer */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = gnext0; + + /* Sample processing for K2, K3.... */ + /* f2(n) = f1(n) + K2 * g1(n-1) */ + fnext0 = (gcurr0 * (*pk)) + fcurr0; + + /* g2(n) = f1(n) * K2 + g1(n-1) */ + gnext0 = (fcurr0 * (*pk++)) + gcurr0; + + /* f1(n) is saved in fcurr0 for next stage processing */ + fcurr0 = fnext0; + + stageCnt--; + } + + /* y(n) = fN(n) */ + *pDst++ = fcurr0; + + blkCnt--; + } + +} + +/** + @} end of FIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_f32.c new file mode 100644 index 0000000..7929629 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_f32.c @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_lattice_init_f32.c + * Description: Floating-point FIR Lattice filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Lattice + @{ + */ + +/** + @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 + @return none + */ + +void arm_fir_lattice_init_f32( + arm_fir_lattice_instance_f32 * S, + uint16_t numStages, + const float32_t * pCoeffs, + float32_t * pState) +{ + /* Assign filter taps */ + S->numStages = numStages; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always numStages */ + memset(pState, 0, (numStages) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q15.c new file mode 100644 index 0000000..5c80dff --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q15.c @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_lattice_init_q15.c + * Description: Q15 FIR Lattice filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Lattice + @{ + */ + +/** + @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 + @return none + */ + +void arm_fir_lattice_init_q15( + arm_fir_lattice_instance_q15 * S, + uint16_t numStages, + const q15_t * pCoeffs, + q15_t * pState) +{ + /* Assign filter taps */ + S->numStages = numStages; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always numStages */ + memset(pState, 0, (numStages) * sizeof(q15_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q31.c new file mode 100644 index 0000000..476296d --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_init_q31.c @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_lattice_init_q31.c + * Description: Q31 FIR lattice filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Lattice + @{ + */ + +/** + @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 + @return none + */ + +void arm_fir_lattice_init_q31( + arm_fir_lattice_instance_q31 * S, + uint16_t numStages, + const q31_t * pCoeffs, + q31_t * pState) +{ + /* Assign filter taps */ + S->numStages = numStages; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always numStages */ + memset(pState, 0, (numStages) * sizeof(q31_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q15.c new file mode 100644 index 0000000..42e7c0d --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q15.c @@ -0,0 +1,506 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_lattice_q15.c + * Description: Q15 FIR lattice filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Lattice + @{ + */ + +/** + @brief Processing function for 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 + @return none + */ + +void arm_fir_lattice_q15( + const arm_fir_lattice_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *px; /* Temporary state pointer */ + const q15_t *pk; /* Temporary coefficient pointer */ + uint32_t numStages = S->numStages; /* Number of stages in the filter */ + uint32_t blkCnt, stageCnt; /* Loop counters */ + q31_t fcurr0, fnext0, gnext0, gcurr0; /* Temporary variables */ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t fcurr1, fnext1, gnext1; /* Temporary variables for second sample in loop unrolling */ + q31_t fcurr2, fnext2, gnext2; /* Temporary variables for third sample in loop unrolling */ + q31_t fcurr3, fnext3, gnext3; /* Temporary variables for fourth sample in loop unrolling */ +#endif + + gcurr0 = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Read two samples from input buffer */ + /* f0(n) = x(n) */ + fcurr0 = *pSrc++; + fcurr1 = *pSrc++; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* Read g0(n-1) from state buffer */ + gcurr0 = *px; + + /* Process first sample for first tap */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = (q31_t) ((gcurr0 * (*pk)) >> 15U) + fcurr0; + fnext0 = __SSAT(fnext0, 16); + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext0 = (q31_t) ((fcurr0 * (*pk)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + /* Process second sample for first tap */ + fnext1 = (q31_t) ((fcurr0 * (*pk)) >> 15U) + fcurr1; + fnext1 = __SSAT(fnext1, 16); + gnext1 = (q31_t) ((fcurr1 * (*pk)) >> 15U) + fcurr0; + gnext1 = __SSAT(gnext1, 16); + + /* Read next two samples from input buffer */ + /* f0(n+2) = x(n+2) */ + fcurr2 = *pSrc++; + fcurr3 = *pSrc++; + + /* Process third sample for first tap */ + fnext2 = (q31_t) ((fcurr1 * (*pk)) >> 15U) + fcurr2; + fnext2 = __SSAT(fnext2, 16); + gnext2 = (q31_t) ((fcurr2 * (*pk)) >> 15U) + fcurr1; + gnext2 = __SSAT(gnext2, 16); + + /* Process fourth sample for first tap */ + fnext3 = (q31_t) ((fcurr2 * (*pk )) >> 15U) + fcurr3; + fnext3 = __SSAT(fnext3, 16); + gnext3 = (q31_t) ((fcurr3 * (*pk++)) >> 15U) + fcurr2; + gnext3 = __SSAT(gnext3, 16); + + /* Copy only last input sample into the state buffer + which will be used for next samples processing */ + *px++ = (q15_t) fcurr3; + + /* Update of f values for next coefficient set processing */ + fcurr0 = fnext0; + fcurr1 = fnext1; + fcurr2 = fnext2; + fcurr3 = fnext3; + + /* Loop unrolling. Process 4 taps at a time . */ + stageCnt = (numStages - 1U) >> 2U; + + /* Loop over the number of taps. Unroll by a factor of 4. + Repeat until we've computed numStages-3 coefficients. */ + + /* Process 2nd, 3rd, 4th and 5th taps ... here */ + while (stageCnt > 0U) + { + /* Read g1(n-1), g3(n-1) .... from state */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = (q15_t) gnext3; + + /* Process first sample for 2nd, 6th .. tap */ + /* Sample processing for K2, K6.... */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = (q31_t) ((gcurr0 * (*pk)) >> 15U) + fcurr0; + fnext0 = __SSAT(fnext0, 16); + + /* Process second sample for 2nd, 6th .. tap */ + /* for sample 2 processing */ + fnext1 = (q31_t) ((gnext0 * (*pk)) >> 15U) + fcurr1; + fnext1 = __SSAT(fnext1, 16); + + /* Process third sample for 2nd, 6th .. tap */ + fnext2 = (q31_t) ((gnext1 * (*pk)) >> 15U) + fcurr2; + fnext2 = __SSAT(fnext2, 16); + + /* Process fourth sample for 2nd, 6th .. tap */ + fnext3 = (q31_t) ((gnext2 * (*pk)) >> 15U) + fcurr3; + fnext3 = __SSAT(fnext3, 16); + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + /* Calculation of state values for next stage */ + gnext3 = (q31_t) ((fcurr3 * (*pk)) >> 15U) + gnext2; + gnext3 = __SSAT(gnext3, 16); + + gnext2 = (q31_t) ((fcurr2 * (*pk)) >> 15U) + gnext1; + gnext2 = __SSAT(gnext2, 16); + + gnext1 = (q31_t) ((fcurr1 * (*pk)) >> 15U) + gnext0; + gnext1 = __SSAT(gnext1, 16); + + gnext0 = (q31_t) ((fcurr0 * (*pk++)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + + /* Read g2(n-1), g4(n-1) .... from state */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = (q15_t) gnext3; + + /* Sample processing for K3, K7.... */ + /* Process first sample for 3rd, 7th .. tap */ + /* f3(n) = f2(n) + K3 * g2(n-1) */ + fcurr0 = (q31_t) ((gcurr0 * (*pk)) >> 15U) + fnext0; + fcurr0 = __SSAT(fcurr0, 16); + + /* Process second sample for 3rd, 7th .. tap */ + fcurr1 = (q31_t) ((gnext0 * (*pk)) >> 15U) + fnext1; + fcurr1 = __SSAT(fcurr1, 16); + + /* Process third sample for 3rd, 7th .. tap */ + fcurr2 = (q31_t) ((gnext1 * (*pk)) >> 15U) + fnext2; + fcurr2 = __SSAT(fcurr2, 16); + + /* Process fourth sample for 3rd, 7th .. tap */ + fcurr3 = (q31_t) ((gnext2 * (*pk)) >> 15U) + fnext3; + fcurr3 = __SSAT(fcurr3, 16); + + /* Calculation of state values for next stage */ + /* g3(n) = f2(n) * K3 + g2(n-1) */ + gnext3 = (q31_t) ((fnext3 * (*pk)) >> 15U) + gnext2; + gnext3 = __SSAT(gnext3, 16); + + gnext2 = (q31_t) ((fnext2 * (*pk)) >> 15U) + gnext1; + gnext2 = __SSAT(gnext2, 16); + + gnext1 = (q31_t) ((fnext1 * (*pk)) >> 15U) + gnext0; + gnext1 = __SSAT(gnext1, 16); + + gnext0 = (q31_t) ((fnext0 * (*pk++)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + /* Read g1(n-1), g3(n-1) .... from state */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = (q15_t) gnext3; + + /* Sample processing for K4, K8.... */ + /* Process first sample for 4th, 8th .. tap */ + /* f4(n) = f3(n) + K4 * g3(n-1) */ + fnext0 = (q31_t) ((gcurr0 * (*pk)) >> 15U) + fcurr0; + fnext0 = __SSAT(fnext0, 16); + + /* Process second sample for 4th, 8th .. tap */ + /* for sample 2 processing */ + fnext1 = (q31_t) ((gnext0 * (*pk)) >> 15U) + fcurr1; + fnext1 = __SSAT(fnext1, 16); + + /* Process third sample for 4th, 8th .. tap */ + fnext2 = (q31_t) ((gnext1 * (*pk)) >> 15U) + fcurr2; + fnext2 = __SSAT(fnext2, 16); + + /* Process fourth sample for 4th, 8th .. tap */ + fnext3 = (q31_t) ((gnext2 * (*pk)) >> 15U) + fcurr3; + fnext3 = __SSAT(fnext3, 16); + + /* g4(n) = f3(n) * K4 + g3(n-1) */ + /* Calculation of state values for next stage */ + gnext3 = (q31_t) ((fcurr3 * (*pk)) >> 15U) + gnext2; + gnext3 = __SSAT(gnext3, 16); + + gnext2 = (q31_t) ((fcurr2 * (*pk)) >> 15U) + gnext1; + gnext2 = __SSAT(gnext2, 16); + + gnext1 = (q31_t) ((fcurr1 * (*pk)) >> 15U) + gnext0; + gnext1 = __SSAT(gnext1, 16); + + gnext0 = (q31_t) ((fcurr0 * (*pk++)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + /* Read g2(n-1), g4(n-1) .... from state */ + gcurr0 = *px; + + /* save g4(n) in state buffer */ + *px++ = (q15_t) gnext3; + + /* Sample processing for K5, K9.... */ + /* Process first sample for 5th, 9th .. tap */ + /* f5(n) = f4(n) + K5 * g4(n-1) */ + fcurr0 = (q31_t) ((gcurr0 * (*pk)) >> 15U) + fnext0; + fcurr0 = __SSAT(fcurr0, 16); + + /* Process second sample for 5th, 9th .. tap */ + fcurr1 = (q31_t) ((gnext0 * (*pk)) >> 15U) + fnext1; + fcurr1 = __SSAT(fcurr1, 16); + + /* Process third sample for 5th, 9th .. tap */ + fcurr2 = (q31_t) ((gnext1 * (*pk)) >> 15U) + fnext2; + fcurr2 = __SSAT(fcurr2, 16); + + /* Process fourth sample for 5th, 9th .. tap */ + fcurr3 = (q31_t) ((gnext2 * (*pk)) >> 15U) + fnext3; + fcurr3 = __SSAT(fcurr3, 16); + + /* Calculation of state values for next stage */ + /* g5(n) = f4(n) * K5 + g4(n-1) */ + gnext3 = (q31_t) ((fnext3 * (*pk)) >> 15U) + gnext2; + gnext3 = __SSAT(gnext3, 16); + + gnext2 = (q31_t) ((fnext2 * (*pk)) >> 15U) + gnext1; + gnext2 = __SSAT(gnext2, 16); + + gnext1 = (q31_t) ((fnext1 * (*pk)) >> 15U) + gnext0; + gnext1 = __SSAT(gnext1, 16); + + gnext0 = (q31_t) ((fnext0 * (*pk++)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + stageCnt--; + } + + /* If the (filter length -1) is not a multiple of 4, compute the remaining filter taps */ + stageCnt = (numStages - 1U) % 0x4U; + + while (stageCnt > 0U) + { + gcurr0 = *px; + + /* save g value in state buffer */ + *px++ = (q15_t) gnext3; + + /* Process four samples for last three taps here */ + fnext0 = (q31_t) ((gcurr0 * (*pk)) >> 15U) + fcurr0; + fnext0 = __SSAT(fnext0, 16); + + fnext1 = (q31_t) ((gnext0 * (*pk)) >> 15U) + fcurr1; + fnext1 = __SSAT(fnext1, 16); + + fnext2 = (q31_t) ((gnext1 * (*pk)) >> 15U) + fcurr2; + fnext2 = __SSAT(fnext2, 16); + + fnext3 = (q31_t) ((gnext2 * (*pk)) >> 15U) + fcurr3; + fnext3 = __SSAT(fnext3, 16); + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext3 = (q31_t) ((fcurr3 * (*pk)) >> 15U) + gnext2; + gnext3 = __SSAT(gnext3, 16); + + gnext2 = (q31_t) ((fcurr2 * (*pk)) >> 15U) + gnext1; + gnext2 = __SSAT(gnext2, 16); + + gnext1 = (q31_t) ((fcurr1 * (*pk)) >> 15U) + gnext0; + gnext1 = __SSAT(gnext1, 16); + + gnext0 = (q31_t) ((fcurr0 * (*pk++)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + /* Update of f values for next coefficient set processing */ + fcurr0 = fnext0; + fcurr1 = fnext1; + fcurr2 = fnext2; + fcurr3 = fnext3; + + stageCnt--; + } + + /* The results in the 4 accumulators, store in the destination buffer. */ + /* y(n) = fN(n) */ + +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pDst, __PKHBT(fcurr0, fcurr1, 16)); + write_q15x2_ia (&pDst, __PKHBT(fcurr2, fcurr3, 16)); +#else + write_q15x2_ia (&pDst, __PKHBT(fcurr1, fcurr0, 16)); + write_q15x2_ia (&pDst, __PKHBT(fcurr3, fcurr2, 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* f0(n) = x(n) */ + fcurr0 = *pSrc++; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* read g2(n) from state buffer */ + gcurr0 = *px; + + /* for sample 1 processing */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = (((q31_t) gcurr0 * (*pk)) >> 15U) + fcurr0; + fnext0 = __SSAT(fnext0, 16); + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext0 = (((q31_t) fcurr0 * (*pk++)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + /* save g1(n) in state buffer */ + *px++ = (q15_t) fcurr0; + + /* f1(n) is saved in fcurr0 for next stage processing */ + fcurr0 = fnext0; + + stageCnt = (numStages - 1U); + + /* stage loop */ + while (stageCnt > 0U) + { + /* read g2(n) from state buffer */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = (q15_t) gnext0; + + /* Sample processing for K2, K3.... */ + /* f2(n) = f1(n) + K2 * g1(n-1) */ + fnext0 = (((q31_t) gcurr0 * (*pk)) >> 15U) + fcurr0; + fnext0 = __SSAT(fnext0, 16); + + /* g2(n) = f1(n) * K2 + g1(n-1) */ + gnext0 = (((q31_t) fcurr0 * (*pk++)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + /* f1(n) is saved in fcurr0 for next stage processing */ + fcurr0 = fnext0; + + stageCnt--; + } + + /* y(n) = fN(n) */ + *pDst++ = __SSAT(fcurr0, 16); + + blkCnt--; + } + +#else +/* alternate version for CM0_FAMILY */ + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* f0(n) = x(n) */ + fcurr0 = *pSrc++; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* read g0(n-1) from state buffer */ + gcurr0 = *px; + + /* for sample 1 processing */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = ((gcurr0 * (*pk)) >> 15U) + fcurr0; + fnext0 = __SSAT(fnext, 16); + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext0 = ((fcurr0 * (*pk++)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + /* save f0(n) in state buffer */ + *px++ = (q15_t) fcurr0; + + /* f1(n) is saved in fcurr for next stage processing */ + fcurr0 = fnext0; + + stageCnt = (numStages - 1U); + + /* stage loop */ + while (stageCnt > 0U) + { + /* read g1(n-1) from state buffer */ + gcurr0 = *px; + + /* save g0(n-1) in state buffer */ + *px++ = (q15_t) gnext0; + + /* Sample processing for K2, K3.... */ + /* f2(n) = f1(n) + K2 * g1(n-1) */ + fnext0 = ((gcurr0 * (*pk)) >> 15U) + fcurr0; + fnext0 = __SSAT(fnext0, 16); + + /* g2(n) = f1(n) * K2 + g1(n-1) */ + gnext0 = ((fcurr0 * (*pk++)) >> 15U) + gcurr0; + gnext0 = __SSAT(gnext0, 16); + + /* f1(n) is saved in fcurr0 for next stage processing */ + fcurr0 = fnext0; + + stageCnt--; + } + + /* y(n) = fN(n) */ + *pDst++ = __SSAT(fcurr0, 16); + + blkCnt--; + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of FIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q31.c new file mode 100644 index 0000000..c8d28d7 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_lattice_q31.c @@ -0,0 +1,505 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_lattice_q31.c + * Description: Q31 FIR lattice filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Lattice + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + In order to avoid overflows the input signal must be scaled down by 2*log2(numStages) bits. + */ + +void arm_fir_lattice_q31( + const arm_fir_lattice_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *px; /* Temporary state pointer */ + const q31_t *pk; /* Temporary coefficient pointer */ + uint32_t numStages = S->numStages; /* Number of stages in the filter */ + uint32_t blkCnt, stageCnt; /* Loop counters */ + q31_t fcurr0, fnext0, gnext0, gcurr0; /* Temporary variables */ + +#if (1) +//#if !defined(ARM_MATH_CM0_FAMILY) + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t fcurr1, fnext1, gnext1; /* Temporary variables for second sample in loop unrolling */ + q31_t fcurr2, fnext2, gnext2; /* Temporary variables for third sample in loop unrolling */ + q31_t fcurr3, fnext3, gnext3; /* Temporary variables for fourth sample in loop unrolling */ +#endif + + gcurr0 = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Read two samples from input buffer */ + /* f0(n) = x(n) */ + fcurr0 = *pSrc++; + fcurr1 = *pSrc++; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* Read g0(n-1) from state buffer */ + gcurr0 = *px; + + /* Process first sample for first tap */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fnext0 = (fnext0 << 1U) + fcurr0; + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext0 = (q31_t) (((q63_t) fcurr0 * (*pk)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + /* Process second sample for first tap */ + fnext1 = (q31_t) (((q63_t) fcurr0 * (*pk)) >> 32U); + fnext1 = (fnext1 << 1U) + fcurr1; + gnext1 = (q31_t) (((q63_t) fcurr1 * (*pk)) >> 32U); + gnext1 = (gnext1 << 1U) + fcurr0; + + /* Read next two samples from input buffer */ + /* f0(n+2) = x(n+2) */ + fcurr2 = *pSrc++; + fcurr3 = *pSrc++; + + /* Process third sample for first tap */ + fnext2 = (q31_t) (((q63_t) fcurr1 * (*pk)) >> 32U); + fnext2 = (fnext2 << 1U) + fcurr2; + gnext2 = (q31_t) (((q63_t) fcurr2 * (*pk)) >> 32U); + gnext2 = (gnext2 << 1U) + fcurr1; + + /* Process fourth sample for first tap */ + fnext3 = (q31_t) (((q63_t) fcurr2 * (*pk )) >> 32U); + fnext3 = (fnext3 << 1U) + fcurr3; + gnext3 = (q31_t) (((q63_t) fcurr3 * (*pk++)) >> 32U); + gnext3 = (gnext3 << 1U) + fcurr2; + + /* Copy only last input sample into the state buffer + which will be used for next samples processing */ + *px++ = fcurr3; + + /* Update of f values for next coefficient set processing */ + fcurr0 = fnext0; + fcurr1 = fnext1; + fcurr2 = fnext2; + fcurr3 = fnext3; + + /* Loop unrolling. Process 4 taps at a time . */ + stageCnt = (numStages - 1U) >> 2U; + + /* Loop over the number of taps. Unroll by a factor of 4. + Repeat until we've computed numStages-3 coefficients. */ + + /* Process 2nd, 3rd, 4th and 5th taps ... here */ + while (stageCnt > 0U) + { + /* Read g1(n-1), g3(n-1) .... from state */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = gnext3; + + /* Process first sample for 2nd, 6th .. tap */ + /* Sample processing for K2, K6.... */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fnext0 = (fnext0 << 1U) + fcurr0; + + /* Process second sample for 2nd, 6th .. tap */ + /* for sample 2 processing */ + fnext1 = (q31_t) (((q63_t) gnext0 * (*pk)) >> 32U); + fnext1 = (fnext1 << 1U) + fcurr1; + + /* Process third sample for 2nd, 6th .. tap */ + fnext2 = (q31_t) (((q63_t) gnext1 * (*pk)) >> 32U); + fnext2 = (fnext2 << 1U) + fcurr2; + + /* Process fourth sample for 2nd, 6th .. tap */ + fnext3 = (q31_t) (((q63_t) gnext2 * (*pk)) >> 32U); + fnext3 = (fnext3 << 1U) + fcurr3; + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + /* Calculation of state values for next stage */ + gnext3 = (q31_t) (((q63_t) fcurr3 * (*pk)) >> 32U); + gnext3 = (gnext3 << 1U) + gnext2; + + gnext2 = (q31_t) (((q63_t) fcurr2 * (*pk)) >> 32U); + gnext2 = (gnext2 << 1U) + gnext1; + + gnext1 = (q31_t) (((q63_t) fcurr1 * (*pk)) >> 32U); + gnext1 = (gnext1 << 1U) + gnext0; + + gnext0 = (q31_t) (((q63_t) fcurr0 * (*pk++)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + + /* Read g2(n-1), g4(n-1) .... from state */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = gnext3; + + /* Sample processing for K3, K7.... */ + /* Process first sample for 3rd, 7th .. tap */ + /* f3(n) = f2(n) + K3 * g2(n-1) */ + fcurr0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fcurr0 = (fcurr0 << 1U) + fnext0; + + /* Process second sample for 3rd, 7th .. tap */ + fcurr1 = (q31_t) (((q63_t) gnext0 * (*pk)) >> 32U); + fcurr1 = (fcurr1 << 1U) + fnext1; + + /* Process third sample for 3rd, 7th .. tap */ + fcurr2 = (q31_t) (((q63_t) gnext1 * (*pk)) >> 32U); + fcurr2 = (fcurr2 << 1U) + fnext2; + + /* Process fourth sample for 3rd, 7th .. tap */ + fcurr3 = (q31_t) (((q63_t) gnext2 * (*pk)) >> 32U); + fcurr3 = (fcurr3 << 1U) + fnext3; + + /* Calculation of state values for next stage */ + /* g3(n) = f2(n) * K3 + g2(n-1) */ + gnext3 = (q31_t) (((q63_t) fnext3 * (*pk)) >> 32U); + gnext3 = (gnext3 << 1U) + gnext2; + + gnext2 = (q31_t) (((q63_t) fnext2 * (*pk)) >> 32U); + gnext2 = (gnext2 << 1U) + gnext1; + + gnext1 = (q31_t) (((q63_t) fnext1 * (*pk)) >> 32U); + gnext1 = (gnext1 << 1U) + gnext0; + + gnext0 = (q31_t) (((q63_t) fnext0 * (*pk++)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + /* Read g1(n-1), g3(n-1) .... from state */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = gnext3; + + /* Sample processing for K4, K8.... */ + /* Process first sample for 4th, 8th .. tap */ + /* f4(n) = f3(n) + K4 * g3(n-1) */ + fnext0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fnext0 = (fnext0 << 1U) + fcurr0; + + /* Process second sample for 4th, 8th .. tap */ + /* for sample 2 processing */ + fnext1 = (q31_t) (((q63_t) gnext0 * (*pk)) >> 32U); + fnext1 = (fnext1 << 1U) + fcurr1; + + /* Process third sample for 4th, 8th .. tap */ + fnext2 = (q31_t) (((q63_t) gnext1 * (*pk)) >> 32U); + fnext2 = (fnext2 << 1U) + fcurr2; + + /* Process fourth sample for 4th, 8th .. tap */ + fnext3 = (q31_t) (((q63_t) gnext2 * (*pk)) >> 32U); + fnext3 = (fnext3 << 1U) + fcurr3; + + /* g4(n) = f3(n) * K4 + g3(n-1) */ + /* Calculation of state values for next stage */ + gnext3 = (q31_t) (((q63_t) fcurr3 * (*pk)) >> 32U); + gnext3 = (gnext3 << 1U) + gnext2; + + gnext2 = (q31_t) (((q63_t) fcurr2 * (*pk)) >> 32U); + gnext2 = (gnext2 << 1U) + gnext1; + + gnext1 = (q31_t) (((q63_t) fcurr1 * (*pk)) >> 32U); + gnext1 = (gnext1 << 1U) + gnext0; + + gnext0 = (q31_t) (((q63_t) fcurr0 * (*pk++)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + /* Read g2(n-1), g4(n-1) .... from state */ + gcurr0 = *px; + + /* save g4(n) in state buffer */ + *px++ = gnext3; + + /* Sample processing for K5, K9.... */ + /* Process first sample for 5th, 9th .. tap */ + /* f5(n) = f4(n) + K5 * g4(n-1) */ + fcurr0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fcurr0 = (fcurr0 << 1U) + fnext0; + + /* Process second sample for 5th, 9th .. tap */ + fcurr1 = (q31_t) (((q63_t) gnext0 * (*pk)) >> 32U); + fcurr1 = (fcurr1 << 1U) + fnext1; + + /* Process third sample for 5th, 9th .. tap */ + fcurr2 = (q31_t) (((q63_t) gnext1 * (*pk)) >> 32U); + fcurr2 = (fcurr2 << 1U) + fnext2; + + /* Process fourth sample for 5th, 9th .. tap */ + fcurr3 = (q31_t) (((q63_t) gnext2 * (*pk)) >> 32U); + fcurr3 = (fcurr3 << 1U) + fnext3; + + /* Calculation of state values for next stage */ + /* g5(n) = f4(n) * K5 + g4(n-1) */ + gnext3 = (q31_t) (((q63_t) fnext3 * (*pk)) >> 32U); + gnext3 = (gnext3 << 1U) + gnext2; + + gnext2 = (q31_t) (((q63_t) fnext2 * (*pk)) >> 32U); + gnext2 = (gnext2 << 1U) + gnext1; + + gnext1 = (q31_t) (((q63_t) fnext1 * (*pk)) >> 32U); + gnext1 = (gnext1 << 1U) + gnext0; + + gnext0 = (q31_t) (((q63_t) fnext0 * (*pk++)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + stageCnt--; + } + + /* If the (filter length -1) is not a multiple of 4, compute the remaining filter taps */ + stageCnt = (numStages - 1U) % 0x4U; + + while (stageCnt > 0U) + { + gcurr0 = *px; + + /* save g value in state buffer */ + *px++ = gnext3; + + /* Process four samples for last three taps here */ + fnext0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fnext0 = (fnext0 << 1U) + fcurr0; + + fnext1 = (q31_t) (((q63_t) gnext0 * (*pk)) >> 32U); + fnext1 = (fnext1 << 1U) + fcurr1; + + fnext2 = (q31_t) (((q63_t) gnext1 * (*pk)) >> 32U); + fnext2 = (fnext2 << 1U) + fcurr2; + + fnext3 = (q31_t) (((q63_t) gnext2 * (*pk)) >> 32U); + fnext3 = (fnext3 << 1U) + fcurr3; + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext3 = (q31_t) (((q63_t) fcurr3 * (*pk)) >> 32U); + gnext3 = (gnext3 << 1U) + gnext2; + + gnext2 = (q31_t) (((q63_t) fcurr2 * (*pk)) >> 32U); + gnext2 = (gnext2 << 1U) + gnext1; + + gnext1 = (q31_t) (((q63_t) fcurr1 * (*pk)) >> 32U); + gnext1 = (gnext1 << 1U) + gnext0; + + gnext0 = (q31_t) (((q63_t) fcurr0 * (*pk++)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + /* Update of f values for next coefficient set processing */ + fcurr0 = fnext0; + fcurr1 = fnext1; + fcurr2 = fnext2; + fcurr3 = fnext3; + + stageCnt--; + } + + /* The results in the 4 accumulators, store in the destination buffer. */ + /* y(n) = fN(n) */ + *pDst++ = fcurr0; + *pDst++ = fcurr1; + *pDst++ = fcurr2; + *pDst++ = fcurr3; + + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* f0(n) = x(n) */ + fcurr0 = *pSrc++; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* read g2(n) from state buffer */ + gcurr0 = *px; + + /* for sample 1 processing */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fnext0 = (fnext0 << 1U) + fcurr0; + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext0 = (q31_t) (((q63_t) fcurr0 * (*pk++)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + /* save g1(n) in state buffer */ + *px++ = fcurr0; + + /* f1(n) is saved in fcurr0 for next stage processing */ + fcurr0 = fnext0; + + stageCnt = (numStages - 1U); + + /* stage loop */ + while (stageCnt > 0U) + { + /* read g2(n) from state buffer */ + gcurr0 = *px; + + /* save g1(n) in state buffer */ + *px++ = gnext0; + + /* Sample processing for K2, K3.... */ + /* f2(n) = f1(n) + K2 * g1(n-1) */ + fnext0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fnext0 = (fnext0 << 1U) + fcurr0; + + /* g2(n) = f1(n) * K2 + g1(n-1) */ + gnext0 = (q31_t) (((q63_t) fcurr0 * (*pk++)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + /* f1(n) is saved in fcurr0 for next stage processing */ + fcurr0 = fnext0; + + stageCnt--; + } + + /* y(n) = fN(n) */ + *pDst++ = fcurr0; + + blkCnt--; + } + +#else +/* alternate version for CM0_FAMILY */ + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* f0(n) = x(n) */ + fcurr0 = *pSrc++; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coeff pointer */ + pk = pCoeffs; + + /* read g0(n-1) from state buffer */ + gcurr0 = *px; + + /* for sample 1 processing */ + /* f1(n) = f0(n) + K1 * g0(n-1) */ + fnext0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fnext0 = (fnext << 1U) + fcurr0; + + /* g1(n) = f0(n) * K1 + g0(n-1) */ + gnext0 = (q31_t) (((q63_t) fcurr0 * (*pk++)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + /* save f0(n) in state buffer */ + *px++ = fcurr0; + + /* f1(n) is saved in fcurr for next stage processing */ + fcurr0 = fnext0; + + stageCnt = (numStages - 1U); + + /* stage loop */ + while (stageCnt > 0U) + { + /* read g1(n-1) from state buffer */ + gcurr0 = *px; + + /* save g0(n-1) in state buffer */ + *px++ = gnext0; + + /* Sample processing for K2, K3.... */ + /* f2(n) = f1(n) + K2 * g1(n-1) */ + fnext0 = (q31_t) (((q63_t) gcurr0 * (*pk)) >> 32U); + fnext0 = (fnext0 << 1U) + fcurr0; + + /* g2(n) = f1(n) * K2 + g1(n-1) */ + gnext0 = (q31_t) (((q63_t) fcurr0 * (*pk++)) >> 32U); + gnext0 = (gnext0 << 1U) + gcurr0; + + /* f1(n) is saved in fcurr0 for next stage processing */ + fcurr0 = fnext0; + + stageCnt--; + } + + /* y(n) = fN(n) */ + *pDst++ = fcurr0; + + blkCnt--; + } + +#endif /* #if !defined(ARM_MATH_CM0_FAMILY) */ + +} + +/** + @} end of FIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q15.c new file mode 100644 index 0000000..e20798e --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q15.c @@ -0,0 +1,332 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_q15.c + * Description: Q15 FIR filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR + @{ + */ + +/** + @brief Processing function for the Q15 FIR filter. + @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 + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both coefficients 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. + + @remark + Refer to \ref arm_fir_fast_q15() for a faster but less precise implementation of this function. + */ + +void arm_fir_q15( + const arm_fir_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + q15_t *px; /* Temporary pointer for state buffer */ + const q15_t *pb; /* Temporary pointer for coefficient buffer */ + q63_t acc0; /* Accumulators */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc1, acc2, acc3; /* Accumulators */ + q31_t x0, x1, x2, c0; /* Temporary variables to hold state and coefficient values */ +#endif + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 output values simultaneously. + * The variables acc0 ... acc3 hold output values that are being computed: + * + * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] + * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] + * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] + * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] + */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Copy 4 new input samples into the state buffer. */ + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Typecast q15_t pointer to q31_t pointer for state reading in q31_t */ + px = pState; + + /* Typecast q15_t pointer to q31_t pointer for coefficient reading in q31_t */ + pb = pCoeffs; + + /* Read the first two samples from the state buffer: x[n-N], x[n-N-1] */ + x0 = read_q15x2_ia (&px); + + /* Read the third and forth samples from the state buffer: x[n-N-2], x[n-N-3] */ + x2 = read_q15x2_ia (&px); + + /* Loop over the number of taps. Unroll by a factor of 4. + Repeat until we've computed numTaps-(numTaps%4) coefficients. */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Read the first two coefficients using SIMD: b[N] and b[N-1] coefficients */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* acc0 += b[N] * x[n-N] + b[N-1] * x[n-N-1] */ + acc0 = __SMLALD(x0, c0, acc0); + + /* acc2 += b[N] * x[n-N-2] + b[N-1] * x[n-N-3] */ + acc2 = __SMLALD(x2, c0, acc2); + + /* pack x[n-N-1] and x[n-N-2] */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x2, x0, 0); +#else + x1 = __PKHBT(x0, x2, 0); +#endif + + /* Read state x[n-N-4], x[n-N-5] */ + x0 = read_q15x2_ia (&px); + + /* acc1 += b[N] * x[n-N-1] + b[N-1] * x[n-N-2] */ + acc1 = __SMLALDX(x1, c0, acc1); + + /* pack x[n-N-3] and x[n-N-4] */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x0, x2, 0); +#else + x1 = __PKHBT(x2, x0, 0); +#endif + + /* acc3 += b[N] * x[n-N-3] + b[N-1] * x[n-N-4] */ + acc3 = __SMLALDX(x1, c0, acc3); + + /* Read coefficients b[N-2], b[N-3] */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* acc0 += b[N-2] * x[n-N-2] + b[N-3] * x[n-N-3] */ + acc0 = __SMLALD(x2, c0, acc0); + + /* Read state x[n-N-6], x[n-N-7] with offset */ + x2 = read_q15x2_ia (&px); + + /* acc2 += b[N-2] * x[n-N-4] + b[N-3] * x[n-N-5] */ + acc2 = __SMLALD(x0, c0, acc2); + + /* acc1 += b[N-2] * x[n-N-3] + b[N-3] * x[n-N-4] */ + acc1 = __SMLALDX(x1, c0, acc1); + + /* pack x[n-N-5] and x[n-N-6] */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x2, x0, 0); +#else + x1 = __PKHBT(x0, x2, 0); +#endif + + /* acc3 += b[N-2] * x[n-N-5] + b[N-3] * x[n-N-6] */ + acc3 = __SMLALDX(x1, c0, acc3); + + /* Decrement tap count */ + tapCnt--; + } + + /* If the filter length is not a multiple of 4, compute the remaining filter taps. + This is always be 2 taps since the filter length is even. */ + if ((numTaps & 0x3U) != 0U) + { + /* Read last two coefficients */ + c0 = read_q15x2_ia ((q15_t **) &pb); + + /* Perform the multiply-accumulates */ + acc0 = __SMLALD(x0, c0, acc0); + acc2 = __SMLALD(x2, c0, acc2); + + /* pack state variables */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x2, x0, 0); +#else + x1 = __PKHBT(x0, x2, 0); +#endif + + /* Read last state variables */ + x0 = read_q15x2 (px); + + /* Perform the multiply-accumulates */ + acc1 = __SMLALDX(x1, c0, acc1); + + /* pack state variables */ +#ifndef ARM_MATH_BIG_ENDIAN + x1 = __PKHBT(x0, x2, 0); +#else + x1 = __PKHBT(x2, x0, 0); +#endif + + /* Perform the multiply-accumulates */ + acc3 = __SMLALDX(x1, c0, acc3); + } + + /* The results in the 4 accumulators are in 2.30 format. Convert to 1.15 with saturation. + Then store the 4 outputs in the destination buffer. */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pDst, __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16)); + write_q15x2_ia (&pDst, __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16)); +#else + write_q15x2_ia (&pDst, __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16)); + write_q15x2_ia (&pDst, __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Advance the state pointer by 4 to process the next group of 4 samples */ + pState = pState + 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining output samples */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of taps */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy two samples into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc0 = 0; + + /* Use SIMD to hold states and coefficients */ + px = pState; + pb = pCoeffs; + + tapCnt = numTaps >> 1U; + + do + { + acc0 += (q31_t) *px++ * *pb++; + acc0 += (q31_t) *px++ * *pb++; + + tapCnt--; + } + while (tapCnt > 0U); + + /* The result is in 2.30 format. Convert to 1.15 with saturation. + Then store the output in the destination buffer. */ + *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = (numTaps - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Calculate remaining number of copies */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy remaining data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of FIR group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q31.c new file mode 100644 index 0000000..c57371b --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q31.c @@ -0,0 +1,288 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_q31.c + * Description: Q31 FIR filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR + @{ + */ + +/** + @brief Processing function for 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 + @return none + + @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 log2(numTaps) bits. + After all multiply-accumulates are performed, the 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. + + @remark + Refer to \ref arm_fir_fast_q31() for a faster but less precise implementation of this filter. + */ + +void arm_fir_q31( + const arm_fir_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t *px; /* Temporary pointer for state buffer */ + const q31_t *pb; /* Temporary pointer for coefficient buffer */ + q63_t acc0; /* Accumulator */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, tapCnt, blkCnt; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q63_t acc1, acc2; /* Accumulators */ + q31_t x0, x1, x2; /* Temporary variables to hold state values */ + q31_t c0; /* Temporary variable to hold coefficient value */ +#endif + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 output values simultaneously. + * The variables acc0 ... acc3 hold output values that are being computed: + * + * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] + * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] + * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] + * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] + */ + + blkCnt = blockSize / 3; + + while (blkCnt > 0U) + { + /* Copy 3 new input samples into the state buffer. */ + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Read the first 2 samples from the state buffer: x[n-numTaps], x[n-numTaps-1] */ + x0 = *px++; + x1 = *px++; + + /* Loop unrolling: process 3 taps at a time. */ + tapCnt = numTaps / 3; + + while (tapCnt > 0U) + { + /* Read the b[numTaps] coefficient */ + c0 = *pb; + + /* Read x[n-numTaps-2] sample */ + x2 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += ((q63_t) x0 * c0); + acc1 += ((q63_t) x1 * c0); + acc2 += ((q63_t) x2 * c0); + + /* Read the coefficient and state */ + c0 = *(pb + 1U); + x0 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += ((q63_t) x1 * c0); + acc1 += ((q63_t) x2 * c0); + acc2 += ((q63_t) x0 * c0); + + /* Read the coefficient and state */ + c0 = *(pb + 2U); + x1 = *(px++); + + /* update coefficient pointer */ + pb += 3U; + + /* Perform the multiply-accumulates */ + acc0 += ((q63_t) x2 * c0); + acc1 += ((q63_t) x0 * c0); + acc2 += ((q63_t) x1 * c0); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + tapCnt = numTaps % 0x3U; + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *(pb++); + + /* Fetch 1 state variable */ + x2 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += ((q63_t) x0 * c0); + acc1 += ((q63_t) x1 * c0); + acc2 += ((q63_t) x2 * c0); + + /* Reuse the present sample states for next sample */ + x0 = x1; + x1 = x2; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Advance the state pointer by 3 to process the next group of 3 samples */ + pState = pState + 3; + + /* The result is in 2.30 format. Convert to 1.31 and store in destination buffer. */ + *pDst++ = (q31_t) (acc0 >> 31U); + *pDst++ = (q31_t) (acc1 >> 31U); + *pDst++ = (q31_t) (acc2 >> 31U); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining output samples */ + blkCnt = blockSize % 0x3U; + +#else + + /* Initialize blkCnt with number of taps */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc0 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize Coefficient pointer */ + pb = pCoeffs; + + i = numTaps; + + /* Perform the multiply-accumulates */ + do + { + /* acc = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] */ + acc0 += (q63_t) *px++ * *pb++; + + i--; + } while (i > 0U); + + /* Result is in 2.62 format. Convert to 1.31 and store in destination buffer. */ + *pDst++ = (q31_t) (acc0 >> 31U); + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = (numTaps - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Calculate remaining number of copies */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy remaining data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of FIR group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q7.c new file mode 100644 index 0000000..5f6d354 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_q7.c @@ -0,0 +1,323 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_q7.c + * Description: Q7 FIR filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR + @{ + */ + +/** + @brief Processing function for 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 + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 32-bit internal accumulator. + Both coefficients and state variables are represented in 1.7 format and multiplications yield a 2.14 result. + The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. + There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. + The accumulator is converted to 18.7 format by discarding the low 7 bits. + Finally, the result is truncated to 1.7 format. + */ + +void arm_fir_q7( + const arm_fir_instance_q7 * S, + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + q7_t *pState = S->pState; /* State pointer */ + const q7_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q7_t *pStateCurnt; /* Points to the current sample of the state */ + q7_t *px; /* Temporary pointer for state buffer */ + const q7_t *pb; /* Temporary pointer for coefficient buffer */ + q31_t acc0; /* Accumulators */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t i, tapCnt, blkCnt; /* Loop counters */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t acc1, acc2, acc3; /* Accumulators */ + q7_t x0, x1, x2, x3, c0; /* Temporary variables to hold state */ +#endif + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 output values simultaneously. + * The variables acc0 ... acc3 hold output values that are being computed: + * + * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] + * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] + * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] + * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] + */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Copy 4 new input samples into the state buffer. */ + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + *pStateCurnt++ = *pSrc++; + + /* Set all accumulators to zero */ + acc0 = 0; + acc1 = 0; + acc2 = 0; + acc3 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Read the first 3 samples from the state buffer: + * x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2] */ + x0 = *px++; + x1 = *px++; + x2 = *px++; + + /* Loop unrolling. Process 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + /* Loop over the number of taps. Unroll by a factor of 4. + Repeat until we've computed numTaps-4 coefficients. */ + while (tapCnt > 0U) + { + /* Read the b[numTaps] coefficient */ + c0 = *pb; + + /* Read x[n-numTaps-3] sample */ + x3 = *px; + + /* acc0 += b[numTaps] * x[n-numTaps] */ + acc0 += ((q15_t) x0 * c0); + + /* acc1 += b[numTaps] * x[n-numTaps-1] */ + acc1 += ((q15_t) x1 * c0); + + /* acc2 += b[numTaps] * x[n-numTaps-2] */ + acc2 += ((q15_t) x2 * c0); + + /* acc3 += b[numTaps] * x[n-numTaps-3] */ + acc3 += ((q15_t) x3 * c0); + + /* Read the b[numTaps-1] coefficient */ + c0 = *(pb + 1U); + + /* Read x[n-numTaps-4] sample */ + x0 = *(px + 1U); + + /* Perform the multiply-accumulates */ + acc0 += ((q15_t) x1 * c0); + acc1 += ((q15_t) x2 * c0); + acc2 += ((q15_t) x3 * c0); + acc3 += ((q15_t) x0 * c0); + + /* Read the b[numTaps-2] coefficient */ + c0 = *(pb + 2U); + + /* Read x[n-numTaps-5] sample */ + x1 = *(px + 2U); + + /* Perform the multiply-accumulates */ + acc0 += ((q15_t) x2 * c0); + acc1 += ((q15_t) x3 * c0); + acc2 += ((q15_t) x0 * c0); + acc3 += ((q15_t) x1 * c0); + + /* Read the b[numTaps-3] coefficients */ + c0 = *(pb + 3U); + + /* Read x[n-numTaps-6] sample */ + x2 = *(px + 3U); + + /* Perform the multiply-accumulates */ + acc0 += ((q15_t) x3 * c0); + acc1 += ((q15_t) x0 * c0); + acc2 += ((q15_t) x1 * c0); + acc3 += ((q15_t) x2 * c0); + + /* update coefficient pointer */ + pb += 4U; + px += 4U; + + /* Decrement loop counter */ + tapCnt--; + } + + /* If the filter length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Read coefficients */ + c0 = *(pb++); + + /* Fetch 1 state variable */ + x3 = *(px++); + + /* Perform the multiply-accumulates */ + acc0 += ((q15_t) x0 * c0); + acc1 += ((q15_t) x1 * c0); + acc2 += ((q15_t) x2 * c0); + acc3 += ((q15_t) x3 * c0); + + /* Reuse the present sample states for next sample */ + x0 = x1; + x1 = x2; + x2 = x3; + + /* Decrement loop counter */ + tapCnt--; + } + + /* The results in the 4 accumulators are in 2.62 format. Convert to 1.31 + Then store the 4 outputs in the destination buffer. */ + acc0 = __SSAT((acc0 >> 7U), 8); + *pDst++ = acc0; + acc1 = __SSAT((acc1 >> 7U), 8); + *pDst++ = acc1; + acc2 = __SSAT((acc2 >> 7U), 8); + *pDst++ = acc2; + acc3 = __SSAT((acc3 >> 7U), 8); + *pDst++ = acc3; + + /* Advance the state pointer by 4 to process the next group of 4 samples */ + pState = pState + 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining output samples */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of taps */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Copy one sample at a time into state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Set the accumulator to zero */ + acc0 = 0; + + /* Initialize state pointer */ + px = pState; + + /* Initialize Coefficient pointer */ + pb = pCoeffs; + + i = numTaps; + + /* Perform the multiply-accumulates */ + do + { + acc0 += (q15_t) * (px++) * (*(pb++)); + i--; + } while (i > 0U); + + /* The result is in 2.14 format. Convert to 1.7 + Then store the output in the destination buffer. */ + *pDst++ = __SSAT((acc0 >> 7U), 8); + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the state buffer */ + pStateCurnt = S->pState; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time */ + tapCnt = (numTaps - 1U) >> 2U; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Calculate remaining number of copies */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of taps */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + /* Copy remaining data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } + +} + +/** + @} end of FIR group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_f32.c new file mode 100644 index 0000000..f44f037 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_f32.c @@ -0,0 +1,341 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_sparse_f32.c + * Description: Floating-point sparse FIR filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup FIR_Sparse Finite Impulse Response (FIR) Sparse Filters + + This group of functions implements sparse FIR filters. + Sparse FIR filters are equivalent to standard FIR filters except that most of the coefficients are equal to zero. + Sparse filters are used for simulating reflections in communications and audio applications. + + There are separate functions for Q7, Q15, Q31, and floating-point data types. + The functions operate on blocks of input and output data and each call to the function processes + blockSize samples through the filter. pSrc and + pDst points to input and output arrays respectively containing blockSize values. + + @par Algorithm + The sparse filter instant structure contains an array of tap indices pTapDelay which specifies the locations of the non-zero coefficients. + This is in addition to the coefficient array b. + The implementation essentially skips the multiplications by zero and leads to an efficient realization. +
+      y[n] = b[0] * x[n-pTapDelay[0]] + b[1] * x[n-pTapDelay[1]] + b[2] * x[n-pTapDelay[2]] + ...+ b[numTaps-1] * x[n-pTapDelay[numTaps-1]]
+  
+ @par + \image html FIRSparse.gif "Sparse FIR filter. b[n] represents the filter coefficients" + @par + pCoeffs points to a coefficient array of size numTaps; + pTapDelay points to an array of nonzero indices and is also of size numTaps; + pState points to a state array of size maxDelay + blockSize, where + maxDelay is the largest offset value that is ever used in the pTapDelay array. + Some of the processing functions also require temporary working buffers. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter. + Coefficient and offset arrays may be shared among several instances while state variable arrays cannot be shared. + There are separate instance structure declarations for each of the 4 supported data types. + + @par Initialization Functions + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numTaps, pCoeffs, pTapDelay, maxDelay, stateIndex, pState. Also set all of the values in pState to zero. + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + Set the values in the state buffer to zeros before static initialization. + The code below statically initializes each of the 4 different data type filter instance structures +
+      arm_fir_sparse_instance_f32 S = {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};
+      arm_fir_sparse_instance_q31 S = {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};
+      arm_fir_sparse_instance_q15 S = {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};
+      arm_fir_sparse_instance_q7 S =  {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};
+  
+ + @par Fixed-Point Behavior + Care must be taken when using the fixed-point versions of the sparse FIR filter 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 FIR_Sparse + @{ + */ + +/** + @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 + @return none + */ + +void arm_fir_sparse_f32( + arm_fir_sparse_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + float32_t * pScratchIn, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + const float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *px; /* Scratch buffer pointer */ + float32_t *py = pState; /* Temporary pointers for state buffer */ + float32_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ + float32_t *pOut; /* Destination pointer */ + int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ + uint32_t delaySize = S->maxDelay + blockSize; /* state length */ + uint16_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + int32_t readIndex; /* Read index of the state buffer */ + uint32_t tapCnt, blkCnt; /* loop counters */ + float32_t coeff = *pCoeffs++; /* Read the first coefficient value */ + + + /* BlockSize of Input samples are copied into the state buffer */ + /* StateIndex points to the starting position to write in the state buffer */ + arm_circularWrite_f32((int32_t *) py, delaySize, &S->stateIndex, 1, (int32_t *) pSrc, 1, blockSize); + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pOut = pDst; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiplications and store in destination buffer */ + *pOut++ = *px++ * coeff; + + *pOut++ = *px++ * coeff; + + *pOut++ = *px++ * coeff; + + *pOut++ = *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiplication and store in destination buffer */ + *pOut++ = *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Loop over the number of taps. */ + tapCnt = (uint32_t) numTaps - 2U; + + while (tapCnt > 0U) + { + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pOut = pDst; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pOut++ += *px++ * coeff; + + *pOut++ += *px++ * coeff; + + *pOut++ += *px++ * coeff; + + *pOut++ += *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pOut++ += *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Decrement tap loop counter */ + tapCnt--; + } + + /* Compute last tap without the final read of pTapDelay */ + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pOut = pDst; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pOut++ += *px++ * coeff; + *pOut++ += *px++ * coeff; + *pOut++ += *px++ * coeff; + *pOut++ += *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pOut++ += *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of FIR_Sparse group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_f32.c new file mode 100644 index 0000000..7745e71 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_f32.c @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_sparse_init_f32.c + * Description: Floating-point sparse FIR filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Sparse + @{ + */ + +/** + @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 + @return none + + @par Details + pCoeffs holds the filter coefficients and has length numTaps. + pState holds the filter's state variables and must be of length + maxDelay + blockSize, where maxDelay + is the maximum number of delay line values. + blockSize is the + number of samples processed by the arm_fir_sparse_f32() function. + */ + +void arm_fir_sparse_init_f32( + arm_fir_sparse_instance_f32 * S, + uint16_t numTaps, + const float32_t * pCoeffs, + float32_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Assign TapDelay pointer */ + S->pTapDelay = pTapDelay; + + /* Assign MaxDelay */ + S->maxDelay = maxDelay; + + /* reset the stateIndex to 0 */ + S->stateIndex = 0U; + + /* Clear state buffer and size is always maxDelay + blockSize */ + memset(pState, 0, (maxDelay + blockSize) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR_Sparse group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q15.c new file mode 100644 index 0000000..d07d611 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q15.c @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_sparse_init_q15.c + * Description: Q15 sparse FIR filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Sparse + @{ + */ + +/** + @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 + @return none + + @par Details + pCoeffs holds the filter coefficients and has length numTaps. + pState holds the filter's state variables and must be of length + maxDelay + blockSize, where maxDelay + is the maximum number of delay line values. + blockSize is the + number of words processed by arm_fir_sparse_q15() function. + */ + +void arm_fir_sparse_init_q15( + arm_fir_sparse_instance_q15 * S, + uint16_t numTaps, + const q15_t * pCoeffs, + q15_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Assign TapDelay pointer */ + S->pTapDelay = pTapDelay; + + /* Assign MaxDelay */ + S->maxDelay = maxDelay; + + /* reset the stateIndex to 0 */ + S->stateIndex = 0U; + + /* Clear state buffer and size is always maxDelay + blockSize */ + memset(pState, 0, (maxDelay + blockSize) * sizeof(q15_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR_Sparse group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q31.c new file mode 100644 index 0000000..7c32cea --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q31.c @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_sparse_init_q31.c + * Description: Q31 sparse FIR filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Sparse + @{ + */ + +/** + @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 + @return none + + @par Details + pCoeffs holds the filter coefficients and has length numTaps. + pState holds the filter's state variables and must be of length + maxDelay + blockSize, where maxDelay + is the maximum number of delay line values. + blockSize is the number of words processed by arm_fir_sparse_q31() function. + */ + +void arm_fir_sparse_init_q31( + arm_fir_sparse_instance_q31 * S, + uint16_t numTaps, + const q31_t * pCoeffs, + q31_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Assign TapDelay pointer */ + S->pTapDelay = pTapDelay; + + /* Assign MaxDelay */ + S->maxDelay = maxDelay; + + /* reset the stateIndex to 0 */ + S->stateIndex = 0U; + + /* Clear state buffer and size is always maxDelay + blockSize */ + memset(pState, 0, (maxDelay + blockSize) * sizeof(q31_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR_Sparse group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q7.c new file mode 100644 index 0000000..98153f3 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_init_q7.c @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_sparse_init_q7.c + * Description: Q7 sparse FIR filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Sparse + @{ + */ + +/** + @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 + @return none + + @par Details + pCoeffs holds the filter coefficients and has length numTaps. + pState holds the filter's state variables and must be of length + maxDelay + blockSize, where maxDelay + is the maximum number of delay line values. + blockSize is the + number of samples processed by the arm_fir_sparse_q7() function. + */ + +void arm_fir_sparse_init_q7( + arm_fir_sparse_instance_q7 * S, + uint16_t numTaps, + const q7_t * pCoeffs, + q7_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Assign TapDelay pointer */ + S->pTapDelay = pTapDelay; + + /* Assign MaxDelay */ + S->maxDelay = maxDelay; + + /* reset the stateIndex to 0 */ + S->stateIndex = 0U; + + /* Clear state buffer and size is always maxDelay + blockSize */ + memset(pState, 0, (maxDelay + blockSize) * sizeof(q7_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of FIR_Sparse group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q15.c new file mode 100644 index 0000000..9cea93e --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q15.c @@ -0,0 +1,341 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_sparse_q15.c + * Description: Q15 sparse FIR filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Sparse + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The 1.15 x 1.15 multiplications yield a 2.30 result and these are added to a 2.30 accumulator. + Thus the full precision of the multiplications is maintained but there is only a single guard bit in the accumulator. + If the accumulator result overflows it will wrap around rather than saturate. + After all multiply-accumulates are performed, the 2.30 accumulator is truncated to 2.15 format and then saturated to 1.15 format. + In order to avoid overflows the input signal or coefficients must be scaled down by log2(numTaps) bits. + */ + +void arm_fir_sparse_q15( + arm_fir_sparse_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + q15_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + const q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *px; /* Temporary pointers for scratch buffer */ + q15_t *py = pState; /* Temporary pointers for state buffer */ + q15_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ + q15_t *pOut = pDst; /* Working pointer for output */ + int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ + uint32_t delaySize = S->maxDelay + blockSize; /* state length */ + uint16_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + int32_t readIndex; /* Read index of the state buffer */ + uint32_t tapCnt, blkCnt; /* loop counters */ + q31_t *pScr2 = pScratchOut; /* Working pointer for scratch buffer of output values */ + q15_t coeff = *pCoeffs++; /* Read the first coefficient value */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t in1, in2; /* Temporary variables */ +#endif + + /* BlockSize of Input samples are copied into the state buffer */ + /* StateIndex points to the starting position to write in the state buffer */ + arm_circularWrite_q15(py, (int32_t) delaySize, &S->stateIndex, 1,pSrc, 1, blockSize); + + /* Loop over the number of taps. */ + tapCnt = numTaps; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q15(py, (int32_t) delaySize, &readIndex, 1, + pb, pb, (int32_t) blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform multiplication and store in the scratch buffer */ + *pScratchOut++ = ((q31_t) *px++ * coeff); + *pScratchOut++ = ((q31_t) *px++ * coeff); + *pScratchOut++ = ((q31_t) *px++ * coeff); + *pScratchOut++ = ((q31_t) *px++ * coeff); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiplication and store in the scratch buffer */ + *pScratchOut++ = ((q31_t) *px++ * coeff); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Loop over the number of taps. */ + tapCnt = (uint32_t) numTaps - 2U; + + while (tapCnt > 0U) + { + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q15(py, (int32_t) delaySize, &readIndex, 1, + pb, pb, (int32_t) blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pScratchOut++ += (q31_t) *px++ * coeff; + *pScratchOut++ += (q31_t) *px++ * coeff; + *pScratchOut++ += (q31_t) *px++ * coeff; + *pScratchOut++ += (q31_t) *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pScratchOut++ += (q31_t) *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Decrement loop counter */ + tapCnt--; + } + + /* Compute last tap without the final read of pTapDelay */ + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q15(py, (int32_t) delaySize, &readIndex, 1, + pb, pb, (int32_t) blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pScratchOut++ += (q31_t) *px++ * coeff; + *pScratchOut++ += (q31_t) *px++ * coeff; + *pScratchOut++ += (q31_t) *px++ * coeff; + *pScratchOut++ += (q31_t) *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + *pScratchOut++ += (q31_t) *px++ * coeff; + + /* Decrement loop counter */ + blkCnt--; + } + + /* All the output values are in pScratchOut buffer. + Convert them into 1.15 format, saturate and store in the destination buffer. */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + in1 = *pScr2++; + in2 = *pScr2++; + +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT((q15_t) __SSAT(in1 >> 15, 16), (q15_t) __SSAT(in2 >> 15, 16), 16)); +#else + write_q15x2_ia (&pOut, __PKHBT((q15_t) __SSAT(in2 >> 15, 16), (q15_t) __SSAT(in1 >> 15, 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + in1 = *pScr2++; + in2 = *pScr2++; + +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pOut, __PKHBT((q15_t) __SSAT(in1 >> 15, 16), (q15_t) __SSAT(in2 >> 15, 16), 16)); +#else + write_q15x2_ia (&pOut, __PKHBT((q15_t) __SSAT(in2 >> 15, 16), (q15_t) __SSAT(in1 >> 15, 16), 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + *pOut++ = (q15_t) __SSAT(*pScr2++ >> 15, 16); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of FIR_Sparse group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q31.c new file mode 100644 index 0000000..86d3e1d --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q31.c @@ -0,0 +1,357 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_sparse_q31.c + * Description: Q31 sparse FIR filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Sparse + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The 1.31 x 1.31 multiplications are truncated to 2.30 format. + This leads to loss of precision on the intermediate multiplications and provides only a single guard bit. + If the accumulator result overflows, it wraps around rather than saturate. + In order to avoid overflows the input signal or coefficients must be scaled down by log2(numTaps) bits. + */ + +void arm_fir_sparse_q31( + arm_fir_sparse_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + q31_t * pScratchIn, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + const q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *px; /* Scratch buffer pointer */ + q31_t *py = pState; /* Temporary pointers for state buffer */ + q31_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ + q31_t *pOut; /* Destination pointer */ + int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ + uint32_t delaySize = S->maxDelay + blockSize; /* state length */ + uint16_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + int32_t readIndex; /* Read index of the state buffer */ + uint32_t tapCnt, blkCnt; /* loop counters */ + q31_t coeff = *pCoeffs++; /* Read the first coefficient value */ + q31_t in; + q63_t out; /* Temporary output variable */ + + + /* BlockSize of Input samples are copied into the state buffer */ + /* StateIndex points to the starting position to write in the state buffer */ + arm_circularWrite_f32((int32_t *) py, delaySize, &S->stateIndex, 1, + (int32_t *) pSrc, 1, blockSize); + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pOut = pDst; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiplications and store in destination buffer */ + *pOut++ = (q31_t) (((q63_t) *px++ * coeff) >> 32); + + *pOut++ = (q31_t) (((q63_t) *px++ * coeff) >> 32); + + *pOut++ = (q31_t) (((q63_t) *px++ * coeff) >> 32); + + *pOut++ = (q31_t) (((q63_t) *px++ * coeff) >> 32); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiplication and store in destination buffer */ + *pOut++ = (q31_t) (((q63_t) *px++ * coeff) >> 32); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Loop over the number of taps. */ + tapCnt = (uint32_t) numTaps - 2U; + + while (tapCnt > 0U) + { + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pOut = pDst; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + out = *pOut; + out += ((q63_t) *px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + out = *pOut; + out += ((q63_t) *px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + out = *pOut; + out += ((q63_t) *px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + out = *pOut; + out += ((q63_t) *px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + out = *pOut; + out += ((q63_t) *px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Decrement tap loop counter */ + tapCnt--; + } + + /* Compute last tap without the final read of pTapDelay */ + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, + (int32_t *) pb, (int32_t *) pb, blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pOut = pDst; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + out = *pOut; + out += ((q63_t) * px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + out = *pOut; + out += ((q63_t) * px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + out = *pOut; + out += ((q63_t) * px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + out = *pOut; + out += ((q63_t) * px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + out = *pOut; + out += ((q63_t) *px++ * coeff) >> 32; + *pOut++ = (q31_t) (out); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Working output pointer is updated */ + pOut = pDst; + + /* Output is converted into 1.31 format. */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + in = *pOut << 1; + *pOut++ = in; + in = *pOut << 1; + *pOut++ = in; + in = *pOut << 1; + *pOut++ = in; + in = *pOut << 1; + *pOut++ = in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + in = *pOut << 1; + *pOut++ = in; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of FIR_Sparse group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q7.c b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q7.c new file mode 100644 index 0000000..7a2b57f --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_fir_sparse_q7.c @@ -0,0 +1,341 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fir_sparse_q7.c + * Description: Q7 sparse FIR filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup FIR_Sparse + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 32-bit internal accumulator. + Both coefficients and state variables are represented in 1.7 format and multiplications yield a 2.14 result. + The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. + There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. + The accumulator is then converted to 18.7 format by discarding the low 7 bits. + Finally, the result is truncated to 1.7 format. + */ + +void arm_fir_sparse_q7( + arm_fir_sparse_instance_q7 * S, + const q7_t * pSrc, + q7_t * pDst, + q7_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize) +{ + q7_t *pState = S->pState; /* State pointer */ + const q7_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q7_t *px; /* Scratch buffer pointer */ + q7_t *py = pState; /* Temporary pointers for state buffer */ + q7_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ + q7_t *pOut = pDst; /* Destination pointer */ + int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ + uint32_t delaySize = S->maxDelay + blockSize; /* state length */ + uint16_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + int32_t readIndex; /* Read index of the state buffer */ + uint32_t tapCnt, blkCnt; /* loop counters */ + q31_t *pScr2 = pScratchOut; /* Working pointer for scratch buffer of output values */ + q31_t in; + q7_t coeff = *pCoeffs++; /* Read the coefficient value */ + +#if defined (ARM_MATH_LOOPUNROLL) + q7_t in1, in2, in3, in4; +#endif + + /* BlockSize of Input samples are copied into the state buffer */ + /* StateIndex points to the starting position to write in the state buffer */ + arm_circularWrite_q7(py, (int32_t) delaySize, &S->stateIndex, 1, pSrc, 1, blockSize); + + /* Loop over the number of taps. */ + tapCnt = numTaps; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, + pb, pb, (int32_t) blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform multiplication and store in the scratch buffer */ + *pScratchOut++ = ((q31_t) *px++ * coeff); + *pScratchOut++ = ((q31_t) *px++ * coeff); + *pScratchOut++ = ((q31_t) *px++ * coeff); + *pScratchOut++ = ((q31_t) *px++ * coeff); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiplication and store in the scratch buffer */ + *pScratchOut++ = ((q31_t) *px++ * coeff); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Loop over the number of taps. */ + tapCnt = (uint32_t) numTaps - 2U; + + while (tapCnt > 0U) + { + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, + pb, pb, (int32_t) blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + in = *pScratchOut + ((q31_t) * px++ * coeff); + *pScratchOut++ = in; + in = *pScratchOut + ((q31_t) * px++ * coeff); + *pScratchOut++ = in; + in = *pScratchOut + ((q31_t) * px++ * coeff); + *pScratchOut++ = in; + in = *pScratchOut + ((q31_t) * px++ * coeff); + *pScratchOut++ = in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + in = *pScratchOut + ((q31_t) *px++ * coeff); + *pScratchOut++ = in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Load the coefficient value and + * increment the coefficient buffer for the next set of state values */ + coeff = *pCoeffs++; + + /* Read Index, from where the state buffer should be read, is calculated. */ + readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; + + /* Wraparound of readIndex */ + if (readIndex < 0) + { + readIndex += (int32_t) delaySize; + } + + /* Decrement loop counter */ + tapCnt--; + } + + /* Compute last tap without the final read of pTapDelay */ + + /* Working pointer for state buffer is updated */ + py = pState; + + /* blockSize samples are read from the state buffer */ + arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, + pb, pb, (int32_t) blockSize, 1, blockSize); + + /* Working pointer for the scratch buffer of state values */ + px = pb; + + /* Working pointer for scratch buffer of output values */ + pScratchOut = pScr2; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + in = *pScratchOut + ((q31_t) *px++ * coeff); + *pScratchOut++ = in; + in = *pScratchOut + ((q31_t) *px++ * coeff); + *pScratchOut++ = in; + in = *pScratchOut + ((q31_t) *px++ * coeff); + *pScratchOut++ = in; + in = *pScratchOut + ((q31_t) *px++ * coeff); + *pScratchOut++ = in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Perform Multiply-Accumulate */ + in = *pScratchOut + ((q31_t) *px++ * coeff); + *pScratchOut++ = in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* All the output values are in pScratchOut buffer. + Convert them into 1.15 format, saturate and store in the destination buffer. */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time. */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + in1 = (q7_t) __SSAT(*pScr2++ >> 7, 8); + in2 = (q7_t) __SSAT(*pScr2++ >> 7, 8); + in3 = (q7_t) __SSAT(*pScr2++ >> 7, 8); + in4 = (q7_t) __SSAT(*pScr2++ >> 7, 8); + + write_q7x4_ia (&pOut, __PACKq7(in1, in2, in3, in4)); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + *pOut++ = (q7_t) __SSAT(*pScr2++ >> 7, 8); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of FIR_Sparse group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_f32.c new file mode 100644 index 0000000..c48efe3 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_f32.c @@ -0,0 +1,354 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_iir_lattice_f32.c + * Description: Floating-point IIR Lattice filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup IIR_Lattice Infinite Impulse Response (IIR) Lattice Filters + + This set of functions implements lattice filters + for Q15, Q31 and floating-point data types. Lattice filters are used in a + variety of adaptive filter applications. The filter structure has feedforward and + feedback components and the net impulse response is infinite length. + The functions operate on blocks + of input and output data and each call to the function processes + blockSize samples through the filter. pSrc and + pDst point to input and output arrays containing blockSize values. + + @par Algorithm + \image html IIRLattice.gif "Infinite Impulse Response Lattice filter" + @par +
+      fN(n)   = x(n)
+      fm-1(n) = fm(n) - km * gm-1(n-1)   for m = N, N-1, ..., 1
+      gm(n)   = km * fm-1(n) + gm-1(n-1) for m = N, N-1, ..., 1
+      y(n)    = vN * gN(n) + vN-1 * gN-1(n) + ...+ v0 * g0(n)
+  
+ @par + pkCoeffs points to array of reflection coefficients of size numStages. + Reflection Coefficients are stored in time-reversed order. + @par +
+     {kN, kN-1, ..., k1}
+  
+ @par + pvCoeffs points to the array of ladder coefficients of size (numStages+1). + Ladder coefficients are stored in time-reversed order. +
+      {vN, vN-1, ..., v0}
+  
+ @par + pState points to a state array of size numStages + blockSize. + The state variables shown in the figure above (the g values) are stored in the pState array. + The state variables are updated after each block of data is processed; the coefficients are untouched. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter. + Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. + There are separate instance structure declarations for each of the 3 supported data types. + + @par Initialization Functions + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numStages, pkCoeffs, pvCoeffs, pState. Also set all of the values in pState to zero. + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + Set the values in the state buffer to zeros and then manually initialize the instance structure as follows: +
+      arm_iir_lattice_instance_f32 S = {numStages, pState, pkCoeffs, pvCoeffs};
+      arm_iir_lattice_instance_q31 S = {numStages, pState, pkCoeffs, pvCoeffs};
+      arm_iir_lattice_instance_q15 S = {numStages, pState, pkCoeffs, pvCoeffs};
+  
+ @par + where numStages is the number of stages in the filter; pState points to the state buffer array; + pkCoeffs points to array of the reflection coefficients; pvCoeffs points to the array of ladder coefficients. + + @par Fixed-Point Behavior + Care must be taken when using the fixed-point versions of the IIR lattice filter 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 IIR_Lattice + @{ + */ + +/** + @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 + @return none + */ + +void arm_iir_lattice_f32( + const arm_iir_lattice_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + float32_t *pStateCur; /* State current pointer */ + float32_t acc; /* Accumlator */ + float32_t fnext1, fnext2, gcurr1, gnext; /* Temporary variables for lattice stages */ + float32_t *px1, *px2, *pk, *pv; /* Temporary pointers for state and coef */ + uint32_t numStages = S->numStages; /* Number of stages */ + uint32_t blkCnt, tapCnt; /* Temporary variables for counts */ + +#if defined (ARM_MATH_LOOPUNROLL) + float32_t gcurr2; /* Temporary variables for lattice stages */ + float32_t k1, k2; + float32_t v1, v2, v3, v4; +#endif + + /* initialise loop count */ + blkCnt = blockSize; + + /* Sample processing */ + while (blkCnt > 0U) + { + /* Read Sample from input buffer */ + /* fN(n) = x(n) */ + fnext2 = *pSrc++; + + /* Initialize Ladder coeff pointer */ + pv = &S->pvCoeffs[0]; + + /* Initialize Reflection coeff pointer */ + pk = &S->pkCoeffs[0]; + + /* Initialize state read pointer */ + px1 = pState; + + /* Initialize state write pointer */ + px2 = pState; + + /* Set accumulator to zero */ + acc = 0.0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = (numStages) >> 2U; + + while (tapCnt > 0U) + { + /* Read gN-1(n-1) from state buffer */ + gcurr1 = *px1; + + /* read reflection coefficient kN */ + k1 = *pk; + + /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ + fnext1 = fnext2 - (k1 * gcurr1); + + /* read ladder coefficient vN */ + v1 = *pv; + + /* read next reflection coefficient kN-1 */ + k2 = *(pk + 1U); + + /* Read gN-2(n-1) from state buffer */ + gcurr2 = *(px1 + 1U); + + /* read next ladder coefficient vN-1 */ + v2 = *(pv + 1U); + + /* fN-2(n) = fN-1(n) - kN-1 * gN-2(n-1) */ + fnext2 = fnext1 - (k2 * gcurr2); + + /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ + gnext = gcurr1 + (k1 * fnext1); + + /* read reflection coefficient kN-2 */ + k1 = *(pk + 2U); + + /* write gN(n) into state for next sample processing */ + *px2++ = gnext; + + /* Read gN-3(n-1) from state buffer */ + gcurr1 = *(px1 + 2U); + + /* y(n) += gN(n) * vN */ + acc += (gnext * v1); + + /* fN-3(n) = fN-2(n) - kN-2 * gN-3(n-1) */ + fnext1 = fnext2 - (k1 * gcurr1); + + /* gN-1(n) = kN-1 * fN-2(n) + gN-2(n-1) */ + gnext = gcurr2 + (k2 * fnext2); + + /* Read gN-4(n-1) from state buffer */ + gcurr2 = *(px1 + 3U); + + /* y(n) += gN-1(n) * vN-1 */ + acc += (gnext * v2); + + /* read reflection coefficient kN-3 */ + k2 = *(pk + 3U); + + /* write gN-1(n) into state for next sample processing */ + *px2++ = gnext; + + /* fN-4(n) = fN-3(n) - kN-3 * gN-4(n-1) */ + fnext2 = fnext1 - (k2 * gcurr2); + + /* gN-2(n) = kN-2 * fN-3(n) + gN-3(n-1) */ + gnext = gcurr1 + (k1 * fnext1); + + /* read ladder coefficient vN-2 */ + v3 = *(pv + 2U); + + /* y(n) += gN-2(n) * vN-2 */ + acc += (gnext * v3); + + /* write gN-2(n) into state for next sample processing */ + *px2++ = gnext; + + /* update pointer */ + pk += 4U; + + /* gN-3(n) = kN-3 * fN-4(n) + gN-4(n-1) */ + gnext = (fnext2 * k2) + gcurr2; + + /* read next ladder coefficient vN-3 */ + v4 = *(pv + 3U); + + /* y(n) += gN-4(n) * vN-4 */ + acc += (gnext * v4); + + /* write gN-3(n) into state for next sample processing */ + *px2++ = gnext; + + /* update pointers */ + px1 += 4U; + pv += 4U; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numStages % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numStages; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + gcurr1 = *px1++; + /* Process sample for last taps */ + fnext1 = fnext2 - ((*pk) * gcurr1); + gnext = (fnext1 * (*pk++)) + gcurr1; + /* Output samples for last taps */ + acc += (gnext * (*pv++)); + *px2++ = gnext; + fnext2 = fnext1; + + /* Decrement loop counter */ + tapCnt--; + } + + /* y(n) += g0(n) * v0 */ + acc += (fnext2 * (*pv)); + + *px2++ = fnext2; + + /* write out into pDst */ + *pDst++ = acc; + + /* Advance the state pointer by 4 to process the next group of 4 samples */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. Now copy last S->numStages samples to start of the buffer + for the preperation of next frame process */ + + /* Points to the start of the state buffer */ + pStateCur = &S->pState[0]; + pState = &S->pState[blockSize]; + + /* Copy data */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numStages >> 2U; + + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numStages % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + tapCnt = numStages; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of IIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_f32.c new file mode 100644 index 0000000..bd9f933 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_f32.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_iir_lattice_init_f32.c + * Description: Floating-point IIR lattice filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup IIR_Lattice + @{ + */ + +/** + @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 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 + @return none + */ + +void arm_iir_lattice_init_f32( + arm_iir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t * pkCoeffs, + float32_t * pvCoeffs, + float32_t * pState, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numStages = numStages; + + /* Assign reflection coefficient pointer */ + S->pkCoeffs = pkCoeffs; + + /* Assign ladder coefficient pointer */ + S->pvCoeffs = pvCoeffs; + + /* Clear state buffer and size is always blockSize + numStages */ + memset(pState, 0, (numStages + blockSize) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of IIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q15.c new file mode 100644 index 0000000..01abf48 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q15.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_iir_lattice_init_q15.c + * Description: Q15 IIR lattice filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup IIR_Lattice + @{ + */ + +/** + @brief Initialization function for the Q15 IIR lattice filter. + @param[in] S points to an instance of the 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 + @return none + */ + +void arm_iir_lattice_init_q15( + arm_iir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t * pkCoeffs, + q15_t * pvCoeffs, + q15_t * pState, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numStages = numStages; + + /* Assign reflection coefficient pointer */ + S->pkCoeffs = pkCoeffs; + + /* Assign ladder coefficient pointer */ + S->pvCoeffs = pvCoeffs; + + /* Clear state buffer and size is always blockSize + numStages */ + memset(pState, 0, (numStages + blockSize) * sizeof(q15_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of IIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q31.c new file mode 100644 index 0000000..b472f6c --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_init_q31.c @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_iir_lattice_init_q31.c + * Description: Initialization function for the Q31 IIR lattice filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup IIR_Lattice + @{ + */ + +/** + @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 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 + @return none + */ + +void arm_iir_lattice_init_q31( + arm_iir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t * pkCoeffs, + q31_t * pvCoeffs, + q31_t * pState, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numStages = numStages; + + /* Assign reflection coefficient pointer */ + S->pkCoeffs = pkCoeffs; + + /* Assign ladder coefficient pointer */ + S->pvCoeffs = pvCoeffs; + + /* Clear state buffer and size is always blockSize + numStages */ + memset(pState, 0, (numStages + blockSize) * sizeof(q31_t)); + + /* Assign state pointer */ + S->pState = pState; +} + +/** + @} end of IIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q15.c new file mode 100644 index 0000000..9dbea81 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q15.c @@ -0,0 +1,396 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_iir_lattice_q15.c + * Description: Q15 IIR Lattice filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup IIR_Lattice + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. + Both coefficients 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. + */ + +void arm_iir_lattice_q15( + const arm_iir_lattice_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + q15_t *pStateCur; /* State current pointer */ + q31_t fcurr, fnext = 0, gcurr = 0, gnext; /* Temporary variables for lattice stages */ + q63_t acc; /* Accumlator */ + q15_t *px1, *px2, *pk, *pv; /* Temporary pointers for state and coef */ + uint32_t numStages = S->numStages; /* Number of stages */ + uint32_t blkCnt, tapCnt; /* Temporary variables for counts */ + q15_t out; /* Temporary variable for output */ + +#if defined (ARM_MATH_DSP) && defined (ARM_MATH_LOOPUNROLL) + q15_t gnext1, gnext2; /* Temporary variables for lattice stages */ + q31_t v; /* Temporary variable for ladder coefficient */ +#endif + + /* initialise loop count */ + blkCnt = blockSize; + +#if defined (ARM_MATH_DSP) + + /* Sample processing */ + while (blkCnt > 0U) + { + /* Read Sample from input buffer */ + /* fN(n) = x(n) */ + fcurr = *pSrc++; + + /* Initialize Ladder coeff pointer */ + pv = &S->pvCoeffs[0]; + + /* Initialize Reflection coeff pointer */ + pk = &S->pkCoeffs[0]; + + /* Initialize state read pointer */ + px1 = pState; + + /* Initialize state write pointer */ + px2 = pState; + + /* Set accumulator to zero */ + acc = 0; + + /* Process sample for first tap */ + gcurr = *px1++; + /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ + fnext = fcurr - (((q31_t) gcurr * (*pk)) >> 15); + fnext = __SSAT(fnext, 16); + + /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ + gnext = (((q31_t) fnext * (*pk++)) >> 15) + gcurr; + gnext = __SSAT(gnext, 16); + + /* write gN(n) into state for next sample processing */ + *px2++ = (q15_t) gnext; + + /* y(n) += gN(n) * vN */ + acc += (q31_t) ((gnext * (*pv++))); + + /* Update f values for next coefficient processing */ + fcurr = fnext; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = (numStages - 1U) >> 2U; + + while (tapCnt > 0U) + { + /* Process sample for 2nd, 6th ...taps */ + /* Read gN-2(n-1) from state buffer */ + gcurr = *px1++; + /* fN-2(n) = fN-1(n) - kN-1 * gN-2(n-1) */ + fnext = fcurr - (((q31_t) gcurr * (*pk)) >> 15); + fnext = __SSAT(fnext, 16); + /* gN-1(n) = kN-1 * fN-2(n) + gN-2(n-1) */ + gnext = (((q31_t) fnext * (*pk++)) >> 15) + gcurr; + gnext1 = (q15_t) __SSAT(gnext, 16); + /* write gN-1(n) into state for next sample processing */ + *px2++ = (q15_t) gnext1; + + /* Process sample for 3nd, 7th ...taps */ + /* Read gN-3(n-1) from state buffer */ + gcurr = *px1++; + /* Process sample for 3rd, 7th .. taps */ + /* fN-3(n) = fN-2(n) - kN-2 * gN-3(n-1) */ + fcurr = fnext - (((q31_t) gcurr * (*pk)) >> 15); + fcurr = __SSAT(fcurr, 16); + /* gN-2(n) = kN-2 * fN-3(n) + gN-3(n-1) */ + gnext = (((q31_t) fcurr * (*pk++)) >> 15) + gcurr; + gnext2 = (q15_t) __SSAT(gnext, 16); + /* write gN-2(n) into state */ + *px2++ = (q15_t) gnext2; + + /* Read vN-1 and vN-2 at a time */ + v = read_q15x2_ia (&pv); + + /* Pack gN-1(n) and gN-2(n) */ + +#ifndef ARM_MATH_BIG_ENDIAN + gnext = __PKHBT(gnext1, gnext2, 16); +#else + gnext = __PKHBT(gnext2, gnext1, 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* y(n) += gN-1(n) * vN-1 */ + /* process for gN-5(n) * vN-5, gN-9(n) * vN-9 ... */ + /* y(n) += gN-2(n) * vN-2 */ + /* process for gN-6(n) * vN-6, gN-10(n) * vN-10 ... */ + acc = __SMLALD(gnext, v, acc); + + /* Process sample for 4th, 8th ...taps */ + /* Read gN-4(n-1) from state buffer */ + gcurr = *px1++; + /* Process sample for 4th, 8th .. taps */ + /* fN-4(n) = fN-3(n) - kN-3 * gN-4(n-1) */ + fnext = fcurr - (((q31_t) gcurr * (*pk)) >> 15); + fnext = __SSAT(fnext, 16); + /* gN-3(n) = kN-3 * fN-1(n) + gN-1(n-1) */ + gnext = (((q31_t) fnext * (*pk++)) >> 15) + gcurr; + gnext1 = (q15_t) __SSAT(gnext, 16); + /* write gN-3(n) for the next sample process */ + *px2++ = (q15_t) gnext1; + + /* Process sample for 5th, 9th ...taps */ + /* Read gN-5(n-1) from state buffer */ + gcurr = *px1++; + /* Process sample for 5th, 9th .. taps */ + /* fN-5(n) = fN-4(n) - kN-4 * gN-5(n-1) */ + fcurr = fnext - (((q31_t) gcurr * (*pk)) >> 15); + fcurr = __SSAT(fcurr, 16); + /* gN-4(n) = kN-4 * fN-5(n) + gN-5(n-1) */ + gnext = (((q31_t) fcurr * (*pk++)) >> 15) + gcurr; + gnext2 = (q15_t) __SSAT(gnext, 16); + /* write gN-4(n) for the next sample process */ + *px2++ = (q15_t) gnext2; + + /* Read vN-3 and vN-4 at a time */ + v = read_q15x2_ia (&pv); + + /* Pack gN-3(n) and gN-4(n) */ +#ifndef ARM_MATH_BIG_ENDIAN + gnext = __PKHBT(gnext1, gnext2, 16); +#else + gnext = __PKHBT(gnext2, gnext1, 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* y(n) += gN-4(n) * vN-4 */ + /* process for gN-8(n) * vN-8, gN-12(n) * vN-12 ... */ + /* y(n) += gN-3(n) * vN-3 */ + /* process for gN-7(n) * vN-7, gN-11(n) * vN-11 ... */ + acc = __SMLALD(gnext, v, acc); + + /* Decrement loop counter */ + tapCnt--; + } + + fnext = fcurr; + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numStages - 1U) % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + tapCnt = (numStages - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + gcurr = *px1++; + /* Process sample for last taps */ + fnext = fcurr - (((q31_t) gcurr * (*pk)) >> 15); + fnext = __SSAT(fnext, 16); + gnext = (((q31_t) fnext * (*pk++)) >> 15) + gcurr; + gnext = __SSAT(gnext, 16); + + /* Output samples for last taps */ + acc += (q31_t) (((q31_t) gnext * (*pv++))); + *px2++ = (q15_t) gnext; + fcurr = fnext; + + /* Decrement loop counter */ + tapCnt--; + } + + /* y(n) += g0(n) * v0 */ + acc += (q31_t) (((q31_t) fnext * (*pv++))); + + out = (q15_t) __SSAT(acc >> 15, 16); + *px2++ = (q15_t) fnext; + + /* write out into pDst */ + *pDst++ = out; + + /* Advance the state pointer by 4 to process the next group of 4 samples */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. Now copy last S->numStages samples to start of the buffer + for the preperation of next frame process */ + + /* Points to the start of the state buffer */ + pStateCur = &S->pState[0]; + pState = &S->pState[blockSize]; + + /* copy data */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numStages >> 2U; + + while (tapCnt > 0U) + { + write_q15x2_ia (&pStateCur, read_q15x2_ia (&pState)); + write_q15x2_ia (&pStateCur, read_q15x2_ia (&pState)); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numStages % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + tapCnt = (numStages - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#else /* #if defined (ARM_MATH_DSP) */ + + /* Sample processing */ + while (blkCnt > 0U) + { + /* Read Sample from input buffer */ + /* fN(n) = x(n) */ + fcurr = *pSrc++; + + /* Initialize Ladder coeff pointer */ + pv = &S->pvCoeffs[0]; + + /* Initialize Reflection coeff pointer */ + pk = &S->pkCoeffs[0]; + + /* Initialize state read pointer */ + px1 = pState; + + /* Initialize state write pointer */ + px2 = pState; + + /* Set accumulator to zero */ + acc = 0; + + tapCnt = numStages; + + while (tapCnt > 0U) + { + gcurr = *px1++; + /* Process sample */ + /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ + fnext = fcurr - ((gcurr * (*pk)) >> 15); + fnext = __SSAT(fnext, 16); + + /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ + gnext = ((fnext * (*pk++)) >> 15) + gcurr; + gnext = __SSAT(gnext, 16); + + /* Output samples */ + /* y(n) += gN(n) * vN */ + acc += (q31_t) ((gnext * (*pv++))); + + /* write gN(n) into state for next sample processing */ + *px2++ = (q15_t) gnext; + + /* Update f values for next coefficient processing */ + fcurr = fnext; + + tapCnt--; + } + + /* y(n) += g0(n) * v0 */ + acc += (q31_t) ((fnext * (*pv++))); + + out = (q15_t) __SSAT(acc >> 15, 16); + *px2++ = (q15_t) fnext; + + /* write out into pDst */ + *pDst++ = out; + + /* Advance the state pointer by 1 to process the next group of samples */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. Now copy last S->numStages samples to start of the buffer + for the preperation of next frame process */ + + /* Points to the start of the state buffer */ + pStateCur = &S->pState[0]; + pState = &S->pState[blockSize]; + + tapCnt = numStages; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + +/** + @} end of IIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q31.c new file mode 100644 index 0000000..c4b9a76 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_iir_lattice_q31.c @@ -0,0 +1,356 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_iir_lattice_q31.c + * Description: Q31 IIR Lattice filter processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup IIR_Lattice + @{ + */ + +/** + @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 + @return none + + @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*log2(numStages) bits. + After all multiply-accumulates are performed, the 2.62 accumulator is saturated to 1.32 format and then truncated to 1.31 format. + */ + +void arm_iir_lattice_q31( + const arm_iir_lattice_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + q31_t *pStateCur; /* State current pointer */ + q31_t fcurr, fnext = 0, gcurr = 0, gnext; /* Temporary variables for lattice stages */ + q63_t acc; /* Accumlator */ + q31_t *px1, *px2, *pk, *pv; /* Temporary pointers for state and coef */ + uint32_t numStages = S->numStages; /* Number of stages */ + uint32_t blkCnt, tapCnt; /* Temporary variables for counts */ + + + /* initialise loop count */ + blkCnt = blockSize; + +#if defined (ARM_MATH_DSP) + + /* Sample processing */ + while (blkCnt > 0U) + { + /* Read Sample from input buffer */ + /* fN(n) = x(n) */ + fcurr = *pSrc++; + + /* Initialize Ladder coeff pointer */ + pv = &S->pvCoeffs[0]; + + /* Initialize Reflection coeff pointer */ + pk = &S->pkCoeffs[0]; + + /* Initialize state read pointer */ + px1 = pState; + + /* Initialize state write pointer */ + px2 = pState; + + /* Set accumulator to zero */ + acc = 0; + + /* Process sample for first tap */ + gcurr = *px1++; + /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ + fnext = __QSUB(fcurr, (q31_t) (((q63_t) gcurr * (*pk )) >> 31)); + + /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ + gnext = __QADD(gcurr, (q31_t) (((q63_t) fnext * (*pk++)) >> 31)); + + /* write gN-1(n-1) into state for next sample processing */ + *px2++ = gnext; + + /* y(n) += gN(n) * vN */ + acc += ((q63_t) gnext * *pv++); + + /* Update f values for next coefficient processing */ + fcurr = fnext; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = (numStages - 1U) >> 2U; + + while (tapCnt > 0U) + { + /* Process sample for 2nd, 6th ...taps */ + /* Read gN-2(n-1) from state buffer */ + gcurr = *px1++; + /* fN-2(n) = fN-1(n) - kN-1 * gN-2(n-1) */ + fnext = __QSUB(fcurr, (q31_t) (((q63_t) gcurr * (*pk )) >> 31)); + /* gN-1(n) = kN-1 * fN-2(n) + gN-2(n-1) */ + gnext = __QADD(gcurr, (q31_t) (((q63_t) fnext * (*pk++)) >> 31)); + /* y(n) += gN-1(n) * vN-1 */ + /* process for gN-5(n) * vN-5, gN-9(n) * vN-9 ... */ + acc += ((q63_t) gnext * *pv++); + /* write gN-1(n) into state for next sample processing */ + *px2++ = gnext; + + /* Process sample for 3nd, 7th ...taps */ + /* Read gN-3(n-1) from state buffer */ + gcurr = *px1++; + /* Process sample for 3rd, 7th .. taps */ + /* fN-3(n) = fN-2(n) - kN-2 * gN-3(n-1) */ + fcurr = __QSUB(fnext, (q31_t) (((q63_t) gcurr * (*pk )) >> 31)); + /* gN-2(n) = kN-2 * fN-3(n) + gN-3(n-1) */ + gnext = __QADD(gcurr, (q31_t) (((q63_t) fcurr * (*pk++)) >> 31)); + /* y(n) += gN-2(n) * vN-2 */ + /* process for gN-6(n) * vN-6, gN-10(n) * vN-10 ... */ + acc += ((q63_t) gnext * *pv++); + /* write gN-2(n) into state for next sample processing */ + *px2++ = gnext; + + /* Process sample for 4th, 8th ...taps */ + /* Read gN-4(n-1) from state buffer */ + gcurr = *px1++; + /* Process sample for 4th, 8th .. taps */ + /* fN-4(n) = fN-3(n) - kN-3 * gN-4(n-1) */ + fnext = __QSUB(fcurr, (q31_t) (((q63_t) gcurr * (*pk )) >> 31)); + /* gN-3(n) = kN-3 * fN-4(n) + gN-4(n-1) */ + gnext = __QADD(gcurr, (q31_t) (((q63_t) fnext * (*pk++)) >> 31)); + /* y(n) += gN-3(n) * vN-3 */ + /* process for gN-7(n) * vN-7, gN-11(n) * vN-11 ... */ + acc += ((q63_t) gnext * *pv++); + /* write gN-3(n) into state for next sample processing */ + *px2++ = gnext; + + /* Process sample for 5th, 9th ...taps */ + /* Read gN-5(n-1) from state buffer */ + gcurr = *px1++; + /* Process sample for 5th, 9th .. taps */ + /* fN-5(n) = fN-4(n) - kN-4 * gN-1(n-1) */ + fcurr = __QSUB(fnext, (q31_t) (((q63_t) gcurr * (*pk )) >> 31)); + /* gN-4(n) = kN-4 * fN-5(n) + gN-5(n-1) */ + gnext = __QADD(gcurr, (q31_t) (((q63_t) fcurr * (*pk++)) >> 31)); + /* y(n) += gN-4(n) * vN-4 */ + /* process for gN-8(n) * vN-8, gN-12(n) * vN-12 ... */ + acc += ((q63_t) gnext * *pv++); + + /* write gN-4(n) into state for next sample processing */ + *px2++ = gnext; + + /* Decrement loop counter */ + tapCnt--; + } + + fnext = fcurr; + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numStages - 1U) % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + tapCnt = (numStages - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + gcurr = *px1++; + /* Process sample for last taps */ + fnext = __QSUB(fcurr, (q31_t) (((q63_t) gcurr * (*pk )) >> 31)); + gnext = __QADD(gcurr, (q31_t) (((q63_t) fnext * (*pk++)) >> 31)); + + /* Output samples for last taps */ + acc += ((q63_t) gnext * *pv++); + *px2++ = gnext; + fcurr = fnext; + + /* Decrement loop counter */ + tapCnt--; + } + + /* y(n) += g0(n) * v0 */ + acc += ((q63_t) fnext * *pv++); + + *px2++ = fnext; + + /* write out into pDst */ + *pDst++ = (q31_t) (acc >> 31U); + + /* Advance the state pointer by 4 to process the next group of 4 samples */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. Now copy last S->numStages samples to start of the buffer + for the preperation of next frame process */ + + /* Points to the start of the state buffer */ + pStateCur = &S->pState[0]; + pState = &S->pState[blockSize]; + + /* Copy data */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numStages >> 2U; + + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numStages % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + tapCnt = (numStages - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#else /* #if defined (ARM_MATH_DSP) */ + + /* Sample processing */ + while (blkCnt > 0U) + { + /* Read Sample from input buffer */ + /* fN(n) = x(n) */ + fcurr = *pSrc++; + + /* Initialize Ladder coeff pointer */ + pv = &S->pvCoeffs[0]; + + /* Initialize Reflection coeff pointer */ + pk = &S->pkCoeffs[0]; + + /* Initialize state read pointer */ + px1 = pState; + + /* Initialize state write pointer */ + px2 = pState; + + /* Set accumulator to zero */ + acc = 0; + + tapCnt = numStages; + + while (tapCnt > 0U) + { + gcurr = *px1++; + /* Process sample */ + /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ + fnext = clip_q63_to_q31(((q63_t) fcurr - ((q31_t) (((q63_t) gcurr * (*pk )) >> 31)))); + + /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ + gnext = clip_q63_to_q31(((q63_t) gcurr + ((q31_t) (((q63_t) fnext * (*pk++)) >> 31)))); + + /* Output samples */ + /* y(n) += gN(n) * vN */ + acc += ((q63_t) gnext * *pv++); + + /* write gN-1(n-1) into state for next sample processing */ + *px2++ = gnext; + + /* Update f values for next coefficient processing */ + fcurr = fnext; + + tapCnt--; + } + + /* y(n) += g0(n) * v0 */ + acc += ((q63_t) fnext * *pv++); + + *px2++ = fnext; + + /* write out into pDst */ + *pDst++ = (q31_t) (acc >> 31U); + + /* Advance the state pointer by 1 to process the next group of samples */ + pState = pState + 1U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. Now copy last S->numStages samples to start of the buffer + for the preperation of next frame process */ + + /* Points to the start of the state buffer */ + pStateCur = &S->pState[0]; + pState = &S->pState[blockSize]; + + tapCnt = numStages; + + /* Copy data */ + while (tapCnt > 0U) + { + *pStateCur++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + +/** + @} end of IIR_Lattice group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_f32.c new file mode 100644 index 0000000..4fc6e7e --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_f32.c @@ -0,0 +1,533 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_f32.c + * Description: Processing function for the floating-point LMS filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup LMS Least Mean Square (LMS) Filters + + LMS filters are a class of adaptive filters that are able to "learn" an unknown transfer functions. + LMS filters use a gradient descent method in which the filter coefficients are updated based on the instantaneous error signal. + Adaptive filters are often used in communication systems, equalizers, and noise removal. + The CMSIS DSP Library contains LMS filter functions that operate on Q15, Q31, and floating-point data types. + The library also contains normalized LMS filters in which the filter coefficient adaptation is indepedent of the level of the input signal. + + An LMS filter consists of two components as shown below. + The first component is a standard transversal or FIR filter. + The second component is a coefficient update mechanism. + The LMS filter has two input signals. + The "input" feeds the FIR filter while the "reference input" corresponds to the desired output of the FIR filter. + That is, the FIR filter coefficients are updated so that the output of the FIR filter matches the reference input. + The filter coefficient update mechanism is based on the difference between the FIR filter output and the reference input. + This "error signal" tends towards zero as the filter adapts. + The LMS processing functions accept the input and reference input signals and generate the filter output and error signal. + \image html LMS.gif "Internal structure of the Least Mean Square filter" + + The functions operate on blocks of data and each call to the function processes + blockSize samples through the filter. + pSrc points to input signal, pRef points to reference signal, + pOut points to output signal and pErr points to error signal. + All arrays contain blockSize values. + + The functions operate on a block-by-block basis. + Internally, the filter coefficients b[n] are updated on a sample-by-sample basis. + The convergence of the LMS filter is slower compared to the normalized LMS algorithm. + + @par Algorithm + The output signal y[n] is computed by a standard FIR filter: +
+      y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]
+  
+ + @par + The error signal equals the difference between the reference signal d[n] and the filter output: +
+      e[n] = d[n] - y[n].
+  
+ + @par + After each sample of the error signal is computed, the filter coefficients b[k] are updated on a sample-by-sample basis: +
+      b[k] = b[k] + e[n] * mu * x[n-k],  for k=0, 1, ..., numTaps-1
+  
+ where mu is the step size and controls the rate of coefficient convergence. + @par + In the APIs, pCoeffs points to a coefficient array of size numTaps. + Coefficients are stored in time reversed order. + @par +
+     {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to a state array of size numTaps + blockSize - 1. + Samples in the state buffer are stored in the order: + @par +
+     {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[0], x[1], ..., x[blockSize-1]}
+  
+ @par + Note that the length of the state buffer exceeds the length of the coefficient array by blockSize-1 samples. + The increased state buffer length allows circular addressing, which is traditionally used in FIR filters, + to be avoided and yields a significant speed improvement. + The state variables are updated after each block of data is processed. + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter and + coefficient and state arrays cannot be shared among instances. + There are separate instance structure declarations for each of the 3 supported data types. + + @par Initialization Functions + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numTaps, pCoeffs, mu, postShift (not for f32), pState. Also set all of the values in pState to zero. + + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + Set the values in the state buffer to zeros before static initialization. + The code below statically initializes each of the 3 different data type filter instance structures +
+     arm_lms_instance_f32 S = {numTaps, pState, pCoeffs, mu};
+     arm_lms_instance_q31 S = {numTaps, pState, pCoeffs, mu, postShift};
+     arm_lms_instance_q15 S = {numTaps, pState, pCoeffs, mu, postShift};
+  
+ where numTaps is the number of filter coefficients in the filter; pState is the address of the state buffer; + pCoeffs is the address of the coefficient buffer; mu is the step size parameter; and postShift is the shift applied to coefficients. + + @par Fixed-Point Behavior + Care must be taken when using the Q15 and Q31 versions of the LMS filter. + The following issues must be considered: + - Scaling of coefficients + - Overflow and saturation + + @par Scaling of Coefficients + Filter coefficients are represented as fractional values and + coefficients are restricted to lie in the range [-1 +1). + The fixed-point functions have an additional scaling parameter postShift. + At the output of the filter's accumulator is a shift register which shifts the result by postShift bits. + This essentially scales the filter coefficients by 2^postShift and + allows the filter coefficients to exceed the range [+1 -1). + The value of postShift is set by the user based on the expected gain through the system being modeled. + + @par Overflow and Saturation + Overflow and saturation behavior of the fixed-point Q15 and Q31 versions are + described separately as part of the function specific documentation below. + */ + +/** + @addtogroup LMS + @{ + */ + +/** + @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 + @return none + */ +#if defined(ARM_MATH_NEON) +void arm_lms_f32( + const arm_lms_instance_f32 * S, + const float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + float32_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + float32_t sum, e, d; /* accumulator, error, reference data sample */ + float32_t w = 0.0f; /* weight factor */ + + float32x4_t tempV, sumV, xV, bV; + float32x2_t tempV2; + + e = 0.0f; + d = 0.0f; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = (pCoeffs); + + /* Set the accumulator to zero */ + sum = 0.0f; + sumV = vdupq_n_f32(0.0); + + /* Process 4 taps at a time. */ + tapCnt = numTaps >> 2; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + xV = vld1q_f32(px); + bV = vld1q_f32(pb); + sumV = vmlaq_f32(sumV, xV, bV); + + px += 4; + pb += 4; + + /* Decrement the loop counter */ + tapCnt--; + } + tempV2 = vpadd_f32(vget_low_f32(sumV),vget_high_f32(sumV)); + sum = tempV2[0] + tempV2[1]; + + + /* If the filter length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum += (*px++) * (*pb++); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* The result in the accumulator, store in the destination buffer. */ + *pOut++ = sum; + + /* Compute and store error */ + d = (float32_t) (*pRef++); + e = d - sum; + *pErr++ = e; + + /* Calculation of Weighting factor for the updating filter coefficients */ + w = e * mu; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = (pCoeffs); + + /* Process 4 taps at a time. */ + tapCnt = numTaps >> 2; + + /* Update filter coefficients */ + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + xV = vld1q_f32(px); + bV = vld1q_f32(pb); + px += 4; + bV = vmlaq_n_f32(bV,xV,w); + + vst1q_f32(pb,bV); + pb += 4; + + + /* Decrement the loop counter */ + tapCnt--; + } + + /* If the filter length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + *pb = *pb + (w * (*px++)); + pb++; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1; + + /* Decrement the loop counter */ + blkCnt--; + } + + + /* Processing is complete. Now copy the last numTaps - 1 samples to the + satrt of the state buffer. This prepares the state buffer for the + next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* Process 4 taps at a time for (numTaps - 1U) samples copy */ + tapCnt = (numTaps - 1U) >> 2U; + + /* copy data */ + while (tapCnt > 0U) + { + tempV = vld1q_f32(pState); + vst1q_f32(pStateCurnt,tempV); + pState += 4; + pStateCurnt += 4; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Calculate remaining number of copies */ + tapCnt = (numTaps - 1U) % 0x4U; + + /* Copy the remaining q31_t data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } + + +} +#else +void arm_lms_f32( + const arm_lms_instance_f32 * S, + const float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + float32_t mu = S->mu; /* Adaptive factor */ + float32_t acc, e; /* Accumulator, error */ + float32_t w; /* Weight factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + + /* Initializations of error, difference, Coefficient update */ + e = 0.0f; + w = 0.0f; + + /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + /* initialise loop count */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Set the accumulator to zero */ + acc = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += (*px++) * (*pb++); + + acc += (*px++) * (*pb++); + + acc += (*px++) * (*pb++); + + acc += (*px++) * (*pb++); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += (*px++) * (*pb++); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Store the result from accumulator into the destination buffer. */ + *pOut++ = acc; + + /* Compute and store error */ + e = (float32_t) *pRef++ - acc; + *pErr++ = e; + + /* Calculation of Weighting factor for updating filter coefficients */ + w = e * mu; + + /* Initialize pState pointer */ + /* Advance state pointer by 1 for the next sample */ + px = pState++; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + /* Update filter coefficients */ + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + *pb += w * (*px++); + pb++; + + *pb += w * (*px++); + pb++; + + *pb += w * (*px++); + pb++; + + *pb += w * (*px++); + pb++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + *pb += w * (*px++); + pb++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* copy data */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = (numTaps - 1U) >> 2U; + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of LMS group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_f32.c new file mode 100644 index 0000000..f418f46 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_f32.c @@ -0,0 +1,81 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_init_f32.c + * Description: Floating-point LMS filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @addtogroup LMS + @{ + */ + +/** + @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 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 + @return none + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+     {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ The initial filter coefficients serve as a starting point for the adaptive filter. + pState points to an array of length numTaps+blockSize-1 samples, where blockSize is the number of input samples processed by each call to arm_lms_f32(). + */ + +void arm_lms_init_f32( + arm_lms_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always blockSize + numTaps */ + memset(pState, 0, (numTaps + (blockSize - 1)) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; + + /* Assign Step size value */ + S->mu = mu; +} + +/** + @} end of LMS group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q15.c new file mode 100644 index 0000000..fe0a5c5 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q15.c @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_init_q15.c + * Description: Q15 LMS filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup LMS + @{ + */ + +/** + @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 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. + @return none + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+     {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ The initial filter coefficients serve as a starting point for the adaptive filter. + pState points to the array of state variables and size of array is + numTaps+blockSize-1 samples, where blockSize is the number of + input samples processed by each call to arm_lms_q15(). + */ + +void arm_lms_init_q15( + arm_lms_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint32_t postShift) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always blockSize + numTaps - 1 */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q15_t)); + + /* Assign state pointer */ + S->pState = pState; + + /* Assign Step size value */ + S->mu = mu; + + /* Assign postShift value to be applied */ + S->postShift = postShift; +} + +/** + @} end of LMS group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q31.c new file mode 100644 index 0000000..3410b9f --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_init_q31.c @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_init_q31.c + * Description: Q31 LMS filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup LMS + @{ + */ + +/** + @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 + @return none + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+     {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ The initial filter coefficients serve as a starting point for the adaptive filter. + pState points to an array of length numTaps+blockSize-1 samples, + where blockSize is the number of input samples processed by each call to + arm_lms_q31(). + */ + +void arm_lms_init_q31( + arm_lms_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint32_t postShift) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always blockSize + numTaps - 1 */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q31_t)); + + /* Assign state pointer */ + S->pState = pState; + + /* Assign Step size value */ + S->mu = mu; + + /* Assign postShift value to be applied */ + S->postShift = postShift; +} + +/** + @} end of LMS group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_f32.c new file mode 100644 index 0000000..28ab04a --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_f32.c @@ -0,0 +1,564 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_norm_f32.c + * Description: Processing function for the floating-point NLMS filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @defgroup LMS_NORM Normalized LMS Filters + + This set of functions implements a commonly used adaptive filter. + It is related to the Least Mean Square (LMS) adaptive filter and includes an additional normalization + factor which increases the adaptation rate of the filter. + The CMSIS DSP Library contains normalized LMS filter functions that operate on Q15, Q31, and floating-point data types. + + A normalized least mean square (NLMS) filter consists of two components as shown below. + The first component is a standard transversal or FIR filter. + The second component is a coefficient update mechanism. + The NLMS filter has two input signals. + The "input" feeds the FIR filter while the "reference input" corresponds to the desired output of the FIR filter. + That is, the FIR filter coefficients are updated so that the output of the FIR filter matches the reference input. + The filter coefficient update mechanism is based on the difference between the FIR filter output and the reference input. + This "error signal" tends towards zero as the filter adapts. + The NLMS processing functions accept the input and reference input signals and generate the filter output and error signal. + \image html LMS.gif "Internal structure of the NLMS adaptive filter" + + The functions operate on blocks of data and each call to the function processes + blockSize samples through the filter. + pSrc points to input signal, pRef points to reference signal, + pOut points to output signal and pErr points to error signal. + All arrays contain blockSize values. + + The functions operate on a block-by-block basis. + Internally, the filter coefficients b[n] are updated on a sample-by-sample basis. + The convergence of the LMS filter is slower compared to the normalized LMS algorithm. + + @par Algorithm + The output signal y[n] is computed by a standard FIR filter: +
+      y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]
+  
+ + @par + The error signal equals the difference between the reference signal d[n] and the filter output: +
+      e[n] = d[n] - y[n].
+  
+ + @par + After each sample of the error signal is computed the instanteous energy of the filter state variables is calculated: +
+     E = x[n]^2 + x[n-1]^2 + ... + x[n-numTaps+1]^2.
+  
+ The filter coefficients b[k] are then updated on a sample-by-sample basis: +
+      b[k] = b[k] + e[n] * (mu/E) * x[n-k],  for k=0, 1, ..., numTaps-1
+  
+ where mu is the step size and controls the rate of coefficient convergence. + @par + In the APIs, pCoeffs points to a coefficient array of size numTaps. + Coefficients are stored in time reversed order. + @par +
+     {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ @par + pState points to a state array of size numTaps + blockSize - 1. + Samples in the state buffer are stored in the order: + @par +
+     {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[0], x[1], ..., x[blockSize-1]}
+  
+ @par + Note that the length of the state buffer exceeds the length of the coefficient array by blockSize-1 samples. + The increased state buffer length allows circular addressing, which is traditionally used in FIR filters, + to be avoided and yields a significant speed improvement. + The state variables are updated after each block of data is processed. + + @par Instance Structure + The coefficients and state variables for a filter are stored together in an instance data structure. + A separate instance structure must be defined for each filter and + coefficient and state arrays cannot be shared among instances. + There are separate instance structure declarations for each of the 3 supported data types. + + @par Initialization Functions + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Zeros out the values in the state buffer. + To do this manually without calling the init function, assign the follow subfields of the instance structure: + numTaps, pCoeffs, mu, energy, x0, pState. Also set all of the values in pState to zero. + For Q7, Q15, and Q31 the following fields must also be initialized; + recipTable, postShift + @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 Q15 and Q31 versions of the normalised LMS filter. + The following issues must be considered: + - Scaling of coefficients + - Overflow and saturation + + @par Scaling of Coefficients + Filter coefficients are represented as fractional values and + coefficients are restricted to lie in the range [-1 +1). + The fixed-point functions have an additional scaling parameter postShift. + At the output of the filter's accumulator is a shift register which shifts the result by postShift bits. + This essentially scales the filter coefficients by 2^postShift and + allows the filter coefficients to exceed the range [+1 -1). + The value of postShift is set by the user based on the expected gain through the system being modeled. + + @par Overflow and Saturation + Overflow and saturation behavior of the fixed-point Q15 and Q31 versions are + described separately as part of the function specific documentation below. + */ + +/** + @addtogroup LMS_NORM + @{ + */ + +/** + @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 + @return none + */ + +#if defined(ARM_MATH_NEON) +void arm_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + const float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + float32_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + float32_t energy; /* Energy of the input */ + float32_t sum, e, d; /* accumulator, error, reference data sample */ + float32_t w, x0, in; /* weight factor, temporary variable to hold input sample and state */ + + float32x4_t tempV, sumV, xV, bV; + float32x2_t tempV2; + + /* Initializations of error, difference, Coefficient update */ + e = 0.0f; + d = 0.0f; + w = 0.0f; + + energy = S->energy; + x0 = S->x0; + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + /* Loop over blockSize number of values */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = (pCoeffs); + + /* Read the sample from input buffer */ + in = *pSrc++; + + /* Update the energy calculation */ + energy -= x0 * x0; + energy += in * in; + + /* Set the accumulator to zero */ + sum = 0.0f; + sumV = vdupq_n_f32(0.0); + + /* Process 4 taps at a time. */ + tapCnt = numTaps >> 2; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + xV = vld1q_f32(px); + bV = vld1q_f32(pb); + sumV = vmlaq_f32(sumV, xV, bV); + + px += 4; + pb += 4; + + /* Decrement the loop counter */ + tapCnt--; + } + tempV2 = vpadd_f32(vget_low_f32(sumV),vget_high_f32(sumV)); + sum = tempV2[0] + tempV2[1]; + + /* If the filter length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + sum += (*px++) * (*pb++); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* The result in the accumulator, store in the destination buffer. */ + *pOut++ = sum; + + /* Compute and store error */ + d = (float32_t) (*pRef++); + e = d - sum; + *pErr++ = e; + + /* Calculation of Weighting factor for updating filter coefficients */ + /* epsilon value 0.000000119209289f */ + w = (e * mu) / (energy + 0.000000119209289f); + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coeff pointer */ + pb = (pCoeffs); + + /* Process 4 taps at a time. */ + tapCnt = numTaps >> 2; + + /* Update filter coefficients */ + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + xV = vld1q_f32(px); + bV = vld1q_f32(pb); + px += 4; + bV = vmlaq_n_f32(bV,xV,w); + + vst1q_f32(pb,bV); + pb += 4; + + + /* Decrement the loop counter */ + tapCnt--; + } + + /* If the filter length is not a multiple of 4, compute the remaining filter taps */ + tapCnt = numTaps % 0x4U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + *pb += w * (*px++); + pb++; + + /* Decrement the loop counter */ + tapCnt--; + } + + x0 = *pState; + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1; + + /* Decrement the loop counter */ + blkCnt--; + } + + S->energy = energy; + S->x0 = x0; + + /* Processing is complete. Now copy the last numTaps - 1 samples to the + satrt of the state buffer. This prepares the state buffer for the + next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* Process 4 taps at a time for (numTaps - 1U)/4 samples copy */ + tapCnt = (numTaps - 1U) >> 2U; + + /* copy data */ + while (tapCnt > 0U) + { + tempV = vld1q_f32(pState); + vst1q_f32(pStateCurnt,tempV); + pState += 4; + pStateCurnt += 4; + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Calculate remaining number of copies */ + tapCnt = (numTaps - 1U) % 0x4U; + + /* Copy the remaining q31_t data */ + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement the loop counter */ + tapCnt--; + } + +} +#else +void arm_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + const float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize) +{ + float32_t *pState = S->pState; /* State pointer */ + float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + float32_t *pStateCurnt; /* Points to the current sample of the state */ + float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + float32_t mu = S->mu; /* Adaptive factor */ + float32_t acc, e; /* Accumulator, error */ + float32_t w; /* Weight factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + float32_t energy; /* Energy of the input */ + float32_t x0, in; /* Temporary variable to hold input sample and state */ + + /* Initializations of error, difference, Coefficient update */ + e = 0.0f; + w = 0.0f; + + energy = S->energy; + x0 = S->x0; + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + /* initialise loop count */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Read the sample from input buffer */ + in = *pSrc++; + + /* Update the energy calculation */ + energy -= x0 * x0; + energy += in * in; + + /* Set the accumulator to zero */ + acc = 0.0f; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += (*px++) * (*pb++); + + acc += (*px++) * (*pb++); + + acc += (*px++) * (*pb++); + + acc += (*px++) * (*pb++); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += (*px++) * (*pb++); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Store the result from accumulator into the destination buffer. */ + *pOut++ = acc; + + /* Compute and store error */ + e = (float32_t) *pRef++ - acc; + *pErr++ = e; + + /* Calculation of Weighting factor for updating filter coefficients */ + /* epsilon value 0.000000119209289f */ + w = (e * mu) / (energy + 0.000000119209289f); + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + /* Update filter coefficients */ + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + *pb += w * (*px++); + pb++; + + *pb += w * (*px++); + pb++; + + *pb += w * (*px++); + pb++; + + *pb += w * (*px++); + pb++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + *pb += w * (*px++); + pb++; + + /* Decrement loop counter */ + tapCnt--; + } + + x0 = *pState; + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Save energy and x0 values for the next frame */ + S->energy = energy; + S->x0 = x0; + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* copy data */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = (numTaps - 1U) >> 2U; + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} +#endif /* #if defined(ARM_MATH_NEON) */ +/** + @} end of LMS_NORM group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_f32.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_f32.c new file mode 100644 index 0000000..543dc72 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_f32.c @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_norm_init_f32.c + * Description: Floating-point NLMS filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup LMS_NORM + @{ + */ + +/** + @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 + @return none + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+     {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ The initial filter coefficients serve as a starting point for the adaptive filter. + pState points to an array of length numTaps+blockSize-1 samples, + where blockSize is the number of input samples processed by each call to arm_lms_norm_f32(). + */ + +void arm_lms_norm_init_f32( + arm_lms_norm_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always blockSize + numTaps - 1 */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(float32_t)); + + /* Assign state pointer */ + S->pState = pState; + + /* Assign Step size value */ + S->mu = mu; + + /* Initialise Energy to zero */ + S->energy = 0.0f; + + /* Initialise x0 to zero */ + S->x0 = 0.0f; +} + +/** + @} end of LMS_NORM group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q15.c new file mode 100644 index 0000000..d581ac1 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q15.c @@ -0,0 +1,98 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_norm_init_q15.c + * Description: Q15 NLMS filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @addtogroup LMS_NORM + @{ + */ + +/** + @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. + @return none + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+     {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ The initial filter coefficients serve as a starting point for the adaptive filter. + pState points to the array of state variables and size of array is + numTaps+blockSize-1 samples, where blockSize is the number of input samples processed + by each call to arm_lms_norm_q15(). + */ + +void arm_lms_norm_init_q15( + arm_lms_norm_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint8_t postShift) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always blockSize + numTaps - 1 */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q15_t)); + + /* Assign post Shift value applied to coefficients */ + S->postShift = postShift; + + /* Assign state pointer */ + S->pState = pState; + + /* Assign Step size value */ + S->mu = mu; + + /* Initialize reciprocal pointer table */ + S->recipTable = (q15_t *) armRecipTableQ15; + + /* Initialise Energy to zero */ + S->energy = 0; + + /* Initialise x0 to zero */ + S->x0 = 0; +} + +/** + @} end of LMS_NORM group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q31.c new file mode 100644 index 0000000..30e78ec --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_init_q31.c @@ -0,0 +1,97 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_norm_init_q31.c + * Description: Q31 NLMS filter initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @addtogroup LMS_NORM + @{ + */ + +/** + @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. + @return none + + @par Details + pCoeffs points to the array of filter coefficients stored in time reversed order: +
+     {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
+  
+ The initial filter coefficients serve as a starting point for the adaptive filter. + pState points to an array of length numTaps+blockSize-1 samples, + where blockSize is the number of input samples processed by each call to arm_lms_norm_q31(). + */ + +void arm_lms_norm_init_q31( + arm_lms_norm_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint8_t postShift) +{ + /* Assign filter taps */ + S->numTaps = numTaps; + + /* Assign coefficient pointer */ + S->pCoeffs = pCoeffs; + + /* Clear state buffer and size is always blockSize + numTaps - 1 */ + memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q31_t)); + + /* Assign post Shift value applied to coefficients */ + S->postShift = postShift; + + /* Assign state pointer */ + S->pState = pState; + + /* Assign Step size value */ + S->mu = mu; + + /* Initialize reciprocal pointer table */ + S->recipTable = (q31_t *) armRecipTableQ31; + + /* Initialise Energy to zero */ + S->energy = 0; + + /* Initialise x0 to zero */ + S->x0 = 0; +} + +/** + @} end of LMS_NORM group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q15.c new file mode 100644 index 0000000..c15ad5e --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q15.c @@ -0,0 +1,297 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_norm_q15.c + * Description: Processing function for Q15 normalized LMS filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup LMS_NORM + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both coefficients 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. + @par + In this filter, filter coefficients are updated for each sample and the + updation of filter cofficients are saturted. + */ + +void arm_lms_norm_q15( + arm_lms_norm_instance_q15 * S, + const q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + q15_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + q15_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + q63_t acc; /* Accumulator */ + q31_t energy; /* Energy of the input */ + q15_t e = 0, d = 0; /* Error, reference data sample */ + q15_t w = 0, in; /* Weight factor and state */ + q15_t x0; /* Temporary variable to hold input sample */ + q15_t errorXmu, oneByEnergy; /* Temporary variables to store error and mu product and reciprocal of energy */ + q15_t postShift; /* Post shift to be applied to weight after reciprocal calculation */ + q31_t coef; /* Temporary variable for coefficient */ + q31_t acc_l, acc_h; /* Temporary input */ + int32_t lShift = (15 - (int32_t) S->postShift); /* Post shift */ + int32_t uShift = (32 - lShift); + + energy = S->energy; + x0 = S->x0; + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + /* initialise loop count */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Read the sample from input buffer */ + in = *pSrc++; + + /* Update the energy calculation */ + energy -= (((q31_t) x0 * (x0)) >> 15); + energy += (((q31_t) in * (in)) >> 15); + + /* Set the accumulator to zero */ + acc = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + /* acc += b[N] * x[n-N] + b[N-1] * x[n-N-1] */ + acc = __SMLALD(read_q15x2_ia (&px), read_q15x2_ia (&pb), acc); + acc = __SMLALD(read_q15x2_ia (&px), read_q15x2_ia (&pb), acc); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += (q63_t) (((q31_t) (*px++) * (*pb++))); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Converting the result to 1.15 format and saturate the output */ + acc = __SSAT(acc, 16U); + + /* Store the result from accumulator into the destination buffer. */ + *pOut++ = (q15_t) acc; + + /* Compute and store error */ + d = *pRef++; + e = d - (q15_t) acc; + *pErr++ = e; + + /* Calculation of 1/energy */ + postShift = arm_recip_q15((q15_t) energy + DELTA_Q15, &oneByEnergy, S->recipTable); + + /* Calculation of e * mu value */ + errorXmu = (q15_t) (((q31_t) e * mu) >> 15); + + /* Calculation of (e * mu) * (1/energy) value */ + acc = (((q31_t) errorXmu * oneByEnergy) >> (15 - postShift)); + + /* Weighting factor for the normalized version */ + w = (q15_t) __SSAT((q31_t) acc, 16); + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + /* Update filter coefficients */ + while (tapCnt > 0U) + { + coef = (q31_t) *pb + (((q31_t) w * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT(coef, 16); + + coef = (q31_t) *pb + (((q31_t) w * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT(coef, 16); + + coef = (q31_t) *pb + (((q31_t) w * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT(coef, 16); + + coef = (q31_t) *pb + (((q31_t) w * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT(coef, 16); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + coef = (q31_t) *pb + (((q31_t) w * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT(coef, 16); + + /* Decrement loop counter */ + tapCnt--; + } + + x0 = *pState; + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Save energy and x0 values for the next frame */ + S->energy = (q15_t) energy; + S->x0 = x0; + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* copy data */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = (numTaps - 1U) >> 2U; + + while (tapCnt > 0U) + { + write_q15x2_ia (&pStateCurnt, read_q15x2_ia (&pState)); + write_q15x2_ia (&pStateCurnt, read_q15x2_ia (&pState)); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of LMS_NORM group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q31.c new file mode 100644 index 0000000..e26219e --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_norm_q31.c @@ -0,0 +1,311 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_norm_q31.c + * Description: Processing function for the Q31 NLMS filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup LMS_NORM + @{ + */ + +/** + @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 + @return none + + @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 + log2(numTaps) bits. The reference signal should not be scaled down. + After all multiply-accumulates are performed, the 2.62 accumulator is shifted + and saturated to 1.31 format to yield the final result. + The output signal and error signal are in 1.31 format. + @par + In this filter, filter coefficients are updated for each sample and the + updation of filter cofficients are saturted. + */ + +void arm_lms_norm_q31( + arm_lms_norm_instance_q31 * S, + const q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + q31_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + q63_t acc; /* Accumulator */ + q63_t energy; /* Energy of the input */ + q31_t e = 0; /* Error data sample */ + q31_t w = 0, in; /* Weight factor and state */ + q31_t x0; /* Temporary variable to hold input sample */ + q31_t errorXmu, oneByEnergy; /* Temporary variables to store error and mu product and reciprocal of energy */ + q31_t postShift; /* Post shift to be applied to weight after reciprocal calculation */ + q31_t coef; /* Temporary variable for coef */ + q31_t acc_l, acc_h; /* Temporary input */ + uint32_t uShift = ((uint32_t) S->postShift + 1U); + uint32_t lShift = 32U - uShift; /* Shift to be applied to the output */ + + energy = S->energy; + x0 = S->x0; + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + /* initialise loop count */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Read the sample from input buffer */ + in = *pSrc++; + + /* Update the energy calculation */ + energy = (q31_t) ((((q63_t) energy << 32) - (((q63_t) x0 * x0) << 1)) >> 32); + energy = (q31_t) (((((q63_t) in * in) << 1) + (energy << 32)) >> 32); + + /* Set the accumulator to zero */ + acc = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + /* acc += b[N] * x[n-N] */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* acc += b[N-1] * x[n-N-1] */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* acc += b[N-2] * x[n-N-2] */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* acc += b[N-3] * x[n-N-3] */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Converting the result to 1.31 format */ + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + acc = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store the result from accumulator into the destination buffer. */ + *pOut++ = (q31_t) acc; + + /* Compute and store error */ + e = *pRef++ - (q31_t) acc; + *pErr++ = e; + + /* Calculates the reciprocal of energy */ + postShift = arm_recip_q31(energy + DELTA_Q31, &oneByEnergy, &S->recipTable[0]); + + /* Calculation of product of (e * mu) */ + errorXmu = (q31_t) (((q63_t) e * mu) >> 31); + + /* Weighting factor for the normalized version */ + w = clip_q63_to_q31(((q63_t) errorXmu * oneByEnergy) >> (31 - postShift)); + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + /* Update filter coefficients */ + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + + /* coef is in 2.30 format */ + coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); + /* get coef in 1.31 format by left shifting */ + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + /* update coefficient buffer to next coefficient */ + pb++; + + coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + pb++; + + coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + pb++; + + coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + pb++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + pb++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Read the sample from state buffer */ + x0 = *pState; + + /* Advance state pointer by 1 for the next sample */ + pState = pState + 1; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Save energy and x0 values for the next frame */ + S->energy = (q31_t) energy; + S->x0 = x0; + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* copy data */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = (numTaps - 1U) >> 2U; + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of LMS_NORM group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q15.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q15.c new file mode 100644 index 0000000..0fc9878 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q15.c @@ -0,0 +1,262 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_q15.c + * Description: Processing function for Q15 LMS filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup LMS + @{ + */ + +/** + @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 + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. + Both coefficients 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. + @par + In this filter, filter coefficients are updated for each sample and + the updation of filter cofficients are saturted. + */ + +void arm_lms_q15( + const arm_lms_instance_q15 * S, + const q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize) +{ + q15_t *pState = S->pState; /* State pointer */ + q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q15_t *pStateCurnt; /* Points to the current sample of the state */ + q15_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + q15_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + q63_t acc; /* Accumulator */ + q15_t e = 0; /* Error of data sample */ + q15_t alpha; /* Intermediate constant for taps update */ + q31_t coef; /* Temporary variable for coefficient */ + q31_t acc_l, acc_h; /* Temporary input */ + int32_t lShift = (15 - (int32_t) S->postShift); /* Post shift */ + int32_t uShift = (32 - lShift); + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + /* initialise loop count */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Set the accumulator to zero */ + acc = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + /* acc += b[N] * x[n-N] + b[N-1] * x[n-N-1] */ + acc = __SMLALD(read_q15x2_ia (&px), read_q15x2_ia (&pb), acc); + acc = __SMLALD(read_q15x2_ia (&px), read_q15x2_ia (&pb), acc); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += (q63_t) (((q31_t) (*px++) * (*pb++))); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + /* Apply shift for lower part of acc and upper part of acc */ + acc = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Converting the result to 1.15 format and saturate the output */ + acc = __SSAT(acc, 16U); + + /* Store the result from accumulator into the destination buffer. */ + *pOut++ = (q15_t) acc; + + /* Compute and store error */ + e = *pRef++ - (q15_t) acc; + *pErr++ = (q15_t) e; + + /* Compute alpha i.e. intermediate constant for taps update */ + alpha = (q15_t) (((q31_t) e * (mu)) >> 15); + + /* Initialize pState pointer */ + /* Advance state pointer by 1 for the next sample */ + px = pState++; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + /* Update filter coefficients */ + while (tapCnt > 0U) + { + coef = (q31_t) *pb + (((q31_t) alpha * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT((coef), 16); + + coef = (q31_t) *pb + (((q31_t) alpha * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT((coef), 16); + + coef = (q31_t) *pb + (((q31_t) alpha * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT((coef), 16); + + coef = (q31_t) *pb + (((q31_t) alpha * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT((coef), 16); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + coef = (q31_t) *pb + (((q31_t) alpha * (*px++)) >> 15); + *pb++ = (q15_t) __SSAT((coef), 16); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* copy data */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = (numTaps - 1U) >> 2U; + + while (tapCnt > 0U) + { + write_q15x2_ia (&pStateCurnt, read_q15x2_ia (&pState)); + write_q15x2_ia (&pStateCurnt, read_q15x2_ia (&pState)); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of LMS group + */ diff --git a/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q31.c b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q31.c new file mode 100644 index 0000000..b0c0e27 --- /dev/null +++ b/CMSIS/DSP/Source/FilteringFunctions/arm_lms_q31.c @@ -0,0 +1,283 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_lms_q31.c + * Description: Processing function for the Q31 LMS filter + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupFilters + */ + +/** + @addtogroup LMS + @{ + */ + +/** + @brief Processing function for Q31 LMS filter. + @param[in] S points to an instance of the Q31 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. + @return none + + @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 clips. + In order to avoid overflows completely the input signal must be scaled down by + log2(numTaps) bits. + The reference signal should not be scaled down. + After all multiply-accumulates are performed, the 2.62 accumulator is shifted + and saturated to 1.31 format to yield the final result. + The output signal and error signal are in 1.31 format. + @par + In this filter, filter coefficients are updated for each sample and + the updation of filter cofficients are saturted. + */ + +void arm_lms_q31( + const arm_lms_instance_q31 * S, + const q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize) +{ + q31_t *pState = S->pState; /* State pointer */ + q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ + q31_t *pStateCurnt; /* Points to the current sample of the state */ + q31_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ + q31_t mu = S->mu; /* Adaptive factor */ + uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ + uint32_t tapCnt, blkCnt; /* Loop counters */ + q63_t acc; /* Accumulator */ + q31_t e = 0; /* Error of data sample */ + q31_t alpha; /* Intermediate constant for taps update */ + q31_t coef; /* Temporary variable for coef */ + q31_t acc_l, acc_h; /* Temporary input */ + uint32_t uShift = ((uint32_t) S->postShift + 1U); + uint32_t lShift = 32U - uShift; /* Shift to be applied to the output */ + + /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ + /* pStateCurnt points to the location where the new input data should be written */ + pStateCurnt = &(S->pState[(numTaps - 1U)]); + + /* initialise loop count */ + blkCnt = blockSize; + + while (blkCnt > 0U) + { + /* Copy the new input sample into the state buffer */ + *pStateCurnt++ = *pSrc++; + + /* Initialize pState pointer */ + px = pState; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + + /* Set the accumulator to zero */ + acc = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + /* acc += b[N] * x[n-N] */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* acc += b[N-1] * x[n-N-1] */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* acc += b[N-2] * x[n-N-2] */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* acc += b[N-3] * x[n-N-3] */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + acc += ((q63_t) (*px++)) * (*pb++); + + /* Decrement the loop counter */ + tapCnt--; + } + + /* Converting the result to 1.31 format */ + /* Calc lower part of acc */ + acc_l = acc & 0xffffffff; + + /* Calc upper part of acc */ + acc_h = (acc >> 32) & 0xffffffff; + + acc = (uint32_t) acc_l >> lShift | acc_h << uShift; + + /* Store the result from accumulator into the destination buffer. */ + *pOut++ = (q31_t) acc; + + /* Compute and store error */ + e = *pRef++ - (q31_t) acc; + *pErr++ = e; + + /* Compute alpha i.e. intermediate constant for taps update */ + alpha = (q31_t) (((q63_t) e * mu) >> 31); + + /* Initialize pState pointer */ + /* Advance state pointer by 1 for the next sample */ + px = pState++; + + /* Initialize coefficient pointer */ + pb = pCoeffs; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = numTaps >> 2U; + + /* Update filter coefficients */ + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + + /* coef is in 2.30 format */ + coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); + /* get coef in 1.31 format by left shifting */ + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + /* update coefficient buffer to next coefficient */ + pb++; + + coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + pb++; + + coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + pb++; + + coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + pb++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = numTaps % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = numTaps; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + /* Perform the multiply-accumulate */ + coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); + *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1U)); + pb++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Processing is complete. + Now copy the last numTaps - 1 samples to the start of the state buffer. + This prepares the state buffer for the next function call. */ + + /* Points to the start of the pState buffer */ + pStateCurnt = S->pState; + + /* copy data */ +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 taps at a time. */ + tapCnt = (numTaps - 1U) >> 2U; + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + + /* Loop unrolling: Compute remaining taps */ + tapCnt = (numTaps - 1U) % 0x4U; + +#else + + /* Initialize tapCnt with number of samples */ + tapCnt = (numTaps - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (tapCnt > 0U) + { + *pStateCurnt++ = *pState++; + + /* Decrement loop counter */ + tapCnt--; + } + +} + +/** + @} end of LMS group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/CMakeLists.txt b/CMSIS/DSP/Source/MatrixFunctions/CMakeLists.txt new file mode 100644 index 0000000..d48d6b1 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPMatrix) + + +file(GLOB SRC "./*_*.c") + +add_library(CMSISDSPMatrix STATIC ${SRC}) + +configdsp(CMSISDSPMatrix ..) + +### Includes +target_include_directories(CMSISDSPMatrix PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/MatrixFunctions/MatrixFunctions.c b/CMSIS/DSP/Source/MatrixFunctions/MatrixFunctions.c new file mode 100644 index 0000000..da721fe --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/MatrixFunctions.c @@ -0,0 +1,53 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: MatrixFunctions.c + * Description: Combination of all matrix function source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_mat_add_f32.c" +#include "arm_mat_add_q15.c" +#include "arm_mat_add_q31.c" +#include "arm_mat_cmplx_mult_f32.c" +#include "arm_mat_cmplx_mult_q15.c" +#include "arm_mat_cmplx_mult_q31.c" +#include "arm_mat_init_f32.c" +#include "arm_mat_init_q15.c" +#include "arm_mat_init_q31.c" +#include "arm_mat_inverse_f32.c" +#include "arm_mat_inverse_f64.c" +#include "arm_mat_mult_f32.c" +#include "arm_mat_mult_fast_q15.c" +#include "arm_mat_mult_fast_q31.c" +#include "arm_mat_mult_q15.c" +#include "arm_mat_mult_q31.c" +#include "arm_mat_scale_f32.c" +#include "arm_mat_scale_q15.c" +#include "arm_mat_scale_q31.c" +#include "arm_mat_sub_f32.c" +#include "arm_mat_sub_q15.c" +#include "arm_mat_sub_q31.c" +#include "arm_mat_trans_f32.c" +#include "arm_mat_trans_q15.c" +#include "arm_mat_trans_q31.c" diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_f32.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_f32.c new file mode 100644 index 0000000..8e1246c --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_f32.c @@ -0,0 +1,232 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_add_f32.c + * Description: Floating-point matrix addition + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @defgroup MatrixAdd Matrix Addition + + Adds two matrices. + \image html MatrixAddition.gif "Addition of two 3 x 3 matrices" + + The functions check to make sure that + pSrcA, pSrcB, and pDst have the same + number of rows and columns. + */ + +/** + @addtogroup MatrixAdd + @{ + */ + + +/** + @brief Floating-point matrix addition. + @param[in] pSrcA points to first input matrix structure + @param[in] pSrcB points to second input matrix structure + @param[out] pDst points to output matrix structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + */ +#if defined(ARM_MATH_NEON) +/* + +Neon version is assuming the matrix is small enough. +So no blocking is used for taking into account cache effects. +For big matrix, there exist better libraries for Neon. + +*/ +arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ + float32_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + + float32_t inA1, inA2, inB1, inB2, out1, out2; /* temporary variables */ + + uint32_t numSamples; /* total number of elements in the matrix */ + uint32_t blkCnt; /* loop counters */ + arm_status status; /* status of matrix addition */ + +#ifdef ARM_MATH_MATRIX_CHECK + /* Check for matrix mismatch condition */ + if ((pSrcA->numRows != pSrcB->numRows) || + (pSrcA->numCols != pSrcB->numCols) || + (pSrcA->numRows != pDst->numRows) || (pSrcA->numCols != pDst->numCols)) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else +#endif + { + float32x4_t vec1; + float32x4_t vec2; + float32x4_t res; + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + + blkCnt = numSamples >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) + B(m,n) */ + /* Add and then store the results in the destination buffer. */ + vec1 = vld1q_f32(pIn1); + vec2 = vld1q_f32(pIn2); + res = vaddq_f32(vec1, vec2); + vst1q_f32(pOut, res); + + /* update pointers to process next samples */ + pIn1 += 4U; + pIn2 += 4U; + pOut += 4U; + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the numSamples is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = numSamples % 0x4U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) + B(m,n) */ + /* Add and then store the results in the destination buffer. */ + *pOut++ = (*pIn1++) + (*pIn2++); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#else +arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pInA = pSrcA->pData; /* input data matrix pointer A */ + float32_t *pInB = pSrcB->pData; /* input data matrix pointer B */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + + uint32_t numSamples; /* total number of elements in the matrix */ + uint32_t blkCnt; /* loop counters */ + arm_status status; /* status of matrix addition */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numRows != pSrcB->numRows) || + (pSrcA->numCols != pSrcB->numCols) || + (pSrcA->numRows != pDst->numRows) || + (pSrcA->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Total number of samples in input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) + B(m,n) */ + + /* Add and store result in destination buffer. */ + *pOut++ = *pInA++ + *pInB++; + + *pOut++ = *pInA++ + *pInB++; + + *pOut++ = *pInA++ + *pInB++; + + *pOut++ = *pInA++ + *pInB++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) + B(m,n) */ + + /* Add and store result in destination buffer. */ + *pOut++ = *pInA++ + *pInB++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of MatrixAdd group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q15.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q15.c new file mode 100644 index 0000000..2aaf849 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q15.c @@ -0,0 +1,149 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_add_q15.c + * Description: Q15 matrix addition + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixAdd + @{ + */ + +/** + @brief Q15 matrix addition. + @param[in] pSrcA points to first input matrix structure + @param[in] pSrcB points to second input matrix structure + @param[out] pDst points to output matrix structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. + */ + +arm_status arm_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst) +{ + q15_t *pInA = pSrcA->pData; /* input data matrix pointer A */ + q15_t *pInB = pSrcB->pData; /* input data matrix pointer B */ + q15_t *pOut = pDst->pData; /* output data matrix pointer */ + + uint32_t numSamples; /* total number of elements in the matrix */ + uint32_t blkCnt; /* loop counters */ + arm_status status; /* status of matrix addition */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numRows != pSrcB->numRows) || + (pSrcA->numCols != pSrcB->numCols) || + (pSrcA->numRows != pDst->numRows) || + (pSrcA->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Total number of samples in input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) + B(m,n) */ + + /* Add, saturate and store result in destination buffer. */ +#if defined (ARM_MATH_DSP) + write_q15x2_ia (&pOut, __QADD16(read_q15x2_ia (&pInA), read_q15x2_ia (&pInB))); + + write_q15x2_ia (&pOut, __QADD16(read_q15x2_ia (&pInA), read_q15x2_ia (&pInB))); +#else + *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); + + *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); + + *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); + + *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) + B(m,n) */ + + /* Add, saturate and store result in destination buffer. */ +#if defined (ARM_MATH_DSP) + *pOut++ = (q15_t) __QADD16(*pInA++, *pInB++); +#else + *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixAdd group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q31.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q31.c new file mode 100644 index 0000000..6194809 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_add_q31.c @@ -0,0 +1,139 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_add_q31.c + * Description: Q31 matrix addition + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixAdd + @{ + */ + +/** + @brief Q31 matrix addition. + @param[in] pSrcA points to first input matrix structure + @param[in] pSrcB points to second input matrix structure + @param[out] pDst points to output matrix structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated. + */ + +arm_status arm_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst) +{ + q31_t *pInA = pSrcA->pData; /* input data matrix pointer A */ + q31_t *pInB = pSrcB->pData; /* input data matrix pointer B */ + q31_t *pOut = pDst->pData; /* output data matrix pointer */ + + uint32_t numSamples; /* total number of elements in the matrix */ + uint32_t blkCnt; /* loop counters */ + arm_status status; /* status of matrix addition */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numRows != pSrcB->numRows) || + (pSrcA->numCols != pSrcB->numCols) || + (pSrcA->numRows != pDst->numRows) || + (pSrcA->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Total number of samples in input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) + B(m,n) */ + + /* Add, saturate and store result in destination buffer. */ + *pOut++ = __QADD(*pInA++, *pInB++); + + *pOut++ = __QADD(*pInA++, *pInB++); + + *pOut++ = __QADD(*pInA++, *pInB++); + + *pOut++ = __QADD(*pInA++, *pInB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) + B(m,n) */ + + /* Add, saturate and store result in destination buffer. */ + *pOut++ = __QADD(*pInA++, *pInB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixAdd group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c new file mode 100644 index 0000000..8e2af31 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c @@ -0,0 +1,631 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_cmplx_mult_f32.c + * Description: Floating-point matrix multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @defgroup CmplxMatrixMult Complex Matrix Multiplication + + Complex Matrix multiplication is only defined if the number of columns of the + first matrix equals the number of rows of the second matrix. + Multiplying an M x N matrix with an N x P matrix results + in an M x P matrix. + @par + When matrix size checking is enabled, the functions check: + - that the inner dimensions of pSrcA and pSrcB are equal; + - that the size of the output matrix equals the outer dimensions of pSrcA and pSrcB. + */ + + +/** + @addtogroup CmplxMatrixMult + @{ + */ + +/** + @brief Floating-point Complex matrix multiplication. + @param[in] pSrcA points to first input complex matrix structure + @param[in] pSrcB points to second input complex matrix structure + @param[out] pDst points to output complex matrix structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + */ +#if defined(ARM_MATH_NEON) +arm_status arm_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ + float32_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ + float32_t *pInA = pSrcA->pData; /* input data matrix pointer A */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + float32_t *px; /* Temporary output data matrix pointer */ + uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ + float32_t sumReal1, sumImag1; /* accumulator */ + float32_t a0, b0, c0, d0; + float32_t a1, a1B,b1, b1B, c1, d1; + float32_t sumReal2, sumImag2; /* accumulator */ + + + float32x4x2_t a0V, a1V; + float32x4_t accR0,accI0, accR1,accI1,tempR, tempI; + float32x2_t accum = vdup_n_f32(0); + float32_t *pIn1B = pSrcA->pData; + + uint16_t col, i = 0U, j, rowCnt, row = numRowsA, colCnt; /* loop counters */ + arm_status status; /* status of matrix multiplication */ + float32_t sumReal1B, sumImag1B; + float32_t sumReal2B, sumImag2B; + float32_t *pxB; + +#ifdef ARM_MATH_MATRIX_CHECK + + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) + { + + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + + rowCnt = row >> 1; + + /* Row loop */ + while (rowCnt > 0U) + { + /* Output pointer is set to starting address of the row being processed */ + px = pOut + 2 * i; + pxB = px + 2 * numColsB; + + /* For every row wise process, the column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, the pIn2 pointer is set + ** to the starting address of the pSrcB data */ + pIn2 = pSrcB->pData; + + j = 0U; + + /* Column loop */ + while (col > 0U) + { + /* Set the variable sum, that acts as accumulator, to zero */ + sumReal1 = 0.0f; + sumImag1 = 0.0f; + sumReal1B = 0.0f; + sumImag1B = 0.0f; + + sumReal2 = 0.0f; + sumImag2 = 0.0f; + sumReal2B = 0.0f; + sumImag2B = 0.0f; + + /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ + pIn1 = pInA; + pIn1B = pIn1 + 2*numColsA; + + accR0 = vdupq_n_f32(0.0); + accI0 = vdupq_n_f32(0.0); + accR1 = vdupq_n_f32(0.0); + accI1 = vdupq_n_f32(0.0); + + /* Compute 4 MACs simultaneously. */ + colCnt = numColsA >> 2; + + /* Matrix multiplication */ + while (colCnt > 0U) + { + /* Reading real part of complex matrix A */ + a0V = vld2q_f32(pIn1); // load & separate real/imag pSrcA (de-interleave 2) + a1V = vld2q_f32(pIn1B); // load & separate real/imag pSrcA (de-interleave 2) + + pIn1 += 8; + pIn1B += 8; + + tempR[0] = *pIn2; + tempI[0] = *(pIn2 + 1U); + pIn2 += 2 * numColsB; + + tempR[1] = *pIn2; + tempI[1] = *(pIn2 + 1U); + pIn2 += 2 * numColsB; + + tempR[2] = *pIn2; + tempI[2] = *(pIn2 + 1U); + pIn2 += 2 * numColsB; + + tempR[3] = *pIn2; + tempI[3] = *(pIn2 + 1U); + pIn2 += 2 * numColsB; + + accR0 = vmlaq_f32(accR0,a0V.val[0],tempR); + accR0 = vmlsq_f32(accR0,a0V.val[1],tempI); + + accI0 = vmlaq_f32(accI0,a0V.val[1],tempR); + accI0 = vmlaq_f32(accI0,a0V.val[0],tempI); + + accR1 = vmlaq_f32(accR1,a1V.val[0],tempR); + accR1 = vmlsq_f32(accR1,a1V.val[1],tempI); + + accI1 = vmlaq_f32(accI1,a1V.val[1],tempR); + accI1 = vmlaq_f32(accI1,a1V.val[0],tempI); + + /* Decrement the loop count */ + colCnt--; + } + + accum = vpadd_f32(vget_low_f32(accR0), vget_high_f32(accR0)); + sumReal1 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(accI0), vget_high_f32(accI0)); + sumImag1 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(accR1), vget_high_f32(accR1)); + sumReal1B += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(accI1), vget_high_f32(accI1)); + sumImag1B += accum[0] + accum[1]; + + /* If the columns of pSrcA is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + colCnt = numColsA & 3; + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1)*b(1,1) + a(1,2)*b(2,1) + ... + a(m,p)*b(p,n) */ + a1 = *pIn1; + a1B = *pIn1B; + + c1 = *pIn2; + + b1 = *(pIn1 + 1U); + b1B = *(pIn1B + 1U); + + d1 = *(pIn2 + 1U); + + sumReal1 += a1 * c1; + sumImag1 += b1 * c1; + + sumReal1B += a1B * c1; + sumImag1B += b1B * c1; + + pIn1 += 2U; + pIn1B += 2U; + pIn2 += 2 * numColsB; + + sumReal2 -= b1 * d1; + sumImag2 += a1 * d1; + + sumReal2B -= b1B * d1; + sumImag2B += a1B * d1; + + /* Decrement the loop counter */ + colCnt--; + } + + sumReal1 += sumReal2; + sumImag1 += sumImag2; + + sumReal1B += sumReal2B; + sumImag1B += sumImag2B; + + /* Store the result in the destination buffer */ + *px++ = sumReal1; + *px++ = sumImag1; + *pxB++ = sumReal1B; + *pxB++ = sumImag1B; + + /* Update the pointer pIn2 to point to the starting address of the next column */ + j++; + pIn2 = pSrcB->pData + 2U * j; + + /* Decrement the column loop counter */ + col--; + } + + /* Update the pointer pInA to point to the starting address of the next 2 row */ + i = i + 2*numColsB; + pInA = pInA + 4 * numColsA; + + /* Decrement the row loop counter */ + rowCnt--; + } + + rowCnt = row & 1; + while (rowCnt > 0U) + { + /* Output pointer is set to starting address of the row being processed */ + px = pOut + 2 * i; + + /* For every row wise process, the column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, the pIn2 pointer is set + ** to the starting address of the pSrcB data */ + pIn2 = pSrcB->pData; + + j = 0U; + + /* Column loop */ + while (col > 0U) + { + /* Set the variable sum, that acts as accumulator, to zero */ + sumReal1 = 0.0f; + sumImag1 = 0.0f; + + sumReal2 = 0.0f; + sumImag2 = 0.0f; + + /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ + pIn1 = pInA; + + accR0 = vdupq_n_f32(0.0); + accI0 = vdupq_n_f32(0.0); + + /* Compute 4 MACs simultaneously. */ + colCnt = numColsA >> 2; + + /* Matrix multiplication */ + while (colCnt > 0U) + { + /* Reading real part of complex matrix A */ + a0V = vld2q_f32(pIn1); // load & separate real/imag pSrcA (de-interleave 2) + pIn1 += 8; + + tempR[0] = *pIn2; + tempI[0] = *(pIn2 + 1U); + pIn2 += 2 * numColsB; + + tempR[1] = *pIn2; + tempI[1] = *(pIn2 + 1U); + pIn2 += 2 * numColsB; + + tempR[2] = *pIn2; + tempI[2] = *(pIn2 + 1U); + pIn2 += 2 * numColsB; + + tempR[3] = *pIn2; + tempI[3] = *(pIn2 + 1U); + pIn2 += 2 * numColsB; + + accR0 = vmlaq_f32(accR0,a0V.val[0],tempR); + accR0 = vmlsq_f32(accR0,a0V.val[1],tempI); + + accI0 = vmlaq_f32(accI0,a0V.val[1],tempR); + accI0 = vmlaq_f32(accI0,a0V.val[0],tempI); + + /* Decrement the loop count */ + colCnt--; + } + + accum = vpadd_f32(vget_low_f32(accR0), vget_high_f32(accR0)); + sumReal1 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(accI0), vget_high_f32(accI0)); + sumImag1 += accum[0] + accum[1]; + + /* If the columns of pSrcA is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + colCnt = numColsA & 3; + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1)*b(1,1) + a(1,2)*b(2,1) + ... + a(m,p)*b(p,n) */ + a1 = *pIn1; + c1 = *pIn2; + + b1 = *(pIn1 + 1U); + d1 = *(pIn2 + 1U); + + sumReal1 += a1 * c1; + sumImag1 += b1 * c1; + + pIn1 += 2U; + pIn2 += 2 * numColsB; + + sumReal2 -= b1 * d1; + sumImag2 += a1 * d1; + + /* Decrement the loop counter */ + colCnt--; + } + + sumReal1 += sumReal2; + sumImag1 += sumImag2; + + /* Store the result in the destination buffer */ + *px++ = sumReal1; + *px++ = sumImag1; + + /* Update the pointer pIn2 to point to the starting address of the next column */ + j++; + pIn2 = pSrcB->pData + 2U * j; + + /* Decrement the column loop counter */ + col--; + + } + + /* Update the pointer pInA to point to the starting address of the next row */ + i = i + numColsB; + pInA = pInA + 2 * numColsA; + + /* Decrement the row loop counter */ + rowCnt--; + + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#else +arm_status arm_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn1 = pSrcA->pData; /* Input data matrix pointer A */ + float32_t *pIn2 = pSrcB->pData; /* Input data matrix pointer B */ + float32_t *pInA = pSrcA->pData; /* Input data matrix pointer A */ + float32_t *pOut = pDst->pData; /* Output data matrix pointer */ + float32_t *px; /* Temporary output data matrix pointer */ + uint16_t numRowsA = pSrcA->numRows; /* Number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* Number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* Number of columns of input matrix A */ + float32_t sumReal, sumImag; /* Accumulator */ + float32_t a1, b1, c1, d1; + uint32_t col, i = 0U, j, row = numRowsA, colCnt; /* loop counters */ + arm_status status; /* status of matrix multiplication */ + +#if defined (ARM_MATH_LOOPUNROLL) + float32_t a0, b0, c0, d0; +#endif + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || + (pSrcB->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* row loop */ + do + { + /* Output pointer is set to starting address of the row being processed */ + px = pOut + 2 * i; + + /* For every row wise process, the column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, the pIn2 pointer is set + ** to the starting address of the pSrcB data */ + pIn2 = pSrcB->pData; + + j = 0U; + + /* column loop */ + do + { + /* Set the variable sum, that acts as accumulator, to zero */ + sumReal = 0.0f; + sumImag = 0.0f; + + /* Initiate pointer pIn1 to point to starting address of column being processed */ + pIn1 = pInA; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + colCnt = numColsA >> 2U; + + /* matrix multiplication */ + while (colCnt > 0U) + { + + /* Reading real part of complex matrix A */ + a0 = *pIn1; + + /* Reading real part of complex matrix B */ + c0 = *pIn2; + + /* Reading imaginary part of complex matrix A */ + b0 = *(pIn1 + 1U); + + /* Reading imaginary part of complex matrix B */ + d0 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += a0 * c0; + sumImag += b0 * c0; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= b0 * d0; + sumImag += a0 * d0; + + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + /* read real and imag values from pSrcA and pSrcB buffer */ + a1 = *(pIn1 ); + c1 = *(pIn2 ); + b1 = *(pIn1 + 1U); + d1 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += a1 * c1; + sumImag += b1 * c1; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= b1 * d1; + sumImag += a1 * d1; + + a0 = *(pIn1 ); + c0 = *(pIn2 ); + b0 = *(pIn1 + 1U); + d0 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += a0 * c0; + sumImag += b0 * c0; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= b0 * d0; + sumImag += a0 * d0; + + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + a1 = *(pIn1 ); + c1 = *(pIn2 ); + b1 = *(pIn1 + 1U); + d1 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += a1 * c1; + sumImag += b1 * c1; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= b1 * d1; + sumImag += a1 * d1; + + /* Decrement loop count */ + colCnt--; + } + + /* If the columns of pSrcA is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + colCnt = numColsA % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + colCnt = numColsA; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + a1 = *(pIn1 ); + c1 = *(pIn2 ); + b1 = *(pIn1 + 1U); + d1 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += a1 * c1; + sumImag += b1 * c1; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= b1 * d1; + sumImag += a1 * d1; + + /* Decrement loop counter */ + colCnt--; + } + + /* Store result in destination buffer */ + *px++ = sumReal; + *px++ = sumImag; + + /* Update pointer pIn2 to point to starting address of next column */ + j++; + pIn2 = pSrcB->pData + 2U * j; + + /* Decrement column loop counter */ + col--; + + } while (col > 0U); + + /* Update pointer pInA to point to starting address of next row */ + i = i + numColsB; + pInA = pInA + 2 * numColsA; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of MatrixMult group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c new file mode 100644 index 0000000..4c5a45b --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c @@ -0,0 +1,340 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cmplx_mat_mult_q15.c + * Description: Q15 complex matrix multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup CmplxMatrixMult + @{ + */ + +/** + @brief Q15 Complex matrix multiplication. + @param[in] pSrcA points to first input complex matrix structure + @param[in] pSrcB points to second input complex matrix structure + @param[out] pDst points to output complex matrix structure + @param[in] pScratch points to an array for storing intermediate results + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Conditions for optimum performance + Input, output and state buffers should be aligned by 32-bit + + @par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. The inputs to the + multiplications are 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. + This approach provides 33 guard bits and there is no risk of overflow. The 34.30 result is then + truncated to 34.15 format by discarding the low 15 bits and then saturated to 1.15 format. + */ + +arm_status arm_mat_cmplx_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pScratch) +{ + q15_t *pSrcBT = pScratch; /* input data matrix pointer for transpose */ + q15_t *pInA = pSrcA->pData; /* input data matrix pointer A of Q15 type */ + q15_t *pInB = pSrcB->pData; /* input data matrix pointer B of Q15 type */ + q15_t *px; /* Temporary output data matrix pointer */ + uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ + uint16_t numRowsB = pSrcB->numRows; /* number of rows of input matrix A */ + q63_t sumReal, sumImag; /* accumulator */ + uint32_t col, i = 0U, row = numRowsB, colCnt; /* Loop counters */ + arm_status status; /* Status of matrix multiplication */ + +#if defined (ARM_MATH_DSP) + q31_t prod1, prod2; + q31_t pSourceA, pSourceB; +#else + q15_t a, b, c, d; +#endif /* #if defined (ARM_MATH_DSP) */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || + (pSrcB->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Matrix transpose */ + do + { + /* The pointer px is set to starting address of column being processed */ + px = pSrcBT + i; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Apply loop unrolling and exchange the columns with row elements */ + col = numColsB >> 2; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + a second loop below computes the remaining 1 to 3 samples. */ + while (col > 0U) + { + /* Read two elements from row */ + write_q15x2 (px, read_q15x2_ia (&pInB)); + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB * 2; + + /* Read two elements from row */ + write_q15x2 (px, read_q15x2_ia (&pInB)); + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB * 2; + + /* Read two elements from row */ + write_q15x2 (px, read_q15x2_ia (&pInB)); + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB * 2; + + /* Read two elements from row */ + write_q15x2 (px, read_q15x2_ia (&pInB)); + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB * 2; + + /* Decrement column loop counter */ + col--; + } + + /* If the columns of pSrcB is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + col = numColsB % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + col = numColsB; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (col > 0U) + { + /* Read two elements from row */ + write_q15x2 (px, read_q15x2_ia (&pInB)); + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB * 2; + + /* Decrement column loop counter */ + col--; + } + + i = i + 2U; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + + /* Reset variables for usage in following multiplication process */ + row = numRowsA; + i = 0U; + px = pDst->pData; + + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* row loop */ + do + { + /* For every row wise process, column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, pIn2 pointer is set to starting address of transposed pSrcB data */ + pInB = pSrcBT; + + /* column loop */ + do + { + /* Set variable sum, that acts as accumulator, to zero */ + sumReal = 0; + sumImag = 0; + + /* Initiate pointer pInA to point to starting address of column being processed */ + pInA = pSrcA->pData + i * 2; + + /* Apply loop unrolling and compute 2 MACs simultaneously. */ + colCnt = numColsA >> 1U; + + /* matrix multiplication */ + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + +#if defined (ARM_MATH_DSP) + + /* read real and imag values from pSrcA and pSrcB buffer */ + pSourceA = read_q15x2_ia ((q15_t **) &pInA); + pSourceB = read_q15x2_ia ((q15_t **) &pInB); + + /* Multiply and Accumlates */ +#ifdef ARM_MATH_BIG_ENDIAN + prod1 = -__SMUSD(pSourceA, pSourceB); +#else + prod1 = __SMUSD(pSourceA, pSourceB); +#endif + prod2 = __SMUADX(pSourceA, pSourceB); + sumReal += (q63_t) prod1; + sumImag += (q63_t) prod2; + + /* read real and imag values from pSrcA and pSrcB buffer */ + pSourceA = read_q15x2_ia ((q15_t **) &pInA); + pSourceB = read_q15x2_ia ((q15_t **) &pInB); + + /* Multiply and Accumlates */ +#ifdef ARM_MATH_BIG_ENDIAN + prod1 = -__SMUSD(pSourceA, pSourceB); +#else + prod1 = __SMUSD(pSourceA, pSourceB); +#endif + prod2 = __SMUADX(pSourceA, pSourceB); + sumReal += (q63_t) prod1; + sumImag += (q63_t) prod2; + +#else /* #if defined (ARM_MATH_DSP) */ + + /* read real and imag values from pSrcA buffer */ + a = *pInA; + b = *(pInA + 1U); + /* read real and imag values from pSrcB buffer */ + c = *pInB; + d = *(pInB + 1U); + + /* Multiply and Accumlates */ + sumReal += (q31_t) a *c; + sumImag += (q31_t) a *d; + sumReal -= (q31_t) b *d; + sumImag += (q31_t) b *c; + + /* read next real and imag values from pSrcA buffer */ + a = *(pInA + 2U); + b = *(pInA + 3U); + /* read next real and imag values from pSrcB buffer */ + c = *(pInB + 2U); + d = *(pInB + 3U); + + /* update pointer */ + pInA += 4U; + + /* Multiply and Accumlates */ + sumReal += (q31_t) a * c; + sumImag += (q31_t) a * d; + sumReal -= (q31_t) b * d; + sumImag += (q31_t) b * c; + /* update pointer */ + pInB += 4U; + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + colCnt--; + } + + /* process odd column samples */ + if ((numColsA & 0x1U) > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + +#if defined (ARM_MATH_DSP) + /* read real and imag values from pSrcA and pSrcB buffer */ + pSourceA = read_q15x2_ia ((q15_t **) &pInA); + pSourceB = read_q15x2_ia ((q15_t **) &pInB); + + /* Multiply and Accumlates */ +#ifdef ARM_MATH_BIG_ENDIAN + prod1 = -__SMUSD(pSourceA, pSourceB); +#else + prod1 = __SMUSD(pSourceA, pSourceB); +#endif + prod2 = __SMUADX(pSourceA, pSourceB); + sumReal += (q63_t) prod1; + sumImag += (q63_t) prod2; + +#else /* #if defined (ARM_MATH_DSP) */ + + /* read real and imag values from pSrcA and pSrcB buffer */ + a = *pInA++; + b = *pInA++; + c = *pInB++; + d = *pInB++; + + /* Multiply and Accumlates */ + sumReal += (q31_t) a * c; + sumImag += (q31_t) a * d; + sumReal -= (q31_t) b * d; + sumImag += (q31_t) b * c; + +#endif /* #if defined (ARM_MATH_DSP) */ + + } + + /* Saturate and store result in destination buffer */ + *px++ = (q15_t) (__SSAT(sumReal >> 15, 16)); + *px++ = (q15_t) (__SSAT(sumImag >> 15, 16)); + + /* Decrement column loop counter */ + col--; + + } while (col > 0U); + + i = i + numColsA; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixMult group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c new file mode 100644 index 0000000..7b458f9 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c @@ -0,0 +1,283 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_cmplx_mult_q31.c + * Description: Floating-point matrix multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup CmplxMatrixMult + @{ + */ + +/** + @brief Q31 Complex matrix multiplication. + @param[in] pSrcA points to first input complex matrix structure + @param[in] pSrcB points to second input complex matrix structure + @param[out] pDst points to output complex matrix structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @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. There is no saturation + on intermediate additions. Thus, if the accumulator overflows it wraps around and + distorts the result. The input signals should be scaled down to avoid intermediate + overflows. The input is thus scaled down by log2(numColsA) bits + to avoid overflows, as a total of numColsA additions are performed internally. + The 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. + */ + +arm_status arm_mat_cmplx_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst) +{ + q31_t *pIn1 = pSrcA->pData; /* Input data matrix pointer A */ + q31_t *pIn2 = pSrcB->pData; /* Input data matrix pointer B */ + q31_t *pInA = pSrcA->pData; /* Input data matrix pointer A */ + q31_t *pOut = pDst->pData; /* Output data matrix pointer */ + q31_t *px; /* Temporary output data matrix pointer */ + uint16_t numRowsA = pSrcA->numRows; /* Number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* Number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* Number of columns of input matrix A */ + q63_t sumReal, sumImag; /* Accumulator */ + q31_t a1, b1, c1, d1; + uint32_t col, i = 0U, j, row = numRowsA, colCnt; /* loop counters */ + arm_status status; /* status of matrix multiplication */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t a0, b0, c0, d0; +#endif + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || + (pSrcB->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* row loop */ + do + { + /* Output pointer is set to starting address of the row being processed */ + px = pOut + 2 * i; + + /* For every row wise process, the column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, the pIn2 pointer is set + ** to the starting address of the pSrcB data */ + pIn2 = pSrcB->pData; + + j = 0U; + + /* column loop */ + do + { + /* Set the variable sum, that acts as accumulator, to zero */ + sumReal = 0.0; + sumImag = 0.0; + + /* Initiate pointer pIn1 to point to starting address of column being processed */ + pIn1 = pInA; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Apply loop unrolling and compute 4 MACs simultaneously. */ + colCnt = numColsA >> 2U; + + /* matrix multiplication */ + while (colCnt > 0U) + { + + /* Reading real part of complex matrix A */ + a0 = *pIn1; + + /* Reading real part of complex matrix B */ + c0 = *pIn2; + + /* Reading imaginary part of complex matrix A */ + b0 = *(pIn1 + 1U); + + /* Reading imaginary part of complex matrix B */ + d0 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += (q63_t) a0 * c0; + sumImag += (q63_t) b0 * c0; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= (q63_t) b0 * d0; + sumImag += (q63_t) a0 * d0; + + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + /* read real and imag values from pSrcA and pSrcB buffer */ + a1 = *(pIn1 ); + c1 = *(pIn2 ); + b1 = *(pIn1 + 1U); + d1 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += (q63_t) a1 * c1; + sumImag += (q63_t) b1 * c1; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= (q63_t) b1 * d1; + sumImag += (q63_t) a1 * d1; + + a0 = *(pIn1 ); + c0 = *(pIn2 ); + b0 = *(pIn1 + 1U); + d0 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += (q63_t) a0 * c0; + sumImag += (q63_t) b0 * c0; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= (q63_t) b0 * d0; + sumImag += (q63_t) a0 * d0; + + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + a1 = *(pIn1 ); + c1 = *(pIn2 ); + b1 = *(pIn1 + 1U); + d1 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += (q63_t) a1 * c1; + sumImag += (q63_t) b1 * c1; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= (q63_t) b1 * d1; + sumImag += (q63_t) a1 * d1; + + /* Decrement loop count */ + colCnt--; + } + + /* If the columns of pSrcA is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + colCnt = numColsA % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + colCnt = numColsA; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + a1 = *(pIn1 ); + c1 = *(pIn2 ); + b1 = *(pIn1 + 1U); + d1 = *(pIn2 + 1U); + + /* Multiply and Accumlates */ + sumReal += (q63_t) a1 * c1; + sumImag += (q63_t) b1 * c1; + + /* update pointers */ + pIn1 += 2U; + pIn2 += 2 * numColsB; + + /* Multiply and Accumlates */ + sumReal -= (q63_t) b1 * d1; + sumImag += (q63_t) a1 * d1; + + /* Decrement loop counter */ + colCnt--; + } + + /* Store result in destination buffer */ + *px++ = (q31_t) clip_q63_to_q31(sumReal >> 31); + *px++ = (q31_t) clip_q63_to_q31(sumImag >> 31); + + /* Update pointer pIn2 to point to starting address of next column */ + j++; + pIn2 = pSrcB->pData + 2U * j; + + /* Decrement column loop counter */ + col--; + + } while (col > 0U); + + /* Update pointer pInA to point to starting address of next row */ + i = i + numColsB; + pInA = pInA + 2 * numColsA; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixMult group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_f32.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_f32.c new file mode 100644 index 0000000..ce02a25 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_f32.c @@ -0,0 +1,76 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_init_f32.c + * Description: Floating-point matrix initialization + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @defgroup MatrixInit Matrix Initialization + + Initializes the underlying matrix data structure. + The functions set the numRows, + numCols, and pData fields + of the matrix data structure. + */ + +/** + @addtogroup MatrixInit + @{ + */ + +/** + @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 + @return none + */ + +void arm_mat_init_f32( + arm_matrix_instance_f32 * S, + uint16_t nRows, + uint16_t nColumns, + float32_t * pData) +{ + /* Assign Number of Rows */ + S->numRows = nRows; + + /* Assign Number of Columns */ + S->numCols = nColumns; + + /* Assign Data pointer */ + S->pData = pData; +} + +/** + @} end of MatrixInit group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q15.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q15.c new file mode 100644 index 0000000..0275503 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q15.c @@ -0,0 +1,67 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_init_q15.c + * Description: Q15 matrix initialization + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixInit + @{ + */ + +/** + @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 + @return none + */ + +void arm_mat_init_q15( + arm_matrix_instance_q15 * S, + uint16_t nRows, + uint16_t nColumns, + q15_t * pData) +{ + /* Assign Number of Rows */ + S->numRows = nRows; + + /* Assign Number of Columns */ + S->numCols = nColumns; + + /* Assign Data pointer */ + S->pData = pData; +} + +/** + @} end of MatrixInit group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q31.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q31.c new file mode 100644 index 0000000..d5c5722 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_init_q31.c @@ -0,0 +1,72 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_init_q31.c + * Description: Q31 matrix initialization + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @defgroup MatrixInit Matrix Initialization + + */ + +/** + @addtogroup MatrixInit + @{ + */ + +/** + @brief Q31 matrix initialization. + @param[in,out] S points to an instance of the Q31 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 + @return none + */ + +void arm_mat_init_q31( + arm_matrix_instance_q31 * S, + uint16_t nRows, + uint16_t nColumns, + q31_t * pData) +{ + /* Assign Number of Rows */ + S->numRows = nRows; + + /* Assign Number of Columns */ + S->numCols = nColumns; + + /* Assign Data pointer */ + S->pData = pData; +} + +/** + @} end of MatrixInit group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f32.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f32.c new file mode 100644 index 0000000..d602b98 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f32.c @@ -0,0 +1,1127 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_inverse_f32.c + * Description: Floating-point matrix inverse + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @defgroup MatrixInv Matrix Inverse + + Computes the inverse of a matrix. + + The inverse is defined only if the input matrix is square and non-singular (the determinant is non-zero). + The function checks that the input and output matrices are square and of the same size. + + Matrix inversion is numerically sensitive and the CMSIS DSP library only supports matrix + inversion of floating-point matrices. + + @par Algorithm + The Gauss-Jordan method is used to find the inverse. + The algorithm performs a sequence of elementary row-operations until it + reduces the input matrix to an identity matrix. Applying the same sequence + of elementary row-operations to an identity matrix yields the inverse matrix. + If the input matrix is singular, then the algorithm terminates and returns error status + ARM_MATH_SINGULAR. + \image html MatrixInverse.gif "Matrix Inverse of a 3 x 3 matrix using Gauss-Jordan Method" + */ + +/** + @addtogroup MatrixInv + @{ + */ + +/** + @brief Floating-point matrix inverse. + @param[in] pSrc points to input matrix structure + @param[out] pDst points to output matrix structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + - \ref ARM_MATH_SINGULAR : Input matrix is found to be singular (non-invertible) + */ +#if defined(ARM_MATH_NEON) +arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn = pSrc->pData; /* input data matrix pointer */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + float32_t *pInT1, *pInT2; /* Temporary input data matrix pointer */ + float32_t *pOutT1, *pOutT2; /* Temporary output data matrix pointer */ + float32_t *pPivotRowIn, *pPRT_in, *pPivotRowDst, *pPRT_pDst; /* Temporary input and output data matrix pointer */ + uint32_t numRows = pSrc->numRows; /* Number of rows in the matrix */ + uint32_t numCols = pSrc->numCols; /* Number of Cols in the matrix */ + + float32_t maxC; /* maximum value in the column */ + + float32_t Xchg, in = 0.0f, in1; /* Temporary input values */ + uint32_t i, rowCnt, flag = 0U, j, loopCnt, k, l; /* loop counters */ + arm_status status; /* status of matrix inverse */ + float32x4_t vec1; + float32x4_t vec2; + float32x4_t tmpV; + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pSrc->numCols) || (pDst->numRows != pDst->numCols) + || (pSrc->numRows != pDst->numRows)) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /*-------------------------------------------------------------------------------------------------------------- + * Matrix Inverse can be solved using elementary row operations. + * + * Gauss-Jordan Method: + * + * 1. First combine the identity matrix and the input matrix separated by a bar to form an + * augmented matrix as follows: + * _ _ _ _ + * | a11 a12 | 1 0 | | X11 X12 | + * | | | = | | + * |_ a21 a22 | 0 1 _| |_ X21 X21 _| + * + * 2. In our implementation, pDst Matrix is used as identity matrix. + * + * 3. Begin with the first row. Let i = 1. + * + * 4. Check to see if the pivot for column i is the greatest of the column. + * The pivot is the element of the main diagonal that is on the current row. + * For instance, if working with row i, then the pivot element is aii. + * If the pivot is not the most significant of the columns, exchange that row with a row + * below it that does contain the most significant value in column i. If the most + * significant value of the column is zero, then an inverse to that matrix does not exist. + * The most significant value of the column is the absolute maximum. + * + * 5. Divide every element of row i by the pivot. + * + * 6. For every row below and row i, replace that row with the sum of that row and + * a multiple of row i so that each new element in column i below row i is zero. + * + * 7. Move to the next row and column and repeat steps 2 through 5 until you have zeros + * for every element below and above the main diagonal. + * + * 8. Now an identical matrix is formed to the left of the bar(input matrix, pSrc). + * Therefore, the matrix to the right of the bar is our solution(pDst matrix, pDst). + *----------------------------------------------------------------------------------------------------------------*/ + + /* Working pointer for destination matrix */ + pOutT1 = pOut; + + /* Loop over the number of rows */ + rowCnt = numRows; + + /* Making the destination matrix as identity matrix */ + while (rowCnt > 0U) + { + /* Writing all zeroes in lower triangle of the destination matrix */ + j = numRows - rowCnt; + while (j > 0U) + { + *pOutT1++ = 0.0f; + j--; + } + + /* Writing all ones in the diagonal of the destination matrix */ + *pOutT1++ = 1.0f; + + /* Writing all zeroes in upper triangle of the destination matrix */ + j = rowCnt - 1U; + + while (j > 0U) + { + *pOutT1++ = 0.0f; + j--; + } + + /* Decrement the loop counter */ + rowCnt--; + } + + /* Loop over the number of columns of the input matrix. + All the elements in each column are processed by the row operations */ + loopCnt = numCols; + + /* Index modifier to navigate through the columns */ + l = 0U; + + while (loopCnt > 0U) + { + /* Check if the pivot element is zero.. + * If it is zero then interchange the row with non zero row below. + * If there is no non zero element to replace in the rows below, + * then the matrix is Singular. */ + + /* Working pointer for the input matrix that points + * to the pivot element of the particular row */ + pInT1 = pIn + (l * numCols); + + /* Working pointer for the destination matrix that points + * to the pivot element of the particular row */ + pOutT1 = pOut + (l * numCols); + + /* Temporary variable to hold the pivot value */ + in = *pInT1; + + /* Grab the most significant value from column l */ + maxC = 0; + + for (i = l; i < numRows; i++) + { + maxC = *pInT1 > 0 ? (*pInT1 > maxC ? *pInT1 : maxC) : (-*pInT1 > maxC ? -*pInT1 : maxC); + pInT1 += numCols; + } + + /* Update the status if the matrix is singular */ + if (maxC == 0.0f) + { + return ARM_MATH_SINGULAR; + } + + /* Restore pInT1 */ + pInT1 = pIn; + + /* Destination pointer modifier */ + k = 1U; + + /* Check if the pivot element is the most significant of the column */ + if ( (in > 0.0f ? in : -in) != maxC) + { + /* Loop over the number rows present below */ + i = numRows - (l + 1U); + + while (i > 0U) + { + /* Update the input and destination pointers */ + pInT2 = pInT1 + (numCols * l); + pOutT2 = pOutT1 + (numCols * k); + + /* Look for the most significant element to + * replace in the rows below */ + if ((*pInT2 > 0.0f ? *pInT2: -*pInT2) == maxC) + { + /* Loop over number of columns + * to the right of the pilot element */ + j = numCols - l; + + while (j > 0U) + { + /* Exchange the row elements of the input matrix */ + Xchg = *pInT2; + *pInT2++ = *pInT1; + *pInT1++ = Xchg; + + /* Decrement the loop counter */ + j--; + } + + /* Loop over number of columns of the destination matrix */ + j = numCols; + + while (j > 0U) + { + /* Exchange the row elements of the destination matrix */ + Xchg = *pOutT2; + *pOutT2++ = *pOutT1; + *pOutT1++ = Xchg; + + /* Decrement the loop counter */ + j--; + } + + /* Flag to indicate whether exchange is done or not */ + flag = 1U; + + /* Break after exchange is done */ + break; + } + + /* Update the destination pointer modifier */ + k++; + + /* Decrement the loop counter */ + i--; + } + } + + /* Update the status if the matrix is singular */ + if ((flag != 1U) && (in == 0.0f)) + { + return ARM_MATH_SINGULAR; + } + + /* Points to the pivot row of input and destination matrices */ + pPivotRowIn = pIn + (l * numCols); + pPivotRowDst = pOut + (l * numCols); + + /* Temporary pointers to the pivot row pointers */ + pInT1 = pPivotRowIn; + pInT2 = pPivotRowDst; + + /* Pivot element of the row */ + in = *pPivotRowIn; + tmpV = vdupq_n_f32(1.0/in); + + /* Loop over number of columns + * to the right of the pilot element */ + j = (numCols - l) >> 2; + + while (j > 0U) + { + /* Divide each element of the row of the input matrix + * by the pivot element */ + vec1 = vld1q_f32(pInT1); + + vec1 = vmulq_f32(vec1, tmpV); + vst1q_f32(pInT1, vec1); + pInT1 += 4; + + /* Decrement the loop counter */ + j--; + } + + /* Tail */ + j = (numCols - l) & 3; + + while (j > 0U) + { + /* Divide each element of the row of the input matrix + * by the pivot element */ + in1 = *pInT1; + *pInT1++ = in1 / in; + + /* Decrement the loop counter */ + j--; + } + + /* Loop over number of columns of the destination matrix */ + j = numCols >> 2; + + while (j > 0U) + { + /* Divide each element of the row of the destination matrix + * by the pivot element */ + vec1 = vld1q_f32(pInT2); + + vec1 = vmulq_f32(vec1, tmpV); + vst1q_f32(pInT2, vec1); + pInT2 += 4; + + /* Decrement the loop counter */ + j--; + } + + /* Tail */ + j = numCols & 3; + + while (j > 0U) + { + /* Divide each element of the row of the destination matrix + * by the pivot element */ + in1 = *pInT2; + *pInT2++ = in1 / in; + + /* Decrement the loop counter */ + j--; + } + + /* Replace the rows with the sum of that row and a multiple of row i + * so that each new element in column i above row i is zero.*/ + + /* Temporary pointers for input and destination matrices */ + pInT1 = pIn; + pInT2 = pOut; + + /* index used to check for pivot element */ + i = 0U; + + /* Loop over number of rows */ + /* to be replaced by the sum of that row and a multiple of row i */ + k = numRows; + + while (k > 0U) + { + /* Check for the pivot element */ + if (i == l) + { + /* If the processing element is the pivot element, + only the columns to the right are to be processed */ + pInT1 += numCols - l; + + pInT2 += numCols; + } + else + { + /* Element of the reference row */ + in = *pInT1; + tmpV = vdupq_n_f32(in); + + /* Working pointers for input and destination pivot rows */ + pPRT_in = pPivotRowIn; + pPRT_pDst = pPivotRowDst; + + /* Loop over the number of columns to the right of the pivot element, + to replace the elements in the input matrix */ + j = (numCols - l) >> 2; + + while (j > 0U) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + vec1 = vld1q_f32(pInT1); + vec2 = vld1q_f32(pPRT_in); + vec1 = vmlsq_f32(vec1, tmpV, vec2); + vst1q_f32(pInT1, vec1); + pPRT_in += 4; + pInT1 += 4; + + /* Decrement the loop counter */ + j--; + } + + /* Tail */ + j = (numCols - l) & 3; + + while (j > 0U) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + in1 = *pInT1; + *pInT1++ = in1 - (in * *pPRT_in++); + + /* Decrement the loop counter */ + j--; + } + + /* Loop over the number of columns to + replace the elements in the destination matrix */ + j = numCols >> 2; + + while (j > 0U) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + vec1 = vld1q_f32(pInT2); + vec2 = vld1q_f32(pPRT_pDst); + vec1 = vmlsq_f32(vec1, tmpV, vec2); + vst1q_f32(pInT2, vec1); + pPRT_pDst += 4; + pInT2 += 4; + + /* Decrement the loop counter */ + j--; + } + + /* Tail */ + j = numCols & 3; + + while (j > 0U) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + in1 = *pInT2; + *pInT2++ = in1 - (in * *pPRT_pDst++); + + /* Decrement the loop counter */ + j--; + } + + } + + /* Increment the temporary input pointer */ + pInT1 = pInT1 + l; + + /* Decrement the loop counter */ + k--; + + /* Increment the pivot index */ + i++; + } + + /* Increment the input pointer */ + pIn++; + + /* Decrement the loop counter */ + loopCnt--; + + /* Increment the index modifier */ + l++; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + + if ((flag != 1U) && (in == 0.0f)) + { + pIn = pSrc->pData; + for (i = 0; i < numRows * numCols; i++) + { + if (pIn[i] != 0.0f) + break; + } + + if (i == numRows * numCols) + status = ARM_MATH_SINGULAR; + } + } + /* Return to application */ + return (status); +} +#else +arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn = pSrc->pData; /* input data matrix pointer */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + float32_t *pInT1, *pInT2; /* Temporary input data matrix pointer */ + float32_t *pOutT1, *pOutT2; /* Temporary output data matrix pointer */ + float32_t *pPivotRowIn, *pPRT_in, *pPivotRowDst, *pPRT_pDst; /* Temporary input and output data matrix pointer */ + uint32_t numRows = pSrc->numRows; /* Number of rows in the matrix */ + uint32_t numCols = pSrc->numCols; /* Number of Cols in the matrix */ + +#if defined (ARM_MATH_DSP) + float32_t maxC; /* maximum value in the column */ + + float32_t Xchg, in = 0.0f, in1; /* Temporary input values */ + uint32_t i, rowCnt, flag = 0U, j, loopCnt, k, l; /* loop counters */ + arm_status status; /* status of matrix inverse */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pSrc->numCols) || + (pDst->numRows != pDst->numCols) || + (pSrc->numRows != pDst->numRows) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + + /*-------------------------------------------------------------------------------------------------------------- + * Matrix Inverse can be solved using elementary row operations. + * + * Gauss-Jordan Method: + * + * 1. First combine the identity matrix and the input matrix separated by a bar to form an + * augmented matrix as follows: + * _ _ _ _ + * | a11 a12 | 1 0 | | X11 X12 | + * | | | = | | + * |_ a21 a22 | 0 1 _| |_ X21 X21 _| + * + * 2. In our implementation, pDst Matrix is used as identity matrix. + * + * 3. Begin with the first row. Let i = 1. + * + * 4. Check to see if the pivot for column i is the greatest of the column. + * The pivot is the element of the main diagonal that is on the current row. + * For instance, if working with row i, then the pivot element is aii. + * If the pivot is not the most significant of the columns, exchange that row with a row + * below it that does contain the most significant value in column i. If the most + * significant value of the column is zero, then an inverse to that matrix does not exist. + * The most significant value of the column is the absolute maximum. + * + * 5. Divide every element of row i by the pivot. + * + * 6. For every row below and row i, replace that row with the sum of that row and + * a multiple of row i so that each new element in column i below row i is zero. + * + * 7. Move to the next row and column and repeat steps 2 through 5 until you have zeros + * for every element below and above the main diagonal. + * + * 8. Now an identical matrix is formed to the left of the bar(input matrix, pSrc). + * Therefore, the matrix to the right of the bar is our solution(pDst matrix, pDst). + *----------------------------------------------------------------------------------------------------------------*/ + + /* Working pointer for destination matrix */ + pOutT1 = pOut; + + /* Loop over the number of rows */ + rowCnt = numRows; + + /* Making the destination matrix as identity matrix */ + while (rowCnt > 0U) + { + /* Writing all zeroes in lower triangle of the destination matrix */ + j = numRows - rowCnt; + while (j > 0U) + { + *pOutT1++ = 0.0f; + j--; + } + + /* Writing all ones in the diagonal of the destination matrix */ + *pOutT1++ = 1.0f; + + /* Writing all zeroes in upper triangle of the destination matrix */ + j = rowCnt - 1U; + while (j > 0U) + { + *pOutT1++ = 0.0f; + j--; + } + + /* Decrement loop counter */ + rowCnt--; + } + + /* Loop over the number of columns of the input matrix. + All the elements in each column are processed by the row operations */ + loopCnt = numCols; + + /* Index modifier to navigate through the columns */ + l = 0U; + + while (loopCnt > 0U) + { + /* Check if the pivot element is zero.. + * If it is zero then interchange the row with non zero row below. + * If there is no non zero element to replace in the rows below, + * then the matrix is Singular. */ + + /* Working pointer for the input matrix that points + * to the pivot element of the particular row */ + pInT1 = pIn + (l * numCols); + + /* Working pointer for the destination matrix that points + * to the pivot element of the particular row */ + pOutT1 = pOut + (l * numCols); + + /* Temporary variable to hold the pivot value */ + in = *pInT1; + + /* Grab the most significant value from column l */ + maxC = 0; + for (i = l; i < numRows; i++) + { + maxC = *pInT1 > 0 ? (*pInT1 > maxC ? *pInT1 : maxC) : (-*pInT1 > maxC ? -*pInT1 : maxC); + pInT1 += numCols; + } + + /* Update the status if the matrix is singular */ + if (maxC == 0.0f) + { + return ARM_MATH_SINGULAR; + } + + /* Restore pInT1 */ + pInT1 = pIn; + + /* Destination pointer modifier */ + k = 1U; + + /* Check if the pivot element is the most significant of the column */ + if ( (in > 0.0f ? in : -in) != maxC) + { + /* Loop over the number rows present below */ + i = numRows - (l + 1U); + + while (i > 0U) + { + /* Update the input and destination pointers */ + pInT2 = pInT1 + (numCols * l); + pOutT2 = pOutT1 + (numCols * k); + + /* Look for the most significant element to + * replace in the rows below */ + if ((*pInT2 > 0.0f ? *pInT2: -*pInT2) == maxC) + { + /* Loop over number of columns + * to the right of the pilot element */ + j = numCols - l; + + while (j > 0U) + { + /* Exchange the row elements of the input matrix */ + Xchg = *pInT2; + *pInT2++ = *pInT1; + *pInT1++ = Xchg; + + /* Decrement the loop counter */ + j--; + } + + /* Loop over number of columns of the destination matrix */ + j = numCols; + + while (j > 0U) + { + /* Exchange the row elements of the destination matrix */ + Xchg = *pOutT2; + *pOutT2++ = *pOutT1; + *pOutT1++ = Xchg; + + /* Decrement loop counter */ + j--; + } + + /* Flag to indicate whether exchange is done or not */ + flag = 1U; + + /* Break after exchange is done */ + break; + } + + /* Update the destination pointer modifier */ + k++; + + /* Decrement loop counter */ + i--; + } + } + + /* Update the status if the matrix is singular */ + if ((flag != 1U) && (in == 0.0f)) + { + return ARM_MATH_SINGULAR; + } + + /* Points to the pivot row of input and destination matrices */ + pPivotRowIn = pIn + (l * numCols); + pPivotRowDst = pOut + (l * numCols); + + /* Temporary pointers to the pivot row pointers */ + pInT1 = pPivotRowIn; + pInT2 = pPivotRowDst; + + /* Pivot element of the row */ + in = *pPivotRowIn; + + /* Loop over number of columns + * to the right of the pilot element */ + j = (numCols - l); + + while (j > 0U) + { + /* Divide each element of the row of the input matrix + * by the pivot element */ + in1 = *pInT1; + *pInT1++ = in1 / in; + + /* Decrement the loop counter */ + j--; + } + + /* Loop over number of columns of the destination matrix */ + j = numCols; + + while (j > 0U) + { + /* Divide each element of the row of the destination matrix + * by the pivot element */ + in1 = *pInT2; + *pInT2++ = in1 / in; + + /* Decrement the loop counter */ + j--; + } + + /* Replace the rows with the sum of that row and a multiple of row i + * so that each new element in column i above row i is zero.*/ + + /* Temporary pointers for input and destination matrices */ + pInT1 = pIn; + pInT2 = pOut; + + /* index used to check for pivot element */ + i = 0U; + + /* Loop over number of rows */ + /* to be replaced by the sum of that row and a multiple of row i */ + k = numRows; + + while (k > 0U) + { + /* Check for the pivot element */ + if (i == l) + { + /* If the processing element is the pivot element, + only the columns to the right are to be processed */ + pInT1 += numCols - l; + + pInT2 += numCols; + } + else + { + /* Element of the reference row */ + in = *pInT1; + + /* Working pointers for input and destination pivot rows */ + pPRT_in = pPivotRowIn; + pPRT_pDst = pPivotRowDst; + + /* Loop over the number of columns to the right of the pivot element, + to replace the elements in the input matrix */ + j = (numCols - l); + + while (j > 0U) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + in1 = *pInT1; + *pInT1++ = in1 - (in * *pPRT_in++); + + /* Decrement the loop counter */ + j--; + } + + /* Loop over the number of columns to + replace the elements in the destination matrix */ + j = numCols; + + while (j > 0U) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + in1 = *pInT2; + *pInT2++ = in1 - (in * *pPRT_pDst++); + + /* Decrement loop counter */ + j--; + } + + } + + /* Increment temporary input pointer */ + pInT1 = pInT1 + l; + + /* Decrement loop counter */ + k--; + + /* Increment pivot index */ + i++; + } + + /* Increment the input pointer */ + pIn++; + + /* Decrement the loop counter */ + loopCnt--; + + /* Increment the index modifier */ + l++; + } + + +#else + + float32_t Xchg, in = 0.0f; /* Temporary input values */ + uint32_t i, rowCnt, flag = 0U, j, loopCnt, k, l; /* loop counters */ + arm_status status; /* status of matrix inverse */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pSrc->numCols) || + (pDst->numRows != pDst->numCols) || + (pSrc->numRows != pDst->numRows) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + + /*-------------------------------------------------------------------------------------------------------------- + * Matrix Inverse can be solved using elementary row operations. + * + * Gauss-Jordan Method: + * + * 1. First combine the identity matrix and the input matrix separated by a bar to form an + * augmented matrix as follows: + * _ _ _ _ _ _ _ _ + * | | a11 a12 | | | 1 0 | | | X11 X12 | + * | | | | | | | = | | + * |_ |_ a21 a22 _| | |_0 1 _| _| |_ X21 X21 _| + * + * 2. In our implementation, pDst Matrix is used as identity matrix. + * + * 3. Begin with the first row. Let i = 1. + * + * 4. Check to see if the pivot for row i is zero. + * The pivot is the element of the main diagonal that is on the current row. + * For instance, if working with row i, then the pivot element is aii. + * If the pivot is zero, exchange that row with a row below it that does not + * contain a zero in column i. If this is not possible, then an inverse + * to that matrix does not exist. + * + * 5. Divide every element of row i by the pivot. + * + * 6. For every row below and row i, replace that row with the sum of that row and + * a multiple of row i so that each new element in column i below row i is zero. + * + * 7. Move to the next row and column and repeat steps 2 through 5 until you have zeros + * for every element below and above the main diagonal. + * + * 8. Now an identical matrix is formed to the left of the bar(input matrix, src). + * Therefore, the matrix to the right of the bar is our solution(dst matrix, dst). + *----------------------------------------------------------------------------------------------------------------*/ + + /* Working pointer for destination matrix */ + pOutT1 = pOut; + + /* Loop over the number of rows */ + rowCnt = numRows; + + /* Making the destination matrix as identity matrix */ + while (rowCnt > 0U) + { + /* Writing all zeroes in lower triangle of the destination matrix */ + j = numRows - rowCnt; + while (j > 0U) + { + *pOutT1++ = 0.0f; + j--; + } + + /* Writing all ones in the diagonal of the destination matrix */ + *pOutT1++ = 1.0f; + + /* Writing all zeroes in upper triangle of the destination matrix */ + j = rowCnt - 1U; + while (j > 0U) + { + *pOutT1++ = 0.0f; + j--; + } + + /* Decrement loop counter */ + rowCnt--; + } + + /* Loop over the number of columns of the input matrix. + All the elements in each column are processed by the row operations */ + loopCnt = numCols; + + /* Index modifier to navigate through the columns */ + l = 0U; + + while (loopCnt > 0U) + { + /* Check if the pivot element is zero.. + * If it is zero then interchange the row with non zero row below. + * If there is no non zero element to replace in the rows below, + * then the matrix is Singular. */ + + /* Working pointer for the input matrix that points + * to the pivot element of the particular row */ + pInT1 = pIn + (l * numCols); + + /* Working pointer for the destination matrix that points + * to the pivot element of the particular row */ + pOutT1 = pOut + (l * numCols); + + /* Temporary variable to hold the pivot value */ + in = *pInT1; + + /* Destination pointer modifier */ + k = 1U; + + /* Check if the pivot element is zero */ + if (*pInT1 == 0.0f) + { + /* Loop over the number rows present below */ + for (i = (l + 1U); i < numRows; i++) + { + /* Update the input and destination pointers */ + pInT2 = pInT1 + (numCols * l); + pOutT2 = pOutT1 + (numCols * k); + + /* Check if there is a non zero pivot element to + * replace in the rows below */ + if (*pInT2 != 0.0f) + { + /* Loop over number of columns + * to the right of the pilot element */ + for (j = 0U; j < (numCols - l); j++) + { + /* Exchange the row elements of the input matrix */ + Xchg = *pInT2; + *pInT2++ = *pInT1; + *pInT1++ = Xchg; + } + + for (j = 0U; j < numCols; j++) + { + Xchg = *pOutT2; + *pOutT2++ = *pOutT1; + *pOutT1++ = Xchg; + } + + /* Flag to indicate whether exchange is done or not */ + flag = 1U; + + /* Break after exchange is done */ + break; + } + + /* Update the destination pointer modifier */ + k++; + } + } + + /* Update the status if the matrix is singular */ + if ((flag != 1U) && (in == 0.0f)) + { + return ARM_MATH_SINGULAR; + } + + /* Points to the pivot row of input and destination matrices */ + pPivotRowIn = pIn + (l * numCols); + pPivotRowDst = pOut + (l * numCols); + + /* Temporary pointers to the pivot row pointers */ + pInT1 = pPivotRowIn; + pOutT1 = pPivotRowDst; + + /* Pivot element of the row */ + in = *(pIn + (l * numCols)); + + /* Loop over number of columns + * to the right of the pilot element */ + for (j = 0U; j < (numCols - l); j++) + { + /* Divide each element of the row of the input matrix + * by the pivot element */ + *pInT1 = *pInT1 / in; + pInT1++; + } + for (j = 0U; j < numCols; j++) + { + /* Divide each element of the row of the destination matrix + * by the pivot element */ + *pOutT1 = *pOutT1 / in; + pOutT1++; + } + + /* Replace the rows with the sum of that row and a multiple of row i + * so that each new element in column i above row i is zero.*/ + + /* Temporary pointers for input and destination matrices */ + pInT1 = pIn; + pOutT1 = pOut; + + for (i = 0U; i < numRows; i++) + { + /* Check for the pivot element */ + if (i == l) + { + /* If the processing element is the pivot element, + only the columns to the right are to be processed */ + pInT1 += numCols - l; + pOutT1 += numCols; + } + else + { + /* Element of the reference row */ + in = *pInT1; + + /* Working pointers for input and destination pivot rows */ + pPRT_in = pPivotRowIn; + pPRT_pDst = pPivotRowDst; + + /* Loop over the number of columns to the right of the pivot element, + to replace the elements in the input matrix */ + for (j = 0U; j < (numCols - l); j++) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + *pInT1 = *pInT1 - (in * *pPRT_in++); + pInT1++; + } + + /* Loop over the number of columns to + replace the elements in the destination matrix */ + for (j = 0U; j < numCols; j++) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + *pOutT1 = *pOutT1 - (in * *pPRT_pDst++); + pOutT1++; + } + + } + + /* Increment temporary input pointer */ + pInT1 = pInT1 + l; + } + + /* Increment the input pointer */ + pIn++; + + /* Decrement the loop counter */ + loopCnt--; + + /* Increment the index modifier */ + l++; + } + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + + if ((flag != 1U) && (in == 0.0f)) + { + pIn = pSrc->pData; + for (i = 0; i < numRows * numCols; i++) + { + if (pIn[i] != 0.0f) + break; + } + + if (i == numRows * numCols) + status = ARM_MATH_SINGULAR; + } + } + + /* Return to application */ + return (status); +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of MatrixInv group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f64.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f64.c new file mode 100644 index 0000000..4607e07 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_inverse_f64.c @@ -0,0 +1,673 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_inverse_f64.c + * Description: Floating-point matrix inverse + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + + +/** + @addtogroup MatrixInv + @{ + */ + +/** + @brief Floating-point (64 bit) matrix inverse. + @param[in] pSrc points to input matrix structure + @param[out] pDst points to output matrix structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + - \ref ARM_MATH_SINGULAR : Input matrix is found to be singular (non-invertible) + */ + +arm_status arm_mat_inverse_f64( + const arm_matrix_instance_f64 * pSrc, + arm_matrix_instance_f64 * pDst) +{ + float64_t *pIn = pSrc->pData; /* input data matrix pointer */ + float64_t *pOut = pDst->pData; /* output data matrix pointer */ + float64_t *pInT1, *pInT2; /* Temporary input data matrix pointer */ + float64_t *pOutT1, *pOutT2; /* Temporary output data matrix pointer */ + float64_t *pPivotRowIn, *pPRT_in, *pPivotRowDst, *pPRT_pDst; /* Temporary input and output data matrix pointer */ + uint32_t numRows = pSrc->numRows; /* Number of rows in the matrix */ + uint32_t numCols = pSrc->numCols; /* Number of Cols in the matrix */ + +#if defined (ARM_MATH_DSP) + float64_t maxC; /* maximum value in the column */ + + float64_t Xchg, in = 0.0, in1; /* Temporary input values */ + uint32_t i, rowCnt, flag = 0U, j, loopCnt, k, l; /* loop counters */ + arm_status status; /* status of matrix inverse */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pSrc->numCols) || + (pDst->numRows != pDst->numCols) || + (pSrc->numRows != pDst->numRows) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + + /*-------------------------------------------------------------------------------------------------------------- + * Matrix Inverse can be solved using elementary row operations. + * + * Gauss-Jordan Method: + * + * 1. First combine the identity matrix and the input matrix separated by a bar to form an + * augmented matrix as follows: + * _ _ _ _ + * | a11 a12 | 1 0 | | X11 X12 | + * | | | = | | + * |_ a21 a22 | 0 1 _| |_ X21 X21 _| + * + * 2. In our implementation, pDst Matrix is used as identity matrix. + * + * 3. Begin with the first row. Let i = 1. + * + * 4. Check to see if the pivot for column i is the greatest of the column. + * The pivot is the element of the main diagonal that is on the current row. + * For instance, if working with row i, then the pivot element is aii. + * If the pivot is not the most significant of the columns, exchange that row with a row + * below it that does contain the most significant value in column i. If the most + * significant value of the column is zero, then an inverse to that matrix does not exist. + * The most significant value of the column is the absolute maximum. + * + * 5. Divide every element of row i by the pivot. + * + * 6. For every row below and row i, replace that row with the sum of that row and + * a multiple of row i so that each new element in column i below row i is zero. + * + * 7. Move to the next row and column and repeat steps 2 through 5 until you have zeros + * for every element below and above the main diagonal. + * + * 8. Now an identical matrix is formed to the left of the bar(input matrix, pSrc). + * Therefore, the matrix to the right of the bar is our solution(pDst matrix, pDst). + *----------------------------------------------------------------------------------------------------------------*/ + + /* Working pointer for destination matrix */ + pOutT1 = pOut; + + /* Loop over the number of rows */ + rowCnt = numRows; + + /* Making the destination matrix as identity matrix */ + while (rowCnt > 0U) + { + /* Writing all zeroes in lower triangle of the destination matrix */ + j = numRows - rowCnt; + while (j > 0U) + { + *pOutT1++ = 0.0; + j--; + } + + /* Writing all ones in the diagonal of the destination matrix */ + *pOutT1++ = 1.0; + + /* Writing all zeroes in upper triangle of the destination matrix */ + j = rowCnt - 1U; + while (j > 0U) + { + *pOutT1++ = 0.0; + j--; + } + + /* Decrement loop counter */ + rowCnt--; + } + + /* Loop over the number of columns of the input matrix. + All the elements in each column are processed by the row operations */ + loopCnt = numCols; + + /* Index modifier to navigate through the columns */ + l = 0U; + + while (loopCnt > 0U) + { + /* Check if the pivot element is zero.. + * If it is zero then interchange the row with non zero row below. + * If there is no non zero element to replace in the rows below, + * then the matrix is Singular. */ + + /* Working pointer for the input matrix that points + * to the pivot element of the particular row */ + pInT1 = pIn + (l * numCols); + + /* Working pointer for the destination matrix that points + * to the pivot element of the particular row */ + pOutT1 = pOut + (l * numCols); + + /* Temporary variable to hold the pivot value */ + in = *pInT1; + + /* Grab the most significant value from column l */ + maxC = 0; + for (i = l; i < numRows; i++) + { + maxC = *pInT1 > 0 ? (*pInT1 > maxC ? *pInT1 : maxC) : (-*pInT1 > maxC ? -*pInT1 : maxC); + pInT1 += numCols; + } + + /* Update the status if the matrix is singular */ + if (maxC == 0.0) + { + return ARM_MATH_SINGULAR; + } + + /* Restore pInT1 */ + pInT1 = pIn; + + /* Destination pointer modifier */ + k = 1U; + + /* Check if the pivot element is the most significant of the column */ + if ( (in > 0.0 ? in : -in) != maxC) + { + /* Loop over the number rows present below */ + i = numRows - (l + 1U); + + while (i > 0U) + { + /* Update the input and destination pointers */ + pInT2 = pInT1 + (numCols * l); + pOutT2 = pOutT1 + (numCols * k); + + /* Look for the most significant element to + * replace in the rows below */ + if ((*pInT2 > 0.0 ? *pInT2: -*pInT2) == maxC) + { + /* Loop over number of columns + * to the right of the pilot element */ + j = numCols - l; + + while (j > 0U) + { + /* Exchange the row elements of the input matrix */ + Xchg = *pInT2; + *pInT2++ = *pInT1; + *pInT1++ = Xchg; + + /* Decrement the loop counter */ + j--; + } + + /* Loop over number of columns of the destination matrix */ + j = numCols; + + while (j > 0U) + { + /* Exchange the row elements of the destination matrix */ + Xchg = *pOutT2; + *pOutT2++ = *pOutT1; + *pOutT1++ = Xchg; + + /* Decrement loop counter */ + j--; + } + + /* Flag to indicate whether exchange is done or not */ + flag = 1U; + + /* Break after exchange is done */ + break; + } + + /* Update the destination pointer modifier */ + k++; + + /* Decrement loop counter */ + i--; + } + } + + /* Update the status if the matrix is singular */ + if ((flag != 1U) && (in == 0.0)) + { + return ARM_MATH_SINGULAR; + } + + /* Points to the pivot row of input and destination matrices */ + pPivotRowIn = pIn + (l * numCols); + pPivotRowDst = pOut + (l * numCols); + + /* Temporary pointers to the pivot row pointers */ + pInT1 = pPivotRowIn; + pInT2 = pPivotRowDst; + + /* Pivot element of the row */ + in = *pPivotRowIn; + + /* Loop over number of columns + * to the right of the pilot element */ + j = (numCols - l); + + while (j > 0U) + { + /* Divide each element of the row of the input matrix + * by the pivot element */ + in1 = *pInT1; + *pInT1++ = in1 / in; + + /* Decrement the loop counter */ + j--; + } + + /* Loop over number of columns of the destination matrix */ + j = numCols; + + while (j > 0U) + { + /* Divide each element of the row of the destination matrix + * by the pivot element */ + in1 = *pInT2; + *pInT2++ = in1 / in; + + /* Decrement the loop counter */ + j--; + } + + /* Replace the rows with the sum of that row and a multiple of row i + * so that each new element in column i above row i is zero.*/ + + /* Temporary pointers for input and destination matrices */ + pInT1 = pIn; + pInT2 = pOut; + + /* index used to check for pivot element */ + i = 0U; + + /* Loop over number of rows */ + /* to be replaced by the sum of that row and a multiple of row i */ + k = numRows; + + while (k > 0U) + { + /* Check for the pivot element */ + if (i == l) + { + /* If the processing element is the pivot element, + only the columns to the right are to be processed */ + pInT1 += numCols - l; + + pInT2 += numCols; + } + else + { + /* Element of the reference row */ + in = *pInT1; + + /* Working pointers for input and destination pivot rows */ + pPRT_in = pPivotRowIn; + pPRT_pDst = pPivotRowDst; + + /* Loop over the number of columns to the right of the pivot element, + to replace the elements in the input matrix */ + j = (numCols - l); + + while (j > 0U) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + in1 = *pInT1; + *pInT1++ = in1 - (in * *pPRT_in++); + + /* Decrement the loop counter */ + j--; + } + + /* Loop over the number of columns to + replace the elements in the destination matrix */ + j = numCols; + + while (j > 0U) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + in1 = *pInT2; + *pInT2++ = in1 - (in * *pPRT_pDst++); + + /* Decrement loop counter */ + j--; + } + + } + + /* Increment temporary input pointer */ + pInT1 = pInT1 + l; + + /* Decrement loop counter */ + k--; + + /* Increment pivot index */ + i++; + } + + /* Increment the input pointer */ + pIn++; + + /* Decrement the loop counter */ + loopCnt--; + + /* Increment the index modifier */ + l++; + } + + +#else + + float64_t Xchg, in = 0.0; /* Temporary input values */ + uint32_t i, rowCnt, flag = 0U, j, loopCnt, k, l; /* loop counters */ + arm_status status; /* status of matrix inverse */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pSrc->numCols) || + (pDst->numRows != pDst->numCols) || + (pSrc->numRows != pDst->numRows) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + + /*-------------------------------------------------------------------------------------------------------------- + * Matrix Inverse can be solved using elementary row operations. + * + * Gauss-Jordan Method: + * + * 1. First combine the identity matrix and the input matrix separated by a bar to form an + * augmented matrix as follows: + * _ _ _ _ _ _ _ _ + * | | a11 a12 | | | 1 0 | | | X11 X12 | + * | | | | | | | = | | + * |_ |_ a21 a22 _| | |_0 1 _| _| |_ X21 X21 _| + * + * 2. In our implementation, pDst Matrix is used as identity matrix. + * + * 3. Begin with the first row. Let i = 1. + * + * 4. Check to see if the pivot for row i is zero. + * The pivot is the element of the main diagonal that is on the current row. + * For instance, if working with row i, then the pivot element is aii. + * If the pivot is zero, exchange that row with a row below it that does not + * contain a zero in column i. If this is not possible, then an inverse + * to that matrix does not exist. + * + * 5. Divide every element of row i by the pivot. + * + * 6. For every row below and row i, replace that row with the sum of that row and + * a multiple of row i so that each new element in column i below row i is zero. + * + * 7. Move to the next row and column and repeat steps 2 through 5 until you have zeros + * for every element below and above the main diagonal. + * + * 8. Now an identical matrix is formed to the left of the bar(input matrix, src). + * Therefore, the matrix to the right of the bar is our solution(dst matrix, dst). + *----------------------------------------------------------------------------------------------------------------*/ + + /* Working pointer for destination matrix */ + pOutT1 = pOut; + + /* Loop over the number of rows */ + rowCnt = numRows; + + /* Making the destination matrix as identity matrix */ + while (rowCnt > 0U) + { + /* Writing all zeroes in lower triangle of the destination matrix */ + j = numRows - rowCnt; + while (j > 0U) + { + *pOutT1++ = 0.0; + j--; + } + + /* Writing all ones in the diagonal of the destination matrix */ + *pOutT1++ = 1.0; + + /* Writing all zeroes in upper triangle of the destination matrix */ + j = rowCnt - 1U; + while (j > 0U) + { + *pOutT1++ = 0.0; + j--; + } + + /* Decrement loop counter */ + rowCnt--; + } + + /* Loop over the number of columns of the input matrix. + All the elements in each column are processed by the row operations */ + loopCnt = numCols; + + /* Index modifier to navigate through the columns */ + l = 0U; + + while (loopCnt > 0U) + { + /* Check if the pivot element is zero.. + * If it is zero then interchange the row with non zero row below. + * If there is no non zero element to replace in the rows below, + * then the matrix is Singular. */ + + /* Working pointer for the input matrix that points + * to the pivot element of the particular row */ + pInT1 = pIn + (l * numCols); + + /* Working pointer for the destination matrix that points + * to the pivot element of the particular row */ + pOutT1 = pOut + (l * numCols); + + /* Temporary variable to hold the pivot value */ + in = *pInT1; + + /* Destination pointer modifier */ + k = 1U; + + /* Check if the pivot element is zero */ + if (*pInT1 == 0.0) + { + /* Loop over the number rows present below */ + for (i = (l + 1U); i < numRows; i++) + { + /* Update the input and destination pointers */ + pInT2 = pInT1 + (numCols * l); + pOutT2 = pOutT1 + (numCols * k); + + /* Check if there is a non zero pivot element to + * replace in the rows below */ + if (*pInT2 != 0.0) + { + /* Loop over number of columns + * to the right of the pilot element */ + for (j = 0U; j < (numCols - l); j++) + { + /* Exchange the row elements of the input matrix */ + Xchg = *pInT2; + *pInT2++ = *pInT1; + *pInT1++ = Xchg; + } + + for (j = 0U; j < numCols; j++) + { + Xchg = *pOutT2; + *pOutT2++ = *pOutT1; + *pOutT1++ = Xchg; + } + + /* Flag to indicate whether exchange is done or not */ + flag = 1U; + + /* Break after exchange is done */ + break; + } + + /* Update the destination pointer modifier */ + k++; + } + } + + /* Update the status if the matrix is singular */ + if ((flag != 1U) && (in == 0.0)) + { + return ARM_MATH_SINGULAR; + } + + /* Points to the pivot row of input and destination matrices */ + pPivotRowIn = pIn + (l * numCols); + pPivotRowDst = pOut + (l * numCols); + + /* Temporary pointers to the pivot row pointers */ + pInT1 = pPivotRowIn; + pOutT1 = pPivotRowDst; + + /* Pivot element of the row */ + in = *(pIn + (l * numCols)); + + /* Loop over number of columns + * to the right of the pilot element */ + for (j = 0U; j < (numCols - l); j++) + { + /* Divide each element of the row of the input matrix + * by the pivot element */ + *pInT1 = *pInT1 / in; + pInT1++; + } + for (j = 0U; j < numCols; j++) + { + /* Divide each element of the row of the destination matrix + * by the pivot element */ + *pOutT1 = *pOutT1 / in; + pOutT1++; + } + + /* Replace the rows with the sum of that row and a multiple of row i + * so that each new element in column i above row i is zero.*/ + + /* Temporary pointers for input and destination matrices */ + pInT1 = pIn; + pOutT1 = pOut; + + for (i = 0U; i < numRows; i++) + { + /* Check for the pivot element */ + if (i == l) + { + /* If the processing element is the pivot element, + only the columns to the right are to be processed */ + pInT1 += numCols - l; + pOutT1 += numCols; + } + else + { + /* Element of the reference row */ + in = *pInT1; + + /* Working pointers for input and destination pivot rows */ + pPRT_in = pPivotRowIn; + pPRT_pDst = pPivotRowDst; + + /* Loop over the number of columns to the right of the pivot element, + to replace the elements in the input matrix */ + for (j = 0U; j < (numCols - l); j++) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + *pInT1 = *pInT1 - (in * *pPRT_in++); + pInT1++; + } + + /* Loop over the number of columns to + replace the elements in the destination matrix */ + for (j = 0U; j < numCols; j++) + { + /* Replace the element by the sum of that row + and a multiple of the reference row */ + *pOutT1 = *pOutT1 - (in * *pPRT_pDst++); + pOutT1++; + } + + } + + /* Increment temporary input pointer */ + pInT1 = pInT1 + l; + } + + /* Increment the input pointer */ + pIn++; + + /* Decrement the loop counter */ + loopCnt--; + + /* Increment the index modifier */ + l++; + } + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + + if ((flag != 1U) && (in == 0.0)) + { + pIn = pSrc->pData; + for (i = 0; i < numRows * numCols; i++) + { + if (pIn[i] != 0.0) + break; + } + + if (i == numRows * numCols) + status = ARM_MATH_SINGULAR; + } + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixInv group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_f32.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_f32.c new file mode 100644 index 0000000..ffddf99 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_f32.c @@ -0,0 +1,534 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_mult_f32.c + * Description: Floating-point matrix multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + * @ingroup groupMatrix + */ + +/** + * @defgroup MatrixMult Matrix Multiplication + * + * Multiplies two matrices. + * + * \image html MatrixMultiplication.gif "Multiplication of two 3 x 3 matrices" + + * Matrix multiplication is only defined if the number of columns of the + * first matrix equals the number of rows of the second matrix. + * Multiplying an M x N matrix with an N x P matrix results + * in an M x P matrix. + * When matrix size checking is enabled, the functions check: (1) that the inner dimensions of + * pSrcA and pSrcB are equal; and (2) that the size of the output + * matrix equals the outer dimensions of pSrcA and pSrcB. + */ + + +/** + * @addtogroup MatrixMult + * @{ + */ + +/** + * @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 + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +#if defined(ARM_MATH_NEON) + +#define GROUPOFROWS 8 + +arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ + float32_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ + float32_t *pInA = pSrcA->pData; /* input data matrix pointer A */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + float32_t *px; /* Temporary output data matrix pointer */ + float32_t sum; /* Accumulator */ + uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ + + + float32_t in1, in2, in3, in4; + uint16_t col, i = 0U, j, row = numRowsA, rowCnt, colCnt; /* loop counters */ + arm_status status; /* status of matrix multiplication */ + + float32x4_t a0V, a1V, a2V, a3V, a4V, a5V, a6V, a7V; + float32x4_t acc0,acc1,acc2,acc3,acc4,acc5,acc6,acc7,temp; + float32x2_t accum = vdup_n_f32(0); + float32_t *pIn1B = pSrcA->pData; + float32_t *pIn1C = pSrcA->pData; + float32_t *pIn1D = pSrcA->pData; + float32_t *pIn1E = pSrcA->pData; + float32_t *pIn1F = pSrcA->pData; + float32_t *pIn1G = pSrcA->pData; + float32_t *pIn1H = pSrcA->pData; + + float32_t *pxB,*pxC, *pxD, *pxE, *pxF, *pxG, *pxH; /* Temporary output data matrix pointer */ + float32_t sum0,sum1, sum2,sum3, sum4, sum5 , sum6, sum7; + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + { + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* Row loop */ + rowCnt = row >> 3; + + while(rowCnt > 0) + { + /* Output pointer is set to starting address of the row being processed */ + px = pOut + GROUPOFROWS*i; + pxB = px + numColsB; + pxC = px + 2*numColsB; + pxD = px + 3*numColsB; + pxE = px + 4*numColsB; + pxF = px + 5*numColsB; + pxG = px + 6*numColsB; + pxH = px + 7*numColsB; + + /* For every row wise process, the column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, the pIn2 pointer is set + ** to the starting address of the pSrcB data */ + pIn2 = pSrcB->pData; + + j = 0U; + + /* Column loop */ + do + { + /* Set the variable sum, that acts as accumulator, to zero */ + sum0 = 0.0f; + sum1 = 0.0f; + sum2 = 0.0f; + sum3 = 0.0f; + sum4 = 0.0f; + sum5 = 0.0f; + sum6 = 0.0f; + sum7 = 0.0f; + + /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ + pIn1 = pInA; + pIn1B = pIn1 + numColsA; + pIn1C = pIn1 + 2*numColsA; + pIn1D = pIn1 + 3*numColsA; + pIn1E = pIn1 + 4*numColsA; + pIn1F = pIn1 + 5*numColsA; + pIn1G = pIn1 + 6*numColsA; + pIn1H = pIn1 + 7*numColsA; + + acc0 = vdupq_n_f32(0.0); + acc1 = vdupq_n_f32(0.0); + acc2 = vdupq_n_f32(0.0); + acc3 = vdupq_n_f32(0.0); + acc4 = vdupq_n_f32(0.0); + acc5 = vdupq_n_f32(0.0); + acc6 = vdupq_n_f32(0.0); + acc7 = vdupq_n_f32(0.0); + + /* Compute 4 MACs simultaneously. */ + colCnt = numColsA >> 2U; + + /* Matrix multiplication */ + while (colCnt > 0U) + { + /* c(m,n) = a(1,1)*b(1,1) + a(1,2)*b(2,1) + ... + a(m,p)*b(p,n) */ + a0V = vld1q_f32(pIn1); + a1V = vld1q_f32(pIn1B); + a2V = vld1q_f32(pIn1C); + a3V = vld1q_f32(pIn1D); + a4V = vld1q_f32(pIn1E); + a5V = vld1q_f32(pIn1F); + a6V = vld1q_f32(pIn1G); + a7V = vld1q_f32(pIn1H); + + pIn1 += 4; + pIn1B += 4; + pIn1C += 4; + pIn1D += 4; + pIn1E += 4; + pIn1F += 4; + pIn1G += 4; + pIn1H += 4; + + temp[0] = *pIn2; + pIn2 += numColsB; + temp[1] = *pIn2; + pIn2 += numColsB; + temp[2] = *pIn2; + pIn2 += numColsB; + temp[3] = *pIn2; + pIn2 += numColsB; + + acc0 = vmlaq_f32(acc0,a0V,temp); + acc1 = vmlaq_f32(acc1,a1V,temp); + acc2 = vmlaq_f32(acc2,a2V,temp); + acc3 = vmlaq_f32(acc3,a3V,temp); + acc4 = vmlaq_f32(acc4,a4V,temp); + acc5 = vmlaq_f32(acc5,a5V,temp); + acc6 = vmlaq_f32(acc6,a6V,temp); + acc7 = vmlaq_f32(acc7,a7V,temp); + + /* Decrement the loop count */ + colCnt--; + } + + accum = vpadd_f32(vget_low_f32(acc0), vget_high_f32(acc0)); + sum0 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(acc1), vget_high_f32(acc1)); + sum1 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(acc2), vget_high_f32(acc2)); + sum2 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(acc3), vget_high_f32(acc3)); + sum3 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(acc4), vget_high_f32(acc4)); + sum4 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(acc5), vget_high_f32(acc5)); + sum5 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(acc6), vget_high_f32(acc6)); + sum6 += accum[0] + accum[1]; + + accum = vpadd_f32(vget_low_f32(acc7), vget_high_f32(acc7)); + sum7 += accum[0] + accum[1]; + + /* If the columns of pSrcA is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + colCnt = numColsA & 3; + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1)*b(1,1) + a(1,2)*b(2,1) + ... + a(m,p)*b(p,n) */ + sum0 += *pIn1++ * (*pIn2); + sum1 += *pIn1B++ * (*pIn2); + sum2 += *pIn1C++ * (*pIn2); + sum3 += *pIn1D++ * (*pIn2); + sum4 += *pIn1E++ * (*pIn2); + sum5 += *pIn1F++ * (*pIn2); + sum6 += *pIn1G++ * (*pIn2); + sum7 += *pIn1H++ * (*pIn2); + pIn2 += numColsB; + + /* Decrement the loop counter */ + colCnt--; + } + + /* Store the result in the destination buffer */ + *px++ = sum0; + *pxB++ = sum1; + *pxC++ = sum2; + *pxD++ = sum3; + *pxE++ = sum4; + *pxF++ = sum5; + *pxG++ = sum6; + *pxH++ = sum7; + + /* Update the pointer pIn2 to point to the starting address of the next column */ + j++; + pIn2 = pSrcB->pData + j; + + /* Decrement the column loop counter */ + col--; + + } while (col > 0U); + + /* Update the pointer pInA to point to the starting address of the next row */ + i = i + numColsB; + pInA = pInA + GROUPOFROWS*numColsA; + + /* Decrement the row loop counter */ + rowCnt--; + } + + /* + + i was the index of a group of rows computed by previous loop. + Now i is the index of a row since below code is computing row per row + and no more group of row per group of rows. + + */ + + i = GROUPOFROWS*i; + rowCnt = row & 7; + + while(rowCnt > 0) + { + /* Output pointer is set to starting address of the row being processed */ + px = pOut + i; + + /* For every row wise process, the column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, the pIn2 pointer is set + ** to the starting address of the pSrcB data */ + pIn2 = pSrcB->pData; + + j = 0U; + + /* Column loop */ + do + { + /* Set the variable sum, that acts as accumulator, to zero */ + sum = 0.0f; + + /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ + pIn1 = pInA; + + acc0 = vdupq_n_f32(0.0); + + /* Compute 4 MACs simultaneously. */ + colCnt = numColsA >> 2U; + + /* Matrix multiplication */ + while (colCnt > 0U) + { + /* c(m,n) = a(1,1)*b(1,1) + a(1,2)*b(2,1) + ... + a(m,p)*b(p,n) */ + a0V = vld1q_f32(pIn1); // load & separate real/imag pSrcA (de-interleave 2) + pIn1 += 4; + + temp[0] = *pIn2; + pIn2 += numColsB; + temp[1] = *pIn2; + pIn2 += numColsB; + temp[2] = *pIn2; + pIn2 += numColsB; + temp[3] = *pIn2; + pIn2 += numColsB; + + acc0 = vmlaq_f32(acc0,a0V,temp); + + /* Decrement the loop count */ + colCnt--; + } + + accum = vpadd_f32(vget_low_f32(acc0), vget_high_f32(acc0)); + sum += accum[0] + accum[1]; + + /* If the columns of pSrcA is not a multiple of 4, compute any remaining MACs here. + ** No loop unrolling is used. */ + colCnt = numColsA % 0x4U; + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1)*b(1,1) + a(1,2)*b(2,1) + ... + a(m,p)*b(p,n) */ + sum += *pIn1++ * (*pIn2); + pIn2 += numColsB; + + /* Decrement the loop counter */ + colCnt--; + } + + /* Store the result in the destination buffer */ + *px++ = sum; + + /* Update the pointer pIn2 to point to the starting address of the next column */ + j++; + pIn2 = pSrcB->pData + j; + + /* Decrement the column loop counter */ + col--; + + } while (col > 0U); + + + /* Update the pointer pInA to point to the starting address of the next row */ + i = i + numColsB; + pInA = pInA + numColsA; + + /* Decrement the row loop counter */ + rowCnt--; + + } + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#else +arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn1 = pSrcA->pData; /* Input data matrix pointer A */ + float32_t *pIn2 = pSrcB->pData; /* Input data matrix pointer B */ + float32_t *pInA = pSrcA->pData; /* Input data matrix pointer A */ + float32_t *pInB = pSrcB->pData; /* Input data matrix pointer B */ + float32_t *pOut = pDst->pData; /* Output data matrix pointer */ + float32_t *px; /* Temporary output data matrix pointer */ + float32_t sum; /* Accumulator */ + uint16_t numRowsA = pSrcA->numRows; /* Number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* Number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* Number of columns of input matrix A */ + uint32_t col, i = 0U, row = numRowsA, colCnt; /* Loop counters */ + arm_status status; /* Status of matrix multiplication */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || + (pSrcB->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* row loop */ + do + { + /* Output pointer is set to starting address of row being processed */ + px = pOut + i; + + /* For every row wise process, column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, pIn2 pointer is set to starting address of pSrcB data */ + pIn2 = pSrcB->pData; + + /* column loop */ + do + { + /* Set the variable sum, that acts as accumulator, to zero */ + sum = 0.0f; + + /* Initialize pointer pIn1 to point to starting address of column being processed */ + pIn1 = pInA; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 MACs at a time. */ + colCnt = numColsA >> 2U; + + /* matrix multiplication */ + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + /* Perform the multiply-accumulates */ + sum += *pIn1++ * *pIn2; + pIn2 += numColsB; + + sum += *pIn1++ * *pIn2; + pIn2 += numColsB; + + sum += *pIn1++ * *pIn2; + pIn2 += numColsB; + + sum += *pIn1++ * *pIn2; + pIn2 += numColsB; + + /* Decrement loop counter */ + colCnt--; + } + + /* Loop unrolling: Compute remaining MACs */ + colCnt = numColsA % 0x4U; + +#else + + /* Initialize cntCnt with number of columns */ + colCnt = numColsA; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + /* Perform the multiply-accumulates */ + sum += *pIn1++ * *pIn2; + pIn2 += numColsB; + + /* Decrement loop counter */ + colCnt--; + } + + /* Store result in destination buffer */ + *px++ = sum; + + /* Decrement column loop counter */ + col--; + + /* Update pointer pIn2 to point to starting address of next column */ + pIn2 = pInB + (numColsB - col); + + } while (col > 0U); + + /* Update pointer pInA to point to starting address of next row */ + i = i + numColsB; + pInA = pInA + numColsA; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + * @} end of MatrixMult group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q15.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q15.c new file mode 100644 index 0000000..670ace1 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q15.c @@ -0,0 +1,483 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_mult_fast_q15.c + * Description: Q15 matrix multiplication (fast variant) + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixMult + @{ + */ + +/** + @brief Q15 matrix multiplication (fast variant). + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Scaling and Overflow Behavior + The difference between the function \ref arm_mat_mult_q15() and this fast variant is that + the fast variant use a 32-bit rather than a 64-bit accumulator. + The result of each 1.15 x 1.15 multiplication is truncated to + 2.30 format. These intermediate results are accumulated in a 32-bit register in 2.30 + format. Finally, the accumulator is saturated and converted to a 1.15 result. + @par + The fast version has the same overflow behavior as the standard version but provides + less precision since it discards the low 16 bits of each multiplication result. + In order to avoid overflows completely the input signals must be scaled down. + Scale down one of the input matrices by log2(numColsA) bits to avoid overflows, + as a total of numColsA additions are computed internally for each output element. + @remark + Refer to \ref arm_mat_mult_q15() for a slower implementation of this function + which uses 64-bit accumulation to provide higher precision. + */ + +arm_status arm_mat_mult_fast_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState) +{ + q31_t sum; /* Accumulator */ + q15_t *pSrcBT = pState; /* Input data matrix pointer for transpose */ + q15_t *pInA = pSrcA->pData; /* Input data matrix pointer A of Q15 type */ + q15_t *pInB = pSrcB->pData; /* Input data matrix pointer B of Q15 type */ + q15_t *px; /* Temporary output data matrix pointer */ + uint16_t numRowsA = pSrcA->numRows; /* Number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* Number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* Number of columns of input matrix A */ + uint16_t numRowsB = pSrcB->numRows; /* Number of rows of input matrix A */ + uint32_t col, i = 0U, row = numRowsB, colCnt; /* Loop counters */ + arm_status status; /* Status of matrix multiplication */ + +#if defined (ARM_MATH_DSP) + q31_t in; /* Temporary variable to hold the input value */ + q31_t inA1, inB1, inA2, inB2; + q31_t sum2, sum3, sum4; + q15_t *pInA2, *pInB2, *px2; + uint32_t j = 0; +#else + q15_t in; /* Temporary variable to hold the input value */ + q15_t inA1, inB1, inA2, inB2; +#endif /* #if defined (ARM_MATH_DSP) */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || + (pSrcB->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Matrix transpose */ + do + { + /* The pointer px is set to starting address of column being processed */ + px = pSrcBT + i; + + /* Apply loop unrolling and exchange columns with row elements */ + col = numColsB >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (col > 0U) + { + +#if defined (ARM_MATH_DSP) + + /* Read two elements from row */ + in = read_q15x2_ia ((q15_t **) &pInB); + + /* Unpack and store one element in destination */ +#ifndef ARM_MATH_BIG_ENDIAN + *px = (q15_t) in; +#else + *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB; + + /* Unpack and store second element in destination */ +#ifndef ARM_MATH_BIG_ENDIAN + *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#else + *px = (q15_t) in; +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB; + + in = read_q15x2_ia ((q15_t **) &pInB); +#ifndef ARM_MATH_BIG_ENDIAN + *px = (q15_t) in; +#else + *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + px += numRowsB; + +#ifndef ARM_MATH_BIG_ENDIAN + *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#else + *px = (q15_t) in; +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + px += numRowsB; + +#else /* #if defined (ARM_MATH_DSP) */ + + /* Read one element from row */ + in = *pInB++; + + /* Store one element in destination */ + *px = in; + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB; + + in = *pInB++; + *px = in; + px += numRowsB; + + in = *pInB++; + *px = in; + px += numRowsB; + + in = *pInB++; + *px = in; + px += numRowsB; + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement column loop counter */ + col--; + } + + /* If the columns of pSrcB is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + col = numColsB % 0x4U; + + while (col > 0U) + { + /* Read and store input element in destination */ + *px = *pInB++; + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB; + + /* Decrement column loop counter */ + col--; + } + + i++; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + + /* Reset variables for usage in following multiplication process */ + row = numRowsA; + i = 0U; + px = pDst->pData; + +#if defined (ARM_MATH_DSP) + /* Process two rows from matrix A at a time and output two rows at a time */ + row = row >> 1U; + px2 = px + numColsB; +#endif + + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* row loop */ + while (row > 0U) + { + /* For every row wise process, column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, pIn2 pointer is set to starting address of transposed pSrcB data */ + pInB = pSrcBT; + +#if defined (ARM_MATH_DSP) + /* Process two (transposed) columns from matrix B at a time */ + col = col >> 1U; + j = 0; +#endif + + /* column loop */ + while (col > 0U) + { + /* Set variable sum, that acts as accumulator, to zero */ + sum = 0; + + /* Initiate pointer pInA to point to starting address of column being processed */ + pInA = pSrcA->pData + i; + +#if defined (ARM_MATH_DSP) + sum2 = 0; + sum3 = 0; + sum4 = 0; + pInB = pSrcBT + j; + pInA2 = pInA + numColsA; + pInB2 = pInB + numRowsB; + + /* Read in two elements at once - alows dual MAC instruction */ + colCnt = numColsA >> 1U; +#else + colCnt = numColsA >> 2U; +#endif + + /* matrix multiplication */ + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + +#if defined (ARM_MATH_DSP) + /* read real and imag values from pSrcA and pSrcB buffer */ + inA1 = read_q15x2_ia ((q15_t **) &pInA); + inB1 = read_q15x2_ia ((q15_t **) &pInB); + + inA2 = read_q15x2_ia ((q15_t **) &pInA2); + inB2 = read_q15x2_ia ((q15_t **) &pInB2); + + /* Multiply and Accumlates */ + sum = __SMLAD(inA1, inB1, sum); + sum2 = __SMLAD(inA1, inB2, sum2); + sum3 = __SMLAD(inA2, inB1, sum3); + sum4 = __SMLAD(inA2, inB2, sum4); +#else + /* read real and imag values from pSrcA and pSrcB buffer */ + inA1 = *pInA++; + inB1 = *pInB++; + /* Multiply and Accumlates */ + sum += inA1 * inB1; + + inA2 = *pInA++; + inB2 = *pInB++; + sum += inA2 * inB2; + + inA1 = *pInA++; + inB1 = *pInB++; + sum += inA1 * inB1; + + inA2 = *pInA++; + inB2 = *pInB++; + sum += inA2 * inB2; +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + colCnt--; + } + + /* process odd column samples */ +#if defined (ARM_MATH_DSP) + if (numColsA & 1U) { + inA1 = *pInA++; + inB1 = *pInB++; + inA2 = *pInA2++; + inB2 = *pInB2++; + sum += inA1 * inB1; + sum2 += inA1 * inB2; + sum3 += inA2 * inB1; + sum4 += inA2 * inB2; + } +#else + colCnt = numColsA % 0x4U; + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + sum += (q31_t) *pInA++ * *pInB++; + + /* Decrement loop counter */ + colCnt--; + } +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Saturate and store result in destination buffer */ + *px++ = (q15_t) (sum >> 15); + +#if defined (ARM_MATH_DSP) + *px++ = (q15_t) (sum2 >> 15); + *px2++ = (q15_t) (sum3 >> 15); + *px2++ = (q15_t) (sum4 >> 15); + j += numRowsB * 2; +#endif + + /* Decrement column loop counter */ + col--; + + } + + i = i + numColsA; + +#if defined (ARM_MATH_DSP) + i = i + numColsA; + px = px2 + (numColsB & 1U); + px2 = px + numColsB; +#endif + + /* Decrement row loop counter */ + row--; + + } + + /* Compute any remaining odd row/column below */ + +#if defined (ARM_MATH_DSP) + + /* Compute remaining output column */ + if (numColsB & 1U) { + + /* Avoid redundant computation of last element */ + row = numRowsA & (~0x1); + + /* Point to remaining unfilled column in output matrix */ + px = pDst->pData + numColsB-1; + pInA = pSrcA->pData; + + /* row loop */ + while (row > 0) + { + + /* point to last column in matrix B */ + pInB = pSrcBT + numRowsB * (numColsB-1); + + /* Set variable sum, that acts as accumulator, to zero */ + sum = 0; + + /* Compute 4 columns at once */ + colCnt = numColsA >> 2U; + + /* matrix multiplication */ + while (colCnt > 0U) + { + inA1 = read_q15x2_ia ((q15_t **) &pInA); + inA2 = read_q15x2_ia ((q15_t **) &pInA); + inB1 = read_q15x2_ia ((q15_t **) &pInB); + inB2 = read_q15x2_ia ((q15_t **) &pInB); + + sum = __SMLAD(inA1, inB1, sum); + sum = __SMLAD(inA2, inB2, sum); + + /* Decrement loop counter */ + colCnt--; + } + + colCnt = numColsA & 3U; + while (colCnt > 0U) { + sum += (q31_t) (*pInA++) * (*pInB++); + colCnt--; + } + + /* Store result in destination buffer */ + *px = (q15_t) (sum >> 15); + px += numColsB; + + /* Decrement row loop counter */ + row--; + } + } + + /* Compute remaining output row */ + if (numRowsA & 1U) { + + /* point to last row in output matrix */ + px = pDst->pData + (numColsB) * (numRowsA-1); + + pInB = pSrcBT; + col = numColsB; + i = 0U; + + /* col loop */ + while (col > 0) + { + /* point to last row in matrix A */ + pInA = pSrcA->pData + (numRowsA-1) * numColsA; + + /* Set variable sum, that acts as accumulator, to zero */ + sum = 0; + + /* Compute 4 columns at once */ + colCnt = numColsA >> 2U; + + /* matrix multiplication */ + while (colCnt > 0U) + { + inA1 = read_q15x2_ia ((q15_t **) &pInA); + inA2 = read_q15x2_ia ((q15_t **) &pInA); + inB1 = read_q15x2_ia ((q15_t **) &pInB); + inB2 = read_q15x2_ia ((q15_t **) &pInB); + + sum = __SMLAD(inA1, inB1, sum); + sum = __SMLAD(inA2, inB2, sum); + + /* Decrement loop counter */ + colCnt--; + } + + colCnt = numColsA % 4U; + while (colCnt > 0U) { + sum += (q31_t) (*pInA++) * (*pInB++); + + colCnt--; + } + + /* Store result in destination buffer */ + *px++ = (q15_t) (sum >> 15); + + /* Decrement column loop counter */ + col--; + } + } + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixMult group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q31.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q31.c new file mode 100644 index 0000000..011959a --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_fast_q31.c @@ -0,0 +1,374 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_mult_fast_q31.c + * Description: Q31 matrix multiplication (fast variant) + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixMult + @{ + */ + +/** + @brief Q31 matrix multiplication (fast variant). + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Scaling and Overflow Behavior + The difference between the function \ref arm_mat_mult_q31() and this fast variant is that + the fast variant use a 32-bit rather than a 64-bit accumulator. + The result of each 1.31 x 1.31 multiplication is truncated to + 2.30 format. These intermediate results are accumulated in a 32-bit register in 2.30 + format. Finally, the accumulator is saturated and converted to a 1.31 result. + @par + The fast version has the same overflow behavior as the standard version but provides + less precision since it discards the low 32 bits of each multiplication result. + In order to avoid overflows completely the input signals must be scaled down. + Scale down one of the input matrices by log2(numColsA) bits to avoid overflows, + as a total of numColsA additions are computed internally for each output element. + @remark + Refer to \ref arm_mat_mult_q31() for a slower implementation of this function + which uses 64-bit accumulation to provide higher precision. + */ + +arm_status arm_mat_mult_fast_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst) +{ + q31_t *pInA = pSrcA->pData; /* Input data matrix pointer A */ + q31_t *pInB = pSrcB->pData; /* Input data matrix pointer B */ + q31_t *pInA2; + q31_t *px; /* Temporary output data matrix pointer */ + q31_t *px2; + q31_t sum1, sum2, sum3, sum4; /* Accumulator */ + q31_t inA1, inA2, inB1, inB2; + uint16_t numRowsA = pSrcA->numRows; /* Number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* Number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* Number of columns of input matrix A */ + uint32_t col, i = 0U, j, row = numRowsA, colCnt; /* Loop counters */ + arm_status status; /* Status of matrix multiplication */ + + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || + (pSrcB->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + px = pDst->pData; + + row = row >> 1U; + px2 = px + numColsB; + + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* row loop */ + while (row > 0U) + { + /* For every row wise process, column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, pIn2 pointer is set to starting address of pSrcB data */ + pInB = pSrcB->pData; + + j = 0U; + + col = col >> 1U; + + /* column loop */ + while (col > 0U) + { + /* Set the variable sum, that acts as accumulator, to zero */ + sum1 = 0; + sum2 = 0; + sum3 = 0; + sum4 = 0; + + /* Initiate data pointers */ + pInA = pSrcA->pData + i; + pInB = pSrcB->pData + j; + pInA2 = pInA + numColsA; + + colCnt = numColsA; + + /* matrix multiplication */ + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + inA1 = *pInA++; + inB1 = pInB[0]; + inA2 = *pInA2++; + inB2 = pInB[1]; + pInB += numColsB; + +#if defined (ARM_MATH_DSP) + sum1 = __SMMLA(inA1, inB1, sum1); + sum2 = __SMMLA(inA1, inB2, sum2); + sum3 = __SMMLA(inA2, inB1, sum3); + sum4 = __SMMLA(inA2, inB2, sum4); +#else + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) inA1 * inB1)) >> 32); + sum2 = (q31_t) ((((q63_t) sum2 << 32) + ((q63_t) inA1 * inB2)) >> 32); + sum3 = (q31_t) ((((q63_t) sum3 << 32) + ((q63_t) inA2 * inB1)) >> 32); + sum4 = (q31_t) ((((q63_t) sum4 << 32) + ((q63_t) inA2 * inB2)) >> 32); +#endif + + /* Decrement loop counter */ + colCnt--; + } + + /* Convert the result from 2.30 to 1.31 format and store in destination buffer */ + *px++ = sum1 << 1; + *px++ = sum2 << 1; + *px2++ = sum3 << 1; + *px2++ = sum4 << 1; + + j += 2; + + /* Decrement column loop counter */ + col--; + } + + i = i + (numColsA << 1U); + px = px2 + (numColsB & 1U); + px2 = px + numColsB; + + /* Decrement row loop counter */ + row--; + } + + /* Compute any remaining odd row/column below */ + + /* Compute remaining output column */ + if (numColsB & 1U) { + + /* Avoid redundant computation of last element */ + row = numRowsA & (~1U); + + /* Point to remaining unfilled column in output matrix */ + px = pDst->pData + numColsB-1; + pInA = pSrcA->pData; + + /* row loop */ + while (row > 0) + { + + /* point to last column in matrix B */ + pInB = pSrcB->pData + numColsB-1; + + /* Set variable sum1, that acts as accumulator, to zero */ + sum1 = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 columns at a time. */ + colCnt = numColsA >> 2U; + + /* matrix multiplication */ + while (colCnt > 0U) + { +#if defined (ARM_MATH_DSP) + sum1 = __SMMLA(*pInA++, *pInB, sum1); +#else + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) *pInA++ * *pInB)) >> 32); +#endif + pInB += numColsB; + +#if defined (ARM_MATH_DSP) + sum1 = __SMMLA(*pInA++, *pInB, sum1); +#else + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) *pInA++ * *pInB)) >> 32); +#endif + pInB += numColsB; + +#if defined (ARM_MATH_DSP) + sum1 = __SMMLA(*pInA++, *pInB, sum1); +#else + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) *pInA++ * *pInB)) >> 32); +#endif + pInB += numColsB; + +#if defined (ARM_MATH_DSP) + sum1 = __SMMLA(*pInA++, *pInB, sum1); +#else + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) *pInA++ * *pInB)) >> 32); +#endif + pInB += numColsB; + + /* Decrement loop counter */ + colCnt--; + } + + /* Loop unrolling: Compute remaining column */ + colCnt = numColsA % 4U; + +#else + + /* Initialize colCnt with number of columns */ + colCnt = numColsA; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (colCnt > 0U) { +#if defined (ARM_MATH_DSP) + sum1 = __SMMLA(*pInA++, *pInB, sum1); +#else + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) *pInA++ * *pInB)) >> 32); +#endif + pInB += numColsB; + + colCnt--; + } + + /* Convert the result from 2.30 to 1.31 format and store in destination buffer */ + *px = sum1 << 1; + px += numColsB; + + /* Decrement row loop counter */ + row--; + } + } + + /* Compute remaining output row */ + if (numRowsA & 1U) { + + /* point to last row in output matrix */ + px = pDst->pData + (numColsB) * (numRowsA-1); + + col = numColsB; + i = 0U; + + /* col loop */ + while (col > 0) + { + + /* point to last row in matrix A */ + pInA = pSrcA->pData + (numRowsA-1) * numColsA; + pInB = pSrcB->pData + i; + + /* Set variable sum1, that acts as accumulator, to zero */ + sum1 = 0; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 columns at a time. */ + colCnt = numColsA >> 2U; + + /* matrix multiplication */ + while (colCnt > 0U) + { + inA1 = *pInA++; + inA2 = *pInA++; + inB1 = *pInB; + pInB += numColsB; + inB2 = *pInB; + pInB += numColsB; +#if defined (ARM_MATH_DSP) + sum1 = __SMMLA(inA1, inB1, sum1); + sum1 = __SMMLA(inA2, inB2, sum1); +#else + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) inA1 * inB1)) >> 32); + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) inA2 * inB2)) >> 32); +#endif + + inA1 = *pInA++; + inA2 = *pInA++; + inB1 = *pInB; + pInB += numColsB; + inB2 = *pInB; + pInB += numColsB; +#if defined (ARM_MATH_DSP) + sum1 = __SMMLA(inA1, inB1, sum1); + sum1 = __SMMLA(inA2, inB2, sum1); +#else + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) inA1 * inB1)) >> 32); + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) inA2 * inB2)) >> 32); +#endif + + /* Decrement loop counter */ + colCnt--; + } + + /* Loop unrolling: Compute remaining column */ + colCnt = numColsA % 4U; + +#else + + /* Initialize colCnt with number of columns */ + colCnt = numColsA; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (colCnt > 0U) { +#if defined (ARM_MATH_DSP) + sum1 = __SMMLA(*pInA++, *pInB, sum1); +#else + sum1 = (q31_t) ((((q63_t) sum1 << 32) + ((q63_t) *pInA++ * *pInB)) >> 32); +#endif + pInB += numColsB; + + colCnt--; + } + + /* Saturate and store the result in the destination buffer */ + *px++ = sum1 << 1; + i++; + + /* Decrement col loop counter */ + col--; + } + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixMult group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q15.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q15.c new file mode 100644 index 0000000..1d2b69c --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q15.c @@ -0,0 +1,357 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_mult_q15.c + * Description: Q15 matrix multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixMult + @{ + */ + +/** + @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 + @param[in] pState points to the array for storing intermediate results (Unused) + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. The inputs to the + multiplications are 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. + This approach provides 33 guard bits and there is no risk of overflow. + The 34.30 result is then truncated to 34.15 format by discarding the low 15 bits + and then saturated to 1.15 format. + @par + Refer to \ref arm_mat_mult_fast_q15() for a faster but less precise version of this function. + */ + +arm_status arm_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState) +{ + q63_t sum; /* Accumulator */ + +#if defined (ARM_MATH_DSP) /* != CM0 */ + + q15_t *pSrcBT = pState; /* Input data matrix pointer for transpose */ + q15_t *pInA = pSrcA->pData; /* Input data matrix pointer A of Q15 type */ + q15_t *pInB = pSrcB->pData; /* Input data matrix pointer B of Q15 type */ + q15_t *px; /* Temporary output data matrix pointer */ + uint16_t numRowsA = pSrcA->numRows; /* Number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* Number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* Number of columns of input matrix A */ + uint16_t numRowsB = pSrcB->numRows; /* Number of rows of input matrix A */ + uint32_t col, i = 0U, row = numRowsB, colCnt; /* Loop counters */ + arm_status status; /* Status of matrix multiplication */ + + q31_t in; /* Temporary variable to hold the input value */ + q31_t inA1, inB1, inA2, inB2; + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || + (pSrcB->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Matrix transpose */ + do + { + /* The pointer px is set to starting address of column being processed */ + px = pSrcBT + i; + + /* Apply loop unrolling and exchange columns with row elements */ + col = numColsB >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (col > 0U) + { + /* Read two elements from row */ + in = read_q15x2_ia ((q15_t **) &pInB); + + /* Unpack and store one element in destination */ +#ifndef ARM_MATH_BIG_ENDIAN + *px = (q15_t) in; +#else + *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB; + + /* Unpack and store second element in destination */ +#ifndef ARM_MATH_BIG_ENDIAN + *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#else + *px = (q15_t) in; +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB; + + /* Read two elements from row */ + in = read_q15x2_ia ((q15_t **) &pInB); + + /* Unpack and store one element in destination */ +#ifndef ARM_MATH_BIG_ENDIAN + *px = (q15_t) in; +#else + *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + px += numRowsB; + +#ifndef ARM_MATH_BIG_ENDIAN + *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#else + *px = (q15_t) in; +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + px += numRowsB; + + /* Decrement column loop counter */ + col--; + } + + /* If the columns of pSrcB is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + col = numColsB % 0x4U; + + while (col > 0U) + { + /* Read and store input element in destination */ + *px = *pInB++; + + /* Update pointer px to point to next row of transposed matrix */ + px += numRowsB; + + /* Decrement column loop counter */ + col--; + } + + i++; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + + /* Reset variables for usage in following multiplication process */ + row = numRowsA; + i = 0U; + px = pDst->pData; + + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* row loop */ + do + { + /* For every row wise process, column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, pIn2 pointer is set to starting address of transposed pSrcB data */ + pInB = pSrcBT; + + /* column loop */ + do + { + /* Set variable sum, that acts as accumulator, to zero */ + sum = 0; + + /* Initiate pointer pInA to point to starting address of column being processed */ + pInA = pSrcA->pData + i; + + /* Apply loop unrolling and compute 2 MACs simultaneously. */ + colCnt = numColsA >> 2U; + + /* matrix multiplication */ + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + /* read real and imag values from pSrcA and pSrcB buffer */ + inA1 = read_q15x2_ia ((q15_t **) &pInA); + inB1 = read_q15x2_ia ((q15_t **) &pInB); + + inA2 = read_q15x2_ia ((q15_t **) &pInA); + inB2 = read_q15x2_ia ((q15_t **) &pInB); + + /* Multiply and Accumlates */ + sum = __SMLALD(inA1, inB1, sum); + sum = __SMLALD(inA2, inB2, sum); + + /* Decrement loop counter */ + colCnt--; + } + + /* process remaining column samples */ + colCnt = numColsA % 0x4U; + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + sum += *pInA++ * *pInB++; + + /* Decrement loop counter */ + colCnt--; + } + + /* Saturate and store result in destination buffer */ + *px = (q15_t) (__SSAT((sum >> 15), 16)); + px++; + + /* Decrement column loop counter */ + col--; + + } while (col > 0U); + + i = i + numColsA; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + +#else /* #if defined (ARM_MATH_DSP) */ + + q15_t *pIn1 = pSrcA->pData; /* Input data matrix pointer A */ + q15_t *pIn2 = pSrcB->pData; /* Input data matrix pointer B */ + q15_t *pInA = pSrcA->pData; /* Input data matrix pointer A of Q15 type */ + q15_t *pInB = pSrcB->pData; /* Input data matrix pointer B of Q15 type */ + q15_t *pOut = pDst->pData; /* Output data matrix pointer */ + q15_t *px; /* Temporary output data matrix pointer */ + uint16_t numColsB = pSrcB->numCols; /* Number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* Number of columns of input matrix A */ + uint16_t numRowsA = pSrcA->numRows; /* Number of rows of input matrix A */ + uint32_t col, i = 0U, row = numRowsA, colCnt; /* Loop counters */ + arm_status status; /* Status of matrix multiplication */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || + (pSrcB->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* row loop */ + do + { + /* Output pointer is set to starting address of the row being processed */ + px = pOut + i; + + /* For every row wise process, column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, pIn2 pointer is set to starting address of pSrcB data */ + pIn2 = pSrcB->pData; + + /* column loop */ + do + { + /* Set the variable sum, that acts as accumulator, to zero */ + sum = 0; + + /* Initiate pointer pIn1 to point to starting address of pSrcA */ + pIn1 = pInA; + + /* Matrix A columns number of MAC operations are to be performed */ + colCnt = numColsA; + + /* matrix multiplication */ + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + /* Perform multiply-accumulates */ + sum += (q31_t) * pIn1++ * *pIn2; + pIn2 += numColsB; + + /* Decrement loop counter */ + colCnt--; + } + + /* Convert result from 34.30 to 1.15 format and store saturated value in destination buffer */ + + /* Saturate and store result in destination buffer */ + *px++ = (q15_t) __SSAT((sum >> 15), 16); + + /* Decrement column loop counter */ + col--; + + /* Update pointer pIn2 to point to starting address of next column */ + pIn2 = pInB + (numColsB - col); + + } while (col > 0U); + + /* Update pointer pSrcA to point to starting address of next row */ + i = i + numColsB; + pInA = pInA + numColsA; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixMult group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q31.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q31.c new file mode 100644 index 0000000..161e723 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_mult_q31.c @@ -0,0 +1,196 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_mult_q31.c + * Description: Q31 matrix multiplication + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixMult + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @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. There is no saturation + on intermediate additions. Thus, if the accumulator overflows it wraps around and + distorts the result. The input signals should be scaled down to avoid intermediate + overflows. The input is thus scaled down by log2(numColsA) bits + to avoid overflows, as a total of numColsA additions are performed internally. + The 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. + @remark + Refer to \ref arm_mat_mult_fast_q31() for a faster but less precise implementation of this function. + */ + +arm_status arm_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst) +{ + q31_t *pIn1 = pSrcA->pData; /* Input data matrix pointer A */ + q31_t *pIn2 = pSrcB->pData; /* Input data matrix pointer B */ + q31_t *pInA = pSrcA->pData; /* Input data matrix pointer A */ + q31_t *pInB = pSrcB->pData; /* Input data matrix pointer B */ + q31_t *pOut = pDst->pData; /* Output data matrix pointer */ + q31_t *px; /* Temporary output data matrix pointer */ + q63_t sum; /* Accumulator */ + uint16_t numRowsA = pSrcA->numRows; /* Number of rows of input matrix A */ + uint16_t numColsB = pSrcB->numCols; /* Number of columns of input matrix B */ + uint16_t numColsA = pSrcA->numCols; /* Number of columns of input matrix A */ + uint32_t col, i = 0U, row = numRowsA, colCnt; /* Loop counters */ + arm_status status; /* Status of matrix multiplication */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numCols != pSrcB->numRows) || + (pSrcA->numRows != pDst->numRows) || + (pSrcB->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ + /* row loop */ + do + { + /* Output pointer is set to starting address of row being processed */ + px = pOut + i; + + /* For every row wise process, column loop counter is to be initiated */ + col = numColsB; + + /* For every row wise process, pIn2 pointer is set to starting address of pSrcB data */ + pIn2 = pSrcB->pData; + + /* column loop */ + do + { + /* Set the variable sum, that acts as accumulator, to zero */ + sum = 0; + + /* Initialize pointer pIn1 to point to starting address of column being processed */ + pIn1 = pInA; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 MACs at a time. */ + colCnt = numColsA >> 2U; + + /* matrix multiplication */ + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + /* Perform the multiply-accumulates */ + sum += (q63_t) *pIn1++ * *pIn2; + pIn2 += numColsB; + + sum += (q63_t) *pIn1++ * *pIn2; + pIn2 += numColsB; + + sum += (q63_t) *pIn1++ * *pIn2; + pIn2 += numColsB; + + sum += (q63_t) *pIn1++ * *pIn2; + pIn2 += numColsB; + + /* Decrement loop counter */ + colCnt--; + } + + /* Loop unrolling: Compute remaining MACs */ + colCnt = numColsA % 0x4U; + +#else + + /* Initialize cntCnt with number of columns */ + colCnt = numColsA; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (colCnt > 0U) + { + /* c(m,n) = a(1,1) * b(1,1) + a(1,2) * b(2,1) + .... + a(m,p) * b(p,n) */ + + /* Perform the multiply-accumulates */ + sum += (q63_t) *pIn1++ * *pIn2; + pIn2 += numColsB; + + /* Decrement loop counter */ + colCnt--; + } + + /* Convert result from 2.62 to 1.31 format and store in destination buffer */ + *px++ = (q31_t) (sum >> 31); + + /* Decrement column loop counter */ + col--; + + /* Update pointer pIn2 to point to starting address of next column */ + pIn2 = pInB + (numColsB - col); + + } while (col > 0U); + + /* Update pointer pInA to point to starting address of next row */ + i = i + numColsB; + pInA = pInA + numColsA; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixMult group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_f32.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_f32.c new file mode 100644 index 0000000..a0097b1 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_f32.c @@ -0,0 +1,221 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_scale_f32.c + * Description: Multiplies a floating-point matrix by a scalar + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @defgroup MatrixScale Matrix Scale + + Multiplies a matrix by a scalar. This is accomplished by multiplying each element in the + matrix by the scalar. For example: + \image html MatrixScale.gif "Matrix Scaling of a 3 x 3 matrix" + + The function checks to make sure that the input and output matrices are of the same size. + + In the fixed-point Q15 and Q31 functions, scale is represented by + a fractional multiplication scaleFract and an arithmetic shift shift. + The shift allows the gain of the scaling operation to exceed 1.0. + The overall scale factor applied to the fixed-point data is +
+      scale = scaleFract * 2^shift.
+  
+ */ + +/** + @addtogroup MatrixScale + @{ + */ + +/** + @brief Floating-point matrix scaling. + @param[in] pSrc points to input matrix + @param[in] scale scale factor to be applied + @param[out] pDst points to output matrix structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + */ +#if defined(ARM_MATH_NEON_EXPERIMENTAL) +arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn = pSrc->pData; /* input data matrix pointer */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + uint32_t numSamples; /* total number of elements in the matrix */ + uint32_t blkCnt; /* loop counters */ + arm_status status; /* status of matrix scaling */ + + + float32_t in1, in2, in3, in4; /* temporary variables */ + float32_t out1, out2, out3, out4; /* temporary variables */ + + +#ifdef ARM_MATH_MATRIX_CHECK + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pDst->numRows) || (pSrc->numCols != pDst->numCols)) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + { + float32x4_t vec1; + float32x4_t res; + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; + + blkCnt = numSamples >> 2; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) * scale */ + /* Scaling and results are stored in the destination buffer. */ + vec1 = vld1q_f32(pIn); + res = vmulq_f32(vec1, vdupq_n_f32(scale)); + vst1q_f32(pOut, res); + + /* update pointers to process next sampels */ + pIn += 4U; + pOut += 4U; + + /* Decrement the numSamples loop counter */ + blkCnt--; + } + + /* If the numSamples is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = numSamples % 0x4U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) * scale */ + /* The results are stored in the destination buffer. */ + *pOut++ = (*pIn++) * scale; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#else +arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn = pSrc->pData; /* Input data matrix pointer */ + float32_t *pOut = pDst->pData; /* Output data matrix pointer */ + uint32_t numSamples; /* Total number of elements in the matrix */ + uint32_t blkCnt; /* Loop counters */ + arm_status status; /* Status of matrix scaling */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pDst->numRows) || + (pSrc->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Total number of samples in input matrix */ + numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) * scale */ + + /* Scale and store result in destination buffer. */ + *pOut++ = (*pIn++) * scale; + *pOut++ = (*pIn++) * scale; + *pOut++ = (*pIn++) * scale; + *pOut++ = (*pIn++) * scale; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) * scale */ + + /* Scale and store result in destination buffer. */ + *pOut++ = (*pIn++) * scale; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of MatrixScale group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q15.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q15.c new file mode 100644 index 0000000..9b75d4e --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q15.c @@ -0,0 +1,170 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_scale_q15.c + * Description: Multiplies a Q15 matrix by a scalar + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixScale + @{ + */ + +/** + @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 structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Scaling and Overflow Behavior + The input data *pSrc and scaleFract are in 1.15 format. + These are multiplied to yield a 2.30 intermediate result and this is shifted with saturation to 1.15 format. + */ + +arm_status arm_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scaleFract, + int32_t shift, + arm_matrix_instance_q15 * pDst) +{ + q15_t *pIn = pSrc->pData; /* Input data matrix pointer */ + q15_t *pOut = pDst->pData; /* Output data matrix pointer */ + uint32_t numSamples; /* Total number of elements in the matrix */ + uint32_t blkCnt; /* Loop counter */ + arm_status status; /* Status of matrix scaling */ + int32_t kShift = 15 - shift; /* Total shift to apply after scaling */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t inA1, inA2; + q31_t out1, out2, out3, out4; /* Temporary output variables */ + q15_t in1, in2, in3, in4; /* Temporary input variables */ +#endif + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pDst->numRows) || + (pSrc->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Total number of samples in input matrix */ + numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) * k */ + +#if defined (ARM_MATH_DSP) + /* read 2 times 2 samples at a time from source */ + inA1 = read_q15x2_ia ((q15_t **) &pIn); + inA2 = read_q15x2_ia ((q15_t **) &pIn); + + /* Scale inputs and store result in temporary variables + * in single cycle by packing the outputs */ + out1 = (q31_t) ((q15_t) (inA1 >> 16) * scaleFract); + out2 = (q31_t) ((q15_t) (inA1 ) * scaleFract); + out3 = (q31_t) ((q15_t) (inA2 >> 16) * scaleFract); + out4 = (q31_t) ((q15_t) (inA2 ) * scaleFract); + + /* apply shifting */ + out1 = out1 >> kShift; + out2 = out2 >> kShift; + out3 = out3 >> kShift; + out4 = out4 >> kShift; + + /* saturate the output */ + in1 = (q15_t) (__SSAT(out1, 16)); + in2 = (q15_t) (__SSAT(out2, 16)); + in3 = (q15_t) (__SSAT(out3, 16)); + in4 = (q15_t) (__SSAT(out4, 16)); + + /* store result to destination */ + write_q15x2_ia (&pOut, __PKHBT(in2, in1, 16)); + write_q15x2_ia (&pOut, __PKHBT(in4, in3, 16)); + +#else + *pOut++ = (q15_t) (__SSAT(((q31_t) (*pIn++) * scaleFract) >> kShift, 16)); + *pOut++ = (q15_t) (__SSAT(((q31_t) (*pIn++) * scaleFract) >> kShift, 16)); + *pOut++ = (q15_t) (__SSAT(((q31_t) (*pIn++) * scaleFract) >> kShift, 16)); + *pOut++ = (q15_t) (__SSAT(((q31_t) (*pIn++) * scaleFract) >> kShift, 16)); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) * k */ + + /* Scale, saturate and store result in destination buffer. */ + *pOut++ = (q15_t) (__SSAT(((q31_t) (*pIn++) * scaleFract) >> kShift, 16)); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixScale group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q31.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q31.c new file mode 100644 index 0000000..929b17f --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_scale_q31.c @@ -0,0 +1,164 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_scale_q31.c + * Description: Multiplies a Q31 matrix by a scalar + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixScale + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Scaling and Overflow Behavior + The input data *pSrc and scaleFract are in 1.31 format. + These are multiplied to yield a 2.62 intermediate result which is shifted with saturation to 1.31 format. + */ + +arm_status arm_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scaleFract, + int32_t shift, + arm_matrix_instance_q31 * pDst) +{ + q31_t *pIn = pSrc->pData; /* Input data matrix pointer */ + q31_t *pOut = pDst->pData; /* Output data matrix pointer */ + uint32_t numSamples; /* Total number of elements in the matrix */ + uint32_t blkCnt; /* Loop counter */ + arm_status status; /* Status of matrix scaling */ + int32_t kShift = shift + 1; /* Shift to apply after scaling */ + q31_t in, out; /* Temporary variabels */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pDst->numRows) || + (pSrc->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Total number of samples in input matrix */ + numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) * k */ + + /* Scale, saturate and store result in destination buffer. */ + in = *pIn++; /* read four inputs from source */ + in = ((q63_t) in * scaleFract) >> 32; /* multiply input with scaler value */ + out = in << kShift; /* apply shifting */ + if (in != (out >> kShift)) /* saturate the results. */ + out = 0x7FFFFFFF ^ (in >> 31); + *pOut++ = out; /* Store result destination */ + + in = *pIn++; + in = ((q63_t) in * scaleFract) >> 32; + out = in << kShift; + if (in != (out >> kShift)) + out = 0x7FFFFFFF ^ (in >> 31); + *pOut++ = out; + + in = *pIn++; + in = ((q63_t) in * scaleFract) >> 32; + out = in << kShift; + if (in != (out >> kShift)) + out = 0x7FFFFFFF ^ (in >> 31); + *pOut++ = out; + + in = *pIn++; + in = ((q63_t) in * scaleFract) >> 32; + out = in << kShift; + if (in != (out >> kShift)) + out = 0x7FFFFFFF ^ (in >> 31); + *pOut++ = out; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) * k */ + + /* Scale, saturate and store result in destination buffer. */ + in = *pIn++; + in = ((q63_t) in * scaleFract) >> 32; + out = in << kShift; + if (in != (out >> kShift)) + out = 0x7FFFFFFF ^ (in >> 31); + *pOut++ = out; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixScale group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_f32.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_f32.c new file mode 100644 index 0000000..cb57647 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_f32.c @@ -0,0 +1,226 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_sub_f32.c + * Description: Floating-point matrix subtraction + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @defgroup MatrixSub Matrix Subtraction + + Subtract two matrices. + \image html MatrixSubtraction.gif "Subraction of two 3 x 3 matrices" + + The functions check to make sure that + pSrcA, pSrcB, and pDst have the same + number of rows and columns. + */ + +/** + @addtogroup MatrixSub + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + */ + +#if defined(ARM_MATH_NEON) +arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ + float32_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + + + float32_t inA1, inA2, inB1, inB2, out1, out2; /* temporary variables */ + + + uint32_t numSamples; /* total number of elements in the matrix */ + uint32_t blkCnt; /* loop counters */ + arm_status status; /* status of matrix subtraction */ + +#ifdef ARM_MATH_MATRIX_CHECK + /* Check for matrix mismatch condition */ + if ((pSrcA->numRows != pSrcB->numRows) || + (pSrcA->numCols != pSrcB->numCols) || + (pSrcA->numRows != pDst->numRows) || (pSrcA->numCols != pDst->numCols)) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + { + float32x4_t vec1; + float32x4_t vec2; + float32x4_t res; + + /* Total number of samples in the input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + + blkCnt = numSamples >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) - B(m,n) */ + /* Subtract and then store the results in the destination buffer. */ + /* Read values from source A */ + vec1 = vld1q_f32(pIn1); + vec2 = vld1q_f32(pIn2); + res = vsubq_f32(vec1, vec2); + vst1q_f32(pOut, res); + + /* Update pointers to process next samples */ + pIn1 += 4U; + pIn2 += 4U; + pOut += 4U; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the numSamples is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = numSamples % 0x4U; + + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) - B(m,n) */ + /* Subtract and then store the results in the destination buffer. */ + *pOut++ = (*pIn1++) - (*pIn2++); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#else +arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pInA = pSrcA->pData; /* input data matrix pointer A */ + float32_t *pInB = pSrcB->pData; /* input data matrix pointer B */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + + uint32_t numSamples; /* total number of elements in the matrix */ + uint32_t blkCnt; /* loop counters */ + arm_status status; /* status of matrix subtraction */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numRows != pSrcB->numRows) || + (pSrcA->numCols != pSrcB->numCols) || + (pSrcA->numRows != pDst->numRows) || + (pSrcA->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Total number of samples in input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) - B(m,n) */ + + /* Subtract and store result in destination buffer. */ + *pOut++ = (*pInA++) - (*pInB++); + *pOut++ = (*pInA++) - (*pInB++); + *pOut++ = (*pInA++) - (*pInB++); + *pOut++ = (*pInA++) - (*pInB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) - B(m,n) */ + + /* Subtract and store result in destination buffer. */ + *pOut++ = (*pInA++) - (*pInB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#endif /* #if defined(ARM_MATH_NEON) */ +/** + @} end of MatrixSub group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q15.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q15.c new file mode 100644 index 0000000..5d5e5d0 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q15.c @@ -0,0 +1,144 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_sub_q15.c + * Description: Q15 Matrix subtraction + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixSub + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. + */ + +arm_status arm_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst) +{ + q15_t *pInA = pSrcA->pData; /* input data matrix pointer A */ + q15_t *pInB = pSrcB->pData; /* input data matrix pointer B */ + q15_t *pOut = pDst->pData; /* output data matrix pointer */ + + uint32_t numSamples; /* total number of elements in the matrix */ + uint32_t blkCnt; /* loop counters */ + arm_status status; /* status of matrix subtraction */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numRows != pSrcB->numRows) || + (pSrcA->numCols != pSrcB->numCols) || + (pSrcA->numRows != pDst->numRows) || + (pSrcA->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Total number of samples in input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) - B(m,n) */ + + /* Subtract, Saturate and store result in destination buffer. */ +#if defined (ARM_MATH_DSP) + write_q15x2_ia (&pOut, __QSUB16(read_q15x2_ia ((q15_t **) &pInA), read_q15x2_ia ((q15_t **) &pInB))); + write_q15x2_ia (&pOut, __QSUB16(read_q15x2_ia ((q15_t **) &pInA), read_q15x2_ia ((q15_t **) &pInB))); +#else + *pOut++ = (q15_t) __SSAT(((q31_t) * pInA++ - *pInB++), 16); + *pOut++ = (q15_t) __SSAT(((q31_t) * pInA++ - *pInB++), 16); + *pOut++ = (q15_t) __SSAT(((q31_t) * pInA++ - *pInB++), 16); + *pOut++ = (q15_t) __SSAT(((q31_t) * pInA++ - *pInB++), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) - B(m,n) */ + + /* Subtract and store result in destination buffer. */ +#if defined (ARM_MATH_DSP) + *pOut++ = (q15_t) __QSUB16(*pInA++, *pInB++); +#else + *pOut++ = (q15_t) __SSAT(((q31_t) * pInA++ - *pInB++), 16); +#endif + + /* Decrement loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixSub group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q31.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q31.c new file mode 100644 index 0000000..40d1bef --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_sub_q31.c @@ -0,0 +1,139 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_sub_q31.c + * Description: Q31 matrix subtraction + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixSub + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated. + */ + +arm_status arm_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst) +{ + q31_t *pInA = pSrcA->pData; /* input data matrix pointer A */ + q31_t *pInB = pSrcB->pData; /* input data matrix pointer B */ + q31_t *pOut = pDst->pData; /* output data matrix pointer */ + + uint32_t numSamples; /* total number of elements in the matrix */ + uint32_t blkCnt; /* loop counters */ + arm_status status; /* status of matrix subtraction */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrcA->numRows != pSrcB->numRows) || + (pSrcA->numCols != pSrcB->numCols) || + (pSrcA->numRows != pDst->numRows) || + (pSrcA->numCols != pDst->numCols) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Total number of samples in input matrix */ + numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = numSamples >> 2U; + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) - B(m,n) */ + + /* Subtract, saturate and then store the results in the destination buffer. */ + *pOut++ = __QSUB(*pInA++, *pInB++); + + *pOut++ = __QSUB(*pInA++, *pInB++); + + *pOut++ = __QSUB(*pInA++, *pInB++); + + *pOut++ = __QSUB(*pInA++, *pInB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = numSamples % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = numSamples; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C(m,n) = A(m,n) - B(m,n) */ + + /* Subtract, saturate and store result in destination buffer. */ + *pOut++ = __QSUB(*pInA++, *pInB++); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixSub group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_f32.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_f32.c new file mode 100644 index 0000000..71748bf --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_f32.c @@ -0,0 +1,284 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_trans_f32.c + * Description: Floating-point matrix transpose + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2017 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @defgroup MatrixTrans Matrix Transpose + + Tranposes a matrix. + + Transposing an M x N matrix flips it around the center diagonal and results in an N x M matrix. + \image html MatrixTranspose.gif "Transpose of a 3 x 3 matrix" + */ + +/** + @addtogroup MatrixTrans + @{ + */ + +/** + @brief Floating-point matrix transpose. + @param[in] pSrc points to input matrix + @param[out] pDst points to output matrix + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + */ + +#if defined(ARM_MATH_NEON) + +arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn = pSrc->pData; /* input data matrix pointer */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + float32_t *px; /* Temporary output data matrix pointer */ + uint16_t nRows = pSrc->numRows; /* number of rows */ + uint16_t nColumns = pSrc->numCols; /* number of columns */ + + uint16_t blkCnt, rowCnt, i = 0U, row = nRows; /* loop counters */ + arm_status status; /* status of matrix transpose */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pDst->numCols) || (pSrc->numCols != pDst->numRows)) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Matrix transpose by exchanging the rows with columns */ + /* Row loop */ + rowCnt = row >> 2; + while (rowCnt > 0U) + { + float32x4_t row0V,row1V,row2V,row3V; + float32x4x2_t ra0,ra1,rb0,rb1; + + blkCnt = nColumns >> 2; + + /* The pointer px is set to starting address of the column being processed */ + px = pOut + i; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) /* Column loop */ + { + row0V = vld1q_f32(pIn); + row1V = vld1q_f32(pIn + 1 * nColumns); + row2V = vld1q_f32(pIn + 2 * nColumns); + row3V = vld1q_f32(pIn + 3 * nColumns); + pIn += 4; + + ra0 = vzipq_f32(row0V,row2V); + ra1 = vzipq_f32(row1V,row3V); + + rb0 = vzipq_f32(ra0.val[0],ra1.val[0]); + rb1 = vzipq_f32(ra0.val[1],ra1.val[1]); + + vst1q_f32(px,rb0.val[0]); + px += nRows; + + vst1q_f32(px,rb0.val[1]); + px += nRows; + + vst1q_f32(px,rb1.val[0]); + px += nRows; + + vst1q_f32(px,rb1.val[1]); + px += nRows; + + /* Decrement the column loop counter */ + blkCnt--; + } + + /* Perform matrix transpose for last 3 samples here. */ + blkCnt = nColumns % 0x4U; + + while (blkCnt > 0U) + { + /* Read and store the input element in the destination */ + *px++ = *pIn; + *px++ = *(pIn + 1 * nColumns); + *px++ = *(pIn + 2 * nColumns); + *px++ = *(pIn + 3 * nColumns); + + px += (nRows - 4); + pIn++; + + /* Decrement the column loop counter */ + blkCnt--; + } + + i += 4; + pIn += 3 * nColumns; + + /* Decrement the row loop counter */ + rowCnt--; + + } /* Row loop end */ + + rowCnt = row & 3; + while (rowCnt > 0U) + { + blkCnt = nColumns ; + /* The pointer px is set to starting address of the column being processed */ + px = pOut + i; + + while (blkCnt > 0U) + { + /* Read and store the input element in the destination */ + *px = *pIn++; + + /* Update the pointer px to point to the next row of the transposed matrix */ + px += nRows; + + /* Decrement the column loop counter */ + blkCnt--; + } + i++; + rowCnt -- ; + } + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#else +arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst) +{ + float32_t *pIn = pSrc->pData; /* input data matrix pointer */ + float32_t *pOut = pDst->pData; /* output data matrix pointer */ + float32_t *px; /* Temporary output data matrix pointer */ + uint16_t nRows = pSrc->numRows; /* number of rows */ + uint16_t nCols = pSrc->numCols; /* number of columns */ + uint32_t col, row = nRows, i = 0U; /* Loop counters */ + arm_status status; /* status of matrix transpose */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pDst->numCols) || + (pSrc->numCols != pDst->numRows) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Matrix transpose by exchanging the rows with columns */ + /* row loop */ + do + { + /* Pointer px is set to starting address of column being processed */ + px = pOut + i; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + col = nCols >> 2U; + + while (col > 0U) /* column loop */ + { + /* Read and store input element in destination */ + *px = *pIn++; + /* Update pointer px to point to next row of transposed matrix */ + px += nRows; + + *px = *pIn++; + px += nRows; + + *px = *pIn++; + px += nRows; + + *px = *pIn++; + px += nRows; + + /* Decrement column loop counter */ + col--; + } + + /* Loop unrolling: Compute remaining outputs */ + col = nCols % 0x4U; + +#else + + /* Initialize col with number of samples */ + col = nCols; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (col > 0U) + { + /* Read and store input element in destination */ + *px = *pIn++; + + /* Update pointer px to point to next row of transposed matrix */ + px += nRows; + + /* Decrement column loop counter */ + col--; + } + + i++; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); /* row loop end */ + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + * @} end of MatrixTrans group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q15.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q15.c new file mode 100644 index 0000000..707e0d6 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q15.c @@ -0,0 +1,182 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_trans_q15.c + * Description: Q15 matrix transpose + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixTrans + @{ + */ + +/** + @brief Q15 matrix transpose. + @param[in] pSrc points to input matrix + @param[out] pDst points to output matrix + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + */ + +arm_status arm_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst) +{ + q15_t *pIn = pSrc->pData; /* input data matrix pointer */ + q15_t *pOut = pDst->pData; /* output data matrix pointer */ + uint16_t nRows = pSrc->numRows; /* number of rows */ + uint16_t nCols = pSrc->numCols; /* number of columns */ + uint32_t col, row = nRows, i = 0U; /* Loop counters */ + arm_status status; /* status of matrix transpose */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t in; /* variable to hold temporary output */ +#endif + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pDst->numCols) || + (pSrc->numCols != pDst->numRows) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Matrix transpose by exchanging the rows with columns */ + /* row loop */ + do + { + /* Pointer pOut is set to starting address of column being processed */ + pOut = pDst->pData + i; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + col = nCols >> 2U; + + while (col > 0U) /* column loop */ + { + /* Read two elements from row */ + in = read_q15x2_ia ((q15_t **) &pIn); + + /* Unpack and store one element in destination */ +#ifndef ARM_MATH_BIG_ENDIAN + *pOut = (q15_t) in; +#else + *pOut = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Update pointer pOut to point to next row of transposed matrix */ + pOut += nRows; + + /* Unpack and store second element in destination */ +#ifndef ARM_MATH_BIG_ENDIAN + *pOut = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#else + *pOut = (q15_t) in; +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Update pointer pOut to point to next row of transposed matrix */ + pOut += nRows; + + /* Read two elements from row */ + in = read_q15x2_ia ((q15_t **) &pIn); + + /* Unpack and store one element in destination */ +#ifndef ARM_MATH_BIG_ENDIAN + *pOut = (q15_t) in; +#else + *pOut = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); + +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Update pointer pOut to point to next row of transposed matrix */ + pOut += nRows; + + /* Unpack and store second element in destination */ +#ifndef ARM_MATH_BIG_ENDIAN + *pOut = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); +#else + *pOut = (q15_t) in; +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Update pointer pOut to point to next row of transposed matrix */ + pOut += nRows; + + /* Decrement column loop counter */ + col--; + } + + /* Loop unrolling: Compute remaining outputs */ + col = nCols % 0x4U; + +#else + + /* Initialize col with number of samples */ + col = nCols; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (col > 0U) + { + /* Read and store input element in destination */ + *pOut = *pIn++; + + /* Update pointer pOut to point to next row of transposed matrix */ + pOut += nRows; + + /* Decrement column loop counter */ + col--; + } + + i++; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); /* row loop end */ + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixTrans group + */ diff --git a/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q31.c b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q31.c new file mode 100644 index 0000000..5d0b5e2 --- /dev/null +++ b/CMSIS/DSP/Source/MatrixFunctions/arm_mat_trans_q31.c @@ -0,0 +1,146 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mat_trans_q31.c + * Description: Q31 matrix transpose + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupMatrix + */ + +/** + @addtogroup MatrixTrans + @{ + */ + +/** + @brief Q31 matrix transpose. + @param[in] pSrc points to input matrix + @param[out] pDst points to output matrix + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + */ + +arm_status arm_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst) +{ + q31_t *pIn = pSrc->pData; /* input data matrix pointer */ + q31_t *pOut = pDst->pData; /* output data matrix pointer */ + q31_t *px; /* Temporary output data matrix pointer */ + uint16_t nRows = pSrc->numRows; /* number of rows */ + uint16_t nCols = pSrc->numCols; /* number of columns */ + uint32_t col, row = nRows, i = 0U; /* Loop counters */ + arm_status status; /* status of matrix transpose */ + +#ifdef ARM_MATH_MATRIX_CHECK + + /* Check for matrix mismatch condition */ + if ((pSrc->numRows != pDst->numCols) || + (pSrc->numCols != pDst->numRows) ) + { + /* Set status as ARM_MATH_SIZE_MISMATCH */ + status = ARM_MATH_SIZE_MISMATCH; + } + else + +#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ + + { + /* Matrix transpose by exchanging the rows with columns */ + /* row loop */ + do + { + /* Pointer px is set to starting address of column being processed */ + px = pOut + i; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + col = nCols >> 2U; + + while (col > 0U) /* column loop */ + { + /* Read and store input element in destination */ + *px = *pIn++; + /* Update pointer px to point to next row of transposed matrix */ + px += nRows; + + *px = *pIn++; + px += nRows; + + *px = *pIn++; + px += nRows; + + *px = *pIn++; + px += nRows; + + /* Decrement column loop counter */ + col--; + } + + /* Loop unrolling: Compute remaining outputs */ + col = nCols % 0x4U; + +#else + + /* Initialize col with number of samples */ + col = nCols; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (col > 0U) + { + /* Read and store input element in destination */ + *px = *pIn++; + + /* Update pointer px to point to next row of transposed matrix */ + px += nRows; + + /* Decrement column loop counter */ + col--; + } + + i++; + + /* Decrement row loop counter */ + row--; + + } while (row > 0U); /* row loop end */ + + /* Set status as ARM_MATH_SUCCESS */ + status = ARM_MATH_SUCCESS; + } + + /* Return to application */ + return (status); +} + +/** + @} end of MatrixTrans group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/CMakeLists.txt b/CMSIS/DSP/Source/StatisticsFunctions/CMakeLists.txt new file mode 100644 index 0000000..3f23355 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPStatistics) + + +file(GLOB SRC "./*_*.c") + +add_library(CMSISDSPStatistics STATIC ${SRC}) + +configdsp(CMSISDSPStatistics ..) + +### Includes +target_include_directories(CMSISDSPStatistics PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/StatisticsFunctions/StatisticsFunctions.c b/CMSIS/DSP/Source/StatisticsFunctions/StatisticsFunctions.c new file mode 100644 index 0000000..4f86aa4 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/StatisticsFunctions.c @@ -0,0 +1,53 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: StatisticsFunctions.c + * Description: Combination of all statistics function source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_max_f32.c" +#include "arm_max_q15.c" +#include "arm_max_q31.c" +#include "arm_max_q7.c" +#include "arm_mean_f32.c" +#include "arm_mean_q15.c" +#include "arm_mean_q31.c" +#include "arm_mean_q7.c" +#include "arm_min_f32.c" +#include "arm_min_q15.c" +#include "arm_min_q31.c" +#include "arm_min_q7.c" +#include "arm_power_f32.c" +#include "arm_power_q15.c" +#include "arm_power_q31.c" +#include "arm_power_q7.c" +#include "arm_rms_f32.c" +#include "arm_rms_q15.c" +#include "arm_rms_q31.c" +#include "arm_std_f32.c" +#include "arm_std_q15.c" +#include "arm_std_q31.c" +#include "arm_var_f32.c" +#include "arm_var_q15.c" +#include "arm_var_q31.c" diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_max_f32.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_max_f32.c new file mode 100644 index 0000000..cd54e2a --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_max_f32.c @@ -0,0 +1,271 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_max_f32.c + * Description: Maximum value of a floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#if defined(ARM_MATH_NEON) +#include +#endif + +/** + @ingroup groupStats + */ + +/** + @defgroup Max Maximum + + Computes the maximum value of an array of data. + The function returns both the maximum value and its position within the array. + There are separate functions for floating-point, Q31, Q15, and Q7 data types. + */ + +/** + @addtogroup Max + @{ + */ + +/** + @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 + @param[out] pIndex index of maximum value returned here + @return none + */ +#if defined(ARM_MATH_NEON) +void arm_max_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex) +{ + float32_t maxVal1, maxVal2, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex, count; /* loop counter */ + + float32x4_t outV, srcV; + float32x2_t outV2; + + uint32x4_t idxV; + uint32x4_t maxIdx={ULONG_MAX,ULONG_MAX,ULONG_MAX,ULONG_MAX}; + uint32x4_t index={4,5,6,7}; + uint32x4_t delta={4,4,4,4}; + uint32x4_t countV={0,1,2,3}; + uint32x2_t countV2; + + /* Initialise the count value. */ + count = 0U; + + /* Initialise the index value to zero. */ + outIndex = 0U; + + /* Load first input value that act as reference value for comparison */ + if (blockSize <= 3) + { + out = *pSrc++; + + blkCnt = blockSize - 1; + + while (blkCnt > 0U) + { + /* Initialize maxVal to the next consecutive values one by one */ + maxVal1 = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal1) + { + /* Update the maximum value and it's index */ + out = maxVal1; + outIndex = blockSize - blkCnt; + } + + /* Decrement the loop counter */ + blkCnt--; + } + } + else + { + outV = vld1q_f32(pSrc); + pSrc += 4; + + /* Compute 4 outputs at a time */ + blkCnt = (blockSize - 4 ) >> 2U; + + while (blkCnt > 0U) + { + srcV = vld1q_f32(pSrc); + pSrc += 4; + + idxV = vcgtq_f32(srcV, outV); + outV = vbslq_f32(idxV, srcV, outV ); + countV = vbslq_u32(idxV, index,countV ); + + index = vaddq_u32(index,delta); + + /* Decrement the loop counter */ + blkCnt--; + } + + outV2 = vpmax_f32(vget_low_f32(outV),vget_high_f32(outV)); + outV2 = vpmax_f32(outV2,outV2); + out = outV2[0]; + + idxV = vceqq_f32(outV, vdupq_n_f32(out)); + countV = vbslq_u32(idxV, countV,maxIdx); + + countV2 = vpmin_u32(vget_low_u32(countV),vget_high_u32(countV)); + countV2 = vpmin_u32(countV2,countV2); + outIndex = countV2[0]; + + /* if (blockSize - 1U) is not multiple of 4 */ + blkCnt = (blockSize - 4 ) % 4U; + + while (blkCnt > 0U) + { + /* Initialize maxVal to the next consecutive values one by one */ + maxVal1 = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal1) + { + /* Update the maximum value and it's index */ + out = maxVal1; + outIndex = blockSize - blkCnt ; + } + + /* Decrement the loop counter */ + blkCnt--; + } + + + } + + /* Store the maximum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} +#else +void arm_max_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex) +{ + float32_t maxVal, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + uint32_t index; /* index of maximum value */ +#endif + + /* Initialise index value to zero. */ + outIndex = 0U; + + /* Load first input value that act as reference value for comparision */ + out = *pSrc++; + +#if defined (ARM_MATH_LOOPUNROLL) + /* Initialise index of maximum value. */ + index = 0U; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (blockSize - 1U) >> 2U; + + while (blkCnt > 0U) + { + /* Initialize maxVal to next consecutive values one by one */ + maxVal = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal) + { + /* Update the maximum value and it's index */ + out = maxVal; + outIndex = index + 1U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 2U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 3U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 4U; + } + + index += 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (blockSize - 1U) % 4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (blockSize - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Initialize maxVal to the next consecutive values one by one */ + maxVal = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal) + { + /* Update the maximum value and it's index */ + out = maxVal; + outIndex = blockSize - blkCnt; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store the maximum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} +#endif /* #if defined(ARM_MATH_NEON) */ +/** + @} end of Max group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q15.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q15.c new file mode 100644 index 0000000..329b0c8 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q15.c @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_max_q15.c + * Description: Maximum value of a Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup Max + @{ + */ + +/** + @brief Maximum value of a Q15 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 + @param[out] pIndex index of maximum value returned here + @return none + */ + +void arm_max_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex) +{ + q15_t maxVal, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + uint32_t index; /* index of maximum value */ +#endif + + /* Initialise index value to zero. */ + outIndex = 0U; + /* Load first input value that act as reference value for comparision */ + out = *pSrc++; + +#if defined (ARM_MATH_LOOPUNROLL) + /* Initialise index of maximum value. */ + index = 0U; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (blockSize - 1U) >> 2U; + + while (blkCnt > 0U) + { + /* Initialize maxVal to next consecutive values one by one */ + maxVal = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal) + { + /* Update the maximum value and it's index */ + out = maxVal; + outIndex = index + 1U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 2U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 3U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 4U; + } + + index += 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (blockSize - 1U) % 4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (blockSize - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Initialize maxVal to the next consecutive values one by one */ + maxVal = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal) + { + /* Update the maximum value and it's index */ + out = maxVal; + outIndex = blockSize - blkCnt; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store the maximum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} + +/** + @} end of Max group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q31.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q31.c new file mode 100644 index 0000000..99de13e --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q31.c @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_max_q31.c + * Description: Maximum value of a Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup Max + @{ + */ + +/** + @brief Maximum value of a Q31 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 + @param[out] pIndex index of maximum value returned here + @return none + */ + +void arm_max_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex) +{ + q31_t maxVal, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + uint32_t index; /* index of maximum value */ +#endif + + /* Initialise index value to zero. */ + outIndex = 0U; + /* Load first input value that act as reference value for comparision */ + out = *pSrc++; + +#if defined (ARM_MATH_LOOPUNROLL) + /* Initialise index of maximum value. */ + index = 0U; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (blockSize - 1U) >> 2U; + + while (blkCnt > 0U) + { + /* Initialize maxVal to next consecutive values one by one */ + maxVal = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal) + { + /* Update the maximum value and it's index */ + out = maxVal; + outIndex = index + 1U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 2U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 3U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 4U; + } + + index += 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (blockSize - 1U) % 4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (blockSize - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Initialize maxVal to the next consecutive values one by one */ + maxVal = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal) + { + /* Update the maximum value and it's index */ + out = maxVal; + outIndex = blockSize - blkCnt; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store the maximum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} + +/** + @} end of Max group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q7.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q7.c new file mode 100644 index 0000000..9c8b6d3 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_max_q7.c @@ -0,0 +1,148 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_max_q7.c + * Description: Maximum value of a Q7 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup Max + @{ + */ + +/** + @brief Maximum value of a Q7 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 + @param[out] pIndex index of maximum value returned here + @return none + */ + +void arm_max_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex) +{ + q7_t maxVal, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + uint32_t index; /* index of maximum value */ +#endif + + /* Initialise index value to zero. */ + outIndex = 0U; + /* Load first input value that act as reference value for comparision */ + out = *pSrc++; + +#if defined (ARM_MATH_LOOPUNROLL) + /* Initialise index of maximum value. */ + index = 0U; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (blockSize - 1U) >> 2U; + + while (blkCnt > 0U) + { + /* Initialize maxVal to next consecutive values one by one */ + maxVal = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal) + { + /* Update the maximum value and it's index */ + out = maxVal; + outIndex = index + 1U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 2U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 3U; + } + + maxVal = *pSrc++; + if (out < maxVal) + { + out = maxVal; + outIndex = index + 4U; + } + + index += 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (blockSize - 1U) % 4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (blockSize - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Initialize maxVal to the next consecutive values one by one */ + maxVal = *pSrc++; + + /* compare for the maximum value */ + if (out < maxVal) + { + /* Update the maximum value and it's index */ + out = maxVal; + outIndex = blockSize - blkCnt; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store the maximum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} + +/** + @} end of Max group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_f32.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_f32.c new file mode 100644 index 0000000..63d9652 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_f32.c @@ -0,0 +1,166 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mean_f32.c + * Description: Mean value of a floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @defgroup mean Mean + + Calculates the mean of the input vector. Mean is defined as the average of the elements in the vector. + The underlying algorithm is used: + +
+      Result = (pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]) / blockSize;
+  
+ + There are separate functions for floating-point, Q31, Q15, and Q7 data types. + */ + +/** + @addtogroup mean + @{ + */ + +/** + @brief Mean 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 mean value returned here. + @return none + */ +#if defined(ARM_MATH_NEON_EXPERIMENTAL) +void arm_mean_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + float32_t sum = 0.0f; /* Temporary result storage */ + float32x4_t sumV = vdupq_n_f32(0.0f); /* Temporary result storage */ + float32x2_t sumV2; + + uint32_t blkCnt; /* Loop counter */ + + float32_t in1, in2, in3, in4; + float32x4_t inV; + + blkCnt = blockSize >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + inV = vld1q_f32(pSrc); + sumV = vaddq_f32(sumV, inV); + + pSrc += 4; + /* Decrement the loop counter */ + blkCnt--; + } + + sumV2 = vpadd_f32(vget_low_f32(sumV),vget_high_f32(sumV)); + sum = sumV2[0] + sumV2[1]; + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize & 3; + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + sum += *pSrc++; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ + /* Store the result to the destination */ + *pResult = sum / (float32_t) blockSize; +} +#else +void arm_mean_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t sum = 0.0f; /* Temporary result storage */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + sum += *pSrc++; + + sum += *pSrc++; + + sum += *pSrc++; + + sum += *pSrc++; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + sum += *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ + /* Store result to destination */ + *pResult = (sum / blockSize); +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of mean group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q15.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q15.c new file mode 100644 index 0000000..463aa84 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q15.c @@ -0,0 +1,114 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mean_q15.c + * Description: Mean value of a Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup mean + @{ + */ + +/** + @brief Mean value of a Q15 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult mean value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 32-bit internal accumulator. + The input is represented in 1.15 format and is accumulated in a 32-bit + accumulator in 17.15 format. + There is no risk of internal overflow with this approach, and the + full precision of intermediate result is preserved. + Finally, the accumulator is truncated to yield a result of 1.15 format. + */ + +void arm_mean_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t sum = 0; /* Temporary result storage */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t in; +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + in = read_q15x2_ia ((q15_t **) &pSrc); + sum += ((in << 16U) >> 16U); + sum += (in >> 16U); + + in = read_q15x2_ia ((q15_t **) &pSrc); + sum += ((in << 16U) >> 16U); + sum += (in >> 16U); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + sum += *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ + /* Store result to destination */ + *pResult = (q15_t) (sum / (int32_t) blockSize); +} + +/** + @} end of mean group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q31.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q31.c new file mode 100644 index 0000000..4b0ed6e --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q31.c @@ -0,0 +1,110 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mean_q31.c + * Description: Mean value of a Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup mean + @{ + */ + +/** + @brief Mean value of a Q31 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult mean value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + The input is represented in 1.31 format and is accumulated in a 64-bit + accumulator in 33.31 format. + There is no risk of internal overflow with this approach, and the + full precision of intermediate result is preserved. + Finally, the accumulator is truncated to yield a result of 1.31 format. + */ + +void arm_mean_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t sum = 0; /* Temporary result storage */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + sum += *pSrc++; + + sum += *pSrc++; + + sum += *pSrc++; + + sum += *pSrc++; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + sum += *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ + /* Store result to destination */ + *pResult = (q31_t) (sum / blockSize); +} + +/** + @} end of mean group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q7.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q7.c new file mode 100644 index 0000000..8f52211 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_mean_q7.c @@ -0,0 +1,112 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mean_q7.c + * Description: Mean value of a Q7 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup mean + @{ + */ + +/** + @brief Mean value of a Q7 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult mean value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 32-bit internal accumulator. + The input is represented in 1.7 format and is accumulated in a 32-bit + accumulator in 25.7 format. + There is no risk of internal overflow with this approach, and the + full precision of intermediate result is preserved. + Finally, the accumulator is truncated to yield a result of 1.7 format. + */ + +void arm_mean_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t sum = 0; /* Temporary result storage */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t in; +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + in = read_q7x4_ia ((q7_t **) &pSrc); + sum += ((in << 24U) >> 24U); + sum += ((in << 16U) >> 24U); + sum += ((in << 8U) >> 24U); + sum += (in >> 24U); + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + sum += *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ + /* Store result to destination */ + *pResult = (q7_t) (sum / (int32_t) blockSize); +} + +/** + @} end of mean group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_min_f32.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_min_f32.c new file mode 100644 index 0000000..6e9ff4b --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_min_f32.c @@ -0,0 +1,268 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_min_f32.c + * Description: Minimum value of a floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include + +/** + @ingroup groupStats + */ + +/** + @defgroup Min Minimum + + Computes the minimum value of an array of data. + The function returns both the minimum value and its position within the array. + There are separate functions for floating-point, Q31, Q15, and Q7 data types. + */ + +/** + @addtogroup Min + @{ + */ + +/** + @brief Minimum 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 minimum value returned here + @param[out] pIndex index of minimum value returned here + @return none + */ +#if defined(ARM_MATH_NEON) +void arm_min_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex) +{ + float32_t maxVal1, maxVal2, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex, count; /* loop counter */ + + float32x4_t outV, srcV; + float32x2_t outV2; + + uint32x4_t idxV; + uint32x4_t maxIdx={ULONG_MAX,ULONG_MAX,ULONG_MAX,ULONG_MAX}; + uint32x4_t index={4,5,6,7}; + uint32x4_t delta={4,4,4,4}; + uint32x4_t countV={0,1,2,3}; + uint32x2_t countV2; + + /* Initialise the count value. */ + count = 0U; + + /* Initialise the index value to zero. */ + outIndex = 0U; + + /* Load first input value that act as reference value for comparison */ + if (blockSize <= 3) + { + out = *pSrc++; + + blkCnt = blockSize - 1; + + while (blkCnt > 0U) + { + /* Initialize maxVal to the next consecutive values one by one */ + maxVal1 = *pSrc++; + + /* compare for the maximum value */ + if (out > maxVal1) + { + /* Update the maximum value and it's index */ + out = maxVal1; + outIndex = blockSize - blkCnt; + } + + /* Decrement the loop counter */ + blkCnt--; + } + } + else + { + outV = vld1q_f32(pSrc); + pSrc += 4; + + /* Compute 4 outputs at a time */ + blkCnt = (blockSize - 4 ) >> 2U; + + while (blkCnt > 0U) + { + srcV = vld1q_f32(pSrc); + pSrc += 4; + + idxV = vcltq_f32(srcV, outV); + outV = vbslq_f32(idxV, srcV, outV ); + countV = vbslq_u32(idxV, index,countV ); + + index = vaddq_u32(index,delta); + + /* Decrement the loop counter */ + blkCnt--; + } + + outV2 = vpmin_f32(vget_low_f32(outV),vget_high_f32(outV)); + outV2 = vpmin_f32(outV2,outV2); + out = outV2[0]; + + idxV = vceqq_f32(outV, vdupq_n_f32(out)); + countV = vbslq_u32(idxV, countV,maxIdx); + + countV2 = vpmin_u32(vget_low_u32(countV),vget_high_u32(countV)); + countV2 = vpmin_u32(countV2,countV2); + outIndex = countV2[0]; + + /* if (blockSize - 1U) is not multiple of 4 */ + blkCnt = (blockSize - 4 ) % 4U; + + while (blkCnt > 0U) + { + /* Initialize maxVal to the next consecutive values one by one */ + maxVal1 = *pSrc++; + + /* compare for the maximum value */ + if (out > maxVal1) + { + /* Update the maximum value and it's index */ + out = maxVal1; + outIndex = blockSize - blkCnt ; + } + + /* Decrement the loop counter */ + blkCnt--; + } + } + + /* Store the maximum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} +#else +void arm_min_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex) +{ + float32_t minVal, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + uint32_t index; /* index of maximum value */ +#endif + + /* Initialise index value to zero. */ + outIndex = 0U; + + /* Load first input value that act as reference value for comparision */ + out = *pSrc++; + +#if defined (ARM_MATH_LOOPUNROLL) + /* Initialise index of maximum value. */ + index = 0U; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (blockSize - 1U) >> 2U; + + while (blkCnt > 0U) + { + /* Initialize minVal to next consecutive values one by one */ + minVal = *pSrc++; + + /* compare for the minimum value */ + if (out > minVal) + { + /* Update the minimum value and it's index */ + out = minVal; + outIndex = index + 1U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 2U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 3U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 4U; + } + + index += 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (blockSize - 1U) % 4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (blockSize - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Initialize minVal to the next consecutive values one by one */ + minVal = *pSrc++; + + /* compare for the minimum value */ + if (out > minVal) + { + /* Update the minimum value and it's index */ + out = minVal; + outIndex = blockSize - blkCnt; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store the minimum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of Min group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q15.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q15.c new file mode 100644 index 0000000..9450383 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q15.c @@ -0,0 +1,149 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_min_q15.c + * Description: Minimum value of a Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + + +/** + @addtogroup Min + @{ + */ + +/** + @brief Minimum value of a Q15 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult minimum value returned here + @param[out] pIndex index of minimum value returned here + @return none + */ + +void arm_min_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex) +{ + q15_t minVal, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + uint32_t index; /* index of maximum value */ +#endif + + /* Initialise index value to zero. */ + outIndex = 0U; + /* Load first input value that act as reference value for comparision */ + out = *pSrc++; + +#if defined (ARM_MATH_LOOPUNROLL) + /* Initialise index of maximum value. */ + index = 0U; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (blockSize - 1U) >> 2U; + + while (blkCnt > 0U) + { + /* Initialize minVal to next consecutive values one by one */ + minVal = *pSrc++; + + /* compare for the minimum value */ + if (out > minVal) + { + /* Update the minimum value and it's index */ + out = minVal; + outIndex = index + 1U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 2U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 3U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 4U; + } + + index += 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (blockSize - 1U) % 4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (blockSize - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Initialize minVal to the next consecutive values one by one */ + minVal = *pSrc++; + + /* compare for the minimum value */ + if (out > minVal) + { + /* Update the minimum value and it's index */ + out = minVal; + outIndex = blockSize - blkCnt; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store the minimum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} + +/** + @} end of Min group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q31.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q31.c new file mode 100644 index 0000000..e25eb47 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q31.c @@ -0,0 +1,149 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_min_q31.c + * Description: Minimum value of a Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + + +/** + @addtogroup Min + @{ + */ + +/** + @brief Minimum value of a Q31 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult minimum value returned here + @param[out] pIndex index of minimum value returned here + @return none + */ + +void arm_min_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex) +{ + q31_t minVal, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + uint32_t index; /* index of maximum value */ +#endif + + /* Initialise index value to zero. */ + outIndex = 0U; + /* Load first input value that act as reference value for comparision */ + out = *pSrc++; + +#if defined (ARM_MATH_LOOPUNROLL) + /* Initialise index of maximum value. */ + index = 0U; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (blockSize - 1U) >> 2U; + + while (blkCnt > 0U) + { + /* Initialize minVal to next consecutive values one by one */ + minVal = *pSrc++; + + /* compare for the minimum value */ + if (out > minVal) + { + /* Update the minimum value and it's index */ + out = minVal; + outIndex = index + 1U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 2U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 3U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 4U; + } + + index += 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (blockSize - 1U) % 4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (blockSize - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Initialize minVal to the next consecutive values one by one */ + minVal = *pSrc++; + + /* compare for the minimum value */ + if (out > minVal) + { + /* Update the minimum value and it's index */ + out = minVal; + outIndex = blockSize - blkCnt; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store the minimum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} + +/** + @} end of Min group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q7.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q7.c new file mode 100644 index 0000000..2b171f0 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_min_q7.c @@ -0,0 +1,149 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_min_q7.c + * Description: Minimum value of a Q7 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + + +/** + @addtogroup Min + @{ + */ + +/** + @brief Minimum value of a Q7 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult minimum value returned here + @param[out] pIndex index of minimum value returned here + @return none + */ + +void arm_min_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex) +{ + q7_t minVal, out; /* Temporary variables to store the output value. */ + uint32_t blkCnt, outIndex; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + uint32_t index; /* index of maximum value */ +#endif + + /* Initialise index value to zero. */ + outIndex = 0U; + /* Load first input value that act as reference value for comparision */ + out = *pSrc++; + +#if defined (ARM_MATH_LOOPUNROLL) + /* Initialise index of maximum value. */ + index = 0U; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = (blockSize - 1U) >> 2U; + + while (blkCnt > 0U) + { + /* Initialize minVal to next consecutive values one by one */ + minVal = *pSrc++; + + /* compare for the minimum value */ + if (out > minVal) + { + /* Update the minimum value and it's index */ + out = minVal; + outIndex = index + 1U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 2U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 3U; + } + + minVal = *pSrc++; + if (out > minVal) + { + out = minVal; + outIndex = index + 4U; + } + + index += 4U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = (blockSize - 1U) % 4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = (blockSize - 1U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* Initialize minVal to the next consecutive values one by one */ + minVal = *pSrc++; + + /* compare for the minimum value */ + if (out > minVal) + { + /* Update the minimum value and it's index */ + out = minVal; + outIndex = blockSize - blkCnt; + } + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store the minimum value and it's index into destination pointers */ + *pResult = out; + *pIndex = outIndex; +} + +/** + @} end of Min group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_power_f32.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_power_f32.c new file mode 100644 index 0000000..a4825a5 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_power_f32.c @@ -0,0 +1,175 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_power_f32.c + * Description: Sum of the squares of the elements of a floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @defgroup power Power + + Calculates the sum of the squares of the elements in the input vector. + The underlying algorithm is used: + +
+      Result = pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + pSrc[2] * pSrc[2] + ... + pSrc[blockSize-1] * pSrc[blockSize-1];
+  
+ + There are separate functions for floating point, Q31, Q15, and Q7 data types. + */ + +/** + @addtogroup power + @{ + */ + +/** + @brief Sum of the squares of the elements 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 sum of the squares value returned here + @return none + */ +#if defined(ARM_MATH_NEON) +void arm_power_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + float32_t sum = 0.0f; /* accumulator */ + float32_t in; /* Temporary variable to store input value */ + uint32_t blkCnt; /* loop counter */ + + float32x4_t sumV = vdupq_n_f32(0.0f); /* Temporary result storage */ + float32x2_t sumV2; + float32x4_t inV; + + blkCnt = blockSize >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ + /* Compute Power and then store the result in a temporary variable, sum. */ + inV = vld1q_f32(pSrc); + sumV = vmlaq_f32(sumV, inV, inV); + pSrc += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + sumV2 = vpadd_f32(vget_low_f32(sumV),vget_high_f32(sumV)); + sum = sumV2[0] + sumV2[1]; + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize % 0x4U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ + /* compute power and then store the result in a temporary variable, sum. */ + in = *pSrc++; + sum += in * in; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Store the result to the destination */ + *pResult = sum; +} +#else +void arm_power_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t sum = 0.0f; /* Temporary result storage */ + float32_t in; /* Temporary variable to store input value */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + /* Compute Power and store result in a temporary variable, sum. */ + in = *pSrc++; + sum += in * in; + + in = *pSrc++; + sum += in * in; + + in = *pSrc++; + sum += in * in; + + in = *pSrc++; + sum += in * in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + /* Compute Power and store result in a temporary variable, sum. */ + in = *pSrc++; + sum += in * in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store result to destination */ + *pResult = sum; +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of power group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q15.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q15.c new file mode 100644 index 0000000..12f524d --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q15.c @@ -0,0 +1,132 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_power_q15.c + * Description: Sum of the squares of the elements of a Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup power + @{ + */ + +/** + @brief Sum of the squares of the elements of a Q15 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult sum of the squares value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + The input is represented in 1.15 format. + Intermediate multiplication yields a 2.30 format, and this + result is added without saturation to a 64-bit accumulator in 34.30 format. + With 33 guard bits in the accumulator, there is no risk of overflow, and the + full precision of the intermediate multiplication is preserved. + Finally, the return result is in 34.30 format. + */ + +void arm_power_q15( + const q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t sum = 0; /* Temporary result storage */ + q15_t in; /* Temporary variable to store input value */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t in32; /* Temporary variable to store packed input value */ +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + /* Compute Power and store result in a temporary variable, sum. */ +#if defined (ARM_MATH_DSP) + in32 = read_q15x2_ia ((q15_t **) &pSrc); + sum = __SMLALD(in32, in32, sum); + + in32 = read_q15x2_ia ((q15_t **) &pSrc); + sum = __SMLALD(in32, in32, sum); +#else + in = *pSrc++; + sum += ((q31_t) in * in); + + in = *pSrc++; + sum += ((q31_t) in * in); + + in = *pSrc++; + sum += ((q31_t) in * in); + + in = *pSrc++; + sum += ((q31_t) in * in); +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + /* Compute Power and store result in a temporary variable, sum. */ + in = *pSrc++; + sum += ((q31_t) in * in); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store result in 34.30 format */ + *pResult = sum; +} + +/** + @} end of power group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q31.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q31.c new file mode 100644 index 0000000..1e193b3 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q31.c @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_power_q31.c + * Description: Sum of the squares of the elements of a Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup power + @{ + */ + +/** + @brief Sum of the squares of the elements of a Q31 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult sum of the squares value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + The input is represented in 1.31 format. + Intermediate multiplication yields a 2.62 format, and this + result is truncated to 2.48 format by discarding the lower 14 bits. + The 2.48 result is then added without saturation to a 64-bit accumulator in 16.48 format. + With 15 guard bits in the accumulator, there is no risk of overflow, and the + full precision of the intermediate multiplication is preserved. + Finally, the return result is in 16.48 format. + */ + +void arm_power_q31( + const q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t sum = 0; /* Temporary result storage */ + q31_t in; /* Temporary variable to store input value */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + /* Compute Power then shift intermediate results by 14 bits to maintain 16.48 format and store result in a temporary variable sum, providing 15 guard bits. */ + in = *pSrc++; + sum += ((q63_t) in * in) >> 14U; + + in = *pSrc++; + sum += ((q63_t) in * in) >> 14U; + + in = *pSrc++; + sum += ((q63_t) in * in) >> 14U; + + in = *pSrc++; + sum += ((q63_t) in * in) >> 14U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + /* Compute Power and store result in a temporary variable, sum. */ + in = *pSrc++; + sum += ((q63_t) in * in) >> 14U; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store results in 16.48 format */ + *pResult = sum; +} + +/** + @} end of power group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q7.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q7.c new file mode 100644 index 0000000..47405cd --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_power_q7.c @@ -0,0 +1,136 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_power_q7.c + * Description: Sum of the squares of the elements of a Q7 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup power + @{ + */ + +/** + @brief Sum of the squares of the elements of a Q7 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult sum of the squares value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 32-bit internal accumulator. + The input is represented in 1.7 format. + Intermediate multiplication yields a 2.14 format, and this + result is added without saturation to an accumulator in 18.14 format. + With 17 guard bits in the accumulator, there is no risk of overflow, and the + full precision of the intermediate multiplication is preserved. + Finally, the return result is in 18.14 format. + */ + +void arm_power_q7( + const q7_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t sum = 0; /* Temporary result storage */ + q7_t in; /* Temporary variable to store input value */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t in32; /* Temporary variable to store packed input value */ + q31_t in1, in2; /* Temporary variables to store input value */ +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + /* Compute Power and store result in a temporary variable, sum. */ +#if defined (ARM_MATH_DSP) + in32 = read_q7x4_ia ((q7_t **) &pSrc); + + in1 = __SXTB16(__ROR(in32, 8)); + in2 = __SXTB16(in32); + + /* calculate power and accumulate to accumulator */ + sum = __SMLAD(in1, in1, sum); + sum = __SMLAD(in2, in2, sum); +#else + in = *pSrc++; + sum += ((q15_t) in * in); + + in = *pSrc++; + sum += ((q15_t) in * in); + + in = *pSrc++; + sum += ((q15_t) in * in); + + in = *pSrc++; + sum += ((q15_t) in * in); +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + /* Compute Power and store result in a temporary variable, sum. */ + in = *pSrc++; + sum += ((q15_t) in * in); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Store result in 18.14 format */ + *pResult = sum; +} + +/** + @} end of power group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_f32.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_f32.c new file mode 100644 index 0000000..4546510 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_f32.c @@ -0,0 +1,176 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rms_f32.c + * Description: Root mean square value of the elements of a floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @defgroup RMS Root mean square (RMS) + + Calculates the Root Mean Square of the elements in the input vector. + The underlying algorithm is used: + +
+      Result = sqrt(((pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1]) / blockSize));
+  
+ + There are separate functions for floating point, Q31, and Q15 data types. + */ + +/** + @addtogroup RMS + @{ + */ + +/** + @brief Root Mean Square of the elements 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 root mean square value returned here + @return none + */ +#if defined(ARM_MATH_NEON) +void arm_rms_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + float32_t sum = 0.0f; /* accumulator */ + float32_t in; /* Temporary variable to store input value */ + uint32_t blkCnt; /* loop counter */ + + float32x4_t sumV = vdupq_n_f32(0.0f); /* Temporary result storage */ + float32x2_t sumV2; + float32x4_t inV; + + blkCnt = blockSize >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ + /* Compute Power and then store the result in a temporary variable, sum. */ + inV = vld1q_f32(pSrc); + sumV = vmlaq_f32(sumV, inV, inV); + pSrc += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + sumV2 = vpadd_f32(vget_low_f32(sumV),vget_high_f32(sumV)); + sum = sumV2[0] + sumV2[1]; + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize % 0x4U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ + /* compute power and then store the result in a temporary variable, sum. */ + in = *pSrc++; + sum += in * in; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Compute Rms and store the result in the destination */ + arm_sqrt_f32(sum / (float32_t) blockSize, pResult); +} +#else +void arm_rms_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t sum = 0.0f; /* Temporary result storage */ + float32_t in; /* Temporary variable to store input value */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + in = *pSrc++; + /* Compute sum of squares and store result in a temporary variable, sum. */ + sum += in * in; + + in = *pSrc++; + sum += in * in; + + in = *pSrc++; + sum += in * in; + + in = *pSrc++; + sum += in * in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + in = *pSrc++; + /* Compute sum of squares and store result in a temporary variable. */ + sum += ( in * in); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Compute Rms and store result in destination */ + arm_sqrt_f32(sum / (float32_t) blockSize, pResult); +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of RMS group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q15.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q15.c new file mode 100644 index 0000000..9fcd964 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q15.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rms_q15.c + * Description: Root Mean Square of the elements of a Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup RMS + @{ + */ + +/** + @brief Root Mean Square of the elements of a Q15 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult root mean square value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + The input is represented in 1.15 format. + Intermediate multiplication yields a 2.30 format, and this + result is added without saturation to a 64-bit accumulator in 34.30 format. + With 33 guard bits in the accumulator, there is no risk of overflow, and the + full precision of the intermediate multiplication is preserved. + Finally, the 34.30 result is truncated to 34.15 format by discarding the lower + 15 bits, and then saturated to yield a result in 1.15 format. + */ + +void arm_rms_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t sum = 0; /* Temporary result storage */ + q15_t in; /* Temporary variable to store input value */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t in32; /* Temporary variable to store input value */ +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + /* Compute sum of squares and store result in a temporary variable. */ +#if defined (ARM_MATH_DSP) + in32 = read_q15x2_ia ((q15_t **) &pSrc); + sum = __SMLALD(in32, in32, sum); + + in32 = read_q15x2_ia ((q15_t **) &pSrc); + sum = __SMLALD(in32, in32, sum); +#else + in = *pSrc++; + sum += ((q31_t) in * in); + + in = *pSrc++; + sum += ((q31_t) in * in); + + in = *pSrc++; + sum += ((q31_t) in * in); + + in = *pSrc++; + sum += ((q31_t) in * in); +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + in = *pSrc++; + /* Compute sum of squares and store result in a temporary variable. */ + sum += ((q31_t) in * in); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Truncating and saturating the accumulator to 1.15 format */ + /* Store result in destination */ + arm_sqrt_q15(__SSAT((sum / (q63_t)blockSize) >> 15, 16), pResult); +} + +/** + @} end of RMS group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q31.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q31.c new file mode 100644 index 0000000..5a3e8f3 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_rms_q31.c @@ -0,0 +1,124 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rms_q31.c + * Description: Root Mean Square of the elements of a Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup RMS + @{ + */ + +/** + @brief Root Mean Square of the elements of a Q31 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult root mean square value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. + The input is represented in 1.31 format, and intermediate multiplication + yields a 2.62 format. + The accumulator maintains full precision of the intermediate multiplication results, + but provides only a single guard bit. + There is no saturation on intermediate additions. + If the accumulator overflows, it wraps around and distorts the result. + In order to avoid overflows completely, the input signal must be scaled down by + log2(blockSize) bits, as a total of blockSize additions are performed internally. + Finally, the 2.62 accumulator is right shifted by 31 bits to yield a 1.31 format value. + */ + +void arm_rms_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + uint64_t sum = 0; /* Temporary result storage (can get never negative. changed type from q63 to uint64 */ + q31_t in; /* Temporary variable to store input value */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + in = *pSrc++; + /* Compute sum of squares and store result in a temporary variable, sum. */ + sum += ((q63_t) in * in); + + in = *pSrc++; + sum += ((q63_t) in * in); + + in = *pSrc++; + sum += ((q63_t) in * in); + + in = *pSrc++; + sum += ((q63_t) in * in); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + + in = *pSrc++; + /* Compute sum of squares and store result in a temporary variable. */ + sum += ((q63_t) in * in); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Convert data in 2.62 to 1.31 by 31 right shifts and saturate */ + /* Compute Rms and store result in destination vector */ + arm_sqrt_q31(clip_q63_to_q31((sum / (q63_t) blockSize) >> 31), pResult); +} + +/** + @} end of RMS group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_std_f32.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_std_f32.c new file mode 100644 index 0000000..e1e6577 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_std_f32.c @@ -0,0 +1,188 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_std_f32.c + * Description: Standard deviation of the elements of a floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @defgroup STD Standard deviation + + Calculates the standard deviation of the elements in the input vector. + The underlying algorithm is used: + +
+      Result = sqrt((sumOfSquares - sum2 / blockSize) / (blockSize - 1))
+
+      sumOfSquares = pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1]
+      sum = pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]
+  
+ + There are separate functions for floating point, Q31, and Q15 data types. + */ + +/** + @addtogroup STD + @{ + */ + +/** + @brief Standard deviation of the elements 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 standard deviation value returned here + @return none + */ +#if defined(ARM_MATH_NEON_EXPERIMENTAL) +void arm_std_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + float32_t var; + arm_var_f32(pSrc,blockSize,&var); + arm_sqrt_f32(var, pResult); +} +#else +void arm_std_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t sum = 0.0f; /* Temporary result storage */ + float32_t sumOfSquares = 0.0f; /* Sum of squares */ + float32_t in; /* Temporary variable to store input value */ + +#ifndef ARM_MATH_CM0_FAMILY + float32_t meanOfSquares, mean, squareOfMean; /* Temporary variables */ +#else + float32_t squareOfSum; /* Square of Sum */ + float32_t var; /* Temporary varaince storage */ +#endif + + if (blockSize <= 1U) + { + *pResult = 0; + return; + } + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + in = *pSrc++; + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ + sumOfSquares += in * in; + /* Compute sum and store result in a temporary variable, sum. */ + sum += in; + + in = *pSrc++; + sumOfSquares += in * in; + sum += in; + + in = *pSrc++; + sumOfSquares += in * in; + sum += in; + + in = *pSrc++; + sumOfSquares += in * in; + sum += in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + in = *pSrc++; + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ + sumOfSquares += ( in * in); + /* Compute sum and store result in a temporary variable, sum. */ + sum += in; + + /* Decrement loop counter */ + blkCnt--; + } + +#ifndef ARM_MATH_CM0_FAMILY + + /* Compute Mean of squares and store result in a temporary variable, meanOfSquares. */ + meanOfSquares = sumOfSquares / ((float32_t) blockSize - 1.0f); + + /* Compute mean of all input values */ + mean = sum / (float32_t) blockSize; + + /* Compute square of mean */ + squareOfMean = (mean * mean) * (((float32_t) blockSize) / + ((float32_t) blockSize - 1.0f)); + + /* Compute standard deviation and store result to destination */ + arm_sqrt_f32((meanOfSquares - squareOfMean), pResult); + +#else + /* Run the below code for Cortex-M0 */ + + /* Compute square of sum */ + squareOfSum = ((sum * sum) / (float32_t) blockSize); + + /* Compute variance */ + var = ((sumOfSquares - squareOfSum) / (float32_t) (blockSize - 1.0f)); + + /* Compute standard deviation and store result in destination */ + arm_sqrt_f32(var, pResult); + +#endif /* #ifndef ARM_MATH_CM0_FAMILY */ + +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of STD group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q15.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q15.c new file mode 100644 index 0000000..8e5c042 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q15.c @@ -0,0 +1,161 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_std_q15.c + * Description: Standard deviation of an array of Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup STD + @{ + */ + +/** + @brief Standard deviation of the elements of a Q15 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult standard deviation value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + The input is represented in 1.15 format. + Intermediate multiplication yields a 2.30 format, and this + result is added without saturation to a 64-bit accumulator in 34.30 format. + With 33 guard bits in the accumulator, there is no risk of overflow, and the + full precision of the intermediate multiplication is preserved. + Finally, the 34.30 result is truncated to 34.15 format by discarding the lower + 15 bits, and then saturated to yield a result in 1.15 format. + */ + +void arm_std_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t sum = 0; /* Accumulator */ + q31_t meanOfSquares, squareOfMean; /* Square of mean and mean of square */ + q63_t sumOfSquares = 0; /* Sum of squares */ + q15_t in; /* Temporary variable to store input value */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t in32; /* Temporary variable to store input value */ +#endif + + if (blockSize <= 1U) + { + *pResult = 0; + return; + } + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ + /* Compute sum and store result in a temporary variable, sum. */ +#if defined (ARM_MATH_DSP) + in32 = read_q15x2_ia ((q15_t **) &pSrc); + sumOfSquares = __SMLALD(in32, in32, sumOfSquares); + sum += ((in32 << 16U) >> 16U); + sum += (in32 >> 16U); + + in32 = read_q15x2_ia ((q15_t **) &pSrc); + sumOfSquares = __SMLALD(in32, in32, sumOfSquares); + sum += ((in32 << 16U) >> 16U); + sum += (in32 >> 16U); +#else + in = *pSrc++; + sumOfSquares += (in * in); + sum += in; + + in = *pSrc++; + sumOfSquares += (in * in); + sum += in; + + in = *pSrc++; + sumOfSquares += (in * in); + sum += in; + + in = *pSrc++; + sumOfSquares += (in * in); + sum += in; +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + in = *pSrc++; + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ + sumOfSquares += (in * in); + /* Compute sum and store result in a temporary variable, sum. */ + sum += in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Compute Mean of squares and store result in a temporary variable, meanOfSquares. */ + meanOfSquares = (q31_t) (sumOfSquares / (q63_t)(blockSize - 1U)); + + /* Compute square of mean */ + squareOfMean = (q31_t) ((q63_t) sum * sum / (q63_t)(blockSize * (blockSize - 1U))); + + /* mean of squares minus the square of mean. */ + /* Compute standard deviation and store result in destination */ + arm_sqrt_q15(__SSAT((meanOfSquares - squareOfMean) >> 15U, 16U), pResult); +} + +/** + @} end of STD group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q31.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q31.c new file mode 100644 index 0000000..cfb6cb8 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_std_q31.c @@ -0,0 +1,147 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_std_q31.c + * Description: Standard deviation of the elements of a Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup STD + @{ + */ + +/** + @brief Standard deviation of the elements of a Q31 vector. + @param[in] pSrc points to the input vector. + @param[in] blockSize number of samples in input vector. + @param[out] pResult standard deviation value returned here. + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. + The input is represented in 1.31 format, which is then downshifted by 8 bits + which yields 1.23, and intermediate multiplication yields a 2.46 format. + The accumulator maintains full precision of the intermediate multiplication results, + but provides only a 16 guard bits. + There is no saturation on intermediate additions. + If the accumulator overflows it wraps around and distorts the result. + In order to avoid overflows completely the input signal must be scaled down by + log2(blockSize)-8 bits, as a total of blockSize additions are performed internally. + After division, internal variables should be Q18.46 + Finally, the 18.46 accumulator is right shifted by 15 bits to yield a 1.31 format value. + */ + +void arm_std_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t sum = 0; /* Accumulator */ + q63_t meanOfSquares, squareOfMean; /* Square of mean and mean of square */ + q63_t sumOfSquares = 0; /* Sum of squares */ + q31_t in; /* Temporary variable to store input value */ + + if (blockSize <= 1U) + { + *pResult = 0; + return; + } + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + in = *pSrc++ >> 8U; + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ + sumOfSquares += ((q63_t) (in) * (in)); + /* Compute sum and store result in a temporary variable, sum. */ + sum += in; + + in = *pSrc++ >> 8U; + sumOfSquares += ((q63_t) (in) * (in)); + sum += in; + + in = *pSrc++ >> 8U; + sumOfSquares += ((q63_t) (in) * (in)); + sum += in; + + in = *pSrc++ >> 8U; + sumOfSquares += ((q63_t) (in) * (in)); + sum += in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + in = *pSrc++ >> 8U; + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ + sumOfSquares += ((q63_t) (in) * (in)); + /* Compute sum and store result in a temporary variable, sum. */ + sum += in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Compute Mean of squares and store result in a temporary variable, meanOfSquares. */ + meanOfSquares = (sumOfSquares / (q63_t)(blockSize - 1U)); + + /* Compute square of mean */ + squareOfMean = ( sum * sum / (q63_t)(blockSize * (blockSize - 1U))); + + /* Compute standard deviation and store result in destination */ + arm_sqrt_q31((meanOfSquares - squareOfMean) >> 15U, pResult); +} + +/** + @} end of STD group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_var_f32.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_var_f32.c new file mode 100644 index 0000000..3c325b1 --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_var_f32.c @@ -0,0 +1,234 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_var_f32.c + * Description: Variance of the elements of a floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @defgroup variance Variance + + Calculates the variance of the elements in the input vector. + The underlying algorithm used is the direct method sometimes referred to as the two-pass method: + +
+      Result = sum(element - meanOfElements)^2) / numElement - 1
+
+      meanOfElements = ( pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] ) / blockSize
+  
+ + There are separate functions for floating point, Q31, and Q15 data types. + */ + +/** + @addtogroup variance + @{ + */ + +/** + @brief Variance of the elements 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 variance value returned here + @return none + */ +#if defined(ARM_MATH_NEON_EXPERIMENTAL) +void arm_var_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + float32_t mean; + + float32_t sum = 0.0f; /* accumulator */ + float32_t in; /* Temporary variable to store input value */ + uint32_t blkCnt; /* loop counter */ + + float32x4_t sumV = vdupq_n_f32(0.0f); /* Temporary result storage */ + float32x2_t sumV2; + float32x4_t inV; + float32x4_t avg; + + arm_mean_f32(pSrc,blockSize,&mean); + avg = vdupq_n_f32(mean); + + blkCnt = blockSize >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ + /* Compute Power and then store the result in a temporary variable, sum. */ + inV = vld1q_f32(pSrc); + inV = vsubq_f32(inV, avg); + sumV = vmlaq_f32(sumV, inV, inV); + pSrc += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + sumV2 = vpadd_f32(vget_low_f32(sumV),vget_high_f32(sumV)); + sum = sumV2[0] + sumV2[1]; + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize % 0x4U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ + /* compute power and then store the result in a temporary variable, sum. */ + in = *pSrc++; + in = in - mean; + sum += in * in; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* Variance */ + *pResult = sum / (float32_t)(blockSize - 1.0f); + +} + +#else +void arm_var_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + float32_t sum = 0.0f; /* Temporary result storage */ + float32_t fSum = 0.0f; + float32_t fMean, fValue; + const float32_t * pInput = pSrc; + + if (blockSize <= 1U) + { + *pResult = 0; + return; + } + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + + sum += *pInput++; + sum += *pInput++; + sum += *pInput++; + sum += *pInput++; + + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ + + sum += *pInput++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ + fMean = sum / (float32_t) blockSize; + + pInput = pSrc; + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + fValue = *pInput++ - fMean; + fSum += fValue * fValue; + + fValue = *pInput++ - fMean; + fSum += fValue * fValue; + + fValue = *pInput++ - fMean; + fSum += fValue * fValue; + + fValue = *pInput++ - fMean; + fSum += fValue * fValue; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + fValue = *pInput++ - fMean; + fSum += fValue * fValue; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Variance */ + *pResult = fSum / (float32_t)(blockSize - 1.0f); +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of variance group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q15.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q15.c new file mode 100644 index 0000000..259e76b --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q15.c @@ -0,0 +1,164 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_var_q15.c + * Description: Variance of an array of Q15 type + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup variance + @{ + */ + +/** + @brief Variance of the elements of a Q15 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult variance value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + The input is represented in 1.15 format. + Intermediate multiplication yields a 2.30 format, and this + result is added without saturation to a 64-bit accumulator in 34.30 format. + With 33 guard bits in the accumulator, there is no risk of overflow, and the + full precision of the intermediate multiplication is preserved. + Finally, the 34.30 result is truncated to 34.15 format by discarding the lower + 15 bits, and then saturated to yield a result in 1.15 format. + */ + +void arm_var_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q31_t sum = 0; /* Accumulator */ + q31_t meanOfSquares, squareOfMean; /* Square of mean and mean of square */ + q63_t sumOfSquares = 0; /* Sum of squares */ + q15_t in; /* Temporary variable to store input value */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t in32; /* Temporary variable to store input value */ +#endif + + if (blockSize <= 1U) + { + *pResult = 0; + return; + } + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ + /* Compute sum and store result in a temporary variable, sum. */ +#if defined (ARM_MATH_DSP) + in32 = read_q15x2_ia ((q15_t **) &pSrc); + sumOfSquares = __SMLALD(in32, in32, sumOfSquares); + sum += ((in32 << 16U) >> 16U); + sum += (in32 >> 16U); + + in32 = read_q15x2_ia ((q15_t **) &pSrc); + sumOfSquares = __SMLALD(in32, in32, sumOfSquares); + sum += ((in32 << 16U) >> 16U); + sum += (in32 >> 16U); +#else + in = *pSrc++; + sumOfSquares += (in * in); + sum += in; + + in = *pSrc++; + sumOfSquares += (in * in); + sum += in; + + in = *pSrc++; + sumOfSquares += (in * in); + sum += in; + + in = *pSrc++; + sumOfSquares += (in * in); + sum += in; +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + in = *pSrc++; + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ +#if defined (ARM_MATH_DSP) + sumOfSquares = __SMLALD(in, in, sumOfSquares); +#else + sumOfSquares += (in * in); +#endif /* #if defined (ARM_MATH_DSP) */ + /* Compute sum and store result in a temporary variable, sum. */ + sum += in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Compute Mean of squares and store result in a temporary variable, meanOfSquares. */ + meanOfSquares = (q31_t) (sumOfSquares / (q63_t)(blockSize - 1U)); + + /* Compute square of mean */ + squareOfMean = (q31_t) ((q63_t) sum * sum / (q63_t)(blockSize * (blockSize - 1U))); + + /* mean of squares minus the square of mean. */ + *pResult = (meanOfSquares - squareOfMean) >> 15U; +} + +/** + @} end of variance group + */ diff --git a/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q31.c b/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q31.c new file mode 100644 index 0000000..558332f --- /dev/null +++ b/CMSIS/DSP/Source/StatisticsFunctions/arm_var_q31.c @@ -0,0 +1,147 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_var_q31.c + * Description: Variance of an array of Q31 type + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupStats + */ + +/** + @addtogroup variance + @{ + */ + +/** + @brief Variance of the elements of a Q31 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult variance value returned here + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. + The input is represented in 1.31 format, which is then downshifted by 8 bits + which yields 1.23, and intermediate multiplication yields a 2.46 format. + The accumulator maintains full precision of the intermediate multiplication results, + but provides only a 16 guard bits. + There is no saturation on intermediate additions. + If the accumulator overflows it wraps around and distorts the result. + In order to avoid overflows completely the input signal must be scaled down by + log2(blockSize)-8 bits, as a total of blockSize additions are performed internally. + After division, internal variables should be Q18.46 + Finally, the 18.46 accumulator is right shifted by 15 bits to yield a 1.31 format value. + */ + +void arm_var_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t blkCnt; /* Loop counter */ + q63_t sum = 0; /* Temporary result storage */ + q63_t meanOfSquares, squareOfMean; /* Square of mean and mean of square */ + q63_t sumOfSquares = 0; /* Sum of squares */ + q31_t in; /* Temporary variable to store input value */ + + if (blockSize <= 1U) + { + *pResult = 0; + return; + } + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + in = *pSrc++ >> 8U; + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ + sumOfSquares += ((q63_t) (in) * (in)); + /* Compute sum and store result in a temporary variable, sum. */ + sum += in; + + in = *pSrc++ >> 8U; + sumOfSquares += ((q63_t) (in) * (in)); + sum += in; + + in = *pSrc++ >> 8U; + sumOfSquares += ((q63_t) (in) * (in)); + sum += in; + + in = *pSrc++ >> 8U; + sumOfSquares += ((q63_t) (in) * (in)); + sum += in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1] */ + /* C = A[0] + A[1] + ... + A[blockSize-1] */ + + in = *pSrc++ >> 8U; + /* Compute sum of squares and store result in a temporary variable, sumOfSquares. */ + sumOfSquares += ((q63_t) (in) * (in)); + /* Compute sum and store result in a temporary variable, sum. */ + sum += in; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Compute Mean of squares and store result in a temporary variable, meanOfSquares. */ + meanOfSquares = (sumOfSquares / (q63_t)(blockSize - 1U)); + + /* Compute square of mean */ + squareOfMean = ( sum * sum / (q63_t)(blockSize * (blockSize - 1U))); + + /* Compute variance and store result in destination */ + *pResult = (meanOfSquares - squareOfMean) >> 15U; +} + +/** + @} end of variance group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/CMakeLists.txt b/CMSIS/DSP/Source/SupportFunctions/CMakeLists.txt new file mode 100644 index 0000000..33c4f87 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPSupport) + + +file(GLOB SRC "./*_*.c") + +add_library(CMSISDSPSupport STATIC ${SRC}) + +configdsp(CMSISDSPSupport ..) + +### Includes +target_include_directories(CMSISDSPSupport PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/SupportFunctions/SupportFunctions.c b/CMSIS/DSP/Source/SupportFunctions/SupportFunctions.c new file mode 100644 index 0000000..4deb19b --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/SupportFunctions.c @@ -0,0 +1,48 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: SupportFunctions.c + * Description: Combination of all support function source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_copy_f32.c" +#include "arm_copy_q15.c" +#include "arm_copy_q31.c" +#include "arm_copy_q7.c" +#include "arm_fill_f32.c" +#include "arm_fill_q15.c" +#include "arm_fill_q31.c" +#include "arm_fill_q7.c" +#include "arm_float_to_q15.c" +#include "arm_float_to_q31.c" +#include "arm_float_to_q7.c" +#include "arm_q15_to_float.c" +#include "arm_q15_to_q31.c" +#include "arm_q15_to_q7.c" +#include "arm_q31_to_float.c" +#include "arm_q31_to_q15.c" +#include "arm_q31_to_q7.c" +#include "arm_q7_to_float.c" +#include "arm_q7_to_q15.c" +#include "arm_q7_to_q31.c" diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_copy_f32.c b/CMSIS/DSP/Source/SupportFunctions/arm_copy_f32.c new file mode 100644 index 0000000..707adc4 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_copy_f32.c @@ -0,0 +1,152 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_copy_f32.c + * Description: Copies the elements of a floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @defgroup copy Vector Copy + + Copies sample by sample from source vector to destination vector. + +
+      pDst[n] = pSrc[n];   0 <= n < blockSize.
+  
+ + There are separate functions for floating point, Q31, Q15, and Q7 data types. + */ + +/** + @addtogroup copy + @{ + */ + +/** + @brief Copies the elements of a floating-point vector. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + */ + +#if defined(ARM_MATH_NEON_EXPERIMENTAL) +void arm_copy_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* loop counter */ + + float32x4_t inV; + + blkCnt = blockSize >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C = A */ + /* Copy and then store the results in the destination buffer */ + inV = vld1q_f32(pSrc); + vst1q_f32(pDst, inV); + pSrc += 4; + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize & 3; + + while (blkCnt > 0U) + { + /* C = A */ + /* Copy and then store the results in the destination buffer */ + *pDst++ = *pSrc++; + + /* Decrement the loop counter */ + blkCnt--; + } +} +#else +void arm_copy_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A */ + + /* Copy and store result in destination buffer */ + *pDst++ = *pSrc++; + *pDst++ = *pSrc++; + *pDst++ = *pSrc++; + *pDst++ = *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A */ + + /* Copy and store result in destination buffer */ + *pDst++ = *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } +} +#endif /* #if defined(ARM_MATH_NEON) */ +/** + @} end of BasicCopy group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_copy_q15.c b/CMSIS/DSP/Source/SupportFunctions/arm_copy_q15.c new file mode 100644 index 0000000..d8da113 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_copy_q15.c @@ -0,0 +1,96 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_copy_q15.c + * Description: Copies the elements of a Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup copy + @{ + */ + +/** + @brief Copies the elements of a Q15 vector. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + */ + +void arm_copy_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A */ + + /* read 2 times 2 samples at a time */ + write_q15x2_ia (&pDst, read_q15x2_ia ((q15_t **) &pSrc)); + write_q15x2_ia (&pDst, read_q15x2_ia ((q15_t **) &pSrc)); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A */ + + /* Copy and store result in destination buffer */ + *pDst++ = *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } +} + +/** + @} end of BasicCopy group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_copy_q31.c b/CMSIS/DSP/Source/SupportFunctions/arm_copy_q31.c new file mode 100644 index 0000000..e342a32 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_copy_q31.c @@ -0,0 +1,98 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_copy_q31.c + * Description: Copies the elements of a Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup copy + @{ + */ + +/** + @brief Copies the elements of a Q31 vector. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + */ + +void arm_copy_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A */ + + /* Copy and store result in destination buffer */ + *pDst++ = *pSrc++; + *pDst++ = *pSrc++; + *pDst++ = *pSrc++; + *pDst++ = *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A */ + + /* Copy and store result in destination buffer */ + *pDst++ = *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } +} + +/** + @} end of BasicCopy group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_copy_q7.c b/CMSIS/DSP/Source/SupportFunctions/arm_copy_q7.c new file mode 100644 index 0000000..77da8ca --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_copy_q7.c @@ -0,0 +1,95 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_copy_q7.c + * Description: Copies the elements of a Q7 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup copy + @{ + */ + +/** + @brief Copies the elements of a Q7 vector. + @param[in] pSrc points to input vector + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + */ + +void arm_copy_q7( + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A */ + + /* read 4 samples at a time */ + write_q7x4_ia (&pDst, read_q7x4_ia ((q7_t **) &pSrc)); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A */ + + /* Copy and store result in destination buffer */ + *pDst++ = *pSrc++; + + /* Decrement loop counter */ + blkCnt--; + } +} + +/** + @} end of BasicCopy group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_fill_f32.c b/CMSIS/DSP/Source/SupportFunctions/arm_fill_f32.c new file mode 100644 index 0000000..29f6286 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_fill_f32.c @@ -0,0 +1,151 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fill_f32.c + * Description: Fills a constant value into a floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @defgroup Fill Vector Fill + + Fills the destination vector with a constant value. + +
+      pDst[n] = value;   0 <= n < blockSize.
+  
+ + There are separate functions for floating point, Q31, Q15, and Q7 data types. + */ + +/** + @addtogroup Fill + @{ + */ + +/** + @brief Fills a constant value into a floating-point vector. + @param[in] value input value to be filled + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + */ + +#if defined(ARM_MATH_NEON_EXPERIMENTAL) +void arm_fill_f32( + float32_t value, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* loop counter */ + + + float32x4_t inV = vdupq_n_f32(value); + + blkCnt = blockSize >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C = value */ + /* Fill the value in the destination buffer */ + vst1q_f32(pDst, inV); + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize & 3; + + while (blkCnt > 0U) + { + /* C = value */ + /* Fill the value in the destination buffer */ + *pDst++ = value; + + /* Decrement the loop counter */ + blkCnt--; + } +} +#else +void arm_fill_f32( + float32_t value, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = value */ + + /* Fill value in destination buffer */ + *pDst++ = value; + *pDst++ = value; + *pDst++ = value; + *pDst++ = value; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = value */ + + /* Fill value in destination buffer */ + *pDst++ = value; + + /* Decrement loop counter */ + blkCnt--; + } +} +#endif /* #if defined(ARM_MATH_NEON) */ +/** + @} end of Fill group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_fill_q15.c b/CMSIS/DSP/Source/SupportFunctions/arm_fill_q15.c new file mode 100644 index 0000000..d8c0f8d --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_fill_q15.c @@ -0,0 +1,100 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fill_q15.c + * Description: Fills a constant value into a Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup Fill + @{ + */ + +/** + @brief Fills a constant value into a Q15 vector. + @param[in] value input value to be filled + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + */ + +void arm_fill_q15( + q15_t value, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t packedValue; /* value packed to 32 bits */ + + /* Packing two 16 bit values to 32 bit value in order to use SIMD */ + packedValue = __PKHBT(value, value, 16U); + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = value */ + + /* fill 2 times 2 samples at a time */ + write_q15x2_ia (&pDst, packedValue); + write_q15x2_ia (&pDst, packedValue); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = value */ + + /* Fill value in destination buffer */ + *pDst++ = value; + + /* Decrement loop counter */ + blkCnt--; + } +} + +/** + @} end of Fill group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_fill_q31.c b/CMSIS/DSP/Source/SupportFunctions/arm_fill_q31.c new file mode 100644 index 0000000..e174889 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_fill_q31.c @@ -0,0 +1,98 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fill_q31.c + * Description: Fills a constant value into a Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup Fill + @{ + */ + +/** + @brief Fills a constant value into a Q31 vector. + @param[in] value input value to be filled + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + */ + +void arm_fill_q31( + q31_t value, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = value */ + + /* Fill value in destination buffer */ + *pDst++ = value; + *pDst++ = value; + *pDst++ = value; + *pDst++ = value; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = value */ + + /* Fill value in destination buffer */ + *pDst++ = value; + + /* Decrement loop counter */ + blkCnt--; + } +} + +/** + @} end of Fill group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_fill_q7.c b/CMSIS/DSP/Source/SupportFunctions/arm_fill_q7.c new file mode 100644 index 0000000..bca3267 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_fill_q7.c @@ -0,0 +1,99 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_fill_q7.c + * Description: Fills a constant value into a Q7 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup Fill + @{ + */ + +/** + @brief Fills a constant value into a Q7 vector. + @param[in] value input value to be filled + @param[out] pDst points to output vector + @param[in] blockSize number of samples in each vector + @return none + */ + +void arm_fill_q7( + q7_t value, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t packedValue; /* value packed to 32 bits */ + + /* Packing four 8 bit values to 32 bit value in order to use SIMD */ + packedValue = __PACKq7(value, value, value, value); + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = value */ + + /* fill 4 samples at a time */ + write_q7x4_ia (&pDst, packedValue); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = value */ + + /* Fill value in destination buffer */ + *pDst++ = value; + + /* Decrement loop counter */ + blkCnt--; + } +} + +/** + @} end of Fill group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q15.c b/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q15.c new file mode 100644 index 0000000..68c1ad0 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q15.c @@ -0,0 +1,244 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_float_to_q15.c + * Description: Converts the elements of the floating-point vector to Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup float_to_x + @{ + */ + +/** + @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 number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (q15_t)(pSrc[n] * 32768);   0 <= n < blockSize.
+  
+ + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. + + @note + In order to apply rounding, the library should be rebuilt with the ROUNDING macro + defined in the preprocessor section of project options. + */ +#if defined(ARM_MATH_NEON_EXPERIMENTAL) +void arm_float_to_q15( + const float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + const float32_t *pIn = pSrc; /* Src pointer */ + uint32_t blkCnt; /* loop counter */ + + float32_t in; + float32x4_t inV; + #ifdef ARM_MATH_ROUNDING + float32x4_t zeroV = vdupq_n_f32(0.0f); + float32x4_t pHalf = vdupq_n_f32(0.5f / 32768.0f); + float32x4_t mHalf = vdupq_n_f32(-0.5f / 32768.0f); + float32x4_t r; + uint32x4_t cmp; + #endif + + int32x4_t cvt; + int16x4_t outV; + + blkCnt = blockSize >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + +#ifdef ARM_MATH_ROUNDING + /* C = A * 32768 */ + /* Convert from float to q15 and then store the results in the destination buffer */ + inV = vld1q_f32(pIn); + cmp = vcgtq_f32(inV,zeroV); + r = vbslq_f32(cmp,pHalf,mHalf); + inV = vaddq_f32(inV, r); + + pIn += 4; + + cvt = vcvtq_n_s32_f32(inV,15); + outV = vqmovn_s32(cvt); + + vst1_s16(pDst, outV); + pDst += 4; + +#else + + /* C = A * 32768 */ + /* Convert from float to q15 and then store the results in the destination buffer */ + inV = vld1q_f32(pIn); + + cvt = vcvtq_n_s32_f32(inV,15); + outV = vqmovn_s32(cvt); + + vst1_s16(pDst, outV); + pDst += 4; + pIn += 4; + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize & 3; + + while (blkCnt > 0U) + { + +#ifdef ARM_MATH_ROUNDING + /* C = A * 32768 */ + /* Convert from float to q15 and then store the results in the destination buffer */ + in = *pIn++; + in = (in * 32768.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); + +#else + + /* C = A * 32768 */ + /* Convert from float to q15 and then store the results in the destination buffer */ + *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement the loop counter */ + blkCnt--; + } +} +#else +void arm_float_to_q15( + const float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const float32_t *pIn = pSrc; /* Source pointer */ + +#ifdef ARM_MATH_ROUNDING + float32_t in; +#endif /* #ifdef ARM_MATH_ROUNDING */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * 32768 */ + + /* convert from float to Q15 and store result in destination buffer */ +#ifdef ARM_MATH_ROUNDING + + in = (*pIn++ * 32768.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); + + in = (*pIn++ * 32768.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); + + in = (*pIn++ * 32768.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); + + in = (*pIn++ * 32768.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); + +#else + + *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); + *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); + *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); + *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A * 32768 */ + + /* convert from float to Q15 and store result in destination buffer */ +#ifdef ARM_MATH_ROUNDING + + in = (*pIn++ * 32768.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); + +#else + + /* C = A * 32768 */ + /* Convert from float to q15 and then store the results in the destination buffer */ + *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement loop counter */ + blkCnt--; + } + +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of float_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q31.c b/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q31.c new file mode 100644 index 0000000..479f8c5 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q31.c @@ -0,0 +1,252 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_float_to_q31.c + * Description: Converts the elements of the floating-point vector to Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + * @defgroup float_to_x Convert 32-bit floating point value + */ + +/** + @addtogroup float_to_x + @{ + */ + +/** + @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 number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (q31_t)(pSrc[n] * 2147483648);   0 <= n < blockSize.
+  
+ + @par Scaling and Overflow Behavior + The function uses saturating arithmetic. + Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] are saturated. + + @note + In order to apply rounding, the library should be rebuilt with the ROUNDING macro + defined in the preprocessor section of project options. + */ + +#if defined(ARM_MATH_NEON) +void arm_float_to_q31( + const float32_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + const float32_t *pIn = pSrc; /* Src pointer */ + uint32_t blkCnt; /* loop counter */ + + float32_t in; + float32x4_t inV; + #ifdef ARM_MATH_ROUNDING + float32x4_t zeroV = vdupq_n_f32(0.0f); + float32x4_t pHalf = vdupq_n_f32(0.5f / 2147483648.0f); + float32x4_t mHalf = vdupq_n_f32(-0.5f / 2147483648.0f); + float32x4_t r; + uint32x4_t cmp; + #endif + + int32x4_t outV; + + blkCnt = blockSize >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + +#ifdef ARM_MATH_ROUNDING + + /* C = A * 32768 */ + /* Convert from float to Q31 and then store the results in the destination buffer */ + inV = vld1q_f32(pIn); + cmp = vcgtq_f32(inV,zeroV); + r = vbslq_f32(cmp,pHalf,mHalf); + inV = vaddq_f32(inV, r); + + pIn += 4; + + outV = vcvtq_n_s32_f32(inV,31); + + vst1q_s32(pDst, outV); + pDst += 4; + +#else + + /* C = A * 2147483648 */ + /* Convert from float to Q31 and then store the results in the destination buffer */ + inV = vld1q_f32(pIn); + + outV = vcvtq_n_s32_f32(inV,31); + + vst1q_s32(pDst, outV); + pDst += 4; + pIn += 4; + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize & 3; + + while (blkCnt > 0U) + { + +#ifdef ARM_MATH_ROUNDING + + /* C = A * 2147483648 */ + /* Convert from float to Q31 and then store the results in the destination buffer */ + in = *pIn++; + in = (in * 2147483648.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = clip_q63_to_q31((q63_t) (in)); + +#else + + /* C = A * 2147483648 */ + /* Convert from float to Q31 and then store the results in the destination buffer */ + *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement the loop counter */ + blkCnt--; + } + + +} +#else +void arm_float_to_q31( + const float32_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const float32_t *pIn = pSrc; /* Source pointer */ + +#ifdef ARM_MATH_ROUNDING + float32_t in; +#endif /* #ifdef ARM_MATH_ROUNDING */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * 2147483648 */ + + /* convert from float to Q31 and store result in destination buffer */ +#ifdef ARM_MATH_ROUNDING + + in = (*pIn++ * 2147483648.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = clip_q63_to_q31((q63_t) (in)); + + in = (*pIn++ * 2147483648.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = clip_q63_to_q31((q63_t) (in)); + + in = (*pIn++ * 2147483648.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = clip_q63_to_q31((q63_t) (in)); + + in = (*pIn++ * 2147483648.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = clip_q63_to_q31((q63_t) (in)); + +#else + + /* C = A * 2147483648 */ + /* Convert from float to Q31 and then store the results in the destination buffer */ + *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); + *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); + *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); + *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A * 2147483648 */ + + /* convert from float to Q31 and store result in destination buffer */ +#ifdef ARM_MATH_ROUNDING + + in = (*pIn++ * 2147483648.0f); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = clip_q63_to_q31((q63_t) (in)); + +#else + + /* C = A * 2147483648 */ + /* Convert from float to Q31 and then store the results in the destination buffer */ + *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement loop counter */ + blkCnt--; + } + +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of float_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q7.c b/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q7.c new file mode 100644 index 0000000..5f2a7eb --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_float_to_q7.c @@ -0,0 +1,253 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_float_to_q7.c + * Description: Converts the elements of the floating-point vector to Q7 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup float_to_x + @{ + */ + +/** + * @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 + * @return none. + * + *\par Description: + * \par + * The equation used for the conversion process is: + *
+ * 	pDst[n] = (q7_t)(pSrc[n] * 128);   0 <= n < blockSize.
+ * 
+ * \par Scaling and Overflow Behavior: + * \par + * The function uses saturating arithmetic. + * Results outside of the allowable Q7 range [0x80 0x7F] will be saturated. + * \note + * In order to apply rounding, the library should be rebuilt with the ROUNDING macro + * defined in the preprocessor section of project options. + */ + +#if defined(ARM_MATH_NEON) +void arm_float_to_q7( + const float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + const float32_t *pIn = pSrc; /* Src pointer */ + uint32_t blkCnt; /* loop counter */ + + float32_t in; + float32x4_t inV; + #ifdef ARM_MATH_ROUNDING + float32x4_t zeroV = vdupq_n_f32(0.0f); + float32x4_t pHalf = vdupq_n_f32(0.5f / 128.0f); + float32x4_t mHalf = vdupq_n_f32(-0.5f / 128.0f); + float32x4_t r; + uint32x4_t cmp; + #endif + + int32x4_t cvt; + int16x4_t cvt1,cvt2; + int8x8_t outV; + + blkCnt = blockSize >> 3U; + + /* Compute 8 outputs at a time. + ** a second loop below computes the remaining 1 to 7 samples. */ + while (blkCnt > 0U) + { + +#ifdef ARM_MATH_ROUNDING + /* C = A * 128 */ + /* Convert from float to q7 and then store the results in the destination buffer */ + inV = vld1q_f32(pIn); + cmp = vcgtq_f32(inV,zeroV); + r = vbslq_f32(cmp,pHalf,mHalf); + inV = vaddq_f32(inV, r); + cvt1 = vqmovn_s32(vcvtq_n_s32_f32(inV,7)); + pIn += 4; + + inV = vld1q_f32(pIn); + cmp = vcgtq_f32(inV,zeroV); + r = vbslq_f32(cmp,pHalf,mHalf); + inV = vaddq_f32(inV, r); + cvt2 = vqmovn_s32(vcvtq_n_s32_f32(inV,7)); + pIn += 4; + + outV = vqmovn_s16(vcombine_s16(cvt1,cvt2)); + vst1_s8(pDst, outV); + pDst += 8; + +#else + + /* C = A * 128 */ + /* Convert from float to q7 and then store the results in the destination buffer */ + inV = vld1q_f32(pIn); + cvt1 = vqmovn_s32(vcvtq_n_s32_f32(inV,7)); + pIn += 4; + + inV = vld1q_f32(pIn); + cvt2 = vqmovn_s32(vcvtq_n_s32_f32(inV,7)); + pIn += 4; + + outV = vqmovn_s16(vcombine_s16(cvt1,cvt2)); + + vst1_s8(pDst, outV); + pDst += 8; +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize & 7; + + while (blkCnt > 0U) + { + +#ifdef ARM_MATH_ROUNDING + /* C = A * 128 */ + /* Convert from float to q7 and then store the results in the destination buffer */ + in = *pIn++; + in = (in * 128); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); + +#else + + /* C = A * 128 */ + /* Convert from float to q7 and then store the results in the destination buffer */ + *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement the loop counter */ + blkCnt--; + } + +} +#else +void arm_float_to_q7( + const float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const float32_t *pIn = pSrc; /* Source pointer */ + +#ifdef ARM_MATH_ROUNDING + float32_t in; +#endif /* #ifdef ARM_MATH_ROUNDING */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = A * 128 */ + + /* Convert from float to q7 and store result in destination buffer */ +#ifdef ARM_MATH_ROUNDING + + in = (*pIn++ * 128); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); + + in = (*pIn++ * 128); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); + + in = (*pIn++ * 128); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); + + in = (*pIn++ * 128); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); + +#else + + *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); + *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); + *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); + *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = A * 128 */ + + /* Convert from float to q7 and store result in destination buffer */ +#ifdef ARM_MATH_ROUNDING + + in = (*pIn++ * 128); + in += in > 0.0f ? 0.5f : -0.5f; + *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); + +#else + + *pDst++ = (q7_t) __SSAT((q31_t) (*pIn++ * 128.0f), 8); + +#endif /* #ifdef ARM_MATH_ROUNDING */ + + /* Decrement loop counter */ + blkCnt--; + } + +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of float_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_float.c b/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_float.c new file mode 100644 index 0000000..f49d9b7 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_float.c @@ -0,0 +1,166 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_q15_to_float.c + * Description: Converts the elements of the Q15 vector to floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + * @defgroup q15_to_x Convert 16-bit Integer value + */ + +/** + @addtogroup q15_to_x + @{ + */ + +/** + @brief Converts the elements of the Q15 vector to floating-point vector. + @param[in] pSrc points to the Q15 input vector + @param[out] pDst points to the floating-point output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (float32_t) pSrc[n] / 32768;   0 <= n < blockSize.
+  
+ */ + +#if defined(ARM_MATH_NEON_EXPERIMENTAL) +void arm_q15_to_float( + const q15_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + const q15_t *pIn = pSrc; /* Src pointer */ + uint32_t blkCnt; /* loop counter */ + + int16x8_t inV; + int32x4_t inV0, inV1; + float32x4_t outV; + + blkCnt = blockSize >> 3U; + + /* Compute 8 outputs at a time. + ** a second loop below computes the remaining 1 to 7 samples. */ + while (blkCnt > 0U) + { + /* C = (float32_t) A / 32768 */ + /* convert from q15 to float and then store the results in the destination buffer */ + inV = vld1q_s16(pIn); + pIn += 8; + + inV0 = vmovl_s16(vget_low_s16(inV)); + inV1 = vmovl_s16(vget_high_s16(inV)); + + outV = vcvtq_n_f32_s32(inV0,15); + vst1q_f32(pDst, outV); + pDst += 4; + + outV = vcvtq_n_f32_s32(inV1,15); + vst1q_f32(pDst, outV); + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize is not a multiple of 8, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize & 7; + + + while (blkCnt > 0U) + { + /* C = (float32_t) A / 32768 */ + /* convert from q15 to float and then store the results in the destination buffer */ + *pDst++ = ((float32_t) * pIn++ / 32768.0f); + + /* Decrement the loop counter */ + blkCnt--; + } +} +#else +void arm_q15_to_float( + const q15_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const q15_t *pIn = pSrc; /* Source pointer */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (float32_t) A / 32768 */ + + /* Convert from q15 to float and store result in destination buffer */ + *pDst++ = ((float32_t) * pIn++ / 32768.0f); + *pDst++ = ((float32_t) * pIn++ / 32768.0f); + *pDst++ = ((float32_t) * pIn++ / 32768.0f); + *pDst++ = ((float32_t) * pIn++ / 32768.0f); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (float32_t) A / 32768 */ + + /* Convert from q15 to float and store result in destination buffer */ + *pDst++ = ((float32_t) *pIn++ / 32768.0f); + + /* Decrement loop counter */ + blkCnt--; + } + +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of q15_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q31.c b/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q31.c new file mode 100644 index 0000000..1afd489 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q31.c @@ -0,0 +1,138 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_q15_to_q31.c + * Description: Converts the elements of the Q15 vector to Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup q15_to_x + @{ + */ + +/** + @brief Converts the elements of the Q15 vector to Q31 vector. + @param[in] pSrc points to the Q15 input vector + @param[out] pDst points to the Q31 output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (q31_t) pSrc[n] << 16;   0 <= n < blockSize.
+  
+ */ + +void arm_q15_to_q31( + const q15_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const q15_t *pIn = pSrc; /* Source pointer */ + +#if defined (ARM_MATH_LOOPUNROLL) + q31_t in1, in2; + q31_t out1, out2, out3, out4; +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (q31_t)A << 16 */ + + /* Convert from q15 to q31 and store result in destination buffer */ + in1 = read_q15x2_ia ((q15_t **) &pIn); + in2 = read_q15x2_ia ((q15_t **) &pIn); + +#ifndef ARM_MATH_BIG_ENDIAN + + /* extract lower 16 bits to 32 bit result */ + out1 = in1 << 16U; + /* extract upper 16 bits to 32 bit result */ + out2 = in1 & 0xFFFF0000; + /* extract lower 16 bits to 32 bit result */ + out3 = in2 << 16U; + /* extract upper 16 bits to 32 bit result */ + out4 = in2 & 0xFFFF0000; + +#else + + /* extract upper 16 bits to 32 bit result */ + out1 = in1 & 0xFFFF0000; + /* extract lower 16 bits to 32 bit result */ + out2 = in1 << 16U; + /* extract upper 16 bits to 32 bit result */ + out3 = in2 & 0xFFFF0000; + /* extract lower 16 bits to 32 bit result */ + out4 = in2 << 16U; + +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + *pDst++ = out1; + *pDst++ = out2; + *pDst++ = out3; + *pDst++ = out4; + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (q31_t) A << 16 */ + + /* Convert from q15 to q31 and store result in destination buffer */ + *pDst++ = (q31_t) *pIn++ << 16; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of q15_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q7.c b/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q7.c new file mode 100644 index 0000000..d118b76 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_q15_to_q7.c @@ -0,0 +1,146 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_q15_to_q7.c + * Description: Converts the elements of the Q15 vector to Q7 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup q15_to_x + @{ + */ + +/** + @brief Converts the elements of the Q15 vector to Q7 vector. + @param[in] pSrc points to the Q15 input vector + @param[out] pDst points to the Q7 output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (q7_t) pSrc[n] >> 8;   0 <= n < blockSize.
+  
+ */ + +void arm_q15_to_q7( + const q15_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const q15_t *pIn = pSrc; /* Source pointer */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t in1, in2; + q31_t out1, out2; +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (q7_t) A >> 8 */ + + /* Convert from q15 to q7 and store result in destination buffer */ +#if defined (ARM_MATH_DSP) + + in1 = read_q15x2_ia ((q15_t **) &pIn); + in2 = read_q15x2_ia ((q15_t **) &pIn); + +#ifndef ARM_MATH_BIG_ENDIAN + + out1 = __PKHTB(in2, in1, 16); + out2 = __PKHBT(in2, in1, 16); + +#else + + out1 = __PKHTB(in1, in2, 16); + out2 = __PKHBT(in1, in2, 16); + +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* rotate packed value by 24 */ + out2 = ((uint32_t) out2 << 8) | ((uint32_t) out2 >> 24); + + /* anding with 0xff00ff00 to get two 8 bit values */ + out1 = out1 & 0xFF00FF00; + /* anding with 0x00ff00ff to get two 8 bit values */ + out2 = out2 & 0x00FF00FF; + + /* oring two values(contains two 8 bit values) to get four packed 8 bit values */ + out1 = out1 | out2; + + /* store 4 samples at a time to destiantion buffer */ + write_q7x4_ia (&pDst, out1); + +#else + + *pDst++ = (q7_t) (*pIn++ >> 8); + *pDst++ = (q7_t) (*pIn++ >> 8); + *pDst++ = (q7_t) (*pIn++ >> 8); + *pDst++ = (q7_t) (*pIn++ >> 8); + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (q7_t) A >> 8 */ + + /* Convert from q15 to q7 and store result in destination buffer */ + *pDst++ = (q7_t) (*pIn++ >> 8); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of q15_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_float.c b/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_float.c new file mode 100644 index 0000000..03e7ec6 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_float.c @@ -0,0 +1,159 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_q31_to_float.c + * Description: Converts the elements of the Q31 vector to floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + * @defgroup q31_to_x Convert 32-bit Integer value + */ + +/** + @addtogroup q31_to_x + @{ + */ + +/** + @brief Converts the elements of the Q31 vector to floating-point vector. + @param[in] pSrc points to the Q31 input vector + @param[out] pDst points to the floating-point output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (float32_t) pSrc[n] / 2147483648;   0 <= n < blockSize.
+  
+ */ + +#if defined(ARM_MATH_NEON_EXPERIMENTAL) +void arm_q31_to_float( + const q31_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + const q31_t *pIn = pSrc; /* Src pointer */ + uint32_t blkCnt; /* loop counter */ + + int32x4_t inV; + float32x4_t outV; + + blkCnt = blockSize >> 2U; + + /* Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + while (blkCnt > 0U) + { + /* C = (float32_t) A / 2147483648 */ + /* Convert from q31 to float and then store the results in the destination buffer */ + inV = vld1q_s32(pIn); + pIn += 4; + + outV = vcvtq_n_f32_s32(inV,31); + + vst1q_f32(pDst, outV); + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize & 3; + + + while (blkCnt > 0U) + { + /* C = (float32_t) A / 2147483648 */ + /* Convert from q31 to float and then store the results in the destination buffer */ + *pDst++ = ((float32_t) * pIn++ / 2147483648.0f); + + /* Decrement the loop counter */ + blkCnt--; + } +} +#else +void arm_q31_to_float( + const q31_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + const q31_t *pIn = pSrc; /* Src pointer */ + uint32_t blkCnt; /* loop counter */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (float32_t) A / 2147483648 */ + + /* Convert from q31 to float and store result in destination buffer */ + *pDst++ = ((float32_t) *pIn++ / 2147483648.0f); + *pDst++ = ((float32_t) *pIn++ / 2147483648.0f); + *pDst++ = ((float32_t) *pIn++ / 2147483648.0f); + *pDst++ = ((float32_t) *pIn++ / 2147483648.0f); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (float32_t) A / 2147483648 */ + + /* Convert from q31 to float and store result in destination buffer */ + *pDst++ = ((float32_t) *pIn++ / 2147483648.0f); + + /* Decrement loop counter */ + blkCnt--; + } + +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of q31_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q15.c b/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q15.c new file mode 100644 index 0000000..8d82c28 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q15.c @@ -0,0 +1,134 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_q31_to_q15.c + * Description: Converts the elements of the Q31 vector to Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup q31_to_x + @{ + */ + +/** + @brief Converts the elements of the Q31 vector to Q15 vector. + @param[in] pSrc points to the Q31 input vector + @param[out] pDst points to the Q15 output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (q15_t) pSrc[n] >> 16;   0 <= n < blockSize.
+  
+ */ + +void arm_q31_to_q15( + const q31_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const q31_t *pIn = pSrc; /* Source pointer */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t in1, in2, in3, in4; + q31_t out1, out2; +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (q15_t) (A >> 16) */ + + /* Convert from q31 to q15 and store result in destination buffer */ +#if defined (ARM_MATH_DSP) + + in1 = *pIn++; + in2 = *pIn++; + in3 = *pIn++; + in4 = *pIn++; + + /* pack two higher 16-bit values from two 32-bit values */ +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __PKHTB(in2, in1, 16); + out2 = __PKHTB(in4, in3, 16); +#else + out1 = __PKHTB(in1, in2, 16); + out2 = __PKHTB(in3, in4, 16); +#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ + + write_q15x2_ia (&pDst, out1); + write_q15x2_ia (&pDst, out2); + +#else + + *pDst++ = (q15_t) (*pIn++ >> 16); + *pDst++ = (q15_t) (*pIn++ >> 16); + *pDst++ = (q15_t) (*pIn++ >> 16); + *pDst++ = (q15_t) (*pIn++ >> 16); + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (q15_t) (A >> 16) */ + + /* Convert from q31 to q15 and store result in destination buffer */ + *pDst++ = (q15_t) (*pIn++ >> 16); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of q31_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q7.c b/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q7.c new file mode 100644 index 0000000..c7d1b4c --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_q31_to_q7.c @@ -0,0 +1,110 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_q31_to_q7.c + * Description: Converts the elements of the Q31 vector to Q7 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup q31_to_x + @{ + */ + +/** + @brief Converts the elements of the Q31 vector to Q7 vector. + @param[in] pSrc points to the Q31 input vector + @param[out] pDst points to the Q7 output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (q7_t) pSrc[n] >> 24;   0 <= n < blockSize.
+  
+ */ + +void arm_q31_to_q7( + const q31_t * pSrc, + q7_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const q31_t *pIn = pSrc; /* Source pointer */ + +#if defined (ARM_MATH_LOOPUNROLL) + + q7_t out1, out2, out3, out4; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (q7_t) (A >> 24) */ + + /* Convert from q31 to q7 and store result in destination buffer */ + + out1 = (q7_t) (*pIn++ >> 24); + out2 = (q7_t) (*pIn++ >> 24); + out3 = (q7_t) (*pIn++ >> 24); + out4 = (q7_t) (*pIn++ >> 24); + write_q7x4_ia (&pDst, __PACKq7(out1, out2, out3, out4)); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (q7_t) (A >> 24) */ + + /* Convert from q31 to q7 and store result in destination buffer */ + *pDst++ = (q7_t) (*pIn++ >> 24); + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of q31_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_float.c b/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_float.c new file mode 100644 index 0000000..6bd86bf --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_float.c @@ -0,0 +1,179 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_q7_to_float.c + * Description: Converts the elements of the Q7 vector to floating-point vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + * @defgroup q7_to_x Convert 8-bit Integer value + */ + +/** + @addtogroup q7_to_x + @{ + */ + +/** + @brief Converts the elements of the Q7 vector to floating-point vector. + @param[in] pSrc points to the Q7 input vector + @param[out] pDst points to the floating-point output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (float32_t) pSrc[n] / 128;   0 <= n < blockSize.
+  
+ */ + +#if defined(ARM_MATH_NEON) +void arm_q7_to_float( + const q7_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + const q7_t *pIn = pSrc; /* Src pointer */ + uint32_t blkCnt; /* loop counter */ + + int8x16_t inV; + int16x8_t inVLO, inVHI; + int32x4_t inVLL, inVLH, inVHL, inVHH; + float32x4_t outV; + + blkCnt = blockSize >> 4U; + + /* Compute 16 outputs at a time. + ** a second loop below computes the remaining 1 to 15 samples. */ + while (blkCnt > 0U) + { + /* C = (float32_t) A / 128 */ + /* Convert from q7 to float and then store the results in the destination buffer */ + inV = vld1q_s8(pIn); + pIn += 16; + + inVLO = vmovl_s8(vget_low_s8(inV)); + inVHI = vmovl_s8(vget_high_s8(inV)); + + inVLL = vmovl_s16(vget_low_s16(inVLO)); + inVLH = vmovl_s16(vget_high_s16(inVLO)); + inVHL = vmovl_s16(vget_low_s16(inVHI)); + inVHH = vmovl_s16(vget_high_s16(inVHI)); + + outV = vcvtq_n_f32_s32(inVLL,7); + vst1q_f32(pDst, outV); + pDst += 4; + + outV = vcvtq_n_f32_s32(inVLH,7); + vst1q_f32(pDst, outV); + pDst += 4; + + outV = vcvtq_n_f32_s32(inVHL,7); + vst1q_f32(pDst, outV); + pDst += 4; + + outV = vcvtq_n_f32_s32(inVHH,7); + vst1q_f32(pDst, outV); + pDst += 4; + + /* Decrement the loop counter */ + blkCnt--; + } + + /* If the blockSize is not a multiple of 16, compute any remaining output samples here. + ** No loop unrolling is used. */ + blkCnt = blockSize & 0xF; + + while (blkCnt > 0U) + { + /* C = (float32_t) A / 128 */ + /* Convert from q7 to float and then store the results in the destination buffer */ + *pDst++ = ((float32_t) * pIn++ / 128.0f); + + /* Decrement the loop counter */ + blkCnt--; + } +} +#else +void arm_q7_to_float( + const q7_t * pSrc, + float32_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const q7_t *pIn = pSrc; /* Source pointer */ + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (float32_t) A / 128 */ + + /* Convert from q7 to float and store result in destination buffer */ + *pDst++ = ((float32_t) * pIn++ / 128.0f); + *pDst++ = ((float32_t) * pIn++ / 128.0f); + *pDst++ = ((float32_t) * pIn++ / 128.0f); + *pDst++ = ((float32_t) * pIn++ / 128.0f); + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (float32_t) A / 128 */ + + /* Convert from q7 to float and store result in destination buffer */ + *pDst++ = ((float32_t) * pIn++ / 128.0f); + + /* Decrement loop counter */ + blkCnt--; + } + +} +#endif /* #if defined(ARM_MATH_NEON) */ + +/** + @} end of q7_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q15.c b/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q15.c new file mode 100644 index 0000000..89afd10 --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q15.c @@ -0,0 +1,143 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_q7_to_q15.c + * Description: Converts the elements of the Q7 vector to Q15 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup q7_to_x + @{ + */ + +/** + @brief Converts the elements of the Q7 vector to Q15 vector. + @param[in] pSrc points to the Q7 input vector + @param[out] pDst points to the Q15 output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (q15_t) pSrc[n] << 8;   0 <= n < blockSize.
+  
+ */ + +void arm_q7_to_q15( + const q7_t * pSrc, + q15_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const q7_t *pIn = pSrc; /* Source pointer */ + +#if defined (ARM_MATH_LOOPUNROLL) && defined (ARM_MATH_DSP) + q31_t in; + q31_t in1, in2; + q31_t out1, out2; +#endif + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (q15_t) A << 8 */ + + /* Convert from q7 to q15 and store result in destination buffer */ +#if defined (ARM_MATH_DSP) + + in = read_q7x4_ia ((q7_t **) &pIn); + + /* rotatate in by 8 and extend two q7_t values to q15_t values */ + in1 = __SXTB16(__ROR(in, 8)); + + /* extend remainig two q7_t values to q15_t values */ + in2 = __SXTB16(in); + + in1 = in1 << 8U; + in2 = in2 << 8U; + + in1 = in1 & 0xFF00FF00; + in2 = in2 & 0xFF00FF00; + +#ifndef ARM_MATH_BIG_ENDIAN + out2 = __PKHTB(in1, in2, 16); + out1 = __PKHBT(in2, in1, 16); +#else + out1 = __PKHTB(in1, in2, 16); + out2 = __PKHBT(in2, in1, 16); +#endif + + write_q15x2_ia (&pDst, out1); + write_q15x2_ia (&pDst, out2); + +#else + + *pDst++ = (q15_t) *pIn++ << 8; + *pDst++ = (q15_t) *pIn++ << 8; + *pDst++ = (q15_t) *pIn++ << 8; + *pDst++ = (q15_t) *pIn++ << 8; + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (q15_t) A << 8 */ + + /* Convert from q7 to q15 and store result in destination buffer */ + *pDst++ = (q15_t) * pIn++ << 8; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of q7_to_x group + */ diff --git a/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q31.c b/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q31.c new file mode 100644 index 0000000..641c02d --- /dev/null +++ b/CMSIS/DSP/Source/SupportFunctions/arm_q7_to_q31.c @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_q7_to_q31.c + * Description: Converts the elements of the Q7 vector to Q31 vector + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupSupport + */ + +/** + @addtogroup q7_to_x + @{ + */ + +/** + @brief Converts the elements of the Q7 vector to Q31 vector. + @param[in] pSrc points to the Q7 input vector + @param[out] pDst points to the Q31 output vector + @param[in] blockSize number of samples in each vector + @return none + + @par Details + The equation used for the conversion process is: +
+      pDst[n] = (q31_t) pSrc[n] << 24;   0 <= n < blockSize.
+  
+ */ + +void arm_q7_to_q31( + const q7_t * pSrc, + q31_t * pDst, + uint32_t blockSize) +{ + uint32_t blkCnt; /* Loop counter */ + const q7_t *pIn = pSrc; /* Source pointer */ + +#if defined (ARM_MATH_LOOPUNROLL) + + q31_t in; + + /* Loop unrolling: Compute 4 outputs at a time */ + blkCnt = blockSize >> 2U; + + while (blkCnt > 0U) + { + /* C = (q31_t) A << 24 */ + + /* Convert from q7 to q31 and store result in destination buffer */ + in = read_q7x4_ia ((q7_t **) &pIn); + +#ifndef ARM_MATH_BIG_ENDIAN + + *pDst++ = (__ROR(in, 8)) & 0xFF000000; + *pDst++ = (__ROR(in, 16)) & 0xFF000000; + *pDst++ = (__ROR(in, 24)) & 0xFF000000; + *pDst++ = (in & 0xFF000000); + +#else + + *pDst++ = (in & 0xFF000000); + *pDst++ = (__ROR(in, 24)) & 0xFF000000; + *pDst++ = (__ROR(in, 16)) & 0xFF000000; + *pDst++ = (__ROR(in, 8)) & 0xFF000000; + +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Decrement loop counter */ + blkCnt--; + } + + /* Loop unrolling: Compute remaining outputs */ + blkCnt = blockSize % 0x4U; + +#else + + /* Initialize blkCnt with number of samples */ + blkCnt = blockSize; + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + + while (blkCnt > 0U) + { + /* C = (q31_t) A << 24 */ + + /* Convert from q7 to q31 and store result in destination buffer */ + *pDst++ = (q31_t) * pIn++ << 24; + + /* Decrement loop counter */ + blkCnt--; + } + +} + +/** + @} end of q7_to_x group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/CMakeLists.txt b/CMSIS/DSP/Source/TransformFunctions/CMakeLists.txt new file mode 100644 index 0000000..4e5b4f2 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/CMakeLists.txt @@ -0,0 +1,116 @@ +cmake_minimum_required (VERSION 3.6) + +project(CMSISDSPTransform) + + + +add_library(CMSISDSPTransform STATIC) + +include(fft) +fft(CMSISDSPTransform) + +if (CONFIGTABLE AND ALLFFT) +target_compile_definitions(CMSISDSPTransform PUBLIC ARM_ALL_FFT_TABLES) +endif() + +target_sources(CMSISDSPTransform PRIVATE arm_bitreversal.c) +target_sources(CMSISDSPTransform PRIVATE arm_bitreversal2.c) + +if (NOT CONFIGTABLE OR ALLFFT OR CFFT_F32_16 OR CFFT_F32_32 OR CFFT_F32_64 OR CFFT_F32_128 OR CFFT_F32_256 OR CFFT_F32_512 + OR CFFT_F32_1024 OR CFFT_F32_2048 OR CFFT_F32_4096) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix2_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix8_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_f32.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT OR CFFT_Q15_16 OR CFFT_Q15_32 OR CFFT_Q15_64 OR CFFT_Q15_128 OR CFFT_Q15_256 OR CFFT_Q15_512 + OR CFFT_Q15_1024 OR CFFT_Q15_2048 OR CFFT_Q15_4096) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix2_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_q15.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT OR CFFT_Q31_16 OR CFFT_Q31_32 OR CFFT_Q31_64 OR CFFT_Q31_128 OR CFFT_Q31_256 OR CFFT_Q31_512 + OR CFFT_Q31_1024 OR CFFT_Q31_2048 OR CFFT_Q31_4096) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix2_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_q31.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix2_init_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix2_init_q31.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT OR DCT4_F32_128 OR DCT4_F32_512 OR DCT4_F32_2048 OR DCT4_F32_8192) +target_sources(CMSISDSPTransform PRIVATE arm_dct4_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_dct4_init_f32.c) + +target_sources(CMSISDSPTransform PRIVATE arm_rfft_init_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_init_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_f32.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT OR DCT4_Q31_128 OR DCT4_Q31_512 OR DCT4_Q31_2048 OR DCT4_Q31_8192) +target_sources(CMSISDSPTransform PRIVATE arm_dct4_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_dct4_init_q31.c) + +target_sources(CMSISDSPTransform PRIVATE arm_rfft_init_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_init_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_q31.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT OR ALLFFT OR DCT4_Q15_128 OR DCT4_Q15_512 OR DCT4_Q15_2048 OR DCT4_Q15_8192) +target_sources(CMSISDSPTransform PRIVATE arm_dct4_init_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_dct4_q15.c) + +target_sources(CMSISDSPTransform PRIVATE arm_rfft_init_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_init_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_q15.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT OR RFFT_FAST_F32_32 OR RFFT_FAST_F32_64 OR RFFT_FAST_F32_128 + OR RFFT_FAST_F32_256 OR RFFT_FAST_F32_512 OR RFFT_FAST_F32_1024 OR RFFT_FAST_F32_2048 + OR RFFT_FAST_F32_4096 ) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_fast_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_fast_init_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix8_f32.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT OR RFFT_F32_128 OR RFFT_F32_512 OR RFFT_F32_2048 OR RFFT_F32_8192) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_init_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_init_f32.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_f32.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT OR RFFT_Q15_32 OR RFFT_Q15_64 OR RFFT_Q15_128 OR RFFT_Q15_256 + OR RFFT_Q15_512 OR RFFT_Q15_1024 OR RFFT_Q15_2048 OR RFFT_Q15_4096 OR RFFT_Q15_8192) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_init_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_q15.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_q15.c) +endif() + +if (NOT CONFIGTABLE OR ALLFFT OR RFFT_Q31_32 OR RFFT_Q31_64 OR RFFT_Q31_128 OR RFFT_Q31_256 + OR RFFT_Q31_512 OR RFFT_Q31_1024 OR RFFT_Q31_2048 OR RFFT_Q31_4096 OR RFFT_Q31_8192) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_init_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_rfft_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_q31.c) +target_sources(CMSISDSPTransform PRIVATE arm_cfft_radix4_q31.c) +endif() + +configdsp(CMSISDSPTransform ..) + +### Includes +target_include_directories(CMSISDSPTransform PUBLIC "${DSP}/../../Include") + + + diff --git a/CMSIS/DSP/Source/TransformFunctions/TransformFunctions.c b/CMSIS/DSP/Source/TransformFunctions/TransformFunctions.c new file mode 100644 index 0000000..d0f7ce4 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/TransformFunctions.c @@ -0,0 +1,60 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: TransformFunctions.c + * Description: Combination of all transform function source files. + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_bitreversal.c" +#include "arm_bitreversal2.c" +#include "arm_cfft_f32.c" +#include "arm_cfft_q15.c" +#include "arm_cfft_q31.c" +#include "arm_cfft_radix2_f32.c" +#include "arm_cfft_radix2_init_f32.c" +#include "arm_cfft_radix2_init_q15.c" +#include "arm_cfft_radix2_init_q31.c" +#include "arm_cfft_radix2_q15.c" +#include "arm_cfft_radix2_q31.c" +#include "arm_cfft_radix4_f32.c" +#include "arm_cfft_radix4_init_f32.c" +#include "arm_cfft_radix4_init_q15.c" +#include "arm_cfft_radix4_init_q31.c" +#include "arm_cfft_radix4_q15.c" +#include "arm_cfft_radix4_q31.c" +#include "arm_cfft_radix8_f32.c" +#include "arm_dct4_f32.c" +#include "arm_dct4_init_f32.c" +#include "arm_dct4_init_q15.c" +#include "arm_dct4_init_q31.c" +#include "arm_dct4_q15.c" +#include "arm_dct4_q31.c" +#include "arm_rfft_f32.c" +#include "arm_rfft_fast_f32.c" +#include "arm_rfft_fast_init_f32.c" +#include "arm_rfft_init_f32.c" +#include "arm_rfft_init_q15.c" +#include "arm_rfft_init_q31.c" +#include "arm_rfft_q15.c" +#include "arm_rfft_q31.c" diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal.c b/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal.c new file mode 100644 index 0000000..c608129 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal.c @@ -0,0 +1,229 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_bitreversal.c + * Description: Bitreversal functions + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @brief In-place floating-point bit reversal function. + @param[in,out] pSrc points to in-place floating-point data buffer + @param[in] fftSize length of FFT + @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + @param[in] pBitRevTab points to bit reversal table + @return none + */ + +void arm_bitreversal_f32( + float32_t * pSrc, + uint16_t fftSize, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab) +{ + uint16_t fftLenBy2, fftLenBy2p1; + uint16_t i, j; + float32_t in; + + /* Initializations */ + j = 0U; + fftLenBy2 = fftSize >> 1U; + fftLenBy2p1 = (fftSize >> 1U) + 1U; + + /* Bit Reversal Implementation */ + for (i = 0U; i <= (fftLenBy2 - 2U); i += 2U) + { + if (i < j) + { + /* pSrc[i] <-> pSrc[j]; */ + in = pSrc[2U * i]; + pSrc[2U * i] = pSrc[2U * j]; + pSrc[2U * j] = in; + + /* pSrc[i+1U] <-> pSrc[j+1U] */ + in = pSrc[(2U * i) + 1U]; + pSrc[(2U * i) + 1U] = pSrc[(2U * j) + 1U]; + pSrc[(2U * j) + 1U] = in; + + /* pSrc[i+fftLenBy2p1] <-> pSrc[j+fftLenBy2p1] */ + in = pSrc[2U * (i + fftLenBy2p1)]; + pSrc[2U * (i + fftLenBy2p1)] = pSrc[2U * (j + fftLenBy2p1)]; + pSrc[2U * (j + fftLenBy2p1)] = in; + + /* pSrc[i+fftLenBy2p1+1U] <-> pSrc[j+fftLenBy2p1+1U] */ + in = pSrc[(2U * (i + fftLenBy2p1)) + 1U]; + pSrc[(2U * (i + fftLenBy2p1)) + 1U] = + pSrc[(2U * (j + fftLenBy2p1)) + 1U]; + pSrc[(2U * (j + fftLenBy2p1)) + 1U] = in; + + } + + /* pSrc[i+1U] <-> pSrc[j+1U] */ + in = pSrc[2U * (i + 1U)]; + pSrc[2U * (i + 1U)] = pSrc[2U * (j + fftLenBy2)]; + pSrc[2U * (j + fftLenBy2)] = in; + + /* pSrc[i+2U] <-> pSrc[j+2U] */ + in = pSrc[(2U * (i + 1U)) + 1U]; + pSrc[(2U * (i + 1U)) + 1U] = pSrc[(2U * (j + fftLenBy2)) + 1U]; + pSrc[(2U * (j + fftLenBy2)) + 1U] = in; + + /* Reading the index for the bit reversal */ + j = *pBitRevTab; + + /* Updating the bit reversal index depending on the fft length */ + pBitRevTab += bitRevFactor; + } +} + + +/** + @brief In-place Q31 bit reversal function. + @param[in,out] pSrc points to in-place Q31 data buffer. + @param[in] fftLen length of FFT. + @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + @param[in] pBitRevTab points to bit reversal table + @return none +*/ + +void arm_bitreversal_q31( + q31_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab) +{ + uint32_t fftLenBy2, fftLenBy2p1, i, j; + q31_t in; + + /* Initializations */ + j = 0U; + fftLenBy2 = fftLen / 2U; + fftLenBy2p1 = (fftLen / 2U) + 1U; + + /* Bit Reversal Implementation */ + for (i = 0U; i <= (fftLenBy2 - 2U); i += 2U) + { + if (i < j) + { + /* pSrc[i] <-> pSrc[j]; */ + in = pSrc[2U * i]; + pSrc[2U * i] = pSrc[2U * j]; + pSrc[2U * j] = in; + + /* pSrc[i+1U] <-> pSrc[j+1U] */ + in = pSrc[(2U * i) + 1U]; + pSrc[(2U * i) + 1U] = pSrc[(2U * j) + 1U]; + pSrc[(2U * j) + 1U] = in; + + /* pSrc[i+fftLenBy2p1] <-> pSrc[j+fftLenBy2p1] */ + in = pSrc[2U * (i + fftLenBy2p1)]; + pSrc[2U * (i + fftLenBy2p1)] = pSrc[2U * (j + fftLenBy2p1)]; + pSrc[2U * (j + fftLenBy2p1)] = in; + + /* pSrc[i+fftLenBy2p1+1U] <-> pSrc[j+fftLenBy2p1+1U] */ + in = pSrc[(2U * (i + fftLenBy2p1)) + 1U]; + pSrc[(2U * (i + fftLenBy2p1)) + 1U] = + pSrc[(2U * (j + fftLenBy2p1)) + 1U]; + pSrc[(2U * (j + fftLenBy2p1)) + 1U] = in; + + } + + /* pSrc[i+1U] <-> pSrc[j+1U] */ + in = pSrc[2U * (i + 1U)]; + pSrc[2U * (i + 1U)] = pSrc[2U * (j + fftLenBy2)]; + pSrc[2U * (j + fftLenBy2)] = in; + + /* pSrc[i+2U] <-> pSrc[j+2U] */ + in = pSrc[(2U * (i + 1U)) + 1U]; + pSrc[(2U * (i + 1U)) + 1U] = pSrc[(2U * (j + fftLenBy2)) + 1U]; + pSrc[(2U * (j + fftLenBy2)) + 1U] = in; + + /* Reading the index for the bit reversal */ + j = *pBitRevTab; + + /* Updating the bit reversal index depending on the fft length */ + pBitRevTab += bitRevFactor; + } +} + + + +/** + @brief In-place Q15 bit reversal function. + @param[in,out] pSrc16 points to in-place Q15 data buffer + @param[in] fftLen length of FFT + @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + @param[in] pBitRevTab points to bit reversal table + @return none +*/ + +void arm_bitreversal_q15( + q15_t * pSrc16, + uint32_t fftLen, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab) +{ + q31_t *pSrc = (q31_t *) pSrc16; + q31_t in; + uint32_t fftLenBy2, fftLenBy2p1; + uint32_t i, j; + + /* Initializations */ + j = 0U; + fftLenBy2 = fftLen / 2U; + fftLenBy2p1 = (fftLen / 2U) + 1U; + + /* Bit Reversal Implementation */ + for (i = 0U; i <= (fftLenBy2 - 2U); i += 2U) + { + if (i < j) + { + /* pSrc[i] <-> pSrc[j]; */ + /* pSrc[i+1U] <-> pSrc[j+1U] */ + in = pSrc[i]; + pSrc[i] = pSrc[j]; + pSrc[j] = in; + + /* pSrc[i + fftLenBy2p1] <-> pSrc[j + fftLenBy2p1]; */ + /* pSrc[i + fftLenBy2p1+1U] <-> pSrc[j + fftLenBy2p1+1U] */ + in = pSrc[i + fftLenBy2p1]; + pSrc[i + fftLenBy2p1] = pSrc[j + fftLenBy2p1]; + pSrc[j + fftLenBy2p1] = in; + } + + /* pSrc[i+1U] <-> pSrc[j+fftLenBy2]; */ + /* pSrc[i+2] <-> pSrc[j+fftLenBy2+1U] */ + in = pSrc[i + 1U]; + pSrc[i + 1U] = pSrc[j + fftLenBy2]; + pSrc[j + fftLenBy2] = in; + + /* Reading the index for the bit reversal */ + j = *pBitRevTab; + + /* Updating the bit reversal index depending on the fft length */ + pBitRevTab += bitRevFactor; + } +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.S b/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.S new file mode 100644 index 0000000..c16091b --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.S @@ -0,0 +1,216 @@ +;/* ---------------------------------------------------------------------- +; * Project: CMSIS DSP Library +; * Title: arm_bitreversal2.S +; * Description: arm_bitreversal_32 function done in assembly for maximum speed. +; * Called after doing an fft to reorder the output. +; * The function is loop unrolled by 2. arm_bitreversal_16 as well. +; * +; * $Date: 18. March 2019 +; * $Revision: V1.5.2 +; * +; * Target Processor: Cortex-M cores +; * -------------------------------------------------------------------- */ +;/* +; * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. +; */ + +#if defined ( __CC_ARM ) /* Keil */ + #define CODESECT AREA ||.text||, CODE, READONLY, ALIGN=2 + #define LABEL +#elif defined ( __IASMARM__ ) /* IAR */ + #define CODESECT SECTION `.text`:CODE + #define PROC + #define LABEL + #define ENDP + #define EXPORT PUBLIC +#elif defined ( __CSMC__ ) /* Cosmic */ + #define CODESECT switch .text + #define THUMB + #define EXPORT xdef + #define PROC : + #define LABEL : + #define ENDP + #define arm_bitreversal_32 _arm_bitreversal_32 +#elif defined ( __TI_ARM__ ) /* TI ARM */ + #define THUMB .thumb + #define CODESECT .text + #define EXPORT .global + #define PROC : .asmfunc + #define LABEL : + #define ENDP .endasmfunc + #define END +#elif defined ( __GNUC__ ) /* GCC */ + #define THUMB .thumb + #define CODESECT .section .text + #define EXPORT .global + #define PROC : + #define LABEL : + #define ENDP + #define END + + .syntax unified +#endif + + CODESECT + THUMB + +;/** +; @brief In-place bit reversal function. +; @param[in,out] pSrc points to the in-place buffer of unknown 32-bit data type +; @param[in] bitRevLen bit reversal table length +; @param[in] pBitRevTab points to bit reversal table +; @return none +; */ + EXPORT arm_bitreversal_32 + EXPORT arm_bitreversal_16 + +#if defined ( __CC_ARM ) /* Keil */ +#elif defined ( __IASMARM__ ) /* IAR */ +#elif defined ( __CSMC__ ) /* Cosmic */ +#elif defined ( __TI_ARM__ ) /* TI ARM */ +#elif defined ( __GNUC__ ) /* GCC */ + .type arm_bitreversal_16, %function + .type arm_bitreversal_32, %function +#endif + +#if defined (ARM_MATH_CM0_FAMILY) + +arm_bitreversal_32 PROC + ADDS r3,r1,#1 + PUSH {r4-r6} + ADDS r1,r2,#0 + LSRS r3,r3,#1 +arm_bitreversal_32_0 LABEL + LDRH r2,[r1,#2] + LDRH r6,[r1,#0] + ADD r2,r0,r2 + ADD r6,r0,r6 + LDR r5,[r2,#0] + LDR r4,[r6,#0] + STR r5,[r6,#0] + STR r4,[r2,#0] + LDR r5,[r2,#4] + LDR r4,[r6,#4] + STR r5,[r6,#4] + STR r4,[r2,#4] + ADDS r1,r1,#4 + SUBS r3,r3,#1 + BNE arm_bitreversal_32_0 + POP {r4-r6} + BX lr + ENDP + +arm_bitreversal_16 PROC + ADDS r3,r1,#1 + PUSH {r4-r6} + ADDS r1,r2,#0 + LSRS r3,r3,#1 +arm_bitreversal_16_0 LABEL + LDRH r2,[r1,#2] + LDRH r6,[r1,#0] + LSRS r2,r2,#1 + LSRS r6,r6,#1 + ADD r2,r0,r2 + ADD r6,r0,r6 + LDR r5,[r2,#0] + LDR r4,[r6,#0] + STR r5,[r6,#0] + STR r4,[r2,#0] + ADDS r1,r1,#4 + SUBS r3,r3,#1 + BNE arm_bitreversal_16_0 + POP {r4-r6} + BX lr + ENDP + +#else + +arm_bitreversal_32 PROC + ADDS r3,r1,#1 + CMP r3,#1 + IT LS + BXLS lr + PUSH {r4-r9} + ADDS r1,r2,#2 + LSRS r3,r3,#2 +arm_bitreversal_32_0 LABEL ;/* loop unrolled by 2 */ + LDRH r8,[r1,#4] + LDRH r9,[r1,#2] + LDRH r2,[r1,#0] + LDRH r12,[r1,#-2] + ADD r8,r0,r8 + ADD r9,r0,r9 + ADD r2,r0,r2 + ADD r12,r0,r12 + LDR r7,[r9,#0] + LDR r6,[r8,#0] + LDR r5,[r2,#0] + LDR r4,[r12,#0] + STR r6,[r9,#0] + STR r7,[r8,#0] + STR r5,[r12,#0] + STR r4,[r2,#0] + LDR r7,[r9,#4] + LDR r6,[r8,#4] + LDR r5,[r2,#4] + LDR r4,[r12,#4] + STR r6,[r9,#4] + STR r7,[r8,#4] + STR r5,[r12,#4] + STR r4,[r2,#4] + ADDS r1,r1,#8 + SUBS r3,r3,#1 + BNE arm_bitreversal_32_0 + POP {r4-r9} + BX lr + ENDP + +arm_bitreversal_16 PROC + ADDS r3,r1,#1 + CMP r3,#1 + IT LS + BXLS lr + PUSH {r4-r9} + ADDS r1,r2,#2 + LSRS r3,r3,#2 +arm_bitreversal_16_0 LABEL ;/* loop unrolled by 2 */ + LDRH r8,[r1,#4] + LDRH r9,[r1,#2] + LDRH r2,[r1,#0] + LDRH r12,[r1,#-2] + ADD r8,r0,r8,LSR #1 + ADD r9,r0,r9,LSR #1 + ADD r2,r0,r2,LSR #1 + ADD r12,r0,r12,LSR #1 + LDR r7,[r9,#0] + LDR r6,[r8,#0] + LDR r5,[r2,#0] + LDR r4,[r12,#0] + STR r6,[r9,#0] + STR r7,[r8,#0] + STR r5,[r12,#0] + STR r4,[r2,#0] + ADDS r1,r1,#8 + SUBS r3,r3,#1 + BNE arm_bitreversal_16_0 + POP {r4-r9} + BX lr + ENDP + +#endif + + END diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.c b/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.c new file mode 100644 index 0000000..c5fe60f --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.c @@ -0,0 +1,99 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_bitreversal2.c + * Description: Bitreversal functions + * + * $Date: 18. March 2019 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @brief In-place 32 bit reversal function. + @param[in,out] pSrc points to in-place buffer of unknown 32-bit data type + @param[in] bitRevLen bit reversal table length + @param[in] pBitRevTab points to bit reversal table + @return none +*/ + +void arm_bitreversal_32( + uint32_t *pSrc, + const uint16_t bitRevLen, + const uint16_t *pBitRevTab) +{ + uint32_t a, b, i, tmp; + + for (i = 0; i < bitRevLen; ) + { + a = pBitRevTab[i ] >> 2; + b = pBitRevTab[i + 1] >> 2; + + //real + tmp = pSrc[a]; + pSrc[a] = pSrc[b]; + pSrc[b] = tmp; + + //complex + tmp = pSrc[a+1]; + pSrc[a+1] = pSrc[b+1]; + pSrc[b+1] = tmp; + + i += 2; + } +} + + +/** + @brief In-place 16 bit reversal function. + @param[in,out] pSrc points to in-place buffer of unknown 16-bit data type + @param[in] bitRevLen bit reversal table length + @param[in] pBitRevTab points to bit reversal table + @return none +*/ + +void arm_bitreversal_16( + uint16_t *pSrc, + const uint16_t bitRevLen, + const uint16_t *pBitRevTab) +{ + uint16_t a, b, i, tmp; + + for (i = 0; i < bitRevLen; ) + { + a = pBitRevTab[i ] >> 2; + b = pBitRevTab[i + 1] >> 2; + + //real + tmp = pSrc[a]; + pSrc[a] = pSrc[b]; + pSrc[b] = tmp; + + //complex + tmp = pSrc[a+1]; + pSrc[a+1] = pSrc[b+1]; + pSrc[b+1] = tmp; + + i += 2; + } +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_f32.c new file mode 100644 index 0000000..2fff61c --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_f32.c @@ -0,0 +1,629 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_f32.c + * Description: Combined Radix Decimation in Frequency CFFT Floating point processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +extern void arm_radix8_butterfly_f32( + float32_t * pSrc, + uint16_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier); + +extern void arm_bitreversal_32( + uint32_t * pSrc, + const uint16_t bitRevLen, + const uint16_t * pBitRevTable); + +/** + @ingroup groupTransforms + */ + +/** + @defgroup ComplexFFT Complex FFT Functions + + @par + The Fast Fourier Transform (FFT) is an efficient algorithm for computing the + Discrete Fourier Transform (DFT). The FFT can be orders of magnitude faster + than the DFT, especially for long lengths. + The algorithms described in this section + operate on complex data. A separate set of functions is devoted to handling + of real sequences. + @par + There are separate algorithms for handling floating-point, Q15, and Q31 data + types. The algorithms available for each data type are described next. + @par + The FFT functions operate in-place. That is, the array holding the input data + will also be used to hold the corresponding result. The input data is complex + and contains 2*fftLen interleaved values as shown below. +
{real[0], imag[0], real[1], imag[1], ...} 
+ The FFT result will be contained in the same array and the frequency domain + values will have the same interleaving. + + @par Floating-point + The floating-point complex FFT uses a mixed-radix algorithm. Multiple radix-8 + stages are performed along with a single radix-2 or radix-4 stage, as needed. + The algorithm supports lengths of [16, 32, 64, ..., 4096] and each length uses + a different twiddle factor table. + @par + The function uses the standard FFT definition and output values may grow by a + factor of fftLen when computing the forward transform. The + inverse transform includes a scale of 1/fftLen as part of the + calculation and this matches the textbook definition of the inverse FFT. + @par + Pre-initialized data structures containing twiddle factors and bit reversal + tables are provided and defined in arm_const_structs.h. Include + this header in your function and then pass one of the constant structures as + an argument to arm_cfft_f32. For example: + @par + arm_cfft_f32(arm_cfft_sR_f32_len64, pSrc, 1, 1) + @par + computes a 64-point inverse complex FFT including bit reversal. + The data structures are treated as constant data and not modified during the + calculation. The same data structure can be reused for multiple transforms + including mixing forward and inverse transforms. + @par + Earlier releases of the library provided separate radix-2 and radix-4 + algorithms that operated on floating-point data. These functions are still + provided but are deprecated. The older functions are slower and less general + than the new functions. + @par + An example of initialization of the constants for the arm_cfft_f32 function follows: + @code + const static arm_cfft_instance_f32 *S; + ... + switch (length) { + case 16: + S = &arm_cfft_sR_f32_len16; + break; + case 32: + S = &arm_cfft_sR_f32_len32; + break; + case 64: + S = &arm_cfft_sR_f32_len64; + break; + case 128: + S = &arm_cfft_sR_f32_len128; + break; + case 256: + S = &arm_cfft_sR_f32_len256; + break; + case 512: + S = &arm_cfft_sR_f32_len512; + break; + case 1024: + S = &arm_cfft_sR_f32_len1024; + break; + case 2048: + S = &arm_cfft_sR_f32_len2048; + break; + case 4096: + S = &arm_cfft_sR_f32_len4096; + break; + } + @endcode + @par Q15 and Q31 + The floating-point complex FFT uses a mixed-radix algorithm. Multiple radix-4 + stages are performed along with a single radix-2 stage, as needed. + The algorithm supports lengths of [16, 32, 64, ..., 4096] and each length uses + a different twiddle factor table. + @par + The function uses the standard FFT definition and output values may grow by a + factor of fftLen when computing the forward transform. The + inverse transform includes a scale of 1/fftLen as part of the + calculation and this matches the textbook definition of the inverse FFT. + @par + Pre-initialized data structures containing twiddle factors and bit reversal + tables are provided and defined in arm_const_structs.h. Include + this header in your function and then pass one of the constant structures as + an argument to arm_cfft_q31. For example: + @par + arm_cfft_q31(arm_cfft_sR_q31_len64, pSrc, 1, 1) + @par + computes a 64-point inverse complex FFT including bit reversal. + The data structures are treated as constant data and not modified during the + calculation. The same data structure can be reused for multiple transforms + including mixing forward and inverse transforms. + @par + Earlier releases of the library provided separate radix-2 and radix-4 + algorithms that operated on floating-point data. These functions are still + provided but are deprecated. The older functions are slower and less general + than the new functions. + @par + An example of initialization of the constants for the arm_cfft_q31 function follows: + @code + const static arm_cfft_instance_q31 *S; + ... + switch (length) { + case 16: + S = &arm_cfft_sR_q31_len16; + break; + case 32: + S = &arm_cfft_sR_q31_len32; + break; + case 64: + S = &arm_cfft_sR_q31_len64; + break; + case 128: + S = &arm_cfft_sR_q31_len128; + break; + case 256: + S = &arm_cfft_sR_q31_len256; + break; + case 512: + S = &arm_cfft_sR_q31_len512; + break; + case 1024: + S = &arm_cfft_sR_q31_len1024; + break; + case 2048: + S = &arm_cfft_sR_q31_len2048; + break; + case 4096: + S = &arm_cfft_sR_q31_len4096; + break; + } + @endcode + + */ + +void arm_cfft_radix8by2_f32 (arm_cfft_instance_f32 * S, float32_t * p1) +{ + uint32_t L = S->fftLen; + float32_t * pCol1, * pCol2, * pMid1, * pMid2; + float32_t * p2 = p1 + L; + const float32_t * tw = (float32_t *) S->pTwiddle; + float32_t t1[4], t2[4], t3[4], t4[4], twR, twI; + float32_t m0, m1, m2, m3; + uint32_t l; + + pCol1 = p1; + pCol2 = p2; + + /* Define new length */ + L >>= 1; + + /* Initialize mid pointers */ + pMid1 = p1 + L; + pMid2 = p2 + L; + + /* do two dot Fourier transform */ + for (l = L >> 2; l > 0; l-- ) + { + t1[0] = p1[0]; + t1[1] = p1[1]; + t1[2] = p1[2]; + t1[3] = p1[3]; + + t2[0] = p2[0]; + t2[1] = p2[1]; + t2[2] = p2[2]; + t2[3] = p2[3]; + + t3[0] = pMid1[0]; + t3[1] = pMid1[1]; + t3[2] = pMid1[2]; + t3[3] = pMid1[3]; + + t4[0] = pMid2[0]; + t4[1] = pMid2[1]; + t4[2] = pMid2[2]; + t4[3] = pMid2[3]; + + *p1++ = t1[0] + t2[0]; + *p1++ = t1[1] + t2[1]; + *p1++ = t1[2] + t2[2]; + *p1++ = t1[3] + t2[3]; /* col 1 */ + + t2[0] = t1[0] - t2[0]; + t2[1] = t1[1] - t2[1]; + t2[2] = t1[2] - t2[2]; + t2[3] = t1[3] - t2[3]; /* for col 2 */ + + *pMid1++ = t3[0] + t4[0]; + *pMid1++ = t3[1] + t4[1]; + *pMid1++ = t3[2] + t4[2]; + *pMid1++ = t3[3] + t4[3]; /* col 1 */ + + t4[0] = t4[0] - t3[0]; + t4[1] = t4[1] - t3[1]; + t4[2] = t4[2] - t3[2]; + t4[3] = t4[3] - t3[3]; /* for col 2 */ + + twR = *tw++; + twI = *tw++; + + /* multiply by twiddle factors */ + m0 = t2[0] * twR; + m1 = t2[1] * twI; + m2 = t2[1] * twR; + m3 = t2[0] * twI; + + /* R = R * Tr - I * Ti */ + *p2++ = m0 + m1; + /* I = I * Tr + R * Ti */ + *p2++ = m2 - m3; + + /* use vertical symmetry */ + /* 0.9988 - 0.0491i <==> -0.0491 - 0.9988i */ + m0 = t4[0] * twI; + m1 = t4[1] * twR; + m2 = t4[1] * twI; + m3 = t4[0] * twR; + + *pMid2++ = m0 - m1; + *pMid2++ = m2 + m3; + + twR = *tw++; + twI = *tw++; + + m0 = t2[2] * twR; + m1 = t2[3] * twI; + m2 = t2[3] * twR; + m3 = t2[2] * twI; + + *p2++ = m0 + m1; + *p2++ = m2 - m3; + + m0 = t4[2] * twI; + m1 = t4[3] * twR; + m2 = t4[3] * twI; + m3 = t4[2] * twR; + + *pMid2++ = m0 - m1; + *pMid2++ = m2 + m3; + } + + /* first col */ + arm_radix8_butterfly_f32 (pCol1, L, (float32_t *) S->pTwiddle, 2U); + + /* second col */ + arm_radix8_butterfly_f32 (pCol2, L, (float32_t *) S->pTwiddle, 2U); +} + +void arm_cfft_radix8by4_f32 (arm_cfft_instance_f32 * S, float32_t * p1) +{ + uint32_t L = S->fftLen >> 1; + float32_t * pCol1, *pCol2, *pCol3, *pCol4, *pEnd1, *pEnd2, *pEnd3, *pEnd4; + const float32_t *tw2, *tw3, *tw4; + float32_t * p2 = p1 + L; + float32_t * p3 = p2 + L; + float32_t * p4 = p3 + L; + float32_t t2[4], t3[4], t4[4], twR, twI; + float32_t p1ap3_0, p1sp3_0, p1ap3_1, p1sp3_1; + float32_t m0, m1, m2, m3; + uint32_t l, twMod2, twMod3, twMod4; + + pCol1 = p1; /* points to real values by default */ + pCol2 = p2; + pCol3 = p3; + pCol4 = p4; + pEnd1 = p2 - 1; /* points to imaginary values by default */ + pEnd2 = p3 - 1; + pEnd3 = p4 - 1; + pEnd4 = pEnd3 + L; + + tw2 = tw3 = tw4 = (float32_t *) S->pTwiddle; + + L >>= 1; + + /* do four dot Fourier transform */ + + twMod2 = 2; + twMod3 = 4; + twMod4 = 6; + + /* TOP */ + p1ap3_0 = p1[0] + p3[0]; + p1sp3_0 = p1[0] - p3[0]; + p1ap3_1 = p1[1] + p3[1]; + p1sp3_1 = p1[1] - p3[1]; + + /* col 2 */ + t2[0] = p1sp3_0 + p2[1] - p4[1]; + t2[1] = p1sp3_1 - p2[0] + p4[0]; + /* col 3 */ + t3[0] = p1ap3_0 - p2[0] - p4[0]; + t3[1] = p1ap3_1 - p2[1] - p4[1]; + /* col 4 */ + t4[0] = p1sp3_0 - p2[1] + p4[1]; + t4[1] = p1sp3_1 + p2[0] - p4[0]; + /* col 1 */ + *p1++ = p1ap3_0 + p2[0] + p4[0]; + *p1++ = p1ap3_1 + p2[1] + p4[1]; + + /* Twiddle factors are ones */ + *p2++ = t2[0]; + *p2++ = t2[1]; + *p3++ = t3[0]; + *p3++ = t3[1]; + *p4++ = t4[0]; + *p4++ = t4[1]; + + tw2 += twMod2; + tw3 += twMod3; + tw4 += twMod4; + + for (l = (L - 2) >> 1; l > 0; l-- ) + { + /* TOP */ + p1ap3_0 = p1[0] + p3[0]; + p1sp3_0 = p1[0] - p3[0]; + p1ap3_1 = p1[1] + p3[1]; + p1sp3_1 = p1[1] - p3[1]; + /* col 2 */ + t2[0] = p1sp3_0 + p2[1] - p4[1]; + t2[1] = p1sp3_1 - p2[0] + p4[0]; + /* col 3 */ + t3[0] = p1ap3_0 - p2[0] - p4[0]; + t3[1] = p1ap3_1 - p2[1] - p4[1]; + /* col 4 */ + t4[0] = p1sp3_0 - p2[1] + p4[1]; + t4[1] = p1sp3_1 + p2[0] - p4[0]; + /* col 1 - top */ + *p1++ = p1ap3_0 + p2[0] + p4[0]; + *p1++ = p1ap3_1 + p2[1] + p4[1]; + + /* BOTTOM */ + p1ap3_1 = pEnd1[-1] + pEnd3[-1]; + p1sp3_1 = pEnd1[-1] - pEnd3[-1]; + p1ap3_0 = pEnd1[ 0] + pEnd3[0]; + p1sp3_0 = pEnd1[ 0] - pEnd3[0]; + /* col 2 */ + t2[2] = pEnd2[0] - pEnd4[0] + p1sp3_1; + t2[3] = pEnd1[0] - pEnd3[0] - pEnd2[-1] + pEnd4[-1]; + /* col 3 */ + t3[2] = p1ap3_1 - pEnd2[-1] - pEnd4[-1]; + t3[3] = p1ap3_0 - pEnd2[ 0] - pEnd4[ 0]; + /* col 4 */ + t4[2] = pEnd2[ 0] - pEnd4[ 0] - p1sp3_1; + t4[3] = pEnd4[-1] - pEnd2[-1] - p1sp3_0; + /* col 1 - Bottom */ + *pEnd1-- = p1ap3_0 + pEnd2[ 0] + pEnd4[ 0]; + *pEnd1-- = p1ap3_1 + pEnd2[-1] + pEnd4[-1]; + + /* COL 2 */ + /* read twiddle factors */ + twR = *tw2++; + twI = *tw2++; + /* multiply by twiddle factors */ + /* let Z1 = a + i(b), Z2 = c + i(d) */ + /* => Z1 * Z2 = (a*c - b*d) + i(b*c + a*d) */ + + /* Top */ + m0 = t2[0] * twR; + m1 = t2[1] * twI; + m2 = t2[1] * twR; + m3 = t2[0] * twI; + + *p2++ = m0 + m1; + *p2++ = m2 - m3; + /* use vertical symmetry col 2 */ + /* 0.9997 - 0.0245i <==> 0.0245 - 0.9997i */ + /* Bottom */ + m0 = t2[3] * twI; + m1 = t2[2] * twR; + m2 = t2[2] * twI; + m3 = t2[3] * twR; + + *pEnd2-- = m0 - m1; + *pEnd2-- = m2 + m3; + + /* COL 3 */ + twR = tw3[0]; + twI = tw3[1]; + tw3 += twMod3; + /* Top */ + m0 = t3[0] * twR; + m1 = t3[1] * twI; + m2 = t3[1] * twR; + m3 = t3[0] * twI; + + *p3++ = m0 + m1; + *p3++ = m2 - m3; + /* use vertical symmetry col 3 */ + /* 0.9988 - 0.0491i <==> -0.9988 - 0.0491i */ + /* Bottom */ + m0 = -t3[3] * twR; + m1 = t3[2] * twI; + m2 = t3[2] * twR; + m3 = t3[3] * twI; + + *pEnd3-- = m0 - m1; + *pEnd3-- = m3 - m2; + + /* COL 4 */ + twR = tw4[0]; + twI = tw4[1]; + tw4 += twMod4; + /* Top */ + m0 = t4[0] * twR; + m1 = t4[1] * twI; + m2 = t4[1] * twR; + m3 = t4[0] * twI; + + *p4++ = m0 + m1; + *p4++ = m2 - m3; + /* use vertical symmetry col 4 */ + /* 0.9973 - 0.0736i <==> -0.0736 + 0.9973i */ + /* Bottom */ + m0 = t4[3] * twI; + m1 = t4[2] * twR; + m2 = t4[2] * twI; + m3 = t4[3] * twR; + + *pEnd4-- = m0 - m1; + *pEnd4-- = m2 + m3; + } + + /* MIDDLE */ + /* Twiddle factors are */ + /* 1.0000 0.7071-0.7071i -1.0000i -0.7071-0.7071i */ + p1ap3_0 = p1[0] + p3[0]; + p1sp3_0 = p1[0] - p3[0]; + p1ap3_1 = p1[1] + p3[1]; + p1sp3_1 = p1[1] - p3[1]; + + /* col 2 */ + t2[0] = p1sp3_0 + p2[1] - p4[1]; + t2[1] = p1sp3_1 - p2[0] + p4[0]; + /* col 3 */ + t3[0] = p1ap3_0 - p2[0] - p4[0]; + t3[1] = p1ap3_1 - p2[1] - p4[1]; + /* col 4 */ + t4[0] = p1sp3_0 - p2[1] + p4[1]; + t4[1] = p1sp3_1 + p2[0] - p4[0]; + /* col 1 - Top */ + *p1++ = p1ap3_0 + p2[0] + p4[0]; + *p1++ = p1ap3_1 + p2[1] + p4[1]; + + /* COL 2 */ + twR = tw2[0]; + twI = tw2[1]; + + m0 = t2[0] * twR; + m1 = t2[1] * twI; + m2 = t2[1] * twR; + m3 = t2[0] * twI; + + *p2++ = m0 + m1; + *p2++ = m2 - m3; + /* COL 3 */ + twR = tw3[0]; + twI = tw3[1]; + + m0 = t3[0] * twR; + m1 = t3[1] * twI; + m2 = t3[1] * twR; + m3 = t3[0] * twI; + + *p3++ = m0 + m1; + *p3++ = m2 - m3; + /* COL 4 */ + twR = tw4[0]; + twI = tw4[1]; + + m0 = t4[0] * twR; + m1 = t4[1] * twI; + m2 = t4[1] * twR; + m3 = t4[0] * twI; + + *p4++ = m0 + m1; + *p4++ = m2 - m3; + + /* first col */ + arm_radix8_butterfly_f32 (pCol1, L, (float32_t *) S->pTwiddle, 4U); + + /* second col */ + arm_radix8_butterfly_f32 (pCol2, L, (float32_t *) S->pTwiddle, 4U); + + /* third col */ + arm_radix8_butterfly_f32 (pCol3, L, (float32_t *) S->pTwiddle, 4U); + + /* fourth col */ + arm_radix8_butterfly_f32 (pCol4, L, (float32_t *) S->pTwiddle, 4U); +} + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Processing function for the floating-point complex FFT. + @param[in] S points to an instance of the floating-point CFFT structure + @param[in,out] p1 points to the complex data buffer of size 2*fftLen. Processing occurs in-place + @param[in] ifftFlag flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return none + */ + +void arm_cfft_f32( + const arm_cfft_instance_f32 * S, + float32_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + uint32_t L = S->fftLen, l; + float32_t invL, * pSrc; + + if (ifftFlag == 1U) + { + /* Conjugate input data */ + pSrc = p1 + 1; + for (l = 0; l < L; l++) + { + *pSrc = -*pSrc; + pSrc += 2; + } + } + + switch (L) + { + case 16: + case 128: + case 1024: + arm_cfft_radix8by2_f32 ( (arm_cfft_instance_f32 *) S, p1); + break; + case 32: + case 256: + case 2048: + arm_cfft_radix8by4_f32 ( (arm_cfft_instance_f32 *) S, p1); + break; + case 64: + case 512: + case 4096: + arm_radix8_butterfly_f32 ( p1, L, (float32_t *) S->pTwiddle, 1); + break; + } + + if ( bitReverseFlag ) + arm_bitreversal_32 ((uint32_t*) p1, S->bitRevLength, S->pBitRevTable); + + if (ifftFlag == 1U) + { + invL = 1.0f / (float32_t)L; + + /* Conjugate and scale output data */ + pSrc = p1; + for (l= 0; l < L; l++) + { + *pSrc++ *= invL ; + *pSrc = -(*pSrc) * invL; + pSrc++; + } + } +} + +/** + @} end of ComplexFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q15.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q15.c new file mode 100644 index 0000000..28ad1e1 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q15.c @@ -0,0 +1,332 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_q15.c + * Description: Combined Radix Decimation in Q15 Frequency CFFT processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +extern void arm_radix4_butterfly_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef, + uint32_t twidCoefModifier); + +extern void arm_radix4_butterfly_inverse_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef, + uint32_t twidCoefModifier); + +extern void arm_bitreversal_16( + uint16_t * pSrc, + const uint16_t bitRevLen, + const uint16_t * pBitRevTable); + +void arm_cfft_radix4by2_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef); + +void arm_cfft_radix4by2_inverse_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef); + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Processing function for Q15 complex FFT. + @param[in] S points to an instance of Q15 CFFT structure + @param[in,out] p1 points to the complex data buffer of size 2*fftLen. Processing occurs in-place + @param[in] ifftFlag flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return none + */ + +void arm_cfft_q15( + const arm_cfft_instance_q15 * S, + q15_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + uint32_t L = S->fftLen; + + if (ifftFlag == 1U) + { + switch (L) + { + case 16: + case 64: + case 256: + case 1024: + case 4096: + arm_radix4_butterfly_inverse_q15 ( p1, L, (q15_t*)S->pTwiddle, 1 ); + break; + + case 32: + case 128: + case 512: + case 2048: + arm_cfft_radix4by2_inverse_q15 ( p1, L, S->pTwiddle ); + break; + } + } + else + { + switch (L) + { + case 16: + case 64: + case 256: + case 1024: + case 4096: + arm_radix4_butterfly_q15 ( p1, L, (q15_t*)S->pTwiddle, 1 ); + break; + + case 32: + case 128: + case 512: + case 2048: + arm_cfft_radix4by2_q15 ( p1, L, S->pTwiddle ); + break; + } + } + + if ( bitReverseFlag ) + arm_bitreversal_16 ((uint16_t*) p1, S->bitRevLength, S->pBitRevTable); +} + +/** + @} end of ComplexFFT group + */ + +void arm_cfft_radix4by2_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef) +{ + uint32_t i; + uint32_t n2; + q15_t p0, p1, p2, p3; +#if defined (ARM_MATH_DSP) + q31_t T, S, R; + q31_t coeff, out1, out2; + const q15_t *pC = pCoef; + q15_t *pSi = pSrc; + q15_t *pSl = pSrc + fftLen; +#else + uint32_t l; + q15_t xt, yt, cosVal, sinVal; +#endif + + n2 = fftLen >> 1U; + +#if defined (ARM_MATH_DSP) + + for (i = n2; i > 0; i--) + { + coeff = read_q15x2_ia ((q15_t **) &pC); + + T = read_q15x2 (pSi); + T = __SHADD16(T, 0); /* this is just a SIMD arithmetic shift right by 1 */ + + S = read_q15x2 (pSl); + S = __SHADD16(S, 0); /* this is just a SIMD arithmetic shift right by 1 */ + + R = __QSUB16(T, S); + + write_q15x2_ia (&pSi, __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUAD(coeff, R) >> 16U; + out2 = __SMUSDX(coeff, R); +#else + out1 = __SMUSDX(R, coeff) >> 16U; + out2 = __SMUAD(coeff, R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2_ia (&pSl, (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + } + +#else /* #if defined (ARM_MATH_DSP) */ + + for (i = 0; i < n2; i++) + { + cosVal = pCoef[2 * i]; + sinVal = pCoef[2 * i + 1]; + + l = i + n2; + + xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U); + pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U; + + yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U); + pSrc[2 * i + 1] = ((pSrc[2 * l + 1] >> 1U) + (pSrc[2 * i + 1] >> 1U)) >> 1U; + + pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16U)) + + ((int16_t) (((q31_t) yt * sinVal) >> 16U)) ); + + pSrc[2 * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16U)) - + ((int16_t) (((q31_t) xt * sinVal) >> 16U)) ); + } + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* first col */ + arm_radix4_butterfly_q15( pSrc, n2, (q15_t*)pCoef, 2U); + + /* second col */ + arm_radix4_butterfly_q15( pSrc + fftLen, n2, (q15_t*)pCoef, 2U); + + n2 = fftLen >> 1U; + for (i = 0; i < n2; i++) + { + p0 = pSrc[4 * i + 0]; + p1 = pSrc[4 * i + 1]; + p2 = pSrc[4 * i + 2]; + p3 = pSrc[4 * i + 3]; + + p0 <<= 1U; + p1 <<= 1U; + p2 <<= 1U; + p3 <<= 1U; + + pSrc[4 * i + 0] = p0; + pSrc[4 * i + 1] = p1; + pSrc[4 * i + 2] = p2; + pSrc[4 * i + 3] = p3; + } + +} + +void arm_cfft_radix4by2_inverse_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef) +{ + uint32_t i; + uint32_t n2; + q15_t p0, p1, p2, p3; +#if defined (ARM_MATH_DSP) + q31_t T, S, R; + q31_t coeff, out1, out2; + const q15_t *pC = pCoef; + q15_t *pSi = pSrc; + q15_t *pSl = pSrc + fftLen; +#else + uint32_t l; + q15_t xt, yt, cosVal, sinVal; +#endif + + n2 = fftLen >> 1U; + +#if defined (ARM_MATH_DSP) + + for (i = n2; i > 0; i--) + { + coeff = read_q15x2_ia ((q15_t **) &pC); + + T = read_q15x2 (pSi); + T = __SHADD16(T, 0); /* this is just a SIMD arithmetic shift right by 1 */ + + S = read_q15x2 (pSl); + S = __SHADD16(S, 0); /* this is just a SIMD arithmetic shift right by 1 */ + + R = __QSUB16(T, S); + + write_q15x2_ia (&pSi, __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUSD(coeff, R) >> 16U; + out2 = __SMUADX(coeff, R); +#else + out1 = __SMUADX(R, coeff) >> 16U; + out2 = __SMUSD(__QSUB(0, coeff), R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2_ia (&pSl, (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + } + +#else /* #if defined (ARM_MATH_DSP) */ + + for (i = 0; i < n2; i++) + { + cosVal = pCoef[2 * i]; + sinVal = pCoef[2 * i + 1]; + + l = i + n2; + + xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U); + pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U; + + yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U); + pSrc[2 * i + 1] = ((pSrc[2 * l + 1] >> 1U) + (pSrc[2 * i + 1] >> 1U)) >> 1U; + + pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16U)) - + ((int16_t) (((q31_t) yt * sinVal) >> 16U)) ); + + pSrc[2 * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16U)) + + ((int16_t) (((q31_t) xt * sinVal) >> 16U)) ); + } + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* first col */ + arm_radix4_butterfly_inverse_q15( pSrc, n2, (q15_t*)pCoef, 2U); + + /* second col */ + arm_radix4_butterfly_inverse_q15( pSrc + fftLen, n2, (q15_t*)pCoef, 2U); + + n2 = fftLen >> 1U; + for (i = 0; i < n2; i++) + { + p0 = pSrc[4 * i + 0]; + p1 = pSrc[4 * i + 1]; + p2 = pSrc[4 * i + 2]; + p3 = pSrc[4 * i + 3]; + + p0 <<= 1U; + p1 <<= 1U; + p2 <<= 1U; + p3 <<= 1U; + + pSrc[4 * i + 0] = p0; + pSrc[4 * i + 1] = p1; + pSrc[4 * i + 2] = p2; + pSrc[4 * i + 3] = p3; + } +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q31.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q31.c new file mode 100644 index 0000000..701ac95 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_q31.c @@ -0,0 +1,254 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_q31.c + * Description: Combined Radix Decimation in Frequency CFFT fixed point processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +extern void arm_radix4_butterfly_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint32_t twidCoefModifier); + +extern void arm_radix4_butterfly_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint32_t twidCoefModifier); + +extern void arm_bitreversal_32( + uint32_t * pSrc, + const uint16_t bitRevLen, + const uint16_t * pBitRevTable); + +void arm_cfft_radix4by2_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef); + +void arm_cfft_radix4by2_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef); + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Processing function for the Q31 complex FFT. + @param[in] S points to an instance of the fixed-point CFFT structure + @param[in,out] p1 points to the complex data buffer of size 2*fftLen. Processing occurs in-place + @param[in] ifftFlag flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return none + */ + +void arm_cfft_q31( + const arm_cfft_instance_q31 * S, + q31_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + uint32_t L = S->fftLen; + + if (ifftFlag == 1U) + { + switch (L) + { + case 16: + case 64: + case 256: + case 1024: + case 4096: + arm_radix4_butterfly_inverse_q31 ( p1, L, (q31_t*)S->pTwiddle, 1 ); + break; + + case 32: + case 128: + case 512: + case 2048: + arm_cfft_radix4by2_inverse_q31 ( p1, L, S->pTwiddle ); + break; + } + } + else + { + switch (L) + { + case 16: + case 64: + case 256: + case 1024: + case 4096: + arm_radix4_butterfly_q31 ( p1, L, (q31_t*)S->pTwiddle, 1 ); + break; + + case 32: + case 128: + case 512: + case 2048: + arm_cfft_radix4by2_q31 ( p1, L, S->pTwiddle ); + break; + } + } + + if ( bitReverseFlag ) + arm_bitreversal_32 ((uint32_t*) p1, S->bitRevLength, S->pBitRevTable); +} + +/** + @} end of ComplexFFT group + */ + +void arm_cfft_radix4by2_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef) +{ + uint32_t i, l; + uint32_t n2; + q31_t xt, yt, cosVal, sinVal; + q31_t p0, p1; + + n2 = fftLen >> 1U; + for (i = 0; i < n2; i++) + { + cosVal = pCoef[2 * i]; + sinVal = pCoef[2 * i + 1]; + + l = i + n2; + + xt = (pSrc[2 * i] >> 2U) - (pSrc[2 * l] >> 2U); + pSrc[2 * i] = (pSrc[2 * i] >> 2U) + (pSrc[2 * l] >> 2U); + + yt = (pSrc[2 * i + 1] >> 2U) - (pSrc[2 * l + 1] >> 2U); + pSrc[2 * i + 1] = (pSrc[2 * l + 1] >> 2U) + (pSrc[2 * i + 1] >> 2U); + + mult_32x32_keep32_R(p0, xt, cosVal); + mult_32x32_keep32_R(p1, yt, cosVal); + multAcc_32x32_keep32_R(p0, yt, sinVal); + multSub_32x32_keep32_R(p1, xt, sinVal); + + pSrc[2 * l] = p0 << 1; + pSrc[2 * l + 1] = p1 << 1; + } + + /* first col */ + arm_radix4_butterfly_q31 (pSrc, n2, (q31_t*)pCoef, 2U); + + /* second col */ + arm_radix4_butterfly_q31 (pSrc + fftLen, n2, (q31_t*)pCoef, 2U); + + n2 = fftLen >> 1U; + for (i = 0; i < n2; i++) + { + p0 = pSrc[4 * i + 0]; + p1 = pSrc[4 * i + 1]; + xt = pSrc[4 * i + 2]; + yt = pSrc[4 * i + 3]; + + p0 <<= 1U; + p1 <<= 1U; + xt <<= 1U; + yt <<= 1U; + + pSrc[4 * i + 0] = p0; + pSrc[4 * i + 1] = p1; + pSrc[4 * i + 2] = xt; + pSrc[4 * i + 3] = yt; + } + +} + +void arm_cfft_radix4by2_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef) +{ + uint32_t i, l; + uint32_t n2; + q31_t xt, yt, cosVal, sinVal; + q31_t p0, p1; + + n2 = fftLen >> 1U; + for (i = 0; i < n2; i++) + { + cosVal = pCoef[2 * i]; + sinVal = pCoef[2 * i + 1]; + + l = i + n2; + + xt = (pSrc[2 * i] >> 2U) - (pSrc[2 * l] >> 2U); + pSrc[2 * i] = (pSrc[2 * i] >> 2U) + (pSrc[2 * l] >> 2U); + + yt = (pSrc[2 * i + 1] >> 2U) - (pSrc[2 * l + 1] >> 2U); + pSrc[2 * i + 1] = (pSrc[2 * l + 1] >> 2U) + (pSrc[2 * i + 1] >> 2U); + + mult_32x32_keep32_R(p0, xt, cosVal); + mult_32x32_keep32_R(p1, yt, cosVal); + multSub_32x32_keep32_R(p0, yt, sinVal); + multAcc_32x32_keep32_R(p1, xt, sinVal); + + pSrc[2 * l] = p0 << 1U; + pSrc[2 * l + 1] = p1 << 1U; + } + + /* first col */ + arm_radix4_butterfly_inverse_q31( pSrc, n2, (q31_t*)pCoef, 2U); + + /* second col */ + arm_radix4_butterfly_inverse_q31( pSrc + fftLen, n2, (q31_t*)pCoef, 2U); + + n2 = fftLen >> 1U; + for (i = 0; i < n2; i++) + { + p0 = pSrc[4 * i + 0]; + p1 = pSrc[4 * i + 1]; + xt = pSrc[4 * i + 2]; + yt = pSrc[4 * i + 3]; + + p0 <<= 1U; + p1 <<= 1U; + xt <<= 1U; + yt <<= 1U; + + pSrc[4 * i + 0] = p0; + pSrc[4 * i + 1] = p1; + pSrc[4 * i + 2] = xt; + pSrc[4 * i + 3] = yt; + } +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_f32.c new file mode 100644 index 0000000..f75e329 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_f32.c @@ -0,0 +1,470 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix2_f32.c + * Description: Radix-2 Decimation in Frequency CFFT & CIFFT Floating point processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +void arm_radix2_butterfly_f32( + float32_t * pSrc, + uint32_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier); + +void arm_radix2_butterfly_inverse_f32( + float32_t * pSrc, + uint32_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier, + float32_t onebyfftLen); + +extern void arm_bitreversal_f32( + float32_t * pSrc, + uint16_t fftSize, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab); + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Radix-2 CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_f32 and will be removed in the future + @param[in] S points to an instance of the floating-point Radix-2 CFFT/CIFFT structure + @param[in,out] pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place + @return none + */ + +void arm_cfft_radix2_f32( +const arm_cfft_radix2_instance_f32 * S, + float32_t * pSrc) +{ + + if (S->ifftFlag == 1U) + { + /* Complex IFFT radix-2 */ + arm_radix2_butterfly_inverse_f32(pSrc, S->fftLen, S->pTwiddle, + S->twidCoefModifier, S->onebyfftLen); + } + else + { + /* Complex FFT radix-2 */ + arm_radix2_butterfly_f32(pSrc, S->fftLen, S->pTwiddle, + S->twidCoefModifier); + } + + if (S->bitReverseFlag == 1U) + { + /* Bit Reversal */ + arm_bitreversal_f32(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); + } + +} + + +/** + @} end of ComplexFFT group + */ + + + +/* ---------------------------------------------------------------------- + ** Internal helper function used by the FFTs + ** ------------------------------------------------------------------- */ + +/** + brief Core function for the floating-point CFFT butterfly process. + param[in,out] pSrc points to in-place buffer of floating-point data type + param[in] fftLen length of the FFT + param[in] pCoef points to twiddle coefficient buffer + param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table + return none + */ + +void arm_radix2_butterfly_f32( + float32_t * pSrc, + uint32_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier) +{ + + uint32_t i, j, k, l; + uint32_t n1, n2, ia; + float32_t xt, yt, cosVal, sinVal; + float32_t p0, p1, p2, p3; + float32_t a0, a1; + +#if defined (ARM_MATH_DSP) + + /* Initializations for the first stage */ + n2 = fftLen >> 1; + ia = 0; + i = 0; + + // loop for groups + for (k = n2; k > 0; k--) + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + + /* Twiddle coefficients index modifier */ + ia += twidCoefModifier; + + /* index calculation for the input as, */ + /* pSrc[i + 0], pSrc[i + fftLen/1] */ + l = i + n2; + + /* Butterfly implementation */ + a0 = pSrc[2 * i] + pSrc[2 * l]; + xt = pSrc[2 * i] - pSrc[2 * l]; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; + + p0 = xt * cosVal; + p1 = yt * sinVal; + p2 = yt * cosVal; + p3 = xt * sinVal; + + pSrc[2 * i] = a0; + pSrc[2 * i + 1] = a1; + + pSrc[2 * l] = p0 + p1; + pSrc[2 * l + 1] = p2 - p3; + + i++; + } // groups loop end + + twidCoefModifier <<= 1U; + + // loop for stage + for (k = n2; k > 2; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + // loop for groups + j = 0; + do + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia += twidCoefModifier; + + // loop for butterfly + i = j; + do + { + l = i + n2; + a0 = pSrc[2 * i] + pSrc[2 * l]; + xt = pSrc[2 * i] - pSrc[2 * l]; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; + + p0 = xt * cosVal; + p1 = yt * sinVal; + p2 = yt * cosVal; + p3 = xt * sinVal; + + pSrc[2 * i] = a0; + pSrc[2 * i + 1] = a1; + + pSrc[2 * l] = p0 + p1; + pSrc[2 * l + 1] = p2 - p3; + + i += n1; + } while ( i < fftLen ); // butterfly loop end + j++; + } while ( j < n2); // groups loop end + twidCoefModifier <<= 1U; + } // stages loop end + + // loop for butterfly + for (i = 0; i < fftLen; i += 2) + { + a0 = pSrc[2 * i] + pSrc[2 * i + 2]; + xt = pSrc[2 * i] - pSrc[2 * i + 2]; + + yt = pSrc[2 * i + 1] - pSrc[2 * i + 3]; + a1 = pSrc[2 * i + 3] + pSrc[2 * i + 1]; + + pSrc[2 * i] = a0; + pSrc[2 * i + 1] = a1; + pSrc[2 * i + 2] = xt; + pSrc[2 * i + 3] = yt; + } // groups loop end + +#else /* #if defined (ARM_MATH_DSP) */ + + n2 = fftLen; + + // loop for stage + for (k = fftLen; k > 1; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + // loop for groups + j = 0; + do + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia += twidCoefModifier; + + // loop for butterfly + i = j; + do + { + l = i + n2; + a0 = pSrc[2 * i] + pSrc[2 * l]; + xt = pSrc[2 * i] - pSrc[2 * l]; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; + + p0 = xt * cosVal; + p1 = yt * sinVal; + p2 = yt * cosVal; + p3 = xt * sinVal; + + pSrc[2 * i] = a0; + pSrc[2 * i + 1] = a1; + + pSrc[2 * l] = p0 + p1; + pSrc[2 * l + 1] = p2 - p3; + + i += n1; + } while (i < fftLen); + j++; + } while (j < n2); + twidCoefModifier <<= 1U; + } + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + + +void arm_radix2_butterfly_inverse_f32( + float32_t * pSrc, + uint32_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier, + float32_t onebyfftLen) +{ + + uint32_t i, j, k, l; + uint32_t n1, n2, ia; + float32_t xt, yt, cosVal, sinVal; + float32_t p0, p1, p2, p3; + float32_t a0, a1; + +#if defined (ARM_MATH_DSP) + + n2 = fftLen >> 1; + ia = 0; + + // loop for groups + for (i = 0; i < n2; i++) + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia += twidCoefModifier; + + l = i + n2; + a0 = pSrc[2 * i] + pSrc[2 * l]; + xt = pSrc[2 * i] - pSrc[2 * l]; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; + + p0 = xt * cosVal; + p1 = yt * sinVal; + p2 = yt * cosVal; + p3 = xt * sinVal; + + pSrc[2 * i] = a0; + pSrc[2 * i + 1] = a1; + + pSrc[2 * l] = p0 - p1; + pSrc[2 * l + 1] = p2 + p3; + } // groups loop end + + twidCoefModifier <<= 1U; + + // loop for stage + for (k = fftLen / 2; k > 2; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + // loop for groups + j = 0; + do + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia += twidCoefModifier; + + // loop for butterfly + i = j; + do + { + l = i + n2; + a0 = pSrc[2 * i] + pSrc[2 * l]; + xt = pSrc[2 * i] - pSrc[2 * l]; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; + + p0 = xt * cosVal; + p1 = yt * sinVal; + p2 = yt * cosVal; + p3 = xt * sinVal; + + pSrc[2 * i] = a0; + pSrc[2 * i + 1] = a1; + + pSrc[2 * l] = p0 - p1; + pSrc[2 * l + 1] = p2 + p3; + + i += n1; + } while ( i < fftLen ); // butterfly loop end + j++; + } while (j < n2); // groups loop end + + twidCoefModifier <<= 1U; + } // stages loop end + + // loop for butterfly + for (i = 0; i < fftLen; i += 2) + { + a0 = pSrc[2 * i] + pSrc[2 * i + 2]; + xt = pSrc[2 * i] - pSrc[2 * i + 2]; + + a1 = pSrc[2 * i + 3] + pSrc[2 * i + 1]; + yt = pSrc[2 * i + 1] - pSrc[2 * i + 3]; + + p0 = a0 * onebyfftLen; + p2 = xt * onebyfftLen; + p1 = a1 * onebyfftLen; + p3 = yt * onebyfftLen; + + pSrc[2 * i] = p0; + pSrc[2 * i + 1] = p1; + pSrc[2 * i + 2] = p2; + pSrc[2 * i + 3] = p3; + } // butterfly loop end + +#else /* #if defined (ARM_MATH_DSP) */ + + n2 = fftLen; + + // loop for stage + for (k = fftLen; k > 2; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + // loop for groups + j = 0; + do + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + // loop for butterfly + i = j; + do + { + l = i + n2; + a0 = pSrc[2 * i] + pSrc[2 * l]; + xt = pSrc[2 * i] - pSrc[2 * l]; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; + + p0 = xt * cosVal; + p1 = yt * sinVal; + p2 = yt * cosVal; + p3 = xt * sinVal; + + pSrc[2 * i] = a0; + pSrc[2 * i + 1] = a1; + + pSrc[2 * l] = p0 - p1; + pSrc[2 * l + 1] = p2 + p3; + + i += n1; + } while ( i < fftLen ); // butterfly loop end + j++; + } while ( j < n2 ); // groups loop end + + twidCoefModifier = twidCoefModifier << 1U; + } // stages loop end + + n1 = n2; + n2 = n2 >> 1; + + // loop for butterfly + for (i = 0; i < fftLen; i += n1) + { + l = i + n2; + + a0 = pSrc[2 * i] + pSrc[2 * l]; + xt = pSrc[2 * i] - pSrc[2 * l]; + + a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + + p0 = a0 * onebyfftLen; + p2 = xt * onebyfftLen; + p1 = a1 * onebyfftLen; + p3 = yt * onebyfftLen; + + pSrc[2 * i] = p0; + pSrc[2 * l] = p2; + + pSrc[2 * i + 1] = p1; + pSrc[2 * l + 1] = p3; + } // butterfly loop end + +#endif /* #if defined (ARM_MATH_DSP) */ + +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_f32.c new file mode 100644 index 0000000..417ad91 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_f32.c @@ -0,0 +1,197 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix2_init_f32.c + * Description: Radix-2 Decimation in Frequency Floating-point CFFT & CIFFT Initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Initialization function for the floating-point CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_f32 and will be removed in the future. + @param[in,out] S points to an instance of the floating-point CFFT/CIFFT structure + @param[in] fftLen length of the FFT + @param[in] ifftFlag flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLen is not a supported length + + @par Details + The parameter ifftFlag controls whether a forward or inverse transform is computed. + Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated + @par + The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. + Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. + @par + The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. + @par + This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. +*/ + +arm_status arm_cfft_radix2_init_f32( + arm_cfft_radix2_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + /* Initialise the FFT length */ + S->fftLen = fftLen; + + /* Initialise the Twiddle coefficient pointer */ + S->pTwiddle = (float32_t *) twiddleCoef; + + /* Initialise the Flag for selection of CFFT or CIFFT */ + S->ifftFlag = ifftFlag; + + /* Initialise the Flag for calculation Bit reversal or not */ + S->bitReverseFlag = bitReverseFlag; + + /* Initializations of structure parameters depending on the FFT length */ + switch (S->fftLen) + { + + case 4096U: + /* Initializations of structure parameters for 4096 point FFT */ + + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 1U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 1U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) armBitRevTable; + /* Initialise the 1/fftLen Value */ + S->onebyfftLen = 0.000244140625; + break; + + case 2048U: + /* Initializations of structure parameters for 2048 point FFT */ + + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 2U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 2U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) & armBitRevTable[1]; + /* Initialise the 1/fftLen Value */ + S->onebyfftLen = 0.00048828125; + break; + + case 1024U: + /* Initializations of structure parameters for 1024 point FFT */ + + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 4U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 4U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; + /* Initialise the 1/fftLen Value */ + S->onebyfftLen = 0.0009765625f; + break; + + case 512U: + /* Initializations of structure parameters for 512 point FFT */ + + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 8U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 8U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) & armBitRevTable[7]; + /* Initialise the 1/fftLen Value */ + S->onebyfftLen = 0.001953125; + break; + + case 256U: + /* Initializations of structure parameters for 256 point FFT */ + S->twidCoefModifier = 16U; + S->bitRevFactor = 16U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; + S->onebyfftLen = 0.00390625f; + break; + + case 128U: + /* Initializations of structure parameters for 128 point FFT */ + S->twidCoefModifier = 32U; + S->bitRevFactor = 32U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[31]; + S->onebyfftLen = 0.0078125; + break; + + case 64U: + /* Initializations of structure parameters for 64 point FFT */ + S->twidCoefModifier = 64U; + S->bitRevFactor = 64U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; + S->onebyfftLen = 0.015625f; + break; + + case 32U: + /* Initializations of structure parameters for 64 point FFT */ + S->twidCoefModifier = 128U; + S->bitRevFactor = 128U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[127]; + S->onebyfftLen = 0.03125; + break; + + case 16U: + /* Initializations of structure parameters for 16 point FFT */ + S->twidCoefModifier = 256U; + S->bitRevFactor = 256U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; + S->onebyfftLen = 0.0625f; + break; + + + default: + /* Reporting argument error if fftSize is not valid value */ + status = ARM_MATH_ARGUMENT_ERROR; + break; + } + + return (status); +} + +/** + @} end of ComplexFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q15.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q15.c new file mode 100644 index 0000000..3d865d0 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q15.c @@ -0,0 +1,182 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix2_init_q15.c + * Description: Radix-2 Decimation in Frequency Q15 FFT & IFFT initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupTransforms + */ + + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Initialization function for the Q15 CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed + @param[in,out] S points to an instance of the Q15 CFFT/CIFFT structure. + @param[in] fftLen length of the FFT. + @param[in] ifftFlag flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLen is not a supported length + + @par Details + The parameter ifftFlag controls whether a forward or inverse transform is computed. + Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated + @par + The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. + Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. + @par + The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. + @par + This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. +*/ + +arm_status arm_cfft_radix2_init_q15( + arm_cfft_radix2_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + /* Initialise the FFT length */ + S->fftLen = fftLen; + + /* Initialise the Twiddle coefficient pointer */ + S->pTwiddle = (q15_t *) twiddleCoef_4096_q15; + /* Initialise the Flag for selection of CFFT or CIFFT */ + S->ifftFlag = ifftFlag; + /* Initialise the Flag for calculation Bit reversal or not */ + S->bitReverseFlag = bitReverseFlag; + + /* Initializations of structure parameters depending on the FFT length */ + switch (S->fftLen) + { + case 4096U: + /* Initializations of structure parameters for 4096 point FFT */ + + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 1U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 1U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) armBitRevTable; + + break; + + case 2048U: + /* Initializations of structure parameters for 2048 point FFT */ + + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 2U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 2U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) & armBitRevTable[1]; + + break; + + case 1024U: + /* Initializations of structure parameters for 1024 point FFT */ + S->twidCoefModifier = 4U; + S->bitRevFactor = 4U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; + + break; + + case 512U: + /* Initializations of structure parameters for 512 point FFT */ + S->twidCoefModifier = 8U; + S->bitRevFactor = 8U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[7]; + + break; + + case 256U: + /* Initializations of structure parameters for 256 point FFT */ + S->twidCoefModifier = 16U; + S->bitRevFactor = 16U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; + + break; + + case 128U: + /* Initializations of structure parameters for 128 point FFT */ + S->twidCoefModifier = 32U; + S->bitRevFactor = 32U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[31]; + + break; + + case 64U: + /* Initializations of structure parameters for 64 point FFT */ + S->twidCoefModifier = 64U; + S->bitRevFactor = 64U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; + + break; + + case 32U: + /* Initializations of structure parameters for 32 point FFT */ + S->twidCoefModifier = 128U; + S->bitRevFactor = 128U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[127]; + + break; + + case 16U: + /* Initializations of structure parameters for 16 point FFT */ + S->twidCoefModifier = 256U; + S->bitRevFactor = 256U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; + + break; + + default: + /* Reporting argument error if fftSize is not valid value */ + status = ARM_MATH_ARGUMENT_ERROR; + break; + } + + return (status); +} + +/** + @} end of ComplexFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q31.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q31.c new file mode 100644 index 0000000..f4a20d6 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_init_q31.c @@ -0,0 +1,179 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix2_init_q31.c + * Description: Radix-2 Decimation in Frequency Fixed-point CFFT & CIFFT Initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Initialization function for the Q31 CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q31 and will be removed in the future. + @param[in,out] S points to an instance of the Q31 CFFT/CIFFT structure + @param[in] fftLen length of the FFT + @param[in] ifftFlag flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLen is not a supported length + + @par Details + The parameter ifftFlag controls whether a forward or inverse transform is computed. + Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated + @par + The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. + Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. + @par + The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. + @par + This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. +*/ + +arm_status arm_cfft_radix2_init_q31( + arm_cfft_radix2_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + /* Initialise the FFT length */ + S->fftLen = fftLen; + + /* Initialise the Twiddle coefficient pointer */ + S->pTwiddle = (q31_t *) twiddleCoef_4096_q31; + + /* Initialise the Flag for selection of CFFT or CIFFT */ + S->ifftFlag = ifftFlag; + + /* Initialise the Flag for calculation Bit reversal or not */ + S->bitReverseFlag = bitReverseFlag; + + /* Initializations of Instance structure depending on the FFT length */ + switch (S->fftLen) + { + /* Initializations of structure parameters for 4096 point FFT */ + case 4096U: + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 1U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 1U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) armBitRevTable; + break; + + /* Initializations of structure parameters for 2048 point FFT */ + case 2048U: + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 2U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 2U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) & armBitRevTable[1]; + break; + + /* Initializations of structure parameters for 1024 point FFT */ + case 1024U: + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 4U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 4U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; + break; + + /* Initializations of structure parameters for 512 point FFT */ + case 512U: + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 8U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 8U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) & armBitRevTable[7]; + break; + + case 256U: + /* Initializations of structure parameters for 256 point FFT */ + S->twidCoefModifier = 16U; + S->bitRevFactor = 16U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; + break; + + case 128U: + /* Initializations of structure parameters for 128 point FFT */ + S->twidCoefModifier = 32U; + S->bitRevFactor = 32U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[31]; + break; + + case 64U: + /* Initializations of structure parameters for 64 point FFT */ + S->twidCoefModifier = 64U; + S->bitRevFactor = 64U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; + break; + + case 32U: + /* Initializations of structure parameters for 32 point FFT */ + S->twidCoefModifier = 128U; + S->bitRevFactor = 128U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[127]; + break; + + case 16U: + /* Initializations of structure parameters for 16 point FFT */ + S->twidCoefModifier = 256U; + S->bitRevFactor = 256U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; + break; + + + default: + /* Reporting argument error if fftSize is not valid value */ + status = ARM_MATH_ARGUMENT_ERROR; + break; + } + + return (status); +} + +/** + @} end of ComplexFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q15.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q15.c new file mode 100644 index 0000000..2a03b57 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q15.c @@ -0,0 +1,689 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix2_q15.c + * Description: Radix-2 Decimation in Frequency CFFT & CIFFT Fixed point processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +void arm_radix2_butterfly_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef, + uint16_t twidCoefModifier); + +void arm_radix2_butterfly_inverse_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef, + uint16_t twidCoefModifier); + +void arm_bitreversal_q15( + q15_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab); + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Processing function for the fixed-point CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed in the future. + @param[in] S points to an instance of the fixed-point CFFT/CIFFT structure + @param[in,out] pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place + @return none + */ + +void arm_cfft_radix2_q15( + const arm_cfft_radix2_instance_q15 * S, + q15_t * pSrc) +{ + + if (S->ifftFlag == 1U) + { + arm_radix2_butterfly_inverse_q15 (pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier); + } + else + { + arm_radix2_butterfly_q15 (pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier); + } + + arm_bitreversal_q15(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); +} + +/** + @} end of ComplexFFT group + */ + +void arm_radix2_butterfly_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef, + uint16_t twidCoefModifier) +{ +#if defined (ARM_MATH_DSP) + + uint32_t i, j, k, l; + uint32_t n1, n2, ia; + q15_t in; + q31_t T, S, R; + q31_t coeff, out1, out2; + + //N = fftLen; + n2 = fftLen; + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + // loop for groups + for (i = 0; i < n2; i++) + { + coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U)); + + ia = ia + twidCoefModifier; + + l = i + n2; + + T = read_q15x2 (pSrc + (2 * i)); + in = ((int16_t) (T & 0xFFFF)) >> 1; + T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF); + + S = read_q15x2 (pSrc + (2 * l)); + in = ((int16_t) (S & 0xFFFF)) >> 1; + S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUAD(coeff, R) >> 16; + out2 = __SMUSDX(coeff, R); +#else + out1 = __SMUSDX(R, coeff) >> 16U; + out2 = __SMUAD(coeff, R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U)); + + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + i++; + l++; + + T = read_q15x2 (pSrc + (2 * i)); + in = ((int16_t) (T & 0xFFFF)) >> 1; + T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF); + + S = read_q15x2 (pSrc + (2 * l)); + in = ((int16_t) (S & 0xFFFF)) >> 1; + S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUAD(coeff, R) >> 16; + out2 = __SMUSDX(coeff, R); +#else + + out1 = __SMUSDX(R, coeff) >> 16U; + out2 = __SMUAD(coeff, R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + + /* loop for stage */ + for (k = fftLen / 2; k > 2; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + /* loop for groups */ + for (j = 0; j < n2; j++) + { + coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U)); + + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = j; i < fftLen; i += n1) + { + l = i + n2; + + T = read_q15x2 (pSrc + (2 * i)); + + S = read_q15x2 (pSrc + (2 * l)); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUAD(coeff, R) >> 16; + out2 = __SMUSDX(coeff, R); +#else + out1 = __SMUSDX(R, coeff) >> 16U; + out2 = __SMUAD(coeff, R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + i += n1; + + l = i + n2; + + T = read_q15x2 (pSrc + (2 * i)); + + S = read_q15x2 (pSrc + (2 * l)); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUAD(coeff, R) >> 16; + out2 = __SMUSDX(coeff, R); +#else + out1 = __SMUSDX(R, coeff) >> 16U; + out2 = __SMUAD(coeff, R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + } /* butterfly loop end */ + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + } /* stages loop end */ + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U)); + + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = 0; i < fftLen; i += n1) + { + l = i + n2; + + T = read_q15x2 (pSrc + (2 * i)); + + S = read_q15x2 (pSrc + (2 * l)); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __QADD16(T, S)); + + write_q15x2 (pSrc + (2 * l), R); + + i += n1; + l = i + n2; + + T = read_q15x2 (pSrc + (2 * i)); + + S = read_q15x2 (pSrc + (2 * l)); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __QADD16(T, S)); + + write_q15x2 (pSrc + (2 * l), R); + + } /* groups loop end */ + + +#else /* #if defined (ARM_MATH_DSP) */ + + uint32_t i, j, k, l; + uint32_t n1, n2, ia; + q15_t xt, yt, cosVal, sinVal; + + + // N = fftLen; + n2 = fftLen; + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + /* loop for groups */ + for (j = 0; j < n2; j++) + { + cosVal = pCoef[(ia * 2)]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = j; i < fftLen; i += n1) + { + l = i + n2; + xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U); + pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U; + + yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U); + pSrc[2 * i + 1] = ((pSrc[2 * l + 1] >> 1U) + + (pSrc[2 * i + 1] >> 1U) ) >> 1U; + + pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) + + ((int16_t) (((q31_t) yt * sinVal) >> 16))); + + pSrc[2U * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) - + ((int16_t) (((q31_t) xt * sinVal) >> 16))); + + } /* butterfly loop end */ + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + + /* loop for stage */ + for (k = fftLen / 2; k > 2; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + /* loop for groups */ + for (j = 0; j < n2; j++) + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = j; i < fftLen; i += n1) + { + l = i + n2; + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U; + + pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) + + ((int16_t) (((q31_t) yt * sinVal) >> 16))); + + pSrc[2U * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) - + ((int16_t) (((q31_t) xt * sinVal) >> 16))); + + } /* butterfly loop end */ + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + } /* stages loop end */ + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + /* loop for groups */ + for (j = 0; j < n2; j++) + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = j; i < fftLen; i += n1) + { + l = i + n2; + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); + + pSrc[2 * l] = xt; + + pSrc[2 * l + 1] = yt; + + } /* butterfly loop end */ + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + + +void arm_radix2_butterfly_inverse_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pCoef, + uint16_t twidCoefModifier) +{ +#if defined (ARM_MATH_DSP) + + uint32_t i, j, k, l; + uint32_t n1, n2, ia; + q15_t in; + q31_t T, S, R; + q31_t coeff, out1, out2; + + // N = fftLen; + n2 = fftLen; + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + /* loop for groups */ + for (i = 0; i < n2; i++) + { + coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U)); + + ia = ia + twidCoefModifier; + + l = i + n2; + + T = read_q15x2 (pSrc + (2 * i)); + in = ((int16_t) (T & 0xFFFF)) >> 1; + T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF); + + S = read_q15x2 (pSrc + (2 * l)); + in = ((int16_t) (S & 0xFFFF)) >> 1; + S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUSD(coeff, R) >> 16; + out2 = __SMUADX(coeff, R); +#else + out1 = __SMUADX(R, coeff) >> 16U; + out2 = __SMUSD(__QSUB(0, coeff), R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U)); + + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + i++; + l++; + + T = read_q15x2 (pSrc + (2 * i)); + in = ((int16_t) (T & 0xFFFF)) >> 1; + T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF); + + S = read_q15x2 (pSrc + (2 * l)); + in = ((int16_t) (S & 0xFFFF)) >> 1; + S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUSD(coeff, R) >> 16; + out2 = __SMUADX(coeff, R); +#else + out1 = __SMUADX(R, coeff) >> 16U; + out2 = __SMUSD(__QSUB(0, coeff), R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + + /* loop for stage */ + for (k = fftLen / 2; k > 2; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + /* loop for groups */ + for (j = 0; j < n2; j++) + { + coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U)); + + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = j; i < fftLen; i += n1) + { + l = i + n2; + + T = read_q15x2 (pSrc + (2 * i)); + + S = read_q15x2 (pSrc + (2 * l)); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUSD(coeff, R) >> 16; + out2 = __SMUADX(coeff, R); +#else + out1 = __SMUADX(R, coeff) >> 16U; + out2 = __SMUSD(__QSUB(0, coeff), R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + i += n1; + + l = i + n2; + + T = read_q15x2 (pSrc + (2 * i)); + + S = read_q15x2 (pSrc + (2 * l)); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __SHADD16(T, S)); + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUSD(coeff, R) >> 16; + out2 = __SMUADX(coeff, R); +#else + out1 = __SMUADX(R, coeff) >> 16U; + out2 = __SMUSD(__QSUB(0, coeff), R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + } /* butterfly loop end */ + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + } /* stages loop end */ + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + /* loop for groups */ + for (j = 0; j < n2; j++) + { + coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U)); + + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = j; i < fftLen; i += n1) + { + l = i + n2; + + T = read_q15x2 (pSrc + (2 * i)); + + S = read_q15x2 (pSrc + (2 * l)); + + R = __QSUB16(T, S); + + write_q15x2 (pSrc + (2 * i), __QADD16(T, S)); + + write_q15x2 (pSrc + (2 * l), R); + + } /* butterfly loop end */ + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + +#else /* #if defined (ARM_MATH_DSP) */ + + uint32_t i, j, k, l; + uint32_t n1, n2, ia; + q15_t xt, yt, cosVal, sinVal; + + // N = fftLen; + n2 = fftLen; + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + /* loop for groups */ + for (j = 0; j < n2; j++) + { + cosVal = pCoef[(ia * 2)]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = j; i < fftLen; i += n1) + { + l = i + n2; + xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U); + pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U; + + yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U); + pSrc[2 * i + 1] = ((pSrc[2 * l + 1] >> 1U) + + (pSrc[2 * i + 1] >> 1U) ) >> 1U; + + pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) - + ((int16_t) (((q31_t) yt * sinVal) >> 16))); + + pSrc[2 * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) + + ((int16_t) (((q31_t) xt * sinVal) >> 16))); + + } /* butterfly loop end */ + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + + /* loop for stage */ + for (k = fftLen / 2; k > 2; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + /* loop for groups */ + for (j = 0; j < n2; j++) + { + cosVal = pCoef[(ia * 2)]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = j; i < fftLen; i += n1) + { + l = i + n2; + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U; + + pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) - + ((int16_t) (((q31_t) yt * sinVal) >> 16)) ); + + pSrc[2 * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) + + ((int16_t) (((q31_t) xt * sinVal) >> 16)) ); + + } /* butterfly loop end */ + + } /* groups loop end */ + + twidCoefModifier = twidCoefModifier << 1U; + } /* stages loop end */ + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + cosVal = pCoef[(ia * 2)]; + sinVal = pCoef[(ia * 2) + 1]; + + ia = ia + twidCoefModifier; + + /* loop for butterfly */ + for (i = 0; i < fftLen; i += n1) + { + l = i + n2; + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); + + pSrc[2 * l] = xt; + + pSrc[2 * l + 1] = yt; + + } /* groups loop end */ + + +#endif /* #if defined (ARM_MATH_DSP) */ + +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q31.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q31.c new file mode 100644 index 0000000..6c79a65 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix2_q31.c @@ -0,0 +1,337 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix2_q31.c + * Description: Radix-2 Decimation in Frequency CFFT & CIFFT Fixed point processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +void arm_radix2_butterfly_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint16_t twidCoefModifier); + +void arm_radix2_butterfly_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint16_t twidCoefModifier); + +void arm_bitreversal_q31( + q31_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab); + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Processing function for the fixed-point CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q31 and will be removed in the future. + @param[in] S points to an instance of the fixed-point CFFT/CIFFT structure + @param[in,out] pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place + @return none + */ + +void arm_cfft_radix2_q31( + const arm_cfft_radix2_instance_q31 * S, + q31_t * pSrc) +{ + + if (S->ifftFlag == 1U) + { + arm_radix2_butterfly_inverse_q31(pSrc, S->fftLen, + S->pTwiddle, S->twidCoefModifier); + } + else + { + arm_radix2_butterfly_q31(pSrc, S->fftLen, + S->pTwiddle, S->twidCoefModifier); + } + + arm_bitreversal_q31(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); +} + +/** + @} end of ComplexFFT group + */ + +void arm_radix2_butterfly_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint16_t twidCoefModifier) +{ + + unsigned i, j, k, l, m; + unsigned n1, n2, ia; + q31_t xt, yt, cosVal, sinVal; + q31_t p0, p1; + + //N = fftLen; + n2 = fftLen; + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + // loop for groups + for (i = 0; i < n2; i++) + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + l = i + n2; + xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U); + pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U; + + yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U); + pSrc[2 * i + 1] = + ((pSrc[2 * l + 1] >> 1U) + (pSrc[2 * i + 1] >> 1U)) >> 1U; + + mult_32x32_keep32_R(p0, xt, cosVal); + mult_32x32_keep32_R(p1, yt, cosVal); + multAcc_32x32_keep32_R(p0, yt, sinVal); + multSub_32x32_keep32_R(p1, xt, sinVal); + + pSrc[2U * l] = p0; + pSrc[2U * l + 1U] = p1; + + } // groups loop end + + twidCoefModifier <<= 1U; + + // loop for stage + for (k = fftLen / 2; k > 2; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + // loop for groups + for (j = 0; j < n2; j++) + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + // loop for butterfly + i = j; + m = fftLen / n1; + do + { + l = i + n2; + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U; + + mult_32x32_keep32_R(p0, xt, cosVal); + mult_32x32_keep32_R(p1, yt, cosVal); + multAcc_32x32_keep32_R(p0, yt, sinVal); + multSub_32x32_keep32_R(p1, xt, sinVal); + + pSrc[2U * l] = p0; + pSrc[2U * l + 1U] = p1; + i += n1; + m--; + } while ( m > 0); // butterfly loop end + + } // groups loop end + + twidCoefModifier <<= 1U; + } // stages loop end + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + // loop for butterfly + for (i = 0; i < fftLen; i += n1) + { + l = i + n2; + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); + + pSrc[2U * l] = xt; + + pSrc[2U * l + 1U] = yt; + + i += n1; + l = i + n2; + + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); + + pSrc[2U * l] = xt; + + pSrc[2U * l + 1U] = yt; + + } // butterfly loop end + +} + + +void arm_radix2_butterfly_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint16_t twidCoefModifier) +{ + + unsigned i, j, k, l; + unsigned n1, n2, ia; + q31_t xt, yt, cosVal, sinVal; + q31_t p0, p1; + + //N = fftLen; + n2 = fftLen; + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + // loop for groups + for (i = 0; i < n2; i++) + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + l = i + n2; + xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U); + pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U; + + yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U); + pSrc[2 * i + 1] = + ((pSrc[2 * l + 1] >> 1U) + (pSrc[2 * i + 1] >> 1U)) >> 1U; + + mult_32x32_keep32_R(p0, xt, cosVal); + mult_32x32_keep32_R(p1, yt, cosVal); + multSub_32x32_keep32_R(p0, yt, sinVal); + multAcc_32x32_keep32_R(p1, xt, sinVal); + + pSrc[2U * l] = p0; + pSrc[2U * l + 1U] = p1; + } // groups loop end + + twidCoefModifier = twidCoefModifier << 1U; + + // loop for stage + for (k = fftLen / 2; k > 2; k = k >> 1) + { + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + // loop for groups + for (j = 0; j < n2; j++) + { + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + // loop for butterfly + for (i = j; i < fftLen; i += n1) + { + l = i + n2; + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U; + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U; + + mult_32x32_keep32_R(p0, xt, cosVal); + mult_32x32_keep32_R(p1, yt, cosVal); + multSub_32x32_keep32_R(p0, yt, sinVal); + multAcc_32x32_keep32_R(p1, xt, sinVal); + + pSrc[2U * l] = p0; + pSrc[2U * l + 1U] = p1; + } // butterfly loop end + + } // groups loop end + + twidCoefModifier = twidCoefModifier << 1U; + } // stages loop end + + n1 = n2; + n2 = n2 >> 1; + ia = 0; + + cosVal = pCoef[ia * 2]; + sinVal = pCoef[(ia * 2) + 1]; + ia = ia + twidCoefModifier; + + // loop for butterfly + for (i = 0; i < fftLen; i += n1) + { + l = i + n2; + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); + + pSrc[2U * l] = xt; + + pSrc[2U * l + 1U] = yt; + + i += n1; + l = i + n2; + + xt = pSrc[2 * i] - pSrc[2 * l]; + pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); + + yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; + pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); + + pSrc[2U * l] = xt; + + pSrc[2U * l + 1U] = yt; + + } // butterfly loop end + +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_f32.c new file mode 100644 index 0000000..9629145 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_f32.c @@ -0,0 +1,1200 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix4_f32.c + * Description: Radix-4 Decimation in Frequency CFFT & CIFFT Floating point processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +extern void arm_bitreversal_f32( + float32_t * pSrc, + uint16_t fftSize, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab); + +void arm_radix4_butterfly_f32( + float32_t * pSrc, + uint16_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier); + +void arm_radix4_butterfly_inverse_f32( + float32_t * pSrc, + uint16_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier, + float32_t onebyfftLen); + + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Processing function for the floating-point Radix-4 CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_f32 and will be removed in the future. + @param[in] S points to an instance of the floating-point Radix-4 CFFT/CIFFT structure + @param[in,out] pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place + @return none + */ + +void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc) +{ + if (S->ifftFlag == 1U) + { + /* Complex IFFT radix-4 */ + arm_radix4_butterfly_inverse_f32(pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier, S->onebyfftLen); + } + else + { + /* Complex FFT radix-4 */ + arm_radix4_butterfly_f32(pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier); + } + + if (S->bitReverseFlag == 1U) + { + /* Bit Reversal */ + arm_bitreversal_f32(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); + } + +} + +/** + @} end of ComplexFFT group + */ + +/* ---------------------------------------------------------------------- + * Internal helper function used by the FFTs + * ---------------------------------------------------------------------- */ + +/** + brief Core function for the floating-point CFFT butterfly process. + param[in,out] pSrc points to the in-place buffer of floating-point data type + param[in] fftLen length of the FFT + param[in] pCoef points to the twiddle coefficient buffer + param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table + return none + */ + +void arm_radix4_butterfly_f32( + float32_t * pSrc, + uint16_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier) +{ + float32_t co1, co2, co3, si1, si2, si3; + uint32_t ia1, ia2, ia3; + uint32_t i0, i1, i2, i3; + uint32_t n1, n2, j, k; + +#if defined (ARM_MATH_LOOPUNROLL) + + float32_t xaIn, yaIn, xbIn, ybIn, xcIn, ycIn, xdIn, ydIn; + float32_t Xaplusc, Xbplusd, Yaplusc, Ybplusd, Xaminusc, Xbminusd, Yaminusc, + Ybminusd; + float32_t Xb12C_out, Yb12C_out, Xc12C_out, Yc12C_out, Xd12C_out, Yd12C_out; + float32_t Xb12_out, Yb12_out, Xc12_out, Yc12_out, Xd12_out, Yd12_out; + float32_t *ptr1; + float32_t p0,p1,p2,p3,p4,p5; + float32_t a0,a1,a2,a3,a4,a5,a6,a7; + + /* Initializations for the first stage */ + n2 = fftLen; + n1 = n2; + + /* n2 = fftLen/4 */ + n2 >>= 2U; + i0 = 0U; + ia1 = 0U; + + j = n2; + + /* Calculation of first stage */ + do + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + xaIn = pSrc[(2U * i0)]; + yaIn = pSrc[(2U * i0) + 1U]; + + xbIn = pSrc[(2U * i1)]; + ybIn = pSrc[(2U * i1) + 1U]; + + xcIn = pSrc[(2U * i2)]; + ycIn = pSrc[(2U * i2) + 1U]; + + xdIn = pSrc[(2U * i3)]; + ydIn = pSrc[(2U * i3) + 1U]; + + /* xa + xc */ + Xaplusc = xaIn + xcIn; + /* xb + xd */ + Xbplusd = xbIn + xdIn; + /* ya + yc */ + Yaplusc = yaIn + ycIn; + /* yb + yd */ + Ybplusd = ybIn + ydIn; + + /* index calculation for the coefficients */ + ia2 = ia1 + ia1; + co2 = pCoef[ia2 * 2U]; + si2 = pCoef[(ia2 * 2U) + 1U]; + + /* xa - xc */ + Xaminusc = xaIn - xcIn; + /* xb - xd */ + Xbminusd = xbIn - xdIn; + /* ya - yc */ + Yaminusc = yaIn - ycIn; + /* yb - yd */ + Ybminusd = ybIn - ydIn; + + /* xa' = xa + xb + xc + xd */ + pSrc[(2U * i0)] = Xaplusc + Xbplusd; + /* ya' = ya + yb + yc + yd */ + pSrc[(2U * i0) + 1U] = Yaplusc + Ybplusd; + + /* (xa - xc) + (yb - yd) */ + Xb12C_out = (Xaminusc + Ybminusd); + /* (ya - yc) + (xb - xd) */ + Yb12C_out = (Yaminusc - Xbminusd); + /* (xa + xc) - (xb + xd) */ + Xc12C_out = (Xaplusc - Xbplusd); + /* (ya + yc) - (yb + yd) */ + Yc12C_out = (Yaplusc - Ybplusd); + /* (xa - xc) - (yb - yd) */ + Xd12C_out = (Xaminusc - Ybminusd); + /* (ya - yc) + (xb - xd) */ + Yd12C_out = (Xbminusd + Yaminusc); + + co1 = pCoef[ia1 * 2U]; + si1 = pCoef[(ia1 * 2U) + 1U]; + + /* index calculation for the coefficients */ + ia3 = ia2 + ia1; + co3 = pCoef[ia3 * 2U]; + si3 = pCoef[(ia3 * 2U) + 1U]; + + Xb12_out = Xb12C_out * co1; + Yb12_out = Yb12C_out * co1; + Xc12_out = Xc12C_out * co2; + Yc12_out = Yc12C_out * co2; + Xd12_out = Xd12C_out * co3; + Yd12_out = Yd12C_out * co3; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + //Xb12_out -= Yb12C_out * si1; + p0 = Yb12C_out * si1; + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + //Yb12_out += Xb12C_out * si1; + p1 = Xb12C_out * si1; + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + //Xc12_out -= Yc12C_out * si2; + p2 = Yc12C_out * si2; + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + //Yc12_out += Xc12C_out * si2; + p3 = Xc12C_out * si2; + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + //Xd12_out -= Yd12C_out * si3; + p4 = Yd12C_out * si3; + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + //Yd12_out += Xd12C_out * si3; + p5 = Xd12C_out * si3; + + Xb12_out += p0; + Yb12_out -= p1; + Xc12_out += p2; + Yc12_out -= p3; + Xd12_out += p4; + Yd12_out -= p5; + + /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = Xc12_out; + + /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = Yc12_out; + + /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = Xb12_out; + + /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = Yb12_out; + + /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = Xd12_out; + + /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = Yd12_out; + + /* Twiddle coefficients index modifier */ + ia1 += twidCoefModifier; + + /* Updating input index */ + i0++; + + } + while (--j); + + twidCoefModifier <<= 2U; + + /* Calculation of second stage to excluding last stage */ + for (k = fftLen >> 2U; k > 4U; k >>= 2U) + { + /* Initializations for the first stage */ + n1 = n2; + n2 >>= 2U; + ia1 = 0U; + + /* Calculation of first stage */ + j = 0; + do + { + /* index calculation for the coefficients */ + ia2 = ia1 + ia1; + ia3 = ia2 + ia1; + co1 = pCoef[(ia1 * 2U)]; + si1 = pCoef[(ia1 * 2U) + 1U]; + co2 = pCoef[(ia2 * 2U)]; + si2 = pCoef[(ia2 * 2U) + 1U]; + co3 = pCoef[(ia3 * 2U)]; + si3 = pCoef[(ia3 * 2U) + 1U]; + + /* Twiddle coefficients index modifier */ + ia1 += twidCoefModifier; + + i0 = j; + do + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + xaIn = pSrc[(2U * i0)]; + yaIn = pSrc[(2U * i0) + 1U]; + + xbIn = pSrc[(2U * i1)]; + ybIn = pSrc[(2U * i1) + 1U]; + + xcIn = pSrc[(2U * i2)]; + ycIn = pSrc[(2U * i2) + 1U]; + + xdIn = pSrc[(2U * i3)]; + ydIn = pSrc[(2U * i3) + 1U]; + + /* xa - xc */ + Xaminusc = xaIn - xcIn; + /* (xb - xd) */ + Xbminusd = xbIn - xdIn; + /* ya - yc */ + Yaminusc = yaIn - ycIn; + /* (yb - yd) */ + Ybminusd = ybIn - ydIn; + + /* xa + xc */ + Xaplusc = xaIn + xcIn; + /* xb + xd */ + Xbplusd = xbIn + xdIn; + /* ya + yc */ + Yaplusc = yaIn + ycIn; + /* yb + yd */ + Ybplusd = ybIn + ydIn; + + /* (xa - xc) + (yb - yd) */ + Xb12C_out = (Xaminusc + Ybminusd); + /* (ya - yc) - (xb - xd) */ + Yb12C_out = (Yaminusc - Xbminusd); + /* xa + xc -(xb + xd) */ + Xc12C_out = (Xaplusc - Xbplusd); + /* (ya + yc) - (yb + yd) */ + Yc12C_out = (Yaplusc - Ybplusd); + /* (xa - xc) - (yb - yd) */ + Xd12C_out = (Xaminusc - Ybminusd); + /* (ya - yc) + (xb - xd) */ + Yd12C_out = (Xbminusd + Yaminusc); + + pSrc[(2U * i0)] = Xaplusc + Xbplusd; + pSrc[(2U * i0) + 1U] = Yaplusc + Ybplusd; + + Xb12_out = Xb12C_out * co1; + Yb12_out = Yb12C_out * co1; + Xc12_out = Xc12C_out * co2; + Yc12_out = Yc12C_out * co2; + Xd12_out = Xd12C_out * co3; + Yd12_out = Yd12C_out * co3; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + //Xb12_out -= Yb12C_out * si1; + p0 = Yb12C_out * si1; + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + //Yb12_out += Xb12C_out * si1; + p1 = Xb12C_out * si1; + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + //Xc12_out -= Yc12C_out * si2; + p2 = Yc12C_out * si2; + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + //Yc12_out += Xc12C_out * si2; + p3 = Xc12C_out * si2; + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + //Xd12_out -= Yd12C_out * si3; + p4 = Yd12C_out * si3; + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + //Yd12_out += Xd12C_out * si3; + p5 = Xd12C_out * si3; + + Xb12_out += p0; + Yb12_out -= p1; + Xc12_out += p2; + Yc12_out -= p3; + Xd12_out += p4; + Yd12_out -= p5; + + /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = Xc12_out; + + /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = Yc12_out; + + /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = Xb12_out; + + /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = Yb12_out; + + /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = Xd12_out; + + /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = Yd12_out; + + i0 += n1; + } while (i0 < fftLen); + j++; + } while (j <= (n2 - 1U)); + twidCoefModifier <<= 2U; + } + + j = fftLen >> 2; + ptr1 = &pSrc[0]; + + /* Calculations of last stage */ + do + { + xaIn = ptr1[0]; + yaIn = ptr1[1]; + xbIn = ptr1[2]; + ybIn = ptr1[3]; + xcIn = ptr1[4]; + ycIn = ptr1[5]; + xdIn = ptr1[6]; + ydIn = ptr1[7]; + + /* xa + xc */ + Xaplusc = xaIn + xcIn; + + /* xa - xc */ + Xaminusc = xaIn - xcIn; + + /* ya + yc */ + Yaplusc = yaIn + ycIn; + + /* ya - yc */ + Yaminusc = yaIn - ycIn; + + /* xb + xd */ + Xbplusd = xbIn + xdIn; + + /* yb + yd */ + Ybplusd = ybIn + ydIn; + + /* (xb-xd) */ + Xbminusd = xbIn - xdIn; + + /* (yb-yd) */ + Ybminusd = ybIn - ydIn; + + /* xa' = xa + xb + xc + xd */ + a0 = (Xaplusc + Xbplusd); + /* ya' = ya + yb + yc + yd */ + a1 = (Yaplusc + Ybplusd); + /* xc' = (xa-xb+xc-xd) */ + a2 = (Xaplusc - Xbplusd); + /* yc' = (ya-yb+yc-yd) */ + a3 = (Yaplusc - Ybplusd); + /* xb' = (xa+yb-xc-yd) */ + a4 = (Xaminusc + Ybminusd); + /* yb' = (ya-xb-yc+xd) */ + a5 = (Yaminusc - Xbminusd); + /* xd' = (xa-yb-xc+yd)) */ + a6 = (Xaminusc - Ybminusd); + /* yd' = (ya+xb-yc-xd) */ + a7 = (Xbminusd + Yaminusc); + + ptr1[0] = a0; + ptr1[1] = a1; + ptr1[2] = a2; + ptr1[3] = a3; + ptr1[4] = a4; + ptr1[5] = a5; + ptr1[6] = a6; + ptr1[7] = a7; + + /* increment pointer by 8 */ + ptr1 += 8U; + } while (--j); + +#else + + float32_t t1, t2, r1, r2, s1, s2; + + /* Initializations for the fft calculation */ + n2 = fftLen; + n1 = n2; + for (k = fftLen; k > 1U; k >>= 2U) + { + /* Initializations for the fft calculation */ + n1 = n2; + n2 >>= 2U; + ia1 = 0U; + + /* FFT Calculation */ + j = 0; + do + { + /* index calculation for the coefficients */ + ia2 = ia1 + ia1; + ia3 = ia2 + ia1; + co1 = pCoef[ia1 * 2U]; + si1 = pCoef[(ia1 * 2U) + 1U]; + co2 = pCoef[ia2 * 2U]; + si2 = pCoef[(ia2 * 2U) + 1U]; + co3 = pCoef[ia3 * 2U]; + si3 = pCoef[(ia3 * 2U) + 1U]; + + /* Twiddle coefficients index modifier */ + ia1 = ia1 + twidCoefModifier; + + i0 = j; + do + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* xa + xc */ + r1 = pSrc[(2U * i0)] + pSrc[(2U * i2)]; + + /* xa - xc */ + r2 = pSrc[(2U * i0)] - pSrc[(2U * i2)]; + + /* ya + yc */ + s1 = pSrc[(2U * i0) + 1U] + pSrc[(2U * i2) + 1U]; + + /* ya - yc */ + s2 = pSrc[(2U * i0) + 1U] - pSrc[(2U * i2) + 1U]; + + /* xb + xd */ + t1 = pSrc[2U * i1] + pSrc[2U * i3]; + + /* xa' = xa + xb + xc + xd */ + pSrc[2U * i0] = r1 + t1; + + /* xa + xc -(xb + xd) */ + r1 = r1 - t1; + + /* yb + yd */ + t2 = pSrc[(2U * i1) + 1U] + pSrc[(2U * i3) + 1U]; + + /* ya' = ya + yb + yc + yd */ + pSrc[(2U * i0) + 1U] = s1 + t2; + + /* (ya + yc) - (yb + yd) */ + s1 = s1 - t2; + + /* (yb - yd) */ + t1 = pSrc[(2U * i1) + 1U] - pSrc[(2U * i3) + 1U]; + + /* (xb - xd) */ + t2 = pSrc[2U * i1] - pSrc[2U * i3]; + + /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = (r1 * co2) + (s1 * si2); + + /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = (s1 * co2) - (r1 * si2); + + /* (xa - xc) + (yb - yd) */ + r1 = r2 + t1; + + /* (xa - xc) - (yb - yd) */ + r2 = r2 - t1; + + /* (ya - yc) - (xb - xd) */ + s1 = s2 - t2; + + /* (ya - yc) + (xb - xd) */ + s2 = s2 + t2; + + /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = (r1 * co1) + (s1 * si1); + + /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = (s1 * co1) - (r1 * si1); + + /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = (r2 * co3) + (s2 * si3); + + /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = (s2 * co3) - (r2 * si3); + + i0 += n1; + } while ( i0 < fftLen); + j++; + } while (j <= (n2 - 1U)); + twidCoefModifier <<= 2U; + } + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + +} + +/** + brief Core function for the floating-point CIFFT butterfly process. + param[in,out] pSrc points to the in-place buffer of floating-point data type + param[in] fftLen length of the FFT + param[in] pCoef points to twiddle coefficient buffer + param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + param[in] onebyfftLen value of 1/fftLen + return none + */ + +void arm_radix4_butterfly_inverse_f32( + float32_t * pSrc, + uint16_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier, + float32_t onebyfftLen) +{ + float32_t co1, co2, co3, si1, si2, si3; + uint32_t ia1, ia2, ia3; + uint32_t i0, i1, i2, i3; + uint32_t n1, n2, j, k; + +#if defined (ARM_MATH_LOOPUNROLL) + + float32_t xaIn, yaIn, xbIn, ybIn, xcIn, ycIn, xdIn, ydIn; + float32_t Xaplusc, Xbplusd, Yaplusc, Ybplusd, Xaminusc, Xbminusd, Yaminusc, + Ybminusd; + float32_t Xb12C_out, Yb12C_out, Xc12C_out, Yc12C_out, Xd12C_out, Yd12C_out; + float32_t Xb12_out, Yb12_out, Xc12_out, Yc12_out, Xd12_out, Yd12_out; + float32_t *ptr1; + float32_t p0,p1,p2,p3,p4,p5,p6,p7; + float32_t a0,a1,a2,a3,a4,a5,a6,a7; + + + /* Initializations for the first stage */ + n2 = fftLen; + n1 = n2; + + /* n2 = fftLen/4 */ + n2 >>= 2U; + i0 = 0U; + ia1 = 0U; + + j = n2; + + /* Calculation of first stage */ + do + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Butterfly implementation */ + xaIn = pSrc[(2U * i0)]; + yaIn = pSrc[(2U * i0) + 1U]; + + xcIn = pSrc[(2U * i2)]; + ycIn = pSrc[(2U * i2) + 1U]; + + xbIn = pSrc[(2U * i1)]; + ybIn = pSrc[(2U * i1) + 1U]; + + xdIn = pSrc[(2U * i3)]; + ydIn = pSrc[(2U * i3) + 1U]; + + /* xa + xc */ + Xaplusc = xaIn + xcIn; + /* xb + xd */ + Xbplusd = xbIn + xdIn; + /* ya + yc */ + Yaplusc = yaIn + ycIn; + /* yb + yd */ + Ybplusd = ybIn + ydIn; + + /* index calculation for the coefficients */ + ia2 = ia1 + ia1; + co2 = pCoef[ia2 * 2U]; + si2 = pCoef[(ia2 * 2U) + 1U]; + + /* xa - xc */ + Xaminusc = xaIn - xcIn; + /* xb - xd */ + Xbminusd = xbIn - xdIn; + /* ya - yc */ + Yaminusc = yaIn - ycIn; + /* yb - yd */ + Ybminusd = ybIn - ydIn; + + /* xa' = xa + xb + xc + xd */ + pSrc[(2U * i0)] = Xaplusc + Xbplusd; + + /* ya' = ya + yb + yc + yd */ + pSrc[(2U * i0) + 1U] = Yaplusc + Ybplusd; + + /* (xa - xc) - (yb - yd) */ + Xb12C_out = (Xaminusc - Ybminusd); + /* (ya - yc) + (xb - xd) */ + Yb12C_out = (Yaminusc + Xbminusd); + /* (xa + xc) - (xb + xd) */ + Xc12C_out = (Xaplusc - Xbplusd); + /* (ya + yc) - (yb + yd) */ + Yc12C_out = (Yaplusc - Ybplusd); + /* (xa - xc) + (yb - yd) */ + Xd12C_out = (Xaminusc + Ybminusd); + /* (ya - yc) - (xb - xd) */ + Yd12C_out = (Yaminusc - Xbminusd); + + co1 = pCoef[ia1 * 2U]; + si1 = pCoef[(ia1 * 2U) + 1U]; + + /* index calculation for the coefficients */ + ia3 = ia2 + ia1; + co3 = pCoef[ia3 * 2U]; + si3 = pCoef[(ia3 * 2U) + 1U]; + + Xb12_out = Xb12C_out * co1; + Yb12_out = Yb12C_out * co1; + Xc12_out = Xc12C_out * co2; + Yc12_out = Yc12C_out * co2; + Xd12_out = Xd12C_out * co3; + Yd12_out = Yd12C_out * co3; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + //Xb12_out -= Yb12C_out * si1; + p0 = Yb12C_out * si1; + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + //Yb12_out += Xb12C_out * si1; + p1 = Xb12C_out * si1; + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + //Xc12_out -= Yc12C_out * si2; + p2 = Yc12C_out * si2; + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + //Yc12_out += Xc12C_out * si2; + p3 = Xc12C_out * si2; + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + //Xd12_out -= Yd12C_out * si3; + p4 = Yd12C_out * si3; + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + //Yd12_out += Xd12C_out * si3; + p5 = Xd12C_out * si3; + + Xb12_out -= p0; + Yb12_out += p1; + Xc12_out -= p2; + Yc12_out += p3; + Xd12_out -= p4; + Yd12_out += p5; + + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = Xc12_out; + + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = Yc12_out; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = Xb12_out; + + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = Yb12_out; + + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = Xd12_out; + + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = Yd12_out; + + /* Twiddle coefficients index modifier */ + ia1 = ia1 + twidCoefModifier; + + /* Updating input index */ + i0 = i0 + 1U; + + } while (--j); + + twidCoefModifier <<= 2U; + + /* Calculation of second stage to excluding last stage */ + for (k = fftLen >> 2U; k > 4U; k >>= 2U) + { + /* Initializations for the first stage */ + n1 = n2; + n2 >>= 2U; + ia1 = 0U; + + /* Calculation of first stage */ + j = 0; + do + { + /* index calculation for the coefficients */ + ia2 = ia1 + ia1; + ia3 = ia2 + ia1; + co1 = pCoef[ia1 * 2U]; + si1 = pCoef[(ia1 * 2U) + 1U]; + co2 = pCoef[ia2 * 2U]; + si2 = pCoef[(ia2 * 2U) + 1U]; + co3 = pCoef[ia3 * 2U]; + si3 = pCoef[(ia3 * 2U) + 1U]; + + /* Twiddle coefficients index modifier */ + ia1 = ia1 + twidCoefModifier; + + i0 = j; + do + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + xaIn = pSrc[(2U * i0)]; + yaIn = pSrc[(2U * i0) + 1U]; + + xbIn = pSrc[(2U * i1)]; + ybIn = pSrc[(2U * i1) + 1U]; + + xcIn = pSrc[(2U * i2)]; + ycIn = pSrc[(2U * i2) + 1U]; + + xdIn = pSrc[(2U * i3)]; + ydIn = pSrc[(2U * i3) + 1U]; + + /* xa - xc */ + Xaminusc = xaIn - xcIn; + /* (xb - xd) */ + Xbminusd = xbIn - xdIn; + /* ya - yc */ + Yaminusc = yaIn - ycIn; + /* (yb - yd) */ + Ybminusd = ybIn - ydIn; + + /* xa + xc */ + Xaplusc = xaIn + xcIn; + /* xb + xd */ + Xbplusd = xbIn + xdIn; + /* ya + yc */ + Yaplusc = yaIn + ycIn; + /* yb + yd */ + Ybplusd = ybIn + ydIn; + + /* (xa - xc) - (yb - yd) */ + Xb12C_out = (Xaminusc - Ybminusd); + /* (ya - yc) + (xb - xd) */ + Yb12C_out = (Yaminusc + Xbminusd); + /* xa + xc -(xb + xd) */ + Xc12C_out = (Xaplusc - Xbplusd); + /* (ya + yc) - (yb + yd) */ + Yc12C_out = (Yaplusc - Ybplusd); + /* (xa - xc) + (yb - yd) */ + Xd12C_out = (Xaminusc + Ybminusd); + /* (ya - yc) - (xb - xd) */ + Yd12C_out = (Yaminusc - Xbminusd); + + pSrc[(2U * i0)] = Xaplusc + Xbplusd; + pSrc[(2U * i0) + 1U] = Yaplusc + Ybplusd; + + Xb12_out = Xb12C_out * co1; + Yb12_out = Yb12C_out * co1; + Xc12_out = Xc12C_out * co2; + Yc12_out = Yc12C_out * co2; + Xd12_out = Xd12C_out * co3; + Yd12_out = Yd12C_out * co3; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + //Xb12_out -= Yb12C_out * si1; + p0 = Yb12C_out * si1; + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + //Yb12_out += Xb12C_out * si1; + p1 = Xb12C_out * si1; + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + //Xc12_out -= Yc12C_out * si2; + p2 = Yc12C_out * si2; + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + //Yc12_out += Xc12C_out * si2; + p3 = Xc12C_out * si2; + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + //Xd12_out -= Yd12C_out * si3; + p4 = Yd12C_out * si3; + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + //Yd12_out += Xd12C_out * si3; + p5 = Xd12C_out * si3; + + Xb12_out -= p0; + Yb12_out += p1; + Xc12_out -= p2; + Yc12_out += p3; + Xd12_out -= p4; + Yd12_out += p5; + + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = Xc12_out; + + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = Yc12_out; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = Xb12_out; + + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = Yb12_out; + + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = Xd12_out; + + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = Yd12_out; + + i0 += n1; + } while (i0 < fftLen); + j++; + } while (j <= (n2 - 1U)); + twidCoefModifier <<= 2U; + } + /* Initializations of last stage */ + + j = fftLen >> 2; + ptr1 = &pSrc[0]; + + /* Calculations of last stage */ + do + { + xaIn = ptr1[0]; + yaIn = ptr1[1]; + xbIn = ptr1[2]; + ybIn = ptr1[3]; + xcIn = ptr1[4]; + ycIn = ptr1[5]; + xdIn = ptr1[6]; + ydIn = ptr1[7]; + + /* Butterfly implementation */ + /* xa + xc */ + Xaplusc = xaIn + xcIn; + + /* xa - xc */ + Xaminusc = xaIn - xcIn; + + /* ya + yc */ + Yaplusc = yaIn + ycIn; + + /* ya - yc */ + Yaminusc = yaIn - ycIn; + + /* xb + xd */ + Xbplusd = xbIn + xdIn; + + /* yb + yd */ + Ybplusd = ybIn + ydIn; + + /* (xb-xd) */ + Xbminusd = xbIn - xdIn; + + /* (yb-yd) */ + Ybminusd = ybIn - ydIn; + + /* xa' = (xa+xb+xc+xd) * onebyfftLen */ + a0 = (Xaplusc + Xbplusd); + /* ya' = (ya+yb+yc+yd) * onebyfftLen */ + a1 = (Yaplusc + Ybplusd); + /* xc' = (xa-xb+xc-xd) * onebyfftLen */ + a2 = (Xaplusc - Xbplusd); + /* yc' = (ya-yb+yc-yd) * onebyfftLen */ + a3 = (Yaplusc - Ybplusd); + /* xb' = (xa-yb-xc+yd) * onebyfftLen */ + a4 = (Xaminusc - Ybminusd); + /* yb' = (ya+xb-yc-xd) * onebyfftLen */ + a5 = (Yaminusc + Xbminusd); + /* xd' = (xa-yb-xc+yd) * onebyfftLen */ + a6 = (Xaminusc + Ybminusd); + /* yd' = (ya-xb-yc+xd) * onebyfftLen */ + a7 = (Yaminusc - Xbminusd); + + p0 = a0 * onebyfftLen; + p1 = a1 * onebyfftLen; + p2 = a2 * onebyfftLen; + p3 = a3 * onebyfftLen; + p4 = a4 * onebyfftLen; + p5 = a5 * onebyfftLen; + p6 = a6 * onebyfftLen; + p7 = a7 * onebyfftLen; + + /* xa' = (xa+xb+xc+xd) * onebyfftLen */ + ptr1[0] = p0; + /* ya' = (ya+yb+yc+yd) * onebyfftLen */ + ptr1[1] = p1; + /* xc' = (xa-xb+xc-xd) * onebyfftLen */ + ptr1[2] = p2; + /* yc' = (ya-yb+yc-yd) * onebyfftLen */ + ptr1[3] = p3; + /* xb' = (xa-yb-xc+yd) * onebyfftLen */ + ptr1[4] = p4; + /* yb' = (ya+xb-yc-xd) * onebyfftLen */ + ptr1[5] = p5; + /* xd' = (xa-yb-xc+yd) * onebyfftLen */ + ptr1[6] = p6; + /* yd' = (ya-xb-yc+xd) * onebyfftLen */ + ptr1[7] = p7; + + /* increment source pointer by 8 for next calculations */ + ptr1 = ptr1 + 8U; + + } while (--j); + +#else + + float32_t t1, t2, r1, r2, s1, s2; + + /* Initializations for the first stage */ + n2 = fftLen; + n1 = n2; + + /* Calculation of first stage */ + for (k = fftLen; k > 4U; k >>= 2U) + { + /* Initializations for the first stage */ + n1 = n2; + n2 >>= 2U; + ia1 = 0U; + + /* Calculation of first stage */ + j = 0; + do + { + /* index calculation for the coefficients */ + ia2 = ia1 + ia1; + ia3 = ia2 + ia1; + co1 = pCoef[ia1 * 2U]; + si1 = pCoef[(ia1 * 2U) + 1U]; + co2 = pCoef[ia2 * 2U]; + si2 = pCoef[(ia2 * 2U) + 1U]; + co3 = pCoef[ia3 * 2U]; + si3 = pCoef[(ia3 * 2U) + 1U]; + + /* Twiddle coefficients index modifier */ + ia1 = ia1 + twidCoefModifier; + + i0 = j; + do + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* xa + xc */ + r1 = pSrc[(2U * i0)] + pSrc[(2U * i2)]; + + /* xa - xc */ + r2 = pSrc[(2U * i0)] - pSrc[(2U * i2)]; + + /* ya + yc */ + s1 = pSrc[(2U * i0) + 1U] + pSrc[(2U * i2) + 1U]; + + /* ya - yc */ + s2 = pSrc[(2U * i0) + 1U] - pSrc[(2U * i2) + 1U]; + + /* xb + xd */ + t1 = pSrc[2U * i1] + pSrc[2U * i3]; + + /* xa' = xa + xb + xc + xd */ + pSrc[2U * i0] = r1 + t1; + + /* xa + xc -(xb + xd) */ + r1 = r1 - t1; + + /* yb + yd */ + t2 = pSrc[(2U * i1) + 1U] + pSrc[(2U * i3) + 1U]; + + /* ya' = ya + yb + yc + yd */ + pSrc[(2U * i0) + 1U] = s1 + t2; + + /* (ya + yc) - (yb + yd) */ + s1 = s1 - t2; + + /* (yb - yd) */ + t1 = pSrc[(2U * i1) + 1U] - pSrc[(2U * i3) + 1U]; + + /* (xb - xd) */ + t2 = pSrc[2U * i1] - pSrc[2U * i3]; + + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = (r1 * co2) - (s1 * si2); + + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = (s1 * co2) + (r1 * si2); + + /* (xa - xc) - (yb - yd) */ + r1 = r2 - t1; + + /* (xa - xc) + (yb - yd) */ + r2 = r2 + t1; + + /* (ya - yc) + (xb - xd) */ + s1 = s2 + t2; + + /* (ya - yc) - (xb - xd) */ + s2 = s2 - t2; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = (r1 * co1) - (s1 * si1); + + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = (s1 * co1) + (r1 * si1); + + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = (r2 * co3) - (s2 * si3); + + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = (s2 * co3) + (r2 * si3); + + i0 += n1; + } while ( i0 < fftLen); + j++; + } while (j <= (n2 - 1U)); + twidCoefModifier <<= 2U; + } + /* Initializations of last stage */ + n1 = n2; + n2 >>= 2U; + + /* Calculations of last stage */ + for (i0 = 0U; i0 <= (fftLen - n1); i0 += n1) + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Butterfly implementation */ + /* xa + xc */ + r1 = pSrc[2U * i0] + pSrc[2U * i2]; + + /* xa - xc */ + r2 = pSrc[2U * i0] - pSrc[2U * i2]; + + /* ya + yc */ + s1 = pSrc[(2U * i0) + 1U] + pSrc[(2U * i2) + 1U]; + + /* ya - yc */ + s2 = pSrc[(2U * i0) + 1U] - pSrc[(2U * i2) + 1U]; + + /* xc + xd */ + t1 = pSrc[2U * i1] + pSrc[2U * i3]; + + /* xa' = xa + xb + xc + xd */ + pSrc[2U * i0] = (r1 + t1) * onebyfftLen; + + /* (xa + xb) - (xc + xd) */ + r1 = r1 - t1; + + /* yb + yd */ + t2 = pSrc[(2U * i1) + 1U] + pSrc[(2U * i3) + 1U]; + + /* ya' = ya + yb + yc + yd */ + pSrc[(2U * i0) + 1U] = (s1 + t2) * onebyfftLen; + + /* (ya + yc) - (yb + yd) */ + s1 = s1 - t2; + + /* (yb-yd) */ + t1 = pSrc[(2U * i1) + 1U] - pSrc[(2U * i3) + 1U]; + + /* (xb-xd) */ + t2 = pSrc[2U * i1] - pSrc[2U * i3]; + + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = r1 * onebyfftLen; + + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = s1 * onebyfftLen; + + /* (xa - xc) - (yb-yd) */ + r1 = r2 - t1; + + /* (xa - xc) + (yb-yd) */ + r2 = r2 + t1; + + /* (ya - yc) + (xb-xd) */ + s1 = s2 + t2; + + /* (ya - yc) - (xb-xd) */ + s2 = s2 - t2; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = r1 * onebyfftLen; + + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = s1 * onebyfftLen; + + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = r2 * onebyfftLen; + + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = s2 * onebyfftLen; + } + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ +} + + diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_f32.c new file mode 100644 index 0000000..930c2c1 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_f32.c @@ -0,0 +1,156 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix4_init_f32.c + * Description: Radix-4 Decimation in Frequency Floating-point CFFT & CIFFT Initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Initialization function for the floating-point CFFT/CIFFT. + @deprecated Do not use this function. It has been superceded by \ref arm_cfft_f32 and will be removed in the future. + @param[in,out] S points to an instance of the floating-point CFFT/CIFFT structure + @param[in] fftLen length of the FFT + @param[in] ifftFlag flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLen is not a supported length + + @par Details + The parameter ifftFlag controls whether a forward or inverse transform is computed. + Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated + @par + The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. + Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. + @par + The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. + @par + This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. + */ + +arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + /* Initialise the FFT length */ + S->fftLen = fftLen; + + /* Initialise the Twiddle coefficient pointer */ + S->pTwiddle = (float32_t *) twiddleCoef; + + /* Initialise the Flag for selection of CFFT or CIFFT */ + S->ifftFlag = ifftFlag; + + /* Initialise the Flag for calculation Bit reversal or not */ + S->bitReverseFlag = bitReverseFlag; + + /* Initializations of structure parameters depending on the FFT length */ + switch (S->fftLen) + { + + case 4096U: + /* Initializations of structure parameters for 4096 point FFT */ + + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 1U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 1U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) armBitRevTable; + /* Initialise the 1/fftLen Value */ + S->onebyfftLen = 0.000244140625; + break; + + case 1024U: + /* Initializations of structure parameters for 1024 point FFT */ + + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 4U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 4U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; + /* Initialise the 1/fftLen Value */ + S->onebyfftLen = 0.0009765625f; + break; + + + case 256U: + /* Initializations of structure parameters for 256 point FFT */ + S->twidCoefModifier = 16U; + S->bitRevFactor = 16U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; + S->onebyfftLen = 0.00390625f; + break; + + case 64U: + /* Initializations of structure parameters for 64 point FFT */ + S->twidCoefModifier = 64U; + S->bitRevFactor = 64U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; + S->onebyfftLen = 0.015625f; + break; + + case 16U: + /* Initializations of structure parameters for 16 point FFT */ + S->twidCoefModifier = 256U; + S->bitRevFactor = 256U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; + S->onebyfftLen = 0.0625f; + break; + + + default: + /* Reporting argument error if fftSize is not valid value */ + status = ARM_MATH_ARGUMENT_ERROR; + break; + } + + return (status); +} + +/** + @} end of ComplexFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q15.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q15.c new file mode 100644 index 0000000..0090688 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q15.c @@ -0,0 +1,145 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix4_init_q15.c + * Description: Radix-4 Decimation in Frequency Q15 FFT & IFFT initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupTransforms + */ + + +/** + @addtogroup ComplexFFT + @{ + */ + + +/** + @brief Initialization function for the Q15 CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed in the future. + @param[in,out] S points to an instance of the Q15 CFFT/CIFFT structure + @param[in] fftLen length of the FFT + @param[in] ifftFlag flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLen is not a supported length + + @par Details + The parameter ifftFlag controls whether a forward or inverse transform is computed. + Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated + @par + The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. + Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. + @par + The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. + @par + This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. + */ + +arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + /* Initialise the FFT length */ + S->fftLen = fftLen; + /* Initialise the Twiddle coefficient pointer */ + S->pTwiddle = (q15_t *) twiddleCoef_4096_q15; + /* Initialise the Flag for selection of CFFT or CIFFT */ + S->ifftFlag = ifftFlag; + /* Initialise the Flag for calculation Bit reversal or not */ + S->bitReverseFlag = bitReverseFlag; + + /* Initializations of structure parameters depending on the FFT length */ + switch (S->fftLen) + { + case 4096U: + /* Initializations of structure parameters for 4096 point FFT */ + + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 1U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 1U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) armBitRevTable; + + break; + + case 1024U: + /* Initializations of structure parameters for 1024 point FFT */ + S->twidCoefModifier = 4U; + S->bitRevFactor = 4U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; + + break; + + case 256U: + /* Initializations of structure parameters for 256 point FFT */ + S->twidCoefModifier = 16U; + S->bitRevFactor = 16U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; + + break; + + case 64U: + /* Initializations of structure parameters for 64 point FFT */ + S->twidCoefModifier = 64U; + S->bitRevFactor = 64U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; + + break; + + case 16U: + /* Initializations of structure parameters for 16 point FFT */ + S->twidCoefModifier = 256U; + S->bitRevFactor = 256U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; + + break; + + default: + /* Reporting argument error if fftSize is not valid value */ + status = ARM_MATH_ARGUMENT_ERROR; + break; + } + + return (status); +} + +/** + @} end of ComplexFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q31.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q31.c new file mode 100644 index 0000000..17d16b7 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_init_q31.c @@ -0,0 +1,141 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix4_init_q31.c + * Description: Radix-4 Decimation in Frequency Q31 FFT & IFFT initialization function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + + @brief Initialization function for the Q31 CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q31 and will be removed in the future. + @param[in,out] S points to an instance of the Q31 CFFT/CIFFT structure. + @param[in] fftLen length of the FFT. + @param[in] ifftFlag flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLen is not a supported length + + @par Details + The parameter ifftFlag controls whether a forward or inverse transform is computed. + Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated + @par + The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. + Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. + @par + The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. + @par + This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. +*/ + +arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag) +{ + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + /* Initialise the FFT length */ + S->fftLen = fftLen; + /* Initialise the Twiddle coefficient pointer */ + S->pTwiddle = (q31_t *) twiddleCoef_4096_q31; + /* Initialise the Flag for selection of CFFT or CIFFT */ + S->ifftFlag = ifftFlag; + /* Initialise the Flag for calculation Bit reversal or not */ + S->bitReverseFlag = bitReverseFlag; + + /* Initializations of Instance structure depending on the FFT length */ + switch (S->fftLen) + { + /* Initializations of structure parameters for 4096 point FFT */ + case 4096U: + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 1U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 1U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) armBitRevTable; + break; + + /* Initializations of structure parameters for 1024 point FFT */ + case 1024U: + /* Initialise the twiddle coef modifier value */ + S->twidCoefModifier = 4U; + /* Initialise the bit reversal table modifier */ + S->bitRevFactor = 4U; + /* Initialise the bit reversal table pointer */ + S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; + break; + + case 256U: + /* Initializations of structure parameters for 256 point FFT */ + S->twidCoefModifier = 16U; + S->bitRevFactor = 16U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; + break; + + case 64U: + /* Initializations of structure parameters for 64 point FFT */ + S->twidCoefModifier = 64U; + S->bitRevFactor = 64U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; + break; + + case 16U: + /* Initializations of structure parameters for 16 point FFT */ + S->twidCoefModifier = 256U; + S->bitRevFactor = 256U; + S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; + break; + + default: + /* Reporting argument error if fftSize is not valid value */ + status = ARM_MATH_ARGUMENT_ERROR; + break; + } + + return (status); +} + +/** + @} end of ComplexFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q15.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q15.c new file mode 100644 index 0000000..b4cabb1 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q15.c @@ -0,0 +1,1809 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix4_q15.c + * Description: This file has function definition of Radix-4 FFT & IFFT function and + * In-place bit reversal using bit reversal table + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + + +void arm_radix4_butterfly_q15( + q15_t * pSrc16, + uint32_t fftLen, + const q15_t * pCoef16, + uint32_t twidCoefModifier); + +void arm_radix4_butterfly_inverse_q15( + q15_t * pSrc16, + uint32_t fftLen, + const q15_t * pCoef16, + uint32_t twidCoefModifier); + +void arm_bitreversal_q15( + q15_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab); + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + + +/** + @brief Processing function for the Q15 CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed in the future. + @param[in] S points to an instance of the Q15 CFFT/CIFFT structure. + @param[in,out] pSrc points to the complex data buffer. Processing occurs in-place. + @return none + + @par Input and output formats: + Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process. + Hence the output format is different for different FFT sizes. + The input and output formats for different FFT sizes and number of bits to upscale are mentioned in the tables below for CFFT and CIFFT: + @par + \image html CFFTQ15.gif "Input and Output Formats for Q15 CFFT" + \image html CIFFTQ15.gif "Input and Output Formats for Q15 CIFFT" + */ + +void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc) +{ + if (S->ifftFlag == 1U) + { + /* Complex IFFT radix-4 */ + arm_radix4_butterfly_inverse_q15(pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier); + } + else + { + /* Complex FFT radix-4 */ + arm_radix4_butterfly_q15(pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier); + } + + if (S->bitReverseFlag == 1U) + { + /* Bit Reversal */ + arm_bitreversal_q15(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); + } + +} + +/** + @} end of ComplexFFT group + */ + +/* + * Radix-4 FFT algorithm used is : + * + * Input real and imaginary data: + * x(n) = xa + j * ya + * x(n+N/4 ) = xb + j * yb + * x(n+N/2 ) = xc + j * yc + * x(n+3N 4) = xd + j * yd + * + * + * Output real and imaginary data: + * x(4r) = xa'+ j * ya' + * x(4r+1) = xb'+ j * yb' + * x(4r+2) = xc'+ j * yc' + * x(4r+3) = xd'+ j * yd' + * + * + * Twiddle factors for radix-4 FFT: + * Wn = co1 + j * (- si1) + * W2n = co2 + j * (- si2) + * W3n = co3 + j * (- si3) + + * The real and imaginary output values for the radix-4 butterfly are + * xa' = xa + xb + xc + xd + * ya' = ya + yb + yc + yd + * xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) + * yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) + * xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) + * yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) + * xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) + * yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) + * + */ + +/** + @brief Core function for the Q15 CFFT butterfly process. + @param[in,out] pSrc16 points to the in-place buffer of Q15 data type + @param[in] fftLen length of the FFT + @param[in] pCoef16 points to twiddle coefficient buffer + @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table + @return none + */ + +void arm_radix4_butterfly_q15( + q15_t * pSrc16, + uint32_t fftLen, + const q15_t * pCoef16, + uint32_t twidCoefModifier) +{ + +#if defined (ARM_MATH_DSP) + + q31_t R, S, T, U; + q31_t C1, C2, C3, out1, out2; + uint32_t n1, n2, ic, i0, j, k; + + q15_t *ptr1; + q15_t *pSi0; + q15_t *pSi1; + q15_t *pSi2; + q15_t *pSi3; + + q31_t xaya, xbyb, xcyc, xdyd; + + /* Total process is divided into three stages */ + + /* process first stage, middle stages, & last stage */ + + /* Initializations for the first stage */ + n2 = fftLen; + n1 = n2; + + /* n2 = fftLen/4 */ + n2 >>= 2U; + + /* Index for twiddle coefficient */ + ic = 0U; + + /* Index for input read and output write */ + j = n2; + + pSi0 = pSrc16; + pSi1 = pSi0 + 2 * n2; + pSi2 = pSi1 + 2 * n2; + pSi3 = pSi2 + 2 * n2; + + /* Input is in 1.15(q15) format */ + + /* start of first stage process */ + do + { + /* Butterfly implementation */ + + /* Reading i0, i0+fftLen/2 inputs */ + /* Read ya (real), xa(imag) input */ + T = read_q15x2 (pSi0); + T = __SHADD16(T, 0); /* this is just a SIMD arithmetic shift right by 1 */ + T = __SHADD16(T, 0); /* it turns out doing this twice is 2 cycles, the alternative takes 3 cycles */ +/* + in = ((int16_t) (T & 0xFFFF)) >> 2; // alternative code that takes 3 cycles + T = ((T >> 2) & 0xFFFF0000) | (in & 0xFFFF); +*/ + + /* Read yc (real), xc(imag) input */ + S = read_q15x2 (pSi2); + S = __SHADD16(S, 0); + S = __SHADD16(S, 0); + + /* R = packed((ya + yc), (xa + xc) ) */ + R = __QADD16(T, S); + + /* S = packed((ya - yc), (xa - xc) ) */ + S = __QSUB16(T, S); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* Read yb (real), xb(imag) input */ + T = read_q15x2 (pSi1); + T = __SHADD16(T, 0); + T = __SHADD16(T, 0); + + /* Read yd (real), xd(imag) input */ + U = read_q15x2 (pSi3); + U = __SHADD16(U, 0); + U = __SHADD16(U, 0); + + /* T = packed((yb + yd), (xb + xd) ) */ + T = __QADD16(T, U); + + /* writing the butterfly processed i0 sample */ + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + write_q15x2_ia (&pSi0, __SHADD16(R, T)); + + /* R = packed((ya + yc) - (yb + yd), (xa + xc)- (xb + xd)) */ + R = __QSUB16(R, T); + + /* co2 & si2 are read from SIMD Coefficient pointer */ + C2 = read_q15x2 ((q15_t *) pCoef16 + (4U * ic)); + +#ifndef ARM_MATH_BIG_ENDIAN + /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ + out1 = __SMUAD(C2, R) >> 16U; + /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out2 = __SMUSDX(C2, R); +#else + /* xc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out1 = __SMUSDX(R, C2) >> 16U; + /* yc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ + out2 = __SMUAD(C2, R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Reading i0+fftLen/4 */ + /* T = packed(yb, xb) */ + T = read_q15x2 (pSi1); + T = __SHADD16(T, 0); + T = __SHADD16(T, 0); + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* writing output(xc', yc') in little endian format */ + write_q15x2_ia (&pSi1, (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + /* Butterfly calculations */ + /* U = packed(yd, xd) */ + U = read_q15x2 (pSi3); + U = __SHADD16(U, 0); + U = __SHADD16(U, 0); + + /* T = packed(yb-yd, xb-xd) */ + T = __QSUB16(T, U); + +#ifndef ARM_MATH_BIG_ENDIAN + /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ + R = __QASX(S, T); + /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ + S = __QSAX(S, T); +#else + /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ + R = __QSAX(S, T); + /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ + S = __QASX(S, T); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* co1 & si1 are read from SIMD Coefficient pointer */ + C1 = read_q15x2 ((q15_t *) pCoef16 + (2U * ic)); + /* Butterfly process for the i0+fftLen/2 sample */ + +#ifndef ARM_MATH_BIG_ENDIAN + /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ + out1 = __SMUAD(C1, S) >> 16U; + /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ + out2 = __SMUSDX(C1, S); +#else + /* xb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ + out1 = __SMUSDX(S, C1) >> 16U; + /* yb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ + out2 = __SMUAD(C1, S); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* writing output(xb', yb') in little endian format */ + write_q15x2_ia (&pSi2, ((out2) & 0xFFFF0000) | ((out1) & 0x0000FFFF)); + + /* co3 & si3 are read from SIMD Coefficient pointer */ + C3 = read_q15x2 ((q15_t *) pCoef16 + (6U * ic)); + /* Butterfly process for the i0+3fftLen/4 sample */ + +#ifndef ARM_MATH_BIG_ENDIAN + /* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ + out1 = __SMUAD(C3, R) >> 16U; + /* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ + out2 = __SMUSDX(C3, R); +#else + /* xd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ + out1 = __SMUSDX(R, C3) >> 16U; + /* yd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ + out2 = __SMUAD(C3, R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* writing output(xd', yd') in little endian format */ + write_q15x2_ia (&pSi3, ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + /* Twiddle coefficients index modifier */ + ic = ic + twidCoefModifier; + + } while (--j); + /* data is in 4.11(q11) format */ + + /* end of first stage process */ + + + /* start of middle stage process */ + + /* Twiddle coefficients index modifier */ + twidCoefModifier <<= 2U; + + /* Calculation of Middle stage */ + for (k = fftLen / 4U; k > 4U; k >>= 2U) + { + /* Initializations for the middle stage */ + n1 = n2; + n2 >>= 2U; + ic = 0U; + + for (j = 0U; j <= (n2 - 1U); j++) + { + /* index calculation for the coefficients */ + C1 = read_q15x2 ((q15_t *) pCoef16 + (2U * ic)); + C2 = read_q15x2 ((q15_t *) pCoef16 + (4U * ic)); + C3 = read_q15x2 ((q15_t *) pCoef16 + (6U * ic)); + + /* Twiddle coefficients index modifier */ + ic = ic + twidCoefModifier; + + pSi0 = pSrc16 + 2 * j; + pSi1 = pSi0 + 2 * n2; + pSi2 = pSi1 + 2 * n2; + pSi3 = pSi2 + 2 * n2; + + /* Butterfly implementation */ + for (i0 = j; i0 < fftLen; i0 += n1) + { + /* Reading i0, i0+fftLen/2 inputs */ + /* Read ya (real), xa(imag) input */ + T = read_q15x2 (pSi0); + + /* Read yc (real), xc(imag) input */ + S = read_q15x2 (pSi2); + + /* R = packed( (ya + yc), (xa + xc)) */ + R = __QADD16(T, S); + + /* S = packed((ya - yc), (xa - xc)) */ + S = __QSUB16(T, S); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* Read yb (real), xb(imag) input */ + T = read_q15x2 (pSi1); + + /* Read yd (real), xd(imag) input */ + U = read_q15x2 (pSi3); + + /* T = packed( (yb + yd), (xb + xd)) */ + T = __QADD16(T, U); + + /* writing the butterfly processed i0 sample */ + + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + out1 = __SHADD16(R, T); + out1 = __SHADD16(out1, 0); + write_q15x2 (pSi0, out1); + pSi0 += 2 * n1; + + /* R = packed( (ya + yc) - (yb + yd), (xa + xc) - (xb + xd)) */ + R = __SHSUB16(R, T); + +#ifndef ARM_MATH_BIG_ENDIAN + /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ + out1 = __SMUAD(C2, R) >> 16U; + + /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out2 = __SMUSDX(C2, R); +#else + /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out1 = __SMUSDX(R, C2) >> 16U; + + /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ + out2 = __SMUAD(C2, R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Reading i0+3fftLen/4 */ + /* Read yb (real), xb(imag) input */ + T = read_q15x2 (pSi1); + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ + /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + write_q15x2 (pSi1, ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + pSi1 += 2 * n1; + + /* Butterfly calculations */ + + /* Read yd (real), xd(imag) input */ + U = read_q15x2 (pSi3); + + /* T = packed(yb-yd, xb-xd) */ + T = __QSUB16(T, U); + +#ifndef ARM_MATH_BIG_ENDIAN + /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ + R = __SHASX(S, T); + + /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ + S = __SHSAX(S, T); + + + /* Butterfly process for the i0+fftLen/2 sample */ + out1 = __SMUAD(C1, S) >> 16U; + out2 = __SMUSDX(C1, S); +#else + /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ + R = __SHSAX(S, T); + + /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ + S = __SHASX(S, T); + + + /* Butterfly process for the i0+fftLen/2 sample */ + out1 = __SMUSDX(S, C1) >> 16U; + out2 = __SMUAD(C1, S); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ + /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ + write_q15x2 (pSi2, ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + pSi2 += 2 * n1; + + /* Butterfly process for the i0+3fftLen/4 sample */ + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUAD(C3, R) >> 16U; + out2 = __SMUSDX(C3, R); +#else + out1 = __SMUSDX(R, C3) >> 16U; + out2 = __SMUAD(C3, R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ + /* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ + write_q15x2 (pSi3, ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + pSi3 += 2 * n1; + } + } + /* Twiddle coefficients index modifier */ + twidCoefModifier <<= 2U; + } + /* end of middle stage process */ + + + /* data is in 10.6(q6) format for the 1024 point */ + /* data is in 8.8(q8) format for the 256 point */ + /* data is in 6.10(q10) format for the 64 point */ + /* data is in 4.12(q12) format for the 16 point */ + + /* Initializations for the last stage */ + j = fftLen >> 2; + + ptr1 = &pSrc16[0]; + + /* start of last stage process */ + + /* Butterfly implementation */ + do + { + /* Read xa (real), ya(imag) input */ + xaya = read_q15x2_ia ((q15_t **) &ptr1); + + /* Read xb (real), yb(imag) input */ + xbyb = read_q15x2_ia ((q15_t **) &ptr1); + + /* Read xc (real), yc(imag) input */ + xcyc = read_q15x2_ia ((q15_t **) &ptr1); + + /* Read xd (real), yd(imag) input */ + xdyd = read_q15x2_ia ((q15_t **) &ptr1); + + /* R = packed((ya + yc), (xa + xc)) */ + R = __QADD16(xaya, xcyc); + + /* T = packed((yb + yd), (xb + xd)) */ + T = __QADD16(xbyb, xdyd); + + /* pointer updation for writing */ + ptr1 = ptr1 - 8U; + + + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + write_q15x2_ia (&ptr1, __SHADD16(R, T)); + + /* T = packed((yb + yd), (xb + xd)) */ + T = __QADD16(xbyb, xdyd); + + /* xc' = (xa-xb+xc-xd) */ + /* yc' = (ya-yb+yc-yd) */ + write_q15x2_ia (&ptr1, __SHSUB16(R, T)); + + /* S = packed((ya - yc), (xa - xc)) */ + S = __QSUB16(xaya, xcyc); + + /* Read yd (real), xd(imag) input */ + /* T = packed( (yb - yd), (xb - xd)) */ + U = __QSUB16(xbyb, xdyd); + +#ifndef ARM_MATH_BIG_ENDIAN + /* xb' = (xa+yb-xc-yd) */ + /* yb' = (ya-xb-yc+xd) */ + write_q15x2_ia (&ptr1, __SHSAX(S, U)); + + /* xd' = (xa-yb-xc+yd) */ + /* yd' = (ya+xb-yc-xd) */ + write_q15x2_ia (&ptr1, __SHASX(S, U)); +#else + /* xb' = (xa+yb-xc-yd) */ + /* yb' = (ya-xb-yc+xd) */ + write_q15x2_ia (&ptr1, __SHASX(S, U)); + + /* xd' = (xa-yb-xc+yd) */ + /* yd' = (ya+xb-yc-xd) */ + write_q15x2_ia (&ptr1, __SHSAX(S, U)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + } while (--j); + + /* end of last stage process */ + + /* output is in 11.5(q5) format for the 1024 point */ + /* output is in 9.7(q7) format for the 256 point */ + /* output is in 7.9(q9) format for the 64 point */ + /* output is in 5.11(q11) format for the 16 point */ + + +#else /* #if defined (ARM_MATH_DSP) */ + + q15_t R0, R1, S0, S1, T0, T1, U0, U1; + q15_t Co1, Si1, Co2, Si2, Co3, Si3, out1, out2; + uint32_t n1, n2, ic, i0, i1, i2, i3, j, k; + + /* Total process is divided into three stages */ + + /* process first stage, middle stages, & last stage */ + + /* Initializations for the first stage */ + n2 = fftLen; + n1 = n2; + + /* n2 = fftLen/4 */ + n2 >>= 2U; + + /* Index for twiddle coefficient */ + ic = 0U; + + /* Index for input read and output write */ + i0 = 0U; + j = n2; + + /* Input is in 1.15(q15) format */ + + /* start of first stage process */ + do + { + /* Butterfly implementation */ + + /* index calculation for the input as, */ + /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Reading i0, i0+fftLen/2 inputs */ + + /* input is down scale by 4 to avoid overflow */ + /* Read ya (real), xa(imag) input */ + T0 = pSrc16[i0 * 2U] >> 2U; + T1 = pSrc16[(i0 * 2U) + 1U] >> 2U; + + /* input is down scale by 4 to avoid overflow */ + /* Read yc (real), xc(imag) input */ + S0 = pSrc16[i2 * 2U] >> 2U; + S1 = pSrc16[(i2 * 2U) + 1U] >> 2U; + + /* R0 = (ya + yc) */ + R0 = __SSAT(T0 + S0, 16U); + /* R1 = (xa + xc) */ + R1 = __SSAT(T1 + S1, 16U); + + /* S0 = (ya - yc) */ + S0 = __SSAT(T0 - S0, 16); + /* S1 = (xa - xc) */ + S1 = __SSAT(T1 - S1, 16); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* input is down scale by 4 to avoid overflow */ + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U] >> 2U; + T1 = pSrc16[(i1 * 2U) + 1U] >> 2U; + + /* input is down scale by 4 to avoid overflow */ + /* Read yd (real), xd(imag) input */ + U0 = pSrc16[i3 * 2U] >> 2U; + U1 = pSrc16[(i3 * 2U) + 1] >> 2U; + + /* T0 = (yb + yd) */ + T0 = __SSAT(T0 + U0, 16U); + /* T1 = (xb + xd) */ + T1 = __SSAT(T1 + U1, 16U); + + /* writing the butterfly processed i0 sample */ + /* ya' = ya + yb + yc + yd */ + /* xa' = xa + xb + xc + xd */ + pSrc16[i0 * 2U] = (R0 >> 1U) + (T0 >> 1U); + pSrc16[(i0 * 2U) + 1U] = (R1 >> 1U) + (T1 >> 1U); + + /* R0 = (ya + yc) - (yb + yd) */ + /* R1 = (xa + xc) - (xb + xd) */ + R0 = __SSAT(R0 - T0, 16U); + R1 = __SSAT(R1 - T1, 16U); + + /* co2 & si2 are read from Coefficient pointer */ + Co2 = pCoef16[2U * ic * 2U]; + Si2 = pCoef16[(2U * ic * 2U) + 1]; + + /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ + out1 = (q15_t) ((Co2 * R0 + Si2 * R1) >> 16U); + /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out2 = (q15_t) ((-Si2 * R0 + Co2 * R1) >> 16U); + + /* Reading i0+fftLen/4 */ + /* input is down scale by 4 to avoid overflow */ + /* T0 = yb, T1 = xb */ + T0 = pSrc16[i1 * 2U] >> 2; + T1 = pSrc16[(i1 * 2U) + 1] >> 2; + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* writing output(xc', yc') in little endian format */ + pSrc16[i1 * 2U] = out1; + pSrc16[(i1 * 2U) + 1] = out2; + + /* Butterfly calculations */ + /* input is down scale by 4 to avoid overflow */ + /* U0 = yd, U1 = xd */ + U0 = pSrc16[i3 * 2U] >> 2; + U1 = pSrc16[(i3 * 2U) + 1] >> 2; + /* T0 = yb-yd */ + T0 = __SSAT(T0 - U0, 16); + /* T1 = xb-xd */ + T1 = __SSAT(T1 - U1, 16); + + /* R1 = (ya-yc) + (xb- xd), R0 = (xa-xc) - (yb-yd)) */ + R0 = (q15_t) __SSAT((q31_t) (S0 - T1), 16); + R1 = (q15_t) __SSAT((q31_t) (S1 + T0), 16); + + /* S1 = (ya-yc) - (xb- xd), S0 = (xa-xc) + (yb-yd)) */ + S0 = (q15_t) __SSAT(((q31_t) S0 + T1), 16U); + S1 = (q15_t) __SSAT(((q31_t) S1 - T0), 16U); + + /* co1 & si1 are read from Coefficient pointer */ + Co1 = pCoef16[ic * 2U]; + Si1 = pCoef16[(ic * 2U) + 1]; + /* Butterfly process for the i0+fftLen/2 sample */ + /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ + out1 = (q15_t) ((Si1 * S1 + Co1 * S0) >> 16); + /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ + out2 = (q15_t) ((-Si1 * S0 + Co1 * S1) >> 16); + + /* writing output(xb', yb') in little endian format */ + pSrc16[i2 * 2U] = out1; + pSrc16[(i2 * 2U) + 1] = out2; + + /* Co3 & si3 are read from Coefficient pointer */ + Co3 = pCoef16[3U * (ic * 2U)]; + Si3 = pCoef16[(3U * (ic * 2U)) + 1]; + /* Butterfly process for the i0+3fftLen/4 sample */ + /* xd' = (xa-yb-xc+yd)* Co3 + (ya+xb-yc-xd)* (si3) */ + out1 = (q15_t) ((Si3 * R1 + Co3 * R0) >> 16U); + /* yd' = (ya+xb-yc-xd)* Co3 - (xa-yb-xc+yd)* (si3) */ + out2 = (q15_t) ((-Si3 * R0 + Co3 * R1) >> 16U); + /* writing output(xd', yd') in little endian format */ + pSrc16[i3 * 2U] = out1; + pSrc16[(i3 * 2U) + 1] = out2; + + /* Twiddle coefficients index modifier */ + ic = ic + twidCoefModifier; + + /* Updating input index */ + i0 = i0 + 1U; + + } while (--j); + /* data is in 4.11(q11) format */ + + /* end of first stage process */ + + + /* start of middle stage process */ + + /* Twiddle coefficients index modifier */ + twidCoefModifier <<= 2U; + + /* Calculation of Middle stage */ + for (k = fftLen / 4U; k > 4U; k >>= 2U) + { + /* Initializations for the middle stage */ + n1 = n2; + n2 >>= 2U; + ic = 0U; + + for (j = 0U; j <= (n2 - 1U); j++) + { + /* index calculation for the coefficients */ + Co1 = pCoef16[ic * 2U]; + Si1 = pCoef16[(ic * 2U) + 1U]; + Co2 = pCoef16[2U * (ic * 2U)]; + Si2 = pCoef16[(2U * (ic * 2U)) + 1U]; + Co3 = pCoef16[3U * (ic * 2U)]; + Si3 = pCoef16[(3U * (ic * 2U)) + 1U]; + + /* Twiddle coefficients index modifier */ + ic = ic + twidCoefModifier; + + /* Butterfly implementation */ + for (i0 = j; i0 < fftLen; i0 += n1) + { + /* index calculation for the input as, */ + /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Reading i0, i0+fftLen/2 inputs */ + /* Read ya (real), xa(imag) input */ + T0 = pSrc16[i0 * 2U]; + T1 = pSrc16[(i0 * 2U) + 1U]; + + /* Read yc (real), xc(imag) input */ + S0 = pSrc16[i2 * 2U]; + S1 = pSrc16[(i2 * 2U) + 1U]; + + /* R0 = (ya + yc), R1 = (xa + xc) */ + R0 = __SSAT(T0 + S0, 16); + R1 = __SSAT(T1 + S1, 16); + + /* S0 = (ya - yc), S1 =(xa - xc) */ + S0 = __SSAT(T0 - S0, 16); + S1 = __SSAT(T1 - S1, 16); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U]; + T1 = pSrc16[(i1 * 2U) + 1U]; + + /* Read yd (real), xd(imag) input */ + U0 = pSrc16[i3 * 2U]; + U1 = pSrc16[(i3 * 2U) + 1U]; + + + /* T0 = (yb + yd), T1 = (xb + xd) */ + T0 = __SSAT(T0 + U0, 16); + T1 = __SSAT(T1 + U1, 16); + + /* writing the butterfly processed i0 sample */ + + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + out1 = ((R0 >> 1U) + (T0 >> 1U)) >> 1U; + out2 = ((R1 >> 1U) + (T1 >> 1U)) >> 1U; + + pSrc16[i0 * 2U] = out1; + pSrc16[(2U * i0) + 1U] = out2; + + /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc) - (xb + xd) */ + R0 = (R0 >> 1U) - (T0 >> 1U); + R1 = (R1 >> 1U) - (T1 >> 1U); + + /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ + out1 = (q15_t) ((Co2 * R0 + Si2 * R1) >> 16U); + + /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out2 = (q15_t) ((-Si2 * R0 + Co2 * R1) >> 16U); + + /* Reading i0+3fftLen/4 */ + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U]; + T1 = pSrc16[(i1 * 2U) + 1U]; + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ + /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + pSrc16[i1 * 2U] = out1; + pSrc16[(i1 * 2U) + 1U] = out2; + + /* Butterfly calculations */ + + /* Read yd (real), xd(imag) input */ + U0 = pSrc16[i3 * 2U]; + U1 = pSrc16[(i3 * 2U) + 1U]; + + /* T0 = yb-yd, T1 = xb-xd */ + T0 = __SSAT(T0 - U0, 16); + T1 = __SSAT(T1 - U1, 16); + + /* R0 = (ya-yc) + (xb- xd), R1 = (xa-xc) - (yb-yd)) */ + R0 = (S0 >> 1U) - (T1 >> 1U); + R1 = (S1 >> 1U) + (T0 >> 1U); + + /* S0 = (ya-yc) - (xb- xd), S1 = (xa-xc) + (yb-yd)) */ + S0 = (S0 >> 1U) + (T1 >> 1U); + S1 = (S1 >> 1U) - (T0 >> 1U); + + /* Butterfly process for the i0+fftLen/2 sample */ + out1 = (q15_t) ((Co1 * S0 + Si1 * S1) >> 16U); + + out2 = (q15_t) ((-Si1 * S0 + Co1 * S1) >> 16U); + + /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ + /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ + pSrc16[i2 * 2U] = out1; + pSrc16[(i2 * 2U) + 1U] = out2; + + /* Butterfly process for the i0+3fftLen/4 sample */ + out1 = (q15_t) ((Si3 * R1 + Co3 * R0) >> 16U); + + out2 = (q15_t) ((-Si3 * R0 + Co3 * R1) >> 16U); + /* xd' = (xa-yb-xc+yd)* Co3 + (ya+xb-yc-xd)* (si3) */ + /* yd' = (ya+xb-yc-xd)* Co3 - (xa-yb-xc+yd)* (si3) */ + pSrc16[i3 * 2U] = out1; + pSrc16[(i3 * 2U) + 1U] = out2; + } + } + /* Twiddle coefficients index modifier */ + twidCoefModifier <<= 2U; + } + /* end of middle stage process */ + + + /* data is in 10.6(q6) format for the 1024 point */ + /* data is in 8.8(q8) format for the 256 point */ + /* data is in 6.10(q10) format for the 64 point */ + /* data is in 4.12(q12) format for the 16 point */ + + /* Initializations for the last stage */ + n1 = n2; + n2 >>= 2U; + + /* start of last stage process */ + + /* Butterfly implementation */ + for (i0 = 0U; i0 <= (fftLen - n1); i0 += n1) + { + /* index calculation for the input as, */ + /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Reading i0, i0+fftLen/2 inputs */ + /* Read ya (real), xa(imag) input */ + T0 = pSrc16[i0 * 2U]; + T1 = pSrc16[(i0 * 2U) + 1U]; + + /* Read yc (real), xc(imag) input */ + S0 = pSrc16[i2 * 2U]; + S1 = pSrc16[(i2 * 2U) + 1U]; + + /* R0 = (ya + yc), R1 = (xa + xc) */ + R0 = __SSAT(T0 + S0, 16U); + R1 = __SSAT(T1 + S1, 16U); + + /* S0 = (ya - yc), S1 = (xa - xc) */ + S0 = __SSAT(T0 - S0, 16U); + S1 = __SSAT(T1 - S1, 16U); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U]; + T1 = pSrc16[(i1 * 2U) + 1U]; + /* Read yd (real), xd(imag) input */ + U0 = pSrc16[i3 * 2U]; + U1 = pSrc16[(i3 * 2U) + 1U]; + + /* T0 = (yb + yd), T1 = (xb + xd)) */ + T0 = __SSAT(T0 + U0, 16U); + T1 = __SSAT(T1 + U1, 16U); + + /* writing the butterfly processed i0 sample */ + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + pSrc16[i0 * 2U] = (R0 >> 1U) + (T0 >> 1U); + pSrc16[(i0 * 2U) + 1U] = (R1 >> 1U) + (T1 >> 1U); + + /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc) - (xb + xd) */ + R0 = (R0 >> 1U) - (T0 >> 1U); + R1 = (R1 >> 1U) - (T1 >> 1U); + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U]; + T1 = pSrc16[(i1 * 2U) + 1U]; + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* xc' = (xa-xb+xc-xd) */ + /* yc' = (ya-yb+yc-yd) */ + pSrc16[i1 * 2U] = R0; + pSrc16[(i1 * 2U) + 1U] = R1; + + /* Read yd (real), xd(imag) input */ + U0 = pSrc16[i3 * 2U]; + U1 = pSrc16[(i3 * 2U) + 1U]; + /* T0 = (yb - yd), T1 = (xb - xd) */ + T0 = __SSAT(T0 - U0, 16U); + T1 = __SSAT(T1 - U1, 16U); + + /* writing the butterfly processed i0 + fftLen/2 sample */ + /* xb' = (xa+yb-xc-yd) */ + /* yb' = (ya-xb-yc+xd) */ + pSrc16[i2 * 2U] = (S0 >> 1U) + (T1 >> 1U); + pSrc16[(i2 * 2U) + 1U] = (S1 >> 1U) - (T0 >> 1U); + + /* writing the butterfly processed i0 + 3fftLen/4 sample */ + /* xd' = (xa-yb-xc+yd) */ + /* yd' = (ya+xb-yc-xd) */ + pSrc16[i3 * 2U] = (S0 >> 1U) - (T1 >> 1U); + pSrc16[(i3 * 2U) + 1U] = (S1 >> 1U) + (T0 >> 1U); + + } + + /* end of last stage process */ + + /* output is in 11.5(q5) format for the 1024 point */ + /* output is in 9.7(q7) format for the 256 point */ + /* output is in 7.9(q9) format for the 64 point */ + /* output is in 5.11(q11) format for the 16 point */ + +#endif /* #if defined (ARM_MATH_DSP) */ + +} + + +/** + @brief Core function for the Q15 CIFFT butterfly process. + @param[in,out] pSrc16 points to the in-place buffer of Q15 data type + @param[in] fftLen length of the FFT + @param[in] pCoef16 points to twiddle coefficient buffer + @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + @return none + */ + +/* + * Radix-4 IFFT algorithm used is : + * + * CIFFT uses same twiddle coefficients as CFFT function + * x[k] = x[n] + (j)k * x[n + fftLen/4] + (-1)k * x[n+fftLen/2] + (-j)k * x[n+3*fftLen/4] + * + * + * IFFT is implemented with following changes in equations from FFT + * + * Input real and imaginary data: + * x(n) = xa + j * ya + * x(n+N/4 ) = xb + j * yb + * x(n+N/2 ) = xc + j * yc + * x(n+3N 4) = xd + j * yd + * + * + * Output real and imaginary data: + * x(4r) = xa'+ j * ya' + * x(4r+1) = xb'+ j * yb' + * x(4r+2) = xc'+ j * yc' + * x(4r+3) = xd'+ j * yd' + * + * + * Twiddle factors for radix-4 IFFT: + * Wn = co1 + j * (si1) + * W2n = co2 + j * (si2) + * W3n = co3 + j * (si3) + + * The real and imaginary output values for the radix-4 butterfly are + * xa' = xa + xb + xc + xd + * ya' = ya + yb + yc + yd + * xb' = (xa-yb-xc+yd)* co1 - (ya+xb-yc-xd)* (si1) + * yb' = (ya+xb-yc-xd)* co1 + (xa-yb-xc+yd)* (si1) + * xc' = (xa-xb+xc-xd)* co2 - (ya-yb+yc-yd)* (si2) + * yc' = (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) + * xd' = (xa+yb-xc-yd)* co3 - (ya-xb-yc+xd)* (si3) + * yd' = (ya-xb-yc+xd)* co3 + (xa+yb-xc-yd)* (si3) + * + */ + +void arm_radix4_butterfly_inverse_q15( + q15_t * pSrc16, + uint32_t fftLen, + const q15_t * pCoef16, + uint32_t twidCoefModifier) +{ + +#if defined (ARM_MATH_DSP) + + q31_t R, S, T, U; + q31_t C1, C2, C3, out1, out2; + uint32_t n1, n2, ic, i0, j, k; + + q15_t *ptr1; + q15_t *pSi0; + q15_t *pSi1; + q15_t *pSi2; + q15_t *pSi3; + + q31_t xaya, xbyb, xcyc, xdyd; + + /* Total process is divided into three stages */ + + /* process first stage, middle stages, & last stage */ + + /* Initializations for the first stage */ + n2 = fftLen; + n1 = n2; + + /* n2 = fftLen/4 */ + n2 >>= 2U; + + /* Index for twiddle coefficient */ + ic = 0U; + + /* Index for input read and output write */ + j = n2; + + pSi0 = pSrc16; + pSi1 = pSi0 + 2 * n2; + pSi2 = pSi1 + 2 * n2; + pSi3 = pSi2 + 2 * n2; + + /* Input is in 1.15(q15) format */ + + /* start of first stage process */ + do + { + /* Butterfly implementation */ + + /* Reading i0, i0+fftLen/2 inputs */ + /* Read ya (real), xa(imag) input */ + T = read_q15x2 (pSi0); + T = __SHADD16(T, 0); + T = __SHADD16(T, 0); + + /* Read yc (real), xc(imag) input */ + S = read_q15x2 (pSi2); + S = __SHADD16(S, 0); + S = __SHADD16(S, 0); + + /* R = packed((ya + yc), (xa + xc) ) */ + R = __QADD16(T, S); + + /* S = packed((ya - yc), (xa - xc) ) */ + S = __QSUB16(T, S); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* Read yb (real), xb(imag) input */ + T = read_q15x2 (pSi1); + T = __SHADD16(T, 0); + T = __SHADD16(T, 0); + + /* Read yd (real), xd(imag) input */ + U = read_q15x2 (pSi3); + U = __SHADD16(U, 0); + U = __SHADD16(U, 0); + + /* T = packed((yb + yd), (xb + xd) ) */ + T = __QADD16(T, U); + + /* writing the butterfly processed i0 sample */ + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + write_q15x2_ia (&pSi0, __SHADD16(R, T)); + + /* R = packed((ya + yc) - (yb + yd), (xa + xc)- (xb + xd)) */ + R = __QSUB16(R, T); + + /* co2 & si2 are read from SIMD Coefficient pointer */ + C2 = read_q15x2 ((q15_t *) pCoef16 + (4U * ic)); + +#ifndef ARM_MATH_BIG_ENDIAN + /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ + out1 = __SMUSD(C2, R) >> 16U; + /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out2 = __SMUADX(C2, R); +#else + /* xc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out1 = __SMUADX(C2, R) >> 16U; + /* yc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ + out2 = __SMUSD(__QSUB16(0, C2), R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Reading i0+fftLen/4 */ + /* T = packed(yb, xb) */ + T = read_q15x2 (pSi1); + T = __SHADD16(T, 0); + T = __SHADD16(T, 0); + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* writing output(xc', yc') in little endian format */ + write_q15x2_ia (&pSi1, (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + /* Butterfly calculations */ + /* U = packed(yd, xd) */ + U = read_q15x2 (pSi3); + U = __SHADD16(U, 0); + U = __SHADD16(U, 0); + + /* T = packed(yb-yd, xb-xd) */ + T = __QSUB16(T, U); + +#ifndef ARM_MATH_BIG_ENDIAN + /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ + R = __QSAX(S, T); + /* S = packed((ya-yc) + (xb- xd), (xa-xc) - (yb-yd)) */ + S = __QASX(S, T); +#else + /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ + R = __QASX(S, T); + /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ + S = __QSAX(S, T); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* co1 & si1 are read from SIMD Coefficient pointer */ + C1 = read_q15x2 ((q15_t *) pCoef16 + (2U * ic)); + /* Butterfly process for the i0+fftLen/2 sample */ + +#ifndef ARM_MATH_BIG_ENDIAN + /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ + out1 = __SMUSD(C1, S) >> 16U; + /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ + out2 = __SMUADX(C1, S); +#else + /* xb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ + out1 = __SMUADX(C1, S) >> 16U; + /* yb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ + out2 = __SMUSD(__QSUB16(0, C1), S); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* writing output(xb', yb') in little endian format */ + write_q15x2_ia (&pSi2, ((out2) & 0xFFFF0000) | ((out1) & 0x0000FFFF)); + + /* co3 & si3 are read from SIMD Coefficient pointer */ + C3 = read_q15x2 ((q15_t *) pCoef16 + (6U * ic)); + /* Butterfly process for the i0+3fftLen/4 sample */ + +#ifndef ARM_MATH_BIG_ENDIAN + /* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ + out1 = __SMUSD(C3, R) >> 16U; + /* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ + out2 = __SMUADX(C3, R); +#else + /* xd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ + out1 = __SMUADX(C3, R) >> 16U; + /* yd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ + out2 = __SMUSD(__QSUB16(0, C3), R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* writing output(xd', yd') in little endian format */ + write_q15x2_ia (&pSi3, ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + + /* Twiddle coefficients index modifier */ + ic = ic + twidCoefModifier; + + } while (--j); + /* data is in 4.11(q11) format */ + + /* end of first stage process */ + + + /* start of middle stage process */ + + /* Twiddle coefficients index modifier */ + twidCoefModifier <<= 2U; + + /* Calculation of Middle stage */ + for (k = fftLen / 4U; k > 4U; k >>= 2U) + { + /* Initializations for the middle stage */ + n1 = n2; + n2 >>= 2U; + ic = 0U; + + for (j = 0U; j <= (n2 - 1U); j++) + { + /* index calculation for the coefficients */ + C1 = read_q15x2 ((q15_t *) pCoef16 + (2U * ic)); + C2 = read_q15x2 ((q15_t *) pCoef16 + (4U * ic)); + C3 = read_q15x2 ((q15_t *) pCoef16 + (6U * ic)); + + /* Twiddle coefficients index modifier */ + ic = ic + twidCoefModifier; + + pSi0 = pSrc16 + 2 * j; + pSi1 = pSi0 + 2 * n2; + pSi2 = pSi1 + 2 * n2; + pSi3 = pSi2 + 2 * n2; + + /* Butterfly implementation */ + for (i0 = j; i0 < fftLen; i0 += n1) + { + /* Reading i0, i0+fftLen/2 inputs */ + /* Read ya (real), xa(imag) input */ + T = read_q15x2 (pSi0); + + /* Read yc (real), xc(imag) input */ + S = read_q15x2 (pSi2); + + /* R = packed( (ya + yc), (xa + xc)) */ + R = __QADD16(T, S); + + /* S = packed((ya - yc), (xa - xc)) */ + S = __QSUB16(T, S); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* Read yb (real), xb(imag) input */ + T = read_q15x2 (pSi1); + + /* Read yd (real), xd(imag) input */ + U = read_q15x2 (pSi3); + + /* T = packed( (yb + yd), (xb + xd)) */ + T = __QADD16(T, U); + + /* writing the butterfly processed i0 sample */ + + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + out1 = __SHADD16(R, T); + out1 = __SHADD16(out1, 0); + write_q15x2 (pSi0, out1); + pSi0 += 2 * n1; + + /* R = packed( (ya + yc) - (yb + yd), (xa + xc) - (xb + xd)) */ + R = __SHSUB16(R, T); + +#ifndef ARM_MATH_BIG_ENDIAN + /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ + out1 = __SMUSD(C2, R) >> 16U; + + /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out2 = __SMUADX(C2, R); +#else + /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + out1 = __SMUADX(R, C2) >> 16U; + + /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ + out2 = __SMUSD(__QSUB16(0, C2), R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* Reading i0+3fftLen/4 */ + /* Read yb (real), xb(imag) input */ + T = read_q15x2 (pSi1); + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ + /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ + write_q15x2 (pSi1, ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + pSi1 += 2 * n1; + + /* Butterfly calculations */ + + /* Read yd (real), xd(imag) input */ + U = read_q15x2 (pSi3); + + /* T = packed(yb-yd, xb-xd) */ + T = __QSUB16(T, U); + +#ifndef ARM_MATH_BIG_ENDIAN + /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ + R = __SHSAX(S, T); + + /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ + S = __SHASX(S, T); + + /* Butterfly process for the i0+fftLen/2 sample */ + out1 = __SMUSD(C1, S) >> 16U; + out2 = __SMUADX(C1, S); +#else + /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ + R = __SHASX(S, T); + + /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ + S = __SHSAX(S, T); + + /* Butterfly process for the i0+fftLen/2 sample */ + out1 = __SMUADX(S, C1) >> 16U; + out2 = __SMUSD(__QSUB16(0, C1), S); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ + /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ + write_q15x2 (pSi2, ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + pSi2 += 2 * n1; + + /* Butterfly process for the i0+3fftLen/4 sample */ + +#ifndef ARM_MATH_BIG_ENDIAN + out1 = __SMUSD(C3, R) >> 16U; + out2 = __SMUADX(C3, R); +#else + out1 = __SMUADX(C3, R) >> 16U; + out2 = __SMUSD(__QSUB16(0, C3), R); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ + /* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ + write_q15x2 (pSi3, ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF)); + pSi3 += 2 * n1; + } + } + /* Twiddle coefficients index modifier */ + twidCoefModifier <<= 2U; + } + /* end of middle stage process */ + + /* data is in 10.6(q6) format for the 1024 point */ + /* data is in 8.8(q8) format for the 256 point */ + /* data is in 6.10(q10) format for the 64 point */ + /* data is in 4.12(q12) format for the 16 point */ + + /* Initializations for the last stage */ + j = fftLen >> 2; + + ptr1 = &pSrc16[0]; + + /* start of last stage process */ + + /* Butterfly implementation */ + do + { + /* Read xa (real), ya(imag) input */ + xaya = read_q15x2_ia ((q15_t **) &ptr1); + + /* Read xb (real), yb(imag) input */ + xbyb = read_q15x2_ia ((q15_t **) &ptr1); + + /* Read xc (real), yc(imag) input */ + xcyc = read_q15x2_ia ((q15_t **) &ptr1); + + /* Read xd (real), yd(imag) input */ + xdyd = read_q15x2_ia ((q15_t **) &ptr1); + + /* R = packed((ya + yc), (xa + xc)) */ + R = __QADD16(xaya, xcyc); + + /* T = packed((yb + yd), (xb + xd)) */ + T = __QADD16(xbyb, xdyd); + + /* pointer updation for writing */ + ptr1 = ptr1 - 8U; + + + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + write_q15x2_ia (&ptr1, __SHADD16(R, T)); + + /* T = packed((yb + yd), (xb + xd)) */ + T = __QADD16(xbyb, xdyd); + + /* xc' = (xa-xb+xc-xd) */ + /* yc' = (ya-yb+yc-yd) */ + write_q15x2_ia (&ptr1, __SHSUB16(R, T)); + + /* S = packed((ya - yc), (xa - xc)) */ + S = __QSUB16(xaya, xcyc); + + /* Read yd (real), xd(imag) input */ + /* T = packed( (yb - yd), (xb - xd)) */ + U = __QSUB16(xbyb, xdyd); + +#ifndef ARM_MATH_BIG_ENDIAN + /* xb' = (xa+yb-xc-yd) */ + /* yb' = (ya-xb-yc+xd) */ + write_q15x2_ia (&ptr1, __SHASX(S, U)); + + /* xd' = (xa-yb-xc+yd) */ + /* yd' = (ya+xb-yc-xd) */ + write_q15x2_ia (&ptr1, __SHSAX(S, U)); +#else + /* xb' = (xa+yb-xc-yd) */ + /* yb' = (ya-xb-yc+xd) */ + write_q15x2_ia (&ptr1, __SHSAX(S, U)); + + /* xd' = (xa-yb-xc+yd) */ + /* yd' = (ya+xb-yc-xd) */ + write_q15x2_ia (&ptr1, __SHASX(S, U)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + } while (--j); + + /* end of last stage process */ + + /* output is in 11.5(q5) format for the 1024 point */ + /* output is in 9.7(q7) format for the 256 point */ + /* output is in 7.9(q9) format for the 64 point */ + /* output is in 5.11(q11) format for the 16 point */ + + +#else /* arm_radix4_butterfly_inverse_q15 */ + + q15_t R0, R1, S0, S1, T0, T1, U0, U1; + q15_t Co1, Si1, Co2, Si2, Co3, Si3, out1, out2; + uint32_t n1, n2, ic, i0, i1, i2, i3, j, k; + + /* Total process is divided into three stages */ + + /* process first stage, middle stages, & last stage */ + + /* Initializations for the first stage */ + n2 = fftLen; + n1 = n2; + + /* n2 = fftLen/4 */ + n2 >>= 2U; + + /* Index for twiddle coefficient */ + ic = 0U; + + /* Index for input read and output write */ + i0 = 0U; + + j = n2; + + /* Input is in 1.15(q15) format */ + + /* Start of first stage process */ + do + { + /* Butterfly implementation */ + + /* index calculation for the input as, */ + /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Reading i0, i0+fftLen/2 inputs */ + /* input is down scale by 4 to avoid overflow */ + /* Read ya (real), xa(imag) input */ + T0 = pSrc16[i0 * 2U] >> 2U; + T1 = pSrc16[(i0 * 2U) + 1U] >> 2U; + /* input is down scale by 4 to avoid overflow */ + /* Read yc (real), xc(imag) input */ + S0 = pSrc16[i2 * 2U] >> 2U; + S1 = pSrc16[(i2 * 2U) + 1U] >> 2U; + + /* R0 = (ya + yc), R1 = (xa + xc) */ + R0 = __SSAT(T0 + S0, 16U); + R1 = __SSAT(T1 + S1, 16U); + /* S0 = (ya - yc), S1 = (xa - xc) */ + S0 = __SSAT(T0 - S0, 16U); + S1 = __SSAT(T1 - S1, 16U); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* input is down scale by 4 to avoid overflow */ + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U] >> 2U; + T1 = pSrc16[(i1 * 2U) + 1U] >> 2U; + /* Read yd (real), xd(imag) input */ + /* input is down scale by 4 to avoid overflow */ + U0 = pSrc16[i3 * 2U] >> 2U; + U1 = pSrc16[(i3 * 2U) + 1U] >> 2U; + + /* T0 = (yb + yd), T1 = (xb + xd) */ + T0 = __SSAT(T0 + U0, 16U); + T1 = __SSAT(T1 + U1, 16U); + + /* writing the butterfly processed i0 sample */ + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + pSrc16[i0 * 2U] = (R0 >> 1U) + (T0 >> 1U); + pSrc16[(i0 * 2U) + 1U] = (R1 >> 1U) + (T1 >> 1U); + + /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc)- (xb + xd) */ + R0 = __SSAT(R0 - T0, 16U); + R1 = __SSAT(R1 - T1, 16U); + /* co2 & si2 are read from Coefficient pointer */ + Co2 = pCoef16[2U * ic * 2U]; + Si2 = pCoef16[(2U * ic * 2U) + 1U]; + /* xc' = (xa-xb+xc-xd)* co2 - (ya-yb+yc-yd)* (si2) */ + out1 = (q15_t) ((Co2 * R0 - Si2 * R1) >> 16U); + /* yc' = (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) */ + out2 = (q15_t) ((Si2 * R0 + Co2 * R1) >> 16U); + + /* Reading i0+fftLen/4 */ + /* input is down scale by 4 to avoid overflow */ + /* T0 = yb, T1 = xb */ + T0 = pSrc16[i1 * 2U] >> 2U; + T1 = pSrc16[(i1 * 2U) + 1U] >> 2U; + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* writing output(xc', yc') in little endian format */ + pSrc16[i1 * 2U] = out1; + pSrc16[(i1 * 2U) + 1U] = out2; + + /* Butterfly calculations */ + /* input is down scale by 4 to avoid overflow */ + /* U0 = yd, U1 = xd) */ + U0 = pSrc16[i3 * 2U] >> 2U; + U1 = pSrc16[(i3 * 2U) + 1U] >> 2U; + + /* T0 = yb-yd, T1 = xb-xd) */ + T0 = __SSAT(T0 - U0, 16U); + T1 = __SSAT(T1 - U1, 16U); + /* R0 = (ya-yc) - (xb- xd) , R1 = (xa-xc) + (yb-yd) */ + R0 = (q15_t) __SSAT((q31_t) (S0 + T1), 16); + R1 = (q15_t) __SSAT((q31_t) (S1 - T0), 16); + /* S = (ya-yc) + (xb- xd), S1 = (xa-xc) - (yb-yd) */ + S0 = (q15_t) __SSAT((q31_t) (S0 - T1), 16); + S1 = (q15_t) __SSAT((q31_t) (S1 + T0), 16); + + /* co1 & si1 are read from Coefficient pointer */ + Co1 = pCoef16[ic * 2U]; + Si1 = pCoef16[(ic * 2U) + 1U]; + /* Butterfly process for the i0+fftLen/2 sample */ + /* xb' = (xa-yb-xc+yd)* co1 - (ya+xb-yc-xd)* (si1) */ + out1 = (q15_t) ((Co1 * S0 - Si1 * S1) >> 16U); + /* yb' = (ya+xb-yc-xd)* co1 + (xa-yb-xc+yd)* (si1) */ + out2 = (q15_t) ((Si1 * S0 + Co1 * S1) >> 16U); + /* writing output(xb', yb') in little endian format */ + pSrc16[i2 * 2U] = out1; + pSrc16[(i2 * 2U) + 1U] = out2; + + /* Co3 & si3 are read from Coefficient pointer */ + Co3 = pCoef16[3U * ic * 2U]; + Si3 = pCoef16[(3U * ic * 2U) + 1U]; + /* Butterfly process for the i0+3fftLen/4 sample */ + /* xd' = (xa+yb-xc-yd)* Co3 - (ya-xb-yc+xd)* (si3) */ + out1 = (q15_t) ((Co3 * R0 - Si3 * R1) >> 16U); + /* yd' = (ya-xb-yc+xd)* Co3 + (xa+yb-xc-yd)* (si3) */ + out2 = (q15_t) ((Si3 * R0 + Co3 * R1) >> 16U); + /* writing output(xd', yd') in little endian format */ + pSrc16[i3 * 2U] = out1; + pSrc16[(i3 * 2U) + 1U] = out2; + + /* Twiddle coefficients index modifier */ + ic = ic + twidCoefModifier; + + /* Updating input index */ + i0 = i0 + 1U; + + } while (--j); + + /* End of first stage process */ + + /* data is in 4.11(q11) format */ + + + /* Start of Middle stage process */ + + /* Twiddle coefficients index modifier */ + twidCoefModifier <<= 2U; + + /* Calculation of Middle stage */ + for (k = fftLen / 4U; k > 4U; k >>= 2U) + { + /* Initializations for the middle stage */ + n1 = n2; + n2 >>= 2U; + ic = 0U; + + for (j = 0U; j <= (n2 - 1U); j++) + { + /* index calculation for the coefficients */ + Co1 = pCoef16[ic * 2U]; + Si1 = pCoef16[(ic * 2U) + 1U]; + Co2 = pCoef16[2U * ic * 2U]; + Si2 = pCoef16[2U * ic * 2U + 1U]; + Co3 = pCoef16[3U * ic * 2U]; + Si3 = pCoef16[(3U * ic * 2U) + 1U]; + + /* Twiddle coefficients index modifier */ + ic = ic + twidCoefModifier; + + /* Butterfly implementation */ + for (i0 = j; i0 < fftLen; i0 += n1) + { + /* index calculation for the input as, */ + /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Reading i0, i0+fftLen/2 inputs */ + /* Read ya (real), xa(imag) input */ + T0 = pSrc16[i0 * 2U]; + T1 = pSrc16[(i0 * 2U) + 1U]; + + /* Read yc (real), xc(imag) input */ + S0 = pSrc16[i2 * 2U]; + S1 = pSrc16[(i2 * 2U) + 1U]; + + + /* R0 = (ya + yc), R1 = (xa + xc) */ + R0 = __SSAT(T0 + S0, 16U); + R1 = __SSAT(T1 + S1, 16U); + /* S0 = (ya - yc), S1 = (xa - xc) */ + S0 = __SSAT(T0 - S0, 16U); + S1 = __SSAT(T1 - S1, 16U); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U]; + T1 = pSrc16[(i1 * 2U) + 1U]; + + /* Read yd (real), xd(imag) input */ + U0 = pSrc16[i3 * 2U]; + U1 = pSrc16[(i3 * 2U) + 1U]; + + /* T0 = (yb + yd), T1 = (xb + xd) */ + T0 = __SSAT(T0 + U0, 16U); + T1 = __SSAT(T1 + U1, 16U); + + /* writing the butterfly processed i0 sample */ + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + pSrc16[i0 * 2U] = ((R0 >> 1U) + (T0 >> 1U)) >> 1U; + pSrc16[(i0 * 2U) + 1U] = ((R1 >> 1U) + (T1 >> 1U)) >> 1U; + + /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc) - (xb + xd) */ + R0 = (R0 >> 1U) - (T0 >> 1U); + R1 = (R1 >> 1U) - (T1 >> 1U); + + /* (ya-yb+yc-yd)* (si2) - (xa-xb+xc-xd)* co2 */ + out1 = (q15_t) ((Co2 * R0 - Si2 * R1) >> 16); + /* (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) */ + out2 = (q15_t) ((Si2 * R0 + Co2 * R1) >> 16); + + /* Reading i0+3fftLen/4 */ + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U]; + T1 = pSrc16[(i1 * 2U) + 1U]; + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* xc' = (xa-xb+xc-xd)* co2 - (ya-yb+yc-yd)* (si2) */ + /* yc' = (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) */ + pSrc16[i1 * 2U] = out1; + pSrc16[(i1 * 2U) + 1U] = out2; + + /* Butterfly calculations */ + /* Read yd (real), xd(imag) input */ + U0 = pSrc16[i3 * 2U]; + U1 = pSrc16[(i3 * 2U) + 1U]; + + /* T0 = yb-yd, T1 = xb-xd) */ + T0 = __SSAT(T0 - U0, 16U); + T1 = __SSAT(T1 - U1, 16U); + + /* R0 = (ya-yc) - (xb- xd) , R1 = (xa-xc) + (yb-yd) */ + R0 = (S0 >> 1U) + (T1 >> 1U); + R1 = (S1 >> 1U) - (T0 >> 1U); + + /* S1 = (ya-yc) + (xb- xd), S1 = (xa-xc) - (yb-yd) */ + S0 = (S0 >> 1U) - (T1 >> 1U); + S1 = (S1 >> 1U) + (T0 >> 1U); + + /* Butterfly process for the i0+fftLen/2 sample */ + out1 = (q15_t) ((Co1 * S0 - Si1 * S1) >> 16U); + out2 = (q15_t) ((Si1 * S0 + Co1 * S1) >> 16U); + /* xb' = (xa-yb-xc+yd)* co1 - (ya+xb-yc-xd)* (si1) */ + /* yb' = (ya+xb-yc-xd)* co1 + (xa-yb-xc+yd)* (si1) */ + pSrc16[i2 * 2U] = out1; + pSrc16[(i2 * 2U) + 1U] = out2; + + /* Butterfly process for the i0+3fftLen/4 sample */ + out1 = (q15_t) ((Co3 * R0 - Si3 * R1) >> 16U); + + out2 = (q15_t) ((Si3 * R0 + Co3 * R1) >> 16U); + /* xd' = (xa+yb-xc-yd)* Co3 - (ya-xb-yc+xd)* (si3) */ + /* yd' = (ya-xb-yc+xd)* Co3 + (xa+yb-xc-yd)* (si3) */ + pSrc16[i3 * 2U] = out1; + pSrc16[(i3 * 2U) + 1U] = out2; + + + } + } + /* Twiddle coefficients index modifier */ + twidCoefModifier <<= 2U; + } + /* End of Middle stages process */ + + + /* data is in 10.6(q6) format for the 1024 point */ + /* data is in 8.8(q8) format for the 256 point */ + /* data is in 6.10(q10) format for the 64 point */ + /* data is in 4.12(q12) format for the 16 point */ + + /* start of last stage process */ + + + /* Initializations for the last stage */ + n1 = n2; + n2 >>= 2U; + + /* Butterfly implementation */ + for (i0 = 0U; i0 <= (fftLen - n1); i0 += n1) + { + /* index calculation for the input as, */ + /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Reading i0, i0+fftLen/2 inputs */ + /* Read ya (real), xa(imag) input */ + T0 = pSrc16[i0 * 2U]; + T1 = pSrc16[(i0 * 2U) + 1U]; + /* Read yc (real), xc(imag) input */ + S0 = pSrc16[i2 * 2U]; + S1 = pSrc16[(i2 * 2U) + 1U]; + + /* R0 = (ya + yc), R1 = (xa + xc) */ + R0 = __SSAT(T0 + S0, 16U); + R1 = __SSAT(T1 + S1, 16U); + /* S0 = (ya - yc), S1 = (xa - xc) */ + S0 = __SSAT(T0 - S0, 16U); + S1 = __SSAT(T1 - S1, 16U); + + /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U]; + T1 = pSrc16[(i1 * 2U) + 1U]; + /* Read yd (real), xd(imag) input */ + U0 = pSrc16[i3 * 2U]; + U1 = pSrc16[(i3 * 2U) + 1U]; + + /* T0 = (yb + yd), T1 = (xb + xd) */ + T0 = __SSAT(T0 + U0, 16U); + T1 = __SSAT(T1 + U1, 16U); + + /* writing the butterfly processed i0 sample */ + /* xa' = xa + xb + xc + xd */ + /* ya' = ya + yb + yc + yd */ + pSrc16[i0 * 2U] = (R0 >> 1U) + (T0 >> 1U); + pSrc16[(i0 * 2U) + 1U] = (R1 >> 1U) + (T1 >> 1U); + + /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc) - (xb + xd) */ + R0 = (R0 >> 1U) - (T0 >> 1U); + R1 = (R1 >> 1U) - (T1 >> 1U); + + /* Read yb (real), xb(imag) input */ + T0 = pSrc16[i1 * 2U]; + T1 = pSrc16[(i1 * 2U) + 1U]; + + /* writing the butterfly processed i0 + fftLen/4 sample */ + /* xc' = (xa-xb+xc-xd) */ + /* yc' = (ya-yb+yc-yd) */ + pSrc16[i1 * 2U] = R0; + pSrc16[(i1 * 2U) + 1U] = R1; + + /* Read yd (real), xd(imag) input */ + U0 = pSrc16[i3 * 2U]; + U1 = pSrc16[(i3 * 2U) + 1U]; + /* T0 = (yb - yd), T1 = (xb - xd) */ + T0 = __SSAT(T0 - U0, 16U); + T1 = __SSAT(T1 - U1, 16U); + + /* writing the butterfly processed i0 + fftLen/2 sample */ + /* xb' = (xa-yb-xc+yd) */ + /* yb' = (ya+xb-yc-xd) */ + pSrc16[i2 * 2U] = (S0 >> 1U) - (T1 >> 1U); + pSrc16[(i2 * 2U) + 1U] = (S1 >> 1U) + (T0 >> 1U); + + + /* writing the butterfly processed i0 + 3fftLen/4 sample */ + /* xd' = (xa+yb-xc-yd) */ + /* yd' = (ya-xb-yc+xd) */ + pSrc16[i3 * 2U] = (S0 >> 1U) + (T1 >> 1U); + pSrc16[(i3 * 2U) + 1U] = (S1 >> 1U) - (T0 >> 1U); + } + /* end of last stage process */ + + /* output is in 11.5(q5) format for the 1024 point */ + /* output is in 9.7(q7) format for the 256 point */ + /* output is in 7.9(q9) format for the 64 point */ + /* output is in 5.11(q11) format for the 16 point */ + +#endif /* #if defined (ARM_MATH_DSP) */ + +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q31.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q31.c new file mode 100644 index 0000000..a9a59dd --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix4_q31.c @@ -0,0 +1,827 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix4_q31.c + * Description: This file has function definition of Radix-4 FFT & IFFT function and + * In-place bit reversal using bit reversal table + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +void arm_radix4_butterfly_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint32_t twidCoefModifier); + +void arm_radix4_butterfly_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint32_t twidCoefModifier); + +void arm_bitreversal_q31( + q31_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab); + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup ComplexFFT + @{ + */ + +/** + @brief Processing function for the Q31 CFFT/CIFFT. + @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q31 and will be removed in the future. + @param[in] S points to an instance of the Q31 CFFT/CIFFT structure + @param[in,out] pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place + @return none + + @par Input and output formats: + Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process. + Hence the output format is different for different FFT sizes. + The input and output formats for different FFT sizes and number of bits to upscale are mentioned in the tables below for CFFT and CIFFT: + @par + \image html CFFTQ31.gif "Input and Output Formats for Q31 CFFT" + \image html CIFFTQ31.gif "Input and Output Formats for Q31 CIFFT" + */ + +void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc) +{ + if (S->ifftFlag == 1U) + { + /* Complex IFFT radix-4 */ + arm_radix4_butterfly_inverse_q31(pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier); + } + else + { + /* Complex FFT radix-4 */ + arm_radix4_butterfly_q31(pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier); + } + + if (S->bitReverseFlag == 1U) + { + /* Bit Reversal */ + arm_bitreversal_q31(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); + } + +} + +/** + @} end of ComplexFFT group + */ + +/* + * Radix-4 FFT algorithm used is : + * + * Input real and imaginary data: + * x(n) = xa + j * ya + * x(n+N/4 ) = xb + j * yb + * x(n+N/2 ) = xc + j * yc + * x(n+3N 4) = xd + j * yd + * + * + * Output real and imaginary data: + * x(4r) = xa'+ j * ya' + * x(4r+1) = xb'+ j * yb' + * x(4r+2) = xc'+ j * yc' + * x(4r+3) = xd'+ j * yd' + * + * + * Twiddle factors for radix-4 FFT: + * Wn = co1 + j * (- si1) + * W2n = co2 + j * (- si2) + * W3n = co3 + j * (- si3) + * + * Butterfly implementation: + * xa' = xa + xb + xc + xd + * ya' = ya + yb + yc + yd + * xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) + * yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) + * xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) + * yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) + * xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) + * yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) + * + */ + +/** + @brief Core function for the Q31 CFFT butterfly process. + @param[in,out] pSrc points to the in-place buffer of Q31 data type. + @param[in] fftLen length of the FFT. + @param[in] pCoef points to twiddle coefficient buffer. + @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + @return none + */ + +void arm_radix4_butterfly_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint32_t twidCoefModifier) +{ + uint32_t n1, n2, ia1, ia2, ia3, i0, i1, i2, i3, j, k; + q31_t t1, t2, r1, r2, s1, s2, co1, co2, co3, si1, si2, si3; + + q31_t xa, xb, xc, xd; + q31_t ya, yb, yc, yd; + q31_t xa_out, xb_out, xc_out, xd_out; + q31_t ya_out, yb_out, yc_out, yd_out; + + q31_t *ptr1; + + /* Total process is divided into three stages */ + + /* process first stage, middle stages, & last stage */ + + + /* start of first stage process */ + + /* Initializations for the first stage */ + n2 = fftLen; + n1 = n2; + /* n2 = fftLen/4 */ + n2 >>= 2U; + i0 = 0U; + ia1 = 0U; + + j = n2; + + /* Calculation of first stage */ + do + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2U], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* input is in 1.31(q31) format and provide 4 guard bits for the input */ + + /* Butterfly implementation */ + /* xa + xc */ + r1 = (pSrc[(2U * i0)] >> 4U) + (pSrc[(2U * i2)] >> 4U); + /* xa - xc */ + r2 = (pSrc[(2U * i0)] >> 4U) - (pSrc[(2U * i2)] >> 4U); + + /* xb + xd */ + t1 = (pSrc[(2U * i1)] >> 4U) + (pSrc[(2U * i3)] >> 4U); + + /* ya + yc */ + s1 = (pSrc[(2U * i0) + 1U] >> 4U) + (pSrc[(2U * i2) + 1U] >> 4U); + /* ya - yc */ + s2 = (pSrc[(2U * i0) + 1U] >> 4U) - (pSrc[(2U * i2) + 1U] >> 4U); + + /* xa' = xa + xb + xc + xd */ + pSrc[2U * i0] = (r1 + t1); + /* (xa + xc) - (xb + xd) */ + r1 = r1 - t1; + /* yb + yd */ + t2 = (pSrc[(2U * i1) + 1U] >> 4U) + (pSrc[(2U * i3) + 1U] >> 4U); + + /* ya' = ya + yb + yc + yd */ + pSrc[(2U * i0) + 1U] = (s1 + t2); + + /* (ya + yc) - (yb + yd) */ + s1 = s1 - t2; + + /* yb - yd */ + t1 = (pSrc[(2U * i1) + 1U] >> 4U) - (pSrc[(2U * i3) + 1U] >> 4U); + /* xb - xd */ + t2 = (pSrc[(2U * i1)] >> 4U) - (pSrc[(2U * i3)] >> 4U); + + /* index calculation for the coefficients */ + ia2 = 2U * ia1; + co2 = pCoef[(ia2 * 2U)]; + si2 = pCoef[(ia2 * 2U) + 1U]; + + /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32)) + + ((int32_t) (((q63_t) s1 * si2) >> 32))) << 1U; + + /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = (((int32_t) (((q63_t) s1 * co2) >> 32)) - + ((int32_t) (((q63_t) r1 * si2) >> 32))) << 1U; + + /* (xa - xc) + (yb - yd) */ + r1 = r2 + t1; + /* (xa - xc) - (yb - yd) */ + r2 = r2 - t1; + + /* (ya - yc) - (xb - xd) */ + s1 = s2 - t2; + /* (ya - yc) + (xb - xd) */ + s2 = s2 + t2; + + co1 = pCoef[(ia1 * 2U)]; + si1 = pCoef[(ia1 * 2U) + 1U]; + + /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) + + ((int32_t) (((q63_t) s1 * si1) >> 32))) << 1U; + + /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = (((int32_t) (((q63_t) s1 * co1) >> 32)) - + ((int32_t) (((q63_t) r1 * si1) >> 32))) << 1U; + + /* index calculation for the coefficients */ + ia3 = 3U * ia1; + co3 = pCoef[(ia3 * 2U)]; + si3 = pCoef[(ia3 * 2U) + 1U]; + + /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = (((int32_t) (((q63_t) r2 * co3) >> 32)) + + ((int32_t) (((q63_t) s2 * si3) >> 32))) << 1U; + + /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = (((int32_t) (((q63_t) s2 * co3) >> 32)) - + ((int32_t) (((q63_t) r2 * si3) >> 32))) << 1U; + + /* Twiddle coefficients index modifier */ + ia1 = ia1 + twidCoefModifier; + + /* Updating input index */ + i0 = i0 + 1U; + + } while (--j); + + /* end of first stage process */ + + /* data is in 5.27(q27) format */ + + + /* start of Middle stages process */ + + + /* each stage in middle stages provides two down scaling of the input */ + + twidCoefModifier <<= 2U; + + + for (k = fftLen / 4U; k > 4U; k >>= 2U) + { + /* Initializations for the first stage */ + n1 = n2; + n2 >>= 2U; + ia1 = 0U; + + /* Calculation of first stage */ + for (j = 0U; j <= (n2 - 1U); j++) + { + /* index calculation for the coefficients */ + ia2 = ia1 + ia1; + ia3 = ia2 + ia1; + co1 = pCoef[(ia1 * 2U)]; + si1 = pCoef[(ia1 * 2U) + 1U]; + co2 = pCoef[(ia2 * 2U)]; + si2 = pCoef[(ia2 * 2U) + 1U]; + co3 = pCoef[(ia3 * 2U)]; + si3 = pCoef[(ia3 * 2U) + 1U]; + /* Twiddle coefficients index modifier */ + ia1 = ia1 + twidCoefModifier; + + for (i0 = j; i0 < fftLen; i0 += n1) + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2U], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Butterfly implementation */ + /* xa + xc */ + r1 = pSrc[2U * i0] + pSrc[2U * i2]; + /* xa - xc */ + r2 = pSrc[2U * i0] - pSrc[2U * i2]; + + /* ya + yc */ + s1 = pSrc[(2U * i0) + 1U] + pSrc[(2U * i2) + 1U]; + /* ya - yc */ + s2 = pSrc[(2U * i0) + 1U] - pSrc[(2U * i2) + 1U]; + + /* xb + xd */ + t1 = pSrc[2U * i1] + pSrc[2U * i3]; + + /* xa' = xa + xb + xc + xd */ + pSrc[2U * i0] = (r1 + t1) >> 2U; + /* xa + xc -(xb + xd) */ + r1 = r1 - t1; + + /* yb + yd */ + t2 = pSrc[(2U * i1) + 1U] + pSrc[(2U * i3) + 1U]; + /* ya' = ya + yb + yc + yd */ + pSrc[(2U * i0) + 1U] = (s1 + t2) >> 2U; + + /* (ya + yc) - (yb + yd) */ + s1 = s1 - t2; + + /* (yb - yd) */ + t1 = pSrc[(2U * i1) + 1U] - pSrc[(2U * i3) + 1U]; + /* (xb - xd) */ + t2 = pSrc[2U * i1] - pSrc[2U * i3]; + + /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32)) + + ((int32_t) (((q63_t) s1 * si2) >> 32))) >> 1U; + + /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = (((int32_t) (((q63_t) s1 * co2) >> 32)) - + ((int32_t) (((q63_t) r1 * si2) >> 32))) >> 1U; + + /* (xa - xc) + (yb - yd) */ + r1 = r2 + t1; + /* (xa - xc) - (yb - yd) */ + r2 = r2 - t1; + + /* (ya - yc) - (xb - xd) */ + s1 = s2 - t2; + /* (ya - yc) + (xb - xd) */ + s2 = s2 + t2; + + /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) + + ((int32_t) (((q63_t) s1 * si1) >> 32))) >> 1U; + + /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = (((int32_t) (((q63_t) s1 * co1) >> 32)) - + ((int32_t) (((q63_t) r1 * si1) >> 32))) >> 1U; + + /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = (((int32_t) (((q63_t) r2 * co3) >> 32)) + + ((int32_t) (((q63_t) s2 * si3) >> 32))) >> 1U; + + /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = (((int32_t) (((q63_t) s2 * co3) >> 32)) - + ((int32_t) (((q63_t) r2 * si3) >> 32))) >> 1U; + } + } + twidCoefModifier <<= 2U; + } + + /* End of Middle stages process */ + + /* data is in 11.21(q21) format for the 1024 point as there are 3 middle stages */ + /* data is in 9.23(q23) format for the 256 point as there are 2 middle stages */ + /* data is in 7.25(q25) format for the 64 point as there are 1 middle stage */ + /* data is in 5.27(q27) format for the 16 point as there are no middle stages */ + + + /* start of Last stage process */ + /* Initializations for the last stage */ + j = fftLen >> 2; + ptr1 = &pSrc[0]; + + /* Calculations of last stage */ + do + { + /* Read xa (real), ya(imag) input */ + xa = *ptr1++; + ya = *ptr1++; + + /* Read xb (real), yb(imag) input */ + xb = *ptr1++; + yb = *ptr1++; + + /* Read xc (real), yc(imag) input */ + xc = *ptr1++; + yc = *ptr1++; + + /* Read xc (real), yc(imag) input */ + xd = *ptr1++; + yd = *ptr1++; + + /* xa' = xa + xb + xc + xd */ + xa_out = xa + xb + xc + xd; + + /* ya' = ya + yb + yc + yd */ + ya_out = ya + yb + yc + yd; + + /* pointer updation for writing */ + ptr1 = ptr1 - 8U; + + /* writing xa' and ya' */ + *ptr1++ = xa_out; + *ptr1++ = ya_out; + + xc_out = (xa - xb + xc - xd); + yc_out = (ya - yb + yc - yd); + + /* writing xc' and yc' */ + *ptr1++ = xc_out; + *ptr1++ = yc_out; + + xb_out = (xa + yb - xc - yd); + yb_out = (ya - xb - yc + xd); + + /* writing xb' and yb' */ + *ptr1++ = xb_out; + *ptr1++ = yb_out; + + xd_out = (xa - yb - xc + yd); + yd_out = (ya + xb - yc - xd); + + /* writing xd' and yd' */ + *ptr1++ = xd_out; + *ptr1++ = yd_out; + + + } while (--j); + + /* output is in 11.21(q21) format for the 1024 point */ + /* output is in 9.23(q23) format for the 256 point */ + /* output is in 7.25(q25) format for the 64 point */ + /* output is in 5.27(q27) format for the 16 point */ + + /* End of last stage process */ + +} + + +/** + @brief Core function for the Q31 CIFFT butterfly process. + @param[in,out] pSrc points to the in-place buffer of Q31 data type. + @param[in] fftLen length of the FFT. + @param[in] pCoef points to twiddle coefficient buffer. + @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + @return none + */ + +/* + * Radix-4 IFFT algorithm used is : + * + * CIFFT uses same twiddle coefficients as CFFT Function + * x[k] = x[n] + (j)k * x[n + fftLen/4] + (-1)k * x[n+fftLen/2] + (-j)k * x[n+3*fftLen/4] + * + * + * IFFT is implemented with following changes in equations from FFT + * + * Input real and imaginary data: + * x(n) = xa + j * ya + * x(n+N/4 ) = xb + j * yb + * x(n+N/2 ) = xc + j * yc + * x(n+3N 4) = xd + j * yd + * + * + * Output real and imaginary data: + * x(4r) = xa'+ j * ya' + * x(4r+1) = xb'+ j * yb' + * x(4r+2) = xc'+ j * yc' + * x(4r+3) = xd'+ j * yd' + * + * + * Twiddle factors for radix-4 IFFT: + * Wn = co1 + j * (si1) + * W2n = co2 + j * (si2) + * W3n = co3 + j * (si3) + + * The real and imaginary output values for the radix-4 butterfly are + * xa' = xa + xb + xc + xd + * ya' = ya + yb + yc + yd + * xb' = (xa-yb-xc+yd)* co1 - (ya+xb-yc-xd)* (si1) + * yb' = (ya+xb-yc-xd)* co1 + (xa-yb-xc+yd)* (si1) + * xc' = (xa-xb+xc-xd)* co2 - (ya-yb+yc-yd)* (si2) + * yc' = (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) + * xd' = (xa+yb-xc-yd)* co3 - (ya-xb-yc+xd)* (si3) + * yd' = (ya-xb-yc+xd)* co3 + (xa+yb-xc-yd)* (si3) + * + */ + +void arm_radix4_butterfly_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pCoef, + uint32_t twidCoefModifier) +{ + uint32_t n1, n2, ia1, ia2, ia3, i0, i1, i2, i3, j, k; + q31_t t1, t2, r1, r2, s1, s2, co1, co2, co3, si1, si2, si3; + q31_t xa, xb, xc, xd; + q31_t ya, yb, yc, yd; + q31_t xa_out, xb_out, xc_out, xd_out; + q31_t ya_out, yb_out, yc_out, yd_out; + + q31_t *ptr1; + + /* input is be 1.31(q31) format for all FFT sizes */ + /* Total process is divided into three stages */ + /* process first stage, middle stages, & last stage */ + + /* Start of first stage process */ + + /* Initializations for the first stage */ + n2 = fftLen; + n1 = n2; + /* n2 = fftLen/4 */ + n2 >>= 2U; + i0 = 0U; + ia1 = 0U; + + j = n2; + + do + { + /* input is in 1.31(q31) format and provide 4 guard bits for the input */ + + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2U], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Butterfly implementation */ + /* xa + xc */ + r1 = (pSrc[2U * i0] >> 4U) + (pSrc[2U * i2] >> 4U); + /* xa - xc */ + r2 = (pSrc[2U * i0] >> 4U) - (pSrc[2U * i2] >> 4U); + + /* xb + xd */ + t1 = (pSrc[2U * i1] >> 4U) + (pSrc[2U * i3] >> 4U); + + /* ya + yc */ + s1 = (pSrc[(2U * i0) + 1U] >> 4U) + (pSrc[(2U * i2) + 1U] >> 4U); + /* ya - yc */ + s2 = (pSrc[(2U * i0) + 1U] >> 4U) - (pSrc[(2U * i2) + 1U] >> 4U); + + /* xa' = xa + xb + xc + xd */ + pSrc[2U * i0] = (r1 + t1); + /* (xa + xc) - (xb + xd) */ + r1 = r1 - t1; + /* yb + yd */ + t2 = (pSrc[(2U * i1) + 1U] >> 4U) + (pSrc[(2U * i3) + 1U] >> 4U); + /* ya' = ya + yb + yc + yd */ + pSrc[(2U * i0) + 1U] = (s1 + t2); + + /* (ya + yc) - (yb + yd) */ + s1 = s1 - t2; + + /* yb - yd */ + t1 = (pSrc[(2U * i1) + 1U] >> 4U) - (pSrc[(2U * i3) + 1U] >> 4U); + /* xb - xd */ + t2 = (pSrc[2U * i1] >> 4U) - (pSrc[2U * i3] >> 4U); + + /* index calculation for the coefficients */ + ia2 = 2U * ia1; + co2 = pCoef[ia2 * 2U]; + si2 = pCoef[(ia2 * 2U) + 1U]; + + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32)) - + ((int32_t) (((q63_t) s1 * si2) >> 32))) << 1U; + + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + pSrc[2U * i1 + 1U] = (((int32_t) (((q63_t) s1 * co2) >> 32)) + + ((int32_t) (((q63_t) r1 * si2) >> 32))) << 1U; + + /* (xa - xc) - (yb - yd) */ + r1 = r2 - t1; + /* (xa - xc) + (yb - yd) */ + r2 = r2 + t1; + + /* (ya - yc) + (xb - xd) */ + s1 = s2 + t2; + /* (ya - yc) - (xb - xd) */ + s2 = s2 - t2; + + co1 = pCoef[ia1 * 2U]; + si1 = pCoef[(ia1 * 2U) + 1U]; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) - + ((int32_t) (((q63_t) s1 * si1) >> 32))) << 1U; + + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = (((int32_t) (((q63_t) s1 * co1) >> 32)) + + ((int32_t) (((q63_t) r1 * si1) >> 32))) << 1U; + + /* index calculation for the coefficients */ + ia3 = 3U * ia1; + co3 = pCoef[ia3 * 2U]; + si3 = pCoef[(ia3 * 2U) + 1U]; + + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + pSrc[2U * i3] = (((int32_t) (((q63_t) r2 * co3) >> 32)) - + ((int32_t) (((q63_t) s2 * si3) >> 32))) << 1U; + + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = (((int32_t) (((q63_t) s2 * co3) >> 32)) + + ((int32_t) (((q63_t) r2 * si3) >> 32))) << 1U; + + /* Twiddle coefficients index modifier */ + ia1 = ia1 + twidCoefModifier; + + /* Updating input index */ + i0 = i0 + 1U; + + } while (--j); + + /* data is in 5.27(q27) format */ + /* each stage provides two down scaling of the input */ + + + /* Start of Middle stages process */ + + twidCoefModifier <<= 2U; + + /* Calculation of second stage to excluding last stage */ + for (k = fftLen / 4U; k > 4U; k >>= 2U) + { + /* Initializations for the first stage */ + n1 = n2; + n2 >>= 2U; + ia1 = 0U; + + for (j = 0; j <= (n2 - 1U); j++) + { + /* index calculation for the coefficients */ + ia2 = ia1 + ia1; + ia3 = ia2 + ia1; + co1 = pCoef[(ia1 * 2U)]; + si1 = pCoef[(ia1 * 2U) + 1U]; + co2 = pCoef[(ia2 * 2U)]; + si2 = pCoef[(ia2 * 2U) + 1U]; + co3 = pCoef[(ia3 * 2U)]; + si3 = pCoef[(ia3 * 2U) + 1U]; + /* Twiddle coefficients index modifier */ + ia1 = ia1 + twidCoefModifier; + + for (i0 = j; i0 < fftLen; i0 += n1) + { + /* index calculation for the input as, */ + /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2U], pSrc[i0 + 3fftLen/4] */ + i1 = i0 + n2; + i2 = i1 + n2; + i3 = i2 + n2; + + /* Butterfly implementation */ + /* xa + xc */ + r1 = pSrc[2U * i0] + pSrc[2U * i2]; + /* xa - xc */ + r2 = pSrc[2U * i0] - pSrc[2U * i2]; + + /* ya + yc */ + s1 = pSrc[(2U * i0) + 1U] + pSrc[(2U * i2) + 1U]; + /* ya - yc */ + s2 = pSrc[(2U * i0) + 1U] - pSrc[(2U * i2) + 1U]; + + /* xb + xd */ + t1 = pSrc[2U * i1] + pSrc[2U * i3]; + + /* xa' = xa + xb + xc + xd */ + pSrc[2U * i0] = (r1 + t1) >> 2U; + /* xa + xc -(xb + xd) */ + r1 = r1 - t1; + /* yb + yd */ + t2 = pSrc[(2U * i1) + 1U] + pSrc[(2U * i3) + 1U]; + /* ya' = ya + yb + yc + yd */ + pSrc[(2U * i0) + 1U] = (s1 + t2) >> 2U; + + /* (ya + yc) - (yb + yd) */ + s1 = s1 - t2; + + /* (yb - yd) */ + t1 = pSrc[(2U * i1) + 1U] - pSrc[(2U * i3) + 1U]; + /* (xb - xd) */ + t2 = pSrc[2U * i1] - pSrc[2U * i3]; + + /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ + pSrc[2U * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32U)) - + ((int32_t) (((q63_t) s1 * si2) >> 32U))) >> 1U; + + /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ + pSrc[(2U * i1) + 1U] = (((int32_t) (((q63_t) s1 * co2) >> 32U)) + + ((int32_t) (((q63_t) r1 * si2) >> 32U))) >> 1U; + + /* (xa - xc) - (yb - yd) */ + r1 = r2 - t1; + /* (xa - xc) + (yb - yd) */ + r2 = r2 + t1; + + /* (ya - yc) + (xb - xd) */ + s1 = s2 + t2; + /* (ya - yc) - (xb - xd) */ + s2 = s2 - t2; + + /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ + pSrc[2U * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) - + ((int32_t) (((q63_t) s1 * si1) >> 32))) >> 1U; + + /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ + pSrc[(2U * i2) + 1U] = (((int32_t) (((q63_t) s1 * co1) >> 32)) + + ((int32_t) (((q63_t) r1 * si1) >> 32))) >> 1U; + + /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ + pSrc[(2U * i3)] = (((int32_t) (((q63_t) r2 * co3) >> 32)) - + ((int32_t) (((q63_t) s2 * si3) >> 32))) >> 1U; + + /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ + pSrc[(2U * i3) + 1U] = (((int32_t) (((q63_t) s2 * co3) >> 32)) + + ((int32_t) (((q63_t) r2 * si3) >> 32))) >> 1U; + } + } + twidCoefModifier <<= 2U; + } + + /* End of Middle stages process */ + + /* data is in 11.21(q21) format for the 1024 point as there are 3 middle stages */ + /* data is in 9.23(q23) format for the 256 point as there are 2 middle stages */ + /* data is in 7.25(q25) format for the 64 point as there are 1 middle stage */ + /* data is in 5.27(q27) format for the 16 point as there are no middle stages */ + + + /* Start of last stage process */ + + + /* Initializations for the last stage */ + j = fftLen >> 2; + ptr1 = &pSrc[0]; + + /* Calculations of last stage */ + do + { + /* Read xa (real), ya(imag) input */ + xa = *ptr1++; + ya = *ptr1++; + + /* Read xb (real), yb(imag) input */ + xb = *ptr1++; + yb = *ptr1++; + + /* Read xc (real), yc(imag) input */ + xc = *ptr1++; + yc = *ptr1++; + + /* Read xc (real), yc(imag) input */ + xd = *ptr1++; + yd = *ptr1++; + + /* xa' = xa + xb + xc + xd */ + xa_out = xa + xb + xc + xd; + + /* ya' = ya + yb + yc + yd */ + ya_out = ya + yb + yc + yd; + + /* pointer updation for writing */ + ptr1 = ptr1 - 8U; + + /* writing xa' and ya' */ + *ptr1++ = xa_out; + *ptr1++ = ya_out; + + xc_out = (xa - xb + xc - xd); + yc_out = (ya - yb + yc - yd); + + /* writing xc' and yc' */ + *ptr1++ = xc_out; + *ptr1++ = yc_out; + + xb_out = (xa - yb - xc + yd); + yb_out = (ya + xb - yc - xd); + + /* writing xb' and yb' */ + *ptr1++ = xb_out; + *ptr1++ = yb_out; + + xd_out = (xa + yb - xc - yd); + yd_out = (ya - xb - yc + xd); + + /* writing xd' and yd' */ + *ptr1++ = xd_out; + *ptr1++ = yd_out; + + } while (--j); + + /* output is in 11.21(q21) format for the 1024 point */ + /* output is in 9.23(q23) format for the 256 point */ + /* output is in 7.25(q25) format for the 64 point */ + /* output is in 5.27(q27) format for the 16 point */ + + /* End of last stage process */ +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix8_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix8_f32.c new file mode 100644 index 0000000..50048f6 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix8_f32.c @@ -0,0 +1,285 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_radix8_f32.c + * Description: Radix-8 Decimation in Frequency CFFT & CIFFT Floating point processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + + +/* ---------------------------------------------------------------------- + * Internal helper function used by the FFTs + * -------------------------------------------------------------------- */ + +/** + brief Core function for the floating-point CFFT butterfly process. + param[in,out] pSrc points to the in-place buffer of floating-point data type. + param[in] fftLen length of the FFT. + param[in] pCoef points to the twiddle coefficient buffer. + param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + return none +*/ + +void arm_radix8_butterfly_f32( + float32_t * pSrc, + uint16_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier) +{ + uint32_t ia1, ia2, ia3, ia4, ia5, ia6, ia7; + uint32_t i1, i2, i3, i4, i5, i6, i7, i8; + uint32_t id; + uint32_t n1, n2, j; + + float32_t r1, r2, r3, r4, r5, r6, r7, r8; + float32_t t1, t2; + float32_t s1, s2, s3, s4, s5, s6, s7, s8; + float32_t p1, p2, p3, p4; + float32_t co2, co3, co4, co5, co6, co7, co8; + float32_t si2, si3, si4, si5, si6, si7, si8; + const float32_t C81 = 0.70710678118f; + + n2 = fftLen; + + do + { + n1 = n2; + n2 = n2 >> 3; + i1 = 0; + + do + { + i2 = i1 + n2; + i3 = i2 + n2; + i4 = i3 + n2; + i5 = i4 + n2; + i6 = i5 + n2; + i7 = i6 + n2; + i8 = i7 + n2; + r1 = pSrc[2 * i1] + pSrc[2 * i5]; + r5 = pSrc[2 * i1] - pSrc[2 * i5]; + r2 = pSrc[2 * i2] + pSrc[2 * i6]; + r6 = pSrc[2 * i2] - pSrc[2 * i6]; + r3 = pSrc[2 * i3] + pSrc[2 * i7]; + r7 = pSrc[2 * i3] - pSrc[2 * i7]; + r4 = pSrc[2 * i4] + pSrc[2 * i8]; + r8 = pSrc[2 * i4] - pSrc[2 * i8]; + t1 = r1 - r3; + r1 = r1 + r3; + r3 = r2 - r4; + r2 = r2 + r4; + pSrc[2 * i1] = r1 + r2; + pSrc[2 * i5] = r1 - r2; + r1 = pSrc[2 * i1 + 1] + pSrc[2 * i5 + 1]; + s5 = pSrc[2 * i1 + 1] - pSrc[2 * i5 + 1]; + r2 = pSrc[2 * i2 + 1] + pSrc[2 * i6 + 1]; + s6 = pSrc[2 * i2 + 1] - pSrc[2 * i6 + 1]; + s3 = pSrc[2 * i3 + 1] + pSrc[2 * i7 + 1]; + s7 = pSrc[2 * i3 + 1] - pSrc[2 * i7 + 1]; + r4 = pSrc[2 * i4 + 1] + pSrc[2 * i8 + 1]; + s8 = pSrc[2 * i4 + 1] - pSrc[2 * i8 + 1]; + t2 = r1 - s3; + r1 = r1 + s3; + s3 = r2 - r4; + r2 = r2 + r4; + pSrc[2 * i1 + 1] = r1 + r2; + pSrc[2 * i5 + 1] = r1 - r2; + pSrc[2 * i3] = t1 + s3; + pSrc[2 * i7] = t1 - s3; + pSrc[2 * i3 + 1] = t2 - r3; + pSrc[2 * i7 + 1] = t2 + r3; + r1 = (r6 - r8) * C81; + r6 = (r6 + r8) * C81; + r2 = (s6 - s8) * C81; + s6 = (s6 + s8) * C81; + t1 = r5 - r1; + r5 = r5 + r1; + r8 = r7 - r6; + r7 = r7 + r6; + t2 = s5 - r2; + s5 = s5 + r2; + s8 = s7 - s6; + s7 = s7 + s6; + pSrc[2 * i2] = r5 + s7; + pSrc[2 * i8] = r5 - s7; + pSrc[2 * i6] = t1 + s8; + pSrc[2 * i4] = t1 - s8; + pSrc[2 * i2 + 1] = s5 - r7; + pSrc[2 * i8 + 1] = s5 + r7; + pSrc[2 * i6 + 1] = t2 - r8; + pSrc[2 * i4 + 1] = t2 + r8; + + i1 += n1; + } while (i1 < fftLen); + + if (n2 < 8) + break; + + ia1 = 0; + j = 1; + + do + { + /* index calculation for the coefficients */ + id = ia1 + twidCoefModifier; + ia1 = id; + ia2 = ia1 + id; + ia3 = ia2 + id; + ia4 = ia3 + id; + ia5 = ia4 + id; + ia6 = ia5 + id; + ia7 = ia6 + id; + + co2 = pCoef[2 * ia1]; + co3 = pCoef[2 * ia2]; + co4 = pCoef[2 * ia3]; + co5 = pCoef[2 * ia4]; + co6 = pCoef[2 * ia5]; + co7 = pCoef[2 * ia6]; + co8 = pCoef[2 * ia7]; + si2 = pCoef[2 * ia1 + 1]; + si3 = pCoef[2 * ia2 + 1]; + si4 = pCoef[2 * ia3 + 1]; + si5 = pCoef[2 * ia4 + 1]; + si6 = pCoef[2 * ia5 + 1]; + si7 = pCoef[2 * ia6 + 1]; + si8 = pCoef[2 * ia7 + 1]; + + i1 = j; + + do + { + /* index calculation for the input */ + i2 = i1 + n2; + i3 = i2 + n2; + i4 = i3 + n2; + i5 = i4 + n2; + i6 = i5 + n2; + i7 = i6 + n2; + i8 = i7 + n2; + r1 = pSrc[2 * i1] + pSrc[2 * i5]; + r5 = pSrc[2 * i1] - pSrc[2 * i5]; + r2 = pSrc[2 * i2] + pSrc[2 * i6]; + r6 = pSrc[2 * i2] - pSrc[2 * i6]; + r3 = pSrc[2 * i3] + pSrc[2 * i7]; + r7 = pSrc[2 * i3] - pSrc[2 * i7]; + r4 = pSrc[2 * i4] + pSrc[2 * i8]; + r8 = pSrc[2 * i4] - pSrc[2 * i8]; + t1 = r1 - r3; + r1 = r1 + r3; + r3 = r2 - r4; + r2 = r2 + r4; + pSrc[2 * i1] = r1 + r2; + r2 = r1 - r2; + s1 = pSrc[2 * i1 + 1] + pSrc[2 * i5 + 1]; + s5 = pSrc[2 * i1 + 1] - pSrc[2 * i5 + 1]; + s2 = pSrc[2 * i2 + 1] + pSrc[2 * i6 + 1]; + s6 = pSrc[2 * i2 + 1] - pSrc[2 * i6 + 1]; + s3 = pSrc[2 * i3 + 1] + pSrc[2 * i7 + 1]; + s7 = pSrc[2 * i3 + 1] - pSrc[2 * i7 + 1]; + s4 = pSrc[2 * i4 + 1] + pSrc[2 * i8 + 1]; + s8 = pSrc[2 * i4 + 1] - pSrc[2 * i8 + 1]; + t2 = s1 - s3; + s1 = s1 + s3; + s3 = s2 - s4; + s2 = s2 + s4; + r1 = t1 + s3; + t1 = t1 - s3; + pSrc[2 * i1 + 1] = s1 + s2; + s2 = s1 - s2; + s1 = t2 - r3; + t2 = t2 + r3; + p1 = co5 * r2; + p2 = si5 * s2; + p3 = co5 * s2; + p4 = si5 * r2; + pSrc[2 * i5] = p1 + p2; + pSrc[2 * i5 + 1] = p3 - p4; + p1 = co3 * r1; + p2 = si3 * s1; + p3 = co3 * s1; + p4 = si3 * r1; + pSrc[2 * i3] = p1 + p2; + pSrc[2 * i3 + 1] = p3 - p4; + p1 = co7 * t1; + p2 = si7 * t2; + p3 = co7 * t2; + p4 = si7 * t1; + pSrc[2 * i7] = p1 + p2; + pSrc[2 * i7 + 1] = p3 - p4; + r1 = (r6 - r8) * C81; + r6 = (r6 + r8) * C81; + s1 = (s6 - s8) * C81; + s6 = (s6 + s8) * C81; + t1 = r5 - r1; + r5 = r5 + r1; + r8 = r7 - r6; + r7 = r7 + r6; + t2 = s5 - s1; + s5 = s5 + s1; + s8 = s7 - s6; + s7 = s7 + s6; + r1 = r5 + s7; + r5 = r5 - s7; + r6 = t1 + s8; + t1 = t1 - s8; + s1 = s5 - r7; + s5 = s5 + r7; + s6 = t2 - r8; + t2 = t2 + r8; + p1 = co2 * r1; + p2 = si2 * s1; + p3 = co2 * s1; + p4 = si2 * r1; + pSrc[2 * i2] = p1 + p2; + pSrc[2 * i2 + 1] = p3 - p4; + p1 = co8 * r5; + p2 = si8 * s5; + p3 = co8 * s5; + p4 = si8 * r5; + pSrc[2 * i8] = p1 + p2; + pSrc[2 * i8 + 1] = p3 - p4; + p1 = co6 * r6; + p2 = si6 * s6; + p3 = co6 * s6; + p4 = si6 * r6; + pSrc[2 * i6] = p1 + p2; + pSrc[2 * i6 + 1] = p3 - p4; + p1 = co4 * t1; + p2 = si4 * t2; + p3 = co4 * t2; + p4 = si4 * t1; + pSrc[2 * i4] = p1 + p2; + pSrc[2 * i4 + 1] = p3 - p4; + + i1 += n1; + } while (i1 < fftLen); + + j++; + } while (j < n2); + + twidCoefModifier <<= 3; + } while (n2 > 7); +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_f32.c new file mode 100644 index 0000000..87455dc --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_f32.c @@ -0,0 +1,448 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dct4_f32.c + * Description: Processing function of DCT4 & IDCT4 F32 + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @ingroup groupTransforms + */ + +/** + @defgroup DCT4_IDCT4 DCT Type IV Functions + + Representation of signals by minimum number of values is important for storage and transmission. + The possibility of large discontinuity between the beginning and end of a period of a signal + in DFT can be avoided by extending the signal so that it is even-symmetric. + Discrete Cosine Transform (DCT) is constructed such that its energy is heavily concentrated in the lower part of the + spectrum and is very widely used in signal and image coding applications. + The family of DCTs (DCT type- 1,2,3,4) is the outcome of different combinations of homogeneous boundary conditions. + DCT has an excellent energy-packing capability, hence has many applications and in data compression in particular. + + DCT is essentially the Discrete Fourier Transform(DFT) of an even-extended real signal. + Reordering of the input data makes the computation of DCT just a problem of + computing the DFT of a real signal with a few additional operations. + This approach provides regular, simple, and very efficient DCT algorithms for practical hardware and software implementations. + + DCT type-II can be implemented using Fast fourier transform (FFT) internally, as the transform is applied on real values, Real FFT can be used. + DCT4 is implemented using DCT2 as their implementations are similar except with some added pre-processing and post-processing. + DCT2 implementation can be described in the following steps: + - Re-ordering input + - Calculating Real FFT + - Multiplication of weights and Real FFT output and getting real part from the product. + + This process is explained by the block diagram below: + \image html DCT4.gif "Discrete Cosine Transform - type-IV" + + @par Algorithm + The N-point type-IV DCT is defined as a real, linear transformation by the formula: + \image html DCT4Equation.gif + where k = 0, 1, 2, ..., N-1 + @par + Its inverse is defined as follows: + \image html IDCT4Equation.gif + where n = 0, 1, 2, ..., N-1 + @par + The DCT4 matrices become involutory (i.e. they are self-inverse) by multiplying with an overall scale factor of sqrt(2/N). + The symmetry of the transform matrix indicates that the fast algorithms for the forward + and inverse transform computation are identical. + Note that the implementation of Inverse DCT4 and DCT4 is same, hence same process function can be used for both. + + @par Lengths supported by the transform: + As DCT4 internally uses Real FFT, it supports all the lengths 128, 512, 2048 and 8192. + The library provides separate functions for Q15, Q31, and floating-point data types. + + @par Instance Structure + The instances for Real FFT and FFT, cosine values table and twiddle factor table are stored in an instance data structure. + A separate instance structure must be defined for each transform. + There are separate instance structure declarations for each of the 3 supported data types. + + @par Initialization Functions + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Initializes Real FFT as its process function is used internally in DCT4, by calling \ref arm_rfft_init_f32(). + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure cannot be placed into a const data section. + To place an instance structure into a const data section, the instance structure must be manually initialized. + Manually initialize the instance structure as follows: +
+      arm_dct4_instance_f32 S = {N, Nby2, normalize, pTwiddle, pCosFactor, pRfft, pCfft};
+      arm_dct4_instance_q31 S = {N, Nby2, normalize, pTwiddle, pCosFactor, pRfft, pCfft};
+      arm_dct4_instance_q15 S = {N, Nby2, normalize, pTwiddle, pCosFactor, pRfft, pCfft};
+  
+ where \c N is the length of the DCT4; \c Nby2 is half of the length of the DCT4; + \c normalize is normalizing factor used and is equal to sqrt(2/N); + \c pTwiddle points to the twiddle factor table; + \c pCosFactor points to the cosFactor table; + \c pRfft points to the real FFT instance; + \c pCfft points to the complex FFT instance; + The CFFT and RFFT structures also needs to be initialized, refer to arm_cfft_radix4_f32() + and arm_rfft_f32() respectively for details regarding static initialization. + + @par Fixed-Point Behavior + Care must be taken when using the fixed-point versions of the DCT4 transform 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 DCT4_IDCT4 + @{ + */ + +/** + @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 + @return none + */ + +void arm_dct4_f32( + const arm_dct4_instance_f32 * S, + float32_t * pState, + float32_t * pInlineBuffer) +{ + const float32_t *weights = S->pTwiddle; /* Pointer to the Weights table */ + const float32_t *cosFact = S->pCosFactor; /* Pointer to the cos factors table */ + float32_t *pS1, *pS2, *pbuff; /* Temporary pointers for input buffer and pState buffer */ + float32_t in; /* Temporary variable */ + uint32_t i; /* Loop counter */ + + + /* DCT4 computation involves DCT2 (which is calculated using RFFT) + * along with some pre-processing and post-processing. + * Computational procedure is explained as follows: + * (a) Pre-processing involves multiplying input with cos factor, + * r(n) = 2 * u(n) * cos(pi*(2*n+1)/(4*n)) + * where, + * r(n) -- output of preprocessing + * u(n) -- input to preprocessing(actual Source buffer) + * (b) Calculation of DCT2 using FFT is divided into three steps: + * Step1: Re-ordering of even and odd elements of input. + * Step2: Calculating FFT of the re-ordered input. + * Step3: Taking the real part of the product of FFT output and weights. + * (c) Post-processing - DCT4 can be obtained from DCT2 output using the following equation: + * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) + * where, + * Y4 -- DCT4 output, Y2 -- DCT2 output + * (d) Multiplying the output with the normalizing factor sqrt(2/N). + */ + + /*-------- Pre-processing ------------*/ + /* Multiplying input with cos factor i.e. r(n) = 2 * x(n) * cos(pi*(2*n+1)/(4*n)) */ + arm_scale_f32(pInlineBuffer, 2.0f, pInlineBuffer, S->N); + arm_mult_f32(pInlineBuffer, cosFact, pInlineBuffer, S->N); + + /* ---------------------------------------------------------------- + * Step1: Re-ordering of even and odd elements as + * pState[i] = pInlineBuffer[2*i] and + * pState[N-i-1] = pInlineBuffer[2*i+1] where i = 0 to N/2 + ---------------------------------------------------------------------*/ + + /* pS1 initialized to pState */ + pS1 = pState; + + /* pS2 initialized to pState+N-1, so that it points to the end of the state buffer */ + pS2 = pState + (S->N - 1U); + + /* pbuff initialized to input buffer */ + pbuff = pInlineBuffer; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Initializing the loop counter to N/2 >> 2 for loop unrolling by 4 */ + i = S->Nby2 >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + do + { + /* Re-ordering of even and odd elements */ + /* pState[i] = pInlineBuffer[2*i] */ + *pS1++ = *pbuff++; + /* pState[N-i-1] = pInlineBuffer[2*i+1] */ + *pS2-- = *pbuff++; + + *pS1++ = *pbuff++; + *pS2-- = *pbuff++; + + *pS1++ = *pbuff++; + *pS2-- = *pbuff++; + + *pS1++ = *pbuff++; + *pS2-- = *pbuff++; + + /* Decrement loop counter */ + i--; + } while (i > 0U); + + /* pbuff initialized to input buffer */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Initializing the loop counter to N/4 instead of N for loop unrolling */ + i = S->N >> 2U; + + /* Processing with loop unrolling 4 times as N is always multiple of 4. + * Compute 4 outputs at a time */ + do + { + /* Writing the re-ordered output back to inplace input buffer */ + *pbuff++ = *pS1++; + *pbuff++ = *pS1++; + *pbuff++ = *pS1++; + *pbuff++ = *pS1++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + + /* --------------------------------------------------------- + * Step2: Calculate RFFT for N-point input + * ---------------------------------------------------------- */ + /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ + arm_rfft_f32 (S->pRfft, pInlineBuffer, pState); + + /*---------------------------------------------------------------------- + * Step3: Multiply the FFT output with the weights. + *----------------------------------------------------------------------*/ + arm_cmplx_mult_cmplx_f32 (pState, weights, pState, S->N); + + /* ----------- Post-processing ---------- */ + /* DCT-IV can be obtained from DCT-II by the equation, + * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) + * Hence, Y4(0) = Y2(0)/2 */ + /* Getting only real part from the output and Converting to DCT-IV */ + + /* Initializing the loop counter to N >> 2 for loop unrolling by 4 */ + i = (S->N - 1U) >> 2U; + + /* pbuff initialized to input buffer. */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ + in = *pS1++ * (float32_t) 0.5; + /* input buffer acts as inplace, so output values are stored in the input itself. */ + *pbuff++ = in; + + /* pState pointer is incremented twice as the real values are located alternatively in the array */ + pS1++; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + do + { + /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ + /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ + in = *pS1++ - in; + *pbuff++ = in; + /* points to the next real value */ + pS1++; + + in = *pS1++ - in; + *pbuff++ = in; + pS1++; + + in = *pS1++ - in; + *pbuff++ = in; + pS1++; + + in = *pS1++ - in; + *pbuff++ = in; + pS1++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + i = (S->N - 1U) % 0x4U; + + while (i > 0U) + { + /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ + /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ + in = *pS1++ - in; + *pbuff++ = in; + + /* points to the next real value */ + pS1++; + + /* Decrement the loop counter */ + i--; + } + + + /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ + + /* Initializing the loop counter to N/4 instead of N for loop unrolling */ + i = S->N >> 2U; + + /* pbuff initialized to the pInlineBuffer(now contains the output values) */ + pbuff = pInlineBuffer; + + /* Processing with loop unrolling 4 times as N is always multiple of 4. Compute 4 outputs at a time */ + do + { + /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ + in = *pbuff; + *pbuff++ = in * S->normalize; + + in = *pbuff; + *pbuff++ = in * S->normalize; + + in = *pbuff; + *pbuff++ = in * S->normalize; + + in = *pbuff; + *pbuff++ = in * S->normalize; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + +#else + + /* Initializing the loop counter to N/2 */ + i = S->Nby2; + + do + { + /* Re-ordering of even and odd elements */ + /* pState[i] = pInlineBuffer[2*i] */ + *pS1++ = *pbuff++; + /* pState[N-i-1] = pInlineBuffer[2*i+1] */ + *pS2-- = *pbuff++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + /* pbuff initialized to input buffer */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Initializing the loop counter */ + i = S->N; + + do + { + /* Writing the re-ordered output back to inplace input buffer */ + *pbuff++ = *pS1++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + + /* --------------------------------------------------------- + * Step2: Calculate RFFT for N-point input + * ---------------------------------------------------------- */ + /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ + arm_rfft_f32 (S->pRfft, pInlineBuffer, pState); + + /*---------------------------------------------------------------------- + * Step3: Multiply the FFT output with the weights. + *----------------------------------------------------------------------*/ + arm_cmplx_mult_cmplx_f32 (pState, weights, pState, S->N); + + /* ----------- Post-processing ---------- */ + /* DCT-IV can be obtained from DCT-II by the equation, + * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) + * Hence, Y4(0) = Y2(0)/2 */ + /* Getting only real part from the output and Converting to DCT-IV */ + + /* pbuff initialized to input buffer. */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ + in = *pS1++ * (float32_t) 0.5; + /* input buffer acts as inplace, so output values are stored in the input itself. */ + *pbuff++ = in; + + /* pState pointer is incremented twice as the real values are located alternatively in the array */ + pS1++; + + /* Initializing the loop counter */ + i = (S->N - 1U); + + do + { + /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ + /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ + in = *pS1++ - in; + *pbuff++ = in; + + /* points to the next real value */ + pS1++; + + /* Decrement loop counter */ + i--; + } while (i > 0U); + + /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ + + /* Initializing loop counter */ + i = S->N; + + /* pbuff initialized to the pInlineBuffer (now contains the output values) */ + pbuff = pInlineBuffer; + + do + { + /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ + in = *pbuff; + *pbuff++ = in * S->normalize; + + /* Decrement loop counter */ + i--; + } while (i > 0U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + +} + +/** + @} end of DCT4_IDCT4 group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_f32.c new file mode 100644 index 0000000..3fd70e9 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_f32.c @@ -0,0 +1,131 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dct4_init_f32.c + * Description: Initialization function of DCT-4 & IDCT4 F32 + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup DCT4_IDCT4 + */ + + +/** + @addtogroup DCT4_IDCT4 + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : N is not a supported transform length + + @par Normalizing factor + The normalizing factor is sqrt(2/N), which depends on the size of transform N. + Floating-point normalizing factors are mentioned in the table below for different DCT sizes: + + \image html dct4NormalizingF32Table.gif + */ + +arm_status arm_dct4_init_f32( + arm_dct4_instance_f32 * S, + arm_rfft_instance_f32 * S_RFFT, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint16_t N, + uint16_t Nby2, + float32_t normalize) +{ + /* Initialize the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + + /* Initialize the DCT4 length */ + S->N = N; + + /* Initialize the half of DCT4 length */ + S->Nby2 = Nby2; + + /* Initialize the DCT4 Normalizing factor */ + S->normalize = normalize; + + /* Initialize Real FFT Instance */ + S->pRfft = S_RFFT; + + /* Initialize Complex FFT Instance */ + S->pCfft = S_CFFT; + + switch (N) + { + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_8192) + /* Initialize the table modifier values */ + case 8192U: + S->pTwiddle = Weights_8192; + S->pCosFactor = cos_factors_8192; + break; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_2048) + case 2048U: + S->pTwiddle = Weights_2048; + S->pCosFactor = cos_factors_2048; + break; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_512) + case 512U: + S->pTwiddle = Weights_512; + S->pCosFactor = cos_factors_512; + break; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_128) + case 128U: + S->pTwiddle = Weights_128; + S->pCosFactor = cos_factors_128; + break; + #endif + default: + status = ARM_MATH_ARGUMENT_ERROR; + } + + /* Initialize the RFFT/RIFFT Function */ + arm_rfft_init_f32(S->pRfft, S->pCfft, S->N, 0U, 1U); + + /* return the status of DCT4 Init function */ + return (status); +} + +/** + @} end of DCT4_IDCT4 group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q15.c b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q15.c new file mode 100644 index 0000000..3c55192 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q15.c @@ -0,0 +1,130 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dct4_init_q15.c + * Description: Initialization function of DCT-4 & IDCT4 Q15 + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup DCT4_IDCT4 + */ + +/** + @addtogroup DCT4_IDCT4 + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : N is not a supported transform length + + @par Normalizing factor + The normalizing factor is sqrt(2/N), which depends on the size of transform N. + Normalizing factors in 1.15 format are mentioned in the table below for different DCT sizes: + + \image html dct4NormalizingQ15Table.gif + */ + +arm_status arm_dct4_init_q15( + arm_dct4_instance_q15 * S, + arm_rfft_instance_q15 * S_RFFT, + arm_cfft_radix4_instance_q15 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q15_t normalize) +{ + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + /* Initialize the DCT4 length */ + S->N = N; + + /* Initialize the half of DCT4 length */ + S->Nby2 = Nby2; + + /* Initialize the DCT4 Normalizing factor */ + S->normalize = normalize; + + /* Initialize Real FFT Instance */ + S->pRfft = S_RFFT; + + /* Initialize Complex FFT Instance */ + S->pCfft = S_CFFT; + + switch (N) + { + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_8192) + /* Initialize the table modifier values */ + case 8192U: + S->pTwiddle = WeightsQ15_8192; + S->pCosFactor = cos_factorsQ15_8192; + break; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_2048) + case 2048U: + S->pTwiddle = WeightsQ15_2048; + S->pCosFactor = cos_factorsQ15_2048; + break; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_512) + case 512U: + S->pTwiddle = WeightsQ15_512; + S->pCosFactor = cos_factorsQ15_512; + break; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_128) + case 128U: + S->pTwiddle = WeightsQ15_128; + S->pCosFactor = cos_factorsQ15_128; + break; + #endif + + default: + status = ARM_MATH_ARGUMENT_ERROR; + } + + /* Initialize the RFFT/RIFFT */ + arm_rfft_init_q15(S->pRfft, S->N, 0U, 1U); + + /* return the status of DCT4 Init function */ + return (status); +} + +/** + @} end of DCT4_IDCT4 group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q31.c b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q31.c new file mode 100644 index 0000000..f5cc78b --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_init_q31.c @@ -0,0 +1,130 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dct4_init_q31.c + * Description: Initialization function of DCT-4 & IDCT4 Q31 + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup DCT4_IDCT4 + */ + + +/** + @addtogroup DCT4_IDCT4 + @{ + */ + +/** + @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 execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : N is not a supported transform length + + @par Normalizing factor: + The normalizing factor is sqrt(2/N), which depends on the size of transform N. + Normalizing factors in 1.31 format are mentioned in the table below for different DCT sizes: + + \image html dct4NormalizingQ31Table.gif + */ + +arm_status arm_dct4_init_q31( + arm_dct4_instance_q31 * S, + arm_rfft_instance_q31 * S_RFFT, + arm_cfft_radix4_instance_q31 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q31_t normalize) +{ + /* Initialize the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + /* Initialize the DCT4 length */ + S->N = N; + + /* Initialize the half of DCT4 length */ + S->Nby2 = Nby2; + + /* Initialize the DCT4 Normalizing factor */ + S->normalize = normalize; + + /* Initialize Real FFT Instance */ + S->pRfft = S_RFFT; + + /* Initialize Complex FFT Instance */ + S->pCfft = S_CFFT; + + switch (N) + { + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_8192) + /* Initialize the table modifier values */ + case 8192U: + S->pTwiddle = WeightsQ31_8192; + S->pCosFactor = cos_factorsQ31_8192; + break; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_2048) + case 2048U: + S->pTwiddle = WeightsQ31_2048; + S->pCosFactor = cos_factorsQ31_2048; + break; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_512) + case 512U: + S->pTwiddle = WeightsQ31_512; + S->pCosFactor = cos_factorsQ31_512; + break; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_128) + case 128U: + S->pTwiddle = WeightsQ31_128; + S->pCosFactor = cos_factorsQ31_128; + break; + #endif + default: + status = ARM_MATH_ARGUMENT_ERROR; + } + + /* Initialize the RFFT/RIFFT Function */ + arm_rfft_init_q31(S->pRfft, S->N, 0U, 1U); + + /* return the status of DCT4 Init function */ + return (status); +} + +/** + @} end of DCT4_IDCT4 group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q15.c b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q15.c new file mode 100644 index 0000000..f926a1d --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q15.c @@ -0,0 +1,381 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dct4_q15.c + * Description: Processing function of DCT4 & IDCT4 Q15 + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @addtogroup DCT4_IDCT4 + @{ + */ + +/** + @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. + @return none + + @par Input an output formats + Internally inputs are downscaled in the RFFT process function to avoid overflows. + Number of bits downscaled, depends on the size of the transform. The input and output + formats for different DCT sizes and number of bits to upscale are mentioned in the table below: + + \image html dct4FormatsQ15Table.gif + */ + +void arm_dct4_q15( + const arm_dct4_instance_q15 * S, + q15_t * pState, + q15_t * pInlineBuffer) +{ + const q15_t *weights = S->pTwiddle; /* Pointer to the Weights table */ + const q15_t *cosFact = S->pCosFactor; /* Pointer to the cos factors table */ + q15_t *pS1, *pS2, *pbuff; /* Temporary pointers for input buffer and pState buffer */ + q15_t in; /* Temporary variable */ + uint32_t i; /* Loop counter */ + + + /* DCT4 computation involves DCT2 (which is calculated using RFFT) + * along with some pre-processing and post-processing. + * Computational procedure is explained as follows: + * (a) Pre-processing involves multiplying input with cos factor, + * r(n) = 2 * u(n) * cos(pi*(2*n+1)/(4*n)) + * where, + * r(n) -- output of preprocessing + * u(n) -- input to preprocessing(actual Source buffer) + * (b) Calculation of DCT2 using FFT is divided into three steps: + * Step1: Re-ordering of even and odd elements of input. + * Step2: Calculating FFT of the re-ordered input. + * Step3: Taking the real part of the product of FFT output and weights. + * (c) Post-processing - DCT4 can be obtained from DCT2 output using the following equation: + * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) + * where, + * Y4 -- DCT4 output, Y2 -- DCT2 output + * (d) Multiplying the output with the normalizing factor sqrt(2/N). + */ + + /*-------- Pre-processing ------------*/ + /* Multiplying input with cos factor i.e. r(n) = 2 * x(n) * cos(pi*(2*n+1)/(4*n)) */ + arm_mult_q15 (pInlineBuffer, cosFact, pInlineBuffer, S->N); + arm_shift_q15 (pInlineBuffer, 1, pInlineBuffer, S->N); + + /* ---------------------------------------------------------------- + * Step1: Re-ordering of even and odd elements as + * pState[i] = pInlineBuffer[2*i] and + * pState[N-i-1] = pInlineBuffer[2*i+1] where i = 0 to N/2 + ---------------------------------------------------------------------*/ + + /* pS1 initialized to pState */ + pS1 = pState; + + /* pS2 initialized to pState+N-1, so that it points to the end of the state buffer */ + pS2 = pState + (S->N - 1U); + + /* pbuff initialized to input buffer */ + pbuff = pInlineBuffer; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Initializing the loop counter to N/2 >> 2 for loop unrolling by 4 */ + i = S->Nby2 >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + do + { + /* Re-ordering of even and odd elements */ + /* pState[i] = pInlineBuffer[2*i] */ + *pS1++ = *pbuff++; + /* pState[N-i-1] = pInlineBuffer[2*i+1] */ + *pS2-- = *pbuff++; + + *pS1++ = *pbuff++; + *pS2-- = *pbuff++; + + *pS1++ = *pbuff++; + *pS2-- = *pbuff++; + + *pS1++ = *pbuff++; + *pS2-- = *pbuff++; + + /* Decrement loop counter */ + i--; + } while (i > 0U); + + /* pbuff initialized to input buffer */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Initializing the loop counter to N/4 instead of N for loop unrolling */ + i = S->N >> 2U; + + /* Processing with loop unrolling 4 times as N is always multiple of 4. + * Compute 4 outputs at a time */ + do + { + /* Writing the re-ordered output back to inplace input buffer */ + *pbuff++ = *pS1++; + *pbuff++ = *pS1++; + *pbuff++ = *pS1++; + *pbuff++ = *pS1++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + + /* --------------------------------------------------------- + * Step2: Calculate RFFT for N-point input + * ---------------------------------------------------------- */ + /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ + arm_rfft_q15 (S->pRfft, pInlineBuffer, pState); + + /*---------------------------------------------------------------------- + * Step3: Multiply the FFT output with the weights. + *----------------------------------------------------------------------*/ + arm_cmplx_mult_cmplx_q15 (pState, weights, pState, S->N); + + /* The output of complex multiplication is in 3.13 format. + * Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.15 format by shifting left by 2 bits. */ + arm_shift_q15 (pState, 2, pState, S->N * 2); + + /* ----------- Post-processing ---------- */ + /* DCT-IV can be obtained from DCT-II by the equation, + * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) + * Hence, Y4(0) = Y2(0)/2 */ + /* Getting only real part from the output and Converting to DCT-IV */ + + /* Initializing the loop counter to N >> 2 for loop unrolling by 4 */ + i = (S->N - 1U) >> 2U; + + /* pbuff initialized to input buffer. */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ + in = *pS1++ >> 1U; + /* input buffer acts as inplace, so output values are stored in the input itself. */ + *pbuff++ = in; + + /* pState pointer is incremented twice as the real values are located alternatively in the array */ + pS1++; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + do + { + /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ + /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ + in = *pS1++ - in; + *pbuff++ = in; + /* points to the next real value */ + pS1++; + + in = *pS1++ - in; + *pbuff++ = in; + pS1++; + + in = *pS1++ - in; + *pbuff++ = in; + pS1++; + + in = *pS1++ - in; + *pbuff++ = in; + pS1++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + i = (S->N - 1U) % 0x4U; + + while (i > 0U) + { + /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ + /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ + in = *pS1++ - in; + *pbuff++ = in; + + /* points to the next real value */ + pS1++; + + /* Decrement loop counter */ + i--; + } + + + /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ + + /* Initializing the loop counter to N/4 instead of N for loop unrolling */ + i = S->N >> 2U; + + /* pbuff initialized to the pInlineBuffer(now contains the output values) */ + pbuff = pInlineBuffer; + + /* Processing with loop unrolling 4 times as N is always multiple of 4. Compute 4 outputs at a time */ + do + { + /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ + in = *pbuff; + *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); + + in = *pbuff; + *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); + + in = *pbuff; + *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); + + in = *pbuff; + *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); + + /* Decrement loop counter */ + i--; + } while (i > 0U); + + +#else + + /* Initializing the loop counter to N/2 */ + i = S->Nby2; + + do + { + /* Re-ordering of even and odd elements */ + /* pState[i] = pInlineBuffer[2*i] */ + *pS1++ = *pbuff++; + /* pState[N-i-1] = pInlineBuffer[2*i+1] */ + *pS2-- = *pbuff++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + /* pbuff initialized to input buffer */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Initializing the loop counter */ + i = S->N; + + do + { + /* Writing the re-ordered output back to inplace input buffer */ + *pbuff++ = *pS1++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + + /* --------------------------------------------------------- + * Step2: Calculate RFFT for N-point input + * ---------------------------------------------------------- */ + /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ + arm_rfft_q15 (S->pRfft, pInlineBuffer, pState); + + /*---------------------------------------------------------------------- + * Step3: Multiply the FFT output with the weights. + *----------------------------------------------------------------------*/ + arm_cmplx_mult_cmplx_q15 (pState, weights, pState, S->N); + + /* The output of complex multiplication is in 3.13 format. + * Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.15 format by shifting left by 2 bits. */ + arm_shift_q15 (pState, 2, pState, S->N * 2); + + /* ----------- Post-processing ---------- */ + /* DCT-IV can be obtained from DCT-II by the equation, + * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) + * Hence, Y4(0) = Y2(0)/2 */ + /* Getting only real part from the output and Converting to DCT-IV */ + + /* pbuff initialized to input buffer. */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ + in = *pS1++ >> 1U; + /* input buffer acts as inplace, so output values are stored in the input itself. */ + *pbuff++ = in; + + /* pState pointer is incremented twice as the real values are located alternatively in the array */ + pS1++; + + /* Initializing the loop counter */ + i = (S->N - 1U); + + do + { + /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ + /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ + in = *pS1++ - in; + *pbuff++ = in; + + /* points to the next real value */ + pS1++; + + /* Decrement loop counter */ + i--; + } while (i > 0U); + + /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ + + /* Initializing loop counter */ + i = S->N; + + /* pbuff initialized to the pInlineBuffer (now contains the output values) */ + pbuff = pInlineBuffer; + + do + { + /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ + in = *pbuff; + *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); + + /* Decrement loop counter */ + i--; + + } while (i > 0U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + +} + +/** + @} end of DCT4_IDCT4 group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q31.c b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q31.c new file mode 100644 index 0000000..369a5c3 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_dct4_q31.c @@ -0,0 +1,383 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_dct4_q31.c + * Description: Processing function of DCT4 & IDCT4 Q31 + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/** + @addtogroup DCT4_IDCT4 + @{ + */ + +/** + @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. + @return none + + @par Input an output formats + Input samples need to be downscaled by 1 bit to avoid saturations in the Q31 DCT process, + as the conversion from DCT2 to DCT4 involves one subtraction. + Internally inputs are downscaled in the RFFT process function to avoid overflows. + Number of bits downscaled, depends on the size of the transform. + The input and output formats for different DCT sizes and number of bits to upscale are + mentioned in the table below: + + \image html dct4FormatsQ31Table.gif + */ + +void arm_dct4_q31( + const arm_dct4_instance_q31 * S, + q31_t * pState, + q31_t * pInlineBuffer) +{ + const q31_t *weights = S->pTwiddle; /* Pointer to the Weights table */ + const q31_t *cosFact = S->pCosFactor; /* Pointer to the cos factors table */ + q31_t *pS1, *pS2, *pbuff; /* Temporary pointers for input buffer and pState buffer */ + q31_t in; /* Temporary variable */ + uint32_t i; /* Loop counter */ + + + /* DCT4 computation involves DCT2 (which is calculated using RFFT) + * along with some pre-processing and post-processing. + * Computational procedure is explained as follows: + * (a) Pre-processing involves multiplying input with cos factor, + * r(n) = 2 * u(n) * cos(pi*(2*n+1)/(4*n)) + * where, + * r(n) -- output of preprocessing + * u(n) -- input to preprocessing(actual Source buffer) + * (b) Calculation of DCT2 using FFT is divided into three steps: + * Step1: Re-ordering of even and odd elements of input. + * Step2: Calculating FFT of the re-ordered input. + * Step3: Taking the real part of the product of FFT output and weights. + * (c) Post-processing - DCT4 can be obtained from DCT2 output using the following equation: + * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) + * where, + * Y4 -- DCT4 output, Y2 -- DCT2 output + * (d) Multiplying the output with the normalizing factor sqrt(2/N). + */ + + /*-------- Pre-processing ------------*/ + /* Multiplying input with cos factor i.e. r(n) = 2 * x(n) * cos(pi*(2*n+1)/(4*n)) */ + arm_mult_q31 (pInlineBuffer, cosFact, pInlineBuffer, S->N); + arm_shift_q31 (pInlineBuffer, 1, pInlineBuffer, S->N); + + /* ---------------------------------------------------------------- + * Step1: Re-ordering of even and odd elements as + * pState[i] = pInlineBuffer[2*i] and + * pState[N-i-1] = pInlineBuffer[2*i+1] where i = 0 to N/2 + ---------------------------------------------------------------------*/ + + /* pS1 initialized to pState */ + pS1 = pState; + + /* pS2 initialized to pState+N-1, so that it points to the end of the state buffer */ + pS2 = pState + (S->N - 1U); + + /* pbuff initialized to input buffer */ + pbuff = pInlineBuffer; + + +#if defined (ARM_MATH_LOOPUNROLL) + + /* Initializing the loop counter to N/2 >> 2 for loop unrolling by 4 */ + i = S->Nby2 >> 2U; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + do + { + /* Re-ordering of even and odd elements */ + /* pState[i] = pInlineBuffer[2*i] */ + *pS1++ = *pbuff++; + /* pState[N-i-1] = pInlineBuffer[2*i+1] */ + *pS2-- = *pbuff++; + + *pS1++ = *pbuff++; + *pS2-- = *pbuff++; + + *pS1++ = *pbuff++; + *pS2-- = *pbuff++; + + *pS1++ = *pbuff++; + *pS2-- = *pbuff++; + + /* Decrement loop counter */ + i--; + } while (i > 0U); + + /* pbuff initialized to input buffer */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Initializing the loop counter to N/4 instead of N for loop unrolling */ + i = S->N >> 2U; + + /* Processing with loop unrolling 4 times as N is always multiple of 4. + * Compute 4 outputs at a time */ + do + { + /* Writing the re-ordered output back to inplace input buffer */ + *pbuff++ = *pS1++; + *pbuff++ = *pS1++; + *pbuff++ = *pS1++; + *pbuff++ = *pS1++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + + /* --------------------------------------------------------- + * Step2: Calculate RFFT for N-point input + * ---------------------------------------------------------- */ + /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ + arm_rfft_q31 (S->pRfft, pInlineBuffer, pState); + + /*---------------------------------------------------------------------- + * Step3: Multiply the FFT output with the weights. + *----------------------------------------------------------------------*/ + arm_cmplx_mult_cmplx_q31 (pState, weights, pState, S->N); + + /* The output of complex multiplication is in 3.29 format. + * Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.31 format by shifting left by 2 bits. */ + arm_shift_q31 (pState, 2, pState, S->N * 2); + + /* ----------- Post-processing ---------- */ + /* DCT-IV can be obtained from DCT-II by the equation, + * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) + * Hence, Y4(0) = Y2(0)/2 */ + /* Getting only real part from the output and Converting to DCT-IV */ + + /* Initializing the loop counter to N >> 2 for loop unrolling by 4 */ + i = (S->N - 1U) >> 2U; + + /* pbuff initialized to input buffer. */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ + in = *pS1++ >> 1U; + /* input buffer acts as inplace, so output values are stored in the input itself. */ + *pbuff++ = in; + + /* pState pointer is incremented twice as the real values are located alternatively in the array */ + pS1++; + + /* First part of the processing with loop unrolling. Compute 4 outputs at a time. + ** a second loop below computes the remaining 1 to 3 samples. */ + do + { + /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ + /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ + in = *pS1++ - in; + *pbuff++ = in; + /* points to the next real value */ + pS1++; + + in = *pS1++ - in; + *pbuff++ = in; + pS1++; + + in = *pS1++ - in; + *pbuff++ = in; + pS1++; + + in = *pS1++ - in; + *pbuff++ = in; + pS1++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + /* If the blockSize is not a multiple of 4, compute any remaining output samples here. + ** No loop unrolling is used. */ + i = (S->N - 1U) % 0x4U; + + while (i > 0U) + { + /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ + /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ + in = *pS1++ - in; + *pbuff++ = in; + + /* points to the next real value */ + pS1++; + + /* Decrement loop counter */ + i--; + } + + + /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ + + /* Initializing the loop counter to N/4 instead of N for loop unrolling */ + i = S->N >> 2U; + + /* pbuff initialized to the pInlineBuffer(now contains the output values) */ + pbuff = pInlineBuffer; + + /* Processing with loop unrolling 4 times as N is always multiple of 4. Compute 4 outputs at a time */ + do + { + /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ + in = *pbuff; + *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); + + in = *pbuff; + *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); + + in = *pbuff; + *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); + + in = *pbuff; + *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); + + /* Decrement loop counter */ + i--; + } while (i > 0U); + + +#else + + /* Initializing the loop counter to N/2 */ + i = S->Nby2; + + do + { + /* Re-ordering of even and odd elements */ + /* pState[i] = pInlineBuffer[2*i] */ + *pS1++ = *pbuff++; + /* pState[N-i-1] = pInlineBuffer[2*i+1] */ + *pS2-- = *pbuff++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + /* pbuff initialized to input buffer */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Initializing the loop counter */ + i = S->N; + + do + { + /* Writing the re-ordered output back to inplace input buffer */ + *pbuff++ = *pS1++; + + /* Decrement the loop counter */ + i--; + } while (i > 0U); + + + /* --------------------------------------------------------- + * Step2: Calculate RFFT for N-point input + * ---------------------------------------------------------- */ + /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ + arm_rfft_q31 (S->pRfft, pInlineBuffer, pState); + + /*---------------------------------------------------------------------- + * Step3: Multiply the FFT output with the weights. + *----------------------------------------------------------------------*/ + arm_cmplx_mult_cmplx_q31 (pState, weights, pState, S->N); + + /* The output of complex multiplication is in 3.29 format. + * Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.31 format by shifting left by 2 bits. */ + arm_shift_q31(pState, 2, pState, S->N * 2); + + /* ----------- Post-processing ---------- */ + /* DCT-IV can be obtained from DCT-II by the equation, + * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) + * Hence, Y4(0) = Y2(0)/2 */ + /* Getting only real part from the output and Converting to DCT-IV */ + + /* pbuff initialized to input buffer. */ + pbuff = pInlineBuffer; + + /* pS1 initialized to pState */ + pS1 = pState; + + /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ + in = *pS1++ >> 1U; + /* input buffer acts as inplace, so output values are stored in the input itself. */ + *pbuff++ = in; + + /* pState pointer is incremented twice as the real values are located alternatively in the array */ + pS1++; + + /* Initializing the loop counter */ + i = (S->N - 1U); + + while (i > 0U) + { + /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ + /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ + in = *pS1++ - in; + *pbuff++ = in; + + /* points to the next real value */ + pS1++; + + /* Decrement loop counter */ + i--; + } + + /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ + + /* Initializing loop counter */ + i = S->N; + + /* pbuff initialized to the pInlineBuffer (now contains the output values) */ + pbuff = pInlineBuffer; + + do + { + /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ + in = *pbuff; + *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); + + /* Decrement loop counter */ + i--; + } while (i > 0U); + +#endif /* #if defined (ARM_MATH_LOOPUNROLL) */ + +} + +/** + @} end of DCT4_IDCT4 group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_f32.c new file mode 100644 index 0000000..b5d0a66 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_f32.c @@ -0,0 +1,309 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rfft_f32.c + * Description: RFFT & RIFFT Floating point process function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/* ---------------------------------------------------------------------- + * Internal functions prototypes + * -------------------------------------------------------------------- */ + +extern void arm_radix4_butterfly_f32( + float32_t * pSrc, + uint16_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier); + +extern void arm_radix4_butterfly_inverse_f32( + float32_t * pSrc, + uint16_t fftLen, + const float32_t * pCoef, + uint16_t twidCoefModifier, + float32_t onebyfftLen); + +extern void arm_bitreversal_f32( + float32_t * pSrc, + uint16_t fftSize, + uint16_t bitRevFactor, + const uint16_t * pBitRevTab); + +void arm_split_rfft_f32( + float32_t * pSrc, + uint32_t fftLen, + const float32_t * pATable, + const float32_t * pBTable, + float32_t * pDst, + uint32_t modifier); + +void arm_split_rifft_f32( + float32_t * pSrc, + uint32_t fftLen, + const float32_t * pATable, + const float32_t * pBTable, + float32_t * pDst, + uint32_t modifier); + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup RealFFT + @{ + */ + +/** + @brief Processing function for the floating-point RFFT/RIFFT. + @deprecated Do not use this function. It has been superceded by \ref arm_rfft_fast_f32 and will be removed in the future. + @param[in] S points to an instance of the floating-point RFFT/RIFFT structure + @param[in] pSrc points to the input buffer + @param[out] pDst points to the output buffer + @return none + */ + +void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst) +{ + const arm_cfft_radix4_instance_f32 *S_CFFT = S->pCfft; + + /* Calculation of Real IFFT of input */ + if (S->ifftFlagR == 1U) + { + /* Real IFFT core process */ + arm_split_rifft_f32 (pSrc, S->fftLenBy2, S->pTwiddleAReal, S->pTwiddleBReal, pDst, S->twidCoefRModifier); + + + /* Complex radix-4 IFFT process */ + arm_radix4_butterfly_inverse_f32 (pDst, S_CFFT->fftLen, S_CFFT->pTwiddle, S_CFFT->twidCoefModifier, S_CFFT->onebyfftLen); + + /* Bit reversal process */ + if (S->bitReverseFlagR == 1U) + { + arm_bitreversal_f32 (pDst, S_CFFT->fftLen, S_CFFT->bitRevFactor, S_CFFT->pBitRevTable); + } + } + else + { + /* Calculation of RFFT of input */ + + /* Complex radix-4 FFT process */ + arm_radix4_butterfly_f32 (pSrc, S_CFFT->fftLen, S_CFFT->pTwiddle, S_CFFT->twidCoefModifier); + + /* Bit reversal process */ + if (S->bitReverseFlagR == 1U) + { + arm_bitreversal_f32 (pSrc, S_CFFT->fftLen, S_CFFT->bitRevFactor, S_CFFT->pBitRevTable); + } + + /* Real FFT core process */ + arm_split_rfft_f32 (pSrc, S->fftLenBy2, S->pTwiddleAReal, S->pTwiddleBReal, pDst, S->twidCoefRModifier); + } + +} + +/** + @} end of RealFFT group + */ + +/** + @brief Core Real FFT process + @param[in] pSrc points to input buffer + @param[in] fftLen length of FFT + @param[in] pATable points to twiddle Coef A buffer + @param[in] pBTable points to twiddle Coef B buffer + @param[out] pDst points to output buffer + @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table + @return none + */ + +void arm_split_rfft_f32( + float32_t * pSrc, + uint32_t fftLen, + const float32_t * pATable, + const float32_t * pBTable, + float32_t * pDst, + uint32_t modifier) +{ + uint32_t i; /* Loop Counter */ + float32_t outR, outI; /* Temporary variables for output */ + const float32_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ + float32_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */ + float32_t *pDst1 = &pDst[2], *pDst2 = &pDst[(4U * fftLen) - 1U]; /* temp pointers for output buffer */ + float32_t *pSrc1 = &pSrc[2], *pSrc2 = &pSrc[(2U * fftLen) - 1U]; /* temp pointers for input buffer */ + + /* Init coefficient pointers */ + pCoefA = &pATable[modifier * 2]; + pCoefB = &pBTable[modifier * 2]; + + i = fftLen - 1U; + + while (i > 0U) + { + /* + outR = ( pSrc[2 * i] * pATable[2 * i] + - pSrc[2 * i + 1] * pATable[2 * i + 1] + + pSrc[2 * n - 2 * i] * pBTable[2 * i] + + pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); + + outI = ( pIn[2 * i + 1] * pATable[2 * i] + + pIn[2 * i] * pATable[2 * i + 1] + + pIn[2 * n - 2 * i] * pBTable[2 * i + 1] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); + */ + + /* read pATable[2 * i] */ + CoefA1 = *pCoefA++; + /* pATable[2 * i + 1] */ + CoefA2 = *pCoefA; + + /* pSrc[2 * i] * pATable[2 * i] */ + outR = *pSrc1 * CoefA1; + /* pSrc[2 * i] * CoefA2 */ + outI = *pSrc1++ * CoefA2; + + /* (pSrc[2 * i + 1] + pSrc[2 * fftLen - 2 * i + 1]) * CoefA2 */ + outR -= (*pSrc1 + *pSrc2) * CoefA2; + /* pSrc[2 * i + 1] * CoefA1 */ + outI += *pSrc1++ * CoefA1; + + CoefB1 = *pCoefB; + + /* pSrc[2 * fftLen - 2 * i + 1] * CoefB1 */ + outI -= *pSrc2-- * CoefB1; + /* pSrc[2 * fftLen - 2 * i] * CoefA2 */ + outI -= *pSrc2 * CoefA2; + + /* pSrc[2 * fftLen - 2 * i] * CoefB1 */ + outR += *pSrc2-- * CoefB1; + + /* write output */ + *pDst1++ = outR; + *pDst1++ = outI; + + /* write complex conjugate output */ + *pDst2-- = -outI; + *pDst2-- = outR; + + /* update coefficient pointer */ + pCoefB = pCoefB + (modifier * 2U); + pCoefA = pCoefA + ((modifier * 2U) - 1U); + + i--; + + } + + pDst[2U * fftLen] = pSrc[0] - pSrc[1]; + pDst[(2U * fftLen) + 1U] = 0.0f; + + pDst[0] = pSrc[0] + pSrc[1]; + pDst[1] = 0.0f; + +} + + +/** + @brief Core Real IFFT process + @param[in] pSrc points to input buffer + @param[in] fftLen length of FFT + @param[in] pATable points to twiddle Coef A buffer + @param[in] pBTable points to twiddle Coef B buffer + @param[out] pDst points to output buffer + @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table + @return none + */ + +void arm_split_rifft_f32( + float32_t * pSrc, + uint32_t fftLen, + const float32_t * pATable, + const float32_t * pBTable, + float32_t * pDst, + uint32_t modifier) +{ + float32_t outR, outI; /* Temporary variables for output */ + const float32_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ + float32_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */ + float32_t *pSrc1 = &pSrc[0], *pSrc2 = &pSrc[(2U * fftLen) + 1U]; + + pCoefA = &pATable[0]; + pCoefB = &pBTable[0]; + + while (fftLen > 0U) + { + /* + outR = ( pIn[2 * i] * pATable[2 * i] + + pIn[2 * i + 1] * pATable[2 * i + 1] + + pIn[2 * n - 2 * i] * pBTable[2 * i] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); + + outI = ( pIn[2 * i + 1] * pATable[2 * i] + - pIn[2 * i] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); + */ + + CoefA1 = *pCoefA++; + CoefA2 = *pCoefA; + + /* outR = (pSrc[2 * i] * CoefA1 */ + outR = *pSrc1 * CoefA1; + + /* - pSrc[2 * i] * CoefA2 */ + outI = -(*pSrc1++) * CoefA2; + + /* (pSrc[2 * i + 1] + pSrc[2 * fftLen - 2 * i + 1]) * CoefA2 */ + outR += (*pSrc1 + *pSrc2) * CoefA2; + + /* pSrc[2 * i + 1] * CoefA1 */ + outI += (*pSrc1++) * CoefA1; + + CoefB1 = *pCoefB; + + /* - pSrc[2 * fftLen - 2 * i + 1] * CoefB1 */ + outI -= *pSrc2-- * CoefB1; + + /* pSrc[2 * fftLen - 2 * i] * CoefB1 */ + outR += *pSrc2 * CoefB1; + + /* pSrc[2 * fftLen - 2 * i] * CoefA2 */ + outI += *pSrc2-- * CoefA2; + + /* write output */ + *pDst++ = outR; + *pDst++ = outI; + + /* update coefficient pointer */ + pCoefB = pCoefB + (modifier * 2); + pCoefA = pCoefA + (modifier * 2 - 1); + + /* Decrement loop count */ + fftLen--; + } + +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_f32.c new file mode 100644 index 0000000..7a1af14 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_f32.c @@ -0,0 +1,320 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rfft_f32.c + * Description: RFFT & RIFFT Floating point process function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +void stage_rfft_f32( + const arm_rfft_fast_instance_f32 * S, + float32_t * p, + float32_t * pOut) +{ + uint32_t k; /* Loop Counter */ + float32_t twR, twI; /* RFFT Twiddle coefficients */ + const float32_t * pCoeff = S->pTwiddleRFFT; /* Points to RFFT Twiddle factors */ + float32_t *pA = p; /* increasing pointer */ + float32_t *pB = p; /* decreasing pointer */ + float32_t xAR, xAI, xBR, xBI; /* temporary variables */ + float32_t t1a, t1b; /* temporary variables */ + float32_t p0, p1, p2, p3; /* temporary variables */ + + + k = (S->Sint).fftLen - 1; + + /* Pack first and last sample of the frequency domain together */ + + xBR = pB[0]; + xBI = pB[1]; + xAR = pA[0]; + xAI = pA[1]; + + twR = *pCoeff++ ; + twI = *pCoeff++ ; + + // U1 = XA(1) + XB(1); % It is real + t1a = xBR + xAR ; + + // U2 = XB(1) - XA(1); % It is imaginary + t1b = xBI + xAI ; + + // real(tw * (xB - xA)) = twR * (xBR - xAR) - twI * (xBI - xAI); + // imag(tw * (xB - xA)) = twI * (xBR - xAR) + twR * (xBI - xAI); + *pOut++ = 0.5f * ( t1a + t1b ); + *pOut++ = 0.5f * ( t1a - t1b ); + + // XA(1) = 1/2*( U1 - imag(U2) + i*( U1 +imag(U2) )); + pB = p + 2*k; + pA += 2; + + do + { + /* + function X = my_split_rfft(X, ifftFlag) + % X is a series of real numbers + L = length(X); + XC = X(1:2:end) +i*X(2:2:end); + XA = fft(XC); + XB = conj(XA([1 end:-1:2])); + TW = i*exp(-2*pi*i*[0:L/2-1]/L).'; + for l = 2:L/2 + XA(l) = 1/2 * (XA(l) + XB(l) + TW(l) * (XB(l) - XA(l))); + end + XA(1) = 1/2* (XA(1) + XB(1) + TW(1) * (XB(1) - XA(1))) + i*( 1/2*( XA(1) + XB(1) + i*( XA(1) - XB(1)))); + X = XA; + */ + + xBI = pB[1]; + xBR = pB[0]; + xAR = pA[0]; + xAI = pA[1]; + + twR = *pCoeff++; + twI = *pCoeff++; + + t1a = xBR - xAR ; + t1b = xBI + xAI ; + + // real(tw * (xB - xA)) = twR * (xBR - xAR) - twI * (xBI - xAI); + // imag(tw * (xB - xA)) = twI * (xBR - xAR) + twR * (xBI - xAI); + p0 = twR * t1a; + p1 = twI * t1a; + p2 = twR * t1b; + p3 = twI * t1b; + + *pOut++ = 0.5f * (xAR + xBR + p0 + p3 ); //xAR + *pOut++ = 0.5f * (xAI - xBI + p1 - p2 ); //xAI + + pA += 2; + pB -= 2; + k--; + } while (k > 0U); +} + +/* Prepares data for inverse cfft */ +void merge_rfft_f32( + const arm_rfft_fast_instance_f32 * S, + float32_t * p, + float32_t * pOut) +{ + uint32_t k; /* Loop Counter */ + float32_t twR, twI; /* RFFT Twiddle coefficients */ + const float32_t *pCoeff = S->pTwiddleRFFT; /* Points to RFFT Twiddle factors */ + float32_t *pA = p; /* increasing pointer */ + float32_t *pB = p; /* decreasing pointer */ + float32_t xAR, xAI, xBR, xBI; /* temporary variables */ + float32_t t1a, t1b, r, s, t, u; /* temporary variables */ + + k = (S->Sint).fftLen - 1; + + xAR = pA[0]; + xAI = pA[1]; + + pCoeff += 2 ; + + *pOut++ = 0.5f * ( xAR + xAI ); + *pOut++ = 0.5f * ( xAR - xAI ); + + pB = p + 2*k ; + pA += 2 ; + + while (k > 0U) + { + /* G is half of the frequency complex spectrum */ + //for k = 2:N + // Xk(k) = 1/2 * (G(k) + conj(G(N-k+2)) + Tw(k)*( G(k) - conj(G(N-k+2)))); + xBI = pB[1] ; + xBR = pB[0] ; + xAR = pA[0]; + xAI = pA[1]; + + twR = *pCoeff++; + twI = *pCoeff++; + + t1a = xAR - xBR ; + t1b = xAI + xBI ; + + r = twR * t1a; + s = twI * t1b; + t = twI * t1a; + u = twR * t1b; + + // real(tw * (xA - xB)) = twR * (xAR - xBR) - twI * (xAI - xBI); + // imag(tw * (xA - xB)) = twI * (xAR - xBR) + twR * (xAI - xBI); + *pOut++ = 0.5f * (xAR + xBR - r - s ); //xAR + *pOut++ = 0.5f * (xAI - xBI + t - u ); //xAI + + pA += 2; + pB -= 2; + k--; + } + +} + +/** + @ingroup groupTransforms +*/ + +/** + @defgroup RealFFT Real FFT Functions + + @par + The CMSIS DSP library includes specialized algorithms for computing the + FFT of real data sequences. The FFT is defined over complex data but + in many applications the input is real. Real FFT algorithms take advantage + of the symmetry properties of the FFT and have a speed advantage over complex + algorithms of the same length. + @par + The Fast RFFT algorith relays on the mixed radix CFFT that save processor usage. + @par + The real length N forward FFT of a sequence is computed using the steps shown below. + @par + \image html RFFT.gif "Real Fast Fourier Transform" + @par + The real sequence is initially treated as if it were complex to perform a CFFT. + Later, a processing stage reshapes the data to obtain half of the frequency spectrum + in complex format. Except the first complex number that contains the two real numbers + X[0] and X[N/2] all the data is complex. In other words, the first complex sample + contains two real values packed. + @par + The input for the inverse RFFT should keep the same format as the output of the + forward RFFT. A first processing stage pre-process the data to later perform an + inverse CFFT. + @par + \image html RIFFT.gif "Real Inverse Fast Fourier Transform" + @par + The algorithms for floating-point, Q15, and Q31 data are slightly different + and we describe each algorithm in turn. + @par Floating-point + The main functions are \ref arm_rfft_fast_f32() and \ref arm_rfft_fast_init_f32(). + The older functions \ref arm_rfft_f32() and \ref arm_rfft_init_f32() have been deprecated + but are still documented. + @par + The FFT of a real N-point sequence has even symmetry in the frequency domain. + The second half of the data equals the conjugate of the first half flipped in frequency. + Looking at the data, we see that we can uniquely represent the FFT using only N/2 complex numbers. + These are packed into the output array in alternating real and imaginary components: + @par + X = { real[0], imag[0], real[1], imag[1], real[2], imag[2] ... + real[(N/2)-1], imag[(N/2)-1 } + @par + It happens that the first complex number (real[0], imag[0]) is actually + all real. real[0] represents the DC offset, and imag[0] should be 0. + (real[1], imag[1]) is the fundamental frequency, (real[2], imag[2]) is + the first harmonic and so on. + @par + The real FFT functions pack the frequency domain data in this fashion. + The forward transform outputs the data in this form and the inverse + transform expects input data in this form. The function always performs + the needed bitreversal so that the input and output data is always in + normal order. The functions support lengths of [32, 64, 128, ..., 4096] + samples. + @par Q15 and Q31 + The real algorithms are defined in a similar manner and utilize N/2 complex + transforms behind the scenes. + @par + The complex transforms used internally include scaling to prevent fixed-point + overflows. The overall scaling equals 1/(fftLen/2). + @par + A separate instance structure must be defined for each transform used but + twiddle factor and bit reversal tables can be reused. + @par + There is also an associated initialization function for each data type. + The initialization function performs the following operations: + - Sets the values of the internal structure fields. + - Initializes twiddle factor table and bit reversal table pointers. + - Initializes the internal complex FFT data structure. + @par + Use of the initialization function is optional. + However, if the initialization function is used, then the instance structure + cannot be placed into a const data section. To place an instance structure + into a const data section, the instance structure should be manually + initialized as follows: +
+      arm_rfft_instance_q31 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};
+      arm_rfft_instance_q15 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};
+  
+ where fftLenReal is the length of the real transform; + fftLenBy2 length of the internal complex transform. + ifftFlagR Selects forward (=0) or inverse (=1) transform. + bitReverseFlagR Selects bit reversed output (=0) or normal order + output (=1). + twidCoefRModifier stride modifier for the twiddle factor table. + The value is based on the FFT length; + pTwiddleARealpoints to the A array of twiddle coefficients; + pTwiddleBRealpoints to the B array of twiddle coefficients; + pCfft points to the CFFT Instance structure. The CFFT structure + must also be initialized. Refer to arm_cfft_radix4_f32() for details regarding + static initialization of the complex FFT instance structure. + */ + +/** + @addtogroup RealFFT + @{ +*/ + +/** + @brief Processing function for the floating-point real FFT. + @param[in] S points to an arm_rfft_fast_instance_f32 structure + @param[in] p points to input buffer + @param[in] pOut points to output buffer + @param[in] ifftFlag + - value = 0: RFFT + - value = 1: RIFFT + @return none +*/ + +void arm_rfft_fast_f32( + arm_rfft_fast_instance_f32 * S, + float32_t * p, + float32_t * pOut, + uint8_t ifftFlag) +{ + arm_cfft_instance_f32 * Sint = &(S->Sint); + Sint->fftLen = S->fftLenRFFT / 2; + + /* Calculation of Real FFT */ + if (ifftFlag) + { + /* Real FFT compression */ + merge_rfft_f32(S, p, pOut); + + /* Complex radix-4 IFFT process */ + arm_cfft_f32( Sint, pOut, ifftFlag, 1); + } + else + { + /* Calculation of RFFT of input */ + arm_cfft_f32( Sint, p, ifftFlag, 1); + + /* Real FFT extraction */ + stage_rfft_f32(S, p, pOut); + } +} + +/** +* @} end of RealFFT group +*/ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_init_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_init_f32.c new file mode 100644 index 0000000..58fbfdb --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_init_f32.c @@ -0,0 +1,344 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_cfft_init_f32.c + * Description: Split Radix Decimation in Frequency CFFT Floating point processing function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + +/** + @ingroup groupTransforms + */ + +/** + @addtogroup RealFFT + @{ + */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16) && defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32)) + +/** + @brief Initialization function for the 32pt floating-point real FFT. + @param[in,out] S points to an arm_rfft_fast_instance_f32 structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected + */ + +arm_status arm_rfft_32_fast_init_f32( arm_rfft_fast_instance_f32 * S ) { + + arm_cfft_instance_f32 * Sint; + + if( !S ) return ARM_MATH_ARGUMENT_ERROR; + + Sint = &(S->Sint); + Sint->fftLen = 16U; + S->fftLenRFFT = 32U; + + Sint->bitRevLength = ARMBITREVINDEXTABLE_16_TABLE_LENGTH; + Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable16; + Sint->pTwiddle = (float32_t *) twiddleCoef_16; + S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_32; + + return ARM_MATH_SUCCESS; +} +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32) && defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64)) + +/** + @brief Initialization function for the 64pt floating-point real FFT. + @param[in,out] S points to an arm_rfft_fast_instance_f32 structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected + */ + +arm_status arm_rfft_64_fast_init_f32( arm_rfft_fast_instance_f32 * S ) { + + arm_cfft_instance_f32 * Sint; + + if( !S ) return ARM_MATH_ARGUMENT_ERROR; + + Sint = &(S->Sint); + Sint->fftLen = 32U; + S->fftLenRFFT = 64U; + + Sint->bitRevLength = ARMBITREVINDEXTABLE_32_TABLE_LENGTH; + Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable32; + Sint->pTwiddle = (float32_t *) twiddleCoef_32; + S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_64; + + return ARM_MATH_SUCCESS; +} +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64) && defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128)) + +/** + @brief Initialization function for the 128pt floating-point real FFT. + @param[in,out] S points to an arm_rfft_fast_instance_f32 structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected + */ + +arm_status arm_rfft_128_fast_init_f32( arm_rfft_fast_instance_f32 * S ) { + + arm_cfft_instance_f32 * Sint; + + if( !S ) return ARM_MATH_ARGUMENT_ERROR; + + Sint = &(S->Sint); + Sint->fftLen = 64U; + S->fftLenRFFT = 128U; + + Sint->bitRevLength = ARMBITREVINDEXTABLE_64_TABLE_LENGTH; + Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable64; + Sint->pTwiddle = (float32_t *) twiddleCoef_64; + S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_128; + + return ARM_MATH_SUCCESS; +} +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128) && defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256)) + +/** + @brief Initialization function for the 256pt floating-point real FFT. + @param[in,out] S points to an arm_rfft_fast_instance_f32 structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected +*/ + +arm_status arm_rfft_256_fast_init_f32( arm_rfft_fast_instance_f32 * S ) { + + arm_cfft_instance_f32 * Sint; + + if( !S ) return ARM_MATH_ARGUMENT_ERROR; + + Sint = &(S->Sint); + Sint->fftLen = 128U; + S->fftLenRFFT = 256U; + + Sint->bitRevLength = ARMBITREVINDEXTABLE_128_TABLE_LENGTH; + Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable128; + Sint->pTwiddle = (float32_t *) twiddleCoef_128; + S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_256; + + return ARM_MATH_SUCCESS; +} +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256) && defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512)) + +/** + @brief Initialization function for the 512pt floating-point real FFT. + @param[in,out] S points to an arm_rfft_fast_instance_f32 structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected + */ + +arm_status arm_rfft_512_fast_init_f32( arm_rfft_fast_instance_f32 * S ) { + + arm_cfft_instance_f32 * Sint; + + if( !S ) return ARM_MATH_ARGUMENT_ERROR; + + Sint = &(S->Sint); + Sint->fftLen = 256U; + S->fftLenRFFT = 512U; + + Sint->bitRevLength = ARMBITREVINDEXTABLE_256_TABLE_LENGTH; + Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable256; + Sint->pTwiddle = (float32_t *) twiddleCoef_256; + S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_512; + + return ARM_MATH_SUCCESS; +} +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512) && defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024)) +/** + @brief Initialization function for the 1024pt floating-point real FFT. + @param[in,out] S points to an arm_rfft_fast_instance_f32 structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected + */ + +arm_status arm_rfft_1024_fast_init_f32( arm_rfft_fast_instance_f32 * S ) { + + arm_cfft_instance_f32 * Sint; + + if( !S ) return ARM_MATH_ARGUMENT_ERROR; + + Sint = &(S->Sint); + Sint->fftLen = 512U; + S->fftLenRFFT = 1024U; + + Sint->bitRevLength = ARMBITREVINDEXTABLE_512_TABLE_LENGTH; + Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable512; + Sint->pTwiddle = (float32_t *) twiddleCoef_512; + S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_1024; + + return ARM_MATH_SUCCESS; +} +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024) && defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048)) +/** + @brief Initialization function for the 2048pt floating-point real FFT. + @param[in,out] S points to an arm_rfft_fast_instance_f32 structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected + */ +arm_status arm_rfft_2048_fast_init_f32( arm_rfft_fast_instance_f32 * S ) { + + arm_cfft_instance_f32 * Sint; + + if( !S ) return ARM_MATH_ARGUMENT_ERROR; + + Sint = &(S->Sint); + Sint->fftLen = 1024U; + S->fftLenRFFT = 2048U; + + Sint->bitRevLength = ARMBITREVINDEXTABLE_1024_TABLE_LENGTH; + Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable1024; + Sint->pTwiddle = (float32_t *) twiddleCoef_1024; + S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_2048; + + return ARM_MATH_SUCCESS; +} +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048) && defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096)) +/** +* @brief Initialization function for the 4096pt floating-point real FFT. +* @param[in,out] S points to an arm_rfft_fast_instance_f32 structure + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected + */ + +arm_status arm_rfft_4096_fast_init_f32( arm_rfft_fast_instance_f32 * S ) { + + arm_cfft_instance_f32 * Sint; + + if( !S ) return ARM_MATH_ARGUMENT_ERROR; + + Sint = &(S->Sint); + Sint->fftLen = 2048U; + S->fftLenRFFT = 4096U; + + Sint->bitRevLength = ARMBITREVINDEXTABLE_2048_TABLE_LENGTH; + Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable2048; + Sint->pTwiddle = (float32_t *) twiddleCoef_2048; + S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_4096; + + return ARM_MATH_SUCCESS; +} +#endif + +/** + @brief Initialization function for the floating-point real FFT. + @param[in,out] S points to an arm_rfft_fast_instance_f32 structure + @param[in] fftLen length of the Real Sequence + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLen is not a supported length + + @par Description + The parameter fftLen specifies the length of RFFT/CIFFT process. + Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096. + @par + This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. + */ + +arm_status arm_rfft_fast_init_f32( + arm_rfft_fast_instance_f32 * S, + uint16_t fftLen) +{ + typedef arm_status(*fft_init_ptr)( arm_rfft_fast_instance_f32 *); + fft_init_ptr fptr = 0x0; + + switch (fftLen) + { +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048) && defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096)) + case 4096U: + fptr = arm_rfft_4096_fast_init_f32; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024) && defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048)) + case 2048U: + fptr = arm_rfft_2048_fast_init_f32; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512) && defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024)) + case 1024U: + fptr = arm_rfft_1024_fast_init_f32; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256) && defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512)) + case 512U: + fptr = arm_rfft_512_fast_init_f32; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128) && defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256)) + case 256U: + fptr = arm_rfft_256_fast_init_f32; + break; +#endif +#if (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64) && defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128)) + case 128U: + fptr = arm_rfft_128_fast_init_f32; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32) && defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64)) + case 64U: + fptr = arm_rfft_64_fast_init_f32; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16) && defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32)) + case 32U: + fptr = arm_rfft_32_fast_init_f32; + break; +#endif + default: + return ARM_MATH_ARGUMENT_ERROR; + } + + if( ! fptr ) return ARM_MATH_ARGUMENT_ERROR; + return fptr( S ); + +} + +/** + @} end of RealFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_f32.c b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_f32.c new file mode 100644 index 0000000..141f8b6 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_f32.c @@ -0,0 +1,139 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rfft_init_f32.c + * Description: RFFT & RIFFT Floating point initialisation function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" + + +/** + @addtogroup RealFFT + @{ + */ + +/** + @brief Initialization function for the floating-point RFFT/RIFFT. + @deprecated Do not use this function. It has been superceded by \ref arm_rfft_fast_init_f32 and will be removed in the future. + @param[in,out] S points to an instance of the floating-point RFFT/RIFFT structure + @param[in,out] S_CFFT points to an instance of the floating-point CFFT/CIFFT structure + @param[in] fftLenReal length of the FFT. + @param[in] ifftFlagR flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLenReal is not a supported length + + @par Description + The parameter fftLenRealspecifies length of RFFT/RIFFT Process. + Supported FFT Lengths are 128, 512, 2048. + @par + The parameter ifftFlagR controls whether a forward or inverse transform is computed. + Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated. + @par + The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. + Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. + @par + This function also initializes Twiddle factor table. + */ + +arm_status arm_rfft_init_f32( + arm_rfft_instance_f32 * S, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag) +{ + + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + /* Initialize the Real FFT length */ + S->fftLenReal = (uint16_t) fftLenReal; + + /* Initialize the Complex FFT length */ + S->fftLenBy2 = (uint16_t) fftLenReal / 2U; + + /* Initialize the Twiddle coefficientA pointer */ + S->pTwiddleAReal = (float32_t *) realCoefA; + + /* Initialize the Twiddle coefficientB pointer */ + S->pTwiddleBReal = (float32_t *) realCoefB; + + /* Initialize the Flag for selection of RFFT or RIFFT */ + S->ifftFlagR = (uint8_t) ifftFlagR; + + /* Initialize the Flag for calculation Bit reversal or not */ + S->bitReverseFlagR = (uint8_t) bitReverseFlag; + + /* Initializations of structure parameters depending on the FFT length */ + switch (S->fftLenReal) + { + /* Init table modifier value */ + case 8192U: + S->twidCoefRModifier = 1U; + break; + case 2048U: + S->twidCoefRModifier = 4U; + break; + case 512U: + S->twidCoefRModifier = 16U; + break; + case 128U: + S->twidCoefRModifier = 64U; + break; + default: + /* Reporting argument error if rfftSize is not valid value */ + status = ARM_MATH_ARGUMENT_ERROR; + break; + } + + /* Init Complex FFT Instance */ + S->pCfft = S_CFFT; + + if (S->ifftFlagR) + { + /* Initializes the CIFFT Module for fftLenreal/2 length */ + arm_cfft_radix4_init_f32(S->pCfft, S->fftLenBy2, 1U, 0U); + } + else + { + /* Initializes the CFFT Module for fftLenreal/2 length */ + arm_cfft_radix4_init_f32(S->pCfft, S->fftLenBy2, 0U, 0U); + } + + /* return the status of RFFT Init function */ + return (status); + +} + +/** + @} end of RealFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q15.c b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q15.c new file mode 100644 index 0000000..6f90771 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q15.c @@ -0,0 +1,158 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rfft_init_q15.c + * Description: RFFT & RIFFT Q15 initialisation function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" +#include "arm_const_structs.h" + +/** + @addtogroup RealFFT + @{ + */ + +/** + @brief Initialization function for the Q15 RFFT/RIFFT. + @param[in,out] S points to an instance of the Q15 RFFT/RIFFT structure + @param[in] fftLenReal length of the FFT + @param[in] ifftFlagR flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLenReal is not a supported length + + @par Details + The parameter fftLenReal specifies length of RFFT/RIFFT Process. + Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192. + @par + The parameter ifftFlagR controls whether a forward or inverse transform is computed. + Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated. + @par + The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. + Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. + @par + This function also initializes Twiddle factor table. + */ + +arm_status arm_rfft_init_q15( + arm_rfft_instance_q15 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag) +{ + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + /* Initialize the Real FFT length */ + S->fftLenReal = (uint16_t) fftLenReal; + + /* Initialize the Twiddle coefficientA pointer */ + S->pTwiddleAReal = (q15_t *) realCoefAQ15; + + /* Initialize the Twiddle coefficientB pointer */ + S->pTwiddleBReal = (q15_t *) realCoefBQ15; + + /* Initialize the Flag for selection of RFFT or RIFFT */ + S->ifftFlagR = (uint8_t) ifftFlagR; + + /* Initialize the Flag for calculation Bit reversal or not */ + S->bitReverseFlagR = (uint8_t) bitReverseFlag; + + /* Initialization of coef modifier depending on the FFT length */ + switch (S->fftLenReal) + { +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096)) + case 8192U: + S->twidCoefRModifier = 1U; + S->pCfft = &arm_cfft_sR_q15_len4096; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048)) + case 4096U: + S->twidCoefRModifier = 2U; + S->pCfft = &arm_cfft_sR_q15_len2048; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024)) + case 2048U: + S->twidCoefRModifier = 4U; + S->pCfft = &arm_cfft_sR_q15_len1024; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_512) && defined(ARM_TABLE_BITREVIDX_FXT_512)) + case 1024U: + S->twidCoefRModifier = 8U; + S->pCfft = &arm_cfft_sR_q15_len512; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_256) && defined(ARM_TABLE_BITREVIDX_FXT_256)) + case 512U: + S->twidCoefRModifier = 16U; + S->pCfft = &arm_cfft_sR_q15_len256; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_128) && defined(ARM_TABLE_BITREVIDX_FXT_128)) + case 256U: + S->twidCoefRModifier = 32U; + S->pCfft = &arm_cfft_sR_q15_len128; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_64) && defined(ARM_TABLE_BITREVIDX_FXT_64)) + case 128U: + S->twidCoefRModifier = 64U; + S->pCfft = &arm_cfft_sR_q15_len64; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_32) && defined(ARM_TABLE_BITREVIDX_FXT_32)) + case 64U: + S->twidCoefRModifier = 128U; + S->pCfft = &arm_cfft_sR_q15_len32; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_16) && defined(ARM_TABLE_BITREVIDX_FXT_16)) + case 32U: + S->twidCoefRModifier = 256U; + S->pCfft = &arm_cfft_sR_q15_len16; + break; +#endif + default: + /* Reporting argument error if rfftSize is not valid value */ + status = ARM_MATH_ARGUMENT_ERROR; + break; + } + + /* return the status of RFFT Init function */ + return (status); +} + +/** + @} end of RealFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q31.c b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q31.c new file mode 100644 index 0000000..a791c92 --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_init_q31.c @@ -0,0 +1,160 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rfft_init_q31.c + * Description: RFFT & RIFFT Q31 initialisation function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" +#include "arm_common_tables.h" +#include "arm_const_structs.h" + + + +/** + @addtogroup RealFFT + @{ + */ + +/** + @brief Initialization function for the Q31 RFFT/RIFFT. + @param[in,out] S points to an instance of the Q31 RFFT/RIFFT structure + @param[in] fftLenReal length of the FFT + @param[in] ifftFlagR flag that selects transform direction + - value = 0: forward transform + - value = 1: inverse transform + @param[in] bitReverseFlag flag that enables / disables bit reversal of output + - value = 0: disables bit reversal of output + - value = 1: enables bit reversal of output + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_ARGUMENT_ERROR : fftLenReal is not a supported length + + @par Details + The parameter fftLenReal specifies length of RFFT/RIFFT Process. + Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192. + @par + The parameter ifftFlagR controls whether a forward or inverse transform is computed. + Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated. + @par + The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. + Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. + @par + This function also initializes Twiddle factor table. +*/ + +arm_status arm_rfft_init_q31( + arm_rfft_instance_q31 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag) +{ + /* Initialise the default arm status */ + arm_status status = ARM_MATH_SUCCESS; + + /* Initialize the Real FFT length */ + S->fftLenReal = (uint16_t) fftLenReal; + + /* Initialize the Twiddle coefficientA pointer */ + S->pTwiddleAReal = (q31_t *) realCoefAQ31; + + /* Initialize the Twiddle coefficientB pointer */ + S->pTwiddleBReal = (q31_t *) realCoefBQ31; + + /* Initialize the Flag for selection of RFFT or RIFFT */ + S->ifftFlagR = (uint8_t) ifftFlagR; + + /* Initialize the Flag for calculation Bit reversal or not */ + S->bitReverseFlagR = (uint8_t) bitReverseFlag; + + /* Initialization of coef modifier depending on the FFT length */ + switch (S->fftLenReal) + { +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096)) + case 8192U: + S->twidCoefRModifier = 1U; + S->pCfft = &arm_cfft_sR_q31_len4096; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048)) + case 4096U: + S->twidCoefRModifier = 2U; + S->pCfft = &arm_cfft_sR_q31_len2048; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024)) + case 2048U: + S->twidCoefRModifier = 4U; + S->pCfft = &arm_cfft_sR_q31_len1024; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_512) && defined(ARM_TABLE_BITREVIDX_FXT_512)) + case 1024U: + S->twidCoefRModifier = 8U; + S->pCfft = &arm_cfft_sR_q31_len512; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_256) && defined(ARM_TABLE_BITREVIDX_FXT_256)) + case 512U: + S->twidCoefRModifier = 16U; + S->pCfft = &arm_cfft_sR_q31_len256; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_128) && defined(ARM_TABLE_BITREVIDX_FXT_128)) + case 256U: + S->twidCoefRModifier = 32U; + S->pCfft = &arm_cfft_sR_q31_len128; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_64) && defined(ARM_TABLE_BITREVIDX_FXT_64)) + case 128U: + S->twidCoefRModifier = 64U; + S->pCfft = &arm_cfft_sR_q31_len64; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_32) && defined(ARM_TABLE_BITREVIDX_FXT_32)) + case 64U: + S->twidCoefRModifier = 128U; + S->pCfft = &arm_cfft_sR_q31_len32; + break; +#endif +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_16) && defined(ARM_TABLE_BITREVIDX_FXT_16)) + case 32U: + S->twidCoefRModifier = 256U; + S->pCfft = &arm_cfft_sR_q31_len16; + break; +#endif + default: + /* Reporting argument error if rfftSize is not valid value */ + status = ARM_MATH_ARGUMENT_ERROR; + break; + } + + /* return the status of RFFT Init function */ + return (status); +} + +/** + @} end of RealFFT group + */ diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q15.c b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q15.c new file mode 100644 index 0000000..fdc9bab --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q15.c @@ -0,0 +1,380 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rfft_q15.c + * Description: RFFT & RIFFT Q15 process function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/* ---------------------------------------------------------------------- + * Internal functions prototypes + * -------------------------------------------------------------------- */ + +void arm_split_rfft_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pATable, + const q15_t * pBTable, + q15_t * pDst, + uint32_t modifier); + +void arm_split_rifft_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pATable, + const q15_t * pBTable, + q15_t * pDst, + uint32_t modifier); + +/** + @addtogroup RealFFT + @{ + */ + +/** + @brief Processing function for the Q15 RFFT/RIFFT. + @param[in] S points to an instance of the Q15 RFFT/RIFFT structure + @param[in] pSrc points to input buffer + @param[out] pDst points to output buffer + @return none + + @par Input an output formats + Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process. + Hence the output format is different for different RFFT sizes. + The input and output formats for different RFFT sizes and number of bits to upscale are mentioned in the tables below for RFFT and RIFFT: + @par + \image html RFFTQ15.gif "Input and Output Formats for Q15 RFFT" + @par + \image html RIFFTQ15.gif "Input and Output Formats for Q15 RIFFT" + */ + +void arm_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst) +{ + const arm_cfft_instance_q15 *S_CFFT = S->pCfft; + uint32_t L2 = S->fftLenReal >> 1U; + uint32_t i; + + /* Calculation of RIFFT of input */ + if (S->ifftFlagR == 1U) + { + /* Real IFFT core process */ + arm_split_rifft_q15 (pSrc, L2, S->pTwiddleAReal, S->pTwiddleBReal, pDst, S->twidCoefRModifier); + + /* Complex IFFT process */ + arm_cfft_q15 (S_CFFT, pDst, S->ifftFlagR, S->bitReverseFlagR); + + for(i = 0; i < S->fftLenReal; i++) + { + pDst[i] = pDst[i] << 1U; + } + } + else + { + /* Calculation of RFFT of input */ + + /* Complex FFT process */ + arm_cfft_q15 (S_CFFT, pSrc, S->ifftFlagR, S->bitReverseFlagR); + + /* Real FFT core process */ + arm_split_rfft_q15 (pSrc, L2, S->pTwiddleAReal, S->pTwiddleBReal, pDst, S->twidCoefRModifier); + } + +} + +/** + @} end of RealFFT group + */ + +/** + @brief Core Real FFT process + @param[in] pSrc points to input buffer + @param[in] fftLen length of FFT + @param[in] pATable points to twiddle Coef A buffer + @param[in] pBTable points to twiddle Coef B buffer + @param[out] pDst points to output buffer + @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table + @return none + + @par + The function implements a Real FFT + */ + +void arm_split_rfft_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pATable, + const q15_t * pBTable, + q15_t * pDst, + uint32_t modifier) +{ + uint32_t i; /* Loop Counter */ + q31_t outR, outI; /* Temporary variables for output */ + const q15_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ + q15_t *pSrc1, *pSrc2; +#if defined (ARM_MATH_DSP) + q15_t *pD1, *pD2; +#endif + + /* Init coefficient pointers */ + pCoefA = &pATable[modifier * 2]; + pCoefB = &pBTable[modifier * 2]; + + pSrc1 = &pSrc[2]; + pSrc2 = &pSrc[(2U * fftLen) - 2U]; + +#if defined (ARM_MATH_DSP) + + i = 1U; + pD1 = pDst + 2; + pD2 = pDst + (4U * fftLen) - 2; + + for (i = fftLen - 1; i > 0; i--) + { + /* + outR = ( pSrc[2 * i] * pATable[2 * i] + - pSrc[2 * i + 1] * pATable[2 * i + 1] + + pSrc[2 * n - 2 * i] * pBTable[2 * i] + + pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); + + outI = ( pIn[2 * i + 1] * pATable[2 * i] + + pIn[2 * i] * pATable[2 * i + 1] + + pIn[2 * n - 2 * i] * pBTable[2 * i + 1] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]) + */ + + +#ifndef ARM_MATH_BIG_ENDIAN + /* pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1] */ + outR = __SMUSD(read_q15x2 (pSrc1), read_q15x2((q15_t *) pCoefA)); +#else + /* -(pSrc[2 * i + 1] * pATable[2 * i + 1] - pSrc[2 * i] * pATable[2 * i]) */ + outR = -(__SMUSD(read_q15x2 (pSrc1), read_q15x2((q15_t *) pCoefA))); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* pSrc[2 * n - 2 * i] * pBTable[2 * i] + pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]) */ + outR = __SMLAD(read_q15x2 (pSrc2), read_q15x2((q15_t *) pCoefB), outR) >> 16U; + + /* pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */ +#ifndef ARM_MATH_BIG_ENDIAN + outI = __SMUSDX(read_q15x2_da (&pSrc2), read_q15x2((q15_t *) pCoefB)); +#else + outI = __SMUSDX(read_q15x2 ((q15_t *) pCoefB), read_q15x2_da (&pSrc2)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] */ + outI = __SMLADX(read_q15x2_ia (&pSrc1), read_q15x2 ((q15_t *) pCoefA), outI); + + /* write output */ + *pD1++ = (q15_t) outR; + *pD1++ = outI >> 16U; + + /* write complex conjugate output */ + pD2[0] = (q15_t) outR; + pD2[1] = -(outI >> 16U); + pD2 -= 2; + + /* update coefficient pointer */ + pCoefB = pCoefB + (2U * modifier); + pCoefA = pCoefA + (2U * modifier); + } + + pDst[2U * fftLen] = (pSrc[0] - pSrc[1]) >> 1U; + pDst[2U * fftLen + 1U] = 0; + + pDst[0] = (pSrc[0] + pSrc[1]) >> 1U; + pDst[1] = 0; + +#else + + i = 1U; + + while (i < fftLen) + { + /* + outR = ( pSrc[2 * i] * pATable[2 * i] + - pSrc[2 * i + 1] * pATable[2 * i + 1] + + pSrc[2 * n - 2 * i] * pBTable[2 * i] + + pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); + */ + + outR = *pSrc1 * *pCoefA; + outR = outR - (*(pSrc1 + 1) * *(pCoefA + 1)); + outR = outR + (*pSrc2 * *pCoefB); + outR = (outR + (*(pSrc2 + 1) * *(pCoefB + 1))) >> 16; + + /* + outI = ( pIn[2 * i + 1] * pATable[2 * i] + + pIn[2 * i] * pATable[2 * i + 1] + + pIn[2 * n - 2 * i] * pBTable[2 * i + 1] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); + */ + + outI = *pSrc2 * *(pCoefB + 1); + outI = outI - (*(pSrc2 + 1) * *pCoefB); + outI = outI + (*(pSrc1 + 1) * *pCoefA); + outI = outI + (*pSrc1 * *(pCoefA + 1)); + + /* update input pointers */ + pSrc1 += 2U; + pSrc2 -= 2U; + + /* write output */ + pDst[2U * i] = (q15_t) outR; + pDst[2U * i + 1U] = outI >> 16U; + + /* write complex conjugate output */ + pDst[(4U * fftLen) - (2U * i)] = (q15_t) outR; + pDst[((4U * fftLen) - (2U * i)) + 1U] = -(outI >> 16U); + + /* update coefficient pointer */ + pCoefB = pCoefB + (2U * modifier); + pCoefA = pCoefA + (2U * modifier); + + i++; + } + + pDst[2U * fftLen] = (pSrc[0] - pSrc[1]) >> 1; + pDst[2U * fftLen + 1U] = 0; + + pDst[0] = (pSrc[0] + pSrc[1]) >> 1; + pDst[1] = 0; + +#endif /* #if defined (ARM_MATH_DSP) */ +} + + +/** + @brief Core Real IFFT process + @param[in] pSrc points to input buffer + @param[in] fftLen length of FFT + @param[in] pATable points to twiddle Coef A buffer + @param[in] pBTable points to twiddle Coef B buffer + @param[out] pDst points to output buffer + @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table + @return none + + @par + The function implements a Real IFFT + */ + +void arm_split_rifft_q15( + q15_t * pSrc, + uint32_t fftLen, + const q15_t * pATable, + const q15_t * pBTable, + q15_t * pDst, + uint32_t modifier) +{ + uint32_t i; /* Loop Counter */ + q31_t outR, outI; /* Temporary variables for output */ + const q15_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ + q15_t *pSrc1, *pSrc2; + q15_t *pDst1 = &pDst[0]; + + pCoefA = &pATable[0]; + pCoefB = &pBTable[0]; + + pSrc1 = &pSrc[0]; + pSrc2 = &pSrc[2 * fftLen]; + + i = fftLen; + while (i > 0U) + { + /* + outR = ( pIn[2 * i] * pATable[2 * i] + + pIn[2 * i + 1] * pATable[2 * i + 1] + + pIn[2 * n - 2 * i] * pBTable[2 * i] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); + + outI = ( pIn[2 * i + 1] * pATable[2 * i] + - pIn[2 * i] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); + */ + +#if defined (ARM_MATH_DSP) + +#ifndef ARM_MATH_BIG_ENDIAN + /* pIn[2 * n - 2 * i] * pBTable[2 * i] - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]) */ + outR = __SMUSD(read_q15x2(pSrc2), read_q15x2((q15_t *) pCoefB)); +#else + /* -(-pIn[2 * n - 2 * i] * pBTable[2 * i] + pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1])) */ + outR = -(__SMUSD(read_q15x2(pSrc2), read_q15x2((q15_t *) pCoefB))); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] + pIn[2 * n - 2 * i] * pBTable[2 * i] */ + outR = __SMLAD(read_q15x2(pSrc1), read_q15x2 ((q15_t *) pCoefA), outR) >> 16U; + + /* -pIn[2 * n - 2 * i] * pBTable[2 * i + 1] + pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */ + outI = __SMUADX(read_q15x2_da (&pSrc2), read_q15x2((q15_t *) pCoefB)); + + /* pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] */ +#ifndef ARM_MATH_BIG_ENDIAN + outI = __SMLSDX(read_q15x2 ((q15_t *) pCoefA), read_q15x2_ia (&pSrc1), -outI); +#else + outI = __SMLSDX(read_q15x2_ia (&pSrc1), read_q15x2 ((q15_t *) pCoefA), -outI); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + /* write output */ +#ifndef ARM_MATH_BIG_ENDIAN + write_q15x2_ia (&pDst1, __PKHBT(outR, (outI >> 16U), 16)); +#else + write_q15x2_ia (&pDst1, __PKHBT((outI >> 16U), outR, 16)); +#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ + + +#else /* #if defined (ARM_MATH_DSP) */ + + outR = *pSrc2 * *pCoefB; + outR = outR - (*(pSrc2 + 1) * *(pCoefB + 1)); + outR = outR + (*pSrc1 * *pCoefA); + outR = (outR + (*(pSrc1 + 1) * *(pCoefA + 1))) >> 16; + + outI = *(pSrc1 + 1) * *pCoefA; + outI = outI - (*pSrc1 * *(pCoefA + 1)); + outI = outI - (*pSrc2 * *(pCoefB + 1)); + outI = outI - (*(pSrc2 + 1) * *(pCoefB)); + + /* update input pointers */ + pSrc1 += 2U; + pSrc2 -= 2U; + + /* write output */ + *pDst1++ = (q15_t) outR; + *pDst1++ = (q15_t) (outI >> 16); + +#endif /* #if defined (ARM_MATH_DSP) */ + + /* update coefficient pointer */ + pCoefB = pCoefB + (2 * modifier); + pCoefA = pCoefA + (2 * modifier); + + i--; + } + +} diff --git a/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q31.c b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q31.c new file mode 100644 index 0000000..d16600d --- /dev/null +++ b/CMSIS/DSP/Source/TransformFunctions/arm_rfft_q31.c @@ -0,0 +1,292 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_rfft_q31.c + * Description: FFT & RIFFT Q31 process function + * + * $Date: 18. March 2019 + * $Revision: V1.6.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2019 ARM Limited or its affiliates. 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. + */ + +#include "arm_math.h" + +/* ---------------------------------------------------------------------- + * Internal functions prototypes + * -------------------------------------------------------------------- */ + +void arm_split_rfft_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pATable, + const q31_t * pBTable, + q31_t * pDst, + uint32_t modifier); + +void arm_split_rifft_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pATable, + const q31_t * pBTable, + q31_t * pDst, + uint32_t modifier); + +/** + @addtogroup RealFFT + @{ + */ + +/** + @brief Processing function for the Q31 RFFT/RIFFT. + @param[in] S points to an instance of the Q31 RFFT/RIFFT structure + @param[in] pSrc points to input buffer + @param[out] pDst points to output buffer + @return none + + @par Input an output formats + Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process. + Hence the output format is different for different RFFT sizes. + The input and output formats for different RFFT sizes and number of bits to upscale are mentioned in the tables below for RFFT and RIFFT: + @par + \image html RFFTQ31.gif "Input and Output Formats for Q31 RFFT" + @par + \image html RIFFTQ31.gif "Input and Output Formats for Q31 RIFFT" + */ + +void arm_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst) +{ + const arm_cfft_instance_q31 *S_CFFT = S->pCfft; + uint32_t L2 = S->fftLenReal >> 1U; + uint32_t i; + + /* Calculation of RIFFT of input */ + if (S->ifftFlagR == 1U) + { + /* Real IFFT core process */ + arm_split_rifft_q31 (pSrc, L2, S->pTwiddleAReal, S->pTwiddleBReal, pDst, S->twidCoefRModifier); + + /* Complex IFFT process */ + arm_cfft_q31 (S_CFFT, pDst, S->ifftFlagR, S->bitReverseFlagR); + + for(i = 0; i < S->fftLenReal; i++) + { + pDst[i] = pDst[i] << 1U; + } + } + else + { + /* Calculation of RFFT of input */ + + /* Complex FFT process */ + arm_cfft_q31 (S_CFFT, pSrc, S->ifftFlagR, S->bitReverseFlagR); + + /* Real FFT core process */ + arm_split_rfft_q31 (pSrc, L2, S->pTwiddleAReal, S->pTwiddleBReal, pDst, S->twidCoefRModifier); + } + +} + +/** + @} end of RealFFT group + */ + +/** + @brief Core Real FFT process + @param[in] pSrc points to input buffer + @param[in] fftLen length of FFT + @param[in] pATable points to twiddle Coef A buffer + @param[in] pBTable points to twiddle Coef B buffer + @param[out] pDst points to output buffer + @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table + @return none + */ + +void arm_split_rfft_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pATable, + const q31_t * pBTable, + q31_t * pDst, + uint32_t modifier) +{ + uint32_t i; /* Loop Counter */ + q31_t outR, outI; /* Temporary variables for output */ + const q31_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ + q31_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */ + q31_t *pOut1 = &pDst[2], *pOut2 = &pDst[4 * fftLen - 1]; + q31_t *pIn1 = &pSrc[2], *pIn2 = &pSrc[2 * fftLen - 1]; + + /* Init coefficient pointers */ + pCoefA = &pATable[modifier * 2]; + pCoefB = &pBTable[modifier * 2]; + + i = fftLen - 1U; + + while (i > 0U) + { + /* + outR = ( pSrc[2 * i] * pATable[2 * i] + - pSrc[2 * i + 1] * pATable[2 * i + 1] + + pSrc[2 * n - 2 * i] * pBTable[2 * i] + + pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); + + outI = ( pIn[2 * i + 1] * pATable[2 * i] + + pIn[2 * i] * pATable[2 * i + 1] + + pIn[2 * n - 2 * i] * pBTable[2 * i + 1] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); + */ + + CoefA1 = *pCoefA++; + CoefA2 = *pCoefA; + + /* outR = (pSrc[2 * i] * pATable[2 * i] */ + mult_32x32_keep32_R (outR, *pIn1, CoefA1); + + /* outI = pIn[2 * i] * pATable[2 * i + 1] */ + mult_32x32_keep32_R (outI, *pIn1++, CoefA2); + + /* - pSrc[2 * i + 1] * pATable[2 * i + 1] */ + multSub_32x32_keep32_R (outR, *pIn1, CoefA2); + + /* (pIn[2 * i + 1] * pATable[2 * i] */ + multAcc_32x32_keep32_R (outI, *pIn1++, CoefA1); + + /* pSrc[2 * n - 2 * i] * pBTable[2 * i] */ + multSub_32x32_keep32_R (outR, *pIn2, CoefA2); + CoefB1 = *pCoefB; + + /* pIn[2 * n - 2 * i] * pBTable[2 * i + 1] */ + multSub_32x32_keep32_R (outI, *pIn2--, CoefB1); + + /* pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1] */ + multAcc_32x32_keep32_R (outR, *pIn2, CoefB1); + + /* pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */ + multSub_32x32_keep32_R (outI, *pIn2--, CoefA2); + + /* write output */ + *pOut1++ = outR; + *pOut1++ = outI; + + /* write complex conjugate output */ + *pOut2-- = -outI; + *pOut2-- = outR; + + /* update coefficient pointer */ + pCoefB = pCoefB + (2 * modifier); + pCoefA = pCoefA + (2 * modifier - 1); + + /* Decrement loop count */ + i--; + } + + pDst[2 * fftLen] = (pSrc[0] - pSrc[1]) >> 1U; + pDst[2 * fftLen + 1] = 0; + + pDst[0] = (pSrc[0] + pSrc[1]) >> 1U; + pDst[1] = 0; +} + + +/** + @brief Core Real IFFT process + @param[in] pSrc points to input buffer + @param[in] fftLen length of FFT + @param[in] pATable points to twiddle Coef A buffer + @param[in] pBTable points to twiddle Coef B buffer + @param[out] pDst points to output buffer + @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table + @return none + */ + +void arm_split_rifft_q31( + q31_t * pSrc, + uint32_t fftLen, + const q31_t * pATable, + const q31_t * pBTable, + q31_t * pDst, + uint32_t modifier) +{ + q31_t outR, outI; /* Temporary variables for output */ + const q31_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ + q31_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */ + q31_t *pIn1 = &pSrc[0], *pIn2 = &pSrc[2 * fftLen + 1]; + + pCoefA = &pATable[0]; + pCoefB = &pBTable[0]; + + while (fftLen > 0U) + { + /* + outR = ( pIn[2 * i] * pATable[2 * i] + + pIn[2 * i + 1] * pATable[2 * i + 1] + + pIn[2 * n - 2 * i] * pBTable[2 * i] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); + + outI = ( pIn[2 * i + 1] * pATable[2 * i] + - pIn[2 * i] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); + */ + + CoefA1 = *pCoefA++; + CoefA2 = *pCoefA; + + /* outR = (pIn[2 * i] * pATable[2 * i] */ + mult_32x32_keep32_R (outR, *pIn1, CoefA1); + + /* - pIn[2 * i] * pATable[2 * i + 1] */ + mult_32x32_keep32_R (outI, *pIn1++, -CoefA2); + + /* pIn[2 * i + 1] * pATable[2 * i + 1] */ + multAcc_32x32_keep32_R (outR, *pIn1, CoefA2); + + /* pIn[2 * i + 1] * pATable[2 * i] */ + multAcc_32x32_keep32_R (outI, *pIn1++, CoefA1); + + /* pIn[2 * n - 2 * i] * pBTable[2 * i] */ + multAcc_32x32_keep32_R (outR, *pIn2, CoefA2); + CoefB1 = *pCoefB; + + /* pIn[2 * n - 2 * i] * pBTable[2 * i + 1] */ + multSub_32x32_keep32_R (outI, *pIn2--, CoefB1); + + /* pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1] */ + multAcc_32x32_keep32_R (outR, *pIn2, CoefB1); + + /* pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */ + multAcc_32x32_keep32_R (outI, *pIn2--, CoefA2); + + /* write output */ + *pDst++ = outR; + *pDst++ = outI; + + /* update coefficient pointer */ + pCoefB = pCoefB + (modifier * 2); + pCoefA = pCoefA + (modifier * 2 - 1); + + /* Decrement loop count */ + fftLen--; + } + +} diff --git a/CMSIS/Driver/DriverTemplates/Driver_CAN.c b/CMSIS/Driver/DriverTemplates/Driver_CAN.c new file mode 100644 index 0000000..b4fdede --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_CAN.c @@ -0,0 +1,321 @@ +/* + * Copyright (c) 2015-2018 Arm 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. + */ + +#include "Driver_CAN.h" + +#define ARM_CAN_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,0) // CAN driver version + +// Driver Version +static const ARM_DRIVER_VERSION can_driver_version = { ARM_CAN_API_VERSION, ARM_CAN_DRV_VERSION }; + +// Driver Capabilities +static const ARM_CAN_CAPABILITIES can_driver_capabilities = { + 32U, // Number of CAN Objects available + 1U, // Supports reentrant calls to ARM_CAN_MessageSend, ARM_CAN_MessageRead, ARM_CAN_ObjectConfigure and abort message sending used by ARM_CAN_Control. + 0U, // Does not support CAN with Flexible Data-rate mode (CAN_FD) + 0U, // Does not support restricted operation mode + 1U, // Supports bus monitoring mode + 1U, // Supports internal loopback mode + 1U, // Supports external loopback mode +}; + +// Object Capabilities +static const ARM_CAN_OBJ_CAPABILITIES can_object_capabilities = { + 1U, // Object supports transmission + 1U, // Object supports reception + 0U, // Object does not support RTR reception and automatic Data transmission + 0U, // Object does not support RTR transmission and automatic Data reception + 1U, // Object allows assignment of multiple filters to it + 1U, // Object supports exact identifier filtering + 0U, // Object does not support range identifier filtering + 1U, // Object supports mask identifier filtering + 3U // Object can buffer 3 messages +}; + +static uint8_t can_driver_powered = 0U; +static uint8_t can_driver_initialized = 0U; +static ARM_CAN_SignalUnitEvent_t CAN_SignalUnitEvent = NULL; +static ARM_CAN_SignalObjectEvent_t CAN_SignalObjectEvent = NULL; + +// +// Functions +// + +static ARM_DRIVER_VERSION CAN_GetVersion (void) { + // Return driver version + return can_driver_version; +} + +static ARM_CAN_CAPABILITIES CAN_GetCapabilities (void) { + // Return driver capabilities + return can_driver_capabilities; +} + +static int32_t CAN_Initialize (ARM_CAN_SignalUnitEvent_t cb_unit_event, + ARM_CAN_SignalObjectEvent_t cb_object_event) { + + if (can_driver_initialized != 0U) { return ARM_DRIVER_OK; } + + CAN_SignalUnitEvent = cb_unit_event; + CAN_SignalObjectEvent = cb_object_event; + + // Add code for pin, memory, RTX objects initialization + // .. + + can_driver_initialized = 1U; + + return ARM_DRIVER_OK; +} + +static int32_t CAN_Uninitialize (void) { + + // Add code for pin, memory, RTX objects de-initialization + // .. + + can_driver_initialized = 0U; + + return ARM_DRIVER_OK; +} + +static int32_t CAN_PowerControl (ARM_POWER_STATE state) { + switch (state) { + case ARM_POWER_OFF: + can_driver_powered = 0U; + // Add code to disable interrupts and put peripheral into reset mode, + // and if possible disable clock + // .. + + case ARM_POWER_FULL: + if (can_driver_initialized == 0U) { return ARM_DRIVER_ERROR; } + if (can_driver_powered != 0U) { return ARM_DRIVER_OK; } + + // Add code to enable clocks, reset variables enable interrupts + // and put peripheral into operational + // .. + + can_driver_powered = 1U; + break; + + default: + // Other states are not supported + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +uint32_t CAN_GetClock (void) { + + // Add code to return peripheral clock frequency + // .. +} + +static int32_t CAN_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + // Add code to setup peripheral parameters to generate specified bitrate + // with specified bit segments + // .. + + return ARM_DRIVER_OK; +} + +static int32_t CAN_SetMode (ARM_CAN_MODE mode) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + switch (mode) { + case ARM_CAN_MODE_INITIALIZATION: + // Add code to put peripheral into initialization mode + // .. + break; + case ARM_CAN_MODE_NORMAL: + // Add code to put peripheral into normal operation mode + // .. + break; + case ARM_CAN_MODE_RESTRICTED: + // Add code to put peripheral into restricted operation mode + // .. + break; + case ARM_CAN_MODE_MONITOR: + // Add code to put peripheral into bus monitoring mode + // .. + break; + case ARM_CAN_MODE_LOOPBACK_INTERNAL: + // Add code to put peripheral into internal loopback mode + // .. + break; + case ARM_CAN_MODE_LOOPBACK_EXTERNAL: + // Add code to put peripheral into external loopback mode + // .. + break; + default: + // Handle unknown mode code + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +ARM_CAN_OBJ_CAPABILITIES CAN_ObjectGetCapabilities (uint32_t obj_idx) { + // Return object capabilities + return can_object_capabilities; +} + +static int32_t CAN_ObjectSetFilter (uint32_t obj_idx, ARM_CAN_FILTER_OPERATION operation, uint32_t id, uint32_t arg) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + switch (operation) { + case ARM_CAN_FILTER_ID_EXACT_ADD: + // Add code to setup peripheral to receive messages with specified exact ID + break; + case ARM_CAN_FILTER_ID_MASKABLE_ADD: + // Add code to setup peripheral to receive messages with specified maskable ID + break; + case ARM_CAN_FILTER_ID_RANGE_ADD: + // Add code to setup peripheral to receive messages within specified range of IDs + break; + case ARM_CAN_FILTER_ID_EXACT_REMOVE: + // Add code to remove specified exact ID from being received by peripheral + break; + case ARM_CAN_FILTER_ID_MASKABLE_REMOVE: + // Add code to remove specified maskable ID from being received by peripheral + break; + case ARM_CAN_FILTER_ID_RANGE_REMOVE: + // Add code to remove specified range of IDs from being received by peripheral + break; + default: + // Handle unknown operation code + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +static int32_t CAN_ObjectConfigure (uint32_t obj_idx, ARM_CAN_OBJ_CONFIG obj_cfg) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + switch (obj_cfg) { + case ARM_CAN_OBJ_INACTIVE: + // Deactivate object + // .. + break; + case ARM_CAN_OBJ_RX_RTR_TX_DATA: + // Setup object to automatically return data when RTR with it's ID is received + // .. + break; + case ARM_CAN_OBJ_TX_RTR_RX_DATA: + // Setup object to send RTR and receive data response + // .. + break; + case ARM_CAN_OBJ_TX: + // Setup object to be used for sending messages + // .. + break; + case ARM_CAN_OBJ_RX: + // Setup object to be used for receiving messages + // .. + break; + default: + // Handle unknown object configuration code + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +static int32_t CAN_MessageSend (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, const uint8_t *data, uint8_t size) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + // Add code to send requested message + // .. + + return ((int32_t)size); +} + +static int32_t CAN_MessageRead (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, uint8_t *data, uint8_t size) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + // Add code to read previously received message + // (reception was started when object was configured for reception) + // .. + + return ((int32_t)size); +} + +static int32_t CAN_Control (uint32_t control, uint32_t arg) { + + if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; } + + switch (control & ARM_CAN_CONTROL_Msk) { + case ARM_CAN_ABORT_MESSAGE_SEND: + // Add code to abort message pending to be sent + // .. + break; + case ARM_CAN_SET_FD_MODE: + // Add code to enable Flexible Data-rate mode + // .. + break; + case ARM_CAN_SET_TRANSCEIVER_DELAY: + // Add code to set transceiver delay + // .. + break; + default: + // Handle unknown control code + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + return ARM_DRIVER_OK; +} + +static ARM_CAN_STATUS CAN_GetStatus (void) { + + // Add code to return device bus and error status + // .. +} + + +// IRQ handlers +// Add interrupt routines to handle transmission, reception, error and status interrupts +// .. + +// CAN driver functions structure + +ARM_DRIVER_CAN Driver_CAN = { + CAN_GetVersion, + CAN_GetCapabilities, + CAN_Initialize, + CAN_Uninitialize, + CAN_PowerControl, + CAN_GetClock, + CAN_SetBitrate, + CAN_SetMode, + CAN_ObjectGetCapabilities, + CAN_ObjectSetFilter, + CAN_ObjectConfigure, + CAN_MessageSend, + CAN_MessageRead, + CAN_Control, + CAN_GetStatus +}; + diff --git a/CMSIS/Driver/DriverTemplates/Driver_ETH_MAC.c b/CMSIS/Driver/DriverTemplates/Driver_ETH_MAC.c new file mode 100644 index 0000000..9e54e26 --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_ETH_MAC.c @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_ETH_MAC.h" + +#define ARM_ETH_MAC_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_ETH_MAC_API_VERSION, + ARM_ETH_MAC_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_ETH_MAC_CAPABILITIES DriverCapabilities = { + 0, /* 1 = IPv4 header checksum verified on receive */ + 0, /* 1 = IPv6 checksum verification supported on receive */ + 0, /* 1 = UDP payload checksum verified on receive */ + 0, /* 1 = TCP payload checksum verified on receive */ + 0, /* 1 = ICMP payload checksum verified on receive */ + 0, /* 1 = IPv4 header checksum generated on transmit */ + 0, /* 1 = IPv6 checksum generation supported on transmit */ + 0, /* 1 = UDP payload checksum generated on transmit */ + 0, /* 1 = TCP payload checksum generated on transmit */ + 0, /* 1 = ICMP payload checksum generated on transmit */ + 0, /* Ethernet Media Interface type */ + 0, /* 1 = driver provides initial valid MAC address */ + 0, /* 1 = callback event \ref ARM_ETH_MAC_EVENT_RX_FRAME generated */ + 0, /* 1 = callback event \ref ARM_ETH_MAC_EVENT_TX_FRAME generated */ + 0, /* 1 = wakeup event \ref ARM_ETH_MAC_EVENT_WAKEUP generated */ + 0 /* 1 = Precision Timer supported */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_ETH_MAC_GetVersion(void) +{ +} + +ARM_ETH_MAC_CAPABILITIES ARM_ETH_MAC_GetCapabilities(void) +{ +} + +int32_t ARM_ETH_MAC_Initialize(ARM_ETH_MAC_SignalEvent_t cb_event) +{ +} + +int32_t ARM_ETH_MAC_Uninitialize(void) +{ +} + +int32_t ARM_ETH_MAC_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_ETH_MAC_GetMacAddress(ARM_ETH_MAC_ADDR *ptr_addr) +{ +} + +int32_t ARM_ETH_MAC_SetMacAddress(const ARM_ETH_MAC_ADDR *ptr_addr) +{ +} + +int32_t ARM_ETH_MAC_SetAddressFilter(const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr) +{ +} + +int32_t ARM_ETH_MAC_SendFrame(const uint8_t *frame, uint32_t len, uint32_t flags) +{ +} + +int32_t ARM_ETH_MAC_ReadFrame(uint8_t *frame, uint32_t len) +{ +} + +uint32_t ARM_ETH_MAC_GetRxFrameSize(void) +{ +} + +int32_t ARM_ETH_MAC_GetRxFrameTime(ARM_ETH_MAC_TIME *time) +{ +} + +int32_t ARM_ETH_MAC_GetTxFrameTime(ARM_ETH_MAC_TIME *time) +{ +} + +int32_t ARM_ETH_MAC_Control(uint32_t control, uint32_t arg) +{ + switch (control) + { + case ARM_ETH_MAC_CONFIGURE: + + switch (arg & ARM_ETH_MAC_SPEED_Msk) + { + case ARM_ETH_MAC_SPEED_10M: + break; + case ARM_ETH_SPEED_100M: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + switch (arg & ARM_ETH_MAC_DUPLEX_Msk) + { + case ARM_ETH_MAC_DUPLEX_FULL: + break; + } + + if (arg & ARM_ETH_MAC_LOOPBACK) + { + } + + if ((arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX) || + (arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX)) + { + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + if (!(arg & ARM_ETH_MAC_ADDRESS_BROADCAST)) + { + } + + if (arg & ARM_ETH_MAC_ADDRESS_MULTICAST) + { + } + + if (arg & ARM_ETH_MAC_ADDRESS_ALL) + { + } + + break; + + case ARM_ETH_MAC_CONTROL_TX: + break; + + case ARM_ETH_MAC_CONTROL_RX: + break; + + case ARM_ETH_MAC_FLUSH: + if (arg & ARM_ETH_MAC_FLUSH_RX) + { + } + if (arg & ARM_ETH_MAC_FLUSH_TX) + { + } + break; + + case ARM_ETH_MAC_SLEEP: + break; + + case ARM_ETH_MAC_VLAN_FILTER: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_ETH_MAC_ControlTimer(uint32_t control, ARM_ETH_MAC_TIME *time) +{ +} + +int32_t ARM_ETH_MAC_PHY_Read(uint8_t phy_addr, uint8_t reg_addr, uint16_t *data) +{ +} + +int32_t ARM_ETH_MAC_PHY_Write(uint8_t phy_addr, uint8_t reg_addr, uint16_t data) +{ +} + +void ARM_ETH_MAC_SignalEvent(uint32_t event) +{ +} + +// End ETH MAC Interface + +ARM_DRIVER_ETH_MAC Driver_ETH_MAC = +{ + ARM_ETH_MAC_GetVersion, + ARM_ETH_MAC_GetCapabilities, + ARM_ETH_MAC_Initialize, + ARM_ETH_MAC_Uninitialize, + ARM_ETH_MAC_PowerControl, + ARM_ETH_MAC_GetMacAddress, + ARM_ETH_MAC_SetMacAddress, + ARM_ETH_MAC_SetAddressFilter, + ARM_ETH_MAC_SendFrame, + ARM_ETH_MAC_ReadFrame, + ARM_ETH_MAC_GetRxFrameSize, + ARM_ETH_MAC_GetRxFrameTime, + ARM_ETH_MAC_GetTxFrameTime, + ARM_ETH_MAC_ControlTimer, + ARM_ETH_MAC_Control, + ARM_ETH_MAC_PHY_Read, + ARM_ETH_MAC_PHY_Write +}; diff --git a/CMSIS/Driver/DriverTemplates/Driver_ETH_PHY.c b/CMSIS/Driver/DriverTemplates/Driver_ETH_PHY.c new file mode 100644 index 0000000..971fade --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_ETH_PHY.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_ETH_PHY.h" + +#define ARM_ETH_PHY_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_ETH_PHY_API_VERSION, + ARM_ETH_PHY_DRV_VERSION +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_ETH_PHY_GetVersion(void) +{ +} + +int32_t ARM_ETH_PHY_Initialize(ARM_ETH_PHY_Read_t fn_read, ARM_ETH_PHY_Write_t fn_write) +{ +} + +int32_t ARM_ETH_PHY_Uninitialize(void) +{ +} + +int32_t ARM_ETH_PHY_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_ETH_PHY_SetInterface(uint32_t interface) +{ + switch (interface) + { + case ARM_ETH_INTERFACE_MII: + break; + case ARM_ETH_INTERFACE_RMII: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_ETH_PHY_SetMode(uint32_t mode) +{ + switch (mode & ARM_ETH_PHY_SPEED_Msk) + { + case ARM_ETH_PHY_SPEED_10M: + break; + case ARM_ETH_PHY_SPEED_100M: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + + switch (mode & ARM_ETH_PHY_DUPLEX_Msk) + { + case ARM_ETH_PHY_DUPLEX_HALF: + break; + case ARM_ETH_PHY_DUPLEX_FULL: + break; + } + + if (mode & ARM_ETH_PHY_AUTO_NEGOTIATE) + { + } + + if (mode & ARM_ETH_PHY_LOOPBACK) + { + } + + if (mode & ARM_ETH_PHY_ISOLATE) + { + } +} + +ARM_ETH_LINK_STATE ARM_ETH_PHY_GetLinkState(void) +{ +} + +ARM_ETH_LINK_INFO ARM_ETH_PHY_GetLinkInfo(void) +{ +} + +ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY_(ETH_PHY_NUM) = +{ + ARM_ETH_PHY_GetVersion, + ARM_ETH_PHY_Initialize, + ARM_ETH_PHY_Uninitialize, + ARM_ETH_PHY_PowerControl, + ARM_ETH_PHY_SetInterface, + ARM_ETH_PHY_SetMode, + ARM_ETH_PHY_GetLinkState, + ARM_ETH_PHY_GetLinkInfo, +}; diff --git a/CMSIS/Driver/DriverTemplates/Driver_Flash.c b/CMSIS/Driver/DriverTemplates/Driver_Flash.c new file mode 100644 index 0000000..0f221da --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_Flash.c @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_Flash.h" + +#define ARM_FLASH_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1, 0) /* driver version */ + +/* Sector Information */ +#ifdef FLASH_SECTORS +static ARM_FLASH_SECTOR FLASH_SECTOR_INFO[FLASH_SECTOR_COUNT] = { + FLASH_SECTORS +}; +#else +#define FLASH_SECTOR_INFO NULL +#endif + +/* Flash Information */ +static ARM_FLASH_INFO FlashInfo = { + 0, /* FLASH_SECTOR_INFO */ + 0, /* FLASH_SECTOR_COUNT */ + 0, /* FLASH_SECTOR_SIZE */ + 0, /* FLASH_PAGE_SIZE */ + 0, /* FLASH_PROGRAM_UNIT */ + 0 /* FLASH_ERASED_VALUE */ +}; + +/* Flash Status */ +static ARM_FLASH_STATUS FlashStatus; + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_FLASH_API_VERSION, + ARM_FLASH_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_FLASH_CAPABILITIES DriverCapabilities = { + 0, /* event_ready */ + 0, /* data_width = 0:8-bit, 1:16-bit, 2:32-bit */ + 0 /* erase_chip */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_Flash_GetVersion(void) +{ +} + +ARM_FLASH_CAPABILITIES ARM_Flash_GetCapabilities(void) +{ +} + +int32_t ARM_Flash_Initialize(ARM_Flash_SignalEvent_t cb_event) +{ +} + +int32_t ARM_Flash_Uninitialize(void) +{ +} + +int32_t ARM_Flash_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_Flash_ReadData(uint32_t addr, void *data, uint32_t cnt) +{ +} + +int32_t ARM_Flash_ProgramData(uint32_t addr, const void *data, uint32_t cnt) +{ +} + +int32_t ARM_Flash_EraseSector(uint32_t addr) +{ +} + +int32_t ARM_Flash_EraseChip(void) +{ +} + +ARM_FLASH_STATUS ARM_Flash_GetStatus(void) +{ +} + +ARM_FLASH_INFO * ARM_Flash_GetInfo(void) +{ +} + +void ARM_Flash_SignalEvent(uint32_t event) +{ +} +// End Flash Interface + +ARM_DRIVER_FLASH Driver_FLASH = { + ARM_Flash_GetVersion, + ARM_Flash_GetCapabilities, + ARM_Flash_Initialize, + ARM_Flash_Uninitialize, + ARM_Flash_PowerControl, + ARM_Flash_ReadData, + ARM_Flash_ProgramData, + ARM_Flash_EraseSector, + ARM_Flash_EraseChip, + ARM_Flash_GetStatus, + ARM_Flash_GetInfo +}; \ No newline at end of file diff --git a/CMSIS/Driver/DriverTemplates/Driver_I2C.c b/CMSIS/Driver/DriverTemplates/Driver_I2C.c new file mode 100644 index 0000000..99d82dd --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_I2C.c @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_I2C.h" + +#define ARM_I2C_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_I2C_API_VERSION, + ARM_I2C_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_I2C_CAPABILITIES DriverCapabilities = { + 0 /* supports 10-bit addressing */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_I2C_GetVersion(void) +{ +} + +ARM_I2C_CAPABILITIES ARM_I2C_GetCapabilities(void) +{ +} + +int32_t ARM_I2C_Initialize(ARM_I2C_SignalEvent_t cb_event) +{ +} + +int32_t ARM_I2C_Uninitialize(void) +{ +} + +int32_t ARM_I2C_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_I2C_MasterTransmit(uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending) +{ +} + +int32_t ARM_I2C_MasterReceive(uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending) +{ +} + +int32_t ARM_I2C_SlaveTransmit(const uint8_t *data, uint32_t num) +{ +} + +int32_t ARM_I2C_SlaveReceive(uint8_t *data, uint32_t num) +{ +} + +int32_t ARM_I2C_GetDataCount(void) +{ +} + +int32_t ARM_I2C_Control(uint32_t control, uint32_t arg) +{ + switch (control) + { + case ARM_I2C_OWN_ADDRESS: + break; + + case ARM_I2C_BUS_SPEED: + switch (arg) + { + case ARM_I2C_BUS_SPEED_STANDARD: + break; + case ARM_I2C_BUS_SPEED_FAST: + break; + case ARM_I2C_BUS_SPEED_FAST_PLUS: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + break; + + case ARM_I2C_BUS_CLEAR: + break; + + case ARM_I2C_ABORT_TRANSFER: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +ARM_I2C_STATUS ARM_I2C_GetStatus(void) +{ +} + +void ARM_I2C_SignalEvent(uint32_t event) +{ + // function body +} + +// End I2C Interface + +ARM_DRIVER_I2C Driver_I2C = { + ARM_I2C_GetVersion, + ARM_I2C_GetCapabilities, + ARM_I2C_Initialize, + ARM_I2C_Uninitialize, + ARM_I2C_PowerControl, + ARM_I2C_MasterTransmit, + ARM_I2C_MasterReceive, + ARM_I2C_SlaveTransmit, + ARM_I2C_SlaveReceive, + ARM_I2C_GetDataCount, + ARM_I2C_Control, + ARM_I2C_GetStatus +}; diff --git a/CMSIS/Driver/DriverTemplates/Driver_MCI.c b/CMSIS/Driver/DriverTemplates/Driver_MCI.c new file mode 100644 index 0000000..a515074 --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_MCI.c @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_MCI.h" + +#define ARM_MCI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_MCI_API_VERSION, + ARM_MCI_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_MCI_CAPABILITIES DriverCapabilities = { + 0, /* cd_state */ + 0, /* cd_event */ + 0, /* vdd */ + 0, /* vdd_1v8 */ + 0, /* vccq */ + 0, /* vccq_1v8 */ + 0, /* vccq_1v2 */ + 1, /* data_width_4 */ + 1, /* data_width_8 */ + 0, /* data_width_4_ddr */ + 0, /* data_width_8_ddr */ + 0, /* high_speed */ + 0, /* uhs_signaling */ + 0, /* uhs_tuning */ + 0, /* uhs_sdr50 */ + 0, /* uhs_sdr104 */ + 0, /* uhs_ddr50 */ + 0, /* uhs_driver_type_a */ + 0, /* uhs_driver_type_c */ + 0, /* uhs_driver_type_d */ + 1, /* sdio_interrupt */ + 1, /* read_wait */ + 0, /* suspend_resume */ + 0, /* mmc_interrupt */ + 0, /* mmc_boot */ + 0, /* ccs */ + 0 /* ccs_timeout */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_MCI_GetVersion(void) +{ +} + +ARM_MCI_CAPABILITIES ARM_MCI_GetCapabilities(void) +{ +} + +int32_t ARM_MCI_Initialize(ARM_MCI_SignalEvent_t cb_event) +{ +} + +int32_t ARM_MCI_Uninitialize(void) +{ +} + +int32_t ARM_MCI_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_MCI_CardPower(uint32_t voltage) +{ + switch (voltage & ARM_MCI_POWER_VDD_Msk) + { + case ARM_MCI_POWER_VDD_OFF: + return ARM_DRIVER_OK; + + case ARM_MCI_POWER_VDD_3V3: + return ARM_DRIVER_OK; + + default: + break; + } +} + +int32_t ARM_MCI_ReadCD(void) +{ +} + +int32_t ARM_MCI_ReadWP(void) +{ +} + +int32_t ARM_MCI_SendCommand(uint32_t cmd, uint32_t arg, uint32_t flags, uint32_t *response) +{ +} + +int32_t ARM_MCI_SetupTransfer(uint8_t *data, uint32_t block_count, uint32_t block_size, uint32_t mode) +{ +} + +int32_t ARM_MCI_AbortTransfer(void) +{ +} + +int32_t ARM_MCI_Control(uint32_t control, uint32_t arg) +{ + switch (control) + { + case ARM_MCI_BUS_SPEED: + break; + + case ARM_MCI_BUS_SPEED_MODE: + break; + + case ARM_MCI_BUS_CMD_MODE: + /* Implement external pull-up control to support MMC cards in open-drain mode */ + /* Default mode is push-pull and is configured in Driver_MCI0.Initialize() */ + if (arg == ARM_MCI_BUS_CMD_PUSH_PULL) + { + /* Configure external circuit to work in push-pull mode */ + } + else if (arg == ARM_MCI_BUS_CMD_OPEN_DRAIN) + { + /* Configure external circuit to work in open-drain mode */ + } + else + { + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + break; + + case ARM_MCI_BUS_DATA_WIDTH: + switch (arg) + { + case ARM_MCI_BUS_DATA_WIDTH_1: + break; + case ARM_MCI_BUS_DATA_WIDTH_4: + break; + case ARM_MCI_BUS_DATA_WIDTH_8: + break; + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } + break; + + case ARM_MCI_CONTROL_RESET: + break; + + case ARM_MCI_CONTROL_CLOCK_IDLE: + break; + + case ARM_MCI_DATA_TIMEOUT: + break; + + case ARM_MCI_MONITOR_SDIO_INTERRUPT: + break; + + case ARM_MCI_CONTROL_READ_WAIT: + break; + + case ARM_MCI_DRIVER_STRENGTH: + default: return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +ARM_MCI_STATUS ARM_MCI_GetStatus(void) +{ +} + +void ARM_MCI_SignalEvent(uint32_t event) +{ + // function body +} + +// End MCI Interface + +ARM_DRIVER_MCI Driver_MCI = { + ARM_MCI_GetVersion, + ARM_MCI_GetCapabilities, + ARM_MCI_Initialize, + ARM_MCI_Uninitialize, + ARM_MCI_PowerControl, + ARM_MCI_CardPower, + ARM_MCI_ReadCD, + ARM_MCI_ReadWP, + ARM_MCI_SendCommand, + ARM_MCI_SetupTransfer, + ARM_MCI_AbortTransfer, + ARM_MCI_Control, + ARM_MCI_GetStatus +}; diff --git a/CMSIS/Driver/DriverTemplates/Driver_SAI.c b/CMSIS/Driver/DriverTemplates/Driver_SAI.c new file mode 100644 index 0000000..bc0746c --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_SAI.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_SAI.h" + +#define ARM_SAI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_SAI_API_VERSION, + ARM_SAI_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_SAI_CAPABILITIES DriverCapabilities = { + 1, /* supports asynchronous Transmit/Receive */ + 0, /* supports synchronous Transmit/Receive */ + 0, /* supports user defined Protocol */ + 1, /* supports I2S Protocol */ + 0, /* supports MSB/LSB justified Protocol */ + 0, /* supports PCM short/long frame Protocol */ + 0, /* supports AC'97 Protocol */ + 0, /* supports Mono mode */ + 0, /* supports Companding */ + 0, /* supports MCLK (Master Clock) pin */ + 0 /* supports Frame error event: \ref ARM_SAI_EVENT_FRAME_ERROR */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_SAI_GetVersion (void) +{ +} + +ARM_SAI_CAPABILITIES ARM_SAI_GetCapabilities (void) +{ +} + +int32_t ARM_SAI_Initialize (ARM_SAI_SignalEvent_t cb_event) +{ +} + +int32_t ARM_SAI_Uninitialize (void) +{ +} + +int32_t ARM_SAI_PowerControl (ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_SAI_Send (const void *data, uint32_t num) +{ +} + +int32_t ARM_SAI_Receive (void *data, uint32_t num) +{ +} + +uint32_t ARM_SAI_GetTxCount (void) +{ +} + +uint32_t ARM_SAI_GetRxCount (void) +{ +} + +int32_t ARM_SAI_Control (uint32_t control, uint32_t arg1, uint32_t arg2) +{ +} + +ARM_SAI_STATUS ARM_SAI_GetStatus (void) +{ +} + +void ARM_SAI_SignalEvent(uint32_t event) +{ + // function body +} + +// End SAI Interface + +ARM_DRIVER_SAI Driver_SAI = { + ARM_SAI_GetVersion, + ARM_SAI_GetCapabilities, + ARM_SAI_Initialize, + ARM_SAI_Uninitialize, + ARM_SAI_PowerControl, + ARM_SAI_Send, + ARM_SAI_Receive, + ARM_SAI_GetTxCount, + ARM_SAI_GetRxCount, + ARM_SAI_Control, + ARM_SAI_GetStatus +}; diff --git a/CMSIS/Driver/DriverTemplates/Driver_SPI.c b/CMSIS/Driver/DriverTemplates/Driver_SPI.c new file mode 100644 index 0000000..9f31654 --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_SPI.c @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_SPI.h" + +#define ARM_SPI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_SPI_API_VERSION, + ARM_SPI_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_SPI_CAPABILITIES DriverCapabilities = { + 1, /* Simplex Mode (Master and Slave) */ + 1, /* TI Synchronous Serial Interface */ + 1, /* Microwire Interface */ + 0 /* Signal Mode Fault event: \ref ARM_SPI_EVENT_MODE_FAULT */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_SPI_GetVersion(void) +{ +} + +ARM_SPI_CAPABILITIES ARM_SPI_GetCapabilities(void) +{ +} + +int32_t ARM_SPI_Initialize(ARM_SPI_SignalEvent_t cb_event) +{ +} + +int32_t ARM_SPI_Uninitialize(void) +{ +} + +int32_t ARM_SPI_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_SPI_Send(const void *data, uint32_t num) +{ +} + +int32_t ARM_SPI_Receive(void *data, uint32_t num) +{ +} + +int32_t ARM_SPI_Transfer(const void *data_out, void *data_in, uint32_t num) +{ +} + +uint32_t ARM_SPI_GetDataCount(void) +{ +} + +int32_t ARM_SPI_Control(uint32_t control, uint32_t arg) +{ + switch (control & ARM_SPI_CONTROL_Msk) + { + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + + case ARM_SPI_MODE_INACTIVE: // SPI Inactive + return ARM_DRIVER_OK; + + case ARM_SPI_MODE_MASTER: // SPI Master (Output on MOSI, Input on MISO); arg = Bus Speed in bps + break; + + case ARM_SPI_MODE_SLAVE: // SPI Slave (Output on MISO, Input on MOSI) + break; + + case ARM_SPI_MODE_MASTER_SIMPLEX: // SPI Master (Output/Input on MOSI); arg = Bus Speed in bps + case ARM_SPI_MODE_SLAVE_SIMPLEX: // SPI Slave (Output/Input on MISO) + return ARM_SPI_ERROR_MODE; + + case ARM_SPI_SET_BUS_SPEED: // Set Bus Speed in bps; arg = value + break; + + case ARM_SPI_GET_BUS_SPEED: // Get Bus Speed in bps + break; + + case ARM_SPI_SET_DEFAULT_TX_VALUE: // Set default Transmit value; arg = value + break; + + case ARM_SPI_CONTROL_SS: // Control Slave Select; arg = 0:inactive, 1:active + break; + + case ARM_SPI_ABORT_TRANSFER: // Abort current data transfer + break; + } +} + +ARM_SPI_STATUS ARM_SPI_GetStatus(void) +{ +} + +void ARM_SPI_SignalEvent(uint32_t event) +{ + // function body +} + +// End SPI Interface + +ARM_DRIVER_SPI Driver_SPI = { + ARM_SPI_GetVersion, + ARM_SPI_GetCapabilities, + ARM_SPI_Initialize, + ARM_SPI_Uninitialize, + ARM_SPI_PowerControl, + ARM_SPI_Send, + ARM_SPI_Receive, + ARM_SPI_Transfer, + ARM_SPI_GetDataCount, + ARM_SPI_Control, + ARM_SPI_GetStatus +}; diff --git a/CMSIS/Driver/DriverTemplates/Driver_Storage.c b/CMSIS/Driver/DriverTemplates/Driver_Storage.c new file mode 100644 index 0000000..2b24436 --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_Storage.c @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + + +#include "Driver_Storage.h" + +#define ARM_STORAGE_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_STORAGE_API_VERSION, + ARM_STORAGE_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_STORAGE_CAPABILITIES DriverCapabilities = { + 1, /* Asynchronous Mode */ + 1, /* Supports EraseAll operation */ + 0 /* Reserved */ +}; + + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_Storage_GetVersion (void) { +} + +ARM_STORAGE_CAPABILITIES ARM_Storage_GetCapabilities (void) { +} + +int32_t ARM_Storage_Initialize (ARM_Storage_Callback_t callback) { +} + +int32_t ARM_Storage_Uninitialize (void) { +} + +int32_t ARM_Storage_PowerControl (ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_Storage_ReadData (uint64_t addr, void *data, uint32_t size) { +} + +int32_t ARM_Storage_ProgramData (uint64_t addr, const void *data, uint32_t size) { +} + +int32_t ARM_Storage_Erase (uint64_t addr, uint32_t size) { +} + +int32_t ARM_Storage_EraseAll (void) { +} + +ARM_STORAGE_STATUS ARM_Storage_GetStatus (void) { +} + +int32_t ARM_Storage_GetInfo (ARM_STORAGE_INFO *info) { +} + +uint32_t ARM_Storage_ResolveAddress(uint64_t addr) { +} + +int32_t ARM_Storage_GetNextBlock(const ARM_STORAGE_BLOCK* prev_block, ARM_STORAGE_BLOCK *next_block) { +} + +int32_t ARM_Storage_GetBlock(uint64_t addr, ARM_STORAGE_BLOCK *block) { +} +// End Storage Interface + +ARM_DRIVER_STORAGE Driver_STORAGE = { + ARM_Storage_GetVersion, + ARM_Storage_GetCapabilities, + ARM_Storage_Initialize, + ARM_Storage_Uninitialize, + ARM_Storage_PowerControl, + ARM_Storage_ReadData, + ARM_Storage_ProgramData, + ARM_Storage_Erase, + ARM_Storage_EraseAll, + ARM_Storage_GetStatus, + ARM_Storage_GetInfo, + ARM_Storage_ResolveAddress, + ARM_Storage_GetNextBlock, + ARM_Storage_GetBlock +}; diff --git a/CMSIS/Driver/DriverTemplates/Driver_USART.c b/CMSIS/Driver/DriverTemplates/Driver_USART.c new file mode 100644 index 0000000..6270a4c --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_USART.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_USART.h" + +#define ARM_USART_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION DriverVersion = { + ARM_USART_API_VERSION, + ARM_USART_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_USART_CAPABILITIES DriverCapabilities = { + 1, /* supports UART (Asynchronous) mode */ + 0, /* supports Synchronous Master mode */ + 0, /* supports Synchronous Slave mode */ + 0, /* supports UART Single-wire mode */ + 0, /* supports UART IrDA mode */ + 0, /* supports UART Smart Card mode */ + 0, /* Smart Card Clock generator available */ + 0, /* RTS Flow Control available */ + 0, /* CTS Flow Control available */ + 0, /* Transmit completed event: \ref ARM_USART_EVENT_TX_COMPLETE */ + 0, /* Signal receive character timeout event: \ref ARM_USART_EVENT_RX_TIMEOUT */ + 0, /* RTS Line: 0=not available, 1=available */ + 0, /* CTS Line: 0=not available, 1=available */ + 0, /* DTR Line: 0=not available, 1=available */ + 0, /* DSR Line: 0=not available, 1=available */ + 0, /* DCD Line: 0=not available, 1=available */ + 0, /* RI Line: 0=not available, 1=available */ + 0, /* Signal CTS change event: \ref ARM_USART_EVENT_CTS */ + 0, /* Signal DSR change event: \ref ARM_USART_EVENT_DSR */ + 0, /* Signal DCD change event: \ref ARM_USART_EVENT_DCD */ + 0 /* Signal RI change event: \ref ARM_USART_EVENT_RI */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_USART_GetVersion(void) +{ +} + +ARM_USART_CAPABILITIES ARM_USART_GetCapabilities(void) +{ +} + +int32_t ARM_USART_Initialize(ARM_USART_SignalEvent_t cb_event) +{ +} + +int32_t ARM_USART_Uninitialize(void) +{ +} + +int32_t ARM_USART_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_USART_Send(const void *data, uint32_t num) +{ +} + +int32_t ARM_USART_Receive(void *data, uint32_t num) +{ +} + +int32_t ARM_USART_Transfer(const void *data_out, void *data_in, uint32_t num) +{ +} + +uint32_t ARM_USART_GetTxCount(void) +{ +} + +uint32_t ARM_USART_GetRxCount(void) +{ +} + +int32_t ARM_USART_Control(uint32_t control, uint32_t arg) +{ +} + +ARM_USART_STATUS ARM_USART_GetStatus(void) +{ +} + +int32_t ARM_USART_SetModemControl(ARM_USART_MODEM_CONTROL control) +{ +} + +ARM_USART_MODEM_STATUS ARM_USART_GetModemStatus(void) +{ +} + +void ARM_USART_SignalEvent(uint32_t event) +{ + // function body +} + +// End USART Interface + +ARM_DRIVER_USART Driver_USART = { + ARM_USART_GetVersion, + ARM_USART_GetCapabilities, + ARM_USART_Initialize, + ARM_USART_Uninitialize, + ARM_USART_PowerControl, + ARM_USART_Send, + ARM_USART_Receive, + ARM_USART_Transfer, + ARM_USART_GetTxCount, + ARM_USART_GetRxCount, + ARM_USART_Control, + ARM_USART_GetStatus, + ARM_USART_SetModemControl, + ARM_USART_GetModemStatus +}; diff --git a/CMSIS/Driver/DriverTemplates/Driver_USBD.c b/CMSIS/Driver/DriverTemplates/Driver_USBD.c new file mode 100644 index 0000000..effbdf7 --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_USBD.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_USBD.h" + +#define ARM_USBD_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION usbd_driver_version = { + ARM_USBD_API_VERSION, + ARM_USBD_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_USBD_CAPABILITIES usbd_driver_capabilities = { + 0, /* vbus_detection */ + 0, /* event_vbus_on */ + 0 /* event_vbus_off */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_USBD_GetVersion(void) +{ +} + +ARM_USBD_CAPABILITIES ARM_USBD_GetCapabilities(void) +{ +} + +int32_t ARM_USBD_Initialize(ARM_USBD_SignalDeviceEvent_t cb_device_event, + ARM_USBD_SignalEndpointEvent_t cb_endpoint_event) +{ +} + +int32_t ARM_USBD_Uninitialize(void) +{ +} + +int32_t ARM_USBD_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_USBD_DeviceConnect(void) +{ +} + +int32_t ARM_USBD_DeviceDisconnect(void) +{ +} + +ARM_USBD_STATE ARM_USBD_DeviceGetState(void) +{ +} + +int32_t ARM_USBD_DeviceRemoteWakeup(void) +{ +} + +int32_t ARM_USBD_DeviceSetAddress(uint8_t dev_addr) +{ +} + +int32_t ARM_USBD_ReadSetupPacket(uint8_t *setup) +{ +} + +int32_t ARM_USBD_EndpointConfigure(uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size) +{ +} + +int32_t ARM_USBD_EndpointUnconfigure(uint8_t ep_addr) +{ +} + +int32_t ARM_USBD_EndpointStall(uint8_t ep_addr, bool stall) +{ +} + +int32_t ARM_USBD_EndpointTransfer(uint8_t ep_addr, uint8_t *data, uint32_t num) +{ +} + +uint32_t ARM_USBD_EndpointTransferGetResult(uint8_t ep_addr) +{ +} + +int32_t ARM_USBD_EndpointTransferAbort(uint8_t ep_addr) +{ +} + +uint16_t ARM_USBD_GetFrameNumber(void) +{ +} + +void ARM_USBD_SignalDeviceEvent(uint32_t event) +{ + // function body +} + +void ARM_USBD_SignalEndpointEvent(uint8_t ep_addr, uint32_t ep_event) +{ + // function body +} + +// End USBD Interface + +ARM_DRIVER_USBD Driver_USBD = +{ + ARM_USBD_GetVersion, + ARM_USBD_GetCapabilities, + ARM_USBD_Initialize, + ARM_USBD_Uninitialize, + ARM_USBD_PowerControl, + ARM_USBD_DeviceConnect, + ARM_USBD_DeviceDisconnect, + ARM_USBD_DeviceGetState, + ARM_USBD_DeviceRemoteWakeup, + ARM_USBD_DeviceSetAddress, + ARM_USBD_ReadSetupPacket, + ARM_USBD_EndpointConfigure, + ARM_USBD_EndpointUnconfigure, + ARM_USBD_EndpointStall, + ARM_USBD_EndpointTransfer, + ARM_USBD_EndpointTransferGetResult, + ARM_USBD_EndpointTransferAbort, + ARM_USBD_GetFrameNumber +}; diff --git a/CMSIS/Driver/DriverTemplates/Driver_USBH.c b/CMSIS/Driver/DriverTemplates/Driver_USBH.c new file mode 100644 index 0000000..12074ed --- /dev/null +++ b/CMSIS/Driver/DriverTemplates/Driver_USBH.c @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + */ + +#include "Driver_USBH.h" + +/* USB Host Driver */ + +#define ARM_USBH_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2, 0) /* driver version */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION usbh_driver_version = { + ARM_USBH_API_VERSION, + ARM_USBH_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_USBH_CAPABILITIES usbd_driver_capabilities = { + 0x0001, /* Root HUB available Ports Mask */ + 0, /* Automatic SPLIT packet handling */ + 0, /* Signal Connect event */ + 0, /* Signal Disconnect event */ + 0 /* Signal Overcurrent event */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_USBH_GetVersion(void) +{ +} + +ARM_USBH_CAPABILITIES ARM_USBH_GetCapabilities(void) +{ +} + +int32_t ARM_USBH_Initialize(ARM_USBH_SignalPortEvent_t cb_port_event, + ARM_USBH_SignalEndpointEvent_t cb_endpoint_event) +{ +} + +int32_t ARM_USBH_Uninitialize(void) +{ +} + +int32_t ARM_USBH_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_USBH_PortVbusOnOff(uint8_t port, bool vbus) +{ +} + +int32_t ARM_USBH_PortReset(uint8_t port) +{ +} + +int32_t ARM_USBH_PortSuspend(uint8_t port) +{ +} + +int32_t ARM_USBH_PortResume(uint8_t port) +{ +} + +ARM_USBH_PORT_STATE ARM_USBH_PortGetState(uint8_t port) +{ +} + +ARM_USBH_EP_HANDLE ARM_USBH_EndpointCreate(uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size, + uint8_t ep_interval) +{ +} + +int32_t ARM_USBH_EndpointModify(ARM_USBH_EP_HANDLE ep_hndl, + uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint16_t ep_max_packet_size) +{ +} + +int32_t ARM_USBH_EndpointDelete(ARM_USBH_EP_HANDLE ep_hndl) +{ +} + +int32_t ARM_USBH_EndpointReset(ARM_USBH_EP_HANDLE ep_hndl) +{ +} + +int32_t ARM_USBH_EndpointTransfer(ARM_USBH_EP_HANDLE ep_hndl, + uint32_t packet, + uint8_t *data, + uint32_t num) +{ +} + +uint32_t ARM_USBH_EndpointTransferGetResult(ARM_USBH_EP_HANDLE ep_hndl) +{ +} + +int32_t ARM_USBH_EndpointTransferAbort(ARM_USBH_EP_HANDLE ep_hndl) +{ +} + +uint16_t ARM_USBH_GetFrameNumber(void) +{ +} + +void ARM_USBH_SignalPortEvent(uint8_t port, uint32_t event) +{ + // function body +} + +void ARM_USBH_SignalEndpointEvent(ARM_USBH_EP_HANDLE ep_hndl, uint32_t event) +{ + // function body +} + +/* USB Host HCI (OHCI/EHCI) Driver */ + +/* Driver Version */ +static const ARM_DRIVER_VERSION usbh_hci_driver_version = { + ARM_USBH_API_VERSION, + ARM_USBH_DRV_VERSION +}; + +/* Driver Capabilities */ +static const ARM_USBH_HCI_CAPABILITIES usbh_hci_driver_capabilities = { + 0x0001 /* Root HUB available Ports Mask */ +}; + +// +// Functions +// + +ARM_DRIVER_VERSION ARM_USBH_HCI_GetVersion(void) +{ +} + +ARM_USBH_HCI_CAPABILITIES ARM_USBH_HCI_GetCapabilities(void) +{ +} + +int32_t ARM_USBH_HCI_Initialize(ARM_USBH_HCI_Interrupt_t cb_interrupt) +{ +} + +int32_t ARM_USBH_HCI_Uninitialize(void) +{ +} + +int32_t ARM_USBH_HCI_PowerControl(ARM_POWER_STATE state) +{ + switch (state) + { + case ARM_POWER_OFF: + break; + + case ARM_POWER_LOW: + break; + + case ARM_POWER_FULL: + break; + + default: + return ARM_DRIVER_ERROR_UNSUPPORTED; + } +} + +int32_t ARM_USBH_HCI_PortVbusOnOff(uint8_t port, bool vbus) +{ +} + +void ARM_USBH_HCI_Interrupt(void) +{ + // function body +} + +// End USBH Interface + +ARM_DRIVER_USBH_HCI Driver_USBH_HCI = { + ARM_USBH_HCI_GetVersion, + ARM_USBH_HCI_GetCapabilities, + ARM_USBH_HCI_Initialize, + ARM_USBH_HCI_Uninitialize, + ARM_USBH_HCI_PowerControl, + ARM_USBH_HCI_PortVbusOnOff +}; diff --git a/CMSIS/Driver/Include/Driver_CAN.h b/CMSIS/Driver/Include/Driver_CAN.h new file mode 100644 index 0000000..5c567e6 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_CAN.h @@ -0,0 +1,382 @@ +/* + * Copyright (c) 2015-2017 ARM 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. + * + * $Date: 13. Sept 2017 + * $Revision: V1.2 + * + * Project: CAN (Controller Area Network) Driver definitions + */ + +/* History: + * Version 1.2 + * Added ARM_CAN_UNIT_STATE_BUS_OFF unit state and + * ARM_CAN_EVENT_UNIT_INACTIVE unit event + * Version 1.1 + * ARM_CAN_STATUS made volatile + * Version 1.0 + * Initial release + */ + +#ifndef DRIVER_CAN_H_ +#define DRIVER_CAN_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_CAN_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,2) /* API version */ + + +/****** CAN Bitrate selection codes *****/ +typedef enum _ARM_CAN_BITRATE_SELECT { + ARM_CAN_BITRATE_NOMINAL, ///< Select nominal (flexible data-rate arbitration) bitrate + ARM_CAN_BITRATE_FD_DATA ///< Select flexible data-rate data bitrate +} ARM_CAN_BITRATE_SELECT; + +/****** CAN Bit Propagation Segment codes (PROP_SEG) *****/ +#define ARM_CAN_BIT_PROP_SEG_Pos 0UL ///< bits 7..0 +#define ARM_CAN_BIT_PROP_SEG_Msk (0xFFUL << ARM_CAN_BIT_PROP_SEG_Pos) +#define ARM_CAN_BIT_PROP_SEG(x) (((x) << ARM_CAN_BIT_PROP_SEG_Pos) & ARM_CAN_BIT_PROP_SEG_Msk) + +/****** CAN Bit Phase Buffer Segment 1 (PHASE_SEG1) codes *****/ +#define ARM_CAN_BIT_PHASE_SEG1_Pos 8UL ///< bits 15..8 +#define ARM_CAN_BIT_PHASE_SEG1_Msk (0xFFUL << ARM_CAN_BIT_PHASE_SEG1_Pos) +#define ARM_CAN_BIT_PHASE_SEG1(x) (((x) << ARM_CAN_BIT_PHASE_SEG1_Pos) & ARM_CAN_BIT_PHASE_SEG1_Msk) + +/****** CAN Bit Phase Buffer Segment 2 (PHASE_SEG2) codes *****/ +#define ARM_CAN_BIT_PHASE_SEG2_Pos 16UL ///< bits 23..16 +#define ARM_CAN_BIT_PHASE_SEG2_Msk (0xFFUL << ARM_CAN_BIT_PHASE_SEG2_Pos) +#define ARM_CAN_BIT_PHASE_SEG2(x) (((x) << ARM_CAN_BIT_PHASE_SEG2_Pos) & ARM_CAN_BIT_PHASE_SEG2_Msk) + +/****** CAN Bit (Re)Synchronization Jump Width Segment (SJW) *****/ +#define ARM_CAN_BIT_SJW_Pos 24UL ///< bits 28..24 +#define ARM_CAN_BIT_SJW_Msk (0x1FUL << ARM_CAN_BIT_SJW_Pos) +#define ARM_CAN_BIT_SJW(x) (((x) << ARM_CAN_BIT_SJW_Pos) & ARM_CAN_BIT_SJW_Msk) + +/****** CAN Mode codes *****/ +typedef enum _ARM_CAN_MODE { + ARM_CAN_MODE_INITIALIZATION, ///< Initialization mode + ARM_CAN_MODE_NORMAL, ///< Normal operation mode + ARM_CAN_MODE_RESTRICTED, ///< Restricted operation mode + ARM_CAN_MODE_MONITOR, ///< Bus monitoring mode + ARM_CAN_MODE_LOOPBACK_INTERNAL, ///< Loopback internal mode + ARM_CAN_MODE_LOOPBACK_EXTERNAL ///< Loopback external mode +} ARM_CAN_MODE; + +/****** CAN Filter Operation codes *****/ +typedef enum _ARM_CAN_FILTER_OPERATION { + ARM_CAN_FILTER_ID_EXACT_ADD, ///< Add exact id filter + ARM_CAN_FILTER_ID_EXACT_REMOVE, ///< Remove exact id filter + ARM_CAN_FILTER_ID_RANGE_ADD, ///< Add range id filter + ARM_CAN_FILTER_ID_RANGE_REMOVE, ///< Remove range id filter + ARM_CAN_FILTER_ID_MASKABLE_ADD, ///< Add maskable id filter + ARM_CAN_FILTER_ID_MASKABLE_REMOVE ///< Remove maskable id filter +} ARM_CAN_FILTER_OPERATION; + +/****** CAN Object Configuration codes *****/ +typedef enum _ARM_CAN_OBJ_CONFIG { + ARM_CAN_OBJ_INACTIVE, ///< CAN object inactive + ARM_CAN_OBJ_TX, ///< CAN transmit object + ARM_CAN_OBJ_RX, ///< CAN receive object + ARM_CAN_OBJ_RX_RTR_TX_DATA, ///< CAN object that on RTR reception automatically transmits Data Frame + ARM_CAN_OBJ_TX_RTR_RX_DATA ///< CAN object that transmits RTR and automatically receives Data Frame +} ARM_CAN_OBJ_CONFIG; + +/** +\brief CAN Object Capabilities +*/ +typedef struct _ARM_CAN_OBJ_CAPABILITIES { + uint32_t tx : 1; ///< Object supports transmission + uint32_t rx : 1; ///< Object supports reception + uint32_t rx_rtr_tx_data : 1; ///< Object supports RTR reception and automatic Data Frame transmission + uint32_t tx_rtr_rx_data : 1; ///< Object supports RTR transmission and automatic Data Frame reception + uint32_t multiple_filters : 1; ///< Object allows assignment of multiple filters to it + uint32_t exact_filtering : 1; ///< Object supports exact identifier filtering + uint32_t range_filtering : 1; ///< Object supports range identifier filtering + uint32_t mask_filtering : 1; ///< Object supports mask identifier filtering + uint32_t message_depth : 8; ///< Number of messages buffers (FIFO) for that object + uint32_t reserved : 16; ///< Reserved (must be zero) +} ARM_CAN_OBJ_CAPABILITIES; + +/****** CAN Control Function Operation codes *****/ +#define ARM_CAN_CONTROL_Pos 0UL +#define ARM_CAN_CONTROL_Msk (0xFFUL << ARM_CAN_CONTROL_Pos) +#define ARM_CAN_SET_FD_MODE (1UL << ARM_CAN_CONTROL_Pos) ///< Set FD operation mode; arg: 0 = disable, 1 = enable +#define ARM_CAN_ABORT_MESSAGE_SEND (2UL << ARM_CAN_CONTROL_Pos) ///< Abort sending of CAN message; arg = object +#define ARM_CAN_CONTROL_RETRANSMISSION (3UL << ARM_CAN_CONTROL_Pos) ///< Enable/disable automatic retransmission; arg: 0 = disable, 1 = enable (default state) +#define ARM_CAN_SET_TRANSCEIVER_DELAY (4UL << ARM_CAN_CONTROL_Pos) ///< Set transceiver delay; arg = delay in time quanta + +/****** CAN ID Frame Format codes *****/ +#define ARM_CAN_ID_IDE_Pos 31UL +#define ARM_CAN_ID_IDE_Msk (1UL << ARM_CAN_ID_IDE_Pos) + +/****** CAN Identifier encoding *****/ +#define ARM_CAN_STANDARD_ID(id) (id & 0x000007FFUL) ///< CAN identifier in standard format (11-bits) +#define ARM_CAN_EXTENDED_ID(id) ((id & 0x1FFFFFFFUL) | ARM_CAN_ID_IDE_Msk)///< CAN identifier in extended format (29-bits) + +/** +\brief CAN Message Information +*/ +typedef struct _ARM_CAN_MSG_INFO { + uint32_t id; ///< CAN identifier with frame format specifier (bit 31) + uint32_t rtr : 1; ///< Remote transmission request frame + uint32_t edl : 1; ///< Flexible data-rate format extended data length + uint32_t brs : 1; ///< Flexible data-rate format with bitrate switch + uint32_t esi : 1; ///< Flexible data-rate format error state indicator + uint32_t dlc : 4; ///< Data length code + uint32_t reserved : 24; +} ARM_CAN_MSG_INFO; + +/****** CAN specific error code *****/ +#define ARM_CAN_INVALID_BITRATE_SELECT (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Bitrate selection not supported +#define ARM_CAN_INVALID_BITRATE (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Requested bitrate not supported +#define ARM_CAN_INVALID_BIT_PROP_SEG (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Propagation segment value not supported +#define ARM_CAN_INVALID_BIT_PHASE_SEG1 (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Phase segment 1 value not supported +#define ARM_CAN_INVALID_BIT_PHASE_SEG2 (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Phase segment 2 value not supported +#define ARM_CAN_INVALID_BIT_SJW (ARM_DRIVER_ERROR_SPECIFIC - 6) ///< SJW value not supported +#define ARM_CAN_NO_MESSAGE_AVAILABLE (ARM_DRIVER_ERROR_SPECIFIC - 7) ///< Message is not available + +/****** CAN Status codes *****/ +#define ARM_CAN_UNIT_STATE_INACTIVE (0U) ///< Unit state: Not active on bus (initialization) +#define ARM_CAN_UNIT_STATE_ACTIVE (1U) ///< Unit state: Active on bus (can generate active error frame) +#define ARM_CAN_UNIT_STATE_PASSIVE (2U) ///< Unit state: Error passive (can not generate active error frame) +#define ARM_CAN_UNIT_STATE_BUS_OFF (3U) ///< Unit state: Bus-off (can recover to active state) +#define ARM_CAN_LEC_NO_ERROR (0U) ///< Last error code: No error +#define ARM_CAN_LEC_BIT_ERROR (1U) ///< Last error code: Bit error +#define ARM_CAN_LEC_STUFF_ERROR (2U) ///< Last error code: Bit stuffing error +#define ARM_CAN_LEC_CRC_ERROR (3U) ///< Last error code: CRC error +#define ARM_CAN_LEC_FORM_ERROR (4U) ///< Last error code: Illegal fixed-form bit +#define ARM_CAN_LEC_ACK_ERROR (5U) ///< Last error code: Acknowledgment error + +/** +\brief CAN Status +*/ +typedef volatile struct _ARM_CAN_STATUS { + uint32_t unit_state : 4; ///< Unit bus state + uint32_t last_error_code : 4; ///< Last error code + uint32_t tx_error_count : 8; ///< Transmitter error count + uint32_t rx_error_count : 8; ///< Receiver error count + uint32_t reserved : 8; +} ARM_CAN_STATUS; + + +/****** CAN Unit Event *****/ +#define ARM_CAN_EVENT_UNIT_INACTIVE (0U) ///< Unit entered Inactive state +#define ARM_CAN_EVENT_UNIT_ACTIVE (1U) ///< Unit entered Error Active state +#define ARM_CAN_EVENT_UNIT_WARNING (2U) ///< Unit entered Error Warning state (one or both error counters >= 96) +#define ARM_CAN_EVENT_UNIT_PASSIVE (3U) ///< Unit entered Error Passive state +#define ARM_CAN_EVENT_UNIT_BUS_OFF (4U) ///< Unit entered Bus-off state + +/****** CAN Send/Receive Event *****/ +#define ARM_CAN_EVENT_SEND_COMPLETE (1UL << 0) ///< Send complete +#define ARM_CAN_EVENT_RECEIVE (1UL << 1) ///< Message received +#define ARM_CAN_EVENT_RECEIVE_OVERRUN (1UL << 2) ///< Received message overrun + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_CAN_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_CAN_CAPABILITIES ARM_CAN_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_CAN_CAPABILITIES + + \fn int32_t ARM_CAN_Initialize (ARM_CAN_SignalUnitEvent_t cb_unit_event, + ARM_CAN_SignalObjectEvent_t cb_object_event) + \brief Initialize CAN interface and register signal (callback) functions. + \param[in] cb_unit_event Pointer to \ref ARM_CAN_SignalUnitEvent callback function + \param[in] cb_object_event Pointer to \ref ARM_CAN_SignalObjectEvent callback function + \return \ref execution_status + + \fn int32_t ARM_CAN_Uninitialize (void) + \brief De-initialize CAN interface. + \return \ref execution_status + + \fn int32_t ARM_CAN_PowerControl (ARM_POWER_STATE state) + \brief Control CAN interface power. + \param[in] state Power state + - \ref ARM_POWER_OFF : power off: no operation possible + - \ref ARM_POWER_LOW : low power mode: retain state, detect and signal wake-up events + - \ref ARM_POWER_FULL : power on: full operation at maximum performance + \return \ref execution_status + + \fn uint32_t ARM_CAN_GetClock (void) + \brief Retrieve CAN base clock frequency. + \return base clock frequency + + \fn int32_t ARM_CAN_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments) + \brief Set bitrate for CAN interface. + \param[in] select Bitrate selection + - \ref ARM_CAN_BITRATE_NOMINAL : nominal (flexible data-rate arbitration) bitrate + - \ref ARM_CAN_BITRATE_FD_DATA : flexible data-rate data bitrate + \param[in] bitrate Bitrate + \param[in] bit_segments Bit segments settings + - \ref ARM_CAN_BIT_PROP_SEG(x) : number of time quanta for propagation time segment + - \ref ARM_CAN_BIT_PHASE_SEG1(x) : number of time quanta for phase buffer segment 1 + - \ref ARM_CAN_BIT_PHASE_SEG2(x) : number of time quanta for phase buffer Segment 2 + - \ref ARM_CAN_BIT_SJW(x) : number of time quanta for (re-)synchronization jump width + \return \ref execution_status + + \fn int32_t ARM_CAN_SetMode (ARM_CAN_MODE mode) + \brief Set operating mode for CAN interface. + \param[in] mode Operating mode + - \ref ARM_CAN_MODE_INITIALIZATION : initialization mode + - \ref ARM_CAN_MODE_NORMAL : normal operation mode + - \ref ARM_CAN_MODE_RESTRICTED : restricted operation mode + - \ref ARM_CAN_MODE_MONITOR : bus monitoring mode + - \ref ARM_CAN_MODE_LOOPBACK_INTERNAL : loopback internal mode + - \ref ARM_CAN_MODE_LOOPBACK_EXTERNAL : loopback external mode + \return \ref execution_status + + \fn ARM_CAN_OBJ_CAPABILITIES ARM_CAN_ObjectGetCapabilities (uint32_t obj_idx) + \brief Retrieve capabilities of an object. + \param[in] obj_idx Object index + \return \ref ARM_CAN_OBJ_CAPABILITIES + + \fn int32_t ARM_CAN_ObjectSetFilter (uint32_t obj_idx, ARM_CAN_FILTER_OPERATION operation, uint32_t id, uint32_t arg) + \brief Add or remove filter for message reception. + \param[in] obj_idx Object index of object that filter should be or is assigned to + \param[in] operation Operation on filter + - \ref ARM_CAN_FILTER_ID_EXACT_ADD : add exact id filter + - \ref ARM_CAN_FILTER_ID_EXACT_REMOVE : remove exact id filter + - \ref ARM_CAN_FILTER_ID_RANGE_ADD : add range id filter + - \ref ARM_CAN_FILTER_ID_RANGE_REMOVE : remove range id filter + - \ref ARM_CAN_FILTER_ID_MASKABLE_ADD : add maskable id filter + - \ref ARM_CAN_FILTER_ID_MASKABLE_REMOVE : remove maskable id filter + \param[in] id ID or start of ID range (depending on filter type) + \param[in] arg Mask or end of ID range (depending on filter type) + \return \ref execution_status + + \fn int32_t ARM_CAN_ObjectConfigure (uint32_t obj_idx, ARM_CAN_OBJ_CONFIG obj_cfg) + \brief Configure object. + \param[in] obj_idx Object index + \param[in] obj_cfg Object configuration state + - \ref ARM_CAN_OBJ_INACTIVE : deactivate object + - \ref ARM_CAN_OBJ_RX : configure object for reception + - \ref ARM_CAN_OBJ_TX : configure object for transmission + - \ref ARM_CAN_OBJ_RX_RTR_TX_DATA : configure object that on RTR reception automatically transmits Data Frame + - \ref ARM_CAN_OBJ_TX_RTR_RX_DATA : configure object that transmits RTR and automatically receives Data Frame + \return \ref execution_status + + \fn int32_t ARM_CAN_MessageSend (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, const uint8_t *data, uint8_t size) + \brief Send message on CAN bus. + \param[in] obj_idx Object index + \param[in] msg_info Pointer to CAN message information + \param[in] data Pointer to data buffer + \param[in] size Number of data bytes to send + \return value >= 0 number of data bytes accepted to send + \return value < 0 \ref execution_status + + \fn int32_t ARM_CAN_MessageRead (uint32_t obj_idx, ARM_CAN_MSG_INFO *msg_info, uint8_t *data, uint8_t size) + \brief Read message received on CAN bus. + \param[in] obj_idx Object index + \param[out] msg_info Pointer to read CAN message information + \param[out] data Pointer to data buffer for read data + \param[in] size Maximum number of data bytes to read + \return value >= 0 number of data bytes read + \return value < 0 \ref execution_status + + \fn int32_t ARM_CAN_Control (uint32_t control, uint32_t arg) + \brief Control CAN interface. + \param[in] control Operation + - \ref ARM_CAN_SET_FD_MODE : set FD operation mode + - \ref ARM_CAN_ABORT_MESSAGE_SEND : abort sending of CAN message + - \ref ARM_CAN_CONTROL_RETRANSMISSION : enable/disable automatic retransmission + - \ref ARM_CAN_SET_TRANSCEIVER_DELAY : set transceiver delay + \param[in] arg Argument of operation + \return \ref execution_status + + \fn ARM_CAN_STATUS ARM_CAN_GetStatus (void) + \brief Get CAN status. + \return CAN status \ref ARM_CAN_STATUS + + \fn void ARM_CAN_SignalUnitEvent (uint32_t event) + \brief Signal CAN unit event. + \param[in] event \ref CAN_unit_events + \return none + + \fn void ARM_CAN_SignalObjectEvent (uint32_t obj_idx, uint32_t event) + \brief Signal CAN object event. + \param[in] obj_idx Object index + \param[in] event \ref CAN_events + \return none +*/ + +typedef void (*ARM_CAN_SignalUnitEvent_t) (uint32_t event); ///< Pointer to \ref ARM_CAN_SignalUnitEvent : Signal CAN Unit Event. +typedef void (*ARM_CAN_SignalObjectEvent_t) (uint32_t obj_idx, uint32_t event); ///< Pointer to \ref ARM_CAN_SignalObjectEvent : Signal CAN Object Event. + + +/** +\brief CAN Device Driver Capabilities. +*/ +typedef struct _ARM_CAN_CAPABILITIES { + uint32_t num_objects : 8; ///< Number of \ref can_objects available + uint32_t reentrant_operation : 1; ///< Support for reentrant calls to \ref ARM_CAN_MessageSend, \ref ARM_CAN_MessageRead, \ref ARM_CAN_ObjectConfigure and abort message sending used by \ref ARM_CAN_Control + uint32_t fd_mode : 1; ///< Support for CAN with flexible data-rate mode (CAN_FD) (set by \ref ARM_CAN_Control) + uint32_t restricted_mode : 1; ///< Support for restricted operation mode (set by \ref ARM_CAN_SetMode) + uint32_t monitor_mode : 1; ///< Support for bus monitoring mode (set by \ref ARM_CAN_SetMode) + uint32_t internal_loopback : 1; ///< Support for internal loopback mode (set by \ref ARM_CAN_SetMode) + uint32_t external_loopback : 1; ///< Support for external loopback mode (set by \ref ARM_CAN_SetMode) + uint32_t reserved : 18; ///< Reserved (must be zero) +} ARM_CAN_CAPABILITIES; + + +/** +\brief Access structure of the CAN Driver. +*/ +typedef struct _ARM_DRIVER_CAN { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_CAN_GetVersion : Get driver version. + ARM_CAN_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_CAN_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_CAN_SignalUnitEvent_t cb_unit_event, + ARM_CAN_SignalObjectEvent_t cb_object_event); ///< Pointer to \ref ARM_CAN_Initialize : Initialize CAN interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_CAN_Uninitialize : De-initialize CAN interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_CAN_PowerControl : Control CAN interface power. + uint32_t (*GetClock) (void); ///< Pointer to \ref ARM_CAN_GetClock : Retrieve CAN base clock frequency. + int32_t (*SetBitrate) (ARM_CAN_BITRATE_SELECT select, + uint32_t bitrate, + uint32_t bit_segments); ///< Pointer to \ref ARM_CAN_SetBitrate : Set bitrate for CAN interface. + int32_t (*SetMode) (ARM_CAN_MODE mode); ///< Pointer to \ref ARM_CAN_SetMode : Set operating mode for CAN interface. + ARM_CAN_OBJ_CAPABILITIES (*ObjectGetCapabilities) (uint32_t obj_idx); ///< Pointer to \ref ARM_CAN_ObjectGetCapabilities : Retrieve capabilities of an object. + int32_t (*ObjectSetFilter) (uint32_t obj_idx, + ARM_CAN_FILTER_OPERATION operation, + uint32_t id, + uint32_t arg); ///< Pointer to \ref ARM_CAN_ObjectSetFilter : Add or remove filter for message reception. + int32_t (*ObjectConfigure) (uint32_t obj_idx, + ARM_CAN_OBJ_CONFIG obj_cfg); ///< Pointer to \ref ARM_CAN_ObjectConfigure : Configure object. + int32_t (*MessageSend) (uint32_t obj_idx, + ARM_CAN_MSG_INFO *msg_info, + const uint8_t *data, + uint8_t size); ///< Pointer to \ref ARM_CAN_MessageSend : Send message on CAN bus. + int32_t (*MessageRead) (uint32_t obj_idx, + ARM_CAN_MSG_INFO *msg_info, + uint8_t *data, + uint8_t size); ///< Pointer to \ref ARM_CAN_MessageRead : Read message received on CAN bus. + int32_t (*Control) (uint32_t control, + uint32_t arg); ///< Pointer to \ref ARM_CAN_Control : Control CAN interface. + ARM_CAN_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_CAN_GetStatus : Get CAN status. +} const ARM_DRIVER_CAN; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_CAN_H_ */ diff --git a/CMSIS/Driver/Include/Driver_Common.h b/CMSIS/Driver/Include/Driver_Common.h new file mode 100644 index 0000000..59d5b75 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_Common.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.0 + * + * Project: Common Driver definitions + */ + +/* History: + * Version 2.0 + * Changed prefix ARM_DRV -> ARM_DRIVER + * Added General return codes definitions + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_COMMON_H_ +#define DRIVER_COMMON_H_ + +#include +#include +#include + +#define ARM_DRIVER_VERSION_MAJOR_MINOR(major,minor) (((major) << 8) | (minor)) + +/** +\brief Driver Version +*/ +typedef struct _ARM_DRIVER_VERSION { + uint16_t api; ///< API version + uint16_t drv; ///< Driver version +} ARM_DRIVER_VERSION; + +/* General return codes */ +#define ARM_DRIVER_OK 0 ///< Operation succeeded +#define ARM_DRIVER_ERROR -1 ///< Unspecified error +#define ARM_DRIVER_ERROR_BUSY -2 ///< Driver is busy +#define ARM_DRIVER_ERROR_TIMEOUT -3 ///< Timeout occurred +#define ARM_DRIVER_ERROR_UNSUPPORTED -4 ///< Operation not supported +#define ARM_DRIVER_ERROR_PARAMETER -5 ///< Parameter error +#define ARM_DRIVER_ERROR_SPECIFIC -6 ///< Start of driver specific errors + +/** +\brief General power states +*/ +typedef enum _ARM_POWER_STATE { + ARM_POWER_OFF, ///< Power off: no operation possible + ARM_POWER_LOW, ///< Low Power mode: retain state, detect and signal wake-up events + ARM_POWER_FULL ///< Power on: full operation at maximum performance +} ARM_POWER_STATE; + +#endif /* DRIVER_COMMON_H_ */ diff --git a/CMSIS/Driver/Include/Driver_ETH.h b/CMSIS/Driver/Include/Driver_ETH.h new file mode 100644 index 0000000..d60f5fd --- /dev/null +++ b/CMSIS/Driver/Include/Driver_ETH.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.1 + * + * Project: Ethernet PHY and MAC Driver common definitions + */ + +/* History: + * Version 2.1 + * ARM_ETH_LINK_INFO made volatile + * Version 2.0 + * Removed ARM_ETH_STATUS enumerator + * Removed ARM_ETH_MODE enumerator + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_ETH_H_ +#define DRIVER_ETH_H_ + +#include "Driver_Common.h" + +/** +\brief Ethernet Media Interface type +*/ +#define ARM_ETH_INTERFACE_MII (0) ///< Media Independent Interface (MII) +#define ARM_ETH_INTERFACE_RMII (1) ///< Reduced Media Independent Interface (RMII) +#define ARM_ETH_INTERFACE_SMII (2) ///< Serial Media Independent Interface (SMII) + +/** +\brief Ethernet link speed +*/ +#define ARM_ETH_SPEED_10M (0) ///< 10 Mbps link speed +#define ARM_ETH_SPEED_100M (1) ///< 100 Mbps link speed +#define ARM_ETH_SPEED_1G (2) ///< 1 Gpbs link speed + +/** +\brief Ethernet duplex mode +*/ +#define ARM_ETH_DUPLEX_HALF (0) ///< Half duplex link +#define ARM_ETH_DUPLEX_FULL (1) ///< Full duplex link + +/** +\brief Ethernet link state +*/ +typedef enum _ARM_ETH_LINK_STATE { + ARM_ETH_LINK_DOWN, ///< Link is down + ARM_ETH_LINK_UP ///< Link is up +} ARM_ETH_LINK_STATE; + +/** +\brief Ethernet link information +*/ +typedef volatile struct _ARM_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 reserved : 29; +} ARM_ETH_LINK_INFO; + +/** +\brief Ethernet MAC Address +*/ +typedef struct _ARM_ETH_MAC_ADDR { + uint8_t b[6]; ///< MAC Address (6 bytes), MSB first +} ARM_ETH_MAC_ADDR; + +#endif /* DRIVER_ETH_H_ */ diff --git a/CMSIS/Driver/Include/Driver_ETH_MAC.h b/CMSIS/Driver/Include/Driver_ETH_MAC.h new file mode 100644 index 0000000..e26019f --- /dev/null +++ b/CMSIS/Driver/Include/Driver_ETH_MAC.h @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.1 + * + * Project: Ethernet MAC (Media Access Control) Driver definitions + */ + +/* History: + * Version 2.1 + * Added ARM_ETH_MAC_SLEEP Control + * Version 2.0 + * Changed MAC Address handling: + * moved from ARM_ETH_MAC_Initialize + * to new functions ARM_ETH_MAC_GetMacAddress and ARM_ETH_MAC_SetMacAddress + * Replaced ARM_ETH_MAC_SetMulticastAddr function with ARM_ETH_MAC_SetAddressFilter + * Extended ARM_ETH_MAC_SendFrame function with flags + * Added ARM_ETH_MAC_Control function: + * more control options (Broadcast, Multicast, Checksum offload, VLAN, ...) + * replaces ARM_ETH_MAC_SetMode + * replaces ARM_ETH_MAC_EnableTx, ARM_ETH_MAC_EnableRx + * Added optional event on transmitted frame + * Added support for PTP (Precision Time Protocol) through new functions: + * ARM_ETH_MAC_ControlTimer + * ARM_ETH_MAC_GetRxFrameTime + * ARM_ETH_MAC_GetTxFrameTime + * Changed prefix ARM_DRV -> ARM_DRIVER + * Changed return values of some functions to int32_t + * Version 1.10 + * Name space prefix ARM_ added + * Version 1.01 + * Renamed capabilities items for checksum offload + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_ETH_MAC_H_ +#define DRIVER_ETH_MAC_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_ETH.h" + +#define ARM_ETH_MAC_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,1) /* API version */ + + +#define _ARM_Driver_ETH_MAC_(n) Driver_ETH_MAC##n +#define ARM_Driver_ETH_MAC_(n) _ARM_Driver_ETH_MAC_(n) + + +/****** Ethernet MAC Control Codes *****/ + +#define ARM_ETH_MAC_CONFIGURE (0x01) ///< Configure MAC; arg = configuration +#define ARM_ETH_MAC_CONTROL_TX (0x02) ///< Transmitter; arg: 0=disabled (default), 1=enabled +#define ARM_ETH_MAC_CONTROL_RX (0x03) ///< Receiver; arg: 0=disabled (default), 1=enabled +#define ARM_ETH_MAC_FLUSH (0x04) ///< Flush buffer; arg = ARM_ETH_MAC_FLUSH_... +#define ARM_ETH_MAC_SLEEP (0x05) ///< Sleep mode; arg: 1=enter and wait for Magic packet, 0=exit +#define ARM_ETH_MAC_VLAN_FILTER (0x06) ///< VLAN Filter for received frames; arg15..0: VLAN Tag; arg16: optional ARM_ETH_MAC_VLAN_FILTER_ID_ONLY; 0=disabled (default) + +/*----- Ethernet MAC Configuration -----*/ +#define ARM_ETH_MAC_SPEED_Pos 0 +#define ARM_ETH_MAC_SPEED_Msk (3UL << ARM_ETH_MAC_SPEED_Pos) +#define ARM_ETH_MAC_SPEED_10M (ARM_ETH_SPEED_10M << ARM_ETH_MAC_SPEED_Pos) ///< 10 Mbps link speed +#define ARM_ETH_MAC_SPEED_100M (ARM_ETH_SPEED_100M << ARM_ETH_MAC_SPEED_Pos) ///< 100 Mbps link speed +#define ARM_ETH_MAC_SPEED_1G (ARM_ETH_SPEED_1G << ARM_ETH_MAC_SPEED_Pos) ///< 1 Gpbs link speed +#define ARM_ETH_MAC_DUPLEX_Pos 2 +#define ARM_ETH_MAC_DUPLEX_Msk (1UL << ARM_ETH_MAC_DUPLEX_Pos) +#define ARM_ETH_MAC_DUPLEX_HALF (ARM_ETH_DUPLEX_HALF << ARM_ETH_MAC_DUPLEX_Pos) ///< Half duplex link +#define ARM_ETH_MAC_DUPLEX_FULL (ARM_ETH_DUPLEX_FULL << ARM_ETH_MAC_DUPLEX_Pos) ///< Full duplex link +#define ARM_ETH_MAC_LOOPBACK (1UL << 4) ///< Loop-back test mode +#define ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX (1UL << 5) ///< Receiver Checksum offload +#define ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX (1UL << 6) ///< Transmitter Checksum offload +#define ARM_ETH_MAC_ADDRESS_BROADCAST (1UL << 7) ///< Accept frames with Broadcast address +#define ARM_ETH_MAC_ADDRESS_MULTICAST (1UL << 8) ///< Accept frames with any Multicast address +#define ARM_ETH_MAC_ADDRESS_ALL (1UL << 9) ///< Accept frames with any address (Promiscuous Mode) + +/*----- Ethernet MAC Flush Flags -----*/ +#define ARM_ETH_MAC_FLUSH_RX (1UL << 0) ///< Flush Receive buffer +#define ARM_ETH_MAC_FLUSH_TX (1UL << 1) ///< Flush Transmit buffer + +/*----- Ethernet MAC VLAN Filter Flag -----*/ +#define ARM_ETH_MAC_VLAN_FILTER_ID_ONLY (1UL << 16) ///< Compare only the VLAN Identifier (12-bit) + + +/****** Ethernet MAC Frame Transmit Flags *****/ +#define ARM_ETH_MAC_TX_FRAME_FRAGMENT (1UL << 0) ///< Indicate frame fragment +#define ARM_ETH_MAC_TX_FRAME_EVENT (1UL << 1) ///< Generate event when frame is transmitted +#define ARM_ETH_MAC_TX_FRAME_TIMESTAMP (1UL << 2) ///< Capture frame time stamp + + +/****** Ethernet MAC Timer Control Codes *****/ +#define ARM_ETH_MAC_TIMER_GET_TIME (0x01) ///< Get current time +#define ARM_ETH_MAC_TIMER_SET_TIME (0x02) ///< Set new time +#define ARM_ETH_MAC_TIMER_INC_TIME (0x03) ///< Increment current time +#define ARM_ETH_MAC_TIMER_DEC_TIME (0x04) ///< Decrement current time +#define ARM_ETH_MAC_TIMER_SET_ALARM (0x05) ///< Set alarm time +#define ARM_ETH_MAC_TIMER_ADJUST_CLOCK (0x06) ///< Adjust clock frequency; time->ns: correction factor * 2^31 + + +/** +\brief Ethernet MAC Time +*/ +typedef struct _ARM_ETH_MAC_TIME { + uint32_t ns; ///< Nano seconds + uint32_t sec; ///< Seconds +} ARM_ETH_MAC_TIME; + + +/****** Ethernet MAC Event *****/ +#define ARM_ETH_MAC_EVENT_RX_FRAME (1UL << 0) ///< Frame Received +#define ARM_ETH_MAC_EVENT_TX_FRAME (1UL << 1) ///< Frame Transmitted +#define ARM_ETH_MAC_EVENT_WAKEUP (1UL << 2) ///< Wake-up (on Magic Packet) +#define ARM_ETH_MAC_EVENT_TIMER_ALARM (1UL << 3) ///< Timer Alarm + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_ETH_MAC_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_ETH_MAC_CAPABILITIES ARM_ETH_MAC_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_ETH_MAC_CAPABILITIES +*/ +/** + \fn int32_t ARM_ETH_MAC_Initialize (ARM_ETH_MAC_SignalEvent_t cb_event) + \brief Initialize Ethernet MAC Device. + \param[in] cb_event Pointer to \ref ARM_ETH_MAC_SignalEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_Uninitialize (void) + \brief De-initialize Ethernet MAC Device. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_PowerControl (ARM_POWER_STATE state) + \brief Control Ethernet MAC Device Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_GetMacAddress (ARM_ETH_MAC_ADDR *ptr_addr) + \brief Get Ethernet MAC Address. + \param[in] ptr_addr Pointer to address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_SetMacAddress (const ARM_ETH_MAC_ADDR *ptr_addr) + \brief Set Ethernet MAC Address. + \param[in] ptr_addr Pointer to address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_SetAddressFilter (const ARM_ETH_MAC_ADDR *ptr_addr, + uint32_t num_addr) + \brief Configure Address Filter. + \param[in] ptr_addr Pointer to addresses + \param[in] num_addr Number of addresses to configure + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_SendFrame (const uint8_t *frame, uint32_t len, uint32_t flags) + \brief Send Ethernet frame. + \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 ARM_ETH_MAC_TX_FRAME_...) + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_ReadFrame (uint8_t *frame, uint32_t len) + \brief Read data of received Ethernet frame. + \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 \ref execution_status +*/ +/** + \fn uint32_t ARM_ETH_MAC_GetRxFrameSize (void) + \brief Get size of received Ethernet frame. + \return number of bytes in received frame +*/ +/** + \fn int32_t ARM_ETH_MAC_GetRxFrameTime (ARM_ETH_MAC_TIME *time) + \brief Get time of received Ethernet frame. + \param[in] time Pointer to time structure for data to read into + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_GetTxFrameTime (ARM_ETH_MAC_TIME *time) + \brief Get time of transmitted Ethernet frame. + \param[in] time Pointer to time structure for data to read into + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_Control (uint32_t control, uint32_t arg) + \brief Control Ethernet Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_ControlTimer (uint32_t control, ARM_ETH_MAC_TIME *time) + \brief Control Precision Timer. + \param[in] control Operation + \param[in] time Pointer to time structure + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_PHY_Read (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data) + \brief Read Ethernet PHY Register through Management Interface. + \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 \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_MAC_PHY_Write (uint8_t phy_addr, uint8_t reg_addr, uint16_t data) + \brief Write Ethernet PHY Register through Management Interface. + \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 \ref execution_status +*/ + +/** + \fn void ARM_ETH_MAC_SignalEvent (uint32_t event) + \brief Callback function that signals a Ethernet Event. + \param[in] event event notification mask + \return none +*/ + +typedef void (*ARM_ETH_MAC_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_ETH_MAC_SignalEvent : Signal Ethernet Event. + + +/** +\brief Ethernet MAC Capabilities +*/ +typedef struct _ARM_ETH_MAC_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 \ref ARM_ETH_MAC_EVENT_RX_FRAME generated + uint32_t event_tx_frame : 1; ///< 1 = callback event \ref ARM_ETH_MAC_EVENT_TX_FRAME generated + uint32_t event_wakeup : 1; ///< 1 = wakeup event \ref ARM_ETH_MAC_EVENT_WAKEUP generated + uint32_t precision_timer : 1; ///< 1 = Precision Timer supported + uint32_t reserved : 15; ///< Reserved (must be zero) +} ARM_ETH_MAC_CAPABILITIES; + + +/** +\brief Access structure of the Ethernet MAC Driver +*/ +typedef struct _ARM_DRIVER_ETH_MAC { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_ETH_MAC_GetVersion : Get driver version. + ARM_ETH_MAC_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_ETH_MAC_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_ETH_MAC_SignalEvent_t cb_event); ///< Pointer to \ref ARM_ETH_MAC_Initialize : Initialize Ethernet MAC Device. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_ETH_MAC_Uninitialize : De-initialize Ethernet MAC Device. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_ETH_MAC_PowerControl : Control Ethernet MAC Device Power. + int32_t (*GetMacAddress) ( ARM_ETH_MAC_ADDR *ptr_addr); ///< Pointer to \ref ARM_ETH_MAC_GetMacAddress : Get Ethernet MAC Address. + int32_t (*SetMacAddress) (const ARM_ETH_MAC_ADDR *ptr_addr); ///< Pointer to \ref ARM_ETH_MAC_SetMacAddress : Set Ethernet MAC Address. + int32_t (*SetAddressFilter)(const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr); ///< Pointer to \ref ARM_ETH_MAC_SetAddressFilter : Configure Address Filter. + int32_t (*SendFrame) (const uint8_t *frame, uint32_t len, uint32_t flags); ///< Pointer to \ref ARM_ETH_MAC_SendFrame : Send Ethernet frame. + int32_t (*ReadFrame) ( uint8_t *frame, uint32_t len); ///< Pointer to \ref ARM_ETH_MAC_ReadFrame : Read data of received Ethernet frame. + uint32_t (*GetRxFrameSize) (void); ///< Pointer to \ref ARM_ETH_MAC_GetRxFrameSize : Get size of received Ethernet frame. + int32_t (*GetRxFrameTime) (ARM_ETH_MAC_TIME *time); ///< Pointer to \ref ARM_ETH_MAC_GetRxFrameTime : Get time of received Ethernet frame. + int32_t (*GetTxFrameTime) (ARM_ETH_MAC_TIME *time); ///< Pointer to \ref ARM_ETH_MAC_GetTxFrameTime : Get time of transmitted Ethernet frame. + int32_t (*ControlTimer) (uint32_t control, ARM_ETH_MAC_TIME *time); ///< Pointer to \ref ARM_ETH_MAC_ControlTimer : Control Precision Timer. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_ETH_MAC_Control : Control Ethernet Interface. + int32_t (*PHY_Read) (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Read : Read Ethernet PHY Register through Management Interface. + int32_t (*PHY_Write) (uint8_t phy_addr, uint8_t reg_addr, uint16_t data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Write : Write Ethernet PHY Register through Management Interface. +} const ARM_DRIVER_ETH_MAC; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_ETH_MAC_H_ */ diff --git a/CMSIS/Driver/Include/Driver_ETH_PHY.h b/CMSIS/Driver/Include/Driver_ETH_PHY.h new file mode 100644 index 0000000..95635ed --- /dev/null +++ b/CMSIS/Driver/Include/Driver_ETH_PHY.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.1 + * + * Project: Ethernet PHY (Physical Transceiver) Driver definitions + */ + +/* History: + * Version 2.1 + * ARM_ETH_LINK_INFO made volatile + * Version 2.0 + * changed parameter "mode" in function ARM_ETH_PHY_SetMode + * Changed prefix ARM_DRV -> ARM_DRIVER + * Changed return values of some functions to int32_t + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_ETH_PHY_H_ +#define DRIVER_ETH_PHY_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_ETH.h" + +#define ARM_ETH_PHY_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,1) /* API version */ + + +#define _ARM_Driver_ETH_PHY_(n) Driver_ETH_PHY##n +#define ARM_Driver_ETH_PHY_(n) _ARM_Driver_ETH_PHY_(n) + + +/****** Ethernet PHY Mode *****/ +#define ARM_ETH_PHY_SPEED_Pos 0 +#define ARM_ETH_PHY_SPEED_Msk (3UL << ARM_ETH_PHY_SPEED_Pos) +#define ARM_ETH_PHY_SPEED_10M (ARM_ETH_SPEED_10M << ARM_ETH_PHY_SPEED_Pos) ///< 10 Mbps link speed +#define ARM_ETH_PHY_SPEED_100M (ARM_ETH_SPEED_100M << ARM_ETH_PHY_SPEED_Pos) ///< 100 Mbps link speed +#define ARM_ETH_PHY_SPEED_1G (ARM_ETH_SPEED_1G << ARM_ETH_PHY_SPEED_Pos) ///< 1 Gpbs link speed +#define ARM_ETH_PHY_DUPLEX_Pos 2 +#define ARM_ETH_PHY_DUPLEX_Msk (1UL << ARM_ETH_PHY_DUPLEX_Pos) +#define ARM_ETH_PHY_DUPLEX_HALF (ARM_ETH_DUPLEX_HALF << ARM_ETH_PHY_DUPLEX_Pos) ///< Half duplex link +#define ARM_ETH_PHY_DUPLEX_FULL (ARM_ETH_DUPLEX_FULL << ARM_ETH_PHY_DUPLEX_Pos) ///< Full duplex link +#define ARM_ETH_PHY_AUTO_NEGOTIATE (1UL << 3) ///< Auto Negotiation mode +#define ARM_ETH_PHY_LOOPBACK (1UL << 4) ///< Loop-back test mode +#define ARM_ETH_PHY_ISOLATE (1UL << 5) ///< Isolate PHY from MII/RMII interface + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_ETH_PHY_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn int32_t ARM_ETH_PHY_Initialize (ARM_ETH_PHY_Read_t fn_read, + ARM_ETH_PHY_Write_t fn_write) + \brief Initialize Ethernet PHY Device. + \param[in] fn_read Pointer to \ref ARM_ETH_MAC_PHY_Read + \param[in] fn_write Pointer to \ref ARM_ETH_MAC_PHY_Write + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_PHY_Uninitialize (void) + \brief De-initialize Ethernet PHY Device. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_PHY_PowerControl (ARM_POWER_STATE state) + \brief Control Ethernet PHY Device Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_PHY_SetInterface (uint32_t interface) + \brief Set Ethernet Media Interface. + \param[in] interface Media Interface type + \return \ref execution_status +*/ +/** + \fn int32_t ARM_ETH_PHY_SetMode (uint32_t mode) + \brief Set Ethernet PHY Device Operation mode. + \param[in] mode Operation Mode + \return \ref execution_status +*/ +/** + \fn ARM_ETH_LINK_STATE ARM_ETH_PHY_GetLinkState (void) + \brief Get Ethernet PHY Device Link state. + \return current link status \ref ARM_ETH_LINK_STATE +*/ +/** + \fn ARM_ETH_LINK_INFO ARM_ETH_PHY_GetLinkInfo (void) + \brief Get Ethernet PHY Device Link information. + \return current link parameters \ref ARM_ETH_LINK_INFO +*/ + + +typedef int32_t (*ARM_ETH_PHY_Read_t) (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Read : Read Ethernet PHY Register. +typedef int32_t (*ARM_ETH_PHY_Write_t) (uint8_t phy_addr, uint8_t reg_addr, uint16_t data); ///< Pointer to \ref ARM_ETH_MAC_PHY_Write : Write Ethernet PHY Register. + + +/** +\brief Access structure of the Ethernet PHY Driver +*/ +typedef struct _ARM_DRIVER_ETH_PHY { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_ETH_PHY_GetVersion : Get driver version. + int32_t (*Initialize) (ARM_ETH_PHY_Read_t fn_read, + ARM_ETH_PHY_Write_t fn_write); ///< Pointer to \ref ARM_ETH_PHY_Initialize : Initialize PHY Device. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_ETH_PHY_Uninitialize : De-initialize PHY Device. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_ETH_PHY_PowerControl : Control PHY Device Power. + int32_t (*SetInterface) (uint32_t interface); ///< Pointer to \ref ARM_ETH_PHY_SetInterface : Set Ethernet Media Interface. + int32_t (*SetMode) (uint32_t mode); ///< Pointer to \ref ARM_ETH_PHY_SetMode : Set Ethernet PHY Device Operation mode. + ARM_ETH_LINK_STATE (*GetLinkState) (void); ///< Pointer to \ref ARM_ETH_PHY_GetLinkState : Get Ethernet PHY Device Link state. + ARM_ETH_LINK_INFO (*GetLinkInfo) (void); ///< Pointer to \ref ARM_ETH_PHY_GetLinkInfo : Get Ethernet PHY Device Link information. +} const ARM_DRIVER_ETH_PHY; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_ETH_PHY_H_ */ diff --git a/CMSIS/Driver/Include/Driver_Flash.h b/CMSIS/Driver/Include/Driver_Flash.h new file mode 100644 index 0000000..7053be2 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_Flash.h @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2013-2018 ARM 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. + * + * $Date: 19. Apr 2018 + * $Revision: V2.2 + * + * Project: Flash Driver definitions + */ + +/* History: + * Version 2.2 + * Padding bytes added to ARM_FLASH_INFO + * Version 2.1 + * ARM_FLASH_STATUS made volatile + * Version 2.0 + * Renamed driver NOR -> Flash (more generic) + * Non-blocking operation + * Added Events, Status and Capabilities + * Linked Flash information (GetInfo) + * Version 1.11 + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_FLASH_H_ +#define DRIVER_FLASH_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_FLASH_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,2) /* API version */ + + +#define _ARM_Driver_Flash_(n) Driver_Flash##n +#define ARM_Driver_Flash_(n) _ARM_Driver_Flash_(n) + + +#define ARM_FLASH_SECTOR_INFO(addr,size) { (addr), (addr)+(size)-1 } + +/** +\brief Flash Sector information +*/ +typedef struct _ARM_FLASH_SECTOR { + uint32_t start; ///< Sector Start address + uint32_t end; ///< Sector End address (start+size-1) +} const ARM_FLASH_SECTOR; + +/** +\brief Flash information +*/ +typedef struct _ARM_FLASH_INFO { + ARM_FLASH_SECTOR *sector_info; ///< Sector layout information (NULL=Uniform sectors) + uint32_t sector_count; ///< Number of sectors + uint32_t sector_size; ///< Uniform sector size in bytes (0=sector_info used) + uint32_t page_size; ///< Optimal programming page size in bytes + uint32_t program_unit; ///< Smallest programmable unit in bytes + uint8_t erased_value; ///< Contents of erased memory (usually 0xFF) + uint8_t reserved[3]; ///< Reserved (must be zero) +} const ARM_FLASH_INFO; + + +/** +\brief Flash Status +*/ +typedef volatile struct _ARM_FLASH_STATUS { + uint32_t busy : 1; ///< Flash busy flag + uint32_t error : 1; ///< Read/Program/Erase error flag (cleared on start of next operation) + uint32_t reserved : 30; +} ARM_FLASH_STATUS; + + +/****** Flash Event *****/ +#define ARM_FLASH_EVENT_READY (1UL << 0) ///< Flash Ready +#define ARM_FLASH_EVENT_ERROR (1UL << 1) ///< Read/Program/Erase Error + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_Flash_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_FLASH_CAPABILITIES ARM_Flash_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_FLASH_CAPABILITIES +*/ +/** + \fn int32_t ARM_Flash_Initialize (ARM_Flash_SignalEvent_t cb_event) + \brief Initialize the Flash Interface. + \param[in] cb_event Pointer to \ref ARM_Flash_SignalEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_Uninitialize (void) + \brief De-initialize the Flash Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_PowerControl (ARM_POWER_STATE state) + \brief Control the Flash interface power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_ReadData (uint32_t addr, void *data, uint32_t cnt) + \brief Read data from Flash. + \param[in] addr Data address. + \param[out] data Pointer to a buffer storing the data read from Flash. + \param[in] cnt Number of data items to read. + \return number of data items read or \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_ProgramData (uint32_t addr, const void *data, uint32_t cnt) + \brief Program data to Flash. + \param[in] addr Data address. + \param[in] data Pointer to a buffer containing the data to be programmed to Flash. + \param[in] cnt Number of data items to program. + \return number of data items programmed or \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_EraseSector (uint32_t addr) + \brief Erase Flash Sector. + \param[in] addr Sector address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_Flash_EraseChip (void) + \brief Erase complete Flash. + Optional function for faster full chip erase. + \return \ref execution_status +*/ +/** + \fn ARM_FLASH_STATUS ARM_Flash_GetStatus (void) + \brief Get Flash status. + \return Flash status \ref ARM_FLASH_STATUS +*/ +/** + \fn ARM_FLASH_INFO * ARM_Flash_GetInfo (void) + \brief Get Flash information. + \return Pointer to Flash information \ref ARM_FLASH_INFO +*/ + +/** + \fn void ARM_Flash_SignalEvent (uint32_t event) + \brief Signal Flash event. + \param[in] event Event notification mask + \return none +*/ + +typedef void (*ARM_Flash_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_Flash_SignalEvent : Signal Flash Event. + + +/** +\brief Flash Driver Capabilities. +*/ +typedef struct _ARM_FLASH_CAPABILITIES { + uint32_t event_ready : 1; ///< Signal Flash Ready event + uint32_t data_width : 2; ///< Data width: 0=8-bit, 1=16-bit, 2=32-bit + uint32_t erase_chip : 1; ///< Supports EraseChip operation + uint32_t reserved : 28; ///< Reserved (must be zero) +} ARM_FLASH_CAPABILITIES; + + +/** +\brief Access structure of the Flash Driver +*/ +typedef struct _ARM_DRIVER_FLASH { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_Flash_GetVersion : Get driver version. + ARM_FLASH_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_Flash_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_Flash_SignalEvent_t cb_event); ///< Pointer to \ref ARM_Flash_Initialize : Initialize Flash Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_Flash_Uninitialize : De-initialize Flash Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_Flash_PowerControl : Control Flash Interface Power. + int32_t (*ReadData) (uint32_t addr, void *data, uint32_t cnt); ///< Pointer to \ref ARM_Flash_ReadData : Read data from Flash. + int32_t (*ProgramData) (uint32_t addr, const void *data, uint32_t cnt); ///< Pointer to \ref ARM_Flash_ProgramData : Program data to Flash. + int32_t (*EraseSector) (uint32_t addr); ///< Pointer to \ref ARM_Flash_EraseSector : Erase Flash Sector. + int32_t (*EraseChip) (void); ///< Pointer to \ref ARM_Flash_EraseChip : Erase complete Flash. + ARM_FLASH_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_Flash_GetStatus : Get Flash status. + ARM_FLASH_INFO * (*GetInfo) (void); ///< Pointer to \ref ARM_Flash_GetInfo : Get Flash information. +} const ARM_DRIVER_FLASH; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_FLASH_H_ */ diff --git a/CMSIS/Driver/Include/Driver_GPIO.h b/CMSIS/Driver/Include/Driver_GPIO.h new file mode 100644 index 0000000..e24f03b --- /dev/null +++ b/CMSIS/Driver/Include/Driver_GPIO.h @@ -0,0 +1,82 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef DRIVER_GPIO_H_ +#define DRIVER_GPIO_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_GPIO_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,0) /* API version */ + +/*----- GPIO Logic Value -----*/ +#define ARM_GPIO_LOGIC_ZERO 0 +#define ARM_GPIO_LOGIC_ONE 1 + +/*----- GPIO Interrupt Type -----*/ +#define ARM_GPIO_INTERRUPT_NONE 0x00U /* Disable Interrupt */ +#define ARM_GPIO_INTERRUPT_RISING_EDGE 0x01U /* Interrupt on Rising Edge */ +#define ARM_GPIO_INTERRUPT_FALLING_EDGE 0x02U /* Interrupt on Falling Edge */ +#define ARM_GPIO_INTERRUPT_RISING_FALLING_EDGE 0x03U /* Interrupt on Rising or Falling edge */ +#define ARM_GPIO_INTERRUPT_LOGIC_ONE 0x04U /* Interrupt on Logic Level One */ +#define ARM_GPIO_INTERRUPT_LOGIC_ZERO 0x05U /* Interrupt on Logic Level Zero */ +#define ARM_GPIO_INTERRUPT_MAX_CONFIG_PARA 0x06U /* Internal use and not used by user */ + +/*----- GPIO Control Codes: Interrupt -----*/ +#define ARM_GPIO_CONTROL_INTERRUPT (0x01U) +#define ARM_GPIO_INTERRUPT_DISABLE (0x00U) +#define ARM_GPIO_INTERRUPT_ENABLE (0x01U) + +typedef void (*ARM_GPIO_SignalEvent_t) (uint32_t pin); ///< Pointer to \ref ARM_GPIO_SignalEvent : Signal GPIO Event. + +/** +\brief GPIO Driver Capabilities. +*/ +typedef struct _ARM_GPIO_CAPABILITIES { + uint32_t irq : 1; ///< supports IRQ + uint32_t reserved : 31; ///< Reserved (must be zero) +} ARM_GPIO_CAPABILITIES; + +/** +\brief Access structure of the GPIO Driver. +*/ +typedef struct _ARM_DRIVER_GPIO { + ARM_DRIVER_VERSION (*GetVersion) (void); + ARM_GPIO_CAPABILITIES (*GetCapabilities)(void); + int32_t (*Initialize) (void); + int32_t (*Uninitialize) (void); + int32_t (*PowerControl) (ARM_POWER_STATE state); + /// Init Pin As Output + int32_t (*InitPinAsOutput)(uint32_t pin, uint32_t output_logic); + /// Init Pin as Input with or without interrupt enabled , with or without callback if interrupt is requested + int32_t (*InitPinAsInput)(uint32_t pin, uint32_t irq_type, ARM_GPIO_SignalEvent_t cb_event); + /// Write pin with ARM_GPIO_LOGIC_[ONE|ZERO] + int32_t (*PinWrite) (uint32_t pin, uint32_t logic_value); + /// Toggle specified Pin + int32_t (*PinToggle) (uint32_t pin); + /// Read Logic value from pin. false stands for logic zero, true stands for logic one. + bool (*PinRead) (uint32_t pin); + /// Write selected pins with logic one or zero. Example, pin0 and pin 4, ored_pins = (0x01U << 0U) | (0x01 << 4U) + int32_t (*PortWrite) (uint32_t ored_pins, uint32_t logic_value); + /// Toggle selected pins. Example, pin0 and pin 4, ored_pins = (0x01U << 0U) | (0x01 << 4U) + int32_t (*PortToggle) (uint32_t ored_pins); + /// Read all pins status for this GPIO interface. use (read_value & (0x01U << 4)) to decide whether pin4 is logic one or logic zero + uint32_t (*PortRead)(void); + /// Configuare the pin with field ARM_GPIO_CONTROL_[INTERRUPT] with value filled into arg. values are defined following the ARM_GPIO_CONTROL_XXX. + int32_t (*Control)(uint32_t pin, uint32_t control, uint32_t arg); +} const ARM_DRIVER_GPIO; + + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_GPIO_H_ */ diff --git a/CMSIS/Driver/Include/Driver_I2C.h b/CMSIS/Driver/Include/Driver_I2C.h new file mode 100644 index 0000000..b9ba9d0 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_I2C.h @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.3 + * + * Project: I2C (Inter-Integrated Circuit) Driver definitions + */ + +/* History: + * Version 2.3 + * ARM_I2C_STATUS made volatile + * Version 2.2 + * Removed function ARM_I2C_MasterTransfer in order to simplify drivers + * and added back parameter "xfer_pending" to functions + * ARM_I2C_MasterTransmit and ARM_I2C_MasterReceive + * Version 2.1 + * Added function ARM_I2C_MasterTransfer and removed parameter "xfer_pending" + * from functions ARM_I2C_MasterTransmit and ARM_I2C_MasterReceive + * Added function ARM_I2C_GetDataCount + * Removed flag "address_nack" from ARM_I2C_STATUS + * Replaced events ARM_I2C_EVENT_MASTER_DONE and ARM_I2C_EVENT_SLAVE_DONE + * with event ARM_I2C_EVENT_TRANSFER_DONE + * Added event ARM_I2C_EVENT_TRANSFER_INCOMPLETE + * Removed parameter "arg" from function ARM_I2C_SignalEvent + * Version 2.0 + * New simplified driver: + * complexity moved to upper layer (especially data handling) + * more unified API for different communication interfaces + * Added: + * Slave Mode + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_I2C_H_ +#define DRIVER_I2C_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_I2C_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,3) /* API version */ + + +/****** I2C Control Codes *****/ + +#define ARM_I2C_OWN_ADDRESS (0x01) ///< Set Own Slave Address; arg = address +#define ARM_I2C_BUS_SPEED (0x02) ///< Set Bus Speed; arg = speed +#define ARM_I2C_BUS_CLEAR (0x03) ///< Execute Bus clear: send nine clock pulses +#define ARM_I2C_ABORT_TRANSFER (0x04) ///< Abort Master/Slave Transmit/Receive + +/*----- I2C Bus Speed -----*/ +#define ARM_I2C_BUS_SPEED_STANDARD (0x01) ///< Standard Speed (100kHz) +#define ARM_I2C_BUS_SPEED_FAST (0x02) ///< Fast Speed (400kHz) +#define ARM_I2C_BUS_SPEED_FAST_PLUS (0x03) ///< Fast+ Speed ( 1MHz) +#define ARM_I2C_BUS_SPEED_HIGH (0x04) ///< High Speed (3.4MHz) + + +/****** I2C Address Flags *****/ + +#define ARM_I2C_ADDRESS_10BIT (0x0400) ///< 10-bit address flag +#define ARM_I2C_ADDRESS_GC (0x8000) ///< General Call flag + + +/** +\brief I2C Status +*/ +typedef volatile struct _ARM_I2C_STATUS { + uint32_t busy : 1; ///< Busy flag + uint32_t mode : 1; ///< Mode: 0=Slave, 1=Master + uint32_t direction : 1; ///< Direction: 0=Transmitter, 1=Receiver + uint32_t general_call : 1; ///< General Call indication (cleared on start of next Slave operation) + uint32_t arbitration_lost : 1; ///< Master lost arbitration (cleared on start of next Master operation) + uint32_t bus_error : 1; ///< Bus error detected (cleared on start of next Master/Slave operation) + uint32_t reserved : 26; +} ARM_I2C_STATUS; + + +/****** I2C Event *****/ +#define ARM_I2C_EVENT_TRANSFER_DONE (1UL << 0) ///< Master/Slave Transmit/Receive finished +#define ARM_I2C_EVENT_TRANSFER_INCOMPLETE (1UL << 1) ///< Master/Slave Transmit/Receive incomplete transfer +#define ARM_I2C_EVENT_SLAVE_TRANSMIT (1UL << 2) ///< Addressed as Slave Transmitter but transmit operation is not set. +#define ARM_I2C_EVENT_SLAVE_RECEIVE (1UL << 3) ///< Addressed as Slave Receiver but receive operation is not set. +#define ARM_I2C_EVENT_ADDRESS_NACK (1UL << 4) ///< Address not acknowledged from Slave +#define ARM_I2C_EVENT_GENERAL_CALL (1UL << 5) ///< Slave addressed with general call address +#define ARM_I2C_EVENT_ARBITRATION_LOST (1UL << 6) ///< Master lost arbitration +#define ARM_I2C_EVENT_BUS_ERROR (1UL << 7) ///< Bus error detected (START/STOP at illegal position) +#define ARM_I2C_EVENT_BUS_CLEAR (1UL << 8) ///< Bus clear finished + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_I2C_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_I2C_CAPABILITIES ARM_I2C_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_I2C_CAPABILITIES + + \fn int32_t ARM_I2C_Initialize (ARM_I2C_SignalEvent_t cb_event) + \brief Initialize I2C Interface. + \param[in] cb_event Pointer to \ref ARM_I2C_SignalEvent + \return \ref execution_status + + \fn int32_t ARM_I2C_Uninitialize (void) + \brief De-initialize I2C Interface. + \return \ref execution_status + + \fn int32_t ARM_I2C_PowerControl (ARM_POWER_STATE state) + \brief Control I2C Interface Power. + \param[in] state Power state + \return \ref execution_status + + \fn int32_t ARM_I2C_MasterTransmit (uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending) + \brief Start transmitting data as I2C Master. + \param[in] addr Slave address (7-bit or 10-bit) + \param[in] data Pointer to buffer with data to transmit to I2C Slave + \param[in] num Number of data bytes to transmit + \param[in] xfer_pending Transfer operation is pending - Stop condition will not be generated + \return \ref execution_status + + \fn int32_t ARM_I2C_MasterReceive (uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending) + \brief Start receiving data as I2C Master. + \param[in] addr Slave address (7-bit or 10-bit) + \param[out] data Pointer to buffer for data to receive from I2C Slave + \param[in] num Number of data bytes to receive + \param[in] xfer_pending Transfer operation is pending - Stop condition will not be generated + \return \ref execution_status + + \fn int32_t ARM_I2C_SlaveTransmit (const uint8_t *data, uint32_t num) + \brief Start transmitting data as I2C Slave. + \param[in] data Pointer to buffer with data to transmit to I2C Master + \param[in] num Number of data bytes to transmit + \return \ref execution_status + + \fn int32_t ARM_I2C_SlaveReceive (uint8_t *data, uint32_t num) + \brief Start receiving data as I2C Slave. + \param[out] data Pointer to buffer for data to receive from I2C Master + \param[in] num Number of data bytes to receive + \return \ref execution_status + + \fn int32_t ARM_I2C_GetDataCount (void) + \brief Get transferred data count. + \return number of data bytes transferred; -1 when Slave is not addressed by Master + + \fn int32_t ARM_I2C_Control (uint32_t control, uint32_t arg) + \brief Control I2C Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return \ref execution_status + + \fn ARM_I2C_STATUS ARM_I2C_GetStatus (void) + \brief Get I2C status. + \return I2C status \ref ARM_I2C_STATUS + + \fn void ARM_I2C_SignalEvent (uint32_t event) + \brief Signal I2C Events. + \param[in] event \ref I2C_events notification mask +*/ + +typedef void (*ARM_I2C_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_I2C_SignalEvent : Signal I2C Event. + + +/** +\brief I2C Driver Capabilities. +*/ +typedef struct _ARM_I2C_CAPABILITIES { + uint32_t address_10_bit : 1; ///< supports 10-bit addressing + uint32_t reserved : 31; ///< Reserved (must be zero) +} ARM_I2C_CAPABILITIES; + + +/** +\brief Access structure of the I2C Driver. +*/ +typedef struct _ARM_DRIVER_I2C { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_I2C_GetVersion : Get driver version. + ARM_I2C_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_I2C_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_I2C_SignalEvent_t cb_event); ///< Pointer to \ref ARM_I2C_Initialize : Initialize I2C Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_I2C_Uninitialize : De-initialize I2C Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_I2C_PowerControl : Control I2C Interface Power. + int32_t (*MasterTransmit) (uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending); ///< Pointer to \ref ARM_I2C_MasterTransmit : Start transmitting data as I2C Master. + int32_t (*MasterReceive) (uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending); ///< Pointer to \ref ARM_I2C_MasterReceive : Start receiving data as I2C Master. + int32_t (*SlaveTransmit) ( const uint8_t *data, uint32_t num); ///< Pointer to \ref ARM_I2C_SlaveTransmit : Start transmitting data as I2C Slave. + int32_t (*SlaveReceive) ( uint8_t *data, uint32_t num); ///< Pointer to \ref ARM_I2C_SlaveReceive : Start receiving data as I2C Slave. + int32_t (*GetDataCount) (void); ///< Pointer to \ref ARM_I2C_GetDataCount : Get transferred data count. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_I2C_Control : Control I2C Interface. + ARM_I2C_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_I2C_GetStatus : Get I2C status. +} const ARM_DRIVER_I2C; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_I2C_H_ */ diff --git a/CMSIS/Driver/Include/Driver_MCI.h b/CMSIS/Driver/Include/Driver_MCI.h new file mode 100644 index 0000000..59caa11 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_MCI.h @@ -0,0 +1,360 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.3 + * + * Project: MCI (Memory Card Interface) Driver definitions + */ + +/* History: + * Version 2.3 + * ARM_MCI_STATUS made volatile + * Version 2.2 + * Added timeout and error flags to ARM_MCI_STATUS + * Added support for controlling optional RST_n pin (eMMC) + * Removed explicit Clock Control (ARM_MCI_CONTROL_CLOCK) + * Removed event ARM_MCI_EVENT_BOOT_ACK_TIMEOUT + * Version 2.1 + * Decoupled SPI mode from MCI driver + * Replaced function ARM_MCI_CardSwitchRead with ARM_MCI_ReadCD and ARM_MCI_ReadWP + * Version 2.0 + * Added support for: + * SD UHS-I (Ultra High Speed) + * SD I/O Interrupt + * Read Wait (SD I/O) + * Suspend/Resume (SD I/O) + * MMC Interrupt + * MMC Boot + * Stream Data transfer (MMC) + * VCCQ Power Supply Control (eMMC) + * Command Completion Signal (CCS) for CE-ATA + * Added ARM_MCI_Control function + * Added ARM_MCI_GetStatus function + * Removed ARM_MCI_BusMode, ARM_MCI_BusDataWidth, ARM_MCI_BusSingaling functions + * (replaced by ARM_MCI_Control) + * Changed ARM_MCI_CardPower function (voltage parameter) + * Changed ARM_MCI_SendCommnad function (flags parameter) + * Changed ARM_MCI_SetupTransfer function (mode parameter) + * Removed ARM_MCI_ReadTransfer and ARM_MCI_WriteTransfer functions + * Changed prefix ARM_DRV -> ARM_DRIVER + * Changed return values of some functions to int32_t + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_MCI_H_ +#define DRIVER_MCI_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_MCI_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,3) /* API version */ + + +/****** MCI Send Command Flags *****/ +#define ARM_MCI_RESPONSE_Pos 0 +#define ARM_MCI_RESPONSE_Msk (3UL << ARM_MCI_RESPONSE_Pos) +#define ARM_MCI_RESPONSE_NONE (0UL << ARM_MCI_RESPONSE_Pos) ///< No response expected (default) +#define ARM_MCI_RESPONSE_SHORT (1UL << ARM_MCI_RESPONSE_Pos) ///< Short response (48-bit) +#define ARM_MCI_RESPONSE_SHORT_BUSY (2UL << ARM_MCI_RESPONSE_Pos) ///< Short response with busy signal (48-bit) +#define ARM_MCI_RESPONSE_LONG (3UL << ARM_MCI_RESPONSE_Pos) ///< Long response (136-bit) + +#define ARM_MCI_RESPONSE_INDEX (1UL << 2) ///< Check command index in response +#define ARM_MCI_RESPONSE_CRC (1UL << 3) ///< Check CRC in response + +#define ARM_MCI_WAIT_BUSY (1UL << 4) ///< Wait until busy before sending the command + +#define ARM_MCI_TRANSFER_DATA (1UL << 5) ///< Activate Data transfer + +#define ARM_MCI_CARD_INITIALIZE (1UL << 6) ///< Execute Memory Card initialization sequence + +#define ARM_MCI_INTERRUPT_COMMAND (1UL << 7) ///< Send Interrupt command (CMD40 - MMC only) +#define ARM_MCI_INTERRUPT_RESPONSE (1UL << 8) ///< Send Interrupt response (CMD40 - MMC only) + +#define ARM_MCI_BOOT_OPERATION (1UL << 9) ///< Execute Boot operation (MMC only) +#define ARM_MCI_BOOT_ALTERNATIVE (1UL << 10) ///< Execute Alternative Boot operation (MMC only) +#define ARM_MCI_BOOT_ACK (1UL << 11) ///< Expect Boot Acknowledge (MMC only) + +#define ARM_MCI_CCSD (1UL << 12) ///< Send Command Completion Signal Disable (CCSD) for CE-ATA device +#define ARM_MCI_CCS (1UL << 13) ///< Expect Command Completion Signal (CCS) for CE-ATA device + + +/****** MCI Setup Transfer Mode *****/ +#define ARM_MCI_TRANSFER_READ (0UL << 0) ///< Data Read Transfer (from MCI) +#define ARM_MCI_TRANSFER_WRITE (1UL << 0) ///< Data Write Transfer (to MCI) +#define ARM_MCI_TRANSFER_BLOCK (0UL << 1) ///< Block Data transfer (default) +#define ARM_MCI_TRANSFER_STREAM (1UL << 1) ///< Stream Data transfer (MMC only) + + +/****** MCI Control Codes *****/ +#define ARM_MCI_BUS_SPEED (0x01) ///< Set Bus Speed; arg = requested speed in bits/s; returns configured speed in bits/s +#define ARM_MCI_BUS_SPEED_MODE (0x02) ///< Set Bus Speed Mode as specified with arg +#define ARM_MCI_BUS_CMD_MODE (0x03) ///< Set CMD Line Mode as specified with arg +#define ARM_MCI_BUS_DATA_WIDTH (0x04) ///< Set Bus Data Width as specified with arg +#define ARM_MCI_DRIVER_STRENGTH (0x05) ///< Set SD UHS-I Driver Strength as specified with arg +#define ARM_MCI_CONTROL_RESET (0x06) ///< Control optional RST_n Pin (eMMC); arg: 0=inactive, 1=active +#define ARM_MCI_CONTROL_CLOCK_IDLE (0x07) ///< Control Clock generation on CLK Pin when idle; arg: 0=disabled, 1=enabled +#define ARM_MCI_UHS_TUNING_OPERATION (0x08) ///< Sampling clock Tuning operation (SD UHS-I); arg: 0=reset, 1=execute +#define ARM_MCI_UHS_TUNING_RESULT (0x09) ///< Sampling clock Tuning result (SD UHS-I); returns: 0=done, 1=in progress, -1=error +#define ARM_MCI_DATA_TIMEOUT (0x0A) ///< Set Data timeout; arg = timeout in bus cycles +#define ARM_MCI_CSS_TIMEOUT (0x0B) ///< Set Command Completion Signal (CCS) timeout; arg = timeout in bus cycles +#define ARM_MCI_MONITOR_SDIO_INTERRUPT (0x0C) ///< Monitor SD I/O interrupt: arg: 0=disabled, 1=enabled +#define ARM_MCI_CONTROL_READ_WAIT (0x0D) ///< Control Read/Wait for SD I/O; arg: 0=disabled, 1=enabled +#define ARM_MCI_SUSPEND_TRANSFER (0x0E) ///< Suspend Data transfer (SD I/O); returns number of remaining bytes to transfer +#define ARM_MCI_RESUME_TRANSFER (0x0F) ///< Resume Data transfer (SD I/O) + +/*----- MCI Bus Speed Mode -----*/ +#define ARM_MCI_BUS_DEFAULT_SPEED (0x00) ///< SD/MMC: Default Speed mode up to 25/26MHz +#define ARM_MCI_BUS_HIGH_SPEED (0x01) ///< SD/MMC: High Speed mode up to 50/52MHz +#define ARM_MCI_BUS_UHS_SDR12 (0x02) ///< SD: SDR12 (Single Data Rate) up to 25MHz, 12.5MB/s: UHS-I (Ultra High Speed) 1.8V signaling +#define ARM_MCI_BUS_UHS_SDR25 (0x03) ///< SD: SDR25 (Single Data Rate) up to 50MHz, 25 MB/s: UHS-I (Ultra High Speed) 1.8V signaling +#define ARM_MCI_BUS_UHS_SDR50 (0x04) ///< SD: SDR50 (Single Data Rate) up to 100MHz, 50 MB/s: UHS-I (Ultra High Speed) 1.8V signaling +#define ARM_MCI_BUS_UHS_SDR104 (0x05) ///< SD: SDR104 (Single Data Rate) up to 208MHz, 104 MB/s: UHS-I (Ultra High Speed) 1.8V signaling +#define ARM_MCI_BUS_UHS_DDR50 (0x06) ///< SD: DDR50 (Dual Data Rate) up to 50MHz, 50 MB/s: UHS-I (Ultra High Speed) 1.8V signaling + +/*----- MCI CMD Line Mode -----*/ +#define ARM_MCI_BUS_CMD_PUSH_PULL (0x00) ///< Push-Pull CMD line (default) +#define ARM_MCI_BUS_CMD_OPEN_DRAIN (0x01) ///< Open Drain CMD line (MMC only) + +/*----- MCI Bus Data Width -----*/ +#define ARM_MCI_BUS_DATA_WIDTH_1 (0x00) ///< Bus data width: 1 bit (default) +#define ARM_MCI_BUS_DATA_WIDTH_4 (0x01) ///< Bus data width: 4 bits +#define ARM_MCI_BUS_DATA_WIDTH_8 (0x02) ///< Bus data width: 8 bits +#define ARM_MCI_BUS_DATA_WIDTH_4_DDR (0x03) ///< Bus data width: 4 bits, DDR (Dual Data Rate) - MMC only +#define ARM_MCI_BUS_DATA_WIDTH_8_DDR (0x04) ///< Bus data width: 8 bits, DDR (Dual Data Rate) - MMC only + +/*----- MCI Driver Strength -----*/ +#define ARM_MCI_DRIVER_TYPE_A (0x01) ///< SD UHS-I Driver Type A +#define ARM_MCI_DRIVER_TYPE_B (0x00) ///< SD UHS-I Driver Type B (default) +#define ARM_MCI_DRIVER_TYPE_C (0x02) ///< SD UHS-I Driver Type C +#define ARM_MCI_DRIVER_TYPE_D (0x03) ///< SD UHS-I Driver Type D + + +/****** MCI Card Power *****/ +#define ARM_MCI_POWER_VDD_Pos 0 +#define ARM_MCI_POWER_VDD_Msk (0x0FUL << ARM_MCI_POWER_VDD_Pos) +#define ARM_MCI_POWER_VDD_OFF (0x01UL << ARM_MCI_POWER_VDD_Pos) ///< VDD (VCC) turned off +#define ARM_MCI_POWER_VDD_3V3 (0x02UL << ARM_MCI_POWER_VDD_Pos) ///< VDD (VCC) = 3.3V +#define ARM_MCI_POWER_VDD_1V8 (0x03UL << ARM_MCI_POWER_VDD_Pos) ///< VDD (VCC) = 1.8V +#define ARM_MCI_POWER_VCCQ_Pos 4 +#define ARM_MCI_POWER_VCCQ_Msk (0x0FUL << ARM_MCI_POWER_VCCQ_Pos) +#define ARM_MCI_POWER_VCCQ_OFF (0x01UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ turned off +#define ARM_MCI_POWER_VCCQ_3V3 (0x02UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ = 3.3V +#define ARM_MCI_POWER_VCCQ_1V8 (0x03UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ = 1.8V +#define ARM_MCI_POWER_VCCQ_1V2 (0x04UL << ARM_MCI_POWER_VCCQ_Pos) ///< eMMC VCCQ = 1.2V + + +/** +\brief MCI Status +*/ +typedef volatile struct _ARM_MCI_STATUS { + uint32_t command_active : 1; ///< Command active flag + uint32_t command_timeout : 1; ///< Command timeout flag (cleared on start of next command) + uint32_t command_error : 1; ///< Command error flag (cleared on start of next command) + uint32_t transfer_active : 1; ///< Transfer active flag + uint32_t transfer_timeout : 1; ///< Transfer timeout flag (cleared on start of next command) + uint32_t transfer_error : 1; ///< Transfer error flag (cleared on start of next command) + uint32_t sdio_interrupt : 1; ///< SD I/O Interrupt flag (cleared on start of monitoring) + uint32_t ccs : 1; ///< CCS flag (cleared on start of next command) + uint32_t reserved : 24; +} ARM_MCI_STATUS; + + +/****** MCI Card Event *****/ +#define ARM_MCI_EVENT_CARD_INSERTED (1UL << 0) ///< Memory Card inserted +#define ARM_MCI_EVENT_CARD_REMOVED (1UL << 1) ///< Memory Card removed +#define ARM_MCI_EVENT_COMMAND_COMPLETE (1UL << 2) ///< Command completed +#define ARM_MCI_EVENT_COMMAND_TIMEOUT (1UL << 3) ///< Command timeout +#define ARM_MCI_EVENT_COMMAND_ERROR (1UL << 4) ///< Command response error (CRC error or invalid response) +#define ARM_MCI_EVENT_TRANSFER_COMPLETE (1UL << 5) ///< Data transfer completed +#define ARM_MCI_EVENT_TRANSFER_TIMEOUT (1UL << 6) ///< Data transfer timeout +#define ARM_MCI_EVENT_TRANSFER_ERROR (1UL << 7) ///< Data transfer CRC failed +#define ARM_MCI_EVENT_SDIO_INTERRUPT (1UL << 8) ///< SD I/O Interrupt +#define ARM_MCI_EVENT_CCS (1UL << 9) ///< Command Completion Signal (CCS) +#define ARM_MCI_EVENT_CCS_TIMEOUT (1UL << 10) ///< Command Completion Signal (CCS) Timeout + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_MCI_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_MCI_CAPABILITIES ARM_MCI_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_MCI_CAPABILITIES +*/ +/** + \fn int32_t ARM_MCI_Initialize (ARM_MCI_SignalEvent_t cb_event) + \brief Initialize the Memory Card Interface + \param[in] cb_event Pointer to \ref ARM_MCI_SignalEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_Uninitialize (void) + \brief De-initialize Memory Card Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_PowerControl (ARM_POWER_STATE state) + \brief Control Memory Card Interface Power. + \param[in] state Power state \ref ARM_POWER_STATE + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_CardPower (uint32_t voltage) + \brief Set Memory Card Power supply voltage. + \param[in] voltage Memory Card Power supply voltage + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_ReadCD (void) + \brief Read Card Detect (CD) state. + \return 1:card detected, 0:card not detected, or error +*/ +/** + \fn int32_t ARM_MCI_ReadWP (void) + \brief Read Write Protect (WP) state. + \return 1:write protected, 0:not write protected, or error +*/ +/** + \fn int32_t ARM_MCI_SendCommand (uint32_t cmd, + uint32_t arg, + uint32_t flags, + uint32_t *response) + \brief Send Command to card and get the response. + \param[in] cmd Memory Card command + \param[in] arg Command argument + \param[in] flags Command flags + \param[out] response Pointer to buffer for response + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_SetupTransfer (uint8_t *data, + uint32_t block_count, + uint32_t block_size, + uint32_t mode) + \brief Setup read or write transfer operation. + \param[in,out] data Pointer to data block(s) to be written or read + \param[in] block_count Number of blocks + \param[in] block_size Size of a block in bytes + \param[in] mode Transfer mode + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_AbortTransfer (void) + \brief Abort current read/write data transfer. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_MCI_Control (uint32_t control, uint32_t arg) + \brief Control MCI Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return \ref execution_status +*/ +/** + \fn ARM_MCI_STATUS ARM_MCI_GetStatus (void) + \brief Get MCI status. + \return MCI status \ref ARM_MCI_STATUS +*/ + +/** + \fn void ARM_MCI_SignalEvent (uint32_t event) + \brief Callback function that signals a MCI Card Event. + \param[in] event \ref mci_event_gr + \return none +*/ + +typedef void (*ARM_MCI_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_MCI_SignalEvent : Signal MCI Card Event. + + +/** +\brief MCI Driver Capabilities. +*/ +typedef struct _ARM_MCI_CAPABILITIES { + uint32_t cd_state : 1; ///< Card Detect State available + uint32_t cd_event : 1; ///< Signal Card Detect change event + uint32_t wp_state : 1; ///< Write Protect State available + uint32_t vdd : 1; ///< Supports VDD Card Power Supply Control + uint32_t vdd_1v8 : 1; ///< Supports 1.8 VDD Card Power Supply + uint32_t vccq : 1; ///< Supports VCCQ Card Power Supply Control (eMMC) + uint32_t vccq_1v8 : 1; ///< Supports 1.8 VCCQ Card Power Supply (eMMC) + uint32_t vccq_1v2 : 1; ///< Supports 1.2 VCCQ Card Power Supply (eMMC) + uint32_t data_width_4 : 1; ///< Supports 4-bit data + uint32_t data_width_8 : 1; ///< Supports 8-bit data + uint32_t data_width_4_ddr : 1; ///< Supports 4-bit data, DDR (Dual Data Rate) - MMC only + uint32_t data_width_8_ddr : 1; ///< Supports 8-bit data, DDR (Dual Data Rate) - MMC only + uint32_t high_speed : 1; ///< Supports SD/MMC High Speed Mode + uint32_t uhs_signaling : 1; ///< Supports SD UHS-I (Ultra High Speed) 1.8V signaling + uint32_t uhs_tuning : 1; ///< Supports SD UHS-I tuning + uint32_t uhs_sdr50 : 1; ///< Supports SD UHS-I SDR50 (Single Data Rate) up to 50MB/s + uint32_t uhs_sdr104 : 1; ///< Supports SD UHS-I SDR104 (Single Data Rate) up to 104MB/s + uint32_t uhs_ddr50 : 1; ///< Supports SD UHS-I DDR50 (Dual Data Rate) up to 50MB/s + uint32_t uhs_driver_type_a : 1; ///< Supports SD UHS-I Driver Type A + uint32_t uhs_driver_type_c : 1; ///< Supports SD UHS-I Driver Type C + uint32_t uhs_driver_type_d : 1; ///< Supports SD UHS-I Driver Type D + uint32_t sdio_interrupt : 1; ///< Supports SD I/O Interrupt + uint32_t read_wait : 1; ///< Supports Read Wait (SD I/O) + uint32_t suspend_resume : 1; ///< Supports Suspend/Resume (SD I/O) + uint32_t mmc_interrupt : 1; ///< Supports MMC Interrupt + uint32_t mmc_boot : 1; ///< Supports MMC Boot + uint32_t rst_n : 1; ///< Supports RST_n Pin Control (eMMC) + uint32_t ccs : 1; ///< Supports Command Completion Signal (CCS) for CE-ATA + uint32_t ccs_timeout : 1; ///< Supports Command Completion Signal (CCS) timeout for CE-ATA + uint32_t reserved : 3; ///< Reserved (must be zero) +} ARM_MCI_CAPABILITIES; + + +/** +\brief Access structure of the MCI Driver. +*/ +typedef struct _ARM_DRIVER_MCI { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_MCI_GetVersion : Get driver version. + ARM_MCI_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_MCI_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_MCI_SignalEvent_t cb_event); ///< Pointer to \ref ARM_MCI_Initialize : Initialize MCI Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_MCI_Uninitialize : De-initialize MCI Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_MCI_PowerControl : Control MCI Interface Power. + int32_t (*CardPower) (uint32_t voltage); ///< Pointer to \ref ARM_MCI_CardPower : Set card power supply voltage. + int32_t (*ReadCD) (void); ///< Pointer to \ref ARM_MCI_ReadCD : Read Card Detect (CD) state. + int32_t (*ReadWP) (void); ///< Pointer to \ref ARM_MCI_ReadWP : Read Write Protect (WP) state. + int32_t (*SendCommand) (uint32_t cmd, + uint32_t arg, + uint32_t flags, + uint32_t *response); ///< Pointer to \ref ARM_MCI_SendCommand : Send Command to card and get the response. + int32_t (*SetupTransfer) (uint8_t *data, + uint32_t block_count, + uint32_t block_size, + uint32_t mode); ///< Pointer to \ref ARM_MCI_SetupTransfer : Setup data transfer operation. + int32_t (*AbortTransfer) (void); ///< Pointer to \ref ARM_MCI_AbortTransfer : Abort current data transfer. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_MCI_Control : Control MCI Interface. + ARM_MCI_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_MCI_GetStatus : Get MCI status. +} const ARM_DRIVER_MCI; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_MCI_H_ */ diff --git a/CMSIS/Driver/Include/Driver_NAND.h b/CMSIS/Driver/Include/Driver_NAND.h new file mode 100644 index 0000000..827fd4b --- /dev/null +++ b/CMSIS/Driver/Include/Driver_NAND.h @@ -0,0 +1,420 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 14. Nov 2017 + * $Revision: V2.3 + * + * Project: NAND Flash Driver definitions + */ + +/* History: + * Version 2.3 + * Extended ARM_NAND_ECC_INFO structure + * Version 2.2 + * ARM_NAND_STATUS made volatile + * Version 2.1 + * Updated ARM_NAND_ECC_INFO structure and ARM_NAND_ECC_xxx definitions + * Version 2.0 + * New simplified driver: + * complexity moved to upper layer (command agnostic) + * Added support for: + * NV-DDR & NV-DDR2 Interface (ONFI specification) + * VCC, VCCQ and VPP Power Supply Control + * WP (Write Protect) Control + * Version 1.11 + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_NAND_H_ +#define DRIVER_NAND_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_NAND_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,3) /* API version */ + + +/****** NAND Device Power *****/ +#define ARM_NAND_POWER_VCC_Pos 0 +#define ARM_NAND_POWER_VCC_Msk (0x07UL << ARM_NAND_POWER_VCC_Pos) +#define ARM_NAND_POWER_VCC_OFF (0x01UL << ARM_NAND_POWER_VCC_Pos) ///< VCC Power off +#define ARM_NAND_POWER_VCC_3V3 (0x02UL << ARM_NAND_POWER_VCC_Pos) ///< VCC = 3.3V +#define ARM_NAND_POWER_VCC_1V8 (0x03UL << ARM_NAND_POWER_VCC_Pos) ///< VCC = 1.8V +#define ARM_NAND_POWER_VCCQ_Pos 3 +#define ARM_NAND_POWER_VCCQ_Msk (0x07UL << ARM_NAND_POWER_VCCQ_Pos) +#define ARM_NAND_POWER_VCCQ_OFF (0x01UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ I/O Power off +#define ARM_NAND_POWER_VCCQ_3V3 (0x02UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ = 3.3V +#define ARM_NAND_POWER_VCCQ_1V8 (0x03UL << ARM_NAND_POWER_VCCQ_Pos) ///< VCCQ = 1.8V +#define ARM_NAND_POWER_VPP_OFF (1UL << 6) ///< VPP off +#define ARM_NAND_POWER_VPP_ON (1Ul << 7) ///< VPP on + + +/****** NAND Control Codes *****/ +#define ARM_NAND_BUS_MODE (0x01) ///< Set Bus Mode as specified with arg +#define ARM_NAND_BUS_DATA_WIDTH (0x02) ///< Set Bus Data Width as specified with arg +#define ARM_NAND_DRIVER_STRENGTH (0x03) ///< Set Driver Strength as specified with arg +#define ARM_NAND_DEVICE_READY_EVENT (0x04) ///< Generate \ref ARM_NAND_EVENT_DEVICE_READY; arg: 0=disabled (default), 1=enabled +#define ARM_NAND_DRIVER_READY_EVENT (0x05) ///< Generate \ref ARM_NAND_EVENT_DRIVER_READY; arg: 0=disabled (default), 1=enabled + +/*----- NAND Bus Mode (ONFI - Open NAND Flash Interface) -----*/ +#define ARM_NAND_BUS_INTERFACE_Pos 4 +#define ARM_NAND_BUS_INTERFACE_Msk (0x03UL << ARM_NAND_BUS_INTERFACE_Pos) +#define ARM_NAND_BUS_SDR (0x00UL << ARM_NAND_BUS_INTERFACE_Pos) ///< Data Interface: SDR (Single Data Rate) - Traditional interface (default) +#define ARM_NAND_BUS_DDR (0x01UL << ARM_NAND_BUS_INTERFACE_Pos) ///< Data Interface: NV-DDR (Double Data Rate) +#define ARM_NAND_BUS_DDR2 (0x02UL << ARM_NAND_BUS_INTERFACE_Pos) ///< Data Interface: NV-DDR2 (Double Data Rate) +#define ARM_NAND_BUS_TIMING_MODE_Pos 0 +#define ARM_NAND_BUS_TIMING_MODE_Msk (0x0FUL << ARM_NAND_BUS_TIMING_MODE_Pos) +#define ARM_NAND_BUS_TIMING_MODE_0 (0x00UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 0 (default) +#define ARM_NAND_BUS_TIMING_MODE_1 (0x01UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 1 +#define ARM_NAND_BUS_TIMING_MODE_2 (0x02UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 2 +#define ARM_NAND_BUS_TIMING_MODE_3 (0x03UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 3 +#define ARM_NAND_BUS_TIMING_MODE_4 (0x04UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 4 (SDR EDO capable) +#define ARM_NAND_BUS_TIMING_MODE_5 (0x05UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 5 (SDR EDO capable) +#define ARM_NAND_BUS_TIMING_MODE_6 (0x06UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 6 (NV-DDR2 only) +#define ARM_NAND_BUS_TIMING_MODE_7 (0x07UL << ARM_NAND_BUS_TIMING_MODE_Pos) ///< Timing Mode 7 (NV-DDR2 only) +#define ARM_NAND_BUS_DDR2_DO_WCYC_Pos 8 +#define ARM_NAND_BUS_DDR2_DO_WCYC_Msk (0x0FUL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) +#define ARM_NAND_BUS_DDR2_DO_WCYC_0 (0x00UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 0 (default) +#define ARM_NAND_BUS_DDR2_DO_WCYC_1 (0x01UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 1 +#define ARM_NAND_BUS_DDR2_DO_WCYC_2 (0x02UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 2 +#define ARM_NAND_BUS_DDR2_DO_WCYC_4 (0x03UL << ARM_NAND_BUS_DDR2_DO_WCYC_Pos) ///< DDR2 Data Output Warm-up cycles: 4 +#define ARM_NAND_BUS_DDR2_DI_WCYC_Pos 12 +#define ARM_NAND_BUS_DDR2_DI_WCYC_Msk (0x0FUL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) +#define ARM_NAND_BUS_DDR2_DI_WCYC_0 (0x00UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 0 (default) +#define ARM_NAND_BUS_DDR2_DI_WCYC_1 (0x01UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 1 +#define ARM_NAND_BUS_DDR2_DI_WCYC_2 (0x02UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 2 +#define ARM_NAND_BUS_DDR2_DI_WCYC_4 (0x03UL << ARM_NAND_BUS_DDR2_DI_WCYC_Pos) ///< DDR2 Data Input Warm-up cycles: 4 +#define ARM_NAND_BUS_DDR2_VEN (1UL << 16) ///< DDR2 Enable external VREFQ as reference +#define ARM_NAND_BUS_DDR2_CMPD (1UL << 17) ///< DDR2 Enable complementary DQS (DQS_c) signal +#define ARM_NAND_BUS_DDR2_CMPR (1UL << 18) ///< DDR2 Enable complementary RE_n (RE_c) signal + +/*----- NAND Data Bus Width -----*/ +#define ARM_NAND_BUS_DATA_WIDTH_8 (0x00) ///< Bus Data Width: 8 bit (default) +#define ARM_NAND_BUS_DATA_WIDTH_16 (0x01) ///< Bus Data Width: 16 bit + +/*----- NAND Driver Strength (ONFI - Open NAND Flash Interface) -----*/ +#define ARM_NAND_DRIVER_STRENGTH_18 (0x00) ///< Driver Strength 2.0x = 18 Ohms +#define ARM_NAND_DRIVER_STRENGTH_25 (0x01) ///< Driver Strength 1.4x = 25 Ohms +#define ARM_NAND_DRIVER_STRENGTH_35 (0x02) ///< Driver Strength 1.0x = 35 Ohms (default) +#define ARM_NAND_DRIVER_STRENGTH_50 (0x03) ///< Driver Strength 0.7x = 50 Ohms + + +/****** NAND ECC for Read/Write Data Mode and Sequence Execution Code *****/ +#define ARM_NAND_ECC_INDEX_Pos 0 +#define ARM_NAND_ECC_INDEX_Msk (0xFFUL << ARM_NAND_ECC_INDEX_Pos) +#define ARM_NAND_ECC(n) ((n) & ARM_NAND_ECC_INDEX_Msk) ///< Select ECC +#define ARM_NAND_ECC0 (1UL << 8) ///< Use ECC0 of selected ECC +#define ARM_NAND_ECC1 (1UL << 9) ///< Use ECC1 of selected ECC + +/****** NAND Flag for Read/Write Data Mode and Sequence Execution Code *****/ +#define ARM_NAND_DRIVER_DONE_EVENT (1UL << 16) ///< Generate \ref ARM_NAND_EVENT_DRIVER_DONE + +/****** NAND Sequence Execution Code *****/ +#define ARM_NAND_CODE_SEND_CMD1 (1UL << 17) ///< Send Command 1 +#define ARM_NAND_CODE_SEND_ADDR_COL1 (1UL << 18) ///< Send Column Address 1 +#define ARM_NAND_CODE_SEND_ADDR_COL2 (1UL << 19) ///< Send Column Address 2 +#define ARM_NAND_CODE_SEND_ADDR_ROW1 (1UL << 20) ///< Send Row Address 1 +#define ARM_NAND_CODE_SEND_ADDR_ROW2 (1UL << 21) ///< Send Row Address 2 +#define ARM_NAND_CODE_SEND_ADDR_ROW3 (1UL << 22) ///< Send Row Address 3 +#define ARM_NAND_CODE_INC_ADDR_ROW (1UL << 23) ///< Auto-increment Row Address +#define ARM_NAND_CODE_WRITE_DATA (1UL << 24) ///< Write Data +#define ARM_NAND_CODE_SEND_CMD2 (1UL << 25) ///< Send Command 2 +#define ARM_NAND_CODE_WAIT_BUSY (1UL << 26) ///< Wait while R/Bn busy +#define ARM_NAND_CODE_READ_DATA (1UL << 27) ///< Read Data +#define ARM_NAND_CODE_SEND_CMD3 (1UL << 28) ///< Send Command 3 +#define ARM_NAND_CODE_READ_STATUS (1UL << 29) ///< Read Status byte and check FAIL bit (bit 0) + +/*----- NAND Sequence Execution Code: Command -----*/ +#define ARM_NAND_CODE_CMD1_Pos 0 +#define ARM_NAND_CODE_CMD1_Msk (0xFFUL << ARM_NAND_CODE_CMD1_Pos) +#define ARM_NAND_CODE_CMD2_Pos 8 +#define ARM_NAND_CODE_CMD2_Msk (0xFFUL << ARM_NAND_CODE_CMD2_Pos) +#define ARM_NAND_CODE_CMD3_Pos 16 +#define ARM_NAND_CODE_CMD3_Msk (0xFFUL << ARM_NAND_CODE_CMD3_Pos) + +/*----- NAND Sequence Execution Code: Column Address -----*/ +#define ARM_NAND_CODE_ADDR_COL1_Pos 0 +#define ARM_NAND_CODE_ADDR_COL1_Msk (0xFFUL << ARM_NAND_CODE_ADDR_COL1_Pos) +#define ARM_NAND_CODE_ADDR_COL2_Pos 8 +#define ARM_NAND_CODE_ADDR_COL2_Msk (0xFFUL << ARM_NAND_CODE_ADDR_COL2_Pos) + +/*----- NAND Sequence Execution Code: Row Address -----*/ +#define ARM_NAND_CODE_ADDR_ROW1_Pos 0 +#define ARM_NAND_CODE_ADDR_ROW1_Msk (0xFFUL << ARM_NAND_CODE_ADDR_ROW1_Pos) +#define ARM_NAND_CODE_ADDR_ROW2_Pos 8 +#define ARM_NAND_CODE_ADDR_ROW2_Msk (0xFFUL << ARM_NAND_CODE_ADDR_ROW2_Pos) +#define ARM_NAND_CODE_ADDR_ROW3_Pos 16 +#define ARM_NAND_CODE_ADDR_ROW3_Msk (0xFFUL << ARM_NAND_CODE_ADDR_ROW3_Pos) + + +/****** NAND specific error codes *****/ +#define ARM_NAND_ERROR_ECC (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< ECC generation/correction failed + + +/** +\brief NAND ECC (Error Correction Code) Information +*/ +typedef struct _ARM_NAND_ECC_INFO { + uint32_t type : 2; ///< Type: 1=ECC0 over Main, 2=ECC0 over Main+Spare, 3=ECC0 over Main and ECC1 over Spare + uint32_t page_layout : 1; ///< Page layout: 0=|Main0|Spare0|...|MainN-1|SpareN-1|, 1=|Main0|...|MainN-1|Spare0|...|SpareN-1| + uint32_t page_count : 3; ///< Number of virtual pages: N = 2 ^ page_count + uint32_t page_size : 4; ///< Virtual Page size (Main+Spare): 0=512+16, 1=1k+32, 2=2k+64, 3=4k+128, 4=8k+256, 8=512+28, 9=1k+56, 10=2k+112, 11=4k+224, 12=8k+448, 15=Not used (extended description) + uint32_t reserved : 14; ///< Reserved (must be zero) + uint32_t correctable_bits : 8; ///< Number of correctable bits (based on 512 byte codeword size) + uint16_t codeword_size [2]; ///< Number of bytes over which ECC is calculated + uint16_t ecc_size [2]; ///< ECC size in bytes (rounded up) + uint16_t ecc_offset [2]; ///< ECC offset in bytes (where ECC starts in Spare) + /* Extended description */ + uint16_t virtual_page_size [2]; ///< Virtual Page size in bytes (Main/Spare) + uint16_t codeword_offset [2]; ///< Codeword offset in bytes (where ECC protected data starts in Main/Spare) + uint16_t codeword_gap [2]; ///< Codeword gap in bytes till next protected data + uint16_t ecc_gap [2]; ///< ECC gap in bytes till next generated ECC +} ARM_NAND_ECC_INFO; + + +/** +\brief NAND Status +*/ +typedef volatile struct _ARM_NAND_STATUS { + uint32_t busy : 1; ///< Driver busy flag + uint32_t ecc_error : 1; ///< ECC error detected (cleared on next Read/WriteData or ExecuteSequence) + uint32_t reserved : 30; +} ARM_NAND_STATUS; + + +/****** NAND Event *****/ +#define ARM_NAND_EVENT_DEVICE_READY (1UL << 0) ///< Device Ready: R/Bn rising edge +#define ARM_NAND_EVENT_DRIVER_READY (1UL << 1) ///< Driver Ready +#define ARM_NAND_EVENT_DRIVER_DONE (1UL << 2) ///< Driver operation done +#define ARM_NAND_EVENT_ECC_ERROR (1UL << 3) ///< ECC could not correct data + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_NAND_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_NAND_CAPABILITIES ARM_NAND_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_NAND_CAPABILITIES +*/ +/** + \fn int32_t ARM_NAND_Initialize (ARM_NAND_SignalEvent_t cb_event) + \brief Initialize the NAND Interface. + \param[in] cb_event Pointer to \ref ARM_NAND_SignalEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_Uninitialize (void) + \brief De-initialize the NAND Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_PowerControl (ARM_POWER_STATE state) + \brief Control the NAND interface power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_DevicePower (uint32_t voltage) + \brief Set device power supply voltage. + \param[in] voltage NAND Device supply voltage + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_WriteProtect (uint32_t dev_num, bool enable) + \brief Control WPn (Write Protect). + \param[in] dev_num Device number + \param[in] enable + - \b false Write Protect off + - \b true Write Protect on + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_ChipEnable (uint32_t dev_num, bool enable) + \brief Control CEn (Chip Enable). + \param[in] dev_num Device number + \param[in] enable + - \b false Chip Enable off + - \b true Chip Enable on + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_GetDeviceBusy (uint32_t dev_num) + \brief Get Device Busy pin state. + \param[in] dev_num Device number + \return 1=busy, 0=not busy, or error +*/ +/** + \fn int32_t ARM_NAND_SendCommand (uint32_t dev_num, uint8_t cmd) + \brief Send command to NAND device. + \param[in] dev_num Device number + \param[in] cmd Command + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_SendAddress (uint32_t dev_num, uint8_t addr) + \brief Send address to NAND device. + \param[in] dev_num Device number + \param[in] addr Address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_ReadData (uint32_t dev_num, void *data, uint32_t cnt, uint32_t mode) + \brief Read data from NAND device. + \param[in] dev_num Device number + \param[out] data Pointer to buffer for data to read from NAND device + \param[in] cnt Number of data items to read + \param[in] mode Operation mode + \return number of data items read or \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_WriteData (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode) + \brief Write data to NAND device. + \param[in] dev_num Device number + \param[out] data Pointer to buffer with data to write to NAND device + \param[in] cnt Number of data items to write + \param[in] mode Operation mode + \return number of data items written or \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_ExecuteSequence (uint32_t dev_num, uint32_t code, uint32_t cmd, + uint32_t addr_col, uint32_t addr_row, + void *data, uint32_t data_cnt, + uint8_t *status, uint32_t *count) + \brief Execute sequence of operations. + \param[in] dev_num Device number + \param[in] code Sequence code + \param[in] cmd Command(s) + \param[in] addr_col Column address + \param[in] addr_row Row address + \param[in,out] data Pointer to data to be written or read + \param[in] data_cnt Number of data items in one iteration + \param[out] status Pointer to status read + \param[in,out] count Number of iterations + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_AbortSequence (uint32_t dev_num) + \brief Abort sequence execution. + \param[in] dev_num Device number + \return \ref execution_status +*/ +/** + \fn int32_t ARM_NAND_Control (uint32_t dev_num, uint32_t control, uint32_t arg) + \brief Control NAND Interface. + \param[in] dev_num Device number + \param[in] control Operation + \param[in] arg Argument of operation + \return \ref execution_status +*/ +/** + \fn ARM_NAND_STATUS ARM_NAND_GetStatus (uint32_t dev_num) + \brief Get NAND status. + \param[in] dev_num Device number + \return NAND status \ref ARM_NAND_STATUS +*/ +/** + \fn int32_t ARM_NAND_InquireECC (int32_t index, ARM_NAND_ECC_INFO *info) + \brief Inquire about available ECC. + \param[in] index Inquire ECC index + \param[out] info Pointer to ECC information \ref ARM_NAND_ECC_INFO retrieved + \return \ref execution_status +*/ + +/** + \fn void ARM_NAND_SignalEvent (uint32_t dev_num, uint32_t event) + \brief Signal NAND event. + \param[in] dev_num Device number + \param[in] event Event notification mask + \return none +*/ + +typedef void (*ARM_NAND_SignalEvent_t) (uint32_t dev_num, uint32_t event); ///< Pointer to \ref ARM_NAND_SignalEvent : Signal NAND Event. + + +/** +\brief NAND Driver Capabilities. +*/ +typedef struct _ARM_NAND_CAPABILITIES { + uint32_t event_device_ready : 1; ///< Signal Device Ready event (R/Bn rising edge) + uint32_t reentrant_operation : 1; ///< Supports re-entrant operation (SendCommand/Address, Read/WriteData) + uint32_t sequence_operation : 1; ///< Supports Sequence operation (ExecuteSequence, AbortSequence) + uint32_t vcc : 1; ///< Supports VCC Power Supply Control + uint32_t vcc_1v8 : 1; ///< Supports 1.8 VCC Power Supply + uint32_t vccq : 1; ///< Supports VCCQ I/O Power Supply Control + uint32_t vccq_1v8 : 1; ///< Supports 1.8 VCCQ I/O Power Supply + uint32_t vpp : 1; ///< Supports VPP High Voltage Power Supply Control + uint32_t wp : 1; ///< Supports WPn (Write Protect) Control + uint32_t ce_lines : 4; ///< Number of CEn (Chip Enable) lines: ce_lines + 1 + uint32_t ce_manual : 1; ///< Supports manual CEn (Chip Enable) Control + uint32_t rb_monitor : 1; ///< Supports R/Bn (Ready/Busy) Monitoring + uint32_t data_width_16 : 1; ///< Supports 16-bit data + uint32_t ddr : 1; ///< Supports NV-DDR Data Interface (ONFI) + uint32_t ddr2 : 1; ///< Supports NV-DDR2 Data Interface (ONFI) + uint32_t sdr_timing_mode : 3; ///< Fastest (highest) SDR Timing Mode supported (ONFI) + uint32_t ddr_timing_mode : 3; ///< Fastest (highest) NV_DDR Timing Mode supported (ONFI) + uint32_t ddr2_timing_mode : 3; ///< Fastest (highest) NV_DDR2 Timing Mode supported (ONFI) + uint32_t driver_strength_18 : 1; ///< Supports Driver Strength 2.0x = 18 Ohms + uint32_t driver_strength_25 : 1; ///< Supports Driver Strength 1.4x = 25 Ohms + uint32_t driver_strength_50 : 1; ///< Supports Driver Strength 0.7x = 50 Ohms + uint32_t reserved : 2; ///< Reserved (must be zero) +} ARM_NAND_CAPABILITIES; + + +/** +\brief Access structure of the NAND Driver. +*/ +typedef struct _ARM_DRIVER_NAND { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_NAND_GetVersion : Get driver version. + ARM_NAND_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_NAND_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_NAND_SignalEvent_t cb_event); ///< Pointer to \ref ARM_NAND_Initialize : Initialize NAND Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_NAND_Uninitialize : De-initialize NAND Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_NAND_PowerControl : Control NAND Interface Power. + int32_t (*DevicePower) (uint32_t voltage); ///< Pointer to \ref ARM_NAND_DevicePower : Set device power supply voltage. + int32_t (*WriteProtect) (uint32_t dev_num, bool enable); ///< Pointer to \ref ARM_NAND_WriteProtect : Control WPn (Write Protect). + int32_t (*ChipEnable) (uint32_t dev_num, bool enable); ///< Pointer to \ref ARM_NAND_ChipEnable : Control CEn (Chip Enable). + int32_t (*GetDeviceBusy) (uint32_t dev_num); ///< Pointer to \ref ARM_NAND_GetDeviceBusy : Get Device Busy pin state. + int32_t (*SendCommand) (uint32_t dev_num, uint8_t cmd); ///< Pointer to \ref ARM_NAND_SendCommand : Send command to NAND device. + int32_t (*SendAddress) (uint32_t dev_num, uint8_t addr); ///< Pointer to \ref ARM_NAND_SendAddress : Send address to NAND device. + int32_t (*ReadData) (uint32_t dev_num, void *data, uint32_t cnt, uint32_t mode); ///< Pointer to \ref ARM_NAND_ReadData : Read data from NAND device. + int32_t (*WriteData) (uint32_t dev_num, const void *data, uint32_t cnt, uint32_t mode); ///< Pointer to \ref ARM_NAND_WriteData : Write data to NAND device. + int32_t (*ExecuteSequence)(uint32_t dev_num, uint32_t code, uint32_t cmd, + uint32_t addr_col, uint32_t addr_row, + void *data, uint32_t data_cnt, + uint8_t *status, uint32_t *count); ///< Pointer to \ref ARM_NAND_ExecuteSequence : Execute sequence of operations. + int32_t (*AbortSequence) (uint32_t dev_num); ///< Pointer to \ref ARM_NAND_AbortSequence : Abort sequence execution. + int32_t (*Control) (uint32_t dev_num, uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_NAND_Control : Control NAND Interface. + ARM_NAND_STATUS (*GetStatus) (uint32_t dev_num); ///< Pointer to \ref ARM_NAND_GetStatus : Get NAND status. + int32_t (*InquireECC) ( int32_t index, ARM_NAND_ECC_INFO *info); ///< Pointer to \ref ARM_NAND_InquireECC : Inquire about available ECC. +} const ARM_DRIVER_NAND; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_NAND_H_ */ diff --git a/CMSIS/Driver/Include/Driver_SAI.h b/CMSIS/Driver/Include/Driver_SAI.h new file mode 100644 index 0000000..bff3b95 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_SAI.h @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V1.1 + * + * Project: SAI (Serial Audio Interface) Driver definitions + */ + +/* History: + * Version 1.1 + * ARM_SAI_STATUS made volatile + * Version 1.0 + * Initial release + */ + +#ifndef DRIVER_SAI_H_ +#define DRIVER_SAI_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_SAI_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,1) /* API version */ + + +/****** SAI Control Codes *****/ + +#define ARM_SAI_CONTROL_Msk (0xFFU) +#define ARM_SAI_CONFIGURE_TX (0x01U) ///< Configure Transmitter; arg1 and arg2 provide additional configuration +#define ARM_SAI_CONFIGURE_RX (0x02U) ///< Configure Receiver; arg1 and arg2 provide additional configuration +#define ARM_SAI_CONTROL_TX (0x03U) ///< Control Transmitter; arg1.0: 0=disable (default), 1=enable; arg1.1: mute +#define ARM_SAI_CONTROL_RX (0x04U) ///< Control Receiver; arg1.0: 0=disable (default), 1=enable +#define ARM_SAI_MASK_SLOTS_TX (0x05U) ///< Mask Transmitter slots; arg1 = mask (bit: 0=active, 1=inactive); all configured slots are active by default +#define ARM_SAI_MASK_SLOTS_RX (0x06U) ///< Mask Receiver slots; arg1 = mask (bit: 0=active, 1=inactive); all configured slots are active by default +#define ARM_SAI_ABORT_SEND (0x07U) ///< Abort \ref ARM_SAI_Send +#define ARM_SAI_ABORT_RECEIVE (0x08U) ///< Abort \ref ARM_SAI_Receive + +/*----- SAI Control Codes: Configuration Parameters: Mode -----*/ +#define ARM_SAI_MODE_Pos 8 +#define ARM_SAI_MODE_Msk (1U << ARM_SAI_MODE_Pos) +#define ARM_SAI_MODE_MASTER (1U << ARM_SAI_MODE_Pos) ///< Master Mode +#define ARM_SAI_MODE_SLAVE (0U << ARM_SAI_MODE_Pos) ///< Slave Mode (default) + +/*----- SAI Control Codes: Configuration Parameters: Synchronization -----*/ +#define ARM_SAI_SYNCHRONIZATION_Pos 9 +#define ARM_SAI_SYNCHRONIZATION_Msk (1U << ARM_SAI_SYNCHRONIZATION_Pos) +#define ARM_SAI_ASYNCHRONOUS (0U << ARM_SAI_SYNCHRONIZATION_Pos) ///< Asynchronous (default) +#define ARM_SAI_SYNCHRONOUS (1U << ARM_SAI_SYNCHRONIZATION_Pos) ///< Synchronous + +/*----- SAI Control Codes: Configuration Parameters: Protocol -----*/ +#define ARM_SAI_PROTOCOL_Pos 10 +#define ARM_SAI_PROTOCOL_Msk (7U << ARM_SAI_PROTOCOL_Pos) +#define ARM_SAI_PROTOCOL_USER (0U << ARM_SAI_PROTOCOL_Pos) ///< User defined (default) +#define ARM_SAI_PROTOCOL_I2S (1U << ARM_SAI_PROTOCOL_Pos) ///< I2S +#define ARM_SAI_PROTOCOL_MSB_JUSTIFIED (2U << ARM_SAI_PROTOCOL_Pos) ///< MSB (left) justified +#define ARM_SAI_PROTOCOL_LSB_JUSTIFIED (3U << ARM_SAI_PROTOCOL_Pos) ///< LSB (right) justified +#define ARM_SAI_PROTOCOL_PCM_SHORT (4U << ARM_SAI_PROTOCOL_Pos) ///< PCM with short frame +#define ARM_SAI_PROTOCOL_PCM_LONG (5U << ARM_SAI_PROTOCOL_Pos) ///< PCM with long frame +#define ARM_SAI_PROTOCOL_AC97 (6U << ARM_SAI_PROTOCOL_Pos) ///< AC'97 + +/*----- SAI Control Codes: Configuration Parameters: Data Size -----*/ +#define ARM_SAI_DATA_SIZE_Pos 13 +#define ARM_SAI_DATA_SIZE_Msk (0x1FU << ARM_SAI_DATA_SIZE_Pos) +#define ARM_SAI_DATA_SIZE(n) ((((n)-1)&0x1FU) << ARM_SAI_DATA_SIZE_Pos) ///< Data size in bits (8..32) + +/*----- SAI Control Codes: Configuration Parameters: Bit Order -----*/ +#define ARM_SAI_BIT_ORDER_Pos 18 +#define ARM_SAI_BIT_ORDER_Msk (1U << ARM_SAI_BIT_ORDER_Pos) +#define ARM_SAI_MSB_FIRST (0U << ARM_SAI_BIT_ORDER_Pos) ///< Data is transferred with MSB first (default) +#define ARM_SAI_LSB_FIRST (1U << ARM_SAI_BIT_ORDER_Pos) ///< Data is transferred with LSB first; User Protocol only (ignored otherwise) + +/*----- SAI Control Codes: Configuration Parameters: Mono Mode -----*/ +#define ARM_SAI_MONO_MODE (1U << 19) ///< Mono Mode (only for I2S, MSB/LSB justified) + +/*----- SAI Control Codes:Configuration Parameters: Companding -----*/ +#define ARM_SAI_COMPANDING_Pos 20 +#define ARM_SAI_COMPANDING_Msk (3U << ARM_SAI_COMPANDING_Pos) +#define ARM_SAI_COMPANDING_NONE (0U << ARM_SAI_COMPANDING_Pos) ///< No companding (default) +#define ARM_SAI_COMPANDING_A_LAW (2U << ARM_SAI_COMPANDING_Pos) ///< A-Law companding +#define ARM_SAI_COMPANDING_U_LAW (3U << ARM_SAI_COMPANDING_Pos) ///< u-Law companding + +/*----- SAI Control Codes: Configuration Parameters: Clock Polarity -----*/ +#define ARM_SAI_CLOCK_POLARITY_Pos 23 +#define ARM_SAI_CLOCK_POLARITY_Msk (1U << ARM_SAI_CLOCK_POLARITY_Pos) +#define ARM_SAI_CLOCK_POLARITY_0 (0U << ARM_SAI_CLOCK_POLARITY_Pos) ///< Drive on falling edge, Capture on rising edge (default) +#define ARM_SAI_CLOCK_POLARITY_1 (1U << ARM_SAI_CLOCK_POLARITY_Pos) ///< Drive on rising edge, Capture on falling edge + +/*----- SAI Control Codes: Configuration Parameters: Master Clock Pin -----*/ +#define ARM_SAI_MCLK_PIN_Pos 24 +#define ARM_SAI_MCLK_PIN_Msk (3U << ARM_SAI_MCLK_PIN_Pos) +#define ARM_SAI_MCLK_PIN_INACTIVE (0U << ARM_SAI_MCLK_PIN_Pos) ///< MCLK not used (default) +#define ARM_SAI_MCLK_PIN_OUTPUT (1U << ARM_SAI_MCLK_PIN_Pos) ///< MCLK is output (Master only) +#define ARM_SAI_MCLK_PIN_INPUT (2U << ARM_SAI_MCLK_PIN_Pos) ///< MCLK is input (Master only) + + +/****** SAI Configuration (arg1) *****/ + +/*----- SAI Configuration (arg1): Frame Length -----*/ +#define ARM_SAI_FRAME_LENGTH_Pos 0 +#define ARM_SAI_FRAME_LENGTH_Msk (0x3FFU << ARM_SAI_FRAME_LENGTH_Pos) +#define ARM_SAI_FRAME_LENGTH(n) ((((n)-1)&0x3FFU) << ARM_SAI_FRAME_LENGTH_Pos) ///< Frame length in bits (8..1024); default depends on protocol and data + +/*----- SAI Configuration (arg1): Frame Sync Width -----*/ +#define ARM_SAI_FRAME_SYNC_WIDTH_Pos 10 +#define ARM_SAI_FRAME_SYNC_WIDTH_Msk (0xFFU << ARM_SAI_FRAME_SYNC_WIDTH_Pos) +#define ARM_SAI_FRAME_SYNC_WIDTH(n) ((((n)-1)&0xFFU) << ARM_SAI_FRAME_SYNC_WIDTH_Pos) ///< Frame Sync width in bits (1..256); default=1; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Frame Sync Polarity -----*/ +#define ARM_SAI_FRAME_SYNC_POLARITY_Pos 18 +#define ARM_SAI_FRAME_SYNC_POLARITY_Msk (1U << ARM_SAI_FRAME_SYNC_POLARITY_Pos) +#define ARM_SAI_FRAME_SYNC_POLARITY_HIGH (0U << ARM_SAI_FRAME_SYNC_POLARITY_Pos) ///< Frame Sync is active high (default); User Protocol only (ignored otherwise) +#define ARM_SAI_FRAME_SYNC_POLARITY_LOW (1U << ARM_SAI_FRAME_SYNC_POLARITY_Pos) ///< Frame Sync is active low; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Frame Sync Early -----*/ +#define ARM_SAI_FRAME_SYNC_EARLY (1U << 19) ///< Frame Sync one bit before the first bit of the frame; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Slot Count -----*/ +#define ARM_SAI_SLOT_COUNT_Pos 20 +#define ARM_SAI_SLOT_COUNT_Msk (0x1FU << ARM_SAI_SLOT_COUNT_Pos) +#define ARM_SAI_SLOT_COUNT(n) ((((n)-1)&0x1FU) << ARM_SAI_SLOT_COUNT_Pos) ///< Number of slots in frame (1..32); default=1; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Slot Size -----*/ +#define ARM_SAI_SLOT_SIZE_Pos 25 +#define ARM_SAI_SLOT_SIZE_Msk (3U << ARM_SAI_SLOT_SIZE_Pos) +#define ARM_SAI_SLOT_SIZE_DEFAULT (0U << ARM_SAI_SLOT_SIZE_Pos) ///< Slot size is equal to data size (default) +#define ARM_SAI_SLOT_SIZE_16 (1U << ARM_SAI_SLOT_SIZE_Pos) ///< Slot size = 16 bits; User Protocol only (ignored otherwise) +#define ARM_SAI_SLOT_SIZE_32 (3U << ARM_SAI_SLOT_SIZE_Pos) ///< Slot size = 32 bits; User Protocol only (ignored otherwise) + +/*----- SAI Configuration (arg1): Slot Offset -----*/ +#define ARM_SAI_SLOT_OFFSET_Pos 27 +#define ARM_SAI_SLOT_OFFSET_Msk (0x1FU << ARM_SAI_SLOT_OFFSET_Pos) +#define ARM_SAI_SLOT_OFFSET(n) (((n)&0x1FU) << ARM_SAI_SLOT_OFFSET_Pos) ///< Offset of first data bit in slot (0..31); default=0; User Protocol only (ignored otherwise) + +/****** SAI Configuration (arg2) *****/ + +/*----- SAI Control Codes: Configuration Parameters: Audio Frequency (Master only) -----*/ +#define ARM_SAI_AUDIO_FREQ_Msk (0x0FFFFFU) ///< Audio frequency mask + +/*----- SAI Control Codes: Configuration Parameters: Master Clock Prescaler (Master only and MCLK Pin) -----*/ +#define ARM_SAI_MCLK_PRESCALER_Pos 20 +#define ARM_SAI_MCLK_PRESCALER_Msk (0xFFFU << ARM_SAI_MCLK_PRESCALER_Pos) +#define ARM_SAI_MCLK_PRESCALER(n) ((((n)-1)&0xFFFU) << ARM_SAI_MCLK_PRESCALER_Pos) ///< MCLK prescaler; Audio_frequency = MCLK/n; n = 1..4096 (default=1) + + +/****** SAI specific error codes *****/ +#define ARM_SAI_ERROR_SYNCHRONIZATION (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Specified Synchronization not supported +#define ARM_SAI_ERROR_PROTOCOL (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Specified Protocol not supported +#define ARM_SAI_ERROR_DATA_SIZE (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Specified Data size not supported +#define ARM_SAI_ERROR_BIT_ORDER (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Specified Bit order not supported +#define ARM_SAI_ERROR_MONO_MODE (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Specified Mono mode not supported +#define ARM_SAI_ERROR_COMPANDING (ARM_DRIVER_ERROR_SPECIFIC - 6) ///< Specified Companding not supported +#define ARM_SAI_ERROR_CLOCK_POLARITY (ARM_DRIVER_ERROR_SPECIFIC - 7) ///< Specified Clock polarity not supported +#define ARM_SAI_ERROR_AUDIO_FREQ (ARM_DRIVER_ERROR_SPECIFIC - 8) ///< Specified Audio frequency not supported +#define ARM_SAI_ERROR_MCLK_PIN (ARM_DRIVER_ERROR_SPECIFIC - 9) ///< Specified MCLK Pin setting not supported +#define ARM_SAI_ERROR_MCLK_PRESCALER (ARM_DRIVER_ERROR_SPECIFIC - 10) ///< Specified MCLK Prescaler not supported +#define ARM_SAI_ERROR_FRAME_LENGHT (ARM_DRIVER_ERROR_SPECIFIC - 11) ///< Specified Frame length not supported +#define ARM_SAI_ERROR_FRAME_SYNC_WIDTH (ARM_DRIVER_ERROR_SPECIFIC - 12) ///< Specified Frame Sync width not supported +#define ARM_SAI_ERROR_FRAME_SYNC_POLARITY (ARM_DRIVER_ERROR_SPECIFIC - 13) ///< Specified Frame Sync polarity not supported +#define ARM_SAI_ERROR_FRAME_SYNC_EARLY (ARM_DRIVER_ERROR_SPECIFIC - 14) ///< Specified Frame Sync early not supported +#define ARM_SAI_ERROR_SLOT_COUNT (ARM_DRIVER_ERROR_SPECIFIC - 15) ///< Specified Slot count not supported +#define ARM_SAI_ERROR_SLOT_SIZE (ARM_DRIVER_ERROR_SPECIFIC - 16) ///< Specified Slot size not supported +#define ARM_SAI_ERROR_SLOT_OFFESET (ARM_DRIVER_ERROR_SPECIFIC - 17) ///< Specified Slot offset not supported + + +/** +\brief SAI Status +*/ +typedef volatile struct _ARM_SAI_STATUS { + uint32_t tx_busy : 1; ///< Transmitter busy flag + uint32_t rx_busy : 1; ///< Receiver busy flag + uint32_t tx_underflow : 1; ///< Transmit data underflow detected (cleared on start of next send operation) + uint32_t rx_overflow : 1; ///< Receive data overflow detected (cleared on start of next receive operation) + uint32_t frame_error : 1; ///< Sync Frame error detected (cleared on start of next send/receive operation) + uint32_t reserved : 27; +} ARM_SAI_STATUS; + + +/****** SAI Event *****/ +#define ARM_SAI_EVENT_SEND_COMPLETE (1U << 0) ///< Send completed +#define ARM_SAI_EVENT_RECEIVE_COMPLETE (1U << 1) ///< Receive completed +#define ARM_SAI_EVENT_TX_UNDERFLOW (1U << 2) ///< Transmit data not available +#define ARM_SAI_EVENT_RX_OVERFLOW (1U << 3) ///< Receive data overflow +#define ARM_SAI_EVENT_FRAME_ERROR (1U << 4) ///< Sync Frame error in Slave mode (optional) + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_SAI_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_SAI_CAPABILITIES ARM_SAI_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_SAI_CAPABILITIES + + \fn int32_t ARM_SAI_Initialize (ARM_SAI_SignalEvent_t cb_event) + \brief Initialize SAI Interface. + \param[in] cb_event Pointer to \ref ARM_SAI_SignalEvent + \return \ref execution_status + + \fn int32_t ARM_SAI_Uninitialize (void) + \brief De-initialize SAI Interface. + \return \ref execution_status + + \fn int32_t ARM_SAI_PowerControl (ARM_POWER_STATE state) + \brief Control SAI Interface Power. + \param[in] state Power state + \return \ref execution_status + + \fn int32_t ARM_SAI_Send (const void *data, uint32_t num) + \brief Start sending data to SAI transmitter. + \param[in] data Pointer to buffer with data to send to SAI transmitter + \param[in] num Number of data items to send + \return \ref execution_status + + \fn int32_t ARM_SAI_Receive (void *data, uint32_t num) + \brief Start receiving data from SAI receiver. + \param[out] data Pointer to buffer for data to receive from SAI receiver + \param[in] num Number of data items to receive + \return \ref execution_status + + \fn uint32_t ARM_SAI_GetTxCount (void) + \brief Get transmitted data count. + \return number of data items transmitted + + \fn uint32_t ARM_SAI_GetRxCount (void) + \brief Get received data count. + \return number of data items received + + \fn int32_t ARM_SAI_Control (uint32_t control, uint32_t arg1, uint32_t arg2) + \brief Control SAI Interface. + \param[in] control Operation + \param[in] arg1 Argument 1 of operation (optional) + \param[in] arg2 Argument 2 of operation (optional) + \return common \ref execution_status and driver specific \ref sai_execution_status + + \fn ARM_SAI_STATUS ARM_SAI_GetStatus (void) + \brief Get SAI status. + \return SAI status \ref ARM_SAI_STATUS + + \fn void ARM_SAI_SignalEvent (uint32_t event) + \brief Signal SAI Events. + \param[in] event \ref SAI_events notification mask + \return none +*/ + +typedef void (*ARM_SAI_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_SAI_SignalEvent : Signal SAI Event. + + +/** +\brief SAI Driver Capabilities. +*/ +typedef struct _ARM_SAI_CAPABILITIES { + uint32_t asynchronous : 1; ///< supports asynchronous Transmit/Receive + uint32_t synchronous : 1; ///< supports synchronous Transmit/Receive + uint32_t protocol_user : 1; ///< supports user defined Protocol + uint32_t protocol_i2s : 1; ///< supports I2S Protocol + uint32_t protocol_justified : 1; ///< supports MSB/LSB justified Protocol + uint32_t protocol_pcm : 1; ///< supports PCM short/long frame Protocol + uint32_t protocol_ac97 : 1; ///< supports AC'97 Protocol + uint32_t mono_mode : 1; ///< supports Mono mode + uint32_t companding : 1; ///< supports Companding + uint32_t mclk_pin : 1; ///< supports MCLK (Master Clock) pin + uint32_t event_frame_error : 1; ///< supports Frame error event: \ref ARM_SAI_EVENT_FRAME_ERROR + uint32_t reserved : 21; ///< Reserved (must be zero) +} ARM_SAI_CAPABILITIES; + + +/** +\brief Access structure of the SAI Driver. +*/ +typedef struct _ARM_DRIVER_SAI { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_SAI_GetVersion : Get driver version. + ARM_SAI_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_SAI_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_SAI_SignalEvent_t cb_event); ///< Pointer to \ref ARM_SAI_Initialize : Initialize SAI Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_SAI_Uninitialize : De-initialize SAI Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_SAI_PowerControl : Control SAI Interface Power. + int32_t (*Send) (const void *data, uint32_t num); ///< Pointer to \ref ARM_SAI_Send : Start sending data to SAI Interface. + int32_t (*Receive) ( void *data, uint32_t num); ///< Pointer to \ref ARM_SAI_Receive : Start receiving data from SAI Interface. + uint32_t (*GetTxCount) (void); ///< Pointer to \ref ARM_SAI_GetTxCount : Get transmitted data count. + uint32_t (*GetRxCount) (void); ///< Pointer to \ref ARM_SAI_GetRxCount : Get received data count. + int32_t (*Control) (uint32_t control, uint32_t arg1, uint32_t arg2); ///< Pointer to \ref ARM_SAI_Control : Control SAI Interface. + ARM_SAI_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_SAI_GetStatus : Get SAI status. +} const ARM_DRIVER_SAI; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_SAI_H_ */ diff --git a/CMSIS/Driver/Include/Driver_SPI.h b/CMSIS/Driver/Include/Driver_SPI.h new file mode 100644 index 0000000..61b4d80 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_SPI.h @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.2 + * + * Project: SPI (Serial Peripheral Interface) Driver definitions + */ + +/* History: + * Version 2.2 + * ARM_SPI_STATUS made volatile + * Version 2.1 + * Renamed status flag "tx_rx_busy" to "busy" + * Version 2.0 + * New simplified driver: + * complexity moved to upper layer (especially data handling) + * more unified API for different communication interfaces + * Added: + * Slave Mode + * Half-duplex Modes + * Configurable number of data bits + * Support for TI Mode and Microwire + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.01 + * Added "send_done_event" to Capabilities + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_SPI_H_ +#define DRIVER_SPI_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_SPI_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,2) /* API version */ + + +/****** SPI Control Codes *****/ + +#define ARM_SPI_CONTROL_Pos 0 +#define ARM_SPI_CONTROL_Msk (0xFFUL << ARM_SPI_CONTROL_Pos) + +/*----- SPI Control Codes: Mode -----*/ +#define ARM_SPI_MODE_INACTIVE (0x00UL << ARM_SPI_CONTROL_Pos) ///< SPI Inactive +#define ARM_SPI_MODE_MASTER (0x01UL << ARM_SPI_CONTROL_Pos) ///< SPI Master (Output on MOSI, Input on MISO); arg = Bus Speed in bps +#define ARM_SPI_MODE_SLAVE (0x02UL << ARM_SPI_CONTROL_Pos) ///< SPI Slave (Output on MISO, Input on MOSI) +#define ARM_SPI_MODE_MASTER_SIMPLEX (0x03UL << ARM_SPI_CONTROL_Pos) ///< SPI Master (Output/Input on MOSI); arg = Bus Speed in bps +#define ARM_SPI_MODE_SLAVE_SIMPLEX (0x04UL << ARM_SPI_CONTROL_Pos) ///< SPI Slave (Output/Input on MISO) + +/*----- SPI Control Codes: Mode Parameters: Frame Format -----*/ +#define ARM_SPI_FRAME_FORMAT_Pos 8 +#define ARM_SPI_FRAME_FORMAT_Msk (7UL << ARM_SPI_FRAME_FORMAT_Pos) +#define ARM_SPI_CPOL0_CPHA0 (0UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 0, Clock Phase 0 (default) +#define ARM_SPI_CPOL0_CPHA1 (1UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 0, Clock Phase 1 +#define ARM_SPI_CPOL1_CPHA0 (2UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 1, Clock Phase 0 +#define ARM_SPI_CPOL1_CPHA1 (3UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 1, Clock Phase 1 +#define ARM_SPI_TI_SSI (4UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Texas Instruments Frame Format +#define ARM_SPI_MICROWIRE (5UL << ARM_SPI_FRAME_FORMAT_Pos) ///< National Microwire Frame Format + +/*----- SPI Control Codes: Mode Parameters: Data Bits -----*/ +#define ARM_SPI_DATA_BITS_Pos 12 +#define ARM_SPI_DATA_BITS_Msk (0x3FUL << ARM_SPI_DATA_BITS_Pos) +#define ARM_SPI_DATA_BITS(n) (((n) & 0x3F) << ARM_SPI_DATA_BITS_Pos) ///< Number of Data bits + +/*----- SPI Control Codes: Mode Parameters: Bit Order -----*/ +#define ARM_SPI_BIT_ORDER_Pos 18 +#define ARM_SPI_BIT_ORDER_Msk (1UL << ARM_SPI_BIT_ORDER_Pos) +#define ARM_SPI_MSB_LSB (0UL << ARM_SPI_BIT_ORDER_Pos) ///< SPI Bit order from MSB to LSB (default) +#define ARM_SPI_LSB_MSB (1UL << ARM_SPI_BIT_ORDER_Pos) ///< SPI Bit order from LSB to MSB + +/*----- SPI Control Codes: Mode Parameters: Slave Select Mode -----*/ +#define ARM_SPI_SS_MASTER_MODE_Pos 19 +#define ARM_SPI_SS_MASTER_MODE_Msk (3UL << ARM_SPI_SS_MASTER_MODE_Pos) +#define ARM_SPI_SS_MASTER_UNUSED (0UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Not used (default) +#define ARM_SPI_SS_MASTER_SW (1UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Software controlled +#define ARM_SPI_SS_MASTER_HW_OUTPUT (2UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Hardware controlled Output +#define ARM_SPI_SS_MASTER_HW_INPUT (3UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Hardware monitored Input +#define ARM_SPI_SS_SLAVE_MODE_Pos 21 +#define ARM_SPI_SS_SLAVE_MODE_Msk (1UL << ARM_SPI_SS_SLAVE_MODE_Pos) +#define ARM_SPI_SS_SLAVE_HW (0UL << ARM_SPI_SS_SLAVE_MODE_Pos) ///< SPI Slave Select when Slave: Hardware monitored (default) +#define ARM_SPI_SS_SLAVE_SW (1UL << ARM_SPI_SS_SLAVE_MODE_Pos) ///< SPI Slave Select when Slave: Software controlled + + +/*----- SPI Control Codes: Miscellaneous Controls -----*/ +#define ARM_SPI_SET_BUS_SPEED (0x10UL << ARM_SPI_CONTROL_Pos) ///< Set Bus Speed in bps; arg = value +#define ARM_SPI_GET_BUS_SPEED (0x11UL << ARM_SPI_CONTROL_Pos) ///< Get Bus Speed in bps +#define ARM_SPI_SET_DEFAULT_TX_VALUE (0x12UL << ARM_SPI_CONTROL_Pos) ///< Set default Transmit value; arg = value +#define ARM_SPI_CONTROL_SS (0x13UL << ARM_SPI_CONTROL_Pos) ///< Control Slave Select; arg: 0=inactive, 1=active +#define ARM_SPI_ABORT_TRANSFER (0x14UL << ARM_SPI_CONTROL_Pos) ///< Abort current data transfer + + +/****** SPI Slave Select Signal definitions *****/ +#define ARM_SPI_SS_INACTIVE 0 ///< SPI Slave Select Signal Inactive +#define ARM_SPI_SS_ACTIVE 1 ///< SPI Slave Select Signal Active + + +/****** SPI specific error codes *****/ +#define ARM_SPI_ERROR_MODE (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Specified Mode not supported +#define ARM_SPI_ERROR_FRAME_FORMAT (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Specified Frame Format not supported +#define ARM_SPI_ERROR_DATA_BITS (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Specified number of Data bits not supported +#define ARM_SPI_ERROR_BIT_ORDER (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Specified Bit order not supported +#define ARM_SPI_ERROR_SS_MODE (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Specified Slave Select Mode not supported + + +/** +\brief SPI Status +*/ +typedef volatile struct _ARM_SPI_STATUS { + uint32_t busy : 1; ///< Transmitter/Receiver busy flag + uint32_t data_lost : 1; ///< Data lost: Receive overflow / Transmit underflow (cleared on start of transfer operation) + uint32_t mode_fault : 1; ///< Mode fault detected; optional (cleared on start of transfer operation) + uint32_t reserved : 29; +} ARM_SPI_STATUS; + + +/****** SPI Event *****/ +#define ARM_SPI_EVENT_TRANSFER_COMPLETE (1UL << 0) ///< Data Transfer completed +#define ARM_SPI_EVENT_DATA_LOST (1UL << 1) ///< Data lost: Receive overflow / Transmit underflow +#define ARM_SPI_EVENT_MODE_FAULT (1UL << 2) ///< Master Mode Fault (SS deactivated when Master) + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_SPI_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_SPI_CAPABILITIES ARM_SPI_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_SPI_CAPABILITIES + + \fn int32_t ARM_SPI_Initialize (ARM_SPI_SignalEvent_t cb_event) + \brief Initialize SPI Interface. + \param[in] cb_event Pointer to \ref ARM_SPI_SignalEvent + \return \ref execution_status + + \fn int32_t ARM_SPI_Uninitialize (void) + \brief De-initialize SPI Interface. + \return \ref execution_status + + \fn int32_t ARM_SPI_PowerControl (ARM_POWER_STATE state) + \brief Control SPI Interface Power. + \param[in] state Power state + \return \ref execution_status + + \fn int32_t ARM_SPI_Send (const void *data, uint32_t num) + \brief Start sending data to SPI transmitter. + \param[in] data Pointer to buffer with data to send to SPI transmitter + \param[in] num Number of data items to send + \return \ref execution_status + + \fn int32_t ARM_SPI_Receive (void *data, uint32_t num) + \brief Start receiving data from SPI receiver. + \param[out] data Pointer to buffer for data to receive from SPI receiver + \param[in] num Number of data items to receive + \return \ref execution_status + + \fn int32_t ARM_SPI_Transfer (const void *data_out, + void *data_in, + uint32_t num) + \brief Start sending/receiving data to/from SPI transmitter/receiver. + \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] num Number of data items to transfer + \return \ref execution_status + + \fn uint32_t ARM_SPI_GetDataCount (void) + \brief Get transferred data count. + \return number of data items transferred + + \fn int32_t ARM_SPI_Control (uint32_t control, uint32_t arg) + \brief Control SPI Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return common \ref execution_status and driver specific \ref spi_execution_status + + \fn ARM_SPI_STATUS ARM_SPI_GetStatus (void) + \brief Get SPI status. + \return SPI status \ref ARM_SPI_STATUS + + \fn void ARM_SPI_SignalEvent (uint32_t event) + \brief Signal SPI Events. + \param[in] event \ref SPI_events notification mask + \return none +*/ + +typedef void (*ARM_SPI_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_SPI_SignalEvent : Signal SPI Event. + + +/** +\brief SPI Driver Capabilities. +*/ +typedef struct _ARM_SPI_CAPABILITIES { + uint32_t simplex : 1; ///< supports Simplex Mode (Master and Slave) + uint32_t ti_ssi : 1; ///< supports TI Synchronous Serial Interface + uint32_t microwire : 1; ///< supports Microwire Interface + uint32_t event_mode_fault : 1; ///< Signal Mode Fault event: \ref ARM_SPI_EVENT_MODE_FAULT + uint32_t reserved : 28; ///< Reserved (must be zero) +} ARM_SPI_CAPABILITIES; + + +/** +\brief Access structure of the SPI Driver. +*/ +typedef struct _ARM_DRIVER_SPI { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_SPI_GetVersion : Get driver version. + ARM_SPI_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_SPI_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_SPI_SignalEvent_t cb_event); ///< Pointer to \ref ARM_SPI_Initialize : Initialize SPI Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_SPI_Uninitialize : De-initialize SPI Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_SPI_PowerControl : Control SPI Interface Power. + int32_t (*Send) (const void *data, uint32_t num); ///< Pointer to \ref ARM_SPI_Send : Start sending data to SPI Interface. + int32_t (*Receive) ( void *data, uint32_t num); ///< Pointer to \ref ARM_SPI_Receive : Start receiving data from SPI Interface. + int32_t (*Transfer) (const void *data_out, + void *data_in, + uint32_t num); ///< Pointer to \ref ARM_SPI_Transfer : Start sending/receiving data to/from SPI. + uint32_t (*GetDataCount) (void); ///< Pointer to \ref ARM_SPI_GetDataCount : Get transferred data count. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_SPI_Control : Control SPI Interface. + ARM_SPI_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_SPI_GetStatus : Get SPI status. +} const ARM_DRIVER_SPI; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_SPI_H_ */ diff --git a/CMSIS/Driver/Include/Driver_Storage.h b/CMSIS/Driver/Include/Driver_Storage.h new file mode 100644 index 0000000..573d628 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_Storage.h @@ -0,0 +1,419 @@ +/* + * Copyright (c) 2006-2017, ARM 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. + */ + +#ifndef DRIVER_STORAGE_H_ +#define DRIVER_STORAGE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "Driver_Common.h" + +#define ARM_STORAGE_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,1) /* API version */ + + +#define _ARM_Driver_Storage_(n) Driver_Storage##n +#define ARM_Driver_Storage_(n) _ARM_Driver_Storage_(n) + +#define ARM_STORAGE_INVALID_OFFSET (0xFFFFFFFFFFFFFFFFULL) ///< Invalid address (relative to a storage controller's + /// address space). A storage block may never start at this address. + +#define ARM_STORAGE_INVALID_ADDRESS (0xFFFFFFFFUL) ///< Invalid address within the processor's memory address space. + /// Refer to memory-mapped storage, i.e. \ref ARM_DRIVER_STORAGE::ResolveAddress(). + +/****** Storage specific error codes *****/ +#define ARM_STORAGE_ERROR_NOT_ERASABLE (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Part (or all) of the range provided to Erase() isn't erasable. +#define ARM_STORAGE_ERROR_NOT_PROGRAMMABLE (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Part (or all) of the range provided to ProgramData() isn't programmable. +#define ARM_STORAGE_ERROR_PROTECTED (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Part (or all) of the range to Erase() or ProgramData() is protected. + +/** + * \brief Attributes of the storage range within a storage block. + */ +typedef struct _ARM_STORAGE_BLOCK_ATTRIBUTES { + uint32_t erasable : 1; ///< Erasing blocks is permitted with a minimum granularity of 'erase_unit'. + /// @note if 'erasable' is 0 (i.e. the 'erase' operation isn't available) then + /// 'erase_unit' (see below) is immaterial and should be 0. + uint32_t programmable : 1; ///< Writing to ranges is permitted with a minimum granularity of 'program_unit'. + /// Writes are typically achieved through the ProgramData operation (following an erase); + /// if storage isn't erasable (see 'erasable' above) but is memory-mapped + /// (i.e. 'memory_mapped'), it can be written directly using memory-store operations. + uint32_t executable : 1; ///< This storage block can hold program data; the processor can fetch and execute code + /// sourced from it. Often this is accompanied with the device being 'memory_mapped' (see \ref ARM_STORAGE_INFO). + uint32_t protectable : 1; ///< The entire block can be protected from program and erase operations. Once protection + /// is enabled for a block, its 'erasable' and 'programmable' bits are turned off. + uint32_t reserved : 28; + uint32_t erase_unit; ///< Minimum erase size in bytes. + /// The offset of the start of the erase-range should also be aligned with this value. + /// Applicable if the 'erasable' attribute is set for the block. + /// @note if 'erasable' (see above) is 0 (i.e. the 'erase' operation isn't available) then + /// 'erase_unit' is immaterial and should be 0. + uint32_t protection_unit; ///< Minimum protectable size in bytes. Applicable if the 'protectable' + /// attribute is set for the block. This should be a divisor of the block's size. A + /// block can be considered to be made up of consecutive, individually-protectable fragments. +} ARM_STORAGE_BLOCK_ATTRIBUTES; + +/** + * \brief A storage block is a range of memory with uniform attributes. + */ +typedef struct _ARM_STORAGE_BLOCK { + uint64_t addr; ///< This is the start address of the storage block. It is + /// expressed as an offset from the start of the storage map + /// maintained by the owning storage controller. + uint64_t size; ///< This is the size of the storage block, in units of bytes. + /// Together with addr, it describes a range [addr, addr+size). + ARM_STORAGE_BLOCK_ATTRIBUTES attributes; ///< Attributes for this block. +} ARM_STORAGE_BLOCK; + +/** + * The check for a valid ARM_STORAGE_BLOCK. + */ +#define ARM_STORAGE_VALID_BLOCK(BLK) (((BLK)->addr != ARM_STORAGE_INVALID_OFFSET) && ((BLK)->size != 0)) + +/** + * \brief Values for encoding storage memory-types with respect to programmability. + * + * Please ensure that the maximum of the following memory types doesn't exceed 16; we + * encode this in a 4-bit field within ARM_STORAGE_INFO::programmability. + */ +#define ARM_STORAGE_PROGRAMMABILITY_RAM (0x0) +#define ARM_STORAGE_PROGRAMMABILITY_ROM (0x1) ///< Read-only memory. +#define ARM_STORAGE_PROGRAMMABILITY_WORM (0x2) ///< write-once-read-only-memory (WORM). +#define ARM_STORAGE_PROGRAMMABILITY_ERASABLE (0x3) ///< re-programmable based on erase. Supports multiple writes. + +/** + * Values for encoding data-retention levels for storage blocks. + * + * Please ensure that the maximum of the following retention types doesn't exceed 16; we + * encode this in a 4-bit field within ARM_STORAGE_INFO::retention_level. + */ +#define ARM_RETENTION_WHILE_DEVICE_ACTIVE (0x0) ///< Data is retained only during device activity. +#define ARM_RETENTION_ACROSS_SLEEP (0x1) ///< Data is retained across processor sleep. +#define ARM_RETENTION_ACROSS_DEEP_SLEEP (0x2) ///< Data is retained across processor deep-sleep. +#define ARM_RETENTION_BATTERY_BACKED (0x3) ///< Data is battery-backed. Device can be powered off. +#define ARM_RETENTION_NVM (0x4) ///< Data is retained in non-volatile memory. + +/** + * Device Data Security Protection Features. Applicable mostly to EXTERNAL_NVM. + */ +typedef struct _ARM_STORAGE_SECURITY_FEATURES { + uint32_t acls : 1; ///< Protection against internal software attacks using ACLs. + uint32_t rollback_protection : 1; ///< Roll-back protection. Set to true if the creator of the storage + /// can ensure that an external attacker can't force an + /// older firmware to run or to revert back to a previous state. + uint32_t tamper_proof : 1; ///< Tamper-proof memory (will be deleted on tamper-attempts using board level or chip level sensors). + uint32_t internal_flash : 1; ///< Internal flash. + uint32_t reserved1 : 12; + + /** + * Encode support for hardening against various classes of attacks. + */ + uint32_t software_attacks : 1; ///< device software (malware running on the device). + uint32_t board_level_attacks : 1; ///< board level attacks (debug probes, copy protection fuses.) + uint32_t chip_level_attacks : 1; ///< chip level attacks (tamper-protection). + uint32_t side_channel_attacks : 1; ///< side channel attacks. + uint32_t reserved2 : 12; +} ARM_STORAGE_SECURITY_FEATURES; + +#define ARM_STORAGE_PROGRAM_CYCLES_INFINITE (0UL) /**< Infinite or unknown endurance for reprogramming. */ + +/** + * Device level metadata regarding the Storage implementation. + */ +typedef struct _ARM_STORAGE_INFO { + uint64_t total_storage; ///< Total available storage, in bytes. + uint32_t program_unit; ///< Minimum programming size in bytes. + /// The offset of the start of the program-range should also be aligned with this value. + /// Applicable only if the 'programmable' attribute is set for a block. + /// @note setting program_unit to 0 has the effect of disabling the size and alignment + /// restrictions (setting it to 1 also has the same effect). + uint32_t optimal_program_unit; ///< Optimal programming page-size in bytes. Some storage controllers + /// have internal buffers into which to receive data. Writing in chunks of + /// 'optimal_program_unit' would achieve maximum programming speed. + /// Applicable only if the 'programmable' attribute is set for the underlying block(s). + uint32_t program_cycles; ///< A measure of endurance for reprogramming. + /// Use ARM_STORAGE_PROGRAM_CYCLES_INFINITE for infinite or unknown endurance. + uint32_t erased_value : 1; ///< Contents of erased memory (usually 1 to indicate erased bytes with state 0xFF). + uint32_t memory_mapped : 1; ///< This storage device has a mapping onto the processor's memory address space. + /// @note For a memory-mapped block which isn't erasable but is programmable (i.e. if + /// 'erasable' is set to 0, but 'programmable' is 1), writes should be possible directly to + /// the memory-mapped storage without going through the ProgramData operation. + uint32_t programmability : 4; ///< A value to indicate storage programmability. + uint32_t retention_level : 4; + uint32_t reserved : 22; + ARM_STORAGE_SECURITY_FEATURES security; ///< \ref ARM_STORAGE_SECURITY_FEATURES +} ARM_STORAGE_INFO; + +/** +\brief Operating status of the storage controller. +*/ +typedef volatile struct _ARM_STORAGE_STATUS { + uint32_t busy : 1; ///< Controller busy flag + uint32_t error : 1; ///< Read/Program/Erase error flag (cleared on start of next operation) + uint32_t reserved : 30; +} ARM_STORAGE_STATUS; + +/** + * \brief Storage Driver API Capabilities. + */ +typedef struct _ARM_STORAGE_CAPABILITIES { + uint32_t asynchronous_ops : 1; ///< Used to indicate if APIs like initialize, + /// read, erase, program, etc. can operate in asynchronous mode. + /// Setting this bit to 1 means that the driver is capable + /// of launching asynchronous operations; command completion is + /// signaled by the invocation of a completion callback. If + /// set to 1, drivers may still complete asynchronous + /// operations synchronously as necessary (in which case they + /// return a positive error code to indicate synchronous completion). + uint32_t erase_all : 1; ///< Supports EraseAll operation. + uint32_t reserved : 30; ///< Reserved (must be zero) +} ARM_STORAGE_CAPABILITIES; + +/** + * Command opcodes for Storage. + */ +typedef enum _ARM_STORAGE_OPERATION { + ARM_STORAGE_OPERATION_GET_VERSION, + ARM_STORAGE_OPERATION_GET_CAPABILITIES, + ARM_STORAGE_OPERATION_INITIALIZE, + ARM_STORAGE_OPERATION_UNINITIALIZE, + ARM_STORAGE_OPERATION_POWER_CONTROL, + ARM_STORAGE_OPERATION_READ_DATA, + ARM_STORAGE_OPERATION_PROGRAM_DATA, + ARM_STORAGE_OPERATION_ERASE, + ARM_STORAGE_OPERATION_ERASE_ALL, + ARM_STORAGE_OPERATION_GET_STATUS, + ARM_STORAGE_OPERATION_GET_INFO, + ARM_STORAGE_OPERATION_RESOLVE_ADDRESS, + ARM_STORAGE_OPERATION_GET_NEXT_BLOCK, + ARM_STORAGE_OPERATION_GET_BLOCK +} ARM_STORAGE_OPERATION; + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_Storage_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_STORAGE_CAPABILITIES ARM_Storage_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_STORAGE_CAPABILITIES +*/ +/** + \fn int32_t ARM_Storage_Initialize (ARM_Storage_Callback_t callback) + \brief Initialize the Storage interface. + \param [in] callback Pointer to \ref ARM_Storage_Callback_t. + Caller-defined callback to be invoked upon command completion + for asynchronous APIs (including the completion of + initialization). Use a NULL pointer when no callback + signals are required. + \return If asynchronous activity is launched, invocation + ARM_DRIVER_OK, and the caller can expect to receive a callback in the + future with a status value of ARM_DRIVER_OK or an error-code. In the + case of synchronous execution, control returns after completion with a + value of 1. Return values less than ARM_DRIVER_OK (0) signify errors. +*/ +/** + \fn int32_t ARM_Storage_Uninitialize (void) + \brief De-initialize the Storage Interface. + \return If asynchronous activity is launched, an invocation returns + ARM_DRIVER_OK, and the caller can expect to receive a callback in the + future with a status value of ARM_DRIVER_OK or an error-code. In the + case of synchronous execution, control returns after completion with a + value of 1. Return values less than ARM_DRIVER_OK (0) signify errors. +*/ +/** + \fn int32_t ARM_Storage_PowerControl (ARM_POWER_STATE state) + \brief Control the Storage interface power. + \param[in] state Power state + \return If asynchronous activity is launched, an invocation returns + ARM_DRIVER_OK, and the caller can expect to receive a callback in the + future with a status value of ARM_DRIVER_OK or an error-code. In the + case of synchronous execution, control returns after completion with a + value of 1. Return values less than ARM_DRIVER_OK (0) signify errors. +*/ +/** + \fn int32_t ARM_Storage_ReadData (uint64_t addr, void *data, uint32_t size) + \brief Read data from Storage. + \param[in] addr Data address. + \param[out] data Pointer to a buffer storing the data read from Storage. + \param[in] size Number of bytes to read. The data buffer + should be at least as large as this size. + \return If asynchronous activity is launched, an invocation returns + ARM_DRIVER_OK, and the caller can expect to receive a callback in the + future with the number of successfully transferred bytes passed in as + the 'status' parameter. In the case of synchronous execution, control + returns after completion with a positive transfer-count. Return values + less than ARM_DRIVER_OK (0) signify errors. +*/ +/** + \fn int32_t ARM_Storage_ProgramData (uint64_t addr, const void *data, uint32_t size) + \brief Program data to Storage. + \param [in] addr This is the start address of the range to be written into. It + needs to be aligned to the device's \em program_unit + specified in \ref ARM_STORAGE_INFO. + \param [in] data The source of the write operation. The buffer is owned by the + caller and should remain accessible for the lifetime of this + command. + \param [in] size The number of bytes requested to be written. The buffer + should be at least as large as this size. \note 'size' should + be a multiple of the device's 'program_unit' (see \ref + ARM_STORAGE_INFO). + \return If asynchronous activity is launched, an invocation returns + ARM_DRIVER_OK, and the caller can expect to receive a callback in the + future with the number of successfully transferred bytes passed in as + the 'status' parameter. In the case of synchronous execution, control + returns after completion with a positive transfer-count. Return values + less than ARM_DRIVER_OK (0) signify errors. +*/ +/** + \fn int32_t ARM_Storage_Erase (uint64_t addr, uint32_t size) + \brief Erase Storage range. + \param [in] addr This is the start-address of the range to be erased. It must + start at an 'erase_unit' boundary of the underlying block. + \param [in] size Size (in bytes) of the range to be erased. 'addr + size' + must be aligned with the 'erase_unit' of the underlying + block. + \return If the range to be erased doesn't align with the erase_units of the + respective start and end blocks, ARM_DRIVER_ERROR_PARAMETER is + returned. If any part of the range is protected, + ARM_STORAGE_ERROR_PROTECTED is returned. If any part of the range + is not erasable, ARM_STORAGE_ERROR_NOT_ERASABLE is returned. All + such sanity-check failures result in the error code being + returned synchronously and the storage bytes within the range + remain unaffected. Otherwise the function executes in the + following ways: If asynchronous activity is launched, an + invocation returns ARM_DRIVER_OK, and the caller can expect to + receive a callback in the future with the number of successfully + erased bytes passed in as the 'status' parameter. In the case of + synchronous execution, control returns after completion with a + positive erase-count. Return values less than ARM_DRIVER_OK (0) + signify errors. +*/ +/** + \fn int32_t ARM_Storage_EraseAll (void) + \brief Erase complete Storage. + \return If any part of the storage range is protected, + ARM_STORAGE_ERROR_PROTECTED is returned. If any part of the + storage range is not erasable, ARM_STORAGE_ERROR_NOT_ERASABLE is + returned. All such sanity-check failures result in the error code + being returned synchronously and the storage bytes within the + range remain unaffected. Otherwise the function executes in the + following ways: If asynchronous activity is launched, an + invocation returns ARM_DRIVER_OK, and the caller can expect to + receive a callback in the future with ARM_DRIVER_OK passed in as + the 'status' parameter. In the case of synchronous execution, + control returns after completion with a value of 1. Return values + less than ARM_DRIVER_OK (0) signify errors. +*/ +/** + \fn ARM_STORAGE_STATUS ARM_Storage_GetStatus (void) + \brief Get Storage status. + \return Storage status \ref ARM_STORAGE_STATUS +*/ +/** + \fn int32_t ARM_Storage_GetInfo (ARM_STORAGE_INFO *info) + \brief Get Storage information. + \param[out] info A caller-supplied buffer capable of being filled in with an \ref ARM_STORAGE_INFO. + \return ARM_DRIVER_OK if a ARM_STORAGE_INFO structure containing top level + metadata about the storage controller is filled into the supplied + buffer, else an appropriate error value. +*/ +/** + \fn uint32_t ARM_Storage_ResolveAddress(uint64_t addr) + \brief Resolve an address relative to the storage controller into a memory address. + \param[in] addr The address for which we want a resolution to the processor's physical address space. It is an offset from the + start of the storage map maintained by the owning storage + controller. + \return The resolved address in the processor's address space, else ARM_STORAGE_INVALID_ADDRESS. +*/ +/** + \fn int32_t ARM_Storage_GetNextBlock(const ARM_STORAGE_BLOCK* prev_block, ARM_STORAGE_BLOCK *next_block); + \brief Advance to the successor of the current block (iterator). + \param[in] prev_block An existing block (iterator) within the same storage + controller. The memory buffer holding this block is owned + by the caller. This pointer may be NULL; if so, the + invocation fills in the first block into the out parameter: + 'next_block'. + \param[out] next_block A caller-owned buffer large enough to be filled in with + the following ARM_STORAGE_BLOCK. It is legal to provide the + same buffer using 'next_block' as was passed in with 'prev_block'. It + is also legal to pass a NULL into this parameter if the + caller isn't interested in populating a buffer with the next + block, i.e. if the caller only wishes to establish the + presence of a next block. + \return ARM_DRIVER_OK if a valid next block is found (or first block, if + prev_block is passed as NULL); upon successful operation, the contents + of the next (or first) block are filled into the buffer pointed to by + the parameter 'next_block' and ARM_STORAGE_VALID_BLOCK(next_block) is + guaranteed to be true. Upon reaching the end of the sequence of blocks + (iterators), or in case the driver is unable to fetch information about + the next (or first) block, an error (negative) value is returned and an + invalid StorageBlock is populated into the supplied buffer. If + prev_block is NULL, the first block is returned. +*/ +/** + \fn int32_t ARM_Storage_GetBlock(uint64_t addr, ARM_STORAGE_BLOCK *block); + \brief Find the storage block (iterator) encompassing a given storage address. + \param[in] addr Storage address in bytes. + \param[out] block A caller-owned buffer large enough to be filled in with the + ARM_STORAGE_BLOCK encapsulating the given address. This value + can also be passed in as NULL if the caller isn't interested + in populating a buffer with the block, if the caller only + wishes to establish the presence of a containing storage + block. + \return ARM_DRIVER_OK if a containing storage-block is found. In this case, + if block is non-NULL, the buffer pointed to by it is populated with + the contents of the storage block, i.e. if block is valid and a block is + found, ARM_STORAGE_VALID_BLOCK(block) would return true following this + call. If there is no storage block containing the given offset, or in + case the driver is unable to resolve an address to a storage-block, an + error (negative) value is returned and an invalid StorageBlock is + populated into the supplied buffer. +*/ + +/** + * Provides the typedef for the callback function \ref ARM_Storage_Callback_t. + */ +typedef void (*ARM_Storage_Callback_t)(int32_t status, ARM_STORAGE_OPERATION operation); + +/** + * The set of operations constituting the Storage driver. + */ +typedef struct _ARM_DRIVER_STORAGE { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_Storage_GetVersion : Get driver version. + ARM_STORAGE_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to \ref ARM_Storage_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_Storage_Callback_t callback); ///< Pointer to \ref ARM_Storage_Initialize : Initialize the Storage Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_Storage_Uninitialize : De-initialize the Storage Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_Storage_PowerControl : Control the Storage interface power. + int32_t (*ReadData) (uint64_t addr, void *data, uint32_t size); ///< Pointer to \ref ARM_Storage_ReadData : Read data from Storage. + int32_t (*ProgramData) (uint64_t addr, const void *data, uint32_t size); ///< Pointer to \ref ARM_Storage_ProgramData : Program data to Storage. + int32_t (*Erase) (uint64_t addr, uint32_t size); ///< Pointer to \ref ARM_Storage_Erase : Erase Storage range. + int32_t (*EraseAll) (void); ///< Pointer to \ref ARM_Storage_EraseAll : Erase complete Storage. + ARM_STORAGE_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_Storage_GetStatus : Get Storage status. + int32_t (*GetInfo) (ARM_STORAGE_INFO *info); ///< Pointer to \ref ARM_Storage_GetInfo : Get Storage information. + uint32_t (*ResolveAddress) (uint64_t addr); ///< Pointer to \ref ARM_Storage_ResolveAddress : Resolve a storage address. + int32_t (*GetNextBlock) (const ARM_STORAGE_BLOCK* prev, ARM_STORAGE_BLOCK *next); ///< Pointer to \ref ARM_Storage_GetNextBlock : fetch successor for current block. + int32_t (*GetBlock) (uint64_t addr, ARM_STORAGE_BLOCK *block); ///< Pointer to \ref ARM_Storage_GetBlock : +} const ARM_DRIVER_STORAGE; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_STORAGE_H_ */ diff --git a/CMSIS/Driver/Include/Driver_USART.h b/CMSIS/Driver/Include/Driver_USART.h new file mode 100644 index 0000000..e60bf51 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_USART.h @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.3 + * + * Project: USART (Universal Synchronous Asynchronous Receiver Transmitter) + * Driver definitions + */ + +/* History: + * Version 2.3 + * ARM_USART_STATUS and ARM_USART_MODEM_STATUS made volatile + * Version 2.2 + * Corrected ARM_USART_CPOL_Pos and ARM_USART_CPHA_Pos definitions + * Version 2.1 + * Removed optional argument parameter from Signal Event + * Version 2.0 + * New simplified driver: + * complexity moved to upper layer (especially data handling) + * more unified API for different communication interfaces + * renamed driver UART -> USART (Asynchronous & Synchronous) + * Added modes: + * Synchronous + * Single-wire + * IrDA + * Smart Card + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.01 + * Added events: + * ARM_UART_EVENT_TX_EMPTY, ARM_UART_EVENT_RX_TIMEOUT + * ARM_UART_EVENT_TX_THRESHOLD, ARM_UART_EVENT_RX_THRESHOLD + * Added functions: SetTxThreshold, SetRxThreshold + * Added "rx_timeout_event" to capabilities + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_USART_H_ +#define DRIVER_USART_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_USART_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,3) /* API version */ + + +/****** USART Control Codes *****/ + +#define ARM_USART_CONTROL_Pos 0 +#define ARM_USART_CONTROL_Msk (0xFFUL << ARM_USART_CONTROL_Pos) + +/*----- USART Control Codes: Mode -----*/ +#define ARM_USART_MODE_ASYNCHRONOUS (0x01UL << ARM_USART_CONTROL_Pos) ///< UART (Asynchronous); arg = Baudrate +#define ARM_USART_MODE_SYNCHRONOUS_MASTER (0x02UL << ARM_USART_CONTROL_Pos) ///< Synchronous Master (generates clock signal); arg = Baudrate +#define ARM_USART_MODE_SYNCHRONOUS_SLAVE (0x03UL << ARM_USART_CONTROL_Pos) ///< Synchronous Slave (external clock signal) +#define ARM_USART_MODE_SINGLE_WIRE (0x04UL << ARM_USART_CONTROL_Pos) ///< UART Single-wire (half-duplex); arg = Baudrate +#define ARM_USART_MODE_IRDA (0x05UL << ARM_USART_CONTROL_Pos) ///< UART IrDA; arg = Baudrate +#define ARM_USART_MODE_SMART_CARD (0x06UL << ARM_USART_CONTROL_Pos) ///< UART Smart Card; arg = Baudrate + +/*----- USART Control Codes: Mode Parameters: Data Bits -----*/ +#define ARM_USART_DATA_BITS_Pos 8 +#define ARM_USART_DATA_BITS_Msk (7UL << ARM_USART_DATA_BITS_Pos) +#define ARM_USART_DATA_BITS_5 (5UL << ARM_USART_DATA_BITS_Pos) ///< 5 Data bits +#define ARM_USART_DATA_BITS_6 (6UL << ARM_USART_DATA_BITS_Pos) ///< 6 Data bit +#define ARM_USART_DATA_BITS_7 (7UL << ARM_USART_DATA_BITS_Pos) ///< 7 Data bits +#define ARM_USART_DATA_BITS_8 (0UL << ARM_USART_DATA_BITS_Pos) ///< 8 Data bits (default) +#define ARM_USART_DATA_BITS_9 (1UL << ARM_USART_DATA_BITS_Pos) ///< 9 Data bits + +/*----- USART Control Codes: Mode Parameters: Parity -----*/ +#define ARM_USART_PARITY_Pos 12 +#define ARM_USART_PARITY_Msk (3UL << ARM_USART_PARITY_Pos) +#define ARM_USART_PARITY_NONE (0UL << ARM_USART_PARITY_Pos) ///< No Parity (default) +#define ARM_USART_PARITY_EVEN (1UL << ARM_USART_PARITY_Pos) ///< Even Parity +#define ARM_USART_PARITY_ODD (2UL << ARM_USART_PARITY_Pos) ///< Odd Parity + +/*----- USART Control Codes: Mode Parameters: Stop Bits -----*/ +#define ARM_USART_STOP_BITS_Pos 14 +#define ARM_USART_STOP_BITS_Msk (3UL << ARM_USART_STOP_BITS_Pos) +#define ARM_USART_STOP_BITS_1 (0UL << ARM_USART_STOP_BITS_Pos) ///< 1 Stop bit (default) +#define ARM_USART_STOP_BITS_2 (1UL << ARM_USART_STOP_BITS_Pos) ///< 2 Stop bits +#define ARM_USART_STOP_BITS_1_5 (2UL << ARM_USART_STOP_BITS_Pos) ///< 1.5 Stop bits +#define ARM_USART_STOP_BITS_0_5 (3UL << ARM_USART_STOP_BITS_Pos) ///< 0.5 Stop bits + +/*----- USART Control Codes: Mode Parameters: Flow Control -----*/ +#define ARM_USART_FLOW_CONTROL_Pos 16 +#define ARM_USART_FLOW_CONTROL_Msk (3UL << ARM_USART_FLOW_CONTROL_Pos) +#define ARM_USART_FLOW_CONTROL_NONE (0UL << ARM_USART_FLOW_CONTROL_Pos) ///< No Flow Control (default) +#define ARM_USART_FLOW_CONTROL_RTS (1UL << ARM_USART_FLOW_CONTROL_Pos) ///< RTS Flow Control +#define ARM_USART_FLOW_CONTROL_CTS (2UL << ARM_USART_FLOW_CONTROL_Pos) ///< CTS Flow Control +#define ARM_USART_FLOW_CONTROL_RTS_CTS (3UL << ARM_USART_FLOW_CONTROL_Pos) ///< RTS/CTS Flow Control + +/*----- USART Control Codes: Mode Parameters: Clock Polarity (Synchronous mode) -----*/ +#define ARM_USART_CPOL_Pos 18 +#define ARM_USART_CPOL_Msk (1UL << ARM_USART_CPOL_Pos) +#define ARM_USART_CPOL0 (0UL << ARM_USART_CPOL_Pos) ///< CPOL = 0 (default) +#define ARM_USART_CPOL1 (1UL << ARM_USART_CPOL_Pos) ///< CPOL = 1 + +/*----- USART Control Codes: Mode Parameters: Clock Phase (Synchronous mode) -----*/ +#define ARM_USART_CPHA_Pos 19 +#define ARM_USART_CPHA_Msk (1UL << ARM_USART_CPHA_Pos) +#define ARM_USART_CPHA0 (0UL << ARM_USART_CPHA_Pos) ///< CPHA = 0 (default) +#define ARM_USART_CPHA1 (1UL << ARM_USART_CPHA_Pos) ///< CPHA = 1 + + +/*----- USART Control Codes: Miscellaneous Controls -----*/ +#define ARM_USART_SET_DEFAULT_TX_VALUE (0x10UL << ARM_USART_CONTROL_Pos) ///< Set default Transmit value (Synchronous Receive only); arg = value +#define ARM_USART_SET_IRDA_PULSE (0x11UL << ARM_USART_CONTROL_Pos) ///< Set IrDA Pulse in ns; arg: 0=3/16 of bit period +#define ARM_USART_SET_SMART_CARD_GUARD_TIME (0x12UL << ARM_USART_CONTROL_Pos) ///< Set Smart Card Guard Time; arg = number of bit periods +#define ARM_USART_SET_SMART_CARD_CLOCK (0x13UL << ARM_USART_CONTROL_Pos) ///< Set Smart Card Clock in Hz; arg: 0=Clock not generated +#define ARM_USART_CONTROL_SMART_CARD_NACK (0x14UL << ARM_USART_CONTROL_Pos) ///< Smart Card NACK generation; arg: 0=disabled, 1=enabled +#define ARM_USART_CONTROL_TX (0x15UL << ARM_USART_CONTROL_Pos) ///< Transmitter; arg: 0=disabled, 1=enabled +#define ARM_USART_CONTROL_RX (0x16UL << ARM_USART_CONTROL_Pos) ///< Receiver; arg: 0=disabled, 1=enabled +#define ARM_USART_CONTROL_BREAK (0x17UL << ARM_USART_CONTROL_Pos) ///< Continuous Break transmission; arg: 0=disabled, 1=enabled +#define ARM_USART_ABORT_SEND (0x18UL << ARM_USART_CONTROL_Pos) ///< Abort \ref ARM_USART_Send +#define ARM_USART_ABORT_RECEIVE (0x19UL << ARM_USART_CONTROL_Pos) ///< Abort \ref ARM_USART_Receive +#define ARM_USART_ABORT_TRANSFER (0x1AUL << ARM_USART_CONTROL_Pos) ///< Abort \ref ARM_USART_Transfer + + + +/****** USART specific error codes *****/ +#define ARM_USART_ERROR_MODE (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Specified Mode not supported +#define ARM_USART_ERROR_BAUDRATE (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Specified baudrate not supported +#define ARM_USART_ERROR_DATA_BITS (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Specified number of Data bits not supported +#define ARM_USART_ERROR_PARITY (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Specified Parity not supported +#define ARM_USART_ERROR_STOP_BITS (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Specified number of Stop bits not supported +#define ARM_USART_ERROR_FLOW_CONTROL (ARM_DRIVER_ERROR_SPECIFIC - 6) ///< Specified Flow Control not supported +#define ARM_USART_ERROR_CPOL (ARM_DRIVER_ERROR_SPECIFIC - 7) ///< Specified Clock Polarity not supported +#define ARM_USART_ERROR_CPHA (ARM_DRIVER_ERROR_SPECIFIC - 8) ///< Specified Clock Phase not supported + + +/** +\brief USART Status +*/ +typedef volatile struct _ARM_USART_STATUS { + uint32_t tx_busy : 1; ///< Transmitter busy flag + uint32_t rx_busy : 1; ///< Receiver busy flag + uint32_t tx_underflow : 1; ///< Transmit data underflow detected (cleared on start of next send operation) + uint32_t rx_overflow : 1; ///< Receive data overflow detected (cleared on start of next receive operation) + uint32_t rx_break : 1; ///< Break detected on receive (cleared on start of next receive operation) + uint32_t rx_framing_error : 1; ///< Framing error detected on receive (cleared on start of next receive operation) + uint32_t rx_parity_error : 1; ///< Parity error detected on receive (cleared on start of next receive operation) + uint32_t reserved : 25; +} ARM_USART_STATUS; + +/** +\brief USART Modem Control +*/ +typedef enum _ARM_USART_MODEM_CONTROL { + ARM_USART_RTS_CLEAR, ///< Deactivate RTS + ARM_USART_RTS_SET, ///< Activate RTS + ARM_USART_DTR_CLEAR, ///< Deactivate DTR + ARM_USART_DTR_SET ///< Activate DTR +} ARM_USART_MODEM_CONTROL; + +/** +\brief USART Modem Status +*/ +typedef volatile struct _ARM_USART_MODEM_STATUS { + uint32_t cts : 1; ///< CTS state: 1=Active, 0=Inactive + uint32_t dsr : 1; ///< DSR state: 1=Active, 0=Inactive + uint32_t dcd : 1; ///< DCD state: 1=Active, 0=Inactive + uint32_t ri : 1; ///< RI state: 1=Active, 0=Inactive + uint32_t reserved : 28; +} ARM_USART_MODEM_STATUS; + + +/****** USART Event *****/ +#define ARM_USART_EVENT_SEND_COMPLETE (1UL << 0) ///< Send completed; however USART may still transmit data +#define ARM_USART_EVENT_RECEIVE_COMPLETE (1UL << 1) ///< Receive completed +#define ARM_USART_EVENT_TRANSFER_COMPLETE (1UL << 2) ///< Transfer completed +#define ARM_USART_EVENT_TX_COMPLETE (1UL << 3) ///< Transmit completed (optional) +#define ARM_USART_EVENT_TX_UNDERFLOW (1UL << 4) ///< Transmit data not available (Synchronous Slave) +#define ARM_USART_EVENT_RX_OVERFLOW (1UL << 5) ///< Receive data overflow +#define ARM_USART_EVENT_RX_TIMEOUT (1UL << 6) ///< Receive character timeout (optional) +#define ARM_USART_EVENT_RX_BREAK (1UL << 7) ///< Break detected on receive +#define ARM_USART_EVENT_RX_FRAMING_ERROR (1UL << 8) ///< Framing error detected on receive +#define ARM_USART_EVENT_RX_PARITY_ERROR (1UL << 9) ///< Parity error detected on receive +#define ARM_USART_EVENT_CTS (1UL << 10) ///< CTS state changed (optional) +#define ARM_USART_EVENT_DSR (1UL << 11) ///< DSR state changed (optional) +#define ARM_USART_EVENT_DCD (1UL << 12) ///< DCD state changed (optional) +#define ARM_USART_EVENT_RI (1UL << 13) ///< RI state changed (optional) + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_USART_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION + + \fn ARM_USART_CAPABILITIES ARM_USART_GetCapabilities (void) + \brief Get driver capabilities + \return \ref ARM_USART_CAPABILITIES + + \fn int32_t ARM_USART_Initialize (ARM_USART_SignalEvent_t cb_event) + \brief Initialize USART Interface. + \param[in] cb_event Pointer to \ref ARM_USART_SignalEvent + \return \ref execution_status + + \fn int32_t ARM_USART_Uninitialize (void) + \brief De-initialize USART Interface. + \return \ref execution_status + + \fn int32_t ARM_USART_PowerControl (ARM_POWER_STATE state) + \brief Control USART Interface Power. + \param[in] state Power state + \return \ref execution_status + + \fn int32_t ARM_USART_Send (const void *data, uint32_t num) + \brief Start sending data to USART transmitter. + \param[in] data Pointer to buffer with data to send to USART transmitter + \param[in] num Number of data items to send + \return \ref execution_status + + \fn int32_t ARM_USART_Receive (void *data, uint32_t num) + \brief Start receiving data from USART receiver. + \param[out] data Pointer to buffer for data to receive from USART receiver + \param[in] num Number of data items to receive + \return \ref execution_status + + \fn int32_t ARM_USART_Transfer (const void *data_out, + void *data_in, + uint32_t num) + \brief Start sending/receiving data to/from USART transmitter/receiver. + \param[in] data_out Pointer to buffer with data to send to USART transmitter + \param[out] data_in Pointer to buffer for data to receive from USART receiver + \param[in] num Number of data items to transfer + \return \ref execution_status + + \fn uint32_t ARM_USART_GetTxCount (void) + \brief Get transmitted data count. + \return number of data items transmitted + + \fn uint32_t ARM_USART_GetRxCount (void) + \brief Get received data count. + \return number of data items received + + \fn int32_t ARM_USART_Control (uint32_t control, uint32_t arg) + \brief Control USART Interface. + \param[in] control Operation + \param[in] arg Argument of operation (optional) + \return common \ref execution_status and driver specific \ref usart_execution_status + + \fn ARM_USART_STATUS ARM_USART_GetStatus (void) + \brief Get USART status. + \return USART status \ref ARM_USART_STATUS + + \fn int32_t ARM_USART_SetModemControl (ARM_USART_MODEM_CONTROL control) + \brief Set USART Modem Control line state. + \param[in] control \ref ARM_USART_MODEM_CONTROL + \return \ref execution_status + + \fn ARM_USART_MODEM_STATUS ARM_USART_GetModemStatus (void) + \brief Get USART Modem Status lines state. + \return modem status \ref ARM_USART_MODEM_STATUS + + \fn void ARM_USART_SignalEvent (uint32_t event) + \brief Signal USART Events. + \param[in] event \ref USART_events notification mask + \return none +*/ + +typedef void (*ARM_USART_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_USART_SignalEvent : Signal USART Event. + + +/** +\brief USART Device Driver Capabilities. +*/ +typedef struct _ARM_USART_CAPABILITIES { + uint32_t asynchronous : 1; ///< supports UART (Asynchronous) mode + uint32_t synchronous_master : 1; ///< supports Synchronous Master mode + uint32_t synchronous_slave : 1; ///< supports Synchronous Slave mode + uint32_t single_wire : 1; ///< supports UART Single-wire mode + uint32_t irda : 1; ///< supports UART IrDA mode + uint32_t smart_card : 1; ///< supports UART Smart Card mode + uint32_t smart_card_clock : 1; ///< Smart Card Clock generator available + uint32_t flow_control_rts : 1; ///< RTS Flow Control available + uint32_t flow_control_cts : 1; ///< CTS Flow Control available + uint32_t event_tx_complete : 1; ///< Transmit completed event: \ref ARM_USART_EVENT_TX_COMPLETE + uint32_t event_rx_timeout : 1; ///< Signal receive character timeout event: \ref ARM_USART_EVENT_RX_TIMEOUT + uint32_t rts : 1; ///< RTS Line: 0=not available, 1=available + uint32_t cts : 1; ///< CTS Line: 0=not available, 1=available + uint32_t dtr : 1; ///< DTR Line: 0=not available, 1=available + uint32_t dsr : 1; ///< DSR Line: 0=not available, 1=available + uint32_t dcd : 1; ///< DCD Line: 0=not available, 1=available + uint32_t ri : 1; ///< RI Line: 0=not available, 1=available + uint32_t event_cts : 1; ///< Signal CTS change event: \ref ARM_USART_EVENT_CTS + uint32_t event_dsr : 1; ///< Signal DSR change event: \ref ARM_USART_EVENT_DSR + uint32_t event_dcd : 1; ///< Signal DCD change event: \ref ARM_USART_EVENT_DCD + uint32_t event_ri : 1; ///< Signal RI change event: \ref ARM_USART_EVENT_RI + uint32_t reserved : 11; ///< Reserved (must be zero) +} ARM_USART_CAPABILITIES; + + +/** +\brief Access structure of the USART Driver. +*/ +typedef struct _ARM_DRIVER_USART { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USART_GetVersion : Get driver version. + ARM_USART_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USART_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_USART_SignalEvent_t cb_event); ///< Pointer to \ref ARM_USART_Initialize : Initialize USART Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USART_Uninitialize : De-initialize USART Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USART_PowerControl : Control USART Interface Power. + int32_t (*Send) (const void *data, uint32_t num); ///< Pointer to \ref ARM_USART_Send : Start sending data to USART transmitter. + int32_t (*Receive) ( void *data, uint32_t num); ///< Pointer to \ref ARM_USART_Receive : Start receiving data from USART receiver. + int32_t (*Transfer) (const void *data_out, + void *data_in, + uint32_t num); ///< Pointer to \ref ARM_USART_Transfer : Start sending/receiving data to/from USART. + uint32_t (*GetTxCount) (void); ///< Pointer to \ref ARM_USART_GetTxCount : Get transmitted data count. + uint32_t (*GetRxCount) (void); ///< Pointer to \ref ARM_USART_GetRxCount : Get received data count. + int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_USART_Control : Control USART Interface. + ARM_USART_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_USART_GetStatus : Get USART status. + int32_t (*SetModemControl) (ARM_USART_MODEM_CONTROL control); ///< Pointer to \ref ARM_USART_SetModemControl : Set USART Modem Control line state. + ARM_USART_MODEM_STATUS (*GetModemStatus) (void); ///< Pointer to \ref ARM_USART_GetModemStatus : Get USART Modem Status lines state. +} const ARM_DRIVER_USART; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_USART_H_ */ diff --git a/CMSIS/Driver/Include/Driver_USB.h b/CMSIS/Driver/Include/Driver_USB.h new file mode 100644 index 0000000..fbb3f4d --- /dev/null +++ b/CMSIS/Driver/Include/Driver_USB.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.0 + * + * Project: USB Driver common definitions + */ + +/* History: + * Version 2.0 + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.01 + * Added PID Types + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_USB_H_ +#define DRIVER_USB_H_ + +#include "Driver_Common.h" + +/* USB Role */ +#define ARM_USB_ROLE_NONE (0) +#define ARM_USB_ROLE_HOST (1) +#define ARM_USB_ROLE_DEVICE (2) + +/* USB Pins */ +#define ARM_USB_PIN_DP (1 << 0) ///< USB D+ pin +#define ARM_USB_PIN_DM (1 << 1) ///< USB D- pin +#define ARM_USB_PIN_VBUS (1 << 2) ///< USB VBUS pin +#define ARM_USB_PIN_OC (1 << 3) ///< USB OverCurrent pin +#define ARM_USB_PIN_ID (1 << 4) ///< USB ID pin + +/* USB Speed */ +#define ARM_USB_SPEED_LOW (0) ///< Low-speed USB +#define ARM_USB_SPEED_FULL (1) ///< Full-speed USB +#define ARM_USB_SPEED_HIGH (2) ///< High-speed USB + +/* USB PID Types */ +#define ARM_USB_PID_OUT (1) +#define ARM_USB_PID_IN (9) +#define ARM_USB_PID_SOF (5) +#define ARM_USB_PID_SETUP (13) +#define ARM_USB_PID_DATA0 (3) +#define ARM_USB_PID_DATA1 (11) +#define ARM_USB_PID_DATA2 (7) +#define ARM_USB_PID_MDATA (15) +#define ARM_USB_PID_ACK (2) +#define ARM_USB_PID_NAK (10) +#define ARM_USB_PID_STALL (14) +#define ARM_USB_PID_NYET (6) +#define ARM_USB_PID_PRE (12) +#define ARM_USB_PID_ERR (12) +#define ARM_USB_PID_SPLIT (8) +#define ARM_USB_PID_PING (4) +#define ARM_USB_PID_RESERVED (0) + +/* USB Endpoint Address (bEndpointAddress) */ +#define ARM_USB_ENDPOINT_NUMBER_MASK (0x0F) +#define ARM_USB_ENDPOINT_DIRECTION_MASK (0x80) + +/* USB Endpoint Type */ +#define ARM_USB_ENDPOINT_CONTROL (0) ///< Control Endpoint +#define ARM_USB_ENDPOINT_ISOCHRONOUS (1) ///< Isochronous Endpoint +#define ARM_USB_ENDPOINT_BULK (2) ///< Bulk Endpoint +#define ARM_USB_ENDPOINT_INTERRUPT (3) ///< Interrupt Endpoint + +/* USB Endpoint Maximum Packet Size (wMaxPacketSize) */ +#define ARM_USB_ENDPOINT_MAX_PACKET_SIZE_MASK (0x07FF) +#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_MASK (0x1800) +#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_1 (0x0000) +#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_2 (0x0800) +#define ARM_USB_ENDPOINT_MICROFRAME_TRANSACTIONS_3 (0x1000) + +#endif /* DRIVER_USB_H_ */ diff --git a/CMSIS/Driver/Include/Driver_USBD.h b/CMSIS/Driver/Include/Driver_USBD.h new file mode 100644 index 0000000..f6b230a --- /dev/null +++ b/CMSIS/Driver/Include/Driver_USBD.h @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.2 + * + * Project: USB Device Driver definitions + */ + +/* History: + * Version 2.2 + * ARM_USBD_STATE made volatile + * Version 2.1 + * Added ARM_USBD_ReadSetupPacket function + * Version 2.0 + * Removed ARM_USBD_DeviceConfigure function + * Removed ARM_USBD_SET_ADDRESS_STAGE parameter from ARM_USBD_DeviceSetAddress function + * Removed ARM_USBD_EndpointReadStart function + * Replaced ARM_USBD_EndpointRead and ARM_USBD_EndpointWrite functions with ARM_USBD_EndpointTransfer + * Added ARM_USBD_EndpointTransferGetResult function + * Renamed ARM_USBD_EndpointAbort function to ARM_USBD_EndpointTransferAbort + * Changed prefix ARM_DRV -> ARM_DRIVER + * Changed return values of some functions to int32_t + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_USBD_H_ +#define DRIVER_USBD_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_USB.h" + +#define ARM_USBD_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,2) /* API version */ + + +/** +\brief USB Device State +*/ +typedef volatile struct _ARM_USBD_STATE { + uint32_t vbus : 1; ///< USB Device VBUS flag + uint32_t speed : 2; ///< USB Device speed setting (ARM_USB_SPEED_xxx) + uint32_t active : 1; ///< USB Device active flag + uint32_t reserved : 28; +} ARM_USBD_STATE; + + +/****** USB Device Event *****/ +#define ARM_USBD_EVENT_VBUS_ON (1UL << 0) ///< USB Device VBUS On +#define ARM_USBD_EVENT_VBUS_OFF (1UL << 1) ///< USB Device VBUS Off +#define ARM_USBD_EVENT_RESET (1UL << 2) ///< USB Reset occurred +#define ARM_USBD_EVENT_HIGH_SPEED (1UL << 3) ///< USB switch to High Speed occurred +#define ARM_USBD_EVENT_SUSPEND (1UL << 4) ///< USB Suspend occurred +#define ARM_USBD_EVENT_RESUME (1UL << 5) ///< USB Resume occurred + +/****** USB Endpoint Event *****/ +#define ARM_USBD_EVENT_SETUP (1UL << 0) ///< SETUP Packet +#define ARM_USBD_EVENT_OUT (1UL << 1) ///< OUT Packet(s) +#define ARM_USBD_EVENT_IN (1UL << 2) ///< IN Packet(s) + + +#ifndef __DOXYGEN_MW__ // exclude from middleware documentation + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_USBD_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_USBD_CAPABILITIES ARM_USBD_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_USBD_CAPABILITIES +*/ +/** + \fn int32_t ARM_USBD_Initialize (ARM_USBD_SignalDeviceEvent_t cb_device_event, + ARM_USBD_SignalEndpointEvent_t cb_endpoint_event) + \brief Initialize USB Device Interface. + \param[in] cb_device_event Pointer to \ref ARM_USBD_SignalDeviceEvent + \param[in] cb_endpoint_event Pointer to \ref ARM_USBD_SignalEndpointEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_Uninitialize (void) + \brief De-initialize USB Device Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_PowerControl (ARM_POWER_STATE state) + \brief Control USB Device Interface Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_DeviceConnect (void) + \brief Connect USB Device. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_DeviceDisconnect (void) + \brief Disconnect USB Device. + \return \ref execution_status +*/ +/** + \fn ARM_USBD_STATE ARM_USBD_DeviceGetState (void) + \brief Get current USB Device State. + \return Device State \ref ARM_USBD_STATE +*/ +/** + \fn int32_t ARM_USBD_DeviceRemoteWakeup (void) + \brief Trigger USB Remote Wakeup. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_DeviceSetAddress (uint8_t dev_addr) + \brief Set USB Device Address. + \param[in] dev_addr Device Address + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_ReadSetupPacket (uint8_t *setup) + \brief Read setup packet received over Control Endpoint. + \param[out] setup Pointer to buffer for setup packet + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_EndpointConfigure (uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size) + \brief Configure USB Endpoint. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[in] ep_type Endpoint Type (ARM_USB_ENDPOINT_xxx) + \param[in] ep_max_packet_size Endpoint Maximum Packet Size + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_EndpointUnconfigure (uint8_t ep_addr) + \brief Unconfigure USB Endpoint. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_EndpointStall (uint8_t ep_addr, bool stall) + \brief Set/Clear Stall for USB Endpoint. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[in] stall Operation + - \b false Clear + - \b true Set + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBD_EndpointTransfer (uint8_t ep_addr, uint8_t *data, uint32_t num) + \brief Read data from or Write data to USB Endpoint. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[out] data Pointer to buffer for data to read or with data to write + \param[in] num Number of data bytes to transfer + \return \ref execution_status +*/ +/** + \fn uint32_t ARM_USBD_EndpointTransferGetResult (uint8_t ep_addr) + \brief Get result of USB Endpoint transfer. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \return number of successfully transferred data bytes +*/ +/** + \fn int32_t ARM_USBD_EndpointTransferAbort (uint8_t ep_addr) + \brief Abort current USB Endpoint transfer. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \return \ref execution_status +*/ +/** + \fn uint16_t ARM_USBD_GetFrameNumber (void) + \brief Get current USB Frame Number. + \return Frame Number +*/ + +/** + \fn void ARM_USBD_SignalDeviceEvent (uint32_t event) + \brief Signal USB Device Event. + \param[in] event \ref USBD_dev_events + \return none +*/ +/** + \fn void ARM_USBD_SignalEndpointEvent (uint8_t ep_addr, uint32_t event) + \brief Signal USB Endpoint Event. + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[in] event \ref USBD_ep_events + \return none +*/ + +typedef void (*ARM_USBD_SignalDeviceEvent_t) (uint32_t event); ///< Pointer to \ref ARM_USBD_SignalDeviceEvent : Signal USB Device Event. +typedef void (*ARM_USBD_SignalEndpointEvent_t) (uint8_t ep_addr, uint32_t event); ///< Pointer to \ref ARM_USBD_SignalEndpointEvent : Signal USB Endpoint Event. + + +/** +\brief USB Device Driver Capabilities. +*/ +typedef struct _ARM_USBD_CAPABILITIES { + uint32_t vbus_detection : 1; ///< VBUS detection + uint32_t event_vbus_on : 1; ///< Signal VBUS On event + uint32_t event_vbus_off : 1; ///< Signal VBUS Off event + uint32_t reserved : 29; ///< Reserved (must be zero) +} ARM_USBD_CAPABILITIES; + + +/** +\brief Access structure of the USB Device Driver. +*/ +typedef struct _ARM_DRIVER_USBD { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USBD_GetVersion : Get driver version. + ARM_USBD_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USBD_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_USBD_SignalDeviceEvent_t cb_device_event, + ARM_USBD_SignalEndpointEvent_t cb_endpoint_event); ///< Pointer to \ref ARM_USBD_Initialize : Initialize USB Device Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USBD_Uninitialize : De-initialize USB Device Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USBD_PowerControl : Control USB Device Interface Power. + int32_t (*DeviceConnect) (void); ///< Pointer to \ref ARM_USBD_DeviceConnect : Connect USB Device. + int32_t (*DeviceDisconnect) (void); ///< Pointer to \ref ARM_USBD_DeviceDisconnect : Disconnect USB Device. + ARM_USBD_STATE (*DeviceGetState) (void); ///< Pointer to \ref ARM_USBD_DeviceGetState : Get current USB Device State. + int32_t (*DeviceRemoteWakeup) (void); ///< Pointer to \ref ARM_USBD_DeviceRemoteWakeup : Trigger USB Remote Wakeup. + int32_t (*DeviceSetAddress) (uint8_t dev_addr); ///< Pointer to \ref ARM_USBD_DeviceSetAddress : Set USB Device Address. + int32_t (*ReadSetupPacket) (uint8_t *setup); ///< Pointer to \ref ARM_USBD_ReadSetupPacket : Read setup packet received over Control Endpoint. + int32_t (*EndpointConfigure) (uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size); ///< Pointer to \ref ARM_USBD_EndpointConfigure : Configure USB Endpoint. + int32_t (*EndpointUnconfigure) (uint8_t ep_addr); ///< Pointer to \ref ARM_USBD_EndpointUnconfigure : Unconfigure USB Endpoint. + int32_t (*EndpointStall) (uint8_t ep_addr, bool stall); ///< Pointer to \ref ARM_USBD_EndpointStall : Set/Clear Stall for USB Endpoint. + int32_t (*EndpointTransfer) (uint8_t ep_addr, uint8_t *data, uint32_t num); ///< Pointer to \ref ARM_USBD_EndpointTransfer : Read data from or Write data to USB Endpoint. + uint32_t (*EndpointTransferGetResult) (uint8_t ep_addr); ///< Pointer to \ref ARM_USBD_EndpointTransferGetResult : Get result of USB Endpoint transfer. + int32_t (*EndpointTransferAbort) (uint8_t ep_addr); ///< Pointer to \ref ARM_USBD_EndpointTransferAbort : Abort current USB Endpoint transfer. + uint16_t (*GetFrameNumber) (void); ///< Pointer to \ref ARM_USBD_GetFrameNumber : Get current USB Frame Number. +} const ARM_DRIVER_USBD; + +#endif /* __DOXYGEN_MW__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_USBD_H_ */ diff --git a/CMSIS/Driver/Include/Driver_USBH.h b/CMSIS/Driver/Include/Driver_USBH.h new file mode 100644 index 0000000..a30eaca --- /dev/null +++ b/CMSIS/Driver/Include/Driver_USBH.h @@ -0,0 +1,417 @@ +/* + * Copyright (c) 2013-2017 ARM 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. + * + * $Date: 2. Feb 2017 + * $Revision: V2.2 + * + * Project: USB Host Driver definitions +*/ + +/* History: + * Version 2.2 + * ARM_USBH_PORT_STATE made volatile + * Version 2.1 + * Renamed structure ARM_USBH_EP_HANDLE to ARM_USBH_PIPE_HANDLE + * Renamed functions ARM_USBH_Endpoint... to ARM_USBH_Pipe... + * Renamed function ARM_USBH_SignalEndpointEvent to ARM_USBH_SignalPipeEvent + * Version 2.0 + * Replaced function ARM_USBH_PortPowerOnOff with ARM_USBH_PortVbusOnOff + * Changed function ARM_USBH_EndpointCreate parameters + * Replaced function ARM_USBH_EndpointConfigure with ARM_USBH_EndpointModify + * Replaced function ARM_USBH_EndpointClearHalt with ARM_USBH_EndpointReset + * Replaced function ARM_USBH_URB_Submit with ARM_USBH_EndpointTransfer + * Replaced function ARM_USBH_URB_Abort with ARM_USBH_EndpointTransferAbort + * Added function ARM_USBH_EndpointTransferGetResult + * Added function ARM_USBH_GetFrameNumber + * Changed prefix ARM_DRV -> ARM_DRIVER + * Version 1.20 + * Added API for OHCI/EHCI Host Controller Interface (HCI) + * Version 1.10 + * Namespace prefix ARM_ added + * Version 1.00 + * Initial release + */ + +#ifndef DRIVER_USBH_H_ +#define DRIVER_USBH_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_USB.h" + +#define ARM_USBH_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,2) /* API version */ + + +/** +\brief USB Host Port State +*/ +typedef volatile struct _ARM_USBH_PORT_STATE { + uint32_t connected : 1; ///< USB Host Port connected flag + uint32_t overcurrent : 1; ///< USB Host Port overcurrent flag + uint32_t speed : 2; ///< USB Host Port speed setting (ARM_USB_SPEED_xxx) + uint32_t reserved : 28; +} ARM_USBH_PORT_STATE; + +/** +\brief USB Host Pipe Handle +*/ +typedef uint32_t ARM_USBH_PIPE_HANDLE; +#define ARM_USBH_EP_HANDLE ARM_USBH_PIPE_HANDLE /* Legacy name */ + + +/****** USB Host Packet Information *****/ +#define ARM_USBH_PACKET_TOKEN_Pos 0 +#define ARM_USBH_PACKET_TOKEN_Msk (0x0FUL << ARM_USBH_PACKET_TOKEN_Pos) +#define ARM_USBH_PACKET_SETUP (0x01UL << ARM_USBH_PACKET_TOKEN_Pos) ///< SETUP Packet +#define ARM_USBH_PACKET_OUT (0x02UL << ARM_USBH_PACKET_TOKEN_Pos) ///< OUT Packet +#define ARM_USBH_PACKET_IN (0x03UL << ARM_USBH_PACKET_TOKEN_Pos) ///< IN Packet +#define ARM_USBH_PACKET_PING (0x04UL << ARM_USBH_PACKET_TOKEN_Pos) ///< PING Packet + +#define ARM_USBH_PACKET_DATA_Pos 4 +#define ARM_USBH_PACKET_DATA_Msk (0x0FUL << ARM_USBH_PACKET_DATA_Pos) +#define ARM_USBH_PACKET_DATA0 (0x01UL << ARM_USBH_PACKET_DATA_Pos) ///< DATA0 PID +#define ARM_USBH_PACKET_DATA1 (0x02UL << ARM_USBH_PACKET_DATA_Pos) ///< DATA1 PID + +#define ARM_USBH_PACKET_SPLIT_Pos 8 +#define ARM_USBH_PACKET_SPLIT_Msk (0x0FUL << ARM_USBH_PACKET_SPLIT_Pos) +#define ARM_USBH_PACKET_SSPLIT (0x08UL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet +#define ARM_USBH_PACKET_SSPLIT_S (0x09UL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet: Data Start +#define ARM_USBH_PACKET_SSPLIT_E (0x0AUL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet: Data End +#define ARM_USBH_PACKET_SSPLIT_S_E (0x0BUL << ARM_USBH_PACKET_SPLIT_Pos) ///< SSPLIT Packet: Data All +#define ARM_USBH_PACKET_CSPLIT (0x0CUL << ARM_USBH_PACKET_SPLIT_Pos) ///< CSPLIT Packet + +#define ARM_USBH_PACKET_PRE (1UL << 12) ///< PRE Token + + +/****** USB Host Port Event *****/ +#define ARM_USBH_EVENT_CONNECT (1UL << 0) ///< USB Device Connected to Port +#define ARM_USBH_EVENT_DISCONNECT (1UL << 1) ///< USB Device Disconnected from Port +#define ARM_USBH_EVENT_OVERCURRENT (1UL << 2) ///< USB Device caused Overcurrent +#define ARM_USBH_EVENT_RESET (1UL << 3) ///< USB Reset completed +#define ARM_USBH_EVENT_SUSPEND (1UL << 4) ///< USB Suspend occurred +#define ARM_USBH_EVENT_RESUME (1UL << 5) ///< USB Resume occurred +#define ARM_USBH_EVENT_REMOTE_WAKEUP (1UL << 6) ///< USB Device activated Remote Wakeup + +/****** USB Host Pipe Event *****/ +#define ARM_USBH_EVENT_TRANSFER_COMPLETE (1UL << 0) ///< Transfer completed +#define ARM_USBH_EVENT_HANDSHAKE_NAK (1UL << 1) ///< NAK Handshake received +#define ARM_USBH_EVENT_HANDSHAKE_NYET (1UL << 2) ///< NYET Handshake received +#define ARM_USBH_EVENT_HANDSHAKE_MDATA (1UL << 3) ///< MDATA Handshake received +#define ARM_USBH_EVENT_HANDSHAKE_STALL (1UL << 4) ///< STALL Handshake received +#define ARM_USBH_EVENT_HANDSHAKE_ERR (1UL << 5) ///< ERR Handshake received +#define ARM_USBH_EVENT_BUS_ERROR (1UL << 6) ///< Bus Error detected + + +#ifndef __DOXYGEN_MW__ // exclude from middleware documentation + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_USBH_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_USBH_CAPABILITIES ARM_USBH_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_USBH_CAPABILITIES +*/ +/** + \fn int32_t ARM_USBH_Initialize (ARM_USBH_SignalPortEvent_t cb_port_event, + ARM_USBH_SignalPipeEvent_t cb_pipe_event) + \brief Initialize USB Host Interface. + \param[in] cb_port_event Pointer to \ref ARM_USBH_SignalPortEvent + \param[in] cb_pipe_event Pointer to \ref ARM_USBH_SignalPipeEvent + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_Uninitialize (void) + \brief De-initialize USB Host Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PowerControl (ARM_POWER_STATE state) + \brief Control USB Host Interface Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PortVbusOnOff (uint8_t port, bool vbus) + \brief Root HUB Port VBUS on/off. + \param[in] port Root HUB Port Number + \param[in] vbus + - \b false VBUS off + - \b true VBUS on + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PortReset (uint8_t port) + \brief Do Root HUB Port Reset. + \param[in] port Root HUB Port Number + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PortSuspend (uint8_t port) + \brief Suspend Root HUB Port (stop generating SOFs). + \param[in] port Root HUB Port Number + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PortResume (uint8_t port) + \brief Resume Root HUB Port (start generating SOFs). + \param[in] port Root HUB Port Number + \return \ref execution_status +*/ +/** + \fn ARM_USBH_PORT_STATE ARM_USBH_PortGetState (uint8_t port) + \brief Get current Root HUB Port State. + \param[in] port Root HUB Port Number + \return Port State \ref ARM_USBH_PORT_STATE +*/ +/** + \fn ARM_USBH_PIPE_HANDLE ARM_USBH_PipeCreate (uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size, + uint8_t ep_interval) + \brief Create Pipe in System. + \param[in] dev_addr Device Address + \param[in] dev_speed Device Speed + \param[in] hub_addr Hub Address + \param[in] hub_port Hub Port + \param[in] ep_addr Endpoint Address + - ep_addr.0..3: Address + - ep_addr.7: Direction + \param[in] ep_type Endpoint Type (ARM_USB_ENDPOINT_xxx) + \param[in] ep_max_packet_size Endpoint Maximum Packet Size + \param[in] ep_interval Endpoint Polling Interval + \return Pipe Handle \ref ARM_USBH_PIPE_HANDLE +*/ +/** + \fn int32_t ARM_USBH_PipeModify (ARM_USBH_PIPE_HANDLE pipe_hndl, + uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint16_t ep_max_packet_size) + \brief Modify Pipe in System. + \param[in] pipe_hndl Pipe Handle + \param[in] dev_addr Device Address + \param[in] dev_speed Device Speed + \param[in] hub_addr Hub Address + \param[in] hub_port Hub Port + \param[in] ep_max_packet_size Endpoint Maximum Packet Size + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PipeDelete (ARM_USBH_PIPE_HANDLE pipe_hndl) + \brief Delete Pipe from System. + \param[in] pipe_hndl Pipe Handle + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PipeReset (ARM_USBH_PIPE_HANDLE pipe_hndl) + \brief Reset Pipe. + \param[in] pipe_hndl Pipe Handle + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_PipeTransfer (ARM_USBH_PIPE_HANDLE pipe_hndl, + uint32_t packet, + uint8_t *data, + uint32_t num) + \brief Transfer packets through USB Pipe. + \param[in] pipe_hndl Pipe Handle + \param[in] packet Packet information + \param[in] data Pointer to buffer with data to send or for data to receive + \param[in] num Number of data bytes to transfer + \return \ref execution_status +*/ +/** + \fn uint32_t ARM_USBH_PipeTransferGetResult (ARM_USBH_PIPE_HANDLE pipe_hndl) + \brief Get result of USB Pipe transfer. + \param[in] pipe_hndl Pipe Handle + \return number of successfully transferred data bytes +*/ +/** + \fn int32_t ARM_USBH_PipeTransferAbort (ARM_USBH_PIPE_HANDLE pipe_hndl) + \brief Abort current USB Pipe transfer. + \param[in] pipe_hndl Pipe Handle + \return \ref execution_status +*/ +/** + \fn uint16_t ARM_USBH_GetFrameNumber (void) + \brief Get current USB Frame Number. + \return Frame Number +*/ + +/** + \fn void ARM_USBH_SignalPortEvent (uint8_t port, uint32_t event) + \brief Signal Root HUB Port Event. + \param[in] port Root HUB Port Number + \param[in] event \ref USBH_port_events + \return none +*/ +/** + \fn void ARM_USBH_SignalPipeEvent (ARM_USBH_PIPE_HANDLE pipe_hndl, uint32_t event) + \brief Signal Pipe Event. + \param[in] pipe_hndl Pipe Handle + \param[in] event \ref USBH_pipe_events + \return none +*/ + +typedef void (*ARM_USBH_SignalPortEvent_t) (uint8_t port, uint32_t event); ///< Pointer to \ref ARM_USBH_SignalPortEvent : Signal Root HUB Port Event. +typedef void (*ARM_USBH_SignalPipeEvent_t) (ARM_USBH_PIPE_HANDLE pipe_hndl, uint32_t event); ///< Pointer to \ref ARM_USBH_SignalPipeEvent : Signal Pipe Event. +#define ARM_USBH_SignalEndpointEvent_t ARM_USBH_SignalPipeEvent_t /* Legacy name */ + + +/** +\brief USB Host Driver Capabilities. +*/ +typedef struct _ARM_USBH_CAPABILITIES { + uint32_t port_mask : 15; ///< Root HUB available Ports Mask + uint32_t auto_split : 1; ///< Automatic SPLIT packet handling + uint32_t event_connect : 1; ///< Signal Connect event + uint32_t event_disconnect : 1; ///< Signal Disconnect event + uint32_t event_overcurrent : 1; ///< Signal Overcurrent event + uint32_t reserved : 13; ///< Reserved (must be zero) +} ARM_USBH_CAPABILITIES; + + +/** +\brief Access structure of USB Host Driver. +*/ +typedef struct _ARM_DRIVER_USBH { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USBH_GetVersion : Get driver version. + ARM_USBH_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USBH_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_USBH_SignalPortEvent_t cb_port_event, + ARM_USBH_SignalPipeEvent_t cb_pipe_event); ///< Pointer to \ref ARM_USBH_Initialize : Initialize USB Host Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USBH_Uninitialize : De-initialize USB Host Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USBH_PowerControl : Control USB Host Interface Power. + int32_t (*PortVbusOnOff) (uint8_t port, bool vbus); ///< Pointer to \ref ARM_USBH_PortVbusOnOff : Root HUB Port VBUS on/off. + int32_t (*PortReset) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortReset : Do Root HUB Port Reset. + int32_t (*PortSuspend) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortSuspend : Suspend Root HUB Port (stop generating SOFs). + int32_t (*PortResume) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortResume : Resume Root HUB Port (start generating SOFs). + ARM_USBH_PORT_STATE (*PortGetState) (uint8_t port); ///< Pointer to \ref ARM_USBH_PortGetState : Get current Root HUB Port State. + ARM_USBH_PIPE_HANDLE (*PipeCreate) (uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_max_packet_size, + uint8_t ep_interval); ///< Pointer to \ref ARM_USBH_PipeCreate : Create Pipe in System. + int32_t (*PipeModify) (ARM_USBH_PIPE_HANDLE pipe_hndl, + uint8_t dev_addr, + uint8_t dev_speed, + uint8_t hub_addr, + uint8_t hub_port, + uint16_t ep_max_packet_size); ///< Pointer to \ref ARM_USBH_PipeModify : Modify Pipe in System. + int32_t (*PipeDelete) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeDelete : Delete Pipe from System. + int32_t (*PipeReset) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeReset : Reset Pipe. + int32_t (*PipeTransfer) (ARM_USBH_PIPE_HANDLE pipe_hndl, + uint32_t packet, + uint8_t *data, + uint32_t num); ///< Pointer to \ref ARM_USBH_PipeTransfer : Transfer packets through USB Pipe. + uint32_t (*PipeTransferGetResult) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeTransferGetResult : Get result of USB Pipe transfer. + int32_t (*PipeTransferAbort) (ARM_USBH_PIPE_HANDLE pipe_hndl); ///< Pointer to \ref ARM_USBH_PipeTransferAbort : Abort current USB Pipe transfer. + uint16_t (*GetFrameNumber) (void); ///< Pointer to \ref ARM_USBH_GetFrameNumber : Get current USB Frame Number. +} const ARM_DRIVER_USBH; + + +// HCI (OHCI/EHCI) + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_USBH_HCI_GetVersion (void) + \brief Get USB Host HCI (OHCI/EHCI) driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_USBH_HCI_CAPABILITIES ARM_USBH_HCI_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_USBH_HCI_CAPABILITIES +*/ +/** + \fn int32_t ARM_USBH_HCI_Initialize (ARM_USBH_HCI_Interrupt_t *cb_interrupt) + \brief Initialize USB Host HCI (OHCI/EHCI) Interface. + \param[in] cb_interrupt Pointer to Interrupt Handler Routine + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_HCI_Uninitialize (void) + \brief De-initialize USB Host HCI (OHCI/EHCI) Interface. + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_HCI_PowerControl (ARM_POWER_STATE state) + \brief Control USB Host HCI (OHCI/EHCI) Interface Power. + \param[in] state Power state + \return \ref execution_status +*/ +/** + \fn int32_t ARM_USBH_HCI_PortVbusOnOff (uint8_t port, bool vbus) + \brief USB Host HCI (OHCI/EHCI) Root HUB Port VBUS on/off. + \param[in] port Root HUB Port Number + \param[in] vbus + - \b false VBUS off + - \b true VBUS on + \return \ref execution_status +*/ + +/** + \fn void ARM_USBH_HCI_Interrupt (void) + \brief USB Host HCI Interrupt Handler. + \return none +*/ + +typedef void (*ARM_USBH_HCI_Interrupt_t) (void); ///< Pointer to Interrupt Handler Routine. + + +/** +\brief USB Host HCI (OHCI/EHCI) Driver Capabilities. +*/ +typedef struct _ARM_USBH_HCI_CAPABILITIES { + uint32_t port_mask : 15; ///< Root HUB available Ports Mask + uint32_t reserved : 17; ///< Reserved (must be zero) +} ARM_USBH_HCI_CAPABILITIES; + + +/** + \brief Access structure of USB Host HCI (OHCI/EHCI) Driver. +*/ +typedef struct _ARM_DRIVER_USBH_HCI { + ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_USBH_HCI_GetVersion : Get USB Host HCI (OHCI/EHCI) driver version. + ARM_USBH_HCI_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_USBH_HCI_GetCapabilities : Get driver capabilities. + int32_t (*Initialize) (ARM_USBH_HCI_Interrupt_t cb_interrupt); ///< Pointer to \ref ARM_USBH_HCI_Initialize : Initialize USB Host HCI (OHCI/EHCI) Interface. + int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_USBH_HCI_Uninitialize : De-initialize USB Host HCI (OHCI/EHCI) Interface. + int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_USBH_HCI_PowerControl : Control USB Host HCI (OHCI/EHCI) Interface Power. + int32_t (*PortVbusOnOff) (uint8_t port, bool vbus); ///< Pointer to \ref ARM_USBH_HCI_PortVbusOnOff : USB Host HCI (OHCI/EHCI) Root HUB Port VBUS on/off. +} const ARM_DRIVER_USBH_HCI; + +#endif /* __DOXYGEN_MW__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_USBH_H_ */ diff --git a/CMSIS/Driver/Include/Driver_WiFi.h b/CMSIS/Driver/Include/Driver_WiFi.h new file mode 100644 index 0000000..69a5013 --- /dev/null +++ b/CMSIS/Driver/Include/Driver_WiFi.h @@ -0,0 +1,659 @@ +/* + * Copyright (c) 2019 Arm 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. + * + * $Date: 31. May 2019 + * $Revision: V1.0 + * + * Project: WiFi (Wireless Fidelity Interface) Driver definitions + */ + +/* History: + * Version 1.0 + * Initial release + */ + +#ifndef DRIVER_WIFI_H_ +#define DRIVER_WIFI_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "Driver_Common.h" + +#define ARM_WIFI_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1,0) /* API version */ + +#define _ARM_Driver_WiFi_(n) Driver_WiFi##n +#define ARM_Driver_WiFi_(n) _ARM_Driver_WiFi_(n) + + +/****** WiFi SetOption/GetOption Function Option Codes *****/ +#define ARM_WIFI_BSSID 1U ///< Station/AP Set/Get BSSID of AP to connect or of AP; data = &bssid, len = 6, uint8_t[6] +#define ARM_WIFI_TX_POWER 2U ///< Station/AP Set/Get transmit power; data = &power, len = 4, uint32_t: 0 .. 20 [dBm] +#define ARM_WIFI_LP_TIMER 3U ///< Station Set/Get low-power deep-sleep time; data = &time, len = 4, uint32_t [seconds]: 0 = disable (default) +#define ARM_WIFI_DTIM 4U ///< Station/AP Set/Get DTIM interval; data = &dtim, len = 4, uint32_t [beacons] +#define ARM_WIFI_BEACON 5U ///< AP Set/Get beacon interval; data = &interval, len = 4, uint32_t [ms] +#define ARM_WIFI_MAC 6U ///< Station/AP Set/Get MAC; data = &mac, len = 6, uint8_t[6] +#define ARM_WIFI_IP 7U ///< Station/AP Set/Get IPv4 static/assigned address; data = &ip, len = 4, uint8_t[4] +#define ARM_WIFI_IP_SUBNET_MASK 8U ///< Station/AP Set/Get IPv4 subnet mask; data = &mask, len = 4, uint8_t[4] +#define ARM_WIFI_IP_GATEWAY 9U ///< Station/AP Set/Get IPv4 gateway address; data = &ip, len = 4, uint8_t[4] +#define ARM_WIFI_IP_DNS1 10U ///< Station/AP Set/Get IPv4 primary DNS address; data = &ip, len = 4, uint8_t[4] +#define ARM_WIFI_IP_DNS2 11U ///< Station/AP Set/Get IPv4 secondary DNS address; data = &ip, len = 4, uint8_t[4] +#define ARM_WIFI_IP_DHCP 12U ///< Station/AP Set/Get IPv4 DHCP client/server enable/disable; data = &dhcp, len = 4, uint32_t: 0 = disable, non-zero = enable (default) +#define ARM_WIFI_IP_DHCP_POOL_BEGIN 13U ///< AP Set/Get IPv4 DHCP pool begin address; data = &ip, len = 4, uint8_t[4] +#define ARM_WIFI_IP_DHCP_POOL_END 14U ///< AP Set/Get IPv4 DHCP pool end address; data = &ip, len = 4, uint8_t[4] +#define ARM_WIFI_IP_DHCP_LEASE_TIME 15U ///< AP Set/Get IPv4 DHCP lease time; data = &time, len = 4, uint32_t [seconds] +#define ARM_WIFI_IP6_GLOBAL 16U ///< Station/AP Set/Get IPv6 global address; data = &ip6, len = 16, uint8_t[16] +#define ARM_WIFI_IP6_LINK_LOCAL 17U ///< Station/AP Set/Get IPv6 link local address; data = &ip6, len = 16, uint8_t[16] +#define ARM_WIFI_IP6_SUBNET_PREFIX_LEN 18U ///< Station/AP Set/Get IPv6 subnet prefix length; data = &len, len = 4, uint32_t: 1 .. 127 +#define ARM_WIFI_IP6_GATEWAY 19U ///< Station/AP Set/Get IPv6 gateway address; data = &ip6, len = 16, uint8_t[16] +#define ARM_WIFI_IP6_DNS1 20U ///< Station/AP Set/Get IPv6 primary DNS address; data = &ip6, len = 16, uint8_t[16] +#define ARM_WIFI_IP6_DNS2 21U ///< Station/AP Set/Get IPv6 secondary DNS address; data = &ip6, len = 16, uint8_t[16] +#define ARM_WIFI_IP6_DHCP_MODE 22U ///< Station/AP Set/Get IPv6 DHCPv6 client mode; data = &mode, len = 4, uint32_t: ARM_WIFI_IP6_DHCP_xxx (default Off) + +/****** WiFi Security Type *****/ +#define ARM_WIFI_SECURITY_OPEN 0U ///< Open +#define ARM_WIFI_SECURITY_WEP 1U ///< Wired Equivalent Privacy (WEP) with Pre-Sheared Key (PSK) +#define ARM_WIFI_SECURITY_WPA 2U ///< WiFi Protected Access (WPA) with PSK +#define ARM_WIFI_SECURITY_WPA2 3U ///< WiFi Protected Access II (WPA2) with PSK +#define ARM_WIFI_SECURITY_UNKNOWN 255U ///< Unknown + +/****** WiFi Protected Setup (WPS) Method *****/ +#define ARM_WIFI_WPS_METHOD_NONE 0U ///< Not used +#define ARM_WIFI_WPS_METHOD_PBC 1U ///< Push Button Configuration +#define ARM_WIFI_WPS_METHOD_PIN 2U ///< PIN + +/****** WiFi IPv6 Dynamic Host Configuration Protocol (DHCP) Mode *****/ +#define ARM_WIFI_IP6_DHCP_OFF 0U ///< Static Host Configuration (default) +#define ARM_WIFI_IP6_DHCP_STATELESS 1U ///< Dynamic Host Configuration stateless DHCPv6 +#define ARM_WIFI_IP6_DHCP_STATEFULL 2U ///< Dynamic Host Configuration statefull DHCPv6 + +/****** WiFi Event *****/ +#define ARM_WIFI_EVENT_AP_CONNECT (1UL << 0) ///< Access Point: Station has connected; arg = &mac, mac (uint8_t[6]) +#define ARM_WIFI_EVENT_AP_DISCONNECT (1UL << 1) ///< Access Point: Station has disconnected; arg = &mac, mac (uint8_t[6]) +#define ARM_WIFI_EVENT_ETH_RX_FRAME (1UL << 4) ///< Ethernet Frame Received (in bypass mode only); arg = interface (0 = Station, 1 = Access Point) + + +/** +\brief WiFi Configuration +*/ +typedef struct { + const char *ssid; ///< Pointer to Service Set Identifier (SSID) null-terminated string + const char *pass; ///< Pointer to Password null-terminated string + uint8_t security; ///< Security type (ARM_WIFI_SECURITY_xxx) + uint8_t ch; ///< WiFi Channel (0 = auto, otherwise = exact channel) + uint8_t reserved; ///< Reserved + uint8_t wps_method; ///< WiFi Protected Setup (WPS) method (ARM_WIFI_WPS_METHOD_xxx) + const char *wps_pin; ///< Pointer to WiFi Protected Setup (WPS) PIN null-terminated string +} ARM_WIFI_CONFIG_t; + +/** +\brief WiFi Scan Information +*/ +typedef struct { + char ssid[32+1]; ///< Service Set Identifier (SSID) null-terminated string + uint8_t bssid[6]; ///< Basic Service Set Identifier (BSSID) + uint8_t security; ///< Security type (ARM_WIFI_SECURITY_xxx) + uint8_t ch; ///< WiFi Channel + uint8_t rssi; ///< Received Signal Strength Indicator +} ARM_WIFI_SCAN_INFO_t; + +/** +\brief WiFi Network Information +*/ +typedef struct { + char ssid[32+1]; ///< Service Set Identifier (SSID) null-terminated string + char pass[64+1]; ///< Password null-terminated string + uint8_t security; ///< Security type (ARM_WIFI_SECURITY_xxx) + uint8_t ch; ///< WiFi Channel + uint8_t rssi; ///< Received Signal Strength Indicator +} ARM_WIFI_NET_INFO_t; + +/****** Socket Address Family definitions *****/ +#define ARM_SOCKET_AF_INET 1 ///< IPv4 +#define ARM_SOCKET_AF_INET6 2 ///< IPv6 + +/****** Socket Type definitions *****/ +#define ARM_SOCKET_SOCK_STREAM 1 ///< Stream socket +#define ARM_SOCKET_SOCK_DGRAM 2 ///< Datagram socket + +/****** Socket Protocol definitions *****/ +#define ARM_SOCKET_IPPROTO_TCP 1 ///< TCP +#define ARM_SOCKET_IPPROTO_UDP 2 ///< UDP + +/****** Socket Option definitions *****/ +#define ARM_SOCKET_IO_FIONBIO 1 ///< Non-blocking I/O (Set only, default = 0); opt_val = &nbio, opt_len = sizeof(nbio), nbio (integer): 0=blocking, non-blocking otherwise +#define ARM_SOCKET_SO_RCVTIMEO 2 ///< Receive timeout in ms (default = 0); opt_val = &timeout, opt_len = sizeof(timeout) +#define ARM_SOCKET_SO_SNDTIMEO 3 ///< Send timeout in ms (default = 0); opt_val = &timeout, opt_len = sizeof(timeout) +#define ARM_SOCKET_SO_KEEPALIVE 4 ///< Keep-alive messages (default = 0); opt_val = &keepalive, opt_len = sizeof(keepalive), keepalive (integer): 0=disabled, enabled otherwise +#define ARM_SOCKET_SO_TYPE 5 ///< Socket Type (Get only); opt_val = &socket_type, opt_len = sizeof(socket_type), socket_type (integer): ARM_SOCKET_SOCK_xxx + +/****** Socket Function return codes *****/ +#define ARM_SOCKET_ERROR (-1) ///< Unspecified error +#define ARM_SOCKET_ESOCK (-2) ///< Invalid socket +#define ARM_SOCKET_EINVAL (-3) ///< Invalid argument +#define ARM_SOCKET_ENOTSUP (-4) ///< Operation not supported +#define ARM_SOCKET_ENOMEM (-5) ///< Not enough memory +#define ARM_SOCKET_EAGAIN (-6) ///< Operation would block or timed out +#define ARM_SOCKET_EINPROGRESS (-7) ///< Operation in progress +#define ARM_SOCKET_ETIMEDOUT (-8) ///< Operation timed out +#define ARM_SOCKET_EISCONN (-9) ///< Socket is connected +#define ARM_SOCKET_ENOTCONN (-10) ///< Socket is not connected +#define ARM_SOCKET_ECONNREFUSED (-11) ///< Connection rejected by the peer +#define ARM_SOCKET_ECONNRESET (-12) ///< Connection reset by the peer +#define ARM_SOCKET_ECONNABORTED (-13) ///< Connection aborted locally +#define ARM_SOCKET_EALREADY (-14) ///< Connection already in progress +#define ARM_SOCKET_EADDRINUSE (-15) ///< Address in use +#define ARM_SOCKET_EHOSTNOTFOUND (-16) ///< Host not found + + +// Function documentation +/** + \fn ARM_DRIVER_VERSION ARM_WIFI_GetVersion (void) + \brief Get driver version. + \return \ref ARM_DRIVER_VERSION +*/ +/** + \fn ARM_WIFI_CAPABILITIES ARM_WIFI_GetCapabilities (void) + \brief Get driver capabilities. + \return \ref ARM_WIFI_CAPABILITIES +*/ +/** + \fn int32_t ARM_WIFI_Initialize (ARM_WIFI_SignalEvent_t cb_event) + \brief Initialize WiFi Module. + \param[in] cb_event Pointer to \ref ARM_WIFI_SignalEvent_t + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed +*/ +/** + \fn int32_t ARM_WIFI_Uninitialize (void) + \brief De-initialize WiFi Module. + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed +*/ +/** + \fn int32_t ARM_WIFI_PowerControl (ARM_POWER_STATE state) + \brief Control WiFi Module Power. + \param[in] state Power state + - \ref ARM_POWER_OFF : Power off: no operation possible + - \ref ARM_POWER_LOW : Low-power mode: sleep or deep-sleep depending on \ref ARM_WIFI_LP_TIMER option set + - \ref ARM_POWER_FULL : Power on: full operation at maximum performance + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (invalid state) +*/ +/** + \fn int32_t ARM_WIFI_GetModuleInfo (char *module_info, uint32_t max_len) + \brief Get Module information. + \param[out] module_info Pointer to character buffer were info string will be returned + \param[in] max_len Maximum length of string to return (including null terminator) + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (NULL module_info pointer or max_len equals to 0) +*/ +/** + \fn int32_t ARM_WIFI_SetOption (uint32_t interface, uint32_t option, const void *data, uint32_t len) + \brief Set WiFi Module Options. + \param[in] interface Interface (0 = Station, 1 = Access Point) + \param[in] option Option to set + \param[in] data Pointer to data relevant to selected option + \param[in] len Length of data (in bytes) + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (invalid interface, NULL data pointer or len less than option specifies) +*/ +/** + \fn int32_t ARM_WIFI_GetOption (uint32_t interface, uint32_t option, void *data, uint32_t *len) + \brief Get WiFi Module Options. + \param[in] interface Interface (0 = Station, 1 = Access Point) + \param[in] option Option to get + \param[out] data Pointer to memory where data for selected option will be returned + \param[in,out] len Pointer to length of data (input/output) + - input: maximum length of data that can be returned (in bytes) + - output: length of returned data (in bytes) + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (invalid interface, NULL data or len pointer, or *len less than option specifies) +*/ +/** + \fn int32_t ARM_WIFI_Scan (ARM_WIFI_SCAN_INFO_t scan_info[], uint32_t max_num) + \brief Scan for available networks in range. + \param[out] scan_info Pointer to array of ARM_WIFI_SCAN_INFO_t structures where available Scan Information will be returned + \param[in] max_num Maximum number of Network Information structures to return + \return number of ARM_WIFI_SCAN_INFO_t structures returned or error code + - value >= 0 : Number of ARM_WIFI_SCAN_INFO_t structures returned + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (NULL scan_info pointer or max_num equal to 0) +*/ +/** + \fn int32_t ARM_WIFI_Activate (uint32_t interface, ARM_WIFI_CONFIG_t *config) + \brief Activate interface (Connect to a wireless network or activate an access point). + \param[in] interface Interface (0 = Station, 1 = Access Point) + \param[in] config Pointer to ARM_WIFI_CONFIG_t structure where Configuration parameters are located + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_TIMEOUT : Timeout occurred + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported (security type, channel autodetect or WPS not supported) + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (invalid interface, NULL config pointer or invalid configuration) +*/ +/** + \fn int32_t ARM_WIFI_Deactivate (uint32_t interface) + \brief Deactivate interface (Disconnect from a wireless network or deactivate an access point). + \param[in] interface Interface (0 = Station, 1 = Access Point) + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (invalid interface) +*/ +/** + \fn uint32_t ARM_WIFI_IsConnected (void) + \brief Get station connection status. + \return station connection status + - value != 0: Station connected + - value = 0: Station not connected +*/ +/** + \fn int32_t ARM_WIFI_GetNetInfo (ARM_WIFI_NET_INFO_t *net_info) + \brief Get station Network Information. + \param[out] net_info Pointer to ARM_WIFI_NET_INFO_t structure where station Network Information will be returned + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed (station not connected) + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (invalid interface or NULL net_info pointer) +*/ +/** + \fn int32_t ARM_WIFI_BypassControl (uint32_t interface, uint32_t mode) + \brief Enable or disable bypass (pass-through) mode. Transmit and receive Ethernet frames (IP layer bypassed and WiFi/Ethernet translation). + \param[in] interface Interface (0 = Station, 1 = Access Point) + \param[in] mode + - value = 1: all packets bypass internal IP stack + - value = 0: all packets processed by internal IP stack + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (invalid interface or mode) +*/ +/** + \fn int32_t ARM_WIFI_EthSendFrame (uint32_t interface, const uint8_t *frame, uint32_t len) + \brief Send Ethernet frame (in bypass mode only). + \param[in] interface Interface (0 = Station, 1 = Access Point) + \param[in] frame Pointer to frame buffer with data to send + \param[in] len Frame buffer length in bytes + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_BUSY : Driver is busy + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (invalid interface or NULL frame pointer) +*/ +/** + \fn int32_t ARM_WIFI_EthReadFrame (uint32_t interface, uint8_t *frame, uint32_t len) + \brief Read data of received Ethernet frame (in bypass mode only). + \param[in] interface Interface (0 = Station, 1 = Access Point) + \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 error code + - value >= 0 : Number of data bytes read + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (invalid interface or NULL frame pointer) +*/ +/** + \fn uint32_t ARM_WIFI_EthGetRxFrameSize (uint32_t interface) + \brief Get size of received Ethernet frame (in bypass mode only). + \param[in] interface Interface (0 = Station, 1 = Access Point) + \return number of bytes in received frame +*/ +/** + \fn int32_t ARM_WIFI_SocketCreate (int32_t af, int32_t type, int32_t protocol) + \brief Create a communication socket. + \param[in] af Address family + \param[in] type Socket type + \param[in] protocol Socket protocol + \return status information + - Socket identification number (>=0) + - \ref ARM_SOCKET_EINVAL : Invalid argument + - \ref ARM_SOCKET_ENOTSUP : Operation not supported + - \ref ARM_SOCKET_ENOMEM : Not enough memory + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketBind (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port) + \brief Assign a local address to a socket. + \param[in] socket Socket identification number + \param[in] ip Pointer to local IP address + \param[in] ip_len Length of 'ip' address in bytes + \param[in] port Local port number + \return status information + - 0 : Operation successful + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument (address or socket already bound) + - \ref ARM_SOCKET_EADDRINUSE : Address already in use + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketListen (int32_t socket, int32_t backlog) + \brief Listen for socket connections. + \param[in] socket Socket identification number + \param[in] backlog Number of connection requests that can be queued + \return status information + - 0 : Operation successful + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument (socket not bound) + - \ref ARM_SOCKET_ENOTSUP : Operation not supported + - \ref ARM_SOCKET_EISCONN : Socket is already connected + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketAccept (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port) + \brief Accept a new connection on a socket. + \param[in] socket Socket identification number + \param[out] ip Pointer to buffer where address of connecting socket shall be returned (NULL for none) + \param[in,out] ip_len Pointer to length of 'ip' (or NULL if 'ip' is NULL) + - length of supplied 'ip' on input + - length of stored 'ip' on output + \param[out] port Pointer to buffer where port of connecting socket shall be returned (NULL for none) + \return status information + - socket identification number of accepted socket (>=0) + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument (socket not in listen mode) + - \ref ARM_SOCKET_ENOTSUP : Operation not supported (socket type does not support accepting connections) + - \ref ARM_SOCKET_ECONNRESET : Connection reset by the peer + - \ref ARM_SOCKET_ECONNABORTED : Connection aborted locally + - \ref ARM_SOCKET_EAGAIN : Operation would block or timed out (may be called again) + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketConnect (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port) + \brief Connect a socket to a remote host. + \param[in] socket Socket identification number + \param[in] ip Pointer to remote IP address + \param[in] ip_len Length of 'ip' address in bytes + \param[in] port Remote port number + \return status information + - 0 : Operation successful + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument + - \ref ARM_SOCKET_EALREADY : Connection already in progress + - \ref ARM_SOCKET_EINPROGRESS : Operation in progress + - \ref ARM_SOCKET_EISCONN : Socket is connected + - \ref ARM_SOCKET_ECONNREFUSED : Connection rejected by the peer + - \ref ARM_SOCKET_ECONNABORTED : Connection aborted locally + - \ref ARM_SOCKET_EADDRINUSE : Address already in use + - \ref ARM_SOCKET_ETIMEDOUT : Operation timed out + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketRecv (int32_t socket, void *buf, uint32_t len) + \brief Receive data on a connected socket. + \param[in] socket Socket identification number + \param[out] buf Pointer to buffer where data should be stored + \param[in] len Length of buffer (in bytes) + \return status information + - number of bytes received (>0) + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument (pointer to buffer or length) + - \ref ARM_SOCKET_ENOTCONN : Socket is not connected + - \ref ARM_SOCKET_ECONNRESET : Connection reset by the peer + - \ref ARM_SOCKET_ECONNABORTED : Connection aborted locally + - \ref ARM_SOCKET_EAGAIN : Operation would block or timed out (may be called again) + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketRecvFrom (int32_t socket, void *buf, uint32_t len, uint8_t *ip, uint32_t *ip_len, uint16_t *port) + \brief Receive data on a socket. + \param[in] socket Socket identification number + \param[out] buf Pointer to buffer where data should be stored + \param[in] len Length of buffer (in bytes) + \param[out] ip Pointer to buffer where remote source address shall be returned (NULL for none) + \param[in,out] ip_len Pointer to length of 'ip' (or NULL if 'ip' is NULL) + - length of supplied 'ip' on input + - length of stored 'ip' on output + \param[out] port Pointer to buffer where remote source port shall be returned (NULL for none) + \return status information + - number of bytes received (>0) + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument (pointer to buffer or length) + - \ref ARM_SOCKET_ENOTCONN : Socket is not connected + - \ref ARM_SOCKET_ECONNRESET : Connection reset by the peer + - \ref ARM_SOCKET_ECONNABORTED : Connection aborted locally + - \ref ARM_SOCKET_EAGAIN : Operation would block or timed out (may be called again) + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketSend (int32_t socket, const void *buf, uint32_t len) + \brief Send data on a connected socket. + \param[in] socket Socket identification number + \param[in] buf Pointer to buffer containing data to send + \param[in] len Length of data (in bytes) + \return status information + - number of bytes sent (>0) + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument (pointer to buffer or length) + - \ref ARM_SOCKET_ENOTCONN : Socket is not connected + - \ref ARM_SOCKET_ECONNRESET : Connection reset by the peer + - \ref ARM_SOCKET_ECONNABORTED : Connection aborted locally + - \ref ARM_SOCKET_EAGAIN : Operation would block or timed out (may be called again) + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketSendTo (int32_t socket, const void *buf, uint32_t len, const uint8_t *ip, uint32_t ip_len, uint16_t port) + \brief Send data on a socket. + \param[in] socket Socket identification number + \param[in] buf Pointer to buffer containing data to send + \param[in] len Length of data (in bytes) + \param[in] ip Pointer to remote destination IP address + \param[in] ip_len Length of 'ip' address in bytes + \param[in] port Remote destination port number + \return status information + - number of bytes sent (>0) + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument (pointer to buffer or length) + - \ref ARM_SOCKET_ENOTCONN : Socket is not connected + - \ref ARM_SOCKET_ECONNRESET : Connection reset by the peer + - \ref ARM_SOCKET_ECONNABORTED : Connection aborted locally + - \ref ARM_SOCKET_EAGAIN : Operation would block or timed out (may be called again) + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketGetSockName (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port) + \brief Retrieve local IP address and port of a socket. + \param[in] socket Socket identification number + \param[out] ip Pointer to buffer where local address shall be returned (NULL for none) + \param[in,out] ip_len Pointer to length of 'ip' (or NULL if 'ip' is NULL) + - length of supplied 'ip' on input + - length of stored 'ip' on output + \param[out] port Pointer to buffer where local port shall be returned (NULL for none) + \return status information + - 0 : Operation successful + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument (pointer to buffer or length) + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketGetPeerName (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port) + \brief Retrieve remote IP address and port of a socket + \param[in] socket Socket identification number + \param[out] ip Pointer to buffer where remote address shall be returned (NULL for none) + \param[in,out] ip_len Pointer to length of 'ip' (or NULL if 'ip' is NULL) + - length of supplied 'ip' on input + - length of stored 'ip' on output + \param[out] port Pointer to buffer where remote port shall be returned (NULL for none) + \return status information + - 0 : Operation successful + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument (pointer to buffer or length) + - \ref ARM_SOCKET_ENOTCONN : Socket is not connected + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketGetOpt (int32_t socket, int32_t opt_id, void *opt_val, uint32_t *opt_len) + \brief Get socket option. + \param[in] socket Socket identification number + \param[in] opt_id Option identifier + \param[out] opt_val Pointer to the buffer that will receive the option value + \param[in,out] opt_len Pointer to length of the option value + - length of buffer on input + - length of data on output + \return status information + - 0 : Operation successful + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument + - \ref ARM_SOCKET_ENOTSUP : Operation not supported + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketSetOpt (int32_t socket, int32_t opt_id, const void *opt_val, uint32_t opt_len) + \brief Set socket option. + \param[in] socket Socket identification number + \param[in] opt_id Option identifier + \param[in] opt_val Pointer to the option value + \param[in] opt_len Length of the option value in bytes + \return status information + - 0 : Operation successful + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EINVAL : Invalid argument + - \ref ARM_SOCKET_ENOTSUP : Operation not supported + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketClose (int32_t socket) + \brief Close and release a socket. + \param[in] socket Socket identification number + \return status information + - 0 : Operation successful + - \ref ARM_SOCKET_ESOCK : Invalid socket + - \ref ARM_SOCKET_EAGAIN : Operation would block (may be called again) + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_SocketGetHostByName (const char *name, int32_t af, uint8_t *ip, uint32_t *ip_len) + \brief Retrieve host IP address from host name. + \param[in] name Host name + \param[in] af Address family + \param[out] ip Pointer to buffer where resolved IP address shall be returned + \param[in,out] ip_len Pointer to length of 'ip' + - length of supplied 'ip' on input + - length of stored 'ip' on output + \return status information + - 0 : Operation successful + - \ref ARM_SOCKET_EINVAL : Invalid argument + - \ref ARM_SOCKET_ENOTSUP : Operation not supported + - \ref ARM_SOCKET_ETIMEDOUT : Operation timed out + - \ref ARM_SOCKET_EHOSTNOTFOUND : Host not found + - \ref ARM_SOCKET_ERROR : Unspecified error +*/ +/** + \fn int32_t ARM_WIFI_Ping (const uint8_t *ip, uint32_t ip_len) + \brief Probe remote host with Ping command. + \param[in] ip Pointer to remote host IP address + \param[in] ip_len Length of 'ip' address in bytes + \return execution status + - \ref ARM_DRIVER_OK : Operation successful + - \ref ARM_DRIVER_ERROR : Operation failed + - \ref ARM_DRIVER_ERROR_TIMEOUT : Timeout occurred + - \ref ARM_DRIVER_ERROR_UNSUPPORTED : Operation not supported + - \ref ARM_DRIVER_ERROR_PARAMETER : Parameter error (NULL ip pointer or ip_len different than 4 or 16) +*/ +/** + \fn void ARM_WIFI_SignalEvent (uint32_t event, void *arg) + \brief Signal WiFi Events. + \param[in] event \ref wifi_event notification mask + \param[in] arg Pointer to argument of signaled event + \return none +*/ + +typedef void (*ARM_WIFI_SignalEvent_t) (uint32_t event, void *arg); ///< Pointer to \ref ARM_WIFI_SignalEvent : Signal WiFi Event. + + +/** +\brief WiFi Driver Capabilities. +*/ +typedef struct { + uint32_t station : 1; ///< Station + uint32_t ap : 1; ///< Access Point + uint32_t station_ap : 1; ///< Concurrent Station and Access Point + uint32_t wps_station : 1; ///< WiFi Protected Setup (WPS) for Station + uint32_t wps_ap : 1; ///< WiFi Protected Setup (WPS) for Access Point + uint32_t event_ap_connect : 1; ///< Access Point: event generated on Station connect + uint32_t event_ap_disconnect : 1; ///< Access Point: event generated on Station disconnect + uint32_t event_eth_rx_frame : 1; ///< Event generated on Ethernet frame reception in bypass mode + uint32_t bypass_mode : 1; ///< Bypass or pass-through mode (Ethernet interface) + uint32_t ip : 1; ///< IP (UDP/TCP) (Socket interface) + uint32_t ip6 : 1; ///< IPv6 (Socket interface) + uint32_t ping : 1; ///< Ping (ICMP) + uint32_t reserved : 20; ///< Reserved (must be zero) +} ARM_WIFI_CAPABILITIES; + +/** +\brief Access structure of the WiFi Driver. +*/ +typedef struct { + ARM_DRIVER_VERSION (*GetVersion) (void); + ARM_WIFI_CAPABILITIES (*GetCapabilities) (void); + int32_t (*Initialize) (ARM_WIFI_SignalEvent_t cb_event); + int32_t (*Uninitialize) (void); + int32_t (*PowerControl) (ARM_POWER_STATE state); + int32_t (*GetModuleInfo) (char *module_info, uint32_t max_len); + int32_t (*SetOption) (uint32_t interface, uint32_t option, const void *data, uint32_t len); + int32_t (*GetOption) (uint32_t interface, uint32_t option, void *data, uint32_t *len); + int32_t (*Scan) (ARM_WIFI_SCAN_INFO_t scan_info[], uint32_t max_num); + int32_t (*Activate) (uint32_t interface, const ARM_WIFI_CONFIG_t *config); + int32_t (*Deactivate) (uint32_t interface); + uint32_t (*IsConnected) (void); + int32_t (*GetNetInfo) (ARM_WIFI_NET_INFO_t *net_info); + int32_t (*BypassControl) (uint32_t interface, uint32_t mode); + int32_t (*EthSendFrame) (uint32_t interface, const uint8_t *frame, uint32_t len); + int32_t (*EthReadFrame) (uint32_t interface, uint8_t *frame, uint32_t len); + uint32_t (*EthGetRxFrameSize) (uint32_t interface); + int32_t (*SocketCreate) (int32_t af, int32_t type, int32_t protocol); + int32_t (*SocketBind) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port); + int32_t (*SocketListen) (int32_t socket, int32_t backlog); + int32_t (*SocketAccept) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port); + int32_t (*SocketConnect) (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port); + int32_t (*SocketRecv) (int32_t socket, void *buf, uint32_t len); + int32_t (*SocketRecvFrom) (int32_t socket, void *buf, uint32_t len, uint8_t *ip, uint32_t *ip_len, uint16_t *port); + int32_t (*SocketSend) (int32_t socket, const void *buf, uint32_t len); + int32_t (*SocketSendTo) (int32_t socket, const void *buf, uint32_t len, const uint8_t *ip, uint32_t ip_len, uint16_t port); + int32_t (*SocketGetSockName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port); + int32_t (*SocketGetPeerName) (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port); + int32_t (*SocketGetOpt) (int32_t socket, int32_t opt_id, void *opt_val, uint32_t *opt_len); + int32_t (*SocketSetOpt) (int32_t socket, int32_t opt_id, const void *opt_val, uint32_t opt_len); + int32_t (*SocketClose) (int32_t socket); + int32_t (*SocketGetHostByName) (const char *name, int32_t af, uint8_t *ip, uint32_t *ip_len); + int32_t (*Ping) (const uint8_t *ip, uint32_t ip_len); +} const ARM_DRIVER_WIFI; + +#ifdef __cplusplus +} +#endif + +#endif /* DRIVER_WIFI_H_ */ diff --git a/CMSIS/LICENSE.txt b/CMSIS/LICENSE.txt new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/CMSIS/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. diff --git a/CMSIS/RTOS2/Include/cmsis_os2.h b/CMSIS/RTOS2/Include/cmsis_os2.h new file mode 100644 index 0000000..e0b602c --- /dev/null +++ b/CMSIS/RTOS2/Include/cmsis_os2.h @@ -0,0 +1,756 @@ +/* + * Copyright (c) 2013-2018 Arm 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. + * + * ---------------------------------------------------------------------- + * + * $Date: 18. June 2018 + * $Revision: V2.1.3 + * + * Project: CMSIS-RTOS2 API + * Title: cmsis_os2.h header file + * + * Version 2.1.3 + * Additional functions allowed to be called from Interrupt Service Routines: + * - osThreadGetId + * Version 2.1.2 + * Additional functions allowed to be called from Interrupt Service Routines: + * - osKernelGetInfo, osKernelGetState + * Version 2.1.1 + * Additional functions allowed to be called from Interrupt Service Routines: + * - osKernelGetTickCount, osKernelGetTickFreq + * Changed Kernel Tick type to uint32_t: + * - updated: osKernelGetTickCount, osDelayUntil + * Version 2.1.0 + * Support for critical and uncritical sections (nesting safe): + * - updated: osKernelLock, osKernelUnlock + * - added: osKernelRestoreLock + * Updated Thread and Event Flags: + * - changed flags parameter and return type from int32_t to uint32_t + * Version 2.0.0 + * Initial Release + *---------------------------------------------------------------------------*/ + +#ifndef CMSIS_OS2_H_ +#define CMSIS_OS2_H_ + +#ifndef __NO_RETURN +#if defined(__CC_ARM) +#define __NO_RETURN __declspec(noreturn) +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __NO_RETURN __attribute__((__noreturn__)) +#elif defined(__GNUC__) +#define __NO_RETURN __attribute__((__noreturn__)) +#elif defined(__ICCARM__) +#define __NO_RETURN __noreturn +#else +#define __NO_RETURN +#endif +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + +// ==== Enumerations, structures, defines ==== + +/// Version information. +typedef struct { + uint32_t api; ///< API version (major.minor.rev: mmnnnrrrr dec). + uint32_t kernel; ///< Kernel version (major.minor.rev: mmnnnrrrr dec). +} osVersion_t; + +/// Kernel state. +typedef enum { + osKernelInactive = 0, ///< Inactive. + osKernelReady = 1, ///< Ready. + osKernelRunning = 2, ///< Running. + osKernelLocked = 3, ///< Locked. + osKernelSuspended = 4, ///< Suspended. + osKernelError = -1, ///< Error. + osKernelReserved = 0x7FFFFFFFU ///< Prevents enum down-size compiler optimization. +} osKernelState_t; + +/// Thread state. +typedef enum { + osThreadInactive = 0, ///< Inactive. + osThreadReady = 1, ///< Ready. + osThreadRunning = 2, ///< Running. + osThreadBlocked = 3, ///< Blocked. + osThreadTerminated = 4, ///< Terminated. + osThreadError = -1, ///< Error. + osThreadReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization. +} osThreadState_t; + +/// Priority values. +typedef enum { + osPriorityNone = 0, ///< No priority (not initialized). + osPriorityIdle = 1, ///< Reserved for Idle thread. + osPriorityLow = 8, ///< Priority: low + osPriorityLow1 = 8+1, ///< Priority: low + 1 + osPriorityLow2 = 8+2, ///< Priority: low + 2 + osPriorityLow3 = 8+3, ///< Priority: low + 3 + osPriorityLow4 = 8+4, ///< Priority: low + 4 + osPriorityLow5 = 8+5, ///< Priority: low + 5 + osPriorityLow6 = 8+6, ///< Priority: low + 6 + osPriorityLow7 = 8+7, ///< Priority: low + 7 + osPriorityBelowNormal = 16, ///< Priority: below normal + osPriorityBelowNormal1 = 16+1, ///< Priority: below normal + 1 + osPriorityBelowNormal2 = 16+2, ///< Priority: below normal + 2 + osPriorityBelowNormal3 = 16+3, ///< Priority: below normal + 3 + osPriorityBelowNormal4 = 16+4, ///< Priority: below normal + 4 + osPriorityBelowNormal5 = 16+5, ///< Priority: below normal + 5 + osPriorityBelowNormal6 = 16+6, ///< Priority: below normal + 6 + osPriorityBelowNormal7 = 16+7, ///< Priority: below normal + 7 + osPriorityNormal = 24, ///< Priority: normal + osPriorityNormal1 = 24+1, ///< Priority: normal + 1 + osPriorityNormal2 = 24+2, ///< Priority: normal + 2 + osPriorityNormal3 = 24+3, ///< Priority: normal + 3 + osPriorityNormal4 = 24+4, ///< Priority: normal + 4 + osPriorityNormal5 = 24+5, ///< Priority: normal + 5 + osPriorityNormal6 = 24+6, ///< Priority: normal + 6 + osPriorityNormal7 = 24+7, ///< Priority: normal + 7 + osPriorityAboveNormal = 32, ///< Priority: above normal + osPriorityAboveNormal1 = 32+1, ///< Priority: above normal + 1 + osPriorityAboveNormal2 = 32+2, ///< Priority: above normal + 2 + osPriorityAboveNormal3 = 32+3, ///< Priority: above normal + 3 + osPriorityAboveNormal4 = 32+4, ///< Priority: above normal + 4 + osPriorityAboveNormal5 = 32+5, ///< Priority: above normal + 5 + osPriorityAboveNormal6 = 32+6, ///< Priority: above normal + 6 + osPriorityAboveNormal7 = 32+7, ///< Priority: above normal + 7 + osPriorityHigh = 40, ///< Priority: high + osPriorityHigh1 = 40+1, ///< Priority: high + 1 + osPriorityHigh2 = 40+2, ///< Priority: high + 2 + osPriorityHigh3 = 40+3, ///< Priority: high + 3 + osPriorityHigh4 = 40+4, ///< Priority: high + 4 + osPriorityHigh5 = 40+5, ///< Priority: high + 5 + osPriorityHigh6 = 40+6, ///< Priority: high + 6 + osPriorityHigh7 = 40+7, ///< Priority: high + 7 + osPriorityRealtime = 48, ///< Priority: realtime + osPriorityRealtime1 = 48+1, ///< Priority: realtime + 1 + osPriorityRealtime2 = 48+2, ///< Priority: realtime + 2 + osPriorityRealtime3 = 48+3, ///< Priority: realtime + 3 + osPriorityRealtime4 = 48+4, ///< Priority: realtime + 4 + osPriorityRealtime5 = 48+5, ///< Priority: realtime + 5 + osPriorityRealtime6 = 48+6, ///< Priority: realtime + 6 + osPriorityRealtime7 = 48+7, ///< Priority: realtime + 7 + osPriorityISR = 56, ///< Reserved for ISR deferred thread. + osPriorityError = -1, ///< System cannot determine priority or illegal priority. + osPriorityReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization. +} osPriority_t; + +/// Entry point of a thread. +typedef void (*osThreadFunc_t) (void *argument); + +/// Timer callback function. +typedef void (*osTimerFunc_t) (void *argument); + +/// Timer type. +typedef enum { + osTimerOnce = 0, ///< One-shot timer. + osTimerPeriodic = 1 ///< Repeating timer. +} osTimerType_t; + +// Timeout value. +#define osWaitForever 0xFFFFFFFFU ///< Wait forever timeout value. + +// Flags options (\ref osThreadFlagsWait and \ref osEventFlagsWait). +#define osFlagsWaitAny 0x00000000U ///< Wait for any flag (default). +#define osFlagsWaitAll 0x00000001U ///< Wait for all flags. +#define osFlagsNoClear 0x00000002U ///< Do not clear flags which have been specified to wait for. + +// Flags errors (returned by osThreadFlagsXxxx and osEventFlagsXxxx). +#define osFlagsError 0x80000000U ///< Error indicator. +#define osFlagsErrorUnknown 0xFFFFFFFFU ///< osError (-1). +#define osFlagsErrorTimeout 0xFFFFFFFEU ///< osErrorTimeout (-2). +#define osFlagsErrorResource 0xFFFFFFFDU ///< osErrorResource (-3). +#define osFlagsErrorParameter 0xFFFFFFFCU ///< osErrorParameter (-4). +#define osFlagsErrorISR 0xFFFFFFFAU ///< osErrorISR (-6). + +// Thread attributes (attr_bits in \ref osThreadAttr_t). +#define osThreadDetached 0x00000000U ///< Thread created in detached mode (default) +#define osThreadJoinable 0x00000001U ///< Thread created in joinable mode + +// Mutex attributes (attr_bits in \ref osMutexAttr_t). +#define osMutexRecursive 0x00000001U ///< Recursive mutex. +#define osMutexPrioInherit 0x00000002U ///< Priority inherit protocol. +#define osMutexRobust 0x00000008U ///< Robust mutex. + +/// Status code values returned by CMSIS-RTOS functions. +typedef enum { + osOK = 0, ///< Operation completed successfully. + osError = -1, ///< Unspecified RTOS error: run-time error but no other error message fits. + osErrorTimeout = -2, ///< Operation not completed within the timeout period. + osErrorResource = -3, ///< Resource not available. + osErrorParameter = -4, ///< Parameter error. + osErrorNoMemory = -5, ///< System is out of memory: it was impossible to allocate or reserve memory for the operation. + osErrorISR = -6, ///< Not allowed in ISR context: the function cannot be called from interrupt service routines. + osStatusReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization. +} osStatus_t; + + +/// \details Thread ID identifies the thread. +typedef void *osThreadId_t; + +/// \details Timer ID identifies the timer. +typedef void *osTimerId_t; + +/// \details Event Flags ID identifies the event flags. +typedef void *osEventFlagsId_t; + +/// \details Mutex ID identifies the mutex. +typedef void *osMutexId_t; + +/// \details Semaphore ID identifies the semaphore. +typedef void *osSemaphoreId_t; + +/// \details Memory Pool ID identifies the memory pool. +typedef void *osMemoryPoolId_t; + +/// \details Message Queue ID identifies the message queue. +typedef void *osMessageQueueId_t; + + +#ifndef TZ_MODULEID_T +#define TZ_MODULEID_T +/// \details Data type that identifies secure software modules called by a process. +typedef uint32_t TZ_ModuleId_t; +#endif + + +/// Attributes structure for thread. +typedef struct { + const char *name; ///< name of the thread + uint32_t attr_bits; ///< attribute bits + void *cb_mem; ///< memory for control block + uint32_t cb_size; ///< size of provided memory for control block + void *stack_mem; ///< memory for stack + uint32_t stack_size; ///< size of stack + osPriority_t priority; ///< initial thread priority (default: osPriorityNormal) + TZ_ModuleId_t tz_module; ///< TrustZone module identifier + uint32_t reserved; ///< reserved (must be 0) +} osThreadAttr_t; + +/// Attributes structure for timer. +typedef struct { + const char *name; ///< name of the timer + uint32_t attr_bits; ///< attribute bits + void *cb_mem; ///< memory for control block + uint32_t cb_size; ///< size of provided memory for control block +} osTimerAttr_t; + +/// Attributes structure for event flags. +typedef struct { + const char *name; ///< name of the event flags + uint32_t attr_bits; ///< attribute bits + void *cb_mem; ///< memory for control block + uint32_t cb_size; ///< size of provided memory for control block +} osEventFlagsAttr_t; + +/// Attributes structure for mutex. +typedef struct { + const char *name; ///< name of the mutex + uint32_t attr_bits; ///< attribute bits + void *cb_mem; ///< memory for control block + uint32_t cb_size; ///< size of provided memory for control block +} osMutexAttr_t; + +/// Attributes structure for semaphore. +typedef struct { + const char *name; ///< name of the semaphore + uint32_t attr_bits; ///< attribute bits + void *cb_mem; ///< memory for control block + uint32_t cb_size; ///< size of provided memory for control block +} osSemaphoreAttr_t; + +/// Attributes structure for memory pool. +typedef struct { + const char *name; ///< name of the memory pool + uint32_t attr_bits; ///< attribute bits + void *cb_mem; ///< memory for control block + uint32_t cb_size; ///< size of provided memory for control block + void *mp_mem; ///< memory for data storage + uint32_t mp_size; ///< size of provided memory for data storage +} osMemoryPoolAttr_t; + +/// Attributes structure for message queue. +typedef struct { + const char *name; ///< name of the message queue + uint32_t attr_bits; ///< attribute bits + void *cb_mem; ///< memory for control block + uint32_t cb_size; ///< size of provided memory for control block + void *mq_mem; ///< memory for data storage + uint32_t mq_size; ///< size of provided memory for data storage +} osMessageQueueAttr_t; + + +// ==== Kernel Management Functions ==== + +/// Initialize the RTOS Kernel. +/// \return status code that indicates the execution status of the function. +osStatus_t osKernelInitialize (void); + +/// Get RTOS Kernel Information. +/// \param[out] version pointer to buffer for retrieving version information. +/// \param[out] id_buf pointer to buffer for retrieving kernel identification string. +/// \param[in] id_size size of buffer for kernel identification string. +/// \return status code that indicates the execution status of the function. +osStatus_t osKernelGetInfo (osVersion_t *version, char *id_buf, uint32_t id_size); + +/// Get the current RTOS Kernel state. +/// \return current RTOS Kernel state. +osKernelState_t osKernelGetState (void); + +/// Start the RTOS Kernel scheduler. +/// \return status code that indicates the execution status of the function. +osStatus_t osKernelStart (void); + +/// Lock the RTOS Kernel scheduler. +/// \return previous lock state (1 - locked, 0 - not locked, error code if negative). +int32_t osKernelLock (void); + +/// Unlock the RTOS Kernel scheduler. +/// \return previous lock state (1 - locked, 0 - not locked, error code if negative). +int32_t osKernelUnlock (void); + +/// Restore the RTOS Kernel scheduler lock state. +/// \param[in] lock lock state obtained by \ref osKernelLock or \ref osKernelUnlock. +/// \return new lock state (1 - locked, 0 - not locked, error code if negative). +int32_t osKernelRestoreLock (int32_t lock); + +/// Suspend the RTOS Kernel scheduler. +/// \return time in ticks, for how long the system can sleep or power-down. +uint32_t osKernelSuspend (void); + +/// Resume the RTOS Kernel scheduler. +/// \param[in] sleep_ticks time in ticks for how long the system was in sleep or power-down mode. +void osKernelResume (uint32_t sleep_ticks); + +/// Get the RTOS kernel tick count. +/// \return RTOS kernel current tick count. +uint32_t osKernelGetTickCount (void); + +/// Get the RTOS kernel tick frequency. +/// \return frequency of the kernel tick in hertz, i.e. kernel ticks per second. +uint32_t osKernelGetTickFreq (void); + +/// Get the RTOS kernel system timer count. +/// \return RTOS kernel current system timer count as 32-bit value. +uint32_t osKernelGetSysTimerCount (void); + +/// Get the RTOS kernel system timer frequency. +/// \return frequency of the system timer in hertz, i.e. timer ticks per second. +uint32_t osKernelGetSysTimerFreq (void); + + +// ==== Thread Management Functions ==== + +/// Create a thread and add it to Active Threads. +/// \param[in] func thread function. +/// \param[in] argument pointer that is passed to the thread function as start argument. +/// \param[in] attr thread attributes; NULL: default values. +/// \return thread ID for reference by other functions or NULL in case of error. +osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr); + +/// Get name of a thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return name as null-terminated string. +const char *osThreadGetName (osThreadId_t thread_id); + +/// Return the thread ID of the current running thread. +/// \return thread ID for reference by other functions or NULL in case of error. +osThreadId_t osThreadGetId (void); + +/// Get current thread state of a thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return current thread state of the specified thread. +osThreadState_t osThreadGetState (osThreadId_t thread_id); + +/// Get stack size of a thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return stack size in bytes. +uint32_t osThreadGetStackSize (osThreadId_t thread_id); + +/// Get available stack space of a thread based on stack watermark recording during execution. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return remaining stack space in bytes. +uint32_t osThreadGetStackSpace (osThreadId_t thread_id); + +/// Change priority of a thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \param[in] priority new priority value for the thread function. +/// \return status code that indicates the execution status of the function. +osStatus_t osThreadSetPriority (osThreadId_t thread_id, osPriority_t priority); + +/// Get current priority of a thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return current priority value of the specified thread. +osPriority_t osThreadGetPriority (osThreadId_t thread_id); + +/// Pass control to next thread that is in state \b READY. +/// \return status code that indicates the execution status of the function. +osStatus_t osThreadYield (void); + +/// Suspend execution of a thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return status code that indicates the execution status of the function. +osStatus_t osThreadSuspend (osThreadId_t thread_id); + +/// Resume execution of a thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return status code that indicates the execution status of the function. +osStatus_t osThreadResume (osThreadId_t thread_id); + +/// Detach a thread (thread storage can be reclaimed when thread terminates). +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return status code that indicates the execution status of the function. +osStatus_t osThreadDetach (osThreadId_t thread_id); + +/// Wait for specified thread to terminate. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return status code that indicates the execution status of the function. +osStatus_t osThreadJoin (osThreadId_t thread_id); + +/// Terminate execution of current running thread. +__NO_RETURN void osThreadExit (void); + +/// Terminate execution of a thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \return status code that indicates the execution status of the function. +osStatus_t osThreadTerminate (osThreadId_t thread_id); + +/// Get number of active threads. +/// \return number of active threads. +uint32_t osThreadGetCount (void); + +/// Enumerate active threads. +/// \param[out] thread_array pointer to array for retrieving thread IDs. +/// \param[in] array_items maximum number of items in array for retrieving thread IDs. +/// \return number of enumerated threads. +uint32_t osThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items); + + +// ==== Thread Flags Functions ==== + +/// Set the specified Thread Flags of a thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadNew or \ref osThreadGetId. +/// \param[in] flags specifies the flags of the thread that shall be set. +/// \return thread flags after setting or error code if highest bit set. +uint32_t osThreadFlagsSet (osThreadId_t thread_id, uint32_t flags); + +/// Clear the specified Thread Flags of current running thread. +/// \param[in] flags specifies the flags of the thread that shall be cleared. +/// \return thread flags before clearing or error code if highest bit set. +uint32_t osThreadFlagsClear (uint32_t flags); + +/// Get the current Thread Flags of current running thread. +/// \return current thread flags. +uint32_t osThreadFlagsGet (void); + +/// Wait for one or more Thread Flags of the current running thread to become signaled. +/// \param[in] flags specifies the flags to wait for. +/// \param[in] options specifies flags options (osFlagsXxxx). +/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. +/// \return thread flags before clearing or error code if highest bit set. +uint32_t osThreadFlagsWait (uint32_t flags, uint32_t options, uint32_t timeout); + + +// ==== Generic Wait Functions ==== + +/// Wait for Timeout (Time Delay). +/// \param[in] ticks \ref CMSIS_RTOS_TimeOutValue "time ticks" value +/// \return status code that indicates the execution status of the function. +osStatus_t osDelay (uint32_t ticks); + +/// Wait until specified time. +/// \param[in] ticks absolute time in ticks +/// \return status code that indicates the execution status of the function. +osStatus_t osDelayUntil (uint32_t ticks); + + +// ==== Timer Management Functions ==== + +/// Create and Initialize a timer. +/// \param[in] func function pointer to callback function. +/// \param[in] type \ref osTimerOnce for one-shot or \ref osTimerPeriodic for periodic behavior. +/// \param[in] argument argument to the timer callback function. +/// \param[in] attr timer attributes; NULL: default values. +/// \return timer ID for reference by other functions or NULL in case of error. +osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr); + +/// Get name of a timer. +/// \param[in] timer_id timer ID obtained by \ref osTimerNew. +/// \return name as null-terminated string. +const char *osTimerGetName (osTimerId_t timer_id); + +/// Start or restart a timer. +/// \param[in] timer_id timer ID obtained by \ref osTimerNew. +/// \param[in] ticks \ref CMSIS_RTOS_TimeOutValue "time ticks" value of the timer. +/// \return status code that indicates the execution status of the function. +osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks); + +/// Stop a timer. +/// \param[in] timer_id timer ID obtained by \ref osTimerNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osTimerStop (osTimerId_t timer_id); + +/// Check if a timer is running. +/// \param[in] timer_id timer ID obtained by \ref osTimerNew. +/// \return 0 not running, 1 running. +uint32_t osTimerIsRunning (osTimerId_t timer_id); + +/// Delete a timer. +/// \param[in] timer_id timer ID obtained by \ref osTimerNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osTimerDelete (osTimerId_t timer_id); + + +// ==== Event Flags Management Functions ==== + +/// Create and Initialize an Event Flags object. +/// \param[in] attr event flags attributes; NULL: default values. +/// \return event flags ID for reference by other functions or NULL in case of error. +osEventFlagsId_t osEventFlagsNew (const osEventFlagsAttr_t *attr); + +/// Get name of an Event Flags object. +/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. +/// \return name as null-terminated string. +const char *osEventFlagsGetName (osEventFlagsId_t ef_id); + +/// Set the specified Event Flags. +/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. +/// \param[in] flags specifies the flags that shall be set. +/// \return event flags after setting or error code if highest bit set. +uint32_t osEventFlagsSet (osEventFlagsId_t ef_id, uint32_t flags); + +/// Clear the specified Event Flags. +/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. +/// \param[in] flags specifies the flags that shall be cleared. +/// \return event flags before clearing or error code if highest bit set. +uint32_t osEventFlagsClear (osEventFlagsId_t ef_id, uint32_t flags); + +/// Get the current Event Flags. +/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. +/// \return current event flags. +uint32_t osEventFlagsGet (osEventFlagsId_t ef_id); + +/// Wait for one or more Event Flags to become signaled. +/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. +/// \param[in] flags specifies the flags to wait for. +/// \param[in] options specifies flags options (osFlagsXxxx). +/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. +/// \return event flags before clearing or error code if highest bit set. +uint32_t osEventFlagsWait (osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout); + +/// Delete an Event Flags object. +/// \param[in] ef_id event flags ID obtained by \ref osEventFlagsNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osEventFlagsDelete (osEventFlagsId_t ef_id); + + +// ==== Mutex Management Functions ==== + +/// Create and Initialize a Mutex object. +/// \param[in] attr mutex attributes; NULL: default values. +/// \return mutex ID for reference by other functions or NULL in case of error. +osMutexId_t osMutexNew (const osMutexAttr_t *attr); + +/// Get name of a Mutex object. +/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. +/// \return name as null-terminated string. +const char *osMutexGetName (osMutexId_t mutex_id); + +/// Acquire a Mutex or timeout if it is locked. +/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. +/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. +/// \return status code that indicates the execution status of the function. +osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout); + +/// Release a Mutex that was acquired by \ref osMutexAcquire. +/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osMutexRelease (osMutexId_t mutex_id); + +/// Get Thread which owns a Mutex object. +/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. +/// \return thread ID of owner thread or NULL when mutex was not acquired. +osThreadId_t osMutexGetOwner (osMutexId_t mutex_id); + +/// Delete a Mutex object. +/// \param[in] mutex_id mutex ID obtained by \ref osMutexNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osMutexDelete (osMutexId_t mutex_id); + + +// ==== Semaphore Management Functions ==== + +/// Create and Initialize a Semaphore object. +/// \param[in] max_count maximum number of available tokens. +/// \param[in] initial_count initial number of available tokens. +/// \param[in] attr semaphore attributes; NULL: default values. +/// \return semaphore ID for reference by other functions or NULL in case of error. +osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr); + +/// Get name of a Semaphore object. +/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. +/// \return name as null-terminated string. +const char *osSemaphoreGetName (osSemaphoreId_t semaphore_id); + +/// Acquire a Semaphore token or timeout if no tokens are available. +/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. +/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. +/// \return status code that indicates the execution status of the function. +osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout); + +/// Release a Semaphore token up to the initial maximum count. +/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id); + +/// Get current Semaphore token count. +/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. +/// \return number of tokens available. +uint32_t osSemaphoreGetCount (osSemaphoreId_t semaphore_id); + +/// Delete a Semaphore object. +/// \param[in] semaphore_id semaphore ID obtained by \ref osSemaphoreNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osSemaphoreDelete (osSemaphoreId_t semaphore_id); + + +// ==== Memory Pool Management Functions ==== + +/// Create and Initialize a Memory Pool object. +/// \param[in] block_count maximum number of memory blocks in memory pool. +/// \param[in] block_size memory block size in bytes. +/// \param[in] attr memory pool attributes; NULL: default values. +/// \return memory pool ID for reference by other functions or NULL in case of error. +osMemoryPoolId_t osMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr); + +/// Get name of a Memory Pool object. +/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. +/// \return name as null-terminated string. +const char *osMemoryPoolGetName (osMemoryPoolId_t mp_id); + +/// Allocate a memory block from a Memory Pool. +/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. +/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. +/// \return address of the allocated memory block or NULL in case of no memory is available. +void *osMemoryPoolAlloc (osMemoryPoolId_t mp_id, uint32_t timeout); + +/// Return an allocated memory block back to a Memory Pool. +/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. +/// \param[in] block address of the allocated memory block to be returned to the memory pool. +/// \return status code that indicates the execution status of the function. +osStatus_t osMemoryPoolFree (osMemoryPoolId_t mp_id, void *block); + +/// Get maximum number of memory blocks in a Memory Pool. +/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. +/// \return maximum number of memory blocks. +uint32_t osMemoryPoolGetCapacity (osMemoryPoolId_t mp_id); + +/// Get memory block size in a Memory Pool. +/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. +/// \return memory block size in bytes. +uint32_t osMemoryPoolGetBlockSize (osMemoryPoolId_t mp_id); + +/// Get number of memory blocks used in a Memory Pool. +/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. +/// \return number of memory blocks used. +uint32_t osMemoryPoolGetCount (osMemoryPoolId_t mp_id); + +/// Get number of memory blocks available in a Memory Pool. +/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. +/// \return number of memory blocks available. +uint32_t osMemoryPoolGetSpace (osMemoryPoolId_t mp_id); + +/// Delete a Memory Pool object. +/// \param[in] mp_id memory pool ID obtained by \ref osMemoryPoolNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osMemoryPoolDelete (osMemoryPoolId_t mp_id); + + +// ==== Message Queue Management Functions ==== + +/// Create and Initialize a Message Queue object. +/// \param[in] msg_count maximum number of messages in queue. +/// \param[in] msg_size maximum message size in bytes. +/// \param[in] attr message queue attributes; NULL: default values. +/// \return message queue ID for reference by other functions or NULL in case of error. +osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr); + +/// Get name of a Message Queue object. +/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. +/// \return name as null-terminated string. +const char *osMessageQueueGetName (osMessageQueueId_t mq_id); + +/// Put a Message into a Queue or timeout if Queue is full. +/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. +/// \param[in] msg_ptr pointer to buffer with message to put into a queue. +/// \param[in] msg_prio message priority. +/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. +/// \return status code that indicates the execution status of the function. +osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout); + +/// Get a Message from a Queue or timeout if Queue is empty. +/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. +/// \param[out] msg_ptr pointer to buffer for message to get from a queue. +/// \param[out] msg_prio pointer to buffer for message priority or NULL. +/// \param[in] timeout \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. +/// \return status code that indicates the execution status of the function. +osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout); + +/// Get maximum number of messages in a Message Queue. +/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. +/// \return maximum number of messages. +uint32_t osMessageQueueGetCapacity (osMessageQueueId_t mq_id); + +/// Get maximum message size in a Memory Pool. +/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. +/// \return maximum message size in bytes. +uint32_t osMessageQueueGetMsgSize (osMessageQueueId_t mq_id); + +/// Get number of queued messages in a Message Queue. +/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. +/// \return number of queued messages. +uint32_t osMessageQueueGetCount (osMessageQueueId_t mq_id); + +/// Get number of available slots for messages in a Message Queue. +/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. +/// \return number of available slots for messages. +uint32_t osMessageQueueGetSpace (osMessageQueueId_t mq_id); + +/// Reset a Message Queue to initial empty state. +/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osMessageQueueReset (osMessageQueueId_t mq_id); + +/// Delete a Message Queue object. +/// \param[in] mq_id message queue ID obtained by \ref osMessageQueueNew. +/// \return status code that indicates the execution status of the function. +osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id); + + +#ifdef __cplusplus +} +#endif + +#endif // CMSIS_OS2_H_ diff --git a/CMSIS/RTOS2/Include/os_tick.h b/CMSIS/RTOS2/Include/os_tick.h new file mode 100644 index 0000000..8f7cdf6 --- /dev/null +++ b/CMSIS/RTOS2/Include/os_tick.h @@ -0,0 +1,71 @@ +/**************************************************************************//** + * @file os_tick.h + * @brief CMSIS OS Tick header file + * @version V1.0.1 + * @date 24. November 2017 + ******************************************************************************/ +/* + * Copyright (c) 2017-2017 ARM 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. + */ + +#ifndef OS_TICK_H +#define OS_TICK_H + +#include + +/// IRQ Handler. +#ifndef IRQHANDLER_T +#define IRQHANDLER_T +typedef void (*IRQHandler_t) (void); +#endif + +/// Setup OS Tick timer to generate periodic RTOS Kernel Ticks +/// \param[in] freq tick frequency in Hz +/// \param[in] handler tick IRQ handler +/// \return 0 on success, -1 on error. +int32_t OS_Tick_Setup (uint32_t freq, IRQHandler_t handler); + +/// Enable OS Tick timer interrupt +void OS_Tick_Enable (void); + +/// Disable OS Tick timer interrupt +void OS_Tick_Disable (void); + +/// Acknowledge execution of OS Tick timer interrupt +void OS_Tick_AcknowledgeIRQ (void); + +/// Get OS Tick timer IRQ number +/// \return OS Tick IRQ number +int32_t OS_Tick_GetIRQn (void); + +/// Get OS Tick timer clock frequency +/// \return OS Tick timer clock frequency in Hz +uint32_t OS_Tick_GetClock (void); + +/// Get OS Tick timer interval reload value +/// \return OS Tick timer interval reload value +uint32_t OS_Tick_GetInterval (void); + +/// Get OS Tick timer counter value +/// \return OS Tick timer counter value +uint32_t OS_Tick_GetCount (void); + +/// Get OS Tick timer overflow status +/// \return OS Tick overflow status (1 - overflow, 0 - no overflow). +uint32_t OS_Tick_GetOverflow (void); + +#endif /* OS_TICK_H */ diff --git a/COPYING-BSD-3 b/COPYING-BSD-3 new file mode 100644 index 0000000..de461d9 --- /dev/null +++ b/COPYING-BSD-3 @@ -0,0 +1,33 @@ +The BSD 3 Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/LPC845_manifest_v3_9.xml b/LPC845_manifest_v3_9.xml new file mode 100644 index 0000000..963c0f0 --- /dev/null +++ b/LPC845_manifest_v3_9.xml @@ -0,0 +1,3688 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LPC845 Breakout Board for LPC84x family MCUs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LPCXpresso Development Board for the LPC84x family of MCUs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Low-Cost Microcontrollers (MCUs) based on Arm Cortex-M0+ Core + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SW-Content-Register.txt b/SW-Content-Register.txt new file mode 100644 index 0000000..ea22ea6 --- /dev/null +++ b/SW-Content-Register.txt @@ -0,0 +1,114 @@ +Release Name: MCUXpresso Software Development Kit (SDK) +Release Version: 2.11.0 +Package License: LA_OPT_NXP_Software_License.txt - Additional Distribution License granted, license in Section 2.3 applies + +SDK_Peripheral_Driver Name: SDK Peripheral Driver + Version: 2.x.x + Outgoing License: BSD-3-Clause + License File: COPYING-BSD-3 + Format: source code + Description: Peripheral drivers are designed for + the most common use cases identified for the + underlying hardware block. + Location: devices//drivers + Origin: NXP (BSD-3-Clause) + +SDK_Examples Name: SDK examples + Version: NA + Outgoing License: BSD-3-Clause + License File: COPYING-BSD-3 + Format: source code, binary, project files, linker + files + Description: SDK out of box examples to show how + to use peripheral drivers and integrate + middleware. + Location: boards// + Origin: NXP (BSD-3-Clause) + +SDK_Device Name: SDK SoC files + Version: NA + Outgoing License: BSD-3-Clause + License File: COPYING-BSD-3 + Format: source code, linker files + Description: Device system files, template files, + IDE related startup and linker files. + Location: devices// + Origin: NXP (BSD-3-Clause) + +cmsis Name: CMSIS + Version: 5.6.0 + Outgoing License: Apache License 2.0 + License File: CMSIS/LICENSE.txt + Format: source code + Description: Vendor-independent hardware + abstraction layer for microcontrollers that are + based on Arm Cortex processors, distributed by + ARM. cores + Location: CMSIS/ + Origin: ARM (Apache-2.0) - + https://github.com/ARM-software/CMSIS_5/releases/t + ag/5.6.0 + +cmsis_gpio Name: CMSIS GPIO Interface + Version: 2.0.0 + Outgoing License: BSD-3-Clause + License File: COPYING-BSD-3 + Format: source code + Description: CMSIS Driver style GPIO interface + definition created by NXP. + Location: CMSIS/Driver/Include/Driver_GPIO.h + Origin: NXP (BSD-3-Clause) + +SDK_Components Name: SDK components and board peripheral drivers + Version: NA + Outgoing License: BSD-3-Clause + License File: COPYING-BSD-3 + Format: source code + Description: SDK components and board peripheral + drivers, for example, flash and codec drivers. + Location: components/ + Origin: NXP (BSD-3-Clause) + +rtcesl Name: rtcesl + Version: 4.7 (CM0,CM4,CM7,CM33) + 4.5 (DSC) + Outgoing License: BSD-3-Clause + License File: COPYING-BSD-3 + Format: object code & header files + Description: NXP Real Time Control Embedded + Software Library. + Location: middleware/rtcesl + Origin: NXP (BSD-3-Clause) + +freemaster Name: FreeMASTER + Version: 3.0.5 + Outgoing License: LA_OPT_NXP_Software_License.txt + - Additional distribution license granted - + License in Section 2.3 applies + License File: + middleware/freemaster/license/LA_OPT_NXP_Software_ + License.txt + Format: source code & header files + Description: FreeMASTER communication driver + Location: middleware/freemaster/src + Origin: NXP + +freemaster-examples Name: FreeMASTER + Version: 3.0.5 + Outgoing License: BSD-3-Clause + License File: COPYING-BSD-3 + Format: source code & header files + Description: FreeMASTER example applications + Location: boards//freemaster_examples + Origin: NXP + +freertos_corehttp name: FreeRTOS coreHTTP library + version: 2.0.1 + Outgoing License: MIT + License File: + rtos/freertos/librarires/coreHTTP/LICENSE + Format: source code, header files + Description: C language HTTP client library + designed for embedded platforms + Location: rtos/freertos/libraries/coreHTTP + Origin: FreeRTOS - + https://github.com/FreeRTOS/coreHTTP diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/CMakeLists.txt b/boards/lpc845breakout/demo_apps/hello_world/armgcc/CMakeLists.txt new file mode 100644 index 0000000..c789a88 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/CMakeLists.txt @@ -0,0 +1,110 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(hello_world) + +set(MCUX_SDK_PROJECT_NAME hello_world.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +"${ProjDirPath}/../hello_world.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_reset_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(utility_assert_lite_LPC845) + +include(utility_debug_console_lite_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/LPC845_flash.ld b/boards/lpc845breakout/demo_apps/hello_world/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_all.bat b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_all.sh b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_debug.bat b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_debug.sh b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_release.bat b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_release.sh b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/clean.bat b/boards/lpc845breakout/demo_apps/hello_world/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/clean.sh b/boards/lpc845breakout/demo_apps/hello_world/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/demo_apps/hello_world/armgcc/flags.cmake b/boards/lpc845breakout/demo_apps/hello_world/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/demo_apps/hello_world/board.c b/boards/lpc845breakout/demo_apps/hello_world/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/demo_apps/hello_world/board.h b/boards/lpc845breakout/demo_apps/hello_world/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/demo_apps/hello_world/clock_config.c b/boards/lpc845breakout/demo_apps/hello_world/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/hello_world/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + LPC845 + LPC845M301JBD48 + LPC845BREAKOUT + ksdk2_0 + + + + Configuration imported from C:\Users\mcu-sdk-2.0\boards\lpc845breakout\demo_apps\led_blinky\iar + + + true + false + false + + + + + 6.0.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configures pin routing and optionally pin electrical features. + + true + BOARD_ + core0 + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + 6.0.1 + + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + true + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + false + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + false + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + false + + + + + + N/A + + + + + + N/A + + + + + + + N/A + + + + + + \ No newline at end of file diff --git a/boards/lpc845breakout/demo_apps/led_blinky/led_blinky_v3_9.xml b/boards/lpc845breakout/demo_apps/led_blinky/led_blinky_v3_9.xml new file mode 100644 index 0000000..e0815c9 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/led_blinky/led_blinky_v3_9.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/demo_apps/led_blinky/pin_mux.c b/boards/lpc845breakout/demo_apps/led_blinky/pin_mux.c new file mode 100644 index 0000000..482f207 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/led_blinky/pin_mux.c @@ -0,0 +1,142 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT +pin_labels: +- {pin_num: '11', pin_signal: PIO1_0/CAPT_X1, label: 'LD1[3]/CN1[31]/PIO1_0/CAPT_X1', identifier: LED_GREEN} +- {pin_num: '14', pin_signal: PIO1_1/CAPT_X2, label: 'LD1[4]/CN1[30]/PIO1_1/CAPT_X2', identifier: LED_BLUE} +- {pin_num: '16', pin_signal: PIO1_2/CAPT_X3, label: 'LD1[2]/CN1[29]/PIO1_2/CAPT_X3', identifier: LED_RED} +- {pin_num: '1', pin_signal: PIO1_8/CAPT_YL, label: S1/PIO1_8/CAPT_YL, identifier: CAPY_LOW} +- {pin_num: '2', pin_signal: PIO0_13/ADC_10, label: 'CN1[26]/PIO0_13/ADC_10'} +- {pin_num: '3', pin_signal: PIO1_9/CAPT_YH, label: S1/PIO1_9/CAPT_YH, identifier: CAPY_HIGH} +- {pin_num: '4', pin_signal: PIO0_12, label: 'K1/CN1[25]/PIO0_12', identifier: K1} +- {pin_num: '5', pin_signal: RESETN/PIO0_5, label: 'K2/CN3[10]/CN1[9]/CN1[34]/RESET/PIO0_5', identifier: K2} +- {pin_num: '6', pin_signal: PIO0_4/ADC_11, label: 'K3/CN1[35]/PIO0_4/ADC_11/TRSTN/WAKEUP', identifier: K3} +- {pin_num: '7', pin_signal: PIO0_28/WKTCLKIN, label: 'CN1[14]/PIO0_28/WKTCLKIN'} +- {pin_num: '8', pin_signal: SWCLK/PIO0_3, label: 'CN3[4]/CN1[36]/SWCLK/PIO0_3/TCK'} +- {pin_num: '9', pin_signal: PIO0_31/CAPT_X0, label: S1/PIO0_31/CAPT_X0, identifier: CAPX} +- {pin_num: '10', pin_signal: SWDIO/PIO0_2, label: 'CN3[2]/CN1[37]/SWDIO/PIO0_2/TMS'} +- {pin_num: '12', pin_signal: PIO0_11/I2C0_SDA, label: 'CN1[24]/PIO0_11/I2C0_SDA'} +- {pin_num: '13', pin_signal: PIO0_10/I2C0_SCL, label: 'CN1[23]/PIO0_10/I2C0_SCL'} +- {pin_num: '15', pin_signal: PIO0_16, label: 'CN1[1]/PIO0_16'} +- {pin_num: '17', pin_signal: PIO0_27, label: 'CN1[13]/PIO0_27'} +- {pin_num: '18', pin_signal: PIO0_26, label: 'CN1[12]/PIO0_26'} +- {pin_num: '19', pin_signal: PIO0_25, label: 'CN1[11]/PIO0_25', identifier: DEBUG_UART_TX} +- {pin_num: '20', pin_signal: PIO0_24, label: 'CN1[10]/PIO0_24', identifier: DEBUG_UART_RX} +- {pin_num: '21', pin_signal: PIO1_3/CAPT_X4, label: PIO1_3/CAPT_X4} +- {pin_num: '22', pin_signal: PIO0_15, label: 'CN1[28]/PIO0_15'} +- {pin_num: '23', pin_signal: PIO1_4/CAPT_X5, label: PIO1_4/CAPT_X5} +- {pin_num: '24', pin_signal: PIO0_1/ACMP_I2/CLKIN, label: 'CN1[38]/PIO0_1/ACMP_I2/CLKIN/TDI'} +- {pin_num: '25', pin_signal: PIO0_9/XTALOUT, label: 'CN1[18]/CN1[22]/PIO0_9/XTALOUT'} +- {pin_num: '26', pin_signal: PIO0_8/XTALIN, label: 'CN1[19]/CN1[21]/PIO0_8/XTALIN'} +- {pin_num: '27', pin_signal: PIO1_5/CAPT_X6, label: PIO1_5/CAPT_X6} +- {pin_num: '28', pin_signal: PIO1_6/CAPT_X7, label: PIO1_6/CAPT_X7} +- {pin_num: '29', pin_signal: VDD29, label: VDD, identifier: CPU_VDD} +- {pin_num: '30', pin_signal: VSS30, label: VSS} +- {pin_num: '31', pin_signal: VREFN, label: FB2/VREFN} +- {pin_num: '32', pin_signal: VREFP, label: FB1/VREFP} +- {pin_num: '33', pin_signal: PIO0_7/ADC_0, label: 'CN1[32]/RV1/PIO0_7/ADC_0'} +- {pin_num: '34', pin_signal: PIO0_6/ADC_1/ACMPVREF, label: 'CN1[33]/PIO0_6/ADC_1/ACMPVREF'} +- {pin_num: '35', pin_signal: PIO1_7/CAPT_X8, label: PIO1_7/CAPT_X8} +- {pin_num: '36', pin_signal: PIO0_0/ACMP_I1, label: 'CN1[39]/PIO0_0/ACMP_I1/TDO'} +- {pin_num: '37', pin_signal: PIO0_14/ACMP_I3/ADC_2, label: 'CN1[27]/PIO0_14/ACMP_I3/ADC_2'} +- {pin_num: '38', pin_signal: PIO0_29/DACOUT_1, label: 'CN1[15]/PIO0_29/DACOUT_1'} +- {pin_num: '39', pin_signal: PIO0_23/ADC_3/ACMP_I4, label: 'CN1[8]/PIO0_23/ADC_3/ACMP_I4'} +- {pin_num: '40', pin_signal: VDDA, label: FB1/VDDA, identifier: VDDA} +- {pin_num: '41', pin_signal: VSSA, label: FB2/VSSA, identifier: VSSA} +- {pin_num: '42', pin_signal: PIO0_30/ACMP_I5, label: S1/PIO0_30/ACMP_I5, identifier: CAPY_R} +- {pin_num: '43', pin_signal: PIO0_22/ADC_4, label: 'CN1[7]/PIO0_22/ADC_4'} +- {pin_num: '44', pin_signal: PIO0_21/ADC_5, label: 'CN1[6]/PIO0_21/ADC_5'} +- {pin_num: '45', pin_signal: PIO0_20/ADC_6, label: 'CN1[5]/PIO0_20/ADC_6'} +- {pin_num: '46', pin_signal: PIO0_19/ADC_7, label: 'CN1[4]/PIO0_19/ADC_7'} +- {pin_num: '47', pin_signal: PIO0_18/ADC_8, label: 'CN1[3]/PIO0_18/ADC_8'} +- {pin_num: '48', pin_signal: PIO0_17/ADC_9/DACOUT_0, label: 'CN1[2]/PIO0_17/ADC_9/DACOUT_0'} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_gpio.h" +#include "fsl_iocon.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', prefix: BOARD_, coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '16', peripheral: GPIO, signal: 'PIO1, 2', pin_signal: PIO1_2/CAPT_X3, direction: OUTPUT, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, + smode: bypass, clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables the clock for the GPIO1 module */ + CLOCK_EnableClock(kCLOCK_Gpio1); + + gpio_pin_config_t LED_RED_config = { + .pinDirection = kGPIO_DigitalOutput, + .outputLogic = 0U, + }; + /* Initialize GPIO functionality on pin PIO1_2 (pin 16) */ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_PORT, BOARD_LED_RED_PIN, &LED_RED_config); + + const uint32_t LED_RED = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN2 (coords: 16) is configured as GPIO, PIO1, 2. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_2, LED_RED); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/demo_apps/led_blinky/pin_mux.h b/boards/lpc845breakout/demo_apps/led_blinky/pin_mux.h new file mode 100644 index 0000000..0a56559 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/led_blinky/pin_mux.h @@ -0,0 +1,70 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! @name PIO1_2 (number 16), LD1[2]/CN1[29]/PIO1_2/CAPT_X3 + @{ */ + +/* Symbols to be used with GPIO driver */ +#define BOARD_LED_RED_GPIO GPIO /*!<@brief GPIO peripheral base pointer */ +#define BOARD_LED_RED_GPIO_PIN_MASK (1U << 2U) /*!<@brief GPIO pin mask */ +#define BOARD_LED_RED_PORT 1U /*!<@brief PORT device index: 1 */ +#define BOARD_LED_RED_PIN 2U /*!<@brief PORT pin number */ +#define BOARD_LED_RED_PIN_MASK (1U << 2U) /*!<@brief PORT pin mask */ + /* @} */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/demo_apps/led_blinky/readme.txt b/boards/lpc845breakout/demo_apps/led_blinky/readme.txt new file mode 100644 index 0000000..b3f018d --- /dev/null +++ b/boards/lpc845breakout/demo_apps/led_blinky/readme.txt @@ -0,0 +1,38 @@ +Overview +======== +The LED Blinky demo application provides a sanity check for the new SDK build environments and board bring up. The LED Blinky demo +uses the systick interrupt to realize the function of timing delay. The example takes turns to shine the LED. The purpose of this +demo is to provide a simple project for debugging and further development. +The code of this demo has been prepared and updated for use with the MCUXpresso Configuration Tools (Pins/Clocks/Peripherals). + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +When the demo runs successfully, you will find the LD1 RED is blinking. diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/CMakeLists.txt b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/CMakeLists.txt new file mode 100644 index 0000000..2c7975a --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/CMakeLists.txt @@ -0,0 +1,114 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(power_mode_switch_lpc) + +set(MCUX_SDK_PROJECT_NAME power_mode_switch_lpc.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +"${ProjDirPath}/../power_mode_switch_lpc.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_pint_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_wkt_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_reset_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/LPC845_flash.ld b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_all.bat b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_all.sh b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_debug.bat b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_debug.sh b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_release.bat b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_release.sh b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/clean.bat b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/clean.sh b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/flags.cmake b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/board.c b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/board.h b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/clock_config.c b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/demo_apps/power_mode_switch_lpc/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/CMakeLists.txt new file mode 100644 index 0000000..d5a1350 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(acomp_interrupt) + +set(MCUX_SDK_PROJECT_NAME acomp_interrupt.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../acomp_interrupt.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_acomp_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/board.c b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/board.h b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/clock_config.c b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/acomp/acomp_interrupt/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_ADC_BASE ADC0 +#define DEMO_ADC_SAMPLE_CHANNEL_NUMBER 0U +#define DEMO_ADC_CLOCK_SOURCE kCLOCK_Fro +#define DEMO_ADC_CLOCK_DIVIDER 1U + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void ADC_Configuration(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +adc_result_info_t adcResultInfoStruct; +const uint32_t g_Adc_12bitFullRange = 4096U; + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Main function + */ +int main(void) +{ + /* Initialize board hardware. */ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach FRO clock to ADC0. */ + CLOCK_Select(kADC_Clk_From_Fro); + CLOCK_SetClkDivider(kCLOCK_DivAdcClk, 1U); + /* Power on ADC0. */ + POWER_DisablePD(kPDRUNCFG_PD_ADC0); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + PRINTF("ADC basic example.\r\n"); + +#if !(defined(FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC) && FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC) + uint32_t frequency = 0U; + /* Calibration after power up. */ +#if defined(FSL_FEATURE_ADC_HAS_CALIB_REG) && FSL_FEATURE_ADC_HAS_CALIB_REG + DEMO_ADC_BASE->CTRL |= ADC_CTRL_BYPASSCAL_MASK; + frequency = CLOCK_GetFreq(kCLOCK_BusClk); + if (true == ADC_DoOffsetCalibration(DEMO_ADC_BASE, frequency)) +#else +#if defined(SYSCON_ADCCLKDIV_DIV_MASK) + frequency = CLOCK_GetFreq(DEMO_ADC_CLOCK_SOURCE) / CLOCK_GetClkDivider(kCLOCK_DivAdcClk); +#else + frequency = CLOCK_GetFreq(DEMO_ADC_CLOCK_SOURCE); +#endif /* SYSCON_ADCCLKDIV_DIV_MASK */ + if (true == ADC_DoSelfCalibration(DEMO_ADC_BASE, frequency)) +#endif /* FSL_FEATURE_ADC_HAS_CALIB_REG */ + { + PRINTF("ADC Calibration Done.\r\n"); + } + else + { + PRINTF("ADC Calibration Failed.\r\n"); + } +#endif /* FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC */ + + /* Configure the converter and work mode. */ + ADC_Configuration(); + PRINTF("Configuration Done.\r\n"); + +#if defined(FSL_FEATURE_ADC_HAS_CTRL_RESOL) & FSL_FEATURE_ADC_HAS_CTRL_RESOL + PRINTF("ADC Full Range: %d\r\n", g_Adc_12bitFullRange); +#endif /* FSL_FEATURE_ADC_HAS_CTRL_RESOL */ + while (1) + { + /* Get the input from terminal and trigger the converter by software. */ + GETCHAR(); + ADC_DoSoftwareTriggerConvSeqA(DEMO_ADC_BASE); + + /* Wait for the converter to be done. */ + while (!ADC_GetChannelConversionResult(DEMO_ADC_BASE, DEMO_ADC_SAMPLE_CHANNEL_NUMBER, &adcResultInfoStruct)) + { + } + PRINTF("adcResultInfoStruct.result = %d\r\n", adcResultInfoStruct.result); + PRINTF("adcResultInfoStruct.channelNumber = %d\r\n", adcResultInfoStruct.channelNumber); + PRINTF("adcResultInfoStruct.overrunFlag = %d\r\n", adcResultInfoStruct.overrunFlag ? 1U : 0U); + PRINTF("\r\n"); + } +} + +static void ADC_Configuration(void) +{ + adc_config_t adcConfigStruct; + adc_conv_seq_config_t adcConvSeqConfigStruct; + +/* Configure the converter. */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE) & FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE + adcConfigStruct.clockMode = kADC_ClockSynchronousMode; /* Using sync clock source. */ +#endif /* FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE */ + adcConfigStruct.clockDividerNumber = DEMO_ADC_CLOCK_DIVIDER; +#if defined(FSL_FEATURE_ADC_HAS_CTRL_RESOL) & FSL_FEATURE_ADC_HAS_CTRL_RESOL + adcConfigStruct.resolution = kADC_Resolution12bit; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_RESOL */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL) & FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL + adcConfigStruct.enableBypassCalibration = false; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_TSAMP) & FSL_FEATURE_ADC_HAS_CTRL_TSAMP + adcConfigStruct.sampleTimeNumber = 0U; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_TSAMP */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE) & FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE + adcConfigStruct.enableLowPowerMode = false; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE */ +#if defined(FSL_FEATURE_ADC_HAS_TRIM_REG) & FSL_FEATURE_ADC_HAS_TRIM_REG + adcConfigStruct.voltageRange = kADC_HighVoltageRange; +#endif /* FSL_FEATURE_ADC_HAS_TRIM_REG */ + ADC_Init(DEMO_ADC_BASE, &adcConfigStruct); + +#if !(defined(FSL_FEATURE_ADC_HAS_NO_INSEL) && FSL_FEATURE_ADC_HAS_NO_INSEL) + /* Use the temperature sensor input to channel 0. */ + ADC_EnableTemperatureSensor(DEMO_ADC_BASE, true); +#endif /* FSL_FEATURE_ADC_HAS_NO_INSEL. */ + + /* Enable channel DEMO_ADC_SAMPLE_CHANNEL_NUMBER's conversion in Sequence A. */ + adcConvSeqConfigStruct.channelMask = + (1U << DEMO_ADC_SAMPLE_CHANNEL_NUMBER); /* Includes channel DEMO_ADC_SAMPLE_CHANNEL_NUMBER. */ + adcConvSeqConfigStruct.triggerMask = 0U; + adcConvSeqConfigStruct.triggerPolarity = kADC_TriggerPolarityPositiveEdge; + adcConvSeqConfigStruct.enableSingleStep = false; + adcConvSeqConfigStruct.enableSyncBypass = false; + adcConvSeqConfigStruct.interruptMode = kADC_InterruptForEachSequence; + ADC_SetConvSeqAConfig(DEMO_ADC_BASE, &adcConvSeqConfigStruct); + ADC_EnableConvSeqA(DEMO_ADC_BASE, true); /* Enable the conversion sequence A. */ + /* Clear the result register. */ + ADC_DoSoftwareTriggerConvSeqA(DEMO_ADC_BASE); + while (!ADC_GetChannelConversionResult(DEMO_ADC_BASE, DEMO_ADC_SAMPLE_CHANNEL_NUMBER, &adcResultInfoStruct)) + { + } + ADC_GetConvSeqAGlobalConversionResult(DEMO_ADC_BASE, &adcResultInfoStruct); +} diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/lpc_adc_basic_v3_9.xml b/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/lpc_adc_basic_v3_9.xml new file mode 100644 index 0000000..0ba58e0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/lpc_adc_basic_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/pin_mux.c b/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/pin_mux.c new file mode 100644 index 0000000..ea66cd8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/pin_mux.c @@ -0,0 +1,131 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '33', peripheral: ADC0, signal: 'CH, 0', pin_signal: PIO0_7/ADC_0, mode: inactive, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + const uint32_t IOCON_INDEX_PIO0_7_config = (/* No addition pin function */ + IOCON_PIO_MODE_INACT | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN7 (coords: 33) is configured as ADC0, CH, 0. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_7, IOCON_INDEX_PIO0_7_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* ADC_CHN0 connect to P0_7 */ + SWM_SetFixedPinSelect(SWM0, kSWM_ADC_CHN0, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/pin_mux.h b/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/pin_mux.h new file mode 100644 index 0000000..20cf424 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/pin_mux.h @@ -0,0 +1,60 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/readme.txt b/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/readme.txt new file mode 100644 index 0000000..9dab1fc --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_basic/readme.txt @@ -0,0 +1,97 @@ +Overview +======== + +The lpc_adc_basic example shows how to use LPC ADC driver in the simplest way. + +In this example, the sensor is used to created the input analog signal. +When user type in any key from the keyboard, the software trigger API is called to start the conversion. +Then it polls the conversion sequence A's flag till the conversion is completed. When the conversion is +completed, just print the conversion result to terminal. + +Project Information +1.what are ADC conversion sequences? + A conversion sequence is a single pass through a series of A/D conversions performed on a selected set of + A/D channels. Software can set-up two independent conversion sequences, either of which can be triggered + by software or by a transition on one of the hardware triggers. Each sequence can be triggered by a different + hardware trigger. One of these conversion sequences is referred to as the A sequence and the other as the B + sequence. It is not necessary to employ both sequences. An optional single-step mode allows advancing through + the channels of a sequence one at a time on each successive occurrence of a trigger. The user can select whether + a trigger on the B sequence can interrupt an already-in-progress A sequence. The B sequence, however, can never be + interrupted by an A trigger. + +2. How to use software-triggered conversion? + There are two ways that software can trigger a conversion sequence: + 1. Start Bit: The first way to software-trigger an sequence is by setting the START bit in + the corresponding SEQn_CTRL register. The response to this is identical to + occurrence of a hardware trigger on that sequence. Specifically, one cycle of + conversions through that conversion sequence will be immediately triggered except + as indicated above. (In this example, we use this way.) + 2. Burst Mode: The other way to initiate conversions is to set the BURST bit in the + SEQn_CTRL register. As long as this bit is 1 the designated conversion sequence will + be continuously and repetitively cycled through. Any new software or hardware trigger + on this sequence will be ignored. + +Program Flow +1.This example demonstrates how to configure the A sequences with polling, assigning one channel with software + trigger, you can configure channel via "DEMO_ADC_SAMPLE_CHANNEL_NUMBER". + +2.Before configuration of the ADC begins, the ADC is put through a self-calibration cycle. + +3.After ADC channels are assigned to each of the sequences, the software trigger is chosen. Setting + SEQA_CTRL_START to '1' will trigger sequence A. + +4.After ADC channels are assigned to each of the sequences, if the user enters any key via terminal, software trigger will start. + +5.Read the corresponding DATAVALID field with polling to judge whether the conversion completes and the result is ready. + If the result is ready, the example will printf result information to terminal. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +- ADC CH0 input signal 32(PIO0-7). + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +Adjust the potentiometer and press any key from keyboard to trigger the conversion. +The log below shows the output of the ADC basic driver example in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ADC basic example. +ADC Calibration Done. +Configuration Done. +adcResultInfoStruct.result = 675 +adcResultInfoStruct.channelNumber = 0 +adcResultInfoStruct.overrunFlag = 0 + +adcResultInfoStruct.result = 676 +adcResultInfoStruct.channelNumber = 0 +adcResultInfoStruct.overrunFlag = 0 + +adcResultInfoStruct.result = 675 +adcResultInfoStruct.channelNumber = 0 +adcResultInfoStruct.overrunFlag = 0 + +... +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/CMakeLists.txt new file mode 100644 index 0000000..7e67c6c --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(lpc_adc_burst) + +set(MCUX_SDK_PROJECT_NAME lpc_adc_burst.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../fsl_adc_burst.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_adc_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/board.c b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/board.h b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/clock_config.c b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_burst/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_ADC_BASE ADC0 +#define DEMO_ADC_SAMPLE_CHANNEL_NUMBER 0U +#define DEMO_ADC_CLOCK_SOURCE kCLOCK_Fro +#define kINPUTMUX_Adc0SeqaIrqToDma kINPUTMUX_AdcASeqaIrqToDma +#define DEMO_ADC_CLOCK_DIVIDER 1U +#define DEMO_DMA_ADC_CHANNEL 0U +#define DEMO_DMA_BASE DMA0 +#define DMA_DESCRIPTOR_NUM 2U +#define DEMO_ADC_DATA_REG_ADDR (uint32_t)(&(DEMO_ADC_BASE->DAT[DEMO_ADC_SAMPLE_CHANNEL_NUMBER])) + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void ADC_Configuration(void); +static void DMA_Configfuation(void); +static void NVIC_Configuration(void); + +dma_handle_t g_DmaHandleStruct; /* Handler structure for using DMA. */ +uint32_t g_AdcConvResult[1]; /* Keep the ADC conversion resulut moved from ADC data register by DMA. */ +volatile bool g_DmaTransferDoneFlag; /* Flag of DMA transfer done trigger by ADC conversion. */ +/* DMA descripter table used for ping-pong mode. */ +DMA_ALLOCATE_LINK_DESCRIPTORS(s_dma_table, DMA_DESCRIPTOR_NUM); +const uint32_t g_XferConfig = + DMA_CHANNEL_XFER(true, /* Reload link descriptor after current exhaust, */ + true, /* Clear trigger status. */ + true, /* Enable interruptA. */ + false, /* Not enable interruptB. */ + sizeof(uint32_t), /* Dma transfer width. */ + kDMA_AddressInterleave0xWidth, /* Dma source address no interleave */ + kDMA_AddressInterleave0xWidth, /* Dma destination address no interleave */ + sizeof(uint32_t) /* Dma transfer byte. */ + ); +const uint32_t g_Adc_12bitFullRange = 4096U; + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Main function + */ +int main(void) +{ + /* Initialize board hardware. */ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach FRO clock to ADC0. */ + CLOCK_Select(kADC_Clk_From_Fro); + CLOCK_SetClkDivider(kCLOCK_DivAdcClk, 1U); + /* Power on ADC0. */ + POWER_DisablePD(kPDRUNCFG_PD_ADC0); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + PRINTF("ADC DMA example.\r\n"); + + /* Configure peripherals. */ + NVIC_Configuration(); + DMA_Configfuation(); + +#if !(defined(FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC) && FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC) + uint32_t frequency = 0U; + /* Calibration after power up. */ +#if defined(FSL_FEATURE_ADC_HAS_CALIB_REG) && FSL_FEATURE_ADC_HAS_CALIB_REG + DEMO_ADC_BASE->CTRL |= ADC_CTRL_BYPASSCAL_MASK; + frequency = CLOCK_GetFreq(kCLOCK_BusClk); + if (true == ADC_DoOffsetCalibration(DEMO_ADC_BASE, frequency)) +#else +#if defined(SYSCON_ADCCLKDIV_DIV_MASK) + frequency = CLOCK_GetFreq(DEMO_ADC_CLOCK_SOURCE) / CLOCK_GetClkDivider(kCLOCK_DivAdcClk); +#else + frequency = CLOCK_GetFreq(DEMO_ADC_CLOCK_SOURCE); +#endif /* SYSCON_ADCCLKDIV_DIV_MASK */ + if (true == ADC_DoSelfCalibration(DEMO_ADC_BASE, frequency)) +#endif /* FSL_FEATURE_ADC_HAS_CALIB_REG */ + { + PRINTF("ADC Calibration Done.\r\n"); + } + else + { + PRINTF("ADC Calibration Failed.\r\n"); + } +#endif /* FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC */ + + ADC_Configuration(); + PRINTF("Configuration Done.\r\n"); +#if defined(FSL_FEATURE_ADC_HAS_CTRL_RESOL) & FSL_FEATURE_ADC_HAS_CTRL_RESOL + PRINTF("ADC Full Range: %d\r\n", g_Adc_12bitFullRange); +#endif /* FSL_FEATURE_ADC_HAS_CTRL_RESOL */ + PRINTF("Type in any key to trigger the conversion ...\r\n"); + + while (1) + { + /* Get the input from terminal and trigger the converter by software. */ + GETCHAR(); + + g_DmaTransferDoneFlag = false; + ADC_DoSoftwareTriggerConvSeqA(DEMO_ADC_BASE); /* Trigger the ADC and start the conversion. */ + + /* Wait for the converter & transfer to be done. */ + while (!g_DmaTransferDoneFlag) + { + } + PRINTF("Conversion word : 0x%X\r\n", g_AdcConvResult[0]); + PRINTF("Conversion value: %d\r\n", (g_AdcConvResult[0] & ADC_DAT_RESULT_MASK) >> ADC_DAT_RESULT_SHIFT); + PRINTF("\r\n"); + } +} + +static void NVIC_Configuration(void) +{ + NVIC_EnableIRQ(DMA0_IRQn); +} + +static void ADC_Configuration(void) +{ + adc_config_t adcConfigStruct; + adc_conv_seq_config_t adcConvSeqConfigStruct; + adc_result_info_t adcResultInfoStruct; + +/* Configure the converter. */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE) & FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE + adcConfigStruct.clockMode = kADC_ClockSynchronousMode; /* Using sync clock source. */ +#endif /* FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE */ + adcConfigStruct.clockDividerNumber = DEMO_ADC_CLOCK_DIVIDER; +#if defined(FSL_FEATURE_ADC_HAS_CTRL_RESOL) & FSL_FEATURE_ADC_HAS_CTRL_RESOL + adcConfigStruct.resolution = kADC_Resolution12bit; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_RESOL */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL) & FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL + adcConfigStruct.enableBypassCalibration = false; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_TSAMP) & FSL_FEATURE_ADC_HAS_CTRL_TSAMP + adcConfigStruct.sampleTimeNumber = 0U; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_TSAMP */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE) & FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE + adcConfigStruct.enableLowPowerMode = false; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE */ +#if defined(FSL_FEATURE_ADC_HAS_TRIM_REG) & FSL_FEATURE_ADC_HAS_TRIM_REG + adcConfigStruct.voltageRange = kADC_HighVoltageRange; +#endif /* FSL_FEATURE_ADC_HAS_TRIM_REG */ + ADC_Init(DEMO_ADC_BASE, &adcConfigStruct); + +#if !(defined(FSL_FEATURE_ADC_HAS_NO_INSEL) && FSL_FEATURE_ADC_HAS_NO_INSEL) + /* Use the temperature sensor input to channel 0. */ + ADC_EnableTemperatureSensor(DEMO_ADC_BASE, true); +#endif /* FSL_FEATURE_ADC_HAS_NO_INSEL. */ + + /* Enable channel DEMO_ADC_SAMPLE_CHANNEL_NUMBER's conversion in Sequence A. */ + adcConvSeqConfigStruct.channelMask = + (1U << DEMO_ADC_SAMPLE_CHANNEL_NUMBER); /* Includes channel DEMO_ADC_SAMPLE_CHANNEL_NUMBER. */ + adcConvSeqConfigStruct.triggerMask = 0U; + adcConvSeqConfigStruct.triggerPolarity = kADC_TriggerPolarityPositiveEdge; + adcConvSeqConfigStruct.enableSingleStep = false; + adcConvSeqConfigStruct.enableSyncBypass = false; + adcConvSeqConfigStruct.interruptMode = kADC_InterruptForEachSequence; /* Enable the interrupt/DMA trigger. */ + ADC_SetConvSeqAConfig(DEMO_ADC_BASE, &adcConvSeqConfigStruct); + ADC_EnableConvSeqA(DEMO_ADC_BASE, true); /* Enable the conversion sequence A. */ + + /* Clear the result register. */ + ADC_DoSoftwareTriggerConvSeqA(DEMO_ADC_BASE); + while (!ADC_GetChannelConversionResult(DEMO_ADC_BASE, DEMO_ADC_SAMPLE_CHANNEL_NUMBER, &adcResultInfoStruct)) + { + } + ADC_GetConvSeqAGlobalConversionResult(DEMO_ADC_BASE, &adcResultInfoStruct); + + /* Enable DMA trigger when Seq A conversion done. */ + ADC_EnableInterrupts(DEMO_ADC_BASE, kADC_ConvSeqAInterruptEnable); +} + +/* Software ISR for DMA transfer done. */ +void DEMO_DMA_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + if (true == transferDone) + { + g_DmaTransferDoneFlag = true; + } +} + +static void DMA_Configfuation(void) +{ + dma_channel_config_t dmaChannelConfigStruct; + dma_channel_trigger_t dmaChannelTriggerStruct; + + /* Init DMA. This must be set before INPUTMUX_Init() for DMA peripheral reset will clear the mux setting. */ + DMA_Init(DEMO_DMA_BASE); + + /* Configure DMAMUX. */ + INPUTMUX_Init(INPUTMUX); + INPUTMUX_AttachSignal(INPUTMUX, DEMO_DMA_ADC_CHANNEL, kINPUTMUX_Adc0SeqaIrqToDma); + + /* Configure DMA. */ + DMA_EnableChannel(DEMO_DMA_BASE, DEMO_DMA_ADC_CHANNEL); + DMA_CreateHandle(&g_DmaHandleStruct, DEMO_DMA_BASE, DEMO_DMA_ADC_CHANNEL); + DMA_SetCallback(&g_DmaHandleStruct, DEMO_DMA_Callback, NULL); + /* + * Configure the DMA trigger: + * The DATAVALID of ADC will trigger the interrupt. This signal is also for thie DMA triger, which is changed 0 -> + * 1. + */ + dmaChannelTriggerStruct.burst = kDMA_EdgeBurstTransfer1; + dmaChannelTriggerStruct.type = kDMA_RisingEdgeTrigger; + dmaChannelTriggerStruct.wrap = kDMA_NoWrap; + + /* Prepare and submit the transfer. */ + DMA_PrepareChannelTransfer(&dmaChannelConfigStruct, /* DMA channel transfer configurationstructure. */ + (void *)DEMO_ADC_DATA_REG_ADDR, /* DMA transfer source address. */ + (void *)g_AdcConvResult, /* DMA transfer destination address. */ + g_XferConfig, /* Xfer configuration */ + kDMA_MemoryToMemory, /* DMA transfer type. */ + &dmaChannelTriggerStruct, /* DMA channel trigger configurations. */ + (dma_descriptor_t *)&(s_dma_table[0]) /* Address of next descriptor. */ + ); + DMA_SubmitChannelTransfer(&g_DmaHandleStruct, &dmaChannelConfigStruct); + + /* Set two DMA descripters to use ping-pong mode. */ + DMA_SetupDescriptor(&(s_dma_table[0]), g_XferConfig, (void *)DEMO_ADC_DATA_REG_ADDR, (void *)g_AdcConvResult, + (dma_descriptor_t *)&(s_dma_table[1])); + DMA_SetupDescriptor(&(s_dma_table[1]), g_XferConfig, (void *)DEMO_ADC_DATA_REG_ADDR, (void *)g_AdcConvResult, + (dma_descriptor_t *)&(s_dma_table[0])); +} diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/lpc_adc_dma_v3_9.xml b/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/lpc_adc_dma_v3_9.xml new file mode 100644 index 0000000..345cd04 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/lpc_adc_dma_v3_9.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/pin_mux.c b/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/pin_mux.c new file mode 100644 index 0000000..ea66cd8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/pin_mux.c @@ -0,0 +1,131 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '33', peripheral: ADC0, signal: 'CH, 0', pin_signal: PIO0_7/ADC_0, mode: inactive, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + const uint32_t IOCON_INDEX_PIO0_7_config = (/* No addition pin function */ + IOCON_PIO_MODE_INACT | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN7 (coords: 33) is configured as ADC0, CH, 0. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_7, IOCON_INDEX_PIO0_7_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* ADC_CHN0 connect to P0_7 */ + SWM_SetFixedPinSelect(SWM0, kSWM_ADC_CHN0, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/pin_mux.h b/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/pin_mux.h new file mode 100644 index 0000000..20cf424 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/pin_mux.h @@ -0,0 +1,60 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/readme.txt b/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/readme.txt new file mode 100644 index 0000000..1309ac3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_dma/readme.txt @@ -0,0 +1,104 @@ +Overview +======== + +The lpc_adc_dma example shows how to use LPC ADC driver with DMA. + +In this example, the sensor is used to created the input analog signal. +When user type in any key from the keyboard, the software trigger API is called to start the conversion. +When the ADC conversion is completed, it would trigger the DMA to move the ADC conversion result from ADC conversion data +register to user indicated memory. Then the main loop waits for the transfer to be done and print the result to terminal. + +Project Information +1.what are ADC conversion sequences? + A conversion sequence is a single pass through a series of A/D conversions performed on a selected set of + A/D channels. Software can set-up two independent conversion sequences, either of which can be triggered + by software or by a transition on one of the hardware triggers. Each sequence can be triggered by a different + hardware trigger. One of these conversion sequences is referred to as the A sequence and the other as the B + sequence. It is not necessary to employ both sequences. An optional single-step mode allows advancing through + the channels of a sequence one at a time on each successive occurrence of a trigger. The user can select whether + a trigger on the B sequence can interrupt an already-in-progress A sequence. The B sequence, however, can never be + interrupted by an A trigger. + +2. How to use software-triggered conversion? + There are two ways that software can trigger a conversion sequence: + 1. Start Bit: The first way to software-trigger an sequence is by setting the START bit in + the corresponding SEQn_CTRL register. The response to this is identical to + occurrence of a hardware trigger on that sequence. Specifically, one cycle of + conversions through that conversion sequence will be immediately triggered except + as indicated above. (In this example, we use this way.) + 2. Burst Mode: The other way to initiate conversions is to set the BURST bit in the + SEQn_CTRL register. As long as this bit is 1 the designated conversion sequence will + be continuously and repetitively cycled through. Any new software or hardware trigger + on this sequence will be ignored. + +3. How to use DMA to work with ADC? + The sequence-A or sequence-B conversion/sequence-complete interrupts may also be + used to generate a DMA trigger. To trigger a DMA transfer, the same conditions must be + met as the conditions for generating an interrupt. + Remark: If the DMA is used, the ADC interrupt must be disabled in the NVIC. + +Program Flow +1.This example demonstrates how to configure the A sequences with interrupt, assigning one channel with software + trigger, you can configure channel via "DEMO_ADC_SAMPLE_CHANNEL_NUMBER". + +2.Before configuration of the ADC begins, the ADC is put through a self-calibration cycle. + +3.Configure the DMA and DMAMUX to work with ADC sequences. + +4.Enable the Conversion-Complete or Sequence-Complete DMA for sequences A. + +5.After ADC channels are assigned to each of the sequences, if the user enters any key via terminal, software trigger will start. + +6.When the conversion completes, the DMA would be requested. + +7.When the DMA transfer completes, DMA will trigger a interrupt. ISR would set the "bDmaTransferDone" to 'true'. Then main function will + print conversion result to terminal. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +- ADC CH0 input signal 32(PIO0-7). + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +Adjust the potentiometer and press any key from keyboard to trigger the conversion. +The log below shows the output of the ADC dma driver example in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ADC DMA example. +ADC Calibration Done. +Configuration Done. +Type in any key to trigger the conversion ... +Conversion word : 0x80025F30 +Conversion value: 1523 + +Conversion word : 0x80025F30 +Conversion value: 1523 + +Conversion word : 0x80025F30 +Conversion value: 1522 + +... +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/CMakeLists.txt new file mode 100644 index 0000000..213310d --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(lpc_adc_interrupt) + +set(MCUX_SDK_PROJECT_NAME lpc_adc_interrupt.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../fsl_adc_interrupt.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_adc_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/board.c b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/board.h b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/clock_config.c b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/adc/lpc_adc_interrupt/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/board.c b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/board.h b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/capt_acomp_continuous.c b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/capt_acomp_continuous.c new file mode 100644 index 0000000..84796f9 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/capt_acomp_continuous.c @@ -0,0 +1,155 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "pin_mux.h" +#include "board.h" +#include "fsl_capt.h" +#include "fsl_acomp.h" +#include "fsl_debug_console.h" + +#include +#include "fsl_power.h" +#include "fsl_gpio.h" +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_ACOMP_BASE ACOMP +#define DEMO_ACOMP_CAPT_CHANNEL 5U +#define DEMO_CAPT_BASE CAPT +#define DEMO_CAPT_IRQn CMP_CAPT_IRQn +#define DEMO_CAPT_IRQHandler CMP_CAPT_IRQHandler +#define DEMO_CAPT_ENABLE_PINS kCAPT_X0Pin +#define DEMO_CAPT_ENABLE_PINS_NUM 1 +#define DEMO_CAPT_CLOCK_FREQ CLOCK_GetFroFreq() + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void ACOMP_Configuration(void); +/******************************************************************************* + * Variables + ******************************************************************************/ +volatile uint16_t g_captRawData[DEMO_CAPT_ENABLE_PINS_NUM]; +volatile bool g_captPollDone; + +/******************************************************************************* + * Code + ******************************************************************************/ + + +/*! + * @brief ISR for CAPT. + */ +void DEMO_CAPT_IRQHandler(void) +{ + uint32_t intStat; + capt_touch_data_t s_captData; + + intStat = CAPT_GetInterruptStatusFlags(DEMO_CAPT_BASE); + + CAPT_ClearInterruptStatusFlags(DEMO_CAPT_BASE, intStat); + + /* If timeout happens, the board capt capacitor should be changed. */ + if (intStat & + (kCAPT_InterruptOfYesTouchStatusFlag | kCAPT_InterruptOfNoTouchStatusFlag | kCAPT_InterruptOfTimeOutStatusFlag)) + { + CAPT_GetTouchData(DEMO_CAPT_BASE, &s_captData); + + g_captRawData[s_captData.XpinsIndex] = s_captData.count; + } + + if (intStat & kCAPT_InterruptOfPollDoneStatusFlag) + { + g_captPollDone = true; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + capt_config_t captConfig; + uint32_t captClockFreq; + + /* Initialize board hardware. */ + /* Attach main clock to CAPT */ + CLOCK_Select(kCAPT_Clk_From_Fro); + POWER_DisablePD(kPDRUNCFG_PD_ACMP); + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + ACOMP_Configuration(); + + PRINTF("CAPT ACOMP continuous example.\r\n"); + + /* Initialize CAPT module. */ + CAPT_GetDefaultConfig(&captConfig); + captConfig.triggerMode = kCAPT_ComparatorTriggerMode; + captConfig.XpinsMode = kCAPT_InactiveXpinsHighZMode; + /* Calculate the clock divider to make sure CAPT work in 2Mhz fclk. */ + captClockFreq = DEMO_CAPT_CLOCK_FREQ; + captConfig.clockDivider = (captClockFreq / 2000000U - 1U); + captConfig.enableXpins = DEMO_CAPT_ENABLE_PINS; + + /* The CAPT FCLK is set to 2MHz, the delay period between two polling rounds + * is pollCount * 2096, setting pollCount to 250, then the polling round + * frequency is about 2Hz, user can change this value to smaller value to + * for faster polling round. + */ + captConfig.pollCount = 250; + + CAPT_Init(DEMO_CAPT_BASE, &captConfig); + + /* Enable the interrupts. */ + CAPT_EnableInterrupts(DEMO_CAPT_BASE, kCAPT_InterruptOfYesTouchEnable | kCAPT_InterruptOfNoTouchEnable | + kCAPT_InterruptOfTimeOutEnable | kCAPT_InterruptOfPollDoneEnable); + NVIC_EnableIRQ(DEMO_CAPT_IRQn); + + /* Set polling mode and start poll. */ + CAPT_SetPollMode(DEMO_CAPT_BASE, kCAPT_PollContinuousMode); + + while (1) + { + while (!g_captPollDone) + { + } + + /* Output the captured data. */ + PRINTF("CAPT Data: "); + + for (uint8_t i = 0; i < ARRAY_SIZE(g_captRawData); i++) + { + PRINTF("%u\t", g_captRawData[i]); + } + + PRINTF("\r\n"); + + g_captPollDone = false; + } +} + +static void ACOMP_Configuration(void) +{ + acomp_config_t acompConfig; + acomp_ladder_config_t acompLadderConfig; + + acompConfig.enableSyncToBusClk = false; + acompConfig.hysteresisSelection = kACOMP_Hysteresis20MVSelection; + ACOMP_Init(DEMO_ACOMP_BASE, &acompConfig); + + ACOMP_EnableInterrupts(DEMO_ACOMP_BASE, kACOMP_InterruptsDisable); + + ACOMP_SetInputChannel(DEMO_ACOMP_BASE, DEMO_ACOMP_CAPT_CHANNEL, 0U); + + acompLadderConfig.ladderValue = 0x08U; + acompLadderConfig.referenceVoltage = kACOMP_LadderRefVoltagePinVDD; + ACOMP_SetLadderConfig(DEMO_ACOMP_BASE, &acompLadderConfig); +} diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/capt_acomp_continuous_v3_9.xml b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/capt_acomp_continuous_v3_9.xml new file mode 100644 index 0000000..447633c --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/capt_acomp_continuous_v3_9.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/clock_config.c b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_acomp_continuous/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/board.c b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/board.h b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/capt_basic_continuous.c b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/capt_basic_continuous.c new file mode 100644 index 0000000..2590805 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/capt_basic_continuous.c @@ -0,0 +1,131 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "pin_mux.h" +#include "board.h" +#include "fsl_capt.h" +#include "fsl_debug_console.h" + +#include +#include "fsl_power.h" +#include "fsl_gpio.h" +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_CAPT_BASE CAPT +#define DEMO_CAPT_IRQn CMP_CAPT_IRQn +#define DEMO_CAPT_IRQHandler CMP_CAPT_IRQHandler +#define DEMO_CAPT_ENABLE_PINS kCAPT_X0Pin +#define DEMO_CAPT_ENABLE_PINS_NUM 1 +#define DEMO_CAPT_CLOCK_FREQ CLOCK_GetFroFreq() + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +volatile uint16_t g_captRawData[DEMO_CAPT_ENABLE_PINS_NUM]; +volatile bool g_captPollDone; + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * @brief ISR for CAPT. + */ +void DEMO_CAPT_IRQHandler(void) +{ + uint32_t intStat; + capt_touch_data_t s_captData; + + intStat = CAPT_GetInterruptStatusFlags(DEMO_CAPT_BASE); + + CAPT_ClearInterruptStatusFlags(DEMO_CAPT_BASE, intStat); + + /* If timeout happens, the board capt capacitor should be changed. */ + if (intStat & + (kCAPT_InterruptOfYesTouchStatusFlag | kCAPT_InterruptOfNoTouchStatusFlag | kCAPT_InterruptOfTimeOutStatusFlag)) + { + CAPT_GetTouchData(DEMO_CAPT_BASE, &s_captData); + + g_captRawData[s_captData.XpinsIndex] = s_captData.count; + } + + if (intStat & kCAPT_InterruptOfPollDoneStatusFlag) + { + g_captPollDone = true; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + capt_config_t captConfig; + uint32_t captClockFreq; + + /* Initialize board hardware. */ + /* Attach main clock to CAPT */ + CLOCK_Select(kCAPT_Clk_From_Fro); + POWER_DisablePD(kPDRUNCFG_PD_ACMP); + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + PRINTF("CAPT basic continuous example.\r\n"); + + /* Initialize CAPT module. */ + CAPT_GetDefaultConfig(&captConfig); + + /* Calculate the clock divider to make sure CAPT work in 2Mhz fclk. */ + captClockFreq = DEMO_CAPT_CLOCK_FREQ; + captConfig.clockDivider = (captClockFreq / 2000000U - 1U); + captConfig.enableXpins = DEMO_CAPT_ENABLE_PINS; + + /* The CAPT FCLK is set to 2MHz, the delay period between two polling rounds + * is pollCount * 2096, setting pollCount to 250, then the polling round + * frequency is about 2Hz, user can change this value to smaller value to + * for faster polling round. + */ + captConfig.pollCount = 250; + + CAPT_Init(DEMO_CAPT_BASE, &captConfig); + + /* Enable the interrupts. */ + CAPT_EnableInterrupts(DEMO_CAPT_BASE, kCAPT_InterruptOfYesTouchEnable | kCAPT_InterruptOfNoTouchEnable | + kCAPT_InterruptOfTimeOutEnable | kCAPT_InterruptOfPollDoneEnable); + NVIC_EnableIRQ(DEMO_CAPT_IRQn); + + /* Set polling mode and start poll. */ + CAPT_SetPollMode(DEMO_CAPT_BASE, kCAPT_PollContinuousMode); + + while (1) + { + while (!g_captPollDone) + { + } + + /* Output the captured data. */ + PRINTF("CAPT Data: "); + + for (uint8_t i = 0; i < ARRAY_SIZE(g_captRawData); i++) + { + PRINTF("%u\t", g_captRawData[i]); + } + + PRINTF("\r\n"); + + g_captPollDone = false; + } +} diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/capt_basic_continuous_v3_9.xml b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/capt_basic_continuous_v3_9.xml new file mode 100644 index 0000000..9fd117e --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/capt_basic_continuous_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/clock_config.c b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/capt/capt_basic_continuous/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define CRC_ENGINE CRC + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * @brief Init for CRC-16-CCITT. + * @details Init CRC peripheral module for CRC-16/CCITT-FALSE protocol: + * width=16 poly=0x1021 init=0xffff refin=false refout=false xorout=0x0000 check=0x29b1 + * http://reveng.sourceforge.net/crc-catalogue/ + * name="CRC-16/CCITT-FALSE" + */ +static void InitCrc16_CcittFalse(CRC_Type *base, uint32_t seed) +{ + crc_config_t config; + + /* + * config.polynomial = kCRC_Polynomial_CRC_CCITT; + * config.reverseIn = false; + * config.complementIn = false; + * config.reverseOut = false; + * config.complementOut = false; + * config.seed = 0xFFFFU; + */ + CRC_GetDefaultConfig(&config); + config.seed = seed; + CRC_Init(base, &config); +} + +/*! + * @brief Init for CRC-16/ARC. + * @details Init CRC peripheral module for CRC-16/ARC protocol. + * width=16 poly=0x8005 init=0x0000 refin=true refout=true xorout=0x0000 check=0xbb3d name="ARC" + * http://reveng.sourceforge.net/crc-catalogue/ + */ +static void InitCrc16(CRC_Type *base, uint32_t seed) +{ + crc_config_t config; + + config.polynomial = kCRC_Polynomial_CRC_16; + config.reverseIn = true; + config.complementIn = false; + config.reverseOut = true; + config.complementOut = false; + config.seed = seed; + + CRC_Init(base, &config); +} + +/*! + * @brief Init for CRC-32. + * @details Init CRC peripheral module for CRC-32 protocol. + * width=32 poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xcbf43926 + * name="CRC-32" + * http://reveng.sourceforge.net/crc-catalogue/ + */ +static void InitCrc32(CRC_Type *base, uint32_t seed) +{ + crc_config_t config; + + config.polynomial = kCRC_Polynomial_CRC_32; + config.reverseIn = true; + config.complementIn = false; + config.reverseOut = true; + config.complementOut = true; + config.seed = seed; + + CRC_Init(base, &config); +} + +/*! + * @brief Main function + */ +int main(void) +{ + char testData[] = "123456789"; + const uint16_t checkCcittFalseCrc16 = 0x29b1u; + const uint16_t checkCrc16Arc = 0xbb3du; + const uint32_t checkCrc32 = 0xcbf43926u; + + CRC_Type *base = CRC_ENGINE; + uint16_t checksum16; + uint32_t checksum32; + + /* Init hardware */ + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + PRINTF("CRC Peripheral Driver Example\r\n\r\n"); + + /* *************** + * CRC-16/CCITT-FALSE * + *************** */ + InitCrc16_CcittFalse(base, 0xFFFFU); + CRC_WriteData(base, (uint8_t *)&testData[0], sizeof(testData) - 1); + checksum16 = CRC_Get16bitResult(base); + + PRINTF("Test string: %s\r\n", testData); + PRINTF("CRC-16 CCITT FALSE: 0x%x\r\n", checksum16); + if (checksum16 != checkCcittFalseCrc16) + { + PRINTF("...Check fail. Expected: 0x%x\r\n", checkCcittFalseCrc16); + } + + /* *************** + * CRC-16/ARC * + *************** */ + InitCrc16(base, 0x0U); + CRC_WriteData(base, (uint8_t *)&testData[0], sizeof(testData) - 1); + checksum16 = CRC_Get16bitResult(base); + + PRINTF("CRC-16 ARC: 0x%x\r\n", checksum16); + if (checksum16 != checkCrc16Arc) + { + PRINTF("...Check fail. Expected: 0x%x\r\n\r\n", checkCrc16Arc); + } + + /* *************** + * CRC-32 * + *************** */ + InitCrc32(base, 0xFFFFFFFFU); + CRC_WriteData(base, (uint8_t *)&testData[0], sizeof(testData) - 1); + checksum32 = CRC_Get32bitResult(base); + + PRINTF("CRC-32: 0x%x\r\n\r\n", checksum32); + if (checksum32 != checkCrc32) + { + PRINTF("...Check fail. Expected: 0x%x\r\n\r\n", checkCrc32); + } + + while (1) + { + } +} diff --git a/boards/lpc845breakout/driver_examples/crc/crc_v3_9.xml b/boards/lpc845breakout/driver_examples/crc/crc_v3_9.xml new file mode 100644 index 0000000..e73d892 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/crc/crc_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/crc/pin_mux.c b/boards/lpc845breakout/driver_examples/crc/pin_mux.c new file mode 100644 index 0000000..8cef67b --- /dev/null +++ b/boards/lpc845breakout/driver_examples/crc/pin_mux.c @@ -0,0 +1,111 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/crc/pin_mux.h b/boards/lpc845breakout/driver_examples/crc/pin_mux.h new file mode 100644 index 0000000..c2a4479 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/crc/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/crc/readme.txt b/boards/lpc845breakout/driver_examples/crc/readme.txt new file mode 100644 index 0000000..983c33f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/crc/readme.txt @@ -0,0 +1,44 @@ +Overview +======== +The CRC Example project is a demonstration program that uses the KSDK software to generate checksums +for an ASCII string. Several CRC protocols are implemented using the CRC driver API. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +The log below shows example output of the CRC driver example in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CRC Peripheral Driver Example + +Test string: 123456789 +CRC-16 CCITT FALSE: 0x29b1 +CRC-16 ARC: 0xbb3d +CRC-32: 0xcbf43926 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/CMakeLists.txt new file mode 100644 index 0000000..33b2fc8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(ctimer_match_example) + +set(MCUX_SDK_PROJECT_NAME ctimer_match_example.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../simple_match.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(driver_ctimer_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(utility_assert_lite_LPC845) + +include(utility_debug_console_lite_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/board.c b/boards/lpc845breakout/driver_examples/ctimer/simple_match/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/board.h b/boards/lpc845breakout/driver_examples/ctimer/simple_match/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match/clock_config.c b/boards/lpc845breakout/driver_examples/ctimer/simple_match/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/pin_mux.c b/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/pin_mux.c new file mode 100644 index 0000000..711e06b --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/pin_mux.c @@ -0,0 +1,151 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '7', peripheral: CTIMER0, signal: 'MATCH, 1', pin_signal: PIO0_28/WKTCLKIN, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, + smode: bypass, clkdiv: div0} + - {pin_num: '38', peripheral: CTIMER0, signal: 'MATCH, 0', pin_signal: PIO0_29/DACOUT_1, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, + smode: bypass, clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + const uint32_t IOCON_INDEX_PIO0_28_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN28 (coords: 7) is configured as CTIMER0, MATCH, 1. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_28, IOCON_INDEX_PIO0_28_config); + + const uint32_t IOCON_INDEX_PIO0_29_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN29 (coords: 38) is configured as CTIMER0, MATCH, 0. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_29, IOCON_INDEX_PIO0_29_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* TimerMatchChannel0 connect to P0_29 */ + SWM_SetMovablePinSelect(SWM0, kSWM_T0_MAT_CHN0, kSWM_PortPin_P0_29); + + /* TimerMatchChannel1 connect to P0_28 */ + SWM_SetMovablePinSelect(SWM0, kSWM_T0_MAT_CHN1, kSWM_PortPin_P0_28); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/pin_mux.h b/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/pin_mux.h new file mode 100644 index 0000000..c2a4479 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/readme.txt b/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/readme.txt new file mode 100644 index 0000000..9081367 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/readme.txt @@ -0,0 +1,41 @@ +Overview +======== +The Simple Match Interrupt project is to demonstrate usage of the SDK CTimer driver with interrupt callback functions +In this example the upon match and IO pin connected to the LED is toggled and the timer is reset, so it would generate a square wave. +With an interrupt callback the match value is changed frequently in such a way that the frequency of the output square wave is increased gradually. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +The log below shows example output of the CTimer simple match demo using interrupts in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CTimer match example to toggle the output. +This example uses interrupt to change the match period. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/simple_match_interrupt.c b/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/simple_match_interrupt.c new file mode 100644 index 0000000..275781e --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_match_interrupt/simple_match_interrupt.c @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/******************************************************************************* + * Includes + ******************************************************************************/ + +#include "fsl_debug_console.h" +#include "pin_mux.h" +#include "board.h" +#include "fsl_ctimer.h" + +#include +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define CTIMER CTIMER0 /* Timer 0 */ +#define CTIMER_MAT0_OUT kCTIMER_Match_0 /* Match output 0 */ +#define CTIMER_MAT1_OUT kCTIMER_Match_1 /* Match output 1 */ +#define CTIMER_CLK_FREQ CLOCK_GetFreq(kCLOCK_CoreSysClk) + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +void ctimer_match0_callback(uint32_t flags); +void ctimer_match1_callback(uint32_t flags); + +/* Array of function pointers for callback for each channel */ +ctimer_callback_t ctimer_callback_table[] = { + ctimer_match0_callback, ctimer_match1_callback, NULL, NULL, NULL, NULL, NULL, NULL}; + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* Match Configuration for Channel 0 */ +static ctimer_match_config_t matchConfig0; +/* Match Configuration for Channel 1 */ +static ctimer_match_config_t matchConfig1; + +/******************************************************************************* + * Code + ******************************************************************************/ + +void ctimer_match1_callback(uint32_t flags) +{ + static uint32_t count = 0; + static uint32_t matchUpdateCount = 8; + + if (++count > matchUpdateCount) + { + count = 0; + matchConfig1.matchValue >>= 1; + matchUpdateCount <<= 1; + if (matchUpdateCount == (1 << 8)) + { + matchUpdateCount = 8; + matchConfig1.matchValue = CTIMER_CLK_FREQ / 2; + } + CTIMER_SetupMatch(CTIMER, CTIMER_MAT1_OUT, &matchConfig1); + } +#if defined(BOARD_HAS_NO_CTIMER_OUTPUT_PIN_CONNECTED_TO_LED) + /* No timer match output pin connected to a LED + * toggle LED manually according to match status + */ + if (CTIMER_GetOutputMatchStatus(CTIMER, CTIMER_EMT1_OUT)) + { + LED_RED2_ON(); + } + else + { + LED_RED2_OFF(); + } +#endif +} + +void ctimer_match0_callback(uint32_t flags) +{ + static uint32_t count = 0; + static uint32_t matchUpdateCount = 8; + + if (++count > matchUpdateCount) + { + count = 0; + matchConfig0.matchValue >>= 1; + matchUpdateCount <<= 1; + if (matchUpdateCount == (1 << 8)) + { + matchUpdateCount = 8; + matchConfig0.matchValue = CTIMER_CLK_FREQ / 2; + } + CTIMER_SetupMatch(CTIMER, CTIMER_MAT0_OUT, &matchConfig0); + } +#if defined(BOARD_HAS_NO_CTIMER_OUTPUT_PIN_CONNECTED_TO_LED) + /* No timer match output pin connected to a LED + * toggle LED manually according to match status + */ + if (CTIMER_GetOutputMatchStatus(CTIMER, CTIMER_EMT0_OUT)) + { + LED_RED1_ON(); + } + else + { + LED_RED1_OFF(); + } +#endif +} + +/*! + * @brief Main function + */ +int main(void) +{ + ctimer_config_t config; + + /* Init hardware*/ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + +#if defined(BOARD_HAS_NO_CTIMER_OUTPUT_PIN_CONNECTED_TO_LED) + LED_RED1_INIT(LOGIC_LED_OFF); + LED_RED2_INIT(LOGIC_LED_OFF); +#endif + + PRINTF("CTimer match example to toggle the output. \r\n"); + PRINTF("This example uses interrupt to change the match period. \r\n"); + + CTIMER_GetDefaultConfig(&config); + + CTIMER_Init(CTIMER, &config); + + /* Configuration 0 */ + matchConfig0.enableCounterReset = true; + matchConfig0.enableCounterStop = false; + matchConfig0.matchValue = CTIMER_CLK_FREQ / 2; + matchConfig0.outControl = kCTIMER_Output_Toggle; + matchConfig0.outPinInitState = false; + matchConfig0.enableInterrupt = true; + + /* Configuration 1 */ + matchConfig1.enableCounterReset = true; + matchConfig1.enableCounterStop = false; + matchConfig1.matchValue = CTIMER_CLK_FREQ / 2; + matchConfig1.outControl = kCTIMER_Output_Toggle; + matchConfig1.outPinInitState = true; + matchConfig1.enableInterrupt = true; + + CTIMER_RegisterCallBack(CTIMER, &ctimer_callback_table[0], kCTIMER_MultipleCallback); + CTIMER_SetupMatch(CTIMER, CTIMER_MAT0_OUT, &matchConfig0); + CTIMER_SetupMatch(CTIMER, CTIMER_MAT1_OUT, &matchConfig1); + CTIMER_StartTimer(CTIMER); + + while (1) + { + } +} diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/CMakeLists.txt new file mode 100644 index 0000000..65b5d4b --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(ctimer_pwm_example) + +set(MCUX_SDK_PROJECT_NAME ctimer_pwm_example.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../simple_pwm.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(driver_ctimer_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(utility_assert_lite_LPC845) + +include(utility_debug_console_lite_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/board.c b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/board.h b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/clock_config.c b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/pin_mux.c b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/pin_mux.c new file mode 100644 index 0000000..6c009e1 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/pin_mux.c @@ -0,0 +1,131 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '7', peripheral: CTIMER0, signal: 'MATCH, 1', pin_signal: PIO0_28/WKTCLKIN, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, + smode: bypass, clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + const uint32_t IOCON_INDEX_PIO0_28_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN28 (coords: 7) is configured as CTIMER0, MATCH, 1. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_28, IOCON_INDEX_PIO0_28_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* TimerMatchChannel1 connect to P0_28 */ + SWM_SetMovablePinSelect(SWM0, kSWM_T0_MAT_CHN1, kSWM_PortPin_P0_28); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/pin_mux.h b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/pin_mux.h new file mode 100644 index 0000000..c2a4479 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/readme.txt b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/readme.txt new file mode 100644 index 0000000..254cde4 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/readme.txt @@ -0,0 +1,41 @@ +Overview +======== +The Simple PWM Interrupt project is to demonstrate usage of the SDK CTimer driver as a PWM with interrupt callback functions +In this example an IO pin connected to the LED is used as a PWM output line to generate a PWM signal. +With an interrupt callback the PWM duty cycle is changed frequently in such a way that the LED brightness can be varied. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +The log below shows example output of the CTimer simple PWM demo using interrupts in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CTimer example to generate a PWM signal +This example uses interrupts to update the PWM duty cycle +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/simple_pwm_interrupt.c b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/simple_pwm_interrupt.c new file mode 100644 index 0000000..6366bb6 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/ctimer/simple_pwm_interrupt/simple_pwm_interrupt.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/******************************************************************************* + * Includes + ******************************************************************************/ + +#include "fsl_debug_console.h" +#include "pin_mux.h" +#include "board.h" +#include "fsl_ctimer.h" + +#include +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define CTIMER CTIMER0 /* Timer 0 */ +#define CTIMER_MAT_OUT kCTIMER_Match_1 /* Match output 1 */ +#define CTIMER_CLK_FREQ CLOCK_GetFreq(kCLOCK_CoreSysClk) +#ifndef CTIMER_MAT_PWM_PERIOD_CHANNEL +#define CTIMER_MAT_PWM_PERIOD_CHANNEL kCTIMER_Match_3 +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +void pwm_match_callback(uint32_t flags); + +/******************************************************************************* + * Variables + ******************************************************************************/ +static uint8_t dutyCycle = 99; +volatile uint32_t g_pwmPeriod = 0U; +volatile uint32_t g_pulsePeriod = 0U; + +static ctimer_callback_t ctimer_callback[] = {pwm_match_callback}; + +/******************************************************************************* + * Code + ******************************************************************************/ +status_t CTIMER_GetPwmPeriodValue(uint32_t pwmFreqHz, uint8_t dutyCyclePercent, uint32_t timerClock_Hz) +{ + /* Calculate PWM period match value */ + g_pwmPeriod = (timerClock_Hz / pwmFreqHz) - 1U; + + /* Calculate pulse width match value */ + g_pulsePeriod = (g_pwmPeriod + 1U) * (100 - dutyCyclePercent) / 100; + + return kStatus_Success; +} +status_t CTIMER_UpdatePwmPulsePeriodValue(uint8_t dutyCyclePercent) +{ + /* Calculate pulse width match value */ + g_pulsePeriod = (g_pwmPeriod + 1U) * (100 - dutyCyclePercent) / 100; + + return kStatus_Success; +} + +void pwm_match_callback(uint32_t flags) +{ + static uint32_t count = 0; + static uint8_t decrement = 1; + + if ((flags & (1 << CTIMER_MAT_OUT)) && (++count > 100)) + { + count = 0; + /* Update pulse width match value after the PWM duty cycle is changed */ + CTIMER_UpdatePwmPulsePeriodValue(dutyCycle); + CTIMER_UpdatePwmPulsePeriod(CTIMER, CTIMER_MAT_OUT, g_pulsePeriod); + dutyCycle = dutyCycle + 1 - decrement * 2; + if (dutyCycle == 69) + { + decrement = 0; + } + else if (dutyCycle == 99) + { + decrement = 1; + } + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + ctimer_config_t config; + uint32_t srcClock_Hz; + uint32_t timerClock; + + /* Init hardware*/ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + /* CTimer0 counter uses the AHB clock, some CTimer1 modules use the Aysnc clock */ + srcClock_Hz = CTIMER_CLK_FREQ; + + PRINTF("CTimer example to generate a PWM signal\r\n"); + PRINTF("This example uses interrupts to update the PWM duty cycle\r\n"); + + CTIMER_GetDefaultConfig(&config); + timerClock = srcClock_Hz / (config.prescale + 1); + + CTIMER_Init(CTIMER, &config); + + CTIMER_RegisterCallBack(CTIMER, &ctimer_callback[0], kCTIMER_SingleCallback); + /* Get the PWM period match value and pulse width match value of 2Khz PWM signal */ + CTIMER_GetPwmPeriodValue(2000, dutyCycle, timerClock); + CTIMER_SetupPwmPeriod(CTIMER, CTIMER_MAT_PWM_PERIOD_CHANNEL, CTIMER_MAT_OUT, g_pwmPeriod, g_pulsePeriod, true); + CTIMER_StartTimer(CTIMER); + + while (1) + { + } +} diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/CMakeLists.txt new file mode 100644 index 0000000..bac5637 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(lpc_dac_basic) + +set(MCUX_SDK_PROJECT_NAME lpc_dac_basic.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../dac_basic.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_dac_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/board.c b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/board.h b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/clock_config.c b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_basic/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_DAC_BASE DAC0 +#define DEMO_DAC_COUNTER_VALUE 1000U +#define DEMO_DMA_DAC_CHANNEL 22U +#define DEMO_DAC_DATA_REG_ADDR 0x40014000 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void DMA_Configfuation(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +dma_handle_t gDmaHandleStruct; /* Handler structure for using DMA. */ +const uint32_t g_waveform[] = {0x0000, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888, 0x9999, 0xAAAA, + 0xBBBB, 0xCCCC, 0xDDDD, 0xEEEE, 0xFFFF, 0xFFFF, 0xEEEE, 0xDDDD, 0xCCCC, 0xBBBB, 0xAAAA, + 0x9999, 0x8888, 0x7777, 0x6666, 0x5555, 0x4444, 0x3333, 0x2222, 0x1111, 0x0000}; +/******************************************************************************* + * Code + ******************************************************************************/ +/* Software ISR for DMA transfer done. */ +void DEMO_DMA_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + DMA_StartTransfer(&gDmaHandleStruct); /* Enable the DMA every time for each transfer. */ +} + +/*! + * @brief Main function + */ +int main(void) +{ + dac_config_t dacConfigStruct; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Power on the DAC0.*/ + POWER_DisablePD(kPDRUNCFG_PD_DAC0); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + NVIC_EnableIRQ(DMA0_IRQn); + DMA_Configfuation(); + + PRINTF("\r\nDAC dma Example.\r\n"); + + /* Configure the DAC. */ + DAC_GetDefaultConfig(&dacConfigStruct); + DAC_Init(DEMO_DAC_BASE, &dacConfigStruct); + /* Enable the DAC DMA. */ + DAC_EnableDMA(DEMO_DAC_BASE, true); + /* Configure the frequency of DAC DMA. */ + DAC_SetCounterValue(DEMO_DAC_BASE, DEMO_DAC_COUNTER_VALUE); + DAC_EnableDoubleBuffering(DEMO_DAC_BASE, true); + + PRINTF("Please probe the signal using an oscilloscope.\r\n"); + + while (1) + { + } +} + +static void DMA_Configfuation(void) +{ + dma_transfer_config_t dmaTransferConfigStruct; + + /* Configure DMA. */ + DMA_Init(DMA0); + DMA_EnableChannel(DMA0, DEMO_DMA_DAC_CHANNEL); + DMA_CreateHandle(&gDmaHandleStruct, DMA0, DEMO_DMA_DAC_CHANNEL); + DMA_SetCallback(&gDmaHandleStruct, DEMO_DMA_Callback, NULL); + + /* Prepare and submit the transfer. */ + DMA_PrepareTransfer(&dmaTransferConfigStruct, /* To keep the configuration. */ + (void *)g_waveform, /* DMA transfer source address. */ + (void *)DEMO_DAC_DATA_REG_ADDR, /* DMA transfer destination address. */ + sizeof(uint32_t), /* DMA transfer destination address width(bytes). */ + sizeof(g_waveform), /* DMA transfer bytes to be transferred. */ + kDMA_MemoryToPeripheral, /* DMA transfer type. */ + NULL /* nextDesc Chain custom descriptor to transfer. */ + ); + DMA_SubmitTransfer(&gDmaHandleStruct, &dmaTransferConfigStruct); + DMA_StartTransfer(&gDmaHandleStruct); +} diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/lpc_dac_dma_v3_9.xml b/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/lpc_dac_dma_v3_9.xml new file mode 100644 index 0000000..695c82e --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/lpc_dac_dma_v3_9.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/pin_mux.c b/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/pin_mux.c new file mode 100644 index 0000000..baa8676 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/pin_mux.c @@ -0,0 +1,133 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '48', peripheral: DAC0, signal: DACOUT0, pin_signal: PIO0_17/ADC_9/DACOUT_0, mode: inactive, invert: disabled, hysteresis: enabled, opendrain: disabled, + smode: bypass, clkdiv: div0, dacmode: enabled} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_17_config = (/* No addition pin function */ + IOCON_PIO_MODE_INACT | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0 | + /* Enables DAC mode */ + IOCON_PIO_DACMODE_EN); + /* PIO0 PIN17 (coords: 48) is configured as DAC0, DACOUT0. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_17, IOCON_INDEX_PIO0_17_config); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* DACOUT0 connect to P0_17 */ + SWM_SetFixedPinSelect(SWM0, kSWM_DAC_OUT0, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/pin_mux.h b/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/pin_mux.h new file mode 100644 index 0000000..7f62912 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/pin_mux.h @@ -0,0 +1,61 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_DACMODE_EN 0x010000u /*!<@brief Enables DAC mode */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/readme.txt b/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/readme.txt new file mode 100644 index 0000000..4e68240 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_dma/readme.txt @@ -0,0 +1,50 @@ +Overview +======== + +The dac_dma example shows how to use DAC with dma and produce an arbitrary, user-defined waveform of +selectable frequency.The output can be observed with an oscilloscope. + +When the DAC's double-buffer feature is enabled, any write to the CR register will only load the pre-buffer, which +shares its register address with the CR register. The CR itself will be loaded from the pre-buffer whenever the +counter reaches zero and the DMA request would be raised. At the same time the counter is reloaded with the COUNTVAL +register value. user-defined waveform array would be transfered to pre-buffer in order by DMA. + + + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +PIO0_17 is DAC0 output pin. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +The log below shows the output of the DAC dma driver demo in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +DAC dma Example. +Please probe the signal using an oscilloscope. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Probe the signal of PIO0_17 using an oscilloscope. diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/CMakeLists.txt new file mode 100644 index 0000000..c45ed52 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(lpc_dac_interrupt) + +set(MCUX_SDK_PROJECT_NAME lpc_dac_interrupt.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../dac_interrupt.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_dac_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/board.c b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/board.h b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/clock_config.c b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dac/lpc_dac_interrupt/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_DMA_CHANNEL0 0 +#define DEMO_DMA_CHANNEL1 1 +#define DEMO_DMA_CHANNEL2 2 +#define DEMO_DMA_CHANNEL_TRIGGER_INPUT kINPUTMUX_DmaTriggerMux0ToDma +#define DEMO_DMA_CHANNEL_TRIGGER_OUTPUT0 kINPUTMUX_DmaChannel0TrigoutToTriginChannels +#define BUFF_LENGTH 4U +#define DMA_DESCRIPTOR_NUM 3U +#define DEST_BUFFER_LENGTH 16U +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +static dma_handle_t s_DMA_Handle0; +static dma_handle_t s_DMA_Handle1; +static dma_handle_t s_DMA_Handle2; +static volatile bool s_Transfer0_Done = false; +static volatile bool s_Transfer1_Done = false; +static volatile bool s_Transfer2_Done = false; + +DMA_ALLOCATE_LINK_DESCRIPTORS(s_dma_table1, 1U); +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_srcBuffer0[BUFF_LENGTH], sizeof(uint32_t)) = {1, 2, 3, 4}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_srcBuffer1[BUFF_LENGTH], sizeof(uint32_t)) = {11, 22, 33, 44}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_srcBuffer2[BUFF_LENGTH], sizeof(uint32_t)) = {111, 222, 333, 444}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_srcBuffer3[BUFF_LENGTH], sizeof(uint32_t)) = {1111, 2222, 3333, + 4444}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_destBuffer[BUFF_LENGTH * 4], sizeof(uint32_t)) = {0x00}; +static dma_channel_trigger_t s_channelTrigger = { + .type = kDMA_FallingEdgeTrigger, + .burst = kDMA_SingleTransfer, + .wrap = kDMA_NoWrap, +}; +/******************************************************************************* + * Code + ******************************************************************************/ + +/* User callback function for DMA transfer. */ +void DMA0_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + if (transferDone) + { + s_Transfer0_Done = true; + } +} + +/* User callback function for DMA transfer. */ +void DMA1_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + if (transferDone) + { + s_Transfer1_Done = true; + } +} + +/* User callback function for DMA transfer. */ +void DMA2_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + if (transferDone) + { + s_Transfer2_Done = true; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + uint32_t i = 0; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + /* Print source buffer */ + PRINTF("DMA channel chain example begin.\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < DEST_BUFFER_LENGTH; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + + DMA_Init(DMA0); + + INPUTMUX_Init(INPUTMUX); + INPUTMUX_AttachSignal(INPUTMUX, DEMO_DMA_CHANNEL1, DEMO_DMA_CHANNEL_TRIGGER_INPUT); + INPUTMUX_AttachSignal(INPUTMUX, DEMO_DMA_CHANNEL2, DEMO_DMA_CHANNEL_TRIGGER_INPUT); + INPUTMUX_AttachSignal(INPUTMUX, 0, DEMO_DMA_CHANNEL_TRIGGER_OUTPUT0); + INPUTMUX_AttachSignal(INPUTMUX, DEMO_DMA_CHANNEL0, DEMO_DMA_CHANNEL_TRIGGER_INPUT); + + /* configuration for channel0 */ + DMA_CreateHandle(&s_DMA_Handle0, DMA0, DEMO_DMA_CHANNEL0); + DMA_EnableChannel(DMA0, DEMO_DMA_CHANNEL0); + DMA_SetCallback(&s_DMA_Handle0, DMA0_Callback, NULL); + /* configuration for channel1 */ + DMA_CreateHandle(&s_DMA_Handle1, DMA0, DEMO_DMA_CHANNEL1); + DMA_EnableChannel(DMA0, DEMO_DMA_CHANNEL1); + DMA_SetCallback(&s_DMA_Handle1, DMA1_Callback, NULL); + /* configuration for channel2 */ + DMA_CreateHandle(&s_DMA_Handle2, DMA0, DEMO_DMA_CHANNEL2); + DMA_EnableChannel(DMA0, DEMO_DMA_CHANNEL2); + DMA_SetCallback(&s_DMA_Handle2, DMA2_Callback, NULL); + + /* DMA channel0 trigger configurations */ + DMA_SetChannelConfig(DMA0, DEMO_DMA_CHANNEL0, &s_channelTrigger, false); + DMA_SetChannelConfig(DMA0, DEMO_DMA_CHANNEL1, &s_channelTrigger, false); + DMA_SetChannelConfig(DMA0, DEMO_DMA_CHANNEL2, &s_channelTrigger, false); + + DMA_SetupDescriptor(&(s_dma_table1[0]), + DMA_CHANNEL_XFER(false, false, false, true, 4U, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, 16U), + s_srcBuffer3, &s_destBuffer[12], NULL); + /* submit channel0 transfer parameter */ + DMA_SubmitChannelTransferParameter(&s_DMA_Handle0, + DMA_CHANNEL_XFER(true, true, true, false, 4U, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, 16U), + s_srcBuffer0, &s_destBuffer[0], &(s_dma_table1[0])); + + /* submit channel1 transfer parameter */ + DMA_SubmitChannelTransferParameter(&s_DMA_Handle1, + DMA_CHANNEL_XFER(false, false, true, false, 4, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, 16U), + s_srcBuffer1, &s_destBuffer[4], NULL); + + /* submit channel2 transfer parameter */ + DMA_SubmitChannelTransferParameter(&s_DMA_Handle2, + DMA_CHANNEL_XFER(false, false, true, false, 4, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, 16U), + s_srcBuffer2, &s_destBuffer[8], NULL); + + /* software trigger channl0 transfer start firstly */ + DMA_DoChannelSoftwareTrigger(DMA0, DEMO_DMA_CHANNEL0); + + /* Wait channel1 DMA transfer finish */ + while (s_Transfer1_Done != true) + { + } + /* Wait channel2 DMA transfer finish */ + while (s_Transfer2_Done != true) + { + } + /* Wait channel0 DMA transfer finish */ + while (s_Transfer0_Done != true) + { + } + + /* Print destination buffer */ + PRINTF("\r\nDMA channel chain example finish.\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < DEST_BUFFER_LENGTH; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + while (1) + { + } +} diff --git a/boards/lpc845breakout/driver_examples/dma/channel_chain/dma_channel_chain_v3_9.xml b/boards/lpc845breakout/driver_examples/dma/channel_chain/dma_channel_chain_v3_9.xml new file mode 100644 index 0000000..232b185 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/channel_chain/dma_channel_chain_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/dma/channel_chain/pin_mux.c b/boards/lpc845breakout/driver_examples/dma/channel_chain/pin_mux.c new file mode 100644 index 0000000..8cef67b --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/channel_chain/pin_mux.c @@ -0,0 +1,111 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/dma/channel_chain/pin_mux.h b/boards/lpc845breakout/driver_examples/dma/channel_chain/pin_mux.h new file mode 100644 index 0000000..c2a4479 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/channel_chain/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/dma/channel_chain/readme.txt b/boards/lpc845breakout/driver_examples/dma/channel_chain/readme.txt new file mode 100644 index 0000000..52f69f4 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/channel_chain/readme.txt @@ -0,0 +1,54 @@ +Overview +======== +The DMA channel chain transfer example is a simple demonstration program about how to use channel chain feaute with the SDK software. +In this example three channel is used, + + ------->channel1------->channel0 + | +channel0--> + | + ------->channel2 + +Channel0 is configured with two descriptor, first descriptor is linked to the second, then trigger the channel0 by software, after channel0 first descriptor finish, it will trigger channel1 and channel2 start transfer, after channel1 descriptor exhaust it will trigger channel0, then channel0 second descritpor will be carried out, after second descriptor exhaust, example finish. + + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +When the example runs successfully, the following message is displayed in the terminal: +~~~~~~~~~~~~~~~~~~~~ +DMA channel chain example begin. +Destination Buffer: +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +DMA channel chain example finish. +Destination Buffer: +1 2 3 4 11 22 33 44 111 222 333 444 1111 2222 3333 4444 +~~~~~~~~~~~~~~~~~~~~~ + diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/CMakeLists.txt new file mode 100644 index 0000000..5494127 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(dma_interleave_transfer) + +set(MCUX_SDK_PROJECT_NAME dma_interleave_transfer.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../dma_interleave_transfer.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/board.c b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/board.h b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/dma/interleave_transfer/clock_config.c b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/interleave_transfer/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define BUFF_LENGTH 4U +#define DMA_DESCRIPTOR_NUM 2U +#define DMA_LINK_TRANSFER_COUNT 10 +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +static dma_handle_t s_DMA_Handle; +static volatile bool s_Transfer_Done = false; + +DMA_ALLOCATE_LINK_DESCRIPTORS(s_dma_table, DMA_DESCRIPTOR_NUM); +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_srcBuffer1[BUFF_LENGTH], sizeof(uint32_t)) = {1, 2, 3, 4}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_srcBuffer2[4], sizeof(uint32_t)) = {11, 22, 33, 44}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_destBuffer[BUFF_LENGTH * DMA_DESCRIPTOR_NUM], + sizeof(uint32_t)) = {0x00}; +static volatile uint32_t s_transferCount = 0; +/******************************************************************************* + * Code + ******************************************************************************/ + +/* User callback function for DMA transfer. */ +void DMA_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + if (transferDone) + { + if (++s_transferCount > DMA_LINK_TRANSFER_COUNT) + { + s_Transfer_Done = true; + DMA_DisableChannel(DMA0, 0); + } + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + uint32_t i = 0; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + /* Print source buffer */ + PRINTF("DMA linked transfer example begin.\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < BUFF_LENGTH * DMA_DESCRIPTOR_NUM; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + + DMA_Init(DMA0); + DMA_CreateHandle(&s_DMA_Handle, DMA0, 0); + DMA_EnableChannel(DMA0, 0); + DMA_SetCallback(&s_DMA_Handle, DMA_Callback, NULL); + + DMA_SetupDescriptor(&(s_dma_table[0]), + DMA_CHANNEL_XFER(true, false, false, true, 4U, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, 16U), + s_srcBuffer1, &s_destBuffer[0], &(s_dma_table[1])); + + DMA_SetupDescriptor(&(s_dma_table[1]), + DMA_CHANNEL_XFER(true, false, false, true, 4U, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, 16U), + s_srcBuffer2, &s_destBuffer[4], &(s_dma_table[0])); + + DMA_SubmitChannelDescriptor(&s_DMA_Handle, &(s_dma_table[0])); + DMA_StartTransfer(&s_DMA_Handle); + /* Wait for DMA transfer finish */ + while (s_Transfer_Done != true) + { + } + /* Print destination buffer */ + PRINTF("\r\nDMA linked transfer example finish.\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < BUFF_LENGTH * DMA_DESCRIPTOR_NUM; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + while (1) + { + } +} diff --git a/boards/lpc845breakout/driver_examples/dma/linked_transfer/dma_linked_transfer_v3_9.xml b/boards/lpc845breakout/driver_examples/dma/linked_transfer/dma_linked_transfer_v3_9.xml new file mode 100644 index 0000000..94730a0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/linked_transfer/dma_linked_transfer_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/dma/linked_transfer/pin_mux.c b/boards/lpc845breakout/driver_examples/dma/linked_transfer/pin_mux.c new file mode 100644 index 0000000..8cef67b --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/linked_transfer/pin_mux.c @@ -0,0 +1,111 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/dma/linked_transfer/pin_mux.h b/boards/lpc845breakout/driver_examples/dma/linked_transfer/pin_mux.h new file mode 100644 index 0000000..c2a4479 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/linked_transfer/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/dma/linked_transfer/readme.txt b/boards/lpc845breakout/driver_examples/dma/linked_transfer/readme.txt new file mode 100644 index 0000000..273bd61 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/linked_transfer/readme.txt @@ -0,0 +1,60 @@ +Overview +======== +The DMA linked example is a simple demonstration program that uses the SDK software. +It executes linked transfer(ping pong case) from the source buffer to destination buffer using the SDK DMA drivers. + +Two descriptors are used, A is linked to B, B is linked to A. + +A------>B-------> +^ | +| | +---------<------- + +The purpose of this example is to show how to use the DMA and to provide a simple example for +debugging and further development. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +When the example runs successfully, the following message is displayed in the terminal: +~~~~~~~~~~~~~~~~~~~~~ +DMA linked transfer example begin. + +Destination Buffer: + +0 0 0 0 0 0 0 0 + +DMA linked transfer example finish. + +Destination Buffer: + +1 2 3 4 11 22 33 44 +~~~~~~~~~~~~~~~~~~~~~ + diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/CMakeLists.txt new file mode 100644 index 0000000..7779613 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(dma_m2m_polling) + +set(MCUX_SDK_PROJECT_NAME dma_m2m_polling.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../dma_m2m_polling.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/board.c b/boards/lpc845breakout/driver_examples/dma/m2m_polling/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/board.h b/boards/lpc845breakout/driver_examples/dma/m2m_polling/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/dma/m2m_polling/clock_config.c b/boards/lpc845breakout/driver_examples/dma/m2m_polling/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/m2m_polling/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define BUFF_LENGTH 4U + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +dma_handle_t g_DMA_Handle; +volatile bool g_Transfer_Done = false; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(uint32_t s_srcBuffer[BUFF_LENGTH], sizeof(uint32_t)) = {0x01, 0x02, 0x03, 0x04}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(uint32_t s_destBuffer[BUFF_LENGTH], sizeof(uint32_t)) = {0x00, 0x00, 0x00, 0x00}; +/******************************************************************************* + * Code + ******************************************************************************/ + +/* User callback function for DMA transfer. */ +void DMA_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + if (transferDone) + { + g_Transfer_Done = true; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + uint32_t i = 0; + dma_channel_config_t transferConfig; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + /* Print source buffer */ + PRINTF("DMA memory to memory transfer example begin.\r\n\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < BUFF_LENGTH; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + /* Configure DMA one shot transfer */ + /* + * userConfig.enableRoundRobinArbitration = false; + * userConfig.enableHaltOnError = true; + * userConfig.enableContinuousLinkMode = false; + * userConfig.enableDebugMode = false; + */ + DMA_Init(DMA0); + DMA_CreateHandle(&g_DMA_Handle, DMA0, 0); + DMA_EnableChannel(DMA0, 0); + DMA_SetCallback(&g_DMA_Handle, DMA_Callback, NULL); + DMA_PrepareChannelTransfer(&transferConfig, s_srcBuffer, &s_destBuffer[0], + DMA_CHANNEL_XFER(false, false, true, false, 4, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, 16), + kDMA_MemoryToMemory, NULL, NULL); + DMA_SubmitChannelTransfer(&g_DMA_Handle, &transferConfig); + + DMA_StartTransfer(&g_DMA_Handle); + /* Wait for DMA transfer finish */ + while (g_Transfer_Done != true) + { + } + /* Print destination buffer */ + PRINTF("\r\n\r\nDMA memory to memory transfer example finish.\r\n\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < BUFF_LENGTH; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + while (1) + { + } +} diff --git a/boards/lpc845breakout/driver_examples/dma/memory_to_memory/dma_memory_to_memory_v3_9.xml b/boards/lpc845breakout/driver_examples/dma/memory_to_memory/dma_memory_to_memory_v3_9.xml new file mode 100644 index 0000000..827e354 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/memory_to_memory/dma_memory_to_memory_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/dma/memory_to_memory/pin_mux.c b/boards/lpc845breakout/driver_examples/dma/memory_to_memory/pin_mux.c new file mode 100644 index 0000000..8cef67b --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/memory_to_memory/pin_mux.c @@ -0,0 +1,111 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/dma/memory_to_memory/pin_mux.h b/boards/lpc845breakout/driver_examples/dma/memory_to_memory/pin_mux.h new file mode 100644 index 0000000..c2a4479 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/memory_to_memory/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/dma/memory_to_memory/readme.txt b/boards/lpc845breakout/driver_examples/dma/memory_to_memory/readme.txt new file mode 100644 index 0000000..85d7a47 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/memory_to_memory/readme.txt @@ -0,0 +1,49 @@ +Overview +======== +The DMA memory to memory example is a simple demonstration program that uses the SDK software. +It executes one shot transfer from source buffer to destination buffer using the SDK DMA drivers. +The purpose of this example is to show how to use the DMA and to provide a simple example for +debugging and further development. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +The log below shows example output of the dma driver demo in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +DMA memory to memory transfer example begin. + +Destination Buffer: +0 0 0 0 + +DMA memory to memory transfer example finish. + +Destination Buffer: +1 2 3 4 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/CMakeLists.txt new file mode 100644 index 0000000..c66c6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(dma_wrap_transfer) + +set(MCUX_SDK_PROJECT_NAME dma_wrap_transfer.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../dma_wrap_transfer.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/board.c b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/board.h b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/dma/wrap_transfer/clock_config.c b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/dma/wrap_transfer/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/gpio/led_output/pin_mux.c b/boards/lpc845breakout/driver_examples/gpio/led_output/pin_mux.c new file mode 100644 index 0000000..bd0d2d5 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/gpio/led_output/pin_mux.c @@ -0,0 +1,149 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +pin_labels: +- {pin_num: '11', pin_signal: PIO1_0/CAPT_X1, label: LED GREEN} +- {pin_num: '14', pin_signal: PIO1_1/CAPT_X2, label: LED BLUE} +- {pin_num: '16', pin_signal: PIO1_2/CAPT_X3, label: LED RED} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '11', peripheral: GPIO, signal: 'PIO1, 0', pin_signal: PIO1_0/CAPT_X1, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '6', peripheral: GPIO, signal: 'PIO0, 4', pin_signal: PIO0_4/ADC_11, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + const uint32_t IOCON_INDEX_PIO0_4_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN4 (coords: 6) is configured as GPIO, PIO0, 4. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_4, IOCON_INDEX_PIO0_4_config); + + const uint32_t IOCON_INDEX_PIO1_0_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN0 (coords: 11) is configured as GPIO, PIO1, 0. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_0, IOCON_INDEX_PIO1_0_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/gpio/led_output/pin_mux.h b/boards/lpc845breakout/driver_examples/gpio/led_output/pin_mux.h new file mode 100644 index 0000000..c2a4479 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/gpio/led_output/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/gpio/led_output/readme.txt b/boards/lpc845breakout/driver_examples/gpio/led_output/readme.txt new file mode 100644 index 0000000..3165549 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/gpio/led_output/readme.txt @@ -0,0 +1,55 @@ +Overview +======== +The GPIO Example project is a demonstration program that uses the KSDK software to manipulate the general-purpose +outputs. The example use LEDs and buttons to demonstrates GPIO API for port and pin manipulation (init, set, +clear, and toggle). + + + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +The log below shows example output of the gpio driver demo in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + GPIO Driver example + + The LED is taking turns to shine. + + Standard port read: 3fffff + + Masked port read: 3f0000 + + Port state: fffff067 + + Port state: fffff067 + ... +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- When press K3 the LD1 GREEN will turn to shine. diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/CMakeLists.txt new file mode 100644 index 0000000..a3e4ec6 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(iap_basic) + +set(MCUX_SDK_PROJECT_NAME iap_basic.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../iap_basic.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_iap_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/board.c b/boards/lpc845breakout/driver_examples/iap/iap_basic/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/board.h b/boards/lpc845breakout/driver_examples/iap/iap_basic/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/iap/iap_basic/clock_config.c b/boards/lpc845breakout/driver_examples/iap/iap_basic/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_basic/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/iap/iap_faim/pin_mux.c b/boards/lpc845breakout/driver_examples/iap/iap_faim/pin_mux.c new file mode 100644 index 0000000..ee9f1bd --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_faim/pin_mux.c @@ -0,0 +1,161 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT +pin_labels: +- {pin_num: '11', pin_signal: PIO1_0/CAPT_X1, label: 'LD1[3]/CN1[31]/PIO1_0/CAPT_X1', identifier: LED_GREEN} +- {pin_num: '14', pin_signal: PIO1_1/CAPT_X2, label: 'LD1[4]/CN1[30]/PIO1_1/CAPT_X2', identifier: LED_BLUE} +- {pin_num: '16', pin_signal: PIO1_2/CAPT_X3, label: 'LD1[2]/CN1[29]/PIO1_2/CAPT_X3', identifier: LED_RED} +- {pin_num: '1', pin_signal: PIO1_8/CAPT_YL, label: S1/PIO1_8/CAPT_YL, identifier: CAPY_LOW} +- {pin_num: '2', pin_signal: PIO0_13/ADC_10, label: 'CN1[26]/PIO0_13/ADC_10'} +- {pin_num: '3', pin_signal: PIO1_9/CAPT_YH, label: S1/PIO1_9/CAPT_YH, identifier: CAPY_HIGH} +- {pin_num: '4', pin_signal: PIO0_12, label: 'K1/CN1[25]/PIO0_12', identifier: K1} +- {pin_num: '5', pin_signal: RESETN/PIO0_5, label: 'K2/CN3[10]/CN1[9]/CN1[34]/RESET/PIO0_5', identifier: K2} +- {pin_num: '6', pin_signal: PIO0_4/ADC_11, label: 'K3/CN1[35]/PIO0_4/ADC_11/TRSTN/WAKEUP', identifier: K3} +- {pin_num: '7', pin_signal: PIO0_28/WKTCLKIN, label: 'CN1[14]/PIO0_28/WKTCLKIN'} +- {pin_num: '8', pin_signal: SWCLK/PIO0_3, label: 'CN3[4]/CN1[36]/SWCLK/PIO0_3/TCK'} +- {pin_num: '9', pin_signal: PIO0_31/CAPT_X0, label: S1/PIO0_31/CAPT_X0, identifier: CAPX} +- {pin_num: '10', pin_signal: SWDIO/PIO0_2, label: 'CN3[2]/CN1[37]/SWDIO/PIO0_2/TMS'} +- {pin_num: '12', pin_signal: PIO0_11/I2C0_SDA, label: 'CN1[24]/PIO0_11/I2C0_SDA'} +- {pin_num: '13', pin_signal: PIO0_10/I2C0_SCL, label: 'CN1[23]/PIO0_10/I2C0_SCL'} +- {pin_num: '15', pin_signal: PIO0_16, label: 'CN1[1]/PIO0_16'} +- {pin_num: '17', pin_signal: PIO0_27, label: 'CN1[13]/PIO0_27'} +- {pin_num: '18', pin_signal: PIO0_26, label: 'CN1[12]/PIO0_26'} +- {pin_num: '19', pin_signal: PIO0_25, label: 'CN1[11]/PIO0_25', identifier: DEBUG_UART_TX} +- {pin_num: '20', pin_signal: PIO0_24, label: 'CN1[10]/PIO0_24', identifier: DEBUG_UART_RX} +- {pin_num: '21', pin_signal: PIO1_3/CAPT_X4, label: PIO1_3/CAPT_X4} +- {pin_num: '22', pin_signal: PIO0_15, label: 'CN1[28]/PIO0_15'} +- {pin_num: '23', pin_signal: PIO1_4/CAPT_X5, label: PIO1_4/CAPT_X5} +- {pin_num: '24', pin_signal: PIO0_1/ACMP_I2/CLKIN, label: 'CN1[38]/PIO0_1/ACMP_I2/CLKIN/TDI'} +- {pin_num: '25', pin_signal: PIO0_9/XTALOUT, label: 'CN1[18]/CN1[22]/PIO0_9/XTALOUT'} +- {pin_num: '26', pin_signal: PIO0_8/XTALIN, label: 'CN1[19]/CN1[21]/PIO0_8/XTALIN'} +- {pin_num: '27', pin_signal: PIO1_5/CAPT_X6, label: PIO1_5/CAPT_X6} +- {pin_num: '28', pin_signal: PIO1_6/CAPT_X7, label: PIO1_6/CAPT_X7} +- {pin_num: '29', pin_signal: VDD29, label: VDD, identifier: CPU_VDD} +- {pin_num: '30', pin_signal: VSS30, label: VSS} +- {pin_num: '31', pin_signal: VREFN, label: FB2/VREFN} +- {pin_num: '32', pin_signal: VREFP, label: FB1/VREFP} +- {pin_num: '33', pin_signal: PIO0_7/ADC_0, label: 'CN1[32]/RV1/PIO0_7/ADC_0'} +- {pin_num: '34', pin_signal: PIO0_6/ADC_1/ACMPVREF, label: 'CN1[33]/PIO0_6/ADC_1/ACMPVREF'} +- {pin_num: '35', pin_signal: PIO1_7/CAPT_X8, label: PIO1_7/CAPT_X8} +- {pin_num: '36', pin_signal: PIO0_0/ACMP_I1, label: 'CN1[39]/PIO0_0/ACMP_I1/TDO'} +- {pin_num: '37', pin_signal: PIO0_14/ACMP_I3/ADC_2, label: 'CN1[27]/PIO0_14/ACMP_I3/ADC_2'} +- {pin_num: '38', pin_signal: PIO0_29/DACOUT_1, label: 'CN1[15]/PIO0_29/DACOUT_1'} +- {pin_num: '39', pin_signal: PIO0_23/ADC_3/ACMP_I4, label: 'CN1[8]/PIO0_23/ADC_3/ACMP_I4'} +- {pin_num: '40', pin_signal: VDDA, label: FB1/VDDA, identifier: VDDA} +- {pin_num: '41', pin_signal: VSSA, label: FB2/VSSA, identifier: VSSA} +- {pin_num: '42', pin_signal: PIO0_30/ACMP_I5, label: S1/PIO0_30/ACMP_I5, identifier: CAPY_R} +- {pin_num: '43', pin_signal: PIO0_22/ADC_4, label: 'CN1[7]/PIO0_22/ADC_4'} +- {pin_num: '44', pin_signal: PIO0_21/ADC_5, label: 'CN1[6]/PIO0_21/ADC_5'} +- {pin_num: '45', pin_signal: PIO0_20/ADC_6, label: 'CN1[5]/PIO0_20/ADC_6'} +- {pin_num: '46', pin_signal: PIO0_19/ADC_7, label: 'CN1[4]/PIO0_19/ADC_7'} +- {pin_num: '47', pin_signal: PIO0_18/ADC_8, label: 'CN1[3]/PIO0_18/ADC_8'} +- {pin_num: '48', pin_signal: PIO0_17/ADC_9/DACOUT_0, label: 'CN1[2]/PIO0_17/ADC_9/DACOUT_0'} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t DEBUG_UART_RX = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, DEBUG_UART_RX); + + const uint32_t DEBUG_UART_TX = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, DEBUG_UART_TX); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/iap/iap_faim/pin_mux.h b/boards/lpc845breakout/driver_examples/iap/iap_faim/pin_mux.h new file mode 100644 index 0000000..f8756d7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_faim/pin_mux.h @@ -0,0 +1,73 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! @name PIO0_24 (number 20), CN1[10]/PIO0_24 + @{ */ +#define BOARD_INITPINS_DEBUG_UART_RX_PORT 0U /*!<@brief PORT device index: 0 */ +#define BOARD_INITPINS_DEBUG_UART_RX_PIN 24U /*!<@brief PORT pin number */ +#define BOARD_INITPINS_DEBUG_UART_RX_PIN_MASK (1U << 24U) /*!<@brief PORT pin mask */ + /* @} */ + +/*! @name PIO0_25 (number 19), CN1[11]/PIO0_25 + @{ */ +#define BOARD_INITPINS_DEBUG_UART_TX_PORT 0U /*!<@brief PORT device index: 0 */ +#define BOARD_INITPINS_DEBUG_UART_TX_PIN 25U /*!<@brief PORT pin number */ +#define BOARD_INITPINS_DEBUG_UART_TX_PIN_MASK (1U << 25U) /*!<@brief PORT pin mask */ + /* @} */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/iap/iap_faim/readme.txt b/boards/lpc845breakout/driver_examples/iap/iap_faim/readme.txt new file mode 100644 index 0000000..9c495ba --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_faim/readme.txt @@ -0,0 +1,47 @@ +Overview +======== +The IAP FAIM project is a simple demonstration program of the SDK IAP +driver. It writes and reads the FAIM page. A message a printed on the UART terminal +as FAIM read and write operations are performed. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPCXpresso845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the Demo +================ +1. Connect a micro USB cable between the host PC and the LPC-Link USB port (J8) on the target board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. + +Running the demo +================ +1. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +The following lines are printed to the serial terminal when the demo program is executed. + +IAP FAIM example + +Write FAIM sector 1 + +Read FAIM sector 1 + +End of IAP FAIM Example diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/CMakeLists.txt new file mode 100644 index 0000000..31290a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(iap_flash) + +set(MCUX_SDK_PROJECT_NAME iap_flash.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../iap_flash.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_iap_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/board.c b/boards/lpc845breakout/driver_examples/iap/iap_flash/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/board.h b/boards/lpc845breakout/driver_examples/iap/iap_flash/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/iap/iap_flash/clock_config.c b/boards/lpc845breakout/driver_examples/iap/iap_flash/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/iap/iap_flash/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! MRT_CHANNEL_INTVAL_IVALUE_MASK) + { + mrtDividerValue = 0; + mrtEnableCount = true; + while (USEC_TO_COUNT((250000U >> (++mrtDividerValue)), mrt_clock) > MRT_CHANNEL_INTVAL_IVALUE_MASK) + { + } + MRT_StartTimer(MRT0, kMRT_Channel_0, USEC_TO_COUNT((250000U >> mrtDividerValue), mrt_clock)); + } + else + { + MRT_StartTimer(MRT0, kMRT_Channel_0, USEC_TO_COUNT(250000U, mrt_clock)); + } + + while (true) + { + /* Check whether occur interupt and toggle LED */ + if (true == mrtIsrFlag) + { + PRINTF("\r\n Channel No.0 interrupt is occurred !"); + APP_LED_TOGGLE; + mrtCountValue = 0; + mrtIsrFlag = false; + } + } +} diff --git a/boards/lpc845breakout/driver_examples/mrt/mrt_example_v3_9.xml b/boards/lpc845breakout/driver_examples/mrt/mrt_example_v3_9.xml new file mode 100644 index 0000000..8c47dd3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/mrt/mrt_example_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/mrt/pin_mux.c b/boards/lpc845breakout/driver_examples/mrt/pin_mux.c new file mode 100644 index 0000000..a3d1d51 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/mrt/pin_mux.c @@ -0,0 +1,128 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '16', peripheral: GPIO, signal: 'PIO1, 2', pin_signal: PIO1_2/CAPT_X3, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN24 (coords: 20) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN25 (coords: 19) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + const uint32_t IOCON_INDEX_PIO1_2_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN2 (coords: 16) is configured as GPIO, PIO1, 2. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_2, IOCON_INDEX_PIO1_2_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/mrt/pin_mux.h b/boards/lpc845breakout/driver_examples/mrt/pin_mux.h new file mode 100644 index 0000000..c2a4479 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/mrt/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/driver_examples/mrt/readme.txt b/boards/lpc845breakout/driver_examples/mrt/readme.txt new file mode 100644 index 0000000..e13c534 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/mrt/readme.txt @@ -0,0 +1,43 @@ +Overview +======== +The MRT project is a simple demonstration program of the SDK MRT driver. It sets up the MRT +hardware block to trigger a periodic interrupt after every 250 milliseconds. When the PIT interrupt is triggered +a message a printed on the UART terminal and an LED is toggled on the board. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +The log below shows example output of the MRT driver demo in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Starting channel No.0 ... + Channel No.0 interrupt is occured ! + Channel No.0 interrupt is occured ! + Channel No.0 interrupt is occured ! +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/CMakeLists.txt new file mode 100644 index 0000000..6088647 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(pint_pattern_match) + +set(MCUX_SDK_PROJECT_NAME pint_pattern_match.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../pint_pattern_match.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_pint_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/board.c b/boards/lpc845breakout/driver_examples/pint/pattern_match/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/board.h b/boards/lpc845breakout/driver_examples/pint/pattern_match/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/pint/pattern_match/clock_config.c b/boards/lpc845breakout/driver_examples/pint/pattern_match/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pattern_match/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! 1U) + /* Setup Pin Interrupt 1 for falling edge */ + PINT_PinInterruptConfig(PINT, kPINT_PinInt1, kPINT_PinIntEnableFallEdge, pint_intr_callback); + /* Enable callbacks for PINT1 by Index */ + PINT_EnableCallbackByIndex(PINT, kPINT_PinInt1); +#endif + +#if (DEMO_PIN_NUM > 2U) + /* Setup Pin Interrupt 2 for falling edge */ + PINT_PinInterruptConfig(PINT, kPINT_PinInt2, kPINT_PinIntEnableFallEdge, pint_intr_callback); + /* Enable callbacks for PINT2 by Index */ + PINT_EnableCallbackByIndex(PINT, kPINT_PinInt2); +#endif + + PRINTF("\r\nPINT Pin Interrupt events are configured\r\n"); + PRINTF("\r\nPress corresponding switches to generate events\r\n"); + while (1) + { + __WFI(); + } +} diff --git a/boards/lpc845breakout/driver_examples/pint/pin_interrupt/pint_pin_interrupt_v3_9.xml b/boards/lpc845breakout/driver_examples/pint/pin_interrupt/pint_pin_interrupt_v3_9.xml new file mode 100644 index 0000000..552dc80 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pin_interrupt/pint_pin_interrupt_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/pint/pin_interrupt/readme.txt b/boards/lpc845breakout/driver_examples/pint/pin_interrupt/readme.txt new file mode 100644 index 0000000..454ce35 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/pint/pin_interrupt/readme.txt @@ -0,0 +1,46 @@ +Overview +======== +This example shows how to use SDK drivers to use the Pin interrupt & pattern match peripheral. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPC845 Breakout board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the demo +1. Connect a micro USB cable between the PC host and the CMSIS DAP USB port on the board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +The following lines are printed to the serial terminal when the demo program is executed. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +PINT Pin interrupt example + +PINT Pin Interrupt events are configured + +Press corresponding switches to generate events +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example configures "Pin Interrupt 0" to be invoked when K1 is pressed by the user. +The interrupt callback prints "PINT Pin Interrupt 0 event detected". "Pin Interrupt 1" is +is configured to be invoked when K3 is pressed. The interrupt callback prints "PINT Pin Interrupt +1 event detected". diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/CMakeLists.txt new file mode 100644 index 0000000..867ba02 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(sctimer_16bit_counter) + +set(MCUX_SDK_PROJECT_NAME sctimer_16bit_counter.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../sctimer_16bit_counter.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_sctimer_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/board.c b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/board.h b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/clock_config.c b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/16bit_counter/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define SCTIMER_CLK_FREQ CLOCK_GetFreq(kCLOCK_Fro) +#define DEMO_FIRST_SCTIMER_OUT kSCTIMER_Out_4 +#define DEMO_SECOND_SCTIMER_OUT kSCTIMER_Out_2 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Main function + */ +int main(void) +{ + sctimer_config_t sctimerInfo; + sctimer_pwm_signal_param_t pwmParam; + uint32_t stateNumber; + uint32_t eventFirstNumberOutput, eventSecondNumberOutput, eventNumberInput; + uint32_t sctimerClock; + + /* Board pin, clock, debug console init */ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + /* configure the input mux for the sct timer input1 from external pin*/ + INPUTMUX_Init(INPUTMUX); + INPUTMUX_AttachSignal(INPUTMUX, 1U, kINPUTMUX_SctPin0ToSct0); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + sctimerClock = SCTIMER_CLK_FREQ; + + /* Print a note to terminal */ + PRINTF("\r\nSCTimer example to output edge-aligned PWM signal\r\n"); + PRINTF("\r\nWhen user presses a switch the PWM signal will be seen from Out %d ", + (uint32_t)DEMO_SECOND_SCTIMER_OUT); + PRINTF("\r\nWhen user presses the switch again PWM signal on Out %d will turn off ", + (uint32_t)DEMO_SECOND_SCTIMER_OUT); + PRINTF("\r\nThe PWM signal from Out %d will remain active all the time ", (uint32_t)DEMO_FIRST_SCTIMER_OUT); + + /* Default configuration operates the counter in 32-bit mode */ + SCTIMER_GetDefaultConfig(&sctimerInfo); + + /* Initialize SCTimer module */ + SCTIMER_Init(SCT0, &sctimerInfo); + + stateNumber = SCTIMER_GetCurrentState(SCT0); + + /* Configure PWM params with frequency 24kHZ from first output */ + pwmParam.output = DEMO_FIRST_SCTIMER_OUT; + pwmParam.level = kSCTIMER_HighTrue; + pwmParam.dutyCyclePercent = 10; + + /* Schedule events in current state; State 0 */ + /* Schedule events for generating a 24KHz PWM with 10% duty cycle from first Out in the current state */ + if (SCTIMER_SetupPwm(SCT0, &pwmParam, kSCTIMER_EdgeAlignedPwm, 24000U, sctimerClock, &eventFirstNumberOutput) == + kStatus_Fail) + { + return -1; + } + + /* Schedule an event to look for a rising edge on input 1 in this state */ + if (SCTIMER_CreateAndScheduleEvent(SCT0, kSCTIMER_InputRiseEvent, 0, kSCTIMER_Input_1, kSCTIMER_Counter_U, + &eventNumberInput) == kStatus_Fail) + { + return -1; + } + + /* Transition to next state when a rising edge is detected on input 1 */ + SCTIMER_SetupNextStateActionwithLdMethod(SCT0, stateNumber + 1, eventNumberInput, true); + + /* Go to next state; State 1 */ + SCTIMER_IncreaseState(SCT0); + + /* Schedule events in State 1 */ + /* Schedule events for generating a 24KHz PWM with 50% duty cycle from second Out in this new state */ + pwmParam.output = DEMO_SECOND_SCTIMER_OUT; + pwmParam.dutyCyclePercent = 50; + if (SCTIMER_SetupPwm(SCT0, &pwmParam, kSCTIMER_EdgeAlignedPwm, 24000U, sctimerClock, &eventSecondNumberOutput) == + kStatus_Fail) + { + return -1; + } + + /* Re-enable PWM coming out from Out 4 by scheduling the PWM events in this new state */ + /* To get a PWM, the SCTIMER_SetupPwm() function creates 2 events; 1 for the pulse period and + * and 1 for the pulse, we need to schedule both events in this new state + */ + /* Schedule the period event for the PWM */ + SCTIMER_ScheduleEvent(SCT0, eventFirstNumberOutput); + /* Schedule the pulse event for the PWM */ + SCTIMER_ScheduleEvent(SCT0, eventFirstNumberOutput + 1); + + /* Schedule an event to look for a rising edge on input 1 in this state */ + if (SCTIMER_CreateAndScheduleEvent(SCT0, kSCTIMER_InputRiseEvent, 0, kSCTIMER_Input_1, kSCTIMER_Counter_U, + &eventNumberInput) == kStatus_Fail) + { + return -1; + } + + /* Transition back to State 0 when a rising edge is detected on input 1 */ + /* State 0 has only 1 PWM active, there will be no PWM from Out 2 */ + SCTIMER_SetupNextStateActionwithLdMethod(SCT0, stateNumber, eventNumberInput, true); + + /* Start the 32-bit unify timer */ + SCTIMER_StartTimer(SCT0, kSCTIMER_Counter_U); + + while (1) + { + } +} diff --git a/boards/lpc845breakout/driver_examples/sctimer/multi_state_pwm/sctimer_multi_state_pwm_v3_9.xml b/boards/lpc845breakout/driver_examples/sctimer/multi_state_pwm/sctimer_multi_state_pwm_v3_9.xml new file mode 100644 index 0000000..ae42250 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/multi_state_pwm/sctimer_multi_state_pwm_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/CMakeLists.txt new file mode 100644 index 0000000..57251b5 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(sctimer_pwm_with_dutycyle_change) + +set(MCUX_SDK_PROJECT_NAME sctimer_pwm_with_dutycyle_change.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../sctimer_update_dutycycle.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_sctimer_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/board.c b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/board.h b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/clock_config.c b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/pwm_with_dutycyle_change/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define SCTIMER_CLK_FREQ CLOCK_GetFreq(kCLOCK_Fro) +#define DEMO_FIRST_SCTIMER_OUT kSCTIMER_Out_4 +#define DEMO_SECOND_SCTIMER_OUT kSCTIMER_Out_2 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * @brief Main function + */ +int main(void) +{ + sctimer_config_t sctimerInfo; + sctimer_pwm_signal_param_t pwmParam; + uint32_t event; + uint32_t sctimerClock; + + /* Board pin, clock, debug console init */ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + sctimerClock = SCTIMER_CLK_FREQ; + + /* Print a note to terminal */ + PRINTF("\r\nSCTimer example to output 2 center-aligned PWM signals\r\n"); + PRINTF("\r\nProbe the signal using an oscilloscope"); + + SCTIMER_GetDefaultConfig(&sctimerInfo); + + /* Initialize SCTimer module */ + SCTIMER_Init(SCT0, &sctimerInfo); + + /* Configure first PWM with frequency 24kHZ from first output */ + pwmParam.output = DEMO_FIRST_SCTIMER_OUT; + pwmParam.level = kSCTIMER_HighTrue; + pwmParam.dutyCyclePercent = 50; + if (SCTIMER_SetupPwm(SCT0, &pwmParam, kSCTIMER_CenterAlignedPwm, 24000U, sctimerClock, &event) == kStatus_Fail) + { + return -1; + } + + /* Configure second PWM with different duty cycle but same frequency as before */ + pwmParam.output = DEMO_SECOND_SCTIMER_OUT; + pwmParam.level = kSCTIMER_LowTrue; + pwmParam.dutyCyclePercent = 20; + if (SCTIMER_SetupPwm(SCT0, &pwmParam, kSCTIMER_CenterAlignedPwm, 24000U, sctimerClock, &event) == kStatus_Fail) + { + return -1; + } + + /* Start the 32-bit unify timer */ + SCTIMER_StartTimer(SCT0, kSCTIMER_Counter_U); + + while (1) + { + } +} diff --git a/boards/lpc845breakout/driver_examples/sctimer/simple_pwm/sctimer_simple_pwm_v3_9.xml b/boards/lpc845breakout/driver_examples/sctimer/simple_pwm/sctimer_simple_pwm_v3_9.xml new file mode 100644 index 0000000..49305e7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/sctimer/simple_pwm/sctimer_simple_pwm_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/CMakeLists.txt new file mode 100644 index 0000000..559e995 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(spi_interrupt_master) + +set(MCUX_SDK_PROJECT_NAME spi_interrupt_master.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../spi_interrupt_master.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_minispi_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/board.c b/boards/lpc845breakout/driver_examples/spi/interrupt/master/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/board.h b/boards/lpc845breakout/driver_examples/spi/interrupt/master/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/master/clock_config.c b/boards/lpc845breakout/driver_examples/spi/interrupt/master/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/master/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_SPI_SLAVE SPI0 +#define EXAMPLE_SPI_SLAVE_IRQ SPI0_IRQn + +#define SPI_SLAVE_IRQHandler SPI0_IRQHandler + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_SlaveInit(void); +static void EXAMPLE_SlaveStartTransfer(void); +static void EXAMPLE_TransferDataCheck(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +#define BUFFER_SIZE (64) +static uint8_t txBuffer[BUFFER_SIZE]; +static uint8_t rxBuffer[BUFFER_SIZE]; +static uint32_t txIndex = BUFFER_SIZE; +static uint32_t rxIndex = BUFFER_SIZE; +static volatile bool slaveFinished = false; + +/******************************************************************************* + * Code + ******************************************************************************/ + +void SPI_SLAVE_IRQHandler(void) +{ + if ((SPI_GetStatusFlags(EXAMPLE_SPI_SLAVE) & kSPI_RxReadyFlag)) + { + rxBuffer[BUFFER_SIZE - rxIndex] = SPI_ReadData(EXAMPLE_SPI_SLAVE); + rxIndex--; + } + if ((SPI_GetStatusFlags(EXAMPLE_SPI_SLAVE) & kSPI_TxReadyFlag) && (txIndex != 0U)) + { + SPI_WriteData(EXAMPLE_SPI_SLAVE, (uint16_t)(txBuffer[BUFFER_SIZE - txIndex])); + txIndex--; + } + if ((txIndex == 0U) && (rxIndex == 0U)) + { + slaveFinished = true; + SPI_DisableInterrupts(EXAMPLE_SPI_SLAVE, kSPI_RxReadyInterruptEnable); + } + __DSB(); +} + +int main(void) +{ + /* Initialize the boards */ + /* Attach main clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach main clock to SPI0. */ + CLOCK_Select(kSPI0_Clk_From_MainClk); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + PRINTF("This is SPI interrupt functional slave example.\n\r"); + PRINTF("\n\rSlave is working....\n\r"); + + /* Initialize the slave SPI with configuration. */ + EXAMPLE_SlaveInit(); + + /* Slave start transfer with master. */ + EXAMPLE_SlaveStartTransfer(); + + /* Check transfer data. */ + EXAMPLE_TransferDataCheck(); + + /* De-initialize the slave SPI. */ + SPI_Deinit(EXAMPLE_SPI_SLAVE); + + while (1) + { + } +} + +static void EXAMPLE_SlaveInit(void) +{ + spi_slave_config_t slaveConfig = {0}; + + /* Default configuration for slave: + * userConfig.enableSlave = true; + * userConfig.polarity = kSPI_ClockPolarityActiveHigh; + * userConfig.phase = kSPI_ClockPhaseFirstEdge; + * userConfig.direction = kSPI_MsbFirst; + * userConfig.dataWidth = kSPI_Data8Bits; + * userConfig.sselPol = kSPI_SpolActiveAllLow; + */ + SPI_SlaveGetDefaultConfig(&slaveConfig); + SPI_SlaveInit(EXAMPLE_SPI_SLAVE, &slaveConfig); +} + +static void EXAMPLE_SlaveStartTransfer(void) +{ + uint32_t i = 0U; + + /* Init source buffer */ + for (i = 0U; i < BUFFER_SIZE; i++) + { + txBuffer[i] = i; + rxBuffer[i] = 0U; + } + + /* Write data to TXDAT register to trigger receive interrupt. */ + SPI_WriteData(EXAMPLE_SPI_SLAVE, txBuffer[BUFFER_SIZE - (txIndex--)]); + /* Enable SPI RX ready interrupt. */ + EnableIRQ(EXAMPLE_SPI_SLAVE_IRQ); + SPI_EnableInterrupts(EXAMPLE_SPI_SLAVE, kSPI_RxReadyInterruptEnable); +} + +static void EXAMPLE_TransferDataCheck(void) +{ + uint32_t i = 0U, err = 0U; + /* Waiting for the transmission complete. */ + while (slaveFinished != true) + { + } + + PRINTF("\n\rThe received data are:"); + for (i = 0; i < BUFFER_SIZE; i++) + { + /* Print 16 numbers in a line */ + if ((i & 0x0FU) == 0U) + { + PRINTF("\r\n"); + } + PRINTF(" 0x%02X", rxBuffer[i]); + /* Check if data matched. */ + if (txBuffer[i] != rxBuffer[i]) + { + err++; + } + } + + if (err == 0) + { + PRINTF("\n\rSlave transfer succeed!\n\r"); + } + else + { + PRINTF("\n\rSlave transfer faild!\n\r"); + } +} diff --git a/boards/lpc845breakout/driver_examples/spi/interrupt/slave/spi_interrupt_slave_v3_9.xml b/boards/lpc845breakout/driver_examples/spi/interrupt/slave/spi_interrupt_slave_v3_9.xml new file mode 100644 index 0000000..185b529 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/interrupt/slave/spi_interrupt_slave_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/CMakeLists.txt new file mode 100644 index 0000000..90068ff --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(spi_polling_master) + +set(MCUX_SDK_PROJECT_NAME spi_polling_master.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../spi_polling_master.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_minispi_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/board.c b/boards/lpc845breakout/driver_examples/spi/polling/master/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/board.h b/boards/lpc845breakout/driver_examples/spi/polling/master/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/spi/polling/master/clock_config.c b/boards/lpc845breakout/driver_examples/spi/polling/master/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/master/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_SPI_SLAVE SPI0 + + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void slaveCallback(SPI_Type *base, spi_slave_handle_t *slaveHandle, status_t status, void *userData); +static void EXAMPLE_SlaveInit(void); +static void EXAMPLE_SlaveStartTransfer(void); +static void EXAMPLE_TransferDataCheck(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +#define BUFFER_SIZE (64) +spi_slave_handle_t slaveHandle; +static uint8_t rxBuffer[BUFFER_SIZE]; +static uint8_t txBuffer[BUFFER_SIZE]; +static volatile bool slaveFinished = false; +/******************************************************************************* + * Code + ******************************************************************************/ +static void slaveCallback(SPI_Type *base, spi_slave_handle_t *slaveHandle, status_t status, void *userData) +{ + slaveFinished = true; +} + +int main(void) +{ + /* Initialize the hardware. */ + /* Attach main clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach main clock to SPI0. */ + CLOCK_Select(kSPI0_Clk_From_MainClk); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + PRINTF("This is SPI polling transfer slave example.\n\r"); + PRINTF("\n\rSlave is working....\n\r"); + + /* Initialize the slave SPI with configuration. */ + EXAMPLE_SlaveInit(); + + /* Slave start transfer with master. */ + EXAMPLE_SlaveStartTransfer(); + + /* Check transfer data. */ + EXAMPLE_TransferDataCheck(); + + /* De-initialize the SPI. */ + SPI_Deinit(EXAMPLE_SPI_SLAVE); + + while (1) + { + } +} + +static void EXAMPLE_SlaveInit(void) +{ + spi_slave_config_t userConfig; + /* Default configuration for slave: + * userConfig.enableSlave = true; + * userConfig.polarity = kSPI_ClockPolarityActiveHigh; + * userConfig.phase = kSPI_ClockPhaseFirstEdge; + * userConfig.direction = kSPI_MsbFirst; + * userConfig.dataWidth = kSPI_Data8Bits; + * userConfig.sselPol = kSPI_SpolActiveAllLow; + */ + SPI_SlaveGetDefaultConfig(&userConfig); + /* To align configuration with master. */ + userConfig.clockPhase = kSPI_ClockPhaseSecondEdge; + SPI_SlaveInit(EXAMPLE_SPI_SLAVE, &userConfig); +} + +static void EXAMPLE_SlaveStartTransfer(void) +{ + spi_transfer_t xfer = {0}; + uint32_t i = 0U; + + /* Initialize the txBuffer and rxBuffer. */ + for (i = 0; i < BUFFER_SIZE; i++) + { + txBuffer[i] = i; + rxBuffer[i] = 0U; + } + + SPI_SlaveTransferCreateHandle(EXAMPLE_SPI_SLAVE, &slaveHandle, slaveCallback, NULL); + + /* Receive data from master. */ + xfer.txData = txBuffer; + xfer.rxData = rxBuffer; + xfer.dataSize = sizeof(txBuffer); + SPI_SlaveTransferNonBlocking(EXAMPLE_SPI_SLAVE, &slaveHandle, &xfer); +} + +static void EXAMPLE_TransferDataCheck(void) +{ + uint32_t i = 0U, err = 0U; + + /* Waiting for transfer complete, if transmission is completed, the slaveFinished + * will be set to ture in slaveCallback. + */ + while (slaveFinished != true) + { + } + + PRINTF("\n\rThe received data are:"); + for (i = 0; i < BUFFER_SIZE; i++) + { + /* Print 16 numbers in a line */ + if ((i & 0x0FU) == 0U) + { + PRINTF("\n\r"); + } + PRINTF(" 0x%02X", rxBuffer[i]); + /* Check if data matched. */ + if (txBuffer[i] != rxBuffer[i]) + { + err++; + } + } + + if (err == 0) + { + PRINTF("\n\rSlave interrupt transfer succeed!\n\r"); + } + else + { + PRINTF("\n\rSlave interrupt transfer faild!\n\r"); + } +} diff --git a/boards/lpc845breakout/driver_examples/spi/polling/slave/spi_polling_slave_v3_9.xml b/boards/lpc845breakout/driver_examples/spi/polling/slave/spi_polling_slave_v3_9.xml new file mode 100644 index 0000000..80b466b --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/polling/slave/spi_polling_slave_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/CMakeLists.txt new file mode 100644 index 0000000..c74b77f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/CMakeLists.txt @@ -0,0 +1,114 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(spi_transfer_dma_master) + +set(MCUX_SDK_PROJECT_NAME spi_transfer_dma_master.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../spi_transfer_dma_master.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_minispi_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/board.c b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/board.h b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/clock_config.c b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/master/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_SPI_SLAVE SPI0 +#define EXAMPLE_SPI_SLAVE_SSEL kSPI_Ssel0Assert + +#define EXAMPLE_SPI_SLAVE_DMA_BASEADDR DMA0 +#define EXAMPLE_SPI_SLAVE_TX_CHANNEL 11 +#define EXAMPLE_SPI_SLAVE_RX_CHANNEL 10 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void SPI_DmaTxCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds); +static void SPI_DmaRxCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds); +static void EXAMPLE_SlaveInit(void); +static void EXAMPLE_SlaveDMASetup(void); +static void EXAMPLE_SlaveStartDMATransfer(void); +static void EXAMPLE_TransferDataCheck(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +#define BUFFER_SIZE (64) +static uint8_t txBuffer[BUFFER_SIZE]; +static uint8_t rxBuffer[BUFFER_SIZE]; + +dma_handle_t slaveTxHandle; +dma_handle_t slaveRxHandle; + +static volatile bool slaveTxFinished = false; +static volatile bool slaveRxFinished = false; +/******************************************************************************* + * Code + ******************************************************************************/ +static void SPI_DmaTxCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + slaveTxFinished = true; +} + +static void SPI_DmaRxCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + slaveRxFinished = true; +} + +int main(void) +{ + /* Initialize the boards */ + /* Attach main clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach main clock to SPI0. */ + CLOCK_Select(kSPI0_Clk_From_MainClk); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + /* Print example information. */ + PRINTF("This is SPI dma transfer slave example!\n\r"); + PRINTF("\n\rSlave is working....\n\r"); + + /* Initialize the slave SPI with configuration. */ + EXAMPLE_SlaveInit(); + + /* Set up slave DMA configuration. */ + EXAMPLE_SlaveDMASetup(); + + /* Slave start transfer with master. */ + EXAMPLE_SlaveStartDMATransfer(); + + /* Check transfer data. */ + EXAMPLE_TransferDataCheck(); + + /* De-initialize the DMA. */ + DMA_Deinit(EXAMPLE_SPI_SLAVE_DMA_BASEADDR); + + /* De-initialize the SPI. */ + SPI_Deinit(EXAMPLE_SPI_SLAVE); + + while (1) + { + } +} + +static void EXAMPLE_SlaveInit(void) +{ + spi_slave_config_t slaveConfig; + + /* Default configuration for slave: + * userConfig.enableSlave = true; + * userConfig.polarity = kSPI_ClockPolarityActiveHigh; + * userConfig.phase = kSPI_ClockPhaseFirstEdge; + * userConfig.direction = kSPI_MsbFirst; + * userConfig.dataWidth = kSPI_Data8Bits; + * userConfig.sselPol = kSPI_SpolActiveAllLow; + */ + SPI_SlaveGetDefaultConfig(&slaveConfig); + SPI_SlaveInit(EXAMPLE_SPI_SLAVE, &slaveConfig); +} + +static void EXAMPLE_SlaveDMASetup(void) +{ + /* DMA init */ + DMA_Init(EXAMPLE_SPI_SLAVE_DMA_BASEADDR); + + /* Enable channel and Create handle for RX channel. */ + DMA_EnableChannel(EXAMPLE_SPI_SLAVE_DMA_BASEADDR, EXAMPLE_SPI_SLAVE_RX_CHANNEL); + DMA_CreateHandle(&slaveRxHandle, EXAMPLE_SPI_SLAVE_DMA_BASEADDR, EXAMPLE_SPI_SLAVE_RX_CHANNEL); + DMA_SetCallback(&slaveRxHandle, SPI_DmaRxCallback, NULL); + + /* Enable channel and Create handle for TX channel. */ + DMA_EnableChannel(EXAMPLE_SPI_SLAVE_DMA_BASEADDR, EXAMPLE_SPI_SLAVE_TX_CHANNEL); + DMA_CreateHandle(&slaveTxHandle, EXAMPLE_SPI_SLAVE_DMA_BASEADDR, EXAMPLE_SPI_SLAVE_TX_CHANNEL); + DMA_SetCallback(&slaveTxHandle, SPI_DmaTxCallback, NULL); + + /* Set the channel priority. */ + DMA_SetChannelPriority(EXAMPLE_SPI_SLAVE_DMA_BASEADDR, EXAMPLE_SPI_SLAVE_TX_CHANNEL, kDMA_ChannelPriority3); + DMA_SetChannelPriority(EXAMPLE_SPI_SLAVE_DMA_BASEADDR, EXAMPLE_SPI_SLAVE_RX_CHANNEL, kDMA_ChannelPriority2); +} + +static void EXAMPLE_SlaveStartDMATransfer(void) +{ + uint32_t i = 0U; + dma_transfer_config_t slaveTxDmaConfig, slaveRxDmaConfig; + + /* Init Buffer*/ + for (i = 0; i < BUFFER_SIZE; i++) + { + txBuffer[i] = i; + } + + /* Prepare and start DMA RX transfer. */ + DMA_PrepareTransfer(&slaveRxDmaConfig, (void *)&EXAMPLE_SPI_SLAVE->RXDAT, rxBuffer, sizeof(uint8_t), BUFFER_SIZE, + kDMA_PeripheralToMemory, NULL); + DMA_SubmitTransfer(&slaveRxHandle, &slaveRxDmaConfig); + + DMA_StartTransfer(&slaveRxHandle); + + /* Prepare and start DMA TX transfer. */ + DMA_PrepareTransfer(&slaveTxDmaConfig, txBuffer, (void *)&EXAMPLE_SPI_SLAVE->TXDAT, sizeof(uint8_t), BUFFER_SIZE, + kDMA_MemoryToPeripheral, NULL); + DMA_SubmitTransfer(&slaveTxHandle, &slaveTxDmaConfig); + + DMA_StartTransfer(&slaveTxHandle); +} +static void EXAMPLE_TransferDataCheck(void) +{ + uint32_t i = 0U, err = 0U; + + /* Waiting for the transfer complete. */ + while (!(slaveTxFinished | slaveRxFinished)) + { + } + + PRINTF("\n\rThe received data are:"); + /*Check if the data is right*/ + err = 0U; + for (i = 0; i < BUFFER_SIZE; i++) + { + /* Print 16 numbers in a line */ + if ((i & 0x0FU) == 0U) + { + PRINTF("\n\r"); + } + PRINTF(" 0x%02X", rxBuffer[i]); + /* Check if data matched. */ + if (txBuffer[i] != rxBuffer[i]) + { + err++; + } + } + + if (err == 0) + { + PRINTF("\n\rSlave DMA transfer succeed!\n\r"); + } + else + { + PRINTF("\n\rSlave DMA transfer faild!\n\r"); + } +} diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_dma/slave/spi_transfer_dma_slave_v3_9.xml b/boards/lpc845breakout/driver_examples/spi/transfer_dma/slave/spi_transfer_dma_slave_v3_9.xml new file mode 100644 index 0000000..8b15983 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_dma/slave/spi_transfer_dma_slave_v3_9.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/CMakeLists.txt new file mode 100644 index 0000000..dd9879f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(spi_transfer_interrupt_master) + +set(MCUX_SDK_PROJECT_NAME spi_transfer_interrupt_master.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../spi_transfer_interrupt_master.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_minispi_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/board.c b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/board.h b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/clock_config.c b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/master/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_SPI_SLAVE SPI0 + + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void slaveCallback(SPI_Type *base, spi_slave_handle_t *slaveHandle, status_t status, void *userData); +static void EXAMPLE_SlaveInit(void); +static void EXAMPLE_SlaveStartTransfer(void); +static void EXAMPLE_TransferDataCheck(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +#define BUFFER_SIZE (64) +spi_slave_handle_t slaveHandle; +static uint8_t rxBuffer[BUFFER_SIZE]; +static uint8_t txBuffer[BUFFER_SIZE]; +static volatile bool slaveFinished = false; +/******************************************************************************* + * Code + ******************************************************************************/ +static void slaveCallback(SPI_Type *base, spi_slave_handle_t *slaveHandle, status_t status, void *userData) +{ + slaveFinished = true; +} + +int main(void) +{ + /* Initialize the hardware. */ + /* Attach main clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach main clock to SPI0. */ + CLOCK_Select(kSPI0_Clk_From_MainClk); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + PRINTF("This is SPI interrupt transfer slave example.\n\r"); + PRINTF("\n\rSlave is working....\n\r"); + + /* Initialize the slave SPI with configuration. */ + EXAMPLE_SlaveInit(); + + /* Slave start transfer with master. */ + EXAMPLE_SlaveStartTransfer(); + + /* Check transfer data. */ + EXAMPLE_TransferDataCheck(); + + /* De-initialize the SPI. */ + SPI_Deinit(EXAMPLE_SPI_SLAVE); + + while (1) + { + } +} + +static void EXAMPLE_SlaveInit(void) +{ + spi_slave_config_t userConfig; + /* Default configuration for slave: + * userConfig.enableSlave = true; + * userConfig.polarity = kSPI_ClockPolarityActiveHigh; + * userConfig.phase = kSPI_ClockPhaseFirstEdge; + * userConfig.direction = kSPI_MsbFirst; + * userConfig.dataWidth = kSPI_Data8Bits; + * userConfig.sselPol = kSPI_SpolActiveAllLow; + */ + SPI_SlaveGetDefaultConfig(&userConfig); + SPI_SlaveInit(EXAMPLE_SPI_SLAVE, &userConfig); +} + +static void EXAMPLE_SlaveStartTransfer(void) +{ + spi_transfer_t xfer = {0}; + uint32_t i = 0U; + + /* Initialize the txBuffer and rxBuffer. */ + for (i = 0; i < BUFFER_SIZE; i++) + { + txBuffer[i] = i; + rxBuffer[i] = 0U; + } + + SPI_SlaveTransferCreateHandle(EXAMPLE_SPI_SLAVE, &slaveHandle, slaveCallback, NULL); + + /* Receive data from master. */ + xfer.txData = txBuffer; + xfer.rxData = rxBuffer; + xfer.dataSize = sizeof(txBuffer); + SPI_SlaveTransferNonBlocking(EXAMPLE_SPI_SLAVE, &slaveHandle, &xfer); +} + +static void EXAMPLE_TransferDataCheck(void) +{ + uint32_t i = 0U, err = 0U; + + /* Waiting for transfer complete, if transmission is completed, the slaveFinished + * will be set to ture in slaveCallback. + */ + while (slaveFinished != true) + { + } + + PRINTF("\n\rThe received data are:"); + for (i = 0; i < BUFFER_SIZE; i++) + { + /* Print 16 numbers in a line */ + if ((i & 0x0FU) == 0U) + { + PRINTF("\n\r"); + } + PRINTF(" 0x%02X", rxBuffer[i]); + /* Check if data matched. */ + if (txBuffer[i] != rxBuffer[i]) + { + err++; + } + } + + if (err == 0) + { + PRINTF("\n\rSlave interrupt transfer succeed!\n\r"); + } + else + { + PRINTF("\n\rSlave interrupt transfer faild!\n\r"); + } +} diff --git a/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/slave/spi_transfer_interrupt_slave_v3_9.xml b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/slave/spi_transfer_interrupt_slave_v3_9.xml new file mode 100644 index 0000000..cfb68ab --- /dev/null +++ b/boards/lpc845breakout/driver_examples/spi/transfer_interrupt/slave/spi_transfer_interrupt_slave_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/CMakeLists.txt new file mode 100644 index 0000000..9fa5175 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/CMakeLists.txt @@ -0,0 +1,110 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(usart_polling_example) + +set(MCUX_SDK_PROJECT_NAME usart_polling_example.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../usart_polling.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/usart/polling/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/flags.cmake new file mode 100755 index 0000000..5ddd92c --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/armgcc/flags.cmake @@ -0,0 +1,172 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DFSL_SDK_ENABLE_USART_DRIVER_TRANSACTIONAL_APIS=0 \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DFSL_SDK_ENABLE_USART_DRIVER_TRANSACTIONAL_APIS=0 \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/usart/polling/board.c b/boards/lpc845breakout/driver_examples/usart/polling/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/usart/polling/board.h b/boards/lpc845breakout/driver_examples/usart/polling/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/usart/polling/clock_config.c b/boards/lpc845breakout/driver_examples/usart/polling/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/polling/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_USART USART0 +#define EXAMPLE_USART_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_USART_CLK_FREQ CLOCK_GetFreq(EXAMPLE_USART_CLK_SRC) +#define EXAMPLE_USART_IRQn USART0_IRQn + +/*! @brief Buffer size (Unit: Byte). */ +#define RX_BUFFER_SIZE 32 +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_USARTInit(void); +static void EXAMPLE_USARTSendToTerminal(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +uint8_t g_demoInfo[] = "Usart functional API interrupt example.\r\nBoard receives characters then sends them out.\r\n"; +uint8_t g_promptInfo[] = "Please input characters and press the Enter key to finish input:\r\n"; +uint8_t g_logInfo[] = "The received characters are:"; +uint8_t g_overFlowInfo[] = "\r\nYou have input too many characters, Please try again!\r\n"; + +uint8_t rxBuffer[RX_BUFFER_SIZE]; +volatile uint8_t rxDataCounter = 0U; +volatile uint8_t txDataCounter = 0U; +volatile bool rxNewLineDetected = false; +volatile bool rxDataOverFlowFlag = false; + +/******************************************************************************* + * Code + ******************************************************************************/ + +void USART0_IRQHandler(void) +{ + uint8_t data; + + /* If TX is ready to send, and the `Enter` key is detected, send the received characters. */ + if (kUSART_TxReady & USART_GetStatusFlags(EXAMPLE_USART) && rxNewLineDetected) + { + USART_WriteByte(EXAMPLE_USART, rxBuffer[txDataCounter++]); + + if (txDataCounter == rxDataCounter) + { + /* Disable TX ready interrupt. */ + USART_DisableInterrupts(EXAMPLE_USART, kUSART_TxReadyInterruptEnable); + } + } + + /* If this Rx read flag is set, read data to buffer. */ + if (kUSART_RxReady & USART_GetStatusFlags(EXAMPLE_USART)) + { + data = USART_ReadByte(EXAMPLE_USART); + rxBuffer[rxDataCounter++] = data; + /* Wait for TX is ready, send back the character. */ + while (!(kUSART_TxReady & USART_GetStatusFlags(EXAMPLE_USART))) + { + } + USART_WriteByte(EXAMPLE_USART, data); + /* Store the received character to rx buffer. */ + if (0x0D == data) + { + rxBuffer[rxDataCounter++] = 0x0A; + /* Wait for TX is ready, send the character. */ + while (!(kUSART_TxReady & USART_GetStatusFlags(EXAMPLE_USART))) + { + } + USART_WriteByte(EXAMPLE_USART, 0x0A); + /* Set the rxNewLineDetected to true, and start a new line. */ + rxNewLineDetected = true; + } + else + { + /* If the data length is larger then the buffer size, set the rxDataOverFlowFlag. + * The last 2 bytes of rx buffer is 0x0D and 0x0A. + */ + if (rxDataCounter == RX_BUFFER_SIZE - 1) + { + rxDataOverFlowFlag = true; + } + } + } + __DSB(); +} + +/*! + * @brief Main function + */ +int main(void) +{ + /* Initialize the pins. */ + BOARD_InitBootPins(); + + /* Enable clock to 30MHz. */ + BOARD_BootClockFRO30M(); + + /* Select the main clock as source clock of USART0. */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + /* Initialize the USART instance with configuration, and enable receive ready interrupt. */ + EXAMPLE_USARTInit(); + + while (1) + { + /* If the Enter key was pressed, send the received characters out to the terminal, and start a new line.*/ + if (true == rxNewLineDetected) + { + EXAMPLE_USARTSendToTerminal(); + } + /* If too many characters were received, send prompt info to terminal. */ + if (true == rxDataOverFlowFlag) + { + /* Send the overflow info to the PC terminal. */ + USART_WriteBlocking(EXAMPLE_USART, g_overFlowInfo, + (sizeof(g_overFlowInfo) / sizeof(g_overFlowInfo[0])) - 1); + + /* Reset rxDataOverFlowFlag and rxDataCounter for next loop. */ + rxDataOverFlowFlag = false; + rxDataCounter = 0U; + } + } +} + +static void EXAMPLE_USARTInit(void) +{ + usart_config_t config; + /* Default config by using USART_GetDefaultConfig(): + * config.baudRate_Bps = 9600U; + * config.parityMode = kUSART_ParityDisabled; + * config.stopBitCount = kUSART_OneStopBit; + * config.bitCountPerChar = kUSART_8BitsPerChar; + * config.loopback = false; + * config.enableRx = false; + * config.enableTx = false; + * config.syncMode = kUSART_SyncModeDisabled; + */ + USART_GetDefaultConfig(&config); + config.enableRx = true; + config.enableTx = true; + config.baudRate_Bps = BOARD_DEBUG_USART_BAUDRATE; + + /* Initialize the USART with configuration. */ + USART_Init(EXAMPLE_USART, &config, EXAMPLE_USART_CLK_FREQ); + + /* Send demo info and prompt info out to terminal in blocking way. */ + USART_WriteBlocking(EXAMPLE_USART, g_demoInfo, (sizeof(g_demoInfo) / sizeof(g_demoInfo[0])) - 1); + USART_WriteBlocking(EXAMPLE_USART, g_promptInfo, (sizeof(g_promptInfo) / sizeof(g_promptInfo[0])) - 1); + + /* Enable USART RX ready interrupt. */ + USART_EnableInterrupts(EXAMPLE_USART, kUSART_RxReadyInterruptEnable); + EnableIRQ(EXAMPLE_USART_IRQn); +} + +static void EXAMPLE_USARTSendToTerminal(void) +{ + /* Send log info to terminal in polling-mode. */ + USART_WriteBlocking(EXAMPLE_USART, g_logInfo, (sizeof(g_logInfo) / sizeof(g_logInfo[0])) - 1); + + /* Send back the received characters to terminal in interrupt-mode. */ + USART_EnableInterrupts(EXAMPLE_USART, kUSART_TxReadyInterruptEnable); + + /* Waitting for the Tx complete. */ + while (txDataCounter != rxDataCounter) + { + } + /* Reset the txDataCounter, rxDataCounter and rxNewLineDetected for next loop. */ + txDataCounter = 0U; + rxDataCounter = 0U; + rxNewLineDetected = false; + + /* Send prompt info to terminal in polling-mode. */ + USART_WriteBlocking(EXAMPLE_USART, g_promptInfo, (sizeof(g_promptInfo) / sizeof(g_promptInfo[0])) - 1); +} diff --git a/boards/lpc845breakout/driver_examples/usart/terminal/usart_terminal_v3_9.xml b/boards/lpc845breakout/driver_examples/usart/terminal/usart_terminal_v3_9.xml new file mode 100644 index 0000000..d67406e --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/terminal/usart_terminal_v3_9.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/CMakeLists.txt new file mode 100644 index 0000000..af5fd56 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(usart_transfer_dma) + +set(MCUX_SDK_PROJECT_NAME usart_transfer_dma.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../usart_transfer_dma.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/board.c b/boards/lpc845breakout/driver_examples/usart/transfer_dma/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/board.h b/boards/lpc845breakout/driver_examples/usart/transfer_dma/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_dma/clock_config.c b/boards/lpc845breakout/driver_examples/usart/transfer_dma/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_dma/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_USART USART0 +#define EXAMPLE_USART_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_USART_CLK_FREQ CLOCK_GetFreq(EXAMPLE_USART_CLK_SRC) + +#define ECHO_BUFFER_LENGTH 8 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_USARTUserCallback(USART_Type *base, usart_handle_t *handle, status_t status, void *userData); +static void EXAMPLE_USARTInit(void); +static void EXAMPLE_USARTPrepareTransfer(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +usart_handle_t g_usartHandle; +uint8_t g_tipString[] = + "Usart interrupt transfer example.\r\nBoard receives 8 characters then sends them out.\r\nNow please input:\r\n"; + +uint8_t g_txBuffer[ECHO_BUFFER_LENGTH] = {0}; +uint8_t g_rxBuffer[ECHO_BUFFER_LENGTH] = {0}; +volatile bool rxBufferEmpty = true; +volatile bool txBufferFull = false; +volatile bool txOnGoing = false; +volatile bool rxOnGoing = false; + +usart_transfer_t xfer; +usart_transfer_t sendXfer; +usart_transfer_t receiveXfer; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* USART user callback */ +static void EXAMPLE_USARTUserCallback(USART_Type *base, usart_handle_t *handle, status_t status, void *userData) +{ + userData = userData; + + if (kStatus_USART_TxIdle == status) + { + txBufferFull = false; + txOnGoing = false; + } + + if (kStatus_USART_RxIdle == status) + { + rxBufferEmpty = false; + rxOnGoing = false; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + /* Initialize the pins. */ + BOARD_InitBootPins(); + + /* Enable clock to 30MHz. */ + BOARD_BootClockFRO30M(); + + /* Select the main clock as source clock of USART0. */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + /* Initialize USART with configuration. */ + EXAMPLE_USARTInit(); + + /* Prepare for nonblocking transfer. */ + EXAMPLE_USARTPrepareTransfer(); + + /* Set flag for waiting the transfer complete. */ + txOnGoing = true; + + /* Send g_tipString out. */ + USART_TransferSendNonBlocking(EXAMPLE_USART, &g_usartHandle, &xfer); + + /* Waiting for data sending complete. */ + while (txOnGoing) + { + } + + while (1) + { + /* If RX is idle and g_rxBuffer is empty, start to read data to g_rxBuffer. */ + if ((!rxOnGoing) && rxBufferEmpty) + { + rxOnGoing = true; + USART_TransferReceiveNonBlocking(EXAMPLE_USART, &g_usartHandle, &receiveXfer, NULL); + } + + /* If TX is idle and g_txBuffer is full, start to send data. */ + if ((!txOnGoing) && txBufferFull) + { + txOnGoing = true; + USART_TransferSendNonBlocking(EXAMPLE_USART, &g_usartHandle, &sendXfer); + } + + /* If g_txBuffer is empty and g_rxBuffer is full, copy g_rxBuffer to g_txBuffer. */ + if ((!rxBufferEmpty) && (!txBufferFull)) + { + memcpy(g_txBuffer, g_rxBuffer, ECHO_BUFFER_LENGTH); + rxBufferEmpty = true; + txBufferFull = true; + } + } +} + +static void EXAMPLE_USARTInit(void) +{ + usart_config_t config; + + /* Default config by using USART_GetDefaultConfig(): + * config.baudRate_Bps = 9600U; + * config.parityMode = kUSART_ParityDisabled; + * config.stopBitCount = kUSART_OneStopBit; + * config.bitCountPerChar = kUSART_8BitsPerChar; + * config.loopback = false; + * config.enableRx = false; + * config.enableTx = false; + * config.syncMode = kUSART_SyncModeDisabled; + */ + USART_GetDefaultConfig(&config); + config.baudRate_Bps = BOARD_DEBUG_USART_BAUDRATE; + config.enableRx = true; + config.enableTx = true; + + /* Initialize the USART with configuration. */ + USART_Init(EXAMPLE_USART, &config, EXAMPLE_USART_CLK_FREQ); +} + +static void EXAMPLE_USARTPrepareTransfer(void) +{ + /* Create USART handle, this API will initialize the g_usartHandle and install the callback function. */ + USART_TransferCreateHandle(EXAMPLE_USART, &g_usartHandle, EXAMPLE_USARTUserCallback, NULL); + + /* Set the xfer parameter to send tip info to the terminal. */ + xfer.data = g_tipString; + xfer.dataSize = sizeof(g_tipString) - 1; + + /* Set xfer parameters for sending data. */ + sendXfer.data = g_txBuffer; + sendXfer.dataSize = sizeof(g_txBuffer); + + /* Set xfers parameters for receiving data. */ + receiveXfer.data = g_rxBuffer; + receiveXfer.dataSize = sizeof(g_rxBuffer); +} diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_interrupt/usart_transfer_interrupt_v3_9.xml b/boards/lpc845breakout/driver_examples/usart/transfer_interrupt/usart_transfer_interrupt_v3_9.xml new file mode 100644 index 0000000..198652f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_interrupt/usart_transfer_interrupt_v3_9.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/CMakeLists.txt new file mode 100644 index 0000000..d568a64 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/CMakeLists.txt @@ -0,0 +1,110 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(usart_transfer_ring_buffer) + +set(MCUX_SDK_PROJECT_NAME usart_transfer_ring_buffer.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../usart_transfer_ring_buffer.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/board.c b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/board.h b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/clock_config.c b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_ring_buffer/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define USART_MASTER_BASEADDR USART1 +#define USART_SLAVE_BASEADDR USART2 +#define USART_MASTER_CLK_SRC kCLOCK_MainClk +#define USART_MASTER_CLK_FREQ CLOCK_GetFreq(USART_MASTER_CLK_SRC) +#define USART_SLAVE_CLK_SRC kCLOCK_MainClk +#define USART_SLAVE_CLK_FREQ CLOCK_GetFreq(USART_SLAVE_CLK_SRC) + +#define BUFFER_SIZE 16 +#define DEMO_USART_BAUDRATE 9600 +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_UserCallback(USART_Type *base, usart_handle_t *handle, status_t status, void *userData); +static void EXAMPLE_USARTMasterInit(void); +static void EXAMPLE_USARTSlaveInit(void); +static void EXAMPLE_USARTSlavePrepareTransfer(void); +static void EXAMPLE_USARTTransferDataCheck(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +usart_handle_t g_usartSlaveHandle; +usart_transfer_t slaveXfer; + +uint8_t g_txBuffer[BUFFER_SIZE] = {0}; +uint8_t g_rxBuffer[BUFFER_SIZE] = {0}; + +volatile bool isSlaveCompleted = false; +/******************************************************************************* + * Code + ******************************************************************************/ +static void EXAMPLE_UserCallback(USART_Type *base, usart_handle_t *handle, status_t status, void *userData) +{ + userData = userData; + + isSlaveCompleted = true; +} + +/*! + * @brief Main function + */ +int main(void) +{ + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Select clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + /* Select the main clock as source clock of USART1. */ + CLOCK_Select(kUART1_Clk_From_MainClk); + + /* Select the main clock as source clock of USART2. */ + CLOCK_Select(kUART2_Clk_From_MainClk); + + /* Turn on LED RED */ + LED_RED_INIT(LOGIC_LED_ON); + + /* Print information to the terminal. */ + PRINTF("USART synchronous transfer example.\r\n"); + PRINTF("Master USART will send data to slave on one board.\r\n"); + + /* Initialize the master USART. */ + EXAMPLE_USARTMasterInit(); + + /* Initialize the slave USART. */ + EXAMPLE_USARTSlaveInit(); + + /* Prepare transactional transfer for slave. */ + EXAMPLE_USARTSlavePrepareTransfer(); + + isSlaveCompleted = false; + + /* Firstly, start slave receiving in non-blocking mode. */ + USART_TransferReceiveNonBlocking(USART_SLAVE_BASEADDR, &g_usartSlaveHandle, &slaveXfer, NULL); + + /* USART master send data in polling mode. */ + USART_WriteBlocking(USART_MASTER_BASEADDR, g_txBuffer, BUFFER_SIZE); + + /* Wait transfer complete. */ + while (!isSlaveCompleted) + { + } + + /* Check if the received data matched. */ + EXAMPLE_USARTTransferDataCheck(); + + /* Deinit the USART instances, */ + USART_Deinit(USART_MASTER_BASEADDR); + USART_Deinit(USART_SLAVE_BASEADDR); + + while (1) + { + } +} + +static void EXAMPLE_USARTMasterInit(void) +{ + usart_config_t masterConfig; + + /* Default config by using USART_GetDefaultConfig(): + * config->baudRate_Bps = 9600U; + * config->parityMode = kUSART_ParityDisabled; + * config->stopBitCount = kUSART_OneStopBit; + * config->bitCountPerChar = kUSART_8BitsPerChar; + * config->loopback = false; + * config->enableRx = false; + * config->enableTx = false; + * config->syncMode = kUSART_SyncModeDisabled; + */ + USART_GetDefaultConfig(&masterConfig); + masterConfig.baudRate_Bps = DEMO_USART_BAUDRATE; + masterConfig.enableTx = true; + masterConfig.syncMode = kUSART_SyncModeMaster; + + /* Initialize the master USART. */ + USART_Init(USART_MASTER_BASEADDR, &masterConfig, USART_MASTER_CLK_FREQ); +} + +static void EXAMPLE_USARTSlaveInit(void) +{ + usart_config_t slaveConfig; + + /* Get slave default configuration. */ + USART_GetDefaultConfig(&slaveConfig); + slaveConfig.baudRate_Bps = 0U; + slaveConfig.enableRx = true; + slaveConfig.syncMode = kUSART_SyncModeSlave; + + /* Initialize the slave USART. */ + USART_Init(USART_SLAVE_BASEADDR, &slaveConfig, USART_SLAVE_CLK_FREQ); +} + +static void EXAMPLE_USARTSlavePrepareTransfer(void) +{ + uint32_t i = 0U; + + /* Create USART handle, this API will initialize the g_usartSlaveHandle and install the callback function. */ + USART_TransferCreateHandle(USART_SLAVE_BASEADDR, &g_usartSlaveHandle, EXAMPLE_UserCallback, NULL); + + /* Initialize the g_txBuffer and g_rxBuffer. */ + for (; i < BUFFER_SIZE; i++) + { + g_txBuffer[i] = i % 256; + g_rxBuffer[i] = 0U; + } + + /* Start slave USART to receive data. */ + slaveXfer.data = g_rxBuffer; + slaveXfer.dataSize = BUFFER_SIZE; +} + +static void EXAMPLE_USARTTransferDataCheck(void) +{ + uint8_t i = 0U; + uint8_t errCount = 0U; + + for (i = 0; i < BUFFER_SIZE; i++) + { + if (g_txBuffer[i] != g_rxBuffer[i]) + { + errCount++; + } + } + if (errCount) + { + PRINTF("Error occurred in transfer.\r\n"); + } + else + { + PRINTF("All data matched, data transfer successfully!\r\n"); + } +} diff --git a/boards/lpc845breakout/driver_examples/usart/transfer_sync_mode/usart_transfer_sync_mode_v3_9.xml b/boards/lpc845breakout/driver_examples/usart/transfer_sync_mode/usart_transfer_sync_mode_v3_9.xml new file mode 100644 index 0000000..7174a1d --- /dev/null +++ b/boards/lpc845breakout/driver_examples/usart/transfer_sync_mode/usart_transfer_sync_mode_v3_9.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/CMakeLists.txt b/boards/lpc845breakout/driver_examples/wkt/armgcc/CMakeLists.txt new file mode 100644 index 0000000..e15ef3f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(wkt_example) + +set(MCUX_SDK_PROJECT_NAME wkt_example.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../wkt.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_wkt_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/LPC845_flash.ld b/boards/lpc845breakout/driver_examples/wkt/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/build_all.bat b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/build_all.sh b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/build_debug.bat b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/build_debug.sh b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/build_release.bat b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/build_release.sh b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/clean.bat b/boards/lpc845breakout/driver_examples/wkt/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/clean.sh b/boards/lpc845breakout/driver_examples/wkt/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/driver_examples/wkt/armgcc/flags.cmake b/boards/lpc845breakout/driver_examples/wkt/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/driver_examples/wkt/board.c b/boards/lpc845breakout/driver_examples/wkt/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/driver_examples/wkt/board.h b/boards/lpc845breakout/driver_examples/wkt/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/driver_examples/wkt/clock_config.c b/boards/lpc845breakout/driver_examples/wkt/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wkt/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*!TV > WWDT->WINDOW) + { + __NOP(); + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + wwdt_config_t config; + uint32_t wdtFreq; + bool timeOutResetEnable; + + /* Init hardware*/ + /* Attach main clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + CLOCK_InitWdtOsc(kCLOCK_WdtAnaFreq600KHZ, 2U); + + /* Set Red LED to initially be high */ + APP_LED_INIT; + +#if !defined(FSL_FEATURE_WWDT_HAS_NO_PDCFG) || (!FSL_FEATURE_WWDT_HAS_NO_PDCFG) + POWER_DisablePD(kPDRUNCFG_PD_WDT_OSC); +#endif + + /* Enable the WWDT time out to reset the CPU. */ + timeOutResetEnable = true; + + /* Check if reset is due to Watchdog */ + if (WWDT_GetStatusFlags(WWDT) & kWWDT_TimeoutFlag) + { + APP_LED_ON; + PRINTF("Watchdog reset occurred\r\n"); + timeOutResetEnable = false; + /* The timeout flag can only clear when and after wwdt intial. */ + } + + /* wdog refresh test in window mode/timeout reset */ + PRINTF("\r\n--- %s test start ---\r\n", (timeOutResetEnable) ? "Time out reset" : "Window mode refresh"); + + /* The WDT divides the input frequency into it by 4 */ + wdtFreq = WDT_CLK_FREQ / 4; + + WWDT_GetDefaultConfig(&config); + + /* + * Set watchdog feed time constant to approximately 4s + * Set watchdog warning time to 512 ticks after feed time constant + * Set watchdog window time to 1s + */ + config.timeoutValue = wdtFreq * 4; + config.warningValue = 512; + config.windowValue = wdtFreq * 1; + /* Configure WWDT to reset on timeout */ + config.enableWatchdogReset = true; + /* Setup watchdog clock frequency(Hz). */ + config.clockFreq_Hz = WDT_CLK_FREQ; + WWDT_Init(WWDT, &config); + + NVIC_EnableIRQ(APP_WDT_IRQn); + + while (1) + { + if (timeOutResetEnable) + { + /* SDK_DelayAtLeastUs can be replaced by Detail User code*/ + SDK_DelayAtLeastUs(1000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); + } + else + { + /* The WINDOW register determines the highest TV value allowed when a watchdog feed is + * performed. If a feed sequence occurs when TV is greater than the value in WINDOW, a + * watchdog event will occur. User can set window same as timeout value if required. */ + delayWwdtWindow(); + WWDT_Refresh(WWDT); + PRINTF(" WDOG has been refreshed!\r\n"); + /* SDK_DelayAtLeastUs can be replaced by Detail User code*/ + SDK_DelayAtLeastUs(1000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); + } + } +} diff --git a/boards/lpc845breakout/driver_examples/wwdt/wwdt_example_v3_9.xml b/boards/lpc845breakout/driver_examples/wwdt/wwdt_example_v3_9.xml new file mode 100644 index 0000000..dd49f0c --- /dev/null +++ b/boards/lpc845breakout/driver_examples/wwdt/wwdt_example_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_example_pmp.h b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_example_pmp.h new file mode 100644 index 0000000..20d21fa --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_example_pmp.h @@ -0,0 +1,880 @@ +/* + * Copyright 2019 NXP. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +// file auto-generated from example.zip by bin2h.exe +size_t demo_pmp_len = 13896; +const unsigned char demo_pmp[13896] = { + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x1c, 0x4f, 0x2a, 0x51, 0xe6, 0xea, + 0xf2, 0x0d, 0xd0, 0x35, 0x00, 0x00, 0xf8, 0xb5, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x6d, 0x70, 0xec, 0x3c, 0x5d, 0x6f, 0xdc, 0xc6, 0x76, + 0x2b, 0x4b, 0xb6, 0xec, 0xd8, 0xf9, 0xb0, 0x93, 0xa2, 0x69, 0x6e, 0x92, 0x4b, 0x6d, 0xd2, 0x84, + 0xd4, 0x72, 0x29, 0xee, 0xea, 0x23, 0xce, 0xae, 0x68, 0xd9, 0x96, 0xa5, 0xd8, 0x40, 0x1c, 0x1b, + 0x92, 0x6e, 0x02, 0x57, 0x56, 0x05, 0x8a, 0x3b, 0xda, 0x65, 0xcc, 0x25, 0xb7, 0xe4, 0xac, 0x24, + 0x47, 0x5a, 0xd4, 0x0f, 0x7d, 0xe8, 0x43, 0xef, 0x43, 0xd1, 0xa2, 0xb8, 0x2d, 0x8a, 0xa2, 0x1f, + 0x2f, 0xed, 0x4b, 0xd1, 0x3e, 0xf6, 0xad, 0x8f, 0x7d, 0xec, 0x0f, 0xe8, 0x4b, 0xdf, 0x8a, 0xa2, + 0x2d, 0x2e, 0xd0, 0x1f, 0xe0, 0x9e, 0x99, 0xe1, 0x90, 0xc3, 0xaf, 0xd5, 0xca, 0x5f, 0x57, 0x2e, + 0x42, 0x63, 0x77, 0xc9, 0x99, 0x33, 0x67, 0xce, 0x99, 0xf3, 0x39, 0x67, 0x68, 0x7d, 0x5e, 0xfa, + 0xa0, 0xf4, 0xf4, 0x69, 0xa9, 0x74, 0xa1, 0xb4, 0xfc, 0xad, 0xe9, 0xdb, 0xe6, 0x8e, 0x83, 0xce, + 0xee, 0x99, 0x7e, 0x6d, 0x61, 0xa2, 0xef, 0xda, 0xf8, 0x5f, 0x4a, 0xa5, 0x12, 0x7b, 0xfc, 0xcb, + 0x9f, 0x97, 0x4a, 0x67, 0x4a, 0xf1, 0x75, 0xc9, 0xf5, 0xa4, 0xae, 0x19, 0x3c, 0x92, 0xe4, 0x6a, + 0x4d, 0xb9, 0xb2, 0x6a, 0x1f, 0xa0, 0x96, 0xd4, 0xf3, 0x6c, 0x17, 0x4b, 0x6e, 0xbf, 0xbb, 0x83, + 0xfc, 0x18, 0x72, 0xb2, 0xef, 0x3e, 0x72, 0xbd, 0x7d, 0x77, 0x2c, 0x6a, 0x79, 0xfa, 0xf4, 0xe9, + 0xef, 0x8a, 0xbf, 0xfc, 0x1a, 0x0b, 0x3f, 0xe9, 0xe7, 0x33, 0xa9, 0xf6, 0x0c, 0x30, 0xf9, 0xfd, + 0xfd, 0x77, 0xe1, 0xf7, 0xc9, 0x79, 0x4a, 0xac, 0xed, 0x5a, 0x94, 0xfc, 0xff, 0x18, 0x2f, 0x95, + 0xa2, 0x96, 0xff, 0x19, 0xfc, 0x6a, 0x39, 0x38, 0x0b, 0x9f, 0xcb, 0xba, 0x5a, 0x53, 0xeb, 0xea, + 0xac, 0x3a, 0xa7, 0xce, 0xab, 0x35, 0x5d, 0xad, 0xeb, 0xd0, 0x5f, 0x3b, 0x86, 0xa7, 0x49, 0xca, + 0x81, 0xbf, 0x1f, 0xb1, 0xc4, 0x1b, 0xfe, 0xe2, 0xf5, 0x90, 0x09, 0x51, 0xa0, 0xd9, 0x7a, 0x42, + 0x9f, 0x66, 0xeb, 0xbf, 0x00, 0xda, 0x27, 0x8a, 0x68, 0x17, 0xda, 0x5f, 0xb9, 0xf6, 0xcc, 0xd6, + 0xd3, 0xda, 0x43, 0x5b, 0x7e, 0x39, 0x18, 0x42, 0xef, 0x2b, 0xd2, 0x9e, 0xf7, 0x41, 0x7b, 0x74, + 0xa2, 0x34, 0xba, 0x3a, 0xaf, 0xd3, 0x7b, 0xf6, 0x05, 0x4a, 0x34, 0x5e, 0x23, 0xdf, 0x43, 0x99, + 0x9b, 0xa4, 0xac, 0xa4, 0xd4, 0x88, 0x34, 0xfc, 0xf1, 0x30, 0x51, 0x9c, 0x2e, 0x35, 0x5a, 0x98, + 0x4b, 0xa8, 0xd1, 0xc2, 0xdc, 0xd5, 0x0f, 0x9e, 0xfe, 0xf4, 0x7c, 0x11, 0xed, 0x42, 0xfb, 0x2b, + 0x57, 0xa3, 0x85, 0x39, 0xae, 0x46, 0x84, 0xd8, 0xa8, 0x05, 0xe6, 0x2b, 0xa6, 0xf7, 0x15, 0xa9, + 0xd1, 0x47, 0xa1, 0xea, 0xd4, 0x75, 0xa6, 0x48, 0xa1, 0x12, 0xb1, 0x6f, 0xbd, 0x08, 0x53, 0x52, + 0x91, 0x16, 0xe6, 0x52, 0x8a, 0x44, 0x1a, 0xae, 0x0f, 0x13, 0xc6, 0xe9, 0x51, 0xa4, 0x09, 0x20, + 0xf7, 0x6a, 0x44, 0x3c, 0x7d, 0xfa, 0x9b, 0x9f, 0x27, 0x47, 0x9f, 0x0a, 0x35, 0x22, 0xcb, 0x7a, + 0x55, 0xd4, 0x22, 0xde, 0xf0, 0x5f, 0x83, 0x21, 0xd4, 0xfe, 0x0a, 0x23, 0xd9, 0x71, 0x0c, 0x9d, + 0x23, 0xf4, 0x0b, 0x7a, 0x13, 0x3e, 0xff, 0xf5, 0xb0, 0xc5, 0x3f, 0x3d, 0x6a, 0x43, 0xa8, 0xbd, + 0x75, 0xf3, 0xeb, 0x48, 0x1a, 0xe1, 0xf3, 0xdf, 0x86, 0x4a, 0xcf, 0x03, 0xf1, 0x68, 0xaa, 0x33, + 0xf1, 0x72, 0x69, 0xbd, 0xc0, 0x68, 0x13, 0x95, 0x27, 0x6e, 0x3a, 0x5f, 0x1a, 0x42, 0xf1, 0xbb, + 0x77, 0x56, 0x56, 0x56, 0xa4, 0x5d, 0xc7, 0x33, 0xb1, 0xed, 0xb6, 0xd9, 0xba, 0xbf, 0x68, 0x26, + 0x88, 0xfe, 0x7c, 0xa0, 0xab, 0xba, 0x36, 0x4f, 0x75, 0x88, 0xea, 0x0f, 0x09, 0x6c, 0x35, 0x34, + 0x0b, 0x9f, 0x85, 0xe3, 0xd9, 0x3b, 0xcf, 0x78, 0x11, 0x54, 0x29, 0x6a, 0xf9, 0x87, 0x61, 0xe2, + 0x78, 0x15, 0xcc, 0x9d, 0x40, 0x9b, 0x56, 0xbf, 0xde, 0x48, 0x68, 0x13, 0x3c, 0xff, 0xe2, 0x27, + 0x4f, 0x7f, 0x3a, 0x51, 0x44, 0xbe, 0x80, 0xf4, 0x95, 0x6b, 0x13, 0xd0, 0x96, 0xd6, 0x26, 0xd6, + 0x24, 0x95, 0x86, 0x50, 0xfc, 0xda, 0x68, 0x13, 0xf0, 0x92, 0xd2, 0x26, 0xda, 0xf2, 0xe7, 0xc3, + 0xc4, 0x71, 0x8a, 0xb4, 0x89, 0x88, 0xe3, 0xea, 0xf6, 0x8e, 0x8d, 0x75, 0xca, 0x43, 0xab, 0x54, + 0x10, 0xd7, 0xde, 0xf4, 0x5c, 0x24, 0x01, 0x98, 0x24, 0xeb, 0x07, 0xaf, 0xce, 0xb7, 0x8e, 0xe9, + 0x63, 0xb5, 0x63, 0x77, 0x39, 0x11, 0x0b, 0xb5, 0x62, 0x16, 0xc6, 0x5e, 0x13, 0x16, 0xea, 0xc5, + 0xd9, 0xc5, 0x99, 0xd7, 0x84, 0x85, 0xd9, 0x62, 0x16, 0xc6, 0x5f, 0x13, 0x16, 0xe6, 0x8a, 0x59, + 0x98, 0x78, 0x4d, 0x58, 0x98, 0x2f, 0x66, 0xe1, 0xec, 0x6b, 0xc2, 0xc2, 0x42, 0x31, 0x0b, 0xe7, + 0x5e, 0x13, 0x16, 0xbe, 0x28, 0x66, 0x61, 0xf2, 0x34, 0xb3, 0x30, 0xce, 0x2b, 0x7b, 0xab, 0x7d, + 0xd7, 0xc2, 0xb6, 0xe7, 0x9e, 0xb3, 0xba, 0xad, 0x6d, 0xbd, 0x46, 0xfa, 0x09, 0x37, 0xbf, 0xb1, + 0xec, 0x75, 0xbb, 0xa6, 0xdb, 0x92, 0x7c, 0x14, 0xf4, 0x3c, 0x37, 0x40, 0x12, 0xb6, 0xbb, 0xc8, + 0xeb, 0x63, 0x8d, 0x63, 0xfa, 0xf0, 0x09, 0x1b, 0x52, 0x3f, 0x73, 0xd2, 0x21, 0x35, 0xfd, 0x8d, + 0x91, 0x87, 0x30, 0x3a, 0x2f, 0x96, 0x96, 0xd7, 0xa1, 0xa7, 0xef, 0x98, 0xd8, 0xf3, 0xdf, 0xe1, + 0x55, 0x3b, 0xc9, 0xea, 0x98, 0x6e, 0x1b, 0xf9, 0xe3, 0xa5, 0x56, 0xc8, 0xd9, 0x04, 0x85, 0xbe, + 0x2c, 0x42, 0x6f, 0xdf, 0x17, 0x63, 0xef, 0x98, 0x5e, 0x7e, 0xc2, 0xee, 0xce, 0x5f, 0x3f, 0x53, + 0x9b, 0xe7, 0x0f, 0xef, 0x5f, 0x8f, 0x3b, 0x3e, 0x84, 0x7b, 0xe9, 0xc9, 0x3b, 0xbc, 0xb8, 0xc3, + 0x27, 0x39, 0x27, 0x4c, 0xc2, 0x41, 0x93, 0xf8, 0x26, 0xc8, 0x7e, 0xb9, 0x18, 0xe3, 0xe5, 0x38, + 0x2d, 0x0a, 0x51, 0x5e, 0x29, 0xbd, 0x71, 0x0c, 0xca, 0x21, 0x24, 0xbe, 0x45, 0x59, 0x7d, 0xb7, + 0xb4, 0x7c, 0xdf, 0xff, 0xfe, 0x96, 0x67, 0x6d, 0xaf, 0x38, 0xbb, 0xab, 0xb6, 0x83, 0x36, 0x1e, + 0xf7, 0x10, 0xe9, 0xf8, 0xb5, 0xa8, 0xe3, 0xb6, 0x3d, 0xaf, 0x7f, 0x29, 0x76, 0xc5, 0x63, 0xd6, + 0x0e, 0x7a, 0xbc, 0xe3, 0xe2, 0xc1, 0x5d, 0xb3, 0x27, 0xf5, 0x4c, 0x3f, 0x40, 0xbe, 0x26, 0x6f, + 0xea, 0xd5, 0x2f, 0xcd, 0xea, 0xee, 0x8d, 0xea, 0xea, 0x56, 0x45, 0x79, 0x18, 0x54, 0x32, 0x0d, + 0x0f, 0xd7, 0x2b, 0xf0, 0xbd, 0x2a, 0x3f, 0xdc, 0xaf, 0x28, 0x3c, 0x01, 0xca, 0x53, 0x49, 0x7e, + 0xcd, 0x3f, 0x19, 0x37, 0x4d, 0xf3, 0x27, 0xf2, 0xc3, 0x16, 0x0c, 0xdf, 0x9f, 0x26, 0x28, 0x1f, + 0xb6, 0x14, 0xf2, 0x61, 0xb7, 0x15, 0x65, 0x6c, 0x24, 0x2c, 0x57, 0x6e, 0x9b, 0xfb, 0x8f, 0xbe, + 0xad, 0x49, 0x2f, 0x9b, 0xda, 0x8b, 0x1b, 0x77, 0x20, 0x99, 0xeb, 0x49, 0xbb, 0xb0, 0x3c, 0xbf, + 0x9e, 0xc1, 0xb7, 0x4d, 0x31, 0x8d, 0x46, 0xf1, 0x78, 0xf0, 0xd8, 0x9a, 0xfc, 0xec, 0x93, 0x83, + 0xfa, 0x7c, 0x33, 0x18, 0xcf, 0x81, 0xc8, 0x8e, 0xb8, 0xb4, 0xec, 0x05, 0x5d, 0x1b, 0x04, 0xb7, + 0xbc, 0xae, 0x5f, 0x9d, 0xdd, 0x96, 0x61, 0xf0, 0xbc, 0xd5, 0x84, 0x09, 0xd9, 0x4d, 0x9a, 0xbf, + 0xa8, 0x35, 0x82, 0xcb, 0x43, 0x9b, 0x9d, 0xe6, 0x02, 0xcc, 0xe1, 0x7b, 0x56, 0xc7, 0xee, 0xdd, + 0x0a, 0x51, 0xc8, 0x9b, 0x21, 0x0a, 0xf6, 0xa3, 0x09, 0xc8, 0xf5, 0x83, 0xa1, 0x93, 0xb6, 0x46, + 0x9e, 0xf4, 0x2e, 0x99, 0x74, 0x19, 0x26, 0xad, 0x46, 0x28, 0xf4, 0x03, 0x6d, 0x3a, 0x46, 0xb8, + 0xbd, 0xe9, 0xc0, 0xfd, 0x17, 0x56, 0xd3, 0xdf, 0x8a, 0x9b, 0xa7, 0x47, 0x5b, 0x6b, 0x70, 0x27, + 0x2d, 0xf4, 0x9d, 0xe9, 0xfb, 0xb6, 0xe7, 0x4b, 0xcb, 0x9e, 0xd3, 0x5a, 0xb5, 0x7d, 0x04, 0xba, + 0x72, 0xe3, 0xfe, 0x5a, 0x01, 0xf9, 0xb9, 0xad, 0x21, 0xfb, 0x2d, 0x13, 0x9b, 0x95, 0x14, 0xa3, + 0xeb, 0x31, 0xd4, 0x68, 0x8a, 0x74, 0x49, 0x50, 0x24, 0xe9, 0xf9, 0x34, 0xe9, 0xe3, 0x42, 0xee, + 0xa4, 0xf6, 0x63, 0xdf, 0x9b, 0x1b, 0xc1, 0x0e, 0x18, 0x4f, 0xd4, 0xe4, 0xd6, 0x69, 0xcb, 0x68, + 0x4c, 0xbc, 0x97, 0x9c, 0xad, 0x4a, 0xe7, 0xd3, 0x47, 0xb5, 0xbb, 0x93, 0xcc, 0x45, 0x83, 0xdd, + 0xd3, 0x64, 0x4b, 0xf6, 0x1a, 0x0f, 0x3f, 0x13, 0x1d, 0xdc, 0x75, 0xc4, 0x8e, 0x8b, 0xfb, 0xc8, + 0xb1, 0xbc, 0x2e, 0xd2, 0xa0, 0x23, 0x39, 0x84, 0x38, 0xbe, 0xb7, 0xa9, 0xe3, 0xbb, 0x83, 0x51, + 0xf7, 0xbe, 0xef, 0x7d, 0x8f, 0x2c, 0x9c, 0x04, 0x99, 0x5c, 0x6e, 0x3c, 0xbc, 0x05, 0xeb, 0xf3, + 0xce, 0x46, 0x07, 0x49, 0xb7, 0x50, 0xd7, 0x93, 0x38, 0xd8, 0x25, 0x08, 0x40, 0x97, 0x20, 0xbc, + 0x8e, 0x43, 0x66, 0x75, 0xae, 0x74, 0x1e, 0xc2, 0xe6, 0x5b, 0x80, 0xec, 0x72, 0xe9, 0x4a, 0x89, + 0x24, 0x2a, 0x04, 0xf5, 0x9b, 0x11, 0xea, 0x9b, 0x8e, 0x67, 0x3d, 0x5a, 0xce, 0x45, 0xfc, 0xc1, + 0x77, 0x26, 0xb6, 0x3a, 0x52, 0x6d, 0x81, 0x66, 0x04, 0x7b, 0xe1, 0x91, 0x9a, 0xe4, 0xb9, 0xce, + 0x63, 0x40, 0x4d, 0xd0, 0x4f, 0xd0, 0xe5, 0x48, 0x22, 0x5c, 0xb7, 0xbc, 0x1e, 0x5a, 0xc9, 0x45, + 0x78, 0x85, 0x46, 0x42, 0xc9, 0x0b, 0x2c, 0xdb, 0x71, 0xe0, 0x1b, 0x00, 0x4b, 0xff, 0x3a, 0xc9, + 0x60, 0xc8, 0x6a, 0x4f, 0x6c, 0x40, 0x34, 0x15, 0x95, 0x4b, 0xfc, 0x24, 0xaf, 0x07, 0xd7, 0xc5, + 0x2c, 0xe2, 0x4c, 0x04, 0xf1, 0xdf, 0x55, 0xad, 0x50, 0x08, 0x11, 0x96, 0x3f, 0xf8, 0xaa, 0x00, + 0x66, 0xb8, 0x20, 0x3f, 0xbd, 0x2e, 0xfe, 0xe6, 0x19, 0xc1, 0x24, 0x5b, 0xab, 0xe0, 0xc2, 0x1d, + 0xd7, 0xf2, 0x51, 0x17, 0xb1, 0x40, 0x1e, 0x43, 0x7c, 0xfa, 0xcf, 0xa9, 0xdf, 0x08, 0x63, 0x11, + 0xb7, 0x67, 0x9d, 0x1b, 0x07, 0x76, 0x70, 0xd6, 0x27, 0xdf, 0xe4, 0x39, 0x3e, 0x23, 0x7b, 0x7e, + 0x5c, 0xe3, 0x2f, 0x10, 0x57, 0x7c, 0xe8, 0xf2, 0xfc, 0xb8, 0xce, 0xbe, 0x20, 0x5c, 0x7f, 0xf6, + 0xa7, 0xf4, 0x5a, 0x8a, 0x7b, 0xdf, 0xbb, 0x5e, 0x4a, 0x5d, 0x5c, 0x35, 0xcf, 0x6d, 0x98, 0x1d, + 0xaf, 0x6b, 0x92, 0xa6, 0x1b, 0x62, 0xff, 0x54, 0x89, 0x9a, 0x78, 0x89, 0xf1, 0x18, 0x67, 0x2a, + 0x91, 0xe9, 0x6c, 0x83, 0xaf, 0xb9, 0xe3, 0xee, 0x7a, 0x84, 0x88, 0x83, 0x70, 0xd0, 0xed, 0x27, + 0xfc, 0x69, 0x2c, 0xf1, 0x74, 0x26, 0x7a, 0xaa, 0x97, 0xb8, 0x57, 0xc8, 0x47, 0xfa, 0xad, 0xe9, + 0x13, 0xa4, 0xac, 0xf3, 0xfd, 0xf4, 0x8c, 0xc8, 0x71, 0x56, 0x3d, 0xbf, 0x6b, 0xe2, 0x98, 0xea, + 0xeb, 0x85, 0x54, 0xdf, 0x7b, 0xf2, 0xaa, 0xa1, 0xde, 0xa3, 0xac, 0xde, 0x7d, 0x32, 0x31, 0x02, + 0xfc, 0xd3, 0x91, 0xb0, 0x8e, 0x06, 0x75, 0x32, 0x0a, 0xc7, 0x47, 0xa4, 0xb0, 0xf4, 0x47, 0x23, + 0x61, 0x1d, 0x0d, 0xea, 0x44, 0x14, 0xa6, 0x75, 0x5c, 0xfc, 0xdc, 0x7a, 0x32, 0xd4, 0x67, 0xcf, + 0xd6, 0x73, 0x7d, 0x36, 0x09, 0x07, 0x93, 0x14, 0xc3, 0xea, 0x93, 0xdf, 0xce, 0x1d, 0x7f, 0x85, + 0xee, 0x23, 0x5e, 0x82, 0x8b, 0x3e, 0x3b, 0x82, 0x8b, 0x3e, 0xf7, 0x2a, 0x5c, 0x34, 0x5b, 0x9a, + 0x1f, 0x5d, 0xf4, 0x73, 0xe1, 0x7a, 0x79, 0x2e, 0x9a, 0x8f, 0x8f, 0xaf, 0x93, 0xb9, 0xe8, 0xd8, + 0xdb, 0x92, 0xeb, 0x24, 0x9e, 0xf8, 0xec, 0xa9, 0x77, 0x59, 0xe7, 0x4e, 0xbd, 0xcb, 0x9a, 0x1c, + 0x95, 0xc2, 0x17, 0xbc, 0x3a, 0x2f, 0xc6, 0xa9, 0xae, 0x16, 0x38, 0xd5, 0xcb, 0x77, 0x5c, 0x8c, + 0xda, 0xc8, 0x8f, 0xfc, 0x69, 0x40, 0xab, 0x41, 0xe4, 0x7a, 0x66, 0x9f, 0x48, 0x0a, 0x86, 0x17, + 0x23, 0xa8, 0x62, 0x9f, 0x78, 0x29, 0xc6, 0x54, 0xe8, 0x13, 0xcf, 0x44, 0x5e, 0xf6, 0xfd, 0x07, + 0x7f, 0x57, 0x00, 0x33, 0x1e, 0xc1, 0xfc, 0xef, 0xa0, 0x5c, 0x00, 0xc3, 0x7c, 0x34, 0xe1, 0x6c, + 0x57, 0xfd, 0xc3, 0x02, 0x98, 0x73, 0x11, 0xcc, 0x5f, 0x7d, 0x24, 0x15, 0xc0, 0x3c, 0xaf, 0x8f, + 0x3e, 0x77, 0x95, 0xb9, 0x68, 0x9b, 0xbb, 0xe8, 0xfc, 0xc5, 0x1c, 0x1d, 0x61, 0x94, 0x97, 0x27, + 0x30, 0x8a, 0xef, 0x9b, 0x9d, 0x18, 0x23, 0x0f, 0x23, 0xb6, 0x18, 0x46, 0xfe, 0xbf, 0xbb, 0xeb, + 0xc3, 0xf7, 0xfe, 0xfe, 0xab, 0x7f, 0xff, 0xe1, 0xf7, 0x96, 0x84, 0x70, 0x79, 0xbd, 0x94, 0xba, + 0xb8, 0xd1, 0x14, 0x19, 0xd3, 0xfb, 0xab, 0x89, 0x53, 0xc6, 0x17, 0x69, 0x53, 0x64, 0xc9, 0x2e, + 0x8f, 0x60, 0x53, 0x57, 0x46, 0xb0, 0xa9, 0xb7, 0x46, 0xb0, 0xa9, 0xb7, 0x47, 0xb0, 0xa9, 0x24, + 0xbd, 0x7c, 0xd9, 0xa3, 0xe7, 0xeb, 0xfc, 0x57, 0xe4, 0x4d, 0x1c, 0x73, 0x81, 0x2e, 0x17, 0x59, + 0xa5, 0x93, 0x9b, 0x43, 0x11, 0xce, 0x37, 0x6e, 0x79, 0x7d, 0x92, 0x15, 0x26, 0x90, 0x96, 0x4a, + 0x3f, 0xa6, 0x2e, 0x27, 0xc1, 0xc5, 0x53, 0x97, 0x51, 0x6c, 0x21, 0x3c, 0x13, 0x08, 0x77, 0x71, + 0x6b, 0xc8, 0xca, 0x37, 0x8d, 0x0f, 0xa1, 0xc7, 0xf3, 0x5b, 0x10, 0x68, 0xaa, 0x12, 0xf6, 0xed, + 0x36, 0x84, 0x1c, 0xd4, 0x92, 0x76, 0x1e, 0x13, 0x41, 0x5d, 0x7d, 0x7e, 0xf3, 0x20, 0xe3, 0x2f, + 0x26, 0xd2, 0xf0, 0xec, 0x88, 0x07, 0xd7, 0x79, 0x38, 0x19, 0x6e, 0x1e, 0x67, 0x47, 0x30, 0x8f, + 0xe4, 0xf5, 0xfc, 0x92, 0x13, 0x56, 0xfa, 0xb9, 0x71, 0xfd, 0xa8, 0xe9, 0x27, 0xc3, 0xb5, 0x5a, + 0x8a, 0xd3, 0xa7, 0xf8, 0x62, 0xe3, 0xd9, 0xf5, 0xcb, 0xa5, 0x22, 0xb7, 0x24, 0x5a, 0xc1, 0xa5, + 0xb8, 0xa6, 0x69, 0xf7, 0x50, 0xbe, 0x19, 0xbc, 0xb9, 0x81, 0xfc, 0xae, 0xed, 0x9a, 0x8e, 0x44, + 0x60, 0x28, 0x4a, 0x7e, 0x96, 0x45, 0x3e, 0xc9, 0xee, 0xe8, 0x3c, 0x73, 0x8c, 0xbe, 0xb5, 0x37, + 0x26, 0xf0, 0x9d, 0x7c, 0xc3, 0x85, 0x9e, 0x65, 0x56, 0x1d, 0xe4, 0xb6, 0x3b, 0x58, 0x0a, 0xc0, + 0xbc, 0xdc, 0xb6, 0x30, 0x75, 0xe2, 0x30, 0x93, 0x08, 0x34, 0x7d, 0x98, 0x99, 0x36, 0xb6, 0x92, + 0xf0, 0x4c, 0xae, 0x91, 0xdf, 0x70, 0xb9, 0xb8, 0xec, 0xf5, 0x7d, 0x1b, 0x6c, 0xfc, 0x1b, 0xb4, + 0x4f, 0xda, 0x6f, 0x88, 0x03, 0xa6, 0x4a, 0x71, 0xb6, 0x9a, 0xb7, 0x34, 0xcf, 0xbe, 0x07, 0xfa, + 0x93, 0xd2, 0xf1, 0x7b, 0xa0, 0x4b, 0x10, 0x3d, 0xd3, 0xf9, 0xbb, 0x54, 0x38, 0xcf, 0xab, 0x87, + 0xba, 0x5c, 0xca, 0x2b, 0x2c, 0x9d, 0x36, 0x0a, 0x2f, 0x9c, 0x7a, 0x0a, 0xb3, 0x3b, 0xdd, 0xd3, + 0x46, 0xe1, 0x95, 0x53, 0x4f, 0xe1, 0x5b, 0xa7, 0x9e, 0xc2, 0x6c, 0xb5, 0xe0, 0xb4, 0x51, 0xf8, + 0xf6, 0xa9, 0xa7, 0xf0, 0xe2, 0xa9, 0xa7, 0x30, 0x5b, 0xc6, 0x3e, 0x6d, 0x14, 0x5e, 0x3a, 0xf5, + 0x14, 0x9e, 0x3f, 0xf5, 0x14, 0x8e, 0x0d, 0xf9, 0x90, 0x8b, 0xbd, 0x93, 0x5b, 0x2a, 0xbd, 0x13, + 0xbf, 0x20, 0xb5, 0xbd, 0x86, 0xf0, 0xdd, 0xa0, 0xfd, 0x53, 0xfe, 0xca, 0x52, 0xc7, 0x0c, 0x24, + 0x1f, 0xe1, 0xbe, 0xef, 0xc2, 0x9e, 0x82, 0x1c, 0xcd, 0x4b, 0xbf, 0xb5, 0xb2, 0x76, 0x4f, 0x23, + 0x59, 0xc0, 0x3b, 0xa5, 0x7f, 0x7a, 0xf2, 0x51, 0x31, 0x5c, 0x6d, 0x81, 0xbe, 0xde, 0x54, 0x07, + 0x28, 0xa9, 0x18, 0x6a, 0xf5, 0xce, 0xea, 0xc6, 0x03, 0xba, 0xe3, 0x1e, 0x03, 0xc0, 0x8f, 0x8b, + 0x01, 0xef, 0x7d, 0xb3, 0xa2, 0x4d, 0x84, 0xb4, 0x4f, 0xee, 0xf6, 0xfc, 0xf6, 0xf2, 0xfa, 0x77, + 0xe4, 0xfe, 0x3c, 0xb9, 0xbf, 0xd9, 0xdf, 0xdd, 0xe5, 0x8b, 0xf0, 0xc9, 0xa6, 0xb4, 0x7e, 0x7f, + 0x65, 0xf9, 0xce, 0xea, 0x03, 0xe9, 0xc1, 0xbd, 0x9f, 0xad, 0x49, 0xeb, 0xd5, 0xb5, 0x95, 0xe5, + 0x7b, 0x6b, 0xb7, 0x60, 0xaa, 0xaf, 0x57, 0xa4, 0xdb, 0x2b, 0x6b, 0x2b, 0xd2, 0x96, 0xb8, 0x68, + 0x24, 0xbb, 0x2a, 0x95, 0x4a, 0x99, 0x3c, 0x8c, 0x2f, 0xd4, 0xa5, 0xb6, 0xd9, 0x6f, 0x23, 0x0d, + 0x72, 0x47, 0xed, 0xfb, 0x00, 0x43, 0x46, 0x3b, 0x31, 0xf9, 0xcd, 0x36, 0xff, 0x30, 0x08, 0xf7, + 0xa0, 0xb7, 0xed, 0x78, 0x6d, 0x4f, 0xeb, 0xb9, 0xed, 0xb9, 0x4b, 0x39, 0x10, 0x6f, 0xf8, 0xc8, + 0x6c, 0x75, 0x91, 0x86, 0x0f, 0xf0, 0x7f, 0xc2, 0xe3, 0x59, 0x68, 0xe7, 0x1f, 0xda, 0x2f, 0x9e, + 0xe8, 0xff, 0xe3, 0xe7, 0x0c, 0xe0, 0xe3, 0x7f, 0x7b, 0xc0, 0x00, 0xc8, 0x45, 0xe6, 0x95, 0x77, + 0x43, 0x19, 0xc9, 0xca, 0x21, 0x6c, 0xed, 0x24, 0xac, 0xda, 0x2a, 0x52, 0x03, 0xd5, 0x55, 0x3d, + 0xd5, 0x54, 0x3b, 0xaa, 0xaf, 0x3a, 0x6a, 0x4f, 0xb5, 0xd4, 0xbe, 0xda, 0x32, 0x36, 0xb7, 0xb4, + 0xc0, 0xb1, 0x2d, 0xa4, 0xb6, 0x8d, 0xc3, 0x81, 0x06, 0xab, 0x79, 0x6f, 0xdf, 0xbd, 0xef, 0x7b, + 0x3d, 0xe4, 0xe3, 0xc7, 0x6a, 0xd7, 0x88, 0x30, 0x01, 0x0e, 0xe5, 0x90, 0x3f, 0x49, 0x08, 0x30, + 0xe3, 0x8e, 0x1d, 0x68, 0x96, 0xe7, 0x42, 0xae, 0xdb, 0xb7, 0xb0, 0xe7, 0x1b, 0x78, 0xb0, 0xeb, + 0xf9, 0x32, 0x99, 0x30, 0x90, 0x6c, 0x57, 0xb2, 0x95, 0xb6, 0x66, 0x99, 0x8e, 0x23, 0xdb, 0x6a, + 0xa0, 0x7c, 0xf6, 0x99, 0x8c, 0x37, 0x83, 0x2d, 0xc3, 0x86, 0x2f, 0xa5, 0xc9, 0x04, 0x26, 0x21, + 0xad, 0xe7, 0x7b, 0xd8, 0xc3, 0x8f, 0x7b, 0xc8, 0xb0, 0xe3, 0x7b, 0x15, 0x0b, 0xed, 0x2e, 0xda, + 0x97, 0x48, 0xcb, 0xf6, 0x76, 0xd0, 0x07, 0xa2, 0xb6, 0xb7, 0x93, 0x90, 0x83, 0xe6, 0xd4, 0x30, + 0x66, 0x9b, 0x84, 0x22, 0xd3, 0xd8, 0x2c, 0x77, 0x83, 0xb2, 0x5a, 0xee, 0x7a, 0x3f, 0xc0, 0xf7, + 0x3e, 0xda, 0x79, 0x64, 0x63, 0xb8, 0xf1, 0xca, 0x5b, 0x2a, 0x32, 0x74, 0xd5, 0x35, 0x4c, 0x8d, + 0xe4, 0xed, 0xb8, 0xd3, 0x44, 0x8b, 0x2e, 0x50, 0xea, 0x19, 0xe6, 0x26, 0xda, 0x52, 0xa7, 0xf6, + 0x6d, 0xb7, 0xe5, 0xed, 0x6b, 0x3e, 0xfa, 0x9d, 0x3e, 0x0a, 0xf0, 0x0d, 0xd7, 0xee, 0x9a, 0x64, + 0xa2, 0x55, 0xdf, 0xec, 0x22, 0xa5, 0x89, 0x2a, 0x15, 0x65, 0x18, 0x84, 0xc1, 0x3a, 0x37, 0xbd, + 0x4a, 0x79, 0x2d, 0xaf, 0x1f, 0x66, 0x0f, 0x87, 0x5b, 0xa6, 0x6b, 0x21, 0xa7, 0x70, 0xf4, 0x72, + 0x4e, 0x77, 0x79, 0xeb, 0xe8, 0x28, 0x0d, 0x51, 0x30, 0x4b, 0x13, 0x1b, 0x6e, 0xdf, 0x71, 0xd4, + 0x00, 0x58, 0xb5, 0x41, 0xc8, 0x6a, 0x2e, 0xb5, 0x4b, 0x43, 0x68, 0x39, 0x3a, 0x92, 0xb1, 0x31, + 0x8c, 0x55, 0x75, 0xe8, 0x3a, 0x44, 0x02, 0x42, 0xaa, 0xcb, 0x64, 0xe4, 0x71, 0x0d, 0xf0, 0x8c, + 0x4a, 0x25, 0x50, 0xb1, 0xa8, 0xb0, 0xf6, 0xae, 0x3c, 0x65, 0x6f, 0x7a, 0x5b, 0x0a, 0x57, 0x12, + 0x59, 0x19, 0xc0, 0x38, 0xd5, 0x1b, 0x0c, 0x5d, 0xae, 0x58, 0x51, 0x95, 0xc3, 0x70, 0xa4, 0xbd, + 0x89, 0xb7, 0x8c, 0x29, 0x7d, 0xa0, 0x34, 0xe4, 0xd1, 0xe8, 0xa3, 0x3a, 0x4e, 0xe8, 0x0b, 0xf5, + 0x27, 0xd2, 0x53, 0x43, 0x26, 0x6a, 0x08, 0x1b, 0x24, 0xa4, 0x68, 0x6d, 0x84, 0x49, 0x71, 0x44, + 0x06, 0x8a, 0x8c, 0xbb, 0x26, 0xee, 0x68, 0x5d, 0xf3, 0x40, 0xd6, 0xd5, 0xda, 0x42, 0x55, 0x46, + 0x55, 0x57, 0x51, 0x60, 0x9d, 0xc3, 0xd9, 0x02, 0x06, 0xe9, 0xf5, 0x13, 0xfc, 0x85, 0x38, 0xb1, + 0x8c, 0x2a, 0x1e, 0x70, 0xe6, 0x29, 0xa0, 0x7f, 0x70, 0xab, 0x06, 0x27, 0xe6, 0xcf, 0x72, 0x90, + 0xe9, 0xf3, 0x19, 0xb0, 0x32, 0x50, 0x06, 0x40, 0x54, 0x3f, 0x01, 0x49, 0x98, 0x01, 0x73, 0xa0, + 0x66, 0x60, 0x33, 0x72, 0x77, 0x1d, 0x0f, 0x1e, 0xf0, 0xcc, 0xec, 0x82, 0xae, 0x2b, 0xa0, 0xff, + 0x42, 0xa3, 0x8c, 0xab, 0xa4, 0x75, 0xda, 0x56, 0x66, 0x16, 0xa0, 0x0f, 0x57, 0x0d, 0xf6, 0x58, + 0x59, 0xd0, 0xa7, 0xc1, 0xd6, 0x2a, 0x46, 0xb9, 0xac, 0x22, 0xf2, 0xdd, 0x44, 0xa1, 0xc1, 0x2c, + 0xd6, 0x9b, 0x0a, 0x32, 0xca, 0x7a, 0xb9, 0xc2, 0xe6, 0x68, 0x62, 0xa1, 0x03, 0xd3, 0x0e, 0x1c, + 0xae, 0x22, 0xcc, 0x6f, 0x2f, 0xd9, 0x95, 0x72, 0x03, 0xfe, 0x95, 0x95, 0x0a, 0x22, 0x77, 0x15, + 0x3c, 0x50, 0x7b, 0x46, 0x9e, 0x01, 0xf3, 0xa5, 0xb7, 0x8d, 0xda, 0xa2, 0x61, 0xfa, 0xed, 0x3e, + 0x29, 0x21, 0x06, 0x21, 0xf2, 0xa5, 0x16, 0x73, 0x2c, 0x51, 0xbb, 0xaa, 0x2b, 0x8d, 0x4d, 0x62, + 0xcc, 0xf6, 0xa6, 0xbe, 0xa5, 0x62, 0xf8, 0xa9, 0x6d, 0xa9, 0xbe, 0x0c, 0x6e, 0xd4, 0xa3, 0xdb, + 0x72, 0x58, 0x0a, 0x58, 0x6a, 0xab, 0x48, 0xd2, 0xcd, 0x00, 0xcc, 0x82, 0xd2, 0x8f, 0x88, 0xe3, + 0xc2, 0xdc, 0x71, 0x61, 0x15, 0x11, 0xc7, 0xe5, 0x1a, 0x98, 0xb8, 0x83, 0x00, 0xbe, 0x0c, 0x57, + 0x89, 0xe1, 0x04, 0x07, 0x17, 0xc2, 0xd9, 0x22, 0x5c, 0xc8, 0x01, 0xc8, 0xd5, 0xcf, 0x93, 0x09, + 0x9d, 0x98, 0xe0, 0x0a, 0xd7, 0xd5, 0xc0, 0x5a, 0xd0, 0x73, 0x6c, 0x2c, 0x97, 0xb5, 0x32, 0x51, + 0x22, 0x44, 0x58, 0x71, 0x69, 0x57, 0xc8, 0xf6, 0xb5, 0x1a, 0x9d, 0x04, 0xfa, 0x2b, 0x08, 0x18, + 0x54, 0xc0, 0x9a, 0x67, 0xe8, 0xbb, 0xa2, 0xf0, 0x75, 0x38, 0x3b, 0x50, 0x66, 0x9a, 0xb6, 0x86, + 0x41, 0xbd, 0xe5, 0x40, 0x69, 0x2a, 0x81, 0x11, 0x80, 0xba, 0xf7, 0x1c, 0xd3, 0x42, 0x40, 0x5f, + 0xf9, 0xd3, 0x9a, 0xfa, 0x69, 0xbd, 0x1c, 0x13, 0x55, 0x71, 0x07, 0xaa, 0x93, 0xa3, 0x54, 0xe5, + 0x4f, 0xca, 0x86, 0x01, 0xa4, 0x58, 0x1d, 0xd3, 0xbf, 0x81, 0x65, 0x5d, 0x59, 0x02, 0xb2, 0xfa, + 0x3b, 0xac, 0x9e, 0x21, 0xd7, 0xd4, 0x2f, 0x94, 0x06, 0xc8, 0xac, 0x23, 0xca, 0x2c, 0x0a, 0x0a, + 0x98, 0x2d, 0x2b, 0x71, 0x36, 0x80, 0x82, 0x78, 0x7c, 0xb0, 0x3e, 0x50, 0x23, 0x1a, 0x27, 0x88, + 0xae, 0x1a, 0xac, 0xcb, 0x3e, 0x3a, 0xb2, 0x55, 0xe8, 0x8f, 0x34, 0xfc, 0x67, 0xbd, 0x16, 0x98, + 0x96, 0xaf, 0x99, 0x2d, 0x90, 0x14, 0x40, 0x2b, 0x03, 0x6e, 0x24, 0xb1, 0xab, 0xd7, 0x4c, 0x0e, + 0xbd, 0xde, 0x43, 0xa8, 0x65, 0xcc, 0xd6, 0xc5, 0x30, 0xa1, 0xf5, 0x29, 0x8a, 0xec, 0x3a, 0x73, + 0x86, 0x13, 0x44, 0xd5, 0x14, 0x75, 0x4a, 0x9e, 0x82, 0x07, 0x4a, 0x5a, 0xcb, 0x86, 0x75, 0x37, + 0x1f, 0xa3, 0xd6, 0xb7, 0xa6, 0xd3, 0x47, 0x84, 0x7b, 0xd2, 0xba, 0x47, 0x1e, 0x68, 0xd8, 0xa2, + 0xe4, 0xe3, 0x83, 0x10, 0x9a, 0x32, 0xc2, 0xef, 0xf1, 0x01, 0x7b, 0x5e, 0x43, 0x16, 0xac, 0x95, + 0xaa, 0x87, 0xbc, 0x9a, 0xee, 0x9e, 0x19, 0x68, 0xfb, 0x76, 0x0b, 0x77, 0x12, 0x2d, 0x1d, 0x64, + 0xb7, 0x3b, 0x98, 0xc8, 0x2d, 0x9e, 0xa2, 0x9a, 0x43, 0x83, 0x4a, 0x6d, 0xd2, 0xdc, 0x09, 0x64, + 0x7b, 0x86, 0x76, 0x27, 0x79, 0x57, 0x16, 0x0d, 0x4d, 0xd7, 0x6b, 0x4b, 0x79, 0xd4, 0xc7, 0x88, + 0x1b, 0x85, 0xdd, 0xc9, 0xb6, 0x4a, 0xee, 0x1c, 0x8c, 0x6e, 0x1f, 0xb9, 0x2d, 0xe4, 0x83, 0x57, + 0x01, 0x39, 0x0e, 0x20, 0xd8, 0xca, 0xc4, 0x61, 0x88, 0x6b, 0x1c, 0xc9, 0xde, 0x8e, 0x3d, 0x9b, + 0x1d, 0xc7, 0x6a, 0x31, 0x3d, 0xd0, 0xcc, 0x5e, 0xcf, 0x79, 0x4c, 0x97, 0x53, 0x8d, 0x0c, 0x37, + 0x92, 0x74, 0x17, 0x94, 0x94, 0xac, 0x8c, 0x20, 0xd2, 0x90, 0xcc, 0x75, 0x30, 0x31, 0x64, 0xd4, + 0x12, 0x5d, 0x60, 0x36, 0x16, 0x62, 0x5a, 0x03, 0x2a, 0x96, 0xe8, 0x22, 0x4e, 0x17, 0x1d, 0xe0, + 0x55, 0x1b, 0x39, 0xad, 0x94, 0xbd, 0x73, 0xa5, 0x22, 0x9c, 0xe1, 0x08, 0x06, 0x83, 0x29, 0x07, + 0x98, 0xb8, 0x5c, 0x6f, 0x57, 0x32, 0x97, 0x70, 0x83, 0xb8, 0x7a, 0x93, 0x8e, 0x18, 0xa4, 0x31, + 0xdf, 0xb5, 0x5d, 0xb6, 0x8e, 0x85, 0x21, 0x03, 0x52, 0x0e, 0x08, 0x60, 0x74, 0x8a, 0x2e, 0x07, + 0xc6, 0x6a, 0xa8, 0xf7, 0xa0, 0x4d, 0x36, 0x35, 0x09, 0x92, 0x4a, 0x11, 0xcb, 0x2f, 0x92, 0x10, + 0x1f, 0x0a, 0x21, 0x86, 0x3e, 0xb7, 0x7b, 0x47, 0x47, 0xe0, 0xdf, 0x20, 0x91, 0xd9, 0xa2, 0x61, + 0xdc, 0x35, 0x3c, 0x9e, 0xb1, 0x04, 0x8b, 0xe0, 0xbe, 0x20, 0x13, 0x41, 0x86, 0x07, 0xa9, 0x95, + 0x6a, 0x6a, 0xbd, 0x7e, 0xd0, 0x91, 0xd1, 0x50, 0xb4, 0x91, 0x1b, 0x30, 0x07, 0x19, 0x16, 0xef, + 0xf5, 0x08, 0x5f, 0x41, 0x5e, 0xbc, 0x11, 0x6d, 0x88, 0xdc, 0x87, 0xa6, 0xed, 0x85, 0x23, 0x2c, + 0x59, 0x7c, 0x24, 0xd2, 0x4c, 0xae, 0x34, 0xb7, 0xa5, 0xa8, 0x41, 0x43, 0x8e, 0x16, 0xe0, 0xc7, + 0x0e, 0x91, 0xa7, 0x8b, 0xd7, 0xed, 0x1f, 0x88, 0x0f, 0xe4, 0xb7, 0x95, 0x72, 0xef, 0xa0, 0x9c, + 0x9c, 0x01, 0x54, 0xb4, 0xed, 0xa0, 0x6b, 0xda, 0x3c, 0xc7, 0x94, 0x68, 0x37, 0xb4, 0x79, 0xee, + 0x6b, 0x3c, 0x77, 0xd7, 0x6e, 0xdf, 0x12, 0xd4, 0x47, 0x66, 0x3d, 0x49, 0x66, 0xb3, 0x60, 0xb9, + 0x91, 0x88, 0xfa, 0x69, 0xee, 0x36, 0x13, 0x06, 0x44, 0xc7, 0xa8, 0x53, 0x35, 0xee, 0x32, 0x38, + 0x39, 0x1d, 0xb0, 0xf2, 0x5b, 0x3d, 0x7b, 0xbd, 0xdf, 0xeb, 0x79, 0x3e, 0x5e, 0x6a, 0x21, 0x07, + 0x61, 0x24, 0x65, 0x46, 0x36, 0x40, 0x19, 0xc2, 0x88, 0xdf, 0x42, 0x7b, 0x90, 0x82, 0xdf, 0x87, + 0x50, 0xe5, 0xac, 0x11, 0x1b, 0x3c, 0x3a, 0xaa, 0x41, 0x14, 0x8b, 0x7c, 0x0c, 0xcb, 0x58, 0x6f, + 0x9a, 0xd6, 0x23, 0x70, 0xc2, 0xeb, 0x60, 0x4b, 0x09, 0xd0, 0x08, 0x0c, 0xd2, 0xdb, 0xe3, 0x61, + 0x82, 0x63, 0x41, 0xbc, 0x63, 0x21, 0x76, 0x0a, 0x00, 0x6a, 0x6a, 0x86, 0x49, 0x03, 0xbc, 0x8b, + 0x92, 0x6d, 0x9e, 0x32, 0x8c, 0x80, 0x45, 0x56, 0xc1, 0x3d, 0x7e, 0xb5, 0xbd, 0x4d, 0x7d, 0x26, + 0x9f, 0x49, 0x74, 0xa3, 0x28, 0x0d, 0xc9, 0x7c, 0x69, 0x12, 0x94, 0xb5, 0x65, 0x9d, 0xb0, 0xe1, + 0x4e, 0x67, 0xe5, 0x96, 0x1d, 0x68, 0xa0, 0x63, 0xc0, 0x98, 0xb2, 0x86, 0x28, 0xa9, 0x82, 0xe6, + 0x74, 0x73, 0x5c, 0xd9, 0x7e, 0xce, 0x9f, 0xe1, 0xa6, 0x9b, 0xf9, 0x98, 0x3c, 0x35, 0xa5, 0xff, + 0xab, 0x23, 0xed, 0x75, 0x62, 0x67, 0x66, 0xd0, 0x7e, 0x7a, 0x88, 0x0b, 0xcd, 0x47, 0x47, 0xdf, + 0xd0, 0xff, 0x46, 0x25, 0x13, 0x5f, 0x1a, 0xac, 0xda, 0xae, 0x8d, 0x11, 0xdc, 0x83, 0x57, 0xd3, + 0x01, 0xeb, 0x40, 0xee, 0x28, 0xe0, 0x44, 0x86, 0xc4, 0x6e, 0x4a, 0x17, 0x72, 0x8c, 0x70, 0x11, + 0x77, 0x7d, 0x93, 0x76, 0xdf, 0xb2, 0xdb, 0x36, 0x0e, 0x0c, 0x3b, 0x2f, 0x2e, 0xb3, 0x18, 0x91, + 0x4b, 0x1b, 0x43, 0xa6, 0xd9, 0xae, 0x8b, 0xfc, 0xdb, 0x1b, 0x77, 0xbf, 0x36, 0x7a, 0x32, 0x4e, + 0x87, 0xba, 0x9c, 0x79, 0x78, 0xa8, 0xc1, 0x45, 0xa1, 0x86, 0xe4, 0x65, 0x87, 0xdc, 0xcd, 0x82, + 0x75, 0x75, 0x39, 0xbd, 0xc4, 0xb5, 0x50, 0xd7, 0x34, 0x65, 0xa0, 0xcf, 0x3e, 0x43, 0x6a, 0x51, + 0x28, 0x62, 0xd9, 0x1d, 0xc9, 0x34, 0xd4, 0x3d, 0xcf, 0x6e, 0x49, 0x3a, 0x37, 0x61, 0x82, 0x4c, + 0xc1, 0x1d, 0xdf, 0xdb, 0x97, 0x48, 0x18, 0x58, 0xf1, 0x7d, 0x70, 0xd3, 0x65, 0xf2, 0x02, 0x3c, + 0xe9, 0x81, 0x88, 0x25, 0xd9, 0x81, 0xfb, 0x39, 0x96, 0x5a, 0x68, 0xd7, 0x76, 0x51, 0x0b, 0x32, + 0xb5, 0x66, 0x1c, 0x71, 0x8d, 0xda, 0x74, 0x84, 0x24, 0x66, 0x3a, 0xa6, 0x8c, 0xbb, 0x2d, 0x06, + 0xac, 0x8f, 0x10, 0xfb, 0xb8, 0xf7, 0x4e, 0x86, 0xb8, 0xbd, 0x9c, 0x36, 0xf0, 0xdc, 0x00, 0x5a, + 0x28, 0x85, 0x88, 0xbe, 0xa4, 0x6e, 0xa5, 0x65, 0x17, 0xba, 0xbd, 0x66, 0xa4, 0x5c, 0x11, 0xed, + 0x4b, 0xfd, 0xbc, 0x68, 0x15, 0xe5, 0xd7, 0xba, 0xa2, 0x34, 0x7c, 0xb9, 0x97, 0x07, 0xa3, 0x84, + 0xe6, 0x9f, 0x5c, 0x15, 0x03, 0x73, 0x7d, 0xf4, 0x0a, 0xa5, 0x1c, 0xcb, 0x98, 0x16, 0x56, 0x40, + 0xc8, 0x49, 0x61, 0xd1, 0xd6, 0x67, 0x91, 0x16, 0xf8, 0x30, 0x01, 0x03, 0x79, 0x14, 0x0d, 0x32, + 0xd1, 0x45, 0x5b, 0x8e, 0xd7, 0x23, 0x88, 0x02, 0x2a, 0x49, 0x2b, 0xe9, 0xd0, 0x38, 0x8a, 0xca, + 0x2f, 0x54, 0xc6, 0x3c, 0xd0, 0x1e, 0xc2, 0xfc, 0xde, 0x23, 0xf4, 0x1d, 0xf1, 0x25, 0x0d, 0x4d, + 0x9f, 0x9d, 0x57, 0x59, 0x2e, 0xd0, 0xd0, 0x6a, 0xaa, 0xe5, 0x39, 0x9e, 0xdf, 0x28, 0x7f, 0x42, + 0xff, 0x3e, 0x8d, 0x5e, 0x56, 0x6d, 0x20, 0xf7, 0x3e, 0x64, 0x93, 0x0d, 0x5a, 0x02, 0x20, 0x4f, + 0x2c, 0xf6, 0xd4, 0xe8, 0xfd, 0x0d, 0x12, 0x38, 0xa9, 0x6b, 0x10, 0xa6, 0xb1, 0xbb, 0x6d, 0x56, + 0x30, 0x18, 0x21, 0x33, 0x00, 0x01, 0x3d, 0x5b, 0x56, 0xc0, 0x28, 0x36, 0xea, 0xd3, 0xc2, 0x62, + 0xfb, 0x66, 0xcb, 0xee, 0x07, 0x62, 0x0b, 0x8f, 0xa8, 0xac, 0x87, 0x52, 0x3e, 0x9d, 0x08, 0xb5, + 0x0c, 0x4d, 0xb8, 0xec, 0xf1, 0xaa, 0x24, 0x82, 0x05, 0x73, 0xae, 0xc9, 0x71, 0x02, 0x2c, 0x1b, + 0x0c, 0x9b, 0x78, 0x21, 0x51, 0x0a, 0x0b, 0x79, 0x61, 0x9b, 0x9a, 0x4a, 0xe7, 0x04, 0x08, 0x9e, + 0xa7, 0xe5, 0x64, 0xd0, 0x22, 0x5c, 0x5e, 0x6e, 0x9d, 0x4c, 0x5e, 0x72, 0x98, 0xa6, 0x1d, 0x49, + 0x58, 0x2e, 0x4d, 0x45, 0xb4, 0x6d, 0x2a, 0x2f, 0x50, 0xff, 0x3b, 0x5d, 0xb3, 0x1d, 0xc2, 0x43, + 0x93, 0x16, 0xf8, 0x96, 0x91, 0x3b, 0x78, 0x24, 0x17, 0x90, 0xae, 0x18, 0xd2, 0xac, 0x56, 0xa4, + 0xb2, 0x8d, 0x30, 0xd5, 0x1e, 0xc1, 0x06, 0xf2, 0x8c, 0x1f, 0xb6, 0x8a, 0x74, 0x33, 0xe3, 0x7b, + 0x7d, 0x97, 0x6d, 0xee, 0x42, 0x99, 0x4d, 0xd3, 0x66, 0xcb, 0x0b, 0xc8, 0xde, 0x1c, 0x76, 0xc8, + 0xc3, 0xa0, 0x02, 0xdb, 0xa5, 0x50, 0x5e, 0x06, 0x4a, 0x90, 0xa3, 0x80, 0xb0, 0x4a, 0x6f, 0xef, + 0xdf, 0x99, 0xa9, 0x2b, 0x24, 0xde, 0x1d, 0x3b, 0x88, 0xe2, 0x4f, 0x0c, 0xb2, 0x47, 0x9c, 0xa9, + 0x22, 0x0e, 0x42, 0x23, 0xce, 0x94, 0x18, 0x14, 0x27, 0x55, 0xa8, 0x6d, 0x53, 0xf9, 0xc8, 0x42, + 0xe3, 0xae, 0xed, 0x38, 0xeb, 0x24, 0xad, 0x48, 0x8a, 0x92, 0x5a, 0x79, 0x0c, 0x65, 0xfa, 0x56, + 0xbc, 0xfb, 0x14, 0x55, 0x5b, 0x57, 0xeb, 0xd3, 0xe1, 0x64, 0xb1, 0x7b, 0xe2, 0x78, 0xe5, 0xe3, + 0x26, 0xef, 0x7a, 0x7b, 0x68, 0xc3, 0x93, 0x41, 0x03, 0x84, 0x46, 0x07, 0x3c, 0x29, 0x34, 0x82, + 0x4a, 0x64, 0x1b, 0x49, 0x1d, 0x24, 0x7f, 0x0e, 0x50, 0x48, 0x25, 0xca, 0xa1, 0xd3, 0xab, 0x44, + 0xb4, 0x95, 0x26, 0x46, 0xd3, 0x19, 0x7d, 0xa5, 0x26, 0x4f, 0x2a, 0x64, 0x79, 0x63, 0xf2, 0x0c, + 0x5b, 0x18, 0x14, 0x11, 0x12, 0x98, 0x7b, 0x48, 0xe4, 0x0b, 0xfb, 0xa6, 0x1b, 0x38, 0xb0, 0x77, + 0x4c, 0x71, 0x01, 0x36, 0x41, 0x1a, 0x63, 0xf9, 0xd4, 0xae, 0xea, 0xd3, 0xf2, 0x97, 0x7a, 0x25, + 0x33, 0x03, 0xd5, 0x7c, 0x51, 0x78, 0x2d, 0xdf, 0xdc, 0xa7, 0xf6, 0x17, 0x51, 0xa7, 0x56, 0x83, + 0x99, 0xba, 0x5a, 0x75, 0xe1, 0x2b, 0x20, 0xe5, 0xcb, 0x78, 0x16, 0x14, 0x90, 0xbc, 0x99, 0x54, + 0x35, 0x59, 0x00, 0x2c, 0x48, 0xc7, 0xa2, 0x64, 0x8c, 0xa4, 0x37, 0x83, 0x6c, 0xad, 0x83, 0xda, + 0x57, 0xee, 0x3e, 0x4d, 0x88, 0xf8, 0x98, 0xd6, 0xc3, 0x92, 0x0e, 0x8e, 0xd4, 0xc6, 0x98, 0xbf, + 0xda, 0x6b, 0xf3, 0xa6, 0xfa, 0x56, 0x72, 0xc3, 0x3f, 0x50, 0x87, 0xa5, 0x78, 0x91, 0x8f, 0x68, + 0xe6, 0x6e, 0xa9, 0xc3, 0xea, 0x48, 0xbc, 0xcf, 0x23, 0x77, 0x3c, 0x39, 0xd8, 0x0b, 0x73, 0x82, + 0x28, 0x8a, 0x73, 0xc2, 0x78, 0x76, 0x14, 0x11, 0x1a, 0xc6, 0x06, 0x4e, 0x65, 0xb2, 0x6c, 0x32, + 0x93, 0x80, 0x9d, 0x26, 0x7f, 0xc4, 0x26, 0x74, 0x4f, 0x1c, 0x3e, 0x07, 0xe2, 0x53, 0xb9, 0x0c, + 0x7b, 0x17, 0xbf, 0x4a, 0x31, 0x94, 0xe3, 0xb4, 0x44, 0xd1, 0xac, 0x20, 0x90, 0x0f, 0xa9, 0x0e, + 0x36, 0xec, 0x4a, 0xf9, 0x37, 0xcb, 0x03, 0x85, 0x02, 0x03, 0xf7, 0x36, 0x28, 0xd3, 0xf0, 0x01, + 0x98, 0x0d, 0x18, 0x90, 0x94, 0xd5, 0x1d, 0x92, 0xcc, 0x84, 0x55, 0x82, 0x66, 0x22, 0xd5, 0x18, + 0x25, 0x45, 0xa5, 0x03, 0x00, 0xc2, 0x82, 0x8c, 0x66, 0x99, 0x58, 0x7e, 0xc0, 0xe2, 0x73, 0x19, + 0xac, 0x81, 0x65, 0x36, 0xe5, 0x29, 0x83, 0x08, 0xca, 0xdb, 0x95, 0xbe, 0xda, 0xde, 0xeb, 0x3a, + 0xcb, 0x14, 0xf9, 0x5d, 0xd3, 0x05, 0x85, 0xf4, 0xa3, 0x12, 0x16, 0x9b, 0x31, 0xdc, 0x71, 0x66, + 0xe1, 0x34, 0xb2, 0x59, 0x58, 0x61, 0x79, 0x93, 0x38, 0x42, 0x50, 0xf3, 0x44, 0x58, 0x85, 0x00, + 0xb0, 0x0c, 0x7b, 0x75, 0x22, 0xda, 0x72, 0xbd, 0x55, 0x56, 0x52, 0x5b, 0x34, 0xcb, 0xb1, 0x01, + 0xd1, 0x6d, 0xb6, 0x23, 0x0b, 0x72, 0xba, 0xbe, 0x2b, 0x28, 0x8f, 0x19, 0xc9, 0x3d, 0x17, 0xdb, + 0x31, 0x85, 0xc1, 0xa5, 0xdd, 0x33, 0x36, 0x49, 0xa8, 0xf3, 0xd8, 0xca, 0x6c, 0x9d, 0x28, 0xdf, + 0xa2, 0x96, 0x94, 0x49, 0x6c, 0x98, 0x9d, 0x6c, 0xd6, 0xc1, 0x4e, 0xc4, 0xe6, 0x48, 0x0b, 0xaf, + 0x26, 0x73, 0xb0, 0x28, 0x0b, 0xd0, 0xf3, 0x73, 0x39, 0xea, 0x19, 0x8a, 0x3a, 0xf3, 0x46, 0x12, + 0xd7, 0xc9, 0x72, 0x96, 0x39, 0x3d, 0xb5, 0xef, 0x6b, 0xb5, 0x60, 0x93, 0xbd, 0xe1, 0xf5, 0x0c, + 0xad, 0x96, 0xd7, 0x73, 0xd3, 0xc3, 0xd8, 0xeb, 0x66, 0x3a, 0xb3, 0x7a, 0x92, 0x9b, 0x43, 0xd2, + 0x10, 0xb2, 0x8e, 0x4d, 0x1f, 0x43, 0xb6, 0xb8, 0xb0, 0x6b, 0xb6, 0xac, 0xdd, 0xb2, 0x1a, 0x36, + 0x7a, 0xbd, 0x06, 0xcb, 0xb4, 0xd5, 0x36, 0xc9, 0xbc, 0x00, 0x1d, 0xf9, 0x93, 0x08, 0x0d, 0x5d, + 0x65, 0xb1, 0x65, 0x39, 0xcc, 0x31, 0x91, 0x4e, 0xfe, 0x95, 0x55, 0xfa, 0x9e, 0x35, 0xf2, 0x1b, + 0x87, 0x3c, 0x0d, 0xbd, 0xaa, 0x66, 0x32, 0x54, 0x21, 0xf3, 0x1c, 0xa8, 0x34, 0xb3, 0x81, 0x6c, + 0x15, 0x12, 0x57, 0xce, 0x7d, 0x43, 0x9b, 0x9b, 0x53, 0x85, 0x34, 0x0f, 0x12, 0x54, 0x5e, 0x09, + 0x6a, 0xc0, 0xc2, 0x38, 0x76, 0xd7, 0xc6, 0x77, 0xcd, 0x83, 0x06, 0xe4, 0xd9, 0xec, 0xde, 0x76, + 0xe1, 0x7e, 0xa4, 0xea, 0x55, 0xb2, 0x3a, 0x47, 0xea, 0x6e, 0xd9, 0x94, 0x55, 0xb4, 0xc2, 0x18, + 0x8d, 0x98, 0xdb, 0x24, 0x6a, 0x4b, 0xf7, 0xc5, 0x45, 0xe6, 0xa1, 0x05, 0x2c, 0xc1, 0x37, 0xef, + 0x33, 0xd9, 0x18, 0x7a, 0x4e, 0x92, 0xb7, 0xa8, 0xd3, 0xb3, 0xc5, 0x30, 0xba, 0x4c, 0xcb, 0xb5, + 0x4a, 0x16, 0x26, 0x0f, 0x57, 0x94, 0x39, 0x78, 0xdc, 0x16, 0xcd, 0x3d, 0xd3, 0x76, 0xc8, 0x4b, + 0xed, 0xcc, 0xbe, 0xf2, 0xd2, 0x5d, 0xb9, 0xc6, 0x2a, 0xcb, 0xb1, 0x1a, 0x25, 0x9e, 0x99, 0xf2, + 0xf0, 0x64, 0x3c, 0xd2, 0xc1, 0x3c, 0xec, 0xa9, 0x8c, 0x9b, 0xc3, 0x86, 0x01, 0x83, 0x8a, 0xcc, + 0x90, 0xf3, 0x06, 0x56, 0x93, 0xc8, 0x21, 0xdd, 0x99, 0xe1, 0x3c, 0x8b, 0xfc, 0x09, 0xb1, 0xf1, + 0x59, 0x8a, 0xe9, 0x26, 0x2f, 0x91, 0x86, 0x95, 0x51, 0x33, 0x5b, 0x19, 0x35, 0x49, 0x65, 0x54, + 0xd4, 0x8f, 0x64, 0xf9, 0x30, 0xd4, 0x5f, 0xf0, 0x60, 0x51, 0xfc, 0x4b, 0x04, 0xb6, 0xa8, 0x0a, + 0x4e, 0x9e, 0xf2, 0x6a, 0x88, 0x09, 0x75, 0x18, 0x9a, 0x4a, 0x47, 0xc5, 0xe1, 0x1c, 0x33, 0x65, + 0x26, 0x37, 0x95, 0x2a, 0x26, 0x26, 0x00, 0x85, 0xb2, 0x71, 0x0a, 0x01, 0x38, 0xc5, 0x1b, 0xbe, + 0x6f, 0x3e, 0x86, 0x1c, 0x99, 0x1e, 0x84, 0xb1, 0xb5, 0x28, 0xc6, 0x14, 0x2e, 0x52, 0xb5, 0xd6, + 0xd4, 0x17, 0x0d, 0x77, 0x29, 0x80, 0xaf, 0x46, 0x70, 0xcd, 0x70, 0x9b, 0xe0, 0x9f, 0x48, 0x43, + 0xa5, 0x12, 0x34, 0xaa, 0xd5, 0x40, 0x31, 0x59, 0x7d, 0xe9, 0x0e, 0xc4, 0x04, 0x47, 0x2e, 0x46, + 0xb7, 0x89, 0xb6, 0xc8, 0x89, 0x94, 0x70, 0x54, 0x04, 0xa9, 0xa7, 0xa2, 0xd6, 0x16, 0x48, 0xd4, + 0x7e, 0x46, 0x0c, 0x75, 0x75, 0x8e, 0x61, 0xc0, 0xcf, 0x8a, 0x61, 0x4e, 0x5d, 0x60, 0x18, 0x3c, + 0x56, 0x15, 0xcf, 0x2e, 0x1c, 0x39, 0xaa, 0x3b, 0xec, 0x59, 0xb8, 0x31, 0x1c, 0x2d, 0x04, 0x07, + 0xb6, 0xb1, 0x3e, 0xf4, 0x1b, 0xa6, 0xda, 0x6e, 0xd8, 0xea, 0x4e, 0x03, 0x0f, 0x06, 0x91, 0x9a, + 0x78, 0xd9, 0x3a, 0x7a, 0xd1, 0x91, 0x5f, 0xfc, 0x02, 0x06, 0x3b, 0xfc, 0x13, 0x4f, 0x1f, 0xa8, + 0x04, 0xe9, 0x61, 0xfb, 0x26, 0xde, 0x52, 0x42, 0x29, 0xfa, 0x06, 0x4e, 0x08, 0xcb, 0x27, 0xc2, + 0xf2, 0x89, 0xb0, 0x7c, 0x26, 0x2c, 0x3f, 0x12, 0x16, 0x39, 0xa6, 0x34, 0x42, 0x2b, 0xe7, 0x45, + 0x43, 0x99, 0x34, 0x2a, 0x54, 0xef, 0xf8, 0x31, 0x62, 0x68, 0x2f, 0xe1, 0xa3, 0x42, 0xcf, 0x33, + 0x0d, 0x17, 0xa6, 0x72, 0xe2, 0xa9, 0x92, 0x30, 0x64, 0x5e, 0x67, 0xc9, 0x5d, 0x74, 0x1a, 0xee, + 0x35, 0x87, 0xcd, 0xea, 0xc0, 0xac, 0x2e, 0xcc, 0xea, 0x2a, 0xb6, 0x21, 0x84, 0x64, 0x58, 0x86, + 0x63, 0xcd, 0x8c, 0xe3, 0xa6, 0x32, 0xb1, 0x95, 0x26, 0x72, 0xc8, 0x1f, 0x3a, 0xe2, 0x07, 0xc7, + 0xc9, 0x99, 0x79, 0xf6, 0x02, 0x91, 0x9f, 0x77, 0xd0, 0xd7, 0x55, 0xe4, 0x24, 0x58, 0x95, 0x0f, + 0x57, 0xc2, 0xf3, 0x59, 0xe0, 0xc6, 0x84, 0x4f, 0x27, 0xe2, 0xa8, 0x69, 0x2e, 0xc2, 0x07, 0xdc, + 0x01, 0x20, 0xda, 0x34, 0xb7, 0xd4, 0xde, 0xb5, 0x44, 0x7e, 0xb8, 0x94, 0x72, 0x72, 0x2c, 0xdc, + 0x2c, 0xf5, 0x92, 0x39, 0x6a, 0x23, 0x99, 0xa1, 0xf6, 0x2a, 0xb5, 0x46, 0x6f, 0x31, 0x51, 0x1d, + 0x48, 0x1f, 0x4d, 0xf0, 0x60, 0x15, 0x61, 0x0a, 0xe1, 0x1a, 0xc9, 0x9a, 0x42, 0xaf, 0x5a, 0x8b, + 0xd6, 0x05, 0xe4, 0x15, 0x66, 0x25, 0xbd, 0xb8, 0xa9, 0x52, 0xd9, 0x12, 0x17, 0xf6, 0x30, 0x1f, + 0x8f, 0x9a, 0x4f, 0x68, 0x18, 0x70, 0xb3, 0xd1, 0x66, 0x90, 0x74, 0x74, 0x6c, 0xd6, 0xe8, 0xa5, + 0x06, 0x76, 0x43, 0x76, 0xac, 0x9b, 0xb1, 0x0a, 0xa6, 0xb6, 0x13, 0x4a, 0xb2, 0x38, 0xa2, 0xa8, + 0x99, 0x43, 0x5d, 0xbf, 0xef, 0xb2, 0x25, 0x11, 0x0e, 0xed, 0xc2, 0x51, 0x89, 0x63, 0xbc, 0x54, + 0x30, 0xe7, 0xf5, 0x85, 0x9c, 0x0d, 0x4e, 0x7e, 0xe0, 0xe4, 0x1b, 0xdd, 0x8a, 0x1c, 0x06, 0x9e, + 0x88, 0xa6, 0x99, 0xe4, 0xc6, 0x22, 0xd5, 0x4b, 0x22, 0x65, 0x7d, 0x7a, 0x08, 0xc2, 0x0c, 0x5d, + 0xd4, 0x2f, 0xac, 0x7a, 0x7e, 0xe8, 0xf6, 0x21, 0x79, 0x1e, 0x76, 0x1e, 0xc8, 0xab, 0x27, 0x74, + 0xc3, 0xa3, 0x84, 0x49, 0x72, 0xd2, 0xc3, 0xe8, 0x5b, 0x6c, 0x47, 0xcf, 0x2c, 0x81, 0xe9, 0x6f, + 0x0e, 0x58, 0xb6, 0x29, 0x96, 0x4a, 0x58, 0x12, 0x70, 0x0d, 0x8f, 0x69, 0x7d, 0x31, 0x28, 0xb1, + 0xe5, 0xce, 0x92, 0x07, 0x5f, 0x0d, 0xef, 0x9a, 0xd1, 0x69, 0xba, 0x06, 0x6d, 0xa8, 0x54, 0x3c, + 0xb0, 0x66, 0x4f, 0x21, 0x8e, 0x62, 0x31, 0x6f, 0x76, 0x77, 0x4b, 0x03, 0x47, 0xa9, 0x1c, 0x4e, + 0x11, 0x46, 0xec, 0x25, 0xd9, 0xcf, 0x05, 0x02, 0x52, 0xc2, 0x33, 0x99, 0x34, 0x8b, 0x7c, 0x13, + 0x90, 0xc6, 0x0a, 0x76, 0x0a, 0x12, 0xf3, 0x29, 0xf2, 0x19, 0x39, 0x20, 0xbf, 0xe1, 0x13, 0x38, + 0x40, 0xf0, 0xb7, 0xc2, 0xfb, 0x29, 0x3e, 0xe3, 0x52, 0xf3, 0x89, 0xcc, 0x4c, 0xa5, 0x12, 0x44, + 0xcf, 0xa6, 0x02, 0x5e, 0x39, 0x07, 0xb2, 0x9d, 0x82, 0x6c, 0x13, 0xc8, 0x9d, 0x3c, 0xc8, 0x9d, + 0x14, 0xe4, 0x0e, 0x40, 0x0e, 0x94, 0x46, 0xae, 0x20, 0x5c, 0x2e, 0xaf, 0x1d, 0x1f, 0x99, 0x8f, + 0xc2, 0x2d, 0x47, 0xd9, 0x6f, 0xef, 0xc8, 0xe5, 0xca, 0x26, 0x24, 0x11, 0x90, 0x48, 0xb4, 0xe1, + 0xb3, 0xb3, 0xa5, 0x7d, 0x0f, 0x3e, 0x4f, 0x2e, 0xab, 0x65, 0xa5, 0x52, 0x56, 0xca, 0x85, 0x8a, + 0x54, 0x78, 0xa6, 0x2c, 0xbc, 0x80, 0x74, 0x32, 0xa5, 0x0e, 0x1d, 0x47, 0x9e, 0xae, 0xca, 0x28, + 0x73, 0xb2, 0xcd, 0x12, 0x1c, 0xd8, 0x0c, 0x60, 0xdb, 0xfa, 0xda, 0xdc, 0x01, 0x2d, 0x4c, 0x10, + 0x43, 0x02, 0x17, 0x23, 0x48, 0x7c, 0x81, 0x90, 0xbe, 0x3e, 0xa8, 0xb6, 0x9b, 0x51, 0x46, 0x32, + 0xbc, 0xd4, 0x42, 0x6b, 0x43, 0x6e, 0x78, 0xc0, 0x7b, 0x74, 0x54, 0xae, 0xe9, 0xbd, 0x03, 0x89, + 0xbc, 0xbc, 0x14, 0x94, 0x21, 0xee, 0xcc, 0x3c, 0x6c, 0x55, 0x1e, 0x6a, 0x4b, 0x0f, 0x5b, 0x4b, + 0x33, 0x10, 0xf0, 0x5c, 0x60, 0x0b, 0x5b, 0x1d, 0xd9, 0x51, 0x88, 0xde, 0xf4, 0xe1, 0x99, 0xf9, + 0x7c, 0x9f, 0x3b, 0x79, 0xc8, 0x72, 0x84, 0x63, 0x2f, 0x5f, 0x29, 0x3c, 0xb7, 0x23, 0x65, 0x28, + 0x98, 0xcf, 0xf0, 0x2a, 0xfd, 0xdc, 0xa2, 0x1a, 0x93, 0x23, 0x90, 0x13, 0x15, 0xcc, 0x63, 0xd2, + 0x21, 0x47, 0xbd, 0x69, 0x06, 0x88, 0xe4, 0xaf, 0x46, 0x79, 0x87, 0xe6, 0xcb, 0xa9, 0xee, 0x1b, + 0x8e, 0xdd, 0x76, 0x8d, 0x32, 0x59, 0x58, 0xe4, 0xc3, 0xee, 0x89, 0x04, 0x1b, 0xba, 0x7c, 0x61, + 0xec, 0xb1, 0xd2, 0xb1, 0xa7, 0x6d, 0x58, 0x24, 0xf6, 0x44, 0x99, 0x5e, 0x9b, 0xc1, 0x2f, 0xc9, + 0x53, 0xb9, 0x41, 0xe3, 0xe8, 0xa8, 0x7d, 0x2d, 0x75, 0x72, 0x0f, 0xf1, 0x25, 0x0f, 0xd6, 0x3c, + 0x00, 0xd8, 0xc5, 0x64, 0xb0, 0x62, 0xaf, 0x24, 0xb5, 0xc3, 0x05, 0x67, 0x0b, 0xff, 0xd2, 0x16, + 0x97, 0x97, 0xbb, 0x43, 0xaf, 0x2d, 0x87, 0x9c, 0x29, 0xd5, 0xd9, 0xe9, 0xa8, 0xda, 0x99, 0xa9, + 0xb4, 0xb5, 0x52, 0xd5, 0xc2, 0x0d, 0x56, 0x27, 0x0a, 0xc7, 0xaa, 0x38, 0x7d, 0x2e, 0x08, 0x7b, + 0x82, 0x6a, 0x90, 0xdd, 0x55, 0x64, 0xf0, 0x56, 0x5b, 0x8a, 0xd2, 0x78, 0x69, 0x6b, 0x9a, 0x61, + 0xf5, 0xd9, 0x98, 0x7c, 0x3e, 0xf6, 0x12, 0x71, 0x3b, 0x5d, 0x56, 0xcc, 0x98, 0xf6, 0x86, 0x6d, + 0x3d, 0x1a, 0xc5, 0xa6, 0x7b, 0xdc, 0xaa, 0xff, 0x8f, 0xb9, 0x6b, 0x81, 0x67, 0xb2, 0xed, 0xff, + 0x2b, 0x21, 0xcb, 0x08, 0x91, 0x24, 0x66, 0xa2, 0xb1, 0x1b, 0xa3, 0x1c, 0xa2, 0xc5, 0x62, 0xa1, + 0x52, 0x42, 0x5a, 0x14, 0x36, 0x86, 0x85, 0x6d, 0xed, 0xc0, 0x54, 0x8a, 0x79, 0x5e, 0xd1, 0x9e, + 0xce, 0xa5, 0x1e, 0x25, 0x54, 0xd2, 0x01, 0x19, 0x8f, 0x9e, 0xd0, 0x81, 0xa2, 0x03, 0xde, 0xd2, + 0xb9, 0x87, 0x8a, 0xf4, 0x2a, 0x4f, 0xd2, 0x41, 0xe9, 0x40, 0x3d, 0xfd, 0xef, 0x7b, 0x6b, 0xb3, + 0xcd, 0x26, 0xbd, 0xef, 0xfb, 0xff, 0x7f, 0xfe, 0xf3, 0xc1, 0xee, 0xeb, 0xbe, 0xee, 0xeb, 0xba, + 0xee, 0xdf, 0xfd, 0xbb, 0x7e, 0xa7, 0xef, 0x75, 0xfd, 0x6e, 0x20, 0x01, 0xe0, 0x02, 0xd1, 0x40, + 0x22, 0x90, 0x0c, 0x04, 0x03, 0x49, 0x40, 0x20, 0xe0, 0x07, 0x78, 0x0a, 0x6d, 0x48, 0x90, 0x69, + 0xd7, 0xa5, 0x88, 0xdc, 0x10, 0xc8, 0x5a, 0x8c, 0xa2, 0x26, 0x52, 0x59, 0x10, 0xcd, 0xd6, 0xaf, + 0xc7, 0x02, 0x81, 0x38, 0xe1, 0x5a, 0x31, 0x2f, 0xe9, 0x32, 0x92, 0xa8, 0x92, 0xa7, 0x78, 0x9a, + 0x45, 0x47, 0x47, 0xa3, 0x80, 0x44, 0x51, 0x45, 0xd9, 0xc2, 0x58, 0x51, 0xcd, 0x45, 0x42, 0x26, + 0x5c, 0xbf, 0xde, 0xd6, 0x19, 0x08, 0x16, 0x55, 0x93, 0x94, 0x38, 0x80, 0xdc, 0x2a, 0x8d, 0x76, + 0xcb, 0x3c, 0x18, 0x9b, 0x61, 0x67, 0x24, 0xb2, 0x30, 0x4a, 0xfa, 0x2a, 0x8e, 0x95, 0x9d, 0x74, + 0xcd, 0xa1, 0x3b, 0xb0, 0x02, 0x92, 0xa5, 0xeb, 0x45, 0xc9, 0xd5, 0x93, 0xbe, 0x31, 0x48, 0x90, + 0x29, 0xef, 0x0e, 0xd4, 0xc0, 0x98, 0x64, 0x50, 0x18, 0x70, 0xec, 0x66, 0x61, 0x21, 0xf3, 0x3d, + 0xd2, 0x5a, 0xd4, 0xcd, 0x72, 0xd1, 0xda, 0x06, 0xd0, 0xd0, 0x4b, 0x12, 0x95, 0x81, 0x4d, 0x0e, + 0x95, 0x25, 0x40, 0x7e, 0x9b, 0x1f, 0x8e, 0x01, 0x0a, 0x8e, 0x18, 0x5c, 0x3c, 0xc6, 0xde, 0x8d, + 0x31, 0x27, 0xc6, 0x0d, 0x3c, 0xc6, 0xe0, 0xec, 0xad, 0x24, 0x0f, 0x59, 0xce, 0x51, 0x97, 0x1c, + 0x5a, 0xc7, 0x02, 0x5c, 0x9c, 0x3c, 0xe3, 0x40, 0x0a, 0x0d, 0x9c, 0xcd, 0x9e, 0x38, 0x29, 0x47, + 0x5d, 0xd6, 0xce, 0x91, 0x8a, 0xb7, 0x60, 0xb8, 0x43, 0x6c, 0x26, 0x0a, 0xde, 0x88, 0x24, 0x24, + 0xe9, 0x07, 0x18, 0x81, 0x18, 0x7a, 0xf0, 0x04, 0x64, 0x27, 0x05, 0xcd, 0x86, 0x69, 0x25, 0x5f, + 0x84, 0x01, 0x8b, 0x64, 0x50, 0x08, 0x51, 0x47, 0xc2, 0x95, 0xb4, 0x34, 0x90, 0x64, 0x34, 0x0c, + 0x2e, 0x0a, 0xf0, 0x83, 0x1c, 0xe0, 0xa1, 0xa7, 0x62, 0x69, 0x19, 0x38, 0x17, 0xeb, 0x9e, 0x20, + 0xf2, 0x15, 0x14, 0x2e, 0x14, 0x15, 0x99, 0x4b, 0x20, 0xf1, 0xa2, 0x71, 0x6c, 0xe1, 0x0a, 0xe7, + 0x40, 0xd0, 0xc6, 0x61, 0xcf, 0xa1, 0xba, 0x81, 0xc7, 0xa3, 0x23, 0x5e, 0xb0, 0x12, 0xe2, 0x05, + 0xff, 0xa7, 0xc4, 0x4b, 0xfc, 0x37, 0x89, 0x47, 0xb7, 0x49, 0x92, 0x27, 0x1e, 0x1d, 0x93, 0xa4, + 0x8c, 0x78, 0x14, 0x11, 0x71, 0xe8, 0x18, 0x5c, 0xf2, 0xd0, 0xca, 0xfa, 0x14, 0xa9, 0x00, 0xb2, + 0x95, 0xeb, 0x77, 0xfa, 0x89, 0xf4, 0x8e, 0xa4, 0x52, 0x42, 0xca, 0xbf, 0x05, 0x05, 0xca, 0xcb, + 0x09, 0x48, 0x2e, 0x24, 0xc8, 0x84, 0xa0, 0x92, 0x44, 0x34, 0x94, 0x0b, 0xfb, 0x4a, 0xc3, 0x35, + 0x43, 0x51, 0x29, 0x8c, 0xc2, 0xc8, 0x11, 0x5a, 0x8a, 0xec, 0x98, 0x61, 0x12, 0xd1, 0x7a, 0x58, + 0x0c, 0x49, 0x1c, 0xfc, 0x97, 0xd0, 0x4b, 0x5a, 0x67, 0x49, 0xb0, 0x48, 0x61, 0xa1, 0x72, 0x98, + 0xe2, 0x7b, 0x9c, 0x47, 0xe4, 0xc7, 0xca, 0xb0, 0x8d, 0x27, 0x89, 0x01, 0x9a, 0x00, 0x1c, 0x36, + 0x1b, 0x05, 0x30, 0x46, 0xc5, 0x11, 0xb2, 0xd1, 0x3f, 0x96, 0x94, 0x65, 0xf5, 0xbd, 0xd7, 0xe1, + 0x26, 0x17, 0x5a, 0xe9, 0x25, 0x20, 0x91, 0x59, 0x00, 0xc3, 0x4a, 0x51, 0x9b, 0x21, 0x74, 0x1a, + 0x85, 0x65, 0x35, 0x4a, 0x13, 0x0c, 0x6c, 0x46, 0xee, 0xbe, 0x14, 0x4d, 0x07, 0x40, 0x0e, 0x36, + 0x96, 0xea, 0x08, 0xa0, 0x09, 0xdd, 0x6a, 0x89, 0x59, 0x43, 0x9b, 0x43, 0x72, 0xa3, 0x81, 0x66, + 0x0d, 0x17, 0x34, 0x6b, 0x40, 0x43, 0x3e, 0x1e, 0xc7, 0x85, 0xc4, 0xa0, 0xec, 0x38, 0xc5, 0x7a, + 0xd7, 0xd2, 0x32, 0x7e, 0x98, 0xa7, 0x1c, 0x2f, 0xa7, 0x88, 0x41, 0x61, 0xc9, 0x85, 0x24, 0xba, + 0xa2, 0x16, 0x48, 0x5c, 0x4b, 0x4b, 0xa6, 0xac, 0xcf, 0x0e, 0xb6, 0xc0, 0x94, 0x53, 0xcf, 0xa0, + 0xec, 0x1c, 0xd5, 0xe3, 0xe1, 0x7e, 0xe7, 0x46, 0xa9, 0xf5, 0xbd, 0xca, 0xe5, 0x83, 0xb8, 0xb2, + 0xd8, 0xc8, 0x91, 0x11, 0x13, 0x5c, 0x5b, 0x7a, 0x74, 0x34, 0xe8, 0x99, 0x83, 0x42, 0xdc, 0x86, + 0x2b, 0x09, 0x4a, 0x8e, 0x6e, 0x18, 0x98, 0xa8, 0x61, 0xf3, 0x59, 0x24, 0x38, 0x64, 0x8e, 0x46, + 0x29, 0x44, 0x62, 0xe4, 0x24, 0x46, 0xbc, 0xbc, 0x08, 0x51, 0x26, 0x7d, 0x45, 0x5e, 0xa7, 0xe2, + 0xe8, 0x63, 0x24, 0x07, 0xb4, 0x2a, 0x12, 0xe6, 0x8b, 0x0d, 0x66, 0x77, 0xea, 0x88, 0xa7, 0x45, + 0x53, 0xc7, 0x55, 0xb4, 0x00, 0x4b, 0x81, 0xe3, 0x24, 0xbe, 0x5c, 0xde, 0xf5, 0x51, 0x34, 0x5b, + 0x65, 0x79, 0x20, 0x86, 0x42, 0xa3, 0x30, 0x41, 0x1e, 0xf6, 0xfe, 0x8e, 0x47, 0x58, 0xb9, 0x2a, + 0x19, 0xaf, 0x18, 0xc0, 0x70, 0x47, 0x53, 0x71, 0x58, 0xf9, 0x85, 0x99, 0xd2, 0x68, 0x86, 0xbb, + 0x84, 0x0e, 0x91, 0xa0, 0x13, 0xc7, 0xa6, 0x04, 0x80, 0xa7, 0x48, 0xf1, 0xe2, 0xf6, 0xa1, 0xb9, + 0x02, 0xcc, 0x16, 0x4e, 0x3c, 0x67, 0xac, 0x95, 0xab, 0x5c, 0xdd, 0x45, 0x20, 0x03, 0x90, 0x98, + 0x92, 0xba, 0x10, 0xf5, 0x13, 0x00, 0x68, 0x59, 0x2f, 0xb4, 0x82, 0xdd, 0x53, 0x3c, 0x04, 0xb4, + 0x1c, 0x06, 0x30, 0x84, 0xb8, 0x0c, 0xab, 0x69, 0xaf, 0xb0, 0x26, 0x9d, 0x01, 0x8a, 0x6e, 0x79, + 0x8a, 0x4b, 0x1a, 0x51, 0xcc, 0x39, 0xd4, 0x51, 0x70, 0x8b, 0x50, 0x9c, 0x00, 0x23, 0x47, 0x51, + 0x00, 0xb6, 0x2c, 0xb3, 0x28, 0x95, 0x16, 0xc3, 0xf5, 0x91, 0xc2, 0x71, 0xc9, 0x89, 0x14, 0x09, + 0x8c, 0x34, 0xea, 0xe1, 0xb2, 0x01, 0xb4, 0x83, 0xcd, 0x48, 0x03, 0x56, 0xac, 0x1c, 0x47, 0x29, + 0x16, 0x87, 0xbc, 0x58, 0xc9, 0x34, 0x1d, 0x32, 0x9c, 0x65, 0x44, 0xb6, 0xb0, 0x44, 0x69, 0x55, + 0x19, 0x51, 0x2d, 0x63, 0x96, 0x2b, 0x15, 0xc8, 0x1c, 0x09, 0x7e, 0x21, 0x0a, 0xdd, 0x70, 0xc4, + 0xd2, 0x95, 0x0e, 0x3a, 0x8d, 0x74, 0x21, 0x7e, 0xc1, 0x09, 0xa5, 0x43, 0xf8, 0x85, 0x08, 0xf7, + 0x47, 0x9b, 0x61, 0x87, 0x5b, 0xff, 0x43, 0x6d, 0xda, 0x24, 0x80, 0x4e, 0x84, 0x68, 0x6d, 0x81, + 0x10, 0x32, 0x57, 0x8e, 0x47, 0x4b, 0xe9, 0xe6, 0xd1, 0xe1, 0xd0, 0xff, 0xcf, 0xf0, 0x66, 0xe1, + 0x49, 0x69, 0xec, 0x57, 0x6e, 0x09, 0x83, 0x72, 0x24, 0x78, 0x88, 0x99, 0xed, 0x1d, 0x7f, 0x76, + 0x49, 0xde, 0xcc, 0x99, 0xff, 0x09, 0x4e, 0x2c, 0x81, 0x5f, 0xa5, 0x80, 0x4f, 0x7b, 0x60, 0x68, + 0x52, 0x0b, 0xb1, 0x58, 0x27, 0x0a, 0x09, 0x2b, 0x8d, 0xc5, 0xa2, 0xcc, 0x23, 0xb1, 0x91, 0xd8, + 0x28, 0x32, 0x4a, 0x1e, 0x7f, 0x15, 0x7e, 0xc0, 0xd2, 0x58, 0x12, 0x48, 0x62, 0x71, 0x69, 0x94, + 0x23, 0xf4, 0x83, 0x12, 0x83, 0xac, 0x33, 0x1d, 0x65, 0x61, 0xd5, 0x9f, 0x88, 0xb2, 0x8e, 0x34, + 0xdd, 0x7e, 0x3e, 0xca, 0xea, 0xa0, 0x40, 0xdc, 0xd8, 0x28, 0xee, 0x44, 0x49, 0xe8, 0xf5, 0x67, + 0x77, 0x27, 0x8c, 0x1a, 0xd4, 0x95, 0x13, 0x6e, 0x23, 0xac, 0x1b, 0x54, 0x8c, 0x7e, 0x2a, 0xd3, + 0xef, 0xd6, 0xe8, 0xe1, 0xed, 0xd9, 0x39, 0x28, 0xf1, 0xf0, 0x47, 0x46, 0x90, 0x14, 0x2c, 0xed, + 0x11, 0xd9, 0xd1, 0x43, 0x38, 0xcf, 0xf7, 0x9b, 0x11, 0x9e, 0x1d, 0x15, 0xb8, 0x21, 0xdf, 0x98, + 0x12, 0x94, 0x63, 0xa8, 0x9a, 0xeb, 0xd0, 0xd7, 0x51, 0xa2, 0x1e, 0xc3, 0xba, 0x50, 0x0c, 0x7f, + 0x0c, 0x55, 0xfb, 0xef, 0x01, 0x08, 0x23, 0x7a, 0x33, 0x72, 0x2b, 0x9c, 0x47, 0x76, 0x1b, 0x58, + 0x0a, 0x9d, 0x1b, 0x8a, 0x02, 0x66, 0x11, 0x87, 0x7f, 0x46, 0xe9, 0x63, 0x50, 0x87, 0xb6, 0x78, + 0x28, 0x34, 0x42, 0x58, 0xe0, 0x50, 0x67, 0xce, 0x06, 0xa0, 0x7f, 0xce, 0xff, 0x2b, 0xe6, 0x85, + 0x34, 0x17, 0x0f, 0x63, 0x4b, 0xe9, 0x93, 0xc3, 0x7c, 0xb0, 0xff, 0xba, 0x96, 0x87, 0x6e, 0x52, + 0xaa, 0x43, 0x60, 0x64, 0xf1, 0x03, 0x28, 0x14, 0x27, 0x4a, 0x8c, 0x81, 0x1f, 0xdb, 0x2e, 0x12, + 0x1f, 0x4f, 0xb8, 0xc2, 0x10, 0x35, 0x5a, 0xa3, 0x66, 0x34, 0xc6, 0xd6, 0x4f, 0xde, 0x17, 0x5b, + 0xb1, 0x1d, 0x23, 0xd6, 0xe7, 0xac, 0xff, 0xb3, 0xdd, 0x77, 0xa2, 0x9e, 0xc5, 0xac, 0xa8, 0x2c, + 0x76, 0x28, 0xd9, 0x5e, 0xf9, 0x03, 0x4e, 0x16, 0x5d, 0x05, 0xfd, 0x85, 0x82, 0x67, 0x23, 0xf2, + 0xb1, 0x94, 0x36, 0x1b, 0x56, 0xd5, 0xd6, 0xde, 0x41, 0xb6, 0x72, 0x38, 0x9d, 0x19, 0x13, 0x38, + 0xc4, 0x67, 0xc3, 0x2f, 0x70, 0x71, 0xf9, 0xb9, 0x0b, 0xec, 0x47, 0x1a, 0xcc, 0xcf, 0x2e, 0x37, + 0x52, 0xb4, 0xf9, 0x74, 0xf4, 0xaa, 0x89, 0xfe, 0x33, 0x62, 0x87, 0x85, 0x1b, 0x71, 0x2a, 0xd3, + 0x70, 0x3f, 0x9e, 0xcc, 0x4a, 0x48, 0xf4, 0x83, 0x49, 0xad, 0xe0, 0x84, 0xe8, 0x0a, 0x59, 0x06, + 0x42, 0xd3, 0x45, 0x41, 0x24, 0x89, 0xae, 0x4b, 0x41, 0x53, 0xad, 0xc4, 0x1b, 0xde, 0xe5, 0x45, + 0x3e, 0x6e, 0xdd, 0xf7, 0xfd, 0x1b, 0x2c, 0x68, 0x57, 0x37, 0xb4, 0x78, 0xde, 0x37, 0x4a, 0xb4, + 0x81, 0x01, 0x7c, 0x56, 0xf8, 0xf8, 0x78, 0xd7, 0x91, 0xb6, 0x53, 0xd3, 0x44, 0x0b, 0x60, 0xb0, + 0x10, 0x49, 0x86, 0xd2, 0x3a, 0xb0, 0x84, 0xe9, 0x1a, 0xa8, 0xa2, 0x9d, 0xdc, 0x34, 0x51, 0x38, + 0x6c, 0x98, 0xa6, 0x11, 0xf7, 0x2a, 0x5e, 0x99, 0x20, 0xb1, 0xb3, 0xc1, 0x27, 0x0f, 0xf6, 0xec, + 0xaa, 0x40, 0x21, 0xff, 0xa0, 0x0d, 0x36, 0x38, 0x73, 0x41, 0xfd, 0xa5, 0x6c, 0xc0, 0x20, 0x8b, + 0xc8, 0xed, 0xa0, 0x80, 0x66, 0xbf, 0x64, 0xe3, 0x96, 0xcc, 0xd6, 0x2e, 0xab, 0xf5, 0xeb, 0xcd, + 0x44, 0x18, 0xf2, 0x3a, 0x51, 0xc8, 0xd3, 0x0c, 0x0b, 0xb2, 0x88, 0xd2, 0xfe, 0x95, 0xed, 0x13, + 0xa5, 0x8a, 0xf6, 0x89, 0x52, 0x87, 0xbc, 0x09, 0x61, 0x9b, 0x60, 0xe7, 0x90, 0x0a, 0x95, 0xdc, + 0xf1, 0xf0, 0xbd, 0xd9, 0xc2, 0xa7, 0x80, 0xa3, 0xb8, 0x43, 0xa3, 0x75, 0x55, 0x98, 0x48, 0x61, + 0x38, 0x41, 0xc1, 0x5b, 0xb7, 0x4a, 0x81, 0x12, 0x3a, 0x08, 0xf7, 0x48, 0x7e, 0x5f, 0x01, 0x2e, + 0xec, 0x51, 0x49, 0xfb, 0x96, 0x96, 0x8a, 0x92, 0x1f, 0x0c, 0x6f, 0x58, 0x54, 0x5b, 0x81, 0xb1, + 0xf0, 0x7d, 0x98, 0x3f, 0x33, 0xbe, 0x14, 0x00, 0x25, 0x7e, 0x3c, 0x28, 0x9c, 0xd8, 0xaf, 0x91, + 0x6c, 0xcc, 0x84, 0xfc, 0x1d, 0x4b, 0x4b, 0x51, 0x48, 0x43, 0xa6, 0xd0, 0x96, 0x94, 0x10, 0xe5, + 0x2e, 0xfa, 0x3a, 0x3c, 0xbd, 0xc3, 0x3a, 0x6f, 0x68, 0x93, 0x84, 0x2b, 0x0d, 0xf0, 0xa2, 0xd3, + 0x38, 0x6c, 0x57, 0x16, 0x00, 0x21, 0x89, 0xa2, 0xef, 0x54, 0x00, 0x42, 0x80, 0x02, 0x84, 0x76, + 0x00, 0x85, 0xe9, 0x4a, 0x4a, 0x49, 0xb1, 0x72, 0x55, 0xe4, 0x59, 0x25, 0xd0, 0xa3, 0x38, 0xf1, + 0x92, 0xae, 0x45, 0x47, 0xb6, 0x14, 0x2e, 0xb4, 0xa5, 0x94, 0xe5, 0x2e, 0x7b, 0x88, 0xfb, 0x99, + 0xee, 0x24, 0xc9, 0x30, 0x84, 0xd7, 0xe0, 0x68, 0xe2, 0x49, 0x28, 0xac, 0x8e, 0x63, 0x89, 0x0f, + 0x25, 0x2d, 0x80, 0x5a, 0xee, 0x7b, 0x91, 0x74, 0x43, 0x38, 0x08, 0x1d, 0x97, 0x72, 0x0e, 0xdd, + 0xa0, 0x6c, 0x36, 0x59, 0xfe, 0x8b, 0xbd, 0x11, 0x70, 0x23, 0xe8, 0x2d, 0x5e, 0x08, 0x5f, 0x1f, + 0xaf, 0x00, 0x98, 0x28, 0x2d, 0xa0, 0xff, 0x78, 0x28, 0x19, 0xf5, 0x60, 0xd9, 0xaf, 0x0b, 0xa1, + 0x44, 0x39, 0xac, 0x00, 0xef, 0x79, 0xb0, 0xd2, 0xeb, 0xc6, 0x7f, 0x41, 0x69, 0x85, 0x62, 0xf0, + 0x7e, 0x78, 0x18, 0x4c, 0xb0, 0x6d, 0xc2, 0x17, 0x12, 0x94, 0x55, 0x51, 0x83, 0xe1, 0xb3, 0x82, + 0x05, 0x83, 0x69, 0x5d, 0x82, 0x7e, 0xc7, 0x5c, 0xa1, 0x1f, 0x83, 0xf2, 0x32, 0x1a, 0xb2, 0x09, + 0x44, 0x76, 0x20, 0x3d, 0x9a, 0x9d, 0x44, 0x62, 0x52, 0x60, 0xfe, 0x24, 0x2a, 0x8d, 0x6d, 0xbb, + 0x98, 0x10, 0x84, 0x4c, 0x9c, 0x69, 0x3b, 0xd3, 0xe9, 0xf8, 0xf3, 0x4e, 0x0b, 0x18, 0x6c, 0x42, + 0xa1, 0xaf, 0x17, 0x3e, 0x88, 0x1b, 0xd6, 0x9b, 0xab, 0xc1, 0x58, 0x76, 0x77, 0xca, 0x95, 0x31, + 0x75, 0x5b, 0x4e, 0xe4, 0xee, 0x28, 0xd7, 0x33, 0xc0, 0xb7, 0xcc, 0xdb, 0x54, 0x16, 0x0b, 0x2b, + 0x1c, 0xa3, 0xdb, 0xb3, 0x68, 0x5a, 0x5c, 0x51, 0x48, 0xd1, 0xed, 0x29, 0x45, 0xb9, 0x89, 0x21, + 0xbd, 0x68, 0xfe, 0x24, 0x46, 0x37, 0xaa, 0xd0, 0xbc, 0x00, 0x30, 0xf0, 0x81, 0x59, 0x90, 0x16, + 0x6a, 0x2e, 0xd4, 0x1d, 0xab, 0xe1, 0xb5, 0xfb, 0x51, 0x23, 0xcc, 0x1a, 0x41, 0x18, 0x57, 0x00, + 0x2c, 0x98, 0xec, 0xb1, 0x14, 0x7e, 0xd5, 0xe4, 0xfd, 0xfb, 0x6f, 0xb8, 0x25, 0x26, 0x1f, 0xcf, + 0x0d, 0x3e, 0xea, 0x7a, 0xd8, 0x7b, 0xae, 0xfb, 0xf3, 0x8d, 0x2f, 0x6a, 0xcc, 0xf6, 0xaa, 0xf6, + 0xaa, 0xe4, 0xe7, 0x31, 0xdc, 0xd9, 0xcf, 0x1f, 0x47, 0x9a, 0x4f, 0x1b, 0xe9, 0x93, 0x5b, 0xcb, + 0xe2, 0x70, 0x9a, 0x6a, 0xf0, 0xd9, 0xda, 0xae, 0x57, 0x03, 0x0a, 0x8a, 0x8e, 0x46, 0xf8, 0xb7, + 0xad, 0xd8, 0x65, 0xd2, 0xdc, 0xb7, 0x20, 0xec, 0x6f, 0xd6, 0x8a, 0x1b, 0x41, 0xc6, 0xc7, 0x8b, + 0x36, 0x01, 0x53, 0x89, 0xfe, 0x15, 0xf6, 0x57, 0x8f, 0x0c, 0x5c, 0xc2, 0x68, 0x51, 0x10, 0x76, + 0x03, 0x6b, 0xee, 0xcd, 0x7c, 0xc7, 0xc4, 0xd9, 0x1b, 0x07, 0xf5, 0xbe, 0xdc, 0x5b, 0xf9, 0xd7, + 0xd7, 0xc7, 0xa4, 0xdb, 0xd3, 0x7e, 0x57, 0xf9, 0x83, 0x17, 0xdd, 0x17, 0xfa, 0xd6, 0x34, 0xf3, + 0xad, 0xeb, 0xb1, 0x77, 0x75, 0x66, 0x2d, 0x4b, 0xb3, 0x27, 0x38, 0xce, 0x68, 0xac, 0xfe, 0xd5, + 0x2a, 0x67, 0x67, 0xa0, 0xba, 0xef, 0x9c, 0x31, 0x82, 0x17, 0xd8, 0xee, 0xfe, 0x03, 0xb0, 0xb4, + 0x30, 0xe7, 0x17, 0x94, 0x74, 0x7e, 0x90, 0x29, 0xf9, 0x2e, 0xbe, 0xd8, 0xd5, 0xa7, 0x33, 0xeb, + 0xf9, 0x5e, 0xad, 0xe3, 0x6d, 0x65, 0xce, 0x15, 0x5a, 0xe9, 0xd3, 0x9c, 0xf6, 0xd6, 0xaa, 0x32, + 0x74, 0xbf, 0xa8, 0x04, 0xf1, 0x04, 0xf9, 0xee, 0x67, 0xf0, 0x1b, 0xe2, 0x5e, 0xa4, 0x4d, 0xea, + 0x49, 0x7b, 0x73, 0x2d, 0x91, 0xb1, 0x1f, 0x98, 0x12, 0xd2, 0x72, 0xe5, 0xc1, 0xc7, 0xcd, 0xeb, + 0xe0, 0x3e, 0x9d, 0x1a, 0x99, 0x16, 0xd8, 0xee, 0xf9, 0xd9, 0x69, 0x96, 0xe5, 0x67, 0x4f, 0xe5, + 0x2f, 0x66, 0xf9, 0x63, 0x7a, 0xe0, 0x99, 0x16, 0xc8, 0xec, 0xd4, 0xe9, 0x8d, 0xbf, 0xa2, 0x1b, + 0xf5, 0xf5, 0xdd, 0x06, 0x26, 0x68, 0xc6, 0x5b, 0x57, 0xc1, 0xb5, 0x78, 0x93, 0x3d, 0xdc, 0x3e, + 0x27, 0x54, 0x6b, 0xab, 0x61, 0xc6, 0x0b, 0x32, 0x97, 0x75, 0xcc, 0x5f, 0xe1, 0xb4, 0x3b, 0xff, + 0xef, 0x07, 0xd5, 0x77, 0x4b, 0xea, 0x37, 0xff, 0x96, 0xbe, 0x62, 0xcd, 0x81, 0x88, 0xfa, 0x6a, + 0xb8, 0x49, 0x76, 0x57, 0x8a, 0x2a, 0xe7, 0xf2, 0xd4, 0x17, 0x03, 0xba, 0x71, 0x97, 0x5f, 0x0c, + 0x56, 0xa5, 0x2d, 0xb6, 0x88, 0xa9, 0x9b, 0xce, 0x38, 0xf9, 0x25, 0x31, 0x37, 0xbd, 0x0e, 0xbe, + 0xa0, 0xd8, 0xae, 0x96, 0xcd, 0xc8, 0x05, 0xa6, 0x71, 0xfd, 0xd7, 0x01, 0xfd, 0xfd, 0x4b, 0x93, + 0x63, 0xec, 0x67, 0xbc, 0x5e, 0x57, 0x3c, 0x27, 0x11, 0x4b, 0xd6, 0x51, 0x4f, 0x1b, 0x74, 0xfe, + 0x55, 0xe3, 0xfa, 0x85, 0x09, 0x07, 0x76, 0xf4, 0x93, 0xb9, 0xfa, 0x71, 0xcd, 0x87, 0x48, 0x9d, + 0x95, 0x49, 0x83, 0x8c, 0xf4, 0xfd, 0x5a, 0x77, 0x78, 0xaf, 0xfa, 0xda, 0x4e, 0x6b, 0xab, 0x59, + 0xa3, 0x05, 0x99, 0x37, 0xea, 0xd0, 0x2d, 0xc4, 0x6c, 0xed, 0x59, 0xc7, 0xa6, 0xea, 0xf1, 0xb9, + 0xac, 0xb0, 0xf0, 0x60, 0x13, 0x37, 0xa0, 0x1e, 0x75, 0xf4, 0xaa, 0xed, 0xee, 0x74, 0xd6, 0x29, + 0x15, 0xc7, 0x8c, 0x10, 0xfb, 0xb3, 0x9b, 0x97, 0x9d, 0xb5, 0xe0, 0x4f, 0x6d, 0x61, 0x77, 0xa2, + 0xbb, 0xad, 0x2e, 0xa4, 0xf4, 0x44, 0x6c, 0xe7, 0x4d, 0xe2, 0x9f, 0x19, 0xb7, 0x01, 0xd9, 0xa4, + 0x6e, 0x74, 0x67, 0x0b, 0x9f, 0xb3, 0x61, 0x59, 0xa8, 0x20, 0xb6, 0x15, 0x1b, 0x8c, 0xc4, 0xc4, + 0xd7, 0xbb, 0x6a, 0x0f, 0x5c, 0xa5, 0xed, 0xe6, 0xbd, 0xdb, 0x40, 0x3e, 0xa6, 0x77, 0x85, 0x4f, + 0xdc, 0x68, 0xdb, 0x64, 0x30, 0xf5, 0xa3, 0x20, 0xfd, 0x37, 0x9a, 0x31, 0xac, 0x7d, 0x27, 0x7d, + 0x8c, 0xa9, 0x66, 0x40, 0x0b, 0x59, 0x27, 0xa6, 0x0e, 0x57, 0xce, 0xaf, 0xe5, 0xe5, 0xac, 0x11, + 0x64, 0xa6, 0x17, 0xe2, 0xbc, 0xe6, 0x9a, 0x6f, 0xd7, 0x77, 0x22, 0xeb, 0x84, 0xa6, 0xdd, 0xa2, + 0xe3, 0x63, 0xdb, 0xe1, 0x5f, 0xbc, 0x0f, 0xe6, 0xa5, 0x9e, 0x20, 0x9a, 0xf3, 0x99, 0x5e, 0x77, + 0xaf, 0x6f, 0x78, 0x88, 0x3c, 0x8a, 0x29, 0xac, 0x1d, 0x98, 0x6c, 0xaa, 0xe9, 0x6f, 0x48, 0xd6, + 0x31, 0xe5, 0xb9, 0x45, 0x39, 0xa7, 0x8d, 0xeb, 0xd7, 0xad, 0x3f, 0xa4, 0xdd, 0x17, 0x07, 0x57, + 0x2b, 0xd7, 0x5d, 0xe3, 0x92, 0xd9, 0xaf, 0xca, 0x0d, 0x49, 0xec, 0x32, 0xfc, 0xbd, 0x70, 0xf6, + 0xc9, 0xb1, 0xc9, 0xa5, 0x1a, 0xcb, 0x04, 0xd1, 0xa7, 0xa6, 0xd5, 0x23, 0xc2, 0x5c, 0x59, 0xaa, + 0x0f, 0xed, 0xda, 0xb5, 0x58, 0x58, 0x0f, 0x52, 0x16, 0xe1, 0xe5, 0x38, 0x9b, 0xa8, 0xe5, 0xe7, + 0xd3, 0x43, 0x34, 0xc8, 0x3a, 0x45, 0xc1, 0x51, 0x99, 0x55, 0xbb, 0x4c, 0x23, 0x08, 0x0b, 0x2e, + 0xe3, 0x81, 0xce, 0xc8, 0xed, 0x66, 0x35, 0x15, 0x88, 0x56, 0x84, 0xda, 0xde, 0xae, 0x64, 0xcb, + 0xa0, 0x7a, 0xa3, 0x70, 0x87, 0xa0, 0xe2, 0xb6, 0x5d, 0xd7, 0x10, 0x61, 0xd5, 0x81, 0x36, 0xd0, + 0xc5, 0x2e, 0xa4, 0xcd, 0x84, 0x62, 0xb5, 0xb4, 0x45, 0x9e, 0xf9, 0x5b, 0x7d, 0x81, 0xce, 0x5c, + 0xd5, 0x73, 0x2b, 0x76, 0xec, 0x5c, 0x63, 0x66, 0x20, 0x58, 0x99, 0x18, 0x33, 0xe5, 0xf7, 0xaa, + 0x29, 0x2f, 0x67, 0x1d, 0x88, 0x9c, 0x47, 0x28, 0x2e, 0x0c, 0x7d, 0xdd, 0xa5, 0x56, 0x62, 0xc6, + 0x30, 0x79, 0xc3, 0x5a, 0x69, 0xb8, 0xaf, 0xac, 0x01, 0xf5, 0x0c, 0xd6, 0x7e, 0x7b, 0xe2, 0xb1, + 0xba, 0xcd, 0x9c, 0xaa, 0xea, 0x4a, 0x74, 0xca, 0x9a, 0xf1, 0x98, 0x5d, 0x3a, 0x7b, 0xc9, 0x29, + 0x5a, 0xe7, 0xed, 0x6a, 0xa2, 0xd2, 0xef, 0x5f, 0x99, 0xd2, 0x5a, 0x71, 0x46, 0x3f, 0x8e, 0xd9, + 0x15, 0x41, 0xab, 0x35, 0xd2, 0x75, 0xdf, 0x45, 0x5f, 0x48, 0xc6, 0x62, 0x97, 0x66, 0x12, 0x58, + 0x2b, 0x23, 0x53, 0x4f, 0x51, 0xc7, 0x1f, 0xb8, 0xb1, 0x99, 0x60, 0xbc, 0xaa, 0x75, 0xd9, 0xa4, + 0x45, 0xe5, 0x79, 0x6d, 0x4c, 0x2b, 0x03, 0x81, 0x69, 0x19, 0x2b, 0xd4, 0xe5, 0x31, 0xe2, 0xc0, + 0x9e, 0x5e, 0x60, 0x8d, 0xf9, 0xbd, 0x6e, 0xd5, 0xd9, 0x87, 0xa2, 0x97, 0x87, 0xd3, 0xca, 0x8c, + 0x74, 0x1b, 0xfa, 0x4a, 0x7c, 0x35, 0xd5, 0x2c, 0xe0, 0x82, 0xcc, 0xa6, 0x8e, 0x35, 0x7f, 0x96, + 0x14, 0x75, 0xac, 0x5f, 0x28, 0xe8, 0x4e, 0xff, 0x52, 0x5d, 0xf5, 0xb1, 0x7c, 0xde, 0xdd, 0xc3, + 0x48, 0x83, 0x1d, 0xea, 0xba, 0x7f, 0x7b, 0xd6, 0xde, 0xf7, 0xc3, 0x57, 0xae, 0x7f, 0x64, 0xe0, + 0x4c, 0xfe, 0x67, 0xa8, 0xfb, 0xf6, 0xa9, 0x68, 0xf3, 0x6f, 0x6a, 0x83, 0x63, 0x9f, 0x61, 0xf3, + 0x39, 0xf8, 0x90, 0xf2, 0x27, 0x03, 0x41, 0x94, 0xc9, 0xd8, 0x6f, 0x89, 0x99, 0xf8, 0xac, 0x05, + 0x00, 0xef, 0xa8, 0x99, 0xda, 0xb5, 0xd2, 0x3d, 0xe9, 0x2c, 0x9b, 0x06, 0xd4, 0xf5, 0xe2, 0x78, + 0x3b, 0xf8, 0xb7, 0x9d, 0x4d, 0x0b, 0x08, 0xe8, 0xcd, 0x1c, 0xad, 0xa8, 0xc6, 0xd2, 0xc8, 0xba, + 0xfb, 0xdb, 0x54, 0x06, 0x8a, 0x76, 0xc6, 0xe5, 0xa5, 0xee, 0x22, 0x6e, 0x24, 0x3a, 0x78, 0xc5, + 0x73, 0x6f, 0xbc, 0x55, 0x19, 0xd4, 0xc6, 0x57, 0x4c, 0xcc, 0x77, 0x9b, 0xe2, 0x50, 0x17, 0xe4, + 0x91, 0xb7, 0xeb, 0xcc, 0xf9, 0x47, 0x7d, 0x3a, 0xd8, 0x53, 0x7a, 0x91, 0x1e, 0x87, 0x26, 0xf1, + 0x5d, 0xd4, 0xaa, 0x1b, 0x5f, 0xed, 0xe1, 0xbd, 0x8b, 0x6f, 0x40, 0x7d, 0x00, 0x4e, 0x87, 0x1d, + 0x09, 0x9e, 0xc4, 0xe7, 0xaa, 0xac, 0x5c, 0x92, 0xf2, 0x74, 0x49, 0x4e, 0xc5, 0xc0, 0xde, 0x39, + 0xaf, 0x32, 0x73, 0x89, 0xe6, 0xf0, 0x55, 0x76, 0x0e, 0x9b, 0x1c, 0x6e, 0xc6, 0x6b, 0x0e, 0xe4, + 0xd7, 0x18, 0xce, 0x75, 0x7c, 0x7f, 0x1c, 0xfe, 0x68, 0x1a, 0xe9, 0x6f, 0xd8, 0xb6, 0xba, 0xcc, + 0x10, 0xa0, 0x73, 0x55, 0x4b, 0x40, 0x18, 0xaf, 0xa7, 0xc3, 0xd8, 0x5b, 0x50, 0x1a, 0xf4, 0x87, + 0x6e, 0xd7, 0xcc, 0x4f, 0x84, 0xd5, 0xda, 0xe4, 0x9b, 0x0f, 0xef, 0x05, 0xa6, 0x3e, 0x2b, 0x8e, + 0x6e, 0x8a, 0x2c, 0x2d, 0xd3, 0xeb, 0x69, 0x58, 0x7d, 0x9f, 0xdf, 0x5c, 0xc0, 0x27, 0xe0, 0xdd, + 0x0f, 0xef, 0x1c, 0x58, 0x96, 0x46, 0x3b, 0x67, 0x6f, 0xf7, 0x36, 0x02, 0x1b, 0x60, 0x66, 0xf0, + 0xd6, 0xfa, 0xcc, 0x8a, 0xb0, 0x8c, 0x93, 0xf9, 0xe7, 0x0e, 0x13, 0xeb, 0xb3, 0xca, 0xaf, 0x93, + 0x9d, 0x2a, 0x7c, 0x7a, 0xc1, 0x87, 0x3d, 0x9d, 0xab, 0x49, 0xbc, 0xbe, 0x62, 0x0d, 0x31, 0x8b, + 0xc0, 0x6f, 0x8e, 0x4b, 0xaa, 0x09, 0x8b, 0xda, 0xba, 0x00, 0xa8, 0xbe, 0xf9, 0xfa, 0x40, 0x41, + 0xb8, 0x7e, 0x77, 0x45, 0x4e, 0xf2, 0x6c, 0x4d, 0x95, 0x1d, 0xd6, 0x82, 0x4c, 0x54, 0xc7, 0x40, + 0x29, 0xe1, 0x77, 0x8e, 0x85, 0xc1, 0xdb, 0xcb, 0x4d, 0x5f, 0x79, 0xba, 0xfc, 0xfc, 0xa9, 0x2a, + 0x55, 0x4f, 0xb3, 0x89, 0x59, 0x95, 0xb1, 0x15, 0xb7, 0x50, 0xac, 0x20, 0xf2, 0xa3, 0x71, 0xdd, + 0x9e, 0xb8, 0x24, 0xc4, 0xe2, 0x23, 0x85, 0xc4, 0x59, 0x88, 0xb7, 0x6e, 0x1d, 0xab, 0x8d, 0xc6, + 0xf6, 0xae, 0xe4, 0xeb, 0x87, 0x1e, 0x39, 0x98, 0x73, 0xc6, 0xa7, 0xd7, 0x13, 0xa0, 0xb8, 0x08, + 0x2c, 0x6d, 0x97, 0x43, 0x8d, 0x17, 0x4f, 0xad, 0x0d, 0xf3, 0xbc, 0x60, 0x0d, 0x56, 0xac, 0x5f, + 0xf6, 0x26, 0x30, 0x79, 0xf6, 0x69, 0xbc, 0xdb, 0x7d, 0x70, 0x62, 0x86, 0x55, 0x61, 0x48, 0x3b, + 0x5c, 0xf7, 0x90, 0xb7, 0x1c, 0xc8, 0x33, 0x0f, 0x3e, 0x7f, 0xf8, 0xec, 0xd5, 0x2f, 0x95, 0x06, + 0x3d, 0xb3, 0x58, 0x8b, 0xf6, 0xb0, 0x90, 0xa1, 0x61, 0x3b, 0x29, 0x2d, 0xf3, 0x7d, 0x81, 0x9c, + 0xb6, 0x13, 0xd7, 0x4d, 0x77, 0x1b, 0x90, 0xbb, 0x2e, 0xac, 0x35, 0x75, 0x46, 0x2f, 0x5e, 0x5f, + 0xd2, 0x60, 0xa4, 0xbe, 0x7a, 0xd7, 0xd6, 0xe4, 0x27, 0x2e, 0x65, 0x29, 0x4c, 0xb5, 0x53, 0x98, + 0x2c, 0xc2, 0xfa, 0x90, 0x9b, 0xf6, 0xe7, 0x7d, 0x72, 0xad, 0x05, 0x07, 0x31, 0x1f, 0xce, 0x5e, + 0x35, 0x2e, 0x24, 0x0e, 0x22, 0xbe, 0x9e, 0x98, 0x98, 0x43, 0xbc, 0xa0, 0x96, 0x5b, 0xbb, 0xf4, + 0x92, 0xfd, 0xa9, 0x97, 0x2a, 0x25, 0x5d, 0x85, 0xbf, 0xf1, 0xee, 0xef, 0x6e, 0x40, 0x3d, 0xce, + 0xf9, 0xd6, 0x85, 0xe2, 0x58, 0xd7, 0x1b, 0x85, 0xed, 0xc3, 0x64, 0x73, 0xc3, 0xa1, 0x81, 0xb5, + 0xd5, 0x5a, 0x81, 0x03, 0xfb, 0x65, 0x46, 0x76, 0xf1, 0x4c, 0xd8, 0x01, 0x07, 0xe3, 0x8f, 0x8d, + 0x96, 0x6f, 0xb6, 0x3c, 0x68, 0xb0, 0x50, 0xbd, 0x82, 0xcb, 0xe2, 0x1c, 0x3f, 0xb1, 0x05, 0x9d, + 0x3b, 0x77, 0xba, 0x05, 0xb9, 0xab, 0xe4, 0x93, 0xad, 0xb3, 0x21, 0x2d, 0x6b, 0x41, 0xf1, 0x98, + 0xd4, 0x67, 0x87, 0xcf, 0xc4, 0x31, 0x50, 0x2b, 0x05, 0xe8, 0x4f, 0x83, 0x87, 0x53, 0x69, 0x7e, + 0xcf, 0x5a, 0x8f, 0x97, 0x19, 0xee, 0x3b, 0x6a, 0xc6, 0x68, 0xde, 0x45, 0xac, 0xdf, 0xb4, 0xb0, + 0x26, 0xeb, 0xda, 0xe7, 0xa7, 0x44, 0x8d, 0x8b, 0xa9, 0xf5, 0x6b, 0x13, 0x9f, 0x1c, 0x26, 0xfb, + 0x95, 0x9c, 0x22, 0x3c, 0x6b, 0x69, 0x98, 0x67, 0xba, 0x05, 0x9f, 0x56, 0xb0, 0x64, 0x19, 0x4a, + 0xe7, 0xa4, 0xbd, 0x21, 0xa2, 0xbb, 0x00, 0x5e, 0x5a, 0x12, 0x1a, 0x6b, 0x44, 0x1e, 0xeb, 0xb3, + 0x2f, 0xa3, 0xf6, 0xfe, 0xc1, 0x86, 0xcd, 0x38, 0xa7, 0xe0, 0xbe, 0xe9, 0x18, 0xbc, 0xe1, 0x76, + 0xa2, 0xdd, 0xa9, 0x8d, 0x99, 0x53, 0xc7, 0xeb, 0x1f, 0x9a, 0x78, 0x72, 0xf2, 0xa7, 0xe6, 0x96, + 0x22, 0xeb, 0xf7, 0xbb, 0x5e, 0xb9, 0x95, 0x3f, 0xac, 0xec, 0xf0, 0xd3, 0x5e, 0x54, 0x3c, 0xd0, + 0xf1, 0xa0, 0xf9, 0x88, 0x53, 0x58, 0x3e, 0x35, 0x33, 0x3c, 0xf5, 0xcc, 0xca, 0x4f, 0x35, 0x76, + 0x82, 0x46, 0x7e, 0x1e, 0xd9, 0x62, 0xbc, 0x8a, 0x6e, 0xdc, 0xab, 0xea, 0xf7, 0xfa, 0x13, 0x2a, + 0xf7, 0xa7, 0x9e, 0xef, 0xc8, 0x7c, 0xd9, 0x84, 0x29, 0x28, 0xd1, 0x67, 0x92, 0x57, 0x69, 0x77, + 0x8f, 0x09, 0x2e, 0x3d, 0x07, 0x9f, 0x85, 0xd8, 0x61, 0xde, 0x34, 0xa0, 0xdb, 0xf3, 0x66, 0xe7, + 0xab, 0x1d, 0xdf, 0x02, 0x5d, 0x56, 0x3f, 0x89, 0x3c, 0x34, 0xf0, 0xfa, 0xbc, 0xc9, 0xf6, 0x7d, + 0x13, 0x36, 0xe8, 0x8d, 0x7d, 0x5a, 0x67, 0xcd, 0xd0, 0x61, 0x7c, 0x3d, 0xc1, 0x30, 0x7e, 0x88, + 0xda, 0xd4, 0x1d, 0xf2, 0xe6, 0xa8, 0xba, 0xad, 0x81, 0xea, 0x95, 0x0b, 0x1a, 0x89, 0x86, 0xad, + 0xc9, 0x5d, 0x7a, 0x13, 0x07, 0x97, 0xf2, 0xdd, 0x41, 0x3a, 0x14, 0x9c, 0x28, 0x41, 0x1f, 0x74, + 0x9a, 0x65, 0x61, 0xfa, 0x38, 0x1c, 0x7d, 0xe3, 0x99, 0xda, 0xd3, 0x93, 0xf5, 0xa1, 0xb5, 0x67, + 0x99, 0x3c, 0xe7, 0xb9, 0x93, 0x04, 0x68, 0x6e, 0xc9, 0xcc, 0x4f, 0xb5, 0x2d, 0xf7, 0x30, 0xea, + 0x1e, 0x71, 0x1d, 0xbe, 0xc5, 0x09, 0xff, 0x48, 0x09, 0x70, 0xdd, 0xd6, 0xdf, 0xd8, 0x6e, 0xf4, + 0x12, 0xd7, 0x4b, 0xdb, 0x67, 0xb1, 0xc9, 0xcd, 0x9e, 0xfb, 0xd4, 0x53, 0x8f, 0xcf, 0xbb, 0x3f, + 0x08, 0x1b, 0x38, 0x7e, 0x29, 0xf7, 0xe4, 0xc5, 0xfd, 0x11, 0xe4, 0x5b, 0xf6, 0xde, 0x8b, 0x83, + 0xd9, 0x9b, 0xdd, 0xb7, 0xe6, 0x59, 0x0b, 0x2e, 0xdb, 0x98, 0x58, 0x86, 0x2d, 0x69, 0xbf, 0xf2, + 0xec, 0xeb, 0x45, 0x77, 0xd3, 0x54, 0x67, 0xf7, 0x20, 0x01, 0x3a, 0xf6, 0x1d, 0x76, 0x3c, 0xd9, + 0xa8, 0x53, 0x93, 0xd5, 0xac, 0x5b, 0xed, 0x1c, 0xd7, 0xd5, 0x3c, 0x48, 0x0e, 0x28, 0x0c, 0x00, + 0xc8, 0xf7, 0x8c, 0x96, 0x2c, 0x74, 0xfd, 0x4b, 0xeb, 0x51, 0x67, 0xf3, 0xeb, 0x75, 0x69, 0x63, + 0xc6, 0xaf, 0x02, 0xe0, 0xad, 0x38, 0x44, 0xb7, 0x33, 0xae, 0x74, 0x3e, 0xfa, 0x6c, 0x38, 0x33, + 0x69, 0xe5, 0x89, 0x20, 0xbe, 0x63, 0x39, 0x7a, 0x79, 0xd0, 0xf9, 0xdc, 0xbe, 0x92, 0x2c, 0x5e, + 0xf4, 0x69, 0xe3, 0x30, 0x16, 0x16, 0xb6, 0x34, 0xeb, 0xee, 0xb8, 0x45, 0xaa, 0xb3, 0xbc, 0x1b, + 0xee, 0x6a, 0xec, 0x66, 0x9d, 0x6c, 0xcd, 0x52, 0x0d, 0x64, 0xdd, 0x9a, 0x0f, 0x90, 0x2f, 0x3a, + 0x54, 0x27, 0x1c, 0xc5, 0xcf, 0xdd, 0xd7, 0x88, 0x67, 0x85, 0x3f, 0xfa, 0xd7, 0x9b, 0x9c, 0x74, + 0x7c, 0xa6, 0x17, 0xd8, 0x9e, 0x93, 0x4a, 0x13, 0xe2, 0x79, 0xc6, 0xe5, 0x67, 0x7b, 0x07, 0x66, + 0xf8, 0x74, 0x05, 0x16, 0x4f, 0x68, 0xb6, 0x0f, 0x75, 0x11, 0x64, 0xaa, 0x4e, 0x55, 0x67, 0xa4, + 0xdf, 0x99, 0x58, 0x80, 0xf8, 0xb3, 0xf8, 0xf5, 0xe1, 0x4b, 0x48, 0x2f, 0x4b, 0x03, 0xd5, 0x5e, + 0xfa, 0x98, 0x50, 0xc4, 0x73, 0xf5, 0xeb, 0x1b, 0xf7, 0xb6, 0x9b, 0xc1, 0x79, 0x35, 0x8e, 0x9f, + 0x0d, 0xb9, 0xe3, 0x5b, 0x0c, 0xb6, 0x3f, 0xec, 0x01, 0x82, 0xc9, 0x5f, 0x13, 0x49, 0x5b, 0x89, + 0x35, 0x35, 0x75, 0xee, 0x0b, 0xcf, 0xa8, 0x94, 0xf5, 0x54, 0xbd, 0x8d, 0x40, 0xa2, 0xf4, 0xf9, + 0x3c, 0x56, 0x6b, 0x7a, 0x7a, 0x86, 0x51, 0x1a, 0x7e, 0x09, 0xc1, 0x6e, 0x30, 0xee, 0xb4, 0xaf, + 0xf5, 0x36, 0xf2, 0xcd, 0xc3, 0x61, 0xee, 0xea, 0xef, 0xb1, 0x0d, 0xec, 0xe4, 0x66, 0xfd, 0x60, + 0xb2, 0x4e, 0xe0, 0x72, 0xc7, 0xee, 0xa2, 0x3c, 0xed, 0x34, 0x5b, 0x26, 0xba, 0x24, 0xbd, 0x2e, + 0x73, 0x25, 0x00, 0xbf, 0xde, 0x83, 0x98, 0xeb, 0x74, 0x47, 0xe3, 0x97, 0x55, 0xfc, 0xb5, 0x82, + 0x00, 0x1d, 0x93, 0xfa, 0x10, 0xed, 0x9c, 0x5b, 0xfd, 0x9d, 0x37, 0xda, 0xea, 0x48, 0xc9, 0x0f, + 0x75, 0xdc, 0x04, 0xdd, 0xc1, 0x39, 0xe5, 0x09, 0x1f, 0x19, 0xe9, 0xd9, 0xaf, 0x5a, 0xb6, 0x6e, + 0x78, 0x95, 0x38, 0xf1, 0x62, 0xc4, 0x11, 0xf0, 0x1e, 0xae, 0xa7, 0x4c, 0x3c, 0xe0, 0x7c, 0xa7, + 0xaf, 0xe1, 0xaf, 0x46, 0x2d, 0x72, 0x18, 0x43, 0xbb, 0xf8, 0xd6, 0xbd, 0x6d, 0x1a, 0xdb, 0x1c, + 0x9f, 0xf4, 0x78, 0xc3, 0x7a, 0x43, 0x1b, 0x2b, 0x97, 0xd4, 0x2e, 0x06, 0x3a, 0x3f, 0x16, 0x7a, + 0x36, 0xac, 0x7d, 0xae, 0x1e, 0x7c, 0x5b, 0xb5, 0x35, 0x9d, 0x0d, 0x8f, 0xb5, 0x6d, 0x87, 0x3f, + 0x8f, 0xf0, 0x08, 0x00, 0xef, 0xea, 0xf9, 0x37, 0x78, 0xcb, 0xe9, 0xc7, 0x2b, 0x13, 0xee, 0xb7, + 0xa0, 0xde, 0xc5, 0x55, 0xa8, 0x97, 0x81, 0x92, 0x13, 0x7d, 0xef, 0x5d, 0x9f, 0xee, 0xd3, 0x3a, + 0xfb, 0x56, 0x83, 0xf2, 0x87, 0x2d, 0x97, 0x75, 0x67, 0x08, 0x32, 0xf7, 0xde, 0x9b, 0x3d, 0x97, + 0x9c, 0xb7, 0x20, 0xf6, 0xdb, 0xc9, 0x8d, 0x3c, 0xaa, 0xc7, 0xd7, 0x31, 0x91, 0x9a, 0x0b, 0x4e, + 0x34, 0x1c, 0x0a, 0x4d, 0xb0, 0x1c, 0x13, 0x7e, 0x7b, 0xa2, 0x29, 0x50, 0x75, 0x7b, 0x4d, 0x92, + 0xbb, 0xaa, 0xe0, 0x03, 0xec, 0xc3, 0x25, 0xab, 0xad, 0x49, 0x63, 0x8b, 0x28, 0x6e, 0x0b, 0x1f, + 0x66, 0xf6, 0xbf, 0xfc, 0x62, 0x2c, 0x68, 0xfd, 0x7b, 0x43, 0x89, 0x5f, 0xfe, 0xf4, 0x79, 0xdd, + 0xe7, 0x8b, 0x35, 0x3a, 0x34, 0x5a, 0xf4, 0xb8, 0xed, 0x1b, 0xe0, 0xe9, 0x3b, 0x03, 0x04, 0xe8, + 0x63, 0x37, 0x27, 0xed, 0x36, 0x5a, 0x6d, 0xbd, 0x46, 0x00, 0xce, 0xb6, 0xdf, 0x4c, 0x1e, 0x38, + 0xcd, 0x7f, 0xaf, 0xf9, 0x44, 0xa5, 0xef, 0xd6, 0x83, 0x8e, 0x7e, 0x9d, 0x8c, 0x0f, 0x00, 0xad, + 0x1e, 0xd5, 0x67, 0x1d, 0xff, 0x1a, 0xbb, 0xe5, 0x5f, 0x5a, 0xb7, 0xfc, 0x79, 0x69, 0xbe, 0x55, + 0xc4, 0x49, 0x77, 0xa8, 0x5a, 0xa7, 0x0d, 0x5f, 0x54, 0x47, 0x7b, 0x2f, 0xb5, 0xc4, 0x04, 0x38, + 0xd8, 0x36, 0x84, 0x00, 0x76, 0xd7, 0x1c, 0x62, 0x59, 0xe6, 0x0f, 0xa2, 0x5d, 0xae, 0xfc, 0x12, + 0x2a, 0x18, 0xbf, 0x9f, 0xb0, 0xda, 0x26, 0x78, 0x22, 0xbe, 0xc4, 0x29, 0xe2, 0x54, 0xc1, 0x69, + 0xf3, 0xbc, 0x20, 0xf6, 0x24, 0x16, 0xaf, 0xcd, 0x7a, 0xe7, 0xb3, 0xe2, 0xd6, 0xc6, 0x26, 0x01, + 0xa8, 0xe1, 0xc6, 0x65, 0xb3, 0x42, 0xad, 0xc9, 0x29, 0x9f, 0x27, 0x69, 0xd7, 0xf8, 0x94, 0x34, + 0xc0, 0xad, 0x8f, 0x7d, 0x4c, 0x60, 0x5c, 0xf4, 0x6f, 0xd7, 0x0d, 0x89, 0x2a, 0xcd, 0xe1, 0x24, + 0xec, 0xf8, 0x53, 0x43, 0x5d, 0x10, 0x7b, 0xfd, 0xc5, 0xde, 0x3e, 0x07, 0xe3, 0xf4, 0xd3, 0xb3, + 0xfe, 0x70, 0xf4, 0x3c, 0x18, 0x37, 0x8f, 0x00, 0xa0, 0x2e, 0x64, 0xac, 0x3a, 0x72, 0x8f, 0xac, + 0x3a, 0xe5, 0x8e, 0x31, 0xdc, 0xb8, 0xc8, 0xec, 0xc3, 0x0c, 0xdc, 0x5f, 0x2f, 0x7f, 0x49, 0x27, + 0x4e, 0xc5, 0xc7, 0x37, 0xa1, 0xfe, 0xc0, 0xaf, 0xcb, 0x69, 0x73, 0x45, 0xdd, 0x58, 0xe2, 0xb1, + 0x0c, 0x68, 0xdd, 0xba, 0xae, 0xab, 0xed, 0x68, 0x8d, 0x5f, 0x25, 0x11, 0xaf, 0xce, 0xc9, 0x83, + 0x2d, 0xd7, 0xfc, 0x3a, 0xdd, 0x83, 0xdf, 0x3c, 0x61, 0xd7, 0x87, 0x68, 0xc6, 0xc5, 0xf9, 0xc5, + 0x37, 0x3c, 0xec, 0xfe, 0xac, 0x0c, 0x60, 0x3c, 0xde, 0x06, 0x4b, 0x48, 0xda, 0xed, 0x1f, 0xb8, + 0x0c, 0xe8, 0x5c, 0xf2, 0x0c, 0x1a, 0x6d, 0x0b, 0x7e, 0x55, 0x4e, 0x46, 0xfe, 0x0c, 0xce, 0x83, + 0x19, 0x1b, 0x4e, 0x63, 0x6b, 0xae, 0xb9, 0x90, 0xcc, 0xef, 0x79, 0xfd, 0x59, 0xc2, 0x64, 0xd0, + 0xf4, 0xfc, 0xa9, 0xc7, 0xf4, 0x2f, 0xf1, 0x89, 0xf5, 0x87, 0xfe, 0xa9, 0xc1, 0xbf, 0x13, 0x52, + 0x8c, 0xe5, 0xb5, 0xce, 0x42, 0xe0, 0x43, 0xa7, 0x59, 0xbc, 0x4f, 0x3e, 0x5b, 0x3c, 0xa1, 0xe6, + 0xdb, 0x1e, 0x3d, 0x03, 0x72, 0xaf, 0xca, 0x87, 0x09, 0x27, 0xb4, 0xea, 0x3e, 0xaf, 0xaa, 0xb3, + 0x5a, 0x61, 0x97, 0xb1, 0x5c, 0x70, 0xb9, 0xde, 0xe0, 0xf8, 0x53, 0xd3, 0x7f, 0x55, 0x12, 0x49, + 0xaa, 0xfd, 0x54, 0x23, 0xde, 0xc1, 0xad, 0x5b, 0xfb, 0x93, 0x0a, 0x41, 0xed, 0x5b, 0xf1, 0x40, + 0x70, 0x43, 0x63, 0x3e, 0x70, 0x65, 0x36, 0xe6, 0x0f, 0x7c, 0xee, 0xcd, 0x8c, 0xea, 0x83, 0x0d, + 0xa8, 0xa3, 0xcb, 0x1b, 0x92, 0xbe, 0xdc, 0x26, 0xff, 0x63, 0xca, 0xfb, 0x9b, 0x63, 0x5f, 0x1e, + 0xfd, 0x3b, 0xd1, 0xee, 0x74, 0x58, 0x54, 0x22, 0x4f, 0xe7, 0xe4, 0xb8, 0x71, 0xfd, 0xee, 0x17, + 0xcf, 0x6a, 0xc4, 0xef, 0xe5, 0xa4, 0x64, 0x11, 0xd6, 0xed, 0xce, 0xa6, 0x6f, 0xb3, 0x09, 0x70, + 0x8e, 0x15, 0x38, 0xb5, 0xa4, 0x7e, 0xee, 0xf0, 0x5d, 0x61, 0x7d, 0x27, 0x3f, 0xcf, 0xe4, 0xdb, + 0xc9, 0x97, 0x8c, 0x62, 0xc6, 0xe6, 0x7e, 0x54, 0x85, 0x9e, 0x2f, 0x79, 0x9a, 0x7a, 0x2f, 0xe5, + 0xb3, 0x07, 0x6f, 0x6d, 0x7a, 0xad, 0xc5, 0x89, 0xd7, 0xde, 0x40, 0xe7, 0xb6, 0x85, 0x19, 0x99, + 0x39, 0xad, 0xe7, 0xb7, 0x5d, 0xbd, 0x85, 0xb0, 0x33, 0x2c, 0xcb, 0x46, 0x5e, 0x52, 0x3f, 0x3f, + 0x37, 0xef, 0x58, 0xd4, 0x73, 0xde, 0x63, 0x1b, 0xa4, 0x4f, 0xc6, 0x72, 0x64, 0xb0, 0x9a, 0xda, + 0xb9, 0x83, 0xc1, 0xe5, 0xf1, 0x11, 0x78, 0xbf, 0x9c, 0xb6, 0xd5, 0xde, 0xfd, 0x66, 0xc1, 0x6a, + 0xf5, 0x8d, 0xa9, 0xd3, 0x0f, 0x1a, 0x86, 0xed, 0xdb, 0xbf, 0xf4, 0x77, 0x52, 0xea, 0x2d, 0x93, + 0x12, 0xd7, 0x11, 0x3f, 0xe1, 0x05, 0xb3, 0x56, 0xbf, 0xdf, 0x88, 0xba, 0xc7, 0x1f, 0x37, 0x7f, + 0xed, 0x64, 0x1f, 0x28, 0x4f, 0xa5, 0x2f, 0x61, 0xb1, 0x57, 0xe9, 0xbc, 0x08, 0x1e, 0x94, 0xe5, + 0x72, 0x3e, 0x93, 0x42, 0xf1, 0xc3, 0x07, 0x06, 0x11, 0x02, 0x90, 0x81, 0x14, 0x26, 0x95, 0x14, + 0x2f, 0x4c, 0x03, 0xca, 0xa1, 0x51, 0x23, 0x85, 0xde, 0x1a, 0xd2, 0x8b, 0x49, 0x4d, 0xa4, 0x30, + 0x11, 0x70, 0xdc, 0xa8, 0x3e, 0x08, 0x38, 0x02, 0x1e, 0x04, 0xfa, 0x24, 0xc8, 0x68, 0x7a, 0x3c, + 0xf4, 0xae, 0x83, 0x48, 0x3a, 0x8d, 0x0d, 0x3a, 0x0d, 0x2c, 0x24, 0x94, 0x77, 0x02, 0x7a, 0xb3, + 0x32, 0x9d, 0xc3, 0x8c, 0xa4, 0x40, 0xa7, 0x99, 0x48, 0xa9, 0x9e, 0x19, 0xa4, 0x18, 0xb0, 0x50, + 0x12, 0xfb, 0x85, 0x12, 0xbc, 0x45, 0x41, 0x2f, 0xbd, 0x64, 0x88, 0x5e, 0x7a, 0x69, 0x0b, 0x35, + 0x6b, 0x03, 0x7e, 0x10, 0x70, 0x4f, 0x3a, 0x23, 0x99, 0x09, 0xc5, 0x5d, 0x90, 0x0e, 0x58, 0x7b, + 0x17, 0x1b, 0xf0, 0xcf, 0x6c, 0xe4, 0x62, 0xa2, 0x3f, 0x02, 0x8e, 0x5f, 0xb4, 0x08, 0x19, 0xe0, + 0xeb, 0xed, 0x13, 0x14, 0x88, 0x0c, 0x20, 0x04, 0x12, 0x02, 0x82, 0x09, 0x5e, 0x00, 0x32, 0x29, + 0x29, 0xc9, 0x96, 0xc6, 0x65, 0xd8, 0x46, 0xd2, 0x13, 0x10, 0x70, 0x28, 0x65, 0xe7, 0x1c, 0x33, + 0xd9, 0x46, 0xd0, 0x91, 0x56, 0x60, 0x43, 0x58, 0x67, 0xa8, 0x21, 0x47, 0xe1, 0x88, 0x58, 0x10, + 0x78, 0x00, 0x92, 0x22, 0x01, 0xda, 0x35, 0x17, 0x25, 0x8c, 0xdf, 0x01, 0x48, 0x5f, 0x5a, 0xa4, + 0xad, 0x82, 0xbe, 0x1d, 0xb0, 0xa2, 0xbe, 0x11, 0xf0, 0x40, 0x7f, 0x2f, 0xa2, 0xcd, 0x22, 0x6a, + 0x24, 0x85, 0xc6, 0xa2, 0xd8, 0xf8, 0x46, 0x51, 0x68, 0x6c, 0x6a, 0x34, 0x15, 0x74, 0xf9, 0x90, + 0xf3, 0x02, 0xbd, 0x6c, 0x66, 0xda, 0x78, 0xc6, 0x93, 0x38, 0x2c, 0x0a, 0x54, 0x51, 0xea, 0xa6, + 0xa1, 0xf7, 0x9f, 0x8a, 0xde, 0xc5, 0x0a, 0xba, 0x78, 0x14, 0x2e, 0x94, 0x55, 0x34, 0x5e, 0x42, + 0x3f, 0x88, 0x22, 0x48, 0xf0, 0x1a, 0x16, 0x52, 0x3a, 0xb1, 0x29, 0x48, 0xcf, 0x04, 0x06, 0x9d, + 0x06, 0x65, 0xd7, 0x88, 0x66, 0xd2, 0x13, 0x90, 0xb1, 0x6c, 0x36, 0x83, 0xe5, 0x6a, 0x67, 0x47, + 0xfe, 0x9f, 0xd6, 0xae, 0xff, 0xa7, 0x71, 0x1d, 0x89, 0xff, 0xfc, 0x56, 0x7a, 0xff, 0x83, 0x2f, + 0xe8, 0x5d, 0x8b, 0xd4, 0x2f, 0x29, 0xa5, 0x2c, 0x57, 0xa0, 0x4f, 0x40, 0xa9, 0xb4, 0x77, 0xec, + 0x2e, 0x5a, 0xd8, 0xe3, 0x4e, 0xb7, 0x27, 0x94, 0x36, 0x29, 0xcd, 0xdb, 0xb4, 0xa9, 0x92, 0x14, + 0xe8, 0x21, 0xfe, 0xf7, 0xfb, 0xcc, 0xd8, 0x4e, 0x9c, 0x34, 0xa5, 0xd0, 0x3b, 0x56, 0xab, 0xa4, + 0xfe, 0x32, 0x33, 0x1e, 0xcf, 0x8c, 0x67, 0x6c, 0xc7, 0xf6, 0xa2, 0x99, 0xef, 0x37, 0xee, 0xfd, + 0x64, 0xb2, 0x18, 0x36, 0xfc, 0xb0, 0x29, 0x2b, 0xfd, 0x11, 0x37, 0x45, 0x20, 0x89, 0x72, 0x05, + 0x85, 0xb9, 0x91, 0xf8, 0xfc, 0xe9, 0x46, 0x27, 0x35, 0x04, 0x31, 0xb5, 0xf7, 0xeb, 0x87, 0xe3, + 0x3f, 0xf5, 0xbf, 0x9e, 0xdf, 0xfc, 0xf3, 0xea, 0x42, 0xf6, 0xd2, 0xd5, 0xf7, 0xb3, 0xcb, 0x4f, + 0xe7, 0xe2, 0x87, 0x55, 0x6f, 0x36, 0x6f, 0xdb, 0xe7, 0xcd, 0x66, 0xff, 0xa6, 0x2f, 0x73, 0xf6, + 0x1b, 0x76, 0x4b, 0xdc, 0xd0, 0x72, 0xa7, 0x4f, 0xb2, 0xe1, 0x04, 0xcd, 0xe6, 0xc5, 0x97, 0x1f, + 0x16, 0x8a, 0x12, 0x21, 0xa0, 0x83, 0xf8, 0xfd, 0xd8, 0x6e, 0x84, 0xd1, 0x7d, 0xf3, 0xe6, 0x5b, + 0x93, 0x1a, 0xb4, 0xdf, 0x0c, 0xc2, 0x10, 0xb8, 0xdc, 0xc4, 0xfd, 0x61, 0x11, 0x2e, 0x4a, 0xe4, + 0xa7, 0xe7, 0xb8, 0xf4, 0xe4, 0x83, 0x7b, 0xf0, 0x22, 0xf0, 0x37, 0x0c, 0xdd, 0xe5, 0x33, 0x1d, + 0x70, 0x74, 0xcf, 0x73, 0xc1, 0x5d, 0xb1, 0x73, 0x71, 0x4a, 0xff, 0x8e, 0x04, 0xed, 0x75, 0xad, + 0x8f, 0x9d, 0xa9, 0x1f, 0x2c, 0xbb, 0xe2, 0x1a, 0x04, 0xd4, 0x63, 0x08, 0xeb, 0xf8, 0x48, 0xa8, + 0xcd, 0x4c, 0x5d, 0x61, 0xcf, 0x9f, 0x8e, 0xc4, 0xd4, 0x89, 0xee, 0xfd, 0x99, 0xfc, 0xf1, 0x22, + 0x61, 0x4e, 0x5a, 0x35, 0x31, 0xd9, 0xc3, 0xff, 0xb6, 0xfc, 0xec, 0x12, 0x40, 0x5b, 0x7d, 0xdb, + 0x3e, 0x6d, 0xeb, 0x02, 0xfe, 0xf4, 0xfe, 0x79, 0xc8, 0x37, 0x73, 0xe4, 0xea, 0x39, 0x69, 0x71, + 0xda, 0x9b, 0x7c, 0xa6, 0x69, 0x78, 0xe4, 0x49, 0xbf, 0x2e, 0x48, 0x0d, 0xdc, 0x23, 0x41, 0x6b, + 0x0b, 0x75, 0x97, 0x2e, 0xf6, 0x60, 0x65, 0xe9, 0x8a, 0x19, 0x3a, 0x27, 0x85, 0xd0, 0x9d, 0x84, + 0x50, 0x9d, 0xe7, 0x95, 0x42, 0xdc, 0x13, 0x34, 0x05, 0x48, 0x25, 0x65, 0xd9, 0x06, 0xb1, 0x03, + 0x65, 0x95, 0x0a, 0x00, 0x3e, 0xdd, 0x06, 0x99, 0x6f, 0x90, 0xc8, 0x71, 0x66, 0x7f, 0xff, 0x60, + 0xef, 0xe3, 0xb9, 0xc1, 0x80, 0x56, 0x87, 0xcb, 0x70, 0x4b, 0xea, 0x72, 0xcb, 0x74, 0x57, 0xb4, + 0xe7, 0x4f, 0x22, 0x0e, 0x03, 0xdf, 0x05, 0x40, 0xd4, 0x7e, 0xc9, 0x61, 0x03, 0x6f, 0x74, 0x23, + 0x1f, 0x27, 0x7e, 0xe2, 0xe9, 0x5c, 0xee, 0x86, 0x0c, 0xae, 0xc1, 0x94, 0xc6, 0x38, 0x0c, 0x13, + 0x90, 0xa9, 0xb0, 0xd0, 0x02, 0xa9, 0x68, 0xa5, 0x28, 0x62, 0x3f, 0x40, 0x7b, 0x4d, 0x92, 0x98, + 0x6c, 0xe6, 0x5b, 0x4c, 0x1f, 0x93, 0x8a, 0xc3, 0x79, 0x72, 0x24, 0xe4, 0x97, 0xdb, 0xc8, 0xb4, + 0x7f, 0x33, 0x18, 0x10, 0xfb, 0xd3, 0x39, 0x54, 0x21, 0xf0, 0x35, 0x66, 0x05, 0x5d, 0x61, 0x97, + 0xa5, 0x76, 0x58, 0xae, 0xd5, 0xb7, 0xdf, 0xa2, 0x6d, 0x33, 0x7c, 0xe6, 0xaf, 0x43, 0xdb, 0xc1, + 0xbb, 0x42, 0x6e, 0x07, 0x07, 0x4e, 0x9a, 0xb8, 0xeb, 0x0a, 0xd6, 0x56, 0x10, 0x14, 0x4a, 0x81, + 0x45, 0x82, 0x17, 0xa0, 0x13, 0x1e, 0x3c, 0xd4, 0x22, 0xe8, 0x7b, 0x46, 0xdb, 0x24, 0x6c, 0xf5, + 0xa8, 0x13, 0xd0, 0x67, 0xcd, 0x7d, 0x67, 0x91, 0x84, 0xc5, 0x62, 0xb4, 0x23, 0x2d, 0x9c, 0xc5, + 0x59, 0x8f, 0x25, 0xb4, 0x85, 0xae, 0x3e, 0xf2, 0x82, 0xa0, 0x9c, 0x24, 0x09, 0xac, 0x1e, 0x78, + 0xe3, 0x44, 0x41, 0xd4, 0x49, 0x91, 0x14, 0xa9, 0x57, 0xb0, 0xa0, 0x4f, 0xf8, 0x65, 0xad, 0x7c, + 0x28, 0x4e, 0xcb, 0x56, 0x13, 0x8a, 0xbc, 0xb4, 0x04, 0xbc, 0x69, 0xa6, 0xae, 0xf7, 0xe0, 0x54, + 0xf7, 0x3b, 0xae, 0x77, 0x5f, 0x13, 0x3b, 0x1f, 0xcf, 0xcf, 0xda, 0x83, 0x01, 0x5e, 0x4e, 0xfb, + 0x7d, 0x7b, 0x30, 0xd8, 0x4d, 0x3b, 0xe7, 0xc0, 0xce, 0x84, 0x09, 0x6c, 0x4a, 0xbb, 0x78, 0xa7, + 0x73, 0x76, 0x38, 0x18, 0x0c, 0x8c, 0x3e, 0xee, 0xac, 0xeb, 0x02, 0x25, 0x23, 0x72, 0xda, 0x5b, + 0x53, 0x38, 0x0c, 0x9f, 0xea, 0x72, 0x5e, 0x5f, 0x42, 0xa5, 0xff, 0x80, 0x20, 0x40, 0xd9, 0x72, + 0x43, 0xdb, 0xd7, 0x69, 0x13, 0xab, 0x5c, 0x69, 0x17, 0xbf, 0x8d, 0x03, 0xe7, 0x7d, 0xe6, 0x80, + 0x6c, 0xd8, 0xae, 0x12, 0x8c, 0x16, 0x11, 0x2b, 0xbb, 0xaa, 0x25, 0x45, 0xe4, 0xb8, 0xa9, 0x2d, + 0x15, 0x19, 0xad, 0x51, 0xe4, 0xcf, 0x13, 0xc1, 0x87, 0x24, 0x5b, 0x44, 0x51, 0xf3, 0x0f, 0xe7, + 0xc1, 0x91, 0xa9, 0x96, 0xa0, 0xd3, 0x5f, 0x2c, 0xd3, 0x6c, 0x5b, 0x3d, 0xd4, 0xe6, 0xcc, 0xde, + 0xa6, 0xca, 0x28, 0x40, 0x73, 0xd4, 0x5c, 0xfb, 0x88, 0x70, 0xa5, 0xeb, 0x4c, 0x31, 0x2d, 0x2f, + 0xde, 0xd1, 0xb8, 0x50, 0xdd, 0xfd, 0xf5, 0xc3, 0xb3, 0xe4, 0x15, 0x3a, 0xdc, 0xbd, 0xe3, 0xc2, + 0xd5, 0xdd, 0x23, 0x99, 0x14, 0x7b, 0x09, 0x5d, 0x69, 0x17, 0x3d, 0x38, 0x41, 0x35, 0xf1, 0xa7, + 0x5e, 0x74, 0x87, 0x51, 0x74, 0x54, 0x23, 0x7d, 0xa3, 0x22, 0x2f, 0x39, 0xa0, 0x59, 0x01, 0x03, + 0xa8, 0x3f, 0xae, 0xce, 0x47, 0xd3, 0xc6, 0x37, 0x18, 0x89, 0xbf, 0xab, 0x0b, 0xbc, 0xaa, 0x16, + 0x5f, 0xef, 0x6c, 0xed, 0xee, 0xca, 0x22, 0xaa, 0x24, 0xfd, 0x71, 0x86, 0x3c, 0x5c, 0x8a, 0x26, + 0x29, 0xc5, 0x89, 0xa0, 0xca, 0x97, 0x4e, 0x9c, 0xe8, 0xca, 0x77, 0x0f, 0xbc, 0x98, 0x7b, 0x94, + 0xd5, 0x61, 0x8a, 0xef, 0xa8, 0xed, 0xdb, 0x54, 0xa4, 0x55, 0x9b, 0xea, 0x9a, 0xb2, 0x9a, 0x0b, + 0x4a, 0x96, 0x68, 0x7b, 0xdd, 0x1b, 0x28, 0xb6, 0x7e, 0xb7, 0x36, 0x53, 0x57, 0x52, 0x88, 0x29, + 0xb1, 0x0b, 0x38, 0x37, 0x31, 0xd1, 0x9f, 0x8d, 0xd6, 0xf2, 0x11, 0x79, 0xef, 0xe0, 0xc8, 0xc6, + 0x46, 0x16, 0xc1, 0x65, 0x4d, 0x78, 0x29, 0x4a, 0x02, 0x5a, 0x72, 0xc7, 0x75, 0xaa, 0x72, 0x2f, + 0x40, 0x41, 0x1a, 0x56, 0xe9, 0x25, 0xd2, 0x6e, 0x23, 0x9f, 0x0e, 0x43, 0x59, 0x69, 0x5e, 0x4d, + 0x3c, 0x14, 0x3a, 0x23, 0x8f, 0x2c, 0x5a, 0xcc, 0xee, 0x62, 0xc8, 0x5e, 0x75, 0x46, 0xa7, 0x79, + 0xbf, 0x09, 0xd5, 0xb7, 0xc5, 0xec, 0x1a, 0x35, 0x16, 0x50, 0x6e, 0xfa, 0xee, 0x9f, 0x2b, 0xae, + 0x6d, 0x0b, 0x74, 0xf8, 0xbd, 0xf0, 0x69, 0x05, 0xf2, 0xcd, 0x08, 0x4c, 0xb5, 0x4b, 0xa1, 0xf3, + 0xe1, 0xda, 0xf3, 0x24, 0x06, 0x9f, 0x53, 0xd8, 0x72, 0x23, 0x90, 0xb0, 0x6b, 0x1a, 0x95, 0x68, + 0x36, 0x05, 0x1d, 0x92, 0x16, 0xcf, 0x9d, 0x99, 0x08, 0xc7, 0x22, 0xc1, 0xbb, 0xb4, 0x77, 0x4e, + 0x34, 0xd2, 0xb5, 0xb2, 0x0d, 0x4a, 0xc2, 0x6e, 0x74, 0xa8, 0xb2, 0xaa, 0x45, 0x19, 0xb4, 0x0f, + 0x65, 0xf4, 0x73, 0xe6, 0xc5, 0xb1, 0x2e, 0x6e, 0xee, 0x31, 0x12, 0xad, 0x9a, 0x44, 0xf2, 0x4d, + 0x99, 0x41, 0x95, 0xab, 0xcb, 0xea, 0xf3, 0x22, 0xcc, 0xe6, 0xab, 0xa3, 0x23, 0x80, 0xeb, 0xa0, + 0x66, 0x90, 0x99, 0x42, 0x48, 0x42, 0x45, 0x62, 0x1e, 0x94, 0x10, 0xe6, 0x49, 0x13, 0xa8, 0x6d, + 0xef, 0xc3, 0xcf, 0x52, 0x94, 0xae, 0x10, 0x29, 0x84, 0x72, 0x35, 0x2a, 0xea, 0x73, 0xaf, 0x8a, + 0xce, 0x79, 0xa9, 0xe9, 0x37, 0x63, 0xbb, 0x73, 0x57, 0xfc, 0x2b, 0xab, 0x29, 0x9e, 0x8d, 0x95, + 0xff, 0xae, 0xb0, 0x76, 0xda, 0xf6, 0x59, 0x7b, 0xaf, 0x0f, 0x31, 0x9b, 0xb2, 0x73, 0x84, 0xa7, + 0xf3, 0xc4, 0xfe, 0x80, 0x6d, 0x67, 0xd0, 0x4a, 0xea, 0x0d, 0x06, 0x18, 0xe7, 0x6c, 0x5d, 0x8f, + 0xcb, 0xab, 0xba, 0x9d, 0xce, 0xc6, 0xba, 0x76, 0xfb, 0xa2, 0x7d, 0xa1, 0xeb, 0x72, 0x79, 0x55, + 0xf7, 0xa0, 0xd3, 0x69, 0x77, 0x5e, 0x74, 0xd5, 0x7f, 0xd7, 0xb2, 0x6e, 0x54, 0x07, 0x67, 0x88, + 0xb1, 0x03, 0x15, 0x2d, 0xa4, 0x13, 0x94, 0x7c, 0xba, 0xb1, 0x15, 0x0d, 0x5c, 0x3a, 0x18, 0x9c, + 0xf6, 0xcf, 0x07, 0x95, 0x62, 0x2e, 0x8d, 0x4e, 0x95, 0x9d, 0xc3, 0xc1, 0xb9, 0xdd, 0x3f, 0xad, + 0x18, 0x9c, 0xcb, 0x36, 0xa7, 0x21, 0xfb, 0xc2, 0xa6, 0x7f, 0x59, 0x76, 0x71, 0x0b, 0x2f, 0xbc, + 0x95, 0x68, 0x91, 0x21, 0xce, 0x1f, 0x9a, 0x5a, 0xc8, 0x34, 0x76, 0x58, 0xe6, 0xa4, 0x26, 0xfd, + 0x4c, 0x04, 0xcc, 0xa8, 0xe5, 0x92, 0x95, 0x40, 0xb4, 0x1a, 0x76, 0x3e, 0xfd, 0x32, 0x95, 0xb3, + 0xfd, 0x7c, 0x46, 0x4a, 0x77, 0x9b, 0xff, 0x2a, 0x46, 0xae, 0xf9, 0xe9, 0x0f, 0x7a, 0x2c, 0x9f, + 0x93, 0x01, 0xdc, 0xcb, 0x67, 0x64, 0xca, 0x93, 0x4f, 0x4f, 0x11, 0x1d, 0xf0, 0x5f, 0x26, 0x82, + 0x4a, 0xcf, 0x8f, 0xb4, 0xa3, 0xc9, 0xdb, 0x95, 0xe0, 0x5b, 0x79, 0x64, 0x35, 0xdd, 0x70, 0xc4, + 0x7b, 0x36, 0x68, 0xab, 0x92, 0xda, 0x34, 0x79, 0xb6, 0xfc, 0xe4, 0x56, 0x2b, 0x72, 0xa0, 0x98, + 0x47, 0xde, 0x83, 0xef, 0x3d, 0x56, 0xe0, 0x3b, 0x40, 0xf8, 0x97, 0x88, 0x70, 0x85, 0xdc, 0x21, + 0xa0, 0x4f, 0x42, 0x94, 0x20, 0xa5, 0x0a, 0x9d, 0xf0, 0x69, 0x89, 0xbc, 0xfc, 0x57, 0x95, 0x08, + 0x76, 0xcd, 0x7d, 0x94, 0x64, 0x3f, 0xb4, 0xd5, 0xc9, 0x1f, 0x84, 0x87, 0x9a, 0x2c, 0x67, 0x8c, + 0x04, 0x35, 0x48, 0xf4, 0x14, 0x4c, 0xb6, 0xb5, 0x66, 0x1d, 0xe3, 0xb4, 0x64, 0x1a, 0x9d, 0x58, + 0x9b, 0xaf, 0x22, 0x6f, 0x0c, 0x97, 0x1f, 0x59, 0x50, 0x7f, 0x41, 0xae, 0x94, 0xc8, 0x9f, 0xa3, + 0x07, 0x04, 0xb6, 0x09, 0x24, 0x7f, 0x6e, 0x1e, 0x72, 0xe1, 0x40, 0xa4, 0xc8, 0xd3, 0x4c, 0x18, + 0x32, 0xca, 0xad, 0xb6, 0xf7, 0x04, 0xa2, 0x56, 0xd7, 0x1b, 0x3b, 0x8b, 0x20, 0x11, 0x7a, 0x08, + 0xc9, 0x5b, 0xcd, 0xaf, 0xb3, 0x8b, 0x28, 0xaa, 0x4e, 0x63, 0xf8, 0x5d, 0x8b, 0x28, 0xa8, 0x89, + 0x60, 0x16, 0xee, 0x8a, 0xd4, 0x7c, 0xea, 0x5d, 0x61, 0x11, 0x0f, 0x6f, 0x5c, 0x53, 0xad, 0x7d, + 0xc2, 0x1e, 0xd0, 0xe9, 0x92, 0x20, 0x81, 0x21, 0x70, 0x27, 0x19, 0x0e, 0x15, 0xfd, 0x50, 0xd1, + 0x24, 0xc1, 0x39, 0xa6, 0xf0, 0x85, 0x2e, 0x45, 0x87, 0x8d, 0x3e, 0xb1, 0x4c, 0xaf, 0xc9, 0xea, + 0x65, 0xc2, 0x70, 0x1c, 0x0e, 0x69, 0x66, 0x41, 0xf8, 0x28, 0x03, 0xf3, 0x6f, 0x09, 0x75, 0x00, + 0x92, 0x65, 0x5b, 0xd2, 0x07, 0xe6, 0xb7, 0x51, 0xe0, 0xc4, 0x31, 0x15, 0x19, 0x05, 0x78, 0x74, + 0xf7, 0x0f, 0x4f, 0x5b, 0x87, 0x9d, 0x41, 0xab, 0x0e, 0x3b, 0x72, 0x56, 0x6f, 0xb5, 0xfa, 0xed, + 0xfa, 0xa1, 0x7d, 0xd1, 0xae, 0xdb, 0xf6, 0xb9, 0xbd, 0x3f, 0x68, 0x7d, 0x3c, 0x68, 0x75, 0xda, + 0xe4, 0xeb, 0x49, 0xd8, 0x3d, 0x2d, 0x4c, 0x8c, 0x0f, 0x62, 0x2e, 0xc1, 0x9d, 0x58, 0x32, 0xfa, + 0x32, 0xa9, 0xe1, 0x12, 0x8e, 0x98, 0xa0, 0x8f, 0x4e, 0xcc, 0x58, 0x5a, 0xcd, 0x5d, 0x58, 0x4a, + 0x16, 0x4f, 0xac, 0xbb, 0xb3, 0xcb, 0xd3, 0x2f, 0x7f, 0x03, 0x0e, 0x44, 0xad, 0xd2, 0xcf, 0x34, + 0x6f, 0x35, 0xb1, 0x84, 0x23, 0xbf, 0x8a, 0xe5, 0x88, 0x82, 0x7e, 0xa1, 0xca, 0x97, 0x7f, 0x5c, + 0x09, 0x2a, 0x60, 0x89, 0x26, 0x48, 0x73, 0x8a, 0x58, 0x27, 0xad, 0x9e, 0x31, 0x27, 0x71, 0xf1, + 0xe4, 0x50, 0x18, 0x06, 0x86, 0xb6, 0x4c, 0x66, 0x35, 0x41, 0xfd, 0xda, 0xe6, 0x10, 0xbf, 0xcd, + 0xc6, 0x14, 0x10, 0x50, 0x49, 0x62, 0x21, 0x4b, 0x55, 0xb1, 0xd1, 0x5c, 0x42, 0x69, 0x4b, 0x5a, + 0x48, 0x6b, 0x14, 0xb1, 0x52, 0xe6, 0x95, 0xd5, 0xa2, 0x11, 0xb4, 0xc7, 0x1e, 0x07, 0x04, 0x03, + 0xe2, 0x40, 0x3f, 0x39, 0xd1, 0x00, 0x44, 0x3e, 0x9c, 0xd5, 0xfb, 0x5d, 0xe7, 0x0e, 0x23, 0xf0, + 0xe0, 0x55, 0x50, 0x70, 0x5e, 0xca, 0xa0, 0xa5, 0x8e, 0x4d, 0x0a, 0xab, 0x04, 0x8a, 0x6e, 0xa8, + 0x8a, 0x5b, 0xca, 0x9a, 0x9a, 0xeb, 0xe7, 0xcc, 0xeb, 0xef, 0x66, 0xce, 0x17, 0xd4, 0xd5, 0x4a, + 0x19, 0xcb, 0x80, 0xac, 0xde, 0xf5, 0xcd, 0xd7, 0x2b, 0xea, 0xb9, 0xd7, 0x6b, 0xb6, 0xca, 0x6a, + 0x5e, 0x7e, 0xbd, 0xdd, 0x5c, 0xb3, 0x53, 0x52, 0x73, 0x00, 0x79, 0x58, 0x95, 0x16, 0x53, 0x18, + 0x5e, 0x4b, 0x2b, 0xe4, 0xce, 0xcb, 0xc0, 0x0c, 0x0d, 0xb9, 0x3b, 0x6e, 0x0e, 0x7b, 0x64, 0x3f, + 0xc0, 0x6e, 0xda, 0x2b, 0xa7, 0xe7, 0x1e, 0xe1, 0x26, 0xce, 0xe8, 0x32, 0x61, 0xbc, 0x7e, 0xbe, + 0x16, 0xb7, 0x6c, 0x0d, 0xe2, 0xe3, 0x78, 0x31, 0x47, 0xd7, 0x4c, 0x9d, 0x20, 0xe8, 0xdd, 0x7c, + 0x46, 0x77, 0xf0, 0x1b, 0x9e, 0x48, 0x16, 0x74, 0x77, 0x8e, 0xbc, 0x80, 0x38, 0x5e, 0xc6, 0x89, + 0x37, 0x25, 0x90, 0xee, 0x2a, 0x72, 0x6f, 0xc6, 0xb7, 0x12, 0xc3, 0xe6, 0x38, 0x41, 0x9d, 0x62, + 0x20, 0x81, 0x21, 0x66, 0x01, 0xe5, 0xf9, 0x0f, 0x23, 0xae, 0xf1, 0xec, 0x23, 0xed, 0xdf, 0x93, + 0x74, 0xd0, 0x5d, 0x47, 0x34, 0x93, 0x19, 0x85, 0x81, 0xf6, 0xd9, 0xbc, 0xe9, 0xd0, 0x73, 0x5d, + 0x58, 0x3e, 0x83, 0xde, 0x46, 0x91, 0x29, 0xc5, 0x76, 0x97, 0x32, 0x82, 0xa7, 0xfb, 0x3c, 0xa9, + 0x77, 0xb9, 0xd6, 0x67, 0x34, 0x80, 0x52, 0xc2, 0xf9, 0xb6, 0xa9, 0xda, 0x52, 0x2a, 0x8a, 0x4a, + 0xbf, 0x57, 0xa2, 0xf4, 0x3c, 0x28, 0x90, 0xde, 0x41, 0xfb, 0xf7, 0x56, 0xeb, 0x2c, 0x02, 0x2d, + 0x23, 0x72, 0xaa, 0xa6, 0x54, 0x95, 0x03, 0xbf, 0x47, 0xde, 0xdf, 0xe7, 0xf3, 0xef, 0x7a, 0xf8, + 0x34, 0x5b, 0x84, 0xce, 0xf1, 0x43, 0x97, 0x4e, 0xf5, 0x0b, 0x96, 0x22, 0xbd, 0x9c, 0x58, 0x36, + 0x6e, 0x1c, 0x06, 0x41, 0xf8, 0x48, 0x3d, 0x97, 0x5e, 0x1a, 0xdd, 0x3d, 0x6e, 0x02, 0x5e, 0x09, + 0x96, 0x45, 0xb0, 0x4e, 0xb7, 0x50, 0x9e, 0xee, 0xd3, 0xcd, 0x80, 0x67, 0x77, 0xec, 0x22, 0xa9, + 0x26, 0xa3, 0x22, 0x95, 0xc2, 0x1a, 0xcd, 0x49, 0x74, 0xdf, 0xf7, 0x52, 0xbe, 0x90, 0x01, 0xf0, + 0x92, 0x51, 0x63, 0x1d, 0xea, 0x66, 0x29, 0x6e, 0xd9, 0x6e, 0xa3, 0x1f, 0xe3, 0x09, 0x24, 0xb5, + 0xd0, 0xae, 0x30, 0x1e, 0xf9, 0x78, 0x8f, 0x47, 0x10, 0x52, 0x9a, 0xf0, 0x98, 0x4f, 0xb6, 0x6c, + 0x61, 0xaa, 0xcd, 0x18, 0xb8, 0x10, 0x1b, 0xc2, 0x9b, 0xa7, 0x93, 0x12, 0x20, 0xed, 0xdd, 0x95, + 0xbb, 0xec, 0xbb, 0x8c, 0xcd, 0xea, 0xad, 0x64, 0x90, 0x6e, 0x8b, 0xba, 0xa0, 0xf0, 0x34, 0xc7, + 0x73, 0xd2, 0x4b, 0xe2, 0x16, 0x69, 0x64, 0x4d, 0xfd, 0x68, 0x1d, 0x98, 0xbf, 0xda, 0x7b, 0xe6, + 0x2f, 0x62, 0x6b, 0xbe, 0xac, 0x4a, 0x60, 0xa5, 0xd1, 0x35, 0x74, 0x9a, 0x07, 0x09, 0x5b, 0xc2, + 0x91, 0x98, 0xf2, 0x25, 0x55, 0x99, 0xf6, 0x31, 0x37, 0xd6, 0xf1, 0x7c, 0x73, 0xb3, 0xd7, 0xdd, + 0x3a, 0xae, 0x5b, 0xbf, 0x2e, 0x7f, 0x03, 0x13, 0x06, 0x97, 0x37, 0x66, 0xd3, 0xf0, 0xb3, 0xd0, + 0xd8, 0xfe, 0xd9, 0x65, 0xa1, 0xa9, 0x48, 0xc9, 0xb7, 0x75, 0xaf, 0xb3, 0x55, 0x5b, 0xaf, 0x59, + 0xc5, 0x22, 0x25, 0x26, 0x2c, 0x4e, 0xd2, 0x10, 0x42, 0x71, 0x48, 0xaa, 0xca, 0x6b, 0xfe, 0xb2, + 0x9e, 0x45, 0x52, 0xf0, 0x4d, 0x11, 0xd4, 0xcc, 0x51, 0x1d, 0xec, 0xc8, 0x66, 0x6c, 0x03, 0x18, + 0xea, 0xb3, 0x06, 0x30, 0xc9, 0x0a, 0x00, 0x67, 0x8c, 0x25, 0x14, 0xa0, 0xdf, 0x8f, 0x32, 0x0d, + 0x15, 0xce, 0x34, 0x5c, 0xcc, 0x92, 0xc6, 0x1a, 0x66, 0xfc, 0x6f, 0x7a, 0x88, 0xf8, 0x2a, 0x54, + 0xca, 0x48, 0x41, 0x4e, 0x5d, 0x7a, 0xab, 0x91, 0xbe, 0x8a, 0x9b, 0xd9, 0xfb, 0xff, 0x56, 0xc2, + 0xd7, 0x2e, 0xfa, 0xee, 0x6a, 0xd4, 0x56, 0xef, 0xb5, 0x62, 0xa9, 0x60, 0xaa, 0x22, 0xb4, 0x70, + 0x16, 0x2c, 0xd8, 0x86, 0x4e, 0x9d, 0xa5, 0x18, 0x7a, 0xd2, 0x09, 0x8f, 0xe1, 0xd8, 0x3d, 0xd2, + 0x63, 0x8c, 0x98, 0x62, 0xea, 0x8f, 0xa2, 0x30, 0xf6, 0x68, 0xd5, 0x8a, 0x1c, 0xf1, 0x39, 0xc2, + 0x36, 0x35, 0x76, 0x26, 0xca, 0x22, 0x9b, 0x43, 0xd5, 0x06, 0xf9, 0xa3, 0xfb, 0x88, 0x15, 0x9b, + 0x08, 0x48, 0xe2, 0xfc, 0x44, 0xe7, 0xf1, 0x85, 0x46, 0x88, 0xd7, 0x90, 0x9e, 0x40, 0x0e, 0x9d, + 0xa4, 0x0c, 0xb2, 0x80, 0xa3, 0xec, 0x6d, 0x02, 0x7f, 0x3b, 0xf1, 0x30, 0xaa, 0xea, 0x76, 0xd3, + 0xd8, 0xea, 0xfa, 0x72, 0x33, 0x7d, 0x2c, 0xa6, 0x68, 0x59, 0xd5, 0xb0, 0x42, 0x82, 0x9a, 0x15, + 0xab, 0x21, 0x10, 0x31, 0x08, 0x9e, 0x60, 0xc7, 0x24, 0x0c, 0xdc, 0x5d, 0x51, 0xe3, 0x44, 0x5e, + 0x48, 0x8b, 0xa9, 0xc3, 0x89, 0x56, 0x80, 0xa0, 0xf9, 0x9f, 0xb9, 0xe7, 0xd6, 0x80, 0x62, 0xb8, + 0x18, 0x53, 0xd8, 0x43, 0xb1, 0x49, 0xf8, 0xc8, 0x31, 0x01, 0x8d, 0xd9, 0x90, 0xc2, 0xdc, 0x62, + 0x23, 0xcf, 0xc2, 0xbc, 0xa6, 0x97, 0x9b, 0xe4, 0x8d, 0x97, 0xc7, 0x78, 0xcd, 0x4e, 0x0a, 0x9b, + 0xe1, 0x58, 0x28, 0xd9, 0x97, 0x31, 0x51, 0x2c, 0x16, 0x31, 0x11, 0xf9, 0x57, 0xf8, 0x61, 0xd7, + 0xd2, 0x0f, 0x5b, 0x2b, 0xe2, 0xaf, 0x8a, 0x5f, 0x5f, 0xf7, 0x82, 0xa2, 0x9e, 0x71, 0x8f, 0x42, + 0xd7, 0xeb, 0xa6, 0x86, 0x98, 0x1c, 0xd9, 0xbc, 0x07, 0x6b, 0xf5, 0x6c, 0xed, 0xda, 0x12, 0x63, + 0x37, 0x74, 0xd2, 0x29, 0xd4, 0x75, 0x25, 0x2a, 0x59, 0xbf, 0xd2, 0xb8, 0x1a, 0xa4, 0x70, 0x16, + 0x8b, 0xb2, 0x12, 0x42, 0xb9, 0x78, 0x4a, 0x02, 0x22, 0xdd, 0x28, 0xb5, 0xce, 0xf9, 0x7e, 0x9e, + 0x2b, 0x8f, 0x25, 0x26, 0x30, 0x7a, 0xfa, 0x51, 0xc8, 0xd9, 0xbb, 0x05, 0xa8, 0x8e, 0xc0, 0x8f, + 0xc8, 0x9b, 0x3b, 0x51, 0xd6, 0xbb, 0x6a, 0x25, 0x79, 0x3b, 0x5d, 0xe7, 0x39, 0x19, 0x96, 0x1a, + 0x92, 0x2c, 0x11, 0x6b, 0x44, 0xb2, 0x2f, 0x09, 0xbc, 0xf6, 0x0e, 0x65, 0xc4, 0x4a, 0x48, 0xad, + 0x15, 0xba, 0x2c, 0x31, 0x74, 0xa2, 0x4d, 0x9a, 0x31, 0x40, 0x9c, 0xab, 0x8c, 0x17, 0x84, 0x1b, + 0x03, 0xc8, 0x26, 0x83, 0x6c, 0x78, 0xf4, 0xe9, 0xac, 0x6a, 0x25, 0x8d, 0x65, 0x46, 0x13, 0x67, + 0x06, 0x0d, 0xab, 0xc0, 0xc3, 0xef, 0x29, 0x6f, 0x5a, 0x76, 0x48, 0xf4, 0x0e, 0xb8, 0xd9, 0x74, + 0x6a, 0x39, 0x60, 0x56, 0x37, 0x0d, 0xb9, 0x1c, 0x2e, 0x33, 0xa9, 0xe8, 0x21, 0xa4, 0x7c, 0x24, + 0xce, 0x86, 0xc3, 0x18, 0xde, 0xa7, 0x07, 0xdb, 0x36, 0x71, 0x1e, 0x7c, 0x70, 0x41, 0x39, 0xda, + 0x2b, 0x9e, 0x8b, 0xd8, 0xc2, 0xfd, 0x61, 0xdd, 0x26, 0xf2, 0xb6, 0xd0, 0x6f, 0xba, 0x88, 0x5e, + 0x90, 0x5b, 0x9c, 0x77, 0xc8, 0x61, 0xbd, 0xd4, 0x55, 0xf5, 0xf5, 0xc0, 0xff, 0x49, 0x12, 0x60, + 0xb8, 0xe2, 0xdb, 0x89, 0xd9, 0x4d, 0x89, 0x35, 0xf5, 0x46, 0x93, 0x10, 0xd8, 0xe8, 0x4a, 0x38, + 0x67, 0x04, 0x8c, 0x31, 0xaf, 0x6a, 0xd1, 0x94, 0xec, 0x9c, 0xe8, 0x82, 0x0d, 0xe6, 0x5d, 0xe8, + 0x62, 0xa7, 0xc5, 0x5c, 0xdc, 0xd9, 0xc3, 0x00, 0x41, 0xf7, 0x03, 0x49, 0xeb, 0xfa, 0x40, 0x41, + 0x02, 0x2d, 0x34, 0x3d, 0xd2, 0x44, 0x7d, 0x94, 0x92, 0x1c, 0x6f, 0xf4, 0x3f, 0x3c, 0x4f, 0x76, + 0xd9, 0x5a, 0x5e, 0xdf, 0x28, 0x50, 0x82, 0xf8, 0xd3, 0x25, 0x62, 0xac, 0xde, 0x5c, 0xb3, 0x8a, + 0x25, 0x81, 0x8a, 0x91, 0x62, 0xcc, 0xa0, 0x77, 0x50, 0xc4, 0x02, 0xc9, 0x44, 0xb1, 0x3f, 0x53, + 0x46, 0x40, 0x6d, 0xf3, 0x78, 0xcb, 0xa8, 0xb1, 0x0c, 0x17, 0xa4, 0xdc, 0x31, 0x6d, 0x17, 0x81, + 0x15, 0x12, 0x3f, 0xbd, 0x65, 0x2c, 0xec, 0xfa, 0x5f, 0x6a, 0xe9, 0x60, 0x14, 0x7b, 0x34, 0x02, + 0x3e, 0x62, 0xe8, 0x8a, 0x45, 0x25, 0x9c, 0x79, 0x95, 0x9a, 0xa8, 0x24, 0x8f, 0x21, 0x1e, 0x8d, + 0x46, 0x23, 0x65, 0x9f, 0xd1, 0x99, 0xe0, 0x95, 0x5a, 0x7d, 0x66, 0x02, 0x79, 0x38, 0xa1, 0x25, + 0x31, 0x20, 0x01, 0x27, 0xb7, 0x10, 0x99, 0x53, 0xa3, 0x03, 0xd5, 0x5d, 0xb9, 0xd2, 0x2a, 0x19, + 0x48, 0xdd, 0xed, 0x64, 0xe4, 0xe2, 0xc9, 0x1b, 0x2d, 0x12, 0x29, 0x6e, 0x0c, 0xf6, 0x55, 0x1b, + 0x54, 0x46, 0xc8, 0x9b, 0xcc, 0xd0, 0x37, 0x9e, 0x2c, 0x04, 0x9b, 0x54, 0x14, 0xb7, 0x32, 0xc8, + 0xf3, 0x3e, 0x1e, 0x1e, 0x70, 0xa8, 0x54, 0x0c, 0x71, 0xc1, 0xb8, 0x27, 0xd6, 0x36, 0x5c, 0xb1, + 0xd3, 0x73, 0xb7, 0xe1, 0xa6, 0xee, 0x1d, 0xeb, 0x4a, 0xca, 0x89, 0xb8, 0x41, 0xec, 0x6a, 0xc1, + 0xa1, 0x43, 0xac, 0x1f, 0x8d, 0x26, 0x4b, 0xb4, 0x38, 0x99, 0x40, 0x45, 0xfc, 0xc0, 0x65, 0xa1, + 0x93, 0x06, 0x85, 0x57, 0xc8, 0x63, 0x76, 0x07, 0x40, 0xda, 0xac, 0x28, 0x6c, 0xdb, 0xb1, 0xff, + 0x7b, 0x2c, 0xf5, 0xc2, 0xa4, 0x84, 0x19, 0x40, 0xb7, 0x47, 0x8a, 0x80, 0x98, 0xa5, 0x11, 0xc4, + 0x92, 0x2c, 0xf0, 0x60, 0xa9, 0x69, 0x21, 0xb2, 0x94, 0x47, 0x8f, 0x38, 0x24, 0x84, 0xdc, 0xe9, + 0x36, 0x50, 0x4c, 0x2c, 0xe4, 0xf7, 0x82, 0x8b, 0x68, 0xa3, 0xfb, 0x74, 0xe1, 0x8c, 0x26, 0xc2, + 0x3a, 0x23, 0xa0, 0x96, 0x54, 0x33, 0xf2, 0x0a, 0xe5, 0x57, 0x2c, 0x00, 0xea, 0xfa, 0xe4, 0xf3, + 0x90, 0x6b, 0x4d, 0x5e, 0x22, 0xec, 0x68, 0x66, 0x3b, 0x57, 0xbc, 0x9e, 0x74, 0x94, 0xba, 0xa5, + 0x83, 0xe9, 0xa4, 0x9d, 0xab, 0xd2, 0xb8, 0xb3, 0x55, 0x94, 0x41, 0x16, 0xac, 0x4f, 0x1b, 0xb7, + 0x14, 0x7f, 0x60, 0x12, 0x14, 0xa3, 0xa2, 0x30, 0x4c, 0xd4, 0xc8, 0xf3, 0x7e, 0xb0, 0x92, 0x36, + 0x0a, 0xdc, 0xfd, 0x2c, 0x7a, 0xe3, 0x60, 0xc8, 0xea, 0xb5, 0x0e, 0xea, 0x48, 0xd5, 0xf1, 0xcb, + 0x96, 0xa0, 0x69, 0x02, 0x60, 0x15, 0x74, 0x7b, 0x2f, 0x05, 0x2d, 0x85, 0x4b, 0x76, 0xe3, 0xee, + 0xfb, 0x42, 0x95, 0x5f, 0xa8, 0xc7, 0xb8, 0xaf, 0xb4, 0x70, 0x52, 0x4c, 0xa2, 0x36, 0xc6, 0x29, + 0xc0, 0x09, 0x89, 0x11, 0xe7, 0xd6, 0x44, 0xbc, 0x00, 0x41, 0xf0, 0xe9, 0xbf, 0x1a, 0x21, 0x55, + 0x2d, 0x0b, 0x05, 0xc0, 0xbf, 0x74, 0x44, 0x5a, 0x6b, 0xc6, 0x4b, 0xb4, 0xa9, 0x90, 0x54, 0x32, + 0xa5, 0x5b, 0x98, 0x1d, 0x2d, 0xfe, 0x2e, 0x9f, 0xfc, 0x95, 0x1b, 0x82, 0x8a, 0x73, 0x41, 0x7f, + 0x06, 0xd1, 0xcb, 0x23, 0xb1, 0x76, 0xc3, 0x5c, 0x39, 0x15, 0x70, 0x0a, 0x42, 0x77, 0xd9, 0xe3, + 0xf9, 0x7c, 0xb9, 0x4b, 0xec, 0xd7, 0x0f, 0xff, 0x05, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x14, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x1c, 0x4f, 0x2a, 0x51, 0xe6, 0xea, 0xf2, 0x0d, 0xd0, 0x35, 0x00, + 0x00, 0xf8, 0xb5, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x70, + 0x6d, 0x70, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x39, 0x00, + 0x00, 0x00, 0xf9, 0x35, 0x00, 0x00, 0x00, 0x00 +}; diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_html_index.h b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_html_index.h new file mode 100644 index 0000000..f4e571f --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_html_index.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER data file index.html + */ + +const char index_htm[] = +"" +"" +"" +"" + +"
" +"\"NXP" +"

This file was retrieved from the board memory!

" +"
" + +"
" +"

This is a sample HTML file stored in target device memory. Such files can be accessed in the FreeMASTER browser window when using a special fmstr: protocol specifier. This new feature enables you to embed text files, images or scripts directly into the target device.

" +"

" +"As a standard HTML file, you can use references to other files stored in the target device. Here are few examples implemented by this demo:" + +"

" +"

" +"
" + +"
" +"
" + +"
" +"© Copyright 2018-2019 NXP" +"
" + +" "; diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_img_file.h b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_img_file.h new file mode 100644 index 0000000..f9c3426 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_img_file.h @@ -0,0 +1,139 @@ +/* + * Copyright 2019 NXP. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +//file auto-generated from file1.png by bin2h.exe +size_t file_png_len = 1388; +const unsigned char file_png[1388]= +{ + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00, + 0x0D,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x40,0x00,0x00, + 0x00,0x40,0x08,0x03,0x00,0x00,0x00,0x9D,0xB7,0x81,0xEC, + 0x00,0x00,0x00,0x04,0x67,0x41,0x4D,0x41,0x00,0x00,0xB1, + 0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00,0x03,0x00,0x50,0x4C, + 0x54,0x45,0x00,0x00,0x00,0x01,0x01,0x01,0x08,0x08,0x08, + 0x14,0x14,0x14,0x16,0x16,0x16,0x27,0x27,0x27,0x29,0x29, + 0x29,0x2B,0x2B,0x2B,0x33,0x33,0x33,0x3F,0x3F,0x3F,0x42, + 0x42,0x42,0x47,0x47,0x47,0x4B,0x4B,0x4B,0x5E,0x5E,0x5E, + 0x60,0x60,0x60,0x67,0x67,0x67,0x6B,0x6B,0x6B,0x73,0x73, + 0x73,0xEA,0xEA,0xEA,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0A,0xC8,0x30,0x75,0x00,0x00,0x01,0x00,0x74,0x52,0x4E, + 0x53,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x00,0x53,0xF7,0x07,0x25,0x00,0x00,0x00, + 0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC2,0x00,0x00, + 0x0E,0xC2,0x01,0x15,0x28,0x4A,0x80,0x00,0x00,0x00,0x18, + 0x74,0x45,0x58,0x74,0x53,0x6F,0x66,0x74,0x77,0x61,0x72, + 0x65,0x00,0x50,0x61,0x69,0x6E,0x74,0x2E,0x4E,0x45,0x54, + 0x20,0x76,0x33,0x2E,0x33,0x36,0xA9,0xE7,0xE2,0x25,0x00, + 0x00,0x00,0xD2,0x49,0x44,0x41,0x54,0x58,0x47,0xED,0xD7, + 0xCB,0x0E,0x83,0x20,0x10,0x85,0xE1,0xE9,0x4D,0xE9,0x55, + 0xE9,0xFB,0xBF,0x2B,0x05,0x3D,0xD5,0x41,0x82,0x03,0x9A, + 0x74,0x51,0xF8,0x56,0x4D,0x98,0xF9,0x17,0x62,0xD2,0x48, + 0x66,0x27,0x1E,0xE8,0xEE,0x6B,0x1E,0x98,0x5A,0x60,0x01, + 0x12,0x1C,0x30,0xE7,0xF3,0x02,0x0D,0x46,0x63,0x9E,0x98, + 0xE4,0xBC,0x80,0x7A,0xAF,0x70,0x85,0x2B,0x46,0x99,0xBC, + 0x00,0x5D,0x30,0x3B,0xCB,0x0C,0xD0,0x09,0xC3,0x93,0xDC, + 0x00,0x1D,0x31,0xFD,0x95,0x1D,0x58,0x5E,0x46,0x7E,0x80, + 0xE8,0x85,0x85,0xC1,0x96,0x00,0xDD,0xB0,0xE1,0xA4,0x07, + 0xCE,0xD8,0x1E,0x60,0xC5,0x4A,0x0F,0xCC,0xDA,0xBD,0x01, + 0x55,0x03,0x09,0x01,0xDC,0x55,0x00,0xC7,0x62,0xA0,0x6F, + 0x22,0xFA,0xF1,0xBC,0x88,0x87,0x28,0x28,0x22,0x80,0xF7, + 0x26,0x80,0x63,0x31,0xA0,0x55,0x84,0x1E,0xCF,0x8B,0x78, + 0x88,0x82,0x1F,0x04,0x70,0x6B,0x01,0x1C,0x8B,0x01,0x8D, + 0x5B,0x0B,0xD4,0x6B,0x9C,0x14,0x11,0xC0,0x7B,0x13,0xC0, + 0xB1,0x18,0xA8,0x7F,0x2C,0xB2,0x1A,0xA8,0x01,0xE7,0xAF, + 0x03,0xD2,0x87,0x27,0xD8,0x31,0xAC,0x58,0x5E,0x20,0x1D, + 0x56,0x2C,0xF6,0x53,0xF8,0xF8,0x66,0x3A,0x2C,0x38,0x3C, + 0xB0,0x81,0x31,0x1F,0xAF,0x2C,0x22,0x92,0x72,0x31,0x56, + 0x09,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42, + 0x60,0x82, +}; diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_img_fmstrlogo.h b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_img_fmstrlogo.h new file mode 100644 index 0000000..965823d --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_img_fmstrlogo.h @@ -0,0 +1,199 @@ +/* + * Copyright 2019 NXP. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +//file auto-generated from fmstr_logo.png by bin2h.exe +size_t fmstrlogo_png_len = 2050; +const unsigned char fmstrlogo_png[2050]= +{ + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00, + 0x0D,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x3C,0x00,0x00, + 0x00,0x40,0x08,0x02,0x00,0x00,0x00,0xC9,0x7E,0x83,0x9F, + 0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE, + 0x1C,0xE9,0x00,0x00,0x00,0x04,0x67,0x41,0x4D,0x41,0x00, + 0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00,0x00,0x09, + 0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC3,0x00,0x00,0x0E, + 0xC3,0x01,0xC7,0x6F,0xA8,0x64,0x00,0x00,0x00,0x18,0x74, + 0x45,0x58,0x74,0x53,0x6F,0x66,0x74,0x77,0x61,0x72,0x65, + 0x00,0x50,0x61,0x69,0x6E,0x74,0x2E,0x4E,0x45,0x54,0x20, + 0x76,0x33,0x2E,0x33,0x36,0xA9,0xE7,0xE2,0x25,0x00,0x00, + 0x07,0x73,0x49,0x44,0x41,0x54,0x68,0x43,0xD5,0x9A,0xF9, + 0x53,0x53,0x57,0x14,0xC7,0xFD,0xA7,0xAC,0xB4,0x95,0x35, + 0x2C,0x5A,0xDB,0xFE,0x52,0xA7,0x05,0x87,0x25,0x01,0x82, + 0x2B,0x41,0x36,0x21,0x79,0x24,0x08,0x92,0xA0,0x38,0x80, + 0x8A,0xCA,0x26,0x82,0x33,0xB5,0x6A,0xDD,0x47,0x2B,0x88, + 0xA2,0x10,0x2B,0x16,0x04,0xB4,0x2A,0xE0,0x32,0x5A,0xA8, + 0x82,0x28,0x61,0x13,0x65,0xC7,0xF6,0x7B,0xEF,0x7D,0x2F, + 0x09,0x59,0x1F,0x42,0xCC,0xF3,0xCD,0x67,0xDE,0x9C,0x7B, + 0xEE,0x92,0x2F,0x97,0xF3,0xCE,0xBD,0x37,0x79,0x2B,0x56, + 0x47,0xEE,0x90,0x29,0xB8,0x35,0x4A,0xDD,0x1A,0x65,0xB6, + 0xC4,0x09,0x8B,0xD7,0x85,0x82,0x38,0xED,0x8A,0x55,0xE1, + 0xA9,0x7E,0xD1,0x99,0xD0,0x1D,0x1C,0x9B,0x25,0x65,0x64, + 0x40,0xC1,0x05,0xC9,0x81,0x66,0xC5,0xCA,0x9F,0x53,0x7C, + 0x23,0x33,0x60,0x05,0xC1,0x25,0x65,0xE4,0x5C,0x60,0x8C, + 0x86,0xB1,0x62,0xD5,0x2F,0xA9,0x7E,0x51,0x5F,0xC2,0x4C, + 0x2B,0xCC,0x33,0xCD,0x91,0xF0,0xF0,0x47,0x78,0xD8,0x35, + 0x92,0x20,0xEE,0x45,0x87,0x28,0x6C,0x3D,0x5E,0x21,0x84, + 0xC2,0x6C,0x57,0xA2,0x49,0x3B,0x05,0x15,0x2D,0x01,0xDD, + 0xBC,0x12,0x6A,0x5B,0x1E,0x44,0xC7,0x33,0x2D,0xE7,0x64, + 0xF4,0x6F,0x02,0x81,0x40,0x41,0xEF,0x66,0x9B,0x61,0x5D, + 0x34,0xD7,0x2E,0x0A,0xD7,0x7D,0x21,0x91,0xA8,0xD4,0xC8, + 0x18,0x0A,0x8E,0x8A,0xD6,0x38,0x15,0x4D,0xAA,0x79,0xB2, + 0x08,0xB1,0x14,0x6B,0xDB,0xA6,0xC8,0xEC,0x4F,0xC0,0x45, + 0x5F,0x7E,0x64,0x22,0x83,0x29,0x76,0x25,0x7A,0xDD,0xE6, + 0x9C,0xF0,0xF4,0x02,0x45,0xD6,0x3E,0x65,0x76,0x49,0x42, + 0xF6,0x41,0x86,0x92,0x70,0x88,0xDE,0xDD,0x63,0xEE,0x25, + 0x74,0x5C,0x12,0xF1,0xBA,0x92,0xC8,0x8C,0xC2,0x1F,0x36, + 0xE7,0x42,0x9B,0x03,0xD1,0x48,0x2B,0xF8,0xB3,0x22,0xD2, + 0xF7,0xEA,0x2B,0x4F,0x55,0x5F,0xA8,0x3F,0x71,0xA5,0xF1, + 0x54,0xAD,0xF1,0xE4,0x15,0x0A,0x0C,0xDE,0x6E,0xE2,0x61, + 0x9E,0x5A,0x6B,0x9B,0xD5,0x0A,0xB6,0xC5,0x23,0x34,0xA0, + 0x43,0x61,0x4C,0x61,0x58,0x9B,0xBE,0x14,0x8B,0x4D,0xAA, + 0xD0,0xF2,0xB7,0xCB,0x8D,0xC5,0x35,0x17,0xE4,0xEA,0x62, + 0xAC,0x85,0x42,0x9E,0xB6,0x12,0x0D,0xC5,0x81,0x0A,0xCD, + 0xC6,0xDC,0x43,0x17,0x1B,0x5B,0x9E,0xF4,0xBC,0xEA,0x7B, + 0x63,0xEA,0x7F,0x3B,0xB4,0x28,0xFA,0xEC,0x3C,0x4B,0xE7, + 0xE5,0xEB,0xC1,0x9B,0x2D,0x0F,0x52,0xF6,0x1C,0xC1,0x4A, + 0x1E,0x10,0xAD,0x0E,0x8C,0x51,0x2F,0x14,0x2D,0xE7,0x02, + 0xE4,0x9A,0x6D,0x86,0x72,0x63,0x7B,0xE7,0xE8,0xF8,0x87, + 0xB9,0xF9,0xF9,0x8F,0xDE,0xBE,0xA0,0x60,0x66,0x76,0xEE, + 0xFE,0xE3,0x17,0xEA,0xE2,0x63,0x6B,0x12,0x9C,0x88,0x0E, + 0x94,0x6B,0x12,0x89,0xE8,0x47,0x10,0x8D,0x3E,0xFF,0x49, + 0xE0,0x82,0xE8,0x7B,0x8F,0x5F,0x64,0x52,0xD1,0xFE,0xF6, + 0xA2,0x69,0x9A,0xD3,0xA8,0xF4,0xE5,0xC6,0x36,0x89,0x89, + 0xEE,0x86,0xE8,0x1A,0xD7,0xA2,0x2B,0x8C,0x6D,0x24,0x3C, + 0x24,0x23,0x7A,0x16,0xA2,0xD5,0xC5,0x35,0x6B,0x1D,0x86, + 0x07,0x72,0x38,0x44,0x27,0x92,0x99,0x96,0x94,0x68,0x3A, + 0xD3,0x45,0x64,0xA6,0x1D,0x8B,0x26,0x31,0xAD,0x2F,0x6F, + 0x92,0x60,0x78,0x14,0x39,0x89,0x69,0x4C,0xB3,0x24,0x45, + 0xCF,0xE2,0x41,0xCC,0x28,0x3E,0x16,0xC6,0x8B,0xB6,0xC9, + 0xD3,0x82,0x68,0x91,0x0F,0x22,0x1A,0x20,0x2D,0xCE,0xCD, + 0x79,0x90,0xD9,0xB9,0xB9,0xC9,0xA9,0xE9,0x8E,0xAE,0x67, + 0x19,0x45,0xD5,0xC2,0x4C,0xDB,0xAC,0x88,0x24,0xA6,0xD5, + 0x22,0x63,0x1A,0x49,0x7C,0xFC,0xC3,0xE4,0xCB,0x81,0xC1, + 0x67,0xBD,0xFD,0x4F,0x7A,0xFA,0x08,0xBD,0xCB,0xCF,0xD3, + 0x9E,0xBE,0xEE,0xE7,0xFF,0xFE,0xD1,0xD8,0x92,0x64,0x28, + 0x0D,0x53,0x6A,0xFD,0xA3,0xED,0x56,0x44,0x1A,0xD3,0x6A, + 0x92,0xA7,0xDD,0x89,0x46,0xC5,0xF4,0xEC,0xEC,0x8B,0x57, + 0x6F,0x2E,0xDE,0x68,0xA9,0x3C,0x53,0x5F,0x7A,0xAA,0xAE, + 0xF4,0xF7,0xBA,0xD2,0xD3,0xCB,0x4F,0x19,0x86,0x3D,0x79, + 0x65,0xD7,0xE1,0x13,0x91,0xE9,0x7B,0x43,0xE2,0xB2,0x02, + 0xB0,0x8C,0xDB,0xEC,0xA7,0x69,0x78,0x40,0x74,0x99,0xDB, + 0x98,0x46,0xD5,0xC4,0xD4,0xF4,0xDD,0xCE,0xE7,0xFA,0xCA, + 0xB3,0xCA,0xEC,0xC3,0x31,0x9A,0xFD,0x72,0xAE,0x44,0x9E, + 0x25,0x60,0xB6,0x6D,0x9C,0x3C,0x07,0x2C,0x4E,0x33,0x70, + 0x9A,0x1B,0x58,0x9C,0x25,0x0A,0xAE,0x24,0x46,0x73,0x20, + 0x3C,0xAD,0x70,0xDD,0xA6,0x9C,0x60,0x7E,0x97,0xE7,0x54, + 0xB4,0xBB,0x99,0xFE,0xF8,0xF1,0xFD,0xE4,0x94,0xB1,0xA3, + 0x3B,0x79,0x6F,0xCD,0xF7,0x5B,0xF2,0x42,0xE3,0xB3,0x43, + 0x95,0x3B,0x3D,0x41,0x98,0x12,0x23,0x67,0x07,0xC7,0x67, + 0x07,0xC7,0x6A,0x1D,0x6F,0x4D,0x2D,0xCB,0xB8,0x18,0xD1, + 0x13,0x53,0x8D,0x77,0x3B,0xB7,0xE8,0x2B,0x82,0xE2,0xB2, + 0x56,0x47,0xEE,0xF0,0x8D,0xCA,0xF0,0x04,0x7E,0x74,0x64, + 0xBF,0xE8,0x4C,0xEC,0xE4,0xD8,0xDE,0x7A,0xA9,0xA2,0x6F, + 0xB6,0x3C,0x4C,0xC8,0x29,0x5D,0x1D,0x9D,0xB1,0x32,0x3C, + 0xD9,0x27,0x22,0xC5,0x67,0x43,0xAA,0xCF,0x06,0xDC,0x79, + 0xBE,0x5E,0x3A,0x11,0x8C,0xD4,0x6F,0x23,0xD3,0x03,0xE4, + 0x6A,0x41,0xB4,0x6D,0x78,0x2C,0x42,0xF4,0xC4,0xE4,0x74, + 0xCB,0xDF,0x4F,0x75,0x25,0xC7,0x23,0xD2,0x0B,0xD6,0x27, + 0xEB,0xC3,0x53,0xF3,0xC3,0xD3,0x04,0x52,0xF3,0x23,0x08, + 0xBB,0x97,0x06,0x3F,0x42,0x78,0xCA,0xEE,0x9F,0x92,0xF4, + 0xDF,0x6D,0xCA,0x96,0xC5,0x92,0x63,0x98,0xAD,0x68,0x3E, + 0xE5,0x19,0xCA,0xDC,0xE6,0x69,0xD4,0xCC,0xCC,0xCC,0xF6, + 0xBC,0x7A,0x73,0xB9,0xB1,0xB5,0xFA,0x7C,0x7D,0xD5,0xD9, + 0xBA,0xEA,0x73,0x57,0xCD,0xD4,0x9C,0xAB,0x5F,0x46,0x8E, + 0x9E,0xB9,0xBA,0xA7,0xF2,0x74,0xB4,0xBA,0x30,0x24,0x5E, + 0x4B,0xB3,0x87,0xE3,0x94,0xE7,0x5E,0x34,0x2E,0xD4,0x4E, + 0x4E,0xCD,0x0C,0x8D,0xBE,0x1B,0x30,0x0D,0xBF,0x1E,0x1C, + 0x1E,0x60,0x98,0x04,0x63,0xF9,0xE8,0x1B,0x30,0x35,0xB6, + 0x3E,0x4C,0x2D,0xA8,0x22,0x2B,0x62,0x8C,0xE3,0x15,0x91, + 0xE5,0xE9,0x45,0x2C,0xE3,0x68,0xE4,0x41,0xF0,0x2F,0x25, + 0x87,0x80,0x7F,0xD4,0x6C,0xEF,0xE1,0x44,0x34,0x89,0x69, + 0xA9,0x6D,0x98,0x20,0x9A,0x6E,0x98,0x74,0x90,0xFA,0xC5, + 0x88,0x36,0x6F,0x4D,0x5D,0x6D,0x98,0x24,0xB7,0xCB,0xEB, + 0x7E,0x2E,0x1C,0x02,0xEC,0x4F,0xE3,0x2C,0xA6,0xA5,0x77, + 0x08,0xB8,0xFF,0xD8,0xAD,0x68,0x11,0x79,0xFA,0x73,0x5E, + 0xB3,0xFC,0x69,0x9C,0x9D,0x5C,0x1C,0xEF,0xF2,0x44,0x2D, + 0x2E,0xEC,0x42,0x03,0x27,0xFB,0x69,0xF3,0xE5,0xCC,0xCF, + 0x2E,0xD7,0x4E,0x66,0xCC,0x4F,0xCD,0xCC,0x20,0x3C,0xE8, + 0xC1,0x76,0xA7,0x4B,0xD1,0xF4,0x7B,0x0F,0xD7,0xA2,0x51, + 0x8B,0xE1,0x46,0xC6,0x3F,0x98,0x46,0xC6,0x4D,0x23,0xEF, + 0x4C,0x23,0x63,0x60,0x68,0x94,0xDC,0x4D,0x23,0xA3,0x02, + 0xAC,0x68,0xCD,0xA8,0x69,0x98,0x62,0xE3,0x74,0xD2,0x7E, + 0x70,0x04,0xEB,0xC0,0x08,0x52,0x70,0x6A,0xC1,0x51,0x3A, + 0xD3,0xCE,0x53,0x9E,0x98,0xEF,0x3D,0x70,0xA6,0x18,0x18, + 0x1A,0x69,0x7D,0xF4,0xAC,0xE1,0xAF,0x07,0xD7,0x9A,0xEF, + 0x5F,0x6B,0xBE,0x77,0xFD,0x4E,0x47,0xC3,0x1D,0x72,0xBF, + 0xD6,0x4C,0xB8,0x4E,0x69,0x20,0xCE,0x8E,0x06,0xA1,0x68, + 0x0D,0x1A,0xA3,0xCA,0xC6,0xC9,0xA0,0xBD,0x30,0x14,0xE1, + 0xEA,0xAD,0xF6,0xA3,0x67,0xEA,0x13,0x74,0x07,0xC3,0xE2, + 0x75,0x38,0x20,0x06,0x7D,0xB2,0x68,0x54,0x4D,0x4E,0xCF, + 0x3C,0x78,0xDA,0x7B,0xF8,0x64,0xAD,0x66,0xFF,0xAF,0x19, + 0x85,0xC7,0xF0,0xEF,0x43,0xD8,0x69,0xE8,0x9D,0x50,0x54, + 0x0D,0x34,0xA0,0xB8,0x86,0x83,0xBF,0x08,0xA0,0x48,0x0C, + 0xA1,0x8A,0x34,0x26,0xB0,0x66,0x7C,0x2D,0xA9,0x22,0xB5, + 0xAC,0x8A,0x76,0x54,0x17,0x56,0x27,0xE6,0x96,0xAE,0x57, + 0x19,0x42,0x63,0xB5,0x50,0x0C,0x91,0xB6,0xE1,0x01,0x97, + 0x98,0xF0,0x40,0x15,0x76,0x79,0xC6,0xB6,0xAE,0xED,0xF9, + 0x55,0x6B,0x37,0xE6,0x04,0xC7,0x69,0xC3,0x12,0x74,0x78, + 0xBA,0x17,0x62,0xE3,0xB1,0x2A,0x2A,0xCD,0x4E,0xA0,0xB3, + 0x2A,0xA2,0x0D,0x43,0xF0,0x28,0x51,0xAB,0x5B,0x4B,0x7F, + 0x89,0x0B,0x56,0x60,0x5A,0xED,0xB6,0xA6,0x16,0xD1,0x22, + 0xB7,0xA6,0xAD,0x9D,0x9B,0x73,0xCB,0xB1,0x89,0xF9,0x66, + 0x43,0xBA,0x6F,0x54,0xA6,0x1F,0x05,0xF9,0x5F,0x00,0x36, + 0x2D,0x46,0x81,0x4C,0x7B,0xF8,0xF6,0x0B,0x3D,0x96,0x22, + 0xFA,0x12,0x8F,0x1A,0x20,0x94,0x65,0x72,0x0E,0xA2,0xD9, + 0xD7,0x49,0x8E,0x44,0x8B,0xC8,0xD3,0x44,0xF4,0xE4,0x74, + 0x53,0x7B,0xB7,0x2A,0xBF,0x0A,0x27,0x8B,0x80,0x18,0x35, + 0x8E,0x15,0x18,0x41,0x40,0xEB,0xC4,0x5E,0x2C,0x5A,0x19, + 0x85,0x2F,0x2A,0x38,0xA6,0xD0,0x5E,0xB4,0xA8,0xC5,0x45, + 0x10,0xDD,0x95,0x94,0x7F,0x24,0x4C,0x49,0x9E,0x8F,0x85, + 0xA2,0x3D,0x02,0x3D,0x6E,0x39,0x9A,0x69,0x7C,0x7C,0xA2, + 0x5E,0xD4,0xC1,0x96,0x89,0x56,0x41,0x34,0x7D,0xA8,0xA5, + 0x20,0x5A,0xDC,0x4C,0xB7,0x75,0xA9,0x0C,0xDE,0x17,0x4D, + 0x8F,0x5B,0xE2,0xC3,0x83,0x88,0xAE,0xF4,0xBE,0x68,0xB8, + 0x54,0x22,0xB3,0x07,0x1F,0x1E,0x95,0xA1,0xF1,0x3A,0xBB, + 0x07,0xD1,0x23,0xB8,0x9C,0x69,0x22,0x5A,0x7C,0x4C,0x33, + 0xD1,0xE4,0x77,0x3E,0xEB,0x0F,0xF0,0x04,0x8E,0x45,0xA3, + 0xCC,0x44,0x8B,0x7B,0x10,0xA7,0x9A,0xDA,0x3B,0x55,0xF9, + 0x15,0x10,0xED,0xCD,0xF0,0x30,0x8B,0x16,0x17,0x1E,0x66, + 0xD1,0x38,0x24,0x7B,0x55,0x34,0x50,0x19,0x2A,0xB0,0x8C, + 0x8F,0x89,0x10,0x8D,0x66,0x68,0x2C,0x05,0xD1,0xEA,0x24, + 0x43,0xC5,0xED,0x8E,0xAE,0xB1,0xF7,0x13,0xF3,0xCE,0x7F, + 0x92,0x43,0xC5,0xC4,0xD4,0xF4,0x9F,0x1D,0xDD,0x49,0x24, + 0xA6,0xBD,0x2D,0x1A,0x27,0x97,0xAD,0x79,0xA5,0xF5,0xB7, + 0x3B,0x7A,0xFB,0xDF,0x0E,0xDA,0xEE,0x7A,0x05,0x86,0xC7, + 0x06,0x87,0xC7,0xFA,0xDF,0x0E,0xD7,0xDF,0xBE,0xB7,0x75, + 0x57,0x39,0x44,0xD3,0x98,0x5E,0xF0,0x01,0x9E,0xC0,0xB1, + 0x68,0x19,0xF9,0x92,0x4F,0x13,0xAD,0x2E,0x2A,0x39,0x7E, + 0xE9,0xFC,0xF5,0xE6,0x5A,0xE3,0xDD,0xBA,0x5B,0x6D,0x0E, + 0x30,0xB6,0xD5,0x1A,0xDB,0x2E,0xDD,0x68,0x39,0x78,0xFC, + 0x72,0x8C,0x7A,0x5F,0x48,0x9C,0x16,0x03,0x59,0x8F,0xEE, + 0x21,0x9C,0x88,0x8E,0xE5,0x60,0xFC,0xB8,0x35,0x4F,0xC1, + 0xED,0xDF,0x96,0x57,0x86,0x38,0xD9,0x9E,0x5F,0x91,0xCC, + 0x53,0x09,0x50,0xE4,0x31,0x54,0xAA,0xF4,0x15,0xB1,0xDC, + 0x01,0x34,0x86,0x68,0x74,0xB4,0x1E,0xDD,0x43,0x38,0x16, + 0x4D,0xC1,0x96,0x8A,0xEC,0xAA,0xC8,0xBF,0x5B,0xC1,0xBF, + 0xD8,0x42,0xD1,0x5A,0xD9,0xBC,0x87,0xDF,0xC1,0xC5,0xA1, + 0x97,0x37,0x45,0x53,0x1D,0x64,0xDB,0x4A,0xD2,0x08,0x8E, + 0x09,0x32,0xC0,0xDE,0x11,0xB1,0xB6,0x59,0x11,0x77,0xF2, + 0xF0,0x99,0xB1,0x8C,0xEE,0x21,0x5C,0xCC,0x34,0x83,0xEA, + 0x80,0x26,0xF2,0x78,0x09,0x06,0xB3,0x99,0x3E,0xBE,0xC8, + 0x3C,0xCC,0xF0,0x38,0x6E,0x45,0x4B,0x91,0x2F,0x5C,0xB4, + 0xCF,0x2F,0x69,0x38,0x8A,0x7D,0x86,0x2C,0xBB,0x74,0x2C, + 0xA2,0xBF,0x12,0xDE,0x80,0xF4,0x22,0x41,0x0B,0x6D,0xEB, + 0xA2,0x05,0x22,0x97,0xBC,0xB9,0x89,0x1D,0x25,0x11,0x8D, + 0x83,0xB4,0xE3,0x76,0x4B,0xC0,0xF9,0x80,0xC8,0x39,0x24, + 0xED,0x58,0xC4,0xC5,0x72,0x41,0x58,0x1F,0x84,0x06,0x16, + 0xBF,0x60,0x50,0x0F,0x12,0x1A,0x16,0x6C,0xF2,0xE2,0x8F, + 0x3F,0x11,0x1D,0x91,0xE6,0x4B,0x62,0x7A,0xB9,0x93,0x00, + 0x92,0x37,0x41,0x4B,0x61,0xB9,0x9C,0x79,0x38,0x40,0x84, + 0xD2,0x97,0xD8,0x6C,0x1B,0x20,0x06,0xE2,0xC8,0x0B,0xBC, + 0xFC,0x20,0xCC,0x83,0xFD,0x05,0x79,0xD1,0x94,0xDC,0x03, + 0x15,0x9C,0xBF,0x82,0xFB,0x1F,0x49,0x80,0x9A,0xCA,0xFF, + 0x64,0x83,0x93,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44, + 0xAE,0x42,0x60,0x82, +}; diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_img_logo.h b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_img_logo.h new file mode 100644 index 0000000..b758f39 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/data_img_logo.h @@ -0,0 +1,297 @@ +/* + * Copyright 2019 NXP. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +//file auto-generated from nxp_logo_150.png by bin2h.exe +size_t logo_png_len = 3124; +const unsigned char logo_png[3124]= +{ + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00, + 0x0D,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x96,0x00,0x00, + 0x00,0x50,0x08,0x06,0x00,0x00,0x00,0xFB,0xB0,0x8C,0x4B, + 0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xAE,0xCE, + 0x1C,0xE9,0x00,0x00,0x00,0x04,0x67,0x41,0x4D,0x41,0x00, + 0x00,0xB1,0x8F,0x0B,0xFC,0x61,0x05,0x00,0x00,0x00,0x09, + 0x70,0x48,0x59,0x73,0x00,0x00,0x0E,0xC3,0x00,0x00,0x0E, + 0xC3,0x01,0xC7,0x6F,0xA8,0x64,0x00,0x00,0x00,0x18,0x74, + 0x45,0x58,0x74,0x53,0x6F,0x66,0x74,0x77,0x61,0x72,0x65, + 0x00,0x50,0x61,0x69,0x6E,0x74,0x2E,0x4E,0x45,0x54,0x20, + 0x76,0x33,0x2E,0x33,0x36,0xA9,0xE7,0xE2,0x25,0x00,0x00, + 0x0B,0xA5,0x49,0x44,0x41,0x54,0x78,0x5E,0xED,0x9D,0x09, + 0x70,0x55,0xD5,0x19,0xC7,0x01,0xC1,0x8D,0xAA,0x9D,0x91, + 0xB2,0x13,0x16,0x41,0xD0,0x42,0x87,0xB0,0x68,0x00,0xA5, + 0x01,0x12,0xEB,0x4C,0x1D,0x6B,0xA7,0x5A,0xA7,0xD3,0x19, + 0xA7,0x9D,0x76,0x5A,0xED,0x28,0x8B,0x14,0x70,0xE8,0x22, + 0xA5,0x23,0xA1,0x2C,0x16,0x48,0x00,0x25,0x61,0x4B,0x0C, + 0x4B,0x12,0x02,0x09,0x44,0x94,0xDD,0xCA,0x00,0x2A,0x0D, + 0x45,0x04,0xA1,0x2C,0x4A,0x17,0x40,0x51,0x0A,0xC8,0x1E, + 0xF4,0xF4,0xFF,0x3D,0x4F,0x1E,0xF7,0xBD,0xFB,0xDD,0xE5, + 0xDC,0xED,0xBD,0xE8,0xF9,0xCF,0xFC,0x06,0x72,0xDF,0xB9, + 0xDF,0xB9,0x79,0xE7,0x67,0x78,0x39,0xE7,0xDE,0x63,0x23, + 0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D, + 0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D, + 0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x9D,0xC0,0x73,0x75, + 0x75,0xCB,0xBB,0x41,0x96,0x0F,0x3A,0xC8,0x52,0xA1,0xA7, + 0xA6,0x60,0x50,0xDB,0x59,0x93,0x1E,0xCC,0xF2,0x4A,0x5E, + 0xFE,0x73,0x59,0xCF,0x54,0x1C,0xA9,0xA7,0x87,0x2C,0x1B, + 0x58,0x50,0xB3,0x31,0xC8,0xA4,0xFA,0xC3,0x2B,0x0E,0x65, + 0x0D,0x2F,0xFA,0x71,0xD6,0x33,0xF3,0x72,0x3D,0x31,0x1C, + 0x54,0xED,0xEC,0x97,0xB5,0xE9,0xFD,0xDE,0x61,0xD3,0x1D, + 0xB4,0x03,0xB7,0x82,0x66,0xF2,0x5B,0xF1,0x1F,0x88,0xF1, + 0x3A,0xA8,0xF3,0xC1,0x21,0xD0,0x51,0x96,0x0B,0x35,0x27, + 0xCA,0xBA,0x8C,0x29,0x9A,0x92,0x53,0x07,0x49,0x3C,0x01, + 0xB1,0xEA,0x30,0xE8,0xF5,0x9C,0x00,0x81,0x5E,0x37,0xEA, + 0x65,0x83,0x8B,0x54,0x1F,0x62,0xD5,0x41,0xAC,0x3A,0x48, + 0xE2,0x89,0xE7,0x97,0x0E,0xA9,0xDB,0xB0,0x37,0xB3,0x0E, + 0x83,0x1D,0x36,0x97,0xC0,0x05,0x70,0x12,0xFC,0x03,0x54, + 0x82,0xB1,0xA0,0x3F,0xB8,0x41,0x7E,0x6B,0xEA,0x81,0x14, + 0xEB,0x81,0xF0,0xC9,0x76,0x70,0x9B,0x2C,0x19,0x5A,0xD0, + 0xC7,0xD8,0xF7,0x8A,0x7B,0x0A,0x48,0xE2,0x09,0x88,0x25, + 0x30,0xE8,0x46,0x96,0x81,0x26,0xB2,0xBC,0xAF,0xA0,0x4E, + 0x73,0x50,0x2B,0xEB,0x0A,0x88,0x25,0x20,0x96,0x80,0x24, + 0xCA,0x8C,0x28,0xCA,0x15,0x15,0x3B,0xFA,0x0B,0x0C,0x6C, + 0x2A,0xB9,0x0A,0x0E,0x82,0x17,0x40,0x3B,0xF9,0x6D,0xBA, + 0x0F,0x06,0x2B,0x08,0xB1,0x88,0x55,0xE0,0x46,0x59,0x36, + 0x94,0xA0,0xFE,0xD8,0xBA,0xD5,0xAD,0xC4,0x8A,0x99,0x83, + 0x59,0x71,0x9C,0x60,0xC4,0xBA,0x0A,0x1E,0x96,0xE5,0x7D, + 0x05,0x75,0xC6,0x1B,0xEA,0xFA,0x12,0x6B,0xC6,0xEA,0xFB, + 0xB9,0x81,0x4E,0x25,0x67,0xC1,0x24,0x70,0xAB,0xFC,0x76, + 0x9D,0x83,0xC1,0x0A,0x4A,0xAC,0x2F,0xC0,0x74,0x70,0x9D, + 0x2C,0x1D,0x78,0x50,0x7B,0x2C,0xF5,0xF5,0x51,0x79,0x67, + 0x31,0x27,0xEF,0x7B,0xAC,0x3C,0x76,0x30,0x62,0x11,0x07, + 0x81,0xFB,0x37,0x8C,0x09,0xCE,0xBF,0x0B,0x9C,0x91,0xF5, + 0x62,0x78,0x15,0x6B,0xCC,0xA2,0x61,0xE2,0xB5,0x77,0xFB, + 0x70,0x83,0x9B,0x0E,0xD4,0x82,0xEE,0xF2,0xDB,0xB6,0x0F, + 0x06,0x2A,0x28,0xB1,0x88,0xCF,0xC1,0x28,0xD0,0x58,0x96, + 0x0F,0x34,0xA8,0x1B,0x13,0x8B,0x78,0x73,0x5E,0x5F,0x56, + 0x1E,0x3B,0x2C,0xC4,0x22,0xA6,0xC8,0x2E,0x94,0x83,0x73, + 0xAF,0x03,0x35,0x86,0x5A,0x31,0xBC,0x8A,0x55,0xBC,0x25, + 0x8B,0x1B,0xD0,0x74,0xE2,0x28,0xE8,0x29,0xBF,0x7D,0xEB, + 0x60,0x90,0x82,0x14,0x8B,0xB8,0x04,0x7E,0x20,0xCB,0x07, + 0x1A,0xD4,0x8D,0x8B,0x75,0x7E,0x55,0x5B,0xB1,0x68,0xDA, + 0x30,0x56,0x20,0x2B,0x6C,0xC4,0x3A,0x0F,0xFA,0xC8,0x6E, + 0x94,0x82,0xF3,0x7E,0x62,0xA8,0x13,0xC7,0x8B,0x58,0x7F, + 0x2E,0xCB,0x16,0x1B,0xF7,0xB1,0x83,0x99,0x6E,0x1C,0x00, + 0xDF,0x92,0x6F,0x01,0x1F,0x0C,0x52,0xD0,0x62,0x11,0x67, + 0xC1,0x3D,0xB2,0x8B,0xC0,0x82,0x9A,0x71,0xB1,0x88,0x83, + 0xA5,0x3D,0x44,0x3E,0x23,0x90,0x15,0x36,0x62,0x11,0x5B, + 0x81,0xD2,0x6F,0x41,0x68,0xDF,0x0A,0xFC,0x47,0x9E,0x9F, + 0x80,0xAA,0x58,0x23,0x8B,0x72,0x44,0xD5,0xCE,0x7E,0xDC, + 0x20,0xA6,0x2B,0xA5,0xC0,0xFA,0x17,0x1F,0x0C,0x50,0x18, + 0x62,0x11,0x1F,0x82,0x3B,0x64,0x37,0x81,0x04,0xF5,0x12, + 0xC4,0xA2,0x0F,0xF2,0x6B,0x0A,0x06,0xB2,0x12,0x71,0x38, + 0x88,0xF5,0x05,0x78,0x5A,0x76,0xE5,0x18,0xB4,0xA5,0x39, + 0xAB,0x02,0x79,0xAE,0x09,0x55,0xB1,0x66,0xAF,0x1D,0xC4, + 0x0D,0x5E,0x3A,0x73,0x05,0xDC,0x2F,0xDF,0x0E,0x73,0x30, + 0x40,0x61,0x89,0x45,0xEC,0x04,0x2D,0x64,0x57,0xBE,0x83, + 0x5A,0x09,0x62,0x11,0xA7,0x56,0x64,0x88,0xB9,0x93,0x1F, + 0x60,0x45,0x4A,0xC6,0x41,0x2C,0xE2,0x63,0x90,0x21,0xBB, + 0xB3,0x0D,0xDA,0x0D,0x06,0x97,0xE5,0x79,0x26,0x54,0xC4, + 0x1A,0x5F,0x32,0x54,0xAC,0xDB,0x93,0xC9,0x0D,0x5E,0xBA, + 0x53,0x2D,0xDF,0x0E,0x73,0x30,0x38,0x61,0x8A,0x45,0xAC, + 0x06,0x81,0x4C,0x43,0xA0,0x8E,0x49,0x2C,0xE2,0x9D,0x05, + 0xBD,0x59,0x91,0x92,0x71,0x21,0x16,0xB1,0x5C,0x76,0x67, + 0x19,0xB4,0xB9,0x19,0xEC,0x34,0x9C,0x63,0x42,0x45,0xAC, + 0xA5,0x5B,0xEF,0xE5,0x06,0xAD,0x21,0x70,0x1E,0xF0,0x73, + 0x5C,0x18,0x98,0xB0,0xC5,0x22,0xE6,0x00,0xDF,0xD3,0x10, + 0xA8,0xC1,0x8A,0x75,0xB9,0xBA,0xB5,0x28,0x7D,0x71,0x08, + 0x2B,0x93,0x11,0x97,0x62,0x7D,0x0E,0xBE,0x2F,0xBB,0x64, + 0x83,0xD7,0xC7,0x19,0xDA,0xB3,0xB8,0x15,0x6B,0x72,0xE5, + 0x60,0x6E,0xC0,0x1A,0x12,0x3F,0x93,0x6F,0x4B,0x62,0x30, + 0x30,0x51,0x88,0x45,0x73,0x5C,0x63,0x80,0xAF,0x69,0x08, + 0x9C,0xCF,0x8A,0x45,0x1C,0x5D,0xDA,0x55,0x14,0x4C,0xB2, + 0x9F,0xDB,0x72,0x29,0x16,0xB1,0x1F,0xB0,0x73,0x5B,0x38, + 0xDE,0x0D,0x9C,0x95,0xED,0x2C,0x71,0x23,0xD6,0xE8,0x05, + 0x39,0xA2,0x66,0x57,0x5F,0x6E,0xB0,0x1A,0x12,0xC5,0xF2, + 0xAD,0x49,0x0C,0x06,0x25,0x0A,0xB1,0x88,0xCB,0xE0,0x71, + 0xD9,0xAD,0xA7,0xE0,0x7C,0x4B,0xB1,0xE8,0x83,0xFC,0xBA, + 0xB9,0xF7,0xB2,0x42,0xD5,0xA3,0x20,0x16,0x91,0x07,0x12, + 0xFE,0x43,0xC0,0xD7,0x4D,0x41,0xB5,0x7C,0xDD,0x16,0x37, + 0x62,0xCD,0x5B,0x3F,0x90,0x1B,0x28,0x23,0xFF,0x06,0xFB, + 0x02,0xE6,0x30,0xA0,0x75,0x41,0x5A,0xB2,0xE1,0xFA,0x54, + 0x65,0x17,0x30,0xFF,0x76,0x88,0x41,0x89,0x4A,0x2C,0x82, + 0xA6,0x21,0x06,0xC9,0xAE,0x95,0x83,0x73,0x2D,0xC5,0x22, + 0xCE,0xAC,0x6C,0x2F,0x0A,0xFF,0x92,0xCB,0x4A,0x45,0x28, + 0x8A,0x75,0x0E,0x64,0xCA,0xAE,0x63,0xC1,0xD7,0x8F,0x03, + 0xFA,0xA7,0x92,0x6B,0x9F,0x80,0x93,0x58,0x7F,0x58,0x32, + 0x44,0x6C,0x78,0xCF,0xF1,0x03,0xFB,0x0F,0x41,0xB3,0x10, + 0xA0,0x3B,0x19,0x32,0xC1,0x54,0x40,0x9F,0x93,0xB8,0xBE, + 0xDD,0xF2,0x11,0x30,0xAF,0x13,0x63,0x40,0xA2,0x14,0x8B, + 0x38,0x06,0xBA,0xCA,0xEE,0x95,0x82,0xF3,0x6C,0xC5,0x22, + 0xF6,0x2C,0xB6,0x5E,0xA4,0x56,0x14,0x8B,0x78,0x03,0x5C, + 0x4F,0x7D,0xE3,0x4F,0x9A,0xB3,0xFA,0x97,0x3C,0xEE,0x88, + 0x9D,0x58,0x23,0x0A,0x5D,0x2F,0x32,0x87,0x32,0xD1,0x6C, + 0x0C,0xFA,0xA0,0xBB,0x18,0x3E,0x35,0xF4,0xA9,0x0A,0xDD, + 0x1D,0x61,0xFE,0x00,0x8F,0xC1,0x88,0x5A,0x2C,0xE2,0x5D, + 0xD0,0x52,0x5E,0x82,0xEB,0xE0,0x1C,0x47,0xB1,0xAE,0x54, + 0xB7,0x12,0xE5,0x33,0xF8,0x45,0x6A,0x0F,0x62,0xD1,0xDC, + 0xD6,0x53,0x80,0xE6,0xAC,0x66,0xCB,0x63,0xAE,0xB0,0x13, + 0xEB,0xC5,0x6A,0xD7,0x8B,0xCC,0xA1,0x8B,0x45,0x41,0x3F, + 0xA3,0x92,0xFA,0x55,0x81,0x6E,0xBD,0x31,0x2F,0xF1,0x60, + 0x30,0x52,0x21,0x16,0xF1,0x2A,0xB8,0x59,0x5E,0x86,0xAB, + 0xA0,0xBD,0xA3,0x58,0xC4,0x89,0xB2,0xCE,0x62,0x36,0xB3, + 0x48,0xED,0x41,0x2C,0xE2,0x24,0x78,0x0C,0x58,0xCE,0x59, + 0x71,0x58,0x89,0x45,0x8B,0xCC,0x6B,0x77,0xBB,0x5E,0x64, + 0x8E,0x4A,0x2C,0xBA,0xD1,0xEF,0x9C,0xA1,0x5F,0x15,0xE8, + 0xB3,0x9A,0x79,0x39,0x0C,0x03,0x91,0x2A,0xB1,0x88,0x22, + 0xE0,0xFA,0xAE,0x45,0xB4,0x75,0x25,0x16,0xF1,0xC6,0xCB, + 0xFD,0x82,0x12,0x8B,0xA0,0x1B,0x03,0xB9,0xE3,0x96,0x58, + 0x89,0xB5,0x68,0xB3,0xD2,0x22,0x73,0x54,0x62,0xDD,0x04, + 0xE8,0x43,0x3D,0x77,0x0D,0x4E,0xA4,0xA5,0x58,0x34,0x0D, + 0xF1,0x3B,0xE0,0x6A,0x1A,0x02,0xED,0x5C,0x8B,0x15,0x5B, + 0xA4,0x9E,0x9A,0xB8,0x48,0xED,0x43,0x2C,0x65,0x38,0xB1, + 0x26,0x2E,0x57,0x5E,0x64,0x8E,0x4A,0xAC,0x1B,0xC0,0x5E, + 0x43,0xBF,0x2A,0xA4,0xA5,0x58,0xC4,0x55,0xF0,0x53,0x79, + 0x39,0xB6,0x41,0x3B,0xD7,0x62,0x11,0x07,0x5E,0xB9,0x2B, + 0x61,0x91,0x3A,0x95,0x62,0x8D,0x9C,0x9F,0x23,0x56,0xBE, + 0xA3,0xBC,0xC8,0xFC,0xB5,0x16,0xEB,0x34,0x73,0x4C,0x95, + 0x73,0x20,0x5B,0x5E,0x92,0x65,0xD0,0x46,0x49,0x2C,0x9A, + 0xDB,0xAA,0xCE,0x1F,0x94,0x16,0x62,0xE5,0xBF,0x7A,0x1F, + 0x37,0x28,0x4E,0x7C,0xAD,0xC5,0x1A,0x07,0x6A,0x93,0x8E, + 0x79,0xE1,0x38,0xB0,0x7D,0x72,0x06,0xAF,0x2B,0x89,0x45, + 0x7C,0x5A,0xD1,0x31,0xBE,0x48,0x9D,0x2A,0xB1,0x9E,0x2B, + 0xF6,0xBC,0xC8,0x1C,0xA5,0x58,0xFB,0x0D,0xFD,0xAA,0x10, + 0x9A,0x58,0xBF,0x06,0x9D,0xC0,0x51,0xC3,0x31,0xAF,0xEC, + 0x03,0xAD,0xE5,0xA5,0x99,0x82,0xD7,0x94,0xC5,0x22,0xDE, + 0x9A,0xFF,0xE5,0x22,0x75,0x2A,0xC4,0x1A,0x5E,0x98,0x2B, + 0x96,0x78,0x5F,0x64,0x8E,0x4A,0xAC,0xDB,0xC0,0x29,0x43, + 0xBF,0x2A,0x84,0x27,0x96,0xAC,0x33,0x00,0x9C,0x32,0x1C, + 0xF7,0xCA,0x26,0xF0,0x8D,0xD8,0xC5,0x25,0x05,0xC7,0x3D, + 0x89,0x75,0xA9,0xAA,0x8D,0x28,0x9D,0x3E,0x24,0x25,0x62, + 0xE5,0xAD,0xF8,0x2E,0x37,0x18,0x6E,0x89,0x4A,0xAC,0x01, + 0x80,0xE6,0xA3,0xB8,0x6B,0x70,0x22,0x5C,0xB1,0x28,0xF8, + 0xFB,0xA3,0x80,0x6E,0x4D,0xE6,0xDA,0xA9,0xB0,0x18,0x98, + 0xA6,0x21,0x70,0xCC,0x93,0x58,0xC4,0x87,0x4B,0xBB,0x89, + 0xC9,0xF9,0xE3,0x58,0x09,0xC2,0x80,0xC4,0x7A,0x76,0xE1, + 0xA3,0x62,0x4D,0xAD,0xAF,0x45,0xE6,0xD0,0xC5,0x42,0x1F, + 0x8D,0x41,0x81,0xA1,0x4F,0x55,0x22,0x11,0xAB,0x31,0x18, + 0x0D,0xE8,0xA1,0x0A,0xAE,0xAD,0x5B,0x68,0x1A,0x62,0x02, + 0x48,0x98,0x86,0xC0,0xD7,0x9E,0xC5,0x8A,0x3D,0x36,0x56, + 0xF2,0x24,0x2B,0x41,0x18,0x90,0x58,0x2F,0xAF,0x7F,0x88, + 0x1B,0x08,0x15,0xA2,0x10,0xAB,0x17,0xF8,0xCC,0xD0,0xA7, + 0x2A,0xF4,0x93,0xEE,0x3B,0xB2,0xDC,0xB5,0xE0,0x4D,0x0F, + 0x4C,0xAC,0xFA,0xE0,0xD8,0xCC,0xA4,0x36,0x5E,0xA0,0x69, + 0x88,0x5F,0x80,0xB8,0x5C,0xF8,0xBB,0x2F,0xB1,0xCA,0x8B, + 0x9F,0x62,0x25,0x08,0x03,0x12,0x6B,0xEE,0xBA,0xF4,0x15, + 0x0B,0xB5,0x9B,0x80,0xBE,0xE0,0x88,0xEC,0xCB,0x2B,0xA1, + 0xAD,0x15,0x72,0x62,0x5D,0x0F,0xE8,0x01,0x56,0xAE,0xBD, + 0x0A,0x34,0x0D,0x91,0x23,0xCB,0xFA,0x12,0xEB,0xF0,0x92, + 0xEE,0x91,0xFF,0x53,0x38,0x6A,0xE1,0x63,0xA2,0xFA,0xEF, + 0xBE,0x1E,0x90,0x98,0x0B,0x7E,0x13,0x02,0xE3,0xC1,0x2A, + 0x70,0x11,0x70,0xFD,0xAA,0x70,0x1C,0xDC,0x22,0x87,0xE8, + 0x5A,0xF0,0xA6,0x07,0x2E,0x16,0x05,0xC7,0xBF,0x09,0x76, + 0x18,0xDA,0x79,0xE5,0x13,0x10,0xFB,0x51,0x8B,0x3F,0x3D, + 0x89,0x75,0xA1,0xAA,0xAD,0x28,0x9E,0x36,0x34,0x25,0x1F, + 0xDE,0x5F,0x28,0xCF,0xE6,0x06,0xE3,0xAB,0xC4,0x5B,0xC0, + 0xBC,0x72,0x82,0x37,0x3E,0x14,0xB1,0x28,0x78,0xAD,0x33, + 0xF8,0xC0,0xD0,0xD6,0x2B,0x07,0x40,0x6B,0xE0,0x49,0xAC, + 0x6D,0x85,0x7D,0x52,0x3A,0x8F,0xF5,0xCA,0xDF,0x1A,0xEC, + 0x3D,0xED,0x6E,0x98,0x25,0x87,0x3B,0x31,0x78,0xE3,0x43, + 0x13,0x8B,0x82,0xD7,0xFB,0x00,0xFA,0xA9,0xC3,0x9D,0xAB, + 0xC2,0x9B,0x60,0x62,0xD2,0x31,0x47,0x4E,0x56,0x74,0x8A, + 0x3F,0x8E,0x9F,0x2A,0xB1,0xC6,0x2D,0x1E,0x26,0x5E,0x4F, + 0xDF,0xC7,0xE6,0xFD,0xC2,0x3F,0x1F,0x80,0x37,0x3F,0x54, + 0xB1,0x28,0x68,0xF3,0x30,0x08,0x62,0x1A,0xE2,0x0C,0x73, + 0xCC,0x12,0xBA,0x37,0x6B,0xE5,0xCC,0xFB,0x62,0x52,0xA5, + 0x52,0x2C,0x62,0xD6,0x1A,0x4F,0x4B,0x3A,0xE9,0x0E,0xDD, + 0xE2,0xCC,0xEF,0x7B,0x81,0x01,0x08,0x5D,0x2C,0x0A,0xDA, + 0x3D,0x0D,0xE8,0x37,0x3D,0xAE,0x46,0x28,0xBC,0x5F,0x72, + 0x77,0x5C,0xAA,0x54,0x8B,0x35,0xB2,0x28,0x57,0x54,0xBE, + 0x9D,0xF2,0xAD,0x89,0x82,0x66,0xB6,0x1C,0x5E,0x73,0x30, + 0x00,0x51,0x89,0xD5,0x04,0x4C,0x05,0x34,0x47,0xC5,0xD5, + 0x09,0x94,0x73,0xAB,0xDA,0x89,0x05,0x53,0x73,0xD2,0x46, + 0x2C,0x62,0xC2,0x32,0xBA,0x6D,0xA6,0x41,0x3E,0x98,0xCA, + 0x41,0x73,0x5F,0xDD,0xE4,0xF0,0x9A,0x83,0x41,0x88,0x44, + 0x2C,0x0A,0xDA,0x36,0x03,0xCB,0x0D,0xE7,0x86,0xC6,0xE6, + 0x97,0xFA,0x27,0x48,0xE5,0x53,0xAC,0x0B,0xCC,0x31,0x5B, + 0x38,0xB1,0x88,0x05,0x1B,0x07,0x70,0x83,0xD4,0x10,0xA1, + 0x0D,0xD9,0xAC,0xEF,0xA3,0xC3,0x20,0x44,0x26,0x16,0x05, + 0xED,0x6F,0x01,0x5B,0x0D,0xE7,0x07,0xCE,0x7F,0x97,0xDF, + 0x21,0x0A,0x82,0xBB,0x35,0xF9,0x18,0x78,0x08,0xD0,0x16, + 0x90,0xDC,0xEB,0x2C,0x56,0x62,0xFD,0x76,0x61,0x8E,0x58, + 0xBB,0xBB,0xC1,0x3F,0x4B,0xB8,0x03,0xB0,0xEB,0xB9,0xF1, + 0x60,0x20,0x22,0x15,0x8B,0x82,0x73,0xDA,0x83,0x83,0x86, + 0x1A,0x81,0x41,0x4F,0x45,0x2F,0xFB,0x6B,0xB6,0x49,0x2A, + 0x8F,0x62,0xD1,0xA3,0x5E,0x3F,0x07,0xF4,0x30,0xC5,0x74, + 0x79,0xCC,0x15,0x56,0x62,0x11,0x53,0x57,0x35,0xE8,0xA7, + 0x9F,0x0F,0x81,0x2E,0x72,0x28,0xAD,0x83,0xC1,0x88,0x5C, + 0x2C,0x0A,0xCE,0xEB,0x0D,0x3E,0x36,0xD4,0x09,0x84,0x5D, + 0x8B,0x7A,0xB1,0x52,0x11,0x1E,0xC4,0x5A,0x0F,0x9A,0xD2, + 0xF5,0xE2,0xCF,0xDB,0xC1,0x61,0x79,0xDC,0x11,0x3B,0xB1, + 0xE8,0x56,0x9A,0xB2,0x6D,0xF7,0x70,0x83,0x96,0xEE,0xD0, + 0x8E,0x7E,0xEE,0x76,0x10,0xC2,0x60,0xA4,0x44,0x2C,0x0A, + 0xCE,0x7D,0x10,0x9C,0x37,0xD4,0xF2,0xC5,0xE9,0xCA,0x0E, + 0x62,0x5E,0x70,0x0F,0xAC,0xD2,0xD6,0x8F,0x09,0x8F,0x35, + 0xE1,0xEB,0x47,0x00,0xED,0x5B,0xCA,0xB5,0x4F,0xC0,0x4E, + 0x2C,0xE2,0xF7,0xA5,0x43,0xC5,0x7A,0xE7,0x07,0x56,0xD3, + 0x05,0xDA,0x83,0x74,0x0A,0x68,0x2E,0xDF,0x0A,0xE7,0x60, + 0x40,0x52,0x26,0x16,0x05,0xE7,0xFF,0x0A,0xD0,0xB6,0xDE, + 0x5C,0x6D,0xD7,0xD0,0x22,0xF3,0x6B,0xB3,0x07,0xB0,0x42, + 0xD5,0xA3,0x28,0xD6,0xF3,0xF2,0x12,0xE3,0xC1,0x31,0xDA, + 0x16,0xB2,0xDC,0xD0,0xC6,0x12,0x27,0xB1,0x88,0x97,0xD6, + 0x39,0x3E,0x62,0x9F,0x4A,0x68,0xFF,0xAB,0x7F,0x82,0x69, + 0x40,0xFD,0x01,0x63,0x0C,0x4A,0xAA,0xC5,0xA2,0x5B,0x6D, + 0x26,0x01,0x5F,0xD3,0x10,0x1F,0x2C,0xB9,0xD3,0x71,0x77, + 0x3F,0x05,0xB1,0xF6,0x00,0xF6,0xC3,0x29,0x8E,0x77,0x02, + 0xA7,0x65,0x3B,0x4B,0xDC,0x88,0xF5,0xEC,0xFC,0x1C,0xB1, + 0xDA,0xFE,0x7E,0xAD,0x4D,0xA0,0x24,0x42,0xE8,0xBE,0xAC, + 0x09,0xE0,0x09,0xD0,0x13,0x78,0xDF,0x7E,0x0A,0x83,0x92, + 0x52,0xB1,0x28,0xA8,0xD1,0x14,0x94,0x1A,0x6A,0x2A,0x71, + 0xB1,0xAA,0x8D,0x28,0x99,0x1E,0xD8,0x36,0x46,0xF4,0x0C, + 0xE1,0x03,0xF2,0xD2,0xD8,0xE0,0xF5,0x11,0x86,0xF6,0x2C, + 0x6E,0xC4,0x22,0xF2,0x2A,0x6C,0xEF,0x30,0x8D,0xE4,0x0E, + 0xD2,0x50,0x82,0x81,0x49,0xB9,0x58,0x14,0xD4,0x69,0x0E, + 0xB6,0x18,0xEA,0xBA,0x66,0x47,0x51,0x26,0x2B,0x52,0x32, + 0x2E,0xC5,0x5A,0x2C,0x2F,0xC9,0x32,0x68,0x73,0x23,0xD8, + 0x66,0x38,0xC7,0x84,0x5B,0xB1,0x08,0x9B,0x45,0x6A,0x2D, + 0x56,0x10,0x41,0xAD,0x36,0x60,0xAF,0xA1,0xB6,0x23,0x9F, + 0x54,0x74,0x14,0x73,0x82,0xDB,0x2A,0x92,0xE6,0xAC,0xDA, + 0xCA,0xCB,0xB1,0x0D,0xDA,0x0D,0x04,0x96,0x73,0x5B,0x2A, + 0x62,0x7D,0xF9,0x14,0x0F,0xBB,0x48,0xAD,0xC5,0x0A,0x2A, + 0xA8,0xF7,0x6D,0x70,0xC2,0x50,0xDF,0x12,0x5A,0x64,0xAE, + 0x9A,0x75,0x6D,0x91,0xD9,0x09,0x07,0xB1,0x68,0xCE,0xEA, + 0x97,0xF2,0x32,0x1C,0x83,0xB6,0x34,0xB7,0x35,0x43,0x9E, + 0x6B,0x42,0x45,0x2C,0x22,0xBF,0x86,0x5D,0xA4,0xD6,0x62, + 0x05,0x19,0xD4,0x1C,0x0A,0x1C,0xA7,0x21,0xF6,0x27,0x3D, + 0xE9,0xEC,0x84,0x83,0x58,0x1B,0x41,0x6C,0xCB,0x22,0xB7, + 0x41,0x7B,0x9A,0xDB,0x3A,0x22,0xCF,0x4F,0x40,0x55,0x2C, + 0xDA,0x8E,0x7B,0xE5,0xDB,0xA6,0xBB,0x4D,0xB5,0x58,0x41, + 0x07,0x75,0x9F,0x00,0x57,0x0C,0xFD,0x24,0x40,0x8B,0xCC, + 0x0B,0x93,0xF6,0x66,0x70,0xC2,0x46,0xAC,0xCF,0x40,0x2F, + 0xD9,0xB5,0x52,0x70,0xDE,0x8F,0x00,0x6D,0x77,0x94,0x50, + 0x53,0x55,0x2C,0xE2,0x4F,0xE6,0x45,0x6A,0x2D,0x56,0xD0, + 0x41,0x5D,0x9A,0x86,0xA0,0x27,0x75,0xD8,0x27,0x7E,0xB6, + 0x30,0xBB,0xC9,0x38,0x61,0x23,0xD6,0x44,0xD9,0xAD,0x72, + 0x70,0x6E,0x13,0x50,0x69,0xA8,0x15,0xC3,0x8B,0x58,0xC4, + 0xA2,0xCD,0x09,0x8B,0xD4,0x5A,0xAC,0x30,0x82,0xDA,0x34, + 0x0D,0x41,0x5B,0x1D,0x25,0xF4,0x79,0xBC,0xAC,0x0B,0xBB, + 0xFF,0x95,0x13,0x16,0x62,0xED,0x03,0xF6,0x0B,0xAA,0x0E, + 0xC1,0xF9,0x5D,0xC1,0x29,0x59,0x2F,0x86,0x57,0xB1,0xC6, + 0xC4,0x16,0xA9,0xE3,0x1F,0xE4,0xB5,0x58,0x61,0x05,0xF5, + 0x69,0x1A,0x82,0x9E,0x8E,0x8E,0xF5,0x77,0xA5,0xBA,0xB5, + 0x28,0xB3,0xD8,0xB1,0xCF,0x09,0x46,0x2C,0xC7,0x39,0x2B, + 0xB7,0x41,0x9D,0xD1,0x86,0xBA,0x9E,0xC5,0x22,0xA6,0x57, + 0xC5,0x77,0xFC,0xD3,0x62,0x85,0x19,0xF4,0xD1,0x02,0xEC, + 0xA6,0xFE,0x76,0x2F,0xB6,0x5E,0x64,0x76,0x82,0x11,0xAB, + 0x04,0x04,0xF5,0x3F,0xC2,0xBC,0x09,0x6C,0x97,0x75,0x7D, + 0x89,0x45,0x7B,0x94,0x96,0x6F,0x8F,0x2D,0x52,0x37,0x68, + 0xB1,0x36,0xD0,0x80,0xF9,0xE0,0x49,0x59,0x2A,0xD4,0xA0, + 0x9F,0x1E,0xFF,0xAB,0xEC,0x70,0xAC,0x70,0x8A,0xF5,0x22, + 0xB3,0x13,0x49,0x62,0x1D,0x07,0xED,0x65,0xF9,0x40,0x82, + 0x7A,0x83,0xC0,0x25,0xAA,0xEF,0x47,0x2C,0xE2,0x8F,0x4B, + 0x86,0x88,0x9A,0xDA,0xBE,0x8F,0xC8,0xD2,0x0D,0x2F,0x18, + 0xB0,0x96,0x20,0xC3,0x07,0xBE,0x3E,0x9F,0xA8,0x64,0xE7, + 0x82,0xDE,0x2D,0x20,0x48,0x86,0x57,0x20,0x56,0x06,0x06, + 0xBD,0x9E,0x56,0xB2,0x6C,0x60,0x41,0x4D,0x9A,0xDB,0x6A, + 0x47,0xF5,0x21,0x56,0x06,0xC4,0xCA,0x80,0x24,0x9E,0x18, + 0x5E,0x98,0x9B,0x51,0xB4,0x61,0x80,0xD2,0x1E,0xAD,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A, + 0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x5F,0xA1,0x34,0x6A, + 0xF4,0x7F,0x22,0xD6,0x8B,0x04,0x46,0x7A,0x17,0x48,0x00, + 0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82, + +}; diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/example.pmp b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/example.pmp new file mode 100644 index 0000000..93cf1fd Binary files /dev/null and b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/example.pmp differ diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/example_data.h b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/example_data.h new file mode 100644 index 0000000..dd87c4a --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/example_data.h @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - Example Application Data + */ + +#include "data_html_index.h" +#include "data_img_logo.h" +#include "data_img_fmstrlogo.h" +#include "data_img_file.h" +#include "data_example_pmp.h" diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/freemaster_example.c b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/freemaster_example.c new file mode 100644 index 0000000..b32717e --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/freemaster_example.c @@ -0,0 +1,685 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - Example Application Code + */ + +#include +#include + +#include "freemaster.h" +#include "freemaster_example.h" + +/**************************************************************************** + * + * Default configuration of FreeMASTER demo + * + */ + +/* Demo application configuration. Enough ROM resources by default, + * but not really large ROM by default (storing images and other active content) */ +#ifndef FMSTR_DEMO_ENOUGH_ROM +#define FMSTR_DEMO_ENOUGH_ROM 1 +#endif +#ifndef FMSTR_DEMO_LARGE_ROM +#define FMSTR_DEMO_LARGE_ROM 0 +#endif + +/* in LARGE_ROM is defined, then also enable ENOUGH_ROM option */ +#if FMSTR_DEMO_LARGE_ROM && !(FMSTR_DEMO_ENOUGH_ROM) +#warning Probably wrong demo application settings +#undef FMSTR_DEMO_ENOUGH_ROM +#define FMSTR_DEMO_ENOUGH_ROM 1 +#endif + +/* Platform configuration for demo application */ +#ifndef FMSTR_DEMO_SUPPORT_I64 +#define FMSTR_DEMO_SUPPORT_I64 1 /* support for long long type */ +#endif +#ifndef FMSTR_DEMO_SUPPORT_FLT +#define FMSTR_DEMO_SUPPORT_FLT 1 /* support for float type */ +#endif +#ifndef FMSTR_DEMO_SUPPORT_DBL +#define FMSTR_DEMO_SUPPORT_DBL 1 /* support for double type */ +#endif + +/**************************************************************************** + * + * Test variables, will be displayed in the FreeMASTER application + * + */ + +#define ARR_SIZE 10 +#define ARR_SIZE_FLT 10 +#define ARR_SIZE_DBL 10 + +volatile unsigned char var8; +volatile unsigned char var8rw; +volatile unsigned char var8inc = 1; +volatile unsigned short var16; +volatile unsigned short var16rw; +volatile unsigned short var16inc = 1; +volatile unsigned short var16prv; +volatile unsigned long var32; +volatile unsigned long var32rw; +volatile unsigned long var32inc = 100; + +volatile unsigned char frac8; +volatile unsigned short frac16; +volatile unsigned long frac32; + +volatile unsigned char ufrac8; +volatile unsigned short ufrac16; +volatile unsigned long ufrac32; + +volatile unsigned char *var8ptr = &var8; +volatile unsigned short *var16ptr = &var16; +volatile unsigned long *var32ptr = &var32; + +volatile unsigned short arr_size = ARR_SIZE; +volatile unsigned char arr8[ARR_SIZE]; +volatile unsigned short arr16[ARR_SIZE]; +volatile unsigned long arr32[ARR_SIZE]; + +#if FMSTR_DEMO_SUPPORT_I64 +volatile unsigned long long var64; +volatile unsigned long long var64rw; +volatile unsigned long long var64inc = 10000; +volatile unsigned long long arr64[ARR_SIZE]; +volatile unsigned long long frac64; +volatile unsigned long long ufrac64; +#endif + +#if FMSTR_DEMO_SUPPORT_FLT +volatile float varFLT; +volatile float varFLTrw; +volatile float varFLTinc = 1.0; +volatile float arrFLT[ARR_SIZE_FLT]; +volatile unsigned int arrFLT_size = ARR_SIZE_FLT; +#endif + +#if FMSTR_DEMO_SUPPORT_DBL +volatile double varDBL; +volatile double varDBLrw; +volatile double varDBLinc = 1.0; +volatile double arrDBL[ARR_SIZE_DBL]; +volatile unsigned int arrDBL_size = ARR_SIZE_DBL; +#endif + +/* count received application commands, just for test purposes */ +volatile unsigned char nAppCmdCounter; + +/**************************************************************************** + * + * Test structure types - demonstrates the "TSA" feature thanks to which the + * FreeMASTER is able to load a variable and type information directly from + * the embedded application. + * + */ + +typedef enum +{ + EXAMPLE_ENUM_FIRST_ENTRY, + EXAMPLE_ENUM_SECOND_ENTRY, + EXAMPLE_ENUM_THIRD_ENTRY, +} EXAMPLE_ENUM; + +typedef enum +{ + SPEED_ZERO = 0, + SPEED_FAST = 1, + SPEED_NORMAL = 20, + SPEED_SLOW = 200, +} INCREMENT_SPEED; + +typedef struct +{ + unsigned short aa; + unsigned long bb[2]; + unsigned short cc; + unsigned long dd[3]; + unsigned char ee; + unsigned char ff[5]; +} INNER_STRUCT; + +typedef struct +{ + unsigned short a; + unsigned long b; + INNER_STRUCT inA[4]; + INNER_STRUCT inB; +} OUTER_STRUCT; + +/**************************************************************************** + * + * Test variables which make use of the user-defined data types. You are able + * to display the variables including the member items in FreeMASTER. + * + */ + +volatile OUTER_STRUCT so1, so2; +volatile INNER_STRUCT si1, si2; +volatile EXAMPLE_ENUM varENUM; +volatile INCREMENT_SPEED varIncSpeed; + +/**************************************************************************** + * Local prototypes + */ +FMSTR_APPCMD_RESULT my_appcmd_handler(FMSTR_APPCMD_CODE nAppcmd, FMSTR_APPCMD_PDATA pData, FMSTR_SIZE nDataLen); +void my_pipe_handler(FMSTR_HPIPE hpipe); +void my_pipe_math(FMSTR_HPIPE hpipe); + +// clang-format off + +/**************************************************************************** + * + * With TSA enabled, the user describes the global and static variables using + * so-called TSA tables. There can be any number of tables defined in + * the project files. Each table does have the identifier which should be + * unique across the project. + * + * Note that you can declare variables as Read-Only or Read-Write. + * The FreeMASTER driver denies any write access to the Read-Only variables + * when TSA_SAFETY is enabled. + */ + +FMSTR_TSA_TABLE_BEGIN(first_table) + FMSTR_TSA_RO_VAR(var8, FMSTR_TSA_UINT8) + FMSTR_TSA_RW_VAR(arr8, FMSTR_TSA_UINT8) + FMSTR_TSA_RW_VAR(var8rw, FMSTR_TSA_UINT8) + FMSTR_TSA_RW_VAR(var8inc, FMSTR_TSA_UINT8) + + FMSTR_TSA_RO_VAR(var16, FMSTR_TSA_UINT16) + FMSTR_TSA_RW_VAR(arr16, FMSTR_TSA_UINT16) + FMSTR_TSA_RW_VAR(var16rw, FMSTR_TSA_UINT16) + FMSTR_TSA_RW_VAR(var16inc, FMSTR_TSA_UINT16) + + FMSTR_TSA_RO_VAR(var32, FMSTR_TSA_UINT32) + FMSTR_TSA_RW_VAR(arr32, FMSTR_TSA_UINT32) + FMSTR_TSA_RW_VAR(var32rw, FMSTR_TSA_UINT32) + FMSTR_TSA_RW_VAR(var32inc, FMSTR_TSA_UINT32) + + FMSTR_TSA_RO_VAR(var8ptr, FMSTR_TSA_POINTER) + FMSTR_TSA_RO_VAR(var16ptr, FMSTR_TSA_POINTER) + FMSTR_TSA_RO_VAR(var32ptr, FMSTR_TSA_POINTER) + + FMSTR_TSA_RW_VAR(frac8, FMSTR_TSA_FRAC_Q(0, 7)) + FMSTR_TSA_RW_VAR(frac16, FMSTR_TSA_FRAC_Q(3, 12)) + FMSTR_TSA_RW_VAR(frac32, FMSTR_TSA_FRAC_Q(12, 19)) + + FMSTR_TSA_RW_VAR(ufrac8, FMSTR_TSA_UFRAC_UQ(1, 7)) + FMSTR_TSA_RW_VAR(ufrac16, FMSTR_TSA_UFRAC_UQ(4, 12)) + FMSTR_TSA_RW_VAR(ufrac32, FMSTR_TSA_UFRAC_UQ(13, 19)) + +#if FMSTR_DEMO_SUPPORT_I64 + FMSTR_TSA_RO_VAR(var64, FMSTR_TSA_UINT64) + FMSTR_TSA_RW_VAR(arr64, FMSTR_TSA_UINT64) + FMSTR_TSA_RW_VAR(var64rw, FMSTR_TSA_UINT64) + FMSTR_TSA_RW_VAR(var64inc, FMSTR_TSA_UINT64) + FMSTR_TSA_RW_VAR(frac64, FMSTR_TSA_FRAC_Q(8, 55)) + FMSTR_TSA_RW_VAR(ufrac64, FMSTR_TSA_UFRAC_UQ(9, 55)) +#endif + +#if FMSTR_DEMO_SUPPORT_FLT + FMSTR_TSA_RO_VAR(varFLT, FMSTR_TSA_FLOAT) + FMSTR_TSA_RW_VAR(varFLTrw, FMSTR_TSA_FLOAT) + FMSTR_TSA_RW_VAR(arrFLT, FMSTR_TSA_FLOAT) + FMSTR_TSA_RW_VAR(varFLTinc, FMSTR_TSA_FLOAT) + FMSTR_TSA_RO_VAR(arrFLT_size, FMSTR_TSA_UINT32) +#endif + +#if FMSTR_DEMO_SUPPORT_DBL + FMSTR_TSA_RO_VAR(varDBL, FMSTR_TSA_DOUBLE) + FMSTR_TSA_RW_VAR(arrDBL, FMSTR_TSA_DOUBLE) + FMSTR_TSA_RW_VAR(varDBLrw, FMSTR_TSA_DOUBLE) + FMSTR_TSA_RW_VAR(varDBLinc, FMSTR_TSA_DOUBLE) + FMSTR_TSA_RO_VAR(arrDBL_size, FMSTR_TSA_UINT32) +#endif + + FMSTR_TSA_RO_VAR(arr_size, FMSTR_TSA_UINT16) + + FMSTR_TSA_RO_VAR(nAppCmdCounter, FMSTR_TSA_UINT8) + + FMSTR_TSA_RW_VAR(so1, FMSTR_TSA_USERTYPE(OUTER_STRUCT)) + FMSTR_TSA_RW_VAR(si1, FMSTR_TSA_USERTYPE(INNER_STRUCT)) + FMSTR_TSA_RW_VAR(varENUM, FMSTR_TSA_USERTYPE(EXAMPLE_ENUM)) + FMSTR_TSA_RW_VAR(varIncSpeed, FMSTR_TSA_USERTYPE(INCREMENT_SPEED)) + + FMSTR_TSA_STRUCT(OUTER_STRUCT) + FMSTR_TSA_MEMBER(OUTER_STRUCT, a, FMSTR_TSA_UINT16) + FMSTR_TSA_MEMBER(OUTER_STRUCT, b, FMSTR_TSA_UINT32) + FMSTR_TSA_MEMBER(OUTER_STRUCT, inA, FMSTR_TSA_USERTYPE(INNER_STRUCT)) + FMSTR_TSA_MEMBER(OUTER_STRUCT, inB, FMSTR_TSA_USERTYPE(INNER_STRUCT)) + + FMSTR_TSA_STRUCT(INNER_STRUCT) + FMSTR_TSA_MEMBER(INNER_STRUCT, aa, FMSTR_TSA_UINT16) + FMSTR_TSA_MEMBER(INNER_STRUCT, bb, FMSTR_TSA_UINT32) + FMSTR_TSA_MEMBER(INNER_STRUCT, cc, FMSTR_TSA_SINT16) + FMSTR_TSA_MEMBER(INNER_STRUCT, dd, FMSTR_TSA_SINT32) + FMSTR_TSA_MEMBER(INNER_STRUCT, ee, FMSTR_TSA_UINT8) + FMSTR_TSA_MEMBER(INNER_STRUCT, ff, FMSTR_TSA_SINT8) + + FMSTR_TSA_ENUM(EXAMPLE_ENUM) + FMSTR_TSA_CONST(EXAMPLE_ENUM_FIRST_ENTRY) + FMSTR_TSA_CONST(EXAMPLE_ENUM_SECOND_ENTRY) + FMSTR_TSA_CONST(EXAMPLE_ENUM_THIRD_ENTRY) + + FMSTR_TSA_ENUM(INCREMENT_SPEED) + FMSTR_TSA_CONST(SPEED_ZERO) + FMSTR_TSA_CONST(SPEED_FAST) + FMSTR_TSA_CONST(SPEED_NORMAL) + FMSTR_TSA_CONST(SPEED_SLOW) + +FMSTR_TSA_TABLE_END() + +/**************************************************************************** + * + * This is an example of another TSA table. Typically, you put one table + * to each .c file where your global or static variables are instantiated. + */ + +FMSTR_TSA_TABLE_BEGIN(next_table) + FMSTR_TSA_RO_VAR(so2, FMSTR_TSA_USERTYPE(OUTER_STRUCT)) + FMSTR_TSA_RO_VAR(si2, FMSTR_TSA_USERTYPE(INNER_STRUCT)) +FMSTR_TSA_TABLE_END() + +/**************************************************************************** + * + * Another TSA table with specific information about in-memory files, + * project files and related web-links. This feature requires FreeMASTER + * version 2.0 or later running on the PC Host to make use of this "Active Content" + */ + +/* Uncomment this macro to add link to your project file accessible online */ +//#define PROJECT_WEB_LINK "http://customwebsite.com/path/file.pmp" + +/* In-memory text "files" which are going to be accessible in FreeMASTER browser */ +#if FMSTR_USE_TSA && FMSTR_DEMO_ENOUGH_ROM +static const char readme_txt[] = + "This is a sample text file stored in target device memory and " + "retrieved over the FreeMASTER protocol.\n" + "Press the back button to return to previous page."; +static const char one_txt[] = + "This is sample file named 'one.txt'\n" + "Press the back button to return to previous page."; +static const char two_txt[] = + "This is sample file named 'two.txt'\n" + "Press the back button to return to previous page."; +static const char three_txt[] = + "This is sample file named 'three.txt'\n" + "Press the back button to return to previous page."; +#endif + +/* Data files generated with bin2h utility are put here as C arrays. + * Get all files if enough ROM memory is available, otherwise get + * only the basic index.html file. */ +#if FMSTR_DEMO_LARGE_ROM +#include "example_data.h" +#elif FMSTR_DEMO_ENOUGH_ROM +#include "data_html_index.h" +#endif + +FMSTR_TSA_TABLE_BEGIN(files_and_links) + +#if FMSTR_DEMO_ENOUGH_ROM + /* text files in the default / root folder */ + FMSTR_TSA_MEMFILE("index.htm", index_htm, sizeof(index_htm)) + FMSTR_TSA_MEMFILE("readme.txt", readme_txt, sizeof(readme_txt)) + /* text files in dedicated folder */ + FMSTR_TSA_DIRECTORY("/text_files") + FMSTR_TSA_MEMFILE("one.txt", one_txt, sizeof(one_txt)) + FMSTR_TSA_MEMFILE("two.txt", two_txt, sizeof(two_txt)) + /* text file in separate folder which is directly specified */ + FMSTR_TSA_MEMFILE("/other/three.txt", three_txt, sizeof(three_txt)) + /* links to be visible in FreeMASTER GUI */ + FMSTR_TSA_HREF("Board's Built-in Welcome Page", "/index.htm") +#endif + +#if FMSTR_DEMO_LARGE_ROM + /* image files in dedicated folder */ + FMSTR_TSA_DIRECTORY("/images") + FMSTR_TSA_MEMFILE("file.png", file_png, sizeof(file_png)) + FMSTR_TSA_MEMFILE("logo.png", logo_png, sizeof(logo_png)) + FMSTR_TSA_MEMFILE("fmstrlogo.png", fmstrlogo_png, sizeof(fmstrlogo_png)) + /* project files in root */ + FMSTR_TSA_MEMFILE("/demo.pmp.zip", demo_pmp, sizeof(demo_pmp)) + /* projects to be made available in FreeMASTER */ + FMSTR_TSA_PROJECT("FreeMASTER Demonstration Project (embedded in device)", "/demo.pmp.zip") +#endif /* FMSTR_DEMO_ENOUGH_ROM */ + +/* project file stored online */ +#ifdef PROJECT_WEB_LINK + FMSTR_TSA_PROJECT("Full FreeMASTER Project (online)", PROJECT_WEB_LINK) +#endif + + /* additional web links to be shown in FreeMASTER GUI */ + FMSTR_TSA_HREF("NXP Web Site", "http://www.nxp.com") + FMSTR_TSA_HREF("MCUXpresso SDK Home Page","http://www.nxp.com/mcuxpresso/sdk") + FMSTR_TSA_HREF("FreeMASTER Home Page", "http://www.nxp.com/freemaster") +FMSTR_TSA_TABLE_END() + +// clang-format on + +/* RAM buffer for runtime definition of the TSA table + * up to 5 variables will be enabled to register dynamically */ +static unsigned char tsa_dyn_table_storage[5 * sizeof(FMSTR_TSA_ENTRY)]; + +/**************************************************************************** + * + * This list describes all TSA tables which should be exported to the + * FreeMASTER application. + * + */ + +FMSTR_TSA_TABLE_LIST_BEGIN() +FMSTR_TSA_TABLE(first_table) +FMSTR_TSA_TABLE(next_table) +FMSTR_TSA_TABLE(files_and_links) +FMSTR_TSA_TABLE_LIST_END() + +/**************************************************************************** + * + * This function is registered as an application command handler (see the + * initialization code below. It gets automatically invoked when the + * FreeMASTER PC Host tool sends appropriate application command. + * + */ + +FMSTR_APPCMD_RESULT my_appcmd_handler(FMSTR_APPCMD_CODE nAppcmd, FMSTR_APPCMD_PDATA pData, FMSTR_SIZE nDataLen) +{ + // the return value is used as the application command result code + return 0x10; +} + +/**************************************************************************** + * + * This function is registered as a pipe communication handler (see the + * initialization code below. It gets automatically invoked when the + * FreeMASTER PC Host tool services the open pipe. This handler is called + * any time the pipe receives the data or when PC probes if pipe has anything + * to transmit. + * + */ + +void my_pipe_handler(FMSTR_HPIPE hpipe) +{ + static const char *names[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; + + static char buff[4]; + char *n; + char c; + + /* This simple handler translates the digits into number names. + * Other characters are just echoed back. */ + while (FMSTR_PipeRead(hpipe, (FMSTR_ADDR)buff, 1, 0)) + { + c = buff[0]; + + if (c >= '0' && c <= '9') + { + /* echo a number name */ + n = (char *)names[c - '0']; + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)n, FMSTR_StrLen(n), 0); + } + else + { + /* echo non-number character */ + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)buff, 1, 0); + } + } +} + +/**************************************************************************** + * + * Example of more useful pipe handler function which performs multiplication + * operation on two input long integers, returning one long integer. + * + */ + +void my_pipe_math(FMSTR_HPIPE hpipe) +{ + unsigned long result; + unsigned long buff[2]; + + /* we want to receive both operands at once (we do not want to do any caching here). + * The 'granularity' argument can be used for this purpose. */ + while (FMSTR_PipeRead(hpipe, (FMSTR_ADDR)&buff, 8, 8) == 8) + { + result = buff[0] * buff[1]; + + /* Note: Thanks to granularity argument, we can be sure that the + * data are sent as a whole (if there is a space in the transmit buffer) + * or not sent at all. */ + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)&result, 4, 4); + } +} + +/* Pipe memory buffers */ +static unsigned char pipe1_rxb[10]; +static unsigned char pipe1_txb[128]; +static unsigned char pipe2_rxb[10]; +static unsigned char pipe2_txb[128]; +static unsigned char pipe3_rxb[8]; +static unsigned char pipe3_txb[4]; + +/* Pipe welcome strings put to pipe as soon as application starts. */ +static char *sz_pipe1_hello = "Hello from embedded application! Pipe 1.\n"; +static char *sz_pipe2_hello = "Kind regards from from embedded application! Pipe 2.\n"; +static char *sz_pipe_other = "Send me numbers 0-9 and I will echo it back to you on the same pipe.\n"; + +/**************************************************************************** + * General initialization of FreeMASTER example */ + +void FMSTR_Example_Init(void) +{ + FMSTR_Example_Init_Ex(FMSTR_TRUE); +} + +void FMSTR_Example_Init_Ex(FMSTR_BOOL callFmstrInit) +{ + static FMSTR_U8 recBuffer[512]; /* Recorder #1 sampling buffer */ + FMSTR_REC_BUFF recBuffCfg; + FMSTR_HPIPE hpipe; + int i; + + var8 = 0; + var8rw = 0; + var8inc = 1; + var16 = 0; + var16rw = 0; + var16inc = 1; + var32 = 0; + var32rw = 0; + var32inc = 100; + + frac8 = 0; + frac16 = 0; + frac32 = 0; + ufrac8 = 0; + ufrac16 = 0; + ufrac32 = 0; + + arr_size = ARR_SIZE; + +#if FMSTR_DEMO_SUPPORT_I64 + var64 = 0; + var64rw = 0; + var64inc = 10000; + frac64 = 0; + ufrac64 = 0; +#endif + +#if FMSTR_DEMO_SUPPORT_FLT + varFLT = 0; + varFLTrw = 0; + varFLTinc = 1.0; + arrFLT_size = ARR_SIZE_FLT; +#endif + +#if FMSTR_DEMO_SUPPORT_DBL + varDBL = 0; + varDBLrw = 0; + varDBLinc = 1.0; + arrDBL_size = ARR_SIZE_DBL; +#endif + + varENUM = EXAMPLE_ENUM_SECOND_ENTRY; + varIncSpeed = SPEED_NORMAL; + + for (i = 0; i < ARR_SIZE; i++) + { + arr8[i] = (unsigned char)i; + arr16[i] = (unsigned short)i * 10; + arr32[i] = (unsigned long)i * 100; +#if FMSTR_DEMO_SUPPORT_I64 + arr64[i] = (unsigned long long)i * 1000; +#endif + } + +#if FMSTR_DEMO_SUPPORT_FLT + for (i = 0; i < ARR_SIZE_FLT; i++) + arrFLT[i] = ((float)i) / 10; +#endif + +#if FMSTR_DEMO_SUPPORT_DBL + for (i = 0; i < ARR_SIZE_DBL; i++) + arrDBL[i] = ((double)i) / 10; +#endif + + /* FreeMASTER driver initialization */ + if(callFmstrInit) + FMSTR_Init(); + + /* Registering the App.Command handler */ + FMSTR_RegisterAppCmdCall(10, my_appcmd_handler); + + /* Example of dynamic TSA table definition in runtime. Use this approach to add TSA entries + in runtime for variables whose address is not known in compilation time. This may be used for + dynamically allocated variables, provided that they remain allocated at the same place throughout + the whole application runtime. In this case, we just demonstrate it using var16prv symbol. */ + FMSTR_SetUpTsaBuff((FMSTR_ADDR)tsa_dyn_table_storage, sizeof(tsa_dyn_table_storage)); + FMSTR_TsaAddVar("var16prv", FMSTR_TSA_UINT16, (void *)&var16prv, sizeof(var16prv), FMSTR_TSA_INFO_RW_VAR); + + /* Note that Recorder #0 is set up automatically when FMSTR_USE_RECORDER>0 and FMSTR_REC_BUFF_SIZE != 0 + this is to enable backward compatibility with older driver versions. Extra recorder instances + need to be set up during initialization (see below). */ + + /* Setup the buffer for Recorder #1 */ + recBuffCfg.addr = (FMSTR_ADDR)recBuffer; + recBuffCfg.size = sizeof(recBuffer); + recBuffCfg.basePeriod_ns = 0; /* Unknown period, use FMSTR_RecorderSetTimeBase to set in runtime later */ + recBuffCfg.name = "Example of additional recorder"; + FMSTR_RecorderCreate(1, &recBuffCfg); + + /* Open pipes. The first pipe at port 1 */ + hpipe = FMSTR_PipeOpen(1, my_pipe_handler, (FMSTR_ADDR)pipe1_rxb, sizeof(pipe1_rxb), (FMSTR_ADDR)pipe1_txb, + sizeof(pipe1_txb), FMSTR_PIPE_TYPE_ANSI_TERMINAL, "Pipe 1"); + + if (hpipe) + { + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)sz_pipe1_hello, FMSTR_StrLen(sz_pipe1_hello), 0); + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)sz_pipe_other, FMSTR_StrLen(sz_pipe_other), 0); + } + + /* Second pipe at port 2 */ + hpipe = FMSTR_PipeOpen(2, my_pipe_handler, (FMSTR_ADDR)pipe2_rxb, sizeof(pipe2_rxb), (FMSTR_ADDR)pipe2_txb, + sizeof(pipe2_txb), FMSTR_PIPE_TYPE_ANSI_TERMINAL, "Pipe 2"); + + if (hpipe) + { + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)sz_pipe2_hello, FMSTR_StrLen(sz_pipe2_hello), 0); + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)sz_pipe_other, FMSTR_StrLen(sz_pipe_other), 0); + } + + /* Third pipe is a binary one at port 33 */ + FMSTR_PipeOpen(33, my_pipe_math, (FMSTR_ADDR)pipe3_rxb, sizeof(pipe3_rxb), (FMSTR_ADDR)pipe3_txb, sizeof(pipe3_txb), + FMSTR_PIPE_TYPE_UNICODE_TERMINAL, "Test pipe"); +} + +/**************************************************************************** + * + * Poll function of the FreeMASTER example, called periodically from the + * main application. We increment the variables so the change can be monitored + * in Variable Watch or graphs displayed in the FreeMASTER tool. + * + */ +void FMSTR_Example_Poll(void) +{ + FMSTR_Example_Poll_Ex(FMSTR_TRUE); +} + +void FMSTR_Example_Poll_Ex(FMSTR_BOOL callFmstrPoll) +{ + static unsigned short div; + unsigned short nAppCmdCode; + int i; + + /* scope variables, increment once a while */ + if (varIncSpeed && ++div > varIncSpeed) + { + var8 += var8inc; + var16 += var16inc; + var32 += var32inc; + +#if FMSTR_DEMO_SUPPORT_I64 + var64 += var64inc; +#endif +#if FMSTR_DEMO_SUPPORT_FLT + varFLT = varFLT + varFLTinc; + for (i = 0; i < arrFLT_size; i++) + arrFLT[i]++; +#endif +#if FMSTR_DEMO_SUPPORT_DBL + varDBL = varDBL + varDBLinc; + for (i = 0; i < arrDBL_size; i++) + arrDBL[i]++; +#endif + + div = 0; + } + + /* the application commands not registered with callback handlers + can be detected and processed using the API calls below */ + + /* first, check if a new command has been received */ + nAppCmdCode = FMSTR_GetAppCmd(); + + /* when a new command arrives, the nAppCmdCode contains the application + command code. In other case, the "NOCMD" special value is returned */ + if (nAppCmdCode != FMSTR_APPCMDRESULT_NOCMD) + { + nAppCmdCounter++; + + /* each command may have different processing and different + result code. The command processing is finished by + calling FMSTR_AppCmdAck() with the result code value */ + switch (nAppCmdCode) + { + case 1: + FMSTR_AppCmdAck(1); + break; + case 2: + FMSTR_AppCmdAck(0xcd); + break; + default: + FMSTR_AppCmdAck(0); + break; + } + } + + /* This call should rather be placed in the timer interrupt or anywhere + where the recorder sampling should occur. */ + FMSTR_Recorder(0); + + /* In this example we call both recorders here in the main loop. In real project + each recorder will be called from different place. */ + FMSTR_Recorder(1); + + /* The FreeMASTER poll call must be called in the main application loop + to handle the communication interface and protocol. */ + if(callFmstrPoll) + FMSTR_Poll(); +} diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/freemaster_example.h b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/freemaster_example.h new file mode 100644 index 0000000..b8127a6 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/freemaster_example.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - Example Application Declarations + */ + +#ifndef __FMSTR_EXAMPLE_H +#define __FMSTR_EXAMPLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Functions definitions + ******************************************************************************/ + +// Prototypes of example functions +void FMSTR_Example_Init(void); +void FMSTR_Example_Init_Ex(FMSTR_BOOL callFmstrInit); +void FMSTR_Example_Poll(void); +void FMSTR_Example_Poll_Ex(FMSTR_BOOL callFmstrPoll); + +#ifdef __cplusplus +} +#endif + +#endif /* __FMSTR_EXAMPLE_H */ diff --git a/boards/lpc845breakout/freemaster_examples/common/fmstr_example/freemaster_example_per.c b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/freemaster_example_per.c new file mode 100644 index 0000000..efdeb9d --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/common/fmstr_example/freemaster_example_per.c @@ -0,0 +1,664 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - Example Application Code to be used + * with MCUXpresso Peripheral Configuration tool. This code is similar to + * general freemaster_example.c example application, but expects the + * FreeMASTER to be configured by MCUXpresso ConfigTools and initialized + * by code generated in peripherals.c. + */ + +#include +#include + +#include "peripherals.h" +#include "freemaster.h" +#include "freemaster_example.h" +#include "freemaster_democfg.h" + +/**************************************************************************** + * + * Default configuration of FreeMASTER demo + * + */ + +#ifndef FMSTR_GENERATED_CONFIGURATION +/* The FreeMASTER example application named "fmstr_any" demonstrates use of the generated configuration */ +#warning This code should be used with FreeMASTER configuration generated by MCUXpresso Config Tools. +#endif + +/* Demo application configuration. Enough ROM resources by default, + * but not really large ROM by default (storing images and other active content) */ +#ifndef FMSTR_DEMO_ENOUGH_ROM +#define FMSTR_DEMO_ENOUGH_ROM 1 +#endif +#ifndef FMSTR_DEMO_LARGE_ROM +#define FMSTR_DEMO_LARGE_ROM 0 +#endif + +/* in LARGE_ROM is defined, then also enable ENOUGH_ROM option */ +#if FMSTR_DEMO_LARGE_ROM && !(FMSTR_DEMO_ENOUGH_ROM) +#warning Probably wrong demo application settings +#undef FMSTR_DEMO_ENOUGH_ROM +#define FMSTR_DEMO_ENOUGH_ROM 1 +#endif + +/* Platform configuration for demo application */ +#ifndef FMSTR_DEMO_SUPPORT_I64 +#define FMSTR_DEMO_SUPPORT_I64 1 /* support for long long type */ +#endif +#ifndef FMSTR_DEMO_SUPPORT_FLT +#define FMSTR_DEMO_SUPPORT_FLT 1 /* support for float type */ +#endif +#ifndef FMSTR_DEMO_SUPPORT_DBL +#define FMSTR_DEMO_SUPPORT_DBL 1 /* support for double type */ +#endif + +/**************************************************************************** + * + * Test variables, will be displayed in the FreeMASTER application + * + */ + +#define ARR_SIZE 10 +#define ARR_SIZE_FLT 10 +#define ARR_SIZE_DBL 10 + +volatile unsigned char var8; +volatile unsigned char var8rw; +volatile unsigned char var8inc = 1; +volatile unsigned short var16; +volatile unsigned short var16rw; +volatile unsigned short var16inc = 1; +volatile unsigned short var16prv; +volatile unsigned long var32; +volatile unsigned long var32rw; +volatile unsigned long var32inc = 100; + +volatile unsigned char frac8; +volatile unsigned short frac16; +volatile unsigned long frac32; + +volatile unsigned char ufrac8; +volatile unsigned short ufrac16; +volatile unsigned long ufrac32; + +volatile unsigned char *var8ptr = &var8; +volatile unsigned short *var16ptr = &var16; +volatile unsigned long *var32ptr = &var32; + +volatile unsigned short arr_size = ARR_SIZE; +volatile unsigned char arr8[ARR_SIZE]; +volatile unsigned short arr16[ARR_SIZE]; +volatile unsigned long arr32[ARR_SIZE]; + +#if FMSTR_DEMO_SUPPORT_I64 +volatile unsigned long long var64; +volatile unsigned long long var64rw; +volatile unsigned long long var64inc = 10000; +volatile unsigned long long arr64[ARR_SIZE]; +volatile unsigned long long frac64; +volatile unsigned long long ufrac64; +#endif + +#if FMSTR_DEMO_SUPPORT_FLT +volatile float varFLT; +volatile float varFLTrw; +volatile float varFLTinc = 1.0; +volatile float arrFLT[ARR_SIZE_FLT]; +volatile unsigned int arrFLT_size = ARR_SIZE_FLT; +#endif + +#if FMSTR_DEMO_SUPPORT_DBL +volatile double varDBL; +volatile double varDBLrw; +volatile double varDBLinc = 1.0; +volatile double arrDBL[ARR_SIZE_DBL]; +volatile unsigned int arrDBL_size = ARR_SIZE_DBL; +#endif + +/* count received application commands, just for test purposes */ +volatile unsigned char nAppCmdCounter; + +/**************************************************************************** + * + * Test structure types - demonstrates the "TSA" feature thanks to which the + * FreeMASTER is able to load a variable and type information directly from + * the embedded application. + * + */ + +typedef enum +{ + EXAMPLE_ENUM_FIRST_ENTRY, + EXAMPLE_ENUM_SECOND_ENTRY, + EXAMPLE_ENUM_THIRD_ENTRY, +} EXAMPLE_ENUM; + +typedef enum +{ + SPEED_ZERO = 0, + SPEED_FAST = 1, + SPEED_NORMAL = 20, + SPEED_SLOW = 200, +} INCREMENT_SPEED; + +typedef struct +{ + unsigned short aa; + unsigned long bb[2]; + unsigned short cc; + unsigned long dd[3]; + unsigned char ee; + unsigned char ff[5]; +} INNER_STRUCT; + +typedef struct +{ + unsigned short a; + unsigned long b; + INNER_STRUCT inA[4]; + INNER_STRUCT inB; +} OUTER_STRUCT; + +/**************************************************************************** + * + * Test variables which make use of the user-defined data types. You are able + * to display the variables including the member items in FreeMASTER. + * + */ + +volatile OUTER_STRUCT so1, so2; +volatile INNER_STRUCT si1, si2; +volatile EXAMPLE_ENUM varENUM; +volatile INCREMENT_SPEED varIncSpeed; + +/**************************************************************************** + * Local prototypes + */ +FMSTR_APPCMD_RESULT my_appcmd_handler(FMSTR_APPCMD_CODE nAppcmd, FMSTR_APPCMD_PDATA pData, FMSTR_SIZE nDataLen); +void my_pipe_handler(FMSTR_HPIPE hpipe); +void my_pipe_math(FMSTR_HPIPE hpipe); + +// clang-format off + +/**************************************************************************** + * + * With TSA enabled, the user describes the global and static variables using + * so-called TSA tables. There can be any number of tables defined in + * the project files. Each table does have the identifier which should be + * unique across the project. + * + * Note that you can declare variables as Read-Only or Read-Write. + * The FreeMASTER driver denies any write access to the Read-Only variables + * when TSA_SAFETY is enabled. + */ + +FMSTR_TSA_TABLE_BEGIN(first_table) + FMSTR_TSA_RO_VAR(var8, FMSTR_TSA_UINT8) + FMSTR_TSA_RW_VAR(arr8, FMSTR_TSA_UINT8) + FMSTR_TSA_RW_VAR(var8rw, FMSTR_TSA_UINT8) + FMSTR_TSA_RW_VAR(var8inc, FMSTR_TSA_UINT8) + + FMSTR_TSA_RO_VAR(var16, FMSTR_TSA_UINT16) + FMSTR_TSA_RW_VAR(arr16, FMSTR_TSA_UINT16) + FMSTR_TSA_RW_VAR(var16rw, FMSTR_TSA_UINT16) + FMSTR_TSA_RW_VAR(var16inc, FMSTR_TSA_UINT16) + + FMSTR_TSA_RO_VAR(var32, FMSTR_TSA_UINT32) + FMSTR_TSA_RW_VAR(arr32, FMSTR_TSA_UINT32) + FMSTR_TSA_RW_VAR(var32rw, FMSTR_TSA_UINT32) + FMSTR_TSA_RW_VAR(var32inc, FMSTR_TSA_UINT32) + + FMSTR_TSA_RO_VAR(var8ptr, FMSTR_TSA_POINTER) + FMSTR_TSA_RO_VAR(var16ptr, FMSTR_TSA_POINTER) + FMSTR_TSA_RO_VAR(var32ptr, FMSTR_TSA_POINTER) + + FMSTR_TSA_RW_VAR(frac8, FMSTR_TSA_FRAC_Q(0, 7)) + FMSTR_TSA_RW_VAR(frac16, FMSTR_TSA_FRAC_Q(3, 12)) + FMSTR_TSA_RW_VAR(frac32, FMSTR_TSA_FRAC_Q(12, 19)) + + FMSTR_TSA_RW_VAR(ufrac8, FMSTR_TSA_UFRAC_UQ(1, 7)) + FMSTR_TSA_RW_VAR(ufrac16, FMSTR_TSA_UFRAC_UQ(4, 12)) + FMSTR_TSA_RW_VAR(ufrac32, FMSTR_TSA_UFRAC_UQ(13, 19)) + +#if FMSTR_DEMO_SUPPORT_I64 + FMSTR_TSA_RO_VAR(var64, FMSTR_TSA_UINT64) + FMSTR_TSA_RW_VAR(arr64, FMSTR_TSA_UINT64) + FMSTR_TSA_RW_VAR(var64rw, FMSTR_TSA_UINT64) + FMSTR_TSA_RW_VAR(var64inc, FMSTR_TSA_UINT64) + FMSTR_TSA_RW_VAR(frac64, FMSTR_TSA_FRAC_Q(8, 55)) + FMSTR_TSA_RW_VAR(ufrac64, FMSTR_TSA_UFRAC_UQ(9, 55)) +#endif + +#if FMSTR_DEMO_SUPPORT_FLT + FMSTR_TSA_RO_VAR(varFLT, FMSTR_TSA_FLOAT) + FMSTR_TSA_RW_VAR(varFLTrw, FMSTR_TSA_FLOAT) + FMSTR_TSA_RW_VAR(arrFLT, FMSTR_TSA_FLOAT) + FMSTR_TSA_RW_VAR(varFLTinc, FMSTR_TSA_FLOAT) + FMSTR_TSA_RO_VAR(arrFLT_size, FMSTR_TSA_UINT32) +#endif + +#if FMSTR_DEMO_SUPPORT_DBL + FMSTR_TSA_RO_VAR(varDBL, FMSTR_TSA_DOUBLE) + FMSTR_TSA_RW_VAR(arrDBL, FMSTR_TSA_DOUBLE) + FMSTR_TSA_RW_VAR(varDBLrw, FMSTR_TSA_DOUBLE) + FMSTR_TSA_RW_VAR(varDBLinc, FMSTR_TSA_DOUBLE) + FMSTR_TSA_RO_VAR(arrDBL_size, FMSTR_TSA_UINT32) +#endif + + FMSTR_TSA_RO_VAR(arr_size, FMSTR_TSA_UINT16) + + FMSTR_TSA_RO_VAR(nAppCmdCounter, FMSTR_TSA_UINT8) + + FMSTR_TSA_RW_VAR(so1, FMSTR_TSA_USERTYPE(OUTER_STRUCT)) + FMSTR_TSA_RW_VAR(si1, FMSTR_TSA_USERTYPE(INNER_STRUCT)) + FMSTR_TSA_RW_VAR(varENUM, FMSTR_TSA_USERTYPE(EXAMPLE_ENUM)) + FMSTR_TSA_RW_VAR(varIncSpeed, FMSTR_TSA_USERTYPE(INCREMENT_SPEED)) + + FMSTR_TSA_STRUCT(OUTER_STRUCT) + FMSTR_TSA_MEMBER(OUTER_STRUCT, a, FMSTR_TSA_UINT16) + FMSTR_TSA_MEMBER(OUTER_STRUCT, b, FMSTR_TSA_UINT32) + FMSTR_TSA_MEMBER(OUTER_STRUCT, inA, FMSTR_TSA_USERTYPE(INNER_STRUCT)) + FMSTR_TSA_MEMBER(OUTER_STRUCT, inB, FMSTR_TSA_USERTYPE(INNER_STRUCT)) + + FMSTR_TSA_STRUCT(INNER_STRUCT) + FMSTR_TSA_MEMBER(INNER_STRUCT, aa, FMSTR_TSA_UINT16) + FMSTR_TSA_MEMBER(INNER_STRUCT, bb, FMSTR_TSA_UINT32) + FMSTR_TSA_MEMBER(INNER_STRUCT, cc, FMSTR_TSA_SINT16) + FMSTR_TSA_MEMBER(INNER_STRUCT, dd, FMSTR_TSA_SINT32) + FMSTR_TSA_MEMBER(INNER_STRUCT, ee, FMSTR_TSA_UINT8) + FMSTR_TSA_MEMBER(INNER_STRUCT, ff, FMSTR_TSA_SINT8) + + FMSTR_TSA_ENUM(EXAMPLE_ENUM) + FMSTR_TSA_CONST(EXAMPLE_ENUM_FIRST_ENTRY) + FMSTR_TSA_CONST(EXAMPLE_ENUM_SECOND_ENTRY) + FMSTR_TSA_CONST(EXAMPLE_ENUM_THIRD_ENTRY) + + FMSTR_TSA_ENUM(INCREMENT_SPEED) + FMSTR_TSA_CONST(SPEED_ZERO) + FMSTR_TSA_CONST(SPEED_FAST) + FMSTR_TSA_CONST(SPEED_NORMAL) + FMSTR_TSA_CONST(SPEED_SLOW) + +FMSTR_TSA_TABLE_END() + +/**************************************************************************** + * + * This is an example of another TSA table. Typically, you put one table + * to each .c file where your global or static variables are instantiated. + */ + +FMSTR_TSA_TABLE_BEGIN(next_table) + FMSTR_TSA_RO_VAR(so2, FMSTR_TSA_USERTYPE(OUTER_STRUCT)) + FMSTR_TSA_RO_VAR(si2, FMSTR_TSA_USERTYPE(INNER_STRUCT)) +FMSTR_TSA_TABLE_END() + +/**************************************************************************** + * + * Another TSA table with specific information about in-memory files, + * project files and related web-links. This feature requires FreeMASTER + * version 2.0 or later running on the PC Host to make use of this "Active Content" + */ + +/* Uncomment this macro to add link to your project file accessible online */ +//#define PROJECT_WEB_LINK "http://customwebsite.com/path/file.pmp" + +/* In-memory text "files" which are going to be accessible in FreeMASTER browser */ +#if FMSTR_USE_TSA && FMSTR_DEMO_ENOUGH_ROM +static const char readme_txt[] = + "This is a sample text file stored in target device memory and " + "retrieved over the FreeMASTER protocol.\n" + "Press the back button to return to previous page."; +static const char one_txt[] = + "This is sample file named 'one.txt'\n" + "Press the back button to return to previous page."; +static const char two_txt[] = + "This is sample file named 'two.txt'\n" + "Press the back button to return to previous page."; +static const char three_txt[] = + "This is sample file named 'three.txt'\n" + "Press the back button to return to previous page."; +#endif + +/* Data files generated with bin2h utility are put here as C arrays. + * Get all files if enough ROM memory is available, otherwise get + * only the basic index.html file. */ +#if FMSTR_DEMO_LARGE_ROM +#include "example_data.h" +#elif FMSTR_DEMO_ENOUGH_ROM +#include "data_html_index.h" +#endif + +FMSTR_TSA_TABLE_BEGIN(files_and_links) + +#if FMSTR_DEMO_ENOUGH_ROM + /* text files in the default / root folder */ + FMSTR_TSA_MEMFILE("index.htm", index_htm, sizeof(index_htm)) + FMSTR_TSA_MEMFILE("readme.txt", readme_txt, sizeof(readme_txt)) + /* text files in dedicated folder */ + FMSTR_TSA_DIRECTORY("/text_files") + FMSTR_TSA_MEMFILE("one.txt", one_txt, sizeof(one_txt)) + FMSTR_TSA_MEMFILE("two.txt", two_txt, sizeof(two_txt)) + /* text file in separate folder which is directly specified */ + FMSTR_TSA_MEMFILE("/other/three.txt", three_txt, sizeof(three_txt)) + /* links to be visible in FreeMASTER GUI */ + FMSTR_TSA_HREF("Board's Built-in Welcome Page", "/index.htm") +#endif + +#if FMSTR_DEMO_LARGE_ROM + /* image files in dedicated folder */ + FMSTR_TSA_DIRECTORY("/images") + FMSTR_TSA_MEMFILE("file.png", file_png, sizeof(file_png)) + FMSTR_TSA_MEMFILE("logo.png", logo_png, sizeof(logo_png)) + FMSTR_TSA_MEMFILE("fmstrlogo.png", fmstrlogo_png, sizeof(fmstrlogo_png)) + /* project files in root */ + FMSTR_TSA_MEMFILE("/demo.pmp.zip", demo_pmp, sizeof(demo_pmp)) + /* projects to be made available in FreeMASTER */ + FMSTR_TSA_PROJECT("FreeMASTER Demonstration Project (embedded in device)", "/demo.pmp.zip") +#endif /* FMSTR_DEMO_ENOUGH_ROM */ + +/* project file stored online */ +#ifdef PROJECT_WEB_LINK + FMSTR_TSA_PROJECT("Full FreeMASTER Project (online)", PROJECT_WEB_LINK) +#endif + + /* additional web links to be shown in FreeMASTER GUI */ + FMSTR_TSA_HREF("NXP Web Site", "http://www.nxp.com") + FMSTR_TSA_HREF("MCUXpresso SDK Home Page","http://www.nxp.com/mcuxpresso/sdk") + FMSTR_TSA_HREF("FreeMASTER Home Page", "http://www.nxp.com/freemaster") +FMSTR_TSA_TABLE_END() + +// clang-format on + +/**************************************************************************** + * + * This list describes all TSA tables which should be exported to the + * FreeMASTER application. + */ + +FMSTR_TSA_TABLE_LIST_BEGIN() +FMSTR_TSA_TABLE(first_table) +FMSTR_TSA_TABLE(next_table) +FMSTR_TSA_TABLE(files_and_links) +FMSTR_TSA_TABLE_LIST_END() + +/**************************************************************************** + * + * This function is registered as an application command handler (see the + * initialization code below. It gets automatically invoked when the + * FreeMASTER PC Host tool sends appropriate application command. + * + */ + +FMSTR_APPCMD_RESULT my_appcmd_handler(FMSTR_APPCMD_CODE nAppcmd, FMSTR_APPCMD_PDATA pData, FMSTR_SIZE nDataLen) +{ + // the return value is used as the application command result code + return 0x10; +} + +/**************************************************************************** + * + * This function is registered as a pipe communication handler (see the + * initialization code generated by MCUX Config Tools in peripherals.c). + * + * The function gets automatically invoked when the FreeMASTER PC Host tool + * services the open pipe. This handler is called any time the pipe receives + * data to be processed or when PC probes if pipe has anything to transmit. + * + */ + +void my_pipe_handler(FMSTR_HPIPE hpipe) +{ + static const char *names[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; + + static char buff[4]; + char *n; + char c; + + /* This simple handler translates the digits into number names. + * Other characters are just echoed back. */ + while (FMSTR_PipeRead(hpipe, (FMSTR_ADDR)buff, 1, 0)) + { + c = buff[0]; + + if (c >= '0' && c <= '9') + { + /* echo a number name */ + n = (char *)names[c - '0']; + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)n, FMSTR_StrLen(n), 0); + } + else + { + /* echo non-number character */ + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)buff, 1, 0); + } + } +} + +/**************************************************************************** + * + * Example of more useful pipe handler function which performs multiplication + * operation on two input long integers, returning one long integer. + * + */ + +void my_pipe_math(FMSTR_HPIPE hpipe) +{ + unsigned long result; + unsigned long buff[2]; + + /* we want to receive both operands at once (we do not want to do any caching here). + * The 'granularity' argument can be used for this purpose. */ + while (FMSTR_PipeRead(hpipe, (FMSTR_ADDR)&buff, 8, 8) == 8) + { + result = buff[0] * buff[1]; + + /* Note: Thanks to granularity argument, we can be sure that the + * data are sent as a whole (if there is a space in the transmit buffer) + * or not sent at all. */ + FMSTR_PipeWrite(hpipe, (FMSTR_ADDR)&result, 4, 4); + } +} + +/* Pipe welcome strings put to pipe as soon as application starts. */ +static char *sz_pipe1_hello = "Hello from embedded application! Pipe 1.\n"; +static char *sz_pipe2_hello = "Kind regards from from embedded application! Pipe 2.\n"; +static char *sz_pipe_other = "Send me numbers 0-9 and I will echo it back to you on the same pipe.\n"; + +/******************************************************************************************* + * + * General initialization of FreeMASTER example is made here. Note that communication driver, + * FreeMASTER protocol driver and its features has already been initialized by a code generated + * by MCUXpresso Peripheral Config Tool in peripherals.c and freemaster_cfg.h files. + * + * Run the MCUXpresso Config Tools (v8 or later) to open the FreeMASTER configuration + * and edit it graphically. The tool can also be used to re-generate the code + * after any change is made. + * + * See more details and the generated initialization code in BOARD_InitPeripherals() function. + */ + +void FMSTR_Example_Init(void) +{ + int i; + + var8 = 0; + var8rw = 0; + var8inc = 1; + var16 = 0; + var16rw = 0; + var16inc = 1; + var32 = 0; + var32rw = 0; + var32inc = 100; + + frac8 = 0; + frac16 = 0; + frac32 = 0; + ufrac8 = 0; + ufrac16 = 0; + ufrac32 = 0; + + arr_size = ARR_SIZE; + +#if FMSTR_DEMO_SUPPORT_I64 + var64 = 0; + var64rw = 0; + var64inc = 10000; + frac64 = 0; + ufrac64 = 0; +#endif + +#if FMSTR_DEMO_SUPPORT_FLT + varFLT = 0; + varFLTrw = 0; + varFLTinc = 1.0; + arrFLT_size = ARR_SIZE_FLT; +#endif + +#if FMSTR_DEMO_SUPPORT_DBL + varDBL = 0; + varDBLrw = 0; + varDBLinc = 1.0; + arrDBL_size = ARR_SIZE_DBL; +#endif + + varENUM = EXAMPLE_ENUM_SECOND_ENTRY; + varIncSpeed = SPEED_NORMAL; + + for (i = 0; i < ARR_SIZE; i++) + { + arr8[i] = (unsigned char)i; + arr16[i] = (unsigned short)i * 10; + arr32[i] = (unsigned long)i * 100; +#if FMSTR_DEMO_SUPPORT_I64 + arr64[i] = (unsigned long long)i * 1000; +#endif + } + +#if FMSTR_DEMO_SUPPORT_FLT + for (i = 0; i < ARR_SIZE_FLT; i++) + arrFLT[i] = ((float)i) / 10; +#endif + +#if FMSTR_DEMO_SUPPORT_DBL + for (i = 0; i < ARR_SIZE_DBL; i++) + arrDBL[i] = ((double)i) / 10; +#endif + + /* When application commands are enabled, register the handler callback */ +#if FMSTR_USE_APPCMD && FMSTR_MAX_APPCMD_CALLS + FMSTR_RegisterAppCmdCall(10, my_appcmd_handler); +#endif + + /* When dynamic TSA tables are enabled, add an example entry here. You can use + dynamic TSA entries to describe variables which do not have addresses known + in compile-time, so they cannot be put to static TSA tables. */ +#if FMSTR_USE_TSA && FMSTR_USE_TSA_DYNAMIC + FMSTR_TsaAddVar("var16prv", FMSTR_TSA_UINT16, (void *)&var16prv, sizeof(var16prv), FMSTR_TSA_INFO_RW_VAR); +#endif + +#if FMSTR_USE_PIPES + /* The pipes are created/open in generated initialization code in peripherals.c already. + Here we send the initial welcome text to the pipes, so it is received by the + FreeMASTER tool as soon as it opens the pipe. */ + if (FreeMASTER_Pipe_handle_1) + { + FMSTR_PipeWrite(FreeMASTER_Pipe_handle_1, (FMSTR_ADDR)sz_pipe1_hello, FMSTR_StrLen(sz_pipe1_hello), 0); + FMSTR_PipeWrite(FreeMASTER_Pipe_handle_1, (FMSTR_ADDR)sz_pipe_other, FMSTR_StrLen(sz_pipe_other), 0); + } + + /* Second pipe at port 2 */ + if (FreeMASTER_Pipe_handle_2) + { + FMSTR_PipeWrite(FreeMASTER_Pipe_handle_2, (FMSTR_ADDR)sz_pipe2_hello, FMSTR_StrLen(sz_pipe2_hello), 0); + FMSTR_PipeWrite(FreeMASTER_Pipe_handle_2, (FMSTR_ADDR)sz_pipe_other, FMSTR_StrLen(sz_pipe_other), 0); + } + + /* Note: Third pipe is a binary one, performing the mathematical operations. No welcome data put there. */ +#endif +} + +/**************************************************************************** + * + * Poll function of the FreeMASTER example, called periodically from the + * main application. We increment the variables so the change can be monitored + * in Variable Watch or graphs displayed in the FreeMASTER tool. + * + */ + +void FMSTR_Example_Poll(void) +{ + static unsigned short div; + unsigned short nAppCmdCode; + int i; + + /* scope variables, increment once a while */ + if (varIncSpeed && ++div > varIncSpeed) + { + var8 += var8inc; + var16 += var16inc; + var32 += var32inc; + +#if FMSTR_DEMO_SUPPORT_I64 + var64 += var64inc; +#endif +#if FMSTR_DEMO_SUPPORT_FLT + varFLT = varFLT + varFLTinc; + for (i = 0; i < arrFLT_size; i++) + arrFLT[i]++; +#endif +#if FMSTR_DEMO_SUPPORT_DBL + varDBL = varDBL + varDBLinc; + for (i = 0; i < arrDBL_size; i++) + arrDBL[i]++; +#endif + + div = 0; + } + + /* the application commands not registered with callback handlers + can be detected and processed using the API calls below */ + + /* first, check if a new command has been received */ + nAppCmdCode = FMSTR_GetAppCmd(); + + /* when a new command arrives, the nAppCmdCode contains the application + command code. In other case, the "NOCMD" special value is returned */ + if (nAppCmdCode != FMSTR_APPCMDRESULT_NOCMD) + { + nAppCmdCounter++; + + /* each command may have different processing and different + result code. The command processing is finished by + calling FMSTR_AppCmdAck() with the result code value */ + switch (nAppCmdCode) + { + case 1: + FMSTR_AppCmdAck(1); + break; + case 2: + FMSTR_AppCmdAck(0xcd); + break; + default: + FMSTR_AppCmdAck(0); + break; + } + } + + /* This call should rather be placed in the timer interrupt or anywhere + where the recorder sampling should occur. */ + FMSTR_Recorder(0); + + /* In this example we call both recorders here in the main loop. In real project + each recorder will be called from different place. */ + FMSTR_Recorder(1); + + /* The FreeMASTER poll call must be called in the main application loop + to handle the communication interface and protocol. */ + FMSTR_Poll(); +} diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/CMakeLists.txt b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/CMakeLists.txt new file mode 100644 index 0000000..5fb9ea0 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/CMakeLists.txt @@ -0,0 +1,128 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(fmstr_example_any) + +set(MCUX_SDK_PROJECT_NAME fmstr_example_any.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../main.c" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../peripherals.c" +"${ProjDirPath}/../peripherals.h" +"${ProjDirPath}/../freemaster_cfg.h" +"${ProjDirPath}/../freemaster_democfg.h" +"${ProjDirPath}/../../common/fmstr_example/freemaster_example_per.c" +"${ProjDirPath}/../../common/fmstr_example/freemaster_example.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../../common/fmstr_example/data_example_pmp.h" +"${ProjDirPath}/../../common/fmstr_example/data_img_logo.h" +"${ProjDirPath}/../../common/fmstr_example/data_img_file.h" +"${ProjDirPath}/../../common/fmstr_example/data_img_fmstrlogo.h" +"${ProjDirPath}/../../common/fmstr_example/data_html_index.h" +"${ProjDirPath}/../../common/fmstr_example/example_data.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. + ${ProjDirPath}/../../common/fmstr_example +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../middleware/freemaster + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(driver_lpc_miniusart_LPC845) + +include(middleware_fmstr_LPC845) + +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_clock_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(middleware_fmstr_platform_gen32le_LPC845) + +include(driver_power_no_lib_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/LPC845_flash.ld b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_all.bat b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_all.sh b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_debug.bat b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_debug.sh b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_release.bat b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_release.sh b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/clean.bat b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/clean.sh b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/flags.cmake b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/flags.cmake new file mode 100755 index 0000000..273075a --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/armgcc/flags.cmake @@ -0,0 +1,172 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DSDK_DEBUGCONSOLE=1 \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DSDK_DEBUGCONSOLE=1 \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/board.c b/boards/lpc845breakout/freemaster_examples/fmstr_any/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/board.h b/boards/lpc845breakout/freemaster_examples/fmstr_any/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_any/clock_config.c b/boards/lpc845breakout/freemaster_examples/fmstr_any/clock_config.c new file mode 100644 index 0000000..0e302d7 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_any/clock_config.c @@ -0,0 +1,102 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v8.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 0.11.1 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockRUN(); +} + +/******************************************************************************* + ********************** Configuration BOARD_BootClockRUN *********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockRUN +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 30 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: SYSPLL_clock.outFreq, value: 15 MHz} +- {id: System_clock.outFreq, value: 15 MHz} +- {id: UART0_clock.outFreq, value: 15 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.FRO_divider.scale, value: '2'} +- {id: SYSCON.UART0CLKSEL.sel, value: SYSCON.FRO_DIRECT} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockRUN configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockRUN configuration + ******************************************************************************/ +void BOARD_BootClockRUN(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut30M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcLpwrBootValue); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/freemaster_cfg.h b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/freemaster_cfg.h new file mode 100644 index 0000000..b633343 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/freemaster_cfg.h @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - User Configuration File + */ + +#ifndef __FREEMASTER_CFG_H +#define __FREEMASTER_CFG_H + +//////////////////////////////////////////////////////////////////////////////// +// Definitions +//////////////////////////////////////////////////////////////////////////////// + +#define FMSTR_PLATFORM_CORTEX_M 1 /* Cortex-M platform (see freemaster.h for list of all supported platforms) */ + +//! Set the demo application configuration +#define FMSTR_DEMO_ENOUGH_ROM 1 /* Platform has enough ROM to show most of the FreeMASTER features */ +#define FMSTR_DEMO_LARGE_ROM 0 /* Platform has large ROM enough to store the extended data structures used in FreeMASTER demo */ +#define FMSTR_DEMO_SUPPORT_I64 1 /* support for long long type */ +#define FMSTR_DEMO_SUPPORT_FLT 1 /* support for float type */ +#define FMSTR_DEMO_SUPPORT_DBL 1 /* support for double type */ + + +//! Enable/Disable FreeMASTER support as a whole +#define FMSTR_DISABLE 0 // To disable all FreeMASTER functionalities + +//! Select interrupt or poll-driven serial communication +#define FMSTR_LONG_INTR 0 // Complete message processing in interrupt +#define FMSTR_SHORT_INTR 0 // Queuing done in interrupt +#define FMSTR_POLL_DRIVEN 1 // No interrupt needed, polling only + +// List of standard FreeMASTER transports and their low-level drivers. See more options in src/drivers. +// FMSTR_SERIAL - Standard serial transport protocol (Used by various types of UART peripherals as USB CDC implementation) +// FMSTR_SERIAL_MCUX_UART - MCUXSDK driver for UART peripheral +// FMSTR_SERIAL_MCUX_LPUART - MCUXSDK driver for LPUART peripheral +// FMSTR_SERIAL_MCUX_USART - MCUXSDK driver for USART peripheral +// FMSTR_SERIAL_MCUX_MINIUSART -MCUXSDK driver for MINIUSART peripheral +// FMSTR_SERIAL_MCUX_USB - MCUXSDK driver for USB peripheral with CDC class +// FMSTR_CAN - Standard CAN transport protocol (Used by various types of CAN peripherals) +// FMSTR_CAN_MCUX_FLEXCAN - MCUXSDK driver for FlexCAN peripheral +// FMSTR_CAN_MCUX_MCAN - MCUXSDK driver for MCAN peripheral +// FMSTR_CAN_MCUX_MSCAN - MCUXSDK driver for msCAN peripheral +// FMSTR_PDBDM - Packet Driven BDM (direct memory access via JTAG, SWD or BDM debug probes). No low-level driver used. + +//! Select communication interface +#define FMSTR_TRANSPORT FMSTR_PDBDM // Use PD BDM transport layer */ + +//! Define communication interface base address or leave undefined for runtime setting +// #undef FMSTR_SERIAL_BASE // Serial base will be assigned in runtime (when FMSTR_USE_UART) +// #undef FMSTR_CAN_BASE // CAN base will be assigned in runtime (when FMSTR_USE_FLEXCAN) + +//! FlexCAN-specific, communication message buffers +#define FMSTR_FLEXCAN_TXMB 0 +#define FMSTR_FLEXCAN_RXMB 1 + +//! Input/output communication buffer size +#define FMSTR_COMM_BUFFER_SIZE 0 // Set to 0 for "automatic" + +//! Receive FIFO queue size (use with FMSTR_SHORT_INTR only) +#define FMSTR_COMM_RQUEUE_SIZE 32 // Set to 0 for "default" + +//! Support for Application Commands +#define FMSTR_USE_APPCMD 1 // Enable/disable App.Commands support +#define FMSTR_APPCMD_BUFF_SIZE 32 // App.Command data buffer size +#define FMSTR_MAX_APPCMD_CALLS 4 // How many app.cmd callbacks? (0=disable) + +//! Oscilloscope support +#define FMSTR_USE_SCOPE 2 // Specify number of supported oscilloscopes +#define FMSTR_MAX_SCOPE_VARS 8 // Specify maximum number of scope variables per one oscilloscope + +//! Recorder support +#define FMSTR_USE_RECORDER 2 // Specify number of supported recorders + +//! Built-in recorder buffer +#define FMSTR_REC_BUFF_SIZE 1024 // Built-in buffer size of recorder #0. Set to 0 to use runtime settings. + +//! Recorder time base, specifies how often the recorder is called in the user app. +#define FMSTR_REC_TIMEBASE FMSTR_REC_BASE_MILLISEC(0) // 0 = "unknown" +#define FMSTR_REC_FLOAT_TRIG 1 // Enable/disable floating point triggering + +// Target-side address translation (TSA) +#define FMSTR_USE_TSA 1 // Enable TSA functionality +#define FMSTR_USE_TSA_INROM 1 // TSA tables declared as const (put to ROM) +#define FMSTR_USE_TSA_SAFETY 1 // Enable/Disable TSA memory protection +#define FMSTR_USE_TSA_DYNAMIC 1 // Enable/Disable TSA entries to be added also in runtime + +// Pipes as data streaming over FreeMASTER protocol +#define FMSTR_USE_PIPES 3 // Specify number of supported pipe objects + +// Enable/Disable read/write memory commands +#define FMSTR_USE_READMEM 1 // Enable read memory commands +#define FMSTR_USE_WRITEMEM 1 // Enable write memory commands +#define FMSTR_USE_WRITEMEMMASK 1 // Enable write memory bits commands + +// Define password for access levels to protect them. AVOID SHORT PASSWORDS in production version. +// Passwords should be at least 20 characters long to prevent dictionary attacks. +// #define FMSTR_RESTRICTED_ACCESS_R_PASSWORD "r" // Read-only access level password. Let undefined when no password is required. +// #define FMSTR_RESTRICTED_ACCESS_RW_PASSWORD "rw" // Write access level password. Let undefined to set the same as for read-only access level. +// #define FMSTR_RESTRICTED_ACCESS_RWF_PASSWORD "rwf" // Flash access level password. Let undefined to set the same as for write access level. + +// Storing cleartext passwords in Flash memory is not safe, consider storing their SHA1 hash instead +// Even with this option, the hash must be generated from reasonably complex password to prevent dictionary attack. +#define FMSTR_USE_HASHED_PASSWORDS 0 // When non-zero, the passwords above are specified as a pointer to 20-byte SHA1 hash of password text + +#endif /* __FREEMASTER_CFG_H */ + +//////////////////////////////////////////////////////////////////////////////// +// EOF +//////////////////////////////////////////////////////////////////////////////// diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/main.c b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/main.c new file mode 100644 index 0000000..2b8ec06 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/main.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - Example Application + */ + +//////////////////////////////////////////////////////////////////////////////// +// Includes +//////////////////////////////////////////////////////////////////////////////// + +#include "pin_mux.h" +#include "fsl_common.h" +#include "board.h" + +#include "freemaster.h" +#include "freemaster_example.h" + +//////////////////////////////////////////////////////////////////////////////// +// Variables +//////////////////////////////////////////////////////////////////////////////// + +//! Note: All global variables accessed by FreeMASTER are defined in a shared +//! freemaster_example.c file + +//////////////////////////////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Code +//////////////////////////////////////////////////////////////////////////////// + +int main(void) +{ + /* Board initialization */ + BOARD_InitPins(); + BOARD_BootClockFRO30M(); + + /* This example uses shared code from FreeMASTER generic example application */ + FMSTR_Example_Init(); + + while(1) + { + /* FreeMASTER example increments several variables periodically, + use the FreeMASTER PC Host tool to visualize the variables */ + FMSTR_Example_Poll(); + } +} +//////////////////////////////////////////////////////////////////////////////// +// EOF +///////////////////////////////////////////////////////////////////////////////// diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/pin_mux.c b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/pin_mux.c new file mode 100644 index 0000000..6c25087 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/pin_mux.c @@ -0,0 +1,161 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v6.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 6.0.1 +board: LPC845BREAKOUT +pin_labels: +- {pin_num: '11', pin_signal: PIO1_0/CAPT_X1, label: 'LD1[3]/CN1[31]/PIO1_0/CAPT_X1', identifier: LED_GREEN} +- {pin_num: '14', pin_signal: PIO1_1/CAPT_X2, label: 'LD1[4]/CN1[30]/PIO1_1/CAPT_X2', identifier: LED_BLUE} +- {pin_num: '16', pin_signal: PIO1_2/CAPT_X3, label: 'LD1[2]/CN1[29]/PIO1_2/CAPT_X3', identifier: LED_RED} +- {pin_num: '1', pin_signal: PIO1_8/CAPT_YL, label: S1/PIO1_8/CAPT_YL, identifier: CAPY_LOW} +- {pin_num: '2', pin_signal: PIO0_13/ADC_10, label: 'CN1[26]/PIO0_13/ADC_10'} +- {pin_num: '3', pin_signal: PIO1_9/CAPT_YH, label: S1/PIO1_9/CAPT_YH, identifier: CAPY_HIGH} +- {pin_num: '4', pin_signal: PIO0_12, label: 'K1/CN1[25]/PIO0_12', identifier: K1} +- {pin_num: '5', pin_signal: RESETN/PIO0_5, label: 'K2/CN3[10]/CN1[9]/CN1[34]/RESET/PIO0_5', identifier: K2} +- {pin_num: '6', pin_signal: PIO0_4/ADC_11, label: 'K3/CN1[35]/PIO0_4/ADC_11/TRSTN/WAKEUP', identifier: K3} +- {pin_num: '7', pin_signal: PIO0_28, label: 'CN1[14]/PIO0_28/WKTCLKIN'} +- {pin_num: '8', pin_signal: SWCLK/PIO0_3, label: 'CN3[4]/CN1[36]/SWCLK/PIO0_3/TCK'} +- {pin_num: '9', pin_signal: PIO0_31/CAPT_X0, label: S1/PIO0_31/CAPT_X0, identifier: CAPX} +- {pin_num: '10', pin_signal: SWDIO/PIO0_2, label: 'CN3[2]/CN1[37]/SWDIO/PIO0_2/TMS'} +- {pin_num: '12', pin_signal: PIO0_11/I2C0_SDA, label: 'CN1[24]/PIO0_11/I2C0_SDA'} +- {pin_num: '13', pin_signal: PIO0_10/I2C0_SCL, label: 'CN1[23]/PIO0_10/I2C0_SCL'} +- {pin_num: '15', pin_signal: PIO0_16, label: 'CN1[1]/PIO0_16'} +- {pin_num: '17', pin_signal: PIO0_27, label: 'CN1[13]/PIO0_27'} +- {pin_num: '18', pin_signal: PIO0_26, label: 'CN1[12]/PIO0_26'} +- {pin_num: '19', pin_signal: PIO0_25, label: 'CN1[11]/PIO0_25', identifier: DEBUG_UART_TX} +- {pin_num: '20', pin_signal: PIO0_24, label: 'CN1[10]/PIO0_24', identifier: DEBUG_UART_RX} +- {pin_num: '21', pin_signal: PIO1_3/CAPT_X4, label: PIO1_3/CAPT_X4} +- {pin_num: '22', pin_signal: PIO0_15, label: 'CN1[28]/PIO0_15'} +- {pin_num: '23', pin_signal: PIO1_4/CAPT_X5, label: PIO1_4/CAPT_X5} +- {pin_num: '24', pin_signal: PIO0_1/ACMP_I2/CLKIN, label: 'CN1[38]/PIO0_1/ACMP_I2/CLKIN/TDI'} +- {pin_num: '25', pin_signal: PIO0_9/XTALOUT, label: 'CN1[18]/CN1[22]/PIO0_9/XTALOUT'} +- {pin_num: '26', pin_signal: PIO0_8/XTALIN, label: 'CN1[19]/CN1[21]/PIO0_8/XTALIN'} +- {pin_num: '27', pin_signal: PIO1_5/CAPT_X6, label: PIO1_5/CAPT_X6} +- {pin_num: '28', pin_signal: PIO1_6/CAPT_X7, label: PIO1_6/CAPT_X7} +- {pin_num: '29', pin_signal: VDD29, label: VDD, identifier: CPU_VDD} +- {pin_num: '30', pin_signal: VSS30, label: VSS} +- {pin_num: '31', pin_signal: VREFN, label: FB2/VREFN} +- {pin_num: '32', pin_signal: VREFP, label: FB1/VREFP} +- {pin_num: '33', pin_signal: PIO0_7/ADC_0, label: 'CN1[32]/RV1/PIO0_7/ADC_0'} +- {pin_num: '34', pin_signal: PIO0_6/ADC_1/ACMPVREF, label: 'CN1[33]/PIO0_6/ADC_1/ACMPVREF'} +- {pin_num: '35', pin_signal: PIO1_7/CAPT_X8, label: PIO1_7/CAPT_X8} +- {pin_num: '36', pin_signal: PIO0_0/ACMP_I1, label: 'CN1[39]/PIO0_0/ACMP_I1/TDO'} +- {pin_num: '37', pin_signal: PIO0_14/ACMP_I3/ADC_2, label: 'CN1[27]/PIO0_14/ACMP_I3/ADC_2'} +- {pin_num: '38', pin_signal: PIO0_29/DACOUT_1, label: 'CN1[15]/PIO0_29/DACOUT_1'} +- {pin_num: '39', pin_signal: PIO0_23/ADC_3/ACMP_I4, label: 'CN1[8]/PIO0_23/ADC_3/ACMP_I4'} +- {pin_num: '40', pin_signal: VDDA, label: FB1/VDDA, identifier: VDDA} +- {pin_num: '41', pin_signal: VSSA, label: FB2/VSSA, identifier: VSSA} +- {pin_num: '42', pin_signal: PIO0_30/ACMP_I5, label: S1/PIO0_30/ACMP_I5, identifier: CAPY_R} +- {pin_num: '43', pin_signal: PIO0_22/ADC_4, label: 'CN1[7]/PIO0_22/ADC_4'} +- {pin_num: '44', pin_signal: PIO0_21/ADC_5, label: 'CN1[6]/PIO0_21/ADC_5'} +- {pin_num: '45', pin_signal: PIO0_20/ADC_6, label: 'CN1[5]/PIO0_20/ADC_6'} +- {pin_num: '46', pin_signal: PIO0_19/ADC_7, label: 'CN1[4]/PIO0_19/ADC_7'} +- {pin_num: '47', pin_signal: PIO0_18/ADC_8, label: 'CN1[3]/PIO0_18/ADC_8'} +- {pin_num: '48', pin_signal: PIO0_17/ADC_9/DACOUT_0, label: 'CN1[2]/PIO0_17/ADC_9/DACOUT_0'} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', prefix: BOARD_, coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '20', peripheral: USART0, signal: RXD, pin_signal: PIO0_24, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '19', peripheral: USART0, signal: TXD, pin_signal: PIO0_25, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_24_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PORT0 PIN24 (coords: ) is configured as */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_24, IOCON_INDEX_PIO0_24_config); + + const uint32_t IOCON_INDEX_PIO0_25_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PORT0 PIN25 (coords: ) is configured as */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_25, IOCON_INDEX_PIO0_25_config); + + /* USART0_TXD connect to P0_25 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); + + /* USART0_RXD connect to P0_24 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/pin_mux.h b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/pin_mux.h new file mode 100644 index 0000000..39cc087 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/pin_mux.h @@ -0,0 +1,93 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*********************************************************************************************************************** + * Definitions + **********************************************************************************************************************/ + +/*! @brief Direction type */ +typedef enum _pin_mux_direction +{ + kPIN_MUX_DirectionInput = 0U, /* Input direction */ + kPIN_MUX_DirectionOutput = 1U, /* Output direction */ + kPIN_MUX_DirectionInputOrOutput = 2U /* Input or output direction */ +} pin_mux_direction_t; + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! @name PIO0_24 (number 20), CN1[10]/PIO0_24 + @{ */ +#define BOARD_DEBUG_UART_RX_PERIPHERAL USART0 /*!<@brief Device name: USART0 */ +#define BOARD_DEBUG_UART_RX_SIGNAL RXD /*!<@brief USART0 signal: RXD */ +#define BOARD_DEBUG_UART_RX_PORT 0U /*!<@brief PORT device name: 0U */ +#define BOARD_DEBUG_UART_RX_PIN 24U /*!<@brief 0U pin index: 24 */ +#define BOARD_DEBUG_UART_RX_PIN_NAME PIO0_24 /*!<@brief Pin name */ +#define BOARD_DEBUG_UART_RX_LABEL "CN1[10]/PIO0_24" /*!<@brief Label */ +#define BOARD_DEBUG_UART_RX_NAME "DEBUG_UART_RX" /*!<@brief Identifier name */ + /* @} */ + +/*! @name PIO0_25 (number 19), CN1[11]/PIO0_25 + @{ */ +#define BOARD_DEBUG_UART_TX_PERIPHERAL USART0 /*!<@brief Device name: USART0 */ +#define BOARD_DEBUG_UART_TX_SIGNAL TXD /*!<@brief USART0 signal: TXD */ +#define BOARD_DEBUG_UART_TX_PORT 0U /*!<@brief PORT device name: 0U */ +#define BOARD_DEBUG_UART_TX_PIN 25U /*!<@brief 0U pin index: 25 */ +#define BOARD_DEBUG_UART_TX_PIN_NAME PIO0_25 /*!<@brief Pin name */ +#define BOARD_DEBUG_UART_TX_LABEL "CN1[11]/PIO0_25" /*!<@brief Label */ +#define BOARD_DEBUG_UART_TX_NAME "DEBUG_UART_TX" /*!<@brief Identifier name */ + /* @} */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/readme.txt b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/readme.txt new file mode 100644 index 0000000..52e4a0d --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_pdbdm/readme.txt @@ -0,0 +1,44 @@ +Hardware requirements +===================== +- Mini/micro USB cable +- Target microcontroller board +- Personal Computer +- FreeMASTER 2.5 or later installed on PC + +Board settings +============== +No special settings are required. The demo communicates by uploading and +downloading communication frames directly to/from the microcontroller +RAM buffer using the Debug USB port. Standard debugger must not be active +during the FreeMASTER communication. + +Prepare the demo +=============== +1. Connect a USB cable between the host PC and the Debug USB port on the target board. +2. Use one of the flash-based build targets. +3. Compile and download the program to the target microcontroller. +4. Run and resume application execution when debugger stops in the main() function. + +Disconnect the debugger +======================= +5. Terminate the debugger session to release the JTAG interface for FreeMASTER use. +6. Reset the target board to make sure it runs after detaching the debugger. + +Connect with FreeMASTER +======================= +7. Run FreeMASTER, use the Connection Wizard or open Project Options. +8. Select communication using the FreeMASTER Packet Driven BDM Communication (PD-BDM) plug-in. +9. Configure the PD-BDM plug-in: + - Use the same "underlying" BDM/JTAG interface as used in debugger (typically CMSIS-DAP). + - Configure this BDM/JTAG interface and test its connection. + - Specify or search for a RAM address of the "_pdbdm" communication buffer. + - Test connection and close the configuration dialog. +10. Start communication, FreeMASTER loads the initial TSA Active Content links in the Welcome page. +11. Click the "FreeMASTER Demonstration Project (embedded in device)" in the Welcome page. +12. The demo is now running, you should be able to watch variable values and graphs. + +More information +================ +Read more information about FreeMASTER tool at http://www.nxp.com/freemaster. +Feel free to ask questions and report issues at FreeMASTER's +community page at https://community.nxp.com/community/freemaster diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/CMakeLists.txt b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/CMakeLists.txt new file mode 100644 index 0000000..b4061d3 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/CMakeLists.txt @@ -0,0 +1,125 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(fmstr_example_uart) + +set(MCUX_SDK_PROJECT_NAME fmstr_example_uart.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../main.c" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../freemaster_cfg.h" +"${ProjDirPath}/../../common/fmstr_example/freemaster_example.c" +"${ProjDirPath}/../../common/fmstr_example/freemaster_example.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../../common/fmstr_example/data_example_pmp.h" +"${ProjDirPath}/../../common/fmstr_example/data_img_logo.h" +"${ProjDirPath}/../../common/fmstr_example/data_img_file.h" +"${ProjDirPath}/../../common/fmstr_example/data_img_fmstrlogo.h" +"${ProjDirPath}/../../common/fmstr_example/data_html_index.h" +"${ProjDirPath}/../../common/fmstr_example/example_data.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. + ${ProjDirPath}/../../common/fmstr_example +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../middleware/freemaster + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(driver_lpc_miniusart_LPC845) + +include(middleware_fmstr_LPC845) + +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_clock_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(middleware_fmstr_platform_gen32le_LPC845) + +include(driver_power_no_lib_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/LPC845_flash.ld b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_all.bat b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_all.sh b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_debug.bat b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_debug.sh b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_release.bat b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_release.sh b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/clean.bat b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/clean.sh b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/flags.cmake b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/flags.cmake new file mode 100755 index 0000000..273075a --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/armgcc/flags.cmake @@ -0,0 +1,172 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DSDK_DEBUGCONSOLE=1 \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DSDK_DEBUGCONSOLE=1 \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/board.c b/boards/lpc845breakout/freemaster_examples/fmstr_uart/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/board.h b/boards/lpc845breakout/freemaster_examples/fmstr_uart/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/freemaster_examples/fmstr_uart/clock_config.c b/boards/lpc845breakout/freemaster_examples/fmstr_uart/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/freemaster_examples/fmstr_uart/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_all.bat b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_all.sh b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_debug.bat b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_debug.sh b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_release.bat b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_release.sh b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpc845breakout/touch_examples/capt_key/armgcc/clean.bat b/boards/lpc845breakout/touch_examples/capt_key/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpc845breakout/touch_examples/capt_key/armgcc/clean.sh b/boards/lpc845breakout/touch_examples/capt_key/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpc845breakout/touch_examples/capt_key/armgcc/flags.cmake b/boards/lpc845breakout/touch_examples/capt_key/armgcc/flags.cmake new file mode 100755 index 0000000..1ef7936 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD48 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpc845breakout/touch_examples/capt_key/board.c b/boards/lpc845breakout/touch_examples/capt_key/board.c new file mode 100644 index 0000000..404ca48 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/board.c @@ -0,0 +1,39 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpc845breakout/touch_examples/capt_key/board.h b/boards/lpc845breakout/touch_examples/capt_key/board.h new file mode 100644 index 0000000..4130867 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/board.h @@ -0,0 +1,135 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPC845BREAKOUT" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 1U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 1U +#endif + +#ifndef BOARD_K3_GPIO +#define BOARD_K3_GPIO GPIO +#endif +#define BOARD_K3_GPIO_PORT 0U +#ifndef BOARD_K3_GPIO_PIN +#define BOARD_K3_GPIO_PIN 4U +#endif +#define BOARD_K3_NAME "K3" +#define BOARD_K3_IRQ PIN_INT0_IRQn +#define BOARD_K3_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 1U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 2U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpc845breakout/touch_examples/capt_key/capt_key.c b/boards/lpc845breakout/touch_examples/capt_key/capt_key.c new file mode 100644 index 0000000..43966d8 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/capt_key.c @@ -0,0 +1,222 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include "touch_hal.h" +#include "touch.h" +#include "glitch_filter.h" +#include "app_config.h" + +#include "pin_mux.h" +#include "board.h" +#include +#include "fsl_power.h" +#include "fsl_gpio.h" +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* touch state machine. */ +typedef enum +{ + kAPP_TouchStateInit = 0, /* Initialization. */ + kAPP_TouchStateCalib = 1, /* Calibration, learn the baseline. */ + kAPP_TouchStateDetect = 2, /* Detection. */ +} app_touch_state_t; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +void BOARD_InitLED(void); +void BOARD_TurnOnLed(uint32_t index); +void BOARD_TurnOffLed(uint32_t index); +void BOARD_TurnOnAllLed(void); +void BOARD_TurnOffAllLed(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +static const uint8_t ledPinIndex[] = {0}; + +int32_t appTouchStateInitCounter = 0; +bool appTouchWindowsIsStable = true; +int32_t pressedKeyIndex; +int32_t oldPressedKeyIndex; +app_touch_state_t appTouchState = kAPP_TouchStateInit; +glitch_filter_handle_t appGlitchFilterHandle; + +int16_t appTouchValRaw[TOUCH_X_CHANNEL_COUNT] = {0}; +int32_t appTouchWindowsSum[TOUCH_X_CHANNEL_COUNT]; +int32_t appTouchWindowsAverage[TOUCH_X_CHANNEL_COUNT]; +int32_t appTouchWindowsVariance[TOUCH_X_CHANNEL_COUNT]; + +/******************************************************************************* + * Code + ******************************************************************************/ + +void BOARD_InitLED(void) +{ + const gpio_pin_config_t pinConfig = { + .pinDirection = kGPIO_DigitalOutput, + .outputLogic = 1U, + }; + + GPIO_PortInit(GPIO, 1U); + + for (uint8_t i = 0; i < ARRAY_SIZE(ledPinIndex); ++i) + { + GPIO_PinInit(GPIO, 1U, ledPinIndex[i], &pinConfig); + } +} + +void BOARD_TurnOnLed(uint32_t index) +{ + if (index < ARRAY_SIZE(ledPinIndex)) + { + GPIO_PortClear(GPIO, 1U, 1U << ledPinIndex[index]); + } +} + +void BOARD_TurnOffLed(uint32_t index) +{ + if (index < ARRAY_SIZE(ledPinIndex)) + { + GPIO_PortSet(GPIO, 1U, 1U << ledPinIndex[index]); + } +} + +void BOARD_TurnOnAllLed(void) +{ + for (uint8_t i = 0; i < ARRAY_SIZE(ledPinIndex); ++i) + { + GPIO_PortClear(GPIO, 1U, 1U << ledPinIndex[i]); + } +} + +void BOARD_TurnOffAllLed(void) +{ + for (uint8_t i = 0; i < ARRAY_SIZE(ledPinIndex); ++i) + { + GPIO_PortSet(GPIO, 1U, 1U << ledPinIndex[i]); + } +} + +int main(void) +{ + /* Attach clock to CAPT */ + CLOCK_Select(kCAPT_Clk_From_Fro); + POWER_DisablePD(kPDRUNCFG_PD_ACMP); + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + BOARD_InitLED(); + BOARD_TurnOffAllLed(); + + /* touch. */ + TOUCH_WINDOWS_Init(); + TOUCH_HAL_Init(); + + appTouchState = kAPP_TouchStateInit; + + while (1) + { + TOUCH_HAL_WaitDataReady(appTouchValRaw); + + /* Push the raw data into window array. */ + TOUCH_WINDOWS_Puth(appTouchValRaw); + + /* process the state machine. */ + switch (appTouchState) + { + /* + * Init stage. + * In this stage, touch scan is started, the captured raw data is pushed + * into the window array, but not processed. + * This drops the unstable data after reset. + */ + case kAPP_TouchStateInit: + + if (appTouchStateInitCounter < 4u * TOUCH_WINDOW_LENGTH) + { + appTouchStateInitCounter++; + } + else + { + appTouchStateInitCounter = 0u; + appTouchState = kAPP_TouchStateCalib; + + BOARD_TurnOnAllLed(); + } + break; + + /* Calibration stage. */ + case kAPP_TouchStateCalib: + + /* Check variance to make sure the touch sample data is stable. */ + TOUCH_WINDOWS_CalcAverage(appTouchWindowsAverage); + TOUCH_WINDOWS_CalcVariance(appTouchWindowsAverage, appTouchWindowsVariance); + + appTouchWindowsIsStable = true; + for (uint8_t i = 0u; i < TOUCH_X_CHANNEL_COUNT; i++) + { + if (appTouchWindowsVariance[i] > APP_CHANNEL_STABLE_VARIANCE) + { + appTouchWindowsIsStable = false; + break; + } + } + + /* When sample data stable, use the stable data in window to calculate the baseline. */ + if (appTouchWindowsIsStable) + { + TOUCH_WINDOWS_CalcSum(appTouchWindowsSum); + TOUCH_WINDOWS_SetBaseline(appTouchWindowsSum); + + /* calib done. */ + BOARD_TurnOffAllLed(); + + FILTER_Init(&appGlitchFilterHandle, TOUCH_X_CHANNEL_COUNT, APP_GLITCH_FILTER_LEVEL); + appTouchState = kAPP_TouchStateDetect; + } + + break; + + case kAPP_TouchStateDetect: + + TOUCH_WINDOWS_CalcSum(appTouchWindowsSum); + + pressedKeyIndex = TOUCH_GetPressedKeyIndex(appTouchWindowsSum); + + pressedKeyIndex = FILTER_Output(&appGlitchFilterHandle, pressedKeyIndex); + + if (TOUCH_X_CHANNEL_COUNT == pressedKeyIndex) + { + BOARD_TurnOffAllLed(); + } + else + { + if (oldPressedKeyIndex != pressedKeyIndex) + { + BOARD_TurnOffLed(oldPressedKeyIndex); + } + BOARD_TurnOnLed(pressedKeyIndex); + } + + oldPressedKeyIndex = pressedKeyIndex; + + break; + + default: + appTouchState = kAPP_TouchStateInit; + break; + } /* end switch. */ + } /* end while. */ +} /* end main. */ diff --git a/boards/lpc845breakout/touch_examples/capt_key/capt_key_v3_9.xml b/boards/lpc845breakout/touch_examples/capt_key/capt_key_v3_9.xml new file mode 100644 index 0000000..b2b8107 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/capt_key_v3_9.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpc845breakout/touch_examples/capt_key/clock_config.c b/boards/lpc845breakout/touch_examples/capt_key/clock_config.c new file mode 100644 index 0000000..ec32ba0 --- /dev/null +++ b/boards/lpc845breakout/touch_examples/capt_key/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD48 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPC845BREAKOUT + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Main function + */ +int main(void) +{ + char ch; + + /* Init board hardware. */ + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + PRINTF("hello world.\r\n"); + + while (1) + { + ch = GETCHAR(); + PUTCHAR(ch); + } +} diff --git a/boards/lpcxpresso845max/demo_apps/hello_world/hello_world.mex b/boards/lpcxpresso845max/demo_apps/hello_world/hello_world.mex new file mode 100644 index 0000000..5f4e732 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/hello_world/hello_world.mex @@ -0,0 +1,298 @@ + + + + LPC845 + LPC845M301JBD64 + LPCXpresso845 + ksdk2_0 + + + + + + + true + false + false + + + + + 0.2.7 + + + + Configures pin routing and optionally pin electrical features. + + true + BOARD_ + core0 + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2.7 + + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + true + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + false + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + 0.2.7 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/boards/lpcxpresso845max/demo_apps/hello_world/hello_world_v3_9.xml b/boards/lpcxpresso845max/demo_apps/hello_world/hello_world_v3_9.xml new file mode 100644 index 0000000..2f03403 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/hello_world/hello_world_v3_9.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/demo_apps/hello_world/pin_mux.c b/boards/lpcxpresso845max/demo_apps/hello_world/pin_mux.c new file mode 100644 index 0000000..98652fa --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/hello_world/pin_mux.c @@ -0,0 +1,112 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 +board: LPCXpresso845 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', prefix: BOARD_, coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t DEBUG_UART_RX = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, DEBUG_UART_RX); + + const uint32_t DEBUG_UART_TX = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, DEBUG_UART_TX); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/demo_apps/hello_world/pin_mux.h b/boards/lpcxpresso845max/demo_apps/hello_world/pin_mux.h new file mode 100644 index 0000000..41a63b4 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/hello_world/pin_mux.h @@ -0,0 +1,73 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! @name PIO1_17 (number 37), P3[13]/P6[1]/U4[31]/TARGET_TX_DEBUG_P1_17 + @{ */ +#define BOARD_DEBUG_UART_TX_PORT 1U /*!<@brief PORT device index: 1 */ +#define BOARD_DEBUG_UART_TX_PIN 17U /*!<@brief PORT pin number */ +#define BOARD_DEBUG_UART_TX_PIN_MASK (1U << 17U) /*!<@brief PORT pin mask */ + /* @} */ + +/*! @name PIO1_16 (number 36), P7[1]/U4[32]/TARGET_RX_DEBUG_P1_16 + @{ */ +#define BOARD_DEBUG_UART_RX_PORT 1U /*!<@brief PORT device index: 1 */ +#define BOARD_DEBUG_UART_RX_PIN 16U /*!<@brief PORT pin number */ +#define BOARD_DEBUG_UART_RX_PIN_MASK (1U << 16U) /*!<@brief PORT pin mask */ + /* @} */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/demo_apps/hello_world/readme.txt b/boards/lpcxpresso845max/demo_apps/hello_world/readme.txt new file mode 100644 index 0000000..46c756a --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/hello_world/readme.txt @@ -0,0 +1,54 @@ +## Overview +----------------------------------------------------------------------------------------- +The Hello World demo application provides a sanity check for the new SDK build environments +and board bring up. The Hello World demo prints the "hello world." string to the terminal +using the SDK UART drivers. The purpose of this demo is to show how to use the UART, and +to provide a simple project for debugging and further development. + +## Functional description +----------------------------------------------------------------------------------------- +This demo is just for bring up a new SDK build environments on board. +Board will initialize the hardware configuration, then print a "hello world." string to +the terminal emulator on PC, and print out the received characters in while loop of +main routine. + +## Toolchain supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Mini/micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +No special settings are required. + +## Run the Demo +------------------------ +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the board). + +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Choose an IDE, building the project and download the program to the target board. + More information about how to compile and program the project can refer to the + + [Getting Started with MCUXpresso SDK](../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Launch the debugger in your IDE to begin running the demo. + +## Expected Result +------------------------ +- Board will print "hello world." to the terminal, and if users input some characters, + board will send them back to the terminal emulator immediately. + diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/CMakeLists.txt new file mode 100644 index 0000000..db700fe --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/CMakeLists.txt @@ -0,0 +1,110 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(led_blinky) + +set(MCUX_SDK_PROJECT_NAME led_blinky.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../led_blinky.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_reset_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_all.bat b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_all.sh b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_debug.bat b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_debug.sh b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_release.bat b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_release.sh b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/clean.bat b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/clean.sh b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/flags.cmake b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/board.c b/boards/lpcxpresso845max/demo_apps/led_blinky/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/board.h b/boards/lpcxpresso845max/demo_apps/led_blinky/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/demo_apps/led_blinky/clock_config.c b/boards/lpcxpresso845max/demo_apps/led_blinky/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/led_blinky/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +#include "fsl_pint.h" +#include "fsl_swm.h" +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_ACTIVE_IN_DEEPSLEEP (kPDSLEEPCFG_DeepSleepBODActive | kPDSLEEPCFG_DeepSleepWDTOscActive) +#define DEMO_USER_WAKEUP_KEY_GPIO GPIO +#define DEMO_USER_WAKEUP_KEY_PORT BOARD_SW2_GPIO_PORT +#define DEMO_USER_WAKEUP_KEY_PIN BOARD_SW2_GPIO_PIN +#define DEMO_SYSCON_PIN_INT_SEL (4U) +#define DEMO_SYSCON_STARTER0_MASK (1U) +#define DEMO_SYSCON_STARTER1_MASK (1U << 15U) +#define DEMO_WKT_TIMEOUT_VALUE (250000U * 12U) +#define DEMO_PINT_PIN_INT0_SRC kSYSCON_GpioPort0Pin4ToPintsel +#define DEMO_WKT_CLK_FREQ (10000U) +#define DEMO_SLEEP_WAKEUP_SOURCE "\t1. Wkt timer\r\n\t2. SW2, wakeup key\r\n\t3. SW3, reset key\r\n" +#define DEMO_DEEP_SLEEP_WAKEUP_SOURCE "\t1. Wkt timer\r\n\t2. SW2, wakeup key\r\n\t3. SW3, reset key\r\n" +#define DEMO_POWER_DOWN_WAKEUP_SOURCE "\t1. Wkt timer\r\n\t2. SW2, wakeup key\r\n\t3. SW3, reset key\r\n" +#define DEMO_DEEP_POWERDOWN_WAKEUP_SOURCE "\t1. Wkt timer\r\n\t2. SW2, wakeup key\r\n\t3. SW3, reset key\r\n" +#define DEMO_SLEEP_WAKEUP_SOURCE_SIZE (3U) +#define DEMO_DEEP_SLEEP_WAKEUP_SOURCE_SIZE (3U) +#define DEMO_POWER_DOWN_WAKEUP_SOURCE_SIZE (3U) +#define DEMO_DEEP_POWERDOWN_WAKEUP_SOURCE_SIZE (3U) +#define DEMO_WAKEUP_CASE_WKT (0U) +#define DEMO_WAKEUP_CASE_WAKEUP (1U) +#define DEMO_WAKEUP_CASE_RESET (2U) +#define DEMO_DEEP_POWERDOWN_RESET_ENABLE (1U) +#define POWER_DPD_ENABLE_WAKEUP_PIN POWER_EnableWakeupPinForDeepPowerDown(true, true); +#define POWER_DPD_ENABLE_RESET_PIN POWER_EnableResetPinForDeepPowerDown(true, true); + +static power_mode_cfg_t s_CurrentPowerMode; +static uint32_t s_CurrentWakeupSource; +/******************************************************************************* + * Prototypes + ******************************************************************************/ +void DEMO_PreEnterLowPower(void); +void DEMO_LowPowerWakeup(void); +static power_mode_cfg_t DEMO_GetUserSelection(void); +static uint32_t DEMO_GetWakeUpSource(power_mode_cfg_t targetPowerMode); + +/******************************************************************************* + * Code + ******************************************************************************/ +/* + * Callback function when wakeup key is pressed. + */ +static void pint_intr_callback(pint_pin_int_t pintr, uint32_t pmatch_status) +{ + /* do nothing here */ +} + +static void DEMO_InitWkt(void) +{ + wkt_config_t wktConfig; + + POWER_EnableLPO(true); + POWER_EnableLPOInDeepPowerDownMode(true); + + wktConfig.clockSource = kWKT_LowPowerClockSource; + + /* Init wkt module */ + WKT_Init(WKT, &wktConfig); + + /* Clear Pending Interrupt */ + NVIC_ClearPendingIRQ(WKT_IRQn); + /* Enable at the NVIC */ + EnableIRQ(WKT_IRQn); +} + +static void DEMO_InitResetPin(void) +{ + SWM_SetFixedPinSelect(SWM0, kSWM_RESETN, true); +} + +/* + * Setup a GPIO input pin as wakeup source. + */ +static void DEMO_InitWakeupPin(void) +{ + gpio_pin_config_t gpioPinConfigStruct; + + /* Set SW pin as GPIO input. */ + gpioPinConfigStruct.pinDirection = kGPIO_DigitalInput; + GPIO_PinInit(DEMO_USER_WAKEUP_KEY_GPIO, DEMO_USER_WAKEUP_KEY_PORT, DEMO_USER_WAKEUP_KEY_PIN, &gpioPinConfigStruct); + + SYSCON_AttachSignal(SYSCON, kPINT_PinInt0, DEMO_PINT_PIN_INT0_SRC); + + /* Configure the interrupt for SW pin. */ + PINT_Init(PINT); + PINT_PinInterruptConfig(PINT, kPINT_PinInt0, kPINT_PinIntEnableFallEdge, pint_intr_callback); + PINT_EnableCallback(PINT); /* Enable callbacks for PINT */ +} + + +void DEMO_PreEnterLowPower(void) +{ + /* switch main clock source to FRO18M */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); + POWER_DisablePD(kPDRUNCFG_PD_FRO); + CLOCK_SetMainClkSrc(kCLOCK_MainClkSrcFro); + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); + + /* + * system osc power down + * application should decide if more part need to power down to achieve better power consumption + */ + POWER_EnablePD(kPDRUNCFG_PD_SYSOSC); + CLOCK_DisableClock(kCLOCK_Iocon); + CLOCK_DisableClock(kCLOCK_Uart0); +} + +void DEMO_LowPowerWakeup(void) +{ + /* clock configurations restore */ + BOARD_BootClockPll24M(); + + CLOCK_EnableClock(kCLOCK_Iocon); + CLOCK_EnableClock(kCLOCK_Uart0); +} +void WKT_IRQHandler(void) +{ + /* Clear interrupt flag.*/ + WKT_ClearStatusFlags(WKT, kWKT_AlarmFlag); + WKT_StartTimer(WKT, USEC_TO_COUNT(DEMO_WKT_TIMEOUT_VALUE, DEMO_WKT_CLK_FREQ)); +} + +static uint32_t DEMO_GetUserInput(uint32_t maxChoice) +{ + uint32_t ch = 0U; + + while (1) + { + ch = GETCHAR(); + if ((ch < '1') || (ch > (maxChoice + '0'))) + { + continue; + } + else + { + ch = ch - '1'; + break; + } + } + + return ch; +} + +/*! + * @brief Main function + */ +int main(void) +{ + /* Init board hardware. */ + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockPll24M(); + BOARD_InitDebugConsole(); + + /* Init existed wake up source */ + DEMO_InitWakeupPin(); + DEMO_InitResetPin(); + DEMO_InitWkt(); + + PRINTF("Power mode switch Demo for LPC8xx.\r\n"); + + while (1) + { + s_CurrentPowerMode = DEMO_GetUserSelection(); + s_CurrentWakeupSource = DEMO_GetWakeUpSource(s_CurrentPowerMode); + + /* prepare to enter low power mode */ + DEMO_PreEnterLowPower(); + + /* Enter the low power mode. */ + switch (s_CurrentPowerMode) + { + case kPmu_Sleep: /* Enter sleep mode. */ + POWER_EnterSleep(); + break; + case kPmu_Deep_Sleep: /* Enter deep sleep mode. */ + POWER_EnterDeepSleep(DEMO_ACTIVE_IN_DEEPSLEEP); + break; + case kPmu_PowerDown: /* Enter deep sleep mode. */ + POWER_EnterPowerDown(DEMO_ACTIVE_IN_DEEPSLEEP); + break; + case kPmu_Deep_PowerDown: /* Enter deep power down mode. */ + POWER_EnterDeepPowerDownMode(); + break; + default: + break; + } + + /* restore the active mode configurations */ + DEMO_LowPowerWakeup(); + PRINTF("Wakeup.\r\n"); + + if (s_CurrentWakeupSource == DEMO_WAKEUP_CASE_WKT) + { + WKT_StopTimer(WKT); + } + } +} + +static uint32_t DEMO_GetWakeUpSource(power_mode_cfg_t targetPowerMode) +{ + uint32_t ch = 0U; + + switch (targetPowerMode) + { + case kPmu_Sleep: + PRINTF(DEMO_SLEEP_WAKEUP_SOURCE); + ch = DEMO_GetUserInput(DEMO_SLEEP_WAKEUP_SOURCE_SIZE); + break; + case kPmu_Deep_Sleep: + PRINTF(DEMO_DEEP_SLEEP_WAKEUP_SOURCE); + ch = DEMO_GetUserInput(DEMO_DEEP_SLEEP_WAKEUP_SOURCE_SIZE); + break; + case kPmu_PowerDown: + PRINTF(DEMO_POWER_DOWN_WAKEUP_SOURCE); + ch = DEMO_GetUserInput(DEMO_POWER_DOWN_WAKEUP_SOURCE_SIZE); + break; + case kPmu_Deep_PowerDown: + PRINTF(DEMO_DEEP_POWERDOWN_WAKEUP_SOURCE); + ch = DEMO_GetUserInput(DEMO_DEEP_POWERDOWN_WAKEUP_SOURCE_SIZE); + break; + } + + switch (ch) + { + case DEMO_WAKEUP_CASE_WKT: + /* Enable wakeup for wkt. */ + EnableDeepSleepIRQ(WKT_IRQn); + DisableDeepSleepIRQ(PIN_INT0_IRQn); + WKT_StartTimer(WKT, USEC_TO_COUNT(DEMO_WKT_TIMEOUT_VALUE, DEMO_WKT_CLK_FREQ)); + break; + case DEMO_WAKEUP_CASE_WAKEUP: + /* Enable wakeup for PinInt0. */ + EnableDeepSleepIRQ(PIN_INT0_IRQn); + DisableDeepSleepIRQ(WKT_IRQn); + if (targetPowerMode == kPmu_Deep_PowerDown) + { + POWER_DPD_ENABLE_WAKEUP_PIN + } + break; + case DEMO_WAKEUP_CASE_RESET: + if (targetPowerMode == kPmu_Deep_PowerDown) + { + POWER_DPD_ENABLE_RESET_PIN + } + break; + } + + return ch; +} + +/* + * Get user selection from UART. + */ +static power_mode_cfg_t DEMO_GetUserSelection(void) +{ + uint32_t ch = 0U; + + PRINTF( + "\r\nSelect an option\r\n" + "\t1. Sleep mode\r\n" + "\t2. Deep Sleep mode\r\n" + "\t3. Power Down mode\r\n" + "\t4. Deep power down mode\r\n"); + + ch = DEMO_GetUserInput(4); + + switch (ch) + { + case 0: + ch = kPmu_Sleep; + break; + case 1: + ch = kPmu_Deep_Sleep; + break; + case 2: + ch = kPmu_PowerDown; + break; + case 3: + ch = kPmu_Deep_PowerDown; + default: + break; + } + return (power_mode_cfg_t)ch; +} diff --git a/boards/lpcxpresso845max/demo_apps/power_mode_switch_lpc/power_mode_switch_lpc.mex b/boards/lpcxpresso845max/demo_apps/power_mode_switch_lpc/power_mode_switch_lpc.mex new file mode 100644 index 0000000..8bc8dc7 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/power_mode_switch_lpc/power_mode_switch_lpc.mex @@ -0,0 +1,298 @@ + + + + LPC845 + LPC845M301JBD64 + LPCXpresso845 + ksdk2_0 + + + + + + + true + false + false + + + + + 0.2.7 + + + + Configures pin routing and optionally pin electrical features. + + true + BOARD_ + core0 + true + + + + + true + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2.7 + + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + true + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + false + + + + + + + + true + + + + + true + + + + + true + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + 0.2.7 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/boards/lpcxpresso845max/demo_apps/power_mode_switch_lpc/power_mode_switch_lpc_v3_9.xml b/boards/lpcxpresso845max/demo_apps/power_mode_switch_lpc/power_mode_switch_lpc_v3_9.xml new file mode 100644 index 0000000..a131432 --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/power_mode_switch_lpc/power_mode_switch_lpc_v3_9.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/demo_apps/power_mode_switch_lpc/readme.txt b/boards/lpcxpresso845max/demo_apps/power_mode_switch_lpc/readme.txt new file mode 100644 index 0000000..6fc97fd --- /dev/null +++ b/boards/lpcxpresso845max/demo_apps/power_mode_switch_lpc/readme.txt @@ -0,0 +1,75 @@ +## Overview +----------------------------------------------------------------------------------------- +The power_mode_switch_lpc application shows the usage of normal power mode control APIs for entering the four kinds of +low power mode: Sleep mode, Deep Sleep mode and Power Down mode, deep power down mode. When the application runs to each low power +mode, the device would cut off the power for specific modules to save energy. The device can be also waken up by +prepared wakeup source from external event. + +## Functional description +----------------------------------------------------------------------------------------- +This demo is to show how the various power mode can switch to each other. +There is one known issue that terminal may receive mess code after enter deep power down mode, it is caused by +the uart TX pin state changed by the MCU under deep power down mode. As the RM says, all the functional pins are +tri-stated in deep power down mode except for the WAKEUP pin and the RESET pin. So the state change will be captured by +the virtual com port as mess code. Software has no workaround for the issue. + +## Toolchain supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Mini/micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +No special settings are required. + +## Run the Demo +------------------------ +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the board). + +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Choose an IDE, building the project and download the program to the target board. + More information about how to compile and program the project can refer to the + + [Getting Started with MCUXpresso SDK](../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Launch the debugger in your IDE to begin running the demo. + +## Expected Result +------------------------ +Power mode switch Demo for LPC8xx. + +Selecct an option + + 1. Sleep mode + + 2. Deep Sleep mode + + 3. Power Down mode + + 4. Deep power down mode +/* after select power mode, terminal will output */ +Select wakeup source + + 1. Wkt timer + + 2. SW2, wakeup key + + 3. SW3, reset key +/* after wakeup, terminal will output */ +Wakeup. + + diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/acomp_basic.c b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/acomp_basic.c new file mode 100644 index 0000000..9430214 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/acomp_basic.c @@ -0,0 +1,89 @@ +/* + * Copyright 2017, 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_acomp.h" +#include "fsl_debug_console.h" +#include "pin_mux.h" +#include "board.h" + +#include "fsl_power.h" +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_ACOMP ACOMP +#define DEMO_ACOMP_POSITIVE_INPUT 0U /* Voltage ladder output. */ +#define DEMO_ACOMP_NEGATIVE_INPUT 3U /* ACMP_I3. */ +#define BOARD_LED_PORT 0U +#define BOARD_LED_PIN 12U + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Main function + */ +int main(void) +{ + acomp_config_t acompConfigStruct; + acomp_ladder_config_t ladderConfigStruct; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Power on CMP0. */ + POWER_DisablePD(kPDRUNCFG_PD_ACMP); + + PRINTF("\r\nLPC_ACOMP Basic Example.\r\n"); + + /* Init output LED GPIO. */ + LED_RED_INIT(LOGIC_LED_ON); + + /* Initialize ACOMP module. */ + ACOMP_GetDefaultConfig(&acompConfigStruct); + ACOMP_Init(DEMO_ACOMP, &acompConfigStruct); + + /* Configure internal voltage ladder. */ + ladderConfigStruct.ladderValue = 15U; /* Half of reference voltage. */ + ladderConfigStruct.referenceVoltage = kACOMP_LadderRefVoltagePinVDD; /* VDDA as the reference voltage. */ + ACOMP_SetLadderConfig(DEMO_ACOMP, &ladderConfigStruct); + +#if defined(FSL_FEATURE_ACOMP_HAS_CTRL_INTENA) && FSL_FEATURE_ACOMP_HAS_CTRL_INTENA + /* Disable interrupt. */ + ACOMP_EnableInterrupts(DEMO_ACOMP, kACOMP_InterruptsDisable); +#endif /*FSL_FEATURE_ACOMP_HAS_CTRL_INTENA*/ + /* Configure ACOMP negative and positive input channels. */ + ACOMP_SetInputChannel(DEMO_ACOMP, DEMO_ACOMP_POSITIVE_INPUT, DEMO_ACOMP_NEGATIVE_INPUT); + + PRINTF("The example compares analog input to the voltage ladder output(ACOMP negative port).\r\n"); + PRINTF("The LED will be turned ON/OFF when the analog input is LOWER/HIGHER than the ladder's output.\r\n"); + PRINTF("Change the analog input voltage to see the LED status.\r\n"); + + while (true) + { + /* Check the comparison result and sets the LED state according to the result.*/ + if (ACOMP_GetOutputStatusFlags(DEMO_ACOMP)) + { + LED_RED_ON(); + } + else + { + LED_RED_OFF(); + } + } +} diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/acomp_basic_v3_9.xml b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/acomp_basic_v3_9.xml new file mode 100644 index 0000000..e006fe5 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/acomp_basic_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/CMakeLists.txt new file mode 100644 index 0000000..8106826 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(acomp_basic) + +set(MCUX_SDK_PROJECT_NAME acomp_basic.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../acomp_basic.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_acomp_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/board.c b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/board.h b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/clock_config.c b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/acomp/acomp_basic/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/board.c b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/board.h b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/clock_config.c b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_basic/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_ADC_BASE ADC0 +#define DEMO_ADC_SAMPLE_CHANNEL_NUMBER 0U +#define DEMO_ADC_IRQ_ID ADC0_SEQA_IRQn +#define DEMO_ADC_IRQ_HANDLER_FUNC ADC0_SEQA_IRQHandler +#define DEMO_ADC_CLOCK_SOURCE kCLOCK_Fro +#define DEMO_ADC_CLOCK_DIVIDER 1U + +/******************************************************************************* + * Variables + ******************************************************************************/ +static adc_result_info_t gAdcResultInfoStruct; +adc_result_info_t *volatile gAdcResultInfoPtr = &gAdcResultInfoStruct; +volatile bool gAdcConvSeqAIntFlag; +const uint32_t g_Adc_12bitFullRange = 4096U; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void ADC_Configuration(void); + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Main function + */ +int main(void) +{ + /* Initialize board hardware. */ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach FRO clock to ADC0. */ + CLOCK_Select(kADC_Clk_From_Fro); + CLOCK_SetClkDivider(kCLOCK_DivAdcClk, 1U); + /* Power on ADC0. */ + POWER_DisablePD(kPDRUNCFG_PD_ADC0); + PRINTF("ADC burst example.\r\n"); + +#if !(defined(FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC) && FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC) + uint32_t frequency = 0U; + /* Calibration after power up. */ +#if defined(FSL_FEATURE_ADC_HAS_CALIB_REG) && FSL_FEATURE_ADC_HAS_CALIB_REG + DEMO_ADC_BASE->CTRL |= ADC_CTRL_BYPASSCAL_MASK; + frequency = CLOCK_GetFreq(kCLOCK_BusClk); + if (true == ADC_DoOffsetCalibration(DEMO_ADC_BASE, frequency)) +#else +#if defined(SYSCON_ADCCLKDIV_DIV_MASK) + frequency = CLOCK_GetFreq(DEMO_ADC_CLOCK_SOURCE) / CLOCK_GetClkDivider(kCLOCK_DivAdcClk); +#else + frequency = CLOCK_GetFreq(DEMO_ADC_CLOCK_SOURCE); +#endif /* SYSCON_ADCCLKDIV_DIV_MASK */ + if (true == ADC_DoSelfCalibration(DEMO_ADC_BASE, frequency)) +#endif /* FSL_FEATURE_ADC_HAS_CALIB_REG */ + { + PRINTF("ADC Calibration Done.\r\n"); + } + else + { + PRINTF("ADC Calibration Failed.\r\n"); + } +#endif /* FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC */ + + ADC_Configuration(); + + /* Enable the interrupt. */ + ADC_EnableInterrupts(DEMO_ADC_BASE, kADC_ConvSeqAInterruptEnable); + NVIC_EnableIRQ(DEMO_ADC_IRQ_ID); + + PRINTF("Configuration Done.\r\n"); + +#if defined(FSL_FEATURE_ADC_HAS_CTRL_RESOL) & FSL_FEATURE_ADC_HAS_CTRL_RESOL + PRINTF("ADC Full Range: %d\r\n", g_Adc_12bitFullRange); +#endif /* FSL_FEATURE_ADC_HAS_CTRL_RESOL */ + while (1) + { + GETCHAR(); + + gAdcConvSeqAIntFlag = false; + + /* ADC_DoSoftwareTriggerConvSeqA(DEMO_ADC_BASE); */ + /* Enable the burst mode and start the conversion. */ + ADC_EnableConvSeqABurstMode(DEMO_ADC_BASE, true); + + while (!gAdcConvSeqAIntFlag) + { + } + PRINTF("gAdcResultInfoStruct.result = %d\r\n", gAdcResultInfoStruct.result); + PRINTF("gAdcResultInfoStruct.channelNumber = %d\r\n", gAdcResultInfoStruct.channelNumber); + /* PRINTF("gAdcResultInfoStruct.overrunFlag = %d\r\n", gAdcResultInfoStruct.overrunFlag ? 1U : 0U); */ + PRINTF("\r\n"); + } +} + +/* + * ISR for ADC conversion sequence A done. + */ +void DEMO_ADC_IRQ_HANDLER_FUNC(void) +{ + if (kADC_ConvSeqAInterruptFlag == (kADC_ConvSeqAInterruptFlag & ADC_GetStatusFlags(DEMO_ADC_BASE))) + { + /* Stop the burst mode and pause the conversion. */ + ADC_EnableConvSeqABurstMode(DEMO_ADC_BASE, false); + + ADC_GetChannelConversionResult(DEMO_ADC_BASE, DEMO_ADC_SAMPLE_CHANNEL_NUMBER, gAdcResultInfoPtr); + ADC_ClearStatusFlags(DEMO_ADC_BASE, kADC_ConvSeqAInterruptFlag); + gAdcConvSeqAIntFlag = true; + } + SDK_ISR_EXIT_BARRIER; +} + +/* + * Configure the ADC as normal converter in polling mode. + */ +void ADC_Configuration(void) +{ + adc_config_t adcConfigStruct; + adc_conv_seq_config_t adcConvSeqConfigStruct; + +/* Configure the converter. */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE) & FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE + adcConfigStruct.clockMode = kADC_ClockSynchronousMode; /* Using sync clock source. */ +#endif /* FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE */ + adcConfigStruct.clockDividerNumber = DEMO_ADC_CLOCK_DIVIDER; +#if defined(FSL_FEATURE_ADC_HAS_CTRL_RESOL) & FSL_FEATURE_ADC_HAS_CTRL_RESOL + adcConfigStruct.resolution = kADC_Resolution12bit; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_RESOL */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL) & FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL + adcConfigStruct.enableBypassCalibration = false; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_TSAMP) & FSL_FEATURE_ADC_HAS_CTRL_TSAMP + adcConfigStruct.sampleTimeNumber = 0U; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_TSAMP */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE) & FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE + adcConfigStruct.enableLowPowerMode = false; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE */ +#if defined(FSL_FEATURE_ADC_HAS_TRIM_REG) & FSL_FEATURE_ADC_HAS_TRIM_REG + adcConfigStruct.voltageRange = kADC_HighVoltageRange; +#endif /* FSL_FEATURE_ADC_HAS_TRIM_REG */ + ADC_Init(DEMO_ADC_BASE, &adcConfigStruct); + +#if !(defined(FSL_FEATURE_ADC_HAS_NO_INSEL) && FSL_FEATURE_ADC_HAS_NO_INSEL) + /* Use the temperature sensor input to channel 0. */ + ADC_EnableTemperatureSensor(DEMO_ADC_BASE, true); +#endif /* FSL_FEATURE_ADC_HAS_NO_INSEL. */ + + /* Enable channel DEMO_ADC_SAMPLE_CHANNEL_NUMBER's conversion in Sequence A. */ + adcConvSeqConfigStruct.channelMask = + (1U << DEMO_ADC_SAMPLE_CHANNEL_NUMBER); /* Includes channel DEMO_ADC_SAMPLE_CHANNEL_NUMBER. */ + adcConvSeqConfigStruct.triggerMask = 0U; + adcConvSeqConfigStruct.triggerPolarity = kADC_TriggerPolarityPositiveEdge; + adcConvSeqConfigStruct.enableSingleStep = false; + adcConvSeqConfigStruct.enableSyncBypass = false; + adcConvSeqConfigStruct.interruptMode = kADC_InterruptForEachSequence; + ADC_SetConvSeqAConfig(DEMO_ADC_BASE, &adcConvSeqConfigStruct); + ADC_EnableConvSeqA(DEMO_ADC_BASE, true); /* Enable the conversion sequence A. */ + /* Clear the result register. */ + ADC_DoSoftwareTriggerConvSeqA(DEMO_ADC_BASE); + while (!ADC_GetChannelConversionResult(DEMO_ADC_BASE, DEMO_ADC_SAMPLE_CHANNEL_NUMBER, &gAdcResultInfoStruct)) + { + } + ADC_GetConvSeqAGlobalConversionResult(DEMO_ADC_BASE, &gAdcResultInfoStruct); +} diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/lpc_adc_burst_v3_9.xml b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/lpc_adc_burst_v3_9.xml new file mode 100644 index 0000000..4224985 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/lpc_adc_burst_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/pin_mux.c b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/pin_mux.c new file mode 100644 index 0000000..c1bc0d5 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/pin_mux.c @@ -0,0 +1,132 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '45', peripheral: ADC0, signal: 'CH, 0', pin_signal: PIO0_7/ADC_0, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_7_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN7 (coords: 45) is configured as ADC0, CH, 0. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_7, IOCON_INDEX_PIO0_7_config); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* ADC_CHN0 connect to P0_7 */ + SWM_SetFixedPinSelect(SWM0, kSWM_ADC_CHN0, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/pin_mux.h b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/pin_mux.h new file mode 100644 index 0000000..59678d1 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/pin_mux.h @@ -0,0 +1,60 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/readme.txt b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/readme.txt new file mode 100644 index 0000000..0ad3a1a --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_burst/readme.txt @@ -0,0 +1,67 @@ +## Overview +----------- +The lpc_adc_burst example shows how to use LPC ADC driver with the burst mode. + +In this example, an outside input is used to created the input analog signal. +When user type in any key from the keyboard, the burst mode is enabled. Then the conversion +sequence A would be started automatically, till the burst would be disabled in conversion completed ISR. + +## Functional Description +------------------------- +1.This example demonstrates how to configure the A sequences with burst mode, you can configure channel via + "DEMO_ADC_SAMPLE_CHANNEL_NUMBER". + +2.Before configuration of the ADC begins, the ADC is put through a self-calibration cycle. + +3.Enable the Conversion-Complete or Sequence-Complete interrupt for sequences A. + +4.After ADC channels are assigned to each of the sequences, if the user enters any key via terminal, burst mode will start. + +5.When the first conversion completes, the interrupt would be triggered. The ISR will stop the burst mode and print conversion result + to terminal. + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +- ADC CH0 input signal J1-6(PIO0-7). + +## Run the Project +------------------------ +Run this example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board) for receiving debug information. + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + + + + +4. Monitor the information on the debug console. + +## Expected Result +------------------------ +Press any key and print user channel's result in serial terminal. + diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/CMakeLists.txt new file mode 100644 index 0000000..a0302df --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/CMakeLists.txt @@ -0,0 +1,114 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(lpc_adc_dma) + +set(MCUX_SDK_PROJECT_NAME lpc_adc_dma.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../fsl_adc_dma.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_adc_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/board.c b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/board.h b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/clock_config.c b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_dma/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_ADC_BASE ADC0 +#define DEMO_ADC_SAMPLE_CHANNEL_NUMBER 0U +#define DEMO_ADC_IRQ_ID ADC0_SEQA_IRQn +#define DEMO_ADC_IRQ_HANDLER_FUNC ADC0_SEQA_IRQHandler +#define DEMO_ADC_CLOCK_SOURCE kCLOCK_Fro +#define DEMO_ADC_CLOCK_DIVIDER 1U +static adc_result_info_t gAdcResultInfoStruct; +adc_result_info_t *volatile gAdcResultInfoPtr = &gAdcResultInfoStruct; +volatile bool gAdcConvSeqAIntFlag; +const uint32_t g_Adc_12bitFullRange = 4096U; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void ADC_Configuration(void); + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Main function + */ +int main(void) +{ + /* Initialize board hardware. */ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach FRO clock to ADC0. */ + CLOCK_Select(kADC_Clk_From_Fro); + CLOCK_SetClkDivider(kCLOCK_DivAdcClk, 1U); + /* Power on ADC0. */ + POWER_DisablePD(kPDRUNCFG_PD_ADC0); + PRINTF("ADC interrupt example.\r\n"); + +#if !(defined(FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC) && FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC) + uint32_t frequency = 0U; + /* Calibration after power up. */ +#if defined(FSL_FEATURE_ADC_HAS_CALIB_REG) && FSL_FEATURE_ADC_HAS_CALIB_REG + DEMO_ADC_BASE->CTRL |= ADC_CTRL_BYPASSCAL_MASK; + frequency = CLOCK_GetFreq(kCLOCK_BusClk); + if (true == ADC_DoOffsetCalibration(DEMO_ADC_BASE, frequency)) +#else +#if defined(SYSCON_ADCCLKDIV_DIV_MASK) + frequency = CLOCK_GetFreq(DEMO_ADC_CLOCK_SOURCE) / CLOCK_GetClkDivider(kCLOCK_DivAdcClk); +#else + frequency = CLOCK_GetFreq(DEMO_ADC_CLOCK_SOURCE); +#endif /* SYSCON_ADCCLKDIV_DIV_MASK */ + if (true == ADC_DoSelfCalibration(DEMO_ADC_BASE, frequency)) +#endif /* FSL_FEATURE_ADC_HAS_CALIB_REG */ + { + PRINTF("ADC Calibration Done.\r\n"); + } + else + { + PRINTF("ADC Calibration Failed.\r\n"); + } +#endif /* FSL_FEATURE_ADC_HAS_NO_CALIB_FUNC */ + + /* Configure the ADC as basic polling mode. */ + ADC_Configuration(); + + /* Enable the interrupt. */ + /* Enable the interrupt the for sequence A done. */ + ADC_EnableInterrupts(DEMO_ADC_BASE, kADC_ConvSeqAInterruptEnable); + NVIC_EnableIRQ(DEMO_ADC_IRQ_ID); + + PRINTF("Configuration Done.\r\n"); + +#if defined(FSL_FEATURE_ADC_HAS_CTRL_RESOL) & FSL_FEATURE_ADC_HAS_CTRL_RESOL + PRINTF("ADC Full Range: %d\r\n", g_Adc_12bitFullRange); +#endif /* FSL_FEATURE_ADC_HAS_CTRL_RESOL */ + while (1) + { + GETCHAR(); + gAdcConvSeqAIntFlag = false; + ADC_DoSoftwareTriggerConvSeqA(DEMO_ADC_BASE); + + while (!gAdcConvSeqAIntFlag) + { + } + PRINTF("gAdcResultInfoStruct.result = %d\r\n", gAdcResultInfoStruct.result); + PRINTF("gAdcResultInfoStruct.channelNumber = %d\r\n", gAdcResultInfoStruct.channelNumber); + PRINTF("gAdcResultInfoStruct.overrunFlag = %d\r\n", gAdcResultInfoStruct.overrunFlag ? 1U : 0U); + PRINTF("\r\n"); + } +} + +/* + * ISR for ADC conversion sequence A done. + */ +void DEMO_ADC_IRQ_HANDLER_FUNC(void) +{ + if (kADC_ConvSeqAInterruptFlag == (kADC_ConvSeqAInterruptFlag & ADC_GetStatusFlags(DEMO_ADC_BASE))) + { + ADC_GetChannelConversionResult(DEMO_ADC_BASE, DEMO_ADC_SAMPLE_CHANNEL_NUMBER, gAdcResultInfoPtr); + ADC_ClearStatusFlags(DEMO_ADC_BASE, kADC_ConvSeqAInterruptFlag); + gAdcConvSeqAIntFlag = true; + } + SDK_ISR_EXIT_BARRIER; +} + +/* + * Configure the ADC as normal converter in polling mode. + */ +void ADC_Configuration(void) +{ + adc_config_t adcConfigStruct; + adc_conv_seq_config_t adcConvSeqConfigStruct; + +/* Configure the converter. */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE) & FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE + adcConfigStruct.clockMode = kADC_ClockSynchronousMode; /* Using sync clock source. */ +#endif /* FSL_FEATURE_ADC_HAS_CTRL_ASYNMODE */ + adcConfigStruct.clockDividerNumber = DEMO_ADC_CLOCK_DIVIDER; +#if defined(FSL_FEATURE_ADC_HAS_CTRL_RESOL) & FSL_FEATURE_ADC_HAS_CTRL_RESOL + adcConfigStruct.resolution = kADC_Resolution12bit; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_RESOL */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL) & FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL + adcConfigStruct.enableBypassCalibration = false; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_BYPASSCAL */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_TSAMP) & FSL_FEATURE_ADC_HAS_CTRL_TSAMP + adcConfigStruct.sampleTimeNumber = 0U; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_TSAMP */ +#if defined(FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE) & FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE + adcConfigStruct.enableLowPowerMode = false; +#endif /* FSL_FEATURE_ADC_HAS_CTRL_LPWRMODE */ +#if defined(FSL_FEATURE_ADC_HAS_TRIM_REG) & FSL_FEATURE_ADC_HAS_TRIM_REG + adcConfigStruct.voltageRange = kADC_HighVoltageRange; +#endif /* FSL_FEATURE_ADC_HAS_TRIM_REG */ + ADC_Init(DEMO_ADC_BASE, &adcConfigStruct); + +#if !(defined(FSL_FEATURE_ADC_HAS_NO_INSEL) && FSL_FEATURE_ADC_HAS_NO_INSEL) + /* Use the temperature sensor input to channel 0. */ + ADC_EnableTemperatureSensor(DEMO_ADC_BASE, true); +#endif /* FSL_FEATURE_ADC_HAS_NO_INSEL. */ + + /* Enable channel DEMO_ADC_SAMPLE_CHANNEL_NUMBER's conversion in Sequence A. */ + adcConvSeqConfigStruct.channelMask = + (1U << DEMO_ADC_SAMPLE_CHANNEL_NUMBER); /* Includes channel DEMO_ADC_SAMPLE_CHANNEL_NUMBER. */ + adcConvSeqConfigStruct.triggerMask = 0U; + adcConvSeqConfigStruct.triggerPolarity = kADC_TriggerPolarityPositiveEdge; + adcConvSeqConfigStruct.enableSingleStep = false; + adcConvSeqConfigStruct.enableSyncBypass = false; + adcConvSeqConfigStruct.interruptMode = kADC_InterruptForEachSequence; + ADC_SetConvSeqAConfig(DEMO_ADC_BASE, &adcConvSeqConfigStruct); + ADC_EnableConvSeqA(DEMO_ADC_BASE, true); /* Enable the conversion sequence A. */ + /* Clear the result register. */ + ADC_DoSoftwareTriggerConvSeqA(DEMO_ADC_BASE); + while (!ADC_GetChannelConversionResult(DEMO_ADC_BASE, DEMO_ADC_SAMPLE_CHANNEL_NUMBER, &gAdcResultInfoStruct)) + { + } + ADC_GetConvSeqAGlobalConversionResult(DEMO_ADC_BASE, &gAdcResultInfoStruct); +} diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/lpc_adc_interrupt_v3_9.xml b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/lpc_adc_interrupt_v3_9.xml new file mode 100644 index 0000000..a698634 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/lpc_adc_interrupt_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/pin_mux.c b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/pin_mux.c new file mode 100644 index 0000000..c1bc0d5 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/pin_mux.c @@ -0,0 +1,132 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '45', peripheral: ADC0, signal: 'CH, 0', pin_signal: PIO0_7/ADC_0, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_7_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN7 (coords: 45) is configured as ADC0, CH, 0. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_7, IOCON_INDEX_PIO0_7_config); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* ADC_CHN0 connect to P0_7 */ + SWM_SetFixedPinSelect(SWM0, kSWM_ADC_CHN0, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/pin_mux.h b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/pin_mux.h new file mode 100644 index 0000000..59678d1 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/pin_mux.h @@ -0,0 +1,60 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/readme.txt b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/readme.txt new file mode 100644 index 0000000..a5d3aa1 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/adc/lpc_adc_interrupt/readme.txt @@ -0,0 +1,67 @@ +## Overview +----------- +The lpc_adc_interrupt example shows how to use interrupt with LPC ADC driver. + +In this example, an outside input is used to created the input analog signal. +When user type in any key from the keyboard, the software trigger API is called to start the conversion. +Then it polls the flag variable which would be asserted when the conversion completed ISR is executed. +Then just print the conversion result to terminal. + +## Functional Description +------------------------- +1.This example demonstrates how to configure the A sequences with interrupt, assigning one channel with software + trigger, you can configure channel via "DEMO_ADC_SAMPLE_CHANNEL_NUMBER". + +2.Before configuration of the ADC begins, the ADC is put through a self-calibration cycle. + +3.Enable the Conversion-Complete or Sequence-Complete interrupt for sequences A. + +4.After ADC channels are assigned to each of the sequences, if the user enters any key via terminal, software trigger will start. + +5.When the conversion completes, the interrupt would be triggered. The ISR will print conversion result to terminal. + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +- ADC CH0 input signal J1-6(PIO0-7). + +## Run the Project +------------------------ +Run this example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board) for receiving debug information. + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + + + + +4. Monitor the information on the debug console. + +## Expected Result +------------------------ +Press any key and print user channel's result in serial terminal. + diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/crc/armgcc/CMakeLists.txt new file mode 100644 index 0000000..63aad28 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(crc) + +set(MCUX_SDK_PROJECT_NAME crc.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../crc.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_crc_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/crc/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/crc/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/crc/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/crc/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/crc/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/crc/board.c b/boards/lpcxpresso845max/driver_examples/crc/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/crc/board.h b/boards/lpcxpresso845max/driver_examples/crc/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/crc/clock_config.c b/boards/lpcxpresso845max/driver_examples/crc/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/crc/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/pin_mux.c b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/pin_mux.c new file mode 100644 index 0000000..5dab77e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/pin_mux.c @@ -0,0 +1,132 @@ +/* + * Copyright 2018-2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '10', peripheral: CTIMER0, signal: 'MATCH, 1', pin_signal: PIO0_28/WKTCLKIN, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, + smode: bypass, clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_28_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN28 (coords: 10) is configured as CTIMER0, MATCH, 1. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_28, IOCON_INDEX_PIO0_28_config); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* TimerMatchChannel1 connect to P0_28 */ + SWM_SetMovablePinSelect(SWM0, kSWM_T0_MAT_CHN1, kSWM_PortPin_P0_28); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/pin_mux.h b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/pin_mux.h new file mode 100644 index 0000000..7e6e427 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/pin_mux.h @@ -0,0 +1,60 @@ +/* + * Copyright 2018-2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/readme.txt b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/readme.txt new file mode 100644 index 0000000..4b70114 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/readme.txt @@ -0,0 +1,58 @@ +## Overview +----------- +The CTimer Example project is to demonstrate usage of the KSDK ctimer driver. +In this example, the match feature of the CTimer is used to toggle the output level. + +## Functional Description +------------------------- +In this example, The CTimer module generates a PWM signal. + +When start running this example, main routine will initialize clock, pin mux configuration, and configure the CTimer module to set up the match value. When a match occurs, CTimer will toggle the output level. + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +No special settings are required. + +## Run the Project +------------------------ +Run the example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board). + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Launch the debugger in your IDE to begin running the project. + +5. Monitor the information on the debug console. + +## Expected Result +------------------------ +The log below shows example output of the CTimer driver simple match demo in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CTimer match example to toggle the output on a match +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Connect Pin P0_28(J2-2) to an oscilloscope, Users can observe a PWM signal. diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/simple_match.c b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/simple_match.c new file mode 100644 index 0000000..91bb577 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match/simple_match.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/******************************************************************************* + * Includes + ******************************************************************************/ + +#include "fsl_debug_console.h" +#include "pin_mux.h" +#include "board.h" +#include "fsl_ctimer.h" + +#include +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define CTIMER CTIMER0 /* Timer 0 */ +#define CTIMER_MAT_OUT kCTIMER_Match_1 /* Match output 1 */ +#define CTIMER_CLK_FREQ CLOCK_GetFreq(kCLOCK_CoreSysClk) + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * @brief Main function + */ +int main(void) +{ + ctimer_config_t config; + ctimer_match_config_t matchConfig; + + /* Init hardware*/ + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + +#if defined(BOARD_HAS_NO_CTIMER_OUTPUT_PIN_CONNECTED_TO_LED) + LED_RED1_INIT(LOGIC_LED_OFF); +#endif + + PRINTF("CTimer match example to toggle the output on a match\r\n"); + + CTIMER_GetDefaultConfig(&config); + + CTIMER_Init(CTIMER, &config); + + matchConfig.enableCounterReset = true; + matchConfig.enableCounterStop = false; + matchConfig.matchValue = CTIMER_CLK_FREQ / 2; + matchConfig.outControl = kCTIMER_Output_Toggle; + matchConfig.outPinInitState = true; + matchConfig.enableInterrupt = false; + CTIMER_SetupMatch(CTIMER, CTIMER_MAT_OUT, &matchConfig); + CTIMER_StartTimer(CTIMER); + + while (1) + { +#if defined(BOARD_HAS_NO_CTIMER_OUTPUT_PIN_CONNECTED_TO_LED) + /* No timer match output pin connected to a LED + * toggle LED manually according to match status + */ + if (CTIMER_GetOutputMatchStatus(CTIMER, CTIMER_EMT_OUT)) + { + LED_RED1_ON(); + } + else + { + LED_RED1_OFF(); + } +#endif + } +} diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/CMakeLists.txt new file mode 100644 index 0000000..2a22131 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(ctimer_match_interrupt_example) + +set(MCUX_SDK_PROJECT_NAME ctimer_match_interrupt_example.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../simple_match_interrupt.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(driver_ctimer_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(utility_assert_lite_LPC845) + +include(utility_debug_console_lite_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/board.c b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/board.h b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/clock_config.c b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_match_interrupt/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/pin_mux.c b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/pin_mux.c new file mode 100644 index 0000000..5dab77e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/pin_mux.c @@ -0,0 +1,132 @@ +/* + * Copyright 2018-2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '10', peripheral: CTIMER0, signal: 'MATCH, 1', pin_signal: PIO0_28/WKTCLKIN, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, + smode: bypass, clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_28_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN28 (coords: 10) is configured as CTIMER0, MATCH, 1. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_28, IOCON_INDEX_PIO0_28_config); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* TimerMatchChannel1 connect to P0_28 */ + SWM_SetMovablePinSelect(SWM0, kSWM_T0_MAT_CHN1, kSWM_PortPin_P0_28); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/pin_mux.h b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/pin_mux.h new file mode 100644 index 0000000..7e6e427 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/pin_mux.h @@ -0,0 +1,60 @@ +/* + * Copyright 2018-2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/readme.txt b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/readme.txt new file mode 100644 index 0000000..c89e3ae --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/readme.txt @@ -0,0 +1,57 @@ +## Overview +----------- +The CTimer Example project is to demonstrate usage of the KSDK ctimer driver. In this example, CTimer is used to generate a PWM signal. The PWM output can be observed with an oscilloscope. + +## Functional Description +------------------------- +In this example, The CTimer module generates a PWM signal. + +When start running this example, main routine will initialize clock, pin mux configuration, and configure the CTIMER module to generate a 20Khz PWM signal with 20% dutycycle. + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +No special settings are required. + +## Run the Project +------------------------ +Run the example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board). + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Launch the debugger in your IDE to begin running the project. + +5. Monitor the information on the debug console. + +## Expected Result +------------------------ +The log below shows example output of the CTimer simple PWM demo in the terminal window: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CTimer example to generate a PWM signal +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Connect Pin P0_28(J2-2) to an oscilloscope, Users can observe a 20Khz PWM signal with 20% dutycycle. diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/simple_pwm.c b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/simple_pwm.c new file mode 100644 index 0000000..b7159ce --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm/simple_pwm.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/******************************************************************************* + * Includes + ******************************************************************************/ + +#include "fsl_debug_console.h" +#include "pin_mux.h" +#include "board.h" +#include "fsl_ctimer.h" + +#include +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define CTIMER CTIMER0 /* Timer 0 */ +#define CTIMER_MAT_OUT kCTIMER_Match_1 /* Match output 1 */ +#define CTIMER_CLK_FREQ CLOCK_GetFreq(kCLOCK_CoreSysClk) +#ifndef CTIMER_MAT_PWM_PERIOD_CHANNEL +#define CTIMER_MAT_PWM_PERIOD_CHANNEL kCTIMER_Match_3 +#endif + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +volatile uint32_t g_pwmPeriod = 0U; +volatile uint32_t g_pulsePeriod = 0U; + +/******************************************************************************* + * Code + ******************************************************************************/ +status_t CTIMER_GetPwmPeriodValue(uint32_t pwmFreqHz, uint8_t dutyCyclePercent, uint32_t timerClock_Hz) +{ + /* Calculate PWM period match value */ + g_pwmPeriod = (timerClock_Hz / pwmFreqHz) - 1U; + + /* Calculate pulse width match value */ + g_pulsePeriod = (g_pwmPeriod + 1U) * (100 - dutyCyclePercent) / 100; + + return kStatus_Success; +} + +/*! + * @brief Main function + */ +int main(void) +{ + ctimer_config_t config; + uint32_t srcClock_Hz; + uint32_t timerClock; + + /* Init hardware*/ + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* CTimer0 counter uses the AHB clock, some CTimer1 modules use the Aysnc clock */ + srcClock_Hz = CTIMER_CLK_FREQ; + + PRINTF("CTimer example to generate a PWM signal\r\n"); + + CTIMER_GetDefaultConfig(&config); + timerClock = srcClock_Hz / (config.prescale + 1); + + CTIMER_Init(CTIMER, &config); + + /* Get the PWM period match value and pulse width match value of 20Khz PWM signal with 20% dutycycle */ + CTIMER_GetPwmPeriodValue(20000, 20, timerClock); + CTIMER_SetupPwmPeriod(CTIMER, CTIMER_MAT_PWM_PERIOD_CHANNEL, CTIMER_MAT_OUT, g_pwmPeriod, g_pulsePeriod, false); + CTIMER_StartTimer(CTIMER); + + while (1) + { + } +} diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/CMakeLists.txt new file mode 100644 index 0000000..22f23b8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(ctimer_pwm_interrupt_example) + +set(MCUX_SDK_PROJECT_NAME ctimer_pwm_interrupt_example.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../simple_pwm_interrupt.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(driver_ctimer_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(utility_assert_lite_LPC845) + +include(utility_debug_console_lite_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/board.c b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/board.h b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/clock_config.c b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/ctimer/simple_pwm_interrupt/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_DAC_BASE DAC0 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Main function + */ +int main(void) +{ + uint8_t index; + uint32_t dacValue; + dac_config_t dacConfigStruct; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Power on the DAC0.*/ + POWER_DisablePD(kPDRUNCFG_PD_DAC0); + + PRINTF("\r\nDAC basic Example.\r\n"); + + /* Configure the DAC. */ + DAC_GetDefaultConfig(&dacConfigStruct); + DAC_Init(DEMO_DAC_BASE, &dacConfigStruct); + + while (1) + { + index = 0; + dacValue = 0; + PRINTF("\r\nPlease input a value (0 - 1023) to output with DAC: "); + while (index != 0x0D) + { + index = GETCHAR(); + if ((index >= '0') && (index <= '9')) + { + PUTCHAR(index); + dacValue = dacValue * 10 + (index - 0x30U); + } + } + PRINTF("\r\nInput value is %d\r\n", dacValue); + if (dacValue > 1023U) + { + PRINTF("Your value is output of range.\r\n"); + continue; + } + DAC_SetBufferValue(DEMO_DAC_BASE, dacValue); + PRINTF("DAC out: %d\r\n", dacValue); + } +} diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/lpc_dac_basic_v3_9.xml b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/lpc_dac_basic_v3_9.xml new file mode 100644 index 0000000..c85ee21 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/lpc_dac_basic_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/pin_mux.c b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/pin_mux.c new file mode 100644 index 0000000..439ccc0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/pin_mux.c @@ -0,0 +1,134 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '63', peripheral: DAC0, signal: DACOUT0, pin_signal: PIO0_17/ADC_9/DACOUT_0, mode: inactive, invert: disabled, hysteresis: enabled, opendrain: disabled, + smode: bypass, clkdiv: div0, dacmode: enabled} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_17_config = (/* No addition pin function */ + IOCON_PIO_MODE_INACT | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0 | + /* Enables DAC mode */ + IOCON_PIO_DACMODE_EN); + /* PIO0 PIN17 (coords: 63) is configured as DAC0, DACOUT0. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_17, IOCON_INDEX_PIO0_17_config); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* DACOUT0 connect to P0_17 */ + SWM_SetFixedPinSelect(SWM0, kSWM_DAC_OUT0, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/pin_mux.h b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/pin_mux.h new file mode 100644 index 0000000..b4740a6 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/pin_mux.h @@ -0,0 +1,62 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_DACMODE_EN 0x010000u /*!<@brief Enables DAC mode */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/readme.txt b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/readme.txt new file mode 100644 index 0000000..3aa8b0b --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_basic/readme.txt @@ -0,0 +1,61 @@ +## Overview +----------- +The dac_basic example shows how to use DAC module simply as the general DAC converter. + +When the DAC's double-buffer feature is not enabled, the CR register is used as the DAC output data register directly. +The converter would always output the value of the CR register. In this example, it gets the value from terminal, +outputs the DAC output voltage through DAC output pin. + +## Functional Description +------------------------- +In this example, The DAC will output the voltage received from serial terminal. + +When start running this example, main routine will initialize clock, pin mux configuration, +and configure the DAC module to make it work in basic mode. Users are prompted to +input DAC value in serial terminal, board will outputs the DAC output voltage through DAC +output pin. + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +J6-5 is DAC0 output pin. + +## Run the Project +------------------------ +Run the example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board). + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Launch the debugger in your IDE to begin running the project. + +5. Input several characters according to prompt information displayed in terminal. + +## Expected Result +------------------------ +Users input the value via serial terminal, then board outputs the DAC output voltage +through DAC output pin(J6-5). diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/CMakeLists.txt new file mode 100644 index 0000000..a91e4ae --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/CMakeLists.txt @@ -0,0 +1,114 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(lpc_dac_dma) + +set(MCUX_SDK_PROJECT_NAME lpc_dac_dma.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../dac_dma.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_dac_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/board.c b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/board.h b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/clock_config.c b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_dma/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_DAC_BASE DAC0 +#define DEMO_DAC_IRQ DAC0_IRQn +#define DEMO_DAC_COUNTER_VALUE 1000U +#define DEMO_DAC_IRQ_HANDLER_FUNC DAC0_IRQHandler + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +const uint32_t g_waveform[] = {0U, 100U, 200U, 300U, 400U, 500U, 600U, 700U, 800U, 900U, + 1000U, 900U, 800U, 700U, 600U, 500U, 400U, 300U, 200U, 100U}; +/******************************************************************************* + * Code + ******************************************************************************/ +void DEMO_DAC_IRQ_HANDLER_FUNC(void) +{ + static uint32_t windex = 0; + DAC_SetBufferValue(DEMO_DAC_BASE, g_waveform[windex++]); + if (windex == sizeof(g_waveform) / sizeof(g_waveform[0])) + { + windex = 0; + } + __DSB(); +} + +/*! + * @brief Main function + */ +int main(void) +{ + dac_config_t dacConfigStruct; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Power on the DAC0.*/ + POWER_DisablePD(kPDRUNCFG_PD_DAC0); + + PRINTF("\r\nDAC interrupt Example.\r\n"); + + /* Configure the DAC. */ + DAC_GetDefaultConfig(&dacConfigStruct); + DAC_Init(DEMO_DAC_BASE, &dacConfigStruct); + /* Configure the frequency of DAC interrupts. */ + DAC_SetCounterValue(DEMO_DAC_BASE, DEMO_DAC_COUNTER_VALUE); + DAC_EnableDoubleBuffering(DEMO_DAC_BASE, true); + /* Enable the DAC interrupt. */ + NVIC_EnableIRQ(DEMO_DAC_IRQ); + + PRINTF("Please probe the signal using an oscilloscope.\r\n"); + + while (1) + { + } +} diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/lpc_dac_interrupt_v3_9.xml b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/lpc_dac_interrupt_v3_9.xml new file mode 100644 index 0000000..3af8b48 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/lpc_dac_interrupt_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/pin_mux.c b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/pin_mux.c new file mode 100644 index 0000000..439ccc0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/pin_mux.c @@ -0,0 +1,134 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '63', peripheral: DAC0, signal: DACOUT0, pin_signal: PIO0_17/ADC_9/DACOUT_0, mode: inactive, invert: disabled, hysteresis: enabled, opendrain: disabled, + smode: bypass, clkdiv: div0, dacmode: enabled} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_17_config = (/* No addition pin function */ + IOCON_PIO_MODE_INACT | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0 | + /* Enables DAC mode */ + IOCON_PIO_DACMODE_EN); + /* PIO0 PIN17 (coords: 63) is configured as DAC0, DACOUT0. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_17, IOCON_INDEX_PIO0_17_config); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* DACOUT0 connect to P0_17 */ + SWM_SetFixedPinSelect(SWM0, kSWM_DAC_OUT0, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/pin_mux.h b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/pin_mux.h new file mode 100644 index 0000000..b4740a6 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/pin_mux.h @@ -0,0 +1,62 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_DACMODE_EN 0x010000u /*!<@brief Enables DAC mode */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/readme.txt b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/readme.txt new file mode 100644 index 0000000..9a661ed --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dac/lpc_dac_interrupt/readme.txt @@ -0,0 +1,62 @@ +## Overview +----------- +The dac_interrupt example shows how to use DAC with interrupts and produce an arbitrary, user-defined waveform of +selectable frequency.The output can be observed with an oscilloscope. + +When the DAC's double-buffer feature is enabled, any write to the CR register will only load the pre-buffer, which +shares its register address with the CR register. The CR itself will be loaded from the pre-buffer whenever the +counter reaches zero and the interrupt would occur. At the same time the counter is reloaded with the COUNTVAL +register value. In the DAC ISR, user-defined waveform array would be transfered to pre-buffer in order. + +## Functional Description +------------------------- +In this example, The DAC will output the voltage received from serial terminal. + +When start running this example, main routine will initialize clock, pin mux configuration, +and configure the DAC module to make it work in interrupt mode. user-defined waveform array would +be transfered to pre-buffer in order in ISR. Finally, we can probe the signal from DAC_OUT pin +by using an oscilloscope. + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +J6-5 is DAC0 output pin. + +## Run the Project +------------------------ +Run the example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board). + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Launch the debugger in your IDE to begin running the project. + +5. Input several characters according to prompt information displayed in terminal. + +## Expected Result +------------------------ +Probe the signal from DAC_OUT(J6-5) pin by using an oscilloscope and see triangular wave. diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/CMakeLists.txt new file mode 100644 index 0000000..50a461d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(dma_channel_chain) + +set(MCUX_SDK_PROJECT_NAME dma_channel_chain.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../dma_channel_chain.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/board.c b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/board.h b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/dma/channel_chain/clock_config.c b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/channel_chain/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define BUFF_LENGTH 4U +#define DMA_DESCRIPTOR_NUM 2U +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +static dma_handle_t s_DMA_Handle; +static volatile bool s_Transfer_Done = false; + +DMA_ALLOCATE_LINK_DESCRIPTORS(s_dma_table, DMA_DESCRIPTOR_NUM); +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_srcBuffer1[BUFF_LENGTH], sizeof(uint32_t)) = {1, 2, 3, 4}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_srcBuffer2[BUFF_LENGTH], sizeof(uint32_t)) = {11, 22, 33, 44}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_destBuffer[BUFF_LENGTH * 2], sizeof(uint32_t)) = {0x00}; +/******************************************************************************* + * Code + ******************************************************************************/ + +/* User callback function for DMA transfer. */ +void DMA_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + if (transferDone) + { + s_Transfer_Done = true; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + uint32_t i = 0; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Print source buffer */ + PRINTF("DMA interleave transfer example begin.\r\n\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < BUFF_LENGTH * 2; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + + DMA_Init(DMA0); + DMA_CreateHandle(&s_DMA_Handle, DMA0, 0); + DMA_EnableChannel(DMA0, 0); + DMA_SetCallback(&s_DMA_Handle, DMA_Callback, NULL); + + DMA_SetupDescriptor(&(s_dma_table[0]), + DMA_CHANNEL_XFER(true, false, false, true, 4U, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave2xWidth, 16U), + s_srcBuffer2, &s_destBuffer[1], &(s_dma_table[1])); + + DMA_SetupDescriptor(&(s_dma_table[1]), + DMA_CHANNEL_XFER(true, false, false, true, 4U, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave2xWidth, 16U), + s_srcBuffer1, &s_destBuffer[0], NULL); + + DMA_SubmitChannelDescriptor(&s_DMA_Handle, &(s_dma_table[0])); + + DMA_StartTransfer(&s_DMA_Handle); + /* Wait for DMA transfer finish */ + while (s_Transfer_Done != true) + { + } + /* Print destination buffer */ + PRINTF("\r\n\r\nDMA interleave transfer example finish.\r\n\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < BUFF_LENGTH * 2; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + while (1) + { + } +} diff --git a/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/dma_interleave_transfer_v3_9.xml b/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/dma_interleave_transfer_v3_9.xml new file mode 100644 index 0000000..f33fa98 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/dma_interleave_transfer_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/pin_mux.c b/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/pin_mux.c new file mode 100644 index 0000000..81e5e45 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/pin_mux.c @@ -0,0 +1,111 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/pin_mux.h b/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/pin_mux.h new file mode 100644 index 0000000..a896cc5 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/readme.txt b/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/readme.txt new file mode 100644 index 0000000..59b3c0d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/interleave_transfer/readme.txt @@ -0,0 +1,68 @@ +## Overview +----------------------------------------------------------------------------------------- +The DMA interleave example is a simple demonstration program that uses the SDK software. +It executes linked(address interleave) transfer from the source buffer to destination buffer using +the SDK DMA drivers. +The destination buffer is 8 words length: +Descriptor A will define a transfer for member 0, 2, 4, 6 +Descriptor B will define a transfer for member 1, 3, 5, 7. +Descriptor A is linked to descriptor B. +The purpose of this example is to show how to use the DMA and to provide a simple example for +debugging and further development. + +## Functional description +----------------------------------------------------------------------------------------- +This example shows the usage of more than one descriptors to define a complicated interleave +transfer. + +## Toolchain supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Mini/micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +No special settings are required. + +## Run the Demo +------------------------ +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the board). + +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Choose an IDE, building the project and download the program to the target board. + More information about how to compile and program the project can refer to the + + [Getting Started with MCUXpresso SDK](../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Launch the debugger in your IDE to begin running the demo. + +## Expected Result +------------------------ +When the example runs successfully, the following message is displayed in the terminal: +~~~~~~~~~~~~~~~~~~~~~ +DMA interleave transfer example begin. + +Destination Buffer: + +0 0 0 0 0 0 0 0 + +DMA interleave transfer example finish. + +Destination Buffer: + +1 11 2 22 3 33 4 44 +~~~~~~~~~~~~~~~~~~~~~ diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/CMakeLists.txt new file mode 100644 index 0000000..294d26c --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(dma_linked_transfer) + +set(MCUX_SDK_PROJECT_NAME dma_linked_transfer.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../dma_linked_transfer.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/board.c b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/board.h b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/clock_config.c b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/linked_transfer/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define DEMO_DMA_CHANNEL 0 +#define BUFF_LENGTH 4U +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_srcBuffer[BUFF_LENGTH], sizeof(uint32_t)) = {1, 2, 3, 4}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static uint32_t s_destBuffer[BUFF_LENGTH], sizeof(uint32_t)) = {0x00}; +static volatile uint32_t s_transferCount = 0; +/******************************************************************************* + * Code + ******************************************************************************/ + +/*! + * @brief Main function + */ +int main(void) +{ + uint32_t i = 0; + uint32_t xferCfg = DMA_CHANNEL_XFER(true, false, false, true, 4U, kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, 16U); + uint32_t desc[sizeof(dma_descriptor_t)] = {0}; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Print source buffer */ + PRINTF("DMA memory to memory polling example begin.\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < BUFF_LENGTH; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + + DMA_Init(DMA0); + DMA_EnableChannel(DMA0, DEMO_DMA_CHANNEL); + DMA_SetupDescriptor((dma_descriptor_t *)desc, xferCfg, s_srcBuffer, &s_destBuffer[0], NULL); + DMA_LoadChannelDescriptor(DMA0, DEMO_DMA_CHANNEL, (dma_descriptor_t *)desc); + DMA_DoChannelSoftwareTrigger(DMA0, DEMO_DMA_CHANNEL); + /* Wait for DMA transfer finish */ + while (DMA_ChannelIsBusy(DMA0, DEMO_DMA_CHANNEL)) + { + } + /* Print destination buffer */ + PRINTF("\r\nDMA memory to memory polling example finish.\r\n"); + PRINTF("Destination Buffer:\r\n"); + for (i = 0; i < BUFF_LENGTH; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + while (1) + { + } +} diff --git a/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/dma_m2m_polling_v3_9.xml b/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/dma_m2m_polling_v3_9.xml new file mode 100644 index 0000000..860d445 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/dma_m2m_polling_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/pin_mux.c b/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/pin_mux.c new file mode 100644 index 0000000..81e5e45 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/pin_mux.c @@ -0,0 +1,111 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/pin_mux.h b/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/pin_mux.h new file mode 100644 index 0000000..a896cc5 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/readme.txt b/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/readme.txt new file mode 100644 index 0000000..472b5a4 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/m2m_polling/readme.txt @@ -0,0 +1,53 @@ +Overview +======== +The DMA memory to memory polling example is a simple demonstration program that uses the SDK software. +It executes one shot polling transfer from source buffer to destination buffer using the SDK DMA drivers. +The purpose of this example is to show how to use the DMA and to provide a simple example for +debugging and further development without DMA interrupt. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Mini/micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the Demo +================ +1. Connect a micro USB cable between the host PC and the LPC-Link USB port (J8) on the target board. +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. +4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +Running the demo +================ +When the example runs successfully, the following message is displayed in the terminal: +~~~~~~~~~~~~~~~~~~~~~ +DMA memory to memory polling example begin. + +Destination Buffer: + +0 0 0 0 + +DMA memory to memory polling example finish. + +Destination Buffer: + +1 2 3 4 +~~~~~~~~~~~~~~~~~~~~~ + diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/CMakeLists.txt new file mode 100644 index 0000000..a80f280 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(dma_memory_to_memory) + +set(MCUX_SDK_PROJECT_NAME dma_memory_to_memory.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../dma_memory_to_memory.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/board.c b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/board.h b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/clock_config.c b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/memory_to_memory/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define SOURCE_BUFFER_LENGTH 8U +#define DEST_BUFFER_LENGTH 8U +#define DEMO_TRANSFER_WIDTH uint32_t +#define DMA_DESCRIPTOR_NUM 2U + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +static dma_handle_t s_DMA_Handle; +static volatile bool s_Transfer_Done = false; +DMA_ALLOCATE_LINK_DESCRIPTORS(s_dma_table, DMA_DESCRIPTOR_NUM); + +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static DEMO_TRANSFER_WIDTH s_srcBuffer[SOURCE_BUFFER_LENGTH], sizeof(uint32_t)) = { + 1, 2, 3, 4, 5, 6, 7, 8}; +DMA_ALLOCATE_DATA_TRANSFER_BUFFER(static DEMO_TRANSFER_WIDTH s_destBuffer[DEST_BUFFER_LENGTH], + sizeof(uint32_t)) = {0x00}; +static dma_channel_trigger_t channelTrigger = { + .type = kDMA_NoTrigger, + .burst = kDMA_EdgeBurstTransfer4, + .wrap = kDMA_DstWrap, +}; +/******************************************************************************* + * Code + ******************************************************************************/ + +/* User callback function for DMA transfer. */ +void DMA_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + if (transferDone) + { + s_Transfer_Done = true; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + volatile uint32_t i = 0; + + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Print source buffer */ + PRINTF("DMA wrap transfer example begin.\r\n\r\n"); + + DMA_Init(DMA0); + DMA_CreateHandle(&s_DMA_Handle, DMA0, 0); + DMA_EnableChannel(DMA0, 0); + DMA_SetCallback(&s_DMA_Handle, DMA_Callback, NULL); + + DMA_SetupChannelDescriptor( + &(s_dma_table[0]), + DMA_CHANNEL_XFER(true, false, false, true, sizeof(DEMO_TRANSFER_WIDTH), kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, sizeof(DEMO_TRANSFER_WIDTH) * SOURCE_BUFFER_LENGTH), + s_srcBuffer, s_destBuffer, NULL, kDMA_DstWrap, kDMA_BurstSize4); + + DMA_SubmitChannelDescriptor(&s_DMA_Handle, &(s_dma_table[0])); + + DMA_SetChannelConfig(DMA0, 0U, &channelTrigger, false); + DMA_DoChannelSoftwareTrigger(DMA0, 0U); + /* Delay between two triggers. */ + for (i = 0; i < 0xFFU; i++) + { + __NOP(); + } + DMA_DoChannelSoftwareTrigger(DMA0, 0U); + + while (s_Transfer_Done != true) + { + } + + /* Print destination buffer */ + PRINTF("Destination address wrap transfer:\r\n"); + for (i = 0; i < DEST_BUFFER_LENGTH; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + s_Transfer_Done = false; + + DMA_SetupChannelDescriptor( + &(s_dma_table[0]), + DMA_CHANNEL_XFER(true, false, false, true, sizeof(DEMO_TRANSFER_WIDTH), kDMA_AddressInterleave1xWidth, + kDMA_AddressInterleave1xWidth, sizeof(DEMO_TRANSFER_WIDTH) * SOURCE_BUFFER_LENGTH), + s_srcBuffer, s_destBuffer, NULL, kDMA_SrcWrap, kDMA_BurstSize4); + + DMA_SubmitChannelDescriptor(&s_DMA_Handle, &(s_dma_table[0])); + + channelTrigger.wrap = kDMA_SrcWrap; + DMA_SetChannelConfig(DMA0, 0U, &channelTrigger, false); + DMA_DoChannelSoftwareTrigger(DMA0, 0U); + /* Delay between two triggers. */ + for (i = 0; i < 0xFFU; i++) + { + __NOP(); + } + DMA_DoChannelSoftwareTrigger(DMA0, 0U); + + /* Wait for DMA transfer finish */ + while (s_Transfer_Done != true) + { + } + /* Print destination buffer */ + PRINTF("\r\nSource address wrap transfer:\r\n"); + for (i = 0; i < DEST_BUFFER_LENGTH; i++) + { + PRINTF("%d\t", s_destBuffer[i]); + } + PRINTF("\r\n\r\nDMA wrap transfer example finish.\r\n\r\n"); + + while (1) + { + } +} diff --git a/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/dma_wrap_transfer_v3_9.xml b/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/dma_wrap_transfer_v3_9.xml new file mode 100644 index 0000000..70b5837 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/dma_wrap_transfer_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/pin_mux.c b/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/pin_mux.c new file mode 100644 index 0000000..81e5e45 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/pin_mux.c @@ -0,0 +1,111 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/pin_mux.h b/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/pin_mux.h new file mode 100644 index 0000000..a896cc5 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/readme.txt b/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/readme.txt new file mode 100644 index 0000000..b61dc35 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/dma/wrap_transfer/readme.txt @@ -0,0 +1,59 @@ +## Overview +----------------------------------------------------------------------------------------- +The DMA wrap transfer example is a simple demonstration program that uses the SDK software. +It executes two burst transfer from source buffer to destination buffer using the SDK DMA drivers. +The purpose of this example is to show how to use the DMA wrap feature and to provide a simple +example for debugging and further development. + +## Functional description +----------------------------------------------------------------------------------------- +This example shows the usage of burst transfer from source buffer to destination buffer. + +## Toolchain supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Mini/micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +No special settings are required. + +## Run the Demo +------------------------ +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the board). + +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Choose an IDE, building the project and download the program to the target board. + More information about how to compile and program the project can refer to the + + [Getting Started with MCUXpresso SDK](../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Launch the debugger in your IDE to begin running the demo. + +## Expected Result +------------------------ +When the example runs successfully, the following message is displayed in the terminal: +~~~~~~~~~~~~~~~~~~~~~ +DMA wrap transfer example begin. + +Destination address wrap transfer: +5 6 7 8 0 0 0 0 +Source address wrap transfer: +1 2 3 4 1 2 3 4 + +DMA wrap transfer example finish. +~~~~~~~~~~~~~~~~~~~~~ diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/CMakeLists.txt new file mode 100644 index 0000000..c7fe7ad --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/CMakeLists.txt @@ -0,0 +1,110 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(gpio_led_output) + +set(MCUX_SDK_PROJECT_NAME gpio_led_output.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../gpio_led_output.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/board.c b/boards/lpcxpresso845max/driver_examples/gpio/led_output/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/board.h b/boards/lpcxpresso845max/driver_examples/gpio/led_output/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/gpio/led_output/clock_config.c b/boards/lpcxpresso845max/driver_examples/gpio/led_output/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/gpio/led_output/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*!MSTDAT = (uint32_t)(transfer->slaveAddress << 1) | (transfer->direction); + EXAMPLE_I2C_MASTER->MSTCTL = I2C_MSTCTL_MSTSTART_MASK | I2C_MSTCTL_MSTDMA_MASK; + + switch (transfer->direction) + { + case kI2C_Write: + DMA_PrepareTransfer(&xferConfig, g_master_txBuff, (void *)&EXAMPLE_I2C_MASTER->MSTDAT, sizeof(uint8_t), + EXAMPLE_I2C_DATA_LENGTH, kDMA_MemoryToPeripheral, NULL); + break; + + case kI2C_Read: + DMA_PrepareTransfer(&xferConfig, (void *)&EXAMPLE_I2C_MASTER->MSTDAT, g_master_rxBuff, sizeof(uint8_t), + EXAMPLE_I2C_DATA_LENGTH - 1, kDMA_PeripheralToMemory, NULL); + break; + + default: + /* This should never happen */ + assert(0); + break; + } + + DMA_SubmitTransfer(dmaHandle, &xferConfig); + DMA_StartTransfer(dmaHandle); +} + +void I2C_MasterReadLastByte(I2C_Type *base, void *rxBuff) +{ + uint8_t *buf = (uint8_t *)(rxBuff); + + assert(rxBuff); + + while (!(I2C_STAT_MSTCODE_RXREADY == (base->STAT & I2C_STAT_MSTSTATE_MASK) >> I2C_STAT_MSTSTATE_SHIFT)) + { + } + + /* ready to receive next byte */ + *(buf) = base->MSTDAT; +} + +/*! + * @brief Main function + */ +int main(void) +{ + i2c_master_config_t masterConfig; + i2c_master_transfer_t masterXfer; + + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + /* Select the main clock as source clock of I2C0. */ + CLOCK_Select(kI2C0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + DMA_Init(EXAMPLE_DMA); + DMA_EnableChannel(EXAMPLE_DMA, EXAMPLE_I2C_MASTER_CHANNEL); + DMA_CreateHandle(&g_dmaHandle, EXAMPLE_DMA, EXAMPLE_I2C_MASTER_CHANNEL); + DMA_SetCallback(&g_dmaHandle, I2C_DmaCallback, NULL); + + PRINTF("\r\nI2C board2board DMA example -- Master transfer.\r\n"); + + /* Set up i2c master to send data to slave*/ + /* First data in txBuff is data length of the transmiting data. */ + for (uint32_t i = 0U; i < EXAMPLE_I2C_DATA_LENGTH; i++) + { + g_master_txBuff[i] = i; + } + + PRINTF("Master will send data :"); + for (uint32_t i = 0U; i < EXAMPLE_I2C_DATA_LENGTH; i++) + { + if (i % 8 == 0) + { + PRINTF("\r\n"); + } + PRINTF("0x%2x ", g_master_txBuff[i]); + } + PRINTF("\r\n\r\n"); + + /* + * masterConfig.baudRate_Bps = 100000U; + * masterConfig.enableStopHold = false; + * masterConfig.glitchFilterWidth = 0U; + * masterConfig.enableMaster = true; + */ + I2C_MasterGetDefaultConfig(&masterConfig); + + /* Change the default baudrate configuration */ + masterConfig.baudRate_Bps = EXAMPLE_I2C_BAUDRATE; + + /* Initialize the I2C master peripheral */ + I2C_MasterInit(EXAMPLE_I2C_MASTER, &masterConfig, EXAMPLE_I2C_MASTER_CLOCK_FREQUENCY); + + memset(&masterXfer, 0, sizeof(masterXfer)); + + /* data = g_master_txBuff - write to slave. + start + slaveaddress(w) + length of data buffer + data buffer + stop*/ + masterXfer.slaveAddress = EXAMPLE_I2C_MASTER_SLAVE_ADDR_7BIT; + masterXfer.direction = kI2C_Write; + masterXfer.data = g_master_txBuff; + masterXfer.dataSize = EXAMPLE_I2C_DATA_LENGTH; + masterXfer.flags = kI2C_TransferDefaultFlag; + + EXAMPLE_MasterStartDMATransfer(&g_dmaHandle, &masterXfer); + + /* wait for transfer completed. */ + while (!g_MasterCompletionFlag) + { + } + + EXAMPLE_I2C_MASTER->MSTCTL = 0; + I2C_MasterStop(EXAMPLE_I2C_MASTER); + + g_MasterCompletionFlag = false; + + PRINTF("Receive sent data from slave :"); + + /* data = g_master_rxBuff - read from slave. + start + slaveaddress(w) + repeated start + slaveaddress(r) + rx data buffer + stop */ + masterXfer.slaveAddress = EXAMPLE_I2C_MASTER_SLAVE_ADDR_7BIT; + masterXfer.direction = kI2C_Read; + masterXfer.data = g_master_rxBuff; + masterXfer.dataSize = EXAMPLE_I2C_DATA_LENGTH; + masterXfer.flags = kI2C_TransferDefaultFlag; + + EXAMPLE_MasterStartDMATransfer(&g_dmaHandle, &masterXfer); + + /* Reset master completion flag to false. */ + g_MasterCompletionFlag = false; + + /* Wait for transfer completed. */ + while (!g_MasterCompletionFlag) + { + } + /* The I2C hardware will automatic read a byte after send a STOP, the I2C may need to send a STOP when last byte was + * sent, so create a polling mode to send the last byte. */ + EXAMPLE_I2C_MASTER->MSTCTL = 0; + + I2C_MasterReadLastByte(EXAMPLE_I2C_MASTER, &g_master_rxBuff[EXAMPLE_I2C_DATA_LENGTH - 1]); + + I2C_MasterStop(EXAMPLE_I2C_MASTER); + + g_MasterCompletionFlag = false; + + for (uint32_t i = 0U; i < EXAMPLE_I2C_DATA_LENGTH; i++) + { + if (i % 8 == 0) + { + PRINTF("\r\n"); + } + PRINTF("0x%2x ", g_master_rxBuff[i]); + } + PRINTF("\r\n\r\n"); + + /* Transfer completed. Check the data.*/ + for (uint32_t i = 0U; i < EXAMPLE_I2C_DATA_LENGTH; i++) + { + if (g_master_rxBuff[i] != g_master_txBuff[i]) + { + PRINTF("\r\nError occurred in the transfer ! \r\n"); + break; + } + } + + PRINTF("\r\nEnd of I2C example .\r\n"); + while (1) + { + } +} diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/lpc_i2c_dma_b2b_master_v3_9.xml b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/lpc_i2c_dma_b2b_master_v3_9.xml new file mode 100644 index 0000000..46a2ade --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/lpc_i2c_dma_b2b_master_v3_9.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/pin_mux.c b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/pin_mux.c new file mode 100644 index 0000000..441427a --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/pin_mux.c @@ -0,0 +1,142 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '17', peripheral: I2C0, signal: SCL, pin_signal: PIO0_10/I2C0_SCL, invert: disabled, smode: bypass, clkdiv: div0, i2cmode: fastMode} + - {pin_num: '16', peripheral: I2C0, signal: SDA, pin_signal: PIO0_11/I2C0_SDA, invert: disabled, smode: bypass, clkdiv: div0, i2cmode: fastMode} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_10_config = (/* Input not invert */ + IOCON_PIO_INV_DI | + /* Standard/Fast mode */ + IOCON_PIO_I2CMODE_FAST | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN10 (coords: 17) is configured as I2C0, SCL. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_10, IOCON_INDEX_PIO0_10_config); + + const uint32_t IOCON_INDEX_PIO0_11_config = (/* Input not invert */ + IOCON_PIO_INV_DI | + /* Standard/Fast mode */ + IOCON_PIO_I2CMODE_FAST | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN11 (coords: 16) is configured as I2C0, SDA. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_11, IOCON_INDEX_PIO0_11_config); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* I2C0_SDA connect to P0_11 */ + SWM_SetFixedPinSelect(SWM0, kSWM_I2C0_SDA, true); + + /* I2C0_SCL connect to P0_10 */ + SWM_SetFixedPinSelect(SWM0, kSWM_I2C0_SCL, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/pin_mux.h b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/pin_mux.h new file mode 100644 index 0000000..3895332 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/pin_mux.h @@ -0,0 +1,61 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_I2CMODE_FAST 0x00u /*!<@brief Standard/Fast mode */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/readme.txt b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/readme.txt new file mode 100644 index 0000000..6f85116 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/master/readme.txt @@ -0,0 +1,94 @@ +## Overview +----------- +This example demonstrates configuration and use of the I2C master module in dma-driven +mode on communication with a I2C slave module calling the I2C functional APIs. This example +should work together with the `lpc_i2c_dma_b2b_slave` example. + +**Transactional API and Functional API** + +- Low level functional APIs provide common peripheral functionality, abstracting the + hardware peripheral register access into a set of state less basic functional operations. + These APIs primarily focus on the control, configuration, and function of basic + peripheral operations. + +- Transactional APIs provide a quick method for customers to utilize higher-level + functionality of the peripherals. The transactional APIs utilize interrupts and perform + asynchronous operations without user intervention. Transactional APIs operate on high- + level logic that requires data storage for internal operation context handling. However, + the peripheral drivers do not allocate this memory space. Rather, the user passes in the + memory to the driver for internal driver operation. + +- All driver examples calling the transactional API get the `transfer` in the project + naming. If the code size and performance are critical requirements, see the transactional + API implementation and write custom code. + +## Functional Description +------------------------- +In this example, I2C master will communicate with a slave module on another board, master +will use dma mode and slave will use polling mode. + +1. Once the project starts, main routine will initialize clock, pin mux configuration, and + configure the I2C module to make it work in master DMA mode. + +2. To make I2C master module run in dma mode, one dma channel should be configured for + sending and receiving. + +3. Before starting the I2C master transmission, use DMA driver API to start transfer user + data, the I2C hardware will automatic read a byte after send a STOP, the I2C module may + need to send a STOP when last byte was sent, so create a polling mode to send the last byte. + +4. Checking if the data from slave is all right when transfer complete, and print the + information to the debug console on PC. + + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +Connect pins of I2C master and slave(on another board) as below: + + Master - I2C0 Slave - I2C0 +Pin Name Board Location Pin Name Board Location +SCL J1-1 SCL J1-1 +SDA J1-2 SDA J1-2 +GND J1-4 GND J1-4 + +## Run the Project +------------------------ +Run this example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board) for receiving debug information. + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Start the slave board first, then launch the debugger in your IDE to begin running this project. + +5. Monitor the information on the debug console. + +## Expected Result +------------------------ +The I2C master module will communicate with slave module in dma mode, slave module +should be started first. Once the communication between master board and slave board is +completed, the received data and information will be printed to the debug console on PC. diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/CMakeLists.txt new file mode 100644 index 0000000..bc1d5a2 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/CMakeLists.txt @@ -0,0 +1,114 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(lpc_i2c_dma_b2b_slave) + +set(MCUX_SDK_PROJECT_NAME lpc_i2c_dma_b2b_slave.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../i2c_dma_b2b_slave.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_i2c_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/board.c b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/board.h b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/clock_config.c b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/dma_b2b/slave/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +#include +#include "pin_mux.h" +#include "board.h" +#include "fsl_debug_console.h" +#include "fsl_i2c.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_I2C_MASTER_BASE (I2C0_BASE) +#define I2C_MASTER_CLOCK_FREQUENCY CLOCK_GetMainClkFreq() +#define EXAMPLE_I2C_MASTER ((I2C_Type *)EXAMPLE_I2C_MASTER_BASE) + +#define I2C_MASTER_SLAVE_ADDR_7BIT (0x7EU) +#define I2C_BAUDRATE (100000) /* 100K */ +#define I2C_DATA_LENGTH (33) /* MAX is 256 */ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ + +uint8_t g_master_txBuff[I2C_DATA_LENGTH]; +uint8_t g_master_rxBuff[I2C_DATA_LENGTH]; + +i2c_master_handle_t g_m_handle; + +volatile bool g_MasterCompletionFlag = false; + +/******************************************************************************* + * Code + ******************************************************************************/ +static void i2c_master_callback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData) +{ + /* Signal transfer success when received success status. */ + if (status == kStatus_Success) + { + g_MasterCompletionFlag = true; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + i2c_master_transfer_t masterXfer = {0}; + status_t reVal = kStatus_Fail; + + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + /* Select the main clock as source clock of I2C0. */ + CLOCK_Select(kI2C0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + PRINTF("\r\nI2C board2board interrupt example -- Master transfer.\r\n"); + + /* Set up i2c master to send data to slave*/ + /* First data in txBuff is data length of the transmiting data. */ + g_master_txBuff[0] = I2C_DATA_LENGTH - 1U; + for (uint32_t i = 1U; i < I2C_DATA_LENGTH; i++) + { + g_master_txBuff[i] = i - 1; + } + + PRINTF("Master will send data :"); + for (uint32_t i = 0U; i < I2C_DATA_LENGTH - 1U; i++) + { + if (i % 8 == 0) + { + PRINTF("\r\n"); + } + PRINTF("0x%2x ", g_master_txBuff[i + 1]); + } + PRINTF("\r\n\r\n"); + + i2c_master_config_t masterConfig; + + /* + * masterConfig.debugEnable = false; + * masterConfig.ignoreAck = false; + * masterConfig.pinConfig = kI2C_2PinOpenDrain; + * masterConfig.baudRate_Bps = 100000U; + * masterConfig.busIdleTimeout_ns = 0; + * masterConfig.pinLowTimeout_ns = 0; + * masterConfig.sdaGlitchFilterWidth_ns = 0; + * masterConfig.sclGlitchFilterWidth_ns = 0; + */ + I2C_MasterGetDefaultConfig(&masterConfig); + + /* Change the default baudrate configuration */ + masterConfig.baudRate_Bps = I2C_BAUDRATE; + + /* Initialize the I2C master peripheral */ + I2C_MasterInit(EXAMPLE_I2C_MASTER, &masterConfig, I2C_MASTER_CLOCK_FREQUENCY); + + /* Create the I2C handle for the non-blocking transfer */ + I2C_MasterTransferCreateHandle(EXAMPLE_I2C_MASTER, &g_m_handle, i2c_master_callback, NULL); + + /* subAddress = 0x01, data = g_master_txBuff - write to slave. + start + slaveaddress(w) + subAddress + length of data buffer + data buffer + stop*/ + uint8_t deviceAddress = 0x01U; + masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT; + masterXfer.direction = kI2C_Write; + masterXfer.subaddress = (uint32_t)deviceAddress; + masterXfer.subaddressSize = 1; + masterXfer.data = g_master_txBuff; + masterXfer.dataSize = I2C_DATA_LENGTH; + masterXfer.flags = kI2C_TransferDefaultFlag; + + /* Send master non-blocking data to slave */ + reVal = I2C_MasterTransferNonBlocking(EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer); + + /* Reset master completion flag to false. */ + g_MasterCompletionFlag = false; + + if (reVal != kStatus_Success) + { + return -1; + } + + /* Wait for transfer completed. */ + while (!g_MasterCompletionFlag) + { + } + g_MasterCompletionFlag = false; + + PRINTF("Receive sent data from slave :"); + + /* subAddress = 0x01, data = g_master_rxBuff - read from slave. + start + slaveaddress(w) + subAddress + repeated start + slaveaddress(r) + rx data buffer + stop */ + masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT; + masterXfer.direction = kI2C_Read; + masterXfer.subaddress = (uint32_t)deviceAddress; + masterXfer.subaddressSize = 1; + masterXfer.data = g_master_rxBuff; + masterXfer.dataSize = I2C_DATA_LENGTH - 1; + masterXfer.flags = kI2C_TransferDefaultFlag; + + reVal = I2C_MasterTransferNonBlocking(EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer); + + /* Reset master completion flag to false. */ + g_MasterCompletionFlag = false; + + if (reVal != kStatus_Success) + { + return -1; + } + + /* Wait for transfer completed. */ + while (!g_MasterCompletionFlag) + { + } + g_MasterCompletionFlag = false; + + for (uint32_t i = 0U; i < I2C_DATA_LENGTH - 1; i++) + { + if (i % 8 == 0) + { + PRINTF("\r\n"); + } + PRINTF("0x%2x ", g_master_rxBuff[i]); + } + PRINTF("\r\n\r\n"); + + /* Transfer completed. Check the data.*/ + for (uint32_t i = 0U; i < I2C_DATA_LENGTH - 1; i++) + { + if (g_master_rxBuff[i] != g_master_txBuff[i + 1]) + { + PRINTF("\r\nError occurred in the transfer ! \r\n"); + break; + } + } + + PRINTF("\r\nEnd of I2C example .\r\n"); + while (1) + { + } +} diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/lpc_i2c_interrupt_b2b_transfer_master_v3_9.xml b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/lpc_i2c_interrupt_b2b_transfer_master_v3_9.xml new file mode 100644 index 0000000..9659baa --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/lpc_i2c_interrupt_b2b_transfer_master_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/pin_mux.c b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/pin_mux.c new file mode 100644 index 0000000..441427a --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/pin_mux.c @@ -0,0 +1,142 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '17', peripheral: I2C0, signal: SCL, pin_signal: PIO0_10/I2C0_SCL, invert: disabled, smode: bypass, clkdiv: div0, i2cmode: fastMode} + - {pin_num: '16', peripheral: I2C0, signal: SDA, pin_signal: PIO0_11/I2C0_SDA, invert: disabled, smode: bypass, clkdiv: div0, i2cmode: fastMode} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_10_config = (/* Input not invert */ + IOCON_PIO_INV_DI | + /* Standard/Fast mode */ + IOCON_PIO_I2CMODE_FAST | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN10 (coords: 17) is configured as I2C0, SCL. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_10, IOCON_INDEX_PIO0_10_config); + + const uint32_t IOCON_INDEX_PIO0_11_config = (/* Input not invert */ + IOCON_PIO_INV_DI | + /* Standard/Fast mode */ + IOCON_PIO_I2CMODE_FAST | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN11 (coords: 16) is configured as I2C0, SDA. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_11, IOCON_INDEX_PIO0_11_config); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* I2C0_SDA connect to P0_11 */ + SWM_SetFixedPinSelect(SWM0, kSWM_I2C0_SDA, true); + + /* I2C0_SCL connect to P0_10 */ + SWM_SetFixedPinSelect(SWM0, kSWM_I2C0_SCL, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/pin_mux.h b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/pin_mux.h new file mode 100644 index 0000000..3895332 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/pin_mux.h @@ -0,0 +1,61 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_I2CMODE_FAST 0x00u /*!<@brief Standard/Fast mode */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/readme.txt b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/readme.txt new file mode 100644 index 0000000..c8e8f12 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/master/readme.txt @@ -0,0 +1,94 @@ +## Overview +----------- +This example demonstrates configuration and use of the I2C master module in interrupt-driven +mode on communication with a I2C slave module calling the I2C functional APIs. This example +should work together with the `lpc_i2c_interrupt_b2b_transfer_slave` example. + +**Transactional API and Functional API** + +- Low level functional APIs provide common peripheral functionality, abstracting the + hardware peripheral register access into a set of state less basic functional operations. + These APIs primarily focus on the control, configuration, and function of basic + peripheral operations. + +- Transactional APIs provide a quick method for customers to utilize higher-level + functionality of the peripherals. The transactional APIs utilize interrupts and perform + asynchronous operations without user intervention. Transactional APIs operate on high- + level logic that requires data storage for internal operation context handling. However, + the peripheral drivers do not allocate this memory space. Rather, the user passes in the + memory to the driver for internal driver operation. + +- All driver examples calling the transactional API get the `transfer` in the project + naming. If the code size and performance are critical requirements, see the transactional + API implementation and write custom code. + +## Functional Description +------------------------- +In this example, I2C master will communicate with a slave module on another board, master +will use interrupt mode and slave will use interrupt mode too. + +1. Once the project starts, main routine will initialize clock, pin mux configuration, + and configure the I2C module to make it work in master interrupt mode. + +2. I2C master is driven by receive-ready interrupt, once the data is ready, a interrupt + will be triggered, so one byte should be written to transmit register first in main + routine to trigger the receive-ready interrupt. + +3. In IRQ handler routine, master will receive data and send another byte to the slave + module until all data has been written to the transmit register. + +4. Checking if the data from slave is all right when transfer complete, and print the + information to the debug console on PC. + + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +Connect pins of I2C master and slave(on another board) as below: + + Master - I2C0 Slave - I2C0 +Pin Name Board Location Pin Name Board Location +SCL J1-1 SCL J1-1 +SDA J1-2 SDA J1-2 +GND J1-4 GND J1-4 + +## Run the Project +------------------------ +Run this example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board) for receiving debug information. + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Start the slave board first, then launch the debugger in your IDE to begin running this project. + +5. Monitor the information on the debug console. + +## Expected Result +------------------------ +The I2C master module will communicate with slave module in interrupt mode, slave module +should be started first. Once the communication between master board and slave board is +completed, the received data and information will be printed to the debug console on PC. diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/CMakeLists.txt new file mode 100644 index 0000000..6c3d729 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(lpc_i2c_interrupt_b2b_transfer_slave) + +set(MCUX_SDK_PROJECT_NAME lpc_i2c_interrupt_b2b_transfer_slave.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../i2c_interrupt_b2b_transfer_slave.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_i2c_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/board.c b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/board.h b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/clock_config.c b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/interrupt_b2b_transfer/slave/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +#include +#include "pin_mux.h" +#include "board.h" +#include "fsl_debug_console.h" +#include "fsl_i2c.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_I2C_MASTER_BASE (I2C0_BASE) +#define I2C_MASTER_CLOCK_FREQUENCY CLOCK_GetMainClkFreq() +#define WAIT_TIME 10U +#define EXAMPLE_I2C_MASTER ((I2C_Type *)EXAMPLE_I2C_MASTER_BASE) + +#define I2C_MASTER_SLAVE_ADDR_7BIT 0x7EU +#define I2C_BAUDRATE 100000U +#define I2C_DATA_LENGTH 33U +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +uint8_t g_master_txBuff[I2C_DATA_LENGTH]; +uint8_t g_master_rxBuff[I2C_DATA_LENGTH]; + +/******************************************************************************* + * Code + + ******************************************************************************/ + +/*! + * @brief Main function + */ +int main(void) +{ + i2c_master_config_t masterConfig; + status_t reVal = kStatus_Fail; + uint8_t deviceAddress = 0x01U; + + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + /* Select the main clock as source clock of I2C0. */ + CLOCK_Select(kI2C0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + PRINTF("\r\nI2C board2board polling example -- Master transfer.\r\n"); + + /* Set up i2c master to send data to slave*/ + /* First data in txBuff is data length of the transmiting data. */ + g_master_txBuff[0] = I2C_DATA_LENGTH - 1U; + for (uint32_t i = 1U; i < I2C_DATA_LENGTH; i++) + { + g_master_txBuff[i] = i - 1; + } + + PRINTF("Master will send data :"); + for (uint32_t i = 0U; i < I2C_DATA_LENGTH - 1U; i++) + { + if (i % 8 == 0) + { + PRINTF("\r\n"); + } + PRINTF("0x%2x ", g_master_txBuff[i + 1]); + } + PRINTF("\r\n\r\n"); + + /* + * masterConfig.debugEnable = false; + * masterConfig.ignoreAck = false; + * masterConfig.pinConfig = kI2C_2PinOpenDrain; + * masterConfig.baudRate_Bps = 100000U; + * masterConfig.busIdleTimeout_ns = 0; + * masterConfig.pinLowTimeout_ns = 0; + * masterConfig.sdaGlitchFilterWidth_ns = 0; + * masterConfig.sclGlitchFilterWidth_ns = 0; + */ + I2C_MasterGetDefaultConfig(&masterConfig); + + /* Change the default baudrate configuration */ + masterConfig.baudRate_Bps = I2C_BAUDRATE; + + /* Initialize the I2C master peripheral */ + I2C_MasterInit(EXAMPLE_I2C_MASTER, &masterConfig, I2C_MASTER_CLOCK_FREQUENCY); + + /* Send master blocking data to slave */ + if (kStatus_Success == I2C_MasterStart(EXAMPLE_I2C_MASTER, I2C_MASTER_SLAVE_ADDR_7BIT, kI2C_Write)) + { + /* subAddress = 0x01, data = g_master_txBuff - write to slave. + start + slaveaddress(w) + subAddress + length of data buffer + data buffer + stop*/ + reVal = I2C_MasterWriteBlocking(EXAMPLE_I2C_MASTER, &deviceAddress, 1, kI2C_TransferNoStopFlag); + if (reVal != kStatus_Success) + { + return -1; + } + + reVal = I2C_MasterWriteBlocking(EXAMPLE_I2C_MASTER, g_master_txBuff, I2C_DATA_LENGTH, kI2C_TransferDefaultFlag); + if (reVal != kStatus_Success) + { + return -1; + } + + reVal = I2C_MasterStop(EXAMPLE_I2C_MASTER); + if (reVal != kStatus_Success) + { + return -1; + } + } + + /* Wait until the slave is ready for transmit, wait time depend on user's case. + Slave devices that need some time to process received byte or are not ready yet to + send the next byte, can pull the clock low to signal to the master that it should wait.*/ + for (uint32_t i = 0U; i < WAIT_TIME; i++) + { + __NOP(); + } + + PRINTF("Receive sent data from slave :"); + + /* Receive blocking data from slave */ + /* subAddress = 0x01, data = g_master_rxBuff - read from slave. + start + slaveaddress(w) + subAddress + repeated start + slaveaddress(r) + rx data buffer + stop */ + if (kStatus_Success == I2C_MasterStart(EXAMPLE_I2C_MASTER, I2C_MASTER_SLAVE_ADDR_7BIT, kI2C_Write)) + { + reVal = I2C_MasterWriteBlocking(EXAMPLE_I2C_MASTER, &deviceAddress, 1, kI2C_TransferNoStopFlag); + if (reVal != kStatus_Success) + { + return -1; + } + + reVal = I2C_MasterRepeatedStart(EXAMPLE_I2C_MASTER, I2C_MASTER_SLAVE_ADDR_7BIT, kI2C_Read); + if (reVal != kStatus_Success) + { + return -1; + } + + reVal = + I2C_MasterReadBlocking(EXAMPLE_I2C_MASTER, g_master_rxBuff, I2C_DATA_LENGTH - 1, kI2C_TransferDefaultFlag); + if (reVal != kStatus_Success) + { + return -1; + } + + reVal = I2C_MasterStop(EXAMPLE_I2C_MASTER); + if (reVal != kStatus_Success) + { + return -1; + } + } + + for (uint32_t i = 0U; i < I2C_DATA_LENGTH - 1; i++) + { + if (i % 8 == 0) + { + PRINTF("\r\n"); + } + PRINTF("0x%2x ", g_master_rxBuff[i]); + } + PRINTF("\r\n\r\n"); + + /* Transfer completed. Check the data.*/ + for (uint32_t i = 0U; i < I2C_DATA_LENGTH - 1; i++) + { + if (g_master_rxBuff[i] != g_master_txBuff[i + 1]) + { + PRINTF("\r\nError occurred in the transfer ! \r\n"); + break; + } + } + + PRINTF("\r\nEnd of I2C example .\r\n"); + while (1) + { + } +} diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/lpc_i2c_polling_b2b_master_v3_9.xml b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/lpc_i2c_polling_b2b_master_v3_9.xml new file mode 100644 index 0000000..28dfd79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/lpc_i2c_polling_b2b_master_v3_9.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/pin_mux.c b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/pin_mux.c new file mode 100644 index 0000000..441427a --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/pin_mux.c @@ -0,0 +1,142 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '17', peripheral: I2C0, signal: SCL, pin_signal: PIO0_10/I2C0_SCL, invert: disabled, smode: bypass, clkdiv: div0, i2cmode: fastMode} + - {pin_num: '16', peripheral: I2C0, signal: SDA, pin_signal: PIO0_11/I2C0_SDA, invert: disabled, smode: bypass, clkdiv: div0, i2cmode: fastMode} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO0_10_config = (/* Input not invert */ + IOCON_PIO_INV_DI | + /* Standard/Fast mode */ + IOCON_PIO_I2CMODE_FAST | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN10 (coords: 17) is configured as I2C0, SCL. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_10, IOCON_INDEX_PIO0_10_config); + + const uint32_t IOCON_INDEX_PIO0_11_config = (/* Input not invert */ + IOCON_PIO_INV_DI | + /* Standard/Fast mode */ + IOCON_PIO_I2CMODE_FAST | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO0 PIN11 (coords: 16) is configured as I2C0, SDA. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO0_11, IOCON_INDEX_PIO0_11_config); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* I2C0_SDA connect to P0_11 */ + SWM_SetFixedPinSelect(SWM0, kSWM_I2C0_SDA, true); + + /* I2C0_SCL connect to P0_10 */ + SWM_SetFixedPinSelect(SWM0, kSWM_I2C0_SCL, true); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/pin_mux.h b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/pin_mux.h new file mode 100644 index 0000000..3895332 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/pin_mux.h @@ -0,0 +1,61 @@ +/* + * Copyright 2018 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_I2CMODE_FAST 0x00u /*!<@brief Standard/Fast mode */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/readme.txt b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/readme.txt new file mode 100644 index 0000000..04cd785 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/master/readme.txt @@ -0,0 +1,91 @@ +## Overview +----------- +This example demonstrates configuration and use of the I2C master module in polling mode +on communication with a I2C slave module calling the I2C functional APIs. This example +should work together with `lpc_i2c_polling_b2b_transfer_slave` example. + +**Transactional API and Functional API** + +- Low level functional APIs provide common peripheral functionality, abstracting the + hardware peripheral register access into a set of state less basic functional operations. + These APIs primarily focus on the control, configuration, and function of basic + peripheral operations. + +- Transactional APIs provide a quick method for customers to utilize higher-level + functionality of the peripherals. The transactional APIs utilize interrupts and perform + asynchronous operations without user intervention. Transactional APIs operate on high- + level logic that requires data storage for internal operation context handling. However, + the peripheral drivers do not allocate this memory space. Rather, the user passes in the + memory to the driver for internal driver operation. + +- All driver examples calling the transactional API get the `transfer` in the project + naming. If the code size and performance are critical requirements, see the + transactional API implementation and write custom code. + +## Functional Description +------------------------- +In this example, I2C master will communicate with a slave module on another board, master +will use polling mode and slave use interrupt transactional mode. + +1. Once the project starts, main routine will initialize clock, pin mux configuration, + and configure the I2C module to make it work in master mode. + +2. Prepare transfer for master to communicate with slave module calling the blocking API, + In this API, main routine will check the status of register before sending and receiving + data, and this API will not return until all data is sent and received. + +3. Checking if the data from slave module is all right while transfer is completed, and print + the received data and information to the debug console on PC. + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ +Connect pins of I2C master and slave(on another board) as below: + + Master - I2C0 Slave - I2C0 +Pin Name Board Location Pin Name Board Location +SCL J1-1 SCL J1-1 +SDA J1-2 SDA J1-2 +GND J1-4 GND J1-4 + +## Run the Project +------------------------ +Run this example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board) for receiving debug information. + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Start the slave board on another board first, then launch the debugger in your IDE to + begin running this project. + +5. Monitor the information on the debug console. + +## Expected Result +------------------------ +The I2C master module will communicate with slave module in polling mode, slave module +should be started first. Once the communication between master board and slave board is +completed, the received data and information will be printed to the debug console on PC. diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/CMakeLists.txt new file mode 100644 index 0000000..eb5e46e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(lpc_i2c_polling_b2b_slave) + +set(MCUX_SDK_PROJECT_NAME lpc_i2c_polling_b2b_slave.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../i2c_polling_b2b_slave.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_i2c_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/board.c b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/board.h b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/clock_config.c b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/i2c/polling_b2b/slave/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_basic/pin_mux.c b/boards/lpcxpresso845max/driver_examples/iap/iap_basic/pin_mux.c new file mode 100644 index 0000000..81e5e45 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_basic/pin_mux.c @@ -0,0 +1,111 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_basic/pin_mux.h b/boards/lpcxpresso845max/driver_examples/iap/iap_basic/pin_mux.h new file mode 100644 index 0000000..a896cc5 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_basic/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_basic/readme.txt b/boards/lpcxpresso845max/driver_examples/iap/iap_basic/readme.txt new file mode 100644 index 0000000..b645723 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_basic/readme.txt @@ -0,0 +1,51 @@ +Overview +======== +The IAP project is a simple demonstration program of the SDK IAP +driver. It reads part id, boot code version, unique id and reinvoke ISP. A message +a printed on the UART terminal as various bascial iap operations are performed. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the Demo +================ +1. Connect a micro USB cable between the host PC and the CMSIS DAP port(J4 on the board). +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. + +Running the demo +================ +1. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +The following lines are printed to the serial terminal when the demo program is executed. + +IAP example + +PartID: XXXXX + +The major version is: XXXX + +The minor version is: XXXX + +Unique ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +End of IAP Example diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/CMakeLists.txt new file mode 100644 index 0000000..b7e5fc1 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(iap_faim) + +set(MCUX_SDK_PROJECT_NAME iap_faim.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../iap_faim.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_iap_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/board.c b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/board.h b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_faim/clock_config.c b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_faim/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_flash/pin_mux.c b/boards/lpcxpresso845max/driver_examples/iap/iap_flash/pin_mux.c new file mode 100644 index 0000000..81e5e45 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_flash/pin_mux.c @@ -0,0 +1,111 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v9.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_flash/pin_mux.h b/boards/lpcxpresso845max/driver_examples/iap/iap_flash/pin_mux.h new file mode 100644 index 0000000..a896cc5 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_flash/pin_mux.h @@ -0,0 +1,59 @@ +/* + * Copyright 2019 ,2021 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/driver_examples/iap/iap_flash/readme.txt b/boards/lpcxpresso845max/driver_examples/iap/iap_flash/readme.txt new file mode 100644 index 0000000..092d21d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/iap/iap_flash/readme.txt @@ -0,0 +1,53 @@ +Overview +======== +The IAP Flash project is a simple demonstration program of the SDK IAP driver. It erases and programs +a portion of on-chip flash memory. A message a printed on the UART terminal as various operations on +flash memory are performed. + +Toolchain supported +=================== +- IAR embedded Workbench 9.10.2 +- Keil MDK 5.34 +- GCC ARM Embedded 10.2.1 +- MCUXpresso 11.5.0 + +Hardware requirements +===================== +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +Board settings +============== +No special settings are required. + +Prepare the Demo +================ +1. Connect a micro USB cable between the host PC and the CMSIS DAP port(J4 on the board). +2. Open a serial terminal with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control +3. Download the program to the target board. + +Running the demo +================ +1. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo. + +The following lines are printed to the serial terminal when the demo program is executed. + +IAP Flash example + +Writing flash sector 1 + +Erasing flash sector 1 + +Erasing page 1 in flash sector 1 + +Flash signature value of page 1 + +XXXXXXXXXXXXXXXXXXXXX + +End of IAP Flash Example diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/CMakeLists.txt new file mode 100644 index 0000000..47069ed --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(mrt_example) + +set(MCUX_SDK_PROJECT_NAME mrt_example.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../mrt.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_mrt_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/mrt/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/mrt/board.c b/boards/lpcxpresso845max/driver_examples/mrt/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/mrt/board.h b/boards/lpcxpresso845max/driver_examples/mrt/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/mrt/clock_config.c b/boards/lpcxpresso845max/driver_examples/mrt/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/mrt/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! 1U) + /* Setup Pattern Match Bit Slice 1 */ + pmcfg.bs_src = DEMO_PINT_BSLICE1_SRC; + pmcfg.bs_cfg = kPINT_PatternMatchStickyRise; + pmcfg.callback = pint_intr_callback; + pmcfg.end_point = false; + PINT_PatternMatchConfig(PINT, kPINT_PatternMatchBSlice1, &pmcfg); +#endif + +#if (FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS > 2U) + /* Setup Pattern Match Bit Slice 2 for falling edge detection */ + pmcfg.bs_src = DEMO_PINT_BSLICE2_SRC; + pmcfg.bs_cfg = kPINT_PatternMatchStickyRise; + pmcfg.callback = pint_intr_callback; + pmcfg.end_point = true; + PINT_PatternMatchConfig(PINT, kPINT_PatternMatchBSlice2, &pmcfg); + + /* Enable callbacks for PINT2 by Index */ + PINT_EnableCallbackByIndex(PINT, kPINT_PinInt2); +#endif + + /* Enable PatternMatch */ + PINT_PatternMatchEnable(PINT); + + PRINTF("\r\nPINT Pattern match events are configured\r\n"); + PRINTF("\r\nPress corresponding switches to generate events\r\n"); + while (1) + { + __WFI(); + } +} diff --git a/boards/lpcxpresso845max/driver_examples/pint/pattern_match/pint_pattern_match_v3_9.xml b/boards/lpcxpresso845max/driver_examples/pint/pattern_match/pint_pattern_match_v3_9.xml new file mode 100644 index 0000000..0bcdc68 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pattern_match/pint_pattern_match_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/pint/pattern_match/readme.txt b/boards/lpcxpresso845max/driver_examples/pint/pattern_match/readme.txt new file mode 100644 index 0000000..4297a71 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pattern_match/readme.txt @@ -0,0 +1,75 @@ +## Overview +----------- +The pattern_match example shows how to use PINT to make the pattern match events. + +When the PINT feature is enabled, initialize the port and the pin connected to SW1 and SW2, configure the port mask with MASK register +and PIN register, which can be used to trigger the PIN's status. At the same time when the SW1 or SW2 is pressed, the the pattern match event will +show. + +## Functional Description +------------------------- +In this example, The pattern_match will output the pattern match event into serial terminal. + +When start running this example, main routine will initialize clock, pin mux configuration, +and configure the PINT module to make it work in interrupt way. Users are prompted to +press the SW1 or SW2, board will output the event. + +## Toolchain Supported +--------------------- +- IAR embedded Workbench 8.50.5 +- Keil MDK 5.31 +- GCC ARM Embedded 9.2.1 +- MCUXpresso 11.2.0 + +## Hardware Requirements +------------------------ +- Micro USB cable +- LPCXpresso845MAX board +- Personal Computer + +## Board Settings +------------------------ + +## Run the Project +------------------------ +Run this example by performing the following steps: + +1. Connect a micro USB cable between the PC host and the CMSIS DAP port(J4 on the + LPCXpresso845MAX board) for receiving debug information. + +2. Open a serial terminal in PC(for example PUTTY) with the following settings: + - 9600 baud rate + - 8 data bits + - No parity + - One stop bit + - No flow control + +3. Compile and download the program to the target board. + More information about how to compile and program the project can refer to + + [Getting Started with MCUXpresso SDK](../../../../../docs/Getting Started with MCUXpresso SDK.pdf). + +4. Start the slave board on another board first, then launch the debugger in your IDE to + begin running this project. + +5. Monitor the information on the debug console. + +## Expected Result +------------------------ +PINT Pattern Match example. + +PINT Pattern match events are configured. + +Press corresponding switches to generate events. + +This example configures "Pin Interrupt 0" to be invoked when SW1 switch is pressed by the user. + +Bit slice 0 is configured as an endpoint in sticky falling edge mode. The interrupt callback prints + +"PINT Pin Interrupt 0 event detected. PatternMatch status = 1". + +"Pin Interrupt 2" is configured to be invoked when rising edge on SW1, SW2 is detected. The + +interrupt callback prints "PINT Pin Interrupt 2 event detected. PatternMatch status = 100". Bit slices + +1 configured to detect sticky rising edge. Bit slice 2 is configured as an endpoint. diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/CMakeLists.txt new file mode 100644 index 0000000..7115ac7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(pint_pin_interrupt) + +set(MCUX_SDK_PROJECT_NAME pint_pin_interrupt.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../pint_pin_interrupt.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_pint_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/board.c b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/board.h b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/clock_config.c b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/pint/pin_interrupt/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define SCTIMER_CLK_FREQ CLOCK_GetFreq(kCLOCK_Fro) +#define DEMO_FIRST_SCTIMER_OUT kSCTIMER_Out_2 +#define DEMO_SECOND_SCTIMER_OUT kSCTIMER_Out_4 +#define MAX_UP_COUNTER_VALUE (0xFFFFU * 256U) +#define MAX_UPDOWN_COUNTER_VALUE (0x1FFFFU * 256U) + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Code + ******************************************************************************/ +static status_t SCTIMER_Calculate16BitCounterConfig(uint64_t rawCountValue, + uint8_t *prescale, + uint16_t *matchValue, + sctimer_event_active_direction_t *activeDir) +{ + status_t status = kStatus_Success; + + if (rawCountValue < MAX_UP_COUNTER_VALUE) + { + *prescale = (uint8_t)(rawCountValue / 0xFFFFU); + *matchValue = (uint16_t)(rawCountValue / (*prescale + 1U)); + *activeDir = kSCTIMER_ActiveIndependent; + } + else if (rawCountValue < MAX_UPDOWN_COUNTER_VALUE) + { + *prescale = (uint8_t)(rawCountValue / 0x1FFFFU); + *matchValue = (uint16_t)(0x1FFFFU - rawCountValue / (*prescale + 1)); + *activeDir = kSCTIMER_ActiveInCountDown; + } + else + { + status = kStatus_Fail; + } + return status; +} +/*! + * @brief Main function + */ +int main(void) +{ + sctimer_config_t sctimerInfo; + uint32_t eventCounterL, eventCounterH; + uint32_t sctimerClock; + uint16_t matchValueL, matchValueH; + sctimer_event_active_direction_t activeDirL, activeDirH; + + /* Board pin, clock, debug console init */ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + sctimerClock = SCTIMER_CLK_FREQ; + + /* Print a note to terminal */ + PRINTF("\r\nSCTimer example to use it in 16-bit mode\r\n"); + PRINTF("\r\nThe example shows both 16-bit counters running and toggling an output periodically "); + + SCTIMER_GetDefaultConfig(&sctimerInfo); +/* Add judgement for change colck source*/ +#if defined(SCTIMER_NEED_CHANGE_CLOCK_SOURCE) + sctimerInfo.clockMode = DEMO_CLOCK_MODE; + sctimerInfo.clockSelect = DEMO_CLOCK_SEL; +#endif + + /* Switch to 16-bit mode, if we want to use any 16-bit counter, no matter the Low 16-bit one or the + * High 16-bit one, we need to disable the Unify 32-bit Counter by hardware limit. + */ + sctimerInfo.enableCounterUnify = false; + + /* Calculate prescaler, match value and active direction for the 16-bit low counter for 100ms interval */ + if (SCTIMER_Calculate16BitCounterConfig(MSEC_TO_COUNT(100U, sctimerClock), &sctimerInfo.prescale_l, &matchValueL, + &activeDirL) == kStatus_Fail) + { + PRINTF("\r\nSCTimer 16-bit low counter is out of range\r\n"); + return -1; + } + /* Calculate prescaler, match value and active direction for the 16-bit high counter for 200ms interval */ + if (SCTIMER_Calculate16BitCounterConfig(MSEC_TO_COUNT(200U, sctimerClock), &sctimerInfo.prescale_h, &matchValueH, + &activeDirH) == kStatus_Fail) + { + PRINTF("\r\nSCTimer 16-bit high counter is out of range\r\n"); + return -1; + } + + /* Enable bidirectional mode to extended 16-bit count range*/ + if (activeDirL != kSCTIMER_ActiveIndependent) + { + sctimerInfo.enableBidirection_l = true; + } + if (activeDirH != kSCTIMER_ActiveIndependent) + { + sctimerInfo.enableBidirection_h = true; + } + + /* Initialize SCTimer module */ + SCTIMER_Init(SCT0, &sctimerInfo); + + /* Schedule a match event for the 16-bit low counter every 0.1 seconds */ + if (SCTIMER_CreateAndScheduleEvent(SCT0, kSCTIMER_MatchEventOnly, matchValueL, 0, kSCTIMER_Counter_L, + &eventCounterL) == kStatus_Fail) + { + return -1; + } + + /* Toggle first output when the 16-bit low counter event occurs */ + SCTIMER_SetupOutputToggleAction(SCT0, DEMO_FIRST_SCTIMER_OUT, eventCounterL); + + /* Reset Counter L when the 16-bit low counter event occurs */ + SCTIMER_SetupCounterLimitAction(SCT0, kSCTIMER_Counter_L, eventCounterL); + + /* Setup the 16-bit low counter event active direction */ + SCTIMER_SetupEventActiveDirection(SCT0, activeDirL, eventCounterL); + + /* Schedule a match event for the 16-bit high counter every 0.2 seconds */ + if (SCTIMER_CreateAndScheduleEvent(SCT0, kSCTIMER_MatchEventOnly, matchValueH, 0, kSCTIMER_Counter_H, + &eventCounterH) == kStatus_Fail) + { + return -1; + } + + /* Setup the 16-bit high counter event active direction */ + SCTIMER_SetupEventActiveDirection(SCT0, activeDirH, eventCounterH); + + /* Toggle second output when the 16-bit high counter event occurs */ + SCTIMER_SetupOutputToggleAction(SCT0, DEMO_SECOND_SCTIMER_OUT, eventCounterH); + + /* Reset Counter H when the 16-bit high counter event occurs */ + SCTIMER_SetupCounterLimitAction(SCT0, kSCTIMER_Counter_H, eventCounterH); + + /* Start the 16-bit low and high counter */ + SCTIMER_StartTimer(SCT0, kSCTIMER_Counter_L | kSCTIMER_Counter_H); + + while (1) + { + } +} diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/16bit_counter/sctimer_16bit_counter_v3_9.xml b/boards/lpcxpresso845max/driver_examples/sctimer/16bit_counter/sctimer_16bit_counter_v3_9.xml new file mode 100644 index 0000000..3cf2a65 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/16bit_counter/sctimer_16bit_counter_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/CMakeLists.txt new file mode 100644 index 0000000..db6c70f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(sctimer_multi_state_pwm) + +set(MCUX_SDK_PROJECT_NAME sctimer_multi_state_pwm.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../sctimer_multi_state_pwm.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_sctimer_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/board.c b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/board.h b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/clock_config.c b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/multi_state_pwm/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/pwm_with_dutycyle_change/sctimer_update_dutycycle.c b/boards/lpcxpresso845max/driver_examples/sctimer/pwm_with_dutycyle_change/sctimer_update_dutycycle.c new file mode 100644 index 0000000..1cfb4ef --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/pwm_with_dutycyle_change/sctimer_update_dutycycle.c @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_debug_console.h" +#include "pin_mux.h" +#include "board.h" +#include "fsl_sctimer.h" + +#include +/******************************************************************************* + * Definitions + ******************************************************************************/ + +#define SCTIMER_CLK_FREQ CLOCK_GetFreq(kCLOCK_Fro) +#define DEMO_SCTIMER_OUT kSCTIMER_Out_4 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/*! + * @brief delay a while. + */ +void delay(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +volatile bool sctimerIsrFlag = false; +volatile bool brightnessUp = true; /* Indicate LED is brighter or dimmer */ +volatile uint8_t updatedDutycycle = 10U; +uint32_t eventNumberOutput; + +/******************************************************************************* + * Code + ******************************************************************************/ +void delay(void) +{ + volatile uint32_t i = 0U; + for (i = 0U; i < 80000U; ++i) + { + __asm("NOP"); /* delay */ + } +} + +/* The interrupt callback function is used to update the PWM dutycycle */ +void SCTIMER_LED_HANDLER() +{ + sctimerIsrFlag = true; + + if (brightnessUp) + { + /* Increase duty cycle until it reach limited value, don't want to go upto 100% duty cycle + * as channel interrupt will not be set for 100% + */ + if (++updatedDutycycle >= 99U) + { + updatedDutycycle = 99U; + brightnessUp = false; + } + } + else + { + /* Decrease duty cycle until it reach limited value */ + if (--updatedDutycycle == 1U) + { + brightnessUp = true; + } + } + + if (SCTIMER_GetStatusFlags(SCT0) & (1 << eventNumberOutput)) + { + /* Clear interrupt flag.*/ + SCTIMER_ClearStatusFlags(SCT0, (1 << eventNumberOutput)); + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + sctimer_config_t sctimerInfo; + sctimer_pwm_signal_param_t pwmParam; + uint32_t sctimerClock; + + /* Board pin, clock, debug console init */ + /* Attach 12 MHz clock to USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + sctimerClock = SCTIMER_CLK_FREQ; + /* Print a note to terminal */ + PRINTF("\r\nSCTimer example to output center-aligned PWM signal\r\n"); + PRINTF("\r\nYou will see a change in LED brightness if an LED is connected to the SCTimer output pin"); + PRINTF("\r\nIf no LED is connected to the pin, then probe the signal using an oscilloscope"); + + SCTIMER_GetDefaultConfig(&sctimerInfo); + + /* Initialize SCTimer module */ + SCTIMER_Init(SCT0, &sctimerInfo); + + /* Configure PWM params with frequency 24kHZ from output */ + pwmParam.output = DEMO_SCTIMER_OUT; + pwmParam.level = kSCTIMER_HighTrue; + pwmParam.dutyCyclePercent = updatedDutycycle; + if (SCTIMER_SetupPwm(SCT0, &pwmParam, kSCTIMER_CenterAlignedPwm, 24000U, sctimerClock, &eventNumberOutput) == + kStatus_Fail) + { + return -1; + } + + /* Enable interrupt flag for event associated with out 4, we use the interrupt to update dutycycle */ + SCTIMER_EnableInterrupts(SCT0, (1 << eventNumberOutput)); + + /* Receive notification when event is triggered */ + SCTIMER_SetCallback(SCT0, SCTIMER_LED_HANDLER, eventNumberOutput); + + /* Enable at the NVIC */ + EnableIRQ(SCT0_IRQn); + + /* Start the 32-bit unify timer */ + SCTIMER_StartTimer(SCT0, kSCTIMER_Counter_U); + + /* Code below updates the PWM dutycycle for Out */ + while (1) + { + /* Use interrupt to update the PWM dutycycle on output */ + if (true == sctimerIsrFlag) + { + /* Disable interrupt to retain current dutycycle for a few seconds */ + SCTIMER_DisableInterrupts(SCT0, (1 << eventNumberOutput)); + + sctimerIsrFlag = false; + + /* Update PWM duty cycle */ + SCTIMER_UpdatePwmDutycycle(SCT0, DEMO_SCTIMER_OUT, updatedDutycycle, eventNumberOutput); + + /* Delay to view the updated PWM dutycycle */ + delay(); + + /* Enable interrupt flag to update PWM dutycycle */ + SCTIMER_EnableInterrupts(SCT0, (1 << eventNumberOutput)); + } + } +} diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/CMakeLists.txt new file mode 100644 index 0000000..0d4e27d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(sctimer_simple_pwm) + +set(MCUX_SDK_PROJECT_NAME sctimer_simple_pwm.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../sctimer_simple_pwm.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_sctimer_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/board.c b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/board.h b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/clock_config.c b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/sctimer/simple_pwm/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_SPI_MASTER SPI0 +#define EXAMPLE_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFreq(EXAMPLE_CLK_SRC) +#define EXAMPLE_SPI_MASTER_BAUDRATE 500000U +#define EXAMPLE_SPI_MASTER_SSEL kSPI_Ssel0Assert +#define EXAMPLE_SPI_MASTER_IRQ SPI0_IRQn + +#define SPI_MASTER_IRQHandler SPI0_IRQHandler + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_SPIMasterInit(void); +static void EXAMPLE_MasterStartTransfer(void); +static void EXAMPLE_TransferDataCheck(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +#define BUFFER_SIZE (64) +static uint8_t txBuffer[BUFFER_SIZE]; +static uint8_t rxBuffer[BUFFER_SIZE]; +static uint32_t txIndex = BUFFER_SIZE; +static uint32_t rxIndex = BUFFER_SIZE; +static volatile bool slaveFinished = false; + +/******************************************************************************* + * Code + ******************************************************************************/ + +void SPI_MASTER_IRQHandler(void) +{ + /* Check if data is ready in RX register. */ + if ((SPI_GetStatusFlags(EXAMPLE_SPI_MASTER) & kSPI_RxReadyFlag)) + { + rxBuffer[BUFFER_SIZE - rxIndex] = SPI_ReadData(EXAMPLE_SPI_MASTER); + rxIndex--; + } + /* Write data to TX regsiter if TX register is ready. */ + if ((SPI_GetStatusFlags(EXAMPLE_SPI_MASTER) & kSPI_TxReadyFlag) && (txIndex != 0U)) + { + /* If this is the last byte to send. */ + if (1U == txIndex) + { + /* Add end of transfer configuration. */ + SPI_WriteConfigFlags(EXAMPLE_SPI_MASTER, kSPI_EndOfTransfer); + SPI_WriteData(EXAMPLE_SPI_MASTER, txBuffer[BUFFER_SIZE - txIndex]); + } + else + { + SPI_WriteData(EXAMPLE_SPI_MASTER, (uint16_t)(txBuffer[BUFFER_SIZE - txIndex])); + } + txIndex--; + } + /* If no data to be transferred, disable the interrupt. */ + if ((txIndex == 0U) && (rxIndex == 0U)) + { + slaveFinished = true; + SPI_DisableInterrupts(EXAMPLE_SPI_MASTER, kSPI_RxReadyInterruptEnable); + } + __DSB(); +} + +int main(void) +{ + /* Initialize the boards */ + /* Attach main clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach main clock to SPI0. */ + CLOCK_Select(kSPI0_Clk_From_MainClk); + + PRINTF("This is SPI interrupt functional master example.\n\r"); + PRINTF("\n\rMaster start to send data to slave, please make sure the slave has been started!\n\r"); + + /* Initialize the SPI master with configuration. */ + EXAMPLE_SPIMasterInit(); + + /* Start transfer with slave board. */ + EXAMPLE_MasterStartTransfer(); + + /* Check the received data. */ + EXAMPLE_TransferDataCheck(); + + /* De-initialize the SPI master. */ + SPI_Deinit(EXAMPLE_SPI_MASTER); + + while (1) + { + } +} + +static void EXAMPLE_SPIMasterInit(void) +{ + spi_master_config_t masterConfig = {0}; + uint32_t srcFreq = 0U; + + /* configuration from using SPI_MasterGetDefaultConfig(): + * userConfig->enableLoopback = false; + * userConfig->enableMaster = true; + * userConfig->polarity = kSPI_ClockPolarityActiveHigh; + * userConfig->phase = kSPI_ClockPhaseFirstEdge; + * userConfig->direction = kSPI_MsbFirst; + * userConfig->baudRate_Bps = 500000U; + * userConfig->dataWidth = kSPI_Data8Bits; + * userConfig->sselNum = kSPI_Ssel0Assert; + * userConfig->sselPol = kSPI_SpolActiveAllLow; + */ + SPI_MasterGetDefaultConfig(&masterConfig); + masterConfig.baudRate_Bps = EXAMPLE_SPI_MASTER_BAUDRATE; + masterConfig.sselNumber = EXAMPLE_SPI_MASTER_SSEL; + srcFreq = EXAMPLE_SPI_MASTER_CLK_FREQ; + SPI_MasterInit(EXAMPLE_SPI_MASTER, &masterConfig, srcFreq); +} + +static void EXAMPLE_MasterStartTransfer(void) +{ + uint32_t i = 0U; + + /* Init source buffer */ + for (i = 0U; i < BUFFER_SIZE; i++) + { + txBuffer[i] = i; + rxBuffer[i] = 0U; + } + + /* Write data to TXDAT register to trigger receive interrupt. */ + SPI_WriteData(EXAMPLE_SPI_MASTER, txBuffer[BUFFER_SIZE - (txIndex--)]); + /* Enable SPI receive ready interrupt. */ + EnableIRQ(EXAMPLE_SPI_MASTER_IRQ); + SPI_EnableInterrupts(EXAMPLE_SPI_MASTER, kSPI_RxReadyInterruptEnable); +} + +static void EXAMPLE_TransferDataCheck(void) +{ + uint32_t i = 0U, err = 0U; + /* Waiting for the transmission complete. */ + while (slaveFinished != true) + { + } + + PRINTF("\n\rThe received data are:"); + /*Check if the data is right*/ + for (i = 0; i < BUFFER_SIZE; i++) + { + /* Print 16 numbers in a line */ + if ((i & 0x0FU) == 0U) + { + PRINTF("\n\r"); + } + PRINTF(" 0x%02X", rxBuffer[i]); + /* Check if data matched. */ + if (txBuffer[i] != rxBuffer[i]) + { + err++; + } + } + + if (err == 0) + { + PRINTF("\n\rMaster transfer succeed!\n\r"); + } + else + { + PRINTF("\n\rMaster transfer faild!\n\r"); + } +} diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/master/spi_interrupt_master_v3_9.xml b/boards/lpcxpresso845max/driver_examples/spi/interrupt/master/spi_interrupt_master_v3_9.xml new file mode 100644 index 0000000..242bd4b --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/master/spi_interrupt_master_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/CMakeLists.txt new file mode 100644 index 0000000..cb6b908 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(spi_interrupt_slave) + +set(MCUX_SDK_PROJECT_NAME spi_interrupt_slave.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../spi_interrupt_slave.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_minispi_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/board.c b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/board.h b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/clock_config.c b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/interrupt/slave/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_SPI_MASTER SPI0 +#define EXAMPLE_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFreq(EXAMPLE_CLK_SRC) +#define EXAMPLE_SPI_MASTER_BAUDRATE 500000U +#define EXAMPLE_SPI_MASTER_SSEL kSPI_Ssel0Assert + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_SPIMasterInit(void); +static void EXAMPLE_MasterStartTransfer(void); +static void EXAMPLE_TransferDataCheck(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +#define BUFFER_SIZE (64) +static uint8_t txBuffer[BUFFER_SIZE]; +static uint8_t rxBuffer[BUFFER_SIZE]; + +/******************************************************************************* + * Code + ******************************************************************************/ + +int main(void) +{ + /* Initizlize the hardware(clock/pins configuration/debug console). */ + /* Attach main clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach main clock to SPI0. */ + CLOCK_Select(kSPI0_Clk_From_MainClk); + + PRINTF("This is SPI polling transfer master example.\n\r"); + PRINTF("\n\rMaster start to send data to slave, please make sure the slave has been started!\n\r"); + + /* Initialize the SPI master with configuration. */ + EXAMPLE_SPIMasterInit(); + + /* Start transfer with slave board. */ + EXAMPLE_MasterStartTransfer(); + + /* Check the received data. */ + EXAMPLE_TransferDataCheck(); + + /* De-initialize the SPI. */ + SPI_Deinit(EXAMPLE_SPI_MASTER); + + while (1) + { + } +} + +static void EXAMPLE_SPIMasterInit(void) +{ + spi_master_config_t userConfig = {0}; + uint32_t srcFreq = 0U; + /* Note: The slave board using interrupt way, slave will spend more time to write data + * to TX register, to prevent TX data missing in slave, we will add some delay between + * frames and capture data at the second edge, this operation will make the slave + * has more time to prapare the data. + */ + SPI_MasterGetDefaultConfig(&userConfig); + userConfig.baudRate_Bps = EXAMPLE_SPI_MASTER_BAUDRATE; + userConfig.sselNumber = EXAMPLE_SPI_MASTER_SSEL; + userConfig.clockPhase = kSPI_ClockPhaseSecondEdge; + userConfig.delayConfig.frameDelay = 0xFU; + srcFreq = EXAMPLE_SPI_MASTER_CLK_FREQ; + SPI_MasterInit(EXAMPLE_SPI_MASTER, &userConfig, srcFreq); +} + +static void EXAMPLE_MasterStartTransfer(void) +{ + uint32_t i = 0U; + spi_transfer_t xfer = {0}; + + /* Init Buffer*/ + for (i = 0; i < BUFFER_SIZE; i++) + { + txBuffer[i] = i % 256; + rxBuffer[i] = 0U; + } + + /*Start Transfer*/ + xfer.txData = txBuffer; + xfer.rxData = rxBuffer; + xfer.dataSize = sizeof(txBuffer); + xfer.configFlags = kSPI_EndOfTransfer | kSPI_EndOfFrame; + /* Transfer data in polling mode. */ + SPI_MasterTransferBlocking(EXAMPLE_SPI_MASTER, &xfer); +} + +static void EXAMPLE_TransferDataCheck(void) +{ + uint32_t i = 0U, err = 0U; + PRINTF("\n\rThe received data are:"); + for (i = 0; i < BUFFER_SIZE; i++) + { + /* Print 16 numbers in a line */ + if ((i & 0x0FU) == 0U) + { + PRINTF("\n\r"); + } + PRINTF(" 0x%02X", rxBuffer[i]); + /* Check if data matched. */ + if (txBuffer[i] != rxBuffer[i]) + { + err++; + } + } + + if (err == 0) + { + PRINTF("\n\rMaster polling transfer succeed!\n\r"); + } + else + { + PRINTF("\n\rMaster polling transfer faild!\n\r"); + } +} diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/master/spi_polling_master_v3_9.xml b/boards/lpcxpresso845max/driver_examples/spi/polling/master/spi_polling_master_v3_9.xml new file mode 100644 index 0000000..6027d4f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/master/spi_polling_master_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/CMakeLists.txt new file mode 100644 index 0000000..d56e3b6 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(spi_polling_slave) + +set(MCUX_SDK_PROJECT_NAME spi_polling_slave.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../spi_polling_slave.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_minispi_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/board.c b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/board.h b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/spi/polling/slave/clock_config.c b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/polling/slave/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_SPI_MASTER SPI0 +#define EXAMPLE_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFreq(EXAMPLE_CLK_SRC) +#define EXAMPLE_SPI_MASTER_BAUDRATE 500000U +#define EXAMPLE_SPI_MASTER_SSEL kSPI_Ssel0Assert + +#define EXAMPLE_SPI_MASTER_DMA_BASEADDR DMA0 +#define EXAMPLE_SPI_MASTER_TX_CHANNEL 11 +#define EXAMPLE_SPI_MASTER_RX_CHANNEL 10 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void SPI_DmaTxCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds); +static void SPI_DmaRxCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds); +static void EXAMPLE_SPIMasterInit(void); +static void EXAMPLE_MasterDMASetup(void); +static void EXAMPLE_MasterStartDMATransfer(void); +static void EXAMPLE_TransferDataCheck(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +#define BUFFER_SIZE (64) +static uint8_t txBuffer[BUFFER_SIZE]; +static uint8_t rxBuffer[BUFFER_SIZE]; + +dma_handle_t masterTxHandle; +dma_handle_t masterRxHandle; + +static volatile bool masterTxFinished = false; +static volatile bool masterRxFinished = false; + +/*! @brief Static table of descriptors */ +SDK_ALIGN(dma_descriptor_t txDescriptor, 16) = {0}; + +/*! @brief The last data to be sent. */ +SDK_ALIGN(uint32_t lastData, 4) = 0U; + +/******************************************************************************* + * Code + ******************************************************************************/ +static void SPI_DmaTxCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + masterTxFinished = true; +} + +static void SPI_DmaRxCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + masterRxFinished = true; +} + +int main(void) +{ + /* Initialize the boards */ + /* Attach main clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach main clock to SPI0. */ + CLOCK_Select(kSPI0_Clk_From_MainClk); + + PRINTF("This is SPI dma transfer master example!\n\r"); + PRINTF("To make sure the transfer work successfully, please start the slave board first!\n\r"); + + /* Initialize the SPI master with configuration. */ + EXAMPLE_SPIMasterInit(); + + /* Set up DMA configuration. */ + EXAMPLE_MasterDMASetup(); + + /* Start transfer with slave board. */ + EXAMPLE_MasterStartDMATransfer(); + + /* Check the received data. */ + EXAMPLE_TransferDataCheck(); + + /* De-initialize the DMA. */ + DMA_Deinit(EXAMPLE_SPI_MASTER_DMA_BASEADDR); + + /* De-initialize the SPI. */ + SPI_Deinit(EXAMPLE_SPI_MASTER); + + while (1) + { + } +} + +static void EXAMPLE_SPIMasterInit(void) +{ + uint32_t srcFreq = 0U; + spi_master_config_t masterConfig; + /* configuration from using SPI_MasterGetDefaultConfig(): + * userConfig->enableLoopback = false; + * userConfig->enableMaster = true; + * userConfig->polarity = kSPI_ClockPolarityActiveHigh; + * userConfig->phase = kSPI_ClockPhaseFirstEdge; + * userConfig->direction = kSPI_MsbFirst; + * userConfig->baudRate_Bps = 500000U; + * userConfig->dataWidth = kSPI_Data8Bits; + * userConfig->sselNum = kSPI_Ssel0Assert; + * userConfig->sselPol = kSPI_SpolActiveAllLow; + */ + SPI_MasterGetDefaultConfig(&masterConfig); + masterConfig.baudRate_Bps = EXAMPLE_SPI_MASTER_BAUDRATE; + masterConfig.sselNumber = EXAMPLE_SPI_MASTER_SSEL; + srcFreq = EXAMPLE_SPI_MASTER_CLK_FREQ; + SPI_MasterInit(EXAMPLE_SPI_MASTER, &masterConfig, srcFreq); +} + +static void EXAMPLE_MasterDMASetup(void) +{ + /* DMA init */ + DMA_Init(EXAMPLE_SPI_MASTER_DMA_BASEADDR); + + /* Enable channel and Create handle for RX channel. */ + DMA_EnableChannel(EXAMPLE_SPI_MASTER_DMA_BASEADDR, EXAMPLE_SPI_MASTER_RX_CHANNEL); + DMA_CreateHandle(&masterRxHandle, EXAMPLE_SPI_MASTER_DMA_BASEADDR, EXAMPLE_SPI_MASTER_RX_CHANNEL); + DMA_SetCallback(&masterRxHandle, SPI_DmaRxCallback, NULL); + + /* Enable channel and Create handle for TX channel. */ + DMA_EnableChannel(EXAMPLE_SPI_MASTER_DMA_BASEADDR, EXAMPLE_SPI_MASTER_TX_CHANNEL); + DMA_CreateHandle(&masterTxHandle, EXAMPLE_SPI_MASTER_DMA_BASEADDR, EXAMPLE_SPI_MASTER_TX_CHANNEL); + DMA_SetCallback(&masterTxHandle, SPI_DmaTxCallback, NULL); + + /* Set the channel priority. */ + DMA_SetChannelPriority(EXAMPLE_SPI_MASTER_DMA_BASEADDR, EXAMPLE_SPI_MASTER_TX_CHANNEL, kDMA_ChannelPriority3); + DMA_SetChannelPriority(EXAMPLE_SPI_MASTER_DMA_BASEADDR, EXAMPLE_SPI_MASTER_RX_CHANNEL, kDMA_ChannelPriority2); +} + +static void EXAMPLE_MasterStartDMATransfer(void) +{ + uint32_t i = 0U; + dma_transfer_config_t masterTxDmaConfig, masterRxDmaConfig; + + /* Prepare buffer to send and receive data. */ + for (i = 0U; i < BUFFER_SIZE; i++) + { + txBuffer[i] = i; + rxBuffer[i] = 0U; + } + + /* Prepare and start DMA RX transfer. */ + DMA_PrepareTransfer(&masterRxDmaConfig, (void *)&EXAMPLE_SPI_MASTER->RXDAT, rxBuffer, sizeof(uint8_t), BUFFER_SIZE, + kDMA_PeripheralToMemory, NULL); + DMA_SubmitTransfer(&masterRxHandle, &masterRxDmaConfig); + + /* Start DMA TX transfer. */ + DMA_StartTransfer(&masterRxHandle); + + /* Set the last byte to be sent, This will de-assert the SSEL pin when transmission is completed. + * If users want to assert the SSEL pin when transmission is completed, there is no need to set up this descriptor. + */ + lastData = txBuffer[BUFFER_SIZE - 1] | kSPI_EndOfTransfer | (EXAMPLE_SPI_MASTER->TXCTL & 0xFFFF0000); + + /* DMA transfer configuration setting. */ + dma_xfercfg_t tmp_xfercfg = {0}; + tmp_xfercfg.valid = true; + tmp_xfercfg.swtrig = true; + tmp_xfercfg.intA = true; + tmp_xfercfg.byteWidth = sizeof(uint32_t); + tmp_xfercfg.srcInc = 0; + tmp_xfercfg.dstInc = 0; + tmp_xfercfg.transferCount = 1; + + /* Create chained descriptor to transmit last word */ + DMA_CreateDescriptor(&txDescriptor, &tmp_xfercfg, &lastData, (void *)&EXAMPLE_SPI_MASTER->TXDATCTL, NULL); + + /* Add confifuration parameter to descriptor. */ + DMA_PrepareTransfer(&masterTxDmaConfig, txBuffer, (void *)&EXAMPLE_SPI_MASTER->TXDAT, sizeof(uint8_t), + BUFFER_SIZE - 1, kDMA_MemoryToPeripheral, &txDescriptor); + + /* Disable interrupts for first descriptor to avoid calling callback twice. */ + masterTxDmaConfig.xfercfg.intA = false; + masterTxDmaConfig.xfercfg.intB = false; + + DMA_SubmitTransfer(&masterTxHandle, &masterTxDmaConfig); + + /* Start DMA TX transfer. */ + DMA_StartTransfer(&masterTxHandle); +} + +static void EXAMPLE_TransferDataCheck(void) +{ + uint32_t i = 0U, err = 0U; + + /* Waiting for the transfer complete. */ + while (!(masterTxFinished | masterRxFinished)) + { + } + + PRINTF("\n\rThe received data are:"); + /*Check if the data is right*/ + err = 0U; + for (i = 0; i < BUFFER_SIZE; i++) + { + /* Print 16 numbers in a line */ + if ((i & 0x0FU) == 0U) + { + PRINTF("\n\r"); + } + PRINTF(" 0x%02X", rxBuffer[i]); + /* Check if data matched. */ + if (txBuffer[i] != rxBuffer[i]) + { + err++; + } + } + + if (err == 0) + { + PRINTF("\n\rMaster DMA transfer succeed!\n\r"); + } + else + { + PRINTF("\n\rMaster DMA transfer faild!\n\r"); + } +} diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/master/spi_transfer_dma_master_v3_9.xml b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/master/spi_transfer_dma_master_v3_9.xml new file mode 100644 index 0000000..cd2fded --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/master/spi_transfer_dma_master_v3_9.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/CMakeLists.txt new file mode 100644 index 0000000..3774d94 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/CMakeLists.txt @@ -0,0 +1,114 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(spi_transfer_dma_slave) + +set(MCUX_SDK_PROJECT_NAME spi_transfer_dma_slave.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../spi_transfer_dma_slave.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_minispi_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/board.c b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/board.h b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/clock_config.c b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_dma/slave/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_SPI_MASTER SPI0 +#define EXAMPLE_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFreq(EXAMPLE_CLK_SRC) +#define EXAMPLE_SPI_MASTER_BAUDRATE 500000U +#define EXAMPLE_SPI_MASTER_SSEL kSPI_Ssel0Assert + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_MasterCallback(SPI_Type *base, spi_master_handle_t *handle, status_t status, void *userData); +static void EXAMPLE_SPIMasterInit(void); +static void EXAMPLE_MasterStartTransfer(void); +static void EXAMPLE_TransferDataCheck(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +#define BUFFER_SIZE (64) +static uint8_t txBuffer[BUFFER_SIZE]; +static uint8_t rxBuffer[BUFFER_SIZE]; +spi_master_handle_t masterHandle; +static volatile bool masterFinished = false; + +/******************************************************************************* + * Code + ******************************************************************************/ +static void EXAMPLE_MasterCallback(SPI_Type *base, spi_master_handle_t *handle, status_t status, void *userData) +{ + masterFinished = true; +} + +int main(void) +{ + /* Attach main clock to USART0 (debug console) */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + BOARD_InitBootPins(); + BOARD_BootClockFRO30M(); + BOARD_InitDebugConsole(); + + /* Attach main clock to SPI0. */ + CLOCK_Select(kSPI0_Clk_From_MainClk); + + PRINTF("This is SPI interrupt transfer master example.\n\r"); + PRINTF("\n\rMaster start to send data to slave, please make sure the slave has been started!\n\r"); + + /* Initialize the SPI master with configuration. */ + EXAMPLE_SPIMasterInit(); + + /* Start transfer with slave board. */ + EXAMPLE_MasterStartTransfer(); + + /* Check the received data. */ + EXAMPLE_TransferDataCheck(); + + /* De-initialize the SPI. */ + SPI_Deinit(EXAMPLE_SPI_MASTER); + + while (1) + { + } +} + +static void EXAMPLE_SPIMasterInit(void) +{ + spi_master_config_t userConfig; + uint32_t srcFreq = 0U; + + /* configuration from using SPI_MasterGetDefaultConfig(): + * userConfig->enableLoopback = false; + * userConfig->enableMaster = true; + * userConfig->polarity = kSPI_ClockPolarityActiveHigh; + * userConfig->phase = kSPI_ClockPhaseFirstEdge; + * userConfig->direction = kSPI_MsbFirst; + * userConfig->baudRate_Bps = 500000U; + * userConfig->dataWidth = kSPI_Data8Bits; + * userConfig->sselNum = kSPI_Ssel0Assert; + * userConfig->sselPol = kSPI_SpolActiveAllLow; + */ + SPI_MasterGetDefaultConfig(&userConfig); + userConfig.baudRate_Bps = EXAMPLE_SPI_MASTER_BAUDRATE; + userConfig.sselNumber = EXAMPLE_SPI_MASTER_SSEL; + srcFreq = EXAMPLE_SPI_MASTER_CLK_FREQ; + SPI_MasterInit(EXAMPLE_SPI_MASTER, &userConfig, srcFreq); +} + +static void EXAMPLE_MasterStartTransfer(void) +{ + spi_transfer_t xfer = {0}; + uint32_t i = 0U; + + /* Initialize txBuffer and rxBuffer. */ + for (i = 0; i < BUFFER_SIZE; i++) + { + txBuffer[i] = i; + rxBuffer[i] = 0U; + } + + /* Set transfer parameters for master. */ + xfer.txData = txBuffer; + xfer.rxData = rxBuffer; + xfer.dataSize = sizeof(txBuffer); + xfer.configFlags = kSPI_EndOfTransfer; + + /* Create handle for master. */ + SPI_MasterTransferCreateHandle(EXAMPLE_SPI_MASTER, &masterHandle, EXAMPLE_MasterCallback, NULL); + + /* Start transfer data. */ + SPI_MasterTransferNonBlocking(EXAMPLE_SPI_MASTER, &masterHandle, &xfer); +} +static void EXAMPLE_TransferDataCheck(void) +{ + uint32_t i = 0U, err = 0U; + /* Waiting for transmission complete. */ + while (masterFinished != true) + { + } + + PRINTF("\n\rThe received data are:"); + for (i = 0; i < BUFFER_SIZE; i++) + { + /* Print 16 numbers in a line */ + if ((i & 0x0FU) == 0U) + { + PRINTF("\n\r"); + } + PRINTF(" 0x%02X", rxBuffer[i]); + /* Check if data matched. */ + if (txBuffer[i] != rxBuffer[i]) + { + err++; + } + } + + if (err == 0) + { + PRINTF("\n\rMaster interrupt transfer succeed!\n\r"); + } + else + { + PRINTF("\n\rMaster interrupt transfer faild!\n\r"); + } +} diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/master/spi_transfer_interrupt_master_v3_9.xml b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/master/spi_transfer_interrupt_master_v3_9.xml new file mode 100644 index 0000000..6eb89f9 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/master/spi_transfer_interrupt_master_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/CMakeLists.txt new file mode 100644 index 0000000..4c93c09 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(spi_transfer_interrupt_slave) + +set(MCUX_SDK_PROJECT_NAME spi_transfer_interrupt_slave.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../spi_transfer_interrupt_slave.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../../components/uart + ${ProjDirPath}/../../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_minispi_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_all.bat new file mode 100644 index 0000000..f90389d --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_all.sh new file mode 100755 index 0000000..5702db0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_debug.bat new file mode 100644 index 0000000..0636e21 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_debug.sh new file mode 100755 index 0000000..30c0ab2 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_release.bat new file mode 100644 index 0000000..a34003e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_release.sh new file mode 100755 index 0000000..012619c --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/board.c b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/board.h b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/clock_config.c b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/spi/transfer_interrupt/slave/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_USART USART0 +#define EXAMPLE_USART_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_USART_CLK_FREQ CLOCK_GetFreq(EXAMPLE_USART_CLK_SRC) + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +uint8_t txbuff[] = + "Usart polling example.\r\nBoard will send back received characters.\r\nNow, please input any character:\r\n"; + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief Main function + */ +int main(void) +{ + uint8_t ch; + usart_config_t config; + + /* Initialize the pins. */ + BOARD_InitBootPins(); + /* Enable clock to 30MHz. */ + BOARD_BootClockFRO30M(); + /* Select the main clock as source clock of USART0. */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + /* Default config by using USART_GetDefaultConfig(): + * config->baudRate_Bps = 9600U; + * config->parityMode = kUSART_ParityDisabled; + * config->stopBitCount = kUSART_OneStopBit; + * config->bitCountPerChar = kUSART_8BitsPerChar; + * config->loopback = false; + * config->enableRx = false; + * config->enableTx = false; + * config->syncMode = kUSART_SyncModeDisabled; + */ + USART_GetDefaultConfig(&config); + config.enableRx = true; + config.enableTx = true; + config.baudRate_Bps = BOARD_DEBUG_USART_BAUDRATE; + + /* Initialize the USART with configuration. */ + USART_Init(EXAMPLE_USART, &config, EXAMPLE_USART_CLK_FREQ); + + /* Send data in polling way. */ + USART_WriteBlocking(EXAMPLE_USART, txbuff, sizeof(txbuff) - 1); + + while (1) + { + /* Receive a character from USART, this API will wait until one character has been received. */ + USART_ReadBlocking(EXAMPLE_USART, &ch, 1); + /* Send the received character to the terminal. */ + USART_WriteBlocking(EXAMPLE_USART, &ch, 1); + } +} diff --git a/boards/lpcxpresso845max/driver_examples/usart/polling/usart_polling_example_v3_9.xml b/boards/lpcxpresso845max/driver_examples/usart/polling/usart_polling_example_v3_9.xml new file mode 100644 index 0000000..1ef2cab --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/polling/usart_polling_example_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/CMakeLists.txt new file mode 100644 index 0000000..1b5d33b --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/CMakeLists.txt @@ -0,0 +1,110 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(usart_terminal) + +set(MCUX_SDK_PROJECT_NAME usart_terminal.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../usart_terminal.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/board.c b/boards/lpcxpresso845max/driver_examples/usart/terminal/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/board.h b/boards/lpcxpresso845max/driver_examples/usart/terminal/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/usart/terminal/clock_config.c b/boards/lpcxpresso845max/driver_examples/usart/terminal/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/terminal/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_USART USART0 +#define EXAMPLE_USART_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_USART_CLK_FREQ CLOCK_GetFreq(EXAMPLE_USART_CLK_SRC) +#define EXAMPLE_USART_DMA_BASEADDR DMA0 +#define USART_RX_DMA_CHANNEL 0 +#define ECHO_BUFFER_LENGTH 8 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_UserCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds); +static void EXAMPLE_USARTInit(void); +static void EXAMPLE_DMAConfiguration(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +dma_handle_t g_DMA_Handle; /*!< The DMA RX Handles. */ +uint8_t g_data_buffer[16]; + +/******************************************************************************* + * Code + ******************************************************************************/ + +static void EXAMPLE_UserCallback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) +{ + int i; + if (tcds == kDMA_IntB) + { + PRINTF("\n\rCallBack B is triggered!\n\r"); + PRINTF("The received data is: \n\r"); + for (i = 8; i <= 15; i++) + { + PRINTF("%c", g_data_buffer[i]); + } + } + if (tcds == kDMA_IntA) + { + PRINTF("\n\rCallBack A is triggered!\n\r"); + PRINTF("The received data is: \n\r"); + for (i = 0; i <= 7; i++) + { + PRINTF("%c", g_data_buffer[i]); + } + } +} + +/*! @brief Static table of descriptors */ +#if defined(__ICCARM__) +#pragma data_alignment = 16 +dma_descriptor_t g_pingpong_desc[2] = {0}; +#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) +__attribute__((aligned(16))) dma_descriptor_t g_pingpong_desc[2] = {0}; +#elif defined(__GNUC__) +__attribute__((aligned(16))) dma_descriptor_t g_pingpong_desc[2] = {0}; +#endif + +/*! + * @brief Main function + */ +int main(void) +{ + /* Initialize the pins. */ + BOARD_InitBootPins(); + + /* Enable clock to 30MHz. */ + BOARD_BootClockFRO30M(); + + /* Select the main clock as source clock of USART0. */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + /* Intialize the debug console. */ + BOARD_InitDebugConsole(); + + /* Initialize the USART instance. */ + EXAMPLE_USARTInit(); + + /* Configuration the DMA for receive data. */ + EXAMPLE_DMAConfiguration(); + + PRINTF("USART DMA transfer Example.\r\nThe USART will echo the double buffer after each 8 bytes:\r\n"); + + /* Start DMA for transfer. */ + DMA_StartTransfer(&g_DMA_Handle); + + while (1) + { + __WFI(); + } +} + +static void EXAMPLE_USARTInit(void) +{ + usart_config_t config; + + /* Default config by using USART_GetDefaultConfig(): + * config.baudRate_Bps = 9600U; + * config.parityMode = kUSART_ParityDisabled; + * config.stopBitCount = kUSART_OneStopBit; + * config.bitCountPerChar = kUSART_8BitsPerChar; + * config.loopback = false; + * config.enableRx = false; + * config.enableTx = false; + * config.syncMode = kUSART_SyncModeDisabled; + */ + USART_GetDefaultConfig(&config); + config.baudRate_Bps = BOARD_DEBUG_USART_BAUDRATE; + config.enableTx = true; + config.enableRx = true; + + USART_Init(EXAMPLE_USART, &config, EXAMPLE_USART_CLK_FREQ); +} + +static void EXAMPLE_DMAConfiguration(void) +{ + dma_transfer_config_t transferConfig; + + /* Configure DMA. */ + DMA_Init(EXAMPLE_USART_DMA_BASEADDR); + + DMA_EnableChannel(EXAMPLE_USART_DMA_BASEADDR, USART_RX_DMA_CHANNEL); + DMA_CreateHandle(&g_DMA_Handle, EXAMPLE_USART_DMA_BASEADDR, USART_RX_DMA_CHANNEL); + DMA_SetCallback(&g_DMA_Handle, EXAMPLE_UserCallback, NULL); + + DMA_PrepareTransfer(&transferConfig, (void *)&EXAMPLE_USART->RXDAT, g_data_buffer, 1, 8, kDMA_PeripheralToMemory, + &g_pingpong_desc[1]); + DMA_SubmitTransfer(&g_DMA_Handle, &transferConfig); + + transferConfig.xfercfg.intA = false; + transferConfig.xfercfg.intB = true; + DMA_CreateDescriptor(&g_pingpong_desc[1], &transferConfig.xfercfg, (void *)&EXAMPLE_USART->RXDAT, &g_data_buffer[8], + &g_pingpong_desc[0]); + + transferConfig.xfercfg.intA = true; + transferConfig.xfercfg.intB = false; + DMA_CreateDescriptor(&g_pingpong_desc[0], &transferConfig.xfercfg, (void *)&EXAMPLE_USART->RXDAT, &g_data_buffer[0], + &g_pingpong_desc[1]); +} diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_dma/usart_transfer_dma_v3_9.xml b/boards/lpcxpresso845max/driver_examples/usart/transfer_dma/usart_transfer_dma_v3_9.xml new file mode 100644 index 0000000..b661256 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_dma/usart_transfer_dma_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/CMakeLists.txt new file mode 100644 index 0000000..4f114e6 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/CMakeLists.txt @@ -0,0 +1,110 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(usart_transfer_hardware_flow_control) + +set(MCUX_SDK_PROJECT_NAME usart_transfer_hardware_flow_control.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../usart_transfer_hardware_flow_control.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(driver_lpc_miniusart_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(utility_assert_lite_LPC845) + +include(utility_debug_console_lite_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/board.c b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/board.h b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/clock_config.c b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_hardware_flow_control/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_USART USART0 +#define EXAMPLE_USART_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_USART_CLK_FREQ CLOCK_GetFreq(EXAMPLE_USART_CLK_SRC) + +#define ECHO_BUFFER_LENGTH 8 + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_USARTUserCallback(USART_Type *base, usart_handle_t *handle, status_t status, void *userData); +static void EXAMPLE_USARTInit(void); +static void EXAMPLE_USARTPrepareTransfer(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +usart_handle_t g_usartHandle; +uint8_t g_tipString[] = + "Usart interrupt transfer example.\r\nBoard receives 8 characters then sends them out.\r\nNow please input:\r\n"; + +uint8_t g_txBuffer[ECHO_BUFFER_LENGTH] = {0}; +uint8_t g_rxBuffer[ECHO_BUFFER_LENGTH] = {0}; +volatile bool rxBufferEmpty = true; +volatile bool txBufferFull = false; +volatile bool txOnGoing = false; +volatile bool rxOnGoing = false; + +usart_transfer_t xfer; +usart_transfer_t sendXfer; +usart_transfer_t receiveXfer; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* USART user callback */ +static void EXAMPLE_USARTUserCallback(USART_Type *base, usart_handle_t *handle, status_t status, void *userData) +{ + userData = userData; + + if (kStatus_USART_TxIdle == status) + { + txBufferFull = false; + txOnGoing = false; + } + + if (kStatus_USART_RxIdle == status) + { + rxBufferEmpty = false; + rxOnGoing = false; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + /* Initialize the pins. */ + BOARD_InitBootPins(); + + /* Enable clock to 30MHz. */ + BOARD_BootClockFRO30M(); + + /* Select the main clock as source clock of USART0. */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + /* Initialize USART with configuration. */ + EXAMPLE_USARTInit(); + + /* Prepare for nonblocking transfer. */ + EXAMPLE_USARTPrepareTransfer(); + + /* Set flag for waiting the transfer complete. */ + txOnGoing = true; + + /* Send g_tipString out. */ + USART_TransferSendNonBlocking(EXAMPLE_USART, &g_usartHandle, &xfer); + + /* Waiting for data sending complete. */ + while (txOnGoing) + { + } + + while (1) + { + /* If RX is idle and g_rxBuffer is empty, start to read data to g_rxBuffer. */ + if ((!rxOnGoing) && rxBufferEmpty) + { + rxOnGoing = true; + USART_TransferReceiveNonBlocking(EXAMPLE_USART, &g_usartHandle, &receiveXfer, NULL); + } + + /* If TX is idle and g_txBuffer is full, start to send data. */ + if ((!txOnGoing) && txBufferFull) + { + txOnGoing = true; + USART_TransferSendNonBlocking(EXAMPLE_USART, &g_usartHandle, &sendXfer); + } + + /* If g_txBuffer is empty and g_rxBuffer is full, copy g_rxBuffer to g_txBuffer. */ + if ((!rxBufferEmpty) && (!txBufferFull)) + { + memcpy(g_txBuffer, g_rxBuffer, ECHO_BUFFER_LENGTH); + rxBufferEmpty = true; + txBufferFull = true; + } + } +} + +static void EXAMPLE_USARTInit(void) +{ + usart_config_t config; + + /* Default config by using USART_GetDefaultConfig(): + * config.baudRate_Bps = 9600U; + * config.parityMode = kUSART_ParityDisabled; + * config.stopBitCount = kUSART_OneStopBit; + * config.bitCountPerChar = kUSART_8BitsPerChar; + * config.loopback = false; + * config.enableRx = false; + * config.enableTx = false; + * config.syncMode = kUSART_SyncModeDisabled; + */ + USART_GetDefaultConfig(&config); + config.baudRate_Bps = BOARD_DEBUG_USART_BAUDRATE; + config.enableRx = true; + config.enableTx = true; + + /* Initialize the USART with configuration. */ + USART_Init(EXAMPLE_USART, &config, EXAMPLE_USART_CLK_FREQ); +} + +static void EXAMPLE_USARTPrepareTransfer(void) +{ + /* Create USART handle, this API will initialize the g_usartHandle and install the callback function. */ + USART_TransferCreateHandle(EXAMPLE_USART, &g_usartHandle, EXAMPLE_USARTUserCallback, NULL); + + /* Set the xfer parameter to send tip info to the terminal. */ + xfer.data = g_tipString; + xfer.dataSize = sizeof(g_tipString) - 1; + + /* Set xfer parameters for sending data. */ + sendXfer.data = g_txBuffer; + sendXfer.dataSize = sizeof(g_txBuffer); + + /* Set xfers parameters for receiving data. */ + receiveXfer.data = g_rxBuffer; + receiveXfer.dataSize = sizeof(g_rxBuffer); +} diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_interrupt/usart_transfer_interrupt_v3_9.xml b/boards/lpcxpresso845max/driver_examples/usart/transfer_interrupt/usart_transfer_interrupt_v3_9.xml new file mode 100644 index 0000000..d11bfce --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_interrupt/usart_transfer_interrupt_v3_9.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/CMakeLists.txt new file mode 100644 index 0000000..8154079 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(usart_transfer_rb_dma) + +set(MCUX_SDK_PROJECT_NAME usart_transfer_rb_dma.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../usart_transfer_rb_dma.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_dma_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/board.c b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/board.h b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/clock_config.c b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_rb_dma/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define EXAMPLE_USART USART0 +#define EXAMPLE_USART_CLK_SRC kCLOCK_MainClk +#define EXAMPLE_USART_CLK_FREQ CLOCK_GetFreq(EXAMPLE_USART_CLK_SRC) +#define DELAY_TIME 0xFFFFFU + +#define RX_RING_BUFFER_SIZE 20U +#define ECHO_BUFFER_SIZE 8U + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +static void EXAMPLE_USARTUserCallback(USART_Type *base, usart_handle_t *handle, status_t status, void *userData); +static void EXAMPLE_USARTIinit(void); +static void EXAMPLE_USARTPrepareTransfer(void); + +/******************************************************************************* + * Variables + ******************************************************************************/ +usart_handle_t g_uartHandle; +uint8_t g_tipString[] = "USART RX ring buffer example.\r\nSend back received data.\r\nEcho every 8 bytes.\r\n"; +uint8_t g_rxRingBuffer[RX_RING_BUFFER_SIZE] = {0}; /* RX ring buffer. */ + +uint8_t rxBuffer[ECHO_BUFFER_SIZE] = {0}; /* Buffer for receive data to echo. */ +uint8_t txBuffer[ECHO_BUFFER_SIZE] = {0}; /* Buffer for send data to echo. */ +volatile bool rxBufferEmpty = true; +volatile bool txBufferFull = false; +volatile bool txOnGoing = false; +volatile bool rxOnGoing = false; + +usart_transfer_t xfer; +usart_transfer_t sendXfer; +usart_transfer_t receiveXfer; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* USART user callback */ +void EXAMPLE_USARTUserCallback(USART_Type *base, usart_handle_t *handle, status_t status, void *userData) +{ + userData = userData; + + if (kStatus_USART_TxIdle == status) + { + txBufferFull = false; + txOnGoing = false; + } + + if (kStatus_USART_RxIdle == status) + { + rxBufferEmpty = false; + rxOnGoing = false; + } +} + +/*! + * @brief Main function + */ +int main(void) +{ + size_t receivedBytes; + + /* Initialize the hardware. */ + /* Initialize the pins. */ + BOARD_InitBootPins(); + /* Enable clock to 30MHz. */ + BOARD_BootClockFRO30M(); + /* Select the main clock as source clock of USART0. */ + CLOCK_Select(kUART0_Clk_From_MainClk); + + /* Initialize the USART instance. */ + EXAMPLE_USARTIinit(); + + /* Prepare for transactional transmission. */ + EXAMPLE_USARTPrepareTransfer(); + + /* Send tip information. */ + txOnGoing = true; + USART_TransferSendNonBlocking(EXAMPLE_USART, &g_uartHandle, &xfer); + + /* Wait transmit finished. */ + while (txOnGoing) + { + } + + while (1) + { + /* If txBuffer is empty and rxBuffer is full, copy rxBuffer to txBuffer. */ + if ((!rxBufferEmpty) && (!txBufferFull)) + { + memcpy(txBuffer, rxBuffer, ECHO_BUFFER_SIZE); + rxBufferEmpty = true; + txBufferFull = true; + } + + /* If RX is idle and rxBuffer is empty, start to read data to rxBuffer. */ + if ((!rxOnGoing) && rxBufferEmpty) + { + rxOnGoing = true; + USART_TransferReceiveNonBlocking(EXAMPLE_USART, &g_uartHandle, &receiveXfer, &receivedBytes); + + /* The receivedBytes is the current data size when API return, If this value equals to ECHO_BUFFER_SIZE, + * it means all data were received from ring buffer. + */ + if (ECHO_BUFFER_SIZE == receivedBytes) + { + rxBufferEmpty = false; + rxOnGoing = false; + } + } + + /* If TX is idle and txBuffer is full, start to send data. */ + if ((!txOnGoing) && txBufferFull) + { + txOnGoing = true; + USART_TransferSendNonBlocking(EXAMPLE_USART, &g_uartHandle, &sendXfer); + } + } +} + +static void EXAMPLE_USARTIinit(void) +{ + usart_config_t config; + + /* Default config by using USART_GetDefaultConfig(): + * config->baudRate_Bps = 9600U; + * config->parityMode = kUSART_ParityDisabled; + * config->stopBitCount = kUSART_OneStopBit; + * config->bitCountPerChar = kUSART_8BitsPerChar; + * config->loopback = false; + * config->enableRx = false; + * config->enableTx = false; + * config->syncMode = kUSART_SyncModeDisabled; + */ + USART_GetDefaultConfig(&config); + config.baudRate_Bps = BOARD_DEBUG_USART_BAUDRATE; + config.enableRx = true; + config.enableTx = true; + + /* Initilize the USART with configuration. */ + USART_Init(EXAMPLE_USART, &config, EXAMPLE_USART_CLK_FREQ); +} +static void EXAMPLE_USARTPrepareTransfer(void) +{ + /* Create USART handle and install callback function. */ + USART_TransferCreateHandle(EXAMPLE_USART, &g_uartHandle, EXAMPLE_USARTUserCallback, NULL); + /* Start ring buffer. */ + USART_TransferStartRingBuffer(EXAMPLE_USART, &g_uartHandle, g_rxRingBuffer, RX_RING_BUFFER_SIZE); + + /* Prepare transfer for sending tip string. */ + xfer.data = g_tipString; + xfer.dataSize = sizeof(g_tipString) - 1; + + /* Prepare transfer for sending the received characters. */ + sendXfer.data = txBuffer; + sendXfer.dataSize = ECHO_BUFFER_SIZE; + + /* Prepare transfer for receiving characters. */ + receiveXfer.data = rxBuffer; + receiveXfer.dataSize = ECHO_BUFFER_SIZE; +} diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_ring_buffer/usart_transfer_ring_buffer_v3_9.xml b/boards/lpcxpresso845max/driver_examples/usart/transfer_ring_buffer/usart_transfer_ring_buffer_v3_9.xml new file mode 100644 index 0000000..b5455ab --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_ring_buffer/usart_transfer_ring_buffer_v3_9.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/CMakeLists.txt new file mode 100644 index 0000000..7b94699 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/CMakeLists.txt @@ -0,0 +1,110 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(usart_transfer_sync_mode) + +set(MCUX_SDK_PROJECT_NAME usart_transfer_sync_mode.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../usart_transfer_sync_mode.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../../components/uart + ${ProjDirPath}/../../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_all.bat new file mode 100644 index 0000000..1205ab0 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_all.sh new file mode 100755 index 0000000..8cc56b7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_debug.bat new file mode 100644 index 0000000..98e3af7 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_debug.sh new file mode 100755 index 0000000..bc7d6e8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_release.bat new file mode 100644 index 0000000..1f9b968 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_release.sh new file mode 100755 index 0000000..d89c1a3 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/board.c b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/board.h b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/clock_config.c b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/usart/transfer_sync_mode/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*!clockSource = kWKT_DividedFROClockSource */ + WKT_GetDefaultConfig(&wktConfig); + + /* Init wkt module */ + WKT_Init(WKT, &wktConfig); + + /* Clear Pending Interrupt */ + NVIC_ClearPendingIRQ(WKT_IRQn); + /* Enable at the NVIC */ + EnableIRQ(WKT_IRQn); + + while (1) + { + /* Set counter value to start the timer counting. Timer counts down to 0, stops and + * generates an interrupt. When a new count value is loaded, Timer starts again. + */ + WKT_StartTimer(WKT, USEC_TO_COUNT(250000U, wkt_clock)); + while (wktIsrFlag != true) + { + } + PRINTF("\r\n Self-wake-up timer interrupt is occurred !"); + APP_LED_TOGGLE; + wktIsrFlag = false; + } +} diff --git a/boards/lpcxpresso845max/driver_examples/wkt/wkt_example_v3_9.xml b/boards/lpcxpresso845max/driver_examples/wkt/wkt_example_v3_9.xml new file mode 100644 index 0000000..444bbf8 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wkt/wkt_example_v3_9.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/CMakeLists.txt new file mode 100644 index 0000000..788fc6e --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/CMakeLists.txt @@ -0,0 +1,112 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(wwdt_example) + +set(MCUX_SDK_PROJECT_NAME wwdt_example.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../wwdt.c" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_wwdt_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(driver_clock_LPC845) + +include(driver_power_no_lib_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_all.bat b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_all.sh b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_debug.bat b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_debug.sh b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_release.bat b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_release.sh b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/clean.bat b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/clean.sh b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/flags.cmake b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/flags.cmake new file mode 100755 index 0000000..bb70a23 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/armgcc/flags.cmake @@ -0,0 +1,170 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/board.c b/boards/lpcxpresso845max/driver_examples/wwdt/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/board.h b/boards/lpcxpresso845max/driver_examples/wwdt/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/driver_examples/wwdt/clock_config.c b/boards/lpcxpresso845max/driver_examples/wwdt/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/driver_examples/wwdt/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_any/freemaster_cfg.h b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/freemaster_cfg.h new file mode 100644 index 0000000..8666d89 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/freemaster_cfg.h @@ -0,0 +1,78 @@ +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* + * Copyright 2020 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - User Configuration File + */ + +#ifndef __FREEMASTER_CFG_H +#define __FREEMASTER_CFG_H + +//////////////////////////////////////////////////////////////////////////////// +// Definitions +//////////////////////////////////////////////////////////////////////////////// + +#define FMSTR_GENERATED_CONFIGURATION 1 // Generated FreeMASTER configuration + +#define FMSTR_PLATFORM_CORTEX_M 1 /* Used platform (see freemaster.h for list of all supported platforms) */ + +//! Enable/Disable FreeMASTER support as a whole +#define FMSTR_DISABLE 0 // To disable all FreeMASTER functionalities + +//! Select interrupt or poll-driven serial communication +#define FMSTR_LONG_INTR 0 // Complete message processing in interrupt +#define FMSTR_SHORT_INTR 0 // Queuing done in interrupt +#define FMSTR_POLL_DRIVEN 1 // No interrupt needed, polling only + +//! Select communication interface +#define FMSTR_TRANSPORT FMSTR_SERIAL // Select FMSTR_SERIAL, FMSTR_CAN or FMSTR_PDBDM transport interface +#define FMSTR_SERIAL_DRV \ + FMSTR_SERIAL_MCUX_MINIUSART // When using FMSTR_SERIAL: select Serial low-level communication driver + +//! Define communication interface base address or leave undefined for runtime setting +#define FMSTR_SERIAL_BASE USART0 + +//! Input/output communication buffer size +#define FMSTR_COMM_BUFFER_SIZE 0 // Set to 0 for "automatic" + +//! Receive FIFO queue size (use with FMSTR_SHORT_INTR only) +#define FMSTR_COMM_RQUEUE_SIZE 0 // Set to 0 for "default" + +//! Oscilloscope support +#define FMSTR_USE_SCOPE 2 // Specify number of supported oscilloscopes +#define FMSTR_MAX_SCOPE_VARS 8 // Specify maximum number of scope variables per one oscilloscope + +//! Recorder support +#define FMSTR_USE_RECORDER 2 // Specify number of supported recorders +#define FMSTR_REC_FLOAT_TRIG 0 // Enable/disable floating point triggering + +// Target-side address translation (TSA) +#define FMSTR_USE_TSA 1 // Enable TSA functionality +#define FMSTR_USE_TSA_INROM 1 // TSA tables declared as const (put to ROM) +#define FMSTR_USE_TSA_SAFETY 1 // Enable/Disable TSA memory protection +#define FMSTR_USE_TSA_DYNAMIC 0 // Enable/Disable TSA entries to be added also in runtime + +// Pipes as data streaming over FreeMASTER protocol +#define FMSTR_USE_PIPES 3 // Specify number of supported pipe objects + +// Enable/Disable read/write memory commands +#define FMSTR_USE_READMEM 1 // Enable read memory commands +#define FMSTR_USE_WRITEMEM 1 // Enable write memory commands +#define FMSTR_USE_WRITEMEMMASK 1 // Enable write memory bits commands + +//! Support for Application Commands +#define FMSTR_USE_APPCMD 1 // Enable/disable App.Commands support +#define FMSTR_APPCMD_BUFF_SIZE 32 // App.Command data buffer size +#define FMSTR_MAX_APPCMD_CALLS 4 // How many app.cmd callbacks? (0=disable) + +#endif /* __FREEMASTER_CFG_H */ + +//////////////////////////////////////////////////////////////////////////////// +// EOF +//////////////////////////////////////////////////////////////////////////////// diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_any/freemaster_democfg.h b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/freemaster_democfg.h new file mode 100644 index 0000000..375105d --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/freemaster_democfg.h @@ -0,0 +1,21 @@ +/* + * Copyright 2020 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Example Application - Demo code configuration file + */ + +#ifndef __FREEMASTER_DEMO_H +#define __FREEMASTER_DEMO_H + +/* These options are used in freemaster_example.c to configure features of FreeMASTER example application */ + +#define FMSTR_DEMO_ENOUGH_ROM 1 /* Platform has enough ROM to show most of the FreeMASTER features */ +#define FMSTR_DEMO_LARGE_ROM \ + 0 /* Platform has large ROM enough to store the extended data structures used in FreeMASTER demo */ +#define FMSTR_DEMO_SUPPORT_I64 1 /* Support for long long type */ +#define FMSTR_DEMO_SUPPORT_FLT 1 /* Support for float type */ +#define FMSTR_DEMO_SUPPORT_DBL 1 /* Support for double type */ + +#endif /* __FREEMASTER_DEMO_H */ diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_any/main.c b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/main.c new file mode 100644 index 0000000..f8476ed --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/main.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - Example Application to be used + * with MCUXpresso Peripheral Configuration tool. Open the MCUXpresso + * ConfigTools, select Peripheral tool and configure FreeMASTER features + * and communication options. Serial communication is selected by default. + */ + +//////////////////////////////////////////////////////////////////////////////// +// Includes +//////////////////////////////////////////////////////////////////////////////// + +#include "pin_mux.h" +#include "peripherals.h" +#include "clock_config.h" +#include "board.h" + +#include "freemaster.h" +#include "freemaster_example.h" + +//////////////////////////////////////////////////////////////////////////////// +// Variables +//////////////////////////////////////////////////////////////////////////////// + +//! Note: All global variables accessed by FreeMASTER are defined in a shared +//! freemaster_example.c file + +//////////////////////////////////////////////////////////////////////////////// +// Code +//////////////////////////////////////////////////////////////////////////////// + +int main(void) +{ + /* Board initialization */ + BOARD_InitBootPins(); + BOARD_InitBootClocks(); + BOARD_InitBootPeripherals(); + + /* This example uses shared code from FreeMASTER generic example application */ + FMSTR_Example_Init(); + + while (1) + { + /* FreeMASTER example increments several variables periodically, + use the FreeMASTER PC Host tool to visualize the variables */ + FMSTR_Example_Poll(); + } +} diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_any/peripherals.c b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/peripherals.c new file mode 100644 index 0000000..2bf43e8 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/peripherals.c @@ -0,0 +1,249 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Peripherals v8.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 0.0.2 +board: LPCXpresso845 +functionalGroups: +- name: BOARD_InitPeripherals + UUID: 026146e6-aeff-4519-93f3-9970066e5cac + called_from_default_init: true + selectedCore: core0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +component: +- type: 'system' +- type_id: 'system_54b53072540eeeb8f8e9343e71f28176' +- global_system_definitions: + - user_definitions: '' + - user_includes: '' + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* clang-format on */ + +/*********************************************************************************************************************** + * Included files + **********************************************************************************************************************/ +#include "peripherals.h" + +/*********************************************************************************************************************** + * BOARD_InitPeripherals functional group + **********************************************************************************************************************/ +/*********************************************************************************************************************** + * FreeMASTER initialization code + **********************************************************************************************************************/ +/* clang-format off */ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +instance: +- name: 'FreeMASTER' +- type: 'freemaster' +- mode: 'general' +- custom_name_enabled: 'false' +- type_id: 'freemaster_14894d49d87e02d0dca5f799e22554da' +- functional_group: 'BOARD_InitPeripherals' +- config_sets: + - freemaster_config: + - FMSTR_DISABLE: 'false' + - initFreemaster: 'true' + - generalConfig: + - commInterface: 'serial' + - interruptMode: 'polling' + - initType: 'false' + - serialConfig: + - peripheralUART: 'USART0' + - clockSource: 'genericUartClockSource' + - clockSourceFreq: 'BOARD_BootClockFRO18M' + - baudRate_Bps: '115200' + - parityMode_usart: 'kUSART_ParityDisabled' + - stopBitCount_usart: 'kUSART_OneStopBit' + - bitCountPerChar: 'kUSART_8BitsPerChar' + - enable_rx_tx_irq: 'true' + - interrupt_rx_tx: + - IRQn: 'USART0_IRQn' + - enable_interrrupt: 'enabled' + - enable_priority: 'false' + - priority: '0' + - useDefaultISR: 'true' + - FMSTR_COMM_BUFFER_SIZE: 'autoSize' + - FMSTR_COMM_RQUEUE_SIZE: '32' + - FMSTR_USE_SCOPE: '2' + - FMSTR_MAX_SCOPE_VARS: '8' + - FMSTR_REC_FLOAT_TRIG: 'false' + - recorders: + - 0: + - recID: + - enableCustomID: 'false' + - nameRec: 'Default Recorder' + - recBuff: + - customBuffer: 'false' + - bufferSize: '1024' + - basePeriod_ns: '0' + - recInit: 'true' + - 1: + - recID: + - enableCustomID: 'false' + - nameRec: 'Alternate Recorder for test purposes' + - recBuff: + - customBuffer: 'false' + - bufferSize: '512' + - basePeriod_ns: '0' + - recInit: 'true' + - FMSTR_USE_TSA: 'true' + - FMSTR_USE_TSA_INROM: 'true' + - FMSTR_USE_TSA_SAFETY: 'true' + - FMSTR_USE_TSA_DYNAMIC: 'false' + - pipes: + - 0: + - pipeID: + - enableCustomID: 'false' + - namePipe: 'Simple echoing terminal pipe 1' + - pipePort: '1' + - enablePipeHandler: 'true' + - callbackFunction: 'my_pipe_handler' + - rxBuffer: + - customBuffer: 'false' + - bufferSize: '10' + - txBuffer: + - customBuffer: 'false' + - bufferSize: '128' + - pipeInit: 'true' + - 1: + - pipeID: + - enableCustomID: 'false' + - namePipe: 'Simple echoing terminal pipe 2' + - pipePort: '2' + - enablePipeHandler: 'true' + - callbackFunction: 'my_pipe_handler' + - rxBuffer: + - customBuffer: 'false' + - bufferSize: '10' + - txBuffer: + - customBuffer: 'false' + - bufferSize: '128' + - pipeInit: 'true' + - 2: + - pipeID: + - enableCustomID: 'false' + - namePipe: 'Binary multiplication pipe at port 33' + - pipePort: '33' + - enablePipeHandler: 'true' + - callbackFunction: 'my_pipe_math' + - rxBuffer: + - customBuffer: 'false' + - bufferSize: '8' + - txBuffer: + - customBuffer: 'false' + - bufferSize: '4' + - pipeInit: 'true' + - FMSTR_USE_READMEM: 'true' + - FMSTR_USE_WRITEMEM: 'true' + - FMSTR_USE_WRITEMEMMASK: 'true' + - passR: '' + - passRW: '' + - passRWF: '' + - FMSTR_USE_HASHED_PASSWORDS: 'false' + - FMSTR_USE_APPCMD: 'true' + - FMSTR_APPCMD_BUFF_SIZE: '32' + - FMSTR_MAX_APPCMD_CALLS: '4' + - freemaster_codegenerator: [] + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ +/* clang-format on */ +/* USART configuration structure */ +usart_config_t FreeMASTER_serial_config; +/* Recorder0 configuration */ +FMSTR_U8 FreeMASTER_RecBuffer0[FREEMASTER_REC_0_SIZE]; +/* Recorder1 configuration */ +FMSTR_U8 FreeMASTER_RecBuffer1[FREEMASTER_REC_1_SIZE]; +/* Pipe0 handle */ +FMSTR_HPIPE FreeMASTER_Pipe_handle_1; +/* Pipe0 Rx buffer */ +FMSTR_U8 FreeMASTER_RxPipe1[FREEMASTER_RX_PIPE_1_SIZE]; +/* Pipe0 Tx buffer */ +FMSTR_U8 FreeMASTER_TxPipe1[FREEMASTER_TX_PIPE_1_SIZE]; +/* Pipe1 handle */ +FMSTR_HPIPE FreeMASTER_Pipe_handle_2; +/* Pipe1 Rx buffer */ +FMSTR_U8 FreeMASTER_RxPipe2[FREEMASTER_RX_PIPE_2_SIZE]; +/* Pipe1 Tx buffer */ +FMSTR_U8 FreeMASTER_TxPipe2[FREEMASTER_TX_PIPE_2_SIZE]; +/* Pipe2 handle */ +FMSTR_HPIPE FreeMASTER_Pipe_handle_3; +/* Pipe2 Rx buffer */ +FMSTR_U8 FreeMASTER_RxPipe3[FREEMASTER_RX_PIPE_3_SIZE]; +/* Pipe2 Tx buffer */ +FMSTR_U8 FreeMASTER_TxPipe3[FREEMASTER_TX_PIPE_3_SIZE]; + +FMSTR_REC_BUFF FreeMASTER_Recorder_0 = { + .name = "Default Recorder", + .addr = (FMSTR_ADDR)FreeMASTER_RecBuffer0, + .size = FREEMASTER_REC_0_SIZE, + .basePeriod_ns = 0UL +}; +FMSTR_REC_BUFF FreeMASTER_Recorder_1 = { + .name = "Alternate Recorder for test purposes", + .addr = (FMSTR_ADDR)FreeMASTER_RecBuffer1, + .size = FREEMASTER_REC_1_SIZE, + .basePeriod_ns = 0UL +}; + +static void FreeMASTER_init(void) { + /* Serial communication peripheral initialization */ + + /* Get USART default configuration and modify it */ + USART_GetDefaultConfig(&FreeMASTER_serial_config); + + FreeMASTER_serial_config.baudRate_Bps = FREEMASTER_SERIAL_PERIPHERAL_BAUDRATE; + FreeMASTER_serial_config.parityMode = kUSART_ParityDisabled; + FreeMASTER_serial_config.stopBitCount = kUSART_OneStopBit; + FreeMASTER_serial_config.bitCountPerChar = kUSART_8BitsPerChar; + + /* Initialize USART module. */ + USART_Init(FREEMASTER_SERIAL_PERIPHERAL, &FreeMASTER_serial_config, FREEMASTER_SERIAL_PERIPHERAL_CLK_FREQ); + /* FreeMASTER middleware initialization */ + FMSTR_Init(); + /* FreeMASTER recorder 0 configuration initialization */ + FMSTR_RecorderCreate(0, &FreeMASTER_Recorder_0); + /* FreeMASTER recorder 1 configuration initialization */ + FMSTR_RecorderCreate(1, &FreeMASTER_Recorder_1); + /* FreeMASTER pipe 1 initialization */ + FreeMASTER_Pipe_handle_1 = FMSTR_PipeOpen(1, &my_pipe_handler, (FMSTR_ADDR)FreeMASTER_RxPipe1, FREEMASTER_RX_PIPE_1_SIZE, + (FMSTR_ADDR)FreeMASTER_TxPipe1, FREEMASTER_TX_PIPE_1_SIZE, 0, "Simple echoing terminal pipe 1"); + /* FreeMASTER pipe 2 initialization */ + FreeMASTER_Pipe_handle_2 = FMSTR_PipeOpen(2, &my_pipe_handler, (FMSTR_ADDR)FreeMASTER_RxPipe2, FREEMASTER_RX_PIPE_2_SIZE, + (FMSTR_ADDR)FreeMASTER_TxPipe2, FREEMASTER_TX_PIPE_2_SIZE, 0, "Simple echoing terminal pipe 2"); + /* FreeMASTER pipe 3 initialization */ + FreeMASTER_Pipe_handle_3 = FMSTR_PipeOpen(33, &my_pipe_math, (FMSTR_ADDR)FreeMASTER_RxPipe3, FREEMASTER_RX_PIPE_3_SIZE, + (FMSTR_ADDR)FreeMASTER_TxPipe3, FREEMASTER_TX_PIPE_3_SIZE, 0, "Binary multiplication pipe at port 33"); +} + +/*********************************************************************************************************************** + * Initialization functions + **********************************************************************************************************************/ +void BOARD_InitPeripherals(void) +{ + /* Initialize components */ + FreeMASTER_init(); +} + +/*********************************************************************************************************************** + * BOARD_InitBootPeripherals function + **********************************************************************************************************************/ +void BOARD_InitBootPeripherals(void) +{ + BOARD_InitPeripherals(); +} diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_any/peripherals.h b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/peripherals.h new file mode 100644 index 0000000..248e804 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/peripherals.h @@ -0,0 +1,113 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PERIPHERALS_H_ +#define _PERIPHERALS_H_ + +/*********************************************************************************************************************** + * Included files + **********************************************************************************************************************/ +#include "fsl_common.h" +#include "fsl_usart.h" +#include "fsl_clock.h" +#include "freemaster.h" +#include "freemaster_serial_miniusart.h" + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/*********************************************************************************************************************** + * Definitions + **********************************************************************************************************************/ +/* Definitions for BOARD_InitPeripherals functional group */ +/* FreeMASTER_Recorder_0's buffer size definition */ +#define FREEMASTER_REC_0_SIZE 1024 +/* FreeMASTER_Recorder_1's buffer size definition */ +#define FREEMASTER_REC_1_SIZE 512 +/* Pipe1's Rx buffer size definition */ +#define FREEMASTER_RX_PIPE_1_SIZE 10 +/* Pipe1's Tx buffer size definition */ +#define FREEMASTER_TX_PIPE_1_SIZE 128 +/* Pipe2's Rx buffer size definition */ +#define FREEMASTER_RX_PIPE_2_SIZE 10 +/* Pipe2's Tx buffer size definition */ +#define FREEMASTER_TX_PIPE_2_SIZE 128 +/* Pipe3's Rx buffer size definition */ +#define FREEMASTER_RX_PIPE_3_SIZE 8 +/* Pipe3's Tx buffer size definition */ +#define FREEMASTER_TX_PIPE_3_SIZE 4 +/* Definition of peripheral ID */ +#define FREEMASTER_SERIAL_PERIPHERAL ((USART_Type *)USART0) +/* Definition of the clock source frequency */ +#define FREEMASTER_SERIAL_PERIPHERAL_CLK_FREQ 18000000UL +/* Definition of the Baud rate */ +#define FREEMASTER_SERIAL_PERIPHERAL_BAUDRATE 115200UL + +/*********************************************************************************************************************** + * Global variables + **********************************************************************************************************************/ +/* USART configuration structure */ +extern usart_config_t FreeMASTER_serial_config; +/* Recorder0 configuration */ +extern FMSTR_U8 FreeMASTER_RecBuffer0[FREEMASTER_REC_0_SIZE]; +/* Recorder1 configuration */ +extern FMSTR_U8 FreeMASTER_RecBuffer1[FREEMASTER_REC_1_SIZE]; + +/* Pipe1 handle */ +extern FMSTR_HPIPE FreeMASTER_Pipe_handle_1; +/* Pipe1 Rx buffer */ +extern FMSTR_U8 FreeMASTER_RxPipe1[FREEMASTER_RX_PIPE_1_SIZE]; +/* Pipe1 Tx buffer */ +extern FMSTR_U8 FreeMASTER_TxPipe1[FREEMASTER_TX_PIPE_1_SIZE]; + +/* Pipe2 handle */ +extern FMSTR_HPIPE FreeMASTER_Pipe_handle_2; +/* Pipe2 Rx buffer */ +extern FMSTR_U8 FreeMASTER_RxPipe2[FREEMASTER_RX_PIPE_2_SIZE]; +/* Pipe2 Tx buffer */ +extern FMSTR_U8 FreeMASTER_TxPipe2[FREEMASTER_TX_PIPE_2_SIZE]; + +/* Pipe3 handle */ +extern FMSTR_HPIPE FreeMASTER_Pipe_handle_3; +/* Pipe3 Rx buffer */ +extern FMSTR_U8 FreeMASTER_RxPipe3[FREEMASTER_RX_PIPE_3_SIZE]; +/* Pipe3 Tx buffer */ +extern FMSTR_U8 FreeMASTER_TxPipe3[FREEMASTER_TX_PIPE_3_SIZE]; + + +/*********************************************************************************************************************** + * Callback functions + **********************************************************************************************************************/ +/* Pipe 1 handler callback function*/ +extern void my_pipe_handler(FMSTR_HPIPE); +/* Pipe 2 handler callback function*/ +extern void my_pipe_handler(FMSTR_HPIPE); +/* Pipe 3 handler callback function*/ +extern void my_pipe_math(FMSTR_HPIPE); + +/*********************************************************************************************************************** + * Initialization functions + **********************************************************************************************************************/ + +void BOARD_InitPeripherals(void); + +/*********************************************************************************************************************** + * BOARD_InitBootPeripherals function + **********************************************************************************************************************/ +void BOARD_InitBootPeripherals(void); + +#if defined(__cplusplus) +} +#endif + +#endif /* _PERIPHERALS_H_ */ diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_any/pin_mux.c b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/pin_mux.c new file mode 100644 index 0000000..12fb4bc --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/pin_mux.c @@ -0,0 +1,112 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v8.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 0.0.2 +board: LPCXpresso845 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', prefix: BOARD_, coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t DEBUG_UART_RX = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, DEBUG_UART_RX); + + const uint32_t DEBUG_UART_TX = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, DEBUG_UART_TX); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_any/pin_mux.h b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/pin_mux.h new file mode 100644 index 0000000..f127025 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/pin_mux.h @@ -0,0 +1,73 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! @name PIO1_17 (number 37), P3[13]/P6[1]/U4[31]/TARGET_TX_DEBUG_P1_17 + @{ */ +#define BOARD_DEBUG_UART_TX_PORT 1U /*!<@brief PORT device index: 1 */ +#define BOARD_DEBUG_UART_TX_PIN 17U /*!<@brief PORT pin number */ +#define BOARD_DEBUG_UART_TX_PIN_MASK (1U << 17U) /*!<@brief PORT pin mask */ + /* @} */ + +/*! @name PIO1_16 (number 36), P7[1]/U4[32]/TARGET_RX_DEBUG_P1_16 + @{ */ +#define BOARD_DEBUG_UART_RX_PORT 1U /*!<@brief PORT device index: 1 */ +#define BOARD_DEBUG_UART_RX_PIN 16U /*!<@brief PORT pin number */ +#define BOARD_DEBUG_UART_RX_PIN_MASK (1U << 16U) /*!<@brief PORT pin mask */ + /* @} */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_any/readme.txt b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/readme.txt new file mode 100644 index 0000000..2991c68 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_any/readme.txt @@ -0,0 +1,47 @@ +Hardware requirements +===================== +- LPCXpresso845 board +- Personal Computer +- FreeMASTER 3.0 or later installed on PC +- Serial line or USB equipment as needed to connect over selected interface. + +Board settings +============ +By default, the demo is configured for standard serial (UART) communication. It may +be changed to other interface in MCUXpresso ConfigTools. Run the MCUXpresso ConfigTools, +select the Peripherals tool and open the Middleware/FreeMASTER component configuration. +Refer to the list of recommended communication options below and make the selection in +the FreeMASTER configuration page. Note that the other communication interfaces may require +to use different physical connections, such as serial or USB ports. + +Recommended communication options +================================= +- 'SERIAL' at USART0 module connected to virtual serial port of the debugger USB interface. +- 'Packet-driven BDM' using the debugger interface (use flash-based build targets only). + +Prepare the demo +=============== +1. Interconnect the host PC and the target microcontroller board using the selected + interface cable. +2. Compile and download the program to the target microcontroller. +3. Run and resume application execution when debugger stops in the main() function. + +If using the Packet-driven BDM interface +======================================== +4. Terminate the debugger session to release the JTAG interface for FreeMASTER use. +5. Reset the target board to make sure it runs after detaching the debugger. + +Connect with FreeMASTER +======================= +6. Run FreeMASTER, use the Connection Wizard or open Project Options. +7. Configure Serial or other communication as required by this demo setup. +8. Start communication, FreeMASTER loads the initial TSA Active Content links in the Welcome page. +9. Click the "FreeMASTER Demonstration Project (embedded in device)" in the Welcome page. +10. The demo is now running, you should be able to watch variable values and graphs. + +More information +================ +Read more information about FreeMASTER tool at http://www.nxp.com/freemaster. +Feel free to ask questions and report issues at FreeMASTER's +community page at https://community.nxp.com/community/freemaster + diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/CMakeLists.txt b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/CMakeLists.txt new file mode 100644 index 0000000..5b731e1 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/CMakeLists.txt @@ -0,0 +1,125 @@ +# CROSS COMPILER SETTING +SET(CMAKE_SYSTEM_NAME Generic) +CMAKE_MINIMUM_REQUIRED (VERSION 3.10.0) + +# THE VERSION NUMBER +SET (Tutorial_VERSION_MAJOR 1) +SET (Tutorial_VERSION_MINOR 0) + +# ENABLE ASM +ENABLE_LANGUAGE(ASM) + +SET(CMAKE_STATIC_LIBRARY_PREFIX) +SET(CMAKE_STATIC_LIBRARY_SUFFIX) + +SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX) +SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX) + +# CURRENT DIRECTORY +SET(ProjDirPath ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(EXECUTABLE_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${ProjDirPath}/${CMAKE_BUILD_TYPE}) + + +project(fmstr_example_pdbdm) + +set(MCUX_SDK_PROJECT_NAME fmstr_example_pdbdm.elf) + +include(${ProjDirPath}/flags.cmake) + +add_executable(${MCUX_SDK_PROJECT_NAME} +"${ProjDirPath}/../main.c" +"${ProjDirPath}/../clock_config.c" +"${ProjDirPath}/../clock_config.h" +"${ProjDirPath}/../pin_mux.c" +"${ProjDirPath}/../pin_mux.h" +"${ProjDirPath}/../freemaster_cfg.h" +"${ProjDirPath}/../../common/fmstr_example/freemaster_example.c" +"${ProjDirPath}/../../common/fmstr_example/freemaster_example.h" +"${ProjDirPath}/../board.c" +"${ProjDirPath}/../board.h" +"${ProjDirPath}/../../common/fmstr_example/data_example_pmp.h" +"${ProjDirPath}/../../common/fmstr_example/data_img_logo.h" +"${ProjDirPath}/../../common/fmstr_example/data_img_file.h" +"${ProjDirPath}/../../common/fmstr_example/data_img_fmstrlogo.h" +"${ProjDirPath}/../../common/fmstr_example/data_html_index.h" +"${ProjDirPath}/../../common/fmstr_example/example_data.h" +) + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${ProjDirPath}/.. + ${ProjDirPath}/../../common/fmstr_example +) + +set(CMAKE_MODULE_PATH + ${ProjDirPath}/../../../../../middleware/freemaster + ${ProjDirPath}/../../../../../devices/LPC845/utilities/debug_console_lite + ${ProjDirPath}/../../../../../devices/LPC845/drivers + ${ProjDirPath}/../../../../../devices/LPC845 + ${ProjDirPath}/../../../../../components/uart + ${ProjDirPath}/../../../../../CMSIS/Core/Include + ${ProjDirPath}/../../../../../devices/LPC845/utilities +) + +# include modules +include(middleware_fmstr_LPC845) + +include(utility_debug_console_lite_LPC845) + +include(utility_assert_lite_LPC845) + +include(driver_clock_LPC845) + +include(driver_swm_LPC845) + +include(driver_syscon_LPC845) + +include(driver_lpc_gpio_LPC845) + +include(driver_common_LPC845) + +include(device_LPC845_CMSIS_LPC845) + +include(component_miniusart_adapter_LPC845) + +include(device_LPC845_startup_LPC845) + +include(driver_lpc_miniusart_LPC845) + +include(driver_lpc_iocon_lite_LPC845) + +include(driver_inputmux_LPC845) + +include(driver_inputmux_connections_LPC845) + +include(middleware_fmstr_platform_gen32le_LPC845) + +include(driver_power_no_lib_LPC845) + +include(CMSIS_Include_core_cm_LPC845) + +include(driver_reset_LPC845) + +include(utilities_misc_utilities_LPC845) + +include(driver_swm_connections_LPC845) + +include(driver_syscon_connections_LPC845) + +include(device_LPC845_system_LPC845) + + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--start-group) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE m) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE c) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE gcc) + +target_link_libraries(${MCUX_SDK_PROJECT_NAME} PRIVATE nosys) + +TARGET_LINK_LIBRARIES(${MCUX_SDK_PROJECT_NAME} PRIVATE -Wl,--end-group) + + diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/LPC845_flash.ld b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/LPC845_flash.ld new file mode 100644 index 0000000..aa4431f --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/LPC845_flash.ld @@ -0,0 +1,210 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compiler: GNU C Compiler +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.0, 2017-10-17 +** Build: b200408 +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2020 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** ################################################################### +*/ + + + +/* Entry Point */ +ENTRY(Reset_Handler) + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800; + +/* Specify the memory areas */ +MEMORY +{ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000200 + m_crp (RX) : ORIGIN = 0x000002FC, LENGTH = 0x00000004 + m_text (RX) : ORIGIN = 0x00000300, LENGTH = 0x0000FD00 + m_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00003FE0 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } > m_interrupts + + .crp : + { + . = ALIGN(4); + KEEP(*(.crp)) /* Code Read Protection level (CRP) */ + . = ALIGN(4); + } > m_crp + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* define a global symbol at end of code */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization */ + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* create a global symbol at data start */ + *(.ramfunc*) /* for functions in ram */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* define a global symbol at data end */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + text_end = ORIGIN(m_text) + LENGTH(m_text); + ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") + + /* Uninitialized data section */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + . = ALIGN(4); + __START_BSS = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __END_BSS = .; + } > m_data + + .heap : + { + . = ALIGN(8); + __end__ = .; + PROVIDE(end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; /* Add for _sbrk */ + } > m_data + + .stack : + { + . = ALIGN(8); + . += STACK_SIZE; + } > m_data + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data) + LENGTH(m_data); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap") +} + diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_all.bat b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_all.bat new file mode 100644 index 0000000..a16d8ae --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_all.bat @@ -0,0 +1,15 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j + +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j + +IF "%1" == "" ( pause ) diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_all.sh b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_all.sh new file mode 100755 index 0000000..2536930 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j + +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j + diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_debug.bat b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_debug.bat new file mode 100644 index 0000000..1512338 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_debug.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=debug . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_debug.sh b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_debug.sh new file mode 100755 index 0000000..4280376 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_debug.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_release.bat b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_release.bat new file mode 100644 index 0000000..a88e3d6 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_release.bat @@ -0,0 +1,6 @@ +if exist CMakeFiles (RD /s /Q CMakeFiles) +if exist Makefile (DEL /s /Q /F Makefile) +if exist cmake_install.cmake (DEL /s /Q /F cmake_install.cmake) +if exist CMakeCache.txt (DEL /s /Q /F CMakeCache.txt) +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=release . +mingw32-make -j 2> build_log.txt diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_release.sh b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_release.sh new file mode 100755 index 0000000..47cfb05 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/build_release.sh @@ -0,0 +1,7 @@ +#!/bin/sh +if [ -d "CMakeFiles" ];then rm -rf CMakeFiles; fi +if [ -f "Makefile" ];then rm -f Makefile; fi +if [ -f "cmake_install.cmake" ];then rm -f cmake_install.cmake; fi +if [ -f "CMakeCache.txt" ];then rm -f CMakeCache.txt; fi +cmake -DCMAKE_TOOLCHAIN_FILE="../../../../../tools/cmake_toolchain_files/armgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=release . +make -j 2>&1 | tee build_log.txt diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/clean.bat b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/clean.bat new file mode 100644 index 0000000..f391a79 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/clean.bat @@ -0,0 +1,3 @@ +RD /s /Q debug release CMakeFiles +DEL /s /Q /F Makefile cmake_install.cmake CMakeCache.txt +pause diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/clean.sh b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/clean.sh new file mode 100755 index 0000000..795ad87 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/clean.sh @@ -0,0 +1,3 @@ +#!/bin/sh +rm -rf debug release CMakeFiles +rm -rf Makefile cmake_install.cmake CMakeCache.txt diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/flags.cmake b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/flags.cmake new file mode 100755 index 0000000..10bfa14 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/armgcc/flags.cmake @@ -0,0 +1,172 @@ +SET(CMAKE_ASM_FLAGS_DEBUG " \ + ${CMAKE_ASM_FLAGS_DEBUG} \ + -DDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_ASM_FLAGS_RELEASE " \ + ${CMAKE_ASM_FLAGS_RELEASE} \ + -DNDEBUG \ + -D__STARTUP_CLEAR_BSS \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_DEBUG " \ + ${CMAKE_C_FLAGS_DEBUG} \ + -DDEBUG \ + -DSDK_DEBUGCONSOLE=1 \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_C_FLAGS_RELEASE " \ + ${CMAKE_C_FLAGS_RELEASE} \ + -DNDEBUG \ + -DSDK_DEBUGCONSOLE=1 \ + -DCPU_LPC845M301JBD64 \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -std=gnu99 \ +") +SET(CMAKE_CXX_FLAGS_DEBUG " \ + ${CMAKE_CXX_FLAGS_DEBUG} \ + -DDEBUG \ + -DMCUXPRESSO_SDK \ + -g \ + -O0 \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_CXX_FLAGS_RELEASE " \ + ${CMAKE_CXX_FLAGS_RELEASE} \ + -DNDEBUG \ + -DMCUXPRESSO_SDK \ + -Os \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + -mthumb \ + -MMD \ + -MP \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mapcs \ + -fno-rtti \ + -fno-exceptions \ +") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG " \ + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} \ + -g \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE " \ + ${CMAKE_EXE_LINKER_FLAGS_RELEASE} \ + -mcpu=cortex-m0plus \ + -Wall \ + -mfloat-abi=soft \ + --specs=nano.specs \ + --specs=nosys.specs \ + -fno-common \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-builtin \ + -mthumb \ + -mapcs \ + -Xlinker \ + --gc-sections \ + -Xlinker \ + -static \ + -Xlinker \ + -z \ + -Xlinker \ + muldefs \ + -Xlinker \ + -Map=output.map \ + -Wl,--print-memory-usage \ + -T${ProjDirPath}/LPC845_flash.ld -static \ +") diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/board.c b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/board.h b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/clock_config.c b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/clock_config.c new file mode 100644 index 0000000..5ac3762 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_pdbdm/clock_config.c @@ -0,0 +1,233 @@ +/* + * Copyright 2018,2019 ,2021 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v7.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 9.0.0 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: LowPower_clock.outFreq, value: 10 kHz} +- {id: System_clock.outFreq, value: 18 MHz} +- {id: divto750k_clock.outFreq, value: 750 kHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/freemaster_cfg.h b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/freemaster_cfg.h new file mode 100644 index 0000000..3ba2407 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/freemaster_cfg.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - User Configuration File + */ + +#ifndef __FREEMASTER_CFG_H +#define __FREEMASTER_CFG_H + +//////////////////////////////////////////////////////////////////////////////// +// Definitions +//////////////////////////////////////////////////////////////////////////////// + +#define FMSTR_PLATFORM_CORTEX_M 1 /* Cortex-M platform (see freemaster.h for list of all supported platforms) */ + +//! Set the demo application configuration +#define FMSTR_DEMO_ENOUGH_ROM 1 /* Platform has enough ROM to show most of the FreeMASTER features */ +#define FMSTR_DEMO_LARGE_ROM 0 /* Platform has large ROM enough to store the extended data structures used in FreeMASTER demo */ +#define FMSTR_DEMO_SUPPORT_I64 1 /* support for long long type */ +#define FMSTR_DEMO_SUPPORT_FLT 1 /* support for float type */ +#define FMSTR_DEMO_SUPPORT_DBL 1 /* support for double type */ + + +//! Enable/Disable FreeMASTER support as a whole +#define FMSTR_DISABLE 0 // To disable all FreeMASTER functionalities + +//! Select interrupt or poll-driven serial communication +#define FMSTR_LONG_INTR 0 // Complete message processing in interrupt +#define FMSTR_SHORT_INTR 0 // Queuing done in interrupt +#define FMSTR_POLL_DRIVEN 1 // No interrupt needed, polling only + +// List of standard FreeMASTER transports and their low-level drivers. See more options in src/drivers. +// FMSTR_SERIAL - Standard serial transport protocol (Used by various types of UART peripherals as USB CDC implementation) +// FMSTR_SERIAL_MCUX_UART - MCUXSDK driver for UART peripheral +// FMSTR_SERIAL_MCUX_LPUART - MCUXSDK driver for LPUART peripheral +// FMSTR_SERIAL_MCUX_USART - MCUXSDK driver for USART peripheral +// FMSTR_SERIAL_MCUX_MINIUSART -MCUXSDK driver for MINIUSART peripheral +// FMSTR_SERIAL_MCUX_USB - MCUXSDK driver for USB peripheral with CDC class +// FMSTR_CAN - Standard CAN transport protocol (Used by various types of CAN peripherals) +// FMSTR_CAN_MCUX_FLEXCAN - MCUXSDK driver for FlexCAN peripheral +// FMSTR_CAN_MCUX_MCAN - MCUXSDK driver for MCAN peripheral +// FMSTR_CAN_MCUX_MSCAN - MCUXSDK driver for msCAN peripheral +// FMSTR_PDBDM - Packet Driven BDM (direct memory access via JTAG, SWD or BDM debug probes). No low-level driver used. + +//! Select communication interface +#define FMSTR_TRANSPORT FMSTR_SERIAL // Use serial transport layer */ +#define FMSTR_SERIAL_DRV FMSTR_SERIAL_MCUX_MINIUSART // Use serial driver for miniUSART */ + +//! Define communication interface base address or leave undefined for runtime setting +// #undef FMSTR_SERIAL_BASE // Serial base will be assigned in runtime (when FMSTR_USE_UART) +// #undef FMSTR_CAN_BASE // CAN base will be assigned in runtime (when FMSTR_USE_FLEXCAN) + +//! FlexCAN-specific, communication message buffers +#define FMSTR_FLEXCAN_TXMB 0 +#define FMSTR_FLEXCAN_RXMB 1 + +//! Input/output communication buffer size +#define FMSTR_COMM_BUFFER_SIZE 0 // Set to 0 for "automatic" + +//! Receive FIFO queue size (use with FMSTR_SHORT_INTR only) +#define FMSTR_COMM_RQUEUE_SIZE 32 // Set to 0 for "default" + +//! Support for Application Commands +#define FMSTR_USE_APPCMD 1 // Enable/disable App.Commands support +#define FMSTR_APPCMD_BUFF_SIZE 32 // App.Command data buffer size +#define FMSTR_MAX_APPCMD_CALLS 4 // How many app.cmd callbacks? (0=disable) + +//! Oscilloscope support +#define FMSTR_USE_SCOPE 2 // Specify number of supported oscilloscopes +#define FMSTR_MAX_SCOPE_VARS 8 // Specify maximum number of scope variables per one oscilloscope + +//! Recorder support +#define FMSTR_USE_RECORDER 2 // Specify number of supported recorders + +//! Built-in recorder buffer +#define FMSTR_REC_BUFF_SIZE 1024 // Built-in buffer size of recorder #0. Set to 0 to use runtime settings. + +//! Recorder time base, specifies how often the recorder is called in the user app. +#define FMSTR_REC_TIMEBASE FMSTR_REC_BASE_MILLISEC(0) // 0 = "unknown" +#define FMSTR_REC_FLOAT_TRIG 1 // Enable/disable floating point triggering + +// Target-side address translation (TSA) +#define FMSTR_USE_TSA 1 // Enable TSA functionality +#define FMSTR_USE_TSA_INROM 1 // TSA tables declared as const (put to ROM) +#define FMSTR_USE_TSA_SAFETY 1 // Enable/Disable TSA memory protection +#define FMSTR_USE_TSA_DYNAMIC 1 // Enable/Disable TSA entries to be added also in runtime + +// Pipes as data streaming over FreeMASTER protocol +#define FMSTR_USE_PIPES 3 // Specify number of supported pipe objects + +// Enable/Disable read/write memory commands +#define FMSTR_USE_READMEM 1 // Enable read memory commands +#define FMSTR_USE_WRITEMEM 1 // Enable write memory commands +#define FMSTR_USE_WRITEMEMMASK 1 // Enable write memory bits commands + +// Define password for access levels to protect them. AVOID SHORT PASSWORDS in production version. +// Passwords should be at least 20 characters long to prevent dictionary attacks. +// #define FMSTR_RESTRICTED_ACCESS_R_PASSWORD "r" // Read-only access level password. Let undefined when no password is required. +// #define FMSTR_RESTRICTED_ACCESS_RW_PASSWORD "rw" // Write access level password. Let undefined to set the same as for read-only access level. +// #define FMSTR_RESTRICTED_ACCESS_RWF_PASSWORD "rwf" // Flash access level password. Let undefined to set the same as for write access level. + +// Storing cleartext passwords in Flash memory is not safe, consider storing their SHA1 hash instead +// Even with this option, the hash must be generated from reasonably complex password to prevent dictionary attack. +#define FMSTR_USE_HASHED_PASSWORDS 0 // When non-zero, the passwords above are specified as a pointer to 20-byte SHA1 hash of password text + +#endif /* __FREEMASTER_CFG_H */ + +//////////////////////////////////////////////////////////////////////////////// +// EOF +//////////////////////////////////////////////////////////////////////////////// diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/main.c b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/main.c new file mode 100644 index 0000000..6f3c5e7 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/main.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - Example Application + */ + +//////////////////////////////////////////////////////////////////////////////// +// Includes +//////////////////////////////////////////////////////////////////////////////// + +#include "pin_mux.h" +#include "fsl_usart.h" +#include "fsl_common.h" +#include "board.h" + +#include "freemaster.h" +#include "freemaster_serial_usart.h" + +#include "freemaster_example.h" + +//////////////////////////////////////////////////////////////////////////////// +// Variables +//////////////////////////////////////////////////////////////////////////////// + +//! Note: All global variables accessed by FreeMASTER are defined in a shared +//! freemaster_example.c file + +//////////////////////////////////////////////////////////////////////////////// +// Prototypes +//////////////////////////////////////////////////////////////////////////////// + +static void init_freemaster_usart(void); + +//////////////////////////////////////////////////////////////////////////////// +// Code +//////////////////////////////////////////////////////////////////////////////// + +int main(void) +{ + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + + /* Board initialization */ + BOARD_InitPins(); + BOARD_BootClockFRO30M(); + + /* FreeMASTER communication layer initialization */ + init_freemaster_usart(); + + /* This example uses shared code from FreeMASTER generic example application */ + FMSTR_Example_Init(); + + while(1) + { + /* FreeMASTER example increments several variables periodically, + use the FreeMASTER PC Host tool to visualize the variables */ + FMSTR_Example_Poll(); + } +} + +/*! + * @brief USART Module initialization + */ +static void init_freemaster_usart(void) +{ + usart_config_t config; + /* + * usartConfig->baudRate_Bps = 9600U; + * usartConfig->parityMode = kUSART_ParityDisabled; + * usartConfig->stopBitCount = kUSART_OneStopBit; + * usartConfig->bitCountPerChar = kUSART_8BitsPerChar; + * usartConfig->loopback = false; + * usartConfig->enableTx = false; + * usartConfig->enableRx = false; + */ + USART_GetDefaultConfig(&config); + /* Override the Default configuration to satisfy FreeMASTER needs */ + config.baudRate_Bps = 115200U; + config.enableTx = false; + config.enableRx = false; + + USART_Init((USART_Type*)BOARD_DEBUG_USART_BASEADDR, &config, BOARD_DEBUG_USART_CLK_FREQ); + + /* Register communication module used by FreeMASTER driver. */ + FMSTR_SerialSetBaseAddress((USART_Type*)BOARD_DEBUG_USART_BASEADDR); + +#if FMSTR_SHORT_INTR || FMSTR_LONG_INTR + /* Enable UART interrupts. */ + EnableIRQ(BOARD_UART_IRQ); + EnableGlobalIRQ(0); +#endif +} + + +#if FMSTR_SHORT_INTR || FMSTR_LONG_INTR +/* +* Application interrupt handler of communication peripheral used in interrupt modes +* of FreeMASTER communication. +* +* NXP MCUXpresso SDK framework defines interrupt vector table as a part of "startup_XXXXXX.x" +* assembler/C file. The table points to weakly defined symbols, which may be overwritten by the +* application specific implementation. FreeMASTER overrides the original weak definition and +* redirects the call to its own handler. +* +*/ + +void BOARD_UART_IRQ_HANDLER(void) +{ + /* Call FreeMASTER Interrupt routine handler */ + FMSTR_SerialIsr(); + /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping + exception return operation might vector to incorrect interrupt */ +#if defined __CORTEX_M && (__CORTEX_M == 4U) + __DSB(); +#endif +} +#endif + +//////////////////////////////////////////////////////////////////////////////// +// EOF +///////////////////////////////////////////////////////////////////////////////// diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/pin_mux.c b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/pin_mux.c new file mode 100644 index 0000000..bd754e4 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/pin_mux.c @@ -0,0 +1,112 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Pins v6.0 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 6.0.1 +board: LPCXpresso845 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +#include "fsl_common.h" +#include "fsl_iocon.h" +#include "fsl_swm.h" +#include "pin_mux.h" + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitBootPins + * Description : Calls initialization functions. + * + * END ****************************************************************************************************************/ +void BOARD_InitBootPins(void) +{ + BOARD_InitPins(); +} + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitPins: +- options: {callFromInitBoot: 'true', prefix: BOARD_, coreID: core0, enableClock: 'true'} +- pin_list: + - {pin_num: '37', peripheral: USART0, signal: TXD, pin_signal: PIO1_17, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + - {pin_num: '36', peripheral: USART0, signal: RXD, pin_signal: PIO1_16, mode: pullUp, invert: disabled, hysteresis: enabled, opendrain: disabled, smode: bypass, + clkdiv: div0} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M0P */ +void BOARD_InitPins(void) +{ + /* Enables clock for IOCON.: enable */ + CLOCK_EnableClock(kCLOCK_Iocon); + /* Enables clock for switch matrix.: enable */ + CLOCK_EnableClock(kCLOCK_Swm); + + const uint32_t IOCON_INDEX_PIO1_16_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PORT1 PIN16 (coords: ) is configured as */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, IOCON_INDEX_PIO1_16_config); + + const uint32_t IOCON_INDEX_PIO1_17_config = (/* Selects pull-up function */ + IOCON_PIO_MODE_PULLUP | + /* Enable hysteresis */ + IOCON_PIO_HYS_EN | + /* Input not invert */ + IOCON_PIO_INV_DI | + /* Disables Open-drain function */ + IOCON_PIO_OD_DI | + /* Bypass input filter */ + IOCON_PIO_SMODE_BYPASS | + /* IOCONCLKDIV0 */ + IOCON_PIO_CLKDIV0); + /* PORT1 PIN17 (coords: ) is configured as */ + IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, IOCON_INDEX_PIO1_17_config); + + /* USART0_TXD connect to P1_17 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17); + + /* USART0_RXD connect to P1_16 */ + SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16); + + /* Disable clock for switch matrix. */ + CLOCK_DisableClock(kCLOCK_Swm); +} +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/pin_mux.h b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/pin_mux.h new file mode 100644 index 0000000..f06dc7e --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/pin_mux.h @@ -0,0 +1,107 @@ +/* + * Copyright 2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/*********************************************************************************************************************** + * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file + * will be overwritten if the respective MCUXpresso Config Tools is used to update this file. + **********************************************************************************************************************/ + +#ifndef _PIN_MUX_H_ +#define _PIN_MUX_H_ + +/*********************************************************************************************************************** + * Definitions + **********************************************************************************************************************/ + +/*! @brief Direction type */ +typedef enum _pin_mux_direction +{ + kPIN_MUX_DirectionInput = 0U, /* Input direction */ + kPIN_MUX_DirectionOutput = 1U, /* Output direction */ + kPIN_MUX_DirectionInputOrOutput = 2U /* Input or output direction */ +} pin_mux_direction_t; + +/*! + * @addtogroup pin_mux + * @{ + */ + +/*********************************************************************************************************************** + * API + **********************************************************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @brief Calls initialization functions. + * + */ +void BOARD_InitBootPins(void); + +#define IOCON_PIO_CLKDIV0 0x00u /*!<@brief IOCONCLKDIV0 */ +#define IOCON_PIO_HYS_EN 0x20u /*!<@brief Enable hysteresis */ +#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input not invert */ +#define IOCON_PIO_MODE_PULLUP 0x10u /*!<@brief Selects pull-up function */ +#define IOCON_PIO_OD_DI 0x00u /*!<@brief Disables Open-drain function */ +#define IOCON_PIO_SMODE_BYPASS 0x00u /*!<@brief Bypass input filter */ + +/*! @name PIO1_17 (number 37), P3[13]/P6[1]/U4[31]/TARGET_TX_DEBUG_P1_17 + @{ */ +/*! + * @brief Device name: USART0 */ +#define BOARD_DEBUG_UART_TX_PERIPHERAL USART0 +/*! + * @brief USART0 signal: TXD */ +#define BOARD_DEBUG_UART_TX_SIGNAL TXD +/*! + * @brief PORT device name: 1U */ +#define BOARD_DEBUG_UART_TX_PORT 1U +/*! + * @brief 1U pin index: 17 */ +#define BOARD_DEBUG_UART_TX_PIN 17U +/*! + * @brief Pin name */ +#define BOARD_DEBUG_UART_TX_PIN_NAME PIO1_17 +/*! + * @brief Label */ +#define BOARD_DEBUG_UART_TX_LABEL "P3[13]/P6[1]/U4[31]/TARGET_TX_DEBUG_P1_17" +/*! + * @brief Identifier name */ +#define BOARD_DEBUG_UART_TX_NAME "DEBUG_UART_TX" +/* @} */ + +/*! @name PIO1_16 (number 36), P7[1]/U4[32]/TARGET_RX_DEBUG_P1_16 + @{ */ +#define BOARD_DEBUG_UART_RX_PERIPHERAL USART0 /*!<@brief Device name: USART0 */ +#define BOARD_DEBUG_UART_RX_SIGNAL RXD /*!<@brief USART0 signal: RXD */ +#define BOARD_DEBUG_UART_RX_PORT 1U /*!<@brief PORT device name: 1U */ +#define BOARD_DEBUG_UART_RX_PIN 16U /*!<@brief 1U pin index: 16 */ +#define BOARD_DEBUG_UART_RX_PIN_NAME PIO1_16 /*!<@brief Pin name */ +#define BOARD_DEBUG_UART_RX_LABEL "P7[1]/U4[32]/TARGET_RX_DEBUG_P1_16" /*!<@brief Label */ +#define BOARD_DEBUG_UART_RX_NAME "DEBUG_UART_RX" /*!<@brief Identifier name */ + /* @} */ + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitPins(void); /* Function assigned for the Cortex-M0P */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif /* _PIN_MUX_H_ */ + +/*********************************************************************************************************************** + * EOF + **********************************************************************************************************************/ diff --git a/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/readme.txt b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/readme.txt new file mode 100644 index 0000000..b804d27 --- /dev/null +++ b/boards/lpcxpresso845max/freemaster_examples/fmstr_uart/readme.txt @@ -0,0 +1,32 @@ +Hardware requirements +===================== +- Mini/micro USB cable +- Target microcontroller board +- Personal Computer +- FreeMASTER 2.5 or later installed on PC + +Board settings +============ +No special settings are required. By default this demo communicates over a virtual +serial line interface of the debugger USB connection. With a proper RS232 transceiver +and pin configuration, it may also connect to microcontroller UART peripheral. + +Prepare the demo +=============== +1. Connect a USB cable between the host PC and the Debug USB port on the target board. +2. Compile and download the program to the target microcontroller. +3. Run and resume application execution when debugger stops in the main() function. + +Connect with FreeMASTER +======================= +4. Run FreeMASTER, use the Connection Wizard or open Project Options. +5. Select serial communication, choose correct COMx port and connect at speed 115200 bps. +6. Start communication, FreeMASTER loads the initial TSA Active Content links in the Welcome page. +7. Click the "FreeMASTER Demonstration Project (embedded in device)" in the Welcome page. +8. The demo is now running, you should be able to watch variable values and graphs. + +More information +================ +Read more information about FreeMASTER tool at http://www.nxp.com/freemaster. +Feel free to ask questions and report issues at FreeMASTER's +community page at https://community.nxp.com/community/freemaster diff --git a/boards/lpcxpresso845max/lpcxpresso845max.png b/boards/lpcxpresso845max/lpcxpresso845max.png new file mode 100644 index 0000000..15f281c Binary files /dev/null and b/boards/lpcxpresso845max/lpcxpresso845max.png differ diff --git a/boards/lpcxpresso845max/project_template/board.c b/boards/lpcxpresso845max/project_template/board.c new file mode 100644 index 0000000..917e20f --- /dev/null +++ b/boards/lpcxpresso845max/project_template/board.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include "fsl_common.h" +#include "clock_config.h" +#include "board.h" +#include "fsl_debug_console.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ + +/* Clock rate on the CLKIN pin */ +const uint32_t ExtClockIn = BOARD_EXTCLKINRATE; + +/******************************************************************************* + * Code + ******************************************************************************/ +/* Initialize debug console. */ +status_t BOARD_InitDebugConsole(void) +{ +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) + status_t result; + /* Select the main clock as source clock of USART0 (debug console) */ + CLOCK_Select(BOARD_DEBUG_USART_CLK_ATTACH); + RESET_PeripheralReset(BOARD_DEBUG_USART_RST); + result = DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE, + BOARD_DEBUG_USART_CLK_FREQ); + assert(kStatus_Success == result); + return result; +#else + return kStatus_Success; +#endif +} diff --git a/boards/lpcxpresso845max/project_template/board.h b/boards/lpcxpresso845max/project_template/board.h new file mode 100644 index 0000000..3e35108 --- /dev/null +++ b/boards/lpcxpresso845max/project_template/board.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include "clock_config.h" +#include "fsl_common.h" +#include "fsl_gpio.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/*! @brief The board name */ +#define BOARD_NAME "LPCXPRESSO845MAX" + +#define BOARD_EXTCLKINRATE (0) + +/*! @brief The UART to use for debug messages. */ +#define BOARD_DEBUG_USART_TYPE kSerialPort_Uart +#define BOARD_DEBUG_USART_BASEADDR (uint32_t) USART0 +#define BOARD_DEBUG_USART_INSTANCE 0U +#define BOARD_DEBUG_USART_CLK_FREQ CLOCK_GetMainClkFreq() +#define BOARD_DEBUG_USART_CLK_ATTACH kUART0_Clk_From_MainClk +#define BOARD_DEBUG_USART_RST kUART0_RST_N_SHIFT_RSTn +#define BOARD_UART_IRQ USART0_IRQn +#define BOARD_UART_IRQ_HANDLER USART0_IRQHandler + +#ifndef BOARD_DEBUG_USART_BAUDRATE +#define BOARD_DEBUG_USART_BAUDRATE 9600 +#endif /* BOARD_DEBUG_UART_BAUDRATE */ + +/*! @brief Board led mapping */ +#define LOGIC_LED_ON 0U +#define LOGIC_LED_OFF 1U + +/* LED_GREEN */ +#ifndef BOARD_LED_GREEN_GPIO +#define BOARD_LED_GREEN_GPIO GPIO +#endif +#define BOARD_LED_GREEN_GPIO_PORT 0U +#ifndef BOARD_LED_GREEN_GPIO_PIN +#define BOARD_LED_GREEN_GPIO_PIN 0U +#endif + +#define LED_GREEN_INIT(output) \ + GPIO_PortInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, BOARD_LED_GREEN_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_GREEN_ON() \ + GPIO_PortClear(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_OFF() \ + GPIO_PortSet(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN \ \ \ \ \ + */ +#define LED_GREEN_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PORT, \ + 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */ + +/* LED_BLUE */ +#ifndef BOARD_LED_BLUE_GPIO +#define BOARD_LED_BLUE_GPIO GPIO +#endif +#define BOARD_LED_BLUE_GPIO_PORT 1U +#ifndef BOARD_LED_BLUE_GPIO_PIN +#define BOARD_LED_BLUE_GPIO_PIN 15U +#endif + +#ifndef BOARD_SW2_GPIO +#define BOARD_SW2_GPIO GPIO +#endif +#define BOARD_SW2_GPIO_PORT 0U +#ifndef BOARD_SW2_GPIO_PIN +#define BOARD_SW2_GPIO_PIN 4U +#endif +#define BOARD_SW2_NAME "SW2" +#define BOARD_SW2_IRQ PIN_INT0_IRQn +#define BOARD_SW2_IRQ_HANDLER PIN_INT0_IRQHandler + +#define LED_BLUE_INIT(output) \ + GPIO_PortInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_BLUE_ON() \ + GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_OFF() \ + GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE \ \ \ \ \ + */ +#define LED_BLUE_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \ + 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */ + +/* LED_RED */ +#ifndef BOARD_LED_RED_GPIO +#define BOARD_LED_RED_GPIO GPIO +#endif +#define BOARD_LED_RED_GPIO_PORT 0U +#ifndef BOARD_LED_RED_GPIO_PIN +#define BOARD_LED_RED_GPIO_PIN 12U +#endif + +#define LED_RED_INIT(output) \ + GPIO_PortInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT); \ + GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, \ + &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}); /*!< Enable target LED_GREEN */ +#define LED_RED_ON() \ + GPIO_PortClear(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED \ \ \ \ \ + */ +#define LED_RED_OFF() \ + GPIO_PortSet(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED \ \ \ \ \ + */ +#define LED_RED_TOGGLE() \ + GPIO_PortToggle(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PORT, \ + 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ + +status_t BOARD_InitDebugConsole(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/boards/lpcxpresso845max/project_template/clock_config.c b/boards/lpcxpresso845max/project_template/clock_config.c new file mode 100644 index 0000000..0852708 --- /dev/null +++ b/boards/lpcxpresso845max/project_template/clock_config.c @@ -0,0 +1,224 @@ +/* + * Copyright 2018 NXP. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Set up all dividers. + * + * 3. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!GlobalInfo +product: Clocks v4.1 +processor: LPC845 +package_id: LPC845M301JBD64 +mcu_data: ksdk2_0 +processor_version: 4.0.1 +board: LPCXpresso845 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ************************ BOARD_InitBootClocks function ************************ + ******************************************************************************/ +void BOARD_InitBootClocks(void) +{ + BOARD_BootClockFRO18M(); +} + +/******************************************************************************* + ******************** Configuration BOARD_BootClockFRO18M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +!!Configuration +name: BOARD_BootClockFRO18M +called_from_default_init: true +outputs: +- {id: FROHF_clock.outFreq, value: 18 MHz} +- {id: System_clock.outFreq, value: 18 MHz} +settings: +- {id: SYSCON.ADCCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.CLKOUTSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG0CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRG1CLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON.FRO_DIRECT.sel, value: SYSCON.fro_osc} +- {id: SYSCON.SCTCLKSEL.sel, value: NO_CLOCK} +- {id: SYSCON_PDRUNCFG0_PDEN_PLL_CFG, value: Power_down} +sources: +- {id: SYSCON.fro_osc.outFreq, value: 18 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO18M configuration + ******************************************************************************/ +void BOARD_BootClockFRO18M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_OUT); /*!< Ensure FRO is on */ + POWER_DisablePD(kPDRUNCFG_PD_FRO); /*!< Ensure FRO is on */ + CLOCK_SetFroOscFreq(kCLOCK_FroOscOut18M); /*!< Set up FRO freq */ + CLOCK_SetFroOutClkSrc(kCLOCK_FroSrcFroOsc); /*!< Set FRO clock source */ + POWER_DisablePD(kPDRUNCFG_PD_SYSOSC); /*!< Ensure Main osc is on */ + CLOCK_Select(kEXT_Clk_From_SysOsc); /*! +#include "fsl_device_registers.h" + + + + + +/* ---------------------------------------------------------------------------- + -- Core clock + ---------------------------------------------------------------------------- */ + +uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; + +/* ---------------------------------------------------------------------------- + -- SystemInit() + ---------------------------------------------------------------------------- */ + +void SystemInit (void) { + +#if defined(__MCUXPRESSO) + extern void(*const g_pfnVectors[]) (void); + SCB->VTOR = (uint32_t) &g_pfnVectors; +#else + extern void *__Vectors; + SCB->VTOR = (uint32_t) &__Vectors; +#endif + FLASH_CTRL->FLASHCFG &= ~FLASH_CTRL_FLASHCFG_FLASHTIM_MASK; /* set 1 system clock flash access time. */ + SystemCoreClock = DEFAULT_SYSTEM_CLOCK; + SystemInitHook(); +} + +/* ---------------------------------------------------------------------------- + -- SystemCoreClockUpdate() + ---------------------------------------------------------------------------- */ + +void SystemCoreClockUpdate (void) { + uint32_t wdt_osc = 0U; + uint32_t fro_osc = 0U; + + /* Determine clock frequency according to clock register values */ + switch ((SYSCON->FROOSCCTRL ) & 0x03U) { + case 0U: fro_osc = 18000000U; break; + case 1U: fro_osc = 24000000U; break; + case 2U: fro_osc = 30000000U; break; + case 3U: fro_osc = 30000000U; break; + default: fro_osc = 0U; break; + } + if (((SYSCON->FROOSCCTRL >> SYSCON_FROOSCCTRL_FRO_DIRECT_SHIFT) & 0x01U) == 0U) { + fro_osc = fro_osc >> 1U; + } + + switch ((SYSCON->WDTOSCCTRL >> SYSCON_WDTOSCCTRL_FREQSEL_SHIFT) & 0x0FU) { + case 0U: wdt_osc = 0U; break; + case 1U: wdt_osc = 600000U; break; + case 2U: wdt_osc = 1050000U; break; + case 3U: wdt_osc = 1400000U; break; + case 4U: wdt_osc = 1750000U; break; + case 5U: wdt_osc = 2100000U; break; + case 6U: wdt_osc = 2400000U; break; + case 7U: wdt_osc = 2700000U; break; + case 8U: wdt_osc = 3000000U; break; + case 9U: wdt_osc = 3250000U; break; + case 10U: wdt_osc = 3500000U; break; + case 11U: wdt_osc = 3750000U; break; + case 12U: wdt_osc = 4000000U; break; + case 13U: wdt_osc = 4200000U; break; + case 14U: wdt_osc = 4400000U; break; + case 15U: wdt_osc = 4600000U; break; + default: wdt_osc = 0U; break; + } + wdt_osc /= (((SYSCON->WDTOSCCTRL & SYSCON_WDTOSCCTRL_DIVSEL_MASK) + 1U) << 1U); + + switch (SYSCON->MAINCLKPLLSEL & 0x01U) { + case 0U: /* main_clk_pre_pll */ + switch (SYSCON->MAINCLKSEL & SYSCON_MAINCLKSEL_SEL_MASK) { + case 0U: /* Free running oscillator (FRO) */ + SystemCoreClock = fro_osc; + break; + case 1U: /* System oscillator */ + SystemCoreClock = CLK_OSC_IN; + break; + case 2U: /* watchdog oscillator */ + SystemCoreClock = wdt_osc; + break; + case 3U: /* Free running oscillator (FRO) / 2 */ + SystemCoreClock = (fro_osc >> 1U); + break; + default: + SystemCoreClock = 0U; + break; + } + break; + case 1U: /* System PLL Clock Out */ + switch (SYSCON->SYSPLLCLKSEL & SYSCON_SYSPLLCLKSEL_SEL_MASK) { + case 0U: /* Free running oscillator (FRO) */ + SystemCoreClock = fro_osc * ((SYSCON->SYSPLLCTRL & SYSCON_SYSPLLCTRL_MSEL_MASK) + 1U); + break; + case 1U: /* System oscillator */ + SystemCoreClock = CLK_OSC_IN * ((SYSCON->SYSPLLCTRL & SYSCON_SYSPLLCTRL_MSEL_MASK) + 1U); + break; + case 2U: /* watchdog oscillator */ + SystemCoreClock = wdt_osc * ((SYSCON->SYSPLLCTRL & SYSCON_SYSPLLCTRL_MSEL_MASK) + 1U); + break; + case 3U: /* Free running oscillator (FRO) / 2 */ + SystemCoreClock = (fro_osc >> 1U) * ((SYSCON->SYSPLLCTRL & SYSCON_SYSPLLCTRL_MSEL_MASK) + 1U); + break; + default: + SystemCoreClock = 0U; + break; + } + break; + default: + SystemCoreClock = 0U; + break; + } + + SystemCoreClock /= SYSCON->SYSAHBCLKDIV; +} + +/* ---------------------------------------------------------------------------- + -- SystemInitHook() + ---------------------------------------------------------------------------- */ + +__attribute__ ((weak)) void SystemInitHook (void) { + /* Void implementation of the weak function. */ +} diff --git a/devices/LPC845/system_LPC845.h b/devices/LPC845/system_LPC845.h new file mode 100644 index 0000000..e79bbbb --- /dev/null +++ b/devices/LPC845/system_LPC845.h @@ -0,0 +1,116 @@ +/* +** ################################################################### +** Processors: LPC845M301JBD48 +** LPC845M301JBD64 +** LPC845M301JHI33 +** LPC845M301JHI48 +** +** Compilers: GNU C Compiler +** IAR ANSI C/C++ Compiler for ARM +** Keil ARM C/C++ Compiler +** MCUXpresso Compiler +** +** Reference manual: LPC84x User manual Rev.1.6 8 Dec 2017 +** Version: rev. 1.2, 2017-06-08 +** Build: b210815 +** +** Abstract: +** Provides a system configuration function and a global variable that +** contains the system frequency. It configures the device and initializes +** the oscillator (PLL) that is part of the microcontroller device. +** +** Copyright 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2021 NXP +** All rights reserved. +** +** SPDX-License-Identifier: BSD-3-Clause +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** - rev. 1.0 (2016-08-12) +** Initial version. +** - rev. 1.1 (2016-11-25) +** Update CANFD and Classic CAN register. +** Add MAC TIMERSTAMP registers. +** - rev. 1.2 (2017-06-08) +** Remove RTC_CTRL_RTC_OSC_BYPASS. +** SYSCON_ARMTRCLKDIV rename to SYSCON_ARMTRACECLKDIV. +** Remove RESET and HALT from SYSCON_AHBCLKDIV. +** +** ################################################################### +*/ + +/*! + * @file LPC845 + * @version 1.2 + * @date 2017-06-08 + * @brief Device specific configuration file for LPC845 (header file) + * + * Provides a system configuration function and a global variable that contains + * the system frequency. It configures the device and initializes the oscillator + * (PLL) that is part of the microcontroller device. + */ + +#ifndef _SYSTEM_LPC845_H_ +#define _SYSTEM_LPC845_H_ /**< Symbol preventing repeated inclusion */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define DEFAULT_SYSTEM_CLOCK 12000000u /* Default System clock value */ +#define CLK_RTC_32K_CLK 32768u /* RTC oscillator 32 kHz output (32k_clk */ +#define CLK_FRO_12MHZ 12000000u /* FRO 12 MHz (fro_12m) */ +#define CLK_OSC_IN 12000000u /* Oscillator input */ + + +/** + * @brief System clock frequency (core clock) + * + * The system clock frequency supplied to the SysTick timer and the processor + * core clock. This variable can be used by the user application to setup the + * SysTick timer or configure other parameters. It may also be used by debugger to + * query the frequency of the debug timer or configure the trace clock speed + * SystemCoreClock is initialized with a correct predefined value. + */ +extern uint32_t SystemCoreClock; + +/** + * @brief Setup the microcontroller system. + * + * Typically this function configures the oscillator (PLL) that is part of the + * microcontroller device. For systems with variable clock speed it also updates + * the variable SystemCoreClock. SystemInit is called from startup_device file. + */ +void SystemInit (void); + +/** + * @brief Updates the SystemCoreClock variable. + * + * It must be called whenever the core clock is changed during program + * execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates + * the current core clock. + */ +void SystemCoreClockUpdate (void); + +/** + * @brief SystemInit function hook. + * + * This weak function allows to call specific initialization code during the + * SystemInit() execution.This can be used when an application specific code needs + * to be called as close to the reset entry as possible (for example the Multicore + * Manager MCMGR_EarlyInit() function call). + * NOTE: No global r/w variables can be used in this hook function because the + * initialization of these variables happens after this function. + */ +void SystemInitHook (void); + +#ifdef __cplusplus +} +#endif + +#endif /* _SYSTEM_LPC845_H_ */ diff --git a/devices/LPC845/utilities/debug_console_lite/fsl_assert.c b/devices/LPC845/utilities/debug_console_lite/fsl_assert.c new file mode 100644 index 0000000..bb9127a --- /dev/null +++ b/devices/LPC845/utilities/debug_console_lite/fsl_assert.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "fsl_common.h" +#include "fsl_debug_console.h" + +#ifndef NDEBUG +#if (defined(__CC_ARM)) || (defined(__ARMCC_VERSION)) || (defined(__ICCARM__)) +void __aeabi_assert(const char *failedExpr, const char *file, int line) +{ +#if SDK_DEBUGCONSOLE == DEBUGCONSOLE_DISABLE + PRINTF("ASSERT ERROR \" %s \": file \"%s\" Line \"%d\" \n", failedExpr, file, line); +#else + (void)PRINTF("ASSERT ERROR \" %s \": file \"%s\" Line \"%d\" \n", failedExpr, file, line); +#endif + + for (;;) + { + __BKPT(0); + } +} +#elif (defined(__GNUC__)) +#if defined(__REDLIB__) +void __assertion_failed(char *failedExpr) +{ + (void)PRINTF("ASSERT ERROR \" %s \n", failedExpr); + for (;;) + { + __BKPT(0); + } +} +#else +void __assert_func(const char *file, int line, const char *func, const char *failedExpr) +{ + (void)PRINTF("ASSERT ERROR \" %s \": file \"%s\" Line \"%d\" function name \"%s\" \n", failedExpr, file, line, + func); + for (;;) + { + __BKPT(0); + } +} +#endif /* defined(__REDLIB__) */ +#else /* (defined(__CC_ARM) || (defined(__ICCARM__)) || (defined(__ARMCC_VERSION)) */ + +#if (defined(__DSC__) && defined(__CW__)) + +void __msl_assertion_failed(char const *failedExpr, char const *file, char const *func, int line) +{ + PRINTF("\r\nASSERT ERROR\r\n"); + PRINTF(" File : %s\r\n", file); + PRINTF(" Function : %s\r\n", func); /*compiler not support func name yet*/ + PRINTF(" Line : %u\r\n", (uint32_t)line); + PRINTF(" failedExpr: %s\r\n", failedExpr); + asm(DEBUGHLT); +} + +#endif /* (defined(__DSC__) && defined (__CW__)) */ + +#endif /* (defined(__CC_ARM) || (defined(__ICCARM__)) || (defined(__ARMCC_VERSION)) */ +#endif /* NDEBUG */ diff --git a/devices/LPC845/utilities/debug_console_lite/fsl_debug_console.c b/devices/LPC845/utilities/debug_console_lite/fsl_debug_console.c new file mode 100644 index 0000000..0cad5f8 --- /dev/null +++ b/devices/LPC845/utilities/debug_console_lite/fsl_debug_console.c @@ -0,0 +1,1955 @@ +/* + * Copyright 2017-2018, 2020 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include +#include +#if defined(__CC_ARM) || defined(__ARMCC_VERSION) +#include +#endif +#include +#include "fsl_debug_console.h" +#include "fsl_adapter_uart.h" + +/*! @brief Keil: suppress ellipsis warning in va_arg usage below. */ +#if defined(__CC_ARM) +#pragma diag_suppress 1256 +#endif /* __CC_ARM */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @brief This definition is maximum line that debugconsole can scanf each time.*/ +#define IO_MAXLINE 20U + +/*! @brief The overflow value.*/ +#ifndef HUGE_VAL +#define HUGE_VAL (99.e99) +#endif /* HUGE_VAL */ + +/*! @brief State structure storing debug console. */ +typedef struct DebugConsoleState +{ + uint8_t uartHandleBuffer[HAL_UART_HANDLE_SIZE]; + hal_uart_status_t (*putChar)(hal_uart_handle_t handle, + const uint8_t *data, + size_t length); /*!< put char function pointer */ + hal_uart_status_t (*getChar)(hal_uart_handle_t handle, + uint8_t *data, + size_t length); /*!< get char function pointer */ + serial_port_type_t type; /*!< The initialized port of the debug console. */ +} debug_console_state_t; + +/*! @brief Type of KSDK printf function pointer. */ +typedef int (*PUTCHAR_FUNC)(int a); + +#if PRINTF_ADVANCED_ENABLE +/*! @brief Specification modifier flags for printf. */ +enum _debugconsole_printf_flag +{ + kPRINTF_Minus = 0x01U, /*!< Minus FLag. */ + kPRINTF_Plus = 0x02U, /*!< Plus Flag. */ + kPRINTF_Space = 0x04U, /*!< Space Flag. */ + kPRINTF_Zero = 0x08U, /*!< Zero Flag. */ + kPRINTF_Pound = 0x10U, /*!< Pound Flag. */ + kPRINTF_LengthChar = 0x20U, /*!< Length: Char Flag. */ + kPRINTF_LengthShortInt = 0x40U, /*!< Length: Short Int Flag. */ + kPRINTF_LengthLongInt = 0x80U, /*!< Length: Long Int Flag. */ + kPRINTF_LengthLongLongInt = 0x100U, /*!< Length: Long Long Int Flag. */ +}; +#endif /* PRINTF_ADVANCED_ENABLE */ + +/*! @brief Specification modifier flags for scanf. */ +enum _debugconsole_scanf_flag +{ + kSCANF_Suppress = 0x2U, /*!< Suppress Flag. */ + kSCANF_DestMask = 0x7cU, /*!< Destination Mask. */ + kSCANF_DestChar = 0x4U, /*!< Destination Char Flag. */ + kSCANF_DestString = 0x8U, /*!< Destination String FLag. */ + kSCANF_DestSet = 0x10U, /*!< Destination Set Flag. */ + kSCANF_DestInt = 0x20U, /*!< Destination Int Flag. */ + kSCANF_DestFloat = 0x30U, /*!< Destination Float Flag. */ + kSCANF_LengthMask = 0x1f00U, /*!< Length Mask Flag. */ +#if SCANF_ADVANCED_ENABLE + kSCANF_LengthChar = 0x100U, /*!< Length Char Flag. */ + kSCANF_LengthShortInt = 0x200U, /*!< Length ShortInt Flag. */ + kSCANF_LengthLongInt = 0x400U, /*!< Length LongInt Flag. */ + kSCANF_LengthLongLongInt = 0x800U, /*!< Length LongLongInt Flag. */ +#endif /* SCANF_ADVANCED_ENABLE */ +#if SCANF_FLOAT_ENABLE + kSCANF_LengthLongLongDouble = 0x1000U, /*!< Length LongLongDuoble Flag. */ +#endif /*SCANF_FLOAT_ENABLE */ + kSCANF_TypeSinged = 0x2000U, /*!< TypeSinged Flag. */ +}; + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Debug UART state information. */ +static debug_console_state_t s_debugConsole; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +#if SDK_DEBUGCONSOLE +static int DbgConsole_PrintfFormattedData(PUTCHAR_FUNC func_ptr, const char *fmt, va_list ap); +static int DbgConsole_ScanfFormattedData(const char *line_ptr, char *format, va_list args_ptr); +#endif /* SDK_DEBUGCONSOLE */ + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*************Code for DbgConsole Init, Deinit, Printf, Scanf *******************************/ + +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) +/* See fsl_debug_console.h for documentation of this function. */ +status_t DbgConsole_Init(uint8_t instance, uint32_t baudRate, serial_port_type_t device, uint32_t clkSrcFreq) +{ + hal_uart_config_t usrtConfig; + + if (kSerialPort_Uart != device) + { + return kStatus_Fail; + } + + /* Set debug console to initialized to avoid duplicated initialized operation. */ + s_debugConsole.type = device; + + usrtConfig.srcClock_Hz = clkSrcFreq; + usrtConfig.baudRate_Bps = baudRate; + usrtConfig.parityMode = kHAL_UartParityDisabled; + usrtConfig.stopBitCount = kHAL_UartOneStopBit; + usrtConfig.enableRx = 1U; + usrtConfig.enableTx = 1U; + usrtConfig.enableRxRTS = 0U; + usrtConfig.enableTxCTS = 0U; + usrtConfig.instance = instance; +#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u)) + usrtConfig.txFifoWatermark = 0U; + usrtConfig.rxFifoWatermark = 0U; +#endif + /* Enable clock and initial UART module follow user configure structure. */ + (void)HAL_UartInit((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], &usrtConfig); + /* Set the function pointer for send and receive for this kind of device. */ + s_debugConsole.putChar = HAL_UartSendBlocking; + s_debugConsole.getChar = HAL_UartReceiveBlocking; + + return kStatus_Success; +} + +/* See fsl_debug_console.h for documentation of this function. */ +status_t DbgConsole_Deinit(void) +{ + if (kSerialPort_None == s_debugConsole.type) + { + return kStatus_Success; + } + + (void)HAL_UartDeinit((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0]); + + s_debugConsole.type = kSerialPort_None; + + return kStatus_Success; +} +#endif /* DEBUGCONSOLE_REDIRECT_TO_SDK */ + +#if SDK_DEBUGCONSOLE +/* See fsl_debug_console.h for documentation of this function. */ +int DbgConsole_Printf(const char *fmt_s, ...) +{ + va_list ap; + int result = 0; + + va_start(ap, fmt_s); + result = DbgConsole_Vprintf(fmt_s, ap); + va_end(ap); + + return result; +} + +/* See fsl_debug_console.h for documentation of this function. */ +int DbgConsole_Vprintf(const char *fmt_s, va_list formatStringArg) +{ + int result = 0; + + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + + result = DbgConsole_PrintfFormattedData(DbgConsole_Putchar, fmt_s, formatStringArg); + + return result; +} + +/* See fsl_debug_console.h for documentation of this function. */ +int DbgConsole_Putchar(int ch) +{ + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + (void)s_debugConsole.putChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)(&ch), 1); + + return 1; +} + +/* See fsl_debug_console.h for documentation of this function. */ +int DbgConsole_Scanf(char *fmt_s, ...) +{ + /* Plus one to store end of string char */ + char temp_buf[IO_MAXLINE + 1]; + va_list ap; + int32_t i; + char result; + + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + va_start(ap, fmt_s); + temp_buf[0] = '\0'; + + i = 0; + while (true) + { + if (i >= (int32_t)IO_MAXLINE) + { + break; + } + + result = (char)DbgConsole_Getchar(); + temp_buf[i] = result; + + if ((result == '\r') || (result == '\n')) + { + /* End of Line. */ + if (i == 0) + { + temp_buf[i] = '\0'; + i = -1; + } + else + { + break; + } + } + + i++; + } + + if (i == (int32_t)IO_MAXLINE) + { + temp_buf[i] = '\0'; + } + else + { + temp_buf[i + 1] = '\0'; + } + result = (char)DbgConsole_ScanfFormattedData(temp_buf, fmt_s, ap); + va_end(ap); + + return (int)result; +} + +/* See fsl_debug_console.h for documentation of this function. */ +int DbgConsole_Getchar(void) +{ + char ch; + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + while (kStatus_HAL_UartSuccess != + s_debugConsole.getChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)(&ch), 1)) + { + return -1; + } + + return (int)ch; +} + +/*************Code for process formatted data*******************************/ +/*! + * @brief Scanline function which ignores white spaces. + * + * @param[in] s The address of the string pointer to update. + * @return String without white spaces. + */ +static uint32_t DbgConsole_ScanIgnoreWhiteSpace(const char **s) +{ + uint8_t count = 0; + char c; + + c = **s; + while ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r') || (c == '\v') || (c == '\f')) + { + count++; + (*s)++; + c = **s; + } + return count; +} + +/*! + * @brief This function puts padding character. + * + * @param[in] c Padding character. + * @param[in] curlen Length of current formatted string . + * @param[in] width Width of expected formatted string. + * @param[in] count Number of characters. + * @param[in] func_ptr Function to put character out. + */ +static void DbgConsole_PrintfPaddingCharacter( + char c, int32_t curlen, int32_t width, int32_t *count, PUTCHAR_FUNC func_ptr) +{ + int32_t i; + + for (i = curlen; i < width; i++) + { + (void)func_ptr(c); + (*count)++; + } +} + +/*! + * @brief Converts a radix number to a string and return its length. + * + * @param[in] numstr Converted string of the number. + * @param[in] nump Pointer to the number. + * @param[in] neg Polarity of the number. + * @param[in] radix The radix to be converted to. + * @param[in] use_caps Used to identify %x/X output format. + + * @return Length of the converted string. + */ +static int32_t DbgConsole_ConvertRadixNumToString(char *numstr, void *nump, int32_t neg, int32_t radix, bool use_caps) +{ +#if PRINTF_ADVANCED_ENABLE + long long int a; + long long int b; + long long int c; + + unsigned long long int ua; + unsigned long long int ub; + unsigned long long int uc; + unsigned long long int uc_param; +#else + int a; + int b; + int c; + + unsigned int ua; + unsigned int ub; + unsigned int uc; + unsigned int uc_param; +#endif /* PRINTF_ADVANCED_ENABLE */ + + int32_t nlen; + char *nstrp; + + nlen = 0; + nstrp = numstr; + *nstrp++ = '\0'; + +#if !(PRINTF_ADVANCED_ENABLE > 0) + neg = 0; +#endif + +#if PRINTF_ADVANCED_ENABLE + a = 0; + b = 0; + c = 0; + ua = 0ULL; + ub = 0ULL; + uc = 0ULL; + uc_param = 0ULL; +#else + a = 0; + b = 0; + c = 0; + ua = 0U; + ub = 0U; + uc = 0U; + uc_param = 0U; +#endif /* PRINTF_ADVANCED_ENABLE */ + + (void)a; + (void)b; + (void)c; + (void)ua; + (void)ub; + (void)uc; + (void)uc_param; + (void)neg; + /* + * Fix MISRA issue: CID 15985711 (#15 of 15): MISRA C-2012 Control Flow Expressions (MISRA C-2012 Rule 14.3) + * misra_c_2012_rule_14_3_violation: Execution cannot reach this statement: a = *((int *)nump); + */ +#if PRINTF_ADVANCED_ENABLE + if (0 != neg) + { +#if PRINTF_ADVANCED_ENABLE + a = *(long long int *)nump; +#else + a = *(int *)nump; +#endif /* PRINTF_ADVANCED_ENABLE */ + if (a == 0) + { + *nstrp = '0'; + ++nlen; + return nlen; + } + while (a != 0) + { +#if PRINTF_ADVANCED_ENABLE + b = (long long int)a / (long long int)radix; + c = (long long int)a - ((long long int)b * (long long int)radix); + if (c < 0) + { + uc = (unsigned long long int)c; + uc_param = ~uc; + c = (long long int)uc_param + 1 + (long long int)'0'; + } +#else + b = (int)a / (int)radix; + c = (int)a - ((int)b * (int)radix); + if (c < 0) + { + uc = (unsigned int)c; + uc_param = ~uc; + c = (int)uc_param + 1 + (int)'0'; + } +#endif /* PRINTF_ADVANCED_ENABLE */ + else + { + c = c + (int)'0'; + } + a = b; + *nstrp++ = (char)c; + ++nlen; + } + } + else +#endif /* PRINTF_ADVANCED_ENABLE */ + { +#if PRINTF_ADVANCED_ENABLE + ua = *(unsigned long long int *)nump; +#else + ua = *(unsigned int *)nump; +#endif /* PRINTF_ADVANCED_ENABLE */ + if (ua == 0U) + { + *nstrp = '0'; + ++nlen; + return nlen; + } + while (ua != 0U) + { +#if PRINTF_ADVANCED_ENABLE + ub = (unsigned long long int)ua / (unsigned long long int)radix; + uc = (unsigned long long int)ua - ((unsigned long long int)ub * (unsigned long long int)radix); +#else + ub = ua / (unsigned int)radix; + uc = ua - (ub * (unsigned int)radix); +#endif /* PRINTF_ADVANCED_ENABLE */ + + if (uc < 10U) + { + uc = uc + (unsigned int)'0'; + } + else + { + uc = uc - 10U + (unsigned int)(use_caps ? 'A' : 'a'); + } + ua = ub; + *nstrp++ = (char)uc; + ++nlen; + } + } + return nlen; +} + +#if PRINTF_FLOAT_ENABLE +/*! + * @brief Converts a floating radix number to a string and return its length. + * + * @param[in] numstr Converted string of the number. + * @param[in] nump Pointer to the number. + * @param[in] radix The radix to be converted to. + * @param[in] precision_width Specify the precision width. + + * @return Length of the converted string. + */ +static int32_t DbgConsole_ConvertFloatRadixNumToString(char *numstr, + void *nump, + int32_t radix, + uint32_t precision_width) +{ + int32_t a; + int32_t b; + int32_t c; + uint32_t i; + double fa; + double dc; + double fb; + double r; + double fractpart; + double intpart; + + int32_t nlen; + char *nstrp; + nlen = 0; + nstrp = numstr; + *nstrp++ = '\0'; + r = *(double *)nump; + if (0.0 == r) + { + *nstrp = '0'; + ++nlen; + return nlen; + } + fractpart = modf((double)r, (double *)&intpart); + /* Process fractional part. */ + for (i = 0; i < precision_width; i++) + { + fractpart *= (double)radix; + } + if (r >= 0.0) + { + fa = fractpart + (double)0.5; + if (fa >= pow((double)10, (double)precision_width)) + { + intpart++; + } + } + else + { + fa = fractpart - (double)0.5; + if (fa <= -pow((double)10, (double)precision_width)) + { + intpart--; + } + } + for (i = 0; i < precision_width; i++) + { + fb = fa / (double)radix; + dc = (fa - (double)(long long int)fb * (double)radix); + c = (int32_t)dc; + if (c < 0) + { + c = (int32_t)'0' - c; + } + else + { + c = c + '0'; + } + fa = fb; + *nstrp++ = (char)c; + ++nlen; + } + *nstrp++ = (char)'.'; + ++nlen; + a = (int32_t)intpart; + if (a == 0) + { + *nstrp++ = '0'; + ++nlen; + } + else + { + while (a != 0) + { + b = (int32_t)a / (int32_t)radix; + c = (int32_t)a - ((int32_t)b * (int32_t)radix); + if (c < 0) + { + c = (int32_t)'0' - c; + } + else + { + c = c + '0'; + } + a = b; + *nstrp++ = (char)c; + ++nlen; + } + } + return nlen; +} +#endif /* PRINTF_FLOAT_ENABLE */ + +/*! + * @brief This function outputs its parameters according to a formatted string. + * + * @note I/O is performed by calling given function pointer using following + * (*func_ptr)(c); + * + * @param[in] func_ptr Function to put character out. + * @param[in] fmt Format string for printf. + * @param[in] ap Arguments to printf. + * + * @return Number of characters + */ +static int DbgConsole_PrintfFormattedData(PUTCHAR_FUNC func_ptr, const char *fmt, va_list ap) +{ + /* va_list ap; */ + const char *p; + char c; + + char vstr[33]; + char *vstrp = NULL; + int32_t vlen = 0; + + bool done; + int32_t count = 0; + + uint32_t field_width; + uint32_t precision_width; + char *sval; + int32_t cval; + bool use_caps; + uint8_t radix = 0; + +#if PRINTF_ADVANCED_ENABLE + uint32_t flags_used; + char schar; + bool dschar; + long long int ival; + unsigned long long int uval = 0; + bool valid_precision_width; +#else + int ival; + unsigned int uval = 0; +#endif /* PRINTF_ADVANCED_ENABLE */ + +#if PRINTF_FLOAT_ENABLE + double fval; +#endif /* PRINTF_FLOAT_ENABLE */ + + /* Start parsing apart the format string and display appropriate formats and data. */ + p = fmt; + while (true) + { + if ('\0' == *p) + { + break; + } + c = *p; + /* + * All formats begin with a '%' marker. Special chars like + * '\n' or '\t' are normally converted to the appropriate + * character by the __compiler__. Thus, no need for this + * routine to account for the '\' character. + */ + if (c != '%') + { + (void)func_ptr(c); + count++; + p++; + /* By using 'continue', the next iteration of the loop is used, skipping the code that follows. */ + continue; + } + + use_caps = true; + +#if PRINTF_ADVANCED_ENABLE + /* First check for specification modifier flags. */ + flags_used = 0; + done = false; + while (!done) + { + switch (*++p) + { + case '-': + flags_used |= (uint32_t)kPRINTF_Minus; + break; + case '+': + flags_used |= (uint32_t)kPRINTF_Plus; + break; + case ' ': + flags_used |= (uint32_t)kPRINTF_Space; + break; + case '0': + flags_used |= (uint32_t)kPRINTF_Zero; + break; + case '#': + flags_used |= (uint32_t)kPRINTF_Pound; + break; + default: + /* We've gone one char too far. */ + --p; + done = true; + break; + } + } +#endif /* PRINTF_ADVANCED_ENABLE */ + + /* Next check for minimum field width. */ + field_width = 0; + done = false; + while (!done) + { + c = *++p; + if ((c >= '0') && (c <= '9')) + { + field_width = (field_width * 10U) + ((uint32_t)c - (uint32_t)'0'); + } +#if PRINTF_ADVANCED_ENABLE + else if (c == '*') + { + field_width = (uint32_t)va_arg(ap, unsigned int); + } +#endif /* PRINTF_ADVANCED_ENABLE */ + else + { + /* We've gone one char too far. */ + --p; + done = true; + } + } + /* Next check for the width and precision field separator. */ +#if (PRINTF_ADVANCED_ENABLE || PRINTF_FLOAT_ENABLE) + precision_width = 6U; /* MISRA C-2012 Rule 2.2 */ +#endif +#if PRINTF_ADVANCED_ENABLE + valid_precision_width = false; +#endif /* PRINTF_ADVANCED_ENABLE */ + if (*++p == '.') + { + /* Must get precision field width, if present. */ + precision_width = 0U; + done = false; + while (!done) + { + c = *++p; + if ((c >= '0') && (c <= '9')) + { + precision_width = (precision_width * 10U) + ((uint32_t)c - (uint32_t)'0'); +#if PRINTF_ADVANCED_ENABLE + valid_precision_width = true; +#endif /* PRINTF_ADVANCED_ENABLE */ + } +#if PRINTF_ADVANCED_ENABLE + else if (c == '*') + { + precision_width = (uint32_t)va_arg(ap, unsigned int); + valid_precision_width = true; + } +#endif /* PRINTF_ADVANCED_ENABLE */ + else + { + /* We've gone one char too far. */ + --p; + done = true; + } + } + } + else + { + /* We've gone one char too far. */ + --p; + } +#if PRINTF_ADVANCED_ENABLE + /* + * Check for the length modifier. + */ + switch (/* c = */ *++p) + { + case 'h': + if (*++p != 'h') + { + flags_used |= (uint32_t)kPRINTF_LengthShortInt; + --p; + } + else + { + flags_used |= (uint32_t)kPRINTF_LengthChar; + } + break; + case 'l': + if (*++p != 'l') + { + flags_used |= (uint32_t)kPRINTF_LengthLongInt; + --p; + } + else + { + flags_used |= (uint32_t)kPRINTF_LengthLongLongInt; + } + break; + default: + /* we've gone one char too far */ + --p; + break; + } +#endif /* PRINTF_ADVANCED_ENABLE */ + /* Now we're ready to examine the format. */ + c = *++p; + { + if ((c == 'd') || (c == 'i') || (c == 'f') || (c == 'F') || (c == 'x') || (c == 'X') || (c == 'o') || + (c == 'b') || (c == 'p') || (c == 'u')) + { + if ((c == 'd') || (c == 'i')) + { +#if PRINTF_ADVANCED_ENABLE + if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongLongInt)) + { + ival = (long long int)va_arg(ap, long long int); + } + else if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongInt)) + { + ival = (long int)va_arg(ap, long int); + } + else +#endif /* PRINTF_ADVANCED_ENABLE */ + { + ival = (int)va_arg(ap, int); + } + vlen = DbgConsole_ConvertRadixNumToString(vstr, &ival, 1, 10, use_caps); + vstrp = &vstr[vlen]; +#if PRINTF_ADVANCED_ENABLE + if (ival < 0) + { + schar = '-'; + ++vlen; + } + else + { + if (0U != (flags_used & (uint32_t)kPRINTF_Plus)) + { + schar = '+'; + ++vlen; + } + else + { + if (0U != (flags_used & (uint32_t)kPRINTF_Space)) + { + schar = ' '; + ++vlen; + } + else + { + schar = '\0'; + } + } + } + dschar = false; + /* Do the ZERO pad. */ + if (0U != (flags_used & (uint32_t)kPRINTF_Zero)) + { + if ('\0' != schar) + { + (void)func_ptr(schar); + count++; + } + dschar = true; + + DbgConsole_PrintfPaddingCharacter('0', vlen, (int32_t)field_width, &count, func_ptr); + vlen = (int32_t)field_width; + } + else + { + if (0U == (flags_used & (uint32_t)kPRINTF_Minus)) + { + DbgConsole_PrintfPaddingCharacter(' ', vlen, (int32_t)field_width, &count, func_ptr); + if ('\0' != schar) + { + (void)func_ptr(schar); + count++; + } + dschar = true; + } + } + /* The string was built in reverse order, now display in correct order. */ + if ((!dschar) && ('\0' != schar)) + { + (void)func_ptr(schar); + count++; + } +#endif /* PRINTF_ADVANCED_ENABLE */ + } + +#if PRINTF_FLOAT_ENABLE + if ((c == 'f') || (c == 'F')) + { + fval = (double)va_arg(ap, double); + vlen = DbgConsole_ConvertFloatRadixNumToString(vstr, &fval, 10, precision_width); + vstrp = &vstr[vlen]; + +#if PRINTF_ADVANCED_ENABLE + if (fval < 0.0) + { + schar = '-'; + ++vlen; + } + else + { + if (0U != (flags_used & (uint32_t)kPRINTF_Plus)) + { + schar = '+'; + ++vlen; + } + else + { + if (0U != (flags_used & (uint32_t)kPRINTF_Space)) + { + schar = ' '; + ++vlen; + } + else + { + schar = '\0'; + } + } + } + dschar = false; + if (0U != (flags_used & (uint32_t)kPRINTF_Zero)) + { + if ('\0' != schar) + { + (void)func_ptr(schar); + count++; + } + dschar = true; + DbgConsole_PrintfPaddingCharacter('0', vlen, (int32_t)field_width, &count, func_ptr); + vlen = (int32_t)field_width; + } + else + { + if (0U == (flags_used & (uint32_t)kPRINTF_Minus)) + { + DbgConsole_PrintfPaddingCharacter(' ', vlen, (int32_t)field_width, &count, func_ptr); + if ('\0' != schar) + { + (void)func_ptr(schar); + count++; + } + dschar = true; + } + } + if ((!dschar) && ('\0' != schar)) + { + (void)func_ptr(schar); + count++; + } +#endif /* PRINTF_ADVANCED_ENABLE */ + } +#endif /* PRINTF_FLOAT_ENABLE */ + if ((c == 'X') || (c == 'x')) + { + if (c == 'x') + { + use_caps = false; + } +#if PRINTF_ADVANCED_ENABLE + if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongLongInt)) + { + uval = (unsigned long long int)va_arg(ap, unsigned long long int); + } + else if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongInt)) + { + uval = (unsigned long int)va_arg(ap, unsigned long int); + } + else +#endif /* PRINTF_ADVANCED_ENABLE */ + { + uval = (unsigned int)va_arg(ap, unsigned int); + } + vlen = DbgConsole_ConvertRadixNumToString(vstr, &uval, 0, 16, use_caps); + vstrp = &vstr[vlen]; + +#if PRINTF_ADVANCED_ENABLE + dschar = false; + if (0U != (flags_used & (uint32_t)kPRINTF_Zero)) + { + if (0U != (flags_used & (uint32_t)kPRINTF_Pound)) + { + (void)func_ptr('0'); + (void)func_ptr((use_caps ? 'X' : 'x')); + count += 2; + /*vlen += 2;*/ + dschar = true; + } + DbgConsole_PrintfPaddingCharacter('0', vlen, (int32_t)field_width, &count, func_ptr); + vlen = (int32_t)field_width; + } + else + { + if (0U == (flags_used & (uint32_t)kPRINTF_Pound)) + { + if (0U != (flags_used & (uint32_t)kPRINTF_Pound)) + { + vlen += 2; + } + DbgConsole_PrintfPaddingCharacter(' ', vlen, (int32_t)field_width, &count, func_ptr); + if (0U != (flags_used & (uint32_t)kPRINTF_Pound)) + { + (void)func_ptr('0'); + (void)func_ptr(use_caps ? 'X' : 'x'); + count += 2; + + dschar = true; + } + } + } + + if ((0U != (flags_used & (uint32_t)kPRINTF_Pound)) && (!dschar)) + { + (void)func_ptr('0'); + (void)func_ptr(use_caps ? 'X' : 'x'); + count += 2; + vlen += 2; + } +#endif /* PRINTF_ADVANCED_ENABLE */ + } + if ((c == 'o') || (c == 'b') || (c == 'p') || (c == 'u')) + { + if ('p' == c) + { + /* + * Fix MISRA issue: CID 16209727 (#15 of 15): MISRA C-2012 Pointer Type Conversions (MISRA + * C-2012 Rule 11.6) + * 1. misra_c_2012_rule_11_6_violation: The expression va_arg (ap, void *) of type void * is + * cast to type unsigned int. + * + * Orignal code: uval = (unsigned int)va_arg(ap, void *); + */ + void *pval; + pval = (void *)va_arg(ap, void *); + (void)memcpy((void *)&uval, (void *)&pval, sizeof(void *)); + } + else + { +#if PRINTF_ADVANCED_ENABLE + if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongLongInt)) + { + uval = (unsigned long long int)va_arg(ap, unsigned long long int); + } + else if (0U != (flags_used & (uint32_t)kPRINTF_LengthLongInt)) + { + uval = (unsigned long int)va_arg(ap, unsigned long int); + } + else +#endif /* PRINTF_ADVANCED_ENABLE */ + { + uval = (unsigned int)va_arg(ap, unsigned int); + } + } + switch (c) + { + case 'o': + radix = 8; + break; + case 'b': + radix = 2; + break; + case 'p': + radix = 16; + break; + case 'u': + radix = 10; + break; + default: + /* MISRA C-2012 Rule 16.4 */ + break; + } + vlen = DbgConsole_ConvertRadixNumToString(vstr, &uval, 0, (int32_t)radix, use_caps); + vstrp = &vstr[vlen]; +#if PRINTF_ADVANCED_ENABLE + if (0U != (flags_used & (uint32_t)kPRINTF_Zero)) + { + DbgConsole_PrintfPaddingCharacter('0', vlen, (int32_t)field_width, &count, func_ptr); + vlen = (int32_t)field_width; + } + else + { + if (0U == (flags_used & (uint32_t)kPRINTF_Minus)) + { + DbgConsole_PrintfPaddingCharacter(' ', vlen, (int32_t)field_width, &count, func_ptr); + } + } +#endif /* PRINTF_ADVANCED_ENABLE */ + } +#if !PRINTF_ADVANCED_ENABLE + DbgConsole_PrintfPaddingCharacter(' ', vlen, (int32_t)field_width, &count, func_ptr); +#endif /* !PRINTF_ADVANCED_ENABLE */ + if (vstrp != NULL) + { + while ('\0' != *vstrp) + { + (void)func_ptr(*vstrp--); + count++; + } + } +#if PRINTF_ADVANCED_ENABLE + if (0U != (flags_used & (uint32_t)kPRINTF_Minus)) + { + DbgConsole_PrintfPaddingCharacter(' ', vlen, (int32_t)field_width, &count, func_ptr); + } +#endif /* PRINTF_ADVANCED_ENABLE */ + } + else if (c == 'c') + { + cval = (int32_t)va_arg(ap, unsigned int); + (void)func_ptr(cval); + count++; + } + else if (c == 's') + { + sval = (char *)va_arg(ap, char *); + if (NULL != sval) + { +#if PRINTF_ADVANCED_ENABLE + if (valid_precision_width) + { + vlen = (int32_t)precision_width; + } + else + { + vlen = (int32_t)strlen(sval); + } +#else + vlen = (int32_t)strlen(sval); +#endif /* PRINTF_ADVANCED_ENABLE */ +#if PRINTF_ADVANCED_ENABLE + if (0U == (flags_used & (uint32_t)kPRINTF_Minus)) +#endif /* PRINTF_ADVANCED_ENABLE */ + { + DbgConsole_PrintfPaddingCharacter(' ', vlen, (int32_t)field_width, &count, func_ptr); + } + +#if PRINTF_ADVANCED_ENABLE + if (valid_precision_width) + { + while (('\0' != *sval) && (vlen > 0)) + { + (void)func_ptr(*sval++); + count++; + vlen--; + } + /* In case that vlen sval is shorter than vlen */ + vlen = (int32_t)precision_width - vlen; + } + else + { +#endif /* PRINTF_ADVANCED_ENABLE */ + while ('\0' != *sval) + { + (void)func_ptr(*sval++); + count++; + } +#if PRINTF_ADVANCED_ENABLE + } +#endif /* PRINTF_ADVANCED_ENABLE */ + +#if PRINTF_ADVANCED_ENABLE + if (0U != (flags_used & (uint32_t)kPRINTF_Minus)) + { + DbgConsole_PrintfPaddingCharacter(' ', vlen, (int32_t)field_width, &count, func_ptr); + } +#endif /* PRINTF_ADVANCED_ENABLE */ + } + } + else + { + (void)func_ptr(c); + count++; + } + } + p++; + } + return count; +} + +/*! + * @brief Converts an input line of ASCII characters based upon a provided + * string format. + * + * @param[in] line_ptr The input line of ASCII data. + * @param[in] format Format first points to the format string. + * @param[in] args_ptr The list of parameters. + * + * @return Number of input items converted and assigned. + * @retval IO_EOF When line_ptr is empty string "". + */ +static int DbgConsole_ScanfFormattedData(const char *line_ptr, char *format, va_list args_ptr) +{ + uint8_t base; + int8_t neg; + /* Identifier for the format string. */ + char *c = format; + char temp; + char *buf; + /* Flag telling the conversion specification. */ + uint32_t flag = 0; + /* Filed width for the matching input streams. */ + uint32_t field_width; + /* How many arguments are assigned except the suppress. */ + uint32_t nassigned = 0; + bool match_failure = false; + /* How many characters are read from the input streams. */ + uint32_t n_decode = 0; + + int32_t val; + + const char *s; + /* Identifier for the input string. */ + const char *p = line_ptr; + +#if SCANF_FLOAT_ENABLE + double fnum = 0.0; +#endif /* SCANF_FLOAT_ENABLE */ + + /* Return EOF error before any conversion. */ + if (*p == '\0') + { + return -1; + } + + /* Decode directives. */ + while (('\0' != (*c)) && ('\0' != (*p))) + { + /* Ignore all white-spaces in the format strings. */ + if (0U != DbgConsole_ScanIgnoreWhiteSpace((const char **)(void *)&c)) + { + n_decode += DbgConsole_ScanIgnoreWhiteSpace(&p); + } + else if ((*c != '%') || ((*c == '%') && (*(c + 1) == '%'))) + { + /* Ordinary characters. */ + c++; + if (*p == *c) + { + n_decode++; + p++; + c++; + } + else + { + /* Match failure. Misalignment with C99, the unmatched characters need to be pushed back to stream. + * However, it is deserted now. */ + break; + } + } + else + { + /* convernsion specification */ + c++; + /* Reset. */ + flag = 0; + field_width = 0; + base = 0; + + /* Loop to get full conversion specification. */ + while (('\0' != *c) && (0U == (flag & (uint32_t)kSCANF_DestMask))) + { + switch (*c) + { +#if SCANF_ADVANCED_ENABLE + case '*': + if (0U != (flag & (uint32_t)kSCANF_Suppress)) + { + /* Match failure. */ + match_failure = true; + break; + } + flag |= (uint32_t)kSCANF_Suppress; + c++; + break; + case 'h': + if (0U != (flag & (uint32_t)kSCANF_LengthMask)) + { + /* Match failure. */ + match_failure = true; + break; + } + + if (c[1] == 'h') + { + flag |= (uint32_t)kSCANF_LengthChar; + c++; + } + else + { + flag |= (uint32_t)kSCANF_LengthShortInt; + } + c++; + break; + case 'l': + if (0U != (flag & (uint32_t)kSCANF_LengthMask)) + { + /* Match failure. */ + match_failure = true; + break; + } + + if (c[1] == 'l') + { + flag |= (uint32_t)kSCANF_LengthLongLongInt; + c++; + } + else + { + flag |= (uint32_t)kSCANF_LengthLongInt; + } + c++; + break; +#endif /* SCANF_ADVANCED_ENABLE */ +#if SCANF_FLOAT_ENABLE + case 'L': + if (flag & (uint32_t)kSCANF_LengthMask) + { + /* Match failure. */ + match_failure = true; + break; + } + flag |= (uint32_t)kSCANF_LengthLongLongDouble; + c++; + break; +#endif /* SCANF_FLOAT_ENABLE */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (0U != field_width) + { + /* Match failure. */ + match_failure = true; + break; + } + do + { + field_width = field_width * 10U + ((uint32_t)*c - (uint32_t)'0'); + c++; + } while ((*c >= '0') && (*c <= '9')); + break; + case 'd': + base = 10; + flag |= (uint32_t)kSCANF_TypeSinged; + flag |= (uint32_t)kSCANF_DestInt; + c++; + break; + case 'u': + base = 10; + flag |= (uint32_t)kSCANF_DestInt; + c++; + break; + case 'o': + base = 8; + flag |= (uint32_t)kSCANF_DestInt; + c++; + break; + case 'x': + case 'X': + base = 16; + flag |= (uint32_t)kSCANF_DestInt; + c++; + break; + case 'i': + base = 0; + flag |= (uint32_t)kSCANF_DestInt; + c++; + break; +#if SCANF_FLOAT_ENABLE + case 'a': + case 'A': + case 'e': + case 'E': + case 'f': + case 'F': + case 'g': + case 'G': + flag |= kSCANF_DestFloat; + c++; + break; +#endif /* SCANF_FLOAT_ENABLE */ + case 'c': + flag |= (uint32_t)kSCANF_DestChar; + if (0U == field_width) + { + field_width = 1; + } + c++; + break; + case 's': + flag |= (uint32_t)kSCANF_DestString; + c++; + break; + default: + /* Match failure. */ + match_failure = true; + break; + } + + /* Match failure. */ + if (match_failure) + { + return (int)nassigned; + } + } + + if (0U == (flag & (uint32_t)kSCANF_DestMask)) + { + /* Format strings are exhausted. */ + return (int)nassigned; + } + + if (0U == field_width) + { + /* Large than length of a line. */ + field_width = 99; + } + + /* Matching strings in input streams and assign to argument. */ + switch (flag & (uint32_t)kSCANF_DestMask) + { + case (uint32_t)kSCANF_DestChar: + s = (const char *)p; + buf = va_arg(args_ptr, char *); + while (((field_width--) > 0U) && ('\0' != *p)) + { + if (0U == (flag & (uint32_t)kSCANF_Suppress)) + { + *buf++ = *p++; + } + else + { + p++; + } + n_decode++; + } + + if ((0U == (flag & (uint32_t)kSCANF_Suppress)) && (s != p)) + { + nassigned++; + } + break; + case (uint32_t)kSCANF_DestString: + n_decode += DbgConsole_ScanIgnoreWhiteSpace(&p); + s = p; + buf = va_arg(args_ptr, char *); + while ((field_width-- > 0U) && (*p != '\0') && (*p != ' ') && (*p != '\t') && (*p != '\n') && + (*p != '\r') && (*p != '\v') && (*p != '\f')) + { + if (0U != (flag & (uint32_t)kSCANF_Suppress)) + { + p++; + } + else + { + *buf++ = *p++; + } + n_decode++; + } + + if ((0U == (flag & (uint32_t)kSCANF_Suppress)) && (s != p)) + { + /* Add NULL to end of string. */ + *buf = '\0'; + nassigned++; + } + break; + case (uint32_t)kSCANF_DestInt: + n_decode += DbgConsole_ScanIgnoreWhiteSpace(&p); + s = p; + val = 0; + if ((base == 0U) || (base == 16U)) + { + if ((s[0] == '0') && ((s[1] == 'x') || (s[1] == 'X'))) + { + base = 16U; + if (field_width >= 1U) + { + p += 2; + n_decode += 2U; + field_width -= 2U; + } + } + } + + if (base == 0U) + { + if (s[0] == '0') + { + base = 8U; + } + else + { + base = 10U; + } + } + + neg = 1; + switch (*p) + { + case '-': + neg = -1; + n_decode++; + p++; + field_width--; + break; + case '+': + neg = 1; + n_decode++; + p++; + field_width--; + break; + default: + /* MISRA C-2012 Rule 16.4 */ + break; + } + + while ((field_width-- > 0U) && (*p > '\0')) + { + if ((*p <= '9') && (*p >= '0')) + { + temp = *p - '0' + (char)0; + } + else if ((*p <= 'f') && (*p >= 'a')) + { + temp = *p - 'a' + (char)10; + } + else if ((*p <= 'F') && (*p >= 'A')) + { + temp = *p - 'A' + (char)10; + } + else + { + temp = (char)base; + } + + if ((uint8_t)temp >= base) + { + break; + } + else + { + val = (int32_t)base * val + (int32_t)temp; + } + p++; + n_decode++; + } + val *= neg; + if (0U == (flag & (uint32_t)kSCANF_Suppress)) + { +#if SCANF_ADVANCED_ENABLE + switch (flag & (uint32_t)kSCANF_LengthMask) + { + case (uint32_t)kSCANF_LengthChar: + if (0U != (flag & (uint32_t)kSCANF_TypeSinged)) + { + *va_arg(args_ptr, signed char *) = (signed char)val; + } + else + { + *va_arg(args_ptr, unsigned char *) = (unsigned char)val; + } + break; + case (uint32_t)kSCANF_LengthShortInt: + if (0U != (flag & (uint32_t)kSCANF_TypeSinged)) + { + *va_arg(args_ptr, signed short *) = (signed short)val; + } + else + { + *va_arg(args_ptr, unsigned short *) = (unsigned short)val; + } + break; + case (uint32_t)kSCANF_LengthLongInt: + if (0U != (flag & (uint32_t)kSCANF_TypeSinged)) + { + *va_arg(args_ptr, signed long int *) = (signed long int)val; + } + else + { + *va_arg(args_ptr, unsigned long int *) = (unsigned long int)val; + } + break; + case (uint32_t)kSCANF_LengthLongLongInt: + if (0U != (flag & (uint32_t)kSCANF_TypeSinged)) + { + *va_arg(args_ptr, signed long long int *) = (signed long long int)val; + } + else + { + *va_arg(args_ptr, unsigned long long int *) = (unsigned long long int)val; + } + break; + default: + /* The default type is the type int. */ + if (0U != (flag & (uint32_t)kSCANF_TypeSinged)) + { + *va_arg(args_ptr, signed int *) = (signed int)val; + } + else + { + *va_arg(args_ptr, unsigned int *) = (unsigned int)val; + } + break; + } +#else + /* The default type is the type int. */ + if (0U != (flag & (uint32_t)kSCANF_TypeSinged)) + { + *va_arg(args_ptr, signed int *) = (signed int)val; + } + else + { + *va_arg(args_ptr, unsigned int *) = (unsigned int)val; + } +#endif /* SCANF_ADVANCED_ENABLE */ + nassigned++; + } + break; +#if SCANF_FLOAT_ENABLE + case (uint32_t)kSCANF_DestFloat: + n_decode += DbgConsole_ScanIgnoreWhiteSpace(&p); + fnum = strtod(p, (char **)&s); + + if ((fnum >= HUGE_VAL) || (fnum <= -HUGE_VAL)) + { + break; + } + + n_decode += (int)(s) - (int)(p); + p = s; + if (0U == (flag & (uint32_t)kSCANF_Suppress)) + { + if (0U != (flag & (uint32_t)kSCANF_LengthLongLongDouble)) + { + *va_arg(args_ptr, double *) = fnum; + } + else + { + *va_arg(args_ptr, float *) = (float)fnum; + } + nassigned++; + } + break; +#endif /* SCANF_FLOAT_ENABLE */ + default: + /* Match failure. */ + match_failure = true; + break; + } + + /* Match failure. */ + if (match_failure) + { + return (int)nassigned; + } + } + } + return (int)nassigned; +} +#endif /* SDK_DEBUGCONSOLE */ + +/*************Code to support toolchain's printf, scanf *******************************/ +/* These function __write and __read is used to support IAR toolchain to printf and scanf*/ +#if (defined(__ICCARM__)) +#if defined(SDK_DEBUGCONSOLE_UART) +#pragma weak __write +size_t __write(int handle, const unsigned char *buffer, size_t size); +size_t __write(int handle, const unsigned char *buffer, size_t size) +{ + size_t ret; + if (NULL == buffer) + { + /* + * This means that we should flush internal buffers. Since we don't we just return. + * (Remember, "handle" == -1 means that all handles should be flushed.) + */ + ret = (size_t)0; + } + else if ((handle != 1) && (handle != 2)) + { + /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. + */ + ret = (size_t)-1; + } + else if (kSerialPort_None == s_debugConsole.type) + { + /* Do nothing if the debug UART is not initialized. */ + ret = (size_t)-1; + } + else + { + /* Send data. */ + (void)s_debugConsole.putChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], buffer, size); + ret = size; + } + return ret; +} + +#pragma weak __read +size_t __read(int handle, unsigned char *buffer, size_t size); +size_t __read(int handle, unsigned char *buffer, size_t size) +{ + size_t ret; + /* This function only reads from "standard in", for all other file handles it returns failure. */ + if (handle != 0) + { + ret = ((size_t)-1); + } + else if (kSerialPort_None == s_debugConsole.type) + { + /* Do nothing if the debug UART is not initialized. */ + ret = ((size_t)-1); + } + else + { + /* Receive data. */ + (void)s_debugConsole.getChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], buffer, size); + ret = size; + } + return ret; +} +#endif /* SDK_DEBUGCONSOLE_UART */ + +/* support LPC Xpresso with RedLib */ +#elif (defined(__REDLIB__)) + +#if (defined(SDK_DEBUGCONSOLE_UART)) +int __attribute__((weak)) __sys_write(int handle, char *buffer, int size) +{ + if (NULL == buffer) + { + /* return -1 if error. */ + return -1; + } + + /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */ + if ((handle != 1) && (handle != 2)) + { + return -1; + } + + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + + /* Send data. */ + (void)s_debugConsole.putChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)buffer, size); + + return 0; +} + +int __attribute__((weak)) __sys_readc(void) +{ + char tmp; + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + + /* Receive data. */ + s_debugConsole.getChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)&tmp, sizeof(tmp)); + + return tmp; +} +#endif /* SDK_DEBUGCONSOLE_UART */ + +/* These function fputc and fgetc is used to support KEIL toolchain to printf and scanf*/ +#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) +#if defined(SDK_DEBUGCONSOLE_UART) +#if defined(__CC_ARM) +struct __FILE +{ + int handle; + /* + * Whatever you require here. If the only file you are using is standard output using printf() for debugging, + * no file handling is required. + */ +}; +#endif + +/* FILE is typedef in stdio.h. */ +#pragma weak __stdout +#pragma weak __stdin +FILE __stdout; +FILE __stdin; + +#pragma weak fputc +int fputc(int ch, FILE *f) +{ + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + + /* Send data. */ + (void)s_debugConsole.putChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)(&ch), 1); + return 1; +} + +#pragma weak fgetc +int fgetc(FILE *f) +{ + char ch; + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + + /* Receive data. */ + s_debugConsole.getChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)(&ch), 1); + return ch; +} + +/* + * Terminate the program, passing a return code back to the user. + * This function may not return. + */ +void _sys_exit(int returncode) +{ + while (1) + { + } +} + +/* + * Writes a character to the output channel. This function is used + * for last-resort error message output. + */ +void _ttywrch(int ch) +{ + char ench = ch; + /* Send data. */ + s_debugConsole.putChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)(&ench), 1); +} + +char *_sys_command_string(char *cmd, int len) +{ + return (cmd); +} +#endif /* SDK_DEBUGCONSOLE_UART */ + +/* These function __write_r and __read_r are used to support Xtensa Clang toolchain to printf and scanf */ +#elif defined(__XTENSA__) && defined(__XT_CLANG__) +#if defined(SDK_DEBUGCONSOLE_UART) + +int __attribute__((weak)) _write_r(void *ptr, int handle, char *buffer, int size); +int __attribute__((weak)) _write_r(void *ptr, int handle, char *buffer, int size) +{ + if (NULL == buffer) + { + /* return -1 if error. */ + return -1; + } + + /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */ + if ((handle != 1) && (handle != 2)) + { + return -1; + } + + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + + /* Send data. */ + (void)s_debugConsole.putChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)buffer, size); + + return size; +} + +int __attribute__((weak)) _read_r(void *ptr, int handle, char *buffer, int size); +int __attribute__((weak)) _read_r(void *ptr, int handle, char *buffer, int size) +{ + /* This function only reads from "standard in", for all other file handles it returns failure. */ + if (handle != 0) + { + return -1; + } + + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + + /* Receive data. */ + (void)s_debugConsole.getChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)buffer, size); + return size; +} +#endif /* SDK_DEBUGCONSOLE_UART */ + +/* These function __write and __read is used to support ARM_GCC, KDS, Atollic toolchains to printf and scanf*/ +#elif (defined(__GNUC__)) + +#if ((defined(__GNUC__) && (!defined(__MCUXPRESSO)) && (defined(SDK_DEBUGCONSOLE_UART))) || \ + (defined(__MCUXPRESSO) && (defined(SDK_DEBUGCONSOLE_UART)))) +int __attribute__((weak)) _write(int handle, char *buffer, int size); +int __attribute__((weak)) _write(int handle, char *buffer, int size) +{ + if (NULL == buffer) + { + /* return -1 if error. */ + return -1; + } + + /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */ + if ((handle != 1) && (handle != 2)) + { + return -1; + } + + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + + /* Send data. */ + (void)s_debugConsole.putChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)buffer, size); + + return size; +} + +int __attribute__((weak)) _read(int handle, char *buffer, int size); +int __attribute__((weak)) _read(int handle, char *buffer, int size) +{ + /* This function only reads from "standard in", for all other file handles it returns failure. */ + if (handle != 0) + { + return -1; + } + + /* Do nothing if the debug UART is not initialized. */ + if (kSerialPort_None == s_debugConsole.type) + { + return -1; + } + + /* Receive data. */ + (void)s_debugConsole.getChar((hal_uart_handle_t)&s_debugConsole.uartHandleBuffer[0], (uint8_t *)buffer, size); + return size; +} +#endif + +#endif /* __ICCARM__ */ diff --git a/devices/LPC845/utilities/debug_console_lite/fsl_debug_console.h b/devices/LPC845/utilities/debug_console_lite/fsl_debug_console.h new file mode 100644 index 0000000..707e424 --- /dev/null +++ b/devices/LPC845/utilities/debug_console_lite/fsl_debug_console.h @@ -0,0 +1,237 @@ +/* + * Copyright 2017-2018, 2020 NXP + * All rights reserved. + * + * + * SPDX-License-Identifier: BSD-3-Clause + * + * Debug console shall provide input and output functions to scan and print formatted data. + * o Support a format specifier for PRINTF follows this prototype "%[flags][width][.precision][length]specifier" + * - [flags] :'-', '+', '#', ' ', '0' + * - [width]: number (0,1...) + * - [.precision]: number (0,1...) + * - [length]: do not support + * - [specifier]: 'd', 'i', 'f', 'F', 'x', 'X', 'o', 'p', 'u', 'c', 's', 'n' + * o Support a format specifier for SCANF follows this prototype " %[*][width][length]specifier" + * - [*]: is supported. + * - [width]: number (0,1...) + * - [length]: 'h', 'hh', 'l','ll','L'. ignore ('j','z','t') + * - [specifier]: 'd', 'i', 'u', 'f', 'F', 'e', 'E', 'g', 'G', 'a', 'A', 'o', 'c', 's' + */ + +#ifndef _FSL_DEBUGCONSOLE_H_ +#define _FSL_DEBUGCONSOLE_H_ + +#include "fsl_common.h" + +/* + * @addtogroup debugconsole + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @brief Definition select redirect toolchain printf, scanf to uart or not. */ +#define DEBUGCONSOLE_REDIRECT_TO_TOOLCHAIN 0U /*!< Select toolchain printf and scanf. */ +#define DEBUGCONSOLE_REDIRECT_TO_SDK 1U /*!< Select SDK version printf, scanf. */ +#define DEBUGCONSOLE_DISABLE 2U /*!< Disable debugconsole function. */ + +/*! @brief Definition to select sdk or toolchain printf, scanf. */ +#ifndef SDK_DEBUGCONSOLE +#define SDK_DEBUGCONSOLE DEBUGCONSOLE_REDIRECT_TO_SDK +#endif + +#if defined(SDK_DEBUGCONSOLE) && !(SDK_DEBUGCONSOLE) +#include +#else +#include +#endif + +/*! @brief Definition to printf the float number. */ +#ifndef PRINTF_FLOAT_ENABLE +#define PRINTF_FLOAT_ENABLE 0U +#endif /* PRINTF_FLOAT_ENABLE */ + +/*! @brief Definition to scanf the float number. */ +#ifndef SCANF_FLOAT_ENABLE +#define SCANF_FLOAT_ENABLE 0U +#endif /* SCANF_FLOAT_ENABLE */ + +/*! @brief Definition to support advanced format specifier for printf. */ +#ifndef PRINTF_ADVANCED_ENABLE +#define PRINTF_ADVANCED_ENABLE 0U +#endif /* PRINTF_ADVANCED_ENABLE */ + +/*! @brief Definition to support advanced format specifier for scanf. */ +#ifndef SCANF_ADVANCED_ENABLE +#define SCANF_ADVANCED_ENABLE 0U +#endif /* SCANF_ADVANCED_ENABLE */ + +/*! @brief Definition to select redirect toolchain printf, scanf to uart or not. + * + * if SDK_DEBUGCONSOLE defined to 0,it represents select toolchain printf, scanf. + * if SDK_DEBUGCONSOLE defined to 1,it represents select SDK version printf, scanf. + * if SDK_DEBUGCONSOLE defined to 2,it represents disable debugconsole function. + */ +#if SDK_DEBUGCONSOLE == DEBUGCONSOLE_DISABLE /* Disable debug console */ +#define PRINTF +#define SCANF +#define PUTCHAR +#define GETCHAR +#elif SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK /* Select printf, scanf, putchar, getchar of SDK version. */ +#define PRINTF DbgConsole_Printf +#define SCANF DbgConsole_Scanf +#define PUTCHAR DbgConsole_Putchar +#define GETCHAR DbgConsole_Getchar +#elif SDK_DEBUGCONSOLE == \ + DEBUGCONSOLE_REDIRECT_TO_TOOLCHAIN /* Select printf, scanf, putchar, getchar of toolchain. \ */ +#define PRINTF printf +#define SCANF scanf +#define PUTCHAR putchar +#define GETCHAR getchar +#endif /* SDK_DEBUGCONSOLE */ + +typedef enum _serial_port_type +{ + kSerialPort_None = 0U, /*!< Serial port is none */ + kSerialPort_Uart = 1U, /*!< Serial port UART */ +} serial_port_type_t; + +/******************************************************************************* + * Prototypes + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/*! @name Initialization*/ +/* @{ */ + +#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) +/*! + * @brief Initializes the peripheral used for debug messages. + * + * Call this function to enable debug log messages to be output via the specified peripheral, + * frequency of peripheral source clock, and base address at the specified baud rate. + * After this function has returned, stdout and stdin are connected to the selected peripheral. + * + * @param instance The instance of the module.If the device is kSerialPort_Uart, + * the instance is UART peripheral instance. The UART hardware peripheral + * type is determined by UART adapter. For example, if the instance is 1, + * if the lpuart_adapter.c is added to the current project, the UART periheral + * is LPUART1. + * If the uart_adapter.c is added to the current project, the UART periheral + * is UART1. + * @param baudRate The desired baud rate in bits per second. + * @param device Low level device type for the debug console, can be one of the following. + * @arg kSerialPort_Uart. + * @param clkSrcFreq Frequency of peripheral source clock. + * + * @return Indicates whether initialization was successful or not. + * @retval kStatus_Success Execution successfully + * @retval kStatus_Fail Execution failure + */ +status_t DbgConsole_Init(uint8_t instance, uint32_t baudRate, serial_port_type_t device, uint32_t clkSrcFreq); + +/*! + * @brief De-initializes the peripheral used for debug messages. + * + * Call this function to disable debug log messages to be output via the specified peripheral + * base address and at the specified baud rate. + * + * @return Indicates whether de-initialization was successful or not. + */ +status_t DbgConsole_Deinit(void); + +#else +/*! + * Use an error to replace the DbgConsole_Init when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and + * SDK_DEBUGCONSOLE_UART is not defined. + */ +static inline status_t DbgConsole_Init(uint8_t instance, + uint32_t baudRate, + serial_port_type_t device, + uint32_t clkSrcFreq) +{ + (void)instance; + (void)baudRate; + (void)device; + (void)clkSrcFreq; + return (status_t)kStatus_Fail; +} +/*! + * Use an error to replace the DbgConsole_Deinit when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and + * SDK_DEBUGCONSOLE_UART is not defined. + */ +static inline status_t DbgConsole_Deinit(void) +{ + return (status_t)kStatus_Fail; +} + +#endif /* ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) */ + +#if SDK_DEBUGCONSOLE +/*! + * @brief Writes formatted output to the standard output stream. + * + * Call this function to write a formatted output to the standard output stream. + * + * @param fmt_s Format control string. + * @return Returns the number of characters printed or a negative value if an error occurs. + */ +int DbgConsole_Printf(const char *fmt_s, ...); + +/*! + * @brief Writes formatted output to the standard output stream. + * + * Call this function to write a formatted output to the standard output stream. + * + * @param fmt_s Format control string. + * @param formatStringArg Format arguments. + * @return Returns the number of characters printed or a negative value if an error occurs. + */ +int DbgConsole_Vprintf(const char *fmt_s, va_list formatStringArg); + +/*! + * @brief Writes a character to stdout. + * + * Call this function to write a character to stdout. + * + * @param ch Character to be written. + * @return Returns the character written. + */ +int DbgConsole_Putchar(int ch); + +/*! + * @brief Reads formatted data from the standard input stream. + * + * Call this function to read formatted data from the standard input stream. + * + * @param fmt_s Format control string. + * @return Returns the number of fields successfully converted and assigned. + */ +int DbgConsole_Scanf(char *fmt_s, ...); + +/*! + * @brief Reads a character from standard input. + * + * Call this function to read a character from standard input. + * + * @return Returns the character read. + */ +int DbgConsole_Getchar(void); + +#endif /* SDK_DEBUGCONSOLE */ + +/*! @} */ + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/*! @} */ + +#endif /* _FSL_DEBUGCONSOLE_H_ */ diff --git a/devices/LPC845/utilities/debug_console_lite/utility_assert_lite_LPC845.cmake b/devices/LPC845/utilities/debug_console_lite/utility_assert_lite_LPC845.cmake new file mode 100644 index 0000000..94631d0 --- /dev/null +++ b/devices/LPC845/utilities/debug_console_lite/utility_assert_lite_LPC845.cmake @@ -0,0 +1,12 @@ +include_guard(GLOBAL) +message("utility_assert_lite component is included.") + +target_sources(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/fsl_assert.c +) + + +include(component_miniusart_adapter_LPC845) + +include(utility_debug_console_lite_LPC845) + diff --git a/devices/LPC845/utilities/debug_console_lite/utility_debug_console_lite_LPC845.cmake b/devices/LPC845/utilities/debug_console_lite/utility_debug_console_lite_LPC845.cmake new file mode 100644 index 0000000..87f82d7 --- /dev/null +++ b/devices/LPC845/utilities/debug_console_lite/utility_debug_console_lite_LPC845.cmake @@ -0,0 +1,17 @@ +include_guard(GLOBAL) +message("utility_debug_console_lite component is included.") + +target_sources(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/fsl_debug_console.c +) + + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/. +) + + +include(component_miniusart_adapter_LPC845) + +include(driver_common_LPC845) + diff --git a/devices/LPC845/utilities/fsl_sbrk.c b/devices/LPC845/utilities/fsl_sbrk.c new file mode 100644 index 0000000..5727b2f --- /dev/null +++ b/devices/LPC845/utilities/fsl_sbrk.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2019 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#if defined(__GNUC__) +#include +#include +#endif + +#if defined(__GNUC__) +/*! + * @brief Function to override ARMGCC default function _sbrk + * + * _sbrk is called by malloc. ARMGCC default _sbrk compares "SP" register and + * heap end, if heap end is larger than "SP", then _sbrk returns error and + * memory allocation failed. This function changes to compare __HeapLimit with + * heap end. + */ +caddr_t _sbrk(int incr); +caddr_t _sbrk(int incr) +{ + extern char end __asm("end"); + extern char heap_limit __asm("__HeapLimit"); + static char *heap_end; + char *prev_heap_end; + caddr_t ret; + + if (heap_end == NULL) + { + heap_end = &end; + } + + prev_heap_end = heap_end; + + if ((unsigned int)heap_end + (unsigned int)incr > (unsigned int)(&heap_limit)) + { + errno = ENOMEM; + + ret = (caddr_t)-1; + } + else + { + heap_end = (char *)((unsigned int)heap_end + (unsigned int)incr); + + ret = (caddr_t)prev_heap_end; + } + + return ret; +} +#endif diff --git a/devices/LPC845/utilities/utilities_misc_utilities_LPC845.cmake b/devices/LPC845/utilities/utilities_misc_utilities_LPC845.cmake new file mode 100644 index 0000000..1defb77 --- /dev/null +++ b/devices/LPC845/utilities/utilities_misc_utilities_LPC845.cmake @@ -0,0 +1,8 @@ +include_guard(GLOBAL) +message("utilities_misc_utilities component is included.") + +target_sources(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/fsl_sbrk.c +) + + diff --git a/docs/Getting Started Guide for using MCUXpresso SDK online.pdf b/docs/Getting Started Guide for using MCUXpresso SDK online.pdf new file mode 100644 index 0000000..3e1ea44 Binary files /dev/null and b/docs/Getting Started Guide for using MCUXpresso SDK online.pdf differ diff --git a/docs/Getting Started with MCUXpresso SDK.pdf b/docs/Getting Started with MCUXpresso SDK.pdf new file mode 100644 index 0000000..4fa5b94 Binary files /dev/null and b/docs/Getting Started with MCUXpresso SDK.pdf differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845.pdf b/docs/MCUXpresso SDK API Reference Manual_LPC845.pdf new file mode 100644 index 0000000..23db2f1 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845.pdf differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/Kinetis_SDK_Block_Diagram.jpg b/docs/MCUXpresso SDK API Reference Manual_LPC845/Kinetis_SDK_Block_Diagram.jpg new file mode 100644 index 0000000..ac7abd7 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/Kinetis_SDK_Block_Diagram.jpg differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00002.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00002.html new file mode 100644 index 0000000..3301deb --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00002.html @@ -0,0 +1,130 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Trademarks + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
Trademarks
+
+
+

Information in this document is provided solely to enable system and software implementers to use NXP products. There are no express or implied copyright licenses granted hereunder to design or fabricate any integrated circuits based on the information in this document. NXP reserves the right to make changes without further notice to any products herein.

+

How to Reach Us:
+ Home Page: nxp.com
+ Web Support: nxp.com/support
+

+

NXP makes no warranty, representation, or guarantee regarding the suitability of its products for any particular purpose, nor does NXP assume any liability arising out of the application or use of any product or circuit, and specifically disclaims any and all liability, including without limitation consequential or incidental damages. “Typical” parameters that may be provided in NXP data sheets and/or specifications can and do vary in different applications, and actual performance may vary over time. All operating parameters, including “typicals,” must be validated for each customer application by customer's technical experts. NXP does not convey any license under its patent rights nor the rights of others. NXP sells products pursuant to standard terms and conditions of sale, which can be found at the following address: nxp.com/SalesTermsandConditions.

+

NXP, the NXP logo, NXP SECURE CONNECTIONS FOR A SMARTER WORLD, COOLFLUX, EMBRACE, GREENCHIP, HITAG, I2C BUS, ICODE, JCOP, LIFE VIBES, MIFARE, MIFARE CLASSIC, MIFARE DESFire, MIFARE PLUS, MIFARE FLEX, MANTIS, MIFARE ULTRALIGHT, MIFARE4MOBILE, MIGLO, NTAG, ROADLINK, SMARTLX, SMARTMX, STARPLUG, TOPFET, TRENCHMOS, UCODE, Freescale, the Freescale logo, AltiVec, C-5, CodeTEST, CodeWarrior, ColdFire, ColdFire+, C-Ware, the Energy Efficient Solutions logo, Kinetis, Layerscape, MagniV, mobileGT, PEG, PowerQUICC, Processor Expert, QorIQ, QorIQ Qonverge, Ready Play, SafeAssure, the SafeAssure logo, StarCore, Symphony, VortiQa, Vybrid, Airfast, BeeKit, BeeStack, CoreNet, Flexis, MXC, Platform in a Package, QUICC Engine, SMARTMOS, Tower, TurboLink, and UMEMS are trademarks of NXP B.V. All other product or service names are the property of their respective owners. AMBA, Arm, Arm7, Arm7TDMI, Arm9, Arm11, Artisan, big.LITTLE, Cordio, CoreLink, CoreSight, Cortex, DesignStart, DynamIQ, Jazelle, Keil, Mali, Mbed, Mbed Enabled, NEON, POP, RealView, SecurCore, Socrates, Thumb, TrustZone, ULINK, ULINK2, ULINK-ME, ULINK-PLUS, ULINKpro, μVision, Versatile are trademarks or registered trademarks of Arm Limited (or its subsidiaries) in the US and/or elsewhere. The related technology may be protected by any or all of patents, copyrights, designs and trade secrets. All rights reserved. Oracle and Java are registered trademarks of Oracle and/or its affiliates. The Power Architecture and Power.org word marks and the Power and Power.org logos and related marks are trademarks and service marks licensed by Power.org.

+
+nxp_logo_small.png +
+
+arm_logo.png +
+

© 2021 NXP B.V.

+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00004.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00004.html new file mode 100644 index 0000000..536ed15 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00004.html @@ -0,0 +1,159 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Architectural Overview + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
Architectural Overview
+
+
+

This chapter provides the architectural overview for the MCUXpresso Software Development Kit (MCUXpresso SDK). It describes each layer within the architecture and its associated components.

+

Overview

+

The MCUXpresso SDK architecture consists of five key components listed below.

+
    +
  1. +The Arm Cortex Microcontroller Software Interface Standard (CMSIS) CORE compliance device-specific header files, SOC Header, and CMSIS math/DSP libraries.
  2. +
  3. +Peripheral Drivers
  4. +
  5. +Real-time Operating Systems (RTOS)
  6. +
  7. +Stacks and Middleware that integrate with the MCUXpresso SDK
  8. +
  9. +Demo Applications based on the MCUXpresso SDK
  10. +
+
+Kinetis_SDK_Block_Diagram.jpg +
+MCUXpresso SDK Block Diagram
+

MCU header files

+

Each supported MCU device in the MCUXpresso SDK has an overall System-on Chip (SoC) memory-mapped header file. This header file contains the memory map and register base address for each peripheral and the IRQ vector table with associated vector numbers. The overall SoC header file provides access to the peripheral registers through pointers and predefined bit masks. In addition to the overall SoC memory-mapped header file, the MCUXpresso SDK includes a feature header file for each device. The feature header file allows NXP to deliver a single software driver for a given peripheral. The feature file ensures that the driver is properly compiled for the target SOC.

+

CMSIS Support

+

Along with the SoC header files and peripheral extension header files, the MCUXpresso SDK also includes common CMSIS header files for the Arm Cortex-M core and the math and DSP libraries from the latest CMSIS release. The CMSIS DSP library source code is also included for reference.

+

MCUXpresso SDK Peripheral Drivers

+

The MCUXpresso SDK peripheral drivers mainly consist of low-level functional APIs for the MCU product family on-chip peripherals and also of high-level transactional APIs for some bus drivers/DMA driver/eDMA driver to quickly enable the peripherals and perform transfers.

+

All MCUXpresso SDK peripheral drivers only depend on the CMSIS headers, device feature files, fsl_common.h, and fsl_clock.h files so that users can easily pull selected drivers and their dependencies into projects. With the exception of the clock/power-relevant peripherals, each peripheral has its own driver. Peripheral drivers handle the peripheral clock gating/ungating inside the drivers during initialization and deinitialization respectively.

+

Low-level functional APIs provide common peripheral functionality, abstracting the hardware peripheral register accesses into a set of stateless basic functional operations. These APIs primarily focus on the control, configuration, and function of basic peripheral operations. The APIs hide the register access details and various MCU peripheral instantiation differences so that the application can be abstracted from the low-level hardware details. The API prototypes are intentionally similar to help ensure easy portability across supported MCUXpresso SDK devices.

+

Transactional APIs provide a quick method for customers to utilize higher-level functionality of the peripherals. The transactional APIs utilize interrupts and perform asynchronous operations without user intervention. Transactional APIs operate on high-level logic that requires data storage for internal operation context handling. However, the Peripheral Drivers do not allocate this memory space. Rather, the user passes in the memory to the driver for internal driver operation. Transactional APIs ensure the NVIC is enabled properly inside the drivers. The transactional APIs do not meet all customer needs, but provide a baseline for development of custom user APIs.

+

Note that the transactional drivers never disable an NVIC after use. This is due to the shared nature of interrupt vectors on devices. It is up to the user to ensure that NVIC interrupts are properly disabled after usage is complete.

+

Interrupt handling for transactional APIs

+

A double weak mechanism is introduced for drivers with transactional API. The double weak indicates two levels of weak vector entries. See the examples below:

+
PUBWEAK SPI0_IRQHandler
+
PUBWEAK SPI0_DriverIRQHandler
+
SPI0_IRQHandler
+
LDR R0, =SPI0_DriverIRQHandler
+
BX R0
+

The first level of the weak implementation are the functions defined in the vector table. In the devices/<DEVICE_NAME>/<TOOLCHAIN>/startup_<DEVICE_NAME>.s/.S file, the implementation of the first layer weak function calls the second layer of weak function. The implementation of the second layer weak function (ex. SPI0_DriverIRQHandler) jumps to itself (B). The MCUXpresso SDK drivers with transactional APIs provide the reimplementation of the second layer function inside of the peripheral driver. If the MCUXpresso SDK drivers with transactional APIs are linked into the image, the SPI0_DriverIRQHandler is replaced with the function implemented in the MCUXpresso SDK SPI driver.

+

The reason for implementing the double weak functions is to provide a better user experience when using the transactional APIs. For drivers with a transactional function, call the transactional APIs and the drivers complete the interrupt-driven flow. Users are not required to redefine the vector entries out of the box. At the same time, if users are not satisfied by the second layer weak function implemented in the MCUXpresso SDK drivers, users can redefine the first layer weak function and implement their own interrupt handler functions to suit their implementation.

+

The limitation of the double weak mechanism is that it cannot be used for peripherals that share the same vector entry. For this use case, redefine the first layer weak function to enable the desired peripheral interrupt functionality. For example, if the MCU’s UART0 and UART1 share the same vector entry, redefine the UART0_UART1_IRQHandler according to the use case requirements.

+

Feature Header Files

+

The peripheral drivers are designed to be reusable regardless of the peripheral functional differences from one MCU device to another. An overall Peripheral Feature Header File is provided for the MCUXpresso SDK-supported MCU device to define the features or configuration differences for each sub-family device.

+

Application

+

See the Getting Started with MCUXpresso SDK document (MCUXSDKGSUG).

+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00006.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00006.html new file mode 100644 index 0000000..797dd37 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00006.html @@ -0,0 +1,165 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Driver errors status + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
Driver errors status
+
+
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00008.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00008.html new file mode 100644 index 0000000..e6eb16c --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00008.html @@ -0,0 +1,686 @@ + + + + + + +MCUXpresso SDK API Reference Manual: LPC_ACOMP: Analog comparator Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
LPC_ACOMP: Analog comparator Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral driver for the Analog comparator (LPC_ACOMP) module of MCUXpresso SDK devices.

+

+Typical use case

+

+Polling Configuration

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/acomp/acomp_basic

+

+Interrupt Configuration

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/acomp/acomp_interrupt

+ + + + +

+Files

file  fsl_acomp.h
 
+ + + + + + + +

+Data Structures

struct  acomp_config_t
 The structure for ACOMP basic configuration. More...
 
struct  acomp_ladder_config_t
 The structure for ACOMP voltage ladder. More...
 
+ + + + + + + + + + +

+Enumerations

enum  acomp_ladder_reference_voltage_t {
+  kACOMP_LadderRefVoltagePinVDD = 0U, +
+  kACOMP_LadderRefVoltagePinVDDCMP = 1U +
+ }
 The ACOMP ladder reference voltage. More...
 
enum  acomp_interrupt_enable_t {
+  kACOMP_InterruptsFallingEdgeEnable = 0U, +
+  kACOMP_InterruptsRisingEdgeEnable = 1U, +
+  kACOMP_InterruptsBothEdgesEnable = 2U, +
+  kACOMP_InterruptsDisable = 3U +
+ }
 The ACOMP interrupts enable. More...
 
enum  acomp_hysteresis_selection_t {
+  kACOMP_HysteresisNoneSelection = 0U, +
+  kACOMP_Hysteresis5MVSelection = 1U, +
+  kACOMP_Hysteresis10MVSelection = 2U, +
+  kACOMP_Hysteresis20MVSelection = 3U +
+ }
 The ACOMP hysteresis selection. More...
 
+ + + + +

+Driver version

#define FSL_ACOMP_DRIVER_VERSION   (MAKE_VERSION(2, 1, 0))
 ACOMP driver version 2.1.0. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Initialization

void ACOMP_Init (ACOMP_Type *base, const acomp_config_t *config)
 Initialize the ACOMP module. More...
 
void ACOMP_Deinit (ACOMP_Type *base)
 De-initialize the ACOMP module. More...
 
void ACOMP_GetDefaultConfig (acomp_config_t *config)
 Gets an available pre-defined settings for the ACOMP's configuration. More...
 
void ACOMP_EnableInterrupts (ACOMP_Type *base, acomp_interrupt_enable_t enable)
 Enable ACOMP interrupts. More...
 
static bool ACOMP_GetInterruptsStatusFlags (ACOMP_Type *base)
 Get interrupts status flags. More...
 
static void ACOMP_ClearInterruptsStatusFlags (ACOMP_Type *base)
 Clear the ACOMP interrupts status flags. More...
 
static bool ACOMP_GetOutputStatusFlags (ACOMP_Type *base)
 Get ACOMP output status flags. More...
 
static void ACOMP_SetInputChannel (ACOMP_Type *base, uint32_t postiveInputChannel, uint32_t negativeInputChannel)
 Set the ACOMP postive and negative input channel. More...
 
void ACOMP_SetLadderConfig (ACOMP_Type *base, const acomp_ladder_config_t *config)
 Set the voltage ladder configuration. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct acomp_config_t
+
+
+ + + + + + + +

Data Fields

bool enableSyncToBusClk
 If true, Comparator output is synchronized to the bus clock for output to other modules. More...
 
acomp_hysteresis_selection_t hysteresisSelection
 Controls the hysteresis of the comparator. More...
 
+

Field Documentation

+ +
+
+ + + + +
bool acomp_config_t::enableSyncToBusClk
+
+

If false, Comparator output is used directly.

+ +
+
+ +
+
+ + + + +
acomp_hysteresis_selection_t acomp_config_t::hysteresisSelection
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct acomp_ladder_config_t
+
+
+ + + + + + + +

Data Fields

uint8_t ladderValue
 Voltage ladder value. More...
 
acomp_ladder_reference_voltage_t referenceVoltage
 Selects the reference voltage(Vref) for the voltage ladder. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint8_t acomp_ladder_config_t::ladderValue
+
+

00000 = Vss, 00001 = 1*Vref/31, ..., 11111 = Vref.

+ +
+
+ +
+
+ + + + +
acomp_ladder_reference_voltage_t acomp_ladder_config_t::referenceVoltage
+
+ +
+
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_ACOMP_DRIVER_VERSION   (MAKE_VERSION(2, 1, 0))
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + +
Enumerator
kACOMP_LadderRefVoltagePinVDD  +

Supply from pin VDD.

+
kACOMP_LadderRefVoltagePinVDDCMP  +

Supply from pin VDDCMP.

+
+ +
+
+ +
+
+ + + + +
enum acomp_interrupt_enable_t
+
+ + + + + +
Enumerator
kACOMP_InterruptsFallingEdgeEnable  +

Enable the falling edge interrupts.

+
kACOMP_InterruptsRisingEdgeEnable  +

Enable the rising edge interrupts.

+
kACOMP_InterruptsBothEdgesEnable  +

Enable the both edges interrupts.

+
kACOMP_InterruptsDisable  +

Disable the interrupts.

+
+ +
+
+ +
+
+ + + + + +
Enumerator
kACOMP_HysteresisNoneSelection  +

None (the output will switch as the voltages cross).

+
kACOMP_Hysteresis5MVSelection  +

5mV.

+
kACOMP_Hysteresis10MVSelection  +

10mV.

+
kACOMP_Hysteresis20MVSelection  +

20mV.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void ACOMP_Init (ACOMP_Type * base,
const acomp_config_tconfig 
)
+
+
Parameters
+ + + +
baseACOMP peripheral base address.
configPointer to "acomp_config_t" structure.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void ACOMP_Deinit (ACOMP_Type * base)
+
+
Parameters
+ + +
baseACOMP peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void ACOMP_GetDefaultConfig (acomp_config_tconfig)
+
+

This function initializes the converter configuration structure with available settings. The default values are:

+
* config->enableSyncToBusClk = false;
+
* config->hysteresisSelection = kACOMP_hysteresisNoneSelection;
+
*
+

In default configuration, the ACOMP's output would be used directly and switch as the voltages cross.

+
Parameters
+ + +
configPointer to the configuration structure.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void ACOMP_EnableInterrupts (ACOMP_Type * base,
acomp_interrupt_enable_t enable 
)
+
+
Parameters
+ + + +
baseACOMP peripheral base address.
enableEnable/Disable interrupt feature.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static bool ACOMP_GetInterruptsStatusFlags (ACOMP_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseACOMP peripheral base address.
+
+
+
Returns
Reflect the state ACOMP edge-detect status, true or false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void ACOMP_ClearInterruptsStatusFlags (ACOMP_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseACOMP peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static bool ACOMP_GetOutputStatusFlags (ACOMP_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseACOMP peripheral base address.
+
+
+
Returns
Reflect the state of the comparator output, true or false.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void ACOMP_SetInputChannel (ACOMP_Type * base,
uint32_t postiveInputChannel,
uint32_t negativeInputChannel 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseACOMP peripheral base address.
postiveInputChannelThe index of postive input channel.
negativeInputChannelThe index of negative input channel.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void ACOMP_SetLadderConfig (ACOMP_Type * base,
const acomp_ladder_config_tconfig 
)
+
+
Parameters
+ + + +
baseACOMP peripheral base address.
configThe structure for voltage ladder. If the config is NULL, voltage ladder would be diasbled, otherwise the voltage ladder would be configured and enabled.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00008.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00008.js new file mode 100644 index 0000000..e965941 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00008.js @@ -0,0 +1,37 @@ +var a00008 = +[ + [ "acomp_config_t", "a00008.html#a00106", [ + [ "enableSyncToBusClk", "a00008.html#a6f9542645b06542277cb07ea138e5064", null ], + [ "hysteresisSelection", "a00008.html#a46ecb6f7efe54967d816deafdf1c65ce", null ] + ] ], + [ "acomp_ladder_config_t", "a00008.html#a00107", [ + [ "ladderValue", "a00008.html#a8271667393096dad310f8b2e486b1c4b", null ], + [ "referenceVoltage", "a00008.html#a66356c0246938695521e8a0ece69cf11", null ] + ] ], + [ "FSL_ACOMP_DRIVER_VERSION", "a00008.html#ga856c35b78deb42642464ecfdb8dfa8aa", null ], + [ "acomp_ladder_reference_voltage_t", "a00008.html#ga7ad629d52b0a70f95cd2ddb3bee8ab5f", [ + [ "kACOMP_LadderRefVoltagePinVDD", "a00008.html#gga7ad629d52b0a70f95cd2ddb3bee8ab5fa70a5aa61894fc8d2195652c2fa3423aa", null ], + [ "kACOMP_LadderRefVoltagePinVDDCMP", "a00008.html#gga7ad629d52b0a70f95cd2ddb3bee8ab5fa56718eb64fdbbd04648466547b326c35", null ] + ] ], + [ "acomp_interrupt_enable_t", "a00008.html#ga178d521ca2ee7f33d518b30dfb627d20", [ + [ "kACOMP_InterruptsFallingEdgeEnable", "a00008.html#gga178d521ca2ee7f33d518b30dfb627d20ad015e6ad9b09be27a6de122fde6b3997", null ], + [ "kACOMP_InterruptsRisingEdgeEnable", "a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a25801b009aba402b9810189eb8545b8b", null ], + [ "kACOMP_InterruptsBothEdgesEnable", "a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a23743234a07f6c25a2b14cca0cd863c7", null ], + [ "kACOMP_InterruptsDisable", "a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a629a3a054d3fde07b8f1d4974a9d070d", null ] + ] ], + [ "acomp_hysteresis_selection_t", "a00008.html#gaa7c0a15052b6421941faad3c6ea3a5ac", [ + [ "kACOMP_HysteresisNoneSelection", "a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acae003c683374deba88f335221e4f6c62b", null ], + [ "kACOMP_Hysteresis5MVSelection", "a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acae6c2b1547a7e476425962d46b44a00f9", null ], + [ "kACOMP_Hysteresis10MVSelection", "a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5aca25ed95469736b1383c06835f1a59a6f7", null ], + [ "kACOMP_Hysteresis20MVSelection", "a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acab609612c0f5c6987b71f287d0ab8e02c", null ] + ] ], + [ "ACOMP_Init", "a00008.html#gae8afb04a61cd16f74eba67061409cd30", null ], + [ "ACOMP_Deinit", "a00008.html#ga4e2589a3a011cb833649e301be7fff8c", null ], + [ "ACOMP_GetDefaultConfig", "a00008.html#gae217e6b6f23e998b1bfa387e1f3f4181", null ], + [ "ACOMP_EnableInterrupts", "a00008.html#ga33fc82023d54cc469fc62ed866a3ca19", null ], + [ "ACOMP_GetInterruptsStatusFlags", "a00008.html#ga331e1a82fe5f3d36ee0b10ddea928cd0", null ], + [ "ACOMP_ClearInterruptsStatusFlags", "a00008.html#ga013efc3edfbbd3f7f5044fc7bc2ce802", null ], + [ "ACOMP_GetOutputStatusFlags", "a00008.html#ga0ea4f61940e0c270858758d51ae1a4d3", null ], + [ "ACOMP_SetInputChannel", "a00008.html#gaff80c9cfc3eb8114fcdb525b507f7ba3", null ], + [ "ACOMP_SetLadderConfig", "a00008.html#ga6b5b26d4b5e00361635aede71b048ffb", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00009.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00009.html new file mode 100644 index 0000000..9aea973 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00009.html @@ -0,0 +1,2081 @@ + + + + + + +MCUXpresso SDK API Reference Manual: ADC: 12-bit SAR Analog-to-Digital Converter Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
ADC: 12-bit SAR Analog-to-Digital Converter Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral driver for the 12-bit Successive Approximation (SAR) Analog-to-Digital Converter (ADC) module of MCUXpresso SDK devices.

+

+Typical use case

+

+Polling Configuration

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/fsl_adc

+

+Interrupt Configuration

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/fsl_adc

+ + + + +

+Files

file  fsl_adc.h
 
+ + + + + + + + + + +

+Data Structures

struct  adc_config_t
 Define structure for configuring the block. More...
 
struct  adc_conv_seq_config_t
 Define structure for configuring conversion sequence. More...
 
struct  adc_result_info_t
 Define structure of keeping conversion result information. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  _adc_status_flags {
+  kADC_ThresholdCompareFlagOnChn0 = 1U << 0U, +
+  kADC_ThresholdCompareFlagOnChn1 = 1U << 1U, +
+  kADC_ThresholdCompareFlagOnChn2 = 1U << 2U, +
+  kADC_ThresholdCompareFlagOnChn3 = 1U << 3U, +
+  kADC_ThresholdCompareFlagOnChn4 = 1U << 4U, +
+  kADC_ThresholdCompareFlagOnChn5 = 1U << 5U, +
+  kADC_ThresholdCompareFlagOnChn6 = 1U << 6U, +
+  kADC_ThresholdCompareFlagOnChn7 = 1U << 7U, +
+  kADC_ThresholdCompareFlagOnChn8 = 1U << 8U, +
+  kADC_ThresholdCompareFlagOnChn9 = 1U << 9U, +
+  kADC_ThresholdCompareFlagOnChn10 = 1U << 10U, +
+  kADC_ThresholdCompareFlagOnChn11 = 1U << 11U, +
+  kADC_OverrunFlagForChn0, +
+  kADC_OverrunFlagForChn1, +
+  kADC_OverrunFlagForChn2, +
+  kADC_OverrunFlagForChn3, +
+  kADC_OverrunFlagForChn4, +
+  kADC_OverrunFlagForChn5, +
+  kADC_OverrunFlagForChn6, +
+  kADC_OverrunFlagForChn7, +
+  kADC_OverrunFlagForChn8, +
+  kADC_OverrunFlagForChn9, +
+  kADC_OverrunFlagForChn10, +
+  kADC_OverrunFlagForChn11, +
+  kADC_GlobalOverrunFlagForSeqA = 1U << 24U, +
+  kADC_GlobalOverrunFlagForSeqB = 1U << 25U, +
+  kADC_ConvSeqAInterruptFlag = 1U << 28U, +
+  kADC_ConvSeqBInterruptFlag = 1U << 29U, +
+  kADC_ThresholdCompareInterruptFlag = 1U << 30U, +
+  kADC_OverrunInterruptFlag = (int)(1U << 31U) +
+ }
 Flags. More...
 
enum  _adc_interrupt_enable {
+  kADC_ConvSeqAInterruptEnable = ADC_INTEN_SEQA_INTEN_MASK, +
+  kADC_ConvSeqBInterruptEnable = ADC_INTEN_SEQB_INTEN_MASK, +
+  kADC_OverrunInterruptEnable = ADC_INTEN_OVR_INTEN_MASK +
+ }
 Interrupts. More...
 
enum  adc_clock_mode_t {
+  kADC_ClockSynchronousMode, +
+  kADC_ClockAsynchronousMode = 1U +
+ }
 Define selection of clock mode. More...
 
enum  adc_vdda_range_t
 Definfe range of the analog supply voltage VDDA.
 
enum  adc_trigger_polarity_t {
+  kADC_TriggerPolarityNegativeEdge = 0U, +
+  kADC_TriggerPolarityPositiveEdge = 1U +
+ }
 Define selection of polarity of selected input trigger for conversion sequence. More...
 
enum  adc_priority_t {
+  kADC_PriorityLow = 0U, +
+  kADC_PriorityHigh = 1U +
+ }
 Define selection of conversion sequence's priority. More...
 
enum  adc_seq_interrupt_mode_t {
+  kADC_InterruptForEachConversion = 0U, +
+  kADC_InterruptForEachSequence = 1U +
+ }
 Define selection of conversion sequence's interrupt. More...
 
enum  adc_threshold_compare_status_t {
+  kADC_ThresholdCompareInRange = 0U, +
+  kADC_ThresholdCompareBelowRange = 1U, +
+  kADC_ThresholdCompareAboveRange = 2U +
+ }
 Define status of threshold compare result. More...
 
enum  adc_threshold_crossing_status_t {
+  kADC_ThresholdCrossingNoDetected = 0U, +
+  kADC_ThresholdCrossingDownward = 2U, +
+  kADC_ThresholdCrossingUpward = 3U +
+ }
 Define status of threshold crossing detection result. More...
 
enum  adc_threshold_interrupt_mode_t {
+  kADC_ThresholdInterruptDisabled = 0U, +
+  kADC_ThresholdInterruptOnOutside = 1U, +
+  kADC_ThresholdInterruptOnCrossing = 2U +
+ }
 Define interrupt mode for threshold compare event. More...
 
enum  adc_inforesult_t {
+  kADC_Resolution12bitInfoResultShift = 0U, +
+  kADC_Resolution10bitInfoResultShift = 2U, +
+  kADC_Resolution8bitInfoResultShift = 4U, +
+  kADC_Resolution6bitInfoResultShift = 6U +
+ }
 Define the info result mode of different resolution. More...
 
enum  adc_tempsensor_common_mode_t {
+  kADC_HighNegativeOffsetAdded = 0x0U, +
+  kADC_IntermediateNegativeOffsetAdded, +
+  kADC_NoOffsetAdded = 0x8U, +
+  kADC_LowPositiveOffsetAdded = 0xcU +
+ }
 Define common modes for Temerature sensor. More...
 
enum  adc_second_control_t {
+  kADC_Impedance621Ohm = 0x1U << 9U, +
+  kADC_Impedance55kOhm, +
+  kADC_Impedance87kOhm = 0x1fU << 9U, +
+  kADC_NormalFunctionalMode = 0x0U << 14U, +
+  kADC_MultiplexeTestMode = 0x1U << 14U, +
+  kADC_ADCInUnityGainMode = 0x2U << 14U +
+ }
 Define source impedance modes for GPADC control. More...
 
+ + + + +

+Driver version

#define FSL_ADC_DRIVER_VERSION   (MAKE_VERSION(2, 5, 0))
 ADC driver version 2.5.0. More...
 
+ + + + + + + + + + + + + +

+Initialization and Deinitialization

void ADC_Init (ADC_Type *base, const adc_config_t *config)
 Initialize the ADC module. More...
 
void ADC_Deinit (ADC_Type *base)
 Deinitialize the ADC module. More...
 
void ADC_GetDefaultConfig (adc_config_t *config)
 Gets an available pre-defined settings for initial configuration. More...
 
bool ADC_DoSelfCalibration (ADC_Type *base, uint32_t frequency)
 Do the hardware self-calibration. More...
 
+ + + + + + + + + + + + + + + + +

+Control conversion sequence A.

static void ADC_EnableConvSeqA (ADC_Type *base, bool enable)
 Enable the conversion sequence A. More...
 
void ADC_SetConvSeqAConfig (ADC_Type *base, const adc_conv_seq_config_t *config)
 Configure the conversion sequence A. More...
 
static void ADC_DoSoftwareTriggerConvSeqA (ADC_Type *base)
 Do trigger the sequence's conversion by software. More...
 
static void ADC_EnableConvSeqABurstMode (ADC_Type *base, bool enable)
 Enable the burst conversion of sequence A. More...
 
static void ADC_SetConvSeqAHighPriority (ADC_Type *base)
 Set the high priority for conversion sequence A. More...
 
+ + + + + + + + + + + + + + + + +

+Control conversion sequence B.

static void ADC_EnableConvSeqB (ADC_Type *base, bool enable)
 Enable the conversion sequence B. More...
 
void ADC_SetConvSeqBConfig (ADC_Type *base, const adc_conv_seq_config_t *config)
 Configure the conversion sequence B. More...
 
static void ADC_DoSoftwareTriggerConvSeqB (ADC_Type *base)
 Do trigger the sequence's conversion by software. More...
 
static void ADC_EnableConvSeqBBurstMode (ADC_Type *base, bool enable)
 Enable the burst conversion of sequence B. More...
 
static void ADC_SetConvSeqBHighPriority (ADC_Type *base)
 Set the high priority for conversion sequence B. More...
 
+ + + + + + + + + + +

+Data result.

bool ADC_GetConvSeqAGlobalConversionResult (ADC_Type *base, adc_result_info_t *info)
 Get the global ADC conversion infomation of sequence A. More...
 
bool ADC_GetConvSeqBGlobalConversionResult (ADC_Type *base, adc_result_info_t *info)
 Get the global ADC conversion infomation of sequence B. More...
 
bool ADC_GetChannelConversionResult (ADC_Type *base, uint32_t channel, adc_result_info_t *info)
 Get the channel's ADC conversion completed under each conversion sequence. More...
 
+ + + + + + + + + + + + + +

+Threshold function.

static void ADC_SetThresholdPair0 (ADC_Type *base, uint32_t lowValue, uint32_t highValue)
 Set the threshhold pair 0 with low and high value. More...
 
static void ADC_SetThresholdPair1 (ADC_Type *base, uint32_t lowValue, uint32_t highValue)
 Set the threshhold pair 1 with low and high value. More...
 
static void ADC_SetChannelWithThresholdPair0 (ADC_Type *base, uint32_t channelMask)
 Set given channels to apply the threshold pare 0. More...
 
static void ADC_SetChannelWithThresholdPair1 (ADC_Type *base, uint32_t channelMask)
 Set given channels to apply the threshold pare 1. More...
 
+ + + + + + + + + + +

+Interrupts.

static void ADC_EnableInterrupts (ADC_Type *base, uint32_t mask)
 Enable interrupts for conversion sequences. More...
 
static void ADC_DisableInterrupts (ADC_Type *base, uint32_t mask)
 Disable interrupts for conversion sequence. More...
 
static void ADC_EnableThresholdCompareInterrupt (ADC_Type *base, uint32_t channel, adc_threshold_interrupt_mode_t mode)
 Enable the interrupt of threshold compare event for each channel. More...
 
+ + + + + + + +

+Status.

static uint32_t ADC_GetStatusFlags (ADC_Type *base)
 Get status flags of ADC module. More...
 
static void ADC_ClearStatusFlags (ADC_Type *base, uint32_t mask)
 Clear status flags of ADC module. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct adc_config_t
+
+
+ + + + + + + + + + + + + +

Data Fields

adc_clock_mode_t clockMode
 Select the clock mode for ADC converter. More...
 
uint32_t clockDividerNumber
 This field is only available when using kADC_ClockSynchronousMode for "clockMode" field. More...
 
bool enableLowPowerMode
 
If disable low-power mode, ADC remains activated even when no conversions are
+

requested. More...

 
adc_vdda_range_t voltageRange
 Configure the ADC for the appropriate operating range of the analog supply voltage VDDA. More...
 
+

Field Documentation

+ +
+
+ + + + +
adc_clock_mode_t adc_config_t::clockMode
+
+ +
+
+ +
+
+ + + + +
uint32_t adc_config_t::clockDividerNumber
+
+

The divider would be plused by 1 based on the value in this field. The available range is in 8 bits.

+ +
+
+ +
+
+ + + + +
bool adc_config_t::enableLowPowerMode
+
+

If enable low-power mode, The ADC is automatically powered-down when no conversions are taking place.

+ +
+
+ +
+
+ + + + +
adc_vdda_range_t adc_config_t::voltageRange
+
+

Failure to set the area correctly causes the ADC to return incorrect conversion results.

+ +
+
+ +
+
+ +
+
+ + + + +
struct adc_conv_seq_config_t
+
+
+ + + + + + + + + + + + + + + + + + + +

Data Fields

uint32_t channelMask
 
              Selects which one or more of the ADC channels will be sampled and converted when this
+

sequence is launched. More...

 
uint32_t triggerMask
 
              Selects which one or more of the available hardware trigger sources will cause this
+

conversion sequence to be initiated. More...

 
adc_trigger_polarity_t triggerPolarity
 Select the trigger to launch conversion sequence. More...
 
bool enableSyncBypass
 
             To enable this feature allows the hardware trigger input to bypass synchronization
+

flip-flop stages and therefore shorten the time between the trigger input signal and the start of a conversion. More...

 
bool enableSingleStep
 
             When enabling this feature, a trigger will launch a single conversion on the next
+

channel in the sequence instead of the default response of launching an entire sequence of conversions. More...

 
adc_seq_interrupt_mode_t interruptMode
 Select the interrpt/DMA trigger mode. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint32_t adc_conv_seq_config_t::channelMask
+
+

The masked channels would be involved in current conversion sequence, beginning with the lowest-order. The available range is in 12-bit.

+ +
+
+ +
+
+ + + + +
uint32_t adc_conv_seq_config_t::triggerMask
+
+

The available range is 6-bit.

+ +
+
+ +
+
+ + + + +
adc_trigger_polarity_t adc_conv_seq_config_t::triggerPolarity
+
+ +
+
+ +
+
+ + + + +
bool adc_conv_seq_config_t::enableSyncBypass
+
+ +
+
+ +
+
+ + + + +
bool adc_conv_seq_config_t::enableSingleStep
+
+ +
+
+ +
+
+ + + + +
adc_seq_interrupt_mode_t adc_conv_seq_config_t::interruptMode
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct adc_result_info_t
+
+
+ + + + + + + + + + + + + + + + +

Data Fields

uint32_t result
 Keep the conversion data value. More...
 
adc_threshold_compare_status_t thresholdCompareStatus
 Keep the threshold compare status. More...
 
adc_threshold_crossing_status_t thresholdCorssingStatus
 Keep the threshold crossing status. More...
 
uint32_t channelNumber
 Keep the channel number for this conversion. More...
 
bool overrunFlag
 Keep the status whether the conversion is overrun or not. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint32_t adc_result_info_t::result
+
+ +
+
+ +
+
+ + + + +
adc_threshold_compare_status_t adc_result_info_t::thresholdCompareStatus
+
+ +
+
+ +
+
+ + + + +
adc_threshold_crossing_status_t adc_result_info_t::thresholdCorssingStatus
+
+ +
+
+ +
+
+ + + + +
uint32_t adc_result_info_t::channelNumber
+
+ +
+
+ +
+
+ + + + +
bool adc_result_info_t::overrunFlag
+
+ +
+
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_ADC_DRIVER_VERSION   (MAKE_VERSION(2, 5, 0))
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum _adc_status_flags
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerator
kADC_ThresholdCompareFlagOnChn0  +

Threshold comparison event on Channel 0.

+
kADC_ThresholdCompareFlagOnChn1  +

Threshold comparison event on Channel 1.

+
kADC_ThresholdCompareFlagOnChn2  +

Threshold comparison event on Channel 2.

+
kADC_ThresholdCompareFlagOnChn3  +

Threshold comparison event on Channel 3.

+
kADC_ThresholdCompareFlagOnChn4  +

Threshold comparison event on Channel 4.

+
kADC_ThresholdCompareFlagOnChn5  +

Threshold comparison event on Channel 5.

+
kADC_ThresholdCompareFlagOnChn6  +

Threshold comparison event on Channel 6.

+
kADC_ThresholdCompareFlagOnChn7  +

Threshold comparison event on Channel 7.

+
kADC_ThresholdCompareFlagOnChn8  +

Threshold comparison event on Channel 8.

+
kADC_ThresholdCompareFlagOnChn9  +

Threshold comparison event on Channel 9.

+
kADC_ThresholdCompareFlagOnChn10  +

Threshold comparison event on Channel 10.

+
kADC_ThresholdCompareFlagOnChn11  +

Threshold comparison event on Channel 11.

+
kADC_OverrunFlagForChn0  +

Mirror the OVERRUN status flag from the result register for ADC channel 0.

+
kADC_OverrunFlagForChn1  +

Mirror the OVERRUN status flag from the result register for ADC channel 1.

+
kADC_OverrunFlagForChn2  +

Mirror the OVERRUN status flag from the result register for ADC channel 2.

+
kADC_OverrunFlagForChn3  +

Mirror the OVERRUN status flag from the result register for ADC channel 3.

+
kADC_OverrunFlagForChn4  +

Mirror the OVERRUN status flag from the result register for ADC channel 4.

+
kADC_OverrunFlagForChn5  +

Mirror the OVERRUN status flag from the result register for ADC channel 5.

+
kADC_OverrunFlagForChn6  +

Mirror the OVERRUN status flag from the result register for ADC channel 6.

+
kADC_OverrunFlagForChn7  +

Mirror the OVERRUN status flag from the result register for ADC channel 7.

+
kADC_OverrunFlagForChn8  +

Mirror the OVERRUN status flag from the result register for ADC channel 8.

+
kADC_OverrunFlagForChn9  +

Mirror the OVERRUN status flag from the result register for ADC channel 9.

+
kADC_OverrunFlagForChn10  +

Mirror the OVERRUN status flag from the result register for ADC channel 10.

+
kADC_OverrunFlagForChn11  +

Mirror the OVERRUN status flag from the result register for ADC channel 11.

+
kADC_GlobalOverrunFlagForSeqA  +

Mirror the glabal OVERRUN status flag for conversion sequence A.

+
kADC_GlobalOverrunFlagForSeqB  +

Mirror the global OVERRUN status flag for conversion sequence B.

+
kADC_ConvSeqAInterruptFlag  +

Sequence A interrupt/DMA trigger.

+
kADC_ConvSeqBInterruptFlag  +

Sequence B interrupt/DMA trigger.

+
kADC_ThresholdCompareInterruptFlag  +

Threshold comparision interrupt flag.

+
kADC_OverrunInterruptFlag  +

Overrun interrupt flag.

+
+ +
+
+ +
+
+ + + + +
enum _adc_interrupt_enable
+
+
Note
Not all the interrupt options are listed here
+ + + + +
Enumerator
kADC_ConvSeqAInterruptEnable  +

Enable interrupt upon completion of each individual conversion in sequence A, or entire sequence.

+
kADC_ConvSeqBInterruptEnable  +

Enable interrupt upon completion of each individual conversion in sequence B, or entire sequence.

+
kADC_OverrunInterruptEnable  +

Enable the detection of an overrun condition on any of the channel data registers will cause an overrun interrupt/DMA trigger.

+
+ +
+
+ +
+
+ + + + +
enum adc_clock_mode_t
+
+ + + +
Enumerator
kADC_ClockSynchronousMode  +

The ADC clock would be derived from the system clock based on "clockDividerNumber".

+
kADC_ClockAsynchronousMode  +

The ADC clock would be based on the SYSCON block's divider.

+
+ +
+
+ +
+
+ + + + +
enum adc_trigger_polarity_t
+
+ + + +
Enumerator
kADC_TriggerPolarityNegativeEdge  +

A negative edge launches the conversion sequence on the trigger(s).

+
kADC_TriggerPolarityPositiveEdge  +

A positive edge launches the conversion sequence on the trigger(s).

+
+ +
+
+ +
+
+ + + + +
enum adc_priority_t
+
+ + + +
Enumerator
kADC_PriorityLow  +

This sequence would be preempted when another sequence is started.

+
kADC_PriorityHigh  +

This sequence would preempt other sequence even when it is started.

+
+ +
+
+ +
+
+ + + + +
enum adc_seq_interrupt_mode_t
+
+ + + +
Enumerator
kADC_InterruptForEachConversion  +

The sequence interrupt/DMA trigger will be set at the end of each individual ADC conversion inside this conversion sequence.

+
kADC_InterruptForEachSequence  +

The sequence interrupt/DMA trigger will be set when the entire set of this sequence conversions completes.

+
+ +
+
+ +
+
+ + + + +
Enumerator
kADC_ThresholdCompareInRange  +

LOW threshold <= conversion value <= HIGH threshold.

+
kADC_ThresholdCompareBelowRange  +

conversion value < LOW threshold.

+
kADC_ThresholdCompareAboveRange  +

conversion value > HIGH threshold.

+
+ +
+
+ +
+
+ + + + +
Enumerator
kADC_ThresholdCrossingNoDetected  +

No threshold Crossing detected.

+
kADC_ThresholdCrossingDownward  +

Downward Threshold Crossing detected.

+
kADC_ThresholdCrossingUpward  +

Upward Threshold Crossing Detected.

+
+ +
+
+ +
+
+ + + + +
Enumerator
kADC_ThresholdInterruptDisabled  +

Threshold comparison interrupt is disabled.

+
kADC_ThresholdInterruptOnOutside  +

Threshold comparison interrupt is enabled on outside threshold.

+
kADC_ThresholdInterruptOnCrossing  +

Threshold comparison interrupt is enabled on crossing threshold.

+
+ +
+
+ +
+
+ + + + +
enum adc_inforesult_t
+
+ + + + + +
Enumerator
kADC_Resolution12bitInfoResultShift  +

Info result shift of Resolution12bit.

+
kADC_Resolution10bitInfoResultShift  +

Info result shift of Resolution10bit.

+
kADC_Resolution8bitInfoResultShift  +

Info result shift of Resolution8bit.

+
kADC_Resolution6bitInfoResultShift  +

Info result shift of Resolution6bit.

+
+ +
+
+ +
+
+ + + + + +
Enumerator
kADC_HighNegativeOffsetAdded  +

Temperature sensor common mode: high negative offset added.

+
kADC_IntermediateNegativeOffsetAdded  +

Temperature sensor common mode: intermediate negative offset added.

+
kADC_NoOffsetAdded  +

Temperature sensor common mode: no offset added.

+
kADC_LowPositiveOffsetAdded  +

Temperature sensor common mode: low positive offset added.

+
+ +
+
+ +
+
+ + + + +
enum adc_second_control_t
+
+ + + + + + + +
Enumerator
kADC_Impedance621Ohm  +

Extand ADC sampling time according to source impedance 1: 0.621 kOhm.

+
kADC_Impedance55kOhm  +

Extand ADC sampling time according to source impedance 20 (default): 55 kOhm.

+
kADC_Impedance87kOhm  +

Extand ADC sampling time according to source impedance 31: 87 kOhm.

+
kADC_NormalFunctionalMode  +

TEST mode: Normal functional mode.

+
kADC_MultiplexeTestMode  +

TEST mode: Multiplexer test mode.

+
kADC_ADCInUnityGainMode  +

TEST mode: ADC in unity gain mode.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void ADC_Init (ADC_Type * base,
const adc_config_tconfig 
)
+
+
Parameters
+ + + +
baseADC peripheral base address.
configPointer to configuration structure, see to adc_config_t.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void ADC_Deinit (ADC_Type * base)
+
+
Parameters
+ + +
baseADC peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void ADC_GetDefaultConfig (adc_config_tconfig)
+
+

This function initializes the initial configuration structure with an available settings. The default values are:

+
* config->clockMode = kADC_ClockSynchronousMode;
+
* config->clockDividerNumber = 0U;
+
* config->resolution = kADC_Resolution12bit;
+
* config->enableBypassCalibration = false;
+
* config->sampleTimeNumber = 0U;
+
*
+
Parameters
+ + +
configPointer to configuration structure.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool ADC_DoSelfCalibration (ADC_Type * base,
uint32_t frequency 
)
+
+

To calibrate the ADC, set the ADC clock to 500 kHz. In order to achieve the specified ADC accuracy, the A/D converter must be recalibrated, at a minimum, following every chip reset before initiating normal ADC operation.

+
Parameters
+ + + +
baseADC peripheral base address.
frequencyThe clock frequency that ADC operates at.
+
+
+
Return values
+ + + +
trueCalibration succeed.
falseCalibration failed.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void ADC_EnableConvSeqA (ADC_Type * base,
bool enable 
)
+
+inlinestatic
+
+

In order to avoid spuriously triggering the sequence, the trigger to conversion sequence should be ready before the sequence is ready. when the sequence is disabled, the trigger would be ignored. Also, it is suggested to disable the sequence during changing the sequence's setting.

+
Parameters
+ + + +
baseADC peripheral base address.
enableSwitcher to enable the feature or not.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void ADC_SetConvSeqAConfig (ADC_Type * base,
const adc_conv_seq_config_tconfig 
)
+
+
Parameters
+ + + +
baseADC peripheral base address.
configPointer to configuration structure, see to adc_conv_seq_config_t.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void ADC_DoSoftwareTriggerConvSeqA (ADC_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseADC peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void ADC_EnableConvSeqABurstMode (ADC_Type * base,
bool enable 
)
+
+inlinestatic
+
+

Enable the burst mode would cause the conversion sequence to be cntinuously cycled through. Other triggers would be ignored while this mode is enabled. Repeated conversions could be halted by disabling this mode. And the sequence currently in process will be completed before cnversions are terminated. Note that a new sequence could begin just before the burst mode is disabled.

+
Parameters
+ + + +
baseADC peripheral base address.
enableSwitcher to enable this feature.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void ADC_SetConvSeqAHighPriority (ADC_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseADC peripheral bass address.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void ADC_EnableConvSeqB (ADC_Type * base,
bool enable 
)
+
+inlinestatic
+
+

In order to avoid spuriously triggering the sequence, the trigger to conversion sequence should be ready before the sequence is ready. when the sequence is disabled, the trigger would be ignored. Also, it is suggested to disable the sequence during changing the sequence's setting.

+
Parameters
+ + + +
baseADC peripheral base address.
enableSwitcher to enable the feature or not.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void ADC_SetConvSeqBConfig (ADC_Type * base,
const adc_conv_seq_config_tconfig 
)
+
+
Parameters
+ + + +
baseADC peripheral base address.
configPointer to configuration structure, see to adc_conv_seq_config_t.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void ADC_DoSoftwareTriggerConvSeqB (ADC_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseADC peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void ADC_EnableConvSeqBBurstMode (ADC_Type * base,
bool enable 
)
+
+inlinestatic
+
+

Enable the burst mode would cause the conversion sequence to be continuously cycled through. Other triggers would be ignored while this mode is enabled. Repeated conversions could be halted by disabling this mode. And the sequence currently in process will be completed before cnversions are terminated. Note that a new sequence could begin just before the burst mode is disabled.

+
Parameters
+ + + +
baseADC peripheral base address.
enableSwitcher to enable this feature.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void ADC_SetConvSeqBHighPriority (ADC_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseADC peripheral bass address.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool ADC_GetConvSeqAGlobalConversionResult (ADC_Type * base,
adc_result_info_tinfo 
)
+
+
Parameters
+ + + +
baseADC peripheral base address.
infoPointer to information structure, see to adc_result_info_t;
+
+
+
Return values
+ + + +
trueThe conversion result is ready.
falseThe conversion result is not ready yet.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool ADC_GetConvSeqBGlobalConversionResult (ADC_Type * base,
adc_result_info_tinfo 
)
+
+
Parameters
+ + + +
baseADC peripheral base address.
infoPointer to information structure, see to adc_result_info_t;
+
+
+
Return values
+ + + +
trueThe conversion result is ready.
falseThe conversion result is not ready yet.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool ADC_GetChannelConversionResult (ADC_Type * base,
uint32_t channel,
adc_result_info_tinfo 
)
+
+
Parameters
+ + + + +
baseADC peripheral base address.
channelThe indicated channel number.
infoPointer to information structure, see to adc_result_info_t;
+
+
+
Return values
+ + + +
trueThe conversion result is ready.
falseThe conversion result is not ready yet.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void ADC_SetThresholdPair0 (ADC_Type * base,
uint32_t lowValue,
uint32_t highValue 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseADC peripheral base address.
lowValueLOW threshold value.
highValueHIGH threshold value.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void ADC_SetThresholdPair1 (ADC_Type * base,
uint32_t lowValue,
uint32_t highValue 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseADC peripheral base address.
lowValueLOW threshold value. The available value is with 12-bit.
highValueHIGH threshold value. The available value is with 12-bit.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void ADC_SetChannelWithThresholdPair0 (ADC_Type * base,
uint32_t channelMask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseADC peripheral base address.
channelMaskIndicated channels' mask.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void ADC_SetChannelWithThresholdPair1 (ADC_Type * base,
uint32_t channelMask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseADC peripheral base address.
channelMaskIndicated channels' mask.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void ADC_EnableInterrupts (ADC_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseADC peripheral base address.
maskMask of interrupt mask value for global block except each channal, see to _adc_interrupt_enable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void ADC_DisableInterrupts (ADC_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseADC peripheral base address.
maskMask of interrupt mask value for global block except each channel, see to _adc_interrupt_enable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void ADC_EnableThresholdCompareInterrupt (ADC_Type * base,
uint32_t channel,
adc_threshold_interrupt_mode_t mode 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseADC peripheral base address.
channelChannel number.
modeInterrupt mode for threshold compare event, see to adc_threshold_interrupt_mode_t.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t ADC_GetStatusFlags (ADC_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseADC peripheral base address.
+
+
+
Returns
Mask of status flags of module, see to _adc_status_flags.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void ADC_ClearStatusFlags (ADC_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseADC peripheral base address.
maskMask of status flags of module, see to _adc_status_flags.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00009.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00009.js new file mode 100644 index 0000000..00c091a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00009.js @@ -0,0 +1,140 @@ +var a00009 = +[ + [ "adc_config_t", "a00009.html#a00108", [ + [ "clockMode", "a00009.html#ae91bf3a0e56181065cda63613b2cb45f", null ], + [ "clockDividerNumber", "a00009.html#abb59c0a54988e01653f80c8a59d18b1a", null ], + [ "enableLowPowerMode", "a00009.html#a92583334531874821348b01b24f03bed", null ], + [ "voltageRange", "a00009.html#a8edaf01d23b56ec9b6ad0b1a15fca825", null ] + ] ], + [ "adc_conv_seq_config_t", "a00009.html#a00109", [ + [ "channelMask", "a00009.html#ab63c0a8803f4d02e040d55efd8d58e88", null ], + [ "triggerMask", "a00009.html#a53ec8373edca82340278a104721ed8bb", null ], + [ "triggerPolarity", "a00009.html#a280dc4b4d9c35c2411fe92cf3cadb838", null ], + [ "enableSyncBypass", "a00009.html#aaf2640b291a24e4222953c7686007a3b", null ], + [ "enableSingleStep", "a00009.html#abe7f67296372743da67e2eac58f9aafe", null ], + [ "interruptMode", "a00009.html#aa37fa0f5c6c3351f811d4f31f40290ad", null ] + ] ], + [ "adc_result_info_t", "a00009.html#a00110", [ + [ "result", "a00009.html#afa0a0f7e84c888060b963280035378f6", null ], + [ "thresholdCompareStatus", "a00009.html#a1014edddf4d1ea57e751088dcadace6b", null ], + [ "thresholdCorssingStatus", "a00009.html#a443ffd542f5690ca2cb239181db4aaf7", null ], + [ "channelNumber", "a00009.html#a6829bb748bc55409fed8615f6a40bb84", null ], + [ "overrunFlag", "a00009.html#a5d9fd2ad5f95c7b55a72ac1b5d10221f", null ] + ] ], + [ "FSL_ADC_DRIVER_VERSION", "a00009.html#ga5838d9fe654d6e1503be047d08ce5b32", null ], + [ "_adc_status_flags", "a00009.html#ga417e499fb2f1ee7ba05088468b392ce1", [ + [ "kADC_ThresholdCompareFlagOnChn0", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a07b97b0e0329e40c1829ac1e54467279", null ], + [ "kADC_ThresholdCompareFlagOnChn1", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a5f66d1dcf413402eff0001649d32f853", null ], + [ "kADC_ThresholdCompareFlagOnChn2", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a0d600a9a25c74a6a50f013098ec2a7d6", null ], + [ "kADC_ThresholdCompareFlagOnChn3", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a85350dd974c40f8f90151461a5b8de7b", null ], + [ "kADC_ThresholdCompareFlagOnChn4", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aa0666658656409d16593317d233b7daf", null ], + [ "kADC_ThresholdCompareFlagOnChn5", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a2d05c841ef6de9ed853b2847fbd5b389", null ], + [ "kADC_ThresholdCompareFlagOnChn6", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aeab65543e48b53dcb43e6ef75bd4cefa", null ], + [ "kADC_ThresholdCompareFlagOnChn7", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a261489b6eaf9fd1c667f3b7730670c35", null ], + [ "kADC_ThresholdCompareFlagOnChn8", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a091532f8a931257bed8d481d746ce483", null ], + [ "kADC_ThresholdCompareFlagOnChn9", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aad52525faafab93597654764e5b76e97", null ], + [ "kADC_ThresholdCompareFlagOnChn10", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a50a526a957a500f1d1230856e5f62cb0", null ], + [ "kADC_ThresholdCompareFlagOnChn11", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a21a9e76ef0b99eb7970c72ca8f069aa7", null ], + [ "kADC_OverrunFlagForChn0", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a0086e00d201a353a233cd570617b9128", null ], + [ "kADC_OverrunFlagForChn1", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aacd6f79515273a505a65a0dd5c8690b5", null ], + [ "kADC_OverrunFlagForChn2", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aed73601435eac8f9bd001a220d19e751", null ], + [ "kADC_OverrunFlagForChn3", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a17a3e2ddfb6a1b82a873bb4fa23f33e8", null ], + [ "kADC_OverrunFlagForChn4", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1af4df6887691e65370852ca7a92d70ea9", null ], + [ "kADC_OverrunFlagForChn5", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a353d6e15f06ffc2b73459e5d9f8cc0be", null ], + [ "kADC_OverrunFlagForChn6", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ae41a39a8a1f2c74ce8641e22edd91704", null ], + [ "kADC_OverrunFlagForChn7", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ac9443c7ed6d4344ec7c9e3406b6e9dda", null ], + [ "kADC_OverrunFlagForChn8", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a3db46ecb1054e09a7ec16d5b9096022c", null ], + [ "kADC_OverrunFlagForChn9", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aabc9b70b8c8f836ce36bc5fb29b2638c", null ], + [ "kADC_OverrunFlagForChn10", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a373a8f9c3452766d74c2af2dd40a1dd4", null ], + [ "kADC_OverrunFlagForChn11", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a8d637176a1bcc96a375ac279ea15b046", null ], + [ "kADC_GlobalOverrunFlagForSeqA", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a991137c98bcceb8aa70a1a0184117e04", null ], + [ "kADC_GlobalOverrunFlagForSeqB", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a49619f2fea3c5946285d19531f70246b", null ], + [ "kADC_ConvSeqAInterruptFlag", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a6387795dcc8897a8d256cdc4a005d1b7", null ], + [ "kADC_ConvSeqBInterruptFlag", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ae98f97677a7acd69db8c3f1449eb59a2", null ], + [ "kADC_ThresholdCompareInterruptFlag", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a33cf119645a07f65a85a0330e8caac59", null ], + [ "kADC_OverrunInterruptFlag", "a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a648b51f9b03d99e58197f077323cada4", null ] + ] ], + [ "_adc_interrupt_enable", "a00009.html#gac5899c7af1f9cac7695d7171f83be5f0", [ + [ "kADC_ConvSeqAInterruptEnable", "a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0a729a5315c1792954ab9455cc6fdb324a", null ], + [ "kADC_ConvSeqBInterruptEnable", "a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0ac8937ac90396e6c1ab8b3a8c83c530f8", null ], + [ "kADC_OverrunInterruptEnable", "a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0a81d0490f6a7b7fd8301c7af3162c9770", null ] + ] ], + [ "adc_clock_mode_t", "a00009.html#ga4a1dbe9dcaf32c1eaa98849da1217054", [ + [ "kADC_ClockSynchronousMode", "a00009.html#gga4a1dbe9dcaf32c1eaa98849da1217054a411d4bc42ea8ab76ee5d408610e5eaa9", null ], + [ "kADC_ClockAsynchronousMode", "a00009.html#gga4a1dbe9dcaf32c1eaa98849da1217054a39fb72b080b55020c86ff26f3897e58a", null ] + ] ], + [ "adc_vdda_range_t", "a00009.html#gab751f161dbaf5e986c476ef3b15c7d0c", null ], + [ "adc_trigger_polarity_t", "a00009.html#ga538fb95659082602d6ebb205f21573a5", [ + [ "kADC_TriggerPolarityNegativeEdge", "a00009.html#gga538fb95659082602d6ebb205f21573a5a2515d6b46f5b471d516ceff71dda5bb5", null ], + [ "kADC_TriggerPolarityPositiveEdge", "a00009.html#gga538fb95659082602d6ebb205f21573a5a1e29943afcd9c5266a8401565798febe", null ] + ] ], + [ "adc_priority_t", "a00009.html#gab625534aa39c1cd25f18cdc0dc3b9981", [ + [ "kADC_PriorityLow", "a00009.html#ggab625534aa39c1cd25f18cdc0dc3b9981aa47123e81ebbce4dd5905b0b93d0303d", null ], + [ "kADC_PriorityHigh", "a00009.html#ggab625534aa39c1cd25f18cdc0dc3b9981a591af3687c8df2663d34e7d8ff942abe", null ] + ] ], + [ "adc_seq_interrupt_mode_t", "a00009.html#ga3948c83397f351b5ed70bbaf1c5da35b", [ + [ "kADC_InterruptForEachConversion", "a00009.html#gga3948c83397f351b5ed70bbaf1c5da35ba0e0b964334a5fafa867734f43c9302d1", null ], + [ "kADC_InterruptForEachSequence", "a00009.html#gga3948c83397f351b5ed70bbaf1c5da35ba77c1e0c1efa82a0e1d23b38dcdc42e8d", null ] + ] ], + [ "adc_threshold_compare_status_t", "a00009.html#gad47d3fd5553ab75cdf6b95268cb94f20", [ + [ "kADC_ThresholdCompareInRange", "a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a0879cb322fa21eea083514475b2e5c92", null ], + [ "kADC_ThresholdCompareBelowRange", "a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a4957dc189299bb3397555dbb37991903", null ], + [ "kADC_ThresholdCompareAboveRange", "a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a88f6c1b1c2081034a524d1f07bda8479", null ] + ] ], + [ "adc_threshold_crossing_status_t", "a00009.html#gae86929708f4bb8be4cc88dcf50c3db54", [ + [ "kADC_ThresholdCrossingNoDetected", "a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54abf34f1a6b0ab0bb0338143eba9344156", null ], + [ "kADC_ThresholdCrossingDownward", "a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54ac5aec5587ce5a042aed8506c8e732422", null ], + [ "kADC_ThresholdCrossingUpward", "a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54a84de2355e5d40cc75c1ac6e56feb7153", null ] + ] ], + [ "adc_threshold_interrupt_mode_t", "a00009.html#gac6aab6fdd21723cfc6ed4437372521ac", [ + [ "kADC_ThresholdInterruptDisabled", "a00009.html#ggac6aab6fdd21723cfc6ed4437372521aca9302e8f9009ba4561655bb2903156522", null ], + [ "kADC_ThresholdInterruptOnOutside", "a00009.html#ggac6aab6fdd21723cfc6ed4437372521aca699feabaae444d40c7261e26a2872af8", null ], + [ "kADC_ThresholdInterruptOnCrossing", "a00009.html#ggac6aab6fdd21723cfc6ed4437372521acab2db65594aeb9ce82f73ace49535d278", null ] + ] ], + [ "adc_inforesult_t", "a00009.html#gaecfd3ba1bc4b014f3c11bc6f348a28cc", [ + [ "kADC_Resolution12bitInfoResultShift", "a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28cca5925d865b6882eeef54d3389dc2e9f98", null ], + [ "kADC_Resolution10bitInfoResultShift", "a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28cca9923280b0a76bc961bed79aef5ecb0f3", null ], + [ "kADC_Resolution8bitInfoResultShift", "a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28ccae60e431363f005f7830c1751ec9dbb3b", null ], + [ "kADC_Resolution6bitInfoResultShift", "a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28ccaa51dfd6f4acca775dd0838c40eebe25e", null ] + ] ], + [ "adc_tempsensor_common_mode_t", "a00009.html#ga2432b8bc48a2d3ede87fd021faefeaa5", [ + [ "kADC_HighNegativeOffsetAdded", "a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a7a88de53f3fa62d9c9d073619e6f7b77", null ], + [ "kADC_IntermediateNegativeOffsetAdded", "a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a705b5ce05ce8d2499b4ae652c138339b", null ], + [ "kADC_NoOffsetAdded", "a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a524bba486c728e5af9ae263057fe7475", null ], + [ "kADC_LowPositiveOffsetAdded", "a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5ad18ff3e548f2107156eb50a604d26ee5", null ] + ] ], + [ "adc_second_control_t", "a00009.html#gafb17afb34b6114b97b8bfa331465fd23", [ + [ "kADC_Impedance621Ohm", "a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a5f5dc970993e744974494e283be79e2c", null ], + [ "kADC_Impedance55kOhm", "a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a272bdcdc0d5ebca10a10d7f6927f031f", null ], + [ "kADC_Impedance87kOhm", "a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a4538ae9bd911369a26f43c1b5fa1150f", null ], + [ "kADC_NormalFunctionalMode", "a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a8792af738570ae4baa6f58baecc04eff", null ], + [ "kADC_MultiplexeTestMode", "a00009.html#ggafb17afb34b6114b97b8bfa331465fd23aa806598c66d17dadc451cfaab2e6af45", null ], + [ "kADC_ADCInUnityGainMode", "a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a520d81c1c70fab0701cfdcfaa46e1cae", null ] + ] ], + [ "ADC_Init", "a00009.html#gaa407371ebd58e5aa7f75d38bfdad6169", null ], + [ "ADC_Deinit", "a00009.html#ga9e87d0842217dd30d2d9699df580e237", null ], + [ "ADC_GetDefaultConfig", "a00009.html#ga69c1682f87ee05264946329a2532792e", null ], + [ "ADC_DoSelfCalibration", "a00009.html#ga6c5be196874795f6647b18fd1f3443b4", null ], + [ "ADC_EnableConvSeqA", "a00009.html#ga0576bc613006f8a4d3bb6db93167be65", null ], + [ "ADC_SetConvSeqAConfig", "a00009.html#ga30e86d22d3680c1cf71d5121f162075b", null ], + [ "ADC_DoSoftwareTriggerConvSeqA", "a00009.html#ga13edd8c6ef6665907b00a6a819187292", null ], + [ "ADC_EnableConvSeqABurstMode", "a00009.html#ga5ed68a2a2706c5086136426769cb3a2b", null ], + [ "ADC_SetConvSeqAHighPriority", "a00009.html#gad5ef8575589083a8db3f508aec014e14", null ], + [ "ADC_EnableConvSeqB", "a00009.html#ga93453ff5ee1ccf1429d5035920cdcd10", null ], + [ "ADC_SetConvSeqBConfig", "a00009.html#gada2a96cbb4d3348b943ae8576bae8e51", null ], + [ "ADC_DoSoftwareTriggerConvSeqB", "a00009.html#ga6bee3a133b58f1badcfded306544d58f", null ], + [ "ADC_EnableConvSeqBBurstMode", "a00009.html#ga4d72a0696ea69cf01a7d121b8e3d1efd", null ], + [ "ADC_SetConvSeqBHighPriority", "a00009.html#ga51d600553349fbb81d96aaed4e1c22e4", null ], + [ "ADC_GetConvSeqAGlobalConversionResult", "a00009.html#ga06879c096d9702b2f378dc2db178e961", null ], + [ "ADC_GetConvSeqBGlobalConversionResult", "a00009.html#gad857bbdf02a2e6e828e45a8573238198", null ], + [ "ADC_GetChannelConversionResult", "a00009.html#gacbd1fa05c3e1095dd2a8a741db533780", null ], + [ "ADC_SetThresholdPair0", "a00009.html#ga473aadea5ea926efb3bc116089a45191", null ], + [ "ADC_SetThresholdPair1", "a00009.html#gac7a9fa5e3222604314a62d3b2f2331f7", null ], + [ "ADC_SetChannelWithThresholdPair0", "a00009.html#ga160dc82588afa2bca1388b35b8e3104d", null ], + [ "ADC_SetChannelWithThresholdPair1", "a00009.html#ga833046b34deacc484675105225a4b0fb", null ], + [ "ADC_EnableInterrupts", "a00009.html#gad4368ec191782815efeea62a95ad3744", null ], + [ "ADC_DisableInterrupts", "a00009.html#gaa134681cb86361faad65aa8c501be403", null ], + [ "ADC_EnableThresholdCompareInterrupt", "a00009.html#gaa1deefb49e6221ba772d755bf4aa1a57", null ], + [ "ADC_GetStatusFlags", "a00009.html#ga92ee1fdbb8cdadbdc1850e94afed432b", null ], + [ "ADC_ClearStatusFlags", "a00009.html#gaa94fca220976d31ee991f1eff9cbe0db", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00010.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00010.html new file mode 100644 index 0000000..7de4e52 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00010.html @@ -0,0 +1,1360 @@ + + + + + + +MCUXpresso SDK API Reference Manual: CAPT: Capacitive Touch + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
CAPT: Capacitive Touch
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral driver for the Capacitive Touch (CAPT) module of MCUXpresso SDK devices.

+

The Capacitive Touch module measures the change in capacitance of an electrode plate when an earth-ground connected object (for example, the finger or stylus) is brought within close proximity. Simply stated, the module delivers a small charge to an X capacitor (a mutual capacitance touch sensor), then transfers that charge to a larger Y capacitor (the measurement capacitor), and counts the number of iterations necessary for the voltage across the Y capacitor to cross a predetermined threshold.

+

+Typical use case

+

+Normal Configuration

+

See the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/capt/capt_basic.

+ + + + +

+Files

file  fsl_capt.h
 
+ + + + + + + +

+Data Structures

struct  capt_config_t
 The structure for CAPT basic configuration. More...
 
struct  capt_touch_data_t
 The structure for storing touch data. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  _capt_xpins {
+  kCAPT_X0Pin = 1U << 0U, +
+  kCAPT_X1Pin = 1U << 1U, +
+  kCAPT_X2Pin = 1U << 2U, +
+  kCAPT_X3Pin = 1U << 3U, +
+  kCAPT_X4Pin = 1U << 4U, +
+  kCAPT_X5Pin = 1U << 5U, +
+  kCAPT_X6Pin = 1U << 6U, +
+  kCAPT_X7Pin = 1U << 7U, +
+  kCAPT_X8Pin = 1U << 8U, +
+  kCAPT_X9Pin = 1U << 9U, +
+  kCAPT_X10Pin = 1U << 10U, +
+  kCAPT_X11Pin = 1U << 11U, +
+  kCAPT_X12Pin = 1U << 12U, +
+  kCAPT_X13Pin = 1U << 13U, +
+  kCAPT_X14Pin = 1U << 14U, +
+  kCAPT_X15Pin = 1U << 15U +
+ }
 The enumeration for X pins. More...
 
enum  _capt_interrupt_enable {
+  kCAPT_InterruptOfYesTouchEnable, +
+  kCAPT_InterruptOfNoTouchEnable, +
+  kCAPT_InterruptOfPollDoneEnable = CAPT_INTENSET_POLLDONE_MASK, +
+  kCAPT_InterruptOfTimeOutEnable = CAPT_INTENSET_TIMEOUT_MASK, +
+  kCAPT_InterruptOfOverRunEnable = CAPT_INTENSET_OVERUN_MASK +
+ }
 The enumeration for enabling/disabling interrupts. More...
 
enum  _capt_interrupt_status_flags {
+  kCAPT_InterruptOfYesTouchStatusFlag = CAPT_INTSTAT_YESTOUCH_MASK, +
+  kCAPT_InterruptOfNoTouchStatusFlag = CAPT_INTSTAT_NOTOUCH_MASK, +
+  kCAPT_InterruptOfPollDoneStatusFlag = CAPT_INTSTAT_POLLDONE_MASK, +
+  kCAPT_InterruptOfTimeOutStatusFlag = CAPT_INTSTAT_TIMEOUT_MASK, +
+  kCAPT_InterruptOfOverRunStatusFlag = CAPT_INTSTAT_OVERUN_MASK +
+ }
 The enumeration for interrupt status flags. More...
 
enum  _capt_status_flags {
+  kCAPT_BusyStatusFlag = CAPT_STATUS_BUSY_MASK, +
+  kCAPT_XMAXStatusFlag = CAPT_STATUS_XMAX_MASK +
+ }
 The enumeration for CAPT status flags. More...
 
enum  capt_trigger_mode_t {
+  kCAPT_YHPortTriggerMode = 0U, +
+  kCAPT_ComparatorTriggerMode = 1U +
+ }
 The enumeration for CAPT trigger mode. More...
 
enum  capt_inactive_xpins_mode_t {
+  kCAPT_InactiveXpinsHighZMode, +
+  kCAPT_InactiveXpinsDrivenLowMode +
+ }
 The enumeration for the inactive X pins mode. More...
 
enum  capt_measurement_delay_t {
+  kCAPT_MeasureDelayNoWait = 0U, +
+  kCAPT_MeasureDelayWait3FCLKs = 1U, +
+  kCAPT_MeasureDelayWait5FCLKs = 2U, +
+  kCAPT_MeasureDelayWait9FCLKs = 3U +
+ }
 The enumeration for the delay of measuring voltage state. More...
 
enum  capt_reset_delay_t {
+  kCAPT_ResetDelayNoWait = 0U, +
+  kCAPT_ResetDelayWait3FCLKs = 1U, +
+  kCAPT_ResetDelayWait5FCLKs = 2U, +
+  kCAPT_ResetDelayWait9FCLKs = 3U +
+ }
 The enumeration for the delay of reseting or draining Cap. More...
 
enum  capt_polling_mode_t {
+  kCAPT_PollInactiveMode, +
+  kCAPT_PollNowMode = 1U, +
+  kCAPT_PollContinuousMode +
+ }
 The enumeration of CAPT polling mode. More...
 
enum  capt_dma_mode_t {
+  kCAPT_DMATriggerOnTouchMode = 1U, +
+  kCAPT_DMATriggerOnBothMode = 2U, +
+  kCAPT_DMATriggerOnAllMode = 3U +
+ }
 The enumeration of CAPT DMA trigger mode. More...
 
+ + + + +

+Driver version

#define FSL_CAPT_DRIVER_VERSION   (MAKE_VERSION(2, 1, 0))
 CAPT driver version. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Initialization

void CAPT_Init (CAPT_Type *base, const capt_config_t *config)
 Initialize the CAPT module. More...
 
void CAPT_Deinit (CAPT_Type *base)
 De-initialize the CAPT module. More...
 
void CAPT_GetDefaultConfig (capt_config_t *config)
 Gets an available pre-defined settings for the CAPT's configuration. More...
 
static void CAPT_SetThreshold (CAPT_Type *base, uint32_t count)
 Set Sets the count threshold in divided FCLKs between touch and no-touch. More...
 
void CAPT_SetPollMode (CAPT_Type *base, capt_polling_mode_t mode)
 Set the CAPT polling mode. More...
 
void CAPT_EnableDMA (CAPT_Type *base, capt_dma_mode_t mode)
 Enable DMA feature. More...
 
void CAPT_DisableDMA (CAPT_Type *base)
 Disable DMA feature. More...
 
static void CAPT_EnableInterrupts (CAPT_Type *base, uint32_t mask)
 Enable interrupt features. More...
 
static void CAPT_DisableInterrupts (CAPT_Type *base, uint32_t mask)
 Disable interrupt features. More...
 
static uint32_t CAPT_GetInterruptStatusFlags (CAPT_Type *base)
 Get CAPT interrupts' status flags. More...
 
static void CAPT_ClearInterruptStatusFlags (CAPT_Type *base, uint32_t mask)
 Clear the interrupts' status flags. More...
 
static uint32_t CAPT_GetStatusFlags (CAPT_Type *base)
 Get CAPT status flags. More...
 
bool CAPT_GetTouchData (CAPT_Type *base, capt_touch_data_t *data)
 Get CAPT touch data. More...
 
void CAPT_PollNow (CAPT_Type *base, uint16_t enableXpins)
 Start touch data polling using poll-now method. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct capt_config_t
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

bool enableWaitMode
 If enable the wait mode, when the touch event occurs, the module will wait until the TOUCH register is read before starting the next measurement. More...
 
bool enableTouchLower
 enableTouchLower = true: Trigger at count < TCNT is a touch. More...
 
uint8_t clockDivider
 Function clock divider. More...
 
uint8_t timeOutCount
 Sets the count value at which a time-out event occurs if a measurement has not triggered. More...
 
uint8_t pollCount
 Sets the time delay between polling rounds (successive sets of X measurements). More...
 
uint16_t enableXpins
 Selects which of the available X pins are enabled. More...
 
capt_trigger_mode_t triggerMode
 Select the menthods of measuring the voltage across the measurement capacitor. More...
 
capt_inactive_xpins_mode_t XpinsMode
 Determines how X pins enabled in the XPINSEL field are controlled when not active. More...
 
capt_measurement_delay_t mDelay
 
       Set the time delay after entering step 3 (measure voltage state), before
+

sampling the YH port pin or analog comarator output. More...

 
capt_reset_delay_t rDelay
 Set the number of divided FCLKs the module will remain in Reset or Draining Cap. More...
 
+

Field Documentation

+ +
+
+ + + + +
bool capt_config_t::enableWaitMode
+
+

Other-wise, measurements continue.

+ +
+
+ +
+
+ + + + +
bool capt_config_t::enableTouchLower
+
+

Trigger at count > TCNT is a no-touch. enableTouchLower = false: Trigger at count > TCNT is a touch. Trigger at count < TCNT is a no-touch. Notice: TCNT will be set by "CAPT_DoCalibration" API.

+ +
+
+ +
+
+ + + + +
uint8_t capt_config_t::clockDivider
+
+

The function clock is divided by clockDivider+1 to produce the divided FCLK for the module. The available range is 0-15.

+ +
+
+ +
+
+ + + + +
uint8_t capt_config_t::timeOutCount
+
+

The time-out count value is calculated as 2^timeOutCount. The available range is 0-12.

+ +
+
+ +
+
+ + + + +
uint8_t capt_config_t::pollCount
+
+

After each polling round completes, the module will wait 4096 x PollCount divided FCLKs before starting the next polling round. The available range is 0-255.

+ +
+
+ +
+
+ + + + +
uint16_t capt_config_t::enableXpins
+
+

Please refer to '_capt_xpins'. For example, if want to enable X0, X2 and X3 pins, you can set "enableXpins = kCAPT_X0Pin | kCAPT_X2Pin | kCAPT_X3Pin".

+ +
+
+ +
+
+ + + + +
capt_trigger_mode_t capt_config_t::triggerMode
+
+ +
+
+ +
+
+ + + + +
capt_inactive_xpins_mode_t capt_config_t::XpinsMode
+
+ +
+
+ +
+
+ + + + +
capt_measurement_delay_t capt_config_t::mDelay
+
+ +
+
+ +
+
+ + + + +
capt_reset_delay_t capt_config_t::rDelay
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct capt_touch_data_t
+
+
+ + + + + + + + + + + + + + + + +

Data Fields

bool yesTimeOut
 'true': if the measurement resulted in a time-out event, 'false': otherwise. More...
 
bool yesTouch
 'true': if the trigger is due to a touch even, 'false': if the trigger is due to a no-touch event. More...
 
uint8_t XpinsIndex
 Contains the index of the X pin for the current measurement, or lowest X for a multiple-pin poll now measurement. More...
 
uint8_t sequenceNumber
 Contains the 4-bit(0-7) sequence number, which increments at the end of each polling round. More...
 
uint16_t count
 Contains the count value reached at trigger or time-out. More...
 
+

Field Documentation

+ +
+
+ + + + +
bool capt_touch_data_t::yesTimeOut
+
+ +
+
+ +
+
+ + + + +
bool capt_touch_data_t::yesTouch
+
+ +
+
+ +
+
+ + + + +
uint8_t capt_touch_data_t::XpinsIndex
+
+ +
+
+ +
+
+ + + + +
uint8_t capt_touch_data_t::sequenceNumber
+
+ +
+
+ +
+
+ + + + +
uint16_t capt_touch_data_t::count
+
+ +
+
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_CAPT_DRIVER_VERSION   (MAKE_VERSION(2, 1, 0))
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum _capt_xpins
+
+ + + + + + + + + + + + + + + + + +
Enumerator
kCAPT_X0Pin  +

CAPT_X0 pin.

+
kCAPT_X1Pin  +

CAPT_X1 pin.

+
kCAPT_X2Pin  +

CAPT_X2 pin.

+
kCAPT_X3Pin  +

CAPT_X3 pin.

+
kCAPT_X4Pin  +

CAPT_X4 pin.

+
kCAPT_X5Pin  +

CAPT_X5 pin.

+
kCAPT_X6Pin  +

CAPT_X6 pin.

+
kCAPT_X7Pin  +

CAPT_X7 pin.

+
kCAPT_X8Pin  +

CAPT_X8 pin.

+
kCAPT_X9Pin  +

CAPT_X9 pin.

+
kCAPT_X10Pin  +

CAPT_X10 pin.

+
kCAPT_X11Pin  +

CAPT_X11 pin.

+
kCAPT_X12Pin  +

CAPT_X12 pin.

+
kCAPT_X13Pin  +

CAPT_X13 pin.

+
kCAPT_X14Pin  +

CAPT_X14 pin.

+
kCAPT_X15Pin  +

CAPT_X15 pin.

+
+ +
+
+ +
+
+ + + + +
enum _capt_interrupt_enable
+
+ + + + + + +
Enumerator
kCAPT_InterruptOfYesTouchEnable  +

Generate interrupt when a touch has been detected.

+
kCAPT_InterruptOfNoTouchEnable  +

Generate interrupt when a no-touch has been detected.

+
kCAPT_InterruptOfPollDoneEnable  +

Genarate interrupt at the end of a polling round, or when a POLLNOW completes.

+
kCAPT_InterruptOfTimeOutEnable  +

Generate interrupt when the count reaches the time-out count value before a trigger occurs.

+
kCAPT_InterruptOfOverRunEnable  +

Generate interrupt when the Touch Data register has been up-dated before software has read the previous data, and the touch has been detected.

+
+ +
+
+ +
+
+ + + + + + +
Enumerator
kCAPT_InterruptOfYesTouchStatusFlag  +

YESTOUCH interrupt status flag.

+
kCAPT_InterruptOfNoTouchStatusFlag  +

NOTOUCH interrupt status flag.

+
kCAPT_InterruptOfPollDoneStatusFlag  +

POLLDONE interrupt status flag.

+
kCAPT_InterruptOfTimeOutStatusFlag  +

TIMEOUT interrupt status flag.

+
kCAPT_InterruptOfOverRunStatusFlag  +

OVERRUN interrupt status flag.

+
+ +
+
+ +
+
+ + + + +
enum _capt_status_flags
+
+ + + +
Enumerator
kCAPT_BusyStatusFlag  +

Set while a poll is currently in progress, otherwise cleared.

+
kCAPT_XMAXStatusFlag  +

The maximum number of X pins available for a given device is equal to XMAX+1.

+
+ +
+
+ +
+
+ + + + +
enum capt_trigger_mode_t
+
+ + + +
Enumerator
kCAPT_YHPortTriggerMode  +

YH port pin trigger mode.

+
kCAPT_ComparatorTriggerMode  +

Analog comparator trigger mode.

+
+ +
+
+ +
+
+ + + + +
enum capt_inactive_xpins_mode_t
+
+ + + +
Enumerator
kCAPT_InactiveXpinsHighZMode  +

Xpins enabled in the XPINSEL field are controlled to HIGH-Z mode when not active.

+
kCAPT_InactiveXpinsDrivenLowMode  +

Xpins enabled in the XPINSEL field are controlled to be driven low mode when not active.

+
+ +
+
+ +
+
+ + + + +
enum capt_measurement_delay_t
+
+ + + + + +
Enumerator
kCAPT_MeasureDelayNoWait  +

Don’t wait.

+
kCAPT_MeasureDelayWait3FCLKs  +

Wait 3 divided FCLKs.

+
kCAPT_MeasureDelayWait5FCLKs  +

Wait 5 divided FCLKs.

+
kCAPT_MeasureDelayWait9FCLKs  +

Wait 9 divided FCLKs.

+
+ +
+
+ +
+
+ + + + +
enum capt_reset_delay_t
+
+ + + + + +
Enumerator
kCAPT_ResetDelayNoWait  +

Don’t wait.

+
kCAPT_ResetDelayWait3FCLKs  +

Wait 3 divided FCLKs.

+
kCAPT_ResetDelayWait5FCLKs  +

Wait 5 divided FCLKs.

+
kCAPT_ResetDelayWait9FCLKs  +

Wait 9 divided FCLKs.

+
+ +
+
+ +
+
+ + + + +
enum capt_polling_mode_t
+
+ + + + +
Enumerator
kCAPT_PollInactiveMode  +

No measurements are taken, no polls are performed.

+

The module remains in the Reset/ Draining Cap.

+
kCAPT_PollNowMode  +

Immediately launches (ignoring Poll Delay) a one-time-only, simultaneous poll of all X pins that are enabled in the XPINSEL field of the Control register, then stops, returning to Reset/Draining Cap.

+
kCAPT_PollContinuousMode  +

Polling rounds are continuously performed, by walking through the enabled X pins.

+
+ +
+
+ +
+
+ + + + +
enum capt_dma_mode_t
+
+ + + + +
Enumerator
kCAPT_DMATriggerOnTouchMode  +

Trigger on touch.

+
kCAPT_DMATriggerOnBothMode  +

Trigger on both touch and no-touch.

+
kCAPT_DMATriggerOnAllMode  +

Trigger on all touch, no-touch and time-out.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void CAPT_Init (CAPT_Type * base,
const capt_config_tconfig 
)
+
+
Parameters
+ + + +
baseCAPT peripheral base address.
configPointer to "capt_config_t" structure.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CAPT_Deinit (CAPT_Type * base)
+
+
Parameters
+ + +
baseCAPT peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CAPT_GetDefaultConfig (capt_config_tconfig)
+
+

This function initializes the converter configuration structure with available settings. The default values are:

+
* config->enableWaitMode = false;
+
* config->enableTouchLower = true;
+
* config->clockDivider = 15U;
+
* config->timeOutCount = 12U;
+
* config->pollCount = 0U;
+
* config->enableXpins = 0U;
+
* config->triggerMode = kCAPT_YHPortTriggerMode;
+
* config->XpinsMode = kCAPT_InactiveXpinsDrivenLowMode;
+
* config->mDelay = kCAPT_MeasureDelayNoWait;
+
* config->rDelay = kCAPT_ResetDelayWait9FCLKs;
+
*
+
Parameters
+ + +
configPointer to the configuration structure.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void CAPT_SetThreshold (CAPT_Type * base,
uint32_t count 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseCAPT peripheral base address.
countThe count threshold.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void CAPT_SetPollMode (CAPT_Type * base,
capt_polling_mode_t mode 
)
+
+
Parameters
+ + + +
baseCAPT peripheral base address.
modeThe selection of polling mode.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void CAPT_EnableDMA (CAPT_Type * base,
capt_dma_mode_t mode 
)
+
+
Parameters
+ + + +
baseCAPT peripheral base address.
modeSelect how DMA triggers are generated.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CAPT_DisableDMA (CAPT_Type * base)
+
+
Parameters
+ + +
baseCAPT peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void CAPT_EnableInterrupts (CAPT_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseCAPT peripheral base address.
maskThe mask of enabling interrupt features. Please refer to "_capt_interrupt_enable".
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void CAPT_DisableInterrupts (CAPT_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseCAPT peripheral base address.
maskThe mask of disabling interrupt features. Please refer to "_capt_interrupt_enable".
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CAPT_GetInterruptStatusFlags (CAPT_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseCAPT peripheral base address.
+
+
+
Returns
The mask of interrupts' status flags. please refer to "_capt_interrupt_status_flags".
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void CAPT_ClearInterruptStatusFlags (CAPT_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseCAPT peripheral base address.
maskThe mask of clearing the interrupts' status flags, please refer to "_capt_interrupt_status_flags".
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CAPT_GetStatusFlags (CAPT_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseCAPT peripheral base address.
+
+
+
Returns
The mask of CAPT status flags. Please refer to "_capt_status_flags" Or use CAPT_GET_XMAX_NUMBER(mask) to get XMAX number.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool CAPT_GetTouchData (CAPT_Type * base,
capt_touch_data_tdata 
)
+
+
Parameters
+ + + +
baseCAPT peripheral base address.
dataThe structure to store touch data.
+
+
+
Returns
If return 'true', which means get valid data. if return 'false', which means get invalid data.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void CAPT_PollNow (CAPT_Type * base,
uint16_t enableXpins 
)
+
+

This function starts new data polling using polling-now method, CAPT stops when the polling is finished, application could check the status or monitor interrupt to know when the progress is finished.

+

Note that this is simultaneous poll of all X pins, all enabled X pins are activated concurrently, rather than walked one-at-a-time

+
Parameters
+ + + +
baseCAPT peripheral base address.
enableXpinsThe X pins enabled in this polling.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00010.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00010.js new file mode 100644 index 0000000..4abbd7f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00010.js @@ -0,0 +1,103 @@ +var a00010 = +[ + [ "capt_config_t", "a00010.html#a00111", [ + [ "enableWaitMode", "a00010.html#a65c26d6fd762782ca1370d3de678e98b", null ], + [ "enableTouchLower", "a00010.html#af153fbc551235805bebdcae4efa95462", null ], + [ "clockDivider", "a00010.html#a9a8da1759cc4ea2b284400908075c871", null ], + [ "timeOutCount", "a00010.html#a2d65011e0db3619f02eacea89b6ab5a3", null ], + [ "pollCount", "a00010.html#ac5c6145f8f3ee5abc6130bea3de2d8c8", null ], + [ "enableXpins", "a00010.html#a22171a4d042ea93fa19f6d7e22caa516", null ], + [ "triggerMode", "a00010.html#a998c94c1d03dc0f2be30ae3a3982585f", null ], + [ "XpinsMode", "a00010.html#a34dffb25e8164ae4addccac265358f00", null ], + [ "mDelay", "a00010.html#a6f8664474411be56853bb70cd8de8b70", null ], + [ "rDelay", "a00010.html#a2023ba3491243edb7ad6be41ea0b0f68", null ] + ] ], + [ "capt_touch_data_t", "a00010.html#a00112", [ + [ "yesTimeOut", "a00010.html#ad73f9e52f210a4ef91e0732ba882c384", null ], + [ "yesTouch", "a00010.html#a5acedab58178a003114a220a5ea3f6f4", null ], + [ "XpinsIndex", "a00010.html#ada6854ef1bf21b8f35acba939c389190", null ], + [ "sequenceNumber", "a00010.html#a3305567326ede24c2f45a2d5b788eb2e", null ], + [ "count", "a00010.html#a2b0d01a9feb8b378e76f4d3240e9ebe8", null ] + ] ], + [ "FSL_CAPT_DRIVER_VERSION", "a00010.html#ga9b69d5e0db52ef3ba10acf4f190b9fc2", null ], + [ "_capt_xpins", "a00010.html#ga2c35cfaacd7e34465baab32d16a4abb5", [ + [ "kCAPT_X0Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ad4b60dd2d35d11a91c11630a7fe91640", null ], + [ "kCAPT_X1Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ac39fdef6bb40a142936848a676f02e49", null ], + [ "kCAPT_X2Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ab8afeb42a5dc990d1114d333e05851e0", null ], + [ "kCAPT_X3Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a4553067b9caa5fd98c1d01074891f5ee", null ], + [ "kCAPT_X4Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5aaccaeef5cb7c021878c1d7c4f5034a76", null ], + [ "kCAPT_X5Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a1a48e4c212d0be7fa18b7d325afc86ed", null ], + [ "kCAPT_X6Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a3ede3850cc844875718179e5a1008900", null ], + [ "kCAPT_X7Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a88ef286dbf5a39b6ee66968632a28efe", null ], + [ "kCAPT_X8Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a9801372f0a31c85b186120eea0c658f8", null ], + [ "kCAPT_X9Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a85bab394942771628a37eb7b0fd5998f", null ], + [ "kCAPT_X10Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a72314787f99f4a5ba7e51c1445fe65f2", null ], + [ "kCAPT_X11Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a53723bf555f64a437f12dff73e7f2188", null ], + [ "kCAPT_X12Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a5ce0c1dfcdfb869146b24d9270edefdc", null ], + [ "kCAPT_X13Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a02ca618c220ce6b97354404817051716", null ], + [ "kCAPT_X14Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a88058e395307862a638c86eaf6528c96", null ], + [ "kCAPT_X15Pin", "a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a3c578a968a4c45b41436d845f456a142", null ] + ] ], + [ "_capt_interrupt_enable", "a00010.html#ga6ac2e06f77196123f25e3f5c79ae6ea5", [ + [ "kCAPT_InterruptOfYesTouchEnable", "a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5ae1bd26a87ec4a5bb4c250856cf1c1994", null ], + [ "kCAPT_InterruptOfNoTouchEnable", "a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5afbc435647bf5d8ec4b8133bb54457d8b", null ], + [ "kCAPT_InterruptOfPollDoneEnable", "a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5ae4a63900c77ec1f5fae1ccea5ca30833", null ], + [ "kCAPT_InterruptOfTimeOutEnable", "a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5a2ce349ca4f3712664ea61a07cbadc63d", null ], + [ "kCAPT_InterruptOfOverRunEnable", "a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5af27b5126282bcda28c64a9e9be550b88", null ] + ] ], + [ "_capt_interrupt_status_flags", "a00010.html#ga6764adb0a0bda236d301256120cddae0", [ + [ "kCAPT_InterruptOfYesTouchStatusFlag", "a00010.html#gga6764adb0a0bda236d301256120cddae0a404cfdab3986fef656232281d68a4e6b", null ], + [ "kCAPT_InterruptOfNoTouchStatusFlag", "a00010.html#gga6764adb0a0bda236d301256120cddae0a1d4948f18e10cda189c9c9f89b76f0f8", null ], + [ "kCAPT_InterruptOfPollDoneStatusFlag", "a00010.html#gga6764adb0a0bda236d301256120cddae0afd67816e707734658900577dfbd4e2bc", null ], + [ "kCAPT_InterruptOfTimeOutStatusFlag", "a00010.html#gga6764adb0a0bda236d301256120cddae0a84d8d50b7d358cbc9612a1751074ee15", null ], + [ "kCAPT_InterruptOfOverRunStatusFlag", "a00010.html#gga6764adb0a0bda236d301256120cddae0ac64c1bc40831fc72981bb42514124e24", null ] + ] ], + [ "_capt_status_flags", "a00010.html#ga86048ff411e845cbde51d9324b5a4b0f", [ + [ "kCAPT_BusyStatusFlag", "a00010.html#gga86048ff411e845cbde51d9324b5a4b0fa1a35bccccdc8b9c911a96a14f6413579", null ], + [ "kCAPT_XMAXStatusFlag", "a00010.html#gga86048ff411e845cbde51d9324b5a4b0fa9210dee59a14aaec97257fac9a20ae9c", null ] + ] ], + [ "capt_trigger_mode_t", "a00010.html#ga0c1eb1e31ad34c8654c981a5e643e2c9", [ + [ "kCAPT_YHPortTriggerMode", "a00010.html#gga0c1eb1e31ad34c8654c981a5e643e2c9aba5349742fd4b19f8a7ccc0bdc9cb514", null ], + [ "kCAPT_ComparatorTriggerMode", "a00010.html#gga0c1eb1e31ad34c8654c981a5e643e2c9a29ad6662e14cd08a6d3771ecbd591619", null ] + ] ], + [ "capt_inactive_xpins_mode_t", "a00010.html#ga01d767059334ad74d416f6c0287f101b", [ + [ "kCAPT_InactiveXpinsHighZMode", "a00010.html#gga01d767059334ad74d416f6c0287f101bac07d74a17c9f9d1b9119b89639f54b9b", null ], + [ "kCAPT_InactiveXpinsDrivenLowMode", "a00010.html#gga01d767059334ad74d416f6c0287f101ba080299d9cd40fafc670901715422dbbc", null ] + ] ], + [ "capt_measurement_delay_t", "a00010.html#ga5ced51d15f9db8f1e6619a5859f6215d", [ + [ "kCAPT_MeasureDelayNoWait", "a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dafe63c76a86da5c022a74985bd052a07f", null ], + [ "kCAPT_MeasureDelayWait3FCLKs", "a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dae787b59b2f377b1ef65d0c13f45e757e", null ], + [ "kCAPT_MeasureDelayWait5FCLKs", "a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dae746038d0fc4423106a252b02ec58ac2", null ], + [ "kCAPT_MeasureDelayWait9FCLKs", "a00010.html#gga5ced51d15f9db8f1e6619a5859f6215da839864dc82a65aa09bccd6c672f23a80", null ] + ] ], + [ "capt_reset_delay_t", "a00010.html#ga4394d9b57a062c83c444e391c4adf855", [ + [ "kCAPT_ResetDelayNoWait", "a00010.html#gga4394d9b57a062c83c444e391c4adf855a306721a69ff013b3f7784bb5d503fa1a", null ], + [ "kCAPT_ResetDelayWait3FCLKs", "a00010.html#gga4394d9b57a062c83c444e391c4adf855a505d962a510aaf415ee47e6d92ca932c", null ], + [ "kCAPT_ResetDelayWait5FCLKs", "a00010.html#gga4394d9b57a062c83c444e391c4adf855aadd3a0bd70e2f2795032fc953d97c677", null ], + [ "kCAPT_ResetDelayWait9FCLKs", "a00010.html#gga4394d9b57a062c83c444e391c4adf855a4d1bfa8129b289d5fe1f56dd980343ea", null ] + ] ], + [ "capt_polling_mode_t", "a00010.html#ga43dfe06b3cce27e03b4b131557a5237b", [ + [ "kCAPT_PollInactiveMode", "a00010.html#gga43dfe06b3cce27e03b4b131557a5237ba70a38885a33a8996934ad68c3322df89", null ], + [ "kCAPT_PollNowMode", "a00010.html#gga43dfe06b3cce27e03b4b131557a5237ba50f00dbce20a1a3390c77501baccf4a0", null ], + [ "kCAPT_PollContinuousMode", "a00010.html#gga43dfe06b3cce27e03b4b131557a5237baca7d1fdc5128af90a17c6e71a9133dda", null ] + ] ], + [ "capt_dma_mode_t", "a00010.html#ga0be2df04c72a8847673bcb6d9714866a", [ + [ "kCAPT_DMATriggerOnTouchMode", "a00010.html#gga0be2df04c72a8847673bcb6d9714866aacf5512e0ec996846318dc272e7366887", null ], + [ "kCAPT_DMATriggerOnBothMode", "a00010.html#gga0be2df04c72a8847673bcb6d9714866aac710d56353625bbc2ed100f6dc28111d", null ], + [ "kCAPT_DMATriggerOnAllMode", "a00010.html#gga0be2df04c72a8847673bcb6d9714866aae7dbcc430de0ec04afa4b600985bfaf7", null ] + ] ], + [ "CAPT_Init", "a00010.html#gafc552b775b278e7e6ea930bb42ca8506", null ], + [ "CAPT_Deinit", "a00010.html#gaea982bc73916fdb713906a2ee49ca604", null ], + [ "CAPT_GetDefaultConfig", "a00010.html#gabbf90a4a70ccba5078feb488011079c5", null ], + [ "CAPT_SetThreshold", "a00010.html#gae9b35ae6b1978ce06851ce86a32af06e", null ], + [ "CAPT_SetPollMode", "a00010.html#gaa5b1edec56bda3e46d42405ca8748b89", null ], + [ "CAPT_EnableDMA", "a00010.html#ga4d8e5e396dee23cff57192632e98a84a", null ], + [ "CAPT_DisableDMA", "a00010.html#ga70d4d9487f981082447042261d13385a", null ], + [ "CAPT_EnableInterrupts", "a00010.html#ga14542b3f1b582974fb19b0bf359cfa17", null ], + [ "CAPT_DisableInterrupts", "a00010.html#ga382fc66ff401d2ba9bdee87e3c8c09ce", null ], + [ "CAPT_GetInterruptStatusFlags", "a00010.html#ga5c6166cad554e91dc0ed36d34b73ee47", null ], + [ "CAPT_ClearInterruptStatusFlags", "a00010.html#gaf59ec5edc272fd42a2b66231a16958eb", null ], + [ "CAPT_GetStatusFlags", "a00010.html#ga6f6b09a873e82dd2fd25338458d0ec0d", null ], + [ "CAPT_GetTouchData", "a00010.html#gaebd796b5bf0c9dff7df7921099d2febb", null ], + [ "CAPT_PollNow", "a00010.html#gae001e6c47608b339f65c8d2dab02c994", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00011.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00011.html new file mode 100644 index 0000000..699d19b --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00011.html @@ -0,0 +1,2411 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Clock Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
Clock Driver
+
+
+

Overview

+

The MCUXpresso SDK provides APIs for MCUXpresso SDK devices' clock operation.

+

The clock driver supports:

+
    +
  • Clock generator (PLL, FLL, and so on) configuration
  • +
  • Clock mux and divider configuration
  • +
  • Getting clock frequency
  • +
+

The MCUXpresso SDK provides a peripheral clock driver for the SYSCON module of MCUXpresso SDK devices.

+

+Function description

+

Clock driver provides these functions:

+
    +
  • Functions to initialize the Core clock to given frequency
  • +
  • Functions to configure the clock selection muxes.
  • +
  • Functions to setup peripheral clock dividers
  • +
  • Functions to set the flash wait states for the input freuqency
  • +
  • Functions to get the frequency of the selected clock
  • +
  • Functions to set PLL frequency
  • +
+

+SYSCON Clock frequency functions

+

SYSCON clock module provides clocks, such as MCLKCLK, ADCCLK, DMICCLK, MCGFLLCLK, FXCOMCLK, WDTOSC, RTCOSC, USBCLK, and SYSPLL. The functions CLOCK_EnableClock() and CLOCK_DisableClock() enables and disables the various clocks. CLOCK_SetupFROClocking() initializes the FRO to 12 MHz, 48 MHz, or 96 MHz frequency. CLOCK_SetupPLLData(), CLOCK_SetupSystemPLLPrec(), and CLOCK_SetPLLFreq() functions are used to setup the PLL. The SYSCON clock driver provides functions to get the frequency of these clocks, such as CLOCK_GetFreq(), CLOCK_GetFro12MFreq(), CLOCK_GetExtClkFreq(), CLOCK_GetWdtOscFreq(), CLOCK_GetFroHfFreq(), CLOCK_GetPllOutFreq(), CLOCK_GetOsc32KFreq(), CLOCK_GetCoreSysClkFreq(), CLOCK_GetI2SMClkFreq(), CLOCK_GetFlexCommClkFreq, and CLOCK_GetAsyncApbClkFreq.

+

+SYSCON clock Selection Muxes

+

The SYSCON clock driver provides the function to configure the clock selected. The function CLOCK_AttachClk() is implemented for this. The function selects the clock source for a particular peripheral like MAINCLK, DMIC, FLEXCOMM, USB, ADC, and PLL.

+

+SYSCON clock dividers

+

The SYSCON clock module provides the function to setup the peripheral clock dividers. The function CLOCK_SetClkDiv() configures the CLKDIV registers for various periperals like USB, DMIC, I2S, SYSTICK, AHB, ADC, and also CLKOUT and TRACE functions.

+

+SYSCON flash wait states

+

The SYSCON clock driver provides the function CLOCK_SetFLASHAccessCyclesForFreq() that configures FLASHCFG register with a selected FLASHTIM value.

+

+Typical use case

+
POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on so that we can switch to its 12MHz mode temporarily 
+ + + +

+Files

file  fsl_clock.h
 
+ + + + +

+Data Structures

struct  clock_sys_pll_t
 PLL configuration structure. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

#define CLOCK_FRO_SETTING_API_ROM_ADDRESS   (0x0F0026F5U)
 FRO clock setting API address in ROM. More...
 
+#define CLOCK_FAIM_BASE   (0x50010000U)
 FAIM base address.
 
#define ADC_CLOCKS
 Clock ip name array for ADC. More...
 
#define ACMP_CLOCKS
 Clock ip name array for ACMP. More...
 
#define DAC_CLOCKS
 Clock ip name array for DAC. More...
 
#define SWM_CLOCKS
 Clock ip name array for SWM. More...
 
#define ROM_CLOCKS
 Clock ip name array for ROM. More...
 
#define SRAM_CLOCKS
 Clock ip name array for SRAM. More...
 
#define IOCON_CLOCKS
 Clock ip name array for IOCON. More...
 
#define GPIO_CLOCKS
 Clock ip name array for GPIO. More...
 
#define GPIO_INT_CLOCKS
 Clock ip name array for GPIO_INT. More...
 
#define DMA_CLOCKS
 Clock ip name array for DMA. More...
 
#define CRC_CLOCKS
 Clock ip name array for CRC. More...
 
#define WWDT_CLOCKS
 Clock ip name array for WWDT. More...
 
#define SCT_CLOCKS
 Clock ip name array for SCT0. More...
 
#define I2C_CLOCKS
 Clock ip name array for I2C. More...
 
#define USART_CLOCKS
 Clock ip name array for I2C. More...
 
#define SPI_CLOCKS
 Clock ip name array for SPI. More...
 
#define CAPT_CLOCKS
 Clock ip name array for CAPT. More...
 
#define CTIMER_CLOCKS
 Clock ip name array for CTIMER. More...
 
#define MTB_CLOCKS
 Clock ip name array for MTB. More...
 
#define MRT_CLOCKS
 Clock ip name array for MRT. More...
 
#define WKT_CLOCKS
 Clock ip name array for WKT. More...
 
#define CLK_GATE_DEFINE(reg, bit)   ((((reg)&0xFFU) << 8U) | ((bit)&0xFFU))
 Internal used Clock definition only. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  clock_ip_name_t {
+  kCLOCK_IpInvalid = 0U, +
+  kCLOCK_Rom = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 1U), +
+  kCLOCK_Ram0_1 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 2U), +
+  kCLOCK_I2c0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 5U), +
+  kCLOCK_Gpio0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 6U), +
+  kCLOCK_Swm = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 7U), +
+  kCLOCK_Sct = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 8U), +
+  kCLOCK_Wkt = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 9U), +
+  kCLOCK_Mrt = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 10U), +
+  kCLOCK_Spi0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 11U), +
+  kCLOCK_Spi1 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 12U), +
+  kCLOCK_Crc = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 13U), +
+  kCLOCK_Uart0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 14U), +
+  kCLOCK_Uart1 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 15U), +
+  kCLOCK_Uart2 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 16U), +
+  kCLOCK_Wwdt = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 17U), +
+  kCLOCK_Iocon = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 18U), +
+  kCLOCK_Acmp = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 19U), +
+  kCLOCK_Gpio1 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 20U), +
+  kCLOCK_I2c1 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 21U), +
+  kCLOCK_I2c2 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 22U), +
+  kCLOCK_I2c3 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 23U), +
+  kCLOCK_Adc = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 24U), +
+  kCLOCK_Ctimer0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 25U), +
+  kCLOCK_Mtb = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 26U), +
+  kCLOCK_Dac0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 27U), +
+  kCLOCK_GpioInt = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 28U), +
+  kCLOCK_Dma = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 29U), +
+  kCLOCK_Uart3 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 30U), +
+  kCLOCK_Uart4 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 31U), +
+  kCLOCK_Capt = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL1, 0U), +
+  kCLOCK_Dac1 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL1, 1U) +
+ }
 Clock gate name used for CLOCK_EnableClock/CLOCK_DisableClock. More...
 
enum  clock_name_t {
+  kCLOCK_CoreSysClk, +
+  kCLOCK_MainClk, +
+  kCLOCK_Fro, +
+  kCLOCK_FroDiv, +
+  kCLOCK_ExtClk, +
+  kCLOCK_PllOut, +
+  kCLOCK_WdtOsc, +
+  kCLOCK_Frg0, +
+  kCLOCK_Frg1 +
+ }
 Clock name used to get clock frequency. More...
 
enum  clock_select_t {
+  kCAPT_Clk_From_Fro = CLK_MUX_DEFINE(CAPTCLKSEL, 0U), +
+  kCAPT_Clk_From_MainClk = CLK_MUX_DEFINE(CAPTCLKSEL, 1U), +
+  kCAPT_Clk_From_SysPll = CLK_MUX_DEFINE(CAPTCLKSEL, 2U), +
+  kCAPT_Clk_From_Fro_Div = CLK_MUX_DEFINE(CAPTCLKSEL, 3U), +
+  kCAPT_Clk_From_WdtOsc = CLK_MUX_DEFINE(CAPTCLKSEL, 4U), +
+  kADC_Clk_From_Fro = CLK_MUX_DEFINE(ADCCLKSEL, 0U), +
+  kADC_Clk_From_SysPll = CLK_MUX_DEFINE(ADCCLKSEL, 1U), +
+  kSCT_Clk_From_Fro = CLK_MUX_DEFINE(SCTCLKSEL, 0U), +
+  kSCT_Clk_From_MainClk = CLK_MUX_DEFINE(SCTCLKSEL, 1U), +
+  kSCT_Clk_From_SysPll = CLK_MUX_DEFINE(SCTCLKSEL, 2U), +
+  kEXT_Clk_From_SysOsc = CLK_MUX_DEFINE(EXTCLKSEL, 0U), +
+  kEXT_Clk_From_ClkIn = CLK_MUX_DEFINE(EXTCLKSEL, 1U), +
+  kUART0_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[0U], 0U), +
+  kUART0_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[0U], 1U), +
+  kUART0_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[0U], 2U), +
+  kUART0_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[0U], 3U), +
+  kUART0_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[0U], 4U), +
+  kUART1_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[1U], 0U), +
+  kUART1_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[1U], 1U), +
+  kUART1_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[1U], 2U), +
+  kUART1_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[1U], 3U), +
+  kUART1_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[1U], 4U), +
+  kUART2_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[2U], 0U), +
+  kUART2_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[2U], 1U), +
+  kUART2_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[2U], 2U), +
+  kUART2_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[2U], 3U), +
+  kUART2_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[2U], 4U), +
+  kUART3_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[3U], 0U), +
+  kUART3_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[3U], 1U), +
+  kUART3_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[3U], 2U), +
+  kUART3_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[3U], 3U), +
+  kUART3_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[3U], 4U), +
+  kUART4_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[4U], 0U), +
+  kUART4_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[4U], 1U), +
+  kUART4_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[4U], 2U), +
+  kUART4_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[4U], 3U), +
+  kUART4_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[4U], 4U), +
+  kI2C0_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[5U], 0U), +
+  kI2C0_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[5U], 1U), +
+  kI2C0_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[5U], 2U), +
+  kI2C0_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[5U], 3U), +
+  kI2C0_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[5U], 4U), +
+  kI2C1_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[6U], 0U), +
+  kI2C1_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[6U], 1U), +
+  kI2C1_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[6U], 2U), +
+  kI2C1_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[6U], 3U), +
+  kI2C1_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[6U], 4U), +
+  kI2C2_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[7U], 0U), +
+  kI2C2_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[7U], 1U), +
+  kI2C2_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[7U], 2U), +
+  kI2C2_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[7U], 3U), +
+  kI2C2_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[7U], 4U), +
+  kI2C3_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[8U], 0U), +
+  kI2C3_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[8U], 1U), +
+  kI2C3_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[8U], 2U), +
+  kI2C3_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[8U], 3U), +
+  kI2C3_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[8U], 4U), +
+  kSPI0_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[9U], 0U), +
+  kSPI0_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[9U], 1U), +
+  kSPI0_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[9U], 2U), +
+  kSPI0_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[9U], 3U), +
+  kSPI0_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[9U], 4U), +
+  kSPI1_Clk_From_Fro = CLK_MUX_DEFINE(FCLKSEL[10U], 0U), +
+  kSPI1_Clk_From_MainClk = CLK_MUX_DEFINE(FCLKSEL[10U], 1U), +
+  kSPI1_Clk_From_Frg0Clk = CLK_MUX_DEFINE(FCLKSEL[10U], 2U), +
+  kSPI1_Clk_From_Frg1Clk = CLK_MUX_DEFINE(FCLKSEL[10U], 3U), +
+  kSPI1_Clk_From_Fro_Div = CLK_MUX_DEFINE(FCLKSEL[10U], 4U), +
+  kFRG0_Clk_From_Fro = CLK_MUX_DEFINE(FRG[0U].FRGCLKSEL, 0U), +
+  kFRG0_Clk_From_MainClk = CLK_MUX_DEFINE(FRG[0U].FRGCLKSEL, 1U), +
+  kFRG0_Clk_From_SysPll = CLK_MUX_DEFINE(FRG[0U].FRGCLKSEL, 2U), +
+  kFRG1_Clk_From_Fro = CLK_MUX_DEFINE(FRG[1U].FRGCLKSEL, 0U), +
+  kFRG1_Clk_From_MainClk = CLK_MUX_DEFINE(FRG[1U].FRGCLKSEL, 1U), +
+  kFRG1_Clk_From_SysPll = CLK_MUX_DEFINE(FRG[1U].FRGCLKSEL, 2U), +
+  kCLKOUT_From_Fro = CLK_MUX_DEFINE(CLKOUTSEL, 0U), +
+  kCLKOUT_From_MainClk = CLK_MUX_DEFINE(CLKOUTSEL, 1U), +
+  kCLKOUT_From_SysPll = CLK_MUX_DEFINE(CLKOUTSEL, 2U), +
+  kCLKOUT_From_ExtClk = CLK_MUX_DEFINE(CLKOUTSEL, 3U), +
+  kCLKOUT_From_WdtOsc = CLK_MUX_DEFINE(CLKOUTSEL, 4U) +
+ }
 Clock Mux Switches CLK_MUX_DEFINE(reg, mux) reg is used to define the mux register mux is used to define the mux value. More...
 
enum  clock_divider_t {
+  kCLOCK_DivAdcClk = CLK_DIV_DEFINE(ADCCLKDIV), +
+  kCLOCK_DivSctClk = CLK_DIV_DEFINE(SCTCLKDIV), +
+  kCLOCK_DivClkOut = CLK_DIV_DEFINE(CLKOUTDIV), +
+  kCLOCK_IOCONCLKDiv6 = CLK_DIV_DEFINE(IOCONCLKDIV6), +
+  kCLOCK_IOCONCLKDiv5 = CLK_DIV_DEFINE(IOCONCLKDIV5), +
+  kCLOCK_IOCONCLKDiv4 = CLK_DIV_DEFINE(IOCONCLKDIV4), +
+  kCLOCK_IOCONCLKDiv3 = CLK_DIV_DEFINE(IOCONCLKDIV3), +
+  kCLOCK_IOCONCLKDiv2 = CLK_DIV_DEFINE(IOCONCLKDIV2), +
+  kCLOCK_IOCONCLKDiv1 = CLK_DIV_DEFINE(IOCONCLKDIV1), +
+  kCLOCK_IOCONCLKDiv0 = CLK_DIV_DEFINE(IOCONCLKDIV0) +
+ }
 Clock divider. More...
 
enum  clock_wdt_analog_freq_t {
+  kCLOCK_WdtAnaFreq0HZ = CLK_WDT_OSC_DEFINE(0U, 0U), +
+  kCLOCK_WdtAnaFreq600KHZ = CLK_WDT_OSC_DEFINE(600000U, 1U), +
+  kCLOCK_WdtAnaFreq1050KHZ = CLK_WDT_OSC_DEFINE(1050000U, 2u), +
+  kCLOCK_WdtAnaFreq1400KHZ = CLK_WDT_OSC_DEFINE(1400000U, 3U), +
+  kCLOCK_WdtAnaFreq1750KHZ = CLK_WDT_OSC_DEFINE(1750000U, 4U), +
+  kCLOCK_WdtAnaFreq2100KHZ = CLK_WDT_OSC_DEFINE(2100000U, 5U), +
+  kCLOCK_WdtAnaFreq2400KHZ = CLK_WDT_OSC_DEFINE(2400000U, 6U), +
+  kCLOCK_WdtAnaFreq2700KHZ = CLK_WDT_OSC_DEFINE(2700000U, 7U), +
+  kCLOCK_WdtAnaFreq3000KHZ = CLK_WDT_OSC_DEFINE(3000000U, 8U), +
+  kCLOCK_WdtAnaFreq3250KHZ = CLK_WDT_OSC_DEFINE(3250000U, 9U), +
+  kCLOCK_WdtAnaFreq3500KHZ = CLK_WDT_OSC_DEFINE(3500000U, 10U), +
+  kCLOCK_WdtAnaFreq3750KHZ = CLK_WDT_OSC_DEFINE(3750000U, 11U), +
+  kCLOCK_WdtAnaFreq4000KHZ = CLK_WDT_OSC_DEFINE(4000000U, 12U), +
+  kCLOCK_WdtAnaFreq4200KHZ = CLK_WDT_OSC_DEFINE(4200000U, 13U), +
+  kCLOCK_WdtAnaFreq4400KHZ = CLK_WDT_OSC_DEFINE(4400000U, 14U), +
+  kCLOCK_WdtAnaFreq4600KHZ = CLK_WDT_OSC_DEFINE(4600000U, 15U) +
+ }
 watch dog analog output frequency More...
 
enum  clock_fro_src_t {
+  kCLOCK_FroSrcLpwrBootValue = 0U, +
+  kCLOCK_FroSrcFroOsc = 1U << SYSCON_FROOSCCTRL_FRO_DIRECT_SHIFT +
+ }
 fro output frequency source definition More...
 
enum  clock_fro_osc_freq_t {
+  kCLOCK_FroOscOut18M = 18000U, +
+  kCLOCK_FroOscOut24M = 24000U, +
+  kCLOCK_FroOscOut30M = 30000U +
+ }
 fro oscillator output frequency value definition More...
 
enum  clock_sys_pll_src {
+  kCLOCK_SysPllSrcFRO = 0U, +
+  kCLOCK_SysPllSrcExtClk = 1U, +
+  kCLOCK_SysPllSrcWdtOsc = 2U, +
+  kCLOCK_SysPllSrcFroDiv = 3U +
+ }
 PLL clock definition. More...
 
enum  clock_main_clk_src_t {
+  kCLOCK_MainClkSrcFro = CLK_MAIN_CLK_MUX_DEFINE(0U, 0U), +
+  kCLOCK_MainClkSrcExtClk = CLK_MAIN_CLK_MUX_DEFINE(1U, 0U), +
+  kCLOCK_MainClkSrcWdtOsc = CLK_MAIN_CLK_MUX_DEFINE(2U, 0U), +
+  kCLOCK_MainClkSrcFroDiv = CLK_MAIN_CLK_MUX_DEFINE(3U, 0U), +
+  kCLOCK_MainClkSrcSysPll = CLK_MAIN_CLK_MUX_DEFINE(0U, 1U) +
+ }
 Main clock source definition. More...
 
+ + + + + + + +

+Variables

volatile uint32_t g_Wdt_Osc_Freq
 watchdog oscilltor clock frequency. More...
 
volatile uint32_t g_Ext_Clk_Freq
 external clock frequency. More...
 
+ + + + +

+Driver version

#define FSL_CLOCK_DRIVER_VERSION   (MAKE_VERSION(2, 3, 3))
 CLOCK driver version 2.3.3. More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Clock gate, mux, and divider.

+static void CLOCK_EnableClock (clock_ip_name_t clk)
 
+static void CLOCK_DisableClock (clock_ip_name_t clk)
 
+static void CLOCK_Select (clock_select_t sel)
 
+static void CLOCK_SetClkDivider (clock_divider_t name, uint32_t value)
 
+static uint32_t CLOCK_GetClkDivider (clock_divider_t name)
 
+static void CLOCK_SetCoreSysClkDiv (uint32_t value)
 
void CLOCK_SetMainClkSrc (clock_main_clk_src_t src)
 Set main clock reference source. More...
 
void CLOCK_SetFroOutClkSrc (clock_fro_src_t src)
 Set FRO clock source. More...
 
+static void CLOCK_SetFRGClkMul (uint32_t *base, uint32_t mul)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Get frequency

uint32_t CLOCK_GetFRG0ClkFreq (void)
 Return Frequency of FRG0 Clock. More...
 
uint32_t CLOCK_GetFRG1ClkFreq (void)
 Return Frequency of FRG1 Clock. More...
 
uint32_t CLOCK_GetMainClkFreq (void)
 Return Frequency of Main Clock. More...
 
uint32_t CLOCK_GetFroFreq (void)
 Return Frequency of FRO. More...
 
static uint32_t CLOCK_GetCoreSysClkFreq (void)
 Return Frequency of core. More...
 
uint32_t CLOCK_GetClockOutClkFreq (void)
 Return Frequency of ClockOut. More...
 
uint32_t CLOCK_GetUart0ClkFreq (void)
 Get UART0 frequency. More...
 
uint32_t CLOCK_GetUart1ClkFreq (void)
 Get UART1 frequency. More...
 
uint32_t CLOCK_GetUart2ClkFreq (void)
 Get UART2 frequency. More...
 
uint32_t CLOCK_GetUart3ClkFreq (void)
 Get UART3 frequency. More...
 
uint32_t CLOCK_GetUart4ClkFreq (void)
 Get UART4 frequency. More...
 
uint32_t CLOCK_GetFreq (clock_name_t clockName)
 Return Frequency of selected clock. More...
 
uint32_t CLOCK_GetSystemPLLInClockRate (void)
 Return System PLL input clock rate. More...
 
static uint32_t CLOCK_GetSystemPLLFreq (void)
 Return Frequency of System PLL. More...
 
static uint32_t CLOCK_GetWdtOscFreq (void)
 Get watch dog OSC frequency. More...
 
static uint32_t CLOCK_GetExtClkFreq (void)
 Get external clock frequency. More...
 
+ + + + + + + +

+PLL operations

void CLOCK_InitSystemPll (const clock_sys_pll_t *config)
 System PLL initialize. More...
 
static void CLOCK_DenitSystemPll (void)
 System PLL Deinitialize. More...
 
+ + + + + + + +

+Fractional clock operations

bool CLOCK_SetFRG0ClkFreq (uint32_t freq)
 Set FRG0 output frequency. More...
 
bool CLOCK_SetFRG1ClkFreq (uint32_t freq)
 Set FRG1 output frequency. More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+External/internal oscillator clock operations

void CLOCK_InitExtClkin (uint32_t clkInFreq)
 Init external CLK IN, select the CLKIN as the external clock source. More...
 
void CLOCK_InitSysOsc (uint32_t oscFreq)
 Init SYS OSC. More...
 
void CLOCK_InitXtalin (uint32_t xtalInFreq)
 XTALIN init function system oscillator is bypassed, sys_osc_clk is fed driectly from the XTALIN. More...
 
+static void CLOCK_DeinitSysOsc (void)
 Deinit SYS OSC.
 
void CLOCK_InitWdtOsc (clock_wdt_analog_freq_t wdtOscFreq, uint32_t wdtOscDiv)
 Init watch dog OSC Any setting of the FREQSEL bits will yield a Fclkana value within 40% of the listed frequency value. More...
 
+static void CLOCK_DeinitWdtOsc (void)
 Deinit watch dog OSC.
 
static void CLOCK_SetFroOscFreq (clock_fro_osc_freq_t freq)
 Set FRO oscillator output frequency. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct clock_sys_pll_t
+
+
+ + + + + + + +

Data Fields

+uint32_t targetFreq
 System pll fclk output frequency, the output frequency should be lower than 100MHZ.
 
+clock_sys_pll_src src
 System pll clock source.
 
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_CLOCK_DRIVER_VERSION   (MAKE_VERSION(2, 3, 3))
+
+ +
+
+ +
+
+ + + + +
#define CLOCK_FRO_SETTING_API_ROM_ADDRESS   (0x0F0026F5U)
+
+ +
+
+ +
+
+ + + + +
#define ADC_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Adc.
Definition: fsl_clock.h:233
+
+
+
+ +
+
+ + + + +
#define ACMP_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Acmp.
Definition: fsl_clock.h:223
+
+
+
+ +
+
+ + + + +
#define DAC_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Dac0.
Definition: fsl_clock.h:239
+
Clock gate name: Dac1.
Definition: fsl_clock.h:251
+
+
+
+ +
+
+ + + + +
#define SWM_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Swm.
Definition: fsl_clock.h:199
+
+
+
+ +
+
+ + + + +
#define ROM_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Rom.
Definition: fsl_clock.h:191
+
+
+
+ +
+
+ + + + +
#define SRAM_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Ram0_1.
Definition: fsl_clock.h:193
+
+
+
+ +
+
+ + + + +
#define IOCON_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Iocon.
Definition: fsl_clock.h:221
+
+
+
+ +
+
+ + + + +
#define GPIO_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Gpio0.
Definition: fsl_clock.h:197
+
Clock gate name: Gpio1.
Definition: fsl_clock.h:225
+
+
+
+ +
+
+ + + + +
#define GPIO_INT_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: GpioInt.
Definition: fsl_clock.h:241
+
+
+
+ +
+
+ + + + +
#define DMA_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Dma.
Definition: fsl_clock.h:243
+
+
+
+ +
+
+ + + + +
#define CRC_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Crc.
Definition: fsl_clock.h:211
+
+
+
+ +
+
+ + + + +
#define WWDT_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Wwdt.
Definition: fsl_clock.h:219
+
+
+
+ +
+
+ + + + +
#define SCT_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Sct.
Definition: fsl_clock.h:201
+
+
+
+ +
+
+ + + + +
#define I2C_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: I2c3.
Definition: fsl_clock.h:231
+
Clock gate name: I2c1.
Definition: fsl_clock.h:227
+
Clock gate name: I2c2.
Definition: fsl_clock.h:229
+
Clock gate name: I2c0.
Definition: fsl_clock.h:195
+
+
+
+ +
+
+ + + + +
#define USART_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Uart2.
Definition: fsl_clock.h:217
+
Clock gate name: Uart0.
Definition: fsl_clock.h:213
+
Clock gate name: Uart3.
Definition: fsl_clock.h:245
+
Clock gate name: Uart1.
Definition: fsl_clock.h:215
+
Clock gate name: Uart4.
Definition: fsl_clock.h:247
+
+
+
+ +
+
+ + + + +
#define SPI_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Spi0.
Definition: fsl_clock.h:207
+
Clock gate name: Spi1.
Definition: fsl_clock.h:209
+
+
+
+ +
+
+ + + + +
#define CAPT_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Capt.
Definition: fsl_clock.h:249
+
+
+
+ +
+
+ + + + +
#define CTIMER_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Ctimer0.
Definition: fsl_clock.h:235
+
+
+
+ +
+
+ + + + +
#define MTB_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Mtb.
Definition: fsl_clock.h:237
+
+
+
+ +
+
+ + + + +
#define MRT_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Mrt.
Definition: fsl_clock.h:205
+
+
+
+ +
+
+ + + + +
#define WKT_CLOCKS
+
+Value:
{ \
+ +
}
+
Clock gate name: Wkt.
Definition: fsl_clock.h:203
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
#define CLK_GATE_DEFINE( reg,
 bit 
)   ((((reg)&0xFFU) << 8U) | ((bit)&0xFFU))
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum clock_ip_name_t
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerator
kCLOCK_IpInvalid  +

Invalid Ip Name.

+
kCLOCK_Rom  +

Clock gate name: Rom.

+
kCLOCK_Ram0_1  +

Clock gate name: Ram0_1.

+
kCLOCK_I2c0  +

Clock gate name: I2c0.

+
kCLOCK_Gpio0  +

Clock gate name: Gpio0.

+
kCLOCK_Swm  +

Clock gate name: Swm.

+
kCLOCK_Sct  +

Clock gate name: Sct.

+
kCLOCK_Wkt  +

Clock gate name: Wkt.

+
kCLOCK_Mrt  +

Clock gate name: Mrt.

+
kCLOCK_Spi0  +

Clock gate name: Spi0.

+
kCLOCK_Spi1  +

Clock gate name: Spi1.

+
kCLOCK_Crc  +

Clock gate name: Crc.

+
kCLOCK_Uart0  +

Clock gate name: Uart0.

+
kCLOCK_Uart1  +

Clock gate name: Uart1.

+
kCLOCK_Uart2  +

Clock gate name: Uart2.

+
kCLOCK_Wwdt  +

Clock gate name: Wwdt.

+
kCLOCK_Iocon  +

Clock gate name: Iocon.

+
kCLOCK_Acmp  +

Clock gate name: Acmp.

+
kCLOCK_Gpio1  +

Clock gate name: Gpio1.

+
kCLOCK_I2c1  +

Clock gate name: I2c1.

+
kCLOCK_I2c2  +

Clock gate name: I2c2.

+
kCLOCK_I2c3  +

Clock gate name: I2c3.

+
kCLOCK_Adc  +

Clock gate name: Adc.

+
kCLOCK_Ctimer0  +

Clock gate name: Ctimer0.

+
kCLOCK_Mtb  +

Clock gate name: Mtb.

+
kCLOCK_Dac0  +

Clock gate name: Dac0.

+
kCLOCK_GpioInt  +

Clock gate name: GpioInt.

+
kCLOCK_Dma  +

Clock gate name: Dma.

+
kCLOCK_Uart3  +

Clock gate name: Uart3.

+
kCLOCK_Uart4  +

Clock gate name: Uart4.

+
kCLOCK_Capt  +

Clock gate name: Capt.

+
kCLOCK_Dac1  +

Clock gate name: Dac1.

+
+ +
+
+ +
+
+ + + + +
enum clock_name_t
+
+ + + + + + + + + + +
Enumerator
kCLOCK_CoreSysClk  +

Cpu/AHB/AHB matrix/Memories,etc.

+
kCLOCK_MainClk  +

Main clock.

+
kCLOCK_Fro  +

FRO18/24/30.

+
kCLOCK_FroDiv  +

FRO div clock.

+
kCLOCK_ExtClk  +

External Clock.

+
kCLOCK_PllOut  +

PLL Output.

+
kCLOCK_WdtOsc  +

Watchdog Oscillator.

+
kCLOCK_Frg0  +

fractional rate0

+
kCLOCK_Frg1  +

fractional rate1

+
+ +
+
+ +
+
+ + + + +
enum clock_select_t
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerator
kCAPT_Clk_From_Fro  +

Mux CAPT_Clk from Fro.

+
kCAPT_Clk_From_MainClk  +

Mux CAPT_Clk from MainClk.

+
kCAPT_Clk_From_SysPll  +

Mux CAPT_Clk from SysPll.

+
kCAPT_Clk_From_Fro_Div  +

Mux CAPT_Clk from Fro_Div.

+
kCAPT_Clk_From_WdtOsc  +

Mux CAPT_Clk from WdtOsc.

+
kADC_Clk_From_Fro  +

Mux ADC_Clk from Fro.

+
kADC_Clk_From_SysPll  +

Mux ADC_Clk from SysPll.

+
kSCT_Clk_From_Fro  +

Mux SCT_Clk from Fro.

+
kSCT_Clk_From_MainClk  +

Mux SCT_Clk from MainClk.

+
kSCT_Clk_From_SysPll  +

Mux SCT_Clk from SysPll.

+
kEXT_Clk_From_SysOsc  +

Mux EXT_Clk from SysOsc.

+
kEXT_Clk_From_ClkIn  +

Mux EXT_Clk from ClkIn.

+
kUART0_Clk_From_Fro  +

Mux UART0_Clk from Fro.

+
kUART0_Clk_From_MainClk  +

Mux UART0_Clk from MainClk.

+
kUART0_Clk_From_Frg0Clk  +

Mux UART0_Clk from Frg0Clk.

+
kUART0_Clk_From_Frg1Clk  +

Mux UART0_Clk from Frg1Clk.

+
kUART0_Clk_From_Fro_Div  +

Mux UART0_Clk from Fro_Div.

+
kUART1_Clk_From_Fro  +

Mux UART1_Clk from Fro.

+
kUART1_Clk_From_MainClk  +

Mux UART1_Clk from MainClk.

+
kUART1_Clk_From_Frg0Clk  +

Mux UART1_Clk from Frg0Clk.

+
kUART1_Clk_From_Frg1Clk  +

Mux UART1_Clk from Frg1Clk.

+
kUART1_Clk_From_Fro_Div  +

Mux UART1_Clk from Fro_Div.

+
kUART2_Clk_From_Fro  +

Mux UART2_Clk from Fro.

+
kUART2_Clk_From_MainClk  +

Mux UART2_Clk from MainClk.

+
kUART2_Clk_From_Frg0Clk  +

Mux UART2_Clk from Frg0Clk.

+
kUART2_Clk_From_Frg1Clk  +

Mux UART2_Clk from Frg1Clk.

+
kUART2_Clk_From_Fro_Div  +

Mux UART2_Clk from Fro_Div.

+
kUART3_Clk_From_Fro  +

Mux UART3_Clk from Fro.

+
kUART3_Clk_From_MainClk  +

Mux UART3_Clk from MainClk.

+
kUART3_Clk_From_Frg0Clk  +

Mux UART3_Clk from Frg0Clk.

+
kUART3_Clk_From_Frg1Clk  +

Mux UART3_Clk from Frg1Clk.

+
kUART3_Clk_From_Fro_Div  +

Mux UART3_Clk from Fro_Div.

+
kUART4_Clk_From_Fro  +

Mux UART4_Clk from Fro.

+
kUART4_Clk_From_MainClk  +

Mux UART4_Clk from MainClk.

+
kUART4_Clk_From_Frg0Clk  +

Mux UART4_Clk from Frg0Clk.

+
kUART4_Clk_From_Frg1Clk  +

Mux UART4_Clk from Frg1Clk.

+
kUART4_Clk_From_Fro_Div  +

Mux UART4_Clk from Fro_Div.

+
kI2C0_Clk_From_Fro  +

Mux I2C0_Clk from Fro.

+
kI2C0_Clk_From_MainClk  +

Mux I2C0_Clk from MainClk.

+
kI2C0_Clk_From_Frg0Clk  +

Mux I2C0_Clk from Frg0Clk.

+
kI2C0_Clk_From_Frg1Clk  +

Mux I2C0_Clk from Frg1Clk.

+
kI2C0_Clk_From_Fro_Div  +

Mux I2C0_Clk from Fro_Div.

+
kI2C1_Clk_From_Fro  +

Mux I2C1_Clk from Fro.

+
kI2C1_Clk_From_MainClk  +

Mux I2C1_Clk from MainClk.

+
kI2C1_Clk_From_Frg0Clk  +

Mux I2C1_Clk from Frg0Clk.

+
kI2C1_Clk_From_Frg1Clk  +

Mux I2C1_Clk from Frg1Clk.

+
kI2C1_Clk_From_Fro_Div  +

Mux I2C1_Clk from Fro_Div.

+
kI2C2_Clk_From_Fro  +

Mux I2C2_Clk from Fro.

+
kI2C2_Clk_From_MainClk  +

Mux I2C2_Clk from MainClk.

+
kI2C2_Clk_From_Frg0Clk  +

Mux I2C2_Clk from Frg0Clk.

+
kI2C2_Clk_From_Frg1Clk  +

Mux I2C2_Clk from Frg1Clk.

+
kI2C2_Clk_From_Fro_Div  +

Mux I2C2_Clk from Fro_Div.

+
kI2C3_Clk_From_Fro  +

Mux I2C3_Clk from Fro.

+
kI2C3_Clk_From_MainClk  +

Mux I2C3_Clk from MainClk.

+
kI2C3_Clk_From_Frg0Clk  +

Mux I2C3_Clk from Frg0Clk.

+
kI2C3_Clk_From_Frg1Clk  +

Mux I2C3_Clk from Frg1Clk.

+
kI2C3_Clk_From_Fro_Div  +

Mux I2C3_Clk from Fro_Div.

+
kSPI0_Clk_From_Fro  +

Mux SPI0_Clk from Fro.

+
kSPI0_Clk_From_MainClk  +

Mux SPI0_Clk from MainClk.

+
kSPI0_Clk_From_Frg0Clk  +

Mux SPI0_Clk from Frg0Clk.

+
kSPI0_Clk_From_Frg1Clk  +

Mux SPI0_Clk from Frg1Clk.

+
kSPI0_Clk_From_Fro_Div  +

Mux SPI0_Clk from Fro_Div.

+
kSPI1_Clk_From_Fro  +

Mux SPI1_Clk from Fro.

+
kSPI1_Clk_From_MainClk  +

Mux SPI1_Clk from MainClk.

+
kSPI1_Clk_From_Frg0Clk  +

Mux SPI1_Clk from Frg0Clk.

+
kSPI1_Clk_From_Frg1Clk  +

Mux SPI1_Clk from Frg1Clk.

+
kSPI1_Clk_From_Fro_Div  +

Mux SPI1_Clk from Fro_Div.

+
kFRG0_Clk_From_Fro  +

Mux FRG0_Clk from Fro.

+
kFRG0_Clk_From_MainClk  +

Mux FRG0_Clk from MainClk.

+
kFRG0_Clk_From_SysPll  +

Mux FRG0_Clk from SysPll.

+
kFRG1_Clk_From_Fro  +

Mux FRG1_Clk from Fro.

+
kFRG1_Clk_From_MainClk  +

Mux FRG1_Clk from MainClk.

+
kFRG1_Clk_From_SysPll  +

Mux FRG1_Clk from SysPll.

+
kCLKOUT_From_Fro  +

Mux CLKOUT from Fro.

+
kCLKOUT_From_MainClk  +

Mux CLKOUT from MainClk.

+
kCLKOUT_From_SysPll  +

Mux CLKOUT from SysPll.

+
kCLKOUT_From_ExtClk  +

Mux CLKOUT from ExtClk.

+
kCLKOUT_From_WdtOsc  +

Mux CLKOUT from WdtOsc.

+
+ +
+
+ +
+
+ + + + +
enum clock_divider_t
+
+ + + + + + + + + + + +
Enumerator
kCLOCK_DivAdcClk  +

Adc Clock Divider.

+
kCLOCK_DivSctClk  +

Sct Clock Divider.

+
kCLOCK_DivClkOut  +

Clk Out Divider.

+
kCLOCK_IOCONCLKDiv6  +

IOCON Clock Div6 Divider.

+
kCLOCK_IOCONCLKDiv5  +

IOCON Clock Div5 Divider.

+
kCLOCK_IOCONCLKDiv4  +

IOCON Clock Div4 Divider.

+
kCLOCK_IOCONCLKDiv3  +

IOCON Clock Div3 Divider.

+
kCLOCK_IOCONCLKDiv2  +

IOCON Clock Div2 Divider.

+
kCLOCK_IOCONCLKDiv1  +

IOCON Clock Div1 Divider.

+
kCLOCK_IOCONCLKDiv0  +

IOCON Clock Div0 Divider.

+
+ +
+
+ +
+
+ + + + +
enum clock_wdt_analog_freq_t
+
+ + + + + + + + + + + + + + + + + +
Enumerator
kCLOCK_WdtAnaFreq0HZ  +

Watch dog analog output frequency is 0HZ.

+
kCLOCK_WdtAnaFreq600KHZ  +

Watch dog analog output frequency is 600KHZ.

+
kCLOCK_WdtAnaFreq1050KHZ  +

Watch dog analog output frequency is 1050KHZ.

+
kCLOCK_WdtAnaFreq1400KHZ  +

Watch dog analog output frequency is 1400KHZ.

+
kCLOCK_WdtAnaFreq1750KHZ  +

Watch dog analog output frequency is 1750KHZ.

+
kCLOCK_WdtAnaFreq2100KHZ  +

Watch dog analog output frequency is 2100KHZ.

+
kCLOCK_WdtAnaFreq2400KHZ  +

Watch dog analog output frequency is 2400KHZ.

+
kCLOCK_WdtAnaFreq2700KHZ  +

Watch dog analog output frequency is 2700KHZ.

+
kCLOCK_WdtAnaFreq3000KHZ  +

Watch dog analog output frequency is 3000KHZ.

+
kCLOCK_WdtAnaFreq3250KHZ  +

Watch dog analog output frequency is 3250KHZ.

+
kCLOCK_WdtAnaFreq3500KHZ  +

Watch dog analog output frequency is 3500KHZ.

+
kCLOCK_WdtAnaFreq3750KHZ  +

Watch dog analog output frequency is 3750KHZ.

+
kCLOCK_WdtAnaFreq4000KHZ  +

Watch dog analog output frequency is 4000KHZ.

+
kCLOCK_WdtAnaFreq4200KHZ  +

Watch dog analog output frequency is 4200KHZ.

+
kCLOCK_WdtAnaFreq4400KHZ  +

Watch dog analog output frequency is 4400KHZ.

+
kCLOCK_WdtAnaFreq4600KHZ  +

Watch dog analog output frequency is 4600KHZ.

+
+ +
+
+ +
+
+ + + + +
enum clock_fro_src_t
+
+ + + +
Enumerator
kCLOCK_FroSrcLpwrBootValue  +

fro source from the fro oscillator divided by low power boot value

+
kCLOCK_FroSrcFroOsc  +

fre source from the fro oscillator directly

+
+ +
+
+ +
+
+ + + + +
enum clock_fro_osc_freq_t
+
+ + + + +
Enumerator
kCLOCK_FroOscOut18M  +

FRO oscillator output 18M.

+
kCLOCK_FroOscOut24M  +

FRO oscillator output 24M.

+
kCLOCK_FroOscOut30M  +

FRO oscillator output 30M.

+
+ +
+
+ +
+
+ + + + +
enum clock_sys_pll_src
+
+ + + + + +
Enumerator
kCLOCK_SysPllSrcFRO  +

system pll source from FRO

+
kCLOCK_SysPllSrcExtClk  +

system pll source from external clock

+
kCLOCK_SysPllSrcWdtOsc  +

system pll source from watchdog oscillator

+
kCLOCK_SysPllSrcFroDiv  +

system pll source from FRO divided clock

+
+ +
+
+ +
+
+ + + + +
enum clock_main_clk_src_t
+
+ + + + + + +
Enumerator
kCLOCK_MainClkSrcFro  +

main clock source from FRO

+
kCLOCK_MainClkSrcExtClk  +

main clock source from Ext clock

+
kCLOCK_MainClkSrcWdtOsc  +

main clock source from watchdog oscillator

+
kCLOCK_MainClkSrcFroDiv  +

main clock source from FRO Div

+
kCLOCK_MainClkSrcSysPll  +

main clock source from system pll

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
void CLOCK_SetMainClkSrc (clock_main_clk_src_t src)
+
+
Parameters
+ + +
srcRefer to clock_main_clk_src_t to set the main clock source.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CLOCK_SetFroOutClkSrc (clock_fro_src_t src)
+
+
Parameters
+ + +
srcPlease refer to _clock_fro_src definition.
+
+
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetFRG0ClkFreq (void )
+
+
Returns
Frequency of FRG0 Clock.
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetFRG1ClkFreq (void )
+
+
Returns
Frequency of FRG1 Clock.
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetMainClkFreq (void )
+
+
Returns
Frequency of Main Clock.
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetFroFreq (void )
+
+
Returns
Frequency of FRO.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CLOCK_GetCoreSysClkFreq (void )
+
+inlinestatic
+
+
Returns
Frequency of core.
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetClockOutClkFreq (void )
+
+
Returns
Frequency of ClockOut
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetUart0ClkFreq (void )
+
+
Return values
+ + +
UART0frequency value.
+
+
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetUart1ClkFreq (void )
+
+
Return values
+ + +
UART1frequency value.
+
+
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetUart2ClkFreq (void )
+
+
Return values
+ + +
UART2frequency value.
+
+
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetUart3ClkFreq (void )
+
+
Return values
+ + +
UART3frequency value.
+
+
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetUart4ClkFreq (void )
+
+
Return values
+ + +
UART4frequency value.
+
+
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetFreq (clock_name_t clockName)
+
+
Returns
Frequency of selected clock
+ +
+
+ +
+
+ + + + + + + + +
uint32_t CLOCK_GetSystemPLLInClockRate (void )
+
+
Returns
System PLL input clock rate
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CLOCK_GetSystemPLLFreq (void )
+
+inlinestatic
+
+
Returns
Frequency of PLL
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CLOCK_GetWdtOscFreq (void )
+
+inlinestatic
+
+
Return values
+ + +
watchdog OSC frequency value.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CLOCK_GetExtClkFreq (void )
+
+inlinestatic
+
+
Return values
+ + +
externalclock frequency value.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CLOCK_InitSystemPll (const clock_sys_pll_tconfig)
+
+
Parameters
+ + +
configSystem PLL configurations.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void CLOCK_DenitSystemPll (void )
+
+inlinestatic
+
+ +
+
+ +
+
+ + + + + + + + +
bool CLOCK_SetFRG0ClkFreq (uint32_t freq)
+
+
Parameters
+ + +
freqTarget output frequency, freq < input and (input / freq) < 2 should be satisfy.
+
+
+
Return values
+ + +
true- successfully, false - input argument is invalid.
+
+
+ +
+
+ +
+
+ + + + + + + + +
bool CLOCK_SetFRG1ClkFreq (uint32_t freq)
+
+
Parameters
+ + +
freqTarget output frequency, freq < input and (input / freq) < 2 should be satisfy.
+
+
+
Return values
+ + +
true- successfully, false - input argument is invalid.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CLOCK_InitExtClkin (uint32_t clkInFreq)
+
+
Parameters
+ + +
clkInFreqexternal clock in frequency.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CLOCK_InitSysOsc (uint32_t oscFreq)
+
+
Parameters
+ + +
oscFreqoscillator frequency value.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CLOCK_InitXtalin (uint32_t xtalInFreq)
+
+
Parameters
+ + +
xtalInFreqXTALIN frequency value
+
+
+
Returns
Frequency of PLL
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void CLOCK_InitWdtOsc (clock_wdt_analog_freq_t wdtOscFreq,
uint32_t wdtOscDiv 
)
+
+

The watchdog oscillator is the clock source with the lowest power consumption. If accurate timing is required, use the FRO or system oscillator. The frequency of the watchdog oscillator is undefined after reset. The watchdog oscillator frequency must be programmed by writing to the WDTOSCCTRL register before using the watchdog oscillator. Watchdog osc output frequency = wdtOscFreq / wdtOscDiv, should in range 9.3KHZ to 2.3MHZ.

+
Parameters
+ + + +
wdtOscFreqwatch dog analog part output frequency, reference _wdt_analog_output_freq.
wdtOscDivwatch dog analog part output frequency divider, shoule be a value >= 2U and multiple of 2
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void CLOCK_SetFroOscFreq (clock_fro_osc_freq_t freq)
+
+inlinestatic
+
+

Initialize the FRO clock to given frequency (18, 24 or 30 MHz).

+
Parameters
+ + +
freqPlease refer to clock_fro_osc_freq_t definition, frequency must be one of 18000, 24000 or 30000 KHz.
+
+
+ +
+
+

Variable Documentation

+ +
+
+ + + + +
volatile uint32_t g_Wdt_Osc_Freq
+
+

This variable is used to store the watchdog oscillator frequency which is set by CLOCK_InitWdtOsc, and it is returned by CLOCK_GetWdtOscFreq.

+ +
+
+ +
+
+ + + + +
volatile uint32_t g_Ext_Clk_Freq
+
+

This variable is used to store the external clock frequency which is include external oscillator clock and external clk in clock frequency value, it is set by CLOCK_InitExtClkin when CLK IN is used as external clock or by CLOCK_InitSysOsc when external oscillator is used as external clock ,and it is returned by CLOCK_GetExtClkFreq.

+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00011.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00011.js new file mode 100644 index 0000000..b102df0 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00011.js @@ -0,0 +1,240 @@ +var a00011 = +[ + [ "clock_sys_pll_t", "a00011.html#a00113", [ + [ "targetFreq", "a00011.html#a1be863d493ed08967d4abbe8faf8c918", null ], + [ "src", "a00011.html#a5777806e347fa36340fc79e5928f5d83", null ] + ] ], + [ "FSL_CLOCK_DRIVER_VERSION", "a00011.html#ga0c0cf401613f31feb4a9eb723ad51154", null ], + [ "CLOCK_FRO_SETTING_API_ROM_ADDRESS", "a00011.html#gaf4232ca3ff8c9ea3d8b3cbe4bac6d87a", null ], + [ "CLOCK_FAIM_BASE", "a00011.html#ga0da8ff794475b44b15cda07999bc8678", null ], + [ "ADC_CLOCKS", "a00011.html#gaef5bfe2c53a7ededa861c4e414cdbf36", null ], + [ "ACMP_CLOCKS", "a00011.html#gaa540fadbafefad92f9f7ae3f63b7a45c", null ], + [ "DAC_CLOCKS", "a00011.html#gab3c8a974e25f615fe023579c847fae6c", null ], + [ "SWM_CLOCKS", "a00011.html#gad0c6602129535798b81d753e67cabc99", null ], + [ "ROM_CLOCKS", "a00011.html#gaffc6cb67ee605165b0660db6031d5871", null ], + [ "SRAM_CLOCKS", "a00011.html#ga06cf7a516d7600127c0af0e1e0cc5759", null ], + [ "IOCON_CLOCKS", "a00011.html#ga7c6017a8657328bdaad58beb19de84e1", null ], + [ "GPIO_CLOCKS", "a00011.html#gac86986db423673c1d9b46882ccd6b3a9", null ], + [ "GPIO_INT_CLOCKS", "a00011.html#ga4b1754d575449d4dab7f7e3f0131650c", null ], + [ "DMA_CLOCKS", "a00011.html#ga5a8ba9cbce79bf443b2b1ba97d4c5475", null ], + [ "CRC_CLOCKS", "a00011.html#ga661e3aff590ce2f086ba06745317480b", null ], + [ "WWDT_CLOCKS", "a00011.html#ga23dea91a4cc65d3b9ba93c83313496a1", null ], + [ "SCT_CLOCKS", "a00011.html#gac72477e518b30ceb277b83f555ac0d9e", null ], + [ "I2C_CLOCKS", "a00011.html#gac0c74371f4f724c78ef233de79c3cf14", null ], + [ "USART_CLOCKS", "a00011.html#ga2172b1f5c29b7d0bf0fe8a9c9d45ed43", null ], + [ "SPI_CLOCKS", "a00011.html#ga2323a706e6e7796fa2e352a5b5a70f59", null ], + [ "CAPT_CLOCKS", "a00011.html#gad73456f246d91b7e9dcbe6c6fc180a2f", null ], + [ "CTIMER_CLOCKS", "a00011.html#gabdb5fc301b32e8998fb9b52e86c5cc1a", null ], + [ "MTB_CLOCKS", "a00011.html#ga2b8416b451bb271a2ffce397ef822dff", null ], + [ "MRT_CLOCKS", "a00011.html#gac3a1bd1656603951722b345b45f888e9", null ], + [ "WKT_CLOCKS", "a00011.html#ga24f65b321ca1b862cf159bec396453bd", null ], + [ "CLK_GATE_DEFINE", "a00011.html#gaea083b34e0ae608a94fce91da973a544", null ], + [ "clock_ip_name_t", "a00011.html#ga23c8b3ae62f7865b2e228408be95946d", [ + [ "kCLOCK_IpInvalid", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da11dd047399d3cf7893682897e34682de", null ], + [ "kCLOCK_Rom", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da1b9f348e8d5bc1715af7366be3ca87c7", null ], + [ "kCLOCK_Ram0_1", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da02834dc4dbeb1ca14211279916182425", null ], + [ "kCLOCK_I2c0", "a00011.html#gga23c8b3ae62f7865b2e228408be95946dac6e6ee6e9f7b28e5c3818324c852b05f", null ], + [ "kCLOCK_Gpio0", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da9ec19029dc1ad34cb7ae0091e97b7f7d", null ], + [ "kCLOCK_Swm", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da63bcbbef2627c667b204eae91c3a0718", null ], + [ "kCLOCK_Sct", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da7b405d8427fbdfbf1a7f910f828d8ed6", null ], + [ "kCLOCK_Wkt", "a00011.html#gga23c8b3ae62f7865b2e228408be95946dad386313192805ba225b0da24e078d387", null ], + [ "kCLOCK_Mrt", "a00011.html#gga23c8b3ae62f7865b2e228408be95946daace73b709cda5c34ba5bdf6888605f1f", null ], + [ "kCLOCK_Spi0", "a00011.html#gga23c8b3ae62f7865b2e228408be95946dac6997ec12e66b5e4fad9aa52ef6a2db0", null ], + [ "kCLOCK_Spi1", "a00011.html#gga23c8b3ae62f7865b2e228408be95946dadd0ceacddcfe95c6e7c8bbcfd2f4ca60", null ], + [ "kCLOCK_Crc", "a00011.html#gga23c8b3ae62f7865b2e228408be95946daa1cfbe8497997fc6dff0d7f0c070aa5a", null ], + [ "kCLOCK_Uart0", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da26876b4bdecc15c46c379a289441b3c6", null ], + [ "kCLOCK_Uart1", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da1d4898f8634e2f18e6a154e2b1a4120e", null ], + [ "kCLOCK_Uart2", "a00011.html#gga23c8b3ae62f7865b2e228408be95946daf079522d21082e83bd0192040a103e8b", null ], + [ "kCLOCK_Wwdt", "a00011.html#gga23c8b3ae62f7865b2e228408be95946daf1e8b91e80a3a9a4db038c0b4cf7e381", null ], + [ "kCLOCK_Iocon", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da909ccfe84f4275dd7b6ba09235583230", null ], + [ "kCLOCK_Acmp", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da5c44f9347603d8c7fd8eda74e3b3e40f", null ], + [ "kCLOCK_Gpio1", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da72b9be69422d94586bf09e6bd3d2632a", null ], + [ "kCLOCK_I2c1", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da689e957d82ca723a1a0cc671ba216bf5", null ], + [ "kCLOCK_I2c2", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da239422d8b3e53afadaf651015ffb5065", null ], + [ "kCLOCK_I2c3", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da5f0100f89ed9f83b8eb76dc0de0d08fd", null ], + [ "kCLOCK_Adc", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da2bc16e3ee343b4abfc46ae9506461e97", null ], + [ "kCLOCK_Ctimer0", "a00011.html#gga23c8b3ae62f7865b2e228408be95946dad2e9ebc3825a65fae3c13efbc805a128", null ], + [ "kCLOCK_Mtb", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da82cabf9d7a17650616d227b23ab2a35a", null ], + [ "kCLOCK_Dac0", "a00011.html#gga23c8b3ae62f7865b2e228408be95946daea833e6e503de81899699c1bb23d774b", null ], + [ "kCLOCK_GpioInt", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da3922459ccb3f2fd90ac39813c0dc39f0", null ], + [ "kCLOCK_Dma", "a00011.html#gga23c8b3ae62f7865b2e228408be95946daabce09bc09630409474602bc5eab7c10", null ], + [ "kCLOCK_Uart3", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da2073aacb108d570b5cd4099d6294d74d", null ], + [ "kCLOCK_Uart4", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da9e86fefe81e4318044e0f234b3df97b0", null ], + [ "kCLOCK_Capt", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da0ffae7aa0d9dbc52524beb5f82ced038", null ], + [ "kCLOCK_Dac1", "a00011.html#gga23c8b3ae62f7865b2e228408be95946da9f0fcaa6854d2b404e0b67a2239893ae", null ] + ] ], + [ "clock_name_t", "a00011.html#gaf74854e9bcee544d7646c5bafdc00bd3", [ + [ "kCLOCK_CoreSysClk", "a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a1de4a40f5399eb025d5faefda7491918", null ], + [ "kCLOCK_MainClk", "a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a86d48329b3492ab94a5da3925c73622f", null ], + [ "kCLOCK_Fro", "a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a01a946b874db04d12aba4c3bbe461580", null ], + [ "kCLOCK_FroDiv", "a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a01d0c099adda9e435281c887b12095a8", null ], + [ "kCLOCK_ExtClk", "a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a30e6333c132740b84bf2ce94b8c44a8f", null ], + [ "kCLOCK_PllOut", "a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a2c5ccaeff2df0dc3c67a5aa36e5576d3", null ], + [ "kCLOCK_WdtOsc", "a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a18a8be3e9ab0fd908821ff17940317c6", null ], + [ "kCLOCK_Frg0", "a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3aa27972710b7df62d66918584843aee06", null ], + [ "kCLOCK_Frg1", "a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a5aeefcf41548bb4dd09f1e17f39da7e0", null ] + ] ], + [ "clock_select_t", "a00011.html#ga59a363f0296ea51011dd86b405d5db58", [ + [ "kCAPT_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58af1d8576caccfd1e48d121fae4315c10d", null ], + [ "kCAPT_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a28b61eb46fb752a05934e2d44450acc0", null ], + [ "kCAPT_Clk_From_SysPll", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ab7e3ded84a0cb9fbc059b9d2604ba9c0", null ], + [ "kCAPT_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58abae02f94616cc17800067d5601943b5e", null ], + [ "kCAPT_Clk_From_WdtOsc", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a1f6cedfc78cc220b123a36ae896c51c4", null ], + [ "kADC_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a91f272ba2ca7171ce0689d39f9a894af", null ], + [ "kADC_Clk_From_SysPll", "a00011.html#gga59a363f0296ea51011dd86b405d5db58adffea42a42dc4f9d329a9d24822b9173", null ], + [ "kSCT_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a45061bbb0d60c123b9cf999ce58c24f0", null ], + [ "kSCT_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a9f985237f28fdfa44b6a856c3e2f4dab", null ], + [ "kSCT_Clk_From_SysPll", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ad0d4f0ebaf887e6ae96436fa7f0d2f15", null ], + [ "kEXT_Clk_From_SysOsc", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a2e3cfcd9f9e0255bee678609d2a03459", null ], + [ "kEXT_Clk_From_ClkIn", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a22fcfa5a6ecb31823d0019891a10e825", null ], + [ "kUART0_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a67d2eb5235a0677d1ef161e5e1c2b340", null ], + [ "kUART0_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a841785f980e4c406eeecdcf07559fe66", null ], + [ "kUART0_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ad0784125581fd7bf09f4b3bab3af725d", null ], + [ "kUART0_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a7ef63f722c9c6e188ea209ba84f6991c", null ], + [ "kUART0_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58af06770587aa45bbb62d1e4fe36d03d81", null ], + [ "kUART1_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a9fbd759cc60932bb0896625543477290", null ], + [ "kUART1_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a066679b9e0a01ccd0aad6e6caa643f2f", null ], + [ "kUART1_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58af45a833dead43235df03a982dc25ea33", null ], + [ "kUART1_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a4c795835151e3db8e027500091ca7235", null ], + [ "kUART1_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a1b183d67629d90ddc1a9b9baf2ebc285", null ], + [ "kUART2_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58afa1754a6f8ad6663b97370dd3d2e4f3b", null ], + [ "kUART2_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a43ab6417acfda68bfa6fb3228bc0fa22", null ], + [ "kUART2_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ad4c08c5a89da40d06718a4f83a999a15", null ], + [ "kUART2_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a4e4a114969e2446efb826b0f436e60b4", null ], + [ "kUART2_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a45a5f9cbfc0626d893768c61e922dd1e", null ], + [ "kUART3_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58aaf28b28236e7172dd366aab893c08de3", null ], + [ "kUART3_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a9d6f615bb923c12b2d7b831272e85daf", null ], + [ "kUART3_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a3783440f6a72a888a464ad824842740e", null ], + [ "kUART3_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a98f2d7502907ece893c0bbee9202651f", null ], + [ "kUART3_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a0b370ac43c3546605db7ba397ba9a775", null ], + [ "kUART4_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58af3df9606907ec93d127cf6759090dc64", null ], + [ "kUART4_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ae4d335d5f4a2a8de27f87f8c6c38ddfd", null ], + [ "kUART4_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ad30f9ec4dd8bf91c3b072f8eae495a3e", null ], + [ "kUART4_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ac70f329af8bfa7becadf7396b6c55aac", null ], + [ "kUART4_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a37e357b51fc23fcc649e5c1085a57524", null ], + [ "kI2C0_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ab8065d6f5e9b16e9410feccef7f1c10b", null ], + [ "kI2C0_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ab434281b6471a116a444172bf8a7bf91", null ], + [ "kI2C0_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a92f67286aebd8e0fde633cf4b3bd8b57", null ], + [ "kI2C0_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58abc4f63896a33dac1ef8825e1fe86488b", null ], + [ "kI2C0_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a9fe34f41e6cfa3cd3a0ef15ba9184bb1", null ], + [ "kI2C1_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ae19e4e49559079c2f95f998c37029642", null ], + [ "kI2C1_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a5cff4ddf26d639e435ce79fe5e83d866", null ], + [ "kI2C1_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ac891ded4c265bfab790d733acbacb753", null ], + [ "kI2C1_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a6a83c84726acb80554e10c8c3758e071", null ], + [ "kI2C1_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a8670e7d6a9f2afb045fbf54dc13c4bb2", null ], + [ "kI2C2_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58aad11950d648756bba92e741b9c6b4cd0", null ], + [ "kI2C2_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a6d4885caf9110a788abb71f9c482141c", null ], + [ "kI2C2_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a56958ea244b66882f17bd6bdad0e8b8f", null ], + [ "kI2C2_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a84c08938ba9d92701ad3d29267565309", null ], + [ "kI2C2_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a11296d1ee4ea06d70c91789f988c8a43", null ], + [ "kI2C3_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a80a728627fb060445729c7fcb12cd1b8", null ], + [ "kI2C3_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a8f752fd4f9b1ebce048719fbc9d1962b", null ], + [ "kI2C3_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a3013697f548b1926d8c79f052a43c250", null ], + [ "kI2C3_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58af596a7a7c2e36598e14144cc13eb0733", null ], + [ "kI2C3_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ab78b4e89fcd4147c3143fee94034a356", null ], + [ "kSPI0_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a225c7ee90596ed70ba883f4db61aa8a7", null ], + [ "kSPI0_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ae27646652709428349bea6c7044c070e", null ], + [ "kSPI0_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a845c271da53362455548e3a2d785e46f", null ], + [ "kSPI0_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a0cd69802e0dca5ea59301801b17d24a6", null ], + [ "kSPI0_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58aad0657c34aef515cd39d693c8a7896b2", null ], + [ "kSPI1_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a4153c95a0b0f7e3c4b3090e7b7157815", null ], + [ "kSPI1_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a03a2a6a3073f4ae89de347a932695305", null ], + [ "kSPI1_Clk_From_Frg0Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a61f8c26921cefcc9988472806478400b", null ], + [ "kSPI1_Clk_From_Frg1Clk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58adac12c9424be5e807358f910e834b8fe", null ], + [ "kSPI1_Clk_From_Fro_Div", "a00011.html#gga59a363f0296ea51011dd86b405d5db58acdb981a51b4fe1d9405a3ddfc34b50b9", null ], + [ "kFRG0_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58afa871e16cf926d8a08dce1a52f418066", null ], + [ "kFRG0_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a1fe8170ca9a5fcee3e0b3fa1453eb481", null ], + [ "kFRG0_Clk_From_SysPll", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ad5a8e9d24a93e8c571f87c60a42c7b4b", null ], + [ "kFRG1_Clk_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ad5e83713fbdfcd0d5d67b6e679676874", null ], + [ "kFRG1_Clk_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a63e60987f0efbabef20f4a0fcc6f4007", null ], + [ "kFRG1_Clk_From_SysPll", "a00011.html#gga59a363f0296ea51011dd86b405d5db58ad06dfa176e453cfc40aa6b999e68b34c", null ], + [ "kCLKOUT_From_Fro", "a00011.html#gga59a363f0296ea51011dd86b405d5db58af2ea89b865003dc40f8923f67d7bb366", null ], + [ "kCLKOUT_From_MainClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a20d47beaa61ee59b61c34fa4f7e30d21", null ], + [ "kCLKOUT_From_SysPll", "a00011.html#gga59a363f0296ea51011dd86b405d5db58aa5b46ff93c42325f2c8d93b1bfbd2555", null ], + [ "kCLKOUT_From_ExtClk", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a8671f2c92f6e049ed8b2f3b7a5b9b296", null ], + [ "kCLKOUT_From_WdtOsc", "a00011.html#gga59a363f0296ea51011dd86b405d5db58a473a6161d9f0f5f580c2e8b913694831", null ] + ] ], + [ "clock_divider_t", "a00011.html#gac344a8334a482bcbcbdf0c4828db872c", [ + [ "kCLOCK_DivAdcClk", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca7b3998fdf96eb884e35ff56f40feffbd", null ], + [ "kCLOCK_DivSctClk", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872caa6c1d0bc0cb2e70e5801d2d2a55d6150", null ], + [ "kCLOCK_DivClkOut", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872caa7236a2c00237ca7ee5b2ff55058ded6", null ], + [ "kCLOCK_IOCONCLKDiv6", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca3f4c007e9c6a7cf58407f8f0974b7900", null ], + [ "kCLOCK_IOCONCLKDiv5", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872cabdbfc756defca27f8444ebccc928eae5", null ], + [ "kCLOCK_IOCONCLKDiv4", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca05fc477260e0f901a194bed1762e388c", null ], + [ "kCLOCK_IOCONCLKDiv3", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca87f8cd7b1b138c47af69a0bb106d70f8", null ], + [ "kCLOCK_IOCONCLKDiv2", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca2540a6d8147d6328653834c72c62f6d5", null ], + [ "kCLOCK_IOCONCLKDiv1", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872cacec00650d4292d94c3aa236bf33b7fb4", null ], + [ "kCLOCK_IOCONCLKDiv0", "a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca8ffa1d0afc3fa83f1d5bd563ba2329a2", null ] + ] ], + [ "clock_wdt_analog_freq_t", "a00011.html#ga564beca73d288c0d6fd237f541e279e6", [ + [ "kCLOCK_WdtAnaFreq0HZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6ac6cc9f4ed8bbf5bec37add7161537d1d", null ], + [ "kCLOCK_WdtAnaFreq600KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6ac176648f32c98ffae06e1dbe90775923", null ], + [ "kCLOCK_WdtAnaFreq1050KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6a261a52fc17b6e0652c7f87470de1de8d", null ], + [ "kCLOCK_WdtAnaFreq1400KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6a9f301770a8bc08fb5acbf32b46d8521c", null ], + [ "kCLOCK_WdtAnaFreq1750KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6ace0a3b71f10ba38150ee5622e8ce3690", null ], + [ "kCLOCK_WdtAnaFreq2100KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6abd3904f3cdbf1323d1e49d2807f3fa5e", null ], + [ "kCLOCK_WdtAnaFreq2400KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6a09f8f2b77ad4804c199404df2f9ea50f", null ], + [ "kCLOCK_WdtAnaFreq2700KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6ad12681c88e869163d4aed173ff0e6c64", null ], + [ "kCLOCK_WdtAnaFreq3000KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6a4c1c5972ed4ae79fad8e02a56031c002", null ], + [ "kCLOCK_WdtAnaFreq3250KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6a98d3b066806df88b3c330005da251ecf", null ], + [ "kCLOCK_WdtAnaFreq3500KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6abe6204f4fa5c74e82d3bf0dd5a61c914", null ], + [ "kCLOCK_WdtAnaFreq3750KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6afb2f3adebaed700221c6c93f113a2a90", null ], + [ "kCLOCK_WdtAnaFreq4000KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6aff64cf52ab7c013a83fbf131a864614f", null ], + [ "kCLOCK_WdtAnaFreq4200KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6ad4169afafb522bc5829d1df64170e346", null ], + [ "kCLOCK_WdtAnaFreq4400KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6ad4547d866fcc745745ce5e31434eb099", null ], + [ "kCLOCK_WdtAnaFreq4600KHZ", "a00011.html#gga564beca73d288c0d6fd237f541e279e6a762e9bc889c580c8a5083c51869f19c8", null ] + ] ], + [ "clock_fro_src_t", "a00011.html#ga9ff656514a680eef6ffbf40f4eef0bfb", [ + [ "kCLOCK_FroSrcLpwrBootValue", "a00011.html#gga9ff656514a680eef6ffbf40f4eef0bfba98131c5eeabd0e169e93b174aebdcf86", null ], + [ "kCLOCK_FroSrcFroOsc", "a00011.html#gga9ff656514a680eef6ffbf40f4eef0bfba931823a2fb900cbf75da504129ef8d91", null ] + ] ], + [ "clock_fro_osc_freq_t", "a00011.html#ga85bf7440c0d77269e3db764083110334", [ + [ "kCLOCK_FroOscOut18M", "a00011.html#gga85bf7440c0d77269e3db764083110334a60f89d729c96295d1aaa741a412d58ab", null ], + [ "kCLOCK_FroOscOut24M", "a00011.html#gga85bf7440c0d77269e3db764083110334a01135115df0c0b0525f2b1391ee9d9ca", null ], + [ "kCLOCK_FroOscOut30M", "a00011.html#gga85bf7440c0d77269e3db764083110334a29c4fdcb48fba40928b278765d0e3843", null ] + ] ], + [ "clock_sys_pll_src", "a00011.html#ga04c66d991cdc5cb35e31c27881bc549b", [ + [ "kCLOCK_SysPllSrcFRO", "a00011.html#gga04c66d991cdc5cb35e31c27881bc549ba1f337e9ad4557c3916c55340676c2b8e", null ], + [ "kCLOCK_SysPllSrcExtClk", "a00011.html#gga04c66d991cdc5cb35e31c27881bc549bad5b4cf5a82ac9fdac6b51d63723b2f8e", null ], + [ "kCLOCK_SysPllSrcWdtOsc", "a00011.html#gga04c66d991cdc5cb35e31c27881bc549ba888e842686be1af0ded28719bf24d0a8", null ], + [ "kCLOCK_SysPllSrcFroDiv", "a00011.html#gga04c66d991cdc5cb35e31c27881bc549bab45a2c903d5f052fb055b96793bde296", null ] + ] ], + [ "clock_main_clk_src_t", "a00011.html#gab68022e8d8f60a72f86a6a6c13b6e2f4", [ + [ "kCLOCK_MainClkSrcFro", "a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4a0aecd9451c5bf4525fe17a7b4734f58f", null ], + [ "kCLOCK_MainClkSrcExtClk", "a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4a85dbf0a96c672abcfbc08dfc231088d6", null ], + [ "kCLOCK_MainClkSrcWdtOsc", "a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4ab6adbaab8fe4761c0fb828aa7066bd80", null ], + [ "kCLOCK_MainClkSrcFroDiv", "a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4afa92bbf8fcfb74ceea172667409f7643", null ], + [ "kCLOCK_MainClkSrcSysPll", "a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4aa4b20f43266422065fa678e4e9ee6e92", null ] + ] ], + [ "CLOCK_SetMainClkSrc", "a00011.html#gaa6be3b84fd2a57ec1165954d6c4564e8", null ], + [ "CLOCK_SetFroOutClkSrc", "a00011.html#ga468095bb082b9a2a50a2e05e1ced88c0", null ], + [ "CLOCK_GetFRG0ClkFreq", "a00011.html#ga7dd0bd48c4a5a68fef7f9524d8999b4b", null ], + [ "CLOCK_GetFRG1ClkFreq", "a00011.html#gacb72cd4fce384788f3eb8ccc05e0ce7f", null ], + [ "CLOCK_GetMainClkFreq", "a00011.html#gaaa964f2c87ddd18a09c5201e22925fe6", null ], + [ "CLOCK_GetFroFreq", "a00011.html#gafe0b410109a29c465df0b4dcbb338ff3", null ], + [ "CLOCK_GetCoreSysClkFreq", "a00011.html#gaca0f0dcb61434d727340ddde5f131d91", null ], + [ "CLOCK_GetClockOutClkFreq", "a00011.html#gaf85cf02f515cd756873bf2a74ee143e2", null ], + [ "CLOCK_GetUart0ClkFreq", "a00011.html#ga47b7ce0a4c83a359f4bc1f2714a13761", null ], + [ "CLOCK_GetUart1ClkFreq", "a00011.html#ga10c8c8ccc077404a00e1121b5d18e4a8", null ], + [ "CLOCK_GetUart2ClkFreq", "a00011.html#ga07ba7d7b5ee69b71268190fe133c0a25", null ], + [ "CLOCK_GetUart3ClkFreq", "a00011.html#gabbdbb2bc96f1206cfe79fcf8896ae116", null ], + [ "CLOCK_GetUart4ClkFreq", "a00011.html#ga314692030453038d60194d3e6245345e", null ], + [ "CLOCK_GetFreq", "a00011.html#ga53acae220d651789bb505c53c73ecf2b", null ], + [ "CLOCK_GetSystemPLLInClockRate", "a00011.html#ga14b6a46da6b30e56001d7526a8546b42", null ], + [ "CLOCK_GetSystemPLLFreq", "a00011.html#gae60a901716b1b7a581b9a1e4034479cd", null ], + [ "CLOCK_GetWdtOscFreq", "a00011.html#ga054c63c43d8fc35586abf9aa6e8351a5", null ], + [ "CLOCK_GetExtClkFreq", "a00011.html#ga2d33480c8967a6bac98512e0c47c6b07", null ], + [ "CLOCK_InitSystemPll", "a00011.html#ga5863562919d2a5cb6c8e8dcaf46cc236", null ], + [ "CLOCK_DenitSystemPll", "a00011.html#gaf65f5b1578bde1ffc2a10ebf2ca66d1d", null ], + [ "CLOCK_SetFRG0ClkFreq", "a00011.html#ga4eb9737ada73b9a575250de526433dff", null ], + [ "CLOCK_SetFRG1ClkFreq", "a00011.html#ga4216bb5c85c6f6df1d128c9bfe5cd955", null ], + [ "CLOCK_InitExtClkin", "a00011.html#ga6506e7cdad8dcf18347cdcb1acd8c17d", null ], + [ "CLOCK_InitSysOsc", "a00011.html#ga2086545220b602cb4c0f1a141893447e", null ], + [ "CLOCK_InitXtalin", "a00011.html#ga591437e580785afce2e3c74e021393f2", null ], + [ "CLOCK_DeinitSysOsc", "a00011.html#ga957f6f224315c19d89781bd344c42cb3", null ], + [ "CLOCK_InitWdtOsc", "a00011.html#ga5786421429cdc95b34fdeb04d8ec9241", null ], + [ "CLOCK_DeinitWdtOsc", "a00011.html#gadc80b6c53f806d771a3f6fd65c68a08d", null ], + [ "CLOCK_SetFroOscFreq", "a00011.html#gab61f56487f2c5e6d2ae2033848613d5e", null ], + [ "g_Wdt_Osc_Freq", "a00011.html#ga73a69ec6e63f37b9341025bbe87ced45", null ], + [ "g_Ext_Clk_Freq", "a00011.html#ga386d59c21453d1914f3c8194010ff277", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00012.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00012.html new file mode 100644 index 0000000..0ede17d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00012.html @@ -0,0 +1,691 @@ + + + + + + +MCUXpresso SDK API Reference Manual: CRC: Cyclic Redundancy Check Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
CRC: Cyclic Redundancy Check Driver
+
+
+

Overview

+

MCUXpresso SDK provides a peripheral driver for the Cyclic Redundancy Check (CRC) module of MCUXpresso SDK devices.
+
+The cyclic redundancy check (CRC) module generates 16/32-bit CRC code for error detection. The CRC module provides three variants of polynomials, a programmable seed, and other parameters required to implement a 16-bit or 32-bit CRC standard.
+

+

+CRC Driver Initialization and Configuration

+

CRC_Init() function enables the clock for the CRC module in the LPC SYSCON block and fully (re-)configures the CRC module according to configuration structure. It also starts checksum computation by writing the seed.

+

The seed member of the configuration structure is the initial checksum for which new data can be added to. When starting new checksum computation, the seed should be set to the initial checksum per the CRC protocol specification. For continued checksum operation, the seed should be set to the intermediate checksum value as obtained from previous calls to CRC_GetConfig() function. After CRC_Init(), one or multiple CRC_WriteData() calls follow to update checksum with data, then CRC_Get16bitResult() or CRC_Get32bitResult() follows to read the result. CRC_Init() can be called as many times as required, which allows for runtime changes of the CRC protocol.

+

CRC_GetDefaultConfig() function can be used to set the module configuration structure with parameters for CRC-16/CCITT-FALSE protocol.

+

CRC_Deinit() function disables clock to the CRC module.

+

CRC_Reset() performs hardware reset of the CRC module.

+

+CRC Write Data

+

The CRC_WriteData() function is used to add data to actual CRC. Internally it tries to use 32-bit reads and writes for all aligned data in the user buffer and it uses 8-bit reads and writes for all unaligned data in the user buffer. This function can update CRC with user supplied data chunks of arbitrary size, so one can update CRC byte by byte or with all bytes at once. Prior call of CRC configuration function CRC_Init() fully specifies the CRC module configuration for CRC_WriteData() call.

+

CRC_WriteSeed() Write seed (initial checksum) to CRC module.

+

+CRC Get Checksum

+

The CRC_Get16bitResult() or CRC_Get32bitResult() function is used to read the CRC module checksum register. The bit reverse and 1's complement operations are already applied to the result if previously configured. Use CRC_GetConfig() function to get the actual checksum without bit reverse and 1's complement applied so it can be used as seed when resuming calculation later.

+

CRC_Init() / CRC_WriteData() / CRC_Get16bitResult() to get final checksum.

+

CRC_Init() / CRC_WriteData() / ... / CRC_WriteData() / CRC_Get16bitResult() to get final checksum.

+

CRC_Init() / CRC_WriteData() / CRC_GetConfig() to get intermediate checksum to be used as seed value in future.

+

CRC_Init() / CRC_WriteData() / ... / CRC_WriteData() / CRC_GetConfig() to get intermediate checksum.

+

+Comments about API usage in RTOS

+

If multiple RTOS tasks share the CRC module to compute checksums with different data and/or protocols, the following needs to be implemented by the user:

+

The triplets

+

CRC_Init() / CRC_WriteData() / CRC_Get16bitResult() or CRC_Get32bitResult() or CRC_GetConfig()

+

Should be protected by RTOS mutex to protect CRC module against concurrent accesses from different tasks. For example: Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crc

+ + + + +

+Files

file  fsl_crc.h
 
+ + + + +

+Data Structures

struct  crc_config_t
 CRC protocol configuration. More...
 
+ + + + +

+Macros

#define CRC_DRIVER_USE_CRC16_CCITT_FALSE_AS_DEFAULT   1
 Default configuration structure filled by CRC_GetDefaultConfig(). More...
 
+ + + + +

+Enumerations

enum  crc_polynomial_t {
+  kCRC_Polynomial_CRC_CCITT = 0U, +
+  kCRC_Polynomial_CRC_16 = 1U, +
+  kCRC_Polynomial_CRC_32 = 2U +
+ }
 CRC polynomials to use. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

void CRC_Init (CRC_Type *base, const crc_config_t *config)
 Enables and configures the CRC peripheral module. More...
 
static void CRC_Deinit (CRC_Type *base)
 Disables the CRC peripheral module. More...
 
void CRC_Reset (CRC_Type *base)
 resets CRC peripheral module. More...
 
void CRC_WriteSeed (CRC_Type *base, uint32_t seed)
 Write seed to CRC peripheral module. More...
 
void CRC_GetDefaultConfig (crc_config_t *config)
 Loads default values to CRC protocol configuration structure. More...
 
void CRC_GetConfig (CRC_Type *base, crc_config_t *config)
 Loads actual values configured in CRC peripheral to CRC protocol configuration structure. More...
 
void CRC_WriteData (CRC_Type *base, const uint8_t *data, size_t dataSize)
 Writes data to the CRC module. More...
 
static uint32_t CRC_Get32bitResult (CRC_Type *base)
 Reads 32-bit checksum from the CRC module. More...
 
static uint16_t CRC_Get16bitResult (CRC_Type *base)
 Reads 16-bit checksum from the CRC module. More...
 
+ + + + +

+Driver version

#define FSL_CRC_DRIVER_VERSION   (MAKE_VERSION(2, 1, 1))
 CRC driver version. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct crc_config_t
+
+

This structure holds the configuration for the CRC protocol.

+
+ + + + + + + + + + + + + + + + + + + +

Data Fields

crc_polynomial_t polynomial
 CRC polynomial. More...
 
bool reverseIn
 Reverse bits on input. More...
 
bool complementIn
 Perform 1's complement on input. More...
 
bool reverseOut
 Reverse bits on output. More...
 
bool complementOut
 Perform 1's complement on output. More...
 
uint32_t seed
 Starting checksum value. More...
 
+

Field Documentation

+ +
+
+ + + + +
crc_polynomial_t crc_config_t::polynomial
+
+ +
+
+ +
+
+ + + + +
bool crc_config_t::reverseIn
+
+ +
+
+ +
+
+ + + + +
bool crc_config_t::complementIn
+
+ +
+
+ +
+
+ + + + +
bool crc_config_t::reverseOut
+
+ +
+
+ +
+
+ + + + +
bool crc_config_t::complementOut
+
+ +
+
+ +
+
+ + + + +
uint32_t crc_config_t::seed
+
+ +
+
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_CRC_DRIVER_VERSION   (MAKE_VERSION(2, 1, 1))
+
+

Version 2.1.1.

+

Current version: 2.1.1

+

Change log:

+
    +
  • Version 2.0.0
      +
    • initial version
    • +
    +
  • +
  • Version 2.0.1
      +
    • add explicit type cast when writing to WR_DATA
    • +
    +
  • +
  • Version 2.0.2
      +
    • Fix MISRA issue
    • +
    +
  • +
  • Version 2.1.0
      +
    • Add CRC_WriteSeed function
    • +
    +
  • +
  • Version 2.1.1
      +
    • Fix MISRA issue
    • +
    +
  • +
+ +
+
+ +
+
+ + + + +
#define CRC_DRIVER_USE_CRC16_CCITT_FALSE_AS_DEFAULT   1
+
+

Uses CRC-16/CCITT-FALSE as default.

+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum crc_polynomial_t
+
+ + + + +
Enumerator
kCRC_Polynomial_CRC_CCITT  +

x^16+x^12+x^5+1

+
kCRC_Polynomial_CRC_16  +

x^16+x^15+x^2+1

+
kCRC_Polynomial_CRC_32  +

x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void CRC_Init (CRC_Type * base,
const crc_config_tconfig 
)
+
+

This functions enables the CRC peripheral clock in the LPC SYSCON block. It also configures the CRC engine and starts checksum computation by writing the seed.

+
Parameters
+ + + +
baseCRC peripheral address.
configCRC module configuration structure.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void CRC_Deinit (CRC_Type * base)
+
+inlinestatic
+
+

This functions disables the CRC peripheral clock in the LPC SYSCON block.

+
Parameters
+ + +
baseCRC peripheral address.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CRC_Reset (CRC_Type * base)
+
+
Parameters
+ + +
baseCRC peripheral address.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void CRC_WriteSeed (CRC_Type * base,
uint32_t seed 
)
+
+
Parameters
+ + + +
baseCRC peripheral address.
seedCRC Seed value.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CRC_GetDefaultConfig (crc_config_tconfig)
+
+

Loads default values to CRC protocol configuration structure. The default values are:

+
* config->polynomial = kCRC_Polynomial_CRC_CCITT;
+
* config->reverseIn = false;
+
* config->complementIn = false;
+
* config->reverseOut = false;
+
* config->complementOut = false;
+
* config->seed = 0xFFFFU;
+
*
+
Parameters
+ + +
configCRC protocol configuration structure
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void CRC_GetConfig (CRC_Type * base,
crc_config_tconfig 
)
+
+

The values, including seed, can be used to resume CRC calculation later.

+
Parameters
+ + + +
baseCRC peripheral address.
configCRC protocol configuration structure
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void CRC_WriteData (CRC_Type * base,
const uint8_t * data,
size_t dataSize 
)
+
+

Writes input data buffer bytes to CRC data register.

+
Parameters
+ + + + +
baseCRC peripheral address.
dataInput data stream, MSByte in data[0].
dataSizeSize of the input data buffer in bytes.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CRC_Get32bitResult (CRC_Type * base)
+
+inlinestatic
+
+

Reads CRC data register.

+
Parameters
+ + +
baseCRC peripheral address.
+
+
+
Returns
final 32-bit checksum, after configured bit reverse and complement operations.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint16_t CRC_Get16bitResult (CRC_Type * base)
+
+inlinestatic
+
+

Reads CRC data register.

+
Parameters
+ + +
baseCRC peripheral address.
+
+
+
Returns
final 16-bit checksum, after configured bit reverse and complement operations.
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00012.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00012.js new file mode 100644 index 0000000..80653ce --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00012.js @@ -0,0 +1,27 @@ +var a00012 = +[ + [ "crc_config_t", "a00012.html#a00114", [ + [ "polynomial", "a00012.html#afbe53ea36b200e69cb7f693e6f0a11f1", null ], + [ "reverseIn", "a00012.html#aecb53a8e8a78e3273c6d3b2c874ab7f2", null ], + [ "complementIn", "a00012.html#a9982af011e3e1fc9756dcee96281ebda", null ], + [ "reverseOut", "a00012.html#ab34c2bedb6fc476f9cbe760b6d45a417", null ], + [ "complementOut", "a00012.html#a673b6508efa086da7b7bd537a876241e", null ], + [ "seed", "a00012.html#a88920b83ff1317f511c1e9f4916b3b30", null ] + ] ], + [ "FSL_CRC_DRIVER_VERSION", "a00012.html#gac70c03eacdde850267d7fe0d7dca9591", null ], + [ "CRC_DRIVER_USE_CRC16_CCITT_FALSE_AS_DEFAULT", "a00012.html#ga37d19c87e3adeb47db8f6967df0496e1", null ], + [ "crc_polynomial_t", "a00012.html#ga7daa8fa0df9f42a98afcf766a63d931d", [ + [ "kCRC_Polynomial_CRC_CCITT", "a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da9ef1c3d85d4f13199e7df63d170bf6f6", null ], + [ "kCRC_Polynomial_CRC_16", "a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da4a13840f3031b3aed89f60ba37a34c8b", null ], + [ "kCRC_Polynomial_CRC_32", "a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da12ca2ee766202eb962135c76c00b10aa", null ] + ] ], + [ "CRC_Init", "a00012.html#ga7114311534a33b6688f35ceaaa3f7832", null ], + [ "CRC_Deinit", "a00012.html#ga7a4d725b011a98efb29a26bcca04c35b", null ], + [ "CRC_Reset", "a00012.html#ga3c2e6ecc571510470849dc078685d71f", null ], + [ "CRC_WriteSeed", "a00012.html#ga43edd3bec710cb1ca121bfcadbc9b6f7", null ], + [ "CRC_GetDefaultConfig", "a00012.html#gab681cd7c82fbafd927d6b22f23a81804", null ], + [ "CRC_GetConfig", "a00012.html#gac745b626d9c7bd9f3da7986374483389", null ], + [ "CRC_WriteData", "a00012.html#ga33f99b0cb581e677dbc009a695adf5d5", null ], + [ "CRC_Get32bitResult", "a00012.html#ga0c8ce306124e645b27798fad68f3ac4f", null ], + [ "CRC_Get16bitResult", "a00012.html#ga5ce766fd31166d3b0d2d7ba594dac0ce", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00013.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00013.html new file mode 100644 index 0000000..bd3b9cb --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00013.html @@ -0,0 +1,1425 @@ + + + + + + +MCUXpresso SDK API Reference Manual: CTIMER: Standard counter/timers + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
CTIMER: Standard counter/timers
+
+
+

Overview

+

The MCUXpresso SDK provides a driver for the cTimer module of MCUXpresso SDK devices.

+

+Function groups

+

The cTimer driver supports the generation of PWM signals, input capture, and setting up the timer match conditions.

+

+Initialization and deinitialization

+

The function CTIMER_Init() initializes the cTimer with specified configurations. The function CTIMER_GetDefaultConfig() gets the default configurations. The initialization function configures the counter/timer mode and input selection when running in counter mode.

+

The function CTIMER_Deinit() stops the timer and turns off the module clock.

+

+PWM Operations

+

The function CTIMER_SetupPwm() sets up channels for PWM output. Each channel has its own duty cycle, however the same PWM period is applied to all channels requesting the PWM output. The signal duty cycle is provided as a percentage of the PWM period. Its value should be between 0 and 100 0=inactive signal(0% duty cycle) and 100=always active signal (100% duty cycle).

+

The function CTIMER_UpdatePwmDutycycle() updates the PWM signal duty cycle of a particular channel.

+

+Match Operation

+

The function CTIMER_SetupMatch() sets up channels for match operation. Each channel is configured with a match value: if the counter should stop on match, if counter should reset on match, and output pin action. The output signal can be cleared, set, or toggled on match.

+

+Input capture operations

+

The function CTIMER_SetupCapture() sets up an channel for input capture. The user can specify the capture edge and if a interrupt should be generated when processing the input signal.

+

+Typical use case

+

+Match example

+

Set up a match channel to toggle output when a match occurs. Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/ctimer

+

+PWM output example

+

Set up a channel for PWM output. Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/ctimer

+ + + + +

+Files

file  fsl_ctimer.h
 
+ + + + + + + +

+Data Structures

struct  ctimer_match_config_t
 Match configuration. More...
 
struct  ctimer_config_t
 Timer configuration structure. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  ctimer_capture_channel_t {
+  kCTIMER_Capture_0 = 0U, +
+  kCTIMER_Capture_1, +
+  kCTIMER_Capture_2 +
+ }
 List of Timer capture channels. More...
 
enum  ctimer_capture_edge_t {
+  kCTIMER_Capture_RiseEdge = 1U, +
+  kCTIMER_Capture_FallEdge = 2U, +
+  kCTIMER_Capture_BothEdge = 3U +
+ }
 List of capture edge options. More...
 
enum  ctimer_match_t {
+  kCTIMER_Match_0 = 0U, +
+  kCTIMER_Match_1, +
+  kCTIMER_Match_2, +
+  kCTIMER_Match_3 +
+ }
 List of Timer match registers. More...
 
enum  ctimer_external_match_t {
+  kCTIMER_External_Match_0 = (1U << 0), +
+  kCTIMER_External_Match_1 = (1U << 1), +
+  kCTIMER_External_Match_2 = (1U << 2), +
+  kCTIMER_External_Match_3 = (1U << 3) +
+ }
 List of external match. More...
 
enum  ctimer_match_output_control_t {
+  kCTIMER_Output_NoAction = 0U, +
+  kCTIMER_Output_Clear, +
+  kCTIMER_Output_Set, +
+  kCTIMER_Output_Toggle +
+ }
 List of output control options. More...
 
enum  ctimer_timer_mode_t
 List of Timer modes.
 
enum  ctimer_interrupt_enable_t {
+  kCTIMER_Match0InterruptEnable = CTIMER_MCR_MR0I_MASK, +
+  kCTIMER_Match1InterruptEnable = CTIMER_MCR_MR1I_MASK, +
+  kCTIMER_Match2InterruptEnable = CTIMER_MCR_MR2I_MASK, +
+  kCTIMER_Match3InterruptEnable = CTIMER_MCR_MR3I_MASK, +
+  kCTIMER_Capture0InterruptEnable = CTIMER_CCR_CAP0I_MASK, +
+  kCTIMER_Capture1InterruptEnable = CTIMER_CCR_CAP1I_MASK, +
+  kCTIMER_Capture2InterruptEnable = CTIMER_CCR_CAP2I_MASK +
+ }
 List of Timer interrupts. More...
 
enum  ctimer_status_flags_t {
+  kCTIMER_Match0Flag = CTIMER_IR_MR0INT_MASK, +
+  kCTIMER_Match1Flag = CTIMER_IR_MR1INT_MASK, +
+  kCTIMER_Match2Flag = CTIMER_IR_MR2INT_MASK, +
+  kCTIMER_Match3Flag = CTIMER_IR_MR3INT_MASK, +
+  kCTIMER_Capture0Flag = CTIMER_IR_CR0INT_MASK, +
+  kCTIMER_Capture1Flag = CTIMER_IR_CR1INT_MASK, +
+  kCTIMER_Capture2Flag = CTIMER_IR_CR2INT_MASK +
+ }
 List of Timer flags. More...
 
enum  ctimer_callback_type_t {
+  kCTIMER_SingleCallback, +
+  kCTIMER_MultipleCallback +
+ }
 Callback type when registering for a callback. More...
 
+ + + + + + + + + + + + + + + + + + + +

+Functions

void CTIMER_SetupMatch (CTIMER_Type *base, ctimer_match_t matchChannel, const ctimer_match_config_t *config)
 Setup the match register. More...
 
uint32_t CTIMER_GetOutputMatchStatus (CTIMER_Type *base, uint32_t matchChannel)
 Get the status of output match. More...
 
void CTIMER_SetupCapture (CTIMER_Type *base, ctimer_capture_channel_t capture, ctimer_capture_edge_t edge, bool enableInt)
 Setup the capture. More...
 
static uint32_t CTIMER_GetTimerCountValue (CTIMER_Type *base)
 Get the timer count value from TC register. More...
 
void CTIMER_RegisterCallBack (CTIMER_Type *base, ctimer_callback_t *cb_func, ctimer_callback_type_t cb_type)
 Register callback. More...
 
static void CTIMER_Reset (CTIMER_Type *base)
 Reset the counter. More...
 
+ + + + +

+Driver version

+#define FSL_CTIMER_DRIVER_VERSION   (MAKE_VERSION(2, 2, 1))
 Version 2.2.1.
 
+ + + + + + + + + + +

+Initialization and deinitialization

void CTIMER_Init (CTIMER_Type *base, const ctimer_config_t *config)
 Ungates the clock and configures the peripheral for basic operation. More...
 
void CTIMER_Deinit (CTIMER_Type *base)
 Gates the timer clock. More...
 
void CTIMER_GetDefaultConfig (ctimer_config_t *config)
 Fills in the timers configuration structure with the default settings. More...
 
+ + + + + + + + + + + + + +

+PWM setup operations

status_t CTIMER_SetupPwmPeriod (CTIMER_Type *base, const ctimer_match_t pwmPeriodChannel, ctimer_match_t matchChannel, uint32_t pwmPeriod, uint32_t pulsePeriod, bool enableInt)
 Configures the PWM signal parameters. More...
 
status_t CTIMER_SetupPwm (CTIMER_Type *base, const ctimer_match_t pwmPeriodChannel, ctimer_match_t matchChannel, uint8_t dutyCyclePercent, uint32_t pwmFreq_Hz, uint32_t srcClock_Hz, bool enableInt)
 Configures the PWM signal parameters. More...
 
static void CTIMER_UpdatePwmPulsePeriod (CTIMER_Type *base, ctimer_match_t matchChannel, uint32_t pulsePeriod)
 Updates the pulse period of an active PWM signal. More...
 
void CTIMER_UpdatePwmDutycycle (CTIMER_Type *base, const ctimer_match_t pwmPeriodChannel, ctimer_match_t matchChannel, uint8_t dutyCyclePercent)
 Updates the duty cycle of an active PWM signal. More...
 
+ + + + + + + + + + +

+Interrupt Interface

static void CTIMER_EnableInterrupts (CTIMER_Type *base, uint32_t mask)
 Enables the selected Timer interrupts. More...
 
static void CTIMER_DisableInterrupts (CTIMER_Type *base, uint32_t mask)
 Disables the selected Timer interrupts. More...
 
static uint32_t CTIMER_GetEnabledInterrupts (CTIMER_Type *base)
 Gets the enabled Timer interrupts. More...
 
+ + + + + + + +

+Status Interface

static uint32_t CTIMER_GetStatusFlags (CTIMER_Type *base)
 Gets the Timer status flags. More...
 
static void CTIMER_ClearStatusFlags (CTIMER_Type *base, uint32_t mask)
 Clears the Timer status flags. More...
 
+ + + + + + + +

+Counter Start and Stop

static void CTIMER_StartTimer (CTIMER_Type *base)
 Starts the Timer counter. More...
 
static void CTIMER_StopTimer (CTIMER_Type *base)
 Stops the Timer counter. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct ctimer_match_config_t
+
+

This structure holds the configuration settings for each match register.

+
+ + + + + + + + + + + + + + + + + + + +

Data Fields

+uint32_t matchValue
 This is stored in the match register.
 
+bool enableCounterReset
 true: Match will reset the counter false: Match will not reser the counter
 
+bool enableCounterStop
 true: Match will stop the counter false: Match will not stop the counter
 
+ctimer_match_output_control_t outControl
 Action to be taken on a match on the EM bit/output.
 
+bool outPinInitState
 Initial value of the EM bit/output.
 
+bool enableInterrupt
 true: Generate interrupt upon match false: Do not generate interrupt on match
 
+ +
+
+ +
+
+ + + + +
struct ctimer_config_t
+
+

This structure holds the configuration settings for the Timer peripheral. To initialize this structure to reasonable defaults, call the CTIMER_GetDefaultConfig() function and pass a pointer to the configuration structure instance.

+

The configuration structure can be made constant so as to reside in flash.

+
+ + + + + + + + + + +

Data Fields

+ctimer_timer_mode_t mode
 Timer mode.
 
+ctimer_capture_channel_t input
 Input channel to increment the timer, used only in timer modes that rely on this input signal to increment TC.
 
+uint32_t prescale
 Prescale value.
 
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum ctimer_capture_channel_t
+
+ + + + +
Enumerator
kCTIMER_Capture_0  +

Timer capture channel 0.

+
kCTIMER_Capture_1  +

Timer capture channel 1.

+
kCTIMER_Capture_2  +

Timer capture channel 2.

+
+ +
+
+ +
+
+ + + + +
enum ctimer_capture_edge_t
+
+ + + + +
Enumerator
kCTIMER_Capture_RiseEdge  +

Capture on rising edge.

+
kCTIMER_Capture_FallEdge  +

Capture on falling edge.

+
kCTIMER_Capture_BothEdge  +

Capture on rising and falling edge.

+
+ +
+
+ +
+
+ + + + +
enum ctimer_match_t
+
+ + + + + +
Enumerator
kCTIMER_Match_0  +

Timer match register 0.

+
kCTIMER_Match_1  +

Timer match register 1.

+
kCTIMER_Match_2  +

Timer match register 2.

+
kCTIMER_Match_3  +

Timer match register 3.

+
+ +
+
+ +
+
+ + + + +
enum ctimer_external_match_t
+
+ + + + + +
Enumerator
kCTIMER_External_Match_0  +

External match 0.

+
kCTIMER_External_Match_1  +

External match 1.

+
kCTIMER_External_Match_2  +

External match 2.

+
kCTIMER_External_Match_3  +

External match 3.

+
+ +
+
+ +
+
+ + + + + +
Enumerator
kCTIMER_Output_NoAction  +

No action is taken.

+
kCTIMER_Output_Clear  +

Clear the EM bit/output to 0.

+
kCTIMER_Output_Set  +

Set the EM bit/output to 1.

+
kCTIMER_Output_Toggle  +

Toggle the EM bit/output.

+
+ +
+
+ +
+
+ + + + +
enum ctimer_interrupt_enable_t
+
+ + + + + + + + +
Enumerator
kCTIMER_Match0InterruptEnable  +

Match 0 interrupt.

+
kCTIMER_Match1InterruptEnable  +

Match 1 interrupt.

+
kCTIMER_Match2InterruptEnable  +

Match 2 interrupt.

+
kCTIMER_Match3InterruptEnable  +

Match 3 interrupt.

+
kCTIMER_Capture0InterruptEnable  +

Capture 0 interrupt.

+
kCTIMER_Capture1InterruptEnable  +

Capture 1 interrupt.

+
kCTIMER_Capture2InterruptEnable  +

Capture 2 interrupt.

+
+ +
+
+ +
+
+ + + + +
enum ctimer_status_flags_t
+
+ + + + + + + + +
Enumerator
kCTIMER_Match0Flag  +

Match 0 interrupt flag.

+
kCTIMER_Match1Flag  +

Match 1 interrupt flag.

+
kCTIMER_Match2Flag  +

Match 2 interrupt flag.

+
kCTIMER_Match3Flag  +

Match 3 interrupt flag.

+
kCTIMER_Capture0Flag  +

Capture 0 interrupt flag.

+
kCTIMER_Capture1Flag  +

Capture 1 interrupt flag.

+
kCTIMER_Capture2Flag  +

Capture 2 interrupt flag.

+
+ +
+
+ +
+
+ + + + +
enum ctimer_callback_type_t
+
+

When registering a callback an array of function pointers is passed the size could be 1 or 8, the callback type will tell that.

+ + + +
Enumerator
kCTIMER_SingleCallback  +

Single Callback type where there is only one callback for the timer.

+

based on the status flags different channels needs to be handled differently

+
kCTIMER_MultipleCallback  +

Multiple Callback type where there can be 8 valid callbacks, one per channel.

+

for both match/capture

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void CTIMER_Init (CTIMER_Type * base,
const ctimer_config_tconfig 
)
+
+
Note
This API should be called at the beginning of the application before using the driver.
+
Parameters
+ + + +
baseCtimer peripheral base address
configPointer to the user configuration structure.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CTIMER_Deinit (CTIMER_Type * base)
+
+
Parameters
+ + +
baseCtimer peripheral base address
+
+
+ +
+
+ +
+
+ + + + + + + + +
void CTIMER_GetDefaultConfig (ctimer_config_tconfig)
+
+

The default values are:

+
* config->mode = kCTIMER_TimerMode;
+
* config->input = kCTIMER_Capture_0;
+
* config->prescale = 0;
+
*
+
Parameters
+ + +
configPointer to the user configuration structure.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t CTIMER_SetupPwmPeriod (CTIMER_Type * base,
const ctimer_match_t pwmPeriodChannel,
ctimer_match_t matchChannel,
uint32_t pwmPeriod,
uint32_t pulsePeriod,
bool enableInt 
)
+
+

Enables PWM mode on the match channel passed in and will then setup the match value and other match parameters to generate a PWM signal. This function can manually assign the specified channel to set the PWM cycle.

+
Note
When setting PWM output from multiple output pins, all should use the same PWM period
+
Parameters
+ + + + + + + +
baseCtimer peripheral base address
pwmPeriodChannelSpecify the channel to control the PWM period
matchChannelMatch pin to be used to output the PWM signal
pwmPeriodPWM period match value
pulsePeriodPulse width match value
enableIntEnable interrupt when the timer value reaches the match value of the PWM pulse, if it is 0 then no interrupt will be generated.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t CTIMER_SetupPwm (CTIMER_Type * base,
const ctimer_match_t pwmPeriodChannel,
ctimer_match_t matchChannel,
uint8_t dutyCyclePercent,
uint32_t pwmFreq_Hz,
uint32_t srcClock_Hz,
bool enableInt 
)
+
+

Enables PWM mode on the match channel passed in and will then setup the match value and other match parameters to generate a PWM signal. This function can manually assign the specified channel to set the PWM cycle.

+
Note
When setting PWM output from multiple output pins, all should use the same PWM frequency. Please use CTIMER_SetupPwmPeriod to set up the PWM with high resolution.
+
Parameters
+ + + + + + + + +
baseCtimer peripheral base address
pwmPeriodChannelSpecify the channel to control the PWM period
matchChannelMatch pin to be used to output the PWM signal
dutyCyclePercentPWM pulse width; the value should be between 0 to 100
pwmFreq_HzPWM signal frequency in Hz
srcClock_HzTimer counter clock in Hz
enableIntEnable interrupt when the timer value reaches the match value of the PWM pulse, if it is 0 then no interrupt will be generated.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void CTIMER_UpdatePwmPulsePeriod (CTIMER_Type * base,
ctimer_match_t matchChannel,
uint32_t pulsePeriod 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseCtimer peripheral base address
matchChannelMatch pin to be used to output the PWM signal
pulsePeriodNew PWM pulse width match value
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void CTIMER_UpdatePwmDutycycle (CTIMER_Type * base,
const ctimer_match_t pwmPeriodChannel,
ctimer_match_t matchChannel,
uint8_t dutyCyclePercent 
)
+
+
Note
Please use CTIMER_SetupPwmPeriod to update the PWM with high resolution. This function can manually assign the specified channel to set the PWM cycle.
+
Parameters
+ + + + + +
baseCtimer peripheral base address
pwmPeriodChannelSpecify the channel to control the PWM period
matchChannelMatch pin to be used to output the PWM signal
dutyCyclePercentNew PWM pulse width; the value should be between 0 to 100
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void CTIMER_SetupMatch (CTIMER_Type * base,
ctimer_match_t matchChannel,
const ctimer_match_config_tconfig 
)
+
+

User configuration is used to setup the match value and action to be taken when a match occurs.

+
Parameters
+ + + + +
baseCtimer peripheral base address
matchChannelMatch register to configure
configPointer to the match configuration structure
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
uint32_t CTIMER_GetOutputMatchStatus (CTIMER_Type * base,
uint32_t matchChannel 
)
+
+

This function gets the status of output MAT, whether or not this output is connected to a pin. This status is driven to the MAT pins if the match function is selected via IOCON. 0 = LOW. 1 = HIGH.

+
Parameters
+ + + +
baseCtimer peripheral base address
matchChannelExternal match channel, user can obtain the status of multiple match channels at the same time by using the logic of "|" enumeration ctimer_external_match_t
+
+
+
Returns
The mask of external match channel status flags. Users need to use the _ctimer_external_match type to decode the return variables.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void CTIMER_SetupCapture (CTIMER_Type * base,
ctimer_capture_channel_t capture,
ctimer_capture_edge_t edge,
bool enableInt 
)
+
+
Parameters
+ + + + + +
baseCtimer peripheral base address
captureCapture channel to configure
edgeEdge on the channel that will trigger a capture
enableIntFlag to enable channel interrupts, if enabled then the registered call back is called upon capture
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CTIMER_GetTimerCountValue (CTIMER_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseCtimer peripheral base address.
+
+
+
Returns
return the timer count value.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void CTIMER_RegisterCallBack (CTIMER_Type * base,
ctimer_callback_t * cb_func,
ctimer_callback_type_t cb_type 
)
+
+
Parameters
+ + + + +
baseCtimer peripheral base address
cb_funccallback function
cb_typecallback function type, singular or multiple
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void CTIMER_EnableInterrupts (CTIMER_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseCtimer peripheral base address
maskThe interrupts to enable. This is a logical OR of members of the enumeration ctimer_interrupt_enable_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void CTIMER_DisableInterrupts (CTIMER_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseCtimer peripheral base address
maskThe interrupts to enable. This is a logical OR of members of the enumeration ctimer_interrupt_enable_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CTIMER_GetEnabledInterrupts (CTIMER_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseCtimer peripheral base address
+
+
+
Returns
The enabled interrupts. This is the logical OR of members of the enumeration ctimer_interrupt_enable_t
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t CTIMER_GetStatusFlags (CTIMER_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseCtimer peripheral base address
+
+
+
Returns
The status flags. This is the logical OR of members of the enumeration ctimer_status_flags_t
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void CTIMER_ClearStatusFlags (CTIMER_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseCtimer peripheral base address
maskThe status flags to clear. This is a logical OR of members of the enumeration ctimer_status_flags_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void CTIMER_StartTimer (CTIMER_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseCtimer peripheral base address
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void CTIMER_StopTimer (CTIMER_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseCtimer peripheral base address
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void CTIMER_Reset (CTIMER_Type * base)
+
+inlinestatic
+
+

The timer counter and prescale counter are reset on the next positive edge of the APB clock.

+
Parameters
+ + +
baseCtimer peripheral base address
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00013.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00013.js new file mode 100644 index 0000000..95cfb23 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00013.js @@ -0,0 +1,88 @@ +var a00013 = +[ + [ "ctimer_match_config_t", "a00013.html#a00116", [ + [ "matchValue", "a00013.html#afa3614f09e787565b3514ddd4d9545a0", null ], + [ "enableCounterReset", "a00013.html#aaa00b16aba273e3f11f9480154acc1e5", null ], + [ "enableCounterStop", "a00013.html#a94fe2c63ce7fcb5cf68f9ce73974a3e8", null ], + [ "outControl", "a00013.html#a0e8b29f0c0f74c5273942a521e3b16d6", null ], + [ "outPinInitState", "a00013.html#a31ca8ee3406b7a17c793d94469e1e68d", null ], + [ "enableInterrupt", "a00013.html#ae09fd69820c9285d7f146260d2c51584", null ] + ] ], + [ "ctimer_config_t", "a00013.html#a00115", [ + [ "mode", "a00013.html#ab72ef3a10cab9754d3cecb44ef7ad6ac", null ], + [ "input", "a00013.html#ac07c23c0bbadea74c24c03e401321fbc", null ], + [ "prescale", "a00013.html#aa8baec2c586854dc58ff4cdb82b7996b", null ] + ] ], + [ "FSL_CTIMER_DRIVER_VERSION", "a00013.html#ga89b626fd25a5b3bbd511672ff51618f8", null ], + [ "ctimer_capture_channel_t", "a00013.html#ga2fbf5cfa219c31ac16f3786d6897dc3f", [ + [ "kCTIMER_Capture_0", "a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3faa13dee3bb29b8962385da2ac6d8dc938", null ], + [ "kCTIMER_Capture_1", "a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3fac4fcf23f15faa447489ef7ccc4d6cb25", null ], + [ "kCTIMER_Capture_2", "a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3fa9d6d30f6a5498d009cd87fafee3bccd5", null ] + ] ], + [ "ctimer_capture_edge_t", "a00013.html#gac37706bc06bc7590ce1e3d1b4bf73638", [ + [ "kCTIMER_Capture_RiseEdge", "a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638ac8297b7a4be687e63200fc22be1d2f02", null ], + [ "kCTIMER_Capture_FallEdge", "a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638a18a0af674c980ebbdfd0413dcfa3f3c0", null ], + [ "kCTIMER_Capture_BothEdge", "a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638ab73ca62f50120abc4662c750925e9b5a", null ] + ] ], + [ "ctimer_match_t", "a00013.html#gae60f7d34c9e499abba96e5979ee1818d", [ + [ "kCTIMER_Match_0", "a00013.html#ggae60f7d34c9e499abba96e5979ee1818dac06fa7bc66bbb978bc14348fc0cb4633", null ], + [ "kCTIMER_Match_1", "a00013.html#ggae60f7d34c9e499abba96e5979ee1818da38a7356dba8d8a5a8877e9de9fde2faf", null ], + [ "kCTIMER_Match_2", "a00013.html#ggae60f7d34c9e499abba96e5979ee1818da98b35c6f057b201073c8afa4bdce60ed", null ], + [ "kCTIMER_Match_3", "a00013.html#ggae60f7d34c9e499abba96e5979ee1818da6acca2e2ccd6cc6d08a3d958e47c80fb", null ] + ] ], + [ "ctimer_external_match_t", "a00013.html#ga09f5eb858c001377062fe0b8a0d5bd29", [ + [ "kCTIMER_External_Match_0", "a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29a42b2f4d5cb9a524f87f6626169155207", null ], + [ "kCTIMER_External_Match_1", "a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29a90643d7c03749f64e0d20cfcf55a80ed", null ], + [ "kCTIMER_External_Match_2", "a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29ab4602750f83eba0e5cebd0f2ed91a3c4", null ], + [ "kCTIMER_External_Match_3", "a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29aba7194efe10386e467b082fc0b847031", null ] + ] ], + [ "ctimer_match_output_control_t", "a00013.html#ga22cef1fc5f8e23a35b6c3a012e3d143c", [ + [ "kCTIMER_Output_NoAction", "a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143cac387e950c7d8c19c1464dd27e5c7396f", null ], + [ "kCTIMER_Output_Clear", "a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143ca2086fd6712693ac8f0758553ff7bb3d3", null ], + [ "kCTIMER_Output_Set", "a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143cae1b0b02fe1e0af81f62fb40ff8339b8f", null ], + [ "kCTIMER_Output_Toggle", "a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143ca4ad940f7bea1dbae09b156ec0415f5f2", null ] + ] ], + [ "ctimer_timer_mode_t", "a00013.html#ga9cc18e14c871b2a79888a4cdacbb0eee", null ], + [ "ctimer_interrupt_enable_t", "a00013.html#ga0971c614f932bcf55994bf6c92325eb2", [ + [ "kCTIMER_Match0InterruptEnable", "a00013.html#gga0971c614f932bcf55994bf6c92325eb2a05694ae09ff514b7237388b33acaaa99", null ], + [ "kCTIMER_Match1InterruptEnable", "a00013.html#gga0971c614f932bcf55994bf6c92325eb2a47f020e940359f6f08c5c8171d2942b9", null ], + [ "kCTIMER_Match2InterruptEnable", "a00013.html#gga0971c614f932bcf55994bf6c92325eb2ab15c129ca07d334ae13d77e0646c7287", null ], + [ "kCTIMER_Match3InterruptEnable", "a00013.html#gga0971c614f932bcf55994bf6c92325eb2a1f67c8c1e8039ca326e9f25fabffdd0d", null ], + [ "kCTIMER_Capture0InterruptEnable", "a00013.html#gga0971c614f932bcf55994bf6c92325eb2a5fe0ea705babd6351564e59c8db8e928", null ], + [ "kCTIMER_Capture1InterruptEnable", "a00013.html#gga0971c614f932bcf55994bf6c92325eb2a5d70800d3cc33733d42f525242edbbf4", null ], + [ "kCTIMER_Capture2InterruptEnable", "a00013.html#gga0971c614f932bcf55994bf6c92325eb2a68a56db3574cd0ea3bb783c7d13f0894", null ] + ] ], + [ "ctimer_status_flags_t", "a00013.html#gae64285eb2e52bf5cc2b723870392ff60", [ + [ "kCTIMER_Match0Flag", "a00013.html#ggae64285eb2e52bf5cc2b723870392ff60ad76fd4735e0604307b50d2fd12cba3c0", null ], + [ "kCTIMER_Match1Flag", "a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a901042ca905603329df3cf1d316a2e53", null ], + [ "kCTIMER_Match2Flag", "a00013.html#ggae64285eb2e52bf5cc2b723870392ff60af5a6c5ee43a01803e82c26181dedfa97", null ], + [ "kCTIMER_Match3Flag", "a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a02e58518795f05162313b509a600a3d3", null ], + [ "kCTIMER_Capture0Flag", "a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a5504b0ec94b832a46824ec297a106df1", null ], + [ "kCTIMER_Capture1Flag", "a00013.html#ggae64285eb2e52bf5cc2b723870392ff60af3a0db73d48116ea419af737c706b30b", null ], + [ "kCTIMER_Capture2Flag", "a00013.html#ggae64285eb2e52bf5cc2b723870392ff60aaf0224295d4f330d0d61d10ab30f38ea", null ] + ] ], + [ "ctimer_callback_type_t", "a00013.html#ga740677adee6ada817bb45ed62607c3c4", [ + [ "kCTIMER_SingleCallback", "a00013.html#gga740677adee6ada817bb45ed62607c3c4af805d881e4dc37e339a8434c1816f930", null ], + [ "kCTIMER_MultipleCallback", "a00013.html#gga740677adee6ada817bb45ed62607c3c4a38d629ce598178fd96f48660e63ae1e7", null ] + ] ], + [ "CTIMER_Init", "a00013.html#gacae8e1dbb60368ab01a9564de7eda037", null ], + [ "CTIMER_Deinit", "a00013.html#ga97daa711029883d46933204381f44c9f", null ], + [ "CTIMER_GetDefaultConfig", "a00013.html#gac44f44c3f88125a41081ca2a7cf06223", null ], + [ "CTIMER_SetupPwmPeriod", "a00013.html#gacb1f53d8b6a2b157194983172c448707", null ], + [ "CTIMER_SetupPwm", "a00013.html#ga2a70f03b835a36e5b321861d0b0ebb41", null ], + [ "CTIMER_UpdatePwmPulsePeriod", "a00013.html#gad9f4a6073c669662f300d395d66e16bb", null ], + [ "CTIMER_UpdatePwmDutycycle", "a00013.html#ga5d04834d4b29c8505b0a89b8875c2e78", null ], + [ "CTIMER_SetupMatch", "a00013.html#ga64b1d0ba86d952b5ec30e201880c7bb5", null ], + [ "CTIMER_GetOutputMatchStatus", "a00013.html#gae4d610de22fd8b8c9577e774dac88ac5", null ], + [ "CTIMER_SetupCapture", "a00013.html#gae279db71f27ceb5a6d15ad8d17cbd670", null ], + [ "CTIMER_GetTimerCountValue", "a00013.html#ga0b2f1b62dee7adf60574c3410e7bd26f", null ], + [ "CTIMER_RegisterCallBack", "a00013.html#gaa7de0b40e3127d3d8901398df50feb20", null ], + [ "CTIMER_EnableInterrupts", "a00013.html#ga24464606cafc0f316116b164966a906e", null ], + [ "CTIMER_DisableInterrupts", "a00013.html#gaf1b8088779288346a7508dc7ef6e99d1", null ], + [ "CTIMER_GetEnabledInterrupts", "a00013.html#ga635d2570c0274ff40f10ac7b5f3317df", null ], + [ "CTIMER_GetStatusFlags", "a00013.html#gad65b4a95cbfca13083f6d93e7a46f1cb", null ], + [ "CTIMER_ClearStatusFlags", "a00013.html#ga43b7410d9c6aab6aad466bd481b9222b", null ], + [ "CTIMER_StartTimer", "a00013.html#gae9a75a0e18a696baa795ae67aa30a120", null ], + [ "CTIMER_StopTimer", "a00013.html#ga3c7e8e1eb12e5f48ecca04c8128a9545", null ], + [ "CTIMER_Reset", "a00013.html#ga7ea373165af081e0e1700f7a3ba56642", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00014.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00014.html new file mode 100644 index 0000000..9e2270c --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00014.html @@ -0,0 +1,557 @@ + + + + + + +MCUXpresso SDK API Reference Manual: DAC: 10-bit Digital To Analog Converter Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
DAC: 10-bit Digital To Analog Converter Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral driver for the 10-bit digital to analog converter (DAC) module of MCUXpresso SDK devices.

+

+Typical use case

+

+Polling Configuration

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/dac

+

+Interrupt Configuration

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/dac

+ + + + +

+Files

file  fsl_dac.h
 
+ + + + +

+Data Structures

struct  dac_config_t
 The configuration of DAC. More...
 
+ + + + +

+Enumerations

enum  dac_settling_time_t {
+  kDAC_SettlingTimeIs1us = 0U, +
+  kDAC_SettlingTimeIs25us = 1U +
+ }
 The DAC settling time. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

void DAC_Init (DAC_Type *base, const dac_config_t *config)
 Initialize the DAC module. More...
 
void DAC_Deinit (DAC_Type *base)
 De-Initialize the DAC module. More...
 
void DAC_GetDefaultConfig (dac_config_t *config)
 Initializes the DAC user configuration structure. More...
 
void DAC_EnableDoubleBuffering (DAC_Type *base, bool enable)
 Enable/Diable double-buffering feature. More...
 
void DAC_SetBufferValue (DAC_Type *base, uint32_t value)
 Write DAC output value into CR register or pre-buffer. More...
 
void DAC_SetCounterValue (DAC_Type *base, uint32_t value)
 Write DAC counter value into CNTVAL register. More...
 
static void DAC_EnableDMA (DAC_Type *base, bool enable)
 Enable/Disable the DMA access. More...
 
static void DAC_EnableCounter (DAC_Type *base, bool enable)
 Enable/Disable the counter operation. More...
 
static bool DAC_GetDMAInterruptRequestFlag (DAC_Type *base)
 Get the status flag of DMA or interrupt request. More...
 
+ + + + +

+Driver version

#define LPC_DAC_DRIVER_VERSION   (MAKE_VERSION(2, 0, 2))
 DAC driver version 2.0.2. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct dac_config_t
+
+
+ + + + +

Data Fields

dac_settling_time_t settlingTime
 The settling times are valid for a capacitance load on the DAC_OUT pin not exceeding 100 pF. More...
 
+

Field Documentation

+ +
+
+ + + + +
dac_settling_time_t dac_config_t::settlingTime
+
+

A load impedance value greater than that value will cause settling time longer than the specified time. One or more graphs of load impedance vs. settling time will be included in the final data sheet.

+ +
+
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define LPC_DAC_DRIVER_VERSION   (MAKE_VERSION(2, 0, 2))
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum dac_settling_time_t
+
+ + + +
Enumerator
kDAC_SettlingTimeIs1us  +

The settling time of the DAC is 1us max, and the maximum current is 700 mA.

+

This allows a maximum update rate of 1 MHz.

+
kDAC_SettlingTimeIs25us  +

The settling time of the DAC is 2.5us and the maximum current is 350uA.

+

This allows a maximum update rate of 400 kHz.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void DAC_Init (DAC_Type * base,
const dac_config_tconfig 
)
+
+
Parameters
+ + + +
baseDAC peripheral base address.
configThe pointer to configuration structure. Please refer to "dac_config_t" structure.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void DAC_Deinit (DAC_Type * base)
+
+
Parameters
+ + +
baseDAC peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void DAC_GetDefaultConfig (dac_config_tconfig)
+
+

This function initializes the user configuration structure to a default value. The default values are as follows.

+
* config->settlingTime = kDAC_SettlingTimeIs1us;
+
*
+
Parameters
+ + +
configPointer to the configuration structure. See "dac_config_t".
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void DAC_EnableDoubleBuffering (DAC_Type * base,
bool enable 
)
+
+

Notice: Disabling the double-buffering feature will disable counter opreation. If double-buffering feature is disabled, any writes to the CR address will go directly to the CR register. If double-buffering feature is enabled, any write to the CR register will only load the pre-buffer, which shares its register address with the CR register. The CR itself will be loaded from the pre-buffer whenever the counter reaches zero and the DMA request is set.

+
Parameters
+ + + +
baseDAC peripheral base address.
enableEnable or disable the feature.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void DAC_SetBufferValue (DAC_Type * base,
uint32_t value 
)
+
+

The DAC output voltage is VALUE*((VREFP)/1024).

+
Parameters
+ + + +
baseDAC peripheral base address.
valueSetting the value for items in the buffer. 10-bits are available.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void DAC_SetCounterValue (DAC_Type * base,
uint32_t value 
)
+
+
   When the counter is enabled bit, the 16-bit counter will begin counting down, at the rate selected by PCLK,
+   from the value programmed into the DACCNTVAL register. The counter is decremented Each time the counter
+

reaches zero, the counter will be reloaded by the value of DACCNTVAL and the DMA request bit INT_DMA_REQ will be set in hardware.

+
Parameters
+ + + +
baseDAC peripheral basic address.
valueSetting the value for items in the counter. 16-bits are available.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DAC_EnableDMA (DAC_Type * base,
bool enable 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDAC peripheral base address.
enableEnable or disable the feature.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DAC_EnableCounter (DAC_Type * base,
bool enable 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDAC peripheral base address.
enableEnable or disable the feature.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static bool DAC_GetDMAInterruptRequestFlag (DAC_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseDAC peripheral base address.
+
+
+
Returns
If return 'true', it means DMA request or interrupt occurs. If return 'false', it means DMA request or interrupt doesn't occur.
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00014.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00014.js new file mode 100644 index 0000000..1ce65a1 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00014.js @@ -0,0 +1,20 @@ +var a00014 = +[ + [ "dac_config_t", "a00014.html#a00117", [ + [ "settlingTime", "a00014.html#a64eb5fd25bfaaa5593caf6e9116dbb5b", null ] + ] ], + [ "LPC_DAC_DRIVER_VERSION", "a00014.html#ga92d95f6b17de859a557ed350a86ff56e", null ], + [ "dac_settling_time_t", "a00014.html#ga82eecb700b3afeda8b95a6151d8904fc", [ + [ "kDAC_SettlingTimeIs1us", "a00014.html#gga82eecb700b3afeda8b95a6151d8904fca302776aaf6d8780d9b57e9f910615d6f", null ], + [ "kDAC_SettlingTimeIs25us", "a00014.html#gga82eecb700b3afeda8b95a6151d8904fcad460e5e0da52ad16bf771892ebfce1f8", null ] + ] ], + [ "DAC_Init", "a00014.html#ga0331d8c8f699fac12c93a7796d961923", null ], + [ "DAC_Deinit", "a00014.html#gab9cec79763041b1df321a5839982feba", null ], + [ "DAC_GetDefaultConfig", "a00014.html#ga18bbc1eedecdc090c14578740271db0e", null ], + [ "DAC_EnableDoubleBuffering", "a00014.html#ga5ecbd1908f7743934ccdb090ca0cb1d8", null ], + [ "DAC_SetBufferValue", "a00014.html#gabaeabddab20ad3c45aed786a7d12d350", null ], + [ "DAC_SetCounterValue", "a00014.html#gabd7c9e5a5c0b6b35ed2854581f1c6fe8", null ], + [ "DAC_EnableDMA", "a00014.html#ga24947c73973264f0d24d77394c3518e5", null ], + [ "DAC_EnableCounter", "a00014.html#gabee47ca15a3a779e490f073aa1c43563", null ], + [ "DAC_GetDMAInterruptRequestFlag", "a00014.html#ga0a654edfcbb8a6fc80c51a3222fc4d7b", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00015.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00015.html new file mode 100644 index 0000000..f5c6ffd --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00015.html @@ -0,0 +1,2874 @@ + + + + + + +MCUXpresso SDK API Reference Manual: DMA: Direct Memory Access Controller Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
DMA: Direct Memory Access Controller Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral driver for the Direct Memory Access (DMA) of MCUXpresso SDK devices.

+

+Typical use case

+

+DMA Operation

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/dma

+ + + + +

+Files

file  fsl_dma.h
 
+ + + + + + + + + + + + + + + + + + + +

+Data Structures

struct  dma_descriptor_t
 DMA descriptor structure. More...
 
struct  dma_xfercfg_t
 DMA transfer configuration. More...
 
struct  dma_channel_trigger_t
 DMA channel trigger. More...
 
struct  dma_channel_config_t
 DMA channel trigger. More...
 
struct  dma_transfer_config_t
 DMA transfer configuration. More...
 
struct  dma_handle_t
 DMA transfer handle structure. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define DMA_MAX_TRANSFER_COUNT   0x400U
 DMA max transfer size.
 
+#define FSL_FEATURE_DMA_NUMBER_OF_CHANNELSn(x)   FSL_FEATURE_DMA_NUMBER_OF_CHANNELS
 DMA channel numbers.
 
+#define FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE   (16U)
 DMA head link descriptor table align size.
 
#define DMA_ALLOCATE_HEAD_DESCRIPTORS(name, number)   SDK_ALIGN(dma_descriptor_t name[number], FSL_FEATURE_DMA_DESCRIPTOR_ALIGN_SIZE)
 DMA head descriptor table allocate macro To simplify user interface, this macro will help allocate descriptor memory, user just need to provide the name and the number for the allocate descriptor. More...
 
#define DMA_ALLOCATE_HEAD_DESCRIPTORS_AT_NONCACHEABLE(name, number)   AT_NONCACHEABLE_SECTION_ALIGN(dma_descriptor_t name[number], FSL_FEATURE_DMA_DESCRIPTOR_ALIGN_SIZE)
 DMA head descriptor table allocate macro at noncacheable section To simplify user interface, this macro will help allocate descriptor memory at noncacheable section, user just need to provide the name and the number for the allocate descriptor. More...
 
#define DMA_ALLOCATE_LINK_DESCRIPTORS(name, number)   SDK_ALIGN(dma_descriptor_t name[number], FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE)
 DMA link descriptor table allocate macro To simplify user interface, this macro will help allocate descriptor memory, user just need to provide the name and the number for the allocate descriptor. More...
 
#define DMA_ALLOCATE_LINK_DESCRIPTORS_AT_NONCACHEABLE(name, number)   AT_NONCACHEABLE_SECTION_ALIGN(dma_descriptor_t name[number], FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE)
 DMA link descriptor table allocate macro at noncacheable section To simplify user interface, this macro will help allocate descriptor memory at noncacheable section, user just need to provide the name and the number for the allocate descriptor. More...
 
+#define DMA_ALLOCATE_DATA_TRANSFER_BUFFER(name, width)   SDK_ALIGN(name, width)
 DMA transfer buffer address need to align with the transfer width.
 
+#define DMA_COMMON_REG_GET(base, channel, reg)   (((volatile uint32_t *)(&((base)->COMMON[0].reg)))[DMA_CHANNEL_GROUP(channel)])
 DMA linked descriptor address algin size.
 
#define DMA_DESCRIPTOR_END_ADDRESS(start, inc, bytes, width)   ((uint32_t *)((uint32_t)(start) + (inc) * (bytes) - (inc) * (width)))
 DMA descriptor end address calculate. More...
 
#define DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes)
 DMA channel transfer configurations macro. More...
 
+ + + + +

+Typedefs

typedef void(* dma_callback )(struct _dma_handle *handle, void *userData, bool transferDone, uint32_t intmode)
 Define Callback function for DMA. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  { kStatus_DMA_Busy = MAKE_STATUS(kStatusGroup_DMA, 0) + }
 _dma_transfer_status DMA transfer status More...
 
enum  {
+  kDMA_AddressInterleave0xWidth = 0U, +
+  kDMA_AddressInterleave1xWidth = 1U, +
+  kDMA_AddressInterleave2xWidth = 2U, +
+  kDMA_AddressInterleave4xWidth = 4U +
+ }
 _dma_addr_interleave_size dma address interleave size More...
 
enum  {
+  kDMA_Transfer8BitWidth = 1U, +
+  kDMA_Transfer16BitWidth = 2U, +
+  kDMA_Transfer32BitWidth = 4U +
+ }
 _dma_transfer_width dma transfer width More...
 
enum  dma_priority_t {
+  kDMA_ChannelPriority0 = 0, +
+  kDMA_ChannelPriority1, +
+  kDMA_ChannelPriority2, +
+  kDMA_ChannelPriority3, +
+  kDMA_ChannelPriority4, +
+  kDMA_ChannelPriority5, +
+  kDMA_ChannelPriority6, +
+  kDMA_ChannelPriority7 +
+ }
 DMA channel priority. More...
 
enum  dma_irq_t {
+  kDMA_IntA, +
+  kDMA_IntB, +
+  kDMA_IntError +
+ }
 DMA interrupt flags. More...
 
enum  dma_trigger_type_t {
+  kDMA_NoTrigger = 0, +
+  kDMA_LowLevelTrigger = DMA_CHANNEL_CFG_HWTRIGEN(1) | DMA_CHANNEL_CFG_TRIGTYPE(1), +
+  kDMA_HighLevelTrigger, +
+  kDMA_FallingEdgeTrigger = DMA_CHANNEL_CFG_HWTRIGEN(1), +
+  kDMA_RisingEdgeTrigger +
+ }
 DMA trigger type. More...
 
enum  {
+  kDMA_BurstSize1 = 0U, +
+  kDMA_BurstSize2 = 1U, +
+  kDMA_BurstSize4 = 2U, +
+  kDMA_BurstSize8 = 3U, +
+  kDMA_BurstSize16 = 4U, +
+  kDMA_BurstSize32 = 5U, +
+  kDMA_BurstSize64 = 6U, +
+  kDMA_BurstSize128 = 7U, +
+  kDMA_BurstSize256 = 8U, +
+  kDMA_BurstSize512 = 9U, +
+  kDMA_BurstSize1024 = 10U +
+ }
 _dma_burst_size DMA burst size More...
 
enum  dma_trigger_burst_t {
+  kDMA_SingleTransfer = 0, +
+  kDMA_LevelBurstTransfer = DMA_CHANNEL_CFG_TRIGBURST(1), +
+  kDMA_EdgeBurstTransfer1 = DMA_CHANNEL_CFG_TRIGBURST(1), +
+  kDMA_EdgeBurstTransfer2, +
+  kDMA_EdgeBurstTransfer4, +
+  kDMA_EdgeBurstTransfer8, +
+  kDMA_EdgeBurstTransfer16, +
+  kDMA_EdgeBurstTransfer32, +
+  kDMA_EdgeBurstTransfer64, +
+  kDMA_EdgeBurstTransfer128, +
+  kDMA_EdgeBurstTransfer256, +
+  kDMA_EdgeBurstTransfer512, +
+  kDMA_EdgeBurstTransfer1024 +
+ }
 DMA trigger burst. More...
 
enum  dma_burst_wrap_t {
+  kDMA_NoWrap = 0, +
+  kDMA_SrcWrap = DMA_CHANNEL_CFG_SRCBURSTWRAP(1), +
+  kDMA_DstWrap = DMA_CHANNEL_CFG_DSTBURSTWRAP(1), +
+  kDMA_SrcAndDstWrap +
+ }
 DMA burst wrapping. More...
 
enum  dma_transfer_type_t {
+  kDMA_MemoryToMemory = 0x0U, +
+  kDMA_PeripheralToMemory, +
+  kDMA_MemoryToPeripheral, +
+  kDMA_StaticToStatic +
+ }
 DMA transfer type. More...
 
+ + + + +

+Driver version

#define FSL_DMA_DRIVER_VERSION   (MAKE_VERSION(2, 4, 3))
 DMA driver version. More...
 
+ + + + + + + + + + +

+DMA initialization and De-initialization

void DMA_Init (DMA_Type *base)
 Initializes DMA peripheral. More...
 
void DMA_Deinit (DMA_Type *base)
 Deinitializes DMA peripheral. More...
 
void DMA_InstallDescriptorMemory (DMA_Type *base, void *addr)
 Install DMA descriptor memory. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+DMA Channel Operation

static bool DMA_ChannelIsActive (DMA_Type *base, uint32_t channel)
 Return whether DMA channel is processing transfer. More...
 
static bool DMA_ChannelIsBusy (DMA_Type *base, uint32_t channel)
 Return whether DMA channel is busy. More...
 
static void DMA_EnableChannelInterrupts (DMA_Type *base, uint32_t channel)
 Enables the interrupt source for the DMA transfer. More...
 
static void DMA_DisableChannelInterrupts (DMA_Type *base, uint32_t channel)
 Disables the interrupt source for the DMA transfer. More...
 
static void DMA_EnableChannel (DMA_Type *base, uint32_t channel)
 Enable DMA channel. More...
 
static void DMA_DisableChannel (DMA_Type *base, uint32_t channel)
 Disable DMA channel. More...
 
static void DMA_EnableChannelPeriphRq (DMA_Type *base, uint32_t channel)
 Set PERIPHREQEN of channel configuration register. More...
 
static void DMA_DisableChannelPeriphRq (DMA_Type *base, uint32_t channel)
 Get PERIPHREQEN value of channel configuration register. More...
 
void DMA_ConfigureChannelTrigger (DMA_Type *base, uint32_t channel, dma_channel_trigger_t *trigger)
 Set trigger settings of DMA channel. More...
 
void DMA_SetChannelConfig (DMA_Type *base, uint32_t channel, dma_channel_trigger_t *trigger, bool isPeriph)
 set channel config. More...
 
uint32_t DMA_GetRemainingBytes (DMA_Type *base, uint32_t channel)
 Gets the remaining bytes of the current DMA descriptor transfer. More...
 
static void DMA_SetChannelPriority (DMA_Type *base, uint32_t channel, dma_priority_t priority)
 Set priority of channel configuration register. More...
 
static dma_priority_t DMA_GetChannelPriority (DMA_Type *base, uint32_t channel)
 Get priority of channel configuration register. More...
 
static void DMA_SetChannelConfigValid (DMA_Type *base, uint32_t channel)
 Set channel configuration valid. More...
 
static void DMA_DoChannelSoftwareTrigger (DMA_Type *base, uint32_t channel)
 Do software trigger for the channel. More...
 
static void DMA_LoadChannelTransferConfig (DMA_Type *base, uint32_t channel, uint32_t xfer)
 Load channel transfer configurations. More...
 
void DMA_CreateDescriptor (dma_descriptor_t *desc, dma_xfercfg_t *xfercfg, void *srcAddr, void *dstAddr, void *nextDesc)
 Create application specific DMA descriptor to be used in a chain in transfer. More...
 
void DMA_SetupDescriptor (dma_descriptor_t *desc, uint32_t xfercfg, void *srcStartAddr, void *dstStartAddr, void *nextDesc)
 setup dma descriptor More...
 
void DMA_SetupChannelDescriptor (dma_descriptor_t *desc, uint32_t xfercfg, void *srcStartAddr, void *dstStartAddr, void *nextDesc, dma_burst_wrap_t wrapType, uint32_t burstSize)
 setup dma channel descriptor More...
 
void DMA_LoadChannelDescriptor (DMA_Type *base, uint32_t channel, dma_descriptor_t *descriptor)
 load channel transfer decriptor. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+DMA Transactional Operation

void DMA_AbortTransfer (dma_handle_t *handle)
 Abort running transfer by handle. More...
 
void DMA_CreateHandle (dma_handle_t *handle, DMA_Type *base, uint32_t channel)
 Creates the DMA handle. More...
 
void DMA_SetCallback (dma_handle_t *handle, dma_callback callback, void *userData)
 Installs a callback function for the DMA transfer. More...
 
void DMA_PrepareTransfer (dma_transfer_config_t *config, void *srcAddr, void *dstAddr, uint32_t byteWidth, uint32_t transferBytes, dma_transfer_type_t type, void *nextDesc)
 Prepares the DMA transfer structure. More...
 
void DMA_PrepareChannelTransfer (dma_channel_config_t *config, void *srcStartAddr, void *dstStartAddr, uint32_t xferCfg, dma_transfer_type_t type, dma_channel_trigger_t *trigger, void *nextDesc)
 Prepare channel transfer configurations. More...
 
status_t DMA_SubmitTransfer (dma_handle_t *handle, dma_transfer_config_t *config)
 Submits the DMA transfer request. More...
 
void DMA_SubmitChannelTransferParameter (dma_handle_t *handle, uint32_t xferCfg, void *srcStartAddr, void *dstStartAddr, void *nextDesc)
 Submit channel transfer paramter directly. More...
 
void DMA_SubmitChannelDescriptor (dma_handle_t *handle, dma_descriptor_t *descriptor)
 Submit channel descriptor. More...
 
status_t DMA_SubmitChannelTransfer (dma_handle_t *handle, dma_channel_config_t *config)
 Submits the DMA channel transfer request. More...
 
void DMA_StartTransfer (dma_handle_t *handle)
 DMA start transfer. More...
 
void DMA_IRQHandle (DMA_Type *base)
 DMA IRQ handler for descriptor transfer complete. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct dma_descriptor_t
+
+
+ + + + + + + + + + + + + +

Data Fields

+volatile uint32_t xfercfg
 Transfer configuration.
 
+void * srcEndAddr
 Last source address of DMA transfer.
 
+void * dstEndAddr
 Last destination address of DMA transfer.
 
+void * linkToNextDesc
 Address of next DMA descriptor in chain.
 
+ +
+
+ +
+
+ + + + +
struct dma_xfercfg_t
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+bool valid
 Descriptor is ready to transfer.
 
+bool reload
 Reload channel configuration register after current descriptor is exhausted.
 
bool swtrig
 Perform software trigger. More...
 
+bool clrtrig
 Clear trigger.
 
+bool intA
 Raises IRQ when transfer is done and set IRQA status register flag.
 
+bool intB
 Raises IRQ when transfer is done and set IRQB status register flag.
 
+uint8_t byteWidth
 Byte width of data to transfer.
 
+uint8_t srcInc
 Increment source address by 'srcInc' x 'byteWidth'.
 
+uint8_t dstInc
 Increment destination address by 'dstInc' x 'byteWidth'.
 
+uint16_t transferCount
 Number of transfers.
 
+

Field Documentation

+ +
+
+ + + + +
bool dma_xfercfg_t::swtrig
+
+

Transfer if fired when 'valid' is set

+ +
+
+ +
+
+ +
+
+ + + + +
struct dma_channel_trigger_t
+
+
+ + + + + + + + + + +

Data Fields

dma_trigger_type_t type
 Select hardware trigger as edge triggered or level triggered. More...
 
dma_trigger_burst_t burst
 Select whether hardware triggers cause a single or burst transfer. More...
 
dma_burst_wrap_t wrap
 Select wrap type, source wrap or dest wrap, or both. More...
 
+

Field Documentation

+ +
+
+ + + + +
dma_trigger_type_t dma_channel_trigger_t::type
+
+ +
+
+ +
+
+ + + + +
dma_trigger_burst_t dma_channel_trigger_t::burst
+
+ +
+
+ +
+
+ + + + +
dma_burst_wrap_t dma_channel_trigger_t::wrap
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct dma_channel_config_t
+
+
+ + + + + + + + + + + + + + + + + + + +

Data Fields

+void * srcStartAddr
 Source data address.
 
+void * dstStartAddr
 Destination data address.
 
+void * nextDesc
 Chain custom descriptor.
 
+uint32_t xferCfg
 channel transfer configurations
 
+dma_channel_trigger_ttrigger
 DMA trigger type.
 
+bool isPeriph
 select the request type
 
+ +
+
+ +
+
+ + + + +
struct dma_transfer_config_t
+
+
+ + + + + + + + + + + + + + + + +

Data Fields

+uint8_t * srcAddr
 Source data address.
 
+uint8_t * dstAddr
 Destination data address.
 
+uint8_t * nextDesc
 Chain custom descriptor.
 
+dma_xfercfg_t xfercfg
 Transfer options.
 
+bool isPeriph
 DMA transfer is driven by peripheral.
 
+ +
+
+ +
+
+ + + + +
struct dma_handle_t
+
+
+ + + + + + + + + + + + + +

Data Fields

dma_callback callback
 Callback function. More...
 
+void * userData
 Callback function parameter.
 
+DMA_Type * base
 DMA peripheral base address.
 
+uint8_t channel
 DMA channel number.
 
+

Field Documentation

+ +
+
+ + + + +
dma_callback dma_handle_t::callback
+
+

Invoked when transfer of descriptor with interrupt flag finishes

+ +
+
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_DMA_DRIVER_VERSION   (MAKE_VERSION(2, 4, 3))
+
+

Version 2.4.3.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
#define DMA_ALLOCATE_HEAD_DESCRIPTORS( name,
 number 
)   SDK_ALIGN(dma_descriptor_t name[number], FSL_FEATURE_DMA_DESCRIPTOR_ALIGN_SIZE)
+
+
Parameters
+ + + +
nameAllocate decriptor name.
numberNumber of descriptor to be allocated.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
#define DMA_ALLOCATE_HEAD_DESCRIPTORS_AT_NONCACHEABLE( name,
 number 
)   AT_NONCACHEABLE_SECTION_ALIGN(dma_descriptor_t name[number], FSL_FEATURE_DMA_DESCRIPTOR_ALIGN_SIZE)
+
+
Parameters
+ + + +
nameAllocate decriptor name.
numberNumber of descriptor to be allocated.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
#define DMA_ALLOCATE_LINK_DESCRIPTORS( name,
 number 
)   SDK_ALIGN(dma_descriptor_t name[number], FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE)
+
+
Parameters
+ + + +
nameAllocate decriptor name.
numberNumber of descriptor to be allocated.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
#define DMA_ALLOCATE_LINK_DESCRIPTORS_AT_NONCACHEABLE( name,
 number 
)   AT_NONCACHEABLE_SECTION_ALIGN(dma_descriptor_t name[number], FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE)
+
+
Parameters
+ + + +
nameAllocate decriptor name.
numberNumber of descriptor to be allocated.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#define DMA_DESCRIPTOR_END_ADDRESS( start,
 inc,
 bytes,
 width 
)   ((uint32_t *)((uint32_t)(start) + (inc) * (bytes) - (inc) * (width)))
+
+
Parameters
+ + + + + +
startstart address
incaddress interleave size
bytestransfer bytes
widthtransfer width
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#define DMA_CHANNEL_XFER( reload,
 clrTrig,
 intA,
 intB,
 width,
 srcInc,
 dstInc,
 bytes 
)
+
+Value:
DMA_CHANNEL_XFERCFG_CFGVALID_MASK | DMA_CHANNEL_XFERCFG_RELOAD(reload) | DMA_CHANNEL_XFERCFG_CLRTRIG(clrTrig) | \
+
DMA_CHANNEL_XFERCFG_SETINTA(intA) | DMA_CHANNEL_XFERCFG_SETINTB(intB) | \
+
DMA_CHANNEL_XFERCFG_WIDTH(width == 4UL ? 2UL : (width - 1UL)) | \
+
DMA_CHANNEL_XFERCFG_SRCINC(srcInc == (uint32_t)kDMA_AddressInterleave4xWidth ? (srcInc - 1UL) : srcInc) | \
+
DMA_CHANNEL_XFERCFG_DSTINC(dstInc == (uint32_t)kDMA_AddressInterleave4xWidth ? (dstInc - 1UL) : dstInc) | \
+
DMA_CHANNEL_XFERCFG_XFERCOUNT(bytes / width - 1UL)
+
dma source/destination address interleave 3xwidth
Definition: fsl_dma.h:130
+
Parameters
+ + + + + + + + + +
reloadtrue is reload link descriptor after current exhaust, false is not
clrTrigtrue is clear trigger status, wait software trigger, false is not
intAenable interruptA
intBenable interruptB
widthtransfer width
srcIncsource address interleave size
dstIncdestination address interleave size
bytestransfer bytes
+
+
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef void(* dma_callback)(struct _dma_handle *handle, void *userData, bool transferDone, uint32_t intmode)
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
anonymous enum
+
+ + +
Enumerator
kStatus_DMA_Busy  +

Channel is busy and can't handle the transfer request.

+
+ +
+
+ +
+
+ + + + +
anonymous enum
+
+ + + + + +
Enumerator
kDMA_AddressInterleave0xWidth  +

dma source/destination address no interleave

+
kDMA_AddressInterleave1xWidth  +

dma source/destination address interleave 1xwidth

+
kDMA_AddressInterleave2xWidth  +

dma source/destination address interleave 2xwidth

+
kDMA_AddressInterleave4xWidth  +

dma source/destination address interleave 3xwidth

+
+ +
+
+ +
+
+ + + + +
anonymous enum
+
+ + + + +
Enumerator
kDMA_Transfer8BitWidth  +

dma channel transfer bit width is 8 bit

+
kDMA_Transfer16BitWidth  +

dma channel transfer bit width is 16 bit

+
kDMA_Transfer32BitWidth  +

dma channel transfer bit width is 32 bit

+
+ +
+
+ +
+
+ + + + +
enum dma_priority_t
+
+ + + + + + + + + +
Enumerator
kDMA_ChannelPriority0  +

Highest channel priority - priority 0.

+
kDMA_ChannelPriority1  +

Channel priority 1.

+
kDMA_ChannelPriority2  +

Channel priority 2.

+
kDMA_ChannelPriority3  +

Channel priority 3.

+
kDMA_ChannelPriority4  +

Channel priority 4.

+
kDMA_ChannelPriority5  +

Channel priority 5.

+
kDMA_ChannelPriority6  +

Channel priority 6.

+
kDMA_ChannelPriority7  +

Lowest channel priority - priority 7.

+
+ +
+
+ +
+
+ + + + +
enum dma_irq_t
+
+ + + + +
Enumerator
kDMA_IntA  +

DMA interrupt flag A.

+
kDMA_IntB  +

DMA interrupt flag B.

+
kDMA_IntError  +

DMA interrupt flag error.

+
+ +
+
+ +
+
+ + + + +
enum dma_trigger_type_t
+
+ + + + + + +
Enumerator
kDMA_NoTrigger  +

Trigger is disabled.

+
kDMA_LowLevelTrigger  +

Low level active trigger.

+
kDMA_HighLevelTrigger  +

High level active trigger.

+
kDMA_FallingEdgeTrigger  +

Falling edge active trigger.

+
kDMA_RisingEdgeTrigger  +

Rising edge active trigger.

+
+ +
+
+ +
+
+ + + + +
anonymous enum
+
+ + + + + + + + + + + + +
Enumerator
kDMA_BurstSize1  +

burst size 1 transfer

+
kDMA_BurstSize2  +

burst size 2 transfer

+
kDMA_BurstSize4  +

burst size 4 transfer

+
kDMA_BurstSize8  +

burst size 8 transfer

+
kDMA_BurstSize16  +

burst size 16 transfer

+
kDMA_BurstSize32  +

burst size 32 transfer

+
kDMA_BurstSize64  +

burst size 64 transfer

+
kDMA_BurstSize128  +

burst size 128 transfer

+
kDMA_BurstSize256  +

burst size 256 transfer

+
kDMA_BurstSize512  +

burst size 512 transfer

+
kDMA_BurstSize1024  +

burst size 1024 transfer

+
+ +
+
+ +
+
+ + + + +
enum dma_trigger_burst_t
+
+ + + + + + + + + + + + + + +
Enumerator
kDMA_SingleTransfer  +

Single transfer.

+
kDMA_LevelBurstTransfer  +

Burst transfer driven by level trigger.

+
kDMA_EdgeBurstTransfer1  +

Perform 1 transfer by edge trigger.

+
kDMA_EdgeBurstTransfer2  +

Perform 2 transfers by edge trigger.

+
kDMA_EdgeBurstTransfer4  +

Perform 4 transfers by edge trigger.

+
kDMA_EdgeBurstTransfer8  +

Perform 8 transfers by edge trigger.

+
kDMA_EdgeBurstTransfer16  +

Perform 16 transfers by edge trigger.

+
kDMA_EdgeBurstTransfer32  +

Perform 32 transfers by edge trigger.

+
kDMA_EdgeBurstTransfer64  +

Perform 64 transfers by edge trigger.

+
kDMA_EdgeBurstTransfer128  +

Perform 128 transfers by edge trigger.

+
kDMA_EdgeBurstTransfer256  +

Perform 256 transfers by edge trigger.

+
kDMA_EdgeBurstTransfer512  +

Perform 512 transfers by edge trigger.

+
kDMA_EdgeBurstTransfer1024  +

Perform 1024 transfers by edge trigger.

+
+ +
+
+ +
+
+ + + + +
enum dma_burst_wrap_t
+
+ + + + + +
Enumerator
kDMA_NoWrap  +

Wrapping is disabled.

+
kDMA_SrcWrap  +

Wrapping is enabled for source.

+
kDMA_DstWrap  +

Wrapping is enabled for destination.

+
kDMA_SrcAndDstWrap  +

Wrapping is enabled for source and destination.

+
+ +
+
+ +
+
+ + + + +
enum dma_transfer_type_t
+
+ + + + + +
Enumerator
kDMA_MemoryToMemory  +

Transfer from memory to memory (increment source and destination)

+
kDMA_PeripheralToMemory  +

Transfer from peripheral to memory (increment only destination)

+
kDMA_MemoryToPeripheral  +

Transfer from memory to peripheral (increment only source)

+
kDMA_StaticToStatic  +

Peripheral to static memory (do not increment source or destination)

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
void DMA_Init (DMA_Type * base)
+
+

This function enable the DMA clock, set descriptor table and enable DMA peripheral.

+
Parameters
+ + +
baseDMA peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void DMA_Deinit (DMA_Type * base)
+
+

This function gates the DMA clock.

+
Parameters
+ + +
baseDMA peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void DMA_InstallDescriptorMemory (DMA_Type * base,
void * addr 
)
+
+

This function used to register DMA descriptor memory for linked transfer, a typical case is ping pong transfer which will request more than one DMA descriptor memory space, althrough current DMA driver has a default DMA descriptor buffer, but it support one DMA descriptor for one channel only.

+
Parameters
+ + + +
baseDMA base address.
addrDMA descriptor address
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static bool DMA_ChannelIsActive (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+
Returns
True for active state, false otherwise.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static bool DMA_ChannelIsBusy (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+
Returns
True for busy state, false otherwise.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DMA_EnableChannelInterrupts (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DMA_DisableChannelInterrupts (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DMA_EnableChannel (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DMA_DisableChannel (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DMA_EnableChannelPeriphRq (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DMA_DisableChannelPeriphRq (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+
Returns
True for enabled PeriphRq, false for disabled.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_ConfigureChannelTrigger (DMA_Type * base,
uint32_t channel,
dma_channel_trigger_ttrigger 
)
+
+
Deprecated:
Do not use this function. It has been superceded by DMA_SetChannelConfig.
+
Parameters
+ + + + +
baseDMA peripheral base address.
channelDMA channel number.
triggertrigger configuration.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_SetChannelConfig (DMA_Type * base,
uint32_t channel,
dma_channel_trigger_ttrigger,
bool isPeriph 
)
+
+

This function provide a interface to configure channel configuration reisters.

+
Parameters
+ + + + + +
baseDMA base address.
channelDMA channel number.
triggerchannel configurations structure.
isPeriphtrue is periph request, false is not.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
uint32_t DMA_GetRemainingBytes (DMA_Type * base,
uint32_t channel 
)
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+
Returns
The number of bytes which have not been transferred yet.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void DMA_SetChannelPriority (DMA_Type * base,
uint32_t channel,
dma_priority_t priority 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseDMA peripheral base address.
channelDMA channel number.
priorityChannel priority value.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static dma_priority_t DMA_GetChannelPriority (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+
Returns
Channel priority value.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DMA_SetChannelConfigValid (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void DMA_DoChannelSoftwareTrigger (DMA_Type * base,
uint32_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseDMA peripheral base address.
channelDMA channel number.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void DMA_LoadChannelTransferConfig (DMA_Type * base,
uint32_t channel,
uint32_t xfer 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseDMA peripheral base address.
channelDMA channel number.
xfertransfer configurations.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_CreateDescriptor (dma_descriptor_tdesc,
dma_xfercfg_txfercfg,
void * srcAddr,
void * dstAddr,
void * nextDesc 
)
+
+
Deprecated:
Do not use this function. It has been superceded by DMA_SetupDescriptor.
+
Parameters
+ + + + + + +
descDMA descriptor address.
xfercfgTransfer configuration for DMA descriptor.
srcAddrAddress of last item to transmit
dstAddrAddress of last item to receive.
nextDescAddress of next descriptor in chain.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_SetupDescriptor (dma_descriptor_tdesc,
uint32_t xfercfg,
void * srcStartAddr,
void * dstStartAddr,
void * nextDesc 
)
+
+

Note: This function do not support configure wrap descriptor.

+
Parameters
+ + + + + + +
descDMA descriptor address.
xfercfgTransfer configuration for DMA descriptor.
srcStartAddrStart address of source address.
dstStartAddrStart address of destination address.
nextDescAddress of next descriptor in chain.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_SetupChannelDescriptor (dma_descriptor_tdesc,
uint32_t xfercfg,
void * srcStartAddr,
void * dstStartAddr,
void * nextDesc,
dma_burst_wrap_t wrapType,
uint32_t burstSize 
)
+
+

Note: This function support configure wrap descriptor.

+
Parameters
+ + + + + + + + +
descDMA descriptor address.
xfercfgTransfer configuration for DMA descriptor.
srcStartAddrStart address of source address.
dstStartAddrStart address of destination address.
nextDescAddress of next descriptor in chain.
wrapTypeburst wrap type.
burstSizeburst size, reference _dma_burst_size.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_LoadChannelDescriptor (DMA_Type * base,
uint32_t channel,
dma_descriptor_tdescriptor 
)
+
+

This function can be used to load desscriptor to driver internal channel descriptor that is used to start DMA transfer, the head descriptor table is defined in DMA driver, it is useful for the case:

+
    +
  1. for the polling transfer, application can allocate a local descriptor memory table to prepare a descriptor firstly and then call this api to load the configured descriptor to driver descriptor table.
    * DMA_Init(DMA0);
    +
    * DMA_EnableChannel(DMA0, DEMO_DMA_CHANNEL);
    +
    * DMA_SetupDescriptor(desc, xferCfg, s_srcBuffer, &s_destBuffer[0], NULL);
    +
    * DMA_LoadChannelDescriptor(DMA0, DEMO_DMA_CHANNEL, (dma_descriptor_t *)desc);
    +
    * DMA_DoChannelSoftwareTrigger(DMA0, DEMO_DMA_CHANNEL);
    +
    * while(DMA_ChannelIsBusy(DMA0, DEMO_DMA_CHANNEL))
    +
    * {}
    +
    *
    +
  2. +
+
Parameters
+ + + + +
baseDMA base address.
channelDMA channel.
descriptorconfigured DMA descriptor.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void DMA_AbortTransfer (dma_handle_thandle)
+
+

This function aborts DMA transfer specified by handle.

+
Parameters
+ + +
handleDMA handle pointer.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_CreateHandle (dma_handle_thandle,
DMA_Type * base,
uint32_t channel 
)
+
+

This function is called if using transaction API for DMA. This function initializes the internal state of DMA handle.

+
Parameters
+ + + + +
handleDMA handle pointer. The DMA handle stores callback function and parameters.
baseDMA peripheral base address.
channelDMA channel number.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_SetCallback (dma_handle_thandle,
dma_callback callback,
void * userData 
)
+
+

This callback is called in DMA IRQ handler. Use the callback to do something after the current major loop transfer completes.

+
Parameters
+ + + + +
handleDMA handle pointer.
callbackDMA callback function pointer.
userDataParameter for callback function.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_PrepareTransfer (dma_transfer_config_tconfig,
void * srcAddr,
void * dstAddr,
uint32_t byteWidth,
uint32_t transferBytes,
dma_transfer_type_t type,
void * nextDesc 
)
+
+
Deprecated:
Do not use this function. It has been superceded by DMA_PrepareChannelTransfer. This function prepares the transfer configuration structure according to the user input.
+
Parameters
+ + + + + + + + +
configThe user configuration structure of type dma_transfer_t.
srcAddrDMA transfer source address.
dstAddrDMA transfer destination address.
byteWidthDMA transfer destination address width(bytes).
transferBytesDMA transfer bytes to be transferred.
typeDMA transfer type.
nextDescChain custom descriptor to transfer.
+
+
+
Note
The data address and the data width must be consistent. For example, if the SRC is 4 bytes, so the source address must be 4 bytes aligned, or it shall result in source address error(SAE).
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_PrepareChannelTransfer (dma_channel_config_tconfig,
void * srcStartAddr,
void * dstStartAddr,
uint32_t xferCfg,
dma_transfer_type_t type,
dma_channel_trigger_ttrigger,
void * nextDesc 
)
+
+

This function used to prepare channel transfer configurations.

+
Parameters
+ + + + + + + + +
configPointer to DMA channel transfer configuration structure.
srcStartAddrsource start address.
dstStartAddrdestination start address.
xferCfgxfer configuration, user can reference DMA_CHANNEL_XFER about to how to get xferCfg value.
typetransfer type.
triggerDMA channel trigger configurations.
nextDescaddress of next descriptor.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t DMA_SubmitTransfer (dma_handle_thandle,
dma_transfer_config_tconfig 
)
+
+
Deprecated:
Do not use this function. It has been superceded by DMA_SubmitChannelTransfer.
+

This function submits the DMA transfer request according to the transfer configuration structure. If the user submits the transfer request repeatedly, this function packs an unprocessed request as a TCD and enables scatter/gather feature to process it in the next time.

+
Parameters
+ + + +
handleDMA handle pointer.
configPointer to DMA transfer configuration structure.
+
+
+
Return values
+ + + + +
kStatus_DMA_SuccessIt means submit transfer request succeed.
kStatus_DMA_QueueFullIt means TCD queue is full. Submit transfer request is not allowed.
kStatus_DMA_BusyIt means the given channel is busy, need to submit request later.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void DMA_SubmitChannelTransferParameter (dma_handle_thandle,
uint32_t xferCfg,
void * srcStartAddr,
void * dstStartAddr,
void * nextDesc 
)
+
+

This function used to configue channel head descriptor that is used to start DMA transfer, the head descriptor table is defined in DMA driver, it is useful for the case:

+
    +
  1. for the single transfer, application doesn't need to allocate descriptor table, the head descriptor can be used for it.
    DMA_SetChannelConfig(base, channel, trigger, isPeriph);
    +
    DMA_CreateHandle(handle, base, channel)
    +
    DMA_SubmitChannelTransferParameter(handle, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc,
    +
    bytes), srcStartAddr, dstStartAddr, NULL);
    + +
    *
    +
  2. +
  3. for the linked transfer, application should responsible for link descriptor, for example, if 4 transfer is required, then application should prepare three descriptor table with macro , the head descriptor in driver can be used for the first transfer descriptor.
    define link descriptor table in application with macro
    +
    DMA_ALLOCATE_LINK_DESCRIPTOR(nextDesc[3]);
    +
    +
    DMA_SetupDescriptor(nextDesc0, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, nextDesc1);
    +
    DMA_SetupDescriptor(nextDesc1, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, nextDesc2);
    +
    DMA_SetupDescriptor(nextDesc2, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, NULL);
    +
    DMA_SetChannelConfig(base, channel, trigger, isPeriph);
    +
    DMA_CreateHandle(handle, base, channel)
    +
    DMA_SubmitChannelTransferParameter(handle, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc,
    +
    bytes), srcStartAddr, dstStartAddr, nextDesc0);
    + +
    *
    +
  4. +
+
Parameters
+ + + + + + +
handlePointer to DMA handle.
xferCfgxfer configuration, user can reference DMA_CHANNEL_XFER about to how to get xferCfg value.
srcStartAddrsource start address.
dstStartAddrdestination start address.
nextDescaddress of next descriptor.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void DMA_SubmitChannelDescriptor (dma_handle_thandle,
dma_descriptor_tdescriptor 
)
+
+

This function used to configue channel head descriptor that is used to start DMA transfer, the head descriptor table is defined in DMA driver, this functiono is typical for the ping pong case:

+
    +
  1. for the ping pong case, application should responsible for the descriptor, for example, application should prepare two descriptor table with macro.
    define link descriptor table in application with macro
    +
    DMA_ALLOCATE_LINK_DESCRIPTOR(nextDesc[2]);
    +
    +
    DMA_SetupDescriptor(nextDesc0, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, nextDesc1);
    +
    DMA_SetupDescriptor(nextDesc1, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, nextDesc0);
    +
    DMA_SetChannelConfig(base, channel, trigger, isPeriph);
    +
    DMA_CreateHandle(handle, base, channel)
    +
    DMA_SubmitChannelDescriptor(handle, nextDesc0);
    + +
    *
    +
  2. +
+
Parameters
+ + + +
handlePointer to DMA handle.
descriptordescriptor to submit.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t DMA_SubmitChannelTransfer (dma_handle_thandle,
dma_channel_config_tconfig 
)
+
+

This function submits the DMA transfer request according to the transfer configuration structure. If the user submits the transfer request repeatedly, this function packs an unprocessed request as a TCD and enables scatter/gather feature to process it in the next time. It is used for the case:

+
    +
  1. for the single transfer, application doesn't need to allocate descriptor table, the head descriptor can be used for it.
    DMA_CreateHandle(handle, base, channel)
    +
    DMA_PrepareChannelTransfer(config,srcStartAddr,dstStartAddr,xferCfg,type,trigger,NULL);
    +
    DMA_SubmitChannelTransfer(handle, config)
    + +
    *
    +
  2. +
  3. for the linked transfer, application should responsible for link descriptor, for example, if 4 transfer is required, then application should prepare three descriptor table with macro , the head descriptor in driver can be used for the first transfer descriptor.
    define link descriptor table in application with macro
    +
    DMA_ALLOCATE_LINK_DESCRIPTOR(nextDesc);
    +
    DMA_SetupDescriptor(nextDesc0, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, nextDesc1);
    +
    DMA_SetupDescriptor(nextDesc1, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, nextDesc2);
    +
    DMA_SetupDescriptor(nextDesc2, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, NULL);
    +
    DMA_CreateHandle(handle, base, channel)
    +
    DMA_PrepareChannelTransfer(config,srcStartAddr,dstStartAddr,xferCfg,type,trigger,nextDesc0);
    +
    DMA_SubmitChannelTransfer(handle, config)
    + +
    *
    +
  4. +
  5. for the ping pong case, application should responsible for link descriptor, for example, application should prepare two descriptor table with macro , the head descriptor in driver can be used for the first transfer descriptor.
    define link descriptor table in application with macro
    +
    DMA_ALLOCATE_LINK_DESCRIPTOR(nextDesc);
    +
    +
    DMA_SetupDescriptor(nextDesc0, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, nextDesc1);
    +
    DMA_SetupDescriptor(nextDesc1, DMA_CHANNEL_XFER(reload, clrTrig, intA, intB, width, srcInc, dstInc, bytes),
    +
    srcStartAddr, dstStartAddr, nextDesc0);
    +
    DMA_CreateHandle(handle, base, channel)
    +
    DMA_PrepareChannelTransfer(config,srcStartAddr,dstStartAddr,xferCfg,type,trigger,nextDesc0);
    +
    DMA_SubmitChannelTransfer(handle, config)
    + +
    *
    +
    Parameters
    + + + +
    handleDMA handle pointer.
    configPointer to DMA transfer configuration structure.
    +
    +
    +
    Return values
    + + + + +
    kStatus_DMA_SuccessIt means submit transfer request succeed.
    kStatus_DMA_QueueFullIt means TCD queue is full. Submit transfer request is not allowed.
    kStatus_DMA_BusyIt means the given channel is busy, need to submit request later.
    +
    +
    +
  6. +
+ +
+
+ +
+
+ + + + + + + + +
void DMA_StartTransfer (dma_handle_thandle)
+
+

This function enables the channel request. User can call this function after submitting the transfer request It will trigger transfer start with software trigger only when hardware trigger is not used.

+
Parameters
+ + +
handleDMA handle pointer.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void DMA_IRQHandle (DMA_Type * base)
+
+

This function clears the channel major interrupt flag and call the callback function if it is not NULL.

+
Parameters
+ + +
baseDMA base address.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00015.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00015.js new file mode 100644 index 0000000..876b5f6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00015.js @@ -0,0 +1,163 @@ +var a00015 = +[ + [ "dma_descriptor_t", "a00015.html#a00120", [ + [ "xfercfg", "a00015.html#ad49be57eb231061b32b021a8854fe425", null ], + [ "srcEndAddr", "a00015.html#aabb52c29097e7d9eedb34f5421740f04", null ], + [ "dstEndAddr", "a00015.html#ab0a39d7a7b627b1a714117f2d150bac0", null ], + [ "linkToNextDesc", "a00015.html#a8b4151dcf43270fbbeff39334048e7e1", null ] + ] ], + [ "dma_xfercfg_t", "a00015.html#a00123", [ + [ "valid", "a00015.html#a4a97a76d0d7266ee9cc8de82d19e5d81", null ], + [ "reload", "a00015.html#a6387faccdc3dcd079d22b56b1c4806fd", null ], + [ "swtrig", "a00015.html#a69253cda0502dcfa038c5d71a3cac593", null ], + [ "clrtrig", "a00015.html#ab30c2a4b2d436b966ba948edb010688f", null ], + [ "intA", "a00015.html#ae2c9381d6fc00cee3491c5a8217c30a1", null ], + [ "intB", "a00015.html#a7827b3fe247d5d7218b0263ecbb0aede", null ], + [ "byteWidth", "a00015.html#a93c1b2f32e5e046cf10ba7e8b1c215ce", null ], + [ "srcInc", "a00015.html#ab21f9a2d11b2ce02da230adfd32b789e", null ], + [ "dstInc", "a00015.html#a674be34352d78e2029f8b36f0664cf6f", null ], + [ "transferCount", "a00015.html#a11b16354c24a04222507d6508a475bab", null ] + ] ], + [ "dma_channel_trigger_t", "a00015.html#a00119", [ + [ "type", "a00015.html#a80afb7ab2642836025d063ac8b0c9738", null ], + [ "burst", "a00015.html#a66ad3f0d6159adbb560799bfb93da76a", null ], + [ "wrap", "a00015.html#acbcaa81a9d2806d3fa021b5ad27fea6f", null ] + ] ], + [ "dma_channel_config_t", "a00015.html#a00118", [ + [ "srcStartAddr", "a00015.html#a50d258467783dad5f163860724cb4c32", null ], + [ "dstStartAddr", "a00015.html#a7cf6b2c7eef13541394e9131987a2209", null ], + [ "nextDesc", "a00015.html#a7bdfedca753e094b2c288f1cbb956889", null ], + [ "xferCfg", "a00015.html#a93ad6347b6c5e7c72320be81a67f6baf", null ], + [ "trigger", "a00015.html#ae2b24289699bf3639fea8bb56baf0d15", null ], + [ "isPeriph", "a00015.html#a0ab90a7e2c3a70511144d346a52aeea7", null ] + ] ], + [ "dma_transfer_config_t", "a00015.html#a00122", [ + [ "srcAddr", "a00015.html#a2a315d0141311dd82dd6ac1a3523671b", null ], + [ "dstAddr", "a00015.html#a8eb88e8dcaea9033a76c0003fcabadd8", null ], + [ "nextDesc", "a00015.html#a24f716a2b7775c1cb9a59b7c2374508b", null ], + [ "xfercfg", "a00015.html#a365dbf9376f6927bc8b6527ce136914c", null ], + [ "isPeriph", "a00015.html#a3d7f9ccb3edc3a6b1dbf2feb5a8b8f93", null ] + ] ], + [ "dma_handle_t", "a00015.html#a00121", [ + [ "callback", "a00015.html#a47a5c6af4c934cc9db355d394bb94f46", null ], + [ "userData", "a00015.html#a2a10a0701fc2085ce58a0e35032e8a8e", null ], + [ "base", "a00015.html#a84d667acc1301d6d56ae52573e4b6b87", null ], + [ "channel", "a00015.html#a7c068d330cc60423ee3fd86821221b85", null ] + ] ], + [ "FSL_DMA_DRIVER_VERSION", "a00015.html#gac68c8082b53756a7e58ec6d5f25117d2", null ], + [ "DMA_MAX_TRANSFER_COUNT", "a00015.html#gaebe7d948ac31ff020dde038034ae3bbd", null ], + [ "FSL_FEATURE_DMA_NUMBER_OF_CHANNELSn", "a00015.html#ga7acdd2a8f51e171c777a4e53bd5c57e7", null ], + [ "FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE", "a00015.html#ga160b4ffad583e82ad4a80575e4830592", null ], + [ "DMA_ALLOCATE_HEAD_DESCRIPTORS", "a00015.html#gac52594676141a30266441619dca00d40", null ], + [ "DMA_ALLOCATE_HEAD_DESCRIPTORS_AT_NONCACHEABLE", "a00015.html#ga9f9ae6642bb5eeed8ccc1dffa7ec14e1", null ], + [ "DMA_ALLOCATE_LINK_DESCRIPTORS", "a00015.html#ga6dcd898a0c546f25356e016b9276a3de", null ], + [ "DMA_ALLOCATE_LINK_DESCRIPTORS_AT_NONCACHEABLE", "a00015.html#ga2cc9e4b6dceb1346d950ab7fb5f52bb7", null ], + [ "DMA_ALLOCATE_DATA_TRANSFER_BUFFER", "a00015.html#ga79665a4079015c9420f1dd82e15f4b30", null ], + [ "DMA_COMMON_REG_GET", "a00015.html#ga17d8b80c6e8d8c3ac95c2424f26e723f", null ], + [ "DMA_DESCRIPTOR_END_ADDRESS", "a00015.html#gaa355501ba0bfb05cc9be452396f92bce", null ], + [ "DMA_CHANNEL_XFER", "a00015.html#ga2e10dd7fac0c8a71b801cfff2d21d1fa", null ], + [ "dma_callback", "a00015.html#gab844237884d5badd07ac902a9be34275", [ + [ "kStatus_DMA_Busy", "a00015.html#gga99fb83031ce9923c84392b4e92f956b5a9b95dc670083f57c33f96b0c10d0c8ba", null ], + [ "kDMA_AddressInterleave0xWidth", "a00015.html#ggabc6126af1d45847bc59afa0aa3216b04ad9802a5e2f1df9d748838e6e23e0279b", null ], + [ "kDMA_AddressInterleave1xWidth", "a00015.html#ggabc6126af1d45847bc59afa0aa3216b04a84af12bf3a826e9f4725ae5bb4bbebb8", null ], + [ "kDMA_AddressInterleave2xWidth", "a00015.html#ggabc6126af1d45847bc59afa0aa3216b04ad703190659614263db03cea5d2dfbb6e", null ], + [ "kDMA_AddressInterleave4xWidth", "a00015.html#ggabc6126af1d45847bc59afa0aa3216b04aecf2cec42cd7819983e265710c691888", null ], + [ "kDMA_Transfer8BitWidth", "a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca80c88f3fbb3bb2946149c0ec7a7e922a", null ], + [ "kDMA_Transfer16BitWidth", "a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca5b38513482d6d6d92927898f9e2c7703", null ], + [ "kDMA_Transfer32BitWidth", "a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca1a43c564953a0e097907e45cd159c265", null ] + ] ], + [ "dma_priority_t", "a00015.html#ga63f28310491d665df0ad9a99dc22a77f", [ + [ "kDMA_ChannelPriority0", "a00015.html#gga63f28310491d665df0ad9a99dc22a77fafaf9bf976bb9d2db3bd2f629cd545f45", null ], + [ "kDMA_ChannelPriority1", "a00015.html#gga63f28310491d665df0ad9a99dc22a77fa6ff9161839b0b5e675b01353a684a63f", null ], + [ "kDMA_ChannelPriority2", "a00015.html#gga63f28310491d665df0ad9a99dc22a77fa259e4e6cf7b6b79608abbe1769e262fe", null ], + [ "kDMA_ChannelPriority3", "a00015.html#gga63f28310491d665df0ad9a99dc22a77fa8615d84237aa24c16fdc1675cc932efb", null ], + [ "kDMA_ChannelPriority4", "a00015.html#gga63f28310491d665df0ad9a99dc22a77fae7f6c72a518bc4c68b3be696da1a872d", null ], + [ "kDMA_ChannelPriority5", "a00015.html#gga63f28310491d665df0ad9a99dc22a77fa08b83d1381be3c10688f449c9bf90fc4", null ], + [ "kDMA_ChannelPriority6", "a00015.html#gga63f28310491d665df0ad9a99dc22a77facc5b892b2bcf8a632acb64e9c5645273", null ], + [ "kDMA_ChannelPriority7", "a00015.html#gga63f28310491d665df0ad9a99dc22a77faf238cfde678fdbd26a054fc055f40a4d", null ] + ] ], + [ "dma_irq_t", "a00015.html#ga5658ee3bb7fbf1da24d997d9bc341e11", [ + [ "kDMA_IntA", "a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11ab39861058eb1c9573babd0752286ea48", null ], + [ "kDMA_IntB", "a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11a50cabcc60fb8dc805c62070318fe0c97", null ], + [ "kDMA_IntError", "a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11a28e17f00c59b3dde88943be07a8902bd", null ] + ] ], + [ "dma_trigger_type_t", "a00015.html#ga0468cf171e413581e9bba9803df91427", [ + [ "kDMA_NoTrigger", "a00015.html#gga0468cf171e413581e9bba9803df91427ae45693316c3b50f21a0fa93e539e9ae5", null ], + [ "kDMA_LowLevelTrigger", "a00015.html#gga0468cf171e413581e9bba9803df91427aca6b545d2f8661404c932a70b8a5abcf", null ], + [ "kDMA_HighLevelTrigger", "a00015.html#gga0468cf171e413581e9bba9803df91427a4636793fc071ed9f8e753e84a6e12f85", null ], + [ "kDMA_FallingEdgeTrigger", "a00015.html#gga0468cf171e413581e9bba9803df91427a9b9f27849a8e3cf715e30a29b4ba1d04", null ], + [ "kDMA_RisingEdgeTrigger", "a00015.html#gga0468cf171e413581e9bba9803df91427aa4d1b3c95a9ca3d756d2f68a3bb0afc8", null ], + [ "kDMA_BurstSize1", "a00015.html#gga61dadd085c1777f559549e05962b2c9eafa3126f29988635183fa3851e1ee1f2d", null ], + [ "kDMA_BurstSize2", "a00015.html#gga61dadd085c1777f559549e05962b2c9ea3144a4ab7b2408051fc06ab07b583eab", null ], + [ "kDMA_BurstSize4", "a00015.html#gga61dadd085c1777f559549e05962b2c9eac5b15e2705b1295a56557036487d291b", null ], + [ "kDMA_BurstSize8", "a00015.html#gga61dadd085c1777f559549e05962b2c9ea7aacfca8b6c86bdd0e727b0c8ae046b1", null ], + [ "kDMA_BurstSize16", "a00015.html#gga61dadd085c1777f559549e05962b2c9ead6487c57cdb11ae590172c2ff1364ca8", null ], + [ "kDMA_BurstSize32", "a00015.html#gga61dadd085c1777f559549e05962b2c9eae05054c8a11020169733c22349aa158e", null ], + [ "kDMA_BurstSize64", "a00015.html#gga61dadd085c1777f559549e05962b2c9eacb974685c9968ac9dbf74035ecf23bb6", null ], + [ "kDMA_BurstSize128", "a00015.html#gga61dadd085c1777f559549e05962b2c9ea3c0044f4c389c21f73b08dbb0b8ef829", null ], + [ "kDMA_BurstSize256", "a00015.html#gga61dadd085c1777f559549e05962b2c9eac03b658552cde955b815365386e40a70", null ], + [ "kDMA_BurstSize512", "a00015.html#gga61dadd085c1777f559549e05962b2c9ea491cc51131bb7e9dcd647e54ec8549e7", null ], + [ "kDMA_BurstSize1024", "a00015.html#gga61dadd085c1777f559549e05962b2c9eaf12e2d1fe9b0fccba12b6cad6bc685b3", null ] + ] ], + [ "dma_trigger_burst_t", "a00015.html#ga776b1091528ddc2571284f481ddde830", [ + [ "kDMA_SingleTransfer", "a00015.html#gga776b1091528ddc2571284f481ddde830aa5f7edec7506a38b3b57d04dd774b0b0", null ], + [ "kDMA_LevelBurstTransfer", "a00015.html#gga776b1091528ddc2571284f481ddde830aa6cc38822f852f1ddd1f22c5b79949b8", null ], + [ "kDMA_EdgeBurstTransfer1", "a00015.html#gga776b1091528ddc2571284f481ddde830af06ebd49d4066394642c80ece815d55b", null ], + [ "kDMA_EdgeBurstTransfer2", "a00015.html#gga776b1091528ddc2571284f481ddde830af0ab73a40234a51b14203e7d83621ac9", null ], + [ "kDMA_EdgeBurstTransfer4", "a00015.html#gga776b1091528ddc2571284f481ddde830a42eb0fe4fd6b2030e64b5d0173c93c68", null ], + [ "kDMA_EdgeBurstTransfer8", "a00015.html#gga776b1091528ddc2571284f481ddde830a4858703ddbc176a60c3015f23a490e17", null ], + [ "kDMA_EdgeBurstTransfer16", "a00015.html#gga776b1091528ddc2571284f481ddde830a0641c94c5e494890f587f3cb60ed7800", null ], + [ "kDMA_EdgeBurstTransfer32", "a00015.html#gga776b1091528ddc2571284f481ddde830af1764eeb6c94e0e1f86529bf6210c524", null ], + [ "kDMA_EdgeBurstTransfer64", "a00015.html#gga776b1091528ddc2571284f481ddde830a8dec3f95cf71d668439e065b17f27235", null ], + [ "kDMA_EdgeBurstTransfer128", "a00015.html#gga776b1091528ddc2571284f481ddde830af2c60c5f0dcbd8bd7d782a7c08c87f0b", null ], + [ "kDMA_EdgeBurstTransfer256", "a00015.html#gga776b1091528ddc2571284f481ddde830a8640003c589e5d3ffd94d4cd962b8456", null ], + [ "kDMA_EdgeBurstTransfer512", "a00015.html#gga776b1091528ddc2571284f481ddde830a0ef881d258e59978faca416630fb1a74", null ], + [ "kDMA_EdgeBurstTransfer1024", "a00015.html#gga776b1091528ddc2571284f481ddde830a6aae117efdce18b2c054ddae971559da", null ] + ] ], + [ "dma_burst_wrap_t", "a00015.html#gacea88ecaac2447ba3c9f2157e40b9a82", [ + [ "kDMA_NoWrap", "a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82a99b1a9eb98902b9277c2ae64f48e5a88", null ], + [ "kDMA_SrcWrap", "a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82ac0ab79249ad0e6bf887498d0f3e3db90", null ], + [ "kDMA_DstWrap", "a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82afaae8afb83546031e25b0ac5e6494f2b", null ], + [ "kDMA_SrcAndDstWrap", "a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82a543352fa3896623517af17829598eb0c", null ] + ] ], + [ "dma_transfer_type_t", "a00015.html#ga9cb7087af6efc80106c1033f80d60219", [ + [ "kDMA_MemoryToMemory", "a00015.html#gga9cb7087af6efc80106c1033f80d60219a24392a93deeb55e04559201839343f3c", null ], + [ "kDMA_PeripheralToMemory", "a00015.html#gga9cb7087af6efc80106c1033f80d60219a7bf1938ae68b1f494aade7a0f4189303", null ], + [ "kDMA_MemoryToPeripheral", "a00015.html#gga9cb7087af6efc80106c1033f80d60219aae1c6bab576d7a25d2fa1249f9cd4ee9", null ], + [ "kDMA_StaticToStatic", "a00015.html#gga9cb7087af6efc80106c1033f80d60219af59909afb24e786824cfecdb6afd0da8", null ] + ] ], + [ "DMA_Init", "a00015.html#gade1b5efa61054ce538b37b181dd075bb", null ], + [ "DMA_Deinit", "a00015.html#ga634ced9b86d7dc9543e0b4387123fcac", null ], + [ "DMA_InstallDescriptorMemory", "a00015.html#ga9ba95776f25ee8eae5bdf9bf5fd9c9e6", null ], + [ "DMA_ChannelIsActive", "a00015.html#ga0e6279e44ebd6778355f6e9e26e9a8b6", null ], + [ "DMA_ChannelIsBusy", "a00015.html#gade4163a20de203d8ddfccbbeedb6caa9", null ], + [ "DMA_EnableChannelInterrupts", "a00015.html#ga02671643755a7f9395ce1f151a914630", null ], + [ "DMA_DisableChannelInterrupts", "a00015.html#gac9873a0205538dffcba7bb59ed1450c5", null ], + [ "DMA_EnableChannel", "a00015.html#gaa0293771d55ee1a7c42a8ffecb0728e7", null ], + [ "DMA_DisableChannel", "a00015.html#ga8025eebc80c23fa9b5a3a4454855e347", null ], + [ "DMA_EnableChannelPeriphRq", "a00015.html#gaa706c05b4875366e7f84c83b8d09ae29", null ], + [ "DMA_DisableChannelPeriphRq", "a00015.html#gab2d2f88ed16097b2974d1955c725a5dc", null ], + [ "DMA_ConfigureChannelTrigger", "a00015.html#ga04d2004d7d054b4f36676304bc2cd8ad", null ], + [ "DMA_SetChannelConfig", "a00015.html#gafc795a7c0b3e5f4bbf32c1eed3a9ea47", null ], + [ "DMA_GetRemainingBytes", "a00015.html#gaf0197c674ce188bf214c13bc7be43e14", null ], + [ "DMA_SetChannelPriority", "a00015.html#gad8ae76fc5d858b97de3362100af86df6", null ], + [ "DMA_GetChannelPriority", "a00015.html#ga1a5311b6ad708e230db517fb04f98a5f", null ], + [ "DMA_SetChannelConfigValid", "a00015.html#gaa200c0bd1a2d714f6cd002919ed8a213", null ], + [ "DMA_DoChannelSoftwareTrigger", "a00015.html#gae8ffd8526580ed3b7ca3520024d0002c", null ], + [ "DMA_LoadChannelTransferConfig", "a00015.html#ga956cf0c90e0562e5087475ceefcc489f", null ], + [ "DMA_CreateDescriptor", "a00015.html#gaf2955b2c961a33fe24d3154ec801f9fd", null ], + [ "DMA_SetupDescriptor", "a00015.html#gabbdbf43b54f0a0029cd27c09c094de36", null ], + [ "DMA_SetupChannelDescriptor", "a00015.html#ga6c69a736b8e5719fe01bb7d3b76f9088", null ], + [ "DMA_LoadChannelDescriptor", "a00015.html#gae7c3ca634a04a8afe85b1e55360b17aa", null ], + [ "DMA_AbortTransfer", "a00015.html#ga3c61d6121d88d2cdf287fc1cd72912fd", null ], + [ "DMA_CreateHandle", "a00015.html#ga5354ff2c0c1ec53e2cbd712169fc5558", null ], + [ "DMA_SetCallback", "a00015.html#ga2eb9a831b9a84c5108097f770dbe90db", null ], + [ "DMA_PrepareTransfer", "a00015.html#ga01ed2edd4ac04c70f83c7c3091ec4b65", null ], + [ "DMA_PrepareChannelTransfer", "a00015.html#gad29055b5d8b160f94bb18abce476af7d", null ], + [ "DMA_SubmitTransfer", "a00015.html#gade169c9d37d6a2ff949546268ba1c382", null ], + [ "DMA_SubmitChannelTransferParameter", "a00015.html#ga55d406dd20fa70d7cca25601bae20777", null ], + [ "DMA_SubmitChannelDescriptor", "a00015.html#gabf72e148a82d885b8b4ab3cffd549cc3", null ], + [ "DMA_SubmitChannelTransfer", "a00015.html#gae702541c17430371d54c7aea5dbef084", null ], + [ "DMA_StartTransfer", "a00015.html#gac6fb3f30e13c937cc00fe11218e6ec76", null ], + [ "DMA_IRQHandle", "a00015.html#ga9da5a899fb0109cec4fc9303e5df0433", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00016.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00016.html new file mode 100644 index 0000000..823d544 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00016.html @@ -0,0 +1,619 @@ + + + + + + +MCUXpresso SDK API Reference Manual: GPIO: General Purpose I/O + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
GPIO: General Purpose I/O
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral driver for the General Purpose I/O (GPIO) module of MCUXpresso SDK devices.

+

+Function groups

+

+Initialization and deinitialization

+

The function GPIO_PinInit() initializes the GPIO with specified configuration.

+

+Pin manipulation

+

The function GPIO_PinWrite() set output state of selected GPIO pin. The function GPIO_PinRead() read input value of selected GPIO pin.

+

+Port manipulation

+

The function GPIO_PortSet() sets the output level of selected GPIO pins to the logic 1. The function GPIO_PortClear() sets the output level of selected GPIO pins to the logic 0. The function GPIO_PortToggle() reverse the output level of selected GPIO pins. The function GPIO_PortRead() read input value of selected port.

+

+Port masking

+

The function GPIO_PortMaskedSet() set port mask, only pins masked by 0 will be enabled in following functions. The function GPIO_PortMaskedWrite() sets the state of selected GPIO port, only pins masked by 0 will be affected. The function GPIO_PortMaskedRead() reads the state of selected GPIO port, only pins masked by 0 are enabled for read, pins masked by 1 are read as 0.

+

+Typical use case

+

Example use of GPIO API. Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/gpio

+ + + + +

+Files

file  fsl_gpio.h
 
+ + + + +

+Data Structures

struct  gpio_pin_config_t
 The GPIO pin configuration structure. More...
 
+ + + + +

+Enumerations

enum  gpio_pin_direction_t {
+  kGPIO_DigitalInput = 0U, +
+  kGPIO_DigitalOutput = 1U +
+ }
 LPC GPIO direction definition. More...
 
+ + + + + + + + + + +

+Functions

static void GPIO_PortSet (GPIO_Type *base, uint32_t port, uint32_t mask)
 Sets the output level of the multiple GPIO pins to the logic 1. More...
 
static void GPIO_PortClear (GPIO_Type *base, uint32_t port, uint32_t mask)
 Sets the output level of the multiple GPIO pins to the logic 0. More...
 
static void GPIO_PortToggle (GPIO_Type *base, uint32_t port, uint32_t mask)
 Reverses current output logic of the multiple GPIO pins. More...
 
+ + + + +

+Driver version

#define FSL_GPIO_DRIVER_VERSION   (MAKE_VERSION(2, 1, 7))
 LPC GPIO driver version. More...
 
+ + + + + + + +

+GPIO Configuration

void GPIO_PortInit (GPIO_Type *base, uint32_t port)
 Initializes the GPIO peripheral. More...
 
void GPIO_PinInit (GPIO_Type *base, uint32_t port, uint32_t pin, const gpio_pin_config_t *config)
 Initializes a GPIO pin used by the board. More...
 
+ + + + +

+GPIO Output Operations

static void GPIO_PinWrite (GPIO_Type *base, uint32_t port, uint32_t pin, uint8_t output)
 Sets the output level of the one GPIO pin to the logic 1 or 0. More...
 
+ + + + +

+GPIO Input Operations

static uint32_t GPIO_PinRead (GPIO_Type *base, uint32_t port, uint32_t pin)
 Reads the current input value of the GPIO PIN. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct gpio_pin_config_t
+
+

Every pin can only be configured as either output pin or input pin at a time. If configured as a input pin, then leave the outputConfig unused.

+
+ + + + + + + +

Data Fields

+gpio_pin_direction_t pinDirection
 GPIO direction, input or output.
 
+uint8_t outputLogic
 Set default output logic, no use in input.
 
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_GPIO_DRIVER_VERSION   (MAKE_VERSION(2, 1, 7))
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum gpio_pin_direction_t
+
+ + + +
Enumerator
kGPIO_DigitalInput  +

Set current pin as digital input.

+
kGPIO_DigitalOutput  +

Set current pin as digital output.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void GPIO_PortInit (GPIO_Type * base,
uint32_t port 
)
+
+

This function ungates the GPIO clock.

+
Parameters
+ + + +
baseGPIO peripheral base pointer.
portGPIO port number.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void GPIO_PinInit (GPIO_Type * base,
uint32_t port,
uint32_t pin,
const gpio_pin_config_tconfig 
)
+
+

To initialize the GPIO, define a pin configuration, either input or output, in the user file. Then, call the GPIO_PinInit() function.

+

This is an example to define an input pin or output pin configuration:

+
* Define a digital input pin configuration,
+ +
* {
+ +
* 0,
+
* }
+
* Define a digital output pin configuration,
+ +
* {
+ +
* 0,
+
* }
+
*
+
Parameters
+ + + + + +
baseGPIO peripheral base pointer(Typically GPIO)
portGPIO port number
pinGPIO pin number
configGPIO pin configuration pointer
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static void GPIO_PinWrite (GPIO_Type * base,
uint32_t port,
uint32_t pin,
uint8_t output 
)
+
+inlinestatic
+
+
Parameters
+ + + + + +
baseGPIO peripheral base pointer(Typically GPIO)
portGPIO port number
pinGPIO pin number
outputGPIO pin output logic level.
    +
  • 0: corresponding pin output low-logic level.
  • +
  • 1: corresponding pin output high-logic level.
  • +
+
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static uint32_t GPIO_PinRead (GPIO_Type * base,
uint32_t port,
uint32_t pin 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseGPIO peripheral base pointer(Typically GPIO)
portGPIO port number
pinGPIO pin number
+
+
+
Return values
+ + +
GPIOport input value
    +
  • 0: corresponding pin input low-logic level.
  • +
  • 1: corresponding pin input high-logic level.
  • +
+
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void GPIO_PortSet (GPIO_Type * base,
uint32_t port,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseGPIO peripheral base pointer(Typically GPIO)
portGPIO port number
maskGPIO pin number macro
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void GPIO_PortClear (GPIO_Type * base,
uint32_t port,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseGPIO peripheral base pointer(Typically GPIO)
portGPIO port number
maskGPIO pin number macro
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void GPIO_PortToggle (GPIO_Type * base,
uint32_t port,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseGPIO peripheral base pointer(Typically GPIO)
portGPIO port number
maskGPIO pin number macro
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00016.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00016.js new file mode 100644 index 0000000..330be6c --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00016.js @@ -0,0 +1,19 @@ +var a00016 = +[ + [ "gpio_pin_config_t", "a00016.html#a00124", [ + [ "pinDirection", "a00016.html#a70aed128003103272f5740f12fbff525", null ], + [ "outputLogic", "a00016.html#a9d37ffd9a2943f10a91095759bd52da5", null ] + ] ], + [ "FSL_GPIO_DRIVER_VERSION", "a00016.html#ga5aa5229cbd041b11bcf8417ba12896b2", null ], + [ "gpio_pin_direction_t", "a00016.html#gada41ca0a2ce239fe125ee96833e715c0", [ + [ "kGPIO_DigitalInput", "a00016.html#ggada41ca0a2ce239fe125ee96833e715c0abacf19933be1940ab40c83535e6a46d4", null ], + [ "kGPIO_DigitalOutput", "a00016.html#ggada41ca0a2ce239fe125ee96833e715c0a509ebcd228fc813cf4afcacd258680f9", null ] + ] ], + [ "GPIO_PortInit", "a00016.html#ga6fabd21856d350fc0b60ffea3bbca200", null ], + [ "GPIO_PinInit", "a00016.html#ga9b8fa194d8fa5a1bf933a709d4dde014", null ], + [ "GPIO_PinWrite", "a00016.html#ga2a1113d96cdf973bb5b1eade3521adf8", null ], + [ "GPIO_PinRead", "a00016.html#gabad8dfa62a3e414cc23ff8b32eea81d0", null ], + [ "GPIO_PortSet", "a00016.html#ga7206f7b805b8a3c68044345dbbba0a41", null ], + [ "GPIO_PortClear", "a00016.html#ga185ddb6848a644b40e0620ef6b4ce2cf", null ], + [ "GPIO_PortToggle", "a00016.html#ga07e3b8c21dad1debec7986f214a70975", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00017.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00017.html new file mode 100644 index 0000000..7f129bc --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00017.html @@ -0,0 +1,1641 @@ + + + + + + +MCUXpresso SDK API Reference Manual: I2C Master Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ + +
+

Overview

+ + + + + + + + + + + +

+Data Structures

struct  i2c_master_config_t
 Structure with settings to initialize the I2C master module. More...
 
struct  i2c_master_transfer_t
 Non-blocking transfer descriptor structure. More...
 
struct  i2c_master_handle_t
 Driver handle for master non-blocking APIs. More...
 
+ + + + +

+Typedefs

typedef void(* i2c_master_transfer_callback_t )(I2C_Type *base, i2c_master_handle_t *handle, status_t completionStatus, void *userData)
 Master completion callback function pointer type. More...
 
+ + + + + + + + + + + + + +

+Enumerations

enum  _i2c_master_flags {
+  kI2C_MasterPendingFlag = I2C_STAT_MSTPENDING_MASK, +
+  kI2C_MasterArbitrationLostFlag, +
+  kI2C_MasterStartStopErrorFlag +
+ }
 I2C master peripheral flags. More...
 
enum  i2c_direction_t {
+  kI2C_Write = 0U, +
+  kI2C_Read = 1U +
+ }
 Direction of master and slave transfers. More...
 
enum  _i2c_master_transfer_flags {
+  kI2C_TransferDefaultFlag = 0x00U, +
+  kI2C_TransferNoStartFlag = 0x01U, +
+  kI2C_TransferRepeatedStartFlag = 0x02U, +
+  kI2C_TransferNoStopFlag = 0x04U +
+ }
 Transfer option flags. More...
 
enum  _i2c_transfer_states
 States for the state machine used by transactional APIs. More...
 
+ + + + + + + + + + + + + + + + + + + +

+Initialization and deinitialization

void I2C_MasterGetDefaultConfig (i2c_master_config_t *masterConfig)
 Provides a default configuration for the I2C master peripheral. More...
 
void I2C_MasterInit (I2C_Type *base, const i2c_master_config_t *masterConfig, uint32_t srcClock_Hz)
 Initializes the I2C master peripheral. More...
 
void I2C_MasterDeinit (I2C_Type *base)
 Deinitializes the I2C master peripheral. More...
 
uint32_t I2C_GetInstance (I2C_Type *base)
 Returns an instance number given a base address. More...
 
static void I2C_MasterReset (I2C_Type *base)
 Performs a software reset. More...
 
static void I2C_MasterEnable (I2C_Type *base, bool enable)
 Enables or disables the I2C module as master. More...
 
+ + + + + + + +

+Status

static uint32_t I2C_GetStatusFlags (I2C_Type *base)
 Gets the I2C status flags. More...
 
static void I2C_MasterClearStatusFlags (I2C_Type *base, uint32_t statusMask)
 Clears the I2C master status flag state. More...
 
+ + + + + + + + + + +

+Interrupts

static void I2C_EnableInterrupts (I2C_Type *base, uint32_t interruptMask)
 Enables the I2C master interrupt requests. More...
 
static void I2C_DisableInterrupts (I2C_Type *base, uint32_t interruptMask)
 Disables the I2C master interrupt requests. More...
 
static uint32_t I2C_GetEnabledInterrupts (I2C_Type *base)
 Returns the set of currently enabled I2C master interrupt requests. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Bus operations

void I2C_MasterSetBaudRate (I2C_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz)
 Sets the I2C bus frequency for master transactions. More...
 
static bool I2C_MasterGetBusIdleState (I2C_Type *base)
 Returns whether the bus is idle. More...
 
status_t I2C_MasterStart (I2C_Type *base, uint8_t address, i2c_direction_t direction)
 Sends a START on the I2C bus. More...
 
status_t I2C_MasterStop (I2C_Type *base)
 Sends a STOP signal on the I2C bus. More...
 
static status_t I2C_MasterRepeatedStart (I2C_Type *base, uint8_t address, i2c_direction_t direction)
 Sends a REPEATED START on the I2C bus. More...
 
status_t I2C_MasterWriteBlocking (I2C_Type *base, const void *txBuff, size_t txSize, uint32_t flags)
 Performs a polling send transfer on the I2C bus. More...
 
status_t I2C_MasterReadBlocking (I2C_Type *base, void *rxBuff, size_t rxSize, uint32_t flags)
 Performs a polling receive transfer on the I2C bus. More...
 
status_t I2C_MasterTransferBlocking (I2C_Type *base, i2c_master_transfer_t *xfer)
 Performs a master polling transfer on the I2C bus. More...
 
+ + + + + + + + + + + + + +

+Non-blocking

void I2C_MasterTransferCreateHandle (I2C_Type *base, i2c_master_handle_t *handle, i2c_master_transfer_callback_t callback, void *userData)
 Creates a new handle for the I2C master non-blocking APIs. More...
 
status_t I2C_MasterTransferNonBlocking (I2C_Type *base, i2c_master_handle_t *handle, i2c_master_transfer_t *xfer)
 Performs a non-blocking transaction on the I2C bus. More...
 
status_t I2C_MasterTransferGetCount (I2C_Type *base, i2c_master_handle_t *handle, size_t *count)
 Returns number of bytes transferred so far. More...
 
status_t I2C_MasterTransferAbort (I2C_Type *base, i2c_master_handle_t *handle)
 Terminates a non-blocking I2C master transmission early. More...
 
+ + + + +

+IRQ handler

void I2C_MasterTransferHandleIRQ (I2C_Type *base, void *i2cHandle)
 Reusable routine to handle master interrupts. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct i2c_master_config_t
+
+

This structure holds configuration settings for the I2C peripheral. To initialize this structure to reasonable defaults, call the I2C_MasterGetDefaultConfig() function and pass a pointer to your configuration structure instance.

+

The configuration structure can be made constant so it resides in flash.

+
+ + + + + + + + + + +

Data Fields

bool enableMaster
 Whether to enable master mode. More...
 
uint32_t baudRate_Bps
 Desired baud rate in bits per second. More...
 
bool enableTimeout
 Enable internal timeout function. More...
 
+

Field Documentation

+ +
+
+ + + + +
bool i2c_master_config_t::enableMaster
+
+ +
+
+ +
+
+ + + + +
uint32_t i2c_master_config_t::baudRate_Bps
+
+ +
+
+ +
+
+ + + + +
bool i2c_master_config_t::enableTimeout
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct _i2c_master_transfer
+
+

I2C master transfer typedef.

+

This structure is used to pass transaction parameters to the I2C_MasterTransferNonBlocking() API.

+
+ + + + + + + + + + + + + + + + + + + + + + +

Data Fields

uint32_t flags
 Bit mask of options for the transfer. More...
 
uint16_t slaveAddress
 The 7-bit slave address. More...
 
i2c_direction_t direction
 Either kI2C_Read or kI2C_Write. More...
 
uint32_t subaddress
 Sub address. More...
 
size_t subaddressSize
 Length of sub address to send in bytes. More...
 
void * data
 Pointer to data to transfer. More...
 
size_t dataSize
 Number of bytes to transfer. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint32_t i2c_master_transfer_t::flags
+
+

See enumeration _i2c_master_transfer_flags for available options. Set to 0 or kI2C_TransferDefaultFlag for normal transfers.

+ +
+
+ +
+
+ + + + +
uint16_t i2c_master_transfer_t::slaveAddress
+
+ +
+
+ +
+
+ + + + +
i2c_direction_t i2c_master_transfer_t::direction
+
+ +
+
+ +
+
+ + + + +
uint32_t i2c_master_transfer_t::subaddress
+
+

Transferred MSB first.

+ +
+
+ +
+
+ + + + +
size_t i2c_master_transfer_t::subaddressSize
+
+

Maximum size is 4 bytes.

+ +
+
+ +
+
+ + + + +
void* i2c_master_transfer_t::data
+
+ +
+
+ +
+
+ + + + +
size_t i2c_master_transfer_t::dataSize
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct _i2c_master_handle
+
+

I2C master handle typedef.

+
Note
The contents of this structure are private and subject to change.
+
+ + + + + + + + + + + + + + + + + + + + + + +

Data Fields

uint8_t state
 Transfer state machine current state. More...
 
+uint32_t transferCount
 Indicates progress of the transfer.
 
uint32_t remainingBytes
 Remaining byte count in current state. More...
 
uint8_t * buf
 Buffer pointer for current state. More...
 
i2c_master_transfer_t transfer
 Copy of the current transfer info. More...
 
i2c_master_transfer_callback_t completionCallback
 Callback function pointer. More...
 
void * userData
 Application data passed to callback. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint8_t i2c_master_handle_t::state
+
+ +
+
+ +
+
+ + + + +
uint32_t i2c_master_handle_t::remainingBytes
+
+ +
+
+ +
+
+ + + + +
uint8_t* i2c_master_handle_t::buf
+
+ +
+
+ +
+
+ + + + +
i2c_master_transfer_t i2c_master_handle_t::transfer
+
+ +
+
+ +
+
+ + + + +
i2c_master_transfer_callback_t i2c_master_handle_t::completionCallback
+
+ +
+
+ +
+
+ + + + +
void* i2c_master_handle_t::userData
+
+ +
+
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef void(* i2c_master_transfer_callback_t)(I2C_Type *base, i2c_master_handle_t *handle, status_t completionStatus, void *userData)
+
+

This callback is used only for the non-blocking master transfer API. Specify the callback you wish to use in the call to I2C_MasterTransferCreateHandle().

+
Parameters
+ + + + +
baseThe I2C peripheral base address.
completionStatusEither kStatus_Success or an error code describing how the transfer completed.
userDataArbitrary pointer-sized value passed from the application.
+
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum _i2c_master_flags
+
+
Note
These enums are meant to be OR'd together to form a bit mask.
+ + + + +
Enumerator
kI2C_MasterPendingFlag  +

The I2C module is waiting for software interaction.

+
kI2C_MasterArbitrationLostFlag  +

The arbitration of the bus was lost.

+

There was collision on the bus

+
kI2C_MasterStartStopErrorFlag  +

There was an error during start or stop phase of the transaction.

+
+ +
+
+ +
+
+ + + + +
enum i2c_direction_t
+
+ + + +
Enumerator
kI2C_Write  +

Master transmit.

+
kI2C_Read  +

Master receive.

+
+ +
+
+ +
+
+ + + + +
enum _i2c_master_transfer_flags
+
+
Note
These enumerations are intended to be OR'd together to form a bit mask of options for the _i2c_master_transfer::flags field.
+ + + + + +
Enumerator
kI2C_TransferDefaultFlag  +

Transfer starts with a start signal, stops with a stop signal.

+
kI2C_TransferNoStartFlag  +

Don't send a start condition, address, and sub address.

+
kI2C_TransferRepeatedStartFlag  +

Send a repeated start condition.

+
kI2C_TransferNoStopFlag  +

Don't send a stop condition.

+
+ +
+
+ +
+
+ + + + +
enum _i2c_transfer_states
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
void I2C_MasterGetDefaultConfig (i2c_master_config_tmasterConfig)
+
+

This function provides the following default configuration for the I2C master peripheral:

+
* masterConfig->enableMaster = true;
+
* masterConfig->baudRate_Bps = 100000U;
+
* masterConfig->enableTimeout = false;
+
*
+

After calling this function, you can override any settings in order to customize the configuration, prior to initializing the master driver with I2C_MasterInit().

+
Parameters
+ + +
[out]masterConfigUser provided configuration structure for default values. Refer to i2c_master_config_t.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void I2C_MasterInit (I2C_Type * base,
const i2c_master_config_tmasterConfig,
uint32_t srcClock_Hz 
)
+
+

This function enables the peripheral clock and initializes the I2C master peripheral as described by the user provided configuration. A software reset is performed prior to configuration.

+
Parameters
+ + + + +
baseThe I2C peripheral base address.
masterConfigUser provided peripheral configuration. Use I2C_MasterGetDefaultConfig() to get a set of defaults that you can override.
srcClock_HzFrequency in Hertz of the I2C functional clock. Used to calculate the baud rate divisors, filter widths, and timeout periods.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void I2C_MasterDeinit (I2C_Type * base)
+
+

This function disables the I2C master peripheral and gates the clock. It also performs a software reset to restore the peripheral to reset conditions.

+
Parameters
+ + +
baseThe I2C peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + + + + +
uint32_t I2C_GetInstance (I2C_Type * base)
+
+

If an invalid base address is passed, debug builds will assert. Release builds will just return instance number 0.

+
Parameters
+ + +
baseThe I2C peripheral base address.
+
+
+
Returns
I2C instance number starting from 0.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void I2C_MasterReset (I2C_Type * base)
+
+inlinestatic
+
+

Restores the I2C master peripheral to reset conditions.

+
Parameters
+ + +
baseThe I2C peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void I2C_MasterEnable (I2C_Type * base,
bool enable 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseThe I2C peripheral base address.
enablePass true to enable or false to disable the specified I2C as master.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t I2C_GetStatusFlags (I2C_Type * base)
+
+inlinestatic
+
+

A bit mask with the state of all I2C status flags is returned. For each flag, the corresponding bit in the return value is set if the flag is asserted.

+
Parameters
+ + +
baseThe I2C peripheral base address.
+
+
+
Returns
State of the status flags:
    +
  • 1: related status flag is set.
  • +
  • 0: related status flag is not set.
  • +
+
+
See Also
_i2c_master_flags
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void I2C_MasterClearStatusFlags (I2C_Type * base,
uint32_t statusMask 
)
+
+inlinestatic
+
+

The following status register flags can be cleared:

+ +

Attempts to clear other flags has no effect.

+
Parameters
+ + + +
baseThe I2C peripheral base address.
statusMaskA bitmask of status flags that are to be cleared. The mask is composed of _i2c_master_flags enumerators OR'd together. You may pass the result of a previous call to I2C_GetStatusFlags().
+
+
+
See Also
_i2c_master_flags.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void I2C_EnableInterrupts (I2C_Type * base,
uint32_t interruptMask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseThe I2C peripheral base address.
interruptMaskBit mask of interrupts to enable. See _i2c_master_flags for the set of constants that should be OR'd together to form the bit mask.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void I2C_DisableInterrupts (I2C_Type * base,
uint32_t interruptMask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseThe I2C peripheral base address.
interruptMaskBit mask of interrupts to disable. See _i2c_master_flags for the set of constants that should be OR'd together to form the bit mask.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t I2C_GetEnabledInterrupts (I2C_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseThe I2C peripheral base address.
+
+
+
Returns
A bitmask composed of _i2c_master_flags enumerators OR'd together to indicate the set of enabled interrupts.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void I2C_MasterSetBaudRate (I2C_Type * base,
uint32_t baudRate_Bps,
uint32_t srcClock_Hz 
)
+
+

The I2C master is automatically disabled and re-enabled as necessary to configure the baud rate. Do not call this function during a transfer, or the transfer is aborted.

+
Parameters
+ + + + +
baseThe I2C peripheral base address.
srcClock_HzI2C functional clock frequency in Hertz.
baudRate_BpsRequested bus frequency in bits per second.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static bool I2C_MasterGetBusIdleState (I2C_Type * base)
+
+inlinestatic
+
+

Requires the master mode to be enabled.

+
Parameters
+ + +
baseThe I2C peripheral base address.
+
+
+
Return values
+ + + +
trueBus is busy.
falseBus is idle.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_MasterStart (I2C_Type * base,
uint8_t address,
i2c_direction_t direction 
)
+
+

This function is used to initiate a new master mode transfer by sending the START signal. The slave address is sent following the I2C START signal.

+
Parameters
+ + + + +
baseI2C peripheral base pointer
address7-bit slave device address.
directionMaster transfer directions(transmit/receive).
+
+
+
Return values
+ + + +
kStatus_SuccessSuccessfully send the start signal.
kStatus_I2C_BusyCurrent bus is busy.
+
+
+ +
+
+ +
+
+ + + + + + + + +
status_t I2C_MasterStop (I2C_Type * base)
+
+
Return values
+ + + +
kStatus_SuccessSuccessfully send the stop signal.
kStatus_I2C_TimeoutSend stop signal failed, timeout.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static status_t I2C_MasterRepeatedStart (I2C_Type * base,
uint8_t address,
i2c_direction_t direction 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseI2C peripheral base pointer
address7-bit slave device address.
directionMaster transfer directions(transmit/receive).
+
+
+
Return values
+ + + +
kStatus_SuccessSuccessfully send the start signal.
kStatus_I2C_BusyCurrent bus is busy but not occupied by current I2C master.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_MasterWriteBlocking (I2C_Type * base,
const void * txBuff,
size_t txSize,
uint32_t flags 
)
+
+

Sends up to txSize number of bytes to the previously addressed slave device. The slave may reply with a NAK to any byte in order to terminate the transfer early. If this happens, this function returns kStatus_I2C_Nak.

+
Parameters
+ + + + + +
baseThe I2C peripheral base address.
txBuffThe pointer to the data to be transferred.
txSizeThe length in bytes of the data to be transferred.
flagsTransfer control flag to control special behavior like suppressing start or stop, for normal transfers use kI2C_TransferDefaultFlag
+
+
+
Return values
+ + + + + +
kStatus_SuccessData was sent successfully.
kStatus_I2C_BusyAnother master is currently utilizing the bus.
kStatus_I2C_NakThe slave device sent a NAK in response to a byte.
kStatus_I2C_ArbitrationLostArbitration lost error.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_MasterReadBlocking (I2C_Type * base,
void * rxBuff,
size_t rxSize,
uint32_t flags 
)
+
+
Parameters
+ + + + + +
baseThe I2C peripheral base address.
rxBuffThe pointer to the data to be transferred.
rxSizeThe length in bytes of the data to be transferred.
flagsTransfer control flag to control special behavior like suppressing start or stop, for normal transfers use kI2C_TransferDefaultFlag
+
+
+
Return values
+ + + + + +
kStatus_SuccessData was received successfully.
kStatus_I2C_BusyAnother master is currently utilizing the bus.
kStatus_I2C_NakThe slave device sent a NAK in response to a byte.
kStatus_I2C_ArbitrationLostArbitration lost error.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t I2C_MasterTransferBlocking (I2C_Type * base,
i2c_master_transfer_t * xfer 
)
+
+
Note
The API does not return until the transfer succeeds or fails due to arbitration lost or receiving a NAK.
+
Parameters
+ + + +
baseI2C peripheral base address.
xferPointer to the transfer structure.
+
+
+
Return values
+ + + + + + +
kStatus_SuccessSuccessfully complete the data transmission.
kStatus_I2C_BusyPrevious transmission still not finished.
kStatus_I2C_TimeoutTransfer error, wait signal timeout.
kStatus_I2C_ArbitrationLostTransfer error, arbitration lost.
kStataus_I2C_NakTransfer error, receive NAK during transfer.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void I2C_MasterTransferCreateHandle (I2C_Type * base,
i2c_master_handle_t * handle,
i2c_master_transfer_callback_t callback,
void * userData 
)
+
+

The creation of a handle is for use with the non-blocking APIs. Once a handle is created, there is not a corresponding destroy handle. If the user wants to terminate a transfer, the I2C_MasterTransferAbort() API shall be called.

+
Parameters
+ + + + + +
baseThe I2C peripheral base address.
[out]handlePointer to the I2C master driver handle.
callbackUser provided pointer to the asynchronous callback function.
userDataUser provided pointer to the application callback data.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_MasterTransferNonBlocking (I2C_Type * base,
i2c_master_handle_t * handle,
i2c_master_transfer_t * xfer 
)
+
+
Parameters
+ + + + +
baseThe I2C peripheral base address.
handlePointer to the I2C master driver handle.
xferThe pointer to the transfer descriptor.
+
+
+
Return values
+ + + +
kStatus_SuccessThe transaction was started successfully.
kStatus_I2C_BusyEither another master is currently utilizing the bus, or a non-blocking transaction is already in progress.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_MasterTransferGetCount (I2C_Type * base,
i2c_master_handle_t * handle,
size_t * count 
)
+
+
Parameters
+ + + + +
baseThe I2C peripheral base address.
handlePointer to the I2C master driver handle.
[out]countNumber of bytes transferred so far by the non-blocking transaction.
+
+
+
Return values
+ + + +
kStatus_Success
kStatus_I2C_Busy
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t I2C_MasterTransferAbort (I2C_Type * base,
i2c_master_handle_t * handle 
)
+
+
Note
It is not safe to call this function from an IRQ handler that has a higher priority than the I2C peripheral's IRQ priority.
+
Parameters
+ + + +
baseThe I2C peripheral base address.
handlePointer to the I2C master driver handle.
+
+
+
Return values
+ + + +
kStatus_SuccessA transaction was successfully aborted.
kStatus_I2C_TimeoutAbort failure due to flags polling timeout.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void I2C_MasterTransferHandleIRQ (I2C_Type * base,
void * i2cHandle 
)
+
+
Note
This function does not need to be called unless you are reimplementing the nonblocking API's interrupt handler routines to add special functionality.
+
Parameters
+ + + +
baseThe I2C peripheral base address.
i2cHandlePointer to the I2C master driver handle i2c_master_handle_t.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00017.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00017.js new file mode 100644 index 0000000..fb6ca70 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00017.js @@ -0,0 +1,67 @@ +var a00017 = +[ + [ "i2c_master_config_t", "a00017.html#a00125", [ + [ "enableMaster", "a00017.html#a2419131a10906475fd31950f17ac8895", null ], + [ "baudRate_Bps", "a00017.html#a2186844dc87bcde999fc12005f4c550a", null ], + [ "enableTimeout", "a00017.html#a1c6831135c83c013d2a3cfc3e7210357", null ] + ] ], + [ "i2c_master_transfer_t", "a00017.html#a00102", [ + [ "flags", "a00017.html#a8835787e1b0f9a4b8868e7cbe53e45d5", null ], + [ "slaveAddress", "a00017.html#a97891bd050609c6dcd1276714277e480", null ], + [ "direction", "a00017.html#ac5b89dc9115b7760431c981e0c1fd443", null ], + [ "subaddress", "a00017.html#ae7facb612714785d4e143e57d47a5af3", null ], + [ "subaddressSize", "a00017.html#aeec8dccf4a49f03ff9a40f5982a24796", null ], + [ "data", "a00017.html#a8c7f63bd1e7de04e40f5cd733f5c7388", null ], + [ "dataSize", "a00017.html#a68e2dd69e1e34b1b505270e1e07e8a34", null ] + ] ], + [ "i2c_master_handle_t", "a00017.html#a00101", [ + [ "state", "a00017.html#add7ec18bc8239c5c87ffcec2fbcf5dd8", null ], + [ "transferCount", "a00017.html#a5943d16f5ed6e7c4ebd334cdbc0e2afc", null ], + [ "remainingBytes", "a00017.html#aca481b5d3ca6dce53cf440b534ff80c2", null ], + [ "buf", "a00017.html#a9577474c0c4395355174df2b016108de", null ], + [ "transfer", "a00017.html#a6858d3525f762d7aded20e6c95eb19fc", null ], + [ "completionCallback", "a00017.html#a15b84b8a94c2b2e5ace0a695c79edd84", null ], + [ "userData", "a00017.html#aad7df570c53adb2e80acd2ba0d39d109", null ] + ] ], + [ "i2c_master_transfer_callback_t", "a00017.html#gad292a48f957a9b76593c1779d9dce497", null ], + [ "_i2c_master_flags", "a00017.html#gac938392418ba1a891983d11ef5c9f2a3", [ + [ "kI2C_MasterPendingFlag", "a00017.html#ggac938392418ba1a891983d11ef5c9f2a3a9cc49a1ca21e87058a7fbf733cce0e62", null ], + [ "kI2C_MasterArbitrationLostFlag", "a00017.html#ggac938392418ba1a891983d11ef5c9f2a3a7b487779b58af99a7a8c179545f78ccd", null ], + [ "kI2C_MasterStartStopErrorFlag", "a00017.html#ggac938392418ba1a891983d11ef5c9f2a3ab5cec1d9be7dc5fb2c106e2b87889517", null ] + ] ], + [ "i2c_direction_t", "a00017.html#gab49c827b45635206f06e5737606e4611", [ + [ "kI2C_Write", "a00017.html#ggab49c827b45635206f06e5737606e4611a93b476b469c2a4bfed5916b458ae9bb0", null ], + [ "kI2C_Read", "a00017.html#ggab49c827b45635206f06e5737606e4611a3a7bb24dc8d1c1be8925603eeafe9b30", null ] + ] ], + [ "_i2c_master_transfer_flags", "a00017.html#ga87ea07668194cfb46c7c368d2cb42433", [ + [ "kI2C_TransferDefaultFlag", "a00017.html#gga87ea07668194cfb46c7c368d2cb42433ae80f7b768b1621e42ac965d3d23de5e2", null ], + [ "kI2C_TransferNoStartFlag", "a00017.html#gga87ea07668194cfb46c7c368d2cb42433a5cb44bf860c0482c0ca0165cf0d31d8a", null ], + [ "kI2C_TransferRepeatedStartFlag", "a00017.html#gga87ea07668194cfb46c7c368d2cb42433aadf112471ef12f194985a093cd9b9721", null ], + [ "kI2C_TransferNoStopFlag", "a00017.html#gga87ea07668194cfb46c7c368d2cb42433afb8aeea71b5b7475e3d3df86220db566", null ] + ] ], + [ "_i2c_transfer_states", "a00017.html#gab08c1a0d50859637b4305687278941ee", null ], + [ "I2C_MasterGetDefaultConfig", "a00017.html#gad69f2d63ea756dda60749ff6b09f587d", null ], + [ "I2C_MasterInit", "a00017.html#ga29f967b3ae8487a36ba2a58deb01ccae", null ], + [ "I2C_MasterDeinit", "a00017.html#gadcf7122f0a38d4d9da0f052fcb167957", null ], + [ "I2C_GetInstance", "a00017.html#ga07cc6bd20f700249c335893427bf462a", null ], + [ "I2C_MasterReset", "a00017.html#ga09137caccbe9a57f6b2ca5e1ce9bdc50", null ], + [ "I2C_MasterEnable", "a00017.html#ga164d97e40eb5ad625a41ad43cf938153", null ], + [ "I2C_GetStatusFlags", "a00017.html#ga441017241044ffdb828385e473f5fb58", null ], + [ "I2C_MasterClearStatusFlags", "a00017.html#ga437271ffb955b77df0a5dee9ea80cc63", null ], + [ "I2C_EnableInterrupts", "a00017.html#ga0f6f1f2fe150661f8eb0a072665a9020", null ], + [ "I2C_DisableInterrupts", "a00017.html#gac3e053611231cc886bfa38831a1ac26e", null ], + [ "I2C_GetEnabledInterrupts", "a00017.html#gae652236a25f1b4828d596f32190655f8", null ], + [ "I2C_MasterSetBaudRate", "a00017.html#gafeab1d5249a8b39c8d9e1a54a85c23f0", null ], + [ "I2C_MasterGetBusIdleState", "a00017.html#ga4b7617034ab51d77786141873fd6ee1c", null ], + [ "I2C_MasterStart", "a00017.html#ga7664234966e4162e952b6d57efcaa8a6", null ], + [ "I2C_MasterStop", "a00017.html#gaf46a8cc094fc18c6cadea8de71448723", null ], + [ "I2C_MasterRepeatedStart", "a00017.html#ga8137f7b333aafe1e3ff6c9d3852b7dbd", null ], + [ "I2C_MasterWriteBlocking", "a00017.html#ga3b4d71b59e118adc63afbc5434e5e7dd", null ], + [ "I2C_MasterReadBlocking", "a00017.html#gaba04c62ee636dd8317c2235c3c82aa3b", null ], + [ "I2C_MasterTransferBlocking", "a00017.html#ga35cae3a5b4aa50ce8db28e3eb703a027", null ], + [ "I2C_MasterTransferCreateHandle", "a00017.html#ga31e3de02b57801c6896e6045c4a31268", null ], + [ "I2C_MasterTransferNonBlocking", "a00017.html#gac7f76a04b6f6873c52ad176d58901fe9", null ], + [ "I2C_MasterTransferGetCount", "a00017.html#ga7d720842e68161d2d52d56d119f20665", null ], + [ "I2C_MasterTransferAbort", "a00017.html#gabb386e53b2bc64e29b2915bdfac36800", null ], + [ "I2C_MasterTransferHandleIRQ", "a00017.html#gad091cd1857d2bd8ce64583739b3a35d5", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00018.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00018.html new file mode 100644 index 0000000..ca0a88d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00018.html @@ -0,0 +1,1533 @@ + + + + + + +MCUXpresso SDK API Reference Manual: I2C Slave Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ + +
+

Overview

+ + + + + + + + + + + + + + +

+Data Structures

struct  i2c_slave_address_t
 Data structure with 7-bit Slave address and Slave address disable. More...
 
struct  i2c_slave_config_t
 Structure with settings to initialize the I2C slave module. More...
 
struct  i2c_slave_transfer_t
 I2C slave transfer structure. More...
 
struct  i2c_slave_handle_t
 I2C slave handle structure. More...
 
+ + + + + + + +

+Typedefs

typedef void(* i2c_slave_transfer_callback_t )(I2C_Type *base, volatile i2c_slave_transfer_t *transfer, void *userData)
 Slave event callback function pointer type. More...
 
typedef void(* i2c_isr_t )(I2C_Type *base, void *i2cHandle)
 Typedef for interrupt handler. More...
 
+ + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  _i2c_slave_flags {
+  kI2C_SlavePendingFlag = I2C_STAT_SLVPENDING_MASK, +
+  kI2C_SlaveNotStretching, +
+  kI2C_SlaveSelected = I2C_STAT_SLVSEL_MASK, +
+  kI2C_SaveDeselected +
+ }
 I2C slave peripheral flags. More...
 
enum  i2c_slave_address_register_t {
+  kI2C_SlaveAddressRegister0 = 0U, +
+  kI2C_SlaveAddressRegister1 = 1U, +
+  kI2C_SlaveAddressRegister2 = 2U, +
+  kI2C_SlaveAddressRegister3 = 3U +
+ }
 I2C slave address register. More...
 
enum  i2c_slave_address_qual_mode_t {
+  kI2C_QualModeMask = 0U, +
+  kI2C_QualModeExtend +
+ }
 I2C slave address match options. More...
 
enum  i2c_slave_bus_speed_t
 I2C slave bus speed options. More...
 
enum  i2c_slave_transfer_event_t {
+  kI2C_SlaveAddressMatchEvent = 0x01U, +
+  kI2C_SlaveTransmitEvent = 0x02U, +
+  kI2C_SlaveReceiveEvent = 0x04U, +
+  kI2C_SlaveCompletionEvent = 0x20U, +
+  kI2C_SlaveDeselectedEvent, +
+  kI2C_SlaveAllEvents +
+ }
 Set of events sent to the callback for non blocking slave transfers. More...
 
enum  i2c_slave_fsm_t
 I2C slave software finite state machine states.
 
+ + + + + + + + + + + + + + + + +

+Slave initialization and deinitialization

void I2C_SlaveGetDefaultConfig (i2c_slave_config_t *slaveConfig)
 Provides a default configuration for the I2C slave peripheral. More...
 
status_t I2C_SlaveInit (I2C_Type *base, const i2c_slave_config_t *slaveConfig, uint32_t srcClock_Hz)
 Initializes the I2C slave peripheral. More...
 
void I2C_SlaveSetAddress (I2C_Type *base, i2c_slave_address_register_t addressRegister, uint8_t address, bool addressDisable)
 Configures Slave Address n register. More...
 
void I2C_SlaveDeinit (I2C_Type *base)
 Deinitializes the I2C slave peripheral. More...
 
static void I2C_SlaveEnable (I2C_Type *base, bool enable)
 Enables or disables the I2C module as slave. More...
 
+ + + + +

+Slave status

static void I2C_SlaveClearStatusFlags (I2C_Type *base, uint32_t statusMask)
 Clears the I2C status flag state. More...
 
+ + + + + + + +

+Slave bus operations

status_t I2C_SlaveWriteBlocking (I2C_Type *base, const uint8_t *txBuff, size_t txSize)
 Performs a polling send transfer on the I2C bus. More...
 
status_t I2C_SlaveReadBlocking (I2C_Type *base, uint8_t *rxBuff, size_t rxSize)
 Performs a polling receive transfer on the I2C bus. More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Slave non-blocking

void I2C_SlaveTransferCreateHandle (I2C_Type *base, i2c_slave_handle_t *handle, i2c_slave_transfer_callback_t callback, void *userData)
 Creates a new handle for the I2C slave non-blocking APIs. More...
 
status_t I2C_SlaveTransferNonBlocking (I2C_Type *base, i2c_slave_handle_t *handle, uint32_t eventMask)
 Starts accepting slave transfers. More...
 
status_t I2C_SlaveSetSendBuffer (I2C_Type *base, volatile i2c_slave_transfer_t *transfer, const void *txData, size_t txSize, uint32_t eventMask)
 Starts accepting master read from slave requests. More...
 
status_t I2C_SlaveSetReceiveBuffer (I2C_Type *base, volatile i2c_slave_transfer_t *transfer, void *rxData, size_t rxSize, uint32_t eventMask)
 Starts accepting master write to slave requests. More...
 
static uint32_t I2C_SlaveGetReceivedAddress (I2C_Type *base, volatile i2c_slave_transfer_t *transfer)
 Returns the slave address sent by the I2C master. More...
 
void I2C_SlaveTransferAbort (I2C_Type *base, i2c_slave_handle_t *handle)
 Aborts the slave non-blocking transfers. More...
 
status_t I2C_SlaveTransferGetCount (I2C_Type *base, i2c_slave_handle_t *handle, size_t *count)
 Gets the slave transfer remaining bytes during a interrupt non-blocking transfer. More...
 
+ + + + +

+Slave IRQ handler

void I2C_SlaveTransferHandleIRQ (I2C_Type *base, void *i2cHandle)
 Reusable routine to handle slave interrupts. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct i2c_slave_address_t
+
+
+ + + + + + + +

Data Fields

uint8_t address
 7-bit Slave address SLVADR. More...
 
bool addressDisable
 Slave address disable SADISABLE. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint8_t i2c_slave_address_t::address
+
+ +
+
+ +
+
+ + + + +
bool i2c_slave_address_t::addressDisable
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct i2c_slave_config_t
+
+

This structure holds configuration settings for the I2C slave peripheral. To initialize this structure to reasonable defaults, call the I2C_SlaveGetDefaultConfig() function and pass a pointer to your configuration structure instance.

+

The configuration structure can be made constant so it resides in flash.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

i2c_slave_address_t address0
 Slave's 7-bit address and disable. More...
 
i2c_slave_address_t address1
 Alternate slave 7-bit address and disable. More...
 
i2c_slave_address_t address2
 Alternate slave 7-bit address and disable. More...
 
i2c_slave_address_t address3
 Alternate slave 7-bit address and disable. More...
 
i2c_slave_address_qual_mode_t qualMode
 Qualify mode for slave address 0. More...
 
uint8_t qualAddress
 Slave address qualifier for address 0. More...
 
i2c_slave_bus_speed_t busSpeed
 Slave bus speed mode. More...
 
bool enableSlave
 Enable slave mode. More...
 
+

Field Documentation

+ +
+
+ + + + +
i2c_slave_address_t i2c_slave_config_t::address0
+
+ +
+
+ +
+
+ + + + +
i2c_slave_address_t i2c_slave_config_t::address1
+
+ +
+
+ +
+
+ + + + +
i2c_slave_address_t i2c_slave_config_t::address2
+
+ +
+
+ +
+
+ + + + +
i2c_slave_address_t i2c_slave_config_t::address3
+
+ +
+
+ +
+
+ + + + +
i2c_slave_address_qual_mode_t i2c_slave_config_t::qualMode
+
+ +
+
+ +
+
+ + + + +
uint8_t i2c_slave_config_t::qualAddress
+
+ +
+
+ +
+
+ + + + +
i2c_slave_bus_speed_t i2c_slave_config_t::busSpeed
+
+

If the slave function stretches SCL to allow for software response, it must provide sufficient data setup time to the master before releasing the stretched clock. This is accomplished by inserting one clock time of CLKDIV at that point. The busSpeed value is used to configure CLKDIV such that one clock time is greater than the tSU;DAT value noted in the I2C bus specification for the I2C mode that is being used. If the busSpeed mode is unknown at compile time, use the longest data setup time kI2C_SlaveStandardMode (250 ns)

+ +
+
+ +
+
+ + + + +
bool i2c_slave_config_t::enableSlave
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct i2c_slave_transfer_t
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

i2c_slave_handle_t * handle
 Pointer to handle that contains this transfer. More...
 
i2c_slave_transfer_event_t event
 Reason the callback is being invoked. More...
 
uint8_t receivedAddress
 Matching address send by master. More...
 
uint32_t eventMask
 Mask of enabled events. More...
 
+uint8_t * rxData
 Transfer buffer for receive data.
 
+const uint8_t * txData
 Transfer buffer for transmit data.
 
+size_t txSize
 Transfer size.
 
+size_t rxSize
 Transfer size.
 
size_t transferredCount
 Number of bytes transferred during this transfer. More...
 
status_t completionStatus
 Success or error code describing how the transfer completed. More...
 
+

Field Documentation

+ +
+
+ + + + +
i2c_slave_handle_t* i2c_slave_transfer_t::handle
+
+ +
+
+ +
+
+ + + + +
i2c_slave_transfer_event_t i2c_slave_transfer_t::event
+
+ +
+
+ +
+
+ + + + +
uint8_t i2c_slave_transfer_t::receivedAddress
+
+

7-bits plus R/nW bit0

+ +
+
+ +
+
+ + + + +
uint32_t i2c_slave_transfer_t::eventMask
+
+ +
+
+ +
+
+ + + + +
size_t i2c_slave_transfer_t::transferredCount
+
+ +
+
+ +
+
+ + + + +
status_t i2c_slave_transfer_t::completionStatus
+
+

Only applies for kI2C_SlaveCompletionEvent.

+ +
+
+ +
+
+ +
+
+ + + + +
struct _i2c_slave_handle
+
+

I2C slave handle typedef.

+
Note
The contents of this structure are private and subject to change.
+
+ + + + + + + + + + + + + + + + +

Data Fields

volatile i2c_slave_transfer_t transfer
 I2C slave transfer. More...
 
volatile bool isBusy
 Whether transfer is busy. More...
 
volatile i2c_slave_fsm_t slaveFsm
 slave transfer state machine. More...
 
i2c_slave_transfer_callback_t callback
 Callback function called at transfer event. More...
 
void * userData
 Callback parameter passed to callback. More...
 
+

Field Documentation

+ +
+
+ + + + +
volatile i2c_slave_transfer_t i2c_slave_handle_t::transfer
+
+ +
+
+ +
+
+ + + + +
volatile bool i2c_slave_handle_t::isBusy
+
+ +
+
+ +
+
+ + + + +
volatile i2c_slave_fsm_t i2c_slave_handle_t::slaveFsm
+
+ +
+
+ +
+
+ + + + +
i2c_slave_transfer_callback_t i2c_slave_handle_t::callback
+
+ +
+
+ +
+
+ + + + +
void* i2c_slave_handle_t::userData
+
+ +
+
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef void(* i2c_slave_transfer_callback_t)(I2C_Type *base, volatile i2c_slave_transfer_t *transfer, void *userData)
+
+

This callback is used only for the slave non-blocking transfer API. To install a callback, use the I2C_SlaveSetCallback() function after you have created a handle.

+
Parameters
+ + + + +
baseBase address for the I2C instance on which the event occurred.
transferPointer to transfer descriptor containing values passed to and/or from the callback.
userDataArbitrary pointer-sized value passed from the application.
+
+
+ +
+
+ +
+
+ + + + +
typedef void(* i2c_isr_t)(I2C_Type *base, void *i2cHandle)
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum _i2c_slave_flags
+
+
Note
These enums are meant to be OR'd together to form a bit mask.
+ + + + + +
Enumerator
kI2C_SlavePendingFlag  +

The I2C module is waiting for software interaction.

+
kI2C_SlaveNotStretching  +

Indicates whether the slave is currently stretching clock (0 = yes, 1 = no).

+
kI2C_SlaveSelected  +

Indicates whether the slave is selected by an address match.

+
kI2C_SaveDeselected  +

Indicates that slave was previously deselected (deselect event took place, w1c).

+
+ +
+
+ +
+
+ + + + + +
Enumerator
kI2C_SlaveAddressRegister0  +

Slave Address 0 register.

+
kI2C_SlaveAddressRegister1  +

Slave Address 1 register.

+
kI2C_SlaveAddressRegister2  +

Slave Address 2 register.

+
kI2C_SlaveAddressRegister3  +

Slave Address 3 register.

+
+ +
+
+ +
+
+ + + +
Enumerator
kI2C_QualModeMask  +

The SLVQUAL0 field (qualAddress) is used as a logical mask for matching address0.

+
kI2C_QualModeExtend  +

The SLVQUAL0 (qualAddress) field is used to extend address 0 matching in a range of addresses.

+
+ +
+
+ +
+
+ + + + +
enum i2c_slave_bus_speed_t
+
+ +
+
+ +
+
+ + + + +
enum i2c_slave_transfer_event_t
+
+

These event enumerations are used for two related purposes. First, a bit mask created by OR'ing together events is passed to I2C_SlaveTransferNonBlocking() in order to specify which events to enable. Then, when the slave callback is invoked, it is passed the current event through its transfer parameter.

+
Note
These enumerations are meant to be OR'd together to form a bit mask of events.
+ + + + + + + +
Enumerator
kI2C_SlaveAddressMatchEvent  +

Received the slave address after a start or repeated start.

+
kI2C_SlaveTransmitEvent  +

Callback is requested to provide data to transmit (slave-transmitter role).

+
kI2C_SlaveReceiveEvent  +

Callback is requested to provide a buffer in which to place received data (slave-receiver role).

+
kI2C_SlaveCompletionEvent  +

All data in the active transfer have been consumed.

+
kI2C_SlaveDeselectedEvent  +

The slave function has become deselected (SLVSEL flag changing from 1 to 0.

+
kI2C_SlaveAllEvents  +

Bit mask of all available events.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
void I2C_SlaveGetDefaultConfig (i2c_slave_config_tslaveConfig)
+
+

This function provides the following default configuration for the I2C slave peripheral:

+
* slaveConfig->enableSlave = true;
+
* slaveConfig->address0.disable = false;
+
* slaveConfig->address0.address = 0u;
+
* slaveConfig->address1.disable = true;
+
* slaveConfig->address2.disable = true;
+
* slaveConfig->address3.disable = true;
+
* slaveConfig->busSpeed = kI2C_SlaveStandardMode;
+
*
+

After calling this function, override any settings to customize the configuration, prior to initializing the master driver with I2C_SlaveInit(). Be sure to override at least the address0.address member of the configuration structure with the desired slave address.

+
Parameters
+ + +
[out]slaveConfigUser provided configuration structure that is set to default values. Refer to i2c_slave_config_t.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_SlaveInit (I2C_Type * base,
const i2c_slave_config_tslaveConfig,
uint32_t srcClock_Hz 
)
+
+

This function enables the peripheral clock and initializes the I2C slave peripheral as described by the user provided configuration.

+
Parameters
+ + + + +
baseThe I2C peripheral base address.
slaveConfigUser provided peripheral configuration. Use I2C_SlaveGetDefaultConfig() to get a set of defaults that you can override.
srcClock_HzFrequency in Hertz of the I2C functional clock. Used to calculate CLKDIV value to provide enough data setup time for master when slave stretches the clock.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void I2C_SlaveSetAddress (I2C_Type * base,
i2c_slave_address_register_t addressRegister,
uint8_t address,
bool addressDisable 
)
+
+

This function writes new value to Slave Address register.

+
Parameters
+ + + + + +
baseThe I2C peripheral base address.
addressRegisterThe module supports multiple address registers. The parameter determines which one shall be changed.
addressThe slave address to be stored to the address register for matching.
addressDisableDisable matching of the specified address register.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void I2C_SlaveDeinit (I2C_Type * base)
+
+

This function disables the I2C slave peripheral and gates the clock. It also performs a software reset to restore the peripheral to reset conditions.

+
Parameters
+ + +
baseThe I2C peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void I2C_SlaveEnable (I2C_Type * base,
bool enable 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseThe I2C peripheral base address.
enableTrue to enable or flase to disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void I2C_SlaveClearStatusFlags (I2C_Type * base,
uint32_t statusMask 
)
+
+inlinestatic
+
+

The following status register flags can be cleared:

+
    +
  • slave deselected flag
  • +
+

Attempts to clear other flags has no effect.

+
Parameters
+ + + +
baseThe I2C peripheral base address.
statusMaskA bitmask of status flags that are to be cleared. The mask is composed of _i2c_slave_flags enumerators OR'd together. You may pass the result of a previous call to I2C_SlaveGetStatusFlags().
+
+
+
See Also
_i2c_slave_flags.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_SlaveWriteBlocking (I2C_Type * base,
const uint8_t * txBuff,
size_t txSize 
)
+
+

The function executes blocking address phase and blocking data phase.

+
Parameters
+ + + + +
baseThe I2C peripheral base address.
txBuffThe pointer to the data to be transferred.
txSizeThe length in bytes of the data to be transferred.
+
+
+
Returns
kStatus_Success Data has been sent.
+
+kStatus_Fail Unexpected slave state (master data write while master read from slave is expected).
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_SlaveReadBlocking (I2C_Type * base,
uint8_t * rxBuff,
size_t rxSize 
)
+
+

The function executes blocking address phase and blocking data phase.

+
Parameters
+ + + + +
baseThe I2C peripheral base address.
rxBuffThe pointer to the data to be transferred.
rxSizeThe length in bytes of the data to be transferred.
+
+
+
Returns
kStatus_Success Data has been received.
+
+kStatus_Fail Unexpected slave state (master data read while master write to slave is expected).
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void I2C_SlaveTransferCreateHandle (I2C_Type * base,
i2c_slave_handle_t * handle,
i2c_slave_transfer_callback_t callback,
void * userData 
)
+
+

The creation of a handle is for use with the non-blocking APIs. Once a handle is created, there is not a corresponding destroy handle. If the user wants to terminate a transfer, the I2C_SlaveTransferAbort() API shall be called.

+
Parameters
+ + + + + +
baseThe I2C peripheral base address.
[out]handlePointer to the I2C slave driver handle.
callbackUser provided pointer to the asynchronous callback function.
userDataUser provided pointer to the application callback data.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_SlaveTransferNonBlocking (I2C_Type * base,
i2c_slave_handle_t * handle,
uint32_t eventMask 
)
+
+

Call this API after calling I2C_SlaveInit() and I2C_SlaveTransferCreateHandle() to start processing transactions driven by an I2C master. The slave monitors the I2C bus and pass events to the callback that was passed into the call to I2C_SlaveTransferCreateHandle(). The callback is always invoked from the interrupt context.

+

If no slave Tx transfer is busy, a master read from slave request invokes kI2C_SlaveTransmitEvent callback. If no slave Rx transfer is busy, a master write to slave request invokes kI2C_SlaveReceiveEvent callback.

+

The set of events received by the callback is customizable. To do so, set the eventMask parameter to the OR'd combination of i2c_slave_transfer_event_t enumerators for the events you wish to receive. The kI2C_SlaveTransmitEvent and kI2C_SlaveReceiveEvent events are always enabled and do not need to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and receive events that are always enabled. In addition, the kI2C_SlaveAllEvents constant is provided as a convenient way to enable all events.

+
Parameters
+ + + + +
baseThe I2C peripheral base address.
handlePointer to i2c_slave_handle_t structure which stores the transfer state.
eventMaskBit mask formed by OR'ing together i2c_slave_transfer_event_t enumerators to specify which events to send to the callback. Other accepted values are 0 to get a default set of only the transmit and receive events, and kI2C_SlaveAllEvents to enable all events.
+
+
+
Return values
+ + + +
kStatus_SuccessSlave transfers were successfully started.
kStatus_I2C_BusySlave transfers have already been started on this handle.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_SlaveSetSendBuffer (I2C_Type * base,
volatile i2c_slave_transfer_ttransfer,
const void * txData,
size_t txSize,
uint32_t eventMask 
)
+
+

The function can be called in response to kI2C_SlaveTransmitEvent callback to start a new slave Tx transfer from within the transfer callback.

+

The set of events received by the callback is customizable. To do so, set the eventMask parameter to the OR'd combination of i2c_slave_transfer_event_t enumerators for the events you wish to receive. The kI2C_SlaveTransmitEvent and kI2C_SlaveReceiveEvent events are always enabled and do not need to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and receive events that are always enabled. In addition, the kI2C_SlaveAllEvents constant is provided as a convenient way to enable all events.

+
Parameters
+ + + + + + +
baseThe I2C peripheral base address.
transferPointer to i2c_slave_transfer_t structure.
txDataPointer to data to send to master.
txSizeSize of txData in bytes.
eventMaskBit mask formed by OR'ing together i2c_slave_transfer_event_t enumerators to specify which events to send to the callback. Other accepted values are 0 to get a default set of only the transmit and receive events, and kI2C_SlaveAllEvents to enable all events.
+
+
+
Return values
+ + + +
kStatus_SuccessSlave transfers were successfully started.
kStatus_I2C_BusySlave transfers have already been started on this handle.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_SlaveSetReceiveBuffer (I2C_Type * base,
volatile i2c_slave_transfer_ttransfer,
void * rxData,
size_t rxSize,
uint32_t eventMask 
)
+
+

The function can be called in response to kI2C_SlaveReceiveEvent callback to start a new slave Rx transfer from within the transfer callback.

+

The set of events received by the callback is customizable. To do so, set the eventMask parameter to the OR'd combination of i2c_slave_transfer_event_t enumerators for the events you wish to receive. The kI2C_SlaveTransmitEvent and kI2C_SlaveReceiveEvent events are always enabled and do not need to be included in the mask. Alternatively, you can pass 0 to get a default set of only the transmit and receive events that are always enabled. In addition, the kI2C_SlaveAllEvents constant is provided as a convenient way to enable all events.

+
Parameters
+ + + + + + +
baseThe I2C peripheral base address.
transferPointer to i2c_slave_transfer_t structure.
rxDataPointer to data to store data from master.
rxSizeSize of rxData in bytes.
eventMaskBit mask formed by OR'ing together i2c_slave_transfer_event_t enumerators to specify which events to send to the callback. Other accepted values are 0 to get a default set of only the transmit and receive events, and kI2C_SlaveAllEvents to enable all events.
+
+
+
Return values
+ + + +
kStatus_SuccessSlave transfers were successfully started.
kStatus_I2C_BusySlave transfers have already been started on this handle.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint32_t I2C_SlaveGetReceivedAddress (I2C_Type * base,
volatile i2c_slave_transfer_ttransfer 
)
+
+inlinestatic
+
+

This function should only be called from the address match event callback kI2C_SlaveAddressMatchEvent.

+
Parameters
+ + + +
baseThe I2C peripheral base address.
transferThe I2C slave transfer.
+
+
+
Returns
The 8-bit address matched by the I2C slave. Bit 0 contains the R/w direction bit, and the 7-bit slave address is in the upper 7 bits.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void I2C_SlaveTransferAbort (I2C_Type * base,
i2c_slave_handle_t * handle 
)
+
+
Note
This API could be called at any time to stop slave for handling the bus events.
+
Parameters
+ + + +
baseThe I2C peripheral base address.
handlePointer to i2c_slave_handle_t structure which stores the transfer state.
+
+
+
Return values
+ + + +
kStatus_Success
kStatus_I2C_Idle
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t I2C_SlaveTransferGetCount (I2C_Type * base,
i2c_slave_handle_t * handle,
size_t * count 
)
+
+
Parameters
+ + + + +
baseI2C base pointer.
handlepointer to i2c_slave_handle_t structure.
countNumber of bytes transferred so far by the non-blocking transaction.
+
+
+
Return values
+ + + +
kStatus_InvalidArgumentcount is Invalid.
kStatus_SuccessSuccessfully return the count.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void I2C_SlaveTransferHandleIRQ (I2C_Type * base,
void * i2cHandle 
)
+
+
Note
This function does not need to be called unless you are reimplementing the non blocking API's interrupt handler routines to add special functionality.
+
Parameters
+ + + +
baseThe I2C peripheral base address.
i2cHandlePointer to i2c_slave_handle_t structure which stores the transfer state.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00018.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00018.js new file mode 100644 index 0000000..ffd7d7e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00018.js @@ -0,0 +1,80 @@ +var a00018 = +[ + [ "i2c_slave_address_t", "a00018.html#a00126", [ + [ "address", "a00018.html#ad7af2a58faba6a178daa97bd06ebce36", null ], + [ "addressDisable", "a00018.html#aca3dcdb3ab2710d991ada52d64bf102c", null ] + ] ], + [ "i2c_slave_config_t", "a00018.html#a00127", [ + [ "address0", "a00018.html#a4738c7cd55260f7e8a3825d0b2278a34", null ], + [ "address1", "a00018.html#ae19c45c96699bb3a6821150ab820b029", null ], + [ "address2", "a00018.html#ae855ba5c53f7e585c44eae8bada85e9d", null ], + [ "address3", "a00018.html#a213d1737a633686701581a09859213a6", null ], + [ "qualMode", "a00018.html#a51577d06d8812b0c999957898ec016b5", null ], + [ "qualAddress", "a00018.html#a4c9d09c35c4641d38bf565de31b07320", null ], + [ "busSpeed", "a00018.html#a14acc40a290c779fde0825f3a8bdbb25", null ], + [ "enableSlave", "a00018.html#a92d20835618a946b8f7702455877ef7a", null ] + ] ], + [ "i2c_slave_transfer_t", "a00018.html#a00128", [ + [ "handle", "a00018.html#ab74516c1edb1424ddb1554de7cae69bc", null ], + [ "event", "a00018.html#ad0a9e837e9df16d89bab98a78af5bd10", null ], + [ "receivedAddress", "a00018.html#ad6f3b291ee81b69cf91c161ae26d65ae", null ], + [ "eventMask", "a00018.html#a1be21257ec375e09106dfe242c02beea", null ], + [ "rxData", "a00018.html#a3e497078c6038baa8748ce5ecebc7e3d", null ], + [ "txData", "a00018.html#afaff4f7ef2ae4ed49eff607a58db18c2", null ], + [ "txSize", "a00018.html#a3d2ef683b0439ce83e3d54e8823ebc38", null ], + [ "rxSize", "a00018.html#a75e06358c0d5840a1dfc19a029e10ba8", null ], + [ "transferredCount", "a00018.html#a0394563c8d0f9eeeecd242a65cee2ad4", null ], + [ "completionStatus", "a00018.html#a35adbf64ca65dd2c1b52f9260f5b9e90", null ] + ] ], + [ "i2c_slave_handle_t", "a00018.html#a00103", [ + [ "transfer", "a00018.html#a9934cd1a4d4b4e02ac5856e28f86a229", null ], + [ "isBusy", "a00018.html#a81ece18a362fc9779750be91f7cc6b30", null ], + [ "slaveFsm", "a00018.html#a18589a5de9b06b2eaf7d4260eac03a58", null ], + [ "callback", "a00018.html#a7229e894f762ead4bd08b4add49e6bc2", null ], + [ "userData", "a00018.html#a98ea5e99278b386e2ddb99d45a9750ee", null ] + ] ], + [ "i2c_slave_transfer_callback_t", "a00018.html#ga0704c8f14da38feb11555e4127d86a18", null ], + [ "i2c_isr_t", "a00018.html#ga64e4839b34e9156358c4eaa717b1c14a", null ], + [ "_i2c_slave_flags", "a00018.html#ga419f2fc2e0684671c00ee97e962bbe0c", [ + [ "kI2C_SlavePendingFlag", "a00018.html#gga419f2fc2e0684671c00ee97e962bbe0cabd274f2defb8f0f8d2f6c2fcdd71c63c", null ], + [ "kI2C_SlaveNotStretching", "a00018.html#gga419f2fc2e0684671c00ee97e962bbe0caf7ad09504bcf02f9c1177431ee44562e", null ], + [ "kI2C_SlaveSelected", "a00018.html#gga419f2fc2e0684671c00ee97e962bbe0ca2d0c7dc4bf2815768510b916b7c1d54e", null ], + [ "kI2C_SaveDeselected", "a00018.html#gga419f2fc2e0684671c00ee97e962bbe0cad834aafd823863602d905d4b3d8c9430", null ] + ] ], + [ "i2c_slave_address_register_t", "a00018.html#ga833a7311515f1a3bf5cb8da2355cc661", [ + [ "kI2C_SlaveAddressRegister0", "a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a39e0e158674bd8a6e254a6a42b5ce50f", null ], + [ "kI2C_SlaveAddressRegister1", "a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a42a589b5e31f29ddc41088c3fb4bfcf1", null ], + [ "kI2C_SlaveAddressRegister2", "a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a8381dd229f545df5e6a32ee5f0aac871", null ], + [ "kI2C_SlaveAddressRegister3", "a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a9e73a2b09fe3943d51849a7d87fbe8a3", null ] + ] ], + [ "i2c_slave_address_qual_mode_t", "a00018.html#ga719dc02b99647eb8f08a05d4d6066c51", [ + [ "kI2C_QualModeMask", "a00018.html#gga719dc02b99647eb8f08a05d4d6066c51af542f0269c83549e7b492911e281a902", null ], + [ "kI2C_QualModeExtend", "a00018.html#gga719dc02b99647eb8f08a05d4d6066c51a6b755a1d30a626380730ce947d09335f", null ] + ] ], + [ "i2c_slave_bus_speed_t", "a00018.html#ga5f368505586dd356fc680711023ace7f", null ], + [ "i2c_slave_transfer_event_t", "a00018.html#gac53e5c96a2eed1b5a95b7d84be48f4ac", [ + [ "kI2C_SlaveAddressMatchEvent", "a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4acacb1ae174dd6798a6fd79800a9e39a3c6", null ], + [ "kI2C_SlaveTransmitEvent", "a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca2f85039a57379838909876a1d509b7aa", null ], + [ "kI2C_SlaveReceiveEvent", "a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4acaac8593e808a8137d1b5d3a51640779de", null ], + [ "kI2C_SlaveCompletionEvent", "a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca38cca3cd668e73f51b8e574835d419df", null ], + [ "kI2C_SlaveDeselectedEvent", "a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca5e765c1c316a51908b68f1f32a7b524d", null ], + [ "kI2C_SlaveAllEvents", "a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca94b030ebdac378a84961893ae567bfbc", null ] + ] ], + [ "i2c_slave_fsm_t", "a00018.html#gad6564299304730416461f62255fcd37c", null ], + [ "I2C_SlaveGetDefaultConfig", "a00018.html#ga7115f80e28b62bbbd3be1a2a918529ba", null ], + [ "I2C_SlaveInit", "a00018.html#ga175a81b5ab74dd78469d6cdea690d8cc", null ], + [ "I2C_SlaveSetAddress", "a00018.html#gacf721065f83982e3df651111183bf7b2", null ], + [ "I2C_SlaveDeinit", "a00018.html#gadb50014db29dd75ea2001fb7bc837e77", null ], + [ "I2C_SlaveEnable", "a00018.html#gacbb93d5ea4f4b40038f41e0e942a9ee1", null ], + [ "I2C_SlaveClearStatusFlags", "a00018.html#ga545c1a43d8d49c4675de493d45a4063a", null ], + [ "I2C_SlaveWriteBlocking", "a00018.html#ga280404c6b1ede542f2c1c20bd382869c", null ], + [ "I2C_SlaveReadBlocking", "a00018.html#ga89baaf8bc82b19c837032665e89a1707", null ], + [ "I2C_SlaveTransferCreateHandle", "a00018.html#gac9b90f575d92ff8ad3cc350a5c8ad1b9", null ], + [ "I2C_SlaveTransferNonBlocking", "a00018.html#gaa387d81ea08a9d4b39cfeb3dfec505f7", null ], + [ "I2C_SlaveSetSendBuffer", "a00018.html#gac7602b6897596348fe190e4fc63f1381", null ], + [ "I2C_SlaveSetReceiveBuffer", "a00018.html#ga25b9c35089f0fc966facec3bf874c840", null ], + [ "I2C_SlaveGetReceivedAddress", "a00018.html#ga4c9fc06eeb8a3beb024f6525e4d99a0b", null ], + [ "I2C_SlaveTransferAbort", "a00018.html#ga5ae9f5e6e854d14d33ba3029128bd6f0", null ], + [ "I2C_SlaveTransferGetCount", "a00018.html#gabf38a498bd3527ea0b7cc947ae71e17e", null ], + [ "I2C_SlaveTransferHandleIRQ", "a00018.html#ga097c0b20503381de44cccba311dcf236", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00019.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00019.html new file mode 100644 index 0000000..f7a0a45 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00019.html @@ -0,0 +1,270 @@ + + + + + + +MCUXpresso SDK API Reference Manual: IOCON: I/O pin configuration + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
IOCON: I/O pin configuration
+
+
+

Overview

+

The MCUXpresso SDK provides Peripheral driver for the I/O pin configuration (IOCON) module of MCUXpresso SDK devices.

+

+Function groups

+

+Pin mux set

+

The function IOCONPinMuxSet() set pinmux for single pin according to selected configuration.

+

+Pin mux set

+

The function IOCON_SetPinMuxing() set pinmux for group of pins according to selected configuration.

+

+Typical use case

+

Example use of IOCON API to selection of GPIO mode. Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/iocon

+ + + + +

+Files

file  fsl_iocon.h
 
+ + + + +

+Data Structures

struct  iocon_group_t
 Array of IOCON pin definitions passed to IOCON_SetPinMuxing() must be in this format. More...
 
+ + + + + + + +

+Functions

__STATIC_INLINE void IOCON_PinMuxSet (IOCON_Type *base, uint8_t ionumber, uint32_t modefunc)
 IOCON function and mode selection definitions. More...
 
__STATIC_INLINE void IOCON_SetPinMuxing (IOCON_Type *base, const iocon_group_t *pinArray, uint32_t arrayLength)
 Set all I/O Control pin muxing. More...
 
+ + + + +

+Driver version

#define LPC_IOCON_DRIVER_VERSION   (MAKE_VERSION(2, 0, 1))
 IOCON driver version 2.0.1. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct iocon_group_t
+
+
+
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define LPC_IOCON_DRIVER_VERSION   (MAKE_VERSION(2, 0, 1))
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
__STATIC_INLINE void IOCON_PinMuxSet (IOCON_Type * base,
uint8_t ionumber,
uint32_t modefunc 
)
+
+
Note
See the User Manual for specific modes and functions supported by the various pins. Sets I/O Control pin mux
+
Parameters
+ + + + +
base: The base of IOCON peripheral on the chip
ionumber: GPIO number to mux
modefunc: OR'ed values of type IOCON_*
+
+
+
Returns
Nothing
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
__STATIC_INLINE void IOCON_SetPinMuxing (IOCON_Type * base,
const iocon_group_tpinArray,
uint32_t arrayLength 
)
+
+
Parameters
+ + + + +
base: The base of IOCON peripheral on the chip
pinArray: Pointer to array of pin mux selections
arrayLength: Number of entries in pinArray
+
+
+
Returns
Nothing
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00019.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00019.js new file mode 100644 index 0000000..914360f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00019.js @@ -0,0 +1,7 @@ +var a00019 = +[ + [ "iocon_group_t", "a00019.html#a00129", null ], + [ "LPC_IOCON_DRIVER_VERSION", "a00019.html#gac4193f0e0cb9b0469f58af2648024059", null ], + [ "IOCON_PinMuxSet", "a00019.html#gaf9258f56192a94928f67940eee5dd879", null ], + [ "IOCON_SetPinMuxing", "a00019.html#gaf2cc5d2d92b4e2898a197479e77a326e", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00020.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00020.html new file mode 100644 index 0000000..7067987 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00020.html @@ -0,0 +1,959 @@ + + + + + + +MCUXpresso SDK API Reference Manual: MRT: Multi-Rate Timer + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
MRT: Multi-Rate Timer
+
+
+

Overview

+

The MCUXpresso SDK provides a driver for the Multi-Rate Timer (MRT) of MCUXpresso SDK devices.

+

+Function groups

+

The MRT driver supports operating the module as a time counter.

+

+Initialization and deinitialization

+

The function MRT_Init() initializes the MRT with specified configurations. The function MRT_GetDefaultConfig() gets the default configurations. The initialization function configures the MRT operating mode.

+

The function MRT_Deinit() stops the MRT timers and disables the module clock.

+

+Timer period Operations

+

The function MRT_UpdateTimerPeriod() is used to update the timer period in units of count. The new value is immediately loaded or will be loaded at the end of the current time interval.

+

The function MRT_GetCurrentTimerCount() reads the current timer counting value. This function returns the real-time timer counting value, in a range from 0 to a timer period.

+

The timer period operation functions takes the count value in ticks. The user can call the utility macros provided in fsl_common.h to convert to microseconds or milliseconds

+

+Start and Stop timer operations

+

The function MRT_StartTimer() starts the timer counting. After calling this function, the timer loads the period value, counts down to 0 and depending on the timer mode it either loads the respective start value again or stop. When the timer reaches 0, it generates a trigger pulse and sets the timeout interrupt flag.

+

The function MRT_StopTimer() stops the timer counting.

+

+Get and release channel

+

These functions can be used to reserve and release a channel. The function MRT_GetIdleChannel() finds the available channel. This function returns the lowest available channel number. The function MRT_ReleaseChannel() release the channel when the timer is using the multi-task mode. In multi-task mode, the INUSE flags allow more control over when MRT channels are released for further use.

+

+Status

+

Provides functions to get and clear the PIT status.

+

+Interrupt

+

Provides functions to enable/disable PIT interrupts and get current enabled interrupts.

+

+Typical use case

+

+MRT tick example

+

Updates the MRT period and toggles an LED periodically. Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/mrt

+ + + + +

+Files

file  fsl_mrt.h
 
+ + + + +

+Data Structures

struct  mrt_config_t
 MRT configuration structure. More...
 
+ + + + + + + + + + + + + +

+Enumerations

enum  mrt_chnl_t {
+  kMRT_Channel_0 = 0U, +
+  kMRT_Channel_1, +
+  kMRT_Channel_2, +
+  kMRT_Channel_3 +
+ }
 List of MRT channels. More...
 
enum  mrt_timer_mode_t {
+  kMRT_RepeatMode = (0 << MRT_CHANNEL_CTRL_MODE_SHIFT), +
+  kMRT_OneShotMode = (1 << MRT_CHANNEL_CTRL_MODE_SHIFT), +
+  kMRT_OneShotStallMode = (2 << MRT_CHANNEL_CTRL_MODE_SHIFT) +
+ }
 List of MRT timer modes. More...
 
enum  mrt_interrupt_enable_t { kMRT_TimerInterruptEnable = MRT_CHANNEL_CTRL_INTEN_MASK + }
 List of MRT interrupts. More...
 
enum  mrt_status_flags_t {
+  kMRT_TimerInterruptFlag = MRT_CHANNEL_STAT_INTFLAG_MASK, +
+  kMRT_TimerRunFlag = MRT_CHANNEL_STAT_RUN_MASK +
+ }
 List of MRT status flags. More...
 
+ + + + +

+Driver version

+#define FSL_MRT_DRIVER_VERSION   (MAKE_VERSION(2, 0, 3))
 Version 2.0.3.
 
+ + + + + + + + + + + + + +

+Initialization and deinitialization

void MRT_Init (MRT_Type *base, const mrt_config_t *config)
 Ungates the MRT clock and configures the peripheral for basic operation. More...
 
void MRT_Deinit (MRT_Type *base)
 Gate the MRT clock. More...
 
static void MRT_GetDefaultConfig (mrt_config_t *config)
 Fill in the MRT config struct with the default settings. More...
 
static void MRT_SetupChannelMode (MRT_Type *base, mrt_chnl_t channel, const mrt_timer_mode_t mode)
 Sets up an MRT channel mode. More...
 
+ + + + + + + + + + +

+Interrupt Interface

static void MRT_EnableInterrupts (MRT_Type *base, mrt_chnl_t channel, uint32_t mask)
 Enables the MRT interrupt. More...
 
static void MRT_DisableInterrupts (MRT_Type *base, mrt_chnl_t channel, uint32_t mask)
 Disables the selected MRT interrupt. More...
 
static uint32_t MRT_GetEnabledInterrupts (MRT_Type *base, mrt_chnl_t channel)
 Gets the enabled MRT interrupts. More...
 
+ + + + + + + +

+Status Interface

static uint32_t MRT_GetStatusFlags (MRT_Type *base, mrt_chnl_t channel)
 Gets the MRT status flags. More...
 
static void MRT_ClearStatusFlags (MRT_Type *base, mrt_chnl_t channel, uint32_t mask)
 Clears the MRT status flags. More...
 
+ + + + + + + +

+Read and Write the timer period

void MRT_UpdateTimerPeriod (MRT_Type *base, mrt_chnl_t channel, uint32_t count, bool immediateLoad)
 Used to update the timer period in units of count. More...
 
static uint32_t MRT_GetCurrentTimerCount (MRT_Type *base, mrt_chnl_t channel)
 Reads the current timer counting value. More...
 
+ + + + + + + +

+Timer Start and Stop

static void MRT_StartTimer (MRT_Type *base, mrt_chnl_t channel, uint32_t count)
 Starts the timer counting. More...
 
static void MRT_StopTimer (MRT_Type *base, mrt_chnl_t channel)
 Stops the timer counting. More...
 
+ + + + +

+Get & release channel

static uint32_t MRT_GetIdleChannel (MRT_Type *base)
 Find the available channel. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct mrt_config_t
+
+

This structure holds the configuration settings for the MRT peripheral. To initialize this structure to reasonable defaults, call the MRT_GetDefaultConfig() function and pass a pointer to your config structure instance.

+

The config struct can be made const so it resides in flash

+
+ + + + +

Data Fields

+bool enableMultiTask
 true: Timers run in multi-task mode; false: Timers run in hardware status mode
 
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum mrt_chnl_t
+
+ + + + + +
Enumerator
kMRT_Channel_0  +

MRT channel number 0.

+
kMRT_Channel_1  +

MRT channel number 1.

+
kMRT_Channel_2  +

MRT channel number 2.

+
kMRT_Channel_3  +

MRT channel number 3.

+
+ +
+
+ +
+
+ + + + +
enum mrt_timer_mode_t
+
+ + + + +
Enumerator
kMRT_RepeatMode  +

Repeat Interrupt mode.

+
kMRT_OneShotMode  +

One-shot Interrupt mode.

+
kMRT_OneShotStallMode  +

One-shot stall mode.

+
+ +
+
+ +
+
+ + + + +
enum mrt_interrupt_enable_t
+
+ + +
Enumerator
kMRT_TimerInterruptEnable  +

Timer interrupt enable.

+
+ +
+
+ +
+
+ + + + +
enum mrt_status_flags_t
+
+ + + +
Enumerator
kMRT_TimerInterruptFlag  +

Timer interrupt flag.

+
kMRT_TimerRunFlag  +

Indicates state of the timer.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void MRT_Init (MRT_Type * base,
const mrt_config_tconfig 
)
+
+
Note
This API should be called at the beginning of the application using the MRT driver.
+
Parameters
+ + + +
baseMulti-Rate timer peripheral base address
configPointer to user's MRT config structure. If MRT has MULTITASK bit field in MODCFG reigster, param config is useless.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void MRT_Deinit (MRT_Type * base)
+
+
Parameters
+ + +
baseMulti-Rate timer peripheral base address
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void MRT_GetDefaultConfig (mrt_config_tconfig)
+
+inlinestatic
+
+

The default values are:

+
* config->enableMultiTask = false;
+
*
+
Parameters
+ + +
configPointer to user's MRT config structure.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void MRT_SetupChannelMode (MRT_Type * base,
mrt_chnl_t channel,
const mrt_timer_mode_t mode 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseMulti-Rate timer peripheral base address
channelChannel that is being configured.
modeTimer mode to use for the channel.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void MRT_EnableInterrupts (MRT_Type * base,
mrt_chnl_t channel,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseMulti-Rate timer peripheral base address
channelTimer channel number
maskThe interrupts to enable. This is a logical OR of members of the enumeration mrt_interrupt_enable_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void MRT_DisableInterrupts (MRT_Type * base,
mrt_chnl_t channel,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseMulti-Rate timer peripheral base address
channelTimer channel number
maskThe interrupts to disable. This is a logical OR of members of the enumeration mrt_interrupt_enable_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint32_t MRT_GetEnabledInterrupts (MRT_Type * base,
mrt_chnl_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseMulti-Rate timer peripheral base address
channelTimer channel number
+
+
+
Returns
The enabled interrupts. This is the logical OR of members of the enumeration mrt_interrupt_enable_t
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint32_t MRT_GetStatusFlags (MRT_Type * base,
mrt_chnl_t channel 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseMulti-Rate timer peripheral base address
channelTimer channel number
+
+
+
Returns
The status flags. This is the logical OR of members of the enumeration mrt_status_flags_t
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void MRT_ClearStatusFlags (MRT_Type * base,
mrt_chnl_t channel,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseMulti-Rate timer peripheral base address
channelTimer channel number
maskThe status flags to clear. This is a logical OR of members of the enumeration mrt_status_flags_t
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void MRT_UpdateTimerPeriod (MRT_Type * base,
mrt_chnl_t channel,
uint32_t count,
bool immediateLoad 
)
+
+

The new value will be immediately loaded or will be loaded at the end of the current time interval. For one-shot interrupt mode the new value will be immediately loaded.

+
Note
User can call the utility macros provided in fsl_common.h to convert to ticks
+
Parameters
+ + + + + +
baseMulti-Rate timer peripheral base address
channelTimer channel number
countTimer period in units of ticks
immediateLoadtrue: Load the new value immediately into the TIMER register; false: Load the new value at the end of current timer interval
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint32_t MRT_GetCurrentTimerCount (MRT_Type * base,
mrt_chnl_t channel 
)
+
+inlinestatic
+
+

This function returns the real-time timer counting value, in a range from 0 to a timer period.

+
Note
User can call the utility macros provided in fsl_common.h to convert ticks to usec or msec
+
Parameters
+ + + +
baseMulti-Rate timer peripheral base address
channelTimer channel number
+
+
+
Returns
Current timer counting value in ticks
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void MRT_StartTimer (MRT_Type * base,
mrt_chnl_t channel,
uint32_t count 
)
+
+inlinestatic
+
+

After calling this function, timers load period value, counts down to 0 and depending on the timer mode it will either load the respective start value again or stop.

+
Note
User can call the utility macros provided in fsl_common.h to convert to ticks
+
Parameters
+ + + + +
baseMulti-Rate timer peripheral base address
channelTimer channel number.
countTimer period in units of ticks. Count can contain the LOAD bit, which control the force load feature.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void MRT_StopTimer (MRT_Type * base,
mrt_chnl_t channel 
)
+
+inlinestatic
+
+

This function stops the timer from counting.

+
Parameters
+ + + +
baseMulti-Rate timer peripheral base address
channelTimer channel number.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t MRT_GetIdleChannel (MRT_Type * base)
+
+inlinestatic
+
+

This function returns the lowest available channel number.

+
Parameters
+ + +
baseMulti-Rate timer peripheral base address
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00020.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00020.js new file mode 100644 index 0000000..ad98369 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00020.js @@ -0,0 +1,39 @@ +var a00020 = +[ + [ "mrt_config_t", "a00020.html#a00130", [ + [ "enableMultiTask", "a00020.html#aa8d8b810ee17770fd48674454f59bb08", null ] + ] ], + [ "FSL_MRT_DRIVER_VERSION", "a00020.html#gae39f6122bd73a5156d40291962f7507f", null ], + [ "mrt_chnl_t", "a00020.html#gaece5c1972e35dec2efcce98847a09622", [ + [ "kMRT_Channel_0", "a00020.html#ggaece5c1972e35dec2efcce98847a09622a27e83d437e2798b19c59c2af4d99e1dc", null ], + [ "kMRT_Channel_1", "a00020.html#ggaece5c1972e35dec2efcce98847a09622a44b7807f36fe0a21240e721d46d8f9d7", null ], + [ "kMRT_Channel_2", "a00020.html#ggaece5c1972e35dec2efcce98847a09622a17597fb66d9b1d3e97b318db79267f52", null ], + [ "kMRT_Channel_3", "a00020.html#ggaece5c1972e35dec2efcce98847a09622af57e6e009258a71bc3a2890aedff34b3", null ] + ] ], + [ "mrt_timer_mode_t", "a00020.html#gad481f648f1c89a1eab327530d6fef1d0", [ + [ "kMRT_RepeatMode", "a00020.html#ggad481f648f1c89a1eab327530d6fef1d0a6b415c060dc09ed293ec3dda829cb257", null ], + [ "kMRT_OneShotMode", "a00020.html#ggad481f648f1c89a1eab327530d6fef1d0abe4ba0a30bc09f1921a0504eb826b3dc", null ], + [ "kMRT_OneShotStallMode", "a00020.html#ggad481f648f1c89a1eab327530d6fef1d0add9f55173bb54f623c955c29c22dd5b2", null ] + ] ], + [ "mrt_interrupt_enable_t", "a00020.html#ga9d2f90ae2c6f99410e2908dac8cc6943", [ + [ "kMRT_TimerInterruptEnable", "a00020.html#gga9d2f90ae2c6f99410e2908dac8cc6943a2a5e8ee568da2c888093b732f2157ea5", null ] + ] ], + [ "mrt_status_flags_t", "a00020.html#ga0bb94508d8cf924c3a6971364377673a", [ + [ "kMRT_TimerInterruptFlag", "a00020.html#gga0bb94508d8cf924c3a6971364377673aa6942598faf3aef148a850f8850cf01c3", null ], + [ "kMRT_TimerRunFlag", "a00020.html#gga0bb94508d8cf924c3a6971364377673aa745c62687191197b48b35dbd1aac40db", null ] + ] ], + [ "MRT_Init", "a00020.html#ga44091408531a61dfac7c4ee4982be317", null ], + [ "MRT_Deinit", "a00020.html#ga5d988ee09b604ab28f1b37320ee8d2d9", null ], + [ "MRT_GetDefaultConfig", "a00020.html#gad30aa85105a47b708fd5880a929e5e84", null ], + [ "MRT_SetupChannelMode", "a00020.html#ga8f4d38afa34e99ba521d9ca08be06355", null ], + [ "MRT_EnableInterrupts", "a00020.html#gae875817838659e596dc1cb1527c948c3", null ], + [ "MRT_DisableInterrupts", "a00020.html#ga7a8066680089523fa602dbe58b0c0505", null ], + [ "MRT_GetEnabledInterrupts", "a00020.html#ga2e666900eef9bdbd9d9e587d2b7ca2c2", null ], + [ "MRT_GetStatusFlags", "a00020.html#gafa8493a0faee1cc356da26ca99a54da8", null ], + [ "MRT_ClearStatusFlags", "a00020.html#ga959db20281cfce080c684bd94f667799", null ], + [ "MRT_UpdateTimerPeriod", "a00020.html#ga57f3d18e0ec88a5eb04b3282e0f3dc95", null ], + [ "MRT_GetCurrentTimerCount", "a00020.html#ga7c0bbb20b4abd7450f860277ef9d8a20", null ], + [ "MRT_StartTimer", "a00020.html#ga388dd5041e6c179d637e17cd6e5a607e", null ], + [ "MRT_StopTimer", "a00020.html#ga7620866a54acdcc17abab2b46a94dc6c", null ], + [ "MRT_GetIdleChannel", "a00020.html#ga320ba098c93a30174254eb763dd37dde", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00021.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00021.html new file mode 100644 index 0000000..1d4f191 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00021.html @@ -0,0 +1,2753 @@ + + + + + + +MCUXpresso SDK API Reference Manual: SCTimer: SCTimer/PWM (SCT) + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
SCTimer: SCTimer/PWM (SCT)
+
+
+

Overview

+

The MCUXpresso SDK provides a driver for the SCTimer Module (SCT) of MCUXpresso SDK devices.

+

+Function groups

+

The SCTimer driver supports the generation of PWM signals. The driver also supports enabling events in various states of the SCTimer and the actions that will be triggered when an event occurs.

+

+Initialization and deinitialization

+

The function SCTIMER_Init() initializes the SCTimer with specified configurations. The function SCTIMER_GetDefaultConfig() gets the default configurations.

+

The function SCTIMER_Deinit() halts the SCTimer counter and turns off the module clock.

+

+PWM Operations

+

The function SCTIMER_SetupPwm() sets up SCTimer channels for PWM output. The function can set up the PWM signal properties duty cycle and level-mode (active low or high) to use. However, the same PWM period and PWM mode (edge or center-aligned) is applied to all channels requesting the PWM output. The signal duty cycle is provided as a percentage of the PWM period. Its value should be between 1 and 100.

+

The function SCTIMER_UpdatePwmDutycycle() updates the PWM signal duty cycle of a particular SCTimer channel.

+

+Status

+

Provides functions to get and clear the SCTimer status.

+

+Interrupt

+

Provides functions to enable/disable SCTimer interrupts and get current enabled interrupts.

+

+SCTimer State machine and operations

+

The SCTimer has 10 states and each state can have a set of events enabled that can trigger a user specified action when the event occurs.

+

+SCTimer event operations

+

The user can create an event and enable it in the current state using the functions SCTIMER_CreateAndScheduleEvent() and SCTIMER_ScheduleEvent(). SCTIMER_CreateAndScheduleEvent() creates a new event based on the users preference and enables it in the current state. SCTIMER_ScheduleEvent() enables an event created earlier in the current state.

+

+SCTimer state operations

+

The user can get the current state number by calling SCTIMER_GetCurrentState(), he can use this state number to set state transitions when a particular event is triggered.

+

Once the user has created and enabled events for the current state he can go to the next state by calling the function SCTIMER_IncreaseState(). The user can then start creating events to be enabled in this new state.

+

+SCTimer action operations

+

There are a set of functions that decide what action should be taken when an event is triggered. SCTIMER_SetupCaptureAction() sets up which counter to capture and which capture register to read on event trigger. SCTIMER_SetupNextStateAction() sets up which state the SCTimer state machine should transition to on event trigger. SCTIMER_SetupOutputSetAction() sets up which pin to set on event trigger. SCTIMER_SetupOutputClearAction() sets up which pin to clear on event trigger. SCTIMER_SetupOutputToggleAction() sets up which pin to toggle on event trigger. SCTIMER_SetupCounterLimitAction() sets up which counter will be limited on event trigger. SCTIMER_SetupCounterStopAction() sets up which counter will be stopped on event trigger. SCTIMER_SetupCounterStartAction() sets up which counter will be started on event trigger. SCTIMER_SetupCounterHaltAction() sets up which counter will be halted on event trigger. SCTIMER_SetupDmaTriggerAction() sets up which DMA request will be activated on event trigger.

+

+16-bit counter mode

+

The SCTimer is configurable to run as two 16-bit counters via the enableCounterUnify flag that is available in the configuration structure passed in to the SCTIMER_Init() function.

+

When operating in 16-bit mode, it is important the user specify the appropriate counter to use when working with the functions: SCTIMER_StartTimer(), SCTIMER_StopTimer(), SCTIMER_CreateAndScheduleEvent(), SCTIMER_SetupCaptureAction(), SCTIMER_SetupCounterLimitAction(), SCTIMER_SetupCounterStopAction(), SCTIMER_SetupCounterStartAction(), and SCTIMER_SetupCounterHaltAction().

+

+Typical use case

+

+PWM output

+

Output a PWM signal on 2 SCTimer channels with different duty cycles. Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/sctimer

+ + + + +

+Files

file  fsl_sctimer.h
 
+ + + + + + + +

+Data Structures

struct  sctimer_pwm_signal_param_t
 Options to configure a SCTimer PWM signal. More...
 
struct  sctimer_config_t
 SCTimer configuration structure. More...
 
+ + + + +

+Typedefs

typedef void(* sctimer_event_callback_t )(void)
 SCTimer callback typedef. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  sctimer_pwm_mode_t {
+  kSCTIMER_EdgeAlignedPwm = 0U, +
+  kSCTIMER_CenterAlignedPwm +
+ }
 SCTimer PWM operation modes. More...
 
enum  sctimer_counter_t {
+  kSCTIMER_Counter_L = (1U << 0), +
+  kSCTIMER_Counter_H = (1U << 1), +
+  kSCTIMER_Counter_U = (1U << 2) +
+ }
 SCTimer counters type. More...
 
enum  sctimer_input_t {
+  kSCTIMER_Input_0 = 0U, +
+  kSCTIMER_Input_1, +
+  kSCTIMER_Input_2, +
+  kSCTIMER_Input_3, +
+  kSCTIMER_Input_4, +
+  kSCTIMER_Input_5, +
+  kSCTIMER_Input_6, +
+  kSCTIMER_Input_7 +
+ }
 List of SCTimer input pins. More...
 
enum  sctimer_out_t {
+  kSCTIMER_Out_0 = 0U, +
+  kSCTIMER_Out_1, +
+  kSCTIMER_Out_2, +
+  kSCTIMER_Out_3, +
+  kSCTIMER_Out_4, +
+  kSCTIMER_Out_5, +
+  kSCTIMER_Out_6, +
+  kSCTIMER_Out_7, +
+  kSCTIMER_Out_8, +
+  kSCTIMER_Out_9 +
+ }
 List of SCTimer output pins. More...
 
enum  sctimer_pwm_level_select_t {
+  kSCTIMER_LowTrue = 0U, +
+  kSCTIMER_HighTrue +
+ }
 SCTimer PWM output pulse mode: high-true, low-true or no output. More...
 
enum  sctimer_clock_mode_t {
+  kSCTIMER_System_ClockMode = 0U, +
+  kSCTIMER_Sampled_ClockMode, +
+  kSCTIMER_Input_ClockMode, +
+  kSCTIMER_Asynchronous_ClockMode +
+ }
 SCTimer clock mode options. More...
 
enum  sctimer_clock_select_t {
+  kSCTIMER_Clock_On_Rise_Input_0 = 0U, +
+  kSCTIMER_Clock_On_Fall_Input_0, +
+  kSCTIMER_Clock_On_Rise_Input_1, +
+  kSCTIMER_Clock_On_Fall_Input_1, +
+  kSCTIMER_Clock_On_Rise_Input_2, +
+  kSCTIMER_Clock_On_Fall_Input_2, +
+  kSCTIMER_Clock_On_Rise_Input_3, +
+  kSCTIMER_Clock_On_Fall_Input_3, +
+  kSCTIMER_Clock_On_Rise_Input_4, +
+  kSCTIMER_Clock_On_Fall_Input_4, +
+  kSCTIMER_Clock_On_Rise_Input_5, +
+  kSCTIMER_Clock_On_Fall_Input_5, +
+  kSCTIMER_Clock_On_Rise_Input_6, +
+  kSCTIMER_Clock_On_Fall_Input_6, +
+  kSCTIMER_Clock_On_Rise_Input_7, +
+  kSCTIMER_Clock_On_Fall_Input_7 +
+ }
 SCTimer clock select options. More...
 
enum  sctimer_conflict_resolution_t {
+  kSCTIMER_ResolveNone = 0U, +
+  kSCTIMER_ResolveSet, +
+  kSCTIMER_ResolveClear, +
+  kSCTIMER_ResolveToggle +
+ }
 SCTimer output conflict resolution options. More...
 
enum  sctimer_event_active_direction_t {
+  kSCTIMER_ActiveIndependent = 0U, +
+  kSCTIMER_ActiveInCountUp, +
+  kSCTIMER_ActiveInCountDown +
+ }
 List of SCTimer event generation active direction when the counters are operating in BIDIR mode. More...
 
enum  sctimer_event_t
 List of SCTimer event types.
 
enum  sctimer_interrupt_enable_t {
+  kSCTIMER_Event0InterruptEnable = (1U << 0), +
+  kSCTIMER_Event1InterruptEnable = (1U << 1), +
+  kSCTIMER_Event2InterruptEnable = (1U << 2), +
+  kSCTIMER_Event3InterruptEnable = (1U << 3), +
+  kSCTIMER_Event4InterruptEnable = (1U << 4), +
+  kSCTIMER_Event5InterruptEnable = (1U << 5), +
+  kSCTIMER_Event6InterruptEnable = (1U << 6), +
+  kSCTIMER_Event7InterruptEnable = (1U << 7), +
+  kSCTIMER_Event8InterruptEnable = (1U << 8), +
+  kSCTIMER_Event9InterruptEnable = (1U << 9), +
+  kSCTIMER_Event10InterruptEnable = (1U << 10), +
+  kSCTIMER_Event11InterruptEnable = (1U << 11), +
+  kSCTIMER_Event12InterruptEnable = (1U << 12) +
+ }
 List of SCTimer interrupts. More...
 
enum  sctimer_status_flags_t {
+  kSCTIMER_Event0Flag = (1U << 0), +
+  kSCTIMER_Event1Flag = (1U << 1), +
+  kSCTIMER_Event2Flag = (1U << 2), +
+  kSCTIMER_Event3Flag = (1U << 3), +
+  kSCTIMER_Event4Flag = (1U << 4), +
+  kSCTIMER_Event5Flag = (1U << 5), +
+  kSCTIMER_Event6Flag = (1U << 6), +
+  kSCTIMER_Event7Flag = (1U << 7), +
+  kSCTIMER_Event8Flag = (1U << 8), +
+  kSCTIMER_Event9Flag = (1U << 9), +
+  kSCTIMER_Event10Flag = (1U << 10), +
+  kSCTIMER_Event11Flag = (1U << 11), +
+  kSCTIMER_Event12Flag = (1U << 12), +
+  kSCTIMER_BusErrorLFlag, +
+  kSCTIMER_BusErrorHFlag +
+ }
 List of SCTimer flags. More...
 
+ + + + +

+Driver version

+#define FSL_SCTIMER_DRIVER_VERSION   (MAKE_VERSION(2, 4, 0))
 Version.
 
+ + + + + + + + + + +

+Initialization and deinitialization

status_t SCTIMER_Init (SCT_Type *base, const sctimer_config_t *config)
 Ungates the SCTimer clock and configures the peripheral for basic operation. More...
 
void SCTIMER_Deinit (SCT_Type *base)
 Gates the SCTimer clock. More...
 
void SCTIMER_GetDefaultConfig (sctimer_config_t *config)
 Fills in the SCTimer configuration structure with the default settings. More...
 
+ + + + + + + +

+PWM setup operations

status_t SCTIMER_SetupPwm (SCT_Type *base, const sctimer_pwm_signal_param_t *pwmParams, sctimer_pwm_mode_t mode, uint32_t pwmFreq_Hz, uint32_t srcClock_Hz, uint32_t *event)
 Configures the PWM signal parameters. More...
 
void SCTIMER_UpdatePwmDutycycle (SCT_Type *base, sctimer_out_t output, uint8_t dutyCyclePercent, uint32_t event)
 Updates the duty cycle of an active PWM signal. More...
 
+ + + + + + + + + + +

+Interrupt Interface

static void SCTIMER_EnableInterrupts (SCT_Type *base, uint32_t mask)
 Enables the selected SCTimer interrupts. More...
 
static void SCTIMER_DisableInterrupts (SCT_Type *base, uint32_t mask)
 Disables the selected SCTimer interrupts. More...
 
static uint32_t SCTIMER_GetEnabledInterrupts (SCT_Type *base)
 Gets the enabled SCTimer interrupts. More...
 
+ + + + + + + +

+Status Interface

static uint32_t SCTIMER_GetStatusFlags (SCT_Type *base)
 Gets the SCTimer status flags. More...
 
static void SCTIMER_ClearStatusFlags (SCT_Type *base, uint32_t mask)
 Clears the SCTimer status flags. More...
 
+ + + + + + + +

+Counter Start and Stop

static void SCTIMER_StartTimer (SCT_Type *base, uint32_t countertoStart)
 Starts the SCTimer counter. More...
 
static void SCTIMER_StopTimer (SCT_Type *base, uint32_t countertoStop)
 Halts the SCTimer counter. More...
 
+ + + + + + + + + + + + + + + + + + + +

+Functions to create a new event and manage the state logic

status_t SCTIMER_CreateAndScheduleEvent (SCT_Type *base, sctimer_event_t howToMonitor, uint32_t matchValue, uint32_t whichIO, sctimer_counter_t whichCounter, uint32_t *event)
 Create an event that is triggered on a match or IO and schedule in current state. More...
 
void SCTIMER_ScheduleEvent (SCT_Type *base, uint32_t event)
 Enable an event in the current state. More...
 
status_t SCTIMER_IncreaseState (SCT_Type *base)
 Increase the state by 1. More...
 
uint32_t SCTIMER_GetCurrentState (SCT_Type *base)
 Provides the current state. More...
 
static void SCTIMER_SetCounterState (SCT_Type *base, sctimer_counter_t whichCounter, uint32_t state)
 Set the counter current state. More...
 
static uint16_t SCTIMER_GetCounterState (SCT_Type *base, sctimer_counter_t whichCounter)
 Get the counter current state value. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Actions to take in response to an event

status_t SCTIMER_SetupCaptureAction (SCT_Type *base, sctimer_counter_t whichCounter, uint32_t *captureRegister, uint32_t event)
 Setup capture of the counter value on trigger of a selected event. More...
 
void SCTIMER_SetCallback (SCT_Type *base, sctimer_event_callback_t callback, uint32_t event)
 Receive noticification when the event trigger an interrupt. More...
 
static void SCTIMER_SetupStateLdMethodAction (SCT_Type *base, uint32_t event, bool fgLoad)
 Change the load method of transition to the specified state. More...
 
static void SCTIMER_SetupNextStateActionwithLdMethod (SCT_Type *base, uint32_t nextState, uint32_t event, bool fgLoad)
 Transition to the specified state with Load method. More...
 
static void SCTIMER_SetupNextStateAction (SCT_Type *base, uint32_t nextState, uint32_t event)
 Transition to the specified state. More...
 
static void SCTIMER_SetupEventActiveDirection (SCT_Type *base, sctimer_event_active_direction_t activeDirection, uint32_t event)
 Setup event active direction when the counters are operating in BIDIR mode. More...
 
static void SCTIMER_SetupOutputSetAction (SCT_Type *base, uint32_t whichIO, uint32_t event)
 Set the Output. More...
 
static void SCTIMER_SetupOutputClearAction (SCT_Type *base, uint32_t whichIO, uint32_t event)
 Clear the Output. More...
 
void SCTIMER_SetupOutputToggleAction (SCT_Type *base, uint32_t whichIO, uint32_t event)
 Toggle the output level. More...
 
static void SCTIMER_SetupCounterLimitAction (SCT_Type *base, sctimer_counter_t whichCounter, uint32_t event)
 Limit the running counter. More...
 
static void SCTIMER_SetupCounterStopAction (SCT_Type *base, sctimer_counter_t whichCounter, uint32_t event)
 Stop the running counter. More...
 
static void SCTIMER_SetupCounterStartAction (SCT_Type *base, sctimer_counter_t whichCounter, uint32_t event)
 Re-start the stopped counter. More...
 
static void SCTIMER_SetupCounterHaltAction (SCT_Type *base, sctimer_counter_t whichCounter, uint32_t event)
 Halt the running counter. More...
 
static void SCTIMER_SetupDmaTriggerAction (SCT_Type *base, uint32_t dmaNumber, uint32_t event)
 Generate a DMA request. More...
 
static void SCTIMER_SetCOUNTValue (SCT_Type *base, sctimer_counter_t whichCounter, uint32_t value)
 Set the value of counter. More...
 
static uint32_t SCTIMER_GetCOUNTValue (SCT_Type *base, sctimer_counter_t whichCounter)
 Get the value of counter. More...
 
static void SCTIMER_SetEventInState (SCT_Type *base, uint32_t event, uint32_t state)
 Set the state mask bit field of EV_STATE register. More...
 
static void SCTIMER_ClearEventInState (SCT_Type *base, uint32_t event, uint32_t state)
 Clear the state mask bit field of EV_STATE register. More...
 
static bool SCTIMER_GetEventInState (SCT_Type *base, uint32_t event, uint32_t state)
 Get the state mask bit field of EV_STATE register. More...
 
void SCTIMER_EventHandleIRQ (SCT_Type *base)
 SCTimer interrupt handler. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct sctimer_pwm_signal_param_t
+
+
+ + + + + + + + + + +

Data Fields

+sctimer_out_t output
 The output pin to use to generate the PWM signal.
 
sctimer_pwm_level_select_t level
 PWM output active level select. More...
 
uint8_t dutyCyclePercent
 PWM pulse width, value should be between 0 to 100 0 = always inactive signal (0% duty cycle) 100 = always active signal (100% duty cycle). More...
 
+

Field Documentation

+ +
+
+ + + + +
sctimer_pwm_level_select_t sctimer_pwm_signal_param_t::level
+
+ +
+
+ +
+
+ + + + +
uint8_t sctimer_pwm_signal_param_t::dutyCyclePercent
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct sctimer_config_t
+
+

This structure holds the configuration settings for the SCTimer peripheral. To initialize this structure to reasonable defaults, call the SCTMR_GetDefaultConfig() function and pass a pointer to the configuration structure instance.

+

The configuration structure can be made constant so as to reside in flash.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

bool enableCounterUnify
 true: SCT operates as a unified 32-bit counter; false: SCT operates as two 16-bit counters. More...
 
+sctimer_clock_mode_t clockMode
 SCT clock mode value.
 
+sctimer_clock_select_t clockSelect
 SCT clock select value.
 
+bool enableBidirection_l
 true: Up-down count mode for the L or unified counter false: Up count mode only for the L or unified counter
 
bool enableBidirection_h
 true: Up-down count mode for the H or unified counter false: Up count mode only for the H or unified counter. More...
 
+uint8_t prescale_l
 Prescale value to produce the L or unified counter clock.
 
uint8_t prescale_h
 Prescale value to produce the H counter clock. More...
 
+uint8_t outInitState
 Defines the initial output value.
 
uint8_t inputsync
 SCT INSYNC value, INSYNC field in the CONFIG register, from bit9 to bit 16. More...
 
+

Field Documentation

+ +
+
+ + + + +
bool sctimer_config_t::enableCounterUnify
+
+

User can use the 16-bit low counter and the 16-bit high counters at the same time; for Hardware limit, user can not use unified 32-bit counter and any 16-bit low/high counter at the same time.

+ +
+
+ +
+
+ + + + +
bool sctimer_config_t::enableBidirection_h
+
+

This field is used only if the enableCounterUnify is set to false

+ +
+
+ +
+
+ + + + +
uint8_t sctimer_config_t::prescale_h
+
+

This field is used only if the enableCounterUnify is set to false

+ +
+
+ +
+
+ + + + +
uint8_t sctimer_config_t::inputsync
+
+

it is used to define synchronization for input N: bit 9 = input 0 bit 10 = input 1 bit 11 = input 2 bit 12 = input 3 All other bits are reserved (bit13 ~bit 16). How User to set the the value for the member inputsync. IE: delay for input0, and input 1, bypasses for input 2 and input 3 MACRO definition in user level. #define INPUTSYNC0 (0U) #define INPUTSYNC1 (1U) #define INPUTSYNC2 (2U) #define INPUTSYNC3 (3U) User Code. sctimerInfo.inputsync = (1 << INPUTSYNC2) | (1 << INPUTSYNC3);

+ +
+
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef void(* sctimer_event_callback_t)(void)
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum sctimer_pwm_mode_t
+
+ + + +
Enumerator
kSCTIMER_EdgeAlignedPwm  +

Edge-aligned PWM.

+
kSCTIMER_CenterAlignedPwm  +

Center-aligned PWM.

+
+ +
+
+ +
+
+ + + + +
enum sctimer_counter_t
+
+ + + + +
Enumerator
kSCTIMER_Counter_L  +

16-bit Low counter.

+
kSCTIMER_Counter_H  +

16-bit High counter.

+
kSCTIMER_Counter_U  +

32-bit Unified counter.

+
+ +
+
+ +
+
+ + + + +
enum sctimer_input_t
+
+ + + + + + + + + +
Enumerator
kSCTIMER_Input_0  +

SCTIMER input 0.

+
kSCTIMER_Input_1  +

SCTIMER input 1.

+
kSCTIMER_Input_2  +

SCTIMER input 2.

+
kSCTIMER_Input_3  +

SCTIMER input 3.

+
kSCTIMER_Input_4  +

SCTIMER input 4.

+
kSCTIMER_Input_5  +

SCTIMER input 5.

+
kSCTIMER_Input_6  +

SCTIMER input 6.

+
kSCTIMER_Input_7  +

SCTIMER input 7.

+
+ +
+
+ +
+
+ + + + +
enum sctimer_out_t
+
+ + + + + + + + + + + +
Enumerator
kSCTIMER_Out_0  +

SCTIMER output 0.

+
kSCTIMER_Out_1  +

SCTIMER output 1.

+
kSCTIMER_Out_2  +

SCTIMER output 2.

+
kSCTIMER_Out_3  +

SCTIMER output 3.

+
kSCTIMER_Out_4  +

SCTIMER output 4.

+
kSCTIMER_Out_5  +

SCTIMER output 5.

+
kSCTIMER_Out_6  +

SCTIMER output 6.

+
kSCTIMER_Out_7  +

SCTIMER output 7.

+
kSCTIMER_Out_8  +

SCTIMER output 8.

+
kSCTIMER_Out_9  +

SCTIMER output 9.

+
+ +
+
+ +
+
+ + + + +
enum sctimer_pwm_level_select_t
+
+ + + +
Enumerator
kSCTIMER_LowTrue  +

Low true pulses.

+
kSCTIMER_HighTrue  +

High true pulses.

+
+ +
+
+ +
+
+ + + + +
enum sctimer_clock_mode_t
+
+ + + + + +
Enumerator
kSCTIMER_System_ClockMode  +

System Clock Mode.

+
kSCTIMER_Sampled_ClockMode  +

Sampled System Clock Mode.

+
kSCTIMER_Input_ClockMode  +

SCT Input Clock Mode.

+
kSCTIMER_Asynchronous_ClockMode  +

Asynchronous Mode.

+
+ +
+
+ +
+
+ + + + +
enum sctimer_clock_select_t
+
+ + + + + + + + + + + + + + + + + +
Enumerator
kSCTIMER_Clock_On_Rise_Input_0  +

Rising edges on input 0.

+
kSCTIMER_Clock_On_Fall_Input_0  +

Falling edges on input 0.

+
kSCTIMER_Clock_On_Rise_Input_1  +

Rising edges on input 1.

+
kSCTIMER_Clock_On_Fall_Input_1  +

Falling edges on input 1.

+
kSCTIMER_Clock_On_Rise_Input_2  +

Rising edges on input 2.

+
kSCTIMER_Clock_On_Fall_Input_2  +

Falling edges on input 2.

+
kSCTIMER_Clock_On_Rise_Input_3  +

Rising edges on input 3.

+
kSCTIMER_Clock_On_Fall_Input_3  +

Falling edges on input 3.

+
kSCTIMER_Clock_On_Rise_Input_4  +

Rising edges on input 4.

+
kSCTIMER_Clock_On_Fall_Input_4  +

Falling edges on input 4.

+
kSCTIMER_Clock_On_Rise_Input_5  +

Rising edges on input 5.

+
kSCTIMER_Clock_On_Fall_Input_5  +

Falling edges on input 5.

+
kSCTIMER_Clock_On_Rise_Input_6  +

Rising edges on input 6.

+
kSCTIMER_Clock_On_Fall_Input_6  +

Falling edges on input 6.

+
kSCTIMER_Clock_On_Rise_Input_7  +

Rising edges on input 7.

+
kSCTIMER_Clock_On_Fall_Input_7  +

Falling edges on input 7.

+
+ +
+
+ +
+
+

Specifies what action should be taken if multiple events dictate that a given output should be both set and cleared at the same time

+ + + + + +
Enumerator
kSCTIMER_ResolveNone  +

No change.

+
kSCTIMER_ResolveSet  +

Set output.

+
kSCTIMER_ResolveClear  +

Clear output.

+
kSCTIMER_ResolveToggle  +

Toggle output.

+
+ +
+
+ +
+
+ + + + +
Enumerator
kSCTIMER_ActiveIndependent  +

This event is triggered regardless of the count direction.

+
kSCTIMER_ActiveInCountUp  +

This event is triggered only during up-counting when BIDIR = 1.

+
kSCTIMER_ActiveInCountDown  +

This event is triggered only during down-counting when BIDIR = 1.

+
+ +
+
+ +
+
+ + + + +
enum sctimer_interrupt_enable_t
+
+ + + + + + + + + + + + + + +
Enumerator
kSCTIMER_Event0InterruptEnable  +

Event 0 interrupt.

+
kSCTIMER_Event1InterruptEnable  +

Event 1 interrupt.

+
kSCTIMER_Event2InterruptEnable  +

Event 2 interrupt.

+
kSCTIMER_Event3InterruptEnable  +

Event 3 interrupt.

+
kSCTIMER_Event4InterruptEnable  +

Event 4 interrupt.

+
kSCTIMER_Event5InterruptEnable  +

Event 5 interrupt.

+
kSCTIMER_Event6InterruptEnable  +

Event 6 interrupt.

+
kSCTIMER_Event7InterruptEnable  +

Event 7 interrupt.

+
kSCTIMER_Event8InterruptEnable  +

Event 8 interrupt.

+
kSCTIMER_Event9InterruptEnable  +

Event 9 interrupt.

+
kSCTIMER_Event10InterruptEnable  +

Event 10 interrupt.

+
kSCTIMER_Event11InterruptEnable  +

Event 11 interrupt.

+
kSCTIMER_Event12InterruptEnable  +

Event 12 interrupt.

+
+ +
+
+ +
+
+ + + + +
enum sctimer_status_flags_t
+
+ + + + + + + + + + + + + + + + +
Enumerator
kSCTIMER_Event0Flag  +

Event 0 Flag.

+
kSCTIMER_Event1Flag  +

Event 1 Flag.

+
kSCTIMER_Event2Flag  +

Event 2 Flag.

+
kSCTIMER_Event3Flag  +

Event 3 Flag.

+
kSCTIMER_Event4Flag  +

Event 4 Flag.

+
kSCTIMER_Event5Flag  +

Event 5 Flag.

+
kSCTIMER_Event6Flag  +

Event 6 Flag.

+
kSCTIMER_Event7Flag  +

Event 7 Flag.

+
kSCTIMER_Event8Flag  +

Event 8 Flag.

+
kSCTIMER_Event9Flag  +

Event 9 Flag.

+
kSCTIMER_Event10Flag  +

Event 10 Flag.

+
kSCTIMER_Event11Flag  +

Event 11 Flag.

+
kSCTIMER_Event12Flag  +

Event 12 Flag.

+
kSCTIMER_BusErrorLFlag  +

Bus error due to write when L counter was not halted.

+
kSCTIMER_BusErrorHFlag  +

Bus error due to write when H counter was not halted.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t SCTIMER_Init (SCT_Type * base,
const sctimer_config_tconfig 
)
+
+
Note
This API should be called at the beginning of the application using the SCTimer driver.
+
Parameters
+ + + +
baseSCTimer peripheral base address
configPointer to the user configuration structure.
+
+
+
Returns
kStatus_Success indicates success; Else indicates failure.
+ +
+
+ +
+
+ + + + + + + + +
void SCTIMER_Deinit (SCT_Type * base)
+
+
Parameters
+ + +
baseSCTimer peripheral base address
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SCTIMER_GetDefaultConfig (sctimer_config_tconfig)
+
+

The default values are:

+
* config->enableCounterUnify = true;
+
* config->clockMode = kSCTIMER_System_ClockMode;
+
* config->clockSelect = kSCTIMER_Clock_On_Rise_Input_0;
+
* config->enableBidirection_l = false;
+
* config->enableBidirection_h = false;
+
* config->prescale_l = 0U;
+
* config->prescale_h = 0U;
+
* config->outInitState = 0U;
+
* config->inputsync = 0xFU;
+
*
+
Parameters
+ + +
configPointer to the user configuration structure.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t SCTIMER_SetupPwm (SCT_Type * base,
const sctimer_pwm_signal_param_tpwmParams,
sctimer_pwm_mode_t mode,
uint32_t pwmFreq_Hz,
uint32_t srcClock_Hz,
uint32_t * event 
)
+
+

Call this function to configure the PWM signal period, mode, duty cycle, and edge. This function will create 2 events; one of the events will trigger on match with the pulse value and the other will trigger when the counter matches the PWM period. The PWM period event is also used as a limit event to reset the counter or change direction. Both events are enabled for the same state. The state number can be retrieved by calling the function SCTIMER_GetCurrentStateNumber(). The counter is set to operate as one 32-bit counter (unify bit is set to 1). The counter operates in bi-directional mode when generating a center-aligned PWM.

+
Note
When setting PWM output from multiple output pins, they all should use the same PWM mode i.e all PWM's should be either edge-aligned or center-aligned. When using this API, the PWM signal frequency of all the initialized channels must be the same. Otherwise all the initialized channels' PWM signal frequency is equal to the last call to the API's pwmFreq_Hz.
+
Parameters
+ + + + + + + +
baseSCTimer peripheral base address
pwmParamsPWM parameters to configure the output
modePWM operation mode, options available in enumeration sctimer_pwm_mode_t
pwmFreq_HzPWM signal frequency in Hz
srcClock_HzSCTimer counter clock in Hz
eventPointer to a variable where the PWM period event number is stored
+
+
+
Returns
kStatus_Success on success kStatus_Fail If we have hit the limit in terms of number of events created or if an incorrect PWM dutycylce is passed in.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void SCTIMER_UpdatePwmDutycycle (SCT_Type * base,
sctimer_out_t output,
uint8_t dutyCyclePercent,
uint32_t event 
)
+
+

Before calling this function, the counter is set to operate as one 32-bit counter (unify bit is set to 1).

+
Parameters
+ + + + + +
baseSCTimer peripheral base address
outputThe output to configure
dutyCyclePercentNew PWM pulse width; the value should be between 1 to 100
eventEvent number associated with this PWM signal. This was returned to the user by the function SCTIMER_SetupPwm().
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SCTIMER_EnableInterrupts (SCT_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSCTimer peripheral base address
maskThe interrupts to enable. This is a logical OR of members of the enumeration sctimer_interrupt_enable_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SCTIMER_DisableInterrupts (SCT_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSCTimer peripheral base address
maskThe interrupts to enable. This is a logical OR of members of the enumeration sctimer_interrupt_enable_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t SCTIMER_GetEnabledInterrupts (SCT_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseSCTimer peripheral base address
+
+
+
Returns
The enabled interrupts. This is the logical OR of members of the enumeration sctimer_interrupt_enable_t
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t SCTIMER_GetStatusFlags (SCT_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseSCTimer peripheral base address
+
+
+
Returns
The status flags. This is the logical OR of members of the enumeration sctimer_status_flags_t
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SCTIMER_ClearStatusFlags (SCT_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSCTimer peripheral base address
maskThe status flags to clear. This is a logical OR of members of the enumeration sctimer_status_flags_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SCTIMER_StartTimer (SCT_Type * base,
uint32_t countertoStart 
)
+
+inlinestatic
+
+
Note
In 16-bit mode, we can enable both Counter_L and Counter_H, In 32-bit mode, we only can select Counter_U.
+
Parameters
+ + + +
baseSCTimer peripheral base address
countertoStartThe SCTimer counters to enable. This is a logical OR of members of the enumeration sctimer_counter_t.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SCTIMER_StopTimer (SCT_Type * base,
uint32_t countertoStop 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSCTimer peripheral base address
countertoStopThe SCTimer counters to stop. This is a logical OR of members of the enumeration sctimer_counter_t.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t SCTIMER_CreateAndScheduleEvent (SCT_Type * base,
sctimer_event_t howToMonitor,
uint32_t matchValue,
uint32_t whichIO,
sctimer_counter_t whichCounter,
uint32_t * event 
)
+
+

This function will configure an event using the options provided by the user. If the event type uses the counter match, then the function will set the user provided match value into a match register and put this match register number into the event control register. The event is enabled for the current state and the event number is increased by one at the end. The function returns the event number; this event number can be used to configure actions to be done when this event is triggered.

+
Parameters
+ + + + + + + +
baseSCTimer peripheral base address
howToMonitorEvent type; options are available in the enumeration sctimer_interrupt_enable_t
matchValueThe match value that will be programmed to a match register
whichIOThe input or output that will be involved in event triggering. This field is ignored if the event type is "match only"
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
eventPointer to a variable where the new event number is stored
+
+
+
Returns
kStatus_Success on success kStatus_Error if we have hit the limit in terms of number of events created or if we have reached the limit in terms of number of match registers
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SCTIMER_ScheduleEvent (SCT_Type * base,
uint32_t event 
)
+
+

This function will allow the event passed in to trigger in the current state. The event must be created earlier by either calling the function SCTIMER_SetupPwm() or function SCTIMER_CreateAndScheduleEvent() .

+
Parameters
+ + + +
baseSCTimer peripheral base address
eventEvent number to enable in the current state
+
+
+ +
+
+ +
+
+ + + + + + + + +
status_t SCTIMER_IncreaseState (SCT_Type * base)
+
+

All future events created by calling the function SCTIMER_ScheduleEvent() will be enabled in this new state.

+
Parameters
+ + +
baseSCTimer peripheral base address
+
+
+
Returns
kStatus_Success on success kStatus_Error if we have hit the limit in terms of states used
+ +
+
+ +
+
+ + + + + + + + +
uint32_t SCTIMER_GetCurrentState (SCT_Type * base)
+
+

User can use this to set the next state by calling the function SCTIMER_SetupNextStateAction().

+
Parameters
+ + +
baseSCTimer peripheral base address
+
+
+
Returns
The current state
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetCounterState (SCT_Type * base,
sctimer_counter_t whichCounter,
uint32_t state 
)
+
+inlinestatic
+
+

The function is to set the state variable bit field of STATE register. Writing to the STATE_L, STATE_H, or unified register is only allowed when the corresponding counter is halted (HALT bits are set to 1 in the CTRL register).

+
Parameters
+ + + + +
baseSCTimer peripheral base address
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
stateThe counter current state number (only support range from 0~31).
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint16_t SCTIMER_GetCounterState (SCT_Type * base,
sctimer_counter_t whichCounter 
)
+
+inlinestatic
+
+

The function is to get the state variable bit field of STATE register.

+
Parameters
+ + + +
baseSCTimer peripheral base address
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
+
+
+
Returns
The the counter current state value.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t SCTIMER_SetupCaptureAction (SCT_Type * base,
sctimer_counter_t whichCounter,
uint32_t * captureRegister,
uint32_t event 
)
+
+
Parameters
+ + + + + +
baseSCTimer peripheral base address
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
captureRegisterPointer to a variable where the capture register number will be returned. User can read the captured value from this register when the specified event is triggered.
eventEvent number that will trigger the capture
+
+
+
Returns
kStatus_Success on success kStatus_Error if we have hit the limit in terms of number of match/capture registers available
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SCTIMER_SetCallback (SCT_Type * base,
sctimer_event_callback_t callback,
uint32_t event 
)
+
+

If the interrupt for the event is enabled by the user, then a callback can be registered which will be invoked when the event is triggered

+
Parameters
+ + + + +
baseSCTimer peripheral base address
eventEvent number that will trigger the interrupt
callbackFunction to invoke when the event is triggered
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupStateLdMethodAction (SCT_Type * base,
uint32_t event,
bool fgLoad 
)
+
+inlinestatic
+
+

Change the load method of transition, it will be triggered by the event number that is passed in by the user.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
eventEvent number that will change the method to trigger the state transition
fgLoadThe method to load highest-numbered event occurring for that state to the STATE register.
    +
  • true: Load the STATEV value to STATE when the event occurs to be the next state.
  • +
  • false: Add the STATEV value to STATE when the event occurs to be the next state.
  • +
+
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupNextStateActionwithLdMethod (SCT_Type * base,
uint32_t nextState,
uint32_t event,
bool fgLoad 
)
+
+inlinestatic
+
+

This transition will be triggered by the event number that is passed in by the user, the method decide how to load the highest-numbered event occurring for that state to the STATE register.

+
Parameters
+ + + + + +
baseSCTimer peripheral base address
nextStateThe next state SCTimer will transition to
eventEvent number that will trigger the state transition
fgLoadThe method to load the highest-numbered event occurring for that state to the STATE register.
    +
  • true: Load the STATEV value to STATE when the event occurs to be the next state.
  • +
  • false: Add the STATEV value to STATE when the event occurs to be the next state.
  • +
+
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupNextStateAction (SCT_Type * base,
uint32_t nextState,
uint32_t event 
)
+
+inlinestatic
+
+
Deprecated:
Do not use this function. It has been superceded by SCTIMER_SetupNextStateActionwithLdMethod
+

This transition will be triggered by the event number that is passed in by the user.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
nextStateThe next state SCTimer will transition to
eventEvent number that will trigger the state transition
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupEventActiveDirection (SCT_Type * base,
sctimer_event_active_direction_t activeDirection,
uint32_t event 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseSCTimer peripheral base address
activeDirectionEvent generation active direction, see sctimer_event_active_direction_t.
eventEvent number that need setup the active direction.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupOutputSetAction (SCT_Type * base,
uint32_t whichIO,
uint32_t event 
)
+
+inlinestatic
+
+

This output will be set when the event number that is passed in by the user is triggered.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
whichIOThe output to set
eventEvent number that will trigger the output change
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupOutputClearAction (SCT_Type * base,
uint32_t whichIO,
uint32_t event 
)
+
+inlinestatic
+
+

This output will be cleared when the event number that is passed in by the user is triggered.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
whichIOThe output to clear
eventEvent number that will trigger the output change
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SCTIMER_SetupOutputToggleAction (SCT_Type * base,
uint32_t whichIO,
uint32_t event 
)
+
+

This change in the output level is triggered by the event number that is passed in by the user.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
whichIOThe output to toggle
eventEvent number that will trigger the output change
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupCounterLimitAction (SCT_Type * base,
sctimer_counter_t whichCounter,
uint32_t event 
)
+
+inlinestatic
+
+

The counter is limited when the event number that is passed in by the user is triggered.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
eventEvent number that will trigger the counter to be limited
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupCounterStopAction (SCT_Type * base,
sctimer_counter_t whichCounter,
uint32_t event 
)
+
+inlinestatic
+
+

The counter is stopped when the event number that is passed in by the user is triggered.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
eventEvent number that will trigger the counter to be stopped
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupCounterStartAction (SCT_Type * base,
sctimer_counter_t whichCounter,
uint32_t event 
)
+
+inlinestatic
+
+

The counter will re-start when the event number that is passed in by the user is triggered.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
eventEvent number that will trigger the counter to re-start
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupCounterHaltAction (SCT_Type * base,
sctimer_counter_t whichCounter,
uint32_t event 
)
+
+inlinestatic
+
+

The counter is disabled (halted) when the event number that is passed in by the user is triggered. When the counter is halted, all further events are disabled. The HALT condition can only be removed by calling the SCTIMER_StartTimer() function.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
eventEvent number that will trigger the counter to be halted
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetupDmaTriggerAction (SCT_Type * base,
uint32_t dmaNumber,
uint32_t event 
)
+
+inlinestatic
+
+

DMA request will be triggered by the event number that is passed in by the user.

+
Parameters
+ + + + +
baseSCTimer peripheral base address
dmaNumberThe DMA request to generate
eventEvent number that will trigger the DMA request
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetCOUNTValue (SCT_Type * base,
sctimer_counter_t whichCounter,
uint32_t value 
)
+
+inlinestatic
+
+

The function is to set the value of Count register, Writing to the COUNT_L, COUNT_H, or unified register is only allowed when the corresponding counter is halted (HALT bits are set to 1 in the CTRL register).

+
Parameters
+ + + + +
baseSCTimer peripheral base address
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
valuethe counter value update to the COUNT register.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint32_t SCTIMER_GetCOUNTValue (SCT_Type * base,
sctimer_counter_t whichCounter 
)
+
+inlinestatic
+
+

The function is to read the value of Count register, software can read the counter registers at any time..

+
Parameters
+ + + +
baseSCTimer peripheral base address
whichCounterSCTimer counter to use. In 16-bit mode, we can select Counter_L and Counter_H, In 32-bit mode, we can select Counter_U.
+
+
+
Returns
The value of counter selected.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_SetEventInState (SCT_Type * base,
uint32_t event,
uint32_t state 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseSCTimer peripheral base address
eventThe EV_STATE register be set.
stateThe state value in which the event is enabled to occur.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void SCTIMER_ClearEventInState (SCT_Type * base,
uint32_t event,
uint32_t state 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
baseSCTimer peripheral base address
eventThe EV_STATE register be clear.
stateThe state value in which the event is disabled to occur.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static bool SCTIMER_GetEventInState (SCT_Type * base,
uint32_t event,
uint32_t state 
)
+
+inlinestatic
+
+
Note
This function is to check whether the event is enabled in a specific state.
+
Parameters
+ + + + +
baseSCTimer peripheral base address
eventThe EV_STATE register be read.
stateThe state value.
+
+
+
Returns
The the state mask bit field of EV_STATE register.
    +
  • true: The event is enable in state.
  • +
  • false: The event is disable in state.
  • +
+
+ +
+
+ +
+
+ + + + + + + + +
void SCTIMER_EventHandleIRQ (SCT_Type * base)
+
+
Parameters
+ + +
baseSCTimer peripheral base address.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00021.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00021.js new file mode 100644 index 0000000..8716512 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00021.js @@ -0,0 +1,162 @@ +var a00021 = +[ + [ "sctimer_pwm_signal_param_t", "a00021.html#a00132", [ + [ "output", "a00021.html#ae030d75078255fd25e577c14d0a0fc80", null ], + [ "level", "a00021.html#a8734c80f138c70349b10e6204d8db899", null ], + [ "dutyCyclePercent", "a00021.html#a17414a2d234412e960c98e4c8e4df853", null ] + ] ], + [ "sctimer_config_t", "a00021.html#a00131", [ + [ "enableCounterUnify", "a00021.html#a6caacf7ae4f800be829c32ed87cd6149", null ], + [ "clockMode", "a00021.html#aaba4aecfe1173c11bb8d77a8f9913196", null ], + [ "clockSelect", "a00021.html#ad5d7a18f1b860f5fa7d0800d8e464127", null ], + [ "enableBidirection_l", "a00021.html#aafc09c3595776bc668daf3e303802f31", null ], + [ "enableBidirection_h", "a00021.html#a347a741944d1f294a11fc0f19cfbbc53", null ], + [ "prescale_l", "a00021.html#aad4f208b7074a27d1a085471bd00cd0a", null ], + [ "prescale_h", "a00021.html#aaa1765ca5c51528130a6dc9dd06f2e7a", null ], + [ "outInitState", "a00021.html#a3897b3b9321e3cecb05972fa68f947d5", null ], + [ "inputsync", "a00021.html#acd66f85232dafe6feeea4d80400aba69", null ] + ] ], + [ "FSL_SCTIMER_DRIVER_VERSION", "a00021.html#ga3d7deebbb8cb3899c51bbef999113fdf", null ], + [ "sctimer_event_callback_t", "a00021.html#ga9522e37a144ad51ffb1f5d035f1b4489", null ], + [ "sctimer_pwm_mode_t", "a00021.html#ga76b1c419363e09d4861880f25f63979d", [ + [ "kSCTIMER_EdgeAlignedPwm", "a00021.html#gga76b1c419363e09d4861880f25f63979da539c00805f4706a43e2669dfa7477dd8", null ], + [ "kSCTIMER_CenterAlignedPwm", "a00021.html#gga76b1c419363e09d4861880f25f63979dac28f3ae947c63c4fc3663be7d1f7b4e3", null ] + ] ], + [ "sctimer_counter_t", "a00021.html#ga8df83543fac389c6e3b212d58695f034", [ + [ "kSCTIMER_Counter_L", "a00021.html#gga8df83543fac389c6e3b212d58695f034a2c17be417f1566b1c17ab1cdb972baf8", null ], + [ "kSCTIMER_Counter_H", "a00021.html#gga8df83543fac389c6e3b212d58695f034abac8d502657e6390b3669508a7a7d78b", null ], + [ "kSCTIMER_Counter_U", "a00021.html#gga8df83543fac389c6e3b212d58695f034a80cdf46efb087f2a0141a1fce8b2b542", null ] + ] ], + [ "sctimer_input_t", "a00021.html#ga3d2e093dbbecb8a0afc56bda69b8fa7e", [ + [ "kSCTIMER_Input_0", "a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eadd689832261eb7eb862ce1c61bc4e96a", null ], + [ "kSCTIMER_Input_1", "a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea427af509d16424c3e38e21c0607300d7", null ], + [ "kSCTIMER_Input_2", "a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea9091ff1c081ba955c12f63ec235fa41e", null ], + [ "kSCTIMER_Input_3", "a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eac45f2918497b441dc42cb33c99afdcd1", null ], + [ "kSCTIMER_Input_4", "a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eab8df54085f974d38e28ff80ea5ad65d0", null ], + [ "kSCTIMER_Input_5", "a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea3ec92530953ea9991a65511e64654d50", null ], + [ "kSCTIMER_Input_6", "a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea0598dcf5a25edbcc3f89bfc4f453a162", null ], + [ "kSCTIMER_Input_7", "a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea2c1d0356e7346f0d3f1a949dc56b7f10", null ] + ] ], + [ "sctimer_out_t", "a00021.html#ga2befef3e54e22f0624ddb1b016f10148", [ + [ "kSCTIMER_Out_0", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148adbdf0a5eebc74a8b01eefcc9b3ee742d", null ], + [ "kSCTIMER_Out_1", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148a9b869b11ddd20543bab111f9f2699e18", null ], + [ "kSCTIMER_Out_2", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148a3a54a6d9baa60d52779a918ed739a8d5", null ], + [ "kSCTIMER_Out_3", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148a1b8265e43a813ba11c8f4661032b2c45", null ], + [ "kSCTIMER_Out_4", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148aa14ad02f33740bac23837ad10a2188ae", null ], + [ "kSCTIMER_Out_5", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148a03be657454ab843d23408d0d20331511", null ], + [ "kSCTIMER_Out_6", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148af73ef40ea423cc2cd1314f82914054d9", null ], + [ "kSCTIMER_Out_7", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148af02eafb670d82545874712b82416c712", null ], + [ "kSCTIMER_Out_8", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148a4834fd8709ba8054330fb42b65962509", null ], + [ "kSCTIMER_Out_9", "a00021.html#gga2befef3e54e22f0624ddb1b016f10148a1c7af66a2d15e4af71cfd6a8c2ae27a5", null ] + ] ], + [ "sctimer_pwm_level_select_t", "a00021.html#ga7d63d84ecccc4074e40c6754a8754065", [ + [ "kSCTIMER_LowTrue", "a00021.html#gga7d63d84ecccc4074e40c6754a8754065a0c47623cf782903261d17cd642ad9d5e", null ], + [ "kSCTIMER_HighTrue", "a00021.html#gga7d63d84ecccc4074e40c6754a8754065ad16871f918d603d6f919d54760e262e2", null ] + ] ], + [ "sctimer_clock_mode_t", "a00021.html#ga270f5ad1462133d7b88ce71be4913a1d", [ + [ "kSCTIMER_System_ClockMode", "a00021.html#gga270f5ad1462133d7b88ce71be4913a1daa9c40afb4f671696c5122560bd16834b", null ], + [ "kSCTIMER_Sampled_ClockMode", "a00021.html#gga270f5ad1462133d7b88ce71be4913a1da182c8930fa55f2c4a7ff7cf27f272ec6", null ], + [ "kSCTIMER_Input_ClockMode", "a00021.html#gga270f5ad1462133d7b88ce71be4913a1daaedca7a090600aa41fd7f9e6aa756e8f", null ], + [ "kSCTIMER_Asynchronous_ClockMode", "a00021.html#gga270f5ad1462133d7b88ce71be4913a1da3923db642ad5f6b9aa2f9206b69cc9b5", null ] + ] ], + [ "sctimer_clock_select_t", "a00021.html#ga82141464913b976a7c2aab50cf17c701", [ + [ "kSCTIMER_Clock_On_Rise_Input_0", "a00021.html#gga82141464913b976a7c2aab50cf17c701aeac5b3a91a6789ebc29e22a63223e562", null ], + [ "kSCTIMER_Clock_On_Fall_Input_0", "a00021.html#gga82141464913b976a7c2aab50cf17c701a81bb8457aeaaa05c1de014a1092f3682", null ], + [ "kSCTIMER_Clock_On_Rise_Input_1", "a00021.html#gga82141464913b976a7c2aab50cf17c701a14833c030e7be5e1d46d379bee0763e2", null ], + [ "kSCTIMER_Clock_On_Fall_Input_1", "a00021.html#gga82141464913b976a7c2aab50cf17c701a37959b0234e735a51a76fc94a6ea2838", null ], + [ "kSCTIMER_Clock_On_Rise_Input_2", "a00021.html#gga82141464913b976a7c2aab50cf17c701acfec39ecd9ed389a70c5af0aadd8d245", null ], + [ "kSCTIMER_Clock_On_Fall_Input_2", "a00021.html#gga82141464913b976a7c2aab50cf17c701a65d71ef841bb11fc06c4a84cd35fe354", null ], + [ "kSCTIMER_Clock_On_Rise_Input_3", "a00021.html#gga82141464913b976a7c2aab50cf17c701a2d49ffdfaa5c023b81800f9bc7145599", null ], + [ "kSCTIMER_Clock_On_Fall_Input_3", "a00021.html#gga82141464913b976a7c2aab50cf17c701ad95c6b5bf373afdaa115ac4d4b33c907", null ], + [ "kSCTIMER_Clock_On_Rise_Input_4", "a00021.html#gga82141464913b976a7c2aab50cf17c701a8d5a9b6b6028b4dcd8c6032bebefa468", null ], + [ "kSCTIMER_Clock_On_Fall_Input_4", "a00021.html#gga82141464913b976a7c2aab50cf17c701a90910b145c4b6be6207e787a33edfe90", null ], + [ "kSCTIMER_Clock_On_Rise_Input_5", "a00021.html#gga82141464913b976a7c2aab50cf17c701a76459f5f7aeb37929840ac706ccba0c1", null ], + [ "kSCTIMER_Clock_On_Fall_Input_5", "a00021.html#gga82141464913b976a7c2aab50cf17c701aef4bb8b33c1f2cbd38d93f3ae8dcf59d", null ], + [ "kSCTIMER_Clock_On_Rise_Input_6", "a00021.html#gga82141464913b976a7c2aab50cf17c701a22397185b3e3a49c3ab6de5f22b55126", null ], + [ "kSCTIMER_Clock_On_Fall_Input_6", "a00021.html#gga82141464913b976a7c2aab50cf17c701a1cac2ebda704fdec8b75b9fa9caf460e", null ], + [ "kSCTIMER_Clock_On_Rise_Input_7", "a00021.html#gga82141464913b976a7c2aab50cf17c701a5298152c01e0d4e9def85bbe99ecad83", null ], + [ "kSCTIMER_Clock_On_Fall_Input_7", "a00021.html#gga82141464913b976a7c2aab50cf17c701a64d321fa474f3c4f7accbbe3fb48ce97", null ] + ] ], + [ "sctimer_conflict_resolution_t", "a00021.html#ga64666471cadaed6ad2e72ce19026aed8", [ + [ "kSCTIMER_ResolveNone", "a00021.html#gga64666471cadaed6ad2e72ce19026aed8a7e0f6590af780c201400de534fbded84", null ], + [ "kSCTIMER_ResolveSet", "a00021.html#gga64666471cadaed6ad2e72ce19026aed8a53aa676af8b05ec58f3d723ea6b85611", null ], + [ "kSCTIMER_ResolveClear", "a00021.html#gga64666471cadaed6ad2e72ce19026aed8afebc15b93617ff1873bf6bd170fbfe25", null ], + [ "kSCTIMER_ResolveToggle", "a00021.html#gga64666471cadaed6ad2e72ce19026aed8a66ca25f70e36c4286f63529dc14d19b2", null ] + ] ], + [ "sctimer_event_active_direction_t", "a00021.html#gadc0dc8518742a3345ea042eae821dc85", [ + [ "kSCTIMER_ActiveIndependent", "a00021.html#ggadc0dc8518742a3345ea042eae821dc85a1ce9766251a3384d8eb28804fd518034", null ], + [ "kSCTIMER_ActiveInCountUp", "a00021.html#ggadc0dc8518742a3345ea042eae821dc85a878f4d9e6aa0348da58c4b8807e6eb19", null ], + [ "kSCTIMER_ActiveInCountDown", "a00021.html#ggadc0dc8518742a3345ea042eae821dc85a6a33db1b011c4dcf63bcc2759dd1c474", null ] + ] ], + [ "sctimer_event_t", "a00021.html#ga8d902ebc4b569d71c88754a49ccf0650", null ], + [ "sctimer_interrupt_enable_t", "a00021.html#gaf1007b13bbe43ea28ee33acdc7f5f986", [ + [ "kSCTIMER_Event0InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a7d9204dc6fea5991f442e6a96531055e", null ], + [ "kSCTIMER_Event1InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a35b278ed11503e27ceda405448d43704", null ], + [ "kSCTIMER_Event2InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a3733720f1b361ee41e5b7d71c7c08974", null ], + [ "kSCTIMER_Event3InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a0a98b0964c6e46c490e78f02f3198f07", null ], + [ "kSCTIMER_Event4InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a1cbfebe70908eb5e706e627500c2ce8d", null ], + [ "kSCTIMER_Event5InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a306f7c719eeabe666789bb7d0ed8d175", null ], + [ "kSCTIMER_Event6InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986afff05c432d290f058588e7f6372030b1", null ], + [ "kSCTIMER_Event7InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a5923446a599ede3c2f5d787683bcaa70", null ], + [ "kSCTIMER_Event8InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a0267e2748c8e6c0ae37588d85346af5b", null ], + [ "kSCTIMER_Event9InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a3617b5ccaab15786e80fb1ff9acbbf94", null ], + [ "kSCTIMER_Event10InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a313da28338d9c25f9a5de1e150fdb44e", null ], + [ "kSCTIMER_Event11InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a10627d03a81cfa9bb66dc453ecbbb7c3", null ], + [ "kSCTIMER_Event12InterruptEnable", "a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a237e390a2de0d3fa877e3f820718d14e", null ] + ] ], + [ "sctimer_status_flags_t", "a00021.html#ga9100974cdbb1542385a983b75b2f0d45", [ + [ "kSCTIMER_Event0Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a23338b52b7a3eb5bf4e0cdf6b854c9f4", null ], + [ "kSCTIMER_Event1Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45ad07c79a564df84171acdd2f9acd1ee32", null ], + [ "kSCTIMER_Event2Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a5738f1fc819177c4377068dcf09dd39d", null ], + [ "kSCTIMER_Event3Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45ad4b1b9a6e2ba1ca55c536407df2802d4", null ], + [ "kSCTIMER_Event4Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a1034b068f1139df001c04fa1c95b5531", null ], + [ "kSCTIMER_Event5Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45ae91e9c2221c6840f6b6d106a796b6eb3", null ], + [ "kSCTIMER_Event6Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a5a8064efce400813ba04b0a3aca7c2bb", null ], + [ "kSCTIMER_Event7Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45ac6d970ec7b05b2141b48c9eb09bf23f2", null ], + [ "kSCTIMER_Event8Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a490a6fdf7a05436e8d7958002e5d48b5", null ], + [ "kSCTIMER_Event9Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a19ed3a5f0d87b7c42919ed74ea6630ac", null ], + [ "kSCTIMER_Event10Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a99b06fad336b34b1485c6a1a2c634a75", null ], + [ "kSCTIMER_Event11Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a07c275c4c55dfe959c222b51557aab25", null ], + [ "kSCTIMER_Event12Flag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a3deb3b17762b595a399bbc32efbe8753", null ], + [ "kSCTIMER_BusErrorLFlag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a9c4db1ffc833a6eedc6a56a7fee85742", null ], + [ "kSCTIMER_BusErrorHFlag", "a00021.html#gga9100974cdbb1542385a983b75b2f0d45a9a5e7b8190bf25a0695f3b3d54c39bee", null ] + ] ], + [ "SCTIMER_Init", "a00021.html#ga44111f6438ee9d11f5c3b26e3c049e47", null ], + [ "SCTIMER_Deinit", "a00021.html#ga467e692ef9a508c75d2dff4d3bb3587e", null ], + [ "SCTIMER_GetDefaultConfig", "a00021.html#ga926706158370867f6a1827af9899c5e4", null ], + [ "SCTIMER_SetupPwm", "a00021.html#ga8f372273782f269956227b810e56a844", null ], + [ "SCTIMER_UpdatePwmDutycycle", "a00021.html#ga745f5f328599202df06a81b6fe307b63", null ], + [ "SCTIMER_EnableInterrupts", "a00021.html#ga484ff3205b735b4e24655920dd48a85a", null ], + [ "SCTIMER_DisableInterrupts", "a00021.html#ga5f89a72162bac80f840b04445bcbfa70", null ], + [ "SCTIMER_GetEnabledInterrupts", "a00021.html#gab5d439e5c8778b29945a228e9bbc62ea", null ], + [ "SCTIMER_GetStatusFlags", "a00021.html#ga880638c2ffe076f868b5d5c8dc480630", null ], + [ "SCTIMER_ClearStatusFlags", "a00021.html#gab1c0cd81deb689171e374d4291588624", null ], + [ "SCTIMER_StartTimer", "a00021.html#gac025765188aa53661325d324569b739c", null ], + [ "SCTIMER_StopTimer", "a00021.html#ga3ba946707276c23d531ebd3e21d67427", null ], + [ "SCTIMER_CreateAndScheduleEvent", "a00021.html#ga2fc1121a0f6dd3f5bc822516f85f096c", null ], + [ "SCTIMER_ScheduleEvent", "a00021.html#ga54f3ea55cf8cab5a78e26a522536d2fe", null ], + [ "SCTIMER_IncreaseState", "a00021.html#ga211359f9ee3b67eaa96d73b23ce1650d", null ], + [ "SCTIMER_GetCurrentState", "a00021.html#ga7548cb37efdba143e5c312f7b4461cf7", null ], + [ "SCTIMER_SetCounterState", "a00021.html#ga17cec8d7f62c6f80bb516febc654d37d", null ], + [ "SCTIMER_GetCounterState", "a00021.html#ga99d4a6ea09ccf78fae7c3dec39dff28b", null ], + [ "SCTIMER_SetupCaptureAction", "a00021.html#ga6217a77dba0bc787acde88eabbe4ba55", null ], + [ "SCTIMER_SetCallback", "a00021.html#ga9b685c1dd4fbc33496d5e6445c4d08c7", null ], + [ "SCTIMER_SetupStateLdMethodAction", "a00021.html#gafdf6317a3faf2068d9ce8f0a8082203c", null ], + [ "SCTIMER_SetupNextStateActionwithLdMethod", "a00021.html#gaf926083b406d26456d2fabf2bfd55a39", null ], + [ "SCTIMER_SetupNextStateAction", "a00021.html#ga2645513f40654fdc1812a8990e5f894b", null ], + [ "SCTIMER_SetupEventActiveDirection", "a00021.html#ga22c2cd3dff04d7771f94401fb841446e", null ], + [ "SCTIMER_SetupOutputSetAction", "a00021.html#ga22353e32ba4fb216277824ce940ad786", null ], + [ "SCTIMER_SetupOutputClearAction", "a00021.html#ga231084960a5fa1f5bf67ee5e5bc9dead", null ], + [ "SCTIMER_SetupOutputToggleAction", "a00021.html#gae6074aeaf3d4004a721d91c50f6a74ad", null ], + [ "SCTIMER_SetupCounterLimitAction", "a00021.html#gac1e1011a301cf83283996490249a596b", null ], + [ "SCTIMER_SetupCounterStopAction", "a00021.html#gab2412179ebab1d913976b250290ca06d", null ], + [ "SCTIMER_SetupCounterStartAction", "a00021.html#gabd997ff4aff2c1b1a2c763596db93c6c", null ], + [ "SCTIMER_SetupCounterHaltAction", "a00021.html#gaca74f1feb997dc028a4143a9c84f5a2c", null ], + [ "SCTIMER_SetupDmaTriggerAction", "a00021.html#ga48cc738532c4d5c86c423547f79da554", null ], + [ "SCTIMER_SetCOUNTValue", "a00021.html#gabde2ce6ca0f22c9210f145d6493f3f5c", null ], + [ "SCTIMER_GetCOUNTValue", "a00021.html#ga87a03f50c6f03e0302fa79cd5cbad644", null ], + [ "SCTIMER_SetEventInState", "a00021.html#ga8a95c3455d06a5be07c07c787699b2f9", null ], + [ "SCTIMER_ClearEventInState", "a00021.html#gabb782f507653f2afc07c2464a7cc1a13", null ], + [ "SCTIMER_GetEventInState", "a00021.html#ga0fe5c5cf3afe091395e5d13de17e4bf5", null ], + [ "SCTIMER_EventHandleIRQ", "a00021.html#ga265b0765ff1337a4d13328351b3cebdc", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00022.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00022.html new file mode 100644 index 0000000..d4f6200 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00022.html @@ -0,0 +1,2141 @@ + + + + + + +MCUXpresso SDK API Reference Manual: SPI Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ + +
+

Overview

+

This section describes the programming interface of the SPI driver.

+ + + + +

+Files

file  fsl_spi.h
 
+ + + + + + + + + + + + + + + + +

+Data Structures

struct  spi_delay_config_t
 SPI delay time configure structure. More...
 
struct  spi_master_config_t
 SPI master user configure structure. More...
 
struct  spi_slave_config_t
 SPI slave user configure structure. More...
 
struct  spi_transfer_t
 SPI transfer structure. More...
 
struct  spi_master_handle_t
 SPI transfer handle structure. More...
 
+ + + + + + + +

+Macros

#define SPI_DUMMYDATA   (0xFFFFU)
 SPI dummy transfer data, the data is sent while txBuff is NULL. More...
 
#define SPI_RETRY_TIMES   0U /* Define to zero means keep waiting until the flag is assert/deassert. */
 Retry times for waiting flag. More...
 
+ + + + + + + + + + +

+Typedefs

+typedef spi_master_handle_t spi_slave_handle_t
 Slave handle type.
 
+typedef void(* spi_master_callback_t )(SPI_Type *base, spi_master_handle_t *handle, status_t status, void *userData)
 SPI master callback for finished transmit.
 
+typedef void(* spi_slave_callback_t )(SPI_Type *base, spi_slave_handle_t *handle, status_t status, void *userData)
 SPI slave callback for finished transmit.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  _spi_xfer_option {
+  kSPI_EndOfFrame = (SPI_TXDATCTL_EOF_MASK), +
+  kSPI_EndOfTransfer = (SPI_TXDATCTL_EOT_MASK), +
+  kSPI_ReceiveIgnore = (SPI_TXDATCTL_RXIGNORE_MASK) +
+ }
 SPI transfer option. More...
 
enum  spi_shift_direction_t {
+  kSPI_MsbFirst = 0U, +
+  kSPI_LsbFirst = 1U +
+ }
 SPI data shifter direction options. More...
 
enum  spi_clock_polarity_t {
+  kSPI_ClockPolarityActiveHigh = 0x0U, +
+  kSPI_ClockPolarityActiveLow = 0x1U +
+ }
 SPI clock polarity configuration. More...
 
enum  spi_clock_phase_t {
+  kSPI_ClockPhaseFirstEdge = 0x0U, +
+  kSPI_ClockPhaseSecondEdge = 0x1U +
+ }
 SPI clock phase configuration. More...
 
enum  spi_ssel_t { kSPI_Ssel0Assert = (int)(~SPI_TXDATCTL_TXSSEL0_N_MASK) + }
 Slave select. More...
 
enum  spi_spol_t
 ssel polarity
 
enum  spi_data_width_t {
+  kSPI_Data4Bits = 3, +
+  kSPI_Data5Bits = 4, +
+  kSPI_Data6Bits = 5, +
+  kSPI_Data7Bits = 6, +
+  kSPI_Data8Bits = 7, +
+  kSPI_Data9Bits = 8, +
+  kSPI_Data10Bits = 9, +
+  kSPI_Data11Bits = 10, +
+  kSPI_Data12Bits = 11, +
+  kSPI_Data13Bits = 12, +
+  kSPI_Data14Bits = 13, +
+  kSPI_Data15Bits = 14, +
+  kSPI_Data16Bits = 15 +
+ }
 Transfer data width. More...
 
enum  {
+  kStatus_SPI_Busy = MAKE_STATUS(kStatusGroup_LPC_MINISPI, 0), +
+  kStatus_SPI_Idle = MAKE_STATUS(kStatusGroup_LPC_MINISPI, 1), +
+  kStatus_SPI_Error = MAKE_STATUS(kStatusGroup_LPC_MINISPI, 2), +
+  kStatus_SPI_BaudrateNotSupport, +
+  kStatus_SPI_Timeout = MAKE_STATUS(kStatusGroup_LPC_MINISPI, 4) +
+ }
 SPI transfer status. More...
 
enum  _spi_interrupt_enable {
+  kSPI_RxReadyInterruptEnable = SPI_INTENSET_RXRDYEN_MASK, +
+  kSPI_TxReadyInterruptEnable = SPI_INTENSET_TXRDYEN_MASK, +
+  kSPI_RxOverrunInterruptEnable = SPI_INTENSET_RXOVEN_MASK, +
+  kSPI_TxUnderrunInterruptEnable = SPI_INTENSET_TXUREN_MASK, +
+  kSPI_SlaveSelectAssertInterruptEnable = SPI_INTENSET_SSAEN_MASK, +
+  kSPI_SlaveSelectDeassertInterruptEnable = SPI_INTENSET_SSDEN_MASK +
+ }
 SPI interrupt sources. More...
 
enum  _spi_status_flags {
+  kSPI_RxReadyFlag = SPI_STAT_RXRDY_MASK, +
+  kSPI_TxReadyFlag = SPI_STAT_TXRDY_MASK, +
+  kSPI_RxOverrunFlag = SPI_STAT_RXOV_MASK, +
+  kSPI_TxUnderrunFlag = SPI_STAT_TXUR_MASK, +
+  kSPI_SlaveSelectAssertFlag = SPI_STAT_SSA_MASK, +
+  kSPI_SlaveSelectDeassertFlag = SPI_STAT_SSD_MASK, +
+  kSPI_StallFlag = SPI_STAT_STALLED_MASK, +
+  kSPI_EndTransferFlag = SPI_STAT_ENDTRANSFER_MASK, +
+  kSPI_MasterIdleFlag = SPI_STAT_MSTIDLE_MASK +
+ }
 SPI status flags. More...
 
+ + + + +

+Functions

uint32_t SPI_GetInstance (SPI_Type *base)
 Returns instance number for SPI peripheral base address. More...
 
+ + + + +

+Driver version

#define FSL_SPI_DRIVER_VERSION   (MAKE_VERSION(2, 0, 4))
 SPI driver version. More...
 
+ + + + + + + + + + + + + + + + + + + +

+Initialization and deinitialization

void SPI_MasterGetDefaultConfig (spi_master_config_t *config)
 Sets the SPI master configuration structure to default values. More...
 
status_t SPI_MasterInit (SPI_Type *base, const spi_master_config_t *config, uint32_t srcClock_Hz)
 Initializes the SPI with master configuration. More...
 
void SPI_SlaveGetDefaultConfig (spi_slave_config_t *config)
 Sets the SPI slave configuration structure to default values. More...
 
status_t SPI_SlaveInit (SPI_Type *base, const spi_slave_config_t *config)
 Initializes the SPI with slave configuration. More...
 
void SPI_Deinit (SPI_Type *base)
 De-initializes the SPI. More...
 
static void SPI_Enable (SPI_Type *base, bool enable)
 Enable or disable the SPI Master or Slave. More...
 
+ + + + + + + +

+Status

static uint32_t SPI_GetStatusFlags (SPI_Type *base)
 Gets the status flag. More...
 
static void SPI_ClearStatusFlags (SPI_Type *base, uint32_t mask)
 Clear the status flag. More...
 
+ + + + + + + +

+Interrupts

static void SPI_EnableInterrupts (SPI_Type *base, uint32_t irqs)
 Enables the interrupt for the SPI. More...
 
static void SPI_DisableInterrupts (SPI_Type *base, uint32_t irqs)
 Disables the interrupt for the SPI. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Bus Operations

static bool SPI_IsMaster (SPI_Type *base)
 Returns whether the SPI module is in master mode. More...
 
status_t SPI_MasterSetBaudRate (SPI_Type *base, uint32_t baudrate_Bps, uint32_t srcClock_Hz)
 Sets the baud rate for SPI transfer. More...
 
static void SPI_WriteData (SPI_Type *base, uint16_t data)
 Writes a data into the SPI data register directly. More...
 
static void SPI_WriteConfigFlags (SPI_Type *base, uint32_t configFlags)
 Writes a data into the SPI TXCTL register directly. More...
 
void SPI_WriteDataWithConfigFlags (SPI_Type *base, uint16_t data, uint32_t configFlags)
 Writes a data control info and data into the SPI TX register directly. More...
 
static uint32_t SPI_ReadData (SPI_Type *base)
 Gets a data from the SPI data register. More...
 
void SPI_SetTransferDelay (SPI_Type *base, const spi_delay_config_t *config)
 Set delay time for transfer. More...
 
void SPI_SetDummyData (SPI_Type *base, uint16_t dummyData)
 Set up the dummy data. More...
 
status_t SPI_MasterTransferBlocking (SPI_Type *base, spi_transfer_t *xfer)
 Transfers a block of data using a polling method. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Transactional

status_t SPI_MasterTransferCreateHandle (SPI_Type *base, spi_master_handle_t *handle, spi_master_callback_t callback, void *userData)
 Initializes the SPI master handle. More...
 
status_t SPI_MasterTransferNonBlocking (SPI_Type *base, spi_master_handle_t *handle, spi_transfer_t *xfer)
 Performs a non-blocking SPI interrupt transfer. More...
 
status_t SPI_MasterTransferGetCount (SPI_Type *base, spi_master_handle_t *handle, size_t *count)
 Gets the master transfer count. More...
 
void SPI_MasterTransferAbort (SPI_Type *base, spi_master_handle_t *handle)
 SPI master aborts a transfer using an interrupt. More...
 
void SPI_MasterTransferHandleIRQ (SPI_Type *base, spi_master_handle_t *handle)
 Interrupts the handler for the SPI. More...
 
status_t SPI_SlaveTransferCreateHandle (SPI_Type *base, spi_slave_handle_t *handle, spi_slave_callback_t callback, void *userData)
 Initializes the SPI slave handle. More...
 
status_t SPI_SlaveTransferNonBlocking (SPI_Type *base, spi_slave_handle_t *handle, spi_transfer_t *xfer)
 Performs a non-blocking SPI slave interrupt transfer. More...
 
static status_t SPI_SlaveTransferGetCount (SPI_Type *base, spi_slave_handle_t *handle, size_t *count)
 Gets the slave transfer count. More...
 
static void SPI_SlaveTransferAbort (SPI_Type *base, spi_slave_handle_t *handle)
 SPI slave aborts a transfer using an interrupt. More...
 
void SPI_SlaveTransferHandleIRQ (SPI_Type *base, spi_slave_handle_t *handle)
 Interrupts a handler for the SPI slave. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct spi_delay_config_t
+
+
+ + + + + + + + + + + + + +

Data Fields

uint8_t preDelay
 Delay between SSEL assertion and the beginning of transfer. More...
 
uint8_t postDelay
 Delay between the end of transfer and SSEL deassertion. More...
 
uint8_t frameDelay
 Delay between frame to frame. More...
 
uint8_t transferDelay
 Delay between transfer to transfer. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint8_t spi_delay_config_t::preDelay
+
+ +
+
+ +
+
+ + + + +
uint8_t spi_delay_config_t::postDelay
+
+ +
+
+ +
+
+ + + + +
uint8_t spi_delay_config_t::frameDelay
+
+ +
+
+ +
+
+ + + + +
uint8_t spi_delay_config_t::transferDelay
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct spi_master_config_t
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+bool enableLoopback
 Enable loopback for test purpose.
 
+bool enableMaster
 Enable SPI at initialization time.
 
+uint32_t baudRate_Bps
 Baud Rate for SPI in Hz.
 
+spi_clock_polarity_t clockPolarity
 Clock polarity.
 
+spi_clock_phase_t clockPhase
 Clock phase.
 
+spi_shift_direction_t direction
 MSB or LSB.
 
+uint8_t dataWidth
 Width of the data.
 
+spi_ssel_t sselNumber
 Slave select number.
 
+spi_spol_t sselPolarity
 Configure active CS polarity.
 
spi_delay_config_t delayConfig
 Configure for delay time. More...
 
+

Field Documentation

+ +
+
+ + + + +
spi_delay_config_t spi_master_config_t::delayConfig
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct spi_slave_config_t
+
+
+ + + + + + + + + + + + + + + + + + + +

Data Fields

+bool enableSlave
 Enable SPI at initialization time.
 
+spi_clock_polarity_t clockPolarity
 Clock polarity.
 
+spi_clock_phase_t clockPhase
 Clock phase.
 
+spi_shift_direction_t direction
 MSB or LSB.
 
+uint8_t dataWidth
 Width of the data.
 
+spi_spol_t sselPolarity
 Configure active CS polarity.
 
+ +
+
+ +
+
+ + + + +
struct spi_transfer_t
+
+
+ + + + + + + + + + + + + +

Data Fields

+uint8_t * txData
 Send buffer.
 
+uint8_t * rxData
 Receive buffer.
 
+size_t dataSize
 Transfer bytes.
 
uint32_t configFlags
 Additional option to control transfer _spi_xfer_option. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint32_t spi_transfer_t::configFlags
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct _spi_master_handle
+
+

Master handle type.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+uint8_t *volatile txData
 Transfer buffer.
 
+uint8_t *volatile rxData
 Receive buffer.
 
+volatile size_t txRemainingBytes
 Number of data to be transmitted [in bytes].
 
+volatile size_t rxRemainingBytes
 Number of data to be received [in bytes].
 
+size_t totalByteCount
 A number of transfer bytes.
 
+volatile uint32_t state
 SPI internal state.
 
+spi_master_callback_t callback
 SPI callback.
 
+void * userData
 Callback parameter.
 
+uint8_t dataWidth
 Width of the data [Valid values: 1 to 16].
 
uint32_t lastCommand
 Last command for transfer. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint32_t spi_master_handle_t::lastCommand
+
+ +
+
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_SPI_DRIVER_VERSION   (MAKE_VERSION(2, 0, 4))
+
+ +
+
+ +
+
+ + + + +
#define SPI_DUMMYDATA   (0xFFFFU)
+
+ +
+
+ +
+
+ + + + +
#define SPI_RETRY_TIMES   0U /* Define to zero means keep waiting until the flag is assert/deassert. */
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum _spi_xfer_option
+
+ + + + +
Enumerator
kSPI_EndOfFrame  +

Data is treated as the end of a frame.

+
kSPI_EndOfTransfer  +

Data is treated as the end of a transfer.

+
kSPI_ReceiveIgnore  +

Ignore the receive data.

+
+ +
+
+ +
+
+ + + + +
enum spi_shift_direction_t
+
+ + + +
Enumerator
kSPI_MsbFirst  +

Data transfers start with most significant bit.

+
kSPI_LsbFirst  +

Data transfers start with least significant bit.

+
+ +
+
+ +
+
+ + + + +
enum spi_clock_polarity_t
+
+ + + +
Enumerator
kSPI_ClockPolarityActiveHigh  +

Active-high SPI clock (idles low).

+
kSPI_ClockPolarityActiveLow  +

Active-low SPI clock (idles high).

+
+ +
+
+ +
+
+ + + + +
enum spi_clock_phase_t
+
+ + + +
Enumerator
kSPI_ClockPhaseFirstEdge  +

First edge on SCK occurs at the middle of the first cycle of a data transfer.

+
kSPI_ClockPhaseSecondEdge  +

First edge on SCK occurs at the start of the first cycle of a data transfer.

+
+ +
+
+ +
+
+ + + + +
enum spi_ssel_t
+
+ + +
Enumerator
kSPI_Ssel0Assert  +

Slave select 0.

+
+ +
+
+ +
+
+ + + + +
enum spi_data_width_t
+
+ + + + + + + + + + + + + + +
Enumerator
kSPI_Data4Bits  +

4 bits data width

+
kSPI_Data5Bits  +

5 bits data width

+
kSPI_Data6Bits  +

6 bits data width

+
kSPI_Data7Bits  +

7 bits data width

+
kSPI_Data8Bits  +

8 bits data width

+
kSPI_Data9Bits  +

9 bits data width

+
kSPI_Data10Bits  +

10 bits data width

+
kSPI_Data11Bits  +

11 bits data width

+
kSPI_Data12Bits  +

12 bits data width

+
kSPI_Data13Bits  +

13 bits data width

+
kSPI_Data14Bits  +

14 bits data width

+
kSPI_Data15Bits  +

15 bits data width

+
kSPI_Data16Bits  +

16 bits data width

+
+ +
+
+ +
+
+ + + + +
anonymous enum
+
+ + + + + + +
Enumerator
kStatus_SPI_Busy  +

SPI bus is busy.

+
kStatus_SPI_Idle  +

SPI is idle.

+
kStatus_SPI_Error  +

SPI error.

+
kStatus_SPI_BaudrateNotSupport  +

Baudrate is not support in current clock source.

+
kStatus_SPI_Timeout  +

SPI Timeout polling status flags.

+
+ +
+
+ +
+
+ + + + +
enum _spi_interrupt_enable
+
+ + + + + + + +
Enumerator
kSPI_RxReadyInterruptEnable  +

Rx ready interrupt.

+
kSPI_TxReadyInterruptEnable  +

Tx ready interrupt.

+
kSPI_RxOverrunInterruptEnable  +

Rx overrun interrupt.

+
kSPI_TxUnderrunInterruptEnable  +

Tx underrun interrupt.

+
kSPI_SlaveSelectAssertInterruptEnable  +

Slave select assert interrupt.

+
kSPI_SlaveSelectDeassertInterruptEnable  +

Slave select deassert interrupt.

+
+ +
+
+ +
+
+ + + + +
enum _spi_status_flags
+
+ + + + + + + + + + +
Enumerator
kSPI_RxReadyFlag  +

Receive ready flag.

+
kSPI_TxReadyFlag  +

Transmit ready flag.

+
kSPI_RxOverrunFlag  +

Receive overrun flag.

+
kSPI_TxUnderrunFlag  +

Transmit underrun flag.

+
kSPI_SlaveSelectAssertFlag  +

Slave select assert flag.

+
kSPI_SlaveSelectDeassertFlag  +

slave select deassert flag.

+
kSPI_StallFlag  +

Stall flag.

+
kSPI_EndTransferFlag  +

End transfer bit.

+
kSPI_MasterIdleFlag  +

Master in idle status flag.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
uint32_t SPI_GetInstance (SPI_Type * base)
+
+ +
+
+ +
+
+ + + + + + + + +
void SPI_MasterGetDefaultConfig (spi_master_config_tconfig)
+
+

The purpose of this API is to get the configuration structure initialized for use in SPI_MasterInit(). User may use the initialized structure unchanged in SPI_MasterInit(), or modify some fields of the structure before calling SPI_MasterInit(). After calling this API, the master is ready to transfer. Example:

+
Parameters
+ + +
configpointer to master config structure
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t SPI_MasterInit (SPI_Type * base,
const spi_master_config_tconfig,
uint32_t srcClock_Hz 
)
+
+

The configuration structure can be filled by user from scratch, or be set with default values by SPI_MasterGetDefaultConfig(). After calling this API, the slave is ready to transfer. Example

+
+
.baudRate_Bps = 500000,
+
...
+
};
+
SPI_MasterInit(SPI0, &config);
+
Parameters
+ + + + +
baseSPI base pointer
configpointer to master configuration structure
srcClock_HzSource clock frequency.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SPI_SlaveGetDefaultConfig (spi_slave_config_tconfig)
+
+

The purpose of this API is to get the configuration structure initialized for use in SPI_SlaveInit(). Modify some fields of the structure before calling SPI_SlaveInit(). Example:

+
Parameters
+ + +
configpointer to slave configuration structure
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t SPI_SlaveInit (SPI_Type * base,
const spi_slave_config_tconfig 
)
+
+

The configuration structure can be filled by user from scratch or be set with default values by SPI_SlaveGetDefaultConfig(). After calling this API, the slave is ready to transfer. Example

+
+ + +
.direction = kSPI_MsbFirst;
+
...
+
};
+
SPI_SlaveInit(SPI0, &config);
+
Parameters
+ + + +
baseSPI base pointer
configpointer to slave configuration structure
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SPI_Deinit (SPI_Type * base)
+
+

Calling this API resets the SPI module, gates the SPI clock. Disable the fifo if enabled. The SPI module can't work unless calling the SPI_MasterInit/SPI_SlaveInit to initialize module.

+
Parameters
+ + +
baseSPI base pointer
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SPI_Enable (SPI_Type * base,
bool enable 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSPI base pointer
enableor disable ( true = enable, false = disable)
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t SPI_GetStatusFlags (SPI_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseSPI base pointer
+
+
+
Returns
SPI Status, use status flag to AND _spi_status_flags could get the related status.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SPI_ClearStatusFlags (SPI_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSPI base pointer
maskSPI Status, use status flag to AND _spi_status_flags could get the related status.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SPI_EnableInterrupts (SPI_Type * base,
uint32_t irqs 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSPI base pointer
irqsSPI interrupt source. The parameter can be any combination of the following values:
    +
  • kSPI_RxReadyInterruptEnable
  • +
  • kSPI_TxReadyInterruptEnable
  • +
+
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SPI_DisableInterrupts (SPI_Type * base,
uint32_t irqs 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSPI base pointer
irqsSPI interrupt source. The parameter can be any combination of the following values:
    +
  • kSPI_RxReadyInterruptEnable
  • +
  • kSPI_TxReadyInterruptEnable
  • +
+
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static bool SPI_IsMaster (SPI_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseSPI peripheral address.
+
+
+
Returns
Returns true if the module is in master mode or false if the module is in slave mode.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t SPI_MasterSetBaudRate (SPI_Type * base,
uint32_t baudrate_Bps,
uint32_t srcClock_Hz 
)
+
+

This is only used in master.

+
Parameters
+ + + + +
baseSPI base pointer
baudrate_Bpsbaud rate needed in Hz.
srcClock_HzSPI source clock frequency in Hz.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SPI_WriteData (SPI_Type * base,
uint16_t data 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSPI base pointer
dataneeds to be write.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SPI_WriteConfigFlags (SPI_Type * base,
uint32_t configFlags 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseSPI base pointer
configFlagscontrol command needs to be written.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SPI_WriteDataWithConfigFlags (SPI_Type * base,
uint16_t data,
uint32_t configFlags 
)
+
+
Parameters
+ + + + +
baseSPI base pointer
datavalue needs to be written.
configFlagscontrol command needs to be written.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t SPI_ReadData (SPI_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseSPI base pointer
+
+
+
Returns
Data in the register.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SPI_SetTransferDelay (SPI_Type * base,
const spi_delay_config_tconfig 
)
+
+
   the delay uint is SPI clock time, maximum value is 0xF.
+
Parameters
+ + + +
baseSPI base pointer
configconfiguration for delay option spi_delay_config_t.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SPI_SetDummyData (SPI_Type * base,
uint16_t dummyData 
)
+
+

This API can change the default data to be transferred when users set the tx buffer to NULL.

+
Parameters
+ + + +
baseSPI peripheral address.
dummyDataData to be transferred when tx buffer is NULL.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t SPI_MasterTransferBlocking (SPI_Type * base,
spi_transfer_txfer 
)
+
+
Parameters
+ + + +
baseSPI base pointer
xferpointer to spi_xfer_config_t structure
+
+
+
Return values
+ + + + +
kStatus_SuccessSuccessfully start a transfer.
kStatus_InvalidArgumentInput argument is invalid.
kStatus_SPI_TimeoutThe transfer timed out and was aborted.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t SPI_MasterTransferCreateHandle (SPI_Type * base,
spi_master_handle_t * handle,
spi_master_callback_t callback,
void * userData 
)
+
+

This function initializes the SPI master handle which can be used for other SPI master transactional APIs. Usually, for a specified SPI instance, call this API once to get the initialized handle.

+
Parameters
+ + + + + +
baseSPI peripheral base address.
handleSPI handle pointer.
callbackCallback function.
userDataUser data.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t SPI_MasterTransferNonBlocking (SPI_Type * base,
spi_master_handle_t * handle,
spi_transfer_txfer 
)
+
+
Parameters
+ + + + +
baseSPI peripheral base address.
handlepointer to spi_master_handle_t structure which stores the transfer state
xferpointer to spi_xfer_config_t structure
+
+
+
Return values
+ + + + +
kStatus_SuccessSuccessfully start a transfer.
kStatus_InvalidArgumentInput argument is invalid.
kStatus_SPI_BusySPI is not idle, is running another transfer.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t SPI_MasterTransferGetCount (SPI_Type * base,
spi_master_handle_t * handle,
size_t * count 
)
+
+

This function gets the master transfer count.

+
Parameters
+ + + + +
baseSPI peripheral base address.
handlePointer to the spi_master_handle_t structure which stores the transfer state.
countThe number of bytes transferred by using the non-blocking transaction.
+
+
+
Returns
status of status_t.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SPI_MasterTransferAbort (SPI_Type * base,
spi_master_handle_t * handle 
)
+
+

This function aborts a transfer using an interrupt.

+
Parameters
+ + + +
baseSPI peripheral base address.
handlePointer to the spi_master_handle_t structure which stores the transfer state.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SPI_MasterTransferHandleIRQ (SPI_Type * base,
spi_master_handle_t * handle 
)
+
+
Parameters
+ + + +
baseSPI peripheral base address.
handlepointer to spi_master_handle_t structure which stores the transfer state.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t SPI_SlaveTransferCreateHandle (SPI_Type * base,
spi_slave_handle_thandle,
spi_slave_callback_t callback,
void * userData 
)
+
+

This function initializes the SPI slave handle which can be used for other SPI slave transactional APIs. Usually, for a specified SPI instance, call this API once to get the initialized handle.

+
Parameters
+ + + + + +
baseSPI peripheral base address.
handleSPI handle pointer.
callbackCallback function.
userDataUser data.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t SPI_SlaveTransferNonBlocking (SPI_Type * base,
spi_slave_handle_thandle,
spi_transfer_txfer 
)
+
+
Note
The API returns immediately after the transfer initialization is finished.
+
Parameters
+ + + + +
baseSPI peripheral base address.
handlepointer to spi_master_handle_t structure which stores the transfer state
xferpointer to spi_xfer_config_t structure
+
+
+
Return values
+ + + + +
kStatus_SuccessSuccessfully start a transfer.
kStatus_InvalidArgumentInput argument is invalid.
kStatus_SPI_BusySPI is not idle, is running another transfer.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static status_t SPI_SlaveTransferGetCount (SPI_Type * base,
spi_slave_handle_thandle,
size_t * count 
)
+
+inlinestatic
+
+

This function gets the slave transfer count.

+
Parameters
+ + + + +
baseSPI peripheral base address.
handlePointer to the spi_master_handle_t structure which stores the transfer state.
countThe number of bytes transferred by using the non-blocking transaction.
+
+
+
Returns
status of status_t.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void SPI_SlaveTransferAbort (SPI_Type * base,
spi_slave_handle_thandle 
)
+
+inlinestatic
+
+

This function aborts a transfer using an interrupt.

+
Parameters
+ + + +
baseSPI peripheral base address.
handlePointer to the spi_slave_handle_t structure which stores the transfer state.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SPI_SlaveTransferHandleIRQ (SPI_Type * base,
spi_slave_handle_thandle 
)
+
+
Parameters
+ + + +
baseSPI peripheral base address.
handlepointer to spi_slave_handle_t structure which stores the transfer state
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00022.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00022.js new file mode 100644 index 0000000..9c8daa9 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00022.js @@ -0,0 +1,143 @@ +var a00022 = +[ + [ "spi_delay_config_t", "a00022.html#a00133", [ + [ "preDelay", "a00022.html#a24a2584817f03d1ace0a6cecc718bc09", null ], + [ "postDelay", "a00022.html#a960b87887e431dabbb5641109cb56d90", null ], + [ "frameDelay", "a00022.html#a9609e5c510bf5d0c120a403ed40aed42", null ], + [ "transferDelay", "a00022.html#a7ea0733fc746e2bafe1c0999db7d4804", null ] + ] ], + [ "spi_master_config_t", "a00022.html#a00134", [ + [ "enableLoopback", "a00022.html#a384bc00ef4cd5b4e9cb6a4d48ec336bd", null ], + [ "enableMaster", "a00022.html#aa033bd20cfbb1a14f0fd43f4b31bb27e", null ], + [ "baudRate_Bps", "a00022.html#ae7695987e044d80983fd98a43812b1ea", null ], + [ "clockPolarity", "a00022.html#a780c1f03e9670a2c38068a7bd49d4f13", null ], + [ "clockPhase", "a00022.html#a7fbed6c387c99764c4f405fc7d9761ee", null ], + [ "direction", "a00022.html#aace9261acfad8526f3d5b0b59346629a", null ], + [ "dataWidth", "a00022.html#a018402d4d181b482376a878b38db740f", null ], + [ "sselNumber", "a00022.html#af889de97327eb44641d8acc1f509d074", null ], + [ "sselPolarity", "a00022.html#ab514b4866ee539808abd92a75ca8be51", null ], + [ "delayConfig", "a00022.html#a787477e7b0ae7833dcbdb1c85fef361c", null ] + ] ], + [ "spi_slave_config_t", "a00022.html#a00135", [ + [ "enableSlave", "a00022.html#a9fcd3fae6d886c7dfd0c3fd4cd51e6fe", null ], + [ "clockPolarity", "a00022.html#afd5bb71a7dc1908cb8a1860564601a45", null ], + [ "clockPhase", "a00022.html#a56c657f64c2e26fe7dd772c1a77efb9e", null ], + [ "direction", "a00022.html#ad4eb458a0c1a0c0934eec53d71b78ffb", null ], + [ "dataWidth", "a00022.html#adc19252b2493f3f9d12f029e57908ce5", null ], + [ "sselPolarity", "a00022.html#a0d0bceaaae2e5bae690fb2c3289f48f6", null ] + ] ], + [ "spi_transfer_t", "a00022.html#a00136", [ + [ "txData", "a00022.html#addc4f20760a1a62c4d20cdf9443f3af3", null ], + [ "rxData", "a00022.html#a28b878b99d5ec790b5c8f3bafe140da0", null ], + [ "dataSize", "a00022.html#ae003337c9398e5f5e3189f5b2ba6335b", null ], + [ "configFlags", "a00022.html#a582eea734badd0049c98ea3cf89b3e4b", null ] + ] ], + [ "spi_master_handle_t", "a00022.html#a00104", [ + [ "txData", "a00022.html#a6cb4626f6b63c70fa21fe2e3338dc915", null ], + [ "rxData", "a00022.html#a69f260bde2e1728233f835a148b2f51b", null ], + [ "txRemainingBytes", "a00022.html#a62fa101ddfc970e7b6bcba0b2eb6b869", null ], + [ "rxRemainingBytes", "a00022.html#a23b2531ea36b53e42cd6b2a3780d3017", null ], + [ "totalByteCount", "a00022.html#a4e19f9299f123f181536c6bd4456e50a", null ], + [ "state", "a00022.html#ae7933252a37be998d127217f34f6fd16", null ], + [ "callback", "a00022.html#a445e70d437c917e6af1b4037bdbb6a3f", null ], + [ "userData", "a00022.html#ab8d01b85149d749ab1c748bb5116b90e", null ], + [ "dataWidth", "a00022.html#a11b51e4d88d3f8d9137a13ce301ed46c", null ], + [ "lastCommand", "a00022.html#a4e66b572aa792a179028af5340bc83cb", null ] + ] ], + [ "FSL_SPI_DRIVER_VERSION", "a00022.html#gaeb6046de02dffe9248de71332fac246e", null ], + [ "SPI_DUMMYDATA", "a00022.html#ga1541129ba8262e1649592b5109e2074c", null ], + [ "SPI_RETRY_TIMES", "a00022.html#gaa4717c15ca9604c505a5e5c60df29ebe", null ], + [ "spi_slave_handle_t", "a00022.html#gad267cfee3a876b2860217ff94f03f574", null ], + [ "spi_master_callback_t", "a00022.html#gae9bd140aeb645efab6c7552b3994e01a", null ], + [ "spi_slave_callback_t", "a00022.html#ga86b45b85e036adc762eed5bcd2a0491d", null ], + [ "_spi_xfer_option", "a00022.html#gaaa2e2f2efa7be228c775fa239ab5ea03", [ + [ "kSPI_EndOfFrame", "a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a3bc0d76da8f97613467566dc39bee3b4", null ], + [ "kSPI_EndOfTransfer", "a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a857a31be854542eafecfea1484ad38b5", null ], + [ "kSPI_ReceiveIgnore", "a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a2616295b1939805764ffb815876b9eea", null ] + ] ], + [ "spi_shift_direction_t", "a00022.html#gaa68518c16202382c2e1f1c7c66a9d53d", [ + [ "kSPI_MsbFirst", "a00022.html#ggaa68518c16202382c2e1f1c7c66a9d53dae7b997e8cff761aab865cbd42c4c3989", null ], + [ "kSPI_LsbFirst", "a00022.html#ggaa68518c16202382c2e1f1c7c66a9d53da20ac53684c3e1ad338553cecbfab94a9", null ] + ] ], + [ "spi_clock_polarity_t", "a00022.html#ga3e5a7cd043c9596779bc23b34cb3d1f9", [ + [ "kSPI_ClockPolarityActiveHigh", "a00022.html#gga3e5a7cd043c9596779bc23b34cb3d1f9a031c0ee2693cf1fd621e8b8cba676629", null ], + [ "kSPI_ClockPolarityActiveLow", "a00022.html#gga3e5a7cd043c9596779bc23b34cb3d1f9acfc8257079c9604086622df6de326aea", null ] + ] ], + [ "spi_clock_phase_t", "a00022.html#ga9ad313685ade497f5cbcb71c74a1b4dc", [ + [ "kSPI_ClockPhaseFirstEdge", "a00022.html#gga9ad313685ade497f5cbcb71c74a1b4dcad15d61c6fd642f13101edbf401d0c72e", null ], + [ "kSPI_ClockPhaseSecondEdge", "a00022.html#gga9ad313685ade497f5cbcb71c74a1b4dca18a98985c1f7dd56175e4a2724db3675", null ] + ] ], + [ "spi_ssel_t", "a00022.html#ga420a3d3f841957068648585b89fa66d1", [ + [ "kSPI_Ssel0Assert", "a00022.html#gga420a3d3f841957068648585b89fa66d1af64655214a47d11f960f633b1478b117", null ] + ] ], + [ "spi_spol_t", "a00022.html#gafd7e7bd8e060742346806ed8c8f1db4c", null ], + [ "spi_data_width_t", "a00022.html#gafa691c5329a7325ee57c9f06fa295731", [ + [ "kSPI_Data4Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731a0cb8b30c67c53c6d53712d5bacc818ce", null ], + [ "kSPI_Data5Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731a7232b4afb5bd82503252ce608638e6eb", null ], + [ "kSPI_Data6Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731a6604fcf5c8bebf904c5b072295027bba", null ], + [ "kSPI_Data7Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731a2c62d3d7d92866c97bb513d4e603518e", null ], + [ "kSPI_Data8Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad6b98474a7f14ae7665b7b6d3355657c", null ], + [ "kSPI_Data9Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731a4b864a74545165c2cf2dd74134fdadd1", null ], + [ "kSPI_Data10Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731a2b2887663c9d025a4137263fc7984024", null ], + [ "kSPI_Data11Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731a91e908a7a4725ab9df05549a2b034dec", null ], + [ "kSPI_Data12Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad1cfe18fd912c0d25dc32e6ca9fa8f97", null ], + [ "kSPI_Data13Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad8c2fa2e2f5bf137176dc736cc6a2531", null ], + [ "kSPI_Data14Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731ae83435f494d1b9f3ce2f2da0ac03fc38", null ], + [ "kSPI_Data15Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731add11012a8887066fad29e23c20d66af8", null ], + [ "kSPI_Data16Bits", "a00022.html#ggafa691c5329a7325ee57c9f06fa295731abbc2566ba4eb2b5e5dc259a7c4f80bcf", null ], + [ "kStatus_SPI_Busy", "a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da703abdf7900047c4d13536480f3463ab", null ], + [ "kStatus_SPI_Idle", "a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da4e32c5b06dccaf4b81e2fd1679e1b560", null ], + [ "kStatus_SPI_Error", "a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da2ff91d774e93aed936b87ffaa18aaf9e", null ], + [ "kStatus_SPI_BaudrateNotSupport", "a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2dab0f4d4de5f92524c9d33524f22a04e03", null ], + [ "kStatus_SPI_Timeout", "a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da496ced6fffc33d7bbeb01d203dfc4836", null ] + ] ], + [ "_spi_interrupt_enable", "a00022.html#gaedd690a0f91a0a9eb0fd573b57e31f67", [ + [ "kSPI_RxReadyInterruptEnable", "a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ac8d5eef4469ce888d4b2fb3c3b4fb215", null ], + [ "kSPI_TxReadyInterruptEnable", "a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a0ec3e79b793d213ed30f74a338437129", null ], + [ "kSPI_RxOverrunInterruptEnable", "a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a4acd737132f9c3cbd8cac500767289e5", null ], + [ "kSPI_TxUnderrunInterruptEnable", "a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ad1f9b1e8b5209604a0eca8750f2876ad", null ], + [ "kSPI_SlaveSelectAssertInterruptEnable", "a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ad1de0c0c42c7a707e305edbd3fde88b7", null ], + [ "kSPI_SlaveSelectDeassertInterruptEnable", "a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a8f55948795fa8d256b5b6e520a95f145", null ] + ] ], + [ "_spi_status_flags", "a00022.html#ga17a846c851b3b17e6a1564a5fab48e09", [ + [ "kSPI_RxReadyFlag", "a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a76b9aac1ff3856afdcb4eebdb3be9094", null ], + [ "kSPI_TxReadyFlag", "a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a3f796180c934ef3b688530986a844fe5", null ], + [ "kSPI_RxOverrunFlag", "a00022.html#gga17a846c851b3b17e6a1564a5fab48e09ae281d12263ce63ef7c964f8564bea473", null ], + [ "kSPI_TxUnderrunFlag", "a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a4be82e1306daa139870673c30de9e238", null ], + [ "kSPI_SlaveSelectAssertFlag", "a00022.html#gga17a846c851b3b17e6a1564a5fab48e09ab25cacb436c5e32113bd98c1ae151641", null ], + [ "kSPI_SlaveSelectDeassertFlag", "a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a1f153042fdb9681e7bd435c4cb9bd7c5", null ], + [ "kSPI_StallFlag", "a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a214bc23d48bafcc89241530e55195f76", null ], + [ "kSPI_EndTransferFlag", "a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a4f52f3d130ab947331e668c7856d8551", null ], + [ "kSPI_MasterIdleFlag", "a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a03ba57874691d230ad0f657cf01a7978", null ] + ] ], + [ "SPI_GetInstance", "a00022.html#gad823d00c394f6ca35c391dc178a25334", null ], + [ "SPI_MasterGetDefaultConfig", "a00022.html#ga45c08fc078ae334b79fb844379140838", null ], + [ "SPI_MasterInit", "a00022.html#gab36e8463576abeded221a1e5a1eec01c", null ], + [ "SPI_SlaveGetDefaultConfig", "a00022.html#gac000b63ed033f57a9eee342a8c8e67f2", null ], + [ "SPI_SlaveInit", "a00022.html#gae40850ce14ba74ea75b3eef79beecf8a", null ], + [ "SPI_Deinit", "a00022.html#gaac0bc2b87ea2eb7eeba78d9449d4dbbf", null ], + [ "SPI_Enable", "a00022.html#ga6d32506242b9596989efbbb2d030e997", null ], + [ "SPI_GetStatusFlags", "a00022.html#ga9e7412ad45aeb7f620fe34559034ad2e", null ], + [ "SPI_ClearStatusFlags", "a00022.html#ga794c7435fa108012df54bb6294f20505", null ], + [ "SPI_EnableInterrupts", "a00022.html#gab87ea500d8f74369882afe52a81d1199", null ], + [ "SPI_DisableInterrupts", "a00022.html#ga6289b192b135592b7b0996c05422be4d", null ], + [ "SPI_IsMaster", "a00022.html#ga97782e786464ec2de946bd42e63aefbc", null ], + [ "SPI_MasterSetBaudRate", "a00022.html#ga3ad4747ccc31c142c54af5639cd49328", null ], + [ "SPI_WriteData", "a00022.html#ga92c1bd47d2ad7b45fc138fccb4bc1ace", null ], + [ "SPI_WriteConfigFlags", "a00022.html#ga709b0d176b737a8009221565f3ae19e6", null ], + [ "SPI_WriteDataWithConfigFlags", "a00022.html#gad3810513c85cb28f1dbf18b15614a09d", null ], + [ "SPI_ReadData", "a00022.html#ga08dec9d9d6abf910589a591f1cc52f58", null ], + [ "SPI_SetTransferDelay", "a00022.html#gad4071c9fc158109945e724872f4760b6", null ], + [ "SPI_SetDummyData", "a00022.html#gac75808445b18f687387bea02892a5246", null ], + [ "SPI_MasterTransferBlocking", "a00022.html#ga5b05095245ecf01258e64cc0458fb2e9", null ], + [ "SPI_MasterTransferCreateHandle", "a00022.html#gad0d8eaa132d8c882d8a42286ecfbab64", null ], + [ "SPI_MasterTransferNonBlocking", "a00022.html#ga820c78a32fa29735168d2e517f4881a1", null ], + [ "SPI_MasterTransferGetCount", "a00022.html#gabde0dccfb0783d103b9cf57e0202582f", null ], + [ "SPI_MasterTransferAbort", "a00022.html#gae90962a54978acf05ca7780489301eb4", null ], + [ "SPI_MasterTransferHandleIRQ", "a00022.html#ga645d041a92bde312d6cf64517c618c41", null ], + [ "SPI_SlaveTransferCreateHandle", "a00022.html#ga7c6a9ac8e0e410684970f3169404bafd", null ], + [ "SPI_SlaveTransferNonBlocking", "a00022.html#ga93765aa3b062471b641f1b8f733b8b5b", null ], + [ "SPI_SlaveTransferGetCount", "a00022.html#ga0dcd2ed8373d992ff93bb500e1442815", null ], + [ "SPI_SlaveTransferAbort", "a00022.html#gae719048431a3e4fb334f83bd824a407b", null ], + [ "SPI_SlaveTransferHandleIRQ", "a00022.html#gaac1ff8fc728c925d78b1237949ebf7c3", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00023.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00023.html new file mode 100644 index 0000000..4ee193a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00023.html @@ -0,0 +1,2362 @@ + + + + + + +MCUXpresso SDK API Reference Manual: USART Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ + +
+

Overview

+ + + + + + + + + + + +

+Data Structures

struct  usart_config_t
 USART configuration structure. More...
 
struct  usart_transfer_t
 USART transfer structure. More...
 
struct  usart_handle_t
 USART handle structure. More...
 
+ + + + + + + + + + +

+Macros

#define FSL_SDK_ENABLE_USART_DRIVER_TRANSACTIONAL_APIS   1
 Macro gate for enable transaction API. More...
 
#define FSL_SDK_USART_DRIVER_ENABLE_BAUDRATE_AUTO_GENERATE   1
 USART baud rate auto generate switch gate. More...
 
#define UART_RETRY_TIMES   0U
 Retry times for waiting flag. More...
 
+ + + + +

+Typedefs

typedef void(* usart_transfer_callback_t )(USART_Type *base, usart_handle_t *handle, status_t status, void *userData)
 USART transfer callback function. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  {
+  kStatus_USART_TxBusy = MAKE_STATUS(kStatusGroup_LPC_USART, 0), +
+  kStatus_USART_RxBusy = MAKE_STATUS(kStatusGroup_LPC_USART, 1), +
+  kStatus_USART_TxIdle = MAKE_STATUS(kStatusGroup_LPC_USART, 2), +
+  kStatus_USART_RxIdle = MAKE_STATUS(kStatusGroup_LPC_USART, 3), +
+  kStatus_USART_TxError = MAKE_STATUS(kStatusGroup_LPC_USART, 4), +
+  kStatus_USART_RxError = MAKE_STATUS(kStatusGroup_LPC_USART, 5), +
+  kStatus_USART_RxRingBufferOverrun = MAKE_STATUS(kStatusGroup_LPC_USART, 6), +
+  kStatus_USART_NoiseError = MAKE_STATUS(kStatusGroup_LPC_USART, 7), +
+  kStatus_USART_FramingError = MAKE_STATUS(kStatusGroup_LPC_USART, 8), +
+  kStatus_USART_ParityError = MAKE_STATUS(kStatusGroup_LPC_USART, 9), +
+  kStatus_USART_HardwareOverrun = MAKE_STATUS(kStatusGroup_LPC_USART, 10), +
+  kStatus_USART_BaudrateNotSupport, +
+  kStatus_USART_Timeout = MAKE_STATUS(kStatusGroup_LPC_USART, 12) +
+ }
 Error codes for the USART driver. More...
 
enum  usart_parity_mode_t {
+  kUSART_ParityDisabled = 0x0U, +
+  kUSART_ParityEven = 0x2U, +
+  kUSART_ParityOdd = 0x3U +
+ }
 USART parity mode. More...
 
enum  usart_sync_mode_t {
+  kUSART_SyncModeDisabled = 0x0U, +
+  kUSART_SyncModeSlave = 0x2U, +
+  kUSART_SyncModeMaster = 0x3U +
+ }
 USART synchronous mode. More...
 
enum  usart_stop_bit_count_t {
+  kUSART_OneStopBit = 0U, +
+  kUSART_TwoStopBit = 1U +
+ }
 USART stop bit count. More...
 
enum  usart_data_len_t {
+  kUSART_7BitsPerChar = 0U, +
+  kUSART_8BitsPerChar = 1U +
+ }
 USART data size. More...
 
enum  usart_clock_polarity_t {
+  kUSART_RxSampleOnFallingEdge = 0x0U, +
+  kUSART_RxSampleOnRisingEdge = 0x1U +
+ }
 USART clock polarity configuration, used in sync mode. More...
 
enum  _usart_interrupt_enable {
+  kUSART_RxReadyInterruptEnable = (USART_INTENSET_RXRDYEN_MASK), +
+  kUSART_TxReadyInterruptEnable = (USART_INTENSET_TXRDYEN_MASK), +
+  kUSART_TxIdleInterruptEnable = (USART_INTENSET_TXIDLEEN_MASK), +
+  kUSART_DeltaCtsInterruptEnable = (USART_INTENSET_DELTACTSEN_MASK), +
+  kUSART_TxDisableInterruptEnable = (USART_INTENSET_TXDISEN_MASK), +
+  kUSART_HardwareOverRunInterruptEnable = (USART_INTENSET_OVERRUNEN_MASK), +
+  kUSART_RxBreakInterruptEnable = (USART_INTENSET_DELTARXBRKEN_MASK), +
+  kUSART_RxStartInterruptEnable = (USART_INTENSET_STARTEN_MASK), +
+  kUSART_FramErrorInterruptEnable = (USART_INTENSET_FRAMERREN_MASK), +
+  kUSART_ParityErrorInterruptEnable = (USART_INTENSET_PARITYERREN_MASK), +
+  kUSART_RxNoiseInterruptEnable = (USART_INTENSET_RXNOISEEN_MASK), +
+  kUSART_AutoBaudErrorInterruptEnable = (USART_INTENSET_ABERREN_MASK), +
+  kUSART_AllInterruptEnable +
+ }
 USART interrupt configuration structure, default settings all disabled. More...
 
enum  _usart_flags {
+  kUSART_RxReady = (USART_STAT_RXRDY_MASK), +
+  kUSART_RxIdleFlag = (USART_STAT_RXIDLE_MASK), +
+  kUSART_TxReady = (USART_STAT_TXRDY_MASK), +
+  kUSART_TxIdleFlag = (USART_STAT_TXIDLE_MASK), +
+  kUSART_CtsState = (USART_STAT_CTS_MASK), +
+  kUSART_DeltaCtsFlag = (USART_STAT_DELTACTS_MASK), +
+  kUSART_TxDisableFlag = (USART_STAT_TXDISSTAT_MASK), +
+  kUSART_HardwareOverrunFlag = (USART_STAT_OVERRUNINT_MASK), +
+  kUSART_RxBreakFlag = (USART_STAT_DELTARXBRK_MASK), +
+  kUSART_RxStartFlag = (USART_STAT_START_MASK), +
+  kUSART_FramErrorFlag = (USART_STAT_FRAMERRINT_MASK), +
+  kUSART_ParityErrorFlag = (USART_STAT_PARITYERRINT_MASK), +
+  kUSART_RxNoiseFlag = (USART_STAT_RXNOISEINT_MASK), +
+  kUSART_AutoBaudErrorFlag = (USART_STAT_ABERR_MASK) +
+ }
 USART status flags. More...
 
+ + + + +

+Driver version

#define FSL_USART_DRIVER_VERSION   (MAKE_VERSION(2, 4, 0))
 USART driver version. More...
 
+ + + + +

+Get the instance of USART

uint32_t USART_GetInstance (USART_Type *base)
 Returns instance number for USART peripheral base address. More...
 
+ + + + + + + + + + + + + +

+Initialization and deinitialization

status_t USART_Init (USART_Type *base, const usart_config_t *config, uint32_t srcClock_Hz)
 Initializes a USART instance with user configuration structure and peripheral clock. More...
 
void USART_Deinit (USART_Type *base)
 Deinitializes a USART instance. More...
 
void USART_GetDefaultConfig (usart_config_t *config)
 Gets the default configuration structure. More...
 
status_t USART_SetBaudRate (USART_Type *base, uint32_t baudrate_Bps, uint32_t srcClock_Hz)
 Sets the USART instance baud rate. More...
 
+ + + + + + + +

+Status

static uint32_t USART_GetStatusFlags (USART_Type *base)
 Get USART status flags. More...
 
static void USART_ClearStatusFlags (USART_Type *base, uint32_t mask)
 Clear USART status flags. More...
 
+ + + + + + + + + + +

+Interrupts

static void USART_EnableInterrupts (USART_Type *base, uint32_t mask)
 Enables USART interrupts according to the provided mask. More...
 
static void USART_DisableInterrupts (USART_Type *base, uint32_t mask)
 Disables USART interrupts according to a provided mask. More...
 
static uint32_t USART_GetEnabledInterrupts (USART_Type *base)
 Returns enabled USART interrupts. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Bus Operations

static void USART_EnableContinuousSCLK (USART_Type *base, bool enable)
 Continuous Clock generation. More...
 
static void USART_EnableAutoClearSCLK (USART_Type *base, bool enable)
 Enable Continuous Clock generation bit auto clear. More...
 
static void USART_EnableCTS (USART_Type *base, bool enable)
 Enable CTS. More...
 
static void USART_EnableTx (USART_Type *base, bool enable)
 Enable the USART transmit. More...
 
static void USART_EnableRx (USART_Type *base, bool enable)
 Enable the USART receive. More...
 
static void USART_WriteByte (USART_Type *base, uint8_t data)
 Writes to the TXDAT register. More...
 
static uint8_t USART_ReadByte (USART_Type *base)
 Reads the RXDAT directly. More...
 
status_t USART_WriteBlocking (USART_Type *base, const uint8_t *data, size_t length)
 Writes to the TX register using a blocking method. More...
 
status_t USART_ReadBlocking (USART_Type *base, uint8_t *data, size_t length)
 Read RX data register using a blocking method. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Transactional

status_t USART_TransferCreateHandle (USART_Type *base, usart_handle_t *handle, usart_transfer_callback_t callback, void *userData)
 Initializes the USART handle. More...
 
status_t USART_TransferSendNonBlocking (USART_Type *base, usart_handle_t *handle, usart_transfer_t *xfer)
 Transmits a buffer of data using the interrupt method. More...
 
void USART_TransferStartRingBuffer (USART_Type *base, usart_handle_t *handle, uint8_t *ringBuffer, size_t ringBufferSize)
 Sets up the RX ring buffer. More...
 
void USART_TransferStopRingBuffer (USART_Type *base, usart_handle_t *handle)
 Aborts the background transfer and uninstalls the ring buffer. More...
 
size_t USART_TransferGetRxRingBufferLength (usart_handle_t *handle)
 Get the length of received data in RX ring buffer. More...
 
void USART_TransferAbortSend (USART_Type *base, usart_handle_t *handle)
 Aborts the interrupt-driven data transmit. More...
 
status_t USART_TransferGetSendCount (USART_Type *base, usart_handle_t *handle, uint32_t *count)
 Get the number of bytes that have been written to USART TX register. More...
 
status_t USART_TransferReceiveNonBlocking (USART_Type *base, usart_handle_t *handle, usart_transfer_t *xfer, size_t *receivedBytes)
 Receives a buffer of data using an interrupt method. More...
 
void USART_TransferAbortReceive (USART_Type *base, usart_handle_t *handle)
 Aborts the interrupt-driven data receiving. More...
 
status_t USART_TransferGetReceiveCount (USART_Type *base, usart_handle_t *handle, uint32_t *count)
 Get the number of bytes that have been received. More...
 
void USART_TransferHandleIRQ (USART_Type *base, usart_handle_t *handle)
 USART IRQ handle function. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct usart_config_t
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+uint32_t baudRate_Bps
 USART baud rate.
 
bool enableRx
 USART receive enable. More...
 
bool enableTx
 USART transmit enable. More...
 
+bool loopback
 Enable peripheral loopback.
 
bool enableContinuousSCLK
 USART continuous Clock generation enable in synchronous master mode. More...
 
+bool enableHardwareFlowControl
 Enable hardware control RTS/CTS.
 
+usart_parity_mode_t parityMode
 Parity mode, disabled (default), even, odd.
 
+usart_stop_bit_count_t stopBitCount
 Number of stop bits, 1 stop bit (default) or 2 stop bits.
 
+usart_data_len_t bitCountPerChar
 Data length - 7 bit, 8 bit.
 
usart_sync_mode_t syncMode
 Transfer mode - asynchronous, synchronous master, synchronous slave. More...
 
usart_clock_polarity_t clockPolarity
 Selects the clock polarity and sampling edge in sync mode. More...
 
+

Field Documentation

+ +
+
+ + + + +
bool usart_config_t::enableRx
+
+ +
+
+ +
+
+ + + + +
bool usart_config_t::enableTx
+
+ +
+
+ +
+
+ + + + +
bool usart_config_t::enableContinuousSCLK
+
+ +
+
+ +
+
+ + + + +
usart_sync_mode_t usart_config_t::syncMode
+
+ +
+
+ +
+
+ + + + +
usart_clock_polarity_t usart_config_t::clockPolarity
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct usart_transfer_t
+
+
+ + + + + + + + + + + + + +

Data Fields

size_t dataSize
 The byte count to be transfer. More...
 
uint8_t * data
 The buffer of data to be transfer. More...
 
uint8_t * rxData
 The buffer to receive data. More...
 
const uint8_t * txData
 The buffer of data to be sent. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint8_t* usart_transfer_t::data
+
+ +
+
+ +
+
+ + + + +
uint8_t* usart_transfer_t::rxData
+
+ +
+
+ +
+
+ + + + +
const uint8_t* usart_transfer_t::txData
+
+ +
+
+ +
+
+ + + + +
size_t usart_transfer_t::dataSize
+
+ +
+
+ +
+
+ +
+
+ + + + +
struct _usart_handle
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

const uint8_t *volatile txData
 Address of remaining data to send. More...
 
volatile size_t txDataSize
 Size of the remaining data to send. More...
 
size_t txDataSizeAll
 Size of the data to send out. More...
 
uint8_t *volatile rxData
 Address of remaining data to receive. More...
 
volatile size_t rxDataSize
 Size of the remaining data to receive. More...
 
size_t rxDataSizeAll
 Size of the data to receive. More...
 
uint8_t * rxRingBuffer
 Start address of the receiver ring buffer. More...
 
size_t rxRingBufferSize
 Size of the ring buffer. More...
 
volatile uint16_t rxRingBufferHead
 Index for the driver to store received data into ring buffer. More...
 
volatile uint16_t rxRingBufferTail
 Index for the user to get data from the ring buffer. More...
 
usart_transfer_callback_t callback
 Callback function. More...
 
void * userData
 USART callback function parameter. More...
 
volatile uint8_t txState
 TX transfer state. More...
 
+volatile uint8_t rxState
 RX transfer state.
 
+

Field Documentation

+ +
+
+ + + + +
const uint8_t* volatile usart_handle_t::txData
+
+ +
+
+ +
+
+ + + + +
volatile size_t usart_handle_t::txDataSize
+
+ +
+
+ +
+
+ + + + +
size_t usart_handle_t::txDataSizeAll
+
+ +
+
+ +
+
+ + + + +
uint8_t* volatile usart_handle_t::rxData
+
+ +
+
+ +
+
+ + + + +
volatile size_t usart_handle_t::rxDataSize
+
+ +
+
+ +
+
+ + + + +
size_t usart_handle_t::rxDataSizeAll
+
+ +
+
+ +
+
+ + + + +
uint8_t* usart_handle_t::rxRingBuffer
+
+ +
+
+ +
+
+ + + + +
size_t usart_handle_t::rxRingBufferSize
+
+ +
+
+ +
+
+ + + + +
volatile uint16_t usart_handle_t::rxRingBufferHead
+
+ +
+
+ +
+
+ + + + +
volatile uint16_t usart_handle_t::rxRingBufferTail
+
+ +
+
+ +
+
+ + + + +
usart_transfer_callback_t usart_handle_t::callback
+
+ +
+
+ +
+
+ + + + +
void* usart_handle_t::userData
+
+ +
+
+ +
+
+ + + + +
volatile uint8_t usart_handle_t::txState
+
+ +
+
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_USART_DRIVER_VERSION   (MAKE_VERSION(2, 4, 0))
+
+ +
+
+ +
+
+ + + + +
#define FSL_SDK_ENABLE_USART_DRIVER_TRANSACTIONAL_APIS   1
+
+

1 for enable, 0 for disable.

+ +
+
+ +
+
+ + + + +
#define FSL_SDK_USART_DRIVER_ENABLE_BAUDRATE_AUTO_GENERATE   1
+
+

1 for enable, 0 for disable

+ +
+
+ +
+
+ + + + +
#define UART_RETRY_TIMES   0U
+
+

Defining to zero means to keep waiting for the flag until it is assert/deassert.

+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef void(* usart_transfer_callback_t)(USART_Type *base, usart_handle_t *handle, status_t status, void *userData)
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
anonymous enum
+
+ + + + + + + + + + + + + + +
Enumerator
kStatus_USART_TxBusy  +

Transmitter is busy.

+
kStatus_USART_RxBusy  +

Receiver is busy.

+
kStatus_USART_TxIdle  +

USART transmitter is idle.

+
kStatus_USART_RxIdle  +

USART receiver is idle.

+
kStatus_USART_TxError  +

Error happens on tx.

+
kStatus_USART_RxError  +

Error happens on rx.

+
kStatus_USART_RxRingBufferOverrun  +

Error happens on rx ring buffer.

+
kStatus_USART_NoiseError  +

USART noise error.

+
kStatus_USART_FramingError  +

USART framing error.

+
kStatus_USART_ParityError  +

USART parity error.

+
kStatus_USART_HardwareOverrun  +

USART hardware over flow.

+
kStatus_USART_BaudrateNotSupport  +

Baudrate is not support in current clock source.

+
kStatus_USART_Timeout  +

USART times out.

+
+ +
+
+ +
+
+ + + + +
enum usart_parity_mode_t
+
+ + + + +
Enumerator
kUSART_ParityDisabled  +

Parity disabled.

+
kUSART_ParityEven  +

Parity enabled, type even, bit setting: PARITYSEL = 10.

+
kUSART_ParityOdd  +

Parity enabled, type odd, bit setting: PARITYSEL = 11.

+
+ +
+
+ +
+
+ + + + +
enum usart_sync_mode_t
+
+ + + + +
Enumerator
kUSART_SyncModeDisabled  +

Asynchronous mode.

+
kUSART_SyncModeSlave  +

Synchronous slave mode.

+
kUSART_SyncModeMaster  +

Synchronous master mode.

+
+ +
+
+ +
+
+ + + + +
enum usart_stop_bit_count_t
+
+ + + +
Enumerator
kUSART_OneStopBit  +

One stop bit.

+
kUSART_TwoStopBit  +

Two stop bits.

+
+ +
+
+ +
+
+ + + + +
enum usart_data_len_t
+
+ + + +
Enumerator
kUSART_7BitsPerChar  +

Seven bit mode.

+
kUSART_8BitsPerChar  +

Eight bit mode.

+
+ +
+
+ +
+
+ + + + +
enum usart_clock_polarity_t
+
+ + + +
Enumerator
kUSART_RxSampleOnFallingEdge  +

Un_RXD is sampled on the falling edge of SCLK.

+
kUSART_RxSampleOnRisingEdge  +

Un_RXD is sampled on the rising edge of SCLK.

+
+ +
+
+ +
+
+ + + + +
enum _usart_interrupt_enable
+
+ + + + + + + + + + + + + + +
Enumerator
kUSART_RxReadyInterruptEnable  +

Receive ready interrupt.

+
kUSART_TxReadyInterruptEnable  +

Transmit ready interrupt.

+
kUSART_TxIdleInterruptEnable  +

Transmit idle interrupt.

+
kUSART_DeltaCtsInterruptEnable  +

Cts pin change interrupt.

+
kUSART_TxDisableInterruptEnable  +

Transmit disable interrupt.

+
kUSART_HardwareOverRunInterruptEnable  +

hardware ove run interrupt.

+
kUSART_RxBreakInterruptEnable  +

Receive break interrupt.

+
kUSART_RxStartInterruptEnable  +

Receive ready interrupt.

+
kUSART_FramErrorInterruptEnable  +

Receive start interrupt.

+
kUSART_ParityErrorInterruptEnable  +

Receive frame error interrupt.

+
kUSART_RxNoiseInterruptEnable  +

Receive noise error interrupt.

+
kUSART_AutoBaudErrorInterruptEnable  +

Receive auto baud error interrupt.

+
kUSART_AllInterruptEnable  +

All interrupt.

+
+ +
+
+ +
+
+ + + + +
enum _usart_flags
+
+

This provides constants for the USART status flags for use in the USART functions.

+ + + + + + + + + + + + + + + +
Enumerator
kUSART_RxReady  +

Receive ready flag.

+
kUSART_RxIdleFlag  +

Receive IDLE flag.

+
kUSART_TxReady  +

Transmit ready flag.

+
kUSART_TxIdleFlag  +

Transmit idle flag.

+
kUSART_CtsState  +

Cts pin status.

+
kUSART_DeltaCtsFlag  +

Cts pin change flag.

+
kUSART_TxDisableFlag  +

Transmit disable flag.

+
kUSART_HardwareOverrunFlag  +

Hardware over run flag.

+
kUSART_RxBreakFlag  +

Receive break flag.

+
kUSART_RxStartFlag  +

receive start flag.

+
kUSART_FramErrorFlag  +

Frame error flag.

+
kUSART_ParityErrorFlag  +

Parity error flag.

+
kUSART_RxNoiseFlag  +

Receive noise flag.

+
kUSART_AutoBaudErrorFlag  +

Auto baud error flag.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
uint32_t USART_GetInstance (USART_Type * base)
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t USART_Init (USART_Type * base,
const usart_config_tconfig,
uint32_t srcClock_Hz 
)
+
+

This function configures the USART module with the user-defined settings. The user can configure the configuration structure and also get the default configuration by using the USART_GetDefaultConfig() function. Example below shows how to use this API to configure USART.

+
* usart_config_t usartConfig;
+
* usartConfig.baudRate_Bps = 115200U;
+ + +
* USART_Init(USART1, &usartConfig, 20000000U);
+
*
+
Parameters
+ + + + +
baseUSART peripheral base address.
configPointer to user-defined configuration structure.
srcClock_HzUSART clock source frequency in HZ.
+
+
+
Return values
+ + + + +
kStatus_USART_BaudrateNotSupportBaudrate is not support in current clock source.
kStatus_InvalidArgumentUSART base address is not valid
kStatus_SuccessStatus USART initialize succeed
+
+
+ +
+
+ +
+
+ + + + + + + + +
void USART_Deinit (USART_Type * base)
+
+

This function waits for TX complete, disables the USART clock.

+
Parameters
+ + +
baseUSART peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void USART_GetDefaultConfig (usart_config_tconfig)
+
+

This function initializes the USART configuration structure to a default value. The default values are: usartConfig->baudRate_Bps = 9600U; usartConfig->parityMode = kUSART_ParityDisabled; usartConfig->stopBitCount = kUSART_OneStopBit; usartConfig->bitCountPerChar = kUSART_8BitsPerChar; usartConfig->loopback = false; usartConfig->enableTx = false; usartConfig->enableRx = false; ...

+
Parameters
+ + +
configPointer to configuration structure.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t USART_SetBaudRate (USART_Type * base,
uint32_t baudrate_Bps,
uint32_t srcClock_Hz 
)
+
+

This function configures the USART module baud rate. This function is used to update the USART module baud rate after the USART module is initialized by the USART_Init.

+
* USART_SetBaudRate(USART1, 115200U, 20000000U);
+
*
+
Parameters
+ + + + +
baseUSART peripheral base address.
baudrate_BpsUSART baudrate to be set.
srcClock_HzUSART clock source frequency in HZ.
+
+
+
Return values
+ + + + +
kStatus_USART_BaudrateNotSupportBaudrate is not support in current clock source.
kStatus_SuccessSet baudrate succeed.
kStatus_InvalidArgumentOne or more arguments are invalid.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t USART_GetStatusFlags (USART_Type * base)
+
+inlinestatic
+
+

This function get all USART status flags, the flags are returned as the logical OR value of the enumerators _usart_flags. To check a specific status, compare the return value with enumerators in _usart_flags. For example, to check whether the RX is ready:

+
+
* {
+
* ...
+
* }
+
*
+
Parameters
+ + +
baseUSART peripheral base address.
+
+
+
Returns
USART status flags which are ORed by the enumerators in the _usart_flags.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void USART_ClearStatusFlags (USART_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+

This function clear supported USART status flags For example:

+
Parameters
+ + + +
baseUSART peripheral base address.
maskstatus flags to be cleared.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void USART_EnableInterrupts (USART_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+

This function enables the USART interrupts according to the provided mask. The mask is a logical OR of enumeration members. See _usart_interrupt_enable. For example, to enable TX ready interrupt and RX ready interrupt:

+
Parameters
+ + + +
baseUSART peripheral base address.
maskThe interrupts to enable. Logical OR of _usart_interrupt_enable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void USART_DisableInterrupts (USART_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+

This function disables the USART interrupts according to a provided mask. The mask is a logical OR of enumeration members. See _usart_interrupt_enable. This example shows how to disable the TX ready interrupt and RX ready interrupt:

+
Parameters
+ + + +
baseUSART peripheral base address.
maskThe interrupts to disable. Logical OR of _usart_interrupt_enable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t USART_GetEnabledInterrupts (USART_Type * base)
+
+inlinestatic
+
+

This function returns the enabled USART interrupts.

+
Parameters
+ + +
baseUSART peripheral base address.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void USART_EnableContinuousSCLK (USART_Type * base,
bool enable 
)
+
+inlinestatic
+
+

By default, SCLK is only output while data is being transmitted in synchronous mode. Enable this funciton, SCLK will run continuously in synchronous mode, allowing characters to be received on Un_RxD independently from transmission on Un_TXD).

+
Parameters
+ + + +
baseUSART peripheral base address.
enableEnable Continuous Clock generation mode or not, true for enable and false for disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void USART_EnableAutoClearSCLK (USART_Type * base,
bool enable 
)
+
+inlinestatic
+
+

While enable this cuntion, the Continuous Clock bit is automatically cleared when a complete character has been received. This bit is cleared at the same time.

+
Parameters
+ + + +
baseUSART peripheral base address.
enableEnable auto clear or not, true for enable and false for disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void USART_EnableCTS (USART_Type * base,
bool enable 
)
+
+inlinestatic
+
+

This function will determine whether CTS is used for flow control.

+
Parameters
+ + + +
baseUSART peripheral base address.
enableEnable CTS or not, true for enable and false for disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void USART_EnableTx (USART_Type * base,
bool enable 
)
+
+inlinestatic
+
+

This function will enable or disable the USART transmit.

+
Parameters
+ + + +
baseUSART peripheral base address.
enabletrue for enable and false for disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void USART_EnableRx (USART_Type * base,
bool enable 
)
+
+inlinestatic
+
+

This function will enable or disable the USART receive. Note: if the transmit is enabled, the receive will not be disabled.

+
Parameters
+ + + +
baseUSART peripheral base address.
enabletrue for enable and false for disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void USART_WriteByte (USART_Type * base,
uint8_t data 
)
+
+inlinestatic
+
+

This function will writes data to the TXDAT automatly.The upper layer must ensure that TXDATA has space for data to write before calling this function.

+
Parameters
+ + + +
baseUSART peripheral base address.
dataThe byte to write.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint8_t USART_ReadByte (USART_Type * base)
+
+inlinestatic
+
+

This function reads data from the RXDAT automatly. The upper layer must ensure that the RXDAT is not empty before calling this function.

+
Parameters
+ + +
baseUSART peripheral base address.
+
+
+
Returns
The byte read from USART data register.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t USART_WriteBlocking (USART_Type * base,
const uint8_t * data,
size_t length 
)
+
+

This function polls the TX register, waits for the TX register to be empty.

+
Parameters
+ + + + +
baseUSART peripheral base address.
dataStart address of the data to write.
lengthSize of the data to write.
+
+
+
Return values
+ + + +
kStatus_USART_TimeoutTransmission timed out and was aborted.
kStatus_SuccessSuccessfully wrote all data.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t USART_ReadBlocking (USART_Type * base,
uint8_t * data,
size_t length 
)
+
+

This function polls the RX register, waits for the RX register to be full.

+
Parameters
+ + + + +
baseUSART peripheral base address.
dataStart address of the buffer to store the received data.
lengthSize of the buffer.
+
+
+
Return values
+ + + + + + + +
kStatus_USART_FramingErrorReceiver overrun happened while receiving data.
kStatus_USART_ParityErrorNoise error happened while receiving data.
kStatus_USART_NoiseErrorFraming error happened while receiving data.
kStatus_USART_RxErrorOverflow or underflow happened.
kStatus_USART_TimeoutTransmission timed out and was aborted.
kStatus_SuccessSuccessfully received all data.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t USART_TransferCreateHandle (USART_Type * base,
usart_handle_t * handle,
usart_transfer_callback_t callback,
void * userData 
)
+
+

This function initializes the USART handle which can be used for other USART transactional APIs. Usually, for a specified USART instance, call this API once to get the initialized handle.

+
Parameters
+ + + + + +
baseUSART peripheral base address.
handleUSART handle pointer.
callbackThe callback function.
userDataThe parameter of the callback function.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t USART_TransferSendNonBlocking (USART_Type * base,
usart_handle_t * handle,
usart_transfer_txfer 
)
+
+

This function sends data using an interrupt method. This is a non-blocking function, which returns directly without waiting for all data to be written to the TX register. When all data is written to the TX register in the IRQ handler, the USART driver calls the callback function and passes the kStatus_USART_TxIdle as status parameter.

+
Note
The kStatus_USART_TxIdle is passed to the upper layer when all data is written to the TX register. However it does not ensure that all data are sent out. Before disabling the TX, check the kUSART_TransmissionCompleteFlag to ensure that the TX is finished.
+
Parameters
+ + + + +
baseUSART peripheral base address.
handleUSART handle pointer.
xferUSART transfer structure. See usart_transfer_t.
+
+
+
Return values
+ + + + +
kStatus_SuccessSuccessfully start the data transmission.
kStatus_USART_TxBusyPrevious transmission still not finished, data not all written to TX register yet.
kStatus_InvalidArgumentInvalid argument.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void USART_TransferStartRingBuffer (USART_Type * base,
usart_handle_t * handle,
uint8_t * ringBuffer,
size_t ringBufferSize 
)
+
+

This function sets up the RX ring buffer to a specific USART handle.

+

When the RX ring buffer is used, data received are stored into the ring buffer even when the user doesn't call the USART_TransferReceiveNonBlocking() API. If there is already data received in the ring buffer, the user can get the received data from the ring buffer directly.

+
Note
When using the RX ring buffer, one byte is reserved for internal use. In other words, if ringBufferSize is 32, then only 31 bytes are used for saving data.
+
Parameters
+ + + + + +
baseUSART peripheral base address.
handleUSART handle pointer.
ringBufferStart address of the ring buffer for background receiving. Pass NULL to disable the ring buffer.
ringBufferSizesize of the ring buffer.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void USART_TransferStopRingBuffer (USART_Type * base,
usart_handle_t * handle 
)
+
+

This function aborts the background transfer and uninstalls the ring buffer.

+
Parameters
+ + + +
baseUSART peripheral base address.
handleUSART handle pointer.
+
+
+ +
+
+ +
+
+ + + + + + + + +
size_t USART_TransferGetRxRingBufferLength (usart_handle_t * handle)
+
+
Parameters
+ + +
handleUSART handle pointer.
+
+
+
Returns
Length of received data in RX ring buffer.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void USART_TransferAbortSend (USART_Type * base,
usart_handle_t * handle 
)
+
+

This function aborts the interrupt driven data sending. The user can get the remainBtyes to find out how many bytes are still not sent out.

+
Parameters
+ + + +
baseUSART peripheral base address.
handleUSART handle pointer.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t USART_TransferGetSendCount (USART_Type * base,
usart_handle_t * handle,
uint32_t * count 
)
+
+

This function gets the number of bytes that have been written to USART TX register by interrupt method.

+
Parameters
+ + + + +
baseUSART peripheral base address.
handleUSART handle pointer.
countSend bytes count.
+
+
+
Return values
+ + + + +
kStatus_NoTransferInProgressNo send in progress.
kStatus_InvalidArgumentParameter is invalid.
kStatus_SuccessGet successfully through the parameter count;
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t USART_TransferReceiveNonBlocking (USART_Type * base,
usart_handle_t * handle,
usart_transfer_txfer,
size_t * receivedBytes 
)
+
+

This function receives data using an interrupt method. This is a non-blocking function, which returns without waiting for all data to be received. If the RX ring buffer is used and not empty, the data in the ring buffer is copied and the parameter receivedBytes shows how many bytes are copied from the ring buffer. After copying, if the data in the ring buffer is not enough to read, the receive request is saved by the USART driver. When the new data arrives, the receive request is serviced first. When all data is received, the USART driver notifies the upper layer through a callback function and passes the status parameter kStatus_USART_RxIdle. For example, the upper layer needs 10 bytes but there are only 5 bytes in the ring buffer. The 5 bytes are copied to the xfer->data and this function returns with the parameter receivedBytes set to 5. For the left 5 bytes, newly arrived data is saved from the xfer->data[5]. When 5 bytes are received, the USART driver notifies the upper layer. If the RX ring buffer is not enabled, this function enables the RX and RX interrupt to receive data to the xfer->data. When all data is received, the upper layer is notified.

+
Parameters
+ + + + + +
baseUSART peripheral base address.
handleUSART handle pointer.
xferUSART transfer structure, see usart_transfer_t.
receivedBytesBytes received from the ring buffer directly.
+
+
+
Return values
+ + + + +
kStatus_SuccessSuccessfully queue the transfer into transmit queue.
kStatus_USART_RxBusyPrevious receive request is not finished.
kStatus_InvalidArgumentInvalid argument.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void USART_TransferAbortReceive (USART_Type * base,
usart_handle_t * handle 
)
+
+

This function aborts the interrupt-driven data receiving. The user can get the remainBytes to find out how many bytes not received yet.

+
Parameters
+ + + +
baseUSART peripheral base address.
handleUSART handle pointer.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t USART_TransferGetReceiveCount (USART_Type * base,
usart_handle_t * handle,
uint32_t * count 
)
+
+

This function gets the number of bytes that have been received.

+
Parameters
+ + + + +
baseUSART peripheral base address.
handleUSART handle pointer.
countReceive bytes count.
+
+
+
Return values
+ + + + +
kStatus_NoTransferInProgressNo receive in progress.
kStatus_InvalidArgumentParameter is invalid.
kStatus_SuccessGet successfully through the parameter count;
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void USART_TransferHandleIRQ (USART_Type * base,
usart_handle_t * handle 
)
+
+

This function handles the USART transmit and receive IRQ request.

+
Parameters
+ + + +
baseUSART peripheral base address.
handleUSART handle pointer.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00023.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00023.js new file mode 100644 index 0000000..76471fd --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00023.js @@ -0,0 +1,140 @@ +var a00023 = +[ + [ "usart_config_t", "a00023.html#a00137", [ + [ "baudRate_Bps", "a00023.html#a5d2631bc772901b4114b01770f9bb337", null ], + [ "enableRx", "a00023.html#a8b9813693fdfd2116e0d6019ea39b41d", null ], + [ "enableTx", "a00023.html#a2c3b5faf44be34a152232b9dfaaf064d", null ], + [ "loopback", "a00023.html#a9892d7a138f2245bc9b7fe4e6c1652fb", null ], + [ "enableContinuousSCLK", "a00023.html#a8d618d37f6867480bd0e1fcd9e5b50a5", null ], + [ "enableHardwareFlowControl", "a00023.html#ac34e16abe408d6e9daa37741420f7ec0", null ], + [ "parityMode", "a00023.html#aff1d7e368b35ae89db8aa393207e7ccc", null ], + [ "stopBitCount", "a00023.html#aeb0b8a38f5d7e0def2aa1b079643682f", null ], + [ "bitCountPerChar", "a00023.html#ab964b3fbce4b824beff770a138fd4b6e", null ], + [ "syncMode", "a00023.html#ad5debb2aa90fc8fa732edd1ab4bdbbea", null ], + [ "clockPolarity", "a00023.html#ac808e4908f1d6f9ca78fec3d0b8f118a", null ] + ] ], + [ "usart_transfer_t", "a00023.html#a00138", [ + [ "data", "a00023.html#acad21ced979ce0c2af98f0b1837863c9", null ], + [ "rxData", "a00023.html#a44bd38d7d89b7e185ac9bb49bd7214ea", null ], + [ "txData", "a00023.html#ad081b93c86f16dedd57dfc105a71e7fa", null ], + [ "dataSize", "a00023.html#a605c0a56df2815ffb3461aaaf116752a", null ] + ] ], + [ "usart_handle_t", "a00023.html#a00105", [ + [ "txData", "a00023.html#a2e0eada6edeef87ca5609381a495caa0", null ], + [ "txDataSize", "a00023.html#aafb090dd1831c9e83df2d60cf3cd25f0", null ], + [ "txDataSizeAll", "a00023.html#add7cbfa096ebb8bfe5084c9940d0a9d8", null ], + [ "rxData", "a00023.html#a7fcedbe0ea6e380084a05ba1bb06e38d", null ], + [ "rxDataSize", "a00023.html#a94a60ffa711d28e3c9151c9990a9145c", null ], + [ "rxDataSizeAll", "a00023.html#a35109a019b73257d24021ad79d951e64", null ], + [ "rxRingBuffer", "a00023.html#a2cac1523ac58da64d4076c6155309d2f", null ], + [ "rxRingBufferSize", "a00023.html#ae1c5e6a8ccdd56a678e8dda316e43845", null ], + [ "rxRingBufferHead", "a00023.html#afb838e91205d1aa1a2b064591bc11c4e", null ], + [ "rxRingBufferTail", "a00023.html#a197ce470fd9b42e53a867ef84eb2b6dd", null ], + [ "callback", "a00023.html#a50fd5afc23c86d872ee2a1d46bd4145e", null ], + [ "userData", "a00023.html#adbecb8574e5d62ee38761a3b4c30e4c3", null ], + [ "txState", "a00023.html#a30a2856c0e736ad39fe44c015bd54ca4", null ], + [ "rxState", "a00023.html#a7f621935f46f5f1bdd10ca755e1b51a7", null ] + ] ], + [ "FSL_USART_DRIVER_VERSION", "a00023.html#gad737c0eee502276b7615e83ec3a79be4", null ], + [ "FSL_SDK_ENABLE_USART_DRIVER_TRANSACTIONAL_APIS", "a00023.html#gaf7814290d5f1317f0b5dbe97712c3cb7", null ], + [ "FSL_SDK_USART_DRIVER_ENABLE_BAUDRATE_AUTO_GENERATE", "a00023.html#ga855e54d43b294857434ce0d82a6b56cb", null ], + [ "UART_RETRY_TIMES", "a00023.html#gac0f88b67f77fd05f186a5ec940c340bd", null ], + [ "usart_transfer_callback_t", "a00023.html#ga9688f27725349ed0dd7a37c9a75eccc0", [ + [ "kStatus_USART_TxBusy", "a00023.html#ggabed82baf7f470b522273a3e37c24c600a78157ec0658118f9205521c03da99093", null ], + [ "kStatus_USART_RxBusy", "a00023.html#ggabed82baf7f470b522273a3e37c24c600a38225397e3744ef1b4995041ce80d839", null ], + [ "kStatus_USART_TxIdle", "a00023.html#ggabed82baf7f470b522273a3e37c24c600a539a0ebaa0137fdf6d7cc9b984acb13f", null ], + [ "kStatus_USART_RxIdle", "a00023.html#ggabed82baf7f470b522273a3e37c24c600a3cb7112c821c89d7fbb1c048a86756aa", null ], + [ "kStatus_USART_TxError", "a00023.html#ggabed82baf7f470b522273a3e37c24c600abf010640733ea1ae8c97d7a0b83ea11b", null ], + [ "kStatus_USART_RxError", "a00023.html#ggabed82baf7f470b522273a3e37c24c600a888280fbe6cf9b4b0647db78f0578ff5", null ], + [ "kStatus_USART_RxRingBufferOverrun", "a00023.html#ggabed82baf7f470b522273a3e37c24c600a256720c63c378f57791e946c0473290e", null ], + [ "kStatus_USART_NoiseError", "a00023.html#ggabed82baf7f470b522273a3e37c24c600a3f21596ffe8300152d7f9f5587402e19", null ], + [ "kStatus_USART_FramingError", "a00023.html#ggabed82baf7f470b522273a3e37c24c600a9e2f548075400b4c0a719ee1b0a534a9", null ], + [ "kStatus_USART_ParityError", "a00023.html#ggabed82baf7f470b522273a3e37c24c600a579872694419f8708e38935593105868", null ], + [ "kStatus_USART_HardwareOverrun", "a00023.html#ggabed82baf7f470b522273a3e37c24c600ade18e0468490127d2e0a8c71a190bdc8", null ], + [ "kStatus_USART_BaudrateNotSupport", "a00023.html#ggabed82baf7f470b522273a3e37c24c600ae427c8491ce7294dfeaa3b87e506bd81", null ], + [ "kStatus_USART_Timeout", "a00023.html#ggabed82baf7f470b522273a3e37c24c600ad434a2fb3d728550dd2e784ce0a3e14c", null ] + ] ], + [ "usart_parity_mode_t", "a00023.html#ga9b5ca9521874092ccb637a02d7b26ba2", [ + [ "kUSART_ParityDisabled", "a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2a46309b174047a84a78c77b7648bdf21b", null ], + [ "kUSART_ParityEven", "a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2aad8d786301da1bb92e2b911c386d39eb", null ], + [ "kUSART_ParityOdd", "a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2a64df3b823d2ab5f3f56ffb3f520eafb1", null ] + ] ], + [ "usart_sync_mode_t", "a00023.html#ga7ecd603d2579abbe714d58eb582821b8", [ + [ "kUSART_SyncModeDisabled", "a00023.html#gga7ecd603d2579abbe714d58eb582821b8af7a378247f82677090007d0c38be78f2", null ], + [ "kUSART_SyncModeSlave", "a00023.html#gga7ecd603d2579abbe714d58eb582821b8a71df5907ecd16c5f08fe1e6673064958", null ], + [ "kUSART_SyncModeMaster", "a00023.html#gga7ecd603d2579abbe714d58eb582821b8af279132afb0bee88bae3065c20c79ab2", null ] + ] ], + [ "usart_stop_bit_count_t", "a00023.html#ga58ab07609b094f719f903475de6e57b4", [ + [ "kUSART_OneStopBit", "a00023.html#gga58ab07609b094f719f903475de6e57b4aa637b8f5f0edd262181a20c1fbed7c12", null ], + [ "kUSART_TwoStopBit", "a00023.html#gga58ab07609b094f719f903475de6e57b4a3aee3195dc850778e33f2ebacf8847d3", null ] + ] ], + [ "usart_data_len_t", "a00023.html#ga28e46a3538cf5f5140523132a963283c", [ + [ "kUSART_7BitsPerChar", "a00023.html#gga28e46a3538cf5f5140523132a963283ca9562d6cdd240e9808a9a1d1946f400b7", null ], + [ "kUSART_8BitsPerChar", "a00023.html#gga28e46a3538cf5f5140523132a963283cad71aee19329a4127614132d30e50ad8a", null ] + ] ], + [ "usart_clock_polarity_t", "a00023.html#ga786ba5b98195c3df810a061b6c0cca91", [ + [ "kUSART_RxSampleOnFallingEdge", "a00023.html#gga786ba5b98195c3df810a061b6c0cca91a40fdc56c60a07652a4283491087eed6b", null ], + [ "kUSART_RxSampleOnRisingEdge", "a00023.html#gga786ba5b98195c3df810a061b6c0cca91aea6908db956ab3f686c7ee54d68d401c", null ] + ] ], + [ "_usart_interrupt_enable", "a00023.html#ga78b340bf3b25bfae957d0c5532b9b853", [ + [ "kUSART_RxReadyInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853addb8c45f45a91da558ae553a72557445", null ], + [ "kUSART_TxReadyInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a42c8946331d417404af48aed9fe53f88", null ], + [ "kUSART_TxIdleInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ac5611ab6b973e6777a7d7db8321f62f2", null ], + [ "kUSART_DeltaCtsInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ac01c5ca3a2671c568e35d196ea223ada", null ], + [ "kUSART_TxDisableInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a2dae162d4f0509695fce62b0ed1b9e4b", null ], + [ "kUSART_HardwareOverRunInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853afb9ef5dc29f02f42773fb5b7fcda2e3e", null ], + [ "kUSART_RxBreakInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a9c9626a150100989578d9f18f9b3d59a", null ], + [ "kUSART_RxStartInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ae642012aae33bd8954699572e4adb475", null ], + [ "kUSART_FramErrorInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853acc912dfbb3e827b37e9a942bf601672d", null ], + [ "kUSART_ParityErrorInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a3dc275bab22f77a1182bbab5fd5cea3b", null ], + [ "kUSART_RxNoiseInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a7d342596a68c59d4e38bfe33c60f53c9", null ], + [ "kUSART_AutoBaudErrorInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a7154c6ede60243bf5f9e727a5cb18ce5", null ], + [ "kUSART_AllInterruptEnable", "a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ad97d89d6e3a853cc07c854838a4f31f9", null ] + ] ], + [ "_usart_flags", "a00023.html#gaa6a81e7e82e236bb1c3c5ba306466610", [ + [ "kUSART_RxReady", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a03db476c7c52f9624dab00d9af430411", null ], + [ "kUSART_RxIdleFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610abc766d479d00f480e78d05f21f8e1d59", null ], + [ "kUSART_TxReady", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610ab35037d2ed958a740984aa0a125d72aa", null ], + [ "kUSART_TxIdleFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a8106fa188ea138f48c7740dcf5c2b294", null ], + [ "kUSART_CtsState", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2515d20982ec4edf617f6872e666a1d3", null ], + [ "kUSART_DeltaCtsFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a722bb0119b5dc19d471b62c622aca9c7", null ], + [ "kUSART_TxDisableFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a615387365fba3c394b1a595e9baa3c95", null ], + [ "kUSART_HardwareOverrunFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610ade5bc3f17cf2c303ba2e0eeedafd858c", null ], + [ "kUSART_RxBreakFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610af0ae1c44d00b140e86202627084f8638", null ], + [ "kUSART_RxStartFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2fab8368a6a3246714c83405202626b3", null ], + [ "kUSART_FramErrorFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2187b4e63a575e94e6d3a1b7a5ce51d7", null ], + [ "kUSART_ParityErrorFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a46d487d50d8392d25c5c4e76cdfb6674", null ], + [ "kUSART_RxNoiseFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610aef9ca7e74e386c6a6668cc2a0f43c9cd", null ], + [ "kUSART_AutoBaudErrorFlag", "a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610aa655bdfd278003a00cf5195986a38892", null ] + ] ], + [ "USART_GetInstance", "a00023.html#ga0433386bbc6c2ac7e2ec7925fea263db", null ], + [ "USART_Init", "a00023.html#ga2aeb4e11fdf0eb515d090865ffcf2ba2", null ], + [ "USART_Deinit", "a00023.html#ga80892980b702b0b7614691014a5aaaca", null ], + [ "USART_GetDefaultConfig", "a00023.html#ga74464f9357e585e42e5f3c909eb6e9b3", null ], + [ "USART_SetBaudRate", "a00023.html#gabdcaf539e6c95903c779f4538b1f422b", null ], + [ "USART_GetStatusFlags", "a00023.html#ga33f5cdc2918edf02b9a4ef8a12e27442", null ], + [ "USART_ClearStatusFlags", "a00023.html#ga235a301d8f22d6ce3a6f77dbdb76cfe3", null ], + [ "USART_EnableInterrupts", "a00023.html#ga9132cf15ff5fd2ac007a88f9400bcf30", null ], + [ "USART_DisableInterrupts", "a00023.html#ga091d6509100a6e6206483b2f41f16d6c", null ], + [ "USART_GetEnabledInterrupts", "a00023.html#ga49c6966b2af5f0de0fbf49240acc1856", null ], + [ "USART_EnableContinuousSCLK", "a00023.html#gad0a37042ec21be840247a05ca9e8e805", null ], + [ "USART_EnableAutoClearSCLK", "a00023.html#ga4d96acc82e0bbe947ececc200083c68a", null ], + [ "USART_EnableCTS", "a00023.html#gaaab4d6b7d7701fbdd022694330207614", null ], + [ "USART_EnableTx", "a00023.html#gaa7cd13d17a8aa19c34bd8564d37f3a1f", null ], + [ "USART_EnableRx", "a00023.html#ga4f3beae19d75ae0141b60b5fb6a2d710", null ], + [ "USART_WriteByte", "a00023.html#gae7a92a20789cf111acadb543916aac91", null ], + [ "USART_ReadByte", "a00023.html#gaaa9dc0edc5edacd55bb88ff7b9b55f98", null ], + [ "USART_WriteBlocking", "a00023.html#ga95abde78d5cbf569f2b6e4d7942b64df", null ], + [ "USART_ReadBlocking", "a00023.html#ga09c3b588e2099ffa6b999c5ca7fb8d58", null ], + [ "USART_TransferCreateHandle", "a00023.html#ga9aed876794d5c2ab2e37196242602b89", null ], + [ "USART_TransferSendNonBlocking", "a00023.html#ga7f5a4e7e831ab0dc869637494a57362e", null ], + [ "USART_TransferStartRingBuffer", "a00023.html#ga8500107ace3179c85e66d73fa1f41d16", null ], + [ "USART_TransferStopRingBuffer", "a00023.html#gaedb2f678849734999e373a8b00a5248c", null ], + [ "USART_TransferGetRxRingBufferLength", "a00023.html#gac0c8e42457c41efd02a4310423804e77", null ], + [ "USART_TransferAbortSend", "a00023.html#ga095596e064fa8aa6bac0927e71b0329c", null ], + [ "USART_TransferGetSendCount", "a00023.html#ga56acdf4c0046516f59c04d89e8e988e6", null ], + [ "USART_TransferReceiveNonBlocking", "a00023.html#ga34c6c819c9e2d8608a6d7e63103fa542", null ], + [ "USART_TransferAbortReceive", "a00023.html#ga2de9bf9557d2f7bc6fe0236608cb958e", null ], + [ "USART_TransferGetReceiveCount", "a00023.html#ga43cc02b4521f48ae0b5626a1e8f87a0e", null ], + [ "USART_TransferHandleIRQ", "a00023.html#gae955a5e336b3cb3276d5cdd6f1f6feda", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00024.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00024.html new file mode 100644 index 0000000..881cc34 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00024.html @@ -0,0 +1,544 @@ + + + + + + +MCUXpresso SDK API Reference Manual: WKT: Self-wake-up Timer + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
WKT: Self-wake-up Timer
+
+
+

Overview

+

The MCUXpresso SDK provides a driver for the Self-wake-up Timer (WKT) of MCUXpresso SDK devices.

+

+Function groups

+

The WKT driver supports operating the module as a time counter.

+

+Initialization and deinitialization

+

The function WKT_Init() initializes the WKT with specified configurations. The function WKT_GetDefaultConfig() gets the default configurations. The initialization function configures the WKT operating mode.

+

The function WKT_Deinit() stops the WKT timers and disables the module clock.

+

+Read actual WKT counter value

+

The function WKT_GetCounterValue() reads the current timer counting value. This function returns the real-time timer counting value, in a range from 0 to a timer period.

+

+Start and Stop timer operations

+

The function WKT_StartTimer() starts the timer counting. After calling this function, the timer loads the period value, counts down to 0. When the timer reaches 0, it stops and generates a trigger pulse and sets the timeout interrupt flag.

+

The function WKT_StopTimer() stops the timer counting.

+

+Status

+

Provides functions to get and clear the WKT status flags.

+

+Typical use case

+

+WKT tick example

+

Updates the WKT period and toggles an LED periodically. Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/wkt

+ + + + +

+Files

file  fsl_wkt.h
 
+ + + + +

+Data Structures

struct  wkt_config_t
 Describes WKT configuration structure. More...
 
+ + + + + + + +

+Enumerations

enum  wkt_clock_source_t {
+  kWKT_DividedFROClockSource = 0U, +
+  kWKT_LowPowerClockSource = 1U, +
+  kWKT_ExternalClockSource = 2U +
+ }
 Describes WKT clock source. More...
 
enum  wkt_status_flags_t { kWKT_AlarmFlag = WKT_CTRL_ALARMFLAG_MASK + }
 List of WKT flags. More...
 
+ + + + +

+Driver version

+#define FSL_WKT_DRIVER_VERSION   (MAKE_VERSION(2, 0, 2))
 Version 2.0.2.
 
+ + + + + + + + + + +

+Initialization and deinitialization

void WKT_Init (WKT_Type *base, const wkt_config_t *config)
 Ungates the WKT clock and configures the peripheral for basic operation. More...
 
void WKT_Deinit (WKT_Type *base)
 Gate the WKT clock. More...
 
static void WKT_GetDefaultConfig (wkt_config_t *config)
 Initializes the WKT configuration structure. More...
 
+ + + + +

+Read the counter value.

static uint32_t WKT_GetCounterValue (WKT_Type *base)
 Read actual WKT counter value. More...
 
+ + + + + + + +

+Status Interface

static uint32_t WKT_GetStatusFlags (WKT_Type *base)
 Gets the WKT status flags. More...
 
static void WKT_ClearStatusFlags (WKT_Type *base, uint32_t mask)
 Clears the WKT status flags. More...
 
+ + + + + + + +

+Timer Start and Stop

static void WKT_StartTimer (WKT_Type *base, uint32_t count)
 Starts the timer counting. More...
 
static void WKT_StopTimer (WKT_Type *base)
 Stops the timer counting. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct wkt_config_t
+
+
+ + + + +

Data Fields

+wkt_clock_source_t clockSource
 External or internal clock source select.
 
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum wkt_clock_source_t
+
+ + + + +
Enumerator
kWKT_DividedFROClockSource  +

WKT clock sourced from the divided FRO clock.

+
kWKT_LowPowerClockSource  +

WKT clock sourced from the Low power clock Use this clock, LPOSCEN bit of DPDCTRL register must be enabled.

+
kWKT_ExternalClockSource  +

WKT clock sourced from the Low power clock Use this clock, WAKECLKPAD_DISABLE bit of DPDCTRL register must be enabled.

+
+ +
+
+ +
+
+ + + + +
enum wkt_status_flags_t
+
+ + +
Enumerator
kWKT_AlarmFlag  +

Alarm flag.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void WKT_Init (WKT_Type * base,
const wkt_config_tconfig 
)
+
+
Note
This API should be called at the beginning of the application using the WKT driver.
+
Parameters
+ + + +
baseWKT peripheral base address
configPointer to user's WKT config structure.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void WKT_Deinit (WKT_Type * base)
+
+
Parameters
+ + +
baseWKT peripheral base address
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void WKT_GetDefaultConfig (wkt_config_tconfig)
+
+inlinestatic
+
+

This function initializes the WKT configuration structure to default values. The default values are as follows.

+
* config->clockSource = kWKT_DividedFROClockSource;
+
*
+
Parameters
+ + +
configPointer to the WKT configuration structure.
+
+
+
See Also
wkt_config_t
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t WKT_GetCounterValue (WKT_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseWKT peripheral base address
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t WKT_GetStatusFlags (WKT_Type * base)
+
+inlinestatic
+
+
Parameters
+ + +
baseWKT peripheral base address
+
+
+
Returns
The status flags. This is the logical OR of members of the enumeration wkt_status_flags_t
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void WKT_ClearStatusFlags (WKT_Type * base,
uint32_t mask 
)
+
+inlinestatic
+
+
Parameters
+ + + +
baseWKT peripheral base address
maskThe status flags to clear. This is a logical OR of members of the enumeration wkt_status_flags_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void WKT_StartTimer (WKT_Type * base,
uint32_t count 
)
+
+inlinestatic
+
+

After calling this function, timer loads a count value, counts down to 0, then stops.

+
Note
User can call the utility macros provided in fsl_common.h to convert to ticks Do not write to Counter register while the counting is in progress
+
Parameters
+ + + +
baseWKT peripheral base address.
countThe value to be loaded into the WKT Count register
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void WKT_StopTimer (WKT_Type * base)
+
+inlinestatic
+
+

This function Clears the counter and stops the timer from counting.

+
Parameters
+ + +
baseWKT peripheral base address
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00024.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00024.js new file mode 100644 index 0000000..7e1fa69 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00024.js @@ -0,0 +1,23 @@ +var a00024 = +[ + [ "wkt_config_t", "a00024.html#a00139", [ + [ "clockSource", "a00024.html#ae5078ce05e0689966c2c5c49f9aaf89a", null ] + ] ], + [ "FSL_WKT_DRIVER_VERSION", "a00024.html#ga0411f3587cc78cbde38b765e8bf3ba0c", null ], + [ "wkt_clock_source_t", "a00024.html#gaf985ebf5e165e2fbda510cac71cad222", [ + [ "kWKT_DividedFROClockSource", "a00024.html#ggaf985ebf5e165e2fbda510cac71cad222a22e7e8fe1fd3cc9d4d3278e0fb7bae32", null ], + [ "kWKT_LowPowerClockSource", "a00024.html#ggaf985ebf5e165e2fbda510cac71cad222a3c617873be9cb696f53cca9529ca6dfc", null ], + [ "kWKT_ExternalClockSource", "a00024.html#ggaf985ebf5e165e2fbda510cac71cad222afe5c2695869b965f7833386743cc1147", null ] + ] ], + [ "wkt_status_flags_t", "a00024.html#ga0c4c3a2aa689d7cdd0608eb1076d83aa", [ + [ "kWKT_AlarmFlag", "a00024.html#gga0c4c3a2aa689d7cdd0608eb1076d83aaaf60149e2b9f22db27ef273f412e86150", null ] + ] ], + [ "WKT_Init", "a00024.html#gab3a332ac3545c7280fe2e03785736340", null ], + [ "WKT_Deinit", "a00024.html#gac9fb07a0516fdfdbb40129dd85f82b4b", null ], + [ "WKT_GetDefaultConfig", "a00024.html#ga34bc8734ca383ef16dbe8683f65f2d74", null ], + [ "WKT_GetCounterValue", "a00024.html#ga6a2589301e091e4ced6951f49e8ab636", null ], + [ "WKT_GetStatusFlags", "a00024.html#ga1be1eae0ee5ecd4349a07e836f41630e", null ], + [ "WKT_ClearStatusFlags", "a00024.html#gaa0d7b68f6ecfd1f4429c5dabb4b5aec3", null ], + [ "WKT_StartTimer", "a00024.html#gaeaa5ecfb153fc573f367ea2858f56e8a", null ], + [ "WKT_StopTimer", "a00024.html#gab70db33e771d229596af0a64a398aa78", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00025.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00025.html new file mode 100644 index 0000000..36be268 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00025.html @@ -0,0 +1,707 @@ + + + + + + +MCUXpresso SDK API Reference Manual: WWDT: Windowed Watchdog Timer Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
WWDT: Windowed Watchdog Timer Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral driver for the Watchdog module (WDOG) of MCUXpresso SDK devices.

+

+Function groups

+

+Initialization and deinitialization

+

The function WWDT_Init() initializes the watchdog timer with specified configurations. The configurations include timeout value and whether to enable watchdog after init. The function WWDT_GetDefaultConfig() gets the default configurations.

+

The function WWDT_Deinit() disables the watchdog and the module clock.

+

+Status

+

Provides functions to get and clear the WWDT status.

+

+Interrupt

+

Provides functions to enable/disable WWDT interrupts and get current enabled interrupts.

+

+Watch dog Refresh

+

The function WWDT_Refresh() feeds the WWDT.

+

+Typical use case

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/wwdt

+ + + + +

+Files

file  fsl_wwdt.h
 
+ + + + +

+Data Structures

struct  wwdt_config_t
 Describes WWDT configuration structure. More...
 
+ + + + +

+Enumerations

enum  _wwdt_status_flags_t {
+  kWWDT_TimeoutFlag = WWDT_MOD_WDTOF_MASK, +
+  kWWDT_WarningFlag = WWDT_MOD_WDINT_MASK +
+ }
 WWDT status flags. More...
 
+ + + + +

+Driver version

#define FSL_WWDT_DRIVER_VERSION   (MAKE_VERSION(2, 1, 9))
 Defines WWDT driver version. More...
 
+ + + + + + + +

+Refresh sequence

+#define WWDT_FIRST_WORD_OF_REFRESH   (0xAAU)
 First word of refresh sequence.
 
+#define WWDT_SECOND_WORD_OF_REFRESH   (0x55U)
 Second word of refresh sequence.
 
+ + + + + + + + + + +

+WWDT Initialization and De-initialization

void WWDT_GetDefaultConfig (wwdt_config_t *config)
 Initializes WWDT configure structure. More...
 
void WWDT_Init (WWDT_Type *base, const wwdt_config_t *config)
 Initializes the WWDT. More...
 
void WWDT_Deinit (WWDT_Type *base)
 Shuts down the WWDT. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+WWDT Functional Operation

static void WWDT_Enable (WWDT_Type *base)
 Enables the WWDT module. More...
 
static void WWDT_Disable (WWDT_Type *base)
 Disables the WWDT module. More...
 
static uint32_t WWDT_GetStatusFlags (WWDT_Type *base)
 Gets all WWDT status flags. More...
 
void WWDT_ClearStatusFlags (WWDT_Type *base, uint32_t mask)
 Clear WWDT flag. More...
 
static void WWDT_SetWarningValue (WWDT_Type *base, uint32_t warningValue)
 Set the WWDT warning value. More...
 
static void WWDT_SetTimeoutValue (WWDT_Type *base, uint32_t timeoutCount)
 Set the WWDT timeout value. More...
 
static void WWDT_SetWindowValue (WWDT_Type *base, uint32_t windowValue)
 Sets the WWDT window value. More...
 
void WWDT_Refresh (WWDT_Type *base)
 Refreshes the WWDT timer. More...
 
+

Data Structure Documentation

+ +
+
+ + + + +
struct wwdt_config_t
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+bool enableWwdt
 Enables or disables WWDT.
 
+bool enableWatchdogReset
 true: Watchdog timeout will cause a chip reset false: Watchdog timeout will not cause a chip reset
 
+bool enableWatchdogProtect
 true: Enable watchdog protect i.e timeout value can only be changed after counter is below warning & window values false: Disable watchdog protect; timeout value can be changed at any time
 
+bool enableLockOscillator
 true: Disabling or powering down the watchdog oscillator is prevented Once set, this bit can only be cleared by a reset false: Do not lock oscillator
 
+uint32_t windowValue
 Window value, set this to 0xFFFFFF if windowing is not in effect.
 
+uint32_t timeoutValue
 Timeout value.
 
uint32_t warningValue
 Watchdog time counter value that will generate a warning interrupt. More...
 
uint32_t clockFreq_Hz
 Watchdog clock source frequency. More...
 
+

Field Documentation

+ +
+
+ + + + +
uint32_t wwdt_config_t::warningValue
+
+

Set this to 0 for no warning

+ +
+
+ +
+
+ + + + +
uint32_t wwdt_config_t::clockFreq_Hz
+
+ +
+
+ +
+
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_WWDT_DRIVER_VERSION   (MAKE_VERSION(2, 1, 9))
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum _wwdt_status_flags_t
+
+

This structure contains the WWDT status flags for use in the WWDT functions.

+ + + +
Enumerator
kWWDT_TimeoutFlag  +

Time-out flag, set when the timer times out.

+
kWWDT_WarningFlag  +

Warning interrupt flag, set when timer is below the value WDWARNINT.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
void WWDT_GetDefaultConfig (wwdt_config_tconfig)
+
+

This function initializes the WWDT configure structure to default value. The default value are:

+
* config->enableWwdt = true;
+
* config->enableWatchdogReset = false;
+
* config->enableWatchdogProtect = false;
+
* config->enableLockOscillator = false;
+
* config->windowValue = 0xFFFFFFU;
+
* config->timeoutValue = 0xFFFFFFU;
+
* config->warningValue = 0;
+
*
+
Parameters
+ + +
configPointer to WWDT config structure.
+
+
+
See Also
wwdt_config_t
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void WWDT_Init (WWDT_Type * base,
const wwdt_config_tconfig 
)
+
+

This function initializes the WWDT. When called, the WWDT runs according to the configuration.

+

Example:

+
* wwdt_config_t config;
+ +
* config.timeoutValue = 0x7ffU;
+
* WWDT_Init(wwdt_base,&config);
+
*
+
Parameters
+ + + +
baseWWDT peripheral base address
configThe configuration of WWDT
+
+
+ +
+
+ +
+
+ + + + + + + + +
void WWDT_Deinit (WWDT_Type * base)
+
+

This function shuts down the WWDT.

+
Parameters
+ + +
baseWWDT peripheral base address
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void WWDT_Enable (WWDT_Type * base)
+
+inlinestatic
+
+

This function write value into WWDT_MOD register to enable the WWDT, it is a write-once bit; once this bit is set to one and a watchdog feed is performed, the watchdog timer will run permanently.

+
Parameters
+ + +
baseWWDT peripheral base address
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void WWDT_Disable (WWDT_Type * base)
+
+inlinestatic
+
+
Deprecated:
Do not use this function. It will be deleted in next release version, for once the bit field of WDEN written with a 1, it can not be re-written with a 0.
+

This function write value into WWDT_MOD register to disable the WWDT.

+
Parameters
+ + +
baseWWDT peripheral base address
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t WWDT_GetStatusFlags (WWDT_Type * base)
+
+inlinestatic
+
+

This function gets all status flags.

+

Example for getting Timeout Flag:

+
* uint32_t status;
+
* status = WWDT_GetStatusFlags(wwdt_base) & kWWDT_TimeoutFlag;
+
*
+
Parameters
+ + +
baseWWDT peripheral base address
+
+
+
Returns
The status flags. This is the logical OR of members of the enumeration _wwdt_status_flags_t
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void WWDT_ClearStatusFlags (WWDT_Type * base,
uint32_t mask 
)
+
+

This function clears WWDT status flag.

+

Example for clearing warning flag:

+
Parameters
+ + + +
baseWWDT peripheral base address
maskThe status flags to clear. This is a logical OR of members of the enumeration _wwdt_status_flags_t
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void WWDT_SetWarningValue (WWDT_Type * base,
uint32_t warningValue 
)
+
+inlinestatic
+
+

The WDWARNINT register determines the watchdog timer counter value that will generate a watchdog interrupt. When the watchdog timer counter is no longer greater than the value defined by WARNINT, an interrupt will be generated after the subsequent WDCLK.

+
Parameters
+ + + +
baseWWDT peripheral base address
warningValueWWDT warning value.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void WWDT_SetTimeoutValue (WWDT_Type * base,
uint32_t timeoutCount 
)
+
+inlinestatic
+
+

This function sets the timeout value. Every time a feed sequence occurs the value in the TC register is loaded into the Watchdog timer. Writing a value below 0xFF will cause 0xFF to be loaded into the TC register. Thus the minimum time-out interval is TWDCLK*256*4. If enableWatchdogProtect flag is true in wwdt_config_t config structure, any attempt to change the timeout value before the watchdog counter is below the warning and window values will cause a watchdog reset and set the WDTOF flag.

+
Parameters
+ + + +
baseWWDT peripheral base address
timeoutCountWWDT timeout value, count of WWDT clock tick.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void WWDT_SetWindowValue (WWDT_Type * base,
uint32_t windowValue 
)
+
+inlinestatic
+
+

The WINDOW register determines the highest TV value allowed when a watchdog feed is performed. If a feed sequence occurs when timer value is greater than the value in WINDOW, a watchdog event will occur. To disable windowing, set windowValue to 0xFFFFFF (maximum possible timer value) so windowing is not in effect.

+
Parameters
+ + + +
baseWWDT peripheral base address
windowValueWWDT window value.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void WWDT_Refresh (WWDT_Type * base)
+
+

This function feeds the WWDT. This function should be called before WWDT timer is in timeout. Otherwise, a reset is asserted.

+
Parameters
+ + +
baseWWDT peripheral base address
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00025.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00025.js new file mode 100644 index 0000000..b2ea356 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00025.js @@ -0,0 +1,31 @@ +var a00025 = +[ + [ "wwdt_config_t", "a00025.html#a00140", [ + [ "enableWwdt", "a00025.html#a405b63e15703dc92b3179b5089319e38", null ], + [ "enableWatchdogReset", "a00025.html#a78ce1ec4de049becaae7e3be51772313", null ], + [ "enableWatchdogProtect", "a00025.html#adc32c01dcffb7f140c8e1fd049862928", null ], + [ "enableLockOscillator", "a00025.html#ac0e6a4a8be4bd468fdb082a156219a44", null ], + [ "windowValue", "a00025.html#a6ec33e8656fe2cfc997634b348ca2cfa", null ], + [ "timeoutValue", "a00025.html#a9ada6867151ee688d47176cbe771cf2d", null ], + [ "warningValue", "a00025.html#a449186b990027ae1e7543458e2f8714a", null ], + [ "clockFreq_Hz", "a00025.html#a15e2f3ecd343280edfd8fbaa0bf8c9f4", null ] + ] ], + [ "FSL_WWDT_DRIVER_VERSION", "a00025.html#gaf661d1e3e19a80b873c54fdbad5e966a", null ], + [ "WWDT_FIRST_WORD_OF_REFRESH", "a00025.html#ga56228a5472034e453003e7f375c824ab", null ], + [ "WWDT_SECOND_WORD_OF_REFRESH", "a00025.html#gab483f5384985a23bb28889b3c31da9ee", null ], + [ "_wwdt_status_flags_t", "a00025.html#gaca0e9724bd1f25336527ea66c77e476f", [ + [ "kWWDT_TimeoutFlag", "a00025.html#ggaca0e9724bd1f25336527ea66c77e476faea9db9afc1f9c70872a755eaa24a4184", null ], + [ "kWWDT_WarningFlag", "a00025.html#ggaca0e9724bd1f25336527ea66c77e476fa825be03d771f06e1d6cf947ca78f857e", null ] + ] ], + [ "WWDT_GetDefaultConfig", "a00025.html#gacfd7070829029279f3b3bfb763b86914", null ], + [ "WWDT_Init", "a00025.html#gadc47d88ae20552f9cd9999e6f8fc5ebe", null ], + [ "WWDT_Deinit", "a00025.html#gaae4415d32cd0f67908d0ab9494736742", null ], + [ "WWDT_Enable", "a00025.html#ga2620dd2baf891f32359fbe85faaca563", null ], + [ "WWDT_Disable", "a00025.html#ga358bab6648d05345bda057a72cfb5547", null ], + [ "WWDT_GetStatusFlags", "a00025.html#ga1c5dae412d14eba38f2b63abb9f982d6", null ], + [ "WWDT_ClearStatusFlags", "a00025.html#ga5666008b33bf327c80afb90e0733512e", null ], + [ "WWDT_SetWarningValue", "a00025.html#gac575fb8568458aa8acbbed14d5aa5ffd", null ], + [ "WWDT_SetTimeoutValue", "a00025.html#gad2351329bb1ff6b966decec266d7ec16", null ], + [ "WWDT_SetWindowValue", "a00025.html#ga66b5c37906be6083f083a436eebbe778", null ], + [ "WWDT_Refresh", "a00025.html#gab1745efaa7c33fab66a552fd45e01d83", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00085.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00085.html new file mode 100644 index 0000000..19765db --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00085.html @@ -0,0 +1,1022 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Power Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
Power Driver
+
+
+

Overview

+

Power driver provides APIs to control peripherals power and control the system power mode.

+ + + + + +

+Macros

+#define PMUC_PCON_RESERVED_MASK   ((0xf << 4) | (0x6 << 8) | 0xfffff000u)
 PMU PCON reserved mask, used to clear reserved field which should not write 1.
 
+ + + + + + + + + + + + + + + + + + + +

+Enumerations

enum  pd_bit_t
 power down configurations mask
 
enum  _power_wakeup
 Deep sleep and power down mode wake up configurations.
 
enum  _power_deep_sleep_active
 Deep sleep/power down mode active part.
 
enum  power_gen_reg_t {
+  kPmu_GenReg0 = 0U, +
+  kPmu_GenReg1 = 1U, +
+  kPmu_GenReg2 = 2U, +
+  kPmu_GenReg3 = 3U, +
+  kPmu_GenReg4 = 4U +
+ }
 pmu general purpose register index More...
 
enum  power_bod_reset_level_t {
+  kBod_ResetLevelReserved = 0U, +
+  kBod_ResetLevel1, +
+  kBod_ResetLevel2, +
+  kBod_ResetLevel3 +
+ }
 BOD reset level, if VDD below reset level value, the reset will be asserted. More...
 
enum  power_bod_interrupt_level_t {
+  kBod_InterruptLevelReserved = 0U, +
+  kBod_InterruptLevel1, +
+  kBod_InterruptLevel2, +
+  kBod_InterruptLevel3 +
+ }
 BOD interrupt level, if VDD below interrupt level value, the BOD interrupt will be asserted. More...
 
+ + + + +

+Driver version

#define FSL_POWER_DRIVER_VERSION   (MAKE_VERSION(2, 1, 0))
 power driver version 2.1.0. More...
 
+ + + + + + + + + + + + + +

+SYSCON Power Configuration

static void POWER_EnablePD (pd_bit_t en)
 API to enable PDRUNCFG bit in the Syscon. More...
 
static void POWER_DisablePD (pd_bit_t en)
 API to disable PDRUNCFG bit in the Syscon. More...
 
static void POWER_WakeUpConfig (uint32_t mask, bool powerDown)
 API to config wakeup configurations for deep sleep mode and power down mode. More...
 
static void POWER_DeepSleepConfig (uint32_t mask, bool powerDown)
 API to config active part for deep sleep mode and power down mode. More...
 
+ + + + + + + +

+ARM core Power Configuration

static void POWER_EnableDeepSleep (void)
 API to enable deep sleep bit in the ARM Core. More...
 
static void POWER_DisableDeepSleep (void)
 API to disable deep sleep bit in the ARM Core. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+PMU functionality

void POWER_EnterSleep (void)
 API to enter sleep power mode. More...
 
void POWER_EnterDeepSleep (uint32_t activePart)
 API to enter deep sleep power mode. More...
 
void POWER_EnterPowerDown (uint32_t activePart)
 API to enter power down mode. More...
 
void POWER_EnterDeepPowerDownMode (void)
 API to enter deep power down mode. More...
 
static uint32_t POWER_GetSleepModeFlag (void)
 API to get sleep mode flag. More...
 
+static void POWER_ClrSleepModeFlag (void)
 API to clear sleep mode flag.
 
static uint32_t POWER_GetDeepPowerDownModeFlag (void)
 API to get deep power down mode flag. More...
 
+static void POWER_ClrDeepPowerDownModeFlag (void)
 API to clear deep power down mode flag.
 
static void POWER_EnableNonDpd (bool enable)
 API to enable non deep power down mode. More...
 
static void POWER_EnableLPO (bool enable)
 API to enable LPO. More...
 
static void POWER_EnableLPOInDeepPowerDownMode (bool enable)
 API to enable LPO in deep power down mode. More...
 
static void POWER_SetRetainData (power_gen_reg_t index, uint32_t data)
 API to retore data to general purpose register which can be retain during deep power down mode. More...
 
static uint32_t POWER_GetRetainData (power_gen_reg_t index)
 API to get data from general purpose register which retain during deep power down mode. More...
 
static void POWER_EnableWktClkIn (bool enable, bool enHysteresis)
 API to enable external clock input for self wake up timer. More...
 
static void POWER_EnableWakeupPinForDeepPowerDown (bool enable, bool enHysteresis)
 API to enable wake up pin for deep power down mode. More...
 
static void POWER_EnableResetPinForDeepPowerDown (bool enable, bool enHysteresis)
 API to enable external clock input for self wake up timer. More...
 
static void POWER_SetBodLevel (power_bod_reset_level_t resetLevel, power_bod_interrupt_level_t interruptLevel, bool enable)
 Set Bod interrupt level and reset level. More...
 
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_POWER_DRIVER_VERSION   (MAKE_VERSION(2, 1, 0))
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum power_gen_reg_t
+
+ + + + + + +
Enumerator
kPmu_GenReg0  +

general purpose register0

+
kPmu_GenReg1  +

general purpose register1

+
kPmu_GenReg2  +

general purpose register2

+
kPmu_GenReg3  +

general purpose register3

+
kPmu_GenReg4  +

DPDCTRL bit 31-8.

+
+ +
+
+ +
+
+ + + + +
enum power_bod_reset_level_t
+
+ + + + + +
Enumerator
kBod_ResetLevelReserved  +

BOD Reset Level reserved.

+
kBod_ResetLevel1  +

BOD Reset Level1: 2.05V.

+
kBod_ResetLevel2  +

BOD Reset Level2: 2.35V.

+
kBod_ResetLevel3  +

BOD Reset Level3: 2.63V.

+
+ +
+
+ +
+
+ + + + +
enum power_bod_interrupt_level_t
+
+ + + + + +
Enumerator
kBod_InterruptLevelReserved  +

BOD interrupt level reserved.

+
kBod_InterruptLevel1  +

BOD interrupt level1: 2.25V.

+
kBod_InterruptLevel2  +

BOD interrupt level2: 2.55V.

+
kBod_InterruptLevel3  +

BOD interrupt level3: 2.84V.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
static void POWER_EnablePD (pd_bit_t en)
+
+inlinestatic
+
+

Note that enabling the bit powers down the peripheral

+
Parameters
+ + +
enperipheral for which to enable the PDRUNCFG bit
+
+
+
Returns
none
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void POWER_DisablePD (pd_bit_t en)
+
+inlinestatic
+
+

Note that disabling the bit powers up the peripheral

+
Parameters
+ + +
enperipheral for which to disable the PDRUNCFG bit
+
+
+
Returns
none
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void POWER_WakeUpConfig (uint32_t mask,
bool powerDown 
)
+
+inlinestatic
+
+
Parameters
+ + + +
mask,:wake up configurations for deep sleep mode and power down mode, reference _power_wakeup.
powerDown,:true is power down the mask part, false is powered part.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void POWER_DeepSleepConfig (uint32_t mask,
bool powerDown 
)
+
+inlinestatic
+
+
Parameters
+ + + +
mask,:active part configurations for deep sleep mode and power down mode, reference _power_deep_sleep_active.
powerDown,:true is power down the mask part, false is powered part.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void POWER_EnableDeepSleep (void )
+
+inlinestatic
+
+
Returns
none
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void POWER_DisableDeepSleep (void )
+
+inlinestatic
+
+
Returns
none
+ +
+
+ +
+
+ + + + + + + + +
void POWER_EnterSleep (void )
+
+
Returns
none
+ +
+
+ +
+
+ + + + + + + + +
void POWER_EnterDeepSleep (uint32_t activePart)
+
+
Parameters
+ + +
activePart,:should be a single or combine value of _power_deep_sleep_active .
+
+
+
Returns
none
+ +
+
+ +
+
+ + + + + + + + +
void POWER_EnterPowerDown (uint32_t activePart)
+
+
Parameters
+ + +
activePart,:should be a single or combine value of _power_deep_sleep_active .
+
+
+
Returns
none
+ +
+
+ +
+
+ + + + + + + + +
void POWER_EnterDeepPowerDownMode (void )
+
+
Returns
none
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t POWER_GetSleepModeFlag (void )
+
+inlinestatic
+
+
Returns
sleep mode flag: 0 is active mode, 1 is sleep mode entered.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t POWER_GetDeepPowerDownModeFlag (void )
+
+inlinestatic
+
+
Returns
sleep mode flag: 0 not deep power down, 1 is deep power down mode entered.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void POWER_EnableNonDpd (bool enable)
+
+inlinestatic
+
+
Parameters
+ + +
enable,:true is enable non deep power down, otherwise disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void POWER_EnableLPO (bool enable)
+
+inlinestatic
+
+
Parameters
+ + +
enable,:true to enable LPO, false to disable LPO.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void POWER_EnableLPOInDeepPowerDownMode (bool enable)
+
+inlinestatic
+
+
Parameters
+ + +
enable,:true to enable LPO, false to disable LPO.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void POWER_SetRetainData (power_gen_reg_t index,
uint32_t data 
)
+
+inlinestatic
+
+

Note the kPMU_GenReg4 can retore 3 byte data only, so the general purpose register can store 19bytes data.

+
Parameters
+ + + +
index,:general purpose data register index.
data,:data to restore.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t POWER_GetRetainData (power_gen_reg_t index)
+
+inlinestatic
+
+

Note the kPMU_GenReg4 can retore 3 byte data only, so the general purpose register can store 19bytes data.

+
Parameters
+ + +
index,:general purpose data register index.
+
+
+
Returns
data stored in the general purpose register.
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void POWER_EnableWktClkIn (bool enable,
bool enHysteresis 
)
+
+inlinestatic
+
+
Parameters
+ + + +
enable,:true is enable external clock input for self-wake-up timer, otherwise disable.
enHysteresis,:true is enable Hysteresis for the pin, otherwise disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void POWER_EnableWakeupPinForDeepPowerDown (bool enable,
bool enHysteresis 
)
+
+inlinestatic
+
+
Parameters
+ + + +
enable,:true is enable, otherwise disable.
enHysteresis,:true is enable Hysteresis for the pin, otherwise disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void POWER_EnableResetPinForDeepPowerDown (bool enable,
bool enHysteresis 
)
+
+inlinestatic
+
+
Parameters
+ + + +
enable,:true is enable , otherwise disable.
enHysteresis,:true is enable Hysteresis for the pin, otherwise disable.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
static void POWER_SetBodLevel (power_bod_reset_level_t resetLevel,
power_bod_interrupt_level_t interruptLevel,
bool enable 
)
+
+inlinestatic
+
+
Parameters
+ + + + +
resetLevelBOD reset threshold level, please refer to power_bod_reset_level_t.
interruptLevelBOD interrupt threshold level, please refer to power_bod_interrupt_level_t.
enableUsed to enable/disable the BOD interrupt and BOD reset.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00085.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00085.js new file mode 100644 index 0000000..6f25aa2 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00085.js @@ -0,0 +1,50 @@ +var a00085 = +[ + [ "FSL_POWER_DRIVER_VERSION", "a00085.html#ga566dde551cccfbff838b7f6f474e525b", null ], + [ "PMUC_PCON_RESERVED_MASK", "a00085.html#gacc5b8fefeacc0f1909d657be9cedddf3", null ], + [ "pd_bit_t", "a00085.html#ga26070d8045aac640b0b755bd7b1b5695", null ], + [ "_power_wakeup", "a00085.html#ga1680834b74ccfaca0cc98b954cfef0ec", null ], + [ "_power_deep_sleep_active", "a00085.html#gab5d33167d8a4c9d9a407cc1bdd6346a9", null ], + [ "power_gen_reg_t", "a00085.html#gaacea8a22b7f4706814e61973550d3492", [ + [ "kPmu_GenReg0", "a00085.html#ggaacea8a22b7f4706814e61973550d3492a80dcccd621286706e1c8a4ebe9c10f0a", null ], + [ "kPmu_GenReg1", "a00085.html#ggaacea8a22b7f4706814e61973550d3492a740c74b8de11afea3adf94099430d43f", null ], + [ "kPmu_GenReg2", "a00085.html#ggaacea8a22b7f4706814e61973550d3492ad0fed29c216cb44973a5720f27c25b57", null ], + [ "kPmu_GenReg3", "a00085.html#ggaacea8a22b7f4706814e61973550d3492a8464e8acd4980abf527cdc08a1039f03", null ], + [ "kPmu_GenReg4", "a00085.html#ggaacea8a22b7f4706814e61973550d3492ad41dcf0263e8b148f96f850b2be396ac", null ] + ] ], + [ "power_bod_reset_level_t", "a00085.html#gad4414c07be8e296fdf41c256e605c161", [ + [ "kBod_ResetLevelReserved", "a00085.html#ggad4414c07be8e296fdf41c256e605c161add73712f6ddad1995c9569ab44773f86", null ], + [ "kBod_ResetLevel1", "a00085.html#ggad4414c07be8e296fdf41c256e605c161a787770b2bcd6da51b910e61a4b1587a2", null ], + [ "kBod_ResetLevel2", "a00085.html#ggad4414c07be8e296fdf41c256e605c161a75c8d8c85c9703e637809b497e798615", null ], + [ "kBod_ResetLevel3", "a00085.html#ggad4414c07be8e296fdf41c256e605c161a6eb61ac24d5fe54b31f0c2089e5da750", null ] + ] ], + [ "power_bod_interrupt_level_t", "a00085.html#gad856ab8003eb9953525518cddbc7814c", [ + [ "kBod_InterruptLevelReserved", "a00085.html#ggad856ab8003eb9953525518cddbc7814cabc8bc042a952213b5364fcc75fb2e459", null ], + [ "kBod_InterruptLevel1", "a00085.html#ggad856ab8003eb9953525518cddbc7814ca186e757d5a202f806afd889315af3639", null ], + [ "kBod_InterruptLevel2", "a00085.html#ggad856ab8003eb9953525518cddbc7814ca2094c3f450488ea077bf45edabd227ba", null ], + [ "kBod_InterruptLevel3", "a00085.html#ggad856ab8003eb9953525518cddbc7814cab28fa5a4937806aefbc4d259a419d354", null ] + ] ], + [ "POWER_EnablePD", "a00085.html#gacf3a138e73725bb8c50290295259bfa4", null ], + [ "POWER_DisablePD", "a00085.html#ga40a1d0c80f5189e9c56133a2bc15a4c2", null ], + [ "POWER_WakeUpConfig", "a00085.html#ga83d78eac8ce2faa5f92738c681846d5b", null ], + [ "POWER_DeepSleepConfig", "a00085.html#ga64687ae9aee146f932c9d822633ed751", null ], + [ "POWER_EnableDeepSleep", "a00085.html#gae9733cfb042126b04d237cc8db40dba0", null ], + [ "POWER_DisableDeepSleep", "a00085.html#gabea720a67b6b06b187a5781b9955dc9c", null ], + [ "POWER_EnterSleep", "a00085.html#ga6ad77a0ddbf43076a49a207534c6b7f8", null ], + [ "POWER_EnterDeepSleep", "a00085.html#ga4b0c77a348378a9c77539fc160c239df", null ], + [ "POWER_EnterPowerDown", "a00085.html#ga85cddf883d8412b35f3648fa5a62b136", null ], + [ "POWER_EnterDeepPowerDownMode", "a00085.html#gafd390219700f64b63df3ded05212bda5", null ], + [ "POWER_GetSleepModeFlag", "a00085.html#gaa25d9a439cb1779e76c107cfc9c1a86e", null ], + [ "POWER_ClrSleepModeFlag", "a00085.html#ga7069e59acd0a3e196bb54b7a5bcead3d", null ], + [ "POWER_GetDeepPowerDownModeFlag", "a00085.html#ga7b82522f086af61786aa316142d3540c", null ], + [ "POWER_ClrDeepPowerDownModeFlag", "a00085.html#ga4b9f6c3aa18e60b7a85edfa8857906ed", null ], + [ "POWER_EnableNonDpd", "a00085.html#ga7bfb95e1397b0fc1b02b740458667d4c", null ], + [ "POWER_EnableLPO", "a00085.html#ga86ad2183a772150f3c72d5aaf158afaa", null ], + [ "POWER_EnableLPOInDeepPowerDownMode", "a00085.html#gaf5a1bdc5ba7e3b43083fdb74f0154fb3", null ], + [ "POWER_SetRetainData", "a00085.html#gada7daa74280566725bfa2854613c91cc", null ], + [ "POWER_GetRetainData", "a00085.html#ga2cef71a7429671e6aaf71b3c40f1bc23", null ], + [ "POWER_EnableWktClkIn", "a00085.html#ga7ee1c99dbc8430bf973857b641d677e9", null ], + [ "POWER_EnableWakeupPinForDeepPowerDown", "a00085.html#ga05cbdf9affa49e1ea898935937a94bc1", null ], + [ "POWER_EnableResetPinForDeepPowerDown", "a00085.html#ga2017fc3e4b370ec4528136d4f4bc08b5", null ], + [ "POWER_SetBodLevel", "a00085.html#ga85b6d46e43b818ba54dba92256db4499", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00086.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00086.html new file mode 100644 index 0000000..935da5e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00086.html @@ -0,0 +1,367 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Reset Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
Reset Driver
+
+
+

Overview

+

Reset driver supports peripheral reset and system reset.

+ + + + +

+Macros

#define FLASH_RSTS_N
 
+ + + + +

+Enumerations

enum  SYSCON_RSTn_t {
+  kFLASH_RST_N_SHIFT_RSTn = 0 | 4U, +
+  kI2C0_RST_N_SHIFT_RSTn = 0 | 5U, +
+  kGPIO0_RST_N_SHIFT_RSTn = 0 | 6U, +
+  kSWM_RST_N_SHIFT_RSTn = 0 | 7U, +
+  kSCT_RST_N_SHIFT_RSTn = 0 | 8U, +
+  kWKT_RST_N_SHIFT_RSTn = 0 | 9U, +
+  kMRT_RST_N_SHIFT_RSTn = 0 | 10U, +
+  kSPI0_RST_N_SHIFT_RSTn = 0 | 11U, +
+  kSPI1_RST_N_SHIFT_RSTn = 0 | 12U, +
+  kCRC_RST_SHIFT_RSTn = 0 | 13U, +
+  kUART0_RST_N_SHIFT_RSTn = 0 | 14U, +
+  kUART1_RST_N_SHIFT_RSTn = 0 | 15U, +
+  kUART2_RST_N_SHIFT_RSTn = 0 | 16U, +
+  kIOCON_RST_N_SHIFT_RSTn = 0 | 18U, +
+  kACMP_RST_N_SHIFT_RSTn = 0 | 19U, +
+  kGPIO1_RST_N_SHIFT_RSTn = 0 | 20U, +
+  kI2C1_RST_N_SHIFT_RSTn = 0 | 21U, +
+  kI2C2_RST_N_SHIFT_RSTn = 0 | 22U, +
+  kI2C3_RST_N_SHIFT_RSTn = 0 | 23U, +
+  kADC_RST_N_SHIFT_RSTn = 0 | 24U, +
+  kCTIMER0_RST_N_SHIFT_RSTn = 0 | 25U, +
+  kDAC0_RST_N_SHIFT_RSTn = 0 | 27U, +
+  kGPIOINT_RST_N_SHIFT_RSTn = 0 | 28U, +
+  kDMA_RST_N_SHIFT_RSTn = 0 | 29U, +
+  kUART3_RST_N_SHIFT_RSTn = 0 | 30U, +
+  kUART4_RST_N_SHIFT_RSTn = 0 | 31U, +
+  kCAPT_RST_N_SHIFT_RSTn = 65536 | 0U, +
+  kDAC1_RST_N_SHIFT_RSTn = 65536 | 1U, +
+  kFRG0_RST_N_SHIFT_RSTn = 65536 | 3U, +
+  kFRG1_RST_N_SHIFT_RSTn = 65536 | 4U +
+ }
 Enumeration for peripheral reset control bits. More...
 
+ + + + +

+Functions

void RESET_PeripheralReset (reset_ip_name_t peripheral)
 Reset peripheral module. More...
 
+ + + + +

+Driver version

#define FSL_RESET_DRIVER_VERSION   (MAKE_VERSION(2, 0, 1))
 reset driver version 2.0.1. More...
 
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_RESET_DRIVER_VERSION   (MAKE_VERSION(2, 0, 1))
+
+ +
+
+ +
+
+ + + + +
#define FLASH_RSTS_N
+
+Value:
{ \
+ +
} /* Reset bits for Flash peripheral */
+
Definition: fsl_reset.h:39
+

Array initializers with peripheral reset bits

+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum SYSCON_RSTn_t
+
+

Defines the enumeration for peripheral reset control bits in PRESETCTRL/ASYNCPRESETCTRL registers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerator
kFLASH_RST_N_SHIFT_RSTn  +

Flash controller reset control

+
kI2C0_RST_N_SHIFT_RSTn  +

I2C0 reset control

+
kGPIO0_RST_N_SHIFT_RSTn  +

GPIO0 reset control

+
kSWM_RST_N_SHIFT_RSTn  +

SWM reset control

+
kSCT_RST_N_SHIFT_RSTn  +

SCT reset control

+
kWKT_RST_N_SHIFT_RSTn  +

Self-wake-up timer(WKT) reset control

+
kMRT_RST_N_SHIFT_RSTn  +

Multi-rate timer(MRT) reset control

+
kSPI0_RST_N_SHIFT_RSTn  +

SPI0 reset control.

+
kSPI1_RST_N_SHIFT_RSTn  +

SPI1 reset control

+
kCRC_RST_SHIFT_RSTn  +

CRC reset control

+
kUART0_RST_N_SHIFT_RSTn  +

UART0 reset control

+
kUART1_RST_N_SHIFT_RSTn  +

UART1 reset control

+
kUART2_RST_N_SHIFT_RSTn  +

UART2 reset control

+
kIOCON_RST_N_SHIFT_RSTn  +

IOCON reset control

+
kACMP_RST_N_SHIFT_RSTn  +

Analog comparator reset control

+
kGPIO1_RST_N_SHIFT_RSTn  +

GPIO1 reset control

+
kI2C1_RST_N_SHIFT_RSTn  +

I2C1 reset control

+
kI2C2_RST_N_SHIFT_RSTn  +

I2C2 reset control

+
kI2C3_RST_N_SHIFT_RSTn  +

I2C3 reset control

+
kADC_RST_N_SHIFT_RSTn  +

ADC reset control

+
kCTIMER0_RST_N_SHIFT_RSTn  +

CTIMER0 reset control

+
kDAC0_RST_N_SHIFT_RSTn  +

DAC0 reset control

+
kGPIOINT_RST_N_SHIFT_RSTn  +

GPIOINT reset control

+
kDMA_RST_N_SHIFT_RSTn  +

DMA reset control

+
kUART3_RST_N_SHIFT_RSTn  +

UART3 reset control

+
kUART4_RST_N_SHIFT_RSTn  +

UART4 reset control

+
kCAPT_RST_N_SHIFT_RSTn  +

Capacitive Touch reset control

+
kDAC1_RST_N_SHIFT_RSTn  +

DAC1 reset control

+
kFRG0_RST_N_SHIFT_RSTn  +

Fractional baud rate generator 0 reset control

+
kFRG1_RST_N_SHIFT_RSTn  +

Fractional baud rate generator 1 reset control

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
void RESET_PeripheralReset (reset_ip_name_t peripheral)
+
+

Reset peripheral module.

+
Parameters
+ + +
peripheralPeripheral to reset. The enum argument contains encoding of reset register and reset bit position in the reset register.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00086.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00086.js new file mode 100644 index 0000000..d1f6ae4 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00086.js @@ -0,0 +1,38 @@ +var a00086 = +[ + [ "FSL_RESET_DRIVER_VERSION", "a00086.html#gaf2dd9adbeea910141dc143654a1065db", null ], + [ "FLASH_RSTS_N", "a00086.html#ga337911597d5b1d45ac9ac6abb705a5ef", null ], + [ "SYSCON_RSTn_t", "a00086.html#gac287530f011b42355162470f09975770", [ + [ "kFLASH_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770ac1601058bee0888d89675b528432a496", null ], + [ "kI2C0_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770aee6d4f65797043b10be7d4a7ae95d206", null ], + [ "kGPIO0_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a244e5cce727a529563a83a1a78f8b3f1", null ], + [ "kSWM_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770abbd5b2eb886157d35a4ff88077fa192b", null ], + [ "kSCT_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a5a074c4e48569dce7baacbae585541fc", null ], + [ "kWKT_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a80aae2b47fdc2701cb923d27ca9e5a7a", null ], + [ "kMRT_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a81a00b3196e6197af1ca45b8a5bac450", null ], + [ "kSPI0_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770ac5dc2b0f880a50d33e7d79f7af4c4f33", null ], + [ "kSPI1_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a3aedfdfb886f77b764c41e155ccb44f6", null ], + [ "kCRC_RST_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a194baa96cd93ef108f2724fa98352387", null ], + [ "kUART0_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770aa294a3c09c1565947ebcd78694acff24", null ], + [ "kUART1_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a8bc751e4927f0c20a0695b284fc40c38", null ], + [ "kUART2_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770aba96ac75d5b05b7df8222704e24def14", null ], + [ "kIOCON_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770ab95a1dd8a7fbc479365344d58ac55737", null ], + [ "kACMP_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770ac1a3b1156e6dbc9d6fecb867f1486c63", null ], + [ "kGPIO1_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770ac11437bc3b54618d863748e13b09ea3e", null ], + [ "kI2C1_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770ad1ef18ed84027fdc4d41567ae894ea10", null ], + [ "kI2C2_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a69e2004fad90b83501ee061e1eb7c85d", null ], + [ "kI2C3_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a97ee4a7923c967d1c356c0f135c465c2", null ], + [ "kADC_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a99e18503426294e439f4bb181a451999", null ], + [ "kCTIMER0_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a900b1deecf2f2316b30e40ff81330499", null ], + [ "kDAC0_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a25d5f742c3cbcf85a4e9c388c5c9e708", null ], + [ "kGPIOINT_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a20fd1ac8739a143dddb40a6349a758a6", null ], + [ "kDMA_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a8dbbba3532e3e597133ebc8a55bdd1e7", null ], + [ "kUART3_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770aa61d8fdd3f725cee11918bae04493dc8", null ], + [ "kUART4_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770ac1d90aca68025a47b316e6f6b02c209e", null ], + [ "kCAPT_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a6946809531736fcf4d7067e31f73813b", null ], + [ "kDAC1_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770aba3fb61d22a1e6b912b002bc592b3f1f", null ], + [ "kFRG0_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a7a5b1b185218feb35ce91ce8f77b2106", null ], + [ "kFRG1_RST_N_SHIFT_RSTn", "a00086.html#ggac287530f011b42355162470f09975770a78cd776910006a5d8724f628b5c8a0a5", null ] + ] ], + [ "RESET_PeripheralReset", "a00086.html#gac33f3428cb55ce07ae67802e5f534ffc", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00087.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00087.html new file mode 100644 index 0000000..fd0aeb7 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00087.html @@ -0,0 +1,1203 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Common Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
Common Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a driver for the common module of MCUXpresso SDK devices.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

#define FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ   1
 Macro to use the default weak IRQ handler in drivers. More...
 
#define MAKE_STATUS(group, code)   ((((group)*100L) + (code)))
 Construct a status code value from a group and code number. More...
 
#define MAKE_VERSION(major, minor, bugfix)   (((major) * 65536L) + ((minor) * 256L) + (bugfix))
 Construct the version number for drivers. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_NONE   0U
 No debug console. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_UART   1U
 Debug console based on UART. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_LPUART   2U
 Debug console based on LPUART. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_LPSCI   3U
 Debug console based on LPSCI. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_USBCDC   4U
 Debug console based on USBCDC. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM   5U
 Debug console based on FLEXCOMM. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_IUART   6U
 Debug console based on i.MX UART. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_VUSART   7U
 Debug console based on LPC_VUSART. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_MINI_USART   8U
 Debug console based on LPC_USART. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_SWO   9U
 Debug console based on SWO. More...
 
#define DEBUG_CONSOLE_DEVICE_TYPE_QSCI   10U
 Debug console based on QSCI. More...
 
#define ARRAY_SIZE(x)   (sizeof(x) / sizeof((x)[0]))
 Computes the number of elements in an array. More...
 
+ + + + +

+Typedefs

typedef int32_t status_t
 Type used for all status and error return values. More...
 
+ + + + + + + +

+Enumerations

enum  _status_groups {
+  kStatusGroup_Generic = 0, +
+  kStatusGroup_FLASH = 1, +
+  kStatusGroup_LPSPI = 4, +
+  kStatusGroup_FLEXIO_SPI = 5, +
+  kStatusGroup_DSPI = 6, +
+  kStatusGroup_FLEXIO_UART = 7, +
+  kStatusGroup_FLEXIO_I2C = 8, +
+  kStatusGroup_LPI2C = 9, +
+  kStatusGroup_UART = 10, +
+  kStatusGroup_I2C = 11, +
+  kStatusGroup_LPSCI = 12, +
+  kStatusGroup_LPUART = 13, +
+  kStatusGroup_SPI = 14, +
+  kStatusGroup_XRDC = 15, +
+  kStatusGroup_SEMA42 = 16, +
+  kStatusGroup_SDHC = 17, +
+  kStatusGroup_SDMMC = 18, +
+  kStatusGroup_SAI = 19, +
+  kStatusGroup_MCG = 20, +
+  kStatusGroup_SCG = 21, +
+  kStatusGroup_SDSPI = 22, +
+  kStatusGroup_FLEXIO_I2S = 23, +
+  kStatusGroup_FLEXIO_MCULCD = 24, +
+  kStatusGroup_FLASHIAP = 25, +
+  kStatusGroup_FLEXCOMM_I2C = 26, +
+  kStatusGroup_I2S = 27, +
+  kStatusGroup_IUART = 28, +
+  kStatusGroup_CSI = 29, +
+  kStatusGroup_MIPI_DSI = 30, +
+  kStatusGroup_SDRAMC = 35, +
+  kStatusGroup_POWER = 39, +
+  kStatusGroup_ENET = 40, +
+  kStatusGroup_PHY = 41, +
+  kStatusGroup_TRGMUX = 42, +
+  kStatusGroup_SMARTCARD = 43, +
+  kStatusGroup_LMEM = 44, +
+  kStatusGroup_QSPI = 45, +
+  kStatusGroup_DMA = 50, +
+  kStatusGroup_EDMA = 51, +
+  kStatusGroup_DMAMGR = 52, +
+  kStatusGroup_FLEXCAN = 53, +
+  kStatusGroup_LTC = 54, +
+  kStatusGroup_FLEXIO_CAMERA = 55, +
+  kStatusGroup_LPC_SPI = 56, +
+  kStatusGroup_LPC_USART = 57, +
+  kStatusGroup_DMIC = 58, +
+  kStatusGroup_SDIF = 59, +
+  kStatusGroup_SPIFI = 60, +
+  kStatusGroup_OTP = 61, +
+  kStatusGroup_MCAN = 62, +
+  kStatusGroup_CAAM = 63, +
+  kStatusGroup_ECSPI = 64, +
+  kStatusGroup_USDHC = 65, +
+  kStatusGroup_LPC_I2C = 66, +
+  kStatusGroup_DCP = 67, +
+  kStatusGroup_MSCAN = 68, +
+  kStatusGroup_ESAI = 69, +
+  kStatusGroup_FLEXSPI = 70, +
+  kStatusGroup_MMDC = 71, +
+  kStatusGroup_PDM = 72, +
+  kStatusGroup_SDMA = 73, +
+  kStatusGroup_ICS = 74, +
+  kStatusGroup_SPDIF = 75, +
+  kStatusGroup_LPC_MINISPI = 76, +
+  kStatusGroup_HASHCRYPT = 77, +
+  kStatusGroup_LPC_SPI_SSP = 78, +
+  kStatusGroup_I3C = 79, +
+  kStatusGroup_LPC_I2C_1 = 97, +
+  kStatusGroup_NOTIFIER = 98, +
+  kStatusGroup_DebugConsole = 99, +
+  kStatusGroup_SEMC = 100, +
+  kStatusGroup_ApplicationRangeStart = 101, +
+  kStatusGroup_IAP = 102, +
+  kStatusGroup_SFA = 103, +
+  kStatusGroup_SPC = 104, +
+  kStatusGroup_PUF = 105, +
+  kStatusGroup_TOUCH_PANEL = 106, +
+  kStatusGroup_HAL_GPIO = 121, +
+  kStatusGroup_HAL_UART = 122, +
+  kStatusGroup_HAL_TIMER = 123, +
+  kStatusGroup_HAL_SPI = 124, +
+  kStatusGroup_HAL_I2C = 125, +
+  kStatusGroup_HAL_FLASH = 126, +
+  kStatusGroup_HAL_PWM = 127, +
+  kStatusGroup_HAL_RNG = 128, +
+  kStatusGroup_HAL_I2S = 129, +
+  kStatusGroup_TIMERMANAGER = 135, +
+  kStatusGroup_SERIALMANAGER = 136, +
+  kStatusGroup_LED = 137, +
+  kStatusGroup_BUTTON = 138, +
+  kStatusGroup_EXTERN_EEPROM = 139, +
+  kStatusGroup_SHELL = 140, +
+  kStatusGroup_MEM_MANAGER = 141, +
+  kStatusGroup_LIST = 142, +
+  kStatusGroup_OSA = 143, +
+  kStatusGroup_COMMON_TASK = 144, +
+  kStatusGroup_MSG = 145, +
+  kStatusGroup_SDK_OCOTP = 146, +
+  kStatusGroup_SDK_FLEXSPINOR = 147, +
+  kStatusGroup_CODEC = 148, +
+  kStatusGroup_ASRC = 149, +
+  kStatusGroup_OTFAD = 150, +
+  kStatusGroup_SDIOSLV = 151, +
+  kStatusGroup_MECC = 152, +
+  kStatusGroup_ENET_QOS = 153, +
+  kStatusGroup_LOG = 154, +
+  kStatusGroup_I3CBUS = 155, +
+  kStatusGroup_QSCI = 156, +
+  kStatusGroup_SNT = 157, +
+  kStatusGroup_QUEUEDSPI = 158, +
+  kStatusGroup_POWER_MANAGER = 159 +
+ }
 Status group numbers. More...
 
enum  {
+  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, +
+  kStatus_Busy = MAKE_STATUS(kStatusGroup_Generic, 7), +
+  kStatus_NoData +
+ }
 Generic status return codes. More...
 
+ + + + + + + + + + +

+Functions

void * SDK_Malloc (size_t size, size_t alignbytes)
 Allocate memory with given alignment and aligned size. More...
 
void SDK_Free (void *ptr)
 Free memory. More...
 
void SDK_DelayAtLeastUs (uint32_t delayTime_us, uint32_t coreClock_Hz)
 Delay at least for some time. More...
 
+ + + + +

+Driver version

#define FSL_COMMON_DRIVER_VERSION   (MAKE_VERSION(2, 3, 1))
 common driver version. More...
 
+ + + + + +

+Min/max macros

+#define MIN(a, b)   (((a) < (b)) ? (a) : (b))
 
+#define MAX(a, b)   (((a) > (b)) ? (a) : (b))
 
+ + + + + +

+UINT16_MAX/UINT32_MAX value

+#define UINT16_MAX   ((uint16_t)-1)
 
+#define UINT32_MAX   ((uint32_t)-1)
 
+ + + +

+Suppress fallthrough warning macro

+#define SUPPRESS_FALL_THROUGH_WARNING()
 
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ   1
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
#define MAKE_STATUS( group,
 code 
)   ((((group)*100L) + (code)))
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
#define MAKE_VERSION( major,
 minor,
 bugfix 
)   (((major) * 65536L) + ((minor) * 256L) + (bugfix))
+
+

The driver version is a 32-bit number, for both 32-bit platforms(such as Cortex M) and 16-bit platforms(such as DSC).

+
| Unused    || Major Version || Minor Version ||  Bug Fix    |
+31        25  24           17  16            9  8            0
+
+
+ +
+
+ + + + +
#define FSL_COMMON_DRIVER_VERSION   (MAKE_VERSION(2, 3, 1))
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_NONE   0U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_UART   1U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_LPUART   2U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_LPSCI   3U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_USBCDC   4U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM   5U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_IUART   6U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_VUSART   7U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_MINI_USART   8U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_SWO   9U
+
+ +
+
+ +
+
+ + + + +
#define DEBUG_CONSOLE_DEVICE_TYPE_QSCI   10U
+
+ +
+
+ +
+
+ + + + + + + + +
#define ARRAY_SIZE( x)   (sizeof(x) / sizeof((x)[0]))
+
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef int32_t status_t
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum _status_groups
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerator
kStatusGroup_Generic  +

Group number for generic status codes.

+
kStatusGroup_FLASH  +

Group number for FLASH status codes.

+
kStatusGroup_LPSPI  +

Group number for LPSPI status codes.

+
kStatusGroup_FLEXIO_SPI  +

Group number for FLEXIO SPI status codes.

+
kStatusGroup_DSPI  +

Group number for DSPI status codes.

+
kStatusGroup_FLEXIO_UART  +

Group number for FLEXIO UART status codes.

+
kStatusGroup_FLEXIO_I2C  +

Group number for FLEXIO I2C status codes.

+
kStatusGroup_LPI2C  +

Group number for LPI2C status codes.

+
kStatusGroup_UART  +

Group number for UART status codes.

+
kStatusGroup_I2C  +

Group number for UART status codes.

+
kStatusGroup_LPSCI  +

Group number for LPSCI status codes.

+
kStatusGroup_LPUART  +

Group number for LPUART status codes.

+
kStatusGroup_SPI  +

Group number for SPI status code.

+
kStatusGroup_XRDC  +

Group number for XRDC status code.

+
kStatusGroup_SEMA42  +

Group number for SEMA42 status code.

+
kStatusGroup_SDHC  +

Group number for SDHC status code.

+
kStatusGroup_SDMMC  +

Group number for SDMMC status code.

+
kStatusGroup_SAI  +

Group number for SAI status code.

+
kStatusGroup_MCG  +

Group number for MCG status codes.

+
kStatusGroup_SCG  +

Group number for SCG status codes.

+
kStatusGroup_SDSPI  +

Group number for SDSPI status codes.

+
kStatusGroup_FLEXIO_I2S  +

Group number for FLEXIO I2S status codes.

+
kStatusGroup_FLEXIO_MCULCD  +

Group number for FLEXIO LCD status codes.

+
kStatusGroup_FLASHIAP  +

Group number for FLASHIAP status codes.

+
kStatusGroup_FLEXCOMM_I2C  +

Group number for FLEXCOMM I2C status codes.

+
kStatusGroup_I2S  +

Group number for I2S status codes.

+
kStatusGroup_IUART  +

Group number for IUART status codes.

+
kStatusGroup_CSI  +

Group number for CSI status codes.

+
kStatusGroup_MIPI_DSI  +

Group number for MIPI DSI status codes.

+
kStatusGroup_SDRAMC  +

Group number for SDRAMC status codes.

+
kStatusGroup_POWER  +

Group number for POWER status codes.

+
kStatusGroup_ENET  +

Group number for ENET status codes.

+
kStatusGroup_PHY  +

Group number for PHY status codes.

+
kStatusGroup_TRGMUX  +

Group number for TRGMUX status codes.

+
kStatusGroup_SMARTCARD  +

Group number for SMARTCARD status codes.

+
kStatusGroup_LMEM  +

Group number for LMEM status codes.

+
kStatusGroup_QSPI  +

Group number for QSPI status codes.

+
kStatusGroup_DMA  +

Group number for DMA status codes.

+
kStatusGroup_EDMA  +

Group number for EDMA status codes.

+
kStatusGroup_DMAMGR  +

Group number for DMAMGR status codes.

+
kStatusGroup_FLEXCAN  +

Group number for FlexCAN status codes.

+
kStatusGroup_LTC  +

Group number for LTC status codes.

+
kStatusGroup_FLEXIO_CAMERA  +

Group number for FLEXIO CAMERA status codes.

+
kStatusGroup_LPC_SPI  +

Group number for LPC_SPI status codes.

+
kStatusGroup_LPC_USART  +

Group number for LPC_USART status codes.

+
kStatusGroup_DMIC  +

Group number for DMIC status codes.

+
kStatusGroup_SDIF  +

Group number for SDIF status codes.

+
kStatusGroup_SPIFI  +

Group number for SPIFI status codes.

+
kStatusGroup_OTP  +

Group number for OTP status codes.

+
kStatusGroup_MCAN  +

Group number for MCAN status codes.

+
kStatusGroup_CAAM  +

Group number for CAAM status codes.

+
kStatusGroup_ECSPI  +

Group number for ECSPI status codes.

+
kStatusGroup_USDHC  +

Group number for USDHC status codes.

+
kStatusGroup_LPC_I2C  +

Group number for LPC_I2C status codes.

+
kStatusGroup_DCP  +

Group number for DCP status codes.

+
kStatusGroup_MSCAN  +

Group number for MSCAN status codes.

+
kStatusGroup_ESAI  +

Group number for ESAI status codes.

+
kStatusGroup_FLEXSPI  +

Group number for FLEXSPI status codes.

+
kStatusGroup_MMDC  +

Group number for MMDC status codes.

+
kStatusGroup_PDM  +

Group number for MIC status codes.

+
kStatusGroup_SDMA  +

Group number for SDMA status codes.

+
kStatusGroup_ICS  +

Group number for ICS status codes.

+
kStatusGroup_SPDIF  +

Group number for SPDIF status codes.

+
kStatusGroup_LPC_MINISPI  +

Group number for LPC_MINISPI status codes.

+
kStatusGroup_HASHCRYPT  +

Group number for Hashcrypt status codes.

+
kStatusGroup_LPC_SPI_SSP  +

Group number for LPC_SPI_SSP status codes.

+
kStatusGroup_I3C  +

Group number for I3C status codes.

+
kStatusGroup_LPC_I2C_1  +

Group number for LPC_I2C_1 status codes.

+
kStatusGroup_NOTIFIER  +

Group number for NOTIFIER status codes.

+
kStatusGroup_DebugConsole  +

Group number for debug console status codes.

+
kStatusGroup_SEMC  +

Group number for SEMC status codes.

+
kStatusGroup_ApplicationRangeStart  +

Starting number for application groups.

+
kStatusGroup_IAP  +

Group number for IAP status codes.

+
kStatusGroup_SFA  +

Group number for SFA status codes.

+
kStatusGroup_SPC  +

Group number for SPC status codes.

+
kStatusGroup_PUF  +

Group number for PUF status codes.

+
kStatusGroup_TOUCH_PANEL  +

Group number for touch panel status codes.

+
kStatusGroup_HAL_GPIO  +

Group number for HAL GPIO status codes.

+
kStatusGroup_HAL_UART  +

Group number for HAL UART status codes.

+
kStatusGroup_HAL_TIMER  +

Group number for HAL TIMER status codes.

+
kStatusGroup_HAL_SPI  +

Group number for HAL SPI status codes.

+
kStatusGroup_HAL_I2C  +

Group number for HAL I2C status codes.

+
kStatusGroup_HAL_FLASH  +

Group number for HAL FLASH status codes.

+
kStatusGroup_HAL_PWM  +

Group number for HAL PWM status codes.

+
kStatusGroup_HAL_RNG  +

Group number for HAL RNG status codes.

+
kStatusGroup_HAL_I2S  +

Group number for HAL I2S status codes.

+
kStatusGroup_TIMERMANAGER  +

Group number for TiMER MANAGER status codes.

+
kStatusGroup_SERIALMANAGER  +

Group number for SERIAL MANAGER status codes.

+
kStatusGroup_LED  +

Group number for LED status codes.

+
kStatusGroup_BUTTON  +

Group number for BUTTON status codes.

+
kStatusGroup_EXTERN_EEPROM  +

Group number for EXTERN EEPROM status codes.

+
kStatusGroup_SHELL  +

Group number for SHELL status codes.

+
kStatusGroup_MEM_MANAGER  +

Group number for MEM MANAGER status codes.

+
kStatusGroup_LIST  +

Group number for List status codes.

+
kStatusGroup_OSA  +

Group number for OSA status codes.

+
kStatusGroup_COMMON_TASK  +

Group number for Common task status codes.

+
kStatusGroup_MSG  +

Group number for messaging status codes.

+
kStatusGroup_SDK_OCOTP  +

Group number for OCOTP status codes.

+
kStatusGroup_SDK_FLEXSPINOR  +

Group number for FLEXSPINOR status codes.

+
kStatusGroup_CODEC  +

Group number for codec status codes.

+
kStatusGroup_ASRC  +

Group number for codec status ASRC.

+
kStatusGroup_OTFAD  +

Group number for codec status codes.

+
kStatusGroup_SDIOSLV  +

Group number for SDIOSLV status codes.

+
kStatusGroup_MECC  +

Group number for MECC status codes.

+
kStatusGroup_ENET_QOS  +

Group number for ENET_QOS status codes.

+
kStatusGroup_LOG  +

Group number for LOG status codes.

+
kStatusGroup_I3CBUS  +

Group number for I3CBUS status codes.

+
kStatusGroup_QSCI  +

Group number for QSCI status codes.

+
kStatusGroup_SNT  +

Group number for SNT status codes.

+
kStatusGroup_QUEUEDSPI  +

Group number for QSPI status codes.

+
kStatusGroup_POWER_MANAGER  +

Group number for POWER_MANAGER status codes.

+
+ +
+
+ +
+
+ + + + +
anonymous enum
+
+ + + + + + + + + + +
Enumerator
kStatus_Success  +

Generic status for Success.

+
kStatus_Fail  +

Generic status for Fail.

+
kStatus_ReadOnly  +

Generic status for read only failure.

+
kStatus_OutOfRange  +

Generic status for out of range access.

+
kStatus_InvalidArgument  +

Generic status for invalid argument check.

+
kStatus_Timeout  +

Generic status for timeout.

+
kStatus_NoTransferInProgress  +

Generic status for no transfer in progress.

+
kStatus_Busy  +

Generic status for module is busy.

+
kStatus_NoData  +

Generic status for no data is found for the operation.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void* SDK_Malloc (size_t size,
size_t alignbytes 
)
+
+

This is provided to support the dynamically allocated memory used in cache-able region.

+
Parameters
+ + + +
sizeThe length required to malloc.
alignbytesThe alignment size.
+
+
+
Return values
+ + +
Theallocated memory.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void SDK_Free (void * ptr)
+
+
Parameters
+ + +
ptrThe memory to be release.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void SDK_DelayAtLeastUs (uint32_t delayTime_us,
uint32_t coreClock_Hz 
)
+
+

Please note that, this API uses while loop for delay, different run-time environments make the time not precise, if precise delay count was needed, please implement a new delay function with hardware timer.

+
Parameters
+ + + +
delayTime_usDelay time in unit of microsecond.
coreClock_HzCore clock frequency with Hz.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00087.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00087.js new file mode 100644 index 0000000..1f51b15 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00087.js @@ -0,0 +1,145 @@ +var a00087 = +[ + [ "FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ", "a00087.html#ga9a10f3f762d9eb7c5db73535db6a9d78", null ], + [ "MAKE_STATUS", "a00087.html#gad76dfbb0423d0cd3a7b77cbcd9043146", null ], + [ "MAKE_VERSION", "a00087.html#ga812138aa3315b0c6953c1a26130bcc37", null ], + [ "FSL_COMMON_DRIVER_VERSION", "a00087.html#gac6e3c4c6fa592fc0da7fab541e7019f7", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_NONE", "a00087.html#gaa7fc9e15d36453236a580b3c8116ee85", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_UART", "a00087.html#ga59764d32e5394455906edbf03cff0b9f", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_LPUART", "a00087.html#ga1a04b7330b5196f73ed4ffe7fa2bae6c", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_LPSCI", "a00087.html#ga6b4add5f2d938a89da56f58ac0b4e89b", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_USBCDC", "a00087.html#ga262e149f9ce1ef4cf2e539e9494d3cca", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM", "a00087.html#gad4f7f7e51a84c34f06bbbb34973ae97a", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_IUART", "a00087.html#ga75a9e86134df04f6a8b66025d11e25c2", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_VUSART", "a00087.html#ga2c85202f838f94e51a0bb7b33856c78d", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_MINI_USART", "a00087.html#ga5a951951cdb6063d949523052aa5b5e4", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_SWO", "a00087.html#ga9d142691c3a4d810f8bdabc41e89dfd7", null ], + [ "DEBUG_CONSOLE_DEVICE_TYPE_QSCI", "a00087.html#ga74389c7c04a9f53548d05287c7c665cd", null ], + [ "ARRAY_SIZE", "a00087.html#ga6242a25f9d996f0cc4f4cdb911218b75", null ], + [ "status_t", "a00087.html#gaaabdaf7ee58ca7269bd4bf24efcde092", null ], + [ "_status_groups", "a00087.html#ga7ff0b98bb1341c07acefb1473b6eda29", [ + [ "kStatusGroup_Generic", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae7c95e11ceb8067c9c2703f96e51aca7", null ], + [ "kStatusGroup_FLASH", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8db8bea33da992b22cafbae1dcf65bb0", null ], + [ "kStatusGroup_LPSPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a491dbb2373725b607970c032f4e04ee3", null ], + [ "kStatusGroup_FLEXIO_SPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3bc2ecc10af8973a1ecc4f0163fb9b53", null ], + [ "kStatusGroup_DSPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aee549dc5fb5e05a0d8daaa61a089b222", null ], + [ "kStatusGroup_FLEXIO_UART", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae7514134f14004b1835d27cac48bd991", null ], + [ "kStatusGroup_FLEXIO_I2C", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a67e5d3d11fb3f47ec11d9ee612b98b94", null ], + [ "kStatusGroup_LPI2C", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0d6c6a34fc0b6dbcb323f010556a3be1", null ], + [ "kStatusGroup_UART", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aeeb2ed6ef4ce59c7e1d416466f55bfb7", null ], + [ "kStatusGroup_I2C", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a5c67a60e98e49151455f565c2834d228", null ], + [ "kStatusGroup_LPSCI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9f1b2d0eeee16f209d7eed3bdb1cf533", null ], + [ "kStatusGroup_LPUART", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3bcb0be184f8d5bb76d4be8e99b4e45e", null ], + [ "kStatusGroup_SPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a60c31c70600aff4f290ca2d790622977", null ], + [ "kStatusGroup_XRDC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29af98b407f4e66e7046a3173031b45253d", null ], + [ "kStatusGroup_SEMA42", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a073c6e3ccd0dbcf1b812cb21da5e7df9", null ], + [ "kStatusGroup_SDHC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aba83e94d1735b695119429a4e55bb3a4", null ], + [ "kStatusGroup_SDMMC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1c5e35d9d03724b7ccadcae8e0451384", null ], + [ "kStatusGroup_SAI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae4461a3a085ea13b5fe7908bf1e109f8", null ], + [ "kStatusGroup_MCG", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8210c55fe061ff24e75a0f928dbfcb39", null ], + [ "kStatusGroup_SCG", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9771abafdcf43bf924599a0081e92bf2", null ], + [ "kStatusGroup_SDSPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a85685b8cde1285d240569b9518c32fc0", null ], + [ "kStatusGroup_FLEXIO_I2S", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae834c896c69c50855c5cf07768a6cba3", null ], + [ "kStatusGroup_FLEXIO_MCULCD", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a055d3788919f48c2d69463819d02d903", null ], + [ "kStatusGroup_FLASHIAP", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae5b7283daca81a85091e27b80ece629a", null ], + [ "kStatusGroup_FLEXCOMM_I2C", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aedd1abcbca188de6e16a6f088d59e92e", null ], + [ "kStatusGroup_I2S", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0b66f34ec90c9b6a702e0f00f5ddae43", null ], + [ "kStatusGroup_IUART", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a33255aee9de4a1d093770b218f944d0f", null ], + [ "kStatusGroup_CSI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1d1d1a595e9f00c6c9f80c19ce1b8ec5", null ], + [ "kStatusGroup_MIPI_DSI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29abdf3fca48a7a13b67d0207aeb59bc581", null ], + [ "kStatusGroup_SDRAMC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3b3116c6f4aa1a88e6e7abc45df58938", null ], + [ "kStatusGroup_POWER", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a94d2a6fe8021fed5487169a46421d47e", null ], + [ "kStatusGroup_ENET", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7d6b922ab2a42d6ef35cfb2be4f80251", null ], + [ "kStatusGroup_PHY", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a521a4b8ac1776d0f41af044886a71b3b", null ], + [ "kStatusGroup_TRGMUX", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29adb8c69c2f8cd344f3e2dc0b0db4a1631", null ], + [ "kStatusGroup_SMARTCARD", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae16d6bba44ae6f24187946960fb826dd", null ], + [ "kStatusGroup_LMEM", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a376f952aee5cd45d903da520a37e4c52", null ], + [ "kStatusGroup_QSPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4a488e0f7cc1d3baa449ab4ca99e7b34", null ], + [ "kStatusGroup_DMA", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a210ff4fa30e99618f8d3e978df03a7b6", null ], + [ "kStatusGroup_EDMA", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0ec7f0302a8f7eb082f449933880a1ad", null ], + [ "kStatusGroup_DMAMGR", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3091dcef1c0c7cd48658d8b43b52fbaf", null ], + [ "kStatusGroup_FLEXCAN", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1461a28ac2297f07aa34581074cf9923", null ], + [ "kStatusGroup_LTC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a64b54e0423e0ad8a227a38cad4ad4eda", null ], + [ "kStatusGroup_FLEXIO_CAMERA", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a214d1cc4faa574be18fa9d865f2ca36d", null ], + [ "kStatusGroup_LPC_SPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac4c2c9d32010087f0602dbdf2c389857", null ], + [ "kStatusGroup_LPC_USART", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a02f52b9532ae0d4af04f5c054f3fab84", null ], + [ "kStatusGroup_DMIC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a679444433f12ae5649cb02c2032ca20e", null ], + [ "kStatusGroup_SDIF", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a25fb824a9ad702e631276a8ea5d03603", null ], + [ "kStatusGroup_SPIFI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac071c3c3d14ed8afadb2bb6de249c722", null ], + [ "kStatusGroup_OTP", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1d9b7b66bfaaf53b42aad8462c88ea62", null ], + [ "kStatusGroup_MCAN", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab7f77dd7e0c3d068baf39117ac08a0b9", null ], + [ "kStatusGroup_CAAM", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a298049d9d9c8be1b2e7a42f38a734d87", null ], + [ "kStatusGroup_ECSPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab99693af818132e3cb4f9198965ad637", null ], + [ "kStatusGroup_USDHC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae2f54d029f0e74c8fed8812e24000a74", null ], + [ "kStatusGroup_LPC_I2C", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab597c78848ce0e63d2518f14e7bac82b", null ], + [ "kStatusGroup_DCP", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8e7465155c679388316b2f874a284e9e", null ], + [ "kStatusGroup_MSCAN", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a858563b1d87d6fa57a8f442025655201", null ], + [ "kStatusGroup_ESAI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a01101c0342017a7fbe7225a7aa285bad", null ], + [ "kStatusGroup_FLEXSPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a22f1bdf5e7abbeb0bdfe18cda0bc5aca", null ], + [ "kStatusGroup_MMDC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a67a884fec4d6adb5b455d50a0a5617a5", null ], + [ "kStatusGroup_PDM", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae0b4ea9f05497a624e32811c4f36a3be", null ], + [ "kStatusGroup_SDMA", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab55df75d85633505960f611180054524", null ], + [ "kStatusGroup_ICS", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a01bf442d671041dcbd1649ec0428c3b6", null ], + [ "kStatusGroup_SPDIF", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8bea2b5f8b1458aaa0dc29ddbb972d87", null ], + [ "kStatusGroup_LPC_MINISPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab0104dd99e52fbf948f4ae030de5313d", null ], + [ "kStatusGroup_HASHCRYPT", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1dcb6a7c2605c9ed77388fcb25b01feb", null ], + [ "kStatusGroup_LPC_SPI_SSP", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa2c382624b5763cf24cf9727fbfadde3", null ], + [ "kStatusGroup_I3C", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6dbe13107a9dbb857242cf05e2319f9d", null ], + [ "kStatusGroup_LPC_I2C_1", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a749eaf601d6fe3124f054bcb796b348c", null ], + [ "kStatusGroup_NOTIFIER", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a56134a73f0cfd393dd7cf7fb2395dd99", null ], + [ "kStatusGroup_DebugConsole", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a499ec238a1614827065533960716e652", null ], + [ "kStatusGroup_SEMC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2fef671dda58af09262787022fe321fe", null ], + [ "kStatusGroup_ApplicationRangeStart", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae0c3a94577af5271a1042757d3c8fdc1", null ], + [ "kStatusGroup_IAP", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a097d515214e888371df5c588b839529d", null ], + [ "kStatusGroup_SFA", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9cf111a176ebe1210ae6faaa950aac54", null ], + [ "kStatusGroup_SPC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7491bc6ede9a2eb6e7f292bb1530b7d7", null ], + [ "kStatusGroup_PUF", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a984927be2e0e57c4125e8e8f5d9c0f48", null ], + [ "kStatusGroup_TOUCH_PANEL", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a381f1929c41dcaef62d2d44326719db8", null ], + [ "kStatusGroup_HAL_GPIO", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a18ce0675c0cc628b2ff29a1bafce8b58", null ], + [ "kStatusGroup_HAL_UART", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6510cce112fc6ed1e0523b5d7b307ca2", null ], + [ "kStatusGroup_HAL_TIMER", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa44796b25ed6ed37f7fb25f6f4076c2d", null ], + [ "kStatusGroup_HAL_SPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aba70aa1970435b3ccd39ac54f9d7a68c", null ], + [ "kStatusGroup_HAL_I2C", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aaa30b9e3fdd5e93bae58e66521b3015d", null ], + [ "kStatusGroup_HAL_FLASH", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa5afa714de4adf37bc00faf6c3dc589e", null ], + [ "kStatusGroup_HAL_PWM", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa4609e941ad1155a86c40bdfcb20a155", null ], + [ "kStatusGroup_HAL_RNG", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa0d0535965c8d28434b036961f6a8c20", null ], + [ "kStatusGroup_HAL_I2S", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac509445aa04b715b77e6461993b50085", null ], + [ "kStatusGroup_TIMERMANAGER", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4603f8fedc8ad994788e17baae895013", null ], + [ "kStatusGroup_SERIALMANAGER", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a39a54cda2a1cac31e1c00be0eb4a7620", null ], + [ "kStatusGroup_LED", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a84ab69a4e7f3f1c39f1c3a64d74af08c", null ], + [ "kStatusGroup_BUTTON", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7415efb189bfb31491ef0ae45fb24d90", null ], + [ "kStatusGroup_EXTERN_EEPROM", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8e4a33b100580c2c1606d66d5ffdfaa3", null ], + [ "kStatusGroup_SHELL", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a660addd059be8786f2aa3d9a1a196ae1", null ], + [ "kStatusGroup_MEM_MANAGER", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29acdfe26eb8bbbaaea438470512401e09a", null ], + [ "kStatusGroup_LIST", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2e3bc103af2d3db7b628f87174d2bff8", null ], + [ "kStatusGroup_OSA", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a5b65c75456471a2536a97a30db4b8da3", null ], + [ "kStatusGroup_COMMON_TASK", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7771d56430ad7ff2553a1258aba16e02", null ], + [ "kStatusGroup_MSG", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6d0dedbec7ee218b0ae03f23edad02fd", null ], + [ "kStatusGroup_SDK_OCOTP", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a539b147c0d1409a0e11c3ae340886fa8", null ], + [ "kStatusGroup_SDK_FLEXSPINOR", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a830e5b42a05424dc026bd36d30f143a5", null ], + [ "kStatusGroup_CODEC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7c488d28bc9be2e29bd0d133bce7389a", null ], + [ "kStatusGroup_ASRC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a713723bd8764655328f1e5283a8e6020", null ], + [ "kStatusGroup_OTFAD", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4f53ab1f39031629ac12159920f0cde1", null ], + [ "kStatusGroup_SDIOSLV", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3e59e90d903b97bd45037175997f4ad6", null ], + [ "kStatusGroup_MECC", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ad85b4bef880b9407425398fc584e16a0", null ], + [ "kStatusGroup_ENET_QOS", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aae462c0663af9e2d180cd06c5798ac3b", null ], + [ "kStatusGroup_LOG", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2af6421e7b473bd882f5372ad1fa6d0e", null ], + [ "kStatusGroup_I3CBUS", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae28000753ef8046bc9b08e03fc8a1899", null ], + [ "kStatusGroup_QSCI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a025ed41827a0bd0b7bf60b853a921c7d", null ], + [ "kStatusGroup_SNT", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae67462f0d7dbac886d8a1272a29b846c", null ], + [ "kStatusGroup_QUEUEDSPI", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7712fcacc6d5e9698366daafc59ea644", null ], + [ "kStatusGroup_POWER_MANAGER", "a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6c52b0b8b2d2ca670a5f8eca66212f54", null ], + [ "kStatus_Success", "a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba829bee76c6b02225d9c891ae8ef70881", null ], + [ "kStatus_Fail", "a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba8692e71089c7e81bd5f4503ff55035db", null ], + [ "kStatus_ReadOnly", "a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba69927473662d55dfe6a4b8b1ea529f67", null ], + [ "kStatus_OutOfRange", "a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba96d166071c2c0b2672ddaa3307899a0b", null ], + [ "kStatus_InvalidArgument", "a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba9743ab3bec5065667c0b12510317e76c", null ], + [ "kStatus_Timeout", "a00087.html#gga06fc87d81c62e9abb8790b6e5713c55badf7f172a5d4f1a44d5cb8a1121dcafcb", null ], + [ "kStatus_NoTransferInProgress", "a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba82fc7f2a425a9c3cfcf6636b8c05c06c", null ], + [ "kStatus_Busy", "a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba31e314ec45f0b673257687c06b6fe764", null ], + [ "kStatus_NoData", "a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba94770b392eceab60898d03ffcf0cc145", null ] + ] ], + [ "SDK_Malloc", "a00087.html#ga4e1420d9e817ebe0e8973420411de015", null ], + [ "SDK_Free", "a00087.html#ga0be5caec9b8493d87cc849714bd47865", null ], + [ "SDK_DelayAtLeastUs", "a00087.html#ga4f9121590e5b8fe025d706ff2fe5da36", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00088.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00088.html new file mode 100644 index 0000000..5a78095 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00088.html @@ -0,0 +1,1024 @@ + + + + + + +MCUXpresso SDK API Reference Manual: IAP: In Application Programming Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
IAP: In Application Programming Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a driver for the In Application Programming (IAP) module of MCUXpresso SDK devices.

+

+Function groups

+

The driver provides a set of functions to call the on-chip in application programming interface. User code executing from on-chip RAM can call these functions to read information like part id; read and write flash, EEPROM and FAIM.

+

+Basic operations

+

The function IAP_ReadPartID() reads the part id of the board.

+

The function IAP_ReadBootCodeVersion() reads the boot code Version.

+

The function IAP_ReadUniqueID() reads the unique id of the boards.

+

The function IAP_ReinvokeISP() reinvokes the ISP mode.

+

The function IAP_ReadFactorySettings() reads the factory settings.

+

+Flash operations

+

The function IAP_PrepareSectorForWrite() prepares a sector for write or erase operation. Then, the function IAP_CopyRamToFlash() programs the flash memory.

+

The function IAP_EraseSector() erases a flash sector while the function IAP_ErasePage() erases a flash page.

+

The function IAP_BlankCheckSector() is used to blank check a sector or multiple sectors of on-chip flash memory.

+

The function IAP_Compare() is used to compare the memory contents at two locations. The user can compare several bytes (must be a multiple of 4) content in two different flash locations.

+

The function IAP_ReadFlashSignature() can get the 32-bits signature of the entire flash and the function IAP_ExtendedFlashSignatureRead() can calculate the signature of one or more flash pages.

+

+EEPROM operations

+

The function IAP_ReadEEPROMPage() reads the 128 bytes content of an EEPROM page and IAP_WriteEEPROMPage() writes 128 bytes content in an EEPROM page

+

+FAIM operations

+

The function IAP_ReadEEPROMPage() reads the 32 bits content of an FAIM page and IAP_WriteEEPROMPage() writes 32 bits content in an FAIM page

+

+Typical use case

+

+IAP Basic Operations

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/iap/iap_basic/

+

+IAP Flash Operations

+

Refer to the driver example codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/iap/iap_flash/

+

+IAP EEPROM Operations

+

Refer to the driver example codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/iap/iap_eeprom/

+

+IAP FAIM Operations

+

Refer to the driver example codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/iap/iap_faim/

+ + + + +

+Files

file  fsl_iap.h
 
+ + + + + + + + + + +

+Enumerations

enum  {
+  kStatus_IAP_Success = kStatus_Success, +
+  kStatus_IAP_InvalidCommand = MAKE_STATUS(kStatusGroup_IAP, 1U), +
+  kStatus_IAP_SrcAddrError = MAKE_STATUS(kStatusGroup_IAP, 2U), +
+  kStatus_IAP_DstAddrError, +
+  kStatus_IAP_SrcAddrNotMapped, +
+  kStatus_IAP_DstAddrNotMapped, +
+  kStatus_IAP_CountError, +
+  kStatus_IAP_InvalidSector, +
+  kStatus_IAP_SectorNotblank = MAKE_STATUS(kStatusGroup_IAP, 8U), +
+  kStatus_IAP_NotPrepared, +
+  kStatus_IAP_CompareError, +
+  kStatus_IAP_Busy = MAKE_STATUS(kStatusGroup_IAP, 11U), +
+  kStatus_IAP_ParamError, +
+  kStatus_IAP_AddrError = MAKE_STATUS(kStatusGroup_IAP, 13U), +
+  kStatus_IAP_AddrNotMapped = MAKE_STATUS(kStatusGroup_IAP, 14U), +
+  kStatus_IAP_NoPower = MAKE_STATUS(kStatusGroup_IAP, 24U), +
+  kStatus_IAP_NoClock = MAKE_STATUS(kStatusGroup_IAP, 27U), +
+  kStatus_IAP_ReinvokeISPConfig = MAKE_STATUS(kStatusGroup_IAP, 0x1CU) +
+ }
 iap status codes. More...
 
enum  _iap_commands {
+  kIapCmd_IAP_ReadFactorySettings = 40U, +
+  kIapCmd_IAP_PrepareSectorforWrite = 50U, +
+  kIapCmd_IAP_CopyRamToFlash = 51U, +
+  kIapCmd_IAP_EraseSector = 52U, +
+  kIapCmd_IAP_BlankCheckSector = 53U, +
+  kIapCmd_IAP_ReadPartId = 54U, +
+  kIapCmd_IAP_Read_BootromVersion = 55U, +
+  kIapCmd_IAP_Compare = 56U, +
+  kIapCmd_IAP_ReinvokeISP = 57U, +
+  kIapCmd_IAP_ReadUid = 58U, +
+  kIapCmd_IAP_ErasePage = 59U, +
+  kIapCmd_IAP_ReadSignature = 70U, +
+  kIapCmd_IAP_ExtendedReadSignature = 73U, +
+  kIapCmd_IAP_ReadFAIMPage = 80U, +
+  kIapCmd_IAP_WriteFAIMPage = 81U +
+ }
 iap command codes. More...
 
enum  _flash_access_time { ,
+  kFlash_IAP_TwoSystemClockTime = 1U, +
+  kFlash_IAP_ThreeSystemClockTime = 2U +
+ }
 Flash memory access time. More...
 
+ + + +

+Driver version

+#define FSL_IAP_DRIVER_VERSION   (MAKE_VERSION(2, 0, 6))
 
+ + + + + + + + + + + + + +

+Basic operations

status_t IAP_ReadPartID (uint32_t *partID)
 Read part identification number. More...
 
status_t IAP_ReadBootCodeVersion (uint32_t *bootCodeVersion)
 Read boot code version number. More...
 
void IAP_ReinvokeISP (uint8_t ispType, uint32_t *status)
 Reinvoke ISP. More...
 
status_t IAP_ReadUniqueID (uint32_t *uniqueID)
 Read unique identification. More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Flash operations

status_t IAP_PrepareSectorForWrite (uint32_t startSector, uint32_t endSector)
 Prepare sector for write operation. More...
 
status_t IAP_CopyRamToFlash (uint32_t dstAddr, uint32_t *srcAddr, uint32_t numOfBytes, uint32_t systemCoreClock)
 Copy RAM to flash. More...
 
status_t IAP_EraseSector (uint32_t startSector, uint32_t endSector, uint32_t systemCoreClock)
 Erase sector. More...
 
status_t IAP_ErasePage (uint32_t startPage, uint32_t endPage, uint32_t systemCoreClock)
 Erase page. More...
 
status_t IAP_BlankCheckSector (uint32_t startSector, uint32_t endSector)
 Blank check sector(s) More...
 
status_t IAP_Compare (uint32_t dstAddr, uint32_t *srcAddr, uint32_t numOfBytes)
 Compare memory contents of flash with ram. More...
 
status_t IAP_ExtendedFlashSignatureRead (uint32_t startPage, uint32_t endPage, uint32_t numOfStates, uint32_t *signature)
 Extended Read signature. More...
 
+ + + + + + + +

+FAIM operations

status_t IAP_ReadFAIMPage (uint32_t pageNumber, uint32_t *dstAddr)
 Read FAIM page. More...
 
status_t IAP_WriteFAIMPage (uint32_t pageNumber, uint32_t *srcAddr)
 Write FAIM page. More...
 
+

Enumeration Type Documentation

+ +
+
+ + + + +
anonymous enum
+
+ + + + + + + + + + + + + + + + + + + +
Enumerator
kStatus_IAP_Success  +

Api is executed successfully.

+
kStatus_IAP_InvalidCommand  +

Invalid command.

+
kStatus_IAP_SrcAddrError  +

Source address is not on word boundary.

+
kStatus_IAP_DstAddrError  +

Destination address is not on a correct boundary.

+
kStatus_IAP_SrcAddrNotMapped  +

Source address is not mapped in the memory map.

+
kStatus_IAP_DstAddrNotMapped  +

Destination address is not mapped in the memory map.

+
kStatus_IAP_CountError  +

Byte count is not multiple of 4 or is not a permitted value.

+
kStatus_IAP_InvalidSector  +

Sector/page number is invalid or end sector/page number is greater than start sector/page number.

+
kStatus_IAP_SectorNotblank  +

One or more sectors are not blank.

+
kStatus_IAP_NotPrepared  +

Command to prepare sector for write operation has not been executed.

+
kStatus_IAP_CompareError  +

Destination and source memory contents do not match.

+
kStatus_IAP_Busy  +

Flash programming hardware interface is busy.

+
kStatus_IAP_ParamError  +

Insufficient number of parameters or invalid parameter.

+
kStatus_IAP_AddrError  +

Address is not on word boundary.

+
kStatus_IAP_AddrNotMapped  +

Address is not mapped in the memory map.

+
kStatus_IAP_NoPower  +

Flash memory block is powered down.

+
kStatus_IAP_NoClock  +

Flash memory block or controller is not clocked.

+
kStatus_IAP_ReinvokeISPConfig  +

Reinvoke configuration error.

+
+ +
+
+ +
+
+ + + + +
enum _iap_commands
+
+ + + + + + + + + + + + + + + + +
Enumerator
kIapCmd_IAP_ReadFactorySettings  +

Read the factory settings.

+
kIapCmd_IAP_PrepareSectorforWrite  +

Prepare Sector for write.

+
kIapCmd_IAP_CopyRamToFlash  +

Copy RAM to flash.

+
kIapCmd_IAP_EraseSector  +

Erase Sector.

+
kIapCmd_IAP_BlankCheckSector  +

Blank check sector.

+
kIapCmd_IAP_ReadPartId  +

Read part id.

+
kIapCmd_IAP_Read_BootromVersion  +

Read bootrom version.

+
kIapCmd_IAP_Compare  +

Compare.

+
kIapCmd_IAP_ReinvokeISP  +

Reinvoke ISP.

+
kIapCmd_IAP_ReadUid  +

Read Uid.

+
kIapCmd_IAP_ErasePage  +

Erase Page.

+
kIapCmd_IAP_ReadSignature  +

Read Signature.

+
kIapCmd_IAP_ExtendedReadSignature  +

Extended Read Signature.

+
kIapCmd_IAP_ReadFAIMPage  +

Read FAIM page.

+
kIapCmd_IAP_WriteFAIMPage  +

Write FAIM page.

+
+ +
+
+ +
+
+ + + + +
enum _flash_access_time
+
+ + + +
Enumerator
kFlash_IAP_TwoSystemClockTime  +

1 system clock flash access time

+
kFlash_IAP_ThreeSystemClockTime  +

2 system clock flash access time

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
status_t IAP_ReadPartID (uint32_t * partID)
+
+

This function is used to read the part identification number.

+
Parameters
+ + +
partIDAddress to store the part identification number.
+
+
+
Return values
+ + +
kStatus_IAP_SuccessApi has been executed successfully.
+
+
+ +
+
+ +
+
+ + + + + + + + +
status_t IAP_ReadBootCodeVersion (uint32_t * bootCodeVersion)
+
+

This function is used to read the boot code version number.

+
Parameters
+ + +
bootCodeVersionAddress to store the boot code version.
+
+
+
Return values
+ + +
kStatus_IAP_SuccessApi has been executed successfully.
+
+
+

note Boot code version is two 32-bit words. Word 0 is the major version, word 1 is the minor version.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void IAP_ReinvokeISP (uint8_t ispType,
uint32_t * status 
)
+
+

This function is used to invoke the boot loader in ISP mode. It maps boot vectors and configures the peripherals for ISP.

+
Parameters
+ + + +
ispTypeISP type selection.
statusstore the possible status.
+
+
+
Return values
+ + +
kStatus_IAP_ReinvokeISPConfigreinvoke configuration error.
+
+
+

note The error response will be returned when IAP is disabled or an invalid ISP type selection appears. The call won't return unless an error occurs, so there can be no status code.

+ +
+
+ +
+
+ + + + + + + + +
status_t IAP_ReadUniqueID (uint32_t * uniqueID)
+
+

This function is used to read the unique id.

+
Parameters
+ + +
uniqueIDstore the uniqueID.
+
+
+
Return values
+ + +
kStatus_IAP_SuccessApi has been executed successfully.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t IAP_PrepareSectorForWrite (uint32_t startSector,
uint32_t endSector 
)
+
+

This function prepares sector(s) for write/erase operation. This function must be called before calling the IAP_CopyRamToFlash() or IAP_EraseSector() or IAP_ErasePage() function. The end sector number must be greater than or equal to the start sector number.

+
Parameters
+ + + +
startSectorStart sector number.
endSectorEnd sector number.
+
+
+
Return values
+ + + + + + +
kStatus_IAP_SuccessApi has been executed successfully.
kStatus_IAP_NoPowerFlash memory block is powered down.
kStatus_IAP_NoClockFlash memory block or controller is not clocked.
kStatus_IAP_InvalidSectorSector number is invalid or end sector number is greater than start sector number.
kStatus_IAP_BusyFlash programming hardware interface is busy.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t IAP_CopyRamToFlash (uint32_t dstAddr,
uint32_t * srcAddr,
uint32_t numOfBytes,
uint32_t systemCoreClock 
)
+
+

This function programs the flash memory. Corresponding sectors must be prepared via IAP_PrepareSectorForWrite before calling this function. The addresses should be a 256 byte boundary and the number of bytes should be 256 | 512 | 1024 | 4096.

+
Parameters
+ + + + + +
dstAddrDestination flash address where data bytes are to be written.
srcAddrSource ram address from where data bytes are to be read.
numOfBytesNumber of bytes to be written.
systemCoreClockSystemCoreClock in Hz. It is converted to KHz before calling the rom IAP function. When the flash controller has a fixed reference clock, this parameter is bypassed.
+
+
+
Return values
+ + + + + + + + + + + +
kStatus_IAP_SuccessApi has been executed successfully.
kStatus_IAP_NoPowerFlash memory block is powered down.
kStatus_IAP_NoClockFlash memory block or controller is not clocked.
kStatus_IAP_SrcAddrErrorSource address is not on word boundary.
kStatus_IAP_DstAddrErrorDestination address is not on a correct boundary.
kStatus_IAP_SrcAddrNotMappedSource address is not mapped in the memory map.
kStatus_IAP_DstAddrNotMappedDestination address is not mapped in the memory map.
kStatus_IAP_CountErrorByte count is not multiple of 4 or is not a permitted value.
kStatus_IAP_NotPreparedCommand to prepare sector for write operation has not been executed.
kStatus_IAP_BusyFlash programming hardware interface is busy.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t IAP_EraseSector (uint32_t startSector,
uint32_t endSector,
uint32_t systemCoreClock 
)
+
+

This function erases sector(s). The end sector number must be greater than or equal to the start sector number.

+
Parameters
+ + + + +
startSectorStart sector number.
endSectorEnd sector number.
systemCoreClockSystemCoreClock in Hz. It is converted to KHz before calling the rom IAP function. When the flash controller has a fixed reference clock, this parameter is bypassed.
+
+
+
Return values
+ + + + + + + +
kStatus_IAP_SuccessApi has been executed successfully.
kStatus_IAP_NoPowerFlash memory block is powered down.
kStatus_IAP_NoClockFlash memory block or controller is not clocked.
kStatus_IAP_InvalidSectorSector number is invalid or end sector number is greater than start sector number.
kStatus_IAP_NotPreparedCommand to prepare sector for write operation has not been executed.
kStatus_IAP_BusyFlash programming hardware interface is busy.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t IAP_ErasePage (uint32_t startPage,
uint32_t endPage,
uint32_t systemCoreClock 
)
+
+

This function erases page(s). The end page number must be greater than or equal to the start page number.

+
Parameters
+ + + + +
startPageStart page number.
endPageEnd page number.
systemCoreClockSystemCoreClock in Hz. It is converted to KHz before calling the rom IAP function. When the flash controller has a fixed reference clock, this parameter is bypassed.
+
+
+
Return values
+ + + + + + + +
kStatus_IAP_SuccessApi has been executed successfully.
kStatus_IAP_NoPowerFlash memory block is powered down.
kStatus_IAP_NoClockFlash memory block or controller is not clocked.
kStatus_IAP_InvalidSectorPage number is invalid or end page number is greater than start page number.
kStatus_IAP_NotPreparedCommand to prepare sector for write operation has not been executed.
kStatus_IAP_BusyFlash programming hardware interface is busy.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t IAP_BlankCheckSector (uint32_t startSector,
uint32_t endSector 
)
+
+

Blank check single or multiples sectors of flash memory. The end sector number must be greater than or equal to the start sector number. It can be used to verify the sector erasure after IAP_EraseSector call.

+
Parameters
+ + + +
startSectorStart sector number.
endSectorEnd sector number.
+
+
+
Return values
+ + + + + +
kStatus_IAP_SuccessOne or more sectors are in erased state.
kStatus_IAP_NoPowerFlash memory block is powered down.
kStatus_IAP_NoClockFlash memory block or controller is not clocked.
kStatus_IAP_SectorNotblankOne or more sectors are not blank.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
status_t IAP_Compare (uint32_t dstAddr,
uint32_t * srcAddr,
uint32_t numOfBytes 
)
+
+

This function compares the contents of flash and ram. It can be used to verify the flash memory contents after IAP_CopyRamToFlash call.

+
Parameters
+ + + + +
dstAddrDestination flash address.
srcAddrSource ram address.
numOfBytesNumber of bytes to be compared.
+
+
+
Return values
+ + + + + + + + +
kStatus_IAP_SuccessContents of flash and ram match.
kStatus_IAP_NoPowerFlash memory block is powered down.
kStatus_IAP_NoClockFlash memory block or controller is not clocked.
kStatus_IAP_AddrErrorAddress is not on word boundary.
kStatus_IAP_AddrNotMappedAddress is not mapped in the memory map.
kStatus_IAP_CountErrorByte count is not multiple of 4 or is not a permitted value.
kStatus_IAP_CompareErrorDestination and source memory contents do not match.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
status_t IAP_ExtendedFlashSignatureRead (uint32_t startPage,
uint32_t endPage,
uint32_t numOfStates,
uint32_t * signature 
)
+
+

This function calculates the signature value for one or more pages of on-chip flash memory.

+
Parameters
+ + + + + +
startPageStart page number.
endPageEnd page number.
numOfStatesNumber of wait states.
signatureAddress to store the signature value.
+
+
+
Return values
+ + +
kStatus_IAP_SuccessApi has been executed successfully.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t IAP_ReadFAIMPage (uint32_t pageNumber,
uint32_t * dstAddr 
)
+
+

This function is used to read given page of FAIM into the memory provided.

+
Parameters
+ + + +
pageNumberFAIM page number.
dstAddrMemory address to store the value read from FAIM.
+
+
+
Return values
+ + + +
kStatus_IAP_SuccessApi has been executed successfully.
kStatus_IAP_DstAddrNotMappedDestination address is not mapped in the memory map.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
status_t IAP_WriteFAIMPage (uint32_t pageNumber,
uint32_t * srcAddr 
)
+
+

This function is used to write given data in the provided memory to a page of G.

+
Parameters
+ + + +
pageNumberFAIM page number.
srcAddrMemory address holding data to be stored on to FAIM page.
+
+
+
Return values
+ + + +
kStatus_IAP_SuccessApi has been executed successfully.
kStatus_IAP_SrcAddrNotMappedSource address is not mapped in the memory map.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00088.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00088.js new file mode 100644 index 0000000..3c6fe0f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00088.js @@ -0,0 +1,55 @@ +var a00088 = +[ + [ "_iap_commands", "a00088.html#gaae3267ca6081e1f5620b0aa674c5e8ca", [ + [ "kStatus_IAP_Success", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a35e8de33bf46beecd34105c59ec2bc6e", null ], + [ "kStatus_IAP_InvalidCommand", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a254b836a21eb98b6211cefd76037dde7", null ], + [ "kStatus_IAP_SrcAddrError", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ab36f8ecf47da3052eb485015a1932c26", null ], + [ "kStatus_IAP_DstAddrError", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a37f09b865f86f3f6f58064be70121c02", null ], + [ "kStatus_IAP_SrcAddrNotMapped", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ae69151d679a249f83fde025b5562196a", null ], + [ "kStatus_IAP_DstAddrNotMapped", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a0491cac2cd13971f08f754a5365ab356", null ], + [ "kStatus_IAP_CountError", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a947c74ac4418ae34ab4b8be2416e11cb", null ], + [ "kStatus_IAP_InvalidSector", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7affa7c3fd999eb6a4558a4e981aa29ccd", null ], + [ "kStatus_IAP_SectorNotblank", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a59fbec3050069d5bf473211cad8ab817", null ], + [ "kStatus_IAP_NotPrepared", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7aea4e342b4bc05dc9f04b2a50b5ccba4f", null ], + [ "kStatus_IAP_CompareError", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ac08832cd7dd8929746e5583b85050a43", null ], + [ "kStatus_IAP_Busy", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ab171ff8674c9017605cde0067a84a375", null ], + [ "kStatus_IAP_ParamError", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a61e927398cdd5549301de26831ff5460", null ], + [ "kStatus_IAP_AddrError", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ae4a180ae087b0f4a58a7c89cb081f400", null ], + [ "kStatus_IAP_AddrNotMapped", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a98ad8dfd7c9c06637a8ef77669248d44", null ], + [ "kStatus_IAP_NoPower", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a08741d113d7dd7358c0a548ed6bedaa9", null ], + [ "kStatus_IAP_NoClock", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7adfb58b377dc75167cff2cc8e003939ff", null ], + [ "kStatus_IAP_ReinvokeISPConfig", "a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ad9d50e05078873600322a78c0bd94b35", null ], + [ "kIapCmd_IAP_ReadFactorySettings", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae8bcbc2ebc5c99fd75de395e3d18b021", null ], + [ "kIapCmd_IAP_PrepareSectorforWrite", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa5ccbc970e59fd2f3ea432bf5c00fea7e", null ], + [ "kIapCmd_IAP_CopyRamToFlash", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3fa0f400c5389e777ba1f8d6acb27d72", null ], + [ "kIapCmd_IAP_EraseSector", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa6c51c9bed9f8973d47f7b73e3592b2aa", null ], + [ "kIapCmd_IAP_BlankCheckSector", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa9b439af9906d00c0f5a83e5c878c2e50", null ], + [ "kIapCmd_IAP_ReadPartId", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa0f88b3ef422116327baca297944ca597", null ], + [ "kIapCmd_IAP_Read_BootromVersion", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caab7decacdc717da7752b3a4637a228278", null ], + [ "kIapCmd_IAP_Compare", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caabda85aeb932e76c81db46f45a8c6f656", null ], + [ "kIapCmd_IAP_ReinvokeISP", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caaf09dfcba592f2a1e02727d9eeebee15d", null ], + [ "kIapCmd_IAP_ReadUid", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae3058d7cb02b689b3993fae3c913e0f0", null ], + [ "kIapCmd_IAP_ErasePage", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae674c1ed0ecf4b2851aefc44261004bc", null ], + [ "kIapCmd_IAP_ReadSignature", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3891f9959d7cdcc9b6ad7e00816b2fc8", null ], + [ "kIapCmd_IAP_ExtendedReadSignature", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa198048f7f05d882a431c4ea4c904174e", null ], + [ "kIapCmd_IAP_ReadFAIMPage", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3556cf54991582784cca44e4604113cc", null ], + [ "kIapCmd_IAP_WriteFAIMPage", "a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa6ef0ad89e49b23cb3fc4b046013a5332", null ] + ] ], + [ "_flash_access_time", "a00088.html#ga0efb897bafe816a8a87d92045a78ee9b", [ + [ "kFlash_IAP_TwoSystemClockTime", "a00088.html#gga0efb897bafe816a8a87d92045a78ee9ba0576e02942748ad3a4b1bb0904267ad4", null ], + [ "kFlash_IAP_ThreeSystemClockTime", "a00088.html#gga0efb897bafe816a8a87d92045a78ee9ba14466fd6ca33233907a499072ed0ea04", null ] + ] ], + [ "IAP_ReadPartID", "a00088.html#ga916f8b461de93f08044df1724290dcbd", null ], + [ "IAP_ReadBootCodeVersion", "a00088.html#ga747cfb2ed95cefa6f39ae2ad089f8ade", null ], + [ "IAP_ReinvokeISP", "a00088.html#ga98407c578584b1d88d7be1b3e6d9656a", null ], + [ "IAP_ReadUniqueID", "a00088.html#ga258d8c49d494cbd0d18321af56e11440", null ], + [ "IAP_PrepareSectorForWrite", "a00088.html#ga361041aa626a50391c40c9d6936ba2c0", null ], + [ "IAP_CopyRamToFlash", "a00088.html#ga6b58df04b8aae97c7e31884f3fe3413f", null ], + [ "IAP_EraseSector", "a00088.html#ga0093db979d7b9afca6dca250f42b2eef", null ], + [ "IAP_ErasePage", "a00088.html#ga93474c7fb9be2c15eabc9dbf73c99bdb", null ], + [ "IAP_BlankCheckSector", "a00088.html#ga93a68a9ca640a51b56350d59cac4dd7c", null ], + [ "IAP_Compare", "a00088.html#ga48b79c8dc56de9714927e70ad230fa0b", null ], + [ "IAP_ExtendedFlashSignatureRead", "a00088.html#gaf3d4c53d3b36200b76c7c2e9185e9350", null ], + [ "IAP_ReadFAIMPage", "a00088.html#ga4cc5332eb289fd1c999a47c0c22b8f2c", null ], + [ "IAP_WriteFAIMPage", "a00088.html#ga87a985be230bedefd5e3560dde51d788", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00089.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00089.html new file mode 100644 index 0000000..6c14f9a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00089.html @@ -0,0 +1,312 @@ + + + + + + +MCUXpresso SDK API Reference Manual: INPUTMUX: Input Multiplexing Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
INPUTMUX: Input Multiplexing Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a driver for the Input multiplexing (INPUTMUX).
+It configures the inputs to the pin interrupt block, DMA trigger, and frequency measure function. Once configured, the clock is not needed for the inputmux.
+

+

+Input Multiplexing Driver operation

+

INPUTMUX_AttachSignal function configures the specified input

+

+Typical use case

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/inputmux

+ + + + + + +

+Files

file  fsl_inputmux.h
 
file  fsl_inputmux_connections.h
 
+ + + + + + + + + + +

+Functions

void INPUTMUX_Init (INPUTMUX_Type *base)
 Initialize INPUTMUX peripheral. More...
 
void INPUTMUX_AttachSignal (INPUTMUX_Type *base, uint32_t index, inputmux_connection_t connection)
 Attaches a signal. More...
 
void INPUTMUX_Deinit (INPUTMUX_Type *base)
 Deinitialize INPUTMUX peripheral. More...
 
+ + + + + + + + + + + + + +

+Input multiplexing connections

enum  inputmux_connection_t {
+  kINPUTMUX_DmaChannel0TrigoutToTriginChannels = 0U + (DMA_OTRIG_PMUX_ID << PMUX_SHIFT) +,
+  kINPUTMUX_DmaChannel24TrigoutToTriginChannels = 24U + (DMA_OTRIG_PMUX_ID << PMUX_SHIFT) +,
+  kINPUTMUX_DebugHaltedToSct0 = 9U + (SCT0_PMUX_ID << PMUX_SHIFT) +
+ }
 INPUTMUX connections type. More...
 
+#define DMA_OTRIG_PMUX_ID   0x00U
 Periphinmux IDs.
 
+#define SCT0_PMUX_ID   0x20U
 
+#define DMA_TRIG0_PMUX_ID   0x40U
 
+#define PMUX_SHIFT   20U
 
+ + + + +

+Driver version

+#define FSL_INPUTMUX_DRIVER_VERSION   (MAKE_VERSION(2, 0, 4))
 Group interrupt driver version for SDK.
 
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum inputmux_connection_t
+
+ + + + +
Enumerator
kINPUTMUX_DmaChannel0TrigoutToTriginChannels  +

DMA OTRIG.

+
kINPUTMUX_DmaChannel24TrigoutToTriginChannels  +

SCT INMUX.

+
kINPUTMUX_DebugHaltedToSct0  +

DMA ITRIG.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
void INPUTMUX_Init (INPUTMUX_Type * base)
+
+

This function enables the INPUTMUX clock.

+
Parameters
+ + +
baseBase address of the INPUTMUX peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void INPUTMUX_AttachSignal (INPUTMUX_Type * base,
uint32_t index,
inputmux_connection_t connection 
)
+
+

This function gates the INPUTPMUX clock.

+
Parameters
+ + + + +
baseBase address of the INPUTMUX peripheral.
indexDestination peripheral to attach the signal to.
connectionSelects connection.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void INPUTMUX_Deinit (INPUTMUX_Type * base)
+
+

This function disables the INPUTMUX clock.

+
Parameters
+ + +
baseBase address of the INPUTMUX peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00089.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00089.js new file mode 100644 index 0000000..2c72486 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00089.js @@ -0,0 +1,13 @@ +var a00089 = +[ + [ "DMA_OTRIG_PMUX_ID", "a00089.html#gaee30199bd34b2e831f916b4a17f83cfa", null ], + [ "FSL_INPUTMUX_DRIVER_VERSION", "a00089.html#ga166fc4ada71e4fa9e160774700c976d7", null ], + [ "inputmux_connection_t", "a00089.html#ga7ac6f6ac5dd2b621eabb60d2ab48163b", [ + [ "kINPUTMUX_DmaChannel0TrigoutToTriginChannels", "a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163baa76de68415d27dc96db87292ea596e47", null ], + [ "kINPUTMUX_DmaChannel24TrigoutToTriginChannels", "a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163baa405e10591d83ca35d931b53cbe7478b", null ], + [ "kINPUTMUX_DebugHaltedToSct0", "a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163ba1e042af47b407b5b414e22bab7f3e87d", null ] + ] ], + [ "INPUTMUX_Init", "a00089.html#gae02fecc3b8aab2a9d3f40f07ca7114a4", null ], + [ "INPUTMUX_AttachSignal", "a00089.html#gaa4f141e3874109e45c2a6f9be027e0ee", null ], + [ "INPUTMUX_Deinit", "a00089.html#gaf84e3b0d7a06af86ea6f1ac0d6edf382", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00090.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00090.html new file mode 100644 index 0000000..3e4cb1a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00090.html @@ -0,0 +1,148 @@ + + + + + + +MCUXpresso SDK API Reference Manual: I2C: Inter-Integrated Circuit Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
I2C: Inter-Integrated Circuit Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral driver for the Inter-Integrated Circuit (I2C) module of MCUXpresso SDK devices.

+

The I2C driver includes functional APIs and transactional APIs.

+

Functional APIs are feature/property target low-level APIs. Functional APIs can be used for the I2C master/slave initialization/configuration/operation for optimization/customization purpose. Using the functional APIs requires the knowledge of the I2C master peripheral and how to organize functional APIs to meet the application requirements. The I2C functional operation groups provide the functional APIs set.

+

Transactional APIs are transaction target high-level APIs. The transactional APIs can be used to enable the peripheral quickly and also in the application if the code size and performance of transactional APIs satisfy the requirements. If the code size and performance are critical requirements, see the transactional API implementation and write custom code using the functional APIs or accessing the hardware registers.

+

Transactional APIs support asynchronous transfer. This means that the functions I2C_MasterTransferNonBlocking() set up the interrupt non-blocking transfer. When the transfer completes, the upper layer is notified through a callback function with the status.

+

+Typical use case

+

+Master Operation in functional method

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/i2cRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/i2c

+

+Master Operation in DMA transactional method

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/i2c

+

+Slave Operation in functional method

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/i2c

+

+Slave Operation in interrupt transactional method

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/i2c

+ + + + + + + + +

+Modules

 I2C Driver
 
 I2C Master Driver
 
 I2C Slave Driver
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00090.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00090.js new file mode 100644 index 0000000..009ec66 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00090.js @@ -0,0 +1,6 @@ +var a00090 = +[ + [ "I2C Driver", "a00091.html", "a00091" ], + [ "I2C Master Driver", "a00017.html", "a00017" ], + [ "I2C Slave Driver", "a00018.html", "a00018" ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00091.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00091.html new file mode 100644 index 0000000..d5c4811 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00091.html @@ -0,0 +1,266 @@ + + + + + + +MCUXpresso SDK API Reference Manual: I2C Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ + +
+

Overview

+ + + + +

+Files

file  fsl_i2c.h
 
+ + + + + + + + + + + + + + + + + + + +

+Macros

#define I2C_RETRY_TIMES   0U /* Define to zero means keep waiting until the flag is assert/deassert. */
 Retry times for waiting flag. More...
 
+#define I2C_STAT_MSTCODE_IDLE   (0)
 Master Idle State Code.
 
+#define I2C_STAT_MSTCODE_RXREADY   (1UL)
 Master Receive Ready State Code.
 
+#define I2C_STAT_MSTCODE_TXREADY   (2UL)
 Master Transmit Ready State Code.
 
+#define I2C_STAT_MSTCODE_NACKADR   (3UL)
 Master NACK by slave on address State Code.
 
+#define I2C_STAT_MSTCODE_NACKDAT   (4UL)
 Master NACK by slave on data State Code.
 
+ + + + +

+Enumerations

enum  {
+  kStatus_I2C_Busy = MAKE_STATUS(kStatusGroup_LPC_I2C, 0), +
+  kStatus_I2C_Idle = MAKE_STATUS(kStatusGroup_LPC_I2C, 1), +
+  kStatus_I2C_Nak = MAKE_STATUS(kStatusGroup_LPC_I2C, 2), +
+  kStatus_I2C_InvalidParameter, +
+  kStatus_I2C_BitError = MAKE_STATUS(kStatusGroup_LPC_I2C, 4), +
+  kStatus_I2C_ArbitrationLost = MAKE_STATUS(kStatusGroup_LPC_I2C, 5), +
+  kStatus_I2C_NoTransferInProgress, +
+  kStatus_I2C_DmaRequestFail = MAKE_STATUS(kStatusGroup_LPC_I2C, 7), +
+  kStatus_I2C_StartStopError = MAKE_STATUS(kStatusGroup_LPC_I2C, 8), +
+  kStatus_I2C_UnexpectedState = MAKE_STATUS(kStatusGroup_LPC_I2C, 9), +
+  kStatus_I2C_Addr_Nak = MAKE_STATUS(kStatusGroup_LPC_I2C, 10), +
+  kStatus_I2C_Timeout = MAKE_STATUS(kStatusGroup_LPC_I2C, 11) +
+ }
 I2C status return codes. More...
 
+ + + + +

+Driver version

#define FSL_I2C_DRIVER_VERSION   (MAKE_VERSION(2, 1, 0))
 I2C driver version. More...
 
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_I2C_DRIVER_VERSION   (MAKE_VERSION(2, 1, 0))
+
+ +
+
+ +
+
+ + + + +
#define I2C_RETRY_TIMES   0U /* Define to zero means keep waiting until the flag is assert/deassert. */
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
anonymous enum
+
+ + + + + + + + + + + + + +
Enumerator
kStatus_I2C_Busy  +

The master is already performing a transfer.

+
kStatus_I2C_Idle  +

The slave driver is idle.

+
kStatus_I2C_Nak  +

The slave device sent a NAK in response to a byte.

+
kStatus_I2C_InvalidParameter  +

Unable to proceed due to invalid parameter.

+
kStatus_I2C_BitError  +

Transferred bit was not seen on the bus.

+
kStatus_I2C_ArbitrationLost  +

Arbitration lost error.

+
kStatus_I2C_NoTransferInProgress  +

Attempt to abort a transfer when one is not in progress.

+
kStatus_I2C_DmaRequestFail  +

DMA request failed.

+
kStatus_I2C_StartStopError  +

Start and stop error.

+
kStatus_I2C_UnexpectedState  +

Unexpected state.

+
kStatus_I2C_Addr_Nak  +

NAK received during the address probe.

+
kStatus_I2C_Timeout  +

Timeout polling status flags.

+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00091.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00091.js new file mode 100644 index 0000000..72c6973 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00091.js @@ -0,0 +1,23 @@ +var a00091 = +[ + [ "FSL_I2C_DRIVER_VERSION", "a00091.html#ga60fdaec284298758a650ce1122aef231", null ], + [ "I2C_RETRY_TIMES", "a00091.html#gaac288786aaa7d0cb947c91591baf42d7", null ], + [ "I2C_STAT_MSTCODE_IDLE", "a00091.html#ga2c6171791d36810488b3e31648156d40", null ], + [ "I2C_STAT_MSTCODE_RXREADY", "a00091.html#ga6d910a54f8271411dbed62a08ac462a2", null ], + [ "I2C_STAT_MSTCODE_TXREADY", "a00091.html#gaa638faf1f9e205ac8df1e4cf44de0a14", null ], + [ "I2C_STAT_MSTCODE_NACKADR", "a00091.html#ga5f10a8d39f171f4c6fb65bba7ff9bb2b", null ], + [ "I2C_STAT_MSTCODE_NACKDAT", "a00091.html#gac815d26a6d964108edbc558afe774828", [ + [ "kStatus_I2C_Busy", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a49091894b590d7e479605bf113918952", null ], + [ "kStatus_I2C_Idle", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a628d242f7bc0e3d5949c7f73eafaa508", null ], + [ "kStatus_I2C_Nak", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a72fd33d0b5263a63766e62f71d16be00", null ], + [ "kStatus_I2C_InvalidParameter", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a308bcea12eeef85aeac416ead81639b9", null ], + [ "kStatus_I2C_BitError", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a0db20b358696db03a068816bb72a0310", null ], + [ "kStatus_I2C_ArbitrationLost", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a139b52cc3305ec2c06d0ac94313c221f", null ], + [ "kStatus_I2C_NoTransferInProgress", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a834a772763c85b5bedf8eb0a0cfa2f9e", null ], + [ "kStatus_I2C_DmaRequestFail", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635ac0253b1c986e61b7905da4a7f1fbf844", null ], + [ "kStatus_I2C_StartStopError", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a256cb58b123f0814d020cc8449cf48d5", null ], + [ "kStatus_I2C_UnexpectedState", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a99cb29358dad3255402d30285f844632", null ], + [ "kStatus_I2C_Addr_Nak", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635adf7437bfedcc0d57338ed33f1be5c805", null ], + [ "kStatus_I2C_Timeout", "a00091.html#gga726ca809ffd3d67ab4b8476646f26635a81ad7cc198436cabbe91ea55c5288747", null ] + ] ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00092.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00092.html new file mode 100644 index 0000000..72145f6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00092.html @@ -0,0 +1,134 @@ + + + + + + +MCUXpresso SDK API Reference Manual: SPI: Serial Peripheral Interface Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
SPI: Serial Peripheral Interface Driver
+
+
+

Overview

+

SPI driver includes functional APIs and transactional APIs.

+

Functional APIs are feature/property target low-level APIs. Functional APIs can be used for SPI initialization/configuration/operation for the purpose of optimization/customization. Using the functional API requires the knowledge of the SPI peripheral and how to organize functional APIs to meet the application requirements. All functional API use the peripheral base address as the first parameter. SPI functional operation groups provide the functional API set.

+

Transactional APIs are transaction target high level APIs. Transactional APIs can be used to enable the peripheral and in the application if the code size and performance of transactional APIs satisfy the requirements. If the code size and performance are a critical requirement, see the transactional API implementation and write a custom code. All transactional APIs use the spi_handle_t as the first parameter. Initialize the handle by calling the SPI_MasterTransferCreateHandle() or SPI_SlaveTransferCreateHandle() API.

+

Transactional APIs support asynchronous transfer. This means that the functions SPI_MasterTransferNonBlocking() and SPI_SlaveTransferNonBlocking() set up the interrupt for data transfer. When the transfer completes, the upper layer is notified through a callback function with the kStatus_SPI_Idle status.

+

+Typical use case

+

+SPI master transfer using an interrupt method

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/spi

+ + + + +

+Modules

 SPI Driver
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00092.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00092.js new file mode 100644 index 0000000..2258453 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00092.js @@ -0,0 +1,4 @@ +var a00092 = +[ + [ "SPI Driver", "a00022.html", "a00022" ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00093.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00093.html new file mode 100644 index 0000000..dc5c4a4 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00093.html @@ -0,0 +1,148 @@ + + + + + + +MCUXpresso SDK API Reference Manual: USART: Universal Asynchronous Receiver/Transmitter Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
USART: Universal Asynchronous Receiver/Transmitter Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral USART driver for the Universal Synchronous Receiver/Transmitter (USART) module of MCUXpresso SDK devices. The driver does not support synchronous mode.

+

The USART driver includes two parts: functional APIs and transactional APIs.

+

Functional APIs are used for USART initialization/configuration/operation for optimization/customization purpose. Using the functional API requires the knowledge of the USART peripheral and know how to organize functional APIs to meet the application requirements. All functional API use the peripheral base address as the first parameter. USART functional operation groups provide the functional APIs set.

+

Transactional APIs can be used to enable the peripheral quickly and in the application if the code size and performance of transactional APIs can satisfy the requirements. If the code size and performance are critical requirements, see the transactional API implementation and write custom code. All transactional APIs use the usart_handle_t as the second parameter. Initialize the handle by calling the USART_TransferCreateHandle() API.

+

Transactional APIs support asynchronous transfer, which means that the functions USART_TransferSendNonBlocking() and USART_TransferReceiveNonBlocking() set up an interrupt for data transfer. When the transfer completes, the upper layer is notified through a callback function with the kStatus_USART_TxIdle and kStatus_USART_RxIdle.

+

Transactional receive APIs support the ring buffer. Prepare the memory for the ring buffer and pass in the start address and size while calling the USART_TransferCreateHandle(). If passing NULL, the ring buffer feature is disabled. When the ring buffer is enabled, the received data is saved to the ring buffer in the background. The USART_TransferReceiveNonBlocking() function first gets data from the ring buffer. If the ring buffer does not have enough data, the function first returns the data in the ring buffer and then saves the received data to user memory. When all data is received, the upper layer is informed through a callback with the kStatus_USART_RxIdle.

+

If the receive ring buffer is full, the upper layer is informed through a callback with the kStatus_USART_RxRingBufferOverrun. In the callback function, the upper layer reads data out from the ring buffer. If not, the oldest data is overwritten by the new data.

+

The ring buffer size is specified when creating the handle. Note that one byte is reserved for the ring buffer maintenance. When creating handle using the following code:

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/usart In this example, the buffer size is 32, but only 31 bytes are used for saving data.

+

+Typical use case

+

+USART Send/receive using a polling method

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/usart

+

+USART Send/receive using an interrupt method

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/usart

+

+USART Receive using the ringbuffer feature

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/usart

+

+USART Send/Receive using the DMA method

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/usart

+ + + + +

+Modules

 USART Driver
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00093.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00093.js new file mode 100644 index 0000000..9b3bb93 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00093.js @@ -0,0 +1,4 @@ +var a00093 = +[ + [ "USART Driver", "a00023.html", "a00023" ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00094.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00094.html new file mode 100644 index 0000000..24c18cc --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00094.html @@ -0,0 +1,1707 @@ + + + + + + +MCUXpresso SDK API Reference Manual: PINT: Pin Interrupt and Pattern Match Driver + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
PINT: Pin Interrupt and Pattern Match Driver
+
+
+

Overview

+

The MCUXpresso SDK provides a driver for the Pin Interrupt and Pattern match (PINT).
+
+It can configure one or more pins to generate a pin interrupt when the pin or pattern match conditions are met. The pins do not have to be configured as gpio pins however they must be connected to PINT via INPUTMUX. Only the pin interrupt or pattern match function can be active for interrupt generation. If the pin interrupt function is enabled then the pattern match function can be used for wakeup via RXEV.
+

+

+Pin Interrupt and Pattern match Driver operation

+

PINT_PinInterruptConfig() function configures the pins for pin interrupt.

+

PINT_PatternMatchConfig() function configures the pins for pattern match.

+

+Pin Interrupt use case

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/pint

+

+Pattern match use case

+

Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/pint

+ + + + +

+Files

file  fsl_pint.h
 
+ + + + +

+Typedefs

typedef void(* pint_cb_t )(pint_pin_int_t pintr, uint32_t pmatch_status)
 PINT Callback function. More...
 
+ + + + + + + + + + + + + + + + +

+Enumerations

enum  pint_pin_enable_t {
+  kPINT_PinIntEnableNone = 0U, +
+  kPINT_PinIntEnableRiseEdge = PINT_PIN_RISE_EDGE, +
+  kPINT_PinIntEnableFallEdge = PINT_PIN_FALL_EDGE, +
+  kPINT_PinIntEnableBothEdges = PINT_PIN_BOTH_EDGE, +
+  kPINT_PinIntEnableLowLevel = PINT_PIN_LOW_LEVEL, +
+  kPINT_PinIntEnableHighLevel = PINT_PIN_HIGH_LEVEL +
+ }
 PINT Pin Interrupt enable type. More...
 
enum  pint_pin_int_t {
+  kPINT_PinInt0 = 0U, +
+  kPINT_PinInt1 = 1U, +
+  kPINT_PinInt2 = 2U, +
+  kPINT_PinInt3 = 3U, +
+  kPINT_PinInt4 = 4U, +
+  kPINT_PinInt5 = 5U, +
+  kPINT_PinInt6 = 6U, +
+  kPINT_PinInt7 = 7U +
+ }
 PINT Pin Interrupt type. More...
 
enum  pint_pmatch_input_src_t {
+  kPINT_PatternMatchInp0Src = 0U, +
+  kPINT_PatternMatchInp1Src = 1U, +
+  kPINT_PatternMatchInp2Src = 2U, +
+  kPINT_PatternMatchInp3Src = 3U, +
+  kPINT_PatternMatchInp4Src = 4U, +
+  kPINT_PatternMatchInp5Src = 5U, +
+  kPINT_PatternMatchInp6Src = 6U, +
+  kPINT_PatternMatchInp7Src = 7U, +
+  kPINT_SecPatternMatchInp0Src = 0U, +
+  kPINT_SecPatternMatchInp1Src = 1U +
+ }
 PINT Pattern Match bit slice input source type. More...
 
enum  pint_pmatch_bslice_t {
+  kPINT_PatternMatchBSlice0 = 0U, +
+  kPINT_PatternMatchBSlice1 = 1U, +
+  kPINT_PatternMatchBSlice2 = 2U, +
+  kPINT_PatternMatchBSlice3 = 3U, +
+  kPINT_PatternMatchBSlice4 = 4U, +
+  kPINT_PatternMatchBSlice5 = 5U, +
+  kPINT_PatternMatchBSlice6 = 6U, +
+  kPINT_PatternMatchBSlice7 = 7U +
+ }
 PINT Pattern Match bit slice type. More...
 
enum  pint_pmatch_bslice_cfg_t {
+  kPINT_PatternMatchAlways = 0U, +
+  kPINT_PatternMatchStickyRise = 1U, +
+  kPINT_PatternMatchStickyFall = 2U, +
+  kPINT_PatternMatchStickyBothEdges = 3U, +
+  kPINT_PatternMatchHigh = 4U, +
+  kPINT_PatternMatchLow = 5U, +
+  kPINT_PatternMatchNever = 6U, +
+  kPINT_PatternMatchBothEdges = 7U +
+ }
 PINT Pattern Match configuration type. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

void PINT_Init (PINT_Type *base)
 Initialize PINT peripheral. More...
 
void PINT_PinInterruptConfig (PINT_Type *base, pint_pin_int_t intr, pint_pin_enable_t enable, pint_cb_t callback)
 Configure PINT peripheral pin interrupt. More...
 
void PINT_PinInterruptGetConfig (PINT_Type *base, pint_pin_int_t pintr, pint_pin_enable_t *enable, pint_cb_t *callback)
 Get PINT peripheral pin interrupt configuration. More...
 
void PINT_PinInterruptClrStatus (PINT_Type *base, pint_pin_int_t pintr)
 Clear Selected pin interrupt status only when the pin was triggered by edge-sensitive. More...
 
static uint32_t PINT_PinInterruptGetStatus (PINT_Type *base, pint_pin_int_t pintr)
 Get Selected pin interrupt status. More...
 
void PINT_PinInterruptClrStatusAll (PINT_Type *base)
 Clear all pin interrupts status only when pins were triggered by edge-sensitive. More...
 
static uint32_t PINT_PinInterruptGetStatusAll (PINT_Type *base)
 Get all pin interrupts status. More...
 
static void PINT_PinInterruptClrFallFlag (PINT_Type *base, pint_pin_int_t pintr)
 Clear Selected pin interrupt fall flag. More...
 
static uint32_t PINT_PinInterruptGetFallFlag (PINT_Type *base, pint_pin_int_t pintr)
 Get selected pin interrupt fall flag. More...
 
static void PINT_PinInterruptClrFallFlagAll (PINT_Type *base)
 Clear all pin interrupt fall flags. More...
 
static uint32_t PINT_PinInterruptGetFallFlagAll (PINT_Type *base)
 Get all pin interrupt fall flags. More...
 
static void PINT_PinInterruptClrRiseFlag (PINT_Type *base, pint_pin_int_t pintr)
 Clear Selected pin interrupt rise flag. More...
 
static uint32_t PINT_PinInterruptGetRiseFlag (PINT_Type *base, pint_pin_int_t pintr)
 Get selected pin interrupt rise flag. More...
 
static void PINT_PinInterruptClrRiseFlagAll (PINT_Type *base)
 Clear all pin interrupt rise flags. More...
 
static uint32_t PINT_PinInterruptGetRiseFlagAll (PINT_Type *base)
 Get all pin interrupt rise flags. More...
 
void PINT_PatternMatchConfig (PINT_Type *base, pint_pmatch_bslice_t bslice, pint_pmatch_cfg_t *cfg)
 Configure PINT pattern match. More...
 
void PINT_PatternMatchGetConfig (PINT_Type *base, pint_pmatch_bslice_t bslice, pint_pmatch_cfg_t *cfg)
 Get PINT pattern match configuration. More...
 
static uint32_t PINT_PatternMatchGetStatus (PINT_Type *base, pint_pmatch_bslice_t bslice)
 Get pattern match bit slice status. More...
 
static uint32_t PINT_PatternMatchGetStatusAll (PINT_Type *base)
 Get status of all pattern match bit slices. More...
 
uint32_t PINT_PatternMatchResetDetectLogic (PINT_Type *base)
 Reset pattern match detection logic. More...
 
static void PINT_PatternMatchEnable (PINT_Type *base)
 Enable pattern match function. More...
 
static void PINT_PatternMatchDisable (PINT_Type *base)
 Disable pattern match function. More...
 
static void PINT_PatternMatchEnableRXEV (PINT_Type *base)
 Enable RXEV output. More...
 
static void PINT_PatternMatchDisableRXEV (PINT_Type *base)
 Disable RXEV output. More...
 
void PINT_EnableCallback (PINT_Type *base)
 Enable callback. More...
 
void PINT_DisableCallback (PINT_Type *base)
 Disable callback. More...
 
void PINT_Deinit (PINT_Type *base)
 Deinitialize PINT peripheral. More...
 
void PINT_EnableCallbackByIndex (PINT_Type *base, pint_pin_int_t pintIdx)
 enable callback by pin index. More...
 
void PINT_DisableCallbackByIndex (PINT_Type *base, pint_pin_int_t pintIdx)
 disable callback by pin index. More...
 
+ + + + +

+Driver version

+#define FSL_PINT_DRIVER_VERSION   (MAKE_VERSION(2, 1, 9))
 Version 2.1.9.
 
+

Typedef Documentation

+ +
+
+ + + + +
typedef void(* pint_cb_t)(pint_pin_int_t pintr, uint32_t pmatch_status)
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum pint_pin_enable_t
+
+ + + + + + + +
Enumerator
kPINT_PinIntEnableNone  +

Do not generate Pin Interrupt.

+
kPINT_PinIntEnableRiseEdge  +

Generate Pin Interrupt on rising edge.

+
kPINT_PinIntEnableFallEdge  +

Generate Pin Interrupt on falling edge.

+
kPINT_PinIntEnableBothEdges  +

Generate Pin Interrupt on both edges.

+
kPINT_PinIntEnableLowLevel  +

Generate Pin Interrupt on low level.

+
kPINT_PinIntEnableHighLevel  +

Generate Pin Interrupt on high level.

+
+ +
+
+ +
+
+ + + + +
enum pint_pin_int_t
+
+ + + + + + + + + +
Enumerator
kPINT_PinInt0  +

Pin Interrupt 0.

+
kPINT_PinInt1  +

Pin Interrupt 1.

+
kPINT_PinInt2  +

Pin Interrupt 2.

+
kPINT_PinInt3  +

Pin Interrupt 3.

+
kPINT_PinInt4  +

Pin Interrupt 4.

+
kPINT_PinInt5  +

Pin Interrupt 5.

+
kPINT_PinInt6  +

Pin Interrupt 6.

+
kPINT_PinInt7  +

Pin Interrupt 7.

+
+ +
+
+ +
+
+ + + + +
enum pint_pmatch_input_src_t
+
+ + + + + + + + + + + +
Enumerator
kPINT_PatternMatchInp0Src  +

Input source 0.

+
kPINT_PatternMatchInp1Src  +

Input source 1.

+
kPINT_PatternMatchInp2Src  +

Input source 2.

+
kPINT_PatternMatchInp3Src  +

Input source 3.

+
kPINT_PatternMatchInp4Src  +

Input source 4.

+
kPINT_PatternMatchInp5Src  +

Input source 5.

+
kPINT_PatternMatchInp6Src  +

Input source 6.

+
kPINT_PatternMatchInp7Src  +

Input source 7.

+
kPINT_SecPatternMatchInp0Src  +

Input source 0.

+
kPINT_SecPatternMatchInp1Src  +

Input source 1.

+
+ +
+
+ +
+
+ + + + +
enum pint_pmatch_bslice_t
+
+ + + + + + + + + +
Enumerator
kPINT_PatternMatchBSlice0  +

Bit slice 0.

+
kPINT_PatternMatchBSlice1  +

Bit slice 1.

+
kPINT_PatternMatchBSlice2  +

Bit slice 2.

+
kPINT_PatternMatchBSlice3  +

Bit slice 3.

+
kPINT_PatternMatchBSlice4  +

Bit slice 4.

+
kPINT_PatternMatchBSlice5  +

Bit slice 5.

+
kPINT_PatternMatchBSlice6  +

Bit slice 6.

+
kPINT_PatternMatchBSlice7  +

Bit slice 7.

+
+ +
+
+ +
+
+ + + + +
enum pint_pmatch_bslice_cfg_t
+
+ + + + + + + + + +
Enumerator
kPINT_PatternMatchAlways  +

Always Contributes to product term match.

+
kPINT_PatternMatchStickyRise  +

Sticky Rising edge.

+
kPINT_PatternMatchStickyFall  +

Sticky Falling edge.

+
kPINT_PatternMatchStickyBothEdges  +

Sticky Rising or Falling edge.

+
kPINT_PatternMatchHigh  +

High level.

+
kPINT_PatternMatchLow  +

Low level.

+
kPINT_PatternMatchNever  +

Never contributes to product term match.

+
kPINT_PatternMatchBothEdges  +

Either rising or falling edge.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + +
void PINT_Init (PINT_Type * base)
+
+

This function initializes the PINT peripheral and enables the clock.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void PINT_PinInterruptConfig (PINT_Type * base,
pint_pin_int_t intr,
pint_pin_enable_t enable,
pint_cb_t callback 
)
+
+

This function configures a given pin interrupt.

+
Parameters
+ + + + + +
baseBase address of the PINT peripheral.
intrPin interrupt.
enableSelects detection logic.
callbackCallback.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void PINT_PinInterruptGetConfig (PINT_Type * base,
pint_pin_int_t pintr,
pint_pin_enable_tenable,
pint_cb_tcallback 
)
+
+

This function returns the configuration of a given pin interrupt.

+
Parameters
+ + + + + +
baseBase address of the PINT peripheral.
pintrPin interrupt.
enablePointer to store the detection logic.
callbackCallback.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void PINT_PinInterruptClrStatus (PINT_Type * base,
pint_pin_int_t pintr 
)
+
+

This function clears the selected pin interrupt status.

+
Parameters
+ + + +
baseBase address of the PINT peripheral.
pintrPin interrupt.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint32_t PINT_PinInterruptGetStatus (PINT_Type * base,
pint_pin_int_t pintr 
)
+
+inlinestatic
+
+

This function returns the selected pin interrupt status.

+
Parameters
+ + + +
baseBase address of the PINT peripheral.
pintrPin interrupt.
+
+
+
Return values
+ + +
status= 0 No pin interrupt request. = 1 Selected Pin interrupt request active.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void PINT_PinInterruptClrStatusAll (PINT_Type * base)
+
+

This function clears the status of all pin interrupts.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t PINT_PinInterruptGetStatusAll (PINT_Type * base)
+
+inlinestatic
+
+

This function returns the status of all pin interrupts.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
statusEach bit position indicates the status of corresponding pin interrupt. = 0 No pin interrupt request. = 1 Pin interrupt request active.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void PINT_PinInterruptClrFallFlag (PINT_Type * base,
pint_pin_int_t pintr 
)
+
+inlinestatic
+
+

This function clears the selected pin interrupt fall flag.

+
Parameters
+ + + +
baseBase address of the PINT peripheral.
pintrPin interrupt.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint32_t PINT_PinInterruptGetFallFlag (PINT_Type * base,
pint_pin_int_t pintr 
)
+
+inlinestatic
+
+

This function returns the selected pin interrupt fall flag.

+
Parameters
+ + + +
baseBase address of the PINT peripheral.
pintrPin interrupt.
+
+
+
Return values
+ + +
flag= 0 Falling edge has not been detected. = 1 Falling edge has been detected.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void PINT_PinInterruptClrFallFlagAll (PINT_Type * base)
+
+inlinestatic
+
+

This function clears the fall flag for all pin interrupts.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t PINT_PinInterruptGetFallFlagAll (PINT_Type * base)
+
+inlinestatic
+
+

This function returns the fall flag of all pin interrupts.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
flagsEach bit position indicates the falling edge detection of the corresponding pin interrupt. 0 Falling edge has not been detected. = 1 Falling edge has been detected.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void PINT_PinInterruptClrRiseFlag (PINT_Type * base,
pint_pin_int_t pintr 
)
+
+inlinestatic
+
+

This function clears the selected pin interrupt rise flag.

+
Parameters
+ + + +
baseBase address of the PINT peripheral.
pintrPin interrupt.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint32_t PINT_PinInterruptGetRiseFlag (PINT_Type * base,
pint_pin_int_t pintr 
)
+
+inlinestatic
+
+

This function returns the selected pin interrupt rise flag.

+
Parameters
+ + + +
baseBase address of the PINT peripheral.
pintrPin interrupt.
+
+
+
Return values
+ + +
flag= 0 Rising edge has not been detected. = 1 Rising edge has been detected.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void PINT_PinInterruptClrRiseFlagAll (PINT_Type * base)
+
+inlinestatic
+
+

This function clears the rise flag for all pin interrupts.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t PINT_PinInterruptGetRiseFlagAll (PINT_Type * base)
+
+inlinestatic
+
+

This function returns the rise flag of all pin interrupts.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
flagsEach bit position indicates the rising edge detection of the corresponding pin interrupt. 0 Rising edge has not been detected. = 1 Rising edge has been detected.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void PINT_PatternMatchConfig (PINT_Type * base,
pint_pmatch_bslice_t bslice,
pint_pmatch_cfg_t * cfg 
)
+
+

This function configures a given pattern match bit slice.

+
Parameters
+ + + + +
baseBase address of the PINT peripheral.
bslicePattern match bit slice number.
cfgPointer to bit slice configuration.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void PINT_PatternMatchGetConfig (PINT_Type * base,
pint_pmatch_bslice_t bslice,
pint_pmatch_cfg_t * cfg 
)
+
+

This function returns the configuration of a given pattern match bit slice.

+
Parameters
+ + + + +
baseBase address of the PINT peripheral.
bslicePattern match bit slice number.
cfgPointer to bit slice configuration.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static uint32_t PINT_PatternMatchGetStatus (PINT_Type * base,
pint_pmatch_bslice_t bslice 
)
+
+inlinestatic
+
+

This function returns the status of selected bit slice.

+
Parameters
+ + + +
baseBase address of the PINT peripheral.
bslicePattern match bit slice number.
+
+
+
Return values
+ + +
status= 0 Match has not been detected. = 1 Match has been detected.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static uint32_t PINT_PatternMatchGetStatusAll (PINT_Type * base)
+
+inlinestatic
+
+

This function returns the status of all bit slices.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
statusEach bit position indicates the match status of corresponding bit slice. = 0 Match has not been detected. = 1 Match has been detected.
+
+
+ +
+
+ +
+
+ + + + + + + + +
uint32_t PINT_PatternMatchResetDetectLogic (PINT_Type * base)
+
+

This function resets the pattern match detection logic if any of the product term is matching.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
pmstatusEach bit position indicates the match status of corresponding bit slice. = 0 Match was detected. = 1 Match was not detected.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void PINT_PatternMatchEnable (PINT_Type * base)
+
+inlinestatic
+
+

This function enables the pattern match function.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void PINT_PatternMatchDisable (PINT_Type * base)
+
+inlinestatic
+
+

This function disables the pattern match function.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void PINT_PatternMatchEnableRXEV (PINT_Type * base)
+
+inlinestatic
+
+

This function enables the pattern match RXEV output.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
static void PINT_PatternMatchDisableRXEV (PINT_Type * base)
+
+inlinestatic
+
+

This function disables the pattern match RXEV output.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void PINT_EnableCallback (PINT_Type * base)
+
+

This function enables the interrupt for the selected PINT peripheral. Although the pin(s) are monitored as soon as they are enabled, the callback function is not enabled until this function is called.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void PINT_DisableCallback (PINT_Type * base)
+
+

This function disables the interrupt for the selected PINT peripheral. Although the pins are still being monitored but the callback function is not called.

+
Parameters
+ + +
baseBase address of the peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + +
void PINT_Deinit (PINT_Type * base)
+
+

This function disables the PINT clock.

+
Parameters
+ + +
baseBase address of the PINT peripheral.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void PINT_EnableCallbackByIndex (PINT_Type * base,
pint_pin_int_t pintIdx 
)
+
+

This function enables callback by pin index instead of enabling all pins.

+
Parameters
+ + + +
baseBase address of the peripheral.
pintIdxpin index.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void PINT_DisableCallbackByIndex (PINT_Type * base,
pint_pin_int_t pintIdx 
)
+
+

This function disables callback by pin index instead of disabling all pins.

+
Parameters
+ + + +
baseBase address of the peripheral.
pintIdxpin index.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00094.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00094.js new file mode 100644 index 0000000..90e21c5 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00094.js @@ -0,0 +1,84 @@ +var a00094 = +[ + [ "FSL_PINT_DRIVER_VERSION", "a00094.html#ga2c7d26f7018dc7e75c1e090090628069", null ], + [ "pint_cb_t", "a00094.html#ga262ac9596c0926fbe5f346e0f6aaf9f5", null ], + [ "pint_pin_enable_t", "a00094.html#ga6a17e5c52721f6eb754f54cc72b58c91", [ + [ "kPINT_PinIntEnableNone", "a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91aa48de84b39b48759086f2d7ae0c8091e", null ], + [ "kPINT_PinIntEnableRiseEdge", "a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91ae873d30aec2ca54de88c69f55ea42a07", null ], + [ "kPINT_PinIntEnableFallEdge", "a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a6f54d55ac52e8e697f83637109560e89", null ], + [ "kPINT_PinIntEnableBothEdges", "a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a58ac8e76b409274b7d02ef6e9805dcef", null ], + [ "kPINT_PinIntEnableLowLevel", "a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a3bd6a570eee5c1fddd95ef2411b35a7e", null ], + [ "kPINT_PinIntEnableHighLevel", "a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91affc9b2756b7642ddb60ea78f4bbbd592", null ] + ] ], + [ "pint_pin_int_t", "a00094.html#ga15da1f70e8d0a05e9d492d01ceca7da8", [ + [ "kPINT_PinInt0", "a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a5df52c4fbb437e61b638d35cbc550162", null ], + [ "kPINT_PinInt1", "a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8ab62e1c2d3cdccef05e45ae9028cecbb4", null ], + [ "kPINT_PinInt2", "a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a81913bc912b5164bb749b6a2e8823808", null ], + [ "kPINT_PinInt3", "a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a751ce5a16f196ca04d08d2e5d65af47c", null ], + [ "kPINT_PinInt4", "a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8acf173e0dc3d44c77bb08146494a0249b", null ], + [ "kPINT_PinInt5", "a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a45fc443b2ec03c89708ac897fc3fc902", null ], + [ "kPINT_PinInt6", "a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8adf92ec20d1fa6a12bda6c42e5304cf46", null ], + [ "kPINT_PinInt7", "a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8aae1e0da9add6e3e1dd57705a682d65fa", null ] + ] ], + [ "pint_pmatch_input_src_t", "a00094.html#ga2e05f827d6a43eade4c22e9d75bc5d76", [ + [ "kPINT_PatternMatchInp0Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a51f543e6f680df9beb5841231b7b3a96", null ], + [ "kPINT_PatternMatchInp1Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a6fc5c9dbee30b375feb9ce6c86b224c2", null ], + [ "kPINT_PatternMatchInp2Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a41b057b493937cd87bc212cb2e316f8a", null ], + [ "kPINT_PatternMatchInp3Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a6be4432cb9e687d043a2c25c1af48869", null ], + [ "kPINT_PatternMatchInp4Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76aabc93fc28498f5577939f38e0513304c", null ], + [ "kPINT_PatternMatchInp5Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a78ff6e40ab17d81181284c56b62b77aa", null ], + [ "kPINT_PatternMatchInp6Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a9b2f5abc74e498a599f5c005a6cc911f", null ], + [ "kPINT_PatternMatchInp7Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a2c93115b816dc676460cfc1be85778f0", null ], + [ "kPINT_SecPatternMatchInp0Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a1f7f561990336a81a46f22395820907d", null ], + [ "kPINT_SecPatternMatchInp1Src", "a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a8cc05c9aec163085b7a2b4481fdc971d", null ] + ] ], + [ "pint_pmatch_bslice_t", "a00094.html#ga048bc24e58d7df40af2a45efaabeea9b", [ + [ "kPINT_PatternMatchBSlice0", "a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba106986aeb5e12c2b76e070def3b37d95", null ], + [ "kPINT_PatternMatchBSlice1", "a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba0d3bf0a5022325acaae66e172c984db0", null ], + [ "kPINT_PatternMatchBSlice2", "a00094.html#gga048bc24e58d7df40af2a45efaabeea9baf00e092237b1b299bdfdd901f207c468", null ], + [ "kPINT_PatternMatchBSlice3", "a00094.html#gga048bc24e58d7df40af2a45efaabeea9bae5db81838d55c8a8839b1dd47954d865", null ], + [ "kPINT_PatternMatchBSlice4", "a00094.html#gga048bc24e58d7df40af2a45efaabeea9bac0ce3f2fbc216bc3cec68c47263530c5", null ], + [ "kPINT_PatternMatchBSlice5", "a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba1ca87ca7db6ec59b675c6e70abc45da0", null ], + [ "kPINT_PatternMatchBSlice6", "a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba86a79a77b44e91f432bb8ee9070f9602", null ], + [ "kPINT_PatternMatchBSlice7", "a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba3a75ed56ef8a3429c01fc686f22b8e8a", null ] + ] ], + [ "pint_pmatch_bslice_cfg_t", "a00094.html#gae1e5bfc17515fab76a1deab955203c6a", [ + [ "kPINT_PatternMatchAlways", "a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa128703d2c2175a315aaffad869ed6a32", null ], + [ "kPINT_PatternMatchStickyRise", "a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa654c70eeed38b0be2271dc51d7cc04f5", null ], + [ "kPINT_PatternMatchStickyFall", "a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa9d2a3e9717c34de3a884b695f35a6c37", null ], + [ "kPINT_PatternMatchStickyBothEdges", "a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa059c3472509304186252b655cf486d8b", null ], + [ "kPINT_PatternMatchHigh", "a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa7dc0770cf7ffe184788c30bd1ac9c515", null ], + [ "kPINT_PatternMatchLow", "a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa3b4af984526871b66489b0eb294d2df5", null ], + [ "kPINT_PatternMatchNever", "a00094.html#ggae1e5bfc17515fab76a1deab955203c6aab5630ebfbc6e52c9b04f659918c094f2", null ], + [ "kPINT_PatternMatchBothEdges", "a00094.html#ggae1e5bfc17515fab76a1deab955203c6aaac967156901735a43316f7f1c4720328", null ] + ] ], + [ "PINT_Init", "a00094.html#gaf043d142dac622bedd50b736b52ac6e9", null ], + [ "PINT_PinInterruptConfig", "a00094.html#ga363edbba9536380728e44bd7d1a0e7df", null ], + [ "PINT_PinInterruptGetConfig", "a00094.html#ga12c568c9b7f6d46257dc63505a381701", null ], + [ "PINT_PinInterruptClrStatus", "a00094.html#gab784e6aea0129b0c90164462bd0dbac5", null ], + [ "PINT_PinInterruptGetStatus", "a00094.html#ga99a96e386a822de59ac2d60149ec47f3", null ], + [ "PINT_PinInterruptClrStatusAll", "a00094.html#gace94acb3f70964230b2606fdbeb5f58b", null ], + [ "PINT_PinInterruptGetStatusAll", "a00094.html#gab5dbaf58c90b1ef54bcd2c5dba9e178f", null ], + [ "PINT_PinInterruptClrFallFlag", "a00094.html#ga055c655c611b5645ce6903557ef809bb", null ], + [ "PINT_PinInterruptGetFallFlag", "a00094.html#gaace443444dec2e5b7e3e20cf69c53def", null ], + [ "PINT_PinInterruptClrFallFlagAll", "a00094.html#ga11c44cbe5b42c79b22a3053c85b1e5d0", null ], + [ "PINT_PinInterruptGetFallFlagAll", "a00094.html#ga58eced039e8c793b7ff148d6cfacde5b", null ], + [ "PINT_PinInterruptClrRiseFlag", "a00094.html#ga269af5856a4cfd5d2a171b4777d6884a", null ], + [ "PINT_PinInterruptGetRiseFlag", "a00094.html#gaec7a3986f92f8c11a70a80af1a93a3b6", null ], + [ "PINT_PinInterruptClrRiseFlagAll", "a00094.html#ga53dd5706866fa0313689db6e4d9c1a9b", null ], + [ "PINT_PinInterruptGetRiseFlagAll", "a00094.html#ga08b623f67c277521182f8c9e630037ae", null ], + [ "PINT_PatternMatchConfig", "a00094.html#ga1dc66cd865640c0b60eb128a868eab37", null ], + [ "PINT_PatternMatchGetConfig", "a00094.html#ga6d4f8e83cec4bc716231c97c2ceb5421", null ], + [ "PINT_PatternMatchGetStatus", "a00094.html#ga74b3eece6c6eabc38f3194b125ff80d5", null ], + [ "PINT_PatternMatchGetStatusAll", "a00094.html#ga567b159bbfa265ed02c4900769ed8fe4", null ], + [ "PINT_PatternMatchResetDetectLogic", "a00094.html#ga00d40f5f01c445206f1f800dcc7b6e89", null ], + [ "PINT_PatternMatchEnable", "a00094.html#ga8911d499fb65ffe496c01f65bad9314f", null ], + [ "PINT_PatternMatchDisable", "a00094.html#ga4dd886dc387a64a5cb146ccd7297e1e1", null ], + [ "PINT_PatternMatchEnableRXEV", "a00094.html#gaf5754b4b1d1436c359dde18101657d4e", null ], + [ "PINT_PatternMatchDisableRXEV", "a00094.html#ga73f0e7280f898bf99fe92b3519878a77", null ], + [ "PINT_EnableCallback", "a00094.html#gac6b1406205adace6696a1647250ad76d", null ], + [ "PINT_DisableCallback", "a00094.html#gada262638d555d9a503ddcdbed24ec475", null ], + [ "PINT_Deinit", "a00094.html#ga78ffa3e09e17db8dc6a9038123ad1c46", null ], + [ "PINT_EnableCallbackByIndex", "a00094.html#ga2cb0ee73a24657dd6994cb00b78c3137", null ], + [ "PINT_DisableCallbackByIndex", "a00094.html#gad7300bf374c0cdc65fadff76f3ee7e5c", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00095.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00095.html new file mode 100644 index 0000000..4c5e2d8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00095.html @@ -0,0 +1,1071 @@ + + + + + + +MCUXpresso SDK API Reference Manual: SWM: Switch Matrix Module + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
SWM: Switch Matrix Module
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral driver for the Switch Matrix Module (SWM) module of MCUXpresso SDK devices.

+

+SWM: Switch Matrix Module

+

+SWM Operations

+

The function SWM_SetMovablePinSelect() will selects a movable pin designated by its GPIO port and bit numbers to a function.

+

The function SWM_SetFixedMovablePinSelect() will selects a fixed movable pin designated by its GPIO port and bit numbers to a function.

+

The function SWM_SetFixedPinSelect() will enables a fixed-pin function in PINENABLE0 or PINENABLE1.

+ + + + +

+Files

file  fsl_swm.h
 
+ + + + + + + +

+Functions

void SWM_SetMovablePinSelect (SWM_Type *base, swm_select_movable_t func, swm_port_pin_type_t swm_port_pin)
 Assignment of digital peripheral functions to pins. More...
 
void SWM_SetFixedPinSelect (SWM_Type *base, swm_select_fixed_pin_t func, bool enable)
 Enable the fixed-pin function. More...
 
+ + + + + + + + + + +

+swm connections

enum  swm_port_pin_type_t {
+  kSWM_PortPin_P0_0 = 0U, +
+  kSWM_PortPin_P0_1 = 1U, +
+  kSWM_PortPin_P0_2 = 2U, +
+  kSWM_PortPin_P0_3 = 3U, +
+  kSWM_PortPin_P0_4 = 4U, +
+  kSWM_PortPin_P0_5 = 5U, +
+  kSWM_PortPin_P0_6 = 6U, +
+  kSWM_PortPin_P0_7 = 7U, +
+  kSWM_PortPin_P0_8 = 8U, +
+  kSWM_PortPin_P0_9 = 9U, +
+  kSWM_PortPin_P0_10 = 10U, +
+  kSWM_PortPin_P0_11 = 11U, +
+  kSWM_PortPin_P0_12 = 12U, +
+  kSWM_PortPin_P0_13 = 13U, +
+  kSWM_PortPin_P0_14 = 14U, +
+  kSWM_PortPin_P0_15 = 15U, +
+  kSWM_PortPin_P0_16 = 16U, +
+  kSWM_PortPin_P0_17 = 17U, +
+  kSWM_PortPin_P0_18 = 18U, +
+  kSWM_PortPin_P0_19 = 19U, +
+  kSWM_PortPin_P0_20 = 20U, +
+  kSWM_PortPin_P0_21 = 21U, +
+  kSWM_PortPin_P0_22 = 22U, +
+  kSWM_PortPin_P0_23 = 23U, +
+  kSWM_PortPin_P0_24 = 24U, +
+  kSWM_PortPin_P0_25 = 25U, +
+  kSWM_PortPin_P0_26 = 26U, +
+  kSWM_PortPin_P0_27 = 27U, +
+  kSWM_PortPin_P0_28 = 28U, +
+  kSWM_PortPin_P0_29 = 29U, +
+  kSWM_PortPin_P0_30 = 30U, +
+  kSWM_PortPin_P0_31 = 31U, +
+  kSWM_PortPin_P1_0 = 32U, +
+  kSWM_PortPin_P1_1 = 33U, +
+  kSWM_PortPin_P1_2 = 34U, +
+  kSWM_PortPin_P1_3 = 35U, +
+  kSWM_PortPin_P1_4 = 36U, +
+  kSWM_PortPin_P1_5 = 37U, +
+  kSWM_PortPin_P1_6 = 38U, +
+  kSWM_PortPin_P1_7 = 39U, +
+  kSWM_PortPin_P1_8 = 40U, +
+  kSWM_PortPin_P1_9 = 41U, +
+  kSWM_PortPin_P1_10 = 42U, +
+  kSWM_PortPin_P1_11 = 43U, +
+  kSWM_PortPin_P1_12 = 44U, +
+  kSWM_PortPin_P1_13 = 45U, +
+  kSWM_PortPin_P1_14 = 46U, +
+  kSWM_PortPin_P1_15 = 47U, +
+  kSWM_PortPin_P1_16 = 48U, +
+  kSWM_PortPin_P1_17 = 49U, +
+  kSWM_PortPin_P1_18 = 50U, +
+  kSWM_PortPin_P1_19 = 51U, +
+  kSWM_PortPin_P1_20 = 52U, +
+  kSWM_PortPin_P1_21 = 53U, +
+  kSWM_PortPin_Reset = 0xffU +
+ }
 SWM port_pin number. More...
 
enum  swm_select_movable_t {
+  kSWM_USART0_TXD = 0U, +
+  kSWM_USART0_RXD = 1U, +
+  kSWM_USART0_RTS = 2U, +
+  kSWM_USART0_CTS = 3U, +
+  kSWM_USART0_SCLK = 4U, +
+  kSWM_USART1_TXD = 5U, +
+  kSWM_USART1_RXD = 6U, +
+  kSWM_USART1_RTS = 7U, +
+  kSWM_USART1_CTS = 8U, +
+  kSWM_USART1_SCLK = 9U, +
+  kSWM_USART2_TXD = 10U, +
+  kSWM_USART2_RXD = 11U, +
+  kSWM_USART2_RTS = 12U, +
+  kSWM_USART2_CTS = 13U, +
+  kSWM_USART2_SCLK = 14U, +
+  kSWM_SPI0_SCK = 15U, +
+  kSWM_SPI0_MOSI = 16U, +
+  kSWM_SPI0_MISO = 17U, +
+  kSWM_SPI0_SSEL0 = 18U, +
+  kSWM_SPI0_SSEL1 = 19U, +
+  kSWM_SPI0_SSEL2 = 20U, +
+  kSWM_SPI0_SSEL3 = 21U, +
+  kSWM_SPI1_SCK = 22U, +
+  kSWM_SPI1_MOSI = 23U, +
+  kSWM_SPI1_MISO = 24U, +
+  kSWM_SPI1_SSEL0 = 25U, +
+  kSWM_SPI1_SSEL1 = 26U, +
+  kSWM_SCT_PIN0 = 27U, +
+  kSWM_SCT_PIN1 = 28U, +
+  kSWM_SCT_PIN2 = 29U, +
+  kSWM_SCT_PIN3 = 30U, +
+  kSWM_SCT_OUT0 = 31U, +
+  kSWM_SCT_OUT1 = 32U, +
+  kSWM_SCT_OUT2 = 33U, +
+  kSWM_SCT_OUT3 = 34U, +
+  kSWM_SCT_OUT4 = 35U, +
+  kSWM_SCT_OUT5 = 36U, +
+  kSWM_SCT_OUT6 = 37U, +
+  kSWM_I2C1_SDA = 38U, +
+  kSWM_I2C1_SCL = 39U, +
+  kSWM_I2C2_SDA = 40U, +
+  kSWM_I2C2_SCL = 41U, +
+  kSWM_I2C3_SDA = 42U, +
+  kSWM_I2C3_SCL = 43U, +
+  kSWM_ACMP_OUT = 44U, +
+  kSWM_CLKOUT = 45U, +
+  kSWM_GPIO_INT_BMAT = 46U, +
+  kSWM_USART3_TXD = 47U, +
+  kSWM_USART3_RXD = 48U, +
+  kSWM_USART3_SCLK = 49U, +
+  kSWM_USART4_TXD = 50U, +
+  kSWM_USART4_RXD = 51U, +
+  kSWM_USART4_SCLK = 52U, +
+  kSWM_T0_MAT_CHN0 = 53U, +
+  kSWM_T0_MAT_CHN1 = 54U, +
+  kSWM_T0_MAT_CHN2 = 55U, +
+  kSWM_T0_MAT_CHN3 = 56U, +
+  kSWM_T0_CAP_CHN0 = 57U, +
+  kSWM_T0_CAP_CHN1 = 58U, +
+  kSWM_T0_CAP_CHN2 = 59U, +
+  kSWM_MOVABLE_NUM_FUNCS = 60U +
+ }
 SWM movable selection. More...
 
enum  swm_select_fixed_pin_t {
+  kSWM_ACMP_INPUT1 = SWM_PINENABLE0_ACMP_I1_MASK, +
+  kSWM_ACMP_INPUT2 = SWM_PINENABLE0_ACMP_I2_MASK, +
+  kSWM_ACMP_INPUT3 = SWM_PINENABLE0_ACMP_I3_MASK, +
+  kSWM_ACMP_INPUT4 = SWM_PINENABLE0_ACMP_I4_MASK, +
+  kSWM_ACMP_INPUT5 = SWM_PINENABLE0_ACMP_I5_MASK, +
+  kSWM_SWCLK = SWM_PINENABLE0_SWCLK_MASK, +
+  kSWM_SWDIO = SWM_PINENABLE0_SWDIO_MASK, +
+  kSWM_XTALIN = SWM_PINENABLE0_XTALIN_MASK, +
+  kSWM_XTALOUT = SWM_PINENABLE0_XTALOUT_MASK, +
+  kSWM_RESETN = SWM_PINENABLE0_RESETN_MASK, +
+  kSWM_CLKIN = SWM_PINENABLE0_CLKIN_MASK, +
+  kSWM_VDDCMP = SWM_PINENABLE0_VDDCMP_MASK, +
+  kSWM_I2C0_SDA = SWM_PINENABLE0_I2C0_SDA_MASK, +
+  kSWM_I2C0_SCL = SWM_PINENABLE0_I2C0_SCL_MASK, +
+  kSWM_ADC_CHN0 = SWM_PINENABLE0_ADC_0_MASK, +
+  kSWM_ADC_CHN1 = SWM_PINENABLE0_ADC_1_MASK, +
+  kSWM_ADC_CHN2 = SWM_PINENABLE0_ADC_2_MASK, +
+  kSWM_ADC_CHN3 = SWM_PINENABLE0_ADC_3_MASK, +
+  kSWM_ADC_CHN4 = SWM_PINENABLE0_ADC_4_MASK, +
+  kSWM_ADC_CHN5 = SWM_PINENABLE0_ADC_5_MASK, +
+  kSWM_ADC_CHN6 = SWM_PINENABLE0_ADC_6_MASK, +
+  kSWM_ADC_CHN7 = SWM_PINENABLE0_ADC_7_MASK, +
+  kSWM_ADC_CHN8 = SWM_PINENABLE0_ADC_8_MASK, +
+  kSWM_ADC_CHN9 = SWM_PINENABLE0_ADC_9_MASK, +
+  kSWM_ADC_CHN10 = SWM_PINENABLE0_ADC_10_MASK, +
+  kSWM_ADC_CHN11 = SWM_PINENABLE0_ADC_11_MASK, +
+  kSWM_DAC_OUT0 = SWM_PINENABLE0_DACOUT0_MASK, +
+  kSWM_DAC_OUT1 = SWM_PINENABLE0_DACOUT1_MASK, +
+  kSWM_CAPT_X0, +
+  kSWM_CAPT_X1 = SWM_PINENABLE0_CAPT_X1_MASK, +
+  kSWM_CAPT_X2 = SWM_PINENABLE0_CAPT_X2_MASK, +
+  kSWM_CAPT_X3 = (int)SWM_PINENABLE0_CAPT_X3_MASK, +
+  kSWM_CAPT_X4 = (int)(SWM_PINENABLE1_CAPT_X4_MASK | 0x80000000U), +
+  kSWM_CAPT_X5 = (int)(SWM_PINENABLE1_CAPT_X5_MASK | 0x80000000U), +
+  kSWM_CAPT_X6 = (int)(SWM_PINENABLE1_CAPT_X6_MASK | 0x80000000U), +
+  kSWM_CAPT_X7 = (int)(SWM_PINENABLE1_CAPT_X7_MASK | 0x80000000U), +
+  kSWM_CAPT_X8 = (int)(SWM_PINENABLE1_CAPT_X8_MASK | 0x80000000U), +
+  kSWM_CAPT_YL, +
+  kSWM_CAPT_YH = (int)(SWM_PINENABLE1_CAPT_YH_MASK | 0x80000000U), +
+  kSWM_FIXEDPIN_NUM_FUNCS = (int)0x80000041U +
+ }
 SWM fixed pin selection. More...
 
+ + + + +

+Driver version

+#define FSL_SWM_DRIVER_VERSION   (MAKE_VERSION(2, 0, 2))
 Version 2.0.2.
 
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum swm_port_pin_type_t
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerator
kSWM_PortPin_P0_0  +

port_pin number P0_0.

+
kSWM_PortPin_P0_1  +

port_pin number P0_1.

+
kSWM_PortPin_P0_2  +

port_pin number P0_2.

+
kSWM_PortPin_P0_3  +

port_pin number P0_3.

+
kSWM_PortPin_P0_4  +

port_pin number P0_4.

+
kSWM_PortPin_P0_5  +

port_pin number P0_5.

+
kSWM_PortPin_P0_6  +

port_pin number P0_6.

+
kSWM_PortPin_P0_7  +

port_pin number P0_7.

+
kSWM_PortPin_P0_8  +

port_pin number P0_8.

+
kSWM_PortPin_P0_9  +

port_pin number P0_9.

+
kSWM_PortPin_P0_10  +

port_pin number P0_10.

+
kSWM_PortPin_P0_11  +

port_pin number P0_11.

+
kSWM_PortPin_P0_12  +

port_pin number P0_12.

+
kSWM_PortPin_P0_13  +

port_pin number P0_13.

+
kSWM_PortPin_P0_14  +

port_pin number P0_14.

+
kSWM_PortPin_P0_15  +

port_pin number P0_15.

+
kSWM_PortPin_P0_16  +

port_pin number P0_16.

+
kSWM_PortPin_P0_17  +

port_pin number P0_17.

+
kSWM_PortPin_P0_18  +

port_pin number P0_18.

+
kSWM_PortPin_P0_19  +

port_pin number P0_19.

+
kSWM_PortPin_P0_20  +

port_pin number P0_20.

+
kSWM_PortPin_P0_21  +

port_pin number P0_21.

+
kSWM_PortPin_P0_22  +

port_pin number P0_22.

+
kSWM_PortPin_P0_23  +

port_pin number P0_23.

+
kSWM_PortPin_P0_24  +

port_pin number P0_24.

+
kSWM_PortPin_P0_25  +

port_pin number P0_25.

+
kSWM_PortPin_P0_26  +

port_pin number P0_26.

+
kSWM_PortPin_P0_27  +

port_pin number P0_27.

+
kSWM_PortPin_P0_28  +

port_pin number P0_28.

+
kSWM_PortPin_P0_29  +

port_pin number P0_29.

+
kSWM_PortPin_P0_30  +

port_pin number P0_30.

+
kSWM_PortPin_P0_31  +

port_pin number P0_31.

+
kSWM_PortPin_P1_0  +

port_pin number P1_0.

+
kSWM_PortPin_P1_1  +

port_pin number P1_1.

+
kSWM_PortPin_P1_2  +

port_pin number P1_2.

+
kSWM_PortPin_P1_3  +

port_pin number P1_3.

+
kSWM_PortPin_P1_4  +

port_pin number P1_4.

+
kSWM_PortPin_P1_5  +

port_pin number P1_5.

+
kSWM_PortPin_P1_6  +

port_pin number P1_6.

+
kSWM_PortPin_P1_7  +

port_pin number P1_7.

+
kSWM_PortPin_P1_8  +

port_pin number P1_8.

+
kSWM_PortPin_P1_9  +

port_pin number P1_9.

+
kSWM_PortPin_P1_10  +

port_pin number P1_10.

+
kSWM_PortPin_P1_11  +

port_pin number P1_11.

+
kSWM_PortPin_P1_12  +

port_pin number P1_12.

+
kSWM_PortPin_P1_13  +

port_pin number P1_13.

+
kSWM_PortPin_P1_14  +

port_pin number P1_14.

+
kSWM_PortPin_P1_15  +

port_pin number P1_15.

+
kSWM_PortPin_P1_16  +

port_pin number P1_16.

+
kSWM_PortPin_P1_17  +

port_pin number P1_17.

+
kSWM_PortPin_P1_18  +

port_pin number P1_18.

+
kSWM_PortPin_P1_19  +

port_pin number P1_19.

+
kSWM_PortPin_P1_20  +

port_pin number P1_20.

+
kSWM_PortPin_P1_21  +

port_pin number P1_21.

+
kSWM_PortPin_Reset  +

port_pin reset number.

+
+ +
+
+ +
+
+ + + + +
enum swm_select_movable_t
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerator
kSWM_USART0_TXD  +

Movable function as USART0_TXD.

+
kSWM_USART0_RXD  +

Movable function as USART0_RXD.

+
kSWM_USART0_RTS  +

Movable function as USART0_RTS.

+
kSWM_USART0_CTS  +

Movable function as USART0_CTS.

+
kSWM_USART0_SCLK  +

Movable function as USART0_SCLK.

+
kSWM_USART1_TXD  +

Movable function as USART1_TXD.

+
kSWM_USART1_RXD  +

Movable function as USART1_RXD.

+
kSWM_USART1_RTS  +

Movable function as USART1_RTS.

+
kSWM_USART1_CTS  +

Movable function as USART1_CTS.

+
kSWM_USART1_SCLK  +

Movable function as USART1_SCLK.

+
kSWM_USART2_TXD  +

Movable function as USART2_TXD.

+
kSWM_USART2_RXD  +

Movable function as USART2_RXD.

+
kSWM_USART2_RTS  +

Movable function as USART2_RTS.

+
kSWM_USART2_CTS  +

Movable function as USART2_CTS.

+
kSWM_USART2_SCLK  +

Movable function as USART2_SCLK.

+
kSWM_SPI0_SCK  +

Movable function as SPI0_SCK.

+
kSWM_SPI0_MOSI  +

Movable function as SPI0_MOSI.

+
kSWM_SPI0_MISO  +

Movable function as SPI0_MISO.

+
kSWM_SPI0_SSEL0  +

Movable function as SPI0_SSEL0.

+
kSWM_SPI0_SSEL1  +

Movable function as SPI0_SSEL1.

+
kSWM_SPI0_SSEL2  +

Movable function as SPI0_SSEL2.

+
kSWM_SPI0_SSEL3  +

Movable function as SPI0_SSEL3.

+
kSWM_SPI1_SCK  +

Movable function as SPI1_SCK.

+
kSWM_SPI1_MOSI  +

Movable function as SPI1_MOSI.

+
kSWM_SPI1_MISO  +

Movable function as SPI1_MISO.

+
kSWM_SPI1_SSEL0  +

Movable function as SPI1_SSEL0.

+
kSWM_SPI1_SSEL1  +

Movable function as SPI1_SSEL1.

+
kSWM_SCT_PIN0  +

Movable function as SCT_PIN0.

+
kSWM_SCT_PIN1  +

Movable function as SCT_PIN1.

+
kSWM_SCT_PIN2  +

Movable function as SCT_PIN2.

+
kSWM_SCT_PIN3  +

Movable function as SCT_PIN3.

+
kSWM_SCT_OUT0  +

Movable function as SCT_OUT0.

+
kSWM_SCT_OUT1  +

Movable function as SCT_OUT1.

+
kSWM_SCT_OUT2  +

Movable function as SCT_OUT2.

+
kSWM_SCT_OUT3  +

Movable function as SCT_OUT3.

+
kSWM_SCT_OUT4  +

Movable function as SCT_OUT4.

+
kSWM_SCT_OUT5  +

Movable function as SCT_OUT5.

+
kSWM_SCT_OUT6  +

Movable function as SCT_OUT6.

+
kSWM_I2C1_SDA  +

Movable function as I2C1_SDA.

+
kSWM_I2C1_SCL  +

Movable function as I2C1_SCL.

+
kSWM_I2C2_SDA  +

Movable function as I2C2_SDA.

+
kSWM_I2C2_SCL  +

Movable function as I2C2_SCL.

+
kSWM_I2C3_SDA  +

Movable function as I2C3_SDA.

+
kSWM_I2C3_SCL  +

Movable function as I2C3_SCL.

+
kSWM_ACMP_OUT  +

Movable function as ACMP_OUT.

+
kSWM_CLKOUT  +

Movable function as CLKOUT.

+
kSWM_GPIO_INT_BMAT  +

Movable function as GPIO_INT_BMAT.

+
kSWM_USART3_TXD  +

Movable function as USART3_TXD.

+
kSWM_USART3_RXD  +

Movable function as USART3_RXD.

+
kSWM_USART3_SCLK  +

Movable function as USART3_SCLK.

+
kSWM_USART4_TXD  +

Movable function as USART4_TXD.

+
kSWM_USART4_RXD  +

Movable function as USART4_RXD.

+
kSWM_USART4_SCLK  +

Movable function as USART4_SCLK.

+
kSWM_T0_MAT_CHN0  +

Movable function as Timer Match Channel 0.

+
kSWM_T0_MAT_CHN1  +

Movable function as Timer Match Channel 1.

+
kSWM_T0_MAT_CHN2  +

Movable function as Timer Match Channel 2.

+
kSWM_T0_MAT_CHN3  +

Movable function as Timer Match Channel 3.

+
kSWM_T0_CAP_CHN0  +

Movable function as Timer Capture Channel 0.

+
kSWM_T0_CAP_CHN1  +

Movable function as Timer Capture Channel 1.

+
kSWM_T0_CAP_CHN2  +

Movable function as Timer Capture Channel 2.

+
kSWM_MOVABLE_NUM_FUNCS  +

Movable function number.

+
+ +
+
+ +
+
+ + + + +
enum swm_select_fixed_pin_t
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerator
kSWM_ACMP_INPUT1  +

Fixed-pin function as ACMP_INPUT1.

+
kSWM_ACMP_INPUT2  +

Fixed-pin function as ACMP_INPUT2.

+
kSWM_ACMP_INPUT3  +

Fixed-pin function as ACMP_INPUT3.

+
kSWM_ACMP_INPUT4  +

Fixed-pin function as ACMP_INPUT4.

+
kSWM_ACMP_INPUT5  +

Fixed-pin function as ACMP_INPUT5.

+
kSWM_SWCLK  +

Fixed-pin function as SWCLK.

+
kSWM_SWDIO  +

Fixed-pin function as SWDIO.

+
kSWM_XTALIN  +

Fixed-pin function as XTALIN.

+
kSWM_XTALOUT  +

Fixed-pin function as XTALOUT.

+
kSWM_RESETN  +

Fixed-pin function as RESETN.

+
kSWM_CLKIN  +

Fixed-pin function as CLKIN.

+
kSWM_VDDCMP  +

Fixed-pin function as VDDCMP.

+
kSWM_I2C0_SDA  +

Fixed-pin function as I2C0_SDA.

+
kSWM_I2C0_SCL  +

Fixed-pin function as I2C0_SCL.

+
kSWM_ADC_CHN0  +

Fixed-pin function as ADC_CHN0.

+
kSWM_ADC_CHN1  +

Fixed-pin function as ADC_CHN1.

+
kSWM_ADC_CHN2  +

Fixed-pin function as ADC_CHN2.

+
kSWM_ADC_CHN3  +

Fixed-pin function as ADC_CHN3.

+
kSWM_ADC_CHN4  +

Fixed-pin function as ADC_CHN4.

+
kSWM_ADC_CHN5  +

Fixed-pin function as ADC_CHN5.

+
kSWM_ADC_CHN6  +

Fixed-pin function as ADC_CHN6.

+
kSWM_ADC_CHN7  +

Fixed-pin function as ADC_CHN7.

+
kSWM_ADC_CHN8  +

Fixed-pin function as ADC_CHN8.

+
kSWM_ADC_CHN9  +

Fixed-pin function as ADC_CHN9.

+
kSWM_ADC_CHN10  +

Fixed-pin function as ADC_CHN10.

+
kSWM_ADC_CHN11  +

Fixed-pin function as ADC_CHN11.

+
kSWM_DAC_OUT0  +

Fixed-pin function as DACOUT0.

+
kSWM_DAC_OUT1  +

Fixed-pin function as DACOUT1.

+
kSWM_CAPT_X0  +

Fixed-pin function as CAPT_X0, an X capacitor(a mutual capacitance touch sensor) .

+
kSWM_CAPT_X1  +

Fixed-pin function as CAPT_X1.

+
kSWM_CAPT_X2  +

Fixed-pin function as CAPT_X2.

+
kSWM_CAPT_X3  +

Fixed-pin function as CAPT_X3.

+
kSWM_CAPT_X4  +

Fixed-pin function as CAPT_X4.

+
kSWM_CAPT_X5  +

Fixed-pin function as CAPT_X5.

+
kSWM_CAPT_X6  +

Fixed-pin function as CAPT_X6.

+
kSWM_CAPT_X7  +

Fixed-pin function as CAPT_X7.

+
kSWM_CAPT_X8  +

Fixed-pin function as CAPT_X8.

+
kSWM_CAPT_YL  +

Fixed-pin function as CAPT_YL, an Y capacitor(the measurement capacitor) .

+
kSWM_CAPT_YH  +

Fixed-pin function as CAPT_YH.

+
kSWM_FIXEDPIN_NUM_FUNCS  +

Fixed-pin function number.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SWM_SetMovablePinSelect (SWM_Type * base,
swm_select_movable_t func,
swm_port_pin_type_t swm_port_pin 
)
+
+

This function will selects a pin (designated by its GPIO port and bit numbers) to a function.

+
Parameters
+ + + + +
baseSWM peripheral base address.
funcany function name that is movable.
swm_port_pinany pin which has a GPIO port number and bit number.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SWM_SetFixedPinSelect (SWM_Type * base,
swm_select_fixed_pin_t func,
bool enable 
)
+
+

This function will enables a fixed-pin function in PINENABLE0 or PINENABLE1.

+
Parameters
+ + + + +
baseSWM peripheral base address.
funcany function name that is fixed pin.
enableenable or disable.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00095.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00095.js new file mode 100644 index 0000000..277203e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00095.js @@ -0,0 +1,168 @@ +var a00095 = +[ + [ "FSL_SWM_DRIVER_VERSION", "a00095.html#gafa0f32bbd70b73222cc401d997b1f243", null ], + [ "swm_port_pin_type_t", "a00095.html#gaca9c780388e187444bfa31a6bcc72d35", [ + [ "kSWM_PortPin_P0_0", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35abf7ea2c0f06252d5e966ca63f23dba2e", null ], + [ "kSWM_PortPin_P0_1", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a9010bbdc4d0ba698a18c200f27586c5a", null ], + [ "kSWM_PortPin_P0_2", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aa8e8084f5ea75a2e776f4a8f8a8d5e61", null ], + [ "kSWM_PortPin_P0_3", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a3a31a8f0c23e7d75db386e0f1705fcb8", null ], + [ "kSWM_PortPin_P0_4", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a933c38c001bf24a62f0c8bf62e9bbbfb", null ], + [ "kSWM_PortPin_P0_5", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a75b66d0e23730af2446bdec683db11d3", null ], + [ "kSWM_PortPin_P0_6", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a4e2797855da4686eb7de9e75c5034d66", null ], + [ "kSWM_PortPin_P0_7", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a8a3af6c1f0f5791666b2c8409321ee0b", null ], + [ "kSWM_PortPin_P0_8", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ab0f66b94af6c72515e705077a0aea28b", null ], + [ "kSWM_PortPin_P0_9", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ace9b73074e1c03234c89b40ecd52a1e6", null ], + [ "kSWM_PortPin_P0_10", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35adb2af26fbb96cad1a3f4d666e3759e39", null ], + [ "kSWM_PortPin_P0_11", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a6514b3be861759fdc7f645c4a8190176", null ], + [ "kSWM_PortPin_P0_12", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a473548308d7fac0d5fa4ac959f81e444", null ], + [ "kSWM_PortPin_P0_13", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0efea555d71ff08c985b3c002e49f25a", null ], + [ "kSWM_PortPin_P0_14", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae2a752505db2acdb06e6047c3c447f63", null ], + [ "kSWM_PortPin_P0_15", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a21dd2c94b4ab7b133e9818a5a394f967", null ], + [ "kSWM_PortPin_P0_16", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0c38ea80f06768e2ad6282fbc11d5187", null ], + [ "kSWM_PortPin_P0_17", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a74b6edcb7dba9f95182a4faa57dd110d", null ], + [ "kSWM_PortPin_P0_18", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1eb0795f2598b9acf64e7abcb63f78d5", null ], + [ "kSWM_PortPin_P0_19", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a488a17a4e210b5000df9ecc534d24c8b", null ], + [ "kSWM_PortPin_P0_20", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1127b8f8732d34f2c80daf825bb14853", null ], + [ "kSWM_PortPin_P0_21", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a8ec22695a3c8fbc028cc86299ca76b9a", null ], + [ "kSWM_PortPin_P0_22", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35af2a8176b461addf3d18b1128800dd7ef", null ], + [ "kSWM_PortPin_P0_23", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae6795c51fac27d7426848568f125a6e8", null ], + [ "kSWM_PortPin_P0_24", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ac61483b0bbae6a06d6789e41aaf450fc", null ], + [ "kSWM_PortPin_P0_25", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a7a625624c8520faff1f2e6b0a1230ba5", null ], + [ "kSWM_PortPin_P0_26", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ac557f3233abd222c5cf7d809e082f94b", null ], + [ "kSWM_PortPin_P0_27", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aea9feb0c4582cb00ea087fef692f7623", null ], + [ "kSWM_PortPin_P0_28", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35af3005bf86c4488117ca1396151d2c2af", null ], + [ "kSWM_PortPin_P0_29", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35acc5bcdfe59c04f2da33835496b3a2ddf", null ], + [ "kSWM_PortPin_P0_30", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aeba0cfeb40308a0bd10bd33298bf9e84", null ], + [ "kSWM_PortPin_P0_31", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a7b0ebc4f977a126eb51422b3df962e87", null ], + [ "kSWM_PortPin_P1_0", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae94fc13ecb0921b638c70512bf8281d6", null ], + [ "kSWM_PortPin_P1_1", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35abaebf2f6b5b5cde087eb49ed5f2b1f35", null ], + [ "kSWM_PortPin_P1_2", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae2226bb62df630c243dbf2b25246ae31", null ], + [ "kSWM_PortPin_P1_3", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35afc8592f6245641f8c5fdc9b0b7adc7d8", null ], + [ "kSWM_PortPin_P1_4", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1307d505951b16557a3a311a61952edc", null ], + [ "kSWM_PortPin_P1_5", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a2384fb04fb823834f7e4420e2f7e9834", null ], + [ "kSWM_PortPin_P1_6", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a70f9bbb4788bbe8974ebefa1c16e4f06", null ], + [ "kSWM_PortPin_P1_7", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a70c8684952c0ee7fe10facb7b8c3562f", null ], + [ "kSWM_PortPin_P1_8", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a939530a75e2bea978f104a90d4070832", null ], + [ "kSWM_PortPin_P1_9", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae02e17e293a9bd22a00e7b2c1aa4478b", null ], + [ "kSWM_PortPin_P1_10", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a73bc985bec01aad92ec6f227dfa33c71", null ], + [ "kSWM_PortPin_P1_11", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a89eb85c7d85a8ad52f20bac7eb445c21", null ], + [ "kSWM_PortPin_P1_12", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a42a138600cc12d14279d26ba18532f78", null ], + [ "kSWM_PortPin_P1_13", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0360fc48e017a241d3fe34d9ff2614ee", null ], + [ "kSWM_PortPin_P1_14", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35afcbc2b785e5b99a550f8504afe1f3bc1", null ], + [ "kSWM_PortPin_P1_15", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a95483f9f6afef5e552486e3dcc21b6e7", null ], + [ "kSWM_PortPin_P1_16", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ad8ae11b993e1cfa619d236025511e0bf", null ], + [ "kSWM_PortPin_P1_17", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a202dd64ec2e20bd15b7742c6d1cc1c6e", null ], + [ "kSWM_PortPin_P1_18", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae3ae151cd2fd03546272907de2f46452", null ], + [ "kSWM_PortPin_P1_19", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a9634c54b13db3584029727384a8ec150", null ], + [ "kSWM_PortPin_P1_20", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aac489e32c6f52361bfdfa34a2e29e361", null ], + [ "kSWM_PortPin_P1_21", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ad3faaa86fe964959f39e40214f65ec88", null ], + [ "kSWM_PortPin_Reset", "a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a6873cb2ccda9efd34d7fdd75f3829f1c", null ] + ] ], + [ "swm_select_movable_t", "a00095.html#ga45575871cafcadc50292b9bba6b9d13d", [ + [ "kSWM_USART0_TXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da7a0b07e7613ca95cbae02f51e74338ae", null ], + [ "kSWM_USART0_RXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dac38fd128ae8088af0ab82bb9e1ab2b0e", null ], + [ "kSWM_USART0_RTS", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da83269426ac6b85e729bd940e7c6bc168", null ], + [ "kSWM_USART0_CTS", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dacf5086c4d10114ed1e2adf80ef0c1d8e", null ], + [ "kSWM_USART0_SCLK", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da95076efb390207c31347c9d6eaf7a568", null ], + [ "kSWM_USART1_TXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da3ca0015b97fb5a1b24b1f6fda113488d", null ], + [ "kSWM_USART1_RXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da40ca641c0138d551c28bb9dd184bf948", null ], + [ "kSWM_USART1_RTS", "a00095.html#gga45575871cafcadc50292b9bba6b9d13daf60de542a97e3ce9a3e5b7dbcc2bcda2", null ], + [ "kSWM_USART1_CTS", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da813d3edec232542ea82e71a655b0b4fb", null ], + [ "kSWM_USART1_SCLK", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da209dc130cd5427683bedca3187726030", null ], + [ "kSWM_USART2_TXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13daf89abebe911f5ecafec20d30dc2f682f", null ], + [ "kSWM_USART2_RXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dadaead8c606fd8cbcbc0f91300767347a", null ], + [ "kSWM_USART2_RTS", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da7cca77c6472c74168c27badb5004168e", null ], + [ "kSWM_USART2_CTS", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da42ac6e1f6f6becfc8e66497f37c55d1a", null ], + [ "kSWM_USART2_SCLK", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da116239c55759f6c6001ceba755c7b8d2", null ], + [ "kSWM_SPI0_SCK", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dabd1859e7fd97d6aad4edf95f92eb1df0", null ], + [ "kSWM_SPI0_MOSI", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dad6e9059822d87be57e82960aa79d9229", null ], + [ "kSWM_SPI0_MISO", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da84653c7b62da4f773676a39a2abe597a", null ], + [ "kSWM_SPI0_SSEL0", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dadeb15fd0fbfb9f438e22762cad170359", null ], + [ "kSWM_SPI0_SSEL1", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dacdcd02ea5803089ebcd609e227acab8b", null ], + [ "kSWM_SPI0_SSEL2", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da47f29fa3b468816be5c1eb20acba2401", null ], + [ "kSWM_SPI0_SSEL3", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dabb2ff7e22a1cf8569371940cf8aa26be", null ], + [ "kSWM_SPI1_SCK", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da77e9143545ea4e513ef6011f7208f546", null ], + [ "kSWM_SPI1_MOSI", "a00095.html#gga45575871cafcadc50292b9bba6b9d13daaac1baf3720b00f74ac8ce909480aa55", null ], + [ "kSWM_SPI1_MISO", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dae283471f853e6c225c1e87993684f33e", null ], + [ "kSWM_SPI1_SSEL0", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da2b6c54c9683950102b65b04d72413485", null ], + [ "kSWM_SPI1_SSEL1", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dada607a033b2f32aeff128ca0e44f5330", null ], + [ "kSWM_SCT_PIN0", "a00095.html#gga45575871cafcadc50292b9bba6b9d13daf8a4a3044fce3b8a4f4e623ae487eaf3", null ], + [ "kSWM_SCT_PIN1", "a00095.html#gga45575871cafcadc50292b9bba6b9d13daf75b73c12fb8bf5f3a11bdeac90a707c", null ], + [ "kSWM_SCT_PIN2", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da48564e7fb10e92bdf93505fc7fa9c67e", null ], + [ "kSWM_SCT_PIN3", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da6fc9c6a69e49ac3a90c96df724896b0c", null ], + [ "kSWM_SCT_OUT0", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da224d928aad4331ef5d68009e70e538f5", null ], + [ "kSWM_SCT_OUT1", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da80950740f9483b5483eef4606fdf7aa0", null ], + [ "kSWM_SCT_OUT2", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dab7486d7c92e144b832cac5062cc7332d", null ], + [ "kSWM_SCT_OUT3", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da88e6d984d42304f78c3588deb26dda58", null ], + [ "kSWM_SCT_OUT4", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da8a91ce53d99f81616b9b89ccca0d3622", null ], + [ "kSWM_SCT_OUT5", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da486fdfd2ff450e9a90ddf8aee01558ce", null ], + [ "kSWM_SCT_OUT6", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da4c6afb8ab3dd8b1d9b1048ad887fa4d4", null ], + [ "kSWM_I2C1_SDA", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dab15fc1b1ba8e4f1a35fc314c60b467be", null ], + [ "kSWM_I2C1_SCL", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da5ba6a30f56eb6e001abb178bb215469a", null ], + [ "kSWM_I2C2_SDA", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da29239ecd12dc74a5fea8212ac33384aa", null ], + [ "kSWM_I2C2_SCL", "a00095.html#gga45575871cafcadc50292b9bba6b9d13daeb0140f33c859191ef01c944232eece0", null ], + [ "kSWM_I2C3_SDA", "a00095.html#gga45575871cafcadc50292b9bba6b9d13daba956178be53723eb6036f604c405a38", null ], + [ "kSWM_I2C3_SCL", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da762b4a79d8190dddad7ebc6aa10dc050", null ], + [ "kSWM_ACMP_OUT", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da76769594d29a6d8659c5c625b4212a24", null ], + [ "kSWM_CLKOUT", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da867964bdb44cfca767b2fe212243ad68", null ], + [ "kSWM_GPIO_INT_BMAT", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da9e23b0bd838b14f99f22d1ae76d63143", null ], + [ "kSWM_USART3_TXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da76658de4210286b1454d40e812df6ac4", null ], + [ "kSWM_USART3_RXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da76e8eae17c3a231d2264df8ee85816be", null ], + [ "kSWM_USART3_SCLK", "a00095.html#gga45575871cafcadc50292b9bba6b9d13daafad49b1a33633d2b55ae1ba9106d4fe", null ], + [ "kSWM_USART4_TXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da5a04ae8d36afacb8c813cbd1de05d304", null ], + [ "kSWM_USART4_RXD", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da6c008c1255cce64e50b8645c5aebb0ad", null ], + [ "kSWM_USART4_SCLK", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da9124d482fb323cb9201ffbc3914755b7", null ], + [ "kSWM_T0_MAT_CHN0", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da0ac9c784851c59d1c334fba730bdc091", null ], + [ "kSWM_T0_MAT_CHN1", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da4be08849669f9f086a238335662c6ac1", null ], + [ "kSWM_T0_MAT_CHN2", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da11e574aeb2ec56f282a103d78c49ccbe", null ], + [ "kSWM_T0_MAT_CHN3", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da3ab2e3d866e55d84dc2c342eb660c0d5", null ], + [ "kSWM_T0_CAP_CHN0", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da14bfd78536056ebdc4d2bfed0438b5cf", null ], + [ "kSWM_T0_CAP_CHN1", "a00095.html#gga45575871cafcadc50292b9bba6b9d13da048cac659ef579d1358cc6d2a7db2c3a", null ], + [ "kSWM_T0_CAP_CHN2", "a00095.html#gga45575871cafcadc50292b9bba6b9d13daef5103aadc41068ca6157543520491b2", null ], + [ "kSWM_MOVABLE_NUM_FUNCS", "a00095.html#gga45575871cafcadc50292b9bba6b9d13dac735c6243e08a73181d0f0f8f6c130bb", null ] + ] ], + [ "swm_select_fixed_pin_t", "a00095.html#ga6db188a71a269613f30825af80c02053", [ + [ "kSWM_ACMP_INPUT1", "a00095.html#gga6db188a71a269613f30825af80c02053a28fab9703b5177948f7409efa9ff848a", null ], + [ "kSWM_ACMP_INPUT2", "a00095.html#gga6db188a71a269613f30825af80c02053abd4f15c4f7b44b457764ab2aa67ac5ac", null ], + [ "kSWM_ACMP_INPUT3", "a00095.html#gga6db188a71a269613f30825af80c02053ad8072ce6e9985ae8377377ae49ba57d7", null ], + [ "kSWM_ACMP_INPUT4", "a00095.html#gga6db188a71a269613f30825af80c02053a2f09e0ca30217841402ba6bf16f8f785", null ], + [ "kSWM_ACMP_INPUT5", "a00095.html#gga6db188a71a269613f30825af80c02053ad1b1f498a44a52ed74eab7333c03e177", null ], + [ "kSWM_SWCLK", "a00095.html#gga6db188a71a269613f30825af80c02053a9b86fc933fab954e947140ea4ca2ffe3", null ], + [ "kSWM_SWDIO", "a00095.html#gga6db188a71a269613f30825af80c02053ac0ebb404f4a50e198c79a35af9721e6c", null ], + [ "kSWM_XTALIN", "a00095.html#gga6db188a71a269613f30825af80c02053a2947dc590a82f761d8c0f634a95eb3ef", null ], + [ "kSWM_XTALOUT", "a00095.html#gga6db188a71a269613f30825af80c02053af2012960829ef051b69391eee877d167", null ], + [ "kSWM_RESETN", "a00095.html#gga6db188a71a269613f30825af80c02053a2c3df2d1d6d1fb817003b824eb699585", null ], + [ "kSWM_CLKIN", "a00095.html#gga6db188a71a269613f30825af80c02053add9353fb1a660338dc4129f564d43c41", null ], + [ "kSWM_VDDCMP", "a00095.html#gga6db188a71a269613f30825af80c02053a1c8051ee75028cdb756ce666cc9b1bb9", null ], + [ "kSWM_I2C0_SDA", "a00095.html#gga6db188a71a269613f30825af80c02053a679e93580df161b665365f658345ed65", null ], + [ "kSWM_I2C0_SCL", "a00095.html#gga6db188a71a269613f30825af80c02053a6f0a53c70373fdbf41edf57122669a47", null ], + [ "kSWM_ADC_CHN0", "a00095.html#gga6db188a71a269613f30825af80c02053acc0420d5b902bffdc029c0a179fd9653", null ], + [ "kSWM_ADC_CHN1", "a00095.html#gga6db188a71a269613f30825af80c02053af96a078ddf8497b6680dcb8812abccaf", null ], + [ "kSWM_ADC_CHN2", "a00095.html#gga6db188a71a269613f30825af80c02053aab8f0dd610beed22acf2a5a2c3149a38", null ], + [ "kSWM_ADC_CHN3", "a00095.html#gga6db188a71a269613f30825af80c02053ab3e46c2499e53d6187acef5b9c92faeb", null ], + [ "kSWM_ADC_CHN4", "a00095.html#gga6db188a71a269613f30825af80c02053a131299a8724b490b48ff5ea4ae88ec85", null ], + [ "kSWM_ADC_CHN5", "a00095.html#gga6db188a71a269613f30825af80c02053a8f49833db881a5cca72e39060510fe33", null ], + [ "kSWM_ADC_CHN6", "a00095.html#gga6db188a71a269613f30825af80c02053a2cf1d219093b981b000fefd1b4b88835", null ], + [ "kSWM_ADC_CHN7", "a00095.html#gga6db188a71a269613f30825af80c02053af60644696c7226d16b940a379e974d07", null ], + [ "kSWM_ADC_CHN8", "a00095.html#gga6db188a71a269613f30825af80c02053aca55eb81b04844960f74d6b6f735f406", null ], + [ "kSWM_ADC_CHN9", "a00095.html#gga6db188a71a269613f30825af80c02053a332c28d49858ffceda3b7d9a9a317d0c", null ], + [ "kSWM_ADC_CHN10", "a00095.html#gga6db188a71a269613f30825af80c02053a3872c11496f6cd2755a2cc33edeee25e", null ], + [ "kSWM_ADC_CHN11", "a00095.html#gga6db188a71a269613f30825af80c02053a1195026daab11c8e8e8a07ea2588dc59", null ], + [ "kSWM_DAC_OUT0", "a00095.html#gga6db188a71a269613f30825af80c02053aafaffe0fe7c5ed4eaed04bd7acac4f0b", null ], + [ "kSWM_DAC_OUT1", "a00095.html#gga6db188a71a269613f30825af80c02053ad27f5123f30e1df03752e0441e384bc0", null ], + [ "kSWM_CAPT_X0", "a00095.html#gga6db188a71a269613f30825af80c02053a5673e5074470fd8c7773f987a45612ab", null ], + [ "kSWM_CAPT_X1", "a00095.html#gga6db188a71a269613f30825af80c02053a74e21d63631f6e3eeae57269cc597ff9", null ], + [ "kSWM_CAPT_X2", "a00095.html#gga6db188a71a269613f30825af80c02053ae11d56486ef46dfad9ea855f223483f2", null ], + [ "kSWM_CAPT_X3", "a00095.html#gga6db188a71a269613f30825af80c02053a144b0c83acca82fa910848f7587af18e", null ], + [ "kSWM_CAPT_X4", "a00095.html#gga6db188a71a269613f30825af80c02053adad77032cc009f3690361c9f4d552cdd", null ], + [ "kSWM_CAPT_X5", "a00095.html#gga6db188a71a269613f30825af80c02053a4c1cd58e5ec1701988c4f75b9984ea02", null ], + [ "kSWM_CAPT_X6", "a00095.html#gga6db188a71a269613f30825af80c02053aa8268aaae121ff5d8c034197c212be34", null ], + [ "kSWM_CAPT_X7", "a00095.html#gga6db188a71a269613f30825af80c02053a1c37339ea26e38fc22dc2e0f684eca9f", null ], + [ "kSWM_CAPT_X8", "a00095.html#gga6db188a71a269613f30825af80c02053a8812766f8dc3ffa1fa2f4ad7b3623432", null ], + [ "kSWM_CAPT_YL", "a00095.html#gga6db188a71a269613f30825af80c02053abe002214e7dc409f243527310e689060", null ], + [ "kSWM_CAPT_YH", "a00095.html#gga6db188a71a269613f30825af80c02053a839653f003a5f245984cbbb3e0ded090", null ], + [ "kSWM_FIXEDPIN_NUM_FUNCS", "a00095.html#gga6db188a71a269613f30825af80c02053a609f40f8714286a7fce78c131a97b69f", null ] + ] ], + [ "SWM_SetMovablePinSelect", "a00095.html#gaae2dc5c29ae2358c616fa8a2b61a7e4b", null ], + [ "SWM_SetFixedPinSelect", "a00095.html#ga55452f734d7cc5e02195ed926e4484c8", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00096.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00096.html new file mode 100644 index 0000000..6b4fc5e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00096.html @@ -0,0 +1,235 @@ + + + + + + +MCUXpresso SDK API Reference Manual: SYSCON: System Configuration + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
SYSCON: System Configuration
+
+
+

Overview

+

The MCUXpresso SDK provides a peripheral clock and power driver for the SYSCON module of MCUXpresso SDK devices. For furter details, see the corresponding chapter.

+ + + + + + +

+Files

file  fsl_syscon.h
 
file  fsl_syscon.h
 
+ + + + +

+Functions

void SYSCON_AttachSignal (SYSCON_Type *base, uint32_t index, syscon_connection_t connection)
 Attaches a signal. More...
 
+ + + + + + + + + +

+Syscon multiplexing connections

enum  syscon_connection_t { kSYSCON_GpioPort0Pin0ToPintsel = 0U + (PINTSEL_ID << SYSCON_SHIFT) + }
 SYSCON connections type. More...
 
+#define PINTSEL_ID   0x178U
 Periphinmux IDs.
 
+#define SYSCON_SHIFT   20U
 
+ + + + +

+Driver version

#define FSL_SYSON_DRIVER_VERSION   (MAKE_VERSION(2, 0, 1))
 Group syscon driver version for SDK. More...
 
+

Macro Definition Documentation

+ +
+
+ + + + +
#define FSL_SYSON_DRIVER_VERSION   (MAKE_VERSION(2, 0, 1))
+
+

Version 2.0.1.

+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum syscon_connection_t
+
+ + +
Enumerator
kSYSCON_GpioPort0Pin0ToPintsel  +

Pin Interrupt.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void SYSCON_AttachSignal (SYSCON_Type * base,
uint32_t index,
syscon_connection_t connection 
)
+
+

This function gates the SYSCON clock.

+
Parameters
+ + + + +
baseBase address of the SYSCON peripheral.
indexDestination peripheral to attach the signal to.
connectionSelects connection.
+
+
+
Return values
+ + +
None.
+
+
+ +
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00096.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00096.js new file mode 100644 index 0000000..1c37663 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00096.js @@ -0,0 +1,9 @@ +var a00096 = +[ + [ "PINTSEL_ID", "a00096.html#gacec975ef3b52ff6266f4bf055d8bbbc0", null ], + [ "FSL_SYSON_DRIVER_VERSION", "a00096.html#ga3d7a27cd4564bc389103aacd4a0a41e4", null ], + [ "syscon_connection_t", "a00096.html#ga4a63ee69b68459770551a0e4d7b6cdad", [ + [ "kSYSCON_GpioPort0Pin0ToPintsel", "a00096.html#gga4a63ee69b68459770551a0e4d7b6cdadafe2a386c6f3e8884b995d08fd87de542", null ] + ] ], + [ "SYSCON_AttachSignal", "a00096.html#gaa42f53e7578284bdc9816da8800e735b", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00097.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00097.html new file mode 100644 index 0000000..4bf0a65 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00097.html @@ -0,0 +1,344 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Debug Console + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+ +
+
Debug Console
+
+
+

Overview

+

This chapter describes the programming interface of the debug console driver.

+

The debug console enables debug log messages to be output via the specified peripheral with frequency of the peripheral source clock and base address at the specified baud rate. Additionally, it provides input and output functions to scan and print formatted data.

+

+Function groups

+

+Initialization

+

To initialize the debug console, call the DbgConsole_Init() function with these parameters. This function automatically enables the module and the clock.

+
+
status_t DbgConsole_Init(uint8_t instance, uint32_t baudRate, serial_port_type_t device, uint32_t clkSrcFreq);
+

Selects the supported debug console hardware device type, such as

+
typedef enum _serial_port_type
+
{
+
kSerialPort_None = 0U,
+
kSerialPort_Uart = 1U,
+
} serial_port_type_t;
+

After the initialization is successful, stdout and stdin are connected to the selected peripheral. The debug console state is stored in the debug_console_state_t structure, such as shown here.

+
typedef struct DebugConsoleState
+
{
+
uint8_t uartHandleBuffer[HAL_UART_HANDLE_SIZE];
+
hal_uart_status_t (*putChar)(hal_uart_handle_t handle, const uint8_t *data, size_t length);
+
hal_uart_status_t (*getChar)(hal_uart_handle_t handle, uint8_t *data, size_t length);
+
serial_port_type_t type;
+
} debug_console_state_t;
+

This example shows how to call the DbgConsole_Init() given the user configuration structure.

+
DbgConsole_Init(BOARD_DEBUG_USART_INSTANCE, BOARD_DEBUG_USART_BAUDRATE, BOARD_DEBUG_USART_TYPE,
+
BOARD_DEBUG_USART_CLK_FREQ);
+

+Advanced Feature

+

The debug console provides input and output functions to scan and print formatted data.

+
    +
  • Support a format specifier for PRINTF following this prototype " %[flags][width][.precision][length]specifier", which is explained below
  • +
+
+ + + + + + + + + + + + +
flags Description
- Left-justified within the given field width. Right-justified is the default.
+ Forces to precede the result with a plus or minus sign (+ or -) even for positive numbers. By default, only negative numbers are preceded with a - sign.
(space) If no sign is written, a blank space is inserted before the value.
# Used with o, x, or X specifiers the value is preceded with 0, 0x, or 0X respectively for values other than zero. Used with e, E and f, it forces the written output to contain a decimal point even if no digits would follow. By default, if no digits follow, no decimal point is written. Used with g or G the result is the same as with e or E but trailing zeros are not removed.
0 Left-pads the number with zeroes (0) instead of spaces, where padding is specified (see width sub-specifier).
+
+ + + + + + +
Width Description
(number) A minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces. The value is not truncated even if the result is larger.
* The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.
+
+ + + + + + +
.precision Description
.number For integer specifiers (d, i, o, u, x, X) − precision specifies the minimum number of digits to be written. If the value to be written is shorter than this number, the result is padded with leading zeros. The value is not truncated even if the result is longer. A precision of 0 means that no character is written for the value 0. For e, E, and f specifiers − this is the number of digits to be printed after the decimal point. For g and G specifiers − This is the maximum number of significant digits to be printed. For s − this is the maximum number of characters to be printed. By default, all characters are printed until the ending null character is encountered. For c type − it has no effect. When no precision is specified, the default is 1. If the period is specified without an explicit value for precision, 0 is assumed.
.* The precision is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.
+
+ + + + +
length Description
Do not support
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
specifier Description
d or i Signed decimal integer
f Decimal floating point
F Decimal floating point capital letters
x Unsigned hexadecimal integer
X Unsigned hexadecimal integer capital letters
o Signed octal
b Binary value
p Pointer address
u Unsigned decimal integer
c Character
s String of characters
n Nothing printed
+
    +
  • Support a format specifier for SCANF following this prototype " %[*][width][length]specifier", which is explained below
  • +
+
+ + + + +
* Description
An optional starting asterisk indicates that the data is to be read from the stream but ignored. In other words, it is not stored in the corresponding argument.
+
+ + + + +
width Description
This specifies the maximum number of characters to be read in the current reading operation.
+
+ + + + + + + + + + + + + + +
length Description
hh The argument is interpreted as a signed character or unsigned character (only applies to integer specifiers: i, d, o, u, x, and X).
h The argument is interpreted as a short integer or unsigned short integer (only applies to integer specifiers: i, d, o, u, x, and X).
l The argument is interpreted as a long integer or unsigned long integer for integer specifiers (i, d, o, u, x, and X) and as a wide character or wide character string for specifiers c and s.
ll The argument is interpreted as a long long integer or unsigned long long integer for integer specifiers (i, d, o, u, x, and X) and as a wide character or wide character string for specifiers c and s.
L The argument is interpreted as a long double (only applies to floating point specifiers: e, E, f, g, and G).
j or z or t Not supported
+
+ + + + + + + + + + + + + + + + +
specifier Qualifying Input Type of argument
c Single character: Reads the next character. If a width different from 1 is specified, the function reads width characters and stores them in the successive locations of the array passed as argument. No null character is appended at the end. char *
i Integer: : Number optionally preceded with a + or - sign int *
d Decimal integer: Number optionally preceded with a + or - sign int *
a, A, e, E, f, F, g, G Floating point: Decimal number containing a decimal point, optionally preceded by a + or - sign and optionally followed by the e or E character and a decimal number. Two examples of valid entries are -732.103 and 7.12e4 float *
o Octal Integer: int *
s String of characters. This reads subsequent characters until a white space is found (white space characters are considered to be blank, newline, and tab). char *
u Unsigned decimal integer. unsigned int *
+

The debug console has its own printf/scanf/putchar/getchar functions which are defined in the header file.

+
int DbgConsole_Printf(const char *fmt_s, ...);
+
int DbgConsole_Putchar(int ch);
+
int DbgConsole_Scanf(char *fmt_ptr, ...);
+
int DbgConsole_Getchar(void);
+

This utility supports selecting toolchain's printf/scanf or the MCUXpresso SDK printf/scanf.

+
#if SDK_DEBUGCONSOLE == DEBUGCONSOLE_DISABLE /* Disable debug console */
+
#define PRINTF
+
#define SCANF
+
#define PUTCHAR
+
#define GETCHAR
+
#elif SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK /* Select printf, scanf, putchar, getchar of SDK version. */
+
#define PRINTF DbgConsole_Printf
+
#define SCANF DbgConsole_Scanf
+
#define PUTCHAR DbgConsole_Putchar
+
#define GETCHAR DbgConsole_Getchar
+
#elif SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_TOOLCHAIN /* Select printf, scanf, putchar, getchar of toolchain. */
+
#define PRINTF printf
+
#define SCANF scanf
+
#define PUTCHAR putchar
+
#define GETCHAR getchar
+
#endif /* SDK_DEBUGCONSOLE */
+

+SDK_DEBUGCONSOLE and SDK_DEBUGCONSOLE_UART

+

There are two macros SDK_DEBUGCONSOLE and SDK_DEBUGCONSOLE_UART added to configure PRINTF and low level output perihperal.

+
    +
  • The macro SDK_DEBUGCONSOLE is used for forntend. Whether debug console redirect to toolchain or SDK or disabled, it decides which is the frontend of the debug console, Tool chain or SDK. The fucntion can be set by the macro SDK_DEBUGCONSOLE.
  • +
  • The macro SDK_DEBUGCONSOLE_UART is used for backend. It is use to decide whether provide low level IO implementation to toolchain printf and scanf. For example, within MCUXpresso, if the macro SDK_DEBUGCONSOLE_UART is defined, __sys_write and __sys_readc will be used when __REDLIB__ is defined; _write and _read will be used in other cases.The macro does not specifically refer to the perihpheral "UART". It refers to the external perihperal UART. So if the macro SDK_DEBUGCONSOLE_UART is not defined when tool-chain printf is calling, the semihosting will be used.
  • +
+

The following the matrix show the effects of SDK_DEBUGCONSOLE and SDK_DEBUGCONSOLE_UART on PRINTF and printf. The green mark is the default setting of the debug console.

+
+ + + + + + + + + + + + + + +
SDK_DEBUGCONSOLE SDK_DEBUGCONSOLE_UART PRINTF printf
DEBUGCONSOLE_REDIRECT_TO_SDK defined UART UART
DEBUGCONSOLE_REDIRECT_TO_SDK undefined UART semihost
DEBUGCONSOLE_REDIRECT_TO_TOOLCHAIN defined UART UART
DEBUGCONSOLE_REDIRECT_TO_TOOLCHAIN undefined semihost semihost
DEBUGCONSOLE_DISABLE defined No ouput UART
DEBUGCONSOLE_DISABLE undefined No ouput semihost
+

+Typical use case

+

Some examples use the PUTCHAR & GETCHAR function

+
ch = GETCHAR();
+
PUTCHAR(ch);
+

Some examples use the PRINTF function

+

Statement prints the string format.

+
PRINTF("%s %s\r\n", "Hello", "world!");
+

Statement prints the hexadecimal format/

+
PRINTF("0x%02X hexadecimal number equivalents 255", 255);
+

Statement prints the decimal floating point and unsigned decimal.

+
PRINTF("Execution timer: %s\n\rTime: %u ticks %2.5f milliseconds\n\rDONE\n\r", "1 day", 86400, 86.4);
+

Some examples use the SCANF function

+
PRINTF("Enter a decimal number: ");
+
SCANF("%d", &i);
+
PRINTF("\r\nYou have entered %d.\r\n", i, i);
+
PRINTF("Enter a hexadecimal number: ");
+
SCANF("%x", &i);
+
PRINTF("\r\nYou have entered 0x%X (%d).\r\n", i, i);
+

Print out failure messages using MCUXpresso SDK __assert_func:

+
void __assert_func(const char *file, int line, const char *func, const char *failedExpr)
+
{
+
PRINTF("ASSERT ERROR \" %s \": file \"%s\" Line \"%d\" function name \"%s\" \n", failedExpr, file , line, func);
+
for (;;)
+
{}
+
}
+

Note:

+

To use 'printf' and 'scanf' for GNUC Base, add file 'fsl_sbrk.c' in path: ..\{package}\devices\{subset}\utilities\fsl_sbrk.c to your project.

+ + + + +

+Modules

 Semihosting
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00097.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00097.js new file mode 100644 index 0000000..ce2cddb --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00097.js @@ -0,0 +1,4 @@ +var a00097 = +[ + [ "Semihosting", "a00098.html", null ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00098.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00098.html new file mode 100644 index 0000000..95d311f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00098.html @@ -0,0 +1,234 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Semihosting + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
Semihosting
+
+
+

Semihosting is a mechanism for ARM targets to communicate input/output requests from application code to a host computer running a debugger. This mechanism can be used, for example, to enable functions in the C library, such as printf() and scanf(), to use the screen and keyboard of the host rather than having a screen and keyboard on the target system.

+

+Guide Semihosting for IAR

+

NOTE: After the setting both "printf" and "scanf" are available for debugging.

+

Step 1: Setting up the environment

+
    +
  1. To set debugger options, choose Project>Options. In the Debugger category, click the Setup tab.
  2. +
  3. Select Run to main and click OK. This ensures that the debug session starts by running the main function.
  4. +
  5. The project is now ready to be built.
  6. +
+

Step 2: Building the project

+
    +
  1. Compile and link the project by choosing Project>Make or F7.
  2. +
  3. Alternatively, click the Make button on the tool bar. The Make command compiles and links those files that have been modified.
  4. +
+

Step 3: Starting semihosting

+
    +
  1. Choose "Semihosting_IAR" project -> "Options" -> "Debugger" -> "J-Link/J-Trace".
  2. +
  3. Choose tab "J-Link/J-Trace" -> "Connection" tab -> "SWD".
  4. +
  5. Choose tab "General Options" -> "Library Configurations", select Semihosted, select Via semihosting. Please Make sure the SDK_DEBUGCONSOLE_UART is not defined in project settings.
  6. +
  7. Start the project by choosing Project>Download and Debug.
  8. +
  9. Choose View>Terminal I/O to display the output from the I/O operations.
  10. +
+

+Guide Semihosting for Keil µVision

+

NOTE: Semihosting is not support by MDK-ARM, use the retargeting functionality of MDK-ARM instead.

+

+Guide Semihosting for MCUXpresso IDE

+

Step 1: Setting up the environment

+
    +
  1. To set debugger options, choose Project>Properties. select the setting category.
  2. +
  3. Select Tool Settings, unfold MCU C Compile.
  4. +
  5. Select Preprocessor item.
  6. +
  7. Set SDK_DEBUGCONSOLE=0, if set SDK_DEBUGCONSOLE=1, the log will be redirect to the UART.
  8. +
+

Step 2: Building the project

+
    +
  1. Compile and link the project.
  2. +
+

Step 3: Starting semihosting

+
    +
  1. Download and debug the project.
  2. +
  3. When the project runs successfully, the result can be seen in the Console window.
  4. +
+

Semihosting can also be selected through the "Quick settings" menu in the left bottom window, Quick settings->SDK Debug Console->Semihost console.

+

+Guide Semihosting for ARMGCC

+

Step 1: Setting up the environment

+
    +
  1. Turn on "J-LINK GDB Server" -> Select suitable "Target device" -> "OK".
  2. +
  3. Turn on "PuTTY". Set up as follows.
      +
    • "Host Name (or IP address)" : localhost
    • +
    • "Port" :2333
    • +
    • "Connection type" : Telet.
    • +
    • Click "Open".
    • +
    +
  4. +
  5. Increase "Heap/Stack" for GCC to 0x2000:
  6. +
+

Add to "CMakeLists.txt"

+

SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} --defsym=__stack_size__=0x2000")

+

SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} --defsym=__stack_size__=0x2000")

+

SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} --defsym=__heap_size__=0x2000")

+

SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} --defsym=__heap_size__=0x2000")

+

Step 2: Building the project

+
    +
  1. +

    Change "CMakeLists.txt":

    +

    Change "SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} –specs=nano.specs")"

    +

    to "SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} –specs=rdimon.specs")"

    +

    +

    Replace paragraph

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fno-common")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -ffunction-sections")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fdata-sections")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -ffreestanding")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fno-builtin")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -mthumb")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -mapcs")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Xlinker")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} --gc-sections")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Xlinker")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -static")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Xlinker")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -z")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Xlinker")

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} muldefs")

    +

    +

    To

    +

    +

    SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} --specs=rdimon.specs ")

    +

    +

    +

    Remove

    +

    target_link_libraries(semihosting_ARMGCC.elf debug nosys)

    +

    +
  2. +
  3. +Run "build_debug.bat" to build project
  4. +
+

Step 3: Starting semihosting

+
    +
  1. Download the image and set as follows.
    cd D:\mcu-sdk-2.0-origin\boards\twrk64f120m\driver_examples\semihosting\armgcc\debug
    +
    d:
    +
    C:\PROGRA~2\GNUTOO~1\4BD65~1.920\bin\arm-none-eabi-gdb.exe
    +
    target remote localhost:2331
    +
    monitor reset
    +
    monitor semihosting enable
    +
    monitor semihosting thumbSWI 0xAB
    +
    monitor semihosting IOClient 1
    +
    monitor flash device = MK64FN1M0xxx12
    +
    load semihosting_ARMGCC.elf
    +
    monitor reg pc = (0x00000004)
    +
    monitor reg sp = (0x00000000)
    +
    continue
    +
  2. +
  3. After the setting, press "enter". The PuTTY window now shows the printf() output.
  4. +
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/a00100.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00100.html new file mode 100644 index 0000000..6cb48e3 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/a00100.html @@ -0,0 +1,130 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Deprecated List + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
Deprecated List
+
+
+
+
Global DMA_ConfigureChannelTrigger (DMA_Type *base, uint32_t channel, dma_channel_trigger_t *trigger)
+
Do not use this function. It has been superceded by DMA_SetChannelConfig.
+
Global DMA_CreateDescriptor (dma_descriptor_t *desc, dma_xfercfg_t *xfercfg, void *srcAddr, void *dstAddr, void *nextDesc)
+
Do not use this function. It has been superceded by DMA_SetupDescriptor.
+
Global DMA_PrepareTransfer (dma_transfer_config_t *config, void *srcAddr, void *dstAddr, uint32_t byteWidth, uint32_t transferBytes, dma_transfer_type_t type, void *nextDesc)
+
Do not use this function. It has been superceded by DMA_PrepareChannelTransfer. This function prepares the transfer configuration structure according to the user input.
+
Global DMA_SubmitTransfer (dma_handle_t *handle, dma_transfer_config_t *config)
+
Do not use this function. It has been superceded by DMA_SubmitChannelTransfer.
+
Global SCTIMER_SetupNextStateAction (SCT_Type *base, uint32_t nextState, uint32_t event)
+
Do not use this function. It has been superceded by SCTIMER_SetupNextStateActionwithLdMethod
+
Global WWDT_Disable (WWDT_Type *base)
+
Do not use this function. It will be deleted in next release version, for once the bit field of WDEN written with a 1, it can not be re-written with a 0.
+
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/arm_logo.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/arm_logo.png new file mode 100644 index 0000000..bdf487c Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/arm_logo.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/bc_s.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/bc_s.png new file mode 100644 index 0000000..224b29a Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/bc_s.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/bdwn.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/bdwn.png new file mode 100644 index 0000000..940a0b9 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/bdwn.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/closed.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/closed.png new file mode 100644 index 0000000..98cc2c9 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/closed.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/customdoxygen.css b/docs/MCUXpresso SDK API Reference Manual_LPC845/customdoxygen.css new file mode 100644 index 0000000..262bfa4 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/customdoxygen.css @@ -0,0 +1,94 @@ + +body { + color: #51626f; +} + +body, table, div, p, dl { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +.title { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +.textblock ul { + list-style: none outside url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAF0lEQVQIHWP8uZXhPwMWwIRFDCxEDwkAjygCuZMRiw4AAAAASUVORK5CYII="); +} + +h1, h2.groupheader { + color: #51626f; + font-size: 21px; +} + +h1 { + font-weight: 600; +} + +h2 { + font-size: 18px; +} + +.tablist a, +.tablist a:hover { + text-shadow: none; + background-image: none; +} + +.tablist a { + color: #ffffff; +} + +.tablist a:hover { + background-color: #f2f2f5; + color: #007088; +} + +.tablist li.current a { + text-shadow: none; + background-image: none; + background-color: #ffffff; + color: #777777; +} + +.navpath ul { + background-image: none; + background-color: #e6e6e6; + color: #646464; +} + +.tabs, .tabs2, .tabs3, +.tablist li { + background: rgba(0, 0, 0, 0) linear-gradient(to bottom, #f1b635, #e4942a) repeat scroll 0 0; +} + +a { + color: #5e89c1; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: #e6e6e6; + color: #646464; +} + +#nav-tree .selected a { + color: #646464; +} + +#titlearea { + border-bottom: 1px solid #51626f; +} + +#projectname { + font: 32px "Helvetica Neue", Helvetica, Arial; +} + +div.image img[src="Kinetis_SDK_Block_Diagram.png"]{ + width:600px; +} + +.image { + text-align: center; +} + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_07b86ffc266b39efa5bbdc0e9fdb330a.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_07b86ffc266b39efa5bbdc0e9fdb330a.html new file mode 100644 index 0000000..11baaad --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_07b86ffc266b39efa5bbdc0e9fdb330a.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/devices Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
devices Directory Reference
+
+
+ + + + +

+Directories

directory  LPC845
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_1331922326a697e1e9aa2323d085217f.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_1331922326a697e1e9aa2323d085217f.html new file mode 100644 index 0000000..2604239 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_1331922326a697e1e9aa2323d085217f.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/swm Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
swm Directory Reference
+
+
+ + + + +

+Files

file  fsl_swm.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_2056c7e4f19697e9c34230a1d3554841.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_2056c7e4f19697e9c34230a1d3554841.html new file mode 100644 index 0000000..8eb18ef --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_2056c7e4f19697e9c34230a1d3554841.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/devices/LPC845 Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
LPC845 Directory Reference
+
+
+ + + + +

+Directories

directory  drivers
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_22cbbd27e16e87caa10f675e5ce8b9df.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_22cbbd27e16e87caa10f675e5ce8b9df.html new file mode 100644 index 0000000..f987170 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_22cbbd27e16e87caa10f675e5ce8b9df.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/utilities/debug_console_lite Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
debug_console_lite Directory Reference
+
+
+ + + + +

+Files

file  fsl_debug_console.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_2a1dd0fbcd48f3a218ef69b90ad172e4.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_2a1dd0fbcd48f3a218ef69b90ad172e4.html new file mode 100644 index 0000000..ed54751 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_2a1dd0fbcd48f3a218ef69b90ad172e4.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_dma Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_dma Directory Reference
+
+
+ + + + +

+Files

file  fsl_dma.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_2c6aa0e2bbb2234cdccf71ce9920a505.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_2c6aa0e2bbb2234cdccf71ce9920a505.html new file mode 100644 index 0000000..413244d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_2c6aa0e2bbb2234cdccf71ce9920a505.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_i2c Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_i2c Directory Reference
+
+
+ + + + +

+Files

file  fsl_i2c.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_3803c7c40becdc1a8f991e020a425f6b.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_3803c7c40becdc1a8f991e020a425f6b.html new file mode 100644 index 0000000..1fee6dd --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_3803c7c40becdc1a8f991e020a425f6b.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_gpio Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_gpio Directory Reference
+
+
+ + + + +

+Files

file  fsl_gpio.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_3d87c2df58032c55a697acbe8461844d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_3d87c2df58032c55a697acbe8461844d.html new file mode 100644 index 0000000..0b2d09b --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_3d87c2df58032c55a697acbe8461844d.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/wwdt Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
wwdt Directory Reference
+
+
+ + + + +

+Files

file  fsl_wwdt.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_51c73ba289f0e8fe50ccaff542140dcf.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_51c73ba289f0e8fe50ccaff542140dcf.html new file mode 100644 index 0000000..5583796 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_51c73ba289f0e8fe50ccaff542140dcf.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/sctimer Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
sctimer Directory Reference
+
+
+ + + + +

+Files

file  fsl_sctimer.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_597e7b4abe9370d09efc17ad39621bb9.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_597e7b4abe9370d09efc17ad39621bb9.html new file mode 100644 index 0000000..656f265 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_597e7b4abe9370d09efc17ad39621bb9.html @@ -0,0 +1,132 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/devices/LPC845/drivers Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
drivers Directory Reference
+
+
+ + + + + + + + + + + + + + +

+Files

file  fsl_clock.h
 
file  fsl_inputmux_connections.h
 
file  fsl_power.h
 
file  fsl_reset.h
 
file  fsl_swm_connections.h
 
file  fsl_syscon_connections.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_5b772dd4d456f495cb29becefd143ee2.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_5b772dd4d456f495cb29becefd143ee2.html new file mode 100644 index 0000000..4581bc8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_5b772dd4d456f495cb29becefd143ee2.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_crc Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_crc Directory Reference
+
+
+ + + + +

+Files

file  fsl_crc.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_75214fd834f54a955adf2012023f7050.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_75214fd834f54a955adf2012023f7050.html new file mode 100644 index 0000000..ca063b5 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_75214fd834f54a955adf2012023f7050.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_iocon_lite Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_iocon_lite Directory Reference
+
+
+ + + + +

+Files

file  fsl_iocon.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_8072ca6cdeca8c705203cc0f896a3705.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_8072ca6cdeca8c705203cc0f896a3705.html new file mode 100644 index 0000000..23d4172 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_8072ca6cdeca8c705203cc0f896a3705.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/inputmux Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
inputmux Directory Reference
+
+
+ + + + +

+Files

file  fsl_inputmux.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_8240c85063e108bd95ef29fb603f8af8.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_8240c85063e108bd95ef29fb603f8af8.html new file mode 100644 index 0000000..47240f2 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_8240c85063e108bd95ef29fb603f8af8.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/capt Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
capt Directory Reference
+
+
+ + + + +

+Files

file  fsl_capt.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_83c4f67939b2e50b6dc50fe3fc259b2d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_83c4f67939b2e50b6dc50fe3fc259b2d.html new file mode 100644 index 0000000..36da9ce --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_83c4f67939b2e50b6dc50fe3fc259b2d.html @@ -0,0 +1,164 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
drivers Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Directories

directory  capt
 
directory  common
 
directory  ctimer
 
directory  iap
 
directory  inputmux
 
directory  lpc_acomp
 
directory  lpc_adc
 
directory  lpc_crc
 
directory  lpc_dac
 
directory  lpc_dma
 
directory  lpc_gpio
 
directory  lpc_i2c
 
directory  lpc_iocon_lite
 
directory  lpc_minispi
 
directory  lpc_miniusart
 
directory  mrt
 
directory  pint
 
directory  sctimer
 
directory  swm
 
directory  syscon
 
directory  wkt
 
directory  wwdt
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_8ceb0280e3a6924da33c684985152a52.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_8ceb0280e3a6924da33c684985152a52.html new file mode 100644 index 0000000..ce7c05d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_8ceb0280e3a6924da33c684985152a52.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/wkt Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
wkt Directory Reference
+
+
+ + + + +

+Files

file  fsl_wkt.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_97879f77cafaedc6c6b7c8e7e6bcf419.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_97879f77cafaedc6c6b7c8e7e6bcf419.html new file mode 100644 index 0000000..17bcb4d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_97879f77cafaedc6c6b7c8e7e6bcf419.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/mrt Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
mrt Directory Reference
+
+
+ + + + +

+Files

file  fsl_mrt.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_9e0a0b363f74c0efadbd1d6e4c01cac5.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_9e0a0b363f74c0efadbd1d6e4c01cac5.html new file mode 100644 index 0000000..61d3272 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_9e0a0b363f74c0efadbd1d6e4c01cac5.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_dac Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_dac Directory Reference
+
+
+ + + + +

+Files

file  fsl_dac.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_a2da420fdde962bd10156eaa17d1670b.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_a2da420fdde962bd10156eaa17d1670b.html new file mode 100644 index 0000000..d76fc0a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_a2da420fdde962bd10156eaa17d1670b.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/syscon Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
syscon Directory Reference
+
+
+ + + + +

+Files

file  fsl_syscon.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_a343a3e9cbb710280ccd0de2056b945d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_a343a3e9cbb710280ccd0de2056b945d.html new file mode 100644 index 0000000..56021b0 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_a343a3e9cbb710280ccd0de2056b945d.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/utilities/misc_utilities Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
misc_utilities Directory Reference
+
+
+ + + + +

+Files

file  fsl_format.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_a3e8f1feb8c30c12d24fc9c7995a15c1.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_a3e8f1feb8c30c12d24fc9c7995a15c1.html new file mode 100644 index 0000000..da89a62 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_a3e8f1feb8c30c12d24fc9c7995a15c1.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/ctimer Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
ctimer Directory Reference
+
+
+ + + + +

+Files

file  fsl_ctimer.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_b81d5557345932eec08d61eeb5afa2f0.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_b81d5557345932eec08d61eeb5afa2f0.html new file mode 100644 index 0000000..f0d15a0 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_b81d5557345932eec08d61eeb5afa2f0.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_minispi Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_minispi Directory Reference
+
+
+ + + + +

+Files

file  fsl_spi.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_c48a66ee7236adaad29cf263b70b3b16.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_c48a66ee7236adaad29cf263b70b3b16.html new file mode 100644 index 0000000..4b75e37 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_c48a66ee7236adaad29cf263b70b3b16.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_miniusart Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_miniusart Directory Reference
+
+
+ + + + +

+Files

file  fsl_usart.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_c5a52a81292cf9a5167198f4f346d6d9.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_c5a52a81292cf9a5167198f4f346d6d9.html new file mode 100644 index 0000000..9bddf11 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_c5a52a81292cf9a5167198f4f346d6d9.html @@ -0,0 +1,124 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
platform Directory Reference
+
+
+ + + + + + +

+Directories

directory  drivers
 
directory  utilities
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_c7e9d45afd61725c3e80b2f8c629533d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_c7e9d45afd61725c3e80b2f8c629533d.html new file mode 100644 index 0000000..d575547 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_c7e9d45afd61725c3e80b2f8c629533d.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_adc Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_adc Directory Reference
+
+
+ + + + +

+Files

file  fsl_adc.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_d0b0cea4c1afa919405231e98537b73c.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_d0b0cea4c1afa919405231e98537b73c.html new file mode 100644 index 0000000..298acbf --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_d0b0cea4c1afa919405231e98537b73c.html @@ -0,0 +1,124 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/utilities Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
utilities Directory Reference
+
+
+ + + + + + +

+Directories

directory  debug_console_lite
 
directory  misc_utilities
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_d488d26126eac48f68b56f6b2e0f43d9.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_d488d26126eac48f68b56f6b2e0f43d9.html new file mode 100644 index 0000000..824bd39 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_d488d26126eac48f68b56f6b2e0f43d9.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/lpc_acomp Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
lpc_acomp Directory Reference
+
+
+ + + + +

+Files

file  fsl_acomp.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_ea982a4a90bbf64c8a612131ad2f0fcb.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_ea982a4a90bbf64c8a612131ad2f0fcb.html new file mode 100644 index 0000000..4450c65 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_ea982a4a90bbf64c8a612131ad2f0fcb.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/common Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
common Directory Reference
+
+
+ + + + +

+Files

file  fsl_common.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_eb78a2695df30cd843f578001c009203.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_eb78a2695df30cd843f578001c009203.html new file mode 100644 index 0000000..9c7ff32 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_eb78a2695df30cd843f578001c009203.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/pint Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
pint Directory Reference
+
+
+ + + + +

+Files

file  fsl_pint.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_f116f7633d12361ea112ee9d6dd3a804.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_f116f7633d12361ea112ee9d6dd3a804.html new file mode 100644 index 0000000..a858a9d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dir_f116f7633d12361ea112ee9d6dd3a804.html @@ -0,0 +1,122 @@ + + + + + + +MCUXpresso SDK API Reference Manual: /home/nxf66276/jenkins_home/workspace/sdk_git/platform/drivers/iap Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
iap Directory Reference
+
+
+ + + + +

+Files

file  fsl_iap.h
 
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/doxygen.css b/docs/MCUXpresso SDK API Reference Manual_LPC845/doxygen.css new file mode 100644 index 0000000..4699e69 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/doxygen.css @@ -0,0 +1,1357 @@ +/* The standard CSS for doxygen 1.8.5 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd, p.starttd { + margin-top: 2px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0px; + margin: 0px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: bold; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view when not used as main index */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 20px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/doxygen.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/doxygen.png new file mode 100644 index 0000000..3ff17d8 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/doxygen.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/dynsections.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/dynsections.js new file mode 100644 index 0000000..ed092c7 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/dynsections.js @@ -0,0 +1,97 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} +function toggleLevel(level) +{ + $('table.directory tr').each(function(){ + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + +MCUXpresso SDK API Reference Manual: Introduction + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
Introduction
+
+
+

The MCUXpresso Software Development Kit (MCUXpresso SDK) is a collection of software enablement for NXP Microcontrollers that includes peripheral drivers, multicore support and integrated RTOS support for FreeRTOSTM. In addition to the base enablement, the MCUXpresso SDK is augmented with demo applications, driver example projects, and API documentation to help users quickly leverage the support provided by MCUXpresso SDK. The MCUXpresso SDK Web Builder is available to provide access to all MCUXpresso SDK packages. See the MCUXpresso Software Development Kit (SDK) Release Notes (document MCUXSDKRN) in the Supported Devices section at MCUXpresso-SDK: Software Development Kit for MCUXpresso for details.

+

The MCUXpresso SDK is built with the following runtime software components:

+
    +
  • +Arm® and DSP standard libraries, and CMSIS-compliant device header files which provide direct access to the peripheral registers.
  • +
  • +Peripheral drivers that provide stateless, high-performance, ease-of-use APIs. Communication drivers provide higher-level transactional APIs for a higher-performance option.
  • +
  • +RTOS wrapper driver built on top of MCUXpresso SDK peripheral drivers and leverage native RTOS services to better comply to the RTOS cases.
  • +
  • +Real time operation systems (RTOS) for FreeRTOS OS.
  • +
  • +

    Stacks and middleware in source or object formats including:

    +
      +
    • +CMSIS-DSP, a suite of common signal processing functions.
    • +
    • +The MCUXpresso SDK comes complete with software examples demonstrating the usage of the peripheral drivers, RTOS wrapper drivers, middleware, and RTOSes.
    • +
    +

    +

    All demo applications and driver examples are provided with projects for the following toolchains:

    +
      +
    • +IAR Embedded Workbench
    • +
    • +GNU Arm Embedded Toolchain
    • +
    +
  • +
+

The peripheral drivers and RTOS driver wrappers can be used across multiple devices within the product family without modification. The configuration items for each driver are encapsulated into C language data structures. Device-specific configuration information is provided as part of the MCUXpresso SDK and need not be modified by the user. If necessary, the user is able to modify the peripheral driver and RTOS wrapper driver configuration during runtime. The driver examples demonstrate how to configure the drivers by passing the proper configuration data to the APIs. The folder structure is organized to reduce the total number of includes required to compile a project.

+ + + + + + + + + + + + + + + + + + + + + + +
MCUXpresso SDK Folder Structure
DeliverableLocation
Demo Applications<install_dir>/boards/<board_name>/demo_apps
Driver Examples<install_dir>/boards/<board_name>/driver_examples
Documentation<install_dir>/docs
Middleware<install_dir>/middleware
Drivers<install_dir>/<device_name>/drivers/
CMSIS Standard Arm Cortex-M Headers, math and DSP Libraries<install_dir>/CMSIS
Device Startup and Linker<install_dir>/<device_name>/<toolchain>/
MCUXpresso SDK Utilities<install_dir>/devices/<device_name>/utilities
RTOS Kernel Code<install_dir>/rtos
+

The rest of this document describes the API references in detail for the peripheral drivers and RTOS wrapper drivers. For the latest version of this and other MCUXpresso SDK documents, see the mcuxpresso.nxp.com/apidoc/.

+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/jquery.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/jquery.js new file mode 100644 index 0000000..3db33e6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/jquery.js @@ -0,0 +1,72 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType; +if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1 +},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av); +ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length; +if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b +})}})(window); +/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null; +p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' + + +
+
+
API Reference
+
+
+
Here is a list of all modules:
+
[detail level 12]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
oADC: 12-bit SAR Analog-to-Digital Converter Driver
oCAPT: Capacitive Touch
oCRC: Cyclic Redundancy Check Driver
oCTIMER: Standard counter/timers
oClock Driver
oCommon Driver
oDAC: 10-bit Digital To Analog Converter Driver
oDMA: Direct Memory Access Controller Driver
oDebug Console
|\Semihosting
oGPIO: General Purpose I/O
oI2C: Inter-Integrated Circuit Driver
|oI2C Driver
|oI2C Master Driver
|\I2C Slave Driver
oIAP: In Application Programming Driver
oINPUTMUX: Input Multiplexing Driver
oIOCON: I/O pin configuration
oLPC_ACOMP: Analog comparator Driver
oMRT: Multi-Rate Timer
oPINT: Pin Interrupt and Pattern Match Driver
oPower Driver
oReset Driver
oSCTimer: SCTimer/PWM (SCT)
oSPI: Serial Peripheral Interface Driver
|\SPI Driver
oSWM: Switch Matrix Module
oSYSCON: System Configuration
oUSART: Universal Asynchronous Receiver/Transmitter Driver
|\USART Driver
oWKT: Self-wake-up Timer
\WWDT: Windowed Watchdog Timer Driver
+ + + + + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/modules.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/modules.js new file mode 100644 index 0000000..a02b519 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/modules.js @@ -0,0 +1,29 @@ +var modules = +[ + [ "ADC: 12-bit SAR Analog-to-Digital Converter Driver", "a00009.html", "a00009" ], + [ "CAPT: Capacitive Touch", "a00010.html", "a00010" ], + [ "CRC: Cyclic Redundancy Check Driver", "a00012.html", "a00012" ], + [ "CTIMER: Standard counter/timers", "a00013.html", "a00013" ], + [ "Clock Driver", "a00011.html", "a00011" ], + [ "Common Driver", "a00087.html", "a00087" ], + [ "DAC: 10-bit Digital To Analog Converter Driver", "a00014.html", "a00014" ], + [ "DMA: Direct Memory Access Controller Driver", "a00015.html", "a00015" ], + [ "Debug Console", "a00097.html", "a00097" ], + [ "GPIO: General Purpose I/O", "a00016.html", "a00016" ], + [ "I2C: Inter-Integrated Circuit Driver", "a00090.html", "a00090" ], + [ "IAP: In Application Programming Driver", "a00088.html", "a00088" ], + [ "INPUTMUX: Input Multiplexing Driver", "a00089.html", "a00089" ], + [ "IOCON: I/O pin configuration", "a00019.html", "a00019" ], + [ "LPC_ACOMP: Analog comparator Driver", "a00008.html", "a00008" ], + [ "MRT: Multi-Rate Timer", "a00020.html", "a00020" ], + [ "PINT: Pin Interrupt and Pattern Match Driver", "a00094.html", "a00094" ], + [ "Power Driver", "a00085.html", "a00085" ], + [ "Reset Driver", "a00086.html", "a00086" ], + [ "SCTimer: SCTimer/PWM (SCT)", "a00021.html", "a00021" ], + [ "SPI: Serial Peripheral Interface Driver", "a00092.html", "a00092" ], + [ "SWM: Switch Matrix Module", "a00095.html", "a00095" ], + [ "SYSCON: System Configuration", "a00096.html", "a00096" ], + [ "USART: Universal Asynchronous Receiver/Transmitter Driver", "a00093.html", "a00093" ], + [ "WKT: Self-wake-up Timer", "a00024.html", "a00024" ], + [ "WWDT: Windowed Watchdog Timer Driver", "a00025.html", "a00025" ] +]; \ No newline at end of file diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/nav_f.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/nav_f.png new file mode 100644 index 0000000..72a58a5 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/nav_f.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/nav_g.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/nav_g.png new file mode 100644 index 0000000..2093a23 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/nav_g.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/nav_h.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/nav_h.png new file mode 100644 index 0000000..33389b1 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/nav_h.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtree.css b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtree.css new file mode 100644 index 0000000..41a9cb9 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtree.css @@ -0,0 +1,143 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; + outline:none; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:#fff; +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + background-color: #FAFAFF; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: 250px; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background:url("ftv2splitbar.png") repeat scroll right center transparent; + cursor:e-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtree.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtree.js new file mode 100644 index 0000000..f1e5572 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtree.js @@ -0,0 +1,541 @@ +var NAVTREE = +[ + [ "MCUXpresso SDK API Reference Manual", "index.html", [ + [ "Introduction", "index.html", null ], + [ "Trademarks", "a00002.html", null ], + [ "Architectural Overview", "a00004.html", null ], + [ "Driver errors status", "a00006.html", null ], + [ "Deprecated List", "a00100.html", null ], + [ "API Reference", "modules.html", "modules" ] + ] ] +]; + +var NAVTREEINDEX = +[ +"a00002.html", +"a00011.html#ga054c63c43d8fc35586abf9aa6e8351a5", +"a00013.html#a31ca8ee3406b7a17c793d94469e1e68d", +"a00016.html#ggada41ca0a2ce239fe125ee96833e715c0abacf19933be1940ab40c83535e6a46d4", +"a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea3ec92530953ea9991a65511e64654d50", +"a00023.html#ga95abde78d5cbf569f2b6e4d7942b64df", +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a33255aee9de4a1d093770b218f944d0f", +"a00095.html#ga6db188a71a269613f30825af80c02053" +]; + +var SYNCONMSG = 'click to disable panel synchronisation'; +var SYNCOFFMSG = 'click to enable panel synchronisation'; +var SYNCONMSG = 'click to disable panel synchronisation'; +var SYNCOFFMSG = 'click to enable panel synchronisation'; +var navTreeSubIndices = new Array(); + +function getData(varName) +{ + var i = varName.lastIndexOf('/'); + var n = i>=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + if ($.browser.msie && $.browser.version<=8) { + // script.onload does not work with older versions of IE + script.onreadystatechange = function() { + if (script.readyState=='complete' || script.readyState=='loaded') { + func(); if (show) showRoot(); + } + } + } + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("img"); + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.width = 16; + imgNode.height = 22; + imgNode.border = 0; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.src = node.relpath+"ftv2pnode.png"; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + imgNode.src = node.relpath+"ftv2pnode.png"; + } else { + var span = document.createElement("span"); + span.style.display = 'inline-block'; + span.style.width = 16*(level+1)+'px'; + span.style.height = '22px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + if (anchor.parent().attr('class')=='memItemLeft' || + anchor.parent().attr('class')=='fieldtype' || + anchor.parent().is(':header')) + { + pos = anchor.parent().position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath($(location).attr('pathname')); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',0,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } if (imm || ($.browser.msie && $.browser.version>8)) { + // somehow slideDown jumps to the start of tree for IE9 :-( + $(node.getChildrenUL()).show(); + } else { + $(node.getChildrenUL()).slideDown("fast"); + } + if (node.isLast) { + node.plus_img.src = node.relpath+"ftv2mlastnode.png"; + } else { + node.plus_img.src = node.relpath+"ftv2mnode.png"; + } + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = $(location).attr('hash'); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+ + window.location.hash.substring(1)+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parents().slice(2).prop('tagName')=='TR') { + glowEffect(anchor.parents('div.memitem'),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + gotoAnchor(anchor,aname,false); +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + $('#nav-sync').css('top','30px'); + } else { + $('#nav-sync').css('top','5px'); + } + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + if (node.isLast) { + node.plus_img.src = node.relpath+"ftv2mlastnode.png"; + } else { + node.plus_img.src = node.relpath+"ftv2mnode.png"; + } + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1]; + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + //root=root.replace(/_source\./,'.'); // source link to doc link + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash')); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("img"); + o.node.plus_img.src = relpath+"ftv2pnode.png"; + o.node.plus_img.width = 16; + o.node.plus_img.height = 22; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + $(window).load(function(){ + navTo(o,toroot,window.location.hash,relpath); + showRoot(); + }); + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath($(location).attr('pathname'))+':'+ + $(location).attr('hash').substring(1); + a=$('.item a[class$="'+clslink+'"]'); + } + if (a==null || !$(a).parent().parent().hasClass('selected')){ + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + } + var link=stripPath2($(location).attr('pathname')); + navTo(o,link,$(location).attr('hash'),relpath); + } else if (!animationInProgress) { + $('#doc-content').scrollTop(0); + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + navTo(o,toroot,window.location.hash,relpath); + } + }) +} + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex0.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex0.js new file mode 100644 index 0000000..9dd45c3 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex0.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX0 = +{ +"a00002.html":[1], +"a00004.html":[2], +"a00006.html":[3], +"a00008.html":[5,14], +"a00008.html#a00106":[5,14,0], +"a00008.html#a00107":[5,14,1], +"a00008.html#a46ecb6f7efe54967d816deafdf1c65ce":[5,14,0,1], +"a00008.html#a66356c0246938695521e8a0ece69cf11":[5,14,1,1], +"a00008.html#a6f9542645b06542277cb07ea138e5064":[5,14,0,0], +"a00008.html#a8271667393096dad310f8b2e486b1c4b":[5,14,1,0], +"a00008.html#ga013efc3edfbbd3f7f5044fc7bc2ce802":[5,14,11], +"a00008.html#ga0ea4f61940e0c270858758d51ae1a4d3":[5,14,12], +"a00008.html#ga178d521ca2ee7f33d518b30dfb627d20":[5,14,4], +"a00008.html#ga331e1a82fe5f3d36ee0b10ddea928cd0":[5,14,10], +"a00008.html#ga33fc82023d54cc469fc62ed866a3ca19":[5,14,9], +"a00008.html#ga4e2589a3a011cb833649e301be7fff8c":[5,14,7], +"a00008.html#ga6b5b26d4b5e00361635aede71b048ffb":[5,14,14], +"a00008.html#ga7ad629d52b0a70f95cd2ddb3bee8ab5f":[5,14,3], +"a00008.html#ga856c35b78deb42642464ecfdb8dfa8aa":[5,14,2], +"a00008.html#gaa7c0a15052b6421941faad3c6ea3a5ac":[5,14,5], +"a00008.html#gae217e6b6f23e998b1bfa387e1f3f4181":[5,14,8], +"a00008.html#gae8afb04a61cd16f74eba67061409cd30":[5,14,6], +"a00008.html#gaff80c9cfc3eb8114fcdb525b507f7ba3":[5,14,13], +"a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a23743234a07f6c25a2b14cca0cd863c7":[5,14,4,2], +"a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a25801b009aba402b9810189eb8545b8b":[5,14,4,1], +"a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a629a3a054d3fde07b8f1d4974a9d070d":[5,14,4,3], +"a00008.html#gga178d521ca2ee7f33d518b30dfb627d20ad015e6ad9b09be27a6de122fde6b3997":[5,14,4,0], +"a00008.html#gga7ad629d52b0a70f95cd2ddb3bee8ab5fa56718eb64fdbbd04648466547b326c35":[5,14,3,1], +"a00008.html#gga7ad629d52b0a70f95cd2ddb3bee8ab5fa70a5aa61894fc8d2195652c2fa3423aa":[5,14,3,0], +"a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5aca25ed95469736b1383c06835f1a59a6f7":[5,14,5,2], +"a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acab609612c0f5c6987b71f287d0ab8e02c":[5,14,5,3], +"a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acae003c683374deba88f335221e4f6c62b":[5,14,5,0], +"a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acae6c2b1547a7e476425962d46b44a00f9":[5,14,5,1], +"a00009.html":[5,0], +"a00009.html#a00108":[5,0,0], +"a00009.html#a00109":[5,0,1], +"a00009.html#a00110":[5,0,2], +"a00009.html#a1014edddf4d1ea57e751088dcadace6b":[5,0,2,1], +"a00009.html#a280dc4b4d9c35c2411fe92cf3cadb838":[5,0,1,2], +"a00009.html#a443ffd542f5690ca2cb239181db4aaf7":[5,0,2,2], +"a00009.html#a53ec8373edca82340278a104721ed8bb":[5,0,1,1], +"a00009.html#a5d9fd2ad5f95c7b55a72ac1b5d10221f":[5,0,2,4], +"a00009.html#a6829bb748bc55409fed8615f6a40bb84":[5,0,2,3], +"a00009.html#a8edaf01d23b56ec9b6ad0b1a15fca825":[5,0,0,3], +"a00009.html#a92583334531874821348b01b24f03bed":[5,0,0,2], +"a00009.html#aa37fa0f5c6c3351f811d4f31f40290ad":[5,0,1,5], +"a00009.html#aaf2640b291a24e4222953c7686007a3b":[5,0,1,3], +"a00009.html#ab63c0a8803f4d02e040d55efd8d58e88":[5,0,1,0], +"a00009.html#abb59c0a54988e01653f80c8a59d18b1a":[5,0,0,1], +"a00009.html#abe7f67296372743da67e2eac58f9aafe":[5,0,1,4], +"a00009.html#ae91bf3a0e56181065cda63613b2cb45f":[5,0,0,0], +"a00009.html#afa0a0f7e84c888060b963280035378f6":[5,0,2,0], +"a00009.html#ga0576bc613006f8a4d3bb6db93167be65":[5,0,21], +"a00009.html#ga06879c096d9702b2f378dc2db178e961":[5,0,31], +"a00009.html#ga13edd8c6ef6665907b00a6a819187292":[5,0,23], +"a00009.html#ga160dc82588afa2bca1388b35b8e3104d":[5,0,36], +"a00009.html#ga2432b8bc48a2d3ede87fd021faefeaa5":[5,0,15], +"a00009.html#ga30e86d22d3680c1cf71d5121f162075b":[5,0,22], +"a00009.html#ga3948c83397f351b5ed70bbaf1c5da35b":[5,0,10], +"a00009.html#ga417e499fb2f1ee7ba05088468b392ce1":[5,0,4], +"a00009.html#ga473aadea5ea926efb3bc116089a45191":[5,0,34], +"a00009.html#ga4a1dbe9dcaf32c1eaa98849da1217054":[5,0,6], +"a00009.html#ga4d72a0696ea69cf01a7d121b8e3d1efd":[5,0,29], +"a00009.html#ga51d600553349fbb81d96aaed4e1c22e4":[5,0,30], +"a00009.html#ga538fb95659082602d6ebb205f21573a5":[5,0,8], +"a00009.html#ga5838d9fe654d6e1503be047d08ce5b32":[5,0,3], +"a00009.html#ga5ed68a2a2706c5086136426769cb3a2b":[5,0,24], +"a00009.html#ga69c1682f87ee05264946329a2532792e":[5,0,19], +"a00009.html#ga6bee3a133b58f1badcfded306544d58f":[5,0,28], +"a00009.html#ga6c5be196874795f6647b18fd1f3443b4":[5,0,20], +"a00009.html#ga833046b34deacc484675105225a4b0fb":[5,0,37], +"a00009.html#ga92ee1fdbb8cdadbdc1850e94afed432b":[5,0,41], +"a00009.html#ga93453ff5ee1ccf1429d5035920cdcd10":[5,0,26], +"a00009.html#ga9e87d0842217dd30d2d9699df580e237":[5,0,18], +"a00009.html#gaa134681cb86361faad65aa8c501be403":[5,0,39], +"a00009.html#gaa1deefb49e6221ba772d755bf4aa1a57":[5,0,40], +"a00009.html#gaa407371ebd58e5aa7f75d38bfdad6169":[5,0,17], +"a00009.html#gaa94fca220976d31ee991f1eff9cbe0db":[5,0,42], +"a00009.html#gab625534aa39c1cd25f18cdc0dc3b9981":[5,0,9], +"a00009.html#gab751f161dbaf5e986c476ef3b15c7d0c":[5,0,7], +"a00009.html#gac5899c7af1f9cac7695d7171f83be5f0":[5,0,5], +"a00009.html#gac6aab6fdd21723cfc6ed4437372521ac":[5,0,13], +"a00009.html#gac7a9fa5e3222604314a62d3b2f2331f7":[5,0,35], +"a00009.html#gacbd1fa05c3e1095dd2a8a741db533780":[5,0,33], +"a00009.html#gad4368ec191782815efeea62a95ad3744":[5,0,38], +"a00009.html#gad47d3fd5553ab75cdf6b95268cb94f20":[5,0,11], +"a00009.html#gad5ef8575589083a8db3f508aec014e14":[5,0,25], +"a00009.html#gad857bbdf02a2e6e828e45a8573238198":[5,0,32], +"a00009.html#gada2a96cbb4d3348b943ae8576bae8e51":[5,0,27], +"a00009.html#gae86929708f4bb8be4cc88dcf50c3db54":[5,0,12], +"a00009.html#gaecfd3ba1bc4b014f3c11bc6f348a28cc":[5,0,14], +"a00009.html#gafb17afb34b6114b97b8bfa331465fd23":[5,0,16], +"a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a524bba486c728e5af9ae263057fe7475":[5,0,15,2], +"a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a705b5ce05ce8d2499b4ae652c138339b":[5,0,15,1], +"a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a7a88de53f3fa62d9c9d073619e6f7b77":[5,0,15,0], +"a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5ad18ff3e548f2107156eb50a604d26ee5":[5,0,15,3], +"a00009.html#gga3948c83397f351b5ed70bbaf1c5da35ba0e0b964334a5fafa867734f43c9302d1":[5,0,10,0], +"a00009.html#gga3948c83397f351b5ed70bbaf1c5da35ba77c1e0c1efa82a0e1d23b38dcdc42e8d":[5,0,10,1], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a0086e00d201a353a233cd570617b9128":[5,0,4,12], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a07b97b0e0329e40c1829ac1e54467279":[5,0,4,0], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a091532f8a931257bed8d481d746ce483":[5,0,4,8], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a0d600a9a25c74a6a50f013098ec2a7d6":[5,0,4,2], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a17a3e2ddfb6a1b82a873bb4fa23f33e8":[5,0,4,15], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a21a9e76ef0b99eb7970c72ca8f069aa7":[5,0,4,11], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a261489b6eaf9fd1c667f3b7730670c35":[5,0,4,7], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a2d05c841ef6de9ed853b2847fbd5b389":[5,0,4,5], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a33cf119645a07f65a85a0330e8caac59":[5,0,4,28], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a353d6e15f06ffc2b73459e5d9f8cc0be":[5,0,4,17], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a373a8f9c3452766d74c2af2dd40a1dd4":[5,0,4,22], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a3db46ecb1054e09a7ec16d5b9096022c":[5,0,4,20], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a49619f2fea3c5946285d19531f70246b":[5,0,4,25], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a50a526a957a500f1d1230856e5f62cb0":[5,0,4,10], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a5f66d1dcf413402eff0001649d32f853":[5,0,4,1], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a6387795dcc8897a8d256cdc4a005d1b7":[5,0,4,26], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a648b51f9b03d99e58197f077323cada4":[5,0,4,29], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a85350dd974c40f8f90151461a5b8de7b":[5,0,4,3], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a8d637176a1bcc96a375ac279ea15b046":[5,0,4,23], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a991137c98bcceb8aa70a1a0184117e04":[5,0,4,24], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aa0666658656409d16593317d233b7daf":[5,0,4,4], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aabc9b70b8c8f836ce36bc5fb29b2638c":[5,0,4,21], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aacd6f79515273a505a65a0dd5c8690b5":[5,0,4,13], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aad52525faafab93597654764e5b76e97":[5,0,4,9], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ac9443c7ed6d4344ec7c9e3406b6e9dda":[5,0,4,19], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ae41a39a8a1f2c74ce8641e22edd91704":[5,0,4,18], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ae98f97677a7acd69db8c3f1449eb59a2":[5,0,4,27], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aeab65543e48b53dcb43e6ef75bd4cefa":[5,0,4,6], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aed73601435eac8f9bd001a220d19e751":[5,0,4,14], +"a00009.html#gga417e499fb2f1ee7ba05088468b392ce1af4df6887691e65370852ca7a92d70ea9":[5,0,4,16], +"a00009.html#gga4a1dbe9dcaf32c1eaa98849da1217054a39fb72b080b55020c86ff26f3897e58a":[5,0,6,1], +"a00009.html#gga4a1dbe9dcaf32c1eaa98849da1217054a411d4bc42ea8ab76ee5d408610e5eaa9":[5,0,6,0], +"a00009.html#gga538fb95659082602d6ebb205f21573a5a1e29943afcd9c5266a8401565798febe":[5,0,8,1], +"a00009.html#gga538fb95659082602d6ebb205f21573a5a2515d6b46f5b471d516ceff71dda5bb5":[5,0,8,0], +"a00009.html#ggab625534aa39c1cd25f18cdc0dc3b9981a591af3687c8df2663d34e7d8ff942abe":[5,0,9,1], +"a00009.html#ggab625534aa39c1cd25f18cdc0dc3b9981aa47123e81ebbce4dd5905b0b93d0303d":[5,0,9,0], +"a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0a729a5315c1792954ab9455cc6fdb324a":[5,0,5,0], +"a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0a81d0490f6a7b7fd8301c7af3162c9770":[5,0,5,2], +"a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0ac8937ac90396e6c1ab8b3a8c83c530f8":[5,0,5,1], +"a00009.html#ggac6aab6fdd21723cfc6ed4437372521aca699feabaae444d40c7261e26a2872af8":[5,0,13,1], +"a00009.html#ggac6aab6fdd21723cfc6ed4437372521aca9302e8f9009ba4561655bb2903156522":[5,0,13,0], +"a00009.html#ggac6aab6fdd21723cfc6ed4437372521acab2db65594aeb9ce82f73ace49535d278":[5,0,13,2], +"a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a0879cb322fa21eea083514475b2e5c92":[5,0,11,0], +"a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a4957dc189299bb3397555dbb37991903":[5,0,11,1], +"a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a88f6c1b1c2081034a524d1f07bda8479":[5,0,11,2], +"a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54a84de2355e5d40cc75c1ac6e56feb7153":[5,0,12,2], +"a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54abf34f1a6b0ab0bb0338143eba9344156":[5,0,12,0], +"a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54ac5aec5587ce5a042aed8506c8e732422":[5,0,12,1], +"a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28cca5925d865b6882eeef54d3389dc2e9f98":[5,0,14,0], +"a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28cca9923280b0a76bc961bed79aef5ecb0f3":[5,0,14,1], +"a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28ccaa51dfd6f4acca775dd0838c40eebe25e":[5,0,14,3], +"a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28ccae60e431363f005f7830c1751ec9dbb3b":[5,0,14,2], +"a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a272bdcdc0d5ebca10a10d7f6927f031f":[5,0,16,1], +"a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a4538ae9bd911369a26f43c1b5fa1150f":[5,0,16,2], +"a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a520d81c1c70fab0701cfdcfaa46e1cae":[5,0,16,5], +"a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a5f5dc970993e744974494e283be79e2c":[5,0,16,0], +"a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a8792af738570ae4baa6f58baecc04eff":[5,0,16,3], +"a00009.html#ggafb17afb34b6114b97b8bfa331465fd23aa806598c66d17dadc451cfaab2e6af45":[5,0,16,4], +"a00010.html":[5,1], +"a00010.html#a00111":[5,1,0], +"a00010.html#a00112":[5,1,1], +"a00010.html#a2023ba3491243edb7ad6be41ea0b0f68":[5,1,0,9], +"a00010.html#a22171a4d042ea93fa19f6d7e22caa516":[5,1,0,5], +"a00010.html#a2b0d01a9feb8b378e76f4d3240e9ebe8":[5,1,1,4], +"a00010.html#a2d65011e0db3619f02eacea89b6ab5a3":[5,1,0,3], +"a00010.html#a3305567326ede24c2f45a2d5b788eb2e":[5,1,1,3], +"a00010.html#a34dffb25e8164ae4addccac265358f00":[5,1,0,7], +"a00010.html#a5acedab58178a003114a220a5ea3f6f4":[5,1,1,1], +"a00010.html#a65c26d6fd762782ca1370d3de678e98b":[5,1,0,0], +"a00010.html#a6f8664474411be56853bb70cd8de8b70":[5,1,0,8], +"a00010.html#a998c94c1d03dc0f2be30ae3a3982585f":[5,1,0,6], +"a00010.html#a9a8da1759cc4ea2b284400908075c871":[5,1,0,2], +"a00010.html#ac5c6145f8f3ee5abc6130bea3de2d8c8":[5,1,0,4], +"a00010.html#ad73f9e52f210a4ef91e0732ba882c384":[5,1,1,0], +"a00010.html#ada6854ef1bf21b8f35acba939c389190":[5,1,1,2], +"a00010.html#af153fbc551235805bebdcae4efa95462":[5,1,0,1], +"a00010.html#ga01d767059334ad74d416f6c0287f101b":[5,1,8], +"a00010.html#ga0be2df04c72a8847673bcb6d9714866a":[5,1,12], +"a00010.html#ga0c1eb1e31ad34c8654c981a5e643e2c9":[5,1,7], +"a00010.html#ga14542b3f1b582974fb19b0bf359cfa17":[5,1,20], +"a00010.html#ga2c35cfaacd7e34465baab32d16a4abb5":[5,1,3], +"a00010.html#ga382fc66ff401d2ba9bdee87e3c8c09ce":[5,1,21], +"a00010.html#ga4394d9b57a062c83c444e391c4adf855":[5,1,10], +"a00010.html#ga43dfe06b3cce27e03b4b131557a5237b":[5,1,11], +"a00010.html#ga4d8e5e396dee23cff57192632e98a84a":[5,1,18], +"a00010.html#ga5c6166cad554e91dc0ed36d34b73ee47":[5,1,22], +"a00010.html#ga5ced51d15f9db8f1e6619a5859f6215d":[5,1,9], +"a00010.html#ga6764adb0a0bda236d301256120cddae0":[5,1,5], +"a00010.html#ga6ac2e06f77196123f25e3f5c79ae6ea5":[5,1,4], +"a00010.html#ga6f6b09a873e82dd2fd25338458d0ec0d":[5,1,24], +"a00010.html#ga70d4d9487f981082447042261d13385a":[5,1,19], +"a00010.html#ga86048ff411e845cbde51d9324b5a4b0f":[5,1,6], +"a00010.html#ga9b69d5e0db52ef3ba10acf4f190b9fc2":[5,1,2], +"a00010.html#gaa5b1edec56bda3e46d42405ca8748b89":[5,1,17], +"a00010.html#gabbf90a4a70ccba5078feb488011079c5":[5,1,15], +"a00010.html#gae001e6c47608b339f65c8d2dab02c994":[5,1,26], +"a00010.html#gae9b35ae6b1978ce06851ce86a32af06e":[5,1,16], +"a00010.html#gaea982bc73916fdb713906a2ee49ca604":[5,1,14], +"a00010.html#gaebd796b5bf0c9dff7df7921099d2febb":[5,1,25], +"a00010.html#gaf59ec5edc272fd42a2b66231a16958eb":[5,1,23], +"a00010.html#gafc552b775b278e7e6ea930bb42ca8506":[5,1,13], +"a00010.html#gga01d767059334ad74d416f6c0287f101ba080299d9cd40fafc670901715422dbbc":[5,1,8,1], +"a00010.html#gga01d767059334ad74d416f6c0287f101bac07d74a17c9f9d1b9119b89639f54b9b":[5,1,8,0], +"a00010.html#gga0be2df04c72a8847673bcb6d9714866aac710d56353625bbc2ed100f6dc28111d":[5,1,12,1], +"a00010.html#gga0be2df04c72a8847673bcb6d9714866aacf5512e0ec996846318dc272e7366887":[5,1,12,0], +"a00010.html#gga0be2df04c72a8847673bcb6d9714866aae7dbcc430de0ec04afa4b600985bfaf7":[5,1,12,2], +"a00010.html#gga0c1eb1e31ad34c8654c981a5e643e2c9a29ad6662e14cd08a6d3771ecbd591619":[5,1,7,1], +"a00010.html#gga0c1eb1e31ad34c8654c981a5e643e2c9aba5349742fd4b19f8a7ccc0bdc9cb514":[5,1,7,0], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a02ca618c220ce6b97354404817051716":[5,1,3,13], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a1a48e4c212d0be7fa18b7d325afc86ed":[5,1,3,5], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a3c578a968a4c45b41436d845f456a142":[5,1,3,15], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a3ede3850cc844875718179e5a1008900":[5,1,3,6], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a4553067b9caa5fd98c1d01074891f5ee":[5,1,3,3], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a53723bf555f64a437f12dff73e7f2188":[5,1,3,11], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a5ce0c1dfcdfb869146b24d9270edefdc":[5,1,3,12], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a72314787f99f4a5ba7e51c1445fe65f2":[5,1,3,10], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a85bab394942771628a37eb7b0fd5998f":[5,1,3,9], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a88058e395307862a638c86eaf6528c96":[5,1,3,14], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a88ef286dbf5a39b6ee66968632a28efe":[5,1,3,7], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a9801372f0a31c85b186120eea0c658f8":[5,1,3,8], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5aaccaeef5cb7c021878c1d7c4f5034a76":[5,1,3,4], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ab8afeb42a5dc990d1114d333e05851e0":[5,1,3,2], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ac39fdef6bb40a142936848a676f02e49":[5,1,3,1], +"a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ad4b60dd2d35d11a91c11630a7fe91640":[5,1,3,0], +"a00010.html#gga4394d9b57a062c83c444e391c4adf855a306721a69ff013b3f7784bb5d503fa1a":[5,1,10,0], +"a00010.html#gga4394d9b57a062c83c444e391c4adf855a4d1bfa8129b289d5fe1f56dd980343ea":[5,1,10,3], +"a00010.html#gga4394d9b57a062c83c444e391c4adf855a505d962a510aaf415ee47e6d92ca932c":[5,1,10,1], +"a00010.html#gga4394d9b57a062c83c444e391c4adf855aadd3a0bd70e2f2795032fc953d97c677":[5,1,10,2], +"a00010.html#gga43dfe06b3cce27e03b4b131557a5237ba50f00dbce20a1a3390c77501baccf4a0":[5,1,11,1], +"a00010.html#gga43dfe06b3cce27e03b4b131557a5237ba70a38885a33a8996934ad68c3322df89":[5,1,11,0], +"a00010.html#gga43dfe06b3cce27e03b4b131557a5237baca7d1fdc5128af90a17c6e71a9133dda":[5,1,11,2], +"a00010.html#gga5ced51d15f9db8f1e6619a5859f6215da839864dc82a65aa09bccd6c672f23a80":[5,1,9,3], +"a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dae746038d0fc4423106a252b02ec58ac2":[5,1,9,2], +"a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dae787b59b2f377b1ef65d0c13f45e757e":[5,1,9,1], +"a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dafe63c76a86da5c022a74985bd052a07f":[5,1,9,0], +"a00010.html#gga6764adb0a0bda236d301256120cddae0a1d4948f18e10cda189c9c9f89b76f0f8":[5,1,5,1], +"a00010.html#gga6764adb0a0bda236d301256120cddae0a404cfdab3986fef656232281d68a4e6b":[5,1,5,0], +"a00010.html#gga6764adb0a0bda236d301256120cddae0a84d8d50b7d358cbc9612a1751074ee15":[5,1,5,3], +"a00010.html#gga6764adb0a0bda236d301256120cddae0ac64c1bc40831fc72981bb42514124e24":[5,1,5,4], +"a00010.html#gga6764adb0a0bda236d301256120cddae0afd67816e707734658900577dfbd4e2bc":[5,1,5,2], +"a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5a2ce349ca4f3712664ea61a07cbadc63d":[5,1,4,3], +"a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5ae1bd26a87ec4a5bb4c250856cf1c1994":[5,1,4,0], +"a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5ae4a63900c77ec1f5fae1ccea5ca30833":[5,1,4,2], +"a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5af27b5126282bcda28c64a9e9be550b88":[5,1,4,4], +"a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5afbc435647bf5d8ec4b8133bb54457d8b":[5,1,4,1], +"a00010.html#gga86048ff411e845cbde51d9324b5a4b0fa1a35bccccdc8b9c911a96a14f6413579":[5,1,6,0], +"a00010.html#gga86048ff411e845cbde51d9324b5a4b0fa9210dee59a14aaec97257fac9a20ae9c":[5,1,6,1], +"a00011.html":[5,4], +"a00011.html#a00113":[5,4,0], +"a00011.html#a1be863d493ed08967d4abbe8faf8c918":[5,4,0,0], +"a00011.html#a5777806e347fa36340fc79e5928f5d83":[5,4,0,1], +"a00011.html#ga04c66d991cdc5cb35e31c27881bc549b":[5,4,33] +}; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex1.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex1.js new file mode 100644 index 0000000..eb598a1 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex1.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX1 = +{ +"a00011.html#ga054c63c43d8fc35586abf9aa6e8351a5":[5,4,51], +"a00011.html#ga06cf7a516d7600127c0af0e1e0cc5759":[5,4,9], +"a00011.html#ga07ba7d7b5ee69b71268190fe133c0a25":[5,4,45], +"a00011.html#ga0c0cf401613f31feb4a9eb723ad51154":[5,4,1], +"a00011.html#ga0da8ff794475b44b15cda07999bc8678":[5,4,3], +"a00011.html#ga10c8c8ccc077404a00e1121b5d18e4a8":[5,4,44], +"a00011.html#ga14b6a46da6b30e56001d7526a8546b42":[5,4,49], +"a00011.html#ga2086545220b602cb4c0f1a141893447e":[5,4,58], +"a00011.html#ga2172b1f5c29b7d0bf0fe8a9c9d45ed43":[5,4,18], +"a00011.html#ga2323a706e6e7796fa2e352a5b5a70f59":[5,4,19], +"a00011.html#ga23c8b3ae62f7865b2e228408be95946d":[5,4,26], +"a00011.html#ga23dea91a4cc65d3b9ba93c83313496a1":[5,4,15], +"a00011.html#ga24f65b321ca1b862cf159bec396453bd":[5,4,24], +"a00011.html#ga2b8416b451bb271a2ffce397ef822dff":[5,4,22], +"a00011.html#ga2d33480c8967a6bac98512e0c47c6b07":[5,4,52], +"a00011.html#ga314692030453038d60194d3e6245345e":[5,4,47], +"a00011.html#ga386d59c21453d1914f3c8194010ff277":[5,4,65], +"a00011.html#ga4216bb5c85c6f6df1d128c9bfe5cd955":[5,4,56], +"a00011.html#ga468095bb082b9a2a50a2e05e1ced88c0":[5,4,36], +"a00011.html#ga47b7ce0a4c83a359f4bc1f2714a13761":[5,4,43], +"a00011.html#ga4b1754d575449d4dab7f7e3f0131650c":[5,4,12], +"a00011.html#ga4eb9737ada73b9a575250de526433dff":[5,4,55], +"a00011.html#ga53acae220d651789bb505c53c73ecf2b":[5,4,48], +"a00011.html#ga564beca73d288c0d6fd237f541e279e6":[5,4,30], +"a00011.html#ga5786421429cdc95b34fdeb04d8ec9241":[5,4,61], +"a00011.html#ga5863562919d2a5cb6c8e8dcaf46cc236":[5,4,53], +"a00011.html#ga591437e580785afce2e3c74e021393f2":[5,4,59], +"a00011.html#ga59a363f0296ea51011dd86b405d5db58":[5,4,28], +"a00011.html#ga5a8ba9cbce79bf443b2b1ba97d4c5475":[5,4,13], +"a00011.html#ga6506e7cdad8dcf18347cdcb1acd8c17d":[5,4,57], +"a00011.html#ga661e3aff590ce2f086ba06745317480b":[5,4,14], +"a00011.html#ga73a69ec6e63f37b9341025bbe87ced45":[5,4,64], +"a00011.html#ga7c6017a8657328bdaad58beb19de84e1":[5,4,10], +"a00011.html#ga7dd0bd48c4a5a68fef7f9524d8999b4b":[5,4,37], +"a00011.html#ga85bf7440c0d77269e3db764083110334":[5,4,32], +"a00011.html#ga957f6f224315c19d89781bd344c42cb3":[5,4,60], +"a00011.html#ga9ff656514a680eef6ffbf40f4eef0bfb":[5,4,31], +"a00011.html#gaa540fadbafefad92f9f7ae3f63b7a45c":[5,4,5], +"a00011.html#gaa6be3b84fd2a57ec1165954d6c4564e8":[5,4,35], +"a00011.html#gaaa964f2c87ddd18a09c5201e22925fe6":[5,4,39], +"a00011.html#gab3c8a974e25f615fe023579c847fae6c":[5,4,6], +"a00011.html#gab61f56487f2c5e6d2ae2033848613d5e":[5,4,63], +"a00011.html#gab68022e8d8f60a72f86a6a6c13b6e2f4":[5,4,34], +"a00011.html#gabbdbb2bc96f1206cfe79fcf8896ae116":[5,4,46], +"a00011.html#gabdb5fc301b32e8998fb9b52e86c5cc1a":[5,4,21], +"a00011.html#gac0c74371f4f724c78ef233de79c3cf14":[5,4,17], +"a00011.html#gac344a8334a482bcbcbdf0c4828db872c":[5,4,29], +"a00011.html#gac3a1bd1656603951722b345b45f888e9":[5,4,23], +"a00011.html#gac72477e518b30ceb277b83f555ac0d9e":[5,4,16], +"a00011.html#gac86986db423673c1d9b46882ccd6b3a9":[5,4,11], +"a00011.html#gaca0f0dcb61434d727340ddde5f131d91":[5,4,41], +"a00011.html#gacb72cd4fce384788f3eb8ccc05e0ce7f":[5,4,38], +"a00011.html#gad0c6602129535798b81d753e67cabc99":[5,4,7], +"a00011.html#gad73456f246d91b7e9dcbe6c6fc180a2f":[5,4,20], +"a00011.html#gadc80b6c53f806d771a3f6fd65c68a08d":[5,4,62], +"a00011.html#gae60a901716b1b7a581b9a1e4034479cd":[5,4,50], +"a00011.html#gaea083b34e0ae608a94fce91da973a544":[5,4,25], +"a00011.html#gaef5bfe2c53a7ededa861c4e414cdbf36":[5,4,4], +"a00011.html#gaf4232ca3ff8c9ea3d8b3cbe4bac6d87a":[5,4,2], +"a00011.html#gaf65f5b1578bde1ffc2a10ebf2ca66d1d":[5,4,54], +"a00011.html#gaf74854e9bcee544d7646c5bafdc00bd3":[5,4,27], +"a00011.html#gaf85cf02f515cd756873bf2a74ee143e2":[5,4,42], +"a00011.html#gafe0b410109a29c465df0b4dcbb338ff3":[5,4,40], +"a00011.html#gaffc6cb67ee605165b0660db6031d5871":[5,4,8], +"a00011.html#gga04c66d991cdc5cb35e31c27881bc549ba1f337e9ad4557c3916c55340676c2b8e":[5,4,33,0], +"a00011.html#gga04c66d991cdc5cb35e31c27881bc549ba888e842686be1af0ded28719bf24d0a8":[5,4,33,2], +"a00011.html#gga04c66d991cdc5cb35e31c27881bc549bab45a2c903d5f052fb055b96793bde296":[5,4,33,3], +"a00011.html#gga04c66d991cdc5cb35e31c27881bc549bad5b4cf5a82ac9fdac6b51d63723b2f8e":[5,4,33,1], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da02834dc4dbeb1ca14211279916182425":[5,4,26,2], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da0ffae7aa0d9dbc52524beb5f82ced038":[5,4,26,30], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da11dd047399d3cf7893682897e34682de":[5,4,26,0], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da1b9f348e8d5bc1715af7366be3ca87c7":[5,4,26,1], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da1d4898f8634e2f18e6a154e2b1a4120e":[5,4,26,13], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da2073aacb108d570b5cd4099d6294d74d":[5,4,26,28], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da239422d8b3e53afadaf651015ffb5065":[5,4,26,20], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da26876b4bdecc15c46c379a289441b3c6":[5,4,26,12], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da2bc16e3ee343b4abfc46ae9506461e97":[5,4,26,22], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da3922459ccb3f2fd90ac39813c0dc39f0":[5,4,26,26], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da5c44f9347603d8c7fd8eda74e3b3e40f":[5,4,26,17], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da5f0100f89ed9f83b8eb76dc0de0d08fd":[5,4,26,21], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da63bcbbef2627c667b204eae91c3a0718":[5,4,26,5], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da689e957d82ca723a1a0cc671ba216bf5":[5,4,26,19], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da72b9be69422d94586bf09e6bd3d2632a":[5,4,26,18], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da7b405d8427fbdfbf1a7f910f828d8ed6":[5,4,26,6], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da82cabf9d7a17650616d227b23ab2a35a":[5,4,26,24], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da909ccfe84f4275dd7b6ba09235583230":[5,4,26,16], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da9e86fefe81e4318044e0f234b3df97b0":[5,4,26,29], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da9ec19029dc1ad34cb7ae0091e97b7f7d":[5,4,26,4], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946da9f0fcaa6854d2b404e0b67a2239893ae":[5,4,26,31], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946daa1cfbe8497997fc6dff0d7f0c070aa5a":[5,4,26,11], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946daabce09bc09630409474602bc5eab7c10":[5,4,26,27], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946daace73b709cda5c34ba5bdf6888605f1f":[5,4,26,8], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946dac6997ec12e66b5e4fad9aa52ef6a2db0":[5,4,26,9], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946dac6e6ee6e9f7b28e5c3818324c852b05f":[5,4,26,3], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946dad2e9ebc3825a65fae3c13efbc805a128":[5,4,26,23], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946dad386313192805ba225b0da24e078d387":[5,4,26,7], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946dadd0ceacddcfe95c6e7c8bbcfd2f4ca60":[5,4,26,10], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946daea833e6e503de81899699c1bb23d774b":[5,4,26,25], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946daf079522d21082e83bd0192040a103e8b":[5,4,26,14], +"a00011.html#gga23c8b3ae62f7865b2e228408be95946daf1e8b91e80a3a9a4db038c0b4cf7e381":[5,4,26,15], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6a09f8f2b77ad4804c199404df2f9ea50f":[5,4,30,6], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6a261a52fc17b6e0652c7f87470de1de8d":[5,4,30,2], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6a4c1c5972ed4ae79fad8e02a56031c002":[5,4,30,8], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6a762e9bc889c580c8a5083c51869f19c8":[5,4,30,15], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6a98d3b066806df88b3c330005da251ecf":[5,4,30,9], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6a9f301770a8bc08fb5acbf32b46d8521c":[5,4,30,3], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6abd3904f3cdbf1323d1e49d2807f3fa5e":[5,4,30,5], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6abe6204f4fa5c74e82d3bf0dd5a61c914":[5,4,30,10], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6ac176648f32c98ffae06e1dbe90775923":[5,4,30,1], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6ac6cc9f4ed8bbf5bec37add7161537d1d":[5,4,30,0], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6ace0a3b71f10ba38150ee5622e8ce3690":[5,4,30,4], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6ad12681c88e869163d4aed173ff0e6c64":[5,4,30,7], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6ad4169afafb522bc5829d1df64170e346":[5,4,30,13], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6ad4547d866fcc745745ce5e31434eb099":[5,4,30,14], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6afb2f3adebaed700221c6c93f113a2a90":[5,4,30,11], +"a00011.html#gga564beca73d288c0d6fd237f541e279e6aff64cf52ab7c013a83fbf131a864614f":[5,4,30,12], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a03a2a6a3073f4ae89de347a932695305":[5,4,28,63], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a066679b9e0a01ccd0aad6e6caa643f2f":[5,4,28,18], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a0b370ac43c3546605db7ba397ba9a775":[5,4,28,31], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a0cd69802e0dca5ea59301801b17d24a6":[5,4,28,60], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a11296d1ee4ea06d70c91789f988c8a43":[5,4,28,51], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a1b183d67629d90ddc1a9b9baf2ebc285":[5,4,28,21], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a1f6cedfc78cc220b123a36ae896c51c4":[5,4,28,4], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a1fe8170ca9a5fcee3e0b3fa1453eb481":[5,4,28,68], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a20d47beaa61ee59b61c34fa4f7e30d21":[5,4,28,74], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a225c7ee90596ed70ba883f4db61aa8a7":[5,4,28,57], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a22fcfa5a6ecb31823d0019891a10e825":[5,4,28,11], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a28b61eb46fb752a05934e2d44450acc0":[5,4,28,1], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a2e3cfcd9f9e0255bee678609d2a03459":[5,4,28,10], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a3013697f548b1926d8c79f052a43c250":[5,4,28,54], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a3783440f6a72a888a464ad824842740e":[5,4,28,29], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a37e357b51fc23fcc649e5c1085a57524":[5,4,28,36], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a4153c95a0b0f7e3c4b3090e7b7157815":[5,4,28,62], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a43ab6417acfda68bfa6fb3228bc0fa22":[5,4,28,23], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a45061bbb0d60c123b9cf999ce58c24f0":[5,4,28,7], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a45a5f9cbfc0626d893768c61e922dd1e":[5,4,28,26], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a473a6161d9f0f5f580c2e8b913694831":[5,4,28,77], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a4c795835151e3db8e027500091ca7235":[5,4,28,20], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a4e4a114969e2446efb826b0f436e60b4":[5,4,28,25], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a56958ea244b66882f17bd6bdad0e8b8f":[5,4,28,49], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a5cff4ddf26d639e435ce79fe5e83d866":[5,4,28,43], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a61f8c26921cefcc9988472806478400b":[5,4,28,64], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a63e60987f0efbabef20f4a0fcc6f4007":[5,4,28,71], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a67d2eb5235a0677d1ef161e5e1c2b340":[5,4,28,12], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a6a83c84726acb80554e10c8c3758e071":[5,4,28,45], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a6d4885caf9110a788abb71f9c482141c":[5,4,28,48], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a7ef63f722c9c6e188ea209ba84f6991c":[5,4,28,15], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a80a728627fb060445729c7fcb12cd1b8":[5,4,28,52], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a841785f980e4c406eeecdcf07559fe66":[5,4,28,13], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a845c271da53362455548e3a2d785e46f":[5,4,28,59], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a84c08938ba9d92701ad3d29267565309":[5,4,28,50], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a8670e7d6a9f2afb045fbf54dc13c4bb2":[5,4,28,46], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a8671f2c92f6e049ed8b2f3b7a5b9b296":[5,4,28,76], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a8f752fd4f9b1ebce048719fbc9d1962b":[5,4,28,53], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a91f272ba2ca7171ce0689d39f9a894af":[5,4,28,5], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a92f67286aebd8e0fde633cf4b3bd8b57":[5,4,28,39], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a98f2d7502907ece893c0bbee9202651f":[5,4,28,30], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a9d6f615bb923c12b2d7b831272e85daf":[5,4,28,28], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a9f985237f28fdfa44b6a856c3e2f4dab":[5,4,28,8], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a9fbd759cc60932bb0896625543477290":[5,4,28,17], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58a9fe34f41e6cfa3cd3a0ef15ba9184bb1":[5,4,28,41], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58aa5b46ff93c42325f2c8d93b1bfbd2555":[5,4,28,75], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58aad0657c34aef515cd39d693c8a7896b2":[5,4,28,61], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58aad11950d648756bba92e741b9c6b4cd0":[5,4,28,47], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58aaf28b28236e7172dd366aab893c08de3":[5,4,28,27], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ab434281b6471a116a444172bf8a7bf91":[5,4,28,38], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ab78b4e89fcd4147c3143fee94034a356":[5,4,28,56], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ab7e3ded84a0cb9fbc059b9d2604ba9c0":[5,4,28,2], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ab8065d6f5e9b16e9410feccef7f1c10b":[5,4,28,37], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58abae02f94616cc17800067d5601943b5e":[5,4,28,3], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58abc4f63896a33dac1ef8825e1fe86488b":[5,4,28,40], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ac70f329af8bfa7becadf7396b6c55aac":[5,4,28,35], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ac891ded4c265bfab790d733acbacb753":[5,4,28,44], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58acdb981a51b4fe1d9405a3ddfc34b50b9":[5,4,28,66], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ad06dfa176e453cfc40aa6b999e68b34c":[5,4,28,72], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ad0784125581fd7bf09f4b3bab3af725d":[5,4,28,14], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ad0d4f0ebaf887e6ae96436fa7f0d2f15":[5,4,28,9], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ad30f9ec4dd8bf91c3b072f8eae495a3e":[5,4,28,34], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ad4c08c5a89da40d06718a4f83a999a15":[5,4,28,24], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ad5a8e9d24a93e8c571f87c60a42c7b4b":[5,4,28,69], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ad5e83713fbdfcd0d5d67b6e679676874":[5,4,28,70], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58adac12c9424be5e807358f910e834b8fe":[5,4,28,65], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58adffea42a42dc4f9d329a9d24822b9173":[5,4,28,6], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ae19e4e49559079c2f95f998c37029642":[5,4,28,42], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ae27646652709428349bea6c7044c070e":[5,4,28,58], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58ae4d335d5f4a2a8de27f87f8c6c38ddfd":[5,4,28,33], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58af06770587aa45bbb62d1e4fe36d03d81":[5,4,28,16], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58af1d8576caccfd1e48d121fae4315c10d":[5,4,28,0], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58af2ea89b865003dc40f8923f67d7bb366":[5,4,28,73], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58af3df9606907ec93d127cf6759090dc64":[5,4,28,32], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58af45a833dead43235df03a982dc25ea33":[5,4,28,19], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58af596a7a7c2e36598e14144cc13eb0733":[5,4,28,55], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58afa1754a6f8ad6663b97370dd3d2e4f3b":[5,4,28,22], +"a00011.html#gga59a363f0296ea51011dd86b405d5db58afa871e16cf926d8a08dce1a52f418066":[5,4,28,67], +"a00011.html#gga85bf7440c0d77269e3db764083110334a01135115df0c0b0525f2b1391ee9d9ca":[5,4,32,1], +"a00011.html#gga85bf7440c0d77269e3db764083110334a29c4fdcb48fba40928b278765d0e3843":[5,4,32,2], +"a00011.html#gga85bf7440c0d77269e3db764083110334a60f89d729c96295d1aaa741a412d58ab":[5,4,32,0], +"a00011.html#gga9ff656514a680eef6ffbf40f4eef0bfba931823a2fb900cbf75da504129ef8d91":[5,4,31,1], +"a00011.html#gga9ff656514a680eef6ffbf40f4eef0bfba98131c5eeabd0e169e93b174aebdcf86":[5,4,31,0], +"a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4a0aecd9451c5bf4525fe17a7b4734f58f":[5,4,34,0], +"a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4a85dbf0a96c672abcfbc08dfc231088d6":[5,4,34,1], +"a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4aa4b20f43266422065fa678e4e9ee6e92":[5,4,34,4], +"a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4ab6adbaab8fe4761c0fb828aa7066bd80":[5,4,34,2], +"a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4afa92bbf8fcfb74ceea172667409f7643":[5,4,34,3], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca05fc477260e0f901a194bed1762e388c":[5,4,29,5], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca2540a6d8147d6328653834c72c62f6d5":[5,4,29,7], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca3f4c007e9c6a7cf58407f8f0974b7900":[5,4,29,3], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca7b3998fdf96eb884e35ff56f40feffbd":[5,4,29,0], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca87f8cd7b1b138c47af69a0bb106d70f8":[5,4,29,6], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca8ffa1d0afc3fa83f1d5bd563ba2329a2":[5,4,29,9], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872caa6c1d0bc0cb2e70e5801d2d2a55d6150":[5,4,29,1], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872caa7236a2c00237ca7ee5b2ff55058ded6":[5,4,29,2], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872cabdbfc756defca27f8444ebccc928eae5":[5,4,29,4], +"a00011.html#ggac344a8334a482bcbcbdf0c4828db872cacec00650d4292d94c3aa236bf33b7fb4":[5,4,29,8], +"a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a01a946b874db04d12aba4c3bbe461580":[5,4,27,2], +"a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a01d0c099adda9e435281c887b12095a8":[5,4,27,3], +"a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a18a8be3e9ab0fd908821ff17940317c6":[5,4,27,6], +"a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a1de4a40f5399eb025d5faefda7491918":[5,4,27,0], +"a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a2c5ccaeff2df0dc3c67a5aa36e5576d3":[5,4,27,5], +"a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a30e6333c132740b84bf2ce94b8c44a8f":[5,4,27,4], +"a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a5aeefcf41548bb4dd09f1e17f39da7e0":[5,4,27,8], +"a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a86d48329b3492ab94a5da3925c73622f":[5,4,27,1], +"a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3aa27972710b7df62d66918584843aee06":[5,4,27,7], +"a00012.html":[5,2], +"a00012.html#a00114":[5,2,0], +"a00012.html#a673b6508efa086da7b7bd537a876241e":[5,2,0,4], +"a00012.html#a88920b83ff1317f511c1e9f4916b3b30":[5,2,0,5], +"a00012.html#a9982af011e3e1fc9756dcee96281ebda":[5,2,0,2], +"a00012.html#ab34c2bedb6fc476f9cbe760b6d45a417":[5,2,0,3], +"a00012.html#aecb53a8e8a78e3273c6d3b2c874ab7f2":[5,2,0,1], +"a00012.html#afbe53ea36b200e69cb7f693e6f0a11f1":[5,2,0,0], +"a00012.html#ga0c8ce306124e645b27798fad68f3ac4f":[5,2,11], +"a00012.html#ga33f99b0cb581e677dbc009a695adf5d5":[5,2,10], +"a00012.html#ga37d19c87e3adeb47db8f6967df0496e1":[5,2,2], +"a00012.html#ga3c2e6ecc571510470849dc078685d71f":[5,2,6], +"a00012.html#ga43edd3bec710cb1ca121bfcadbc9b6f7":[5,2,7], +"a00012.html#ga5ce766fd31166d3b0d2d7ba594dac0ce":[5,2,12], +"a00012.html#ga7114311534a33b6688f35ceaaa3f7832":[5,2,4], +"a00012.html#ga7a4d725b011a98efb29a26bcca04c35b":[5,2,5], +"a00012.html#ga7daa8fa0df9f42a98afcf766a63d931d":[5,2,3], +"a00012.html#gab681cd7c82fbafd927d6b22f23a81804":[5,2,8], +"a00012.html#gac70c03eacdde850267d7fe0d7dca9591":[5,2,1], +"a00012.html#gac745b626d9c7bd9f3da7986374483389":[5,2,9], +"a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da12ca2ee766202eb962135c76c00b10aa":[5,2,3,2], +"a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da4a13840f3031b3aed89f60ba37a34c8b":[5,2,3,1], +"a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da9ef1c3d85d4f13199e7df63d170bf6f6":[5,2,3,0], +"a00013.html":[5,3], +"a00013.html#a00115":[5,3,1], +"a00013.html#a00116":[5,3,0], +"a00013.html#a0e8b29f0c0f74c5273942a521e3b16d6":[5,3,0,3] +}; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex2.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex2.js new file mode 100644 index 0000000..7a4f6f6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex2.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX2 = +{ +"a00013.html#a31ca8ee3406b7a17c793d94469e1e68d":[5,3,0,4], +"a00013.html#a94fe2c63ce7fcb5cf68f9ce73974a3e8":[5,3,0,2], +"a00013.html#aa8baec2c586854dc58ff4cdb82b7996b":[5,3,1,2], +"a00013.html#aaa00b16aba273e3f11f9480154acc1e5":[5,3,0,1], +"a00013.html#ab72ef3a10cab9754d3cecb44ef7ad6ac":[5,3,1,0], +"a00013.html#ac07c23c0bbadea74c24c03e401321fbc":[5,3,1,1], +"a00013.html#ae09fd69820c9285d7f146260d2c51584":[5,3,0,5], +"a00013.html#afa3614f09e787565b3514ddd4d9545a0":[5,3,0,0], +"a00013.html#ga0971c614f932bcf55994bf6c92325eb2":[5,3,9], +"a00013.html#ga09f5eb858c001377062fe0b8a0d5bd29":[5,3,6], +"a00013.html#ga0b2f1b62dee7adf60574c3410e7bd26f":[5,3,22], +"a00013.html#ga22cef1fc5f8e23a35b6c3a012e3d143c":[5,3,7], +"a00013.html#ga24464606cafc0f316116b164966a906e":[5,3,24], +"a00013.html#ga2a70f03b835a36e5b321861d0b0ebb41":[5,3,16], +"a00013.html#ga2fbf5cfa219c31ac16f3786d6897dc3f":[5,3,3], +"a00013.html#ga3c7e8e1eb12e5f48ecca04c8128a9545":[5,3,30], +"a00013.html#ga43b7410d9c6aab6aad466bd481b9222b":[5,3,28], +"a00013.html#ga5d04834d4b29c8505b0a89b8875c2e78":[5,3,18], +"a00013.html#ga635d2570c0274ff40f10ac7b5f3317df":[5,3,26], +"a00013.html#ga64b1d0ba86d952b5ec30e201880c7bb5":[5,3,19], +"a00013.html#ga740677adee6ada817bb45ed62607c3c4":[5,3,11], +"a00013.html#ga7ea373165af081e0e1700f7a3ba56642":[5,3,31], +"a00013.html#ga89b626fd25a5b3bbd511672ff51618f8":[5,3,2], +"a00013.html#ga97daa711029883d46933204381f44c9f":[5,3,13], +"a00013.html#ga9cc18e14c871b2a79888a4cdacbb0eee":[5,3,8], +"a00013.html#gaa7de0b40e3127d3d8901398df50feb20":[5,3,23], +"a00013.html#gac37706bc06bc7590ce1e3d1b4bf73638":[5,3,4], +"a00013.html#gac44f44c3f88125a41081ca2a7cf06223":[5,3,14], +"a00013.html#gacae8e1dbb60368ab01a9564de7eda037":[5,3,12], +"a00013.html#gacb1f53d8b6a2b157194983172c448707":[5,3,15], +"a00013.html#gad65b4a95cbfca13083f6d93e7a46f1cb":[5,3,27], +"a00013.html#gad9f4a6073c669662f300d395d66e16bb":[5,3,17], +"a00013.html#gae279db71f27ceb5a6d15ad8d17cbd670":[5,3,21], +"a00013.html#gae4d610de22fd8b8c9577e774dac88ac5":[5,3,20], +"a00013.html#gae60f7d34c9e499abba96e5979ee1818d":[5,3,5], +"a00013.html#gae64285eb2e52bf5cc2b723870392ff60":[5,3,10], +"a00013.html#gae9a75a0e18a696baa795ae67aa30a120":[5,3,29], +"a00013.html#gaf1b8088779288346a7508dc7ef6e99d1":[5,3,25], +"a00013.html#gga0971c614f932bcf55994bf6c92325eb2a05694ae09ff514b7237388b33acaaa99":[5,3,9,0], +"a00013.html#gga0971c614f932bcf55994bf6c92325eb2a1f67c8c1e8039ca326e9f25fabffdd0d":[5,3,9,3], +"a00013.html#gga0971c614f932bcf55994bf6c92325eb2a47f020e940359f6f08c5c8171d2942b9":[5,3,9,1], +"a00013.html#gga0971c614f932bcf55994bf6c92325eb2a5d70800d3cc33733d42f525242edbbf4":[5,3,9,5], +"a00013.html#gga0971c614f932bcf55994bf6c92325eb2a5fe0ea705babd6351564e59c8db8e928":[5,3,9,4], +"a00013.html#gga0971c614f932bcf55994bf6c92325eb2a68a56db3574cd0ea3bb783c7d13f0894":[5,3,9,6], +"a00013.html#gga0971c614f932bcf55994bf6c92325eb2ab15c129ca07d334ae13d77e0646c7287":[5,3,9,2], +"a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29a42b2f4d5cb9a524f87f6626169155207":[5,3,6,0], +"a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29a90643d7c03749f64e0d20cfcf55a80ed":[5,3,6,1], +"a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29ab4602750f83eba0e5cebd0f2ed91a3c4":[5,3,6,2], +"a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29aba7194efe10386e467b082fc0b847031":[5,3,6,3], +"a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143ca2086fd6712693ac8f0758553ff7bb3d3":[5,3,7,1], +"a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143ca4ad940f7bea1dbae09b156ec0415f5f2":[5,3,7,3], +"a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143cac387e950c7d8c19c1464dd27e5c7396f":[5,3,7,0], +"a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143cae1b0b02fe1e0af81f62fb40ff8339b8f":[5,3,7,2], +"a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3fa9d6d30f6a5498d009cd87fafee3bccd5":[5,3,3,2], +"a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3faa13dee3bb29b8962385da2ac6d8dc938":[5,3,3,0], +"a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3fac4fcf23f15faa447489ef7ccc4d6cb25":[5,3,3,1], +"a00013.html#gga740677adee6ada817bb45ed62607c3c4a38d629ce598178fd96f48660e63ae1e7":[5,3,11,1], +"a00013.html#gga740677adee6ada817bb45ed62607c3c4af805d881e4dc37e339a8434c1816f930":[5,3,11,0], +"a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638a18a0af674c980ebbdfd0413dcfa3f3c0":[5,3,4,1], +"a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638ab73ca62f50120abc4662c750925e9b5a":[5,3,4,2], +"a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638ac8297b7a4be687e63200fc22be1d2f02":[5,3,4,0], +"a00013.html#ggae60f7d34c9e499abba96e5979ee1818da38a7356dba8d8a5a8877e9de9fde2faf":[5,3,5,1], +"a00013.html#ggae60f7d34c9e499abba96e5979ee1818da6acca2e2ccd6cc6d08a3d958e47c80fb":[5,3,5,3], +"a00013.html#ggae60f7d34c9e499abba96e5979ee1818da98b35c6f057b201073c8afa4bdce60ed":[5,3,5,2], +"a00013.html#ggae60f7d34c9e499abba96e5979ee1818dac06fa7bc66bbb978bc14348fc0cb4633":[5,3,5,0], +"a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a02e58518795f05162313b509a600a3d3":[5,3,10,3], +"a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a5504b0ec94b832a46824ec297a106df1":[5,3,10,4], +"a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a901042ca905603329df3cf1d316a2e53":[5,3,10,1], +"a00013.html#ggae64285eb2e52bf5cc2b723870392ff60aaf0224295d4f330d0d61d10ab30f38ea":[5,3,10,6], +"a00013.html#ggae64285eb2e52bf5cc2b723870392ff60ad76fd4735e0604307b50d2fd12cba3c0":[5,3,10,0], +"a00013.html#ggae64285eb2e52bf5cc2b723870392ff60af3a0db73d48116ea419af737c706b30b":[5,3,10,5], +"a00013.html#ggae64285eb2e52bf5cc2b723870392ff60af5a6c5ee43a01803e82c26181dedfa97":[5,3,10,2], +"a00014.html":[5,6], +"a00014.html#a00117":[5,6,0], +"a00014.html#a64eb5fd25bfaaa5593caf6e9116dbb5b":[5,6,0,0], +"a00014.html#ga0331d8c8f699fac12c93a7796d961923":[5,6,3], +"a00014.html#ga0a654edfcbb8a6fc80c51a3222fc4d7b":[5,6,11], +"a00014.html#ga18bbc1eedecdc090c14578740271db0e":[5,6,5], +"a00014.html#ga24947c73973264f0d24d77394c3518e5":[5,6,9], +"a00014.html#ga5ecbd1908f7743934ccdb090ca0cb1d8":[5,6,6], +"a00014.html#ga82eecb700b3afeda8b95a6151d8904fc":[5,6,2], +"a00014.html#ga92d95f6b17de859a557ed350a86ff56e":[5,6,1], +"a00014.html#gab9cec79763041b1df321a5839982feba":[5,6,4], +"a00014.html#gabaeabddab20ad3c45aed786a7d12d350":[5,6,7], +"a00014.html#gabd7c9e5a5c0b6b35ed2854581f1c6fe8":[5,6,8], +"a00014.html#gabee47ca15a3a779e490f073aa1c43563":[5,6,10], +"a00014.html#gga82eecb700b3afeda8b95a6151d8904fca302776aaf6d8780d9b57e9f910615d6f":[5,6,2,0], +"a00014.html#gga82eecb700b3afeda8b95a6151d8904fcad460e5e0da52ad16bf771892ebfce1f8":[5,6,2,1], +"a00015.html":[5,7], +"a00015.html#a00118":[5,7,3], +"a00015.html#a00119":[5,7,2], +"a00015.html#a00120":[5,7,0], +"a00015.html#a00121":[5,7,5], +"a00015.html#a00122":[5,7,4], +"a00015.html#a00123":[5,7,1], +"a00015.html#a0ab90a7e2c3a70511144d346a52aeea7":[5,7,3,5], +"a00015.html#a11b16354c24a04222507d6508a475bab":[5,7,1,9], +"a00015.html#a24f716a2b7775c1cb9a59b7c2374508b":[5,7,4,2], +"a00015.html#a2a10a0701fc2085ce58a0e35032e8a8e":[5,7,5,1], +"a00015.html#a2a315d0141311dd82dd6ac1a3523671b":[5,7,4,0], +"a00015.html#a365dbf9376f6927bc8b6527ce136914c":[5,7,4,3], +"a00015.html#a3d7f9ccb3edc3a6b1dbf2feb5a8b8f93":[5,7,4,4], +"a00015.html#a47a5c6af4c934cc9db355d394bb94f46":[5,7,5,0], +"a00015.html#a4a97a76d0d7266ee9cc8de82d19e5d81":[5,7,1,0], +"a00015.html#a50d258467783dad5f163860724cb4c32":[5,7,3,0], +"a00015.html#a6387faccdc3dcd079d22b56b1c4806fd":[5,7,1,1], +"a00015.html#a66ad3f0d6159adbb560799bfb93da76a":[5,7,2,1], +"a00015.html#a674be34352d78e2029f8b36f0664cf6f":[5,7,1,8], +"a00015.html#a69253cda0502dcfa038c5d71a3cac593":[5,7,1,2], +"a00015.html#a7827b3fe247d5d7218b0263ecbb0aede":[5,7,1,5], +"a00015.html#a7bdfedca753e094b2c288f1cbb956889":[5,7,3,2], +"a00015.html#a7c068d330cc60423ee3fd86821221b85":[5,7,5,3], +"a00015.html#a7cf6b2c7eef13541394e9131987a2209":[5,7,3,1], +"a00015.html#a80afb7ab2642836025d063ac8b0c9738":[5,7,2,0], +"a00015.html#a84d667acc1301d6d56ae52573e4b6b87":[5,7,5,2], +"a00015.html#a8b4151dcf43270fbbeff39334048e7e1":[5,7,0,3], +"a00015.html#a8eb88e8dcaea9033a76c0003fcabadd8":[5,7,4,1], +"a00015.html#a93ad6347b6c5e7c72320be81a67f6baf":[5,7,3,3], +"a00015.html#a93c1b2f32e5e046cf10ba7e8b1c215ce":[5,7,1,6], +"a00015.html#aabb52c29097e7d9eedb34f5421740f04":[5,7,0,1], +"a00015.html#ab0a39d7a7b627b1a714117f2d150bac0":[5,7,0,2], +"a00015.html#ab21f9a2d11b2ce02da230adfd32b789e":[5,7,1,7], +"a00015.html#ab30c2a4b2d436b966ba948edb010688f":[5,7,1,3], +"a00015.html#acbcaa81a9d2806d3fa021b5ad27fea6f":[5,7,2,2], +"a00015.html#ad49be57eb231061b32b021a8854fe425":[5,7,0,0], +"a00015.html#ae2b24289699bf3639fea8bb56baf0d15":[5,7,3,4], +"a00015.html#ae2c9381d6fc00cee3491c5a8217c30a1":[5,7,1,4], +"a00015.html#ga01ed2edd4ac04c70f83c7c3091ec4b65":[5,7,51], +"a00015.html#ga02671643755a7f9395ce1f151a914630":[5,7,30], +"a00015.html#ga0468cf171e413581e9bba9803df91427":[5,7,21], +"a00015.html#ga04d2004d7d054b4f36676304bc2cd8ad":[5,7,36], +"a00015.html#ga0e6279e44ebd6778355f6e9e26e9a8b6":[5,7,28], +"a00015.html#ga160b4ffad583e82ad4a80575e4830592":[5,7,9], +"a00015.html#ga17d8b80c6e8d8c3ac95c2424f26e723f":[5,7,15], +"a00015.html#ga1a5311b6ad708e230db517fb04f98a5f":[5,7,40], +"a00015.html#ga2cc9e4b6dceb1346d950ab7fb5f52bb7":[5,7,13], +"a00015.html#ga2e10dd7fac0c8a71b801cfff2d21d1fa":[5,7,17], +"a00015.html#ga2eb9a831b9a84c5108097f770dbe90db":[5,7,50], +"a00015.html#ga3c61d6121d88d2cdf287fc1cd72912fd":[5,7,48], +"a00015.html#ga5354ff2c0c1ec53e2cbd712169fc5558":[5,7,49], +"a00015.html#ga55d406dd20fa70d7cca25601bae20777":[5,7,54], +"a00015.html#ga5658ee3bb7fbf1da24d997d9bc341e11":[5,7,20], +"a00015.html#ga634ced9b86d7dc9543e0b4387123fcac":[5,7,26], +"a00015.html#ga63f28310491d665df0ad9a99dc22a77f":[5,7,19], +"a00015.html#ga6c69a736b8e5719fe01bb7d3b76f9088":[5,7,46], +"a00015.html#ga6dcd898a0c546f25356e016b9276a3de":[5,7,12], +"a00015.html#ga776b1091528ddc2571284f481ddde830":[5,7,22], +"a00015.html#ga79665a4079015c9420f1dd82e15f4b30":[5,7,14], +"a00015.html#ga7acdd2a8f51e171c777a4e53bd5c57e7":[5,7,8], +"a00015.html#ga8025eebc80c23fa9b5a3a4454855e347":[5,7,33], +"a00015.html#ga956cf0c90e0562e5087475ceefcc489f":[5,7,43], +"a00015.html#ga9ba95776f25ee8eae5bdf9bf5fd9c9e6":[5,7,27], +"a00015.html#ga9cb7087af6efc80106c1033f80d60219":[5,7,24], +"a00015.html#ga9da5a899fb0109cec4fc9303e5df0433":[5,7,58], +"a00015.html#ga9f9ae6642bb5eeed8ccc1dffa7ec14e1":[5,7,11], +"a00015.html#gaa0293771d55ee1a7c42a8ffecb0728e7":[5,7,32], +"a00015.html#gaa200c0bd1a2d714f6cd002919ed8a213":[5,7,41], +"a00015.html#gaa355501ba0bfb05cc9be452396f92bce":[5,7,16], +"a00015.html#gaa706c05b4875366e7f84c83b8d09ae29":[5,7,34], +"a00015.html#gab2d2f88ed16097b2974d1955c725a5dc":[5,7,35], +"a00015.html#gab844237884d5badd07ac902a9be34275":[5,7,18], +"a00015.html#gabbdbf43b54f0a0029cd27c09c094de36":[5,7,45], +"a00015.html#gabf72e148a82d885b8b4ab3cffd549cc3":[5,7,55], +"a00015.html#gac52594676141a30266441619dca00d40":[5,7,10], +"a00015.html#gac68c8082b53756a7e58ec6d5f25117d2":[5,7,6], +"a00015.html#gac6fb3f30e13c937cc00fe11218e6ec76":[5,7,57], +"a00015.html#gac9873a0205538dffcba7bb59ed1450c5":[5,7,31], +"a00015.html#gacea88ecaac2447ba3c9f2157e40b9a82":[5,7,23], +"a00015.html#gad29055b5d8b160f94bb18abce476af7d":[5,7,52], +"a00015.html#gad8ae76fc5d858b97de3362100af86df6":[5,7,39], +"a00015.html#gade169c9d37d6a2ff949546268ba1c382":[5,7,53], +"a00015.html#gade1b5efa61054ce538b37b181dd075bb":[5,7,25], +"a00015.html#gade4163a20de203d8ddfccbbeedb6caa9":[5,7,29], +"a00015.html#gae702541c17430371d54c7aea5dbef084":[5,7,56], +"a00015.html#gae7c3ca634a04a8afe85b1e55360b17aa":[5,7,47], +"a00015.html#gae8ffd8526580ed3b7ca3520024d0002c":[5,7,42], +"a00015.html#gaebe7d948ac31ff020dde038034ae3bbd":[5,7,7], +"a00015.html#gaf0197c674ce188bf214c13bc7be43e14":[5,7,38], +"a00015.html#gaf2955b2c961a33fe24d3154ec801f9fd":[5,7,44], +"a00015.html#gafc795a7c0b3e5f4bbf32c1eed3a9ea47":[5,7,37], +"a00015.html#gga0468cf171e413581e9bba9803df91427a4636793fc071ed9f8e753e84a6e12f85":[5,7,21,2], +"a00015.html#gga0468cf171e413581e9bba9803df91427a9b9f27849a8e3cf715e30a29b4ba1d04":[5,7,21,3], +"a00015.html#gga0468cf171e413581e9bba9803df91427aa4d1b3c95a9ca3d756d2f68a3bb0afc8":[5,7,21,4], +"a00015.html#gga0468cf171e413581e9bba9803df91427aca6b545d2f8661404c932a70b8a5abcf":[5,7,21,1], +"a00015.html#gga0468cf171e413581e9bba9803df91427ae45693316c3b50f21a0fa93e539e9ae5":[5,7,21,0], +"a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11a28e17f00c59b3dde88943be07a8902bd":[5,7,20,2], +"a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11a50cabcc60fb8dc805c62070318fe0c97":[5,7,20,1], +"a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11ab39861058eb1c9573babd0752286ea48":[5,7,20,0], +"a00015.html#gga61dadd085c1777f559549e05962b2c9ea3144a4ab7b2408051fc06ab07b583eab":[5,7,21,1], +"a00015.html#gga61dadd085c1777f559549e05962b2c9ea3c0044f4c389c21f73b08dbb0b8ef829":[5,7,21,7], +"a00015.html#gga61dadd085c1777f559549e05962b2c9ea491cc51131bb7e9dcd647e54ec8549e7":[5,7,21,9], +"a00015.html#gga61dadd085c1777f559549e05962b2c9ea7aacfca8b6c86bdd0e727b0c8ae046b1":[5,7,21,3], +"a00015.html#gga61dadd085c1777f559549e05962b2c9eac03b658552cde955b815365386e40a70":[5,7,21,8], +"a00015.html#gga61dadd085c1777f559549e05962b2c9eac5b15e2705b1295a56557036487d291b":[5,7,21,2], +"a00015.html#gga61dadd085c1777f559549e05962b2c9eacb974685c9968ac9dbf74035ecf23bb6":[5,7,21,6], +"a00015.html#gga61dadd085c1777f559549e05962b2c9ead6487c57cdb11ae590172c2ff1364ca8":[5,7,21,4], +"a00015.html#gga61dadd085c1777f559549e05962b2c9eae05054c8a11020169733c22349aa158e":[5,7,21,5], +"a00015.html#gga61dadd085c1777f559549e05962b2c9eaf12e2d1fe9b0fccba12b6cad6bc685b3":[5,7,21,10], +"a00015.html#gga61dadd085c1777f559549e05962b2c9eafa3126f29988635183fa3851e1ee1f2d":[5,7,21,0], +"a00015.html#gga63f28310491d665df0ad9a99dc22a77fa08b83d1381be3c10688f449c9bf90fc4":[5,7,19,5], +"a00015.html#gga63f28310491d665df0ad9a99dc22a77fa259e4e6cf7b6b79608abbe1769e262fe":[5,7,19,2], +"a00015.html#gga63f28310491d665df0ad9a99dc22a77fa6ff9161839b0b5e675b01353a684a63f":[5,7,19,1], +"a00015.html#gga63f28310491d665df0ad9a99dc22a77fa8615d84237aa24c16fdc1675cc932efb":[5,7,19,3], +"a00015.html#gga63f28310491d665df0ad9a99dc22a77facc5b892b2bcf8a632acb64e9c5645273":[5,7,19,6], +"a00015.html#gga63f28310491d665df0ad9a99dc22a77fae7f6c72a518bc4c68b3be696da1a872d":[5,7,19,4], +"a00015.html#gga63f28310491d665df0ad9a99dc22a77faf238cfde678fdbd26a054fc055f40a4d":[5,7,19,7], +"a00015.html#gga63f28310491d665df0ad9a99dc22a77fafaf9bf976bb9d2db3bd2f629cd545f45":[5,7,19,0], +"a00015.html#gga776b1091528ddc2571284f481ddde830a0641c94c5e494890f587f3cb60ed7800":[5,7,22,6], +"a00015.html#gga776b1091528ddc2571284f481ddde830a0ef881d258e59978faca416630fb1a74":[5,7,22,11], +"a00015.html#gga776b1091528ddc2571284f481ddde830a42eb0fe4fd6b2030e64b5d0173c93c68":[5,7,22,4], +"a00015.html#gga776b1091528ddc2571284f481ddde830a4858703ddbc176a60c3015f23a490e17":[5,7,22,5], +"a00015.html#gga776b1091528ddc2571284f481ddde830a6aae117efdce18b2c054ddae971559da":[5,7,22,12], +"a00015.html#gga776b1091528ddc2571284f481ddde830a8640003c589e5d3ffd94d4cd962b8456":[5,7,22,10], +"a00015.html#gga776b1091528ddc2571284f481ddde830a8dec3f95cf71d668439e065b17f27235":[5,7,22,8], +"a00015.html#gga776b1091528ddc2571284f481ddde830aa5f7edec7506a38b3b57d04dd774b0b0":[5,7,22,0], +"a00015.html#gga776b1091528ddc2571284f481ddde830aa6cc38822f852f1ddd1f22c5b79949b8":[5,7,22,1], +"a00015.html#gga776b1091528ddc2571284f481ddde830af06ebd49d4066394642c80ece815d55b":[5,7,22,2], +"a00015.html#gga776b1091528ddc2571284f481ddde830af0ab73a40234a51b14203e7d83621ac9":[5,7,22,3], +"a00015.html#gga776b1091528ddc2571284f481ddde830af1764eeb6c94e0e1f86529bf6210c524":[5,7,22,7], +"a00015.html#gga776b1091528ddc2571284f481ddde830af2c60c5f0dcbd8bd7d782a7c08c87f0b":[5,7,22,9], +"a00015.html#gga99fb83031ce9923c84392b4e92f956b5a9b95dc670083f57c33f96b0c10d0c8ba":[5,7,18,0], +"a00015.html#gga9cb7087af6efc80106c1033f80d60219a24392a93deeb55e04559201839343f3c":[5,7,24,0], +"a00015.html#gga9cb7087af6efc80106c1033f80d60219a7bf1938ae68b1f494aade7a0f4189303":[5,7,24,1], +"a00015.html#gga9cb7087af6efc80106c1033f80d60219aae1c6bab576d7a25d2fa1249f9cd4ee9":[5,7,24,2], +"a00015.html#gga9cb7087af6efc80106c1033f80d60219af59909afb24e786824cfecdb6afd0da8":[5,7,24,3], +"a00015.html#ggabc6126af1d45847bc59afa0aa3216b04a84af12bf3a826e9f4725ae5bb4bbebb8":[5,7,18,1], +"a00015.html#ggabc6126af1d45847bc59afa0aa3216b04ad703190659614263db03cea5d2dfbb6e":[5,7,18,2], +"a00015.html#ggabc6126af1d45847bc59afa0aa3216b04ad9802a5e2f1df9d748838e6e23e0279b":[5,7,18,0], +"a00015.html#ggabc6126af1d45847bc59afa0aa3216b04aecf2cec42cd7819983e265710c691888":[5,7,18,3], +"a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82a543352fa3896623517af17829598eb0c":[5,7,23,3], +"a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82a99b1a9eb98902b9277c2ae64f48e5a88":[5,7,23,0], +"a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82ac0ab79249ad0e6bf887498d0f3e3db90":[5,7,23,1], +"a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82afaae8afb83546031e25b0ac5e6494f2b":[5,7,23,2], +"a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca1a43c564953a0e097907e45cd159c265":[5,7,18,2], +"a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca5b38513482d6d6d92927898f9e2c7703":[5,7,18,1], +"a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca80c88f3fbb3bb2946149c0ec7a7e922a":[5,7,18,0], +"a00016.html":[5,9], +"a00016.html#a00124":[5,9,0], +"a00016.html#a70aed128003103272f5740f12fbff525":[5,9,0,0], +"a00016.html#a9d37ffd9a2943f10a91095759bd52da5":[5,9,0,1], +"a00016.html#ga07e3b8c21dad1debec7986f214a70975":[5,9,9], +"a00016.html#ga185ddb6848a644b40e0620ef6b4ce2cf":[5,9,8], +"a00016.html#ga2a1113d96cdf973bb5b1eade3521adf8":[5,9,5], +"a00016.html#ga5aa5229cbd041b11bcf8417ba12896b2":[5,9,1], +"a00016.html#ga6fabd21856d350fc0b60ffea3bbca200":[5,9,3], +"a00016.html#ga7206f7b805b8a3c68044345dbbba0a41":[5,9,7], +"a00016.html#ga9b8fa194d8fa5a1bf933a709d4dde014":[5,9,4], +"a00016.html#gabad8dfa62a3e414cc23ff8b32eea81d0":[5,9,6], +"a00016.html#gada41ca0a2ce239fe125ee96833e715c0":[5,9,2], +"a00016.html#ggada41ca0a2ce239fe125ee96833e715c0a509ebcd228fc813cf4afcacd258680f9":[5,9,2,1] +}; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex3.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex3.js new file mode 100644 index 0000000..3e5c251 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex3.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX3 = +{ +"a00016.html#ggada41ca0a2ce239fe125ee96833e715c0abacf19933be1940ab40c83535e6a46d4":[5,9,2,0], +"a00017.html":[5,10,1], +"a00017.html#a00101":[5,10,1,2], +"a00017.html#a00102":[5,10,1,1], +"a00017.html#a00125":[5,10,1,0], +"a00017.html#a15b84b8a94c2b2e5ace0a695c79edd84":[5,10,1,2,5], +"a00017.html#a1c6831135c83c013d2a3cfc3e7210357":[5,10,1,0,2], +"a00017.html#a2186844dc87bcde999fc12005f4c550a":[5,10,1,0,1], +"a00017.html#a2419131a10906475fd31950f17ac8895":[5,10,1,0,0], +"a00017.html#a5943d16f5ed6e7c4ebd334cdbc0e2afc":[5,10,1,2,1], +"a00017.html#a6858d3525f762d7aded20e6c95eb19fc":[5,10,1,2,4], +"a00017.html#a68e2dd69e1e34b1b505270e1e07e8a34":[5,10,1,1,6], +"a00017.html#a8835787e1b0f9a4b8868e7cbe53e45d5":[5,10,1,1,0], +"a00017.html#a8c7f63bd1e7de04e40f5cd733f5c7388":[5,10,1,1,5], +"a00017.html#a9577474c0c4395355174df2b016108de":[5,10,1,2,3], +"a00017.html#a97891bd050609c6dcd1276714277e480":[5,10,1,1,1], +"a00017.html#aad7df570c53adb2e80acd2ba0d39d109":[5,10,1,2,6], +"a00017.html#ac5b89dc9115b7760431c981e0c1fd443":[5,10,1,1,2], +"a00017.html#aca481b5d3ca6dce53cf440b534ff80c2":[5,10,1,2,2], +"a00017.html#add7ec18bc8239c5c87ffcec2fbcf5dd8":[5,10,1,2,0], +"a00017.html#ae7facb612714785d4e143e57d47a5af3":[5,10,1,1,3], +"a00017.html#aeec8dccf4a49f03ff9a40f5982a24796":[5,10,1,1,4], +"a00017.html#ga07cc6bd20f700249c335893427bf462a":[5,10,1,11], +"a00017.html#ga09137caccbe9a57f6b2ca5e1ce9bdc50":[5,10,1,12], +"a00017.html#ga0f6f1f2fe150661f8eb0a072665a9020":[5,10,1,16], +"a00017.html#ga164d97e40eb5ad625a41ad43cf938153":[5,10,1,13], +"a00017.html#ga29f967b3ae8487a36ba2a58deb01ccae":[5,10,1,9], +"a00017.html#ga31e3de02b57801c6896e6045c4a31268":[5,10,1,27], +"a00017.html#ga35cae3a5b4aa50ce8db28e3eb703a027":[5,10,1,26], +"a00017.html#ga3b4d71b59e118adc63afbc5434e5e7dd":[5,10,1,24], +"a00017.html#ga437271ffb955b77df0a5dee9ea80cc63":[5,10,1,15], +"a00017.html#ga441017241044ffdb828385e473f5fb58":[5,10,1,14], +"a00017.html#ga4b7617034ab51d77786141873fd6ee1c":[5,10,1,20], +"a00017.html#ga7664234966e4162e952b6d57efcaa8a6":[5,10,1,21], +"a00017.html#ga7d720842e68161d2d52d56d119f20665":[5,10,1,29], +"a00017.html#ga8137f7b333aafe1e3ff6c9d3852b7dbd":[5,10,1,23], +"a00017.html#ga87ea07668194cfb46c7c368d2cb42433":[5,10,1,6], +"a00017.html#gab08c1a0d50859637b4305687278941ee":[5,10,1,7], +"a00017.html#gab49c827b45635206f06e5737606e4611":[5,10,1,5], +"a00017.html#gaba04c62ee636dd8317c2235c3c82aa3b":[5,10,1,25], +"a00017.html#gabb386e53b2bc64e29b2915bdfac36800":[5,10,1,30], +"a00017.html#gac3e053611231cc886bfa38831a1ac26e":[5,10,1,17], +"a00017.html#gac7f76a04b6f6873c52ad176d58901fe9":[5,10,1,28], +"a00017.html#gac938392418ba1a891983d11ef5c9f2a3":[5,10,1,4], +"a00017.html#gad091cd1857d2bd8ce64583739b3a35d5":[5,10,1,31], +"a00017.html#gad292a48f957a9b76593c1779d9dce497":[5,10,1,3], +"a00017.html#gad69f2d63ea756dda60749ff6b09f587d":[5,10,1,8], +"a00017.html#gadcf7122f0a38d4d9da0f052fcb167957":[5,10,1,10], +"a00017.html#gae652236a25f1b4828d596f32190655f8":[5,10,1,18], +"a00017.html#gaf46a8cc094fc18c6cadea8de71448723":[5,10,1,22], +"a00017.html#gafeab1d5249a8b39c8d9e1a54a85c23f0":[5,10,1,19], +"a00017.html#gga87ea07668194cfb46c7c368d2cb42433a5cb44bf860c0482c0ca0165cf0d31d8a":[5,10,1,6,1], +"a00017.html#gga87ea07668194cfb46c7c368d2cb42433aadf112471ef12f194985a093cd9b9721":[5,10,1,6,2], +"a00017.html#gga87ea07668194cfb46c7c368d2cb42433ae80f7b768b1621e42ac965d3d23de5e2":[5,10,1,6,0], +"a00017.html#gga87ea07668194cfb46c7c368d2cb42433afb8aeea71b5b7475e3d3df86220db566":[5,10,1,6,3], +"a00017.html#ggab49c827b45635206f06e5737606e4611a3a7bb24dc8d1c1be8925603eeafe9b30":[5,10,1,5,1], +"a00017.html#ggab49c827b45635206f06e5737606e4611a93b476b469c2a4bfed5916b458ae9bb0":[5,10,1,5,0], +"a00017.html#ggac938392418ba1a891983d11ef5c9f2a3a7b487779b58af99a7a8c179545f78ccd":[5,10,1,4,1], +"a00017.html#ggac938392418ba1a891983d11ef5c9f2a3a9cc49a1ca21e87058a7fbf733cce0e62":[5,10,1,4,0], +"a00017.html#ggac938392418ba1a891983d11ef5c9f2a3ab5cec1d9be7dc5fb2c106e2b87889517":[5,10,1,4,2], +"a00018.html":[5,10,2], +"a00018.html#a00103":[5,10,2,3], +"a00018.html#a00126":[5,10,2,0], +"a00018.html#a00127":[5,10,2,1], +"a00018.html#a00128":[5,10,2,2], +"a00018.html#a0394563c8d0f9eeeecd242a65cee2ad4":[5,10,2,2,8], +"a00018.html#a14acc40a290c779fde0825f3a8bdbb25":[5,10,2,1,6], +"a00018.html#a18589a5de9b06b2eaf7d4260eac03a58":[5,10,2,3,2], +"a00018.html#a1be21257ec375e09106dfe242c02beea":[5,10,2,2,3], +"a00018.html#a213d1737a633686701581a09859213a6":[5,10,2,1,3], +"a00018.html#a35adbf64ca65dd2c1b52f9260f5b9e90":[5,10,2,2,9], +"a00018.html#a3d2ef683b0439ce83e3d54e8823ebc38":[5,10,2,2,6], +"a00018.html#a3e497078c6038baa8748ce5ecebc7e3d":[5,10,2,2,4], +"a00018.html#a4738c7cd55260f7e8a3825d0b2278a34":[5,10,2,1,0], +"a00018.html#a4c9d09c35c4641d38bf565de31b07320":[5,10,2,1,5], +"a00018.html#a51577d06d8812b0c999957898ec016b5":[5,10,2,1,4], +"a00018.html#a7229e894f762ead4bd08b4add49e6bc2":[5,10,2,3,3], +"a00018.html#a75e06358c0d5840a1dfc19a029e10ba8":[5,10,2,2,7], +"a00018.html#a81ece18a362fc9779750be91f7cc6b30":[5,10,2,3,1], +"a00018.html#a92d20835618a946b8f7702455877ef7a":[5,10,2,1,7], +"a00018.html#a98ea5e99278b386e2ddb99d45a9750ee":[5,10,2,3,4], +"a00018.html#a9934cd1a4d4b4e02ac5856e28f86a229":[5,10,2,3,0], +"a00018.html#ab74516c1edb1424ddb1554de7cae69bc":[5,10,2,2,0], +"a00018.html#aca3dcdb3ab2710d991ada52d64bf102c":[5,10,2,0,1], +"a00018.html#ad0a9e837e9df16d89bab98a78af5bd10":[5,10,2,2,1], +"a00018.html#ad6f3b291ee81b69cf91c161ae26d65ae":[5,10,2,2,2], +"a00018.html#ad7af2a58faba6a178daa97bd06ebce36":[5,10,2,0,0], +"a00018.html#ae19c45c96699bb3a6821150ab820b029":[5,10,2,1,1], +"a00018.html#ae855ba5c53f7e585c44eae8bada85e9d":[5,10,2,1,2], +"a00018.html#afaff4f7ef2ae4ed49eff607a58db18c2":[5,10,2,2,5], +"a00018.html#ga0704c8f14da38feb11555e4127d86a18":[5,10,2,4], +"a00018.html#ga097c0b20503381de44cccba311dcf236":[5,10,2,27], +"a00018.html#ga175a81b5ab74dd78469d6cdea690d8cc":[5,10,2,13], +"a00018.html#ga25b9c35089f0fc966facec3bf874c840":[5,10,2,23], +"a00018.html#ga280404c6b1ede542f2c1c20bd382869c":[5,10,2,18], +"a00018.html#ga419f2fc2e0684671c00ee97e962bbe0c":[5,10,2,6], +"a00018.html#ga4c9fc06eeb8a3beb024f6525e4d99a0b":[5,10,2,24], +"a00018.html#ga545c1a43d8d49c4675de493d45a4063a":[5,10,2,17], +"a00018.html#ga5ae9f5e6e854d14d33ba3029128bd6f0":[5,10,2,25], +"a00018.html#ga5f368505586dd356fc680711023ace7f":[5,10,2,9], +"a00018.html#ga64e4839b34e9156358c4eaa717b1c14a":[5,10,2,5], +"a00018.html#ga7115f80e28b62bbbd3be1a2a918529ba":[5,10,2,12], +"a00018.html#ga719dc02b99647eb8f08a05d4d6066c51":[5,10,2,8], +"a00018.html#ga833a7311515f1a3bf5cb8da2355cc661":[5,10,2,7], +"a00018.html#ga89baaf8bc82b19c837032665e89a1707":[5,10,2,19], +"a00018.html#gaa387d81ea08a9d4b39cfeb3dfec505f7":[5,10,2,21], +"a00018.html#gabf38a498bd3527ea0b7cc947ae71e17e":[5,10,2,26], +"a00018.html#gac53e5c96a2eed1b5a95b7d84be48f4ac":[5,10,2,10], +"a00018.html#gac7602b6897596348fe190e4fc63f1381":[5,10,2,22], +"a00018.html#gac9b90f575d92ff8ad3cc350a5c8ad1b9":[5,10,2,20], +"a00018.html#gacbb93d5ea4f4b40038f41e0e942a9ee1":[5,10,2,16], +"a00018.html#gacf721065f83982e3df651111183bf7b2":[5,10,2,14], +"a00018.html#gad6564299304730416461f62255fcd37c":[5,10,2,11], +"a00018.html#gadb50014db29dd75ea2001fb7bc837e77":[5,10,2,15], +"a00018.html#gga419f2fc2e0684671c00ee97e962bbe0ca2d0c7dc4bf2815768510b916b7c1d54e":[5,10,2,6,2], +"a00018.html#gga419f2fc2e0684671c00ee97e962bbe0cabd274f2defb8f0f8d2f6c2fcdd71c63c":[5,10,2,6,0], +"a00018.html#gga419f2fc2e0684671c00ee97e962bbe0cad834aafd823863602d905d4b3d8c9430":[5,10,2,6,3], +"a00018.html#gga419f2fc2e0684671c00ee97e962bbe0caf7ad09504bcf02f9c1177431ee44562e":[5,10,2,6,1], +"a00018.html#gga719dc02b99647eb8f08a05d4d6066c51a6b755a1d30a626380730ce947d09335f":[5,10,2,8,1], +"a00018.html#gga719dc02b99647eb8f08a05d4d6066c51af542f0269c83549e7b492911e281a902":[5,10,2,8,0], +"a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a39e0e158674bd8a6e254a6a42b5ce50f":[5,10,2,7,0], +"a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a42a589b5e31f29ddc41088c3fb4bfcf1":[5,10,2,7,1], +"a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a8381dd229f545df5e6a32ee5f0aac871":[5,10,2,7,2], +"a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a9e73a2b09fe3943d51849a7d87fbe8a3":[5,10,2,7,3], +"a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca2f85039a57379838909876a1d509b7aa":[5,10,2,10,1], +"a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca38cca3cd668e73f51b8e574835d419df":[5,10,2,10,3], +"a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca5e765c1c316a51908b68f1f32a7b524d":[5,10,2,10,4], +"a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca94b030ebdac378a84961893ae567bfbc":[5,10,2,10,5], +"a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4acaac8593e808a8137d1b5d3a51640779de":[5,10,2,10,2], +"a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4acacb1ae174dd6798a6fd79800a9e39a3c6":[5,10,2,10,0], +"a00019.html":[5,13], +"a00019.html#a00129":[5,13,0], +"a00019.html#gac4193f0e0cb9b0469f58af2648024059":[5,13,1], +"a00019.html#gaf2cc5d2d92b4e2898a197479e77a326e":[5,13,3], +"a00019.html#gaf9258f56192a94928f67940eee5dd879":[5,13,2], +"a00020.html":[5,15], +"a00020.html#a00130":[5,15,0], +"a00020.html#aa8d8b810ee17770fd48674454f59bb08":[5,15,0,0], +"a00020.html#ga0bb94508d8cf924c3a6971364377673a":[5,15,5], +"a00020.html#ga2e666900eef9bdbd9d9e587d2b7ca2c2":[5,15,12], +"a00020.html#ga320ba098c93a30174254eb763dd37dde":[5,15,19], +"a00020.html#ga388dd5041e6c179d637e17cd6e5a607e":[5,15,17], +"a00020.html#ga44091408531a61dfac7c4ee4982be317":[5,15,6], +"a00020.html#ga57f3d18e0ec88a5eb04b3282e0f3dc95":[5,15,15], +"a00020.html#ga5d988ee09b604ab28f1b37320ee8d2d9":[5,15,7], +"a00020.html#ga7620866a54acdcc17abab2b46a94dc6c":[5,15,18], +"a00020.html#ga7a8066680089523fa602dbe58b0c0505":[5,15,11], +"a00020.html#ga7c0bbb20b4abd7450f860277ef9d8a20":[5,15,16], +"a00020.html#ga8f4d38afa34e99ba521d9ca08be06355":[5,15,9], +"a00020.html#ga959db20281cfce080c684bd94f667799":[5,15,14], +"a00020.html#ga9d2f90ae2c6f99410e2908dac8cc6943":[5,15,4], +"a00020.html#gad30aa85105a47b708fd5880a929e5e84":[5,15,8], +"a00020.html#gad481f648f1c89a1eab327530d6fef1d0":[5,15,3], +"a00020.html#gae39f6122bd73a5156d40291962f7507f":[5,15,1], +"a00020.html#gae875817838659e596dc1cb1527c948c3":[5,15,10], +"a00020.html#gaece5c1972e35dec2efcce98847a09622":[5,15,2], +"a00020.html#gafa8493a0faee1cc356da26ca99a54da8":[5,15,13], +"a00020.html#gga0bb94508d8cf924c3a6971364377673aa6942598faf3aef148a850f8850cf01c3":[5,15,5,0], +"a00020.html#gga0bb94508d8cf924c3a6971364377673aa745c62687191197b48b35dbd1aac40db":[5,15,5,1], +"a00020.html#gga9d2f90ae2c6f99410e2908dac8cc6943a2a5e8ee568da2c888093b732f2157ea5":[5,15,4,0], +"a00020.html#ggad481f648f1c89a1eab327530d6fef1d0a6b415c060dc09ed293ec3dda829cb257":[5,15,3,0], +"a00020.html#ggad481f648f1c89a1eab327530d6fef1d0abe4ba0a30bc09f1921a0504eb826b3dc":[5,15,3,1], +"a00020.html#ggad481f648f1c89a1eab327530d6fef1d0add9f55173bb54f623c955c29c22dd5b2":[5,15,3,2], +"a00020.html#ggaece5c1972e35dec2efcce98847a09622a17597fb66d9b1d3e97b318db79267f52":[5,15,2,2], +"a00020.html#ggaece5c1972e35dec2efcce98847a09622a27e83d437e2798b19c59c2af4d99e1dc":[5,15,2,0], +"a00020.html#ggaece5c1972e35dec2efcce98847a09622a44b7807f36fe0a21240e721d46d8f9d7":[5,15,2,1], +"a00020.html#ggaece5c1972e35dec2efcce98847a09622af57e6e009258a71bc3a2890aedff34b3":[5,15,2,3], +"a00021.html":[5,19], +"a00021.html#a00131":[5,19,1], +"a00021.html#a00132":[5,19,0], +"a00021.html#a17414a2d234412e960c98e4c8e4df853":[5,19,0,2], +"a00021.html#a347a741944d1f294a11fc0f19cfbbc53":[5,19,1,4], +"a00021.html#a3897b3b9321e3cecb05972fa68f947d5":[5,19,1,7], +"a00021.html#a6caacf7ae4f800be829c32ed87cd6149":[5,19,1,0], +"a00021.html#a8734c80f138c70349b10e6204d8db899":[5,19,0,1], +"a00021.html#aaa1765ca5c51528130a6dc9dd06f2e7a":[5,19,1,6], +"a00021.html#aaba4aecfe1173c11bb8d77a8f9913196":[5,19,1,1], +"a00021.html#aad4f208b7074a27d1a085471bd00cd0a":[5,19,1,5], +"a00021.html#aafc09c3595776bc668daf3e303802f31":[5,19,1,3], +"a00021.html#acd66f85232dafe6feeea4d80400aba69":[5,19,1,8], +"a00021.html#ad5d7a18f1b860f5fa7d0800d8e464127":[5,19,1,2], +"a00021.html#ae030d75078255fd25e577c14d0a0fc80":[5,19,0,0], +"a00021.html#ga0fe5c5cf3afe091395e5d13de17e4bf5":[5,19,52], +"a00021.html#ga17cec8d7f62c6f80bb516febc654d37d":[5,19,32], +"a00021.html#ga211359f9ee3b67eaa96d73b23ce1650d":[5,19,30], +"a00021.html#ga22353e32ba4fb216277824ce940ad786":[5,19,40], +"a00021.html#ga22c2cd3dff04d7771f94401fb841446e":[5,19,39], +"a00021.html#ga231084960a5fa1f5bf67ee5e5bc9dead":[5,19,41], +"a00021.html#ga2645513f40654fdc1812a8990e5f894b":[5,19,38], +"a00021.html#ga265b0765ff1337a4d13328351b3cebdc":[5,19,53], +"a00021.html#ga270f5ad1462133d7b88ce71be4913a1d":[5,19,9], +"a00021.html#ga2befef3e54e22f0624ddb1b016f10148":[5,19,7], +"a00021.html#ga2fc1121a0f6dd3f5bc822516f85f096c":[5,19,28], +"a00021.html#ga3ba946707276c23d531ebd3e21d67427":[5,19,27], +"a00021.html#ga3d2e093dbbecb8a0afc56bda69b8fa7e":[5,19,6], +"a00021.html#ga3d7deebbb8cb3899c51bbef999113fdf":[5,19,2], +"a00021.html#ga44111f6438ee9d11f5c3b26e3c049e47":[5,19,16], +"a00021.html#ga467e692ef9a508c75d2dff4d3bb3587e":[5,19,17], +"a00021.html#ga484ff3205b735b4e24655920dd48a85a":[5,19,21], +"a00021.html#ga48cc738532c4d5c86c423547f79da554":[5,19,47], +"a00021.html#ga54f3ea55cf8cab5a78e26a522536d2fe":[5,19,29], +"a00021.html#ga5f89a72162bac80f840b04445bcbfa70":[5,19,22], +"a00021.html#ga6217a77dba0bc787acde88eabbe4ba55":[5,19,34], +"a00021.html#ga64666471cadaed6ad2e72ce19026aed8":[5,19,11], +"a00021.html#ga745f5f328599202df06a81b6fe307b63":[5,19,20], +"a00021.html#ga7548cb37efdba143e5c312f7b4461cf7":[5,19,31], +"a00021.html#ga76b1c419363e09d4861880f25f63979d":[5,19,4], +"a00021.html#ga7d63d84ecccc4074e40c6754a8754065":[5,19,8], +"a00021.html#ga82141464913b976a7c2aab50cf17c701":[5,19,10], +"a00021.html#ga87a03f50c6f03e0302fa79cd5cbad644":[5,19,49], +"a00021.html#ga880638c2ffe076f868b5d5c8dc480630":[5,19,24], +"a00021.html#ga8a95c3455d06a5be07c07c787699b2f9":[5,19,50], +"a00021.html#ga8d902ebc4b569d71c88754a49ccf0650":[5,19,13], +"a00021.html#ga8df83543fac389c6e3b212d58695f034":[5,19,5], +"a00021.html#ga8f372273782f269956227b810e56a844":[5,19,19], +"a00021.html#ga9100974cdbb1542385a983b75b2f0d45":[5,19,15], +"a00021.html#ga926706158370867f6a1827af9899c5e4":[5,19,18], +"a00021.html#ga9522e37a144ad51ffb1f5d035f1b4489":[5,19,3], +"a00021.html#ga99d4a6ea09ccf78fae7c3dec39dff28b":[5,19,33], +"a00021.html#ga9b685c1dd4fbc33496d5e6445c4d08c7":[5,19,35], +"a00021.html#gab1c0cd81deb689171e374d4291588624":[5,19,25], +"a00021.html#gab2412179ebab1d913976b250290ca06d":[5,19,44], +"a00021.html#gab5d439e5c8778b29945a228e9bbc62ea":[5,19,23], +"a00021.html#gabb782f507653f2afc07c2464a7cc1a13":[5,19,51], +"a00021.html#gabd997ff4aff2c1b1a2c763596db93c6c":[5,19,45], +"a00021.html#gabde2ce6ca0f22c9210f145d6493f3f5c":[5,19,48], +"a00021.html#gac025765188aa53661325d324569b739c":[5,19,26], +"a00021.html#gac1e1011a301cf83283996490249a596b":[5,19,43], +"a00021.html#gaca74f1feb997dc028a4143a9c84f5a2c":[5,19,46], +"a00021.html#gadc0dc8518742a3345ea042eae821dc85":[5,19,12], +"a00021.html#gae6074aeaf3d4004a721d91c50f6a74ad":[5,19,42], +"a00021.html#gaf1007b13bbe43ea28ee33acdc7f5f986":[5,19,14], +"a00021.html#gaf926083b406d26456d2fabf2bfd55a39":[5,19,37], +"a00021.html#gafdf6317a3faf2068d9ce8f0a8082203c":[5,19,36], +"a00021.html#gga270f5ad1462133d7b88ce71be4913a1da182c8930fa55f2c4a7ff7cf27f272ec6":[5,19,9,1], +"a00021.html#gga270f5ad1462133d7b88ce71be4913a1da3923db642ad5f6b9aa2f9206b69cc9b5":[5,19,9,3], +"a00021.html#gga270f5ad1462133d7b88ce71be4913a1daa9c40afb4f671696c5122560bd16834b":[5,19,9,0], +"a00021.html#gga270f5ad1462133d7b88ce71be4913a1daaedca7a090600aa41fd7f9e6aa756e8f":[5,19,9,2], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148a03be657454ab843d23408d0d20331511":[5,19,7,5], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148a1b8265e43a813ba11c8f4661032b2c45":[5,19,7,3], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148a1c7af66a2d15e4af71cfd6a8c2ae27a5":[5,19,7,9], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148a3a54a6d9baa60d52779a918ed739a8d5":[5,19,7,2], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148a4834fd8709ba8054330fb42b65962509":[5,19,7,8], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148a9b869b11ddd20543bab111f9f2699e18":[5,19,7,1], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148aa14ad02f33740bac23837ad10a2188ae":[5,19,7,4], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148adbdf0a5eebc74a8b01eefcc9b3ee742d":[5,19,7,0], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148af02eafb670d82545874712b82416c712":[5,19,7,7], +"a00021.html#gga2befef3e54e22f0624ddb1b016f10148af73ef40ea423cc2cd1314f82914054d9":[5,19,7,6], +"a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea0598dcf5a25edbcc3f89bfc4f453a162":[5,19,6,6], +"a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea2c1d0356e7346f0d3f1a949dc56b7f10":[5,19,6,7] +}; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex4.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex4.js new file mode 100644 index 0000000..87e6c89 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex4.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX4 = +{ +"a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea3ec92530953ea9991a65511e64654d50":[5,19,6,5], +"a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea427af509d16424c3e38e21c0607300d7":[5,19,6,1], +"a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea9091ff1c081ba955c12f63ec235fa41e":[5,19,6,2], +"a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eab8df54085f974d38e28ff80ea5ad65d0":[5,19,6,4], +"a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eac45f2918497b441dc42cb33c99afdcd1":[5,19,6,3], +"a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eadd689832261eb7eb862ce1c61bc4e96a":[5,19,6,0], +"a00021.html#gga64666471cadaed6ad2e72ce19026aed8a53aa676af8b05ec58f3d723ea6b85611":[5,19,11,1], +"a00021.html#gga64666471cadaed6ad2e72ce19026aed8a66ca25f70e36c4286f63529dc14d19b2":[5,19,11,3], +"a00021.html#gga64666471cadaed6ad2e72ce19026aed8a7e0f6590af780c201400de534fbded84":[5,19,11,0], +"a00021.html#gga64666471cadaed6ad2e72ce19026aed8afebc15b93617ff1873bf6bd170fbfe25":[5,19,11,2], +"a00021.html#gga76b1c419363e09d4861880f25f63979da539c00805f4706a43e2669dfa7477dd8":[5,19,4,0], +"a00021.html#gga76b1c419363e09d4861880f25f63979dac28f3ae947c63c4fc3663be7d1f7b4e3":[5,19,4,1], +"a00021.html#gga7d63d84ecccc4074e40c6754a8754065a0c47623cf782903261d17cd642ad9d5e":[5,19,8,0], +"a00021.html#gga7d63d84ecccc4074e40c6754a8754065ad16871f918d603d6f919d54760e262e2":[5,19,8,1], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a14833c030e7be5e1d46d379bee0763e2":[5,19,10,2], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a1cac2ebda704fdec8b75b9fa9caf460e":[5,19,10,13], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a22397185b3e3a49c3ab6de5f22b55126":[5,19,10,12], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a2d49ffdfaa5c023b81800f9bc7145599":[5,19,10,6], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a37959b0234e735a51a76fc94a6ea2838":[5,19,10,3], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a5298152c01e0d4e9def85bbe99ecad83":[5,19,10,14], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a64d321fa474f3c4f7accbbe3fb48ce97":[5,19,10,15], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a65d71ef841bb11fc06c4a84cd35fe354":[5,19,10,5], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a76459f5f7aeb37929840ac706ccba0c1":[5,19,10,10], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a81bb8457aeaaa05c1de014a1092f3682":[5,19,10,1], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a8d5a9b6b6028b4dcd8c6032bebefa468":[5,19,10,8], +"a00021.html#gga82141464913b976a7c2aab50cf17c701a90910b145c4b6be6207e787a33edfe90":[5,19,10,9], +"a00021.html#gga82141464913b976a7c2aab50cf17c701acfec39ecd9ed389a70c5af0aadd8d245":[5,19,10,4], +"a00021.html#gga82141464913b976a7c2aab50cf17c701ad95c6b5bf373afdaa115ac4d4b33c907":[5,19,10,7], +"a00021.html#gga82141464913b976a7c2aab50cf17c701aeac5b3a91a6789ebc29e22a63223e562":[5,19,10,0], +"a00021.html#gga82141464913b976a7c2aab50cf17c701aef4bb8b33c1f2cbd38d93f3ae8dcf59d":[5,19,10,11], +"a00021.html#gga8df83543fac389c6e3b212d58695f034a2c17be417f1566b1c17ab1cdb972baf8":[5,19,5,0], +"a00021.html#gga8df83543fac389c6e3b212d58695f034a80cdf46efb087f2a0141a1fce8b2b542":[5,19,5,2], +"a00021.html#gga8df83543fac389c6e3b212d58695f034abac8d502657e6390b3669508a7a7d78b":[5,19,5,1], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a07c275c4c55dfe959c222b51557aab25":[5,19,15,11], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a1034b068f1139df001c04fa1c95b5531":[5,19,15,4], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a19ed3a5f0d87b7c42919ed74ea6630ac":[5,19,15,9], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a23338b52b7a3eb5bf4e0cdf6b854c9f4":[5,19,15,0], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a3deb3b17762b595a399bbc32efbe8753":[5,19,15,12], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a490a6fdf7a05436e8d7958002e5d48b5":[5,19,15,8], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a5738f1fc819177c4377068dcf09dd39d":[5,19,15,2], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a5a8064efce400813ba04b0a3aca7c2bb":[5,19,15,6], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a99b06fad336b34b1485c6a1a2c634a75":[5,19,15,10], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a9a5e7b8190bf25a0695f3b3d54c39bee":[5,19,15,14], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45a9c4db1ffc833a6eedc6a56a7fee85742":[5,19,15,13], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45ac6d970ec7b05b2141b48c9eb09bf23f2":[5,19,15,7], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45ad07c79a564df84171acdd2f9acd1ee32":[5,19,15,1], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45ad4b1b9a6e2ba1ca55c536407df2802d4":[5,19,15,3], +"a00021.html#gga9100974cdbb1542385a983b75b2f0d45ae91e9c2221c6840f6b6d106a796b6eb3":[5,19,15,5], +"a00021.html#ggadc0dc8518742a3345ea042eae821dc85a1ce9766251a3384d8eb28804fd518034":[5,19,12,0], +"a00021.html#ggadc0dc8518742a3345ea042eae821dc85a6a33db1b011c4dcf63bcc2759dd1c474":[5,19,12,2], +"a00021.html#ggadc0dc8518742a3345ea042eae821dc85a878f4d9e6aa0348da58c4b8807e6eb19":[5,19,12,1], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a0267e2748c8e6c0ae37588d85346af5b":[5,19,14,8], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a0a98b0964c6e46c490e78f02f3198f07":[5,19,14,3], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a10627d03a81cfa9bb66dc453ecbbb7c3":[5,19,14,11], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a1cbfebe70908eb5e706e627500c2ce8d":[5,19,14,4], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a237e390a2de0d3fa877e3f820718d14e":[5,19,14,12], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a306f7c719eeabe666789bb7d0ed8d175":[5,19,14,5], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a313da28338d9c25f9a5de1e150fdb44e":[5,19,14,10], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a35b278ed11503e27ceda405448d43704":[5,19,14,1], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a3617b5ccaab15786e80fb1ff9acbbf94":[5,19,14,9], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a3733720f1b361ee41e5b7d71c7c08974":[5,19,14,2], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a5923446a599ede3c2f5d787683bcaa70":[5,19,14,7], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a7d9204dc6fea5991f442e6a96531055e":[5,19,14,0], +"a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986afff05c432d290f058588e7f6372030b1":[5,19,14,6], +"a00022.html":[5,20,0], +"a00022.html#a00104":[5,20,0,4], +"a00022.html#a00133":[5,20,0,0], +"a00022.html#a00134":[5,20,0,1], +"a00022.html#a00135":[5,20,0,2], +"a00022.html#a00136":[5,20,0,3], +"a00022.html#a018402d4d181b482376a878b38db740f":[5,20,0,1,6], +"a00022.html#a0d0bceaaae2e5bae690fb2c3289f48f6":[5,20,0,2,5], +"a00022.html#a11b51e4d88d3f8d9137a13ce301ed46c":[5,20,0,4,8], +"a00022.html#a23b2531ea36b53e42cd6b2a3780d3017":[5,20,0,4,3], +"a00022.html#a24a2584817f03d1ace0a6cecc718bc09":[5,20,0,0,0], +"a00022.html#a28b878b99d5ec790b5c8f3bafe140da0":[5,20,0,3,1], +"a00022.html#a384bc00ef4cd5b4e9cb6a4d48ec336bd":[5,20,0,1,0], +"a00022.html#a445e70d437c917e6af1b4037bdbb6a3f":[5,20,0,4,6], +"a00022.html#a4e19f9299f123f181536c6bd4456e50a":[5,20,0,4,4], +"a00022.html#a4e66b572aa792a179028af5340bc83cb":[5,20,0,4,9], +"a00022.html#a56c657f64c2e26fe7dd772c1a77efb9e":[5,20,0,2,2], +"a00022.html#a582eea734badd0049c98ea3cf89b3e4b":[5,20,0,3,3], +"a00022.html#a62fa101ddfc970e7b6bcba0b2eb6b869":[5,20,0,4,2], +"a00022.html#a69f260bde2e1728233f835a148b2f51b":[5,20,0,4,1], +"a00022.html#a6cb4626f6b63c70fa21fe2e3338dc915":[5,20,0,4,0], +"a00022.html#a780c1f03e9670a2c38068a7bd49d4f13":[5,20,0,1,3], +"a00022.html#a787477e7b0ae7833dcbdb1c85fef361c":[5,20,0,1,9], +"a00022.html#a7ea0733fc746e2bafe1c0999db7d4804":[5,20,0,0,3], +"a00022.html#a7fbed6c387c99764c4f405fc7d9761ee":[5,20,0,1,4], +"a00022.html#a9609e5c510bf5d0c120a403ed40aed42":[5,20,0,0,2], +"a00022.html#a960b87887e431dabbb5641109cb56d90":[5,20,0,0,1], +"a00022.html#a9fcd3fae6d886c7dfd0c3fd4cd51e6fe":[5,20,0,2,0], +"a00022.html#aa033bd20cfbb1a14f0fd43f4b31bb27e":[5,20,0,1,1], +"a00022.html#aace9261acfad8526f3d5b0b59346629a":[5,20,0,1,5], +"a00022.html#ab514b4866ee539808abd92a75ca8be51":[5,20,0,1,8], +"a00022.html#ab8d01b85149d749ab1c748bb5116b90e":[5,20,0,4,7], +"a00022.html#ad4eb458a0c1a0c0934eec53d71b78ffb":[5,20,0,2,3], +"a00022.html#adc19252b2493f3f9d12f029e57908ce5":[5,20,0,2,4], +"a00022.html#addc4f20760a1a62c4d20cdf9443f3af3":[5,20,0,3,0], +"a00022.html#ae003337c9398e5f5e3189f5b2ba6335b":[5,20,0,3,2], +"a00022.html#ae7695987e044d80983fd98a43812b1ea":[5,20,0,1,2], +"a00022.html#ae7933252a37be998d127217f34f6fd16":[5,20,0,4,5], +"a00022.html#af889de97327eb44641d8acc1f509d074":[5,20,0,1,7], +"a00022.html#afd5bb71a7dc1908cb8a1860564601a45":[5,20,0,2,1], +"a00022.html#ga08dec9d9d6abf910589a591f1cc52f58":[5,20,0,36], +"a00022.html#ga0dcd2ed8373d992ff93bb500e1442815":[5,20,0,47], +"a00022.html#ga1541129ba8262e1649592b5109e2074c":[5,20,0,6], +"a00022.html#ga17a846c851b3b17e6a1564a5fab48e09":[5,20,0,19], +"a00022.html#ga3ad4747ccc31c142c54af5639cd49328":[5,20,0,32], +"a00022.html#ga3e5a7cd043c9596779bc23b34cb3d1f9":[5,20,0,13], +"a00022.html#ga420a3d3f841957068648585b89fa66d1":[5,20,0,15], +"a00022.html#ga45c08fc078ae334b79fb844379140838":[5,20,0,21], +"a00022.html#ga5b05095245ecf01258e64cc0458fb2e9":[5,20,0,39], +"a00022.html#ga6289b192b135592b7b0996c05422be4d":[5,20,0,30], +"a00022.html#ga645d041a92bde312d6cf64517c618c41":[5,20,0,44], +"a00022.html#ga6d32506242b9596989efbbb2d030e997":[5,20,0,26], +"a00022.html#ga709b0d176b737a8009221565f3ae19e6":[5,20,0,34], +"a00022.html#ga794c7435fa108012df54bb6294f20505":[5,20,0,28], +"a00022.html#ga7c6a9ac8e0e410684970f3169404bafd":[5,20,0,45], +"a00022.html#ga820c78a32fa29735168d2e517f4881a1":[5,20,0,41], +"a00022.html#ga86b45b85e036adc762eed5bcd2a0491d":[5,20,0,10], +"a00022.html#ga92c1bd47d2ad7b45fc138fccb4bc1ace":[5,20,0,33], +"a00022.html#ga93765aa3b062471b641f1b8f733b8b5b":[5,20,0,46], +"a00022.html#ga97782e786464ec2de946bd42e63aefbc":[5,20,0,31], +"a00022.html#ga9ad313685ade497f5cbcb71c74a1b4dc":[5,20,0,14], +"a00022.html#ga9e7412ad45aeb7f620fe34559034ad2e":[5,20,0,27], +"a00022.html#gaa4717c15ca9604c505a5e5c60df29ebe":[5,20,0,7], +"a00022.html#gaa68518c16202382c2e1f1c7c66a9d53d":[5,20,0,12], +"a00022.html#gaaa2e2f2efa7be228c775fa239ab5ea03":[5,20,0,11], +"a00022.html#gaac0bc2b87ea2eb7eeba78d9449d4dbbf":[5,20,0,25], +"a00022.html#gaac1ff8fc728c925d78b1237949ebf7c3":[5,20,0,49], +"a00022.html#gab36e8463576abeded221a1e5a1eec01c":[5,20,0,22], +"a00022.html#gab87ea500d8f74369882afe52a81d1199":[5,20,0,29], +"a00022.html#gabde0dccfb0783d103b9cf57e0202582f":[5,20,0,42], +"a00022.html#gac000b63ed033f57a9eee342a8c8e67f2":[5,20,0,23], +"a00022.html#gac75808445b18f687387bea02892a5246":[5,20,0,38], +"a00022.html#gad0d8eaa132d8c882d8a42286ecfbab64":[5,20,0,40], +"a00022.html#gad267cfee3a876b2860217ff94f03f574":[5,20,0,8], +"a00022.html#gad3810513c85cb28f1dbf18b15614a09d":[5,20,0,35], +"a00022.html#gad4071c9fc158109945e724872f4760b6":[5,20,0,37], +"a00022.html#gad823d00c394f6ca35c391dc178a25334":[5,20,0,20], +"a00022.html#gae40850ce14ba74ea75b3eef79beecf8a":[5,20,0,24], +"a00022.html#gae719048431a3e4fb334f83bd824a407b":[5,20,0,48], +"a00022.html#gae90962a54978acf05ca7780489301eb4":[5,20,0,43], +"a00022.html#gae9bd140aeb645efab6c7552b3994e01a":[5,20,0,9], +"a00022.html#gaeb6046de02dffe9248de71332fac246e":[5,20,0,5], +"a00022.html#gaedd690a0f91a0a9eb0fd573b57e31f67":[5,20,0,18], +"a00022.html#gafa691c5329a7325ee57c9f06fa295731":[5,20,0,17], +"a00022.html#gafd7e7bd8e060742346806ed8c8f1db4c":[5,20,0,16], +"a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da2ff91d774e93aed936b87ffaa18aaf9e":[5,20,0,17,2], +"a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da496ced6fffc33d7bbeb01d203dfc4836":[5,20,0,17,4], +"a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da4e32c5b06dccaf4b81e2fd1679e1b560":[5,20,0,17,1], +"a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da703abdf7900047c4d13536480f3463ab":[5,20,0,17,0], +"a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2dab0f4d4de5f92524c9d33524f22a04e03":[5,20,0,17,3], +"a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a03ba57874691d230ad0f657cf01a7978":[5,20,0,19,8], +"a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a1f153042fdb9681e7bd435c4cb9bd7c5":[5,20,0,19,5], +"a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a214bc23d48bafcc89241530e55195f76":[5,20,0,19,6], +"a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a3f796180c934ef3b688530986a844fe5":[5,20,0,19,1], +"a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a4be82e1306daa139870673c30de9e238":[5,20,0,19,3], +"a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a4f52f3d130ab947331e668c7856d8551":[5,20,0,19,7], +"a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a76b9aac1ff3856afdcb4eebdb3be9094":[5,20,0,19,0], +"a00022.html#gga17a846c851b3b17e6a1564a5fab48e09ab25cacb436c5e32113bd98c1ae151641":[5,20,0,19,4], +"a00022.html#gga17a846c851b3b17e6a1564a5fab48e09ae281d12263ce63ef7c964f8564bea473":[5,20,0,19,2], +"a00022.html#gga3e5a7cd043c9596779bc23b34cb3d1f9a031c0ee2693cf1fd621e8b8cba676629":[5,20,0,13,0], +"a00022.html#gga3e5a7cd043c9596779bc23b34cb3d1f9acfc8257079c9604086622df6de326aea":[5,20,0,13,1], +"a00022.html#gga420a3d3f841957068648585b89fa66d1af64655214a47d11f960f633b1478b117":[5,20,0,15,0], +"a00022.html#gga9ad313685ade497f5cbcb71c74a1b4dca18a98985c1f7dd56175e4a2724db3675":[5,20,0,14,1], +"a00022.html#gga9ad313685ade497f5cbcb71c74a1b4dcad15d61c6fd642f13101edbf401d0c72e":[5,20,0,14,0], +"a00022.html#ggaa68518c16202382c2e1f1c7c66a9d53da20ac53684c3e1ad338553cecbfab94a9":[5,20,0,12,1], +"a00022.html#ggaa68518c16202382c2e1f1c7c66a9d53dae7b997e8cff761aab865cbd42c4c3989":[5,20,0,12,0], +"a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a2616295b1939805764ffb815876b9eea":[5,20,0,11,2], +"a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a3bc0d76da8f97613467566dc39bee3b4":[5,20,0,11,0], +"a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a857a31be854542eafecfea1484ad38b5":[5,20,0,11,1], +"a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a0ec3e79b793d213ed30f74a338437129":[5,20,0,18,1], +"a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a4acd737132f9c3cbd8cac500767289e5":[5,20,0,18,2], +"a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a8f55948795fa8d256b5b6e520a95f145":[5,20,0,18,5], +"a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ac8d5eef4469ce888d4b2fb3c3b4fb215":[5,20,0,18,0], +"a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ad1de0c0c42c7a707e305edbd3fde88b7":[5,20,0,18,4], +"a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ad1f9b1e8b5209604a0eca8750f2876ad":[5,20,0,18,3], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731a0cb8b30c67c53c6d53712d5bacc818ce":[5,20,0,17,0], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731a2b2887663c9d025a4137263fc7984024":[5,20,0,17,6], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731a2c62d3d7d92866c97bb513d4e603518e":[5,20,0,17,3], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731a4b864a74545165c2cf2dd74134fdadd1":[5,20,0,17,5], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731a6604fcf5c8bebf904c5b072295027bba":[5,20,0,17,2], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731a7232b4afb5bd82503252ce608638e6eb":[5,20,0,17,1], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731a91e908a7a4725ab9df05549a2b034dec":[5,20,0,17,7], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731abbc2566ba4eb2b5e5dc259a7c4f80bcf":[5,20,0,17,12], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad1cfe18fd912c0d25dc32e6ca9fa8f97":[5,20,0,17,8], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad6b98474a7f14ae7665b7b6d3355657c":[5,20,0,17,4], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad8c2fa2e2f5bf137176dc736cc6a2531":[5,20,0,17,9], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731add11012a8887066fad29e23c20d66af8":[5,20,0,17,11], +"a00022.html#ggafa691c5329a7325ee57c9f06fa295731ae83435f494d1b9f3ce2f2da0ac03fc38":[5,20,0,17,10], +"a00023.html":[5,23,0], +"a00023.html#a00105":[5,23,0,2], +"a00023.html#a00137":[5,23,0,0], +"a00023.html#a00138":[5,23,0,1], +"a00023.html#a197ce470fd9b42e53a867ef84eb2b6dd":[5,23,0,2,9], +"a00023.html#a2c3b5faf44be34a152232b9dfaaf064d":[5,23,0,0,2], +"a00023.html#a2cac1523ac58da64d4076c6155309d2f":[5,23,0,2,6], +"a00023.html#a2e0eada6edeef87ca5609381a495caa0":[5,23,0,2,0], +"a00023.html#a30a2856c0e736ad39fe44c015bd54ca4":[5,23,0,2,12], +"a00023.html#a35109a019b73257d24021ad79d951e64":[5,23,0,2,5], +"a00023.html#a44bd38d7d89b7e185ac9bb49bd7214ea":[5,23,0,1,1], +"a00023.html#a50fd5afc23c86d872ee2a1d46bd4145e":[5,23,0,2,10], +"a00023.html#a5d2631bc772901b4114b01770f9bb337":[5,23,0,0,0], +"a00023.html#a605c0a56df2815ffb3461aaaf116752a":[5,23,0,1,3], +"a00023.html#a7f621935f46f5f1bdd10ca755e1b51a7":[5,23,0,2,13], +"a00023.html#a7fcedbe0ea6e380084a05ba1bb06e38d":[5,23,0,2,3], +"a00023.html#a8b9813693fdfd2116e0d6019ea39b41d":[5,23,0,0,1], +"a00023.html#a8d618d37f6867480bd0e1fcd9e5b50a5":[5,23,0,0,4], +"a00023.html#a94a60ffa711d28e3c9151c9990a9145c":[5,23,0,2,4], +"a00023.html#a9892d7a138f2245bc9b7fe4e6c1652fb":[5,23,0,0,3], +"a00023.html#aafb090dd1831c9e83df2d60cf3cd25f0":[5,23,0,2,1], +"a00023.html#ab964b3fbce4b824beff770a138fd4b6e":[5,23,0,0,8], +"a00023.html#ac34e16abe408d6e9daa37741420f7ec0":[5,23,0,0,5], +"a00023.html#ac808e4908f1d6f9ca78fec3d0b8f118a":[5,23,0,0,10], +"a00023.html#acad21ced979ce0c2af98f0b1837863c9":[5,23,0,1,0], +"a00023.html#ad081b93c86f16dedd57dfc105a71e7fa":[5,23,0,1,2], +"a00023.html#ad5debb2aa90fc8fa732edd1ab4bdbbea":[5,23,0,0,9], +"a00023.html#adbecb8574e5d62ee38761a3b4c30e4c3":[5,23,0,2,11], +"a00023.html#add7cbfa096ebb8bfe5084c9940d0a9d8":[5,23,0,2,2], +"a00023.html#ae1c5e6a8ccdd56a678e8dda316e43845":[5,23,0,2,7], +"a00023.html#aeb0b8a38f5d7e0def2aa1b079643682f":[5,23,0,0,7], +"a00023.html#afb838e91205d1aa1a2b064591bc11c4e":[5,23,0,2,8], +"a00023.html#aff1d7e368b35ae89db8aa393207e7ccc":[5,23,0,0,6], +"a00023.html#ga0433386bbc6c2ac7e2ec7925fea263db":[5,23,0,15], +"a00023.html#ga091d6509100a6e6206483b2f41f16d6c":[5,23,0,23], +"a00023.html#ga095596e064fa8aa6bac0927e71b0329c":[5,23,0,39], +"a00023.html#ga09c3b588e2099ffa6b999c5ca7fb8d58":[5,23,0,33], +"a00023.html#ga235a301d8f22d6ce3a6f77dbdb76cfe3":[5,23,0,21], +"a00023.html#ga28e46a3538cf5f5140523132a963283c":[5,23,0,11], +"a00023.html#ga2aeb4e11fdf0eb515d090865ffcf2ba2":[5,23,0,16], +"a00023.html#ga2de9bf9557d2f7bc6fe0236608cb958e":[5,23,0,42], +"a00023.html#ga33f5cdc2918edf02b9a4ef8a12e27442":[5,23,0,20], +"a00023.html#ga34c6c819c9e2d8608a6d7e63103fa542":[5,23,0,41], +"a00023.html#ga43cc02b4521f48ae0b5626a1e8f87a0e":[5,23,0,43], +"a00023.html#ga49c6966b2af5f0de0fbf49240acc1856":[5,23,0,24], +"a00023.html#ga4d96acc82e0bbe947ececc200083c68a":[5,23,0,26], +"a00023.html#ga4f3beae19d75ae0141b60b5fb6a2d710":[5,23,0,29], +"a00023.html#ga56acdf4c0046516f59c04d89e8e988e6":[5,23,0,40], +"a00023.html#ga58ab07609b094f719f903475de6e57b4":[5,23,0,10], +"a00023.html#ga74464f9357e585e42e5f3c909eb6e9b3":[5,23,0,18], +"a00023.html#ga786ba5b98195c3df810a061b6c0cca91":[5,23,0,12], +"a00023.html#ga78b340bf3b25bfae957d0c5532b9b853":[5,23,0,13], +"a00023.html#ga7ecd603d2579abbe714d58eb582821b8":[5,23,0,9], +"a00023.html#ga7f5a4e7e831ab0dc869637494a57362e":[5,23,0,35], +"a00023.html#ga80892980b702b0b7614691014a5aaaca":[5,23,0,17], +"a00023.html#ga8500107ace3179c85e66d73fa1f41d16":[5,23,0,36], +"a00023.html#ga855e54d43b294857434ce0d82a6b56cb":[5,23,0,5], +"a00023.html#ga9132cf15ff5fd2ac007a88f9400bcf30":[5,23,0,22] +}; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex5.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex5.js new file mode 100644 index 0000000..b880baa --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex5.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX5 = +{ +"a00023.html#ga95abde78d5cbf569f2b6e4d7942b64df":[5,23,0,32], +"a00023.html#ga9688f27725349ed0dd7a37c9a75eccc0":[5,23,0,7], +"a00023.html#ga9aed876794d5c2ab2e37196242602b89":[5,23,0,34], +"a00023.html#ga9b5ca9521874092ccb637a02d7b26ba2":[5,23,0,8], +"a00023.html#gaa6a81e7e82e236bb1c3c5ba306466610":[5,23,0,14], +"a00023.html#gaa7cd13d17a8aa19c34bd8564d37f3a1f":[5,23,0,28], +"a00023.html#gaaa9dc0edc5edacd55bb88ff7b9b55f98":[5,23,0,31], +"a00023.html#gaaab4d6b7d7701fbdd022694330207614":[5,23,0,27], +"a00023.html#gabdcaf539e6c95903c779f4538b1f422b":[5,23,0,19], +"a00023.html#gac0c8e42457c41efd02a4310423804e77":[5,23,0,38], +"a00023.html#gac0f88b67f77fd05f186a5ec940c340bd":[5,23,0,6], +"a00023.html#gad0a37042ec21be840247a05ca9e8e805":[5,23,0,25], +"a00023.html#gad737c0eee502276b7615e83ec3a79be4":[5,23,0,3], +"a00023.html#gae7a92a20789cf111acadb543916aac91":[5,23,0,30], +"a00023.html#gae955a5e336b3cb3276d5cdd6f1f6feda":[5,23,0,44], +"a00023.html#gaedb2f678849734999e373a8b00a5248c":[5,23,0,37], +"a00023.html#gaf7814290d5f1317f0b5dbe97712c3cb7":[5,23,0,4], +"a00023.html#gga28e46a3538cf5f5140523132a963283ca9562d6cdd240e9808a9a1d1946f400b7":[5,23,0,11,0], +"a00023.html#gga28e46a3538cf5f5140523132a963283cad71aee19329a4127614132d30e50ad8a":[5,23,0,11,1], +"a00023.html#gga58ab07609b094f719f903475de6e57b4a3aee3195dc850778e33f2ebacf8847d3":[5,23,0,10,1], +"a00023.html#gga58ab07609b094f719f903475de6e57b4aa637b8f5f0edd262181a20c1fbed7c12":[5,23,0,10,0], +"a00023.html#gga786ba5b98195c3df810a061b6c0cca91a40fdc56c60a07652a4283491087eed6b":[5,23,0,12,0], +"a00023.html#gga786ba5b98195c3df810a061b6c0cca91aea6908db956ab3f686c7ee54d68d401c":[5,23,0,12,1], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a2dae162d4f0509695fce62b0ed1b9e4b":[5,23,0,13,4], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a3dc275bab22f77a1182bbab5fd5cea3b":[5,23,0,13,9], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a42c8946331d417404af48aed9fe53f88":[5,23,0,13,1], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a7154c6ede60243bf5f9e727a5cb18ce5":[5,23,0,13,11], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a7d342596a68c59d4e38bfe33c60f53c9":[5,23,0,13,10], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a9c9626a150100989578d9f18f9b3d59a":[5,23,0,13,6], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ac01c5ca3a2671c568e35d196ea223ada":[5,23,0,13,3], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ac5611ab6b973e6777a7d7db8321f62f2":[5,23,0,13,2], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853acc912dfbb3e827b37e9a942bf601672d":[5,23,0,13,8], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ad97d89d6e3a853cc07c854838a4f31f9":[5,23,0,13,12], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853addb8c45f45a91da558ae553a72557445":[5,23,0,13,0], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ae642012aae33bd8954699572e4adb475":[5,23,0,13,7], +"a00023.html#gga78b340bf3b25bfae957d0c5532b9b853afb9ef5dc29f02f42773fb5b7fcda2e3e":[5,23,0,13,5], +"a00023.html#gga7ecd603d2579abbe714d58eb582821b8a71df5907ecd16c5f08fe1e6673064958":[5,23,0,9,1], +"a00023.html#gga7ecd603d2579abbe714d58eb582821b8af279132afb0bee88bae3065c20c79ab2":[5,23,0,9,2], +"a00023.html#gga7ecd603d2579abbe714d58eb582821b8af7a378247f82677090007d0c38be78f2":[5,23,0,9,0], +"a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2a46309b174047a84a78c77b7648bdf21b":[5,23,0,8,0], +"a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2a64df3b823d2ab5f3f56ffb3f520eafb1":[5,23,0,8,2], +"a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2aad8d786301da1bb92e2b911c386d39eb":[5,23,0,8,1], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a03db476c7c52f9624dab00d9af430411":[5,23,0,14,0], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2187b4e63a575e94e6d3a1b7a5ce51d7":[5,23,0,14,10], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2515d20982ec4edf617f6872e666a1d3":[5,23,0,14,4], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2fab8368a6a3246714c83405202626b3":[5,23,0,14,9], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a46d487d50d8392d25c5c4e76cdfb6674":[5,23,0,14,11], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a615387365fba3c394b1a595e9baa3c95":[5,23,0,14,6], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a722bb0119b5dc19d471b62c622aca9c7":[5,23,0,14,5], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a8106fa188ea138f48c7740dcf5c2b294":[5,23,0,14,3], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610aa655bdfd278003a00cf5195986a38892":[5,23,0,14,13], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610ab35037d2ed958a740984aa0a125d72aa":[5,23,0,14,2], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610abc766d479d00f480e78d05f21f8e1d59":[5,23,0,14,1], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610ade5bc3f17cf2c303ba2e0eeedafd858c":[5,23,0,14,7], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610aef9ca7e74e386c6a6668cc2a0f43c9cd":[5,23,0,14,12], +"a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610af0ae1c44d00b140e86202627084f8638":[5,23,0,14,8], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600a256720c63c378f57791e946c0473290e":[5,23,0,7,6], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600a38225397e3744ef1b4995041ce80d839":[5,23,0,7,1], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600a3cb7112c821c89d7fbb1c048a86756aa":[5,23,0,7,3], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600a3f21596ffe8300152d7f9f5587402e19":[5,23,0,7,7], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600a539a0ebaa0137fdf6d7cc9b984acb13f":[5,23,0,7,2], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600a579872694419f8708e38935593105868":[5,23,0,7,9], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600a78157ec0658118f9205521c03da99093":[5,23,0,7,0], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600a888280fbe6cf9b4b0647db78f0578ff5":[5,23,0,7,5], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600a9e2f548075400b4c0a719ee1b0a534a9":[5,23,0,7,8], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600abf010640733ea1ae8c97d7a0b83ea11b":[5,23,0,7,4], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600ad434a2fb3d728550dd2e784ce0a3e14c":[5,23,0,7,12], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600ade18e0468490127d2e0a8c71a190bdc8":[5,23,0,7,10], +"a00023.html#ggabed82baf7f470b522273a3e37c24c600ae427c8491ce7294dfeaa3b87e506bd81":[5,23,0,7,11], +"a00024.html":[5,24], +"a00024.html#a00139":[5,24,0], +"a00024.html#ae5078ce05e0689966c2c5c49f9aaf89a":[5,24,0,0], +"a00024.html#ga0411f3587cc78cbde38b765e8bf3ba0c":[5,24,1], +"a00024.html#ga0c4c3a2aa689d7cdd0608eb1076d83aa":[5,24,3], +"a00024.html#ga1be1eae0ee5ecd4349a07e836f41630e":[5,24,8], +"a00024.html#ga34bc8734ca383ef16dbe8683f65f2d74":[5,24,6], +"a00024.html#ga6a2589301e091e4ced6951f49e8ab636":[5,24,7], +"a00024.html#gaa0d7b68f6ecfd1f4429c5dabb4b5aec3":[5,24,9], +"a00024.html#gab3a332ac3545c7280fe2e03785736340":[5,24,4], +"a00024.html#gab70db33e771d229596af0a64a398aa78":[5,24,11], +"a00024.html#gac9fb07a0516fdfdbb40129dd85f82b4b":[5,24,5], +"a00024.html#gaeaa5ecfb153fc573f367ea2858f56e8a":[5,24,10], +"a00024.html#gaf985ebf5e165e2fbda510cac71cad222":[5,24,2], +"a00024.html#gga0c4c3a2aa689d7cdd0608eb1076d83aaaf60149e2b9f22db27ef273f412e86150":[5,24,3,0], +"a00024.html#ggaf985ebf5e165e2fbda510cac71cad222a22e7e8fe1fd3cc9d4d3278e0fb7bae32":[5,24,2,0], +"a00024.html#ggaf985ebf5e165e2fbda510cac71cad222a3c617873be9cb696f53cca9529ca6dfc":[5,24,2,1], +"a00024.html#ggaf985ebf5e165e2fbda510cac71cad222afe5c2695869b965f7833386743cc1147":[5,24,2,2], +"a00025.html":[5,25], +"a00025.html#a00140":[5,25,0], +"a00025.html#a15e2f3ecd343280edfd8fbaa0bf8c9f4":[5,25,0,7], +"a00025.html#a405b63e15703dc92b3179b5089319e38":[5,25,0,0], +"a00025.html#a449186b990027ae1e7543458e2f8714a":[5,25,0,6], +"a00025.html#a6ec33e8656fe2cfc997634b348ca2cfa":[5,25,0,4], +"a00025.html#a78ce1ec4de049becaae7e3be51772313":[5,25,0,1], +"a00025.html#a9ada6867151ee688d47176cbe771cf2d":[5,25,0,5], +"a00025.html#ac0e6a4a8be4bd468fdb082a156219a44":[5,25,0,3], +"a00025.html#adc32c01dcffb7f140c8e1fd049862928":[5,25,0,2], +"a00025.html#ga1c5dae412d14eba38f2b63abb9f982d6":[5,25,10], +"a00025.html#ga2620dd2baf891f32359fbe85faaca563":[5,25,8], +"a00025.html#ga358bab6648d05345bda057a72cfb5547":[5,25,9], +"a00025.html#ga56228a5472034e453003e7f375c824ab":[5,25,2], +"a00025.html#ga5666008b33bf327c80afb90e0733512e":[5,25,11], +"a00025.html#ga66b5c37906be6083f083a436eebbe778":[5,25,14], +"a00025.html#gaae4415d32cd0f67908d0ab9494736742":[5,25,7], +"a00025.html#gab1745efaa7c33fab66a552fd45e01d83":[5,25,15], +"a00025.html#gab483f5384985a23bb28889b3c31da9ee":[5,25,3], +"a00025.html#gac575fb8568458aa8acbbed14d5aa5ffd":[5,25,12], +"a00025.html#gaca0e9724bd1f25336527ea66c77e476f":[5,25,4], +"a00025.html#gacfd7070829029279f3b3bfb763b86914":[5,25,5], +"a00025.html#gad2351329bb1ff6b966decec266d7ec16":[5,25,13], +"a00025.html#gadc47d88ae20552f9cd9999e6f8fc5ebe":[5,25,6], +"a00025.html#gaf661d1e3e19a80b873c54fdbad5e966a":[5,25,1], +"a00025.html#ggaca0e9724bd1f25336527ea66c77e476fa825be03d771f06e1d6cf947ca78f857e":[5,25,4,1], +"a00025.html#ggaca0e9724bd1f25336527ea66c77e476faea9db9afc1f9c70872a755eaa24a4184":[5,25,4,0], +"a00085.html":[5,17], +"a00085.html#ga05cbdf9affa49e1ea898935937a94bc1":[5,17,28], +"a00085.html#ga1680834b74ccfaca0cc98b954cfef0ec":[5,17,3], +"a00085.html#ga2017fc3e4b370ec4528136d4f4bc08b5":[5,17,29], +"a00085.html#ga26070d8045aac640b0b755bd7b1b5695":[5,17,2], +"a00085.html#ga2cef71a7429671e6aaf71b3c40f1bc23":[5,17,26], +"a00085.html#ga40a1d0c80f5189e9c56133a2bc15a4c2":[5,17,9], +"a00085.html#ga4b0c77a348378a9c77539fc160c239df":[5,17,15], +"a00085.html#ga4b9f6c3aa18e60b7a85edfa8857906ed":[5,17,21], +"a00085.html#ga566dde551cccfbff838b7f6f474e525b":[5,17,0], +"a00085.html#ga64687ae9aee146f932c9d822633ed751":[5,17,11], +"a00085.html#ga6ad77a0ddbf43076a49a207534c6b7f8":[5,17,14], +"a00085.html#ga7069e59acd0a3e196bb54b7a5bcead3d":[5,17,19], +"a00085.html#ga7b82522f086af61786aa316142d3540c":[5,17,20], +"a00085.html#ga7bfb95e1397b0fc1b02b740458667d4c":[5,17,22], +"a00085.html#ga7ee1c99dbc8430bf973857b641d677e9":[5,17,27], +"a00085.html#ga83d78eac8ce2faa5f92738c681846d5b":[5,17,10], +"a00085.html#ga85b6d46e43b818ba54dba92256db4499":[5,17,30], +"a00085.html#ga85cddf883d8412b35f3648fa5a62b136":[5,17,16], +"a00085.html#ga86ad2183a772150f3c72d5aaf158afaa":[5,17,23], +"a00085.html#gaa25d9a439cb1779e76c107cfc9c1a86e":[5,17,18], +"a00085.html#gaacea8a22b7f4706814e61973550d3492":[5,17,5], +"a00085.html#gab5d33167d8a4c9d9a407cc1bdd6346a9":[5,17,4], +"a00085.html#gabea720a67b6b06b187a5781b9955dc9c":[5,17,13], +"a00085.html#gacc5b8fefeacc0f1909d657be9cedddf3":[5,17,1], +"a00085.html#gacf3a138e73725bb8c50290295259bfa4":[5,17,8], +"a00085.html#gad4414c07be8e296fdf41c256e605c161":[5,17,6], +"a00085.html#gad856ab8003eb9953525518cddbc7814c":[5,17,7], +"a00085.html#gada7daa74280566725bfa2854613c91cc":[5,17,25], +"a00085.html#gae9733cfb042126b04d237cc8db40dba0":[5,17,12], +"a00085.html#gaf5a1bdc5ba7e3b43083fdb74f0154fb3":[5,17,24], +"a00085.html#gafd390219700f64b63df3ded05212bda5":[5,17,17], +"a00085.html#ggaacea8a22b7f4706814e61973550d3492a740c74b8de11afea3adf94099430d43f":[5,17,5,1], +"a00085.html#ggaacea8a22b7f4706814e61973550d3492a80dcccd621286706e1c8a4ebe9c10f0a":[5,17,5,0], +"a00085.html#ggaacea8a22b7f4706814e61973550d3492a8464e8acd4980abf527cdc08a1039f03":[5,17,5,3], +"a00085.html#ggaacea8a22b7f4706814e61973550d3492ad0fed29c216cb44973a5720f27c25b57":[5,17,5,2], +"a00085.html#ggaacea8a22b7f4706814e61973550d3492ad41dcf0263e8b148f96f850b2be396ac":[5,17,5,4], +"a00085.html#ggad4414c07be8e296fdf41c256e605c161a6eb61ac24d5fe54b31f0c2089e5da750":[5,17,6,3], +"a00085.html#ggad4414c07be8e296fdf41c256e605c161a75c8d8c85c9703e637809b497e798615":[5,17,6,2], +"a00085.html#ggad4414c07be8e296fdf41c256e605c161a787770b2bcd6da51b910e61a4b1587a2":[5,17,6,1], +"a00085.html#ggad4414c07be8e296fdf41c256e605c161add73712f6ddad1995c9569ab44773f86":[5,17,6,0], +"a00085.html#ggad856ab8003eb9953525518cddbc7814ca186e757d5a202f806afd889315af3639":[5,17,7,1], +"a00085.html#ggad856ab8003eb9953525518cddbc7814ca2094c3f450488ea077bf45edabd227ba":[5,17,7,2], +"a00085.html#ggad856ab8003eb9953525518cddbc7814cab28fa5a4937806aefbc4d259a419d354":[5,17,7,3], +"a00085.html#ggad856ab8003eb9953525518cddbc7814cabc8bc042a952213b5364fcc75fb2e459":[5,17,7,0], +"a00086.html":[5,18], +"a00086.html#ga337911597d5b1d45ac9ac6abb705a5ef":[5,18,1], +"a00086.html#gac287530f011b42355162470f09975770":[5,18,2], +"a00086.html#gac33f3428cb55ce07ae67802e5f534ffc":[5,18,3], +"a00086.html#gaf2dd9adbeea910141dc143654a1065db":[5,18,0], +"a00086.html#ggac287530f011b42355162470f09975770a194baa96cd93ef108f2724fa98352387":[5,18,2,9], +"a00086.html#ggac287530f011b42355162470f09975770a20fd1ac8739a143dddb40a6349a758a6":[5,18,2,22], +"a00086.html#ggac287530f011b42355162470f09975770a244e5cce727a529563a83a1a78f8b3f1":[5,18,2,2], +"a00086.html#ggac287530f011b42355162470f09975770a25d5f742c3cbcf85a4e9c388c5c9e708":[5,18,2,21], +"a00086.html#ggac287530f011b42355162470f09975770a3aedfdfb886f77b764c41e155ccb44f6":[5,18,2,8], +"a00086.html#ggac287530f011b42355162470f09975770a5a074c4e48569dce7baacbae585541fc":[5,18,2,4], +"a00086.html#ggac287530f011b42355162470f09975770a6946809531736fcf4d7067e31f73813b":[5,18,2,26], +"a00086.html#ggac287530f011b42355162470f09975770a69e2004fad90b83501ee061e1eb7c85d":[5,18,2,17], +"a00086.html#ggac287530f011b42355162470f09975770a78cd776910006a5d8724f628b5c8a0a5":[5,18,2,29], +"a00086.html#ggac287530f011b42355162470f09975770a7a5b1b185218feb35ce91ce8f77b2106":[5,18,2,28], +"a00086.html#ggac287530f011b42355162470f09975770a80aae2b47fdc2701cb923d27ca9e5a7a":[5,18,2,5], +"a00086.html#ggac287530f011b42355162470f09975770a81a00b3196e6197af1ca45b8a5bac450":[5,18,2,6], +"a00086.html#ggac287530f011b42355162470f09975770a8bc751e4927f0c20a0695b284fc40c38":[5,18,2,11], +"a00086.html#ggac287530f011b42355162470f09975770a8dbbba3532e3e597133ebc8a55bdd1e7":[5,18,2,23], +"a00086.html#ggac287530f011b42355162470f09975770a900b1deecf2f2316b30e40ff81330499":[5,18,2,20], +"a00086.html#ggac287530f011b42355162470f09975770a97ee4a7923c967d1c356c0f135c465c2":[5,18,2,18], +"a00086.html#ggac287530f011b42355162470f09975770a99e18503426294e439f4bb181a451999":[5,18,2,19], +"a00086.html#ggac287530f011b42355162470f09975770aa294a3c09c1565947ebcd78694acff24":[5,18,2,10], +"a00086.html#ggac287530f011b42355162470f09975770aa61d8fdd3f725cee11918bae04493dc8":[5,18,2,24], +"a00086.html#ggac287530f011b42355162470f09975770ab95a1dd8a7fbc479365344d58ac55737":[5,18,2,13], +"a00086.html#ggac287530f011b42355162470f09975770aba3fb61d22a1e6b912b002bc592b3f1f":[5,18,2,27], +"a00086.html#ggac287530f011b42355162470f09975770aba96ac75d5b05b7df8222704e24def14":[5,18,2,12], +"a00086.html#ggac287530f011b42355162470f09975770abbd5b2eb886157d35a4ff88077fa192b":[5,18,2,3], +"a00086.html#ggac287530f011b42355162470f09975770ac11437bc3b54618d863748e13b09ea3e":[5,18,2,15], +"a00086.html#ggac287530f011b42355162470f09975770ac1601058bee0888d89675b528432a496":[5,18,2,0], +"a00086.html#ggac287530f011b42355162470f09975770ac1a3b1156e6dbc9d6fecb867f1486c63":[5,18,2,14], +"a00086.html#ggac287530f011b42355162470f09975770ac1d90aca68025a47b316e6f6b02c209e":[5,18,2,25], +"a00086.html#ggac287530f011b42355162470f09975770ac5dc2b0f880a50d33e7d79f7af4c4f33":[5,18,2,7], +"a00086.html#ggac287530f011b42355162470f09975770ad1ef18ed84027fdc4d41567ae894ea10":[5,18,2,16], +"a00086.html#ggac287530f011b42355162470f09975770aee6d4f65797043b10be7d4a7ae95d206":[5,18,2,1], +"a00087.html":[5,5], +"a00087.html#ga0be5caec9b8493d87cc849714bd47865":[5,5,19], +"a00087.html#ga1a04b7330b5196f73ed4ffe7fa2bae6c":[5,5,6], +"a00087.html#ga262e149f9ce1ef4cf2e539e9494d3cca":[5,5,8], +"a00087.html#ga2c85202f838f94e51a0bb7b33856c78d":[5,5,11], +"a00087.html#ga4e1420d9e817ebe0e8973420411de015":[5,5,18], +"a00087.html#ga4f9121590e5b8fe025d706ff2fe5da36":[5,5,20], +"a00087.html#ga59764d32e5394455906edbf03cff0b9f":[5,5,5], +"a00087.html#ga5a951951cdb6063d949523052aa5b5e4":[5,5,12], +"a00087.html#ga6242a25f9d996f0cc4f4cdb911218b75":[5,5,15], +"a00087.html#ga6b4add5f2d938a89da56f58ac0b4e89b":[5,5,7], +"a00087.html#ga74389c7c04a9f53548d05287c7c665cd":[5,5,14], +"a00087.html#ga75a9e86134df04f6a8b66025d11e25c2":[5,5,10], +"a00087.html#ga7ff0b98bb1341c07acefb1473b6eda29":[5,5,17], +"a00087.html#ga812138aa3315b0c6953c1a26130bcc37":[5,5,2], +"a00087.html#ga9a10f3f762d9eb7c5db73535db6a9d78":[5,5,0], +"a00087.html#ga9d142691c3a4d810f8bdabc41e89dfd7":[5,5,13], +"a00087.html#gaa7fc9e15d36453236a580b3c8116ee85":[5,5,4], +"a00087.html#gaaabdaf7ee58ca7269bd4bf24efcde092":[5,5,16], +"a00087.html#gac6e3c4c6fa592fc0da7fab541e7019f7":[5,5,3], +"a00087.html#gad4f7f7e51a84c34f06bbbb34973ae97a":[5,5,9], +"a00087.html#gad76dfbb0423d0cd3a7b77cbcd9043146":[5,5,1], +"a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba31e314ec45f0b673257687c06b6fe764":[5,5,17,7], +"a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba69927473662d55dfe6a4b8b1ea529f67":[5,5,17,2], +"a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba829bee76c6b02225d9c891ae8ef70881":[5,5,17,0], +"a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba82fc7f2a425a9c3cfcf6636b8c05c06c":[5,5,17,6], +"a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba8692e71089c7e81bd5f4503ff55035db":[5,5,17,1], +"a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba94770b392eceab60898d03ffcf0cc145":[5,5,17,8], +"a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba96d166071c2c0b2672ddaa3307899a0b":[5,5,17,3], +"a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba9743ab3bec5065667c0b12510317e76c":[5,5,17,4], +"a00087.html#gga06fc87d81c62e9abb8790b6e5713c55badf7f172a5d4f1a44d5cb8a1121dcafcb":[5,5,17,5], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a01101c0342017a7fbe7225a7aa285bad":[5,5,17,56], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a01bf442d671041dcbd1649ec0428c3b6":[5,5,17,61], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a025ed41827a0bd0b7bf60b853a921c7d":[5,5,17,107], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a02f52b9532ae0d4af04f5c054f3fab84":[5,5,17,44], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a055d3788919f48c2d69463819d02d903":[5,5,17,22], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a073c6e3ccd0dbcf1b812cb21da5e7df9":[5,5,17,14], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a097d515214e888371df5c588b839529d":[5,5,17,72], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0b66f34ec90c9b6a702e0f00f5ddae43":[5,5,17,25], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0d6c6a34fc0b6dbcb323f010556a3be1":[5,5,17,7], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0ec7f0302a8f7eb082f449933880a1ad":[5,5,17,38], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1461a28ac2297f07aa34581074cf9923":[5,5,17,40], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a18ce0675c0cc628b2ff29a1bafce8b58":[5,5,17,77], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1c5e35d9d03724b7ccadcae8e0451384":[5,5,17,16], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1d1d1a595e9f00c6c9f80c19ce1b8ec5":[5,5,17,27], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1d9b7b66bfaaf53b42aad8462c88ea62":[5,5,17,48], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1dcb6a7c2605c9ed77388fcb25b01feb":[5,5,17,64], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a210ff4fa30e99618f8d3e978df03a7b6":[5,5,17,37], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a214d1cc4faa574be18fa9d865f2ca36d":[5,5,17,42], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a22f1bdf5e7abbeb0bdfe18cda0bc5aca":[5,5,17,57], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a25fb824a9ad702e631276a8ea5d03603":[5,5,17,46], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a298049d9d9c8be1b2e7a42f38a734d87":[5,5,17,50], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2af6421e7b473bd882f5372ad1fa6d0e":[5,5,17,105], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2e3bc103af2d3db7b628f87174d2bff8":[5,5,17,93], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2fef671dda58af09262787022fe321fe":[5,5,17,70], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3091dcef1c0c7cd48658d8b43b52fbaf":[5,5,17,39] +}; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex6.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex6.js new file mode 100644 index 0000000..5d163f8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex6.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX6 = +{ +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a33255aee9de4a1d093770b218f944d0f":[5,5,17,26], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a376f952aee5cd45d903da520a37e4c52":[5,5,17,35], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a381f1929c41dcaef62d2d44326719db8":[5,5,17,76], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a39a54cda2a1cac31e1c00be0eb4a7620":[5,5,17,87], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3b3116c6f4aa1a88e6e7abc45df58938":[5,5,17,29], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3bc2ecc10af8973a1ecc4f0163fb9b53":[5,5,17,3], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3bcb0be184f8d5bb76d4be8e99b4e45e":[5,5,17,11], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3e59e90d903b97bd45037175997f4ad6":[5,5,17,102], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4603f8fedc8ad994788e17baae895013":[5,5,17,86], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a491dbb2373725b607970c032f4e04ee3":[5,5,17,2], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a499ec238a1614827065533960716e652":[5,5,17,69], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4a488e0f7cc1d3baa449ab4ca99e7b34":[5,5,17,36], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4f53ab1f39031629ac12159920f0cde1":[5,5,17,101], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a521a4b8ac1776d0f41af044886a71b3b":[5,5,17,32], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a539b147c0d1409a0e11c3ae340886fa8":[5,5,17,97], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a56134a73f0cfd393dd7cf7fb2395dd99":[5,5,17,68], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a5b65c75456471a2536a97a30db4b8da3":[5,5,17,94], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a5c67a60e98e49151455f565c2834d228":[5,5,17,9], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a60c31c70600aff4f290ca2d790622977":[5,5,17,12], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a64b54e0423e0ad8a227a38cad4ad4eda":[5,5,17,41], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6510cce112fc6ed1e0523b5d7b307ca2":[5,5,17,78], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a660addd059be8786f2aa3d9a1a196ae1":[5,5,17,91], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a679444433f12ae5649cb02c2032ca20e":[5,5,17,45], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a67a884fec4d6adb5b455d50a0a5617a5":[5,5,17,58], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a67e5d3d11fb3f47ec11d9ee612b98b94":[5,5,17,6], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6c52b0b8b2d2ca670a5f8eca66212f54":[5,5,17,110], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6d0dedbec7ee218b0ae03f23edad02fd":[5,5,17,96], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6dbe13107a9dbb857242cf05e2319f9d":[5,5,17,66], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a713723bd8764655328f1e5283a8e6020":[5,5,17,100], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7415efb189bfb31491ef0ae45fb24d90":[5,5,17,89], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7491bc6ede9a2eb6e7f292bb1530b7d7":[5,5,17,74], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a749eaf601d6fe3124f054bcb796b348c":[5,5,17,67], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7712fcacc6d5e9698366daafc59ea644":[5,5,17,109], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7771d56430ad7ff2553a1258aba16e02":[5,5,17,95], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7c488d28bc9be2e29bd0d133bce7389a":[5,5,17,99], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7d6b922ab2a42d6ef35cfb2be4f80251":[5,5,17,31], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8210c55fe061ff24e75a0f928dbfcb39":[5,5,17,18], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a830e5b42a05424dc026bd36d30f143a5":[5,5,17,98], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a84ab69a4e7f3f1c39f1c3a64d74af08c":[5,5,17,88], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a85685b8cde1285d240569b9518c32fc0":[5,5,17,20], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a858563b1d87d6fa57a8f442025655201":[5,5,17,55], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8bea2b5f8b1458aaa0dc29ddbb972d87":[5,5,17,62], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8db8bea33da992b22cafbae1dcf65bb0":[5,5,17,1], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8e4a33b100580c2c1606d66d5ffdfaa3":[5,5,17,90], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8e7465155c679388316b2f874a284e9e":[5,5,17,54], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a94d2a6fe8021fed5487169a46421d47e":[5,5,17,30], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9771abafdcf43bf924599a0081e92bf2":[5,5,17,19], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a984927be2e0e57c4125e8e8f5d9c0f48":[5,5,17,75], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9cf111a176ebe1210ae6faaa950aac54":[5,5,17,73], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9f1b2d0eeee16f209d7eed3bdb1cf533":[5,5,17,10], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa0d0535965c8d28434b036961f6a8c20":[5,5,17,84], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa2c382624b5763cf24cf9727fbfadde3":[5,5,17,65], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa44796b25ed6ed37f7fb25f6f4076c2d":[5,5,17,79], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa4609e941ad1155a86c40bdfcb20a155":[5,5,17,83], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa5afa714de4adf37bc00faf6c3dc589e":[5,5,17,82], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aaa30b9e3fdd5e93bae58e66521b3015d":[5,5,17,81], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aae462c0663af9e2d180cd06c5798ac3b":[5,5,17,104], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab0104dd99e52fbf948f4ae030de5313d":[5,5,17,63], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab55df75d85633505960f611180054524":[5,5,17,60], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab597c78848ce0e63d2518f14e7bac82b":[5,5,17,53], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab7f77dd7e0c3d068baf39117ac08a0b9":[5,5,17,49], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab99693af818132e3cb4f9198965ad637":[5,5,17,51], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aba70aa1970435b3ccd39ac54f9d7a68c":[5,5,17,80], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aba83e94d1735b695119429a4e55bb3a4":[5,5,17,15], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29abdf3fca48a7a13b67d0207aeb59bc581":[5,5,17,28], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac071c3c3d14ed8afadb2bb6de249c722":[5,5,17,47], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac4c2c9d32010087f0602dbdf2c389857":[5,5,17,43], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac509445aa04b715b77e6461993b50085":[5,5,17,85], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29acdfe26eb8bbbaaea438470512401e09a":[5,5,17,92], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ad85b4bef880b9407425398fc584e16a0":[5,5,17,103], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29adb8c69c2f8cd344f3e2dc0b0db4a1631":[5,5,17,33], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae0b4ea9f05497a624e32811c4f36a3be":[5,5,17,59], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae0c3a94577af5271a1042757d3c8fdc1":[5,5,17,71], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae16d6bba44ae6f24187946960fb826dd":[5,5,17,34], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae28000753ef8046bc9b08e03fc8a1899":[5,5,17,106], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae2f54d029f0e74c8fed8812e24000a74":[5,5,17,52], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae4461a3a085ea13b5fe7908bf1e109f8":[5,5,17,17], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae5b7283daca81a85091e27b80ece629a":[5,5,17,23], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae67462f0d7dbac886d8a1272a29b846c":[5,5,17,108], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae7514134f14004b1835d27cac48bd991":[5,5,17,5], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae7c95e11ceb8067c9c2703f96e51aca7":[5,5,17,0], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae834c896c69c50855c5cf07768a6cba3":[5,5,17,21], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aedd1abcbca188de6e16a6f088d59e92e":[5,5,17,24], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aee549dc5fb5e05a0d8daaa61a089b222":[5,5,17,4], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aeeb2ed6ef4ce59c7e1d416466f55bfb7":[5,5,17,8], +"a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29af98b407f4e66e7046a3173031b45253d":[5,5,17,13], +"a00088.html":[5,11], +"a00088.html#ga0093db979d7b9afca6dca250f42b2eef":[5,11,8], +"a00088.html#ga0efb897bafe816a8a87d92045a78ee9b":[5,11,1], +"a00088.html#ga258d8c49d494cbd0d18321af56e11440":[5,11,5], +"a00088.html#ga361041aa626a50391c40c9d6936ba2c0":[5,11,6], +"a00088.html#ga48b79c8dc56de9714927e70ad230fa0b":[5,11,11], +"a00088.html#ga4cc5332eb289fd1c999a47c0c22b8f2c":[5,11,13], +"a00088.html#ga6b58df04b8aae97c7e31884f3fe3413f":[5,11,7], +"a00088.html#ga747cfb2ed95cefa6f39ae2ad089f8ade":[5,11,3], +"a00088.html#ga87a985be230bedefd5e3560dde51d788":[5,11,14], +"a00088.html#ga916f8b461de93f08044df1724290dcbd":[5,11,2], +"a00088.html#ga93474c7fb9be2c15eabc9dbf73c99bdb":[5,11,9], +"a00088.html#ga93a68a9ca640a51b56350d59cac4dd7c":[5,11,10], +"a00088.html#ga98407c578584b1d88d7be1b3e6d9656a":[5,11,4], +"a00088.html#gaae3267ca6081e1f5620b0aa674c5e8ca":[5,11,0], +"a00088.html#gaf3d4c53d3b36200b76c7c2e9185e9350":[5,11,12], +"a00088.html#gga0efb897bafe816a8a87d92045a78ee9ba0576e02942748ad3a4b1bb0904267ad4":[5,11,1,0], +"a00088.html#gga0efb897bafe816a8a87d92045a78ee9ba14466fd6ca33233907a499072ed0ea04":[5,11,1,1], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa0f88b3ef422116327baca297944ca597":[5,11,0,23], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa198048f7f05d882a431c4ea4c904174e":[5,11,0,30], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3556cf54991582784cca44e4604113cc":[5,11,0,31], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3891f9959d7cdcc9b6ad7e00816b2fc8":[5,11,0,29], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3fa0f400c5389e777ba1f8d6acb27d72":[5,11,0,20], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa5ccbc970e59fd2f3ea432bf5c00fea7e":[5,11,0,19], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa6c51c9bed9f8973d47f7b73e3592b2aa":[5,11,0,21], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa6ef0ad89e49b23cb3fc4b046013a5332":[5,11,0,32], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa9b439af9906d00c0f5a83e5c878c2e50":[5,11,0,22], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caab7decacdc717da7752b3a4637a228278":[5,11,0,24], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caabda85aeb932e76c81db46f45a8c6f656":[5,11,0,25], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae3058d7cb02b689b3993fae3c913e0f0":[5,11,0,27], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae674c1ed0ecf4b2851aefc44261004bc":[5,11,0,28], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae8bcbc2ebc5c99fd75de395e3d18b021":[5,11,0,18], +"a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caaf09dfcba592f2a1e02727d9eeebee15d":[5,11,0,26], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a0491cac2cd13971f08f754a5365ab356":[5], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a08741d113d7dd7358c0a548ed6bedaa9":[15], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a254b836a21eb98b6211cefd76037dde7":[1], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a35e8de33bf46beecd34105c59ec2bc6e":[0], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a37f09b865f86f3f6f58064be70121c02":[3], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a59fbec3050069d5bf473211cad8ab817":[8], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a61e927398cdd5549301de26831ff5460":[12], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a947c74ac4418ae34ab4b8be2416e11cb":[6], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a98ad8dfd7c9c06637a8ef77669248d44":[14], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ab171ff8674c9017605cde0067a84a375":[11], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ab36f8ecf47da3052eb485015a1932c26":[2], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ac08832cd7dd8929746e5583b85050a43":[10], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ad9d50e05078873600322a78c0bd94b35":[17], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7adfb58b377dc75167cff2cc8e003939ff":[16], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ae4a180ae087b0f4a58a7c89cb081f400":[13], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ae69151d679a249f83fde025b5562196a":[4], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7aea4e342b4bc05dc9f04b2a50b5ccba4f":[9], +"a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7affa7c3fd999eb6a4558a4e981aa29ccd":[7], +"a00089.html":[5,12], +"a00089.html#ga166fc4ada71e4fa9e160774700c976d7":[5,12,1], +"a00089.html#ga7ac6f6ac5dd2b621eabb60d2ab48163b":[5,12,2], +"a00089.html#gaa4f141e3874109e45c2a6f9be027e0ee":[5,12,4], +"a00089.html#gae02fecc3b8aab2a9d3f40f07ca7114a4":[5,12,3], +"a00089.html#gaee30199bd34b2e831f916b4a17f83cfa":[5,12,0], +"a00089.html#gaf84e3b0d7a06af86ea6f1ac0d6edf382":[5,12,5], +"a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163ba1e042af47b407b5b414e22bab7f3e87d":[5,12,2,2], +"a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163baa405e10591d83ca35d931b53cbe7478b":[5,12,2,1], +"a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163baa76de68415d27dc96db87292ea596e47":[5,12,2,0], +"a00090.html":[5,10], +"a00091.html":[5,10,0], +"a00091.html#ga2c6171791d36810488b3e31648156d40":[5,10,0,2], +"a00091.html#ga5f10a8d39f171f4c6fb65bba7ff9bb2b":[5,10,0,5], +"a00091.html#ga60fdaec284298758a650ce1122aef231":[5,10,0,0], +"a00091.html#ga6d910a54f8271411dbed62a08ac462a2":[5,10,0,3], +"a00091.html#gaa638faf1f9e205ac8df1e4cf44de0a14":[5,10,0,4], +"a00091.html#gaac288786aaa7d0cb947c91591baf42d7":[5,10,0,1], +"a00091.html#gac815d26a6d964108edbc558afe774828":[5,10,0,6], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a0db20b358696db03a068816bb72a0310":[5,10,0,6,4], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a139b52cc3305ec2c06d0ac94313c221f":[5,10,0,6,5], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a256cb58b123f0814d020cc8449cf48d5":[5,10,0,6,8], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a308bcea12eeef85aeac416ead81639b9":[5,10,0,6,3], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a49091894b590d7e479605bf113918952":[5,10,0,6,0], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a628d242f7bc0e3d5949c7f73eafaa508":[5,10,0,6,1], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a72fd33d0b5263a63766e62f71d16be00":[5,10,0,6,2], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a81ad7cc198436cabbe91ea55c5288747":[5,10,0,6,11], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a834a772763c85b5bedf8eb0a0cfa2f9e":[5,10,0,6,6], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635a99cb29358dad3255402d30285f844632":[5,10,0,6,9], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635ac0253b1c986e61b7905da4a7f1fbf844":[5,10,0,6,7], +"a00091.html#gga726ca809ffd3d67ab4b8476646f26635adf7437bfedcc0d57338ed33f1be5c805":[5,10,0,6,10], +"a00092.html":[5,20], +"a00093.html":[5,23], +"a00094.html":[5,16], +"a00094.html#ga00d40f5f01c445206f1f800dcc7b6e89":[5,16,26], +"a00094.html#ga048bc24e58d7df40af2a45efaabeea9b":[5,16,5], +"a00094.html#ga055c655c611b5645ce6903557ef809bb":[5,16,14], +"a00094.html#ga08b623f67c277521182f8c9e630037ae":[5,16,21], +"a00094.html#ga11c44cbe5b42c79b22a3053c85b1e5d0":[5,16,16], +"a00094.html#ga12c568c9b7f6d46257dc63505a381701":[5,16,9], +"a00094.html#ga15da1f70e8d0a05e9d492d01ceca7da8":[5,16,3], +"a00094.html#ga1dc66cd865640c0b60eb128a868eab37":[5,16,22], +"a00094.html#ga262ac9596c0926fbe5f346e0f6aaf9f5":[5,16,1], +"a00094.html#ga269af5856a4cfd5d2a171b4777d6884a":[5,16,18], +"a00094.html#ga2c7d26f7018dc7e75c1e090090628069":[5,16,0], +"a00094.html#ga2cb0ee73a24657dd6994cb00b78c3137":[5,16,34], +"a00094.html#ga2e05f827d6a43eade4c22e9d75bc5d76":[5,16,4], +"a00094.html#ga363edbba9536380728e44bd7d1a0e7df":[5,16,8], +"a00094.html#ga4dd886dc387a64a5cb146ccd7297e1e1":[5,16,28], +"a00094.html#ga53dd5706866fa0313689db6e4d9c1a9b":[5,16,20], +"a00094.html#ga567b159bbfa265ed02c4900769ed8fe4":[5,16,25], +"a00094.html#ga58eced039e8c793b7ff148d6cfacde5b":[5,16,17], +"a00094.html#ga6a17e5c52721f6eb754f54cc72b58c91":[5,16,2], +"a00094.html#ga6d4f8e83cec4bc716231c97c2ceb5421":[5,16,23], +"a00094.html#ga73f0e7280f898bf99fe92b3519878a77":[5,16,30], +"a00094.html#ga74b3eece6c6eabc38f3194b125ff80d5":[5,16,24], +"a00094.html#ga78ffa3e09e17db8dc6a9038123ad1c46":[5,16,33], +"a00094.html#ga8911d499fb65ffe496c01f65bad9314f":[5,16,27], +"a00094.html#ga99a96e386a822de59ac2d60149ec47f3":[5,16,11], +"a00094.html#gaace443444dec2e5b7e3e20cf69c53def":[5,16,15], +"a00094.html#gab5dbaf58c90b1ef54bcd2c5dba9e178f":[5,16,13], +"a00094.html#gab784e6aea0129b0c90164462bd0dbac5":[5,16,10], +"a00094.html#gac6b1406205adace6696a1647250ad76d":[5,16,31], +"a00094.html#gace94acb3f70964230b2606fdbeb5f58b":[5,16,12], +"a00094.html#gad7300bf374c0cdc65fadff76f3ee7e5c":[5,16,35], +"a00094.html#gada262638d555d9a503ddcdbed24ec475":[5,16,32], +"a00094.html#gae1e5bfc17515fab76a1deab955203c6a":[5,16,6], +"a00094.html#gaec7a3986f92f8c11a70a80af1a93a3b6":[5,16,19], +"a00094.html#gaf043d142dac622bedd50b736b52ac6e9":[5,16,7], +"a00094.html#gaf5754b4b1d1436c359dde18101657d4e":[5,16,29], +"a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba0d3bf0a5022325acaae66e172c984db0":[5,16,5,1], +"a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba106986aeb5e12c2b76e070def3b37d95":[5,16,5,0], +"a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba1ca87ca7db6ec59b675c6e70abc45da0":[5,16,5,5], +"a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba3a75ed56ef8a3429c01fc686f22b8e8a":[5,16,5,7], +"a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba86a79a77b44e91f432bb8ee9070f9602":[5,16,5,6], +"a00094.html#gga048bc24e58d7df40af2a45efaabeea9bac0ce3f2fbc216bc3cec68c47263530c5":[5,16,5,4], +"a00094.html#gga048bc24e58d7df40af2a45efaabeea9bae5db81838d55c8a8839b1dd47954d865":[5,16,5,3], +"a00094.html#gga048bc24e58d7df40af2a45efaabeea9baf00e092237b1b299bdfdd901f207c468":[5,16,5,2], +"a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a45fc443b2ec03c89708ac897fc3fc902":[5,16,3,5], +"a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a5df52c4fbb437e61b638d35cbc550162":[5,16,3,0], +"a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a751ce5a16f196ca04d08d2e5d65af47c":[5,16,3,3], +"a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a81913bc912b5164bb749b6a2e8823808":[5,16,3,2], +"a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8aae1e0da9add6e3e1dd57705a682d65fa":[5,16,3,7], +"a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8ab62e1c2d3cdccef05e45ae9028cecbb4":[5,16,3,1], +"a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8acf173e0dc3d44c77bb08146494a0249b":[5,16,3,4], +"a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8adf92ec20d1fa6a12bda6c42e5304cf46":[5,16,3,6], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a1f7f561990336a81a46f22395820907d":[5,16,4,8], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a2c93115b816dc676460cfc1be85778f0":[5,16,4,7], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a41b057b493937cd87bc212cb2e316f8a":[5,16,4,2], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a51f543e6f680df9beb5841231b7b3a96":[5,16,4,0], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a6be4432cb9e687d043a2c25c1af48869":[5,16,4,3], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a6fc5c9dbee30b375feb9ce6c86b224c2":[5,16,4,1], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a78ff6e40ab17d81181284c56b62b77aa":[5,16,4,5], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a8cc05c9aec163085b7a2b4481fdc971d":[5,16,4,9], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a9b2f5abc74e498a599f5c005a6cc911f":[5,16,4,6], +"a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76aabc93fc28498f5577939f38e0513304c":[5,16,4,4], +"a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a3bd6a570eee5c1fddd95ef2411b35a7e":[5,16,2,4], +"a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a58ac8e76b409274b7d02ef6e9805dcef":[5,16,2,3], +"a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a6f54d55ac52e8e697f83637109560e89":[5,16,2,2], +"a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91aa48de84b39b48759086f2d7ae0c8091e":[5,16,2,0], +"a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91ae873d30aec2ca54de88c69f55ea42a07":[5,16,2,1], +"a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91affc9b2756b7642ddb60ea78f4bbbd592":[5,16,2,5], +"a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa059c3472509304186252b655cf486d8b":[5,16,6,3], +"a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa128703d2c2175a315aaffad869ed6a32":[5,16,6,0], +"a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa3b4af984526871b66489b0eb294d2df5":[5,16,6,5], +"a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa654c70eeed38b0be2271dc51d7cc04f5":[5,16,6,1], +"a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa7dc0770cf7ffe184788c30bd1ac9c515":[5,16,6,4], +"a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa9d2a3e9717c34de3a884b695f35a6c37":[5,16,6,2], +"a00094.html#ggae1e5bfc17515fab76a1deab955203c6aaac967156901735a43316f7f1c4720328":[5,16,6,7], +"a00094.html#ggae1e5bfc17515fab76a1deab955203c6aab5630ebfbc6e52c9b04f659918c094f2":[5,16,6,6], +"a00095.html":[5,21], +"a00095.html#ga45575871cafcadc50292b9bba6b9d13d":[5,21,2], +"a00095.html#ga55452f734d7cc5e02195ed926e4484c8":[5,21,5] +}; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex7.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex7.js new file mode 100644 index 0000000..6580734 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/navtreeindex7.js @@ -0,0 +1,176 @@ +var NAVTREEINDEX7 = +{ +"a00095.html#ga6db188a71a269613f30825af80c02053":[5,21,3], +"a00095.html#gaae2dc5c29ae2358c616fa8a2b61a7e4b":[5,21,4], +"a00095.html#gaca9c780388e187444bfa31a6bcc72d35":[5,21,1], +"a00095.html#gafa0f32bbd70b73222cc401d997b1f243":[5,21,0], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da048cac659ef579d1358cc6d2a7db2c3a":[5,21,2,58], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da0ac9c784851c59d1c334fba730bdc091":[5,21,2,53], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da116239c55759f6c6001ceba755c7b8d2":[5,21,2,14], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da11e574aeb2ec56f282a103d78c49ccbe":[5,21,2,55], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da14bfd78536056ebdc4d2bfed0438b5cf":[5,21,2,57], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da209dc130cd5427683bedca3187726030":[5,21,2,9], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da224d928aad4331ef5d68009e70e538f5":[5,21,2,31], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da29239ecd12dc74a5fea8212ac33384aa":[5,21,2,40], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da2b6c54c9683950102b65b04d72413485":[5,21,2,25], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da3ab2e3d866e55d84dc2c342eb660c0d5":[5,21,2,56], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da3ca0015b97fb5a1b24b1f6fda113488d":[5,21,2,5], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da40ca641c0138d551c28bb9dd184bf948":[5,21,2,6], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da42ac6e1f6f6becfc8e66497f37c55d1a":[5,21,2,13], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da47f29fa3b468816be5c1eb20acba2401":[5,21,2,20], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da48564e7fb10e92bdf93505fc7fa9c67e":[5,21,2,29], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da486fdfd2ff450e9a90ddf8aee01558ce":[5,21,2,36], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da4be08849669f9f086a238335662c6ac1":[5,21,2,54], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da4c6afb8ab3dd8b1d9b1048ad887fa4d4":[5,21,2,37], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da5a04ae8d36afacb8c813cbd1de05d304":[5,21,2,50], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da5ba6a30f56eb6e001abb178bb215469a":[5,21,2,39], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da6c008c1255cce64e50b8645c5aebb0ad":[5,21,2,51], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da6fc9c6a69e49ac3a90c96df724896b0c":[5,21,2,30], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da762b4a79d8190dddad7ebc6aa10dc050":[5,21,2,43], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da76658de4210286b1454d40e812df6ac4":[5,21,2,47], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da76769594d29a6d8659c5c625b4212a24":[5,21,2,44], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da76e8eae17c3a231d2264df8ee85816be":[5,21,2,48], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da77e9143545ea4e513ef6011f7208f546":[5,21,2,22], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da7a0b07e7613ca95cbae02f51e74338ae":[5,21,2,0], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da7cca77c6472c74168c27badb5004168e":[5,21,2,12], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da80950740f9483b5483eef4606fdf7aa0":[5,21,2,32], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da813d3edec232542ea82e71a655b0b4fb":[5,21,2,8], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da83269426ac6b85e729bd940e7c6bc168":[5,21,2,2], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da84653c7b62da4f773676a39a2abe597a":[5,21,2,17], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da867964bdb44cfca767b2fe212243ad68":[5,21,2,45], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da88e6d984d42304f78c3588deb26dda58":[5,21,2,34], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da8a91ce53d99f81616b9b89ccca0d3622":[5,21,2,35], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da9124d482fb323cb9201ffbc3914755b7":[5,21,2,52], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da95076efb390207c31347c9d6eaf7a568":[5,21,2,4], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13da9e23b0bd838b14f99f22d1ae76d63143":[5,21,2,46], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13daaac1baf3720b00f74ac8ce909480aa55":[5,21,2,23], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13daafad49b1a33633d2b55ae1ba9106d4fe":[5,21,2,49], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dab15fc1b1ba8e4f1a35fc314c60b467be":[5,21,2,38], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dab7486d7c92e144b832cac5062cc7332d":[5,21,2,33], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13daba956178be53723eb6036f604c405a38":[5,21,2,42], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dabb2ff7e22a1cf8569371940cf8aa26be":[5,21,2,21], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dabd1859e7fd97d6aad4edf95f92eb1df0":[5,21,2,15], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dac38fd128ae8088af0ab82bb9e1ab2b0e":[5,21,2,1], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dac735c6243e08a73181d0f0f8f6c130bb":[5,21,2,60], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dacdcd02ea5803089ebcd609e227acab8b":[5,21,2,19], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dacf5086c4d10114ed1e2adf80ef0c1d8e":[5,21,2,3], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dad6e9059822d87be57e82960aa79d9229":[5,21,2,16], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dada607a033b2f32aeff128ca0e44f5330":[5,21,2,26], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dadaead8c606fd8cbcbc0f91300767347a":[5,21,2,11], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dadeb15fd0fbfb9f438e22762cad170359":[5,21,2,18], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13dae283471f853e6c225c1e87993684f33e":[5,21,2,24], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13daeb0140f33c859191ef01c944232eece0":[5,21,2,41], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13daef5103aadc41068ca6157543520491b2":[5,21,2,59], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13daf60de542a97e3ce9a3e5b7dbcc2bcda2":[5,21,2,7], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13daf75b73c12fb8bf5f3a11bdeac90a707c":[5,21,2,28], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13daf89abebe911f5ecafec20d30dc2f682f":[5,21,2,10], +"a00095.html#gga45575871cafcadc50292b9bba6b9d13daf8a4a3044fce3b8a4f4e623ae487eaf3":[5,21,2,27], +"a00095.html#gga6db188a71a269613f30825af80c02053a1195026daab11c8e8e8a07ea2588dc59":[5,21,3,25], +"a00095.html#gga6db188a71a269613f30825af80c02053a131299a8724b490b48ff5ea4ae88ec85":[5,21,3,18], +"a00095.html#gga6db188a71a269613f30825af80c02053a144b0c83acca82fa910848f7587af18e":[5,21,3,31], +"a00095.html#gga6db188a71a269613f30825af80c02053a1c37339ea26e38fc22dc2e0f684eca9f":[5,21,3,35], +"a00095.html#gga6db188a71a269613f30825af80c02053a1c8051ee75028cdb756ce666cc9b1bb9":[5,21,3,11], +"a00095.html#gga6db188a71a269613f30825af80c02053a28fab9703b5177948f7409efa9ff848a":[5,21,3,0], +"a00095.html#gga6db188a71a269613f30825af80c02053a2947dc590a82f761d8c0f634a95eb3ef":[5,21,3,7], +"a00095.html#gga6db188a71a269613f30825af80c02053a2c3df2d1d6d1fb817003b824eb699585":[5,21,3,9], +"a00095.html#gga6db188a71a269613f30825af80c02053a2cf1d219093b981b000fefd1b4b88835":[5,21,3,20], +"a00095.html#gga6db188a71a269613f30825af80c02053a2f09e0ca30217841402ba6bf16f8f785":[5,21,3,3], +"a00095.html#gga6db188a71a269613f30825af80c02053a332c28d49858ffceda3b7d9a9a317d0c":[5,21,3,23], +"a00095.html#gga6db188a71a269613f30825af80c02053a3872c11496f6cd2755a2cc33edeee25e":[5,21,3,24], +"a00095.html#gga6db188a71a269613f30825af80c02053a4c1cd58e5ec1701988c4f75b9984ea02":[5,21,3,33], +"a00095.html#gga6db188a71a269613f30825af80c02053a5673e5074470fd8c7773f987a45612ab":[5,21,3,28], +"a00095.html#gga6db188a71a269613f30825af80c02053a609f40f8714286a7fce78c131a97b69f":[5,21,3,39], +"a00095.html#gga6db188a71a269613f30825af80c02053a679e93580df161b665365f658345ed65":[5,21,3,12], +"a00095.html#gga6db188a71a269613f30825af80c02053a6f0a53c70373fdbf41edf57122669a47":[5,21,3,13], +"a00095.html#gga6db188a71a269613f30825af80c02053a74e21d63631f6e3eeae57269cc597ff9":[5,21,3,29], +"a00095.html#gga6db188a71a269613f30825af80c02053a839653f003a5f245984cbbb3e0ded090":[5,21,3,38], +"a00095.html#gga6db188a71a269613f30825af80c02053a8812766f8dc3ffa1fa2f4ad7b3623432":[5,21,3,36], +"a00095.html#gga6db188a71a269613f30825af80c02053a8f49833db881a5cca72e39060510fe33":[5,21,3,19], +"a00095.html#gga6db188a71a269613f30825af80c02053a9b86fc933fab954e947140ea4ca2ffe3":[5,21,3,5], +"a00095.html#gga6db188a71a269613f30825af80c02053aa8268aaae121ff5d8c034197c212be34":[5,21,3,34], +"a00095.html#gga6db188a71a269613f30825af80c02053aab8f0dd610beed22acf2a5a2c3149a38":[5,21,3,16], +"a00095.html#gga6db188a71a269613f30825af80c02053aafaffe0fe7c5ed4eaed04bd7acac4f0b":[5,21,3,26], +"a00095.html#gga6db188a71a269613f30825af80c02053ab3e46c2499e53d6187acef5b9c92faeb":[5,21,3,17], +"a00095.html#gga6db188a71a269613f30825af80c02053abd4f15c4f7b44b457764ab2aa67ac5ac":[5,21,3,1], +"a00095.html#gga6db188a71a269613f30825af80c02053abe002214e7dc409f243527310e689060":[5,21,3,37], +"a00095.html#gga6db188a71a269613f30825af80c02053ac0ebb404f4a50e198c79a35af9721e6c":[5,21,3,6], +"a00095.html#gga6db188a71a269613f30825af80c02053aca55eb81b04844960f74d6b6f735f406":[5,21,3,22], +"a00095.html#gga6db188a71a269613f30825af80c02053acc0420d5b902bffdc029c0a179fd9653":[5,21,3,14], +"a00095.html#gga6db188a71a269613f30825af80c02053ad1b1f498a44a52ed74eab7333c03e177":[5,21,3,4], +"a00095.html#gga6db188a71a269613f30825af80c02053ad27f5123f30e1df03752e0441e384bc0":[5,21,3,27], +"a00095.html#gga6db188a71a269613f30825af80c02053ad8072ce6e9985ae8377377ae49ba57d7":[5,21,3,2], +"a00095.html#gga6db188a71a269613f30825af80c02053adad77032cc009f3690361c9f4d552cdd":[5,21,3,32], +"a00095.html#gga6db188a71a269613f30825af80c02053add9353fb1a660338dc4129f564d43c41":[5,21,3,10], +"a00095.html#gga6db188a71a269613f30825af80c02053ae11d56486ef46dfad9ea855f223483f2":[5,21,3,30], +"a00095.html#gga6db188a71a269613f30825af80c02053af2012960829ef051b69391eee877d167":[5,21,3,8], +"a00095.html#gga6db188a71a269613f30825af80c02053af60644696c7226d16b940a379e974d07":[5,21,3,21], +"a00095.html#gga6db188a71a269613f30825af80c02053af96a078ddf8497b6680dcb8812abccaf":[5,21,3,15], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0360fc48e017a241d3fe34d9ff2614ee":[5,21,1,45], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0c38ea80f06768e2ad6282fbc11d5187":[5,21,1,16], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0efea555d71ff08c985b3c002e49f25a":[5,21,1,13], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1127b8f8732d34f2c80daf825bb14853":[5,21,1,20], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1307d505951b16557a3a311a61952edc":[5,21,1,36], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1eb0795f2598b9acf64e7abcb63f78d5":[5,21,1,18], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a202dd64ec2e20bd15b7742c6d1cc1c6e":[5,21,1,49], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a21dd2c94b4ab7b133e9818a5a394f967":[5,21,1,15], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a2384fb04fb823834f7e4420e2f7e9834":[5,21,1,37], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a3a31a8f0c23e7d75db386e0f1705fcb8":[5,21,1,3], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a42a138600cc12d14279d26ba18532f78":[5,21,1,44], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a473548308d7fac0d5fa4ac959f81e444":[5,21,1,12], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a488a17a4e210b5000df9ecc534d24c8b":[5,21,1,19], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a4e2797855da4686eb7de9e75c5034d66":[5,21,1,6], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a6514b3be861759fdc7f645c4a8190176":[5,21,1,11], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a6873cb2ccda9efd34d7fdd75f3829f1c":[5,21,1,54], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a70c8684952c0ee7fe10facb7b8c3562f":[5,21,1,39], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a70f9bbb4788bbe8974ebefa1c16e4f06":[5,21,1,38], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a73bc985bec01aad92ec6f227dfa33c71":[5,21,1,42], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a74b6edcb7dba9f95182a4faa57dd110d":[5,21,1,17], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a75b66d0e23730af2446bdec683db11d3":[5,21,1,5], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a7a625624c8520faff1f2e6b0a1230ba5":[5,21,1,25], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a7b0ebc4f977a126eb51422b3df962e87":[5,21,1,31], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a89eb85c7d85a8ad52f20bac7eb445c21":[5,21,1,43], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a8a3af6c1f0f5791666b2c8409321ee0b":[5,21,1,7], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a8ec22695a3c8fbc028cc86299ca76b9a":[5,21,1,21], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a9010bbdc4d0ba698a18c200f27586c5a":[5,21,1,1], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a933c38c001bf24a62f0c8bf62e9bbbfb":[5,21,1,4], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a939530a75e2bea978f104a90d4070832":[5,21,1,40], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a95483f9f6afef5e552486e3dcc21b6e7":[5,21,1,47], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a9634c54b13db3584029727384a8ec150":[5,21,1,51], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aa8e8084f5ea75a2e776f4a8f8a8d5e61":[5,21,1,2], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aac489e32c6f52361bfdfa34a2e29e361":[5,21,1,52], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ab0f66b94af6c72515e705077a0aea28b":[5,21,1,8], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35abaebf2f6b5b5cde087eb49ed5f2b1f35":[5,21,1,33], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35abf7ea2c0f06252d5e966ca63f23dba2e":[5,21,1,0], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ac557f3233abd222c5cf7d809e082f94b":[5,21,1,26], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ac61483b0bbae6a06d6789e41aaf450fc":[5,21,1,24], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35acc5bcdfe59c04f2da33835496b3a2ddf":[5,21,1,29], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ace9b73074e1c03234c89b40ecd52a1e6":[5,21,1,9], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ad3faaa86fe964959f39e40214f65ec88":[5,21,1,53], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ad8ae11b993e1cfa619d236025511e0bf":[5,21,1,48], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35adb2af26fbb96cad1a3f4d666e3759e39":[5,21,1,10], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae02e17e293a9bd22a00e7b2c1aa4478b":[5,21,1,41], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae2226bb62df630c243dbf2b25246ae31":[5,21,1,34], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae2a752505db2acdb06e6047c3c447f63":[5,21,1,14], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae3ae151cd2fd03546272907de2f46452":[5,21,1,50], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae6795c51fac27d7426848568f125a6e8":[5,21,1,23], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae94fc13ecb0921b638c70512bf8281d6":[5,21,1,32], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aea9feb0c4582cb00ea087fef692f7623":[5,21,1,27], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aeba0cfeb40308a0bd10bd33298bf9e84":[5,21,1,30], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35af2a8176b461addf3d18b1128800dd7ef":[5,21,1,22], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35af3005bf86c4488117ca1396151d2c2af":[5,21,1,28], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35afc8592f6245641f8c5fdc9b0b7adc7d8":[5,21,1,35], +"a00095.html#ggaca9c780388e187444bfa31a6bcc72d35afcbc2b785e5b99a550f8504afe1f3bc1":[5,21,1,46], +"a00096.html":[5,22], +"a00096.html#ga3d7a27cd4564bc389103aacd4a0a41e4":[5,22,1], +"a00096.html#ga4a63ee69b68459770551a0e4d7b6cdad":[5,22,2], +"a00096.html#gaa42f53e7578284bdc9816da8800e735b":[5,22,3], +"a00096.html#gacec975ef3b52ff6266f4bf055d8bbbc0":[5,22,0], +"a00096.html#gga4a63ee69b68459770551a0e4d7b6cdadafe2a386c6f3e8884b995d08fd87de542":[5,22,2,0], +"a00097.html":[5,8], +"a00098.html":[5,8,0], +"a00100.html":[4], +"index.html":[], +"index.html":[0], +"modules.html":[5], +"pages.html":[] +}; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/nxp_logo_small.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/nxp_logo_small.png new file mode 100644 index 0000000..0ab2a91 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/nxp_logo_small.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/open.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/open.png new file mode 100644 index 0000000..30f75c7 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/open.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/pages.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/pages.html new file mode 100644 index 0000000..8362c24 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/pages.html @@ -0,0 +1,124 @@ + + + + + + +MCUXpresso SDK API Reference Manual: Related Pages + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
MCUXpresso SDK API Reference Manual +  Rev 2.11.0 +
+
NXP Semiconductors
+
+
+ + + + +
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+
Related Pages
+
+
+
Here is a list of all related documentation pages:
+
+
+ + + + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/resize.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/resize.js new file mode 100644 index 0000000..a80dece --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/resize.js @@ -0,0 +1,93 @@ +var cookie_namespace = 'doxygen'; +var sidenav,navtree,content,header; + +function readCookie(cookie) +{ + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) + { + var index = document.cookie.indexOf(myCookie); + if (index != -1) + { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) + { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; +} + +function writeCookie(cookie, val, expiration) +{ + if (val==undefined) return; + if (expiration == null) + { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/"; +} + +function resizeWidth() +{ + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth, null); +} + +function restoreWidth(navWidth) +{ + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+6+"px"}); + sidenav.css({width:navWidth + "px"}); +} + +function resizeHeight() +{ + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + content.css({height:windowHeight + "px"}); + navtree.css({height:windowHeight + "px"}); + sidenav.css({height:windowHeight + "px",top: headerHeight+"px"}); +} + +function initResizable() +{ + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(window).resize(function() { resizeHeight(); }); + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(document).bind('touchmove',function(e){ + try { + var target = e.target; + while (target) { + if ($(target).css('-webkit-overflow-scrolling')=='touch') return; + target = target.parentNode; + } + e.preventDefault(); + } catch(err) { + e.preventDefault(); + } + }); +} + + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_5f.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_5f.html new file mode 100644 index 0000000..42f3ed4 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_5f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_5f.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_5f.js new file mode 100644 index 0000000..ec2ff0f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_5f.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['_5fadc_5finterrupt_5fenable',['_adc_interrupt_enable',['../a00009.html#gac5899c7af1f9cac7695d7171f83be5f0',1,'fsl_adc.h']]], + ['_5fadc_5fstatus_5fflags',['_adc_status_flags',['../a00009.html#ga417e499fb2f1ee7ba05088468b392ce1',1,'fsl_adc.h']]], + ['_5fcapt_5finterrupt_5fenable',['_capt_interrupt_enable',['../a00010.html#ga6ac2e06f77196123f25e3f5c79ae6ea5',1,'fsl_capt.h']]], + ['_5fcapt_5finterrupt_5fstatus_5fflags',['_capt_interrupt_status_flags',['../a00010.html#ga6764adb0a0bda236d301256120cddae0',1,'fsl_capt.h']]], + ['_5fcapt_5fstatus_5fflags',['_capt_status_flags',['../a00010.html#ga86048ff411e845cbde51d9324b5a4b0f',1,'fsl_capt.h']]], + ['_5fcapt_5fxpins',['_capt_xpins',['../a00010.html#ga2c35cfaacd7e34465baab32d16a4abb5',1,'fsl_capt.h']]], + ['_5fflash_5faccess_5ftime',['_flash_access_time',['../a00088.html#ga0efb897bafe816a8a87d92045a78ee9b',1,'fsl_iap.h']]], + ['_5fi2c_5fmaster_5fflags',['_i2c_master_flags',['../a00017.html#gac938392418ba1a891983d11ef5c9f2a3',1,'fsl_i2c.h']]], + ['_5fi2c_5fmaster_5fhandle',['_i2c_master_handle',['../a00017.html#a00101',1,'']]], + ['_5fi2c_5fmaster_5ftransfer',['_i2c_master_transfer',['../a00017.html#a00102',1,'']]], + ['_5fi2c_5fmaster_5ftransfer_5fflags',['_i2c_master_transfer_flags',['../a00017.html#ga87ea07668194cfb46c7c368d2cb42433',1,'fsl_i2c.h']]], + ['_5fi2c_5fslave_5fflags',['_i2c_slave_flags',['../a00018.html#ga419f2fc2e0684671c00ee97e962bbe0c',1,'fsl_i2c.h']]], + ['_5fi2c_5fslave_5fhandle',['_i2c_slave_handle',['../a00018.html#a00103',1,'']]], + ['_5fi2c_5ftransfer_5fstates',['_i2c_transfer_states',['../a00017.html#gab08c1a0d50859637b4305687278941ee',1,'fsl_i2c.h']]], + ['_5fiap_5fcommands',['_iap_commands',['../a00088.html#gaae3267ca6081e1f5620b0aa674c5e8ca',1,'fsl_iap.h']]], + ['_5fpower_5fdeep_5fsleep_5factive',['_power_deep_sleep_active',['../a00085.html#gab5d33167d8a4c9d9a407cc1bdd6346a9',1,'fsl_power.h']]], + ['_5fpower_5fwakeup',['_power_wakeup',['../a00085.html#ga1680834b74ccfaca0cc98b954cfef0ec',1,'fsl_power.h']]], + ['_5fspi_5finterrupt_5fenable',['_spi_interrupt_enable',['../a00022.html#gaedd690a0f91a0a9eb0fd573b57e31f67',1,'fsl_spi.h']]], + ['_5fspi_5fmaster_5fhandle',['_spi_master_handle',['../a00022.html#a00104',1,'']]], + ['_5fspi_5fstatus_5fflags',['_spi_status_flags',['../a00022.html#ga17a846c851b3b17e6a1564a5fab48e09',1,'fsl_spi.h']]], + ['_5fspi_5fxfer_5foption',['_spi_xfer_option',['../a00022.html#gaaa2e2f2efa7be228c775fa239ab5ea03',1,'fsl_spi.h']]], + ['_5fstatus_5fgroups',['_status_groups',['../a00087.html#ga7ff0b98bb1341c07acefb1473b6eda29',1,'fsl_common.h']]], + ['_5fusart_5fflags',['_usart_flags',['../a00023.html#gaa6a81e7e82e236bb1c3c5ba306466610',1,'fsl_usart.h']]], + ['_5fusart_5fhandle',['_usart_handle',['../a00023.html#a00105',1,'']]], + ['_5fusart_5finterrupt_5fenable',['_usart_interrupt_enable',['../a00023.html#ga78b340bf3b25bfae957d0c5532b9b853',1,'fsl_usart.h']]], + ['_5fwwdt_5fstatus_5fflags_5ft',['_wwdt_status_flags_t',['../a00025.html#gaca0e9724bd1f25336527ea66c77e476f',1,'fsl_wwdt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_61.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_61.html new file mode 100644 index 0000000..b8328c6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_61.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_61.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_61.js new file mode 100644 index 0000000..c442d90 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_61.js @@ -0,0 +1,68 @@ +var searchData= +[ + ['acmp_5fclocks',['ACMP_CLOCKS',['../a00011.html#gaa540fadbafefad92f9f7ae3f63b7a45c',1,'fsl_clock.h']]], + ['acomp_5fclearinterruptsstatusflags',['ACOMP_ClearInterruptsStatusFlags',['../a00008.html#ga013efc3edfbbd3f7f5044fc7bc2ce802',1,'fsl_acomp.h']]], + ['acomp_5fconfig_5ft',['acomp_config_t',['../a00008.html#a00106',1,'']]], + ['acomp_5fdeinit',['ACOMP_Deinit',['../a00008.html#ga4e2589a3a011cb833649e301be7fff8c',1,'fsl_acomp.h']]], + ['acomp_5fenableinterrupts',['ACOMP_EnableInterrupts',['../a00008.html#ga33fc82023d54cc469fc62ed866a3ca19',1,'fsl_acomp.h']]], + ['acomp_5fgetdefaultconfig',['ACOMP_GetDefaultConfig',['../a00008.html#gae217e6b6f23e998b1bfa387e1f3f4181',1,'fsl_acomp.h']]], + ['acomp_5fgetinterruptsstatusflags',['ACOMP_GetInterruptsStatusFlags',['../a00008.html#ga331e1a82fe5f3d36ee0b10ddea928cd0',1,'fsl_acomp.h']]], + ['acomp_5fgetoutputstatusflags',['ACOMP_GetOutputStatusFlags',['../a00008.html#ga0ea4f61940e0c270858758d51ae1a4d3',1,'fsl_acomp.h']]], + ['acomp_5fhysteresis_5fselection_5ft',['acomp_hysteresis_selection_t',['../a00008.html#gaa7c0a15052b6421941faad3c6ea3a5ac',1,'fsl_acomp.h']]], + ['acomp_5finit',['ACOMP_Init',['../a00008.html#gae8afb04a61cd16f74eba67061409cd30',1,'fsl_acomp.h']]], + ['acomp_5finterrupt_5fenable_5ft',['acomp_interrupt_enable_t',['../a00008.html#ga178d521ca2ee7f33d518b30dfb627d20',1,'fsl_acomp.h']]], + ['acomp_5fladder_5fconfig_5ft',['acomp_ladder_config_t',['../a00008.html#a00107',1,'']]], + ['acomp_5fladder_5freference_5fvoltage_5ft',['acomp_ladder_reference_voltage_t',['../a00008.html#ga7ad629d52b0a70f95cd2ddb3bee8ab5f',1,'fsl_acomp.h']]], + ['acomp_5fsetinputchannel',['ACOMP_SetInputChannel',['../a00008.html#gaff80c9cfc3eb8114fcdb525b507f7ba3',1,'fsl_acomp.h']]], + ['acomp_5fsetladderconfig',['ACOMP_SetLadderConfig',['../a00008.html#ga6b5b26d4b5e00361635aede71b048ffb',1,'fsl_acomp.h']]], + ['adc_5fclearstatusflags',['ADC_ClearStatusFlags',['../a00009.html#gaa94fca220976d31ee991f1eff9cbe0db',1,'fsl_adc.h']]], + ['adc_5fclock_5fmode_5ft',['adc_clock_mode_t',['../a00009.html#ga4a1dbe9dcaf32c1eaa98849da1217054',1,'fsl_adc.h']]], + ['adc_5fclocks',['ADC_CLOCKS',['../a00011.html#gaef5bfe2c53a7ededa861c4e414cdbf36',1,'fsl_clock.h']]], + ['adc_5fconfig_5ft',['adc_config_t',['../a00009.html#a00108',1,'']]], + ['adc_5fconv_5fseq_5fconfig_5ft',['adc_conv_seq_config_t',['../a00009.html#a00109',1,'']]], + ['adc_5fdeinit',['ADC_Deinit',['../a00009.html#ga9e87d0842217dd30d2d9699df580e237',1,'fsl_adc.h']]], + ['adc_5fdisableinterrupts',['ADC_DisableInterrupts',['../a00009.html#gaa134681cb86361faad65aa8c501be403',1,'fsl_adc.h']]], + ['adc_5fdoselfcalibration',['ADC_DoSelfCalibration',['../a00009.html#ga6c5be196874795f6647b18fd1f3443b4',1,'fsl_adc.h']]], + ['adc_5fdosoftwaretriggerconvseqa',['ADC_DoSoftwareTriggerConvSeqA',['../a00009.html#ga13edd8c6ef6665907b00a6a819187292',1,'fsl_adc.h']]], + ['adc_5fdosoftwaretriggerconvseqb',['ADC_DoSoftwareTriggerConvSeqB',['../a00009.html#ga6bee3a133b58f1badcfded306544d58f',1,'fsl_adc.h']]], + ['adc_5fenableconvseqa',['ADC_EnableConvSeqA',['../a00009.html#ga0576bc613006f8a4d3bb6db93167be65',1,'fsl_adc.h']]], + ['adc_5fenableconvseqaburstmode',['ADC_EnableConvSeqABurstMode',['../a00009.html#ga5ed68a2a2706c5086136426769cb3a2b',1,'fsl_adc.h']]], + ['adc_5fenableconvseqb',['ADC_EnableConvSeqB',['../a00009.html#ga93453ff5ee1ccf1429d5035920cdcd10',1,'fsl_adc.h']]], + ['adc_5fenableconvseqbburstmode',['ADC_EnableConvSeqBBurstMode',['../a00009.html#ga4d72a0696ea69cf01a7d121b8e3d1efd',1,'fsl_adc.h']]], + ['adc_5fenableinterrupts',['ADC_EnableInterrupts',['../a00009.html#gad4368ec191782815efeea62a95ad3744',1,'fsl_adc.h']]], + ['adc_5fenablethresholdcompareinterrupt',['ADC_EnableThresholdCompareInterrupt',['../a00009.html#gaa1deefb49e6221ba772d755bf4aa1a57',1,'fsl_adc.h']]], + ['adc_5fgetchannelconversionresult',['ADC_GetChannelConversionResult',['../a00009.html#gacbd1fa05c3e1095dd2a8a741db533780',1,'fsl_adc.h']]], + ['adc_5fgetconvseqaglobalconversionresult',['ADC_GetConvSeqAGlobalConversionResult',['../a00009.html#ga06879c096d9702b2f378dc2db178e961',1,'fsl_adc.h']]], + ['adc_5fgetconvseqbglobalconversionresult',['ADC_GetConvSeqBGlobalConversionResult',['../a00009.html#gad857bbdf02a2e6e828e45a8573238198',1,'fsl_adc.h']]], + ['adc_5fgetdefaultconfig',['ADC_GetDefaultConfig',['../a00009.html#ga69c1682f87ee05264946329a2532792e',1,'fsl_adc.h']]], + ['adc_5fgetstatusflags',['ADC_GetStatusFlags',['../a00009.html#ga92ee1fdbb8cdadbdc1850e94afed432b',1,'fsl_adc.h']]], + ['adc_5finforesult_5ft',['adc_inforesult_t',['../a00009.html#gaecfd3ba1bc4b014f3c11bc6f348a28cc',1,'fsl_adc.h']]], + ['adc_5finit',['ADC_Init',['../a00009.html#gaa407371ebd58e5aa7f75d38bfdad6169',1,'fsl_adc.h']]], + ['adc_5fpriority_5ft',['adc_priority_t',['../a00009.html#gab625534aa39c1cd25f18cdc0dc3b9981',1,'fsl_adc.h']]], + ['adc_5fresult_5finfo_5ft',['adc_result_info_t',['../a00009.html#a00110',1,'']]], + ['adc_5fsecond_5fcontrol_5ft',['adc_second_control_t',['../a00009.html#gafb17afb34b6114b97b8bfa331465fd23',1,'fsl_adc.h']]], + ['adc_5fseq_5finterrupt_5fmode_5ft',['adc_seq_interrupt_mode_t',['../a00009.html#ga3948c83397f351b5ed70bbaf1c5da35b',1,'fsl_adc.h']]], + ['adc_5fsetchannelwiththresholdpair0',['ADC_SetChannelWithThresholdPair0',['../a00009.html#ga160dc82588afa2bca1388b35b8e3104d',1,'fsl_adc.h']]], + ['adc_5fsetchannelwiththresholdpair1',['ADC_SetChannelWithThresholdPair1',['../a00009.html#ga833046b34deacc484675105225a4b0fb',1,'fsl_adc.h']]], + ['adc_5fsetconvseqaconfig',['ADC_SetConvSeqAConfig',['../a00009.html#ga30e86d22d3680c1cf71d5121f162075b',1,'fsl_adc.h']]], + ['adc_5fsetconvseqahighpriority',['ADC_SetConvSeqAHighPriority',['../a00009.html#gad5ef8575589083a8db3f508aec014e14',1,'fsl_adc.h']]], + ['adc_5fsetconvseqbconfig',['ADC_SetConvSeqBConfig',['../a00009.html#gada2a96cbb4d3348b943ae8576bae8e51',1,'fsl_adc.h']]], + ['adc_5fsetconvseqbhighpriority',['ADC_SetConvSeqBHighPriority',['../a00009.html#ga51d600553349fbb81d96aaed4e1c22e4',1,'fsl_adc.h']]], + ['adc_5fsetthresholdpair0',['ADC_SetThresholdPair0',['../a00009.html#ga473aadea5ea926efb3bc116089a45191',1,'fsl_adc.h']]], + ['adc_5fsetthresholdpair1',['ADC_SetThresholdPair1',['../a00009.html#gac7a9fa5e3222604314a62d3b2f2331f7',1,'fsl_adc.h']]], + ['adc_5ftempsensor_5fcommon_5fmode_5ft',['adc_tempsensor_common_mode_t',['../a00009.html#ga2432b8bc48a2d3ede87fd021faefeaa5',1,'fsl_adc.h']]], + ['adc_5fthreshold_5fcompare_5fstatus_5ft',['adc_threshold_compare_status_t',['../a00009.html#gad47d3fd5553ab75cdf6b95268cb94f20',1,'fsl_adc.h']]], + ['adc_5fthreshold_5fcrossing_5fstatus_5ft',['adc_threshold_crossing_status_t',['../a00009.html#gae86929708f4bb8be4cc88dcf50c3db54',1,'fsl_adc.h']]], + ['adc_5fthreshold_5finterrupt_5fmode_5ft',['adc_threshold_interrupt_mode_t',['../a00009.html#gac6aab6fdd21723cfc6ed4437372521ac',1,'fsl_adc.h']]], + ['adc_5ftrigger_5fpolarity_5ft',['adc_trigger_polarity_t',['../a00009.html#ga538fb95659082602d6ebb205f21573a5',1,'fsl_adc.h']]], + ['adc_5fvdda_5frange_5ft',['adc_vdda_range_t',['../a00009.html#gab751f161dbaf5e986c476ef3b15c7d0c',1,'fsl_adc.h']]], + ['address',['address',['../a00018.html#ad7af2a58faba6a178daa97bd06ebce36',1,'i2c_slave_address_t']]], + ['address0',['address0',['../a00018.html#a4738c7cd55260f7e8a3825d0b2278a34',1,'i2c_slave_config_t']]], + ['address1',['address1',['../a00018.html#ae19c45c96699bb3a6821150ab820b029',1,'i2c_slave_config_t']]], + ['address2',['address2',['../a00018.html#ae855ba5c53f7e585c44eae8bada85e9d',1,'i2c_slave_config_t']]], + ['address3',['address3',['../a00018.html#a213d1737a633686701581a09859213a6',1,'i2c_slave_config_t']]], + ['addressdisable',['addressDisable',['../a00018.html#aca3dcdb3ab2710d991ada52d64bf102c',1,'i2c_slave_address_t']]], + ['architectural_20overview',['Architectural Overview',['../a00004.html',1,'']]], + ['array_5fsize',['ARRAY_SIZE',['../a00087.html#ga6242a25f9d996f0cc4f4cdb911218b75',1,'fsl_common.h']]], + ['adc_3a_2012_2dbit_20sar_20analog_2dto_2ddigital_20converter_20driver',['ADC: 12-bit SAR Analog-to-Digital Converter Driver',['../a00009.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_62.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_62.html new file mode 100644 index 0000000..281723e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_62.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_62.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_62.js new file mode 100644 index 0000000..b48388f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_62.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['base',['base',['../a00015.html#a84d667acc1301d6d56ae52573e4b6b87',1,'dma_handle_t']]], + ['baudrate_5fbps',['baudRate_Bps',['../a00017.html#a2186844dc87bcde999fc12005f4c550a',1,'i2c_master_config_t::baudRate_Bps()'],['../a00022.html#ae7695987e044d80983fd98a43812b1ea',1,'spi_master_config_t::baudRate_Bps()'],['../a00023.html#a5d2631bc772901b4114b01770f9bb337',1,'usart_config_t::baudRate_Bps()']]], + ['bitcountperchar',['bitCountPerChar',['../a00023.html#ab964b3fbce4b824beff770a138fd4b6e',1,'usart_config_t']]], + ['buf',['buf',['../a00017.html#a9577474c0c4395355174df2b016108de',1,'_i2c_master_handle']]], + ['burst',['burst',['../a00015.html#a66ad3f0d6159adbb560799bfb93da76a',1,'dma_channel_trigger_t']]], + ['busspeed',['busSpeed',['../a00018.html#a14acc40a290c779fde0825f3a8bdbb25',1,'i2c_slave_config_t']]], + ['bytewidth',['byteWidth',['../a00015.html#a93c1b2f32e5e046cf10ba7e8b1c215ce',1,'dma_xfercfg_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_63.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_63.html new file mode 100644 index 0000000..a8fe36d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_63.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_63.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_63.js new file mode 100644 index 0000000..ec4d7ad --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_63.js @@ -0,0 +1,137 @@ +var searchData= +[ + ['callback',['callback',['../a00015.html#a47a5c6af4c934cc9db355d394bb94f46',1,'dma_handle_t::callback()'],['../a00018.html#a7229e894f762ead4bd08b4add49e6bc2',1,'_i2c_slave_handle::callback()'],['../a00022.html#a445e70d437c917e6af1b4037bdbb6a3f',1,'_spi_master_handle::callback()'],['../a00023.html#a50fd5afc23c86d872ee2a1d46bd4145e',1,'_usart_handle::callback()']]], + ['capt_3a_20capacitive_20touch',['CAPT: Capacitive Touch',['../a00010.html',1,'']]], + ['capt_5fclearinterruptstatusflags',['CAPT_ClearInterruptStatusFlags',['../a00010.html#gaf59ec5edc272fd42a2b66231a16958eb',1,'fsl_capt.h']]], + ['capt_5fclocks',['CAPT_CLOCKS',['../a00011.html#gad73456f246d91b7e9dcbe6c6fc180a2f',1,'fsl_clock.h']]], + ['capt_5fconfig_5ft',['capt_config_t',['../a00010.html#a00111',1,'']]], + ['capt_5fdeinit',['CAPT_Deinit',['../a00010.html#gaea982bc73916fdb713906a2ee49ca604',1,'fsl_capt.h']]], + ['capt_5fdisabledma',['CAPT_DisableDMA',['../a00010.html#ga70d4d9487f981082447042261d13385a',1,'fsl_capt.h']]], + ['capt_5fdisableinterrupts',['CAPT_DisableInterrupts',['../a00010.html#ga382fc66ff401d2ba9bdee87e3c8c09ce',1,'fsl_capt.h']]], + ['capt_5fdma_5fmode_5ft',['capt_dma_mode_t',['../a00010.html#ga0be2df04c72a8847673bcb6d9714866a',1,'fsl_capt.h']]], + ['capt_5fenabledma',['CAPT_EnableDMA',['../a00010.html#ga4d8e5e396dee23cff57192632e98a84a',1,'fsl_capt.h']]], + ['capt_5fenableinterrupts',['CAPT_EnableInterrupts',['../a00010.html#ga14542b3f1b582974fb19b0bf359cfa17',1,'fsl_capt.h']]], + ['capt_5fgetdefaultconfig',['CAPT_GetDefaultConfig',['../a00010.html#gabbf90a4a70ccba5078feb488011079c5',1,'fsl_capt.h']]], + ['capt_5fgetinterruptstatusflags',['CAPT_GetInterruptStatusFlags',['../a00010.html#ga5c6166cad554e91dc0ed36d34b73ee47',1,'fsl_capt.h']]], + ['capt_5fgetstatusflags',['CAPT_GetStatusFlags',['../a00010.html#ga6f6b09a873e82dd2fd25338458d0ec0d',1,'fsl_capt.h']]], + ['capt_5fgettouchdata',['CAPT_GetTouchData',['../a00010.html#gaebd796b5bf0c9dff7df7921099d2febb',1,'fsl_capt.h']]], + ['capt_5finactive_5fxpins_5fmode_5ft',['capt_inactive_xpins_mode_t',['../a00010.html#ga01d767059334ad74d416f6c0287f101b',1,'fsl_capt.h']]], + ['capt_5finit',['CAPT_Init',['../a00010.html#gafc552b775b278e7e6ea930bb42ca8506',1,'fsl_capt.h']]], + ['capt_5fmeasurement_5fdelay_5ft',['capt_measurement_delay_t',['../a00010.html#ga5ced51d15f9db8f1e6619a5859f6215d',1,'fsl_capt.h']]], + ['capt_5fpolling_5fmode_5ft',['capt_polling_mode_t',['../a00010.html#ga43dfe06b3cce27e03b4b131557a5237b',1,'fsl_capt.h']]], + ['capt_5fpollnow',['CAPT_PollNow',['../a00010.html#gae001e6c47608b339f65c8d2dab02c994',1,'fsl_capt.h']]], + ['capt_5freset_5fdelay_5ft',['capt_reset_delay_t',['../a00010.html#ga4394d9b57a062c83c444e391c4adf855',1,'fsl_capt.h']]], + ['capt_5fsetpollmode',['CAPT_SetPollMode',['../a00010.html#gaa5b1edec56bda3e46d42405ca8748b89',1,'fsl_capt.h']]], + ['capt_5fsetthreshold',['CAPT_SetThreshold',['../a00010.html#gae9b35ae6b1978ce06851ce86a32af06e',1,'fsl_capt.h']]], + ['capt_5ftouch_5fdata_5ft',['capt_touch_data_t',['../a00010.html#a00112',1,'']]], + ['capt_5ftrigger_5fmode_5ft',['capt_trigger_mode_t',['../a00010.html#ga0c1eb1e31ad34c8654c981a5e643e2c9',1,'fsl_capt.h']]], + ['channel',['channel',['../a00015.html#a7c068d330cc60423ee3fd86821221b85',1,'dma_handle_t']]], + ['channelmask',['channelMask',['../a00009.html#ab63c0a8803f4d02e040d55efd8d58e88',1,'adc_conv_seq_config_t']]], + ['channelnumber',['channelNumber',['../a00009.html#a6829bb748bc55409fed8615f6a40bb84',1,'adc_result_info_t']]], + ['clk_5fgate_5fdefine',['CLK_GATE_DEFINE',['../a00011.html#gaea083b34e0ae608a94fce91da973a544',1,'fsl_clock.h']]], + ['clock_20driver',['Clock Driver',['../a00011.html',1,'']]], + ['clock_5fdeinitsysosc',['CLOCK_DeinitSysOsc',['../a00011.html#ga957f6f224315c19d89781bd344c42cb3',1,'fsl_clock.h']]], + ['clock_5fdeinitwdtosc',['CLOCK_DeinitWdtOsc',['../a00011.html#gadc80b6c53f806d771a3f6fd65c68a08d',1,'fsl_clock.h']]], + ['clock_5fdenitsystempll',['CLOCK_DenitSystemPll',['../a00011.html#gaf65f5b1578bde1ffc2a10ebf2ca66d1d',1,'fsl_clock.h']]], + ['clock_5fdivider_5ft',['clock_divider_t',['../a00011.html#gac344a8334a482bcbcbdf0c4828db872c',1,'fsl_clock.h']]], + ['clock_5ffaim_5fbase',['CLOCK_FAIM_BASE',['../a00011.html#ga0da8ff794475b44b15cda07999bc8678',1,'fsl_clock.h']]], + ['clock_5ffro_5fosc_5ffreq_5ft',['clock_fro_osc_freq_t',['../a00011.html#ga85bf7440c0d77269e3db764083110334',1,'fsl_clock.h']]], + ['clock_5ffro_5fsetting_5fapi_5from_5faddress',['CLOCK_FRO_SETTING_API_ROM_ADDRESS',['../a00011.html#gaf4232ca3ff8c9ea3d8b3cbe4bac6d87a',1,'fsl_clock.h']]], + ['clock_5ffro_5fsrc_5ft',['clock_fro_src_t',['../a00011.html#ga9ff656514a680eef6ffbf40f4eef0bfb',1,'fsl_clock.h']]], + ['clock_5fgetclockoutclkfreq',['CLOCK_GetClockOutClkFreq',['../a00011.html#gaf85cf02f515cd756873bf2a74ee143e2',1,'fsl_clock.h']]], + ['clock_5fgetcoresysclkfreq',['CLOCK_GetCoreSysClkFreq',['../a00011.html#gaca0f0dcb61434d727340ddde5f131d91',1,'fsl_clock.h']]], + ['clock_5fgetextclkfreq',['CLOCK_GetExtClkFreq',['../a00011.html#ga2d33480c8967a6bac98512e0c47c6b07',1,'fsl_clock.h']]], + ['clock_5fgetfreq',['CLOCK_GetFreq',['../a00011.html#ga53acae220d651789bb505c53c73ecf2b',1,'fsl_clock.h']]], + ['clock_5fgetfrg0clkfreq',['CLOCK_GetFRG0ClkFreq',['../a00011.html#ga7dd0bd48c4a5a68fef7f9524d8999b4b',1,'fsl_clock.h']]], + ['clock_5fgetfrg1clkfreq',['CLOCK_GetFRG1ClkFreq',['../a00011.html#gacb72cd4fce384788f3eb8ccc05e0ce7f',1,'fsl_clock.h']]], + ['clock_5fgetfrofreq',['CLOCK_GetFroFreq',['../a00011.html#gafe0b410109a29c465df0b4dcbb338ff3',1,'fsl_clock.h']]], + ['clock_5fgetmainclkfreq',['CLOCK_GetMainClkFreq',['../a00011.html#gaaa964f2c87ddd18a09c5201e22925fe6',1,'fsl_clock.h']]], + ['clock_5fgetsystempllfreq',['CLOCK_GetSystemPLLFreq',['../a00011.html#gae60a901716b1b7a581b9a1e4034479cd',1,'fsl_clock.h']]], + ['clock_5fgetsystempllinclockrate',['CLOCK_GetSystemPLLInClockRate',['../a00011.html#ga14b6a46da6b30e56001d7526a8546b42',1,'fsl_clock.h']]], + ['clock_5fgetuart0clkfreq',['CLOCK_GetUart0ClkFreq',['../a00011.html#ga47b7ce0a4c83a359f4bc1f2714a13761',1,'fsl_clock.h']]], + ['clock_5fgetuart1clkfreq',['CLOCK_GetUart1ClkFreq',['../a00011.html#ga10c8c8ccc077404a00e1121b5d18e4a8',1,'fsl_clock.h']]], + ['clock_5fgetuart2clkfreq',['CLOCK_GetUart2ClkFreq',['../a00011.html#ga07ba7d7b5ee69b71268190fe133c0a25',1,'fsl_clock.h']]], + ['clock_5fgetuart3clkfreq',['CLOCK_GetUart3ClkFreq',['../a00011.html#gabbdbb2bc96f1206cfe79fcf8896ae116',1,'fsl_clock.h']]], + ['clock_5fgetuart4clkfreq',['CLOCK_GetUart4ClkFreq',['../a00011.html#ga314692030453038d60194d3e6245345e',1,'fsl_clock.h']]], + ['clock_5fgetwdtoscfreq',['CLOCK_GetWdtOscFreq',['../a00011.html#ga054c63c43d8fc35586abf9aa6e8351a5',1,'fsl_clock.h']]], + ['clock_5finitextclkin',['CLOCK_InitExtClkin',['../a00011.html#ga6506e7cdad8dcf18347cdcb1acd8c17d',1,'fsl_clock.h']]], + ['clock_5finitsysosc',['CLOCK_InitSysOsc',['../a00011.html#ga2086545220b602cb4c0f1a141893447e',1,'fsl_clock.h']]], + ['clock_5finitsystempll',['CLOCK_InitSystemPll',['../a00011.html#ga5863562919d2a5cb6c8e8dcaf46cc236',1,'fsl_clock.h']]], + ['clock_5finitwdtosc',['CLOCK_InitWdtOsc',['../a00011.html#ga5786421429cdc95b34fdeb04d8ec9241',1,'fsl_clock.h']]], + ['clock_5finitxtalin',['CLOCK_InitXtalin',['../a00011.html#ga591437e580785afce2e3c74e021393f2',1,'fsl_clock.h']]], + ['clock_5fip_5fname_5ft',['clock_ip_name_t',['../a00011.html#ga23c8b3ae62f7865b2e228408be95946d',1,'fsl_clock.h']]], + ['clock_5fmain_5fclk_5fsrc_5ft',['clock_main_clk_src_t',['../a00011.html#gab68022e8d8f60a72f86a6a6c13b6e2f4',1,'fsl_clock.h']]], + ['clock_5fname_5ft',['clock_name_t',['../a00011.html#gaf74854e9bcee544d7646c5bafdc00bd3',1,'fsl_clock.h']]], + ['clock_5fselect_5ft',['clock_select_t',['../a00011.html#ga59a363f0296ea51011dd86b405d5db58',1,'fsl_clock.h']]], + ['clock_5fsetfrg0clkfreq',['CLOCK_SetFRG0ClkFreq',['../a00011.html#ga4eb9737ada73b9a575250de526433dff',1,'fsl_clock.h']]], + ['clock_5fsetfrg1clkfreq',['CLOCK_SetFRG1ClkFreq',['../a00011.html#ga4216bb5c85c6f6df1d128c9bfe5cd955',1,'fsl_clock.h']]], + ['clock_5fsetfrooscfreq',['CLOCK_SetFroOscFreq',['../a00011.html#gab61f56487f2c5e6d2ae2033848613d5e',1,'fsl_clock.h']]], + ['clock_5fsetfrooutclksrc',['CLOCK_SetFroOutClkSrc',['../a00011.html#ga468095bb082b9a2a50a2e05e1ced88c0',1,'fsl_clock.h']]], + ['clock_5fsetmainclksrc',['CLOCK_SetMainClkSrc',['../a00011.html#gaa6be3b84fd2a57ec1165954d6c4564e8',1,'fsl_clock.h']]], + ['clock_5fsys_5fpll_5fsrc',['clock_sys_pll_src',['../a00011.html#ga04c66d991cdc5cb35e31c27881bc549b',1,'fsl_clock.h']]], + ['clock_5fsys_5fpll_5ft',['clock_sys_pll_t',['../a00011.html#a00113',1,'']]], + ['clock_5fwdt_5fanalog_5ffreq_5ft',['clock_wdt_analog_freq_t',['../a00011.html#ga564beca73d288c0d6fd237f541e279e6',1,'fsl_clock.h']]], + ['clockdivider',['clockDivider',['../a00010.html#a9a8da1759cc4ea2b284400908075c871',1,'capt_config_t']]], + ['clockdividernumber',['clockDividerNumber',['../a00009.html#abb59c0a54988e01653f80c8a59d18b1a',1,'adc_config_t']]], + ['clockfreq_5fhz',['clockFreq_Hz',['../a00025.html#a15e2f3ecd343280edfd8fbaa0bf8c9f4',1,'wwdt_config_t']]], + ['clockmode',['clockMode',['../a00009.html#ae91bf3a0e56181065cda63613b2cb45f',1,'adc_config_t::clockMode()'],['../a00021.html#aaba4aecfe1173c11bb8d77a8f9913196',1,'sctimer_config_t::clockMode()']]], + ['clockphase',['clockPhase',['../a00022.html#a7fbed6c387c99764c4f405fc7d9761ee',1,'spi_master_config_t::clockPhase()'],['../a00022.html#a56c657f64c2e26fe7dd772c1a77efb9e',1,'spi_slave_config_t::clockPhase()']]], + ['clockpolarity',['clockPolarity',['../a00022.html#a780c1f03e9670a2c38068a7bd49d4f13',1,'spi_master_config_t::clockPolarity()'],['../a00022.html#afd5bb71a7dc1908cb8a1860564601a45',1,'spi_slave_config_t::clockPolarity()'],['../a00023.html#ac808e4908f1d6f9ca78fec3d0b8f118a',1,'usart_config_t::clockPolarity()']]], + ['clockselect',['clockSelect',['../a00021.html#ad5d7a18f1b860f5fa7d0800d8e464127',1,'sctimer_config_t']]], + ['clocksource',['clockSource',['../a00024.html#ae5078ce05e0689966c2c5c49f9aaf89a',1,'wkt_config_t']]], + ['clrtrig',['clrtrig',['../a00015.html#ab30c2a4b2d436b966ba948edb010688f',1,'dma_xfercfg_t']]], + ['complementin',['complementIn',['../a00012.html#a9982af011e3e1fc9756dcee96281ebda',1,'crc_config_t']]], + ['complementout',['complementOut',['../a00012.html#a673b6508efa086da7b7bd537a876241e',1,'crc_config_t']]], + ['completioncallback',['completionCallback',['../a00017.html#a15b84b8a94c2b2e5ace0a695c79edd84',1,'_i2c_master_handle']]], + ['completionstatus',['completionStatus',['../a00018.html#a35adbf64ca65dd2c1b52f9260f5b9e90',1,'i2c_slave_transfer_t']]], + ['configflags',['configFlags',['../a00022.html#a582eea734badd0049c98ea3cf89b3e4b',1,'spi_transfer_t']]], + ['count',['count',['../a00010.html#a2b0d01a9feb8b378e76f4d3240e9ebe8',1,'capt_touch_data_t']]], + ['crc_3a_20cyclic_20redundancy_20check_20driver',['CRC: Cyclic Redundancy Check Driver',['../a00012.html',1,'']]], + ['crc_5fclocks',['CRC_CLOCKS',['../a00011.html#ga661e3aff590ce2f086ba06745317480b',1,'fsl_clock.h']]], + ['crc_5fconfig_5ft',['crc_config_t',['../a00012.html#a00114',1,'']]], + ['crc_5fdeinit',['CRC_Deinit',['../a00012.html#ga7a4d725b011a98efb29a26bcca04c35b',1,'fsl_crc.h']]], + ['crc_5fdriver_5fuse_5fcrc16_5fccitt_5ffalse_5fas_5fdefault',['CRC_DRIVER_USE_CRC16_CCITT_FALSE_AS_DEFAULT',['../a00012.html#ga37d19c87e3adeb47db8f6967df0496e1',1,'fsl_crc.h']]], + ['crc_5fget16bitresult',['CRC_Get16bitResult',['../a00012.html#ga5ce766fd31166d3b0d2d7ba594dac0ce',1,'fsl_crc.h']]], + ['crc_5fget32bitresult',['CRC_Get32bitResult',['../a00012.html#ga0c8ce306124e645b27798fad68f3ac4f',1,'fsl_crc.h']]], + ['crc_5fgetconfig',['CRC_GetConfig',['../a00012.html#gac745b626d9c7bd9f3da7986374483389',1,'fsl_crc.h']]], + ['crc_5fgetdefaultconfig',['CRC_GetDefaultConfig',['../a00012.html#gab681cd7c82fbafd927d6b22f23a81804',1,'fsl_crc.h']]], + ['crc_5finit',['CRC_Init',['../a00012.html#ga7114311534a33b6688f35ceaaa3f7832',1,'fsl_crc.h']]], + ['crc_5fpolynomial_5ft',['crc_polynomial_t',['../a00012.html#ga7daa8fa0df9f42a98afcf766a63d931d',1,'fsl_crc.h']]], + ['crc_5freset',['CRC_Reset',['../a00012.html#ga3c2e6ecc571510470849dc078685d71f',1,'fsl_crc.h']]], + ['crc_5fwritedata',['CRC_WriteData',['../a00012.html#ga33f99b0cb581e677dbc009a695adf5d5',1,'fsl_crc.h']]], + ['crc_5fwriteseed',['CRC_WriteSeed',['../a00012.html#ga43edd3bec710cb1ca121bfcadbc9b6f7',1,'fsl_crc.h']]], + ['ctimer_3a_20standard_20counter_2ftimers',['CTIMER: Standard counter/timers',['../a00013.html',1,'']]], + ['ctimer_5fcallback_5ftype_5ft',['ctimer_callback_type_t',['../a00013.html#ga740677adee6ada817bb45ed62607c3c4',1,'fsl_ctimer.h']]], + ['ctimer_5fcapture_5fchannel_5ft',['ctimer_capture_channel_t',['../a00013.html#ga2fbf5cfa219c31ac16f3786d6897dc3f',1,'fsl_ctimer.h']]], + ['ctimer_5fcapture_5fedge_5ft',['ctimer_capture_edge_t',['../a00013.html#gac37706bc06bc7590ce1e3d1b4bf73638',1,'fsl_ctimer.h']]], + ['ctimer_5fclearstatusflags',['CTIMER_ClearStatusFlags',['../a00013.html#ga43b7410d9c6aab6aad466bd481b9222b',1,'fsl_ctimer.h']]], + ['ctimer_5fclocks',['CTIMER_CLOCKS',['../a00011.html#gabdb5fc301b32e8998fb9b52e86c5cc1a',1,'fsl_clock.h']]], + ['ctimer_5fconfig_5ft',['ctimer_config_t',['../a00013.html#a00115',1,'']]], + ['ctimer_5fdeinit',['CTIMER_Deinit',['../a00013.html#ga97daa711029883d46933204381f44c9f',1,'fsl_ctimer.h']]], + ['ctimer_5fdisableinterrupts',['CTIMER_DisableInterrupts',['../a00013.html#gaf1b8088779288346a7508dc7ef6e99d1',1,'fsl_ctimer.h']]], + ['ctimer_5fenableinterrupts',['CTIMER_EnableInterrupts',['../a00013.html#ga24464606cafc0f316116b164966a906e',1,'fsl_ctimer.h']]], + ['ctimer_5fexternal_5fmatch_5ft',['ctimer_external_match_t',['../a00013.html#ga09f5eb858c001377062fe0b8a0d5bd29',1,'fsl_ctimer.h']]], + ['ctimer_5fgetdefaultconfig',['CTIMER_GetDefaultConfig',['../a00013.html#gac44f44c3f88125a41081ca2a7cf06223',1,'fsl_ctimer.h']]], + ['ctimer_5fgetenabledinterrupts',['CTIMER_GetEnabledInterrupts',['../a00013.html#ga635d2570c0274ff40f10ac7b5f3317df',1,'fsl_ctimer.h']]], + ['ctimer_5fgetoutputmatchstatus',['CTIMER_GetOutputMatchStatus',['../a00013.html#gae4d610de22fd8b8c9577e774dac88ac5',1,'fsl_ctimer.h']]], + ['ctimer_5fgetstatusflags',['CTIMER_GetStatusFlags',['../a00013.html#gad65b4a95cbfca13083f6d93e7a46f1cb',1,'fsl_ctimer.h']]], + ['ctimer_5fgettimercountvalue',['CTIMER_GetTimerCountValue',['../a00013.html#ga0b2f1b62dee7adf60574c3410e7bd26f',1,'fsl_ctimer.h']]], + ['ctimer_5finit',['CTIMER_Init',['../a00013.html#gacae8e1dbb60368ab01a9564de7eda037',1,'fsl_ctimer.h']]], + ['ctimer_5finterrupt_5fenable_5ft',['ctimer_interrupt_enable_t',['../a00013.html#ga0971c614f932bcf55994bf6c92325eb2',1,'fsl_ctimer.h']]], + ['ctimer_5fmatch_5fconfig_5ft',['ctimer_match_config_t',['../a00013.html#a00116',1,'']]], + ['ctimer_5fmatch_5foutput_5fcontrol_5ft',['ctimer_match_output_control_t',['../a00013.html#ga22cef1fc5f8e23a35b6c3a012e3d143c',1,'fsl_ctimer.h']]], + ['ctimer_5fmatch_5ft',['ctimer_match_t',['../a00013.html#gae60f7d34c9e499abba96e5979ee1818d',1,'fsl_ctimer.h']]], + ['ctimer_5fregistercallback',['CTIMER_RegisterCallBack',['../a00013.html#gaa7de0b40e3127d3d8901398df50feb20',1,'fsl_ctimer.h']]], + ['ctimer_5freset',['CTIMER_Reset',['../a00013.html#ga7ea373165af081e0e1700f7a3ba56642',1,'fsl_ctimer.h']]], + ['ctimer_5fsetupcapture',['CTIMER_SetupCapture',['../a00013.html#gae279db71f27ceb5a6d15ad8d17cbd670',1,'fsl_ctimer.h']]], + ['ctimer_5fsetupmatch',['CTIMER_SetupMatch',['../a00013.html#ga64b1d0ba86d952b5ec30e201880c7bb5',1,'fsl_ctimer.h']]], + ['ctimer_5fsetuppwm',['CTIMER_SetupPwm',['../a00013.html#ga2a70f03b835a36e5b321861d0b0ebb41',1,'fsl_ctimer.h']]], + ['ctimer_5fsetuppwmperiod',['CTIMER_SetupPwmPeriod',['../a00013.html#gacb1f53d8b6a2b157194983172c448707',1,'fsl_ctimer.h']]], + ['ctimer_5fstarttimer',['CTIMER_StartTimer',['../a00013.html#gae9a75a0e18a696baa795ae67aa30a120',1,'fsl_ctimer.h']]], + ['ctimer_5fstatus_5fflags_5ft',['ctimer_status_flags_t',['../a00013.html#gae64285eb2e52bf5cc2b723870392ff60',1,'fsl_ctimer.h']]], + ['ctimer_5fstoptimer',['CTIMER_StopTimer',['../a00013.html#ga3c7e8e1eb12e5f48ecca04c8128a9545',1,'fsl_ctimer.h']]], + ['ctimer_5ftimer_5fmode_5ft',['ctimer_timer_mode_t',['../a00013.html#ga9cc18e14c871b2a79888a4cdacbb0eee',1,'fsl_ctimer.h']]], + ['ctimer_5fupdatepwmdutycycle',['CTIMER_UpdatePwmDutycycle',['../a00013.html#ga5d04834d4b29c8505b0a89b8875c2e78',1,'fsl_ctimer.h']]], + ['ctimer_5fupdatepwmpulseperiod',['CTIMER_UpdatePwmPulsePeriod',['../a00013.html#gad9f4a6073c669662f300d395d66e16bb',1,'fsl_ctimer.h']]], + ['common_20driver',['Common Driver',['../a00087.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_64.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_64.html new file mode 100644 index 0000000..b415c0e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_64.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_64.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_64.js new file mode 100644 index 0000000..e7e26f8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_64.js @@ -0,0 +1,99 @@ +var searchData= +[ + ['dac_5fclocks',['DAC_CLOCKS',['../a00011.html#gab3c8a974e25f615fe023579c847fae6c',1,'fsl_clock.h']]], + ['dac_5fconfig_5ft',['dac_config_t',['../a00014.html#a00117',1,'']]], + ['dac_5fdeinit',['DAC_Deinit',['../a00014.html#gab9cec79763041b1df321a5839982feba',1,'fsl_dac.h']]], + ['dac_5fenablecounter',['DAC_EnableCounter',['../a00014.html#gabee47ca15a3a779e490f073aa1c43563',1,'fsl_dac.h']]], + ['dac_5fenabledma',['DAC_EnableDMA',['../a00014.html#ga24947c73973264f0d24d77394c3518e5',1,'fsl_dac.h']]], + ['dac_5fenabledoublebuffering',['DAC_EnableDoubleBuffering',['../a00014.html#ga5ecbd1908f7743934ccdb090ca0cb1d8',1,'fsl_dac.h']]], + ['dac_5fgetdefaultconfig',['DAC_GetDefaultConfig',['../a00014.html#ga18bbc1eedecdc090c14578740271db0e',1,'fsl_dac.h']]], + ['dac_5fgetdmainterruptrequestflag',['DAC_GetDMAInterruptRequestFlag',['../a00014.html#ga0a654edfcbb8a6fc80c51a3222fc4d7b',1,'fsl_dac.h']]], + ['dac_5finit',['DAC_Init',['../a00014.html#ga0331d8c8f699fac12c93a7796d961923',1,'fsl_dac.h']]], + ['dac_5fsetbuffervalue',['DAC_SetBufferValue',['../a00014.html#gabaeabddab20ad3c45aed786a7d12d350',1,'fsl_dac.h']]], + ['dac_5fsetcountervalue',['DAC_SetCounterValue',['../a00014.html#gabd7c9e5a5c0b6b35ed2854581f1c6fe8',1,'fsl_dac.h']]], + ['dac_5fsettling_5ftime_5ft',['dac_settling_time_t',['../a00014.html#ga82eecb700b3afeda8b95a6151d8904fc',1,'fsl_dac.h']]], + ['data',['data',['../a00017.html#a8c7f63bd1e7de04e40f5cd733f5c7388',1,'_i2c_master_transfer::data()'],['../a00023.html#acad21ced979ce0c2af98f0b1837863c9',1,'usart_transfer_t::data()']]], + ['datasize',['dataSize',['../a00017.html#a68e2dd69e1e34b1b505270e1e07e8a34',1,'_i2c_master_transfer::dataSize()'],['../a00022.html#ae003337c9398e5f5e3189f5b2ba6335b',1,'spi_transfer_t::dataSize()'],['../a00023.html#a605c0a56df2815ffb3461aaaf116752a',1,'usart_transfer_t::dataSize()']]], + ['datawidth',['dataWidth',['../a00022.html#a018402d4d181b482376a878b38db740f',1,'spi_master_config_t::dataWidth()'],['../a00022.html#adc19252b2493f3f9d12f029e57908ce5',1,'spi_slave_config_t::dataWidth()'],['../a00022.html#a11b51e4d88d3f8d9137a13ce301ed46c',1,'_spi_master_handle::dataWidth()']]], + ['debug_5fconsole_5fdevice_5ftype_5fflexcomm',['DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM',['../a00087.html#gad4f7f7e51a84c34f06bbbb34973ae97a',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5fiuart',['DEBUG_CONSOLE_DEVICE_TYPE_IUART',['../a00087.html#ga75a9e86134df04f6a8b66025d11e25c2',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5flpsci',['DEBUG_CONSOLE_DEVICE_TYPE_LPSCI',['../a00087.html#ga6b4add5f2d938a89da56f58ac0b4e89b',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5flpuart',['DEBUG_CONSOLE_DEVICE_TYPE_LPUART',['../a00087.html#ga1a04b7330b5196f73ed4ffe7fa2bae6c',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5fmini_5fusart',['DEBUG_CONSOLE_DEVICE_TYPE_MINI_USART',['../a00087.html#ga5a951951cdb6063d949523052aa5b5e4',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5fnone',['DEBUG_CONSOLE_DEVICE_TYPE_NONE',['../a00087.html#gaa7fc9e15d36453236a580b3c8116ee85',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5fqsci',['DEBUG_CONSOLE_DEVICE_TYPE_QSCI',['../a00087.html#ga74389c7c04a9f53548d05287c7c665cd',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5fswo',['DEBUG_CONSOLE_DEVICE_TYPE_SWO',['../a00087.html#ga9d142691c3a4d810f8bdabc41e89dfd7',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5fuart',['DEBUG_CONSOLE_DEVICE_TYPE_UART',['../a00087.html#ga59764d32e5394455906edbf03cff0b9f',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5fusbcdc',['DEBUG_CONSOLE_DEVICE_TYPE_USBCDC',['../a00087.html#ga262e149f9ce1ef4cf2e539e9494d3cca',1,'fsl_common.h']]], + ['debug_5fconsole_5fdevice_5ftype_5fvusart',['DEBUG_CONSOLE_DEVICE_TYPE_VUSART',['../a00087.html#ga2c85202f838f94e51a0bb7b33856c78d',1,'fsl_common.h']]], + ['debug_20console',['Debug Console',['../a00097.html',1,'']]], + ['delayconfig',['delayConfig',['../a00022.html#a787477e7b0ae7833dcbdb1c85fef361c',1,'spi_master_config_t']]], + ['deprecated_20list',['Deprecated List',['../a00100.html',1,'']]], + ['direction',['direction',['../a00017.html#ac5b89dc9115b7760431c981e0c1fd443',1,'_i2c_master_transfer::direction()'],['../a00022.html#aace9261acfad8526f3d5b0b59346629a',1,'spi_master_config_t::direction()'],['../a00022.html#ad4eb458a0c1a0c0934eec53d71b78ffb',1,'spi_slave_config_t::direction()']]], + ['dma_3a_20direct_20memory_20access_20controller_20driver',['DMA: Direct Memory Access Controller Driver',['../a00015.html',1,'']]], + ['dma_5faborttransfer',['DMA_AbortTransfer',['../a00015.html#ga3c61d6121d88d2cdf287fc1cd72912fd',1,'fsl_dma.h']]], + ['dma_5fallocate_5fdata_5ftransfer_5fbuffer',['DMA_ALLOCATE_DATA_TRANSFER_BUFFER',['../a00015.html#ga79665a4079015c9420f1dd82e15f4b30',1,'fsl_dma.h']]], + ['dma_5fallocate_5fhead_5fdescriptors',['DMA_ALLOCATE_HEAD_DESCRIPTORS',['../a00015.html#gac52594676141a30266441619dca00d40',1,'fsl_dma.h']]], + ['dma_5fallocate_5fhead_5fdescriptors_5fat_5fnoncacheable',['DMA_ALLOCATE_HEAD_DESCRIPTORS_AT_NONCACHEABLE',['../a00015.html#ga9f9ae6642bb5eeed8ccc1dffa7ec14e1',1,'fsl_dma.h']]], + ['dma_5fallocate_5flink_5fdescriptors',['DMA_ALLOCATE_LINK_DESCRIPTORS',['../a00015.html#ga6dcd898a0c546f25356e016b9276a3de',1,'fsl_dma.h']]], + ['dma_5fallocate_5flink_5fdescriptors_5fat_5fnoncacheable',['DMA_ALLOCATE_LINK_DESCRIPTORS_AT_NONCACHEABLE',['../a00015.html#ga2cc9e4b6dceb1346d950ab7fb5f52bb7',1,'fsl_dma.h']]], + ['dma_5fburst_5fwrap_5ft',['dma_burst_wrap_t',['../a00015.html#gacea88ecaac2447ba3c9f2157e40b9a82',1,'fsl_dma.h']]], + ['dma_5fcallback',['dma_callback',['../a00015.html#gab844237884d5badd07ac902a9be34275',1,'fsl_dma.h']]], + ['dma_5fchannel_5fconfig_5ft',['dma_channel_config_t',['../a00015.html#a00118',1,'']]], + ['dma_5fchannel_5ftrigger_5ft',['dma_channel_trigger_t',['../a00015.html#a00119',1,'']]], + ['dma_5fchannel_5fxfer',['DMA_CHANNEL_XFER',['../a00015.html#ga2e10dd7fac0c8a71b801cfff2d21d1fa',1,'fsl_dma.h']]], + ['dma_5fchannelisactive',['DMA_ChannelIsActive',['../a00015.html#ga0e6279e44ebd6778355f6e9e26e9a8b6',1,'fsl_dma.h']]], + ['dma_5fchannelisbusy',['DMA_ChannelIsBusy',['../a00015.html#gade4163a20de203d8ddfccbbeedb6caa9',1,'fsl_dma.h']]], + ['dma_5fclocks',['DMA_CLOCKS',['../a00011.html#ga5a8ba9cbce79bf443b2b1ba97d4c5475',1,'fsl_clock.h']]], + ['dma_5fcommon_5freg_5fget',['DMA_COMMON_REG_GET',['../a00015.html#ga17d8b80c6e8d8c3ac95c2424f26e723f',1,'fsl_dma.h']]], + ['dma_5fconfigurechanneltrigger',['DMA_ConfigureChannelTrigger',['../a00015.html#ga04d2004d7d054b4f36676304bc2cd8ad',1,'fsl_dma.h']]], + ['dma_5fcreatedescriptor',['DMA_CreateDescriptor',['../a00015.html#gaf2955b2c961a33fe24d3154ec801f9fd',1,'fsl_dma.h']]], + ['dma_5fcreatehandle',['DMA_CreateHandle',['../a00015.html#ga5354ff2c0c1ec53e2cbd712169fc5558',1,'fsl_dma.h']]], + ['dma_5fdeinit',['DMA_Deinit',['../a00015.html#ga634ced9b86d7dc9543e0b4387123fcac',1,'fsl_dma.h']]], + ['dma_5fdescriptor_5fend_5faddress',['DMA_DESCRIPTOR_END_ADDRESS',['../a00015.html#gaa355501ba0bfb05cc9be452396f92bce',1,'fsl_dma.h']]], + ['dma_5fdescriptor_5ft',['dma_descriptor_t',['../a00015.html#a00120',1,'']]], + ['dma_5fdisablechannel',['DMA_DisableChannel',['../a00015.html#ga8025eebc80c23fa9b5a3a4454855e347',1,'fsl_dma.h']]], + ['dma_5fdisablechannelinterrupts',['DMA_DisableChannelInterrupts',['../a00015.html#gac9873a0205538dffcba7bb59ed1450c5',1,'fsl_dma.h']]], + ['dma_5fdisablechannelperiphrq',['DMA_DisableChannelPeriphRq',['../a00015.html#gab2d2f88ed16097b2974d1955c725a5dc',1,'fsl_dma.h']]], + ['dma_5fdochannelsoftwaretrigger',['DMA_DoChannelSoftwareTrigger',['../a00015.html#gae8ffd8526580ed3b7ca3520024d0002c',1,'fsl_dma.h']]], + ['dma_5fenablechannel',['DMA_EnableChannel',['../a00015.html#gaa0293771d55ee1a7c42a8ffecb0728e7',1,'fsl_dma.h']]], + ['dma_5fenablechannelinterrupts',['DMA_EnableChannelInterrupts',['../a00015.html#ga02671643755a7f9395ce1f151a914630',1,'fsl_dma.h']]], + ['dma_5fenablechannelperiphrq',['DMA_EnableChannelPeriphRq',['../a00015.html#gaa706c05b4875366e7f84c83b8d09ae29',1,'fsl_dma.h']]], + ['dma_5fgetchannelpriority',['DMA_GetChannelPriority',['../a00015.html#ga1a5311b6ad708e230db517fb04f98a5f',1,'fsl_dma.h']]], + ['dma_5fgetremainingbytes',['DMA_GetRemainingBytes',['../a00015.html#gaf0197c674ce188bf214c13bc7be43e14',1,'fsl_dma.h']]], + ['dma_5fhandle_5ft',['dma_handle_t',['../a00015.html#a00121',1,'']]], + ['dma_5finit',['DMA_Init',['../a00015.html#gade1b5efa61054ce538b37b181dd075bb',1,'fsl_dma.h']]], + ['dma_5finstalldescriptormemory',['DMA_InstallDescriptorMemory',['../a00015.html#ga9ba95776f25ee8eae5bdf9bf5fd9c9e6',1,'fsl_dma.h']]], + ['dma_5firq_5ft',['dma_irq_t',['../a00015.html#ga5658ee3bb7fbf1da24d997d9bc341e11',1,'fsl_dma.h']]], + ['dma_5firqhandle',['DMA_IRQHandle',['../a00015.html#ga9da5a899fb0109cec4fc9303e5df0433',1,'fsl_dma.h']]], + ['dma_5floadchanneldescriptor',['DMA_LoadChannelDescriptor',['../a00015.html#gae7c3ca634a04a8afe85b1e55360b17aa',1,'fsl_dma.h']]], + ['dma_5floadchanneltransferconfig',['DMA_LoadChannelTransferConfig',['../a00015.html#ga956cf0c90e0562e5087475ceefcc489f',1,'fsl_dma.h']]], + ['dma_5fmax_5ftransfer_5fcount',['DMA_MAX_TRANSFER_COUNT',['../a00015.html#gaebe7d948ac31ff020dde038034ae3bbd',1,'fsl_dma.h']]], + ['dma_5fotrig_5fpmux_5fid',['DMA_OTRIG_PMUX_ID',['../a00089.html#gaee30199bd34b2e831f916b4a17f83cfa',1,'fsl_inputmux_connections.h']]], + ['dma_5fpreparechanneltransfer',['DMA_PrepareChannelTransfer',['../a00015.html#gad29055b5d8b160f94bb18abce476af7d',1,'fsl_dma.h']]], + ['dma_5fpreparetransfer',['DMA_PrepareTransfer',['../a00015.html#ga01ed2edd4ac04c70f83c7c3091ec4b65',1,'fsl_dma.h']]], + ['dma_5fpriority_5ft',['dma_priority_t',['../a00015.html#ga63f28310491d665df0ad9a99dc22a77f',1,'fsl_dma.h']]], + ['dma_5fsetcallback',['DMA_SetCallback',['../a00015.html#ga2eb9a831b9a84c5108097f770dbe90db',1,'fsl_dma.h']]], + ['dma_5fsetchannelconfig',['DMA_SetChannelConfig',['../a00015.html#gafc795a7c0b3e5f4bbf32c1eed3a9ea47',1,'fsl_dma.h']]], + ['dma_5fsetchannelconfigvalid',['DMA_SetChannelConfigValid',['../a00015.html#gaa200c0bd1a2d714f6cd002919ed8a213',1,'fsl_dma.h']]], + ['dma_5fsetchannelpriority',['DMA_SetChannelPriority',['../a00015.html#gad8ae76fc5d858b97de3362100af86df6',1,'fsl_dma.h']]], + ['dma_5fsetupchanneldescriptor',['DMA_SetupChannelDescriptor',['../a00015.html#ga6c69a736b8e5719fe01bb7d3b76f9088',1,'fsl_dma.h']]], + ['dma_5fsetupdescriptor',['DMA_SetupDescriptor',['../a00015.html#gabbdbf43b54f0a0029cd27c09c094de36',1,'fsl_dma.h']]], + ['dma_5fstarttransfer',['DMA_StartTransfer',['../a00015.html#gac6fb3f30e13c937cc00fe11218e6ec76',1,'fsl_dma.h']]], + ['dma_5fsubmitchanneldescriptor',['DMA_SubmitChannelDescriptor',['../a00015.html#gabf72e148a82d885b8b4ab3cffd549cc3',1,'fsl_dma.h']]], + ['dma_5fsubmitchanneltransfer',['DMA_SubmitChannelTransfer',['../a00015.html#gae702541c17430371d54c7aea5dbef084',1,'fsl_dma.h']]], + ['dma_5fsubmitchanneltransferparameter',['DMA_SubmitChannelTransferParameter',['../a00015.html#ga55d406dd20fa70d7cca25601bae20777',1,'fsl_dma.h']]], + ['dma_5fsubmittransfer',['DMA_SubmitTransfer',['../a00015.html#gade169c9d37d6a2ff949546268ba1c382',1,'fsl_dma.h']]], + ['dma_5ftransfer_5fconfig_5ft',['dma_transfer_config_t',['../a00015.html#a00122',1,'']]], + ['dma_5ftransfer_5ftype_5ft',['dma_transfer_type_t',['../a00015.html#ga9cb7087af6efc80106c1033f80d60219',1,'fsl_dma.h']]], + ['dma_5ftrigger_5fburst_5ft',['dma_trigger_burst_t',['../a00015.html#ga776b1091528ddc2571284f481ddde830',1,'fsl_dma.h']]], + ['dma_5ftrigger_5ftype_5ft',['dma_trigger_type_t',['../a00015.html#ga0468cf171e413581e9bba9803df91427',1,'fsl_dma.h']]], + ['dma_5fxfercfg_5ft',['dma_xfercfg_t',['../a00015.html#a00123',1,'']]], + ['driver_20errors_20status',['Driver errors status',['../a00006.html',1,'']]], + ['dstaddr',['dstAddr',['../a00015.html#a8eb88e8dcaea9033a76c0003fcabadd8',1,'dma_transfer_config_t']]], + ['dstendaddr',['dstEndAddr',['../a00015.html#ab0a39d7a7b627b1a714117f2d150bac0',1,'dma_descriptor_t']]], + ['dstinc',['dstInc',['../a00015.html#a674be34352d78e2029f8b36f0664cf6f',1,'dma_xfercfg_t']]], + ['dststartaddr',['dstStartAddr',['../a00015.html#a7cf6b2c7eef13541394e9131987a2209',1,'dma_channel_config_t']]], + ['dutycyclepercent',['dutyCyclePercent',['../a00021.html#a17414a2d234412e960c98e4c8e4df853',1,'sctimer_pwm_signal_param_t']]], + ['dac_3a_2010_2dbit_20digital_20to_20analog_20converter_20driver',['DAC: 10-bit Digital To Analog Converter Driver',['../a00014.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_65.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_65.html new file mode 100644 index 0000000..49e2cae --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_65.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_65.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_65.js new file mode 100644 index 0000000..58df314 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_65.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['enablebidirection_5fh',['enableBidirection_h',['../a00021.html#a347a741944d1f294a11fc0f19cfbbc53',1,'sctimer_config_t']]], + ['enablebidirection_5fl',['enableBidirection_l',['../a00021.html#aafc09c3595776bc668daf3e303802f31',1,'sctimer_config_t']]], + ['enablecontinuoussclk',['enableContinuousSCLK',['../a00023.html#a8d618d37f6867480bd0e1fcd9e5b50a5',1,'usart_config_t']]], + ['enablecounterreset',['enableCounterReset',['../a00013.html#aaa00b16aba273e3f11f9480154acc1e5',1,'ctimer_match_config_t']]], + ['enablecounterstop',['enableCounterStop',['../a00013.html#a94fe2c63ce7fcb5cf68f9ce73974a3e8',1,'ctimer_match_config_t']]], + ['enablecounterunify',['enableCounterUnify',['../a00021.html#a6caacf7ae4f800be829c32ed87cd6149',1,'sctimer_config_t']]], + ['enablehardwareflowcontrol',['enableHardwareFlowControl',['../a00023.html#ac34e16abe408d6e9daa37741420f7ec0',1,'usart_config_t']]], + ['enableinterrupt',['enableInterrupt',['../a00013.html#ae09fd69820c9285d7f146260d2c51584',1,'ctimer_match_config_t']]], + ['enablelockoscillator',['enableLockOscillator',['../a00025.html#ac0e6a4a8be4bd468fdb082a156219a44',1,'wwdt_config_t']]], + ['enableloopback',['enableLoopback',['../a00022.html#a384bc00ef4cd5b4e9cb6a4d48ec336bd',1,'spi_master_config_t']]], + ['enablelowpowermode',['enableLowPowerMode',['../a00009.html#a92583334531874821348b01b24f03bed',1,'adc_config_t']]], + ['enablemaster',['enableMaster',['../a00017.html#a2419131a10906475fd31950f17ac8895',1,'i2c_master_config_t::enableMaster()'],['../a00022.html#aa033bd20cfbb1a14f0fd43f4b31bb27e',1,'spi_master_config_t::enableMaster()']]], + ['enablemultitask',['enableMultiTask',['../a00020.html#aa8d8b810ee17770fd48674454f59bb08',1,'mrt_config_t']]], + ['enablerx',['enableRx',['../a00023.html#a8b9813693fdfd2116e0d6019ea39b41d',1,'usart_config_t']]], + ['enablesinglestep',['enableSingleStep',['../a00009.html#abe7f67296372743da67e2eac58f9aafe',1,'adc_conv_seq_config_t']]], + ['enableslave',['enableSlave',['../a00018.html#a92d20835618a946b8f7702455877ef7a',1,'i2c_slave_config_t::enableSlave()'],['../a00022.html#a9fcd3fae6d886c7dfd0c3fd4cd51e6fe',1,'spi_slave_config_t::enableSlave()']]], + ['enablesyncbypass',['enableSyncBypass',['../a00009.html#aaf2640b291a24e4222953c7686007a3b',1,'adc_conv_seq_config_t']]], + ['enablesynctobusclk',['enableSyncToBusClk',['../a00008.html#a6f9542645b06542277cb07ea138e5064',1,'acomp_config_t']]], + ['enabletimeout',['enableTimeout',['../a00017.html#a1c6831135c83c013d2a3cfc3e7210357',1,'i2c_master_config_t']]], + ['enabletouchlower',['enableTouchLower',['../a00010.html#af153fbc551235805bebdcae4efa95462',1,'capt_config_t']]], + ['enabletx',['enableTx',['../a00023.html#a2c3b5faf44be34a152232b9dfaaf064d',1,'usart_config_t']]], + ['enablewaitmode',['enableWaitMode',['../a00010.html#a65c26d6fd762782ca1370d3de678e98b',1,'capt_config_t']]], + ['enablewatchdogprotect',['enableWatchdogProtect',['../a00025.html#adc32c01dcffb7f140c8e1fd049862928',1,'wwdt_config_t']]], + ['enablewatchdogreset',['enableWatchdogReset',['../a00025.html#a78ce1ec4de049becaae7e3be51772313',1,'wwdt_config_t']]], + ['enablewwdt',['enableWwdt',['../a00025.html#a405b63e15703dc92b3179b5089319e38',1,'wwdt_config_t']]], + ['enablexpins',['enableXpins',['../a00010.html#a22171a4d042ea93fa19f6d7e22caa516',1,'capt_config_t']]], + ['event',['event',['../a00018.html#ad0a9e837e9df16d89bab98a78af5bd10',1,'i2c_slave_transfer_t']]], + ['eventmask',['eventMask',['../a00018.html#a1be21257ec375e09106dfe242c02beea',1,'i2c_slave_transfer_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_66.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_66.html new file mode 100644 index 0000000..6aa068f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_66.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_66.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_66.js new file mode 100644 index 0000000..5bf179e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_66.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['flags',['flags',['../a00017.html#a8835787e1b0f9a4b8868e7cbe53e45d5',1,'_i2c_master_transfer']]], + ['flash_5frsts_5fn',['FLASH_RSTS_N',['../a00086.html#ga337911597d5b1d45ac9ac6abb705a5ef',1,'fsl_reset.h']]], + ['framedelay',['frameDelay',['../a00022.html#a9609e5c510bf5d0c120a403ed40aed42',1,'spi_delay_config_t']]], + ['fsl_5facomp_5fdriver_5fversion',['FSL_ACOMP_DRIVER_VERSION',['../a00008.html#ga856c35b78deb42642464ecfdb8dfa8aa',1,'fsl_acomp.h']]], + ['fsl_5fadc_5fdriver_5fversion',['FSL_ADC_DRIVER_VERSION',['../a00009.html#ga5838d9fe654d6e1503be047d08ce5b32',1,'fsl_adc.h']]], + ['fsl_5fcapt_5fdriver_5fversion',['FSL_CAPT_DRIVER_VERSION',['../a00010.html#ga9b69d5e0db52ef3ba10acf4f190b9fc2',1,'fsl_capt.h']]], + ['fsl_5fclock_5fdriver_5fversion',['FSL_CLOCK_DRIVER_VERSION',['../a00011.html#ga0c0cf401613f31feb4a9eb723ad51154',1,'fsl_clock.h']]], + ['fsl_5fcommon_5fdriver_5fversion',['FSL_COMMON_DRIVER_VERSION',['../a00087.html#gac6e3c4c6fa592fc0da7fab541e7019f7',1,'fsl_common.h']]], + ['fsl_5fcrc_5fdriver_5fversion',['FSL_CRC_DRIVER_VERSION',['../a00012.html#gac70c03eacdde850267d7fe0d7dca9591',1,'fsl_crc.h']]], + ['fsl_5fctimer_5fdriver_5fversion',['FSL_CTIMER_DRIVER_VERSION',['../a00013.html#ga89b626fd25a5b3bbd511672ff51618f8',1,'fsl_ctimer.h']]], + ['fsl_5fdma_5fdriver_5fversion',['FSL_DMA_DRIVER_VERSION',['../a00015.html#gac68c8082b53756a7e58ec6d5f25117d2',1,'fsl_dma.h']]], + ['fsl_5fdriver_5ftransfer_5fdouble_5fweak_5firq',['FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ',['../a00087.html#ga9a10f3f762d9eb7c5db73535db6a9d78',1,'fsl_common.h']]], + ['fsl_5ffeature_5fdma_5flink_5fdescriptor_5falign_5fsize',['FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE',['../a00015.html#ga160b4ffad583e82ad4a80575e4830592',1,'fsl_dma.h']]], + ['fsl_5ffeature_5fdma_5fnumber_5fof_5fchannelsn',['FSL_FEATURE_DMA_NUMBER_OF_CHANNELSn',['../a00015.html#ga7acdd2a8f51e171c777a4e53bd5c57e7',1,'fsl_dma.h']]], + ['fsl_5fgpio_5fdriver_5fversion',['FSL_GPIO_DRIVER_VERSION',['../a00016.html#ga5aa5229cbd041b11bcf8417ba12896b2',1,'fsl_gpio.h']]], + ['fsl_5fi2c_5fdriver_5fversion',['FSL_I2C_DRIVER_VERSION',['../a00091.html#ga60fdaec284298758a650ce1122aef231',1,'fsl_i2c.h']]], + ['fsl_5finputmux_5fdriver_5fversion',['FSL_INPUTMUX_DRIVER_VERSION',['../a00089.html#ga166fc4ada71e4fa9e160774700c976d7',1,'fsl_inputmux.h']]], + ['fsl_5fmrt_5fdriver_5fversion',['FSL_MRT_DRIVER_VERSION',['../a00020.html#gae39f6122bd73a5156d40291962f7507f',1,'fsl_mrt.h']]], + ['fsl_5fpint_5fdriver_5fversion',['FSL_PINT_DRIVER_VERSION',['../a00094.html#ga2c7d26f7018dc7e75c1e090090628069',1,'fsl_pint.h']]], + ['fsl_5fpower_5fdriver_5fversion',['FSL_POWER_DRIVER_VERSION',['../a00085.html#ga566dde551cccfbff838b7f6f474e525b',1,'fsl_power.h']]], + ['fsl_5freset_5fdriver_5fversion',['FSL_RESET_DRIVER_VERSION',['../a00086.html#gaf2dd9adbeea910141dc143654a1065db',1,'fsl_reset.h']]], + ['fsl_5fsctimer_5fdriver_5fversion',['FSL_SCTIMER_DRIVER_VERSION',['../a00021.html#ga3d7deebbb8cb3899c51bbef999113fdf',1,'fsl_sctimer.h']]], + ['fsl_5fsdk_5fenable_5fusart_5fdriver_5ftransactional_5fapis',['FSL_SDK_ENABLE_USART_DRIVER_TRANSACTIONAL_APIS',['../a00023.html#gaf7814290d5f1317f0b5dbe97712c3cb7',1,'fsl_usart.h']]], + ['fsl_5fsdk_5fusart_5fdriver_5fenable_5fbaudrate_5fauto_5fgenerate',['FSL_SDK_USART_DRIVER_ENABLE_BAUDRATE_AUTO_GENERATE',['../a00023.html#ga855e54d43b294857434ce0d82a6b56cb',1,'fsl_usart.h']]], + ['fsl_5fspi_5fdriver_5fversion',['FSL_SPI_DRIVER_VERSION',['../a00022.html#gaeb6046de02dffe9248de71332fac246e',1,'fsl_spi.h']]], + ['fsl_5fswm_5fdriver_5fversion',['FSL_SWM_DRIVER_VERSION',['../a00095.html#gafa0f32bbd70b73222cc401d997b1f243',1,'fsl_swm.h']]], + ['fsl_5fsyson_5fdriver_5fversion',['FSL_SYSON_DRIVER_VERSION',['../a00096.html#ga3d7a27cd4564bc389103aacd4a0a41e4',1,'fsl_syscon.h']]], + ['fsl_5fusart_5fdriver_5fversion',['FSL_USART_DRIVER_VERSION',['../a00023.html#gad737c0eee502276b7615e83ec3a79be4',1,'fsl_usart.h']]], + ['fsl_5fwkt_5fdriver_5fversion',['FSL_WKT_DRIVER_VERSION',['../a00024.html#ga0411f3587cc78cbde38b765e8bf3ba0c',1,'fsl_wkt.h']]], + ['fsl_5fwwdt_5fdriver_5fversion',['FSL_WWDT_DRIVER_VERSION',['../a00025.html#gaf661d1e3e19a80b873c54fdbad5e966a',1,'fsl_wwdt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_67.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_67.html new file mode 100644 index 0000000..a6568a3 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_67.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_67.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_67.js new file mode 100644 index 0000000..ba48088 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_67.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['g_5fext_5fclk_5ffreq',['g_Ext_Clk_Freq',['../a00011.html#ga386d59c21453d1914f3c8194010ff277',1,'fsl_clock.h']]], + ['g_5fwdt_5fosc_5ffreq',['g_Wdt_Osc_Freq',['../a00011.html#ga73a69ec6e63f37b9341025bbe87ced45',1,'fsl_clock.h']]], + ['gpio_5fclocks',['GPIO_CLOCKS',['../a00011.html#gac86986db423673c1d9b46882ccd6b3a9',1,'fsl_clock.h']]], + ['gpio_5fint_5fclocks',['GPIO_INT_CLOCKS',['../a00011.html#ga4b1754d575449d4dab7f7e3f0131650c',1,'fsl_clock.h']]], + ['gpio_5fpin_5fconfig_5ft',['gpio_pin_config_t',['../a00016.html#a00124',1,'']]], + ['gpio_5fpin_5fdirection_5ft',['gpio_pin_direction_t',['../a00016.html#gada41ca0a2ce239fe125ee96833e715c0',1,'fsl_gpio.h']]], + ['gpio_5fpininit',['GPIO_PinInit',['../a00016.html#ga9b8fa194d8fa5a1bf933a709d4dde014',1,'fsl_gpio.h']]], + ['gpio_5fpinread',['GPIO_PinRead',['../a00016.html#gabad8dfa62a3e414cc23ff8b32eea81d0',1,'fsl_gpio.h']]], + ['gpio_5fpinwrite',['GPIO_PinWrite',['../a00016.html#ga2a1113d96cdf973bb5b1eade3521adf8',1,'fsl_gpio.h']]], + ['gpio_5fportclear',['GPIO_PortClear',['../a00016.html#ga185ddb6848a644b40e0620ef6b4ce2cf',1,'fsl_gpio.h']]], + ['gpio_5fportinit',['GPIO_PortInit',['../a00016.html#ga6fabd21856d350fc0b60ffea3bbca200',1,'fsl_gpio.h']]], + ['gpio_5fportset',['GPIO_PortSet',['../a00016.html#ga7206f7b805b8a3c68044345dbbba0a41',1,'fsl_gpio.h']]], + ['gpio_5fporttoggle',['GPIO_PortToggle',['../a00016.html#ga07e3b8c21dad1debec7986f214a70975',1,'fsl_gpio.h']]], + ['gpio_3a_20general_20purpose_20i_2fo',['GPIO: General Purpose I/O',['../a00016.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_68.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_68.html new file mode 100644 index 0000000..a954e65 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_68.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_68.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_68.js new file mode 100644 index 0000000..6a5b932 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_68.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['handle',['handle',['../a00018.html#ab74516c1edb1424ddb1554de7cae69bc',1,'i2c_slave_transfer_t']]], + ['hysteresisselection',['hysteresisSelection',['../a00008.html#a46ecb6f7efe54967d816deafdf1c65ce',1,'acomp_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_69.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_69.html new file mode 100644 index 0000000..676651e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_69.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_69.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_69.js new file mode 100644 index 0000000..f69a160 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_69.js @@ -0,0 +1,99 @@ +var searchData= +[ + ['i2c_3a_20inter_2dintegrated_20circuit_20driver',['I2C: Inter-Integrated Circuit Driver',['../a00090.html',1,'']]], + ['i2c_5fclocks',['I2C_CLOCKS',['../a00011.html#gac0c74371f4f724c78ef233de79c3cf14',1,'fsl_clock.h']]], + ['i2c_5fdirection_5ft',['i2c_direction_t',['../a00017.html#gab49c827b45635206f06e5737606e4611',1,'fsl_i2c.h']]], + ['i2c_5fdisableinterrupts',['I2C_DisableInterrupts',['../a00017.html#gac3e053611231cc886bfa38831a1ac26e',1,'fsl_i2c.h']]], + ['i2c_20driver',['I2C Driver',['../a00091.html',1,'']]], + ['i2c_5fenableinterrupts',['I2C_EnableInterrupts',['../a00017.html#ga0f6f1f2fe150661f8eb0a072665a9020',1,'fsl_i2c.h']]], + ['i2c_5fgetenabledinterrupts',['I2C_GetEnabledInterrupts',['../a00017.html#gae652236a25f1b4828d596f32190655f8',1,'fsl_i2c.h']]], + ['i2c_5fgetinstance',['I2C_GetInstance',['../a00017.html#ga07cc6bd20f700249c335893427bf462a',1,'fsl_i2c.h']]], + ['i2c_5fgetstatusflags',['I2C_GetStatusFlags',['../a00017.html#ga441017241044ffdb828385e473f5fb58',1,'fsl_i2c.h']]], + ['i2c_5fisr_5ft',['i2c_isr_t',['../a00018.html#ga64e4839b34e9156358c4eaa717b1c14a',1,'fsl_i2c.h']]], + ['i2c_5fmaster_5fconfig_5ft',['i2c_master_config_t',['../a00017.html#a00125',1,'']]], + ['i2c_20master_20driver',['I2C Master Driver',['../a00017.html',1,'']]], + ['i2c_5fmaster_5ftransfer_5fcallback_5ft',['i2c_master_transfer_callback_t',['../a00017.html#gad292a48f957a9b76593c1779d9dce497',1,'fsl_i2c.h']]], + ['i2c_5fmasterclearstatusflags',['I2C_MasterClearStatusFlags',['../a00017.html#ga437271ffb955b77df0a5dee9ea80cc63',1,'fsl_i2c.h']]], + ['i2c_5fmasterdeinit',['I2C_MasterDeinit',['../a00017.html#gadcf7122f0a38d4d9da0f052fcb167957',1,'fsl_i2c.h']]], + ['i2c_5fmasterenable',['I2C_MasterEnable',['../a00017.html#ga164d97e40eb5ad625a41ad43cf938153',1,'fsl_i2c.h']]], + ['i2c_5fmastergetbusidlestate',['I2C_MasterGetBusIdleState',['../a00017.html#ga4b7617034ab51d77786141873fd6ee1c',1,'fsl_i2c.h']]], + ['i2c_5fmastergetdefaultconfig',['I2C_MasterGetDefaultConfig',['../a00017.html#gad69f2d63ea756dda60749ff6b09f587d',1,'fsl_i2c.h']]], + ['i2c_5fmasterinit',['I2C_MasterInit',['../a00017.html#ga29f967b3ae8487a36ba2a58deb01ccae',1,'fsl_i2c.h']]], + ['i2c_5fmasterreadblocking',['I2C_MasterReadBlocking',['../a00017.html#gaba04c62ee636dd8317c2235c3c82aa3b',1,'fsl_i2c.h']]], + ['i2c_5fmasterrepeatedstart',['I2C_MasterRepeatedStart',['../a00017.html#ga8137f7b333aafe1e3ff6c9d3852b7dbd',1,'fsl_i2c.h']]], + ['i2c_5fmasterreset',['I2C_MasterReset',['../a00017.html#ga09137caccbe9a57f6b2ca5e1ce9bdc50',1,'fsl_i2c.h']]], + ['i2c_5fmastersetbaudrate',['I2C_MasterSetBaudRate',['../a00017.html#gafeab1d5249a8b39c8d9e1a54a85c23f0',1,'fsl_i2c.h']]], + ['i2c_5fmasterstart',['I2C_MasterStart',['../a00017.html#ga7664234966e4162e952b6d57efcaa8a6',1,'fsl_i2c.h']]], + ['i2c_5fmasterstop',['I2C_MasterStop',['../a00017.html#gaf46a8cc094fc18c6cadea8de71448723',1,'fsl_i2c.h']]], + ['i2c_5fmastertransferabort',['I2C_MasterTransferAbort',['../a00017.html#gabb386e53b2bc64e29b2915bdfac36800',1,'fsl_i2c.h']]], + ['i2c_5fmastertransferblocking',['I2C_MasterTransferBlocking',['../a00017.html#ga35cae3a5b4aa50ce8db28e3eb703a027',1,'fsl_i2c.h']]], + ['i2c_5fmastertransfercreatehandle',['I2C_MasterTransferCreateHandle',['../a00017.html#ga31e3de02b57801c6896e6045c4a31268',1,'fsl_i2c.h']]], + ['i2c_5fmastertransfergetcount',['I2C_MasterTransferGetCount',['../a00017.html#ga7d720842e68161d2d52d56d119f20665',1,'fsl_i2c.h']]], + ['i2c_5fmastertransferhandleirq',['I2C_MasterTransferHandleIRQ',['../a00017.html#gad091cd1857d2bd8ce64583739b3a35d5',1,'fsl_i2c.h']]], + ['i2c_5fmastertransfernonblocking',['I2C_MasterTransferNonBlocking',['../a00017.html#gac7f76a04b6f6873c52ad176d58901fe9',1,'fsl_i2c.h']]], + ['i2c_5fmasterwriteblocking',['I2C_MasterWriteBlocking',['../a00017.html#ga3b4d71b59e118adc63afbc5434e5e7dd',1,'fsl_i2c.h']]], + ['i2c_5fretry_5ftimes',['I2C_RETRY_TIMES',['../a00091.html#gaac288786aaa7d0cb947c91591baf42d7',1,'fsl_i2c.h']]], + ['i2c_5fslave_5faddress_5fqual_5fmode_5ft',['i2c_slave_address_qual_mode_t',['../a00018.html#ga719dc02b99647eb8f08a05d4d6066c51',1,'fsl_i2c.h']]], + ['i2c_5fslave_5faddress_5fregister_5ft',['i2c_slave_address_register_t',['../a00018.html#ga833a7311515f1a3bf5cb8da2355cc661',1,'fsl_i2c.h']]], + ['i2c_5fslave_5faddress_5ft',['i2c_slave_address_t',['../a00018.html#a00126',1,'']]], + ['i2c_5fslave_5fbus_5fspeed_5ft',['i2c_slave_bus_speed_t',['../a00018.html#ga5f368505586dd356fc680711023ace7f',1,'fsl_i2c.h']]], + ['i2c_5fslave_5fconfig_5ft',['i2c_slave_config_t',['../a00018.html#a00127',1,'']]], + ['i2c_20slave_20driver',['I2C Slave Driver',['../a00018.html',1,'']]], + ['i2c_5fslave_5ffsm_5ft',['i2c_slave_fsm_t',['../a00018.html#gad6564299304730416461f62255fcd37c',1,'fsl_i2c.h']]], + ['i2c_5fslave_5ftransfer_5fcallback_5ft',['i2c_slave_transfer_callback_t',['../a00018.html#ga0704c8f14da38feb11555e4127d86a18',1,'fsl_i2c.h']]], + ['i2c_5fslave_5ftransfer_5fevent_5ft',['i2c_slave_transfer_event_t',['../a00018.html#gac53e5c96a2eed1b5a95b7d84be48f4ac',1,'fsl_i2c.h']]], + ['i2c_5fslave_5ftransfer_5ft',['i2c_slave_transfer_t',['../a00018.html#a00128',1,'']]], + ['i2c_5fslaveclearstatusflags',['I2C_SlaveClearStatusFlags',['../a00018.html#ga545c1a43d8d49c4675de493d45a4063a',1,'fsl_i2c.h']]], + ['i2c_5fslavedeinit',['I2C_SlaveDeinit',['../a00018.html#gadb50014db29dd75ea2001fb7bc837e77',1,'fsl_i2c.h']]], + ['i2c_5fslaveenable',['I2C_SlaveEnable',['../a00018.html#gacbb93d5ea4f4b40038f41e0e942a9ee1',1,'fsl_i2c.h']]], + ['i2c_5fslavegetdefaultconfig',['I2C_SlaveGetDefaultConfig',['../a00018.html#ga7115f80e28b62bbbd3be1a2a918529ba',1,'fsl_i2c.h']]], + ['i2c_5fslavegetreceivedaddress',['I2C_SlaveGetReceivedAddress',['../a00018.html#ga4c9fc06eeb8a3beb024f6525e4d99a0b',1,'fsl_i2c.h']]], + ['i2c_5fslaveinit',['I2C_SlaveInit',['../a00018.html#ga175a81b5ab74dd78469d6cdea690d8cc',1,'fsl_i2c.h']]], + ['i2c_5fslavereadblocking',['I2C_SlaveReadBlocking',['../a00018.html#ga89baaf8bc82b19c837032665e89a1707',1,'fsl_i2c.h']]], + ['i2c_5fslavesetaddress',['I2C_SlaveSetAddress',['../a00018.html#gacf721065f83982e3df651111183bf7b2',1,'fsl_i2c.h']]], + ['i2c_5fslavesetreceivebuffer',['I2C_SlaveSetReceiveBuffer',['../a00018.html#ga25b9c35089f0fc966facec3bf874c840',1,'fsl_i2c.h']]], + ['i2c_5fslavesetsendbuffer',['I2C_SlaveSetSendBuffer',['../a00018.html#gac7602b6897596348fe190e4fc63f1381',1,'fsl_i2c.h']]], + ['i2c_5fslavetransferabort',['I2C_SlaveTransferAbort',['../a00018.html#ga5ae9f5e6e854d14d33ba3029128bd6f0',1,'fsl_i2c.h']]], + ['i2c_5fslavetransfercreatehandle',['I2C_SlaveTransferCreateHandle',['../a00018.html#gac9b90f575d92ff8ad3cc350a5c8ad1b9',1,'fsl_i2c.h']]], + ['i2c_5fslavetransfergetcount',['I2C_SlaveTransferGetCount',['../a00018.html#gabf38a498bd3527ea0b7cc947ae71e17e',1,'fsl_i2c.h']]], + ['i2c_5fslavetransferhandleirq',['I2C_SlaveTransferHandleIRQ',['../a00018.html#ga097c0b20503381de44cccba311dcf236',1,'fsl_i2c.h']]], + ['i2c_5fslavetransfernonblocking',['I2C_SlaveTransferNonBlocking',['../a00018.html#gaa387d81ea08a9d4b39cfeb3dfec505f7',1,'fsl_i2c.h']]], + ['i2c_5fslavewriteblocking',['I2C_SlaveWriteBlocking',['../a00018.html#ga280404c6b1ede542f2c1c20bd382869c',1,'fsl_i2c.h']]], + ['i2c_5fstat_5fmstcode_5fidle',['I2C_STAT_MSTCODE_IDLE',['../a00091.html#ga2c6171791d36810488b3e31648156d40',1,'fsl_i2c.h']]], + ['i2c_5fstat_5fmstcode_5fnackadr',['I2C_STAT_MSTCODE_NACKADR',['../a00091.html#ga5f10a8d39f171f4c6fb65bba7ff9bb2b',1,'fsl_i2c.h']]], + ['i2c_5fstat_5fmstcode_5fnackdat',['I2C_STAT_MSTCODE_NACKDAT',['../a00091.html#gac815d26a6d964108edbc558afe774828',1,'fsl_i2c.h']]], + ['i2c_5fstat_5fmstcode_5frxready',['I2C_STAT_MSTCODE_RXREADY',['../a00091.html#ga6d910a54f8271411dbed62a08ac462a2',1,'fsl_i2c.h']]], + ['i2c_5fstat_5fmstcode_5ftxready',['I2C_STAT_MSTCODE_TXREADY',['../a00091.html#gaa638faf1f9e205ac8df1e4cf44de0a14',1,'fsl_i2c.h']]], + ['iap_5fblankchecksector',['IAP_BlankCheckSector',['../a00088.html#ga93a68a9ca640a51b56350d59cac4dd7c',1,'fsl_iap.h']]], + ['iap_5fcompare',['IAP_Compare',['../a00088.html#ga48b79c8dc56de9714927e70ad230fa0b',1,'fsl_iap.h']]], + ['iap_5fcopyramtoflash',['IAP_CopyRamToFlash',['../a00088.html#ga6b58df04b8aae97c7e31884f3fe3413f',1,'fsl_iap.h']]], + ['iap_3a_20in_20application_20programming_20driver',['IAP: In Application Programming Driver',['../a00088.html',1,'']]], + ['iap_5ferasepage',['IAP_ErasePage',['../a00088.html#ga93474c7fb9be2c15eabc9dbf73c99bdb',1,'fsl_iap.h']]], + ['iap_5ferasesector',['IAP_EraseSector',['../a00088.html#ga0093db979d7b9afca6dca250f42b2eef',1,'fsl_iap.h']]], + ['iap_5fextendedflashsignatureread',['IAP_ExtendedFlashSignatureRead',['../a00088.html#gaf3d4c53d3b36200b76c7c2e9185e9350',1,'fsl_iap.h']]], + ['iap_5fpreparesectorforwrite',['IAP_PrepareSectorForWrite',['../a00088.html#ga361041aa626a50391c40c9d6936ba2c0',1,'fsl_iap.h']]], + ['iap_5freadbootcodeversion',['IAP_ReadBootCodeVersion',['../a00088.html#ga747cfb2ed95cefa6f39ae2ad089f8ade',1,'fsl_iap.h']]], + ['iap_5freadfaimpage',['IAP_ReadFAIMPage',['../a00088.html#ga4cc5332eb289fd1c999a47c0c22b8f2c',1,'fsl_iap.h']]], + ['iap_5freadpartid',['IAP_ReadPartID',['../a00088.html#ga916f8b461de93f08044df1724290dcbd',1,'fsl_iap.h']]], + ['iap_5freaduniqueid',['IAP_ReadUniqueID',['../a00088.html#ga258d8c49d494cbd0d18321af56e11440',1,'fsl_iap.h']]], + ['iap_5freinvokeisp',['IAP_ReinvokeISP',['../a00088.html#ga98407c578584b1d88d7be1b3e6d9656a',1,'fsl_iap.h']]], + ['iap_5fwritefaimpage',['IAP_WriteFAIMPage',['../a00088.html#ga87a985be230bedefd5e3560dde51d788',1,'fsl_iap.h']]], + ['introduction',['Introduction',['../a00007.html',1,'']]], + ['input',['input',['../a00013.html#ac07c23c0bbadea74c24c03e401321fbc',1,'ctimer_config_t']]], + ['inputmux_5fattachsignal',['INPUTMUX_AttachSignal',['../a00089.html#gaa4f141e3874109e45c2a6f9be027e0ee',1,'fsl_inputmux.h']]], + ['inputmux_5fconnection_5ft',['inputmux_connection_t',['../a00089.html#ga7ac6f6ac5dd2b621eabb60d2ab48163b',1,'fsl_inputmux_connections.h']]], + ['inputmux_5fdeinit',['INPUTMUX_Deinit',['../a00089.html#gaf84e3b0d7a06af86ea6f1ac0d6edf382',1,'fsl_inputmux.h']]], + ['inputmux_3a_20input_20multiplexing_20driver',['INPUTMUX: Input Multiplexing Driver',['../a00089.html',1,'']]], + ['inputmux_5finit',['INPUTMUX_Init',['../a00089.html#gae02fecc3b8aab2a9d3f40f07ca7114a4',1,'fsl_inputmux.h']]], + ['inputsync',['inputsync',['../a00021.html#acd66f85232dafe6feeea4d80400aba69',1,'sctimer_config_t']]], + ['inta',['intA',['../a00015.html#ae2c9381d6fc00cee3491c5a8217c30a1',1,'dma_xfercfg_t']]], + ['intb',['intB',['../a00015.html#a7827b3fe247d5d7218b0263ecbb0aede',1,'dma_xfercfg_t']]], + ['interruptmode',['interruptMode',['../a00009.html#aa37fa0f5c6c3351f811d4f31f40290ad',1,'adc_conv_seq_config_t']]], + ['iocon_5fclocks',['IOCON_CLOCKS',['../a00011.html#ga7c6017a8657328bdaad58beb19de84e1',1,'fsl_clock.h']]], + ['iocon_5fgroup_5ft',['iocon_group_t',['../a00019.html#a00129',1,'']]], + ['iocon_5fpinmuxset',['IOCON_PinMuxSet',['../a00019.html#gaf9258f56192a94928f67940eee5dd879',1,'fsl_iocon.h']]], + ['iocon_5fsetpinmuxing',['IOCON_SetPinMuxing',['../a00019.html#gaf2cc5d2d92b4e2898a197479e77a326e',1,'fsl_iocon.h']]], + ['isbusy',['isBusy',['../a00018.html#a81ece18a362fc9779750be91f7cc6b30',1,'_i2c_slave_handle']]], + ['isperiph',['isPeriph',['../a00015.html#a0ab90a7e2c3a70511144d346a52aeea7',1,'dma_channel_config_t::isPeriph()'],['../a00015.html#a3d7f9ccb3edc3a6b1dbf2feb5a8b8f93',1,'dma_transfer_config_t::isPeriph()']]], + ['iocon_3a_20i_2fo_20pin_20configuration',['IOCON: I/O pin configuration',['../a00019.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6b.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6b.html new file mode 100644 index 0000000..b6e38ce --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6b.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6b.js new file mode 100644 index 0000000..321a213 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6b.js @@ -0,0 +1,1005 @@ +var searchData= +[ + ['kacmp_5frst_5fn_5fshift_5frstn',['kACMP_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac1a3b1156e6dbc9d6fecb867f1486c63',1,'fsl_reset.h']]], + ['kacomp_5fhysteresis10mvselection',['kACOMP_Hysteresis10MVSelection',['../a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5aca25ed95469736b1383c06835f1a59a6f7',1,'fsl_acomp.h']]], + ['kacomp_5fhysteresis20mvselection',['kACOMP_Hysteresis20MVSelection',['../a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acab609612c0f5c6987b71f287d0ab8e02c',1,'fsl_acomp.h']]], + ['kacomp_5fhysteresis5mvselection',['kACOMP_Hysteresis5MVSelection',['../a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acae6c2b1547a7e476425962d46b44a00f9',1,'fsl_acomp.h']]], + ['kacomp_5fhysteresisnoneselection',['kACOMP_HysteresisNoneSelection',['../a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acae003c683374deba88f335221e4f6c62b',1,'fsl_acomp.h']]], + ['kacomp_5finterruptsbothedgesenable',['kACOMP_InterruptsBothEdgesEnable',['../a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a23743234a07f6c25a2b14cca0cd863c7',1,'fsl_acomp.h']]], + ['kacomp_5finterruptsdisable',['kACOMP_InterruptsDisable',['../a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a629a3a054d3fde07b8f1d4974a9d070d',1,'fsl_acomp.h']]], + ['kacomp_5finterruptsfallingedgeenable',['kACOMP_InterruptsFallingEdgeEnable',['../a00008.html#gga178d521ca2ee7f33d518b30dfb627d20ad015e6ad9b09be27a6de122fde6b3997',1,'fsl_acomp.h']]], + ['kacomp_5finterruptsrisingedgeenable',['kACOMP_InterruptsRisingEdgeEnable',['../a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a25801b009aba402b9810189eb8545b8b',1,'fsl_acomp.h']]], + ['kacomp_5fladderrefvoltagepinvdd',['kACOMP_LadderRefVoltagePinVDD',['../a00008.html#gga7ad629d52b0a70f95cd2ddb3bee8ab5fa70a5aa61894fc8d2195652c2fa3423aa',1,'fsl_acomp.h']]], + ['kacomp_5fladderrefvoltagepinvddcmp',['kACOMP_LadderRefVoltagePinVDDCMP',['../a00008.html#gga7ad629d52b0a70f95cd2ddb3bee8ab5fa56718eb64fdbbd04648466547b326c35',1,'fsl_acomp.h']]], + ['kadc_5fadcinunitygainmode',['kADC_ADCInUnityGainMode',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a520d81c1c70fab0701cfdcfaa46e1cae',1,'fsl_adc.h']]], + ['kadc_5fclk_5ffrom_5ffro',['kADC_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a91f272ba2ca7171ce0689d39f9a894af',1,'fsl_clock.h']]], + ['kadc_5fclk_5ffrom_5fsyspll',['kADC_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58adffea42a42dc4f9d329a9d24822b9173',1,'fsl_clock.h']]], + ['kadc_5fclockasynchronousmode',['kADC_ClockAsynchronousMode',['../a00009.html#gga4a1dbe9dcaf32c1eaa98849da1217054a39fb72b080b55020c86ff26f3897e58a',1,'fsl_adc.h']]], + ['kadc_5fclocksynchronousmode',['kADC_ClockSynchronousMode',['../a00009.html#gga4a1dbe9dcaf32c1eaa98849da1217054a411d4bc42ea8ab76ee5d408610e5eaa9',1,'fsl_adc.h']]], + ['kadc_5fconvseqainterruptenable',['kADC_ConvSeqAInterruptEnable',['../a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0a729a5315c1792954ab9455cc6fdb324a',1,'fsl_adc.h']]], + ['kadc_5fconvseqainterruptflag',['kADC_ConvSeqAInterruptFlag',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a6387795dcc8897a8d256cdc4a005d1b7',1,'fsl_adc.h']]], + ['kadc_5fconvseqbinterruptenable',['kADC_ConvSeqBInterruptEnable',['../a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0ac8937ac90396e6c1ab8b3a8c83c530f8',1,'fsl_adc.h']]], + ['kadc_5fconvseqbinterruptflag',['kADC_ConvSeqBInterruptFlag',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ae98f97677a7acd69db8c3f1449eb59a2',1,'fsl_adc.h']]], + ['kadc_5fglobaloverrunflagforseqa',['kADC_GlobalOverrunFlagForSeqA',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a991137c98bcceb8aa70a1a0184117e04',1,'fsl_adc.h']]], + ['kadc_5fglobaloverrunflagforseqb',['kADC_GlobalOverrunFlagForSeqB',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a49619f2fea3c5946285d19531f70246b',1,'fsl_adc.h']]], + ['kadc_5fhighnegativeoffsetadded',['kADC_HighNegativeOffsetAdded',['../a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a7a88de53f3fa62d9c9d073619e6f7b77',1,'fsl_adc.h']]], + ['kadc_5fimpedance55kohm',['kADC_Impedance55kOhm',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a272bdcdc0d5ebca10a10d7f6927f031f',1,'fsl_adc.h']]], + ['kadc_5fimpedance621ohm',['kADC_Impedance621Ohm',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a5f5dc970993e744974494e283be79e2c',1,'fsl_adc.h']]], + ['kadc_5fimpedance87kohm',['kADC_Impedance87kOhm',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a4538ae9bd911369a26f43c1b5fa1150f',1,'fsl_adc.h']]], + ['kadc_5fintermediatenegativeoffsetadded',['kADC_IntermediateNegativeOffsetAdded',['../a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a705b5ce05ce8d2499b4ae652c138339b',1,'fsl_adc.h']]], + ['kadc_5finterruptforeachconversion',['kADC_InterruptForEachConversion',['../a00009.html#gga3948c83397f351b5ed70bbaf1c5da35ba0e0b964334a5fafa867734f43c9302d1',1,'fsl_adc.h']]], + ['kadc_5finterruptforeachsequence',['kADC_InterruptForEachSequence',['../a00009.html#gga3948c83397f351b5ed70bbaf1c5da35ba77c1e0c1efa82a0e1d23b38dcdc42e8d',1,'fsl_adc.h']]], + ['kadc_5flowpositiveoffsetadded',['kADC_LowPositiveOffsetAdded',['../a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5ad18ff3e548f2107156eb50a604d26ee5',1,'fsl_adc.h']]], + ['kadc_5fmultiplexetestmode',['kADC_MultiplexeTestMode',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23aa806598c66d17dadc451cfaab2e6af45',1,'fsl_adc.h']]], + ['kadc_5fnooffsetadded',['kADC_NoOffsetAdded',['../a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a524bba486c728e5af9ae263057fe7475',1,'fsl_adc.h']]], + ['kadc_5fnormalfunctionalmode',['kADC_NormalFunctionalMode',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a8792af738570ae4baa6f58baecc04eff',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn0',['kADC_OverrunFlagForChn0',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a0086e00d201a353a233cd570617b9128',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn1',['kADC_OverrunFlagForChn1',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aacd6f79515273a505a65a0dd5c8690b5',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn10',['kADC_OverrunFlagForChn10',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a373a8f9c3452766d74c2af2dd40a1dd4',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn11',['kADC_OverrunFlagForChn11',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a8d637176a1bcc96a375ac279ea15b046',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn2',['kADC_OverrunFlagForChn2',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aed73601435eac8f9bd001a220d19e751',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn3',['kADC_OverrunFlagForChn3',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a17a3e2ddfb6a1b82a873bb4fa23f33e8',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn4',['kADC_OverrunFlagForChn4',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1af4df6887691e65370852ca7a92d70ea9',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn5',['kADC_OverrunFlagForChn5',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a353d6e15f06ffc2b73459e5d9f8cc0be',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn6',['kADC_OverrunFlagForChn6',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ae41a39a8a1f2c74ce8641e22edd91704',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn7',['kADC_OverrunFlagForChn7',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ac9443c7ed6d4344ec7c9e3406b6e9dda',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn8',['kADC_OverrunFlagForChn8',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a3db46ecb1054e09a7ec16d5b9096022c',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn9',['kADC_OverrunFlagForChn9',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aabc9b70b8c8f836ce36bc5fb29b2638c',1,'fsl_adc.h']]], + ['kadc_5foverruninterruptenable',['kADC_OverrunInterruptEnable',['../a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0a81d0490f6a7b7fd8301c7af3162c9770',1,'fsl_adc.h']]], + ['kadc_5foverruninterruptflag',['kADC_OverrunInterruptFlag',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a648b51f9b03d99e58197f077323cada4',1,'fsl_adc.h']]], + ['kadc_5fpriorityhigh',['kADC_PriorityHigh',['../a00009.html#ggab625534aa39c1cd25f18cdc0dc3b9981a591af3687c8df2663d34e7d8ff942abe',1,'fsl_adc.h']]], + ['kadc_5fprioritylow',['kADC_PriorityLow',['../a00009.html#ggab625534aa39c1cd25f18cdc0dc3b9981aa47123e81ebbce4dd5905b0b93d0303d',1,'fsl_adc.h']]], + ['kadc_5fresolution10bitinforesultshift',['kADC_Resolution10bitInfoResultShift',['../a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28cca9923280b0a76bc961bed79aef5ecb0f3',1,'fsl_adc.h']]], + ['kadc_5fresolution12bitinforesultshift',['kADC_Resolution12bitInfoResultShift',['../a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28cca5925d865b6882eeef54d3389dc2e9f98',1,'fsl_adc.h']]], + ['kadc_5fresolution6bitinforesultshift',['kADC_Resolution6bitInfoResultShift',['../a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28ccaa51dfd6f4acca775dd0838c40eebe25e',1,'fsl_adc.h']]], + ['kadc_5fresolution8bitinforesultshift',['kADC_Resolution8bitInfoResultShift',['../a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28ccae60e431363f005f7830c1751ec9dbb3b',1,'fsl_adc.h']]], + ['kadc_5frst_5fn_5fshift_5frstn',['kADC_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a99e18503426294e439f4bb181a451999',1,'fsl_reset.h']]], + ['kadc_5fthresholdcompareaboverange',['kADC_ThresholdCompareAboveRange',['../a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a88f6c1b1c2081034a524d1f07bda8479',1,'fsl_adc.h']]], + ['kadc_5fthresholdcomparebelowrange',['kADC_ThresholdCompareBelowRange',['../a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a4957dc189299bb3397555dbb37991903',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn0',['kADC_ThresholdCompareFlagOnChn0',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a07b97b0e0329e40c1829ac1e54467279',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn1',['kADC_ThresholdCompareFlagOnChn1',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a5f66d1dcf413402eff0001649d32f853',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn10',['kADC_ThresholdCompareFlagOnChn10',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a50a526a957a500f1d1230856e5f62cb0',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn11',['kADC_ThresholdCompareFlagOnChn11',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a21a9e76ef0b99eb7970c72ca8f069aa7',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn2',['kADC_ThresholdCompareFlagOnChn2',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a0d600a9a25c74a6a50f013098ec2a7d6',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn3',['kADC_ThresholdCompareFlagOnChn3',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a85350dd974c40f8f90151461a5b8de7b',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn4',['kADC_ThresholdCompareFlagOnChn4',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aa0666658656409d16593317d233b7daf',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn5',['kADC_ThresholdCompareFlagOnChn5',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a2d05c841ef6de9ed853b2847fbd5b389',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn6',['kADC_ThresholdCompareFlagOnChn6',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aeab65543e48b53dcb43e6ef75bd4cefa',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn7',['kADC_ThresholdCompareFlagOnChn7',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a261489b6eaf9fd1c667f3b7730670c35',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn8',['kADC_ThresholdCompareFlagOnChn8',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a091532f8a931257bed8d481d746ce483',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn9',['kADC_ThresholdCompareFlagOnChn9',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aad52525faafab93597654764e5b76e97',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareinrange',['kADC_ThresholdCompareInRange',['../a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a0879cb322fa21eea083514475b2e5c92',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareinterruptflag',['kADC_ThresholdCompareInterruptFlag',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a33cf119645a07f65a85a0330e8caac59',1,'fsl_adc.h']]], + ['kadc_5fthresholdcrossingdownward',['kADC_ThresholdCrossingDownward',['../a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54ac5aec5587ce5a042aed8506c8e732422',1,'fsl_adc.h']]], + ['kadc_5fthresholdcrossingnodetected',['kADC_ThresholdCrossingNoDetected',['../a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54abf34f1a6b0ab0bb0338143eba9344156',1,'fsl_adc.h']]], + ['kadc_5fthresholdcrossingupward',['kADC_ThresholdCrossingUpward',['../a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54a84de2355e5d40cc75c1ac6e56feb7153',1,'fsl_adc.h']]], + ['kadc_5fthresholdinterruptdisabled',['kADC_ThresholdInterruptDisabled',['../a00009.html#ggac6aab6fdd21723cfc6ed4437372521aca9302e8f9009ba4561655bb2903156522',1,'fsl_adc.h']]], + ['kadc_5fthresholdinterruptoncrossing',['kADC_ThresholdInterruptOnCrossing',['../a00009.html#ggac6aab6fdd21723cfc6ed4437372521acab2db65594aeb9ce82f73ace49535d278',1,'fsl_adc.h']]], + ['kadc_5fthresholdinterruptonoutside',['kADC_ThresholdInterruptOnOutside',['../a00009.html#ggac6aab6fdd21723cfc6ed4437372521aca699feabaae444d40c7261e26a2872af8',1,'fsl_adc.h']]], + ['kadc_5ftriggerpolaritynegativeedge',['kADC_TriggerPolarityNegativeEdge',['../a00009.html#gga538fb95659082602d6ebb205f21573a5a2515d6b46f5b471d516ceff71dda5bb5',1,'fsl_adc.h']]], + ['kadc_5ftriggerpolaritypositiveedge',['kADC_TriggerPolarityPositiveEdge',['../a00009.html#gga538fb95659082602d6ebb205f21573a5a1e29943afcd9c5266a8401565798febe',1,'fsl_adc.h']]], + ['kbod_5finterruptlevel1',['kBod_InterruptLevel1',['../a00085.html#ggad856ab8003eb9953525518cddbc7814ca186e757d5a202f806afd889315af3639',1,'fsl_power.h']]], + ['kbod_5finterruptlevel2',['kBod_InterruptLevel2',['../a00085.html#ggad856ab8003eb9953525518cddbc7814ca2094c3f450488ea077bf45edabd227ba',1,'fsl_power.h']]], + ['kbod_5finterruptlevel3',['kBod_InterruptLevel3',['../a00085.html#ggad856ab8003eb9953525518cddbc7814cab28fa5a4937806aefbc4d259a419d354',1,'fsl_power.h']]], + ['kbod_5finterruptlevelreserved',['kBod_InterruptLevelReserved',['../a00085.html#ggad856ab8003eb9953525518cddbc7814cabc8bc042a952213b5364fcc75fb2e459',1,'fsl_power.h']]], + ['kbod_5fresetlevel1',['kBod_ResetLevel1',['../a00085.html#ggad4414c07be8e296fdf41c256e605c161a787770b2bcd6da51b910e61a4b1587a2',1,'fsl_power.h']]], + ['kbod_5fresetlevel2',['kBod_ResetLevel2',['../a00085.html#ggad4414c07be8e296fdf41c256e605c161a75c8d8c85c9703e637809b497e798615',1,'fsl_power.h']]], + ['kbod_5fresetlevel3',['kBod_ResetLevel3',['../a00085.html#ggad4414c07be8e296fdf41c256e605c161a6eb61ac24d5fe54b31f0c2089e5da750',1,'fsl_power.h']]], + ['kbod_5fresetlevelreserved',['kBod_ResetLevelReserved',['../a00085.html#ggad4414c07be8e296fdf41c256e605c161add73712f6ddad1995c9569ab44773f86',1,'fsl_power.h']]], + ['kcapt_5fbusystatusflag',['kCAPT_BusyStatusFlag',['../a00010.html#gga86048ff411e845cbde51d9324b5a4b0fa1a35bccccdc8b9c911a96a14f6413579',1,'fsl_capt.h']]], + ['kcapt_5fclk_5ffrom_5ffro',['kCAPT_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af1d8576caccfd1e48d121fae4315c10d',1,'fsl_clock.h']]], + ['kcapt_5fclk_5ffrom_5ffro_5fdiv',['kCAPT_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58abae02f94616cc17800067d5601943b5e',1,'fsl_clock.h']]], + ['kcapt_5fclk_5ffrom_5fmainclk',['kCAPT_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a28b61eb46fb752a05934e2d44450acc0',1,'fsl_clock.h']]], + ['kcapt_5fclk_5ffrom_5fsyspll',['kCAPT_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ab7e3ded84a0cb9fbc059b9d2604ba9c0',1,'fsl_clock.h']]], + ['kcapt_5fclk_5ffrom_5fwdtosc',['kCAPT_Clk_From_WdtOsc',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a1f6cedfc78cc220b123a36ae896c51c4',1,'fsl_clock.h']]], + ['kcapt_5fcomparatortriggermode',['kCAPT_ComparatorTriggerMode',['../a00010.html#gga0c1eb1e31ad34c8654c981a5e643e2c9a29ad6662e14cd08a6d3771ecbd591619',1,'fsl_capt.h']]], + ['kcapt_5fdmatriggeronallmode',['kCAPT_DMATriggerOnAllMode',['../a00010.html#gga0be2df04c72a8847673bcb6d9714866aae7dbcc430de0ec04afa4b600985bfaf7',1,'fsl_capt.h']]], + ['kcapt_5fdmatriggeronbothmode',['kCAPT_DMATriggerOnBothMode',['../a00010.html#gga0be2df04c72a8847673bcb6d9714866aac710d56353625bbc2ed100f6dc28111d',1,'fsl_capt.h']]], + ['kcapt_5fdmatriggerontouchmode',['kCAPT_DMATriggerOnTouchMode',['../a00010.html#gga0be2df04c72a8847673bcb6d9714866aacf5512e0ec996846318dc272e7366887',1,'fsl_capt.h']]], + ['kcapt_5finactivexpinsdrivenlowmode',['kCAPT_InactiveXpinsDrivenLowMode',['../a00010.html#gga01d767059334ad74d416f6c0287f101ba080299d9cd40fafc670901715422dbbc',1,'fsl_capt.h']]], + ['kcapt_5finactivexpinshighzmode',['kCAPT_InactiveXpinsHighZMode',['../a00010.html#gga01d767059334ad74d416f6c0287f101bac07d74a17c9f9d1b9119b89639f54b9b',1,'fsl_capt.h']]], + ['kcapt_5finterruptofnotouchenable',['kCAPT_InterruptOfNoTouchEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5afbc435647bf5d8ec4b8133bb54457d8b',1,'fsl_capt.h']]], + ['kcapt_5finterruptofnotouchstatusflag',['kCAPT_InterruptOfNoTouchStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0a1d4948f18e10cda189c9c9f89b76f0f8',1,'fsl_capt.h']]], + ['kcapt_5finterruptofoverrunenable',['kCAPT_InterruptOfOverRunEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5af27b5126282bcda28c64a9e9be550b88',1,'fsl_capt.h']]], + ['kcapt_5finterruptofoverrunstatusflag',['kCAPT_InterruptOfOverRunStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0ac64c1bc40831fc72981bb42514124e24',1,'fsl_capt.h']]], + ['kcapt_5finterruptofpolldoneenable',['kCAPT_InterruptOfPollDoneEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5ae4a63900c77ec1f5fae1ccea5ca30833',1,'fsl_capt.h']]], + ['kcapt_5finterruptofpolldonestatusflag',['kCAPT_InterruptOfPollDoneStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0afd67816e707734658900577dfbd4e2bc',1,'fsl_capt.h']]], + ['kcapt_5finterruptoftimeoutenable',['kCAPT_InterruptOfTimeOutEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5a2ce349ca4f3712664ea61a07cbadc63d',1,'fsl_capt.h']]], + ['kcapt_5finterruptoftimeoutstatusflag',['kCAPT_InterruptOfTimeOutStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0a84d8d50b7d358cbc9612a1751074ee15',1,'fsl_capt.h']]], + ['kcapt_5finterruptofyestouchenable',['kCAPT_InterruptOfYesTouchEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5ae1bd26a87ec4a5bb4c250856cf1c1994',1,'fsl_capt.h']]], + ['kcapt_5finterruptofyestouchstatusflag',['kCAPT_InterruptOfYesTouchStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0a404cfdab3986fef656232281d68a4e6b',1,'fsl_capt.h']]], + ['kcapt_5fmeasuredelaynowait',['kCAPT_MeasureDelayNoWait',['../a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dafe63c76a86da5c022a74985bd052a07f',1,'fsl_capt.h']]], + ['kcapt_5fmeasuredelaywait3fclks',['kCAPT_MeasureDelayWait3FCLKs',['../a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dae787b59b2f377b1ef65d0c13f45e757e',1,'fsl_capt.h']]], + ['kcapt_5fmeasuredelaywait5fclks',['kCAPT_MeasureDelayWait5FCLKs',['../a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dae746038d0fc4423106a252b02ec58ac2',1,'fsl_capt.h']]], + ['kcapt_5fmeasuredelaywait9fclks',['kCAPT_MeasureDelayWait9FCLKs',['../a00010.html#gga5ced51d15f9db8f1e6619a5859f6215da839864dc82a65aa09bccd6c672f23a80',1,'fsl_capt.h']]], + ['kcapt_5fpollcontinuousmode',['kCAPT_PollContinuousMode',['../a00010.html#gga43dfe06b3cce27e03b4b131557a5237baca7d1fdc5128af90a17c6e71a9133dda',1,'fsl_capt.h']]], + ['kcapt_5fpollinactivemode',['kCAPT_PollInactiveMode',['../a00010.html#gga43dfe06b3cce27e03b4b131557a5237ba70a38885a33a8996934ad68c3322df89',1,'fsl_capt.h']]], + ['kcapt_5fpollnowmode',['kCAPT_PollNowMode',['../a00010.html#gga43dfe06b3cce27e03b4b131557a5237ba50f00dbce20a1a3390c77501baccf4a0',1,'fsl_capt.h']]], + ['kcapt_5fresetdelaynowait',['kCAPT_ResetDelayNoWait',['../a00010.html#gga4394d9b57a062c83c444e391c4adf855a306721a69ff013b3f7784bb5d503fa1a',1,'fsl_capt.h']]], + ['kcapt_5fresetdelaywait3fclks',['kCAPT_ResetDelayWait3FCLKs',['../a00010.html#gga4394d9b57a062c83c444e391c4adf855a505d962a510aaf415ee47e6d92ca932c',1,'fsl_capt.h']]], + ['kcapt_5fresetdelaywait5fclks',['kCAPT_ResetDelayWait5FCLKs',['../a00010.html#gga4394d9b57a062c83c444e391c4adf855aadd3a0bd70e2f2795032fc953d97c677',1,'fsl_capt.h']]], + ['kcapt_5fresetdelaywait9fclks',['kCAPT_ResetDelayWait9FCLKs',['../a00010.html#gga4394d9b57a062c83c444e391c4adf855a4d1bfa8129b289d5fe1f56dd980343ea',1,'fsl_capt.h']]], + ['kcapt_5frst_5fn_5fshift_5frstn',['kCAPT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a6946809531736fcf4d7067e31f73813b',1,'fsl_reset.h']]], + ['kcapt_5fx0pin',['kCAPT_X0Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ad4b60dd2d35d11a91c11630a7fe91640',1,'fsl_capt.h']]], + ['kcapt_5fx10pin',['kCAPT_X10Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a72314787f99f4a5ba7e51c1445fe65f2',1,'fsl_capt.h']]], + ['kcapt_5fx11pin',['kCAPT_X11Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a53723bf555f64a437f12dff73e7f2188',1,'fsl_capt.h']]], + ['kcapt_5fx12pin',['kCAPT_X12Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a5ce0c1dfcdfb869146b24d9270edefdc',1,'fsl_capt.h']]], + ['kcapt_5fx13pin',['kCAPT_X13Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a02ca618c220ce6b97354404817051716',1,'fsl_capt.h']]], + ['kcapt_5fx14pin',['kCAPT_X14Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a88058e395307862a638c86eaf6528c96',1,'fsl_capt.h']]], + ['kcapt_5fx15pin',['kCAPT_X15Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a3c578a968a4c45b41436d845f456a142',1,'fsl_capt.h']]], + ['kcapt_5fx1pin',['kCAPT_X1Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ac39fdef6bb40a142936848a676f02e49',1,'fsl_capt.h']]], + ['kcapt_5fx2pin',['kCAPT_X2Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ab8afeb42a5dc990d1114d333e05851e0',1,'fsl_capt.h']]], + ['kcapt_5fx3pin',['kCAPT_X3Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a4553067b9caa5fd98c1d01074891f5ee',1,'fsl_capt.h']]], + ['kcapt_5fx4pin',['kCAPT_X4Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5aaccaeef5cb7c021878c1d7c4f5034a76',1,'fsl_capt.h']]], + ['kcapt_5fx5pin',['kCAPT_X5Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a1a48e4c212d0be7fa18b7d325afc86ed',1,'fsl_capt.h']]], + ['kcapt_5fx6pin',['kCAPT_X6Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a3ede3850cc844875718179e5a1008900',1,'fsl_capt.h']]], + ['kcapt_5fx7pin',['kCAPT_X7Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a88ef286dbf5a39b6ee66968632a28efe',1,'fsl_capt.h']]], + ['kcapt_5fx8pin',['kCAPT_X8Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a9801372f0a31c85b186120eea0c658f8',1,'fsl_capt.h']]], + ['kcapt_5fx9pin',['kCAPT_X9Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a85bab394942771628a37eb7b0fd5998f',1,'fsl_capt.h']]], + ['kcapt_5fxmaxstatusflag',['kCAPT_XMAXStatusFlag',['../a00010.html#gga86048ff411e845cbde51d9324b5a4b0fa9210dee59a14aaec97257fac9a20ae9c',1,'fsl_capt.h']]], + ['kcapt_5fyhporttriggermode',['kCAPT_YHPortTriggerMode',['../a00010.html#gga0c1eb1e31ad34c8654c981a5e643e2c9aba5349742fd4b19f8a7ccc0bdc9cb514',1,'fsl_capt.h']]], + ['kclkout_5ffrom_5fextclk',['kCLKOUT_From_ExtClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a8671f2c92f6e049ed8b2f3b7a5b9b296',1,'fsl_clock.h']]], + ['kclkout_5ffrom_5ffro',['kCLKOUT_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af2ea89b865003dc40f8923f67d7bb366',1,'fsl_clock.h']]], + ['kclkout_5ffrom_5fmainclk',['kCLKOUT_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a20d47beaa61ee59b61c34fa4f7e30d21',1,'fsl_clock.h']]], + ['kclkout_5ffrom_5fsyspll',['kCLKOUT_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58aa5b46ff93c42325f2c8d93b1bfbd2555',1,'fsl_clock.h']]], + ['kclkout_5ffrom_5fwdtosc',['kCLKOUT_From_WdtOsc',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a473a6161d9f0f5f580c2e8b913694831',1,'fsl_clock.h']]], + ['kclock_5facmp',['kCLOCK_Acmp',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da5c44f9347603d8c7fd8eda74e3b3e40f',1,'fsl_clock.h']]], + ['kclock_5fadc',['kCLOCK_Adc',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da2bc16e3ee343b4abfc46ae9506461e97',1,'fsl_clock.h']]], + ['kclock_5fcapt',['kCLOCK_Capt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da0ffae7aa0d9dbc52524beb5f82ced038',1,'fsl_clock.h']]], + ['kclock_5fcoresysclk',['kCLOCK_CoreSysClk',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a1de4a40f5399eb025d5faefda7491918',1,'fsl_clock.h']]], + ['kclock_5fcrc',['kCLOCK_Crc',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daa1cfbe8497997fc6dff0d7f0c070aa5a',1,'fsl_clock.h']]], + ['kclock_5fctimer0',['kCLOCK_Ctimer0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dad2e9ebc3825a65fae3c13efbc805a128',1,'fsl_clock.h']]], + ['kclock_5fdac0',['kCLOCK_Dac0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daea833e6e503de81899699c1bb23d774b',1,'fsl_clock.h']]], + ['kclock_5fdac1',['kCLOCK_Dac1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da9f0fcaa6854d2b404e0b67a2239893ae',1,'fsl_clock.h']]], + ['kclock_5fdivadcclk',['kCLOCK_DivAdcClk',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca7b3998fdf96eb884e35ff56f40feffbd',1,'fsl_clock.h']]], + ['kclock_5fdivclkout',['kCLOCK_DivClkOut',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872caa7236a2c00237ca7ee5b2ff55058ded6',1,'fsl_clock.h']]], + ['kclock_5fdivsctclk',['kCLOCK_DivSctClk',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872caa6c1d0bc0cb2e70e5801d2d2a55d6150',1,'fsl_clock.h']]], + ['kclock_5fdma',['kCLOCK_Dma',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daabce09bc09630409474602bc5eab7c10',1,'fsl_clock.h']]], + ['kclock_5fextclk',['kCLOCK_ExtClk',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a30e6333c132740b84bf2ce94b8c44a8f',1,'fsl_clock.h']]], + ['kclock_5ffrg0',['kCLOCK_Frg0',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3aa27972710b7df62d66918584843aee06',1,'fsl_clock.h']]], + ['kclock_5ffrg1',['kCLOCK_Frg1',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a5aeefcf41548bb4dd09f1e17f39da7e0',1,'fsl_clock.h']]], + ['kclock_5ffro',['kCLOCK_Fro',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a01a946b874db04d12aba4c3bbe461580',1,'fsl_clock.h']]], + ['kclock_5ffrodiv',['kCLOCK_FroDiv',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a01d0c099adda9e435281c887b12095a8',1,'fsl_clock.h']]], + ['kclock_5ffrooscout18m',['kCLOCK_FroOscOut18M',['../a00011.html#gga85bf7440c0d77269e3db764083110334a60f89d729c96295d1aaa741a412d58ab',1,'fsl_clock.h']]], + ['kclock_5ffrooscout24m',['kCLOCK_FroOscOut24M',['../a00011.html#gga85bf7440c0d77269e3db764083110334a01135115df0c0b0525f2b1391ee9d9ca',1,'fsl_clock.h']]], + ['kclock_5ffrooscout30m',['kCLOCK_FroOscOut30M',['../a00011.html#gga85bf7440c0d77269e3db764083110334a29c4fdcb48fba40928b278765d0e3843',1,'fsl_clock.h']]], + ['kclock_5ffrosrcfroosc',['kCLOCK_FroSrcFroOsc',['../a00011.html#gga9ff656514a680eef6ffbf40f4eef0bfba931823a2fb900cbf75da504129ef8d91',1,'fsl_clock.h']]], + ['kclock_5ffrosrclpwrbootvalue',['kCLOCK_FroSrcLpwrBootValue',['../a00011.html#gga9ff656514a680eef6ffbf40f4eef0bfba98131c5eeabd0e169e93b174aebdcf86',1,'fsl_clock.h']]], + ['kclock_5fgpio0',['kCLOCK_Gpio0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da9ec19029dc1ad34cb7ae0091e97b7f7d',1,'fsl_clock.h']]], + ['kclock_5fgpio1',['kCLOCK_Gpio1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da72b9be69422d94586bf09e6bd3d2632a',1,'fsl_clock.h']]], + ['kclock_5fgpioint',['kCLOCK_GpioInt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da3922459ccb3f2fd90ac39813c0dc39f0',1,'fsl_clock.h']]], + ['kclock_5fi2c0',['kCLOCK_I2c0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dac6e6ee6e9f7b28e5c3818324c852b05f',1,'fsl_clock.h']]], + ['kclock_5fi2c1',['kCLOCK_I2c1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da689e957d82ca723a1a0cc671ba216bf5',1,'fsl_clock.h']]], + ['kclock_5fi2c2',['kCLOCK_I2c2',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da239422d8b3e53afadaf651015ffb5065',1,'fsl_clock.h']]], + ['kclock_5fi2c3',['kCLOCK_I2c3',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da5f0100f89ed9f83b8eb76dc0de0d08fd',1,'fsl_clock.h']]], + ['kclock_5fiocon',['kCLOCK_Iocon',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da909ccfe84f4275dd7b6ba09235583230',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv0',['kCLOCK_IOCONCLKDiv0',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca8ffa1d0afc3fa83f1d5bd563ba2329a2',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv1',['kCLOCK_IOCONCLKDiv1',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872cacec00650d4292d94c3aa236bf33b7fb4',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv2',['kCLOCK_IOCONCLKDiv2',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca2540a6d8147d6328653834c72c62f6d5',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv3',['kCLOCK_IOCONCLKDiv3',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca87f8cd7b1b138c47af69a0bb106d70f8',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv4',['kCLOCK_IOCONCLKDiv4',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca05fc477260e0f901a194bed1762e388c',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv5',['kCLOCK_IOCONCLKDiv5',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872cabdbfc756defca27f8444ebccc928eae5',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv6',['kCLOCK_IOCONCLKDiv6',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca3f4c007e9c6a7cf58407f8f0974b7900',1,'fsl_clock.h']]], + ['kclock_5fipinvalid',['kCLOCK_IpInvalid',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da11dd047399d3cf7893682897e34682de',1,'fsl_clock.h']]], + ['kclock_5fmainclk',['kCLOCK_MainClk',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a86d48329b3492ab94a5da3925c73622f',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcextclk',['kCLOCK_MainClkSrcExtClk',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4a85dbf0a96c672abcfbc08dfc231088d6',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcfro',['kCLOCK_MainClkSrcFro',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4a0aecd9451c5bf4525fe17a7b4734f58f',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcfrodiv',['kCLOCK_MainClkSrcFroDiv',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4afa92bbf8fcfb74ceea172667409f7643',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcsyspll',['kCLOCK_MainClkSrcSysPll',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4aa4b20f43266422065fa678e4e9ee6e92',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcwdtosc',['kCLOCK_MainClkSrcWdtOsc',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4ab6adbaab8fe4761c0fb828aa7066bd80',1,'fsl_clock.h']]], + ['kclock_5fmrt',['kCLOCK_Mrt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daace73b709cda5c34ba5bdf6888605f1f',1,'fsl_clock.h']]], + ['kclock_5fmtb',['kCLOCK_Mtb',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da82cabf9d7a17650616d227b23ab2a35a',1,'fsl_clock.h']]], + ['kclock_5fpllout',['kCLOCK_PllOut',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a2c5ccaeff2df0dc3c67a5aa36e5576d3',1,'fsl_clock.h']]], + ['kclock_5fram0_5f1',['kCLOCK_Ram0_1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da02834dc4dbeb1ca14211279916182425',1,'fsl_clock.h']]], + ['kclock_5from',['kCLOCK_Rom',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da1b9f348e8d5bc1715af7366be3ca87c7',1,'fsl_clock.h']]], + ['kclock_5fsct',['kCLOCK_Sct',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da7b405d8427fbdfbf1a7f910f828d8ed6',1,'fsl_clock.h']]], + ['kclock_5fspi0',['kCLOCK_Spi0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dac6997ec12e66b5e4fad9aa52ef6a2db0',1,'fsl_clock.h']]], + ['kclock_5fspi1',['kCLOCK_Spi1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dadd0ceacddcfe95c6e7c8bbcfd2f4ca60',1,'fsl_clock.h']]], + ['kclock_5fswm',['kCLOCK_Swm',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da63bcbbef2627c667b204eae91c3a0718',1,'fsl_clock.h']]], + ['kclock_5fsyspllsrcextclk',['kCLOCK_SysPllSrcExtClk',['../a00011.html#gga04c66d991cdc5cb35e31c27881bc549bad5b4cf5a82ac9fdac6b51d63723b2f8e',1,'fsl_clock.h']]], + ['kclock_5fsyspllsrcfro',['kCLOCK_SysPllSrcFRO',['../a00011.html#gga04c66d991cdc5cb35e31c27881bc549ba1f337e9ad4557c3916c55340676c2b8e',1,'fsl_clock.h']]], + ['kclock_5fsyspllsrcfrodiv',['kCLOCK_SysPllSrcFroDiv',['../a00011.html#gga04c66d991cdc5cb35e31c27881bc549bab45a2c903d5f052fb055b96793bde296',1,'fsl_clock.h']]], + ['kclock_5fsyspllsrcwdtosc',['kCLOCK_SysPllSrcWdtOsc',['../a00011.html#gga04c66d991cdc5cb35e31c27881bc549ba888e842686be1af0ded28719bf24d0a8',1,'fsl_clock.h']]], + ['kclock_5fuart0',['kCLOCK_Uart0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da26876b4bdecc15c46c379a289441b3c6',1,'fsl_clock.h']]], + ['kclock_5fuart1',['kCLOCK_Uart1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da1d4898f8634e2f18e6a154e2b1a4120e',1,'fsl_clock.h']]], + ['kclock_5fuart2',['kCLOCK_Uart2',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daf079522d21082e83bd0192040a103e8b',1,'fsl_clock.h']]], + ['kclock_5fuart3',['kCLOCK_Uart3',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da2073aacb108d570b5cd4099d6294d74d',1,'fsl_clock.h']]], + ['kclock_5fuart4',['kCLOCK_Uart4',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da9e86fefe81e4318044e0f234b3df97b0',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq0hz',['kCLOCK_WdtAnaFreq0HZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ac6cc9f4ed8bbf5bec37add7161537d1d',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq1050khz',['kCLOCK_WdtAnaFreq1050KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a261a52fc17b6e0652c7f87470de1de8d',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq1400khz',['kCLOCK_WdtAnaFreq1400KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a9f301770a8bc08fb5acbf32b46d8521c',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq1750khz',['kCLOCK_WdtAnaFreq1750KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ace0a3b71f10ba38150ee5622e8ce3690',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq2100khz',['kCLOCK_WdtAnaFreq2100KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6abd3904f3cdbf1323d1e49d2807f3fa5e',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq2400khz',['kCLOCK_WdtAnaFreq2400KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a09f8f2b77ad4804c199404df2f9ea50f',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq2700khz',['kCLOCK_WdtAnaFreq2700KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ad12681c88e869163d4aed173ff0e6c64',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq3000khz',['kCLOCK_WdtAnaFreq3000KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a4c1c5972ed4ae79fad8e02a56031c002',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq3250khz',['kCLOCK_WdtAnaFreq3250KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a98d3b066806df88b3c330005da251ecf',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq3500khz',['kCLOCK_WdtAnaFreq3500KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6abe6204f4fa5c74e82d3bf0dd5a61c914',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq3750khz',['kCLOCK_WdtAnaFreq3750KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6afb2f3adebaed700221c6c93f113a2a90',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq4000khz',['kCLOCK_WdtAnaFreq4000KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6aff64cf52ab7c013a83fbf131a864614f',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq4200khz',['kCLOCK_WdtAnaFreq4200KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ad4169afafb522bc5829d1df64170e346',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq4400khz',['kCLOCK_WdtAnaFreq4400KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ad4547d866fcc745745ce5e31434eb099',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq4600khz',['kCLOCK_WdtAnaFreq4600KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a762e9bc889c580c8a5083c51869f19c8',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq600khz',['kCLOCK_WdtAnaFreq600KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ac176648f32c98ffae06e1dbe90775923',1,'fsl_clock.h']]], + ['kclock_5fwdtosc',['kCLOCK_WdtOsc',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a18a8be3e9ab0fd908821ff17940317c6',1,'fsl_clock.h']]], + ['kclock_5fwkt',['kCLOCK_Wkt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dad386313192805ba225b0da24e078d387',1,'fsl_clock.h']]], + ['kclock_5fwwdt',['kCLOCK_Wwdt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daf1e8b91e80a3a9a4db038c0b4cf7e381',1,'fsl_clock.h']]], + ['kcrc_5fpolynomial_5fcrc_5f16',['kCRC_Polynomial_CRC_16',['../a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da4a13840f3031b3aed89f60ba37a34c8b',1,'fsl_crc.h']]], + ['kcrc_5fpolynomial_5fcrc_5f32',['kCRC_Polynomial_CRC_32',['../a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da12ca2ee766202eb962135c76c00b10aa',1,'fsl_crc.h']]], + ['kcrc_5fpolynomial_5fcrc_5fccitt',['kCRC_Polynomial_CRC_CCITT',['../a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da9ef1c3d85d4f13199e7df63d170bf6f6',1,'fsl_crc.h']]], + ['kcrc_5frst_5fshift_5frstn',['kCRC_RST_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a194baa96cd93ef108f2724fa98352387',1,'fsl_reset.h']]], + ['kctimer0_5frst_5fn_5fshift_5frstn',['kCTIMER0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a900b1deecf2f2316b30e40ff81330499',1,'fsl_reset.h']]], + ['kctimer_5fcapture0flag',['kCTIMER_Capture0Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a5504b0ec94b832a46824ec297a106df1',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture0interruptenable',['kCTIMER_Capture0InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a5fe0ea705babd6351564e59c8db8e928',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture1flag',['kCTIMER_Capture1Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60af3a0db73d48116ea419af737c706b30b',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture1interruptenable',['kCTIMER_Capture1InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a5d70800d3cc33733d42f525242edbbf4',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture2flag',['kCTIMER_Capture2Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60aaf0224295d4f330d0d61d10ab30f38ea',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture2interruptenable',['kCTIMER_Capture2InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a68a56db3574cd0ea3bb783c7d13f0894',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5f0',['kCTIMER_Capture_0',['../a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3faa13dee3bb29b8962385da2ac6d8dc938',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5f1',['kCTIMER_Capture_1',['../a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3fac4fcf23f15faa447489ef7ccc4d6cb25',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5f2',['kCTIMER_Capture_2',['../a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3fa9d6d30f6a5498d009cd87fafee3bccd5',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5fbothedge',['kCTIMER_Capture_BothEdge',['../a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638ab73ca62f50120abc4662c750925e9b5a',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5ffalledge',['kCTIMER_Capture_FallEdge',['../a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638a18a0af674c980ebbdfd0413dcfa3f3c0',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5friseedge',['kCTIMER_Capture_RiseEdge',['../a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638ac8297b7a4be687e63200fc22be1d2f02',1,'fsl_ctimer.h']]], + ['kctimer_5fexternal_5fmatch_5f0',['kCTIMER_External_Match_0',['../a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29a42b2f4d5cb9a524f87f6626169155207',1,'fsl_ctimer.h']]], + ['kctimer_5fexternal_5fmatch_5f1',['kCTIMER_External_Match_1',['../a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29a90643d7c03749f64e0d20cfcf55a80ed',1,'fsl_ctimer.h']]], + ['kctimer_5fexternal_5fmatch_5f2',['kCTIMER_External_Match_2',['../a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29ab4602750f83eba0e5cebd0f2ed91a3c4',1,'fsl_ctimer.h']]], + ['kctimer_5fexternal_5fmatch_5f3',['kCTIMER_External_Match_3',['../a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29aba7194efe10386e467b082fc0b847031',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch0flag',['kCTIMER_Match0Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60ad76fd4735e0604307b50d2fd12cba3c0',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch0interruptenable',['kCTIMER_Match0InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a05694ae09ff514b7237388b33acaaa99',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch1flag',['kCTIMER_Match1Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a901042ca905603329df3cf1d316a2e53',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch1interruptenable',['kCTIMER_Match1InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a47f020e940359f6f08c5c8171d2942b9',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch2flag',['kCTIMER_Match2Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60af5a6c5ee43a01803e82c26181dedfa97',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch2interruptenable',['kCTIMER_Match2InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2ab15c129ca07d334ae13d77e0646c7287',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch3flag',['kCTIMER_Match3Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a02e58518795f05162313b509a600a3d3',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch3interruptenable',['kCTIMER_Match3InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a1f67c8c1e8039ca326e9f25fabffdd0d',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch_5f0',['kCTIMER_Match_0',['../a00013.html#ggae60f7d34c9e499abba96e5979ee1818dac06fa7bc66bbb978bc14348fc0cb4633',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch_5f1',['kCTIMER_Match_1',['../a00013.html#ggae60f7d34c9e499abba96e5979ee1818da38a7356dba8d8a5a8877e9de9fde2faf',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch_5f2',['kCTIMER_Match_2',['../a00013.html#ggae60f7d34c9e499abba96e5979ee1818da98b35c6f057b201073c8afa4bdce60ed',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch_5f3',['kCTIMER_Match_3',['../a00013.html#ggae60f7d34c9e499abba96e5979ee1818da6acca2e2ccd6cc6d08a3d958e47c80fb',1,'fsl_ctimer.h']]], + ['kctimer_5fmultiplecallback',['kCTIMER_MultipleCallback',['../a00013.html#gga740677adee6ada817bb45ed62607c3c4a38d629ce598178fd96f48660e63ae1e7',1,'fsl_ctimer.h']]], + ['kctimer_5foutput_5fclear',['kCTIMER_Output_Clear',['../a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143ca2086fd6712693ac8f0758553ff7bb3d3',1,'fsl_ctimer.h']]], + ['kctimer_5foutput_5fnoaction',['kCTIMER_Output_NoAction',['../a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143cac387e950c7d8c19c1464dd27e5c7396f',1,'fsl_ctimer.h']]], + ['kctimer_5foutput_5fset',['kCTIMER_Output_Set',['../a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143cae1b0b02fe1e0af81f62fb40ff8339b8f',1,'fsl_ctimer.h']]], + ['kctimer_5foutput_5ftoggle',['kCTIMER_Output_Toggle',['../a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143ca4ad940f7bea1dbae09b156ec0415f5f2',1,'fsl_ctimer.h']]], + ['kctimer_5fsinglecallback',['kCTIMER_SingleCallback',['../a00013.html#gga740677adee6ada817bb45ed62607c3c4af805d881e4dc37e339a8434c1816f930',1,'fsl_ctimer.h']]], + ['kdac0_5frst_5fn_5fshift_5frstn',['kDAC0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a25d5f742c3cbcf85a4e9c388c5c9e708',1,'fsl_reset.h']]], + ['kdac1_5frst_5fn_5fshift_5frstn',['kDAC1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aba3fb61d22a1e6b912b002bc592b3f1f',1,'fsl_reset.h']]], + ['kdac_5fsettlingtimeis1us',['kDAC_SettlingTimeIs1us',['../a00014.html#gga82eecb700b3afeda8b95a6151d8904fca302776aaf6d8780d9b57e9f910615d6f',1,'fsl_dac.h']]], + ['kdac_5fsettlingtimeis25us',['kDAC_SettlingTimeIs25us',['../a00014.html#gga82eecb700b3afeda8b95a6151d8904fcad460e5e0da52ad16bf771892ebfce1f8',1,'fsl_dac.h']]], + ['kdma_5faddressinterleave0xwidth',['kDMA_AddressInterleave0xWidth',['../a00015.html#ggabc6126af1d45847bc59afa0aa3216b04ad9802a5e2f1df9d748838e6e23e0279b',1,'fsl_dma.h']]], + ['kdma_5faddressinterleave1xwidth',['kDMA_AddressInterleave1xWidth',['../a00015.html#ggabc6126af1d45847bc59afa0aa3216b04a84af12bf3a826e9f4725ae5bb4bbebb8',1,'fsl_dma.h']]], + ['kdma_5faddressinterleave2xwidth',['kDMA_AddressInterleave2xWidth',['../a00015.html#ggabc6126af1d45847bc59afa0aa3216b04ad703190659614263db03cea5d2dfbb6e',1,'fsl_dma.h']]], + ['kdma_5faddressinterleave4xwidth',['kDMA_AddressInterleave4xWidth',['../a00015.html#ggabc6126af1d45847bc59afa0aa3216b04aecf2cec42cd7819983e265710c691888',1,'fsl_dma.h']]], + ['kdma_5fburstsize1',['kDMA_BurstSize1',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eafa3126f29988635183fa3851e1ee1f2d',1,'fsl_dma.h']]], + ['kdma_5fburstsize1024',['kDMA_BurstSize1024',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eaf12e2d1fe9b0fccba12b6cad6bc685b3',1,'fsl_dma.h']]], + ['kdma_5fburstsize128',['kDMA_BurstSize128',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ea3c0044f4c389c21f73b08dbb0b8ef829',1,'fsl_dma.h']]], + ['kdma_5fburstsize16',['kDMA_BurstSize16',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ead6487c57cdb11ae590172c2ff1364ca8',1,'fsl_dma.h']]], + ['kdma_5fburstsize2',['kDMA_BurstSize2',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ea3144a4ab7b2408051fc06ab07b583eab',1,'fsl_dma.h']]], + ['kdma_5fburstsize256',['kDMA_BurstSize256',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eac03b658552cde955b815365386e40a70',1,'fsl_dma.h']]], + ['kdma_5fburstsize32',['kDMA_BurstSize32',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eae05054c8a11020169733c22349aa158e',1,'fsl_dma.h']]], + ['kdma_5fburstsize4',['kDMA_BurstSize4',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eac5b15e2705b1295a56557036487d291b',1,'fsl_dma.h']]], + ['kdma_5fburstsize512',['kDMA_BurstSize512',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ea491cc51131bb7e9dcd647e54ec8549e7',1,'fsl_dma.h']]], + ['kdma_5fburstsize64',['kDMA_BurstSize64',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eacb974685c9968ac9dbf74035ecf23bb6',1,'fsl_dma.h']]], + ['kdma_5fburstsize8',['kDMA_BurstSize8',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ea7aacfca8b6c86bdd0e727b0c8ae046b1',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority0',['kDMA_ChannelPriority0',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fafaf9bf976bb9d2db3bd2f629cd545f45',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority1',['kDMA_ChannelPriority1',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fa6ff9161839b0b5e675b01353a684a63f',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority2',['kDMA_ChannelPriority2',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fa259e4e6cf7b6b79608abbe1769e262fe',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority3',['kDMA_ChannelPriority3',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fa8615d84237aa24c16fdc1675cc932efb',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority4',['kDMA_ChannelPriority4',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fae7f6c72a518bc4c68b3be696da1a872d',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority5',['kDMA_ChannelPriority5',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fa08b83d1381be3c10688f449c9bf90fc4',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority6',['kDMA_ChannelPriority6',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77facc5b892b2bcf8a632acb64e9c5645273',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority7',['kDMA_ChannelPriority7',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77faf238cfde678fdbd26a054fc055f40a4d',1,'fsl_dma.h']]], + ['kdma_5fdstwrap',['kDMA_DstWrap',['../a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82afaae8afb83546031e25b0ac5e6494f2b',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer1',['kDMA_EdgeBurstTransfer1',['../a00015.html#gga776b1091528ddc2571284f481ddde830af06ebd49d4066394642c80ece815d55b',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer1024',['kDMA_EdgeBurstTransfer1024',['../a00015.html#gga776b1091528ddc2571284f481ddde830a6aae117efdce18b2c054ddae971559da',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer128',['kDMA_EdgeBurstTransfer128',['../a00015.html#gga776b1091528ddc2571284f481ddde830af2c60c5f0dcbd8bd7d782a7c08c87f0b',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer16',['kDMA_EdgeBurstTransfer16',['../a00015.html#gga776b1091528ddc2571284f481ddde830a0641c94c5e494890f587f3cb60ed7800',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer2',['kDMA_EdgeBurstTransfer2',['../a00015.html#gga776b1091528ddc2571284f481ddde830af0ab73a40234a51b14203e7d83621ac9',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer256',['kDMA_EdgeBurstTransfer256',['../a00015.html#gga776b1091528ddc2571284f481ddde830a8640003c589e5d3ffd94d4cd962b8456',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer32',['kDMA_EdgeBurstTransfer32',['../a00015.html#gga776b1091528ddc2571284f481ddde830af1764eeb6c94e0e1f86529bf6210c524',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer4',['kDMA_EdgeBurstTransfer4',['../a00015.html#gga776b1091528ddc2571284f481ddde830a42eb0fe4fd6b2030e64b5d0173c93c68',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer512',['kDMA_EdgeBurstTransfer512',['../a00015.html#gga776b1091528ddc2571284f481ddde830a0ef881d258e59978faca416630fb1a74',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer64',['kDMA_EdgeBurstTransfer64',['../a00015.html#gga776b1091528ddc2571284f481ddde830a8dec3f95cf71d668439e065b17f27235',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer8',['kDMA_EdgeBurstTransfer8',['../a00015.html#gga776b1091528ddc2571284f481ddde830a4858703ddbc176a60c3015f23a490e17',1,'fsl_dma.h']]], + ['kdma_5ffallingedgetrigger',['kDMA_FallingEdgeTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427a9b9f27849a8e3cf715e30a29b4ba1d04',1,'fsl_dma.h']]], + ['kdma_5fhighleveltrigger',['kDMA_HighLevelTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427a4636793fc071ed9f8e753e84a6e12f85',1,'fsl_dma.h']]], + ['kdma_5finta',['kDMA_IntA',['../a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11ab39861058eb1c9573babd0752286ea48',1,'fsl_dma.h']]], + ['kdma_5fintb',['kDMA_IntB',['../a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11a50cabcc60fb8dc805c62070318fe0c97',1,'fsl_dma.h']]], + ['kdma_5finterror',['kDMA_IntError',['../a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11a28e17f00c59b3dde88943be07a8902bd',1,'fsl_dma.h']]], + ['kdma_5flevelbursttransfer',['kDMA_LevelBurstTransfer',['../a00015.html#gga776b1091528ddc2571284f481ddde830aa6cc38822f852f1ddd1f22c5b79949b8',1,'fsl_dma.h']]], + ['kdma_5flowleveltrigger',['kDMA_LowLevelTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427aca6b545d2f8661404c932a70b8a5abcf',1,'fsl_dma.h']]], + ['kdma_5fmemorytomemory',['kDMA_MemoryToMemory',['../a00015.html#gga9cb7087af6efc80106c1033f80d60219a24392a93deeb55e04559201839343f3c',1,'fsl_dma.h']]], + ['kdma_5fmemorytoperipheral',['kDMA_MemoryToPeripheral',['../a00015.html#gga9cb7087af6efc80106c1033f80d60219aae1c6bab576d7a25d2fa1249f9cd4ee9',1,'fsl_dma.h']]], + ['kdma_5fnotrigger',['kDMA_NoTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427ae45693316c3b50f21a0fa93e539e9ae5',1,'fsl_dma.h']]], + ['kdma_5fnowrap',['kDMA_NoWrap',['../a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82a99b1a9eb98902b9277c2ae64f48e5a88',1,'fsl_dma.h']]], + ['kdma_5fperipheraltomemory',['kDMA_PeripheralToMemory',['../a00015.html#gga9cb7087af6efc80106c1033f80d60219a7bf1938ae68b1f494aade7a0f4189303',1,'fsl_dma.h']]], + ['kdma_5frisingedgetrigger',['kDMA_RisingEdgeTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427aa4d1b3c95a9ca3d756d2f68a3bb0afc8',1,'fsl_dma.h']]], + ['kdma_5frst_5fn_5fshift_5frstn',['kDMA_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a8dbbba3532e3e597133ebc8a55bdd1e7',1,'fsl_reset.h']]], + ['kdma_5fsingletransfer',['kDMA_SingleTransfer',['../a00015.html#gga776b1091528ddc2571284f481ddde830aa5f7edec7506a38b3b57d04dd774b0b0',1,'fsl_dma.h']]], + ['kdma_5fsrcanddstwrap',['kDMA_SrcAndDstWrap',['../a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82a543352fa3896623517af17829598eb0c',1,'fsl_dma.h']]], + ['kdma_5fsrcwrap',['kDMA_SrcWrap',['../a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82ac0ab79249ad0e6bf887498d0f3e3db90',1,'fsl_dma.h']]], + ['kdma_5fstatictostatic',['kDMA_StaticToStatic',['../a00015.html#gga9cb7087af6efc80106c1033f80d60219af59909afb24e786824cfecdb6afd0da8',1,'fsl_dma.h']]], + ['kdma_5ftransfer16bitwidth',['kDMA_Transfer16BitWidth',['../a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca5b38513482d6d6d92927898f9e2c7703',1,'fsl_dma.h']]], + ['kdma_5ftransfer32bitwidth',['kDMA_Transfer32BitWidth',['../a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca1a43c564953a0e097907e45cd159c265',1,'fsl_dma.h']]], + ['kdma_5ftransfer8bitwidth',['kDMA_Transfer8BitWidth',['../a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca80c88f3fbb3bb2946149c0ec7a7e922a',1,'fsl_dma.h']]], + ['kext_5fclk_5ffrom_5fclkin',['kEXT_Clk_From_ClkIn',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a22fcfa5a6ecb31823d0019891a10e825',1,'fsl_clock.h']]], + ['kext_5fclk_5ffrom_5fsysosc',['kEXT_Clk_From_SysOsc',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a2e3cfcd9f9e0255bee678609d2a03459',1,'fsl_clock.h']]], + ['kflash_5fiap_5fthreesystemclocktime',['kFlash_IAP_ThreeSystemClockTime',['../a00088.html#gga0efb897bafe816a8a87d92045a78ee9ba14466fd6ca33233907a499072ed0ea04',1,'fsl_iap.h']]], + ['kflash_5fiap_5ftwosystemclocktime',['kFlash_IAP_TwoSystemClockTime',['../a00088.html#gga0efb897bafe816a8a87d92045a78ee9ba0576e02942748ad3a4b1bb0904267ad4',1,'fsl_iap.h']]], + ['kflash_5frst_5fn_5fshift_5frstn',['kFLASH_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac1601058bee0888d89675b528432a496',1,'fsl_reset.h']]], + ['kfrg0_5fclk_5ffrom_5ffro',['kFRG0_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58afa871e16cf926d8a08dce1a52f418066',1,'fsl_clock.h']]], + ['kfrg0_5fclk_5ffrom_5fmainclk',['kFRG0_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a1fe8170ca9a5fcee3e0b3fa1453eb481',1,'fsl_clock.h']]], + ['kfrg0_5fclk_5ffrom_5fsyspll',['kFRG0_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad5a8e9d24a93e8c571f87c60a42c7b4b',1,'fsl_clock.h']]], + ['kfrg0_5frst_5fn_5fshift_5frstn',['kFRG0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a7a5b1b185218feb35ce91ce8f77b2106',1,'fsl_reset.h']]], + ['kfrg1_5fclk_5ffrom_5ffro',['kFRG1_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad5e83713fbdfcd0d5d67b6e679676874',1,'fsl_clock.h']]], + ['kfrg1_5fclk_5ffrom_5fmainclk',['kFRG1_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a63e60987f0efbabef20f4a0fcc6f4007',1,'fsl_clock.h']]], + ['kfrg1_5fclk_5ffrom_5fsyspll',['kFRG1_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad06dfa176e453cfc40aa6b999e68b34c',1,'fsl_clock.h']]], + ['kfrg1_5frst_5fn_5fshift_5frstn',['kFRG1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a78cd776910006a5d8724f628b5c8a0a5',1,'fsl_reset.h']]], + ['kgpio0_5frst_5fn_5fshift_5frstn',['kGPIO0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a244e5cce727a529563a83a1a78f8b3f1',1,'fsl_reset.h']]], + ['kgpio1_5frst_5fn_5fshift_5frstn',['kGPIO1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac11437bc3b54618d863748e13b09ea3e',1,'fsl_reset.h']]], + ['kgpio_5fdigitalinput',['kGPIO_DigitalInput',['../a00016.html#ggada41ca0a2ce239fe125ee96833e715c0abacf19933be1940ab40c83535e6a46d4',1,'fsl_gpio.h']]], + ['kgpio_5fdigitaloutput',['kGPIO_DigitalOutput',['../a00016.html#ggada41ca0a2ce239fe125ee96833e715c0a509ebcd228fc813cf4afcacd258680f9',1,'fsl_gpio.h']]], + ['kgpioint_5frst_5fn_5fshift_5frstn',['kGPIOINT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a20fd1ac8739a143dddb40a6349a758a6',1,'fsl_reset.h']]], + ['ki2c0_5fclk_5ffrom_5ffrg0clk',['kI2C0_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a92f67286aebd8e0fde633cf4b3bd8b57',1,'fsl_clock.h']]], + ['ki2c0_5fclk_5ffrom_5ffrg1clk',['kI2C0_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58abc4f63896a33dac1ef8825e1fe86488b',1,'fsl_clock.h']]], + ['ki2c0_5fclk_5ffrom_5ffro',['kI2C0_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ab8065d6f5e9b16e9410feccef7f1c10b',1,'fsl_clock.h']]], + ['ki2c0_5fclk_5ffrom_5ffro_5fdiv',['kI2C0_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a9fe34f41e6cfa3cd3a0ef15ba9184bb1',1,'fsl_clock.h']]], + ['ki2c0_5fclk_5ffrom_5fmainclk',['kI2C0_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ab434281b6471a116a444172bf8a7bf91',1,'fsl_clock.h']]], + ['ki2c0_5frst_5fn_5fshift_5frstn',['kI2C0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aee6d4f65797043b10be7d4a7ae95d206',1,'fsl_reset.h']]], + ['ki2c1_5fclk_5ffrom_5ffrg0clk',['kI2C1_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ac891ded4c265bfab790d733acbacb753',1,'fsl_clock.h']]], + ['ki2c1_5fclk_5ffrom_5ffrg1clk',['kI2C1_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a6a83c84726acb80554e10c8c3758e071',1,'fsl_clock.h']]], + ['ki2c1_5fclk_5ffrom_5ffro',['kI2C1_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ae19e4e49559079c2f95f998c37029642',1,'fsl_clock.h']]], + ['ki2c1_5fclk_5ffrom_5ffro_5fdiv',['kI2C1_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a8670e7d6a9f2afb045fbf54dc13c4bb2',1,'fsl_clock.h']]], + ['ki2c1_5fclk_5ffrom_5fmainclk',['kI2C1_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a5cff4ddf26d639e435ce79fe5e83d866',1,'fsl_clock.h']]], + ['ki2c1_5frst_5fn_5fshift_5frstn',['kI2C1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ad1ef18ed84027fdc4d41567ae894ea10',1,'fsl_reset.h']]], + ['ki2c2_5fclk_5ffrom_5ffrg0clk',['kI2C2_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a56958ea244b66882f17bd6bdad0e8b8f',1,'fsl_clock.h']]], + ['ki2c2_5fclk_5ffrom_5ffrg1clk',['kI2C2_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a84c08938ba9d92701ad3d29267565309',1,'fsl_clock.h']]], + ['ki2c2_5fclk_5ffrom_5ffro',['kI2C2_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58aad11950d648756bba92e741b9c6b4cd0',1,'fsl_clock.h']]], + ['ki2c2_5fclk_5ffrom_5ffro_5fdiv',['kI2C2_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a11296d1ee4ea06d70c91789f988c8a43',1,'fsl_clock.h']]], + ['ki2c2_5fclk_5ffrom_5fmainclk',['kI2C2_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a6d4885caf9110a788abb71f9c482141c',1,'fsl_clock.h']]], + ['ki2c2_5frst_5fn_5fshift_5frstn',['kI2C2_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a69e2004fad90b83501ee061e1eb7c85d',1,'fsl_reset.h']]], + ['ki2c3_5fclk_5ffrom_5ffrg0clk',['kI2C3_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a3013697f548b1926d8c79f052a43c250',1,'fsl_clock.h']]], + ['ki2c3_5fclk_5ffrom_5ffrg1clk',['kI2C3_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af596a7a7c2e36598e14144cc13eb0733',1,'fsl_clock.h']]], + ['ki2c3_5fclk_5ffrom_5ffro',['kI2C3_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a80a728627fb060445729c7fcb12cd1b8',1,'fsl_clock.h']]], + ['ki2c3_5fclk_5ffrom_5ffro_5fdiv',['kI2C3_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ab78b4e89fcd4147c3143fee94034a356',1,'fsl_clock.h']]], + ['ki2c3_5fclk_5ffrom_5fmainclk',['kI2C3_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a8f752fd4f9b1ebce048719fbc9d1962b',1,'fsl_clock.h']]], + ['ki2c3_5frst_5fn_5fshift_5frstn',['kI2C3_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a97ee4a7923c967d1c356c0f135c465c2',1,'fsl_reset.h']]], + ['ki2c_5fmasterarbitrationlostflag',['kI2C_MasterArbitrationLostFlag',['../a00017.html#ggac938392418ba1a891983d11ef5c9f2a3a7b487779b58af99a7a8c179545f78ccd',1,'fsl_i2c.h']]], + ['ki2c_5fmasterpendingflag',['kI2C_MasterPendingFlag',['../a00017.html#ggac938392418ba1a891983d11ef5c9f2a3a9cc49a1ca21e87058a7fbf733cce0e62',1,'fsl_i2c.h']]], + ['ki2c_5fmasterstartstoperrorflag',['kI2C_MasterStartStopErrorFlag',['../a00017.html#ggac938392418ba1a891983d11ef5c9f2a3ab5cec1d9be7dc5fb2c106e2b87889517',1,'fsl_i2c.h']]], + ['ki2c_5fqualmodeextend',['kI2C_QualModeExtend',['../a00018.html#gga719dc02b99647eb8f08a05d4d6066c51a6b755a1d30a626380730ce947d09335f',1,'fsl_i2c.h']]], + ['ki2c_5fqualmodemask',['kI2C_QualModeMask',['../a00018.html#gga719dc02b99647eb8f08a05d4d6066c51af542f0269c83549e7b492911e281a902',1,'fsl_i2c.h']]], + ['ki2c_5fread',['kI2C_Read',['../a00017.html#ggab49c827b45635206f06e5737606e4611a3a7bb24dc8d1c1be8925603eeafe9b30',1,'fsl_i2c.h']]], + ['ki2c_5fsavedeselected',['kI2C_SaveDeselected',['../a00018.html#gga419f2fc2e0684671c00ee97e962bbe0cad834aafd823863602d905d4b3d8c9430',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressmatchevent',['kI2C_SlaveAddressMatchEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4acacb1ae174dd6798a6fd79800a9e39a3c6',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressregister0',['kI2C_SlaveAddressRegister0',['../a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a39e0e158674bd8a6e254a6a42b5ce50f',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressregister1',['kI2C_SlaveAddressRegister1',['../a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a42a589b5e31f29ddc41088c3fb4bfcf1',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressregister2',['kI2C_SlaveAddressRegister2',['../a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a8381dd229f545df5e6a32ee5f0aac871',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressregister3',['kI2C_SlaveAddressRegister3',['../a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a9e73a2b09fe3943d51849a7d87fbe8a3',1,'fsl_i2c.h']]], + ['ki2c_5fslaveallevents',['kI2C_SlaveAllEvents',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca94b030ebdac378a84961893ae567bfbc',1,'fsl_i2c.h']]], + ['ki2c_5fslavecompletionevent',['kI2C_SlaveCompletionEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca38cca3cd668e73f51b8e574835d419df',1,'fsl_i2c.h']]], + ['ki2c_5fslavedeselectedevent',['kI2C_SlaveDeselectedEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca5e765c1c316a51908b68f1f32a7b524d',1,'fsl_i2c.h']]], + ['ki2c_5fslavenotstretching',['kI2C_SlaveNotStretching',['../a00018.html#gga419f2fc2e0684671c00ee97e962bbe0caf7ad09504bcf02f9c1177431ee44562e',1,'fsl_i2c.h']]], + ['ki2c_5fslavependingflag',['kI2C_SlavePendingFlag',['../a00018.html#gga419f2fc2e0684671c00ee97e962bbe0cabd274f2defb8f0f8d2f6c2fcdd71c63c',1,'fsl_i2c.h']]], + ['ki2c_5fslavereceiveevent',['kI2C_SlaveReceiveEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4acaac8593e808a8137d1b5d3a51640779de',1,'fsl_i2c.h']]], + ['ki2c_5fslaveselected',['kI2C_SlaveSelected',['../a00018.html#gga419f2fc2e0684671c00ee97e962bbe0ca2d0c7dc4bf2815768510b916b7c1d54e',1,'fsl_i2c.h']]], + ['ki2c_5fslavetransmitevent',['kI2C_SlaveTransmitEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca2f85039a57379838909876a1d509b7aa',1,'fsl_i2c.h']]], + ['ki2c_5ftransferdefaultflag',['kI2C_TransferDefaultFlag',['../a00017.html#gga87ea07668194cfb46c7c368d2cb42433ae80f7b768b1621e42ac965d3d23de5e2',1,'fsl_i2c.h']]], + ['ki2c_5ftransfernostartflag',['kI2C_TransferNoStartFlag',['../a00017.html#gga87ea07668194cfb46c7c368d2cb42433a5cb44bf860c0482c0ca0165cf0d31d8a',1,'fsl_i2c.h']]], + ['ki2c_5ftransfernostopflag',['kI2C_TransferNoStopFlag',['../a00017.html#gga87ea07668194cfb46c7c368d2cb42433afb8aeea71b5b7475e3d3df86220db566',1,'fsl_i2c.h']]], + ['ki2c_5ftransferrepeatedstartflag',['kI2C_TransferRepeatedStartFlag',['../a00017.html#gga87ea07668194cfb46c7c368d2cb42433aadf112471ef12f194985a093cd9b9721',1,'fsl_i2c.h']]], + ['ki2c_5fwrite',['kI2C_Write',['../a00017.html#ggab49c827b45635206f06e5737606e4611a93b476b469c2a4bfed5916b458ae9bb0',1,'fsl_i2c.h']]], + ['kiapcmd_5fiap_5fblankchecksector',['kIapCmd_IAP_BlankCheckSector',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa9b439af9906d00c0f5a83e5c878c2e50',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fcompare',['kIapCmd_IAP_Compare',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caabda85aeb932e76c81db46f45a8c6f656',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fcopyramtoflash',['kIapCmd_IAP_CopyRamToFlash',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3fa0f400c5389e777ba1f8d6acb27d72',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5ferasepage',['kIapCmd_IAP_ErasePage',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae674c1ed0ecf4b2851aefc44261004bc',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5ferasesector',['kIapCmd_IAP_EraseSector',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa6c51c9bed9f8973d47f7b73e3592b2aa',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fextendedreadsignature',['kIapCmd_IAP_ExtendedReadSignature',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa198048f7f05d882a431c4ea4c904174e',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fpreparesectorforwrite',['kIapCmd_IAP_PrepareSectorforWrite',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa5ccbc970e59fd2f3ea432bf5c00fea7e',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fread_5fbootromversion',['kIapCmd_IAP_Read_BootromVersion',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caab7decacdc717da7752b3a4637a228278',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freadfactorysettings',['kIapCmd_IAP_ReadFactorySettings',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae8bcbc2ebc5c99fd75de395e3d18b021',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freadfaimpage',['kIapCmd_IAP_ReadFAIMPage',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3556cf54991582784cca44e4604113cc',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freadpartid',['kIapCmd_IAP_ReadPartId',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa0f88b3ef422116327baca297944ca597',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freadsignature',['kIapCmd_IAP_ReadSignature',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3891f9959d7cdcc9b6ad7e00816b2fc8',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freaduid',['kIapCmd_IAP_ReadUid',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae3058d7cb02b689b3993fae3c913e0f0',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freinvokeisp',['kIapCmd_IAP_ReinvokeISP',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caaf09dfcba592f2a1e02727d9eeebee15d',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fwritefaimpage',['kIapCmd_IAP_WriteFAIMPage',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa6ef0ad89e49b23cb3fc4b046013a5332',1,'fsl_iap.h']]], + ['kinputmux_5fdebughaltedtosct0',['kINPUTMUX_DebugHaltedToSct0',['../a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163ba1e042af47b407b5b414e22bab7f3e87d',1,'fsl_inputmux_connections.h']]], + ['kinputmux_5fdmachannel0trigouttotriginchannels',['kINPUTMUX_DmaChannel0TrigoutToTriginChannels',['../a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163baa76de68415d27dc96db87292ea596e47',1,'fsl_inputmux_connections.h']]], + ['kinputmux_5fdmachannel24trigouttotriginchannels',['kINPUTMUX_DmaChannel24TrigoutToTriginChannels',['../a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163baa405e10591d83ca35d931b53cbe7478b',1,'fsl_inputmux_connections.h']]], + ['kiocon_5frst_5fn_5fshift_5frstn',['kIOCON_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ab95a1dd8a7fbc479365344d58ac55737',1,'fsl_reset.h']]], + ['kmrt_5fchannel_5f0',['kMRT_Channel_0',['../a00020.html#ggaece5c1972e35dec2efcce98847a09622a27e83d437e2798b19c59c2af4d99e1dc',1,'fsl_mrt.h']]], + ['kmrt_5fchannel_5f1',['kMRT_Channel_1',['../a00020.html#ggaece5c1972e35dec2efcce98847a09622a44b7807f36fe0a21240e721d46d8f9d7',1,'fsl_mrt.h']]], + ['kmrt_5fchannel_5f2',['kMRT_Channel_2',['../a00020.html#ggaece5c1972e35dec2efcce98847a09622a17597fb66d9b1d3e97b318db79267f52',1,'fsl_mrt.h']]], + ['kmrt_5fchannel_5f3',['kMRT_Channel_3',['../a00020.html#ggaece5c1972e35dec2efcce98847a09622af57e6e009258a71bc3a2890aedff34b3',1,'fsl_mrt.h']]], + ['kmrt_5foneshotmode',['kMRT_OneShotMode',['../a00020.html#ggad481f648f1c89a1eab327530d6fef1d0abe4ba0a30bc09f1921a0504eb826b3dc',1,'fsl_mrt.h']]], + ['kmrt_5foneshotstallmode',['kMRT_OneShotStallMode',['../a00020.html#ggad481f648f1c89a1eab327530d6fef1d0add9f55173bb54f623c955c29c22dd5b2',1,'fsl_mrt.h']]], + ['kmrt_5frepeatmode',['kMRT_RepeatMode',['../a00020.html#ggad481f648f1c89a1eab327530d6fef1d0a6b415c060dc09ed293ec3dda829cb257',1,'fsl_mrt.h']]], + ['kmrt_5frst_5fn_5fshift_5frstn',['kMRT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a81a00b3196e6197af1ca45b8a5bac450',1,'fsl_reset.h']]], + ['kmrt_5ftimerinterruptenable',['kMRT_TimerInterruptEnable',['../a00020.html#gga9d2f90ae2c6f99410e2908dac8cc6943a2a5e8ee568da2c888093b732f2157ea5',1,'fsl_mrt.h']]], + ['kmrt_5ftimerinterruptflag',['kMRT_TimerInterruptFlag',['../a00020.html#gga0bb94508d8cf924c3a6971364377673aa6942598faf3aef148a850f8850cf01c3',1,'fsl_mrt.h']]], + ['kmrt_5ftimerrunflag',['kMRT_TimerRunFlag',['../a00020.html#gga0bb94508d8cf924c3a6971364377673aa745c62687191197b48b35dbd1aac40db',1,'fsl_mrt.h']]], + ['kpint_5fpatternmatchalways',['kPINT_PatternMatchAlways',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa128703d2c2175a315aaffad869ed6a32',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbothedges',['kPINT_PatternMatchBothEdges',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aaac967156901735a43316f7f1c4720328',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice0',['kPINT_PatternMatchBSlice0',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba106986aeb5e12c2b76e070def3b37d95',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice1',['kPINT_PatternMatchBSlice1',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba0d3bf0a5022325acaae66e172c984db0',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice2',['kPINT_PatternMatchBSlice2',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9baf00e092237b1b299bdfdd901f207c468',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice3',['kPINT_PatternMatchBSlice3',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9bae5db81838d55c8a8839b1dd47954d865',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice4',['kPINT_PatternMatchBSlice4',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9bac0ce3f2fbc216bc3cec68c47263530c5',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice5',['kPINT_PatternMatchBSlice5',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba1ca87ca7db6ec59b675c6e70abc45da0',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice6',['kPINT_PatternMatchBSlice6',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba86a79a77b44e91f432bb8ee9070f9602',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice7',['kPINT_PatternMatchBSlice7',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba3a75ed56ef8a3429c01fc686f22b8e8a',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchhigh',['kPINT_PatternMatchHigh',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa7dc0770cf7ffe184788c30bd1ac9c515',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp0src',['kPINT_PatternMatchInp0Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a51f543e6f680df9beb5841231b7b3a96',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp1src',['kPINT_PatternMatchInp1Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a6fc5c9dbee30b375feb9ce6c86b224c2',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp2src',['kPINT_PatternMatchInp2Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a41b057b493937cd87bc212cb2e316f8a',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp3src',['kPINT_PatternMatchInp3Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a6be4432cb9e687d043a2c25c1af48869',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp4src',['kPINT_PatternMatchInp4Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76aabc93fc28498f5577939f38e0513304c',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp5src',['kPINT_PatternMatchInp5Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a78ff6e40ab17d81181284c56b62b77aa',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp6src',['kPINT_PatternMatchInp6Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a9b2f5abc74e498a599f5c005a6cc911f',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp7src',['kPINT_PatternMatchInp7Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a2c93115b816dc676460cfc1be85778f0',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchlow',['kPINT_PatternMatchLow',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa3b4af984526871b66489b0eb294d2df5',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchnever',['kPINT_PatternMatchNever',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aab5630ebfbc6e52c9b04f659918c094f2',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchstickybothedges',['kPINT_PatternMatchStickyBothEdges',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa059c3472509304186252b655cf486d8b',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchstickyfall',['kPINT_PatternMatchStickyFall',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa9d2a3e9717c34de3a884b695f35a6c37',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchstickyrise',['kPINT_PatternMatchStickyRise',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa654c70eeed38b0be2271dc51d7cc04f5',1,'fsl_pint.h']]], + ['kpint_5fpinint0',['kPINT_PinInt0',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a5df52c4fbb437e61b638d35cbc550162',1,'fsl_pint.h']]], + ['kpint_5fpinint1',['kPINT_PinInt1',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8ab62e1c2d3cdccef05e45ae9028cecbb4',1,'fsl_pint.h']]], + ['kpint_5fpinint2',['kPINT_PinInt2',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a81913bc912b5164bb749b6a2e8823808',1,'fsl_pint.h']]], + ['kpint_5fpinint3',['kPINT_PinInt3',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a751ce5a16f196ca04d08d2e5d65af47c',1,'fsl_pint.h']]], + ['kpint_5fpinint4',['kPINT_PinInt4',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8acf173e0dc3d44c77bb08146494a0249b',1,'fsl_pint.h']]], + ['kpint_5fpinint5',['kPINT_PinInt5',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a45fc443b2ec03c89708ac897fc3fc902',1,'fsl_pint.h']]], + ['kpint_5fpinint6',['kPINT_PinInt6',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8adf92ec20d1fa6a12bda6c42e5304cf46',1,'fsl_pint.h']]], + ['kpint_5fpinint7',['kPINT_PinInt7',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8aae1e0da9add6e3e1dd57705a682d65fa',1,'fsl_pint.h']]], + ['kpint_5fpinintenablebothedges',['kPINT_PinIntEnableBothEdges',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a58ac8e76b409274b7d02ef6e9805dcef',1,'fsl_pint.h']]], + ['kpint_5fpinintenablefalledge',['kPINT_PinIntEnableFallEdge',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a6f54d55ac52e8e697f83637109560e89',1,'fsl_pint.h']]], + ['kpint_5fpinintenablehighlevel',['kPINT_PinIntEnableHighLevel',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91affc9b2756b7642ddb60ea78f4bbbd592',1,'fsl_pint.h']]], + ['kpint_5fpinintenablelowlevel',['kPINT_PinIntEnableLowLevel',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a3bd6a570eee5c1fddd95ef2411b35a7e',1,'fsl_pint.h']]], + ['kpint_5fpinintenablenone',['kPINT_PinIntEnableNone',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91aa48de84b39b48759086f2d7ae0c8091e',1,'fsl_pint.h']]], + ['kpint_5fpinintenableriseedge',['kPINT_PinIntEnableRiseEdge',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91ae873d30aec2ca54de88c69f55ea42a07',1,'fsl_pint.h']]], + ['kpint_5fsecpatternmatchinp0src',['kPINT_SecPatternMatchInp0Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a1f7f561990336a81a46f22395820907d',1,'fsl_pint.h']]], + ['kpint_5fsecpatternmatchinp1src',['kPINT_SecPatternMatchInp1Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a8cc05c9aec163085b7a2b4481fdc971d',1,'fsl_pint.h']]], + ['kpmu_5fgenreg0',['kPmu_GenReg0',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492a80dcccd621286706e1c8a4ebe9c10f0a',1,'fsl_power.h']]], + ['kpmu_5fgenreg1',['kPmu_GenReg1',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492a740c74b8de11afea3adf94099430d43f',1,'fsl_power.h']]], + ['kpmu_5fgenreg2',['kPmu_GenReg2',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492ad0fed29c216cb44973a5720f27c25b57',1,'fsl_power.h']]], + ['kpmu_5fgenreg3',['kPmu_GenReg3',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492a8464e8acd4980abf527cdc08a1039f03',1,'fsl_power.h']]], + ['kpmu_5fgenreg4',['kPmu_GenReg4',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492ad41dcf0263e8b148f96f850b2be396ac',1,'fsl_power.h']]], + ['ksct_5fclk_5ffrom_5ffro',['kSCT_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a45061bbb0d60c123b9cf999ce58c24f0',1,'fsl_clock.h']]], + ['ksct_5fclk_5ffrom_5fmainclk',['kSCT_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a9f985237f28fdfa44b6a856c3e2f4dab',1,'fsl_clock.h']]], + ['ksct_5fclk_5ffrom_5fsyspll',['kSCT_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad0d4f0ebaf887e6ae96436fa7f0d2f15',1,'fsl_clock.h']]], + ['ksct_5frst_5fn_5fshift_5frstn',['kSCT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a5a074c4e48569dce7baacbae585541fc',1,'fsl_reset.h']]], + ['ksctimer_5factiveincountdown',['kSCTIMER_ActiveInCountDown',['../a00021.html#ggadc0dc8518742a3345ea042eae821dc85a6a33db1b011c4dcf63bcc2759dd1c474',1,'fsl_sctimer.h']]], + ['ksctimer_5factiveincountup',['kSCTIMER_ActiveInCountUp',['../a00021.html#ggadc0dc8518742a3345ea042eae821dc85a878f4d9e6aa0348da58c4b8807e6eb19',1,'fsl_sctimer.h']]], + ['ksctimer_5factiveindependent',['kSCTIMER_ActiveIndependent',['../a00021.html#ggadc0dc8518742a3345ea042eae821dc85a1ce9766251a3384d8eb28804fd518034',1,'fsl_sctimer.h']]], + ['ksctimer_5fasynchronous_5fclockmode',['kSCTIMER_Asynchronous_ClockMode',['../a00021.html#gga270f5ad1462133d7b88ce71be4913a1da3923db642ad5f6b9aa2f9206b69cc9b5',1,'fsl_sctimer.h']]], + ['ksctimer_5fbuserrorhflag',['kSCTIMER_BusErrorHFlag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a9a5e7b8190bf25a0695f3b3d54c39bee',1,'fsl_sctimer.h']]], + ['ksctimer_5fbuserrorlflag',['kSCTIMER_BusErrorLFlag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a9c4db1ffc833a6eedc6a56a7fee85742',1,'fsl_sctimer.h']]], + ['ksctimer_5fcenteralignedpwm',['kSCTIMER_CenterAlignedPwm',['../a00021.html#gga76b1c419363e09d4861880f25f63979dac28f3ae947c63c4fc3663be7d1f7b4e3',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f0',['kSCTIMER_Clock_On_Fall_Input_0',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a81bb8457aeaaa05c1de014a1092f3682',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f1',['kSCTIMER_Clock_On_Fall_Input_1',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a37959b0234e735a51a76fc94a6ea2838',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f2',['kSCTIMER_Clock_On_Fall_Input_2',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a65d71ef841bb11fc06c4a84cd35fe354',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f3',['kSCTIMER_Clock_On_Fall_Input_3',['../a00021.html#gga82141464913b976a7c2aab50cf17c701ad95c6b5bf373afdaa115ac4d4b33c907',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f4',['kSCTIMER_Clock_On_Fall_Input_4',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a90910b145c4b6be6207e787a33edfe90',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f5',['kSCTIMER_Clock_On_Fall_Input_5',['../a00021.html#gga82141464913b976a7c2aab50cf17c701aef4bb8b33c1f2cbd38d93f3ae8dcf59d',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f6',['kSCTIMER_Clock_On_Fall_Input_6',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a1cac2ebda704fdec8b75b9fa9caf460e',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f7',['kSCTIMER_Clock_On_Fall_Input_7',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a64d321fa474f3c4f7accbbe3fb48ce97',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f0',['kSCTIMER_Clock_On_Rise_Input_0',['../a00021.html#gga82141464913b976a7c2aab50cf17c701aeac5b3a91a6789ebc29e22a63223e562',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f1',['kSCTIMER_Clock_On_Rise_Input_1',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a14833c030e7be5e1d46d379bee0763e2',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f2',['kSCTIMER_Clock_On_Rise_Input_2',['../a00021.html#gga82141464913b976a7c2aab50cf17c701acfec39ecd9ed389a70c5af0aadd8d245',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f3',['kSCTIMER_Clock_On_Rise_Input_3',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a2d49ffdfaa5c023b81800f9bc7145599',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f4',['kSCTIMER_Clock_On_Rise_Input_4',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a8d5a9b6b6028b4dcd8c6032bebefa468',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f5',['kSCTIMER_Clock_On_Rise_Input_5',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a76459f5f7aeb37929840ac706ccba0c1',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f6',['kSCTIMER_Clock_On_Rise_Input_6',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a22397185b3e3a49c3ab6de5f22b55126',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f7',['kSCTIMER_Clock_On_Rise_Input_7',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a5298152c01e0d4e9def85bbe99ecad83',1,'fsl_sctimer.h']]], + ['ksctimer_5fcounter_5fh',['kSCTIMER_Counter_H',['../a00021.html#gga8df83543fac389c6e3b212d58695f034abac8d502657e6390b3669508a7a7d78b',1,'fsl_sctimer.h']]], + ['ksctimer_5fcounter_5fl',['kSCTIMER_Counter_L',['../a00021.html#gga8df83543fac389c6e3b212d58695f034a2c17be417f1566b1c17ab1cdb972baf8',1,'fsl_sctimer.h']]], + ['ksctimer_5fcounter_5fu',['kSCTIMER_Counter_U',['../a00021.html#gga8df83543fac389c6e3b212d58695f034a80cdf46efb087f2a0141a1fce8b2b542',1,'fsl_sctimer.h']]], + ['ksctimer_5fedgealignedpwm',['kSCTIMER_EdgeAlignedPwm',['../a00021.html#gga76b1c419363e09d4861880f25f63979da539c00805f4706a43e2669dfa7477dd8',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent0flag',['kSCTIMER_Event0Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a23338b52b7a3eb5bf4e0cdf6b854c9f4',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent0interruptenable',['kSCTIMER_Event0InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a7d9204dc6fea5991f442e6a96531055e',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent10flag',['kSCTIMER_Event10Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a99b06fad336b34b1485c6a1a2c634a75',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent10interruptenable',['kSCTIMER_Event10InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a313da28338d9c25f9a5de1e150fdb44e',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent11flag',['kSCTIMER_Event11Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a07c275c4c55dfe959c222b51557aab25',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent11interruptenable',['kSCTIMER_Event11InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a10627d03a81cfa9bb66dc453ecbbb7c3',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent12flag',['kSCTIMER_Event12Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a3deb3b17762b595a399bbc32efbe8753',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent12interruptenable',['kSCTIMER_Event12InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a237e390a2de0d3fa877e3f820718d14e',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent1flag',['kSCTIMER_Event1Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45ad07c79a564df84171acdd2f9acd1ee32',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent1interruptenable',['kSCTIMER_Event1InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a35b278ed11503e27ceda405448d43704',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent2flag',['kSCTIMER_Event2Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a5738f1fc819177c4377068dcf09dd39d',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent2interruptenable',['kSCTIMER_Event2InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a3733720f1b361ee41e5b7d71c7c08974',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent3flag',['kSCTIMER_Event3Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45ad4b1b9a6e2ba1ca55c536407df2802d4',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent3interruptenable',['kSCTIMER_Event3InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a0a98b0964c6e46c490e78f02f3198f07',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent4flag',['kSCTIMER_Event4Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a1034b068f1139df001c04fa1c95b5531',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent4interruptenable',['kSCTIMER_Event4InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a1cbfebe70908eb5e706e627500c2ce8d',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent5flag',['kSCTIMER_Event5Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45ae91e9c2221c6840f6b6d106a796b6eb3',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent5interruptenable',['kSCTIMER_Event5InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a306f7c719eeabe666789bb7d0ed8d175',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent6flag',['kSCTIMER_Event6Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a5a8064efce400813ba04b0a3aca7c2bb',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent6interruptenable',['kSCTIMER_Event6InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986afff05c432d290f058588e7f6372030b1',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent7flag',['kSCTIMER_Event7Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45ac6d970ec7b05b2141b48c9eb09bf23f2',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent7interruptenable',['kSCTIMER_Event7InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a5923446a599ede3c2f5d787683bcaa70',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent8flag',['kSCTIMER_Event8Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a490a6fdf7a05436e8d7958002e5d48b5',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent8interruptenable',['kSCTIMER_Event8InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a0267e2748c8e6c0ae37588d85346af5b',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent9flag',['kSCTIMER_Event9Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a19ed3a5f0d87b7c42919ed74ea6630ac',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent9interruptenable',['kSCTIMER_Event9InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a3617b5ccaab15786e80fb1ff9acbbf94',1,'fsl_sctimer.h']]], + ['ksctimer_5fhightrue',['kSCTIMER_HighTrue',['../a00021.html#gga7d63d84ecccc4074e40c6754a8754065ad16871f918d603d6f919d54760e262e2',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f0',['kSCTIMER_Input_0',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eadd689832261eb7eb862ce1c61bc4e96a',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f1',['kSCTIMER_Input_1',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea427af509d16424c3e38e21c0607300d7',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f2',['kSCTIMER_Input_2',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea9091ff1c081ba955c12f63ec235fa41e',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f3',['kSCTIMER_Input_3',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eac45f2918497b441dc42cb33c99afdcd1',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f4',['kSCTIMER_Input_4',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eab8df54085f974d38e28ff80ea5ad65d0',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f5',['kSCTIMER_Input_5',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea3ec92530953ea9991a65511e64654d50',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f6',['kSCTIMER_Input_6',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea0598dcf5a25edbcc3f89bfc4f453a162',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f7',['kSCTIMER_Input_7',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea2c1d0356e7346f0d3f1a949dc56b7f10',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5fclockmode',['kSCTIMER_Input_ClockMode',['../a00021.html#gga270f5ad1462133d7b88ce71be4913a1daaedca7a090600aa41fd7f9e6aa756e8f',1,'fsl_sctimer.h']]], + ['ksctimer_5flowtrue',['kSCTIMER_LowTrue',['../a00021.html#gga7d63d84ecccc4074e40c6754a8754065a0c47623cf782903261d17cd642ad9d5e',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f0',['kSCTIMER_Out_0',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148adbdf0a5eebc74a8b01eefcc9b3ee742d',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f1',['kSCTIMER_Out_1',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a9b869b11ddd20543bab111f9f2699e18',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f2',['kSCTIMER_Out_2',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a3a54a6d9baa60d52779a918ed739a8d5',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f3',['kSCTIMER_Out_3',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a1b8265e43a813ba11c8f4661032b2c45',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f4',['kSCTIMER_Out_4',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148aa14ad02f33740bac23837ad10a2188ae',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f5',['kSCTIMER_Out_5',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a03be657454ab843d23408d0d20331511',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f6',['kSCTIMER_Out_6',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148af73ef40ea423cc2cd1314f82914054d9',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f7',['kSCTIMER_Out_7',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148af02eafb670d82545874712b82416c712',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f8',['kSCTIMER_Out_8',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a4834fd8709ba8054330fb42b65962509',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f9',['kSCTIMER_Out_9',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a1c7af66a2d15e4af71cfd6a8c2ae27a5',1,'fsl_sctimer.h']]], + ['ksctimer_5fresolveclear',['kSCTIMER_ResolveClear',['../a00021.html#gga64666471cadaed6ad2e72ce19026aed8afebc15b93617ff1873bf6bd170fbfe25',1,'fsl_sctimer.h']]], + ['ksctimer_5fresolvenone',['kSCTIMER_ResolveNone',['../a00021.html#gga64666471cadaed6ad2e72ce19026aed8a7e0f6590af780c201400de534fbded84',1,'fsl_sctimer.h']]], + ['ksctimer_5fresolveset',['kSCTIMER_ResolveSet',['../a00021.html#gga64666471cadaed6ad2e72ce19026aed8a53aa676af8b05ec58f3d723ea6b85611',1,'fsl_sctimer.h']]], + ['ksctimer_5fresolvetoggle',['kSCTIMER_ResolveToggle',['../a00021.html#gga64666471cadaed6ad2e72ce19026aed8a66ca25f70e36c4286f63529dc14d19b2',1,'fsl_sctimer.h']]], + ['ksctimer_5fsampled_5fclockmode',['kSCTIMER_Sampled_ClockMode',['../a00021.html#gga270f5ad1462133d7b88ce71be4913a1da182c8930fa55f2c4a7ff7cf27f272ec6',1,'fsl_sctimer.h']]], + ['ksctimer_5fsystem_5fclockmode',['kSCTIMER_System_ClockMode',['../a00021.html#gga270f5ad1462133d7b88ce71be4913a1daa9c40afb4f671696c5122560bd16834b',1,'fsl_sctimer.h']]], + ['kspi0_5fclk_5ffrom_5ffrg0clk',['kSPI0_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a845c271da53362455548e3a2d785e46f',1,'fsl_clock.h']]], + ['kspi0_5fclk_5ffrom_5ffrg1clk',['kSPI0_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a0cd69802e0dca5ea59301801b17d24a6',1,'fsl_clock.h']]], + ['kspi0_5fclk_5ffrom_5ffro',['kSPI0_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a225c7ee90596ed70ba883f4db61aa8a7',1,'fsl_clock.h']]], + ['kspi0_5fclk_5ffrom_5ffro_5fdiv',['kSPI0_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58aad0657c34aef515cd39d693c8a7896b2',1,'fsl_clock.h']]], + ['kspi0_5fclk_5ffrom_5fmainclk',['kSPI0_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ae27646652709428349bea6c7044c070e',1,'fsl_clock.h']]], + ['kspi0_5frst_5fn_5fshift_5frstn',['kSPI0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac5dc2b0f880a50d33e7d79f7af4c4f33',1,'fsl_reset.h']]], + ['kspi1_5fclk_5ffrom_5ffrg0clk',['kSPI1_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a61f8c26921cefcc9988472806478400b',1,'fsl_clock.h']]], + ['kspi1_5fclk_5ffrom_5ffrg1clk',['kSPI1_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58adac12c9424be5e807358f910e834b8fe',1,'fsl_clock.h']]], + ['kspi1_5fclk_5ffrom_5ffro',['kSPI1_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a4153c95a0b0f7e3c4b3090e7b7157815',1,'fsl_clock.h']]], + ['kspi1_5fclk_5ffrom_5ffro_5fdiv',['kSPI1_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58acdb981a51b4fe1d9405a3ddfc34b50b9',1,'fsl_clock.h']]], + ['kspi1_5fclk_5ffrom_5fmainclk',['kSPI1_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a03a2a6a3073f4ae89de347a932695305',1,'fsl_clock.h']]], + ['kspi1_5frst_5fn_5fshift_5frstn',['kSPI1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a3aedfdfb886f77b764c41e155ccb44f6',1,'fsl_reset.h']]], + ['kspi_5fclockphasefirstedge',['kSPI_ClockPhaseFirstEdge',['../a00022.html#gga9ad313685ade497f5cbcb71c74a1b4dcad15d61c6fd642f13101edbf401d0c72e',1,'fsl_spi.h']]], + ['kspi_5fclockphasesecondedge',['kSPI_ClockPhaseSecondEdge',['../a00022.html#gga9ad313685ade497f5cbcb71c74a1b4dca18a98985c1f7dd56175e4a2724db3675',1,'fsl_spi.h']]], + ['kspi_5fclockpolarityactivehigh',['kSPI_ClockPolarityActiveHigh',['../a00022.html#gga3e5a7cd043c9596779bc23b34cb3d1f9a031c0ee2693cf1fd621e8b8cba676629',1,'fsl_spi.h']]], + ['kspi_5fclockpolarityactivelow',['kSPI_ClockPolarityActiveLow',['../a00022.html#gga3e5a7cd043c9596779bc23b34cb3d1f9acfc8257079c9604086622df6de326aea',1,'fsl_spi.h']]], + ['kspi_5fdata10bits',['kSPI_Data10Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a2b2887663c9d025a4137263fc7984024',1,'fsl_spi.h']]], + ['kspi_5fdata11bits',['kSPI_Data11Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a91e908a7a4725ab9df05549a2b034dec',1,'fsl_spi.h']]], + ['kspi_5fdata12bits',['kSPI_Data12Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad1cfe18fd912c0d25dc32e6ca9fa8f97',1,'fsl_spi.h']]], + ['kspi_5fdata13bits',['kSPI_Data13Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad8c2fa2e2f5bf137176dc736cc6a2531',1,'fsl_spi.h']]], + ['kspi_5fdata14bits',['kSPI_Data14Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731ae83435f494d1b9f3ce2f2da0ac03fc38',1,'fsl_spi.h']]], + ['kspi_5fdata15bits',['kSPI_Data15Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731add11012a8887066fad29e23c20d66af8',1,'fsl_spi.h']]], + ['kspi_5fdata16bits',['kSPI_Data16Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731abbc2566ba4eb2b5e5dc259a7c4f80bcf',1,'fsl_spi.h']]], + ['kspi_5fdata4bits',['kSPI_Data4Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a0cb8b30c67c53c6d53712d5bacc818ce',1,'fsl_spi.h']]], + ['kspi_5fdata5bits',['kSPI_Data5Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a7232b4afb5bd82503252ce608638e6eb',1,'fsl_spi.h']]], + ['kspi_5fdata6bits',['kSPI_Data6Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a6604fcf5c8bebf904c5b072295027bba',1,'fsl_spi.h']]], + ['kspi_5fdata7bits',['kSPI_Data7Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a2c62d3d7d92866c97bb513d4e603518e',1,'fsl_spi.h']]], + ['kspi_5fdata8bits',['kSPI_Data8Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad6b98474a7f14ae7665b7b6d3355657c',1,'fsl_spi.h']]], + ['kspi_5fdata9bits',['kSPI_Data9Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a4b864a74545165c2cf2dd74134fdadd1',1,'fsl_spi.h']]], + ['kspi_5fendofframe',['kSPI_EndOfFrame',['../a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a3bc0d76da8f97613467566dc39bee3b4',1,'fsl_spi.h']]], + ['kspi_5fendoftransfer',['kSPI_EndOfTransfer',['../a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a857a31be854542eafecfea1484ad38b5',1,'fsl_spi.h']]], + ['kspi_5fendtransferflag',['kSPI_EndTransferFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a4f52f3d130ab947331e668c7856d8551',1,'fsl_spi.h']]], + ['kspi_5flsbfirst',['kSPI_LsbFirst',['../a00022.html#ggaa68518c16202382c2e1f1c7c66a9d53da20ac53684c3e1ad338553cecbfab94a9',1,'fsl_spi.h']]], + ['kspi_5fmasteridleflag',['kSPI_MasterIdleFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a03ba57874691d230ad0f657cf01a7978',1,'fsl_spi.h']]], + ['kspi_5fmsbfirst',['kSPI_MsbFirst',['../a00022.html#ggaa68518c16202382c2e1f1c7c66a9d53dae7b997e8cff761aab865cbd42c4c3989',1,'fsl_spi.h']]], + ['kspi_5freceiveignore',['kSPI_ReceiveIgnore',['../a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a2616295b1939805764ffb815876b9eea',1,'fsl_spi.h']]], + ['kspi_5frxoverrunflag',['kSPI_RxOverrunFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09ae281d12263ce63ef7c964f8564bea473',1,'fsl_spi.h']]], + ['kspi_5frxoverruninterruptenable',['kSPI_RxOverrunInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a4acd737132f9c3cbd8cac500767289e5',1,'fsl_spi.h']]], + ['kspi_5frxreadyflag',['kSPI_RxReadyFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a76b9aac1ff3856afdcb4eebdb3be9094',1,'fsl_spi.h']]], + ['kspi_5frxreadyinterruptenable',['kSPI_RxReadyInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ac8d5eef4469ce888d4b2fb3c3b4fb215',1,'fsl_spi.h']]], + ['kspi_5fslaveselectassertflag',['kSPI_SlaveSelectAssertFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09ab25cacb436c5e32113bd98c1ae151641',1,'fsl_spi.h']]], + ['kspi_5fslaveselectassertinterruptenable',['kSPI_SlaveSelectAssertInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ad1de0c0c42c7a707e305edbd3fde88b7',1,'fsl_spi.h']]], + ['kspi_5fslaveselectdeassertflag',['kSPI_SlaveSelectDeassertFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a1f153042fdb9681e7bd435c4cb9bd7c5',1,'fsl_spi.h']]], + ['kspi_5fslaveselectdeassertinterruptenable',['kSPI_SlaveSelectDeassertInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a8f55948795fa8d256b5b6e520a95f145',1,'fsl_spi.h']]], + ['kspi_5fssel0assert',['kSPI_Ssel0Assert',['../a00022.html#gga420a3d3f841957068648585b89fa66d1af64655214a47d11f960f633b1478b117',1,'fsl_spi.h']]], + ['kspi_5fstallflag',['kSPI_StallFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a214bc23d48bafcc89241530e55195f76',1,'fsl_spi.h']]], + ['kspi_5ftxreadyflag',['kSPI_TxReadyFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a3f796180c934ef3b688530986a844fe5',1,'fsl_spi.h']]], + ['kspi_5ftxreadyinterruptenable',['kSPI_TxReadyInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a0ec3e79b793d213ed30f74a338437129',1,'fsl_spi.h']]], + ['kspi_5ftxunderrunflag',['kSPI_TxUnderrunFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a4be82e1306daa139870673c30de9e238',1,'fsl_spi.h']]], + ['kspi_5ftxunderruninterruptenable',['kSPI_TxUnderrunInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ad1f9b1e8b5209604a0eca8750f2876ad',1,'fsl_spi.h']]], + ['kstatus_5fbusy',['kStatus_Busy',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba31e314ec45f0b673257687c06b6fe764',1,'fsl_common.h']]], + ['kstatus_5fdma_5fbusy',['kStatus_DMA_Busy',['../a00015.html#gga99fb83031ce9923c84392b4e92f956b5a9b95dc670083f57c33f96b0c10d0c8ba',1,'fsl_dma.h']]], + ['kstatus_5ffail',['kStatus_Fail',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba8692e71089c7e81bd5f4503ff55035db',1,'fsl_common.h']]], + ['kstatus_5fi2c_5faddr_5fnak',['kStatus_I2C_Addr_Nak',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635adf7437bfedcc0d57338ed33f1be5c805',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5farbitrationlost',['kStatus_I2C_ArbitrationLost',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a139b52cc3305ec2c06d0ac94313c221f',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fbiterror',['kStatus_I2C_BitError',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a0db20b358696db03a068816bb72a0310',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fbusy',['kStatus_I2C_Busy',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a49091894b590d7e479605bf113918952',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fdmarequestfail',['kStatus_I2C_DmaRequestFail',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635ac0253b1c986e61b7905da4a7f1fbf844',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fidle',['kStatus_I2C_Idle',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a628d242f7bc0e3d5949c7f73eafaa508',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5finvalidparameter',['kStatus_I2C_InvalidParameter',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a308bcea12eeef85aeac416ead81639b9',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fnak',['kStatus_I2C_Nak',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a72fd33d0b5263a63766e62f71d16be00',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fnotransferinprogress',['kStatus_I2C_NoTransferInProgress',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a834a772763c85b5bedf8eb0a0cfa2f9e',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fstartstoperror',['kStatus_I2C_StartStopError',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a256cb58b123f0814d020cc8449cf48d5',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5ftimeout',['kStatus_I2C_Timeout',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a81ad7cc198436cabbe91ea55c5288747',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5funexpectedstate',['kStatus_I2C_UnexpectedState',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a99cb29358dad3255402d30285f844632',1,'fsl_i2c.h']]], + ['kstatus_5fiap_5faddrerror',['kStatus_IAP_AddrError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ae4a180ae087b0f4a58a7c89cb081f400',1,'fsl_iap.h']]], + ['kstatus_5fiap_5faddrnotmapped',['kStatus_IAP_AddrNotMapped',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a98ad8dfd7c9c06637a8ef77669248d44',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fbusy',['kStatus_IAP_Busy',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ab171ff8674c9017605cde0067a84a375',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fcompareerror',['kStatus_IAP_CompareError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ac08832cd7dd8929746e5583b85050a43',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fcounterror',['kStatus_IAP_CountError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a947c74ac4418ae34ab4b8be2416e11cb',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fdstaddrerror',['kStatus_IAP_DstAddrError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a37f09b865f86f3f6f58064be70121c02',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fdstaddrnotmapped',['kStatus_IAP_DstAddrNotMapped',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a0491cac2cd13971f08f754a5365ab356',1,'fsl_iap.h']]], + ['kstatus_5fiap_5finvalidcommand',['kStatus_IAP_InvalidCommand',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a254b836a21eb98b6211cefd76037dde7',1,'fsl_iap.h']]], + ['kstatus_5fiap_5finvalidsector',['kStatus_IAP_InvalidSector',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7affa7c3fd999eb6a4558a4e981aa29ccd',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fnoclock',['kStatus_IAP_NoClock',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7adfb58b377dc75167cff2cc8e003939ff',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fnopower',['kStatus_IAP_NoPower',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a08741d113d7dd7358c0a548ed6bedaa9',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fnotprepared',['kStatus_IAP_NotPrepared',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7aea4e342b4bc05dc9f04b2a50b5ccba4f',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fparamerror',['kStatus_IAP_ParamError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a61e927398cdd5549301de26831ff5460',1,'fsl_iap.h']]], + ['kstatus_5fiap_5freinvokeispconfig',['kStatus_IAP_ReinvokeISPConfig',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ad9d50e05078873600322a78c0bd94b35',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fsectornotblank',['kStatus_IAP_SectorNotblank',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a59fbec3050069d5bf473211cad8ab817',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fsrcaddrerror',['kStatus_IAP_SrcAddrError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ab36f8ecf47da3052eb485015a1932c26',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fsrcaddrnotmapped',['kStatus_IAP_SrcAddrNotMapped',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ae69151d679a249f83fde025b5562196a',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fsuccess',['kStatus_IAP_Success',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a35e8de33bf46beecd34105c59ec2bc6e',1,'fsl_iap.h']]], + ['kstatus_5finvalidargument',['kStatus_InvalidArgument',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba9743ab3bec5065667c0b12510317e76c',1,'fsl_common.h']]], + ['kstatus_5fnodata',['kStatus_NoData',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba94770b392eceab60898d03ffcf0cc145',1,'fsl_common.h']]], + ['kstatus_5fnotransferinprogress',['kStatus_NoTransferInProgress',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba82fc7f2a425a9c3cfcf6636b8c05c06c',1,'fsl_common.h']]], + ['kstatus_5foutofrange',['kStatus_OutOfRange',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba96d166071c2c0b2672ddaa3307899a0b',1,'fsl_common.h']]], + ['kstatus_5freadonly',['kStatus_ReadOnly',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba69927473662d55dfe6a4b8b1ea529f67',1,'fsl_common.h']]], + ['kstatus_5fspi_5fbaudratenotsupport',['kStatus_SPI_BaudrateNotSupport',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2dab0f4d4de5f92524c9d33524f22a04e03',1,'fsl_spi.h']]], + ['kstatus_5fspi_5fbusy',['kStatus_SPI_Busy',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da703abdf7900047c4d13536480f3463ab',1,'fsl_spi.h']]], + ['kstatus_5fspi_5ferror',['kStatus_SPI_Error',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da2ff91d774e93aed936b87ffaa18aaf9e',1,'fsl_spi.h']]], + ['kstatus_5fspi_5fidle',['kStatus_SPI_Idle',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da4e32c5b06dccaf4b81e2fd1679e1b560',1,'fsl_spi.h']]], + ['kstatus_5fspi_5ftimeout',['kStatus_SPI_Timeout',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da496ced6fffc33d7bbeb01d203dfc4836',1,'fsl_spi.h']]], + ['kstatus_5fsuccess',['kStatus_Success',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba829bee76c6b02225d9c891ae8ef70881',1,'fsl_common.h']]], + ['kstatus_5ftimeout',['kStatus_Timeout',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55badf7f172a5d4f1a44d5cb8a1121dcafcb',1,'fsl_common.h']]], + ['kstatus_5fusart_5fbaudratenotsupport',['kStatus_USART_BaudrateNotSupport',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600ae427c8491ce7294dfeaa3b87e506bd81',1,'fsl_usart.h']]], + ['kstatus_5fusart_5fframingerror',['kStatus_USART_FramingError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a9e2f548075400b4c0a719ee1b0a534a9',1,'fsl_usart.h']]], + ['kstatus_5fusart_5fhardwareoverrun',['kStatus_USART_HardwareOverrun',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600ade18e0468490127d2e0a8c71a190bdc8',1,'fsl_usart.h']]], + ['kstatus_5fusart_5fnoiseerror',['kStatus_USART_NoiseError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a3f21596ffe8300152d7f9f5587402e19',1,'fsl_usart.h']]], + ['kstatus_5fusart_5fparityerror',['kStatus_USART_ParityError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a579872694419f8708e38935593105868',1,'fsl_usart.h']]], + ['kstatus_5fusart_5frxbusy',['kStatus_USART_RxBusy',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a38225397e3744ef1b4995041ce80d839',1,'fsl_usart.h']]], + ['kstatus_5fusart_5frxerror',['kStatus_USART_RxError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a888280fbe6cf9b4b0647db78f0578ff5',1,'fsl_usart.h']]], + ['kstatus_5fusart_5frxidle',['kStatus_USART_RxIdle',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a3cb7112c821c89d7fbb1c048a86756aa',1,'fsl_usart.h']]], + ['kstatus_5fusart_5frxringbufferoverrun',['kStatus_USART_RxRingBufferOverrun',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a256720c63c378f57791e946c0473290e',1,'fsl_usart.h']]], + ['kstatus_5fusart_5ftimeout',['kStatus_USART_Timeout',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600ad434a2fb3d728550dd2e784ce0a3e14c',1,'fsl_usart.h']]], + ['kstatus_5fusart_5ftxbusy',['kStatus_USART_TxBusy',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a78157ec0658118f9205521c03da99093',1,'fsl_usart.h']]], + ['kstatus_5fusart_5ftxerror',['kStatus_USART_TxError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600abf010640733ea1ae8c97d7a0b83ea11b',1,'fsl_usart.h']]], + ['kstatus_5fusart_5ftxidle',['kStatus_USART_TxIdle',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a539a0ebaa0137fdf6d7cc9b984acb13f',1,'fsl_usart.h']]], + ['kstatusgroup_5fapplicationrangestart',['kStatusGroup_ApplicationRangeStart',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae0c3a94577af5271a1042757d3c8fdc1',1,'fsl_common.h']]], + ['kstatusgroup_5fasrc',['kStatusGroup_ASRC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a713723bd8764655328f1e5283a8e6020',1,'fsl_common.h']]], + ['kstatusgroup_5fbutton',['kStatusGroup_BUTTON',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7415efb189bfb31491ef0ae45fb24d90',1,'fsl_common.h']]], + ['kstatusgroup_5fcaam',['kStatusGroup_CAAM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a298049d9d9c8be1b2e7a42f38a734d87',1,'fsl_common.h']]], + ['kstatusgroup_5fcodec',['kStatusGroup_CODEC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7c488d28bc9be2e29bd0d133bce7389a',1,'fsl_common.h']]], + ['kstatusgroup_5fcommon_5ftask',['kStatusGroup_COMMON_TASK',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7771d56430ad7ff2553a1258aba16e02',1,'fsl_common.h']]], + ['kstatusgroup_5fcsi',['kStatusGroup_CSI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1d1d1a595e9f00c6c9f80c19ce1b8ec5',1,'fsl_common.h']]], + ['kstatusgroup_5fdcp',['kStatusGroup_DCP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8e7465155c679388316b2f874a284e9e',1,'fsl_common.h']]], + ['kstatusgroup_5fdebugconsole',['kStatusGroup_DebugConsole',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a499ec238a1614827065533960716e652',1,'fsl_common.h']]], + ['kstatusgroup_5fdma',['kStatusGroup_DMA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a210ff4fa30e99618f8d3e978df03a7b6',1,'fsl_common.h']]], + ['kstatusgroup_5fdmamgr',['kStatusGroup_DMAMGR',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3091dcef1c0c7cd48658d8b43b52fbaf',1,'fsl_common.h']]], + ['kstatusgroup_5fdmic',['kStatusGroup_DMIC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a679444433f12ae5649cb02c2032ca20e',1,'fsl_common.h']]], + ['kstatusgroup_5fdspi',['kStatusGroup_DSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aee549dc5fb5e05a0d8daaa61a089b222',1,'fsl_common.h']]], + ['kstatusgroup_5fecspi',['kStatusGroup_ECSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab99693af818132e3cb4f9198965ad637',1,'fsl_common.h']]], + ['kstatusgroup_5fedma',['kStatusGroup_EDMA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0ec7f0302a8f7eb082f449933880a1ad',1,'fsl_common.h']]], + ['kstatusgroup_5fenet',['kStatusGroup_ENET',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7d6b922ab2a42d6ef35cfb2be4f80251',1,'fsl_common.h']]], + ['kstatusgroup_5fenet_5fqos',['kStatusGroup_ENET_QOS',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aae462c0663af9e2d180cd06c5798ac3b',1,'fsl_common.h']]], + ['kstatusgroup_5fesai',['kStatusGroup_ESAI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a01101c0342017a7fbe7225a7aa285bad',1,'fsl_common.h']]], + ['kstatusgroup_5fextern_5feeprom',['kStatusGroup_EXTERN_EEPROM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8e4a33b100580c2c1606d66d5ffdfaa3',1,'fsl_common.h']]], + ['kstatusgroup_5fflash',['kStatusGroup_FLASH',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8db8bea33da992b22cafbae1dcf65bb0',1,'fsl_common.h']]], + ['kstatusgroup_5fflashiap',['kStatusGroup_FLASHIAP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae5b7283daca81a85091e27b80ece629a',1,'fsl_common.h']]], + ['kstatusgroup_5fflexcan',['kStatusGroup_FLEXCAN',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1461a28ac2297f07aa34581074cf9923',1,'fsl_common.h']]], + ['kstatusgroup_5fflexcomm_5fi2c',['kStatusGroup_FLEXCOMM_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aedd1abcbca188de6e16a6f088d59e92e',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fcamera',['kStatusGroup_FLEXIO_CAMERA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a214d1cc4faa574be18fa9d865f2ca36d',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fi2c',['kStatusGroup_FLEXIO_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a67e5d3d11fb3f47ec11d9ee612b98b94',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fi2s',['kStatusGroup_FLEXIO_I2S',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae834c896c69c50855c5cf07768a6cba3',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fmculcd',['kStatusGroup_FLEXIO_MCULCD',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a055d3788919f48c2d69463819d02d903',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fspi',['kStatusGroup_FLEXIO_SPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3bc2ecc10af8973a1ecc4f0163fb9b53',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fuart',['kStatusGroup_FLEXIO_UART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae7514134f14004b1835d27cac48bd991',1,'fsl_common.h']]], + ['kstatusgroup_5fflexspi',['kStatusGroup_FLEXSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a22f1bdf5e7abbeb0bdfe18cda0bc5aca',1,'fsl_common.h']]], + ['kstatusgroup_5fgeneric',['kStatusGroup_Generic',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae7c95e11ceb8067c9c2703f96e51aca7',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fflash',['kStatusGroup_HAL_FLASH',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa5afa714de4adf37bc00faf6c3dc589e',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fgpio',['kStatusGroup_HAL_GPIO',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a18ce0675c0cc628b2ff29a1bafce8b58',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fi2c',['kStatusGroup_HAL_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aaa30b9e3fdd5e93bae58e66521b3015d',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fi2s',['kStatusGroup_HAL_I2S',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac509445aa04b715b77e6461993b50085',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fpwm',['kStatusGroup_HAL_PWM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa4609e941ad1155a86c40bdfcb20a155',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5frng',['kStatusGroup_HAL_RNG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa0d0535965c8d28434b036961f6a8c20',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fspi',['kStatusGroup_HAL_SPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aba70aa1970435b3ccd39ac54f9d7a68c',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5ftimer',['kStatusGroup_HAL_TIMER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa44796b25ed6ed37f7fb25f6f4076c2d',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fuart',['kStatusGroup_HAL_UART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6510cce112fc6ed1e0523b5d7b307ca2',1,'fsl_common.h']]], + ['kstatusgroup_5fhashcrypt',['kStatusGroup_HASHCRYPT',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1dcb6a7c2605c9ed77388fcb25b01feb',1,'fsl_common.h']]], + ['kstatusgroup_5fi2c',['kStatusGroup_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a5c67a60e98e49151455f565c2834d228',1,'fsl_common.h']]], + ['kstatusgroup_5fi2s',['kStatusGroup_I2S',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0b66f34ec90c9b6a702e0f00f5ddae43',1,'fsl_common.h']]], + ['kstatusgroup_5fi3c',['kStatusGroup_I3C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6dbe13107a9dbb857242cf05e2319f9d',1,'fsl_common.h']]], + ['kstatusgroup_5fi3cbus',['kStatusGroup_I3CBUS',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae28000753ef8046bc9b08e03fc8a1899',1,'fsl_common.h']]], + ['kstatusgroup_5fiap',['kStatusGroup_IAP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a097d515214e888371df5c588b839529d',1,'fsl_common.h']]], + ['kstatusgroup_5fics',['kStatusGroup_ICS',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a01bf442d671041dcbd1649ec0428c3b6',1,'fsl_common.h']]], + ['kstatusgroup_5fiuart',['kStatusGroup_IUART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a33255aee9de4a1d093770b218f944d0f',1,'fsl_common.h']]], + ['kstatusgroup_5fled',['kStatusGroup_LED',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a84ab69a4e7f3f1c39f1c3a64d74af08c',1,'fsl_common.h']]], + ['kstatusgroup_5flist',['kStatusGroup_LIST',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2e3bc103af2d3db7b628f87174d2bff8',1,'fsl_common.h']]], + ['kstatusgroup_5flmem',['kStatusGroup_LMEM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a376f952aee5cd45d903da520a37e4c52',1,'fsl_common.h']]], + ['kstatusgroup_5flog',['kStatusGroup_LOG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2af6421e7b473bd882f5372ad1fa6d0e',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fi2c',['kStatusGroup_LPC_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab597c78848ce0e63d2518f14e7bac82b',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fi2c_5f1',['kStatusGroup_LPC_I2C_1',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a749eaf601d6fe3124f054bcb796b348c',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fminispi',['kStatusGroup_LPC_MINISPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab0104dd99e52fbf948f4ae030de5313d',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fspi',['kStatusGroup_LPC_SPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac4c2c9d32010087f0602dbdf2c389857',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fspi_5fssp',['kStatusGroup_LPC_SPI_SSP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa2c382624b5763cf24cf9727fbfadde3',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fusart',['kStatusGroup_LPC_USART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a02f52b9532ae0d4af04f5c054f3fab84',1,'fsl_common.h']]], + ['kstatusgroup_5flpi2c',['kStatusGroup_LPI2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0d6c6a34fc0b6dbcb323f010556a3be1',1,'fsl_common.h']]], + ['kstatusgroup_5flpsci',['kStatusGroup_LPSCI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9f1b2d0eeee16f209d7eed3bdb1cf533',1,'fsl_common.h']]], + ['kstatusgroup_5flpspi',['kStatusGroup_LPSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a491dbb2373725b607970c032f4e04ee3',1,'fsl_common.h']]], + ['kstatusgroup_5flpuart',['kStatusGroup_LPUART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3bcb0be184f8d5bb76d4be8e99b4e45e',1,'fsl_common.h']]], + ['kstatusgroup_5fltc',['kStatusGroup_LTC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a64b54e0423e0ad8a227a38cad4ad4eda',1,'fsl_common.h']]], + ['kstatusgroup_5fmcan',['kStatusGroup_MCAN',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab7f77dd7e0c3d068baf39117ac08a0b9',1,'fsl_common.h']]], + ['kstatusgroup_5fmcg',['kStatusGroup_MCG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8210c55fe061ff24e75a0f928dbfcb39',1,'fsl_common.h']]], + ['kstatusgroup_5fmecc',['kStatusGroup_MECC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ad85b4bef880b9407425398fc584e16a0',1,'fsl_common.h']]], + ['kstatusgroup_5fmem_5fmanager',['kStatusGroup_MEM_MANAGER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29acdfe26eb8bbbaaea438470512401e09a',1,'fsl_common.h']]], + ['kstatusgroup_5fmipi_5fdsi',['kStatusGroup_MIPI_DSI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29abdf3fca48a7a13b67d0207aeb59bc581',1,'fsl_common.h']]], + ['kstatusgroup_5fmmdc',['kStatusGroup_MMDC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a67a884fec4d6adb5b455d50a0a5617a5',1,'fsl_common.h']]], + ['kstatusgroup_5fmscan',['kStatusGroup_MSCAN',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a858563b1d87d6fa57a8f442025655201',1,'fsl_common.h']]], + ['kstatusgroup_5fmsg',['kStatusGroup_MSG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6d0dedbec7ee218b0ae03f23edad02fd',1,'fsl_common.h']]], + ['kstatusgroup_5fnotifier',['kStatusGroup_NOTIFIER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a56134a73f0cfd393dd7cf7fb2395dd99',1,'fsl_common.h']]], + ['kstatusgroup_5fosa',['kStatusGroup_OSA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a5b65c75456471a2536a97a30db4b8da3',1,'fsl_common.h']]], + ['kstatusgroup_5fotfad',['kStatusGroup_OTFAD',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4f53ab1f39031629ac12159920f0cde1',1,'fsl_common.h']]], + ['kstatusgroup_5fotp',['kStatusGroup_OTP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1d9b7b66bfaaf53b42aad8462c88ea62',1,'fsl_common.h']]], + ['kstatusgroup_5fpdm',['kStatusGroup_PDM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae0b4ea9f05497a624e32811c4f36a3be',1,'fsl_common.h']]], + ['kstatusgroup_5fphy',['kStatusGroup_PHY',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a521a4b8ac1776d0f41af044886a71b3b',1,'fsl_common.h']]], + ['kstatusgroup_5fpower',['kStatusGroup_POWER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a94d2a6fe8021fed5487169a46421d47e',1,'fsl_common.h']]], + ['kstatusgroup_5fpower_5fmanager',['kStatusGroup_POWER_MANAGER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6c52b0b8b2d2ca670a5f8eca66212f54',1,'fsl_common.h']]], + ['kstatusgroup_5fpuf',['kStatusGroup_PUF',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a984927be2e0e57c4125e8e8f5d9c0f48',1,'fsl_common.h']]], + ['kstatusgroup_5fqsci',['kStatusGroup_QSCI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a025ed41827a0bd0b7bf60b853a921c7d',1,'fsl_common.h']]], + ['kstatusgroup_5fqspi',['kStatusGroup_QSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4a488e0f7cc1d3baa449ab4ca99e7b34',1,'fsl_common.h']]], + ['kstatusgroup_5fqueuedspi',['kStatusGroup_QUEUEDSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7712fcacc6d5e9698366daafc59ea644',1,'fsl_common.h']]], + ['kstatusgroup_5fsai',['kStatusGroup_SAI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae4461a3a085ea13b5fe7908bf1e109f8',1,'fsl_common.h']]], + ['kstatusgroup_5fscg',['kStatusGroup_SCG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9771abafdcf43bf924599a0081e92bf2',1,'fsl_common.h']]], + ['kstatusgroup_5fsdhc',['kStatusGroup_SDHC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aba83e94d1735b695119429a4e55bb3a4',1,'fsl_common.h']]], + ['kstatusgroup_5fsdif',['kStatusGroup_SDIF',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a25fb824a9ad702e631276a8ea5d03603',1,'fsl_common.h']]], + ['kstatusgroup_5fsdioslv',['kStatusGroup_SDIOSLV',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3e59e90d903b97bd45037175997f4ad6',1,'fsl_common.h']]], + ['kstatusgroup_5fsdk_5fflexspinor',['kStatusGroup_SDK_FLEXSPINOR',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a830e5b42a05424dc026bd36d30f143a5',1,'fsl_common.h']]], + ['kstatusgroup_5fsdk_5focotp',['kStatusGroup_SDK_OCOTP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a539b147c0d1409a0e11c3ae340886fa8',1,'fsl_common.h']]], + ['kstatusgroup_5fsdma',['kStatusGroup_SDMA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab55df75d85633505960f611180054524',1,'fsl_common.h']]], + ['kstatusgroup_5fsdmmc',['kStatusGroup_SDMMC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1c5e35d9d03724b7ccadcae8e0451384',1,'fsl_common.h']]], + ['kstatusgroup_5fsdramc',['kStatusGroup_SDRAMC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3b3116c6f4aa1a88e6e7abc45df58938',1,'fsl_common.h']]], + ['kstatusgroup_5fsdspi',['kStatusGroup_SDSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a85685b8cde1285d240569b9518c32fc0',1,'fsl_common.h']]], + ['kstatusgroup_5fsema42',['kStatusGroup_SEMA42',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a073c6e3ccd0dbcf1b812cb21da5e7df9',1,'fsl_common.h']]], + ['kstatusgroup_5fsemc',['kStatusGroup_SEMC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2fef671dda58af09262787022fe321fe',1,'fsl_common.h']]], + ['kstatusgroup_5fserialmanager',['kStatusGroup_SERIALMANAGER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a39a54cda2a1cac31e1c00be0eb4a7620',1,'fsl_common.h']]], + ['kstatusgroup_5fsfa',['kStatusGroup_SFA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9cf111a176ebe1210ae6faaa950aac54',1,'fsl_common.h']]], + ['kstatusgroup_5fshell',['kStatusGroup_SHELL',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a660addd059be8786f2aa3d9a1a196ae1',1,'fsl_common.h']]], + ['kstatusgroup_5fsmartcard',['kStatusGroup_SMARTCARD',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae16d6bba44ae6f24187946960fb826dd',1,'fsl_common.h']]], + ['kstatusgroup_5fsnt',['kStatusGroup_SNT',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae67462f0d7dbac886d8a1272a29b846c',1,'fsl_common.h']]], + ['kstatusgroup_5fspc',['kStatusGroup_SPC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7491bc6ede9a2eb6e7f292bb1530b7d7',1,'fsl_common.h']]], + ['kstatusgroup_5fspdif',['kStatusGroup_SPDIF',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8bea2b5f8b1458aaa0dc29ddbb972d87',1,'fsl_common.h']]], + ['kstatusgroup_5fspi',['kStatusGroup_SPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a60c31c70600aff4f290ca2d790622977',1,'fsl_common.h']]], + ['kstatusgroup_5fspifi',['kStatusGroup_SPIFI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac071c3c3d14ed8afadb2bb6de249c722',1,'fsl_common.h']]], + ['kstatusgroup_5ftimermanager',['kStatusGroup_TIMERMANAGER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4603f8fedc8ad994788e17baae895013',1,'fsl_common.h']]], + ['kstatusgroup_5ftouch_5fpanel',['kStatusGroup_TOUCH_PANEL',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a381f1929c41dcaef62d2d44326719db8',1,'fsl_common.h']]], + ['kstatusgroup_5ftrgmux',['kStatusGroup_TRGMUX',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29adb8c69c2f8cd344f3e2dc0b0db4a1631',1,'fsl_common.h']]], + ['kstatusgroup_5fuart',['kStatusGroup_UART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aeeb2ed6ef4ce59c7e1d416466f55bfb7',1,'fsl_common.h']]], + ['kstatusgroup_5fusdhc',['kStatusGroup_USDHC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae2f54d029f0e74c8fed8812e24000a74',1,'fsl_common.h']]], + ['kstatusgroup_5fxrdc',['kStatusGroup_XRDC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29af98b407f4e66e7046a3173031b45253d',1,'fsl_common.h']]], + ['kswm_5facmp_5finput1',['kSWM_ACMP_INPUT1',['../a00095.html#gga6db188a71a269613f30825af80c02053a28fab9703b5177948f7409efa9ff848a',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5finput2',['kSWM_ACMP_INPUT2',['../a00095.html#gga6db188a71a269613f30825af80c02053abd4f15c4f7b44b457764ab2aa67ac5ac',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5finput3',['kSWM_ACMP_INPUT3',['../a00095.html#gga6db188a71a269613f30825af80c02053ad8072ce6e9985ae8377377ae49ba57d7',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5finput4',['kSWM_ACMP_INPUT4',['../a00095.html#gga6db188a71a269613f30825af80c02053a2f09e0ca30217841402ba6bf16f8f785',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5finput5',['kSWM_ACMP_INPUT5',['../a00095.html#gga6db188a71a269613f30825af80c02053ad1b1f498a44a52ed74eab7333c03e177',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5fout',['kSWM_ACMP_OUT',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da76769594d29a6d8659c5c625b4212a24',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn0',['kSWM_ADC_CHN0',['../a00095.html#gga6db188a71a269613f30825af80c02053acc0420d5b902bffdc029c0a179fd9653',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn1',['kSWM_ADC_CHN1',['../a00095.html#gga6db188a71a269613f30825af80c02053af96a078ddf8497b6680dcb8812abccaf',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn10',['kSWM_ADC_CHN10',['../a00095.html#gga6db188a71a269613f30825af80c02053a3872c11496f6cd2755a2cc33edeee25e',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn11',['kSWM_ADC_CHN11',['../a00095.html#gga6db188a71a269613f30825af80c02053a1195026daab11c8e8e8a07ea2588dc59',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn2',['kSWM_ADC_CHN2',['../a00095.html#gga6db188a71a269613f30825af80c02053aab8f0dd610beed22acf2a5a2c3149a38',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn3',['kSWM_ADC_CHN3',['../a00095.html#gga6db188a71a269613f30825af80c02053ab3e46c2499e53d6187acef5b9c92faeb',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn4',['kSWM_ADC_CHN4',['../a00095.html#gga6db188a71a269613f30825af80c02053a131299a8724b490b48ff5ea4ae88ec85',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn5',['kSWM_ADC_CHN5',['../a00095.html#gga6db188a71a269613f30825af80c02053a8f49833db881a5cca72e39060510fe33',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn6',['kSWM_ADC_CHN6',['../a00095.html#gga6db188a71a269613f30825af80c02053a2cf1d219093b981b000fefd1b4b88835',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn7',['kSWM_ADC_CHN7',['../a00095.html#gga6db188a71a269613f30825af80c02053af60644696c7226d16b940a379e974d07',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn8',['kSWM_ADC_CHN8',['../a00095.html#gga6db188a71a269613f30825af80c02053aca55eb81b04844960f74d6b6f735f406',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn9',['kSWM_ADC_CHN9',['../a00095.html#gga6db188a71a269613f30825af80c02053a332c28d49858ffceda3b7d9a9a317d0c',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx0',['kSWM_CAPT_X0',['../a00095.html#gga6db188a71a269613f30825af80c02053a5673e5074470fd8c7773f987a45612ab',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx1',['kSWM_CAPT_X1',['../a00095.html#gga6db188a71a269613f30825af80c02053a74e21d63631f6e3eeae57269cc597ff9',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx2',['kSWM_CAPT_X2',['../a00095.html#gga6db188a71a269613f30825af80c02053ae11d56486ef46dfad9ea855f223483f2',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx3',['kSWM_CAPT_X3',['../a00095.html#gga6db188a71a269613f30825af80c02053a144b0c83acca82fa910848f7587af18e',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx4',['kSWM_CAPT_X4',['../a00095.html#gga6db188a71a269613f30825af80c02053adad77032cc009f3690361c9f4d552cdd',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx5',['kSWM_CAPT_X5',['../a00095.html#gga6db188a71a269613f30825af80c02053a4c1cd58e5ec1701988c4f75b9984ea02',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx6',['kSWM_CAPT_X6',['../a00095.html#gga6db188a71a269613f30825af80c02053aa8268aaae121ff5d8c034197c212be34',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx7',['kSWM_CAPT_X7',['../a00095.html#gga6db188a71a269613f30825af80c02053a1c37339ea26e38fc22dc2e0f684eca9f',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx8',['kSWM_CAPT_X8',['../a00095.html#gga6db188a71a269613f30825af80c02053a8812766f8dc3ffa1fa2f4ad7b3623432',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fyh',['kSWM_CAPT_YH',['../a00095.html#gga6db188a71a269613f30825af80c02053a839653f003a5f245984cbbb3e0ded090',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fyl',['kSWM_CAPT_YL',['../a00095.html#gga6db188a71a269613f30825af80c02053abe002214e7dc409f243527310e689060',1,'fsl_swm_connections.h']]], + ['kswm_5fclkin',['kSWM_CLKIN',['../a00095.html#gga6db188a71a269613f30825af80c02053add9353fb1a660338dc4129f564d43c41',1,'fsl_swm_connections.h']]], + ['kswm_5fclkout',['kSWM_CLKOUT',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da867964bdb44cfca767b2fe212243ad68',1,'fsl_swm_connections.h']]], + ['kswm_5fdac_5fout0',['kSWM_DAC_OUT0',['../a00095.html#gga6db188a71a269613f30825af80c02053aafaffe0fe7c5ed4eaed04bd7acac4f0b',1,'fsl_swm_connections.h']]], + ['kswm_5fdac_5fout1',['kSWM_DAC_OUT1',['../a00095.html#gga6db188a71a269613f30825af80c02053ad27f5123f30e1df03752e0441e384bc0',1,'fsl_swm_connections.h']]], + ['kswm_5ffixedpin_5fnum_5ffuncs',['kSWM_FIXEDPIN_NUM_FUNCS',['../a00095.html#gga6db188a71a269613f30825af80c02053a609f40f8714286a7fce78c131a97b69f',1,'fsl_swm_connections.h']]], + ['kswm_5fgpio_5fint_5fbmat',['kSWM_GPIO_INT_BMAT',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da9e23b0bd838b14f99f22d1ae76d63143',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c0_5fscl',['kSWM_I2C0_SCL',['../a00095.html#gga6db188a71a269613f30825af80c02053a6f0a53c70373fdbf41edf57122669a47',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c0_5fsda',['kSWM_I2C0_SDA',['../a00095.html#gga6db188a71a269613f30825af80c02053a679e93580df161b665365f658345ed65',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c1_5fscl',['kSWM_I2C1_SCL',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da5ba6a30f56eb6e001abb178bb215469a',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c1_5fsda',['kSWM_I2C1_SDA',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dab15fc1b1ba8e4f1a35fc314c60b467be',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c2_5fscl',['kSWM_I2C2_SCL',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daeb0140f33c859191ef01c944232eece0',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c2_5fsda',['kSWM_I2C2_SDA',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da29239ecd12dc74a5fea8212ac33384aa',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c3_5fscl',['kSWM_I2C3_SCL',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da762b4a79d8190dddad7ebc6aa10dc050',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c3_5fsda',['kSWM_I2C3_SDA',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daba956178be53723eb6036f604c405a38',1,'fsl_swm_connections.h']]], + ['kswm_5fmovable_5fnum_5ffuncs',['kSWM_MOVABLE_NUM_FUNCS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dac735c6243e08a73181d0f0f8f6c130bb',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f0',['kSWM_PortPin_P0_0',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35abf7ea2c0f06252d5e966ca63f23dba2e',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f1',['kSWM_PortPin_P0_1',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a9010bbdc4d0ba698a18c200f27586c5a',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f10',['kSWM_PortPin_P0_10',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35adb2af26fbb96cad1a3f4d666e3759e39',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f11',['kSWM_PortPin_P0_11',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a6514b3be861759fdc7f645c4a8190176',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f12',['kSWM_PortPin_P0_12',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a473548308d7fac0d5fa4ac959f81e444',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f13',['kSWM_PortPin_P0_13',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0efea555d71ff08c985b3c002e49f25a',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f14',['kSWM_PortPin_P0_14',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae2a752505db2acdb06e6047c3c447f63',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f15',['kSWM_PortPin_P0_15',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a21dd2c94b4ab7b133e9818a5a394f967',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f16',['kSWM_PortPin_P0_16',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0c38ea80f06768e2ad6282fbc11d5187',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f17',['kSWM_PortPin_P0_17',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a74b6edcb7dba9f95182a4faa57dd110d',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f18',['kSWM_PortPin_P0_18',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1eb0795f2598b9acf64e7abcb63f78d5',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f19',['kSWM_PortPin_P0_19',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a488a17a4e210b5000df9ecc534d24c8b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f2',['kSWM_PortPin_P0_2',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aa8e8084f5ea75a2e776f4a8f8a8d5e61',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f20',['kSWM_PortPin_P0_20',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1127b8f8732d34f2c80daf825bb14853',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f21',['kSWM_PortPin_P0_21',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a8ec22695a3c8fbc028cc86299ca76b9a',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f22',['kSWM_PortPin_P0_22',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35af2a8176b461addf3d18b1128800dd7ef',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f23',['kSWM_PortPin_P0_23',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae6795c51fac27d7426848568f125a6e8',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f24',['kSWM_PortPin_P0_24',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ac61483b0bbae6a06d6789e41aaf450fc',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f25',['kSWM_PortPin_P0_25',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a7a625624c8520faff1f2e6b0a1230ba5',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f26',['kSWM_PortPin_P0_26',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ac557f3233abd222c5cf7d809e082f94b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f27',['kSWM_PortPin_P0_27',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aea9feb0c4582cb00ea087fef692f7623',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f28',['kSWM_PortPin_P0_28',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35af3005bf86c4488117ca1396151d2c2af',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f29',['kSWM_PortPin_P0_29',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35acc5bcdfe59c04f2da33835496b3a2ddf',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f3',['kSWM_PortPin_P0_3',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a3a31a8f0c23e7d75db386e0f1705fcb8',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f30',['kSWM_PortPin_P0_30',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aeba0cfeb40308a0bd10bd33298bf9e84',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f31',['kSWM_PortPin_P0_31',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a7b0ebc4f977a126eb51422b3df962e87',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f4',['kSWM_PortPin_P0_4',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a933c38c001bf24a62f0c8bf62e9bbbfb',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f5',['kSWM_PortPin_P0_5',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a75b66d0e23730af2446bdec683db11d3',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f6',['kSWM_PortPin_P0_6',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a4e2797855da4686eb7de9e75c5034d66',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f7',['kSWM_PortPin_P0_7',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a8a3af6c1f0f5791666b2c8409321ee0b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f8',['kSWM_PortPin_P0_8',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ab0f66b94af6c72515e705077a0aea28b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f9',['kSWM_PortPin_P0_9',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ace9b73074e1c03234c89b40ecd52a1e6',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f0',['kSWM_PortPin_P1_0',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae94fc13ecb0921b638c70512bf8281d6',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f1',['kSWM_PortPin_P1_1',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35abaebf2f6b5b5cde087eb49ed5f2b1f35',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f10',['kSWM_PortPin_P1_10',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a73bc985bec01aad92ec6f227dfa33c71',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f11',['kSWM_PortPin_P1_11',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a89eb85c7d85a8ad52f20bac7eb445c21',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f12',['kSWM_PortPin_P1_12',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a42a138600cc12d14279d26ba18532f78',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f13',['kSWM_PortPin_P1_13',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0360fc48e017a241d3fe34d9ff2614ee',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f14',['kSWM_PortPin_P1_14',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35afcbc2b785e5b99a550f8504afe1f3bc1',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f15',['kSWM_PortPin_P1_15',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a95483f9f6afef5e552486e3dcc21b6e7',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f16',['kSWM_PortPin_P1_16',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ad8ae11b993e1cfa619d236025511e0bf',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f17',['kSWM_PortPin_P1_17',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a202dd64ec2e20bd15b7742c6d1cc1c6e',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f18',['kSWM_PortPin_P1_18',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae3ae151cd2fd03546272907de2f46452',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f19',['kSWM_PortPin_P1_19',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a9634c54b13db3584029727384a8ec150',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f2',['kSWM_PortPin_P1_2',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae2226bb62df630c243dbf2b25246ae31',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f20',['kSWM_PortPin_P1_20',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aac489e32c6f52361bfdfa34a2e29e361',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f21',['kSWM_PortPin_P1_21',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ad3faaa86fe964959f39e40214f65ec88',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f3',['kSWM_PortPin_P1_3',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35afc8592f6245641f8c5fdc9b0b7adc7d8',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f4',['kSWM_PortPin_P1_4',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1307d505951b16557a3a311a61952edc',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f5',['kSWM_PortPin_P1_5',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a2384fb04fb823834f7e4420e2f7e9834',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f6',['kSWM_PortPin_P1_6',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a70f9bbb4788bbe8974ebefa1c16e4f06',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f7',['kSWM_PortPin_P1_7',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a70c8684952c0ee7fe10facb7b8c3562f',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f8',['kSWM_PortPin_P1_8',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a939530a75e2bea978f104a90d4070832',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f9',['kSWM_PortPin_P1_9',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae02e17e293a9bd22a00e7b2c1aa4478b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5freset',['kSWM_PortPin_Reset',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a6873cb2ccda9efd34d7fdd75f3829f1c',1,'fsl_swm_connections.h']]], + ['kswm_5fresetn',['kSWM_RESETN',['../a00095.html#gga6db188a71a269613f30825af80c02053a2c3df2d1d6d1fb817003b824eb699585',1,'fsl_swm_connections.h']]], + ['kswm_5frst_5fn_5fshift_5frstn',['kSWM_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770abbd5b2eb886157d35a4ff88077fa192b',1,'fsl_reset.h']]], + ['kswm_5fsct_5fout0',['kSWM_SCT_OUT0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da224d928aad4331ef5d68009e70e538f5',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout1',['kSWM_SCT_OUT1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da80950740f9483b5483eef4606fdf7aa0',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout2',['kSWM_SCT_OUT2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dab7486d7c92e144b832cac5062cc7332d',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout3',['kSWM_SCT_OUT3',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da88e6d984d42304f78c3588deb26dda58',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout4',['kSWM_SCT_OUT4',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da8a91ce53d99f81616b9b89ccca0d3622',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout5',['kSWM_SCT_OUT5',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da486fdfd2ff450e9a90ddf8aee01558ce',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout6',['kSWM_SCT_OUT6',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da4c6afb8ab3dd8b1d9b1048ad887fa4d4',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fpin0',['kSWM_SCT_PIN0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daf8a4a3044fce3b8a4f4e623ae487eaf3',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fpin1',['kSWM_SCT_PIN1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daf75b73c12fb8bf5f3a11bdeac90a707c',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fpin2',['kSWM_SCT_PIN2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da48564e7fb10e92bdf93505fc7fa9c67e',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fpin3',['kSWM_SCT_PIN3',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da6fc9c6a69e49ac3a90c96df724896b0c',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fmiso',['kSWM_SPI0_MISO',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da84653c7b62da4f773676a39a2abe597a',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fmosi',['kSWM_SPI0_MOSI',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dad6e9059822d87be57e82960aa79d9229',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fsck',['kSWM_SPI0_SCK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dabd1859e7fd97d6aad4edf95f92eb1df0',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fssel0',['kSWM_SPI0_SSEL0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dadeb15fd0fbfb9f438e22762cad170359',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fssel1',['kSWM_SPI0_SSEL1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dacdcd02ea5803089ebcd609e227acab8b',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fssel2',['kSWM_SPI0_SSEL2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da47f29fa3b468816be5c1eb20acba2401',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fssel3',['kSWM_SPI0_SSEL3',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dabb2ff7e22a1cf8569371940cf8aa26be',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fmiso',['kSWM_SPI1_MISO',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dae283471f853e6c225c1e87993684f33e',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fmosi',['kSWM_SPI1_MOSI',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daaac1baf3720b00f74ac8ce909480aa55',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fsck',['kSWM_SPI1_SCK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da77e9143545ea4e513ef6011f7208f546',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fssel0',['kSWM_SPI1_SSEL0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da2b6c54c9683950102b65b04d72413485',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fssel1',['kSWM_SPI1_SSEL1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dada607a033b2f32aeff128ca0e44f5330',1,'fsl_swm_connections.h']]], + ['kswm_5fswclk',['kSWM_SWCLK',['../a00095.html#gga6db188a71a269613f30825af80c02053a9b86fc933fab954e947140ea4ca2ffe3',1,'fsl_swm_connections.h']]], + ['kswm_5fswdio',['kSWM_SWDIO',['../a00095.html#gga6db188a71a269613f30825af80c02053ac0ebb404f4a50e198c79a35af9721e6c',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fcap_5fchn0',['kSWM_T0_CAP_CHN0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da14bfd78536056ebdc4d2bfed0438b5cf',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fcap_5fchn1',['kSWM_T0_CAP_CHN1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da048cac659ef579d1358cc6d2a7db2c3a',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fcap_5fchn2',['kSWM_T0_CAP_CHN2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daef5103aadc41068ca6157543520491b2',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fmat_5fchn0',['kSWM_T0_MAT_CHN0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da0ac9c784851c59d1c334fba730bdc091',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fmat_5fchn1',['kSWM_T0_MAT_CHN1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da4be08849669f9f086a238335662c6ac1',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fmat_5fchn2',['kSWM_T0_MAT_CHN2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da11e574aeb2ec56f282a103d78c49ccbe',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fmat_5fchn3',['kSWM_T0_MAT_CHN3',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da3ab2e3d866e55d84dc2c342eb660c0d5',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5fcts',['kSWM_USART0_CTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dacf5086c4d10114ed1e2adf80ef0c1d8e',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5frts',['kSWM_USART0_RTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da83269426ac6b85e729bd940e7c6bc168',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5frxd',['kSWM_USART0_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dac38fd128ae8088af0ab82bb9e1ab2b0e',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5fsclk',['kSWM_USART0_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da95076efb390207c31347c9d6eaf7a568',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5ftxd',['kSWM_USART0_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da7a0b07e7613ca95cbae02f51e74338ae',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5fcts',['kSWM_USART1_CTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da813d3edec232542ea82e71a655b0b4fb',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5frts',['kSWM_USART1_RTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daf60de542a97e3ce9a3e5b7dbcc2bcda2',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5frxd',['kSWM_USART1_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da40ca641c0138d551c28bb9dd184bf948',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5fsclk',['kSWM_USART1_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da209dc130cd5427683bedca3187726030',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5ftxd',['kSWM_USART1_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da3ca0015b97fb5a1b24b1f6fda113488d',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5fcts',['kSWM_USART2_CTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da42ac6e1f6f6becfc8e66497f37c55d1a',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5frts',['kSWM_USART2_RTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da7cca77c6472c74168c27badb5004168e',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5frxd',['kSWM_USART2_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dadaead8c606fd8cbcbc0f91300767347a',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5fsclk',['kSWM_USART2_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da116239c55759f6c6001ceba755c7b8d2',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5ftxd',['kSWM_USART2_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daf89abebe911f5ecafec20d30dc2f682f',1,'fsl_swm_connections.h']]], + ['kswm_5fusart3_5frxd',['kSWM_USART3_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da76e8eae17c3a231d2264df8ee85816be',1,'fsl_swm_connections.h']]], + ['kswm_5fusart3_5fsclk',['kSWM_USART3_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daafad49b1a33633d2b55ae1ba9106d4fe',1,'fsl_swm_connections.h']]], + ['kswm_5fusart3_5ftxd',['kSWM_USART3_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da76658de4210286b1454d40e812df6ac4',1,'fsl_swm_connections.h']]], + ['kswm_5fusart4_5frxd',['kSWM_USART4_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da6c008c1255cce64e50b8645c5aebb0ad',1,'fsl_swm_connections.h']]], + ['kswm_5fusart4_5fsclk',['kSWM_USART4_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da9124d482fb323cb9201ffbc3914755b7',1,'fsl_swm_connections.h']]], + ['kswm_5fusart4_5ftxd',['kSWM_USART4_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da5a04ae8d36afacb8c813cbd1de05d304',1,'fsl_swm_connections.h']]], + ['kswm_5fvddcmp',['kSWM_VDDCMP',['../a00095.html#gga6db188a71a269613f30825af80c02053a1c8051ee75028cdb756ce666cc9b1bb9',1,'fsl_swm_connections.h']]], + ['kswm_5fxtalin',['kSWM_XTALIN',['../a00095.html#gga6db188a71a269613f30825af80c02053a2947dc590a82f761d8c0f634a95eb3ef',1,'fsl_swm_connections.h']]], + ['kswm_5fxtalout',['kSWM_XTALOUT',['../a00095.html#gga6db188a71a269613f30825af80c02053af2012960829ef051b69391eee877d167',1,'fsl_swm_connections.h']]], + ['ksyscon_5fgpioport0pin0topintsel',['kSYSCON_GpioPort0Pin0ToPintsel',['../a00096.html#gga4a63ee69b68459770551a0e4d7b6cdadafe2a386c6f3e8884b995d08fd87de542',1,'fsl_syscon_connections.h']]], + ['kuart0_5fclk_5ffrom_5ffrg0clk',['kUART0_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad0784125581fd7bf09f4b3bab3af725d',1,'fsl_clock.h']]], + ['kuart0_5fclk_5ffrom_5ffrg1clk',['kUART0_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a7ef63f722c9c6e188ea209ba84f6991c',1,'fsl_clock.h']]], + ['kuart0_5fclk_5ffrom_5ffro',['kUART0_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a67d2eb5235a0677d1ef161e5e1c2b340',1,'fsl_clock.h']]], + ['kuart0_5fclk_5ffrom_5ffro_5fdiv',['kUART0_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af06770587aa45bbb62d1e4fe36d03d81',1,'fsl_clock.h']]], + ['kuart0_5fclk_5ffrom_5fmainclk',['kUART0_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a841785f980e4c406eeecdcf07559fe66',1,'fsl_clock.h']]], + ['kuart0_5frst_5fn_5fshift_5frstn',['kUART0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aa294a3c09c1565947ebcd78694acff24',1,'fsl_reset.h']]], + ['kuart1_5fclk_5ffrom_5ffrg0clk',['kUART1_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af45a833dead43235df03a982dc25ea33',1,'fsl_clock.h']]], + ['kuart1_5fclk_5ffrom_5ffrg1clk',['kUART1_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a4c795835151e3db8e027500091ca7235',1,'fsl_clock.h']]], + ['kuart1_5fclk_5ffrom_5ffro',['kUART1_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a9fbd759cc60932bb0896625543477290',1,'fsl_clock.h']]], + ['kuart1_5fclk_5ffrom_5ffro_5fdiv',['kUART1_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a1b183d67629d90ddc1a9b9baf2ebc285',1,'fsl_clock.h']]], + ['kuart1_5fclk_5ffrom_5fmainclk',['kUART1_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a066679b9e0a01ccd0aad6e6caa643f2f',1,'fsl_clock.h']]], + ['kuart1_5frst_5fn_5fshift_5frstn',['kUART1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a8bc751e4927f0c20a0695b284fc40c38',1,'fsl_reset.h']]], + ['kuart2_5fclk_5ffrom_5ffrg0clk',['kUART2_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad4c08c5a89da40d06718a4f83a999a15',1,'fsl_clock.h']]], + ['kuart2_5fclk_5ffrom_5ffrg1clk',['kUART2_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a4e4a114969e2446efb826b0f436e60b4',1,'fsl_clock.h']]], + ['kuart2_5fclk_5ffrom_5ffro',['kUART2_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58afa1754a6f8ad6663b97370dd3d2e4f3b',1,'fsl_clock.h']]], + ['kuart2_5fclk_5ffrom_5ffro_5fdiv',['kUART2_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a45a5f9cbfc0626d893768c61e922dd1e',1,'fsl_clock.h']]], + ['kuart2_5fclk_5ffrom_5fmainclk',['kUART2_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a43ab6417acfda68bfa6fb3228bc0fa22',1,'fsl_clock.h']]], + ['kuart2_5frst_5fn_5fshift_5frstn',['kUART2_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aba96ac75d5b05b7df8222704e24def14',1,'fsl_reset.h']]], + ['kuart3_5fclk_5ffrom_5ffrg0clk',['kUART3_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a3783440f6a72a888a464ad824842740e',1,'fsl_clock.h']]], + ['kuart3_5fclk_5ffrom_5ffrg1clk',['kUART3_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a98f2d7502907ece893c0bbee9202651f',1,'fsl_clock.h']]], + ['kuart3_5fclk_5ffrom_5ffro',['kUART3_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58aaf28b28236e7172dd366aab893c08de3',1,'fsl_clock.h']]], + ['kuart3_5fclk_5ffrom_5ffro_5fdiv',['kUART3_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a0b370ac43c3546605db7ba397ba9a775',1,'fsl_clock.h']]], + ['kuart3_5fclk_5ffrom_5fmainclk',['kUART3_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a9d6f615bb923c12b2d7b831272e85daf',1,'fsl_clock.h']]], + ['kuart3_5frst_5fn_5fshift_5frstn',['kUART3_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aa61d8fdd3f725cee11918bae04493dc8',1,'fsl_reset.h']]], + ['kuart4_5fclk_5ffrom_5ffrg0clk',['kUART4_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad30f9ec4dd8bf91c3b072f8eae495a3e',1,'fsl_clock.h']]], + ['kuart4_5fclk_5ffrom_5ffrg1clk',['kUART4_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ac70f329af8bfa7becadf7396b6c55aac',1,'fsl_clock.h']]], + ['kuart4_5fclk_5ffrom_5ffro',['kUART4_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af3df9606907ec93d127cf6759090dc64',1,'fsl_clock.h']]], + ['kuart4_5fclk_5ffrom_5ffro_5fdiv',['kUART4_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a37e357b51fc23fcc649e5c1085a57524',1,'fsl_clock.h']]], + ['kuart4_5fclk_5ffrom_5fmainclk',['kUART4_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ae4d335d5f4a2a8de27f87f8c6c38ddfd',1,'fsl_clock.h']]], + ['kuart4_5frst_5fn_5fshift_5frstn',['kUART4_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac1d90aca68025a47b316e6f6b02c209e',1,'fsl_reset.h']]], + ['kusart_5f7bitsperchar',['kUSART_7BitsPerChar',['../a00023.html#gga28e46a3538cf5f5140523132a963283ca9562d6cdd240e9808a9a1d1946f400b7',1,'fsl_usart.h']]], + ['kusart_5f8bitsperchar',['kUSART_8BitsPerChar',['../a00023.html#gga28e46a3538cf5f5140523132a963283cad71aee19329a4127614132d30e50ad8a',1,'fsl_usart.h']]], + ['kusart_5fallinterruptenable',['kUSART_AllInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ad97d89d6e3a853cc07c854838a4f31f9',1,'fsl_usart.h']]], + ['kusart_5fautobauderrorflag',['kUSART_AutoBaudErrorFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610aa655bdfd278003a00cf5195986a38892',1,'fsl_usart.h']]], + ['kusart_5fautobauderrorinterruptenable',['kUSART_AutoBaudErrorInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a7154c6ede60243bf5f9e727a5cb18ce5',1,'fsl_usart.h']]], + ['kusart_5fctsstate',['kUSART_CtsState',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2515d20982ec4edf617f6872e666a1d3',1,'fsl_usart.h']]], + ['kusart_5fdeltactsflag',['kUSART_DeltaCtsFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a722bb0119b5dc19d471b62c622aca9c7',1,'fsl_usart.h']]], + ['kusart_5fdeltactsinterruptenable',['kUSART_DeltaCtsInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ac01c5ca3a2671c568e35d196ea223ada',1,'fsl_usart.h']]], + ['kusart_5fframerrorflag',['kUSART_FramErrorFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2187b4e63a575e94e6d3a1b7a5ce51d7',1,'fsl_usart.h']]], + ['kusart_5fframerrorinterruptenable',['kUSART_FramErrorInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853acc912dfbb3e827b37e9a942bf601672d',1,'fsl_usart.h']]], + ['kusart_5fhardwareoverrunflag',['kUSART_HardwareOverrunFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610ade5bc3f17cf2c303ba2e0eeedafd858c',1,'fsl_usart.h']]], + ['kusart_5fhardwareoverruninterruptenable',['kUSART_HardwareOverRunInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853afb9ef5dc29f02f42773fb5b7fcda2e3e',1,'fsl_usart.h']]], + ['kusart_5fonestopbit',['kUSART_OneStopBit',['../a00023.html#gga58ab07609b094f719f903475de6e57b4aa637b8f5f0edd262181a20c1fbed7c12',1,'fsl_usart.h']]], + ['kusart_5fparitydisabled',['kUSART_ParityDisabled',['../a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2a46309b174047a84a78c77b7648bdf21b',1,'fsl_usart.h']]], + ['kusart_5fparityerrorflag',['kUSART_ParityErrorFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a46d487d50d8392d25c5c4e76cdfb6674',1,'fsl_usart.h']]], + ['kusart_5fparityerrorinterruptenable',['kUSART_ParityErrorInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a3dc275bab22f77a1182bbab5fd5cea3b',1,'fsl_usart.h']]], + ['kusart_5fparityeven',['kUSART_ParityEven',['../a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2aad8d786301da1bb92e2b911c386d39eb',1,'fsl_usart.h']]], + ['kusart_5fparityodd',['kUSART_ParityOdd',['../a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2a64df3b823d2ab5f3f56ffb3f520eafb1',1,'fsl_usart.h']]], + ['kusart_5frxbreakflag',['kUSART_RxBreakFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610af0ae1c44d00b140e86202627084f8638',1,'fsl_usart.h']]], + ['kusart_5frxbreakinterruptenable',['kUSART_RxBreakInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a9c9626a150100989578d9f18f9b3d59a',1,'fsl_usart.h']]], + ['kusart_5frxidleflag',['kUSART_RxIdleFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610abc766d479d00f480e78d05f21f8e1d59',1,'fsl_usart.h']]], + ['kusart_5frxnoiseflag',['kUSART_RxNoiseFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610aef9ca7e74e386c6a6668cc2a0f43c9cd',1,'fsl_usart.h']]], + ['kusart_5frxnoiseinterruptenable',['kUSART_RxNoiseInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a7d342596a68c59d4e38bfe33c60f53c9',1,'fsl_usart.h']]], + ['kusart_5frxready',['kUSART_RxReady',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a03db476c7c52f9624dab00d9af430411',1,'fsl_usart.h']]], + ['kusart_5frxreadyinterruptenable',['kUSART_RxReadyInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853addb8c45f45a91da558ae553a72557445',1,'fsl_usart.h']]], + ['kusart_5frxsampleonfallingedge',['kUSART_RxSampleOnFallingEdge',['../a00023.html#gga786ba5b98195c3df810a061b6c0cca91a40fdc56c60a07652a4283491087eed6b',1,'fsl_usart.h']]], + ['kusart_5frxsampleonrisingedge',['kUSART_RxSampleOnRisingEdge',['../a00023.html#gga786ba5b98195c3df810a061b6c0cca91aea6908db956ab3f686c7ee54d68d401c',1,'fsl_usart.h']]], + ['kusart_5frxstartflag',['kUSART_RxStartFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2fab8368a6a3246714c83405202626b3',1,'fsl_usart.h']]], + ['kusart_5frxstartinterruptenable',['kUSART_RxStartInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ae642012aae33bd8954699572e4adb475',1,'fsl_usart.h']]], + ['kusart_5fsyncmodedisabled',['kUSART_SyncModeDisabled',['../a00023.html#gga7ecd603d2579abbe714d58eb582821b8af7a378247f82677090007d0c38be78f2',1,'fsl_usart.h']]], + ['kusart_5fsyncmodemaster',['kUSART_SyncModeMaster',['../a00023.html#gga7ecd603d2579abbe714d58eb582821b8af279132afb0bee88bae3065c20c79ab2',1,'fsl_usart.h']]], + ['kusart_5fsyncmodeslave',['kUSART_SyncModeSlave',['../a00023.html#gga7ecd603d2579abbe714d58eb582821b8a71df5907ecd16c5f08fe1e6673064958',1,'fsl_usart.h']]], + ['kusart_5ftwostopbit',['kUSART_TwoStopBit',['../a00023.html#gga58ab07609b094f719f903475de6e57b4a3aee3195dc850778e33f2ebacf8847d3',1,'fsl_usart.h']]], + ['kusart_5ftxdisableflag',['kUSART_TxDisableFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a615387365fba3c394b1a595e9baa3c95',1,'fsl_usart.h']]], + ['kusart_5ftxdisableinterruptenable',['kUSART_TxDisableInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a2dae162d4f0509695fce62b0ed1b9e4b',1,'fsl_usart.h']]], + ['kusart_5ftxidleflag',['kUSART_TxIdleFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a8106fa188ea138f48c7740dcf5c2b294',1,'fsl_usart.h']]], + ['kusart_5ftxidleinterruptenable',['kUSART_TxIdleInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ac5611ab6b973e6777a7d7db8321f62f2',1,'fsl_usart.h']]], + ['kusart_5ftxready',['kUSART_TxReady',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610ab35037d2ed958a740984aa0a125d72aa',1,'fsl_usart.h']]], + ['kusart_5ftxreadyinterruptenable',['kUSART_TxReadyInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a42c8946331d417404af48aed9fe53f88',1,'fsl_usart.h']]], + ['kwkt_5falarmflag',['kWKT_AlarmFlag',['../a00024.html#gga0c4c3a2aa689d7cdd0608eb1076d83aaaf60149e2b9f22db27ef273f412e86150',1,'fsl_wkt.h']]], + ['kwkt_5fdividedfroclocksource',['kWKT_DividedFROClockSource',['../a00024.html#ggaf985ebf5e165e2fbda510cac71cad222a22e7e8fe1fd3cc9d4d3278e0fb7bae32',1,'fsl_wkt.h']]], + ['kwkt_5fexternalclocksource',['kWKT_ExternalClockSource',['../a00024.html#ggaf985ebf5e165e2fbda510cac71cad222afe5c2695869b965f7833386743cc1147',1,'fsl_wkt.h']]], + ['kwkt_5flowpowerclocksource',['kWKT_LowPowerClockSource',['../a00024.html#ggaf985ebf5e165e2fbda510cac71cad222a3c617873be9cb696f53cca9529ca6dfc',1,'fsl_wkt.h']]], + ['kwkt_5frst_5fn_5fshift_5frstn',['kWKT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a80aae2b47fdc2701cb923d27ca9e5a7a',1,'fsl_reset.h']]], + ['kwwdt_5ftimeoutflag',['kWWDT_TimeoutFlag',['../a00025.html#ggaca0e9724bd1f25336527ea66c77e476faea9db9afc1f9c70872a755eaa24a4184',1,'fsl_wwdt.h']]], + ['kwwdt_5fwarningflag',['kWWDT_WarningFlag',['../a00025.html#ggaca0e9724bd1f25336527ea66c77e476fa825be03d771f06e1d6cf947ca78f857e',1,'fsl_wwdt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6c.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6c.html new file mode 100644 index 0000000..3623130 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6c.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6c.js new file mode 100644 index 0000000..7ad96a2 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6c.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['laddervalue',['ladderValue',['../a00008.html#a8271667393096dad310f8b2e486b1c4b',1,'acomp_ladder_config_t']]], + ['lastcommand',['lastCommand',['../a00022.html#a4e66b572aa792a179028af5340bc83cb',1,'_spi_master_handle']]], + ['level',['level',['../a00021.html#a8734c80f138c70349b10e6204d8db899',1,'sctimer_pwm_signal_param_t']]], + ['linktonextdesc',['linkToNextDesc',['../a00015.html#a8b4151dcf43270fbbeff39334048e7e1',1,'dma_descriptor_t']]], + ['loopback',['loopback',['../a00023.html#a9892d7a138f2245bc9b7fe4e6c1652fb',1,'usart_config_t']]], + ['lpc_5facomp_3a_20analog_20comparator_20driver',['LPC_ACOMP: Analog comparator Driver',['../a00008.html',1,'']]], + ['lpc_5fdac_5fdriver_5fversion',['LPC_DAC_DRIVER_VERSION',['../a00014.html#ga92d95f6b17de859a557ed350a86ff56e',1,'fsl_dac.h']]], + ['lpc_5fiocon_5fdriver_5fversion',['LPC_IOCON_DRIVER_VERSION',['../a00019.html#gac4193f0e0cb9b0469f58af2648024059',1,'fsl_iocon.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6d.html new file mode 100644 index 0000000..82ceec7 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6d.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6d.js new file mode 100644 index 0000000..f32b201 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6d.js @@ -0,0 +1,30 @@ +var searchData= +[ + ['make_5fstatus',['MAKE_STATUS',['../a00087.html#gad76dfbb0423d0cd3a7b77cbcd9043146',1,'fsl_common.h']]], + ['make_5fversion',['MAKE_VERSION',['../a00087.html#ga812138aa3315b0c6953c1a26130bcc37',1,'fsl_common.h']]], + ['matchvalue',['matchValue',['../a00013.html#afa3614f09e787565b3514ddd4d9545a0',1,'ctimer_match_config_t']]], + ['mdelay',['mDelay',['../a00010.html#a6f8664474411be56853bb70cd8de8b70',1,'capt_config_t']]], + ['mode',['mode',['../a00013.html#ab72ef3a10cab9754d3cecb44ef7ad6ac',1,'ctimer_config_t']]], + ['mrt_3a_20multi_2drate_20timer',['MRT: Multi-Rate Timer',['../a00020.html',1,'']]], + ['mrt_5fchnl_5ft',['mrt_chnl_t',['../a00020.html#gaece5c1972e35dec2efcce98847a09622',1,'fsl_mrt.h']]], + ['mrt_5fclearstatusflags',['MRT_ClearStatusFlags',['../a00020.html#ga959db20281cfce080c684bd94f667799',1,'fsl_mrt.h']]], + ['mrt_5fclocks',['MRT_CLOCKS',['../a00011.html#gac3a1bd1656603951722b345b45f888e9',1,'fsl_clock.h']]], + ['mrt_5fconfig_5ft',['mrt_config_t',['../a00020.html#a00130',1,'']]], + ['mrt_5fdeinit',['MRT_Deinit',['../a00020.html#ga5d988ee09b604ab28f1b37320ee8d2d9',1,'fsl_mrt.h']]], + ['mrt_5fdisableinterrupts',['MRT_DisableInterrupts',['../a00020.html#ga7a8066680089523fa602dbe58b0c0505',1,'fsl_mrt.h']]], + ['mrt_5fenableinterrupts',['MRT_EnableInterrupts',['../a00020.html#gae875817838659e596dc1cb1527c948c3',1,'fsl_mrt.h']]], + ['mrt_5fgetcurrenttimercount',['MRT_GetCurrentTimerCount',['../a00020.html#ga7c0bbb20b4abd7450f860277ef9d8a20',1,'fsl_mrt.h']]], + ['mrt_5fgetdefaultconfig',['MRT_GetDefaultConfig',['../a00020.html#gad30aa85105a47b708fd5880a929e5e84',1,'fsl_mrt.h']]], + ['mrt_5fgetenabledinterrupts',['MRT_GetEnabledInterrupts',['../a00020.html#ga2e666900eef9bdbd9d9e587d2b7ca2c2',1,'fsl_mrt.h']]], + ['mrt_5fgetidlechannel',['MRT_GetIdleChannel',['../a00020.html#ga320ba098c93a30174254eb763dd37dde',1,'fsl_mrt.h']]], + ['mrt_5fgetstatusflags',['MRT_GetStatusFlags',['../a00020.html#gafa8493a0faee1cc356da26ca99a54da8',1,'fsl_mrt.h']]], + ['mrt_5finit',['MRT_Init',['../a00020.html#ga44091408531a61dfac7c4ee4982be317',1,'fsl_mrt.h']]], + ['mrt_5finterrupt_5fenable_5ft',['mrt_interrupt_enable_t',['../a00020.html#ga9d2f90ae2c6f99410e2908dac8cc6943',1,'fsl_mrt.h']]], + ['mrt_5fsetupchannelmode',['MRT_SetupChannelMode',['../a00020.html#ga8f4d38afa34e99ba521d9ca08be06355',1,'fsl_mrt.h']]], + ['mrt_5fstarttimer',['MRT_StartTimer',['../a00020.html#ga388dd5041e6c179d637e17cd6e5a607e',1,'fsl_mrt.h']]], + ['mrt_5fstatus_5fflags_5ft',['mrt_status_flags_t',['../a00020.html#ga0bb94508d8cf924c3a6971364377673a',1,'fsl_mrt.h']]], + ['mrt_5fstoptimer',['MRT_StopTimer',['../a00020.html#ga7620866a54acdcc17abab2b46a94dc6c',1,'fsl_mrt.h']]], + ['mrt_5ftimer_5fmode_5ft',['mrt_timer_mode_t',['../a00020.html#gad481f648f1c89a1eab327530d6fef1d0',1,'fsl_mrt.h']]], + ['mrt_5fupdatetimerperiod',['MRT_UpdateTimerPeriod',['../a00020.html#ga57f3d18e0ec88a5eb04b3282e0f3dc95',1,'fsl_mrt.h']]], + ['mtb_5fclocks',['MTB_CLOCKS',['../a00011.html#ga2b8416b451bb271a2ffce397ef822dff',1,'fsl_clock.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6e.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6e.html new file mode 100644 index 0000000..92a12bb --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6e.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6e.js new file mode 100644 index 0000000..7502b95 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nextdesc',['nextDesc',['../a00015.html#a7bdfedca753e094b2c288f1cbb956889',1,'dma_channel_config_t::nextDesc()'],['../a00015.html#a24f716a2b7775c1cb9a59b7c2374508b',1,'dma_transfer_config_t::nextDesc()']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6f.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6f.html new file mode 100644 index 0000000..51c8b11 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6f.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6f.js new file mode 100644 index 0000000..32de253 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_6f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['outcontrol',['outControl',['../a00013.html#a0e8b29f0c0f74c5273942a521e3b16d6',1,'ctimer_match_config_t']]], + ['outinitstate',['outInitState',['../a00021.html#a3897b3b9321e3cecb05972fa68f947d5',1,'sctimer_config_t']]], + ['outpininitstate',['outPinInitState',['../a00013.html#a31ca8ee3406b7a17c793d94469e1e68d',1,'ctimer_match_config_t']]], + ['output',['output',['../a00021.html#ae030d75078255fd25e577c14d0a0fc80',1,'sctimer_pwm_signal_param_t']]], + ['outputlogic',['outputLogic',['../a00016.html#a9d37ffd9a2943f10a91095759bd52da5',1,'gpio_pin_config_t']]], + ['overrunflag',['overrunFlag',['../a00009.html#a5d9fd2ad5f95c7b55a72ac1b5d10221f',1,'adc_result_info_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_70.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_70.html new file mode 100644 index 0000000..a279cb2 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_70.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_70.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_70.js new file mode 100644 index 0000000..064e827 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_70.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['paritymode',['parityMode',['../a00023.html#aff1d7e368b35ae89db8aa393207e7ccc',1,'usart_config_t']]], + ['pd_5fbit_5ft',['pd_bit_t',['../a00085.html#ga26070d8045aac640b0b755bd7b1b5695',1,'fsl_power.h']]], + ['pindirection',['pinDirection',['../a00016.html#a70aed128003103272f5740f12fbff525',1,'gpio_pin_config_t']]], + ['pint_5fcb_5ft',['pint_cb_t',['../a00094.html#ga262ac9596c0926fbe5f346e0f6aaf9f5',1,'fsl_pint.h']]], + ['pint_5fdeinit',['PINT_Deinit',['../a00094.html#ga78ffa3e09e17db8dc6a9038123ad1c46',1,'fsl_pint.h']]], + ['pint_5fdisablecallback',['PINT_DisableCallback',['../a00094.html#gada262638d555d9a503ddcdbed24ec475',1,'fsl_pint.h']]], + ['pint_5fdisablecallbackbyindex',['PINT_DisableCallbackByIndex',['../a00094.html#gad7300bf374c0cdc65fadff76f3ee7e5c',1,'fsl_pint.h']]], + ['pint_3a_20pin_20interrupt_20and_20pattern_20match_20driver',['PINT: Pin Interrupt and Pattern Match Driver',['../a00094.html',1,'']]], + ['pint_5fenablecallback',['PINT_EnableCallback',['../a00094.html#gac6b1406205adace6696a1647250ad76d',1,'fsl_pint.h']]], + ['pint_5fenablecallbackbyindex',['PINT_EnableCallbackByIndex',['../a00094.html#ga2cb0ee73a24657dd6994cb00b78c3137',1,'fsl_pint.h']]], + ['pint_5finit',['PINT_Init',['../a00094.html#gaf043d142dac622bedd50b736b52ac6e9',1,'fsl_pint.h']]], + ['pint_5fpatternmatchconfig',['PINT_PatternMatchConfig',['../a00094.html#ga1dc66cd865640c0b60eb128a868eab37',1,'fsl_pint.h']]], + ['pint_5fpatternmatchdisable',['PINT_PatternMatchDisable',['../a00094.html#ga4dd886dc387a64a5cb146ccd7297e1e1',1,'fsl_pint.h']]], + ['pint_5fpatternmatchdisablerxev',['PINT_PatternMatchDisableRXEV',['../a00094.html#ga73f0e7280f898bf99fe92b3519878a77',1,'fsl_pint.h']]], + ['pint_5fpatternmatchenable',['PINT_PatternMatchEnable',['../a00094.html#ga8911d499fb65ffe496c01f65bad9314f',1,'fsl_pint.h']]], + ['pint_5fpatternmatchenablerxev',['PINT_PatternMatchEnableRXEV',['../a00094.html#gaf5754b4b1d1436c359dde18101657d4e',1,'fsl_pint.h']]], + ['pint_5fpatternmatchgetconfig',['PINT_PatternMatchGetConfig',['../a00094.html#ga6d4f8e83cec4bc716231c97c2ceb5421',1,'fsl_pint.h']]], + ['pint_5fpatternmatchgetstatus',['PINT_PatternMatchGetStatus',['../a00094.html#ga74b3eece6c6eabc38f3194b125ff80d5',1,'fsl_pint.h']]], + ['pint_5fpatternmatchgetstatusall',['PINT_PatternMatchGetStatusAll',['../a00094.html#ga567b159bbfa265ed02c4900769ed8fe4',1,'fsl_pint.h']]], + ['pint_5fpatternmatchresetdetectlogic',['PINT_PatternMatchResetDetectLogic',['../a00094.html#ga00d40f5f01c445206f1f800dcc7b6e89',1,'fsl_pint.h']]], + ['pint_5fpin_5fenable_5ft',['pint_pin_enable_t',['../a00094.html#ga6a17e5c52721f6eb754f54cc72b58c91',1,'fsl_pint.h']]], + ['pint_5fpin_5fint_5ft',['pint_pin_int_t',['../a00094.html#ga15da1f70e8d0a05e9d492d01ceca7da8',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrfallflag',['PINT_PinInterruptClrFallFlag',['../a00094.html#ga055c655c611b5645ce6903557ef809bb',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrfallflagall',['PINT_PinInterruptClrFallFlagAll',['../a00094.html#ga11c44cbe5b42c79b22a3053c85b1e5d0',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrriseflag',['PINT_PinInterruptClrRiseFlag',['../a00094.html#ga269af5856a4cfd5d2a171b4777d6884a',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrriseflagall',['PINT_PinInterruptClrRiseFlagAll',['../a00094.html#ga53dd5706866fa0313689db6e4d9c1a9b',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrstatus',['PINT_PinInterruptClrStatus',['../a00094.html#gab784e6aea0129b0c90164462bd0dbac5',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrstatusall',['PINT_PinInterruptClrStatusAll',['../a00094.html#gace94acb3f70964230b2606fdbeb5f58b',1,'fsl_pint.h']]], + ['pint_5fpininterruptconfig',['PINT_PinInterruptConfig',['../a00094.html#ga363edbba9536380728e44bd7d1a0e7df',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetconfig',['PINT_PinInterruptGetConfig',['../a00094.html#ga12c568c9b7f6d46257dc63505a381701',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetfallflag',['PINT_PinInterruptGetFallFlag',['../a00094.html#gaace443444dec2e5b7e3e20cf69c53def',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetfallflagall',['PINT_PinInterruptGetFallFlagAll',['../a00094.html#ga58eced039e8c793b7ff148d6cfacde5b',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetriseflag',['PINT_PinInterruptGetRiseFlag',['../a00094.html#gaec7a3986f92f8c11a70a80af1a93a3b6',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetriseflagall',['PINT_PinInterruptGetRiseFlagAll',['../a00094.html#ga08b623f67c277521182f8c9e630037ae',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetstatus',['PINT_PinInterruptGetStatus',['../a00094.html#ga99a96e386a822de59ac2d60149ec47f3',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetstatusall',['PINT_PinInterruptGetStatusAll',['../a00094.html#gab5dbaf58c90b1ef54bcd2c5dba9e178f',1,'fsl_pint.h']]], + ['pint_5fpmatch_5fbslice_5fcfg_5ft',['pint_pmatch_bslice_cfg_t',['../a00094.html#gae1e5bfc17515fab76a1deab955203c6a',1,'fsl_pint.h']]], + ['pint_5fpmatch_5fbslice_5ft',['pint_pmatch_bslice_t',['../a00094.html#ga048bc24e58d7df40af2a45efaabeea9b',1,'fsl_pint.h']]], + ['pint_5fpmatch_5finput_5fsrc_5ft',['pint_pmatch_input_src_t',['../a00094.html#ga2e05f827d6a43eade4c22e9d75bc5d76',1,'fsl_pint.h']]], + ['pintsel_5fid',['PINTSEL_ID',['../a00096.html#gacec975ef3b52ff6266f4bf055d8bbbc0',1,'fsl_syscon_connections.h']]], + ['pmuc_5fpcon_5freserved_5fmask',['PMUC_PCON_RESERVED_MASK',['../a00085.html#gacc5b8fefeacc0f1909d657be9cedddf3',1,'fsl_power.h']]], + ['pollcount',['pollCount',['../a00010.html#ac5c6145f8f3ee5abc6130bea3de2d8c8',1,'capt_config_t']]], + ['polynomial',['polynomial',['../a00012.html#afbe53ea36b200e69cb7f693e6f0a11f1',1,'crc_config_t']]], + ['postdelay',['postDelay',['../a00022.html#a960b87887e431dabbb5641109cb56d90',1,'spi_delay_config_t']]], + ['power_20driver',['Power Driver',['../a00085.html',1,'']]], + ['power_5fbod_5finterrupt_5flevel_5ft',['power_bod_interrupt_level_t',['../a00085.html#gad856ab8003eb9953525518cddbc7814c',1,'fsl_power.h']]], + ['power_5fbod_5freset_5flevel_5ft',['power_bod_reset_level_t',['../a00085.html#gad4414c07be8e296fdf41c256e605c161',1,'fsl_power.h']]], + ['power_5fclrdeeppowerdownmodeflag',['POWER_ClrDeepPowerDownModeFlag',['../a00085.html#ga4b9f6c3aa18e60b7a85edfa8857906ed',1,'fsl_power.h']]], + ['power_5fclrsleepmodeflag',['POWER_ClrSleepModeFlag',['../a00085.html#ga7069e59acd0a3e196bb54b7a5bcead3d',1,'fsl_power.h']]], + ['power_5fdeepsleepconfig',['POWER_DeepSleepConfig',['../a00085.html#ga64687ae9aee146f932c9d822633ed751',1,'fsl_power.h']]], + ['power_5fdisabledeepsleep',['POWER_DisableDeepSleep',['../a00085.html#gabea720a67b6b06b187a5781b9955dc9c',1,'fsl_power.h']]], + ['power_5fdisablepd',['POWER_DisablePD',['../a00085.html#ga40a1d0c80f5189e9c56133a2bc15a4c2',1,'fsl_power.h']]], + ['power_5fenabledeepsleep',['POWER_EnableDeepSleep',['../a00085.html#gae9733cfb042126b04d237cc8db40dba0',1,'fsl_power.h']]], + ['power_5fenablelpo',['POWER_EnableLPO',['../a00085.html#ga86ad2183a772150f3c72d5aaf158afaa',1,'fsl_power.h']]], + ['power_5fenablelpoindeeppowerdownmode',['POWER_EnableLPOInDeepPowerDownMode',['../a00085.html#gaf5a1bdc5ba7e3b43083fdb74f0154fb3',1,'fsl_power.h']]], + ['power_5fenablenondpd',['POWER_EnableNonDpd',['../a00085.html#ga7bfb95e1397b0fc1b02b740458667d4c',1,'fsl_power.h']]], + ['power_5fenablepd',['POWER_EnablePD',['../a00085.html#gacf3a138e73725bb8c50290295259bfa4',1,'fsl_power.h']]], + ['power_5fenableresetpinfordeeppowerdown',['POWER_EnableResetPinForDeepPowerDown',['../a00085.html#ga2017fc3e4b370ec4528136d4f4bc08b5',1,'fsl_power.h']]], + ['power_5fenablewakeuppinfordeeppowerdown',['POWER_EnableWakeupPinForDeepPowerDown',['../a00085.html#ga05cbdf9affa49e1ea898935937a94bc1',1,'fsl_power.h']]], + ['power_5fenablewktclkin',['POWER_EnableWktClkIn',['../a00085.html#ga7ee1c99dbc8430bf973857b641d677e9',1,'fsl_power.h']]], + ['power_5fenterdeeppowerdownmode',['POWER_EnterDeepPowerDownMode',['../a00085.html#gafd390219700f64b63df3ded05212bda5',1,'fsl_power.h']]], + ['power_5fenterdeepsleep',['POWER_EnterDeepSleep',['../a00085.html#ga4b0c77a348378a9c77539fc160c239df',1,'fsl_power.h']]], + ['power_5fenterpowerdown',['POWER_EnterPowerDown',['../a00085.html#ga85cddf883d8412b35f3648fa5a62b136',1,'fsl_power.h']]], + ['power_5fentersleep',['POWER_EnterSleep',['../a00085.html#ga6ad77a0ddbf43076a49a207534c6b7f8',1,'fsl_power.h']]], + ['power_5fgen_5freg_5ft',['power_gen_reg_t',['../a00085.html#gaacea8a22b7f4706814e61973550d3492',1,'fsl_power.h']]], + ['power_5fgetdeeppowerdownmodeflag',['POWER_GetDeepPowerDownModeFlag',['../a00085.html#ga7b82522f086af61786aa316142d3540c',1,'fsl_power.h']]], + ['power_5fgetretaindata',['POWER_GetRetainData',['../a00085.html#ga2cef71a7429671e6aaf71b3c40f1bc23',1,'fsl_power.h']]], + ['power_5fgetsleepmodeflag',['POWER_GetSleepModeFlag',['../a00085.html#gaa25d9a439cb1779e76c107cfc9c1a86e',1,'fsl_power.h']]], + ['power_5fsetbodlevel',['POWER_SetBodLevel',['../a00085.html#ga85b6d46e43b818ba54dba92256db4499',1,'fsl_power.h']]], + ['power_5fsetretaindata',['POWER_SetRetainData',['../a00085.html#gada7daa74280566725bfa2854613c91cc',1,'fsl_power.h']]], + ['power_5fwakeupconfig',['POWER_WakeUpConfig',['../a00085.html#ga83d78eac8ce2faa5f92738c681846d5b',1,'fsl_power.h']]], + ['predelay',['preDelay',['../a00022.html#a24a2584817f03d1ace0a6cecc718bc09',1,'spi_delay_config_t']]], + ['prescale',['prescale',['../a00013.html#aa8baec2c586854dc58ff4cdb82b7996b',1,'ctimer_config_t']]], + ['prescale_5fh',['prescale_h',['../a00021.html#aaa1765ca5c51528130a6dc9dd06f2e7a',1,'sctimer_config_t']]], + ['prescale_5fl',['prescale_l',['../a00021.html#aad4f208b7074a27d1a085471bd00cd0a',1,'sctimer_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_71.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_71.html new file mode 100644 index 0000000..ee4ba24 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_71.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_71.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_71.js new file mode 100644 index 0000000..fd60e4f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_71.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['qualaddress',['qualAddress',['../a00018.html#a4c9d09c35c4641d38bf565de31b07320',1,'i2c_slave_config_t']]], + ['qualmode',['qualMode',['../a00018.html#a51577d06d8812b0c999957898ec016b5',1,'i2c_slave_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_72.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_72.html new file mode 100644 index 0000000..315ac4f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_72.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_72.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_72.js new file mode 100644 index 0000000..29b418f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_72.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['rdelay',['rDelay',['../a00010.html#a2023ba3491243edb7ad6be41ea0b0f68',1,'capt_config_t']]], + ['receivedaddress',['receivedAddress',['../a00018.html#ad6f3b291ee81b69cf91c161ae26d65ae',1,'i2c_slave_transfer_t']]], + ['referencevoltage',['referenceVoltage',['../a00008.html#a66356c0246938695521e8a0ece69cf11',1,'acomp_ladder_config_t']]], + ['reload',['reload',['../a00015.html#a6387faccdc3dcd079d22b56b1c4806fd',1,'dma_xfercfg_t']]], + ['remainingbytes',['remainingBytes',['../a00017.html#aca481b5d3ca6dce53cf440b534ff80c2',1,'_i2c_master_handle']]], + ['reset_20driver',['Reset Driver',['../a00086.html',1,'']]], + ['reset_5fperipheralreset',['RESET_PeripheralReset',['../a00086.html#gac33f3428cb55ce07ae67802e5f534ffc',1,'fsl_reset.h']]], + ['result',['result',['../a00009.html#afa0a0f7e84c888060b963280035378f6',1,'adc_result_info_t']]], + ['reversein',['reverseIn',['../a00012.html#aecb53a8e8a78e3273c6d3b2c874ab7f2',1,'crc_config_t']]], + ['reverseout',['reverseOut',['../a00012.html#ab34c2bedb6fc476f9cbe760b6d45a417',1,'crc_config_t']]], + ['rom_5fclocks',['ROM_CLOCKS',['../a00011.html#gaffc6cb67ee605165b0660db6031d5871',1,'fsl_clock.h']]], + ['rxdata',['rxData',['../a00018.html#a3e497078c6038baa8748ce5ecebc7e3d',1,'i2c_slave_transfer_t::rxData()'],['../a00022.html#a28b878b99d5ec790b5c8f3bafe140da0',1,'spi_transfer_t::rxData()'],['../a00022.html#a69f260bde2e1728233f835a148b2f51b',1,'_spi_master_handle::rxData()'],['../a00023.html#a44bd38d7d89b7e185ac9bb49bd7214ea',1,'usart_transfer_t::rxData()'],['../a00023.html#a7fcedbe0ea6e380084a05ba1bb06e38d',1,'_usart_handle::rxData()']]], + ['rxdatasize',['rxDataSize',['../a00023.html#a94a60ffa711d28e3c9151c9990a9145c',1,'_usart_handle']]], + ['rxdatasizeall',['rxDataSizeAll',['../a00023.html#a35109a019b73257d24021ad79d951e64',1,'_usart_handle']]], + ['rxremainingbytes',['rxRemainingBytes',['../a00022.html#a23b2531ea36b53e42cd6b2a3780d3017',1,'_spi_master_handle']]], + ['rxringbuffer',['rxRingBuffer',['../a00023.html#a2cac1523ac58da64d4076c6155309d2f',1,'_usart_handle']]], + ['rxringbufferhead',['rxRingBufferHead',['../a00023.html#afb838e91205d1aa1a2b064591bc11c4e',1,'_usart_handle']]], + ['rxringbuffersize',['rxRingBufferSize',['../a00023.html#ae1c5e6a8ccdd56a678e8dda316e43845',1,'_usart_handle']]], + ['rxringbuffertail',['rxRingBufferTail',['../a00023.html#a197ce470fd9b42e53a867ef84eb2b6dd',1,'_usart_handle']]], + ['rxsize',['rxSize',['../a00018.html#a75e06358c0d5840a1dfc19a029e10ba8',1,'i2c_slave_transfer_t']]], + ['rxstate',['rxState',['../a00023.html#a7f621935f46f5f1bdd10ca755e1b51a7',1,'_usart_handle']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_73.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_73.html new file mode 100644 index 0000000..09f8ce8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_73.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_73.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_73.js new file mode 100644 index 0000000..af6072a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_73.js @@ -0,0 +1,141 @@ +var searchData= +[ + ['sct_5fclocks',['SCT_CLOCKS',['../a00011.html#gac72477e518b30ceb277b83f555ac0d9e',1,'fsl_clock.h']]], + ['sctimer_3a_20sctimer_2fpwm_20_28sct_29',['SCTimer: SCTimer/PWM (SCT)',['../a00021.html',1,'']]], + ['sctimer_5fcleareventinstate',['SCTIMER_ClearEventInState',['../a00021.html#gabb782f507653f2afc07c2464a7cc1a13',1,'fsl_sctimer.h']]], + ['sctimer_5fclearstatusflags',['SCTIMER_ClearStatusFlags',['../a00021.html#gab1c0cd81deb689171e374d4291588624',1,'fsl_sctimer.h']]], + ['sctimer_5fclock_5fmode_5ft',['sctimer_clock_mode_t',['../a00021.html#ga270f5ad1462133d7b88ce71be4913a1d',1,'fsl_sctimer.h']]], + ['sctimer_5fclock_5fselect_5ft',['sctimer_clock_select_t',['../a00021.html#ga82141464913b976a7c2aab50cf17c701',1,'fsl_sctimer.h']]], + ['sctimer_5fconfig_5ft',['sctimer_config_t',['../a00021.html#a00131',1,'']]], + ['sctimer_5fconflict_5fresolution_5ft',['sctimer_conflict_resolution_t',['../a00021.html#ga64666471cadaed6ad2e72ce19026aed8',1,'fsl_sctimer.h']]], + ['sctimer_5fcounter_5ft',['sctimer_counter_t',['../a00021.html#ga8df83543fac389c6e3b212d58695f034',1,'fsl_sctimer.h']]], + ['sctimer_5fcreateandscheduleevent',['SCTIMER_CreateAndScheduleEvent',['../a00021.html#ga2fc1121a0f6dd3f5bc822516f85f096c',1,'fsl_sctimer.h']]], + ['sctimer_5fdeinit',['SCTIMER_Deinit',['../a00021.html#ga467e692ef9a508c75d2dff4d3bb3587e',1,'fsl_sctimer.h']]], + ['sctimer_5fdisableinterrupts',['SCTIMER_DisableInterrupts',['../a00021.html#ga5f89a72162bac80f840b04445bcbfa70',1,'fsl_sctimer.h']]], + ['sctimer_5fenableinterrupts',['SCTIMER_EnableInterrupts',['../a00021.html#ga484ff3205b735b4e24655920dd48a85a',1,'fsl_sctimer.h']]], + ['sctimer_5fevent_5factive_5fdirection_5ft',['sctimer_event_active_direction_t',['../a00021.html#gadc0dc8518742a3345ea042eae821dc85',1,'fsl_sctimer.h']]], + ['sctimer_5fevent_5fcallback_5ft',['sctimer_event_callback_t',['../a00021.html#ga9522e37a144ad51ffb1f5d035f1b4489',1,'fsl_sctimer.h']]], + ['sctimer_5fevent_5ft',['sctimer_event_t',['../a00021.html#ga8d902ebc4b569d71c88754a49ccf0650',1,'fsl_sctimer.h']]], + ['sctimer_5feventhandleirq',['SCTIMER_EventHandleIRQ',['../a00021.html#ga265b0765ff1337a4d13328351b3cebdc',1,'fsl_sctimer.h']]], + ['sctimer_5fgetcounterstate',['SCTIMER_GetCounterState',['../a00021.html#ga99d4a6ea09ccf78fae7c3dec39dff28b',1,'fsl_sctimer.h']]], + ['sctimer_5fgetcountvalue',['SCTIMER_GetCOUNTValue',['../a00021.html#ga87a03f50c6f03e0302fa79cd5cbad644',1,'fsl_sctimer.h']]], + ['sctimer_5fgetcurrentstate',['SCTIMER_GetCurrentState',['../a00021.html#ga7548cb37efdba143e5c312f7b4461cf7',1,'fsl_sctimer.h']]], + ['sctimer_5fgetdefaultconfig',['SCTIMER_GetDefaultConfig',['../a00021.html#ga926706158370867f6a1827af9899c5e4',1,'fsl_sctimer.h']]], + ['sctimer_5fgetenabledinterrupts',['SCTIMER_GetEnabledInterrupts',['../a00021.html#gab5d439e5c8778b29945a228e9bbc62ea',1,'fsl_sctimer.h']]], + ['sctimer_5fgeteventinstate',['SCTIMER_GetEventInState',['../a00021.html#ga0fe5c5cf3afe091395e5d13de17e4bf5',1,'fsl_sctimer.h']]], + ['sctimer_5fgetstatusflags',['SCTIMER_GetStatusFlags',['../a00021.html#ga880638c2ffe076f868b5d5c8dc480630',1,'fsl_sctimer.h']]], + ['sctimer_5fincreasestate',['SCTIMER_IncreaseState',['../a00021.html#ga211359f9ee3b67eaa96d73b23ce1650d',1,'fsl_sctimer.h']]], + ['sctimer_5finit',['SCTIMER_Init',['../a00021.html#ga44111f6438ee9d11f5c3b26e3c049e47',1,'fsl_sctimer.h']]], + ['sctimer_5finput_5ft',['sctimer_input_t',['../a00021.html#ga3d2e093dbbecb8a0afc56bda69b8fa7e',1,'fsl_sctimer.h']]], + ['sctimer_5finterrupt_5fenable_5ft',['sctimer_interrupt_enable_t',['../a00021.html#gaf1007b13bbe43ea28ee33acdc7f5f986',1,'fsl_sctimer.h']]], + ['sctimer_5fout_5ft',['sctimer_out_t',['../a00021.html#ga2befef3e54e22f0624ddb1b016f10148',1,'fsl_sctimer.h']]], + ['sctimer_5fpwm_5flevel_5fselect_5ft',['sctimer_pwm_level_select_t',['../a00021.html#ga7d63d84ecccc4074e40c6754a8754065',1,'fsl_sctimer.h']]], + ['sctimer_5fpwm_5fmode_5ft',['sctimer_pwm_mode_t',['../a00021.html#ga76b1c419363e09d4861880f25f63979d',1,'fsl_sctimer.h']]], + ['sctimer_5fpwm_5fsignal_5fparam_5ft',['sctimer_pwm_signal_param_t',['../a00021.html#a00132',1,'']]], + ['sctimer_5fscheduleevent',['SCTIMER_ScheduleEvent',['../a00021.html#ga54f3ea55cf8cab5a78e26a522536d2fe',1,'fsl_sctimer.h']]], + ['sctimer_5fsetcallback',['SCTIMER_SetCallback',['../a00021.html#ga9b685c1dd4fbc33496d5e6445c4d08c7',1,'fsl_sctimer.h']]], + ['sctimer_5fsetcounterstate',['SCTIMER_SetCounterState',['../a00021.html#ga17cec8d7f62c6f80bb516febc654d37d',1,'fsl_sctimer.h']]], + ['sctimer_5fsetcountvalue',['SCTIMER_SetCOUNTValue',['../a00021.html#gabde2ce6ca0f22c9210f145d6493f3f5c',1,'fsl_sctimer.h']]], + ['sctimer_5fseteventinstate',['SCTIMER_SetEventInState',['../a00021.html#ga8a95c3455d06a5be07c07c787699b2f9',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcaptureaction',['SCTIMER_SetupCaptureAction',['../a00021.html#ga6217a77dba0bc787acde88eabbe4ba55',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcounterhaltaction',['SCTIMER_SetupCounterHaltAction',['../a00021.html#gaca74f1feb997dc028a4143a9c84f5a2c',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcounterlimitaction',['SCTIMER_SetupCounterLimitAction',['../a00021.html#gac1e1011a301cf83283996490249a596b',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcounterstartaction',['SCTIMER_SetupCounterStartAction',['../a00021.html#gabd997ff4aff2c1b1a2c763596db93c6c',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcounterstopaction',['SCTIMER_SetupCounterStopAction',['../a00021.html#gab2412179ebab1d913976b250290ca06d',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupdmatriggeraction',['SCTIMER_SetupDmaTriggerAction',['../a00021.html#ga48cc738532c4d5c86c423547f79da554',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupeventactivedirection',['SCTIMER_SetupEventActiveDirection',['../a00021.html#ga22c2cd3dff04d7771f94401fb841446e',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupnextstateaction',['SCTIMER_SetupNextStateAction',['../a00021.html#ga2645513f40654fdc1812a8990e5f894b',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupnextstateactionwithldmethod',['SCTIMER_SetupNextStateActionwithLdMethod',['../a00021.html#gaf926083b406d26456d2fabf2bfd55a39',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupoutputclearaction',['SCTIMER_SetupOutputClearAction',['../a00021.html#ga231084960a5fa1f5bf67ee5e5bc9dead',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupoutputsetaction',['SCTIMER_SetupOutputSetAction',['../a00021.html#ga22353e32ba4fb216277824ce940ad786',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupoutputtoggleaction',['SCTIMER_SetupOutputToggleAction',['../a00021.html#gae6074aeaf3d4004a721d91c50f6a74ad',1,'fsl_sctimer.h']]], + ['sctimer_5fsetuppwm',['SCTIMER_SetupPwm',['../a00021.html#ga8f372273782f269956227b810e56a844',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupstateldmethodaction',['SCTIMER_SetupStateLdMethodAction',['../a00021.html#gafdf6317a3faf2068d9ce8f0a8082203c',1,'fsl_sctimer.h']]], + ['sctimer_5fstarttimer',['SCTIMER_StartTimer',['../a00021.html#gac025765188aa53661325d324569b739c',1,'fsl_sctimer.h']]], + ['sctimer_5fstatus_5fflags_5ft',['sctimer_status_flags_t',['../a00021.html#ga9100974cdbb1542385a983b75b2f0d45',1,'fsl_sctimer.h']]], + ['sctimer_5fstoptimer',['SCTIMER_StopTimer',['../a00021.html#ga3ba946707276c23d531ebd3e21d67427',1,'fsl_sctimer.h']]], + ['sctimer_5fupdatepwmdutycycle',['SCTIMER_UpdatePwmDutycycle',['../a00021.html#ga745f5f328599202df06a81b6fe307b63',1,'fsl_sctimer.h']]], + ['sdk_5fdelayatleastus',['SDK_DelayAtLeastUs',['../a00087.html#ga4f9121590e5b8fe025d706ff2fe5da36',1,'fsl_common.h']]], + ['sdk_5ffree',['SDK_Free',['../a00087.html#ga0be5caec9b8493d87cc849714bd47865',1,'fsl_common.h']]], + ['sdk_5fmalloc',['SDK_Malloc',['../a00087.html#ga4e1420d9e817ebe0e8973420411de015',1,'fsl_common.h']]], + ['seed',['seed',['../a00012.html#a88920b83ff1317f511c1e9f4916b3b30',1,'crc_config_t']]], + ['semihosting',['Semihosting',['../a00098.html',1,'']]], + ['sequencenumber',['sequenceNumber',['../a00010.html#a3305567326ede24c2f45a2d5b788eb2e',1,'capt_touch_data_t']]], + ['settlingtime',['settlingTime',['../a00014.html#a64eb5fd25bfaaa5593caf6e9116dbb5b',1,'dac_config_t']]], + ['slaveaddress',['slaveAddress',['../a00017.html#a97891bd050609c6dcd1276714277e480',1,'_i2c_master_transfer']]], + ['slavefsm',['slaveFsm',['../a00018.html#a18589a5de9b06b2eaf7d4260eac03a58',1,'_i2c_slave_handle']]], + ['spi_3a_20serial_20peripheral_20interface_20driver',['SPI: Serial Peripheral Interface Driver',['../a00092.html',1,'']]], + ['spi_5fclearstatusflags',['SPI_ClearStatusFlags',['../a00022.html#ga794c7435fa108012df54bb6294f20505',1,'fsl_spi.h']]], + ['spi_5fclock_5fphase_5ft',['spi_clock_phase_t',['../a00022.html#ga9ad313685ade497f5cbcb71c74a1b4dc',1,'fsl_spi.h']]], + ['spi_5fclock_5fpolarity_5ft',['spi_clock_polarity_t',['../a00022.html#ga3e5a7cd043c9596779bc23b34cb3d1f9',1,'fsl_spi.h']]], + ['spi_5fclocks',['SPI_CLOCKS',['../a00011.html#ga2323a706e6e7796fa2e352a5b5a70f59',1,'fsl_clock.h']]], + ['spi_5fdata_5fwidth_5ft',['spi_data_width_t',['../a00022.html#gafa691c5329a7325ee57c9f06fa295731',1,'fsl_spi.h']]], + ['spi_5fdeinit',['SPI_Deinit',['../a00022.html#gaac0bc2b87ea2eb7eeba78d9449d4dbbf',1,'fsl_spi.h']]], + ['spi_5fdelay_5fconfig_5ft',['spi_delay_config_t',['../a00022.html#a00133',1,'']]], + ['spi_5fdisableinterrupts',['SPI_DisableInterrupts',['../a00022.html#ga6289b192b135592b7b0996c05422be4d',1,'fsl_spi.h']]], + ['spi_20driver',['SPI Driver',['../a00022.html',1,'']]], + ['spi_5fdummydata',['SPI_DUMMYDATA',['../a00022.html#ga1541129ba8262e1649592b5109e2074c',1,'fsl_spi.h']]], + ['spi_5fenable',['SPI_Enable',['../a00022.html#ga6d32506242b9596989efbbb2d030e997',1,'fsl_spi.h']]], + ['spi_5fenableinterrupts',['SPI_EnableInterrupts',['../a00022.html#gab87ea500d8f74369882afe52a81d1199',1,'fsl_spi.h']]], + ['spi_5fgetinstance',['SPI_GetInstance',['../a00022.html#gad823d00c394f6ca35c391dc178a25334',1,'fsl_spi.h']]], + ['spi_5fgetstatusflags',['SPI_GetStatusFlags',['../a00022.html#ga9e7412ad45aeb7f620fe34559034ad2e',1,'fsl_spi.h']]], + ['spi_5fismaster',['SPI_IsMaster',['../a00022.html#ga97782e786464ec2de946bd42e63aefbc',1,'fsl_spi.h']]], + ['spi_5fmaster_5fcallback_5ft',['spi_master_callback_t',['../a00022.html#gae9bd140aeb645efab6c7552b3994e01a',1,'fsl_spi.h']]], + ['spi_5fmaster_5fconfig_5ft',['spi_master_config_t',['../a00022.html#a00134',1,'']]], + ['spi_5fmastergetdefaultconfig',['SPI_MasterGetDefaultConfig',['../a00022.html#ga45c08fc078ae334b79fb844379140838',1,'fsl_spi.h']]], + ['spi_5fmasterinit',['SPI_MasterInit',['../a00022.html#gab36e8463576abeded221a1e5a1eec01c',1,'fsl_spi.h']]], + ['spi_5fmastersetbaudrate',['SPI_MasterSetBaudRate',['../a00022.html#ga3ad4747ccc31c142c54af5639cd49328',1,'fsl_spi.h']]], + ['spi_5fmastertransferabort',['SPI_MasterTransferAbort',['../a00022.html#gae90962a54978acf05ca7780489301eb4',1,'fsl_spi.h']]], + ['spi_5fmastertransferblocking',['SPI_MasterTransferBlocking',['../a00022.html#ga5b05095245ecf01258e64cc0458fb2e9',1,'fsl_spi.h']]], + ['spi_5fmastertransfercreatehandle',['SPI_MasterTransferCreateHandle',['../a00022.html#gad0d8eaa132d8c882d8a42286ecfbab64',1,'fsl_spi.h']]], + ['spi_5fmastertransfergetcount',['SPI_MasterTransferGetCount',['../a00022.html#gabde0dccfb0783d103b9cf57e0202582f',1,'fsl_spi.h']]], + ['spi_5fmastertransferhandleirq',['SPI_MasterTransferHandleIRQ',['../a00022.html#ga645d041a92bde312d6cf64517c618c41',1,'fsl_spi.h']]], + ['spi_5fmastertransfernonblocking',['SPI_MasterTransferNonBlocking',['../a00022.html#ga820c78a32fa29735168d2e517f4881a1',1,'fsl_spi.h']]], + ['spi_5freaddata',['SPI_ReadData',['../a00022.html#ga08dec9d9d6abf910589a591f1cc52f58',1,'fsl_spi.h']]], + ['spi_5fretry_5ftimes',['SPI_RETRY_TIMES',['../a00022.html#gaa4717c15ca9604c505a5e5c60df29ebe',1,'fsl_spi.h']]], + ['spi_5fsetdummydata',['SPI_SetDummyData',['../a00022.html#gac75808445b18f687387bea02892a5246',1,'fsl_spi.h']]], + ['spi_5fsettransferdelay',['SPI_SetTransferDelay',['../a00022.html#gad4071c9fc158109945e724872f4760b6',1,'fsl_spi.h']]], + ['spi_5fshift_5fdirection_5ft',['spi_shift_direction_t',['../a00022.html#gaa68518c16202382c2e1f1c7c66a9d53d',1,'fsl_spi.h']]], + ['spi_5fslave_5fcallback_5ft',['spi_slave_callback_t',['../a00022.html#ga86b45b85e036adc762eed5bcd2a0491d',1,'fsl_spi.h']]], + ['spi_5fslave_5fconfig_5ft',['spi_slave_config_t',['../a00022.html#a00135',1,'']]], + ['spi_5fslave_5fhandle_5ft',['spi_slave_handle_t',['../a00022.html#gad267cfee3a876b2860217ff94f03f574',1,'fsl_spi.h']]], + ['spi_5fslavegetdefaultconfig',['SPI_SlaveGetDefaultConfig',['../a00022.html#gac000b63ed033f57a9eee342a8c8e67f2',1,'fsl_spi.h']]], + ['spi_5fslaveinit',['SPI_SlaveInit',['../a00022.html#gae40850ce14ba74ea75b3eef79beecf8a',1,'fsl_spi.h']]], + ['spi_5fslavetransferabort',['SPI_SlaveTransferAbort',['../a00022.html#gae719048431a3e4fb334f83bd824a407b',1,'fsl_spi.h']]], + ['spi_5fslavetransfercreatehandle',['SPI_SlaveTransferCreateHandle',['../a00022.html#ga7c6a9ac8e0e410684970f3169404bafd',1,'fsl_spi.h']]], + ['spi_5fslavetransfergetcount',['SPI_SlaveTransferGetCount',['../a00022.html#ga0dcd2ed8373d992ff93bb500e1442815',1,'fsl_spi.h']]], + ['spi_5fslavetransferhandleirq',['SPI_SlaveTransferHandleIRQ',['../a00022.html#gaac1ff8fc728c925d78b1237949ebf7c3',1,'fsl_spi.h']]], + ['spi_5fslavetransfernonblocking',['SPI_SlaveTransferNonBlocking',['../a00022.html#ga93765aa3b062471b641f1b8f733b8b5b',1,'fsl_spi.h']]], + ['spi_5fspol_5ft',['spi_spol_t',['../a00022.html#gafd7e7bd8e060742346806ed8c8f1db4c',1,'fsl_spi.h']]], + ['spi_5fssel_5ft',['spi_ssel_t',['../a00022.html#ga420a3d3f841957068648585b89fa66d1',1,'fsl_spi.h']]], + ['spi_5ftransfer_5ft',['spi_transfer_t',['../a00022.html#a00136',1,'']]], + ['spi_5fwriteconfigflags',['SPI_WriteConfigFlags',['../a00022.html#ga709b0d176b737a8009221565f3ae19e6',1,'fsl_spi.h']]], + ['spi_5fwritedata',['SPI_WriteData',['../a00022.html#ga92c1bd47d2ad7b45fc138fccb4bc1ace',1,'fsl_spi.h']]], + ['spi_5fwritedatawithconfigflags',['SPI_WriteDataWithConfigFlags',['../a00022.html#gad3810513c85cb28f1dbf18b15614a09d',1,'fsl_spi.h']]], + ['sram_5fclocks',['SRAM_CLOCKS',['../a00011.html#ga06cf7a516d7600127c0af0e1e0cc5759',1,'fsl_clock.h']]], + ['src',['src',['../a00011.html#a5777806e347fa36340fc79e5928f5d83',1,'clock_sys_pll_t']]], + ['srcaddr',['srcAddr',['../a00015.html#a2a315d0141311dd82dd6ac1a3523671b',1,'dma_transfer_config_t']]], + ['srcendaddr',['srcEndAddr',['../a00015.html#aabb52c29097e7d9eedb34f5421740f04',1,'dma_descriptor_t']]], + ['srcinc',['srcInc',['../a00015.html#ab21f9a2d11b2ce02da230adfd32b789e',1,'dma_xfercfg_t']]], + ['srcstartaddr',['srcStartAddr',['../a00015.html#a50d258467783dad5f163860724cb4c32',1,'dma_channel_config_t']]], + ['sselnumber',['sselNumber',['../a00022.html#af889de97327eb44641d8acc1f509d074',1,'spi_master_config_t']]], + ['sselpolarity',['sselPolarity',['../a00022.html#ab514b4866ee539808abd92a75ca8be51',1,'spi_master_config_t::sselPolarity()'],['../a00022.html#a0d0bceaaae2e5bae690fb2c3289f48f6',1,'spi_slave_config_t::sselPolarity()']]], + ['state',['state',['../a00017.html#add7ec18bc8239c5c87ffcec2fbcf5dd8',1,'_i2c_master_handle::state()'],['../a00022.html#ae7933252a37be998d127217f34f6fd16',1,'_spi_master_handle::state()']]], + ['status_5ft',['status_t',['../a00087.html#gaaabdaf7ee58ca7269bd4bf24efcde092',1,'fsl_common.h']]], + ['stopbitcount',['stopBitCount',['../a00023.html#aeb0b8a38f5d7e0def2aa1b079643682f',1,'usart_config_t']]], + ['subaddress',['subaddress',['../a00017.html#ae7facb612714785d4e143e57d47a5af3',1,'_i2c_master_transfer']]], + ['subaddresssize',['subaddressSize',['../a00017.html#aeec8dccf4a49f03ff9a40f5982a24796',1,'_i2c_master_transfer']]], + ['swm_3a_20switch_20matrix_20module',['SWM: Switch Matrix Module',['../a00095.html',1,'']]], + ['swm_5fclocks',['SWM_CLOCKS',['../a00011.html#gad0c6602129535798b81d753e67cabc99',1,'fsl_clock.h']]], + ['swm_5fport_5fpin_5ftype_5ft',['swm_port_pin_type_t',['../a00095.html#gaca9c780388e187444bfa31a6bcc72d35',1,'fsl_swm_connections.h']]], + ['swm_5fselect_5ffixed_5fpin_5ft',['swm_select_fixed_pin_t',['../a00095.html#ga6db188a71a269613f30825af80c02053',1,'fsl_swm_connections.h']]], + ['swm_5fselect_5fmovable_5ft',['swm_select_movable_t',['../a00095.html#ga45575871cafcadc50292b9bba6b9d13d',1,'fsl_swm_connections.h']]], + ['swm_5fsetfixedpinselect',['SWM_SetFixedPinSelect',['../a00095.html#ga55452f734d7cc5e02195ed926e4484c8',1,'fsl_swm.h']]], + ['swm_5fsetmovablepinselect',['SWM_SetMovablePinSelect',['../a00095.html#gaae2dc5c29ae2358c616fa8a2b61a7e4b',1,'fsl_swm.h']]], + ['swtrig',['swtrig',['../a00015.html#a69253cda0502dcfa038c5d71a3cac593',1,'dma_xfercfg_t']]], + ['syncmode',['syncMode',['../a00023.html#ad5debb2aa90fc8fa732edd1ab4bdbbea',1,'usart_config_t']]], + ['syscon_3a_20system_20configuration',['SYSCON: System Configuration',['../a00096.html',1,'']]], + ['syscon_5fattachsignal',['SYSCON_AttachSignal',['../a00096.html#gaa42f53e7578284bdc9816da8800e735b',1,'fsl_syscon.h']]], + ['syscon_5fconnection_5ft',['syscon_connection_t',['../a00096.html#ga4a63ee69b68459770551a0e4d7b6cdad',1,'fsl_syscon_connections.h']]], + ['syscon_5frstn_5ft',['SYSCON_RSTn_t',['../a00086.html#gac287530f011b42355162470f09975770',1,'fsl_reset.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_74.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_74.html new file mode 100644 index 0000000..c2cd095 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_74.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_74.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_74.js new file mode 100644 index 0000000..51254e8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_74.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['targetfreq',['targetFreq',['../a00011.html#a1be863d493ed08967d4abbe8faf8c918',1,'clock_sys_pll_t']]], + ['thresholdcomparestatus',['thresholdCompareStatus',['../a00009.html#a1014edddf4d1ea57e751088dcadace6b',1,'adc_result_info_t']]], + ['thresholdcorssingstatus',['thresholdCorssingStatus',['../a00009.html#a443ffd542f5690ca2cb239181db4aaf7',1,'adc_result_info_t']]], + ['timeoutcount',['timeOutCount',['../a00010.html#a2d65011e0db3619f02eacea89b6ab5a3',1,'capt_config_t']]], + ['timeoutvalue',['timeoutValue',['../a00025.html#a9ada6867151ee688d47176cbe771cf2d',1,'wwdt_config_t']]], + ['trademarks',['Trademarks',['../a00002.html',1,'']]], + ['totalbytecount',['totalByteCount',['../a00022.html#a4e19f9299f123f181536c6bd4456e50a',1,'_spi_master_handle']]], + ['transfer',['transfer',['../a00017.html#a6858d3525f762d7aded20e6c95eb19fc',1,'_i2c_master_handle::transfer()'],['../a00018.html#a9934cd1a4d4b4e02ac5856e28f86a229',1,'_i2c_slave_handle::transfer()']]], + ['transfercount',['transferCount',['../a00015.html#a11b16354c24a04222507d6508a475bab',1,'dma_xfercfg_t::transferCount()'],['../a00017.html#a5943d16f5ed6e7c4ebd334cdbc0e2afc',1,'_i2c_master_handle::transferCount()']]], + ['transferdelay',['transferDelay',['../a00022.html#a7ea0733fc746e2bafe1c0999db7d4804',1,'spi_delay_config_t']]], + ['transferredcount',['transferredCount',['../a00018.html#a0394563c8d0f9eeeecd242a65cee2ad4',1,'i2c_slave_transfer_t']]], + ['trigger',['trigger',['../a00015.html#ae2b24289699bf3639fea8bb56baf0d15',1,'dma_channel_config_t']]], + ['triggermask',['triggerMask',['../a00009.html#a53ec8373edca82340278a104721ed8bb',1,'adc_conv_seq_config_t']]], + ['triggermode',['triggerMode',['../a00010.html#a998c94c1d03dc0f2be30ae3a3982585f',1,'capt_config_t']]], + ['triggerpolarity',['triggerPolarity',['../a00009.html#a280dc4b4d9c35c2411fe92cf3cadb838',1,'adc_conv_seq_config_t']]], + ['txdata',['txData',['../a00018.html#afaff4f7ef2ae4ed49eff607a58db18c2',1,'i2c_slave_transfer_t::txData()'],['../a00022.html#addc4f20760a1a62c4d20cdf9443f3af3',1,'spi_transfer_t::txData()'],['../a00022.html#a6cb4626f6b63c70fa21fe2e3338dc915',1,'_spi_master_handle::txData()'],['../a00023.html#ad081b93c86f16dedd57dfc105a71e7fa',1,'usart_transfer_t::txData()'],['../a00023.html#a2e0eada6edeef87ca5609381a495caa0',1,'_usart_handle::txData()']]], + ['txdatasize',['txDataSize',['../a00023.html#aafb090dd1831c9e83df2d60cf3cd25f0',1,'_usart_handle']]], + ['txdatasizeall',['txDataSizeAll',['../a00023.html#add7cbfa096ebb8bfe5084c9940d0a9d8',1,'_usart_handle']]], + ['txremainingbytes',['txRemainingBytes',['../a00022.html#a62fa101ddfc970e7b6bcba0b2eb6b869',1,'_spi_master_handle']]], + ['txsize',['txSize',['../a00018.html#a3d2ef683b0439ce83e3d54e8823ebc38',1,'i2c_slave_transfer_t']]], + ['txstate',['txState',['../a00023.html#a30a2856c0e736ad39fe44c015bd54ca4',1,'_usart_handle']]], + ['type',['type',['../a00015.html#a80afb7ab2642836025d063ac8b0c9738',1,'dma_channel_trigger_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_75.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_75.html new file mode 100644 index 0000000..49c1e78 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_75.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_75.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_75.js new file mode 100644 index 0000000..db1da1f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_75.js @@ -0,0 +1,46 @@ +var searchData= +[ + ['uart_5fretry_5ftimes',['UART_RETRY_TIMES',['../a00023.html#gac0f88b67f77fd05f186a5ec940c340bd',1,'fsl_usart.h']]], + ['usart_3a_20universal_20asynchronous_20receiver_2ftransmitter_20driver',['USART: Universal Asynchronous Receiver/Transmitter Driver',['../a00093.html',1,'']]], + ['usart_5fclearstatusflags',['USART_ClearStatusFlags',['../a00023.html#ga235a301d8f22d6ce3a6f77dbdb76cfe3',1,'fsl_usart.h']]], + ['usart_5fclock_5fpolarity_5ft',['usart_clock_polarity_t',['../a00023.html#ga786ba5b98195c3df810a061b6c0cca91',1,'fsl_usart.h']]], + ['usart_5fclocks',['USART_CLOCKS',['../a00011.html#ga2172b1f5c29b7d0bf0fe8a9c9d45ed43',1,'fsl_clock.h']]], + ['usart_5fconfig_5ft',['usart_config_t',['../a00023.html#a00137',1,'']]], + ['usart_5fdata_5flen_5ft',['usart_data_len_t',['../a00023.html#ga28e46a3538cf5f5140523132a963283c',1,'fsl_usart.h']]], + ['usart_5fdeinit',['USART_Deinit',['../a00023.html#ga80892980b702b0b7614691014a5aaaca',1,'fsl_usart.h']]], + ['usart_5fdisableinterrupts',['USART_DisableInterrupts',['../a00023.html#ga091d6509100a6e6206483b2f41f16d6c',1,'fsl_usart.h']]], + ['usart_20driver',['USART Driver',['../a00023.html',1,'']]], + ['usart_5fenableautoclearsclk',['USART_EnableAutoClearSCLK',['../a00023.html#ga4d96acc82e0bbe947ececc200083c68a',1,'fsl_usart.h']]], + ['usart_5fenablecontinuoussclk',['USART_EnableContinuousSCLK',['../a00023.html#gad0a37042ec21be840247a05ca9e8e805',1,'fsl_usart.h']]], + ['usart_5fenablects',['USART_EnableCTS',['../a00023.html#gaaab4d6b7d7701fbdd022694330207614',1,'fsl_usart.h']]], + ['usart_5fenableinterrupts',['USART_EnableInterrupts',['../a00023.html#ga9132cf15ff5fd2ac007a88f9400bcf30',1,'fsl_usart.h']]], + ['usart_5fenablerx',['USART_EnableRx',['../a00023.html#ga4f3beae19d75ae0141b60b5fb6a2d710',1,'fsl_usart.h']]], + ['usart_5fenabletx',['USART_EnableTx',['../a00023.html#gaa7cd13d17a8aa19c34bd8564d37f3a1f',1,'fsl_usart.h']]], + ['usart_5fgetdefaultconfig',['USART_GetDefaultConfig',['../a00023.html#ga74464f9357e585e42e5f3c909eb6e9b3',1,'fsl_usart.h']]], + ['usart_5fgetenabledinterrupts',['USART_GetEnabledInterrupts',['../a00023.html#ga49c6966b2af5f0de0fbf49240acc1856',1,'fsl_usart.h']]], + ['usart_5fgetinstance',['USART_GetInstance',['../a00023.html#ga0433386bbc6c2ac7e2ec7925fea263db',1,'fsl_usart.h']]], + ['usart_5fgetstatusflags',['USART_GetStatusFlags',['../a00023.html#ga33f5cdc2918edf02b9a4ef8a12e27442',1,'fsl_usart.h']]], + ['usart_5finit',['USART_Init',['../a00023.html#ga2aeb4e11fdf0eb515d090865ffcf2ba2',1,'fsl_usart.h']]], + ['usart_5fparity_5fmode_5ft',['usart_parity_mode_t',['../a00023.html#ga9b5ca9521874092ccb637a02d7b26ba2',1,'fsl_usart.h']]], + ['usart_5freadblocking',['USART_ReadBlocking',['../a00023.html#ga09c3b588e2099ffa6b999c5ca7fb8d58',1,'fsl_usart.h']]], + ['usart_5freadbyte',['USART_ReadByte',['../a00023.html#gaaa9dc0edc5edacd55bb88ff7b9b55f98',1,'fsl_usart.h']]], + ['usart_5fsetbaudrate',['USART_SetBaudRate',['../a00023.html#gabdcaf539e6c95903c779f4538b1f422b',1,'fsl_usart.h']]], + ['usart_5fstop_5fbit_5fcount_5ft',['usart_stop_bit_count_t',['../a00023.html#ga58ab07609b094f719f903475de6e57b4',1,'fsl_usart.h']]], + ['usart_5fsync_5fmode_5ft',['usart_sync_mode_t',['../a00023.html#ga7ecd603d2579abbe714d58eb582821b8',1,'fsl_usart.h']]], + ['usart_5ftransfer_5fcallback_5ft',['usart_transfer_callback_t',['../a00023.html#ga9688f27725349ed0dd7a37c9a75eccc0',1,'fsl_usart.h']]], + ['usart_5ftransfer_5ft',['usart_transfer_t',['../a00023.html#a00138',1,'']]], + ['usart_5ftransferabortreceive',['USART_TransferAbortReceive',['../a00023.html#ga2de9bf9557d2f7bc6fe0236608cb958e',1,'fsl_usart.h']]], + ['usart_5ftransferabortsend',['USART_TransferAbortSend',['../a00023.html#ga095596e064fa8aa6bac0927e71b0329c',1,'fsl_usart.h']]], + ['usart_5ftransfercreatehandle',['USART_TransferCreateHandle',['../a00023.html#ga9aed876794d5c2ab2e37196242602b89',1,'fsl_usart.h']]], + ['usart_5ftransfergetreceivecount',['USART_TransferGetReceiveCount',['../a00023.html#ga43cc02b4521f48ae0b5626a1e8f87a0e',1,'fsl_usart.h']]], + ['usart_5ftransfergetrxringbufferlength',['USART_TransferGetRxRingBufferLength',['../a00023.html#gac0c8e42457c41efd02a4310423804e77',1,'fsl_usart.h']]], + ['usart_5ftransfergetsendcount',['USART_TransferGetSendCount',['../a00023.html#ga56acdf4c0046516f59c04d89e8e988e6',1,'fsl_usart.h']]], + ['usart_5ftransferhandleirq',['USART_TransferHandleIRQ',['../a00023.html#gae955a5e336b3cb3276d5cdd6f1f6feda',1,'fsl_usart.h']]], + ['usart_5ftransferreceivenonblocking',['USART_TransferReceiveNonBlocking',['../a00023.html#ga34c6c819c9e2d8608a6d7e63103fa542',1,'fsl_usart.h']]], + ['usart_5ftransfersendnonblocking',['USART_TransferSendNonBlocking',['../a00023.html#ga7f5a4e7e831ab0dc869637494a57362e',1,'fsl_usart.h']]], + ['usart_5ftransferstartringbuffer',['USART_TransferStartRingBuffer',['../a00023.html#ga8500107ace3179c85e66d73fa1f41d16',1,'fsl_usart.h']]], + ['usart_5ftransferstopringbuffer',['USART_TransferStopRingBuffer',['../a00023.html#gaedb2f678849734999e373a8b00a5248c',1,'fsl_usart.h']]], + ['usart_5fwriteblocking',['USART_WriteBlocking',['../a00023.html#ga95abde78d5cbf569f2b6e4d7942b64df',1,'fsl_usart.h']]], + ['usart_5fwritebyte',['USART_WriteByte',['../a00023.html#gae7a92a20789cf111acadb543916aac91',1,'fsl_usart.h']]], + ['userdata',['userData',['../a00015.html#a2a10a0701fc2085ce58a0e35032e8a8e',1,'dma_handle_t::userData()'],['../a00017.html#aad7df570c53adb2e80acd2ba0d39d109',1,'_i2c_master_handle::userData()'],['../a00018.html#a98ea5e99278b386e2ddb99d45a9750ee',1,'_i2c_slave_handle::userData()'],['../a00022.html#ab8d01b85149d749ab1c748bb5116b90e',1,'_spi_master_handle::userData()'],['../a00023.html#adbecb8574e5d62ee38761a3b4c30e4c3',1,'_usart_handle::userData()']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_76.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_76.html new file mode 100644 index 0000000..5643d68 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_76.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_76.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_76.js new file mode 100644 index 0000000..0569e29 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_76.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['valid',['valid',['../a00015.html#a4a97a76d0d7266ee9cc8de82d19e5d81',1,'dma_xfercfg_t']]], + ['voltagerange',['voltageRange',['../a00009.html#a8edaf01d23b56ec9b6ad0b1a15fca825',1,'adc_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_77.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_77.html new file mode 100644 index 0000000..d01abb9 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_77.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_77.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_77.js new file mode 100644 index 0000000..e4c896d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_77.js @@ -0,0 +1,35 @@ +var searchData= +[ + ['warningvalue',['warningValue',['../a00025.html#a449186b990027ae1e7543458e2f8714a',1,'wwdt_config_t']]], + ['windowvalue',['windowValue',['../a00025.html#a6ec33e8656fe2cfc997634b348ca2cfa',1,'wwdt_config_t']]], + ['wkt_3a_20self_2dwake_2dup_20timer',['WKT: Self-wake-up Timer',['../a00024.html',1,'']]], + ['wkt_5fclearstatusflags',['WKT_ClearStatusFlags',['../a00024.html#gaa0d7b68f6ecfd1f4429c5dabb4b5aec3',1,'fsl_wkt.h']]], + ['wkt_5fclock_5fsource_5ft',['wkt_clock_source_t',['../a00024.html#gaf985ebf5e165e2fbda510cac71cad222',1,'fsl_wkt.h']]], + ['wkt_5fclocks',['WKT_CLOCKS',['../a00011.html#ga24f65b321ca1b862cf159bec396453bd',1,'fsl_clock.h']]], + ['wkt_5fconfig_5ft',['wkt_config_t',['../a00024.html#a00139',1,'']]], + ['wkt_5fdeinit',['WKT_Deinit',['../a00024.html#gac9fb07a0516fdfdbb40129dd85f82b4b',1,'fsl_wkt.h']]], + ['wkt_5fgetcountervalue',['WKT_GetCounterValue',['../a00024.html#ga6a2589301e091e4ced6951f49e8ab636',1,'fsl_wkt.h']]], + ['wkt_5fgetdefaultconfig',['WKT_GetDefaultConfig',['../a00024.html#ga34bc8734ca383ef16dbe8683f65f2d74',1,'fsl_wkt.h']]], + ['wkt_5fgetstatusflags',['WKT_GetStatusFlags',['../a00024.html#ga1be1eae0ee5ecd4349a07e836f41630e',1,'fsl_wkt.h']]], + ['wkt_5finit',['WKT_Init',['../a00024.html#gab3a332ac3545c7280fe2e03785736340',1,'fsl_wkt.h']]], + ['wkt_5fstarttimer',['WKT_StartTimer',['../a00024.html#gaeaa5ecfb153fc573f367ea2858f56e8a',1,'fsl_wkt.h']]], + ['wkt_5fstatus_5fflags_5ft',['wkt_status_flags_t',['../a00024.html#ga0c4c3a2aa689d7cdd0608eb1076d83aa',1,'fsl_wkt.h']]], + ['wkt_5fstoptimer',['WKT_StopTimer',['../a00024.html#gab70db33e771d229596af0a64a398aa78',1,'fsl_wkt.h']]], + ['wrap',['wrap',['../a00015.html#acbcaa81a9d2806d3fa021b5ad27fea6f',1,'dma_channel_trigger_t']]], + ['wwdt_3a_20windowed_20watchdog_20timer_20driver',['WWDT: Windowed Watchdog Timer Driver',['../a00025.html',1,'']]], + ['wwdt_5fclearstatusflags',['WWDT_ClearStatusFlags',['../a00025.html#ga5666008b33bf327c80afb90e0733512e',1,'fsl_wwdt.h']]], + ['wwdt_5fclocks',['WWDT_CLOCKS',['../a00011.html#ga23dea91a4cc65d3b9ba93c83313496a1',1,'fsl_clock.h']]], + ['wwdt_5fconfig_5ft',['wwdt_config_t',['../a00025.html#a00140',1,'']]], + ['wwdt_5fdeinit',['WWDT_Deinit',['../a00025.html#gaae4415d32cd0f67908d0ab9494736742',1,'fsl_wwdt.h']]], + ['wwdt_5fdisable',['WWDT_Disable',['../a00025.html#ga358bab6648d05345bda057a72cfb5547',1,'fsl_wwdt.h']]], + ['wwdt_5fenable',['WWDT_Enable',['../a00025.html#ga2620dd2baf891f32359fbe85faaca563',1,'fsl_wwdt.h']]], + ['wwdt_5ffirst_5fword_5fof_5frefresh',['WWDT_FIRST_WORD_OF_REFRESH',['../a00025.html#ga56228a5472034e453003e7f375c824ab',1,'fsl_wwdt.h']]], + ['wwdt_5fgetdefaultconfig',['WWDT_GetDefaultConfig',['../a00025.html#gacfd7070829029279f3b3bfb763b86914',1,'fsl_wwdt.h']]], + ['wwdt_5fgetstatusflags',['WWDT_GetStatusFlags',['../a00025.html#ga1c5dae412d14eba38f2b63abb9f982d6',1,'fsl_wwdt.h']]], + ['wwdt_5finit',['WWDT_Init',['../a00025.html#gadc47d88ae20552f9cd9999e6f8fc5ebe',1,'fsl_wwdt.h']]], + ['wwdt_5frefresh',['WWDT_Refresh',['../a00025.html#gab1745efaa7c33fab66a552fd45e01d83',1,'fsl_wwdt.h']]], + ['wwdt_5fsecond_5fword_5fof_5frefresh',['WWDT_SECOND_WORD_OF_REFRESH',['../a00025.html#gab483f5384985a23bb28889b3c31da9ee',1,'fsl_wwdt.h']]], + ['wwdt_5fsettimeoutvalue',['WWDT_SetTimeoutValue',['../a00025.html#gad2351329bb1ff6b966decec266d7ec16',1,'fsl_wwdt.h']]], + ['wwdt_5fsetwarningvalue',['WWDT_SetWarningValue',['../a00025.html#gac575fb8568458aa8acbbed14d5aa5ffd',1,'fsl_wwdt.h']]], + ['wwdt_5fsetwindowvalue',['WWDT_SetWindowValue',['../a00025.html#ga66b5c37906be6083f083a436eebbe778',1,'fsl_wwdt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_78.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_78.html new file mode 100644 index 0000000..d1f9d7a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_78.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_78.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_78.js new file mode 100644 index 0000000..9965325 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_78.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['xfercfg',['xfercfg',['../a00015.html#ad49be57eb231061b32b021a8854fe425',1,'dma_descriptor_t::xfercfg()'],['../a00015.html#a365dbf9376f6927bc8b6527ce136914c',1,'dma_transfer_config_t::xfercfg()'],['../a00015.html#a93ad6347b6c5e7c72320be81a67f6baf',1,'dma_channel_config_t::xferCfg()']]], + ['xpinsindex',['XpinsIndex',['../a00010.html#ada6854ef1bf21b8f35acba939c389190',1,'capt_touch_data_t']]], + ['xpinsmode',['XpinsMode',['../a00010.html#a34dffb25e8164ae4addccac265358f00',1,'capt_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_79.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_79.html new file mode 100644 index 0000000..cc055a6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_79.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_79.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_79.js new file mode 100644 index 0000000..6a38e1a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/all_79.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['yestimeout',['yesTimeOut',['../a00010.html#ad73f9e52f210a4ef91e0732ba882c384',1,'capt_touch_data_t']]], + ['yestouch',['yesTouch',['../a00010.html#a5acedab58178a003114a220a5ea3f6f4',1,'capt_touch_data_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_5f.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_5f.html new file mode 100644 index 0000000..6cf835a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_5f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_5f.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_5f.js new file mode 100644 index 0000000..f4b6fc6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_5f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['_5fi2c_5fmaster_5fhandle',['_i2c_master_handle',['../a00017.html#a00101',1,'']]], + ['_5fi2c_5fmaster_5ftransfer',['_i2c_master_transfer',['../a00017.html#a00102',1,'']]], + ['_5fi2c_5fslave_5fhandle',['_i2c_slave_handle',['../a00018.html#a00103',1,'']]], + ['_5fspi_5fmaster_5fhandle',['_spi_master_handle',['../a00022.html#a00104',1,'']]], + ['_5fusart_5fhandle',['_usart_handle',['../a00023.html#a00105',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_61.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_61.html new file mode 100644 index 0000000..80ea25b --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_61.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_61.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_61.js new file mode 100644 index 0000000..11bc269 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_61.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['acomp_5fconfig_5ft',['acomp_config_t',['../a00008.html#a00106',1,'']]], + ['acomp_5fladder_5fconfig_5ft',['acomp_ladder_config_t',['../a00008.html#a00107',1,'']]], + ['adc_5fconfig_5ft',['adc_config_t',['../a00009.html#a00108',1,'']]], + ['adc_5fconv_5fseq_5fconfig_5ft',['adc_conv_seq_config_t',['../a00009.html#a00109',1,'']]], + ['adc_5fresult_5finfo_5ft',['adc_result_info_t',['../a00009.html#a00110',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_63.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_63.html new file mode 100644 index 0000000..0dccad2 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_63.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_63.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_63.js new file mode 100644 index 0000000..bb1e73a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_63.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['capt_5fconfig_5ft',['capt_config_t',['../a00010.html#a00111',1,'']]], + ['capt_5ftouch_5fdata_5ft',['capt_touch_data_t',['../a00010.html#a00112',1,'']]], + ['clock_5fsys_5fpll_5ft',['clock_sys_pll_t',['../a00011.html#a00113',1,'']]], + ['crc_5fconfig_5ft',['crc_config_t',['../a00012.html#a00114',1,'']]], + ['ctimer_5fconfig_5ft',['ctimer_config_t',['../a00013.html#a00115',1,'']]], + ['ctimer_5fmatch_5fconfig_5ft',['ctimer_match_config_t',['../a00013.html#a00116',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_64.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_64.html new file mode 100644 index 0000000..31fc70b --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_64.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_64.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_64.js new file mode 100644 index 0000000..ea0fabb --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_64.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['dac_5fconfig_5ft',['dac_config_t',['../a00014.html#a00117',1,'']]], + ['dma_5fchannel_5fconfig_5ft',['dma_channel_config_t',['../a00015.html#a00118',1,'']]], + ['dma_5fchannel_5ftrigger_5ft',['dma_channel_trigger_t',['../a00015.html#a00119',1,'']]], + ['dma_5fdescriptor_5ft',['dma_descriptor_t',['../a00015.html#a00120',1,'']]], + ['dma_5fhandle_5ft',['dma_handle_t',['../a00015.html#a00121',1,'']]], + ['dma_5ftransfer_5fconfig_5ft',['dma_transfer_config_t',['../a00015.html#a00122',1,'']]], + ['dma_5fxfercfg_5ft',['dma_xfercfg_t',['../a00015.html#a00123',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_67.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_67.html new file mode 100644 index 0000000..ea38f24 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_67.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_67.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_67.js new file mode 100644 index 0000000..41f1d1c --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_67.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gpio_5fpin_5fconfig_5ft',['gpio_pin_config_t',['../a00016.html#a00124',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_69.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_69.html new file mode 100644 index 0000000..7437847 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_69.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_69.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_69.js new file mode 100644 index 0000000..a1a7c47 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_69.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['i2c_5fmaster_5fconfig_5ft',['i2c_master_config_t',['../a00017.html#a00125',1,'']]], + ['i2c_5fslave_5faddress_5ft',['i2c_slave_address_t',['../a00018.html#a00126',1,'']]], + ['i2c_5fslave_5fconfig_5ft',['i2c_slave_config_t',['../a00018.html#a00127',1,'']]], + ['i2c_5fslave_5ftransfer_5ft',['i2c_slave_transfer_t',['../a00018.html#a00128',1,'']]], + ['iocon_5fgroup_5ft',['iocon_group_t',['../a00019.html#a00129',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_6d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_6d.html new file mode 100644 index 0000000..aa83590 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_6d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_6d.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_6d.js new file mode 100644 index 0000000..c855f2c --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_6d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mrt_5fconfig_5ft',['mrt_config_t',['../a00020.html#a00130',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_73.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_73.html new file mode 100644 index 0000000..b57bc4d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_73.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_73.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_73.js new file mode 100644 index 0000000..58870f7 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_73.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['sctimer_5fconfig_5ft',['sctimer_config_t',['../a00021.html#a00131',1,'']]], + ['sctimer_5fpwm_5fsignal_5fparam_5ft',['sctimer_pwm_signal_param_t',['../a00021.html#a00132',1,'']]], + ['spi_5fdelay_5fconfig_5ft',['spi_delay_config_t',['../a00022.html#a00133',1,'']]], + ['spi_5fmaster_5fconfig_5ft',['spi_master_config_t',['../a00022.html#a00134',1,'']]], + ['spi_5fslave_5fconfig_5ft',['spi_slave_config_t',['../a00022.html#a00135',1,'']]], + ['spi_5ftransfer_5ft',['spi_transfer_t',['../a00022.html#a00136',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_75.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_75.html new file mode 100644 index 0000000..000bb65 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_75.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_75.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_75.js new file mode 100644 index 0000000..d925eda --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_75.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usart_5fconfig_5ft',['usart_config_t',['../a00023.html#a00137',1,'']]], + ['usart_5ftransfer_5ft',['usart_transfer_t',['../a00023.html#a00138',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_77.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_77.html new file mode 100644 index 0000000..6fac2af --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_77.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_77.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_77.js new file mode 100644 index 0000000..81850be --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/classes_77.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['wkt_5fconfig_5ft',['wkt_config_t',['../a00024.html#a00139',1,'']]], + ['wwdt_5fconfig_5ft',['wwdt_config_t',['../a00025.html#a00140',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/close.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/close.png new file mode 100644 index 0000000..9342d3d Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/close.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_5f.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_5f.html new file mode 100644 index 0000000..349b6d1 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_5f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_5f.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_5f.js new file mode 100644 index 0000000..0142928 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_5f.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['_5fadc_5finterrupt_5fenable',['_adc_interrupt_enable',['../a00009.html#gac5899c7af1f9cac7695d7171f83be5f0',1,'fsl_adc.h']]], + ['_5fadc_5fstatus_5fflags',['_adc_status_flags',['../a00009.html#ga417e499fb2f1ee7ba05088468b392ce1',1,'fsl_adc.h']]], + ['_5fcapt_5finterrupt_5fenable',['_capt_interrupt_enable',['../a00010.html#ga6ac2e06f77196123f25e3f5c79ae6ea5',1,'fsl_capt.h']]], + ['_5fcapt_5finterrupt_5fstatus_5fflags',['_capt_interrupt_status_flags',['../a00010.html#ga6764adb0a0bda236d301256120cddae0',1,'fsl_capt.h']]], + ['_5fcapt_5fstatus_5fflags',['_capt_status_flags',['../a00010.html#ga86048ff411e845cbde51d9324b5a4b0f',1,'fsl_capt.h']]], + ['_5fcapt_5fxpins',['_capt_xpins',['../a00010.html#ga2c35cfaacd7e34465baab32d16a4abb5',1,'fsl_capt.h']]], + ['_5fflash_5faccess_5ftime',['_flash_access_time',['../a00088.html#ga0efb897bafe816a8a87d92045a78ee9b',1,'fsl_iap.h']]], + ['_5fi2c_5fmaster_5fflags',['_i2c_master_flags',['../a00017.html#gac938392418ba1a891983d11ef5c9f2a3',1,'fsl_i2c.h']]], + ['_5fi2c_5fmaster_5ftransfer_5fflags',['_i2c_master_transfer_flags',['../a00017.html#ga87ea07668194cfb46c7c368d2cb42433',1,'fsl_i2c.h']]], + ['_5fi2c_5fslave_5fflags',['_i2c_slave_flags',['../a00018.html#ga419f2fc2e0684671c00ee97e962bbe0c',1,'fsl_i2c.h']]], + ['_5fi2c_5ftransfer_5fstates',['_i2c_transfer_states',['../a00017.html#gab08c1a0d50859637b4305687278941ee',1,'fsl_i2c.h']]], + ['_5fiap_5fcommands',['_iap_commands',['../a00088.html#gaae3267ca6081e1f5620b0aa674c5e8ca',1,'fsl_iap.h']]], + ['_5fpower_5fdeep_5fsleep_5factive',['_power_deep_sleep_active',['../a00085.html#gab5d33167d8a4c9d9a407cc1bdd6346a9',1,'fsl_power.h']]], + ['_5fpower_5fwakeup',['_power_wakeup',['../a00085.html#ga1680834b74ccfaca0cc98b954cfef0ec',1,'fsl_power.h']]], + ['_5fspi_5finterrupt_5fenable',['_spi_interrupt_enable',['../a00022.html#gaedd690a0f91a0a9eb0fd573b57e31f67',1,'fsl_spi.h']]], + ['_5fspi_5fstatus_5fflags',['_spi_status_flags',['../a00022.html#ga17a846c851b3b17e6a1564a5fab48e09',1,'fsl_spi.h']]], + ['_5fspi_5fxfer_5foption',['_spi_xfer_option',['../a00022.html#gaaa2e2f2efa7be228c775fa239ab5ea03',1,'fsl_spi.h']]], + ['_5fstatus_5fgroups',['_status_groups',['../a00087.html#ga7ff0b98bb1341c07acefb1473b6eda29',1,'fsl_common.h']]], + ['_5fusart_5fflags',['_usart_flags',['../a00023.html#gaa6a81e7e82e236bb1c3c5ba306466610',1,'fsl_usart.h']]], + ['_5fusart_5finterrupt_5fenable',['_usart_interrupt_enable',['../a00023.html#ga78b340bf3b25bfae957d0c5532b9b853',1,'fsl_usart.h']]], + ['_5fwwdt_5fstatus_5fflags_5ft',['_wwdt_status_flags_t',['../a00025.html#gaca0e9724bd1f25336527ea66c77e476f',1,'fsl_wwdt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_61.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_61.html new file mode 100644 index 0000000..fcdab21 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_61.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_61.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_61.js new file mode 100644 index 0000000..f20da22 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_61.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['acomp_5fhysteresis_5fselection_5ft',['acomp_hysteresis_selection_t',['../a00008.html#gaa7c0a15052b6421941faad3c6ea3a5ac',1,'fsl_acomp.h']]], + ['acomp_5finterrupt_5fenable_5ft',['acomp_interrupt_enable_t',['../a00008.html#ga178d521ca2ee7f33d518b30dfb627d20',1,'fsl_acomp.h']]], + ['acomp_5fladder_5freference_5fvoltage_5ft',['acomp_ladder_reference_voltage_t',['../a00008.html#ga7ad629d52b0a70f95cd2ddb3bee8ab5f',1,'fsl_acomp.h']]], + ['adc_5fclock_5fmode_5ft',['adc_clock_mode_t',['../a00009.html#ga4a1dbe9dcaf32c1eaa98849da1217054',1,'fsl_adc.h']]], + ['adc_5finforesult_5ft',['adc_inforesult_t',['../a00009.html#gaecfd3ba1bc4b014f3c11bc6f348a28cc',1,'fsl_adc.h']]], + ['adc_5fpriority_5ft',['adc_priority_t',['../a00009.html#gab625534aa39c1cd25f18cdc0dc3b9981',1,'fsl_adc.h']]], + ['adc_5fsecond_5fcontrol_5ft',['adc_second_control_t',['../a00009.html#gafb17afb34b6114b97b8bfa331465fd23',1,'fsl_adc.h']]], + ['adc_5fseq_5finterrupt_5fmode_5ft',['adc_seq_interrupt_mode_t',['../a00009.html#ga3948c83397f351b5ed70bbaf1c5da35b',1,'fsl_adc.h']]], + ['adc_5ftempsensor_5fcommon_5fmode_5ft',['adc_tempsensor_common_mode_t',['../a00009.html#ga2432b8bc48a2d3ede87fd021faefeaa5',1,'fsl_adc.h']]], + ['adc_5fthreshold_5fcompare_5fstatus_5ft',['adc_threshold_compare_status_t',['../a00009.html#gad47d3fd5553ab75cdf6b95268cb94f20',1,'fsl_adc.h']]], + ['adc_5fthreshold_5fcrossing_5fstatus_5ft',['adc_threshold_crossing_status_t',['../a00009.html#gae86929708f4bb8be4cc88dcf50c3db54',1,'fsl_adc.h']]], + ['adc_5fthreshold_5finterrupt_5fmode_5ft',['adc_threshold_interrupt_mode_t',['../a00009.html#gac6aab6fdd21723cfc6ed4437372521ac',1,'fsl_adc.h']]], + ['adc_5ftrigger_5fpolarity_5ft',['adc_trigger_polarity_t',['../a00009.html#ga538fb95659082602d6ebb205f21573a5',1,'fsl_adc.h']]], + ['adc_5fvdda_5frange_5ft',['adc_vdda_range_t',['../a00009.html#gab751f161dbaf5e986c476ef3b15c7d0c',1,'fsl_adc.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_63.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_63.html new file mode 100644 index 0000000..fbc49e9 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_63.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_63.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_63.js new file mode 100644 index 0000000..4b22814 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_63.js @@ -0,0 +1,28 @@ +var searchData= +[ + ['capt_5fdma_5fmode_5ft',['capt_dma_mode_t',['../a00010.html#ga0be2df04c72a8847673bcb6d9714866a',1,'fsl_capt.h']]], + ['capt_5finactive_5fxpins_5fmode_5ft',['capt_inactive_xpins_mode_t',['../a00010.html#ga01d767059334ad74d416f6c0287f101b',1,'fsl_capt.h']]], + ['capt_5fmeasurement_5fdelay_5ft',['capt_measurement_delay_t',['../a00010.html#ga5ced51d15f9db8f1e6619a5859f6215d',1,'fsl_capt.h']]], + ['capt_5fpolling_5fmode_5ft',['capt_polling_mode_t',['../a00010.html#ga43dfe06b3cce27e03b4b131557a5237b',1,'fsl_capt.h']]], + ['capt_5freset_5fdelay_5ft',['capt_reset_delay_t',['../a00010.html#ga4394d9b57a062c83c444e391c4adf855',1,'fsl_capt.h']]], + ['capt_5ftrigger_5fmode_5ft',['capt_trigger_mode_t',['../a00010.html#ga0c1eb1e31ad34c8654c981a5e643e2c9',1,'fsl_capt.h']]], + ['clock_5fdivider_5ft',['clock_divider_t',['../a00011.html#gac344a8334a482bcbcbdf0c4828db872c',1,'fsl_clock.h']]], + ['clock_5ffro_5fosc_5ffreq_5ft',['clock_fro_osc_freq_t',['../a00011.html#ga85bf7440c0d77269e3db764083110334',1,'fsl_clock.h']]], + ['clock_5ffro_5fsrc_5ft',['clock_fro_src_t',['../a00011.html#ga9ff656514a680eef6ffbf40f4eef0bfb',1,'fsl_clock.h']]], + ['clock_5fip_5fname_5ft',['clock_ip_name_t',['../a00011.html#ga23c8b3ae62f7865b2e228408be95946d',1,'fsl_clock.h']]], + ['clock_5fmain_5fclk_5fsrc_5ft',['clock_main_clk_src_t',['../a00011.html#gab68022e8d8f60a72f86a6a6c13b6e2f4',1,'fsl_clock.h']]], + ['clock_5fname_5ft',['clock_name_t',['../a00011.html#gaf74854e9bcee544d7646c5bafdc00bd3',1,'fsl_clock.h']]], + ['clock_5fselect_5ft',['clock_select_t',['../a00011.html#ga59a363f0296ea51011dd86b405d5db58',1,'fsl_clock.h']]], + ['clock_5fsys_5fpll_5fsrc',['clock_sys_pll_src',['../a00011.html#ga04c66d991cdc5cb35e31c27881bc549b',1,'fsl_clock.h']]], + ['clock_5fwdt_5fanalog_5ffreq_5ft',['clock_wdt_analog_freq_t',['../a00011.html#ga564beca73d288c0d6fd237f541e279e6',1,'fsl_clock.h']]], + ['crc_5fpolynomial_5ft',['crc_polynomial_t',['../a00012.html#ga7daa8fa0df9f42a98afcf766a63d931d',1,'fsl_crc.h']]], + ['ctimer_5fcallback_5ftype_5ft',['ctimer_callback_type_t',['../a00013.html#ga740677adee6ada817bb45ed62607c3c4',1,'fsl_ctimer.h']]], + ['ctimer_5fcapture_5fchannel_5ft',['ctimer_capture_channel_t',['../a00013.html#ga2fbf5cfa219c31ac16f3786d6897dc3f',1,'fsl_ctimer.h']]], + ['ctimer_5fcapture_5fedge_5ft',['ctimer_capture_edge_t',['../a00013.html#gac37706bc06bc7590ce1e3d1b4bf73638',1,'fsl_ctimer.h']]], + ['ctimer_5fexternal_5fmatch_5ft',['ctimer_external_match_t',['../a00013.html#ga09f5eb858c001377062fe0b8a0d5bd29',1,'fsl_ctimer.h']]], + ['ctimer_5finterrupt_5fenable_5ft',['ctimer_interrupt_enable_t',['../a00013.html#ga0971c614f932bcf55994bf6c92325eb2',1,'fsl_ctimer.h']]], + ['ctimer_5fmatch_5foutput_5fcontrol_5ft',['ctimer_match_output_control_t',['../a00013.html#ga22cef1fc5f8e23a35b6c3a012e3d143c',1,'fsl_ctimer.h']]], + ['ctimer_5fmatch_5ft',['ctimer_match_t',['../a00013.html#gae60f7d34c9e499abba96e5979ee1818d',1,'fsl_ctimer.h']]], + ['ctimer_5fstatus_5fflags_5ft',['ctimer_status_flags_t',['../a00013.html#gae64285eb2e52bf5cc2b723870392ff60',1,'fsl_ctimer.h']]], + ['ctimer_5ftimer_5fmode_5ft',['ctimer_timer_mode_t',['../a00013.html#ga9cc18e14c871b2a79888a4cdacbb0eee',1,'fsl_ctimer.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_64.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_64.html new file mode 100644 index 0000000..27ea2df --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_64.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_64.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_64.js new file mode 100644 index 0000000..15ea587 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_64.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['dac_5fsettling_5ftime_5ft',['dac_settling_time_t',['../a00014.html#ga82eecb700b3afeda8b95a6151d8904fc',1,'fsl_dac.h']]], + ['dma_5fburst_5fwrap_5ft',['dma_burst_wrap_t',['../a00015.html#gacea88ecaac2447ba3c9f2157e40b9a82',1,'fsl_dma.h']]], + ['dma_5firq_5ft',['dma_irq_t',['../a00015.html#ga5658ee3bb7fbf1da24d997d9bc341e11',1,'fsl_dma.h']]], + ['dma_5fpriority_5ft',['dma_priority_t',['../a00015.html#ga63f28310491d665df0ad9a99dc22a77f',1,'fsl_dma.h']]], + ['dma_5ftransfer_5ftype_5ft',['dma_transfer_type_t',['../a00015.html#ga9cb7087af6efc80106c1033f80d60219',1,'fsl_dma.h']]], + ['dma_5ftrigger_5fburst_5ft',['dma_trigger_burst_t',['../a00015.html#ga776b1091528ddc2571284f481ddde830',1,'fsl_dma.h']]], + ['dma_5ftrigger_5ftype_5ft',['dma_trigger_type_t',['../a00015.html#ga0468cf171e413581e9bba9803df91427',1,'fsl_dma.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_67.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_67.html new file mode 100644 index 0000000..552d808 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_67.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_67.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_67.js new file mode 100644 index 0000000..8b6581e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_67.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gpio_5fpin_5fdirection_5ft',['gpio_pin_direction_t',['../a00016.html#gada41ca0a2ce239fe125ee96833e715c0',1,'fsl_gpio.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_69.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_69.html new file mode 100644 index 0000000..5071919 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_69.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_69.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_69.js new file mode 100644 index 0000000..d5b775c --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_69.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['i2c_5fdirection_5ft',['i2c_direction_t',['../a00017.html#gab49c827b45635206f06e5737606e4611',1,'fsl_i2c.h']]], + ['i2c_5fslave_5faddress_5fqual_5fmode_5ft',['i2c_slave_address_qual_mode_t',['../a00018.html#ga719dc02b99647eb8f08a05d4d6066c51',1,'fsl_i2c.h']]], + ['i2c_5fslave_5faddress_5fregister_5ft',['i2c_slave_address_register_t',['../a00018.html#ga833a7311515f1a3bf5cb8da2355cc661',1,'fsl_i2c.h']]], + ['i2c_5fslave_5fbus_5fspeed_5ft',['i2c_slave_bus_speed_t',['../a00018.html#ga5f368505586dd356fc680711023ace7f',1,'fsl_i2c.h']]], + ['i2c_5fslave_5ffsm_5ft',['i2c_slave_fsm_t',['../a00018.html#gad6564299304730416461f62255fcd37c',1,'fsl_i2c.h']]], + ['i2c_5fslave_5ftransfer_5fevent_5ft',['i2c_slave_transfer_event_t',['../a00018.html#gac53e5c96a2eed1b5a95b7d84be48f4ac',1,'fsl_i2c.h']]], + ['inputmux_5fconnection_5ft',['inputmux_connection_t',['../a00089.html#ga7ac6f6ac5dd2b621eabb60d2ab48163b',1,'fsl_inputmux_connections.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_6d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_6d.html new file mode 100644 index 0000000..424fbf1 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_6d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_6d.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_6d.js new file mode 100644 index 0000000..434db7e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_6d.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['mrt_5fchnl_5ft',['mrt_chnl_t',['../a00020.html#gaece5c1972e35dec2efcce98847a09622',1,'fsl_mrt.h']]], + ['mrt_5finterrupt_5fenable_5ft',['mrt_interrupt_enable_t',['../a00020.html#ga9d2f90ae2c6f99410e2908dac8cc6943',1,'fsl_mrt.h']]], + ['mrt_5fstatus_5fflags_5ft',['mrt_status_flags_t',['../a00020.html#ga0bb94508d8cf924c3a6971364377673a',1,'fsl_mrt.h']]], + ['mrt_5ftimer_5fmode_5ft',['mrt_timer_mode_t',['../a00020.html#gad481f648f1c89a1eab327530d6fef1d0',1,'fsl_mrt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_70.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_70.html new file mode 100644 index 0000000..747c3d4 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_70.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_70.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_70.js new file mode 100644 index 0000000..0b56a83 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_70.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['pd_5fbit_5ft',['pd_bit_t',['../a00085.html#ga26070d8045aac640b0b755bd7b1b5695',1,'fsl_power.h']]], + ['pint_5fpin_5fenable_5ft',['pint_pin_enable_t',['../a00094.html#ga6a17e5c52721f6eb754f54cc72b58c91',1,'fsl_pint.h']]], + ['pint_5fpin_5fint_5ft',['pint_pin_int_t',['../a00094.html#ga15da1f70e8d0a05e9d492d01ceca7da8',1,'fsl_pint.h']]], + ['pint_5fpmatch_5fbslice_5fcfg_5ft',['pint_pmatch_bslice_cfg_t',['../a00094.html#gae1e5bfc17515fab76a1deab955203c6a',1,'fsl_pint.h']]], + ['pint_5fpmatch_5fbslice_5ft',['pint_pmatch_bslice_t',['../a00094.html#ga048bc24e58d7df40af2a45efaabeea9b',1,'fsl_pint.h']]], + ['pint_5fpmatch_5finput_5fsrc_5ft',['pint_pmatch_input_src_t',['../a00094.html#ga2e05f827d6a43eade4c22e9d75bc5d76',1,'fsl_pint.h']]], + ['power_5fbod_5finterrupt_5flevel_5ft',['power_bod_interrupt_level_t',['../a00085.html#gad856ab8003eb9953525518cddbc7814c',1,'fsl_power.h']]], + ['power_5fbod_5freset_5flevel_5ft',['power_bod_reset_level_t',['../a00085.html#gad4414c07be8e296fdf41c256e605c161',1,'fsl_power.h']]], + ['power_5fgen_5freg_5ft',['power_gen_reg_t',['../a00085.html#gaacea8a22b7f4706814e61973550d3492',1,'fsl_power.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_73.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_73.html new file mode 100644 index 0000000..278c544 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_73.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_73.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_73.js new file mode 100644 index 0000000..af782b8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_73.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['sctimer_5fclock_5fmode_5ft',['sctimer_clock_mode_t',['../a00021.html#ga270f5ad1462133d7b88ce71be4913a1d',1,'fsl_sctimer.h']]], + ['sctimer_5fclock_5fselect_5ft',['sctimer_clock_select_t',['../a00021.html#ga82141464913b976a7c2aab50cf17c701',1,'fsl_sctimer.h']]], + ['sctimer_5fconflict_5fresolution_5ft',['sctimer_conflict_resolution_t',['../a00021.html#ga64666471cadaed6ad2e72ce19026aed8',1,'fsl_sctimer.h']]], + ['sctimer_5fcounter_5ft',['sctimer_counter_t',['../a00021.html#ga8df83543fac389c6e3b212d58695f034',1,'fsl_sctimer.h']]], + ['sctimer_5fevent_5factive_5fdirection_5ft',['sctimer_event_active_direction_t',['../a00021.html#gadc0dc8518742a3345ea042eae821dc85',1,'fsl_sctimer.h']]], + ['sctimer_5fevent_5ft',['sctimer_event_t',['../a00021.html#ga8d902ebc4b569d71c88754a49ccf0650',1,'fsl_sctimer.h']]], + ['sctimer_5finput_5ft',['sctimer_input_t',['../a00021.html#ga3d2e093dbbecb8a0afc56bda69b8fa7e',1,'fsl_sctimer.h']]], + ['sctimer_5finterrupt_5fenable_5ft',['sctimer_interrupt_enable_t',['../a00021.html#gaf1007b13bbe43ea28ee33acdc7f5f986',1,'fsl_sctimer.h']]], + ['sctimer_5fout_5ft',['sctimer_out_t',['../a00021.html#ga2befef3e54e22f0624ddb1b016f10148',1,'fsl_sctimer.h']]], + ['sctimer_5fpwm_5flevel_5fselect_5ft',['sctimer_pwm_level_select_t',['../a00021.html#ga7d63d84ecccc4074e40c6754a8754065',1,'fsl_sctimer.h']]], + ['sctimer_5fpwm_5fmode_5ft',['sctimer_pwm_mode_t',['../a00021.html#ga76b1c419363e09d4861880f25f63979d',1,'fsl_sctimer.h']]], + ['sctimer_5fstatus_5fflags_5ft',['sctimer_status_flags_t',['../a00021.html#ga9100974cdbb1542385a983b75b2f0d45',1,'fsl_sctimer.h']]], + ['spi_5fclock_5fphase_5ft',['spi_clock_phase_t',['../a00022.html#ga9ad313685ade497f5cbcb71c74a1b4dc',1,'fsl_spi.h']]], + ['spi_5fclock_5fpolarity_5ft',['spi_clock_polarity_t',['../a00022.html#ga3e5a7cd043c9596779bc23b34cb3d1f9',1,'fsl_spi.h']]], + ['spi_5fdata_5fwidth_5ft',['spi_data_width_t',['../a00022.html#gafa691c5329a7325ee57c9f06fa295731',1,'fsl_spi.h']]], + ['spi_5fshift_5fdirection_5ft',['spi_shift_direction_t',['../a00022.html#gaa68518c16202382c2e1f1c7c66a9d53d',1,'fsl_spi.h']]], + ['spi_5fspol_5ft',['spi_spol_t',['../a00022.html#gafd7e7bd8e060742346806ed8c8f1db4c',1,'fsl_spi.h']]], + ['spi_5fssel_5ft',['spi_ssel_t',['../a00022.html#ga420a3d3f841957068648585b89fa66d1',1,'fsl_spi.h']]], + ['swm_5fport_5fpin_5ftype_5ft',['swm_port_pin_type_t',['../a00095.html#gaca9c780388e187444bfa31a6bcc72d35',1,'fsl_swm_connections.h']]], + ['swm_5fselect_5ffixed_5fpin_5ft',['swm_select_fixed_pin_t',['../a00095.html#ga6db188a71a269613f30825af80c02053',1,'fsl_swm_connections.h']]], + ['swm_5fselect_5fmovable_5ft',['swm_select_movable_t',['../a00095.html#ga45575871cafcadc50292b9bba6b9d13d',1,'fsl_swm_connections.h']]], + ['syscon_5fconnection_5ft',['syscon_connection_t',['../a00096.html#ga4a63ee69b68459770551a0e4d7b6cdad',1,'fsl_syscon_connections.h']]], + ['syscon_5frstn_5ft',['SYSCON_RSTn_t',['../a00086.html#gac287530f011b42355162470f09975770',1,'fsl_reset.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_75.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_75.html new file mode 100644 index 0000000..3bf06c1 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_75.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_75.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_75.js new file mode 100644 index 0000000..38ccbfc --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_75.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['usart_5fclock_5fpolarity_5ft',['usart_clock_polarity_t',['../a00023.html#ga786ba5b98195c3df810a061b6c0cca91',1,'fsl_usart.h']]], + ['usart_5fdata_5flen_5ft',['usart_data_len_t',['../a00023.html#ga28e46a3538cf5f5140523132a963283c',1,'fsl_usart.h']]], + ['usart_5fparity_5fmode_5ft',['usart_parity_mode_t',['../a00023.html#ga9b5ca9521874092ccb637a02d7b26ba2',1,'fsl_usart.h']]], + ['usart_5fstop_5fbit_5fcount_5ft',['usart_stop_bit_count_t',['../a00023.html#ga58ab07609b094f719f903475de6e57b4',1,'fsl_usart.h']]], + ['usart_5fsync_5fmode_5ft',['usart_sync_mode_t',['../a00023.html#ga7ecd603d2579abbe714d58eb582821b8',1,'fsl_usart.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_77.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_77.html new file mode 100644 index 0000000..8e9fc0e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_77.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_77.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_77.js new file mode 100644 index 0000000..1f3960b --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enums_77.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['wkt_5fclock_5fsource_5ft',['wkt_clock_source_t',['../a00024.html#gaf985ebf5e165e2fbda510cac71cad222',1,'fsl_wkt.h']]], + ['wkt_5fstatus_5fflags_5ft',['wkt_status_flags_t',['../a00024.html#ga0c4c3a2aa689d7cdd0608eb1076d83aa',1,'fsl_wkt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enumvalues_6b.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enumvalues_6b.html new file mode 100644 index 0000000..9a2d3d7 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enumvalues_6b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enumvalues_6b.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enumvalues_6b.js new file mode 100644 index 0000000..321a213 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/enumvalues_6b.js @@ -0,0 +1,1005 @@ +var searchData= +[ + ['kacmp_5frst_5fn_5fshift_5frstn',['kACMP_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac1a3b1156e6dbc9d6fecb867f1486c63',1,'fsl_reset.h']]], + ['kacomp_5fhysteresis10mvselection',['kACOMP_Hysteresis10MVSelection',['../a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5aca25ed95469736b1383c06835f1a59a6f7',1,'fsl_acomp.h']]], + ['kacomp_5fhysteresis20mvselection',['kACOMP_Hysteresis20MVSelection',['../a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acab609612c0f5c6987b71f287d0ab8e02c',1,'fsl_acomp.h']]], + ['kacomp_5fhysteresis5mvselection',['kACOMP_Hysteresis5MVSelection',['../a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acae6c2b1547a7e476425962d46b44a00f9',1,'fsl_acomp.h']]], + ['kacomp_5fhysteresisnoneselection',['kACOMP_HysteresisNoneSelection',['../a00008.html#ggaa7c0a15052b6421941faad3c6ea3a5acae003c683374deba88f335221e4f6c62b',1,'fsl_acomp.h']]], + ['kacomp_5finterruptsbothedgesenable',['kACOMP_InterruptsBothEdgesEnable',['../a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a23743234a07f6c25a2b14cca0cd863c7',1,'fsl_acomp.h']]], + ['kacomp_5finterruptsdisable',['kACOMP_InterruptsDisable',['../a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a629a3a054d3fde07b8f1d4974a9d070d',1,'fsl_acomp.h']]], + ['kacomp_5finterruptsfallingedgeenable',['kACOMP_InterruptsFallingEdgeEnable',['../a00008.html#gga178d521ca2ee7f33d518b30dfb627d20ad015e6ad9b09be27a6de122fde6b3997',1,'fsl_acomp.h']]], + ['kacomp_5finterruptsrisingedgeenable',['kACOMP_InterruptsRisingEdgeEnable',['../a00008.html#gga178d521ca2ee7f33d518b30dfb627d20a25801b009aba402b9810189eb8545b8b',1,'fsl_acomp.h']]], + ['kacomp_5fladderrefvoltagepinvdd',['kACOMP_LadderRefVoltagePinVDD',['../a00008.html#gga7ad629d52b0a70f95cd2ddb3bee8ab5fa70a5aa61894fc8d2195652c2fa3423aa',1,'fsl_acomp.h']]], + ['kacomp_5fladderrefvoltagepinvddcmp',['kACOMP_LadderRefVoltagePinVDDCMP',['../a00008.html#gga7ad629d52b0a70f95cd2ddb3bee8ab5fa56718eb64fdbbd04648466547b326c35',1,'fsl_acomp.h']]], + ['kadc_5fadcinunitygainmode',['kADC_ADCInUnityGainMode',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a520d81c1c70fab0701cfdcfaa46e1cae',1,'fsl_adc.h']]], + ['kadc_5fclk_5ffrom_5ffro',['kADC_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a91f272ba2ca7171ce0689d39f9a894af',1,'fsl_clock.h']]], + ['kadc_5fclk_5ffrom_5fsyspll',['kADC_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58adffea42a42dc4f9d329a9d24822b9173',1,'fsl_clock.h']]], + ['kadc_5fclockasynchronousmode',['kADC_ClockAsynchronousMode',['../a00009.html#gga4a1dbe9dcaf32c1eaa98849da1217054a39fb72b080b55020c86ff26f3897e58a',1,'fsl_adc.h']]], + ['kadc_5fclocksynchronousmode',['kADC_ClockSynchronousMode',['../a00009.html#gga4a1dbe9dcaf32c1eaa98849da1217054a411d4bc42ea8ab76ee5d408610e5eaa9',1,'fsl_adc.h']]], + ['kadc_5fconvseqainterruptenable',['kADC_ConvSeqAInterruptEnable',['../a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0a729a5315c1792954ab9455cc6fdb324a',1,'fsl_adc.h']]], + ['kadc_5fconvseqainterruptflag',['kADC_ConvSeqAInterruptFlag',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a6387795dcc8897a8d256cdc4a005d1b7',1,'fsl_adc.h']]], + ['kadc_5fconvseqbinterruptenable',['kADC_ConvSeqBInterruptEnable',['../a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0ac8937ac90396e6c1ab8b3a8c83c530f8',1,'fsl_adc.h']]], + ['kadc_5fconvseqbinterruptflag',['kADC_ConvSeqBInterruptFlag',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ae98f97677a7acd69db8c3f1449eb59a2',1,'fsl_adc.h']]], + ['kadc_5fglobaloverrunflagforseqa',['kADC_GlobalOverrunFlagForSeqA',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a991137c98bcceb8aa70a1a0184117e04',1,'fsl_adc.h']]], + ['kadc_5fglobaloverrunflagforseqb',['kADC_GlobalOverrunFlagForSeqB',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a49619f2fea3c5946285d19531f70246b',1,'fsl_adc.h']]], + ['kadc_5fhighnegativeoffsetadded',['kADC_HighNegativeOffsetAdded',['../a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a7a88de53f3fa62d9c9d073619e6f7b77',1,'fsl_adc.h']]], + ['kadc_5fimpedance55kohm',['kADC_Impedance55kOhm',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a272bdcdc0d5ebca10a10d7f6927f031f',1,'fsl_adc.h']]], + ['kadc_5fimpedance621ohm',['kADC_Impedance621Ohm',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a5f5dc970993e744974494e283be79e2c',1,'fsl_adc.h']]], + ['kadc_5fimpedance87kohm',['kADC_Impedance87kOhm',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a4538ae9bd911369a26f43c1b5fa1150f',1,'fsl_adc.h']]], + ['kadc_5fintermediatenegativeoffsetadded',['kADC_IntermediateNegativeOffsetAdded',['../a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a705b5ce05ce8d2499b4ae652c138339b',1,'fsl_adc.h']]], + ['kadc_5finterruptforeachconversion',['kADC_InterruptForEachConversion',['../a00009.html#gga3948c83397f351b5ed70bbaf1c5da35ba0e0b964334a5fafa867734f43c9302d1',1,'fsl_adc.h']]], + ['kadc_5finterruptforeachsequence',['kADC_InterruptForEachSequence',['../a00009.html#gga3948c83397f351b5ed70bbaf1c5da35ba77c1e0c1efa82a0e1d23b38dcdc42e8d',1,'fsl_adc.h']]], + ['kadc_5flowpositiveoffsetadded',['kADC_LowPositiveOffsetAdded',['../a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5ad18ff3e548f2107156eb50a604d26ee5',1,'fsl_adc.h']]], + ['kadc_5fmultiplexetestmode',['kADC_MultiplexeTestMode',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23aa806598c66d17dadc451cfaab2e6af45',1,'fsl_adc.h']]], + ['kadc_5fnooffsetadded',['kADC_NoOffsetAdded',['../a00009.html#gga2432b8bc48a2d3ede87fd021faefeaa5a524bba486c728e5af9ae263057fe7475',1,'fsl_adc.h']]], + ['kadc_5fnormalfunctionalmode',['kADC_NormalFunctionalMode',['../a00009.html#ggafb17afb34b6114b97b8bfa331465fd23a8792af738570ae4baa6f58baecc04eff',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn0',['kADC_OverrunFlagForChn0',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a0086e00d201a353a233cd570617b9128',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn1',['kADC_OverrunFlagForChn1',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aacd6f79515273a505a65a0dd5c8690b5',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn10',['kADC_OverrunFlagForChn10',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a373a8f9c3452766d74c2af2dd40a1dd4',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn11',['kADC_OverrunFlagForChn11',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a8d637176a1bcc96a375ac279ea15b046',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn2',['kADC_OverrunFlagForChn2',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aed73601435eac8f9bd001a220d19e751',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn3',['kADC_OverrunFlagForChn3',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a17a3e2ddfb6a1b82a873bb4fa23f33e8',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn4',['kADC_OverrunFlagForChn4',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1af4df6887691e65370852ca7a92d70ea9',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn5',['kADC_OverrunFlagForChn5',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a353d6e15f06ffc2b73459e5d9f8cc0be',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn6',['kADC_OverrunFlagForChn6',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ae41a39a8a1f2c74ce8641e22edd91704',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn7',['kADC_OverrunFlagForChn7',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1ac9443c7ed6d4344ec7c9e3406b6e9dda',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn8',['kADC_OverrunFlagForChn8',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a3db46ecb1054e09a7ec16d5b9096022c',1,'fsl_adc.h']]], + ['kadc_5foverrunflagforchn9',['kADC_OverrunFlagForChn9',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aabc9b70b8c8f836ce36bc5fb29b2638c',1,'fsl_adc.h']]], + ['kadc_5foverruninterruptenable',['kADC_OverrunInterruptEnable',['../a00009.html#ggac5899c7af1f9cac7695d7171f83be5f0a81d0490f6a7b7fd8301c7af3162c9770',1,'fsl_adc.h']]], + ['kadc_5foverruninterruptflag',['kADC_OverrunInterruptFlag',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a648b51f9b03d99e58197f077323cada4',1,'fsl_adc.h']]], + ['kadc_5fpriorityhigh',['kADC_PriorityHigh',['../a00009.html#ggab625534aa39c1cd25f18cdc0dc3b9981a591af3687c8df2663d34e7d8ff942abe',1,'fsl_adc.h']]], + ['kadc_5fprioritylow',['kADC_PriorityLow',['../a00009.html#ggab625534aa39c1cd25f18cdc0dc3b9981aa47123e81ebbce4dd5905b0b93d0303d',1,'fsl_adc.h']]], + ['kadc_5fresolution10bitinforesultshift',['kADC_Resolution10bitInfoResultShift',['../a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28cca9923280b0a76bc961bed79aef5ecb0f3',1,'fsl_adc.h']]], + ['kadc_5fresolution12bitinforesultshift',['kADC_Resolution12bitInfoResultShift',['../a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28cca5925d865b6882eeef54d3389dc2e9f98',1,'fsl_adc.h']]], + ['kadc_5fresolution6bitinforesultshift',['kADC_Resolution6bitInfoResultShift',['../a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28ccaa51dfd6f4acca775dd0838c40eebe25e',1,'fsl_adc.h']]], + ['kadc_5fresolution8bitinforesultshift',['kADC_Resolution8bitInfoResultShift',['../a00009.html#ggaecfd3ba1bc4b014f3c11bc6f348a28ccae60e431363f005f7830c1751ec9dbb3b',1,'fsl_adc.h']]], + ['kadc_5frst_5fn_5fshift_5frstn',['kADC_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a99e18503426294e439f4bb181a451999',1,'fsl_reset.h']]], + ['kadc_5fthresholdcompareaboverange',['kADC_ThresholdCompareAboveRange',['../a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a88f6c1b1c2081034a524d1f07bda8479',1,'fsl_adc.h']]], + ['kadc_5fthresholdcomparebelowrange',['kADC_ThresholdCompareBelowRange',['../a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a4957dc189299bb3397555dbb37991903',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn0',['kADC_ThresholdCompareFlagOnChn0',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a07b97b0e0329e40c1829ac1e54467279',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn1',['kADC_ThresholdCompareFlagOnChn1',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a5f66d1dcf413402eff0001649d32f853',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn10',['kADC_ThresholdCompareFlagOnChn10',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a50a526a957a500f1d1230856e5f62cb0',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn11',['kADC_ThresholdCompareFlagOnChn11',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a21a9e76ef0b99eb7970c72ca8f069aa7',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn2',['kADC_ThresholdCompareFlagOnChn2',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a0d600a9a25c74a6a50f013098ec2a7d6',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn3',['kADC_ThresholdCompareFlagOnChn3',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a85350dd974c40f8f90151461a5b8de7b',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn4',['kADC_ThresholdCompareFlagOnChn4',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aa0666658656409d16593317d233b7daf',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn5',['kADC_ThresholdCompareFlagOnChn5',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a2d05c841ef6de9ed853b2847fbd5b389',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn6',['kADC_ThresholdCompareFlagOnChn6',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aeab65543e48b53dcb43e6ef75bd4cefa',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn7',['kADC_ThresholdCompareFlagOnChn7',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a261489b6eaf9fd1c667f3b7730670c35',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn8',['kADC_ThresholdCompareFlagOnChn8',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a091532f8a931257bed8d481d746ce483',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareflagonchn9',['kADC_ThresholdCompareFlagOnChn9',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1aad52525faafab93597654764e5b76e97',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareinrange',['kADC_ThresholdCompareInRange',['../a00009.html#ggad47d3fd5553ab75cdf6b95268cb94f20a0879cb322fa21eea083514475b2e5c92',1,'fsl_adc.h']]], + ['kadc_5fthresholdcompareinterruptflag',['kADC_ThresholdCompareInterruptFlag',['../a00009.html#gga417e499fb2f1ee7ba05088468b392ce1a33cf119645a07f65a85a0330e8caac59',1,'fsl_adc.h']]], + ['kadc_5fthresholdcrossingdownward',['kADC_ThresholdCrossingDownward',['../a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54ac5aec5587ce5a042aed8506c8e732422',1,'fsl_adc.h']]], + ['kadc_5fthresholdcrossingnodetected',['kADC_ThresholdCrossingNoDetected',['../a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54abf34f1a6b0ab0bb0338143eba9344156',1,'fsl_adc.h']]], + ['kadc_5fthresholdcrossingupward',['kADC_ThresholdCrossingUpward',['../a00009.html#ggae86929708f4bb8be4cc88dcf50c3db54a84de2355e5d40cc75c1ac6e56feb7153',1,'fsl_adc.h']]], + ['kadc_5fthresholdinterruptdisabled',['kADC_ThresholdInterruptDisabled',['../a00009.html#ggac6aab6fdd21723cfc6ed4437372521aca9302e8f9009ba4561655bb2903156522',1,'fsl_adc.h']]], + ['kadc_5fthresholdinterruptoncrossing',['kADC_ThresholdInterruptOnCrossing',['../a00009.html#ggac6aab6fdd21723cfc6ed4437372521acab2db65594aeb9ce82f73ace49535d278',1,'fsl_adc.h']]], + ['kadc_5fthresholdinterruptonoutside',['kADC_ThresholdInterruptOnOutside',['../a00009.html#ggac6aab6fdd21723cfc6ed4437372521aca699feabaae444d40c7261e26a2872af8',1,'fsl_adc.h']]], + ['kadc_5ftriggerpolaritynegativeedge',['kADC_TriggerPolarityNegativeEdge',['../a00009.html#gga538fb95659082602d6ebb205f21573a5a2515d6b46f5b471d516ceff71dda5bb5',1,'fsl_adc.h']]], + ['kadc_5ftriggerpolaritypositiveedge',['kADC_TriggerPolarityPositiveEdge',['../a00009.html#gga538fb95659082602d6ebb205f21573a5a1e29943afcd9c5266a8401565798febe',1,'fsl_adc.h']]], + ['kbod_5finterruptlevel1',['kBod_InterruptLevel1',['../a00085.html#ggad856ab8003eb9953525518cddbc7814ca186e757d5a202f806afd889315af3639',1,'fsl_power.h']]], + ['kbod_5finterruptlevel2',['kBod_InterruptLevel2',['../a00085.html#ggad856ab8003eb9953525518cddbc7814ca2094c3f450488ea077bf45edabd227ba',1,'fsl_power.h']]], + ['kbod_5finterruptlevel3',['kBod_InterruptLevel3',['../a00085.html#ggad856ab8003eb9953525518cddbc7814cab28fa5a4937806aefbc4d259a419d354',1,'fsl_power.h']]], + ['kbod_5finterruptlevelreserved',['kBod_InterruptLevelReserved',['../a00085.html#ggad856ab8003eb9953525518cddbc7814cabc8bc042a952213b5364fcc75fb2e459',1,'fsl_power.h']]], + ['kbod_5fresetlevel1',['kBod_ResetLevel1',['../a00085.html#ggad4414c07be8e296fdf41c256e605c161a787770b2bcd6da51b910e61a4b1587a2',1,'fsl_power.h']]], + ['kbod_5fresetlevel2',['kBod_ResetLevel2',['../a00085.html#ggad4414c07be8e296fdf41c256e605c161a75c8d8c85c9703e637809b497e798615',1,'fsl_power.h']]], + ['kbod_5fresetlevel3',['kBod_ResetLevel3',['../a00085.html#ggad4414c07be8e296fdf41c256e605c161a6eb61ac24d5fe54b31f0c2089e5da750',1,'fsl_power.h']]], + ['kbod_5fresetlevelreserved',['kBod_ResetLevelReserved',['../a00085.html#ggad4414c07be8e296fdf41c256e605c161add73712f6ddad1995c9569ab44773f86',1,'fsl_power.h']]], + ['kcapt_5fbusystatusflag',['kCAPT_BusyStatusFlag',['../a00010.html#gga86048ff411e845cbde51d9324b5a4b0fa1a35bccccdc8b9c911a96a14f6413579',1,'fsl_capt.h']]], + ['kcapt_5fclk_5ffrom_5ffro',['kCAPT_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af1d8576caccfd1e48d121fae4315c10d',1,'fsl_clock.h']]], + ['kcapt_5fclk_5ffrom_5ffro_5fdiv',['kCAPT_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58abae02f94616cc17800067d5601943b5e',1,'fsl_clock.h']]], + ['kcapt_5fclk_5ffrom_5fmainclk',['kCAPT_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a28b61eb46fb752a05934e2d44450acc0',1,'fsl_clock.h']]], + ['kcapt_5fclk_5ffrom_5fsyspll',['kCAPT_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ab7e3ded84a0cb9fbc059b9d2604ba9c0',1,'fsl_clock.h']]], + ['kcapt_5fclk_5ffrom_5fwdtosc',['kCAPT_Clk_From_WdtOsc',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a1f6cedfc78cc220b123a36ae896c51c4',1,'fsl_clock.h']]], + ['kcapt_5fcomparatortriggermode',['kCAPT_ComparatorTriggerMode',['../a00010.html#gga0c1eb1e31ad34c8654c981a5e643e2c9a29ad6662e14cd08a6d3771ecbd591619',1,'fsl_capt.h']]], + ['kcapt_5fdmatriggeronallmode',['kCAPT_DMATriggerOnAllMode',['../a00010.html#gga0be2df04c72a8847673bcb6d9714866aae7dbcc430de0ec04afa4b600985bfaf7',1,'fsl_capt.h']]], + ['kcapt_5fdmatriggeronbothmode',['kCAPT_DMATriggerOnBothMode',['../a00010.html#gga0be2df04c72a8847673bcb6d9714866aac710d56353625bbc2ed100f6dc28111d',1,'fsl_capt.h']]], + ['kcapt_5fdmatriggerontouchmode',['kCAPT_DMATriggerOnTouchMode',['../a00010.html#gga0be2df04c72a8847673bcb6d9714866aacf5512e0ec996846318dc272e7366887',1,'fsl_capt.h']]], + ['kcapt_5finactivexpinsdrivenlowmode',['kCAPT_InactiveXpinsDrivenLowMode',['../a00010.html#gga01d767059334ad74d416f6c0287f101ba080299d9cd40fafc670901715422dbbc',1,'fsl_capt.h']]], + ['kcapt_5finactivexpinshighzmode',['kCAPT_InactiveXpinsHighZMode',['../a00010.html#gga01d767059334ad74d416f6c0287f101bac07d74a17c9f9d1b9119b89639f54b9b',1,'fsl_capt.h']]], + ['kcapt_5finterruptofnotouchenable',['kCAPT_InterruptOfNoTouchEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5afbc435647bf5d8ec4b8133bb54457d8b',1,'fsl_capt.h']]], + ['kcapt_5finterruptofnotouchstatusflag',['kCAPT_InterruptOfNoTouchStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0a1d4948f18e10cda189c9c9f89b76f0f8',1,'fsl_capt.h']]], + ['kcapt_5finterruptofoverrunenable',['kCAPT_InterruptOfOverRunEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5af27b5126282bcda28c64a9e9be550b88',1,'fsl_capt.h']]], + ['kcapt_5finterruptofoverrunstatusflag',['kCAPT_InterruptOfOverRunStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0ac64c1bc40831fc72981bb42514124e24',1,'fsl_capt.h']]], + ['kcapt_5finterruptofpolldoneenable',['kCAPT_InterruptOfPollDoneEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5ae4a63900c77ec1f5fae1ccea5ca30833',1,'fsl_capt.h']]], + ['kcapt_5finterruptofpolldonestatusflag',['kCAPT_InterruptOfPollDoneStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0afd67816e707734658900577dfbd4e2bc',1,'fsl_capt.h']]], + ['kcapt_5finterruptoftimeoutenable',['kCAPT_InterruptOfTimeOutEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5a2ce349ca4f3712664ea61a07cbadc63d',1,'fsl_capt.h']]], + ['kcapt_5finterruptoftimeoutstatusflag',['kCAPT_InterruptOfTimeOutStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0a84d8d50b7d358cbc9612a1751074ee15',1,'fsl_capt.h']]], + ['kcapt_5finterruptofyestouchenable',['kCAPT_InterruptOfYesTouchEnable',['../a00010.html#gga6ac2e06f77196123f25e3f5c79ae6ea5ae1bd26a87ec4a5bb4c250856cf1c1994',1,'fsl_capt.h']]], + ['kcapt_5finterruptofyestouchstatusflag',['kCAPT_InterruptOfYesTouchStatusFlag',['../a00010.html#gga6764adb0a0bda236d301256120cddae0a404cfdab3986fef656232281d68a4e6b',1,'fsl_capt.h']]], + ['kcapt_5fmeasuredelaynowait',['kCAPT_MeasureDelayNoWait',['../a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dafe63c76a86da5c022a74985bd052a07f',1,'fsl_capt.h']]], + ['kcapt_5fmeasuredelaywait3fclks',['kCAPT_MeasureDelayWait3FCLKs',['../a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dae787b59b2f377b1ef65d0c13f45e757e',1,'fsl_capt.h']]], + ['kcapt_5fmeasuredelaywait5fclks',['kCAPT_MeasureDelayWait5FCLKs',['../a00010.html#gga5ced51d15f9db8f1e6619a5859f6215dae746038d0fc4423106a252b02ec58ac2',1,'fsl_capt.h']]], + ['kcapt_5fmeasuredelaywait9fclks',['kCAPT_MeasureDelayWait9FCLKs',['../a00010.html#gga5ced51d15f9db8f1e6619a5859f6215da839864dc82a65aa09bccd6c672f23a80',1,'fsl_capt.h']]], + ['kcapt_5fpollcontinuousmode',['kCAPT_PollContinuousMode',['../a00010.html#gga43dfe06b3cce27e03b4b131557a5237baca7d1fdc5128af90a17c6e71a9133dda',1,'fsl_capt.h']]], + ['kcapt_5fpollinactivemode',['kCAPT_PollInactiveMode',['../a00010.html#gga43dfe06b3cce27e03b4b131557a5237ba70a38885a33a8996934ad68c3322df89',1,'fsl_capt.h']]], + ['kcapt_5fpollnowmode',['kCAPT_PollNowMode',['../a00010.html#gga43dfe06b3cce27e03b4b131557a5237ba50f00dbce20a1a3390c77501baccf4a0',1,'fsl_capt.h']]], + ['kcapt_5fresetdelaynowait',['kCAPT_ResetDelayNoWait',['../a00010.html#gga4394d9b57a062c83c444e391c4adf855a306721a69ff013b3f7784bb5d503fa1a',1,'fsl_capt.h']]], + ['kcapt_5fresetdelaywait3fclks',['kCAPT_ResetDelayWait3FCLKs',['../a00010.html#gga4394d9b57a062c83c444e391c4adf855a505d962a510aaf415ee47e6d92ca932c',1,'fsl_capt.h']]], + ['kcapt_5fresetdelaywait5fclks',['kCAPT_ResetDelayWait5FCLKs',['../a00010.html#gga4394d9b57a062c83c444e391c4adf855aadd3a0bd70e2f2795032fc953d97c677',1,'fsl_capt.h']]], + ['kcapt_5fresetdelaywait9fclks',['kCAPT_ResetDelayWait9FCLKs',['../a00010.html#gga4394d9b57a062c83c444e391c4adf855a4d1bfa8129b289d5fe1f56dd980343ea',1,'fsl_capt.h']]], + ['kcapt_5frst_5fn_5fshift_5frstn',['kCAPT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a6946809531736fcf4d7067e31f73813b',1,'fsl_reset.h']]], + ['kcapt_5fx0pin',['kCAPT_X0Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ad4b60dd2d35d11a91c11630a7fe91640',1,'fsl_capt.h']]], + ['kcapt_5fx10pin',['kCAPT_X10Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a72314787f99f4a5ba7e51c1445fe65f2',1,'fsl_capt.h']]], + ['kcapt_5fx11pin',['kCAPT_X11Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a53723bf555f64a437f12dff73e7f2188',1,'fsl_capt.h']]], + ['kcapt_5fx12pin',['kCAPT_X12Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a5ce0c1dfcdfb869146b24d9270edefdc',1,'fsl_capt.h']]], + ['kcapt_5fx13pin',['kCAPT_X13Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a02ca618c220ce6b97354404817051716',1,'fsl_capt.h']]], + ['kcapt_5fx14pin',['kCAPT_X14Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a88058e395307862a638c86eaf6528c96',1,'fsl_capt.h']]], + ['kcapt_5fx15pin',['kCAPT_X15Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a3c578a968a4c45b41436d845f456a142',1,'fsl_capt.h']]], + ['kcapt_5fx1pin',['kCAPT_X1Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ac39fdef6bb40a142936848a676f02e49',1,'fsl_capt.h']]], + ['kcapt_5fx2pin',['kCAPT_X2Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5ab8afeb42a5dc990d1114d333e05851e0',1,'fsl_capt.h']]], + ['kcapt_5fx3pin',['kCAPT_X3Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a4553067b9caa5fd98c1d01074891f5ee',1,'fsl_capt.h']]], + ['kcapt_5fx4pin',['kCAPT_X4Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5aaccaeef5cb7c021878c1d7c4f5034a76',1,'fsl_capt.h']]], + ['kcapt_5fx5pin',['kCAPT_X5Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a1a48e4c212d0be7fa18b7d325afc86ed',1,'fsl_capt.h']]], + ['kcapt_5fx6pin',['kCAPT_X6Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a3ede3850cc844875718179e5a1008900',1,'fsl_capt.h']]], + ['kcapt_5fx7pin',['kCAPT_X7Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a88ef286dbf5a39b6ee66968632a28efe',1,'fsl_capt.h']]], + ['kcapt_5fx8pin',['kCAPT_X8Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a9801372f0a31c85b186120eea0c658f8',1,'fsl_capt.h']]], + ['kcapt_5fx9pin',['kCAPT_X9Pin',['../a00010.html#gga2c35cfaacd7e34465baab32d16a4abb5a85bab394942771628a37eb7b0fd5998f',1,'fsl_capt.h']]], + ['kcapt_5fxmaxstatusflag',['kCAPT_XMAXStatusFlag',['../a00010.html#gga86048ff411e845cbde51d9324b5a4b0fa9210dee59a14aaec97257fac9a20ae9c',1,'fsl_capt.h']]], + ['kcapt_5fyhporttriggermode',['kCAPT_YHPortTriggerMode',['../a00010.html#gga0c1eb1e31ad34c8654c981a5e643e2c9aba5349742fd4b19f8a7ccc0bdc9cb514',1,'fsl_capt.h']]], + ['kclkout_5ffrom_5fextclk',['kCLKOUT_From_ExtClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a8671f2c92f6e049ed8b2f3b7a5b9b296',1,'fsl_clock.h']]], + ['kclkout_5ffrom_5ffro',['kCLKOUT_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af2ea89b865003dc40f8923f67d7bb366',1,'fsl_clock.h']]], + ['kclkout_5ffrom_5fmainclk',['kCLKOUT_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a20d47beaa61ee59b61c34fa4f7e30d21',1,'fsl_clock.h']]], + ['kclkout_5ffrom_5fsyspll',['kCLKOUT_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58aa5b46ff93c42325f2c8d93b1bfbd2555',1,'fsl_clock.h']]], + ['kclkout_5ffrom_5fwdtosc',['kCLKOUT_From_WdtOsc',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a473a6161d9f0f5f580c2e8b913694831',1,'fsl_clock.h']]], + ['kclock_5facmp',['kCLOCK_Acmp',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da5c44f9347603d8c7fd8eda74e3b3e40f',1,'fsl_clock.h']]], + ['kclock_5fadc',['kCLOCK_Adc',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da2bc16e3ee343b4abfc46ae9506461e97',1,'fsl_clock.h']]], + ['kclock_5fcapt',['kCLOCK_Capt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da0ffae7aa0d9dbc52524beb5f82ced038',1,'fsl_clock.h']]], + ['kclock_5fcoresysclk',['kCLOCK_CoreSysClk',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a1de4a40f5399eb025d5faefda7491918',1,'fsl_clock.h']]], + ['kclock_5fcrc',['kCLOCK_Crc',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daa1cfbe8497997fc6dff0d7f0c070aa5a',1,'fsl_clock.h']]], + ['kclock_5fctimer0',['kCLOCK_Ctimer0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dad2e9ebc3825a65fae3c13efbc805a128',1,'fsl_clock.h']]], + ['kclock_5fdac0',['kCLOCK_Dac0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daea833e6e503de81899699c1bb23d774b',1,'fsl_clock.h']]], + ['kclock_5fdac1',['kCLOCK_Dac1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da9f0fcaa6854d2b404e0b67a2239893ae',1,'fsl_clock.h']]], + ['kclock_5fdivadcclk',['kCLOCK_DivAdcClk',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca7b3998fdf96eb884e35ff56f40feffbd',1,'fsl_clock.h']]], + ['kclock_5fdivclkout',['kCLOCK_DivClkOut',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872caa7236a2c00237ca7ee5b2ff55058ded6',1,'fsl_clock.h']]], + ['kclock_5fdivsctclk',['kCLOCK_DivSctClk',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872caa6c1d0bc0cb2e70e5801d2d2a55d6150',1,'fsl_clock.h']]], + ['kclock_5fdma',['kCLOCK_Dma',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daabce09bc09630409474602bc5eab7c10',1,'fsl_clock.h']]], + ['kclock_5fextclk',['kCLOCK_ExtClk',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a30e6333c132740b84bf2ce94b8c44a8f',1,'fsl_clock.h']]], + ['kclock_5ffrg0',['kCLOCK_Frg0',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3aa27972710b7df62d66918584843aee06',1,'fsl_clock.h']]], + ['kclock_5ffrg1',['kCLOCK_Frg1',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a5aeefcf41548bb4dd09f1e17f39da7e0',1,'fsl_clock.h']]], + ['kclock_5ffro',['kCLOCK_Fro',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a01a946b874db04d12aba4c3bbe461580',1,'fsl_clock.h']]], + ['kclock_5ffrodiv',['kCLOCK_FroDiv',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a01d0c099adda9e435281c887b12095a8',1,'fsl_clock.h']]], + ['kclock_5ffrooscout18m',['kCLOCK_FroOscOut18M',['../a00011.html#gga85bf7440c0d77269e3db764083110334a60f89d729c96295d1aaa741a412d58ab',1,'fsl_clock.h']]], + ['kclock_5ffrooscout24m',['kCLOCK_FroOscOut24M',['../a00011.html#gga85bf7440c0d77269e3db764083110334a01135115df0c0b0525f2b1391ee9d9ca',1,'fsl_clock.h']]], + ['kclock_5ffrooscout30m',['kCLOCK_FroOscOut30M',['../a00011.html#gga85bf7440c0d77269e3db764083110334a29c4fdcb48fba40928b278765d0e3843',1,'fsl_clock.h']]], + ['kclock_5ffrosrcfroosc',['kCLOCK_FroSrcFroOsc',['../a00011.html#gga9ff656514a680eef6ffbf40f4eef0bfba931823a2fb900cbf75da504129ef8d91',1,'fsl_clock.h']]], + ['kclock_5ffrosrclpwrbootvalue',['kCLOCK_FroSrcLpwrBootValue',['../a00011.html#gga9ff656514a680eef6ffbf40f4eef0bfba98131c5eeabd0e169e93b174aebdcf86',1,'fsl_clock.h']]], + ['kclock_5fgpio0',['kCLOCK_Gpio0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da9ec19029dc1ad34cb7ae0091e97b7f7d',1,'fsl_clock.h']]], + ['kclock_5fgpio1',['kCLOCK_Gpio1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da72b9be69422d94586bf09e6bd3d2632a',1,'fsl_clock.h']]], + ['kclock_5fgpioint',['kCLOCK_GpioInt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da3922459ccb3f2fd90ac39813c0dc39f0',1,'fsl_clock.h']]], + ['kclock_5fi2c0',['kCLOCK_I2c0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dac6e6ee6e9f7b28e5c3818324c852b05f',1,'fsl_clock.h']]], + ['kclock_5fi2c1',['kCLOCK_I2c1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da689e957d82ca723a1a0cc671ba216bf5',1,'fsl_clock.h']]], + ['kclock_5fi2c2',['kCLOCK_I2c2',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da239422d8b3e53afadaf651015ffb5065',1,'fsl_clock.h']]], + ['kclock_5fi2c3',['kCLOCK_I2c3',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da5f0100f89ed9f83b8eb76dc0de0d08fd',1,'fsl_clock.h']]], + ['kclock_5fiocon',['kCLOCK_Iocon',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da909ccfe84f4275dd7b6ba09235583230',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv0',['kCLOCK_IOCONCLKDiv0',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca8ffa1d0afc3fa83f1d5bd563ba2329a2',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv1',['kCLOCK_IOCONCLKDiv1',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872cacec00650d4292d94c3aa236bf33b7fb4',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv2',['kCLOCK_IOCONCLKDiv2',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca2540a6d8147d6328653834c72c62f6d5',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv3',['kCLOCK_IOCONCLKDiv3',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca87f8cd7b1b138c47af69a0bb106d70f8',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv4',['kCLOCK_IOCONCLKDiv4',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca05fc477260e0f901a194bed1762e388c',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv5',['kCLOCK_IOCONCLKDiv5',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872cabdbfc756defca27f8444ebccc928eae5',1,'fsl_clock.h']]], + ['kclock_5fioconclkdiv6',['kCLOCK_IOCONCLKDiv6',['../a00011.html#ggac344a8334a482bcbcbdf0c4828db872ca3f4c007e9c6a7cf58407f8f0974b7900',1,'fsl_clock.h']]], + ['kclock_5fipinvalid',['kCLOCK_IpInvalid',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da11dd047399d3cf7893682897e34682de',1,'fsl_clock.h']]], + ['kclock_5fmainclk',['kCLOCK_MainClk',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a86d48329b3492ab94a5da3925c73622f',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcextclk',['kCLOCK_MainClkSrcExtClk',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4a85dbf0a96c672abcfbc08dfc231088d6',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcfro',['kCLOCK_MainClkSrcFro',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4a0aecd9451c5bf4525fe17a7b4734f58f',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcfrodiv',['kCLOCK_MainClkSrcFroDiv',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4afa92bbf8fcfb74ceea172667409f7643',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcsyspll',['kCLOCK_MainClkSrcSysPll',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4aa4b20f43266422065fa678e4e9ee6e92',1,'fsl_clock.h']]], + ['kclock_5fmainclksrcwdtosc',['kCLOCK_MainClkSrcWdtOsc',['../a00011.html#ggab68022e8d8f60a72f86a6a6c13b6e2f4ab6adbaab8fe4761c0fb828aa7066bd80',1,'fsl_clock.h']]], + ['kclock_5fmrt',['kCLOCK_Mrt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daace73b709cda5c34ba5bdf6888605f1f',1,'fsl_clock.h']]], + ['kclock_5fmtb',['kCLOCK_Mtb',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da82cabf9d7a17650616d227b23ab2a35a',1,'fsl_clock.h']]], + ['kclock_5fpllout',['kCLOCK_PllOut',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a2c5ccaeff2df0dc3c67a5aa36e5576d3',1,'fsl_clock.h']]], + ['kclock_5fram0_5f1',['kCLOCK_Ram0_1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da02834dc4dbeb1ca14211279916182425',1,'fsl_clock.h']]], + ['kclock_5from',['kCLOCK_Rom',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da1b9f348e8d5bc1715af7366be3ca87c7',1,'fsl_clock.h']]], + ['kclock_5fsct',['kCLOCK_Sct',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da7b405d8427fbdfbf1a7f910f828d8ed6',1,'fsl_clock.h']]], + ['kclock_5fspi0',['kCLOCK_Spi0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dac6997ec12e66b5e4fad9aa52ef6a2db0',1,'fsl_clock.h']]], + ['kclock_5fspi1',['kCLOCK_Spi1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dadd0ceacddcfe95c6e7c8bbcfd2f4ca60',1,'fsl_clock.h']]], + ['kclock_5fswm',['kCLOCK_Swm',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da63bcbbef2627c667b204eae91c3a0718',1,'fsl_clock.h']]], + ['kclock_5fsyspllsrcextclk',['kCLOCK_SysPllSrcExtClk',['../a00011.html#gga04c66d991cdc5cb35e31c27881bc549bad5b4cf5a82ac9fdac6b51d63723b2f8e',1,'fsl_clock.h']]], + ['kclock_5fsyspllsrcfro',['kCLOCK_SysPllSrcFRO',['../a00011.html#gga04c66d991cdc5cb35e31c27881bc549ba1f337e9ad4557c3916c55340676c2b8e',1,'fsl_clock.h']]], + ['kclock_5fsyspllsrcfrodiv',['kCLOCK_SysPllSrcFroDiv',['../a00011.html#gga04c66d991cdc5cb35e31c27881bc549bab45a2c903d5f052fb055b96793bde296',1,'fsl_clock.h']]], + ['kclock_5fsyspllsrcwdtosc',['kCLOCK_SysPllSrcWdtOsc',['../a00011.html#gga04c66d991cdc5cb35e31c27881bc549ba888e842686be1af0ded28719bf24d0a8',1,'fsl_clock.h']]], + ['kclock_5fuart0',['kCLOCK_Uart0',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da26876b4bdecc15c46c379a289441b3c6',1,'fsl_clock.h']]], + ['kclock_5fuart1',['kCLOCK_Uart1',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da1d4898f8634e2f18e6a154e2b1a4120e',1,'fsl_clock.h']]], + ['kclock_5fuart2',['kCLOCK_Uart2',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daf079522d21082e83bd0192040a103e8b',1,'fsl_clock.h']]], + ['kclock_5fuart3',['kCLOCK_Uart3',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da2073aacb108d570b5cd4099d6294d74d',1,'fsl_clock.h']]], + ['kclock_5fuart4',['kCLOCK_Uart4',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946da9e86fefe81e4318044e0f234b3df97b0',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq0hz',['kCLOCK_WdtAnaFreq0HZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ac6cc9f4ed8bbf5bec37add7161537d1d',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq1050khz',['kCLOCK_WdtAnaFreq1050KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a261a52fc17b6e0652c7f87470de1de8d',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq1400khz',['kCLOCK_WdtAnaFreq1400KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a9f301770a8bc08fb5acbf32b46d8521c',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq1750khz',['kCLOCK_WdtAnaFreq1750KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ace0a3b71f10ba38150ee5622e8ce3690',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq2100khz',['kCLOCK_WdtAnaFreq2100KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6abd3904f3cdbf1323d1e49d2807f3fa5e',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq2400khz',['kCLOCK_WdtAnaFreq2400KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a09f8f2b77ad4804c199404df2f9ea50f',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq2700khz',['kCLOCK_WdtAnaFreq2700KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ad12681c88e869163d4aed173ff0e6c64',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq3000khz',['kCLOCK_WdtAnaFreq3000KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a4c1c5972ed4ae79fad8e02a56031c002',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq3250khz',['kCLOCK_WdtAnaFreq3250KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a98d3b066806df88b3c330005da251ecf',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq3500khz',['kCLOCK_WdtAnaFreq3500KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6abe6204f4fa5c74e82d3bf0dd5a61c914',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq3750khz',['kCLOCK_WdtAnaFreq3750KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6afb2f3adebaed700221c6c93f113a2a90',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq4000khz',['kCLOCK_WdtAnaFreq4000KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6aff64cf52ab7c013a83fbf131a864614f',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq4200khz',['kCLOCK_WdtAnaFreq4200KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ad4169afafb522bc5829d1df64170e346',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq4400khz',['kCLOCK_WdtAnaFreq4400KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ad4547d866fcc745745ce5e31434eb099',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq4600khz',['kCLOCK_WdtAnaFreq4600KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6a762e9bc889c580c8a5083c51869f19c8',1,'fsl_clock.h']]], + ['kclock_5fwdtanafreq600khz',['kCLOCK_WdtAnaFreq600KHZ',['../a00011.html#gga564beca73d288c0d6fd237f541e279e6ac176648f32c98ffae06e1dbe90775923',1,'fsl_clock.h']]], + ['kclock_5fwdtosc',['kCLOCK_WdtOsc',['../a00011.html#ggaf74854e9bcee544d7646c5bafdc00bd3a18a8be3e9ab0fd908821ff17940317c6',1,'fsl_clock.h']]], + ['kclock_5fwkt',['kCLOCK_Wkt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946dad386313192805ba225b0da24e078d387',1,'fsl_clock.h']]], + ['kclock_5fwwdt',['kCLOCK_Wwdt',['../a00011.html#gga23c8b3ae62f7865b2e228408be95946daf1e8b91e80a3a9a4db038c0b4cf7e381',1,'fsl_clock.h']]], + ['kcrc_5fpolynomial_5fcrc_5f16',['kCRC_Polynomial_CRC_16',['../a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da4a13840f3031b3aed89f60ba37a34c8b',1,'fsl_crc.h']]], + ['kcrc_5fpolynomial_5fcrc_5f32',['kCRC_Polynomial_CRC_32',['../a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da12ca2ee766202eb962135c76c00b10aa',1,'fsl_crc.h']]], + ['kcrc_5fpolynomial_5fcrc_5fccitt',['kCRC_Polynomial_CRC_CCITT',['../a00012.html#gga7daa8fa0df9f42a98afcf766a63d931da9ef1c3d85d4f13199e7df63d170bf6f6',1,'fsl_crc.h']]], + ['kcrc_5frst_5fshift_5frstn',['kCRC_RST_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a194baa96cd93ef108f2724fa98352387',1,'fsl_reset.h']]], + ['kctimer0_5frst_5fn_5fshift_5frstn',['kCTIMER0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a900b1deecf2f2316b30e40ff81330499',1,'fsl_reset.h']]], + ['kctimer_5fcapture0flag',['kCTIMER_Capture0Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a5504b0ec94b832a46824ec297a106df1',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture0interruptenable',['kCTIMER_Capture0InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a5fe0ea705babd6351564e59c8db8e928',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture1flag',['kCTIMER_Capture1Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60af3a0db73d48116ea419af737c706b30b',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture1interruptenable',['kCTIMER_Capture1InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a5d70800d3cc33733d42f525242edbbf4',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture2flag',['kCTIMER_Capture2Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60aaf0224295d4f330d0d61d10ab30f38ea',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture2interruptenable',['kCTIMER_Capture2InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a68a56db3574cd0ea3bb783c7d13f0894',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5f0',['kCTIMER_Capture_0',['../a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3faa13dee3bb29b8962385da2ac6d8dc938',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5f1',['kCTIMER_Capture_1',['../a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3fac4fcf23f15faa447489ef7ccc4d6cb25',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5f2',['kCTIMER_Capture_2',['../a00013.html#gga2fbf5cfa219c31ac16f3786d6897dc3fa9d6d30f6a5498d009cd87fafee3bccd5',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5fbothedge',['kCTIMER_Capture_BothEdge',['../a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638ab73ca62f50120abc4662c750925e9b5a',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5ffalledge',['kCTIMER_Capture_FallEdge',['../a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638a18a0af674c980ebbdfd0413dcfa3f3c0',1,'fsl_ctimer.h']]], + ['kctimer_5fcapture_5friseedge',['kCTIMER_Capture_RiseEdge',['../a00013.html#ggac37706bc06bc7590ce1e3d1b4bf73638ac8297b7a4be687e63200fc22be1d2f02',1,'fsl_ctimer.h']]], + ['kctimer_5fexternal_5fmatch_5f0',['kCTIMER_External_Match_0',['../a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29a42b2f4d5cb9a524f87f6626169155207',1,'fsl_ctimer.h']]], + ['kctimer_5fexternal_5fmatch_5f1',['kCTIMER_External_Match_1',['../a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29a90643d7c03749f64e0d20cfcf55a80ed',1,'fsl_ctimer.h']]], + ['kctimer_5fexternal_5fmatch_5f2',['kCTIMER_External_Match_2',['../a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29ab4602750f83eba0e5cebd0f2ed91a3c4',1,'fsl_ctimer.h']]], + ['kctimer_5fexternal_5fmatch_5f3',['kCTIMER_External_Match_3',['../a00013.html#gga09f5eb858c001377062fe0b8a0d5bd29aba7194efe10386e467b082fc0b847031',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch0flag',['kCTIMER_Match0Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60ad76fd4735e0604307b50d2fd12cba3c0',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch0interruptenable',['kCTIMER_Match0InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a05694ae09ff514b7237388b33acaaa99',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch1flag',['kCTIMER_Match1Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a901042ca905603329df3cf1d316a2e53',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch1interruptenable',['kCTIMER_Match1InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a47f020e940359f6f08c5c8171d2942b9',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch2flag',['kCTIMER_Match2Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60af5a6c5ee43a01803e82c26181dedfa97',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch2interruptenable',['kCTIMER_Match2InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2ab15c129ca07d334ae13d77e0646c7287',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch3flag',['kCTIMER_Match3Flag',['../a00013.html#ggae64285eb2e52bf5cc2b723870392ff60a02e58518795f05162313b509a600a3d3',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch3interruptenable',['kCTIMER_Match3InterruptEnable',['../a00013.html#gga0971c614f932bcf55994bf6c92325eb2a1f67c8c1e8039ca326e9f25fabffdd0d',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch_5f0',['kCTIMER_Match_0',['../a00013.html#ggae60f7d34c9e499abba96e5979ee1818dac06fa7bc66bbb978bc14348fc0cb4633',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch_5f1',['kCTIMER_Match_1',['../a00013.html#ggae60f7d34c9e499abba96e5979ee1818da38a7356dba8d8a5a8877e9de9fde2faf',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch_5f2',['kCTIMER_Match_2',['../a00013.html#ggae60f7d34c9e499abba96e5979ee1818da98b35c6f057b201073c8afa4bdce60ed',1,'fsl_ctimer.h']]], + ['kctimer_5fmatch_5f3',['kCTIMER_Match_3',['../a00013.html#ggae60f7d34c9e499abba96e5979ee1818da6acca2e2ccd6cc6d08a3d958e47c80fb',1,'fsl_ctimer.h']]], + ['kctimer_5fmultiplecallback',['kCTIMER_MultipleCallback',['../a00013.html#gga740677adee6ada817bb45ed62607c3c4a38d629ce598178fd96f48660e63ae1e7',1,'fsl_ctimer.h']]], + ['kctimer_5foutput_5fclear',['kCTIMER_Output_Clear',['../a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143ca2086fd6712693ac8f0758553ff7bb3d3',1,'fsl_ctimer.h']]], + ['kctimer_5foutput_5fnoaction',['kCTIMER_Output_NoAction',['../a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143cac387e950c7d8c19c1464dd27e5c7396f',1,'fsl_ctimer.h']]], + ['kctimer_5foutput_5fset',['kCTIMER_Output_Set',['../a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143cae1b0b02fe1e0af81f62fb40ff8339b8f',1,'fsl_ctimer.h']]], + ['kctimer_5foutput_5ftoggle',['kCTIMER_Output_Toggle',['../a00013.html#gga22cef1fc5f8e23a35b6c3a012e3d143ca4ad940f7bea1dbae09b156ec0415f5f2',1,'fsl_ctimer.h']]], + ['kctimer_5fsinglecallback',['kCTIMER_SingleCallback',['../a00013.html#gga740677adee6ada817bb45ed62607c3c4af805d881e4dc37e339a8434c1816f930',1,'fsl_ctimer.h']]], + ['kdac0_5frst_5fn_5fshift_5frstn',['kDAC0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a25d5f742c3cbcf85a4e9c388c5c9e708',1,'fsl_reset.h']]], + ['kdac1_5frst_5fn_5fshift_5frstn',['kDAC1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aba3fb61d22a1e6b912b002bc592b3f1f',1,'fsl_reset.h']]], + ['kdac_5fsettlingtimeis1us',['kDAC_SettlingTimeIs1us',['../a00014.html#gga82eecb700b3afeda8b95a6151d8904fca302776aaf6d8780d9b57e9f910615d6f',1,'fsl_dac.h']]], + ['kdac_5fsettlingtimeis25us',['kDAC_SettlingTimeIs25us',['../a00014.html#gga82eecb700b3afeda8b95a6151d8904fcad460e5e0da52ad16bf771892ebfce1f8',1,'fsl_dac.h']]], + ['kdma_5faddressinterleave0xwidth',['kDMA_AddressInterleave0xWidth',['../a00015.html#ggabc6126af1d45847bc59afa0aa3216b04ad9802a5e2f1df9d748838e6e23e0279b',1,'fsl_dma.h']]], + ['kdma_5faddressinterleave1xwidth',['kDMA_AddressInterleave1xWidth',['../a00015.html#ggabc6126af1d45847bc59afa0aa3216b04a84af12bf3a826e9f4725ae5bb4bbebb8',1,'fsl_dma.h']]], + ['kdma_5faddressinterleave2xwidth',['kDMA_AddressInterleave2xWidth',['../a00015.html#ggabc6126af1d45847bc59afa0aa3216b04ad703190659614263db03cea5d2dfbb6e',1,'fsl_dma.h']]], + ['kdma_5faddressinterleave4xwidth',['kDMA_AddressInterleave4xWidth',['../a00015.html#ggabc6126af1d45847bc59afa0aa3216b04aecf2cec42cd7819983e265710c691888',1,'fsl_dma.h']]], + ['kdma_5fburstsize1',['kDMA_BurstSize1',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eafa3126f29988635183fa3851e1ee1f2d',1,'fsl_dma.h']]], + ['kdma_5fburstsize1024',['kDMA_BurstSize1024',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eaf12e2d1fe9b0fccba12b6cad6bc685b3',1,'fsl_dma.h']]], + ['kdma_5fburstsize128',['kDMA_BurstSize128',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ea3c0044f4c389c21f73b08dbb0b8ef829',1,'fsl_dma.h']]], + ['kdma_5fburstsize16',['kDMA_BurstSize16',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ead6487c57cdb11ae590172c2ff1364ca8',1,'fsl_dma.h']]], + ['kdma_5fburstsize2',['kDMA_BurstSize2',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ea3144a4ab7b2408051fc06ab07b583eab',1,'fsl_dma.h']]], + ['kdma_5fburstsize256',['kDMA_BurstSize256',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eac03b658552cde955b815365386e40a70',1,'fsl_dma.h']]], + ['kdma_5fburstsize32',['kDMA_BurstSize32',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eae05054c8a11020169733c22349aa158e',1,'fsl_dma.h']]], + ['kdma_5fburstsize4',['kDMA_BurstSize4',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eac5b15e2705b1295a56557036487d291b',1,'fsl_dma.h']]], + ['kdma_5fburstsize512',['kDMA_BurstSize512',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ea491cc51131bb7e9dcd647e54ec8549e7',1,'fsl_dma.h']]], + ['kdma_5fburstsize64',['kDMA_BurstSize64',['../a00015.html#gga61dadd085c1777f559549e05962b2c9eacb974685c9968ac9dbf74035ecf23bb6',1,'fsl_dma.h']]], + ['kdma_5fburstsize8',['kDMA_BurstSize8',['../a00015.html#gga61dadd085c1777f559549e05962b2c9ea7aacfca8b6c86bdd0e727b0c8ae046b1',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority0',['kDMA_ChannelPriority0',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fafaf9bf976bb9d2db3bd2f629cd545f45',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority1',['kDMA_ChannelPriority1',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fa6ff9161839b0b5e675b01353a684a63f',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority2',['kDMA_ChannelPriority2',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fa259e4e6cf7b6b79608abbe1769e262fe',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority3',['kDMA_ChannelPriority3',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fa8615d84237aa24c16fdc1675cc932efb',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority4',['kDMA_ChannelPriority4',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fae7f6c72a518bc4c68b3be696da1a872d',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority5',['kDMA_ChannelPriority5',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77fa08b83d1381be3c10688f449c9bf90fc4',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority6',['kDMA_ChannelPriority6',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77facc5b892b2bcf8a632acb64e9c5645273',1,'fsl_dma.h']]], + ['kdma_5fchannelpriority7',['kDMA_ChannelPriority7',['../a00015.html#gga63f28310491d665df0ad9a99dc22a77faf238cfde678fdbd26a054fc055f40a4d',1,'fsl_dma.h']]], + ['kdma_5fdstwrap',['kDMA_DstWrap',['../a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82afaae8afb83546031e25b0ac5e6494f2b',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer1',['kDMA_EdgeBurstTransfer1',['../a00015.html#gga776b1091528ddc2571284f481ddde830af06ebd49d4066394642c80ece815d55b',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer1024',['kDMA_EdgeBurstTransfer1024',['../a00015.html#gga776b1091528ddc2571284f481ddde830a6aae117efdce18b2c054ddae971559da',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer128',['kDMA_EdgeBurstTransfer128',['../a00015.html#gga776b1091528ddc2571284f481ddde830af2c60c5f0dcbd8bd7d782a7c08c87f0b',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer16',['kDMA_EdgeBurstTransfer16',['../a00015.html#gga776b1091528ddc2571284f481ddde830a0641c94c5e494890f587f3cb60ed7800',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer2',['kDMA_EdgeBurstTransfer2',['../a00015.html#gga776b1091528ddc2571284f481ddde830af0ab73a40234a51b14203e7d83621ac9',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer256',['kDMA_EdgeBurstTransfer256',['../a00015.html#gga776b1091528ddc2571284f481ddde830a8640003c589e5d3ffd94d4cd962b8456',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer32',['kDMA_EdgeBurstTransfer32',['../a00015.html#gga776b1091528ddc2571284f481ddde830af1764eeb6c94e0e1f86529bf6210c524',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer4',['kDMA_EdgeBurstTransfer4',['../a00015.html#gga776b1091528ddc2571284f481ddde830a42eb0fe4fd6b2030e64b5d0173c93c68',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer512',['kDMA_EdgeBurstTransfer512',['../a00015.html#gga776b1091528ddc2571284f481ddde830a0ef881d258e59978faca416630fb1a74',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer64',['kDMA_EdgeBurstTransfer64',['../a00015.html#gga776b1091528ddc2571284f481ddde830a8dec3f95cf71d668439e065b17f27235',1,'fsl_dma.h']]], + ['kdma_5fedgebursttransfer8',['kDMA_EdgeBurstTransfer8',['../a00015.html#gga776b1091528ddc2571284f481ddde830a4858703ddbc176a60c3015f23a490e17',1,'fsl_dma.h']]], + ['kdma_5ffallingedgetrigger',['kDMA_FallingEdgeTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427a9b9f27849a8e3cf715e30a29b4ba1d04',1,'fsl_dma.h']]], + ['kdma_5fhighleveltrigger',['kDMA_HighLevelTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427a4636793fc071ed9f8e753e84a6e12f85',1,'fsl_dma.h']]], + ['kdma_5finta',['kDMA_IntA',['../a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11ab39861058eb1c9573babd0752286ea48',1,'fsl_dma.h']]], + ['kdma_5fintb',['kDMA_IntB',['../a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11a50cabcc60fb8dc805c62070318fe0c97',1,'fsl_dma.h']]], + ['kdma_5finterror',['kDMA_IntError',['../a00015.html#gga5658ee3bb7fbf1da24d997d9bc341e11a28e17f00c59b3dde88943be07a8902bd',1,'fsl_dma.h']]], + ['kdma_5flevelbursttransfer',['kDMA_LevelBurstTransfer',['../a00015.html#gga776b1091528ddc2571284f481ddde830aa6cc38822f852f1ddd1f22c5b79949b8',1,'fsl_dma.h']]], + ['kdma_5flowleveltrigger',['kDMA_LowLevelTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427aca6b545d2f8661404c932a70b8a5abcf',1,'fsl_dma.h']]], + ['kdma_5fmemorytomemory',['kDMA_MemoryToMemory',['../a00015.html#gga9cb7087af6efc80106c1033f80d60219a24392a93deeb55e04559201839343f3c',1,'fsl_dma.h']]], + ['kdma_5fmemorytoperipheral',['kDMA_MemoryToPeripheral',['../a00015.html#gga9cb7087af6efc80106c1033f80d60219aae1c6bab576d7a25d2fa1249f9cd4ee9',1,'fsl_dma.h']]], + ['kdma_5fnotrigger',['kDMA_NoTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427ae45693316c3b50f21a0fa93e539e9ae5',1,'fsl_dma.h']]], + ['kdma_5fnowrap',['kDMA_NoWrap',['../a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82a99b1a9eb98902b9277c2ae64f48e5a88',1,'fsl_dma.h']]], + ['kdma_5fperipheraltomemory',['kDMA_PeripheralToMemory',['../a00015.html#gga9cb7087af6efc80106c1033f80d60219a7bf1938ae68b1f494aade7a0f4189303',1,'fsl_dma.h']]], + ['kdma_5frisingedgetrigger',['kDMA_RisingEdgeTrigger',['../a00015.html#gga0468cf171e413581e9bba9803df91427aa4d1b3c95a9ca3d756d2f68a3bb0afc8',1,'fsl_dma.h']]], + ['kdma_5frst_5fn_5fshift_5frstn',['kDMA_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a8dbbba3532e3e597133ebc8a55bdd1e7',1,'fsl_reset.h']]], + ['kdma_5fsingletransfer',['kDMA_SingleTransfer',['../a00015.html#gga776b1091528ddc2571284f481ddde830aa5f7edec7506a38b3b57d04dd774b0b0',1,'fsl_dma.h']]], + ['kdma_5fsrcanddstwrap',['kDMA_SrcAndDstWrap',['../a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82a543352fa3896623517af17829598eb0c',1,'fsl_dma.h']]], + ['kdma_5fsrcwrap',['kDMA_SrcWrap',['../a00015.html#ggacea88ecaac2447ba3c9f2157e40b9a82ac0ab79249ad0e6bf887498d0f3e3db90',1,'fsl_dma.h']]], + ['kdma_5fstatictostatic',['kDMA_StaticToStatic',['../a00015.html#gga9cb7087af6efc80106c1033f80d60219af59909afb24e786824cfecdb6afd0da8',1,'fsl_dma.h']]], + ['kdma_5ftransfer16bitwidth',['kDMA_Transfer16BitWidth',['../a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca5b38513482d6d6d92927898f9e2c7703',1,'fsl_dma.h']]], + ['kdma_5ftransfer32bitwidth',['kDMA_Transfer32BitWidth',['../a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca1a43c564953a0e097907e45cd159c265',1,'fsl_dma.h']]], + ['kdma_5ftransfer8bitwidth',['kDMA_Transfer8BitWidth',['../a00015.html#ggadc29c2ff13d900c2f185ee95427fb06ca80c88f3fbb3bb2946149c0ec7a7e922a',1,'fsl_dma.h']]], + ['kext_5fclk_5ffrom_5fclkin',['kEXT_Clk_From_ClkIn',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a22fcfa5a6ecb31823d0019891a10e825',1,'fsl_clock.h']]], + ['kext_5fclk_5ffrom_5fsysosc',['kEXT_Clk_From_SysOsc',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a2e3cfcd9f9e0255bee678609d2a03459',1,'fsl_clock.h']]], + ['kflash_5fiap_5fthreesystemclocktime',['kFlash_IAP_ThreeSystemClockTime',['../a00088.html#gga0efb897bafe816a8a87d92045a78ee9ba14466fd6ca33233907a499072ed0ea04',1,'fsl_iap.h']]], + ['kflash_5fiap_5ftwosystemclocktime',['kFlash_IAP_TwoSystemClockTime',['../a00088.html#gga0efb897bafe816a8a87d92045a78ee9ba0576e02942748ad3a4b1bb0904267ad4',1,'fsl_iap.h']]], + ['kflash_5frst_5fn_5fshift_5frstn',['kFLASH_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac1601058bee0888d89675b528432a496',1,'fsl_reset.h']]], + ['kfrg0_5fclk_5ffrom_5ffro',['kFRG0_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58afa871e16cf926d8a08dce1a52f418066',1,'fsl_clock.h']]], + ['kfrg0_5fclk_5ffrom_5fmainclk',['kFRG0_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a1fe8170ca9a5fcee3e0b3fa1453eb481',1,'fsl_clock.h']]], + ['kfrg0_5fclk_5ffrom_5fsyspll',['kFRG0_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad5a8e9d24a93e8c571f87c60a42c7b4b',1,'fsl_clock.h']]], + ['kfrg0_5frst_5fn_5fshift_5frstn',['kFRG0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a7a5b1b185218feb35ce91ce8f77b2106',1,'fsl_reset.h']]], + ['kfrg1_5fclk_5ffrom_5ffro',['kFRG1_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad5e83713fbdfcd0d5d67b6e679676874',1,'fsl_clock.h']]], + ['kfrg1_5fclk_5ffrom_5fmainclk',['kFRG1_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a63e60987f0efbabef20f4a0fcc6f4007',1,'fsl_clock.h']]], + ['kfrg1_5fclk_5ffrom_5fsyspll',['kFRG1_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad06dfa176e453cfc40aa6b999e68b34c',1,'fsl_clock.h']]], + ['kfrg1_5frst_5fn_5fshift_5frstn',['kFRG1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a78cd776910006a5d8724f628b5c8a0a5',1,'fsl_reset.h']]], + ['kgpio0_5frst_5fn_5fshift_5frstn',['kGPIO0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a244e5cce727a529563a83a1a78f8b3f1',1,'fsl_reset.h']]], + ['kgpio1_5frst_5fn_5fshift_5frstn',['kGPIO1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac11437bc3b54618d863748e13b09ea3e',1,'fsl_reset.h']]], + ['kgpio_5fdigitalinput',['kGPIO_DigitalInput',['../a00016.html#ggada41ca0a2ce239fe125ee96833e715c0abacf19933be1940ab40c83535e6a46d4',1,'fsl_gpio.h']]], + ['kgpio_5fdigitaloutput',['kGPIO_DigitalOutput',['../a00016.html#ggada41ca0a2ce239fe125ee96833e715c0a509ebcd228fc813cf4afcacd258680f9',1,'fsl_gpio.h']]], + ['kgpioint_5frst_5fn_5fshift_5frstn',['kGPIOINT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a20fd1ac8739a143dddb40a6349a758a6',1,'fsl_reset.h']]], + ['ki2c0_5fclk_5ffrom_5ffrg0clk',['kI2C0_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a92f67286aebd8e0fde633cf4b3bd8b57',1,'fsl_clock.h']]], + ['ki2c0_5fclk_5ffrom_5ffrg1clk',['kI2C0_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58abc4f63896a33dac1ef8825e1fe86488b',1,'fsl_clock.h']]], + ['ki2c0_5fclk_5ffrom_5ffro',['kI2C0_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ab8065d6f5e9b16e9410feccef7f1c10b',1,'fsl_clock.h']]], + ['ki2c0_5fclk_5ffrom_5ffro_5fdiv',['kI2C0_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a9fe34f41e6cfa3cd3a0ef15ba9184bb1',1,'fsl_clock.h']]], + ['ki2c0_5fclk_5ffrom_5fmainclk',['kI2C0_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ab434281b6471a116a444172bf8a7bf91',1,'fsl_clock.h']]], + ['ki2c0_5frst_5fn_5fshift_5frstn',['kI2C0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aee6d4f65797043b10be7d4a7ae95d206',1,'fsl_reset.h']]], + ['ki2c1_5fclk_5ffrom_5ffrg0clk',['kI2C1_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ac891ded4c265bfab790d733acbacb753',1,'fsl_clock.h']]], + ['ki2c1_5fclk_5ffrom_5ffrg1clk',['kI2C1_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a6a83c84726acb80554e10c8c3758e071',1,'fsl_clock.h']]], + ['ki2c1_5fclk_5ffrom_5ffro',['kI2C1_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ae19e4e49559079c2f95f998c37029642',1,'fsl_clock.h']]], + ['ki2c1_5fclk_5ffrom_5ffro_5fdiv',['kI2C1_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a8670e7d6a9f2afb045fbf54dc13c4bb2',1,'fsl_clock.h']]], + ['ki2c1_5fclk_5ffrom_5fmainclk',['kI2C1_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a5cff4ddf26d639e435ce79fe5e83d866',1,'fsl_clock.h']]], + ['ki2c1_5frst_5fn_5fshift_5frstn',['kI2C1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ad1ef18ed84027fdc4d41567ae894ea10',1,'fsl_reset.h']]], + ['ki2c2_5fclk_5ffrom_5ffrg0clk',['kI2C2_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a56958ea244b66882f17bd6bdad0e8b8f',1,'fsl_clock.h']]], + ['ki2c2_5fclk_5ffrom_5ffrg1clk',['kI2C2_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a84c08938ba9d92701ad3d29267565309',1,'fsl_clock.h']]], + ['ki2c2_5fclk_5ffrom_5ffro',['kI2C2_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58aad11950d648756bba92e741b9c6b4cd0',1,'fsl_clock.h']]], + ['ki2c2_5fclk_5ffrom_5ffro_5fdiv',['kI2C2_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a11296d1ee4ea06d70c91789f988c8a43',1,'fsl_clock.h']]], + ['ki2c2_5fclk_5ffrom_5fmainclk',['kI2C2_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a6d4885caf9110a788abb71f9c482141c',1,'fsl_clock.h']]], + ['ki2c2_5frst_5fn_5fshift_5frstn',['kI2C2_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a69e2004fad90b83501ee061e1eb7c85d',1,'fsl_reset.h']]], + ['ki2c3_5fclk_5ffrom_5ffrg0clk',['kI2C3_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a3013697f548b1926d8c79f052a43c250',1,'fsl_clock.h']]], + ['ki2c3_5fclk_5ffrom_5ffrg1clk',['kI2C3_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af596a7a7c2e36598e14144cc13eb0733',1,'fsl_clock.h']]], + ['ki2c3_5fclk_5ffrom_5ffro',['kI2C3_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a80a728627fb060445729c7fcb12cd1b8',1,'fsl_clock.h']]], + ['ki2c3_5fclk_5ffrom_5ffro_5fdiv',['kI2C3_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ab78b4e89fcd4147c3143fee94034a356',1,'fsl_clock.h']]], + ['ki2c3_5fclk_5ffrom_5fmainclk',['kI2C3_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a8f752fd4f9b1ebce048719fbc9d1962b',1,'fsl_clock.h']]], + ['ki2c3_5frst_5fn_5fshift_5frstn',['kI2C3_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a97ee4a7923c967d1c356c0f135c465c2',1,'fsl_reset.h']]], + ['ki2c_5fmasterarbitrationlostflag',['kI2C_MasterArbitrationLostFlag',['../a00017.html#ggac938392418ba1a891983d11ef5c9f2a3a7b487779b58af99a7a8c179545f78ccd',1,'fsl_i2c.h']]], + ['ki2c_5fmasterpendingflag',['kI2C_MasterPendingFlag',['../a00017.html#ggac938392418ba1a891983d11ef5c9f2a3a9cc49a1ca21e87058a7fbf733cce0e62',1,'fsl_i2c.h']]], + ['ki2c_5fmasterstartstoperrorflag',['kI2C_MasterStartStopErrorFlag',['../a00017.html#ggac938392418ba1a891983d11ef5c9f2a3ab5cec1d9be7dc5fb2c106e2b87889517',1,'fsl_i2c.h']]], + ['ki2c_5fqualmodeextend',['kI2C_QualModeExtend',['../a00018.html#gga719dc02b99647eb8f08a05d4d6066c51a6b755a1d30a626380730ce947d09335f',1,'fsl_i2c.h']]], + ['ki2c_5fqualmodemask',['kI2C_QualModeMask',['../a00018.html#gga719dc02b99647eb8f08a05d4d6066c51af542f0269c83549e7b492911e281a902',1,'fsl_i2c.h']]], + ['ki2c_5fread',['kI2C_Read',['../a00017.html#ggab49c827b45635206f06e5737606e4611a3a7bb24dc8d1c1be8925603eeafe9b30',1,'fsl_i2c.h']]], + ['ki2c_5fsavedeselected',['kI2C_SaveDeselected',['../a00018.html#gga419f2fc2e0684671c00ee97e962bbe0cad834aafd823863602d905d4b3d8c9430',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressmatchevent',['kI2C_SlaveAddressMatchEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4acacb1ae174dd6798a6fd79800a9e39a3c6',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressregister0',['kI2C_SlaveAddressRegister0',['../a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a39e0e158674bd8a6e254a6a42b5ce50f',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressregister1',['kI2C_SlaveAddressRegister1',['../a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a42a589b5e31f29ddc41088c3fb4bfcf1',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressregister2',['kI2C_SlaveAddressRegister2',['../a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a8381dd229f545df5e6a32ee5f0aac871',1,'fsl_i2c.h']]], + ['ki2c_5fslaveaddressregister3',['kI2C_SlaveAddressRegister3',['../a00018.html#gga833a7311515f1a3bf5cb8da2355cc661a9e73a2b09fe3943d51849a7d87fbe8a3',1,'fsl_i2c.h']]], + ['ki2c_5fslaveallevents',['kI2C_SlaveAllEvents',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca94b030ebdac378a84961893ae567bfbc',1,'fsl_i2c.h']]], + ['ki2c_5fslavecompletionevent',['kI2C_SlaveCompletionEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca38cca3cd668e73f51b8e574835d419df',1,'fsl_i2c.h']]], + ['ki2c_5fslavedeselectedevent',['kI2C_SlaveDeselectedEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca5e765c1c316a51908b68f1f32a7b524d',1,'fsl_i2c.h']]], + ['ki2c_5fslavenotstretching',['kI2C_SlaveNotStretching',['../a00018.html#gga419f2fc2e0684671c00ee97e962bbe0caf7ad09504bcf02f9c1177431ee44562e',1,'fsl_i2c.h']]], + ['ki2c_5fslavependingflag',['kI2C_SlavePendingFlag',['../a00018.html#gga419f2fc2e0684671c00ee97e962bbe0cabd274f2defb8f0f8d2f6c2fcdd71c63c',1,'fsl_i2c.h']]], + ['ki2c_5fslavereceiveevent',['kI2C_SlaveReceiveEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4acaac8593e808a8137d1b5d3a51640779de',1,'fsl_i2c.h']]], + ['ki2c_5fslaveselected',['kI2C_SlaveSelected',['../a00018.html#gga419f2fc2e0684671c00ee97e962bbe0ca2d0c7dc4bf2815768510b916b7c1d54e',1,'fsl_i2c.h']]], + ['ki2c_5fslavetransmitevent',['kI2C_SlaveTransmitEvent',['../a00018.html#ggac53e5c96a2eed1b5a95b7d84be48f4aca2f85039a57379838909876a1d509b7aa',1,'fsl_i2c.h']]], + ['ki2c_5ftransferdefaultflag',['kI2C_TransferDefaultFlag',['../a00017.html#gga87ea07668194cfb46c7c368d2cb42433ae80f7b768b1621e42ac965d3d23de5e2',1,'fsl_i2c.h']]], + ['ki2c_5ftransfernostartflag',['kI2C_TransferNoStartFlag',['../a00017.html#gga87ea07668194cfb46c7c368d2cb42433a5cb44bf860c0482c0ca0165cf0d31d8a',1,'fsl_i2c.h']]], + ['ki2c_5ftransfernostopflag',['kI2C_TransferNoStopFlag',['../a00017.html#gga87ea07668194cfb46c7c368d2cb42433afb8aeea71b5b7475e3d3df86220db566',1,'fsl_i2c.h']]], + ['ki2c_5ftransferrepeatedstartflag',['kI2C_TransferRepeatedStartFlag',['../a00017.html#gga87ea07668194cfb46c7c368d2cb42433aadf112471ef12f194985a093cd9b9721',1,'fsl_i2c.h']]], + ['ki2c_5fwrite',['kI2C_Write',['../a00017.html#ggab49c827b45635206f06e5737606e4611a93b476b469c2a4bfed5916b458ae9bb0',1,'fsl_i2c.h']]], + ['kiapcmd_5fiap_5fblankchecksector',['kIapCmd_IAP_BlankCheckSector',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa9b439af9906d00c0f5a83e5c878c2e50',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fcompare',['kIapCmd_IAP_Compare',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caabda85aeb932e76c81db46f45a8c6f656',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fcopyramtoflash',['kIapCmd_IAP_CopyRamToFlash',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3fa0f400c5389e777ba1f8d6acb27d72',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5ferasepage',['kIapCmd_IAP_ErasePage',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae674c1ed0ecf4b2851aefc44261004bc',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5ferasesector',['kIapCmd_IAP_EraseSector',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa6c51c9bed9f8973d47f7b73e3592b2aa',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fextendedreadsignature',['kIapCmd_IAP_ExtendedReadSignature',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa198048f7f05d882a431c4ea4c904174e',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fpreparesectorforwrite',['kIapCmd_IAP_PrepareSectorforWrite',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa5ccbc970e59fd2f3ea432bf5c00fea7e',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fread_5fbootromversion',['kIapCmd_IAP_Read_BootromVersion',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caab7decacdc717da7752b3a4637a228278',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freadfactorysettings',['kIapCmd_IAP_ReadFactorySettings',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae8bcbc2ebc5c99fd75de395e3d18b021',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freadfaimpage',['kIapCmd_IAP_ReadFAIMPage',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3556cf54991582784cca44e4604113cc',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freadpartid',['kIapCmd_IAP_ReadPartId',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa0f88b3ef422116327baca297944ca597',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freadsignature',['kIapCmd_IAP_ReadSignature',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa3891f9959d7cdcc9b6ad7e00816b2fc8',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freaduid',['kIapCmd_IAP_ReadUid',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caae3058d7cb02b689b3993fae3c913e0f0',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5freinvokeisp',['kIapCmd_IAP_ReinvokeISP',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caaf09dfcba592f2a1e02727d9eeebee15d',1,'fsl_iap.h']]], + ['kiapcmd_5fiap_5fwritefaimpage',['kIapCmd_IAP_WriteFAIMPage',['../a00088.html#ggaae3267ca6081e1f5620b0aa674c5e8caa6ef0ad89e49b23cb3fc4b046013a5332',1,'fsl_iap.h']]], + ['kinputmux_5fdebughaltedtosct0',['kINPUTMUX_DebugHaltedToSct0',['../a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163ba1e042af47b407b5b414e22bab7f3e87d',1,'fsl_inputmux_connections.h']]], + ['kinputmux_5fdmachannel0trigouttotriginchannels',['kINPUTMUX_DmaChannel0TrigoutToTriginChannels',['../a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163baa76de68415d27dc96db87292ea596e47',1,'fsl_inputmux_connections.h']]], + ['kinputmux_5fdmachannel24trigouttotriginchannels',['kINPUTMUX_DmaChannel24TrigoutToTriginChannels',['../a00089.html#gga7ac6f6ac5dd2b621eabb60d2ab48163baa405e10591d83ca35d931b53cbe7478b',1,'fsl_inputmux_connections.h']]], + ['kiocon_5frst_5fn_5fshift_5frstn',['kIOCON_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ab95a1dd8a7fbc479365344d58ac55737',1,'fsl_reset.h']]], + ['kmrt_5fchannel_5f0',['kMRT_Channel_0',['../a00020.html#ggaece5c1972e35dec2efcce98847a09622a27e83d437e2798b19c59c2af4d99e1dc',1,'fsl_mrt.h']]], + ['kmrt_5fchannel_5f1',['kMRT_Channel_1',['../a00020.html#ggaece5c1972e35dec2efcce98847a09622a44b7807f36fe0a21240e721d46d8f9d7',1,'fsl_mrt.h']]], + ['kmrt_5fchannel_5f2',['kMRT_Channel_2',['../a00020.html#ggaece5c1972e35dec2efcce98847a09622a17597fb66d9b1d3e97b318db79267f52',1,'fsl_mrt.h']]], + ['kmrt_5fchannel_5f3',['kMRT_Channel_3',['../a00020.html#ggaece5c1972e35dec2efcce98847a09622af57e6e009258a71bc3a2890aedff34b3',1,'fsl_mrt.h']]], + ['kmrt_5foneshotmode',['kMRT_OneShotMode',['../a00020.html#ggad481f648f1c89a1eab327530d6fef1d0abe4ba0a30bc09f1921a0504eb826b3dc',1,'fsl_mrt.h']]], + ['kmrt_5foneshotstallmode',['kMRT_OneShotStallMode',['../a00020.html#ggad481f648f1c89a1eab327530d6fef1d0add9f55173bb54f623c955c29c22dd5b2',1,'fsl_mrt.h']]], + ['kmrt_5frepeatmode',['kMRT_RepeatMode',['../a00020.html#ggad481f648f1c89a1eab327530d6fef1d0a6b415c060dc09ed293ec3dda829cb257',1,'fsl_mrt.h']]], + ['kmrt_5frst_5fn_5fshift_5frstn',['kMRT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a81a00b3196e6197af1ca45b8a5bac450',1,'fsl_reset.h']]], + ['kmrt_5ftimerinterruptenable',['kMRT_TimerInterruptEnable',['../a00020.html#gga9d2f90ae2c6f99410e2908dac8cc6943a2a5e8ee568da2c888093b732f2157ea5',1,'fsl_mrt.h']]], + ['kmrt_5ftimerinterruptflag',['kMRT_TimerInterruptFlag',['../a00020.html#gga0bb94508d8cf924c3a6971364377673aa6942598faf3aef148a850f8850cf01c3',1,'fsl_mrt.h']]], + ['kmrt_5ftimerrunflag',['kMRT_TimerRunFlag',['../a00020.html#gga0bb94508d8cf924c3a6971364377673aa745c62687191197b48b35dbd1aac40db',1,'fsl_mrt.h']]], + ['kpint_5fpatternmatchalways',['kPINT_PatternMatchAlways',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa128703d2c2175a315aaffad869ed6a32',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbothedges',['kPINT_PatternMatchBothEdges',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aaac967156901735a43316f7f1c4720328',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice0',['kPINT_PatternMatchBSlice0',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba106986aeb5e12c2b76e070def3b37d95',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice1',['kPINT_PatternMatchBSlice1',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba0d3bf0a5022325acaae66e172c984db0',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice2',['kPINT_PatternMatchBSlice2',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9baf00e092237b1b299bdfdd901f207c468',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice3',['kPINT_PatternMatchBSlice3',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9bae5db81838d55c8a8839b1dd47954d865',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice4',['kPINT_PatternMatchBSlice4',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9bac0ce3f2fbc216bc3cec68c47263530c5',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice5',['kPINT_PatternMatchBSlice5',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba1ca87ca7db6ec59b675c6e70abc45da0',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice6',['kPINT_PatternMatchBSlice6',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba86a79a77b44e91f432bb8ee9070f9602',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchbslice7',['kPINT_PatternMatchBSlice7',['../a00094.html#gga048bc24e58d7df40af2a45efaabeea9ba3a75ed56ef8a3429c01fc686f22b8e8a',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchhigh',['kPINT_PatternMatchHigh',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa7dc0770cf7ffe184788c30bd1ac9c515',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp0src',['kPINT_PatternMatchInp0Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a51f543e6f680df9beb5841231b7b3a96',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp1src',['kPINT_PatternMatchInp1Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a6fc5c9dbee30b375feb9ce6c86b224c2',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp2src',['kPINT_PatternMatchInp2Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a41b057b493937cd87bc212cb2e316f8a',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp3src',['kPINT_PatternMatchInp3Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a6be4432cb9e687d043a2c25c1af48869',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp4src',['kPINT_PatternMatchInp4Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76aabc93fc28498f5577939f38e0513304c',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp5src',['kPINT_PatternMatchInp5Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a78ff6e40ab17d81181284c56b62b77aa',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp6src',['kPINT_PatternMatchInp6Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a9b2f5abc74e498a599f5c005a6cc911f',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchinp7src',['kPINT_PatternMatchInp7Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a2c93115b816dc676460cfc1be85778f0',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchlow',['kPINT_PatternMatchLow',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa3b4af984526871b66489b0eb294d2df5',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchnever',['kPINT_PatternMatchNever',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aab5630ebfbc6e52c9b04f659918c094f2',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchstickybothedges',['kPINT_PatternMatchStickyBothEdges',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa059c3472509304186252b655cf486d8b',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchstickyfall',['kPINT_PatternMatchStickyFall',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa9d2a3e9717c34de3a884b695f35a6c37',1,'fsl_pint.h']]], + ['kpint_5fpatternmatchstickyrise',['kPINT_PatternMatchStickyRise',['../a00094.html#ggae1e5bfc17515fab76a1deab955203c6aa654c70eeed38b0be2271dc51d7cc04f5',1,'fsl_pint.h']]], + ['kpint_5fpinint0',['kPINT_PinInt0',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a5df52c4fbb437e61b638d35cbc550162',1,'fsl_pint.h']]], + ['kpint_5fpinint1',['kPINT_PinInt1',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8ab62e1c2d3cdccef05e45ae9028cecbb4',1,'fsl_pint.h']]], + ['kpint_5fpinint2',['kPINT_PinInt2',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a81913bc912b5164bb749b6a2e8823808',1,'fsl_pint.h']]], + ['kpint_5fpinint3',['kPINT_PinInt3',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a751ce5a16f196ca04d08d2e5d65af47c',1,'fsl_pint.h']]], + ['kpint_5fpinint4',['kPINT_PinInt4',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8acf173e0dc3d44c77bb08146494a0249b',1,'fsl_pint.h']]], + ['kpint_5fpinint5',['kPINT_PinInt5',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8a45fc443b2ec03c89708ac897fc3fc902',1,'fsl_pint.h']]], + ['kpint_5fpinint6',['kPINT_PinInt6',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8adf92ec20d1fa6a12bda6c42e5304cf46',1,'fsl_pint.h']]], + ['kpint_5fpinint7',['kPINT_PinInt7',['../a00094.html#gga15da1f70e8d0a05e9d492d01ceca7da8aae1e0da9add6e3e1dd57705a682d65fa',1,'fsl_pint.h']]], + ['kpint_5fpinintenablebothedges',['kPINT_PinIntEnableBothEdges',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a58ac8e76b409274b7d02ef6e9805dcef',1,'fsl_pint.h']]], + ['kpint_5fpinintenablefalledge',['kPINT_PinIntEnableFallEdge',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a6f54d55ac52e8e697f83637109560e89',1,'fsl_pint.h']]], + ['kpint_5fpinintenablehighlevel',['kPINT_PinIntEnableHighLevel',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91affc9b2756b7642ddb60ea78f4bbbd592',1,'fsl_pint.h']]], + ['kpint_5fpinintenablelowlevel',['kPINT_PinIntEnableLowLevel',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91a3bd6a570eee5c1fddd95ef2411b35a7e',1,'fsl_pint.h']]], + ['kpint_5fpinintenablenone',['kPINT_PinIntEnableNone',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91aa48de84b39b48759086f2d7ae0c8091e',1,'fsl_pint.h']]], + ['kpint_5fpinintenableriseedge',['kPINT_PinIntEnableRiseEdge',['../a00094.html#gga6a17e5c52721f6eb754f54cc72b58c91ae873d30aec2ca54de88c69f55ea42a07',1,'fsl_pint.h']]], + ['kpint_5fsecpatternmatchinp0src',['kPINT_SecPatternMatchInp0Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a1f7f561990336a81a46f22395820907d',1,'fsl_pint.h']]], + ['kpint_5fsecpatternmatchinp1src',['kPINT_SecPatternMatchInp1Src',['../a00094.html#gga2e05f827d6a43eade4c22e9d75bc5d76a8cc05c9aec163085b7a2b4481fdc971d',1,'fsl_pint.h']]], + ['kpmu_5fgenreg0',['kPmu_GenReg0',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492a80dcccd621286706e1c8a4ebe9c10f0a',1,'fsl_power.h']]], + ['kpmu_5fgenreg1',['kPmu_GenReg1',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492a740c74b8de11afea3adf94099430d43f',1,'fsl_power.h']]], + ['kpmu_5fgenreg2',['kPmu_GenReg2',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492ad0fed29c216cb44973a5720f27c25b57',1,'fsl_power.h']]], + ['kpmu_5fgenreg3',['kPmu_GenReg3',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492a8464e8acd4980abf527cdc08a1039f03',1,'fsl_power.h']]], + ['kpmu_5fgenreg4',['kPmu_GenReg4',['../a00085.html#ggaacea8a22b7f4706814e61973550d3492ad41dcf0263e8b148f96f850b2be396ac',1,'fsl_power.h']]], + ['ksct_5fclk_5ffrom_5ffro',['kSCT_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a45061bbb0d60c123b9cf999ce58c24f0',1,'fsl_clock.h']]], + ['ksct_5fclk_5ffrom_5fmainclk',['kSCT_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a9f985237f28fdfa44b6a856c3e2f4dab',1,'fsl_clock.h']]], + ['ksct_5fclk_5ffrom_5fsyspll',['kSCT_Clk_From_SysPll',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad0d4f0ebaf887e6ae96436fa7f0d2f15',1,'fsl_clock.h']]], + ['ksct_5frst_5fn_5fshift_5frstn',['kSCT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a5a074c4e48569dce7baacbae585541fc',1,'fsl_reset.h']]], + ['ksctimer_5factiveincountdown',['kSCTIMER_ActiveInCountDown',['../a00021.html#ggadc0dc8518742a3345ea042eae821dc85a6a33db1b011c4dcf63bcc2759dd1c474',1,'fsl_sctimer.h']]], + ['ksctimer_5factiveincountup',['kSCTIMER_ActiveInCountUp',['../a00021.html#ggadc0dc8518742a3345ea042eae821dc85a878f4d9e6aa0348da58c4b8807e6eb19',1,'fsl_sctimer.h']]], + ['ksctimer_5factiveindependent',['kSCTIMER_ActiveIndependent',['../a00021.html#ggadc0dc8518742a3345ea042eae821dc85a1ce9766251a3384d8eb28804fd518034',1,'fsl_sctimer.h']]], + ['ksctimer_5fasynchronous_5fclockmode',['kSCTIMER_Asynchronous_ClockMode',['../a00021.html#gga270f5ad1462133d7b88ce71be4913a1da3923db642ad5f6b9aa2f9206b69cc9b5',1,'fsl_sctimer.h']]], + ['ksctimer_5fbuserrorhflag',['kSCTIMER_BusErrorHFlag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a9a5e7b8190bf25a0695f3b3d54c39bee',1,'fsl_sctimer.h']]], + ['ksctimer_5fbuserrorlflag',['kSCTIMER_BusErrorLFlag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a9c4db1ffc833a6eedc6a56a7fee85742',1,'fsl_sctimer.h']]], + ['ksctimer_5fcenteralignedpwm',['kSCTIMER_CenterAlignedPwm',['../a00021.html#gga76b1c419363e09d4861880f25f63979dac28f3ae947c63c4fc3663be7d1f7b4e3',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f0',['kSCTIMER_Clock_On_Fall_Input_0',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a81bb8457aeaaa05c1de014a1092f3682',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f1',['kSCTIMER_Clock_On_Fall_Input_1',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a37959b0234e735a51a76fc94a6ea2838',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f2',['kSCTIMER_Clock_On_Fall_Input_2',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a65d71ef841bb11fc06c4a84cd35fe354',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f3',['kSCTIMER_Clock_On_Fall_Input_3',['../a00021.html#gga82141464913b976a7c2aab50cf17c701ad95c6b5bf373afdaa115ac4d4b33c907',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f4',['kSCTIMER_Clock_On_Fall_Input_4',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a90910b145c4b6be6207e787a33edfe90',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f5',['kSCTIMER_Clock_On_Fall_Input_5',['../a00021.html#gga82141464913b976a7c2aab50cf17c701aef4bb8b33c1f2cbd38d93f3ae8dcf59d',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f6',['kSCTIMER_Clock_On_Fall_Input_6',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a1cac2ebda704fdec8b75b9fa9caf460e',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5ffall_5finput_5f7',['kSCTIMER_Clock_On_Fall_Input_7',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a64d321fa474f3c4f7accbbe3fb48ce97',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f0',['kSCTIMER_Clock_On_Rise_Input_0',['../a00021.html#gga82141464913b976a7c2aab50cf17c701aeac5b3a91a6789ebc29e22a63223e562',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f1',['kSCTIMER_Clock_On_Rise_Input_1',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a14833c030e7be5e1d46d379bee0763e2',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f2',['kSCTIMER_Clock_On_Rise_Input_2',['../a00021.html#gga82141464913b976a7c2aab50cf17c701acfec39ecd9ed389a70c5af0aadd8d245',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f3',['kSCTIMER_Clock_On_Rise_Input_3',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a2d49ffdfaa5c023b81800f9bc7145599',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f4',['kSCTIMER_Clock_On_Rise_Input_4',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a8d5a9b6b6028b4dcd8c6032bebefa468',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f5',['kSCTIMER_Clock_On_Rise_Input_5',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a76459f5f7aeb37929840ac706ccba0c1',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f6',['kSCTIMER_Clock_On_Rise_Input_6',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a22397185b3e3a49c3ab6de5f22b55126',1,'fsl_sctimer.h']]], + ['ksctimer_5fclock_5fon_5frise_5finput_5f7',['kSCTIMER_Clock_On_Rise_Input_7',['../a00021.html#gga82141464913b976a7c2aab50cf17c701a5298152c01e0d4e9def85bbe99ecad83',1,'fsl_sctimer.h']]], + ['ksctimer_5fcounter_5fh',['kSCTIMER_Counter_H',['../a00021.html#gga8df83543fac389c6e3b212d58695f034abac8d502657e6390b3669508a7a7d78b',1,'fsl_sctimer.h']]], + ['ksctimer_5fcounter_5fl',['kSCTIMER_Counter_L',['../a00021.html#gga8df83543fac389c6e3b212d58695f034a2c17be417f1566b1c17ab1cdb972baf8',1,'fsl_sctimer.h']]], + ['ksctimer_5fcounter_5fu',['kSCTIMER_Counter_U',['../a00021.html#gga8df83543fac389c6e3b212d58695f034a80cdf46efb087f2a0141a1fce8b2b542',1,'fsl_sctimer.h']]], + ['ksctimer_5fedgealignedpwm',['kSCTIMER_EdgeAlignedPwm',['../a00021.html#gga76b1c419363e09d4861880f25f63979da539c00805f4706a43e2669dfa7477dd8',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent0flag',['kSCTIMER_Event0Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a23338b52b7a3eb5bf4e0cdf6b854c9f4',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent0interruptenable',['kSCTIMER_Event0InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a7d9204dc6fea5991f442e6a96531055e',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent10flag',['kSCTIMER_Event10Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a99b06fad336b34b1485c6a1a2c634a75',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent10interruptenable',['kSCTIMER_Event10InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a313da28338d9c25f9a5de1e150fdb44e',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent11flag',['kSCTIMER_Event11Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a07c275c4c55dfe959c222b51557aab25',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent11interruptenable',['kSCTIMER_Event11InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a10627d03a81cfa9bb66dc453ecbbb7c3',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent12flag',['kSCTIMER_Event12Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a3deb3b17762b595a399bbc32efbe8753',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent12interruptenable',['kSCTIMER_Event12InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a237e390a2de0d3fa877e3f820718d14e',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent1flag',['kSCTIMER_Event1Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45ad07c79a564df84171acdd2f9acd1ee32',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent1interruptenable',['kSCTIMER_Event1InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a35b278ed11503e27ceda405448d43704',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent2flag',['kSCTIMER_Event2Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a5738f1fc819177c4377068dcf09dd39d',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent2interruptenable',['kSCTIMER_Event2InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a3733720f1b361ee41e5b7d71c7c08974',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent3flag',['kSCTIMER_Event3Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45ad4b1b9a6e2ba1ca55c536407df2802d4',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent3interruptenable',['kSCTIMER_Event3InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a0a98b0964c6e46c490e78f02f3198f07',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent4flag',['kSCTIMER_Event4Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a1034b068f1139df001c04fa1c95b5531',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent4interruptenable',['kSCTIMER_Event4InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a1cbfebe70908eb5e706e627500c2ce8d',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent5flag',['kSCTIMER_Event5Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45ae91e9c2221c6840f6b6d106a796b6eb3',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent5interruptenable',['kSCTIMER_Event5InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a306f7c719eeabe666789bb7d0ed8d175',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent6flag',['kSCTIMER_Event6Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a5a8064efce400813ba04b0a3aca7c2bb',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent6interruptenable',['kSCTIMER_Event6InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986afff05c432d290f058588e7f6372030b1',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent7flag',['kSCTIMER_Event7Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45ac6d970ec7b05b2141b48c9eb09bf23f2',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent7interruptenable',['kSCTIMER_Event7InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a5923446a599ede3c2f5d787683bcaa70',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent8flag',['kSCTIMER_Event8Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a490a6fdf7a05436e8d7958002e5d48b5',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent8interruptenable',['kSCTIMER_Event8InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a0267e2748c8e6c0ae37588d85346af5b',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent9flag',['kSCTIMER_Event9Flag',['../a00021.html#gga9100974cdbb1542385a983b75b2f0d45a19ed3a5f0d87b7c42919ed74ea6630ac',1,'fsl_sctimer.h']]], + ['ksctimer_5fevent9interruptenable',['kSCTIMER_Event9InterruptEnable',['../a00021.html#ggaf1007b13bbe43ea28ee33acdc7f5f986a3617b5ccaab15786e80fb1ff9acbbf94',1,'fsl_sctimer.h']]], + ['ksctimer_5fhightrue',['kSCTIMER_HighTrue',['../a00021.html#gga7d63d84ecccc4074e40c6754a8754065ad16871f918d603d6f919d54760e262e2',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f0',['kSCTIMER_Input_0',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eadd689832261eb7eb862ce1c61bc4e96a',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f1',['kSCTIMER_Input_1',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea427af509d16424c3e38e21c0607300d7',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f2',['kSCTIMER_Input_2',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea9091ff1c081ba955c12f63ec235fa41e',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f3',['kSCTIMER_Input_3',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eac45f2918497b441dc42cb33c99afdcd1',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f4',['kSCTIMER_Input_4',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7eab8df54085f974d38e28ff80ea5ad65d0',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f5',['kSCTIMER_Input_5',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea3ec92530953ea9991a65511e64654d50',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f6',['kSCTIMER_Input_6',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea0598dcf5a25edbcc3f89bfc4f453a162',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5f7',['kSCTIMER_Input_7',['../a00021.html#gga3d2e093dbbecb8a0afc56bda69b8fa7ea2c1d0356e7346f0d3f1a949dc56b7f10',1,'fsl_sctimer.h']]], + ['ksctimer_5finput_5fclockmode',['kSCTIMER_Input_ClockMode',['../a00021.html#gga270f5ad1462133d7b88ce71be4913a1daaedca7a090600aa41fd7f9e6aa756e8f',1,'fsl_sctimer.h']]], + ['ksctimer_5flowtrue',['kSCTIMER_LowTrue',['../a00021.html#gga7d63d84ecccc4074e40c6754a8754065a0c47623cf782903261d17cd642ad9d5e',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f0',['kSCTIMER_Out_0',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148adbdf0a5eebc74a8b01eefcc9b3ee742d',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f1',['kSCTIMER_Out_1',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a9b869b11ddd20543bab111f9f2699e18',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f2',['kSCTIMER_Out_2',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a3a54a6d9baa60d52779a918ed739a8d5',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f3',['kSCTIMER_Out_3',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a1b8265e43a813ba11c8f4661032b2c45',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f4',['kSCTIMER_Out_4',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148aa14ad02f33740bac23837ad10a2188ae',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f5',['kSCTIMER_Out_5',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a03be657454ab843d23408d0d20331511',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f6',['kSCTIMER_Out_6',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148af73ef40ea423cc2cd1314f82914054d9',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f7',['kSCTIMER_Out_7',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148af02eafb670d82545874712b82416c712',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f8',['kSCTIMER_Out_8',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a4834fd8709ba8054330fb42b65962509',1,'fsl_sctimer.h']]], + ['ksctimer_5fout_5f9',['kSCTIMER_Out_9',['../a00021.html#gga2befef3e54e22f0624ddb1b016f10148a1c7af66a2d15e4af71cfd6a8c2ae27a5',1,'fsl_sctimer.h']]], + ['ksctimer_5fresolveclear',['kSCTIMER_ResolveClear',['../a00021.html#gga64666471cadaed6ad2e72ce19026aed8afebc15b93617ff1873bf6bd170fbfe25',1,'fsl_sctimer.h']]], + ['ksctimer_5fresolvenone',['kSCTIMER_ResolveNone',['../a00021.html#gga64666471cadaed6ad2e72ce19026aed8a7e0f6590af780c201400de534fbded84',1,'fsl_sctimer.h']]], + ['ksctimer_5fresolveset',['kSCTIMER_ResolveSet',['../a00021.html#gga64666471cadaed6ad2e72ce19026aed8a53aa676af8b05ec58f3d723ea6b85611',1,'fsl_sctimer.h']]], + ['ksctimer_5fresolvetoggle',['kSCTIMER_ResolveToggle',['../a00021.html#gga64666471cadaed6ad2e72ce19026aed8a66ca25f70e36c4286f63529dc14d19b2',1,'fsl_sctimer.h']]], + ['ksctimer_5fsampled_5fclockmode',['kSCTIMER_Sampled_ClockMode',['../a00021.html#gga270f5ad1462133d7b88ce71be4913a1da182c8930fa55f2c4a7ff7cf27f272ec6',1,'fsl_sctimer.h']]], + ['ksctimer_5fsystem_5fclockmode',['kSCTIMER_System_ClockMode',['../a00021.html#gga270f5ad1462133d7b88ce71be4913a1daa9c40afb4f671696c5122560bd16834b',1,'fsl_sctimer.h']]], + ['kspi0_5fclk_5ffrom_5ffrg0clk',['kSPI0_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a845c271da53362455548e3a2d785e46f',1,'fsl_clock.h']]], + ['kspi0_5fclk_5ffrom_5ffrg1clk',['kSPI0_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a0cd69802e0dca5ea59301801b17d24a6',1,'fsl_clock.h']]], + ['kspi0_5fclk_5ffrom_5ffro',['kSPI0_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a225c7ee90596ed70ba883f4db61aa8a7',1,'fsl_clock.h']]], + ['kspi0_5fclk_5ffrom_5ffro_5fdiv',['kSPI0_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58aad0657c34aef515cd39d693c8a7896b2',1,'fsl_clock.h']]], + ['kspi0_5fclk_5ffrom_5fmainclk',['kSPI0_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ae27646652709428349bea6c7044c070e',1,'fsl_clock.h']]], + ['kspi0_5frst_5fn_5fshift_5frstn',['kSPI0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac5dc2b0f880a50d33e7d79f7af4c4f33',1,'fsl_reset.h']]], + ['kspi1_5fclk_5ffrom_5ffrg0clk',['kSPI1_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a61f8c26921cefcc9988472806478400b',1,'fsl_clock.h']]], + ['kspi1_5fclk_5ffrom_5ffrg1clk',['kSPI1_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58adac12c9424be5e807358f910e834b8fe',1,'fsl_clock.h']]], + ['kspi1_5fclk_5ffrom_5ffro',['kSPI1_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a4153c95a0b0f7e3c4b3090e7b7157815',1,'fsl_clock.h']]], + ['kspi1_5fclk_5ffrom_5ffro_5fdiv',['kSPI1_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58acdb981a51b4fe1d9405a3ddfc34b50b9',1,'fsl_clock.h']]], + ['kspi1_5fclk_5ffrom_5fmainclk',['kSPI1_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a03a2a6a3073f4ae89de347a932695305',1,'fsl_clock.h']]], + ['kspi1_5frst_5fn_5fshift_5frstn',['kSPI1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a3aedfdfb886f77b764c41e155ccb44f6',1,'fsl_reset.h']]], + ['kspi_5fclockphasefirstedge',['kSPI_ClockPhaseFirstEdge',['../a00022.html#gga9ad313685ade497f5cbcb71c74a1b4dcad15d61c6fd642f13101edbf401d0c72e',1,'fsl_spi.h']]], + ['kspi_5fclockphasesecondedge',['kSPI_ClockPhaseSecondEdge',['../a00022.html#gga9ad313685ade497f5cbcb71c74a1b4dca18a98985c1f7dd56175e4a2724db3675',1,'fsl_spi.h']]], + ['kspi_5fclockpolarityactivehigh',['kSPI_ClockPolarityActiveHigh',['../a00022.html#gga3e5a7cd043c9596779bc23b34cb3d1f9a031c0ee2693cf1fd621e8b8cba676629',1,'fsl_spi.h']]], + ['kspi_5fclockpolarityactivelow',['kSPI_ClockPolarityActiveLow',['../a00022.html#gga3e5a7cd043c9596779bc23b34cb3d1f9acfc8257079c9604086622df6de326aea',1,'fsl_spi.h']]], + ['kspi_5fdata10bits',['kSPI_Data10Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a2b2887663c9d025a4137263fc7984024',1,'fsl_spi.h']]], + ['kspi_5fdata11bits',['kSPI_Data11Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a91e908a7a4725ab9df05549a2b034dec',1,'fsl_spi.h']]], + ['kspi_5fdata12bits',['kSPI_Data12Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad1cfe18fd912c0d25dc32e6ca9fa8f97',1,'fsl_spi.h']]], + ['kspi_5fdata13bits',['kSPI_Data13Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad8c2fa2e2f5bf137176dc736cc6a2531',1,'fsl_spi.h']]], + ['kspi_5fdata14bits',['kSPI_Data14Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731ae83435f494d1b9f3ce2f2da0ac03fc38',1,'fsl_spi.h']]], + ['kspi_5fdata15bits',['kSPI_Data15Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731add11012a8887066fad29e23c20d66af8',1,'fsl_spi.h']]], + ['kspi_5fdata16bits',['kSPI_Data16Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731abbc2566ba4eb2b5e5dc259a7c4f80bcf',1,'fsl_spi.h']]], + ['kspi_5fdata4bits',['kSPI_Data4Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a0cb8b30c67c53c6d53712d5bacc818ce',1,'fsl_spi.h']]], + ['kspi_5fdata5bits',['kSPI_Data5Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a7232b4afb5bd82503252ce608638e6eb',1,'fsl_spi.h']]], + ['kspi_5fdata6bits',['kSPI_Data6Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a6604fcf5c8bebf904c5b072295027bba',1,'fsl_spi.h']]], + ['kspi_5fdata7bits',['kSPI_Data7Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a2c62d3d7d92866c97bb513d4e603518e',1,'fsl_spi.h']]], + ['kspi_5fdata8bits',['kSPI_Data8Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731ad6b98474a7f14ae7665b7b6d3355657c',1,'fsl_spi.h']]], + ['kspi_5fdata9bits',['kSPI_Data9Bits',['../a00022.html#ggafa691c5329a7325ee57c9f06fa295731a4b864a74545165c2cf2dd74134fdadd1',1,'fsl_spi.h']]], + ['kspi_5fendofframe',['kSPI_EndOfFrame',['../a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a3bc0d76da8f97613467566dc39bee3b4',1,'fsl_spi.h']]], + ['kspi_5fendoftransfer',['kSPI_EndOfTransfer',['../a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a857a31be854542eafecfea1484ad38b5',1,'fsl_spi.h']]], + ['kspi_5fendtransferflag',['kSPI_EndTransferFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a4f52f3d130ab947331e668c7856d8551',1,'fsl_spi.h']]], + ['kspi_5flsbfirst',['kSPI_LsbFirst',['../a00022.html#ggaa68518c16202382c2e1f1c7c66a9d53da20ac53684c3e1ad338553cecbfab94a9',1,'fsl_spi.h']]], + ['kspi_5fmasteridleflag',['kSPI_MasterIdleFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a03ba57874691d230ad0f657cf01a7978',1,'fsl_spi.h']]], + ['kspi_5fmsbfirst',['kSPI_MsbFirst',['../a00022.html#ggaa68518c16202382c2e1f1c7c66a9d53dae7b997e8cff761aab865cbd42c4c3989',1,'fsl_spi.h']]], + ['kspi_5freceiveignore',['kSPI_ReceiveIgnore',['../a00022.html#ggaaa2e2f2efa7be228c775fa239ab5ea03a2616295b1939805764ffb815876b9eea',1,'fsl_spi.h']]], + ['kspi_5frxoverrunflag',['kSPI_RxOverrunFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09ae281d12263ce63ef7c964f8564bea473',1,'fsl_spi.h']]], + ['kspi_5frxoverruninterruptenable',['kSPI_RxOverrunInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a4acd737132f9c3cbd8cac500767289e5',1,'fsl_spi.h']]], + ['kspi_5frxreadyflag',['kSPI_RxReadyFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a76b9aac1ff3856afdcb4eebdb3be9094',1,'fsl_spi.h']]], + ['kspi_5frxreadyinterruptenable',['kSPI_RxReadyInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ac8d5eef4469ce888d4b2fb3c3b4fb215',1,'fsl_spi.h']]], + ['kspi_5fslaveselectassertflag',['kSPI_SlaveSelectAssertFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09ab25cacb436c5e32113bd98c1ae151641',1,'fsl_spi.h']]], + ['kspi_5fslaveselectassertinterruptenable',['kSPI_SlaveSelectAssertInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ad1de0c0c42c7a707e305edbd3fde88b7',1,'fsl_spi.h']]], + ['kspi_5fslaveselectdeassertflag',['kSPI_SlaveSelectDeassertFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a1f153042fdb9681e7bd435c4cb9bd7c5',1,'fsl_spi.h']]], + ['kspi_5fslaveselectdeassertinterruptenable',['kSPI_SlaveSelectDeassertInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a8f55948795fa8d256b5b6e520a95f145',1,'fsl_spi.h']]], + ['kspi_5fssel0assert',['kSPI_Ssel0Assert',['../a00022.html#gga420a3d3f841957068648585b89fa66d1af64655214a47d11f960f633b1478b117',1,'fsl_spi.h']]], + ['kspi_5fstallflag',['kSPI_StallFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a214bc23d48bafcc89241530e55195f76',1,'fsl_spi.h']]], + ['kspi_5ftxreadyflag',['kSPI_TxReadyFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a3f796180c934ef3b688530986a844fe5',1,'fsl_spi.h']]], + ['kspi_5ftxreadyinterruptenable',['kSPI_TxReadyInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67a0ec3e79b793d213ed30f74a338437129',1,'fsl_spi.h']]], + ['kspi_5ftxunderrunflag',['kSPI_TxUnderrunFlag',['../a00022.html#gga17a846c851b3b17e6a1564a5fab48e09a4be82e1306daa139870673c30de9e238',1,'fsl_spi.h']]], + ['kspi_5ftxunderruninterruptenable',['kSPI_TxUnderrunInterruptEnable',['../a00022.html#ggaedd690a0f91a0a9eb0fd573b57e31f67ad1f9b1e8b5209604a0eca8750f2876ad',1,'fsl_spi.h']]], + ['kstatus_5fbusy',['kStatus_Busy',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba31e314ec45f0b673257687c06b6fe764',1,'fsl_common.h']]], + ['kstatus_5fdma_5fbusy',['kStatus_DMA_Busy',['../a00015.html#gga99fb83031ce9923c84392b4e92f956b5a9b95dc670083f57c33f96b0c10d0c8ba',1,'fsl_dma.h']]], + ['kstatus_5ffail',['kStatus_Fail',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba8692e71089c7e81bd5f4503ff55035db',1,'fsl_common.h']]], + ['kstatus_5fi2c_5faddr_5fnak',['kStatus_I2C_Addr_Nak',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635adf7437bfedcc0d57338ed33f1be5c805',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5farbitrationlost',['kStatus_I2C_ArbitrationLost',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a139b52cc3305ec2c06d0ac94313c221f',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fbiterror',['kStatus_I2C_BitError',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a0db20b358696db03a068816bb72a0310',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fbusy',['kStatus_I2C_Busy',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a49091894b590d7e479605bf113918952',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fdmarequestfail',['kStatus_I2C_DmaRequestFail',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635ac0253b1c986e61b7905da4a7f1fbf844',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fidle',['kStatus_I2C_Idle',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a628d242f7bc0e3d5949c7f73eafaa508',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5finvalidparameter',['kStatus_I2C_InvalidParameter',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a308bcea12eeef85aeac416ead81639b9',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fnak',['kStatus_I2C_Nak',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a72fd33d0b5263a63766e62f71d16be00',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fnotransferinprogress',['kStatus_I2C_NoTransferInProgress',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a834a772763c85b5bedf8eb0a0cfa2f9e',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5fstartstoperror',['kStatus_I2C_StartStopError',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a256cb58b123f0814d020cc8449cf48d5',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5ftimeout',['kStatus_I2C_Timeout',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a81ad7cc198436cabbe91ea55c5288747',1,'fsl_i2c.h']]], + ['kstatus_5fi2c_5funexpectedstate',['kStatus_I2C_UnexpectedState',['../a00091.html#gga726ca809ffd3d67ab4b8476646f26635a99cb29358dad3255402d30285f844632',1,'fsl_i2c.h']]], + ['kstatus_5fiap_5faddrerror',['kStatus_IAP_AddrError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ae4a180ae087b0f4a58a7c89cb081f400',1,'fsl_iap.h']]], + ['kstatus_5fiap_5faddrnotmapped',['kStatus_IAP_AddrNotMapped',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a98ad8dfd7c9c06637a8ef77669248d44',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fbusy',['kStatus_IAP_Busy',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ab171ff8674c9017605cde0067a84a375',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fcompareerror',['kStatus_IAP_CompareError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ac08832cd7dd8929746e5583b85050a43',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fcounterror',['kStatus_IAP_CountError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a947c74ac4418ae34ab4b8be2416e11cb',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fdstaddrerror',['kStatus_IAP_DstAddrError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a37f09b865f86f3f6f58064be70121c02',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fdstaddrnotmapped',['kStatus_IAP_DstAddrNotMapped',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a0491cac2cd13971f08f754a5365ab356',1,'fsl_iap.h']]], + ['kstatus_5fiap_5finvalidcommand',['kStatus_IAP_InvalidCommand',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a254b836a21eb98b6211cefd76037dde7',1,'fsl_iap.h']]], + ['kstatus_5fiap_5finvalidsector',['kStatus_IAP_InvalidSector',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7affa7c3fd999eb6a4558a4e981aa29ccd',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fnoclock',['kStatus_IAP_NoClock',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7adfb58b377dc75167cff2cc8e003939ff',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fnopower',['kStatus_IAP_NoPower',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a08741d113d7dd7358c0a548ed6bedaa9',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fnotprepared',['kStatus_IAP_NotPrepared',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7aea4e342b4bc05dc9f04b2a50b5ccba4f',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fparamerror',['kStatus_IAP_ParamError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a61e927398cdd5549301de26831ff5460',1,'fsl_iap.h']]], + ['kstatus_5fiap_5freinvokeispconfig',['kStatus_IAP_ReinvokeISPConfig',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ad9d50e05078873600322a78c0bd94b35',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fsectornotblank',['kStatus_IAP_SectorNotblank',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a59fbec3050069d5bf473211cad8ab817',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fsrcaddrerror',['kStatus_IAP_SrcAddrError',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ab36f8ecf47da3052eb485015a1932c26',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fsrcaddrnotmapped',['kStatus_IAP_SrcAddrNotMapped',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7ae69151d679a249f83fde025b5562196a',1,'fsl_iap.h']]], + ['kstatus_5fiap_5fsuccess',['kStatus_IAP_Success',['../a00088.html#ggadf764cbdea00d65edcd07bb9953ad2b7a35e8de33bf46beecd34105c59ec2bc6e',1,'fsl_iap.h']]], + ['kstatus_5finvalidargument',['kStatus_InvalidArgument',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba9743ab3bec5065667c0b12510317e76c',1,'fsl_common.h']]], + ['kstatus_5fnodata',['kStatus_NoData',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba94770b392eceab60898d03ffcf0cc145',1,'fsl_common.h']]], + ['kstatus_5fnotransferinprogress',['kStatus_NoTransferInProgress',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba82fc7f2a425a9c3cfcf6636b8c05c06c',1,'fsl_common.h']]], + ['kstatus_5foutofrange',['kStatus_OutOfRange',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba96d166071c2c0b2672ddaa3307899a0b',1,'fsl_common.h']]], + ['kstatus_5freadonly',['kStatus_ReadOnly',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba69927473662d55dfe6a4b8b1ea529f67',1,'fsl_common.h']]], + ['kstatus_5fspi_5fbaudratenotsupport',['kStatus_SPI_BaudrateNotSupport',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2dab0f4d4de5f92524c9d33524f22a04e03',1,'fsl_spi.h']]], + ['kstatus_5fspi_5fbusy',['kStatus_SPI_Busy',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da703abdf7900047c4d13536480f3463ab',1,'fsl_spi.h']]], + ['kstatus_5fspi_5ferror',['kStatus_SPI_Error',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da2ff91d774e93aed936b87ffaa18aaf9e',1,'fsl_spi.h']]], + ['kstatus_5fspi_5fidle',['kStatus_SPI_Idle',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da4e32c5b06dccaf4b81e2fd1679e1b560',1,'fsl_spi.h']]], + ['kstatus_5fspi_5ftimeout',['kStatus_SPI_Timeout',['../a00022.html#gga0411cd49bb5b71852cecd93bcbf0ca2da496ced6fffc33d7bbeb01d203dfc4836',1,'fsl_spi.h']]], + ['kstatus_5fsuccess',['kStatus_Success',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55ba829bee76c6b02225d9c891ae8ef70881',1,'fsl_common.h']]], + ['kstatus_5ftimeout',['kStatus_Timeout',['../a00087.html#gga06fc87d81c62e9abb8790b6e5713c55badf7f172a5d4f1a44d5cb8a1121dcafcb',1,'fsl_common.h']]], + ['kstatus_5fusart_5fbaudratenotsupport',['kStatus_USART_BaudrateNotSupport',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600ae427c8491ce7294dfeaa3b87e506bd81',1,'fsl_usart.h']]], + ['kstatus_5fusart_5fframingerror',['kStatus_USART_FramingError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a9e2f548075400b4c0a719ee1b0a534a9',1,'fsl_usart.h']]], + ['kstatus_5fusart_5fhardwareoverrun',['kStatus_USART_HardwareOverrun',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600ade18e0468490127d2e0a8c71a190bdc8',1,'fsl_usart.h']]], + ['kstatus_5fusart_5fnoiseerror',['kStatus_USART_NoiseError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a3f21596ffe8300152d7f9f5587402e19',1,'fsl_usart.h']]], + ['kstatus_5fusart_5fparityerror',['kStatus_USART_ParityError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a579872694419f8708e38935593105868',1,'fsl_usart.h']]], + ['kstatus_5fusart_5frxbusy',['kStatus_USART_RxBusy',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a38225397e3744ef1b4995041ce80d839',1,'fsl_usart.h']]], + ['kstatus_5fusart_5frxerror',['kStatus_USART_RxError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a888280fbe6cf9b4b0647db78f0578ff5',1,'fsl_usart.h']]], + ['kstatus_5fusart_5frxidle',['kStatus_USART_RxIdle',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a3cb7112c821c89d7fbb1c048a86756aa',1,'fsl_usart.h']]], + ['kstatus_5fusart_5frxringbufferoverrun',['kStatus_USART_RxRingBufferOverrun',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a256720c63c378f57791e946c0473290e',1,'fsl_usart.h']]], + ['kstatus_5fusart_5ftimeout',['kStatus_USART_Timeout',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600ad434a2fb3d728550dd2e784ce0a3e14c',1,'fsl_usart.h']]], + ['kstatus_5fusart_5ftxbusy',['kStatus_USART_TxBusy',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a78157ec0658118f9205521c03da99093',1,'fsl_usart.h']]], + ['kstatus_5fusart_5ftxerror',['kStatus_USART_TxError',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600abf010640733ea1ae8c97d7a0b83ea11b',1,'fsl_usart.h']]], + ['kstatus_5fusart_5ftxidle',['kStatus_USART_TxIdle',['../a00023.html#ggabed82baf7f470b522273a3e37c24c600a539a0ebaa0137fdf6d7cc9b984acb13f',1,'fsl_usart.h']]], + ['kstatusgroup_5fapplicationrangestart',['kStatusGroup_ApplicationRangeStart',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae0c3a94577af5271a1042757d3c8fdc1',1,'fsl_common.h']]], + ['kstatusgroup_5fasrc',['kStatusGroup_ASRC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a713723bd8764655328f1e5283a8e6020',1,'fsl_common.h']]], + ['kstatusgroup_5fbutton',['kStatusGroup_BUTTON',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7415efb189bfb31491ef0ae45fb24d90',1,'fsl_common.h']]], + ['kstatusgroup_5fcaam',['kStatusGroup_CAAM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a298049d9d9c8be1b2e7a42f38a734d87',1,'fsl_common.h']]], + ['kstatusgroup_5fcodec',['kStatusGroup_CODEC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7c488d28bc9be2e29bd0d133bce7389a',1,'fsl_common.h']]], + ['kstatusgroup_5fcommon_5ftask',['kStatusGroup_COMMON_TASK',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7771d56430ad7ff2553a1258aba16e02',1,'fsl_common.h']]], + ['kstatusgroup_5fcsi',['kStatusGroup_CSI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1d1d1a595e9f00c6c9f80c19ce1b8ec5',1,'fsl_common.h']]], + ['kstatusgroup_5fdcp',['kStatusGroup_DCP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8e7465155c679388316b2f874a284e9e',1,'fsl_common.h']]], + ['kstatusgroup_5fdebugconsole',['kStatusGroup_DebugConsole',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a499ec238a1614827065533960716e652',1,'fsl_common.h']]], + ['kstatusgroup_5fdma',['kStatusGroup_DMA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a210ff4fa30e99618f8d3e978df03a7b6',1,'fsl_common.h']]], + ['kstatusgroup_5fdmamgr',['kStatusGroup_DMAMGR',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3091dcef1c0c7cd48658d8b43b52fbaf',1,'fsl_common.h']]], + ['kstatusgroup_5fdmic',['kStatusGroup_DMIC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a679444433f12ae5649cb02c2032ca20e',1,'fsl_common.h']]], + ['kstatusgroup_5fdspi',['kStatusGroup_DSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aee549dc5fb5e05a0d8daaa61a089b222',1,'fsl_common.h']]], + ['kstatusgroup_5fecspi',['kStatusGroup_ECSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab99693af818132e3cb4f9198965ad637',1,'fsl_common.h']]], + ['kstatusgroup_5fedma',['kStatusGroup_EDMA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0ec7f0302a8f7eb082f449933880a1ad',1,'fsl_common.h']]], + ['kstatusgroup_5fenet',['kStatusGroup_ENET',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7d6b922ab2a42d6ef35cfb2be4f80251',1,'fsl_common.h']]], + ['kstatusgroup_5fenet_5fqos',['kStatusGroup_ENET_QOS',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aae462c0663af9e2d180cd06c5798ac3b',1,'fsl_common.h']]], + ['kstatusgroup_5fesai',['kStatusGroup_ESAI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a01101c0342017a7fbe7225a7aa285bad',1,'fsl_common.h']]], + ['kstatusgroup_5fextern_5feeprom',['kStatusGroup_EXTERN_EEPROM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8e4a33b100580c2c1606d66d5ffdfaa3',1,'fsl_common.h']]], + ['kstatusgroup_5fflash',['kStatusGroup_FLASH',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8db8bea33da992b22cafbae1dcf65bb0',1,'fsl_common.h']]], + ['kstatusgroup_5fflashiap',['kStatusGroup_FLASHIAP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae5b7283daca81a85091e27b80ece629a',1,'fsl_common.h']]], + ['kstatusgroup_5fflexcan',['kStatusGroup_FLEXCAN',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1461a28ac2297f07aa34581074cf9923',1,'fsl_common.h']]], + ['kstatusgroup_5fflexcomm_5fi2c',['kStatusGroup_FLEXCOMM_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aedd1abcbca188de6e16a6f088d59e92e',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fcamera',['kStatusGroup_FLEXIO_CAMERA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a214d1cc4faa574be18fa9d865f2ca36d',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fi2c',['kStatusGroup_FLEXIO_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a67e5d3d11fb3f47ec11d9ee612b98b94',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fi2s',['kStatusGroup_FLEXIO_I2S',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae834c896c69c50855c5cf07768a6cba3',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fmculcd',['kStatusGroup_FLEXIO_MCULCD',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a055d3788919f48c2d69463819d02d903',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fspi',['kStatusGroup_FLEXIO_SPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3bc2ecc10af8973a1ecc4f0163fb9b53',1,'fsl_common.h']]], + ['kstatusgroup_5fflexio_5fuart',['kStatusGroup_FLEXIO_UART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae7514134f14004b1835d27cac48bd991',1,'fsl_common.h']]], + ['kstatusgroup_5fflexspi',['kStatusGroup_FLEXSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a22f1bdf5e7abbeb0bdfe18cda0bc5aca',1,'fsl_common.h']]], + ['kstatusgroup_5fgeneric',['kStatusGroup_Generic',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae7c95e11ceb8067c9c2703f96e51aca7',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fflash',['kStatusGroup_HAL_FLASH',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa5afa714de4adf37bc00faf6c3dc589e',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fgpio',['kStatusGroup_HAL_GPIO',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a18ce0675c0cc628b2ff29a1bafce8b58',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fi2c',['kStatusGroup_HAL_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aaa30b9e3fdd5e93bae58e66521b3015d',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fi2s',['kStatusGroup_HAL_I2S',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac509445aa04b715b77e6461993b50085',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fpwm',['kStatusGroup_HAL_PWM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa4609e941ad1155a86c40bdfcb20a155',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5frng',['kStatusGroup_HAL_RNG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa0d0535965c8d28434b036961f6a8c20',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fspi',['kStatusGroup_HAL_SPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aba70aa1970435b3ccd39ac54f9d7a68c',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5ftimer',['kStatusGroup_HAL_TIMER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa44796b25ed6ed37f7fb25f6f4076c2d',1,'fsl_common.h']]], + ['kstatusgroup_5fhal_5fuart',['kStatusGroup_HAL_UART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6510cce112fc6ed1e0523b5d7b307ca2',1,'fsl_common.h']]], + ['kstatusgroup_5fhashcrypt',['kStatusGroup_HASHCRYPT',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1dcb6a7c2605c9ed77388fcb25b01feb',1,'fsl_common.h']]], + ['kstatusgroup_5fi2c',['kStatusGroup_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a5c67a60e98e49151455f565c2834d228',1,'fsl_common.h']]], + ['kstatusgroup_5fi2s',['kStatusGroup_I2S',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0b66f34ec90c9b6a702e0f00f5ddae43',1,'fsl_common.h']]], + ['kstatusgroup_5fi3c',['kStatusGroup_I3C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6dbe13107a9dbb857242cf05e2319f9d',1,'fsl_common.h']]], + ['kstatusgroup_5fi3cbus',['kStatusGroup_I3CBUS',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae28000753ef8046bc9b08e03fc8a1899',1,'fsl_common.h']]], + ['kstatusgroup_5fiap',['kStatusGroup_IAP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a097d515214e888371df5c588b839529d',1,'fsl_common.h']]], + ['kstatusgroup_5fics',['kStatusGroup_ICS',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a01bf442d671041dcbd1649ec0428c3b6',1,'fsl_common.h']]], + ['kstatusgroup_5fiuart',['kStatusGroup_IUART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a33255aee9de4a1d093770b218f944d0f',1,'fsl_common.h']]], + ['kstatusgroup_5fled',['kStatusGroup_LED',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a84ab69a4e7f3f1c39f1c3a64d74af08c',1,'fsl_common.h']]], + ['kstatusgroup_5flist',['kStatusGroup_LIST',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2e3bc103af2d3db7b628f87174d2bff8',1,'fsl_common.h']]], + ['kstatusgroup_5flmem',['kStatusGroup_LMEM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a376f952aee5cd45d903da520a37e4c52',1,'fsl_common.h']]], + ['kstatusgroup_5flog',['kStatusGroup_LOG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2af6421e7b473bd882f5372ad1fa6d0e',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fi2c',['kStatusGroup_LPC_I2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab597c78848ce0e63d2518f14e7bac82b',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fi2c_5f1',['kStatusGroup_LPC_I2C_1',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a749eaf601d6fe3124f054bcb796b348c',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fminispi',['kStatusGroup_LPC_MINISPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab0104dd99e52fbf948f4ae030de5313d',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fspi',['kStatusGroup_LPC_SPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac4c2c9d32010087f0602dbdf2c389857',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fspi_5fssp',['kStatusGroup_LPC_SPI_SSP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aa2c382624b5763cf24cf9727fbfadde3',1,'fsl_common.h']]], + ['kstatusgroup_5flpc_5fusart',['kStatusGroup_LPC_USART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a02f52b9532ae0d4af04f5c054f3fab84',1,'fsl_common.h']]], + ['kstatusgroup_5flpi2c',['kStatusGroup_LPI2C',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a0d6c6a34fc0b6dbcb323f010556a3be1',1,'fsl_common.h']]], + ['kstatusgroup_5flpsci',['kStatusGroup_LPSCI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9f1b2d0eeee16f209d7eed3bdb1cf533',1,'fsl_common.h']]], + ['kstatusgroup_5flpspi',['kStatusGroup_LPSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a491dbb2373725b607970c032f4e04ee3',1,'fsl_common.h']]], + ['kstatusgroup_5flpuart',['kStatusGroup_LPUART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3bcb0be184f8d5bb76d4be8e99b4e45e',1,'fsl_common.h']]], + ['kstatusgroup_5fltc',['kStatusGroup_LTC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a64b54e0423e0ad8a227a38cad4ad4eda',1,'fsl_common.h']]], + ['kstatusgroup_5fmcan',['kStatusGroup_MCAN',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab7f77dd7e0c3d068baf39117ac08a0b9',1,'fsl_common.h']]], + ['kstatusgroup_5fmcg',['kStatusGroup_MCG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8210c55fe061ff24e75a0f928dbfcb39',1,'fsl_common.h']]], + ['kstatusgroup_5fmecc',['kStatusGroup_MECC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ad85b4bef880b9407425398fc584e16a0',1,'fsl_common.h']]], + ['kstatusgroup_5fmem_5fmanager',['kStatusGroup_MEM_MANAGER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29acdfe26eb8bbbaaea438470512401e09a',1,'fsl_common.h']]], + ['kstatusgroup_5fmipi_5fdsi',['kStatusGroup_MIPI_DSI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29abdf3fca48a7a13b67d0207aeb59bc581',1,'fsl_common.h']]], + ['kstatusgroup_5fmmdc',['kStatusGroup_MMDC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a67a884fec4d6adb5b455d50a0a5617a5',1,'fsl_common.h']]], + ['kstatusgroup_5fmscan',['kStatusGroup_MSCAN',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a858563b1d87d6fa57a8f442025655201',1,'fsl_common.h']]], + ['kstatusgroup_5fmsg',['kStatusGroup_MSG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6d0dedbec7ee218b0ae03f23edad02fd',1,'fsl_common.h']]], + ['kstatusgroup_5fnotifier',['kStatusGroup_NOTIFIER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a56134a73f0cfd393dd7cf7fb2395dd99',1,'fsl_common.h']]], + ['kstatusgroup_5fosa',['kStatusGroup_OSA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a5b65c75456471a2536a97a30db4b8da3',1,'fsl_common.h']]], + ['kstatusgroup_5fotfad',['kStatusGroup_OTFAD',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4f53ab1f39031629ac12159920f0cde1',1,'fsl_common.h']]], + ['kstatusgroup_5fotp',['kStatusGroup_OTP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1d9b7b66bfaaf53b42aad8462c88ea62',1,'fsl_common.h']]], + ['kstatusgroup_5fpdm',['kStatusGroup_PDM',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae0b4ea9f05497a624e32811c4f36a3be',1,'fsl_common.h']]], + ['kstatusgroup_5fphy',['kStatusGroup_PHY',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a521a4b8ac1776d0f41af044886a71b3b',1,'fsl_common.h']]], + ['kstatusgroup_5fpower',['kStatusGroup_POWER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a94d2a6fe8021fed5487169a46421d47e',1,'fsl_common.h']]], + ['kstatusgroup_5fpower_5fmanager',['kStatusGroup_POWER_MANAGER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a6c52b0b8b2d2ca670a5f8eca66212f54',1,'fsl_common.h']]], + ['kstatusgroup_5fpuf',['kStatusGroup_PUF',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a984927be2e0e57c4125e8e8f5d9c0f48',1,'fsl_common.h']]], + ['kstatusgroup_5fqsci',['kStatusGroup_QSCI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a025ed41827a0bd0b7bf60b853a921c7d',1,'fsl_common.h']]], + ['kstatusgroup_5fqspi',['kStatusGroup_QSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4a488e0f7cc1d3baa449ab4ca99e7b34',1,'fsl_common.h']]], + ['kstatusgroup_5fqueuedspi',['kStatusGroup_QUEUEDSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7712fcacc6d5e9698366daafc59ea644',1,'fsl_common.h']]], + ['kstatusgroup_5fsai',['kStatusGroup_SAI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae4461a3a085ea13b5fe7908bf1e109f8',1,'fsl_common.h']]], + ['kstatusgroup_5fscg',['kStatusGroup_SCG',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9771abafdcf43bf924599a0081e92bf2',1,'fsl_common.h']]], + ['kstatusgroup_5fsdhc',['kStatusGroup_SDHC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aba83e94d1735b695119429a4e55bb3a4',1,'fsl_common.h']]], + ['kstatusgroup_5fsdif',['kStatusGroup_SDIF',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a25fb824a9ad702e631276a8ea5d03603',1,'fsl_common.h']]], + ['kstatusgroup_5fsdioslv',['kStatusGroup_SDIOSLV',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3e59e90d903b97bd45037175997f4ad6',1,'fsl_common.h']]], + ['kstatusgroup_5fsdk_5fflexspinor',['kStatusGroup_SDK_FLEXSPINOR',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a830e5b42a05424dc026bd36d30f143a5',1,'fsl_common.h']]], + ['kstatusgroup_5fsdk_5focotp',['kStatusGroup_SDK_OCOTP',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a539b147c0d1409a0e11c3ae340886fa8',1,'fsl_common.h']]], + ['kstatusgroup_5fsdma',['kStatusGroup_SDMA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ab55df75d85633505960f611180054524',1,'fsl_common.h']]], + ['kstatusgroup_5fsdmmc',['kStatusGroup_SDMMC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a1c5e35d9d03724b7ccadcae8e0451384',1,'fsl_common.h']]], + ['kstatusgroup_5fsdramc',['kStatusGroup_SDRAMC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a3b3116c6f4aa1a88e6e7abc45df58938',1,'fsl_common.h']]], + ['kstatusgroup_5fsdspi',['kStatusGroup_SDSPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a85685b8cde1285d240569b9518c32fc0',1,'fsl_common.h']]], + ['kstatusgroup_5fsema42',['kStatusGroup_SEMA42',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a073c6e3ccd0dbcf1b812cb21da5e7df9',1,'fsl_common.h']]], + ['kstatusgroup_5fsemc',['kStatusGroup_SEMC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a2fef671dda58af09262787022fe321fe',1,'fsl_common.h']]], + ['kstatusgroup_5fserialmanager',['kStatusGroup_SERIALMANAGER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a39a54cda2a1cac31e1c00be0eb4a7620',1,'fsl_common.h']]], + ['kstatusgroup_5fsfa',['kStatusGroup_SFA',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a9cf111a176ebe1210ae6faaa950aac54',1,'fsl_common.h']]], + ['kstatusgroup_5fshell',['kStatusGroup_SHELL',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a660addd059be8786f2aa3d9a1a196ae1',1,'fsl_common.h']]], + ['kstatusgroup_5fsmartcard',['kStatusGroup_SMARTCARD',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae16d6bba44ae6f24187946960fb826dd',1,'fsl_common.h']]], + ['kstatusgroup_5fsnt',['kStatusGroup_SNT',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae67462f0d7dbac886d8a1272a29b846c',1,'fsl_common.h']]], + ['kstatusgroup_5fspc',['kStatusGroup_SPC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a7491bc6ede9a2eb6e7f292bb1530b7d7',1,'fsl_common.h']]], + ['kstatusgroup_5fspdif',['kStatusGroup_SPDIF',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a8bea2b5f8b1458aaa0dc29ddbb972d87',1,'fsl_common.h']]], + ['kstatusgroup_5fspi',['kStatusGroup_SPI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a60c31c70600aff4f290ca2d790622977',1,'fsl_common.h']]], + ['kstatusgroup_5fspifi',['kStatusGroup_SPIFI',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ac071c3c3d14ed8afadb2bb6de249c722',1,'fsl_common.h']]], + ['kstatusgroup_5ftimermanager',['kStatusGroup_TIMERMANAGER',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a4603f8fedc8ad994788e17baae895013',1,'fsl_common.h']]], + ['kstatusgroup_5ftouch_5fpanel',['kStatusGroup_TOUCH_PANEL',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29a381f1929c41dcaef62d2d44326719db8',1,'fsl_common.h']]], + ['kstatusgroup_5ftrgmux',['kStatusGroup_TRGMUX',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29adb8c69c2f8cd344f3e2dc0b0db4a1631',1,'fsl_common.h']]], + ['kstatusgroup_5fuart',['kStatusGroup_UART',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29aeeb2ed6ef4ce59c7e1d416466f55bfb7',1,'fsl_common.h']]], + ['kstatusgroup_5fusdhc',['kStatusGroup_USDHC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29ae2f54d029f0e74c8fed8812e24000a74',1,'fsl_common.h']]], + ['kstatusgroup_5fxrdc',['kStatusGroup_XRDC',['../a00087.html#gga7ff0b98bb1341c07acefb1473b6eda29af98b407f4e66e7046a3173031b45253d',1,'fsl_common.h']]], + ['kswm_5facmp_5finput1',['kSWM_ACMP_INPUT1',['../a00095.html#gga6db188a71a269613f30825af80c02053a28fab9703b5177948f7409efa9ff848a',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5finput2',['kSWM_ACMP_INPUT2',['../a00095.html#gga6db188a71a269613f30825af80c02053abd4f15c4f7b44b457764ab2aa67ac5ac',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5finput3',['kSWM_ACMP_INPUT3',['../a00095.html#gga6db188a71a269613f30825af80c02053ad8072ce6e9985ae8377377ae49ba57d7',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5finput4',['kSWM_ACMP_INPUT4',['../a00095.html#gga6db188a71a269613f30825af80c02053a2f09e0ca30217841402ba6bf16f8f785',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5finput5',['kSWM_ACMP_INPUT5',['../a00095.html#gga6db188a71a269613f30825af80c02053ad1b1f498a44a52ed74eab7333c03e177',1,'fsl_swm_connections.h']]], + ['kswm_5facmp_5fout',['kSWM_ACMP_OUT',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da76769594d29a6d8659c5c625b4212a24',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn0',['kSWM_ADC_CHN0',['../a00095.html#gga6db188a71a269613f30825af80c02053acc0420d5b902bffdc029c0a179fd9653',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn1',['kSWM_ADC_CHN1',['../a00095.html#gga6db188a71a269613f30825af80c02053af96a078ddf8497b6680dcb8812abccaf',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn10',['kSWM_ADC_CHN10',['../a00095.html#gga6db188a71a269613f30825af80c02053a3872c11496f6cd2755a2cc33edeee25e',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn11',['kSWM_ADC_CHN11',['../a00095.html#gga6db188a71a269613f30825af80c02053a1195026daab11c8e8e8a07ea2588dc59',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn2',['kSWM_ADC_CHN2',['../a00095.html#gga6db188a71a269613f30825af80c02053aab8f0dd610beed22acf2a5a2c3149a38',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn3',['kSWM_ADC_CHN3',['../a00095.html#gga6db188a71a269613f30825af80c02053ab3e46c2499e53d6187acef5b9c92faeb',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn4',['kSWM_ADC_CHN4',['../a00095.html#gga6db188a71a269613f30825af80c02053a131299a8724b490b48ff5ea4ae88ec85',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn5',['kSWM_ADC_CHN5',['../a00095.html#gga6db188a71a269613f30825af80c02053a8f49833db881a5cca72e39060510fe33',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn6',['kSWM_ADC_CHN6',['../a00095.html#gga6db188a71a269613f30825af80c02053a2cf1d219093b981b000fefd1b4b88835',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn7',['kSWM_ADC_CHN7',['../a00095.html#gga6db188a71a269613f30825af80c02053af60644696c7226d16b940a379e974d07',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn8',['kSWM_ADC_CHN8',['../a00095.html#gga6db188a71a269613f30825af80c02053aca55eb81b04844960f74d6b6f735f406',1,'fsl_swm_connections.h']]], + ['kswm_5fadc_5fchn9',['kSWM_ADC_CHN9',['../a00095.html#gga6db188a71a269613f30825af80c02053a332c28d49858ffceda3b7d9a9a317d0c',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx0',['kSWM_CAPT_X0',['../a00095.html#gga6db188a71a269613f30825af80c02053a5673e5074470fd8c7773f987a45612ab',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx1',['kSWM_CAPT_X1',['../a00095.html#gga6db188a71a269613f30825af80c02053a74e21d63631f6e3eeae57269cc597ff9',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx2',['kSWM_CAPT_X2',['../a00095.html#gga6db188a71a269613f30825af80c02053ae11d56486ef46dfad9ea855f223483f2',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx3',['kSWM_CAPT_X3',['../a00095.html#gga6db188a71a269613f30825af80c02053a144b0c83acca82fa910848f7587af18e',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx4',['kSWM_CAPT_X4',['../a00095.html#gga6db188a71a269613f30825af80c02053adad77032cc009f3690361c9f4d552cdd',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx5',['kSWM_CAPT_X5',['../a00095.html#gga6db188a71a269613f30825af80c02053a4c1cd58e5ec1701988c4f75b9984ea02',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx6',['kSWM_CAPT_X6',['../a00095.html#gga6db188a71a269613f30825af80c02053aa8268aaae121ff5d8c034197c212be34',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx7',['kSWM_CAPT_X7',['../a00095.html#gga6db188a71a269613f30825af80c02053a1c37339ea26e38fc22dc2e0f684eca9f',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fx8',['kSWM_CAPT_X8',['../a00095.html#gga6db188a71a269613f30825af80c02053a8812766f8dc3ffa1fa2f4ad7b3623432',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fyh',['kSWM_CAPT_YH',['../a00095.html#gga6db188a71a269613f30825af80c02053a839653f003a5f245984cbbb3e0ded090',1,'fsl_swm_connections.h']]], + ['kswm_5fcapt_5fyl',['kSWM_CAPT_YL',['../a00095.html#gga6db188a71a269613f30825af80c02053abe002214e7dc409f243527310e689060',1,'fsl_swm_connections.h']]], + ['kswm_5fclkin',['kSWM_CLKIN',['../a00095.html#gga6db188a71a269613f30825af80c02053add9353fb1a660338dc4129f564d43c41',1,'fsl_swm_connections.h']]], + ['kswm_5fclkout',['kSWM_CLKOUT',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da867964bdb44cfca767b2fe212243ad68',1,'fsl_swm_connections.h']]], + ['kswm_5fdac_5fout0',['kSWM_DAC_OUT0',['../a00095.html#gga6db188a71a269613f30825af80c02053aafaffe0fe7c5ed4eaed04bd7acac4f0b',1,'fsl_swm_connections.h']]], + ['kswm_5fdac_5fout1',['kSWM_DAC_OUT1',['../a00095.html#gga6db188a71a269613f30825af80c02053ad27f5123f30e1df03752e0441e384bc0',1,'fsl_swm_connections.h']]], + ['kswm_5ffixedpin_5fnum_5ffuncs',['kSWM_FIXEDPIN_NUM_FUNCS',['../a00095.html#gga6db188a71a269613f30825af80c02053a609f40f8714286a7fce78c131a97b69f',1,'fsl_swm_connections.h']]], + ['kswm_5fgpio_5fint_5fbmat',['kSWM_GPIO_INT_BMAT',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da9e23b0bd838b14f99f22d1ae76d63143',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c0_5fscl',['kSWM_I2C0_SCL',['../a00095.html#gga6db188a71a269613f30825af80c02053a6f0a53c70373fdbf41edf57122669a47',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c0_5fsda',['kSWM_I2C0_SDA',['../a00095.html#gga6db188a71a269613f30825af80c02053a679e93580df161b665365f658345ed65',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c1_5fscl',['kSWM_I2C1_SCL',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da5ba6a30f56eb6e001abb178bb215469a',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c1_5fsda',['kSWM_I2C1_SDA',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dab15fc1b1ba8e4f1a35fc314c60b467be',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c2_5fscl',['kSWM_I2C2_SCL',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daeb0140f33c859191ef01c944232eece0',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c2_5fsda',['kSWM_I2C2_SDA',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da29239ecd12dc74a5fea8212ac33384aa',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c3_5fscl',['kSWM_I2C3_SCL',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da762b4a79d8190dddad7ebc6aa10dc050',1,'fsl_swm_connections.h']]], + ['kswm_5fi2c3_5fsda',['kSWM_I2C3_SDA',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daba956178be53723eb6036f604c405a38',1,'fsl_swm_connections.h']]], + ['kswm_5fmovable_5fnum_5ffuncs',['kSWM_MOVABLE_NUM_FUNCS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dac735c6243e08a73181d0f0f8f6c130bb',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f0',['kSWM_PortPin_P0_0',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35abf7ea2c0f06252d5e966ca63f23dba2e',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f1',['kSWM_PortPin_P0_1',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a9010bbdc4d0ba698a18c200f27586c5a',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f10',['kSWM_PortPin_P0_10',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35adb2af26fbb96cad1a3f4d666e3759e39',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f11',['kSWM_PortPin_P0_11',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a6514b3be861759fdc7f645c4a8190176',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f12',['kSWM_PortPin_P0_12',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a473548308d7fac0d5fa4ac959f81e444',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f13',['kSWM_PortPin_P0_13',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0efea555d71ff08c985b3c002e49f25a',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f14',['kSWM_PortPin_P0_14',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae2a752505db2acdb06e6047c3c447f63',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f15',['kSWM_PortPin_P0_15',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a21dd2c94b4ab7b133e9818a5a394f967',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f16',['kSWM_PortPin_P0_16',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0c38ea80f06768e2ad6282fbc11d5187',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f17',['kSWM_PortPin_P0_17',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a74b6edcb7dba9f95182a4faa57dd110d',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f18',['kSWM_PortPin_P0_18',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1eb0795f2598b9acf64e7abcb63f78d5',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f19',['kSWM_PortPin_P0_19',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a488a17a4e210b5000df9ecc534d24c8b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f2',['kSWM_PortPin_P0_2',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aa8e8084f5ea75a2e776f4a8f8a8d5e61',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f20',['kSWM_PortPin_P0_20',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1127b8f8732d34f2c80daf825bb14853',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f21',['kSWM_PortPin_P0_21',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a8ec22695a3c8fbc028cc86299ca76b9a',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f22',['kSWM_PortPin_P0_22',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35af2a8176b461addf3d18b1128800dd7ef',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f23',['kSWM_PortPin_P0_23',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae6795c51fac27d7426848568f125a6e8',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f24',['kSWM_PortPin_P0_24',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ac61483b0bbae6a06d6789e41aaf450fc',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f25',['kSWM_PortPin_P0_25',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a7a625624c8520faff1f2e6b0a1230ba5',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f26',['kSWM_PortPin_P0_26',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ac557f3233abd222c5cf7d809e082f94b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f27',['kSWM_PortPin_P0_27',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aea9feb0c4582cb00ea087fef692f7623',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f28',['kSWM_PortPin_P0_28',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35af3005bf86c4488117ca1396151d2c2af',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f29',['kSWM_PortPin_P0_29',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35acc5bcdfe59c04f2da33835496b3a2ddf',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f3',['kSWM_PortPin_P0_3',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a3a31a8f0c23e7d75db386e0f1705fcb8',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f30',['kSWM_PortPin_P0_30',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aeba0cfeb40308a0bd10bd33298bf9e84',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f31',['kSWM_PortPin_P0_31',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a7b0ebc4f977a126eb51422b3df962e87',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f4',['kSWM_PortPin_P0_4',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a933c38c001bf24a62f0c8bf62e9bbbfb',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f5',['kSWM_PortPin_P0_5',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a75b66d0e23730af2446bdec683db11d3',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f6',['kSWM_PortPin_P0_6',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a4e2797855da4686eb7de9e75c5034d66',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f7',['kSWM_PortPin_P0_7',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a8a3af6c1f0f5791666b2c8409321ee0b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f8',['kSWM_PortPin_P0_8',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ab0f66b94af6c72515e705077a0aea28b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp0_5f9',['kSWM_PortPin_P0_9',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ace9b73074e1c03234c89b40ecd52a1e6',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f0',['kSWM_PortPin_P1_0',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae94fc13ecb0921b638c70512bf8281d6',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f1',['kSWM_PortPin_P1_1',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35abaebf2f6b5b5cde087eb49ed5f2b1f35',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f10',['kSWM_PortPin_P1_10',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a73bc985bec01aad92ec6f227dfa33c71',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f11',['kSWM_PortPin_P1_11',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a89eb85c7d85a8ad52f20bac7eb445c21',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f12',['kSWM_PortPin_P1_12',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a42a138600cc12d14279d26ba18532f78',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f13',['kSWM_PortPin_P1_13',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a0360fc48e017a241d3fe34d9ff2614ee',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f14',['kSWM_PortPin_P1_14',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35afcbc2b785e5b99a550f8504afe1f3bc1',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f15',['kSWM_PortPin_P1_15',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a95483f9f6afef5e552486e3dcc21b6e7',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f16',['kSWM_PortPin_P1_16',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ad8ae11b993e1cfa619d236025511e0bf',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f17',['kSWM_PortPin_P1_17',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a202dd64ec2e20bd15b7742c6d1cc1c6e',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f18',['kSWM_PortPin_P1_18',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae3ae151cd2fd03546272907de2f46452',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f19',['kSWM_PortPin_P1_19',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a9634c54b13db3584029727384a8ec150',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f2',['kSWM_PortPin_P1_2',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae2226bb62df630c243dbf2b25246ae31',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f20',['kSWM_PortPin_P1_20',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35aac489e32c6f52361bfdfa34a2e29e361',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f21',['kSWM_PortPin_P1_21',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ad3faaa86fe964959f39e40214f65ec88',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f3',['kSWM_PortPin_P1_3',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35afc8592f6245641f8c5fdc9b0b7adc7d8',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f4',['kSWM_PortPin_P1_4',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a1307d505951b16557a3a311a61952edc',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f5',['kSWM_PortPin_P1_5',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a2384fb04fb823834f7e4420e2f7e9834',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f6',['kSWM_PortPin_P1_6',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a70f9bbb4788bbe8974ebefa1c16e4f06',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f7',['kSWM_PortPin_P1_7',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a70c8684952c0ee7fe10facb7b8c3562f',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f8',['kSWM_PortPin_P1_8',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a939530a75e2bea978f104a90d4070832',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5fp1_5f9',['kSWM_PortPin_P1_9',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35ae02e17e293a9bd22a00e7b2c1aa4478b',1,'fsl_swm_connections.h']]], + ['kswm_5fportpin_5freset',['kSWM_PortPin_Reset',['../a00095.html#ggaca9c780388e187444bfa31a6bcc72d35a6873cb2ccda9efd34d7fdd75f3829f1c',1,'fsl_swm_connections.h']]], + ['kswm_5fresetn',['kSWM_RESETN',['../a00095.html#gga6db188a71a269613f30825af80c02053a2c3df2d1d6d1fb817003b824eb699585',1,'fsl_swm_connections.h']]], + ['kswm_5frst_5fn_5fshift_5frstn',['kSWM_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770abbd5b2eb886157d35a4ff88077fa192b',1,'fsl_reset.h']]], + ['kswm_5fsct_5fout0',['kSWM_SCT_OUT0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da224d928aad4331ef5d68009e70e538f5',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout1',['kSWM_SCT_OUT1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da80950740f9483b5483eef4606fdf7aa0',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout2',['kSWM_SCT_OUT2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dab7486d7c92e144b832cac5062cc7332d',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout3',['kSWM_SCT_OUT3',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da88e6d984d42304f78c3588deb26dda58',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout4',['kSWM_SCT_OUT4',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da8a91ce53d99f81616b9b89ccca0d3622',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout5',['kSWM_SCT_OUT5',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da486fdfd2ff450e9a90ddf8aee01558ce',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fout6',['kSWM_SCT_OUT6',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da4c6afb8ab3dd8b1d9b1048ad887fa4d4',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fpin0',['kSWM_SCT_PIN0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daf8a4a3044fce3b8a4f4e623ae487eaf3',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fpin1',['kSWM_SCT_PIN1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daf75b73c12fb8bf5f3a11bdeac90a707c',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fpin2',['kSWM_SCT_PIN2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da48564e7fb10e92bdf93505fc7fa9c67e',1,'fsl_swm_connections.h']]], + ['kswm_5fsct_5fpin3',['kSWM_SCT_PIN3',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da6fc9c6a69e49ac3a90c96df724896b0c',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fmiso',['kSWM_SPI0_MISO',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da84653c7b62da4f773676a39a2abe597a',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fmosi',['kSWM_SPI0_MOSI',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dad6e9059822d87be57e82960aa79d9229',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fsck',['kSWM_SPI0_SCK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dabd1859e7fd97d6aad4edf95f92eb1df0',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fssel0',['kSWM_SPI0_SSEL0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dadeb15fd0fbfb9f438e22762cad170359',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fssel1',['kSWM_SPI0_SSEL1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dacdcd02ea5803089ebcd609e227acab8b',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fssel2',['kSWM_SPI0_SSEL2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da47f29fa3b468816be5c1eb20acba2401',1,'fsl_swm_connections.h']]], + ['kswm_5fspi0_5fssel3',['kSWM_SPI0_SSEL3',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dabb2ff7e22a1cf8569371940cf8aa26be',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fmiso',['kSWM_SPI1_MISO',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dae283471f853e6c225c1e87993684f33e',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fmosi',['kSWM_SPI1_MOSI',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daaac1baf3720b00f74ac8ce909480aa55',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fsck',['kSWM_SPI1_SCK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da77e9143545ea4e513ef6011f7208f546',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fssel0',['kSWM_SPI1_SSEL0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da2b6c54c9683950102b65b04d72413485',1,'fsl_swm_connections.h']]], + ['kswm_5fspi1_5fssel1',['kSWM_SPI1_SSEL1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dada607a033b2f32aeff128ca0e44f5330',1,'fsl_swm_connections.h']]], + ['kswm_5fswclk',['kSWM_SWCLK',['../a00095.html#gga6db188a71a269613f30825af80c02053a9b86fc933fab954e947140ea4ca2ffe3',1,'fsl_swm_connections.h']]], + ['kswm_5fswdio',['kSWM_SWDIO',['../a00095.html#gga6db188a71a269613f30825af80c02053ac0ebb404f4a50e198c79a35af9721e6c',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fcap_5fchn0',['kSWM_T0_CAP_CHN0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da14bfd78536056ebdc4d2bfed0438b5cf',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fcap_5fchn1',['kSWM_T0_CAP_CHN1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da048cac659ef579d1358cc6d2a7db2c3a',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fcap_5fchn2',['kSWM_T0_CAP_CHN2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daef5103aadc41068ca6157543520491b2',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fmat_5fchn0',['kSWM_T0_MAT_CHN0',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da0ac9c784851c59d1c334fba730bdc091',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fmat_5fchn1',['kSWM_T0_MAT_CHN1',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da4be08849669f9f086a238335662c6ac1',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fmat_5fchn2',['kSWM_T0_MAT_CHN2',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da11e574aeb2ec56f282a103d78c49ccbe',1,'fsl_swm_connections.h']]], + ['kswm_5ft0_5fmat_5fchn3',['kSWM_T0_MAT_CHN3',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da3ab2e3d866e55d84dc2c342eb660c0d5',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5fcts',['kSWM_USART0_CTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dacf5086c4d10114ed1e2adf80ef0c1d8e',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5frts',['kSWM_USART0_RTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da83269426ac6b85e729bd940e7c6bc168',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5frxd',['kSWM_USART0_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dac38fd128ae8088af0ab82bb9e1ab2b0e',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5fsclk',['kSWM_USART0_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da95076efb390207c31347c9d6eaf7a568',1,'fsl_swm_connections.h']]], + ['kswm_5fusart0_5ftxd',['kSWM_USART0_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da7a0b07e7613ca95cbae02f51e74338ae',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5fcts',['kSWM_USART1_CTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da813d3edec232542ea82e71a655b0b4fb',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5frts',['kSWM_USART1_RTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daf60de542a97e3ce9a3e5b7dbcc2bcda2',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5frxd',['kSWM_USART1_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da40ca641c0138d551c28bb9dd184bf948',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5fsclk',['kSWM_USART1_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da209dc130cd5427683bedca3187726030',1,'fsl_swm_connections.h']]], + ['kswm_5fusart1_5ftxd',['kSWM_USART1_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da3ca0015b97fb5a1b24b1f6fda113488d',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5fcts',['kSWM_USART2_CTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da42ac6e1f6f6becfc8e66497f37c55d1a',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5frts',['kSWM_USART2_RTS',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da7cca77c6472c74168c27badb5004168e',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5frxd',['kSWM_USART2_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13dadaead8c606fd8cbcbc0f91300767347a',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5fsclk',['kSWM_USART2_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da116239c55759f6c6001ceba755c7b8d2',1,'fsl_swm_connections.h']]], + ['kswm_5fusart2_5ftxd',['kSWM_USART2_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daf89abebe911f5ecafec20d30dc2f682f',1,'fsl_swm_connections.h']]], + ['kswm_5fusart3_5frxd',['kSWM_USART3_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da76e8eae17c3a231d2264df8ee85816be',1,'fsl_swm_connections.h']]], + ['kswm_5fusart3_5fsclk',['kSWM_USART3_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13daafad49b1a33633d2b55ae1ba9106d4fe',1,'fsl_swm_connections.h']]], + ['kswm_5fusart3_5ftxd',['kSWM_USART3_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da76658de4210286b1454d40e812df6ac4',1,'fsl_swm_connections.h']]], + ['kswm_5fusart4_5frxd',['kSWM_USART4_RXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da6c008c1255cce64e50b8645c5aebb0ad',1,'fsl_swm_connections.h']]], + ['kswm_5fusart4_5fsclk',['kSWM_USART4_SCLK',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da9124d482fb323cb9201ffbc3914755b7',1,'fsl_swm_connections.h']]], + ['kswm_5fusart4_5ftxd',['kSWM_USART4_TXD',['../a00095.html#gga45575871cafcadc50292b9bba6b9d13da5a04ae8d36afacb8c813cbd1de05d304',1,'fsl_swm_connections.h']]], + ['kswm_5fvddcmp',['kSWM_VDDCMP',['../a00095.html#gga6db188a71a269613f30825af80c02053a1c8051ee75028cdb756ce666cc9b1bb9',1,'fsl_swm_connections.h']]], + ['kswm_5fxtalin',['kSWM_XTALIN',['../a00095.html#gga6db188a71a269613f30825af80c02053a2947dc590a82f761d8c0f634a95eb3ef',1,'fsl_swm_connections.h']]], + ['kswm_5fxtalout',['kSWM_XTALOUT',['../a00095.html#gga6db188a71a269613f30825af80c02053af2012960829ef051b69391eee877d167',1,'fsl_swm_connections.h']]], + ['ksyscon_5fgpioport0pin0topintsel',['kSYSCON_GpioPort0Pin0ToPintsel',['../a00096.html#gga4a63ee69b68459770551a0e4d7b6cdadafe2a386c6f3e8884b995d08fd87de542',1,'fsl_syscon_connections.h']]], + ['kuart0_5fclk_5ffrom_5ffrg0clk',['kUART0_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad0784125581fd7bf09f4b3bab3af725d',1,'fsl_clock.h']]], + ['kuart0_5fclk_5ffrom_5ffrg1clk',['kUART0_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a7ef63f722c9c6e188ea209ba84f6991c',1,'fsl_clock.h']]], + ['kuart0_5fclk_5ffrom_5ffro',['kUART0_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a67d2eb5235a0677d1ef161e5e1c2b340',1,'fsl_clock.h']]], + ['kuart0_5fclk_5ffrom_5ffro_5fdiv',['kUART0_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af06770587aa45bbb62d1e4fe36d03d81',1,'fsl_clock.h']]], + ['kuart0_5fclk_5ffrom_5fmainclk',['kUART0_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a841785f980e4c406eeecdcf07559fe66',1,'fsl_clock.h']]], + ['kuart0_5frst_5fn_5fshift_5frstn',['kUART0_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aa294a3c09c1565947ebcd78694acff24',1,'fsl_reset.h']]], + ['kuart1_5fclk_5ffrom_5ffrg0clk',['kUART1_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af45a833dead43235df03a982dc25ea33',1,'fsl_clock.h']]], + ['kuart1_5fclk_5ffrom_5ffrg1clk',['kUART1_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a4c795835151e3db8e027500091ca7235',1,'fsl_clock.h']]], + ['kuart1_5fclk_5ffrom_5ffro',['kUART1_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a9fbd759cc60932bb0896625543477290',1,'fsl_clock.h']]], + ['kuart1_5fclk_5ffrom_5ffro_5fdiv',['kUART1_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a1b183d67629d90ddc1a9b9baf2ebc285',1,'fsl_clock.h']]], + ['kuart1_5fclk_5ffrom_5fmainclk',['kUART1_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a066679b9e0a01ccd0aad6e6caa643f2f',1,'fsl_clock.h']]], + ['kuart1_5frst_5fn_5fshift_5frstn',['kUART1_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a8bc751e4927f0c20a0695b284fc40c38',1,'fsl_reset.h']]], + ['kuart2_5fclk_5ffrom_5ffrg0clk',['kUART2_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad4c08c5a89da40d06718a4f83a999a15',1,'fsl_clock.h']]], + ['kuart2_5fclk_5ffrom_5ffrg1clk',['kUART2_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a4e4a114969e2446efb826b0f436e60b4',1,'fsl_clock.h']]], + ['kuart2_5fclk_5ffrom_5ffro',['kUART2_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58afa1754a6f8ad6663b97370dd3d2e4f3b',1,'fsl_clock.h']]], + ['kuart2_5fclk_5ffrom_5ffro_5fdiv',['kUART2_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a45a5f9cbfc0626d893768c61e922dd1e',1,'fsl_clock.h']]], + ['kuart2_5fclk_5ffrom_5fmainclk',['kUART2_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a43ab6417acfda68bfa6fb3228bc0fa22',1,'fsl_clock.h']]], + ['kuart2_5frst_5fn_5fshift_5frstn',['kUART2_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aba96ac75d5b05b7df8222704e24def14',1,'fsl_reset.h']]], + ['kuart3_5fclk_5ffrom_5ffrg0clk',['kUART3_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a3783440f6a72a888a464ad824842740e',1,'fsl_clock.h']]], + ['kuart3_5fclk_5ffrom_5ffrg1clk',['kUART3_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a98f2d7502907ece893c0bbee9202651f',1,'fsl_clock.h']]], + ['kuart3_5fclk_5ffrom_5ffro',['kUART3_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58aaf28b28236e7172dd366aab893c08de3',1,'fsl_clock.h']]], + ['kuart3_5fclk_5ffrom_5ffro_5fdiv',['kUART3_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a0b370ac43c3546605db7ba397ba9a775',1,'fsl_clock.h']]], + ['kuart3_5fclk_5ffrom_5fmainclk',['kUART3_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a9d6f615bb923c12b2d7b831272e85daf',1,'fsl_clock.h']]], + ['kuart3_5frst_5fn_5fshift_5frstn',['kUART3_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770aa61d8fdd3f725cee11918bae04493dc8',1,'fsl_reset.h']]], + ['kuart4_5fclk_5ffrom_5ffrg0clk',['kUART4_Clk_From_Frg0Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ad30f9ec4dd8bf91c3b072f8eae495a3e',1,'fsl_clock.h']]], + ['kuart4_5fclk_5ffrom_5ffrg1clk',['kUART4_Clk_From_Frg1Clk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ac70f329af8bfa7becadf7396b6c55aac',1,'fsl_clock.h']]], + ['kuart4_5fclk_5ffrom_5ffro',['kUART4_Clk_From_Fro',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58af3df9606907ec93d127cf6759090dc64',1,'fsl_clock.h']]], + ['kuart4_5fclk_5ffrom_5ffro_5fdiv',['kUART4_Clk_From_Fro_Div',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58a37e357b51fc23fcc649e5c1085a57524',1,'fsl_clock.h']]], + ['kuart4_5fclk_5ffrom_5fmainclk',['kUART4_Clk_From_MainClk',['../a00011.html#gga59a363f0296ea51011dd86b405d5db58ae4d335d5f4a2a8de27f87f8c6c38ddfd',1,'fsl_clock.h']]], + ['kuart4_5frst_5fn_5fshift_5frstn',['kUART4_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770ac1d90aca68025a47b316e6f6b02c209e',1,'fsl_reset.h']]], + ['kusart_5f7bitsperchar',['kUSART_7BitsPerChar',['../a00023.html#gga28e46a3538cf5f5140523132a963283ca9562d6cdd240e9808a9a1d1946f400b7',1,'fsl_usart.h']]], + ['kusart_5f8bitsperchar',['kUSART_8BitsPerChar',['../a00023.html#gga28e46a3538cf5f5140523132a963283cad71aee19329a4127614132d30e50ad8a',1,'fsl_usart.h']]], + ['kusart_5fallinterruptenable',['kUSART_AllInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ad97d89d6e3a853cc07c854838a4f31f9',1,'fsl_usart.h']]], + ['kusart_5fautobauderrorflag',['kUSART_AutoBaudErrorFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610aa655bdfd278003a00cf5195986a38892',1,'fsl_usart.h']]], + ['kusart_5fautobauderrorinterruptenable',['kUSART_AutoBaudErrorInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a7154c6ede60243bf5f9e727a5cb18ce5',1,'fsl_usart.h']]], + ['kusart_5fctsstate',['kUSART_CtsState',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2515d20982ec4edf617f6872e666a1d3',1,'fsl_usart.h']]], + ['kusart_5fdeltactsflag',['kUSART_DeltaCtsFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a722bb0119b5dc19d471b62c622aca9c7',1,'fsl_usart.h']]], + ['kusart_5fdeltactsinterruptenable',['kUSART_DeltaCtsInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ac01c5ca3a2671c568e35d196ea223ada',1,'fsl_usart.h']]], + ['kusart_5fframerrorflag',['kUSART_FramErrorFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2187b4e63a575e94e6d3a1b7a5ce51d7',1,'fsl_usart.h']]], + ['kusart_5fframerrorinterruptenable',['kUSART_FramErrorInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853acc912dfbb3e827b37e9a942bf601672d',1,'fsl_usart.h']]], + ['kusart_5fhardwareoverrunflag',['kUSART_HardwareOverrunFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610ade5bc3f17cf2c303ba2e0eeedafd858c',1,'fsl_usart.h']]], + ['kusart_5fhardwareoverruninterruptenable',['kUSART_HardwareOverRunInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853afb9ef5dc29f02f42773fb5b7fcda2e3e',1,'fsl_usart.h']]], + ['kusart_5fonestopbit',['kUSART_OneStopBit',['../a00023.html#gga58ab07609b094f719f903475de6e57b4aa637b8f5f0edd262181a20c1fbed7c12',1,'fsl_usart.h']]], + ['kusart_5fparitydisabled',['kUSART_ParityDisabled',['../a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2a46309b174047a84a78c77b7648bdf21b',1,'fsl_usart.h']]], + ['kusart_5fparityerrorflag',['kUSART_ParityErrorFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a46d487d50d8392d25c5c4e76cdfb6674',1,'fsl_usart.h']]], + ['kusart_5fparityerrorinterruptenable',['kUSART_ParityErrorInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a3dc275bab22f77a1182bbab5fd5cea3b',1,'fsl_usart.h']]], + ['kusart_5fparityeven',['kUSART_ParityEven',['../a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2aad8d786301da1bb92e2b911c386d39eb',1,'fsl_usart.h']]], + ['kusart_5fparityodd',['kUSART_ParityOdd',['../a00023.html#gga9b5ca9521874092ccb637a02d7b26ba2a64df3b823d2ab5f3f56ffb3f520eafb1',1,'fsl_usart.h']]], + ['kusart_5frxbreakflag',['kUSART_RxBreakFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610af0ae1c44d00b140e86202627084f8638',1,'fsl_usart.h']]], + ['kusart_5frxbreakinterruptenable',['kUSART_RxBreakInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a9c9626a150100989578d9f18f9b3d59a',1,'fsl_usart.h']]], + ['kusart_5frxidleflag',['kUSART_RxIdleFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610abc766d479d00f480e78d05f21f8e1d59',1,'fsl_usart.h']]], + ['kusart_5frxnoiseflag',['kUSART_RxNoiseFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610aef9ca7e74e386c6a6668cc2a0f43c9cd',1,'fsl_usart.h']]], + ['kusart_5frxnoiseinterruptenable',['kUSART_RxNoiseInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a7d342596a68c59d4e38bfe33c60f53c9',1,'fsl_usart.h']]], + ['kusart_5frxready',['kUSART_RxReady',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a03db476c7c52f9624dab00d9af430411',1,'fsl_usart.h']]], + ['kusart_5frxreadyinterruptenable',['kUSART_RxReadyInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853addb8c45f45a91da558ae553a72557445',1,'fsl_usart.h']]], + ['kusart_5frxsampleonfallingedge',['kUSART_RxSampleOnFallingEdge',['../a00023.html#gga786ba5b98195c3df810a061b6c0cca91a40fdc56c60a07652a4283491087eed6b',1,'fsl_usart.h']]], + ['kusart_5frxsampleonrisingedge',['kUSART_RxSampleOnRisingEdge',['../a00023.html#gga786ba5b98195c3df810a061b6c0cca91aea6908db956ab3f686c7ee54d68d401c',1,'fsl_usart.h']]], + ['kusart_5frxstartflag',['kUSART_RxStartFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a2fab8368a6a3246714c83405202626b3',1,'fsl_usart.h']]], + ['kusart_5frxstartinterruptenable',['kUSART_RxStartInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ae642012aae33bd8954699572e4adb475',1,'fsl_usart.h']]], + ['kusart_5fsyncmodedisabled',['kUSART_SyncModeDisabled',['../a00023.html#gga7ecd603d2579abbe714d58eb582821b8af7a378247f82677090007d0c38be78f2',1,'fsl_usart.h']]], + ['kusart_5fsyncmodemaster',['kUSART_SyncModeMaster',['../a00023.html#gga7ecd603d2579abbe714d58eb582821b8af279132afb0bee88bae3065c20c79ab2',1,'fsl_usart.h']]], + ['kusart_5fsyncmodeslave',['kUSART_SyncModeSlave',['../a00023.html#gga7ecd603d2579abbe714d58eb582821b8a71df5907ecd16c5f08fe1e6673064958',1,'fsl_usart.h']]], + ['kusart_5ftwostopbit',['kUSART_TwoStopBit',['../a00023.html#gga58ab07609b094f719f903475de6e57b4a3aee3195dc850778e33f2ebacf8847d3',1,'fsl_usart.h']]], + ['kusart_5ftxdisableflag',['kUSART_TxDisableFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a615387365fba3c394b1a595e9baa3c95',1,'fsl_usart.h']]], + ['kusart_5ftxdisableinterruptenable',['kUSART_TxDisableInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a2dae162d4f0509695fce62b0ed1b9e4b',1,'fsl_usart.h']]], + ['kusart_5ftxidleflag',['kUSART_TxIdleFlag',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610a8106fa188ea138f48c7740dcf5c2b294',1,'fsl_usart.h']]], + ['kusart_5ftxidleinterruptenable',['kUSART_TxIdleInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853ac5611ab6b973e6777a7d7db8321f62f2',1,'fsl_usart.h']]], + ['kusart_5ftxready',['kUSART_TxReady',['../a00023.html#ggaa6a81e7e82e236bb1c3c5ba306466610ab35037d2ed958a740984aa0a125d72aa',1,'fsl_usart.h']]], + ['kusart_5ftxreadyinterruptenable',['kUSART_TxReadyInterruptEnable',['../a00023.html#gga78b340bf3b25bfae957d0c5532b9b853a42c8946331d417404af48aed9fe53f88',1,'fsl_usart.h']]], + ['kwkt_5falarmflag',['kWKT_AlarmFlag',['../a00024.html#gga0c4c3a2aa689d7cdd0608eb1076d83aaaf60149e2b9f22db27ef273f412e86150',1,'fsl_wkt.h']]], + ['kwkt_5fdividedfroclocksource',['kWKT_DividedFROClockSource',['../a00024.html#ggaf985ebf5e165e2fbda510cac71cad222a22e7e8fe1fd3cc9d4d3278e0fb7bae32',1,'fsl_wkt.h']]], + ['kwkt_5fexternalclocksource',['kWKT_ExternalClockSource',['../a00024.html#ggaf985ebf5e165e2fbda510cac71cad222afe5c2695869b965f7833386743cc1147',1,'fsl_wkt.h']]], + ['kwkt_5flowpowerclocksource',['kWKT_LowPowerClockSource',['../a00024.html#ggaf985ebf5e165e2fbda510cac71cad222a3c617873be9cb696f53cca9529ca6dfc',1,'fsl_wkt.h']]], + ['kwkt_5frst_5fn_5fshift_5frstn',['kWKT_RST_N_SHIFT_RSTn',['../a00086.html#ggac287530f011b42355162470f09975770a80aae2b47fdc2701cb923d27ca9e5a7a',1,'fsl_reset.h']]], + ['kwwdt_5ftimeoutflag',['kWWDT_TimeoutFlag',['../a00025.html#ggaca0e9724bd1f25336527ea66c77e476faea9db9afc1f9c70872a755eaa24a4184',1,'fsl_wwdt.h']]], + ['kwwdt_5fwarningflag',['kWWDT_WarningFlag',['../a00025.html#ggaca0e9724bd1f25336527ea66c77e476fa825be03d771f06e1d6cf947ca78f857e',1,'fsl_wwdt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_61.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_61.html new file mode 100644 index 0000000..ecabe40 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_61.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_61.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_61.js new file mode 100644 index 0000000..a6a1c59 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_61.js @@ -0,0 +1,38 @@ +var searchData= +[ + ['acomp_5fclearinterruptsstatusflags',['ACOMP_ClearInterruptsStatusFlags',['../a00008.html#ga013efc3edfbbd3f7f5044fc7bc2ce802',1,'fsl_acomp.h']]], + ['acomp_5fdeinit',['ACOMP_Deinit',['../a00008.html#ga4e2589a3a011cb833649e301be7fff8c',1,'fsl_acomp.h']]], + ['acomp_5fenableinterrupts',['ACOMP_EnableInterrupts',['../a00008.html#ga33fc82023d54cc469fc62ed866a3ca19',1,'fsl_acomp.h']]], + ['acomp_5fgetdefaultconfig',['ACOMP_GetDefaultConfig',['../a00008.html#gae217e6b6f23e998b1bfa387e1f3f4181',1,'fsl_acomp.h']]], + ['acomp_5fgetinterruptsstatusflags',['ACOMP_GetInterruptsStatusFlags',['../a00008.html#ga331e1a82fe5f3d36ee0b10ddea928cd0',1,'fsl_acomp.h']]], + ['acomp_5fgetoutputstatusflags',['ACOMP_GetOutputStatusFlags',['../a00008.html#ga0ea4f61940e0c270858758d51ae1a4d3',1,'fsl_acomp.h']]], + ['acomp_5finit',['ACOMP_Init',['../a00008.html#gae8afb04a61cd16f74eba67061409cd30',1,'fsl_acomp.h']]], + ['acomp_5fsetinputchannel',['ACOMP_SetInputChannel',['../a00008.html#gaff80c9cfc3eb8114fcdb525b507f7ba3',1,'fsl_acomp.h']]], + ['acomp_5fsetladderconfig',['ACOMP_SetLadderConfig',['../a00008.html#ga6b5b26d4b5e00361635aede71b048ffb',1,'fsl_acomp.h']]], + ['adc_5fclearstatusflags',['ADC_ClearStatusFlags',['../a00009.html#gaa94fca220976d31ee991f1eff9cbe0db',1,'fsl_adc.h']]], + ['adc_5fdeinit',['ADC_Deinit',['../a00009.html#ga9e87d0842217dd30d2d9699df580e237',1,'fsl_adc.h']]], + ['adc_5fdisableinterrupts',['ADC_DisableInterrupts',['../a00009.html#gaa134681cb86361faad65aa8c501be403',1,'fsl_adc.h']]], + ['adc_5fdoselfcalibration',['ADC_DoSelfCalibration',['../a00009.html#ga6c5be196874795f6647b18fd1f3443b4',1,'fsl_adc.h']]], + ['adc_5fdosoftwaretriggerconvseqa',['ADC_DoSoftwareTriggerConvSeqA',['../a00009.html#ga13edd8c6ef6665907b00a6a819187292',1,'fsl_adc.h']]], + ['adc_5fdosoftwaretriggerconvseqb',['ADC_DoSoftwareTriggerConvSeqB',['../a00009.html#ga6bee3a133b58f1badcfded306544d58f',1,'fsl_adc.h']]], + ['adc_5fenableconvseqa',['ADC_EnableConvSeqA',['../a00009.html#ga0576bc613006f8a4d3bb6db93167be65',1,'fsl_adc.h']]], + ['adc_5fenableconvseqaburstmode',['ADC_EnableConvSeqABurstMode',['../a00009.html#ga5ed68a2a2706c5086136426769cb3a2b',1,'fsl_adc.h']]], + ['adc_5fenableconvseqb',['ADC_EnableConvSeqB',['../a00009.html#ga93453ff5ee1ccf1429d5035920cdcd10',1,'fsl_adc.h']]], + ['adc_5fenableconvseqbburstmode',['ADC_EnableConvSeqBBurstMode',['../a00009.html#ga4d72a0696ea69cf01a7d121b8e3d1efd',1,'fsl_adc.h']]], + ['adc_5fenableinterrupts',['ADC_EnableInterrupts',['../a00009.html#gad4368ec191782815efeea62a95ad3744',1,'fsl_adc.h']]], + ['adc_5fenablethresholdcompareinterrupt',['ADC_EnableThresholdCompareInterrupt',['../a00009.html#gaa1deefb49e6221ba772d755bf4aa1a57',1,'fsl_adc.h']]], + ['adc_5fgetchannelconversionresult',['ADC_GetChannelConversionResult',['../a00009.html#gacbd1fa05c3e1095dd2a8a741db533780',1,'fsl_adc.h']]], + ['adc_5fgetconvseqaglobalconversionresult',['ADC_GetConvSeqAGlobalConversionResult',['../a00009.html#ga06879c096d9702b2f378dc2db178e961',1,'fsl_adc.h']]], + ['adc_5fgetconvseqbglobalconversionresult',['ADC_GetConvSeqBGlobalConversionResult',['../a00009.html#gad857bbdf02a2e6e828e45a8573238198',1,'fsl_adc.h']]], + ['adc_5fgetdefaultconfig',['ADC_GetDefaultConfig',['../a00009.html#ga69c1682f87ee05264946329a2532792e',1,'fsl_adc.h']]], + ['adc_5fgetstatusflags',['ADC_GetStatusFlags',['../a00009.html#ga92ee1fdbb8cdadbdc1850e94afed432b',1,'fsl_adc.h']]], + ['adc_5finit',['ADC_Init',['../a00009.html#gaa407371ebd58e5aa7f75d38bfdad6169',1,'fsl_adc.h']]], + ['adc_5fsetchannelwiththresholdpair0',['ADC_SetChannelWithThresholdPair0',['../a00009.html#ga160dc82588afa2bca1388b35b8e3104d',1,'fsl_adc.h']]], + ['adc_5fsetchannelwiththresholdpair1',['ADC_SetChannelWithThresholdPair1',['../a00009.html#ga833046b34deacc484675105225a4b0fb',1,'fsl_adc.h']]], + ['adc_5fsetconvseqaconfig',['ADC_SetConvSeqAConfig',['../a00009.html#ga30e86d22d3680c1cf71d5121f162075b',1,'fsl_adc.h']]], + ['adc_5fsetconvseqahighpriority',['ADC_SetConvSeqAHighPriority',['../a00009.html#gad5ef8575589083a8db3f508aec014e14',1,'fsl_adc.h']]], + ['adc_5fsetconvseqbconfig',['ADC_SetConvSeqBConfig',['../a00009.html#gada2a96cbb4d3348b943ae8576bae8e51',1,'fsl_adc.h']]], + ['adc_5fsetconvseqbhighpriority',['ADC_SetConvSeqBHighPriority',['../a00009.html#ga51d600553349fbb81d96aaed4e1c22e4',1,'fsl_adc.h']]], + ['adc_5fsetthresholdpair0',['ADC_SetThresholdPair0',['../a00009.html#ga473aadea5ea926efb3bc116089a45191',1,'fsl_adc.h']]], + ['adc_5fsetthresholdpair1',['ADC_SetThresholdPair1',['../a00009.html#gac7a9fa5e3222604314a62d3b2f2331f7',1,'fsl_adc.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_63.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_63.html new file mode 100644 index 0000000..98924d8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_63.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_63.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_63.js new file mode 100644 index 0000000..8dd35eb --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_63.js @@ -0,0 +1,75 @@ +var searchData= +[ + ['capt_5fclearinterruptstatusflags',['CAPT_ClearInterruptStatusFlags',['../a00010.html#gaf59ec5edc272fd42a2b66231a16958eb',1,'fsl_capt.h']]], + ['capt_5fdeinit',['CAPT_Deinit',['../a00010.html#gaea982bc73916fdb713906a2ee49ca604',1,'fsl_capt.h']]], + ['capt_5fdisabledma',['CAPT_DisableDMA',['../a00010.html#ga70d4d9487f981082447042261d13385a',1,'fsl_capt.h']]], + ['capt_5fdisableinterrupts',['CAPT_DisableInterrupts',['../a00010.html#ga382fc66ff401d2ba9bdee87e3c8c09ce',1,'fsl_capt.h']]], + ['capt_5fenabledma',['CAPT_EnableDMA',['../a00010.html#ga4d8e5e396dee23cff57192632e98a84a',1,'fsl_capt.h']]], + ['capt_5fenableinterrupts',['CAPT_EnableInterrupts',['../a00010.html#ga14542b3f1b582974fb19b0bf359cfa17',1,'fsl_capt.h']]], + ['capt_5fgetdefaultconfig',['CAPT_GetDefaultConfig',['../a00010.html#gabbf90a4a70ccba5078feb488011079c5',1,'fsl_capt.h']]], + ['capt_5fgetinterruptstatusflags',['CAPT_GetInterruptStatusFlags',['../a00010.html#ga5c6166cad554e91dc0ed36d34b73ee47',1,'fsl_capt.h']]], + ['capt_5fgetstatusflags',['CAPT_GetStatusFlags',['../a00010.html#ga6f6b09a873e82dd2fd25338458d0ec0d',1,'fsl_capt.h']]], + ['capt_5fgettouchdata',['CAPT_GetTouchData',['../a00010.html#gaebd796b5bf0c9dff7df7921099d2febb',1,'fsl_capt.h']]], + ['capt_5finit',['CAPT_Init',['../a00010.html#gafc552b775b278e7e6ea930bb42ca8506',1,'fsl_capt.h']]], + ['capt_5fpollnow',['CAPT_PollNow',['../a00010.html#gae001e6c47608b339f65c8d2dab02c994',1,'fsl_capt.h']]], + ['capt_5fsetpollmode',['CAPT_SetPollMode',['../a00010.html#gaa5b1edec56bda3e46d42405ca8748b89',1,'fsl_capt.h']]], + ['capt_5fsetthreshold',['CAPT_SetThreshold',['../a00010.html#gae9b35ae6b1978ce06851ce86a32af06e',1,'fsl_capt.h']]], + ['clock_5fdeinitsysosc',['CLOCK_DeinitSysOsc',['../a00011.html#ga957f6f224315c19d89781bd344c42cb3',1,'fsl_clock.h']]], + ['clock_5fdeinitwdtosc',['CLOCK_DeinitWdtOsc',['../a00011.html#gadc80b6c53f806d771a3f6fd65c68a08d',1,'fsl_clock.h']]], + ['clock_5fdenitsystempll',['CLOCK_DenitSystemPll',['../a00011.html#gaf65f5b1578bde1ffc2a10ebf2ca66d1d',1,'fsl_clock.h']]], + ['clock_5fgetclockoutclkfreq',['CLOCK_GetClockOutClkFreq',['../a00011.html#gaf85cf02f515cd756873bf2a74ee143e2',1,'fsl_clock.h']]], + ['clock_5fgetcoresysclkfreq',['CLOCK_GetCoreSysClkFreq',['../a00011.html#gaca0f0dcb61434d727340ddde5f131d91',1,'fsl_clock.h']]], + ['clock_5fgetextclkfreq',['CLOCK_GetExtClkFreq',['../a00011.html#ga2d33480c8967a6bac98512e0c47c6b07',1,'fsl_clock.h']]], + ['clock_5fgetfreq',['CLOCK_GetFreq',['../a00011.html#ga53acae220d651789bb505c53c73ecf2b',1,'fsl_clock.h']]], + ['clock_5fgetfrg0clkfreq',['CLOCK_GetFRG0ClkFreq',['../a00011.html#ga7dd0bd48c4a5a68fef7f9524d8999b4b',1,'fsl_clock.h']]], + ['clock_5fgetfrg1clkfreq',['CLOCK_GetFRG1ClkFreq',['../a00011.html#gacb72cd4fce384788f3eb8ccc05e0ce7f',1,'fsl_clock.h']]], + ['clock_5fgetfrofreq',['CLOCK_GetFroFreq',['../a00011.html#gafe0b410109a29c465df0b4dcbb338ff3',1,'fsl_clock.h']]], + ['clock_5fgetmainclkfreq',['CLOCK_GetMainClkFreq',['../a00011.html#gaaa964f2c87ddd18a09c5201e22925fe6',1,'fsl_clock.h']]], + ['clock_5fgetsystempllfreq',['CLOCK_GetSystemPLLFreq',['../a00011.html#gae60a901716b1b7a581b9a1e4034479cd',1,'fsl_clock.h']]], + ['clock_5fgetsystempllinclockrate',['CLOCK_GetSystemPLLInClockRate',['../a00011.html#ga14b6a46da6b30e56001d7526a8546b42',1,'fsl_clock.h']]], + ['clock_5fgetuart0clkfreq',['CLOCK_GetUart0ClkFreq',['../a00011.html#ga47b7ce0a4c83a359f4bc1f2714a13761',1,'fsl_clock.h']]], + ['clock_5fgetuart1clkfreq',['CLOCK_GetUart1ClkFreq',['../a00011.html#ga10c8c8ccc077404a00e1121b5d18e4a8',1,'fsl_clock.h']]], + ['clock_5fgetuart2clkfreq',['CLOCK_GetUart2ClkFreq',['../a00011.html#ga07ba7d7b5ee69b71268190fe133c0a25',1,'fsl_clock.h']]], + ['clock_5fgetuart3clkfreq',['CLOCK_GetUart3ClkFreq',['../a00011.html#gabbdbb2bc96f1206cfe79fcf8896ae116',1,'fsl_clock.h']]], + ['clock_5fgetuart4clkfreq',['CLOCK_GetUart4ClkFreq',['../a00011.html#ga314692030453038d60194d3e6245345e',1,'fsl_clock.h']]], + ['clock_5fgetwdtoscfreq',['CLOCK_GetWdtOscFreq',['../a00011.html#ga054c63c43d8fc35586abf9aa6e8351a5',1,'fsl_clock.h']]], + ['clock_5finitextclkin',['CLOCK_InitExtClkin',['../a00011.html#ga6506e7cdad8dcf18347cdcb1acd8c17d',1,'fsl_clock.h']]], + ['clock_5finitsysosc',['CLOCK_InitSysOsc',['../a00011.html#ga2086545220b602cb4c0f1a141893447e',1,'fsl_clock.h']]], + ['clock_5finitsystempll',['CLOCK_InitSystemPll',['../a00011.html#ga5863562919d2a5cb6c8e8dcaf46cc236',1,'fsl_clock.h']]], + ['clock_5finitwdtosc',['CLOCK_InitWdtOsc',['../a00011.html#ga5786421429cdc95b34fdeb04d8ec9241',1,'fsl_clock.h']]], + ['clock_5finitxtalin',['CLOCK_InitXtalin',['../a00011.html#ga591437e580785afce2e3c74e021393f2',1,'fsl_clock.h']]], + ['clock_5fsetfrg0clkfreq',['CLOCK_SetFRG0ClkFreq',['../a00011.html#ga4eb9737ada73b9a575250de526433dff',1,'fsl_clock.h']]], + ['clock_5fsetfrg1clkfreq',['CLOCK_SetFRG1ClkFreq',['../a00011.html#ga4216bb5c85c6f6df1d128c9bfe5cd955',1,'fsl_clock.h']]], + ['clock_5fsetfrooscfreq',['CLOCK_SetFroOscFreq',['../a00011.html#gab61f56487f2c5e6d2ae2033848613d5e',1,'fsl_clock.h']]], + ['clock_5fsetfrooutclksrc',['CLOCK_SetFroOutClkSrc',['../a00011.html#ga468095bb082b9a2a50a2e05e1ced88c0',1,'fsl_clock.h']]], + ['clock_5fsetmainclksrc',['CLOCK_SetMainClkSrc',['../a00011.html#gaa6be3b84fd2a57ec1165954d6c4564e8',1,'fsl_clock.h']]], + ['crc_5fdeinit',['CRC_Deinit',['../a00012.html#ga7a4d725b011a98efb29a26bcca04c35b',1,'fsl_crc.h']]], + ['crc_5fget16bitresult',['CRC_Get16bitResult',['../a00012.html#ga5ce766fd31166d3b0d2d7ba594dac0ce',1,'fsl_crc.h']]], + ['crc_5fget32bitresult',['CRC_Get32bitResult',['../a00012.html#ga0c8ce306124e645b27798fad68f3ac4f',1,'fsl_crc.h']]], + ['crc_5fgetconfig',['CRC_GetConfig',['../a00012.html#gac745b626d9c7bd9f3da7986374483389',1,'fsl_crc.h']]], + ['crc_5fgetdefaultconfig',['CRC_GetDefaultConfig',['../a00012.html#gab681cd7c82fbafd927d6b22f23a81804',1,'fsl_crc.h']]], + ['crc_5finit',['CRC_Init',['../a00012.html#ga7114311534a33b6688f35ceaaa3f7832',1,'fsl_crc.h']]], + ['crc_5freset',['CRC_Reset',['../a00012.html#ga3c2e6ecc571510470849dc078685d71f',1,'fsl_crc.h']]], + ['crc_5fwritedata',['CRC_WriteData',['../a00012.html#ga33f99b0cb581e677dbc009a695adf5d5',1,'fsl_crc.h']]], + ['crc_5fwriteseed',['CRC_WriteSeed',['../a00012.html#ga43edd3bec710cb1ca121bfcadbc9b6f7',1,'fsl_crc.h']]], + ['ctimer_5fclearstatusflags',['CTIMER_ClearStatusFlags',['../a00013.html#ga43b7410d9c6aab6aad466bd481b9222b',1,'fsl_ctimer.h']]], + ['ctimer_5fdeinit',['CTIMER_Deinit',['../a00013.html#ga97daa711029883d46933204381f44c9f',1,'fsl_ctimer.h']]], + ['ctimer_5fdisableinterrupts',['CTIMER_DisableInterrupts',['../a00013.html#gaf1b8088779288346a7508dc7ef6e99d1',1,'fsl_ctimer.h']]], + ['ctimer_5fenableinterrupts',['CTIMER_EnableInterrupts',['../a00013.html#ga24464606cafc0f316116b164966a906e',1,'fsl_ctimer.h']]], + ['ctimer_5fgetdefaultconfig',['CTIMER_GetDefaultConfig',['../a00013.html#gac44f44c3f88125a41081ca2a7cf06223',1,'fsl_ctimer.h']]], + ['ctimer_5fgetenabledinterrupts',['CTIMER_GetEnabledInterrupts',['../a00013.html#ga635d2570c0274ff40f10ac7b5f3317df',1,'fsl_ctimer.h']]], + ['ctimer_5fgetoutputmatchstatus',['CTIMER_GetOutputMatchStatus',['../a00013.html#gae4d610de22fd8b8c9577e774dac88ac5',1,'fsl_ctimer.h']]], + ['ctimer_5fgetstatusflags',['CTIMER_GetStatusFlags',['../a00013.html#gad65b4a95cbfca13083f6d93e7a46f1cb',1,'fsl_ctimer.h']]], + ['ctimer_5fgettimercountvalue',['CTIMER_GetTimerCountValue',['../a00013.html#ga0b2f1b62dee7adf60574c3410e7bd26f',1,'fsl_ctimer.h']]], + ['ctimer_5finit',['CTIMER_Init',['../a00013.html#gacae8e1dbb60368ab01a9564de7eda037',1,'fsl_ctimer.h']]], + ['ctimer_5fregistercallback',['CTIMER_RegisterCallBack',['../a00013.html#gaa7de0b40e3127d3d8901398df50feb20',1,'fsl_ctimer.h']]], + ['ctimer_5freset',['CTIMER_Reset',['../a00013.html#ga7ea373165af081e0e1700f7a3ba56642',1,'fsl_ctimer.h']]], + ['ctimer_5fsetupcapture',['CTIMER_SetupCapture',['../a00013.html#gae279db71f27ceb5a6d15ad8d17cbd670',1,'fsl_ctimer.h']]], + ['ctimer_5fsetupmatch',['CTIMER_SetupMatch',['../a00013.html#ga64b1d0ba86d952b5ec30e201880c7bb5',1,'fsl_ctimer.h']]], + ['ctimer_5fsetuppwm',['CTIMER_SetupPwm',['../a00013.html#ga2a70f03b835a36e5b321861d0b0ebb41',1,'fsl_ctimer.h']]], + ['ctimer_5fsetuppwmperiod',['CTIMER_SetupPwmPeriod',['../a00013.html#gacb1f53d8b6a2b157194983172c448707',1,'fsl_ctimer.h']]], + ['ctimer_5fstarttimer',['CTIMER_StartTimer',['../a00013.html#gae9a75a0e18a696baa795ae67aa30a120',1,'fsl_ctimer.h']]], + ['ctimer_5fstoptimer',['CTIMER_StopTimer',['../a00013.html#ga3c7e8e1eb12e5f48ecca04c8128a9545',1,'fsl_ctimer.h']]], + ['ctimer_5fupdatepwmdutycycle',['CTIMER_UpdatePwmDutycycle',['../a00013.html#ga5d04834d4b29c8505b0a89b8875c2e78',1,'fsl_ctimer.h']]], + ['ctimer_5fupdatepwmpulseperiod',['CTIMER_UpdatePwmPulsePeriod',['../a00013.html#gad9f4a6073c669662f300d395d66e16bb',1,'fsl_ctimer.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_64.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_64.html new file mode 100644 index 0000000..bcfb550 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_64.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_64.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_64.js new file mode 100644 index 0000000..1f1d642 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_64.js @@ -0,0 +1,46 @@ +var searchData= +[ + ['dac_5fdeinit',['DAC_Deinit',['../a00014.html#gab9cec79763041b1df321a5839982feba',1,'fsl_dac.h']]], + ['dac_5fenablecounter',['DAC_EnableCounter',['../a00014.html#gabee47ca15a3a779e490f073aa1c43563',1,'fsl_dac.h']]], + ['dac_5fenabledma',['DAC_EnableDMA',['../a00014.html#ga24947c73973264f0d24d77394c3518e5',1,'fsl_dac.h']]], + ['dac_5fenabledoublebuffering',['DAC_EnableDoubleBuffering',['../a00014.html#ga5ecbd1908f7743934ccdb090ca0cb1d8',1,'fsl_dac.h']]], + ['dac_5fgetdefaultconfig',['DAC_GetDefaultConfig',['../a00014.html#ga18bbc1eedecdc090c14578740271db0e',1,'fsl_dac.h']]], + ['dac_5fgetdmainterruptrequestflag',['DAC_GetDMAInterruptRequestFlag',['../a00014.html#ga0a654edfcbb8a6fc80c51a3222fc4d7b',1,'fsl_dac.h']]], + ['dac_5finit',['DAC_Init',['../a00014.html#ga0331d8c8f699fac12c93a7796d961923',1,'fsl_dac.h']]], + ['dac_5fsetbuffervalue',['DAC_SetBufferValue',['../a00014.html#gabaeabddab20ad3c45aed786a7d12d350',1,'fsl_dac.h']]], + ['dac_5fsetcountervalue',['DAC_SetCounterValue',['../a00014.html#gabd7c9e5a5c0b6b35ed2854581f1c6fe8',1,'fsl_dac.h']]], + ['dma_5faborttransfer',['DMA_AbortTransfer',['../a00015.html#ga3c61d6121d88d2cdf287fc1cd72912fd',1,'fsl_dma.h']]], + ['dma_5fchannelisactive',['DMA_ChannelIsActive',['../a00015.html#ga0e6279e44ebd6778355f6e9e26e9a8b6',1,'fsl_dma.h']]], + ['dma_5fchannelisbusy',['DMA_ChannelIsBusy',['../a00015.html#gade4163a20de203d8ddfccbbeedb6caa9',1,'fsl_dma.h']]], + ['dma_5fconfigurechanneltrigger',['DMA_ConfigureChannelTrigger',['../a00015.html#ga04d2004d7d054b4f36676304bc2cd8ad',1,'fsl_dma.h']]], + ['dma_5fcreatedescriptor',['DMA_CreateDescriptor',['../a00015.html#gaf2955b2c961a33fe24d3154ec801f9fd',1,'fsl_dma.h']]], + ['dma_5fcreatehandle',['DMA_CreateHandle',['../a00015.html#ga5354ff2c0c1ec53e2cbd712169fc5558',1,'fsl_dma.h']]], + ['dma_5fdeinit',['DMA_Deinit',['../a00015.html#ga634ced9b86d7dc9543e0b4387123fcac',1,'fsl_dma.h']]], + ['dma_5fdisablechannel',['DMA_DisableChannel',['../a00015.html#ga8025eebc80c23fa9b5a3a4454855e347',1,'fsl_dma.h']]], + ['dma_5fdisablechannelinterrupts',['DMA_DisableChannelInterrupts',['../a00015.html#gac9873a0205538dffcba7bb59ed1450c5',1,'fsl_dma.h']]], + ['dma_5fdisablechannelperiphrq',['DMA_DisableChannelPeriphRq',['../a00015.html#gab2d2f88ed16097b2974d1955c725a5dc',1,'fsl_dma.h']]], + ['dma_5fdochannelsoftwaretrigger',['DMA_DoChannelSoftwareTrigger',['../a00015.html#gae8ffd8526580ed3b7ca3520024d0002c',1,'fsl_dma.h']]], + ['dma_5fenablechannel',['DMA_EnableChannel',['../a00015.html#gaa0293771d55ee1a7c42a8ffecb0728e7',1,'fsl_dma.h']]], + ['dma_5fenablechannelinterrupts',['DMA_EnableChannelInterrupts',['../a00015.html#ga02671643755a7f9395ce1f151a914630',1,'fsl_dma.h']]], + ['dma_5fenablechannelperiphrq',['DMA_EnableChannelPeriphRq',['../a00015.html#gaa706c05b4875366e7f84c83b8d09ae29',1,'fsl_dma.h']]], + ['dma_5fgetchannelpriority',['DMA_GetChannelPriority',['../a00015.html#ga1a5311b6ad708e230db517fb04f98a5f',1,'fsl_dma.h']]], + ['dma_5fgetremainingbytes',['DMA_GetRemainingBytes',['../a00015.html#gaf0197c674ce188bf214c13bc7be43e14',1,'fsl_dma.h']]], + ['dma_5finit',['DMA_Init',['../a00015.html#gade1b5efa61054ce538b37b181dd075bb',1,'fsl_dma.h']]], + ['dma_5finstalldescriptormemory',['DMA_InstallDescriptorMemory',['../a00015.html#ga9ba95776f25ee8eae5bdf9bf5fd9c9e6',1,'fsl_dma.h']]], + ['dma_5firqhandle',['DMA_IRQHandle',['../a00015.html#ga9da5a899fb0109cec4fc9303e5df0433',1,'fsl_dma.h']]], + ['dma_5floadchanneldescriptor',['DMA_LoadChannelDescriptor',['../a00015.html#gae7c3ca634a04a8afe85b1e55360b17aa',1,'fsl_dma.h']]], + ['dma_5floadchanneltransferconfig',['DMA_LoadChannelTransferConfig',['../a00015.html#ga956cf0c90e0562e5087475ceefcc489f',1,'fsl_dma.h']]], + ['dma_5fpreparechanneltransfer',['DMA_PrepareChannelTransfer',['../a00015.html#gad29055b5d8b160f94bb18abce476af7d',1,'fsl_dma.h']]], + ['dma_5fpreparetransfer',['DMA_PrepareTransfer',['../a00015.html#ga01ed2edd4ac04c70f83c7c3091ec4b65',1,'fsl_dma.h']]], + ['dma_5fsetcallback',['DMA_SetCallback',['../a00015.html#ga2eb9a831b9a84c5108097f770dbe90db',1,'fsl_dma.h']]], + ['dma_5fsetchannelconfig',['DMA_SetChannelConfig',['../a00015.html#gafc795a7c0b3e5f4bbf32c1eed3a9ea47',1,'fsl_dma.h']]], + ['dma_5fsetchannelconfigvalid',['DMA_SetChannelConfigValid',['../a00015.html#gaa200c0bd1a2d714f6cd002919ed8a213',1,'fsl_dma.h']]], + ['dma_5fsetchannelpriority',['DMA_SetChannelPriority',['../a00015.html#gad8ae76fc5d858b97de3362100af86df6',1,'fsl_dma.h']]], + ['dma_5fsetupchanneldescriptor',['DMA_SetupChannelDescriptor',['../a00015.html#ga6c69a736b8e5719fe01bb7d3b76f9088',1,'fsl_dma.h']]], + ['dma_5fsetupdescriptor',['DMA_SetupDescriptor',['../a00015.html#gabbdbf43b54f0a0029cd27c09c094de36',1,'fsl_dma.h']]], + ['dma_5fstarttransfer',['DMA_StartTransfer',['../a00015.html#gac6fb3f30e13c937cc00fe11218e6ec76',1,'fsl_dma.h']]], + ['dma_5fsubmitchanneldescriptor',['DMA_SubmitChannelDescriptor',['../a00015.html#gabf72e148a82d885b8b4ab3cffd549cc3',1,'fsl_dma.h']]], + ['dma_5fsubmitchanneltransfer',['DMA_SubmitChannelTransfer',['../a00015.html#gae702541c17430371d54c7aea5dbef084',1,'fsl_dma.h']]], + ['dma_5fsubmitchanneltransferparameter',['DMA_SubmitChannelTransferParameter',['../a00015.html#ga55d406dd20fa70d7cca25601bae20777',1,'fsl_dma.h']]], + ['dma_5fsubmittransfer',['DMA_SubmitTransfer',['../a00015.html#gade169c9d37d6a2ff949546268ba1c382',1,'fsl_dma.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_67.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_67.html new file mode 100644 index 0000000..39cc96d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_67.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_67.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_67.js new file mode 100644 index 0000000..9698a03 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_67.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['gpio_5fpininit',['GPIO_PinInit',['../a00016.html#ga9b8fa194d8fa5a1bf933a709d4dde014',1,'fsl_gpio.h']]], + ['gpio_5fpinread',['GPIO_PinRead',['../a00016.html#gabad8dfa62a3e414cc23ff8b32eea81d0',1,'fsl_gpio.h']]], + ['gpio_5fpinwrite',['GPIO_PinWrite',['../a00016.html#ga2a1113d96cdf973bb5b1eade3521adf8',1,'fsl_gpio.h']]], + ['gpio_5fportclear',['GPIO_PortClear',['../a00016.html#ga185ddb6848a644b40e0620ef6b4ce2cf',1,'fsl_gpio.h']]], + ['gpio_5fportinit',['GPIO_PortInit',['../a00016.html#ga6fabd21856d350fc0b60ffea3bbca200',1,'fsl_gpio.h']]], + ['gpio_5fportset',['GPIO_PortSet',['../a00016.html#ga7206f7b805b8a3c68044345dbbba0a41',1,'fsl_gpio.h']]], + ['gpio_5fporttoggle',['GPIO_PortToggle',['../a00016.html#ga07e3b8c21dad1debec7986f214a70975',1,'fsl_gpio.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_69.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_69.html new file mode 100644 index 0000000..954ac84 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_69.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_69.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_69.js new file mode 100644 index 0000000..452be69 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_69.js @@ -0,0 +1,61 @@ +var searchData= +[ + ['i2c_5fdisableinterrupts',['I2C_DisableInterrupts',['../a00017.html#gac3e053611231cc886bfa38831a1ac26e',1,'fsl_i2c.h']]], + ['i2c_5fenableinterrupts',['I2C_EnableInterrupts',['../a00017.html#ga0f6f1f2fe150661f8eb0a072665a9020',1,'fsl_i2c.h']]], + ['i2c_5fgetenabledinterrupts',['I2C_GetEnabledInterrupts',['../a00017.html#gae652236a25f1b4828d596f32190655f8',1,'fsl_i2c.h']]], + ['i2c_5fgetinstance',['I2C_GetInstance',['../a00017.html#ga07cc6bd20f700249c335893427bf462a',1,'fsl_i2c.h']]], + ['i2c_5fgetstatusflags',['I2C_GetStatusFlags',['../a00017.html#ga441017241044ffdb828385e473f5fb58',1,'fsl_i2c.h']]], + ['i2c_5fmasterclearstatusflags',['I2C_MasterClearStatusFlags',['../a00017.html#ga437271ffb955b77df0a5dee9ea80cc63',1,'fsl_i2c.h']]], + ['i2c_5fmasterdeinit',['I2C_MasterDeinit',['../a00017.html#gadcf7122f0a38d4d9da0f052fcb167957',1,'fsl_i2c.h']]], + ['i2c_5fmasterenable',['I2C_MasterEnable',['../a00017.html#ga164d97e40eb5ad625a41ad43cf938153',1,'fsl_i2c.h']]], + ['i2c_5fmastergetbusidlestate',['I2C_MasterGetBusIdleState',['../a00017.html#ga4b7617034ab51d77786141873fd6ee1c',1,'fsl_i2c.h']]], + ['i2c_5fmastergetdefaultconfig',['I2C_MasterGetDefaultConfig',['../a00017.html#gad69f2d63ea756dda60749ff6b09f587d',1,'fsl_i2c.h']]], + ['i2c_5fmasterinit',['I2C_MasterInit',['../a00017.html#ga29f967b3ae8487a36ba2a58deb01ccae',1,'fsl_i2c.h']]], + ['i2c_5fmasterreadblocking',['I2C_MasterReadBlocking',['../a00017.html#gaba04c62ee636dd8317c2235c3c82aa3b',1,'fsl_i2c.h']]], + ['i2c_5fmasterrepeatedstart',['I2C_MasterRepeatedStart',['../a00017.html#ga8137f7b333aafe1e3ff6c9d3852b7dbd',1,'fsl_i2c.h']]], + ['i2c_5fmasterreset',['I2C_MasterReset',['../a00017.html#ga09137caccbe9a57f6b2ca5e1ce9bdc50',1,'fsl_i2c.h']]], + ['i2c_5fmastersetbaudrate',['I2C_MasterSetBaudRate',['../a00017.html#gafeab1d5249a8b39c8d9e1a54a85c23f0',1,'fsl_i2c.h']]], + ['i2c_5fmasterstart',['I2C_MasterStart',['../a00017.html#ga7664234966e4162e952b6d57efcaa8a6',1,'fsl_i2c.h']]], + ['i2c_5fmasterstop',['I2C_MasterStop',['../a00017.html#gaf46a8cc094fc18c6cadea8de71448723',1,'fsl_i2c.h']]], + ['i2c_5fmastertransferabort',['I2C_MasterTransferAbort',['../a00017.html#gabb386e53b2bc64e29b2915bdfac36800',1,'fsl_i2c.h']]], + ['i2c_5fmastertransferblocking',['I2C_MasterTransferBlocking',['../a00017.html#ga35cae3a5b4aa50ce8db28e3eb703a027',1,'fsl_i2c.h']]], + ['i2c_5fmastertransfercreatehandle',['I2C_MasterTransferCreateHandle',['../a00017.html#ga31e3de02b57801c6896e6045c4a31268',1,'fsl_i2c.h']]], + ['i2c_5fmastertransfergetcount',['I2C_MasterTransferGetCount',['../a00017.html#ga7d720842e68161d2d52d56d119f20665',1,'fsl_i2c.h']]], + ['i2c_5fmastertransferhandleirq',['I2C_MasterTransferHandleIRQ',['../a00017.html#gad091cd1857d2bd8ce64583739b3a35d5',1,'fsl_i2c.h']]], + ['i2c_5fmastertransfernonblocking',['I2C_MasterTransferNonBlocking',['../a00017.html#gac7f76a04b6f6873c52ad176d58901fe9',1,'fsl_i2c.h']]], + ['i2c_5fmasterwriteblocking',['I2C_MasterWriteBlocking',['../a00017.html#ga3b4d71b59e118adc63afbc5434e5e7dd',1,'fsl_i2c.h']]], + ['i2c_5fslaveclearstatusflags',['I2C_SlaveClearStatusFlags',['../a00018.html#ga545c1a43d8d49c4675de493d45a4063a',1,'fsl_i2c.h']]], + ['i2c_5fslavedeinit',['I2C_SlaveDeinit',['../a00018.html#gadb50014db29dd75ea2001fb7bc837e77',1,'fsl_i2c.h']]], + ['i2c_5fslaveenable',['I2C_SlaveEnable',['../a00018.html#gacbb93d5ea4f4b40038f41e0e942a9ee1',1,'fsl_i2c.h']]], + ['i2c_5fslavegetdefaultconfig',['I2C_SlaveGetDefaultConfig',['../a00018.html#ga7115f80e28b62bbbd3be1a2a918529ba',1,'fsl_i2c.h']]], + ['i2c_5fslavegetreceivedaddress',['I2C_SlaveGetReceivedAddress',['../a00018.html#ga4c9fc06eeb8a3beb024f6525e4d99a0b',1,'fsl_i2c.h']]], + ['i2c_5fslaveinit',['I2C_SlaveInit',['../a00018.html#ga175a81b5ab74dd78469d6cdea690d8cc',1,'fsl_i2c.h']]], + ['i2c_5fslavereadblocking',['I2C_SlaveReadBlocking',['../a00018.html#ga89baaf8bc82b19c837032665e89a1707',1,'fsl_i2c.h']]], + ['i2c_5fslavesetaddress',['I2C_SlaveSetAddress',['../a00018.html#gacf721065f83982e3df651111183bf7b2',1,'fsl_i2c.h']]], + ['i2c_5fslavesetreceivebuffer',['I2C_SlaveSetReceiveBuffer',['../a00018.html#ga25b9c35089f0fc966facec3bf874c840',1,'fsl_i2c.h']]], + ['i2c_5fslavesetsendbuffer',['I2C_SlaveSetSendBuffer',['../a00018.html#gac7602b6897596348fe190e4fc63f1381',1,'fsl_i2c.h']]], + ['i2c_5fslavetransferabort',['I2C_SlaveTransferAbort',['../a00018.html#ga5ae9f5e6e854d14d33ba3029128bd6f0',1,'fsl_i2c.h']]], + ['i2c_5fslavetransfercreatehandle',['I2C_SlaveTransferCreateHandle',['../a00018.html#gac9b90f575d92ff8ad3cc350a5c8ad1b9',1,'fsl_i2c.h']]], + ['i2c_5fslavetransfergetcount',['I2C_SlaveTransferGetCount',['../a00018.html#gabf38a498bd3527ea0b7cc947ae71e17e',1,'fsl_i2c.h']]], + ['i2c_5fslavetransferhandleirq',['I2C_SlaveTransferHandleIRQ',['../a00018.html#ga097c0b20503381de44cccba311dcf236',1,'fsl_i2c.h']]], + ['i2c_5fslavetransfernonblocking',['I2C_SlaveTransferNonBlocking',['../a00018.html#gaa387d81ea08a9d4b39cfeb3dfec505f7',1,'fsl_i2c.h']]], + ['i2c_5fslavewriteblocking',['I2C_SlaveWriteBlocking',['../a00018.html#ga280404c6b1ede542f2c1c20bd382869c',1,'fsl_i2c.h']]], + ['iap_5fblankchecksector',['IAP_BlankCheckSector',['../a00088.html#ga93a68a9ca640a51b56350d59cac4dd7c',1,'fsl_iap.h']]], + ['iap_5fcompare',['IAP_Compare',['../a00088.html#ga48b79c8dc56de9714927e70ad230fa0b',1,'fsl_iap.h']]], + ['iap_5fcopyramtoflash',['IAP_CopyRamToFlash',['../a00088.html#ga6b58df04b8aae97c7e31884f3fe3413f',1,'fsl_iap.h']]], + ['iap_5ferasepage',['IAP_ErasePage',['../a00088.html#ga93474c7fb9be2c15eabc9dbf73c99bdb',1,'fsl_iap.h']]], + ['iap_5ferasesector',['IAP_EraseSector',['../a00088.html#ga0093db979d7b9afca6dca250f42b2eef',1,'fsl_iap.h']]], + ['iap_5fextendedflashsignatureread',['IAP_ExtendedFlashSignatureRead',['../a00088.html#gaf3d4c53d3b36200b76c7c2e9185e9350',1,'fsl_iap.h']]], + ['iap_5fpreparesectorforwrite',['IAP_PrepareSectorForWrite',['../a00088.html#ga361041aa626a50391c40c9d6936ba2c0',1,'fsl_iap.h']]], + ['iap_5freadbootcodeversion',['IAP_ReadBootCodeVersion',['../a00088.html#ga747cfb2ed95cefa6f39ae2ad089f8ade',1,'fsl_iap.h']]], + ['iap_5freadfaimpage',['IAP_ReadFAIMPage',['../a00088.html#ga4cc5332eb289fd1c999a47c0c22b8f2c',1,'fsl_iap.h']]], + ['iap_5freadpartid',['IAP_ReadPartID',['../a00088.html#ga916f8b461de93f08044df1724290dcbd',1,'fsl_iap.h']]], + ['iap_5freaduniqueid',['IAP_ReadUniqueID',['../a00088.html#ga258d8c49d494cbd0d18321af56e11440',1,'fsl_iap.h']]], + ['iap_5freinvokeisp',['IAP_ReinvokeISP',['../a00088.html#ga98407c578584b1d88d7be1b3e6d9656a',1,'fsl_iap.h']]], + ['iap_5fwritefaimpage',['IAP_WriteFAIMPage',['../a00088.html#ga87a985be230bedefd5e3560dde51d788',1,'fsl_iap.h']]], + ['inputmux_5fattachsignal',['INPUTMUX_AttachSignal',['../a00089.html#gaa4f141e3874109e45c2a6f9be027e0ee',1,'fsl_inputmux.h']]], + ['inputmux_5fdeinit',['INPUTMUX_Deinit',['../a00089.html#gaf84e3b0d7a06af86ea6f1ac0d6edf382',1,'fsl_inputmux.h']]], + ['inputmux_5finit',['INPUTMUX_Init',['../a00089.html#gae02fecc3b8aab2a9d3f40f07ca7114a4',1,'fsl_inputmux.h']]], + ['iocon_5fpinmuxset',['IOCON_PinMuxSet',['../a00019.html#gaf9258f56192a94928f67940eee5dd879',1,'fsl_iocon.h']]], + ['iocon_5fsetpinmuxing',['IOCON_SetPinMuxing',['../a00019.html#gaf2cc5d2d92b4e2898a197479e77a326e',1,'fsl_iocon.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_6d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_6d.html new file mode 100644 index 0000000..f721e11 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_6d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_6d.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_6d.js new file mode 100644 index 0000000..f63e0e0 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_6d.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['mrt_5fclearstatusflags',['MRT_ClearStatusFlags',['../a00020.html#ga959db20281cfce080c684bd94f667799',1,'fsl_mrt.h']]], + ['mrt_5fdeinit',['MRT_Deinit',['../a00020.html#ga5d988ee09b604ab28f1b37320ee8d2d9',1,'fsl_mrt.h']]], + ['mrt_5fdisableinterrupts',['MRT_DisableInterrupts',['../a00020.html#ga7a8066680089523fa602dbe58b0c0505',1,'fsl_mrt.h']]], + ['mrt_5fenableinterrupts',['MRT_EnableInterrupts',['../a00020.html#gae875817838659e596dc1cb1527c948c3',1,'fsl_mrt.h']]], + ['mrt_5fgetcurrenttimercount',['MRT_GetCurrentTimerCount',['../a00020.html#ga7c0bbb20b4abd7450f860277ef9d8a20',1,'fsl_mrt.h']]], + ['mrt_5fgetdefaultconfig',['MRT_GetDefaultConfig',['../a00020.html#gad30aa85105a47b708fd5880a929e5e84',1,'fsl_mrt.h']]], + ['mrt_5fgetenabledinterrupts',['MRT_GetEnabledInterrupts',['../a00020.html#ga2e666900eef9bdbd9d9e587d2b7ca2c2',1,'fsl_mrt.h']]], + ['mrt_5fgetidlechannel',['MRT_GetIdleChannel',['../a00020.html#ga320ba098c93a30174254eb763dd37dde',1,'fsl_mrt.h']]], + ['mrt_5fgetstatusflags',['MRT_GetStatusFlags',['../a00020.html#gafa8493a0faee1cc356da26ca99a54da8',1,'fsl_mrt.h']]], + ['mrt_5finit',['MRT_Init',['../a00020.html#ga44091408531a61dfac7c4ee4982be317',1,'fsl_mrt.h']]], + ['mrt_5fsetupchannelmode',['MRT_SetupChannelMode',['../a00020.html#ga8f4d38afa34e99ba521d9ca08be06355',1,'fsl_mrt.h']]], + ['mrt_5fstarttimer',['MRT_StartTimer',['../a00020.html#ga388dd5041e6c179d637e17cd6e5a607e',1,'fsl_mrt.h']]], + ['mrt_5fstoptimer',['MRT_StopTimer',['../a00020.html#ga7620866a54acdcc17abab2b46a94dc6c',1,'fsl_mrt.h']]], + ['mrt_5fupdatetimerperiod',['MRT_UpdateTimerPeriod',['../a00020.html#ga57f3d18e0ec88a5eb04b3282e0f3dc95',1,'fsl_mrt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_70.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_70.html new file mode 100644 index 0000000..c7cadcf --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_70.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_70.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_70.js new file mode 100644 index 0000000..c2c2dbf --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_70.js @@ -0,0 +1,55 @@ +var searchData= +[ + ['pint_5fdeinit',['PINT_Deinit',['../a00094.html#ga78ffa3e09e17db8dc6a9038123ad1c46',1,'fsl_pint.h']]], + ['pint_5fdisablecallback',['PINT_DisableCallback',['../a00094.html#gada262638d555d9a503ddcdbed24ec475',1,'fsl_pint.h']]], + ['pint_5fdisablecallbackbyindex',['PINT_DisableCallbackByIndex',['../a00094.html#gad7300bf374c0cdc65fadff76f3ee7e5c',1,'fsl_pint.h']]], + ['pint_5fenablecallback',['PINT_EnableCallback',['../a00094.html#gac6b1406205adace6696a1647250ad76d',1,'fsl_pint.h']]], + ['pint_5fenablecallbackbyindex',['PINT_EnableCallbackByIndex',['../a00094.html#ga2cb0ee73a24657dd6994cb00b78c3137',1,'fsl_pint.h']]], + ['pint_5finit',['PINT_Init',['../a00094.html#gaf043d142dac622bedd50b736b52ac6e9',1,'fsl_pint.h']]], + ['pint_5fpatternmatchconfig',['PINT_PatternMatchConfig',['../a00094.html#ga1dc66cd865640c0b60eb128a868eab37',1,'fsl_pint.h']]], + ['pint_5fpatternmatchdisable',['PINT_PatternMatchDisable',['../a00094.html#ga4dd886dc387a64a5cb146ccd7297e1e1',1,'fsl_pint.h']]], + ['pint_5fpatternmatchdisablerxev',['PINT_PatternMatchDisableRXEV',['../a00094.html#ga73f0e7280f898bf99fe92b3519878a77',1,'fsl_pint.h']]], + ['pint_5fpatternmatchenable',['PINT_PatternMatchEnable',['../a00094.html#ga8911d499fb65ffe496c01f65bad9314f',1,'fsl_pint.h']]], + ['pint_5fpatternmatchenablerxev',['PINT_PatternMatchEnableRXEV',['../a00094.html#gaf5754b4b1d1436c359dde18101657d4e',1,'fsl_pint.h']]], + ['pint_5fpatternmatchgetconfig',['PINT_PatternMatchGetConfig',['../a00094.html#ga6d4f8e83cec4bc716231c97c2ceb5421',1,'fsl_pint.h']]], + ['pint_5fpatternmatchgetstatus',['PINT_PatternMatchGetStatus',['../a00094.html#ga74b3eece6c6eabc38f3194b125ff80d5',1,'fsl_pint.h']]], + ['pint_5fpatternmatchgetstatusall',['PINT_PatternMatchGetStatusAll',['../a00094.html#ga567b159bbfa265ed02c4900769ed8fe4',1,'fsl_pint.h']]], + ['pint_5fpatternmatchresetdetectlogic',['PINT_PatternMatchResetDetectLogic',['../a00094.html#ga00d40f5f01c445206f1f800dcc7b6e89',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrfallflag',['PINT_PinInterruptClrFallFlag',['../a00094.html#ga055c655c611b5645ce6903557ef809bb',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrfallflagall',['PINT_PinInterruptClrFallFlagAll',['../a00094.html#ga11c44cbe5b42c79b22a3053c85b1e5d0',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrriseflag',['PINT_PinInterruptClrRiseFlag',['../a00094.html#ga269af5856a4cfd5d2a171b4777d6884a',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrriseflagall',['PINT_PinInterruptClrRiseFlagAll',['../a00094.html#ga53dd5706866fa0313689db6e4d9c1a9b',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrstatus',['PINT_PinInterruptClrStatus',['../a00094.html#gab784e6aea0129b0c90164462bd0dbac5',1,'fsl_pint.h']]], + ['pint_5fpininterruptclrstatusall',['PINT_PinInterruptClrStatusAll',['../a00094.html#gace94acb3f70964230b2606fdbeb5f58b',1,'fsl_pint.h']]], + ['pint_5fpininterruptconfig',['PINT_PinInterruptConfig',['../a00094.html#ga363edbba9536380728e44bd7d1a0e7df',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetconfig',['PINT_PinInterruptGetConfig',['../a00094.html#ga12c568c9b7f6d46257dc63505a381701',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetfallflag',['PINT_PinInterruptGetFallFlag',['../a00094.html#gaace443444dec2e5b7e3e20cf69c53def',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetfallflagall',['PINT_PinInterruptGetFallFlagAll',['../a00094.html#ga58eced039e8c793b7ff148d6cfacde5b',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetriseflag',['PINT_PinInterruptGetRiseFlag',['../a00094.html#gaec7a3986f92f8c11a70a80af1a93a3b6',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetriseflagall',['PINT_PinInterruptGetRiseFlagAll',['../a00094.html#ga08b623f67c277521182f8c9e630037ae',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetstatus',['PINT_PinInterruptGetStatus',['../a00094.html#ga99a96e386a822de59ac2d60149ec47f3',1,'fsl_pint.h']]], + ['pint_5fpininterruptgetstatusall',['PINT_PinInterruptGetStatusAll',['../a00094.html#gab5dbaf58c90b1ef54bcd2c5dba9e178f',1,'fsl_pint.h']]], + ['power_5fclrdeeppowerdownmodeflag',['POWER_ClrDeepPowerDownModeFlag',['../a00085.html#ga4b9f6c3aa18e60b7a85edfa8857906ed',1,'fsl_power.h']]], + ['power_5fclrsleepmodeflag',['POWER_ClrSleepModeFlag',['../a00085.html#ga7069e59acd0a3e196bb54b7a5bcead3d',1,'fsl_power.h']]], + ['power_5fdeepsleepconfig',['POWER_DeepSleepConfig',['../a00085.html#ga64687ae9aee146f932c9d822633ed751',1,'fsl_power.h']]], + ['power_5fdisabledeepsleep',['POWER_DisableDeepSleep',['../a00085.html#gabea720a67b6b06b187a5781b9955dc9c',1,'fsl_power.h']]], + ['power_5fdisablepd',['POWER_DisablePD',['../a00085.html#ga40a1d0c80f5189e9c56133a2bc15a4c2',1,'fsl_power.h']]], + ['power_5fenabledeepsleep',['POWER_EnableDeepSleep',['../a00085.html#gae9733cfb042126b04d237cc8db40dba0',1,'fsl_power.h']]], + ['power_5fenablelpo',['POWER_EnableLPO',['../a00085.html#ga86ad2183a772150f3c72d5aaf158afaa',1,'fsl_power.h']]], + ['power_5fenablelpoindeeppowerdownmode',['POWER_EnableLPOInDeepPowerDownMode',['../a00085.html#gaf5a1bdc5ba7e3b43083fdb74f0154fb3',1,'fsl_power.h']]], + ['power_5fenablenondpd',['POWER_EnableNonDpd',['../a00085.html#ga7bfb95e1397b0fc1b02b740458667d4c',1,'fsl_power.h']]], + ['power_5fenablepd',['POWER_EnablePD',['../a00085.html#gacf3a138e73725bb8c50290295259bfa4',1,'fsl_power.h']]], + ['power_5fenableresetpinfordeeppowerdown',['POWER_EnableResetPinForDeepPowerDown',['../a00085.html#ga2017fc3e4b370ec4528136d4f4bc08b5',1,'fsl_power.h']]], + ['power_5fenablewakeuppinfordeeppowerdown',['POWER_EnableWakeupPinForDeepPowerDown',['../a00085.html#ga05cbdf9affa49e1ea898935937a94bc1',1,'fsl_power.h']]], + ['power_5fenablewktclkin',['POWER_EnableWktClkIn',['../a00085.html#ga7ee1c99dbc8430bf973857b641d677e9',1,'fsl_power.h']]], + ['power_5fenterdeeppowerdownmode',['POWER_EnterDeepPowerDownMode',['../a00085.html#gafd390219700f64b63df3ded05212bda5',1,'fsl_power.h']]], + ['power_5fenterdeepsleep',['POWER_EnterDeepSleep',['../a00085.html#ga4b0c77a348378a9c77539fc160c239df',1,'fsl_power.h']]], + ['power_5fenterpowerdown',['POWER_EnterPowerDown',['../a00085.html#ga85cddf883d8412b35f3648fa5a62b136',1,'fsl_power.h']]], + ['power_5fentersleep',['POWER_EnterSleep',['../a00085.html#ga6ad77a0ddbf43076a49a207534c6b7f8',1,'fsl_power.h']]], + ['power_5fgetdeeppowerdownmodeflag',['POWER_GetDeepPowerDownModeFlag',['../a00085.html#ga7b82522f086af61786aa316142d3540c',1,'fsl_power.h']]], + ['power_5fgetretaindata',['POWER_GetRetainData',['../a00085.html#ga2cef71a7429671e6aaf71b3c40f1bc23',1,'fsl_power.h']]], + ['power_5fgetsleepmodeflag',['POWER_GetSleepModeFlag',['../a00085.html#gaa25d9a439cb1779e76c107cfc9c1a86e',1,'fsl_power.h']]], + ['power_5fsetbodlevel',['POWER_SetBodLevel',['../a00085.html#ga85b6d46e43b818ba54dba92256db4499',1,'fsl_power.h']]], + ['power_5fsetretaindata',['POWER_SetRetainData',['../a00085.html#gada7daa74280566725bfa2854613c91cc',1,'fsl_power.h']]], + ['power_5fwakeupconfig',['POWER_WakeUpConfig',['../a00085.html#ga83d78eac8ce2faa5f92738c681846d5b',1,'fsl_power.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_72.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_72.html new file mode 100644 index 0000000..de10844 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_72.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_72.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_72.js new file mode 100644 index 0000000..9dc78b4 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_72.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['reset_5fperipheralreset',['RESET_PeripheralReset',['../a00086.html#gac33f3428cb55ce07ae67802e5f534ffc',1,'fsl_reset.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_73.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_73.html new file mode 100644 index 0000000..a895245 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_73.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_73.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_73.js new file mode 100644 index 0000000..f82d518 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_73.js @@ -0,0 +1,77 @@ +var searchData= +[ + ['sctimer_5fcleareventinstate',['SCTIMER_ClearEventInState',['../a00021.html#gabb782f507653f2afc07c2464a7cc1a13',1,'fsl_sctimer.h']]], + ['sctimer_5fclearstatusflags',['SCTIMER_ClearStatusFlags',['../a00021.html#gab1c0cd81deb689171e374d4291588624',1,'fsl_sctimer.h']]], + ['sctimer_5fcreateandscheduleevent',['SCTIMER_CreateAndScheduleEvent',['../a00021.html#ga2fc1121a0f6dd3f5bc822516f85f096c',1,'fsl_sctimer.h']]], + ['sctimer_5fdeinit',['SCTIMER_Deinit',['../a00021.html#ga467e692ef9a508c75d2dff4d3bb3587e',1,'fsl_sctimer.h']]], + ['sctimer_5fdisableinterrupts',['SCTIMER_DisableInterrupts',['../a00021.html#ga5f89a72162bac80f840b04445bcbfa70',1,'fsl_sctimer.h']]], + ['sctimer_5fenableinterrupts',['SCTIMER_EnableInterrupts',['../a00021.html#ga484ff3205b735b4e24655920dd48a85a',1,'fsl_sctimer.h']]], + ['sctimer_5feventhandleirq',['SCTIMER_EventHandleIRQ',['../a00021.html#ga265b0765ff1337a4d13328351b3cebdc',1,'fsl_sctimer.h']]], + ['sctimer_5fgetcounterstate',['SCTIMER_GetCounterState',['../a00021.html#ga99d4a6ea09ccf78fae7c3dec39dff28b',1,'fsl_sctimer.h']]], + ['sctimer_5fgetcountvalue',['SCTIMER_GetCOUNTValue',['../a00021.html#ga87a03f50c6f03e0302fa79cd5cbad644',1,'fsl_sctimer.h']]], + ['sctimer_5fgetcurrentstate',['SCTIMER_GetCurrentState',['../a00021.html#ga7548cb37efdba143e5c312f7b4461cf7',1,'fsl_sctimer.h']]], + ['sctimer_5fgetdefaultconfig',['SCTIMER_GetDefaultConfig',['../a00021.html#ga926706158370867f6a1827af9899c5e4',1,'fsl_sctimer.h']]], + ['sctimer_5fgetenabledinterrupts',['SCTIMER_GetEnabledInterrupts',['../a00021.html#gab5d439e5c8778b29945a228e9bbc62ea',1,'fsl_sctimer.h']]], + ['sctimer_5fgeteventinstate',['SCTIMER_GetEventInState',['../a00021.html#ga0fe5c5cf3afe091395e5d13de17e4bf5',1,'fsl_sctimer.h']]], + ['sctimer_5fgetstatusflags',['SCTIMER_GetStatusFlags',['../a00021.html#ga880638c2ffe076f868b5d5c8dc480630',1,'fsl_sctimer.h']]], + ['sctimer_5fincreasestate',['SCTIMER_IncreaseState',['../a00021.html#ga211359f9ee3b67eaa96d73b23ce1650d',1,'fsl_sctimer.h']]], + ['sctimer_5finit',['SCTIMER_Init',['../a00021.html#ga44111f6438ee9d11f5c3b26e3c049e47',1,'fsl_sctimer.h']]], + ['sctimer_5fscheduleevent',['SCTIMER_ScheduleEvent',['../a00021.html#ga54f3ea55cf8cab5a78e26a522536d2fe',1,'fsl_sctimer.h']]], + ['sctimer_5fsetcallback',['SCTIMER_SetCallback',['../a00021.html#ga9b685c1dd4fbc33496d5e6445c4d08c7',1,'fsl_sctimer.h']]], + ['sctimer_5fsetcounterstate',['SCTIMER_SetCounterState',['../a00021.html#ga17cec8d7f62c6f80bb516febc654d37d',1,'fsl_sctimer.h']]], + ['sctimer_5fsetcountvalue',['SCTIMER_SetCOUNTValue',['../a00021.html#gabde2ce6ca0f22c9210f145d6493f3f5c',1,'fsl_sctimer.h']]], + ['sctimer_5fseteventinstate',['SCTIMER_SetEventInState',['../a00021.html#ga8a95c3455d06a5be07c07c787699b2f9',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcaptureaction',['SCTIMER_SetupCaptureAction',['../a00021.html#ga6217a77dba0bc787acde88eabbe4ba55',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcounterhaltaction',['SCTIMER_SetupCounterHaltAction',['../a00021.html#gaca74f1feb997dc028a4143a9c84f5a2c',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcounterlimitaction',['SCTIMER_SetupCounterLimitAction',['../a00021.html#gac1e1011a301cf83283996490249a596b',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcounterstartaction',['SCTIMER_SetupCounterStartAction',['../a00021.html#gabd997ff4aff2c1b1a2c763596db93c6c',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupcounterstopaction',['SCTIMER_SetupCounterStopAction',['../a00021.html#gab2412179ebab1d913976b250290ca06d',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupdmatriggeraction',['SCTIMER_SetupDmaTriggerAction',['../a00021.html#ga48cc738532c4d5c86c423547f79da554',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupeventactivedirection',['SCTIMER_SetupEventActiveDirection',['../a00021.html#ga22c2cd3dff04d7771f94401fb841446e',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupnextstateaction',['SCTIMER_SetupNextStateAction',['../a00021.html#ga2645513f40654fdc1812a8990e5f894b',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupnextstateactionwithldmethod',['SCTIMER_SetupNextStateActionwithLdMethod',['../a00021.html#gaf926083b406d26456d2fabf2bfd55a39',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupoutputclearaction',['SCTIMER_SetupOutputClearAction',['../a00021.html#ga231084960a5fa1f5bf67ee5e5bc9dead',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupoutputsetaction',['SCTIMER_SetupOutputSetAction',['../a00021.html#ga22353e32ba4fb216277824ce940ad786',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupoutputtoggleaction',['SCTIMER_SetupOutputToggleAction',['../a00021.html#gae6074aeaf3d4004a721d91c50f6a74ad',1,'fsl_sctimer.h']]], + ['sctimer_5fsetuppwm',['SCTIMER_SetupPwm',['../a00021.html#ga8f372273782f269956227b810e56a844',1,'fsl_sctimer.h']]], + ['sctimer_5fsetupstateldmethodaction',['SCTIMER_SetupStateLdMethodAction',['../a00021.html#gafdf6317a3faf2068d9ce8f0a8082203c',1,'fsl_sctimer.h']]], + ['sctimer_5fstarttimer',['SCTIMER_StartTimer',['../a00021.html#gac025765188aa53661325d324569b739c',1,'fsl_sctimer.h']]], + ['sctimer_5fstoptimer',['SCTIMER_StopTimer',['../a00021.html#ga3ba946707276c23d531ebd3e21d67427',1,'fsl_sctimer.h']]], + ['sctimer_5fupdatepwmdutycycle',['SCTIMER_UpdatePwmDutycycle',['../a00021.html#ga745f5f328599202df06a81b6fe307b63',1,'fsl_sctimer.h']]], + ['sdk_5fdelayatleastus',['SDK_DelayAtLeastUs',['../a00087.html#ga4f9121590e5b8fe025d706ff2fe5da36',1,'fsl_common.h']]], + ['sdk_5ffree',['SDK_Free',['../a00087.html#ga0be5caec9b8493d87cc849714bd47865',1,'fsl_common.h']]], + ['sdk_5fmalloc',['SDK_Malloc',['../a00087.html#ga4e1420d9e817ebe0e8973420411de015',1,'fsl_common.h']]], + ['spi_5fclearstatusflags',['SPI_ClearStatusFlags',['../a00022.html#ga794c7435fa108012df54bb6294f20505',1,'fsl_spi.h']]], + ['spi_5fdeinit',['SPI_Deinit',['../a00022.html#gaac0bc2b87ea2eb7eeba78d9449d4dbbf',1,'fsl_spi.h']]], + ['spi_5fdisableinterrupts',['SPI_DisableInterrupts',['../a00022.html#ga6289b192b135592b7b0996c05422be4d',1,'fsl_spi.h']]], + ['spi_5fenable',['SPI_Enable',['../a00022.html#ga6d32506242b9596989efbbb2d030e997',1,'fsl_spi.h']]], + ['spi_5fenableinterrupts',['SPI_EnableInterrupts',['../a00022.html#gab87ea500d8f74369882afe52a81d1199',1,'fsl_spi.h']]], + ['spi_5fgetinstance',['SPI_GetInstance',['../a00022.html#gad823d00c394f6ca35c391dc178a25334',1,'fsl_spi.h']]], + ['spi_5fgetstatusflags',['SPI_GetStatusFlags',['../a00022.html#ga9e7412ad45aeb7f620fe34559034ad2e',1,'fsl_spi.h']]], + ['spi_5fismaster',['SPI_IsMaster',['../a00022.html#ga97782e786464ec2de946bd42e63aefbc',1,'fsl_spi.h']]], + ['spi_5fmastergetdefaultconfig',['SPI_MasterGetDefaultConfig',['../a00022.html#ga45c08fc078ae334b79fb844379140838',1,'fsl_spi.h']]], + ['spi_5fmasterinit',['SPI_MasterInit',['../a00022.html#gab36e8463576abeded221a1e5a1eec01c',1,'fsl_spi.h']]], + ['spi_5fmastersetbaudrate',['SPI_MasterSetBaudRate',['../a00022.html#ga3ad4747ccc31c142c54af5639cd49328',1,'fsl_spi.h']]], + ['spi_5fmastertransferabort',['SPI_MasterTransferAbort',['../a00022.html#gae90962a54978acf05ca7780489301eb4',1,'fsl_spi.h']]], + ['spi_5fmastertransferblocking',['SPI_MasterTransferBlocking',['../a00022.html#ga5b05095245ecf01258e64cc0458fb2e9',1,'fsl_spi.h']]], + ['spi_5fmastertransfercreatehandle',['SPI_MasterTransferCreateHandle',['../a00022.html#gad0d8eaa132d8c882d8a42286ecfbab64',1,'fsl_spi.h']]], + ['spi_5fmastertransfergetcount',['SPI_MasterTransferGetCount',['../a00022.html#gabde0dccfb0783d103b9cf57e0202582f',1,'fsl_spi.h']]], + ['spi_5fmastertransferhandleirq',['SPI_MasterTransferHandleIRQ',['../a00022.html#ga645d041a92bde312d6cf64517c618c41',1,'fsl_spi.h']]], + ['spi_5fmastertransfernonblocking',['SPI_MasterTransferNonBlocking',['../a00022.html#ga820c78a32fa29735168d2e517f4881a1',1,'fsl_spi.h']]], + ['spi_5freaddata',['SPI_ReadData',['../a00022.html#ga08dec9d9d6abf910589a591f1cc52f58',1,'fsl_spi.h']]], + ['spi_5fsetdummydata',['SPI_SetDummyData',['../a00022.html#gac75808445b18f687387bea02892a5246',1,'fsl_spi.h']]], + ['spi_5fsettransferdelay',['SPI_SetTransferDelay',['../a00022.html#gad4071c9fc158109945e724872f4760b6',1,'fsl_spi.h']]], + ['spi_5fslavegetdefaultconfig',['SPI_SlaveGetDefaultConfig',['../a00022.html#gac000b63ed033f57a9eee342a8c8e67f2',1,'fsl_spi.h']]], + ['spi_5fslaveinit',['SPI_SlaveInit',['../a00022.html#gae40850ce14ba74ea75b3eef79beecf8a',1,'fsl_spi.h']]], + ['spi_5fslavetransferabort',['SPI_SlaveTransferAbort',['../a00022.html#gae719048431a3e4fb334f83bd824a407b',1,'fsl_spi.h']]], + ['spi_5fslavetransfercreatehandle',['SPI_SlaveTransferCreateHandle',['../a00022.html#ga7c6a9ac8e0e410684970f3169404bafd',1,'fsl_spi.h']]], + ['spi_5fslavetransfergetcount',['SPI_SlaveTransferGetCount',['../a00022.html#ga0dcd2ed8373d992ff93bb500e1442815',1,'fsl_spi.h']]], + ['spi_5fslavetransferhandleirq',['SPI_SlaveTransferHandleIRQ',['../a00022.html#gaac1ff8fc728c925d78b1237949ebf7c3',1,'fsl_spi.h']]], + ['spi_5fslavetransfernonblocking',['SPI_SlaveTransferNonBlocking',['../a00022.html#ga93765aa3b062471b641f1b8f733b8b5b',1,'fsl_spi.h']]], + ['spi_5fwriteconfigflags',['SPI_WriteConfigFlags',['../a00022.html#ga709b0d176b737a8009221565f3ae19e6',1,'fsl_spi.h']]], + ['spi_5fwritedata',['SPI_WriteData',['../a00022.html#ga92c1bd47d2ad7b45fc138fccb4bc1ace',1,'fsl_spi.h']]], + ['spi_5fwritedatawithconfigflags',['SPI_WriteDataWithConfigFlags',['../a00022.html#gad3810513c85cb28f1dbf18b15614a09d',1,'fsl_spi.h']]], + ['swm_5fsetfixedpinselect',['SWM_SetFixedPinSelect',['../a00095.html#ga55452f734d7cc5e02195ed926e4484c8',1,'fsl_swm.h']]], + ['swm_5fsetmovablepinselect',['SWM_SetMovablePinSelect',['../a00095.html#gaae2dc5c29ae2358c616fa8a2b61a7e4b',1,'fsl_swm.h']]], + ['syscon_5fattachsignal',['SYSCON_AttachSignal',['../a00096.html#gaa42f53e7578284bdc9816da8800e735b',1,'fsl_syscon.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_75.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_75.html new file mode 100644 index 0000000..db02642 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_75.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_75.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_75.js new file mode 100644 index 0000000..0f3bbf8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_75.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['usart_5fclearstatusflags',['USART_ClearStatusFlags',['../a00023.html#ga235a301d8f22d6ce3a6f77dbdb76cfe3',1,'fsl_usart.h']]], + ['usart_5fdeinit',['USART_Deinit',['../a00023.html#ga80892980b702b0b7614691014a5aaaca',1,'fsl_usart.h']]], + ['usart_5fdisableinterrupts',['USART_DisableInterrupts',['../a00023.html#ga091d6509100a6e6206483b2f41f16d6c',1,'fsl_usart.h']]], + ['usart_5fenableautoclearsclk',['USART_EnableAutoClearSCLK',['../a00023.html#ga4d96acc82e0bbe947ececc200083c68a',1,'fsl_usart.h']]], + ['usart_5fenablecontinuoussclk',['USART_EnableContinuousSCLK',['../a00023.html#gad0a37042ec21be840247a05ca9e8e805',1,'fsl_usart.h']]], + ['usart_5fenablects',['USART_EnableCTS',['../a00023.html#gaaab4d6b7d7701fbdd022694330207614',1,'fsl_usart.h']]], + ['usart_5fenableinterrupts',['USART_EnableInterrupts',['../a00023.html#ga9132cf15ff5fd2ac007a88f9400bcf30',1,'fsl_usart.h']]], + ['usart_5fenablerx',['USART_EnableRx',['../a00023.html#ga4f3beae19d75ae0141b60b5fb6a2d710',1,'fsl_usart.h']]], + ['usart_5fenabletx',['USART_EnableTx',['../a00023.html#gaa7cd13d17a8aa19c34bd8564d37f3a1f',1,'fsl_usart.h']]], + ['usart_5fgetdefaultconfig',['USART_GetDefaultConfig',['../a00023.html#ga74464f9357e585e42e5f3c909eb6e9b3',1,'fsl_usart.h']]], + ['usart_5fgetenabledinterrupts',['USART_GetEnabledInterrupts',['../a00023.html#ga49c6966b2af5f0de0fbf49240acc1856',1,'fsl_usart.h']]], + ['usart_5fgetinstance',['USART_GetInstance',['../a00023.html#ga0433386bbc6c2ac7e2ec7925fea263db',1,'fsl_usart.h']]], + ['usart_5fgetstatusflags',['USART_GetStatusFlags',['../a00023.html#ga33f5cdc2918edf02b9a4ef8a12e27442',1,'fsl_usart.h']]], + ['usart_5finit',['USART_Init',['../a00023.html#ga2aeb4e11fdf0eb515d090865ffcf2ba2',1,'fsl_usart.h']]], + ['usart_5freadblocking',['USART_ReadBlocking',['../a00023.html#ga09c3b588e2099ffa6b999c5ca7fb8d58',1,'fsl_usart.h']]], + ['usart_5freadbyte',['USART_ReadByte',['../a00023.html#gaaa9dc0edc5edacd55bb88ff7b9b55f98',1,'fsl_usart.h']]], + ['usart_5fsetbaudrate',['USART_SetBaudRate',['../a00023.html#gabdcaf539e6c95903c779f4538b1f422b',1,'fsl_usart.h']]], + ['usart_5ftransferabortreceive',['USART_TransferAbortReceive',['../a00023.html#ga2de9bf9557d2f7bc6fe0236608cb958e',1,'fsl_usart.h']]], + ['usart_5ftransferabortsend',['USART_TransferAbortSend',['../a00023.html#ga095596e064fa8aa6bac0927e71b0329c',1,'fsl_usart.h']]], + ['usart_5ftransfercreatehandle',['USART_TransferCreateHandle',['../a00023.html#ga9aed876794d5c2ab2e37196242602b89',1,'fsl_usart.h']]], + ['usart_5ftransfergetreceivecount',['USART_TransferGetReceiveCount',['../a00023.html#ga43cc02b4521f48ae0b5626a1e8f87a0e',1,'fsl_usart.h']]], + ['usart_5ftransfergetrxringbufferlength',['USART_TransferGetRxRingBufferLength',['../a00023.html#gac0c8e42457c41efd02a4310423804e77',1,'fsl_usart.h']]], + ['usart_5ftransfergetsendcount',['USART_TransferGetSendCount',['../a00023.html#ga56acdf4c0046516f59c04d89e8e988e6',1,'fsl_usart.h']]], + ['usart_5ftransferhandleirq',['USART_TransferHandleIRQ',['../a00023.html#gae955a5e336b3cb3276d5cdd6f1f6feda',1,'fsl_usart.h']]], + ['usart_5ftransferreceivenonblocking',['USART_TransferReceiveNonBlocking',['../a00023.html#ga34c6c819c9e2d8608a6d7e63103fa542',1,'fsl_usart.h']]], + ['usart_5ftransfersendnonblocking',['USART_TransferSendNonBlocking',['../a00023.html#ga7f5a4e7e831ab0dc869637494a57362e',1,'fsl_usart.h']]], + ['usart_5ftransferstartringbuffer',['USART_TransferStartRingBuffer',['../a00023.html#ga8500107ace3179c85e66d73fa1f41d16',1,'fsl_usart.h']]], + ['usart_5ftransferstopringbuffer',['USART_TransferStopRingBuffer',['../a00023.html#gaedb2f678849734999e373a8b00a5248c',1,'fsl_usart.h']]], + ['usart_5fwriteblocking',['USART_WriteBlocking',['../a00023.html#ga95abde78d5cbf569f2b6e4d7942b64df',1,'fsl_usart.h']]], + ['usart_5fwritebyte',['USART_WriteByte',['../a00023.html#gae7a92a20789cf111acadb543916aac91',1,'fsl_usart.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_77.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_77.html new file mode 100644 index 0000000..26195f0 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_77.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_77.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_77.js new file mode 100644 index 0000000..82c918d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/functions_77.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['wkt_5fclearstatusflags',['WKT_ClearStatusFlags',['../a00024.html#gaa0d7b68f6ecfd1f4429c5dabb4b5aec3',1,'fsl_wkt.h']]], + ['wkt_5fdeinit',['WKT_Deinit',['../a00024.html#gac9fb07a0516fdfdbb40129dd85f82b4b',1,'fsl_wkt.h']]], + ['wkt_5fgetcountervalue',['WKT_GetCounterValue',['../a00024.html#ga6a2589301e091e4ced6951f49e8ab636',1,'fsl_wkt.h']]], + ['wkt_5fgetdefaultconfig',['WKT_GetDefaultConfig',['../a00024.html#ga34bc8734ca383ef16dbe8683f65f2d74',1,'fsl_wkt.h']]], + ['wkt_5fgetstatusflags',['WKT_GetStatusFlags',['../a00024.html#ga1be1eae0ee5ecd4349a07e836f41630e',1,'fsl_wkt.h']]], + ['wkt_5finit',['WKT_Init',['../a00024.html#gab3a332ac3545c7280fe2e03785736340',1,'fsl_wkt.h']]], + ['wkt_5fstarttimer',['WKT_StartTimer',['../a00024.html#gaeaa5ecfb153fc573f367ea2858f56e8a',1,'fsl_wkt.h']]], + ['wkt_5fstoptimer',['WKT_StopTimer',['../a00024.html#gab70db33e771d229596af0a64a398aa78',1,'fsl_wkt.h']]], + ['wwdt_5fclearstatusflags',['WWDT_ClearStatusFlags',['../a00025.html#ga5666008b33bf327c80afb90e0733512e',1,'fsl_wwdt.h']]], + ['wwdt_5fdeinit',['WWDT_Deinit',['../a00025.html#gaae4415d32cd0f67908d0ab9494736742',1,'fsl_wwdt.h']]], + ['wwdt_5fdisable',['WWDT_Disable',['../a00025.html#ga358bab6648d05345bda057a72cfb5547',1,'fsl_wwdt.h']]], + ['wwdt_5fenable',['WWDT_Enable',['../a00025.html#ga2620dd2baf891f32359fbe85faaca563',1,'fsl_wwdt.h']]], + ['wwdt_5fgetdefaultconfig',['WWDT_GetDefaultConfig',['../a00025.html#gacfd7070829029279f3b3bfb763b86914',1,'fsl_wwdt.h']]], + ['wwdt_5fgetstatusflags',['WWDT_GetStatusFlags',['../a00025.html#ga1c5dae412d14eba38f2b63abb9f982d6',1,'fsl_wwdt.h']]], + ['wwdt_5finit',['WWDT_Init',['../a00025.html#gadc47d88ae20552f9cd9999e6f8fc5ebe',1,'fsl_wwdt.h']]], + ['wwdt_5frefresh',['WWDT_Refresh',['../a00025.html#gab1745efaa7c33fab66a552fd45e01d83',1,'fsl_wwdt.h']]], + ['wwdt_5fsettimeoutvalue',['WWDT_SetTimeoutValue',['../a00025.html#gad2351329bb1ff6b966decec266d7ec16',1,'fsl_wwdt.h']]], + ['wwdt_5fsetwarningvalue',['WWDT_SetWarningValue',['../a00025.html#gac575fb8568458aa8acbbed14d5aa5ffd',1,'fsl_wwdt.h']]], + ['wwdt_5fsetwindowvalue',['WWDT_SetWindowValue',['../a00025.html#ga66b5c37906be6083f083a436eebbe778',1,'fsl_wwdt.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_61.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_61.html new file mode 100644 index 0000000..8293fd2 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_61.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_61.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_61.js new file mode 100644 index 0000000..b2716bf --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_61.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['adc_3a_2012_2dbit_20sar_20analog_2dto_2ddigital_20converter_20driver',['ADC: 12-bit SAR Analog-to-Digital Converter Driver',['../a00009.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_63.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_63.html new file mode 100644 index 0000000..230a598 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_63.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_63.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_63.js new file mode 100644 index 0000000..166c5e2 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_63.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['capt_3a_20capacitive_20touch',['CAPT: Capacitive Touch',['../a00010.html',1,'']]], + ['clock_20driver',['Clock Driver',['../a00011.html',1,'']]], + ['crc_3a_20cyclic_20redundancy_20check_20driver',['CRC: Cyclic Redundancy Check Driver',['../a00012.html',1,'']]], + ['ctimer_3a_20standard_20counter_2ftimers',['CTIMER: Standard counter/timers',['../a00013.html',1,'']]], + ['common_20driver',['Common Driver',['../a00087.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_64.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_64.html new file mode 100644 index 0000000..280e5e9 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_64.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_64.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_64.js new file mode 100644 index 0000000..3c8dc82 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_64.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['debug_20console',['Debug Console',['../a00097.html',1,'']]], + ['dma_3a_20direct_20memory_20access_20controller_20driver',['DMA: Direct Memory Access Controller Driver',['../a00015.html',1,'']]], + ['dac_3a_2010_2dbit_20digital_20to_20analog_20converter_20driver',['DAC: 10-bit Digital To Analog Converter Driver',['../a00014.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_67.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_67.html new file mode 100644 index 0000000..df8c1eb --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_67.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_67.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_67.js new file mode 100644 index 0000000..26f438c --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_67.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gpio_3a_20general_20purpose_20i_2fo',['GPIO: General Purpose I/O',['../a00016.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_69.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_69.html new file mode 100644 index 0000000..c265ba2 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_69.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_69.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_69.js new file mode 100644 index 0000000..a390db9 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_69.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['i2c_3a_20inter_2dintegrated_20circuit_20driver',['I2C: Inter-Integrated Circuit Driver',['../a00090.html',1,'']]], + ['i2c_20driver',['I2C Driver',['../a00091.html',1,'']]], + ['i2c_20master_20driver',['I2C Master Driver',['../a00017.html',1,'']]], + ['i2c_20slave_20driver',['I2C Slave Driver',['../a00018.html',1,'']]], + ['iap_3a_20in_20application_20programming_20driver',['IAP: In Application Programming Driver',['../a00088.html',1,'']]], + ['inputmux_3a_20input_20multiplexing_20driver',['INPUTMUX: Input Multiplexing Driver',['../a00089.html',1,'']]], + ['iocon_3a_20i_2fo_20pin_20configuration',['IOCON: I/O pin configuration',['../a00019.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6c.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6c.html new file mode 100644 index 0000000..2eb28f4 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6c.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6c.js new file mode 100644 index 0000000..7c82797 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['lpc_5facomp_3a_20analog_20comparator_20driver',['LPC_ACOMP: Analog comparator Driver',['../a00008.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6d.html new file mode 100644 index 0000000..1f7a35f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6d.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6d.js new file mode 100644 index 0000000..3e1d42f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_6d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mrt_3a_20multi_2drate_20timer',['MRT: Multi-Rate Timer',['../a00020.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_70.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_70.html new file mode 100644 index 0000000..4c2a63d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_70.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_70.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_70.js new file mode 100644 index 0000000..4c939cf --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_70.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['pint_3a_20pin_20interrupt_20and_20pattern_20match_20driver',['PINT: Pin Interrupt and Pattern Match Driver',['../a00094.html',1,'']]], + ['power_20driver',['Power Driver',['../a00085.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_72.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_72.html new file mode 100644 index 0000000..63d39b3 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_72.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_72.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_72.js new file mode 100644 index 0000000..93ea0ea --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_72.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['reset_20driver',['Reset Driver',['../a00086.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_73.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_73.html new file mode 100644 index 0000000..5f54eb0 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_73.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_73.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_73.js new file mode 100644 index 0000000..e1db8ff --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_73.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['sctimer_3a_20sctimer_2fpwm_20_28sct_29',['SCTimer: SCTimer/PWM (SCT)',['../a00021.html',1,'']]], + ['semihosting',['Semihosting',['../a00098.html',1,'']]], + ['spi_3a_20serial_20peripheral_20interface_20driver',['SPI: Serial Peripheral Interface Driver',['../a00092.html',1,'']]], + ['spi_20driver',['SPI Driver',['../a00022.html',1,'']]], + ['swm_3a_20switch_20matrix_20module',['SWM: Switch Matrix Module',['../a00095.html',1,'']]], + ['syscon_3a_20system_20configuration',['SYSCON: System Configuration',['../a00096.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_75.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_75.html new file mode 100644 index 0000000..7c520b1 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_75.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_75.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_75.js new file mode 100644 index 0000000..77ce278 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_75.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['usart_3a_20universal_20asynchronous_20receiver_2ftransmitter_20driver',['USART: Universal Asynchronous Receiver/Transmitter Driver',['../a00093.html',1,'']]], + ['usart_20driver',['USART Driver',['../a00023.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_77.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_77.html new file mode 100644 index 0000000..aac9c51 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_77.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_77.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_77.js new file mode 100644 index 0000000..d87f5d2 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/groups_77.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['wkt_3a_20self_2dwake_2dup_20timer',['WKT: Self-wake-up Timer',['../a00024.html',1,'']]], + ['wwdt_3a_20windowed_20watchdog_20timer_20driver',['WWDT: Windowed Watchdog Timer Driver',['../a00025.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/mag_sel.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/mag_sel.png new file mode 100644 index 0000000..81f6040 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/mag_sel.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/nomatches.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/nomatches.html new file mode 100644 index 0000000..b1ded27 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
+
No Matches
+
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_61.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_61.html new file mode 100644 index 0000000..f431088 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_61.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_61.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_61.js new file mode 100644 index 0000000..f03223e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_61.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['architectural_20overview',['Architectural Overview',['../a00004.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_64.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_64.html new file mode 100644 index 0000000..cf4d42d --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_64.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_64.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_64.js new file mode 100644 index 0000000..e95c413 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_64.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['deprecated_20list',['Deprecated List',['../a00100.html',1,'']]], + ['driver_20errors_20status',['Driver errors status',['../a00006.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_69.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_69.html new file mode 100644 index 0000000..c210a14 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_69.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_69.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_69.js new file mode 100644 index 0000000..d1d84ad --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_69.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['introduction',['Introduction',['../a00007.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_74.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_74.html new file mode 100644 index 0000000..377f68e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_74.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_74.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_74.js new file mode 100644 index 0000000..4ef9a16 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/pages_74.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['trademarks',['Trademarks',['../a00002.html',1,'']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/search.css b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/search.css new file mode 100644 index 0000000..4d7612f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + position: absolute; + float: none; + display: inline; + margin-top: 8px; + right: 0px; + width: 170px; + z-index: 102; + background-color: white; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:111px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:0px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 1; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/search.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/search.js new file mode 100644 index 0000000..c96b0a7 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/search.js @@ -0,0 +1,811 @@ +// Search script generated by doxygen +// Copyright (C) 2009 by Dimitri van Heesch. + +// The code in this file is loosly based on main.js, part of Natural Docs, +// which is Copyright (C) 2003-2008 Greg Valure +// Natural Docs is licensed under the GPL. + +var indexSectionsWithContent = +{ + 0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010111111111011111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101100101000100000101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101100101000100101101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111001111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100001000000100101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101100101000100100101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 7: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101100101001100101101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 8: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100001000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "functions", + 3: "variables", + 4: "typedefs", + 5: "enums", + 6: "enumvalues", + 7: "groups", + 8: "pages" +}; + +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var hexCode; + if (code<16) + { + hexCode="0"+code.toString(16); + } + else + { + hexCode=code.toString(16); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1') + { + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_64.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_64.js new file mode 100644 index 0000000..e3c111e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_64.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['dma_5fcallback',['dma_callback',['../a00015.html#gab844237884d5badd07ac902a9be34275',1,'fsl_dma.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_69.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_69.html new file mode 100644 index 0000000..ee98159 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_69.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_69.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_69.js new file mode 100644 index 0000000..339d519 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_69.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['i2c_5fisr_5ft',['i2c_isr_t',['../a00018.html#ga64e4839b34e9156358c4eaa717b1c14a',1,'fsl_i2c.h']]], + ['i2c_5fmaster_5ftransfer_5fcallback_5ft',['i2c_master_transfer_callback_t',['../a00017.html#gad292a48f957a9b76593c1779d9dce497',1,'fsl_i2c.h']]], + ['i2c_5fslave_5ftransfer_5fcallback_5ft',['i2c_slave_transfer_callback_t',['../a00018.html#ga0704c8f14da38feb11555e4127d86a18',1,'fsl_i2c.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_70.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_70.html new file mode 100644 index 0000000..f80c204 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_70.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_70.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_70.js new file mode 100644 index 0000000..b4b9e28 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_70.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pint_5fcb_5ft',['pint_cb_t',['../a00094.html#ga262ac9596c0926fbe5f346e0f6aaf9f5',1,'fsl_pint.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_73.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_73.html new file mode 100644 index 0000000..f468e5a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_73.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_73.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_73.js new file mode 100644 index 0000000..16880cd --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_73.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['sctimer_5fevent_5fcallback_5ft',['sctimer_event_callback_t',['../a00021.html#ga9522e37a144ad51ffb1f5d035f1b4489',1,'fsl_sctimer.h']]], + ['spi_5fmaster_5fcallback_5ft',['spi_master_callback_t',['../a00022.html#gae9bd140aeb645efab6c7552b3994e01a',1,'fsl_spi.h']]], + ['spi_5fslave_5fcallback_5ft',['spi_slave_callback_t',['../a00022.html#ga86b45b85e036adc762eed5bcd2a0491d',1,'fsl_spi.h']]], + ['spi_5fslave_5fhandle_5ft',['spi_slave_handle_t',['../a00022.html#gad267cfee3a876b2860217ff94f03f574',1,'fsl_spi.h']]], + ['status_5ft',['status_t',['../a00087.html#gaaabdaf7ee58ca7269bd4bf24efcde092',1,'fsl_common.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_75.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_75.html new file mode 100644 index 0000000..c0d6ee3 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_75.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_75.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_75.js new file mode 100644 index 0000000..e3bff04 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/typedefs_75.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['usart_5ftransfer_5fcallback_5ft',['usart_transfer_callback_t',['../a00023.html#ga9688f27725349ed0dd7a37c9a75eccc0',1,'fsl_usart.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_61.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_61.html new file mode 100644 index 0000000..3587551 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_61.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_61.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_61.js new file mode 100644 index 0000000..622da20 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_61.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['address',['address',['../a00018.html#ad7af2a58faba6a178daa97bd06ebce36',1,'i2c_slave_address_t']]], + ['address0',['address0',['../a00018.html#a4738c7cd55260f7e8a3825d0b2278a34',1,'i2c_slave_config_t']]], + ['address1',['address1',['../a00018.html#ae19c45c96699bb3a6821150ab820b029',1,'i2c_slave_config_t']]], + ['address2',['address2',['../a00018.html#ae855ba5c53f7e585c44eae8bada85e9d',1,'i2c_slave_config_t']]], + ['address3',['address3',['../a00018.html#a213d1737a633686701581a09859213a6',1,'i2c_slave_config_t']]], + ['addressdisable',['addressDisable',['../a00018.html#aca3dcdb3ab2710d991ada52d64bf102c',1,'i2c_slave_address_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_62.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_62.html new file mode 100644 index 0000000..d4af55e --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_62.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_62.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_62.js new file mode 100644 index 0000000..b48388f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_62.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['base',['base',['../a00015.html#a84d667acc1301d6d56ae52573e4b6b87',1,'dma_handle_t']]], + ['baudrate_5fbps',['baudRate_Bps',['../a00017.html#a2186844dc87bcde999fc12005f4c550a',1,'i2c_master_config_t::baudRate_Bps()'],['../a00022.html#ae7695987e044d80983fd98a43812b1ea',1,'spi_master_config_t::baudRate_Bps()'],['../a00023.html#a5d2631bc772901b4114b01770f9bb337',1,'usart_config_t::baudRate_Bps()']]], + ['bitcountperchar',['bitCountPerChar',['../a00023.html#ab964b3fbce4b824beff770a138fd4b6e',1,'usart_config_t']]], + ['buf',['buf',['../a00017.html#a9577474c0c4395355174df2b016108de',1,'_i2c_master_handle']]], + ['burst',['burst',['../a00015.html#a66ad3f0d6159adbb560799bfb93da76a',1,'dma_channel_trigger_t']]], + ['busspeed',['busSpeed',['../a00018.html#a14acc40a290c779fde0825f3a8bdbb25',1,'i2c_slave_config_t']]], + ['bytewidth',['byteWidth',['../a00015.html#a93c1b2f32e5e046cf10ba7e8b1c215ce',1,'dma_xfercfg_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_63.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_63.html new file mode 100644 index 0000000..7575dc9 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_63.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_63.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_63.js new file mode 100644 index 0000000..dad002b --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_63.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['callback',['callback',['../a00015.html#a47a5c6af4c934cc9db355d394bb94f46',1,'dma_handle_t::callback()'],['../a00018.html#a7229e894f762ead4bd08b4add49e6bc2',1,'_i2c_slave_handle::callback()'],['../a00022.html#a445e70d437c917e6af1b4037bdbb6a3f',1,'_spi_master_handle::callback()'],['../a00023.html#a50fd5afc23c86d872ee2a1d46bd4145e',1,'_usart_handle::callback()']]], + ['channel',['channel',['../a00015.html#a7c068d330cc60423ee3fd86821221b85',1,'dma_handle_t']]], + ['channelmask',['channelMask',['../a00009.html#ab63c0a8803f4d02e040d55efd8d58e88',1,'adc_conv_seq_config_t']]], + ['channelnumber',['channelNumber',['../a00009.html#a6829bb748bc55409fed8615f6a40bb84',1,'adc_result_info_t']]], + ['clockdivider',['clockDivider',['../a00010.html#a9a8da1759cc4ea2b284400908075c871',1,'capt_config_t']]], + ['clockdividernumber',['clockDividerNumber',['../a00009.html#abb59c0a54988e01653f80c8a59d18b1a',1,'adc_config_t']]], + ['clockfreq_5fhz',['clockFreq_Hz',['../a00025.html#a15e2f3ecd343280edfd8fbaa0bf8c9f4',1,'wwdt_config_t']]], + ['clockmode',['clockMode',['../a00009.html#ae91bf3a0e56181065cda63613b2cb45f',1,'adc_config_t::clockMode()'],['../a00021.html#aaba4aecfe1173c11bb8d77a8f9913196',1,'sctimer_config_t::clockMode()']]], + ['clockphase',['clockPhase',['../a00022.html#a7fbed6c387c99764c4f405fc7d9761ee',1,'spi_master_config_t::clockPhase()'],['../a00022.html#a56c657f64c2e26fe7dd772c1a77efb9e',1,'spi_slave_config_t::clockPhase()']]], + ['clockpolarity',['clockPolarity',['../a00022.html#a780c1f03e9670a2c38068a7bd49d4f13',1,'spi_master_config_t::clockPolarity()'],['../a00022.html#afd5bb71a7dc1908cb8a1860564601a45',1,'spi_slave_config_t::clockPolarity()'],['../a00023.html#ac808e4908f1d6f9ca78fec3d0b8f118a',1,'usart_config_t::clockPolarity()']]], + ['clockselect',['clockSelect',['../a00021.html#ad5d7a18f1b860f5fa7d0800d8e464127',1,'sctimer_config_t']]], + ['clocksource',['clockSource',['../a00024.html#ae5078ce05e0689966c2c5c49f9aaf89a',1,'wkt_config_t']]], + ['clrtrig',['clrtrig',['../a00015.html#ab30c2a4b2d436b966ba948edb010688f',1,'dma_xfercfg_t']]], + ['complementin',['complementIn',['../a00012.html#a9982af011e3e1fc9756dcee96281ebda',1,'crc_config_t']]], + ['complementout',['complementOut',['../a00012.html#a673b6508efa086da7b7bd537a876241e',1,'crc_config_t']]], + ['completioncallback',['completionCallback',['../a00017.html#a15b84b8a94c2b2e5ace0a695c79edd84',1,'_i2c_master_handle']]], + ['completionstatus',['completionStatus',['../a00018.html#a35adbf64ca65dd2c1b52f9260f5b9e90',1,'i2c_slave_transfer_t']]], + ['configflags',['configFlags',['../a00022.html#a582eea734badd0049c98ea3cf89b3e4b',1,'spi_transfer_t']]], + ['count',['count',['../a00010.html#a2b0d01a9feb8b378e76f4d3240e9ebe8',1,'capt_touch_data_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_64.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_64.html new file mode 100644 index 0000000..89296ec --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_64.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_64.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_64.js new file mode 100644 index 0000000..277e7d0 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_64.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['data',['data',['../a00017.html#a8c7f63bd1e7de04e40f5cd733f5c7388',1,'_i2c_master_transfer::data()'],['../a00023.html#acad21ced979ce0c2af98f0b1837863c9',1,'usart_transfer_t::data()']]], + ['datasize',['dataSize',['../a00017.html#a68e2dd69e1e34b1b505270e1e07e8a34',1,'_i2c_master_transfer::dataSize()'],['../a00022.html#ae003337c9398e5f5e3189f5b2ba6335b',1,'spi_transfer_t::dataSize()'],['../a00023.html#a605c0a56df2815ffb3461aaaf116752a',1,'usart_transfer_t::dataSize()']]], + ['datawidth',['dataWidth',['../a00022.html#a018402d4d181b482376a878b38db740f',1,'spi_master_config_t::dataWidth()'],['../a00022.html#adc19252b2493f3f9d12f029e57908ce5',1,'spi_slave_config_t::dataWidth()'],['../a00022.html#a11b51e4d88d3f8d9137a13ce301ed46c',1,'_spi_master_handle::dataWidth()']]], + ['delayconfig',['delayConfig',['../a00022.html#a787477e7b0ae7833dcbdb1c85fef361c',1,'spi_master_config_t']]], + ['direction',['direction',['../a00017.html#ac5b89dc9115b7760431c981e0c1fd443',1,'_i2c_master_transfer::direction()'],['../a00022.html#aace9261acfad8526f3d5b0b59346629a',1,'spi_master_config_t::direction()'],['../a00022.html#ad4eb458a0c1a0c0934eec53d71b78ffb',1,'spi_slave_config_t::direction()']]], + ['dstaddr',['dstAddr',['../a00015.html#a8eb88e8dcaea9033a76c0003fcabadd8',1,'dma_transfer_config_t']]], + ['dstendaddr',['dstEndAddr',['../a00015.html#ab0a39d7a7b627b1a714117f2d150bac0',1,'dma_descriptor_t']]], + ['dstinc',['dstInc',['../a00015.html#a674be34352d78e2029f8b36f0664cf6f',1,'dma_xfercfg_t']]], + ['dststartaddr',['dstStartAddr',['../a00015.html#a7cf6b2c7eef13541394e9131987a2209',1,'dma_channel_config_t']]], + ['dutycyclepercent',['dutyCyclePercent',['../a00021.html#a17414a2d234412e960c98e4c8e4df853',1,'sctimer_pwm_signal_param_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_65.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_65.html new file mode 100644 index 0000000..4ccb91b --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_65.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_65.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_65.js new file mode 100644 index 0000000..58df314 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_65.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['enablebidirection_5fh',['enableBidirection_h',['../a00021.html#a347a741944d1f294a11fc0f19cfbbc53',1,'sctimer_config_t']]], + ['enablebidirection_5fl',['enableBidirection_l',['../a00021.html#aafc09c3595776bc668daf3e303802f31',1,'sctimer_config_t']]], + ['enablecontinuoussclk',['enableContinuousSCLK',['../a00023.html#a8d618d37f6867480bd0e1fcd9e5b50a5',1,'usart_config_t']]], + ['enablecounterreset',['enableCounterReset',['../a00013.html#aaa00b16aba273e3f11f9480154acc1e5',1,'ctimer_match_config_t']]], + ['enablecounterstop',['enableCounterStop',['../a00013.html#a94fe2c63ce7fcb5cf68f9ce73974a3e8',1,'ctimer_match_config_t']]], + ['enablecounterunify',['enableCounterUnify',['../a00021.html#a6caacf7ae4f800be829c32ed87cd6149',1,'sctimer_config_t']]], + ['enablehardwareflowcontrol',['enableHardwareFlowControl',['../a00023.html#ac34e16abe408d6e9daa37741420f7ec0',1,'usart_config_t']]], + ['enableinterrupt',['enableInterrupt',['../a00013.html#ae09fd69820c9285d7f146260d2c51584',1,'ctimer_match_config_t']]], + ['enablelockoscillator',['enableLockOscillator',['../a00025.html#ac0e6a4a8be4bd468fdb082a156219a44',1,'wwdt_config_t']]], + ['enableloopback',['enableLoopback',['../a00022.html#a384bc00ef4cd5b4e9cb6a4d48ec336bd',1,'spi_master_config_t']]], + ['enablelowpowermode',['enableLowPowerMode',['../a00009.html#a92583334531874821348b01b24f03bed',1,'adc_config_t']]], + ['enablemaster',['enableMaster',['../a00017.html#a2419131a10906475fd31950f17ac8895',1,'i2c_master_config_t::enableMaster()'],['../a00022.html#aa033bd20cfbb1a14f0fd43f4b31bb27e',1,'spi_master_config_t::enableMaster()']]], + ['enablemultitask',['enableMultiTask',['../a00020.html#aa8d8b810ee17770fd48674454f59bb08',1,'mrt_config_t']]], + ['enablerx',['enableRx',['../a00023.html#a8b9813693fdfd2116e0d6019ea39b41d',1,'usart_config_t']]], + ['enablesinglestep',['enableSingleStep',['../a00009.html#abe7f67296372743da67e2eac58f9aafe',1,'adc_conv_seq_config_t']]], + ['enableslave',['enableSlave',['../a00018.html#a92d20835618a946b8f7702455877ef7a',1,'i2c_slave_config_t::enableSlave()'],['../a00022.html#a9fcd3fae6d886c7dfd0c3fd4cd51e6fe',1,'spi_slave_config_t::enableSlave()']]], + ['enablesyncbypass',['enableSyncBypass',['../a00009.html#aaf2640b291a24e4222953c7686007a3b',1,'adc_conv_seq_config_t']]], + ['enablesynctobusclk',['enableSyncToBusClk',['../a00008.html#a6f9542645b06542277cb07ea138e5064',1,'acomp_config_t']]], + ['enabletimeout',['enableTimeout',['../a00017.html#a1c6831135c83c013d2a3cfc3e7210357',1,'i2c_master_config_t']]], + ['enabletouchlower',['enableTouchLower',['../a00010.html#af153fbc551235805bebdcae4efa95462',1,'capt_config_t']]], + ['enabletx',['enableTx',['../a00023.html#a2c3b5faf44be34a152232b9dfaaf064d',1,'usart_config_t']]], + ['enablewaitmode',['enableWaitMode',['../a00010.html#a65c26d6fd762782ca1370d3de678e98b',1,'capt_config_t']]], + ['enablewatchdogprotect',['enableWatchdogProtect',['../a00025.html#adc32c01dcffb7f140c8e1fd049862928',1,'wwdt_config_t']]], + ['enablewatchdogreset',['enableWatchdogReset',['../a00025.html#a78ce1ec4de049becaae7e3be51772313',1,'wwdt_config_t']]], + ['enablewwdt',['enableWwdt',['../a00025.html#a405b63e15703dc92b3179b5089319e38',1,'wwdt_config_t']]], + ['enablexpins',['enableXpins',['../a00010.html#a22171a4d042ea93fa19f6d7e22caa516',1,'capt_config_t']]], + ['event',['event',['../a00018.html#ad0a9e837e9df16d89bab98a78af5bd10',1,'i2c_slave_transfer_t']]], + ['eventmask',['eventMask',['../a00018.html#a1be21257ec375e09106dfe242c02beea',1,'i2c_slave_transfer_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_66.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_66.html new file mode 100644 index 0000000..802fdbc --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_66.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_66.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_66.js new file mode 100644 index 0000000..702b7b0 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_66.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['flags',['flags',['../a00017.html#a8835787e1b0f9a4b8868e7cbe53e45d5',1,'_i2c_master_transfer']]], + ['framedelay',['frameDelay',['../a00022.html#a9609e5c510bf5d0c120a403ed40aed42',1,'spi_delay_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_67.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_67.html new file mode 100644 index 0000000..be8e8e6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_67.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_67.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_67.js new file mode 100644 index 0000000..70cfaf8 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_67.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['g_5fext_5fclk_5ffreq',['g_Ext_Clk_Freq',['../a00011.html#ga386d59c21453d1914f3c8194010ff277',1,'fsl_clock.h']]], + ['g_5fwdt_5fosc_5ffreq',['g_Wdt_Osc_Freq',['../a00011.html#ga73a69ec6e63f37b9341025bbe87ced45',1,'fsl_clock.h']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_68.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_68.html new file mode 100644 index 0000000..aabcfa0 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_68.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_68.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_68.js new file mode 100644 index 0000000..6a5b932 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_68.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['handle',['handle',['../a00018.html#ab74516c1edb1424ddb1554de7cae69bc',1,'i2c_slave_transfer_t']]], + ['hysteresisselection',['hysteresisSelection',['../a00008.html#a46ecb6f7efe54967d816deafdf1c65ce',1,'acomp_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_69.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_69.html new file mode 100644 index 0000000..442bf33 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_69.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_69.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_69.js new file mode 100644 index 0000000..7de3a56 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_69.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['input',['input',['../a00013.html#ac07c23c0bbadea74c24c03e401321fbc',1,'ctimer_config_t']]], + ['inputsync',['inputsync',['../a00021.html#acd66f85232dafe6feeea4d80400aba69',1,'sctimer_config_t']]], + ['inta',['intA',['../a00015.html#ae2c9381d6fc00cee3491c5a8217c30a1',1,'dma_xfercfg_t']]], + ['intb',['intB',['../a00015.html#a7827b3fe247d5d7218b0263ecbb0aede',1,'dma_xfercfg_t']]], + ['interruptmode',['interruptMode',['../a00009.html#aa37fa0f5c6c3351f811d4f31f40290ad',1,'adc_conv_seq_config_t']]], + ['isbusy',['isBusy',['../a00018.html#a81ece18a362fc9779750be91f7cc6b30',1,'_i2c_slave_handle']]], + ['isperiph',['isPeriph',['../a00015.html#a0ab90a7e2c3a70511144d346a52aeea7',1,'dma_channel_config_t::isPeriph()'],['../a00015.html#a3d7f9ccb3edc3a6b1dbf2feb5a8b8f93',1,'dma_transfer_config_t::isPeriph()']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6c.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6c.html new file mode 100644 index 0000000..c136114 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6c.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6c.js new file mode 100644 index 0000000..f1da07c --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6c.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['laddervalue',['ladderValue',['../a00008.html#a8271667393096dad310f8b2e486b1c4b',1,'acomp_ladder_config_t']]], + ['lastcommand',['lastCommand',['../a00022.html#a4e66b572aa792a179028af5340bc83cb',1,'_spi_master_handle']]], + ['level',['level',['../a00021.html#a8734c80f138c70349b10e6204d8db899',1,'sctimer_pwm_signal_param_t']]], + ['linktonextdesc',['linkToNextDesc',['../a00015.html#a8b4151dcf43270fbbeff39334048e7e1',1,'dma_descriptor_t']]], + ['loopback',['loopback',['../a00023.html#a9892d7a138f2245bc9b7fe4e6c1652fb',1,'usart_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6d.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6d.html new file mode 100644 index 0000000..32612b6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6d.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6d.js new file mode 100644 index 0000000..5974191 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['matchvalue',['matchValue',['../a00013.html#afa3614f09e787565b3514ddd4d9545a0',1,'ctimer_match_config_t']]], + ['mdelay',['mDelay',['../a00010.html#a6f8664474411be56853bb70cd8de8b70',1,'capt_config_t']]], + ['mode',['mode',['../a00013.html#ab72ef3a10cab9754d3cecb44ef7ad6ac',1,'ctimer_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6e.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6e.html new file mode 100644 index 0000000..ca7052c --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6e.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6e.js new file mode 100644 index 0000000..7502b95 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nextdesc',['nextDesc',['../a00015.html#a7bdfedca753e094b2c288f1cbb956889',1,'dma_channel_config_t::nextDesc()'],['../a00015.html#a24f716a2b7775c1cb9a59b7c2374508b',1,'dma_transfer_config_t::nextDesc()']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6f.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6f.html new file mode 100644 index 0000000..5671b03 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6f.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6f.js new file mode 100644 index 0000000..32de253 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_6f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['outcontrol',['outControl',['../a00013.html#a0e8b29f0c0f74c5273942a521e3b16d6',1,'ctimer_match_config_t']]], + ['outinitstate',['outInitState',['../a00021.html#a3897b3b9321e3cecb05972fa68f947d5',1,'sctimer_config_t']]], + ['outpininitstate',['outPinInitState',['../a00013.html#a31ca8ee3406b7a17c793d94469e1e68d',1,'ctimer_match_config_t']]], + ['output',['output',['../a00021.html#ae030d75078255fd25e577c14d0a0fc80',1,'sctimer_pwm_signal_param_t']]], + ['outputlogic',['outputLogic',['../a00016.html#a9d37ffd9a2943f10a91095759bd52da5',1,'gpio_pin_config_t']]], + ['overrunflag',['overrunFlag',['../a00009.html#a5d9fd2ad5f95c7b55a72ac1b5d10221f',1,'adc_result_info_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_70.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_70.html new file mode 100644 index 0000000..e36abe9 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_70.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_70.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_70.js new file mode 100644 index 0000000..9abab26 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_70.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['paritymode',['parityMode',['../a00023.html#aff1d7e368b35ae89db8aa393207e7ccc',1,'usart_config_t']]], + ['pindirection',['pinDirection',['../a00016.html#a70aed128003103272f5740f12fbff525',1,'gpio_pin_config_t']]], + ['pollcount',['pollCount',['../a00010.html#ac5c6145f8f3ee5abc6130bea3de2d8c8',1,'capt_config_t']]], + ['polynomial',['polynomial',['../a00012.html#afbe53ea36b200e69cb7f693e6f0a11f1',1,'crc_config_t']]], + ['postdelay',['postDelay',['../a00022.html#a960b87887e431dabbb5641109cb56d90',1,'spi_delay_config_t']]], + ['predelay',['preDelay',['../a00022.html#a24a2584817f03d1ace0a6cecc718bc09',1,'spi_delay_config_t']]], + ['prescale',['prescale',['../a00013.html#aa8baec2c586854dc58ff4cdb82b7996b',1,'ctimer_config_t']]], + ['prescale_5fh',['prescale_h',['../a00021.html#aaa1765ca5c51528130a6dc9dd06f2e7a',1,'sctimer_config_t']]], + ['prescale_5fl',['prescale_l',['../a00021.html#aad4f208b7074a27d1a085471bd00cd0a',1,'sctimer_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_71.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_71.html new file mode 100644 index 0000000..920bc00 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_71.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_71.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_71.js new file mode 100644 index 0000000..fd60e4f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_71.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['qualaddress',['qualAddress',['../a00018.html#a4c9d09c35c4641d38bf565de31b07320',1,'i2c_slave_config_t']]], + ['qualmode',['qualMode',['../a00018.html#a51577d06d8812b0c999957898ec016b5',1,'i2c_slave_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_72.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_72.html new file mode 100644 index 0000000..0bf4f34 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_72.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_72.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_72.js new file mode 100644 index 0000000..2832172 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_72.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['rdelay',['rDelay',['../a00010.html#a2023ba3491243edb7ad6be41ea0b0f68',1,'capt_config_t']]], + ['receivedaddress',['receivedAddress',['../a00018.html#ad6f3b291ee81b69cf91c161ae26d65ae',1,'i2c_slave_transfer_t']]], + ['referencevoltage',['referenceVoltage',['../a00008.html#a66356c0246938695521e8a0ece69cf11',1,'acomp_ladder_config_t']]], + ['reload',['reload',['../a00015.html#a6387faccdc3dcd079d22b56b1c4806fd',1,'dma_xfercfg_t']]], + ['remainingbytes',['remainingBytes',['../a00017.html#aca481b5d3ca6dce53cf440b534ff80c2',1,'_i2c_master_handle']]], + ['result',['result',['../a00009.html#afa0a0f7e84c888060b963280035378f6',1,'adc_result_info_t']]], + ['reversein',['reverseIn',['../a00012.html#aecb53a8e8a78e3273c6d3b2c874ab7f2',1,'crc_config_t']]], + ['reverseout',['reverseOut',['../a00012.html#ab34c2bedb6fc476f9cbe760b6d45a417',1,'crc_config_t']]], + ['rxdata',['rxData',['../a00018.html#a3e497078c6038baa8748ce5ecebc7e3d',1,'i2c_slave_transfer_t::rxData()'],['../a00022.html#a28b878b99d5ec790b5c8f3bafe140da0',1,'spi_transfer_t::rxData()'],['../a00022.html#a69f260bde2e1728233f835a148b2f51b',1,'_spi_master_handle::rxData()'],['../a00023.html#a44bd38d7d89b7e185ac9bb49bd7214ea',1,'usart_transfer_t::rxData()'],['../a00023.html#a7fcedbe0ea6e380084a05ba1bb06e38d',1,'_usart_handle::rxData()']]], + ['rxdatasize',['rxDataSize',['../a00023.html#a94a60ffa711d28e3c9151c9990a9145c',1,'_usart_handle']]], + ['rxdatasizeall',['rxDataSizeAll',['../a00023.html#a35109a019b73257d24021ad79d951e64',1,'_usart_handle']]], + ['rxremainingbytes',['rxRemainingBytes',['../a00022.html#a23b2531ea36b53e42cd6b2a3780d3017',1,'_spi_master_handle']]], + ['rxringbuffer',['rxRingBuffer',['../a00023.html#a2cac1523ac58da64d4076c6155309d2f',1,'_usart_handle']]], + ['rxringbufferhead',['rxRingBufferHead',['../a00023.html#afb838e91205d1aa1a2b064591bc11c4e',1,'_usart_handle']]], + ['rxringbuffersize',['rxRingBufferSize',['../a00023.html#ae1c5e6a8ccdd56a678e8dda316e43845',1,'_usart_handle']]], + ['rxringbuffertail',['rxRingBufferTail',['../a00023.html#a197ce470fd9b42e53a867ef84eb2b6dd',1,'_usart_handle']]], + ['rxsize',['rxSize',['../a00018.html#a75e06358c0d5840a1dfc19a029e10ba8',1,'i2c_slave_transfer_t']]], + ['rxstate',['rxState',['../a00023.html#a7f621935f46f5f1bdd10ca755e1b51a7',1,'_usart_handle']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_73.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_73.html new file mode 100644 index 0000000..234c326 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_73.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_73.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_73.js new file mode 100644 index 0000000..81c2f6a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_73.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['seed',['seed',['../a00012.html#a88920b83ff1317f511c1e9f4916b3b30',1,'crc_config_t']]], + ['sequencenumber',['sequenceNumber',['../a00010.html#a3305567326ede24c2f45a2d5b788eb2e',1,'capt_touch_data_t']]], + ['settlingtime',['settlingTime',['../a00014.html#a64eb5fd25bfaaa5593caf6e9116dbb5b',1,'dac_config_t']]], + ['slaveaddress',['slaveAddress',['../a00017.html#a97891bd050609c6dcd1276714277e480',1,'_i2c_master_transfer']]], + ['slavefsm',['slaveFsm',['../a00018.html#a18589a5de9b06b2eaf7d4260eac03a58',1,'_i2c_slave_handle']]], + ['src',['src',['../a00011.html#a5777806e347fa36340fc79e5928f5d83',1,'clock_sys_pll_t']]], + ['srcaddr',['srcAddr',['../a00015.html#a2a315d0141311dd82dd6ac1a3523671b',1,'dma_transfer_config_t']]], + ['srcendaddr',['srcEndAddr',['../a00015.html#aabb52c29097e7d9eedb34f5421740f04',1,'dma_descriptor_t']]], + ['srcinc',['srcInc',['../a00015.html#ab21f9a2d11b2ce02da230adfd32b789e',1,'dma_xfercfg_t']]], + ['srcstartaddr',['srcStartAddr',['../a00015.html#a50d258467783dad5f163860724cb4c32',1,'dma_channel_config_t']]], + ['sselnumber',['sselNumber',['../a00022.html#af889de97327eb44641d8acc1f509d074',1,'spi_master_config_t']]], + ['sselpolarity',['sselPolarity',['../a00022.html#ab514b4866ee539808abd92a75ca8be51',1,'spi_master_config_t::sselPolarity()'],['../a00022.html#a0d0bceaaae2e5bae690fb2c3289f48f6',1,'spi_slave_config_t::sselPolarity()']]], + ['state',['state',['../a00017.html#add7ec18bc8239c5c87ffcec2fbcf5dd8',1,'_i2c_master_handle::state()'],['../a00022.html#ae7933252a37be998d127217f34f6fd16',1,'_spi_master_handle::state()']]], + ['stopbitcount',['stopBitCount',['../a00023.html#aeb0b8a38f5d7e0def2aa1b079643682f',1,'usart_config_t']]], + ['subaddress',['subaddress',['../a00017.html#ae7facb612714785d4e143e57d47a5af3',1,'_i2c_master_transfer']]], + ['subaddresssize',['subaddressSize',['../a00017.html#aeec8dccf4a49f03ff9a40f5982a24796',1,'_i2c_master_transfer']]], + ['swtrig',['swtrig',['../a00015.html#a69253cda0502dcfa038c5d71a3cac593',1,'dma_xfercfg_t']]], + ['syncmode',['syncMode',['../a00023.html#ad5debb2aa90fc8fa732edd1ab4bdbbea',1,'usart_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_74.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_74.html new file mode 100644 index 0000000..0a56aa4 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_74.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_74.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_74.js new file mode 100644 index 0000000..901bace --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_74.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['targetfreq',['targetFreq',['../a00011.html#a1be863d493ed08967d4abbe8faf8c918',1,'clock_sys_pll_t']]], + ['thresholdcomparestatus',['thresholdCompareStatus',['../a00009.html#a1014edddf4d1ea57e751088dcadace6b',1,'adc_result_info_t']]], + ['thresholdcorssingstatus',['thresholdCorssingStatus',['../a00009.html#a443ffd542f5690ca2cb239181db4aaf7',1,'adc_result_info_t']]], + ['timeoutcount',['timeOutCount',['../a00010.html#a2d65011e0db3619f02eacea89b6ab5a3',1,'capt_config_t']]], + ['timeoutvalue',['timeoutValue',['../a00025.html#a9ada6867151ee688d47176cbe771cf2d',1,'wwdt_config_t']]], + ['totalbytecount',['totalByteCount',['../a00022.html#a4e19f9299f123f181536c6bd4456e50a',1,'_spi_master_handle']]], + ['transfer',['transfer',['../a00017.html#a6858d3525f762d7aded20e6c95eb19fc',1,'_i2c_master_handle::transfer()'],['../a00018.html#a9934cd1a4d4b4e02ac5856e28f86a229',1,'_i2c_slave_handle::transfer()']]], + ['transfercount',['transferCount',['../a00015.html#a11b16354c24a04222507d6508a475bab',1,'dma_xfercfg_t::transferCount()'],['../a00017.html#a5943d16f5ed6e7c4ebd334cdbc0e2afc',1,'_i2c_master_handle::transferCount()']]], + ['transferdelay',['transferDelay',['../a00022.html#a7ea0733fc746e2bafe1c0999db7d4804',1,'spi_delay_config_t']]], + ['transferredcount',['transferredCount',['../a00018.html#a0394563c8d0f9eeeecd242a65cee2ad4',1,'i2c_slave_transfer_t']]], + ['trigger',['trigger',['../a00015.html#ae2b24289699bf3639fea8bb56baf0d15',1,'dma_channel_config_t']]], + ['triggermask',['triggerMask',['../a00009.html#a53ec8373edca82340278a104721ed8bb',1,'adc_conv_seq_config_t']]], + ['triggermode',['triggerMode',['../a00010.html#a998c94c1d03dc0f2be30ae3a3982585f',1,'capt_config_t']]], + ['triggerpolarity',['triggerPolarity',['../a00009.html#a280dc4b4d9c35c2411fe92cf3cadb838',1,'adc_conv_seq_config_t']]], + ['txdata',['txData',['../a00018.html#afaff4f7ef2ae4ed49eff607a58db18c2',1,'i2c_slave_transfer_t::txData()'],['../a00022.html#addc4f20760a1a62c4d20cdf9443f3af3',1,'spi_transfer_t::txData()'],['../a00022.html#a6cb4626f6b63c70fa21fe2e3338dc915',1,'_spi_master_handle::txData()'],['../a00023.html#ad081b93c86f16dedd57dfc105a71e7fa',1,'usart_transfer_t::txData()'],['../a00023.html#a2e0eada6edeef87ca5609381a495caa0',1,'_usart_handle::txData()']]], + ['txdatasize',['txDataSize',['../a00023.html#aafb090dd1831c9e83df2d60cf3cd25f0',1,'_usart_handle']]], + ['txdatasizeall',['txDataSizeAll',['../a00023.html#add7cbfa096ebb8bfe5084c9940d0a9d8',1,'_usart_handle']]], + ['txremainingbytes',['txRemainingBytes',['../a00022.html#a62fa101ddfc970e7b6bcba0b2eb6b869',1,'_spi_master_handle']]], + ['txsize',['txSize',['../a00018.html#a3d2ef683b0439ce83e3d54e8823ebc38',1,'i2c_slave_transfer_t']]], + ['txstate',['txState',['../a00023.html#a30a2856c0e736ad39fe44c015bd54ca4',1,'_usart_handle']]], + ['type',['type',['../a00015.html#a80afb7ab2642836025d063ac8b0c9738',1,'dma_channel_trigger_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_75.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_75.html new file mode 100644 index 0000000..fa1b2e6 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_75.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_75.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_75.js new file mode 100644 index 0000000..b0ec568 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_75.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['userdata',['userData',['../a00015.html#a2a10a0701fc2085ce58a0e35032e8a8e',1,'dma_handle_t::userData()'],['../a00017.html#aad7df570c53adb2e80acd2ba0d39d109',1,'_i2c_master_handle::userData()'],['../a00018.html#a98ea5e99278b386e2ddb99d45a9750ee',1,'_i2c_slave_handle::userData()'],['../a00022.html#ab8d01b85149d749ab1c748bb5116b90e',1,'_spi_master_handle::userData()'],['../a00023.html#adbecb8574e5d62ee38761a3b4c30e4c3',1,'_usart_handle::userData()']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_76.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_76.html new file mode 100644 index 0000000..25f0289 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_76.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_76.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_76.js new file mode 100644 index 0000000..0569e29 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_76.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['valid',['valid',['../a00015.html#a4a97a76d0d7266ee9cc8de82d19e5d81',1,'dma_xfercfg_t']]], + ['voltagerange',['voltageRange',['../a00009.html#a8edaf01d23b56ec9b6ad0b1a15fca825',1,'adc_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_77.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_77.html new file mode 100644 index 0000000..66aafb9 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_77.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_77.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_77.js new file mode 100644 index 0000000..30f2309 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_77.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['warningvalue',['warningValue',['../a00025.html#a449186b990027ae1e7543458e2f8714a',1,'wwdt_config_t']]], + ['windowvalue',['windowValue',['../a00025.html#a6ec33e8656fe2cfc997634b348ca2cfa',1,'wwdt_config_t']]], + ['wrap',['wrap',['../a00015.html#acbcaa81a9d2806d3fa021b5ad27fea6f',1,'dma_channel_trigger_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_78.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_78.html new file mode 100644 index 0000000..cc29cf5 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_78.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_78.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_78.js new file mode 100644 index 0000000..9965325 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_78.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['xfercfg',['xfercfg',['../a00015.html#ad49be57eb231061b32b021a8854fe425',1,'dma_descriptor_t::xfercfg()'],['../a00015.html#a365dbf9376f6927bc8b6527ce136914c',1,'dma_transfer_config_t::xfercfg()'],['../a00015.html#a93ad6347b6c5e7c72320be81a67f6baf',1,'dma_channel_config_t::xferCfg()']]], + ['xpinsindex',['XpinsIndex',['../a00010.html#ada6854ef1bf21b8f35acba939c389190',1,'capt_touch_data_t']]], + ['xpinsmode',['XpinsMode',['../a00010.html#a34dffb25e8164ae4addccac265358f00',1,'capt_config_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_79.html b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_79.html new file mode 100644 index 0000000..47b6525 --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_79.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_79.js b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_79.js new file mode 100644 index 0000000..6a38e1a --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/search/variables_79.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['yestimeout',['yesTimeOut',['../a00010.html#ad73f9e52f210a4ef91e0732ba882c384',1,'capt_touch_data_t']]], + ['yestouch',['yesTouch',['../a00010.html#a5acedab58178a003114a220a5ea3f6f4',1,'capt_touch_data_t']]] +]; diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/sync_off.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/sync_off.png new file mode 100644 index 0000000..3b443fc Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/sync_off.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/sync_on.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/sync_on.png new file mode 100644 index 0000000..e08320f Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/sync_on.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_a.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_a.png new file mode 100644 index 0000000..3b725c4 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_a.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_b.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_b.png new file mode 100644 index 0000000..e2b4a86 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_b.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_h.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_h.png new file mode 100644 index 0000000..fd5cb70 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_h.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_s.png b/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_s.png new file mode 100644 index 0000000..ab478c9 Binary files /dev/null and b/docs/MCUXpresso SDK API Reference Manual_LPC845/tab_s.png differ diff --git a/docs/MCUXpresso SDK API Reference Manual_LPC845/tabs.css b/docs/MCUXpresso SDK API Reference Manual_LPC845/tabs.css new file mode 100644 index 0000000..9cf578f --- /dev/null +++ b/docs/MCUXpresso SDK API Reference Manual_LPC845/tabs.css @@ -0,0 +1,60 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #283A5D; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} diff --git a/docs/MCUXpresso SDK ChangeLog_LPC845.pdf b/docs/MCUXpresso SDK ChangeLog_LPC845.pdf new file mode 100644 index 0000000..18cb3d6 Binary files /dev/null and b/docs/MCUXpresso SDK ChangeLog_LPC845.pdf differ diff --git a/docs/MCUXpresso SDK Release Notes for LPC845BREAKOUT.pdf b/docs/MCUXpresso SDK Release Notes for LPC845BREAKOUT.pdf new file mode 100644 index 0000000..c052c2c Binary files /dev/null and b/docs/MCUXpresso SDK Release Notes for LPC845BREAKOUT.pdf differ diff --git a/docs/MCUXpresso SDK Release Notes for LPCXpresso845MAX.pdf b/docs/MCUXpresso SDK Release Notes for LPCXpresso845MAX.pdf new file mode 100644 index 0000000..4852c3e Binary files /dev/null and b/docs/MCUXpresso SDK Release Notes for LPCXpresso845MAX.pdf differ diff --git a/middleware/freemaster/ChangeLogKSDK.txt b/middleware/freemaster/ChangeLogKSDK.txt new file mode 100644 index 0000000..3d0971b --- /dev/null +++ b/middleware/freemaster/ChangeLogKSDK.txt @@ -0,0 +1,44 @@ +/*! +@page middleware_log Middleware Change Log + +@section fmstr FreeMASTER Communication Driver + Current version is 3.0.4. Visit https://www.nxp.com/freemaster for more information. + Reach out for a support at https://community.nxp.com/community/freemaster. + + - 3.0.0 + - Initial version of FreeMASTER driver reworked from a standalone package to MCUXpresso SDK middleware. + - This driver version supports new version V4 of FreeMASTER serial communication protocol. + - Supports UART, LPUART, USART, MINIUSART, FlexCAN, USB-CDC and JTAG/BDM communication. + - Initial version was tested with the following boards: evkmimxrt1060, frdmk64f, frdmke15z, + frdmkl28z, lpcxpresso54628 lpcxpresso55s69, lpcxpresso845max and twrk64f120m. + - Use with FreeMASTER PC Host tool version 2.5 or later. + + - 3.0.1 + - FreeMASTER driver extended to support wide range of Kinetis, LPC and i.MX-RT platforms. + - Low-level communication drivers also available for few non-SDK NXP platforms like S12Z, S32x and more. + - Use with FreeMASTER PC Host tool version 3.0 or later. + + - 3.0.2 + - FreeMASTER driver support of DSC56F800EX and S12 platforms extended. + - Removed dependency on C99 compiler features. + - Use with FreeMASTER PC Host tool version 3.0.2 or later. + + - 3.0.3 + - General update for SDK 2.9.0 + - fmstr_any demo added to selected platforms - use with MCUXpresso SDK and FreeMASTER peripheral configuration tool. + - New example.pmp project file embedded into application flash storage. + - USB-CDC implementation fixed, new JTAG EOnCE communication interface added to DSC 56F800E family. + - Use with FreeMASTER PC Host tool version 3.0.3 or later. Version 3.1.x is recommended. + + - 3.0.4 + - Fixed component dependency logic of FreeMASTER driver. + - Use with FreeMASTER PC Host tool version 3.1.x + + - 3.0.5 + - General update for SDK 2.11 and 2.12 + - New TCP and UDP support with lwIP stack + - New communication over Segger RTT interface + - Add fmstr_net and fmstr_wifi examples for selected i.MX-RT platforms + - Add fmstr_rtt example for selected platforms + - Fixed negative recorder threshold trigger processing +*/ diff --git a/middleware/freemaster/doc/release_notes.txt b/middleware/freemaster/doc/release_notes.txt new file mode 100644 index 0000000..9da56b5 --- /dev/null +++ b/middleware/freemaster/doc/release_notes.txt @@ -0,0 +1,74 @@ +NXP FreeMASTER Communication Driver +================================================================================ + +FreeMASTER is a PC-based application serving as a real-time monitor, visualization +tool, and a graphical control panel of embedded applications based on NXP +microcontroller and microprocessor units. The FreeMASTER Serial Communication +Driver implements the serial interface between the target application and the host PC. +The driver targets Serial and CAN communication of the supported devices. + +This is version 3 of the serial driver which implements a new version (v4) of +FreeMASTER protocol and is compatible with NXP MCUXpresso SDK suite. The driver +may be obtained as an MCUXpresso SDK middleware component at +https://mcuxpresso.nxp.com/en/welcome. + +Older implementations of FreeMASTER serial driver for platforms that are not +supported by MCUXpresso SDK (e.g. HCS08, HCS12, S12Z, ColdFire, 56F8xxx) can +be downloaded from FreeMASTER home at https://www.nxp.com/freemaster. + +Visit community support forum at: https://community.nxp.com/community/freemaster + + +CHANGELOG version 3.x versions +============================== + +Version 3.0.3 (December 2020) +---------------------------- + - General update for SDK 2.9.0 + - fmstr_any demo added to selected platforms - use with MCUXpresso SDK and FreeMASTER peripheral configuration tool. + - New example.pmp project file embedded into application flash storage. + - USB-CDC implementation fixed, new JTAG EOnCE communication interface added to DSC 56F800E family. + - Use with FreeMASTER PC Host tool version 3.0.3 or later. Version 3.1.x is recommended. + + +Version 3.0.2 (June 2020) +------------------------- + - FreeMASTER driver extended to support wide range of Kinetis, LPC and i.MX-RT platforms. + - Low-level communication drivers also available for few non-SDK NXP platforms like S12Z, S32x and more. + - Use with FreeMASTER PC Host tool version 3.0 or later. + + +Version 3.0.1 (April 4th 2020) +------------------------------ +- Use with FreeMASTER 2.5 and FreeMASTER 3.0 PC host tool or with FreeMASTER Lite +- Support for non-C99 compilers added +- Memory copy routines optimized for both little and big endian systems. +- New Kinetis, LPC and i.MX-RT devices directly supported in MCUXpresso SDK. + Majority of MCUXpresso SDK boards now supported. +- The driver primarily supports CortexM platform, this version also adds support of + Power Architecture, S32, S12Z and DSC56F800EX platforms. Example applications + are available separately. + + +Version 3.0.0 (April 29th 2019) +---------------------------- +- The first release as MCUXpresso SDK middleware component +- Communication protocol completely redesigned (protocol version 4) +- Use FreeMASTER 2.5 or later to connect to microcontroller +- Example applications available for representative members of + Kinetis, LPC and i.MX-RT families of NXP microcontrollers: + - FRDM-K64F + - TWR-K64F + - FRDM-KL28Z + - FRDM-KE15Z + - EVK-MIMXRT1060 + - LPCXPRESSO54628 + - LPCXPRESSO55S69 + - LPC845max + + + +-------------------------------------------------------------------------------- +Copyright 2019-2020 NXP +ALL RIGHTS RESERVED +www.nxp.com/freemaster diff --git a/middleware/freemaster/doc/serial_protocol_readme.txt b/middleware/freemaster/doc/serial_protocol_readme.txt new file mode 100644 index 0000000..b7306c0 --- /dev/null +++ b/middleware/freemaster/doc/serial_protocol_readme.txt @@ -0,0 +1,8 @@ +The serial_protocol_v4.pdf file is a printout of wiki pages maintained internally +in NXP until an official version of FreeMASTER Serial Protocol V4 will be made +available. + +Some hypertext links inside the serial_protocol_v4.pdf file may point to +other wiki pages which are kept internal in NXP. Please contact your NXP +representative to get more information about the FreeMASTER tool, protocol +or communication driver development. diff --git a/middleware/freemaster/doc/serial_protocol_v4.pdf b/middleware/freemaster/doc/serial_protocol_v4.pdf new file mode 100644 index 0000000..4be9780 Binary files /dev/null and b/middleware/freemaster/doc/serial_protocol_v4.pdf differ diff --git a/middleware/freemaster/doc/user_guide.pdf b/middleware/freemaster/doc/user_guide.pdf new file mode 100644 index 0000000..645ca40 Binary files /dev/null and b/middleware/freemaster/doc/user_guide.pdf differ diff --git a/middleware/freemaster/license/LA_OPT_NXP_Software_License.txt b/middleware/freemaster/license/LA_OPT_NXP_Software_License.txt new file mode 100644 index 0000000..f81efaf --- /dev/null +++ b/middleware/freemaster/license/LA_OPT_NXP_Software_License.txt @@ -0,0 +1,2 @@ +LA_OPT_NXP_Software_License v15 August 2020  IMPORTANT.  Read the following NXP Software License Agreement ("Agreement") completely. By selecting the "I Accept" button at the end of this page, or by downloading, installing, or using the Licensed Software, you indicate that you accept the terms of the Agreement and you acknowledge that you have the authority, for yourself or on behalf of your company, to bind your company to these terms. You may then download or install the file. In the event of a conflict between the terms of this Agreement and any license terms and conditions for NXP's proprietary software embedded anywhere in the Licensed Software file, the terms of this Agreement shall control.  If a separate license agreement for the Licensed Software has been signed by you and NXP, then that agreement shall govern your use of the Licensed Software and shall supersede this Agreement. NXP SOFTWARE LICENSE AGREEMENT This is a legal agreement between your employer, of which you are an authorized representative, or, if you have no employer, you as an individual ("you" or "Licensee"), and NXP B.V. ("NXP").  It concerns your rights to use the software provided to you in binary or source code form and any accompanying written materials (the "Licensed Software"). The Licensed Software may include any updates or error corrections or documentation relating to the Licensed Software provided to you by NXP under this Agreement. In consideration for NXP allowing you to access the Licensed Software, you are agreeing to be bound by the terms of this Agreement. If you do not agree to all of the terms of this Agreement, do not download or install the Licensed Software. If you change your mind later, stop using the Licensed Software and delete all copies of the Licensed Software in your possession or control. Any copies of the Licensed Software that you have already distributed, where permitted, and do not destroy will continue to be governed by this Agreement. Your prior use will also continue to be governed by this Agreement. 1.       DEFINITIONS 1.1.         "Affiliate" means, with respect to a party, any corporation or other legal entity that now or hereafter Controls, is Controlled by or is under common Control with such party; where "Control" means the direct or indirect ownership of greater than fifty percent (50%) of the shares or similar interests entitled to vote for the election of directors or other persons performing similar functions. An entity is considered an Affiliate only so long as such Control exists. 1.2 "Authorized System" means either (i) Licensee's hardware product which incorporates an NXP Product or (ii) Licensee's software program which is used exclusively in connection with an NXP Product and with which the Licensed Software will be integrated.       1.3. "Derivative Work" means a work based upon one or more pre-existing works. A work consisting of editorial revisions, annotations, elaborations, or other modifications which, as a whole, represent an original work of authorship, is a Derivative Work.         1.4 "Intellectual Property Rights" means any and all rights under statute, common law or equity in and under copyrights, trade secrets, and patents (including utility models), and analogous rights throughout the world, including any applications for and the right to apply for, any of the foregoing. 1.5 "NXP Product" means a programmable processing unit (e.g. a microprocessor, microcontroller, sensor or digital signal processor) supplied directly or indirectly from NXP or an NXP Affiliate. 1.6      "Software Content Register" means the documentation which may accompany the Licensed Software which identifies the contents of the Licensed Software, including but not limited to identification of any Third Party Software, if any, and may also contain other related information as whether the license in 2.3 is applicable.  1.7     "Third Party Software" means, any software included in the Licensed Software that is not NXP proprietary software, and is not open source software, and to which different license terms may apply.  2.       LICENSE GRANT.   2.1.         If you are not expressly granted the distribution license in Section 2.3 in the Software Content Register, then you are only granted the rights in Section 2.2 and not in 2.3. If you are expressly granted the distribution license in Section 2.3 in the Software Content Register, then you are granted the rights in both Section 2.2 and 2.3. 2.2. Standard License. Subject to the terms and conditions of this Agreement, NXP grants you a worldwide, personal, non-transferable, non-exclusive, non-sublicensable license, solely for the development of an Authorized System: (a) to use and reproduce the Licensed Software (and its Derivative Works prepared under the license in Section 2.2(b)); and (b) for Licensed Software provided to you in source code form (human readable), to prepare Derivative Works of the Licensed Software. You may not distribute or sublicense the Licensed Software to others under the license granted in this Section 2.2.   2.3.        Additional Distribution License. If expressly authorized in the Software Content Register, subject to the terms and conditions of this Agreement, NXP grants you a worldwide, personal, non-transferable, non-exclusive, non-sublicensable license solely in connection with your manufacturing and distribution of an Authorized System: (a) to manufacture (or have manufactured), distribute, and market the Licensed Software (and its Derivative Works prepared under the license in 2.2(b)) in object code (machine readable format) only as part of, or embedded within, Authorized Systems and not on a standalone basis. Notwithstanding the foregoing, those files marked as .h files ("Header files") may be distributed in source or object code form, but only as part of, or embedded within Authorized Systems; and (b) to copy and distribute as needed, solely in connection with an Authorized System, non-confidential NXP information provided as part of the Licensed Software for the purpose of maintaining and supporting Authorized Systems with which the Licensed Software is integrated. 2.4 Separate license grants to Third Party Software, or other terms applicable to the Licensed Software if different from those granted in this Section 2, are contained in Appendix A. The Licensed Software may be accompanied by a Software Content Register which will identify that portion of the Licensed Software, if any, that is subject to the different terms in Appendix A.  2.5.         You may use subcontractors on your premises to exercise your rights under Section 2.2 and Section 2.3, if any, so long as you have an agreement in place with the subcontractor containing confidentiality restrictions no less stringent than those contained in this Agreement. You will remain liable for your subcontractors' adherence to the terms of this Agreement and for any and all acts and omissions of such subcontractors with respect to this Agreement and the Licensed Software. 3.       LICENSE LIMITATIONS AND RESTRICTIONS.   3.1.         The licenses granted above in Section 2 only extend to NXP Intellectual Property Rights that would be infringed by the unmodified Licensed Software prior to your preparation of any Derivative Work.    3.2.         The Licensed Software is licensed to you, not sold. Title to Licensed Software delivered hereunder remains vested in NXP or NXP's licensor and cannot be assigned or transferred. You are expressly forbidden from selling or otherwise distributing the Licensed Software, or any portion thereof, except as expressly permitted herein. This Agreement does not grant to you any implied rights under any NXP or third party Intellectual Property Rights. 3.3.         You may not translate, reverse engineer, decompile, or disassemble the Licensed Software except to the extent applicable law specifically prohibits such restriction. You must prohibit your subcontractors or customers (if distribution is permitted) from translating, reverse engineering, decompiling, or disassembling the Licensed Software except to the extent applicable law specifically prohibits such restriction. 3.4.         You must reproduce any and all of NXP's (or its third-party licensor's) copyright notices and other proprietary legends on copies of Licensed Software.   3.5.         If you distribute the Licensed Software to the United States Government, then the Licensed Software is "restricted computer software" and is subject to FAR 52.227-19.    3.6.         You grant to NXP a non-exclusive, non-transferable, irrevocable, perpetual, worldwide, royalty-free, sub-licensable license under your Intellectual Property Rights to use without restriction and for any purpose any suggestion, comment or other feedback related to the Licensed Software (including, but not limited to, error corrections and bug fixes). 3.7.         You will not take or fail to take any action that could subject the Licensed Software to an Excluded License. An Excluded License means any license that requires, as a condition of use, modification or distribution of software subject to the Excluded License, that such software or other software combined and/or distributed with the software be (i) disclosed or distributed in source code form; (ii) licensed for the purpose of making Derivative Works; or (iii) redistributable at no charge.  3.8.         You may not publish or distribute reports associated with the use of the Licensed Software to anyone other than NXP. You may advise NXP of any results obtained from your use of the Licensed Software, including any problems or suggested improvements thereof, and NXP retains the right to use such results and related information in any manner it deems appropriate. 4.       OPEN SOURCE.         Open source software included in the Licensed Software is not licensed under the terms of this Agreement but is instead licensed under the terms of the applicable open source license(s), such as the BSD License, Apache License or the GNU Lesser General Public License. Your use of the open source software is subject to the terms of each applicable license. You must agree to the terms of each applicable license, or you cannot use the open source software.   5.       INTELLECTUAL PROPERTY RIGHTS.    Your modifications to the Licensed Software, and all Intellectual Property Rights associated with, and title thereto, will be the property of NXP. Upon request, you must provide NXP the source code of any derivative of the Licensed Software. You agree to assign all, and hereby do assign all rights, title, and interest to any such modifications to the Licensed Software to NXP and agree to provide all assistance reasonably requested by NXP to establish, preserve or enforce such right. Further, you agree to waive all moral rights relating to your modifications to the Licensed Software, including, without limitation, all rights of identification of authorship and all rights of approval, restriction, or limitation on use or subsequent modification. Notwithstanding the foregoing, you will have the license rights granted in Section 2 hereto to any such modifications made by you or your subcontractor. 6.       ESSENTIAL PATENTS.    NXP has no obligation to identify or obtain any license to any Intellectual Property Right of a third-party that may be necessary for use in connection with technology that is incorporated into the Authorized System (whether or not as part of the Licensed Software). 7.       TERM AND TERMINATION.   This Agreement will remain in effect unless terminated as provided in this Section. 7.1.         You may terminate this Agreement immediately upon written notice to NXP at the address provided below. 7.2.         Either party may terminate this Agreement if the other party is in default of any of the terms and conditions of this Agreement, and termination is effective if the defaulting party fails to correct such default within 30 days after written notice thereof by the non-defaulting party to the defaulting party at the address below. 7.3.         Notwithstanding the foregoing, NXP may terminate this Agreement immediately upon written notice if you: breach any of your confidentiality obligations or the license restrictions under this Agreement;  become bankrupt, insolvent, or file a petition for bankruptcy or insolvency; make an assignment for the benefit of its creditors; enter proceedings for winding up or dissolution; are dissolved; or are nationalized or become subject to the expropriation of all or substantially all of your business or assets. 7.4.         Upon termination of this Agreement, all licenses granted under Section 2 will expire. 7.5.         After termination of this Agreement by either party you will destroy all parts of Licensed Software and its Derivative Works (if any) and will provide to NXP a statement certifying the same. 7.6.         Notwithstanding the termination of this Agreement for any reason, the terms of Sections 1 and 3 through 24 will survive.   8.        SUPPORT.  NXP is not obligated to provide any support, upgrades or new releases of the Licensed Software under this Agreement. If you wish, you may contact NXP and report problems and provide suggestions regarding the Licensed Software. NXP has no obligation to respond to such a problem report or suggestion. NXP may make changes to the Licensed Software at any time, without any obligation to notify or provide updated versions of the Licensed Software to you. 9.        NO WARRANTY.  To the maximum extent permitted by law, NXP expressly disclaims any warranty for the Licensed Software. The Licensed Software is provided "AS IS", without warranty of any kind, either express or implied, including without limitation the implied warranties of merchantability, fitness for a particular purpose, or non-infringement. You assume the entire risk arising out of the use or performance of the licensed software, or any systems you design using the licensed software (if any). 10.        INDEMNITY. You agree to fully defend and indemnify NXP from all claims, liabilities, and costs (including reasonable attorney's fees) related to (1) your use (including your subcontractor's or distributee's use, if permitted) of the Licensed Software or (2) your violation of the terms and conditions of this Agreement. 11.        LIMITATION OF LIABILITY.  EXCLUDING LIABILITY FOR A BREACH OF SECTION 2 (LICENSE GRANTS), SECTION 3 (LICENSE LIMITATIONS AND RESTRICTIONS), SECTION 16 (CONFIDENTIAL INFORMATION), OR CLAIMS UNDER SECTION 10 (INDEMNITY), IN NO EVENT WILL EITHER PARTY BE LIABLE, WHETHER IN CONTRACT, TORT, OR OTHERWISE, FOR ANY INCIDENTAL, SPECIAL, INDIRECT, CONSEQUENTIAL OR PUNITIVE DAMAGES, INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR ANY LOSS OF USE, LOSS OF TIME, INCONVENIENCE, COMMERCIAL LOSS, OR LOST PROFITS, SAVINGS, OR REVENUES, TO THE FULL EXTENT SUCH MAY BE DISCLAIMED BY LAW. NXP'S TOTAL LIABILITY FOR ALL COSTS, DAMAGES, CLAIMS, OR LOSSES WHATSOEVER ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT OR PRODUCT(S) SUPPLIED UNDER THIS AGREEMENT IS LIMITED TO THE AGGREGATE AMOUNT PAID BY YOU TO NXP IN CONNECTION WITH THE LICENSED SOFTWARE PROVIDED UNDER THIS AGREEMENT TO WHICH LOSSES OR DAMAGES ARE CLAIMED. 12.        EXPORT COMPLIANCE. Each party shall comply with all applicable export and import control laws and regulations including but not limited to the US Export Administration Regulation (including restrictions on certain military end uses and military end users as specified in Section 15 C.F.R. § 744.21 and prohibited party lists issued by other federal governments), Catch-all regulations and all national and international embargoes. Each party further agrees that it will not knowingly transfer, divert, export or re-export, directly or indirectly, any product, software, including software source code, or technology restricted by such regulations or by other applicable national regulations, received from the other party under this Agreement, or any direct product of such software or technical data to any person, firm, entity, country or destination to which such transfer, diversion, export or re-export is restricted or prohibited, without obtaining prior written authorization from the applicable competent government authorities to the extent required by those laws. 13.   GOVERNMENT CONTRACT COMPLIANCE 13.1.      If you sell Authorized Systems directly to any government or public entity, including U.S., state, local, foreign or international governments or public entities, or indirectly via a prime contractor or subcontractor of such governments or entities, NXP makes no representations, certifications, or warranties whatsoever about compliance with government or public entity acquisition statutes or regulations, including, without limitation, statutes or regulations that may relate to pricing, quality, origin or content. 13.2.      The Licensed Software has been developed at private expense and is a "Commercial Item" as defined in 48 C.F.R. Section 2.101, consisting of "Commercial Computer Software", and/or "Commercial Computer Software Documentation," as such terms are used in 48 C.F.R. Section 12.212 (or 48 C.F.R. Section 227.7202, as applicable) and may only be licensed to or shared with U.S. Government end users in object code form as part of, or embedded within, Authorized Systems. Any agreement pursuant to which you share the Licensed Software will include a provision that reiterates the limitations of this document and requires all sub-agreements to similarly contain such limitations.  14.        CRITICAL APPLICATIONS. In some cases, NXP may promote certain software for use in the development of, or for incorporation into, products or services (a) used in applications requiring fail-safe performance or (b) in which failure could lead to death, personal injury, or severe physical or environmental damage (these products and services are referred to as "Critical Applications"). NXP's goal is to educate customers so that they can design their own end-product solutions to meet applicable functional safety standards and requirements. Licensee makes the ultimate design decisions regarding its products and is solely responsible for compliance with all legal, regulatory, safety, and security related requirements concerning its products, regardless of any information or support that may be provided by NXP. As such, Licensee assumes all risk related to use of the Licensed Software in Critical Applications and NXP SHALL NOT BE LIABLE FOR ANY SUCH USE IN CRITICAL APPLICATIONS BY LICENSEE. Accordingly, Licensee will indemnify and hold NXP harmless from any claims, liabilities, damages and associated costs and expenses (including attorneys' fees) that NXP may incur related to Licensee’s incorporation of the Licensed Software in a Critical Application. 15.        CHOICE OF LAW; VENUE.  This Agreement will be governed by, construed, and enforced in accordance with the laws of The Netherlands, without regard to conflicts of laws principles, will apply to all matters relating to this Agreement or the Licensed Software, and you agree that any litigation will be subject to the exclusive jurisdiction of the courts of Amsterdam, The Netherlands. The United Nations Convention on Contracts for the International Sale of Goods will not apply to this document.  16.        CONFIDENTIAL INFORMATION.  Subject to the license grants and restrictions contained herein, you must treat the Licensed Software as confidential information and you agree to retain the Licensed Software in confidence perpetually. You may not disclose any part of the Licensed Software to anyone other than distributees in accordance with Section 2.3 and employees, or subcontractors in accordance with Section 2.5, who have a need to know of the Licensed Software and who have executed written agreements obligating them to protect such Licensed Software to at least the same degree of confidentiality as in this Agreement. You agree to use the same degree of care, but no less than a reasonable degree of care, with the Licensed Software as you do with your own confidential information. You may disclose Licensed Software to the extent required by a court or under operation of law or order provided that you notify NXP of such requirement prior to disclosure, which you only disclose the minimum of the required information, and that you allow NXP the opportunity to object to such court or other legal body requiring such disclosure. 17.       TRADEMARKS.  You are not authorized to use any NXP trademarks, brand names, or logos. 18.        ENTIRE AGREEMENT.  This Agreement constitutes the entire agreement between you and NXP regarding the subject matter of this Agreement, and supersedes all prior communications, negotiations, understandings, agreements or representations, either written or oral, if any. This Agreement may only be amended in written form, signed by you and NXP. 19.        SEVERABILITY.  If any provision of this Agreement is held for any reason to be invalid or unenforceable, then the remaining provisions of this Agreement will be unimpaired and, unless a modification or replacement of the invalid or unenforceable provision is further held to deprive you or NXP of a material benefit, in which case the Agreement will immediately terminate, the invalid or unenforceable provision will be replaced with a provision that is valid and enforceable and that comes closest to the intention underlying the invalid or unenforceable provision. 20.        NO WAIVER.  The waiver by NXP of any breach of any provision of this Agreement will not operate or be construed as a waiver of any other or a subsequent breach of the same or a different provision. 21.        AUDIT.  You will keep full, clear and accurate records with respect to your compliance with the limited license rights granted under this Agreement for three years following expiration or termination of this Agreement. NXP will have the right, either itself or through an independent certified public accountant to examine and audit, at NXP's expense, not more than once a year, and during normal business hours, all such records that may bear upon your compliance with the limited license rights granted above. You must make prompt adjustment to compensate for any errors and/or omissions disclosed by such examination or audit. 22.        NOTICES.             All notices and communications under this Agreement will be made in writing, and will be effective when received at the following addresses:            NXP:       NXP B.V.                        High Tech Campus 60                          5656 AG Eindhoven                          The Netherlands                     ATTN: Legal Department   You:              The address provided at registration will be used. 23.        RELATIONSHIP OF THE PARTIES.     The parties are independent contractors. Nothing in this Agreement will be construed to create any partnership, joint venture, or similar relationship. Neither party is authorized to bind the other to any obligations with third parties. 24.        SUCCESSION AND ASSIGNMENT.   This Agreement will be binding upon and inure to the benefit of the parties and their permitted successors and assigns.  You may not assign this Agreement, or any part of this Agreement, without the prior written approval of NXP, which approval will not be unreasonably withheld or delayed. NXP may assign this Agreement, or any part of this Agreement, in its sole discretion.     + APPENDIX A Other License Grants and Restrictions: The Licensed Software may include some or all of the following software, which is either 1) Third Party Software or 2) NXP proprietary software subject to different terms than those in the Agreement. If the Software Content Register that accompanies the Licensed Software identifies any of the following Third Party Software or specific components of the NXP proprietary software, the following terms apply to the extent they deviate from the terms in the Agreement: Amazon: Use of the Amazon software constitutes your acceptance of the terms of the Amazon Program Materials License Agreement (including the AVS Component Schedule, if applicable), located at https://developer.amazon.com/support/legal/pml. All Amazon software is hereby designated "Amazon confidential". Amazon is a third-party beneficiary to this Agreement with respect to the Amazon software. Amphion Semiconductor Ltd.: Distribution of Amphion software must be a part of, or embedded within, Authorized Systems that include an Amphion Video Decoder. Aquantia Corp.: You may use Aquantia's API binaries solely to flash the API software to an NXP Product which mates with an Aquantia device. Atheros: Use of Atheros software is limited to evaluation and demonstration only. Permitted distributions must be similarly limited. Further rights must be obtained directly from Atheros. ATI (AMD): Distribution of ATI software must be a part of, or embedded within, Authorized Systems that include a ATI graphics processor core. Broadcom Corporation: Your use of Broadcom Corporation software is restricted to Authorized Systems that incorporate a compatible integrated circuit device manufactured or sold by Broadcom. Cadence Design Systems: Use of Cadence audio codec software is limited to distribution only of one copy per single NXP Product. The license granted herein to the Cadence Design Systems HiFi aacPlus Audio Decoder software does not include a license to the AAC family of technologies which you or your customer may need to obtain. Configuration tool outputs may only be distributed by licensees of the relevant Cadence SDK and distribution is limited to distribution of one copy embedded in a single NXP Product. Cirque Corporation: Use of Cirque Corporation technology is limited to evaluation, demonstration, or certification testing only. Permitted distributions must be similarly limited. Further rights, including but not limited to ANY commercial distribution rights, must be obtained directly from Cirque Corporation. Coding Technologies (Dolby Labs): Use of CTS software is limited to evaluation and demonstration only. Permitted distributions must be similarly limited. Further rights must be obtained from Dolby Laboratories. CSR: Use of Cambridge Silicon Radio, Inc. ("CSR") software is limited to evaluation and demonstration only. Permitted distributions must be similarly limited. Further rights must be obtained directly from CSR. Crank: Use of Crank Software Inc. software is limited to evaluation and demonstration only. Permitted distributions must be similarly limited. Further rights must be obtained directly from Crank Software Inc. Cypress Semiconductor Corporation: WWD RTOS source code may only be used in accordance with the Cypress IOT Community License Agreement located at https://community.cypress.com/terms-and-conditions!input.jspa?displayOnly=true. Embedded Systems Academy GmbH (EmSA): Any use of Micro CANopen Plus is subject to the acceptance of the license conditions described in the LICENSE.INFO file distributed with all example projects and in the documentation and the additional clause described below. Clause 1: Micro CANopen Plus may not be used for any competitive or comparative purpose, including the publication of any form of run time or compile time metric, without the express permission of EmSA. Future Technology Devices International Ltd.: Future Technology Devices International software must be used consistent with the terms found here: http://www.ftdichip.com/Drivers/FTDriverLicenceTerms.htm Global Locate (Broadcom Corporation): Use of Global Locate, Inc. software is limited to evaluation and demonstration only. Permitted distributions must be similarly limited. Further rights must be obtained from Global Locate. Microsoft: Except for Microsoft PlayReady software, if the Licensed Software includes software owned by Microsoft Corporation ("Microsoft"), it is subject to the terms of your license with Microsoft (the "Microsoft Underlying Licensed Software") and as such, NXP grants no license to you, beyond evaluation and demonstration in connection with NXP processors, in the Microsoft Underlying Licensed Software. You must separately obtain rights beyond evaluation and demonstration in connection with the Microsoft Underlying Licensed Software from Microsoft. Microsoft does not provide support services for the components provided to you through this Agreement. If you have any questions or require technical assistance, please contact NXP. Microsoft Corporation is a third party beneficiary to this Agreement with the right to enforce the terms of this Agreement. TO THE MAXIMUM EXTENT PERMITTED BY LAW, MICROSOFT AND ITS AFFILIATES DISCLAIM ANY WARRANTIES FOR THE MICROSOFT UNDERLYING LICENSED SOFTWARE. TO THE MAXIMUM EXTENT PERMITTED BY LAW, NEITHER MICROSOFT NOR ITS AFFILIATES WILL BE LIABLE, WHETHER IN CONTRACT, TORT, OR OTHERWISE, FOR ANY DIRECT, INCIDENTAL, SPECIAL, INDIRECT, CONSEQUENTIAL OR PUNITIVE DAMAGES, INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR ANY LOSS OF USE, LOSS OF TIME, INCONVENIENCE, COMMERCIAL LOSS, OR LOST PROFITS, SAVINGS, OR REVENUES, ARISING FROM THE FROM THE USE OF THE MICROSOFT UNDERLYING LICENSED SOFTWARE. With respect to the Microsoft PlayReady software, you will have the license rights granted in Section 2, provided that you may not use the Microsoft PlayReady software unless you have entered into a Microsoft PlayReady Master Agreement and license directly with Microsoft. MindTree: Notwithstanding the terms contained in Section 2.3 (a), if the Licensed Software includes proprietary software of MindTree in source code format, Licensee may make modifications and create derivative works only to the extent necessary for debugging of the Licensed Software. MM SOLUTIONS AD: Use of MM SOLUTIONS AEC (Auto Exposure Control) and AWB (Auto White Balance) software is limited to demonstration, testing, and evaluation only. In no event may Licensee distribute or sublicense the MM SOLUTIONS software. Further rights must be obtained directly from MM SOLUTIONS. MPEG LA: Use of MPEG LA audio or video codec technology is limited to evaluation and demonstration only. Permitted distributions must be similarly limited. Further rights must be obtained directly from MPEG LA. MQX RTOS Code: MQX RTOS source code may not be re-distributed by any NXP Licensee under any circumstance, even by a signed written amendment to this Agreement. NXP Wireless Charging Library: License to the Software is limited to use in inductive coupling or wireless charging applications Opus: Use of Opus software must be consistent with the terms of the Opus license which can be found at: http://www.opus-codec.org/license/ Oracle JRE (Java): The Oracle JRE must be used consistent with terms found here: http://java.com/license P&E Micro: P&E Software must be used consistent with the terms found here: http://www.pemicro.com/licenses/gdbserver/license_gdb.pdf Pro Design Electronic: Licensee may not modify, create derivative works based on, or copy the Pro Design software, documentation, hardware execution key or the accompanying materials. Licensee shall not use Pro Design's or any of its licensors names, logos or trademarks to market the Authorized System. Only NXP customers and distributors are permitted to further redistribute the Pro Design software and only as part of an Authorized System which contains the Pro Design software. Qualcomm Atheros, Inc.: Notwithstanding anything in this Agreement, Qualcomm Atheros, Inc. Wi-Fi software must be used strictly in accordance with the Qualcomm Atheros, Inc. Technology License Agreement that accompanies such software. Any other use is expressly prohibited. Real Networks - GStreamer Optimized Real Format Client Code implementation or OpenMax Optimized Real Format Client Code: Use of the GStreamer Optimized Real Format Client Code, or OpenMax Optimized Real Format Client code is restricted to applications in the automotive market. Licensee must be a final manufacturer in good standing with a current license with Real Networks for the commercial use and distribution of products containing the GStreamer Optimized Real Format Client Code implementation or OpenMax Optimized Real Format Client Code RivieraWaves SAS (a member of the CEVA, Inc. family of companies): You may not use the RivieraWaves intellectual property licensed under this Agreement if you develop, market, and/or license products similar to such RivieraWaves intellectual property. Such use constitutes a breach of this Agreement. Any such use rights must be obtained directly from RivieraWaves. SanDisk Corporation: If the Licensed Software includes software developed by SanDisk Corporation ("SanDisk"), you must separately obtain the rights to reproduce and distribute this software in source code form from SanDisk. Please follow these easy steps to obtain the license and software: (1) Contact your local SanDisk sales representative to obtain the SanDisk License Agreement. (2) Sign the license agreement. Fax the signed agreement to SanDisk USA marketing department at 408-542-0403. The license will be valid when fully executed by SanDisk. (3) If you have specific questions, please send an email to sales@sandisk.com You may only use the SanDisk Corporation Licensed Software on products compatible with a SanDisk Secure Digital Card. You may not use the SanDisk Corporation Licensed Software on any memory device product. SanDisk retains all rights to any modifications or derivative works to the SanDisk Corporation Licensed Software that you may create. SEGGER Microcontroller - emWin Software: Your use of SEGGER emWin software and components is restricted for development of NXP ARM7, ARM9, Cortex-M0, Cortex-M3, Cortex-M4, Cortex-M33, Cortex-M7, and Cortex-A7 based products only. SEGGER Microcontroller - J-Link/J-Trace Software: Segger software must be used consistent with the terms found here: http://www.segger.com/jlink-software.html Synopsys/Target Compiler Technologies: Your use of the Synopsys/Target Compiler Technologies Licensed Software and related documentation is subject to the following: (1) Duration of the license for the Licensed Software is limited to 12 months, unless otherwise specified in the license file. (2) The Licensed Software is usable by one user at a time on a single designated computer, unless otherwise agreed by Synopsys. (3) Licensed Software and documentation are to be used only on a designated computer at the designated physical address provided by you on the APEX license form. (4) The Licensed Software is not sub-licensable. TARA Systems: Use of TARA Systems GUI technology Embedded Wizard is limited to evaluation and demonstration only. Permitted distributions must be similarly limited. Further rights must be obtained directly from TARA Systems. Texas Instruments: Your use of Texas Instruments Inc. WiLink8 Licensed Software is restricted to NXP SoC based systems that include a compatible connectivity device manufactured by TI. TES Electronic Solutions Germany (TES): TES 3D Surround View software and associated data and documentation may only be used for evaluation purposes and for demonstration to third parties in integrated form on a board package containing an NXP S32V234 device. Licensee may not distribute or sublicense the TES software. Your license to the TES software may be terminated at any time upon notice. Vivante: Distribution of Vivante software must be a part of, or embedded within, Authorized Systems that include a Vivante Graphics Processing Unit. \ No newline at end of file diff --git a/middleware/freemaster/license/SW-Content-Register.txt b/middleware/freemaster/license/SW-Content-Register.txt new file mode 100644 index 0000000..2f6d160 --- /dev/null +++ b/middleware/freemaster/license/SW-Content-Register.txt @@ -0,0 +1,36 @@ +Release Name: FreeMASTER Communication Driver +============================================= + +FreeMASTER Communication Driver Version: 3.x +for NXP Microcontrollers Author: NXP + License: LA_OPT_NXP_Software_License - Production Use - Section 2.3 applies + Content register: this file + Format: source code + Location: src/common/*, src/platforms/*, src/drivers/* + + +FreeMASTER Example Code Version: n/a + Author: NXP + License: Open Source - BSD-3-Clause + Content register: this file + Format: source code + Location: boards/*, src/support/mcuxsdk_usb/* + + +SHA-1 crypto-algorithms library Version: n/a +written by Brad Conte, brad@bradconte.com License: public domain +updated by NXP License text: https://github.com/B-Con/crypto-algorithms/blob/master/README.md + Original location: https://github.com/B-Con/crypto-algorithms + Format: source code modified for FreeMASTER driver needs + Location: src/common/freemaster_sha.c + + +bernii gauge.js component Used as minified version in demo project UI + Author: Bernard Kobos, https://github.com/bernii + License: MIT + Original location: http://bernii.github.io/gauge.js + +SEGGER RTT support Version: 7.22b + Author: SEGGER Microcontroller GmbH + License: public use permitted + Location: src/support/segger_rtt/* \ No newline at end of file diff --git a/middleware/freemaster/middleware_fmstr_LPC845.cmake b/middleware/freemaster/middleware_fmstr_LPC845.cmake new file mode 100644 index 0000000..e9f20cf --- /dev/null +++ b/middleware/freemaster/middleware_fmstr_LPC845.cmake @@ -0,0 +1,25 @@ +include_guard(GLOBAL) +message("middleware_fmstr component is included.") + +target_sources(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_appcmd.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_pipes.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_protocol.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_rec.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_scope.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_tsa.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_ures.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_utils.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_can.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_sha.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_pdbdm.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_serial.c + ${CMAKE_CURRENT_LIST_DIR}/src/common/freemaster_net.c +) + + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/src/common +) + + diff --git a/middleware/freemaster/middleware_fmstr_platform_gen32le_LPC845.cmake b/middleware/freemaster/middleware_fmstr_platform_gen32le_LPC845.cmake new file mode 100644 index 0000000..8dcec50 --- /dev/null +++ b/middleware/freemaster/middleware_fmstr_platform_gen32le_LPC845.cmake @@ -0,0 +1,28 @@ +include_guard(GLOBAL) +message("middleware_fmstr_platform_gen32le component is included.") + +target_sources(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/can/freemaster_flexcan.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/can/freemaster_mscan.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/can/freemaster_mcan.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/serial/freemaster_serial_uart.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/serial/freemaster_serial_lpsci.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/serial/freemaster_serial_lpuart.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/serial/freemaster_serial_usart.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/serial/freemaster_serial_miniusart.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/serial/freemaster_serial_usb.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/network/freemaster_net_segger_rtt.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/network/freemaster_net_lwip_udp.c + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/network/freemaster_net_lwip_tcp.c +) + + +target_include_directories(${MCUX_SDK_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/src/platforms/gen32le + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/can + ${CMAKE_CURRENT_LIST_DIR}/src/drivers/mcuxsdk/serial +) + + +include(middleware_fmstr_LPC845) + diff --git a/middleware/freemaster/src/common/freemaster.h b/middleware/freemaster/src/common/freemaster.h new file mode 100644 index 0000000..23f7795 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster.h @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - master header file + */ + +#ifndef __FREEMASTER_H +#define __FREEMASTER_H + +/****************************************************************************** + * Include user configuration file and define default configuration parameters + ******************************************************************************/ + +#include "freemaster_defcfg.h" + +/****************************************************************************** + * Include Platform-dependent file + ******************************************************************************/ + +#if FMSTR_PLATFORM_CORTEX_M +/* CortexM is a generic 32bit little-endian platform */ +#define FMSTR_PLATFORM "Cortex-M" +#include "freemaster_gen32le.h" +#elif FMSTR_PLATFORM_S12Z +/* CortexM is a generic 32bit little-endian platform */ +#define FMSTR_PLATFORM "S12Z" +#include "freemaster_s12z.h" +#elif FMSTR_PLATFORM_S32 +#define FMSTR_PLATFORM "S32" +#include "freemaster_gen32le.h" +#elif FMSTR_PLATFORM_PA32 +#define FMSTR_PLATFORM "PA32" +#include "freemaster_gen32be.h" +#elif FMSTR_PLATFORM_56F800E +#define FMSTR_PLATFORM "56F800E" +#include "freemaster_56f800e.h" +#else +/* If you are looking for legacy Motorola and Freescale platforms like 56F800, + HC08, HC12, ColdFire, please refer to FreeMASTER driver v2.0 available at + www.nxp.com/freemaster */ +#warning Unknown FreeMASTER driver platform, using default settings for generic 32bit platform + +/* Use default settings */ +#define FMSTR_PLATFORM "Generic-32LE" +#include "freemaster_gen32le.h" +#endif + +/***************************************************************************** + * Global types, platform independent + ******************************************************************************/ + +#ifndef FMSTR_TRUE +#define FMSTR_TRUE (1U) +#endif + +#ifndef FMSTR_FALSE +#define FMSTR_FALSE (0U) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Pipe usage modes */ +#define FMSTR_PIPE_MODE_CONSOLE 0x00U +#define FMSTR_PIPE_MODE_UINT 0x04U +#define FMSTR_PIPE_MODE_INT 0x08U +#define FMSTR_PIPE_MODE_REAL 0x0CU + +/* Pipe element size */ +#define FMSTR_PIPE_SIZE_1B 0x00U +#define FMSTR_PIPE_SIZE_2B 0x01U +#define FMSTR_PIPE_SIZE_4B 0x02U +#define FMSTR_PIPE_SIZE_8B 0x03U + +/* Pipe type constants to be used with FMSTR_PipeOpen() */ +#define FMSTR_PIPE_TYPE_ANSI_TERMINAL (FMSTR_PIPE_MODE_CONSOLE | FMSTR_PIPE_SIZE_1B) +#define FMSTR_PIPE_TYPE_UNICODE_TERMINAL (FMSTR_PIPE_MODE_CONSOLE | FMSTR_PIPE_SIZE_2B) + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/* application command-specific types */ +typedef unsigned char FMSTR_APPCMD_CODE; +typedef unsigned char FMSTR_APPCMD_DATA, *FMSTR_APPCMD_PDATA; +typedef unsigned char FMSTR_APPCMD_RESULT; + +/* pointer to application command callback handler */ +typedef FMSTR_APPCMD_RESULT (*FMSTR_PAPPCMDFUNC)(FMSTR_APPCMD_CODE code, FMSTR_APPCMD_PDATA pdata, FMSTR_SIZE size); + +/* pipe-related types */ +typedef void *FMSTR_HPIPE; /* pipe handle */ +typedef unsigned short FMSTR_PIPE_PORT; /* pipe port identifier (unsigned, 7 bits used) */ +typedef unsigned short FMSTR_PIPE_SIZE; /* pipe buffer size type (unsigned, at least 16 bits) */ + +/* pointer to pipe event handler */ +typedef void (*FMSTR_PPIPEFUNC)(FMSTR_HPIPE pipeHandle); + +/* PDBDM buffer type, it is in a public header as user may want to define a custom buffer instance + (when FMSTR_PDBDM_USER_BUFFER is defined) */ +typedef struct +{ + FMSTR_U32 ctxStart; /* Border code of Packet driven BDM communication buffer */ + FMSTR_U8 bdmState; /* State of the Packet driven BDM communication */ + FMSTR_U8 pcktSize; /* Size of current buffer. */ + FMSTR_U8 padding0; /* Padding to align buffer by 4. */ + FMSTR_U8 cmdStatus; /* Command status byte */ + FMSTR_BCHR commBuffer[FMSTR_COMM_BUFFER_SIZE]; /*FreeMASTER Packet driven BDM communication buffer (in/out) plus the STS */ + FMSTR_U32 reservedForCrc; /* Reserved to store additional checking informations in communication in case that full length of buffer is used. */ + FMSTR_U32 ctxEnd; /* Border code of Packet driven BDM communication buffer */ +} FMSTR_PDBDM_COMBUFF; + +#ifdef __cplusplus +} +#endif + +/***************************************************************************** + * FreeMASTER user types and macros + ******************************************************************************/ + +#include "freemaster_tsa.h" +#include "freemaster_rec.h" +#include "freemaster_ures.h" + +/***************************************************************************** + * Constants + ******************************************************************************/ + +/* Application command status information */ +#define FMSTR_APPCMDRESULT_NOCMD 0xffU +#define FMSTR_APPCMDRESULT_RUNNING 0xfeU +#define MFSTR_APPCMDRESULT_LASTVALID 0xf7U /* F8-FF are reserved */ + +/* Recorder time base is reported in nanoseconds in protocol V4 */ +#define FMSTR_REC_BASE_SECONDS(x) (((FMSTR_U32)(x)) * 1000000000UL) +#define FMSTR_REC_BASE_MILLISEC(x) (((FMSTR_U32)(x)) * 1000000UL) +#define FMSTR_REC_BASE_MICROSEC(x) (((FMSTR_U32)(x)) * 1000UL) +#define FMSTR_REC_BASE_NANOSEC(x) ((FMSTR_U32)(x)) + +/* The Access Protection levels */ +#define FMSTR_RESTRICTED_ACCESS_NO 0U +#define FMSTR_RESTRICTED_ACCESS_R 1U +#define FMSTR_RESTRICTED_ACCESS_RW 2U +#define FMSTR_RESTRICTED_ACCESS_RWF 3U + +/* The Authentication protocols supported */ +#define FMSTR_AUTHENT_PRTCL_SHA1 0x01U + +#define FMSTR_AUTHENT_PRTCL_SHA1_SALT_LEN 16U + +/****************************************************************************** + * NULL needed + ******************************************************************************/ + +#ifndef NULL +#ifdef __cplusplus +#define NULL (0) +#else +#define NULL ((void *)0) +#endif +#endif + +/***************************************************************************** + * ASSERT functionality + ******************************************************************************/ + +#if defined(DEBUG) +#include +#define FMSTR_ASSERT(condition) assert(condition) +#else +#define FMSTR_ASSERT(condition) +#endif + +#define FMSTR_ASSERT_RETURN(condition, ret) \ + do \ + { \ + FMSTR_ASSERT(condition); \ + if (!(condition)) \ + { \ + return ret; \ + } \ + } while (0 == 1) + +/****************************************************************************** + * standard library functions; redirected to internal implementations by default. + ******************************************************************************/ + +/* Platform header may override the defines and use custom implementations */ +#ifndef FMSTR_StrCmp +#define FMSTR_StrCmp _FMSTR_StrCmp +#endif + +#ifndef FMSTR_StrLen +#define FMSTR_StrLen _FMSTR_StrLen +#endif + +#ifndef FMSTR_Rand +#define FMSTR_Rand _FMSTR_Rand +#endif + +#ifndef FMSTR_MemSet +#define FMSTR_MemSet _FMSTR_MemSet +#endif + +#ifndef FMSTR_MemCmp +#define FMSTR_MemCmp _FMSTR_MemCmp +#endif + +#ifndef FMSTR_MemCpy +#define FMSTR_MemCpy _FMSTR_MemCpy +#endif + +/***************************************************************************** + * Global functions + ******************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +/* FreeMASTER serial communication API */ +FMSTR_BOOL FMSTR_Init(void); /* general initialization */ +void FMSTR_Poll(void); /* polling call, use in SHORT_INTR and POLL_DRIVEN modes */ + +/* Recorder API */ +FMSTR_BOOL FMSTR_RecorderCreate(FMSTR_INDEX recIndex, FMSTR_REC_BUFF *buffCfg); +FMSTR_BOOL FMSTR_RecorderSetTimeBase(FMSTR_INDEX recIndex, FMSTR_U32 timeBase_ns); +FMSTR_BOOL FMSTR_RecorderConfigure(FMSTR_INDEX recIndex, FMSTR_REC_CFG *recCfg); +FMSTR_BOOL FMSTR_RecorderAddVariable(FMSTR_INDEX recIndex, FMSTR_INDEX recVarIx, FMSTR_REC_VAR *recVarCfg); +FMSTR_BOOL FMSTR_RecorderStart(FMSTR_INDEX recIndex); +FMSTR_BOOL FMSTR_RecorderTrigger(FMSTR_INDEX recIndex); +FMSTR_BOOL FMSTR_RecorderAbort(FMSTR_INDEX recIndex); +void FMSTR_Recorder(FMSTR_INDEX recIndex); + +/* Application commands API */ +FMSTR_APPCMD_CODE FMSTR_GetAppCmd(void); +FMSTR_APPCMD_PDATA FMSTR_GetAppCmdData(FMSTR_SIZE *dataLen); +FMSTR_BOOL FMSTR_RegisterAppCmdCall(FMSTR_APPCMD_CODE appCmdCode, FMSTR_PAPPCMDFUNC callbackFunc); + +void FMSTR_AppCmdAck(FMSTR_APPCMD_RESULT resultCode); +void FMSTR_AppCmdSetResponseData(FMSTR_ADDR resultDataAddr, FMSTR_SIZE resultDataLen); + +/* Dynamic TSA API */ +FMSTR_BOOL FMSTR_SetUpTsaBuff(FMSTR_ADDR buffAddr, FMSTR_SIZE buffSize); +FMSTR_BOOL FMSTR_TsaAddVar(FMSTR_TSATBL_STRPTR tsaName, + FMSTR_TSATBL_STRPTR tsaType, + FMSTR_TSATBL_VOIDPTR varAddr, + FMSTR_SIZE32 varSize, + FMSTR_SIZE flags); + +/* Loss-less Communication Pipes API */ +FMSTR_HPIPE FMSTR_PipeOpen(FMSTR_PIPE_PORT pipePort, + FMSTR_PPIPEFUNC pipeCallback, + FMSTR_ADDR pipeRxBuff, + FMSTR_PIPE_SIZE pipeRxSize, + FMSTR_ADDR pipeTxBuff, + FMSTR_PIPE_SIZE pipeTxSize, + FMSTR_U8 type, + const FMSTR_CHAR *name); +void FMSTR_PipeClose(FMSTR_HPIPE pipeHandle); +FMSTR_PIPE_SIZE FMSTR_PipeWrite(FMSTR_HPIPE pipeHandle, + FMSTR_ADDR pipeData, + FMSTR_PIPE_SIZE pipeDataLen, + FMSTR_PIPE_SIZE writeGranularity); +FMSTR_PIPE_SIZE FMSTR_PipeRead(FMSTR_HPIPE pipeHandle, + FMSTR_ADDR pipeData, + FMSTR_PIPE_SIZE pipeDataLen, + FMSTR_PIPE_SIZE readGranularity); + +/* Pipe printing and formatting */ +FMSTR_BOOL FMSTR_PipePuts(FMSTR_HPIPE pipeHandle, const char *text); +FMSTR_BOOL FMSTR_PipePrintf(FMSTR_HPIPE pipeHandle, const char *format, ...); +FMSTR_BOOL FMSTR_PipePrintfU8(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_U8 arg); +FMSTR_BOOL FMSTR_PipePrintfS8(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_S8 arg); +FMSTR_BOOL FMSTR_PipePrintfU16(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_U16 arg); +FMSTR_BOOL FMSTR_PipePrintfS16(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_S16 arg); +FMSTR_BOOL FMSTR_PipePrintfU32(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_U32 arg); +FMSTR_BOOL FMSTR_PipePrintfS32(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_S32 arg); + +/* Standard library internal implementations. Platform header makes them available using macro aliases. */ +FMSTR_INDEX _FMSTR_StrCmp(const FMSTR_CHAR *str1, const FMSTR_CHAR *str2); +FMSTR_INDEX _FMSTR_MemCmp(const void *b1, const void *b2, FMSTR_SIZE size); +FMSTR_SIZE _FMSTR_StrLen(const FMSTR_CHAR *str); +void _FMSTR_MemCpy(void *dest, const void *src, FMSTR_SIZE size); +void _FMSTR_MemSet(void *dest, FMSTR_U8 fill, FMSTR_SIZE size); +FMSTR_U32 _FMSTR_Rand(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_H */ diff --git a/middleware/freemaster/src/common/freemaster_appcmd.c b/middleware/freemaster/src/common/freemaster_appcmd.c new file mode 100644 index 0000000..1acb048 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_appcmd.c @@ -0,0 +1,498 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Application Commands handling + */ + +#include "freemaster.h" +#include "freemaster_private.h" +#include "freemaster_protocol.h" + +#if FMSTR_USE_APPCMD > 0 && FMSTR_DISABLE == 0 + +/*********************************** + * local variables + ***********************************/ + +static FMSTR_APPCMD_CODE fmstr_appCmd; /* app.cmd code (to application) */ +static FMSTR_APPCMD_DATA fmstr_appCmdBuff[FMSTR_APPCMD_BUFF_SIZE]; /* app.cmd data buffer */ +static FMSTR_SIZE fmstr_appCmdLen; /* app.cmd data length */ + +static FMSTR_APPCMD_RESULT fmstr_appCmdResult; /* app.cmd result code (from application) */ +static FMSTR_SIZE8 fmstr_appCmdResultDataLen; + +#if FMSTR_MAX_APPCMD_CALLS > 0 +static FMSTR_APPCMD_CODE fmstr_appCmdCallId[FMSTR_MAX_APPCMD_CALLS]; /* registered callback commands */ +static FMSTR_PAPPCMDFUNC fmstr_appCmdCallFunc[FMSTR_MAX_APPCMD_CALLS]; /* registered callback handlers */ +#endif + +/*********************************** + * local functions + ***********************************/ + +static FMSTR_INDEX FMSTR_FindAppCmdCallIndex(FMSTR_APPCMD_CODE appCmdCode); + +/****************************************************************************** + * + * @brief Initialize app.cmds interface + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_InitAppCmds(void) +{ +#if FMSTR_MAX_APPCMD_CALLS > 0 + FMSTR_INDEX i; + + for (i = 0; i < FMSTR_MAX_APPCMD_CALLS; i++) + { + fmstr_appCmdCallId[i] = FMSTR_APPCMDRESULT_NOCMD; + fmstr_appCmdCallFunc[i] = NULL; + } +#endif + + fmstr_appCmd = (FMSTR_APPCMD_CODE)FMSTR_APPCMDRESULT_NOCMD; + fmstr_appCmdResult = (FMSTR_APPCMD_RESULT)FMSTR_APPCMDRESULT_NOCMD; + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Handling SANDAPPCMD command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_StoreAppCmd(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_SIZE argsLen = msgSize - 1U; /* args len is datalen minus one */ + FMSTR_U8 code; + + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(retStatus != NULL); + +#if FMSTR_SESSION_COUNT > 1 + /* Is feature locked by me */ + if (FMSTR_IsFeatureOwned(session, FMSTR_FEATURE_APPCMD, 0) == FMSTR_FALSE) + { + *retStatus = FMSTR_STC_SERVBUSY; + return response; + } +#endif + + /* the previous command not yet processed */ + if (fmstr_appCmd != ((FMSTR_APPCMD_CODE)FMSTR_APPCMDRESULT_NOCMD)) + { + *retStatus = FMSTR_STC_SERVBUSY; + return response; + } + + msgBuffIO = FMSTR_ValueFromBuffer8(&code, msgBuffIO); + + /* does the application command fit to buffer ? */ + if (argsLen > (FMSTR_SIZE)FMSTR_APPCMD_BUFF_SIZE) + { + *retStatus = FMSTR_STC_INVBUFF; + return response; + } + + /* store command data into dedicated buffer */ + fmstr_appCmd = code; + fmstr_appCmdLen = argsLen; + + /* data copy */ + if (argsLen != 0U) + { + FMSTR_ADDR appCmdBuffAddr = (FMSTR_ADDR)fmstr_appCmdBuff; + + /*lint -e{534} ignoring return value */ + msgBuffIO = FMSTR_CopyFromBuffer(appCmdBuffAddr, msgBuffIO, (FMSTR_SIZE8)argsLen); + FMSTR_UNUSED(msgBuffIO); + } + + /* mark command as "running" (without any response data) */ + fmstr_appCmdResult = (FMSTR_APPCMD_RESULT)FMSTR_APPCMDRESULT_RUNNING; + fmstr_appCmdResultDataLen = 0U; + + /* success */ + *retStatus = FMSTR_STS_OK; + return response; +} + +/****************************************************************************** + * + * @brief Handling GETAPPCMDSTS command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + * @note The callback-registered commands are processed at the moment the PC + * tries to get the result for the first time. At this moment, we are + * sure the PC already got the command delivery packet acknowledged. + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_GetAppCmdStatus(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ +#if FMSTR_MAX_APPCMD_CALLS > 0 + FMSTR_PAPPCMDFUNC func = NULL; + FMSTR_INDEX index; + + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(retStatus != NULL); + +#if FMSTR_SESSION_COUNT > 1 + /* Is feature locked by me */ + if (FMSTR_IsFeatureOwned(session, FMSTR_FEATURE_APPCMD, 0) == FMSTR_FALSE) + { + *retStatus = FMSTR_STC_SERVBUSY; + return msgBuffIO; + } +#endif + + /* time to execute the command's callback */ + if ((index = FMSTR_FindAppCmdCallIndex(fmstr_appCmd)) >= 0) + { + func = fmstr_appCmdCallFunc[index]; + } + + /* valid callback function found? */ + if (func != NULL) + { + /* do execute callback, return value is app.cmd result code */ + fmstr_appCmdResult = func(fmstr_appCmd, fmstr_appCmdBuff, fmstr_appCmdLen); + + /* nothing more to do with this command (i.e. command acknowledged) */ + fmstr_appCmd = FMSTR_APPCMDRESULT_NOCMD; + } +#endif + + /* success */ + *retStatus = FMSTR_STS_OK; + return FMSTR_ValueToBuffer8(msgBuffIO, (FMSTR_U8)fmstr_appCmdResult); +} + +/****************************************************************************** + * + * @brief Handling GETAPPCMDDATA command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_GetAppCmdRespData(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_SIZE dataLen; + FMSTR_SIZE dataOffset; + + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(retStatus != NULL); + +#if FMSTR_SESSION_COUNT > 1 + /* Is feature locked by me */ + if (FMSTR_IsFeatureOwned(session, FMSTR_FEATURE_APPCMD, 0) == FMSTR_FALSE) + { + *retStatus = FMSTR_STC_SERVBUSY; + return response; + } +#endif + + /* the previous command not yet processed */ + if (fmstr_appCmd != ((FMSTR_APPCMD_CODE)FMSTR_APPCMDRESULT_NOCMD)) + { + *retStatus = FMSTR_STC_SERVBUSY; + return response; + } + + /* Get the data len from incomming buffer */ + msgBuffIO = FMSTR_SizeFromBuffer(&dataLen, msgBuffIO); + + /* Get the data offset from incomming buffer */ + msgBuffIO = FMSTR_SizeFromBuffer(&dataOffset, msgBuffIO); + + /* the response would not fit into comm buffer */ + if (dataLen > (FMSTR_U16)FMSTR_COMM_BUFFER_SIZE) + { + *retStatus = FMSTR_STC_RSPBUFFOVF; + return response; + } + + /* the data would be fetched outside the app.cmd response data */ + if ((((FMSTR_U16)dataOffset) + dataLen) > (FMSTR_SIZE8)fmstr_appCmdResultDataLen) + { + *retStatus = FMSTR_STC_INVSIZE; + return response; + } + + /* copy to buffer */ + { + FMSTR_ADDR appCmdBuffAddr = (FMSTR_ADDR)fmstr_appCmdBuff; + response = FMSTR_CopyToBuffer(response, appCmdBuffAddr, (FMSTR_SIZE8)dataLen); + } + + /* success */ + *retStatus = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + return response; +} + +/****************************************************************************** + * + * @brief Find index of registered app.cmd callback + * + * @param appCmdCode - App. command ID + * + * @return Index of function pointer in our local tables + * + ******************************************************************************/ + +static FMSTR_INDEX FMSTR_FindAppCmdCallIndex(FMSTR_APPCMD_CODE appCmdCode) +{ +#if FMSTR_MAX_APPCMD_CALLS > 0 + FMSTR_INDEX i; + + for (i = 0; i < FMSTR_MAX_APPCMD_CALLS; i++) + { + if (fmstr_appCmdCallId[i] == appCmdCode) + { + return i; + } + } +#else + /*lint -esym(528, FMSTR_FindAppCmdCallIndex) this function is + not referenced when APPCMD_CALLS are not used */ + FMSTR_UNUSED(appCmdCode); +#endif + + return -1; +} + +/****************************************************************************** + * + * @brief API: Mark the application command is processed by the application + * + * @param resultCode - the result code which is returned to a host + * + ******************************************************************************/ + +void FMSTR_AppCmdAck(FMSTR_APPCMD_RESULT resultCode) +{ + fmstr_appCmdResult = resultCode; + fmstr_appCmdResultDataLen = 0U; + + /* waiting for a new command to come */ + fmstr_appCmd = (FMSTR_APPCMD_CODE)FMSTR_APPCMDRESULT_NOCMD; +} + +/****************************************************************************** + * + * @brief API: Mark the application command is processed by the application + * + * @param pResultDataAddr - address of data we want to return to the PC + * @param resultDataLen - length of return data + * + ******************************************************************************/ + +void FMSTR_AppCmdSetResponseData(FMSTR_ADDR resultDataAddr, FMSTR_SIZE resultDataLen) +{ + /* any data supplied by user? */ + if (FMSTR_ADDR_VALID(resultDataAddr) != FMSTR_FALSE) + { + /* response data length is trimmed if response data would not fit into buffer */ + fmstr_appCmdResultDataLen = (FMSTR_SIZE8)resultDataLen; + if (fmstr_appCmdResultDataLen > (FMSTR_SIZE8)FMSTR_APPCMD_BUFF_SIZE) + { + fmstr_appCmdResultDataLen = (FMSTR_SIZE8)FMSTR_APPCMD_BUFF_SIZE; + } + + if (fmstr_appCmdResultDataLen > 0U) + { + FMSTR_ADDR appCmdBuffAddr = (FMSTR_ADDR)fmstr_appCmdBuff; + FMSTR_MemCpyFrom(appCmdBuffAddr, resultDataAddr, fmstr_appCmdResultDataLen); + } + } + else + { + /* no data being returned at all (same effect as pure FMSTR_AppCmdAck) */ + fmstr_appCmdResultDataLen = 0U; + } +} + +/****************************************************************************** + * + * @brief API: Fetch the application command code if one is ready for processing + * + * @return A command code stored in the application cmd buffer. + * The return value is FMSTR_APPCMDRESULT_NOCMD if there is no + * new command since the last call to FMSTR_AppCmdAck + * + ******************************************************************************/ + +FMSTR_APPCMD_CODE FMSTR_GetAppCmd(void) +{ +#if FMSTR_MAX_APPCMD_CALLS > 0 + /* the user can never see the callback-registered commands */ + if (FMSTR_FindAppCmdCallIndex(fmstr_appCmd) >= 0) + { + return FMSTR_APPCMDRESULT_NOCMD; + } +#endif + + /* otherwise, return the appcomand pending */ + return fmstr_appCmd; +} + +/****************************************************************************** + * + * @brief API: Get a pointer to application command data + * + * @param dataLen - A pointer to variable which receives the data length + * + * @return Pointer to the "application command" data + * + ******************************************************************************/ + +FMSTR_APPCMD_PDATA FMSTR_GetAppCmdData(FMSTR_SIZE *dataLen) +{ + /* no command, no data */ + if (fmstr_appCmd == ((FMSTR_APPCMD_CODE)FMSTR_APPCMDRESULT_NOCMD)) + { + return NULL; + } + +#if FMSTR_MAX_APPCMD_CALLS > 0 + /* the user never sees the callback-registered commands */ + if (FMSTR_FindAppCmdCallIndex(fmstr_appCmd) >= 0) + { + return NULL; + } +#endif + + /* caller want to know the data length */ + if (dataLen != NULL) + { + *dataLen = fmstr_appCmdLen; + } + + /* data are saved in out buffer */ + return fmstr_appCmdLen > 0U ? fmstr_appCmdBuff : (FMSTR_APPCMD_PDATA)NULL; +} + +/****************************************************************************** + * + * @brief API: Register or unregister app.cmd callback handler + * + * @param appCmdCode - App.command ID + * @param callbackFunc - Pointer to handler function (NULL to unregister) + * + * @return Non-zero if successfull, zero if maximum callbacks already set + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_RegisterAppCmdCall(FMSTR_APPCMD_CODE appCmdCode, FMSTR_PAPPCMDFUNC callbackFunc) +{ +#if FMSTR_MAX_APPCMD_CALLS > 0 + + FMSTR_INDEX index; + + /* keep "void" ID as reserved */ + if (appCmdCode == FMSTR_APPCMDRESULT_NOCMD) + { + return FMSTR_FALSE; + } + + /* get index of app.cmd ID (if already set) */ + index = FMSTR_FindAppCmdCallIndex(appCmdCode); + + /* when not found, get a free slot (only if registering new callback) */ + if ((index < 0) && (callbackFunc != NULL)) + { + index = FMSTR_FindAppCmdCallIndex(FMSTR_APPCMDRESULT_NOCMD); + } + + /* failed? */ + if (index < 0) + { + return FMSTR_FALSE; + } + + /* register handler */ + fmstr_appCmdCallFunc[index] = callbackFunc; + fmstr_appCmdCallId[index] = (FMSTR_APPCMD_CODE)(callbackFunc != NULL ? appCmdCode : FMSTR_APPCMDRESULT_NOCMD); + + return FMSTR_TRUE; + +#else + FMSTR_UNUSED(callbackFunc); + FMSTR_UNUSED(appCmdCode); + + /* app.cmd callback not implemented */ + return FMSTR_FALSE; + +#endif +} + +#else /* FMSTR_USE_APPCMD && (!FMSTR_DISABLE) */ + +/* void Application Command API functions */ + +void FMSTR_AppCmdAck(FMSTR_APPCMD_RESULT resultCode) +{ + FMSTR_UNUSED(resultCode); +} + +void FMSTR_AppCmdSetResponseData(FMSTR_ADDR resultDataAddr, FMSTR_SIZE resultDataLen) +{ + FMSTR_UNUSED(resultDataAddr); + FMSTR_UNUSED(resultDataLen); +} + +FMSTR_APPCMD_CODE FMSTR_GetAppCmd(void) +{ + return (FMSTR_APPCMD_CODE)FMSTR_APPCMDRESULT_NOCMD; +} + +FMSTR_APPCMD_PDATA FMSTR_GetAppCmdData(FMSTR_SIZE *dataLen) +{ + FMSTR_UNUSED(dataLen); + return NULL; +} + +FMSTR_BOOL FMSTR_RegisterAppCmdCall(FMSTR_APPCMD_CODE appCmdCode, FMSTR_PAPPCMDFUNC callbackFunc) +{ + FMSTR_UNUSED(appCmdCode); + FMSTR_UNUSED(callbackFunc); + return FMSTR_FALSE; +} + +/*lint -efile(766, freemaster_protocol.h) include file is not used in this case */ + +#endif /* FMSTR_USE_APPCMD && (!FMSTR_DISABLE) */ diff --git a/middleware/freemaster/src/common/freemaster_can.c b/middleware/freemaster/src/common/freemaster_can.c new file mode 100644 index 0000000..b6db7cd --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_can.c @@ -0,0 +1,703 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - CAN communication + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our transport is used or not. */ +#define FMSTR_CAN_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_TRANSPORT) == FMSTR_CAN_ID) && FMSTR_DISABLE == 0 + +#if FMSTR_SESSION_COUNT != 1 +/* CAN transport only supports a single session */ +#warning Please set FMSTR_SESSION_COUNT to 1. +#endif + +#include "freemaster_protocol.h" +#include "freemaster_can.h" +#include "freemaster_utils.h" + +/****************************************************************************** + * Local function declarations + ******************************************************************************/ + +static void _FMSTR_Listen(void); +static void _FMSTR_RxDone(void); +static void _FMSTR_SendError(FMSTR_BCHR nErrCode); +static FMSTR_BOOL _FMSTR_TxCan(void); +static FMSTR_BOOL _FMSTR_RxCan(FMSTR_SIZE8 rxLen); + +/****************************************************************************** + * Local variables + ******************************************************************************/ + +/* FreeMASTER communication buffer (in/out) plus the STS, LEN and CRC bytes */ +static FMSTR_BCHR fmstr_pCommBuffer[FMSTR_COMM_BUFFER_SIZE + 3 + 1]; + +/* FreeMASTER runtime flags */ +typedef volatile union +{ + FMSTR_FLAGS all; + + struct + { + unsigned bTxActive : 1; /* response is just being transmitted */ + unsigned bTxFirst : 1; /* first frame to be send out */ + unsigned bRxActive : 1; /* just in the middle of receiving (fragmented) frame */ + unsigned bRxFirst : 1; /* expecting the first frame (FST) */ + unsigned bRxTgl1 : 1; /* expecting TGL=1 in next frame */ + unsigned bRxFrameReady : 1; /* frame received (waiting to be handled in poll) */ + unsigned bRxSpecial : 1; /* special command received (not passed to ProtocolDecode) */ + + } flg; + +} FMSTR_CAN_FLAGS; + +static FMSTR_CAN_FLAGS fmstr_wFlags; + +/* receive and transmit buffers and counters */ +static FMSTR_SIZE8 fmstr_nTxTodo; /* transmission to-do counter (0 when tx is idle) */ +static FMSTR_BPTR fmstr_pTxBuff; /* pointer to next byte to transmit */ +static FMSTR_SIZE8 fmstr_nRxCtr; /* how many bytes received (total across all fragments) */ +static FMSTR_BPTR fmstr_pRxBuff; /* pointer to next free place in RX buffer */ +static FMSTR_BCHR fmstr_nRxErr; /* error raised during receive process */ +static FMSTR_BCHR fmstr_nRxCrc8; /* checksum of data being received for short messages */ +static FMSTR_U8 fmstr_uTxCtlByte; +static FMSTR_U8 fmstr_uTxFrmCtr; /* TX CAN frame counter (within one FreeMASTER frame) */ + +/* Command ID */ +#ifdef FMSTR_CAN_CMDID +static FMSTR_U32 fmstr_canCmdID = FMSTR_CAN_CMDID; +#else +static FMSTR_U32 fmstr_canCmdID = 0; +#endif + +/* Response ID */ +#ifdef FMSTR_CAN_RESPID +static FMSTR_U32 fmstr_canRespID = FMSTR_CAN_RESPID; +#else +static FMSTR_U32 fmstr_canRespID = 0; +#endif + +#if FMSTR_DEBUG_TX > 0 +/* The poll counter is used to roughly measure duration of test frame transmission. + * The test frame will be sent once per N.times this measured period. */ +static FMSTR_S32 fmstr_nDebugTxPollCount; +/* the N factor for multiplying the transmission time to get the wait time */ +#define FMSTR_DEBUG_TX_POLLCNT_XFACTOR 256 +#define FMSTR_DEBUG_TX_POLLCNT_MIN (-1 * 0x100000L) +#endif + +/****************************************************************************** + * Transport interface + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_InitCan(void); +static void _FMSTR_Poll(void); +static void _FMSTR_SendResponse(FMSTR_BPTR pResponse, FMSTR_SIZE nLength, FMSTR_U8 statusCode, void *identification); + +const FMSTR_TRANSPORT_INTF FMSTR_CAN = { + FMSTR_C99_INIT(Init) _FMSTR_InitCan, + FMSTR_C99_INIT(Poll) _FMSTR_Poll, + FMSTR_C99_INIT(SendResponse) _FMSTR_SendResponse, +}; + +/****************************************************************************** + * Implementation + ******************************************************************************/ + +/* CAN initialization */ + +static FMSTR_BOOL _FMSTR_InitCan(void) +{ + /* Check if mandatory driver functions are present (optional functions are checked before each call) */ + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.Init != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.EnableRx != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.GetRxFrameLen != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.GetRxFrameByte != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.AckRxFrame != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.PrepareTxFrame != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.PutTxFrameByte != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.SendTxFrame != NULL, FMSTR_FALSE); + +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.EnableRxInterrupt != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_CAN_DRV.EnableTxInterrupt != NULL, FMSTR_FALSE); +#endif + + /* initialize low-level driver and assign command and response IDs */ + if (FMSTR_CAN_DRV.Init(fmstr_canCmdID, fmstr_canRespID) == FMSTR_FALSE) + { + return FMSTR_FALSE; + } + + /* initialize all state variables */ + fmstr_wFlags.all = 0U; + fmstr_nTxTodo = 0U; + +#if FMSTR_DEBUG_TX > 0 + /* this zero will initiate the test frame transmission + * as soon as possible during Listen */ + fmstr_nDebugTxPollCount = 0; +#endif + + /* start listening for commands */ + _FMSTR_Listen(); + + return FMSTR_TRUE; +} + +/* CAN poll routine */ + +static void _FMSTR_Poll(void) +{ + /* handle the physical CAN module */ +#if FMSTR_POLL_DRIVEN > 0 + FMSTR_ProcessCanRx(); + FMSTR_ProcessCanTx(); +#endif + +#if FMSTR_POLL_DRIVEN > 0 || FMSTR_SHORT_INTR > 0 + /* except in the LONG_INTR mode, the frame gets handled here */ + if (fmstr_wFlags.flg.bRxFrameReady != 0U) + { + _FMSTR_RxDone(); + } +#endif + +#if FMSTR_DEBUG_TX > 0 + /* down-counting the polls for heuristic time measurement */ + if (fmstr_nDebugTxPollCount != 0 && fmstr_nDebugTxPollCount > FMSTR_DEBUG_TX_POLLCNT_MIN) + { + fmstr_nDebugTxPollCount--; + } +#endif +} + +/* Assign CAN frame ID for command frame */ + +void FMSTR_SetCanCmdID(FMSTR_U32 canID) +{ + fmstr_canCmdID = canID; +} + +/* Assign CAN frame ID for response frame */ + +void FMSTR_SetCanRespID(FMSTR_U32 canID) +{ + fmstr_canRespID = canID; +} + +/* Start listening on a CAN bus */ + +static void _FMSTR_Listen(void) +{ + /* disable transmitter state machine */ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + FMSTR_CAN_DRV.EnableTxInterrupt(FMSTR_FALSE); +#endif + fmstr_wFlags.flg.bTxActive = 0U; + + /* wait for first frame */ + fmstr_wFlags.flg.bRxFrameReady = 0U; + fmstr_wFlags.flg.bRxFirst = 1U; + fmstr_wFlags.flg.bRxActive = 1U; + + /* enable CAN receiving */ + FMSTR_CAN_DRV.EnableRx(); + +#if FMSTR_DEBUG_TX > 0 + /* we have just finished the transmission of the test frame, now wait the 32x times the sendtime + to receive any command from PC (count<0 is measurement, count>0 is waiting, count=0 is send trigger) */ + if (fmstr_nDebugTxPollCount < 0) + { + fmstr_nDebugTxPollCount *= -32; + } +#endif + +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + FMSTR_CAN_DRV.EnableRxInterrupt(FMSTR_TRUE); +#endif +} + +/* Send response of given error code (no data) */ + +static void _FMSTR_SendError(FMSTR_BCHR nErrCode) +{ + /* fill & send single-byte response */ + _FMSTR_SendResponse(&fmstr_pCommBuffer[2], 0U, nErrCode, NULL); +} + +/* + * Finalize transmit buffer before transmitting + * + * @param nLength - response length (1 for status + data length) + * + * This Function takes the data already prepared in the transmit buffer + * (including the status byte). It computes the check sum and kicks on tx. + * + */ + +static void _FMSTR_SendResponse(FMSTR_BPTR pResponse, FMSTR_SIZE nLength, FMSTR_U8 statusCode, void *identification) +{ + FMSTR_BCHR chSum = 0U; + FMSTR_U8 i, c; + + if (nLength > 254U || pResponse != &fmstr_pCommBuffer[2]) + { + /* The Serial driver doesn't support bigger responses than 254 bytes, change the response to status error */ + statusCode = FMSTR_STC_RSPBUFFOVF; + nLength = 0U; + } + + /* remember the buffer to be sent */ + fmstr_pTxBuff = fmstr_pCommBuffer; + + /* send the message with status, length and the checksum */ + fmstr_nTxTodo = (FMSTR_SIZE8)(nLength + 3U); + + if ((statusCode & FMSTR_STSF_VARLEN) != 0U) + { + /* variable-length frame starts at [0] and contains the length byte */ + fmstr_pCommBuffer[0] = (FMSTR_BCHR)statusCode; + fmstr_pCommBuffer[1] = (FMSTR_BCHR)nLength; + } + else + { + /* fixed-length frame starts at [1] and omits the length byte */ + fmstr_pCommBuffer[1] = (FMSTR_BCHR)statusCode; + fmstr_pTxBuff++; + fmstr_nTxTodo--; + } + + /* Initialize CRC algorithms */ + FMSTR_Crc8Init(&chSum); + + /* status byte and data are already there, compute checksum only */ + pResponse = fmstr_pTxBuff; + for (i = 1U; i < fmstr_nTxTodo; i++) + { + pResponse = FMSTR_ValueFromBuffer8(&c, pResponse); + /* add character to checksum */ + FMSTR_Crc8AddByte(&chSum, c); + } + + /* store checksum after the message */ + pResponse = FMSTR_ValueToBuffer8(pResponse, chSum); + + /* now transmitting the response */ + fmstr_wFlags.flg.bTxActive = 1U; + fmstr_wFlags.flg.bTxFirst = 1U; + +#if FMSTR_SHORT_INTR || FMSTR_LONG_INTR + /* Frame will be sent in interrupt asap */ + FMSTR_CAN_DRV.EnableTxInterrupt(FMSTR_TRUE); +#endif + + /* Send now if possible (will keep trying in poll if not possible) */ + FMSTR_ProcessCanTx(); +} + +/* + * Send one CAN frame if needed. Transmit buffer is already prepared + * + * @return TRUE if frame was actually filled to a buffer and submitted for send + * + * This function is called internally by our interrupt handler or poll routine. + * User may also decide to use FMSTR_CAN_PASSIVE_SW so it is then his responsibility + * to call us when a frame can be send. + * + */ + +static FMSTR_BOOL _FMSTR_TxCan(void) +{ + FMSTR_U8 ch; + FMSTR_SIZE8 i, len = fmstr_nTxTodo; + + if (fmstr_wFlags.flg.bTxActive == 0U || fmstr_nTxTodo == 0U) + { + return FMSTR_FALSE; + } + + if (len > 7U) + { + len = 7U; + } + + /* first byte is control */ + if (fmstr_wFlags.flg.bTxFirst != 0U) + { + /* the first frame and the length*/ + fmstr_uTxCtlByte = (FMSTR_U8)(FMSTR_CANCTL_FST | len); + fmstr_uTxFrmCtr = 0U; + fmstr_wFlags.flg.bTxFirst = 0U; + } + else + { + /* the next frame */ + fmstr_uTxCtlByte &= (FMSTR_U8) ~(FMSTR_CANCTL_FST | FMSTR_CANCTL_LEN_MASK); + fmstr_uTxCtlByte ^= FMSTR_CANCTL_TGL; + fmstr_uTxCtlByte |= len; + fmstr_uTxFrmCtr++; + } + + /* is it the last frame? */ + fmstr_nTxTodo -= len; + if (fmstr_nTxTodo == 0U) + { + fmstr_uTxCtlByte |= FMSTR_CANCTL_LST; + } + + /* put control byte */ + FMSTR_CAN_DRV.PutTxFrameByte(0, fmstr_uTxCtlByte); + + /* put data part */ + for (i = 1; i <= len; i++) + { + fmstr_pTxBuff = FMSTR_ValueFromBuffer8(&ch, fmstr_pTxBuff); + FMSTR_CAN_DRV.PutTxFrameByte(i, ch); + } + + /* submit frame for transmission */ + FMSTR_CAN_DRV.SendTxFrame(len + 1U); + + /* if the full frame is safe in tx buffer(s), release the received command */ + if (fmstr_nTxTodo == 0U) + { + /* no more transmitting */ + fmstr_wFlags.flg.bTxActive = 0U; + + /* start listening immediately (also frees the last received frame) */ + _FMSTR_Listen(); + } + + /* returning TRUE, frame was sent */ + return FMSTR_TRUE; +} + +/* Handle received CAN frame + * + * @return TRUE if this frame was processed + * + */ + +static FMSTR_BOOL _FMSTR_RxCan(FMSTR_SIZE8 rxLen) +{ + FMSTR_SIZE8 i, len; + FMSTR_U8 ctl, ch; + FMSTR_BOOL last; + + if (fmstr_wFlags.flg.bRxActive == 0U) + { + return FMSTR_FALSE; + } + + /* last FreeMASTER frame not yet handled */ + if (fmstr_wFlags.flg.bRxFrameReady != 0U) + { + return FMSTR_FALSE; + } + + /* get the first (control) byte */ + ctl = FMSTR_CAN_DRV.GetRxFrameByte(0); + + /* should be master-to-slave (otherwise perhaps a self-received frame) */ + if ((ctl & FMSTR_CANCTL_M2S) == 0U) + { + goto frame_contd; + } + + /* first frame resets the state machine */ + if ((ctl & FMSTR_CANCTL_FST) != 0U || fmstr_wFlags.flg.bRxFirst != 0U) + { + if ((ctl & FMSTR_CANCTL_FST) == 0U || /* must be the first frame! */ + (ctl & FMSTR_CANCTL_TGL) != 0U) /* TGL must be zero! */ + { + /* frame is ours, but we ignore it */ + goto frame_contd; + } + + /* now receive the rest of bigger FreeMASTER frame */ + fmstr_wFlags.flg.bRxFirst = 0U; + fmstr_wFlags.flg.bRxTgl1 = 1U; + + /* special command? */ + if ((ctl & FMSTR_CANCTL_SPC) != 0U) + { + fmstr_wFlags.flg.bRxSpecial = 1U; + } + else + { + fmstr_wFlags.flg.bRxSpecial = 0U; + } + + /* start receiving the frame */ + fmstr_pRxBuff = fmstr_pCommBuffer; + fmstr_nRxCtr = 0; + fmstr_nRxErr = 0; + FMSTR_Crc8Init(&fmstr_nRxCrc8); + } + else + { + /* toggle bit should match */ + if ((fmstr_wFlags.flg.bRxTgl1 != 0U && (ctl & FMSTR_CANCTL_TGL) == 0U) || + (fmstr_wFlags.flg.bRxTgl1 == 0U && (ctl & FMSTR_CANCTL_TGL) != 0U)) + { + /* invalid sequence detected */ + fmstr_nRxErr = FMSTR_STC_CANTGLERR; + goto frame_done; + } + + /* expect next frame toggled again */ + fmstr_wFlags.flg.bRxTgl1 = fmstr_wFlags.flg.bRxTgl1 != 0U ? 0U : 1U; + } + + /* frame is valid, get the data */ + len = (FMSTR_SIZE8)(ctl & FMSTR_CANCTL_LEN_MASK); + + /* sanity check of the real received frame length */ + if (len >= rxLen) + { + /* invalid frame length, re-start receiving */ + fmstr_nRxErr = FMSTR_STC_CANMSGERR; + goto frame_done; + } + + /* will data fit? (+1 is for checksum byte to fit) */ + if ((fmstr_nRxCtr + len) > (FMSTR_COMM_BUFFER_SIZE + 1U)) + { + /* this frame must be ignored, start receiving again */ + fmstr_nRxErr = FMSTR_STC_CANMSGERR; + goto frame_done; + } + + /* is this the last frame? */ + last = (FMSTR_BOOL)((ctl & FMSTR_CANCTL_LST) != 0U); + + /* okay, receive all data bytes */ + fmstr_nRxCtr += len; + for (i = 1; i <= len; i++) + { + ch = FMSTR_CAN_DRV.GetRxFrameByte(i); + + fmstr_pRxBuff = FMSTR_ValueToBuffer8(fmstr_pRxBuff, ch); + + /* the very last byte is a checksum and must match the CRC computed so far*/ + if (last != 0U && i == len) + { + fmstr_nRxCrc8 = fmstr_nRxCrc8 == ch ? 0U : 1U; /* 0 signals a correct CRC */ + } + else + { + FMSTR_Crc8AddByte(&fmstr_nRxCrc8, ch); /* all other bytes are added to CRC */ + } + } + + /* was it the last frame? */ + if (last == FMSTR_FALSE) + { + goto frame_contd; + } + + /* done with the FreeMASTER frame, it will be handled later in RxDone */ +frame_done: + /* disable receiver so it does not corrupt the frame until it is handled */ + fmstr_wFlags.flg.bRxActive = 0; + /* FreeMASTER frame received. Checksum and frame will be checked later in RxDone */ + fmstr_wFlags.flg.bRxFrameReady = 1U; + + /* will continue by next chunk next time, but this CAN frame is finished */ +frame_contd: + FMSTR_CAN_DRV.AckRxFrame(); + return FMSTR_TRUE; +} + +/* Handle received FreeMASTER frame */ + +static void _FMSTR_RxDone(void) +{ + FMSTR_BPTR pFrame; + FMSTR_U8 cmd; + FMSTR_U8 len; + + /* frame really here? */ + if (fmstr_wFlags.flg.bRxFrameReady == 0U) + { + return; + } + + /* get the frame information */ + pFrame = fmstr_pCommBuffer; + cmd = 0; + len = 0; + + /* acknowledge the flag, we're going to process the frame now */ + fmstr_wFlags.flg.bRxFrameReady = 0U; + + /* any fragmentation error detected during the receive process? */ + if (fmstr_nRxErr == 0U) + { + /* checksum should be zeroed (see above when last byte was received) */ + if (fmstr_nRxCrc8 != 0U) + { + fmstr_nRxErr = FMSTR_STC_CMDCSERR; + } + /* checksum okay, check frame length */ + else + { + /* get command byte */ + pFrame = FMSTR_ValueFromBuffer8(&cmd, pFrame); + /* get length */ + pFrame = FMSTR_ValueFromBuffer8(&len, pFrame); + + /* now the len received should match the data bytes received + note that command-byte, length and checksum are included in the nRxCtr */ + if (fmstr_nRxCtr != (len + 3U)) + { + fmstr_nRxErr = FMSTR_STC_CMDCSERR; + } + } + } + + /* any error? */ + if (fmstr_nRxErr != 0U) + { + _FMSTR_SendError(fmstr_nRxErr); + } + /* no error */ + else + { + /* special CAN command? for our layer only */ + if (fmstr_wFlags.flg.bRxSpecial != 0U) + { + switch (cmd) + { + case FMSTR_CANSPC_PING: + _FMSTR_SendError(FMSTR_STS_OK); + break; + + default: + /* unknown command */ + _FMSTR_SendError(FMSTR_STC_INVCMD); + break; + } + } + /* standard FreeMASTER command to be passed above */ + else + { + /* Decode and handle frame by SCI classic driver. Use "can" as a globally unique pointer value as our + * identifier */ + if (FMSTR_ProtocolDecoder(pFrame, len, cmd, (void *)"can") == FMSTR_FALSE) + { + /* if no response was generated, start listening again, otherwise, + the receive will be initiated after transmission is complete in + _FMSTR_TxCan (this prevents our TX buffer to be corrupted by RX) */ + _FMSTR_Listen(); + } + } + } +} + +/****************************************************************************** + * + * @brief Handle CAN communication + * + * @note This function can be called either from CAN ISRs or from the polling routine + * + ******************************************************************************/ + +void FMSTR_ProcessCanRx(void) +{ + /* If there is any frame received */ + FMSTR_SIZE8 len = FMSTR_CAN_DRV.GetRxFrameLen(); + if (len > 0U) + { +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* In interrupt mode, we need to disable interrupt when frame was not handled. + * This prevents servicing the interrupt again endlessly. */ + FMSTR_BOOL processed = _FMSTR_RxCan(len); + FMSTR_CAN_DRV.EnableRxInterrupt(processed); +#else + /* In polled mode, we just keep trying to process the frame. */ + FMSTR_BOOL result; + result = _FMSTR_RxCan(len); + FMSTR_UNUSED(result); +#endif + +#if FMSTR_LONG_INTR > 0 + /* Handle completed frame now? (may be we're in the interrupt now). Otherwise wait to Poll */ + if (fmstr_wFlags.flg.bRxFrameReady != 0U) + { + _FMSTR_RxDone(); + } +#endif + } +#if FMSTR_DEBUG_TX > 0 + else + { + /* Time to send another test frame? */ + if (fmstr_doDebugTx != 0U && fmstr_nDebugTxPollCount == 0) + { + /* we are going to measure how long it takes to transmit it */ + fmstr_nDebugTxPollCount = -1; + + /* Send it now */ + if (FMSTR_SendTestFrame(&fmstr_pCommBuffer[2], NULL) == FMSTR_FALSE) + { + /* failed to send, try again next time */ + fmstr_nDebugTxPollCount = 0; + } + } + } +#endif +} + +/****************************************************************************** + * + * @brief Handle CAN communication + * + * @note This function can be called either from CAN ISRs or from the polling routine + * + ******************************************************************************/ + +void FMSTR_ProcessCanTx(void) +{ + /* Any TX buffer available? */ + if (fmstr_wFlags.flg.bTxActive != 0U && FMSTR_CAN_DRV.PrepareTxFrame() != FMSTR_FALSE) + { +#if FMSTR_SHORT_INTR || FMSTR_LONG_INTR + /* send one CAN frame */ + if (_FMSTR_TxCan() == FMSTR_FALSE) + { + /* no more frames, disable TX Interrupt */ + FMSTR_CAN_DRV.EnableTxInterrupt(FMSTR_FALSE); + } +#else + /* send if you have anything to be sent */ + FMSTR_BOOL result; + result = _FMSTR_TxCan(); + FMSTR_UNUSED(result); +#endif + } +} + +#endif /* defined(FMSTR_CAN_DRV)) && (!(FMSTR_DISABLE)) */ diff --git a/middleware/freemaster/src/common/freemaster_can.h b/middleware/freemaster/src/common/freemaster_can.h new file mode 100644 index 0000000..15229dd --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_can.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - CAN communication + */ + +#ifndef __FREEMASTER_CAN_H +#define __FREEMASTER_CAN_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_uart.h +#endif + +/****************************************************************************** + * Serial transport related configuration checks + ******************************************************************************/ + +/* obsolete transport and driver macros */ +#if defined(FMSTR_USE_CAN) || defined(FMSTR_USE_FLEXCAN) || defined(FMSTR_USE_FLEXCAN32) || \ + defined(FMSTR_USE_MSCAN) || defined(FMSTR_USE_MCAN) +#warning Obsolete configuration option detected. Define FMSTR_TRANSPORT as FMSTR_CAN, and define also FMSTR_CAN_DRV option. +#endif + +/* transport MUST be defined in configuration */ +#if !defined(FMSTR_CAN_DRV) +#error No FreeMASTER communication can driver interface is enabled. Please choose the driver (FMSTR_CAN_DRV) or set FMSTR_DISABLE option to 1. +#endif + +/* CAN-related constants */ +#ifdef FMSTR_CAN_EXTID +#if FMSTR_CAN_EXTID != 0x80000000U +#error FMSTR_CAN_EXTID must be defined as 0x80000000U +#undef FMSTR_CAN_EXTID +#endif +#endif + +#ifndef FMSTR_CAN_EXTID +#define FMSTR_CAN_EXTID 0x80000000U +#endif + +/* obsolete dynamic address selection */ +#if defined(FMSTR_CAN_BASE_DYNAMIC) +#warning The FMSTR_SCI_BASE_DYNAMIC is now obsolete and may be removed. +#endif + +/* obsolete dynamic ID selection */ +#if defined(FMSTR_CAN_CMDID_DYNAMIC) +#warning The FMSTR_CAN_CMDID_DYNAMIC is now obsolete and may be removed. +#endif + +/* incoming (command) CAN message ID */ +#ifndef FMSTR_CAN_CMDID +#define FMSTR_CAN_CMDID 0x7aa +#endif + +/* obsolete dynamic ID selection */ +#if defined(FMSTR_CAN_RESPID_DYNAMIC) +#warning The FMSTR_CAN_RESPID_DYNAMIC is now obsolete and may be removed. +#endif + +/* response CAN message ID, may be the same as command ID */ +#ifndef FMSTR_CAN_RESPID +#define FMSTR_CAN_RESPID 0x7AAU +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/* FreeMASTER Driver interface between the CAN layer and hardware driver */ +typedef struct FMSTR_CAN_DRV_INTF_S +{ + FMSTR_BOOL (*Init)(FMSTR_U32 idRx, FMSTR_U32 idTx); /* Initialize CAN module. */ + void (*EnableTxInterrupt)(FMSTR_BOOL enable); /* Enable CAN Transmit interrupt. */ + void (*EnableRxInterrupt)(FMSTR_BOOL enable); /* Enable CAN Receive interrupt. */ + + /* receiver */ + void (*EnableRx)(void); /* Enable/re-initialize Receiver buffer. */ + FMSTR_SIZE8 (*GetRxFrameLen)(void); /* Return size of received CAN frame, or 0 if no Rx frame is available. */ + FMSTR_BCHR (*GetRxFrameByte)(FMSTR_SIZE8 index); /* Get data byte at index (0..8). */ + void (*AckRxFrame)(void); /* Discard received frame and enable receiving a next one. */ + + /* transmitter */ + FMSTR_BOOL (*PrepareTxFrame)(void); /* Initialize transmit buffer; return false when Tx buffer is not available. */ + void (*PutTxFrameByte)(FMSTR_SIZE8 index, FMSTR_BCHR data); /* Fill one byte of transmit data. */ + void (*SendTxFrame)(FMSTR_SIZE8 len); /* Send the Tx buffer. */ + +} FMSTR_CAN_DRV_INTF; + +/****************************************************************************** + * Inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global CAN-specific API functions + ******************************************************************************/ + +void FMSTR_SetCanCmdID(FMSTR_U32 canID); +void FMSTR_SetCanRespID(FMSTR_U32 canID); +void FMSTR_ProcessCanRx(void); +void FMSTR_ProcessCanTx(void); + +#ifdef FMSTR_CAN_DRV +extern const FMSTR_CAN_DRV_INTF FMSTR_CAN_DRV; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_CAN_H */ diff --git a/middleware/freemaster/src/common/freemaster_cfg.h.example b/middleware/freemaster/src/common/freemaster_cfg.h.example new file mode 100644 index 0000000..56caca6 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_cfg.h.example @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - User Configuration File + */ + +#ifndef __FREEMASTER_CFG_H +#define __FREEMASTER_CFG_H + +//////////////////////////////////////////////////////////////////////////////// +// Definitions +//////////////////////////////////////////////////////////////////////////////// + +#define FMSTR_PLATFORM_CORTEX_M 1 // Cortex-M platform (see freemaster.h for list of all supported platforms) +// #define FMSTR_PLATFORM_S12Z 0 // Use with S12Z platform +// #define FMSTR_PLATFORM_PA32 0 // Use with 32bit Power Architecture platforms + +//! Enable/Disable FreeMASTER support as a whole +#define FMSTR_DISABLE 0 // To disable all FreeMASTER functionalities + +//! Select interrupt or poll-driven serial communication +#define FMSTR_LONG_INTR 0 // Complete message processing in interrupt +#define FMSTR_SHORT_INTR 0 // Queuing done in interrupt +#define FMSTR_POLL_DRIVEN 1 // No interrupt needed, polling only + +// List of standard FreeMASTER transports and their low-level drivers. See more options in src/drivers. +// FMSTR_SERIAL - Standard serial transport protocol (Used by various types of UART peripherals as USB CDC implementation) +// FMSTR_SERIAL_MCUX_UART - MCUXSDK driver for UART peripheral +// FMSTR_SERIAL_MCUX_LPUART - MCUXSDK driver for LPUART peripheral +// FMSTR_SERIAL_MCUX_USART - MCUXSDK driver for USART peripheral +// FMSTR_SERIAL_MCUX_MINIUSART -MCUXSDK driver for MINIUSART peripheral +// FMSTR_SERIAL_MCUX_USB - MCUXSDK driver for USB peripheral with CDC class +// FMSTR_CAN - Standard CAN transport protocol (Used by various types of CAN peripherals) +// FMSTR_CAN_MCUX_FLEXCAN - MCUXSDK driver for FlexCAN peripheral +// FMSTR_CAN_MCUX_MCAN - MCUXSDK driver for MCAN peripheral +// FMSTR_CAN_MCUX_MSCAN - MCUXSDK driver for msCAN peripheral +// FMSTR_PDBDM - Packet Driven BDM (direct memory access via JTAG, SWD or BDM debug probes). No low-level driver used. + +//! Select communication interface +#define FMSTR_TRANSPORT FMSTR_SERIAL // Use serial transport layer +#define FMSTR_SERIAL_DRV FMSTR_SERIAL_MCUX_UART // Use serial driver for UART + +//! Define communication interface base address or leave undefined for runtime setting +// #undef FMSTR_SERIAL_BASE // Serial base will be assigned in runtime (when FMSTR_USE_UART) +// #undef FMSTR_CAN_BASE // CAN base will be assigned in runtime (when FMSTR_USE_FLEXCAN) + +//! FlexCAN-specific, communication message buffers +#define FMSTR_FLEXCAN_TXMB 0 +#define FMSTR_FLEXCAN_RXMB 1 + +//! Input/output communication buffer size +#define FMSTR_COMM_BUFFER_SIZE 0 // Set to 0 for "automatic" + +//! Receive FIFO queue size (use with FMSTR_SHORT_INTR only) +#define FMSTR_COMM_RQUEUE_SIZE 32 // Set to 0 for "default" + +//! Support for Application Commands +#define FMSTR_USE_APPCMD 1 // Enable/disable App.Commands support +#define FMSTR_APPCMD_BUFF_SIZE 32 // App.Command data buffer size +#define FMSTR_MAX_APPCMD_CALLS 4 // How many app.cmd callbacks? (0=disable) + +//! Oscilloscope support +#define FMSTR_USE_SCOPE 1 // Specify number of supported oscilloscopes +#define FMSTR_MAX_SCOPE_VARS 8 // Specify maximum number of scope variables per one oscilloscope + +//! Recorder support +#define FMSTR_USE_RECORDER 1 // Specify number of supported recorders + +//! Built-in recorder buffer +#define FMSTR_REC_BUFF_SIZE 1024 // Built-in buffer size of recorder #0. Set to 0 to use runtime settings. + +//! Recorder time base, specifies how often the recorder is called in the user app. +#define FMSTR_REC_TIMEBASE FMSTR_REC_BASE_MILLISEC(0) // 0 = "unknown" +#define FMSTR_REC_FLOAT_TRIG 1 // Enable/disable floating point triggering + +// Target-side address translation (TSA) +#define FMSTR_USE_TSA 1 // Enable TSA functionality +#define FMSTR_USE_TSA_INROM 1 // TSA tables declared as const (put to ROM) +#define FMSTR_USE_TSA_SAFETY 1 // Enable/Disable TSA memory protection +#define FMSTR_USE_TSA_DYNAMIC 1 // Enable/Disable TSA entries to be added also in runtime + +// Pipes as data streaming over FreeMASTER protocol +#define FMSTR_USE_PIPES 3 // Specify number of supported pipe objects + +// Enable/Disable read/write memory commands +#define FMSTR_USE_READMEM 1 // Enable read memory commands +#define FMSTR_USE_WRITEMEM 1 // Enable write memory commands +#define FMSTR_USE_WRITEMEMMASK 1 // Enable write memory bits commands + +// Define password for access levels to protect them. AVOID SHORT PASSWORDS in production version. +// Passwords should be at least 20 characters long to prevent dictionary attacks. +// #define FMSTR_RESTRICTED_ACCESS_R_PASSWORD "r" // Read-only access level password. Let undefined when no password is required. +// #define FMSTR_RESTRICTED_ACCESS_RW_PASSWORD "rw" // Write access level password. Let undefined to set the same as for read-only access level. +// #define FMSTR_RESTRICTED_ACCESS_RWF_PASSWORD "rwf" // Flash access level password. Let undefined to set the same as for write access level. + +// Storing cleartext passwords in Flash memory is not safe, consider storing their SHA1 hash instead +// Even with this option, the hash must be generated from reasonably complex password to prevent dictionary attack. +#define FMSTR_USE_HASHED_PASSWORDS 0 // When non-zero, the passwords above are specified as a pointer to 20-byte SHA1 hash of password text + +#endif /* __FREEMASTER_CFG_H */ + +//////////////////////////////////////////////////////////////////////////////// +// EOF +//////////////////////////////////////////////////////////////////////////////// diff --git a/middleware/freemaster/src/common/freemaster_defcfg.h b/middleware/freemaster/src/common/freemaster_defcfg.h new file mode 100644 index 0000000..fd478ba --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_defcfg.h @@ -0,0 +1,293 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - default configuration options + */ + +#ifndef __FREEMASTER_DEFCFG_H +#define __FREEMASTER_DEFCFG_H + +/* Read user configuration file. This file should be created by user in the + * project directory and it should be accessible on "include path". + * + * Refer to freemaster_cfg.h file in existing example applications + * for SERIAL, CAN, PD_BDM and other transports available for your target + * microcontroller platform. + */ +#include "freemaster_cfg.h" + +/* Define global version macro */ +#define FMSTR_VERSION 0x00030004 +#define FMSTR_VERSION_STR "3.0.4" + +/****************************************************************************** + * Configuration check + ******************************************************************************/ + +/* polling mode as default when nothing selected */ +#if !defined(FMSTR_POLL_DRIVEN) && !defined(FMSTR_LONG_INTR) && !defined(FMSTR_SHORT_INTR) +#define FMSTR_LONG_INTR 0 +#define FMSTR_SHORT_INTR 0 +#define FMSTR_POLL_DRIVEN 1 +#endif + +/* otherwise, "undefined" means false for all three options */ +#ifndef FMSTR_POLL_DRIVEN +#define FMSTR_POLL_DRIVEN 0 +#endif +#ifndef FMSTR_LONG_INTR +#define FMSTR_LONG_INTR 0 +#endif +#ifndef FMSTR_SHORT_INTR +#define FMSTR_SHORT_INTR 0 +#endif + +/* FreeMASTER driver is enabled by default */ +#ifndef FMSTR_DISABLE +#define FMSTR_DISABLE 0 +#endif + +/* Protocol session */ +#ifndef FMSTR_SESSION_COUNT +#define FMSTR_SESSION_COUNT 1 +#endif + +#if FMSTR_SESSION_COUNT == 0 +#error Count of sessions (FMSTR_SESSION_COUNT) cannot be zero! +#endif + +/* transport MUST be defined in configuration */ +#if FMSTR_DISABLE == 0 && !defined(FMSTR_TRANSPORT) +#error No FreeMASTER communication transport interface is enabled. Please choose the interface (FMSTR_TRANSPORT) or set FMSTR_DISABLE option to 1. +#endif + +#ifndef FMSTR_APPLICATION_STR +#define FMSTR_APPLICATION_STR "Not defined" +#endif + +#ifndef FMSTR_DESCRIPTION_STR +#define FMSTR_DESCRIPTION_STR "Not defined" +#endif + +#ifndef FMSTR_BUILDTIME_STR +#define FMSTR_BUILDTIME_STR "Build date not specified" /* e.g: __DATE__ " " __TIME__ */ +#endif + +/* Remote access to device enabled by default */ +#ifndef FMSTR_ENABLE_REMOTE_ACCESS +#define FMSTR_ENABLE_REMOTE_ACCESS 1 +#endif + +/* Passwords may be specified as SHA1 hash instead of plaintext. But plaintext is default. */ +#ifndef FMSTR_USE_HASHED_PASSWORDS +#define FMSTR_USE_HASHED_PASSWORDS 0 +#endif + +/* Build CFG_F1 configuration flags: */ + +/* CFG_F1 0x01: Big endian */ +#define FMSTR_CFG_F1_BIG_ENDIAN ((FMSTR_PLATFORM_BIG_ENDIAN != 0U ? 1U : 0U) << 0) + +/* CFG_F1 0x02: Remote access enabled */ +#define FMSTR_CFG_F1_ENABLE_REMOTE_ACCESS ((FMSTR_ENABLE_REMOTE_ACCESS != 0U ? 1U : 0U) << 1) + +/* CFG_F1 0x30: access level which needs passwords */ +#if (defined(FMSTR_RESTRICTED_ACCESS_R_PASSWORD)) +#define FMSTR_CFG_F1_RESTRICTED_ACCESS ((FMSTR_RESTRICTED_ACCESS_R) << 4) +#elif defined(FMSTR_RESTRICTED_ACCESS_RW_PASSWORD) +#define FMSTR_CFG_F1_RESTRICTED_ACCESS ((FMSTR_RESTRICTED_ACCESS_RW) << 4) +#elif defined(FMSTR_RESTRICTED_ACCESS_RWF_PASSWORD) +#define FMSTR_CFG_F1_RESTRICTED_ACCESS ((FMSTR_RESTRICTED_ACCESS_RWF) << 4) +#else +#define FMSTR_CFG_F1_RESTRICTED_ACCESS 0U +#endif + +/* CFG_F1 value */ +#define FMSTR_CFG_F1 (FMSTR_CFG_F1_BIG_ENDIAN | FMSTR_CFG_F1_ENABLE_REMOTE_ACCESS | FMSTR_CFG_F1_RESTRICTED_ACCESS) + +/* read memory commands are ENABLED by default */ +#ifndef FMSTR_USE_READMEM +#define FMSTR_USE_READMEM 1 +#endif +#ifndef FMSTR_USE_WRITEMEM +#define FMSTR_USE_WRITEMEM 1 +#endif +#ifndef FMSTR_USE_WRITEMEMMASK +#define FMSTR_USE_WRITEMEMMASK 1 +#endif + +/* default scope settings */ +#ifndef FMSTR_USE_SCOPE +#define FMSTR_USE_SCOPE 0 +#endif + +#ifndef FMSTR_MAX_SCOPE_VARS +#define FMSTR_MAX_SCOPE_VARS 8 +#endif +/* default recorder settings */ +#ifndef FMSTR_USE_RECORDER +#define FMSTR_USE_RECORDER 0 +#endif + +#ifndef FMSTR_REC_FARBUFF +#define FMSTR_REC_FARBUFF 0 +#endif + +/* Enable Floating point support in Recorder triggering */ +#ifndef FMSTR_REC_FLOAT_TRIG +#define FMSTR_REC_FLOAT_TRIG 0 +#endif + +/* Debug-TX mode is a special mode used to test or debug the data transmitter. Our driver + will be sending test frames periodically until a first valid command is received from the + PC Host. You can hook a logic analyzer to transmission pins to determine port and baudrate. + Or you can connect the FreeMASTER tool and run the connection wizard to listen for the + dummy frames. */ +#ifndef FMSTR_DEBUG_TX +#define FMSTR_DEBUG_TX 0 +#endif + +#if FMSTR_USE_RECORDER > 255 +#error Number of enabled recorders MUST be smaller than 255. +#endif + +#if FMSTR_USE_SCOPE > 255 +#error Number of enabled oscilloscopes MUST be smaller than 255. +#endif + +/* check recorder settings */ +#if FMSTR_USE_RECORDER > 0 + +/* 0 means recorder time base is "unknown" */ +#ifndef FMSTR_REC_TIMEBASE +#define FMSTR_REC_TIMEBASE 0 +#endif + +/* 0 means that default recorder will not be created, user needs to call RecoderCreate */ +#ifndef FMSTR_REC_BUFF_SIZE +#define FMSTR_REC_BUFF_SIZE 0 +#endif + +#endif +/* default app.cmds settings */ +#ifndef FMSTR_USE_APPCMD +#define FMSTR_USE_APPCMD 0 +#endif + +#ifndef FMSTR_APPCMD_BUFF_SIZE +#define FMSTR_APPCMD_BUFF_SIZE 16 +#endif + +#ifndef FMSTR_MAX_APPCMD_CALLS +#define FMSTR_MAX_APPCMD_CALLS 0 +#endif + +/* TSA configuration check */ +#ifndef FMSTR_USE_TSA +#define FMSTR_USE_TSA 0 +#endif + +#if FMSTR_USE_TSA > 0 && FMSTR_DISABLE > 0 +#undef FMSTR_USE_TSA +#define FMSTR_USE_TSA 0 +#endif + +#ifndef FMSTR_USE_TSA_SAFETY +#define FMSTR_USE_TSA_SAFETY 0 +#endif + +/* TSA table allocation modifier */ +#ifndef FMSTR_USE_TSA_INROM +#define FMSTR_USE_TSA_INROM 0 +#endif + +#if FMSTR_USE_TSA_INROM > 0 +#define FMSTR_TSA_CDECL const +#else +#define FMSTR_TSA_CDECL +#endif + +#ifndef FMSTR_USE_TSA_DYNAMIC +#define FMSTR_USE_TSA_DYNAMIC 0 +#endif + +/* use transport "pipe" functionality */ +#ifndef FMSTR_USE_PIPES +#define FMSTR_USE_PIPES 0 +#endif + +/* "pipe" putstring formatting (enabled by default) */ +#ifndef FMSTR_USE_PIPE_PRINTF +#define FMSTR_USE_PIPE_PRINTF 1 +#endif + +/* "pipe" variable-argument printf (enabled by default) */ +#ifndef FMSTR_USE_PIPE_PRINTF_VARG +#define FMSTR_USE_PIPE_PRINTF_VARG FMSTR_USE_PIPE_PRINTF +#endif + +#if FMSTR_USE_PIPES > 127 +#error Number of enabled pipes MUST be smaller than 127. +#endif + +#if FMSTR_USE_PIPES > 0 +/* pipe printf buffer */ +#ifndef FMSTR_PIPES_PRINTF_BUFF_SIZE +#define FMSTR_PIPES_PRINTF_BUFF_SIZE 48U +#endif +#endif + +/* use default buffer size */ +#if !defined(FMSTR_COMM_BUFFER_SIZE) || (FMSTR_COMM_BUFFER_SIZE < 32) +#if defined(FMSTR_COMM_BUFFER_SIZE) +#if FMSTR_COMM_BUFFER_SIZE > 0 +#warning FMSTR_COMM_BUFFER_SIZE set too small +#endif + +#undef FMSTR_COMM_BUFFER_SIZE +#elif !(FMSTR_DISABLE) +#warning FMSTR_COMM_BUFFER_SIZE is not set in configuration, the default value is used. +#endif + +#define FMSTR_COMM_BUFFER_SIZE 240U +#endif + +/* PDBDM buffer is defined in the driver by default */ +#ifndef FMSTR_PDBDM_USER_BUFFER +#define FMSTR_PDBDM_USER_BUFFER 0 +#endif + +/* Help macro to create ID string for preprocessor to recognize the drivers to enable or not */ +#define FMSTR_MK_IDSTR1(x) x##_ID +#define FMSTR_MK_IDSTR(x) FMSTR_MK_IDSTR1(x) + +/* Default driver debugging print level (0=none, 1=errors, 2=normal, 3=verbose) */ +#ifndef FMSTR_DEBUG_LEVEL +#ifdef FMSTR_DEBUG_PRINTF +#define FMSTR_DEBUG_LEVEL 3 +#else +#define FMSTR_DEBUG_LEVEL 0 +#endif +#endif + +#if FMSTR_DEBUG_LEVEL > 0 && !defined(FMSTR_DEBUG_PRINTF) +#undef FMSTR_DEBUG_LEVEL +#define FMSTR_DEBUG_LEVEL 0 +#endif + +#endif /* __FREEMASTER_DEF_CFG_H */ diff --git a/middleware/freemaster/src/common/freemaster_net.c b/middleware/freemaster/src/common/freemaster_net.c new file mode 100644 index 0000000..720424c --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_net.c @@ -0,0 +1,521 @@ +/* + * Copyright 2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Network communication + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our transport is used or not. */ +#define FMSTR_NET_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_TRANSPORT) == FMSTR_NET_ID) && FMSTR_DISABLE == 0 + +#include "freemaster_protocol.h" +#include "freemaster_net.h" +#include "freemaster_utils.h" + +/* Offset command payload in network buffer */ +#define FMSTR_NET_PAYLOAD_OFFSET 6 + +typedef struct FMSTR_NET_SESSION_S +{ + FMSTR_U32 lastUsed; /* Last used session */ + FMSTR_NET_ADDR address; /* TCP/UDP address */ +} FMSTR_NET_SESSION; + +/*********************************** + * local variables + ***********************************/ + +/* Network sessions */ +static FMSTR_NET_SESSION fmstr_pNetSessions[FMSTR_SESSION_COUNT]; +static FMSTR_U32 fmstr_nSessionCounter = 0U; + +/* FreeMASTER communication buffer (in/out) plus the Length, sequence number, command, payload and CRC */ +static FMSTR_BCHR fmstr_pNetBuffer[FMSTR_COMM_BUFFER_SIZE + 2 + 1 + 1 + 2 + 1]; + +static FMSTR_SIZE fmstr_nReceived = 0U; +static FMSTR_U8 fmstr_nSeqNumber = 1U; + +/*********************************** + * local function prototypes + ***********************************/ + +/* Interface function - Initialization of serial transport */ +static FMSTR_BOOL _FMSTR_NetInit(void); +/* Interface function - Poll function of serial transport */ +static void _FMSTR_NetPoll(void); +/* Interface function - Send Response function of serial transport */ +static void _FMSTR_NetSendResponse(FMSTR_BPTR pResponse, FMSTR_SIZE nLength, FMSTR_U8 statusCode, void *identification); + +/* Session find and use or reuse */ +static FMSTR_NET_SESSION *_FMSTR_FindNetSession(FMSTR_NET_ADDR *addr, FMSTR_BOOL create); +/* Close session */ +static void _FMSTR_NetCloseSession(FMSTR_NET_SESSION *ses); + +static FMSTR_BOOL _FMSTR_NetProcess(void); +static void _FMSTR_NetSendStatus(FMSTR_BCHR nErrCode, FMSTR_NET_SESSION *session); + +#if FMSTR_NET_AUTODISCOVERY != 0 +static void _FMSTR_NetSendDiscovery(const FMSTR_NET_ADDR *address); +#endif /* FMSTR_NET_AUTODISCOVERY */ +/*********************************** + * global variables + ***********************************/ + +/* Interface of this serial driver */ +const FMSTR_TRANSPORT_INTF FMSTR_NET = { + FMSTR_C99_INIT(Init) _FMSTR_NetInit, + FMSTR_C99_INIT(Poll) _FMSTR_NetPoll, + FMSTR_C99_INIT(SendResponse) _FMSTR_NetSendResponse, +}; + +/****************************************************************************** + * + * @brief Network communication initialization + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_NetInit(void) +{ + /* Check the interface if it's valid */ + FMSTR_ASSERT_RETURN(FMSTR_NET_DRV.Init != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_NET_DRV.Poll != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_NET_DRV.Recv != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_NET_DRV.Send != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_NET_DRV.Close != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_NET_DRV.GetCaps != NULL, FMSTR_FALSE); + + FMSTR_MemSet(&fmstr_pNetSessions, 0, sizeof(fmstr_pNetSessions)); + + /* Call initialization of network driver */ + if (FMSTR_NET_DRV.Init() == FMSTR_FALSE) + { + return FMSTR_FALSE; + } + + return FMSTR_FALSE; +} + +/******************************************************************************* + * + * @brief API: Network Transport "Polling" call from the application main loop + * + * This function either handles all the NET communication (polling-only mode = + * FMSTR_POLL_DRIVEN) or decodes messages received on the background by NET interrupt + * (short-interrupt mode = FMSTR_SHORT_INTR). + * + *******************************************************************************/ + +static void _FMSTR_NetPoll(void) +{ + FMSTR_BOOL res = FMSTR_FALSE; + + do + { + /* Poll network driver */ + FMSTR_NET_DRV.Poll(); + + /* Process the protocol */ + res = _FMSTR_NetProcess(); + + /* Repeat until the current frame is fully processed (or communication is idle) */ + } while (res == FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief Finalize transmit buffer before transmitting + * + * @param nLength - response length (1 for status + data length) + * + * + * This Function takes the data already prepared in the transmit buffer + * (inlcuding the status byte). It computes the check sum and kicks on tx. + * + ******************************************************************************/ + +static void _FMSTR_NetSendResponse(FMSTR_BPTR pResponse, FMSTR_SIZE nLength, FMSTR_U8 statusCode, void *identification) +{ + FMSTR_U16 i; + FMSTR_U8 c; + FMSTR_U16 todo; + FMSTR_U16 sent = 0U; + FMSTR_S32 res = 1; + FMSTR_BCHR chSum = 0U; + FMSTR_BPTR pMessageIO; + + FMSTR_NET_SESSION *session = (FMSTR_NET_SESSION *)identification; + FMSTR_ASSERT(session != NULL); + + if ((nLength > (FMSTR_SIZE)(FMSTR_COMM_BUFFER_SIZE)) || pResponse != &fmstr_pNetBuffer[FMSTR_NET_PAYLOAD_OFFSET]) + { + /* The Network driver doesn't support bigger responses than FMSTR_COMM_BUFFER_SIZE bytes, change the response to + * status error */ + statusCode = FMSTR_STC_RSPBUFFOVF; + nLength = 0U; + } + + pMessageIO = &fmstr_pNetBuffer[0]; + + /* Send the message with status, length and checksum. */ + todo = (FMSTR_U16)(nLength + 7U); + + /* Total frame length */ + pMessageIO = FMSTR_ValueToBuffer16BE(pMessageIO, todo); + + /* Sequence number */ + pMessageIO = FMSTR_ValueToBuffer8(pMessageIO, fmstr_nSeqNumber); + + /* Status code */ + pMessageIO = FMSTR_ValueToBuffer8(pMessageIO, (FMSTR_BCHR)statusCode); + + /* Response length */ + pMessageIO = FMSTR_ValueToBuffer16BE(pMessageIO, (FMSTR_U16)nLength); + + /* Initialize CRC algorithms */ + FMSTR_Crc8Init(&chSum); + + /* Checksum CRC8 */ + pResponse = &fmstr_pNetBuffer[3]; + for (i = 0; i < nLength + 3U; i++) + { + /* Get from FMSTR buffer */ + pResponse = FMSTR_ValueFromBuffer8(&c, pResponse); + + /* add character to checksum */ + FMSTR_Crc8AddByte(&chSum, c); + } + + /* Store checksum after the message */ + pResponse = FMSTR_ValueToBuffer8(pResponse, chSum); + + /* Send via network */ + while (res > 0 && sent < todo) + { + res = FMSTR_NET_DRV.Send(&session->address, &fmstr_pNetBuffer[sent], todo - sent); + + if (res < 0) + { + /* Socket error condition */ + _FMSTR_NetCloseSession(session); + return; + } + + sent += (FMSTR_U16)res; + } +} + +/****************************************************************************** + * + * @brief Process network communication + * + * This function returns TRUE when network transmission is complete. + * It returns FALSE when received middle of the frame (TCP) and needs to be + * called asap after any new data are received. + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_NetProcess(void) +{ + FMSTR_BCHR chSum = 0U, crc; + FMSTR_U16 i; + FMSTR_U8 c; + int received = 0; + FMSTR_U16 todo = 0; + FMSTR_BPTR pMessageIO, pCmdPayload, pCrc; + FMSTR_U8 cmd = 0; + FMSTR_U16 nLength; + FMSTR_BOOL isBroadcast = FMSTR_FALSE; + + FMSTR_NET_SESSION *session = NULL; + FMSTR_NET_ADDR address; + FMSTR_MemSet(&address, 0, sizeof(address)); + + /* Receive data */ + received = FMSTR_NET_DRV.Recv(&fmstr_pNetBuffer[fmstr_nReceived], (FMSTR_COMM_BUFFER_SIZE + 7) - fmstr_nReceived, + &address, &isBroadcast); + + if (received < 0) + { + /* Find session, but not create it */ + session = _FMSTR_FindNetSession(&address, FMSTR_FALSE); + if (session != NULL) + { + _FMSTR_NetCloseSession(session); + } + } + + if (received <= 0) + { + return FMSTR_TRUE; + } + + fmstr_nReceived += (FMSTR_SIZE)received; + + if (isBroadcast == FMSTR_FALSE) + { + /* Find session and create it */ + session = _FMSTR_FindNetSession(&address, FMSTR_TRUE); + } + + pMessageIO = &fmstr_pNetBuffer[0]; + + /* Received total length */ + if (fmstr_nReceived < 2U) + { + return FMSTR_FALSE; + } + + pMessageIO = FMSTR_ValueFromBuffer16BE(&todo, pMessageIO); + + /* Sanity check of todo length */ + if (todo > ((FMSTR_U16)FMSTR_COMM_BUFFER_SIZE + 7U)) + { + if (session != NULL) + { + _FMSTR_NetCloseSession(session); + } + return FMSTR_TRUE; + } + + /* Not enough data in buffer */ + if (fmstr_nReceived < todo) + { + return FMSTR_FALSE; + } + + /* Initialize CRC algorithms */ + FMSTR_Crc8Init(&chSum); + + /* Sequence number */ + pMessageIO = FMSTR_ValueFromBuffer8(&fmstr_nSeqNumber, pMessageIO); + + /* Pointer to start checking CRC */ + pCrc = pMessageIO; + + /* Command code */ + pMessageIO = FMSTR_ValueFromBuffer8(&cmd, pMessageIO); + + /* Command length */ + pMessageIO = FMSTR_ValueFromBuffer16BE(&nLength, pMessageIO); + + /* Bad data length */ + if (todo != (nLength + 7U)) + { + if (session != NULL) + { + _FMSTR_NetCloseSession(session); + } + return FMSTR_TRUE; + } + + /* Command payload */ + pCmdPayload = pMessageIO; + + /* Skip command length for get CRC */ + pMessageIO = FMSTR_SkipInBuffer(pMessageIO, nLength); + + /* CRC */ + pMessageIO = FMSTR_ValueFromBuffer8(&crc, pMessageIO); + + /* Count CRC */ + for (i = 0; i < nLength + 3U; i++) + { + /* Get from FMSTR buffer */ + pCrc = FMSTR_ValueFromBuffer8(&c, pCrc); + + /* add character to checksum */ + FMSTR_Crc8AddByte(&chSum, c); + } + + /* Checksum */ + if (crc == chSum) + { + /* Network PING command */ + if (cmd == FMSTR_NET_PING) + { + if (isBroadcast == FMSTR_FALSE) + { + /* PING response to unicast request. */ + _FMSTR_NetSendStatus(FMSTR_STS_OK, session); + } + } +#if FMSTR_NET_AUTODISCOVERY != 0 + /* Network auto-discovery command */ + else if (cmd == FMSTR_NET_DISCOVERY) + { + /* Send discovery (also to broadcast) */ + _FMSTR_NetSendDiscovery(&address); + + /* Invalidate the session immediatelly, so it is reused next time */ + if (session != NULL) + { + session->lastUsed = 0U; + } + } +#endif + /* Decode protocol only when not receive data from broadcast */ + else + { + /* Decode protocol only for unicast communiction */ + if (isBroadcast == FMSTR_FALSE) + { + (void)FMSTR_ProtocolDecoder(pCmdPayload, nLength, cmd, session); + } + } + } + else + { + /* Report error only for unicast communiction */ + if (isBroadcast == FMSTR_FALSE) + { + _FMSTR_NetSendStatus(FMSTR_STC_CMDCSERR, session); + } + } + + fmstr_nReceived = 0U; + + return FMSTR_TRUE; +} + +#if FMSTR_NET_AUTODISCOVERY != 0 +static void _FMSTR_NetSendDiscovery(const FMSTR_NET_ADDR *address) +{ + FMSTR_NET_IF_CAPS caps; + FMSTR_NET_SESSION session; + FMSTR_BPTR pMessageIO; + FMSTR_U8 nameLen = 0; + FMSTR_U8 protocol = 0; + + /* Get protocol from low-level */ + FMSTR_MemSet(&caps, 0, sizeof(caps)); + FMSTR_NET_DRV.GetCaps(&caps); + if ((caps.flags & FMSTR_NET_IF_CAPS_FLAG_UDP) != 0U) + { + protocol = (FMSTR_U8)FMSTR_NET_PROTOCOL_UDP; + } + else if ((caps.flags & FMSTR_NET_IF_CAPS_FLAG_TCP) != 0U) + { + protocol = (FMSTR_U8)FMSTR_NET_PROTOCOL_TCP; + } + else + { + FMSTR_ASSERT(FMSTR_FALSE); + } + + FMSTR_MemCpy(&session.address, address, sizeof(FMSTR_NET_ADDR)); + + /* Lenght of board name */ + nameLen = (FMSTR_U8)(FMSTR_StrLen(FMSTR_APPLICATION_STR) + 1U); + if (nameLen > ((FMSTR_U8)FMSTR_COMM_BUFFER_SIZE - 3U)) + { + nameLen = (FMSTR_U8)FMSTR_COMM_BUFFER_SIZE - 3U; + } + + pMessageIO = &fmstr_pNetBuffer[6]; + + /* Discovery command version */ + pMessageIO = FMSTR_ValueToBuffer8(pMessageIO, FMSTR_NET_DISCOVERY_VERSION); + + /* Protocol (TCP/UDP) */ + pMessageIO = FMSTR_ValueToBuffer8(pMessageIO, protocol); + + /* Length of board name */ + pMessageIO = FMSTR_ValueToBuffer8(pMessageIO, nameLen); + + /* Copy name */ + pMessageIO = FMSTR_CopyToBuffer(pMessageIO, (FMSTR_ADDR)(char *)FMSTR_APPLICATION_STR, nameLen); + + /* send response */ + _FMSTR_NetSendResponse(&fmstr_pNetBuffer[6], (FMSTR_SIZE)nameLen + 3U, FMSTR_STS_OK, &session); +} +#endif /* FMSTR_NET_AUTODISCOVERY */ + +static void _FMSTR_NetSendStatus(FMSTR_BCHR nErrCode, FMSTR_NET_SESSION *session) +{ + /* fill & send single-byte response */ + _FMSTR_NetSendResponse(&fmstr_pNetBuffer[6], 0U, nErrCode, session); +} + +static void _FMSTR_NetCloseSession(FMSTR_NET_SESSION *ses) +{ + FMSTR_ASSERT(ses != NULL); + + /* Close socket */ + FMSTR_NET_DRV.Close(&ses->address); + + /* Free protocol session, if closed socket */ + FMSTR_FreeSession(ses); +} + +static FMSTR_NET_SESSION *_FMSTR_FindNetSession(FMSTR_NET_ADDR *addr, FMSTR_BOOL create) +{ + FMSTR_NET_SESSION *ses = NULL; + FMSTR_NET_SESSION *freeSession = NULL; + FMSTR_NET_SESSION *oldestSession = NULL; + FMSTR_INDEX i; + + FMSTR_ASSERT(addr != NULL); + + fmstr_nSessionCounter++; + + for (i = 0; i < FMSTR_SESSION_COUNT; i++) + { + ses = &fmstr_pNetSessions[i]; + + /* Find session by address */ + if (FMSTR_MemCmp(&ses->address, addr, sizeof(FMSTR_NET_ADDR)) == 0) + { + /* Found session */ + ses->lastUsed = fmstr_nSessionCounter; + return ses; + } + + /* Find free session */ + if (freeSession == NULL && ses->lastUsed == 0U) + { + freeSession = ses; + } + + /* Find oldest session */ + if (oldestSession == NULL || oldestSession->lastUsed > ses->lastUsed) + { + oldestSession = ses; + } + } + + ses = (freeSession != NULL ? freeSession : oldestSession); + + if (ses != NULL && create != FMSTR_FALSE) + { + /* If reusing last used session, call protocol to free this session */ + if (ses->lastUsed != 0U) + { + _FMSTR_NetCloseSession(ses); + } + + FMSTR_MemCpy(&ses->address, addr, sizeof(FMSTR_NET_ADDR)); + ses->lastUsed = fmstr_nSessionCounter; + } + + return ses; +} + +#endif /* !(FMSTR_DISABLE) */ diff --git a/middleware/freemaster/src/common/freemaster_net.h b/middleware/freemaster/src/common/freemaster_net.h new file mode 100644 index 0000000..7972ca9 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_net.h @@ -0,0 +1,115 @@ +/* + * Copyright 2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Network communication + */ + +#ifndef __FREEMASTER_NET_H +#define __FREEMASTER_NET_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_net.h +#endif + +/****************************************************************************** +* Serial transport related configuration checks +******************************************************************************/ + +/* transport MUST be defined in configuration */ +#if !defined(FMSTR_NET_DRV) + #error No FreeMASTER communication network driver interface is enabled. Please choose the driver (FMSTR_NET_DRV) or set FMSTR_DISABLE option to 1. +#endif + +/* Network timeout definition check */ +#ifndef FMSTR_NET_BLOCKING_TIMEOUT +#define FMSTR_NET_BLOCKING_TIMEOUT 10 +#endif + +/* Auto discovery definition check */ +#ifndef FMSTR_NET_AUTODISCOVERY +#define FMSTR_NET_AUTODISCOVERY 0 +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +#define FMSTR_NET_DISCOVERY_VERSION 1U +#define FMSTR_NET_IF_CAPS_FLAG_UDP 0x01UL +#define FMSTR_NET_IF_CAPS_FLAG_TCP 0x02UL +#define FMSTR_NET_IF_CAPS_FLAG_RTT 0x04UL + +typedef struct FMSTR_NET_IF_CAPS_S +{ + FMSTR_U32 flags; +} FMSTR_NET_IF_CAPS; + +typedef enum +{ + FMSTR_NET_PROTOCOL_UDP = 1, + FMSTR_NET_PROTOCOL_TCP = 2, +} FMSTR_NET_PROTOCOL; + +typedef enum +{ + FMSTR_NET_ADDR_TYPE_V4, + FMSTR_NET_ADDR_TYPE_V6, +} FMSTR_NET_ADDR_TYPE; + +typedef struct FMSTR_NET_ADDR_S +{ + FMSTR_NET_ADDR_TYPE type; + FMSTR_U16 port; + union + { + FMSTR_BCHR v4[4]; + FMSTR_BCHR v6[16]; + } addr; +} FMSTR_NET_ADDR; + +/* Network Driver interface between the Network layer and hardware driver */ +typedef struct FMSTR_NET_DRV_INTF_S +{ + FMSTR_BOOL (*Init)(void); /* Initialization */ + void (*Poll)(void); /* General poll call */ + FMSTR_S32 (*Recv)(FMSTR_BPTR msgBuff, FMSTR_SIZE msgMaxSize, FMSTR_NET_ADDR * recvAddr, FMSTR_BOOL * isBroadcast); /* Receive data */ + FMSTR_S32 (*Send)(FMSTR_NET_ADDR * sendAddr, FMSTR_BPTR msgBuff, FMSTR_SIZE msgSize); /* Send data */ + void (*Close)(FMSTR_NET_ADDR * addr); /* Close active session */ + void (*GetCaps)(FMSTR_NET_IF_CAPS * caps); +} FMSTR_NET_DRV_INTF; + +/****************************************************************************** +* Functions definitions +******************************************************************************/ + +/* If defined in freemaster_cfg.h, make sure the NETWORK driver interface is also declared properly. */ +#ifdef FMSTR_NET_DRV +extern const FMSTR_NET_DRV_INTF FMSTR_NET_DRV; +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_NET_H */ diff --git a/middleware/freemaster/src/common/freemaster_pdbdm.c b/middleware/freemaster/src/common/freemaster_pdbdm.c new file mode 100644 index 0000000..c32deef --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_pdbdm.c @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Packet-driver BDM communication + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our transport is used or not. */ +#define FMSTR_PDBDM_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_TRANSPORT) == FMSTR_PDBDM_ID) && FMSTR_DISABLE == 0 + +#if FMSTR_SESSION_COUNT != 1 +/* Packet Driven BDM transport only supports a single session */ +#warning Please set FMSTR_SESSION_COUNT to 1. +#endif + +/* Packet Driven BDM communication does not support any interrupt mode */ +#if FMSTR_SHORT_INTR > 0 || FMSTR_LONG_INTR > 0 + #warning "FreeMASTER Packet Driven BDM driver doesn't support any Interrupt mode. Call the FMSTR_Poll() function in the Timer ISR routine instead." +#endif + +#if (FMSTR_COMM_BUFFER_SIZE & 0x03) + #error The communication buffer size (FMSTR_COMM_BUFFER_SIZE) must be aligned to 4. +#endif + +#if (FMSTR_COMM_BUFFER_SIZE > 240) + #error The communication buffer size (FMSTR_COMM_BUFFER_SIZE) must be smaller than 240 bytes. +#endif + +#include "freemaster_protocol.h" +#include "freemaster_utils.h" + +/****************************************************************************** +* Protocol constants +*******************************************************************************/ + +/* Communication buffer borders */ +#define FMSTR_PDBDM_BUFFBORDER_CODE1 0x00EEBE01UL /* Beginning Magic Number for Packet driven BDM communication buffer, highest byte is reserved for communication buffer size */ +#define FMSTR_PDBDM_BUFFBORDER_CODE2 0xF0EEED01UL /* Ending Magic Number for Packet driven BDM communication buffer */ + +/* Packet Driven BDM Communication States */ +#define FMSTR_PDBDM_IDLE 0x00U /* FreeMASTER serial driver is configured to BDM and ready to communicate */ +#define FMSTR_PDBDM_RECEIVED_FRAME 0x02U /* New Frame is ready in communication buffer. */ +#define FMSTR_PDBDM_DECODING_FRAME 0x04U /* Received frame is processed */ +#define FMSTR_PDBDM_FRAME_TO_SEND 0x08U /* FreeMASTER Communication buffer includes frame to be sent back */ + +/*********************************** +* local variables +***********************************/ + +/* Packet driven communication buffer */ +#if FMSTR_PDBDM_USER_BUFFER != 0 +extern FMSTR_PDBDM_COMBUFF _pdbdm; /* Defined by user (e.g. special section placement needed) */ +#else +static FMSTR_PDBDM_COMBUFF _pdbdm; /* Defined locally */ +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of packet driven BDM transport */ +static FMSTR_BOOL _FMSTR_PdBdmInit(void); +/* Interface function - Poll function of packet driven BDM transport */ +static void _FMSTR_PdBdmPoll(void); +/* Interface function - Send Response function of packet driven BDM transport */ +static void _FMSTR_PdBdmSendResponse(FMSTR_BPTR pResponse, FMSTR_SIZE nLength, FMSTR_U8 statusCode, void * identification); + +/*********************************** +* global variables +***********************************/ +/* Interface of this serial driver */ +const FMSTR_TRANSPORT_INTF FMSTR_PDBDM = +{ + .Init = _FMSTR_PdBdmInit, + .Poll = _FMSTR_PdBdmPoll, + .SendResponse = _FMSTR_PdBdmSendResponse, +}; + +/****************************************************************************** +* +* @brief Packet Driven communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_PdBdmInit(void) +{ + /* Initialize buffer border and size in communication buffer */ + _pdbdm.ctxStart = (FMSTR_U32)(FMSTR_PDBDM_BUFFBORDER_CODE1 | ((FMSTR_U32)FMSTR_COMM_BUFFER_SIZE << 24)); + _pdbdm.pcktSize = 0; + _pdbdm.ctxEnd = FMSTR_PDBDM_BUFFBORDER_CODE2; + + FMSTR_MemSet(_pdbdm.commBuffer, 0, sizeof(_pdbdm.commBuffer)); + + _pdbdm.bdmState = FMSTR_PDBDM_IDLE; + + return FMSTR_TRUE; +} + +/******************************************************************************* +* +* @brief API: Packet Driven BDM Transport "Polling" call from the application main loop +* +* This function either handles all the PDBDM communication and decodes messages received +* on the background by BDM interaface. +* +* +*******************************************************************************/ + +static void _FMSTR_PdBdmPoll(void) +{ + if (_pdbdm.bdmState == FMSTR_PDBDM_RECEIVED_FRAME) + { + FMSTR_U8 i; + FMSTR_U8 crc; + FMSTR_Crc8Init(&crc); + +#if FMSTR_DEBUG_LEVEL >= 2 + FMSTR_DEBUG_PRINTF("PDBDM - Received Frame(cmd: 0x%02X, len: %d).\n", _pdbdm.cmdStatus, _pdbdm.pcktSize); +#endif + /* Check Packet consistency */ + FMSTR_Crc8AddByte(&crc, _pdbdm.pcktSize); + FMSTR_Crc8AddByte(&crc, _pdbdm.cmdStatus); + + for(i=0; i<_pdbdm.pcktSize; i++) + { + FMSTR_Crc8AddByte(&crc, _pdbdm.commBuffer[i]); + } + + /* If CRC is valid, do the prtocol decoding, otherwise wait to finish background write*/ + if(crc == _pdbdm.commBuffer[i]) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_INDEX j; + if(_pdbdm.pcktSize) + { + FMSTR_DEBUG_PRINTF("PDBDM - Received Frame Data: \n"); + for(j=0;j<_pdbdm.pcktSize;j++) + { + FMSTR_DEBUG_PRINTF("%02X ", _pdbdm.commBuffer[j]); + } + FMSTR_DEBUG_PRINTF("\n"); + } +#endif + /* Packet is potentially received */ + _pdbdm.bdmState = FMSTR_PDBDM_DECODING_FRAME; + /* Destroy the last CRC in memory */ + _pdbdm.commBuffer[i] = ~crc; + /* Decode received packet. Use "pdbdm" as a globally unique pointer value as our identifier */ + (void)FMSTR_ProtocolDecoder(_pdbdm.commBuffer, _pdbdm.pcktSize, _pdbdm.cmdStatus, (void*)"pdbdm"); + } +#if FMSTR_DEBUG_LEVEL >= 2 + else + { + FMSTR_DEBUG_PRINTF("PDBDM - Received Frame has invalid CRC(excepted: 0x%02X, received: 0x%02X).\n", crc, _pdbdm.commBuffer[i]); + } +#endif + } +} + +/****************************************************************************** +* +* @brief Finalize transmit buffer before transmitting +* +* @param pResponse - response buffer pointer +* @param nLength - response length +* @param statusCode - response packat status code +* +* This Function takes the data already prepared in the transmit buffer and notify +* PDBDM sytem that data are ready. +* +******************************************************************************/ + +static void _FMSTR_PdBdmSendResponse(FMSTR_BPTR pResponse, FMSTR_SIZE nLength, FMSTR_U8 statusCode, void * identification) +{ + FMSTR_U8 crc; + FMSTR_SIZE i; + /* Check the response that is valid to provided address? */ + FMSTR_ASSERT(pResponse == _pdbdm.commBuffer); + + /* Compute CRC8 data consistency check, including status and packet length */ + FMSTR_Crc8Init(&crc); + + FMSTR_Crc8AddByte(&crc, (FMSTR_U8)nLength); + FMSTR_Crc8AddByte(&crc, statusCode); + for(i=0; i= 2 + FMSTR_DEBUG_PRINTF("PDBDM - Prepared response(status: 0x%02X, len: %d).\n", _pdbdm.cmdStatus, _pdbdm.pcktSize); + if(_pdbdm.pcktSize) + { + for(i=0;i<_pdbdm.pcktSize;i++) + { + FMSTR_DEBUG_PRINTF("%02X ", _pdbdm.commBuffer[i]); + } + } + FMSTR_DEBUG_PRINTF(" CRC: 0x%02X.\n", crc); +#endif + + /* Frame is ready to send */ + _pdbdm.bdmState = FMSTR_PDBDM_FRAME_TO_SEND; +} + +#endif /* (FMSTR_MK_IDSTR(FMSTR_TRANSPORT) == FMSTR_PDBDM_ID) && (!(FMSTR_DISABLE)) */ diff --git a/middleware/freemaster/src/common/freemaster_pipes.c b/middleware/freemaster/src/common/freemaster_pipes.c new file mode 100644 index 0000000..e0d51f7 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_pipes.c @@ -0,0 +1,2119 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Pipe I/O + */ + +#include "freemaster.h" +#include "freemaster_private.h" +#include "freemaster_protocol.h" +#include "freemaster_utils.h" + +#if FMSTR_USE_PIPES > 0 && FMSTR_DISABLE == 0 + +#if FMSTR_USE_PIPE_PRINTF_VARG > 0 +#include +#endif + +/*********************************** + * local types + ***********************************/ + +/* Flags for command FMSTR_CMD_GETPIPE */ +#define FMSTR_PIPE_GETPIPE_FLAG_PORT 0x01U + +/* Flags for get pipe info in command FMSTR_CMD_GETPIPE */ +#define FMSTR_PIPE_GETINFO_FLAG_ISOPEN 0x01U + +#define FMSTR_PIPE_CFGCODE_NAME 0x81U +#define FMSTR_PIPE_CFGCODE_INFO 0x82U + +/* runtime flags */ +typedef union +{ + FMSTR_FLAGS all; + + struct + { + unsigned bExpectOdd : 1; /* now expecting even round */ + unsigned bInComm : 1; /* in protocol handler now */ + unsigned bLocked : 1; /* data buffer access is locked */ + } flg; + +} FMSTR_PIPE_FLAGS; + +typedef union +{ + FMSTR_FLAGS all; + + struct + { + unsigned bIsFull : 1; /* buffer is full (wp==rp, but not empty) */ + } flg; + +} FMSTR_PIPE_BUFF_FLAGS; + +typedef struct +{ + FMSTR_U8 *buff; + FMSTR_PIPE_SIZE size; + FMSTR_PIPE_SIZE wp; + FMSTR_PIPE_SIZE rp; + FMSTR_PIPE_BUFF_FLAGS flags; +} FMSTR_PIPE_BUFF; + +typedef struct +{ + /* pipe information */ + const FMSTR_CHAR *name; /* String description of the pipe. */ + FMSTR_U8 type; /* Type of the usage of pipe */ + + /* pipe configuration */ + FMSTR_PIPE_BUFF rx; + FMSTR_PIPE_BUFF tx; + FMSTR_PIPE_PORT pipePort; + FMSTR_PPIPEFUNC pCallback; + + /* runtime information */ + FMSTR_PIPE_FLAGS flags; + FMSTR_U8 nLastBytesReceived; + + /* residue buffer for 8-bit handling on DSP56F8xx platform */ +#if FMSTR_CFG_BUS_WIDTH > 1 + FMSTR_U16 rd8Resid; + FMSTR_U16 wr8Resid; +#endif + +#if FMSTR_USE_PIPE_PRINTF > 0 + FMSTR_CHAR printfBuff[FMSTR_PIPES_PRINTF_BUFF_SIZE]; + FMSTR_SIZE printfBPtr; +#endif + +} FMSTR_PIPE; + +/* Pipe ITOA formatting flags */ +typedef union +{ + FMSTR_FLAGS all; + + struct + { + unsigned upperc : 1; /* uppercase HEX letters */ + unsigned zeroes : 1; /* prepend with zeroes rather than spaces */ + unsigned showsign : 1; /* show sign always (even if plus) */ + unsigned negative : 1; /* sign determined during itoa */ + unsigned signedtype : 1; /* type is signed (used with va_list only) */ + unsigned isstring : 1; /* formatting %s */ + + } flg; + +} FMSTR_PIPE_ITOA_FLAGS; + +/* Pipe printf context */ +typedef struct +{ + FMSTR_PIPE_ITOA_FLAGS flags; + FMSTR_U8 radix; + FMSTR_U8 dtsize; + FMSTR_SIZE8 alen; + +} FMSTR_PIPE_PRINTF_CTX; + +typedef FMSTR_BOOL (*FMSTR_PIPE_ITOA_FUNC)(FMSTR_HPIPE pipeHandle, const void *parg, FMSTR_PIPE_PRINTF_CTX *ctx); + +/*********************************** + * local variables + ***********************************/ + +static FMSTR_PIPE pcm_pipes[FMSTR_USE_PIPES]; + +/********************************************************************** + * local macros + **********************************************************************/ + +#define FMSTR_PIPE_ITOAFMT_BIN 0U +#define FMSTR_PIPE_ITOAFMT_OCT 1U +#define FMSTR_PIPE_ITOAFMT_DEC 2U +#define FMSTR_PIPE_ITOAFMT_HEX 3U +#define FMSTR_PIPE_ITOAFMT_CHAR 4U + +#define FMSTR_IS_DIGIT(x) (((x) >= '0') && ((x) <= '9')) + +/********************************************************************** + * local functions + **********************************************************************/ + +static FMSTR_PIPE *_FMSTR_FindPipe(FMSTR_PIPE_PORT pipePort); +static FMSTR_PIPE_SIZE _FMSTR_PipeGetBytesFree(FMSTR_PIPE_BUFF *pipeBuff); +static FMSTR_PIPE_SIZE _FMSTR_PipeGetBytesReady(FMSTR_PIPE_BUFF *pipeBuff); +static void _FMSTR_PipeDiscardBytes(FMSTR_PIPE_BUFF *pipeBuff, FMSTR_SIZE8 countBytes); +static FMSTR_BPTR _FMSTR_PipeReceive(FMSTR_BPTR msgBuffIO, FMSTR_PIPE *pp, FMSTR_SIZE8 msgBuffSize); +static FMSTR_BPTR _FMSTR_PipeTransmit(FMSTR_BPTR msgBuffIO, FMSTR_PIPE *pp, FMSTR_SIZE8 msgBuffSize); +static FMSTR_BOOL _FMSTR_PipeIToAFinalize(FMSTR_HPIPE pipeHandle, FMSTR_PIPE_PRINTF_CTX *pctx); + +static FMSTR_BOOL _FMSTR_PipePrintfOne(FMSTR_HPIPE pipeHandle, + const char *format, + void *parg, + FMSTR_PIPE_ITOA_FUNC pItoaFunc); + +static FMSTR_BOOL _FMSTR_PipePrintfAny(FMSTR_HPIPE pipeHandle, va_list *parg, FMSTR_PIPE_PRINTF_CTX *pctx); +static FMSTR_BOOL _FMSTR_PipePrintfV(FMSTR_HPIPE pipeHandle, const char *format, va_list *parg); +static FMSTR_CHAR _FMSTR_XDigit(FMSTR_U8 digit, FMSTR_BOOL uppercase); + +/********************************************************************** + * local "inline" functions (may also be static on some platforms) + **********************************************************************/ + +FMSTR_INLINE FMSTR_BOOL _FMSTR_PipePrintfFlush(FMSTR_HPIPE pipeHandle); +FMSTR_INLINE FMSTR_BOOL _FMSTR_PipePrintfPutc(FMSTR_HPIPE pipeHandle, char c); + +/****************************************************************************** + * + * @brief Initialization of pipes layer + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_InitPipes(void) +{ + FMSTR_INDEX i; + + for (i = 0; i < (FMSTR_INDEX)FMSTR_USE_PIPES; i++) + { + pcm_pipes[i].pipePort = 0; + } + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief API: Opening the pipe + * + ******************************************************************************/ + +FMSTR_HPIPE FMSTR_PipeOpen(FMSTR_PIPE_PORT pipePort, + FMSTR_PPIPEFUNC pipeCallback, + FMSTR_ADDR pipeRxBuff, + FMSTR_PIPE_SIZE pipeRxSize, + FMSTR_ADDR pipeTxBuff, + FMSTR_PIPE_SIZE pipeTxSize, + FMSTR_U8 type, + const FMSTR_CHAR *name) +{ + FMSTR_PIPE *pp = NULL; + FMSTR_INDEX ifree = -1; + FMSTR_INDEX i; + + for (i = 0; i < (FMSTR_INDEX)FMSTR_USE_PIPES; i++) + { + pp = &pcm_pipes[i]; + + /* find first free pipe */ + if (pp->pipePort == 0U && ifree < 0) + { + ifree = i; + } + /* look for existing pipe with the same port */ + if (pp->pipePort == pipePort) + { + break; + } + } + + /* pipe not found */ + if (i >= (FMSTR_INDEX)FMSTR_USE_PIPES) + { + /* create new pipe */ + if (ifree >= 0) + { + pp = &pcm_pipes[ifree]; + } + /* no slot for creating pipe */ + else + { + return NULL; + } + } + + FMSTR_MemSet(pp, 0, sizeof(FMSTR_PIPE)); + + /* disable pipe (just in case the interrupt would come now) */ + pp->pipePort = 0; + + /* initialize pipe */ + pp->rx.buff = pipeRxBuff; + pp->rx.size = pipeRxSize; + pp->tx.buff = pipeTxBuff; + pp->tx.size = pipeTxSize; + pp->pCallback = pipeCallback; + pp->name = name; + pp->type = type; + +#if FMSTR_USE_PIPE_PRINTF > 0 + pp->printfBPtr = 0; +#endif + + /* activate pipe for the new port */ + pp->pipePort = pipePort; + + return (FMSTR_HPIPE)pp; +} + +/****************************************************************************** + * + * @brief PIPE API: Close pipe + * + ******************************************************************************/ + +void FMSTR_PipeClose(FMSTR_HPIPE pipeHandle) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + + /* un-initialize pipe */ + if (pp != NULL) + { + pp->pipePort = 0; + } +} + +/****************************************************************************** + * + * @brief PIPE API: Write data to a pipe + * + ******************************************************************************/ + +FMSTR_PIPE_SIZE FMSTR_PipeWrite(FMSTR_HPIPE pipeHandle, + FMSTR_ADDR pipeData, + FMSTR_PIPE_SIZE pipeDataLen, + FMSTR_PIPE_SIZE writeGranularity) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + FMSTR_PIPE_BUFF *pbuff = &pp->tx; + FMSTR_PIPE_SIZE total = _FMSTR_PipeGetBytesFree(pbuff); + FMSTR_PIPE_SIZE s; + + /* when invalid address is given, just return number of bytes free */ + if (pipeData != NULL) + { + /* only fill the free space */ + if (pipeDataLen > total) + { + pipeDataLen = total; + } + + /* obey granularity */ + if (writeGranularity > 1U) + { + pipeDataLen /= writeGranularity; + pipeDataLen *= writeGranularity; + } + + /* return value */ + total = pipeDataLen; + + /* valid length only */ + if (pipeDataLen > 0U) + { + /* total bytes available in the rest of buffer */ + s = (FMSTR_PIPE_SIZE)((pbuff->size - pbuff->wp) * FMSTR_CFG_BUS_WIDTH); + if (s > pipeDataLen) + { + s = pipeDataLen; + } + + /* get the bytes */ + FMSTR_MemCpyFrom(pbuff->buff + pbuff->wp, pipeData, (FMSTR_SIZE8)s); + pipeData += s / FMSTR_CFG_BUS_WIDTH; + + /* advance & wrap pointer */ + pbuff->wp += s / FMSTR_CFG_BUS_WIDTH; + if (pbuff->wp >= pbuff->size) + { + pbuff->wp = 0; + } + + /* rest of frame to a (wrapped) beggining of buffer */ + pipeDataLen -= (FMSTR_SIZE8)s; + if (pipeDataLen > 0U) + { + FMSTR_MemCpyFrom(pbuff->buff + pbuff->wp, pipeData, (FMSTR_SIZE8)pipeDataLen); + pbuff->wp += pipeDataLen / FMSTR_CFG_BUS_WIDTH; + } + + /* buffer got full? */ + if (pbuff->wp == pbuff->rp) + { + pbuff->flags.flg.bIsFull = 1; + } + } + } + + return total; +} + +/****************************************************************************** + * + * @brief PIPE API: Put zero-terminated string into pipe. Succeedes only + * if full string fits into the output buffer and return TRUE if so. + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_PipePuts(FMSTR_HPIPE pipeHandle, const char *text) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + FMSTR_PIPE_BUFF *pbuff = &pp->tx; + FMSTR_PIPE_SIZE bytesFree = _FMSTR_PipeGetBytesFree(pbuff); + FMSTR_PIPE_SIZE strLen = (FMSTR_PIPE_SIZE)FMSTR_StrLen(text); + + if (strLen > bytesFree) + { + return FMSTR_FALSE; + } + + return FMSTR_PipeWrite(pipeHandle, (FMSTR_ADDR)text, strLen, 0) >= strLen ? FMSTR_TRUE : FMSTR_FALSE; +} + +/****************************************************************************** + * + * @brief PRINTF-like formatting functions + * + *****************************************************************************/ + +#if FMSTR_USE_PIPE_PRINTF > 0 + +static FMSTR_CHAR _FMSTR_XDigit(FMSTR_U8 digit, FMSTR_BOOL uppercase) +{ + FMSTR_CHAR c; + + if (digit < 10U) + { + c = '0'; + c += (FMSTR_CHAR)digit; + } + else + { + if (uppercase != FMSTR_FALSE) + { + c = 'A' - 10; + } + else + { + c = 'a' - 10; + } + + c += (FMSTR_CHAR)digit; + } + + return c; +} + +/****************************************************************************** + * + * @brief Flush pipe's printf formatting buffer into pipe output buffer + * + *****************************************************************************/ + +FMSTR_INLINE FMSTR_BOOL _FMSTR_PipePrintfFlush(FMSTR_HPIPE pipeHandle) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + FMSTR_BOOL ok = FMSTR_TRUE; + FMSTR_SIZE i; + + if (pp->printfBPtr != 0U) + { + FMSTR_SIZE sz = FMSTR_PipeWrite(pipeHandle, (FMSTR_ADDR)pp->printfBuff, (FMSTR_PIPE_SIZE)pp->printfBPtr, 0); + + /* all characters could NOT be printed */ + if (sz < pp->printfBPtr) + { + /* Move not sent characters */ + for (i = 0; i < (pp->printfBPtr - sz); i++) + { + pp->printfBuff[i] = pp->printfBuff[sz + i]; + } + + pp->printfBPtr -= sz; + + ok = FMSTR_FALSE; + } + else + { + /* not a cyclic buffer, must start over anyway (also if error) */ + pp->printfBPtr = 0; + } + } + + return ok; +} + +/****************************************************************************** + * + * @brief Put one character into pipe's printf formating buffer + * + *****************************************************************************/ + +FMSTR_INLINE FMSTR_BOOL _FMSTR_PipePrintfPutc(FMSTR_HPIPE pipeHandle, char c) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + + /* when buffer is full */ + if (pp->printfBPtr >= FMSTR_PIPES_PRINTF_BUFF_SIZE) + { + /* try to flush some bytes */ + if (_FMSTR_PipePrintfFlush(pipeHandle) == FMSTR_FALSE) + { + return FMSTR_FALSE; + } + } + + /* abort if still full */ + if (pp->printfBPtr >= FMSTR_PIPES_PRINTF_BUFF_SIZE) + { + return FMSTR_FALSE; + } + + pp->printfBuff[pp->printfBPtr++] = c; + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief This function finishes the number formatting, adds spacing, signs + * and reverses the string (the input is comming in reversed order) + * + *****************************************************************************/ + +static FMSTR_BOOL _FMSTR_PipeIToAFinalize(FMSTR_HPIPE pipeHandle, FMSTR_PIPE_PRINTF_CTX *pctx) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + FMSTR_SIZE bptr, minlen, i, bhalf; + FMSTR_CHAR z, sgn; + + /* buffer pointer into local variable */ + bptr = pp->printfBPtr; + + /* if anything goes wrong, throw our prepared string away */ + pp->printfBPtr = 0; + + /* zero may come as an empty string from itoa procedures */ + if (bptr == 0U) + { + pp->printfBuff[0] = '0'; + bptr = 1; + } + + /* first strip the zeroes put by itoa */ + while (bptr > 1U && pp->printfBuff[bptr - 1U] == '0') + { + bptr--; + } + + /* determine sign to print */ + if (pctx->flags.flg.negative != 0U) + { + sgn = '-'; + + /* minus need to be shown always */ + pctx->flags.flg.showsign = 1U; + } + else + { + /* plus will be shown if flg.showsign was set by caller */ + sgn = '+'; + } + + /* unsigned types can not print sign */ + if (pctx->flags.flg.signedtype == 0U) + { + pctx->flags.flg.showsign = 0U; + } + + /* calculate minimum buffer length needed */ + minlen = bptr; + if (pctx->flags.flg.showsign != 0U) + { + minlen++; + } + + /* will it fit? */ + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < minlen) + { + return FMSTR_FALSE; + } + + /* required length should never exceed the buffer length */ + if (pctx->alen > FMSTR_PIPES_PRINTF_BUFF_SIZE) + { + pctx->alen = FMSTR_PIPES_PRINTF_BUFF_SIZE; + } + + /* choose prefix character (zero, space or sign-extension OCT/HEX/BIN) */ + if (pctx->flags.flg.zeroes != 0U) + { + z = '0'; + + /* sign extend? */ + if (pctx->flags.flg.negative != 0U) + { + switch (pctx->radix) + { + case FMSTR_PIPE_ITOAFMT_BIN: + z = '1'; + break; + case FMSTR_PIPE_ITOAFMT_OCT: + z = '7'; + break; + case FMSTR_PIPE_ITOAFMT_HEX: + z = (FMSTR_CHAR)(pctx->flags.flg.upperc != 0U ? 'F' : 'f'); + break; + default: + z = '0'; + break; + } + } + + /* the sign will be in front of added zeroes */ + if (pctx->flags.flg.showsign != 0U) + { + pctx->alen--; + } + } + else + { + z = ' '; + + /* sign should be in front of the number */ + if (pctx->flags.flg.showsign != 0U) + { + pp->printfBuff[bptr++] = sgn; + pctx->flags.flg.showsign = 0; /* prevent it to be added again below */ + } + } + + /* now fill to required len */ + while (bptr < pctx->alen) + { + pp->printfBuff[bptr++] = z; + } + + /* add the sign if needed */ + if (pctx->flags.flg.showsign != 0U) + { + pp->printfBuff[bptr++] = sgn; + } + + /* buffer contains this number of characters */ + pp->printfBPtr = bptr; + + /* now reverse the string and feed it to pipe */ + bhalf = bptr / 2U; + bptr--; + for (i = 0; i < bhalf; i++) + { + z = pp->printfBuff[i]; + pp->printfBuff[i] = pp->printfBuff[bptr - i]; + pp->printfBuff[bptr - i] = z; + } + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief This function formats the argument into the temporary printf buffer + * It is granted by the caller that the buffer is empty before calling. + * + *****************************************************************************/ + +static FMSTR_BOOL FMSTR_PipeU8ToA(FMSTR_HPIPE pipeHandle, const FMSTR_U8 *parg, FMSTR_PIPE_PRINTF_CTX *pctx) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + FMSTR_U8 arg = *parg; + FMSTR_U8 dig; + FMSTR_INDEX i; + + switch (pctx->radix) + { + case FMSTR_PIPE_ITOAFMT_CHAR: + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)arg; + break; + + case FMSTR_PIPE_ITOAFMT_BIN: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 8U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 8; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)'0'; + dig += (FMSTR_U8)(arg & 1U); + + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)dig; + arg >>= 1; + } + break; + + case FMSTR_PIPE_ITOAFMT_OCT: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 3U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 3; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)'0'; + dig += (FMSTR_U8)(arg & 7U); + + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)dig; + arg >>= 3; + } + break; + + case FMSTR_PIPE_ITOAFMT_DEC: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 3U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 3; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)'0'; + dig += (FMSTR_U8)(arg % 10U); + + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)dig; + arg /= 10U; + } + break; + + case FMSTR_PIPE_ITOAFMT_HEX: + default: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 2U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 2; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)(arg & 15U); + + pp->printfBuff[pp->printfBPtr++] = + _FMSTR_XDigit((FMSTR_U8)dig, (FMSTR_BOOL)(pctx->flags.flg.upperc != 0U)); + arg >>= 4; + } + break; + } + + return _FMSTR_PipeIToAFinalize(pipeHandle, pctx); +} + +/****************************************************************************** + * + * @brief This function formats the argument into the temporary printf buffer + * It is granted by the caller that the buffer is empty before calling. + * + *****************************************************************************/ + +static FMSTR_BOOL FMSTR_PipeS8ToA(FMSTR_HPIPE pipeHandle, const FMSTR_S8 *parg, FMSTR_PIPE_PRINTF_CTX *pctx) +{ + FMSTR_S8 arg = *parg; + + if (arg < 0) + { + pctx->flags.flg.negative = 1U; + + /* if sign will be shown, then negate the number */ + if (pctx->flags.flg.signedtype != 0U) + { + arg *= -1; + } + } + + return FMSTR_PipeU8ToA(pipeHandle, (const FMSTR_U8 *)&arg, pctx); +} + +/****************************************************************************** + * + * @brief This function formats the argument into the temporary printf buffer + * It is granted by the caller that the buffer is empty before calling. + * + *****************************************************************************/ + +static FMSTR_BOOL FMSTR_PipeU16ToA(FMSTR_HPIPE pipeHandle, const FMSTR_U16 *parg, FMSTR_PIPE_PRINTF_CTX *pctx) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + FMSTR_U16 arg = *parg; + FMSTR_U8 dig; + FMSTR_INDEX i; + + switch (pctx->radix) + { + case FMSTR_PIPE_ITOAFMT_CHAR: + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)arg; + break; + + case FMSTR_PIPE_ITOAFMT_BIN: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 16U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 16; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)'0'; + dig += (FMSTR_U8)(arg & 1U); + + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)dig; + arg >>= 1; + } + break; + + case FMSTR_PIPE_ITOAFMT_OCT: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 6U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 6; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)'0'; + dig += (FMSTR_U8)(arg & 7U); + + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)dig; + arg >>= 3; + } + break; + + case FMSTR_PIPE_ITOAFMT_DEC: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 5U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 5; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)'0'; + dig += (FMSTR_U8)(arg % 10U); + + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)dig; + arg /= 10U; + } + break; + + case FMSTR_PIPE_ITOAFMT_HEX: + default: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 4U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 4; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)(arg & 15U); + + pp->printfBuff[pp->printfBPtr++] = + _FMSTR_XDigit((FMSTR_U8)dig, (FMSTR_BOOL)(pctx->flags.flg.upperc != 0U)); + arg >>= 4; + } + break; + } + + return _FMSTR_PipeIToAFinalize(pipeHandle, pctx); +} + +/****************************************************************************** + * + * @brief This function formats the argument into the temporary printf buffer + * It is granted by the caller that the buffer is empty before calling. + * + *****************************************************************************/ + +static FMSTR_BOOL FMSTR_PipeS16ToA(FMSTR_HPIPE pipeHandle, const FMSTR_S16 *parg, FMSTR_PIPE_PRINTF_CTX *pctx) +{ + FMSTR_S16 arg = *parg; + + if (arg < 0) + { + pctx->flags.flg.negative = 1U; + + /* if sign will be shown, then negate the number */ + if (pctx->flags.flg.signedtype != 0U) + { + arg *= -1; + } + } + + return FMSTR_PipeU16ToA(pipeHandle, (const FMSTR_U16 *)&arg, pctx); +} + +/****************************************************************************** + * + * @brief This function formats the argument into the temporary printf buffer + * It is granted by the caller that the buffer is empty before calling. + * + *****************************************************************************/ + +static FMSTR_BOOL FMSTR_PipeU32ToA(FMSTR_HPIPE pipeHandle, const FMSTR_U32 *parg, FMSTR_PIPE_PRINTF_CTX *pctx) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + FMSTR_U32 arg = *parg; + FMSTR_U8 dig; + FMSTR_INDEX i; + + switch (pctx->radix) + { + case FMSTR_PIPE_ITOAFMT_CHAR: + pp->printfBuff[pp->printfBPtr++] = (char)arg; + break; + + case FMSTR_PIPE_ITOAFMT_BIN: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 32U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 32; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)'0'; + dig += (FMSTR_U8)(arg & 1U); + + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)dig; + arg >>= 1; + } + break; + + case FMSTR_PIPE_ITOAFMT_OCT: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 11U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 11; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)'0'; + dig += (FMSTR_U8)(arg & 7U); + + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)dig; + arg >>= 3; + } + break; + + case FMSTR_PIPE_ITOAFMT_DEC: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 10U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 10; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)'0'; + dig += (FMSTR_U8)(arg % 10U); + + pp->printfBuff[pp->printfBPtr++] = (FMSTR_CHAR)dig; + arg /= 10U; + } + break; + + case FMSTR_PIPE_ITOAFMT_HEX: + default: + if (FMSTR_PIPES_PRINTF_BUFF_SIZE < 8U) + { + return FMSTR_FALSE; + } + + for (i = 0; i < 8; i++) + { + if (arg == 0U) + { + break; + } + + dig = (FMSTR_U8)(arg & 15U); + + pp->printfBuff[pp->printfBPtr++] = + _FMSTR_XDigit((FMSTR_U8)dig, (FMSTR_BOOL)(pctx->flags.flg.upperc != 0U)); + arg >>= 4; + } + break; + } + + return _FMSTR_PipeIToAFinalize(pipeHandle, pctx); +} + +/****************************************************************************** + * + * @brief This function formats the argument into the temporary printf buffer + * It is granted by the caller that the buffer is empty before calling. + * + *****************************************************************************/ + +static FMSTR_BOOL FMSTR_PipeS32ToA(FMSTR_HPIPE pipeHandle, const FMSTR_S32 *parg, FMSTR_PIPE_PRINTF_CTX *pctx) +{ + FMSTR_S32 arg = *parg; + + if (arg < 0) + { + pctx->flags.flg.negative = 1U; + + /* if sign will be shown, then negate the number */ + if (pctx->flags.flg.signedtype != 0U) + { + arg *= -1; + } + } + + return FMSTR_PipeU32ToA(pipeHandle, (const FMSTR_U32 *)&arg, pctx); +} + +/****************************************************************************** + * + * @brief This function parses the printf format and sets the context + * structure properly. + * + * @return The function returns the pointer to end of format string handled + * + *****************************************************************************/ + +static const char *FMSTR_PipeParseFormat(const char *format, FMSTR_PIPE_PRINTF_CTX *pctx) +{ + FMSTR_CHAR c; + + pctx->flags.all = 0; + + /* skip percent sign */ + if (*format == '%') + { + format++; + } + + /* show sign always? */ + if (*format == '+') + { + pctx->flags.flg.showsign = 1U; + format++; + } + + /* prefix with zeroes? */ + if (*format == '0') + { + pctx->flags.flg.zeroes = 1U; + format++; + } + + /* parse length */ + pctx->alen = 0; + while (FMSTR_IS_DIGIT(*format)) + { + c = *format++; + c -= '0'; + pctx->alen *= 10U; + pctx->alen += (FMSTR_SIZE8)c; + } + + /* parse dtsize modifier */ + switch (*format) + { + /* short modifier (char for hh)*/ + case 'h': + pctx->dtsize = (FMSTR_U8)sizeof(short); + format++; + + /* one more 'h' means 'char' */ + if (*format == 'h') + { + pctx->dtsize = (FMSTR_U8)sizeof(char); + format++; + } + break; + + case 'l': + pctx->dtsize = (FMSTR_U8)sizeof(long); + format++; + break; + + default: + /* default data type is 'int' */ + pctx->dtsize = (FMSTR_U8)sizeof(int); + break; + } + + /* now finally concluding to format letter */ + switch (*format++) + { + /* HEXADECIMAL */ + case 'X': + pctx->flags.flg.upperc = 1U; + pctx->radix = FMSTR_PIPE_ITOAFMT_HEX; + break; + + /* hexadecimal */ + case 'x': + pctx->radix = FMSTR_PIPE_ITOAFMT_HEX; + break; + + /* octal */ + case 'o': + pctx->radix = FMSTR_PIPE_ITOAFMT_OCT; + break; + + /* binary */ + case 'b': + pctx->radix = FMSTR_PIPE_ITOAFMT_BIN; + break; + + /* decimal signed */ + case 'd': + case 'i': + pctx->flags.flg.signedtype = 1U; + pctx->radix = FMSTR_PIPE_ITOAFMT_DEC; + break; + + /* decimal unsigned */ + case 'u': + pctx->radix = FMSTR_PIPE_ITOAFMT_DEC; + break; + + /* character */ + case 'c': + pctx->radix = FMSTR_PIPE_ITOAFMT_CHAR; + pctx->dtsize = (FMSTR_U8)sizeof(char); + break; + + /* string */ + case 's': + pctx->flags.flg.isstring = 1U; + pctx->dtsize = (FMSTR_U8)sizeof(void *); + break; + + /* unknown */ + default: + FMSTR_ASSERT(0 == 1); + pctx->radix = FMSTR_PIPE_ITOAFMT_HEX; + break; + } + + return format; +} + +/****************************************************************************** + * + * @brief Printf with one argument passed by pointer. + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_PipePrintfOne(FMSTR_HPIPE pipeHandle, + const char *format, + void *parg, + FMSTR_PIPE_ITOA_FUNC pItoaFunc) +{ + FMSTR_BOOL ok = FMSTR_TRUE; + FMSTR_PIPE_PRINTF_CTX ctx; + + while (*format != (FMSTR_CHAR)0 && ok != FMSTR_FALSE) + { + if (*format == '%') + { + format++; + + if (*format == '%') + { + ok = _FMSTR_PipePrintfPutc(pipeHandle, '%'); + format++; + continue; + } + + /* empty the pipe's temporary buffer */ + ok = _FMSTR_PipePrintfFlush(pipeHandle); + + if (ok != FMSTR_FALSE) + { + format = FMSTR_PipeParseFormat(format, &ctx); + + if (ctx.flags.flg.isstring != 0U) + { + const char *psz = (const char *)parg; + ok = FMSTR_PipePuts(pipeHandle, psz != NULL ? psz : "NULL"); + } + else + { + ok = pItoaFunc(pipeHandle, parg, &ctx); + } + } + } + else + { + ok = _FMSTR_PipePrintfPutc(pipeHandle, *format++); + } + } + + if (ok != FMSTR_FALSE) + { + ok = _FMSTR_PipePrintfFlush(pipeHandle); + } + + return (FMSTR_BOOL)(ok != FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief PIPE API: Format argument into the pipe output stream. The format + * follows the standard printf format. The leading '%' is optional. + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_PipePrintfU8(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_U8 arg) +{ + return _FMSTR_PipePrintfOne(pipeHandle, format, &arg, (FMSTR_PIPE_ITOA_FUNC)FMSTR_PipeU8ToA); +} + +/****************************************************************************** + * + * @brief PIPE API: Format argument into the pipe output stream. The format + * follows the standard printf format. The leading '%' is optional. + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_PipePrintfS8(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_S8 arg) +{ + return _FMSTR_PipePrintfOne(pipeHandle, format, &arg, (FMSTR_PIPE_ITOA_FUNC)FMSTR_PipeS8ToA); +} + +/****************************************************************************** + * + * @brief PIPE API: Format argument into the pipe output stream. The format + * follows the standard printf format. The leading '%' is optional. + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_PipePrintfU16(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_U16 arg) +{ + return _FMSTR_PipePrintfOne(pipeHandle, format, &arg, (FMSTR_PIPE_ITOA_FUNC)FMSTR_PipeU16ToA); +} + +/****************************************************************************** + * + * @brief PIPE API: Format argument into the pipe output stream. The format + * follows the standard printf format. The leading '%' is optional. + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_PipePrintfS16(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_S16 arg) +{ + return _FMSTR_PipePrintfOne(pipeHandle, format, &arg, (FMSTR_PIPE_ITOA_FUNC)FMSTR_PipeS16ToA); +} + +/****************************************************************************** + * + * @brief PIPE API: Format argument into the pipe output stream. The format + * follows the standard printf format. The leading '%' is optional. + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_PipePrintfU32(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_U32 arg) +{ + return _FMSTR_PipePrintfOne(pipeHandle, format, &arg, (FMSTR_PIPE_ITOA_FUNC)FMSTR_PipeU32ToA); +} + +/****************************************************************************** + * + * @brief PIPE API: Format argument into the pipe output stream. The format + * follows the standard printf format. The leading '%' is optional. + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_PipePrintfS32(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_S32 arg) +{ + return _FMSTR_PipePrintfOne(pipeHandle, format, &arg, (FMSTR_PIPE_ITOA_FUNC)FMSTR_PipeS32ToA); +} + +/****************************************************************************** + * + * @brief Format va_list argument into the pipe output stream. This function + * is called as a part of our printf routine. + * + ******************************************************************************/ +static FMSTR_BOOL _FMSTR_PipePrintfAny(FMSTR_HPIPE pipeHandle, va_list *parg, FMSTR_PIPE_PRINTF_CTX *pctx) +{ + FMSTR_BOOL ok = FMSTR_FALSE; + + switch (pctx->dtsize) + { + case 1: + if (pctx->flags.flg.signedtype != 0U) + { + FMSTR_S8 arg = (FMSTR_S8)va_arg(*parg, int); + ok = FMSTR_PipeS8ToA(pipeHandle, &arg, pctx); + } + else + { + FMSTR_U8 arg = (FMSTR_U8)va_arg(*parg, unsigned); + ok = FMSTR_PipeU8ToA(pipeHandle, &arg, pctx); + } + break; + + case 2: + if (pctx->flags.flg.signedtype != 0U) + { + FMSTR_S16 arg = (FMSTR_S16)va_arg(*parg, int); + ok = FMSTR_PipeS16ToA(pipeHandle, &arg, pctx); + } + else + { + FMSTR_U16 arg = (FMSTR_U16)va_arg(*parg, unsigned); + ok = FMSTR_PipeU16ToA(pipeHandle, &arg, pctx); + } + break; + + case 4: + if (pctx->flags.flg.signedtype != 0U) + { + FMSTR_S32 arg = (FMSTR_S32)va_arg(*parg, long); + ok = FMSTR_PipeS32ToA(pipeHandle, &arg, pctx); + } + else + { + FMSTR_U32 arg = (FMSTR_U32)va_arg(*parg, unsigned long); + ok = FMSTR_PipeU32ToA(pipeHandle, &arg, pctx); + } + break; + + default: + ok = FMSTR_FALSE; + break; + } + + return ok; +} + +/****************************************************************************** + * + * @brief Printf with va_list arguments prepared. + * + * This function is not declared static (may be reused as global), + * but public prototype is not available (not to force user to + * have va_list defined. + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_PipePrintfV(FMSTR_HPIPE pipeHandle, const char *format, va_list *parg) +{ + FMSTR_BOOL ok = FMSTR_TRUE; + FMSTR_PIPE_PRINTF_CTX ctx; + + while (*format != (FMSTR_CHAR)0 && ok != FMSTR_FALSE) + { + if (*format == '%') + { + format++; + + if (*format == '%') + { + ok = _FMSTR_PipePrintfPutc(pipeHandle, '%'); + format++; + } + else + { + ok = _FMSTR_PipePrintfFlush(pipeHandle); + + if (ok != FMSTR_FALSE) + { + format = FMSTR_PipeParseFormat(format, &ctx); + + if (ctx.flags.flg.isstring != 0U) + { + const char *psz = va_arg(*parg, char *); + ok = FMSTR_PipePuts(pipeHandle, psz != NULL ? psz : "NULL"); + } + else + { + ok = _FMSTR_PipePrintfAny(pipeHandle, parg, &ctx); + } + } + } + } + else + { + ok = _FMSTR_PipePrintfPutc(pipeHandle, *format++); + } + } + + if (ok != FMSTR_FALSE) + { + ok = _FMSTR_PipePrintfFlush(pipeHandle); + } + + return (FMSTR_BOOL)(ok != FMSTR_FALSE); +} + +#if FMSTR_USE_PIPE_PRINTF_VARG > 0 + +/****************************************************************************** + * + * @brief PIPE API: The printf into the pipe + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_PipePrintf(FMSTR_HPIPE pipeHandle, const char *format, ...) +{ + FMSTR_BOOL ok; + + va_list args; + va_start(args, format); + ok = _FMSTR_PipePrintfV(pipeHandle, format, &args); + va_end(args); + + return ok; +} + +#endif /* FMSTR_USE_PIPE_PRINTF_VARG */ +#endif /* FMSTR_USE_PIPE_PRINTF */ + +/****************************************************************************** + * + * @brief PIPE API: Read data from a pipe + * + ******************************************************************************/ + +FMSTR_PIPE_SIZE FMSTR_PipeRead(FMSTR_HPIPE pipeHandle, + FMSTR_ADDR pipeData, + FMSTR_PIPE_SIZE pipeDataLen, + FMSTR_PIPE_SIZE readGranularity) +{ + FMSTR_PIPE *pp = (FMSTR_PIPE *)pipeHandle; + FMSTR_PIPE_BUFF *pbuff = &pp->rx; + FMSTR_PIPE_SIZE total = _FMSTR_PipeGetBytesReady(pbuff); + FMSTR_PIPE_SIZE s; + + /* when invalid address is given, only return number of bytes available */ + if (FMSTR_ADDR_VALID(pipeData) != FMSTR_FALSE) + { + /* round length to bus width */ + pipeDataLen /= FMSTR_CFG_BUS_WIDTH; + pipeDataLen *= FMSTR_CFG_BUS_WIDTH; + + /* only fetch what we have cached */ + if (pipeDataLen > total) + { + pipeDataLen = total; + } + + /* obey granularity */ + if (readGranularity > 1U) + { + pipeDataLen /= readGranularity; + pipeDataLen *= readGranularity; + } + + /* return value */ + total = pipeDataLen; + + /* rest of cyclic buffer */ + if (pipeDataLen > 0U) + { + /* total bytes available in the rest of buffer */ + s = (FMSTR_PIPE_SIZE)((pbuff->size - pbuff->rp) * FMSTR_CFG_BUS_WIDTH); + if (s > pipeDataLen) + { + s = pipeDataLen; + } + + /* put bytes */ + FMSTR_MemCpyTo(pipeData, pbuff->buff + pbuff->rp, (FMSTR_SIZE8)s); + pipeData += s / FMSTR_CFG_BUS_WIDTH; + + /* advance & wrap pointer */ + pbuff->rp += s / FMSTR_CFG_BUS_WIDTH; + if (pbuff->rp >= pbuff->size) + { + pbuff->rp = 0; + } + + /* rest of frame to a (wrapped) beggining of buffer */ + pipeDataLen -= (FMSTR_SIZE8)s; + if (pipeDataLen > 0U) + { + FMSTR_MemCpyTo(pipeData, pbuff->buff + pbuff->rp, (FMSTR_SIZE8)pipeDataLen); + pbuff->rp += pipeDataLen / FMSTR_CFG_BUS_WIDTH; + } + + /* buffer for sure not full now */ + pbuff->flags.flg.bIsFull = 0; + } + } + + return total; +} + +/****************************************************************************** + * + * @brief Find pipe by port number + * + ******************************************************************************/ + +static FMSTR_PIPE *_FMSTR_FindPipe(FMSTR_PIPE_PORT pipePort) +{ + FMSTR_PIPE *pp; + FMSTR_INDEX i; + + for (i = 0; i < (FMSTR_INDEX)FMSTR_USE_PIPES; i++) + { + pp = &pcm_pipes[i]; + + /* look for existing pipe with the same port */ + if (pp->pipePort == pipePort) + { + return pp; + } + } + + return NULL; +} + +/****************************************************************************** + * + * @brief Find pipe index by port number + * + ******************************************************************************/ + +FMSTR_INDEX FMSTR_FindPipeIndex(FMSTR_PIPE_PORT pipePort) +{ + FMSTR_PIPE *pp; + FMSTR_INDEX i; + + for (i = 0; i < (FMSTR_INDEX)FMSTR_USE_PIPES; i++) + { + pp = &pcm_pipes[i]; + + /* look for existing pipe with the same port */ + if (pp->pipePort == pipePort) + { + return i; + } + } + + return -1; +} + +/****************************************************************************** + * + * @brief Get number of bytes free in the buffer + * + ******************************************************************************/ + +static FMSTR_PIPE_SIZE _FMSTR_PipeGetBytesFree(FMSTR_PIPE_BUFF *pipeBuff) +{ + FMSTR_PIPE_SIZE szFree; + + if (pipeBuff->flags.flg.bIsFull != 0U) + { + szFree = 0; + } + else if (pipeBuff->wp < pipeBuff->rp) + { + szFree = (FMSTR_PIPE_SIZE)(pipeBuff->rp - pipeBuff->wp); + } + else + { + szFree = (FMSTR_PIPE_SIZE)(pipeBuff->size - pipeBuff->wp + pipeBuff->rp); + } + + return (FMSTR_PIPE_SIZE)(szFree * FMSTR_CFG_BUS_WIDTH); +} + +static FMSTR_PIPE_SIZE _FMSTR_PipeGetBytesReady(FMSTR_PIPE_BUFF *pipeBuff) +{ + FMSTR_PIPE_SIZE szFull; + + if (pipeBuff->flags.flg.bIsFull != 0U) + { + szFull = (FMSTR_PIPE_SIZE)pipeBuff->size; + } + else if (pipeBuff->wp >= pipeBuff->rp) + { + szFull = (FMSTR_PIPE_SIZE)(pipeBuff->wp - pipeBuff->rp); + } + else + { + szFull = (FMSTR_PIPE_SIZE)(pipeBuff->size - pipeBuff->rp + pipeBuff->wp); + } + + return (FMSTR_PIPE_SIZE)(szFull * FMSTR_CFG_BUS_WIDTH); +} + +static void _FMSTR_PipeDiscardBytes(FMSTR_PIPE_BUFF *pipeBuff, FMSTR_SIZE8 countBytes) +{ + FMSTR_PIPE_SIZE total; + FMSTR_PIPE_SIZE discard; + + total = _FMSTR_PipeGetBytesReady(pipeBuff); + discard = (FMSTR_PIPE_SIZE)(countBytes > total ? total : countBytes); + discard /= FMSTR_CFG_BUS_WIDTH; + + if (discard > 0U) + { + FMSTR_PIPE_SIZE rest = (FMSTR_PIPE_SIZE)(pipeBuff->size - pipeBuff->rp); + FMSTR_PIPE_SIZE rp; + + /* will RP wrap? */ + if (rest <= discard) + { + rp = (FMSTR_PIPE_SIZE)(discard - rest); + } + else + { + rp = (FMSTR_PIPE_SIZE)(pipeBuff->rp + discard); + } + + /* buffer is for sure not full */ + pipeBuff->flags.flg.bIsFull = 0; + pipeBuff->rp = rp; + } +} + +/* get data from frame into our Rx buffer, we are already sure it fits */ + +static FMSTR_BPTR _FMSTR_PipeReceive(FMSTR_BPTR msgBuffIO, FMSTR_PIPE *pp, FMSTR_SIZE8 msgBuffSize) +{ + FMSTR_PIPE_BUFF *pbuff = &pp->rx; + FMSTR_PIPE_SIZE s; + + if (msgBuffSize > 0U) + { + /* total bytes available in the rest of buffer */ + s = (FMSTR_PIPE_SIZE)((pbuff->size - pbuff->wp) * FMSTR_CFG_BUS_WIDTH); + if (s > (FMSTR_PIPE_SIZE)msgBuffSize) + { + s = (FMSTR_PIPE_SIZE)msgBuffSize; + } + + /* get the bytes */ + msgBuffIO = FMSTR_CopyFromBuffer(pbuff->buff + pbuff->wp, msgBuffIO, (FMSTR_SIZE8)s); + + /* advance & wrap pointer */ + pbuff->wp += s / FMSTR_CFG_BUS_WIDTH; + if (pbuff->wp >= pbuff->size) + { + pbuff->wp = 0; + } + + /* rest of frame to a (wrapped) beginning of buffer */ + msgBuffSize -= (FMSTR_SIZE8)s; + if (msgBuffSize > 0U) + { + msgBuffIO = FMSTR_CopyFromBuffer(pbuff->buff + pbuff->wp, msgBuffIO, msgBuffSize); + pbuff->wp += ((FMSTR_PIPE_SIZE)msgBuffSize) / FMSTR_CFG_BUS_WIDTH; + } + + /* buffer got full? */ + if (pbuff->wp == pbuff->rp) + { + pbuff->flags.flg.bIsFull = 1; + } + } + + return msgBuffIO; +} + +/* put data into the comm buffer, we are already sure it fits, buffer's RP is not modified */ + +static FMSTR_BPTR _FMSTR_PipeTransmit(FMSTR_BPTR msgBuffIO, FMSTR_PIPE *pp, FMSTR_SIZE8 msgBuffSize) +{ + FMSTR_PIPE_BUFF *pbuff = &pp->tx; + FMSTR_PIPE_SIZE s, rp = pbuff->rp; + + if (msgBuffSize > 0U) + { + /* total bytes available in the rest of buffer */ + s = (FMSTR_PIPE_SIZE)((pbuff->size - rp) * FMSTR_CFG_BUS_WIDTH); + if (s > (FMSTR_PIPE_SIZE)msgBuffSize) + { + s = (FMSTR_PIPE_SIZE)msgBuffSize; + } + + /* put bytes */ + msgBuffIO = FMSTR_CopyToBuffer(msgBuffIO, pbuff->buff + rp, (FMSTR_SIZE8)s); + + /* advance & wrap pointer */ + rp += s / FMSTR_CFG_BUS_WIDTH; + if (rp >= pbuff->size) + { + rp = 0; + } + + /* rest of frame to a (wrapped) beggining of buffer */ + msgBuffSize -= (FMSTR_SIZE8)s; + if (msgBuffSize > 0U) + { + msgBuffIO = FMSTR_CopyToBuffer(msgBuffIO, pbuff->buff + rp, msgBuffSize); + } + } + + return msgBuffIO; +} + +/****************************************************************************** + * + * @brief Get PIPE info + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param msgSize - size of data in buffer + * @param retStatus - response status + * + * @param msgBuffIO - original command (in) and response buffer (out) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_GetPipe(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_U8 cfgCode, pipeIndex, pipeFlags; + FMSTR_PIPE *pp; + + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(retStatus != NULL); + + /* need at least pipe index and cfgCode */ + if (msgSize < 2U) + { + /* return status */ + *retStatus = FMSTR_STC_PIPEERR; + return response; + } + + /* get Pipe flags */ + msgBuffIO = FMSTR_ValueFromBuffer8(&pipeFlags, msgBuffIO); + + /* get Pipe index */ + msgBuffIO = FMSTR_ValueFromBuffer8(&pipeIndex, msgBuffIO); + + /* get Pipe cfgCode */ + msgBuffIO = FMSTR_ValueFromBuffer8(&cfgCode, msgBuffIO); + + /* Pipe index is a port number of a pipe */ + if ((pipeFlags & FMSTR_PIPE_GETPIPE_FLAG_PORT) != 0U) + { + /* Find pipe by port number */ + pp = _FMSTR_FindPipe(pipeIndex); + if (pp == NULL) + { + /* return status */ + *retStatus = FMSTR_STC_PIPEERR; + return response; + } + } + else + { + /* Check maximum pipe index */ + if (pipeIndex >= (FMSTR_U8)FMSTR_USE_PIPES) + { + /* return status */ + *retStatus = FMSTR_STC_INSTERR; + return response; + } + + /* Get pipe from the list */ + pp = &pcm_pipes[pipeIndex]; + } + + switch (cfgCode) + { + case FMSTR_PIPE_CFGCODE_NAME: + /* Put pipe name */ + if (pp->name != NULL) + { + response = FMSTR_CopyToBuffer(response, (FMSTR_ADDR)pp->name, FMSTR_StrLen(pp->name)); + } + break; + + case FMSTR_PIPE_CFGCODE_INFO: + default: + pipeFlags = 0; + + /* Add flag isOpen, when pipe is opened (has port number) */ + if (pp->pipePort != 0U) + { + pipeFlags |= FMSTR_PIPE_GETINFO_FLAG_ISOPEN; + } + + /* Put pipe port */ + response = FMSTR_ValueToBuffer8(response, pp->pipePort); + /* Put pipe type */ + response = FMSTR_ValueToBuffer8(response, pp->type); + /* Put pipe flags */ + response = FMSTR_ValueToBuffer8(response, pipeFlags); + break; + } + + /* success */ + *retStatus = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + return response; +} + +/****************************************************************************** + * + * @brief Handling PIPE commands + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param msgSize - size of data in buffer + * @param retStatus - response status + * + * @param msgBuffIO - original command (in) and response buffer (out) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_PipeFrame(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_U8 skipLen, pipePort; + FMSTR_PIPE *pp; + + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(retStatus != NULL); + + /* need at least port number and tx-discard bytes */ + if (msgSize < 1U) + { + /* return status */ + *retStatus = FMSTR_STC_PIPEERR; + return response; + } + + /* get port number and even/odd flag */ + msgBuffIO = FMSTR_ValueFromBuffer8(&pipePort, msgBuffIO); + +#if FMSTR_SESSION_COUNT > 1 + /* Is feature locked by me */ + if (FMSTR_IsFeatureOwned(session, FMSTR_FEATURE_PIPE, (FMSTR_PIPE_PORT)(pipePort & 0x7fU)) == FMSTR_FALSE) + { + *retStatus = FMSTR_STC_SERVBUSY; + return response; + } +#endif + + /* get pipe by port */ + pp = _FMSTR_FindPipe((FMSTR_PIPE_PORT)(pipePort & 0x7fU)); + + /* pipe port must exist (i.e. be open) */ + if (pp == NULL) + { + /* return status */ + *retStatus = FMSTR_STC_PIPEERR; + return response; + } + + /* data-in are valid only in "matching" request (even to even, odd to odd) */ + if ((pipePort & 0x80U) != 0U) + { + if (pp->flags.flg.bExpectOdd == 0U) + { + msgSize = 0U; + } + else + { + pp->flags.flg.bExpectOdd = pp->flags.flg.bExpectOdd != 0U ? 0U : 1U; + } + } + else + { + if (pp->flags.flg.bExpectOdd != 0U) + { + msgSize = 0U; + } + else + { + pp->flags.flg.bExpectOdd = pp->flags.flg.bExpectOdd != 0U ? 0U : 1U; + } + } + + /* process received data */ + if (msgSize > 0U) + { + /* first byte tells me how many output bytes can be discarded from my + pipe-transmit buffer (this is how PC acknowledges how many bytes it + received and saved from the last response) */ + msgBuffIO = FMSTR_ValueFromBuffer8(&skipLen, msgBuffIO); + + /* discard bytes from pipe's transmit buffer */ + if (skipLen > 0U) + { + _FMSTR_PipeDiscardBytes(&pp->tx, skipLen); + } + + /* next come (msgSize-2) bytes to be received */ + if (msgSize > 2U) + { + /* how many bytes may I accept? */ + FMSTR_PIPE_SIZE rxFree = _FMSTR_PipeGetBytesFree(&pp->rx); + /* how many bytes PC want to push? */ + FMSTR_U8 rxToRead = (FMSTR_U8)(msgSize - 2U); + + /* round to bus width */ + rxToRead /= FMSTR_CFG_BUS_WIDTH; + rxToRead *= FMSTR_CFG_BUS_WIDTH; + + /* get the lower of the two numbers */ + if (rxFree < (FMSTR_PIPE_SIZE)rxToRead) + { + rxToRead = (FMSTR_U8)rxFree; + } + + /* get frame data */ + msgBuffIO = _FMSTR_PipeReceive(msgBuffIO, pp, rxToRead); + FMSTR_UNUSED(msgBuffIO); + + /* this is the number to be returned to PC to inform it how + many bytes it may discard in his transmit buffer */ + pp->nLastBytesReceived = rxToRead; + } + else + { + /* no bytes received */ + pp->nLastBytesReceived = 0; + } + } + + /* now call the pipe's handler, it may read or write data */ + if (pp->pCallback != NULL) + { + pp->flags.flg.bInComm = 1; + pp->pCallback((FMSTR_HPIPE)pp); + pp->flags.flg.bInComm = 0; + } + + /* now put our output data */ + { + /* how many bytes are waiting to be sent? */ + FMSTR_PIPE_SIZE txAvail = _FMSTR_PipeGetBytesReady(&pp->tx); + /* how many bytes I can safely put? */ + FMSTR_U8 txToSend = (FMSTR_U8)FMSTR_COMM_BUFFER_SIZE - 3U; + + /* round to bus width */ + txToSend /= FMSTR_CFG_BUS_WIDTH; + txToSend *= FMSTR_CFG_BUS_WIDTH; + + /* get the lower of two values */ + if (txAvail < (FMSTR_PIPE_SIZE)txToSend) + { + txToSend = (FMSTR_U8)txAvail; + } + + /* send pipe's transmit data back */ + response = FMSTR_ValueToBuffer8(response, pipePort); + + /* inform PC how many bytes it may discard from its pipe's transmit buffer */ + skipLen = pp->nLastBytesReceived; + response = FMSTR_ValueToBuffer8(response, skipLen); + + /* put data */ + if (txToSend != 0U) + { + response = _FMSTR_PipeTransmit(response, pp, txToSend); + } + } + + /* success */ + *retStatus = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + return response; +} + +#else /* FMSTR_USE_PIPES && (!FMSTR_DISABLE) */ + +/* implement void pipe-API functions */ + +FMSTR_HPIPE FMSTR_PipeOpen(FMSTR_PIPE_PORT pipePort, + FMSTR_PPIPEFUNC pipeCallback, + FMSTR_ADDR pipeRxBuff, + FMSTR_PIPE_SIZE pipeRxSize, + FMSTR_ADDR pipeTxBuff, + FMSTR_PIPE_SIZE pipeTxSize, + FMSTR_U8 type, + const FMSTR_CHAR *name) +{ + FMSTR_UNUSED(pipePort); + FMSTR_UNUSED(pipeCallback); + FMSTR_UNUSED(pipeRxBuff); + FMSTR_UNUSED(pipeRxSize); + FMSTR_UNUSED(pipeTxBuff); + FMSTR_UNUSED(pipeTxSize); + FMSTR_UNUSED(type); + FMSTR_UNUSED(name); + + return NULL; +} + +void FMSTR_PipeClose(FMSTR_HPIPE pipeHandle) +{ + FMSTR_UNUSED(pipeHandle); +} + +FMSTR_PIPE_SIZE FMSTR_PipeWrite(FMSTR_HPIPE pipeHandle, + FMSTR_ADDR pipeData, + FMSTR_PIPE_SIZE pipeDataLen, + FMSTR_PIPE_SIZE writeGranularity) +{ + FMSTR_UNUSED(pipeHandle); + FMSTR_UNUSED(pipeData); + FMSTR_UNUSED(pipeDataLen); + FMSTR_UNUSED(writeGranularity); + + return 0U; +} + +FMSTR_PIPE_SIZE FMSTR_PipeRead(FMSTR_HPIPE pipeHandle, + FMSTR_ADDR pipeData, + FMSTR_PIPE_SIZE pipeDataLen, + FMSTR_PIPE_SIZE readGranularity) +{ + FMSTR_UNUSED(pipeHandle); + FMSTR_UNUSED(pipeData); + FMSTR_UNUSED(pipeDataLen); + FMSTR_UNUSED(readGranularity); + + return 0U; +} + +/*lint -efile(766, freemaster_protocol.h) include file is not used in this case */ + +#endif /* FMSTR_USE_PIPES && (!FMSTR_DISABLE) */ + +#if FMSTR_DISABLE > 0 || FMSTR_USE_PIPES == 0 || FMSTR_USE_PIPE_PRINTF == 0 + +FMSTR_BOOL FMSTR_PipePrintfU8(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_U8 arg) +{ + FMSTR_UNUSED(pipeHandle); + FMSTR_UNUSED(format); + FMSTR_UNUSED(arg); + + return FMSTR_FALSE; +} + +FMSTR_BOOL FMSTR_PipePrintfS8(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_S8 arg) +{ + FMSTR_UNUSED(pipeHandle); + FMSTR_UNUSED(format); + FMSTR_UNUSED(arg); + + return FMSTR_FALSE; +} + +FMSTR_BOOL FMSTR_PipePrintfU16(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_U16 arg) +{ + FMSTR_UNUSED(pipeHandle); + FMSTR_UNUSED(format); + FMSTR_UNUSED(arg); + + return FMSTR_FALSE; +} + +FMSTR_BOOL FMSTR_PipePrintfS16(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_S16 arg) +{ + FMSTR_UNUSED(pipeHandle); + FMSTR_UNUSED(format); + FMSTR_UNUSED(arg); + + return FMSTR_FALSE; +} + +FMSTR_BOOL FMSTR_PipePrintfU32(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_U32 arg) +{ + FMSTR_UNUSED(pipeHandle); + FMSTR_UNUSED(format); + FMSTR_UNUSED(arg); + + return FMSTR_FALSE; +} + +FMSTR_BOOL FMSTR_PipePrintfS32(FMSTR_HPIPE pipeHandle, const char *format, FMSTR_S32 arg) +{ + FMSTR_UNUSED(pipeHandle); + FMSTR_UNUSED(format); + FMSTR_UNUSED(arg); + + return FMSTR_FALSE; +} + +#endif /* (!(FMSTR_USE_PIPES)) || (!(FMSTR_USE_PIPE_PRINTF)) */ + +#if FMSTR_DISABLE > 0 || FMSTR_USE_PIPES == 0 || FMSTR_USE_PIPE_PRINTF_VARG == 0 + +FMSTR_BOOL FMSTR_PipePrintf(FMSTR_HPIPE pipeHandle, const char *format, ...) +{ + FMSTR_UNUSED(pipeHandle); + FMSTR_UNUSED(format); + + return FMSTR_FALSE; +} + +#endif /* (!(FMSTR_USE_PIPES)) || (!(FMSTR_USE_PIPE_PRINTF_VARG)) */ diff --git a/middleware/freemaster/src/common/freemaster_private.h b/middleware/freemaster/src/common/freemaster_private.h new file mode 100644 index 0000000..74114cc --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_private.h @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - private API + */ + +#ifndef __FREEMASTER_PRIVATE_H +#define __FREEMASTER_PRIVATE_H + +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_private.h +#endif + +/****************************************************************************** + * Inline functions + ******************************************************************************/ + +/* Inline function declaration */ +#ifndef FMSTR_INLINE +#ifdef __CSMC__ /* Cosmic */ +#define FMSTR_INLINE static +#else +#define FMSTR_INLINE static inline +#endif +#endif + +/* Weak function declaration */ +#ifndef FMSTR_WEAK +#if __ICCARM && !__ICCARM_V8 +#define FMSTR_WEAK _Pragma("__weak") +#elif defined(__S12Z__) || defined(__CSMC__) +#define FMSTR_WEAK +#else +#define FMSTR_WEAK __attribute__((weak)) +#endif +#endif + +/* C99 structure member initialization */ +#if __STDC_VERSION__ >= 199901L +#define FMSTR_C99_INIT(member) .member = +#else +#define FMSTR_C99_INIT(member) +#endif + +/* Default address NULL checking as inline function for assert/MISRA compatibility */ +#ifndef FMSTR_ADDR_VALID +#define FMSTR_ADDR_VALID FMSTR_ADDR_VALID_Func +FMSTR_INLINE FMSTR_BOOL FMSTR_ADDR_VALID_Func(FMSTR_ADDR addr) +{ + /* This function will be overriden if FMSTR_ADDR is not a pointer type */ + return addr != NULL ? FMSTR_TRUE : FMSTR_FALSE; +} +#endif + +/* Default address casting as inline function for MISRA isolation */ +#ifndef FMSTR_CAST_PTR_TO_ADDR +#define FMSTR_CAST_PTR_TO_ADDR FMSTR_CAST_PTR_TO_ADDR_Func +FMSTR_INLINE FMSTR_ADDR FMSTR_CAST_PTR_TO_ADDR_Func(const void *ptr) +{ + /* MISRA exception when casting const pointer to address type */ + return (FMSTR_ADDR)ptr; +} +#endif + +/* Default address casting as inline function for MISRA isolation */ +#ifndef FMSTR_CAST_ADDR_TO_PTR +#define FMSTR_CAST_ADDR_TO_PTR FMSTR_CAST_ADDR_TO_PTR_Func +FMSTR_INLINE void *FMSTR_CAST_ADDR_TO_PTR_Func(FMSTR_ADDR addr) +{ + /* MISRA exception here */ + return (void *)addr; +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * SHA calculation + ******************************************************************************/ + + +/****************************************************************************** + * Internal data types used + ******************************************************************************/ + +#define SHA1_BLOCK_SIZE 20 + +typedef struct fmstr_sha1_ctx +{ + FMSTR_U8 data[64]; + FMSTR_U32 datalen; + FMSTR_U64 bitlen; + FMSTR_U32 state[5]; + FMSTR_U32 k[4]; +} FMSTR_SHA1_CTX; + +/* Transport protocol interface between the Protocol layer and communication subsystem */ +typedef struct FMSTR_TRANSPORT_INTF_S +{ + FMSTR_BOOL (*Init)(void); + void (*Poll)(void); + void (*SendResponse)(FMSTR_BPTR pResponse, FMSTR_SIZE nLength, FMSTR_U8 statusCode, void * identification); +} FMSTR_TRANSPORT_INTF; + +typedef struct FMSTR_SESSION_S +{ + void * identification; /* Identification for transport (address/socket/...) */ + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + struct + { + /* Salt challenge value used between AUTH1 and AUTH2 steps of password authentication. */ + FMSTR_U8 authSalt[FMSTR_AUTHENT_PRTCL_SHA1_SALT_LEN]; + /* Currently granted access (one of FMSTR_RESTRICTED_ACCESS_xxx). */ + FMSTR_U8 grantedAccess; + FMSTR_U8 accessKey[SHA1_BLOCK_SIZE]; + FMSTR_U8 localKey[SHA1_BLOCK_SIZE]; + } restr; /* Restricted access */ +#endif/* FMSTR_CFG_F1_RESTRICTED_ACCESS */ + +} FMSTR_SESSION; + +/* There are multiple global instances of different transports. User selects one in + the application configuration file (or defines it indirectly by macros like + FMSTR_USE_UART). */ + +extern const FMSTR_TRANSPORT_INTF FMSTR_TRANSPORT; + +/****************************************************************************** + * Feature locking API + ******************************************************************************/ + +#if FMSTR_SESSION_COUNT > 1 +FMSTR_BOOL FMSTR_IsFeatureOwned(FMSTR_SESSION * session, FMSTR_U8 featureType, FMSTR_U8 instance); +#endif + +/****************************************************************************** + * Global non-API functions (used internally in FreeMASTER driver) + ******************************************************************************/ + +void FMSTR_FreeSession(void * identification); + +void FMSTR_SendResponse(FMSTR_BPTR response, FMSTR_SIZE length, FMSTR_U8 statusCode, FMSTR_SESSION * session); +FMSTR_BOOL FMSTR_ProtocolDecoder(FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 cmdCode, void * identification); +FMSTR_BOOL FMSTR_SendTestFrame(FMSTR_BPTR msgBuffIO, FMSTR_SESSION * session); + +#if FMSTR_USE_APPCMD > 0 +FMSTR_BOOL FMSTR_InitAppCmds(void); +FMSTR_BPTR FMSTR_StoreAppCmd(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 *retStatus); +FMSTR_BPTR FMSTR_GetAppCmdStatus(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +FMSTR_BPTR FMSTR_GetAppCmdRespData(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +#endif + +#if FMSTR_USE_SCOPE > 0 +FMSTR_BOOL FMSTR_InitScope(void); +FMSTR_BPTR FMSTR_SetScope(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE inputLen, FMSTR_U8 *retStatus); +FMSTR_BPTR FMSTR_ReadScope(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus, FMSTR_SIZE maxOutSize); +#endif + +#if FMSTR_USE_RECORDER > 0 +FMSTR_BOOL FMSTR_InitRec(void); +FMSTR_BPTR FMSTR_SetRecCmd(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE inputLen, FMSTR_U8 *retStatus); +FMSTR_BPTR FMSTR_GetRecCmd(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +FMSTR_BOOL FMSTR_IsInRecBuffer(FMSTR_ADDR addr, FMSTR_SIZE size); +#endif + +#if FMSTR_USE_TSA > 0 +FMSTR_BOOL FMSTR_InitTsa(void); +FMSTR_BPTR FMSTR_GetTsaInfo(FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +FMSTR_BPTR FMSTR_GetStringLen(FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +FMSTR_BOOL FMSTR_CheckTsaSpace(FMSTR_ADDR varAddr, FMSTR_SIZE varSize, FMSTR_BOOL writeAccess); +FMSTR_BPTR FMSTR_UresControl(FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 *retStatus); +#endif + +#if FMSTR_USE_PIPES > 0 +FMSTR_BOOL FMSTR_InitPipes(void); +FMSTR_BPTR FMSTR_PipeFrame(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 *retStatus); +FMSTR_BPTR FMSTR_GetPipe(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 *retStatus); +FMSTR_INDEX FMSTR_FindPipeIndex(FMSTR_PIPE_PORT pipePort); +#endif + +void FMSTR_Sha1Init(FMSTR_SHA1_CTX *ctx); +void FMSTR_Sha1Update(FMSTR_SHA1_CTX *ctx, const FMSTR_U8 *data, FMSTR_SIZE len); +void FMSTR_Sha1Final(FMSTR_SHA1_CTX *ctx, FMSTR_U8 *hash); + +/****************************************************************************** + * aligned memory and buffer memory operations + ******************************************************************************/ + +void FMSTR_MemCpyTo(FMSTR_ADDR destAddr, FMSTR_ADDR srcAddr, FMSTR_SIZE size); +void FMSTR_MemCpyFrom(FMSTR_ADDR destAddr, FMSTR_ADDR srcAddr, FMSTR_SIZE size); +void FMSTR_MemCpyToMasked(FMSTR_ADDR destAddr, FMSTR_ADDR srcAddr, FMSTR_ADDR maskAddr, FMSTR_SIZE size); + +FMSTR_BPTR FMSTR_CopyToBuffer(FMSTR_BPTR destBuff, FMSTR_ADDR srcAddr, FMSTR_SIZE size); +FMSTR_BPTR FMSTR_CopyFromBuffer(FMSTR_ADDR destAddr, FMSTR_BPTR srcBuff, FMSTR_SIZE size); +void FMSTR_CopyFromBufferWithMask(FMSTR_ADDR destAddr, FMSTR_BPTR srcBuff, FMSTR_SIZE size); + +#define FMSTR_ValueFromBuffer8(dest, src) \ + ((*((FMSTR_U8 *)(dest)) = *(FMSTR_U8 *)(src)), (FMSTR_BPTR)(((FMSTR_BPTR)(src)) + 1)) + +#define FMSTR_ValueToBuffer8(dest, src) \ + ((*((FMSTR_U8 *)(dest)) = (FMSTR_U8)(src)), (FMSTR_BPTR)(((FMSTR_BPTR)(dest)) + 1)) + +#define FMSTR_SkipInBuffer(dest, size) ((FMSTR_BPTR)(((FMSTR_BPTR)(dest)) + (size))) + +FMSTR_BPTR FMSTR_ValueFromBuffer16BE(FMSTR_U16 *pnum, FMSTR_BPTR src); +FMSTR_BPTR FMSTR_ValueToBuffer16BE(FMSTR_BPTR dest, FMSTR_U16 num); +FMSTR_BPTR FMSTR_AddressFromBuffer(FMSTR_ADDR *paddr, FMSTR_BPTR src); +FMSTR_BPTR FMSTR_AddressToBuffer(FMSTR_BPTR dest, FMSTR_ADDR addr); +FMSTR_BPTR FMSTR_SizeFromBuffer(FMSTR_SIZE *psize, FMSTR_BPTR src); +FMSTR_BPTR FMSTR_SizeToBuffer(FMSTR_BPTR dest, FMSTR_SIZE size); +FMSTR_BPTR FMSTR_IndexFromBuffer(FMSTR_INDEX *pindex, FMSTR_BPTR src); +FMSTR_BPTR FMSTR_ULebToBuffer(FMSTR_BPTR dest, FMSTR_U32 num); +FMSTR_BPTR FMSTR_ULebFromBuffer(FMSTR_U32 *pnum, FMSTR_BPTR src); +FMSTR_SIZE FMSTR_GetAlignmentCorrection(FMSTR_ADDR addr, FMSTR_SIZE size); + +/****************************************************************************** + * aligned memory and buffer memory operations + ******************************************************************************/ + +#define FMSTR_GetS8(addr) (*(FMSTR_S8 *)(addr)) +#define FMSTR_GetU8(addr) (*(FMSTR_U8 *)(addr)) +#define FMSTR_GetS16(addr) (*(FMSTR_S16 *)(addr)) +#define FMSTR_GetU16(addr) (*(FMSTR_U16 *)(addr)) +#define FMSTR_GetS32(addr) (*(FMSTR_S32 *)(addr)) +#define FMSTR_GetU32(addr) (*(FMSTR_U32 *)(addr)) +#define FMSTR_GetS64(addr) (*(FMSTR_S64 *)(addr)) +#define FMSTR_GetU64(addr) (*(FMSTR_U64 *)(addr)) + +#if FMSTR_REC_FLOAT_TRIG > 0 +#define FMSTR_GetFloat(addr) (*(FMSTR_FLOAT *)(addr)) +#define FMSTR_GetDouble(addr) (*(FMSTR_DOUBLE *)(addr)) +#endif + +#ifdef __cplusplus +} +#endif + +/**************************************************************************************** + * Potentially unused variable declaration + *****************************************************************************************/ + +#if defined(_lint) || defined(__IAR_SYSTEMS_ICC__) || defined(__ARMCC_VERSION) +#define FMSTR_UNUSED(sym) (void)(sym) +#elif defined(__GNUC__) +#define FMSTR_UNUSED(sym) (void)(sym) +#else +#define FMSTR_UNUSED(sym) ((sym), 0) +#endif + +/**************************************************************************************** + * Potentially unused variable declaration + *****************************************************************************************/ + +/** Get count of elements in a static array. */ +#define FMSTR_COUNTOF(arr) (sizeof(arr) / sizeof(arr[0])) + +/**************************************************************************************** + * Configuration checking + *****************************************************************************************/ + +/* obsolete transport and driver macros */ +#if defined(FMSTR_USE_PDBDM) +#warning Obsolete configuration option detected. Define FMSTR_TRANSPORT as FMSTR_PDBDM instead. +#endif + +#if (FMSTR_LONG_INTR && (FMSTR_SHORT_INTR || FMSTR_POLL_DRIVEN)) || \ + (FMSTR_SHORT_INTR && (FMSTR_LONG_INTR || FMSTR_POLL_DRIVEN)) || \ + (FMSTR_POLL_DRIVEN && (FMSTR_LONG_INTR || FMSTR_SHORT_INTR)) || \ + !(FMSTR_POLL_DRIVEN || FMSTR_LONG_INTR || FMSTR_SHORT_INTR) +/* mismatch in interrupt modes, only one can be selected */ +#error You have to enable exctly one of FMSTR_LONG_INTR or FMSTR_SHORT_INTR or FMSTR_POLL_DRIVEN +#endif + +/* check scope settings */ +#if FMSTR_USE_SCOPE > 0 +#if FMSTR_MAX_SCOPE_VARS > 32 || FMSTR_MAX_SCOPE_VARS < 2 +#error Error in FMSTR_MAX_SCOPE_VARS value. Use a value in range 2..32 +#endif +#endif + +/* check recorder settings */ +#if FMSTR_USE_RECORDER > 0 +#if FMSTR_USE_READMEM == 0 +#error Recorder needs the FMSTR_USE_READMEM feature +#endif + +#if defined(FMSTR_REC_OWNBUFF) +#warning The FMSTR_REC_OWNBUFF is obsolete. Use FMSTR_REC_BUFF_SIZE for Recorder 0 and/or FMSTR_RecorderCreate for other Recorders. +#endif +#endif + +#if FMSTR_USE_TSA > 0 +#if FMSTR_USE_READMEM == 0 +#error TSA needs the FMSTR_USE_READMEM feature +#endif +#endif + +#if FMSTR_USE_PIPES > 0 + +#if defined(FMSTR_PIPES_EXPERIMENTAL) +#warning The "pipes" feature is now in experimental code phase. Not yet tested on this platform. +#endif + +/* must enable printf for vararg printf */ +#if FMSTR_USE_PIPE_PRINTF == 0 && FMSTR_USE_PIPE_PRINTF_VARG > 0 +#error You must enable pipe printf for vararg printf (see FMSTR_USE_PIPE_PRINTF) +#endif + +/* printf buffer should accept one integer printed */ +#if FMSTR_PIPES_PRINTF_BUFF_SIZE < 8 +#error Pipe printf buffer should be at least 8 (see FMSTR_PIPES_PRINTF_BUFF_SIZE) +#endif +#if FMSTR_PIPES_PRINTF_BUFF_SIZE > 255 +#error Pipe printf buffer should not exceed 255 (see FMSTR_PIPES_PRINTF_BUFF_SIZE) +#endif + +/* obsolete configuration options */ +#if defined(FMSTR_MAX_PIPES_COUNT) +#warning The FMSTR_MAX_PIPES_COUNT option is obsolete. Specify number of used pipes as FMSTR_USE_PIPES +#endif + +#endif + +#if FMSTR_DEBUG_TX > 0 +/* When communication debugging mode is requested, this global variable is used to + turn the debugging off once a valid connection is detected */ +extern FMSTR_BOOL fmstr_doDebugTx; +#endif + +/* maximum data item width in bytes when performing optimized/aligned memory copy */ +#ifndef FMSTR_MEMCPY_MAX_SIZE +/* 32-bit transfers maximum by default */ +#define FMSTR_MEMCPY_MAX_SIZE 4 +#endif + +#endif /* __FREEMASTER_PRIVATE_H */ diff --git a/middleware/freemaster/src/common/freemaster_protocol.c b/middleware/freemaster/src/common/freemaster_protocol.c new file mode 100644 index 0000000..cff7a19 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_protocol.c @@ -0,0 +1,1218 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - protocol implementation + */ + +#include "freemaster.h" +#include "freemaster_private.h" +#include "freemaster_protocol.h" +#include "freemaster_utils.h" + +#if FMSTR_DISABLE == 0 + +/* When using sessions, calculate number of instances of each lockable feature as U8 type */ +#if FMSTR_SESSION_COUNT > 1 + +#if FMSTR_USE_SCOPE > 0 +#define _FMSTR_SC ((FMSTR_U8)(FMSTR_USE_SCOPE)) +#else +#define _FMSTR_SC 0U +#endif + +#if FMSTR_USE_RECORDER > 0 +#define _FMSTR_RC ((FMSTR_U8)(FMSTR_USE_RECORDER)) +#else +#define _FMSTR_RC 0U +#endif + +#if FMSTR_USE_PIPES > 0 +#define _FMSTR_PC ((FMSTR_U8)(FMSTR_USE_PIPES)) +#else +#define _FMSTR_PC 0U +#endif + +#if FMSTR_USE_APPCMD > 0 +#define _FMSTR_AC 1U /* All app commands make up one instance, if enabled */ +#else +#define _FMSTR_AC 0U +#endif + +#define _FMSTR_FPG 1U /* Flash programmer is a lockable software feature. Always enabled */ + +/* Macros to convert instance to an index in one large fature locking array */ + +#define FMSTR_FEATURE_SCOPE_INSTANCE(n) ((FMSTR_U8)(n)) +#define FMSTR_FEATURE_REC_INSTANCE(n) ((FMSTR_U8)(_FMSTR_SC + (FMSTR_U8)(n))) +#define FMSTR_FEATURE_APPCMD_INSTANCE(n) ((FMSTR_U8)(_FMSTR_SC + _FMSTR_RC + 0U)) +#define FMSTR_FEATURE_FLASHPROG_INSTANCE(n) ((FMSTR_U8)(_FMSTR_SC + _FMSTR_RC + _FMSTR_AC + 0U)) +#define FMSTR_FEATURE_PIPE_INSTANCE(n) ((FMSTR_U8)(_FMSTR_SC + _FMSTR_RC + _FMSTR_AC + _FMSTR_FPG + (FMSTR_U8)(n))) +#define FMSTR_FEATURE_LOCK_COUNT ((FMSTR_U8)(_FMSTR_SC + _FMSTR_RC + _FMSTR_AC + _FMSTR_FPG + _FMSTR_PC)) + +typedef struct +{ + FMSTR_SESSION *owner; /* Session which locks feature */ + FMSTR_S32 lockCount; /* Locked count */ +} FMSTR_FEATURE_LOCK; +#endif + +/****************************************************************************** + * Local Functions + ******************************************************************************/ + +/* The functions are local, but not declared "static" to prevent linker warnings + when features are excluded from protocol. */ +const FMSTR_CHAR *_FMSTR_GetAccessPassword(FMSTR_U8 requiredAccess); +FMSTR_BPTR _FMSTR_GetBoardConfig(FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +FMSTR_BPTR _FMSTR_AuthenticationStep1(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +FMSTR_BPTR _FMSTR_AuthenticationStep2(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +FMSTR_BPTR _FMSTR_ReadMem(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +FMSTR_BPTR _FMSTR_ReadMemBaseAddress(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +FMSTR_BPTR _FMSTR_WriteMem(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); + +static FMSTR_SESSION *_FMSTR_FindSession(void *identification, FMSTR_BOOL create); + +#if FMSTR_SESSION_COUNT > 1 +static FMSTR_BPTR _FMSTR_FeatureLock(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus); +#endif +/****************************************************************************** + * Local variables + ******************************************************************************/ + +/* Protocol sessions */ +static FMSTR_SESSION fmstr_sessions[FMSTR_SESSION_COUNT]; + +#if FMSTR_SESSION_COUNT > 1 +/* Features */ +static FMSTR_FEATURE_LOCK fmstr_features[FMSTR_FEATURE_LOCK_COUNT]; +#endif + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 +/* To save stack usage, we have the following SHA context variables static, although + * they could be local in Auth2 function. */ +static FMSTR_SHA1_CTX fmstr_sha1Ctx; +/* Currently granted access (one of FMSTR_RESTRICTED_ACCESS_xxx). */ +static FMSTR_U8 fmstr_dfltGrantedAccess; +#endif /* FMSTR_CFG_F1_RESTRICTED_ACCESS */ + +#if FMSTR_DEBUG_TX > 0 +/* This warning is for you not to forget to disable the DEBUG_TX mode once the + * communication line works fine. You can ignore this warning if it is okay + * that the application will be periodically sending test frames to the world. */ +#warning FMSTR_DEBUG_TX is enabled. Test frames will be transmitted periodically. +/* When communication debugging mode is requested, this global variable is used to + turn the debugging off once a valid connection is detected */ +FMSTR_BOOL fmstr_doDebugTx; +#endif + +/****************************************************************************** + * + * @brief FreeMASTER driver initialization + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_Init(void) +{ + FMSTR_BOOL ok = FMSTR_TRUE; + + FMSTR_MemSet(&fmstr_sessions, 0, sizeof(fmstr_sessions)); + +#if FMSTR_SESSION_COUNT > 1 + FMSTR_MemSet(&fmstr_features, 0, sizeof(fmstr_features)); +#endif + +#if FMSTR_DEBUG_LEVEL >= 1 + FMSTR_DEBUG_PRINTF("FMSTR Init begins\n"); +#endif + + /* Check the transport interface validity */ + FMSTR_ASSERT_RETURN(FMSTR_TRANSPORT.Init != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_TRANSPORT.Poll != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_TRANSPORT.SendResponse != NULL, FMSTR_FALSE); + +#if FMSTR_USE_TSA > 0 + /* initialize TSA */ + if (FMSTR_InitTsa() == FMSTR_FALSE) + { + ok = FMSTR_FALSE; + } +#endif + +#if FMSTR_USE_SCOPE > 0 + /* initialize Scope */ + if (FMSTR_InitScope() == FMSTR_FALSE) + { + ok = FMSTR_FALSE; + } +#endif + +#if FMSTR_USE_RECORDER > 0 + /* initialize Recorder */ + if (FMSTR_InitRec() == FMSTR_FALSE) + { + ok = FMSTR_FALSE; + } +#endif + +#if FMSTR_USE_APPCMD > 0 + /* initialize application commands */ + if (FMSTR_InitAppCmds() == FMSTR_FALSE) + { + ok = FMSTR_FALSE; + } +#endif + +#if FMSTR_USE_PIPES > 0 + /* initialize PIPES interface */ + if (FMSTR_InitPipes() == FMSTR_FALSE) + { + ok = FMSTR_FALSE; + } +#endif + + /* initialize communication layer and start listening for commands */ + if (FMSTR_TRANSPORT.Init() == FMSTR_FALSE) + { + ok = FMSTR_FALSE; + } + +#if FMSTR_DEBUG_TX > 0 + /* start in the debugging mode, we will be sending test frames periodically */ + fmstr_doDebugTx = FMSTR_TRUE; +#endif + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + fmstr_dfltGrantedAccess = FMSTR_RESTRICTED_ACCESS_NO; + /* set the access level to the highest "open" level (the one without a password) */ + for (FMSTR_U8 access = FMSTR_RESTRICTED_ACCESS_R; access <= FMSTR_RESTRICTED_ACCESS_RWF; access++) + { + if (_FMSTR_GetAccessPassword(access) != NULL) + { + break; /* this level (and all levels above) are protected by a password */ + } + else + { + fmstr_dfltGrantedAccess = access; + } + } +#endif + +#if FMSTR_DEBUG_LEVEL >= 1 + FMSTR_DEBUG_PRINTF("FMSTR Init finished, ok=%d\n", (int)ok); +#endif + + return ok; +} + +/******************************************************************************* + * + * @brief API: Main "Polling" call from the application main loop + * + * This function either handles all the communication (polling-only mode = + * FMSTR_POLL_DRIVEN) or decodes messages received on the background by SCI interrupt + * (short-interrupt mode = FMSTR_SHORT_INTR). + * + * + *******************************************************************************/ + +void FMSTR_Poll(void) +{ + /* Increase entropy in each poll round */ +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + static FMSTR_U8 e = 0x7U; + FMSTR_Randomize(e); + e += 13U; +#endif + + FMSTR_TRANSPORT.Poll(); +} + +/****************************************************************************** + * + * @brief Finalize transmit buffer before transmitting + * + * @param length - response length + * + * + * This Function takes the data already prepared in the transmit buffer + * (inlcuding the status byte). It computes the check sum and kicks on tx. + * + ******************************************************************************/ + +void FMSTR_SendResponse(FMSTR_BPTR response, FMSTR_SIZE length, FMSTR_U8 statusCode, FMSTR_SESSION *session) +{ + /* Allow NULL session only if sessions count is 1, use the first (single) session as default. */ + if (session == NULL) + { +#if FMSTR_SESSION_COUNT == 1 + session = &fmstr_sessions[0]; +#else + /* You must specify session when multiple sessions are supported */ + FMSTR_ASSERT(FMSTR_FALSE); + return; +#endif + } + +#if FMSTR_DEBUG_LEVEL >= 2 + FMSTR_DEBUG_PRINTF("FMSTR SendResponse Status: 0x%x, Len: 0x%x\n", statusCode, length); +#endif + + FMSTR_TRANSPORT.SendResponse(response, length, statusCode, session->identification); +} + +/****************************************************************************** + * + * @brief Decodes the FreeMASTER protocol and calls appropriate handlers + * + * @param msgBuffIO - message in/out buffer + * @param identification - transport identification + * + * @return TRUE if frame was valid and any output was generated to IO buffer + * + * This Function decodes given message and invokes proper command handler + * which fills in the response. The response transmission is initiated + * in this call as well. + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_ProtocolDecoder(FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 cmdCode, void *identification) +{ + FMSTR_BPTR responseEnd = msgBuffIO; + FMSTR_U8 statusCode = FMSTR_STS_INVALID; + FMSTR_SESSION *activeSession = NULL; + +#if FMSTR_DEBUG_LEVEL >= 2 + FMSTR_DEBUG_PRINTF("FMSTR ProtocolDecoder Cmd: 0x%x, Len: 0x%x\n", cmdCode, msgSize); +#endif + + /* Find session (or free) and create it for this identification */ + activeSession = _FMSTR_FindSession(identification, FMSTR_TRUE); + + FMSTR_ASSERT_RETURN(activeSession != NULL, FMSTR_FALSE); + + /* process command */ + switch (cmdCode) + { + /* retrieve board configuration value*/ + case FMSTR_CMD_GETCONFIG: + responseEnd = _FMSTR_GetBoardConfig(msgBuffIO, &statusCode); + break; + +#if FMSTR_USE_READMEM > 0 + /* read a block of memory */ + case FMSTR_CMD_READMEM: + responseEnd = _FMSTR_ReadMem(activeSession, msgBuffIO, &statusCode); + break; + +#ifdef FMSTR_PLATFORM_BASE_ADDRESS + /* read a block of memory with base address*/ + case FMSTR_CMD_READMEM_BA: + responseEnd = _FMSTR_ReadMemBaseAddress(activeSession, msgBuffIO, &statusCode); + break; +#endif + +#endif /* FMSTR_USE_READMEM */ + +#if FMSTR_USE_WRITEMEM > 0 + /* write a block of memory */ + case FMSTR_CMD_WRITEMEM: + responseEnd = _FMSTR_WriteMem(activeSession, msgBuffIO, &statusCode); + break; +#endif /* FMSTR_USE_WRITEMEM */ + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + /* Initiate password authentication, request authentication challenge */ + case FMSTR_CMD_AUTH1: + responseEnd = _FMSTR_AuthenticationStep1(activeSession, msgBuffIO, &statusCode); + break; + + /* Initiate password authentication, request authentication challenge */ + case FMSTR_CMD_AUTH2: + responseEnd = _FMSTR_AuthenticationStep2(activeSession, msgBuffIO, &statusCode); + break; +#endif + +#if FMSTR_USE_PIPES > 0 + case FMSTR_CMD_GETPIPE: + responseEnd = FMSTR_GetPipe(activeSession, msgBuffIO, msgSize, &statusCode); + break; + case FMSTR_CMD_PIPE: + responseEnd = FMSTR_PipeFrame(activeSession, msgBuffIO, msgSize, &statusCode); + break; +#endif /* FMSTR_USE_PIPES */ + +#if FMSTR_USE_TSA > 0 + /* get TSA table (force EX instead of non-EX) */ + case FMSTR_CMD_GETTSAINFO: + responseEnd = FMSTR_GetTsaInfo(msgBuffIO, &statusCode); + break; + + case FMSTR_CMD_GETSTRLEN: + responseEnd = FMSTR_GetStringLen(msgBuffIO, &statusCode); + break; + + case FMSTR_CMD_URESRWI: + responseEnd = FMSTR_UresControl(msgBuffIO, msgSize, &statusCode); + break; +#endif /* FMSTR_USE_TSA */ + +#if FMSTR_USE_APPCMD > 0 + /* accept the application command */ + case FMSTR_CMD_SENDAPPCMD: + responseEnd = FMSTR_StoreAppCmd(activeSession, msgBuffIO, msgSize, &statusCode); + break; + + /* get the application command status */ + case FMSTR_CMD_GETAPPCMDSTS: + responseEnd = FMSTR_GetAppCmdStatus(activeSession, msgBuffIO, &statusCode); + break; + + /* get the application command data */ + case FMSTR_CMD_GETAPPCMDDATA: + responseEnd = FMSTR_GetAppCmdRespData(activeSession, msgBuffIO, &statusCode); + break; +#endif /* FMSTR_USE_APPCMD */ + +#if FMSTR_USE_RECORDER > 0 + /* get recorder data */ + case FMSTR_CMD_GETREC: + responseEnd = FMSTR_GetRecCmd(activeSession, msgBuffIO, &statusCode); + break; + + /* setup recorder */ + case FMSTR_CMD_SETREC: + responseEnd = FMSTR_SetRecCmd(activeSession, msgBuffIO, msgSize, &statusCode); + break; +#endif /* FMSTR_USE_RECORDER */ + +#if FMSTR_USE_SCOPE > 0 + /* prepare scope variables */ + case FMSTR_CMD_SETSCOPE: + responseEnd = FMSTR_SetScope(activeSession, msgBuffIO, msgSize, &statusCode); + break; + + case FMSTR_CMD_READSCOPE: + responseEnd = FMSTR_ReadScope(activeSession, msgBuffIO, &statusCode, FMSTR_COMM_BUFFER_SIZE); + break; +#endif /* FMSTR_USE_SCOPE */ + +#if FMSTR_SESSION_COUNT > 1 + /* Lock or unlock feature in a multi-session configuration */ + case FMSTR_CMD_FEATLOCK: + responseEnd = _FMSTR_FeatureLock(activeSession, msgBuffIO, &statusCode); + break; +#endif /* FMSTR_SESSION_COUNT > 1 */ + + /* unknown command */ + default: + statusCode = FMSTR_STC_INVCMD; + break; + } + + /* anything to send back? */ + if (statusCode != FMSTR_STS_INVALID) + { + /*lint -e{946,960} subtracting pointers is appropriate here */ + FMSTR_INDEX ptrDiff = (FMSTR_INDEX)(responseEnd - msgBuffIO); + FMSTR_SIZE respSize = (FMSTR_SIZE)ptrDiff; + + /* Non-variable length error responses are forced to 0 length */ + if ((statusCode & (FMSTR_STSF_VARLEN | FMSTR_STSF_ERROR)) == FMSTR_STSF_ERROR) + { + respSize = 0; + } + +#if FMSTR_DEBUG_TX > 0 + /* the first sane frame received from PC Host ends test frame sending */ + fmstr_doDebugTx = FMSTR_FALSE; +#endif + FMSTR_SendResponse(msgBuffIO, respSize, statusCode, activeSession); + return FMSTR_TRUE; + } + else + { + /* nothing sent out */ + return FMSTR_FALSE; + } +} + +/****************************************************************************** + * + * @brief Sending debug test frame + * + * @param msgBuffIO - outut frame buffer + * @param session - transport session + * + * @return True if successful (always in current implementation) + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_SendTestFrame(FMSTR_BPTR msgBuffIO, FMSTR_SESSION *session) +{ + FMSTR_SendResponse(msgBuffIO, 0, FMSTR_STC_DEBUGTX_TEST, session); + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Handling GETINFO or GETINFO_BRIEF + * + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response data payload is finished + * + ******************************************************************************/ + +FMSTR_BPTR _FMSTR_GetBoardConfig(FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + static const FMSTR_CHAR *const fmstr_cfgParamNames[] = { + "MTU", "VS", "NM", "DS", "BD", "F1", "BA", "RC", "SC", "PV", "PC", + }; + + FMSTR_BPTR response = msgBuffIO; + FMSTR_U8 respCode = FMSTR_STS_INVALID; + FMSTR_CHAR str[4]; + FMSTR_INDEX ix = 0; + + /* Get the IX from incomming buffer */ + msgBuffIO = FMSTR_IndexFromBuffer(&ix, msgBuffIO); + + if (ix == 0) + { + FMSTR_INDEX i; + /* Get the configuration name from incomming buffer */ + msgBuffIO = FMSTR_StringFromBuffer(msgBuffIO, str, sizeof(str)); + + /* Try to find the Index of the config item */ + for (i = 0; i < (FMSTR_INDEX)FMSTR_COUNTOF(fmstr_cfgParamNames); i++) + { + if (FMSTR_StrCmp(fmstr_cfgParamNames[i], str) == 0) + { + ix = i + 1; + break; + } + } + + if (ix == 0) + { + respCode = FMSTR_STC_EACCESS; + goto FMSTR_GetConfig_exit; + } + } + + respCode = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + response = FMSTR_StringCopyToBuffer(response, fmstr_cfgParamNames[ix - 1]); + + /* The ix must corresponded to table fmstr_cfgParamNames incremented by one */ + switch (ix) + { + case 1: /* MTU */ + response = FMSTR_SizeToBuffer(response, FMSTR_COMM_BUFFER_SIZE); + break; + case 2: /* VS */ + response = FMSTR_StringCopyToBuffer(response, FMSTR_VERSION_STR); + break; + case 3: /* NM */ + response = FMSTR_StringCopyToBuffer(response, FMSTR_APPLICATION_STR); + break; + case 4: /* DS */ + response = FMSTR_StringCopyToBuffer(response, FMSTR_DESCRIPTION_STR); + break; + case 5: /* BD */ + response = FMSTR_StringCopyToBuffer(response, FMSTR_BUILDTIME_STR); + break; + case 6: /* F1 */ + response = FMSTR_ValueToBuffer8(response, FMSTR_CFG_F1); + break; +#ifdef FMSTR_PLATFORM_BASE_ADDRESS + case 7: /* BA */ + response = FMSTR_SizeToBuffer(response, FMSTR_PLATFORM_BASE_ADDRESS); + break; +#endif + case 8: /* RC */ + response = FMSTR_ValueToBuffer8(response, FMSTR_USE_RECORDER); + break; + case 9: /* SC */ + response = FMSTR_ValueToBuffer8(response, FMSTR_USE_SCOPE); + break; + case 10: /* PV */ + response = FMSTR_ValueToBuffer8(response, FMSTR_PRCTL_VER); + break; + case 11: /* PC */ + response = FMSTR_ValueToBuffer8(response, FMSTR_USE_PIPES); + break; + default: + respCode = FMSTR_STC_EACCESS; + break; + } + +FMSTR_GetConfig_exit: + *retStatus = respCode; + + return response; +} + +/* Helper call to obtain password required for certain access level. */ + +const FMSTR_CHAR *_FMSTR_GetAccessPassword(FMSTR_U8 requiredAccess) +{ + const FMSTR_CHAR *password = NULL; + +#if defined(FMSTR_RESTRICTED_ACCESS_R_PASSWORD) + if (requiredAccess >= FMSTR_RESTRICTED_ACCESS_R) + { + password = (FMSTR_CHAR *)FMSTR_RESTRICTED_ACCESS_R_PASSWORD; + } +#endif + +#if defined(FMSTR_RESTRICTED_ACCESS_RW_PASSWORD) + if (requiredAccess >= FMSTR_RESTRICTED_ACCESS_RW) + { + password = (FMSTR_CHAR *)FMSTR_RESTRICTED_ACCESS_RW_PASSWORD; + } +#endif + +#if defined(FMSTR_RESTRICTED_ACCESS_RWF_PASSWORD) + if (requiredAccess >= FMSTR_RESTRICTED_ACCESS_RWF) + { + password = (FMSTR_CHAR *)FMSTR_RESTRICTED_ACCESS_RWF_PASSWORD; + } +#endif + + /* password remains NULL if requested level and any lower level are unprotected */ + return password; +} + +/****************************************************************************** + * + * @brief Handling FMSTR_CMD_AUTH1 command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response data payload is finished + * + ******************************************************************************/ + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + +FMSTR_BPTR _FMSTR_AuthenticationStep1(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_U8 reqAccess = 0; + + FMSTR_ASSERT(session != NULL); + + /* Get the Required access from incomming buffer */ + msgBuffIO = FMSTR_ValueFromBuffer8(&reqAccess, msgBuffIO); + + /* success */ + *retStatus = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + + /* Check if password is needed for requested access. When logging-out, the client sends 0 as requested level. */ + if (reqAccess == 0U || _FMSTR_GetAccessPassword(reqAccess) == NULL) + { + /* no password is required, access is granted, we do not require the step 2 */ + session->restr.grantedAccess = reqAccess; + + FMSTR_FreeSession(session); + + return FMSTR_ValueToBuffer8(response, 0U); + } + + /* ULEB-encoded algorithm ID */ + response = FMSTR_SizeToBuffer(response, FMSTR_AUTHENT_PRTCL_SHA1); + + /* Generate random salt and store it to local buffer for later use with FMSTR_AuthenticationM2 handler. */ + (void)FMSTR_RandomNumbersToBuffer(session->restr.authSalt, sizeof(session->restr.authSalt)); + return FMSTR_CopyToBuffer(response, session->restr.authSalt, sizeof(session->restr.authSalt)); +} + +#endif /* FMSTR_CFG_F1_RESTRICTED_ACCESS */ + +/****************************************************************************** + * + * @brief Handling FMSTR_CMD_AUTH2 command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response data payload is finished + * + ******************************************************************************/ + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + +FMSTR_BPTR _FMSTR_AuthenticationStep2(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_U8 reqAccess = 0; + FMSTR_U8 access; + const FMSTR_CHAR *pass; + + /* Get the Required access from incomming buffer */ + msgBuffIO = FMSTR_ValueFromBuffer8(&reqAccess, msgBuffIO); + + /* Get access key provided by client */ + msgBuffIO = FMSTR_CopyFromBuffer(session->restr.accessKey, msgBuffIO, sizeof(session->restr.accessKey)); + FMSTR_UNUSED(msgBuffIO); + + /* Evaluate all levels (from 3..1) */ + for (access = FMSTR_RESTRICTED_ACCESS_RWF; access >= FMSTR_RESTRICTED_ACCESS_R; access--) + { + if ((pass = _FMSTR_GetAccessPassword(access)) == NULL) + { + break; /* this access level and all lower levels are open (can be granted) */ + } + +#if FMSTR_USE_HASHED_PASSWORDS > 0 + /* Password is already hashed */ + FMSTR_MemCpyFrom(fmstr_localKey, (FMSTR_ADDR)pass, sizeof(fmstr_localKey)); +#else + /* Password was provided as a string, compute SHA1 hash now */ + FMSTR_MemSet(session->restr.localKey, 0, sizeof(session->restr.localKey)); + FMSTR_Sha1Init(&fmstr_sha1Ctx); + FMSTR_Sha1Update(&fmstr_sha1Ctx, (const FMSTR_U8 *)pass, FMSTR_StrLen(pass)); + FMSTR_Sha1Final(&fmstr_sha1Ctx, session->restr.localKey); +#endif + + /* compute correct key as SHA1(salt + SHA1(password) + salt) */ + FMSTR_Sha1Init(&fmstr_sha1Ctx); + FMSTR_Sha1Update(&fmstr_sha1Ctx, session->restr.authSalt, sizeof(session->restr.authSalt)); + FMSTR_Sha1Update(&fmstr_sha1Ctx, session->restr.localKey, sizeof(session->restr.localKey)); + FMSTR_Sha1Update(&fmstr_sha1Ctx, session->restr.authSalt, sizeof(session->restr.authSalt)); + FMSTR_Sha1Final(&fmstr_sha1Ctx, session->restr.localKey); + + /* is access key valid? (i.e. is client's password valid?) */ + if (FMSTR_MemCmp(session->restr.localKey, session->restr.accessKey, sizeof(session->restr.localKey)) == 0) + { + break; + } + } + + /* Here, the access is the maximum level which is possible to grant with the password provided */ + + /* Do not grant higher level than requested */ + session->restr.grantedAccess = access <= reqAccess ? access : reqAccess; + + /* Return success if at least some access level has been granted. Or when user was only validating the password with + * level=0. */ + if (access != 0U || reqAccess == 0U) + { + *retStatus = FMSTR_STS_OK; + response = FMSTR_ValueToBuffer8(response, session->restr.grantedAccess); + } + else + { + *retStatus = FMSTR_STC_EPASS; + } + + return response; +} + +#endif /* FMSTR_CFG_F1_RESTRICTED_ACCESS */ + +/****************************************************************************** + * + * @brief Handling READMEM command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response data payload is finished + * + ******************************************************************************/ + +FMSTR_BPTR _FMSTR_ReadMem(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_ADDR addr; + FMSTR_SIZE size; + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + if (session->restr.grantedAccess < FMSTR_RESTRICTED_ACCESS_R) + { + *retStatus = FMSTR_STC_EAUTH; + return response; + } +#endif + + /* Get the Address from incomming buffer */ + msgBuffIO = FMSTR_AddressFromBuffer(&addr, msgBuffIO); + /* Get the Size from incomming buffer */ + msgBuffIO = FMSTR_SizeFromBuffer(&size, msgBuffIO); + +#if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY + if (FMSTR_CheckTsaSpace(addr, size, FMSTR_FALSE) == FMSTR_FALSE) + { + *retStatus = FMSTR_STC_EACCESS; + return response; + } +#endif + + /* check the response will safely fit into comm buffer */ + if (size > (FMSTR_U16)FMSTR_COMM_BUFFER_SIZE) + { + *retStatus = FMSTR_STC_RSPBUFFOVF; + return response; + } + + /* success */ + *retStatus = FMSTR_STS_OK; + return FMSTR_CopyToBuffer(response, addr, size); +} + +/****************************************************************************** + * + * @brief Handling READMEM command with base address + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response data payload is finished + * + ******************************************************************************/ + +#ifdef FMSTR_PLATFORM_BASE_ADDRESS + +FMSTR_BPTR _FMSTR_ReadMemBaseAddress(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_ADDR addr; + FMSTR_SIZE size; + FMSTR_INDEX index; + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + if (session->restr.grantedAccess < FMSTR_RESTRICTED_ACCESS_R) + { + *retStatus = FMSTR_STC_EAUTH; + return response; + } +#endif + + /* Get the Relative address to base from incoming buffer */ + msgBuffIO = FMSTR_IndexFromBuffer(&index, msgBuffIO); + /* Get the Size from incomming buffer */ + msgBuffIO = FMSTR_SizeFromBuffer(&size, msgBuffIO); + + addr = (FMSTR_ADDR)(FMSTR_PLATFORM_BASE_ADDRESS + index); + +#if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY + if (FMSTR_CheckTsaSpace(addr, size, FMSTR_FALSE) == FMSTR_FALSE) + { + *retStatus = FMSTR_STC_EACCESS; + return response; + } +#endif + + /* check the response will safely fit into comm buffer */ + if (size > (FMSTR_U16)FMSTR_COMM_BUFFER_SIZE) + { + *retStatus = FMSTR_STC_RSPBUFFOVF; + return response; + } + + /* success */ + *retStatus = FMSTR_STS_OK; + return FMSTR_CopyToBuffer(response, addr, size); +} +#endif /* FMSTR_PLATFORM_BASE_ADDRESS */ + +/****************************************************************************** + * + * @brief Handling WRITEMEM and WRITEMEM_EX commands + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response data payload is finished + * + ******************************************************************************/ + +FMSTR_BPTR _FMSTR_WriteMem(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_ADDR addr; + FMSTR_SIZE size; + FMSTR_U8 respCode, flags; + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + if (session->restr.grantedAccess < FMSTR_RESTRICTED_ACCESS_RW) + { + *retStatus = FMSTR_STC_EAUTH; + return response; + } +#endif + + /* Get the Flags from incomming buffer */ + msgBuffIO = FMSTR_ValueFromBuffer8(&flags, msgBuffIO); + /* Get the Address from incomming buffer */ + msgBuffIO = FMSTR_AddressFromBuffer(&addr, msgBuffIO); + /* Get the Size from incomming buffer */ + msgBuffIO = FMSTR_SizeFromBuffer(&size, msgBuffIO); + +#if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY + if (FMSTR_CheckTsaSpace(addr, size, FMSTR_TRUE) == FMSTR_FALSE) + { + respCode = FMSTR_STC_EACCESS; + goto FMSTR_WriteMem_exit; + } +#endif + + // TODO Add flash write support FLAG FMSTR_WRMFLAG_WRFLASH + + /*lint -e{534} ignoring function return value */ + if ((flags & FMSTR_WRMFLAG_WITHMASK) != 0U) + { + FMSTR_CopyFromBufferWithMask(addr, msgBuffIO, size); + } + else + { + msgBuffIO = FMSTR_CopyFromBuffer(addr, msgBuffIO, size); + FMSTR_UNUSED(msgBuffIO); + } + + respCode = FMSTR_STS_OK; + +#if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY +FMSTR_WriteMem_exit: +#endif + + *retStatus = respCode; + + return response; +} + +#if FMSTR_SESSION_COUNT > 1 +/****************************************************************************** + * + * @brief Get feature structure from the static array of features + * + * @param featureType - feature type + * @param instance - instance number of the selected feature + * + * @return Selected feature struct + * + ******************************************************************************/ + +static FMSTR_FEATURE_LOCK *_FMSTR_FeatureGet(FMSTR_U8 featureType, FMSTR_U8 instance) +{ + FMSTR_INDEX index = -1; + + switch (featureType) + { +#if FMSTR_USE_SCOPE > 0 + case FMSTR_FEATURE_SCOPE: + if (instance < _FMSTR_SC) + { + index = (FMSTR_INDEX)FMSTR_FEATURE_SCOPE_INSTANCE(instance); + } + break; +#endif + +#if FMSTR_USE_RECORDER > 0 + case FMSTR_FEATURE_REC: + if (instance < _FMSTR_RC) + { + index = (FMSTR_INDEX)FMSTR_FEATURE_REC_INSTANCE(instance); + } + break; +#endif + +#if FMSTR_USE_APPCMD > 0 + case FMSTR_FEATURE_APPCMD: + if (instance < _FMSTR_AC) + { + index = (FMSTR_INDEX)FMSTR_FEATURE_APPCMD_INSTANCE(instance); + } + break; +#endif + + case FMSTR_FEATURE_FLASHPROG: + if (instance < _FMSTR_FPG) + { + index = (FMSTR_INDEX)FMSTR_FEATURE_FLASHPROG_INSTANCE(instance); + } + break; + +#if FMSTR_USE_PIPES > 0 + case FMSTR_FEATURE_PIPE: + { + FMSTR_INDEX pipeIndex = FMSTR_FindPipeIndex(instance); + if (pipeIndex < (FMSTR_INDEX)_FMSTR_PC) + { + index = (FMSTR_INDEX)FMSTR_FEATURE_PIPE_INSTANCE(pipeIndex); + } + } + break; +#endif + + default: + index = -1; + break; + } + + /* Check max size */ + if (index < 0 || index > (FMSTR_INDEX)FMSTR_FEATURE_LOCK_COUNT) + { + return NULL; + } + + return &fmstr_features[index]; +} + +/****************************************************************************** + * + * @brief Lock or unlock feature in a multi-session configuration + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response data payload is finished + * + ******************************************************************************/ + +static FMSTR_BPTR _FMSTR_FeatureLock(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_FEATURE_LOCK *feature = NULL; + FMSTR_U8 featType = 0; + FMSTR_U8 instance = 0; + FMSTR_U8 lock = 0; + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + if (session->restr.grantedAccess < FMSTR_RESTRICTED_ACCESS_R) + { + *retStatus = FMSTR_STC_EAUTH; + return response; + } +#endif + + /* Get the Feature Type from incomming buffer */ + msgBuffIO = FMSTR_ValueFromBuffer8(&featType, msgBuffIO); + /* Get the Instance from incomming buffer */ + msgBuffIO = FMSTR_ValueFromBuffer8(&instance, msgBuffIO); + /* Get the Lock/Unlock from incomming buffer */ + msgBuffIO = FMSTR_ValueFromBuffer8(&lock, msgBuffIO); + + /* Get feature struct */ + feature = _FMSTR_FeatureGet(featType, instance); + if (feature == NULL) + { + /* Invalid instance */ + *retStatus = FMSTR_STC_EINSTANCE; + return response; + } + + /* Check locked session */ + if (feature->lockCount > 0 && feature->owner != session) + { + /* Feature is locked by another session */ + *retStatus = FMSTR_STC_SERVBUSY; + return response; + } + + /* Lock */ + if (lock != 0U) + { + feature->lockCount++; + feature->owner = session; + } + /* Unlock */ + else + { + if (feature->lockCount > 0) + { + feature->lockCount--; + } + if (feature->lockCount == 0) + { + feature->owner = NULL; + } + } + + *retStatus = FMSTR_STS_OK; + + return response; +} + +/****************************************************************************** + * + * @brief Unlock all features, which is owned by session + * + * @param session - transport session + * + ******************************************************************************/ + +static void _FMSTR_UnlockFeatures(FMSTR_SESSION *session) +{ + FMSTR_FEATURE_LOCK *feature = NULL; + FMSTR_U8 i; + + for (i = 0; i < FMSTR_FEATURE_LOCK_COUNT; i++) + { + feature = &fmstr_features[i]; + if (feature->owner == session) + { + feature->lockCount = 0; + feature->owner = NULL; + } + } +} + +/****************************************************************************** + * + * @brief Check if feature is locked for the owner (session) + * + * @param session - transport session + * @param featureType - feature type + * @param instance - instance number of the selected feature + * + * @return locked state + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_IsFeatureOwned(FMSTR_SESSION *session, FMSTR_U8 featureType, FMSTR_U8 instance) +{ + FMSTR_FEATURE_LOCK *feature = NULL; + + /* Get feature struct */ + feature = _FMSTR_FeatureGet(featureType, instance); + if (feature == NULL) + { + return FMSTR_FALSE; + } + + if (feature->owner == session && feature->lockCount > 0) + { + return FMSTR_TRUE; + } + + return FMSTR_FALSE; +} +#endif /* FMSTR_SESSION_COUNT > 1 */ + +/****************************************************************************** + * + * @brief Free transport session + * + * @param identification - transport identification + * + ******************************************************************************/ + +void FMSTR_FreeSession(void *identification) +{ + FMSTR_SESSION *ses = _FMSTR_FindSession(identification, FMSTR_FALSE); + if (ses != NULL && ses->identification == identification) + { +#if FMSTR_SESSION_COUNT > 1 + /* Unlock all features, which is owned by session */ + _FMSTR_UnlockFeatures(ses); +#endif + + FMSTR_MemSet(ses, 0, sizeof(FMSTR_SESSION)); + } +} + +/****************************************************************************** + * + * @brief Find transport session by transport identification + * + * @param identification - transport identification + * @param create - when true, creates session with transport identification + * + * @return Found/created session. + * + ******************************************************************************/ + +static FMSTR_SESSION *_FMSTR_FindSession(void *identification, FMSTR_BOOL create) +{ + FMSTR_SESSION *ses; + FMSTR_SESSION *freeSession = NULL; + FMSTR_INDEX i; + + for (i = 0; i < FMSTR_SESSION_COUNT; i++) + { + ses = &fmstr_sessions[i]; + + /* Find session by identification */ + if (ses->identification == identification) + { + return ses; + } + + /* Find free session */ + if (freeSession == NULL && ses->identification == NULL) + { + freeSession = ses; + } + } + + /* Set identification to session */ + if (freeSession != NULL && create != FMSTR_FALSE) + { + freeSession->identification = identification; + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + /* Initialize the access protection variables */ + FMSTR_MemSet(freeSession->restr.authSalt, 0xaa, sizeof(freeSession->restr.authSalt)); + freeSession->restr.grantedAccess = fmstr_dfltGrantedAccess; +#endif + } + + return freeSession; +} + +#else /* !FMSTR_DISABLE */ + +/****************************************************************************** + * + * @brief FreeMASTER driver initialization is disabled + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_Init(void) +{ + return FMSTR_FALSE; +} + +/******************************************************************************* + * + * @brief API: Main "Polling" call from the application main loop + * + *******************************************************************************/ + +void FMSTR_Poll(void) +{ +} + +#endif /* !FMSTR_DISABLE */ diff --git a/middleware/freemaster/src/common/freemaster_protocol.h b/middleware/freemaster/src/common/freemaster_protocol.h new file mode 100644 index 0000000..0494ae2 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_protocol.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - protocol declarations + */ + +#ifndef __FREEMASTER_PROTOCOL_H +#define __FREEMASTER_PROTOCOL_H + +/*------------------------------------- + command message - standard commands + -------------------------------------*/ +#define FMSTR_CMD_GETCONFIG 0x20U +#define FMSTR_CMD_READMEM 0x21U +#define FMSTR_CMD_READMEM_BA 0x22U +#define FMSTR_CMD_WRITEMEM 0x23U +#define FMSTR_CMD_SETREC 0x24U /* Setup the recorder */ +#define FMSTR_CMD_GETREC 0x25U /* Get the recorder status/data etc. */ +#define FMSTR_CMD_SETSCOPE 0x26U /* Configure Scope */ +#define FMSTR_CMD_READSCOPE 0x27U /* Read the scope data */ +#define FMSTR_CMD_PIPE 0x28U +#define FMSTR_CMD_GETTSAINFO 0x29U +#define FMSTR_CMD_GETSTRLEN 0x2AU +#define FMSTR_CMD_AUTH1 0x2CU +#define FMSTR_CMD_AUTH2 0x2DU +#define FMSTR_CMD_URESRWI 0x2EU /* User Resource Read/Write/IOctl */ +#define FMSTR_CMD_GETPIPE 0x2FU /* Get information about pipe */ +#define FMSTR_CMD_SENDAPPCMD 0x30U /* send the application command */ +#define FMSTR_CMD_GETAPPCMDSTS 0x31U /* get the application command status */ +#define FMSTR_CMD_GETAPPCMDDATA 0x32U /* get the application command data */ +#define FMSTR_CMD_FEATLOCK 0x33U /* Lock or unlock feature in a multi-session configuration */ + +/* special transport-specific commands */ +#define FMSTR_CANSPC_PING 0xC0U +#define FMSTR_NET_PING 0xC0U +#define FMSTR_NET_DISCOVERY 0xC1U + +/*------------------------------------- + response message - status byte + -------------------------------------*/ + +/* flags in response codes */ +#define FMSTR_STSF_ERROR 0x80U /* FLAG: error answer (no response data) */ +#define FMSTR_STSF_VARLEN 0x40U /* FLAG: variable-length answer (length byte) */ +#define FMSTR_STSF_EVENT 0x20U /* FLAG: reserved */ + +#define FMSTR_STS_INVALID 0xFFU /* Invalid status code - just for internal use, not used in communication */ + +/* confirmation codes */ +#define FMSTR_STS_OK 0x00U /* operation finished successfully */ + +/* error codes */ +#define FMSTR_STC_INVCMD 0x81U /* unknown command code */ +#define FMSTR_STC_CMDCSERR 0x82U /* command checksum error */ +#define FMSTR_STC_CMDTOOLONG 0x83U /* command is too long */ +#define FMSTR_STC_RSPBUFFOVF 0x84U /* the response would not fit into transmit buffer */ +#define FMSTR_STC_INVBUFF 0x85U /* invalid buffer length or operation */ +#define FMSTR_STC_INVSIZE 0x86U /* invalid size specified */ +#define FMSTR_STC_SERVBUSY 0x87U /* service is busy */ +#define FMSTR_STC_NOTINIT 0x88U /* service is not initialized */ +#define FMSTR_STC_EACCESS 0x89U /* access is denied */ +#define FMSTR_STC_SFIOERR 0x8AU /* Error in SFIO frame */ +#define FMSTR_STC_SFIOUNMATCH 0x8BU /* Even/odd mismatch in SFIO transaction */ +#define FMSTR_STC_PIPEERR 0x8CU /* Pipe error */ +#define FMSTR_STC_FASTRECERR 0x8DU /* Feature not implemented in Fast Recorder */ +#define FMSTR_STC_CANTGLERR 0x8EU /* CAN fragmentation (toggle bit) error */ +#define FMSTR_STC_CANMSGERR 0x8FU /* CAN message format error */ +#define FMSTR_STC_FLOATDISABLED 0x90U /* Floating point triggering is not enabled */ +#define FMSTR_STC_EAUTH 0x91U /* Password authentication is required */ +#define FMSTR_STC_EPASS 0x92U /* Password invalid */ +#define FMSTR_STC_URESERR 0x93U /* User resources error */ +#define FMSTR_STC_INSTERR 0x94U /* Bad instance index (e.g. recorder) */ +#define FMSTR_STC_INVOPCODE 0x95U /* Invalid operation code (e.g. recorder) */ +#define FMSTR_STC_EINSTANCE 0x96U /* Invalid instance number (e.g. recorder) */ +#define FMSTR_STC_DEBUGTX_TEST 0xA9U /* Artificial +@W test frame sent when DEBUG_TX is enabled */ + +/****************************************************************************** + * Protocol constants + *******************************************************************************/ + +#define FMSTR_PRCTL_VER 0x04 /* Protocol version */ +#define FMSTR_SOB 0x2bU /* '+' - start of message*/ +#define FMSTR_DESCR_SIZE 25U /* length board desription string */ + +/* TSA-global flags */ +#define FMSTR_TSA_INFO_VERSION_MASK 0x0fU /* TSA version */ +#define FMSTR_TSA_INFO_SIZE_MASK 0x30U /* Address information */ +#define FMSTR_TSA_INFO_ADRSIZE_16 0x00U /* Address information: 16 bit entries */ +#define FMSTR_TSA_INFO_ADRSIZE_32 0x10U /* Address information: 32 bit entries */ +#define FMSTR_TSA_INFO_ADRSIZE_64 0x20U /* Address information: 64 bit entries */ +#define FMSTR_TSA_INFO_HV2BA 0x80U /* TSA HawkV2 byte-addressing mode */ + +/* Write command flags */ +#define FMSTR_WRMFLAG_WITHMASK 0x01U /* Used when Write memory command writes with Mask. */ +#define FMSTR_WRMFLAG_WRFLASH 0x80U /* Used when Wrie memory command knowingly writing to flash. */ + +/****************************************************************************** + * CAN Protocol constants + *******************************************************************************/ + +/* control byte (the first byte in each CAN message) */ +#define FMSTR_CANCTL_TGL 0x80U /* toggle bit, first message clear, then toggles */ +#define FMSTR_CANCTL_M2S 0x40U /* master to slave direction */ +#define FMSTR_CANCTL_FST 0x20U /* first CAN message of FreeMASTER packet */ +#define FMSTR_CANCTL_LST 0x10U /* last CAN message of FreeMASTER packet */ +#define FMSTR_CANCTL_SPC 0x08U /* special command (in data[1], handled by CAN sublayer (no FM protocol decode) */ +#define FMSTR_CANCTL_LEN_MASK 0x07U /* number of data bytes after the CTL byte (0..7) */ + +/****************************************************************************** + * Feature constants + *******************************************************************************/ + +/* Feature ID */ +#define FMSTR_FEATURE_SCOPE 0x01 +#define FMSTR_FEATURE_REC 0x02 +#define FMSTR_FEATURE_APPCMD 0x03 +#define FMSTR_FEATURE_FLASHPROG 0x04 +#define FMSTR_FEATURE_SFIO 0x05 +#define FMSTR_FEATURE_PIPE 0x06 + +#endif /* __FREEMASTER_PROTOCOL_H */ diff --git a/middleware/freemaster/src/common/freemaster_rec.c b/middleware/freemaster/src/common/freemaster_rec.c new file mode 100644 index 0000000..caa64a0 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_rec.c @@ -0,0 +1,1550 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Recorder implementation + */ + +#include "freemaster.h" +#include "freemaster_private.h" +#include "freemaster_protocol.h" +#include "freemaster_utils.h" + +#if FMSTR_USE_RECORDER > 0 && FMSTR_DISABLE == 0 + +#include "freemaster_rec.h" + +/******************************************************** + * local macros definition + ********************************************************/ + +/* Define Protocol operations*/ +#define FMSTR_REC_PRTCLSET_OP_CFGMEM 0x01U /* Set number of recorder variables, points and post-trigger */ +#define FMSTR_REC_PRTCLSET_OP_CFGVAR 0x02U /* Setup address, size, and threshold detection of one recorder variable */ +#define FMSTR_REC_PRTCLSET_OP_START 0x03U /* Start recorder if not yet running */ +#define FMSTR_REC_PRTCLSET_OP_STOP 0x04U /* Stop recorder immediately */ + +#define FMSTR_REC_PRTCLGET_OP_DESCR 0x81U /* String description of recorder sampling point etc. */ +#define FMSTR_REC_PRTCLGET_OP_LIMITS 0x82U /* Get maximum number of recorder variables, and size of the recorder memory. */ +#define FMSTR_REC_PRTCLGET_OP_INFO 0x83U /* Get recorder base address, number of recorded variables, and other info. */ +#define FMSTR_REC_PRTCLGET_OP_STATUS 0x84U /* Get current recorder status (running/stopped etc.) */ + +/* recorder structures alignment */ +#ifndef FMSTR_REC_STRUCT_ALIGN +#define FMSTR_REC_STRUCT_ALIGN sizeof(void *) +#endif + +/******************************************************** + * local types definition + ********************************************************/ + +/* Forward declaration of needed structures */ +struct FMSTR_REC_VAR_DATA_S; + +/* trigger threshold level (1,2,4 or 8 bytes) */ +typedef union +{ + FMSTR_U8 raw[8]; + FMSTR_U8 u8; + FMSTR_S8 s8; + FMSTR_U16 u16; + FMSTR_S16 s16; + FMSTR_U32 u32; + FMSTR_S32 s32; + FMSTR_U64 u64; + FMSTR_S64 s64; +#if FMSTR_REC_FLOAT_TRIG > 0 + FMSTR_FLOAT fp; + FMSTR_DOUBLE dbl; +#endif +} FMSTR_REC_THRESHOLD; + +/* recorder runtime flags */ +typedef volatile union +{ + FMSTR_FLAGS all; /* all flags in one field */ + + struct + { + unsigned isConfigured : 1; /* recorder is configured */ + unsigned hasData : 1; /* cleared when configured, set when at least one point is sampled */ + unsigned isRunning : 1; /* recorder is running */ + unsigned isVirginCycle : 1; /* virgin cycle of the circular buffer in-progress */ + unsigned isStopping : 1; /* trigger activated, sample countdown */ + } flg; + +} FMSTR_REC_FLAGS; + +/* compare functions prototype */ +typedef FMSTR_BOOL (*FMSTR_PCOMPAREFUNC)(struct FMSTR_REC_VAR_DATA_S *varData); + +/* Recorder internal description of one variable */ +typedef struct FMSTR_REC_VAR_DATA_S +{ + FMSTR_REC_VAR cfg; /* variable configuration */ + FMSTR_REC_THRESHOLD thresholdVal; /* trigger threshold value if used */ + FMSTR_PCOMPAREFUNC compareFunc; /* pointer to trigger compare function if used */ + FMSTR_BOOL trgLastState; /* last trigger comparison state for edge detection if used */ +} FMSTR_REC_VAR_DATA; + +/* runtime variables */ +typedef struct +{ + FMSTR_REC_VAR_DATA *varDescr; /* table with recorder variables description. */ + FMSTR_ADDR buffAddr; /* Address of buffer for recorded variables. */ + FMSTR_SIZE buffSize; /* Size of buffer for recorded variables. */ + FMSTR_SIZE totalSmplsCnt; /* recorder total samples count */ + FMSTR_SIZE timeDivCtr; /* recorder "clock" divisor counter */ + FMSTR_SIZE postTrigger; /* post-trigger value computed from user's pre-trigger */ + FMSTR_SIZE stopRecCountDown; /* post-trigger countdown counter */ + FMSTR_ADDR writePtr; /* write pointer in recorder buffer */ + FMSTR_ADDR endBuffPtr; /* pointer to end of active recorder buffer */ + FMSTR_SIZE pointSize; /* size of one variable shot */ + FMSTR_SIZE pointVarCount; /* number of variables recorded (trigger-only vars excluded) */ + FMSTR_REC_FLAGS flags; /* recorder flags */ + FMSTR_REC_CFG config; /* original recorder configuration */ +} FMSTR_REC; + +/* Map of FreeMASTER recorder instance in memory */ +/*********************************************/ +/*********************************************/ +/** FMSTR_REC **/ +/** ************************************** **/ +/** * FMSTR_REC_CFG * **/ +/** * * **/ +/** * * **/ +/** ************************************** **/ +/** **/ +/*********************************************/ +/** **/ +/** FMSTR_REC_VAR_DATA - arrays **/ +/** **/ +/*********************************************/ +/** **/ +/** **/ +/** **/ +/** FreeMASTER recorder samples buffer **/ +/** **/ +/** **/ +/** **/ +/*********************************************/ + +/******************************************************** + * local static functions declarations + ********************************************************/ + +static FMSTR_REC_BUFF *_FMSTR_GetRecorderBufferByRecIx(FMSTR_INDEX recIndex); +static FMSTR_REC *_FMSTR_GetRecorderByRecIx(FMSTR_INDEX recIndex); + +static FMSTR_U8 _FMSTR_CheckConfiguration(FMSTR_REC *recorder); +static FMSTR_U8 _FMSTR_RecMemCfg(FMSTR_REC *recorder, FMSTR_INDEX recIndex, FMSTR_REC_CFG *recCfg); +static FMSTR_U8 _FMSTR_RecVarCfg(FMSTR_REC *recorder, FMSTR_INDEX recVarIx, FMSTR_REC_VAR *recVarCfg); + +static FMSTR_U8 _FMSTR_StartRec(FMSTR_REC *recorder); +static FMSTR_U8 _FMSTR_TriggerRec(FMSTR_REC *recorder); +static FMSTR_U8 _FMSTR_AbortRec(FMSTR_REC *recorder); + +static FMSTR_BPTR _FMSTR_SetRecCmd_CFGMEM( + FMSTR_BPTR msgBuffIO, FMSTR_SIZE opLen, FMSTR_REC *recorder, FMSTR_INDEX recIndex, FMSTR_U8 *retStatus); +static FMSTR_BPTR _FMSTR_SetRecCmd_CFGVAR(FMSTR_BPTR msgBuffIO, + FMSTR_SIZE opLen, + FMSTR_REC *recorder, + FMSTR_U8 *retStatus); + +static FMSTR_BOOL _FMSTR_RecIsValidVarSize(FMSTR_SIZE size); +static FMSTR_U8 _FMSTR_CalcRecStatus(FMSTR_REC_FLAGS recFlags); + +static FMSTR_BOOL _FMSTR_Compare8S(FMSTR_REC_VAR_DATA *varData); +static FMSTR_BOOL _FMSTR_Compare8U(FMSTR_REC_VAR_DATA *varData); +static FMSTR_BOOL _FMSTR_Compare16S(FMSTR_REC_VAR_DATA *varData); +static FMSTR_BOOL _FMSTR_Compare16U(FMSTR_REC_VAR_DATA *varData); +static FMSTR_BOOL _FMSTR_Compare32S(FMSTR_REC_VAR_DATA *varData); +static FMSTR_BOOL _FMSTR_Compare32U(FMSTR_REC_VAR_DATA *varData); +static FMSTR_BOOL _FMSTR_Compare64S(FMSTR_REC_VAR_DATA *varData); +static FMSTR_BOOL _FMSTR_Compare64U(FMSTR_REC_VAR_DATA *varData); +#if FMSTR_REC_FLOAT_TRIG > 0 +static FMSTR_BOOL _FMSTR_CompareFloat(FMSTR_REC_VAR_DATA *varData); +static FMSTR_BOOL _FMSTR_CompareDouble(FMSTR_REC_VAR_DATA *varData); +#endif + +static void _FMSTR_Recorder2(FMSTR_REC *recorder); + +/******************************************************** + * static variables + ********************************************************/ + +/* Recorder buffers */ +static FMSTR_REC_BUFF fmstr_recBuffs[FMSTR_USE_RECORDER]; + +#if FMSTR_REC_BUFF_SIZE > 0 +/* statically allocated recorder buffer */ +static FMSTR_U8 fmstr_pOwnRecBuffer[FMSTR_REC_BUFF_SIZE]; +#endif + +/****************************************************************************** + * + * @brief Recorder Initialization + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_InitRec(void) +{ + FMSTR_BOOL ok = FMSTR_TRUE; + +#if FMSTR_REC_BUFF_SIZE > 0 + FMSTR_REC_BUFF recBuffCfg; +#endif + + /* Initialize array of recorder buffers descriptors */ + FMSTR_MemSet(fmstr_recBuffs, 0, sizeof(fmstr_recBuffs)); + +#if FMSTR_REC_BUFF_SIZE > 0 + /* When FMSTR_REC_BUFF_SIZE is defined, create the default buffer */ + recBuffCfg.addr = (FMSTR_ADDR)fmstr_pOwnRecBuffer; + recBuffCfg.size = FMSTR_REC_BUFF_SIZE; + recBuffCfg.name = "Default Recorder"; + recBuffCfg.basePeriod_ns = FMSTR_REC_TIMEBASE; + + /* and create the recorder #0 automatically */ + ok = FMSTR_RecorderCreate(0, &recBuffCfg); +#endif + + return ok; +} + +/****************************************************************************** + * + * @brief API: Set up the recorder buffer + * + * @param recIndex - index of recorder to set up + * @param recBuffer - user buffer pointer + * @param recBuffSize - buffer size + * + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_RecorderCreate(FMSTR_INDEX recIndex, FMSTR_REC_BUFF *buffCfg) +{ + FMSTR_REC_BUFF *recBuff; + FMSTR_SIZE alignment; + + /* Check the input parameters */ + if (recIndex >= (FMSTR_INDEX)FMSTR_USE_RECORDER) + { + return FMSTR_FALSE; + } + + FMSTR_ASSERT_RETURN(buffCfg != NULL, FMSTR_FALSE); + + if (buffCfg->addr == NULL) + { + return FMSTR_FALSE; + } + + /* Check for some minimal value of buffer */ + if (buffCfg->size < (sizeof(FMSTR_REC) + 128U)) + { + return FMSTR_FALSE; + } + + /* Check that the name is already included */ + if (buffCfg->name == NULL) + { + return FMSTR_FALSE; + } + + if ((recBuff = _FMSTR_GetRecorderBufferByRecIx(recIndex)) == NULL) + { + return FMSTR_FALSE; + } + + /* The buffer should not yet be used */ + if (FMSTR_ADDR_VALID(recBuff->addr) != FMSTR_FALSE) + { + return FMSTR_FALSE; + } + + /* Set up the recorder buffer */ + *recBuff = *buffCfg; + + /* Clean up the buffer */ + FMSTR_MemSet(recBuff->addr, 0, recBuff->size); + + /* Align buffer base address */ + alignment = FMSTR_GetAlignmentCorrection(recBuff->addr, FMSTR_REC_STRUCT_ALIGN); + recBuff->addr += alignment; + recBuff->size -= alignment; + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief API: Change the recorder time base information. + * + * @param recIndex - index of recorder + * @param timeBase_ns - new time base to be assigned to recorder, in nanoseconds + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_RecorderSetTimeBase(FMSTR_INDEX recIndex, FMSTR_U32 timeBase_ns) +{ + FMSTR_REC_BUFF *recBuff; + + FMSTR_ASSERT_RETURN(recIndex < (FMSTR_INDEX)FMSTR_USE_RECORDER, FMSTR_FALSE); + + recBuff = _FMSTR_GetRecorderBufferByRecIx(recIndex); + FMSTR_ASSERT_RETURN(recBuff != NULL, FMSTR_FALSE); + + recBuff->basePeriod_ns = timeBase_ns; + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief API: Set up the recorder configuration + * + * @param recIndex - index of recorder + * @param recCfg - pointer to recorder configuration + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_RecorderConfigure(FMSTR_INDEX recIndex, FMSTR_REC_CFG *recCfg) +{ + FMSTR_REC *recorder; + + FMSTR_ASSERT_RETURN(recIndex < (FMSTR_INDEX)FMSTR_USE_RECORDER, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(recCfg != NULL, FMSTR_FALSE); + + if ((recorder = _FMSTR_GetRecorderByRecIx(recIndex)) == NULL) + { + return FMSTR_FALSE; + } + + return (FMSTR_BOOL)((_FMSTR_RecMemCfg(recorder, recIndex, recCfg) == FMSTR_STS_OK) ? FMSTR_TRUE : FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief Set up the recorder configuration (internal version) + * + * @param recorder - recorder structure + * @param recCfg - recorder configuration + * + * @return FMSTR_STC_xxx status code + * + ******************************************************************************/ + +static FMSTR_U8 _FMSTR_RecMemCfg(FMSTR_REC *recorder, FMSTR_INDEX recIndex, FMSTR_REC_CFG *recCfg) +{ + FMSTR_REC_BUFF *recBuff = _FMSTR_GetRecorderBufferByRecIx(recIndex); + FMSTR_ADDR dynAddr; + FMSTR_INDEX spaceLeft; + + /* Assert that recBuff->addr==recorder and that recBuff->size is large enough for recCfg->varCount and recorder + * structure itself */ + FMSTR_ASSERT(recBuff != NULL); + FMSTR_ASSERT(recBuff->addr == FMSTR_CAST_PTR_TO_ADDR(recorder)); + FMSTR_ASSERT(recBuff->size >= (FMSTR_SIZE)(sizeof(FMSTR_REC) + sizeof(FMSTR_REC_VAR_DATA) * (FMSTR_SIZE)recCfg->varCount)); + + /* Make sure the recorder is stopped first before clearing the whole structure below + (in case the FMSTR_Recorder is called from ISR, it could be invoked in the middle of clearing) */ + recorder->flags.all = 0U; + + /* Reset the recorder context */ + FMSTR_MemSet(recorder, 0, sizeof(FMSTR_REC)); + + /* Copy the config structure */ + recorder->config = *recCfg; + + /* Initialize the variable configuration array (the array follows the recorder structure) */ + dynAddr = (FMSTR_ADDR)(recorder + 1); + dynAddr += FMSTR_GetAlignmentCorrection(dynAddr, FMSTR_REC_STRUCT_ALIGN); + recorder->varDescr = (FMSTR_REC_VAR_DATA *)dynAddr; + FMSTR_MemSet(recorder->varDescr, 0, sizeof(FMSTR_REC_VAR_DATA) * (FMSTR_SIZE)recCfg->varCount); + + /* Data sampling area follows the variable array */ + dynAddr = (FMSTR_ADDR)(recorder->varDescr + recCfg->varCount); + dynAddr += FMSTR_GetAlignmentCorrection(dynAddr, FMSTR_REC_STRUCT_ALIGN); + recorder->buffAddr = dynAddr; + + /*...and spans to the end of the recorder memory */ + spaceLeft = dynAddr - FMSTR_CAST_PTR_TO_ADDR(recorder); + recorder->buffSize = recBuff->size - (FMSTR_SIZE)spaceLeft; + + return FMSTR_STS_OK; +} + +/****************************************************************************** + * + * @brief Handling SETREC Memory configuration command (CFGMEM op_code) + * + * @param msgBuffIO - original command (in) and response buffer (out) + * @param opLen - data length + * @param recorder - recorder structure + * @param retStatus - pointer to return status variable + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +static FMSTR_BPTR _FMSTR_SetRecCmd_CFGMEM( + FMSTR_BPTR msgBuffIO, FMSTR_SIZE opLen, FMSTR_REC *recorder, FMSTR_INDEX recIndex, FMSTR_U8 *retStatus) +{ + FMSTR_REC_CFG recCfg; + FMSTR_BPTR tmpMsgBuffIO = msgBuffIO; + + FMSTR_MemSet(&recCfg, 0, sizeof(recCfg)); + + /* Get the configuration from input buffer */ + msgBuffIO = FMSTR_ValueFromBuffer8(&recCfg.varCount, msgBuffIO); + msgBuffIO = FMSTR_SizeFromBuffer(&recCfg.totalSmps, msgBuffIO); + msgBuffIO = FMSTR_SizeFromBuffer(&recCfg.preTrigger, msgBuffIO); + msgBuffIO = FMSTR_SizeFromBuffer(&recCfg.timeDiv, msgBuffIO); + + /* Check the size if it's valid */ + if (msgBuffIO != (tmpMsgBuffIO + opLen)) + { + *retStatus = FMSTR_STC_INVSIZE; + return msgBuffIO; + } + + /* Configure the Recorder */ + *retStatus = _FMSTR_RecMemCfg(recorder, recIndex, &recCfg); + + return msgBuffIO; +} + +/****************************************************************************** + * + * @brief API: Set up the recorder variable configuration + * + * @param recIndex - index of recorder + * @param recCfg - pointer to recorder configuration + * + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_RecorderAddVariable(FMSTR_INDEX recIndex, FMSTR_INDEX recVarIx, FMSTR_REC_VAR *recVarCfg) +{ + FMSTR_REC *recorder; + + if ((recorder = _FMSTR_GetRecorderByRecIx(recIndex)) == NULL) + { + return FMSTR_FALSE; + } + + return (FMSTR_BOOL)((_FMSTR_RecVarCfg(recorder, recVarIx, recVarCfg) == FMSTR_STS_OK) ? FMSTR_TRUE : FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief Set up the recorder variable configuration (internal version) + * + * @param recIndex - index of recorder + * @param recVarIx - index of variable + * @param recVarCfg - variable configuration + * + * @return FMSTR_STC_xxx status code + * + ******************************************************************************/ + +static FMSTR_U8 _FMSTR_RecVarCfg(FMSTR_REC *recorder, FMSTR_INDEX recVarIx, FMSTR_REC_VAR *recVarCfg) +{ + FMSTR_REC_VAR_DATA *varDescr; + FMSTR_PCOMPAREFUNC compareFunc = NULL; + + FMSTR_ASSERT_RETURN(((FMSTR_SIZE)recVarIx) < recorder->config.varCount, FMSTR_STC_INSTERR); + + /* Cannot change variable configuration when recorder is already configured (or even running) */ + if (recorder->flags.all != 0U) + { + return FMSTR_STC_SERVBUSY; + } + + /* valid numeric variable sizes only */ + if (_FMSTR_RecIsValidVarSize(recVarCfg->size) == FMSTR_FALSE) + { + return FMSTR_STC_INVSIZE; + } + +#if FMSTR_USE_TSA > 0 && FMSTR_USE_TSA_SAFETY > 0 + if (FMSTR_CheckTsaSpace(recVarCfg->addr, recVarCfg->size, FMSTR_FALSE) == FMSTR_FALSE) + { + return FMSTR_STC_EACCESS; + } +#endif /* FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY */ + + /* Is the variable set up for triggerring? */ + if ((recVarCfg->triggerMode & FMSTR_REC_TRG_TYPE_MASK) != 0U) + { + /* Is the threshold also variable? */ +#if FMSTR_USE_TSA > 0 && FMSTR_USE_TSA_SAFETY > 0 + if ((recVarCfg->triggerMode & FMSTR_REC_TRG_F_VARTHR) != 0U) + { + if (FMSTR_CheckTsaSpace(recVarCfg->trgAddr, recVarCfg->size, FMSTR_FALSE) == FMSTR_FALSE) + { + return FMSTR_STC_EACCESS; + } + } +#endif /* FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY */ + + /* get compare function */ + + if ((recVarCfg->triggerMode & FMSTR_REC_TRG_TYPE_MASK) == FMSTR_REC_TRG_TYPE_FLOAT) + { +#if FMSTR_REC_FLOAT_TRIG > 0 + switch (recVarCfg->size) + { + case 4: + compareFunc = _FMSTR_CompareFloat; + break; + case 8: + compareFunc = _FMSTR_CompareDouble; + break; + default: + return FMSTR_STC_INVSIZE; + } +#else + return FMSTR_STC_FLOATDISABLED; +#endif + } + else + { + FMSTR_BOOL sign = + (FMSTR_BOOL)((recVarCfg->triggerMode & FMSTR_REC_TRG_TYPE_MASK) == FMSTR_REC_TRG_TYPE_SINT); + + switch (recVarCfg->size) + { + case 1: + compareFunc = sign != FMSTR_FALSE ? _FMSTR_Compare8S : _FMSTR_Compare8U; + break; + case 2: + compareFunc = sign != FMSTR_FALSE ? _FMSTR_Compare16S : _FMSTR_Compare16U; + break; + case 4: + compareFunc = sign != FMSTR_FALSE ? _FMSTR_Compare32S : _FMSTR_Compare32U; + break; + case 8: + compareFunc = sign != FMSTR_FALSE ? _FMSTR_Compare64S : _FMSTR_Compare64U; + break; + /* invalid trigger variable size */ + default: + return FMSTR_STC_INVSIZE; + } + } + } + + varDescr = &recorder->varDescr[recVarIx]; + + /* Store the variable configuration */ + varDescr->cfg = *recVarCfg; + varDescr->compareFunc = compareFunc; + + return FMSTR_STS_OK; +} + +/****************************************************************************** + * + * @brief Handling SETREC Variable configuration command (CFGVAR op_code) + * + * @param msgBuffIO - original command (in) and response buffer (out) + * @param opLen - data length + * @param retStatus - pointer to return status variable + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +static FMSTR_BPTR _FMSTR_SetRecCmd_CFGVAR(FMSTR_BPTR msgBuffIO, + FMSTR_SIZE opLen, + FMSTR_REC *recorder, + FMSTR_U8 *retStatus) +{ + FMSTR_REC_VAR recVarCfg; + FMSTR_BPTR tmpMsgBuffIO = msgBuffIO; + FMSTR_U8 recVarIx = 0; + + FMSTR_MemSet(&recVarCfg, 0, sizeof(recVarCfg)); + + /* Get the recorder variable configuration from input buffer */ + msgBuffIO = FMSTR_ValueFromBuffer8(&recVarIx, msgBuffIO); + msgBuffIO = FMSTR_AddressFromBuffer(&recVarCfg.addr, msgBuffIO); + msgBuffIO = FMSTR_ValueFromBuffer8(&recVarCfg.size, msgBuffIO); + msgBuffIO = FMSTR_ValueFromBuffer8(&recVarCfg.triggerMode, msgBuffIO); + + /* Only valid variable can be configured */ + if (recVarIx >= recorder->config.varCount) + { + *retStatus = FMSTR_STC_INSTERR; + return msgBuffIO; + } + + /* Sanity check on variable size */ + if (recVarCfg.size > sizeof(FMSTR_REC_THRESHOLD)) + { + *retStatus = FMSTR_STC_INVSIZE; + return msgBuffIO; + } + + /* Variable threshold? */ + if ((recVarCfg.triggerMode & FMSTR_REC_TRG_F_VARTHR) != 0U) + { + /* Yes, get the pointer to variable threshold variable */ + msgBuffIO = FMSTR_AddressFromBuffer(&recVarCfg.trgAddr, msgBuffIO); + } + else + { + /* Constant threshold. Get its address. */ + FMSTR_U8 *constThresholdPtr = recorder->varDescr[recVarIx].thresholdVal.raw; + + switch (recVarCfg.triggerMode & FMSTR_REC_TRG_TYPE_MASK) + { + case FMSTR_REC_TRG_TYPE_FLOAT: +#if FMSTR_REC_FLOAT_TRIG > 0 + /* The Float is coded as a raw bytes in ULEB format */ + msgBuffIO = FMSTR_UlebDecode(msgBuffIO, constThresholdPtr, recVarCfg.size); + break; +#else + *retStatus = FMSTR_STC_FLOATDISABLED; + return msgBuffIO; +#endif + + case FMSTR_REC_TRG_TYPE_SINT: + msgBuffIO = FMSTR_SlebDecode(msgBuffIO, constThresholdPtr, recVarCfg.size); + break; + + case FMSTR_REC_TRG_TYPE_UINT: + default: + msgBuffIO = FMSTR_UlebDecode(msgBuffIO, constThresholdPtr, recVarCfg.size); + break; + } + + /* Pointer to constant threshold value */ + recVarCfg.trgAddr = (FMSTR_ADDR)constThresholdPtr; + } + + /* Secoded ULEBs should match the expected op_data length */ + if (msgBuffIO != (tmpMsgBuffIO + opLen)) + { + *retStatus = FMSTR_STC_INVSIZE; + } + else + { + /* Configure the Recorder variable */ + *retStatus = _FMSTR_RecVarCfg(recorder, (FMSTR_INDEX)recVarIx, &recVarCfg); + } + return msgBuffIO; +} + +/****************************************************************************** + * + * @brief Check recording variable size + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_RecIsValidVarSize(FMSTR_SIZE size) +{ + return (FMSTR_BOOL)(size == 1U || size == 2U || size == 4U || size == 8U); +} + +/****************************************************************************** + * + * @brief Handling SETREC command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param inputLen - data length of input data + * @param retStatus - pointer to return status variable + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_SetRecCmd(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE inputLen, FMSTR_U8 *retStatus) +{ + FMSTR_REC *recorder = NULL; + FMSTR_BPTR response = msgBuffIO; + FMSTR_U8 responseCode = FMSTR_STS_OK; + FMSTR_U8 recIndex = 0; + + /* Get recerder index */ + msgBuffIO = FMSTR_ValueFromBuffer8(&recIndex, msgBuffIO); + inputLen--; + + /* Valid recorder? */ + if ((recorder = _FMSTR_GetRecorderByRecIx((FMSTR_INDEX)recIndex)) == NULL) + { + *retStatus = FMSTR_STC_INSTERR; + return response; + } + + while (inputLen != 0U && (responseCode == FMSTR_STS_OK)) + { + FMSTR_U8 opCode, opLen; + +#if FMSTR_SESSION_COUNT > 1 + /* Is feature locked by me */ + if(FMSTR_IsFeatureOwned(session, FMSTR_FEATURE_REC, recIndex) == FMSTR_FALSE) + { + *retStatus = FMSTR_STC_SERVBUSY; + return response; + } +#endif + + /* Get Operation Code and data length */ + msgBuffIO = FMSTR_ValueFromBuffer8(&opCode, msgBuffIO); + msgBuffIO = FMSTR_ValueFromBuffer8(&opLen, msgBuffIO); + + /* data would span beyond the total frame size */ + if ((opLen + 2UL) > inputLen) + { + *retStatus = FMSTR_STC_INVSIZE; + return response; + } + + inputLen -= opLen + 2U; + + switch (opCode) + { + /* Set number of recorder variables, recorder points and post-trigger points. */ + case FMSTR_REC_PRTCLSET_OP_CFGMEM: + msgBuffIO = _FMSTR_SetRecCmd_CFGMEM(msgBuffIO, opLen, recorder, (FMSTR_INDEX)recIndex, &responseCode); + break; + + /* Configure variable */ + case FMSTR_REC_PRTCLSET_OP_CFGVAR: + msgBuffIO = _FMSTR_SetRecCmd_CFGVAR(msgBuffIO, opLen, recorder, &responseCode); + break; + + /* Start Recorder */ + case FMSTR_REC_PRTCLSET_OP_START: + responseCode = _FMSTR_StartRec(recorder); + break; + + /* Stop Recorder */ + case FMSTR_REC_PRTCLSET_OP_STOP: + responseCode = _FMSTR_AbortRec(recorder); + break; + + default: + responseCode = FMSTR_STC_INVOPCODE; + break; + } + } + + *retStatus = responseCode; + return response; +} + +/****************************************************************************** + * + * @brief Help function to crete recorder status byte + * + * @param recFlags - recorder flags + * + * @return Recorder status in specified protocol form. + * + ******************************************************************************/ + +static FMSTR_U8 _FMSTR_CalcRecStatus(FMSTR_REC_FLAGS recFlags) +{ + /* Not Configured */ + if (recFlags.flg.isConfigured == 0U) + { + return 0x00; + } + + /* Running */ + if (recFlags.flg.isRunning != 0U) + { + return 0x02; + } + + /* Stopped, no data yet (was never running or was stopped before the first sample taken) */ + if (recFlags.flg.hasData == 0U) + { + return 0x01; + } + + /* Stopped, some data but not all (stopped during virgn cycle) */ + if (recFlags.flg.isVirginCycle != 0U) + { + return 0x03; + } + + /* Stopped, all data ready */ + return 0x04; +} + +/****************************************************************************** + * + * @brief Handling GETREC command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - pointer to return status variable + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_GetRecCmd(FMSTR_SESSION * session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + FMSTR_U8 responseCode = (FMSTR_STS_OK | FMSTR_STSF_VARLEN); + FMSTR_BPTR response = msgBuffIO; + FMSTR_REC *recorder; + FMSTR_U8 recIndex; + FMSTR_U8 cfgCode; + + /* Get recorder index */ + msgBuffIO = FMSTR_ValueFromBuffer8(&recIndex, msgBuffIO); + + if ((recorder = _FMSTR_GetRecorderByRecIx((FMSTR_INDEX)recIndex)) == NULL) + { + *retStatus = FMSTR_STC_INSTERR; + return response; + } + else + { + /* Get the command configuration code */ + msgBuffIO = FMSTR_ValueFromBuffer8(&cfgCode, msgBuffIO); + + switch (cfgCode) + { + /* Get recorder description */ + case FMSTR_REC_PRTCLGET_OP_DESCR: + { + FMSTR_REC_BUFF *recorderBuff; + FMSTR_SIZE strLen; + + /* Get the recorder raw buffer where is also stored its name */ + if ((recorderBuff = _FMSTR_GetRecorderBufferByRecIx((FMSTR_INDEX)recIndex)) == NULL) + { + responseCode = FMSTR_STC_INVBUFF; + } + else + { + strLen = FMSTR_StrLen(recorderBuff->name); + response = FMSTR_CopyToBuffer(response, (FMSTR_ADDR)recorderBuff->name, strLen); + } + } + break; + + /* Get recorder limits */ + case FMSTR_REC_PRTCLGET_OP_LIMITS: + { + FMSTR_REC_BUFF *recorderBuff; + + /* Get the recorder */ + if ((recorderBuff = _FMSTR_GetRecorderBufferByRecIx((FMSTR_INDEX)recIndex)) == NULL) + { + responseCode = FMSTR_STC_INVBUFF; + } + else + { + /* Put Raw Size of recorder buffer */ + response = FMSTR_SizeToBuffer(response, recorderBuff->size); + /* Put Base period of the recorder */ + response = FMSTR_ULebToBuffer(response, recorderBuff->basePeriod_ns); + /* Put Size of recorder structure */ + response = FMSTR_SizeToBuffer(response, sizeof(FMSTR_REC)); + /* Put Size of recorder variable structure */ + response = FMSTR_SizeToBuffer(response, sizeof(FMSTR_REC_VAR_DATA)); + } + } + break; + + /* Get recorder info or status */ + case FMSTR_REC_PRTCLGET_OP_STATUS: + case FMSTR_REC_PRTCLGET_OP_INFO: + { + FMSTR_U8 recorderStatus; + + /* Make sure the status is up to date */ + recorderStatus = _FMSTR_CheckConfiguration(recorder); + FMSTR_UNUSED(recorderStatus); + + /* Add current status to buffer */ + recorderStatus = _FMSTR_CalcRecStatus(recorder->flags); + response = FMSTR_ValueToBuffer8(response, recorderStatus); + + /* full info response contains additional data */ + if (cfgCode == FMSTR_REC_PRTCLGET_OP_INFO) + { + if (recorderStatus == 0x00U) + { + /* count of recorded variables */ + response = FMSTR_ValueToBuffer8(response, 0U); + /* base address of recorder buffer */ + response = FMSTR_AddressToBuffer(response, FMSTR_CAST_PTR_TO_ADDR(NULL)); + /* size of the one set of the recorder point */ + response = FMSTR_SizeToBuffer(response, 0U); + /* count of currently stored points */ + response = FMSTR_SizeToBuffer(response, 0U); + /* index of the firt point in circular buffer */ + response = FMSTR_SizeToBuffer(response, 0U); + } + else + { + FMSTR_S32 byteIx = recorder->writePtr - recorder->buffAddr; + FMSTR_SIZE currIx = (FMSTR_SIZE)(((FMSTR_U32)byteIx) / recorder->pointSize); + FMSTR_SIZE recFirstPnt = recorder->flags.flg.isVirginCycle != 0U ? 0U : currIx; + FMSTR_SIZE recPntCnt = + recorder->flags.flg.isVirginCycle != 0U ? currIx : recorder->totalSmplsCnt; + + /* count of recorded variables */ + response = FMSTR_ValueToBuffer8(response, recorder->pointVarCount); + /* base address of recorder buffer */ + response = FMSTR_AddressToBuffer(response, recorder->buffAddr); + /* size of the one set of the recorder point */ + response = FMSTR_SizeToBuffer(response, recorder->pointSize); + /* count of currently stored points */ + response = FMSTR_SizeToBuffer(response, recPntCnt); + /* index of the first point in circular buffer */ + response = FMSTR_SizeToBuffer(response, recFirstPnt); + } + } + } + break; + + default: + responseCode = FMSTR_STC_INVOPCODE; + break; + } + } + + *retStatus = responseCode; + return response; +} + +/****************************************************************************** + * + * @brief API: Start recorder function + * + * @param recIndex - recorder index + * + * @return FMSTR_TRUE in case of successfuly start, FMSTR_FALSE otherwise. + * + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_RecorderStart(FMSTR_INDEX recIndex) +{ + FMSTR_REC *recorder; + + /* Get the recorder */ + if ((recorder = _FMSTR_GetRecorderByRecIx(recIndex)) == NULL) + { + return FMSTR_FALSE; + } + + return (FMSTR_BOOL)((_FMSTR_StartRec(recorder) == FMSTR_STS_OK) ? FMSTR_TRUE : FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief API: Pull the trigger of the recorder + * + * This function starts the post-trigger stop countdown + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_RecorderTrigger(FMSTR_INDEX recIndex) +{ + FMSTR_REC *recorder; + + /* Get the recorder */ + if ((recorder = _FMSTR_GetRecorderByRecIx(recIndex)) == NULL) + { + return FMSTR_FALSE; + } + + return (FMSTR_BOOL)((_FMSTR_TriggerRec(recorder) == FMSTR_STS_OK) ? FMSTR_TRUE : FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief API: Stop recorder immediatelly + * + * This function starts the post-trigger stop countdown + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_RecorderAbort(FMSTR_INDEX recIndex) +{ + FMSTR_REC *recorder; + + /* Get the recorder */ + if ((recorder = _FMSTR_GetRecorderByRecIx(recIndex)) == NULL) + { + return FMSTR_FALSE; + } + + return (FMSTR_BOOL)((_FMSTR_AbortRec(recorder) == FMSTR_STS_OK) ? FMSTR_TRUE : FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief Internal start recorder function + * + * @param recIndex - recorder index + * + * @return Result status of start recorder operation, that could be used for communication + * + * This function starts recording (initializes internal recording variables and flags) + * + ******************************************************************************/ + +static FMSTR_U8 _FMSTR_StartRec(FMSTR_REC *recorder) +{ + /* must be configured */ + if (recorder->flags.flg.isConfigured == 0U) + { + FMSTR_U8 responseCode; + + if ((responseCode = _FMSTR_CheckConfiguration(recorder)) != FMSTR_STS_OK) + { + return responseCode; + } + } + + /* already running ? */ + if (recorder->flags.flg.isRunning != 0U) + { + return FMSTR_STS_OK; + } + + /* initialize write pointer */ + recorder->writePtr = recorder->buffAddr; + + /* initialize time divisor */ + recorder->timeDivCtr = 0U; + + /* run now in virgin cycle */ + recorder->flags.flg.isRunning = 1U; + recorder->flags.flg.hasData = 0U; + recorder->flags.flg.isVirginCycle = 1U; + recorder->flags.flg.isStopping = 0U; + + return FMSTR_STS_OK; +} + +/****************************************************************************** + * + * @brief Internal Trigger recorder function + * + * @param recIndex - recorder index + * + * @return Result status of start recorder operation, taht could be used for communication + * + * This function stops recording (same as manual trigger) + * + ******************************************************************************/ + +static FMSTR_U8 _FMSTR_TriggerRec(FMSTR_REC *recorder) +{ + /* must be configured */ + if (recorder->flags.flg.isConfigured == 0U) + { + return FMSTR_STC_NOTINIT; + } + + if ((recorder->flags.flg.isRunning != 0U) && (recorder->flags.flg.isStopping == 0U)) + { + recorder->flags.flg.isStopping = 1U; + recorder->stopRecCountDown = recorder->postTrigger; + } + + return FMSTR_STS_OK; +} + +/****************************************************************************** + * + * @brief Internal Stop recorder function + * + * @return Result status of start recorder operation, taht could be used for communication + * + * This function stops recording immediatelly + * + ******************************************************************************/ + +static FMSTR_U8 _FMSTR_AbortRec(FMSTR_REC *recorder) +{ + /* must be configured */ + if (recorder->flags.flg.isConfigured == 0U) + { + return FMSTR_STC_NOTINIT; + } + + if (recorder->flags.flg.isRunning != 0U) + { + recorder->flags.flg.isRunning = 0U; + recorder->flags.flg.isStopping = 0U; + } + + return FMSTR_STS_OK; +} + +/****************************************************************************** + * + * @brief Check wether given memory region is inside any recorder buffer + * + * @param addr - address of the memory to be checked + * @param size - size of the memory to be checked + * + * @return This function returns non-zero if user space is in recorder buffer + * + * This function is called as a part of TSA-checking process when the PC host + * is requesting memory contents + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_IsInRecBuffer(FMSTR_ADDR addr, FMSTR_SIZE size) +{ + FMSTR_REC *recorder; + FMSTR_INDEX i; + + for (i = 0; i < (FMSTR_INDEX)FMSTR_USE_RECORDER; i++) + { + /* Get the recorder */ + if ((recorder = _FMSTR_GetRecorderByRecIx(i)) != NULL) + { + if (addr >= recorder->buffAddr) + { + if ((addr + size) <= (recorder->buffAddr + recorder->buffSize)) + { + return FMSTR_TRUE; + } + } + } + } + + return FMSTR_FALSE; +} + +/****************************************************************************** + * + * @brief Check the configuration of the recorder + * + * @return * @return Result status of start recorder operation, that could be used for communication + * + * + ******************************************************************************/ + +static FMSTR_U8 _FMSTR_CheckConfiguration(FMSTR_REC *recorder) +{ + FMSTR_SIZE pointSize = 0U; + FMSTR_SIZE pointVarCount = 0U; + FMSTR_SIZE blen = 0U; + FMSTR_SIZE totalSmpls = 0; + FMSTR_SIZE8 i; + + if (recorder->flags.flg.isConfigured == 0U) + { + /* calculate sum of sizes of all variables */ + FMSTR_SIZE size; + + /* get all addresses and sizes */ + for (i = 0; i < recorder->config.varCount; i++) + { + size = recorder->varDescr[i].cfg.size; + + /* variable size must be one of valid sizes */ + if (size != 1U && size != 2U && size != 4U && size != 8U) + { + return FMSTR_STC_INVSIZE; + } + + /* compute total size of one sample snapshot */ + if ((recorder->varDescr[i].cfg.triggerMode & FMSTR_REC_TRG_F_TRGONLY) == 0U) + { + pointSize += size; + pointVarCount++; + } + } + + /* no variable configured, or samples too big */ + if (pointSize == 0U || pointSize > recorder->buffSize) + { + return FMSTR_STC_INVSIZE; + } + + /* user wants to use less sample points than maximum available */ + if (recorder->config.totalSmps != 0U) + { + /* total recorder buffer length in bytes */ + blen = (FMSTR_SIZE)(recorder->config.totalSmps * pointSize); + + /* recorder memory available? */ + if (blen > recorder->buffSize) + { + totalSmpls = 0; /* user wants more than maximu, use the maximum */ + } + else + { + totalSmpls = recorder->config.totalSmps; /* OK, accept user value */ + } + } + + /* use maximum available memory for samples */ + if (totalSmpls == 0U) + { + totalSmpls = recorder->buffSize / pointSize; + + /* total recorder buffer length in bytes */ + blen = (FMSTR_SIZE)(totalSmpls * pointSize); + } + + /* Use pre-trigger value to calculate post-trigger count */ + if (recorder->config.preTrigger < totalSmpls) + { + recorder->postTrigger = (FMSTR_SIZE)(totalSmpls - recorder->config.preTrigger - 1U); + } + else + { + recorder->postTrigger = (FMSTR_SIZE)(totalSmpls - 1U); /* pre-trigger too high, use maximum possible */ + } + + /* Remember samples total count*/ + recorder->totalSmplsCnt = totalSmpls; + + /* remember the effective end of circular buffer */ + recorder->endBuffPtr = (FMSTR_ADDR)(recorder->buffAddr + (blen / FMSTR_CFG_BUS_WIDTH)); + + /* Store variable set size */ + recorder->pointSize = pointSize; + recorder->pointVarCount = pointVarCount; + + /* it was not configured before, now everything is okay */ + recorder->flags.all = 0; + recorder->flags.flg.isConfigured = 1U; + } + + return FMSTR_STS_OK; +} + +/****************************************************************************** + * + * @brief Compare macro used in trigger detection + * + * @param v - original command + * @param t - response buffer + * + * @return zero when value is lower than threshold. + * @return non-zero when value is greater than or equal as threshold + * + ******************************************************************************/ + +#define CMP(v, t) ((FMSTR_BOOL)(((v) < (t)) ? 0 : 1)) + +static FMSTR_BOOL _FMSTR_Compare8S(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetS8(varData->cfg.addr), FMSTR_GetS8(varData->cfg.trgAddr)); +} + +static FMSTR_BOOL _FMSTR_Compare8U(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetU8(varData->cfg.addr), FMSTR_GetU8(varData->cfg.trgAddr)); +} + +static FMSTR_BOOL _FMSTR_Compare16S(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetS16(varData->cfg.addr), FMSTR_GetS16(varData->cfg.trgAddr)); +} + +static FMSTR_BOOL _FMSTR_Compare16U(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetU16(varData->cfg.addr), FMSTR_GetU16(varData->cfg.trgAddr)); +} + +static FMSTR_BOOL _FMSTR_Compare32S(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetS32(varData->cfg.addr), FMSTR_GetS32(varData->cfg.trgAddr)); +} + +static FMSTR_BOOL _FMSTR_Compare32U(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetU32(varData->cfg.addr), FMSTR_GetU32(varData->cfg.trgAddr)); +} + +static FMSTR_BOOL _FMSTR_Compare64S(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetS64(varData->cfg.addr), FMSTR_GetS64(varData->cfg.trgAddr)); +} + +static FMSTR_BOOL _FMSTR_Compare64U(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetU64(varData->cfg.addr), FMSTR_GetU64(varData->cfg.trgAddr)); +} + +#if FMSTR_REC_FLOAT_TRIG > 0 +static FMSTR_BOOL _FMSTR_CompareFloat(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetFloat(varData->cfg.addr), FMSTR_GetFloat(varData->cfg.trgAddr)); +} + +static FMSTR_BOOL _FMSTR_CompareDouble(FMSTR_REC_VAR_DATA *varData) +{ + return CMP(FMSTR_GetDouble(varData->cfg.addr), FMSTR_GetDouble(varData->cfg.trgAddr)); +} +#endif + +/****************************************************************************** + * + * @brief Gets the pointer pointing to recorder data buffer by Recorder Index + * + * @param recIndex - Index of Recorder + * + * @return NULL when the recorder doesn't exists, otherwise the pointer to recorder buffer + * + ******************************************************************************/ + +static FMSTR_REC_BUFF *_FMSTR_GetRecorderBufferByRecIx(FMSTR_INDEX recIndex) +{ + if (recIndex < 0 || recIndex >= (FMSTR_INDEX)FMSTR_USE_RECORDER) + { + return NULL; + } + + return &fmstr_recBuffs[recIndex]; +} + +/****************************************************************************** + * + * @brief Gets the pointer pointing to recorder data by Recorder Index + * + * @param recIndex - Index of Recorder + * + * @return NULL when the recorder doesn't exists, otherwise the pointer to recorder structure + * + ******************************************************************************/ + +static FMSTR_REC *_FMSTR_GetRecorderByRecIx(FMSTR_INDEX recIndex) +{ + if (recIndex < 0 || recIndex >= (FMSTR_INDEX)FMSTR_USE_RECORDER) + { + return NULL; + } + + return (FMSTR_REC *)fmstr_recBuffs[recIndex].addr; +} + +/****************************************************************************** + * + * @brief API: Recorder worker routine - can be called from application's timer ISR + * + * + * This returns quickly if recorder is not running, otherwise it calls quite lengthy + * recorder routine which does all the recorder work (sampling, triggering) + * + ******************************************************************************/ + +#if defined(FMSTR_PLATFORM_56F8xxx) || defined(FMSTR_PLATFORM_56F8xx) +#pragma interrupt called +#endif + +void FMSTR_Recorder(FMSTR_INDEX recIndex) +{ + FMSTR_REC *recorder = _FMSTR_GetRecorderByRecIx(recIndex); + + /* recorder not active */ + if (recorder == NULL || recorder->flags.flg.isRunning == 0U) + { + return; + } + + /* do the hard work */ + _FMSTR_Recorder2(recorder); +} + +/****************************************************************************** + * + * @brief Recorder function called when recorder is active + * + ******************************************************************************/ + +#if defined(FMSTR_PLATFORM_56F8xxx) || defined(FMSTR_PLATFORM_56F8xx) +#pragma interrupt called +#endif + +static void _FMSTR_Recorder2(FMSTR_REC *recorder) +{ + FMSTR_REC_VAR_DATA *recVarData; + FMSTR_PCOMPAREFUNC compareFunc; + FMSTR_U8 triggerMode; + FMSTR_SIZE8 sz; + FMSTR_SIZE i; + FMSTR_BOOL cmp; + FMSTR_U8 triggerResult; + + /* skip this call ? */ + if (recorder->timeDivCtr > 0U) + { + /* maybe next time... */ + recorder->timeDivCtr--; + return; + } + + /* re-initialize divider */ + recorder->timeDivCtr = recorder->config.timeDiv; + + /* take snapshot of variable values */ + for (i = 0U; i < recorder->config.varCount; i++) + { + recVarData = &recorder->varDescr[i]; + triggerMode = recVarData->cfg.triggerMode; + + /* test trigger condition if still running */ + if (recVarData->compareFunc != NULL && recorder->flags.flg.isStopping == 0U) + { + /* compare trigger threshold */ + compareFunc = recVarData->compareFunc; + cmp = compareFunc(recVarData); + + /* No trigger checking in virgin cycle */ + if (recorder->flags.flg.isVirginCycle == 0U) + { + /* Check the Above trigger */ + if (cmp != FMSTR_FALSE && (triggerMode & FMSTR_REC_TRG_F_ABOVE) != 0U) + { + /* Solve as Edge or Level trigger */ + if ((triggerMode & FMSTR_REC_TRG_F_LEVEL) != 0U || (recVarData->trgLastState == FMSTR_FALSE)) + { + triggerResult = _FMSTR_TriggerRec(recorder); + } + } + + /* Check the Below trigger */ + if (cmp == FMSTR_FALSE && (triggerMode & FMSTR_REC_TRG_F_BELOW) != 0U) + { + /* Solve as Edge or Level trigger */ + if ((triggerMode & FMSTR_REC_TRG_F_LEVEL) != 0U || recVarData->trgLastState != FMSTR_FALSE) + { + triggerResult = _FMSTR_TriggerRec(recorder); + } + } + } + + /* Store the last comparision */ + recVarData->trgLastState = cmp; + } + + /* Store the recorder variable to buffer */ + if ((triggerMode & FMSTR_REC_TRG_F_TRGONLY) == 0U) + { + sz = recVarData->cfg.size; + FMSTR_MemCpyFrom(recorder->writePtr, recVarData->cfg.addr, sz); + sz /= FMSTR_CFG_BUS_WIDTH; + recorder->writePtr += sz; + } + } + + /* We now have at least some data*/ + recorder->flags.flg.hasData = 1U; + + /* wrap around (circular buffer) ? */ + if (recorder->writePtr >= recorder->endBuffPtr) + { + recorder->writePtr = recorder->buffAddr; + recorder->flags.flg.isVirginCycle = 0U; + } + + /* in stopping mode ? (note that this bit might have been set just above!) */ + if (recorder->flags.flg.isStopping != 0U) + { + /* count down post-trigger samples expired ? */ + if (recorder->stopRecCountDown == 0U) + { + /* STOP RECORDER */ + recorder->flags.flg.isRunning = 0U; + return; + } + + /* perhaps next time */ + recorder->stopRecCountDown--; + } + + FMSTR_UNUSED(triggerResult); +} + +#else /* FMSTR_USE_RECORDER && (!FMSTR_DISABLE) */ + +FMSTR_BOOL FMSTR_RecorderCreate(FMSTR_INDEX recIndex, FMSTR_REC_BUFF *buffCfg) +{ + FMSTR_UNUSED(recIndex); + FMSTR_UNUSED(buffCfg); + + return FMSTR_TRUE; +} + +FMSTR_BOOL FMSTR_RecorderSetTimeBase(FMSTR_INDEX recIndex, FMSTR_U32 timeBase_ns) +{ + FMSTR_UNUSED(recIndex); + FMSTR_UNUSED(timeBase_ns); + + return FMSTR_TRUE; +} + +/* use void recorder API functions */ +void FMSTR_Recorder(FMSTR_INDEX recIndex) +{ + FMSTR_UNUSED(recIndex); +} + +FMSTR_BOOL FMSTR_RecorderTrigger(FMSTR_INDEX recIndex) +{ + FMSTR_UNUSED(recIndex); + + return FMSTR_TRUE; +} + +FMSTR_BOOL FMSTR_RecorderAbort(FMSTR_INDEX recIndex) +{ + FMSTR_UNUSED(recIndex); + + return FMSTR_TRUE; +} + +FMSTR_BOOL FMSTR_RecorderConfigure(FMSTR_INDEX recIndex, FMSTR_REC_CFG *recCfg) +{ + FMSTR_UNUSED(recIndex); + FMSTR_UNUSED(recCfg); + + return FMSTR_TRUE; +} + +FMSTR_BOOL FMSTR_RecorderAddVariable(FMSTR_INDEX recIndex, FMSTR_INDEX recVarIx, FMSTR_REC_VAR *recVarCfg) +{ + FMSTR_UNUSED(recIndex); + FMSTR_UNUSED(recVarIx); + FMSTR_UNUSED(recVarCfg); + + return FMSTR_TRUE; +} + +FMSTR_BOOL FMSTR_RecorderStart(FMSTR_INDEX recIndex) +{ + FMSTR_UNUSED(recIndex); + return FMSTR_TRUE; +} + +#endif /* FMSTR_USE_RECORDER && (!FMSTR_DISABLE) */ diff --git a/middleware/freemaster/src/common/freemaster_rec.h b/middleware/freemaster/src/common/freemaster_rec.h new file mode 100644 index 0000000..295b6cb --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_rec.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Recorder API + */ + +#ifndef __FREEMASTER_REC_H +#define __FREEMASTER_REC_H + +#ifndef __FREEMASTER_H +#error Please include freemaster_rec.h after freemaster.h main header file. +#endif + +/*********************************** +* global recorder types +***********************************/ +/* Recorder variable trigger mode settings */ +#define FMSTR_REC_TRG_TYPE_MASK 0x03U /* Recorder trigger type - bit mask */ +#define FMSTR_REC_TRG_TYPE_NO_TRIGGER 0x00U /* Not used as trigger */ +#define FMSTR_REC_TRG_TYPE_UINT 0x01U /* Recorder trigger type - unsigned integer */ +#define FMSTR_REC_TRG_TYPE_SINT 0x02U /* Recorder trigger type - signed integer */ +#define FMSTR_REC_TRG_TYPE_FLOAT 0x03U /* Recorder trigger type - float */ + +#define FMSTR_REC_TRG_F_TRGONLY 0x04U /* Recorder trigger configuration - variable is used just for triggering */ +#define FMSTR_REC_TRG_F_ABOVE 0x10U /* Recorder trigger configuration - trigger is active for threshold above results */ +#define FMSTR_REC_TRG_F_BELOW 0x20U /* Recorder trigger configuration - trigger is active for threshold below results */ +#define FMSTR_REC_TRG_F_LEVEL 0x40U /* Recorder trigger configuration - trigger is level active, otherwise edge */ +#define FMSTR_REC_TRG_F_VARTHR 0x80U /* Recorder trigger configuration - trigger has fixed threshold value */ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Description of recorder instance buffer */ +typedef struct +{ + FMSTR_ADDR addr; /* address of buffer for recorder instance */ + FMSTR_U32 basePeriod_ns; /* Base speed of recorder sampling in nanoseconds. Client may request to sample at multiples of this value. */ + FMSTR_SIZE size; /* size of buffer for recorder instance */ + FMSTR_CHAR *name; /* String description of recorder sampling point etc. (e.g. "PWM Reload Interrupt", or "Timer interrupt"). */ +} FMSTR_REC_BUFF; + +/* Recorder description of one variable */ +typedef struct +{ + FMSTR_ADDR addr; /* address of recorded variable */ + FMSTR_ADDR trgAddr; /* address of trigger variable to compare thresholds */ + FMSTR_SIZE8 size; /* size of recorded variable */ + FMSTR_SIZE8 triggerMode; /* trigger mode */ +} FMSTR_REC_VAR; + +/* configuration variables */ +typedef struct +{ + FMSTR_SIZE totalSmps; /* number of samples to measure */ + FMSTR_SIZE preTrigger; /* number of pre-trigger samples to keep */ + FMSTR_SIZE timeDiv; /* divisor of recorder "clock" */ + FMSTR_SIZE8 varCount; /* number of active recorder variables */ +} FMSTR_REC_CFG; + +#ifdef __cplusplus + } +#endif + +/*********************************** +* global recorder variables +***********************************/ + + +#endif /* __FREEMASTER_REC_H */ diff --git a/middleware/freemaster/src/common/freemaster_scope.c b/middleware/freemaster/src/common/freemaster_scope.c new file mode 100644 index 0000000..b04197d --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_scope.c @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Oscilloscope implementation + */ + +#include "freemaster.h" +#include "freemaster_private.h" +#include "freemaster_protocol.h" +#include "freemaster_utils.h" + +#if FMSTR_USE_SCOPE > 0 && FMSTR_DISABLE == 0 + +/******************************************************** + * local macros definition + ********************************************************/ +/* Define Protocol operations*/ +#define FMSTR_SCOPE_PRTCLSET_OP_CFGMEM 0x01 /* Set number of recorder variables */ +#define FMSTR_SCOPE_PRTCLSET_OP_CFGVAR 0x02 /* Setup address and size of one scope variable */ + +/******************************************************** + * local types definition + ********************************************************/ + +/* Scope instance definition */ +typedef struct +{ + FMSTR_U8 varCnt; /* number of active scope variables */ + FMSTR_ADDR varAddr[FMSTR_MAX_SCOPE_VARS]; /* addresses of scope variables */ + FMSTR_U8 varSize[FMSTR_MAX_SCOPE_VARS]; /* sizes of scope variables */ +} FMSTR_SCOPE; + +/******************************************************** + * local static functions declarations + ********************************************************/ +static FMSTR_U8 _FMSTR_SetScope_CFGMEM(FMSTR_BPTR msgBuffIO, FMSTR_SCOPE *scope); +static FMSTR_U8 _FMSTR_SetScope_CFGVAR(FMSTR_BPTR msgBuffIO, FMSTR_SCOPE *scope, FMSTR_U8 opLen); + +/*********************************** + * local variables + ***********************************/ +static FMSTR_SCOPE fmstr_scopeCfg[FMSTR_USE_SCOPE]; /* Container of all scopes configurations*/ + +/****************************************************************************** + * + * @brief Scope Initialization + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_InitScope(void) +{ + FMSTR_MemSet(fmstr_scopeCfg, 0, sizeof(fmstr_scopeCfg)); + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Handling FMSTR_CMD_SETSCOPE Memory configuration command + * + * @param msgBuffIO - original command (in) and response buffer (out) + * @param scope - pointer to scope configuration + * + * @return status of operation usable in protocol + * + ******************************************************************************/ + +static FMSTR_U8 _FMSTR_SetScope_CFGMEM(FMSTR_BPTR msgBuffIO, FMSTR_SCOPE *scope) +{ + FMSTR_U8 varCnt; + + /* Get the active variables count of Scope Instance */ + (void)FMSTR_ValueFromBuffer8(&varCnt, msgBuffIO); + + if (varCnt > (FMSTR_U8)FMSTR_MAX_SCOPE_VARS) + { + return FMSTR_STC_INVSIZE; + } + + /* Initialize the scope configuration */ + FMSTR_MemSet(scope, 0, sizeof(*scope)); + scope->varCnt = varCnt; + + return FMSTR_STS_OK; +} + +/****************************************************************************** + * + * @brief API: Set up the recorder variable configuration (internal version) + * + * @param recIx - index of recorder + * @param recCfg - pointer to recorder configuration + * + * + ******************************************************************************/ + +static FMSTR_U8 _FMSTR_SetScope_CFGVAR(FMSTR_BPTR msgBuffIO, FMSTR_SCOPE *scope, FMSTR_U8 opLen) +{ + FMSTR_BPTR msgBuffIOStart = msgBuffIO; + FMSTR_U8 varIx; + FMSTR_ADDR addr; + FMSTR_U8 size; + + /* Get the variable index */ + msgBuffIO = FMSTR_ValueFromBuffer8(&varIx, msgBuffIO); + /* Get the variable address */ + msgBuffIO = FMSTR_AddressFromBuffer(&addr, msgBuffIO); + /* Get the variable size */ + msgBuffIO = FMSTR_ValueFromBuffer8(&size, msgBuffIO); + + /* Decoded ULEBs should match the expected op_data length */ + if (msgBuffIO != (msgBuffIOStart + opLen)) + { + return FMSTR_STC_INVSIZE; + } + + /* Check the variable index */ + if (varIx >= scope->varCnt) + { + return FMSTR_STC_INVBUFF; + } + + /* Valid numeric variable sizes only */ + if ((size != 1U) && (size != 2U) && (size != 4U) && (size != 8U)) + { + return FMSTR_STC_INVSIZE; + } + + /* Check the TSA safety */ +#if FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY + if (FMSTR_CheckTsaSpace(addr, size, FMSTR_FALSE) == FMSTR_FALSE) + { + return FMSTR_STC_EACCESS; + } +#endif /* FMSTR_USE_TSA && FMSTR_USE_TSA_SAFETY */ + + /* Store the variable configuration */ + scope->varAddr[varIx] = addr; + scope->varSize[varIx] = size; + + return FMSTR_STS_OK; +} + +/****************************************************************************** + * + * @brief Handling SETUPSCOPE command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param inputLen - Count of received bytes in input buffer + * @param retStatus - pointer to return status variable + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_SetScope(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_SIZE inputLen, FMSTR_U8 *retStatus) +{ + FMSTR_SCOPE *scope; + FMSTR_BPTR response = msgBuffIO; + FMSTR_U8 responseCode = FMSTR_STS_OK; + FMSTR_U8 scopeIndex; + + /* Get recerder index */ + msgBuffIO = FMSTR_ValueFromBuffer8(&scopeIndex, msgBuffIO); + inputLen--; + + if (scopeIndex >= (FMSTR_U8)FMSTR_USE_SCOPE) + { + *retStatus = FMSTR_STC_INSTERR; + return response; + } + +#if FMSTR_SESSION_COUNT > 1 + /* Is feature locked by me */ + if (FMSTR_IsFeatureOwned(session, FMSTR_FEATURE_SCOPE, scopeIndex) == FMSTR_FALSE) + { + *retStatus = FMSTR_STC_SERVBUSY; + return response; + } +#endif + + scope = &fmstr_scopeCfg[scopeIndex]; + + while (inputLen != 0U && (responseCode == FMSTR_STS_OK)) + { + FMSTR_U8 opCode, opLen; + + /* Get Operation Code and data length */ + msgBuffIO = FMSTR_ValueFromBuffer8(&opCode, msgBuffIO); + msgBuffIO = FMSTR_ValueFromBuffer8(&opLen, msgBuffIO); + + if ((opLen + 2U) > inputLen) + { + *retStatus = FMSTR_STC_INVSIZE; + return response; + } + + switch (opCode) + { + /* Configure scope memory */ + case FMSTR_SCOPE_PRTCLSET_OP_CFGMEM: + responseCode = _FMSTR_SetScope_CFGMEM(msgBuffIO, scope); + break; + + /* Configure variable */ + case FMSTR_SCOPE_PRTCLSET_OP_CFGVAR: + responseCode = _FMSTR_SetScope_CFGVAR(msgBuffIO, scope, opLen); + break; + + default: + responseCode = FMSTR_STC_INVCMD; + break; + } + + inputLen -= opLen + 2U; + msgBuffIO += opLen; + } + + *retStatus = responseCode; + return response; +} + +/****************************************************************************** + * + * @brief Handling READSCOPE command + * + * @param session - transport session + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - pointer to return status variable + * @param maxOutSize - Maximal size of output data + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_ReadScope(FMSTR_SESSION *session, FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus, FMSTR_SIZE maxOutSize) +{ + FMSTR_U8 i; + FMSTR_U8 scopeIndex; + FMSTR_SCOPE *scope; + FMSTR_BPTR msgBuffIOStart = msgBuffIO; + + /* Get recerder index */ + (void)FMSTR_ValueFromBuffer8(&scopeIndex, msgBuffIO); + + /* Check the index of scope if it fits to configuration */ + if (scopeIndex >= (FMSTR_U8)FMSTR_USE_SCOPE) + { + *retStatus = FMSTR_STC_INSTERR; + return msgBuffIO; + } + +#if FMSTR_SESSION_COUNT > 1 + /* Is feature locked by me */ + if (FMSTR_IsFeatureOwned(session, FMSTR_FEATURE_SCOPE, scopeIndex) == FMSTR_FALSE) + { + *retStatus = FMSTR_STC_SERVBUSY; + return msgBuffIO; + } +#endif + + /* Get the scope */ + scope = &fmstr_scopeCfg[scopeIndex]; + + /* Check if there are defined some variables */ + if (scope->varCnt == 0U) + { + *retStatus = FMSTR_STC_NOTINIT; + return msgBuffIO; + } + + /* Copy all variables into the output buffer */ + for (i = 0U; i < scope->varCnt; i++) + { + /* Check the size of output buffer */ + if (maxOutSize < scope->varSize[i]) + { + *retStatus = FMSTR_STC_INVSIZE; + return msgBuffIOStart; + } + maxOutSize -= scope->varSize[i]; + + /* Copy variable */ + msgBuffIO = FMSTR_CopyToBuffer(msgBuffIO, scope->varAddr[i], scope->varSize[i]); + } + + *retStatus = FMSTR_STS_OK; + + /* return end position */ + return msgBuffIO; +} + +#endif /* (FMSTR_USE_SCOPE) && !(FMSTR_DISABLE) */ diff --git a/middleware/freemaster/src/common/freemaster_serial.c b/middleware/freemaster/src/common/freemaster_serial.c new file mode 100644 index 0000000..c012053 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_serial.c @@ -0,0 +1,699 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial communication + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our transport is used or not. */ +#define FMSTR_SERIAL_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_TRANSPORT) == FMSTR_SERIAL_ID) && FMSTR_DISABLE == 0 + +#if FMSTR_SESSION_COUNT != 1 +/* Serial transport only supports a single session */ +#warning Please set FMSTR_SESSION_COUNT to 1. +#endif + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" +#include "freemaster_utils.h" + +/*********************************** + * local variables + ***********************************/ + +/* FreeMASTER communication buffer (in/out) plus the STS, LEN(LEB) and CRC bytes */ +static FMSTR_BCHR fmstr_pCommBuffer[FMSTR_COMM_BUFFER_SIZE + 1 + 4 + 2]; + +/* FreeMASTER runtime flags */ +/*lint -e{960} using union */ +typedef volatile union +{ + FMSTR_FLAGS all; + + struct + { + unsigned bTxActive : 1; /* response is being transmitted */ + unsigned bTxWaitTC : 1; /* response sent, wait for transmission complete */ + unsigned bTxLastCharSOB : 1; /* last transmitted char was equal to SOB */ + unsigned bRxLastCharSOB : 1; /* last received character was SOB */ + unsigned bRxMsgLengthNext : 1; /* expect the length byte next time */ + } flg; + +} FMSTR_SERIAL_FLAGS; + +static FMSTR_SERIAL_FLAGS _fmstr_wFlags; + +/* receive and transmit buffers and counters */ +static FMSTR_SIZE8 fmstr_nTxTodo; /* transmission to-do counter (0 when tx is idle) */ +static FMSTR_SIZE8 fmstr_nRxTodo; /* reception to-do counter (0 when rx is idle) */ +static FMSTR_BPTR fmstr_pTxBuff; /* pointer to next byte to transmit */ +static FMSTR_BPTR fmstr_pRxBuff; /* pointer to next free place in RX buffer */ +static FMSTR_BCHR fmstr_nRxCrc8; /* checksum of data being received for short messages */ + +/* Maximal length of message to use 8 bit CRC8. */ +#define FMSTR_SHORT_MSG_LEN 128 + +#if FMSTR_DEBUG_TX > 0 +/* The poll counter is used to roughly measure duration of test frame transmission. + * The test frame will be sent once per N.times this measured period. */ +static FMSTR_S32 fmstr_nDebugTxPollCount; +/* the N factor for multiplying the transmission time to get the wait time */ +#define FMSTR_DEBUG_TX_POLLCNT_XFACTOR 32 +#define FMSTR_DEBUG_TX_POLLCNT_MIN (-1 * 0x4000000L) +#endif + +/*********************************** + * local function prototypes + ***********************************/ + +static void _FMSTR_Listen(void); +static void _FMSTR_SendError(FMSTR_BCHR nErrCode); +static FMSTR_BOOL _FMSTR_Tx(FMSTR_BCHR *getTxChar); +static FMSTR_BOOL _FMSTR_Rx(FMSTR_BCHR rxChar); + +/*********************************** + * local variables + ***********************************/ + +/* SHORT_INTR receive queue (circular buffer) */ +#if FMSTR_SHORT_INTR > 0 +static FMSTR_BCHR fmstr_rxBuff[FMSTR_COMM_RQUEUE_SIZE]; +static FMSTR_RING_BUFFER fmstr_rxQueue; +#endif + +/*********************************** + * local function prototypes + ***********************************/ + +#if FMSTR_SHORT_INTR > 0 +static void _FMSTR_RxDequeue(void); +#endif + +/* Interface function - Initialization of serial transport */ +static FMSTR_BOOL _FMSTR_SerialInit(void); +/* Interface function - Poll function of serial transport */ +static void _FMSTR_SerialPoll(void); +/* Interface function - Send Response function of serial transport */ +static void _FMSTR_SerialSendResponse(FMSTR_BPTR pResponse, + FMSTR_SIZE nLength, + FMSTR_U8 statusCode, + void *identification); + +/*********************************** + * global variables + ***********************************/ + +/* Interface of this serial driver */ +const FMSTR_TRANSPORT_INTF FMSTR_SERIAL = { + FMSTR_C99_INIT(Init) _FMSTR_SerialInit, + FMSTR_C99_INIT(Poll) _FMSTR_SerialPoll, + FMSTR_C99_INIT(SendResponse) _FMSTR_SerialSendResponse, +}; + +/*lint -esym(752,_FMSTR_RxQueue) this may be unreferenced in some cases */ +/*lint -esym(752,_FMSTR_RxDequeue) this may be unreferenced in some cases */ + +/******************************************************************************* + * + * @brief Routine to quick-receive a character (put to a queue only) + * + * This function puts received character into a queue and exits as soon as possible. + * + *******************************************************************************/ + +#if FMSTR_SHORT_INTR > 0 + +/******************************************************************************* + * + * @brief Late processing of queued characters + * + * This function takes the queued characters and calls FMSTR_Rx() for each of them, + * just like as the characters would be received from SCI one by one. + * + *******************************************************************************/ + +static void _FMSTR_RxDequeue(void) +{ + FMSTR_BCHR nChar = 0U; + + /* get all queued characters */ + while (_FMSTR_RingBuffHasData(&fmstr_rxQueue) != FMSTR_FALSE) + { + nChar = _FMSTR_RingBuffGet(&fmstr_rxQueue); + + /* emulate the SCI receive event */ + if (_fmstr_wFlags.flg.bTxActive == 0U) + { + (void)_FMSTR_Rx(nChar); + } + } +} + +#endif /* FMSTR_SHORT_INTR */ + +/****************************************************************************** + * + * @brief Handle SCI communication (both TX and RX) + * + * This function checks the SCI flags and calls the Rx and/or Tx functions + * + * @note This function can be called either from SCI ISR or from the polling routine + * + ******************************************************************************/ + +void FMSTR_ProcessSerial(void) +{ + FMSTR_BOOL endOfPacket = FMSTR_FALSE; + + /* transmitter active and empty? */ + if (_fmstr_wFlags.flg.bTxActive != 0U) + { + /* able to accept another character? */ + while (FMSTR_SERIAL_DRV.IsTransmitRegEmpty() != FMSTR_FALSE) + { + FMSTR_BCHR ch; + /* just put the byte into the SCI transmit buffer */ + endOfPacket = _FMSTR_Tx(&ch); + if (endOfPacket == FMSTR_FALSE) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR Tx: %02x\n", (FMSTR_U8)ch); +#endif + FMSTR_SERIAL_DRV.PutChar((FMSTR_U8)ch); + } + else + { + break; + } + } + + /* Flush data */ + if (endOfPacket != FMSTR_FALSE) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR Tx Flush\n"); +#endif + FMSTR_SERIAL_DRV.Flush(); + _fmstr_wFlags.flg.bTxWaitTC = 1U; + +#if FMSTR_SHORT_INTR || FMSTR_LONG_INTR + /* Enable UART Transfer Complete interrupt in case of interrupt mode of communication. */ + if (FMSTR_SERIAL_DRV.IsTransmitterActive() != FMSTR_FALSE) + { + /* Enable Trasmit complete interrupt */ + FMSTR_SERIAL_DRV.EnableTransmitCompleteInterrupt(FMSTR_TRUE); + } +#endif + } + + /* when SCI TX buffering is enabled, we must first wait until all + characters are physically transmitted (before disabling transmitter) */ + if (_fmstr_wFlags.flg.bTxWaitTC != 0U && FMSTR_SERIAL_DRV.IsTransmitterActive() == FMSTR_FALSE) + { + /* after TC, we can switch to listen mode safely */ + _FMSTR_Listen(); + } + } + /* transmitter not active, able to receive */ + else + { + /* data byte received? */ + while (FMSTR_SERIAL_DRV.IsReceiveRegFull() != FMSTR_FALSE) + { + FMSTR_BCHR rxChar = 0U; + rxChar = FMSTR_SERIAL_DRV.GetChar(); + +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR Rx: %02x\n", (FMSTR_U8)rxChar); +#endif + +#if FMSTR_SHORT_INTR > 0 + _FMSTR_RingBuffPut(&fmstr_rxQueue, rxChar); // TODO: if queue is lower than received data +#else + (void)_FMSTR_Rx(rxChar); +#endif + } +#if FMSTR_DEBUG_TX > 0 + /* time to send another test frame? */ + if (fmstr_doDebugTx != 0U && fmstr_nDebugTxPollCount == 0) + { + /* yes, start sending it now */ + if (FMSTR_SendTestFrame(&fmstr_pCommBuffer[2], NULL) != FMSTR_FALSE) + { + /* measure how long it takes to transmit it */ + fmstr_nDebugTxPollCount = -1; + } + } +#endif + } +} + +/****************************************************************************** + * + * @brief Start listening on a serial line + * + * Reset the receiver machine and start listening on a serial line + * + ******************************************************************************/ + +static void _FMSTR_Listen(void) +{ + fmstr_nRxTodo = 0U; + + /* disable transmitter state machine */ + _fmstr_wFlags.flg.bTxActive = 0U; + _fmstr_wFlags.flg.bTxWaitTC = 0U; + + /* disable transmitter, enable receiver (enables single-wire connection) */ + FMSTR_SERIAL_DRV.EnableTransmit(FMSTR_FALSE); + FMSTR_SERIAL_DRV.EnableReceive(FMSTR_TRUE); + + /* disable transmit, enable receive interrupts */ +#if FMSTR_SHORT_INTR || FMSTR_LONG_INTR + FMSTR_SERIAL_DRV.EnableTransmitInterrupt(FMSTR_FALSE); /* disable Serial transmit interrupt */ + FMSTR_SERIAL_DRV.EnableTransmitCompleteInterrupt(FMSTR_FALSE); /* disable Serial transmit complete interrupt */ + FMSTR_SERIAL_DRV.EnableReceiveInterrupt(FMSTR_TRUE); /* enable Serial receive interrupt */ +#endif /* FMSTR_SHORT_INTR || FMSTR_LONG_INTR */ + +#if FMSTR_DEBUG_TX > 0 + /* we have just finished the transmission of the test frame, now wait the 32x times the sendtime + to receive any command from PC (count<0 is measurement, count>0 is waiting, count=0 is send trigger) */ + if (fmstr_nDebugTxPollCount < 0) + { + fmstr_nDebugTxPollCount *= -(FMSTR_DEBUG_TX_POLLCNT_XFACTOR); + } +#endif + +#if FMSTR_DEBUG_LEVEL >= 2 + FMSTR_DEBUG_PRINTF("FMSTR Listening...\n"); +#endif +} + +/****************************************************************************** + * + * @brief Send response of given error code (no data) + * + * @param nErrCode - error code to be sent + * + ******************************************************************************/ + +static void _FMSTR_SendError(FMSTR_BCHR nErrCode) +{ +#if FMSTR_DEBUG_LEVEL >= 1 + FMSTR_DEBUG_PRINTF("FMSTR SendError code: 0x%x\n", (FMSTR_U8)nErrCode); +#endif + + /* fill & send single-byte response */ + _FMSTR_SerialSendResponse(&fmstr_pCommBuffer[2], 0U, nErrCode, NULL); +} + +/****************************************************************************** + * + * @brief Finalize transmit buffer before transmitting + * + * @param nLength - response length (1 for status + data length) + * + * + * This Function takes the data already prepared in the transmit buffer + * (inlcuding the status byte). It computes the check sum and kicks on tx. + * + ******************************************************************************/ + +static void _FMSTR_SerialSendResponse(FMSTR_BPTR pResponse, + FMSTR_SIZE nLength, + FMSTR_U8 statusCode, + void *identification) +{ + FMSTR_SIZE8 i; + FMSTR_U8 c; + + FMSTR_UNUSED(identification); + + if (nLength > 254U || pResponse != &fmstr_pCommBuffer[2]) + { + /* The Serial driver doesn't support bigger responses than 254 bytes, change the response to status error */ + statusCode = FMSTR_STC_RSPBUFFOVF; + nLength = 0U; + } + + /* remember the buffer to be sent */ + fmstr_pTxBuff = fmstr_pCommBuffer; + /* Send the message with status, length and checksum. SOB is not counted as it is sent right here. */ + fmstr_nTxTodo = (FMSTR_SIZE8)(nLength + 3U); + + if ((statusCode & FMSTR_STSF_VARLEN) != 0U) + { + fmstr_pCommBuffer[0] = (FMSTR_BCHR)statusCode; + fmstr_pCommBuffer[1] = (FMSTR_BCHR)nLength; + } + else + { + fmstr_pCommBuffer[1] = (FMSTR_BCHR)statusCode; + fmstr_pTxBuff++; + fmstr_nTxTodo--; + } + + /* Initialize CRC algorithms */ + FMSTR_Crc8Init(&fmstr_nRxCrc8); + + /* status byte and data are already there, compute checksum only */ + pResponse = fmstr_pTxBuff; + for (i = 1U; i < fmstr_nTxTodo; i++) + { + pResponse = FMSTR_ValueFromBuffer8(&c, pResponse); + /* add character to checksum */ + FMSTR_Crc8AddByte(&fmstr_nRxCrc8, c); + } + + /* store checksum after the message */ + pResponse = FMSTR_ValueToBuffer8(pResponse, fmstr_nRxCrc8); + + /* now transmitting the response */ + _fmstr_wFlags.flg.bTxActive = 1U; + _fmstr_wFlags.flg.bTxWaitTC = 0U; + + /* do not replicate the initial SOB */ + _fmstr_wFlags.flg.bTxLastCharSOB = 0U; + + /* disable receiver, enable transmitter (single-wire communication) */ + FMSTR_SERIAL_DRV.EnableReceive(FMSTR_FALSE); + FMSTR_SERIAL_DRV.EnableTransmit(FMSTR_TRUE); + +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR Tx: %02x\n", (FMSTR_U8)FMSTR_SOB); +#endif + + /* kick on the SCI transmission (also clears TX Empty flag on some platforms) */ + (void)FMSTR_SERIAL_DRV.IsTransmitRegEmpty(); + FMSTR_SERIAL_DRV.PutChar(FMSTR_SOB); + + /* TX interrupt enable, RX interrupt disable */ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + FMSTR_SERIAL_DRV.EnableReceiveInterrupt(FMSTR_FALSE); /* disable SCI receive interrupt */ + FMSTR_SERIAL_DRV.EnableTransmitInterrupt(FMSTR_TRUE); /* enable SCI transmit interrupt */ +#endif /* FMSTR_LONG_INTR || FMSTR_SHORT_INTR */ +} + +/****************************************************************************** + * + * @brief Output buffer transmission + * + * @param getTxChar Return character to be transmitted + * + * @return Non-zero when transmission is complete + * + * get ready buffer(prepare data to send) + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_Tx(FMSTR_BCHR *getTxChar) +{ + if (fmstr_nTxTodo > 0U) + { + /* fetch & send character ready to transmit */ + /*lint -e{534} ignoring return value */ + (void)FMSTR_ValueFromBuffer8(getTxChar, fmstr_pTxBuff); + + /* first, handle the replicated SOB characters */ + if (*getTxChar == FMSTR_SOB) + { + _fmstr_wFlags.flg.bTxLastCharSOB = _fmstr_wFlags.flg.bTxLastCharSOB != 0U ? 0U : 1U; + + if (_fmstr_wFlags.flg.bTxLastCharSOB != 0U) + { + /* yes, repeat the SOB next time */ + return FMSTR_FALSE; + } + } + + /* no, advance tx buffer pointer */ + fmstr_nTxTodo--; + fmstr_pTxBuff = FMSTR_SkipInBuffer(fmstr_pTxBuff, 1U); + return FMSTR_FALSE; + } + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Handle received character + * + * @param rxChar The character to be processed + * + * Handle the character received and -if the message is complete- call the + * protocol decode routine. + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_Rx(FMSTR_BCHR rxChar) +{ + FMSTR_SERIAL_FLAGS *pflg = &_fmstr_wFlags; + /* first, handle the replicated SOB characters */ + if (rxChar == FMSTR_SOB) + { + pflg->flg.bRxLastCharSOB = pflg->flg.bRxLastCharSOB != 0U ? 0U : 1U; + if (pflg->flg.bRxLastCharSOB != 0U) + { + /* this is either the first byte of replicated SOB or a */ + /* real Start-of-Block mark - we will decide next time in FMSTR_Rx */ + return FMSTR_FALSE; + } + } + + /* we have got a common character preceded by the SOB - */ + /* this is the command code! */ + if (pflg->flg.bRxLastCharSOB != 0U) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR Rx Frame start. Cmd: 0x%x\n", rxChar); +#endif + + /* reset receiving process */ + fmstr_pRxBuff = fmstr_pCommBuffer; + + FMSTR_Crc8Init(&fmstr_nRxCrc8); + FMSTR_Crc8AddByte(&fmstr_nRxCrc8, rxChar); + + *(fmstr_pRxBuff++) = rxChar; + fmstr_nRxTodo = 0; + + /* if the standard command was received, the message length will come in next byte */ + pflg->flg.bRxMsgLengthNext = 1U; + + /* command code stored & processed */ + pflg->flg.bRxLastCharSOB = 0U; + return FMSTR_FALSE; + } + + /* we are waiting for the length byte */ + if (pflg->flg.bRxMsgLengthNext != 0U) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR Rx Frame length: 0x%x\n", rxChar); +#endif + /* total data length and the checksum */ + fmstr_nRxTodo = (FMSTR_SIZE8)(rxChar + 1U); + FMSTR_Crc8AddByte(&fmstr_nRxCrc8, rxChar); + + *(fmstr_pRxBuff++) = rxChar; + + /* now read the data bytes */ + pflg->flg.bRxMsgLengthNext = 0U; + + return FMSTR_FALSE; + } + + /* waiting for a data byte? */ + if (fmstr_nRxTodo > 0U) + { + /* decrease number of expected bytes */ + fmstr_nRxTodo--; + /* was it the last byte of the message (checksum)? */ + if (fmstr_nRxTodo == 0U) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR Rx Checksum: 0x%x, expected: 0x%x\n", rxChar, fmstr_nRxCrc8); +#endif + + /* receive buffer overflow? */ + if (fmstr_pRxBuff == NULL) + { + _FMSTR_SendError(FMSTR_STC_CMDTOOLONG); + } + /* checksum error? */ + else if (fmstr_nRxCrc8 != rxChar) + { + _FMSTR_SendError(FMSTR_STC_CMDCSERR); + } + /* message is okay */ + else + { + FMSTR_BPTR pMessageIO = fmstr_pCommBuffer; + FMSTR_BOOL processed; + FMSTR_U8 cmd, size; + + /* command code comes first in the message */ + /*lint -e{534} return value is not used */ + pMessageIO = FMSTR_ValueFromBuffer8(&cmd, pMessageIO); + /* length of command follows */ + /*lint -e{534} return value is not used */ + pMessageIO = FMSTR_ValueFromBuffer8(&size, pMessageIO); + + /* do decode now! use "serial" as a globally unique pointer value as our identifier */ + processed = FMSTR_ProtocolDecoder(pMessageIO, size, cmd, (void *)"serial"); + FMSTR_UNUSED(processed); + } + + return FMSTR_TRUE; + } + /* not the last character yet */ + else + { + /* add this byte to checksum */ + FMSTR_Crc8AddByte(&fmstr_nRxCrc8, rxChar); + + /* is there still a space in the buffer? */ + if (fmstr_pRxBuff != NULL) + { + /*lint -e{946} pointer arithmetic is okay here (same array) */ + if (fmstr_pRxBuff < (fmstr_pCommBuffer + FMSTR_COMM_BUFFER_SIZE)) + { + /* store byte */ + *fmstr_pRxBuff++ = rxChar; + } + /* buffer is full! */ + else + { + /* NULL rx pointer means buffer overflow - but we still need */ + /* to receive all message characters (for the single-wire mode) */ + /* so keep "receiving" - but throw away all characters from now */ + fmstr_pRxBuff = NULL; + } + } + } + } + + return FMSTR_FALSE; +} + +/****************************************************************************** + * + * @brief Serial communication initialization + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialInit(void) +{ + /* initialize all state variables */ + _fmstr_wFlags.all = 0U; + fmstr_nTxTodo = 0U; + +#if FMSTR_DEBUG_LEVEL >= 2 + FMSTR_DEBUG_PRINTF("FMSTR SerialInit\n"); +#endif + + /* Check the interface if it's valid */ + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.Init != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.EnableTransmit != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.EnableReceive != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.IsTransmitRegEmpty != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.IsReceiveRegFull != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.IsTransmitterActive != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.PutChar != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.GetChar != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.Flush != NULL, FMSTR_FALSE); + +#if FMSTR_SHORT_INTR || FMSTR_LONG_INTR + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.EnableTransmitInterrupt != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.EnableTransmitCompleteInterrupt != NULL, FMSTR_FALSE); + FMSTR_ASSERT_RETURN(FMSTR_SERIAL_DRV.EnableReceiveInterrupt != NULL, FMSTR_FALSE); +#endif + + /* Call initialization of serial driver */ + if (FMSTR_SERIAL_DRV.Init() == FMSTR_FALSE) + { + return FMSTR_FALSE; + } + + /* Initialize Serial interface */ + FMSTR_SERIAL_DRV.EnableReceive(FMSTR_TRUE); /* enable SCI receive interrupt */ + FMSTR_SERIAL_DRV.EnableTransmit(FMSTR_TRUE); /* enable SCI transmit interrupt */ + +#if FMSTR_SHORT_INTR > 0 + _FMSTR_RingBuffCreate(&fmstr_rxQueue, fmstr_rxBuff, FMSTR_COMM_RQUEUE_SIZE); +#endif + +#if FMSTR_DEBUG_TX > 0 + /* this zero will initiate the test frame transmission + * as soon as possible during Listen */ + fmstr_nDebugTxPollCount = 0; +#endif + + /* start listening for commands */ + _FMSTR_Listen(); + +#if FMSTR_DEBUG_LEVEL >= 2 + FMSTR_DEBUG_PRINTF("FMSTR SerialInit done\n"); +#endif + + return FMSTR_TRUE; +} + +/******************************************************************************* + * + * @brief API: Serial Transport "Polling" call from the application main loop + * + * This function either handles all the SCI communication (polling-only mode = + * FMSTR_POLL_DRIVEN) or decodes messages received on the background by SCI interrupt + * (short-interrupt mode = FMSTR_SHORT_INTR). + * + *******************************************************************************/ + +static void _FMSTR_SerialPoll(void) +{ + /* invoke low-level driver's poll if needed */ + if (FMSTR_SERIAL_DRV.Poll != NULL) + { + FMSTR_SERIAL_DRV.Poll(); + } + +#if FMSTR_POLL_DRIVEN > 0 + + /* polled SCI mode */ + FMSTR_ProcessSerial(); + +#elif FMSTR_SHORT_INTR > 0 + /* process queued SCI characters */ + _FMSTR_RxDequeue(); +#endif + +#if FMSTR_DEBUG_TX > 0 + /* down-counting the polls for heuristic time measurement */ + if (fmstr_nDebugTxPollCount != 0 && fmstr_nDebugTxPollCount > FMSTR_DEBUG_TX_POLLCNT_MIN) + { + fmstr_nDebugTxPollCount--; + } +#endif +} + +#endif /* !(FMSTR_DISABLE) */ diff --git a/middleware/freemaster/src/common/freemaster_serial.h b/middleware/freemaster/src/common/freemaster_serial.h new file mode 100644 index 0000000..648fff9 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_serial.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial communication + */ + +#ifndef __FREEMASTER_SERIAL_H +#define __FREEMASTER_SERIAL_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial.h +#endif + +/****************************************************************************** +* Serial transport related configuration checks +******************************************************************************/ + +/* obsolete transport and driver macros */ +#if defined(FMSTR_USE_SCI) || defined(FMSTR_USE_LPUART) || defined(FMSTR_USE_ESCI) || defined(FMSTR_USE_UART) || \ + defined(FMSTR_USE_JTAG) || defined(FMSTR_USE_USB_CDC) || defined(FMSTR_USE_MQX_IO) || defined(FMSTR_USE_MBED) + #warning Obsolete configuration option detected. Define FMSTR_TRANSPORT as FMSTR_SERIAL, and define also FMSTR_SERIAL_DRV option. +#endif + +/* transport MUST be defined in configuration */ +#if !defined(FMSTR_SERIAL_DRV) + #error No FreeMASTER communication serial driver interface is enabled. Please choose the driver (FMSTR_SERIAL_DRV) or set FMSTR_DISABLE option to 1. +#endif + +/* Switch serial for single wire communication */ +#ifndef FMSTR_SERIAL_SINGLEWIRE + #define FMSTR_SERIAL_SINGLEWIRE 0 +#endif + +#if FMSTR_COMM_BUFFER_SIZE > 254 + #error FMSTR_COMM_BUFFER_SIZE must be set less than 254 on Serial transport. +#endif + +#if FMSTR_SHORT_INTR > 0 + /* default short-interrupt FIFO size */ + #ifndef FMSTR_COMM_RQUEUE_SIZE + #define FMSTR_COMM_RQUEUE_SIZE 32 + #endif + + #if FMSTR_COMM_RQUEUE_SIZE == 0 + #undef FMSTR_COMM_RQUEUE_SIZE + #define FMSTR_COMM_RQUEUE_SIZE 32 + #endif +#endif + +/* obsolete dynamic address selection */ +#if defined(FMSTR_SCI_BASE_DYNAMIC) + #warning The FMSTR_SCI_BASE_DYNAMIC is now obsolete and may be removed. +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/* Serial Driver interface between the Serial layer and hardware driver */ +typedef struct FMSTR_SERIAL_DRV_INTF_S +{ + FMSTR_BOOL (*Init)(void); /* Initialization */ + void (*EnableTransmit)(FMSTR_BOOL enable); /* Enable/Disable transmitter */ + void (*EnableReceive)(FMSTR_BOOL enable); /* Enable/Disable receiver */ + void (*EnableTransmitInterrupt)(FMSTR_BOOL enable); /* Enable/Disable interrupt from transmit register empty event */ + void (*EnableTransmitCompleteInterrupt)(FMSTR_BOOL enable); /* Enable/Disable interrupt from transmit complete event */ + void (*EnableReceiveInterrupt)(FMSTR_BOOL enable); /* Enable/Disable interrupt from receive register full event */ + FMSTR_BOOL (*IsTransmitRegEmpty)(void); /* Returns TRUE if the transmit register is empty, and it's possible to put next char */ + FMSTR_BOOL (*IsReceiveRegFull)(void); /* Returns TRUE if the receive register is full, and it's possible to get received char */ + FMSTR_BOOL (*IsTransmitterActive)(void); /* Returns TRUE if the transmitter is still active */ + void (*PutChar)(FMSTR_BCHR ch); /* Transmit character */ + FMSTR_BCHR (*GetChar)(void); /* Receive character */ + void (*Flush)(void); /* Transmit-flush all buffered data */ + void (*Poll)(void); /* General poll call (optional) */ +} FMSTR_SERIAL_DRV_INTF; + +/****************************************************************************** +* Functions definitions +******************************************************************************/ + +/* Serial Process function - This function is called by communication sub system, + in case of new data received or next data byte has been transmitted. */ +void FMSTR_ProcessSerial(void); + +/* If defined in freemaster_cfg.h, make sure the SERIAL driver interface is also declared properly. */ +#ifdef FMSTR_SERIAL_DRV +extern const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_DRV; +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_SERIAL_H */ diff --git a/middleware/freemaster/src/common/freemaster_sha.c b/middleware/freemaster/src/common/freemaster_sha.c new file mode 100644 index 0000000..80800f3 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_sha.c @@ -0,0 +1,218 @@ +/* + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - protocol implementation + */ + +/* + * This code is based on original implementation by Brad Conte. Extended to + * support big-endian platforms for FreeMASTER driver needs. + * Origin: https://github.com/B-Con/crypto-algorithms + * + * Author: Brad Conte (brad AT bradconte.com) + * Copyright: + * Disclaimer: This code is presented "as is" without any guarantees. + * Details: Implementation of the SHA1 hashing algorithm. + Algorithm specification can be found here: + * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf + This implementation uses little endian byte order. + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +#if FMSTR_DISABLE == 0 + +/***************************************************************************** + * Local Functions + ******************************************************************************/ + +#define ROTLEFT(a, b) (((a) << (b)) | ((a) >> (32 - (b)))) + +static void FMSTR_Sha1Transform(FMSTR_SHA1_CTX *ctx, const FMSTR_U8 *data) +{ + // save 352 bytes on stack by making these static, we never run more instances than one anyway + static FMSTR_U32 a, b, c, d, e, i, j, t, m[80]; + + for (i = 0; i < 16U; i++) + { + j = i * 4U; + + a = ((FMSTR_U32)data[j]) << 24; + a += ((FMSTR_U32)data[j + 1U]) << 16; + a += ((FMSTR_U32)data[j + 2U]) << 8; + a += data[j + 3U]; + m[i] = a; + } + + for (; i < 80U; i++) + { + m[i] = (m[i - 3U] ^ m[i - 8U] ^ m[i - 14U] ^ m[i - 16U]); + m[i] = (m[i] << 1) | (m[i] >> 31); + } + + a = ctx->state[0]; + b = ctx->state[1]; + c = ctx->state[2]; + d = ctx->state[3]; + e = ctx->state[4]; + + for (i = 0; i < 20U; i++) + { + t = ROTLEFT(a, 5) + ((b & c) ^ (~b & d)) + e + ctx->k[0] + m[i]; + e = d; + d = c; + c = ROTLEFT(b, 30); + b = a; + a = t; + } + + for (; i < 40U; i++) + { + t = ROTLEFT(a, 5) + (b ^ c ^ d) + e + ctx->k[1] + m[i]; + e = d; + d = c; + c = ROTLEFT(b, 30); + b = a; + a = t; + } + + for (; i < 60U; i++) + { + t = ROTLEFT(a, 5) + ((b & c) ^ (b & d) ^ (c & d)) + e + ctx->k[2] + m[i]; + e = d; + d = c; + c = ROTLEFT(b, 30); + b = a; + a = t; + } + + for (; i < 80U; i++) + { + t = ROTLEFT(a, 5) + (b ^ c ^ d) + e + ctx->k[3] + m[i]; + e = d; + d = c; + c = ROTLEFT(b, 30); + b = a; + a = t; + } + + ctx->state[0] += a; + ctx->state[1] += b; + ctx->state[2] += c; + ctx->state[3] += d; + ctx->state[4] += e; +} + +/***************************************************************************** + * API Functions + ******************************************************************************/ + +void FMSTR_Sha1Init(FMSTR_SHA1_CTX *ctx) +{ + ctx->datalen = 0U; + ctx->bitlen = 0U; + + ctx->state[0] = 0x67452301UL; + ctx->state[1] = 0xEFCDAB89UL; + ctx->state[2] = 0x98BADCFEUL; + ctx->state[3] = 0x10325476UL; + ctx->state[4] = 0xc3d2e1f0UL; + + ctx->k[0] = 0x5a827999UL; + ctx->k[1] = 0x6ed9eba1UL; + ctx->k[2] = 0x8f1bbcdcUL; + ctx->k[3] = 0xca62c1d6UL; +} + +void FMSTR_Sha1Update(FMSTR_SHA1_CTX *ctx, const FMSTR_U8 *data, FMSTR_SIZE len) +{ + FMSTR_SIZE i; + + for (i = 0U; i < len; i++) + { + ctx->data[ctx->datalen] = data[i]; + ctx->datalen++; + if (ctx->datalen == 64U) + { + FMSTR_Sha1Transform(ctx, ctx->data); + ctx->bitlen += 512U; + ctx->datalen = 0U; + } + } +} + +void FMSTR_Sha1Final(FMSTR_SHA1_CTX *ctx, FMSTR_U8 *hash) +{ + FMSTR_U32 i; + + i = ctx->datalen; + + // Pad whatever data is left in the buffer. + if (ctx->datalen < 56U) + { + ctx->data[i++] = 0x80U; + while (i < 56U) + { + ctx->data[i++] = 0x00U; + } + } + else + { + ctx->data[i++] = 0x80U; + while (i < 64U) + { + ctx->data[i++] = 0x00U; + } + FMSTR_Sha1Transform(ctx, ctx->data); + FMSTR_MemSet(ctx->data, 0U, 56U); + } + + // Append to the padding the total message's length in bits and transform. + i = ctx->datalen * 8U; + ctx->bitlen += (FMSTR_U64)i; + ctx->data[63] = (FMSTR_U8)(ctx->bitlen); + ctx->data[62] = (FMSTR_U8)(ctx->bitlen >> 8); + ctx->data[61] = (FMSTR_U8)(ctx->bitlen >> 16); + ctx->data[60] = (FMSTR_U8)(ctx->bitlen >> 24); + ctx->data[59] = (FMSTR_U8)(ctx->bitlen >> 32); + ctx->data[58] = (FMSTR_U8)(ctx->bitlen >> 40); + ctx->data[57] = (FMSTR_U8)(ctx->bitlen >> 48); + ctx->data[56] = (FMSTR_U8)(ctx->bitlen >> 56); + FMSTR_Sha1Transform(ctx, ctx->data); + +#if FMSTR_PLATFORM_BIG_ENDIAN > 0 + /* copy state to output buffer */ + for (i = 0U; i < 5U; i++) + { + *(FMSTR_U32 *)(hash + i * 4U) = ctx->state[i]; + } +#else + /* copy while reversing byte order */ + for (i = 0U; i < 4U; i++) + { + FMSTR_SIZE shift = 24U - i * 8U; + hash[i] = (FMSTR_U8)((ctx->state[0] >> shift) & 0xffU); + hash[i + 4U] = (FMSTR_U8)((ctx->state[1] >> shift) & 0xffU); + hash[i + 8U] = (FMSTR_U8)((ctx->state[2] >> shift) & 0xffU); + hash[i + 12U] = (FMSTR_U8)((ctx->state[3] >> shift) & 0xffU); + hash[i + 16U] = (FMSTR_U8)((ctx->state[4] >> shift) & 0xffU); + } +#endif +} + +#endif /* !FMSTR_DISABLE */ diff --git a/middleware/freemaster/src/common/freemaster_tsa.c b/middleware/freemaster/src/common/freemaster_tsa.c new file mode 100644 index 0000000..2a95370 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_tsa.c @@ -0,0 +1,516 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - TSA + */ + +#include "freemaster.h" +#include "freemaster_private.h" +#include "freemaster_protocol.h" +#include "freemaster_utils.h" + +#if FMSTR_USE_TSA > 0 && FMSTR_DISABLE == 0 + +/* global variables */ +FMSTR_TSA_CDECL char FMSTR_TSA_POINTER[] = { + (char)(0xe0 | + (sizeof(void *) == 2 ? + 0x01 : + sizeof(void *) == 4 ? + 0x02 : + sizeof(void *) == 8 ? 0x03 : 0x00)), /* size of pointer is not 2,4 nor 8 (probably S12 platform) */ + (char)0}; /* string-terminating zero */ + +#if FMSTR_USE_TSA_DYNAMIC > 0 +static FMSTR_SIZE fmstr_tsaBuffSize; /* Dynamic TSA buffer size */ +static FMSTR_ADDR fmstr_tsaBuffAddr; /* Dynamic TSA buffer address */ +static FMSTR_SIZE fmstr_tsaTableIndex; + +#endif + +/****************************************************************************** + * + * @brief TSA Initialization + * + ******************************************************************************/ +static FMSTR_BOOL _FMSTR_IsMemoryMapped(const char *type, unsigned long info); + +FMSTR_BOOL FMSTR_InitTsa(void) +{ +#if FMSTR_USE_TSA_DYNAMIC > 0 + fmstr_tsaTableIndex = 0; + fmstr_tsaBuffSize = 0; + fmstr_tsaBuffAddr = (FMSTR_ADDR)NULL; +#endif + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Assigning memory to dynamic TSA table + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_SetUpTsaBuff(FMSTR_ADDR buffAddr, FMSTR_SIZE buffSize) +{ +#if FMSTR_USE_TSA_DYNAMIC > 0 + /* only allow to clear or set when cleared */ + if (FMSTR_ADDR_VALID(buffAddr) == FMSTR_FALSE || FMSTR_ADDR_VALID(fmstr_tsaBuffAddr) == FMSTR_FALSE) + { + /* TSA table must be aligned on pointer size */ + FMSTR_SIZE alignment = FMSTR_GetAlignmentCorrection(buffAddr, sizeof(void *)); + fmstr_tsaBuffAddr = buffAddr + alignment; + fmstr_tsaBuffSize = buffSize - alignment; + return FMSTR_TRUE; + } + else + { + return FMSTR_FALSE; + } +#else + return FMSTR_FALSE; +#endif +} + +/****************************************************************************** + * + * @brief Retrieving entry from dynamic TSA table + * + ******************************************************************************/ + +#if FMSTR_USE_TSA_DYNAMIC > 0 +FMSTR_TSA_FUNC_PROTO(dynamic_tsa) +{ + if (tableSize != NULL) + { + *tableSize = (FMSTR_SIZE)(fmstr_tsaTableIndex * sizeof(FMSTR_TSA_ENTRY)); + } + return (const FMSTR_TSA_ENTRY *)FMSTR_CAST_ADDR_TO_PTR(fmstr_tsaBuffAddr); +} +#endif + +/****************************************************************************** + * + * @brief Add entry to a dynamic TSA table + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_TsaAddVar(FMSTR_TSATBL_STRPTR tsaName, + FMSTR_TSATBL_STRPTR tsaType, + FMSTR_TSATBL_VOIDPTR varAddr, + FMSTR_SIZE32 varSize, + FMSTR_SIZE flags) +{ +#if FMSTR_USE_TSA_DYNAMIC > 0 + /* the new TSA table entry must fit into the memory buffer */ + if (((fmstr_tsaTableIndex + 1U) * sizeof(FMSTR_TSA_ENTRY)) <= fmstr_tsaBuffSize) + { + FMSTR_TSATBL_VOIDPTR info = FMSTR_TSA_INFO2(varSize, flags); + FMSTR_TSA_ENTRY *pItem; + FMSTR_SIZE i; + + /* Check if this record is already in table */ + for (i = 0; i < fmstr_tsaTableIndex; i++) + { + pItem = &((FMSTR_TSA_ENTRY *)FMSTR_CAST_ADDR_TO_PTR(fmstr_tsaBuffAddr))[i]; + + if (FMSTR_StrCmp(pItem->name.p, tsaName) != 0) + { + continue; /* name is different */ + } + if (pItem->type.p != tsaType) + { + continue; /* type is different */ + } + if (pItem->addr.p != varAddr) + { + continue; /* address is different */ + } + if (pItem->info.p != info) + { + continue; /* size or attributes are different */ + } + + /* the same entry already exists, consider it added okay */ + return FMSTR_TRUE; + } + + /* add the entry to the last-used position */ + pItem = &((FMSTR_TSA_ENTRY *)FMSTR_CAST_ADDR_TO_PTR(fmstr_tsaBuffAddr))[i]; + + pItem->name.p = FMSTR_TSATBL_STRPTR_CAST(tsaName); + pItem->type.p = FMSTR_TSATBL_STRPTR_CAST(tsaType); + pItem->addr.p = FMSTR_TSATBL_VOIDPTR_CAST(varAddr); + pItem->info.p = FMSTR_TSATBL_VOIDPTR_CAST(info); + fmstr_tsaTableIndex++; + return FMSTR_TRUE; + } + else + { + return FMSTR_FALSE; + } +#else + return FMSTR_FALSE; +#endif +} + +/****************************************************************************** + * + * @brief Handling GETTSAINFO and GETTSAINFO_EX command + * + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_GetTsaInfo(FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + volatile FMSTR_BPTR response = msgBuffIO; + const FMSTR_TSA_ENTRY *tsaTbl; + FMSTR_SIZE tblIndex; + FMSTR_SIZE tblSize = 0U; + FMSTR_U8 tblFlags; + + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(retStatus != NULL); + + /* Get ULEB index of table the PC is requesting */ + msgBuffIO = FMSTR_SizeFromBuffer(&tblIndex, msgBuffIO); + FMSTR_UNUSED(msgBuffIO); + + /* TSA flags */ + tblFlags = FMSTR_TSA_VERSION | FMSTR_TSA_FLAGS; + + /* sizeof TSA table entry items */ + /*lint -e{506,774} constant value boolean */ + if ((sizeof(void *)) == 2U) + { + tblFlags |= FMSTR_TSA_INFO_ADRSIZE_16; + } + else + { + if ((sizeof(void *)) <= 4U) + { + tblFlags |= FMSTR_TSA_INFO_ADRSIZE_32; + } + else + { + tblFlags |= FMSTR_TSA_INFO_ADRSIZE_64; + } + } + + /* flags */ + response = FMSTR_ValueToBuffer8(response, tblFlags); + + /* get the table (or NULL if no table on given index) */ + tsaTbl = FMSTR_TsaGetTable(tblIndex, &tblSize); + + /* table size in bytes */ + tblSize *= FMSTR_CFG_BUS_WIDTH; + response = FMSTR_SizeToBuffer(response, tblSize); + + /* table address */ + response = FMSTR_AddressToBuffer(response, FMSTR_CAST_PTR_TO_ADDR(tsaTbl)); + + /* success */ + *retStatus = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + return response; +} + +/****************************************************************************** + * + * @brief Handling GETSTRLEN and GETSTRLEN_EX commands + * + * @param msgBuffIO - original command (in) and response buffer (out) + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_GetStringLen(FMSTR_BPTR msgBuffIO, FMSTR_U8 *retStatus) +{ + FMSTR_BPTR response = msgBuffIO; + FMSTR_ADDR strAddr; + FMSTR_SIZE len = 0U; + + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(retStatus != NULL); + + msgBuffIO = FMSTR_AddressFromBuffer(&strAddr, msgBuffIO); + FMSTR_UNUSED(msgBuffIO); + + len = FMSTR_StrLen((FMSTR_CHAR *)strAddr); + + /* return strign size in bytes (even on 16bit DSP) */ + len *= FMSTR_CFG_BUS_WIDTH; + + /* success */ + *retStatus = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + return FMSTR_SizeToBuffer(response, len); +} + +/****************************************************************************** + * + * @brief Helper (inline) function for TSA memory region check + * + * @param addrUser - address of region to be checked + * @param sizeUser - size of region to be checked + * @param addrSafe - address of known "safe" region + * @param sizeSafe - size of safe region + * + * @return This function returns non-zero if given user space is safe + * (i.e. it lies in given safe space) + * + ******************************************************************************/ + +/* declare function prototype */ +static FMSTR_BOOL FMSTR_CheckMemSpace(FMSTR_ADDR addrUser, + FMSTR_SIZE sizeUser, + FMSTR_ADDR addrSafe, + FMSTR_SIZE sizeSafe); + +static FMSTR_BOOL FMSTR_CheckMemSpace(FMSTR_ADDR addrUser, + FMSTR_SIZE sizeUser, + FMSTR_ADDR addrSafe, + FMSTR_SIZE sizeSafe) +{ + FMSTR_BOOL ret = FMSTR_FALSE; + +#ifdef __HCS12X__ + /* convert from logical to global if needed */ + addrUser = FMSTR_FixHcs12xAddr(addrUser); + addrSafe = FMSTR_FixHcs12xAddr(addrSafe); +#endif + + if (addrUser >= addrSafe) + { + ret = (FMSTR_BOOL)(((addrUser + sizeUser) <= (addrSafe + sizeSafe)) ? FMSTR_TRUE : FMSTR_FALSE); + } + + return ret; +} + +/****************************************************************************** + * + * @brief Check wether given memory region is "safe" (covered by TSA) + * + * @param varAddr - address of the memory to be checked + * @param varSize - size of the memory to be checked + * @param writeAccess - write access is required + * + * @return This function returns non-zero if user space is safe + * + ******************************************************************************/ + +FMSTR_BOOL FMSTR_CheckTsaSpace(FMSTR_ADDR varAddr, FMSTR_SIZE varSize, FMSTR_BOOL writeAccess) +{ + const FMSTR_TSA_ENTRY *pte; + FMSTR_SIZE tableIndex; + FMSTR_SIZE i, cnt; + unsigned long info; + const char *type; + +#if FMSTR_CFG_BUS_WIDTH >= 2U + /* TSA tables use sizeof() operator which returns size in "bus-widths" (e.g. 56F8xx) */ + varSize = (varSize + 1) / FMSTR_CFG_BUS_WIDTH; +#endif + + /* to be as fast as possible during normal operation, + check variable entries in all tables first */ + tableIndex = 0U; + while ((pte = FMSTR_TsaGetTable(tableIndex, &cnt)) != NULL) + { + /* number of items in a table */ + cnt /= (FMSTR_SIZE)sizeof(FMSTR_TSA_ENTRY); + + /* all table entries */ + for (i = 0U; i < cnt; i++) + { + if (sizeof(pte->addr.p) < sizeof(pte->addr.n)) + { + info = (unsigned long)pte->info.n; + } + else + { + info = (unsigned long)pte->info.p; + } + + type = pte->type.p; + + /* variable entry only (also check read-write flag) */ + if (_FMSTR_IsMemoryMapped(type, info) != FMSTR_FALSE && + (writeAccess == FMSTR_FALSE || ((info & FMSTR_TSA_INFO_VAR_MASK) == FMSTR_TSA_INFO_RW_VAR))) + { + /* need to take the larger of the two in union (will be optimized by compiler anyway) */ + if (sizeof(pte->addr.p) < sizeof(pte->addr.n)) + { + if (FMSTR_CheckMemSpace(varAddr, varSize, pte->addr.n, (FMSTR_SIZE)(info >> 2)) != FMSTR_FALSE) + { + return FMSTR_TRUE; /* access granted! */ + } + } + else + { + if (FMSTR_CheckMemSpace(varAddr, varSize, (FMSTR_ADDR)pte->addr.p, (FMSTR_SIZE)(info >> 2)) != + FMSTR_FALSE) + { + return FMSTR_TRUE; /* access granted! */ + } + } + } + + pte++; + } + + tableIndex++; + } + + /* no more writable memory chunks available */ + if (writeAccess != FMSTR_FALSE) + { + return FMSTR_FALSE; + } + + /* allow reading of recorder buffer */ +#if FMSTR_USE_RECORDER > 0 + if (FMSTR_IsInRecBuffer(varAddr, varSize) != FMSTR_FALSE) + { + return FMSTR_TRUE; + } +#endif + + /* allow reading of any C-constant string referenced in TSA tables */ + tableIndex = 0U; + while ((pte = FMSTR_TsaGetTable(tableIndex, &cnt)) != NULL) + { + /* allow reading of the TSA table itself */ + if (FMSTR_CheckMemSpace(varAddr, varSize, (FMSTR_ADDR)(FMSTR_TSA_ENTRY *)pte, cnt) != FMSTR_FALSE) + { + return FMSTR_TRUE; + } + + /* number of items in a table */ + cnt /= (FMSTR_SIZE)sizeof(FMSTR_TSA_ENTRY); + + /* all table entries */ + for (i = 0U; i < cnt; i++) + { + /* system strings are always accessible as C-pointers */ + if (pte->name.p != NULL) + { + if (FMSTR_CheckMemSpace(varAddr, varSize, (FMSTR_ADDR)(pte->name.p), FMSTR_StrLen(pte->name.p)) != + FMSTR_FALSE) + { + return FMSTR_TRUE; + } + } + + if (pte->type.p != NULL) + { + if (FMSTR_CheckMemSpace(varAddr, varSize, (FMSTR_ADDR)(pte->type.p), FMSTR_StrLen(pte->type.p)) != + FMSTR_FALSE) + { + return FMSTR_TRUE; + } + } + + pte++; + } + + tableIndex++; + } + + /* no valid TSA entry found => not-safe to access the memory */ + return FMSTR_FALSE; +} + +/* Check type of the entry. */ +static FMSTR_BOOL _FMSTR_IsMemoryMapped(const char *type, unsigned long info) +{ + FMSTR_ASSERT(type != NULL); + + /* If type is special non-memory type or memeber structure (0b00 in info) */ + if (type[0] == FMSTR_TSA_SPECIAL_NOMEM[0] || (info & FMSTR_TSA_INFO_VAR_MASK) == 0U) + { + return FMSTR_FALSE; + } + + return FMSTR_TRUE; +} + +/* Find TSA table row with user resource by resource ID */ +const FMSTR_TSA_ENTRY *FMSTR_FindUresInTsa(FMSTR_ADDR resourceId) +{ + const FMSTR_TSA_ENTRY *pte; + FMSTR_SIZE tableIndex; + FMSTR_SIZE i, cnt; + + tableIndex = 0U; + while ((pte = FMSTR_TsaGetTable(tableIndex, &cnt)) != NULL) + { + /* number of items in a table */ + cnt /= (FMSTR_SIZE)sizeof(FMSTR_TSA_ENTRY); + + /* all table entries */ + for (i = 0U; i < cnt; i++) + { + if (pte->addr.n == resourceId) + { + return pte; + } + } + + tableIndex++; + } + + return NULL; +} + +#else /* (FMSTR_USE_TSA) && (!(FMSTR_DISABLE)) */ + +/* use void TSA API functions */ +FMSTR_BOOL FMSTR_SetUpTsaBuff(FMSTR_ADDR buffAddr, FMSTR_SIZE buffSize) +{ + FMSTR_UNUSED(buffAddr); + FMSTR_UNUSED(buffSize); + return FMSTR_FALSE; +} + +FMSTR_BOOL FMSTR_TsaAddVar(FMSTR_TSATBL_STRPTR tsaName, + FMSTR_TSATBL_STRPTR tsaType, + FMSTR_TSATBL_VOIDPTR varAddr, + FMSTR_SIZE32 varSize, + FMSTR_SIZE flags) +{ + FMSTR_UNUSED(tsaName); + FMSTR_UNUSED(tsaType); + FMSTR_UNUSED(varAddr); + FMSTR_UNUSED(varSize); + FMSTR_UNUSED(flags); + return FMSTR_FALSE; +} + +/*lint -efile(766, freemaster_protocol.h) include file is not used in this case */ + +#endif /* (FMSTR_USE_TSA) && (!(FMSTR_DISABLE)) */ diff --git a/middleware/freemaster/src/common/freemaster_tsa.h b/middleware/freemaster/src/common/freemaster_tsa.h new file mode 100644 index 0000000..8598ebb --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_tsa.h @@ -0,0 +1,406 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - TSA + */ + +#ifndef __FREEMASTER_TSA_H +#define __FREEMASTER_TSA_H + +#include "freemaster_defcfg.h" + +/***************************************************************************** + Target-side Address translation structures and macros +******************************************************************************/ + +/* current TSA version */ +#define FMSTR_TSA_VERSION 3U + +/* TSA flags carried in TSA_ENTRY.info (except the first entry in table) */ +#define FMSTR_TSA_INFO_ENTRYTYPE_MASK 0x0003U /* flags reserved for TSA_ENTRY use */ +#define FMSTR_TSA_INFO_NON_VAR 0x0000U /* ENTRYTYPE: non-variable object. The "type" determines the real type. */ +#define FMSTR_TSA_INFO_RO_VAR 0x0001U /* ENTRYTYPE: read-only variable */ +#define FMSTR_TSA_INFO_RO_FLASH 0x0002U /* ENTRYTYPE: read-only variable located in flash */ +#define FMSTR_TSA_INFO_RW_VAR 0x0003U /* ENTRYTYPE: read-write variable */ + +#define FMSTR_TSA_INFO_VAR_MASK 0x03U /* R/W flags in info */ + +/* pointer types used in TSA tables can be overridden in freemaster.h */ +/* (this is why macros are used instead of typedefs) */ +#ifndef FMSTR_TSATBL_STRPTR +#define FMSTR_TSATBL_STRPTR const char * +#endif +#ifndef FMSTR_TSATBL_VOIDPTR +#define FMSTR_TSATBL_VOIDPTR volatile const void * +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/* TSA table entry. The unions inside assures variables sized enough to */ +/* accommodate both the C-pointer and the user-requested size (FMSTR_ADDR) */ +#if defined(__S12Z__) +typedef struct +{ + /* sizeof(FMSTR_ADDR) is 3 on S12Z platform. We need an extra byte to align to 4 bytes. + * An extra byte is put in front of each entry as S12Z is a big-endian machine. */ + FMSTR_U8 dummy0; + union + { + FMSTR_TSATBL_STRPTR p; + FMSTR_ADDR n; + } name; + FMSTR_U8 dummy1; + union + { + FMSTR_TSATBL_STRPTR p; + FMSTR_ADDR n; + } type; + FMSTR_U8 dummy2; + union + { + FMSTR_TSATBL_VOIDPTR p; + FMSTR_ADDR n; + } addr; + FMSTR_U8 dummy3; + union + { + FMSTR_TSATBL_VOIDPTR p; + FMSTR_ADDR n; + } info; +} FMSTR_TSA_ENTRY; + +/* dummy member initializers */ +#define FMSTR_TSATBL_FILL_PRE 0, +#define FMSTR_TSATBL_FILL_POST + +#else /* defined(__S12Z__) */ + +typedef struct +{ + /* Generic table entry on little-endian systems */ + union + { + FMSTR_TSATBL_STRPTR p; + FMSTR_ADDR n; + } name; + union + { + FMSTR_TSATBL_STRPTR p; + FMSTR_ADDR n; + } type; + union + { + FMSTR_TSATBL_VOIDPTR p; + FMSTR_ADDR n; + } addr; + union + { + FMSTR_TSATBL_VOIDPTR p; + FMSTR_ADDR n; + } info; +} FMSTR_TSA_ENTRY; + +/* no dummy members */ +#define FMSTR_TSATBL_FILL_PRE +#define FMSTR_TSATBL_FILL_POST + +#endif /* defined(__S12Z__) */ + +#ifdef __cplusplus +} +#endif + +#ifndef FMSTR_TSATBL_STRPTR_CAST +#define FMSTR_TSATBL_STRPTR_CAST(x) ((FMSTR_TSATBL_STRPTR)(x)) +#endif +#ifndef FMSTR_TSATBL_STRPTR_ENTRY +#define FMSTR_TSATBL_STRPTR_ENTRY(x) FMSTR_TSATBL_FILL_PRE{FMSTR_TSATBL_STRPTR_CAST(x)} FMSTR_TSATBL_FILL_POST +#endif +#ifndef FMSTR_TSATBL_VOIDPTR_CAST +#define FMSTR_TSATBL_VOIDPTR_CAST(x) ((FMSTR_TSATBL_VOIDPTR)(x)) +#endif +#ifndef FMSTR_TSATBL_VOIDPTR_ENTRY +#define FMSTR_TSATBL_VOIDPTR_ENTRY(x) FMSTR_TSATBL_FILL_PRE{FMSTR_TSATBL_VOIDPTR_CAST(x)} FMSTR_TSATBL_FILL_POST +#endif + +/* list of available types for TSA table definition */ +#define FMSTR_TSA_MEMBER_CFG(parenttype, name, type) \ + FMSTR_TSATBL_STRPTR_ENTRY(#name), FMSTR_TSATBL_STRPTR_ENTRY(type), \ + FMSTR_TSATBL_VOIDPTR_ENTRY(&((parenttype *)0)->name), \ + FMSTR_TSATBL_VOIDPTR_ENTRY(FMSTR_TSA_INFO1(((parenttype *)0)->name, FMSTR_TSA_INFO_NON_VAR)), + +#define FMSTR_TSA_RO_VAR_CFG(name, type) \ + FMSTR_TSATBL_STRPTR_ENTRY(#name), FMSTR_TSATBL_STRPTR_ENTRY(type), FMSTR_TSATBL_VOIDPTR_ENTRY(&(name)), \ + FMSTR_TSATBL_VOIDPTR_ENTRY(FMSTR_TSA_INFO1(name, FMSTR_TSA_INFO_RO_VAR)), + +#define FMSTR_TSA_RW_VAR_CFG(name, type) \ + FMSTR_TSATBL_STRPTR_ENTRY(#name), FMSTR_TSATBL_STRPTR_ENTRY(type), FMSTR_TSATBL_VOIDPTR_ENTRY(&(name)), \ + FMSTR_TSATBL_VOIDPTR_ENTRY(FMSTR_TSA_INFO1(name, FMSTR_TSA_INFO_RW_VAR)), + +#define FMSTR_TSA_RO_MEM_CFG(name, type, addr, size) \ + FMSTR_TSATBL_STRPTR_ENTRY(#name), FMSTR_TSATBL_STRPTR_ENTRY(type), FMSTR_TSATBL_VOIDPTR_ENTRY(addr), \ + FMSTR_TSATBL_VOIDPTR_ENTRY(FMSTR_TSA_INFO2(size, FMSTR_TSA_INFO_RO_VAR)), + +#define FMSTR_TSA_RW_MEM_CFG(name, type, addr, size) \ + FMSTR_TSATBL_STRPTR_ENTRY(#name), FMSTR_TSATBL_STRPTR_ENTRY(type), FMSTR_TSATBL_VOIDPTR_ENTRY(addr), \ + FMSTR_TSATBL_VOIDPTR_ENTRY(FMSTR_TSA_INFO2(size, FMSTR_TSA_INFO_RW_VAR)), + +#define FMSTR_TSA_RO_ENTRY(name_string, type_string, addr, size) \ + FMSTR_TSATBL_STRPTR_ENTRY(name_string), FMSTR_TSATBL_STRPTR_ENTRY(type_string), FMSTR_TSATBL_VOIDPTR_ENTRY(addr), \ + FMSTR_TSATBL_VOIDPTR_ENTRY(FMSTR_TSA_INFO2(size, FMSTR_TSA_INFO_RW_VAR)), + +#define FMSTR_TSA_NOMEM_SIZE(name_string, type_string, addr, size) \ + FMSTR_TSATBL_STRPTR_ENTRY(name_string), FMSTR_TSATBL_STRPTR_ENTRY(type_string), FMSTR_TSATBL_VOIDPTR_ENTRY(addr), \ + FMSTR_TSATBL_VOIDPTR_ENTRY(FMSTR_TSA_INFO2(size, FMSTR_TSA_INFO_NON_VAR)), + +#define FMSTR_TSA_NOMEM_NOSIZE(name_string, type_string, addr, size) \ + FMSTR_TSATBL_STRPTR_ENTRY(name_string), FMSTR_TSATBL_STRPTR_ENTRY(type_string), FMSTR_TSATBL_VOIDPTR_ENTRY(addr), \ + FMSTR_TSATBL_VOIDPTR_ENTRY(size), + +/************************************************************************* + * TSA "Base Types", all start with one (non-printable) character. + * Type is retrieved by PC and parsed according to the binary format of: + * "111STTZZ" where TT=type[int,frac,fp,special] S=signed ZZ=size[1,2,4,8] + * "11101100" is a special information block (not a real TSA symbol). + */ + +/* S=0 TT=int */ +#define FMSTR_TSA_UINT8 "\xE0" +#define FMSTR_TSA_UINT16 "\xE1" +#define FMSTR_TSA_UINT32 "\xE2" +#define FMSTR_TSA_UINT64 "\xE3" +/* S=1 TT=int */ +#define FMSTR_TSA_SINT8 "\xF0" +#define FMSTR_TSA_SINT16 "\xF1" +#define FMSTR_TSA_SINT32 "\xF2" +#define FMSTR_TSA_SINT64 "\xF3" +/* S=0 TT=frac */ +#define FMSTR_TSA_UFRAC_UQ(m, n) "\xE4:" #m "." #n /* UQm.n fractional m+n=bitsize */ +#define FMSTR_TSA_UFRAC16 "\xE5" /* standard UQ1.15 */ +#define FMSTR_TSA_UFRAC32 "\xE6" /* standard UQ1.31 */ +#define FMSTR_TSA_UFRAC64 "\xE7" /* standard UQ1.63 */ +/* S=1 TT=frac */ +#define FMSTR_TSA_FRAC_Q(m, n) "\xF4:" #m "." #n /* Qm.n fractional m+n+1=bitsize */ +#define FMSTR_TSA_FRAC16 "\xF5" /* standard Q0.15 */ +#define FMSTR_TSA_FRAC32 "\xF6" /* standard Q0.31 */ +#define FMSTR_TSA_FRAC64 "\xF7" /* standard Q0.63 */ +/* S=1 TT=fp */ +#define FMSTR_TSA_FLOAT "\xFA" +#define FMSTR_TSA_DOUBLE "\xFB" +/* TT=special */ +#define FMSTR_TSA_SPECIAL_MEM "\xEC" +#define FMSTR_TSA_SPECIAL_NOMEM "\xED" + +/* a pointer type is like UINT with proper size set to sizeof(void*) + * it is platform-specific, so made as external constant variable and + * implemented in freemaster_tsa.c */ +#if FMSTR_USE_TSA > 0 +extern FMSTR_TSA_CDECL char FMSTR_TSA_POINTER[]; +#else +#define FMSTR_TSA_POINTER "" +#endif + +/* macro used to describe "User Type" */ +#define FMSTR_TSA_USERTYPE(type) #type + +/* macro used to describe pure memory space */ +#define FMSTR_TSA_MEMORY NULL + +/*****************************/ +/* TSA table-building macros */ + +#if FMSTR_USE_TSA > 0 + +#define FMSTR_TSA_FUNC(id) FMSTR_TsaGetTable_##id +#define FMSTR_TSA_FUNC_PROTO(id) const FMSTR_TSA_ENTRY *FMSTR_TSA_FUNC(id)(FMSTR_SIZE * tableSize) + +#define FMSTR_TSA_TABLE_BEGIN(id) \ + FMSTR_TSA_FUNC_PROTO(id); \ + FMSTR_TSA_FUNC_PROTO(id) \ + { \ + static FMSTR_TSA_CDECL FMSTR_TSA_ENTRY fmstr_tsatable[] = { +/* entry info */ +#define FMSTR_TSA_INFO1(elem, flags) FMSTR_TSATBL_VOIDPTR_CAST(((sizeof(elem)) << 2) | (flags)) +#define FMSTR_TSA_INFO2(size, flags) FMSTR_TSATBL_VOIDPTR_CAST(((size) << 2) | (flags)) + +/* TSA entry describing the structure/union member (must follow the FMSTR_TSA_STRUCT entry) */ +#define FMSTR_TSA_MEMBER(parenttype, name, type) {FMSTR_TSA_MEMBER_CFG(parenttype, name, type)}, + +/* TSA entry describing read-only variable */ +#define FMSTR_TSA_RO_VAR(name, type) {FMSTR_TSA_RO_VAR_CFG(name, type)}, + +/* TSA entry describing read-write variable */ +#define FMSTR_TSA_RW_VAR(name, type) {FMSTR_TSA_RW_VAR_CFG(name, type)}, + +/* TSA entry describing read-only memory area */ +#define FMSTR_TSA_RO_MEM(name, type, addr, size) {FMSTR_TSA_RO_MEM_CFG(name, type, addr, size)}, + +/* TSA entry describing read-write variable */ +#define FMSTR_TSA_RW_MEM(name, type, addr, size) {FMSTR_TSA_RW_MEM_CFG(name, type, addr, size)}, + +/* TSA entry describing structure/union */ +#define FMSTR_TSA_STRUCT(name) {FMSTR_TSA_NOMEM_SIZE(#name, FMSTR_TSA_SPECIAL_NOMEM ":STRUCT", NULL, sizeof(name))}, + +/* TSA entry describing enum */ +#define FMSTR_TSA_ENUM(name) {FMSTR_TSA_NOMEM_SIZE(#name, FMSTR_TSA_SPECIAL_NOMEM ":ENUM", NULL, sizeof(name))}, + +/* TSA entry describing named constant as part of enumeration type +(entry must follow the ENUM definition) */ +#define FMSTR_TSA_CONST(name) {FMSTR_TSA_NOMEM_NOSIZE(#name, FMSTR_TSA_SPECIAL_NOMEM ":CONST", name, 0)}, + +/* TSA entry describing virtual directory for the subsequent FILE entries + The 'dirname' is either root-based if it starts with '/' or is relative to parent folder */ +#define FMSTR_TSA_DIRECTORY(dirname) {FMSTR_TSA_RO_ENTRY(dirname, FMSTR_TSA_SPECIAL_NOMEM ":DIR", NULL, 0)}, + +/* TSA entry describing virtual file content statically mapped in memory (static content cached by PC) + The 'filename' may be specified with relative paths using normal slash */ +#define FMSTR_TSA_MEMFILE(filename, filemem, filesize) \ + {FMSTR_TSA_RO_ENTRY(filename, FMSTR_TSA_SPECIAL_MEM ":MEMFILE", &(filemem), (filesize))}, + +/* TSA entry describing project to be opened in FreeMASTER + 'project_uri' may be a existing file (one of FILE entries) or a web URI */ +#define FMSTR_TSA_PROJECT(projectname, project_uri) \ + {FMSTR_TSA_RO_ENTRY(projectname, FMSTR_TSA_SPECIAL_MEM ":PRJ", project_uri, sizeof(project_uri))}, + +/* TSA entry describing general WEB link. All web links are offered to be navigated in FreeMASTER + 'link_uri' may be a existing file (one of FILE entries) or a web URI */ +#define FMSTR_TSA_HREF(linkname, link_uri) \ + {FMSTR_TSA_RO_ENTRY(linkname, FMSTR_TSA_SPECIAL_MEM ":HREF", link_uri, sizeof(link_uri))}, + +/* TSA entry describing user defined resource: File. + The 'function' is an pointer to existing function FMSTR_URES_HANDLER_FUNC. + The 'param' is a pointer to user params, which is put into in function param.*/ +#define FMSTR_TSA_USER_FILE(filename, function, param) \ + {FMSTR_TSA_NOMEM_NOSIZE(filename, FMSTR_TSA_SPECIAL_NOMEM ":U:FILE", (function), param)}, + +/* TSA entry describing user defined resource: Firmware image. + The 'function' is an pointer to existing function FMSTR_URES_HANDLER_FUNC. + The 'param' is a pointer to user params, which is put into in function param.*/ +#define FMSTR_TSA_USER_FW(filename, function, param) \ + {FMSTR_TSA_NOMEM_NOSIZE(filename, FMSTR_TSA_SPECIAL_NOMEM ":U:FW", (function), param)}, + +/* TSA entry describing user defined resource: EEPROM, Flash, or other kind of fixed-size persistent storage. + The 'function' is an pointer to existing function FMSTR_URES_HANDLER_FUNC. + The 'param' is a pointer to user params, which is put into in function param.*/ +#define FMSTR_TSA_USER_PROM(filename, function, param) \ + {FMSTR_TSA_NOMEM_NOSIZE(filename, FMSTR_TSA_SPECIAL_NOMEM ":U:PROM", (function), param)}, + +#define FMSTR_TSA_TABLE_END() \ + } \ + ; \ + if (tableSize != NULL) \ + { \ + *tableSize = sizeof(fmstr_tsatable); \ + } \ + return fmstr_tsatable; \ + } + +#else /* FMSTR_USE_TSA */ + +#define FMSTR_TSA_TABLE_BEGIN(id) +#define FMSTR_TSA_INFO1(elem, flags) +#define FMSTR_TSA_INFO2(size, flags) +#define FMSTR_TSA_STRUCT(name) +#define FMSTR_TSA_MEMBER(parenttype, name, type) +#define FMSTR_TSA_RO_VAR(name, type) +#define FMSTR_TSA_RW_VAR(name, type) +#define FMSTR_TSA_RO_MEM(name, type, addr, size) +#define FMSTR_TSA_RW_MEM(name, type, addr, size) +#define FMSTR_TSA_DIRECTORY(dirname) +#define FMSTR_TSA_MEMFILE(filename, filemem, filesize) +#define FMSTR_TSA_PROJECT(projectname, project_uri) +#define FMSTR_TSA_HREF(linkname, link_uri) +#define FMSTR_TSA_ENUM(name) +#define FMSTR_TSA_CONST(name) +#define FMSTR_TSA_USER_FILE(filename, function, param) +#define FMSTR_TSA_USER_FW(filename, function, param) +#define FMSTR_TSA_USER_PROM(filename, function, param) +#define FMSTR_TSA_TABLE_END() + +#endif /* FMSTR_USE_TSA */ + +/**********************************************/ +/* master TSA table-retrieval building macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if FMSTR_USE_TSA > 0 + +#define FMSTR_TSA_TABLE_LIST_BEGIN() \ + const FMSTR_TSA_ENTRY *FMSTR_TsaGetTable(FMSTR_SIZE tableIndex, FMSTR_SIZE *tableSize) \ + { +#define FMSTR_TSA_TABLE(id) \ + if (tableIndex-- == 0U) \ + { \ + FMSTR_TSA_FUNC_PROTO(id); \ + return FMSTR_TSA_FUNC(id)(tableSize); \ + } \ + else + +#if FMSTR_USE_TSA_DYNAMIC > 0 +#define FMSTR_TSA_TABLE_LIST_END() \ + { \ + if (tableIndex-- == 0U) \ + { \ + FMSTR_TSA_FUNC_PROTO(dynamic_tsa); \ + return FMSTR_TSA_FUNC(dynamic_tsa)(tableSize); \ + } \ + else \ + { \ + return NULL; \ + } \ + } \ + } +#else +#define FMSTR_TSA_TABLE_LIST_END() \ + { \ + return NULL; \ + } \ + } +#endif + +/***************************************************************************** + Target-side Address translation functions +******************************************************************************/ + +/* master TSA table-retrieval function */ +const FMSTR_TSA_ENTRY *FMSTR_TsaGetTable(FMSTR_SIZE tableIndex, FMSTR_SIZE *tableSize); +const FMSTR_TSA_ENTRY *FMSTR_FindUresInTsa(FMSTR_ADDR resourceId); +FMSTR_TSA_FUNC_PROTO(dynamic_tsa); + +#else /* FMSTR_USE_TSA */ + +#define FMSTR_TSA_TABLE_LIST_BEGIN() +#define FMSTR_TSA_TABLE(id) +#define FMSTR_TSA_TABLE_LIST_END() + +#endif /* FMSTR_USE_TSA */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_TSA_H */ diff --git a/middleware/freemaster/src/common/freemaster_ures.c b/middleware/freemaster/src/common/freemaster_ures.c new file mode 100644 index 0000000..6038469 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_ures.c @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - User Resources + */ + +#include "freemaster.h" +#include "freemaster_private.h" +#include "freemaster_protocol.h" +#include "freemaster_ures.h" + +#if FMSTR_USE_TSA > 0 && FMSTR_DISABLE == 0 + +static FMSTR_BPTR _FMSTR_UresControlRead( + FMSTR_ADDR resourceId, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_BPTR response, FMSTR_U8 *retStatus); +static FMSTR_BPTR _FMSTR_UresControlWrite( + FMSTR_ADDR resourceId, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_BPTR response, FMSTR_U8 *retStatus); +static FMSTR_BPTR _FMSTR_UresControlIoctl( + FMSTR_ADDR resourceId, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_BPTR response, FMSTR_U8 *retStatus); + +/****************************************************************************** + * + * @brief Handling User Resources + * + * @param msgBuffIO - original command (in) and response buffer (out) + * @param msgSize - size of data in buffer + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_UresControl(FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_U8 *retStatus) +{ + volatile FMSTR_BPTR response = msgBuffIO; + FMSTR_URES_OP_CODE opCode; + FMSTR_ADDR resourceId; + FMSTR_INDEX hdrDiff; + FMSTR_SIZE hdrSize; + + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(retStatus != NULL); + + /* need at least operation code and resource ID */ + if (msgSize < 2U) + { + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Get operation code */ + msgBuffIO = FMSTR_ValueFromBuffer8(&opCode, msgBuffIO); + + /* Get reource ID */ + msgBuffIO = FMSTR_AddressFromBuffer(&resourceId, msgBuffIO); + + /* Where have we stopped while processing? */ + hdrDiff = (FMSTR_INDEX)(msgBuffIO - response); + hdrSize = (FMSTR_SIZE)hdrDiff; + + /* Handle command by operation code */ + switch (opCode) + { + case FMSTR_URES_OP_READ: + response = _FMSTR_UresControlRead(resourceId, msgBuffIO, msgSize - hdrSize, response, retStatus); + break; + case FMSTR_URES_OP_WRITE: + response = _FMSTR_UresControlWrite(resourceId, msgBuffIO, msgSize - hdrSize, response, retStatus); + break; + case FMSTR_URES_OP_IOCTL: + response = _FMSTR_UresControlIoctl(resourceId, msgBuffIO, msgSize - hdrSize, response, retStatus); + break; + default: + *retStatus = FMSTR_STC_URESERR; + break; + } + + return response; +} + +/****************************************************************************** + * + * @brief Handling User Resources - read + * + * @param resourceId - resource ID in TSA table + * @param msgBuffIO - message input buffer + * @param msgSize - size of data in buffer + * @param response - message output buffer + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +static FMSTR_BPTR _FMSTR_UresControlRead( + FMSTR_ADDR resourceId, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_BPTR response, FMSTR_U8 *retStatus) +{ + FMSTR_BOOL ret; + FMSTR_ADDR readOffset; + FMSTR_SIZE readLen = 0; + const FMSTR_TSA_ENTRY *ures; + FMSTR_URES_HANDLER_FUNC uresFunc; + FMSTR_RWI_BUFF uresBuffRWI; + + FMSTR_ASSERT(resourceId != NULL); + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(response != NULL); + FMSTR_ASSERT(retStatus != NULL); + + /* need at least read offset and read len */ + if (msgSize < 2U) + { + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Get read offset */ + msgBuffIO = FMSTR_AddressFromBuffer(&readOffset, msgBuffIO); + + /* Get read length */ + msgBuffIO = FMSTR_SizeFromBuffer(&readLen, msgBuffIO); + + /* Find resource in TSA table */ + ures = FMSTR_FindUresInTsa(resourceId); + if (ures == NULL) + { + /* User resource not found in TSA table */ + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Red/write/ioctl buffer */ + uresBuffRWI.buff = response; + uresBuffRWI.sizeIn = 0; + uresBuffRWI.sizeOut = 0; + uresBuffRWI.sizeOutMax = readLen; + uresBuffRWI.offset = readOffset; + uresBuffRWI.ioctlCode = 0; + + /* Check max size */ + if (uresBuffRWI.sizeOutMax > (FMSTR_U16)FMSTR_COMM_BUFFER_SIZE) + { + uresBuffRWI.sizeOutMax = (FMSTR_U16)FMSTR_COMM_BUFFER_SIZE; + } + + /* User function */ + uresFunc = (FMSTR_URES_HANDLER_FUNC)ures->addr.p; + if (uresFunc == NULL) + { + /* User resource function not exists */ + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Call user function */ + ret = uresFunc(FMSTR_URES_OP_READ, &uresBuffRWI, (void *)ures->info.p); + if (ret == FMSTR_FALSE) + { + /* User resource function error */ + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Move pointer in response buffer */ + response += uresBuffRWI.sizeOut; + + /* success */ + *retStatus = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + return response; +} + +/****************************************************************************** + * + * @brief Handling User Resources - write + * + * @param resourceId - resource ID in TSA table + * @param msgBuffIO - message input buffer + * @param msgSize - size of data in buffer + * @param response - message output buffer + * @param retStatus - response status + * + * @return As all command handlers, the return value should be the buffer + * pointer where the response output finished (except checksum) + * + ******************************************************************************/ + +static FMSTR_BPTR _FMSTR_UresControlWrite( + FMSTR_ADDR resourceId, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_BPTR response, FMSTR_U8 *retStatus) +{ + FMSTR_BOOL ret; + FMSTR_ADDR writeOffset; + FMSTR_SIZE writeLen = 0; + const FMSTR_TSA_ENTRY *ures; + FMSTR_URES_HANDLER_FUNC uresFunc; + FMSTR_RWI_BUFF uresBuffRWI; + + FMSTR_ASSERT(resourceId != NULL); + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(response != NULL); + FMSTR_ASSERT(retStatus != NULL); + + /* need at least write offset and write len */ + if (msgSize < 2U) + { + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Get write offset */ + msgBuffIO = FMSTR_AddressFromBuffer(&writeOffset, msgBuffIO); + + /* Get write length */ + msgBuffIO = FMSTR_SizeFromBuffer(&writeLen, msgBuffIO); + + /* Find resource in TSA table */ + ures = FMSTR_FindUresInTsa(resourceId); + if (ures == NULL) + { + /* User resource not found in TSA table */ + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Red/write/ioctl buffer */ + uresBuffRWI.buff = msgBuffIO; + uresBuffRWI.sizeIn = writeLen; + uresBuffRWI.sizeOut = 0; + uresBuffRWI.sizeOutMax = 0; + uresBuffRWI.offset = writeOffset; + uresBuffRWI.ioctlCode = 0; + + /* User function */ + uresFunc = (FMSTR_URES_HANDLER_FUNC)ures->addr.p; + if (uresFunc == NULL) + { + /* User resource function not exists */ + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Call user function */ + ret = uresFunc(FMSTR_URES_OP_WRITE, &uresBuffRWI, (void *)ures->info.p); + if (ret == FMSTR_FALSE) + { + /* User resource function error */ + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Successful wrote data size */ + response = FMSTR_SizeToBuffer(response, uresBuffRWI.sizeConsumed); + + /* success */ + *retStatus = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + return response; +} + +static FMSTR_BPTR _FMSTR_UresControlIoctl( + FMSTR_ADDR resourceId, FMSTR_BPTR msgBuffIO, FMSTR_SIZE msgSize, FMSTR_BPTR response, FMSTR_U8 *retStatus) +{ + FMSTR_BOOL ret; + FMSTR_URES_IOCTL_CODE ioctlCode; + const FMSTR_TSA_ENTRY *ures; + FMSTR_URES_HANDLER_FUNC uresFunc; + FMSTR_RWI_BUFF uresBuffRWI; + FMSTR_INDEX hdrSize; + FMSTR_SIZE sizeIn = 0; + FMSTR_SIZE i; + + FMSTR_ASSERT(resourceId != NULL); + FMSTR_ASSERT(msgBuffIO != NULL); + FMSTR_ASSERT(response != NULL); + FMSTR_ASSERT(retStatus != NULL); + + /* need at least write offset and write len */ + if (msgSize < 2U) + { + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Get IOCTL code */ + msgBuffIO = FMSTR_SizeFromBuffer(&ioctlCode, msgBuffIO); + + /* Where have we stopped while processing? */ + hdrSize = msgBuffIO - response; + + /* Find resource in TSA table */ + ures = FMSTR_FindUresInTsa(resourceId); + if (ures == NULL) + { + /* User resource not found in TSA table */ + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* move the reminder of the IO buffer to the response */ + sizeIn = 0U; + for (i = (FMSTR_SIZE)hdrSize; i < msgSize; i++) + { + response[sizeIn++] = *msgBuffIO++; + } + + /* Read/write/ioctl buffer */ + uresBuffRWI.buff = response; + uresBuffRWI.sizeIn = sizeIn; + uresBuffRWI.sizeOut = 0U; + uresBuffRWI.sizeOutMax = FMSTR_COMM_BUFFER_SIZE; + uresBuffRWI.offset = NULL; + uresBuffRWI.ioctlCode = ioctlCode; + + /* User function */ + uresFunc = (FMSTR_URES_HANDLER_FUNC)ures->addr.p; + if (uresFunc == NULL) + { + /* User resource function not exists */ + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Call user function */ + ret = uresFunc(FMSTR_URES_OP_IOCTL, &uresBuffRWI, (void *)ures->info.p); + if (ret == FMSTR_FALSE) + { + /* User resource function error */ + /* return status */ + *retStatus = FMSTR_STC_URESERR; + return response; + } + + /* Move pointer in response buffer */ + response += uresBuffRWI.sizeOut; + + /* success */ + *retStatus = FMSTR_STS_OK | FMSTR_STSF_VARLEN; + return response; +} + +#endif /* (FMSTR_USE_TSA) && (!(FMSTR_DISABLE)) */ diff --git a/middleware/freemaster/src/common/freemaster_ures.h b/middleware/freemaster/src/common/freemaster_ures.h new file mode 100644 index 0000000..84a799c --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_ures.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - User Resource handling + */ + +#ifndef __FREEMASTER_URES_H +#define __FREEMASTER_URES_H + +/****************************************************************************** + * Macro definitions + ******************************************************************************/ + +/* User resources operation code */ +#define FMSTR_URES_OP_CODE FMSTR_SIZE +#define FMSTR_URES_IOCTL_CODE FMSTR_SIZE + +/* Operation codes */ +#define FMSTR_URES_OP_READ 0x00U +#define FMSTR_URES_OP_WRITE 0x01U +#define FMSTR_URES_OP_IOCTL 0x02U + +/* IOCTL codes */ +#define FMSTR_URES_IOCTL_GET_BUSY 0x00U +#define FMSTR_URES_IOCTL_WRITE_FLUSH 0x01U +#define FMSTR_URES_IOCTL_GET_ACCESS 0x02U +#define FMSTR_URES_IOCTL_GET_SIZE 0x04U +#define FMSTR_URES_IOCTL_SET_SIZE 0x05U +#define FMSTR_URES_IOCTL_GET_MAX_SIZE 0x06U +#define FMSTR_URES_IOCTL_ERASE 0x07U +#define FMSTR_URES_IOCTL_BLANK_CHECK 0x08U +#define FMSTR_URES_IOCTL_HASH 0x0AU +#define FMSTR_URES_IOCTL_GET_BLKINFO 0x0CU + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definitions + ******************************************************************************/ + +/* In/Out buffer structure for user resources function */ +typedef struct +{ + FMSTR_BPTR buff; /* In/out buffer */ + FMSTR_SIZE sizeIn; /* Input size */ + FMSTR_SIZE sizeConsumed; /* Consumed size */ + FMSTR_SIZE sizeOut; /* Output size */ + FMSTR_SIZE sizeOutMax; /* Maximum output size */ + + FMSTR_ADDR offset; /* read/write offset */ + FMSTR_URES_IOCTL_CODE ioctlCode; /* IOCTL code */ +} FMSTR_RWI_BUFF; + +/* User resources function, which is used in TSA table in special entry. */ +typedef FMSTR_BOOL (*FMSTR_URES_HANDLER_FUNC)(FMSTR_URES_OP_CODE opCode, FMSTR_RWI_BUFF *buffer, void *param); + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_URES_H */ diff --git a/middleware/freemaster/src/common/freemaster_utils.c b/middleware/freemaster/src/common/freemaster_utils.c new file mode 100644 index 0000000..d5bc179 --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_utils.c @@ -0,0 +1,1387 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - utility code + */ + +#include "freemaster.h" +#include "freemaster_private.h" +#include "freemaster_utils.h" + +#if FMSTR_DISABLE == 0 + +/******************************************************** + * optimized memory copy helper macros + ********************************************************/ + +#if FMSTR_MEMCPY_MAX_SIZE >= 8 + +/* Copy variable to destination by bytes from an aligned source address */ +FMSTR_INLINE void _FMSTR_CopySrcAligned_U64(FMSTR_U8 *dest, FMSTR_U64 *src) +{ + union + { + FMSTR_U64 n; + FMSTR_U8 raw[8]; + } value; + + FMSTR_U8 *raw = value.raw; + value.n = *src; /* read aligned source value with a single operation */ + *dest++ = *raw++; /* copy all bytes to generally unaligned destination */ + *dest++ = *raw++; + *dest++ = *raw++; + *dest++ = *raw++; + *dest++ = *raw++; + *dest++ = *raw++; + *dest++ = *raw++; + *dest++ = *raw++; +} + +/* Copy variable from source by bytes to an aligned destination address */ +FMSTR_INLINE void _FMSTR_CopyDstAligned_U64(FMSTR_U64 *dest, FMSTR_U8 *src) +{ + union + { + FMSTR_U64 n; + FMSTR_U8 raw[8]; + } value; + + FMSTR_U8 *raw = value.raw; + *raw++ = *src++; /* copy all bytes from generally unaligned source */ + *raw++ = *src++; + *raw++ = *src++; + *raw++ = *src++; + *raw++ = *src++; + *raw++ = *src++; + *raw++ = *src++; + *raw++ = *src++; + *dest = value.n; /* write aligned destination with a single operation */ +} + +/* Masked copy variable from source by bytes to an aligned destination address */ +FMSTR_INLINE void _FMSTR_CopyMaskedDstAligned_U64(FMSTR_U64 *dest, FMSTR_U8 *src, FMSTR_U8 *mask) +{ + FMSTR_U64 v, m, x; + + _FMSTR_CopyDstAligned_U64(&v, src); + _FMSTR_CopyDstAligned_U64(&m, mask); + + x = *dest; + x = (x & ~m) | (v & m); + + *dest = x; +} +#endif + +#if FMSTR_MEMCPY_MAX_SIZE >= 4 + +/* Copy variable to destination by bytes from an aligned source address */ +FMSTR_INLINE void _FMSTR_CopySrcAligned_U32(FMSTR_U8 *dest, FMSTR_U32 *src) +{ + union + { + FMSTR_U32 n; + FMSTR_U8 raw[4]; + } value; + + FMSTR_U8 *raw = value.raw; + value.n = *src; /* read aligned source value with a single operation */ + *dest++ = *raw++; /* copy all bytes to generally unaligned destination */ + *dest++ = *raw++; + *dest++ = *raw++; + *dest++ = *raw++; +} + +/* Copy variable from source by bytes to an aligned destination address */ +FMSTR_INLINE void _FMSTR_CopyDstAligned_U32(FMSTR_U32 *dest, FMSTR_U8 *src) +{ + union + { + FMSTR_U32 n; + FMSTR_U8 raw[4]; + } value; + + FMSTR_U8 *raw = value.raw; + *raw++ = *src++; /* copy all bytes from generally unaligned source */ + *raw++ = *src++; + *raw++ = *src++; + *raw++ = *src++; + *dest = value.n; /* write aligned destination with a single operation */ +} + +/* Masked copy variable from source by bytes to an aligned destination address */ +FMSTR_INLINE void _FMSTR_CopyMaskedDstAligned_U32(FMSTR_U32 *dest, FMSTR_U8 *src, FMSTR_U8 *mask) +{ + FMSTR_U32 v, m, x; + + _FMSTR_CopyDstAligned_U32(&v, src); + _FMSTR_CopyDstAligned_U32(&m, mask); + + x = *dest; + x = (x & ~m) | (v & m); + + *dest = x; +} + +#endif + +#if FMSTR_MEMCPY_MAX_SIZE >= 2 + +/* Copy variable to destination by bytes from an aligned source address */ +FMSTR_INLINE void _FMSTR_CopySrcAligned_U16(FMSTR_U8 *dest, FMSTR_U16 *src) +{ + union + { + FMSTR_U16 n; + FMSTR_U8 raw[2]; + } value; + + FMSTR_U8 *raw = value.raw; + value.n = *src; /* read aligned source value with a single operation */ + *dest++ = *raw++; /* copy all bytes to generally unaligned destination */ + *dest++ = *raw++; +} + +/* Copy variable from source by bytes to an aligned destination address */ +FMSTR_INLINE void _FMSTR_CopyDstAligned_U16(FMSTR_U16 *dest, FMSTR_U8 *src) +{ + union + { + FMSTR_U16 n; + FMSTR_U8 raw[2]; + } value; + + FMSTR_U8 *raw = value.raw; + *raw++ = *src++; /* copy all bytes from generally unaligned source */ + *raw++ = *src++; + *dest = value.n; /* write aligned destination with a single operation */ +} + +/* Masked copy variable from source by bytes to an aligned destination address */ +FMSTR_INLINE void _FMSTR_CopyMaskedDstAligned_U16(FMSTR_U16 *dest, FMSTR_U8 *src, FMSTR_U8 *mask) +{ + FMSTR_U16 v, m, x; + _FMSTR_CopyDstAligned_U16(&v, src); + _FMSTR_CopyDstAligned_U16(&m, mask); + + x = *dest; + x = (x & ~m) | (v & m); + + *dest = x; +} + +#endif + +/* Test if FMSTR_ADDR address is mis-aligned for given number of bits */ +#define TEST_MISALIGNED(addr, bits) ((((FMSTR_U32)(addr)) & ((1U << (bits)) - 1U)) != 0U) + +/* in this helper call, we are already sure that the destination pointer is 64-bit aligned */ +static void _FMSTR_MemCpyDstAligned(FMSTR_ADDR dest, FMSTR_ADDR src, FMSTR_SIZE size) +{ + FMSTR_U8 *src8 = (FMSTR_U8 *)src; + +#if FMSTR_MEMCPY_MAX_SIZE >= 8 + { + /* 64-bit aligned part */ + FMSTR_U64 *d64 = (FMSTR_U64 *)dest; + + while (size >= sizeof(FMSTR_U64)) + { + _FMSTR_CopyDstAligned_U64(d64, src8); + size -= sizeof(FMSTR_U64); + src8 += sizeof(FMSTR_U64); + d64++; + } + + dest = (FMSTR_ADDR)(d64); + } +#endif +#if FMSTR_MEMCPY_MAX_SIZE >= 4 + { + /* remaining word(s) */ + FMSTR_U32 *d32 = (FMSTR_U32 *)dest; + + while (size >= sizeof(FMSTR_U32)) + { + _FMSTR_CopyDstAligned_U32(d32, src8); + size -= sizeof(FMSTR_U32); + src8 += sizeof(FMSTR_U32); + d32++; + } + + dest = (FMSTR_ADDR)(d32); + } +#endif +#if FMSTR_MEMCPY_MAX_SIZE >= 2 + { + /* remaining halfword(s) */ + FMSTR_U16 *d16 = (FMSTR_U16 *)dest; + + while (size >= sizeof(FMSTR_U16)) + { + _FMSTR_CopyDstAligned_U16(d16, src8); + size -= sizeof(FMSTR_U16); + src8 += sizeof(FMSTR_U16); + d16++; + } + + dest = (FMSTR_ADDR)(d16); + } +#endif + { + volatile FMSTR_U8 *d8 = (FMSTR_U8 *)dest; + + /* remaining byte(s) */ + while (size >= 1U) + { + *d8++ = *src8++; + size--; + } + } + + FMSTR_ASSERT(size == 0U); +} + +/* in this helper call, we are already sure that the source pointer is 64-bit aligned */ +static void _FMSTR_MemCpySrcAligned(FMSTR_ADDR dest, FMSTR_ADDR src, FMSTR_SIZE size) +{ + FMSTR_U8 *dest8 = (FMSTR_U8 *)dest; + +#if FMSTR_MEMCPY_MAX_SIZE >= 8 + { + /* 64-bit aligned part */ + FMSTR_U64 *s64 = (FMSTR_U64 *)src; + + while (size >= sizeof(FMSTR_U64)) + { + _FMSTR_CopySrcAligned_U64(dest8, s64); + size -= sizeof(FMSTR_U64); + dest8 += sizeof(FMSTR_U64); + s64++; + } + + src = (FMSTR_ADDR)(s64); + } +#endif +#if FMSTR_MEMCPY_MAX_SIZE >= 4 + { + /* remaining word(s) */ + FMSTR_U32 *s32 = (FMSTR_U32 *)src; + + while (size >= sizeof(FMSTR_U32)) + { + _FMSTR_CopySrcAligned_U32(dest8, s32); + size -= sizeof(FMSTR_U32); + dest8 += sizeof(FMSTR_U32); + s32++; + } + + src = (FMSTR_ADDR)(s32); + } +#endif +#if FMSTR_MEMCPY_MAX_SIZE >= 2 + { + /* remaining halfword(s) */ + FMSTR_U16 *s16 = (FMSTR_U16 *)src; + + while (size >= sizeof(FMSTR_U16)) + { + _FMSTR_CopySrcAligned_U16(dest8, s16); + size -= sizeof(FMSTR_U16); + dest8 += sizeof(FMSTR_U16); + s16++; + } + + src = (FMSTR_ADDR)(s16); + } +#endif + { + volatile FMSTR_U8 *s8 = (FMSTR_U8 *)src; + + /* remaining byte(s) */ + while (size >= 1U) + { + *dest8++ = *s8++; + size--; + } + } + + FMSTR_ASSERT(size == 0U); +} + +/* in this helper call, we are already sure that the required pointer is aligned */ +static void _FMSTR_MemCpyMaskedDstAligned(FMSTR_ADDR dest, FMSTR_ADDR src, FMSTR_ADDR mask, FMSTR_SIZE size) +{ + FMSTR_U8 *src8 = (FMSTR_U8 *)src; + FMSTR_U8 *mask8 = (FMSTR_U8 *)mask; + +#if FMSTR_MEMCPY_MAX_SIZE >= 8 + { + /* 64-bit aligned part */ + FMSTR_U64 *d64 = (FMSTR_U64 *)dest; + + while (size >= sizeof(FMSTR_U64)) + { + _FMSTR_CopyMaskedDstAligned_U64(d64, src8, mask8); + size -= sizeof(FMSTR_U64); + src8 += sizeof(FMSTR_U64); + mask8 += sizeof(FMSTR_U64); + d64++; + } + + dest = (FMSTR_ADDR)(d64); + } +#endif +#if FMSTR_MEMCPY_MAX_SIZE >= 4 + { + /* remaining word(s) */ + FMSTR_U32 *d32 = (FMSTR_U32 *)dest; + + while (size >= sizeof(FMSTR_U32)) + { + _FMSTR_CopyMaskedDstAligned_U32(d32, src8, mask8); + size -= sizeof(FMSTR_U32); + src8 += sizeof(FMSTR_U32); + mask8 += sizeof(FMSTR_U32); + d32++; + } + + dest = (FMSTR_ADDR)(d32); + } +#endif +#if FMSTR_MEMCPY_MAX_SIZE >= 2 + { + /* remaining halfword(s) */ + FMSTR_U16 *d16 = (FMSTR_U16 *)dest; + + while (size >= sizeof(FMSTR_U16)) + { + _FMSTR_CopyMaskedDstAligned_U16(d16, src8, mask8); + size -= sizeof(FMSTR_U16); + src8 += sizeof(FMSTR_U16); + mask8 += sizeof(FMSTR_U16); + d16++; + } + + dest = (FMSTR_ADDR)(d16); + } +#endif + { + volatile FMSTR_U8 *d8 = (FMSTR_U8 *)dest; + FMSTR_U8 m, s; + + /* remaining byte(s) */ + while (size >= 1U) + { + m = *mask8++; + s = (FMSTR_U8)(*src8++ & m); + s |= (FMSTR_U8)(*d8 & (~m)); + *d8++ = s; + size--; + } + } + + FMSTR_ASSERT(size == 0U); +} + +/****************************************************************************** + * + * @brief Generic memory copy routine without alignment and transfer size requirements + * + * @param destAddr - destination memory address + * @param srcBuff - pointer to source memory in communication buffer + * @param size - buffer size (always in bytes) + * + ******************************************************************************/ + +void _FMSTR_MemCpy(void *dest, const void *src, FMSTR_SIZE size) +{ + FMSTR_MemCpyTo(FMSTR_CAST_PTR_TO_ADDR(dest), FMSTR_CAST_PTR_TO_ADDR(src), size); +} + +/****************************************************************************** + * + * @brief Copy data. Reading from source memory is as aligned as it can be. + * + * @param destAddr - destination memory address + * @param srcAddr - source memory address + * @param size - buffer size in bytes + * + ******************************************************************************/ + +FMSTR_WEAK void FMSTR_MemCpyFrom(FMSTR_ADDR destAddr, FMSTR_ADDR srcAddr, FMSTR_SIZE size) +{ + FMSTR_U8 *dest8 = (FMSTR_U8 *)destAddr; + +#if FMSTR_MEMCPY_MAX_SIZE >= 2 + /* misaligned odd byte */ + if (TEST_MISALIGNED(srcAddr, 1U) && size >= sizeof(FMSTR_U8)) + { + FMSTR_U8 *s8 = (FMSTR_U8 *)srcAddr; + *dest8++ = *s8++; + size -= sizeof(FMSTR_U8); + srcAddr = (FMSTR_ADDR)(s8); + } +#if FMSTR_MEMCPY_MAX_SIZE >= 4 + /* misaligned odd halfword */ + if (TEST_MISALIGNED(srcAddr, 2U) && size >= sizeof(FMSTR_U16)) + { + FMSTR_U16 *s16 = (FMSTR_U16 *)srcAddr; + _FMSTR_CopySrcAligned_U16(dest8, s16); + size -= sizeof(FMSTR_U16); + dest8 += sizeof(FMSTR_U16); + s16++; + srcAddr = (FMSTR_ADDR)(s16); + } +#if FMSTR_MEMCPY_MAX_SIZE >= 8 + /* misaligned odd word */ + if (TEST_MISALIGNED(srcAddr, 3U) && size >= sizeof(FMSTR_U32)) + { + FMSTR_U32 *s32 = (FMSTR_U32 *)srcAddr; + _FMSTR_CopySrcAligned_U32(dest8, s32); + size -= sizeof(FMSTR_U32); + dest8 += sizeof(FMSTR_U32); + s32++; + srcAddr = (FMSTR_ADDR)(s32); + } +#endif +#endif +#endif + + /* the rest is already aligned */ + _FMSTR_MemCpySrcAligned((FMSTR_ADDR)(dest8), srcAddr, size); +} + +/****************************************************************************** + * + * @brief Copy data. Writing to destination memory is as aligned as it can be. + * + * @param destAddr - destination memory address + * @param srcAddr - source memory address + * @param size - buffer size in bytes + * + ******************************************************************************/ + +FMSTR_WEAK void FMSTR_MemCpyTo(FMSTR_ADDR destAddr, FMSTR_ADDR srcAddr, FMSTR_SIZE size) +{ + FMSTR_U8 *src8 = (FMSTR_U8 *)srcAddr; + +#if FMSTR_MEMCPY_MAX_SIZE >= 2 + /* misaligned odd byte */ + if (TEST_MISALIGNED(destAddr, 1U) && size >= sizeof(FMSTR_U8)) + { + FMSTR_U8 *d8 = (FMSTR_U8 *)destAddr; + *d8++ = *src8++; + size -= sizeof(FMSTR_U8); + destAddr = (FMSTR_ADDR)(d8); + } +#if FMSTR_MEMCPY_MAX_SIZE >= 4 + /* misaligned odd halfword */ + if (TEST_MISALIGNED(destAddr, 2U) && size >= sizeof(FMSTR_U16)) + { + FMSTR_U16 *d16 = (FMSTR_U16 *)destAddr; + _FMSTR_CopyDstAligned_U16(d16, src8); + size -= sizeof(FMSTR_U16); + src8 += sizeof(FMSTR_U16); + d16++; + destAddr = (FMSTR_ADDR)(d16); + } +#if FMSTR_MEMCPY_MAX_SIZE >= 8 + /* misaligned odd word */ + if (TEST_MISALIGNED(destAddr, 3U) && size >= sizeof(FMSTR_U32)) + { + FMSTR_U32 *d32 = (FMSTR_U32 *)destAddr; + _FMSTR_CopyDstAligned_U32(d32, src8); + size -= sizeof(FMSTR_U32); + src8 += sizeof(FMSTR_U32); + d32++; + destAddr = (FMSTR_ADDR)(d32); + } +#endif +#endif +#endif + + /* the rest is already aligned */ + _FMSTR_MemCpyDstAligned(destAddr, (FMSTR_ADDR)(src8), size); +} + +/****************************************************************************** + * + * @brief Copy data with mask. Write to destination memory is as aligned as it can be. + * + * @param destAddr - destination memory address + * @param srcAddr - source memory address + * @param maskAddr - source mask address + * @param size - buiffer size in bytes + * + ******************************************************************************/ +FMSTR_WEAK void FMSTR_MemCpyToMasked(FMSTR_ADDR destAddr, FMSTR_ADDR srcAddr, FMSTR_ADDR maskAddr, FMSTR_SIZE size) +{ + FMSTR_U8 *src8 = (FMSTR_U8 *)srcAddr; + FMSTR_U8 *mask8 = (FMSTR_U8 *)maskAddr; + +#if FMSTR_MEMCPY_MAX_SIZE >= 2 + /* misaligned odd byte */ + if (TEST_MISALIGNED(destAddr, 1) && size >= sizeof(FMSTR_U8)) + { + FMSTR_U8 *d8 = (FMSTR_U8 *)destAddr; + FMSTR_U8 m, s; + + m = *mask8++; + s = *src8++ & m; + s |= *d8 & (~m); + *d8++ = s; + size -= sizeof(FMSTR_U8); + destAddr = (FMSTR_ADDR)(d8); + } +#endif +#if FMSTR_MEMCPY_MAX_SIZE >= 4 + /* misaligned odd halfword */ + if (TEST_MISALIGNED(destAddr, 2U) && size >= sizeof(FMSTR_U16)) + { + FMSTR_U16 *d16 = (FMSTR_U16 *)destAddr; + _FMSTR_CopyMaskedDstAligned_U16(d16, src8, mask8); + size -= sizeof(FMSTR_U16); + src8 += sizeof(FMSTR_U16); + mask8 += sizeof(FMSTR_U16); + d16++; + destAddr = (FMSTR_ADDR)(d16); + } +#endif +#if FMSTR_MEMCPY_MAX_SIZE >= 8 + /* misaligned odd word */ + if (TEST_MISALIGNED(destAddr, 3U) && size >= sizeof(FMSTR_U32)) + { + FMSTR_U32 *d32 = (FMSTR_U32 *)destAddr; + _FMSTR_CopyMaskedDstAligned_U32(d32, src8, mask8); + size -= sizeof(FMSTR_U32); + src8 += sizeof(FMSTR_U32); + mask8 += sizeof(FMSTR_U32); + d32++; + destAddr = (FMSTR_ADDR)(d32); + } +#endif + + /* the rest is already aligned */ + _FMSTR_MemCpyMaskedDstAligned(destAddr, (FMSTR_ADDR)(src8), (FMSTR_ADDR)(mask8), size); +} + +/****************************************************************************** + * + * @brief Write to the communication buffer memory + * + * @param destBuff - pointer to destination memory in communication buffer + * @param srcAddr - source memory address + * @param size - buffer size in bytes + * + * @return This function returns a pointer to next byte in comm. buffer + * + ******************************************************************************/ + +FMSTR_WEAK FMSTR_BPTR FMSTR_CopyToBuffer(FMSTR_BPTR destBuff, FMSTR_ADDR srcAddr, FMSTR_SIZE size) +{ + FMSTR_MemCpyFrom((FMSTR_ADDR)(destBuff), srcAddr, size); + return destBuff + size; +} + +/****************************************************************************** + * + * @brief Read from communication buffer memory + * + * @param destAddr - destination memory address + * @param srcBuff - pointer to source memory in communication buffer + * @param size - buffer size in bytes + * + * @return This function returns a pointer to next byte in comm. buffer + * + ******************************************************************************/ + +FMSTR_WEAK FMSTR_BPTR FMSTR_CopyFromBuffer(FMSTR_ADDR destAddr, FMSTR_BPTR srcBuff, FMSTR_SIZE size) +{ + FMSTR_MemCpyTo(destAddr, (FMSTR_ADDR)(srcBuff), size); + return srcBuff + size; +} + +/****************************************************************************** + * + * @brief Read from communication buffer memory and copy bytes with masking + * + * @param destAddr - destination memory address + * @param srcBuff - pointer to source memory and mask in communication buffer + * @param size - buffer size in bytes + * + * @return This function returns a pointer to next byte in comm. buffer + * + ******************************************************************************/ + +FMSTR_WEAK void FMSTR_CopyFromBufferWithMask(FMSTR_ADDR destAddr, FMSTR_BPTR srcBuff, FMSTR_SIZE size) +{ + FMSTR_MemCpyToMasked(destAddr, (FMSTR_ADDR)(srcBuff), (FMSTR_ADDR)(srcBuff + size), size); +} + +/****************************************************************************** + * + * @brief Store address in LEB format to communication buffer. + * + ******************************************************************************/ + +FMSTR_WEAK FMSTR_BPTR FMSTR_AddressToBuffer(FMSTR_BPTR dest, FMSTR_ADDR addr) +{ + return FMSTR_UlebEncode(dest, &addr, sizeof(addr)); +} + +/****************************************************************************** + * + * @brief Fetch address in LEB format from communication buffer + * + ******************************************************************************/ + +FMSTR_WEAK FMSTR_BPTR FMSTR_AddressFromBuffer(FMSTR_ADDR *paddr, FMSTR_BPTR src) +{ + return FMSTR_UlebDecode(src, paddr, sizeof(*paddr)); +} + +/****************************************************************************** + * + * @brief Store size in LEB format to communication buffer. + * + ******************************************************************************/ + +FMSTR_WEAK FMSTR_BPTR FMSTR_SizeToBuffer(FMSTR_BPTR dest, FMSTR_SIZE size) +{ + return FMSTR_UlebEncode(dest, &size, sizeof(size)); +} + +/****************************************************************************** + * + * @brief Fetch size in LEB format from communication buffer + * + ******************************************************************************/ + +FMSTR_WEAK FMSTR_BPTR FMSTR_SizeFromBuffer(FMSTR_SIZE *psize, FMSTR_BPTR src) +{ + return FMSTR_UlebDecode(src, psize, sizeof(*psize)); +} + +/****************************************************************************** + * + * @brief Fetch index in signed LEB format from communication buffer + * + ******************************************************************************/ + +FMSTR_WEAK FMSTR_BPTR FMSTR_IndexFromBuffer(FMSTR_INDEX *pindex, FMSTR_BPTR src) +{ + return FMSTR_SlebDecode(src, pindex, sizeof(*pindex)); +} + +/****************************************************************************** + * + * @brief Store generic U32 number to communication buffer as ULEB + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_ULebToBuffer(FMSTR_BPTR dest, FMSTR_U32 num) +{ + return FMSTR_UlebEncode(dest, &num, sizeof(num)); +} + +/****************************************************************************** + * + * @brief Fetch generic U32 value as ULEB from communication buffer + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_ULebFromBuffer(FMSTR_U32 *pnum, FMSTR_BPTR src) +{ + return FMSTR_UlebDecode(src, pnum, sizeof(*pnum)); +} + +/****************************************************************************** + * + * @brief Fetch generic U16 value from communication buffer + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_ValueFromBuffer16BE(FMSTR_U16 *pnum, FMSTR_BPTR src) +{ + *pnum = (FMSTR_U16)((((FMSTR_U16)(src[0])) << 8) | (src[1])); + return (src + 2); +} + +/****************************************************************************** + * + * @brief Store generic U16 number to communication buffer + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_ValueToBuffer16BE(FMSTR_BPTR dest, FMSTR_U16 num) +{ + dest[0] = (FMSTR_BCHR)((num >> 8) & 0xffU); + dest[1] = (FMSTR_BCHR)(num & 0xffU); + + return (dest + 2); +} + +/****************************************************************************** + * + * @brief Return number of bytes that given address needs to add in order to + * get properly aligned. + * + ******************************************************************************/ + +FMSTR_WEAK FMSTR_SIZE FMSTR_GetAlignmentCorrection(FMSTR_ADDR addr, FMSTR_SIZE size) +{ + FMSTR_U32 addrn = (FMSTR_U32)addr; + FMSTR_U32 aligned = addrn; + + FMSTR_ASSERT(size == 0U || size == 1U || size == 2U || size == 4U || size == 8U); + + if (size > 0U) + { + aligned += size - 1U; + aligned &= ~(size - 1U); + } + + return (FMSTR_SIZE)(aligned - addrn); +} + +/****************************************************************************** + * + * @brief Decode LEB number to destination variable + * + * @param in Pointer to input data + * @param result Pointer to destination variable + * @param size Size of the destination variable + * @param sleb True when decoding SLEB format + * + ******************************************************************************/ + +static FMSTR_BPTR FMSTR_LebDecode(FMSTR_BPTR in, void *result, FMSTR_SIZE size, FMSTR_BOOL sleb) +{ + FMSTR_BCHR b; + FMSTR_U8 v; + FMSTR_U8 *dest; + FMSTR_INDEX dadd; + FMSTR_SIZE shift = 0U; + + /* Initialize result to 0 value */ + FMSTR_MemSet(result, 0, size); + +#if FMSTR_PLATFORM_BIG_ENDIAN > 0 + dest = ((FMSTR_U8 *)result) + size - 1; + dadd = -1; +#else + dest = (FMSTR_U8 *)result; + dadd = 1; +#endif + + do + { + b = *in++; + v = (FMSTR_U8)(b & 0x7fU); + + if (size > 0U) + { + *dest |= (FMSTR_U8)((v << shift)); + shift += 7U; + + if (shift >= 8U) + { + shift -= 8U; + dest += dadd; + size--; + + if (size > 0U && shift > 0U) + { + *dest |= (FMSTR_U8)(v >> (7U - shift)); + } + } + } + } while ((b & 0x80U) != 0U); + + /* negative number? */ + if (sleb != FMSTR_FALSE && (b & 0x40U) != 0U) + { + if (size > 0U) + { + *dest |= (FMSTR_U8)(0xffU << shift); + dest += dadd; + size--; + } + + while (size > 0U) + { + *dest = 0xffU; + dest += dadd; + size--; + } + } + + return in; +} + +FMSTR_BPTR FMSTR_UlebDecode(FMSTR_BPTR in, void *result, FMSTR_SIZE size) +{ + return FMSTR_LebDecode(in, result, size, FMSTR_FALSE); +} + +FMSTR_BPTR FMSTR_SlebDecode(FMSTR_BPTR in, void *result, FMSTR_SIZE size) +{ + return FMSTR_LebDecode(in, result, size, FMSTR_TRUE); +} + +/****************************************************************************** + * + * @brief Encode unsigned variable to ULEB record + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_UlebEncode(FMSTR_BPTR out, void *source, FMSTR_SIZE size) +{ + FMSTR_BCHR b; + FMSTR_U8 v; + FMSTR_U8 *src; + FMSTR_INDEX sadd; + FMSTR_SIZE shift = 0; + FMSTR_SIZE zeroes = 0; + +#if FMSTR_PLATFORM_BIG_ENDIAN > 0 + src = (FMSTR_U8 *)source; + while (zeroes < size) + { + if (*src++ == 0U) + { + zeroes++; + } + else + { + break; + } + } + src = ((FMSTR_U8 *)source) + size - 1; + sadd = -1; +#else + src = ((FMSTR_U8 *)source) + size - 1; + while (zeroes < size) + { + if (*src-- == 0U) + { + zeroes++; + } + else + { + break; + } + } + src = (FMSTR_U8 *)source; + sadd = 1; +#endif + + /* now: 'zeroes' is number of useless most-significant zero bytes + * 'src' points to least-significant byte and 'sadd' is a direction */ + if (zeroes < size) + { + /* we will not encode the zero bytes */ + size -= zeroes; + + /* start with zero (will be or-ing to it) */ + *out = 0; + + while (size-- > 0U) + { + v = *src; + src += sadd; + + b = ((FMSTR_BCHR)(v << shift)) & 0x7FU; + *out |= b; + + // shift is number of bits remaining in v + v = (FMSTR_U8)(v >> (7U - shift)); + + // other bits to the next out byte + if (size > 0U || v != 0U) + { + *out++ |= 0x80U; + *out = (FMSTR_BCHR)(v & 0x7FU); + } + + shift++; + + if (shift >= 8U) + { + v >>= 7; + + if (size > 0U || v != 0U) + { + *out++ |= 0x80U; + *out = (FMSTR_BCHR)(v & 0x7FU); + } + + shift = 1; + } + } + + out++; + } + else + { + /* variable is equal to 0, this encodes as a single 0 byte */ + *out++ = 0; + } + + return out; +} + +/****************************************************************************** + * + * @brief Skip the LEB field in buffer (it doesn't matter if signed or unsigned) + * + * @param dest - Pointer to LEB field + * + * @return pointer to buffer just behind LEB field + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_SkipInBufferLeb(FMSTR_BPTR dest) +{ + FMSTR_BCHR b; + do + { + b = *(dest++); + } while ((b & 0x80U) != 0U); + + return dest; +} + +/****************************************************************************** + * + * @brief Get string from incomming buffer + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_StringFromBuffer(FMSTR_BPTR in, FMSTR_CHAR *pStr, FMSTR_SIZE maxSize) +{ + FMSTR_BCHR b; + + do + { + in = FMSTR_ValueFromBuffer8(&b, in); + + if (maxSize > 0U) + { + maxSize--; + *pStr++ = (FMSTR_CHAR)(maxSize > 0U ? b : 0U); + } + } while (b != 0U); + + return in; +} + +/****************************************************************************** + * + * @brief Copy string from memory to outcomming buffer + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_StringCopyToBuffer(FMSTR_BPTR out, const FMSTR_CHAR *pStr) +{ + while (*pStr != (FMSTR_CHAR)0) + { + out = FMSTR_ValueToBuffer8(out, (FMSTR_U8)(*pStr++)); + } + + out = FMSTR_ValueToBuffer8(out, (FMSTR_U8)0); + return out; +} + +/****************************************************************************** + * + * @brief Initialize CRC16 calculation + * + ******************************************************************************/ + +void FMSTR_Crc16Init(FMSTR_U16 *crc) +{ + *crc = FMSTR_CRC16_CCITT_SEED; +} + +/****************************************************************************** + * + * @brief Add new byte to CRC16 calculation + * + ******************************************************************************/ + +void FMSTR_Crc16AddByte(FMSTR_U16 *crc, FMSTR_U8 data) +{ + FMSTR_INDEX x; + + *crc ^= ((FMSTR_U16)data) << 8; /* XOR hi-byte of CRC w/dat */ + for (x = 8; x != 0; x--) /* Then, for 8 bit shifts... */ + { + if ((*crc & 0x8000U) != 0U) /* Test hi order bit of CRC */ + { + *crc = *crc << 1 ^ 0x1021U; /* if set, shift & XOR w/$1021 */ + } + else + { + *crc <<= 1; /* Else, just shift left once. */ + } + } +} + +/****************************************************************************** + * + * @brief Initialize CRC8 calculation + * + ******************************************************************************/ + +void FMSTR_Crc8Init(FMSTR_U8 *crc) +{ + *crc = FMSTR_CRC8_CCITT_SEED; +} + +/****************************************************************************** + * + * @brief Add new byte to CRC8 calculation + * + ******************************************************************************/ + +void FMSTR_Crc8AddByte(FMSTR_U8 *crc, FMSTR_U8 data) +{ + FMSTR_INDEX x; + + *crc ^= data; /* XOR hi-byte of CRC w/dat */ + for (x = 8; x != 0; x--) /* Then, for 8 bit shifts... */ + { + if ((*crc & 0x80U) != 0U) /* Test hi order bit of CRC */ + { + *crc = (FMSTR_U8)((*crc << 1) ^ 0x07U); /* if set, shift & XOR w/$07 */ + } + else + { + *crc <<= 1; /* Else, just shift left once. */ + } + } +} + +/****************************************************************************** + * + * @brief Get array of random numbers + * + ******************************************************************************/ + +FMSTR_BPTR FMSTR_RandomNumbersToBuffer(FMSTR_BPTR out, FMSTR_SIZE length) +{ + FMSTR_BPTR ret = out; + +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + FMSTR_SIZE i; + FMSTR_SIZE sz; + FMSTR_U32 r; + FMSTR_U8 *dest = out; + FMSTR_U8 div; + + for (i = 0U; i < length; i += 4U) + { + /* TODO: this generator uses stdlib rand implemntation by default, which is weak. + * replace this by defining your own FMSTR_Rand() macro and replace it by + * a true random number engine. */ + + /* Achieve somewhat better entropy by skipping random number of sequenced numbers */ + div = (FMSTR_U8)FMSTR_Rand(); + while (div-- > 0U) + { + r = (FMSTR_U32)FMSTR_Rand(); + } + + sz = length - i; + if (sz > 4U) + { + sz = 4U; + } + + ret = FMSTR_CopyToBuffer(&dest[i], (FMSTR_ADDR)&r, sz); + } +#else + /* this function should not be called when restricted access is not required */ + FMSTR_ASSERT(0 == 1); + FMSTR_UNUSED(out); + FMSTR_UNUSED(length); +#endif /* FMSTR_CFG_F1_RESTRICTED_ACCESS */ + + return ret; +} + +/****************************************************************************** + * + * @brief Get array of random numbers + * + ******************************************************************************/ + +void FMSTR_Randomize(FMSTR_U32 entropy) +{ +#if FMSTR_CFG_F1_RESTRICTED_ACCESS != 0 + FMSTR_U32 r; + + /* skip next few numbers in rand sequence to achieve a better behavior */ + entropy &= 15U; + + do + { + r = (FMSTR_U32)FMSTR_Rand(); + FMSTR_UNUSED(r); + } while (entropy-- > 0U); +#else + /* this function should not be called when restricted access is not required */ + FMSTR_ASSERT(0 == 1); + FMSTR_UNUSED(entropy); +#endif /* FMSTR_CFG_F1_RESTRICTED_ACCESS */ +} + +/****************************************************************************** + * + * @brief The function prepares ring buffer + * + ******************************************************************************/ + +void _FMSTR_RingBuffCreate(FMSTR_RING_BUFFER *ringBuff, FMSTR_BPTR buffer, FMSTR_U32 size) +{ + FMSTR_ASSERT(ringBuff != NULL); + FMSTR_ASSERT(buffer != NULL); + + FMSTR_MemSet(ringBuff, 0, sizeof(FMSTR_RING_BUFFER)); + + ringBuff->buffer = buffer; + ringBuff->size = size; + ringBuff->rp = buffer; + ringBuff->wp = buffer; +} + +/****************************************************************************** + * + * @brief The function adds character into ring buffer + * + ******************************************************************************/ + +void _FMSTR_RingBuffPut(FMSTR_RING_BUFFER *ringBuff, FMSTR_BCHR nRxChar) +{ + FMSTR_BPTR wpnext; + + FMSTR_ASSERT(ringBuff != NULL); + + /* future value of write pointer */ + wpnext = ringBuff->wp + 1; + + if (wpnext >= (ringBuff->buffer + ringBuff->size)) + { + wpnext = ringBuff->buffer; + } + + /* any space in queue? */ + if (wpnext != ringBuff->rp) + { + *ringBuff->wp = (FMSTR_U8)nRxChar; + ringBuff->wp = wpnext; + } +} + +/****************************************************************************** + * + * @brief The function gets character from ring buffer + * + ******************************************************************************/ + +FMSTR_BCHR _FMSTR_RingBuffGet(FMSTR_RING_BUFFER *ringBuff) +{ + FMSTR_BCHR nChar = 0U; + + FMSTR_ASSERT(ringBuff != NULL); + + /* get all queued characters */ + if (ringBuff->rp != ringBuff->wp) + { + FMSTR_BPTR rpnext = ringBuff->rp; + nChar = *rpnext++; + + if (rpnext >= (ringBuff->buffer + ringBuff->size)) + { + rpnext = ringBuff->buffer; + } + + ringBuff->rp = rpnext; + } + + return nChar; +} + +/****************************************************************************** + * + * @brief The function returns true, when is space in ring buffer + * + ******************************************************************************/ + +FMSTR_BOOL _FMSTR_RingBuffIsSpace(FMSTR_RING_BUFFER *ringBuff) +{ + FMSTR_BPTR wpnext; + + FMSTR_ASSERT(ringBuff != NULL); + + wpnext = ringBuff->wp + 1; + + /* Is any space in buffer? */ + if (wpnext != ringBuff->rp) + { + return FMSTR_TRUE; + } + + return FMSTR_FALSE; +} + +/****************************************************************************** + * + * @brief The function returns true, when some data in ring buffer + * + ******************************************************************************/ + +FMSTR_BOOL _FMSTR_RingBuffHasData(FMSTR_RING_BUFFER *ringBuff) +{ + FMSTR_ASSERT(ringBuff != NULL); + + /* Is any data available to get from buffer? */ + if (ringBuff->rp != ringBuff->wp) + { + return FMSTR_TRUE; + } + + return FMSTR_FALSE; +} + +/****************************************************************************** + * + * @brief Compare helper + * + ******************************************************************************/ + +FMSTR_INLINE FMSTR_INDEX _FMSTR_Compare(FMSTR_U8 c1, FMSTR_U8 c2) +{ + if (c1 < c2) + { + return -1; + } + if (c1 > c2) + { + return +1; + } + return 0; +} + +/****************************************************************************** + * + * @brief Standard strcmp library function + * + ******************************************************************************/ + +FMSTR_INDEX _FMSTR_StrCmp(const FMSTR_CHAR *str1, const FMSTR_CHAR *str2) +{ + FMSTR_INDEX cmp = 0; + FMSTR_U8 c1, c2; + + const FMSTR_U8 *s1 = (const FMSTR_U8 *)str1; + const FMSTR_U8 *s2 = (const FMSTR_U8 *)str2; + + if (str1 == str2) + { + return 0; + } + + FMSTR_ASSERT_RETURN(str1 != NULL, 1); + FMSTR_ASSERT_RETURN(str2 != NULL, -1); + + do + { + c1 = *s1++; + c2 = *s2++; + cmp = _FMSTR_Compare(c1, c2); + if (cmp != 0) + { + return cmp; + } + } while (c1 != 0U && c2 != 0U); + + return 0; +} + +FMSTR_INDEX _FMSTR_MemCmp(const void *b1, const void *b2, FMSTR_SIZE size) +{ + const FMSTR_U8 *p1 = (const FMSTR_U8 *)b1; + const FMSTR_U8 *p2 = (const FMSTR_U8 *)b2; + FMSTR_INDEX cmp; + FMSTR_U8 c1, c2; + + if (p1 == p2) + { + return 0; + } + + FMSTR_ASSERT_RETURN(p1 != NULL, 1); + FMSTR_ASSERT_RETURN(p2 != NULL, -1); + + while (size-- > 0U) + { + c1 = *p1++; + c2 = *p2++; + cmp = _FMSTR_Compare(c1, c2); + if (cmp != 0) + { + return cmp; + } + } + + return 0; +} + +FMSTR_SIZE _FMSTR_StrLen(const FMSTR_CHAR *str) +{ + const FMSTR_CHAR *s = str; + FMSTR_SIZE len = 0; + + while (*s++ != (FMSTR_CHAR)0) + { + len++; + } + + return len; +} + +void _FMSTR_MemSet(void *dest, FMSTR_U8 fill, FMSTR_SIZE size) +{ + FMSTR_U8 *d = dest; + while (size-- > 0U) + { + *d++ = fill; + } +} + +FMSTR_U32 _FMSTR_Rand(void) +{ + /* Random number generation not yet implemented, use stdlib function */ + FMSTR_ASSERT(0 == 1); + return 0; +} + +#endif /* !FMSTR_DISABLE */ diff --git a/middleware/freemaster/src/common/freemaster_utils.h b/middleware/freemaster/src/common/freemaster_utils.h new file mode 100644 index 0000000..8c72cdf --- /dev/null +++ b/middleware/freemaster/src/common/freemaster_utils.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - utility code + */ + +#ifndef __FREEMASTER_UTILS_H +#define __FREEMASTER_UTILS_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_uart.h +#endif + +/****************************************************************************** + * Macro definitions + ******************************************************************************/ +#define FMSTR_CRC16_CCITT_SEED 0xFFFFU +#define FMSTR_CRC8_CCITT_SEED 0x00U + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definitions + ******************************************************************************/ +/* Context struct for decoding unsigned LEB format byte by byte. */ +typedef struct +{ + FMSTR_SIZE result; + FMSTR_SIZE shift; +} FMSTR_ULEB_CTX; + +/* Context structure for ring buffer */ +typedef struct +{ + FMSTR_BPTR buffer; /* Ring buffer pointer */ + FMSTR_U32 size; /* Size of ring buffer */ + FMSTR_BPTR rp; /* Read pointer */ + FMSTR_BPTR wp; /* Write pointer */ +} FMSTR_RING_BUFFER; + +/****************************************************************************** + * Inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +/* Decode unsigned LEB field. */ +FMSTR_BPTR FMSTR_UlebDecode(FMSTR_BPTR in, void *result, FMSTR_SIZE size); +/* Encode unsigned LEB field. */ +FMSTR_BPTR FMSTR_UlebEncode(FMSTR_BPTR out, void *source, FMSTR_SIZE size); +/* Decode signed LEB field. */ +FMSTR_BPTR FMSTR_SlebDecode(FMSTR_BPTR in, void *result, FMSTR_SIZE size); +/* Skip one LEB/SLEB field in buffer. */ +FMSTR_BPTR FMSTR_SkipInBufferLeb(FMSTR_BPTR dest); + +/* Copy string from buffer to memory. */ +FMSTR_BPTR FMSTR_StringFromBuffer(FMSTR_BPTR in, FMSTR_CHAR *pStr, FMSTR_SIZE maxSize); +/* Copy string from memory to buffer. */ +FMSTR_BPTR FMSTR_StringCopyToBuffer(FMSTR_BPTR out, const FMSTR_CHAR *pStr); + +/* Initialize CRC16 calculation. */ +void FMSTR_Crc16Init(FMSTR_U16 *crc); +/* Add new byte to CRC16 calculation. */ +void FMSTR_Crc16AddByte(FMSTR_U16 *crc, FMSTR_U8 data); +/* Initialize CRC8 calculation. */ +void FMSTR_Crc8Init(FMSTR_U8 *crc); +/* Add new byte to CRC8 calculation. */ +void FMSTR_Crc8AddByte(FMSTR_U8 *crc, FMSTR_U8 data); + +/* Get array of random numbers */ +FMSTR_BPTR FMSTR_RandomNumbersToBuffer(FMSTR_BPTR out, FMSTR_SIZE length); +/* Increase entropy of random number generator */ +void FMSTR_Randomize(FMSTR_U32 entropy); + +/* Prepare ring buffer */ +void _FMSTR_RingBuffCreate(FMSTR_RING_BUFFER *ringBuff, FMSTR_BPTR buffer, FMSTR_U32 size); +/* Add character into ring buffer */ +void _FMSTR_RingBuffPut(FMSTR_RING_BUFFER *ringBuff, FMSTR_BCHR nRxChar); +/* Get character from ring buffer */ +FMSTR_BCHR _FMSTR_RingBuffGet(FMSTR_RING_BUFFER *ringBuff); +/* Returns true, when is space in ring buffer */ +FMSTR_BOOL _FMSTR_RingBuffIsSpace(FMSTR_RING_BUFFER *ringBuff); +/* Returns true, when any data in ring buffer */ +FMSTR_BOOL _FMSTR_RingBuffHasData(FMSTR_RING_BUFFER *ringBuff); + +/****************************************************************************** + * Global variable declaration + ******************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_UTILS_H */ diff --git a/middleware/freemaster/src/drivers/ampxsdk/can/S32K1x/freemaster_flexcan.c b/middleware/freemaster/src/drivers/ampxsdk/can/S32K1x/freemaster_flexcan.c new file mode 100644 index 0000000..103aaae --- /dev/null +++ b/middleware/freemaster/src/drivers/ampxsdk/can/S32K1x/freemaster_flexcan.c @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - FlexCAN low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_CAN_S32K1x_FLEXCAN_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_S32K1x_FLEXCAN_ID) + +#include "freemaster_flexcan.h" + +#if (!(FMSTR_DISABLE)) + +#include "freemaster_can.h" +/****************************************************************************** +* Local macros +******************************************************************************/ + +/* FCAN: id to id-raw (idr) translation */ +#define FMSTR_FCAN_ID2IDR(id) (((id)&FMSTR_CAN_EXTID) ? FLEXCAN_ID_EXT(id) : FLEXCAN_ID_STD(id)) + +/* user-selected MB as a 32bit or 64bit flag */ +#if FMSTR_FLEXCAN_RXMB < 32 +#define FMSTR_FLEXCAN_RXMB_FLAG (1UL << (FMSTR_FLEXCAN_RXMB)) +#else +#define FMSTR_FLEXCAN_RXMB_FLAG (1ULL << (FMSTR_FLEXCAN_RXMB)) +#endif +#if FMSTR_FLEXCAN_TXMB < 32 +#define FMSTR_FLEXCAN_TXMB_FLAG (1UL << (FMSTR_FLEXCAN_TXMB)) +#else +#define FMSTR_FLEXCAN_TXMB_FLAG (1ULL << (FMSTR_FLEXCAN_TXMB)) +#endif + +/* Using 64bit registers */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) +#define FMSTR_FLEXCAN_REG_SIZE64 +#define FMSTR_FLEXCAN_FLAG_ALL 0xFFFFFFFFFFFFFFFF +#else +#define FMSTR_FLEXCAN_FLAG_ALL 0xFFFFFFFF +#endif + +/****************************************************************************** +* Local functions +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_FlexCAN_Init(FMSTR_U32 idRx, FMSTR_U32 idTx); /* Initialize CAN module on a given base address. */ +static void _FMSTR_FlexCAN_EnableTxInterrupt(FMSTR_BOOL enable); /* Enable CAN Transmit interrupt. */ +static void _FMSTR_FlexCAN_EnableRxInterrupt(FMSTR_BOOL enable); /* Enable CAN Receive interrupt. */ +static void _FMSTR_FlexCAN_EnableRx(void); /* Enable/re-initialize Receiver buffer. */ +static FMSTR_SIZE8 _FMSTR_FlexCAN_GetRxFrameLen(void); /* Return size of received CAN frame, or 0 if no Rx frame is available. */ +static FMSTR_BCHR _FMSTR_FlexCAN_GetRxFrameByte(FMSTR_SIZE8 index); /* Get data byte at index (0..8). */ +static void _FMSTR_FlexCAN_AckRxFrame(void); /* Discard received frame and enable receiving a next one. */ +static FMSTR_BOOL _FMSTR_FlexCAN_PrepareTxFrame(void); /* Initialize transmit buffer; return false when Tx buffer is not available. */ +static void _FMSTR_FlexCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data); /* Fill one byte of transmit data. */ +static void _FMSTR_FlexCAN_SendTxFrame(FMSTR_SIZE8 len); /* Send the Tx buffer. */ +/****************************************************************************** +* Local variables +******************************************************************************/ + +/* Serial base address */ +#ifdef FMSTR_CAN_BASE + static CAN_Type *fmstr_canBaseAddr = FMSTR_CAN_BASE; +#else + static CAN_Type *fmstr_canBaseAddr = NULL; +#endif + +/* Serial instance */ +#ifdef FMSTR_CAN_INSTANCE + static can_instance_t *fmstr_canInstance = FMSTR_CAN_INSTANCE; +#else + static can_instance_t *fmstr_canInstance = NULL; +#endif + +static can_buff_config_t fmstr_rxcfg; /* MB configuration with Raw ID */ +static can_buff_config_t fmstr_txcfg; + +static can_message_t fmstr_rxmsg;/* Received frame buffer, valid when length>0 */ +static can_message_t fmstr_txmsg;/* Buffer to prepare transmission */ +/****************************************************************************** +* Driver interface +******************************************************************************/ + +const FMSTR_CAN_DRV_INTF FMSTR_CAN_S32K1x_FLEXCAN = +{ + .Init = _FMSTR_FlexCAN_Init, + .EnableTxInterrupt = _FMSTR_FlexCAN_EnableTxInterrupt, + .EnableRxInterrupt = _FMSTR_FlexCAN_EnableRxInterrupt, + .EnableRx = _FMSTR_FlexCAN_EnableRx, + .GetRxFrameLen = _FMSTR_FlexCAN_GetRxFrameLen, + .GetRxFrameByte = _FMSTR_FlexCAN_GetRxFrameByte, + .AckRxFrame = _FMSTR_FlexCAN_AckRxFrame, + .PrepareTxFrame = _FMSTR_FlexCAN_PrepareTxFrame, + .PutTxFrameByte = _FMSTR_FlexCAN_PutTxFrameByte, + .SendTxFrame = _FMSTR_FlexCAN_SendTxFrame, +}; + +/****************************************************************************** +* Implementation +******************************************************************************/ +#if FMSTR_LONG_INTR || FMSTR_SHORT_INTR +void can_pal_callback(uint32_t instance, can_event_t eventType, uint32_t buffIdx, void *driverState) +{ + (void)driverState; + (void)instance; + switch(eventType) + { + case CAN_EVENT_RX_COMPLETE: + FMSTR_ProcessCanRx(); + CAN_Receive(fmstr_canInstance, FMSTR_FLEXCAN_RXMB, &fmstr_rxmsg); + break; + case CAN_EVENT_TX_COMPLETE: + /* Acknowledge frame transmission */ + fmstr_txmsg.length = 0; + /* Send next frame, if needed */ + FMSTR_ProcessCanTx(); + break; + default: + break; + } +} +#endif + +static FMSTR_BOOL _FMSTR_FlexCAN_Init(FMSTR_U32 idRx, FMSTR_U32 idTx) +{ + /* initialize Rx MB */ + FMSTR_MemSet(&fmstr_rxmsg, 0, sizeof(fmstr_rxmsg)); + FMSTR_MemSet(&fmstr_rxcfg, 0, sizeof(fmstr_rxcfg)); + fmstr_rxcfg.idType = (idRx & FMSTR_CAN_EXTID) ? CAN_MSG_ID_EXT : CAN_MSG_ID_STD; + fmstr_rxcfg.isRemote = 0u;//mean it's frame data type + fmstr_rxmsg.id = idRx; + CAN_ConfigRxBuff(fmstr_canInstance, FMSTR_FLEXCAN_RXMB, &fmstr_rxcfg, fmstr_rxmsg.id); + + /* initialize Tx MB */ + FMSTR_MemSet(&fmstr_txmsg, 0, sizeof(fmstr_txmsg)); + FMSTR_MemSet(&fmstr_txcfg, 0, sizeof(fmstr_txcfg)); + fmstr_txcfg.idType = (idTx & FMSTR_CAN_EXTID) ? CAN_MSG_ID_EXT : CAN_MSG_ID_STD; + fmstr_txcfg.isRemote = 0u;//mean it's frame data type + fmstr_txmsg.id = idTx; + CAN_ConfigTxBuff(fmstr_canInstance, FMSTR_FLEXCAN_TXMB, &fmstr_txcfg); + +#if FMSTR_LONG_INTR || FMSTR_SHORT_INTR + CAN_InstallEventCallback(fmstr_canInstance, can_pal_callback, NULL); +#endif + + return FMSTR_TRUE; +} + +static void _FMSTR_FlexCAN_EnableTxInterrupt(FMSTR_BOOL enable) +{ +} + +static void _FMSTR_FlexCAN_EnableRxInterrupt(FMSTR_BOOL enable) +{ + if (enable) + { + CAN_Receive(fmstr_canInstance, FMSTR_FLEXCAN_RXMB, &fmstr_rxmsg); + } +} + +static void _FMSTR_FlexCAN_EnableRx(void) +{ + CAN_ConfigRxBuff(fmstr_canInstance, FMSTR_FLEXCAN_RXMB, &fmstr_rxcfg, fmstr_rxmsg.id); +} + +static FMSTR_SIZE8 _FMSTR_FlexCAN_GetRxFrameLen(void) +{ + if(!fmstr_rxmsg.length) + { + /* Try to read, when successfull, the MB is acknowledged and set for next receive */ + CAN_Receive(fmstr_canInstance, FMSTR_FLEXCAN_RXMB, &fmstr_rxmsg); + } + /* we have got some frame, return its length */ + return fmstr_rxmsg.length; +} + +static FMSTR_BCHR _FMSTR_FlexCAN_GetRxFrameByte(FMSTR_SIZE8 index) +{ + FMSTR_BCHR data; + data = fmstr_rxmsg.data[index]; + return data; +} + +static void _FMSTR_FlexCAN_AckRxFrame(void) +{ + /* The frame is already acknowledged in registers by calling FLEXCAN_ReadRxMb before. */ + /* We only clear the local cached buffer so it appears as if we have acknowledged it. */ + fmstr_rxmsg.length = 0; +} + +static FMSTR_BOOL _FMSTR_FlexCAN_PrepareTxFrame(void) +{ +#if FMSTR_POLL_DRIVEN + /* Acknowledge frame was transmitted */ + fmstr_txmsg.length = 0; +#else + if(fmstr_txmsg.length) + return FMSTR_FALSE; +#endif /* FMSTR_POLL_DRIVEN */ + + /* set as transmit-emtpy MB */ + CAN_ConfigTxBuff(fmstr_canInstance, FMSTR_FLEXCAN_TXMB, &fmstr_txcfg); + return FMSTR_TRUE; +} + +static void _FMSTR_FlexCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data) +{ + /* need switch as data bytes are not necessarily ordered in the frame */ + fmstr_txmsg.data[index] = data; +} + +static void _FMSTR_FlexCAN_SendTxFrame(FMSTR_SIZE8 len) +{ + fmstr_txmsg.length = len; + CAN_Send(fmstr_canInstance, FMSTR_FLEXCAN_TXMB, &fmstr_txmsg); +#if FMSTR_POLL_DRIVEN + while(CAN_GetTransferStatus(fmstr_canInstance, FMSTR_FLEXCAN_TXMB) != STATUS_SUCCESS); +#endif +} + +/****************************************************************************** +* +* @brief Assigning FreeMASTER communication module base address +* +******************************************************************************/ +void FMSTR_CanSetBaseAddress(CAN_Type *base) +{ + /*this function has not been used due to use of PAL functions for Freemaster comunication, + and has been replaced with FMSTR_CanSetInstance(can_instance_t *instance) */ + FMSTR_ASSERT(FMSTR_FALSE); + fmstr_canBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Assigning FreeMASTER communication module instance +* +******************************************************************************/ +void FMSTR_CanSetInstance(can_instance_t *instance) +{ + /*this function replaces FMSTR_CanSetBaseAddress(CAN_Type *base) */ + fmstr_canInstance = instance; +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_CanSetBaseAddress(CAN_Type *base) +{ + FMSTR_UNUSED(base); +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_S32K1x_FLEXCAN_ID) */ diff --git a/middleware/freemaster/src/drivers/ampxsdk/can/S32K1x/freemaster_flexcan.h b/middleware/freemaster/src/drivers/ampxsdk/can/S32K1x/freemaster_flexcan.h new file mode 100644 index 0000000..8948cde --- /dev/null +++ b/middleware/freemaster/src/drivers/ampxsdk/can/S32K1x/freemaster_flexcan.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - FlexCAN low-level driver + */ + +#ifndef __FREEMASTER_FLEXCAN_H +#define __FREEMASTER_FLEXCAN_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_flexcan.h +#endif + + +#include "flexcan_driver.h" +#include "flexcan_hw_access.h" +#include "can_pal1.h" +#include "flexcan_hw_access.h" +#include "can_pal.h" + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ +/* flexcan needs to know the transmit and receive MB number */ +#if ((FMSTR_USE_FLEXCAN) || (FMSTR_USE_FLEXCAN32)) + /* Flexcan TX message buffer must be defined */ + #ifndef FMSTR_FLEXCAN_TXMB + /* #error FlexCAN transmit buffer needs to be specified (use FMSTR_FLEXCAN_TXMB) */ + #warning "FlexCAN Message Buffer 0 is used for transmitting messages" + #define FMSTR_FLEXCAN_TXMB 0 + #endif + /* Flexcan RX message buffer must be defined */ + #ifndef FMSTR_FLEXCAN_RXMB + /* #error FlexCAN receive buffer needs to be specified (use FMSTR_FLEXCAN_RXMB) */ + #warning "FlexCAN Message Buffer 1 is used for receiving messages" + #define FMSTR_FLEXCAN_RXMB 1 + #endif +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_CanSetBaseAddress(CAN_Type *base); +void FMSTR_CanSetInstance(can_instance_t *instance); +void FMSTR_CanIsr(void); +void FMSTR_CanIsrReceive(void); +void FMSTR_CanIsrSend(void); + +void can_pal_callback(uint32_t instance, can_event_t eventType, uint32_t buffIdx, void *driverState); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_FLEXCAN_H */ + diff --git a/middleware/freemaster/src/drivers/ampxsdk/uart/S32K1x/freemaster_serial_lpuart.c b/middleware/freemaster/src/drivers/ampxsdk/uart/S32K1x/freemaster_serial_lpuart.c new file mode 100644 index 0000000..6f78114 --- /dev/null +++ b/middleware/freemaster/src/drivers/ampxsdk/uart/S32K1x/freemaster_serial_lpuart.c @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - LPUART low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +#if FMSTR_SERIAL_SINGLEWIRE + #error Not supported by S32K1x +#endif + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_S32K1x_LPUART_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32K1x_LPUART_ID) + +#include "freemaster_serial_lpuart.h" + +#if (!(FMSTR_DISABLE)) + +#include "lpuart_hw_access.h" + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" + +/*********************************** +* local variables +***********************************/ + +/* Serial base address */ +#ifdef FMSTR_SERIAL_BASE + static LPUART_Type *fmstr_serialBaseAddr = FMSTR_SERIAL_BASE; +#else + static LPUART_Type *fmstr_serialBaseAddr = NULL; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of serial UART driver adapter */ +static FMSTR_BOOL _FMSTR_SerialLpuartInit(void); +static void _FMSTR_SerialLpuartEnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_SerialLpuartEnableReceive(FMSTR_BOOL enable); +static void _FMSTR_SerialLpuartEnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialLpuartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialLpuartEnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_SerialLpuartIsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_SerialLpuartIsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_SerialLpuartIsTransmitterActive(void); +static void _FMSTR_SerialLpuartPutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_SerialLpuartGetChar(void); +static void _FMSTR_SerialLpuartFlush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this serial UART driver */ +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_S32K1x_LPUART = +{ + .Init = _FMSTR_SerialLpuartInit, + .EnableTransmit = _FMSTR_SerialLpuartEnableTransmit, + .EnableReceive = _FMSTR_SerialLpuartEnableReceive, + .EnableTransmitInterrupt = _FMSTR_SerialLpuartEnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt= _FMSTR_SerialLpuartEnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_SerialLpuartEnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_SerialLpuartIsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_SerialLpuartIsReceiveRegFull, + .IsTransmitterActive = _FMSTR_SerialLpuartIsTransmitterActive, + .PutChar = _FMSTR_SerialLpuartPutChar, + .GetChar = _FMSTR_SerialLpuartGetChar, + .Flush = _FMSTR_SerialLpuartFlush, + +}; + +/****************************************************************************** +* +* @brief Serial communication initialization +* +******************************************************************************/ +static FMSTR_BOOL _FMSTR_SerialLpuartInit(void) +{ + /* valid runtime module address must be assigned */ + if(!fmstr_serialBaseAddr) + return FMSTR_FALSE; + + return FMSTR_TRUE; +} + +/****************************************************************************** +* +* @brief Enable/Disable Serial transmitter +* +******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableTransmit(FMSTR_BOOL enable) +{ + LPUART_SetTransmitterCmd(fmstr_serialBaseAddr, enable); +} + +/****************************************************************************** +* +* @brief Enable/Disable Serial receiver +* +******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableReceive(FMSTR_BOOL enable) +{ + LPUART_SetReceiverCmd(fmstr_serialBaseAddr, enable); +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + LPUART_SetIntMode(fmstr_serialBaseAddr, LPUART_INT_TX_DATA_REG_EMPTY, 1); + else + LPUART_SetIntMode(fmstr_serialBaseAddr, LPUART_INT_TX_DATA_REG_EMPTY, 0); +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit complete event +* +******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + // Single-wire communication is not (yet) enabled in this driver. +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + LPUART_SetIntMode(fmstr_serialBaseAddr, LPUART_INT_RX_DATA_REG_FULL, 1); + else + LPUART_SetIntMode(fmstr_serialBaseAddr, LPUART_INT_RX_DATA_REG_FULL, 0); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialLpuartIsTransmitRegEmpty(void) +{ + return LPUART_GetStatusFlag(fmstr_serialBaseAddr, LPUART_TX_DATA_REG_EMPTY); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialLpuartIsReceiveRegFull(void) +{ + return LPUART_GetStatusFlag(fmstr_serialBaseAddr, LPUART_RX_DATA_REG_FULL); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialLpuartIsTransmitterActive(void) +{ + return LPUART_GetStatusFlag(fmstr_serialBaseAddr, LPUART_TX_COMPLETE); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_SerialLpuartPutChar(FMSTR_BCHR ch) +{ + LPUART_Putchar9(fmstr_serialBaseAddr, (uint16_t)ch); +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_SerialLpuartGetChar(void) +{ + uint16_t readData; + LPUART_Getchar9(fmstr_serialBaseAddr, &readData) ; + return (unsigned char)(readData & 0xFF); +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ +static void _FMSTR_SerialLpuartFlush(void) +{ +} + +/****************************************************************************** +* +* @brief Assigning FreeMASTER communication module base address +* +******************************************************************************/ +void FMSTR_SerialSetBaseAddress(LPUART_Type *base) +{ + fmstr_serialBaseAddr = base; +} + +/****************************************************************************** +* +* @brief API: Interrupt handler call +* +* This Interrupt Service Routine handles the UART interrupts for the FreeMASTER +* driver. In case you want to handle the interrupt in the application yourselves, +* call the FMSTR_ProcessSerial function which +* does the same job but is not compiled as an Interrupt Service Routine. +* +* In poll-driven mode (FMSTR_POLL_DRIVEN) this function does nothing. +* +******************************************************************************/ + +void FMSTR_SerialIsr() +{ + /* process incomming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + #endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_SerialSetBaseAddress(LPUART_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32K1x_LPUART_ID) */ diff --git a/middleware/freemaster/src/drivers/ampxsdk/uart/S32K1x/freemaster_serial_lpuart.h b/middleware/freemaster/src/drivers/ampxsdk/uart/S32K1x/freemaster_serial_lpuart.h new file mode 100644 index 0000000..c2594c9 --- /dev/null +++ b/middleware/freemaster/src/drivers/ampxsdk/uart/S32K1x/freemaster_serial_lpuart.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - LPUART low-level driver + */ + +#ifndef __FREEMASTER_SERIAL_LPUART_H +#define __FREEMASTER_SERIAL_LPUART_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_uart.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "lpuart_hw_access.h" + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(LPUART_Type *base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +/**************************************************************************************** +* Global variable declaration +*****************************************************************************************/ +#endif /* __FREEMASTER_SERIAL_UART_H */ + diff --git a/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_eonce.c b/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_eonce.c new file mode 100644 index 0000000..e27d9bf --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_eonce.c @@ -0,0 +1,604 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2020-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - DSC JTAG EOnCE RTD Unit Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_56F800E_EONCE_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_56F800E_EONCE_ID) +#include "freemaster_serial.h" +#include "freemaster_56f800e_eonce.h" + +#if !(FMSTR_DISABLE) + +/*********************************** +* configuration check +***********************************/ + +#if FMSTR_USE_EONCE_TDF_WORKAROUND && (!FMSTR_POLL_DRIVEN) +#error FreeMASTER EOnCE communication with active TDF big workaround only works in polled mode. +#endif + +/*********************************** +* local variables +***********************************/ + +/* EOnCE bas address is the same for all DSC platforms */ +#define FMSTR_EONCE_BASE 0xFFFF00 + +/* EOnCE base address kept as U32 word, but still it needs the LDM to work. */ +#if defined(FMSTR_SERIAL_BASE) && ((FMSTR_SERIAL_BASE) != FMSTR_EONCE_BASE) + #warning FMSTR_SERIAL_BASE should not be specified when using JTAG EOnCE RTD Unit (undefine to use default 0xFFFF00) + static FMSTR_U32 fmstr_eonceBaseAddr = (FMSTR_U32)FMSTR_SERIAL_BASE; +#else + static FMSTR_U32 fmstr_eonceBaseAddr = 0; +#endif + +struct +{ + FMSTR_U32 txData; /* Cached 4 bytes of transmit data */ + FMSTR_U32 rxData; /* Cached 4 bytes of receive data */ + FMSTR_SIZE8 txSize; /* Number of bytes in transmit data cache */ + FMSTR_SIZE8 rxSize; /* Number of bytes in receive data cache */ + + union + { + FMSTR_FLAGS all; + struct + { + unsigned riePending : 1; /* RX interrupt is pending to be enabled */ + unsigned tdfNeedRead : 1; /* used with FMSTR_USE_EONCE_TDF_WORKAROUND logic */ + } bit; + } flags; + +} fmstr_eonceCtx; + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of EONCE driver adapter */ +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_Init(void); +static void _FMSTR_56F800E_EOnCE_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_56F800E_EOnCE_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_56F800E_EOnCE_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_56F800E_EOnCE_EnableReceiveInterrupt(FMSTR_BOOL enable); +static void _FMSTR_56F800E_EOnCE_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsTransmitterActive(void); +static void _FMSTR_56F800E_EOnCE_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_56F800E_EOnCE_GetChar(void); +static void _FMSTR_56F800E_EOnCE_Flush(void); +static void _FMSTR_56F800E_EOnCE_Poll(void); + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_ReadTDF(void); +static void _FMSTR_56F800E_EOnCE_TryReceiveData(void); +static void _FMSTR_56F800E_EOnCE_TryTransmitData(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this EONCE driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_56F800E_EONCE = +{ + FMSTR_C99_INIT(Init ) _FMSTR_56F800E_EOnCE_Init, + FMSTR_C99_INIT(EnableTransmit ) _FMSTR_56F800E_EOnCE_EnableTransmit, + FMSTR_C99_INIT(EnableReceive ) _FMSTR_56F800E_EOnCE_EnableReceive, + FMSTR_C99_INIT(EnableTransmitInterrupt ) _FMSTR_56F800E_EOnCE_EnableTransmitInterrupt, + FMSTR_C99_INIT(EnableTransmitCompleteInterrupt ) _FMSTR_56F800E_EOnCE_EnableTransmitCompleteInterrupt, + FMSTR_C99_INIT(EnableReceiveInterrupt ) _FMSTR_56F800E_EOnCE_EnableReceiveInterrupt, + FMSTR_C99_INIT(IsTransmitRegEmpty ) _FMSTR_56F800E_EOnCE_IsTransmitRegEmpty, + FMSTR_C99_INIT(IsReceiveRegFull ) _FMSTR_56F800E_EOnCE_IsReceiveRegFull, + FMSTR_C99_INIT(IsTransmitterActive ) _FMSTR_56F800E_EOnCE_IsTransmitterActive, + FMSTR_C99_INIT(PutChar ) _FMSTR_56F800E_EOnCE_PutChar, + FMSTR_C99_INIT(GetChar ) _FMSTR_56F800E_EOnCE_GetChar, + FMSTR_C99_INIT(Flush ) _FMSTR_56F800E_EOnCE_Flush, + FMSTR_C99_INIT(Poll ) _FMSTR_56F800E_EOnCE_Poll, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +/* When enabled, assembler macros will be used to access the EOnCE registers. This code + * is able to access the registers at 'far' address at base 0xffff00 even in SDM model. */ +#if 1 + +#define FMSTR_SETBIT(baseAddr, regOffset, bitField) do { \ + register FMSTR_U16* rX; \ + asm ( move.l baseAddr, rX); \ + asm ( bfset bitField, X:(rX+regOffset) ); \ + } while(0) + +#define FMSTR_CLRBIT(baseAddr, regOffset, bitField) do { \ + register FMSTR_U16* rX; \ + asm ( move.l baseAddr, rX); \ + asm ( bfclr bitField, X:(rX+regOffset) ); \ + } while(0) + +#define FMSTR_TSTBIT(baseAddr, regOffset, bitField) \ + (FMSTR_GETREG((baseAddr), (regOffset)) & (bitField)) + +static inline void FMSTR_SETREG(register FMSTR_U32 baseAddr, register FMSTR_U32 regOffset, register FMSTR_U16 newValue) +{ + register FMSTR_U16* rX; + baseAddr += regOffset; + asm ( move.l baseAddr, rX); + asm ( move.w newValue, X:(rX+0) ); +} + +static inline FMSTR_U16 FMSTR_GETREG(register FMSTR_U32 baseAddr, register FMSTR_U32 regOffset) +{ + register FMSTR_U16* rX; + register FMSTR_U16 val; + baseAddr += regOffset; + asm ( move.l baseAddr, rX); + asm ( move.w X:(rX+0), val ); + return val; +} + +static inline void FMSTR_SETREG32(register FMSTR_U32 baseAddr, register FMSTR_U32 regOffset, register FMSTR_U32 newValue) +{ + register FMSTR_U32* rX; + baseAddr += regOffset; + asm ( move.l baseAddr, rX); + asm ( move.l newValue, X:(rX+0) ); +} + +static inline FMSTR_U32 FMSTR_GETREG32(register FMSTR_U32 baseAddr, register FMSTR_U32 regOffset) +{ + register FMSTR_U32* rX; + register FMSTR_U32 val; + baseAddr += regOffset; + asm ( move.l baseAddr, rX); + asm ( move.l X:(rX+0), val ); + return val; +} + +#else /* When assembler macros are disabled above, this is an equivalent pure C code which will only work in LDM. */ + +#define FMSTR_SETBIT(base, offset, bit) (*(volatile FMSTR_U16*)(((FMSTR_U32)(base))+(offset)) |= bit) +#define FMSTR_CLRBIT(base, offset, bit) (*(volatile FMSTR_U16*)(((FMSTR_U32)(base))+(offset)) &= (FMSTR_U16)~((FMSTR_U16)(bit))) +#define FMSTR_TSTBIT(base, offset, bit) (*(volatile FMSTR_U16*)(((FMSTR_U32)(base))+(offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(volatile FMSTR_U16*)(((FMSTR_U32)(base))+(offset)) = value) +#define FMSTR_GETREG(base, offset) (*(volatile FMSTR_U16*)(((FMSTR_U32)(base))+(offset))) +#define FMSTR_SETREG32(base, offset, value) (*(volatile FMSTR_U32*)(((FMSTR_U32)(base))+(offset)) = value) +#define FMSTR_GETREG32(base, offset) (*(volatile FMSTR_U32*)(((FMSTR_U32)(base))+(offset))) + +#endif + + +/**************************************************************************************** +* EONCE module constants +*****************************************************************************************/ + +/* EONCE module registers */ +#define FMSTR_EONCE_OTXRXSR_OFFSET 0xfdU +#define FMSTR_EONCE_ORX_OFFSET 0xfeU +#define FMSTR_EONCE_OTX_OFFSET 0xfeU +#define FMSTR_EONCE_ORX1_OFFSET 0xffU +#define FMSTR_EONCE_OTX1_OFFSET 0xffU + +/* OTXRXSR register */ +#define FMSTR_EONCE_OTXRXSR_RDF 0x01U +#define FMSTR_EONCE_OTXRXSR_TDF 0x02U +#define FMSTR_EONCE_OTXRXSR_RIE 0x04U +#define FMSTR_EONCE_OTXRXSR_TIE 0x08U + +/****************************************************************************** +* +* EONCE communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_Init(void) +{ + /* Default EOnCE address is used */ + if(fmstr_eonceBaseAddr == 0) + fmstr_eonceBaseAddr = FMSTR_EONCE_BASE; + + fmstr_eonceCtx.flags.all = 0; + fmstr_eonceCtx.txSize = 0; + fmstr_eonceCtx.rxSize = 0; + return FMSTR_TRUE; +} + +/****************************************************************************** +* +* EONCE polling +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_Poll(void) +{ + /* In the JTAG interrupt-driven mode (both short and long), this function periodically checks + * if setting the JTAG RIE bit failed recently. This may happen because of the + * RIE is held low by the EONCE hardware until the EONCE is first accessed from host. + * The FMSTR_Init (->FMSTR_Listen) is often called while the PC-side FreeMASTER is still + * turned off. So the JTAG is not enabled at this time and RIE bit is not set. + * This problem is detected (see how riePending is set) and it is tried to be fixed + * periodically here in the poll call. + */ +#if FMSTR_SHORT_INTR || FMSTR_LONG_INTR + if(fmstr_eonceCtx.flags.bit.riePending) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR EOnCE Late RIE attempt\n"); +#endif + _FMSTR_56F800E_EOnCE_EnableReceiveInterrupt(FMSTR_TRUE); + } +#endif +} + +/****************************************************************************** +* +* Enable/Disable EONCE transmitter +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableTransmit(FMSTR_BOOL enable) +{ + if(!enable) + { + fmstr_eonceCtx.txSize = 0; +#if FMSTR_USE_EONCE_TDF_WORKAROUND + fmstr_eonceCtx.flags.bit.tdfNeedRead = 0; +#endif + } +} + +/****************************************************************************** +* +* Enable/Disable EONCE receiver +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableReceive(FMSTR_BOOL enable) +{ + if(!enable) + fmstr_eonceCtx.rxSize = 0; +} + +/****************************************************************************** +* +* Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_TIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_TIE); + } +} + +/****************************************************************************** +* +* Enable/Disable interrupt when transmission is complete (=idle) +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + /* no such interrupt, see how TDF is tested. */ +} + +/****************************************************************************** +* +* Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + /* this bit will be set eventually if enabling the interrupt fails */ + fmstr_eonceCtx.flags.bit.riePending = 0; + + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_RIE); + + /* On older core versions, enabling the interrupt may fail if JTAG module is not + * yet initialized by an external access. See the Poll call for more information. */ + if(!FMSTR_TSTBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_RIE)) + fmstr_eonceCtx.flags.bit.riePending = 1; + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_RIE); + } +} + +/****************************************************************************** +* +* Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsTransmitRegEmpty(void) +{ + /* Any space in transmit buffer? */ + if(fmstr_eonceCtx.txSize < 4) + return FMSTR_TRUE; + + /* Try to flush 4 bytes which are pending in our output buffer now */ + _FMSTR_56F800E_EOnCE_TryTransmitData(); + + /* Any free space by now? */ + return fmstr_eonceCtx.txSize < 4; +} + +/****************************************************************************** +* +* Try to receive some EOnCE data from the remote peer into the local buffer +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_TryReceiveData(void) +{ + if(FMSTR_TSTBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_RDF)) + { + fmstr_eonceCtx.rxData = FMSTR_GETREG32(fmstr_eonceBaseAddr, FMSTR_EONCE_ORX_OFFSET); + fmstr_eonceCtx.rxSize = 4; + +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR EOnCE RX %04lx\n", fmstr_eonceCtx.rxData); +#endif + } +} + +/****************************************************************************** +* +* Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsReceiveRegFull(void) +{ + /* Still some characters in the receive buffer? */ + if(fmstr_eonceCtx.rxSize > 0) + return FMSTR_TRUE; + + /* Try to get next 4 bytes */ + _FMSTR_56F800E_EOnCE_TryReceiveData(); + + /* Any data by now? */ + return fmstr_eonceCtx.rxSize > 0; +} + +/****************************************************************************** +* +* Low-level testing of TDF flag +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_ReadTDF(void) +{ + FMSTR_U16 statusReg = FMSTR_GETREG(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET); + + /* The TDF=0 indicates the transmitter has completed the physical transmission. */ + if(!(statusReg & FMSTR_EONCE_OTXRXSR_TDF)) + { +#if FMSTR_USE_EONCE_TDF_WORKAROUND + if(fmstr_eonceCtx.flags.bit.tdfNeedRead) + { + /* Silicon bug in older DSC parts makes TDF bit unusable (TDF gets reset too early). + The FreeMASTER tool sends a dummy confirmation word whenever it receives + word transmitted by us. This means we can use the RDF as an indication of !TDF */ + if(statusReg & FMSTR_EONCE_OTXRXSR_RDF) + { + /* Read and discard the data. */ + FMSTR_U32 dummyRx = FMSTR_GETREG32(fmstr_eonceBaseAddr, FMSTR_EONCE_ORX_OFFSET); +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR EOnCE Dummy RX for !TDF %04lx\n", dummyRx); +#endif + fmstr_eonceCtx.flags.bit.tdfNeedRead = 0; + return FMSTR_FALSE; + } + else + { + return FMSTR_TRUE; /* Not received anything, transmitter is still active. */ + } + } + else + { + /* We only check the RDF once per each transmitted word */ + return FMSTR_FALSE; + } +#else + /* Modern DSC parts should have the bug fixed, so we can rely on the TDF bit. */ + return FMSTR_FALSE; +#endif + } + + /* Transmitter is still active. */ + return FMSTR_TRUE; +} + +/****************************************************************************** +* +* Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsTransmitterActive(void) +{ + /* this call should only be used after flush */ + FMSTR_ASSERT(fmstr_eonceCtx.txSize == 0 || fmstr_eonceCtx.txSize == 4); + + /* Try physical flushing if word is still pending */ + if(fmstr_eonceCtx.txSize == 4) + _FMSTR_56F800E_EOnCE_TryTransmitData(); + + return fmstr_eonceCtx.txSize > 0 || _FMSTR_56F800E_EOnCE_ReadTDF(); +} + +/****************************************************************************** +* +* The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_PutChar(FMSTR_BCHR ch) +{ + /* There should be space */ + if(fmstr_eonceCtx.txSize < 4) + { + fmstr_eonceCtx.txData = (fmstr_eonceCtx.txData << 8) | (ch & 0xff); + fmstr_eonceCtx.txSize++; + + if(fmstr_eonceCtx.txSize == 4) + _FMSTR_56F800E_EOnCE_TryTransmitData(); + } + else + { + /* Caller hasn't checked if IsTransmitRegEmpty */ + FMSTR_ASSERT(0); + } +} + +/****************************************************************************** +* +* The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_56F800E_EOnCE_GetChar(void) +{ + FMSTR_BCHR ch = 0; + + if(fmstr_eonceCtx.rxSize > 0) + { + ch = (FMSTR_BCHR)((fmstr_eonceCtx.rxData >> 24) & 0xff); + fmstr_eonceCtx.rxData <<= 8; + fmstr_eonceCtx.rxSize--; + } + else + { + /* Caller hasn't checked if IsReceiveRegFull */ + FMSTR_ASSERT(0); + } + + return ch; +} + +/****************************************************************************** +* +* Sends buffered 32bit word +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_TryTransmitData(void) +{ + /* This should only be used when full word is ready */ + FMSTR_ASSERT(fmstr_eonceCtx.txSize == 4); + + /* Is it possible to transmit physically now? */ + if(!_FMSTR_56F800E_EOnCE_ReadTDF()) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR EOnCE TX %04lx\n", fmstr_eonceCtx.txData); +#endif + /* OK put to physical transmit buffer */ + FMSTR_SETREG32(fmstr_eonceBaseAddr, FMSTR_EONCE_OTX_OFFSET, fmstr_eonceCtx.txData); + fmstr_eonceCtx.txSize = 0; + + /* To fix the TDF behavior, we will perform dummy reading. */ +#if FMSTR_USE_EONCE_TDF_WORKAROUND + fmstr_eonceCtx.flags.bit.tdfNeedRead = 1; +#endif + } +} + +/****************************************************************************** +* +* Send buffered data +* +******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_Flush(void) +{ + /* If anything pending to be transmitted. */ + if(fmstr_eonceCtx.txSize) + { + /* Send dummy 0xff bytes to wrap up to 4 bytes */ + if(fmstr_eonceCtx.txSize < 4) + { + FMSTR_SIZE8 shift = 8*(4-fmstr_eonceCtx.txSize); + fmstr_eonceCtx.txData = (fmstr_eonceCtx.txData << shift) | ((1< 0 + /* Any data received? */ + FMSTR_U32 iflag = FMSTR_GETREG32(FMSTR_FCANIFLAG_OFFSET); + + if((iflag & FMSTR_FLEXCAN_RXMB_FLAG) == 0) + return 0; + + FMSTR_SETREG32(FMSTR_FCANIFLAG_OFFSET, FMSTR_FLEXCAN_RXMB_FLAG); +#endif /* FMSTR_POLL_DRIVEN */ + + do + { + sr = FMSTR_GETREG32(FMSTR_FCANRXFG_OFFSET + FMSTR_FCMBCSR); + } while(sr & FMSTR_FCANMB_BUSY); + + code = sr & FMSTR_FCANMB_CODE_MASK; + + if(code == FMSTR_FCANMB_CRXOVERRUN) + _fmstr_canRxFrame.len = 0; + + if(code == FMSTR_FCANMB_CRXFULL || code == FMSTR_FCANMB_CRXOVERRUN) + { + _fmstr_canRxFrame.len = (FMSTR_U16)((sr & FMSTR_FCMBCSR_DLC_MASK) >> FMSTR_FCMBCSR_DLC_SHIFT); + _fmstr_canRxFrame.idr = FMSTR_GETREG32(FMSTR_FCANRXFG_OFFSET + FMSTR_FCMBIDR); + _fmstr_canRxFrame.data[0] = FMSTR_GETREG32(FMSTR_FCANRXFG_OFFSET + FMSTR_FCMBDATA0); + _fmstr_canRxFrame.data[1] = FMSTR_GETREG32(FMSTR_FCANRXFG_OFFSET + FMSTR_FCMBDATA1); + + if(sr & FMSTR_FCMBCSR_IDE) + _fmstr_canRxFrame.idr |= FMSTR_FCANIDR_EXT_FLG; + + /* discard frames that are not matching our required ID */ + if(_fmstr_canRxFrame.idr != _fmstr_canIdrRx) + _fmstr_canRxFrame.len = 0; + } + + /* dummy read of timer register to unlock MB*/ + FMSTR_GETREG32(FMSTR_FCANTMR_OFFSET); + } + + return _fmstr_canRxFrame.len; +} + +static FMSTR_BCHR _FMSTR_56F800E_FlexCAN_GetRxFrameByte(FMSTR_SIZE8 index) +{ + FMSTR_INDEX i = (index>>2)&1; + FMSTR_U32 d32 = _fmstr_canRxFrame.data[i]; + d32 >>= 8*(3-(index&3)); + return (FMSTR_BCHR)(d32 & 0xff); +} + +static void _FMSTR_56F800E_FlexCAN_AckRxFrame(void) +{ + _fmstr_canRxFrame.len = 0; +} + +static FMSTR_BOOL _FMSTR_56F800E_FlexCAN_PrepareTxFrame(void) +{ +#if FMSTR_POLL_DRIVEN > 0 + FMSTR_U32 iflag = FMSTR_GETREG32(FMSTR_FCANIFLAG_OFFSET); + + /* All data sent? */ + if(_fmstr_canTxFrame.len && (iflag & FMSTR_FLEXCAN_TXMB_FLAG) == 0) + return FMSTR_FALSE; /* not yet */ + + /* Clear TX status flag */ + FMSTR_SETREG32(FMSTR_FCANIFLAG_OFFSET, FMSTR_FLEXCAN_TXMB_FLAG); + + /* Acknowledge frame was transmitted */ + _fmstr_canTxFrame.len = 0; +#else + /* transmission in progress */ + if(_fmstr_canTxFrame.len) + return FMSTR_FALSE; +#endif /* FMSTR_POLL_DRIVEN */ + + /* set as transmit-emtpy MB */ + FMSTR_SETREG32(FMSTR_FCANTXFG_OFFSET + FMSTR_FCMBIDR, _fmstr_canIdrTx & FMSTR_FCMBIDR_IDR_MASK); + FMSTR_SETREG32(FMSTR_FCANTXFG_OFFSET + FMSTR_FCMBCSR, FMSTR_FCANMB_CTXEMPTY); + + return FMSTR_TRUE; +} + +static void _FMSTR_56F800E_FlexCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data) +{ + FMSTR_INDEX i = (index>>2)&1; + FMSTR_U32 d32 = _fmstr_canTxFrame.data[i]; + FMSTR_SIZE shift = 8*(3-(index&3)); + + d32 &= ~(0xffUL << shift); + d32 |= ((FMSTR_U32)data) << shift; + + _fmstr_canTxFrame.data[i] = d32; +} + +static void _FMSTR_56F800E_FlexCAN_SendTxFrame(FMSTR_SIZE8 len) +{ + FMSTR_U32 cr = ((((FMSTR_U32)len) << FMSTR_FCMBCSR_DLC_SHIFT) & FMSTR_FCMBCSR_DLC_MASK); + cr |= (_fmstr_canIdrTx & FMSTR_FCANIDR_EXT_FLG) ? (FMSTR_FCMBCSR_IDE | FMSTR_FCMBCSR_SRR) : 0; + + _fmstr_canTxFrame.len = len; + + FMSTR_SETREG32(FMSTR_FCANTXFG_OFFSET+FMSTR_FCMBDATA0, _fmstr_canTxFrame.data[0]); + FMSTR_SETREG32(FMSTR_FCANTXFG_OFFSET+FMSTR_FCMBDATA1, _fmstr_canTxFrame.data[1]); + FMSTR_SETREG32(FMSTR_FCANTXFG_OFFSET + FMSTR_FCMBCSR, FMSTR_FCANMB_CTXTRANS_ONCE | cr); +} + +/****************************************************************************** +* +* @brief Assigning FreeMASTER communication module base address +* +******************************************************************************/ +void FMSTR_CanSetBaseAddress(FMSTR_U16 base) +{ + fmstr_canBaseAddr = base; +} + +void FMSTR_CanIsr(void) +{ +#if FMSTR_LONG_INTR || FMSTR_SHORT_INTR + FMSTR_U32 esr = FMSTR_GETREG32(FMSTR_FCANESR1_OFFSET); + FMSTR_U32 iflag = FMSTR_GETREG32(FMSTR_FCANIFLAG_OFFSET); + + /* Acknowledge (ignore) error and wake up flags in ESR */ + FMSTR_SETREG32(FMSTR_FCANESR1_OFFSET, esr); + + if(iflag) + { + if(iflag & FMSTR_FLEXCAN_RXMB_FLAG) + { + FMSTR_ProcessCanRx(); + } + + if(iflag & FMSTR_FLEXCAN_TXMB_FLAG) + { + /* Acknowledge frame transmission */ + _fmstr_canTxFrame.len = 0; + /* Send next frame, if needed */ + FMSTR_ProcessCanTx(); + } + + /* Clear all MB interrupt flags */ + FMSTR_SETREG32(FMSTR_FCANIFLAG_OFFSET, iflag); + } +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_CanSetBaseAddress(FMSTR_U16 base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_CanIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_56F800E_FLEXCAN) */ diff --git a/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_flexcan.h b/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_flexcan.h new file mode 100644 index 0000000..6a487c7 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_flexcan.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - 56F800E FlexCAN low-level driver + */ + +#ifndef __FREEMASTER_56F800E_FLEXCAN_H +#define __FREEMASTER_56F800E_FLEXCAN_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_56f800e_flexcan.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +/* flexcan needs to know the transmit and receive MB number */ +#if ((FMSTR_USE_FLEXCAN) || (FMSTR_USE_FLEXCAN32)) + /* Flexcan TX message buffer must be defined */ + #ifndef FMSTR_FLEXCAN_TXMB + /* #error FlexCAN transmit buffer needs to be specified (use FMSTR_FLEXCAN_TXMB) */ + #warning "FlexCAN Message Buffer 0 is used for transmitting messages" + #define FMSTR_FLEXCAN_TXMB 0 + #endif + /* Flexcan RX message buffer must be defined */ + #ifndef FMSTR_FLEXCAN_RXMB + /* #error FlexCAN receive buffer needs to be specified (use FMSTR_FLEXCAN_RXMB) */ + #warning "FlexCAN Message Buffer 1 is used for receiving messages" + #define FMSTR_FLEXCAN_RXMB 1 + #endif +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_CanSetBaseAddress(FMSTR_U16 base); +void FMSTR_CanIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_56F800E_FLEXCAN_H */ + diff --git a/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_qsci.c b/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_qsci.c new file mode 100644 index 0000000..ffb81b3 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_qsci.c @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_56F800E_QSCI_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_56F800E_QSCI_ID) +#include "freemaster_serial.h" +#include "freemaster_56f800e_qsci.h" + +#if !(FMSTR_DISABLE) + +/*********************************** +* local variables +***********************************/ + +/* SCI base address kept as word pointer on DSC platform */ +#ifdef FMSTR_SERIAL_BASE + static FMSTR_U16 fmstr_sciBaseAddr = (FMSTR_U16)FMSTR_SERIAL_BASE; +#else + static FMSTR_U16 fmstr_sciBaseAddr = 0; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of SCI driver adapter */ +static FMSTR_BOOL _FMSTR_56F800E_Sci_Init(void); +static void _FMSTR_56F800E_Sci_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_56F800E_Sci_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_56F800E_Sci_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_56F800E_Sci_EnableReceiveInterrupt(FMSTR_BOOL enable); +static void _FMSTR_56F800E_Sci_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_56F800E_Sci_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_56F800E_Sci_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_56F800E_Sci_IsTransmitterActive(void); +static void _FMSTR_56F800E_Sci_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_56F800E_Sci_GetChar(void); +static void _FMSTR_56F800E_Sci_Flush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this SCI driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_56F800E_QSCI = +{ + FMSTR_C99_INIT(Init ) _FMSTR_56F800E_Sci_Init, + FMSTR_C99_INIT(EnableTransmit ) _FMSTR_56F800E_Sci_EnableTransmit, + FMSTR_C99_INIT(EnableReceive ) _FMSTR_56F800E_Sci_EnableReceive, + FMSTR_C99_INIT(EnableTransmitInterrupt ) _FMSTR_56F800E_Sci_EnableTransmitInterrupt, + FMSTR_C99_INIT(EnableTransmitCompleteInterrupt ) _FMSTR_56F800E_Sci_EnableTransmitCompleteInterrupt, + FMSTR_C99_INIT(EnableReceiveInterrupt ) _FMSTR_56F800E_Sci_EnableReceiveInterrupt, + FMSTR_C99_INIT(IsTransmitRegEmpty ) _FMSTR_56F800E_Sci_IsTransmitRegEmpty, + FMSTR_C99_INIT(IsReceiveRegFull ) _FMSTR_56F800E_Sci_IsReceiveRegFull, + FMSTR_C99_INIT(IsTransmitterActive ) _FMSTR_56F800E_Sci_IsTransmitterActive, + FMSTR_C99_INIT(PutChar ) _FMSTR_56F800E_Sci_PutChar, + FMSTR_C99_INIT(GetChar ) _FMSTR_56F800E_Sci_GetChar, + FMSTR_C99_INIT(Flush ) _FMSTR_56F800E_Sci_Flush, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +#define FMSTR_SETBIT(base, offset, bit) (*(volatile FMSTR_U16*)(((FMSTR_U16)(base))+(offset)) |= bit) +#define FMSTR_CLRBIT(base, offset, bit) (*(volatile FMSTR_U16*)(((FMSTR_U16)(base))+(offset)) &= (FMSTR_U16)~((FMSTR_U16)(bit))) +#define FMSTR_TSTBIT(base, offset, bit) (*(volatile FMSTR_U16*)(((FMSTR_U16)(base))+(offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(volatile FMSTR_U16*)(((FMSTR_U16)(base))+(offset)) = value) +#define FMSTR_GETREG(base, offset) (*(volatile FMSTR_U16*)(((FMSTR_U16)(base))+(offset))) + +/**************************************************************************************** +* SCI module constants +*****************************************************************************************/ + +/* SCI module registers */ +#define FMSTR_SCIBR_OFFSET 0U +#define FMSTR_SCICR_OFFSET 1U +#define FMSTR_SCISR_OFFSET 3U +#define FMSTR_SCIDR_OFFSET 4U + +/* SCI Control Register bits */ +#define FMSTR_SCICR_LOOP 0x8000U +#define FMSTR_SCICR_SWAI 0x4000U +#define FMSTR_SCICR_RSRC 0x2000U +#define FMSTR_SCICR_M 0x1000U +#define FMSTR_SCICR_WAKE 0x0800U +#define FMSTR_SCICR_POL 0x0400U +#define FMSTR_SCICR_PE 0x0200U +#define FMSTR_SCICR_PT 0x0100U +#define FMSTR_SCICR_TEIE 0x0080U +#define FMSTR_SCICR_TIIE 0x0040U +#define FMSTR_SCICR_RFIE 0x0020U +#define FMSTR_SCICR_REIE 0x0010U +#define FMSTR_SCICR_TE 0x0008U +#define FMSTR_SCICR_RE 0x0004U +#define FMSTR_SCICR_RWU 0x0002U +#define FMSTR_SCICR_SBK 0x0001U + +/* SCI Status registers bits */ +#define FMSTR_SCISR_TDRE 0x8000U +#define FMSTR_SCISR_TIDLE 0x4000U +#define FMSTR_SCISR_RDRF 0x2000U +#define FMSTR_SCISR_RIDLE 0x1000U +#define FMSTR_SCISR_OR 0x0800U +#define FMSTR_SCISR_NF 0x0400U +#define FMSTR_SCISR_FE 0x0200U +#define FMSTR_SCISR_PF 0x0100U +#define FMSTR_SCISR_RAF 0x0001U + +/****************************************************************************** +* +* @brief SCI communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_Sci_Init(void) +{ +#if FMSTR_SERIAL_SINGLEWIRE + #error Internal single wire mode is not supported. + return FMSTR_FALSE; +#endif + + /* valid runtime module address must be assigned */ + if(fmstr_sciBaseAddr != 0) + return FMSTR_TRUE; + else + return FMSTR_FALSE; +} + +/****************************************************************************** +* +* @brief Enable/Disable SCI transmitter +* +******************************************************************************/ + +static void _FMSTR_56F800E_Sci_EnableTransmit(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable transmitter */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TE); + } + else + { + /* Disable transmitter */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable SCI receiver +* +******************************************************************************/ + +static void _FMSTR_56F800E_Sci_EnableReceive(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable receiver */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_RE); + } + else + { + /* Disable receiver */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_RE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_56F800E_Sci_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TEIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TEIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt when transmission is complete (=idle) +* +******************************************************************************/ + +static void _FMSTR_56F800E_Sci_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TIIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TIIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_56F800E_Sci_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_RFIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR_OFFSET, FMSTR_SCICR_RFIE); + } +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_Sci_IsTransmitRegEmpty(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_sciBaseAddr, FMSTR_SCISR_OFFSET, FMSTR_SCISR_TDRE); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_Sci_IsReceiveRegFull(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_sciBaseAddr, FMSTR_SCISR_OFFSET, FMSTR_SCISR_RDRF); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_Sci_IsTransmitterActive(void) +{ + return !(FMSTR_TSTBIT(fmstr_sciBaseAddr, FMSTR_SCISR_OFFSET, FMSTR_SCISR_TIDLE)); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_56F800E_Sci_PutChar(FMSTR_BCHR ch) +{ + FMSTR_SETREG(fmstr_sciBaseAddr, FMSTR_SCIDR_OFFSET, ch); +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_56F800E_Sci_GetChar(void) +{ + FMSTR_BCHR ch = FMSTR_GETREG(fmstr_sciBaseAddr, FMSTR_SCIDR_OFFSET); + + /* also clear overrun (OR) flag to prevent excessive interrupts */ + if(FMSTR_TSTBIT(fmstr_sciBaseAddr, FMSTR_SCISR_OFFSET, FMSTR_SCISR_OR)) + FMSTR_SETREG(fmstr_sciBaseAddr, FMSTR_SCISR_OFFSET, FMSTR_SCISR_OR); + + return ch; +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ + +static void _FMSTR_56F800E_Sci_Flush(void) +{ +} + +/****************************************************************************** +* +* @brief Assign FreeMASTER communication module base address +* +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_U16 base) +{ + fmstr_sciBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Process FreeMASTER serial interrupt (call this function from SCI ISR) +* +******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* process incoming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + + /* Clear any error bits by reading SR and writing 0 back */ + FMSTR_GETREG(fmstr_sciBaseAddr, FMSTR_SCISR_OFFSET); + FMSTR_SETREG(fmstr_sciBaseAddr, FMSTR_SCISR_OFFSET, 0); + + #endif +} + +#else /* !(FMSTR_DISABLE) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_SerialSetBaseAddress(FMSTR_U16 base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_56F800E_SCI_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_qsci.h b/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_qsci.h new file mode 100644 index 0000000..28a6e03 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/DSC/freemaster_56f800e_qsci.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - 56F800E QSCI low-level driver + */ + +#ifndef __FREEMASTER_56F800E_QSCI_H +#define __FREEMASTER_56F800E_QSCI_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_56f800e_qsci.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +/* Expecting DSC word address as a peripheral base address */ +void FMSTR_SerialSetBaseAddress(FMSTR_U16 base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_56F800E_QSCI_H */ + diff --git a/middleware/freemaster/src/drivers/dreg/Kxx/freemaster_kxx_uart.c b/middleware/freemaster/src/drivers/dreg/Kxx/freemaster_kxx_uart.c new file mode 100644 index 0000000..2f4cd69 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/Kxx/freemaster_kxx_uart.c @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* The help definition to enable/disable context of that driver, by used system */ +#define FMSTR_SERIAL_DREG_KXX_UART_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_DREG_KXX_UART_ID) +#if !(FMSTR_DISABLE) + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" +#include "freemaster_serial_uart.h" + +/*********************************** +* local variables +***********************************/ + +/* Serial base address */ +#ifdef FMSTR_SERIAL_BASE + static FMSTR_UART_Type *fmstr_serialBaseAddr = FMSTR_SERIAL_BASE; +#else + static FMSTR_UART_Type *fmstr_serialBaseAddr = NULL; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of serial UART driver adapter */ +static FMSTR_BOOL _FMSTR_SerialUartInit(void); +static void _FMSTR_SerialUartEnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableReceive(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_SerialUartIsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitterActive(void); +static void _FMSTR_SerialUartPutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_SerialUartGetChar(void); +static void _FMSTR_SerialUartFlush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this serial UART driver */ +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_DREG_KXX_UART = +{ + .Init = _FMSTR_SerialUartInit, + .EnableTransmit = _FMSTR_SerialUartEnableTransmit, + .EnableReceive = _FMSTR_SerialUartEnableReceive, + .EnableTransmitInterrupt = _FMSTR_SerialUartEnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt= _FMSTR_SerialUartEnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_SerialUartEnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_SerialUartIsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_SerialUartIsReceiveRegFull, + .IsTransmitterActive = _FMSTR_SerialUartIsTransmitterActive, + .PutChar = _FMSTR_SerialUartPutChar, + .GetChar = _FMSTR_SerialUartGetChar, + .Flush = _FMSTR_SerialUartFlush, + +}; + +/****************************************************************************** +* +* @brief Serial communication initialization +* +******************************************************************************/ +static FMSTR_BOOL _FMSTR_SerialUartInit(void) +{ + /* Valid runtime module address must be assigned */ + if(!fmstr_serialBaseAddr) + return FMSTR_FALSE; + + /* WARNING: make sure you define the FSL_FEATURE_UART_HAS_FIFO macro when the + peripheral has the hardware FIFO buffer (or include the MCUXpresso SDK's "fsl_common.h"). */ +#if defined(FSL_FEATURE_UART_HAS_FIFO) && FSL_FEATURE_UART_HAS_FIFO + /* The current version can not work with enabled FIFO. Disable it. */ + fmstr_serialBaseAddr->PFIFO &= ~(UART_PFIFO_TXFE_MASK | UART_PFIFO_RXFE_MASK); +#endif + +#if FMSTR_SERIAL_SINGLEWIRE + /* Enable single wire mode and force TX and RX to be enabled all the time. */ + fmstr_serialBaseAddr->C1 |= FMSTR_UART_C1_LOOPS_MASK | FMSTR_UART_C1_RSRC_MASK; + _FMSTR_SerialUartEnableTransmit(1); + _FMSTR_SerialUartEnableReceive(1); +#endif + + return FMSTR_TRUE; +} + +/****************************************************************************** +* +* @brief Enable/Disable Serial transmitter +* +******************************************************************************/ + +static void _FMSTR_SerialUartEnableTransmit(FMSTR_BOOL enable) +{ +#if FMSTR_SERIAL_SINGLEWIRE + /* In single-wire mode, the Transmitter is never physically disabled since it was + enabled in the Init() call. The TX pin direction is being changed only. */ + if (enable) + fmstr_serialBaseAddr->C3 |= FMSTR_UART_C3_TXDIR_MASK; + else + fmstr_serialBaseAddr->C3 &= ~FMSTR_UART_C3_TXDIR_MASK; +#else + /* In normal mode (or "external" single-wire mode) the Transmitter is controlled. */ + if (enable) + fmstr_serialBaseAddr->C2 |= FMSTR_UART_C2_TE_MASK; + else + fmstr_serialBaseAddr->C2 &= ~FMSTR_UART_C2_TE_MASK; +#endif +} + +/****************************************************************************** +* +* @brief Enable/Disable Serial receiver +* +******************************************************************************/ + +static void _FMSTR_SerialUartEnableReceive(FMSTR_BOOL enable) +{ +#if FMSTR_SERIAL_SINGLEWIRE + /* In single-wire mode, the Receiver is never physically disabled since it was + enabled in the Init() call. The TX pin direction is being changed only. */ + FMSTR_UNUSED(enable); +#else + /* In normal mode (or "external" single-wire mode) the Receiver is controlled. */ + if (enable) + fmstr_serialBaseAddr->C2 |= FMSTR_UART_C2_RE_MASK; + else + fmstr_serialBaseAddr->C2 &= ~FMSTR_UART_C2_RE_MASK; +#endif +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_SerialUartEnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + fmstr_serialBaseAddr->C2 |= FMSTR_UART_C2_TIE_MASK; + else + fmstr_serialBaseAddr->C2 &= ~FMSTR_UART_C2_TIE_MASK; +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit complete event +* +******************************************************************************/ + +static void _FMSTR_SerialUartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if(enable) + fmstr_serialBaseAddr->C2 |= FMSTR_UART_C2_TCIE_MASK; + else + fmstr_serialBaseAddr->C2 &= ~FMSTR_UART_C2_TCIE_MASK; +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_SerialUartEnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + fmstr_serialBaseAddr->C2 |= FMSTR_UART_C2_RIE_MASK; + else + fmstr_serialBaseAddr->C2 &= ~FMSTR_UART_C2_RIE_MASK; +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitRegEmpty(void) +{ + return fmstr_serialBaseAddr->S1 & FMSTR_UART_S1_TDRE_MASK; +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUartIsReceiveRegFull(void) +{ + return fmstr_serialBaseAddr->S1 & FMSTR_UART_S1_RDRF_MASK; +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitterActive(void) +{ + return !(fmstr_serialBaseAddr->S1 & FMSTR_UART_S1_TC_MASK); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_SerialUartPutChar(FMSTR_BCHR ch) +{ + fmstr_serialBaseAddr->D = ch; +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_SerialUartGetChar(void) +{ + return fmstr_serialBaseAddr->D; +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ +static void _FMSTR_SerialUartFlush(void) +{ +} + +/****************************************************************************** +* +* @brief Assigning FreeMASTER communication module base address +* +******************************************************************************/ +void FMSTR_SerialSetBaseAddress(void *base) +{ + fmstr_serialBaseAddr = (FMSTR_UART_Type*)base; +} + +/****************************************************************************** +* +* @brief API: Interrupt handler call +* +* This Interrupt Service Routine handles the UART interrupts for the FreeMASTER +* driver. In case you want to handle the interrupt in the application yourselves, +* call the FMSTR_ProcessSerial function which +* does the same job but is not compiled as an Interrupt Service Routine. +* +* In poll-driven mode (FMSTR_POLL_DRIVEN) this function does nothing. +* +******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* process incomming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + #endif + +} + +#else /* !(FMSTR_DISABLE) */ + +void FMSTR_SerialSetBaseAddress(void *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_DREG_KXX_UART_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/Kxx/freemaster_kxx_uart.h b/middleware/freemaster/src/drivers/dreg/Kxx/freemaster_kxx_uart.h new file mode 100644 index 0000000..6500aa4 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/Kxx/freemaster_kxx_uart.h @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - UART low-level driver + */ + +#ifndef __FREEMASTER_SERIAL_DREG_KXX_UART_H +#define __FREEMASTER_SERIAL_DREG_KXX_UART_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_uart.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/** UART - Register Layout Typedef */ +typedef struct { + FMSTR_U8 BDH; /**< UART Baud Rate Registers: High, offset: 0x0 */ + FMSTR_U8 BDL; /**< UART Baud Rate Registers: Low, offset: 0x1 */ + FMSTR_U8 C1; /**< UART Control Register 1, offset: 0x2 */ + FMSTR_U8 C2; /**< UART Control Register 2, offset: 0x3 */ + FMSTR_U8 S1; /**< UART Status Register 1, offset: 0x4 */ + FMSTR_U8 S2; /**< UART Status Register 2, offset: 0x5 */ + FMSTR_U8 C3; /**< UART Control Register 3, offset: 0x6 */ + FMSTR_U8 D; /**< UART Data Register, offset: 0x7 */ + FMSTR_U8 MA1; /**< UART Match Address Registers 1, offset: 0x8 */ + FMSTR_U8 MA2; /**< UART Match Address Registers 2, offset: 0x9 */ + FMSTR_U8 C4; /**< UART Control Register 4, offset: 0xA */ + FMSTR_U8 C5; /**< UART Control Register 5, offset: 0xB */ + FMSTR_U8 ED; /**< UART Extended Data Register, offset: 0xC */ + FMSTR_U8 MODEM; /**< UART Modem Register, offset: 0xD */ + FMSTR_U8 IR; /**< UART Infrared Register, offset: 0xE */ + FMSTR_U8 RESERVED_0; + FMSTR_U8 PFIFO; /**< UART FIFO Parameters, offset: 0x10 */ +} FMSTR_UART_Type; + +/*! C1_RSRC - Receiver Source Select + * 0b0..Selects internal loop back mode. The receiver input is internally connected to transmitter output. + * 0b1..Single wire UART mode where the receiver input is connected to the transmit pin input signal. + */ +#define FMSTR_UART_C1_RSRC_MASK (0x20U) + +/*! C1_LOOPS - Loop Mode Select + * 0b0..Normal operation. + * 0b1..Loop mode where transmitter output is internally connected to receiver input. The receiver input is determined by RSRC. + */ +#define FMSTR_UART_C1_LOOPS_MASK (0x80U) + +/*! C2_RE - Receiver Enable + * 0b0..Receiver off. + * 0b1..Receiver on. + */ +#define FMSTR_UART_C2_RE_MASK (0x4U) + +/*! C2_TE - Transmitter Enable + * 0b0..Transmitter off. + * 0b1..Transmitter on. + */ +#define FMSTR_UART_C2_TE_MASK (0x8U) + +/*! C2_RIE - Receiver Full Interrupt or DMA Transfer Enable + * 0b0..RDRF interrupt and DMA transfer requests disabled. + * 0b1..RDRF interrupt or DMA transfer requests enabled. + */ +#define FMSTR_UART_C2_RIE_MASK (0x20U) + +/*! C2_TCIE - Transmission Complete Interrupt or DMA Transfer Enable + * 0b0..TC interrupt and DMA transfer requests disabled. + * 0b1..TC interrupt or DMA transfer requests enabled. + */ +#define FMSTR_UART_C2_TCIE_MASK (0x40U) + +/*! C2_TIE - Transmitter Interrupt or DMA Transfer Enable. + * 0b0..TDRE interrupt and DMA transfer requests disabled. + * 0b1..TDRE interrupt or DMA transfer requests enabled. + */ +#define FMSTR_UART_C2_TIE_MASK (0x80U) + +/*! S1_RDRF - Receive Data Register Full Flag + * 0b0..The number of datawords in the receive buffer is less than the number indicated by RXWATER. + * 0b1..The number of datawords in the receive buffer is equal to or greater than the number indicated by RXWATER at some point in time since this flag was last cleared. + */ +#define FMSTR_UART_S1_RDRF_MASK (0x20U) + +/*! C3_TXDIR - Transmitter Pin Data Direction in Single-Wire mode + * 0b0..TXD pin is an input in single wire mode. + * 0b1..TXD pin is an output in single wire mode. + */ +#define FMSTR_UART_C3_TXDIR_MASK (0x20U) + +/*! S1_TC - Transmit Complete Flag + * 0b0..Transmitter active (sending data, a preamble, or a break). + * 0b1..Transmitter idle (transmission activity complete). + */ +#define FMSTR_UART_S1_TC_MASK (0x40U) + +/*! S1_TDRE - Transmit Data Register Empty Flag + * 0b0..The amount of data in the transmit buffer is greater than the value indicated by TWFIFO[TXWATER]. + * 0b1..The amount of data in the transmit buffer is less than or equal to the value indicated by TWFIFO[TXWATER] at some point in time since the flag has been cleared. + */ +#define FMSTR_UART_S1_TDRE_MASK (0x80U) + +/*! PFIFO_TXFE - Transmit FIFO Enable + * 0b0..Transmit FIFO is not enabled. Buffer is depth 1. (Legacy support). + * 0b1..Transmit FIFO is enabled. Buffer is depth indicated by TXFIFOSIZE. + */ +#define FMSTR_UART_PFIFO_TXFE_MASK (0x80U) + +/*! PFIFO_RXFE - Receive FIFO Enable + * 0b0..Receive FIFO is not enabled. Buffer is depth 1. (Legacy support) + * 0b1..Receive FIFO is enabled. Buffer is depth indicted by RXFIFOSIZE. + */ +#define FMSTR_UART_PFIFO_RXFE_MASK (0x8U) + + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(void *base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_SERIAL_DREG_KXX_UART_H */ + diff --git a/middleware/freemaster/src/drivers/dreg/MPC/freemaster_mpc574xp_linflex.c b/middleware/freemaster/src/drivers/dreg/MPC/freemaster_mpc574xp_linflex.c new file mode 100644 index 0000000..28625cf --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/MPC/freemaster_mpc574xp_linflex.c @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_MPC57XP_LINFLEX_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MPC57XP_LINFLEX_ID) +#if !(FMSTR_DISABLE) + +#include "freemaster_serial.h" +#include "freemaster_mpc574xp_linflex.h" + +/*********************************** +* local variables +***********************************/ + +/* SCI base address */ +#ifdef FMSTR_LINFLEXD_BASE + static FMSTR_ADDR fmstr_LINFLEXDBaseAddr = (FMSTR_ADDR)FMSTR_LINFLEXD_BASE; +#else + static FMSTR_ADDR fmstr_LINFLEXDBaseAddr = (FMSTR_ADDR)0; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of SCI driver adapter */ +static FMSTR_BOOL _FMSTR_MPC574XP_Init(void); +static void _FMSTR_MPC574XP_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_MPC574XP_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_MPC574XP_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_MPC574XP_EnableReceiveInterrupt(FMSTR_BOOL enable); +static void _FMSTR_MPC574XP_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_MPC574XP_GetChar(void); +static FMSTR_BOOL _FMSTR_MPC574XP_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_MPC574XP_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_MPC574XP_IsTransmitterActive(void); +//static void _FMSTR_S12zSci_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); + +static void _FMSTR_MPC574XP_Flush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this SCI driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_MPC57XP_LINFLEX = +{ + .Init = _FMSTR_MPC574XP_Init, + .EnableTransmit = _FMSTR_MPC574XP_EnableTransmit, + .EnableReceive = _FMSTR_MPC574XP_EnableReceive, + .EnableTransmitInterrupt = _FMSTR_MPC574XP_EnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt= _FMSTR_MPC574XP_EnableTransmitInterrupt, + .EnableReceiveInterrupt = _FMSTR_MPC574XP_EnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_MPC574XP_IsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_MPC574XP_IsReceiveRegFull, + .IsTransmitterActive = _FMSTR_MPC574XP_IsTransmitterActive, + .PutChar = _FMSTR_MPC574XP_PutChar, + .GetChar = _FMSTR_MPC574XP_GetChar, + .Flush = _FMSTR_MPC574XP_Flush, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +#define FMSTR_SETBIT(base, offset, bit) (*(((volatile FMSTR_U32*)(base))+(offset/4)) |= (bit)) +#define FMSTR_CLRBIT(base, offset, bit) (*(((volatile FMSTR_U32*)(base))+(offset/4)) &= ~(bit)) +#define FMSTR_TSTBIT(base, offset, bit) (*(((volatile FMSTR_U32*)(base))+(offset/4)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(((volatile FMSTR_U32*)(base))+(offset/4)) = (value)) +#define FMSTR_GETREG(base, offset) (*(((volatile FMSTR_U32*)(base))+(offset/4))) + +/**************************************************************************************** +* LINFLEXD module constants +*****************************************************************************************/ +/* LINFlexD module registers */ +#define FMSTR_LINFLEXD_UARTCR_OFFSET 0x10 /* 32bit register */ +#define FMSTR_LINFLEXD_LINIER_OFFSET 0x4 /* 32bit register */ +#define FMSTR_LINFLEXD_LINCR1_OFFSET 0x0 /* 32bit register */ +#define FMSTR_LINFLEXD_UARTSR_OFFSET 0x14 /* 32bit register */ +#define FMSTR_LINFLEXD_BDRL_OFFSET 0x38 /* 32bit register output*/ +#define FMSTR_LINFLEXD_BDRM_OFFSET 0x3C /* 32bit register input*/ + + +/* LINFlexD UARTCR Control Register 1 bits */ +#define FMSTR_LINFLEXD_UARTCR_TXEN 0x00000010 +#define FMSTR_LINFLEXD_UARTCR_RXEN 0x00000020 + +/* LINFlexD LINIER Control Register 1 bits */ +#define FMSTR_LINFLEXD_LINIER_DRIE 0x00000004 +#define FMSTR_LINFLEXD_LINIER_DTIE 0x00000002 + +/* LINFlexD UART Status registers bits */ +#define FMSTR_LINFLEXD_UARTSR_DRFRFE 0x00000004 /*DRF*/ +#define FMSTR_LINFLEXD_UARTSR_DTFTFF 0x00000002 /*DTF*/ + +/****************************************************************************** +* +* @brief SCI communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_MPC574XP_Init(void) +{ +#if FMSTR_SERIAL_SINGLEWIRE + #error Internal single wire mode is not supported. + return FMSTR_FALSE; +#endif + + /* valid runtime module address must be assigned */ + if(fmstr_LINFLEXDBaseAddr != 0) + return FMSTR_TRUE; + else + return FMSTR_FALSE; +} + + +/****************************************************************************** +* +* @brief Enable/Disable LINFLEXD transmitter +* +******************************************************************************/ + +static void _FMSTR_MPC574XP_EnableTransmit(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable transmitter */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_TXEN); + } + else + { + /* Disable transmitter */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_TXEN); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable LINFLEXD receiver +* +******************************************************************************/ + +static void _FMSTR_MPC574XP_EnableReceive(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable receiver (enables single-wire connection) */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_RXEN); + } + else + { + /* Disable receiver */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_RXEN); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_MPC574XP_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt when transmission is complete +* +******************************************************************************/ +// +//static void _FMSTR_S12zSci_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +//{ +// if(enable) +// { +// /* Enable interrupt */ +// FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_TCIE); +// } +// else +// { +// /* Disable interrupt */ +// FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_TCIE); +// } +//} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_MPC574XP_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DRIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DRIE); + } +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_MPC574XP_IsTransmitRegEmpty(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_MPC574XP_IsReceiveRegFull(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DRFRFE); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_MPC574XP_IsTransmitterActive(void) +{ + /* 0 - Transmission in progress, 1 - No transmission in progress */ + return (!(FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF))); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_MPC574XP_PutChar(FMSTR_BCHR ch) +{ + FMSTR_SETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_BDRL_OFFSET , ch); + FMSTR_SETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF); +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_MPC574XP_GetChar(void) +{ + FMSTR_BCHR c=0; + c = FMSTR_GETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_BDRM_OFFSET ); + FMSTR_SETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DRFRFE); + return c; +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ + +static void _FMSTR_MPC574XP_Flush(void) +{ +} + +/****************************************************************************** +* +* @brief Assign FreeMASTER communication module base address +* +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + fmstr_LINFLEXDBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Process FreeMASTER serial interrupt (call this function from SCI ISR) +* +******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* process incomming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + #endif +} + +#else /* !(FMSTR_DISABLE) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MPC57XP_LINFLEX_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/MPC/freemaster_mpc574xp_linflex.h b/middleware/freemaster/src/drivers/dreg/MPC/freemaster_mpc574xp_linflex.h new file mode 100644 index 0000000..76b2e7f --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/MPC/freemaster_mpc574xp_linflex.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - S12Z SCI low-level driver + */ + +#ifndef __FREEMASTER_mpc574xp_linflex_H +#define __FREEMASTER_mpc574xp_linflex_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_mpc574xp_linflex.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_MPC574XP_SCI_H */ + diff --git a/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_mscan.c b/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_mscan.c new file mode 100644 index 0000000..d7ece83 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_mscan.c @@ -0,0 +1,362 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - msCAN low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_CAN_S12Z_MSCAN_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_S12Z_MSCAN_ID) +#if !(FMSTR_DISABLE) + +#include "freemaster_can.h" +#include "freemaster_s12z_mscan.h" + +/****************************************************************************** +* Local variables +******************************************************************************/ + +/* Serial base address */ +#ifdef FMSTR_CAN_BASE + static FMSTR_ADDR fmstr_canBaseAddr = (FMSTR_ADDR)FMSTR_CAN_BASE; +#else + static FMSTR_ADDR fmstr_canBaseAddr = (FMSTR_ADDR)0; +#endif + +static FMSTR_U8 fmstr_canRxIDR[4]; /* ID RAW to compare with incoming frames */ +static FMSTR_U8 fmstr_canTxIDR[4]; /* ID RAW to send in outgoing frames */ +static FMSTR_U8 fmstr_canTxBufSel; /* selected transmit buffer index */ + +static FMSTR_U8 fmstr_canTxPrio; /* transmit priority to ensure sequential transmission */ + +/****************************************************************************** +* Local functions +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S12zCan_Init(FMSTR_U32 idRx, FMSTR_U32 idTx); /* Initialize CAN module on a given base address. */ +static void _FMSTR_S12zCan_EnableTxInterrupt(FMSTR_BOOL enable); /* Enable CAN Transmit interrupt. */ +static void _FMSTR_S12zCan_EnableRxInterrupt(FMSTR_BOOL enable); /* Enable CAN Receive interrupt. */ +static void _FMSTR_S12zCan_EnableRx(void); /* Enable/re-initialize Receiver buffer. */ +static FMSTR_SIZE8 _FMSTR_S12zCan_GetRxFrameLen(void); /* Return size of received CAN frame, or 0 if no Rx frame is available. */ +static FMSTR_BCHR _FMSTR_S12zCan_GetRxFrameByte(FMSTR_SIZE8 index); /* Get data byte at index (0..8). */ +static void _FMSTR_S12zCan_AckRxFrame(void); /* Discard received frame and enable receiving a next one. */ +static FMSTR_BOOL _FMSTR_S12zCan_PrepareTxFrame(void); /* Initialize transmit buffer; return false when Tx buffer is not available. */ +static void _FMSTR_S12zCan_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data); /* Fill one byte of transmit data. */ +static void _FMSTR_S12zCan_SendTxFrame(FMSTR_SIZE8 len); /* Send the Tx buffer. */ + +/****************************************************************************** +* Driver interface +******************************************************************************/ + +const FMSTR_CAN_DRV_INTF FMSTR_CAN_S12Z_MSCAN = +{ + FMSTR_C99_INIT(Init ) _FMSTR_S12zCan_Init, + FMSTR_C99_INIT(EnableTxInterrupt ) _FMSTR_S12zCan_EnableTxInterrupt, + FMSTR_C99_INIT(EnableRxInterrupt ) _FMSTR_S12zCan_EnableRxInterrupt, + FMSTR_C99_INIT(EnableRx ) _FMSTR_S12zCan_EnableRx, + FMSTR_C99_INIT(GetRxFrameLen ) _FMSTR_S12zCan_GetRxFrameLen, + FMSTR_C99_INIT(GetRxFrameByte ) _FMSTR_S12zCan_GetRxFrameByte, + FMSTR_C99_INIT(AckRxFrame ) _FMSTR_S12zCan_AckRxFrame, + FMSTR_C99_INIT(PrepareTxFrame ) _FMSTR_S12zCan_PrepareTxFrame, + FMSTR_C99_INIT(PutTxFrameByte ) _FMSTR_S12zCan_PutTxFrameByte, + FMSTR_C99_INIT(SendTxFrame ) _FMSTR_S12zCan_SendTxFrame, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +#define FMSTR_SETBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) |= (bit)) +#define FMSTR_CLRBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) &= (FMSTR_U8)(~(bit))) +#define FMSTR_TSTBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(((volatile FMSTR_U8*)(base))+(offset)) = (value)) +#define FMSTR_GETREG(base, offset) (*(((volatile FMSTR_U8*)(base))+(offset))) + +/**************************************************************************************** +* MSCAN module constants +*****************************************************************************************/ + +/* MSCAN module registers */ +#define FMSTR_MSCANRFLG_OFFSET 0x04 +#define FMSTR_MSCANRIER_OFFSET 0x05 +#define FMSTR_MSCANTFLG_OFFSET 0x06 +#define FMSTR_MSCANTIER_OFFSET 0x07 +#define FMSTR_MSCANTBSEL_OFFSET 0x0a +#define FMSTR_MSCANRXFG_OFFSET 0x20 +#define FMSTR_MSCANTXFG_OFFSET 0x30 + +/* MSCAN MB registers offsets (must also add CANxxFG_OFFSET) */ +#define FMSTR_MSCMBIDR0 0 +#define FMSTR_MSCMBIDR1 1 +#define FMSTR_MSCMBIDR2 2 +#define FMSTR_MSCMBIDR3 3 +#define FMSTR_MSCMBDSR0 4 +#define FMSTR_MSCMBDSR1 5 +#define FMSTR_MSCMBDSR2 6 +#define FMSTR_MSCMBDSR3 7 +#define FMSTR_MSCMBDSR4 8 +#define FMSTR_MSCMBDSR5 9 +#define FMSTR_MSCMBDSR6 10 +#define FMSTR_MSCMBDSR7 11 +#define FMSTR_MSCMBDLR 12 +#define FMSTR_MSCMBTBPR 13 +#define FMSTR_MSCMBTSRH 14 +#define FMSTR_MSCMBTSRL 15 + +/* MSCAN CANRFLG */ +#define FMSTR_MSCANRFLG_RXF 0x01 + +/* MSCAN CANRIER */ +#define FMSTR_MSCANRFLG_RXFIE 0x01 + +/* MSCAN CANTFLG, TIER, TARQ, TBSEL */ +#define FMSTR_MSCANTBUF_TX2 0x04 +#define FMSTR_MSCANTBUF_TX1 0x02 +#define FMSTR_MSCANTBUF_TX0 0x01 +#define FMSTR_MSCANTBUF_ALL 0x07 + +/* TX buffers used by this driver. Facing strange race/overrun condition when using + * multiple buffers. Works well when using single buffer. */ +#define FMSTR_MSCANTBUF_USED 0x01 /* FMSTR_MSCANTBUF_ALL */ + +/* MSCAN CANIDRx */ +#define FMSTR_MSCANIDR1_IDE 0x08 +#define FMSTR_MSCANIDR1_STD_RTR 0x10 +#define FMSTR_MSCANIDR3_EXT_RTR 0x08 + +/* MSCAN: id to idr translation */ +#define FMSTR_MSCAN_MAKEIDR0(id) ((FMSTR_U8)(((id)&FMSTR_CAN_EXTID) ? (id)>>21 : (id)>>3)) +#define FMSTR_MSCAN_MAKEIDR1(id) ((FMSTR_U8)(((id)&FMSTR_CAN_EXTID) ? ((((id)>>13) & 0xe0U) | 0x18 | (((id)>>15) & 0x07U)) : (((id)<<5)&0xe0))) +#define FMSTR_MSCAN_MAKEIDR2(id) ((FMSTR_U8)(((id)&FMSTR_CAN_EXTID) ? (id)>>7 : 0)) +#define FMSTR_MSCAN_MAKEIDR3(id) ((FMSTR_U8)(((id)&FMSTR_CAN_EXTID) ? (((id)<<1) & 0xfeU) : 0)) + +/****************************************************************************** +* Implementation +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S12zCan_Init(FMSTR_U32 idRx, FMSTR_U32 idTx) +{ + fmstr_canTxBufSel = 0; + fmstr_canTxPrio = 0; + + fmstr_canRxIDR[0] = FMSTR_MSCAN_MAKEIDR0(idRx); + fmstr_canRxIDR[1] = FMSTR_MSCAN_MAKEIDR1(idRx); + fmstr_canRxIDR[2] = FMSTR_MSCAN_MAKEIDR2(idRx); + fmstr_canRxIDR[3] = FMSTR_MSCAN_MAKEIDR3(idRx); + + fmstr_canTxIDR[0] = FMSTR_MSCAN_MAKEIDR0(idTx); + fmstr_canTxIDR[1] = FMSTR_MSCAN_MAKEIDR1(idTx); + fmstr_canTxIDR[2] = FMSTR_MSCAN_MAKEIDR2(idTx); + fmstr_canTxIDR[3] = FMSTR_MSCAN_MAKEIDR3(idTx); + + return FMSTR_TRUE; +} + +static void _FMSTR_S12zCan_EnableTxInterrupt(FMSTR_BOOL enable) +{ + /* enable/disable CAN TX interrupts */ + if(enable) + { + FMSTR_SETBIT(fmstr_canBaseAddr, FMSTR_MSCANTIER_OFFSET, FMSTR_MSCANTBUF_USED); + } + else + { + FMSTR_CLRBIT(fmstr_canBaseAddr, FMSTR_MSCANTIER_OFFSET, FMSTR_MSCANTBUF_USED); + } +} + +static void _FMSTR_S12zCan_EnableRxInterrupt(FMSTR_BOOL enable) +{ + /* enable/disable CAN RX interrupts */ + if(enable) + { + FMSTR_SETBIT(fmstr_canBaseAddr, FMSTR_MSCANRIER_OFFSET, FMSTR_MSCANRFLG_RXFIE); + } + else + { + FMSTR_CLRBIT(fmstr_canBaseAddr, FMSTR_MSCANRIER_OFFSET, FMSTR_MSCANRFLG_RXFIE); + } +} + +static void _FMSTR_S12zCan_EnableRx(void) +{ + /* nothing to do, msCAN is always ready to receive (ID filtering is not under our control) */ +} + +static FMSTR_SIZE8 _FMSTR_S12zCan_GetRxFrameLen(void) +{ + /* Return 0 when no frame received */ + FMSTR_SIZE8 size = 0; + + /* Test RX Full in RX status register */ + if(FMSTR_TSTBIT(fmstr_canBaseAddr, FMSTR_MSCANRFLG_OFFSET, FMSTR_MSCANRFLG_RXF)) + { + FMSTR_BOOL received = FMSTR_FALSE; + + /* Test received ID */ + if((fmstr_canRxIDR[1]) & FMSTR_MSCANIDR1_IDE) + { + /* ext id compare */ + if((fmstr_canRxIDR[0] == FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANRXFG_OFFSET+FMSTR_MSCMBIDR0)) && + (fmstr_canRxIDR[1] == FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANRXFG_OFFSET+FMSTR_MSCMBIDR1)) && + (fmstr_canRxIDR[2] == FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANRXFG_OFFSET+FMSTR_MSCMBIDR2)) && + (fmstr_canRxIDR[3] == FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANRXFG_OFFSET+FMSTR_MSCMBIDR3))) + { + /* matches! */ + received = FMSTR_TRUE; + } + } + else + { + /* std id compare */ + if((fmstr_canRxIDR[0] == FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANRXFG_OFFSET+FMSTR_MSCMBIDR0)) && + ((fmstr_canRxIDR[1] ^ FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANRXFG_OFFSET+FMSTR_MSCMBIDR1)) & 0xf8U) == 0) + { + /* matches! */ + received = FMSTR_TRUE; + } + } + + if(received) + { + /* Matching frame was received, read length */ + size = FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANRXFG_OFFSET+FMSTR_MSCMBDLR); + + /* Discard frames with 0 length */ + if(!size) + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANRFLG_OFFSET, FMSTR_MSCANRFLG_RXF); + } + } + + return size; +} + +static FMSTR_BCHR _FMSTR_S12zCan_GetRxFrameByte(FMSTR_SIZE8 index) +{ + /* CAN reception, get one received byte */ + return FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANRXFG_OFFSET+FMSTR_MSCMBDSR0+index); +} + +static void _FMSTR_S12zCan_AckRxFrame(void) +{ + /* Clear RX Full flag */ + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANRFLG_OFFSET, FMSTR_MSCANRFLG_RXF); + + /* Reset the priority counter for the next transmission sequence */ + fmstr_canTxPrio = 0; +} + +static FMSTR_BOOL _FMSTR_S12zCan_PrepareTxFrame(void) +{ + /* read TX status register to see if any tx buffer is free */ + FMSTR_U8 tbsel = FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANTFLG_OFFSET) & FMSTR_MSCANTBUF_USED; + + if(!tbsel) + { + /* no free Tx buffer found */ + fmstr_canTxBufSel = 0; + return FMSTR_FALSE; + } + + /* select one of the free buffers */ + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANTBSEL_OFFSET, tbsel); \ + + /* which one was finally selected? */ + fmstr_canTxBufSel = FMSTR_GETREG(fmstr_canBaseAddr, FMSTR_MSCANTBSEL_OFFSET); + + /* final sanity check */ + return (FMSTR_BOOL)(fmstr_canTxBufSel ? FMSTR_TRUE : FMSTR_FALSE); +} + +static void _FMSTR_S12zCan_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data) +{ + /* put one data byte for transmission */ + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANTXFG_OFFSET+FMSTR_MSCMBDSR0+index, data); +} + +static void _FMSTR_S12zCan_SendTxFrame(FMSTR_SIZE8 len) +{ + /* write transmission IDR */ + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANTXFG_OFFSET+FMSTR_MSCMBIDR0, fmstr_canTxIDR[0]); + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANTXFG_OFFSET+FMSTR_MSCMBIDR1, fmstr_canTxIDR[1]); + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANTXFG_OFFSET+FMSTR_MSCMBIDR2, fmstr_canTxIDR[2]); + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANTXFG_OFFSET+FMSTR_MSCMBIDR3, fmstr_canTxIDR[3]); + + /* frame length */ + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANTXFG_OFFSET+FMSTR_MSCMBDLR, len); + + /* set transmit priority */ + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANTXFG_OFFSET+FMSTR_MSCMBTBPR, fmstr_canTxPrio); + fmstr_canTxPrio++; + + /* do send */ + FMSTR_SETREG(fmstr_canBaseAddr, FMSTR_MSCANTFLG_OFFSET, fmstr_canTxBufSel); +} + +/****************************************************************************** +* +* @brief Assigning FreeMASTER communication module base address +* +******************************************************************************/ + +void FMSTR_CanSetBaseAddress(FMSTR_ADDR base) +{ + fmstr_canBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Process FreeMASTER CAN interrupt (call this function from msCAN ISR) +* +******************************************************************************/ + +void FMSTR_CanIsr(void) +{ +#if FMSTR_LONG_INTR || FMSTR_SHORT_INTR + if(FMSTR_TSTBIT(fmstr_canBaseAddr, FMSTR_MSCANRFLG_OFFSET, FMSTR_MSCANRFLG_RXF)) + { + /* Process received frame */ + FMSTR_ProcessCanRx(); + } + + if(FMSTR_TSTBIT(fmstr_canBaseAddr, FMSTR_MSCANTFLG_OFFSET, FMSTR_MSCANTBUF_USED)) + { + /* Send next frame, if needed */ + FMSTR_ProcessCanTx(); + } +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_CanSetBaseAddress(CAN_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_CanIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_MCUX_MSCAN_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_mscan.h b/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_mscan.h new file mode 100644 index 0000000..587026c --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_mscan.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - S12Z msCAN low-level driver + */ + +#ifndef __FREEMASTER_S12Z_MSCAN_H +#define __FREEMASTER_S12Z_MSCAN_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_s12z_mscan.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_CanSetBaseAddress(FMSTR_ADDR base); +void FMSTR_CanIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_S12Z_MSCAN_H */ + diff --git a/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_sci.c b/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_sci.c new file mode 100644 index 0000000..6ed135e --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_sci.c @@ -0,0 +1,361 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_S12Z_SCI_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S12Z_SCI_ID) +#if !(FMSTR_DISABLE) + +#include "freemaster_serial.h" +#include "freemaster_s12z_sci.h" + +/*********************************** +* local variables +***********************************/ + +/* SCI base address */ +#ifdef FMSTR_SCI_BASE + static FMSTR_ADDR fmstr_sciBaseAddr = (FMSTR_ADDR)FMSTR_SCI_BASE; +#else + static FMSTR_ADDR fmstr_sciBaseAddr = (FMSTR_ADDR)0; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of SCI driver adapter */ +static FMSTR_BOOL _FMSTR_S12zSci_Init(void); +static void _FMSTR_S12zSci_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_S12zSci_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_S12zSci_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S12zSci_EnableReceiveInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S12zSci_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_S12zSci_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_S12zSci_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_S12zSci_IsTransmitterActive(void); +static void _FMSTR_S12zSci_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_S12zSci_GetChar(void); +static void _FMSTR_S12zSci_Flush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this SCI driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_S12Z_SCI = +{ + FMSTR_C99_INIT(Init ) _FMSTR_S12zSci_Init, + FMSTR_C99_INIT(EnableTransmit ) _FMSTR_S12zSci_EnableTransmit, + FMSTR_C99_INIT(EnableReceive ) _FMSTR_S12zSci_EnableReceive, + FMSTR_C99_INIT(EnableTransmitInterrupt ) _FMSTR_S12zSci_EnableTransmitInterrupt, + FMSTR_C99_INIT(EnableTransmitCompleteInterrupt ) _FMSTR_S12zSci_EnableTransmitCompleteInterrupt, + FMSTR_C99_INIT(EnableReceiveInterrupt ) _FMSTR_S12zSci_EnableReceiveInterrupt, + FMSTR_C99_INIT(IsTransmitRegEmpty ) _FMSTR_S12zSci_IsTransmitRegEmpty, + FMSTR_C99_INIT(IsReceiveRegFull ) _FMSTR_S12zSci_IsReceiveRegFull, + FMSTR_C99_INIT(IsTransmitterActive ) _FMSTR_S12zSci_IsTransmitterActive, + FMSTR_C99_INIT(PutChar ) _FMSTR_S12zSci_PutChar, + FMSTR_C99_INIT(GetChar ) _FMSTR_S12zSci_GetChar, + FMSTR_C99_INIT(Flush ) _FMSTR_S12zSci_Flush, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +#define FMSTR_SETBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) |= (bit)) +#define FMSTR_CLRBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) &= (FMSTR_U8)(~(bit))) +#define FMSTR_TSTBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(((volatile FMSTR_U8*)(base))+(offset)) = (value)) +#define FMSTR_GETREG(base, offset) (*(((volatile FMSTR_U8*)(base))+(offset))) + +/**************************************************************************************** +* SCI module constants +*****************************************************************************************/ + +/* SCI module registers */ +#define FMSTR_SCIBDH_OFFSET 0 +#define FMSTR_SCIBDL_OFFSET 1 +#define FMSTR_SCICR1_OFFSET 2 +#define FMSTR_SCICR2_OFFSET 3 +#define FMSTR_SCISR1_OFFSET 4 +#define FMSTR_SCISR2_OFFSET 5 +#define FMSTR_SCIDRH_OFFSET 6 +#define FMSTR_SCIDRL_OFFSET 7 + +/* SCI Control Register bits */ +#define FMSTR_SCICR1_LOOPS 0x80 +#define FMSTR_SCICR1_SWAI 0x40 +#define FMSTR_SCICR1_RSRC 0x20 +#define FMSTR_SCICR1_M 0x10 +#define FMSTR_SCICR1_WAKE 0x08 +#define FMSTR_SCICR1_ILT 0x04 +#define FMSTR_SCICR1_PE 0x02 +#define FMSTR_SCICR1_PT 0x01 +#define FMSTR_SCICR2_TIE 0x80 +#define FMSTR_SCICR2_TCIE 0x40 +#define FMSTR_SCICR2_RIE 0x20 +#define FMSTR_SCICR2_ILIE 0x10 +#define FMSTR_SCICR2_TE 0x08 +#define FMSTR_SCICR2_RE 0x04 +#define FMSTR_SCICR2_RWU 0x02 +#define FMSTR_SCICR2_SBK 0x01 + +/* SCI Status registers bits */ +#define FMSTR_SCISR_TDRE 0x80 +#define FMSTR_SCISR_TC 0x40 +#define FMSTR_SCISR_RDRF 0x20 +#define FMSTR_SCISR_IDLE 0x10 +#define FMSTR_SCISR_OR 0x08 +#define FMSTR_SCISR_NF 0x04 +#define FMSTR_SCISR_FE 0x02 +#define FMSTR_SCISR_PF 0x01 +#define FMSTR_SCISR2_BRK13 0x04 +#define FMSTR_SCISR2_TXDIR 0x02 +#define FMSTR_SCISR2_RAF 0x01 + +/****************************************************************************** +* +* @brief SCI communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S12zSci_Init(void) +{ +#if FMSTR_SERIAL_SINGLEWIRE + #error Internal single wire mode is not supported. + return FMSTR_FALSE; +#endif + + /* valid runtime module address must be assigned */ + if(fmstr_sciBaseAddr != 0) + return FMSTR_TRUE; + else + return FMSTR_FALSE; +} + +/****************************************************************************** +* +* @brief Enable/Disable SCI transmitter +* +******************************************************************************/ + +static void _FMSTR_S12zSci_EnableTransmit(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable transmitter */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_TE); + } + else + { + /* Disable transmitter */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_TE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable SCI receiver +* +******************************************************************************/ + +static void _FMSTR_S12zSci_EnableReceive(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable receiver (enables single-wire connection) */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_RE); + } + else + { + /* Disable receiver */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_RE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_S12zSci_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_TIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_TIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt when transmission is complete +* +******************************************************************************/ + +static void _FMSTR_S12zSci_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_TCIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_TCIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_S12zSci_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_RIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_sciBaseAddr, FMSTR_SCICR2_OFFSET, FMSTR_SCICR2_RIE); + } +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S12zSci_IsTransmitRegEmpty(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_sciBaseAddr, FMSTR_SCISR1_OFFSET, FMSTR_SCISR_TDRE); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S12zSci_IsReceiveRegFull(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_sciBaseAddr, FMSTR_SCISR1_OFFSET, FMSTR_SCISR_RDRF); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S12zSci_IsTransmitterActive(void) +{ + /* 0 - Transmission in progress, 1 - No transmission in progress */ + return (FMSTR_BOOL) (!(FMSTR_TSTBIT(fmstr_sciBaseAddr, FMSTR_SCISR1_OFFSET, FMSTR_SCISR_TC))); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_S12zSci_PutChar(FMSTR_BCHR ch) +{ + FMSTR_SETREG(fmstr_sciBaseAddr, FMSTR_SCIDRL_OFFSET, ch); +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_S12zSci_GetChar(void) +{ + return FMSTR_GETREG(fmstr_sciBaseAddr, FMSTR_SCIDRL_OFFSET); +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ + +static void _FMSTR_S12zSci_Flush(void) +{ +} + +/****************************************************************************** +* +* @brief Assign FreeMASTER communication module base address +* +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + fmstr_sciBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Process FreeMASTER serial interrupt (call this function from SCI ISR) +* +******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* process incomming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + #endif +} + +#else /* !(FMSTR_DISABLE) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S12Z_SCI_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_sci.h b/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_sci.h new file mode 100644 index 0000000..3ee1493 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S12Z/freemaster_s12z_sci.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2019 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - S12Z SCI low-level driver + */ + +#ifndef __FREEMASTER_S12Z_SCI_H +#define __FREEMASTER_S12Z_SCI_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_s12z_sci.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_S12Z_SCI_H */ + diff --git a/middleware/freemaster/src/drivers/dreg/S32G/freemaster_s32g274a_linflexd.c b/middleware/freemaster/src/drivers/dreg/S32G/freemaster_s32g274a_linflexd.c new file mode 100644 index 0000000..4325530 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32G/freemaster_s32g274a_linflexd.c @@ -0,0 +1,345 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_S32G274A_LINFLEXD_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32G274A_LINFLEXD_ID) +#if !(FMSTR_DISABLE) + +#include "freemaster_serial.h" +#include "freemaster_s32g274a_linflexd.h" + +/*********************************** +* local variables +***********************************/ + +/* SCI base address */ +#ifdef FMSTR_LINFLEXD_BASE + static FMSTR_ADDR fmstr_LINFLEXDBaseAddr = (FMSTR_ADDR)FMSTR_LINFLEXD_BASE; +#else + static FMSTR_ADDR fmstr_LINFLEXDBaseAddr = (FMSTR_ADDR)0; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of SCI driver adapter */ +static FMSTR_BOOL _FMSTR_S32G274A_Init(void); +static void _FMSTR_S32G274A_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_S32G274A_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_S32G274A_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32G274A_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32G274A_EnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_S32G274A_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_S32G274A_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_S32G274A_IsTransmitterActive(void); +static void _FMSTR_S32G274A_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_S32G274A_GetChar(void); +static void _FMSTR_S32G274A_Flush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this SCI driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_S32G274A_LINFLEXD = +{ + .Init = _FMSTR_S32G274A_Init, + .EnableTransmit = _FMSTR_S32G274A_EnableTransmit, + .EnableReceive = _FMSTR_S32G274A_EnableReceive, + .EnableTransmitInterrupt = _FMSTR_S32G274A_EnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt= _FMSTR_S32G274A_EnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_S32G274A_EnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_S32G274A_IsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_S32G274A_IsReceiveRegFull, + .IsTransmitterActive = _FMSTR_S32G274A_IsTransmitterActive, + .PutChar = _FMSTR_S32G274A_PutChar, + .GetChar = _FMSTR_S32G274A_GetChar, + .Flush = _FMSTR_S32G274A_Flush, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +#define FMSTR_SETBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) |= (bit)) +#define FMSTR_CLRBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) &= ~(bit)) +#define FMSTR_TSTBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(((volatile FMSTR_U8*)(base))+(offset)) = (value)) +#define FMSTR_GETREG(base, offset) (*(((volatile FMSTR_U8*)(base))+(offset))) + +/**************************************************************************************** +* LINFLEXD module constants +*****************************************************************************************/ +/* LINFlexD module registers */ +#define FMSTR_LINFLEXD_UARTCR_OFFSET 0x10 /* 32bit register */ +#define FMSTR_LINFLEXD_LINIER_OFFSET 0x04 /* 32bit register */ +#define FMSTR_LINFLEXD_LINCR1_OFFSET 0x00 /* 32bit register */ +#define FMSTR_LINFLEXD_UARTSR_OFFSET 0x14 /* 32bit register */ +#define FMSTR_LINFLEXD_BDRL_OFFSET 0x38 /* 32bit register output*/ +#define FMSTR_LINFLEXD_BDRM_OFFSET 0x3C /* 32bit register input*/ +#define FMSTR_LINFLEXD_UARTPTO_OFFSET 0x50 /* 32bit register */ +#define FMSTR_LINFLEXD_UARTCTO_OFFSET 0x54 /* 32bit register */ + +/* LINFlexD UARTCR Control Register 1 bits */ +#define FMSTR_LINFLEXD_UARTCR_TXEN 0x00000010 +#define FMSTR_LINFLEXD_UARTCR_RXEN 0x00000020 + +/* LINFlexD LINIER Control Register 1 bits */ +#define FMSTR_LINFLEXD_LINIER_DRIE 0x00000004 +#define FMSTR_LINFLEXD_LINIER_DTIE 0x00000002 + +/* LINFlexD UART Status registers bits */ +#define FMSTR_LINFLEXD_UARTSR_DRFRFE 0x00000004 /*DRF*/ +#define FMSTR_LINFLEXD_UARTSR_DTFTFF 0x00000002 /*DTF*/ + +/****************************************************************************** +* +* @brief SCI communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32G274A_Init(void) +{ +#if FMSTR_SERIAL_SINGLEWIRE + #error Internal single wire mode is not supported. + return FMSTR_FALSE; +#endif + + /* valid runtime module address must be assigned */ + if(fmstr_LINFLEXDBaseAddr != 0) + return FMSTR_TRUE; + else + return FMSTR_FALSE; +} + + +/****************************************************************************** +* +* @brief Enable/Disable LINFLEXD transmitter +* +******************************************************************************/ + +static void _FMSTR_S32G274A_EnableTransmit(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable transmitter */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_TXEN); + } + else + { + /* Disable transmitter */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_TXEN); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable LINFLEXD receiver +* +******************************************************************************/ + +static void _FMSTR_S32G274A_EnableReceive(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable receiver (enables single-wire connection) */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_RXEN); + } + else + { + /* Disable receiver */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_RXEN); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_S32G274A_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt when transmission is complete +* +******************************************************************************/ + +static void _FMSTR_S32G274A_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_S32G274A_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DRIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DRIE); + } +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32G274A_IsTransmitRegEmpty(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32G274A_IsReceiveRegFull(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DRFRFE); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32G274A_IsTransmitterActive(void) +{ + /* 0 - Transmission in progress, 1 - No transmission in progress */ + return (!(FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF))); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_S32G274A_PutChar(FMSTR_BCHR ch) +{ + FMSTR_SETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_BDRL_OFFSET , ch); + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF); +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_S32G274A_GetChar(void) +{ + FMSTR_BCHR c=0; + c = FMSTR_GETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_BDRM_OFFSET ); + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DRFRFE); + return c; +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ + +static void _FMSTR_S32G274A_Flush(void) +{ +} + +/****************************************************************************** +* +* @brief Assign FreeMASTER communication module base address +* +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + fmstr_LINFLEXDBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Process FreeMASTER serial interrupt (call this function from SCI ISR) +* +******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* process incoming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + #endif +} + +#else /* !(FMSTR_DISABLE) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32G274A_LINFLEXD_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/S32G/freemaster_s32g274a_linflexd.h b/middleware/freemaster/src/drivers/dreg/S32G/freemaster_s32g274a_linflexd.h new file mode 100644 index 0000000..3c6225b --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32G/freemaster_s32g274a_linflexd.h @@ -0,0 +1,58 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - S32G2 UART low-level driver + */ + +#ifndef __FREEMASTER_S32G274A_LINFLEXD_H +#define __FREEMASTER_S32G274A_LINFLEXD_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_s32g274a_linflexd.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_S32G274A_LINFLEXD_H */ diff --git a/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k144_lpuart.c b/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k144_lpuart.c new file mode 100644 index 0000000..c2e20a7 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k144_lpuart.c @@ -0,0 +1,340 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_S32K144_LPUART_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32K144_LPUART_ID) +#if !(FMSTR_DISABLE) + +#include "freemaster_serial.h" +#include "freemaster_s32k144_lpuart.h" + +/*********************************** +* local variables +***********************************/ + +/* SCI base address */ +#ifdef FMSTR_LPUART_BASE + static FMSTR_ADDR fmstr_LPUARTBaseAddr = (FMSTR_ADDR)FMSTR_LPUART_BASE; +#else + static FMSTR_ADDR fmstr_LPUARTBaseAddr = (FMSTR_ADDR)0; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of SCI driver adapter */ +static FMSTR_BOOL _FMSTR_S32K144_Init(void); +static void _FMSTR_S32K144_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_S32K144_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_S32K144_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32K144_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32K144_EnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_S32K144_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_S32K144_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_S32K144_IsTransmitterActive(void); +static void _FMSTR_S32K144_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_S32K144_GetChar(void); +static void _FMSTR_S32K144_Flush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this SCI driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_S32K144_LPUART = +{ + .Init = _FMSTR_S32K144_Init, + .EnableTransmit = _FMSTR_S32K144_EnableTransmit, + .EnableReceive = _FMSTR_S32K144_EnableReceive, + .EnableTransmitInterrupt = _FMSTR_S32K144_EnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt= _FMSTR_S32K144_EnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_S32K144_EnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_S32K144_IsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_S32K144_IsReceiveRegFull, + .IsTransmitterActive = _FMSTR_S32K144_IsTransmitterActive, + .PutChar = _FMSTR_S32K144_PutChar, + .GetChar = _FMSTR_S32K144_GetChar, + .Flush = _FMSTR_S32K144_Flush, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +#define FMSTR_SETBIT(base, offset, bit) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset)) |= (bit)) +#define FMSTR_CLRBIT(base, offset, bit) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset)) &= ~(bit)) +#define FMSTR_TSTBIT(base, offset, bit) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset)) = (value)) +#define FMSTR_GETREG(base, offset) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset))) + +/**************************************************************************************** +* LPUART module constants +*****************************************************************************************/ +/* LPUART module registers */ +#define FMSTR_LPUART_STAT_OFFSET 0x14 /* 32bit register */ +#define FMSTR_LPUART_CTRL_OFFSET 0x18 /* 32bit register */ +#define FMSTR_LPUART_DATA_OFFSET 0x1C /* 32bit register */ + +/* LPUART CTRL Control Register 1 bits */ +#define FMSTR_LPUART_CTRL_TIE 0x00800000 +#define FMSTR_LPUART_CTRL_TCIE 0x00400000 +#define FMSTR_LPUART_CTRL_RIE 0x00200000 +#define FMSTR_LPUART_CTRL_TE 0x00080000 +#define FMSTR_LPUART_CTRL_RE 0x00040000 + +/* LPUART STAT Status registers bits */ +#define FMSTR_LPUART_STAT_TDRE 0x00800000 +#define FMSTR_LPUART_STAT_TC 0x00400000 +#define FMSTR_LPUART_STAT_RDRF 0x00200000 + +/****************************************************************************** +* +* @brief SCI communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32K144_Init(void) +{ +#if FMSTR_SERIAL_SINGLEWIRE + #error Internal single wire mode is not supported. + return FMSTR_FALSE; +#endif + + /* valid runtime module address must be assigned */ + if(fmstr_LPUARTBaseAddr != 0) + return FMSTR_TRUE; + else + return FMSTR_FALSE; +} + + +/****************************************************************************** +* +* @brief Enable/Disable LPUART transmitter +* +******************************************************************************/ + +static void _FMSTR_S32K144_EnableTransmit(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable transmitter */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_TE); + } + else + { + /* Disable transmitter */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_TE); + } + +} + +/****************************************************************************** +* +* @brief Enable/Disable LPUART receiver +* +******************************************************************************/ + +static void _FMSTR_S32K144_EnableReceive(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable receiver (enables single-wire connection) */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_RE); + } + else + { + /* Disable receiver */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_RE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_S32K144_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_TIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_TIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt when transmission is complete +* +******************************************************************************/ + +static void _FMSTR_S32K144_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_CTRL_TCIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_CTRL_TCIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_S32K144_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_RIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_RIE); + } +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32K144_IsTransmitRegEmpty(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_STAT_TDRE); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32K144_IsReceiveRegFull(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_STAT_RDRF); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32K144_IsTransmitterActive(void) +{ + /* 0 - Transmission in progress, 1 - No transmission in progress */ + return (!(FMSTR_TSTBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_STAT_TC))); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_S32K144_PutChar(FMSTR_BCHR ch) +{ + FMSTR_SETREG(fmstr_LPUARTBaseAddr, FMSTR_LPUART_DATA_OFFSET , ch); +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_S32K144_GetChar(void) +{ + FMSTR_BCHR c=0; + c = FMSTR_GETREG(fmstr_LPUARTBaseAddr, FMSTR_LPUART_DATA_OFFSET); + return c; +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ + +static void _FMSTR_S32K144_Flush(void) +{ + +} + +/****************************************************************************** +* +* @brief Assign FreeMASTER communication module base address +* +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + fmstr_LPUARTBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Process FreeMASTER serial interrupt (call this function from SCI ISR) +* +******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* process incoming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + #endif +} + +#else /* !(FMSTR_DISABLE) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32K144_LPUART_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k144_lpuart.h b/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k144_lpuart.h new file mode 100644 index 0000000..13f0710 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k144_lpuart.h @@ -0,0 +1,58 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - S32G2 UART low-level driver + */ + +#ifndef __FREEMASTER_S32K144_LPUART_H +#define __FREEMASTER_S32K144_LPUART_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_s32k144_lpuart.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_S32K144_LPUART_H */ diff --git a/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k344_lpuart.c b/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k344_lpuart.c new file mode 100644 index 0000000..558569b --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k344_lpuart.c @@ -0,0 +1,338 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_S32K344_LPUART_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32K344_LPUART_ID) +#if !(FMSTR_DISABLE) + +#include "freemaster_serial.h" +#include "freemaster_s32k344_lpuart.h" + +/*********************************** +* local variables +***********************************/ + +/* SCI base address */ +#ifdef FMSTR_LPUART_BASE + static FMSTR_ADDR fmstr_LPUARTBaseAddr = (FMSTR_ADDR)FMSTR_LPUART_BASE; +#else + static FMSTR_ADDR fmstr_LPUARTBaseAddr = (FMSTR_ADDR)0; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of SCI driver adapter */ +static FMSTR_BOOL _FMSTR_S32K344_Init(void); +static void _FMSTR_S32K344_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_S32K344_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_S32K344_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32K344_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32K344_EnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_S32K344_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_S32K344_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_S32K344_IsTransmitterActive(void); +static void _FMSTR_S32K344_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_S32K344_GetChar(void); +static void _FMSTR_S32K344_Flush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this SCI driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_S32K344_LPUART = +{ + .Init = _FMSTR_S32K344_Init, + .EnableTransmit = _FMSTR_S32K344_EnableTransmit, + .EnableReceive = _FMSTR_S32K344_EnableReceive, + .EnableTransmitInterrupt = _FMSTR_S32K344_EnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt= _FMSTR_S32K344_EnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_S32K344_EnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_S32K344_IsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_S32K344_IsReceiveRegFull, + .IsTransmitterActive = _FMSTR_S32K344_IsTransmitterActive, + .PutChar = _FMSTR_S32K344_PutChar, + .GetChar = _FMSTR_S32K344_GetChar, + .Flush = _FMSTR_S32K344_Flush, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +#define FMSTR_SETBIT(base, offset, bit) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset)) |= (bit)) +#define FMSTR_CLRBIT(base, offset, bit) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset)) &= ~(bit)) +#define FMSTR_TSTBIT(base, offset, bit) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset)) = (value)) +#define FMSTR_GETREG(base, offset) (*(volatile FMSTR_U32*)(((volatile FMSTR_U8*)(base))+(offset))) + +/**************************************************************************************** +* LPUART module constants +*****************************************************************************************/ +/* LPUART module registers */ +#define FMSTR_LPUART_STAT_OFFSET 0x14 /* 32bit register */ +#define FMSTR_LPUART_CTRL_OFFSET 0x18 /* 32bit register */ +#define FMSTR_LPUART_DATA_OFFSET 0x1C /* 32bit register */ + +/* LPUART CTRL Control Register 1 bits */ +#define FMSTR_LPUART_CTRL_TIE 0x00800000 +#define FMSTR_LPUART_CTRL_TCIE 0x00400000 +#define FMSTR_LPUART_CTRL_RIE 0x00200000 +#define FMSTR_LPUART_CTRL_TE 0x00080000 +#define FMSTR_LPUART_CTRL_RE 0x00040000 + +/* LPUART STAT Status registers bits */ +#define FMSTR_LPUART_STAT_TDRE 0x00800000 +#define FMSTR_LPUART_STAT_TC 0x00400000 +#define FMSTR_LPUART_STAT_RDRF 0x00200000 + +/****************************************************************************** +* +* @brief SCI communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32K344_Init(void) +{ +#if FMSTR_SERIAL_SINGLEWIRE + #error Internal single wire mode is not supported. + return FMSTR_FALSE; +#endif + + /* valid runtime module address must be assigned */ + if(fmstr_LPUARTBaseAddr != 0) + return FMSTR_TRUE; + else + return FMSTR_FALSE; +} + + +/****************************************************************************** +* +* @brief Enable/Disable LPUART transmitter +* +******************************************************************************/ + +static void _FMSTR_S32K344_EnableTransmit(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable transmitter */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_TE); + } + else + { + /* Disable transmitter */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_TE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable LPUART receiver +* +******************************************************************************/ + +static void _FMSTR_S32K344_EnableReceive(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable receiver (enables single-wire connection) */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_RE); + } + else + { + /* Disable receiver */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_RE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_S32K344_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_TIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_TIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt when transmission is complete +* +******************************************************************************/ + +static void _FMSTR_S32K344_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_CTRL_TCIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_CTRL_TCIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_S32K344_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_RIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_CTRL_OFFSET, FMSTR_LPUART_CTRL_RIE); + } +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32K344_IsTransmitRegEmpty(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_STAT_TDRE); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32K344_IsReceiveRegFull(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_STAT_RDRF); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32K344_IsTransmitterActive(void) +{ + /* 0 - Transmission in progress, 1 - No transmission in progress */ + return (!(FMSTR_TSTBIT(fmstr_LPUARTBaseAddr, FMSTR_LPUART_STAT_OFFSET, FMSTR_LPUART_STAT_TC))); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_S32K344_PutChar(FMSTR_BCHR ch) +{ + FMSTR_SETREG(fmstr_LPUARTBaseAddr, FMSTR_LPUART_DATA_OFFSET , ch); +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_S32K344_GetChar(void) +{ + FMSTR_BCHR c=0; + c = FMSTR_GETREG(fmstr_LPUARTBaseAddr, FMSTR_LPUART_DATA_OFFSET); + return c; +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ + +static void _FMSTR_S32K344_Flush(void) +{ +} + +/****************************************************************************** +* +* @brief Assign FreeMASTER communication module base address +* +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + fmstr_LPUARTBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Process FreeMASTER serial interrupt (call this function from SCI ISR) +* +******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* process incoming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + #endif +} + +#else /* !(FMSTR_DISABLE) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32K344_LPUART_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k344_lpuart.h b/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k344_lpuart.h new file mode 100644 index 0000000..f2e80f1 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32K/freemaster_s32k344_lpuart.h @@ -0,0 +1,58 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - S32G2 UART low-level driver + */ + +#ifndef __FREEMASTER_S32K344_LPUART_H +#define __FREEMASTER_S32K344_LPUART_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_s32k344_lpuart.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_S32K344_LPUART_H */ diff --git a/middleware/freemaster/src/drivers/dreg/S32R/freemaster_s32r45_linflexd.c b/middleware/freemaster/src/drivers/dreg/S32R/freemaster_s32r45_linflexd.c new file mode 100644 index 0000000..e51b213 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32R/freemaster_s32r45_linflexd.c @@ -0,0 +1,345 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_S32R45_LINFLEXD_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32R45_LINFLEXD_ID) +#if !(FMSTR_DISABLE) + +#include "freemaster_serial.h" +#include "freemaster_s32r45_linflexd.h" + +/*********************************** +* local variables +***********************************/ + +/* SCI base address */ +#ifdef FMSTR_LINFLEXD_BASE + static FMSTR_ADDR fmstr_LINFLEXDBaseAddr = (FMSTR_ADDR)FMSTR_LINFLEXD_BASE; +#else + static FMSTR_ADDR fmstr_LINFLEXDBaseAddr = (FMSTR_ADDR)0; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of SCI driver adapter */ +static FMSTR_BOOL _FMSTR_S32R45_Init(void); +static void _FMSTR_S32R45_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_S32R45_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_S32R45_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32R45_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32R45_EnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_S32R45_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_S32R45_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_S32R45_IsTransmitterActive(void); +static void _FMSTR_S32R45_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_S32R45_GetChar(void); +static void _FMSTR_S32R45_Flush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this SCI driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_S32R45_LINFLEXD = +{ + .Init = _FMSTR_S32R45_Init, + .EnableTransmit = _FMSTR_S32R45_EnableTransmit, + .EnableReceive = _FMSTR_S32R45_EnableReceive, + .EnableTransmitInterrupt = _FMSTR_S32R45_EnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt= _FMSTR_S32R45_EnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_S32R45_EnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_S32R45_IsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_S32R45_IsReceiveRegFull, + .IsTransmitterActive = _FMSTR_S32R45_IsTransmitterActive, + .PutChar = _FMSTR_S32R45_PutChar, + .GetChar = _FMSTR_S32R45_GetChar, + .Flush = _FMSTR_S32R45_Flush, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +#define FMSTR_SETBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) |= (bit)) +#define FMSTR_CLRBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) &= ~(bit)) +#define FMSTR_TSTBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(((volatile FMSTR_U8*)(base))+(offset)) = (value)) +#define FMSTR_GETREG(base, offset) (*(((volatile FMSTR_U8*)(base))+(offset))) + +/**************************************************************************************** +* LINFLEXD module constants +*****************************************************************************************/ +/* LINFlexD module registers */ +#define FMSTR_LINFLEXD_UARTCR_OFFSET 0x10 /* 32bit register */ +#define FMSTR_LINFLEXD_LINIER_OFFSET 0x04 /* 32bit register */ +#define FMSTR_LINFLEXD_LINCR1_OFFSET 0x00 /* 32bit register */ +#define FMSTR_LINFLEXD_UARTSR_OFFSET 0x14 /* 32bit register */ +#define FMSTR_LINFLEXD_BDRL_OFFSET 0x38 /* 32bit register output*/ +#define FMSTR_LINFLEXD_BDRM_OFFSET 0x3C /* 32bit register input*/ +#define FMSTR_LINFLEXD_UARTPTO_OFFSET 0x50 /* 32bit register */ +#define FMSTR_LINFLEXD_UARTCTO_OFFSET 0x54 /* 32bit register */ + +/* LINFlexD UARTCR Control Register 1 bits */ +#define FMSTR_LINFLEXD_UARTCR_TXEN 0x00000010 +#define FMSTR_LINFLEXD_UARTCR_RXEN 0x00000020 + +/* LINFlexD LINIER Control Register 1 bits */ +#define FMSTR_LINFLEXD_LINIER_DRIE 0x00000004 +#define FMSTR_LINFLEXD_LINIER_DTIE 0x00000002 + +/* LINFlexD UART Status registers bits */ +#define FMSTR_LINFLEXD_UARTSR_DRFRFE 0x00000004 /*DRF*/ +#define FMSTR_LINFLEXD_UARTSR_DTFTFF 0x00000002 /*DTF*/ + +/****************************************************************************** +* +* @brief SCI communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32R45_Init(void) +{ +#if FMSTR_SERIAL_SINGLEWIRE + #error Internal single wire mode is not supported. + return FMSTR_FALSE; +#endif + + /* valid runtime module address must be assigned */ + if(fmstr_LINFLEXDBaseAddr != 0) + return FMSTR_TRUE; + else + return FMSTR_FALSE; +} + + +/****************************************************************************** +* +* @brief Enable/Disable LINFLEXD transmitter +* +******************************************************************************/ + +static void _FMSTR_S32R45_EnableTransmit(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable transmitter */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_TXEN); + } + else + { + /* Disable transmitter */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_TXEN); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable LINFLEXD receiver +* +******************************************************************************/ + +static void _FMSTR_S32R45_EnableReceive(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable receiver (enables single-wire connection) */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_RXEN); + } + else + { + /* Disable receiver */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_RXEN); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_S32R45_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt when transmission is complete +* +******************************************************************************/ + +static void _FMSTR_S32R45_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_S32R45_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DRIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DRIE); + } +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32R45_IsTransmitRegEmpty(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32R45_IsReceiveRegFull(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DRFRFE); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32R45_IsTransmitterActive(void) +{ + /* 0 - Transmission in progress, 1 - No transmission in progress */ + return (!(FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF))); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_S32R45_PutChar(FMSTR_BCHR ch) +{ + FMSTR_SETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_BDRL_OFFSET , ch); + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF); +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_S32R45_GetChar(void) +{ + FMSTR_BCHR c=0; + c = FMSTR_GETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_BDRM_OFFSET ); + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DRFRFE); + return c; +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ + +static void _FMSTR_S32R45_Flush(void) +{ +} + +/****************************************************************************** +* +* @brief Assign FreeMASTER communication module base address +* +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + fmstr_LINFLEXDBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Process FreeMASTER serial interrupt (call this function from SCI ISR) +* +******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* process incoming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + #endif +} + +#else /* !(FMSTR_DISABLE) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32R45_LINFLEXD_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/S32R/freemaster_s32r45_linflexd.h b/middleware/freemaster/src/drivers/dreg/S32R/freemaster_s32r45_linflexd.h new file mode 100644 index 0000000..6a60104 --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32R/freemaster_s32r45_linflexd.h @@ -0,0 +1,58 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - S32G2 UART low-level driver + */ + +#ifndef __FREEMASTER_S32R45_LINFLEXD_H +#define __FREEMASTER_S32R45_LINFLEXD_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_s32r45_linflexd.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_S32R45_LINFLEXD_H */ diff --git a/middleware/freemaster/src/drivers/dreg/S32S/freemaster_s32s247tv_linflexd.c b/middleware/freemaster/src/drivers/dreg/S32S/freemaster_s32s247tv_linflexd.c new file mode 100644 index 0000000..706b17f --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32S/freemaster_s32s247tv_linflexd.c @@ -0,0 +1,345 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Serial Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_S32S247TV_LINFLEXD_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32S247TV_LINFLEXD_ID) +#if !(FMSTR_DISABLE) + +#include "freemaster_serial.h" +#include "freemaster_s32s247tv_linflexd.h" + +/*********************************** +* local variables +***********************************/ + +/* SCI base address */ +#ifdef FMSTR_LINFLEXD_BASE + static FMSTR_ADDR fmstr_LINFLEXDBaseAddr = (FMSTR_ADDR)FMSTR_LINFLEXD_BASE; +#else + static FMSTR_ADDR fmstr_LINFLEXDBaseAddr = (FMSTR_ADDR)0; +#endif + +/*********************************** +* local function prototypes +***********************************/ + +/* Interface function - Initialization of SCI driver adapter */ +static FMSTR_BOOL _FMSTR_S32S247TV_Init(void); +static void _FMSTR_S32S247TV_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_S32S247TV_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_S32S247TV_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32S247TV_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_S32S247TV_EnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_S32S247TV_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_S32S247TV_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_S32S247TV_IsTransmitterActive(void); +static void _FMSTR_S32S247TV_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_S32S247TV_GetChar(void); +static void _FMSTR_S32S247TV_Flush(void); + +/*********************************** +* global variables +***********************************/ +/* Interface of this SCI driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_S32S247TV_LINFLEXD = +{ + .Init = _FMSTR_S32S247TV_Init, + .EnableTransmit = _FMSTR_S32S247TV_EnableTransmit, + .EnableReceive = _FMSTR_S32S247TV_EnableReceive, + .EnableTransmitInterrupt = _FMSTR_S32S247TV_EnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt= _FMSTR_S32S247TV_EnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_S32S247TV_EnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_S32S247TV_IsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_S32S247TV_IsReceiveRegFull, + .IsTransmitterActive = _FMSTR_S32S247TV_IsTransmitterActive, + .PutChar = _FMSTR_S32S247TV_PutChar, + .GetChar = _FMSTR_S32S247TV_GetChar, + .Flush = _FMSTR_S32S247TV_Flush, +}; + +/**************************************************************************************** +* General peripheral space access macros +*****************************************************************************************/ + +#define FMSTR_SETBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) |= (bit)) +#define FMSTR_CLRBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) &= ~(bit)) +#define FMSTR_TSTBIT(base, offset, bit) (*(((volatile FMSTR_U8*)(base))+(offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(((volatile FMSTR_U8*)(base))+(offset)) = (value)) +#define FMSTR_GETREG(base, offset) (*(((volatile FMSTR_U8*)(base))+(offset))) + +/**************************************************************************************** +* LINFLEXD module constants +*****************************************************************************************/ +/* LINFlexD module registers */ +#define FMSTR_LINFLEXD_UARTCR_OFFSET 0x10 /* 32bit register */ +#define FMSTR_LINFLEXD_LINIER_OFFSET 0x04 /* 32bit register */ +#define FMSTR_LINFLEXD_LINCR1_OFFSET 0x00 /* 32bit register */ +#define FMSTR_LINFLEXD_UARTSR_OFFSET 0x14 /* 32bit register */ +#define FMSTR_LINFLEXD_BDRL_OFFSET 0x38 /* 32bit register output*/ +#define FMSTR_LINFLEXD_BDRM_OFFSET 0x3C /* 32bit register input*/ +#define FMSTR_LINFLEXD_UARTPTO_OFFSET 0x50 /* 32bit register */ +#define FMSTR_LINFLEXD_UARTCTO_OFFSET 0x54 /* 32bit register */ + +/* LINFlexD UARTCR Control Register 1 bits */ +#define FMSTR_LINFLEXD_UARTCR_TXEN 0x00000010 +#define FMSTR_LINFLEXD_UARTCR_RXEN 0x00000020 + +/* LINFlexD LINIER Control Register 1 bits */ +#define FMSTR_LINFLEXD_LINIER_DRIE 0x00000004 +#define FMSTR_LINFLEXD_LINIER_DTIE 0x00000002 + +/* LINFlexD UART Status registers bits */ +#define FMSTR_LINFLEXD_UARTSR_DRFRFE 0x00000004 /*DRF*/ +#define FMSTR_LINFLEXD_UARTSR_DTFTFF 0x00000002 /*DTF*/ + +/****************************************************************************** +* +* @brief SCI communication initialization +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32S247TV_Init(void) +{ +#if FMSTR_SERIAL_SINGLEWIRE + #error Internal single wire mode is not supported. + return FMSTR_FALSE; +#endif + + /* valid runtime module address must be assigned */ + if(fmstr_LINFLEXDBaseAddr != 0) + return FMSTR_TRUE; + else + return FMSTR_FALSE; +} + + +/****************************************************************************** +* +* @brief Enable/Disable LINFLEXD transmitter +* +******************************************************************************/ + +static void _FMSTR_S32S247TV_EnableTransmit(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable transmitter */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_TXEN); + } + else + { + /* Disable transmitter */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_TXEN); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable LINFLEXD receiver +* +******************************************************************************/ + +static void _FMSTR_S32S247TV_EnableReceive(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable receiver (enables single-wire connection) */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_RXEN); + } + else + { + /* Disable receiver */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTCR_OFFSET, FMSTR_LINFLEXD_UARTCR_RXEN); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from transmit register empty event +* +******************************************************************************/ + +static void _FMSTR_S32S247TV_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt when transmission is complete +* +******************************************************************************/ + +static void _FMSTR_S32S247TV_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DTIE); + } +} + +/****************************************************************************** +* +* @brief Enable/Disable interrupt from receive register full event +* +******************************************************************************/ + +static void _FMSTR_S32S247TV_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if(enable) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DRIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_LINIER_OFFSET, FMSTR_LINFLEXD_LINIER_DRIE); + } +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmit register is empty, and it's possible to put next char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32S247TV_IsTransmitRegEmpty(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the receive register is full, and it's possible to get received char +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32S247TV_IsReceiveRegFull(void) +{ + return (FMSTR_BOOL) FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DRFRFE); +} + +/****************************************************************************** +* +* @brief Returns TRUE if the transmitter is still active +* +******************************************************************************/ + +static FMSTR_BOOL _FMSTR_S32S247TV_IsTransmitterActive(void) +{ + /* 0 - Transmission in progress, 1 - No transmission in progress */ + return (!(FMSTR_TSTBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF))); +} + +/****************************************************************************** +* +* @brief The function puts the char for transmit +* +******************************************************************************/ + +static void _FMSTR_S32S247TV_PutChar(FMSTR_BCHR ch) +{ + FMSTR_SETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_BDRL_OFFSET , ch); + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DTFTFF); +} + +/****************************************************************************** +* +* @brief The function gets the received char +* +******************************************************************************/ +static FMSTR_BCHR _FMSTR_S32S247TV_GetChar(void) +{ + FMSTR_BCHR c=0; + c = FMSTR_GETREG(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_BDRM_OFFSET ); + FMSTR_SETBIT(fmstr_LINFLEXDBaseAddr, FMSTR_LINFLEXD_UARTSR_OFFSET, FMSTR_LINFLEXD_UARTSR_DRFRFE); + return c; +} + +/****************************************************************************** +* +* @brief The function sends buffered data +* +******************************************************************************/ + +static void _FMSTR_S32S247TV_Flush(void) +{ +} + +/****************************************************************************** +* +* @brief Assign FreeMASTER communication module base address +* +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + fmstr_LINFLEXDBaseAddr = base; +} + +/****************************************************************************** +* +* @brief Process FreeMASTER serial interrupt (call this function from SCI ISR) +* +******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* process incoming or just transmitted byte */ + #if (FMSTR_LONG_INTR) || (FMSTR_SHORT_INTR) + FMSTR_ProcessSerial(); + #endif +} + +#else /* !(FMSTR_DISABLE) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_S32S247TV_LINFLEXD_ID) */ diff --git a/middleware/freemaster/src/drivers/dreg/S32S/freemaster_s32s247tv_linflexd.h b/middleware/freemaster/src/drivers/dreg/S32S/freemaster_s32s247tv_linflexd.h new file mode 100644 index 0000000..0b7654e --- /dev/null +++ b/middleware/freemaster/src/drivers/dreg/S32S/freemaster_s32s247tv_linflexd.h @@ -0,0 +1,58 @@ +/* + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - S32G2 UART low-level driver + */ + +#ifndef __FREEMASTER_S32S247TV_LINFLEXD_H +#define __FREEMASTER_S32S247TV_LINFLEXD_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_s32s247tv_linflexd.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_ADDR base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_S32S247TV_LINFLEXD_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan.c b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan.c new file mode 100644 index 0000000..bbe7ac5 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan.c @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - FlexCAN low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_CAN_MCUX_FLEXCAN_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_MCUX_FLEXCAN_ID) + +#include "freemaster_flexcan.h" + +#if FMSTR_DISABLE == 0 + +#include "freemaster_can.h" +#include "fsl_flexcan.h" + +/****************************************************************************** + * Configuration + ******************************************************************************/ + +/* Flexcan TX message buffer must be defined */ +#ifndef FMSTR_FLEXCAN_TXMB +#warning "FlexCAN Message Buffer 1 is used for transmitting messages" +#define FMSTR_FLEXCAN_TXMB 1U +#endif + +/* Flexcan RX message buffer must be defined */ +#ifndef FMSTR_FLEXCAN_RXMB +#warning "FlexCAN Message Buffer 2 is used for receiving messages" +#define FMSTR_FLEXCAN_RXMB 2U +#endif + +/****************************************************************************** + * Local macros + ******************************************************************************/ + +/* FCAN: id to id-raw (idr) translation */ +#define FMSTR_FCAN_ID2IDR(id) (((id)&FMSTR_CAN_EXTID) != 0UL ? FLEXCAN_ID_EXT(id) : FLEXCAN_ID_STD(id)) + +/* user-selected MB as a 32bit or 64bit flag */ +#if FMSTR_FLEXCAN_RXMB < 32 +#define FMSTR_FLEXCAN_RXMB_FLAG (1UL << (FMSTR_FLEXCAN_RXMB)) +#else +#define FMSTR_FLEXCAN_RXMB_FLAG (1ULL << (FMSTR_FLEXCAN_RXMB)) +#endif +#if FMSTR_FLEXCAN_TXMB < 32 +#define FMSTR_FLEXCAN_TXMB_FLAG (1UL << (FMSTR_FLEXCAN_TXMB)) +#else +#define FMSTR_FLEXCAN_TXMB_FLAG (1ULL << (FMSTR_FLEXCAN_TXMB)) +#endif + +/* Using 64bit registers */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) +#define FMSTR_FLEXCAN_REG_SIZE64 +#define FMSTR_FLEXCAN_FLAG_ALL 0xFFFFFFFFFFFFFFFFULL +#else +#define FMSTR_FLEXCAN_FLAG_ALL 0xFFFFFFFFUL +#endif + +/****************************************************************************** + * Local functions + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_FlexCAN_Init(FMSTR_U32 idRx, + FMSTR_U32 idTx); /* Initialize CAN module on a given base address. */ +static void _FMSTR_FlexCAN_EnableTxInterrupt(FMSTR_BOOL enable); /* Enable CAN Transmit interrupt. */ +static void _FMSTR_FlexCAN_EnableRxInterrupt(FMSTR_BOOL enable); /* Enable CAN Receive interrupt. */ +static void _FMSTR_FlexCAN_EnableRx(void); /* Enable/re-initialize Receiver buffer. */ +static FMSTR_SIZE8 _FMSTR_FlexCAN_GetRxFrameLen(void); /* Return size of received CAN frame. */ +static FMSTR_BCHR _FMSTR_FlexCAN_GetRxFrameByte(FMSTR_SIZE8 index); /* Get data byte at index (0..8). */ +static void _FMSTR_FlexCAN_AckRxFrame(void); /* Discard received frame and enable receiving a next one. */ +static FMSTR_BOOL _FMSTR_FlexCAN_PrepareTxFrame(void); /* Initialize transmit buffer. */ +static void _FMSTR_FlexCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data); /* Fill one byte of transmit data. */ +static void _FMSTR_FlexCAN_SendTxFrame(FMSTR_SIZE8 len); /* Send the Tx buffer. */ + +/****************************************************************************** + * Local variables + ******************************************************************************/ + +/* Serial base address */ +#ifdef FMSTR_CAN_BASE +static CAN_Type *fmstr_canBaseAddr = FMSTR_CAN_BASE; +#else +static CAN_Type *fmstr_canBaseAddr = NULL; +#endif + +static flexcan_rx_mb_config_t fmstr_rxcfg; /* MB configuration with Raw ID */ +static flexcan_frame_t fmstr_rxmsg; /* Received frame buffer, valid when length>0 */ +static flexcan_frame_t fmstr_txmsg; /* Buffer to prepare transmission */ + +/****************************************************************************** + * Driver interface + ******************************************************************************/ + +const FMSTR_CAN_DRV_INTF FMSTR_CAN_MCUX_FLEXCAN = { + FMSTR_C99_INIT(Init) _FMSTR_FlexCAN_Init, + FMSTR_C99_INIT(EnableTxInterrupt) _FMSTR_FlexCAN_EnableTxInterrupt, + FMSTR_C99_INIT(EnableRxInterrupt) _FMSTR_FlexCAN_EnableRxInterrupt, + FMSTR_C99_INIT(EnableRx) _FMSTR_FlexCAN_EnableRx, + FMSTR_C99_INIT(GetRxFrameLen) _FMSTR_FlexCAN_GetRxFrameLen, + FMSTR_C99_INIT(GetRxFrameByte) _FMSTR_FlexCAN_GetRxFrameByte, + FMSTR_C99_INIT(AckRxFrame) _FMSTR_FlexCAN_AckRxFrame, + FMSTR_C99_INIT(PrepareTxFrame) _FMSTR_FlexCAN_PrepareTxFrame, + FMSTR_C99_INIT(PutTxFrameByte) _FMSTR_FlexCAN_PutTxFrameByte, + FMSTR_C99_INIT(SendTxFrame) _FMSTR_FlexCAN_SendTxFrame, +}; + +/****************************************************************************** + * Implementation + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_FlexCAN_Init(FMSTR_U32 idRx, FMSTR_U32 idTx) +{ + /* initialize Rx MB */ + FMSTR_MemSet(&fmstr_rxmsg, 0, sizeof(fmstr_rxmsg)); + FMSTR_MemSet(&fmstr_rxcfg, 0, sizeof(fmstr_rxcfg)); + fmstr_rxcfg.id = FMSTR_FCAN_ID2IDR(idRx); + fmstr_rxcfg.format = (idRx & FMSTR_CAN_EXTID) != 0U ? kFLEXCAN_FrameFormatExtend : kFLEXCAN_FrameFormatStandard; + fmstr_rxcfg.type = kFLEXCAN_FrameTypeData; + FLEXCAN_SetRxMbConfig(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB, &fmstr_rxcfg, false); + + /* initialize Tx MB */ + FMSTR_MemSet(&fmstr_txmsg, 0, sizeof(fmstr_txmsg)); + fmstr_txmsg.id = FMSTR_FCAN_ID2IDR(idTx); + fmstr_txmsg.format = + (FMSTR_U8)((idTx & FMSTR_CAN_EXTID) != 0U ? kFLEXCAN_FrameFormatExtend : kFLEXCAN_FrameFormatStandard); + fmstr_txmsg.type = (FMSTR_U8)kFLEXCAN_FrameTypeData; + FLEXCAN_SetTxMbConfig(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB, true); + + { + /* Make sure the RX Message Buffer is unlocked. */ + volatile uint32_t dummy = fmstr_canBaseAddr->TIMER; + FMSTR_UNUSED(dummy); + } + + return FMSTR_TRUE; +} + +static void _FMSTR_FlexCAN_EnableTxInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + FLEXCAN_EnableMbInterrupts(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB_FLAG); + } + else + { + FLEXCAN_DisableMbInterrupts(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB_FLAG); + } +} + +static void _FMSTR_FlexCAN_EnableRxInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + FLEXCAN_EnableMbInterrupts(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB_FLAG); + } + else + { + FLEXCAN_DisableMbInterrupts(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB_FLAG); + } +} + +static void _FMSTR_FlexCAN_EnableRx(void) +{ + /* enbale receiving into the MB */ + FLEXCAN_SetRxMbConfig(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB, &fmstr_rxcfg, true); +} + +static FMSTR_SIZE8 _FMSTR_FlexCAN_GetRxFrameLen(void) +{ +#if FMSTR_POLL_DRIVEN > 0 + /* Is any data received? */ + if (FLEXCAN_GetMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB_FLAG) == 0U) + { + return 0U; + } + + /* Clear RX status flag */ + FLEXCAN_ClearMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB_FLAG); +#endif /* FMSTR_POLL_DRIVEN */ + + /* Current cache still valid? */ + if (fmstr_rxmsg.length == 0U) + { + /* Try to read data, when successful, the MB is acknowledged and set for next receive */ + status_t s = FLEXCAN_ReadRxMb(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB, &fmstr_rxmsg); + + /* Make sure the RX Message Buffer is unlocked. */ + volatile uint32_t dummy = fmstr_canBaseAddr->TIMER; + FMSTR_UNUSED(dummy); + + if (s == kStatus_Fail) + { + fmstr_rxmsg.length = 0U; /* no frame available */ + } + } + + /* we have got some frame, return its length */ + return (FMSTR_SIZE8)fmstr_rxmsg.length; +} + +static FMSTR_BCHR _FMSTR_FlexCAN_GetRxFrameByte(FMSTR_SIZE8 index) +{ + FMSTR_BCHR data; + + /* need switch as data bytes are not necessarily ordered in the frame */ + switch (index) + { + case 0: + data = fmstr_rxmsg.dataByte0; + break; + case 1: + data = fmstr_rxmsg.dataByte1; + break; + case 2: + data = fmstr_rxmsg.dataByte2; + break; + case 3: + data = fmstr_rxmsg.dataByte3; + break; + case 4: + data = fmstr_rxmsg.dataByte4; + break; + case 5: + data = fmstr_rxmsg.dataByte5; + break; + case 6: + data = fmstr_rxmsg.dataByte6; + break; + default: + data = fmstr_rxmsg.dataByte7; + break; + } + + return data; +} + +static void _FMSTR_FlexCAN_AckRxFrame(void) +{ + /* The frame is already acknowledged in registers by calling FLEXCAN_ReadRxMb before. */ + /* We only clear the local cached buffer so it appears as if we have acknowledged it. */ + fmstr_rxmsg.length = 0U; +} + +static FMSTR_BOOL _FMSTR_FlexCAN_PrepareTxFrame(void) +{ +#if FMSTR_POLL_DRIVEN > 0 + /* Was all data sent? */ + if (fmstr_txmsg.length > 0U && FLEXCAN_GetMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB_FLAG) == 0U) + { + return FMSTR_FALSE; + } + + /* Clear TX status flag */ + FLEXCAN_ClearMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB_FLAG); + + /* Acknowledge frame was transmitted */ + fmstr_txmsg.length = 0U; +#else + if (fmstr_txmsg.length > 0U) + { + return FMSTR_FALSE; + } +#endif /* FMSTR_POLL_DRIVEN */ + + /* set as transmit-emtpy MB */ + FLEXCAN_SetTxMbConfig(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB, true); + + return FMSTR_TRUE; +} + +static void _FMSTR_FlexCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data) +{ + /* need switch as data bytes are not necessarily ordered in the frame */ + switch (index) + { + case 0: + fmstr_txmsg.dataByte0 = data; + break; + case 1: + fmstr_txmsg.dataByte1 = data; + break; + case 2: + fmstr_txmsg.dataByte2 = data; + break; + case 3: + fmstr_txmsg.dataByte3 = data; + break; + case 4: + fmstr_txmsg.dataByte4 = data; + break; + case 5: + fmstr_txmsg.dataByte5 = data; + break; + case 6: + fmstr_txmsg.dataByte6 = data; + break; + default: + fmstr_txmsg.dataByte7 = data; + break; + } +} + +static void _FMSTR_FlexCAN_SendTxFrame(FMSTR_SIZE8 len) +{ + status_t status; + + fmstr_txmsg.length = len; + + status = FLEXCAN_WriteTxMb(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB, &fmstr_txmsg); + FMSTR_UNUSED(status); +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER + *communication module base address + * + ******************************************************************************/ + +void FMSTR_CanSetBaseAddress(CAN_Type *base) +{ + fmstr_canBaseAddr = base; +} + +void FMSTR_CanIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + uint32_t isrFlags = FLEXCAN_GetStatusFlags(fmstr_canBaseAddr); +#ifdef FMSTR_FLEXCAN_REG_SIZE64 + uint64_t isrFlagsMB; +#else + uint32_t isrFlagsMB; +#endif + + isrFlagsMB = FLEXCAN_GetMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_FLAG_ALL); + + /* Ignoring error and wake up flags */ + if (isrFlags != 0U) + { + FLEXCAN_ClearStatusFlags(fmstr_canBaseAddr, isrFlags); + } + + if (isrFlagsMB != 0U) + { + /* Read or Write */ + if ((isrFlagsMB & FMSTR_FLEXCAN_RXMB_FLAG) != 0U) + { + FMSTR_ProcessCanRx(); + } + if ((isrFlagsMB & FMSTR_FLEXCAN_TXMB_FLAG) != 0U) + { + /* Acknowledge frame transmission */ + fmstr_txmsg.length = 0U; + /* Send next frame, if needed */ + FMSTR_ProcessCanTx(); + } + + /* Clear all interrupt flags */ + FLEXCAN_ClearMbStatusFlags(fmstr_canBaseAddr, isrFlagsMB); + } +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_CanSetBaseAddress(CAN_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_CanIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_MCUX_FLEXCAN_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan.h b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan.h new file mode 100644 index 0000000..6233a91 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - FlexCAN low-level driver + */ + +#ifndef __FREEMASTER_FLEXCAN_H +#define __FREEMASTER_FLEXCAN_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_flexcan.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +void FMSTR_CanSetBaseAddress(CAN_Type *base); +void FMSTR_CanIsr(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_FLEXCAN_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan_dsc.c b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan_dsc.c new file mode 100644 index 0000000..a22a3ac --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan_dsc.c @@ -0,0 +1,396 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - DSC FlexCAN low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_CAN_MCUX_DSCFLEXCAN_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_MCUX_DSCFLEXCAN_ID) + +#include "freemaster_flexcan_dsc.h" + +#if FMSTR_DISABLE == 0 + +#include "freemaster_can.h" +#include "fsl_flexcan.h" + +/****************************************************************************** + * Configuration + ******************************************************************************/ + +/* Flexcan TX message buffer must be defined */ +#ifndef FMSTR_FLEXCAN_TXMB +#warning "FlexCAN Message Buffer 1 is used for transmitting messages" +#define FMSTR_FLEXCAN_TXMB 1U +#endif + +/* Flexcan RX message buffer must be defined */ +#ifndef FMSTR_FLEXCAN_RXMB +#warning "FlexCAN Message Buffer 2 is used for receiving messages" +#define FMSTR_FLEXCAN_RXMB 2U +#endif + +/****************************************************************************** + * Local macros + ******************************************************************************/ + +/* FCAN: id to id-raw (idr) translation */ +#define FMSTR_FCAN_ID2IDR(id) (((id)&FMSTR_CAN_EXTID) != 0UL ? FLEXCAN_ID_EXT(id) : FLEXCAN_ID_STD(id)) + +/* user-selected MB as a 32bit or 64bit flag */ +#if FMSTR_FLEXCAN_RXMB < 32 +#define FMSTR_FLEXCAN_RXMB_FLAG (1UL << (FMSTR_FLEXCAN_RXMB)) +#else +#define FMSTR_FLEXCAN_RXMB_FLAG (1ULL << (FMSTR_FLEXCAN_RXMB)) +#endif +#if FMSTR_FLEXCAN_TXMB < 32 +#define FMSTR_FLEXCAN_TXMB_FLAG (1UL << (FMSTR_FLEXCAN_TXMB)) +#else +#define FMSTR_FLEXCAN_TXMB_FLAG (1ULL << (FMSTR_FLEXCAN_TXMB)) +#endif + +/* Using 64bit registers */ +#if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0) +#define FMSTR_FLEXCAN_REG_SIZE64 +#define FMSTR_FLEXCAN_FLAG_ALL 0xFFFFFFFFFFFFFFFFULL +#else +#define FMSTR_FLEXCAN_FLAG_ALL 0xFFFFFFFFUL +#endif + +/****************************************************************************** + * Local functions + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_FlexCAN_Init(FMSTR_U32 idRx, + FMSTR_U32 idTx); /* Initialize CAN module on a given base address. */ +static void _FMSTR_FlexCAN_EnableTxInterrupt(FMSTR_BOOL enable); /* Enable CAN Transmit interrupt. */ +static void _FMSTR_FlexCAN_EnableRxInterrupt(FMSTR_BOOL enable); /* Enable CAN Receive interrupt. */ +static void _FMSTR_FlexCAN_EnableRx(void); /* Enable/re-initialize Receiver buffer. */ +static FMSTR_SIZE8 _FMSTR_FlexCAN_GetRxFrameLen(void); /* Return size of received CAN frame. */ +static FMSTR_BCHR _FMSTR_FlexCAN_GetRxFrameByte(FMSTR_SIZE8 index); /* Get data byte at index (0..8). */ +static void _FMSTR_FlexCAN_AckRxFrame(void); /* Discard received frame and enable receiving a next one. */ +static FMSTR_BOOL _FMSTR_FlexCAN_PrepareTxFrame(void); /* Initialize transmit buffer. */ +static void _FMSTR_FlexCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data); /* Fill one byte of transmit data. */ +static void _FMSTR_FlexCAN_SendTxFrame(FMSTR_SIZE8 len); /* Send the Tx buffer. */ + +/****************************************************************************** + * Local variables + ******************************************************************************/ + +/* Serial base address */ +#ifdef FMSTR_CAN_BASE +static CAN_Type *fmstr_canBaseAddr = FMSTR_CAN_BASE; +#else +static CAN_Type *fmstr_canBaseAddr = NULL; +#endif + +static flexcan_rx_mb_config_t fmstr_rxcfg; /* MB configuration with Raw ID */ +static flexcan_frame_t fmstr_rxmsg; /* Received frame buffer, valid when length>0 */ +static flexcan_frame_t fmstr_txmsg; /* Buffer to prepare transmission */ + +/****************************************************************************** + * Driver interface + ******************************************************************************/ + +const FMSTR_CAN_DRV_INTF FMSTR_CAN_MCUX_DSCFLEXCAN = { + FMSTR_C99_INIT(Init) _FMSTR_FlexCAN_Init, + FMSTR_C99_INIT(EnableTxInterrupt) _FMSTR_FlexCAN_EnableTxInterrupt, + FMSTR_C99_INIT(EnableRxInterrupt) _FMSTR_FlexCAN_EnableRxInterrupt, + FMSTR_C99_INIT(EnableRx) _FMSTR_FlexCAN_EnableRx, + FMSTR_C99_INIT(GetRxFrameLen) _FMSTR_FlexCAN_GetRxFrameLen, + FMSTR_C99_INIT(GetRxFrameByte) _FMSTR_FlexCAN_GetRxFrameByte, + FMSTR_C99_INIT(AckRxFrame) _FMSTR_FlexCAN_AckRxFrame, + FMSTR_C99_INIT(PrepareTxFrame) _FMSTR_FlexCAN_PrepareTxFrame, + FMSTR_C99_INIT(PutTxFrameByte) _FMSTR_FlexCAN_PutTxFrameByte, + FMSTR_C99_INIT(SendTxFrame) _FMSTR_FlexCAN_SendTxFrame, +}; + +/****************************************************************************** + * Implementation + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_FlexCAN_Init(FMSTR_U32 idRx, FMSTR_U32 idTx) +{ + /* initialize Rx MB */ + FMSTR_MemSet(&fmstr_rxmsg, 0, sizeof(fmstr_rxmsg)); + FMSTR_MemSet(&fmstr_rxcfg, 0, sizeof(fmstr_rxcfg)); + fmstr_rxcfg.u32Id = FMSTR_FCAN_ID2IDR(idRx); + fmstr_rxcfg.eFormat = (idRx & FMSTR_CAN_EXTID) != 0U ? kFLEXCAN_FrameFormatExtend : kFLEXCAN_FrameFormatStandard; + fmstr_rxcfg.eType = kFLEXCAN_FrameTypeData; + FLEXCAN_SetRxMbConfig(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB, &fmstr_rxcfg, false); + + /* initialize Tx MB */ + FMSTR_MemSet(&fmstr_txmsg, 0, sizeof(fmstr_txmsg)); + fmstr_txmsg.bitsId = FMSTR_FCAN_ID2IDR(idTx); + fmstr_txmsg.bitFormat = (idTx & FMSTR_CAN_EXTID) != 0U ? kFLEXCAN_FrameFormatExtend : kFLEXCAN_FrameFormatStandard; + fmstr_txmsg.bitType = kFLEXCAN_FrameTypeData; + FLEXCAN_SetTxMbConfig(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB, true); + + { + /* Make sure the RX Message Buffer is unlocked. */ + volatile uint32_t dummy = fmstr_canBaseAddr->TIMER; + FMSTR_UNUSED(dummy); + } + + return FMSTR_TRUE; +} + +static void _FMSTR_FlexCAN_EnableTxInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + FLEXCAN_EnableMbInterrupts(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB_FLAG); + } + else + { + FLEXCAN_DisableMbInterrupts(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB_FLAG); + } +} + +static void _FMSTR_FlexCAN_EnableRxInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + FLEXCAN_EnableMbInterrupts(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB_FLAG); + } + else + { + FLEXCAN_DisableMbInterrupts(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB_FLAG); + } +} + +static void _FMSTR_FlexCAN_EnableRx(void) +{ + /* enbale receiving into the MB */ + FLEXCAN_SetRxMbConfig(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB, &fmstr_rxcfg, true); +} + +static FMSTR_SIZE8 _FMSTR_FlexCAN_GetRxFrameLen(void) +{ +#if FMSTR_POLL_DRIVEN > 0 + /* Is any data received? */ + if (FLEXCAN_GetMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB_FLAG) == 0U) + { + return 0U; + } + + /* Clear RX status flag */ + FLEXCAN_ClearMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB_FLAG); +#endif /* FMSTR_POLL_DRIVEN */ + + /* Current cache still valid? */ + if (fmstr_rxmsg.bitsLength == 0U) + { + /* Try to read data, when successful, the MB is acknowledged and set for next receive */ + status_t s = FLEXCAN_ReadRxMb(fmstr_canBaseAddr, FMSTR_FLEXCAN_RXMB, &fmstr_rxmsg); + + /* Make sure the RX Message Buffer is unlocked. */ + volatile uint32_t dummy = fmstr_canBaseAddr->TIMER; + FMSTR_UNUSED(dummy); + + if (s == kStatus_Fail) + { + fmstr_rxmsg.bitsLength = 0U; /* no frame available */ + } + } + + /* we have got some frame, return its length */ + return fmstr_rxmsg.bitsLength; +} + +static FMSTR_BCHR _FMSTR_FlexCAN_GetRxFrameByte(FMSTR_SIZE8 index) +{ + FMSTR_BCHR data; + + /* need switch as data bytes are not necessarily ordered in the frame */ + switch (index) + { + case 0: + data = fmstr_rxmsg.u8DataByte0; + break; + case 1: + data = fmstr_rxmsg.u8DataByte1; + break; + case 2: + data = fmstr_rxmsg.u8DataByte2; + break; + case 3: + data = fmstr_rxmsg.u8DataByte3; + break; + case 4: + data = fmstr_rxmsg.u8DataByte4; + break; + case 5: + data = fmstr_rxmsg.u8DataByte5; + break; + case 6: + data = fmstr_rxmsg.u8DataByte6; + break; + default: + data = fmstr_rxmsg.u8DataByte7; + break; + } + + return data; +} + +static void _FMSTR_FlexCAN_AckRxFrame(void) +{ + /* The frame is already acknowledged in registers by calling FLEXCAN_ReadRxMb before. */ + /* We only clear the local cached buffer so it appears as if we have acknowledged it. */ + fmstr_rxmsg.bitsLength = 0U; +} + +static FMSTR_BOOL _FMSTR_FlexCAN_PrepareTxFrame(void) +{ +#if FMSTR_POLL_DRIVEN > 0 + /* Was all data sent? */ + if (fmstr_txmsg.bitsLength > 0U && FLEXCAN_GetMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB_FLAG) == 0U) + { + return FMSTR_FALSE; + } + + /* Clear TX status flag */ + FLEXCAN_ClearMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB_FLAG); + + /* Acknowledge frame was transmitted */ + fmstr_txmsg.bitsLength = 0U; +#else + if (fmstr_txmsg.bitsLength > 0U) + { + return FMSTR_FALSE; + } +#endif /* FMSTR_POLL_DRIVEN */ + + /* set as transmit-emtpy MB */ + FLEXCAN_SetTxMbConfig(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB, true); + + return FMSTR_TRUE; +} + +static void _FMSTR_FlexCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data) +{ + /* need switch as data bytes are not necessarily ordered in the frame */ + switch (index) + { + case 0: + fmstr_txmsg.u8DataByte0 = data; + break; + case 1: + fmstr_txmsg.u8DataByte1 = data; + break; + case 2: + fmstr_txmsg.u8DataByte2 = data; + break; + case 3: + fmstr_txmsg.u8DataByte3 = data; + break; + case 4: + fmstr_txmsg.u8DataByte4 = data; + break; + case 5: + fmstr_txmsg.u8DataByte5 = data; + break; + case 6: + fmstr_txmsg.u8DataByte6 = data; + break; + default: + fmstr_txmsg.u8DataByte7 = data; + break; + } +} + +static void _FMSTR_FlexCAN_SendTxFrame(FMSTR_SIZE8 len) +{ + status_t status; + + fmstr_txmsg.bitsLength = len; + + status = FLEXCAN_WriteTxMb(fmstr_canBaseAddr, FMSTR_FLEXCAN_TXMB, &fmstr_txmsg); + FMSTR_UNUSED(status); +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER + *communication module base address + * + ******************************************************************************/ + +void FMSTR_CanSetBaseAddress(CAN_Type *base) +{ + fmstr_canBaseAddr = base; +} + +void FMSTR_CanIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + uint32_t isrFlags = FLEXCAN_GetStatusFlags(fmstr_canBaseAddr); +#ifdef FMSTR_FLEXCAN_REG_SIZE64 + uint64_t isrFlagsMB; +#else + uint32_t isrFlagsMB; +#endif + + isrFlagsMB = FLEXCAN_GetMbStatusFlags(fmstr_canBaseAddr, FMSTR_FLEXCAN_FLAG_ALL); + + /* Ignoring error and wake up flags */ + if (isrFlags != 0U) + { + FLEXCAN_ClearStatusFlags(fmstr_canBaseAddr, isrFlags); + } + + if (isrFlagsMB != 0U) + { + /* Read or Write */ + if ((isrFlagsMB & FMSTR_FLEXCAN_RXMB_FLAG) != 0U) + { + FMSTR_ProcessCanRx(); + } + if ((isrFlagsMB & FMSTR_FLEXCAN_TXMB_FLAG) != 0U) + { + /* Acknowledge frame transmission */ + fmstr_txmsg.bitsLength = 0U; + /* Send next frame, if needed */ + FMSTR_ProcessCanTx(); + } + + /* Clear all interrupt flags */ + FLEXCAN_ClearMbStatusFlags(fmstr_canBaseAddr, isrFlagsMB); + } +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_CanSetBaseAddress(CAN_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_CanIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_MCUX_DSCFLEXCAN_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan_dsc.h b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan_dsc.h new file mode 100644 index 0000000..9849be1 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_flexcan_dsc.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - DSC FlexCAN low-level driver + */ + +#ifndef __FREEMASTER_FLEXCAN_DSC_H +#define __FREEMASTER_FLEXCAN_DSC_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_flexcan_dsc.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +void FMSTR_CanSetBaseAddress(CAN_Type *base); +void FMSTR_CanIsr(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_FLEXCAN_DSC_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mcan.c b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mcan.c new file mode 100644 index 0000000..933de81 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mcan.c @@ -0,0 +1,362 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - MCAN low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_CAN_MCUX_MCAN_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_MCUX_MCAN_ID) + +#include "freemaster_mcan.h" + +#if FMSTR_DISABLE == 0 + +#include "freemaster_can.h" +#include "fsl_mcan.h" + +/****************************************************************************** + * Configuration + ******************************************************************************/ + +/* MCAN needs to know offset of the mcan shared memory, offsets of the buffers into shared memory, + * transmit/receive MB numbers */ +#ifndef FMSTR_MCAN_TXMB_OFFSET +#error "MCAN transmit buffers offset in shared memory must be defined" +#endif + +#ifndef FMSTR_MCAN_RXMB_OFFSET +#error "MCAN receive buffers offset in shared memory must be defined" +#endif + +#ifndef FMSTR_MCAN_SHAREDMEMORY_OFFSET +#error "MCAN shared memory address must be defined" +#endif + +/****************************************************************************** + * Local macros + ******************************************************************************/ + +/* FCAN: id to id-raw (idr) translation */ +#define FMSTR_FCAN_ID2IDR(id) (((id)&FMSTR_CAN_EXTID) != 0U ? MCAN_ID_EXT(id) : MCAN_ID_STD(id)) + +#define FMSTR_MCAN_STD_FILTER_OFS 0x0U +#define FMSTR_MCAN_STDID_OFFSET 18U + +/* Data size of mCAN (8 bytes is for normal CAN, 32 bytes is for CAN FD) */ +#define FMSTR_MCAN_CAN_DATASIZE 8U + +/* Select Rx FiFo */ +#if defined(FMSTR_MCAN_RX_FIFO) && (FMSTR_MCAN_RX_FIFO == 1) +#define FMSTR_MCAN_RX_FIFO1 +#else +#define FMSTR_MCAN_RX_FIFO0 +#endif + +/****************************************************************************** + * Local functions + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_MCAN_Init(FMSTR_U32 idRx, FMSTR_U32 idTx); /* Initialize CAN module on a given base address. */ +static void _FMSTR_MCAN_EnableTxInterrupt(FMSTR_BOOL enable); /* Enable CAN Transmit interrupt. */ +static void _FMSTR_MCAN_EnableRxInterrupt(FMSTR_BOOL enable); /* Enable CAN Receive interrupt. */ +static void _FMSTR_MCAN_EnableRx(void); /* Enable/re-initialize Receiver buffer. */ +static FMSTR_SIZE8 _FMSTR_MCAN_GetRxFrameLen(void); /* Return size of received CAN frame. */ +static FMSTR_BCHR _FMSTR_MCAN_GetRxFrameByte(FMSTR_SIZE8 index); /* Get data byte at index (0..8). */ +static void _FMSTR_MCAN_AckRxFrame(void); /* Discard received frame and enable receiving a next one. */ +static FMSTR_BOOL _FMSTR_MCAN_PrepareTxFrame(void); /* Initialize transmit buffer. */ +static void _FMSTR_MCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data); /* Fill one byte of transmit data. */ +static void _FMSTR_MCAN_SendTxFrame(FMSTR_SIZE8 len); /* Send the Tx buffer. */ + +/****************************************************************************** + * Local variables + ******************************************************************************/ + +/* Serial base address */ +#ifdef FMSTR_CAN_BASE +static CAN_Type *fmstr_canBaseAddr = FMSTR_CAN_BASE; +#else +static CAN_Type *fmstr_canBaseAddr = NULL; +#endif + +static mcan_frame_filter_config_t rxFilter; /* RX filter config */ +static mcan_std_filter_element_config_t stdFilter; /* RX message filter config */ + +static mcan_rx_buffer_frame_t fmstr_rxmsg; /* Received frame buffer, valid when length>0 */ +static mcan_tx_buffer_frame_t fmstr_txmsg; /* Buffer to prepare transmission */ + +static uint8_t txData[FMSTR_MCAN_CAN_DATASIZE]; + +/****************************************************************************** + * Driver interface + ******************************************************************************/ + +const FMSTR_CAN_DRV_INTF FMSTR_CAN_MCUX_MCAN = { + .Init = _FMSTR_MCAN_Init, + .EnableTxInterrupt = _FMSTR_MCAN_EnableTxInterrupt, + .EnableRxInterrupt = _FMSTR_MCAN_EnableRxInterrupt, + .EnableRx = _FMSTR_MCAN_EnableRx, + .GetRxFrameLen = _FMSTR_MCAN_GetRxFrameLen, + .GetRxFrameByte = _FMSTR_MCAN_GetRxFrameByte, + .AckRxFrame = _FMSTR_MCAN_AckRxFrame, + .PrepareTxFrame = _FMSTR_MCAN_PrepareTxFrame, + .PutTxFrameByte = _FMSTR_MCAN_PutTxFrameByte, + .SendTxFrame = _FMSTR_MCAN_SendTxFrame, +}; + +/****************************************************************************** + * Implementation + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_MCAN_Init(FMSTR_U32 idRx, FMSTR_U32 idTx) +{ + mcan_rx_fifo_config_t rxFifo; + mcan_tx_buffer_config_t txBuffer; + + /* Set Message RAM base address and clear to avoid BEU/BEC error. */ + MCAN_SetMsgRAMBase(fmstr_canBaseAddr, FMSTR_MCAN_SHAREDMEMORY_OFFSET); + uint32_t *p = (uint32_t *)(FMSTR_MCAN_SHAREDMEMORY_OFFSET); + FMSTR_MemSet(p, 0, (8U + FMSTR_MCAN_CAN_DATASIZE) * sizeof(uint8_t)); + + /* STD filter config. */ + rxFilter.address = FMSTR_MCAN_STD_FILTER_OFS; + rxFilter.idFormat = (idRx & FMSTR_CAN_EXTID) ? kMCAN_FrameIDExtend : kMCAN_FrameIDStandard; + rxFilter.listSize = 1U; + rxFilter.nmFrame = kMCAN_reject0; + rxFilter.remFrame = kMCAN_rejectFrame; + MCAN_SetFilterConfig(fmstr_canBaseAddr, &rxFilter); + +#ifdef FMSTR_MCAN_RX_FIFO0 + stdFilter.sfec = kMCAN_storeinFifo0; +#else + stdFilter.sfec = kMCAN_storeinFifo1; +#endif + stdFilter.sft = kMCAN_classic; /* Classic filter mode, only filter matching ID. */ + stdFilter.sfid1 = idRx; /* RX Filter ID */ + stdFilter.sfid2 = 0; /* IT MUST BE NULL FOR USED RX BUFFER! */ + + /* Prepare RX buffer */ + FMSTR_MemSet(&fmstr_rxmsg, 0, sizeof(fmstr_rxmsg)); + + /* Prepare TX buffer */ + FMSTR_MemSet(&fmstr_txmsg, 0, sizeof(fmstr_txmsg)); + fmstr_txmsg.xtd = (idTx & FMSTR_CAN_EXTID) ? kMCAN_FrameIDExtend : kMCAN_FrameIDStandard; + fmstr_txmsg.rtr = kMCAN_FrameTypeData; + fmstr_txmsg.id = idTx << FMSTR_MCAN_STDID_OFFSET; + fmstr_txmsg.data = txData; +#if (defined(USE_CANFD) && USE_CANFD) + fmstr_txmsg.fdf = 1; + fmstr_txmsg.dlc = 13U; +#endif + + /* RX fifo config. */ + FMSTR_MemSet(&rxFifo, 0, sizeof(rxFifo)); + rxFifo.address = FMSTR_MCAN_RXMB_OFFSET; + rxFifo.elementSize = 1U; + rxFifo.watermark = 0; + rxFifo.opmode = kMCAN_FifoBlocking; + rxFifo.datafieldSize = kMCAN_8ByteDatafield; +#if (defined(USE_CANFD) && USE_CANFD) + rxFifo.datafieldSize = kMCAN_32ByteDatafield; +#endif + +#ifdef FMSTR_MCAN_RX_FIFO0 + MCAN_SetRxFifo0Config(fmstr_canBaseAddr, &rxFifo); +#else + MCAN_SetRxFifo1Config(fmstr_canBaseAddr, &rxFifo); +#endif + + /* TX buffer config. */ + FMSTR_MemSet(&txBuffer, 0, sizeof(txBuffer)); + txBuffer.mode = kMCAN_txQueue; + txBuffer.address = FMSTR_MCAN_TXMB_OFFSET; + txBuffer.dedicatedSize = 1U; + txBuffer.fqSize = 0; + txBuffer.datafieldSize = kMCAN_8ByteDatafield; +#if (defined(USE_CANFD) && USE_CANFD) + txBuffer.datafieldSize = kMCAN_32ByteDatafield; +#endif + MCAN_SetTxBufferConfig(fmstr_canBaseAddr, &txBuffer); + + /* Enter normal mode. */ + MCAN_EnterNormalMode(fmstr_canBaseAddr); + + return FMSTR_TRUE; +} + +static void _FMSTR_MCAN_EnableTxInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + MCAN_EnableInterrupts(fmstr_canBaseAddr, 0, CAN_IE_TCE_MASK); + MCAN_EnableTransmitBufferInterrupts(fmstr_canBaseAddr, 0); + } + else + { + MCAN_DisableInterrupts(fmstr_canBaseAddr, CAN_IE_TCE_MASK); + MCAN_DisableTransmitBufferInterrupts(fmstr_canBaseAddr, 0); + } +} + +static void _FMSTR_MCAN_EnableRxInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + MCAN_EnableInterrupts(fmstr_canBaseAddr, 0, CAN_IE_RF0NE_MASK); + } + else + { + MCAN_DisableInterrupts(fmstr_canBaseAddr, CAN_IE_RF0NE_MASK); + } +} + +static void _FMSTR_MCAN_EnableRx(void) +{ + MCAN_SetSTDFilterElement(fmstr_canBaseAddr, &rxFilter, &stdFilter, 0); +} + +static FMSTR_SIZE8 _FMSTR_MCAN_GetRxFrameLen(void) +{ +#if FMSTR_POLL_DRIVEN > 0 + /* Is any data received? */ + if (MCAN_GetStatusFlag(fmstr_canBaseAddr, CAN_IR_RF0N_MASK) == 0U) + { + return 0; + } + + /* Clear RX status flag */ + MCAN_ClearStatusFlag(fmstr_canBaseAddr, CAN_IR_RF0N_MASK); +#endif /* FMSTR_POLL_DRIVEN */ + + /* Current cache still valid? */ + if (fmstr_rxmsg.dlc == 0U) + { + /* Try to read, when successful, the MB is acknowledged and set for next receive */ + if (MCAN_ReadRxFifo(fmstr_canBaseAddr, 0, &fmstr_rxmsg) == kStatus_Fail) + { + return 0; /* no frame available */ + } + } + + /* we have got some frame, return its size */ + return fmstr_rxmsg.dlc; +} + +static FMSTR_BCHR _FMSTR_MCAN_GetRxFrameByte(FMSTR_SIZE8 index) +{ + FMSTR_ASSERT(fmstr_rxmsg.data != NULL); + FMSTR_ASSERT(index < fmstr_rxmsg.dlc); + + return fmstr_rxmsg.data[index]; +} + +static void _FMSTR_MCAN_AckRxFrame(void) +{ + /* The frame is already acknowledged in registers by calling MCAN_ReadRxFifo before. */ + /* We only clear the local cached buffer so it appears as if we have acknowledged it. */ + fmstr_rxmsg.dlc = 0U; +} + +static FMSTR_BOOL _FMSTR_MCAN_PrepareTxFrame(void) +{ + if (MCAN_IsTransmitOccurred(fmstr_canBaseAddr, 0) != 0U) + { + /* Acknowledge frame was transmitted */ + fmstr_txmsg.dlc = 0U; + } + + if (fmstr_txmsg.dlc != 0U) + { + return FMSTR_FALSE; + } + + fmstr_txmsg.size = 0U; + return FMSTR_TRUE; +} + +static void _FMSTR_MCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data) +{ + FMSTR_ASSERT(fmstr_txmsg.data != NULL); + FMSTR_ASSERT(index < FMSTR_MCAN_CAN_DATASIZE); + + fmstr_txmsg.data[index] = data; +} + +static void _FMSTR_MCAN_SendTxFrame(FMSTR_SIZE8 len) +{ + fmstr_txmsg.dlc = len; + fmstr_txmsg.size = len; + + if (MCAN_WriteTxBuffer(fmstr_canBaseAddr, 0, &fmstr_txmsg) == kStatus_Success) + MCAN_TransmitAddRequest(fmstr_canBaseAddr, 0); +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER communication module base address + * + ******************************************************************************/ +void FMSTR_CanSetBaseAddress(CAN_Type *base) +{ + fmstr_canBaseAddr = base; +} + +void FMSTR_CanIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + uint32_t status = MCAN_GetStatusFlag(fmstr_canBaseAddr, CAN_IR_RF0N_MASK | CAN_IR_TC_MASK); + + /* Rx interrupt */ + if ((status & CAN_IR_RF0N_MASK) != 0U) + { + FMSTR_ProcessCanRx(); + } + + /* Tx done interrupt */ + if ((status & CAN_IR_TC_MASK) != 0U) + { + /* Acknowledge frame transmission */ + fmstr_txmsg.dlc = 0U; + /* Send next frame, if needed */ + FMSTR_ProcessCanTx(); + } + + if (status != 0U) + { + MCAN_ClearStatusFlag(fmstr_canBaseAddr, status); + } +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_CanSetBaseAddress(CAN_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_CanIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_MCUX_MCAN_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mcan.h b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mcan.h new file mode 100644 index 0000000..37f9242 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mcan.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - MCAN low-level driver + */ + +#ifndef __FREEMASTER_MCAN_H +#define __FREEMASTER_MCAN_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_flexcan.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +void FMSTR_CanSetBaseAddress(CAN_Type *base); +void FMSTR_CanIsr(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_MCAN_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mscan.c b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mscan.c new file mode 100644 index 0000000..0836b82 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mscan.c @@ -0,0 +1,334 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - msCAN low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_CAN_MCUX_MSCAN_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_MCUX_MSCAN_ID) + +#include "freemaster_mscan.h" + +#if FMSTR_DISABLE == 0 + +#include "freemaster_can.h" +#include "fsl_mscan.h" + +/****************************************************************************** + * Local macros + ******************************************************************************/ + +/****************************************************************************** + * Local functions + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_MsCAN_Init(FMSTR_U32 idRx, FMSTR_U32 idTx); /* Initialize CAN module. */ +static void _FMSTR_MsCAN_EnableTxInterrupt(FMSTR_BOOL enable); /* Enable CAN Transmit interrupt. */ +static void _FMSTR_MsCAN_EnableRxInterrupt(FMSTR_BOOL enable); /* Enable CAN Receive interrupt. */ +static void _FMSTR_MsCAN_EnableRx(void); /* Enable/re-initialize Receiver buffer. */ +static FMSTR_SIZE8 _FMSTR_MsCAN_GetRxFrameLen(void); /* Return size of received CAN frame. */ +static FMSTR_BCHR _FMSTR_MsCAN_GetRxFrameByte(FMSTR_SIZE8 index); /* Get data byte at index (0..8). */ +static void _FMSTR_MsCAN_AckRxFrame(void); /* Discard received frame and enable receiving a next one. */ +static FMSTR_BOOL _FMSTR_MsCAN_PrepareTxFrame(void); /* Initialize transmit buffer. */ +static void _FMSTR_MsCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data); /* Fill one byte of transmit data. */ +static void _FMSTR_MsCAN_SendTxFrame(FMSTR_SIZE8 len); /* Send the Tx buffer. */ + +/****************************************************************************** + * Local variables + ******************************************************************************/ + +/* Serial base address */ +#ifdef FMSTR_CAN_BASE +static MSCAN_Type *fmstr_canBaseAddr = FMSTR_CAN_BASE; +#else +static MSCAN_Type *fmstr_canBaseAddr = NULL; +#endif + +static mscan_frame_t fmstr_rxmsg; /* Received frame buffer, valid when length>0 */ +static mscan_frame_t fmstr_txmsg; /* Buffer to prepare transmission */ +static uint8_t fmstr_txPrio; /* transmit priority to ensure sequential transmission */ + +/****************************************************************************** + * Driver interface + ******************************************************************************/ + +const FMSTR_CAN_DRV_INTF FMSTR_CAN_MCUX_MSCAN = { + .Init = _FMSTR_MsCAN_Init, + .EnableTxInterrupt = _FMSTR_MsCAN_EnableTxInterrupt, + .EnableRxInterrupt = _FMSTR_MsCAN_EnableRxInterrupt, + .EnableRx = _FMSTR_MsCAN_EnableRx, + .GetRxFrameLen = _FMSTR_MsCAN_GetRxFrameLen, + .GetRxFrameByte = _FMSTR_MsCAN_GetRxFrameByte, + .AckRxFrame = _FMSTR_MsCAN_AckRxFrame, + .PrepareTxFrame = _FMSTR_MsCAN_PrepareTxFrame, + .PutTxFrameByte = _FMSTR_MsCAN_PutTxFrameByte, + .SendTxFrame = _FMSTR_MsCAN_SendTxFrame, +}; + +/****************************************************************************** + * Implementation + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_MsCAN_Init(FMSTR_U32 idRx, FMSTR_U32 idTx) +{ + /* initialize Rx MB */ + FMSTR_MemSet(&fmstr_rxmsg, 0, sizeof(fmstr_rxmsg)); + fmstr_rxmsg.ID_Type.ID = MSCAN_RX_MB_STD_MASK(idRx); + fmstr_txmsg.format = (idRx & FMSTR_CAN_EXTID) ? kMSCAN_FrameFormatExtend : kMSCAN_FrameFormatStandard; + fmstr_txmsg.type = kMSCAN_FrameTypeData; + + /* Configure ID acceptance filter setting. */ + uint32_t rxIdentifier = MSCAN_RX_MB_STD_MASK(idRx); + MSCAN_WriteIDAR0(fmstr_canBaseAddr, (uint8_t *)(&rxIdentifier)); + MSCAN_WriteIDAR1(fmstr_canBaseAddr, (uint8_t *)(&rxIdentifier)); + + /* initialize Tx MB */ + FMSTR_MemSet(&fmstr_txmsg, 0, sizeof(fmstr_txmsg)); + fmstr_txmsg.ID_Type.ID = idTx; + fmstr_txmsg.format = (idTx & FMSTR_CAN_EXTID) ? kMSCAN_FrameFormatExtend : kMSCAN_FrameFormatStandard; + fmstr_txmsg.type = kMSCAN_FrameTypeData; + + fmstr_txPrio = 0; + +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* Disable all interrupts */ + MSCAN_DisableRxInterrupts(fmstr_canBaseAddr, 0xFF); + MSCAN_DisableTxInterrupts(fmstr_canBaseAddr, 0xFF); +#endif /* FMSTR_LONG_INTR || FMSTR_SHORT_INTR */ + + return FMSTR_TRUE; +} + +static void _FMSTR_MsCAN_EnableTxInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + MSCAN_EnableTxInterrupts(fmstr_canBaseAddr, kMSCAN_TxEmptyInterruptEnable); + } + else + { + MSCAN_DisableTxInterrupts(fmstr_canBaseAddr, kMSCAN_TxEmptyInterruptEnable); + } +} + +static void _FMSTR_MsCAN_EnableRxInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + MSCAN_EnableRxInterrupts(fmstr_canBaseAddr, kMSCAN_RxFullInterruptEnable); + } + else + { + MSCAN_DisableRxInterrupts(fmstr_canBaseAddr, kMSCAN_RxFullInterruptEnable); + } +} + +static void _FMSTR_MsCAN_EnableRx(void) +{ + uint32_t rxMask = 0x00; + MSCAN_WriteIDMR0(fmstr_canBaseAddr, (uint8_t *)(&rxMask)); + MSCAN_WriteIDMR1(fmstr_canBaseAddr, (uint8_t *)(&rxMask)); +} + +static FMSTR_SIZE8 _FMSTR_MsCAN_GetRxFrameLen(void) +{ +#if FMSTR_POLL_DRIVEN > 0 + /* Is any data received? */ + if (MSCAN_GetRxBufferFullFlag(fmstr_canBaseAddr) == 0U) + { + return 0; + } +#endif /* FMSTR_POLL_DRIVEN */ + + /* Current cache still valid? */ + if (fmstr_rxmsg.DLR == 0U) + { + /* Try to read, when successfull, the MB is acknowledged and set for next receive */ + if (MSCAN_ReadRxMb(fmstr_canBaseAddr, &fmstr_rxmsg) == kStatus_Fail) + { + return 0; /* no frame available */ + } + } + +#if FMSTR_POLL_DRIVEN > 0 + /* Clear RX status flag */ + MSCAN_ClearRxBufferFullFlag(fmstr_canBaseAddr); +#endif /* FMSTR_POLL_DRIVEN */ + + /* we have got some frame, return its length */ + return fmstr_rxmsg.DLR; +} + +static FMSTR_BCHR _FMSTR_MsCAN_GetRxFrameByte(FMSTR_SIZE8 index) +{ + FMSTR_BCHR data; + + /* need switch as data bytes are not necessarily ordered in the frame */ + switch (index) + { + case 0: + data = fmstr_rxmsg.dataByte0; + break; + case 1: + data = fmstr_rxmsg.dataByte1; + break; + case 2: + data = fmstr_rxmsg.dataByte2; + break; + case 3: + data = fmstr_rxmsg.dataByte3; + break; + case 4: + data = fmstr_rxmsg.dataByte4; + break; + case 5: + data = fmstr_rxmsg.dataByte5; + break; + case 6: + data = fmstr_rxmsg.dataByte6; + break; + default: + data = fmstr_rxmsg.dataByte7; + break; + } + + return data; +} + +static void _FMSTR_MsCAN_AckRxFrame(void) +{ + /* The frame is already acknowledged in registers by calling _FMSTR_MsCAN_GetRxFrameLen before. */ + /* We only clear the local cached buffer so it appears as if we have acknowledged it. */ + fmstr_rxmsg.DLR = 0; + + /* Reset the priority counter for the next transmission sequence */ + fmstr_txPrio = 0; +} + +static FMSTR_BOOL _FMSTR_MsCAN_PrepareTxFrame(void) +{ +#if FMSTR_POLL_DRIVEN > 0 + /* Was all data sent? */ + if (fmstr_txmsg.DLR > 0U && MSCAN_GetTxBufferStatusFlags(fmstr_canBaseAddr, kMSCAN_TxEmptyInterruptEnable) == 0U) + { + return FMSTR_FALSE; + } + + /* Acknowledge frame was transmitted */ + fmstr_txmsg.DLR = 0U; +#else + if (fmstr_txmsg.DLR != 0U) + { + return FMSTR_FALSE; + } +#endif /* FMSTR_POLL_DRIVEN */ + + return FMSTR_TRUE; +} + +static void _FMSTR_MsCAN_PutTxFrameByte(FMSTR_SIZE8 index, FMSTR_BCHR data) +{ + /* need switch as data bytes are not necessarily ordered in the frame */ + switch (index) + { + case 0: + fmstr_txmsg.dataByte0 = data; + break; + case 1: + fmstr_txmsg.dataByte1 = data; + break; + case 2: + fmstr_txmsg.dataByte2 = data; + break; + case 3: + fmstr_txmsg.dataByte3 = data; + break; + case 4: + fmstr_txmsg.dataByte4 = data; + break; + case 5: + fmstr_txmsg.dataByte5 = data; + break; + case 6: + fmstr_txmsg.dataByte6 = data; + break; + default: + fmstr_txmsg.dataByte7 = data; + break; + } +} + +static void _FMSTR_MsCAN_SendTxFrame(FMSTR_SIZE8 len) +{ + fmstr_txmsg.DLR = len; + + /* Set priority for TX buffer */ + fmstr_txmsg.BPR = fmstr_txPrio++; + /* Write data */ + MSCAN_WriteTxMb(fmstr_canBaseAddr, &fmstr_txmsg); +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER communication module base address + * + ******************************************************************************/ +void FMSTR_CanSetBaseAddress(MSCAN_Type *base) +{ + fmstr_canBaseAddr = base; +} + +void FMSTR_CanIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* Rx interrupt */ + if (MSCAN_GetRxBufferFullFlag(fmstr_canBaseAddr) != 0U) + { + FMSTR_ProcessCanRx(); + /* Clear RX status flag */ + MSCAN_ClearRxBufferFullFlag(fmstr_canBaseAddr); + } + /* Tx done interrupt */ + if (MSCAN_GetTxBufferStatusFlags(fmstr_canBaseAddr, kMSCAN_TxEmptyInterruptEnable) != 0U) + { + /* Acknowledge frame transmission */ + fmstr_txmsg.DLR = 0; + /* Send next frame, if needed */ + FMSTR_ProcessCanTx(); + } +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_CanSetBaseAddress(MSCAN_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_CanIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_CAN_DRV) == FMSTR_CAN_MCUX_MSCAN_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mscan.h b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mscan.h new file mode 100644 index 0000000..b610eaa --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/can/freemaster_mscan.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - msCAN low-level driver + */ + +#ifndef __FREEMASTER_MSCAN_H +#define __FREEMASTER_MSCAN_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_flexcan.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +void FMSTR_CanSetBaseAddress(MSCAN_Type *base); +void FMSTR_CanIsr(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_MSCAN_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_tcp.c b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_tcp.c new file mode 100644 index 0000000..a80d222 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_tcp.c @@ -0,0 +1,552 @@ +/* + * Copyright 2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Network LWIP TCP driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_NET_LWIP_TCP_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_NET_DRV) == FMSTR_NET_LWIP_TCP_ID) + +#include "freemaster_net_lwip_tcp.h" + +#if FMSTR_DISABLE == 0 + +#include "freemaster_protocol.h" +#include "freemaster_net.h" +#include "lwip/api.h" +#include "lwip/sys.h" +#include "lwip/def.h" +#include "lwip/sockets.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ +#if (defined(FMSTR_SHORT_INTR) && FMSTR_SHORT_INTR) || (defined(FMSTR_LONG_INTR) && FMSTR_LONG_INTR) +#error The FreeMASTER network TCP lwip driver does not support interrupt mode. +#endif + +/* santiy check of lwip options */ +#if FMSTR_SESSION_COUNT > (MEMP_NUM_NETCONN - 1) +#error The MEMP_NUM_NETCONN (lwipopts.h) must be (FMSTR_SESSION_COUNT+1) or higher! +#endif + +#if FMSTR_SESSION_COUNT > (MEMP_NUM_TCP_PCB_LISTEN - 1) +#error The MEMP_NUM_TCP_PCB_LISTEN (lwipopts.h) must be (FMSTR_SESSION_COUNT+1) or higher! +#endif + +#if FMSTR_SESSION_COUNT > (MEMP_NUM_TCP_PCB - 1) +#error The MEMP_NUM_TCP_PCB (lwipopts.h) must be (FMSTR_SESSION_COUNT+1) or higher! +#endif + +#if FMSTR_NET_AUTODISCOVERY != 0 +#define FMSTR_TCP_SESSION_COUNT FMSTR_SESSION_COUNT + 1 +#else +#define FMSTR_TCP_SESSION_COUNT FMSTR_SESSION_COUNT +#endif +/****************************************************************************** + * Local types + ******************************************************************************/ + +typedef struct FMSTR_TCP_SESSION_S +{ + int sock; + FMSTR_BOOL receivePending; + FMSTR_NET_ADDR address; +} FMSTR_TCP_SESSION; + +/****************************************************************************** + * Local functions + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_NetLwipTcpInit(void); +static void _FMSTR_NetLwipTcpPoll(void); +static FMSTR_S32 _FMSTR_NetLwipTcpRecv(FMSTR_BPTR msgBuff, + FMSTR_SIZE msgMaxSize, + FMSTR_NET_ADDR *recvAddr, + FMSTR_BOOL *isBroadcast); +static FMSTR_S32 _FMSTR_NetLwipTcpSend(FMSTR_NET_ADDR *sendAddr, FMSTR_BPTR msgBuff, FMSTR_SIZE msgSize); +static void _FMSTR_NetLwipTcpClose(FMSTR_NET_ADDR *addr); +static void _FMSTR_NetLwipTcpGetCaps(FMSTR_NET_IF_CAPS *caps); +static void _FMSTR_NetAddrToFmstr(struct sockaddr *remoteAddr, FMSTR_NET_ADDR *fmstrAddr); + +/****************************************************************************** + * Local variables + ******************************************************************************/ + +/* TCP sessions */ +static FMSTR_TCP_SESSION fmstrTcpSessions[FMSTR_TCP_SESSION_COUNT]; +/* TCP listen socket */ +static int fmstrTcpListenSock = 0; + +#if FMSTR_NET_AUTODISCOVERY != 0 +/* UDP Broadcast socket */ +static int fmstrUdpBroadcastSock = 0; +#endif /* FMSTR_NET_AUTODISCOVERY */ + +/****************************************************************************** + * Driver interface + ******************************************************************************/ +/* Interface of this network TCP driver */ +const FMSTR_NET_DRV_INTF FMSTR_NET_LWIP_TCP = { + .Init = _FMSTR_NetLwipTcpInit, + .Poll = _FMSTR_NetLwipTcpPoll, + .Recv = _FMSTR_NetLwipTcpRecv, + .Send = _FMSTR_NetLwipTcpSend, + .Close = _FMSTR_NetLwipTcpClose, + .GetCaps = _FMSTR_NetLwipTcpGetCaps, +}; + +/****************************************************************************** + * Implementation + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_NetLwipTcpInit(void) +{ + struct sockaddr_in destAddr4; +#if FMSTR_NET_AUTODISCOVERY != 0 + struct sockaddr_in bindAddr; +#endif + FMSTR_INDEX i; + int err; + + FMSTR_MemSet(&fmstrTcpSessions, 0, sizeof(fmstrTcpSessions)); + FMSTR_MemSet(&destAddr4, 0, sizeof(destAddr4)); + destAddr4.sin_family = AF_INET; // TODO: prepare address for IPv4 or IPv6 ? + + /* Prepare sockets */ + for (i = 0; i < FMSTR_TCP_SESSION_COUNT; i++) + { + fmstrTcpSessions[i].sock = -1; + } + + /* TCP listen port */ + destAddr4.sin_port = htons(FMSTR_NET_PORT); + + /* Create new listen socket */ + fmstrTcpListenSock = lwip_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); // TODO: IPv6? + if (fmstrTcpListenSock < 0) + { + return FMSTR_FALSE; + } + +#if FMSTR_NET_BLOCKING_TIMEOUT == 0 + { + /* Set non-blocking socket */ + int flags = fcntl(fmstrTcpListenSock, F_GETFL, 0); + err = fcntl(fmstrTcpListenSock, F_SETFL, flags | O_NONBLOCK); + if (err < 0) + { + return FMSTR_FALSE; + } + } +#endif + + /* Socket bind */ + err = lwip_bind(fmstrTcpListenSock, (struct sockaddr *)&destAddr4, sizeof(destAddr4)); + if (err < 0) + { + return FMSTR_FALSE; + } + + /* Listen */ + err = lwip_listen(fmstrTcpListenSock, 0); + if (err < 0) + { + return FMSTR_FALSE; + } + +#if FMSTR_NET_AUTODISCOVERY != 0 + + bindAddr.sin_family = AF_INET; + bindAddr.sin_len = (u8_t)sizeof(bindAddr); + bindAddr.sin_addr.s_addr = htonl(INADDR_ANY); + bindAddr.sin_port = htons(FMSTR_NET_PORT); + + /* Create new UDP listen socket */ + fmstrUdpBroadcastSock = lwip_socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + if (fmstrUdpBroadcastSock < 0) + { + return FMSTR_FALSE; + } + + /* Socket bind */ + err = lwip_bind(fmstrUdpBroadcastSock, (struct sockaddr *)&bindAddr, sizeof(bindAddr)); + if (err < 0) + { + return FMSTR_FALSE; + } + +#if FMSTR_NET_BLOCKING_TIMEOUT == 0 + { + /* Set non-blocking socket */ + int flags = fcntl(fmstrUdpBroadcastSock, F_GETFL, 0); + err = fcntl(fmstrUdpBroadcastSock, F_SETFL, flags | O_NONBLOCK); + if (err < 0) + { + return FMSTR_FALSE; + } + } +#endif + + fmstrTcpSessions[0].sock = fmstrUdpBroadcastSock; + +#endif /* FMSTR_NET_AUTODISCOVERY */ + + return FMSTR_TRUE; +} + +static FMSTR_TCP_SESSION *_FMSTR_NetLwipTcpSessionPending(void) +{ + FMSTR_INDEX i; + + for (i = 0; i < FMSTR_TCP_SESSION_COUNT; i++) + { + /* Find pending session */ + if (fmstrTcpSessions[i].sock >= 0 && fmstrTcpSessions[i].receivePending != FMSTR_FALSE) + { + return &fmstrTcpSessions[i]; + } + } + + return NULL; +} + +static FMSTR_TCP_SESSION *_FMSTR_NetLwipTcpSessionFind(FMSTR_NET_ADDR *sendAddr) +{ + FMSTR_INDEX i; + + for (i = 0; i < FMSTR_TCP_SESSION_COUNT; i++) + { + /* Find free session */ + if (sendAddr == NULL) + { + if (fmstrTcpSessions[i].sock < 0) + { + return &fmstrTcpSessions[i]; + } + } + /* Find session by address */ + else + { + if (FMSTR_MemCmp(&fmstrTcpSessions[i].address, sendAddr, sizeof(FMSTR_NET_ADDR)) == 0) + { + return &fmstrTcpSessions[i]; + } + } + } + + return NULL; +} + +static void _FMSTR_NetLwipTcpAccept(void) +{ + struct sockaddr remote_addr; + socklen_t length; + int newSock = 0; + + FMSTR_MemSet(&remote_addr, 0, sizeof(remote_addr)); + length = sizeof(remote_addr); + + /* Accept socket */ + newSock = lwip_accept(fmstrTcpListenSock, &remote_addr, &length); + if (newSock >= 0) + { + FMSTR_TCP_SESSION *newSes; + +#if FMSTR_NET_BLOCKING_TIMEOUT == 0 + /* Set non-blocking socket */ + int flags = fcntl(newSock, F_GETFL, 0); + fcntl(newSock, F_SETFL, flags | O_NONBLOCK); +#endif + + newSes = _FMSTR_NetLwipTcpSessionFind(NULL); + if (newSes != NULL) + { + newSes->sock = newSock; + _FMSTR_NetAddrToFmstr(&remote_addr, &newSes->address); + } + } +} + +static void _FMSTR_NetLwipTcpPoll(void) +{ + FMSTR_TCP_SESSION *freeSes; + FMSTR_INDEX i; + + /* Any session is still pending to read */ + if (_FMSTR_NetLwipTcpSessionPending() != NULL) + { + return; + } + + /* Find if free session available */ + freeSes = _FMSTR_NetLwipTcpSessionFind(NULL); + +#if FMSTR_NET_BLOCKING_TIMEOUT == 0 + if (freeSes != NULL) + { + _FMSTR_NetLwipTcpAccept(); + } + + /* Set all active sessions to read pending */ + for (i = 0; i < FMSTR_TCP_SESSION_COUNT; i++) + { + if (fmstrTcpSessions[i].sock >= 0) + { + fmstrTcpSessions[i].receivePending = FMSTR_TRUE; + } + } +#else + { + int maxFd = 0; + fd_set readset; + struct timeval tv; + + FD_ZERO(&readset); + if (freeSes != NULL) + { + /* Listen socket */ + FD_SET(fmstrTcpListenSock, &readset); + maxFd = fmstrTcpListenSock; + } + + /* set timeout */ + tv.tv_sec = FMSTR_NET_BLOCKING_TIMEOUT / 1000; + tv.tv_usec = (FMSTR_NET_BLOCKING_TIMEOUT % 1000) * 1000; + + /* Prepare active sockets for read */ + for (i = 0; i < FMSTR_TCP_SESSION_COUNT; i++) + { + if (fmstrTcpSessions[i].sock >= 0) + { + FD_SET(fmstrTcpSessions[i].sock, &readset); + + if (maxFd < fmstrTcpSessions[i].sock) + { + maxFd = fmstrTcpSessions[i].sock; + } + } + } + + if (lwip_select(maxFd + 1, (fd_set *)&readset, NULL, NULL, &tv) >= 1) + { + /* Pending accept */ + if (FD_ISSET(fmstrTcpListenSock, &readset)) + { + _FMSTR_NetLwipTcpAccept(); + } + + /* Pending receive */ + for (i = 0; i < FMSTR_TCP_SESSION_COUNT; i++) + { + if (fmstrTcpSessions[i].sock >= 0 && FD_ISSET(fmstrTcpSessions[i].sock, &readset)) + { + fmstrTcpSessions[i].receivePending = FMSTR_TRUE; + } + } + } + } +#endif +} + +static FMSTR_S32 _FMSTR_NetLwipTcpRecv(FMSTR_BPTR msgBuff, + FMSTR_SIZE msgMaxSize, + FMSTR_NET_ADDR *recvAddr, + FMSTR_BOOL *isBroadcast) +{ + int res = 0; + FMSTR_TCP_SESSION *ses = NULL; + + FMSTR_ASSERT(msgBuff != NULL); + FMSTR_ASSERT(recvAddr != NULL); + FMSTR_ASSERT(isBroadcast != NULL); + + *isBroadcast = FMSTR_FALSE; + + if (fmstrTcpListenSock < 0) + { + return 0; + } + + /* Any receive pending? */ + ses = _FMSTR_NetLwipTcpSessionPending(); + if (ses == NULL) + { + return 0; + } + +#if FMSTR_NET_AUTODISCOVERY != 0 + /* Receive UDP broadcast */ + if (ses->sock == fmstrUdpBroadcastSock) + { + struct sockaddr remote_addr; + socklen_t length = sizeof(remote_addr); + + *isBroadcast = FMSTR_TRUE; + + res = lwip_recvfrom(ses->sock, msgBuff, msgMaxSize, 0, &remote_addr, &length); + + /* Copy address */ + _FMSTR_NetAddrToFmstr(&remote_addr, &ses->address); + /* Copy address */ + FMSTR_MemCpy(recvAddr, &ses->address, sizeof(FMSTR_NET_ADDR)); + } + else +#endif /* FMSTR_NET_AUTODISCOVERY */ + { + res = lwip_recv(ses->sock, msgBuff, msgMaxSize, 0); + + /* Copy address */ + FMSTR_MemCpy(recvAddr, &ses->address, sizeof(FMSTR_NET_ADDR)); + } +#if FMSTR_NET_BLOCKING_TIMEOUT != 0 + if (res == 0) + { + res = -1; + } +#else + if (res < 0 && errno == EWOULDBLOCK) + { + res = 0; + } + if (res == 0) + { + ses->receivePending = FMSTR_FALSE; + } +#endif + if (res < 0 && errno == EWOULDBLOCK) + { + res = 0; + } + if (res == 0) + { + ses->receivePending = FMSTR_FALSE; + } + + return res; +} + +static FMSTR_S32 _FMSTR_NetLwipTcpSend(FMSTR_NET_ADDR *sendAddr, FMSTR_BPTR msgBuff, FMSTR_SIZE msgSize) +{ + FMSTR_TCP_SESSION *ses = NULL; + int res = 0; + + FMSTR_ASSERT(msgBuff != NULL); + FMSTR_ASSERT(sendAddr != NULL); + + // TODO: what should do, when async discovery want to send (not found session) + + /* Find session by address */ + ses = _FMSTR_NetLwipTcpSessionFind(sendAddr); + if (ses == NULL) + { + /* Same as socket error */ + return -1; + } + + /* This session is not pending now */ + ses->receivePending = FMSTR_FALSE; + +#if FMSTR_NET_AUTODISCOVERY != 0 + /* Receive UDP broadcast */ + if (ses->sock == fmstrUdpBroadcastSock) + { + struct sockaddr_in destAddr4; + FMSTR_MemSet(&destAddr4, 0, sizeof(destAddr4)); + destAddr4.sin_len = (u8_t)sizeof(destAddr4); + destAddr4.sin_family = AF_INET; + destAddr4.sin_port = htons(sendAddr->port); + FMSTR_MemCpy(&destAddr4.sin_addr.s_addr, sendAddr->addr.v4, 4); + + /* Send data */ + res = lwip_sendto(ses->sock, msgBuff, msgSize, 0, (struct sockaddr *)&destAddr4, sizeof(destAddr4)); + } + else +#endif + { + /* Send data */ + res = lwip_send(ses->sock, msgBuff, msgSize, 0); + } + + return res; +} + +static void _FMSTR_NetLwipTcpClose(FMSTR_NET_ADDR *addr) +{ + FMSTR_TCP_SESSION *ses = NULL; + + /* Find session by address */ + ses = _FMSTR_NetLwipTcpSessionFind(addr); + if (ses == NULL) + { + /* Session not found */ + return; + } + +#if FMSTR_NET_AUTODISCOVERY != 0 + if (ses->sock == fmstrUdpBroadcastSock) + { + /* Broadcast session cannot be closed */ + return; + } +#endif + + /* Close socket */ + (void)lwip_close(ses->sock); + + FMSTR_MemSet(ses, 0, sizeof(FMSTR_TCP_SESSION)); + ses->sock = -1; +} + +static void _FMSTR_NetLwipTcpGetCaps(FMSTR_NET_IF_CAPS *caps) +{ + FMSTR_ASSERT(caps != NULL); + + caps->flags |= FMSTR_NET_IF_CAPS_FLAG_TCP; +} + +static void _FMSTR_NetAddrToFmstr(struct sockaddr *remoteAddr, FMSTR_NET_ADDR *fmstrAddr) +{ + FMSTR_ASSERT(remoteAddr != NULL); + FMSTR_ASSERT(fmstrAddr != NULL); + + if ((((struct sockaddr *)remoteAddr)->sa_family & AF_INET) != 0U) + { + struct sockaddr_in *in = (struct sockaddr_in *)remoteAddr; + fmstrAddr->type = FMSTR_NET_ADDR_TYPE_V4; + FMSTR_MemCpy(fmstrAddr->addr.v4, &in->sin_addr.s_addr, sizeof(fmstrAddr->addr.v4)); + fmstrAddr->port = htons(in->sin_port); + } +#if LWIP_IPV6 + else if ((((struct sockaddr *)remoteAddr)->sa_family & AF_INET6) != 0U) + { + struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)remoteAddr; + + fmstrAddr->type = FMSTR_NET_ADDR_TYPE_V6; + FMSTR_MemCpy(fmstrAddr->addr.v6, &(in6->sin6_addr.s6_addr), sizeof(fmstrAddr->addr.v6)); + fmstrAddr->port = htons(in6->sin6_port); + } +#endif +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_NET_DRV) == FMSTR_NET_MCUX_LWIP_TCP_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_tcp.h b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_tcp.h new file mode 100644 index 0000000..be88cb9 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_tcp.h @@ -0,0 +1,51 @@ +/* + * Copyright 2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Network LWIP TCP driver + */ + +#ifndef __FREEMASTER_NET_LWIP_TCP_H +#define __FREEMASTER_NET_LWIP_TCP_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_net_lwip_tcp.h +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_NET_LWIP_TCP_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_udp.c b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_udp.c new file mode 100644 index 0000000..97aa28b --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_udp.c @@ -0,0 +1,259 @@ +/* + * Copyright 2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Network LWIP UDP driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_NET_LWIP_UDP_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_NET_DRV) == FMSTR_NET_LWIP_UDP_ID) + +#include "freemaster_net_lwip_udp.h" + +#if FMSTR_DISABLE == 0 + +#include "freemaster_protocol.h" +#include "freemaster_net.h" + +#include "lwip/api.h" +#include "lwip/sys.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ +#if (defined(FMSTR_SHORT_INTR) && FMSTR_SHORT_INTR) || (defined(FMSTR_LONG_INTR) && FMSTR_LONG_INTR) +#error The FreeMASTER network UDP lwip driver does not support interrupt mode. +#endif + +/* santiy check of lwip options */ +#if FMSTR_NET_AUTODISCOVERY != 0 && LWIP_NETBUF_RECVINFO == 0 +#error The LWIP_NETBUF_RECVINFO (lwipopts.h) must be set to 1 when UDP transport used and FMSTR_NET_AUTODISCOVERY is enabled! +#endif + +/****************************************************************************** + * Local functions + ******************************************************************************/ +static FMSTR_BOOL _FMSTR_NetLwipUdpInit(void); +static void _FMSTR_NetLwipUdpPoll(void); +static FMSTR_S32 _FMSTR_NetLwipUdpRecv(FMSTR_BPTR msgBuff, + FMSTR_SIZE msgMaxSize, + FMSTR_NET_ADDR *recvAddr, + FMSTR_BOOL *isBroadcast); +static FMSTR_S32 _FMSTR_NetLwipUdpSend(FMSTR_NET_ADDR *sendAddr, FMSTR_BPTR msgBuff, FMSTR_SIZE msgSize); +static void _FMSTR_NetLwipUdpClose(FMSTR_NET_ADDR *addr); +static void _FMSTR_NetLwipUdpGetCaps(FMSTR_NET_IF_CAPS *caps); + +static void _FMSTR_NetAddrToFmstr(FMSTR_NET_ADDR *fmstrAddr, struct netbuf *buf); +static void _FMSTR_NetAddrFromFmstr(struct netbuf *buf, FMSTR_NET_ADDR *fmstrAddr); + +/****************************************************************************** + * Local variables + ******************************************************************************/ + +static struct netconn *fmstrUdpConn = NULL; + +/****************************************************************************** + * Driver interface + ******************************************************************************/ +/* Interface of this network UDP driver */ +const FMSTR_NET_DRV_INTF FMSTR_NET_LWIP_UDP = { + .Init = _FMSTR_NetLwipUdpInit, + .Poll = _FMSTR_NetLwipUdpPoll, + .Recv = _FMSTR_NetLwipUdpRecv, + .Send = _FMSTR_NetLwipUdpSend, + .Close = _FMSTR_NetLwipUdpClose, + .GetCaps = _FMSTR_NetLwipUdpGetCaps, +}; + +/****************************************************************************** + * Implementation + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_NetLwipUdpInit(void) +{ + err_t err; + + /* Create new netconn connection */ + fmstrUdpConn = netconn_new(NETCONN_UDP); + if (fmstrUdpConn == NULL) + { + return FMSTR_FALSE; + } + + /* Bind address and port */ + err = netconn_bind(fmstrUdpConn, IP_ADDR_ANY, FMSTR_NET_PORT); + if (err != ERR_OK) + { + (void)netconn_delete(fmstrUdpConn); + fmstrUdpConn = NULL; + return FMSTR_FALSE; + } + +#if FMSTR_NET_BLOCKING_TIMEOUT == 0 + netconn_set_nonblocking(fmstrUdpConn, true); +#else + netconn_set_nonblocking(fmstrUdpConn, false); + netconn_set_recvtimeout(fmstrUdpConn, FMSTR_NET_BLOCKING_TIMEOUT); +#endif + + return FMSTR_TRUE; +} + +static void _FMSTR_NetLwipUdpPoll(void) +{ +} + +static FMSTR_S32 _FMSTR_NetLwipUdpRecv(FMSTR_BPTR msgBuff, + FMSTR_SIZE msgMaxSize, + FMSTR_NET_ADDR *recvAddr, + FMSTR_BOOL *isBroadcast) +{ + err_t err; + int recvSize = 0; + struct netbuf *buf; + + FMSTR_ASSERT(msgBuff != NULL); + FMSTR_ASSERT(recvAddr != NULL); + FMSTR_ASSERT(isBroadcast != NULL); + + *isBroadcast = FMSTR_FALSE; + + if (fmstrUdpConn == NULL) + { + return -1; + } + + /* Receive data */ + err = netconn_recv(fmstrUdpConn, &buf); + if (err < 0 && err == ERR_WOULDBLOCK) + { + return 0; + } + if (err < 0) + { + return -1; + } + + /* Copy received data */ + recvSize = netbuf_copy(buf, msgBuff, msgMaxSize); + + /* Copy address of receiver */ + _FMSTR_NetAddrToFmstr(recvAddr, buf); + + netbuf_delete(buf); + + return recvSize; +} + +static FMSTR_S32 _FMSTR_NetLwipUdpSend(FMSTR_NET_ADDR *sendAddr, FMSTR_BPTR msgBuff, FMSTR_SIZE msgSize) +{ + FMSTR_S32 sentSize = 0; + struct netbuf *buf; + err_t err; + + FMSTR_ASSERT(msgBuff != NULL); + FMSTR_ASSERT(sendAddr != NULL); + + buf = netbuf_new(); + + if (fmstrUdpConn == NULL) + { + sentSize = -1; + goto ERROR; + } + + /* reference the message into the netbuf */ + err = netbuf_ref(buf, msgBuff, msgSize); + if (err != ERR_OK) + { + sentSize = -1; + goto ERROR; + } + + /* Copy destination address */ + _FMSTR_NetAddrFromFmstr(buf, sendAddr); + + /* Send data */ + err = netconn_send(fmstrUdpConn, buf); + if (err != ERR_OK) + { + sentSize = -1; + goto ERROR; + } + + sentSize = (FMSTR_S32)buf->p->tot_len; + +ERROR: + netbuf_delete(buf); + + return sentSize; +} + +static void _FMSTR_NetLwipUdpClose(FMSTR_NET_ADDR *addr) +{ +} + +static void _FMSTR_NetLwipUdpGetCaps(FMSTR_NET_IF_CAPS *caps) +{ + FMSTR_ASSERT(caps != NULL); + + caps->flags |= FMSTR_NET_IF_CAPS_FLAG_UDP; +} + +static void _FMSTR_NetAddrToFmstr(FMSTR_NET_ADDR *fmstrAddr, struct netbuf *buf) +{ + FMSTR_ASSERT(buf != NULL); + FMSTR_ASSERT(fmstrAddr != NULL); + + /* IP address type */ + fmstrAddr->type = FMSTR_NET_ADDR_TYPE_V4; + + /* Port */ + fmstrAddr->port = buf->port; + + /* IP address */ + if (fmstrAddr->type == FMSTR_NET_ADDR_TYPE_V4) + { + FMSTR_MemCpy(fmstrAddr->addr.v4, &buf->addr, 4); + } + + // TODO: add support for IPv6 address +} + +static void _FMSTR_NetAddrFromFmstr(struct netbuf *buf, FMSTR_NET_ADDR *fmstrAddr) +{ + FMSTR_ASSERT(fmstrAddr != NULL); + FMSTR_ASSERT(buf != NULL); + + /* Port */ + buf->port = fmstrAddr->port; + + if (fmstrAddr->type == FMSTR_NET_ADDR_TYPE_V4) + { + /* IP address */ + FMSTR_MemCpy(&buf->addr, fmstrAddr->addr.v4, 4); + } + + // TODO: add support for IPv6 address +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_NET_DRV) == FMSTR_NET_MCUX_LWIP_UPD_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_udp.h b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_udp.h new file mode 100644 index 0000000..0dfac6d --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_lwip_udp.h @@ -0,0 +1,51 @@ +/* + * Copyright 2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Network LWIP UDP driver + */ + +#ifndef __FREEMASTER_NET_LWIP_UDP_H +#define __FREEMASTER_NET_LWIP_UDP_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_net_lwip_udp.h +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_NET_LWIP_UDP_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_segger_rtt.c b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_segger_rtt.c new file mode 100644 index 0000000..5780a6c --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_segger_rtt.c @@ -0,0 +1,156 @@ +/* + * Copyright 2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - RTT (virtual network) driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_NET_SEGGER_RTT_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_NET_DRV) == FMSTR_NET_SEGGER_RTT_ID) + +#include "freemaster_net_segger_rtt.h" + +#if FMSTR_DISABLE == 0 + +#include "freemaster_protocol.h" +#include "freemaster_net.h" +#include "SEGGER_RTT.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ +#if (defined(FMSTR_SHORT_INTR) && FMSTR_SHORT_INTR) || (defined(FMSTR_LONG_INTR) && FMSTR_LONG_INTR) +#error The FreeMASTER RTT driver does not support interrupt mode. +#endif + +#if FMSTR_NET_AUTODISCOVERY != 0 +#warning The FreeMASTER RTT driver does not support auto discovery. +#endif + +#if FMSTR_SESSION_COUNT != 1 +/* SEGGER RTT transport only supports a single session */ +#warning Please set FMSTR_SESSION_COUNT to 1. +#endif + +#ifndef FMSTR_NET_SEGGER_RTT_BUFFER_INDEX +#define FMSTR_NET_SEGGER_RTT_BUFFER_INDEX 0 +#endif + +/****************************************************************************** + * Local types + ******************************************************************************/ + +/****************************************************************************** + * Local functions + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_RttInit(void); +static void _FMSTR_RttPoll(void); +static FMSTR_S32 _FMSTR_RttRecv(FMSTR_BPTR msgBuff, + FMSTR_SIZE msgMaxSize, + FMSTR_NET_ADDR *recvAddr, + FMSTR_BOOL *isBroadcast); +static FMSTR_S32 _FMSTR_RttSend(FMSTR_NET_ADDR *sendAddr, FMSTR_BPTR msgBuff, FMSTR_SIZE msgSize); +static void _FMSTR_RttClose(FMSTR_NET_ADDR *addr); +static void _FMSTR_RttGetCaps(FMSTR_NET_IF_CAPS *caps); + +/****************************************************************************** + * Local variables + ******************************************************************************/ + +static const FMSTR_NET_ADDR fmstr_rttDummyAddress = { + .type = FMSTR_NET_ADDR_TYPE_V4, .port = 0, .addr.v4 = {0, 0, 0, 0}}; + +/****************************************************************************** + * Driver interface + ******************************************************************************/ +/* Interface of this network TCP driver */ +const FMSTR_NET_DRV_INTF FMSTR_NET_SEGGER_RTT = { + .Init = _FMSTR_RttInit, + .Poll = _FMSTR_RttPoll, + .Recv = _FMSTR_RttRecv, + .Send = _FMSTR_RttSend, + .Close = _FMSTR_RttClose, + .GetCaps = _FMSTR_RttGetCaps, +}; + +#if FMSTR_NET_SEGGER_RTT_BUFFER_INDEX > 0 +#define FMSTR_RTT_BUFF_SIZE (FMSTR_COMM_BUFFER_SIZE + 7) +static FMSTR_U8 fmstr_rttBuffer[FMSTR_RTT_BUFF_SIZE]; +#endif +/****************************************************************************** + * Implementation + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_RttInit(void) +{ + SEGGER_RTT_Init(); + SEGGER_RTT_SetTerminal(FMSTR_NET_SEGGER_RTT_BUFFER_INDEX); + +#if FMSTR_NET_SEGGER_RTT_BUFFER_INDEX > 0 + SEGGER_RTT_ConfigUpBuffer(FMSTR_NET_SEGGER_RTT_BUFFER_INDEX, NULL, fmstr_rttBuffer, FMSTR_RTT_BUFF_SIZE, + SEGGER_RTT_MODE_NO_BLOCK_SKIP); + SEGGER_RTT_ConfigDownBuffer(FMSTR_NET_SEGGER_RTT_BUFFER_INDEX, NULL, fmstr_rttBuffer, FMSTR_RTT_BUFF_SIZE, 0); +#else + SEGGER_RTT_ConfigUpBuffer(FMSTR_NET_SEGGER_RTT_BUFFER_INDEX, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP); + SEGGER_RTT_ConfigDownBuffer(FMSTR_NET_SEGGER_RTT_BUFFER_INDEX, NULL, NULL, 0, 0); +#endif + return FMSTR_TRUE; +} + +static void _FMSTR_RttPoll(void) +{ +} + +static FMSTR_S32 _FMSTR_RttRecv(FMSTR_BPTR msgBuff, + FMSTR_SIZE msgMaxSize, + FMSTR_NET_ADDR *recvAddr, + FMSTR_BOOL *isBroadcast) +{ + FMSTR_ASSERT(msgBuff != NULL); + FMSTR_ASSERT(recvAddr != NULL); + + FMSTR_MemCpy(recvAddr, &fmstr_rttDummyAddress, sizeof(FMSTR_NET_ADDR)); + + return SEGGER_RTT_Read(FMSTR_NET_SEGGER_RTT_BUFFER_INDEX, msgBuff, msgMaxSize); +} + +static FMSTR_S32 _FMSTR_RttSend(FMSTR_NET_ADDR *sendAddr, FMSTR_BPTR msgBuff, FMSTR_SIZE msgSize) +{ + FMSTR_ASSERT(msgBuff != NULL); + FMSTR_ASSERT(sendAddr != NULL); + + return SEGGER_RTT_Write(FMSTR_NET_SEGGER_RTT_BUFFER_INDEX, msgBuff, msgSize); +} + +static void _FMSTR_RttClose(FMSTR_NET_ADDR *addr) +{ +} + +static void _FMSTR_RttGetCaps(FMSTR_NET_IF_CAPS *caps) +{ + FMSTR_ASSERT(caps != NULL); + + caps->flags |= FMSTR_NET_IF_CAPS_FLAG_RTT; +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_NET_DRV) == FMSTR_NET_RTT_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_segger_rtt.h b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_segger_rtt.h new file mode 100644 index 0000000..ca3c37f --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/network/freemaster_net_segger_rtt.h @@ -0,0 +1,51 @@ +/* + * Copyright 2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - RTT (virtual network) driver + */ + +#ifndef __FREEMASTER_NET_RTT_H +#define __FREEMASTER_NET_RTT_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_net_lwip_tcp.h +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_NET_RTT_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_56f800e_eonce.c b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_56f800e_eonce.c new file mode 100644 index 0000000..b9e9e6f --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_56f800e_eonce.c @@ -0,0 +1,616 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2020-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - DSC JTAG EOnCE RTD Unit Communication Interface + */ +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_56F800E_EONCE_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_56F800E_EONCE_ID) +#include "freemaster_serial.h" +#include "freemaster_56f800e_eonce.h" + +#if FMSTR_DISABLE == 0 + +/*********************************** + * configuration check + ***********************************/ + +#if FMSTR_USE_EONCE_TDF_WORKAROUND > 0 && FMSTR_POLL_DRIVEN == 0 +#error FreeMASTER EOnCE communication with active TDF big workaround only works in polled mode. +#endif + +/*********************************** + * local variables + ***********************************/ + +/* EOnCE bas address is the same for all DSC platforms */ +#define FMSTR_EONCE_BASE 0xFFFF00U + +/* EOnCE base address kept as U32 word, but still it needs the LDM to work. */ +#if defined(FMSTR_SERIAL_BASE) && ((FMSTR_SERIAL_BASE) != FMSTR_EONCE_BASE) +#warning FMSTR_SERIAL_BASE should not be specified when using JTAG EOnCE RTD Unit (undefine to use default 0xFFFF00) +static FMSTR_U32 fmstr_eonceBaseAddr = (FMSTR_U32)FMSTR_SERIAL_BASE; +#else +static FMSTR_U32 fmstr_eonceBaseAddr = 0; +#endif + +struct +{ + FMSTR_U32 txData; /* Cached 4 bytes of transmit data */ + FMSTR_U32 rxData; /* Cached 4 bytes of receive data */ + FMSTR_SIZE8 txSize; /* Number of bytes in transmit data cache */ + FMSTR_SIZE8 rxSize; /* Number of bytes in receive data cache */ + + union + { + FMSTR_FLAGS all; + struct + { + unsigned riePending : 1; /* RX interrupt is pending to be enabled */ + unsigned tdfNeedRead : 1; /* used with FMSTR_USE_EONCE_TDF_WORKAROUND logic */ + } bit; + } flags; + +} fmstr_eonceCtx; + +/*********************************** + * local function prototypes + ***********************************/ + +/* Interface function - Initialization of EONCE driver adapter */ +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_Init(void); +static void _FMSTR_56F800E_EOnCE_EnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_56F800E_EOnCE_EnableReceive(FMSTR_BOOL enable); +static void _FMSTR_56F800E_EOnCE_EnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_56F800E_EOnCE_EnableReceiveInterrupt(FMSTR_BOOL enable); +static void _FMSTR_56F800E_EOnCE_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsTransmitterActive(void); +static void _FMSTR_56F800E_EOnCE_PutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_56F800E_EOnCE_GetChar(void); +static void _FMSTR_56F800E_EOnCE_Flush(void); +static void _FMSTR_56F800E_EOnCE_Poll(void); + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_ReadTDF(void); +static void _FMSTR_56F800E_EOnCE_TryReceiveData(void); +static void _FMSTR_56F800E_EOnCE_TryTransmitData(void); + +/*********************************** + * global variables + ***********************************/ +/* Interface of this EONCE driver */ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_56F800E_EONCE = { + FMSTR_C99_INIT(Init) _FMSTR_56F800E_EOnCE_Init, + FMSTR_C99_INIT(EnableTransmit) _FMSTR_56F800E_EOnCE_EnableTransmit, + FMSTR_C99_INIT(EnableReceive) _FMSTR_56F800E_EOnCE_EnableReceive, + FMSTR_C99_INIT(EnableTransmitInterrupt) _FMSTR_56F800E_EOnCE_EnableTransmitInterrupt, + FMSTR_C99_INIT(EnableTransmitCompleteInterrupt) _FMSTR_56F800E_EOnCE_EnableTransmitCompleteInterrupt, + FMSTR_C99_INIT(EnableReceiveInterrupt) _FMSTR_56F800E_EOnCE_EnableReceiveInterrupt, + FMSTR_C99_INIT(IsTransmitRegEmpty) _FMSTR_56F800E_EOnCE_IsTransmitRegEmpty, + FMSTR_C99_INIT(IsReceiveRegFull) _FMSTR_56F800E_EOnCE_IsReceiveRegFull, + FMSTR_C99_INIT(IsTransmitterActive) _FMSTR_56F800E_EOnCE_IsTransmitterActive, + FMSTR_C99_INIT(PutChar) _FMSTR_56F800E_EOnCE_PutChar, + FMSTR_C99_INIT(GetChar) _FMSTR_56F800E_EOnCE_GetChar, + FMSTR_C99_INIT(Flush) _FMSTR_56F800E_EOnCE_Flush, + FMSTR_C99_INIT(Poll) _FMSTR_56F800E_EOnCE_Poll, +}; + +/**************************************************************************************** + * General peripheral space access macros + *****************************************************************************************/ + +/* When enabled, assembler macros will be used to access the EOnCE registers. This code + * is able to access the registers at 'far' address at base 0xffff00 even in SDM model. */ +#if 1 + +#define FMSTR_SETBIT(baseAddr, regOffset, bitField) do { \ + register FMSTR_U16* rX; \ + asm ( move.l baseAddr, rX); \ + asm ( bfset bitField, X:(rX+regOffset) ); \ + } while(0) + +#define FMSTR_CLRBIT(baseAddr, regOffset, bitField) do { \ + register FMSTR_U16* rX; \ + asm ( move.l baseAddr, rX); \ + asm ( bfclr bitField, X:(rX+regOffset) ); \ + } while(0) + +#define FMSTR_TSTBIT(baseAddr, regOffset, bitField) \ + (FMSTR_GETREG((baseAddr), (regOffset)) & (bitField)) + +static inline void FMSTR_SETREG(register FMSTR_U32 baseAddr, register FMSTR_U32 regOffset, register FMSTR_U16 newValue) +{ + register FMSTR_U16* rX; + baseAddr += regOffset; + asm ( move.l baseAddr, rX); + asm ( move.w newValue, X:(rX+0) ); +} + +static inline FMSTR_U16 FMSTR_GETREG(register FMSTR_U32 baseAddr, register FMSTR_U32 regOffset) +{ + register FMSTR_U16* rX; + register FMSTR_U16 val; + baseAddr += regOffset; + asm ( move.l baseAddr, rX); + asm ( move.w X:(rX+0), val ); + return val; +} + +static inline void FMSTR_SETREG32(register FMSTR_U32 baseAddr, register FMSTR_U32 regOffset, register FMSTR_U32 newValue) +{ + register FMSTR_U32* rX; + baseAddr += regOffset; + asm ( move.l baseAddr, rX); + asm ( move.l newValue, X:(rX+0) ); +} + +static inline FMSTR_U32 FMSTR_GETREG32(register FMSTR_U32 baseAddr, register FMSTR_U32 regOffset) +{ + register FMSTR_U32* rX; + register FMSTR_U32 val; + baseAddr += regOffset; + asm ( move.l baseAddr, rX); + asm ( move.l X:(rX+0), val ); + return val; +} + +#else /* When assembler macros are disabled above, this is an equivalent pure C code which will only work in LDM. */ + +#define FMSTR_SETBIT(base, offset, bit) (*(volatile FMSTR_U16 *)(((FMSTR_U32)(base)) + (offset)) |= bit) +#define FMSTR_CLRBIT(base, offset, bit) (*(volatile FMSTR_U16 *)(((FMSTR_U32)(base)) + (offset)) &= (FMSTR_U16) ~((FMSTR_U16)(bit))) +#define FMSTR_TSTBIT(base, offset, bit) (*(volatile FMSTR_U16 *)(((FMSTR_U32)(base)) + (offset)) & (bit)) +#define FMSTR_SETREG(base, offset, value) (*(volatile FMSTR_U16 *)(((FMSTR_U32)(base)) + (offset)) = value) +#define FMSTR_GETREG(base, offset) (*(volatile FMSTR_U16 *)(((FMSTR_U32)(base)) + (offset))) + +#define FMSTR_SETREG32(base, offset, value) (*(volatile FMSTR_U32 *)(((FMSTR_U32)(base)) + (offset)) = value) +#define FMSTR_GETREG32(base, offset) (*(volatile FMSTR_U32 *)(((FMSTR_U32)(base)) + (offset))) + +#endif +/**************************************************************************************** + * EONCE module constants + *****************************************************************************************/ + +/* EONCE module registers */ +#define FMSTR_EONCE_OTXRXSR_OFFSET 0xfdU +#define FMSTR_EONCE_ORX_OFFSET 0xfeU +#define FMSTR_EONCE_OTX_OFFSET 0xfeU +#define FMSTR_EONCE_ORX1_OFFSET 0xffU +#define FMSTR_EONCE_OTX1_OFFSET 0xffU + +/* OTXRXSR register */ +#define FMSTR_EONCE_OTXRXSR_RDF 0x01U +#define FMSTR_EONCE_OTXRXSR_TDF 0x02U +#define FMSTR_EONCE_OTXRXSR_RIE 0x04U +#define FMSTR_EONCE_OTXRXSR_TIE 0x08U + +/****************************************************************************** + * + * EONCE communication initialization + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_Init(void) +{ + /* Default EOnCE address is used */ + if (fmstr_eonceBaseAddr == 0U) + { + fmstr_eonceBaseAddr = FMSTR_EONCE_BASE; + } + + fmstr_eonceCtx.flags.all = 0U; + fmstr_eonceCtx.txSize = 0U; + fmstr_eonceCtx.rxSize = 0U; + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * EONCE polling + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_Poll(void) +{ + /* In the JTAG interrupt-driven mode (both short and long), this function periodically checks + * if setting the JTAG RIE bit failed recently. This may happen because of the + * RIE is held low by the EONCE hardware until the EONCE is first accessed from host. + * The FMSTR_Init (->FMSTR_Listen) is often called while the PC-side FreeMASTER is still + * turned off. So the JTAG is not enabled at this time and RIE bit is not set. + * This problem is detected (see how riePending is set) and it is tried to be fixed + * periodically here in the poll call. + */ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + if (fmstr_eonceCtx.flags.bit.riePending != 0U) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR EOnCE Late RIE attempt\n"); +#endif + _FMSTR_56F800E_EOnCE_EnableReceiveInterrupt(FMSTR_TRUE); + } +#endif +} + +/****************************************************************************** + * + * Enable/Disable EONCE transmitter + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableTransmit(FMSTR_BOOL enable) +{ + if (enable == FMSTR_FALSE) + { + fmstr_eonceCtx.txSize = 0; +#if FMSTR_USE_EONCE_TDF_WORKAROUND > 0 + fmstr_eonceCtx.flags.bit.tdfNeedRead = 0; +#endif + } +} + +/****************************************************************************** + * + * Enable/Disable EONCE receiver + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableReceive(FMSTR_BOOL enable) +{ + if (enable == FMSTR_FALSE) + { + fmstr_eonceCtx.rxSize = 0; + } +} + +/****************************************************************************** + * + * Enable/Disable interrupt from transmit register empty event + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_TIE); + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_TIE); + } +} + +/****************************************************************************** + * + * Enable/Disable interrupt when transmission is complete (=idle) + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + /* no such interrupt, see how TDF is tested. */ +} + +/****************************************************************************** + * + * Enable/Disable interrupt from receive register full event + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_EnableReceiveInterrupt(FMSTR_BOOL enable) +{ + /* this bit will be set eventually if enabling the interrupt fails */ + fmstr_eonceCtx.flags.bit.riePending = 0U; + + if (enable != FMSTR_FALSE) + { + /* Enable interrupt */ + FMSTR_SETBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_RIE); + + /* On older core versions, enabling the interrupt may fail if JTAG module is not + * yet initialized by an external access. See the Poll call for more information. */ + if (FMSTR_TSTBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_RIE) == 0U) + { + fmstr_eonceCtx.flags.bit.riePending = 1U; + } + } + else + { + /* Disable interrupt */ + FMSTR_CLRBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_RIE); + } +} + +/****************************************************************************** + * + * Returns TRUE if the transmit register is empty, and it's possible to put next char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsTransmitRegEmpty(void) +{ + /* Any space in transmit buffer? */ + if (fmstr_eonceCtx.txSize < 4U) + { + return FMSTR_TRUE; + } + + /* Try to flush 4 bytes which are pending in our output buffer now */ + _FMSTR_56F800E_EOnCE_TryTransmitData(); + + /* Any free space by now? */ + return fmstr_eonceCtx.txSize < 4U; +} + +/****************************************************************************** + * + * Try to receive some EOnCE data from the remote peer into the local buffer + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_TryReceiveData(void) +{ + if (FMSTR_TSTBIT(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET, FMSTR_EONCE_OTXRXSR_RDF) != 0U) + { + fmstr_eonceCtx.rxData = FMSTR_GETREG32(fmstr_eonceBaseAddr, FMSTR_EONCE_ORX_OFFSET); + fmstr_eonceCtx.rxSize = 4U; + +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR EOnCE RX %04lx\n", fmstr_eonceCtx.rxData); +#endif + } +} + +/****************************************************************************** + * + * Returns TRUE if the receive register is full, and it's possible to get received char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsReceiveRegFull(void) +{ + /* Still some characters in the receive buffer? */ + if (fmstr_eonceCtx.rxSize > 0U) + { + return FMSTR_TRUE; + } + + /* Try to get next 4 bytes */ + _FMSTR_56F800E_EOnCE_TryReceiveData(); + + /* Any data by now? */ + return fmstr_eonceCtx.rxSize > 0U; +} + +/****************************************************************************** + * + * Low-level testing of TDF flag + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_ReadTDF(void) +{ + FMSTR_U16 statusReg = FMSTR_GETREG(fmstr_eonceBaseAddr, FMSTR_EONCE_OTXRXSR_OFFSET); + + /* The TDF=0 indicates the transmitter has completed the physical transmission. */ + if ((statusReg & FMSTR_EONCE_OTXRXSR_TDF) == 0U) + { +#if FMSTR_USE_EONCE_TDF_WORKAROUND > 0 + if (fmstr_eonceCtx.flags.bit.tdfNeedRead != 0U) + { + /* Silicon bug in older DSC parts makes TDF bit unusable (TDF gets reset too early). + The FreeMASTER tool sends a dummy confirmation word whenever it receives + word transmitted by us. This means we can use the RDF as an indication of !TDF */ + if ((statusReg & FMSTR_EONCE_OTXRXSR_RDF) != 0U) + { + /* Read and discard the data. */ + FMSTR_U32 dummyRx = FMSTR_GETREG32(fmstr_eonceBaseAddr, FMSTR_EONCE_ORX_OFFSET); +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR EOnCE Dummy RX for !TDF %04lx\n", dummyRx); +#endif + fmstr_eonceCtx.flags.bit.tdfNeedRead = 0U; + return FMSTR_FALSE; + } + else + { + return FMSTR_TRUE; /* Not received anything, transmitter is still active. */ + } + } + else + { + /* We only check the RDF once per each transmitted word */ + return FMSTR_FALSE; + } +#else + /* Modern DSC parts should have the bug fixed, so we can rely on the TDF bit. */ + return FMSTR_FALSE; +#endif + } + + /* Transmitter is still active. */ + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * Returns TRUE if the transmitter is still active + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_56F800E_EOnCE_IsTransmitterActive(void) +{ + /* this call should only be used after flush */ + FMSTR_ASSERT(fmstr_eonceCtx.txSize == 0U || fmstr_eonceCtx.txSize == 4U); + + /* Try physical flushing if word is still pending */ + if (fmstr_eonceCtx.txSize == 4U) + { + _FMSTR_56F800E_EOnCE_TryTransmitData(); + } + + return (FMSTR_BOOL)(fmstr_eonceCtx.txSize > 0U || _FMSTR_56F800E_EOnCE_ReadTDF() != FMSTR_FALSE); +} + +/****************************************************************************** + * + * The function puts the char for transmit + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_PutChar(FMSTR_BCHR ch) +{ + /* There should be space */ + if (fmstr_eonceCtx.txSize < 4U) + { + fmstr_eonceCtx.txData = (fmstr_eonceCtx.txData << 8) | (ch & 0xffU); + fmstr_eonceCtx.txSize++; + + if (fmstr_eonceCtx.txSize == 4U) + { + _FMSTR_56F800E_EOnCE_TryTransmitData(); + } + } + else + { + /* Caller hasn't checked if IsTransmitRegEmpty */ + FMSTR_ASSERT(0 == 1); + } +} + +/****************************************************************************** + * + * The function gets the received char + * + ******************************************************************************/ +static FMSTR_BCHR _FMSTR_56F800E_EOnCE_GetChar(void) +{ + FMSTR_BCHR ch = 0U; + + if (fmstr_eonceCtx.rxSize > 0U) + { + ch = (FMSTR_BCHR)((fmstr_eonceCtx.rxData >> 24) & 0xffU); + fmstr_eonceCtx.rxData <<= 8; + fmstr_eonceCtx.rxSize--; + } + else + { + /* Caller hasn't checked if IsReceiveRegFull */ + FMSTR_ASSERT(0 == 1); + } + + return ch; +} + +/****************************************************************************** + * + * Sends buffered 32bit word + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_TryTransmitData(void) +{ + /* This should only be used when full word is ready */ + FMSTR_ASSERT(fmstr_eonceCtx.txSize == 4U); + + /* Is it possible to transmit physically now? */ + if (_FMSTR_56F800E_EOnCE_ReadTDF() == FMSTR_FALSE) + { +#if FMSTR_DEBUG_LEVEL >= 3 + FMSTR_DEBUG_PRINTF("FMSTR EOnCE TX %04lx\n", fmstr_eonceCtx.txData); +#endif + /* OK put to physical transmit buffer */ + FMSTR_SETREG32(fmstr_eonceBaseAddr, FMSTR_EONCE_OTX_OFFSET, fmstr_eonceCtx.txData); + fmstr_eonceCtx.txSize = 0U; + + /* To fix the TDF behavior, we will perform dummy reading. */ +#if FMSTR_USE_EONCE_TDF_WORKAROUND > 0 + fmstr_eonceCtx.flags.bit.tdfNeedRead = 1U; +#endif + } +} + +/****************************************************************************** + * + * Send buffered data + * + ******************************************************************************/ + +static void _FMSTR_56F800E_EOnCE_Flush(void) +{ + /* If anything pending to be transmitted. */ + if (fmstr_eonceCtx.txSize != 0U) + { + /* Send dummy 0xff bytes to wrap up to 4 bytes */ + if (fmstr_eonceCtx.txSize < 4U) + { + FMSTR_SIZE8 shift = 8U * (4U - fmstr_eonceCtx.txSize); + fmstr_eonceCtx.txData = (fmstr_eonceCtx.txData << shift) | ((1 << shift) - 1); + fmstr_eonceCtx.txSize = 4U; + } + + /* Physical flush if possible. */ + _FMSTR_56F800E_EOnCE_TryTransmitData(); + } +} + +/****************************************************************************** + * + * Assign FreeMASTER communication module base address + * + ******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(FMSTR_U32 base) +{ + fmstr_eonceBaseAddr = base; +} + +/****************************************************************************** + * + * Process FreeMASTER serial interrupt (call this function from EONCE ISR) + * + ******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* process incoming or just transmitted byte */ + FMSTR_ProcessSerial(); +#endif +} + +#else /* !(FMSTR_DISABLE) */ + +/* Empty API functions when FMSTR_DISABLE is set */ +void FMSTR_SerialSetBaseAddress(FMSTR_U32 base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* !(FMSTR_DISABLE) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_56F800E_EONCE_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_56f800e_eonce.h b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_56f800e_eonce.h new file mode 100644 index 0000000..208241f --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_56f800e_eonce.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - 56F800E JTAG/EONCE RTD Unit low-level driver + */ + +#ifndef __FREEMASTER_56F800E_EONCE_H +#define __FREEMASTER_56F800E_EONCE_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_56f800e_eonce.h +#endif + +/****************************************************************************** +* Adapter configuration +******************************************************************************/ + +/* Silicon bug in older DSC cores makes the TDF bit unusable (TDF gets reset too early). + The FreeMASTER tool may send a dummy confirmation word whenever it receives + word transmitted by us. This means we can use the RDF as an indication of !TDF. + Note that if this option is set, the same workaround MUST be activated on the + FreeMASTER tool side (in the JTAG EOnCE communication plug-in settings). */ +#ifndef FMSTR_USE_EONCE_TDF_WORKAROUND +#define FMSTR_USE_EONCE_TDF_WORKAROUND 0 +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +/* This call is ignored as EOnCE has a fixed core address */ +void FMSTR_SerialSetBaseAddress(FMSTR_U32 base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +#endif /* __FREEMASTER_56F800E_EONCE_H */ + diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpsci.c b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpsci.c new file mode 100644 index 0000000..304bf81 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpsci.c @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - LPSCI (UART0) low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_MCUX_LPSCI_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_LPSCI_ID) + +#include "freemaster_serial_lpsci.h" + +#if FMSTR_DISABLE == 0 + +#include "fsl_common.h" +#include "fsl_lpsci.h" + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ + +/*********************************** + * local variables + ***********************************/ + +/* Serial base address */ +#ifdef FMSTR_SERIAL_BASE +static UART0_Type *fmstr_serialBaseAddr = FMSTR_SERIAL_BASE; +#else +static UART0_Type *fmstr_serialBaseAddr = NULL; +#endif + +/*********************************** + * local function prototypes + ***********************************/ + +/* Interface function - Initialization of serial UART driver adapter */ +static FMSTR_BOOL _FMSTR_SerialUartInit(void); +static void _FMSTR_SerialUartEnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableReceive(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_SerialUartIsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitterActive(void); +static void _FMSTR_SerialUartPutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_SerialUartGetChar(void); +static void _FMSTR_SerialUartFlush(void); + +/*********************************** + * global variables + ***********************************/ +/* Interface of this serial UART driver */ +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_MCUX_LPSCI = { + .Init = _FMSTR_SerialUartInit, + .EnableTransmit = _FMSTR_SerialUartEnableTransmit, + .EnableReceive = _FMSTR_SerialUartEnableReceive, + .EnableTransmitInterrupt = _FMSTR_SerialUartEnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt = _FMSTR_SerialUartEnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_SerialUartEnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_SerialUartIsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_SerialUartIsReceiveRegFull, + .IsTransmitterActive = _FMSTR_SerialUartIsTransmitterActive, + .PutChar = _FMSTR_SerialUartPutChar, + .GetChar = _FMSTR_SerialUartGetChar, + .Flush = _FMSTR_SerialUartFlush, + +}; + +/****************************************************************************** + * + * @brief Serial communication initialization + * + ******************************************************************************/ +static FMSTR_BOOL _FMSTR_SerialUartInit(void) +{ + /* Valid runtime module address must be assigned */ + if (fmstr_serialBaseAddr == NULL) + { + return FMSTR_FALSE; + } +#if defined(FSL_FEATURE_LPSCI_HAS_FIFO) && FSL_FEATURE_LPSCI_HAS_FIFO + /* The current version can not work with enabled FIFO. Disable it. */ + fmstr_serialBaseAddr->PFIFO &= ~(LPSCI_PFIFO_TXFE_MASK | LPSCI_PFIFO_RXFE_MASK); +#endif + +#if FMSTR_SERIAL_SINGLEWIRE > 0 + /* Enable single wire mode and force TX and RX to be enabled all the time. */ + fmstr_serialBaseAddr->C1 |= LPSCI_C1_LOOPS_MASK | LPSCI_C1_RSRC_MASK; + LPSCI_EnableTx(fmstr_serialBaseAddr, 1); + LPSCI_EnableRx(fmstr_serialBaseAddr, 1); +#endif + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial transmitter + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableTransmit(FMSTR_BOOL enable) +{ +#if FMSTR_SERIAL_SINGLEWIRE > 0 + /* In single-wire mode, the Transmitter is never physically disabled since it was + enabled in the Init() call. The TX pin direction is being changed only. */ + if (enable != 0U) + { + fmstr_serialBaseAddr->C3 |= LPSCI_C3_TXDIR_MASK; + } + else + { + fmstr_serialBaseAddr->C3 &= ~LPSCI_C3_TXDIR_MASK; + } +#else + /* In normal mode (or "external" single-wire mode) the Transmitter is controlled. */ + LPSCI_EnableTx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +#endif +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial receiver + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableReceive(FMSTR_BOOL enable) +{ +#if FMSTR_SERIAL_SINGLEWIRE > 0 + /* In single-wire mode, the Receiver is never physically disabled since it was + enabled in the Init() call. The TX pin direction is being changed only. */ + FMSTR_UNUSED(enable); +#else + /* In normal mode (or "external" single-wire mode) the Receiver is controlled. */ + LPSCI_EnableRx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +#endif +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit register empty event + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + LPSCI_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPSCI_TxDataRegEmptyInterruptEnable); + } + else + { + LPSCI_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPSCI_TxDataRegEmptyInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit complete event + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + LPSCI_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPSCI_TransmissionCompleteInterruptEnable); + } + else + { + LPSCI_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPSCI_TransmissionCompleteInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from receive register full event + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + LPSCI_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPSCI_RxDataRegFullInterruptEnable); + } + else + { + LPSCI_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPSCI_RxDataRegFullInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmit register is empty, and it's possible to put next char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitRegEmpty(void) +{ + uint32_t sr = LPSCI_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kLPSCI_TxDataRegEmptyFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the receive register is full, and it's possible to get received char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUartIsReceiveRegFull(void) +{ + uint32_t sr = LPSCI_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kLPSCI_RxDataRegFullFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmitter is still active + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitterActive(void) +{ + uint32_t sr = LPSCI_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kLPSCI_TransmissionCompleteFlag) == 0U); +} + +/****************************************************************************** + * + * @brief The function puts the char for transmit + * + ******************************************************************************/ + +static void _FMSTR_SerialUartPutChar(FMSTR_BCHR ch) +{ + LPSCI_WriteByte(fmstr_serialBaseAddr, ch); +} + +/****************************************************************************** + * + * @brief The function gets the received char + * + ******************************************************************************/ +static FMSTR_BCHR _FMSTR_SerialUartGetChar(void) +{ + return LPSCI_ReadByte(fmstr_serialBaseAddr); +} + +/****************************************************************************** + * + * @brief The function sends buffered data + * + ******************************************************************************/ +static void _FMSTR_SerialUartFlush(void) +{ +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER communication module base address + * + ******************************************************************************/ +void FMSTR_SerialSetBaseAddress(UART0_Type *base) +{ + fmstr_serialBaseAddr = base; +} + +/****************************************************************************** + * + * @brief API: Interrupt handler call + * + * This Interrupt Service Routine handles the UART interrupts for the FreeMASTER + * driver. In case you want to handle the interrupt in the application yourselves, + * call the FMSTR_ProcessSerial function which + * does the same job but is not compiled as an Interrupt Service Routine. + * + * In poll-driven mode (FMSTR_POLL_DRIVEN) this function does nothing. + * + ******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* Process received or just-transmitted byte. */ + FMSTR_ProcessSerial(); +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_SerialSetBaseAddress(UART0_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_LPSCI_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpsci.h b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpsci.h new file mode 100644 index 0000000..31c47dd --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpsci.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - LPSCI (UART0) low-level driver + */ + +#ifndef __FREEMASTER_SERIAL_LPSCI_H +#define __FREEMASTER_SERIAL_LPSCI_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_lpsci.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(UART0_Type *base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_SERIAL_LPSCI_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpuart.c b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpuart.c new file mode 100644 index 0000000..826d77d --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpuart.c @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - LPUART low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_MCUX_LPUART_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_LPUART_ID) + +#include "freemaster_serial_lpuart.h" + +#if FMSTR_DISABLE == 0 + +#include "fsl_common.h" +#include "fsl_lpuart.h" + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ + +/*********************************** + * local variables + ***********************************/ + +/* Serial base address */ +#ifdef FMSTR_SERIAL_BASE +static LPUART_Type *fmstr_serialBaseAddr = FMSTR_SERIAL_BASE; +#else +static LPUART_Type *fmstr_serialBaseAddr = NULL; +#endif + +/*********************************** + * local function prototypes + ***********************************/ + +/* Interface function - Initialization of serial UART driver adapter */ +static FMSTR_BOOL _FMSTR_SerialLpuartInit(void); +static void _FMSTR_SerialLpuartEnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_SerialLpuartEnableReceive(FMSTR_BOOL enable); +static void _FMSTR_SerialLpuartEnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialLpuartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialLpuartEnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_SerialLpuartIsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_SerialLpuartIsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_SerialLpuartIsTransmitterActive(void); +static void _FMSTR_SerialLpuartPutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_SerialLpuartGetChar(void); +static void _FMSTR_SerialLpuartFlush(void); + +/*********************************** + * global variables + ***********************************/ +/* Interface of this serial UART driver */ +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_MCUX_LPUART = { + .Init = _FMSTR_SerialLpuartInit, + .EnableTransmit = _FMSTR_SerialLpuartEnableTransmit, + .EnableReceive = _FMSTR_SerialLpuartEnableReceive, + .EnableTransmitInterrupt = _FMSTR_SerialLpuartEnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt = _FMSTR_SerialLpuartEnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_SerialLpuartEnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_SerialLpuartIsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_SerialLpuartIsReceiveRegFull, + .IsTransmitterActive = _FMSTR_SerialLpuartIsTransmitterActive, + .PutChar = _FMSTR_SerialLpuartPutChar, + .GetChar = _FMSTR_SerialLpuartGetChar, + .Flush = _FMSTR_SerialLpuartFlush, + +}; + +/****************************************************************************** + * + * @brief Serial communication initialization + * + ******************************************************************************/ +static FMSTR_BOOL _FMSTR_SerialLpuartInit(void) +{ + /* Valid runtime module address must be assigned */ + if (fmstr_serialBaseAddr == NULL) + { + return FMSTR_FALSE; + } + +#if FMSTR_SERIAL_SINGLEWIRE > 0 + /* Enable single wire mode and force TX and RX to be enabled all the time. */ + fmstr_serialBaseAddr->CTRL |= LPUART_CTRL_LOOPS_MASK | LPUART_CTRL_RSRC_MASK; + LPUART_EnableTx(fmstr_serialBaseAddr, 1); + LPUART_EnableRx(fmstr_serialBaseAddr, 1); +#endif + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial transmitter + * + ******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableTransmit(FMSTR_BOOL enable) +{ +#if FMSTR_SERIAL_SINGLEWIRE > 0 + /* In single-wire mode, the Transmitter is never physically disabled since it was + enabled in the Init() call. The TX pin direction is being changed only. */ + if (enable != 0U) + { + fmstr_serialBaseAddr->CTRL |= LPUART_CTRL_TXDIR_MASK; + } + else + { + fmstr_serialBaseAddr->CTRL &= ~LPUART_CTRL_TXDIR_MASK; + } +#else + /* In normal mode (or "external" single-wire mode) the Transmitter is controlled. */ + LPUART_EnableTx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +#endif +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial receiver + * + ******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableReceive(FMSTR_BOOL enable) +{ +#if FMSTR_SERIAL_SINGLEWIRE > 0 + /* In single-wire mode, the Receiver is never physically disabled since it was + enabled in the Init() call. The TX pin direction is being changed only. */ + FMSTR_UNUSED(enable); +#else + /* In normal mode (or "external" single-wire mode) the Receiver is controlled. */ + LPUART_EnableRx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +#endif +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit register empty event + * + ******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + LPUART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPUART_TxDataRegEmptyInterruptEnable); + } + else + { + LPUART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPUART_TxDataRegEmptyInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit complete event + * + ******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + LPUART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPUART_TransmissionCompleteInterruptEnable); + } + else + { + LPUART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPUART_TransmissionCompleteInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from receive register full event + * + ******************************************************************************/ + +static void _FMSTR_SerialLpuartEnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + LPUART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPUART_RxDataRegFullInterruptEnable); + } + else + { + LPUART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kLPUART_RxDataRegFullInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmit register is empty, and it's possible to put next char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialLpuartIsTransmitRegEmpty(void) +{ + uint32_t sr = LPUART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kLPUART_TxDataRegEmptyFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the receive register is full, and it's possible to get received char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialLpuartIsReceiveRegFull(void) +{ + uint32_t sr = LPUART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kLPUART_RxDataRegFullFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmitter is still active + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialLpuartIsTransmitterActive(void) +{ + uint32_t sr = LPUART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kLPUART_TransmissionCompleteFlag) == 0U); +} + +/****************************************************************************** + * + * @brief The function puts the char for transmit + * + ******************************************************************************/ + +static void _FMSTR_SerialLpuartPutChar(FMSTR_BCHR ch) +{ + LPUART_WriteByte(fmstr_serialBaseAddr, ch); +} + +/****************************************************************************** + * + * @brief The function gets the received char + * + ******************************************************************************/ +static FMSTR_BCHR _FMSTR_SerialLpuartGetChar(void) +{ + return LPUART_ReadByte(fmstr_serialBaseAddr); +} + +/****************************************************************************** + * + * @brief The function sends buffered data + * + ******************************************************************************/ +static void _FMSTR_SerialLpuartFlush(void) +{ +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER communication module base address + * + ******************************************************************************/ +void FMSTR_SerialSetBaseAddress(LPUART_Type *base) +{ + fmstr_serialBaseAddr = base; +} + +/****************************************************************************** + * + * @brief API: Interrupt handler call + * + * This Interrupt Service Routine handles the UART interrupts for the FreeMASTER + * driver. In case you want to handle the interrupt in the application yourselves, + * call the FMSTR_ProcessSerial function which + * does the same job but is not compiled as an Interrupt Service Routine. + * + * In poll-driven mode (FMSTR_POLL_DRIVEN) this function does nothing. + * + ******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* Process received or just-transmitted byte. */ + FMSTR_ProcessSerial(); +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_SerialSetBaseAddress(LPUART_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_LPUART_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpuart.h b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpuart.h new file mode 100644 index 0000000..1e9fa75 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_lpuart.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - LPUART low-level driver + */ + +#ifndef __FREEMASTER_SERIAL_LPUART_H +#define __FREEMASTER_SERIAL_LPUART_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_uart.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(LPUART_Type *base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus +} +#endif + +/**************************************************************************************** + * Global variable declaration + *****************************************************************************************/ +#endif /* __FREEMASTER_SERIAL_UART_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_miniusart.c b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_miniusart.c new file mode 100644 index 0000000..911c247 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_miniusart.c @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - MINIUSART low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_MCUX_MINIUSART_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_MINIUSART_ID) + +#include "freemaster_serial_miniusart.h" + +#if FMSTR_DISABLE == 0 + +#include "fsl_common.h" +#include "fsl_usart.h" + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ +#if FMSTR_SERIAL_SINGLEWIRE > 0 +#error The MINISUART driver does not support single wire configuration of UART communication. +#endif + +/*********************************** + * local variables + ***********************************/ + +/* Serial base address */ +#ifdef FMSTR_SERIAL_BASE +static USART_Type *fmstr_serialBaseAddr = FMSTR_SERIAL_BASE; +#else +static USART_Type *fmstr_serialBaseAddr = NULL; +#endif + +/*********************************** + * local function prototypes + ***********************************/ + +/* Interface function - Initialization of serial UART driver adapter */ +static FMSTR_BOOL _FMSTR_SerialMiniUsartInit(void); +static void _FMSTR_SerialMiniUsartEnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_SerialMiniUsartEnableReceive(FMSTR_BOOL enable); +static void _FMSTR_SerialMiniUsartEnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialMiniUsartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialMiniUsartEnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_SerialMiniUsartIsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_SerialMiniUsartIsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_SerialMiniUsartIsTransmitterActive(void); +static void _FMSTR_SerialMiniUsartPutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_SerialMiniUsartGetChar(void); +static void _FMSTR_SerialMiniUsartFlush(void); + +/*********************************** + * global variables + ***********************************/ +/* Interface of this serial UART driver */ +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_MCUX_MINIUSART = { + .Init = _FMSTR_SerialMiniUsartInit, + .EnableTransmit = _FMSTR_SerialMiniUsartEnableTransmit, + .EnableReceive = _FMSTR_SerialMiniUsartEnableReceive, + .EnableTransmitInterrupt = _FMSTR_SerialMiniUsartEnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt = _FMSTR_SerialMiniUsartEnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_SerialMiniUsartEnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_SerialMiniUsartIsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_SerialMiniUsartIsReceiveRegFull, + .IsTransmitterActive = _FMSTR_SerialMiniUsartIsTransmitterActive, + .PutChar = _FMSTR_SerialMiniUsartPutChar, + .GetChar = _FMSTR_SerialMiniUsartGetChar, + .Flush = _FMSTR_SerialMiniUsartFlush, + +}; + +/****************************************************************************** + * + * @brief Serial communication initialization + * + ******************************************************************************/ +static FMSTR_BOOL _FMSTR_SerialMiniUsartInit(void) +{ + /* valid runtime module address must be assigned */ + if (fmstr_serialBaseAddr == NULL) + { + return FMSTR_FALSE; + } + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial transmitter + * + ******************************************************************************/ + +static void _FMSTR_SerialMiniUsartEnableTransmit(FMSTR_BOOL enable) +{ + USART_EnableTx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial receiver + * + ******************************************************************************/ + +static void _FMSTR_SerialMiniUsartEnableReceive(FMSTR_BOOL enable) +{ + USART_EnableRx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit register empty event + * + ******************************************************************************/ + +static void _FMSTR_SerialMiniUsartEnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + USART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_TxReadyInterruptEnable); + } + else + { + USART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_TxReadyInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit complete event + * + ******************************************************************************/ + +static void _FMSTR_SerialMiniUsartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ +#if defined(FSL_FEATURE_USART_HAS_INTENSET_TXIDLEEN) && FSL_FEATURE_USART_HAS_INTENSET_TXIDLEEN + if (enable != FMSTR_FALSE) + { + USART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_TxIdleInterruptEnable); + } + else + { + USART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_TxIdleInterruptEnable); + } +#endif +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from receive register full event + * + ******************************************************************************/ + +static void _FMSTR_SerialMiniUsartEnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + USART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_RxReadyInterruptEnable); + } + else + { + USART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_RxReadyInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmit register is empty, and it's possible to put next char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialMiniUsartIsTransmitRegEmpty(void) +{ + uint32_t sr = USART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kUSART_TxReady) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the receive register is full, and it's possible to get received char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialMiniUsartIsReceiveRegFull(void) +{ + uint32_t sr = USART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kUSART_RxReady) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmitter is still active + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialMiniUsartIsTransmitterActive(void) +{ + uint32_t sr = USART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kUSART_TxIdleFlag) == 0U); +} + +/****************************************************************************** + * + * @brief The function puts the char for transmit + * + ******************************************************************************/ + +static void _FMSTR_SerialMiniUsartPutChar(FMSTR_BCHR ch) +{ + USART_WriteByte(fmstr_serialBaseAddr, ch); +} + +/****************************************************************************** + * + * @brief The function gets the received char + * + ******************************************************************************/ +static FMSTR_BCHR _FMSTR_SerialMiniUsartGetChar(void) +{ + return USART_ReadByte(fmstr_serialBaseAddr); +} + +/****************************************************************************** + * + * @brief The function sends buffered data + * + ******************************************************************************/ +static void _FMSTR_SerialMiniUsartFlush(void) +{ +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER communication module base address + * + ******************************************************************************/ +void FMSTR_SerialSetBaseAddress(USART_Type *base) +{ + fmstr_serialBaseAddr = base; +} + +/****************************************************************************** + * + * @brief API: Interrupt handler call + * + * This Interrupt Service Routine handles the UART interrupts for the FreeMASTER + * driver. In case you want to handle the interrupt in the application yourselves, + * call the FMSTR_ProcessSerial function which + * does the same job but is not compiled as an Interrupt Service Routine. + * + * In poll-driven mode (FMSTR_POLL_DRIVEN) this function does nothing. + * + ******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* Process received or just-transmitted byte. */ + FMSTR_ProcessSerial(); +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_SerialSetBaseAddress(USART_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_MINIUSART_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_miniusart.h b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_miniusart.h new file mode 100644 index 0000000..a4bb0a2 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_miniusart.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - MINIUSART low-level driver + */ + +#ifndef __FREEMASTER_SERIAL_MINIUSART_H +#define __FREEMASTER_SERIAL_MINIUSART_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_uart.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(USART_Type *base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus +} +#endif + +/**************************************************************************************** + * Global variable declaration + *****************************************************************************************/ +#endif /* __FREEMASTER_SERIAL_MINIUSART_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_qsci.c b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_qsci.c new file mode 100644 index 0000000..cdcba67 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_qsci.c @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - QSCI low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_MCUX_QSCI_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_QSCI_ID) + +#include "freemaster_serial_qsci.h" + +#if FMSTR_DISABLE == 0 + +#include "fsl_common.h" +#include "fsl_qsci.h" + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ + +/*********************************** + * local variables + ***********************************/ + +/* Serial base address */ +#ifdef FMSTR_SERIAL_BASE +static QSCI_Type *fmstr_serialBaseAddr = FMSTR_SERIAL_BASE; +#else +static QSCI_Type *fmstr_serialBaseAddr = NULL; +#endif + +/*********************************** + * local function prototypes + ***********************************/ + +/* Interface function - Initialization of serial UART driver adapter */ +static FMSTR_BOOL _FMSTR_QSCIInit(void); +static void _FMSTR_QSCIEnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_QSCIEnableReceive(FMSTR_BOOL enable); +static void _FMSTR_QSCIEnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_QSCIEnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_QSCIEnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_QSCIIsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_QSCIIsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_QSCIIsTransmitterActive(void); +static void _FMSTR_QSCIPutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_QSCIGetChar(void); +static void _FMSTR_QSCIFlush(void); + +/*********************************** + * global variables + ***********************************/ +/* Interface of this serial UART driver */ +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_MCUX_QSCI = { + FMSTR_C99_INIT(Init) _FMSTR_QSCIInit, + FMSTR_C99_INIT(EnableTransmit) _FMSTR_QSCIEnableTransmit, + FMSTR_C99_INIT(EnableReceive) _FMSTR_QSCIEnableReceive, + FMSTR_C99_INIT(EnableTransmitInterrupt) _FMSTR_QSCIEnableTransmitInterrupt, + FMSTR_C99_INIT(EnableTransmitCompleteInterrupt) _FMSTR_QSCIEnableTransmitCompleteInterrupt, + FMSTR_C99_INIT(EnableReceiveInterrupt) _FMSTR_QSCIEnableReceiveInterrupt, + FMSTR_C99_INIT(IsTransmitRegEmpty) _FMSTR_QSCIIsTransmitRegEmpty, + FMSTR_C99_INIT(IsReceiveRegFull) _FMSTR_QSCIIsReceiveRegFull, + FMSTR_C99_INIT(IsTransmitterActive) _FMSTR_QSCIIsTransmitterActive, + FMSTR_C99_INIT(PutChar) _FMSTR_QSCIPutChar, + FMSTR_C99_INIT(GetChar) _FMSTR_QSCIGetChar, + FMSTR_C99_INIT(Flush) _FMSTR_QSCIFlush, +}; + +/****************************************************************************** + * + * @brief Serial communication initialization + * + ******************************************************************************/ +static FMSTR_BOOL _FMSTR_QSCIInit(void) +{ + /* Valid runtime module address must be assigned */ + if (fmstr_serialBaseAddr == NULL) + { + return FMSTR_FALSE; + } + +#if FMSTR_SERIAL_SINGLEWIRE > 0 +#error Internal single wire mode is not supported. + return FMSTR_FALSE; +#endif + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial transmitter + * + ******************************************************************************/ + +static void _FMSTR_QSCIEnableTransmit(FMSTR_BOOL enable) +{ + QSCI_EnableTx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial receiver + * + ******************************************************************************/ + +static void _FMSTR_QSCIEnableReceive(FMSTR_BOOL enable) +{ + QSCI_EnableRx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit register empty event + * + ******************************************************************************/ + +static void _FMSTR_QSCIEnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + QSCI_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kQSCI_TxEmptyInterruptEnable); + } + else + { + QSCI_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kQSCI_TxEmptyInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit complete event + * + ******************************************************************************/ + +static void _FMSTR_QSCIEnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + QSCI_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kQSCI_TxIdleInterruptEnable); + } + else + { + QSCI_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kQSCI_TxIdleInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from receive register full event + * + ******************************************************************************/ + +static void _FMSTR_QSCIEnableReceiveInterrupt(FMSTR_BOOL enable) +{ + /* Note that if RX Idle and Error interrupts are "accidentally" enabled by user, we disable + * them along with the RX Data interrupt. This avoids unnecessary interrupts to be serviced. */ + if (enable != FMSTR_FALSE) + { + QSCI_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kQSCI_RxFullInterruptEnable); + } + else + { + QSCI_DisableInterrupts( + fmstr_serialBaseAddr, + (uint32_t)(kQSCI_RxFullInterruptEnable + | kQSCI_RxErrorInterruptEnable +#if defined(FSL_FEATURE_QSCI_HAS_RX_IDLE_INTERRUPT) && FSL_FEATURE_QSCI_HAS_RX_IDLE_INTERRUPT + | kQSCI_RxIdleLineInterruptEnable +#endif + )); + } +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmit register is empty, and it's possible to put next char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_QSCIIsTransmitRegEmpty(void) +{ + uint32_t sr = QSCI_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kQSCI_TxDataRegEmptyFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the receive register is full, and it's possible to get received char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_QSCIIsReceiveRegFull(void) +{ + uint32_t sr = QSCI_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kQSCI_RxDataRegFullFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmitter is still active + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_QSCIIsTransmitterActive(void) +{ + uint32_t sr = QSCI_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kQSCI_TxIdleFlag) == 0U); +} + +/****************************************************************************** + * + * @brief The function puts the char for transmit + * + ******************************************************************************/ + +static void _FMSTR_QSCIPutChar(FMSTR_BCHR ch) +{ + QSCI_WriteByte(fmstr_serialBaseAddr, ch); +} + +/****************************************************************************** + * + * @brief The function gets the received char + * + ******************************************************************************/ +static FMSTR_BCHR _FMSTR_QSCIGetChar(void) +{ + return QSCI_ReadByte(fmstr_serialBaseAddr); +} + +/****************************************************************************** + * + * @brief The function sends buffered data + * + ******************************************************************************/ +static void _FMSTR_QSCIFlush(void) +{ +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER communication module base address + * + ******************************************************************************/ +void FMSTR_SerialSetBaseAddress(QSCI_Type *base) +{ + fmstr_serialBaseAddr = base; +} + +/****************************************************************************** + * + * @brief API: Interrupt handler call + * + * This Interrupt Service Routine handles the UART interrupts for the FreeMASTER + * driver. In case you want to handle the interrupt in the application yourselves, + * call the FMSTR_ProcessSerial function which + * does the same job but is not compiled as an Interrupt Service Routine. + * + * In poll-driven mode (FMSTR_POLL_DRIVEN) this function does nothing. + * + ******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* Process received or just-transmitted byte. */ + FMSTR_ProcessSerial(); + + /* Clear error flags and also the input-edge flag. Note that "RX Idle" flag is not cleared as it + * messes up with receive process, rather the interrupt is disabled as a whole above. */ + QSCI_ClearStatusFlags(fmstr_serialBaseAddr, (uint32_t)(kQSCI_Group1Flags | kQSCI_RxInputEdgeFlag)); + +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_SerialSetBaseAddress(QSCI_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_QSCI_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_qsci.h b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_qsci.h new file mode 100644 index 0000000..8102e86 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_qsci.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - QSCI low-level driver + */ + +#ifndef __FREEMASTER_SERIAL_QSCI_H +#define __FREEMASTER_SERIAL_QSCI_H + +/****************************************************************************** +* Required header files include check +******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_qsci.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/****************************************************************************** +* Types definition +******************************************************************************/ + +/****************************************************************************** +* inline functions +******************************************************************************/ + +/****************************************************************************** +* Global API functions +******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(QSCI_Type *base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus + } +#endif + +/**************************************************************************************** +* Global variable declaration +*****************************************************************************************/ +#endif /* __FREEMASTER_SERIAL_QSCI_H */ + diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_uart.c b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_uart.c new file mode 100644 index 0000000..b2da7b7 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_uart.c @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - UART low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_MCUX_UART_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_UART_ID) + +#include "freemaster_serial_uart.h" + +#if FMSTR_DISABLE == 0 + +#include "fsl_common.h" +#include "fsl_uart.h" + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ + +/*********************************** + * local variables + ***********************************/ + +/* Serial base address */ +#ifdef FMSTR_SERIAL_BASE +static UART_Type *fmstr_serialBaseAddr = FMSTR_SERIAL_BASE; +#else +static UART_Type *fmstr_serialBaseAddr = NULL; +#endif + +/*********************************** + * local function prototypes + ***********************************/ + +/* Interface function - Initialization of serial UART driver adapter */ +static FMSTR_BOOL _FMSTR_SerialUartInit(void); +static void _FMSTR_SerialUartEnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableReceive(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUartEnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_SerialUartIsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitterActive(void); +static void _FMSTR_SerialUartPutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_SerialUartGetChar(void); +static void _FMSTR_SerialUartFlush(void); + +/*********************************** + * global variables + ***********************************/ +/* Interface of this serial UART driver */ +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_MCUX_UART = { + .Init = _FMSTR_SerialUartInit, + .EnableTransmit = _FMSTR_SerialUartEnableTransmit, + .EnableReceive = _FMSTR_SerialUartEnableReceive, + .EnableTransmitInterrupt = _FMSTR_SerialUartEnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt = _FMSTR_SerialUartEnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_SerialUartEnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_SerialUartIsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_SerialUartIsReceiveRegFull, + .IsTransmitterActive = _FMSTR_SerialUartIsTransmitterActive, + .PutChar = _FMSTR_SerialUartPutChar, + .GetChar = _FMSTR_SerialUartGetChar, + .Flush = _FMSTR_SerialUartFlush, + +}; + +/****************************************************************************** + * + * @brief Serial communication initialization + * + ******************************************************************************/ +static FMSTR_BOOL _FMSTR_SerialUartInit(void) +{ + /* Valid runtime module address must be assigned */ + if (fmstr_serialBaseAddr == NULL) + { + return FMSTR_FALSE; + } + +#if defined(FSL_FEATURE_UART_HAS_FIFO) && FSL_FEATURE_UART_HAS_FIFO + /* The current version can not work with enabled FIFO. Disable it. */ + fmstr_serialBaseAddr->PFIFO &= ~(UART_PFIFO_TXFE_MASK | UART_PFIFO_RXFE_MASK); +#endif + +#if FMSTR_SERIAL_SINGLEWIRE > 0 + /* Enable single wire mode and force TX and RX to be enabled all the time. */ + fmstr_serialBaseAddr->C1 |= UART_C1_LOOPS_MASK | UART_C1_RSRC_MASK; + UART_EnableTx(fmstr_serialBaseAddr, 1); + UART_EnableRx(fmstr_serialBaseAddr, 1); +#endif + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial transmitter + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableTransmit(FMSTR_BOOL enable) +{ +#if FMSTR_SERIAL_SINGLEWIRE > 0 + /* In single-wire mode, the Transmitter is never physically disabled since it was + enabled in the Init() call. The TX pin direction is being changed only. */ + if (enable != 0U) + { + fmstr_serialBaseAddr->C3 |= UART_C3_TXDIR_MASK; + } + else + { + fmstr_serialBaseAddr->C3 &= ~UART_C3_TXDIR_MASK; + } +#else + /* In normal mode (or "external" single-wire mode) the Transmitter is controlled. */ + UART_EnableTx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +#endif +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial receiver + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableReceive(FMSTR_BOOL enable) +{ +#if FMSTR_SERIAL_SINGLEWIRE > 0 + /* In single-wire mode, the Receiver is never physically disabled since it was + enabled in the Init() call. The TX pin direction is being changed only. */ + FMSTR_UNUSED(enable); +#else + /* In normal mode (or "external" single-wire mode) the Receiver is controlled. */ + UART_EnableRx(fmstr_serialBaseAddr, enable != FMSTR_FALSE); +#endif +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit register empty event + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + UART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUART_TxDataRegEmptyInterruptEnable); + } + else + { + UART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUART_TxDataRegEmptyInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit complete event + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + UART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUART_TransmissionCompleteInterruptEnable); + } + else + { + UART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUART_TransmissionCompleteInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from receive register full event + * + ******************************************************************************/ + +static void _FMSTR_SerialUartEnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + UART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUART_RxDataRegFullInterruptEnable); + } + else + { + UART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUART_RxDataRegFullInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmit register is empty, and it's possible to put next char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitRegEmpty(void) +{ + uint32_t sr = UART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kUART_TxDataRegEmptyFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the receive register is full, and it's possible to get received char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUartIsReceiveRegFull(void) +{ + uint32_t sr = UART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kUART_RxDataRegFullFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmitter is still active + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUartIsTransmitterActive(void) +{ + uint32_t sr = UART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kUART_TransmissionCompleteFlag) == 0U); +} + +/****************************************************************************** + * + * @brief The function puts the char for transmit + * + ******************************************************************************/ + +static void _FMSTR_SerialUartPutChar(FMSTR_BCHR ch) +{ + UART_WriteByte(fmstr_serialBaseAddr, ch); +} + +/****************************************************************************** + * + * @brief The function gets the received char + * + ******************************************************************************/ +static FMSTR_BCHR _FMSTR_SerialUartGetChar(void) +{ + return UART_ReadByte(fmstr_serialBaseAddr); +} + +/****************************************************************************** + * + * @brief The function sends buffered data + * + ******************************************************************************/ +static void _FMSTR_SerialUartFlush(void) +{ +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER communication module base address + * + ******************************************************************************/ +void FMSTR_SerialSetBaseAddress(UART_Type *base) +{ + fmstr_serialBaseAddr = base; +} + +/****************************************************************************** + * + * @brief API: Interrupt handler call + * + * This Interrupt Service Routine handles the UART interrupts for the FreeMASTER + * driver. In case you want to handle the interrupt in the application yourselves, + * call the FMSTR_ProcessSerial function which + * does the same job but is not compiled as an Interrupt Service Routine. + * + * In poll-driven mode (FMSTR_POLL_DRIVEN) this function does nothing. + * + ******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* Process received or just-transmitted byte. */ + FMSTR_ProcessSerial(); +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_SerialSetBaseAddress(UART_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_UART_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_uart.h b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_uart.h new file mode 100644 index 0000000..b4993db --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_uart.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - UART low-level driver + */ + +#ifndef __FREEMASTER_SERIAL_UART_H +#define __FREEMASTER_SERIAL_UART_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_uart.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(UART_Type *base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __FREEMASTER_SERIAL_UART_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usart.c b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usart.c new file mode 100644 index 0000000..a032ac5 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usart.c @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - USART low-level driver + */ + +#include "freemaster.h" +#include "freemaster_private.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_MCUX_USART_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_USART_ID) + +#include "freemaster_serial_usart.h" + +#if FMSTR_DISABLE == 0 + +#include "fsl_common.h" +#include "fsl_usart.h" + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ +#if FMSTR_SERIAL_SINGLEWIRE > 0 +#error The SUART driver does not support single wire configuration of UART communication. +#endif + +/*********************************** + * local variables + ***********************************/ + +/* Serial base address */ +#ifdef FMSTR_SERIAL_BASE +static USART_Type *fmstr_serialBaseAddr = FMSTR_SERIAL_BASE; +#else +static USART_Type *fmstr_serialBaseAddr = NULL; +#endif + +/*********************************** + * local function prototypes + ***********************************/ + +/* Interface function - Initialization of serial UART driver adapter */ +static FMSTR_BOOL _FMSTR_SerialUsartInit(void); +static void _FMSTR_SerialUsartEnableTransmit(FMSTR_BOOL enable); +static void _FMSTR_SerialUsartEnableReceive(FMSTR_BOOL enable); +static void _FMSTR_SerialUsartEnableTransmitInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUsartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUsartEnableReceiveInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_SerialUsartIsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_SerialUsartIsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_SerialUsartIsTransmitterActive(void); +static void _FMSTR_SerialUsartPutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_SerialUsartGetChar(void); +static void _FMSTR_SerialUsartFlush(void); + +/*********************************** + * global variables + ***********************************/ +/* Interface of this serial UART driver */ +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_MCUX_USART = { + .Init = _FMSTR_SerialUsartInit, + .EnableTransmit = _FMSTR_SerialUsartEnableTransmit, + .EnableReceive = _FMSTR_SerialUsartEnableReceive, + .EnableTransmitInterrupt = _FMSTR_SerialUsartEnableTransmitInterrupt, + .EnableTransmitCompleteInterrupt = _FMSTR_SerialUsartEnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_SerialUsartEnableReceiveInterrupt, + .IsTransmitRegEmpty = _FMSTR_SerialUsartIsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_SerialUsartIsReceiveRegFull, + .IsTransmitterActive = _FMSTR_SerialUsartIsTransmitterActive, + .PutChar = _FMSTR_SerialUsartPutChar, + .GetChar = _FMSTR_SerialUsartGetChar, + .Flush = _FMSTR_SerialUsartFlush, + +}; + +/****************************************************************************** + * + * @brief Serial communication initialization + * + ******************************************************************************/ +static FMSTR_BOOL _FMSTR_SerialUsartInit(void) +{ + /* valid runtime module address must be assigned */ + if (fmstr_serialBaseAddr == NULL) + { + return FMSTR_FALSE; + } + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial transmitter + * + ******************************************************************************/ + +static void _FMSTR_SerialUsartEnableTransmit(FMSTR_BOOL enable) +{ +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial receiver + * + ******************************************************************************/ + +static void _FMSTR_SerialUsartEnableReceive(FMSTR_BOOL enable) +{ +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit register empty event + * + ******************************************************************************/ + +static void _FMSTR_SerialUsartEnableTransmitInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + USART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_TxLevelInterruptEnable); + } + else + { + USART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_TxLevelInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit complete event + * + ******************************************************************************/ + +static void _FMSTR_SerialUsartEnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ + /* The UASRT peripheral has common interrupt enable for both events */ + _FMSTR_SerialUsartEnableTransmitInterrupt(enable); +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from receive register full event + * + ******************************************************************************/ + +static void _FMSTR_SerialUsartEnableReceiveInterrupt(FMSTR_BOOL enable) +{ + if (enable != FMSTR_FALSE) + { + USART_EnableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_RxLevelInterruptEnable); + } + else + { + USART_DisableInterrupts(fmstr_serialBaseAddr, (uint32_t)kUSART_RxLevelInterruptEnable); + } +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmit register is empty, and it's possible to put next char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUsartIsTransmitRegEmpty(void) +{ + uint32_t sr = USART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kUSART_TxFifoNotFullFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the receive register is full, and it's possible to get received char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUsartIsReceiveRegFull(void) +{ + uint32_t sr = USART_GetStatusFlags(fmstr_serialBaseAddr); + + return (FMSTR_BOOL)((sr & (uint32_t)kUSART_RxFifoNotEmptyFlag) != 0U); +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmitter is still active + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUsartIsTransmitterActive(void) +{ + /* The SDK doesn't provide API access to USART status register, + we need to access it directly. */ + return (FMSTR_BOOL)((fmstr_serialBaseAddr->STAT & USART_STAT_TXIDLE_MASK) == 0U); +} + +/****************************************************************************** + * + * @brief The function puts the char for transmit + * + ******************************************************************************/ + +static void _FMSTR_SerialUsartPutChar(FMSTR_BCHR ch) +{ + USART_WriteByte(fmstr_serialBaseAddr, ch); +} + +/****************************************************************************** + * + * @brief The function gets the received char + * + ******************************************************************************/ +static FMSTR_BCHR _FMSTR_SerialUsartGetChar(void) +{ + return USART_ReadByte(fmstr_serialBaseAddr); +} + +/****************************************************************************** + * + * @brief The function sends buffered data + * + ******************************************************************************/ +static void _FMSTR_SerialUsartFlush(void) +{ +} + +/****************************************************************************** + * + * @brief Assigning FreeMASTER communication module base address + * + ******************************************************************************/ +void FMSTR_SerialSetBaseAddress(USART_Type *base) +{ + fmstr_serialBaseAddr = base; +} + +/****************************************************************************** + * + * @brief API: Interrupt handler call + * + * This Interrupt Service Routine handles the UART interrupts for the FreeMASTER + * driver. In case you want to handle the interrupt in the application yourselves, + * call the FMSTR_ProcessSerial function which + * does the same job but is not compiled as an Interrupt Service Routine. + * + * In poll-driven mode (FMSTR_POLL_DRIVEN) this function does nothing. + * + ******************************************************************************/ + +void FMSTR_SerialIsr(void) +{ + /* If RX overrun. */ + if ((fmstr_serialBaseAddr->FIFOSTAT & USART_FIFOSTAT_RXERR_MASK) != 0U) + { + /* Clear rx error state. */ + fmstr_serialBaseAddr->FIFOSTAT |= USART_FIFOSTAT_RXERR_MASK; + /* clear rxFIFO */ + fmstr_serialBaseAddr->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK; + } + +#if FMSTR_LONG_INTR > 0 || FMSTR_SHORT_INTR > 0 + /* Process received or just-transmitted byte. */ + FMSTR_ProcessSerial(); +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_SerialSetBaseAddress(USART_Type *base) +{ + FMSTR_UNUSED(base); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_USART_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usart.h b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usart.h new file mode 100644 index 0000000..08a4826 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usart.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - USART low-level driver + */ + +#ifndef __FREEMASTER_SERIAL_USART_H +#define __FREEMASTER_SERIAL_USART_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_uart.h +#endif + +/* This low-level driver uses the MCUXpresso SDK peripheral structure types. */ +#include "fsl_device_registers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +void FMSTR_SerialSetBaseAddress(USART_Type *base); +void FMSTR_SerialIsr(void); + +#ifdef __cplusplus +} +#endif + +/**************************************************************************************** + * Global variable declaration + *****************************************************************************************/ +#endif /* __FREEMASTER_SERIAL_USART_H */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usb.c b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usb.c new file mode 100644 index 0000000..e88a2fd --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usb.c @@ -0,0 +1,413 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - low-level driver for CDC class of the USB stack + */ + +#include "freemaster.h" +#include "freemaster_private.h" +#include "freemaster_utils.h" + +/* Numeric identifier to help pre-processor to identify whether our driver is used or not. */ +#define FMSTR_SERIAL_MCUX_USB_ID 1 + +#if (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_USB_ID) + +#include "freemaster_serial_usb.h" + +#if FMSTR_DISABLE == 0 + +#include "freemaster_protocol.h" +#include "freemaster_serial.h" + +/* Include USB stack header files */ +#include "usb_device_config.h" +#include "usb.h" +#include "usb_device.h" +#include "usb_device_class.h" +#include "usb_device_descriptor.h" + +/* FreeMASTER-specific USB-CDC constants and init function */ +#include "freemaster_usb.h" + +/****************************************************************************** + * Adapter configuration + ******************************************************************************/ +#if defined(FMSTR_SHORT_INTR) && FMSTR_SHORT_INTR +#error The USB/CDC driver does not support short interrupt. +#endif + +#if FMSTR_SERIAL_SINGLEWIRE > 0 +#error The USB/CDC driver does not support single wire configuration of UART communication. +#endif + +#define _MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define _MAX(a, b) (((a) > (b)) ? (a) : (b)) + +/* Bulk endpoint buffer sizes */ +#ifdef USB_DATA_BUFF_SIZE +/* USB transmit if flushed automatically when full, so it can be smaller than FreeMASTER buffer */ +#define FMSTR_USB_TX_BUFFER_SIZE _MIN(USB_DATA_BUFF_SIZE, FMSTR_COMM_BUFFER_SIZE) +/* USB receive buffer must accommodate the whole frame at once, so must be at least the FreeMASTER buffer size */ +#define FMSTR_USB_RX_BUFFER_SIZE _MAX(USB_DATA_BUFF_SIZE, FMSTR_COMM_BUFFER_SIZE) +#else +#define FMSTR_USB_TX_BUFFER_SIZE FMSTR_COMM_BUFFER_SIZE +#define FMSTR_USB_RX_BUFFER_SIZE FMSTR_COMM_BUFFER_SIZE +#endif + +/****************************************************************************** + * Local functions + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUsbInit(void); +static void _FMSTR_SerialUsbEnableTx(FMSTR_BOOL enable); +static void _FMSTR_SerialUsbEnableRx(FMSTR_BOOL enable); +static void _FMSTR_SerialUsbEnableTxInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUsbEnableTransmitCompleteInterrupt(FMSTR_BOOL enable); +static void _FMSTR_SerialUsbEnableRxInterrupt(FMSTR_BOOL enable); +static FMSTR_BOOL _FMSTR_SerialUsbIsTransmitRegEmpty(void); +static FMSTR_BOOL _FMSTR_SerialUsbIsReceiveRegFull(void); +static FMSTR_BOOL _FMSTR_SerialUsbIsTransmitterActive(void); +static void _FMSTR_SerialUsbPutChar(FMSTR_BCHR ch); +static FMSTR_BCHR _FMSTR_SerialUsbGetChar(void); +static void _FMSTR_SerialUsbFlush(void); + +/****************************************************************************** + * Type definitions + ******************************************************************************/ + +/* Context structure of USB/CDC interface */ +typedef struct FMSTR_USB_CTX_S +{ + volatile FMSTR_BOOL txEnabled; /* Transmit is enabled */ + FMSTR_BCHR txBuffer[FMSTR_USB_TX_BUFFER_SIZE]; /* Transmit buffer - max one full USB bulk frame */ + FMSTR_BCHR rxBuffer[FMSTR_USB_RX_BUFFER_SIZE]; /* Receive buffer - whole FreeMASTER frame must fit */ + volatile uint32_t txSize; /* Data size in transmit buffer */ + volatile FMSTR_BOOL txActive; /* Transmit status (true = transmitting) */ + volatile FMSTR_BOOL rxEnabled; /* Receiver enabled */ + + FMSTR_RING_BUFFER rxQueue; /* Receive ring buffer object */ +} FMSTR_USB_CTX; + +/****************************************************************************** + * Local variables + ******************************************************************************/ +/* Context data of USB/CDC interface */ +static FMSTR_USB_CTX fmstr_usbCtx; +/* Transmit function for USB/CDC interface */ +static FMSTR_TX_FUNC fmstr_txFunc = NULL; +/****************************************************************************** + * Driver interface + ******************************************************************************/ + +const FMSTR_SERIAL_DRV_INTF FMSTR_SERIAL_MCUX_USB = { + .Init = _FMSTR_SerialUsbInit, + .EnableTransmit = _FMSTR_SerialUsbEnableTx, + .EnableReceive = _FMSTR_SerialUsbEnableRx, + .EnableTransmitInterrupt = _FMSTR_SerialUsbEnableTxInterrupt, + .EnableTransmitCompleteInterrupt = _FMSTR_SerialUsbEnableTransmitCompleteInterrupt, + .EnableReceiveInterrupt = _FMSTR_SerialUsbEnableRxInterrupt, + .IsTransmitRegEmpty = _FMSTR_SerialUsbIsTransmitRegEmpty, + .IsReceiveRegFull = _FMSTR_SerialUsbIsReceiveRegFull, + .IsTransmitterActive = _FMSTR_SerialUsbIsTransmitterActive, + .PutChar = _FMSTR_SerialUsbPutChar, + .GetChar = _FMSTR_SerialUsbGetChar, + .Flush = _FMSTR_SerialUsbFlush, +}; + +/****************************************************************************** + * + * @brief Serial communication initialization + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUsbInit(void) +{ + FMSTR_MemSet(&fmstr_usbCtx, 0, sizeof(fmstr_usbCtx)); + + if (fmstr_txFunc == NULL) + { + return FMSTR_FALSE; + } + + _FMSTR_RingBuffCreate(&fmstr_usbCtx.rxQueue, fmstr_usbCtx.rxBuffer, sizeof(fmstr_usbCtx.rxBuffer)); + + return FMSTR_TRUE; +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial transmitter + * + ******************************************************************************/ + +static void _FMSTR_SerialUsbEnableTx(FMSTR_BOOL enable) +{ + fmstr_usbCtx.txEnabled = enable; +} + +/****************************************************************************** + * + * @brief Enable/Disable Serial receiver + * + ******************************************************************************/ + +static void _FMSTR_SerialUsbEnableRx(FMSTR_BOOL enable) +{ + fmstr_usbCtx.rxEnabled = enable; +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit register empty event + * + ******************************************************************************/ + +static void _FMSTR_SerialUsbEnableTxInterrupt(FMSTR_BOOL enable) +{ +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from transmit complete event + * + ******************************************************************************/ + +static void _FMSTR_SerialUsbEnableTransmitCompleteInterrupt(FMSTR_BOOL enable) +{ +} + +/****************************************************************************** + * + * @brief Enable/Disable interrupt from receive register full event + * + ******************************************************************************/ + +static void _FMSTR_SerialUsbEnableRxInterrupt(FMSTR_BOOL enable) +{ +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmit register is empty, and it's possible to put next char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUsbIsTransmitRegEmpty(void) +{ + /* Check if transmit is enabled or if it is sending data */ + if (fmstr_usbCtx.txEnabled == FMSTR_FALSE || fmstr_usbCtx.txActive != FMSTR_FALSE) + { + return FMSTR_FALSE; + } + + /* Check, if buffer is not full */ + if (fmstr_usbCtx.txSize < sizeof(fmstr_usbCtx.txBuffer)) + { + return FMSTR_TRUE; + } + + /* Send buffer is full -> flush data */ + _FMSTR_SerialUsbFlush(); + + /* Check again, if buffer is not full */ + if (fmstr_usbCtx.txSize < sizeof(fmstr_usbCtx.txBuffer)) + { + return FMSTR_TRUE; + } + + /* Return false, when buffer is full and upper layer cannot call putChar function. */ + return FMSTR_FALSE; +} + +/****************************************************************************** + * + * @brief Returns TRUE if the receive register is full, and it's possible to get received char + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUsbIsReceiveRegFull(void) +{ + if (fmstr_usbCtx.rxEnabled != FMSTR_FALSE) + { + if(_FMSTR_RingBuffHasData(&fmstr_usbCtx.rxQueue) != FMSTR_FALSE) + { + return FMSTR_TRUE; + } + } + + return FMSTR_FALSE; +} + +/****************************************************************************** + * + * @brief Returns TRUE if the transmitter is still active + * + ******************************************************************************/ + +static FMSTR_BOOL _FMSTR_SerialUsbIsTransmitterActive(void) +{ + return fmstr_usbCtx.txActive; +} + +/****************************************************************************** + * + * @brief The function puts the char for transmit + * + ******************************************************************************/ + +static void _FMSTR_SerialUsbPutChar(FMSTR_BCHR ch) +{ + /* Make sure there is free space TX buffer before writing */ + if (fmstr_usbCtx.txSize >= sizeof(fmstr_usbCtx.txBuffer)) + { + return; + } + + fmstr_usbCtx.txBuffer[fmstr_usbCtx.txSize] = ch; + fmstr_usbCtx.txSize++; + + /* When buffer got just full, flush data now */ + if (fmstr_usbCtx.txSize == sizeof(fmstr_usbCtx.txBuffer)) + { + _FMSTR_SerialUsbFlush(); + } +} + +/****************************************************************************** + * + * @brief The function gets the received char + * + ******************************************************************************/ + +static FMSTR_BCHR _FMSTR_SerialUsbGetChar(void) +{ + /* Any data in receive buffer? */ + if (_FMSTR_RingBuffHasData(&fmstr_usbCtx.rxQueue) == FMSTR_FALSE) + { + return 0; + } + + return _FMSTR_RingBuffGet(&fmstr_usbCtx.rxQueue); +} + +/****************************************************************************** + * + * @brief The function send buffered data + * + ******************************************************************************/ + +static void _FMSTR_SerialUsbFlush(void) +{ + if (fmstr_usbCtx.txSize <= 0U) + { + return; + } + + /* Send data */ + if (fmstr_txFunc != NULL) + { + fmstr_usbCtx.txActive = FMSTR_TRUE; + + if (fmstr_txFunc(fmstr_usbCtx.txBuffer, fmstr_usbCtx.txSize) == FMSTR_FALSE) + { + fmstr_usbCtx.txActive = FMSTR_FALSE; + } + } +} + +/****************************************************************************** + * + * @brief Register read/write callbacks + * + ******************************************************************************/ + +void FMSTR_SerialUsbRegisterAppFunctions(FMSTR_TX_FUNC tx_func) +{ + fmstr_txFunc = tx_func; +} + +/****************************************************************************** + * + * @brief Calling from USB driver when data was received/sent + * + ******************************************************************************/ + +void FMSTR_SerialUsbProcessEvent(FMSTR_SERIAL_USBCDC_EVENT_TYPE type, FMSTR_U8 *data, FMSTR_U32 size) +{ + switch (type) + { + /* Data sent */ + case FMSTR_SERIAL_USBCDC_EVENT_TYPE_SENT: + if (fmstr_usbCtx.txActive != FMSTR_FALSE) + { + fmstr_usbCtx.txSize = 0; + fmstr_usbCtx.txActive = FMSTR_FALSE; + } + break; + + /* Data received */ + case FMSTR_SERIAL_USBCDC_EVENT_TYPE_RECEIVED: + /* Also check if size is sane. It may go invalid (e.g. "negative") on some unexpected events. */ + if (data != NULL && size < 0x10000UL) + { + for (FMSTR_U32 i = 0U; i < size; i++) + { + if (_FMSTR_RingBuffIsSpace(&fmstr_usbCtx.rxQueue) != FMSTR_FALSE) + { + _FMSTR_RingBuffPut(&fmstr_usbCtx.rxQueue, data[i]); + } + } + +/* If the data are received by USB (usually all at once) we must call ProcessSerial twice + to allow freemaster to decode packet and also to prepare and send the response. */ +#if FMSTR_LONG_INTR > 0 + FMSTR_ProcessSerial(); +#endif + } + break; + + default:; /* no action */ + break; + } + +#if FMSTR_LONG_INTR > 0 + FMSTR_ProcessSerial(); +#endif +} + +#else /* (!(FMSTR_DISABLE)) */ + +void FMSTR_SerialUsbRegisterAppFunctions(FMSTR_TX_FUNC tx_func) +{ + FMSTR_UNUSED(tx_func); +} + +void FMSTR_SerialUsbProcessEvent(FMSTR_SERIAL_USBCDC_EVENT_TYPE type, FMSTR_U8 *data, FMSTR_U32 size) +{ + FMSTR_UNUSED(type); + FMSTR_UNUSED(data); + FMSTR_UNUSED(size); +} + +void FMSTR_SerialIsr(void) +{ +} + +#endif /* (!(FMSTR_DISABLE)) */ +#endif /* (FMSTR_MK_IDSTR(FMSTR_SERIAL_DRV) == FMSTR_SERIAL_MCUX_USB_ID) */ diff --git a/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usb.h b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usb.h new file mode 100644 index 0000000..1ddd086 --- /dev/null +++ b/middleware/freemaster/src/drivers/mcuxsdk/serial/freemaster_serial_usb.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - low-level driver hooking the CDC class driver in USB stack + */ + +#ifndef __FREEMASTER_SERIAL_USBCDC_H +#define __FREEMASTER_SERIAL_USBCDC_H + +/****************************************************************************** + * Required header files include check + ******************************************************************************/ +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_serial_usb.h +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/* FreeMASTER Serial USB CDC event types. */ +typedef enum +{ + FMSTR_SERIAL_USBCDC_EVENT_TYPE_SENT, /* Interrupt type, that data was sent via USB CDC */ + FMSTR_SERIAL_USBCDC_EVENT_TYPE_RECEIVED, /* Interrupt type, that data was received from USB CDC */ +} FMSTR_SERIAL_USBCDC_EVENT_TYPE; + +/* Function for sending data via USB CDC. It must be registered from application. */ +typedef FMSTR_BOOL (*FMSTR_TX_FUNC)(FMSTR_U8 *data, FMSTR_U32 size); + +/****************************************************************************** + * inline functions + ******************************************************************************/ + +/****************************************************************************** + * Global API functions + ******************************************************************************/ + +/* Function for registering USB CDC transmit function. */ +void FMSTR_SerialUsbRegisterAppFunctions(FMSTR_TX_FUNC tx_func); +/* USB CDC event called from application into FreeMASTER serial interface. */ +void FMSTR_SerialUsbProcessEvent(FMSTR_SERIAL_USBCDC_EVENT_TYPE type, FMSTR_U8 *data, FMSTR_U32 size); + +#ifdef __cplusplus +} +#endif + +/**************************************************************************************** + * Global variable declaration + *****************************************************************************************/ + +#endif /* __FREEMASTER_SERIAL_USBCDC_H */ diff --git a/middleware/freemaster/src/drivers/readme.txt b/middleware/freemaster/src/drivers/readme.txt new file mode 100644 index 0000000..0445c38 --- /dev/null +++ b/middleware/freemaster/src/drivers/readme.txt @@ -0,0 +1,16 @@ +Files in this folder implement low-level transport layer of FreeMASTER communication driver. + +There are different driver implementations for each kind of communication module (UART, LPUART, +SCI, FlexCAN, MCAN, msCAN, ..). Also there are multiple implementations depending on what SDK +is used to access peripheral registers and other processor resources. + +The top level folder group the drivers by the SDK selected: + + - ampxsdk/ .. AMP SDK targeting the S32K family of microcontrollers + - mcuxsdk/ .. MCUXpresso SDK targeting Kinetis, LPC and i.MX-RT families (http://mcuxpresso.nxp.com) + - dreg/ .. no dependency on any SDK, the drivers in this folder use direct register access + + + Use the FMSTR_SERIAL_DRV or FMSTR_CAN_DRV configuration option in application-specific freemaster_cfg.h + file to select what low-level driver is actually linked and used in your application. + \ No newline at end of file diff --git a/middleware/freemaster/src/platforms/56f800e/freemaster_56f800e.h b/middleware/freemaster/src/platforms/56f800e/freemaster_56f800e.h new file mode 100644 index 0000000..20b6e53 --- /dev/null +++ b/middleware/freemaster/src/platforms/56f800e/freemaster_56f800e.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - DSC 56F800E platform specific code + */ + +#ifndef _FREEMASTER_56F800E_H +#define _FREEMASTER_56F800E_H + +#include +#include + +/****************************************************************************** + * platform-specific default configuration + ******************************************************************************/ + +#define FMSTR_CFG_BUS_WIDTH 1U /* all addressing uses .bp byte-addressing mode on 56F800e family */ +#define FMSTR_TSA_FLAGS FMSTR_TSA_INFO_HV2BA +#define FMSTR_PLATFORM_BIG_ENDIAN 0U +#define FMSTR_MEMCPY_MAX_SIZE 4U +#define FMSTR_REC_STRUCT_ALIGN 8U + +#ifndef FMSTR_PLATFORM_BASE_ADDRESS +/* #define FMSTR_PLATFORM_BASE_ADDRESS 0 */ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/* FreeMASTER types used */ +typedef unsigned char + *FMSTR_ADDR; /* CPU address size depends on memory model 16 or 32 bits. We use "bp" address on DSC. */ +typedef unsigned int FMSTR_SIZE; /* general size type (at least 16 bits) */ +typedef unsigned int FMSTR_SIZE8; /* one-byte size value */ +typedef unsigned long FMSTR_SIZE32; /* general size type (at least size of address (typicaly 32bits)) */ +typedef unsigned int FMSTR_BOOL; /* general boolean type */ + +typedef unsigned char FMSTR_U8; /* smallest memory entity */ +typedef unsigned short FMSTR_U16; /* 16bit value */ +typedef unsigned long FMSTR_U32; /* 32bit value */ +typedef unsigned long long FMSTR_U64; /* 64bit value */ + +typedef signed char FMSTR_S8; /* signed 8bit value */ +typedef signed short FMSTR_S16; /* signed 16bit value */ +typedef signed long FMSTR_S32; /* signed 32bit value */ +typedef signed long long FMSTR_S64; /* signed 64bit value */ + +typedef float FMSTR_FLOAT; /* float value */ +typedef double FMSTR_DOUBLE; /* double value */ + +typedef unsigned char FMSTR_FLAGS; /* type to be union-ed with flags (at least 8 bits) */ +typedef signed int FMSTR_INDEX; /* general for-loop index (must be signed) */ + +typedef unsigned char FMSTR_BCHR; /* type of a single character in comm.buffer */ +typedef unsigned char *FMSTR_BPTR; /* pointer within a communication buffer */ + +typedef char FMSTR_CHAR; /* regular character, part of string */ + +#ifdef __cplusplus +} +#endif + +/********************************************************************************* + * Platform depending functionalities + *********************************************************************************/ + +#if 0 /* Uncomment to take standard C functions taken from stdlib */ +#define FMSTR_StrLen(str) ((FMSTR_SIZE)strlen(str)) +#define FMSTR_StrCmp(str1, str2) ((FMSTR_INDEX)strcmp(str1, str2)) +#define FMSTR_MemCmp(b1, b2, size) ((FMSTR_INDEX)memcmp(b1, b2, size)) +#define FMSTR_MemSet(dest, mask, size) memset(dest, mask, size) +#endif + +/* Rand is taken from stdlib */ +#define FMSTR_Rand() rand() + +#endif /* _FREEMASTER_56F800E_H */ diff --git a/middleware/freemaster/src/platforms/gen32be/freemaster_gen32be.h b/middleware/freemaster/src/platforms/gen32be/freemaster_gen32be.h new file mode 100644 index 0000000..1823215 --- /dev/null +++ b/middleware/freemaster/src/platforms/gen32be/freemaster_gen32be.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Generic 32-bit big-endian platform specific code + */ + +#ifndef _FREEMASTER_GEN32BE_H +#define _FREEMASTER_GEN32BE_H + +#include +#include + +/****************************************************************************** + * platform-specific default configuration + ******************************************************************************/ + +#define FMSTR_CFG_BUS_WIDTH 1U +#define FMSTR_TSA_FLAGS 0U +#define FMSTR_PLATFORM_BIG_ENDIAN 1U +#define FMSTR_MEMCPY_MAX_SIZE 4U + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/* FreeMASTER types used */ +typedef unsigned char *FMSTR_ADDR; /* CPU address type (4bytes) */ +typedef unsigned int FMSTR_SIZE; /* general size type (at least 16 bits) */ +typedef unsigned char FMSTR_SIZE8; /* one-byte size value */ +typedef unsigned long FMSTR_SIZE32; /* general size type (at least size of address (typicaly 32bits)) */ +typedef unsigned int FMSTR_BOOL; /* general boolean type */ + +typedef unsigned char FMSTR_U8; /* smallest memory entity */ +typedef unsigned short FMSTR_U16; /* 16bit value */ +typedef unsigned long FMSTR_U32; /* 32bit value */ +typedef unsigned long long FMSTR_U64; /* 64bit value */ + +typedef signed char FMSTR_S8; /* signed 8bit value */ +typedef signed short FMSTR_S16; /* signed 16bit value */ +typedef signed long FMSTR_S32; /* signed 32bit value */ +typedef signed long long FMSTR_S64; /* signed 64bit value */ + +typedef float FMSTR_FLOAT; /* float value */ +typedef double FMSTR_DOUBLE; /* double value */ + +typedef unsigned char FMSTR_FLAGS; /* type to be union-ed with flags (at least 8 bits) */ +typedef signed int FMSTR_INDEX; /* general for-loop index (must be signed) */ + +typedef unsigned char FMSTR_BCHR; /* type of a single character in comm.buffer */ +typedef unsigned char *FMSTR_BPTR; /* pointer within a communication buffer */ + +typedef char FMSTR_CHAR; /* regular character, part of string */ + +#ifdef __cplusplus +} +#endif + +/********************************************************************************* + * Platform depending functionalities + *********************************************************************************/ + +#if 0 /* Uncomment to take standard C functions taken from stdlib */ +#define FMSTR_StrLen(str) ((FMSTR_SIZE)strlen(str)) +#define FMSTR_StrCmp(str1, str2) ((FMSTR_INDEX)strcmp(str1, str2)) +#define FMSTR_MemCmp(b1, b2, size) ((FMSTR_INDEX)memcmp(b1, b2, size)) +#define FMSTR_MemSet(dest, mask, size) memset(dest, mask, size) +#endif + +/* Rand is taken from stdlib */ +#define FMSTR_Rand() rand() + +#endif /* _FREEMASTER_GEN32BE_H */ diff --git a/middleware/freemaster/src/platforms/gen32le/freemaster_gen32le.h b/middleware/freemaster/src/platforms/gen32le/freemaster_gen32le.h new file mode 100644 index 0000000..d9bd1bf --- /dev/null +++ b/middleware/freemaster/src/platforms/gen32le/freemaster_gen32le.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_NXP_Software_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_NXP_Software_License.pdf + * + * FreeMASTER Communication Driver - Generic 32-bit little endian platform specific code + */ + +#ifndef _FREEMASTER_GEN32LE_H +#define _FREEMASTER_GEN32LE_H + +#include +#include + +/****************************************************************************** + * platform-specific default configuration + ******************************************************************************/ + +#define FMSTR_CFG_BUS_WIDTH 1U +#define FMSTR_TSA_FLAGS 0U +#define FMSTR_PLATFORM_BIG_ENDIAN 0U +#define FMSTR_MEMCPY_MAX_SIZE 4U + +#ifndef FMSTR_PLATFORM_BASE_ADDRESS +/* Use Cortex-M memory base address as a default for optimized access. */ +#define FMSTR_PLATFORM_BASE_ADDRESS 0x20000000L +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/* FreeMASTER types used */ +typedef unsigned char *FMSTR_ADDR; /* CPU address type (4bytes) */ +typedef unsigned int FMSTR_SIZE; /* general size type (at least 16 bits) */ +typedef unsigned char FMSTR_SIZE8; /* one-byte size value */ +typedef unsigned long FMSTR_SIZE32; /* general size type (at least size of address (typicaly 32bits)) */ +typedef unsigned int FMSTR_BOOL; /* general boolean type */ + +typedef unsigned char FMSTR_U8; /* smallest memory entity */ +typedef unsigned short FMSTR_U16; /* 16bit value */ +typedef unsigned long FMSTR_U32; /* 32bit value */ +typedef unsigned long long FMSTR_U64; /* 64bit value */ + +typedef signed char FMSTR_S8; /* signed 8bit value */ +typedef signed short FMSTR_S16; /* signed 16bit value */ +typedef signed long FMSTR_S32; /* signed 32bit value */ +typedef signed long long FMSTR_S64; /* signed 64bit value */ + +typedef float FMSTR_FLOAT; /* float value */ +typedef double FMSTR_DOUBLE; /* double value */ + +typedef unsigned char FMSTR_FLAGS; /* type to be union-ed with flags (at least 8 bits) */ +typedef signed int FMSTR_INDEX; /* general for-loop index (must be signed) */ + +typedef unsigned char FMSTR_BCHR; /* type of a single character in comm.buffer */ +typedef unsigned char *FMSTR_BPTR; /* pointer within a communication buffer */ + +typedef char FMSTR_CHAR; /* regular character, part of string */ + +#ifdef __cplusplus +} +#endif + +/********************************************************************************* + * Platform dependent functions + *********************************************************************************/ + +#if 0 /* Uncomment to take standard C functions taken from stdlib */ +#define FMSTR_StrLen(str) ((FMSTR_SIZE)strlen(str)) +#define FMSTR_StrCmp(str1, str2) ((FMSTR_INDEX)strcmp(str1, str2)) +#define FMSTR_MemCmp(b1, b2, size) ((FMSTR_INDEX)memcmp(b1, b2, size)) +#define FMSTR_MemSet(dest, mask, size) memset(dest, mask, size) +#endif + +/* Rand is taken from stdlib */ +#define FMSTR_Rand() rand() + +#endif /* _FREEMASTER_GEN32LE_H */ diff --git a/middleware/freemaster/src/platforms/s12z/freemaster_s12z.h b/middleware/freemaster/src/platforms/s12z/freemaster_s12z.h new file mode 100644 index 0000000..6e422af --- /dev/null +++ b/middleware/freemaster/src/platforms/s12z/freemaster_s12z.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * License: NXP LA_OPT_Base_License + * + * NXP Confidential. This software is owned or controlled by NXP and may + * only be used strictly in accordance with the applicable license terms. + * By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that + * you have read, and that you agree to comply with and are bound by, + * such license terms. If you do not agree to be bound by the applicable + * license terms, then you may not retain, install, activate or otherwise + * use the software. This code may only be used in a microprocessor, + * microcontroller, sensor or digital signal processor ("NXP Product") + * supplied directly or indirectly from NXP. See the full NXP Software + * License Agreement in license/LA_OPT_Base_License.pdf + * + * FreeMASTER Communication Driver - Generic 32-bit little endian platform specific code + */ + +#ifndef _FREEMASTER_S12Z_H +#define _FREEMASTER_S12Z_H + +#include +#include + +/***************************************************************************** + * Plaform configuration + ******************************************************************************/ + +#define FMSTR_CFG_BUS_WIDTH 1U +#define FMSTR_TSA_FLAGS 0U +#define FMSTR_PLATFORM_BIG_ENDIAN 1U +#define FMSTR_MEMCPY_MAX_SIZE 1U + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * Types definition + ******************************************************************************/ + +/* FreeMASTER types used */ +typedef unsigned char *FMSTR_ADDR; /* CPU address type (3 bytes) */ +typedef unsigned int FMSTR_SIZE; /* general size type (at least 16 bits) */ +typedef unsigned char FMSTR_SIZE8; /* one-byte size value */ +typedef unsigned long FMSTR_SIZE32; /* general size type (at least size of address) */ +typedef unsigned char FMSTR_BOOL; /* general boolean type */ + +typedef unsigned char FMSTR_U8; /* smallest memory entity */ +typedef unsigned short FMSTR_U16; /* 16bit value */ +typedef unsigned long FMSTR_U32; /* 32bit value */ +typedef unsigned long long FMSTR_U64; /* 64bit value */ + +typedef signed char FMSTR_S8; /* signed 8bit value */ +typedef signed short FMSTR_S16; /* signed 16bit value */ +typedef signed long FMSTR_S32; /* signed 32bit value */ +typedef signed long long FMSTR_S64; /* signed 64bit value */ + +typedef float FMSTR_FLOAT; /* float value */ +typedef double FMSTR_DOUBLE; /* double value */ + +typedef unsigned char FMSTR_FLAGS; /* type to be union-ed with flags (at least 8 bits) */ +typedef signed int FMSTR_INDEX; /* general for-loop index (must be signed) */ + +typedef unsigned char FMSTR_BCHR; /* type of a single character in comm.buffer */ +typedef unsigned char *FMSTR_BPTR; /* pointer within a communication buffer */ + +typedef char FMSTR_CHAR; /* regular character, part of string */ + +#ifdef __cplusplus +} +#endif + +/********************************************************************************* + * Platform depending functionalities + *********************************************************************************/ + +#if 0 /* Take standard C functions taken from stdlib */ +#define FMSTR_StrLen(str) ((FMSTR_SIZE)strlen(str)) +#define FMSTR_StrCmp(str1, str2) ((FMSTR_INDEX)strcmp(str1, str2)) +#define FMSTR_MemCmp(b1, b2, size) ((FMSTR_INDEX)memcmp(b1, b2, size)) +#define FMSTR_MemSet(dest, mask, size) memset(dest, mask, size) +#endif + +/* Rand is taken from stdlib */ +#define FMSTR_Rand() rand() + +#endif /* _FREEMASTER_GEN32LE_H */ diff --git a/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb.c b/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb.c new file mode 100644 index 0000000..67ad982 --- /dev/null +++ b/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb.c @@ -0,0 +1,556 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - USB Example Implementation + */ + +#include "freemaster.h" +#include "freemaster_serial_usb.h" + +#include +#include + +#include "usb_device_config.h" +#include "usb.h" +#include "usb_device.h" + +#include "usb_device_class.h" +#include "usb_device_cdc_acm.h" +#include "usb_device_ch9.h" + +#include "freemaster_usb_device_descriptor.h" +#include "freemaster_usb.h" + +#if (defined(FSL_FEATURE_SOC_SYSMPU_COUNT) && (FSL_FEATURE_SOC_SYSMPU_COUNT > 0U)) +#include "fsl_sysmpu.h" +#endif /* FSL_FEATURE_SOC_SYSMPU_COUNT */ + +#if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0) +#include "usb_phy.h" +#endif + +/* Currently configured line coding */ +#define LINE_CODING_SIZE (0x07) +#define LINE_CODING_DTERATE (115200) +#define LINE_CODING_CHARFORMAT (0x00) +#define LINE_CODING_PARITYTYPE (0x00) +#define LINE_CODING_DATABITS (0x08) + +/* Communications feature */ +#define COMM_FEATURE_DATA_SIZE (0x02) +#define STATUS_ABSTRACT_STATE (0x0000) +#define COUNTRY_SETTING (0x0000) + +/* Notification of serial state */ +#define NOTIF_PACKET_SIZE (0x08) +#define UART_BITMAP_SIZE (0x02) +#define NOTIF_REQUEST_TYPE (0xA1) + +/****************************************************************************** + * Local functions + ******************************************************************************/ + +static void USB_DeviceIsrEnable(void); +static FMSTR_BOOL _FMSTR_UsbTxFunction(FMSTR_U8 *data, FMSTR_U32 size); +static usb_status_t USB_DeviceCdcVcomCallback(class_handle_t handle, uint32_t event, void *param); +static usb_status_t USB_DeviceCallback(usb_device_handle handle, uint32_t event, void *param); + +void USB_MCU_INT_HANDLER(void); + +/****************************************************************************** + * Type definitions + ******************************************************************************/ + +/* Define the information relates to abstract control model */ +typedef struct _usb_cdc_acm_info +{ + uint8_t serialStateBuf[NOTIF_PACKET_SIZE + UART_BITMAP_SIZE]; /* Serial state buffer of the CDC device to notify the + serial state to host. */ + bool dtePresent; /* A flag to indicate whether DTE is present. */ + uint16_t breakDuration; /* Length of time in milliseconds of the break signal */ + uint8_t dteStatus; /* Status of data terminal equipment */ + uint8_t currentInterface; /* Current interface index. */ + uint16_t uartState; /* UART state of the CDC device. */ +} usb_cdc_acm_info_t; + +typedef struct +{ + usb_device_handle deviceHandle; /* USB device handle. */ + class_handle_t cdcAcmHandle; /* USB CDC ACM class handle. */ + volatile uint8_t attach; /* A flag to indicate whether a usb device is attached. 1: attached, 0: not attached */ + uint8_t speed; /* Speed of USB device. USB_SPEED_FULL/USB_SPEED_LOW/USB_SPEED_HIGH. */ + uint8_t currentConfiguration; /* Current configuration value. */ + uint8_t currentInterfaceAlternateSetting[USB_CDC_VCOM_INTERFACE_COUNT]; /* Current alternate setting value for each + interface. */ + volatile uint8_t + startTransactions; /* A flag to indicate whether a CDC device is ready to transmit and receive data. */ + +} FMSTR_EXAMPLE_USB_CTX; + +/****************************************************************************** + * Local variables + ******************************************************************************/ + +/* Line coding of cdc device */ +USB_DMA_INIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) +static uint8_t s_lineCoding[LINE_CODING_SIZE] = { + /* E.g. 0x00,0xC2,0x01,0x00 : 0x0001C200 is 115200 bits per second */ + (LINE_CODING_DTERATE >> 0U) & 0x000000FFU, + (LINE_CODING_DTERATE >> 8U) & 0x000000FFU, + (LINE_CODING_DTERATE >> 16U) & 0x000000FFU, + (LINE_CODING_DTERATE >> 24U) & 0x000000FFU, + LINE_CODING_CHARFORMAT, + LINE_CODING_PARITYTYPE, + LINE_CODING_DATABITS}; + +/* Abstract state of cdc device */ +USB_DMA_INIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) +static uint8_t s_abstractState[COMM_FEATURE_DATA_SIZE] = {(STATUS_ABSTRACT_STATE >> 0U) & 0x00FFU, + (STATUS_ABSTRACT_STATE >> 8U) & 0x00FFU}; + +/* Country code of cdc device */ +USB_DMA_INIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) +static uint8_t s_countryCode[COMM_FEATURE_DATA_SIZE] = {(COUNTRY_SETTING >> 0U) & 0x00FFU, + (COUNTRY_SETTING >> 8U) & 0x00FFU}; + +/* Class contxt information */ +USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) usb_cdc_acm_info_t s_usbCdcAcmInfo; + +/* Shared Rx/Tx buffer used to exchange data with FreeMASTER driver */ +USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) static uint8_t s_usbRxTxBuff[USB_DATA_BUFF_SIZE]; + +extern usb_device_endpoint_struct_t g_UsbDeviceCdcVcomDicEndpoints[]; +extern usb_device_class_struct_t g_UsbDeviceCdcVcomConfig; + +/* USB device class information */ +static usb_device_class_config_struct_t s_cdcAcmConfig[1] = {{ + USB_DeviceCdcVcomCallback, + 0, + &g_UsbDeviceCdcVcomConfig, +}}; + +/* USB device class configuration information */ +static usb_device_class_config_list_struct_t s_cdcAcmConfigList = { + s_cdcAcmConfig, + USB_DeviceCallback, + 1, +}; + +/* context data that this application needs to handle USB communication */ +static FMSTR_EXAMPLE_USB_CTX _fmstr_exampleUsbCtx; + +/****************************************************************************** + * API functions + ******************************************************************************/ + +/* Initializiation of the USB stack */ +FMSTR_BOOL FMSTR_ExampleUsbInit(void) +{ + memset(&_fmstr_exampleUsbCtx, 0, sizeof(_fmstr_exampleUsbCtx)); + +#if (defined(FSL_FEATURE_SOC_SYSMPU_COUNT) && (FSL_FEATURE_SOC_SYSMPU_COUNT > 0U)) + SYSMPU_Enable(SYSMPU, 0); +#endif /* FSL_FEATURE_SOC_SYSMPU_COUNT */ + + _fmstr_exampleUsbCtx.speed = USB_SPEED_FULL; + _fmstr_exampleUsbCtx.attach = 0; + _fmstr_exampleUsbCtx.cdcAcmHandle = (class_handle_t)NULL; + _fmstr_exampleUsbCtx.deviceHandle = NULL; + + if (kStatus_USB_Success != + USB_DeviceClassInit(CONTROLLER_ID, &s_cdcAcmConfigList, &_fmstr_exampleUsbCtx.deviceHandle)) + { + return FMSTR_FALSE; + } + else + { + _fmstr_exampleUsbCtx.cdcAcmHandle = s_cdcAcmConfigList.config->classHandle; + } + + USB_DeviceIsrEnable(); + + USB_DeviceRun(_fmstr_exampleUsbCtx.deviceHandle); + + FMSTR_SerialUsbRegisterAppFunctions(_FMSTR_UsbTxFunction); + + return FMSTR_TRUE; +} + +/****************************************************************************** + * Local functions + ******************************************************************************/ + +/* This function is called from FreeMASTER, when any data to send. */ +static FMSTR_BOOL _FMSTR_UsbTxFunction(FMSTR_U8 *data, FMSTR_U32 size) +{ + usb_status_t error = kStatus_USB_Error; + + /* Check if sane data used */ + if (!data || !size || size > USB_DATA_BUFF_SIZE) + return FMSTR_FALSE; + /* Check if USB attached */ + if (!data || !size || size > USB_DATA_BUFF_SIZE || _fmstr_exampleUsbCtx.attach != 1) + return FMSTR_FALSE; + + /* We use the shared rx/tx memory to make sure the cached/uncached memory is used. + FreeMASTER uses half-duplex communication anyway. */ + memcpy(s_usbRxTxBuff, data, size); + + /* Send data via USB CDC */ + error = USB_DeviceCdcAcmSend(_fmstr_exampleUsbCtx.cdcAcmHandle, USB_CDC_VCOM_BULK_IN_ENDPOINT, s_usbRxTxBuff, size); + if (error != kStatus_USB_Success) + return FMSTR_FALSE; + + return FMSTR_TRUE; +} + +static usb_status_t USB_DeviceCdcVcomCallback(class_handle_t handle, uint32_t event, void *param) +{ + uint32_t len; + uint8_t *uartBitmap; + usb_device_cdc_acm_request_param_struct_t *acmReqParam; + usb_device_endpoint_callback_message_struct_t *epCbParam; + usb_status_t error = kStatus_USB_InvalidRequest; + usb_cdc_acm_info_t *acmInfo = &s_usbCdcAcmInfo; + acmReqParam = (usb_device_cdc_acm_request_param_struct_t *)param; + epCbParam = (usb_device_endpoint_callback_message_struct_t *)param; + switch (event) + { + case kUSB_DeviceCdcEventSendResponse: + { + if ((epCbParam->length != 0) && (!(epCbParam->length % g_UsbDeviceCdcVcomDicEndpoints[0].maxPacketSize))) + { + /* If the last packet is the size of endpoint, then send also zero-ended packet, + ** meaning that we want to inform the host that we do not have any additional + ** data, so it can flush the output. + */ + error = USB_DeviceCdcAcmSend(handle, USB_CDC_VCOM_BULK_IN_ENDPOINT, NULL, 0); + } + else if ((1 == _fmstr_exampleUsbCtx.attach)) + { + if ((epCbParam->buffer != NULL) || ((epCbParam->buffer == NULL) && (epCbParam->length == 0))) + { + /* Schedule buffer for next receive event */ + error = USB_DeviceCdcAcmRecv(handle, USB_CDC_VCOM_BULK_OUT_ENDPOINT, s_usbRxTxBuff, + g_UsbDeviceCdcVcomDicEndpoints[0].maxPacketSize); + /* FreeMASTER send complete event */ + FMSTR_SerialUsbProcessEvent(FMSTR_SERIAL_USBCDC_EVENT_TYPE_SENT, NULL, 0); + } + } + else + { + } + } + break; + case kUSB_DeviceCdcEventRecvResponse: + { + if ((1 == _fmstr_exampleUsbCtx.attach)) + { + /* Call Freemaster interrupt with received data */ + FMSTR_SerialUsbProcessEvent(FMSTR_SERIAL_USBCDC_EVENT_TYPE_RECEIVED, (FMSTR_U8 *)s_usbRxTxBuff, + epCbParam->length); + /* Schedule buffer for next receive event */ + error = USB_DeviceCdcAcmRecv(handle, USB_CDC_VCOM_BULK_OUT_ENDPOINT, s_usbRxTxBuff, + g_UsbDeviceCdcVcomDicEndpoints[0].maxPacketSize); + } + } + break; + case kUSB_DeviceCdcEventSerialStateNotif: + ((usb_device_cdc_acm_struct_t *)handle)->hasSentState = 0; + error = kStatus_USB_Success; + break; + case kUSB_DeviceCdcEventSendEncapsulatedCommand: + break; + case kUSB_DeviceCdcEventGetEncapsulatedResponse: + break; + case kUSB_DeviceCdcEventSetCommFeature: + if (USB_DEVICE_CDC_FEATURE_ABSTRACT_STATE == acmReqParam->setupValue) + { + if (1 == acmReqParam->isSetup) + { + *(acmReqParam->buffer) = s_abstractState; + *(acmReqParam->length) = sizeof(s_abstractState); + } + else + { + /* no action, data phase, s_abstractState has been assigned */ + } + error = kStatus_USB_Success; + } + else if (USB_DEVICE_CDC_FEATURE_COUNTRY_SETTING == acmReqParam->setupValue) + { + if (1 == acmReqParam->isSetup) + { + *(acmReqParam->buffer) = s_countryCode; + *(acmReqParam->length) = sizeof(s_countryCode); + } + else + { + /* no action, data phase, s_countryCode has been assigned */ + } + error = kStatus_USB_Success; + } + else + { + /* no action, return kStatus_USB_InvalidRequest */ + } + break; + case kUSB_DeviceCdcEventGetCommFeature: + if (USB_DEVICE_CDC_FEATURE_ABSTRACT_STATE == acmReqParam->setupValue) + { + *(acmReqParam->buffer) = s_abstractState; + *(acmReqParam->length) = COMM_FEATURE_DATA_SIZE; + error = kStatus_USB_Success; + } + else if (USB_DEVICE_CDC_FEATURE_COUNTRY_SETTING == acmReqParam->setupValue) + { + *(acmReqParam->buffer) = s_countryCode; + *(acmReqParam->length) = COMM_FEATURE_DATA_SIZE; + error = kStatus_USB_Success; + } + else + { + /* no action, return kStatus_USB_InvalidRequest */ + } + break; + case kUSB_DeviceCdcEventClearCommFeature: + break; + case kUSB_DeviceCdcEventGetLineCoding: + *(acmReqParam->buffer) = s_lineCoding; + *(acmReqParam->length) = LINE_CODING_SIZE; + error = kStatus_USB_Success; + break; + case kUSB_DeviceCdcEventSetLineCoding: + { + if (1 == acmReqParam->isSetup) + { + *(acmReqParam->buffer) = s_lineCoding; + *(acmReqParam->length) = sizeof(s_lineCoding); + } + else + { + /* no action, data phase, s_lineCoding has been assigned */ + } + error = kStatus_USB_Success; + } + break; + case kUSB_DeviceCdcEventSetControlLineState: + { + s_usbCdcAcmInfo.dteStatus = acmReqParam->setupValue; + /* activate/deactivate Tx carrier */ + if (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_CARRIER_ACTIVATION) + { + acmInfo->uartState |= USB_DEVICE_CDC_UART_STATE_TX_CARRIER; + } + else + { + acmInfo->uartState &= (uint16_t)~USB_DEVICE_CDC_UART_STATE_TX_CARRIER; + } + + /* Activate carrier and DTE. Com port of terminal tool running on PC is open now */ + if (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_DTE_PRESENCE) + { + acmInfo->uartState |= USB_DEVICE_CDC_UART_STATE_RX_CARRIER; + } + /* Com port of terminal tool running on PC is closed now */ + else + { + acmInfo->uartState &= (uint16_t)~USB_DEVICE_CDC_UART_STATE_RX_CARRIER; + } + + /* Indicates to DCE if DTE is present or not */ + acmInfo->dtePresent = (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_DTE_PRESENCE) ? true : false; + + /* Initialize the serial state buffer */ + acmInfo->serialStateBuf[0] = NOTIF_REQUEST_TYPE; /* bmRequestType */ + acmInfo->serialStateBuf[1] = USB_DEVICE_CDC_NOTIF_SERIAL_STATE; /* bNotification */ + acmInfo->serialStateBuf[2] = 0x00; /* wValue */ + acmInfo->serialStateBuf[3] = 0x00; + acmInfo->serialStateBuf[4] = 0x00; /* wIndex */ + acmInfo->serialStateBuf[5] = 0x00; + acmInfo->serialStateBuf[6] = UART_BITMAP_SIZE; /* wLength */ + acmInfo->serialStateBuf[7] = 0x00; + /* Notify to host the line state */ + acmInfo->serialStateBuf[4] = acmReqParam->interfaceIndex; + /* Lower byte of UART BITMAP */ + uartBitmap = (uint8_t *)&acmInfo->serialStateBuf[NOTIF_PACKET_SIZE + UART_BITMAP_SIZE - 2]; + uartBitmap[0] = acmInfo->uartState & 0xFFu; + uartBitmap[1] = (acmInfo->uartState >> 8) & 0xFFu; + len = (uint32_t)(NOTIF_PACKET_SIZE + UART_BITMAP_SIZE); + if (0 == ((usb_device_cdc_acm_struct_t *)handle)->hasSentState) + { + error = USB_DeviceCdcAcmSend(handle, USB_CDC_VCOM_INTERRUPT_IN_ENDPOINT, acmInfo->serialStateBuf, len); + if (kStatus_USB_Success != error) + { + usb_echo("kUSB_DeviceCdcEventSetControlLineState error!"); + } + ((usb_device_cdc_acm_struct_t *)handle)->hasSentState = 1; + } + else + { + error = kStatus_USB_Success; + } + + /* Update status */ + if (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_CARRIER_ACTIVATION) + { + /* CARRIER_ACTIVATED */ + } + else + { + /* CARRIER_DEACTIVATED */ + } + if (acmInfo->dteStatus & USB_DEVICE_CDC_CONTROL_SIG_BITMAP_DTE_PRESENCE) + { + /* DTE_ACTIVATED */ + if (1 == _fmstr_exampleUsbCtx.attach) + { + _fmstr_exampleUsbCtx.startTransactions = 1; +#if defined(FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED) && (FSL_FEATURE_USB_KHCI_KEEP_ALIVE_ENABLED > 0U) && \ + defined(USB_DEVICE_CONFIG_KEEP_ALIVE_MODE) && (USB_DEVICE_CONFIG_KEEP_ALIVE_MODE > 0U) && \ + defined(FSL_FEATURE_USB_KHCI_USB_RAM) && (FSL_FEATURE_USB_KHCI_USB_RAM > 0U) + s_waitForDataReceive = 1; + USB0->INTEN &= ~USB_INTEN_SOFTOKEN_MASK; + s_comOpen = 1; + usb_echo("USB_APP_CDC_DTE_ACTIVATED\r\n"); +#endif + } + } + else + { + /* DTE_DEACTIVATED */ + if (1 == _fmstr_exampleUsbCtx.attach) + { + _fmstr_exampleUsbCtx.startTransactions = 0; + } + } + } + break; + case kUSB_DeviceCdcEventSendBreak: + break; + default: + break; + } + + if (error && error != kStatus_USB_Busy) + usb_echo("USB Error: %d, event: %d.\n", error, event); + + return error; +} + +static usb_status_t USB_DeviceCallback(usb_device_handle handle, uint32_t event, void *param) +{ + usb_status_t error = kStatus_USB_InvalidRequest; + uint16_t *temp16 = (uint16_t *)param; + uint8_t *temp8 = (uint8_t *)param; + + switch (event) + { + case kUSB_DeviceEventBusReset: + { + _fmstr_exampleUsbCtx.attach = 0; + _fmstr_exampleUsbCtx.currentConfiguration = 0U; + error = kStatus_USB_Success; +#if (defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U)) || \ + (defined(USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS > 0U)) + /* Get USB speed to configure the device, including max packet size and interval of the endpoints. */ + if (kStatus_USB_Success == USB_DeviceClassGetSpeed(CONTROLLER_ID, &_fmstr_exampleUsbCtx.speed)) + { + USB_DeviceSetSpeed(handle, _fmstr_exampleUsbCtx.speed); + } +#endif + } + break; + case kUSB_DeviceEventSetConfiguration: + if (0U == (*temp8)) + { + _fmstr_exampleUsbCtx.attach = 0; + _fmstr_exampleUsbCtx.currentConfiguration = 0U; + error = kStatus_USB_Success; + } + else if (USB_CDC_VCOM_CONFIGURE_INDEX == (*temp8)) + { + _fmstr_exampleUsbCtx.attach = 1; + _fmstr_exampleUsbCtx.currentConfiguration = *temp8; + error = kStatus_USB_Success; + /* Schedule buffer for receive */ + USB_DeviceCdcAcmRecv(_fmstr_exampleUsbCtx.cdcAcmHandle, USB_CDC_VCOM_BULK_OUT_ENDPOINT, s_usbRxTxBuff, + g_UsbDeviceCdcVcomDicEndpoints[0].maxPacketSize); + } + else + { + /* no action, return kStatus_USB_InvalidRequest */ + } + break; + case kUSB_DeviceEventSetInterface: + if (_fmstr_exampleUsbCtx.attach) + { + uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U); + uint8_t alternateSetting = (uint8_t)(*temp16 & 0x00FFU); + if (interface < USB_CDC_VCOM_INTERFACE_COUNT) + { + _fmstr_exampleUsbCtx.currentInterfaceAlternateSetting[interface] = alternateSetting; + error = kStatus_USB_Success; + } + } + break; + case kUSB_DeviceEventGetConfiguration: + break; + case kUSB_DeviceEventGetInterface: + break; + case kUSB_DeviceEventGetDeviceDescriptor: + if (param) + { + error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param); + } + break; + case kUSB_DeviceEventGetConfigurationDescriptor: + if (param) + { + error = USB_DeviceGetConfigurationDescriptor(handle, + (usb_device_get_configuration_descriptor_struct_t *)param); + } + break; + case kUSB_DeviceEventGetStringDescriptor: + if (param) + { + /* Get device string descriptor request */ + error = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param); + } + break; + default: + break; + } + + return error; +} + +void USB_MCU_INT_HANDLER(void) +{ + USB_INTERRUPT_HANDLER(_fmstr_exampleUsbCtx.deviceHandle); + +#ifdef __CORE_CM4_H_GENERIC + /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping + exception return operation might vector to incorrect interrupt */ + __DSB(); +#endif +} + +/* Most of SDK-supported parts are CortexM devices with NVIC controller. + * All other platforms (e.g. DSC) enable the USB interrupt in the main application code. */ +#ifdef __NVIC_PRIO_BITS +static void USB_DeviceIsrEnable(void) +{ + uint8_t irqNumber; + uint8_t usbDeviceIrq[] = USB_IRQS_LIST; + + irqNumber = usbDeviceIrq[USB_CONTROLLER_IX]; + + /* Install isr, set priority, and enable IRQ. */ + NVIC_SetPriority((IRQn_Type)irqNumber, USB_DEVICE_INTERRUPT_PRIORITY); + EnableIRQ((IRQn_Type)irqNumber); +} +#endif diff --git a/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb.h b/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb.h new file mode 100644 index 0000000..bb6a115 --- /dev/null +++ b/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - USB Example Implementation + */ + +#ifndef __FREEMASTER_EXAMPLE_USB_H +#define __FREEMASTER_EXAMPLE_USB_H + +#ifndef __FREEMASTER_H +#error Please include the freemaster.h master header file before the freemaster_usb.h +#endif + +#ifndef _USB_DEVICE_CONFIG_H_ +#error Please include the usb_device_config.h master header file before the freemaster_usb.h +#endif + +#if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0) +#define USB_INTERRUPT_HANDLER USB_DeviceEhciIsrFunction +#define USB_DATA_BUFF_SIZE HS_CDC_VCOM_BULK_OUT_PACKET_SIZE + +#endif +#if defined(USB_DEVICE_CONFIG_KHCI) && (USB_DEVICE_CONFIG_KHCI > 0) +#define USB_INTERRUPT_HANDLER USB_DeviceKhciIsrFunction +#define USB_DATA_BUFF_SIZE FS_CDC_VCOM_BULK_OUT_PACKET_SIZE + +#endif +#if defined(USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U) +#define USB_INTERRUPT_HANDLER USB_DeviceLpcIp3511IsrFunction +#define USB_DATA_BUFF_SIZE FS_CDC_VCOM_BULK_OUT_PACKET_SIZE + +#endif + +#if defined(USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS > 0U) +#define USB_INTERRUPT_HANDLER USB_DeviceLpcIp3511IsrFunction +#define USB_DATA_BUFF_SIZE HS_CDC_VCOM_BULK_OUT_PACKET_SIZE +#endif + +#define USB_DEVICE_INTERRUPT_PRIORITY (3U) + +/****************************************************************************** + * Functions definitions + ******************************************************************************/ +FMSTR_BOOL FMSTR_ExampleUsbInit(void); + +#endif /* __FREEMASTER_EXAMPLE_USB_H */ diff --git a/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb_device_descriptor.c b/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb_device_descriptor.c new file mode 100644 index 0000000..dbfc6d1 --- /dev/null +++ b/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb_device_descriptor.c @@ -0,0 +1,487 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2020 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - USB Example Implementation + */ + +#include "usb_device_config.h" +#include "usb.h" +#include "usb_device.h" + +#include "usb_device_class.h" +#include "usb_device_cdc_acm.h" + +#include "freemaster_usb_device_descriptor.h" + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* Define endpoint for communication class */ +usb_device_endpoint_struct_t g_UsbDeviceCdcVcomCicEndpoints[USB_CDC_VCOM_ENDPOINT_CIC_COUNT] = { + { + USB_CDC_VCOM_INTERRUPT_IN_ENDPOINT | (USB_IN << 7U), + USB_ENDPOINT_INTERRUPT, + FS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE, + }, +}; + +/* Define endpoint for data class */ +usb_device_endpoint_struct_t g_UsbDeviceCdcVcomDicEndpoints[USB_CDC_VCOM_ENDPOINT_DIC_COUNT] = { + { + USB_CDC_VCOM_BULK_IN_ENDPOINT | (USB_IN << 7U), + USB_ENDPOINT_BULK, + FS_CDC_VCOM_BULK_IN_PACKET_SIZE, + }, + { + USB_CDC_VCOM_BULK_OUT_ENDPOINT | (USB_OUT << 7U), + USB_ENDPOINT_BULK, + FS_CDC_VCOM_BULK_OUT_PACKET_SIZE, + }}; + +/* Define interface for communication class */ +usb_device_interface_struct_t g_UsbDeviceCdcVcomCommunicationInterface[] = {{0, + { + USB_CDC_VCOM_ENDPOINT_CIC_COUNT, + g_UsbDeviceCdcVcomCicEndpoints, + }, + NULL}}; + +/* Define interface for data class */ +usb_device_interface_struct_t g_UsbDeviceCdcVcomDataInterface[] = {{0, + { + USB_CDC_VCOM_ENDPOINT_DIC_COUNT, + g_UsbDeviceCdcVcomDicEndpoints, + }, + NULL}}; + +/* Define interfaces for virtual com */ +usb_device_interfaces_struct_t g_UsbDeviceCdcVcomInterfaces[USB_CDC_VCOM_INTERFACE_COUNT] = { + {USB_CDC_VCOM_CIC_CLASS, USB_CDC_VCOM_CIC_SUBCLASS, USB_CDC_VCOM_CIC_PROTOCOL, USB_CDC_VCOM_COMM_INTERFACE_INDEX, + g_UsbDeviceCdcVcomCommunicationInterface, + sizeof(g_UsbDeviceCdcVcomCommunicationInterface) / sizeof(usb_device_interface_struct_t)}, + {USB_CDC_VCOM_DIC_CLASS, USB_CDC_VCOM_DIC_SUBCLASS, USB_CDC_VCOM_DIC_PROTOCOL, USB_CDC_VCOM_DATA_INTERFACE_INDEX, + g_UsbDeviceCdcVcomDataInterface, sizeof(g_UsbDeviceCdcVcomDataInterface) / sizeof(usb_device_interface_struct_t)}, +}; + +/* Define configurations for virtual com */ +usb_device_interface_list_t g_UsbDeviceCdcVcomInterfaceList[USB_DEVICE_CONFIGURATION_COUNT] = { + { + USB_CDC_VCOM_INTERFACE_COUNT, + g_UsbDeviceCdcVcomInterfaces, + }, +}; + +/* Define class information for virtual com */ +usb_device_class_struct_t g_UsbDeviceCdcVcomConfig = { + g_UsbDeviceCdcVcomInterfaceList, + kUSB_DeviceClassTypeCdc, + USB_DEVICE_CONFIGURATION_COUNT, +}; + +/* Define device descriptor */ +USB_DMA_INIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) +uint8_t g_UsbDeviceDescriptor[] = { + /* Size of this descriptor in bytes */ + USB_DESCRIPTOR_LENGTH_DEVICE, + /* DEVICE Descriptor Type */ + USB_DESCRIPTOR_TYPE_DEVICE, + /* USB Specification Release Number in Binary-Coded Decimal (i.e., 2.10 is 210H). */ + USB_SHORT_GET_LOW(USB_DEVICE_SPECIFIC_BCD_VERSION), + USB_SHORT_GET_HIGH(USB_DEVICE_SPECIFIC_BCD_VERSION), + /* Class code (assigned by the USB-IF). */ + USB_DEVICE_CLASS, + /* Subclass code (assigned by the USB-IF). */ + USB_DEVICE_SUBCLASS, + /* Protocol code (assigned by the USB-IF). */ + USB_DEVICE_PROTOCOL, + /* Maximum packet size for endpoint zero (only 8, 16, 32, or 64 are valid) */ + USB_CONTROL_MAX_PACKET_SIZE, + /* Vendor ID (assigned by the USB-IF) */ + 0xC9U, + 0x1FU, + /* Product ID (assigned by the manufacturer) */ + 0x94, + 0x00, + /* Device release number in binary-coded decimal */ + USB_SHORT_GET_LOW(USB_DEVICE_DEMO_BCD_VERSION), + USB_SHORT_GET_HIGH(USB_DEVICE_DEMO_BCD_VERSION), + /* Index of string descriptor describing manufacturer */ + 0x01, + /* Index of string descriptor describing product */ + 0x02, + /* Index of string descriptor describing the device's serial number */ + 0x00, + /* Number of possible configurations */ + USB_DEVICE_CONFIGURATION_COUNT, +}; + +/* Define configuration descriptor */ +USB_DMA_INIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) +uint8_t g_UsbDeviceConfigurationDescriptor[] = { + /* Size of this descriptor in bytes */ + USB_DESCRIPTOR_LENGTH_CONFIGURE, + /* CONFIGURATION Descriptor Type */ + USB_DESCRIPTOR_TYPE_CONFIGURE, + /* Total length of data returned for this configuration. */ + USB_SHORT_GET_LOW(USB_DESCRIPTOR_LENGTH_CONFIGURE + USB_DESCRIPTOR_LENGTH_INTERFACE + + USB_DESCRIPTOR_LENGTH_CDC_HEADER_FUNC + USB_DESCRIPTOR_LENGTH_CDC_CALL_MANAG + + USB_DESCRIPTOR_LENGTH_CDC_ABSTRACT + USB_DESCRIPTOR_LENGTH_CDC_UNION_FUNC + + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE + + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_ENDPOINT), + USB_SHORT_GET_HIGH(USB_DESCRIPTOR_LENGTH_CONFIGURE + USB_DESCRIPTOR_LENGTH_INTERFACE + + USB_DESCRIPTOR_LENGTH_CDC_HEADER_FUNC + USB_DESCRIPTOR_LENGTH_CDC_CALL_MANAG + + USB_DESCRIPTOR_LENGTH_CDC_ABSTRACT + USB_DESCRIPTOR_LENGTH_CDC_UNION_FUNC + + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE + + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_ENDPOINT), + /* Number of interfaces supported by this configuration */ + USB_CDC_VCOM_INTERFACE_COUNT, + /* Value to use as an argument to the SetConfiguration() request to select this configuration */ + USB_CDC_VCOM_CONFIGURE_INDEX, + /* Index of string descriptor describing this configuration */ + 0, + /* Configuration characteristics D7: Reserved (set to one) D6: Self-powered D5: Remote Wakeup D4...0: Reserved + (reset to zero) */ + (USB_DESCRIPTOR_CONFIGURE_ATTRIBUTE_D7_MASK) | + (USB_DEVICE_CONFIG_SELF_POWER << USB_DESCRIPTOR_CONFIGURE_ATTRIBUTE_SELF_POWERED_SHIFT) | + (USB_DEVICE_CONFIG_REMOTE_WAKEUP << USB_DESCRIPTOR_CONFIGURE_ATTRIBUTE_REMOTE_WAKEUP_SHIFT), + /* Maximum power consumption of the USB * device from the bus in this specific * configuration when the device is + fully * operational. Expressed in 2 mA units * (i.e., 50 = 100 mA). */ + USB_DEVICE_MAX_POWER, + + /* Communication Interface Descriptor */ + USB_DESCRIPTOR_LENGTH_INTERFACE, USB_DESCRIPTOR_TYPE_INTERFACE, USB_CDC_VCOM_COMM_INTERFACE_INDEX, 0x00, + USB_CDC_VCOM_ENDPOINT_CIC_COUNT, USB_CDC_VCOM_CIC_CLASS, USB_CDC_VCOM_CIC_SUBCLASS, USB_CDC_VCOM_CIC_PROTOCOL, + 0x00, /* Interface Description String Index*/ + + /* CDC Class-Specific descriptor */ + USB_DESCRIPTOR_LENGTH_CDC_HEADER_FUNC, /* Size of this descriptor in bytes */ + USB_DESCRIPTOR_TYPE_CDC_CS_INTERFACE, /* CS_INTERFACE Descriptor Type */ + USB_CDC_HEADER_FUNC_DESC, 0x10, + 0x01, /* USB Class Definitions for Communications the Communication specification version 1.10 */ + + USB_DESCRIPTOR_LENGTH_CDC_CALL_MANAG, /* Size of this descriptor in bytes */ + USB_DESCRIPTOR_TYPE_CDC_CS_INTERFACE, /* CS_INTERFACE Descriptor Type */ + USB_CDC_CALL_MANAGEMENT_FUNC_DESC, + 0x01, /*Bit 0: Whether device handle call management itself 1, Bit 1: Whether device can send/receive call + management information over a Data Class Interface 0 */ + 0x01, /* Indicates multiplexed commands are handled via data interface */ + + USB_DESCRIPTOR_LENGTH_CDC_ABSTRACT, /* Size of this descriptor in bytes */ + USB_DESCRIPTOR_TYPE_CDC_CS_INTERFACE, /* CS_INTERFACE Descriptor Type */ + USB_CDC_ABSTRACT_CONTROL_FUNC_DESC, + 0x06, /* Bit 0: Whether device supports the request combination of Set_Comm_Feature, Clear_Comm_Feature, and + Get_Comm_Feature 0, Bit 1: Whether device supports the request combination of Set_Line_Coding, + Set_Control_Line_State, Get_Line_Coding, and the notification Serial_State 1, Bit ... */ + + USB_DESCRIPTOR_LENGTH_CDC_UNION_FUNC, /* Size of this descriptor in bytes */ + USB_DESCRIPTOR_TYPE_CDC_CS_INTERFACE, /* CS_INTERFACE Descriptor Type */ + USB_CDC_UNION_FUNC_DESC, 0x00, /* The interface number of the Communications or Data Class interface */ + 0x01, /* Interface number of subordinate interface in the Union */ + + /*Notification Endpoint descriptor */ + USB_DESCRIPTOR_LENGTH_ENDPOINT, USB_DESCRIPTOR_TYPE_ENDPOINT, USB_CDC_VCOM_INTERRUPT_IN_ENDPOINT | (USB_IN << 7U), + USB_ENDPOINT_INTERRUPT, USB_SHORT_GET_LOW(FS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE), + USB_SHORT_GET_HIGH(FS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE), FS_CDC_VCOM_INTERRUPT_IN_INTERVAL, + + /* Data Interface Descriptor */ + USB_DESCRIPTOR_LENGTH_INTERFACE, USB_DESCRIPTOR_TYPE_INTERFACE, USB_CDC_VCOM_DATA_INTERFACE_INDEX, 0x00, + USB_CDC_VCOM_ENDPOINT_DIC_COUNT, USB_CDC_VCOM_DIC_CLASS, USB_CDC_VCOM_DIC_SUBCLASS, USB_CDC_VCOM_DIC_PROTOCOL, + 0x00, /* Interface Description String Index*/ + + /*Bulk IN Endpoint descriptor */ + USB_DESCRIPTOR_LENGTH_ENDPOINT, USB_DESCRIPTOR_TYPE_ENDPOINT, USB_CDC_VCOM_BULK_IN_ENDPOINT | (USB_IN << 7U), + USB_ENDPOINT_BULK, USB_SHORT_GET_LOW(FS_CDC_VCOM_BULK_IN_PACKET_SIZE), + USB_SHORT_GET_HIGH(FS_CDC_VCOM_BULK_IN_PACKET_SIZE), 0x00, /* The polling interval value is every 0 Frames */ + + /*Bulk OUT Endpoint descriptor */ + USB_DESCRIPTOR_LENGTH_ENDPOINT, USB_DESCRIPTOR_TYPE_ENDPOINT, USB_CDC_VCOM_BULK_OUT_ENDPOINT | (USB_OUT << 7U), + USB_ENDPOINT_BULK, USB_SHORT_GET_LOW(FS_CDC_VCOM_BULK_OUT_PACKET_SIZE), + USB_SHORT_GET_HIGH(FS_CDC_VCOM_BULK_OUT_PACKET_SIZE), 0x00, /* The polling interval value is every 0 Frames */ +}; + +/* Define string descriptor */ +USB_DMA_INIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) +uint8_t g_UsbDeviceString0[] = {2U + 2U, USB_DESCRIPTOR_TYPE_STRING, 0x09, 0x04}; + +USB_DMA_INIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) +uint8_t g_UsbDeviceString1[] = { + 2U + 2U * 18U, USB_DESCRIPTOR_TYPE_STRING, + 'N', 0x00U, + 'X', 0x00U, + 'P', 0x00U, + ' ', 0x00U, + 'S', 0x00U, + 'E', 0x00U, + 'M', 0x00U, + 'I', 0x00U, + 'C', 0x00U, + 'O', 0x00U, + 'N', 0x00U, + 'D', 0x00U, + 'U', 0x00U, + 'C', 0x00U, + 'T', 0x00U, + 'O', 0x00U, + 'R', 0x00U, + 'S', 0x00U, +}; + +USB_DMA_INIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) +uint8_t g_UsbDeviceString2[] = { + 2U + 2U * 14U, USB_DESCRIPTOR_TYPE_STRING, + 'F', 0, + 'r', 0, + 'e', 0, + 'e', 0, + 'M', 0, + 'A', 0, + 'S', 0, + 'T', 0, + 'E', 0, + 'R', 0, + ' ', 0, + 'U', 0, + 'S', 0, + 'B', 0, +}; + +uint8_t *g_UsbDeviceStringDescriptorArray[USB_DEVICE_STRING_COUNT] = {g_UsbDeviceString0, g_UsbDeviceString1, + g_UsbDeviceString2}; + +/* Define string descriptor size */ +uint32_t g_UsbDeviceStringDescriptorLength[USB_DEVICE_STRING_COUNT] = { + sizeof(g_UsbDeviceString0), sizeof(g_UsbDeviceString1), sizeof(g_UsbDeviceString2)}; +usb_language_t g_UsbDeviceLanguage[USB_DEVICE_LANGUAGE_COUNT] = {{ + g_UsbDeviceStringDescriptorArray, + g_UsbDeviceStringDescriptorLength, + (uint16_t)0x0409, +}}; + +usb_language_list_t g_UsbDeviceLanguageList = { + g_UsbDeviceString0, + sizeof(g_UsbDeviceString0), + g_UsbDeviceLanguage, + USB_DEVICE_LANGUAGE_COUNT, +}; + +/******************************************************************************* + * Code + ******************************************************************************/ +/*! + * @brief USB device get device descriptor function. + * + * This function gets the device descriptor of the USB device. + * + * @param handle The USB device handle. + * @param deviceDescriptor The pointer to the device descriptor structure. + * + * @return A USB error code or kStatus_USB_Success. + */ +usb_status_t USB_DeviceGetDeviceDescriptor(usb_device_handle handle, + usb_device_get_device_descriptor_struct_t *deviceDescriptor) +{ + deviceDescriptor->buffer = g_UsbDeviceDescriptor; + deviceDescriptor->length = USB_DESCRIPTOR_LENGTH_DEVICE; + return kStatus_USB_Success; +} + +/*! + * @brief USB device get configuration descriptor function. + * + * This function gets the configuration descriptor of the USB device. + * + * @param handle The USB device handle. + * @param configurationDescriptor The pointer to the configuration descriptor structure. + * + * @return A USB error code or kStatus_USB_Success. + */ +usb_status_t USB_DeviceGetConfigurationDescriptor( + usb_device_handle handle, usb_device_get_configuration_descriptor_struct_t *configurationDescriptor) +{ + if (USB_CDC_VCOM_CONFIGURE_INDEX > configurationDescriptor->configuration) + { + configurationDescriptor->buffer = g_UsbDeviceConfigurationDescriptor; + configurationDescriptor->length = USB_DESCRIPTOR_LENGTH_CONFIGURATION_ALL; + return kStatus_USB_Success; + } + return kStatus_USB_InvalidRequest; +} + +/*! + * @brief USB device get string descriptor function. + * + * This function gets the string descriptor of the USB device. + * + * @param handle The USB device handle. + * @param stringDescriptor Pointer to the string descriptor structure. + * + * @return A USB error code or kStatus_USB_Success. + */ +usb_status_t USB_DeviceGetStringDescriptor(usb_device_handle handle, + usb_device_get_string_descriptor_struct_t *stringDescriptor) +{ + if (stringDescriptor->stringIndex == 0U) + { + stringDescriptor->buffer = (uint8_t *)g_UsbDeviceLanguageList.languageString; + stringDescriptor->length = g_UsbDeviceLanguageList.stringLength; + } + else + { + uint8_t languageId = 0U; + uint8_t languageIndex = USB_DEVICE_STRING_COUNT; + + for (; languageId < USB_DEVICE_LANGUAGE_COUNT; languageId++) + { + if (stringDescriptor->languageId == g_UsbDeviceLanguageList.languageList[languageId].languageId) + { + if (stringDescriptor->stringIndex < USB_DEVICE_STRING_COUNT) + { + languageIndex = stringDescriptor->stringIndex; + } + break; + } + } + + if (USB_DEVICE_STRING_COUNT == languageIndex) + { + return kStatus_USB_InvalidRequest; + } + stringDescriptor->buffer = (uint8_t *)g_UsbDeviceLanguageList.languageList[languageId].string[languageIndex]; + stringDescriptor->length = g_UsbDeviceLanguageList.languageList[languageId].length[languageIndex]; + } + return kStatus_USB_Success; +} + +/*! + * @brief USB device set speed function. + * + * This function sets the speed of the USB device. + * + * Due to the difference of HS and FS descriptors, the device descriptors and configurations need to be updated to match + * current speed. + * As the default, the device descriptors and configurations are configured by using FS parameters for both EHCI and + * KHCI. + * When the EHCI is enabled, the application needs to call this function to update device by using current speed. + * The updated information includes endpoint max packet size, endpoint interval, etc. + * + * @param handle The USB device handle. + * @param speed Speed type. USB_SPEED_HIGH/USB_SPEED_FULL/USB_SPEED_LOW. + * + * @return A USB error code or kStatus_USB_Success. + */ +usb_status_t USB_DeviceSetSpeed(usb_device_handle handle, uint8_t speed) +{ + usb_descriptor_union_t *ptr1; + usb_descriptor_union_t *ptr2; + + ptr1 = (usb_descriptor_union_t *)(&g_UsbDeviceConfigurationDescriptor[0]); + ptr2 = (usb_descriptor_union_t *)(&g_UsbDeviceConfigurationDescriptor[USB_DESCRIPTOR_LENGTH_CONFIGURATION_ALL - 1]); + + while (ptr1 < ptr2) + { + if (ptr1->common.bDescriptorType == USB_DESCRIPTOR_TYPE_ENDPOINT) + { + if (USB_SPEED_HIGH == speed) + { + if (((ptr1->endpoint.bEndpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) == + USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_IN) && + (USB_CDC_VCOM_INTERRUPT_IN_ENDPOINT == + (ptr1->endpoint.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK))) + { + ptr1->endpoint.bInterval = HS_CDC_VCOM_INTERRUPT_IN_INTERVAL; + USB_SHORT_TO_LITTLE_ENDIAN_ADDRESS(HS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE, + ptr1->endpoint.wMaxPacketSize); + } + else if (((ptr1->endpoint.bEndpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) == + USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_IN) && + (USB_CDC_VCOM_BULK_IN_ENDPOINT == + (ptr1->endpoint.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK))) + { + USB_SHORT_TO_LITTLE_ENDIAN_ADDRESS(HS_CDC_VCOM_BULK_IN_PACKET_SIZE, ptr1->endpoint.wMaxPacketSize); + } + else if (((ptr1->endpoint.bEndpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) == + USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_OUT) && + (USB_CDC_VCOM_BULK_OUT_ENDPOINT == + (ptr1->endpoint.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK))) + { + USB_SHORT_TO_LITTLE_ENDIAN_ADDRESS(HS_CDC_VCOM_BULK_OUT_PACKET_SIZE, ptr1->endpoint.wMaxPacketSize); + } + else + { + } + } + else + { + if (((ptr1->endpoint.bEndpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) == + USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_IN) && + (USB_CDC_VCOM_INTERRUPT_IN_ENDPOINT == + (ptr1->endpoint.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK))) + { + ptr1->endpoint.bInterval = FS_CDC_VCOM_INTERRUPT_IN_INTERVAL; + USB_SHORT_TO_LITTLE_ENDIAN_ADDRESS(FS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE, + ptr1->endpoint.wMaxPacketSize); + } + else if (((ptr1->endpoint.bEndpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) == + USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_IN) && + (USB_CDC_VCOM_BULK_IN_ENDPOINT == + (ptr1->endpoint.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK))) + { + USB_SHORT_TO_LITTLE_ENDIAN_ADDRESS(FS_CDC_VCOM_BULK_IN_PACKET_SIZE, ptr1->endpoint.wMaxPacketSize); + } + else if (((ptr1->endpoint.bEndpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) == + USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_OUT) && + (USB_CDC_VCOM_BULK_OUT_ENDPOINT == + (ptr1->endpoint.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK))) + { + USB_SHORT_TO_LITTLE_ENDIAN_ADDRESS(FS_CDC_VCOM_BULK_OUT_PACKET_SIZE, ptr1->endpoint.wMaxPacketSize); + } + else + { + } + } + } + ptr1 = (usb_descriptor_union_t *)((uint8_t *)ptr1 + ptr1->common.bLength); + } + + for (int i = 0; i < USB_CDC_VCOM_ENDPOINT_CIC_COUNT; i++) + { + if (USB_SPEED_HIGH == speed) + { + g_UsbDeviceCdcVcomCicEndpoints[i].maxPacketSize = HS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE; + } + else + { + g_UsbDeviceCdcVcomCicEndpoints[i].maxPacketSize = FS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE; + } + } + for (int i = 0; i < USB_CDC_VCOM_ENDPOINT_DIC_COUNT; i++) + { + if (USB_SPEED_HIGH == speed) + { + if (g_UsbDeviceCdcVcomDicEndpoints[i].endpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) + { + g_UsbDeviceCdcVcomDicEndpoints[i].maxPacketSize = HS_CDC_VCOM_BULK_IN_PACKET_SIZE; + } + else + { + g_UsbDeviceCdcVcomDicEndpoints[i].maxPacketSize = HS_CDC_VCOM_BULK_OUT_PACKET_SIZE; + } + } + else + { + if (g_UsbDeviceCdcVcomDicEndpoints[i].endpointAddress & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK) + { + g_UsbDeviceCdcVcomDicEndpoints[i].maxPacketSize = FS_CDC_VCOM_BULK_IN_PACKET_SIZE; + } + else + { + g_UsbDeviceCdcVcomDicEndpoints[i].maxPacketSize = FS_CDC_VCOM_BULK_OUT_PACKET_SIZE; + } + } + } + + return kStatus_USB_Success; +} diff --git a/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb_device_descriptor.h b/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb_device_descriptor.h new file mode 100644 index 0000000..3058c16 --- /dev/null +++ b/middleware/freemaster/src/support/mcuxsdk_usb/freemaster_usb_device_descriptor.h @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - USB Example Implementation + */ + +#ifndef __FREEMASTER_USB_DEVICE_DESCRIPTOR_H_ +#define __FREEMASTER_USB_DEVICE_DESCRIPTOR_H_ 1 + +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define USB_DEVICE_SPECIFIC_BCD_VERSION (0x0200) +#define USB_DEVICE_DEMO_BCD_VERSION (0x0101U) + +/* Communication Class Codes */ +#define CDC_COMM_CLASS (0x02) +/* Data Class Codes */ +#define CDC_DATA_CLASS (0x0A) + +/* Communication Class SubClass Codes */ +#define USB_CDC_DIRECT_LINE_CONTROL_MODEL (0x01) +#define USB_CDC_ABSTRACT_CONTROL_MODEL (0x02) +#define USB_CDC_TELEPHONE_CONTROL_MODEL (0x03) +#define USB_CDC_MULTI_CHANNEL_CONTROL_MODEL (0x04) +#define USB_CDC_CAPI_CONTROL_MOPDEL (0x05) +#define USB_CDC_ETHERNET_NETWORKING_CONTROL_MODEL (0x06) +#define USB_CDC_ATM_NETWORKING_CONTROL_MODEL (0x07) +#define USB_CDC_WIRELESS_HANDSET_CONTROL_MODEL (0x08) +#define USB_CDC_DEVICE_MANAGEMENT (0x09) +#define USB_CDC_MOBILE_DIRECT_LINE_MODEL (0x0A) +#define USB_CDC_OBEX (0x0B) +#define USB_CDC_ETHERNET_EMULATION_MODEL (0x0C) + +/* Communication Class Protocol Codes */ +#define USB_CDC_NO_CLASS_SPECIFIC_PROTOCOL (0x00) /*also for Data Class Protocol Code */ +#define USB_CDC_AT_250_PROTOCOL (0x01) +#define USB_CDC_AT_PCCA_101_PROTOCOL (0x02) +#define USB_CDC_AT_PCCA_101_ANNEX_O (0x03) +#define USB_CDC_AT_GSM_7_07 (0x04) +#define USB_CDC_AT_3GPP_27_007 (0x05) +#define USB_CDC_AT_TIA_CDMA (0x06) +#define USB_CDC_ETHERNET_EMULATION_PROTOCOL (0x07) +#define USB_CDC_EXTERNAL_PROTOCOL (0xFE) +#define USB_CDC_VENDOR_SPECIFIC (0xFF) /*also for Data Class Protocol Code */ + +/* Data Class Protocol Codes */ +#define USB_CDC_PYHSICAL_INTERFACE_PROTOCOL (0x30) +#define USB_CDC_HDLC_PROTOCOL (0x31) +#define USB_CDC_TRANSPARENT_PROTOCOL (0x32) +#define USB_CDC_MANAGEMENT_PROTOCOL (0x50) +#define USB_CDC_DATA_LINK_Q931_PROTOCOL (0x51) +#define USB_CDC_DATA_LINK_Q921_PROTOCOL (0x52) +#define USB_CDC_DATA_COMPRESSION_V42BIS (0x90) +#define USB_CDC_EURO_ISDN_PROTOCOL (0x91) +#define USB_CDC_RATE_ADAPTION_ISDN_V24 (0x92) +#define USB_CDC_CAPI_COMMANDS (0x93) +#define USB_CDC_HOST_BASED_DRIVER (0xFD) +#define USB_CDC_UNIT_FUNCTIONAL (0xFE) + +/* Descriptor SubType in Communications Class Functional Descriptors */ +#define USB_CDC_HEADER_FUNC_DESC (0x00) +#define USB_CDC_CALL_MANAGEMENT_FUNC_DESC (0x01) +#define USB_CDC_ABSTRACT_CONTROL_FUNC_DESC (0x02) +#define USB_CDC_DIRECT_LINE_FUNC_DESC (0x03) +#define USB_CDC_TELEPHONE_RINGER_FUNC_DESC (0x04) +#define USB_CDC_TELEPHONE_REPORT_FUNC_DESC (0x05) +#define USB_CDC_UNION_FUNC_DESC (0x06) +#define USB_CDC_COUNTRY_SELECT_FUNC_DESC (0x07) +#define USB_CDC_TELEPHONE_MODES_FUNC_DESC (0x08) +#define USB_CDC_TERMINAL_FUNC_DESC (0x09) +#define USB_CDC_NETWORK_CHANNEL_FUNC_DESC (0x0A) +#define USB_CDC_PROTOCOL_UNIT_FUNC_DESC (0x0B) +#define USB_CDC_EXTENSION_UNIT_FUNC_DESC (0x0C) +#define USB_CDC_MULTI_CHANNEL_FUNC_DESC (0x0D) +#define USB_CDC_CAPI_CONTROL_FUNC_DESC (0x0E) +#define USB_CDC_ETHERNET_NETWORKING_FUNC_DESC (0x0F) +#define USB_CDC_ATM_NETWORKING_FUNC_DESC (0x10) +#define USB_CDC_WIRELESS_CONTROL_FUNC_DESC (0x11) +#define USB_CDC_MOBILE_DIRECT_LINE_FUNC_DESC (0x12) +#define USB_CDC_MDLM_DETAIL_FUNC_DESC (0x13) +#define USB_CDC_DEVICE_MANAGEMENT_FUNC_DESC (0x14) +#define USB_CDC_OBEX_FUNC_DESC (0x15) +#define USB_CDC_COMMAND_SET_FUNC_DESC (0x16) +#define USB_CDC_COMMAND_SET_DETAIL_FUNC_DESC (0x17) +#define USB_CDC_TELEPHONE_CONTROL_FUNC_DESC (0x18) +#define USB_CDC_OBEX_SERVICE_ID_FUNC_DESC (0x19) + +/* usb descriptor length */ +#define USB_DESCRIPTOR_LENGTH_CONFIGURATION_ALL (sizeof(g_UsbDeviceConfigurationDescriptor)) +#define USB_DESCRIPTOR_LENGTH_CDC_HEADER_FUNC (5) +#define USB_DESCRIPTOR_LENGTH_CDC_CALL_MANAG (5) +#define USB_DESCRIPTOR_LENGTH_CDC_ABSTRACT (4) +#define USB_DESCRIPTOR_LENGTH_CDC_UNION_FUNC (5) + +/* Configuration, interface and endpoint. */ +#define USB_DEVICE_CONFIGURATION_COUNT (1) +#define USB_DEVICE_STRING_COUNT (3) +#define USB_DEVICE_LANGUAGE_COUNT (1) + +#define USB_CDC_VCOM_CONFIGURE_INDEX (1) + +#define USB_CDC_VCOM_ENDPOINT_CIC_COUNT (1) +#define USB_CDC_VCOM_ENDPOINT_DIC_COUNT (2) +#define USB_CDC_VCOM_INTERRUPT_IN_ENDPOINT (1) +#define USB_CDC_VCOM_BULK_IN_ENDPOINT (2) +#define USB_CDC_VCOM_BULK_OUT_ENDPOINT (3) +#define USB_CDC_VCOM_INTERFACE_COUNT (2) +#define USB_CDC_VCOM_COMM_INTERFACE_INDEX (0) +#define USB_CDC_VCOM_DATA_INTERFACE_INDEX (1) + +/* Packet size. */ +#define HS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE (16) +#define FS_CDC_VCOM_INTERRUPT_IN_PACKET_SIZE (16) +#define HS_CDC_VCOM_INTERRUPT_IN_INTERVAL (0x07) /* 2^(7-1) = 8ms */ +#define FS_CDC_VCOM_INTERRUPT_IN_INTERVAL (0x08) +#define HS_CDC_VCOM_BULK_IN_PACKET_SIZE (512) +#define FS_CDC_VCOM_BULK_IN_PACKET_SIZE (64) +#define HS_CDC_VCOM_BULK_OUT_PACKET_SIZE (512) +#define FS_CDC_VCOM_BULK_OUT_PACKET_SIZE (64) + +/* String descriptor length. */ +#define USB_DESCRIPTOR_LENGTH_STRING0 (sizeof(g_UsbDeviceString0)) +#define USB_DESCRIPTOR_LENGTH_STRING1 (sizeof(g_UsbDeviceString1)) +#define USB_DESCRIPTOR_LENGTH_STRING2 (sizeof(g_UsbDeviceString2)) + +#define USB_DESCRIPTOR_TYPE_CDC_CS_INTERFACE (0x24) +#define USB_DESCRIPTOR_TYPE_CDC_CS_ENDPOINT (0x25) + +/* Class code. */ +#define USB_DEVICE_CLASS (0x02) +#define USB_DEVICE_SUBCLASS (0x00) +#define USB_DEVICE_PROTOCOL (0x00) + +#define USB_DEVICE_MAX_POWER (0x32) + +#define USB_CDC_VCOM_CIC_CLASS (CDC_COMM_CLASS) +#define USB_CDC_VCOM_CIC_SUBCLASS (USB_CDC_ABSTRACT_CONTROL_MODEL) +#define USB_CDC_VCOM_CIC_PROTOCOL (USB_CDC_NO_CLASS_SPECIFIC_PROTOCOL) + +#define USB_CDC_VCOM_DIC_CLASS (CDC_DATA_CLASS) +#define USB_CDC_VCOM_DIC_SUBCLASS (0x00) +#define USB_CDC_VCOM_DIC_PROTOCOL (USB_CDC_NO_CLASS_SPECIFIC_PROTOCOL) + +/******************************************************************************* + * API + ******************************************************************************/ +/*! + * @brief USB device set speed function. + * + * This function sets the speed of the USB device. + * + * Due to the difference of HS and FS descriptors, the device descriptors and configurations need to be updated to match + * current speed. + * As the default, the device descriptors and configurations are configured by using FS parameters for both EHCI and + * KHCI. + * When the EHCI is enabled, the application needs to call this function to update device by using current speed. + * The updated information includes endpoint max packet size, endpoint interval, etc. + * + * @param handle The USB device handle. + * @param speed Speed type. USB_SPEED_HIGH/USB_SPEED_FULL/USB_SPEED_LOW. + * + * @return A USB error code or kStatus_USB_Success. + */ +extern usb_status_t USB_DeviceSetSpeed(usb_device_handle handle, uint8_t speed); +/*! + * @brief USB device get device descriptor function. + * + * This function gets the device descriptor of the USB device. + * + * @param handle The USB device handle. + * @param deviceDescriptor The pointer to the device descriptor structure. + * + * @return A USB error code or kStatus_USB_Success. + */ +extern usb_status_t USB_DeviceGetDeviceDescriptor(usb_device_handle handle, + usb_device_get_device_descriptor_struct_t *deviceDescriptor); +/*! + * @brief USB device get string descriptor function. + * + * This function gets the string descriptor of the USB device. + * + * @param handle The USB device handle. + * @param stringDescriptor Pointer to the string descriptor structure. + * + * @return A USB error code or kStatus_USB_Success. + */ +usb_status_t USB_DeviceGetStringDescriptor(usb_device_handle handle, + usb_device_get_string_descriptor_struct_t *stringDescriptor); +/*! + * @brief USB device get configuration descriptor function. + * + * This function gets the configuration descriptor of the USB device. + * + * @param handle The USB device handle. + * @param configurationDescriptor The pointer to the configuration descriptor structure. + * + * @return A USB error code or kStatus_USB_Success. + */ +extern usb_status_t USB_DeviceGetConfigurationDescriptor( + usb_device_handle handle, usb_device_get_configuration_descriptor_struct_t *configurationDescriptor); +#endif /* __FREEMASTER_USB_DEVICE_DESCRIPTOR_H_ */ diff --git a/middleware/freemaster/src/support/mcuxsdk_usb/readme.txt b/middleware/freemaster/src/support/mcuxsdk_usb/readme.txt new file mode 100644 index 0000000..0ea3624 --- /dev/null +++ b/middleware/freemaster/src/support/mcuxsdk_usb/readme.txt @@ -0,0 +1,9 @@ +Files in this directory are used by the FreeMASTER example application +as a glue layer between the application code and USB stack. + +This code is based on standard USB/CDC Virtual Com example application +from the MCUXpresso SDK. + +Please note that similar files can be generated by a FreeMASTER middleware +configuration component of MCUXpresso ConfigTools when it is used +to configure the FreeMASTER driver for a USB-CDC transport. diff --git a/middleware/freemaster/src/support/mcuxsdk_usb/usb_device_config.h b/middleware/freemaster/src/support/mcuxsdk_usb/usb_device_config.h new file mode 100644 index 0000000..a277ac4 --- /dev/null +++ b/middleware/freemaster/src/support/mcuxsdk_usb/usb_device_config.h @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2007-2015 Freescale Semiconductor, Inc. + * Copyright 2018-2021 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - USB Example Implementation + */ + +#ifndef _USB_DEVICE_CONFIG_H_ +#define _USB_DEVICE_CONFIG_H_ + +/* getr processor feature options */ +#include "fsl_device_registers.h" + +/******************************************************************************* +* Definitions +******************************************************************************/ +/*! + * @addtogroup usb_device_configuration + * @{ + */ + +/*! + * @name Hardware instance define + * @{ + */ + +/* Board specific exceptions */ + +#ifdef FRDM_K66F +/* K66F has both KHCI and EHCI, the FRDM-K66F has the EHCI connected */ +#undef FSL_FEATURE_USB_KHCI_COUNT +#endif + +/* Determine USB configuration automatically from the processor-specifc feature options */ + +#if defined(FSL_FEATURE_USB_KHCI_COUNT) && FSL_FEATURE_USB_KHCI_COUNT>0 + + /*! brief USB interrupt vector name */ + #define USB_MCU_INT_HANDLER USB0_IRQHandler + + /*! brief USB interrupt vectors indexes */ + #define USB_IRQS_LIST USB_IRQS + + /*! brief Controller Identificator */ + #define CONTROLLER_ID kUSB_ControllerKhci0 + + /*! brief Controller Peripheral Index */ + #define USB_CONTROLLER_IX 0 + + /*! @brief KHCI instance count */ + #define USB_DEVICE_CONFIG_KHCI (1U) + + /*! @brief EHCI instance count */ + #define USB_DEVICE_CONFIG_EHCI (0U) + + /*! @brief LPC USB IP3511 FS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511FS (0U) + + /*! @brief LPC USB IP3511 HS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511HS (0U) + +#elif defined(FSL_FEATURE_USBHS_EHCI_COUNT) && FSL_FEATURE_USBHS_EHCI_COUNT>0 + + /*! brief i.MXRT USB interrupt vector name */ + #define USB_MCU_INT_HANDLER USBHS_IRQHandler /* this is redefined to USB_OTG1_IRQHandler on some platforms */ + + /*! brief USB interrupt vectors indexes */ + #define USB_IRQS_LIST USBHS_IRQS + + /*! brief Controller Identificator */ + #define CONTROLLER_ID kUSB_ControllerEhci0 + + /*! brief Controller Peripheral Index */ + #define USB_CONTROLLER_IX 0 + + /*! @brief KHCI instance count */ + #define USB_DEVICE_CONFIG_KHCI (0U) + + /*! @brief EHCI instance count */ + #define USB_DEVICE_CONFIG_EHCI (1U) + + /*! @brief LPC USB IP3511 FS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511FS (0U) + + /*! @brief LPC USB IP3511 HS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511HS (0U) + +#elif defined(CPU_LPC54628J512ET180) || defined(LPC51U68_SERIES) || defined(LPC54018_SERIES) || \ + defined(LPC54608_SERIES) || defined(LPC54618_SERIES) || \ + defined(LPC54S018_SERIES) || defined(LPC54S018M_SERIES) || \ + defined(LPC54114_cm4_SERIES) || defined(LPC54114_cm0plus_SERIES) + + /*! brief USB interrupt vector name */ + #define USB_MCU_INT_HANDLER USB0_IRQHandler + + /*! brief USB interrupt vectors indexes */ + #define USB_IRQS_LIST USB_IRQS + + /*! brief Controller Identificator */ + #define CONTROLLER_ID kUSB_ControllerLpcIp3511Fs0 + + /*! brief Controller Peripheral Index */ + #define USB_CONTROLLER_IX 0 + + /*! @brief KHCI instance count */ + #define USB_DEVICE_CONFIG_KHCI (0U) + + /*! @brief EHCI instance count */ + #define USB_DEVICE_CONFIG_EHCI (0U) + + /*! @brief LPC USB IP3511 FS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511FS (1U) + + /*! @brief LPC USB IP3511 HS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511HS (0U) + +#elif defined(CPU_LPC55S69JBD100_cm33_core0) || defined(CPU_LPC55S28JBD100) || defined(CPU_LPC55S36JBD100) + + /*! brief USB interrupt vector name */ + #define USB_MCU_INT_HANDLER USB0_IRQHandler + + /*! brief USB interrupt vectors indexes */ + #define USB_IRQS_LIST USB_IRQS + + /*! brief Controller Identificator */ + #define CONTROLLER_ID kUSB_ControllerLpcIp3511Fs0 + + /*! brief Controller Peripheral Index */ + #define USB_CONTROLLER_IX 0 + + /*! @brief KHCI instance count */ + #define USB_DEVICE_CONFIG_KHCI (0U) + + /*! @brief EHCI instance count */ + #define USB_DEVICE_CONFIG_EHCI (0U) + + /*! @brief LPC USB IP3511 FS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511FS (1U) + + /*! @brief LPC USB IP3511 HS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511HS (0U) + +#elif defined(MC56F83789_SERIES) || defined(MC56F83689_SERIES) + + /*! brief USB interrupt vector name */ + #define USB_MCU_INT_HANDLER USB_IRQHandler + + /*! brief Controller Identificator */ + #define CONTROLLER_ID kUSB_ControllerKhci0 + + /*! brief Controller Peripheral Index */ + #define USB_CONTROLLER_IX 0 + + /*! @brief KHCI instance count */ + #define USB_DEVICE_CONFIG_KHCI (1U) + + /*! @brief EHCI instance count */ + #define USB_DEVICE_CONFIG_EHCI (0U) + + /*! @brief LPC USB IP3511 FS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511FS (0U) + + /*! @brief LPC USB IP3511 HS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511HS (0U) + +#elif defined(MIMXRT595S_cm33_SERIES) + + /*! brief USB interrupt vector name */ + #define USB_MCU_INT_HANDLER USB0_IRQHandler + + /*! brief USB interrupt vectors indexes */ + #define USB_IRQS_LIST USBHSD_IRQS + + /*! brief Controller Identificator */ + #define CONTROLLER_ID kUSB_ControllerLpcIp3511Hs0 + + /*! brief Controller Peripheral Index */ + #define USB_CONTROLLER_IX 0 + + /*! @brief KHCI instance count */ + #define USB_DEVICE_CONFIG_KHCI (0U) + + /*! @brief EHCI instance count */ + #define USB_DEVICE_CONFIG_EHCI (0U) + + /*! @brief LPC USB IP3511 FS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511FS (0U) + + /*! @brief LPC USB IP3511 HS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511HS (1U) + +#elif defined(MIMXRT685S_cm33_SERIES) + + /*! brief USB interrupt vector name */ + #define USB_MCU_INT_HANDLER USB_IRQHandler + + /*! brief USB interrupt vectors indexes */ + #define USB_IRQS_LIST USBHSD_IRQS + + /*! brief Controller Identificator */ + #define CONTROLLER_ID kUSB_ControllerLpcIp3511Hs0 + + /*! brief Controller Peripheral Index */ + #define USB_CONTROLLER_IX 0 + + /*! @brief KHCI instance count */ + #define USB_DEVICE_CONFIG_KHCI (0U) + + /*! @brief EHCI instance count */ + #define USB_DEVICE_CONFIG_EHCI (0U) + + /*! @brief LPC USB IP3511 FS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511FS (0U) + + /*! @brief LPC USB IP3511 HS instance count */ + #define USB_DEVICE_CONFIG_LPCIP3511HS (1U) + +#else +#error Add the new MCU here! +#endif + + +/*! @brief Device instance count, the sum of KHCI and EHCI instance counts*/ +#define USB_DEVICE_CONFIG_NUM \ + (USB_DEVICE_CONFIG_KHCI + USB_DEVICE_CONFIG_EHCI + USB_DEVICE_CONFIG_LPCIP3511FS + USB_DEVICE_CONFIG_LPCIP3511HS) + +/* @} */ + + +/*! + * @name class instance define + * @{ + */ + +/*! @brief HID instance count */ +#define USB_DEVICE_CONFIG_HID (0U) + +/*! @brief CDC ACM instance count */ +#define USB_DEVICE_CONFIG_CDC_ACM (1U) + +/*! @brief MSC instance count */ +#define USB_DEVICE_CONFIG_MSC (0U) + +/*! @brief Audio instance count */ +#define USB_DEVICE_CONFIG_AUDIO (0U) + +/*! @brief PHDC instance count */ +#define USB_DEVICE_CONFIG_PHDC (0U) + +/*! @brief Video instance count */ +#define USB_DEVICE_CONFIG_VIDEO (0U) + +/*! @brief CCID instance count */ +#define USB_DEVICE_CONFIG_CCID (0U) + +/*! @brief Printer instance count */ +#define USB_DEVICE_CONFIG_PRINTER (0U) + +/*! @brief DFU instance count */ +#define USB_DEVICE_CONFIG_DFU (0U) + +/* @} */ + +/*! @brief Whether device is self power. 1U supported, 0U not supported */ +#define USB_DEVICE_CONFIG_SELF_POWER (1U) + +/*! @brief How many endpoints are supported in the stack. */ +#define USB_DEVICE_CONFIG_ENDPOINTS (4U) + +/*! @brief Whether the device task is enabled. */ +#define USB_DEVICE_CONFIG_USE_TASK (0U) + +/*! @brief How many the notification message are supported when the device task is enabled. */ +#define USB_DEVICE_CONFIG_MAX_MESSAGES (8U) + +/*! @brief Whether test mode enabled. */ +#define USB_DEVICE_CONFIG_USB20_TEST_MODE (0U) + +/*! @brief Whether device CV test is enabled. */ +#define USB_DEVICE_CONFIG_CV_TEST (0U) + +/*! @brief Whether device compliance test is enabled. If the macro is enabled, + the test mode and CV test macroes will be set.*/ +#define USB_DEVICE_CONFIG_COMPLIANCE_TEST (0U) + +#if ((defined(USB_DEVICE_CONFIG_COMPLIANCE_TEST)) && (USB_DEVICE_CONFIG_COMPLIANCE_TEST > 0U)) + +/*! @brief Undefine the macro USB_DEVICE_CONFIG_USB20_TEST_MODE. */ +#undef USB_DEVICE_CONFIG_USB20_TEST_MODE +/*! @brief Undefine the macro USB_DEVICE_CONFIG_CV_TEST. */ +#undef USB_DEVICE_CONFIG_CV_TEST + +/*! @brief enable the test mode. */ +#define USB_DEVICE_CONFIG_USB20_TEST_MODE (1U) + +/*! @brief enable the CV test */ +#define USB_DEVICE_CONFIG_CV_TEST (1U) + +#endif + +#if ((defined(USB_DEVICE_CONFIG_KHCI)) && (USB_DEVICE_CONFIG_KHCI > 0U)) + +/*! @brief The MAX buffer length for the KHCI DMA workaround.*/ +#define USB_DEVICE_CONFIG_KHCI_DMA_ALIGN_BUFFER_LENGTH (64U) +#endif + +#if ((defined(USB_DEVICE_CONFIG_EHCI)) && (USB_DEVICE_CONFIG_EHCI > 0U)) +/*! @brief How many the DTD are supported. */ +#define USB_DEVICE_CONFIG_EHCI_MAX_DTD (16U) + +/*! @brief Whether the EHCI ID pin detect feature enabled. */ +#define USB_DEVICE_CONFIG_EHCI_ID_PIN_DETECT (0U) +#endif + +/*! @brief Whether the keep alive feature enabled. */ +#define USB_DEVICE_CONFIG_KEEP_ALIVE_MODE (0U) + +/*! @brief Whether the transfer buffer is cache-enabled or not. */ +#ifndef USB_DEVICE_CONFIG_BUFFER_PROPERTY_CACHEABLE +#define USB_DEVICE_CONFIG_BUFFER_PROPERTY_CACHEABLE (0U) +#endif +/*! @brief Whether the low power mode is enabled or not. */ +#define USB_DEVICE_CONFIG_LOW_POWER_MODE (0U) + +#if ((defined(USB_DEVICE_CONFIG_LOW_POWER_MODE)) && (USB_DEVICE_CONFIG_LOW_POWER_MODE > 0U)) +/*! @brief Whether device remote wakeup supported. 1U supported, 0U not supported */ +#define USB_DEVICE_CONFIG_REMOTE_WAKEUP (0U) + +/*! @brief Whether LPM is supported. 1U supported, 0U not supported */ +#define USB_DEVICE_CONFIG_LPM_L1 (0U) +#else +/*! @brief The device remote wakeup is unsupported. */ +#define USB_DEVICE_CONFIG_REMOTE_WAKEUP (0U) +#endif + +/*! @brief Whether the device detached feature is enabled or not. */ +#define USB_DEVICE_CONFIG_DETACH_ENABLE (0U) + +/*! @brief Whether handle the USB bus error. */ +#define USB_DEVICE_CONFIG_ERROR_HANDLING (0U) + +/* @} */ + +#endif /* _USB_DEVICE_CONFIG_H_ */ diff --git a/middleware/freemaster/src/support/mcuxsdk_usb/usb_device_descriptor.h b/middleware/freemaster/src/support/mcuxsdk_usb/usb_device_descriptor.h new file mode 100644 index 0000000..b468e04 --- /dev/null +++ b/middleware/freemaster/src/support/mcuxsdk_usb/usb_device_descriptor.h @@ -0,0 +1,18 @@ +/* + * Copyright 2021 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - USB Example Implementation + */ + +#ifndef _USB_DEVICE_DESCRIPTOR_H_ +#define _USB_DEVICE_DESCRIPTOR_H_ 1 + +/* This usb_device_descriptor.h file is a placeholder which gets re-generated + * by FreeMASTER configuration component of MCUXpresso ConfigTools when + * USB communication is selected. By default, we include the static descriptor + * file which works with the fmstr_usb_cdc example applications. */ +#include "freemaster_usb_device_descriptor.h" + +#endif /* _USB_DEVICE_DESCRIPTOR_H_ */ diff --git a/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT.c b/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT.c new file mode 100644 index 0000000..520286c --- /dev/null +++ b/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT.c @@ -0,0 +1,2361 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 7.22b * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT.c +Purpose : Implementation of SEGGER real-time transfer (RTT) which + allows real-time communication on targets which support + debugger memory accesses while the CPU is running. +Revision: $Rev: 22333 $ + +Additional information: + Type "int" is assumed to be 32-bits in size + H->T Host to target communication + T->H Target to host communication + + RTT channel 0 is always present and reserved for Terminal usage. + Name is fixed to "Terminal" + + Effective buffer size: SizeOfBuffer - 1 + + WrOff == RdOff: Buffer is empty + WrOff == (RdOff - 1): Buffer is full + WrOff > RdOff: Free space includes wrap-around + WrOff < RdOff: Used space includes wrap-around + (WrOff == (SizeOfBuffer - 1)) && (RdOff == 0): + Buffer full and wrap-around after next byte + + +---------------------------------------------------------------------- +*/ + +/* + * Copyright 2021 NXP + * Modifications for FreeMASTER and MCUXpresso SDK compatibility + */ + +#include "freemaster.h" +#include "fsl_common.h" + +/* Use the non-cacheable section if available */ +#if !(defined(FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) && FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) +#define SEGGER_RTT_SECTION "NonCacheable" +#endif + +#include "SEGGER_RTT.h" +#include // for memcpy + +/********************************************************************* + * + * Configuration, default values + * + ********************************************************************** + */ + +#if SEGGER_RTT_CPU_CACHE_LINE_SIZE +#ifdef SEGGER_RTT_CB_ALIGN +#error "Custom SEGGER_RTT_CB_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" +#endif +#ifdef SEGGER_RTT_BUFFER_ALIGN +#error "Custom SEGGER_RTT_BUFFER_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" +#endif +#ifdef SEGGER_RTT_PUT_CB_SECTION +#error "Custom SEGGER_RTT_PUT_CB_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" +#endif +#ifdef SEGGER_RTT_PUT_BUFFER_SECTION +#error "Custom SEGGER_RTT_PUT_BUFFER_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" +#endif +#ifdef SEGGER_RTT_BUFFER_ALIGNMENT +#error "Custom SEGGER_RTT_BUFFER_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" +#endif +#ifdef SEGGER_RTT_ALIGNMENT +#error "Custom SEGGER_RTT_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" +#endif +#endif + +#ifndef BUFFER_SIZE_UP +#define BUFFER_SIZE_UP 1024 // Size of the buffer for terminal output of target, up to host +#endif + +#ifndef BUFFER_SIZE_DOWN +#define BUFFER_SIZE_DOWN 16 // Size of the buffer for terminal input to target from host (Usually keyboard input) +#endif + +#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS +#define SEGGER_RTT_MAX_NUM_UP_BUFFERS 2 // Number of up-buffers (T->H) available on this target +#endif + +#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS +#define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS 2 // Number of down-buffers (H->T) available on this target +#endif + +#ifndef SEGGER_RTT_BUFFER_SECTION +#if defined(SEGGER_RTT_SECTION) +#define SEGGER_RTT_BUFFER_SECTION SEGGER_RTT_SECTION +#endif +#endif + +#ifndef SEGGER_RTT_ALIGNMENT +#define SEGGER_RTT_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE +#endif + +#ifndef SEGGER_RTT_BUFFER_ALIGNMENT +#define SEGGER_RTT_BUFFER_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE +#endif + +#ifndef SEGGER_RTT_MODE_DEFAULT +#define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP +#endif + +#ifndef SEGGER_RTT_LOCK +#define SEGGER_RTT_LOCK() +#endif + +#ifndef SEGGER_RTT_UNLOCK +#define SEGGER_RTT_UNLOCK() +#endif + +#ifndef STRLEN +#define STRLEN(a) strlen((a)) +#endif + +#ifndef STRCPY +#define STRCPY(pDest, pSrc) strcpy((pDest), (pSrc)) +#endif + +#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP +#define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 +#endif + +#ifndef SEGGER_RTT_MEMCPY +#ifdef MEMCPY +#define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) MEMCPY((pDest), (pSrc), (NumBytes)) +#else +#define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) memcpy((pDest), (pSrc), (NumBytes)) +#endif +#endif + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +// +// For some environments, NULL may not be defined until certain headers are included +// +#ifndef NULL +#define NULL 0 +#endif + +/********************************************************************* + * + * Defines, fixed + * + ********************************************************************** + */ +#if (defined __ICCARM__) || (defined __ICCRX__) +#define RTT_PRAGMA(P) _Pragma(#P) +#endif + +#if SEGGER_RTT_ALIGNMENT || SEGGER_RTT_BUFFER_ALIGNMENT +#if (defined __GNUC__) +#define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__((aligned(Alignment))) +#elif (defined __ICCARM__) || (defined __ICCRX__) +#define PRAGMA(A) _Pragma(#A) +#define SEGGER_RTT_ALIGN(Var, Alignment) \ + RTT_PRAGMA(data_alignment = Alignment) \ + Var +#elif (defined __CC_ARM) +#define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__((aligned(Alignment))) +#else +#error "Alignment not supported for this compiler." +#endif +#else +#define SEGGER_RTT_ALIGN(Var, Alignment) Var +#endif + +#if defined(SEGGER_RTT_SECTION) || defined(SEGGER_RTT_BUFFER_SECTION) +#if (defined __GNUC__) +#define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__((section(Section))) Var +#elif (defined __ICCARM__) || (defined __ICCRX__) +#define SEGGER_RTT_PUT_SECTION(Var, Section) \ + RTT_PRAGMA(location = Section) \ + Var +#elif (defined __CC_ARM) +#define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__((section(Section), zero_init)) Var +#else +#error "Section placement not supported for this compiler." +#endif +#else +#define SEGGER_RTT_PUT_SECTION(Var, Section) Var +#endif + +#if SEGGER_RTT_ALIGNMENT +#define SEGGER_RTT_CB_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_ALIGNMENT) +#else +#define SEGGER_RTT_CB_ALIGN(Var) Var +#endif + +#if SEGGER_RTT_BUFFER_ALIGNMENT +#define SEGGER_RTT_BUFFER_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_BUFFER_ALIGNMENT) +#else +#define SEGGER_RTT_BUFFER_ALIGN(Var) Var +#endif + +#if defined(SEGGER_RTT_SECTION) +#define SEGGER_RTT_PUT_CB_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_SECTION) +#else +#define SEGGER_RTT_PUT_CB_SECTION(Var) Var +#endif + +#if defined(SEGGER_RTT_BUFFER_SECTION) +#define SEGGER_RTT_PUT_BUFFER_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_BUFFER_SECTION) +#else +#define SEGGER_RTT_PUT_BUFFER_SECTION(Var) Var +#endif + +/********************************************************************* + * + * Static const data + * + ********************************************************************** + */ + +static unsigned char _aTerminalId[16] = {'0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + +/********************************************************************* + * + * Static data + * + ********************************************************************** + */ + +// +// RTT Control Block and allocate buffers for channel 0 +// +SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(SEGGER_RTT_CB _SEGGER_RTT)); +SEGGER_RTT_PUT_BUFFER_SECTION( + SEGGER_RTT_BUFFER_ALIGN(static char _acUpBuffer[SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_UP)])); +SEGGER_RTT_PUT_BUFFER_SECTION( + SEGGER_RTT_BUFFER_ALIGN(static char _acDownBuffer[SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_DOWN)])); + +static unsigned char _ActiveTerminal; + +/********************************************************************* + * + * Static functions + * + ********************************************************************** + */ + +/********************************************************************* + * + * _DoInit() + * + * Function description + * Initializes the control block an buffers. + * May only be called via INIT() to avoid overriding settings. + * + */ +#define INIT() \ + { \ + volatile SEGGER_RTT_CB *pRTTCBInit; \ + pRTTCBInit = (volatile SEGGER_RTT_CB *)((char *)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); \ + do \ + { \ + if (pRTTCBInit->acID[0] == '\0') \ + { \ + _DoInit(); \ + } \ + } while (0); \ + } + +static void _DoInit(void) +{ + volatile SEGGER_RTT_CB + *p; // Volatile to make sure that compiler cannot change the order of accesses to the control block + // + // Initialize control block + // + p = (volatile SEGGER_RTT_CB + *)((char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access control block uncached so that nothing in the cache ever becomes + // dirty and all changes are visible in HW directly + p->MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS; + p->MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS; + // + // Initialize up buffer 0 + // + p->aUp[0].sName = "Terminal"; + p->aUp[0].pBuffer = _acUpBuffer; + p->aUp[0].SizeOfBuffer = BUFFER_SIZE_UP; + p->aUp[0].RdOff = 0u; + p->aUp[0].WrOff = 0u; + p->aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT; + // + // Initialize down buffer 0 + // + p->aDown[0].sName = "Terminal"; + p->aDown[0].pBuffer = _acDownBuffer; + p->aDown[0].SizeOfBuffer = BUFFER_SIZE_DOWN; + p->aDown[0].RdOff = 0u; + p->aDown[0].WrOff = 0u; + p->aDown[0].Flags = SEGGER_RTT_MODE_DEFAULT; + // + // Finish initialization of the control block. + // Copy Id string in three steps to make sure "SEGGER RTT" is not found + // in initializer memory (usually flash) by J-Link + // + STRCPY((char *)&p->acID[7], "RTT"); + RTT__DMB(); // Force order of memory accessed inside core for cores that allow to change the order + STRCPY((char *)&p->acID[0], "SEGGER"); + RTT__DMB(); // Force order of memory accessed inside core for cores that allow to change the order + p->acID[6] = ' '; + RTT__DMB(); // Force order of memory accessed inside core for cores that allow to change the order +} + +/********************************************************************* + * + * _WriteBlocking() + * + * Function description + * Stores a specified number of characters in SEGGER RTT ring buffer + * and updates the associated write pointer which is periodically + * read by the host. + * The caller is responsible for managing the write chunk sizes as + * _WriteBlocking() will block until all data has been posted successfully. + * + * Parameters + * pRing Ring buffer to post to. + * pBuffer Pointer to character array. Does not need to point to a \0 terminated string. + * NumBytes Number of bytes to be stored in the SEGGER RTT control block. + * + * Return value + * >= 0 - Number of bytes written into buffer. + */ +static unsigned _WriteBlocking(SEGGER_RTT_BUFFER_UP *pRing, const char *pBuffer, unsigned NumBytes) +{ + unsigned NumBytesToWrite; + unsigned NumBytesWritten; + unsigned RdOff; + unsigned WrOff; + volatile char *pDst; + // + // Write data to buffer and handle wrap-around if necessary + // + NumBytesWritten = 0u; + WrOff = pRing->WrOff; + do + { + RdOff = pRing->RdOff; // May be changed by host (debug probe) in the meantime + if (RdOff > WrOff) + { + NumBytesToWrite = RdOff - WrOff - 1u; + } + else + { + NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); + } + NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - + WrOff)); // Number of bytes that can be written until buffer wrap-around + NumBytesToWrite = MIN(NumBytesToWrite, NumBytes); + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesWritten += NumBytesToWrite; + NumBytes -= NumBytesToWrite; + WrOff += NumBytesToWrite; + while (NumBytesToWrite--) + { + *pDst++ = *pBuffer++; + }; +#else + SEGGER_RTT_MEMCPY((void *)pDst, pBuffer, NumBytesToWrite); + NumBytesWritten += NumBytesToWrite; + pBuffer += NumBytesToWrite; + NumBytes -= NumBytesToWrite; + WrOff += NumBytesToWrite; +#endif + if (WrOff == pRing->SizeOfBuffer) + { + WrOff = 0u; + } + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + pRing->WrOff = WrOff; + } while (NumBytes); + return NumBytesWritten; +} + +/********************************************************************* + * + * _WriteNoCheck() + * + * Function description + * Stores a specified number of characters in SEGGER RTT ring buffer + * and updates the associated write pointer which is periodically + * read by the host. + * It is callers responsibility to make sure data actually fits in buffer. + * + * Parameters + * pRing Ring buffer to post to. + * pBuffer Pointer to character array. Does not need to point to a \0 terminated string. + * NumBytes Number of bytes to be stored in the SEGGER RTT control block. + * + * Notes + * (1) If there might not be enough space in the "Up"-buffer, call _WriteBlocking + */ +static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP *pRing, const char *pData, unsigned NumBytes) +{ + unsigned NumBytesAtOnce; + unsigned WrOff; + unsigned Rem; + volatile char *pDst; + + WrOff = pRing->WrOff; + Rem = pRing->SizeOfBuffer - WrOff; + if (Rem > NumBytes) + { + // + // All data fits before wrap around + // + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + WrOff += NumBytes; + while (NumBytes--) + { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + pRing->WrOff = WrOff; +#else + SEGGER_RTT_MEMCPY((void *)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + pRing->WrOff = WrOff + NumBytes; +#endif + } + else + { + // + // We reach the end of the buffer, so need to wrap around + // +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + NumBytesAtOnce = Rem; + while (NumBytesAtOnce--) + { + *pDst++ = *pData++; + }; + pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; + NumBytesAtOnce = NumBytes - Rem; + while (NumBytesAtOnce--) + { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + pRing->WrOff = NumBytes - Rem; +#else + NumBytesAtOnce = Rem; + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + SEGGER_RTT_MEMCPY((void *)pDst, pData, NumBytesAtOnce); + NumBytesAtOnce = NumBytes - Rem; + pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; + SEGGER_RTT_MEMCPY((void *)pDst, pData + Rem, NumBytesAtOnce); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + pRing->WrOff = NumBytesAtOnce; +#endif + } +} + +/********************************************************************* + * + * _PostTerminalSwitch() + * + * Function description + * Switch terminal to the given terminal ID. It is the caller's + * responsibility to ensure the terminal ID is correct and there is + * enough space in the buffer for this to complete successfully. + * + * Parameters + * pRing Ring buffer to post to. + * TerminalId Terminal ID to switch to. + */ +static void _PostTerminalSwitch(SEGGER_RTT_BUFFER_UP *pRing, unsigned char TerminalId) +{ + unsigned char ac[2]; + + ac[0] = 0xFFu; + ac[1] = _aTerminalId[TerminalId]; // Caller made already sure that TerminalId does not exceed our terminal limit + _WriteBlocking(pRing, (const char *)ac, 2u); +} + +/********************************************************************* + * + * _GetAvailWriteSpace() + * + * Function description + * Returns the number of bytes that can be written to the ring + * buffer without blocking. + * + * Parameters + * pRing Ring buffer to check. + * + * Return value + * Number of bytes that are free in the buffer. + */ +static unsigned _GetAvailWriteSpace(SEGGER_RTT_BUFFER_UP *pRing) +{ + unsigned RdOff; + unsigned WrOff; + unsigned r; + // + // Avoid warnings regarding volatile access order. It's not a problem + // in this case, but dampen compiler enthusiasm. + // + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + if (RdOff <= WrOff) + { + r = pRing->SizeOfBuffer - 1u - WrOff + RdOff; + } + else + { + r = RdOff - WrOff - 1u; + } + return r; +} + +/********************************************************************* + * + * Public code + * + ********************************************************************** + */ + +/********************************************************************* + * + * SEGGER_RTT_ReadUpBufferNoLock() + * + * Function description + * Reads characters from SEGGER real-time-terminal control block + * which have been previously stored by the application. + * Do not lock against interrupts and multiple access. + * Used to do the same operation that J-Link does, to transfer + * RTT data via other channels, such as TCP/IP or UART. + * + * Parameters + * BufferIndex Index of Up-buffer to be used. + * pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. + * BufferSize Size of the target application buffer. + * + * Return value + * Number of bytes that have been read. + * + * Additional information + * This function must not be called when J-Link might also do RTT. + */ +unsigned SEGGER_RTT_ReadUpBufferNoLock(unsigned BufferIndex, void *pData, unsigned BufferSize) +{ + unsigned NumBytesRem; + unsigned NumBytesRead; + unsigned RdOff; + unsigned WrOff; + unsigned char *pBuffer; + SEGGER_RTT_BUFFER_UP *pRing; + volatile char *pSrc; + + INIT(); + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + pBuffer = (unsigned char *)pData; + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + NumBytesRead = 0u; + // + // Read from current read position to wrap-around of buffer, first + // + if (RdOff > WrOff) + { + NumBytesRem = pRing->SizeOfBuffer - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) + { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void *)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + // + // Handle wrap-around of buffer + // + if (RdOff == pRing->SizeOfBuffer) + { + RdOff = 0u; + } + } + // + // Read remaining items of buffer + // + NumBytesRem = WrOff - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + if (NumBytesRem > 0u) + { + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) + { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void *)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + } + // + // Update read offset of buffer + // + if (NumBytesRead) + { + pRing->RdOff = RdOff; + } + // + return NumBytesRead; +} + +/********************************************************************* + * + * SEGGER_RTT_ReadNoLock() + * + * Function description + * Reads characters from SEGGER real-time-terminal control block + * which have been previously stored by the host. + * Do not lock against interrupts and multiple access. + * + * Parameters + * BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). + * pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. + * BufferSize Size of the target application buffer. + * + * Return value + * Number of bytes that have been read. + */ +unsigned SEGGER_RTT_ReadNoLock(unsigned BufferIndex, void *pData, unsigned BufferSize) +{ + unsigned NumBytesRem; + unsigned NumBytesRead; + unsigned RdOff; + unsigned WrOff; + unsigned char *pBuffer; + SEGGER_RTT_BUFFER_DOWN *pRing; + volatile char *pSrc; + // + INIT(); + pRing = + (SEGGER_RTT_BUFFER_DOWN *)((char *)&_SEGGER_RTT.aDown[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + pBuffer = (unsigned char *)pData; + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + NumBytesRead = 0u; + // + // Read from current read position to wrap-around of buffer, first + // + if (RdOff > WrOff) + { + NumBytesRem = pRing->SizeOfBuffer - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) + { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void *)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + // + // Handle wrap-around of buffer + // + if (RdOff == pRing->SizeOfBuffer) + { + RdOff = 0u; + } + } + // + // Read remaining items of buffer + // + NumBytesRem = WrOff - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + if (NumBytesRem > 0u) + { + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) + { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void *)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + } + if (NumBytesRead) + { + pRing->RdOff = RdOff; + } + // + return NumBytesRead; +} + +/********************************************************************* + * + * SEGGER_RTT_ReadUpBuffer + * + * Function description + * Reads characters from SEGGER real-time-terminal control block + * which have been previously stored by the application. + * Used to do the same operation that J-Link does, to transfer + * RTT data via other channels, such as TCP/IP or UART. + * + * Parameters + * BufferIndex Index of Up-buffer to be used. + * pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. + * BufferSize Size of the target application buffer. + * + * Return value + * Number of bytes that have been read. + * + * Additional information + * This function must not be called when J-Link might also do RTT. + * This function locks against all other RTT operations. I.e. during + * the read operation, writing is also locked. + * If only one consumer reads from the up buffer, + * call sEGGER_RTT_ReadUpBufferNoLock() instead. + */ +unsigned SEGGER_RTT_ReadUpBuffer(unsigned BufferIndex, void *pBuffer, unsigned BufferSize) +{ + unsigned NumBytesRead; + + SEGGER_RTT_LOCK(); + // + // Call the non-locking read function + // + NumBytesRead = SEGGER_RTT_ReadUpBufferNoLock(BufferIndex, pBuffer, BufferSize); + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return NumBytesRead; +} + +/********************************************************************* + * + * SEGGER_RTT_Read + * + * Function description + * Reads characters from SEGGER real-time-terminal control block + * which have been previously stored by the host. + * + * Parameters + * BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). + * pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. + * BufferSize Size of the target application buffer. + * + * Return value + * Number of bytes that have been read. + */ +unsigned SEGGER_RTT_Read(unsigned BufferIndex, void *pBuffer, unsigned BufferSize) +{ + unsigned NumBytesRead; + + SEGGER_RTT_LOCK(); + // + // Call the non-locking read function + // + NumBytesRead = SEGGER_RTT_ReadNoLock(BufferIndex, pBuffer, BufferSize); + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return NumBytesRead; +} + +/********************************************************************* + * + * SEGGER_RTT_WriteWithOverwriteNoLock + * + * Function description + * Stores a specified number of characters in SEGGER RTT + * control block. + * SEGGER_RTT_WriteWithOverwriteNoLock does not lock the application + * and overwrites data if the data does not fit into the buffer. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). + * pBuffer Pointer to character array. Does not need to point to a \0 terminated string. + * NumBytes Number of bytes to be stored in the SEGGER RTT control block. + * + * Notes + * (1) If there is not enough space in the "Up"-buffer, data is overwritten. + * (2) For performance reasons this function does not call Init() + * and may only be called after RTT has been initialized. + * Either by calling SEGGER_RTT_Init() or calling another RTT API function first. + * (3) Do not use SEGGER_RTT_WriteWithOverwriteNoLock if a J-Link + * connection reads RTT data. + */ +void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes) +{ + const char *pData; + SEGGER_RTT_BUFFER_UP *pRing; + unsigned Avail; + volatile char *pDst; + // + // Get "to-host" ring buffer and copy some elements into local variables. + // + pData = (const char *)pBuffer; + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + // + // Check if we will overwrite data and need to adjust the RdOff. + // + if (pRing->WrOff == pRing->RdOff) + { + Avail = pRing->SizeOfBuffer - 1u; + } + else if (pRing->WrOff < pRing->RdOff) + { + Avail = pRing->RdOff - pRing->WrOff - 1u; + } + else + { + Avail = pRing->RdOff - pRing->WrOff - 1u + pRing->SizeOfBuffer; + } + if (NumBytes > Avail) + { + pRing->RdOff += (NumBytes - Avail); + while (pRing->RdOff >= pRing->SizeOfBuffer) + { + pRing->RdOff -= pRing->SizeOfBuffer; + } + } + // + // Write all data, no need to check the RdOff, but possibly handle multiple wrap-arounds + // + Avail = pRing->SizeOfBuffer - pRing->WrOff; + do + { + if (Avail > NumBytes) + { + // + // Last round + // + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + Avail = NumBytes; + while (NumBytes--) + { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change + // the order of memory accesses + pRing->WrOff += Avail; +#else + SEGGER_RTT_MEMCPY((void *)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change + // the order of memory accesses + pRing->WrOff += NumBytes; +#endif + break; + } + else + { + // + // Wrap-around necessary, write until wrap-around and reset WrOff + // + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytes -= Avail; + while (Avail--) + { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change + // the order of memory accesses + pRing->WrOff = 0; +#else + SEGGER_RTT_MEMCPY((void *)pDst, pData, Avail); + pData += Avail; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change + // the order of memory accesses + pRing->WrOff = 0; + NumBytes -= Avail; +#endif + Avail = (pRing->SizeOfBuffer - 1); + } + } while (NumBytes); +} + +/********************************************************************* + * + * SEGGER_RTT_WriteSkipNoLock + * + * Function description + * Stores a specified number of characters in SEGGER RTT + * control block which is then read by the host. + * SEGGER_RTT_WriteSkipNoLock does not lock the application and + * skips all data, if the data does not fit into the buffer. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). + * pBuffer Pointer to character array. Does not need to point to a \0 terminated string. + * NumBytes Number of bytes to be stored in the SEGGER RTT control block. + * MUST be > 0!!! + * This is done for performance reasons, so no initial check has do be done. + * + * Return value + * 1: Data has been copied + * 0: No space, data has not been copied + * + * Notes + * (1) If there is not enough space in the "Up"-buffer, all data is dropped. + * (2) For performance reasons this function does not call Init() + * and may only be called after RTT has been initialized. + * Either by calling SEGGER_RTT_Init() or calling another RTT API function first. + */ +#if (RTT_USE_ASM == 0) +unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes) +{ + const char *pData; + SEGGER_RTT_BUFFER_UP *pRing; + unsigned Avail; + unsigned RdOff; + unsigned WrOff; + unsigned Rem; + volatile char *pDst; + // + // Cases: + // 1) RdOff <= WrOff => Space until wrap-around is sufficient + // 2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks) + // 3) RdOff < WrOff => No space in buf + // 4) RdOff > WrOff => Space is sufficient + // 5) RdOff > WrOff => No space in buf + // + // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough + // + pData = (const char *)pBuffer; + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + if (RdOff <= WrOff) + { // Case 1), 2) or 3) + Avail = pRing->SizeOfBuffer - WrOff - + 1u; // Space until wrap-around (assume 1 byte not usable for case that RdOff == 0) + if (Avail >= NumBytes) + { // Case 1)? + CopyStraight: + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + memcpy((void *)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change + // the order of memory accesses + pRing->WrOff = WrOff + NumBytes; + return 1; + } + Avail += RdOff; // Space incl. wrap-around + if (Avail >= NumBytes) + { // Case 2? => If not, we have case 3) (does not fit) + Rem = pRing->SizeOfBuffer - WrOff; // Space until end of buffer + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + memcpy((void *)pDst, pData, Rem); // Copy 1st chunk + NumBytes -= Rem; + // + // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could + // not be used But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is + // not 0, so we can use the last element In this case, we may use a copy straight until buffer end anyway + // without needing to copy 2 chunks Therefore, check if 2nd memcpy is necessary at all + // + if (NumBytes) + { + pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; + memcpy((void *)pDst, pData + Rem, NumBytes); + } + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change + // the order of memory accesses + pRing->WrOff = NumBytes; + return 1; + } + } + else + { // Potential case 4) + Avail = RdOff - WrOff - 1u; + if (Avail >= NumBytes) + { // Case 4)? => If not, we have case 5) (does not fit) + goto CopyStraight; + } + } + return 0; // No space in buffer +} +#endif + +/********************************************************************* + * + * SEGGER_RTT_WriteDownBufferNoLock + * + * Function description + * Stores a specified number of characters in SEGGER RTT + * control block inside a buffer. + * SEGGER_RTT_WriteDownBufferNoLock does not lock the application. + * Used to do the same operation that J-Link does, to transfer + * RTT data from other channels, such as TCP/IP or UART. + * + * Parameters + * BufferIndex Index of "Down"-buffer to be used. + * pBuffer Pointer to character array. Does not need to point to a \0 terminated string. + * NumBytes Number of bytes to be stored in the SEGGER RTT control block. + * + * Return value + * Number of bytes which have been stored in the "Down"-buffer. + * + * Notes + * (1) Data is stored according to buffer flags. + * (2) For performance reasons this function does not call Init() + * and may only be called after RTT has been initialized. + * Either by calling SEGGER_RTT_Init() or calling another RTT API function first. + * + * Additional information + * This function must not be called when J-Link might also do RTT. + */ +unsigned SEGGER_RTT_WriteDownBufferNoLock(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes) +{ + unsigned Status; + unsigned Avail; + const char *pData; + SEGGER_RTT_BUFFER_UP *pRing; + // + // Get "to-target" ring buffer. + // It is save to cast that to a "to-host" buffer. Up and Down buffer differ in volatility of offsets that might be + // modified by J-Link. + // + pData = (const char *)pBuffer; + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aDown[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + // + // How we output depends upon the mode... + // + switch (pRing->Flags) + { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother. + // + Avail = _GetAvailWriteSpace(pRing); + if (Avail < NumBytes) + { + Status = 0u; + } + else + { + Status = NumBytes; + _WriteNoCheck(pRing, pData, NumBytes); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode, trim to what we can output without blocking. + // + Avail = _GetAvailWriteSpace(pRing); + Status = Avail < NumBytes ? Avail : NumBytes; + _WriteNoCheck(pRing, pData, Status); + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + Status = _WriteBlocking(pRing, pData, NumBytes); + break; + default: + Status = 0u; + break; + } + // + // Finish up. + // + return Status; +} + +/********************************************************************* + * + * SEGGER_RTT_WriteNoLock + * + * Function description + * Stores a specified number of characters in SEGGER RTT + * control block which is then read by the host. + * SEGGER_RTT_WriteNoLock does not lock the application. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). + * pBuffer Pointer to character array. Does not need to point to a \0 terminated string. + * NumBytes Number of bytes to be stored in the SEGGER RTT control block. + * + * Return value + * Number of bytes which have been stored in the "Up"-buffer. + * + * Notes + * (1) Data is stored according to buffer flags. + * (2) For performance reasons this function does not call Init() + * and may only be called after RTT has been initialized. + * Either by calling SEGGER_RTT_Init() or calling another RTT API function first. + */ +unsigned SEGGER_RTT_WriteNoLock(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes) +{ + unsigned Status; + unsigned Avail; + const char *pData; + SEGGER_RTT_BUFFER_UP *pRing; + // + // Get "to-host" ring buffer. + // + pData = (const char *)pBuffer; + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + // + // How we output depends upon the mode... + // + switch (pRing->Flags) + { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother. + // + Avail = _GetAvailWriteSpace(pRing); + if (Avail < NumBytes) + { + Status = 0u; + } + else + { + Status = NumBytes; + _WriteNoCheck(pRing, pData, NumBytes); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode, trim to what we can output without blocking. + // + Avail = _GetAvailWriteSpace(pRing); + Status = Avail < NumBytes ? Avail : NumBytes; + _WriteNoCheck(pRing, pData, Status); + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + Status = _WriteBlocking(pRing, pData, NumBytes); + break; + default: + Status = 0u; + break; + } + // + // Finish up. + // + return Status; +} + +/********************************************************************* + * + * SEGGER_RTT_WriteDownBuffer + * + * Function description + * Stores a specified number of characters in SEGGER RTT control block in a buffer. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). + * pBuffer Pointer to character array. Does not need to point to a \0 terminated string. + * NumBytes Number of bytes to be stored in the SEGGER RTT control block. + * + * Return value + * Number of bytes which have been stored in the "Down"-buffer. + * + * Notes + * (1) Data is stored according to buffer flags. + * + * Additional information + * This function must not be called when J-Link might also do RTT. + * This function locks against all other RTT operations. I.e. during + * the write operation, writing from the application is also locked. + * If only one consumer writes to the down buffer, + * call SEGGER_RTT_WriteDownBufferNoLock() instead. + */ +unsigned SEGGER_RTT_WriteDownBuffer(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes) +{ + unsigned Status; + + INIT(); + SEGGER_RTT_LOCK(); + Status = SEGGER_RTT_WriteDownBufferNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function + SEGGER_RTT_UNLOCK(); + return Status; +} + +/********************************************************************* + * + * SEGGER_RTT_Write + * + * Function description + * Stores a specified number of characters in SEGGER RTT + * control block which is then read by the host. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). + * pBuffer Pointer to character array. Does not need to point to a \0 terminated string. + * NumBytes Number of bytes to be stored in the SEGGER RTT control block. + * + * Return value + * Number of bytes which have been stored in the "Up"-buffer. + * + * Notes + * (1) Data is stored according to buffer flags. + */ +unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes) +{ + unsigned Status; + + INIT(); + SEGGER_RTT_LOCK(); + Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function + SEGGER_RTT_UNLOCK(); + return Status; +} + +/********************************************************************* + * + * SEGGER_RTT_WriteString + * + * Function description + * Stores string in SEGGER RTT control block. + * This data is read by the host. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). + * s Pointer to string. + * + * Return value + * Number of bytes which have been stored in the "Up"-buffer. + * + * Notes + * (1) Data is stored according to buffer flags. + * (2) String passed to this function has to be \0 terminated + * (3) \0 termination character is *not* stored in RTT buffer + */ +unsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char *s) +{ + unsigned Len; + + Len = STRLEN(s); + return SEGGER_RTT_Write(BufferIndex, s, Len); +} + +/********************************************************************* + * + * SEGGER_RTT_PutCharSkipNoLock + * + * Function description + * Stores a single character/byte in SEGGER RTT buffer. + * SEGGER_RTT_PutCharSkipNoLock does not lock the application and + * skips the byte, if it does not fit into the buffer. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). + * c Byte to be stored. + * + * Return value + * Number of bytes which have been stored in the "Up"-buffer. + * + * Notes + * (1) If there is not enough space in the "Up"-buffer, the character is dropped. + * (2) For performance reasons this function does not call Init() + * and may only be called after RTT has been initialized. + * Either by calling SEGGER_RTT_Init() or calling another RTT API function first. + */ + +unsigned SEGGER_RTT_PutCharSkipNoLock(unsigned BufferIndex, char c) +{ + SEGGER_RTT_BUFFER_UP *pRing; + unsigned WrOff; + unsigned Status; + volatile char *pDst; + // + // Get "to-host" ring buffer. + // + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) + { + WrOff = 0; + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) + { + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; + *pDst = c; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + pRing->WrOff = WrOff; + Status = 1; + } + else + { + Status = 0; + } + // + return Status; +} + +/********************************************************************* + * + * SEGGER_RTT_PutCharSkip + * + * Function description + * Stores a single character/byte in SEGGER RTT buffer. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). + * c Byte to be stored. + * + * Return value + * Number of bytes which have been stored in the "Up"-buffer. + * + * Notes + * (1) If there is not enough space in the "Up"-buffer, the character is dropped. + */ + +unsigned SEGGER_RTT_PutCharSkip(unsigned BufferIndex, char c) +{ + SEGGER_RTT_BUFFER_UP *pRing; + unsigned WrOff; + unsigned Status; + volatile char *pDst; + // + // Prepare + // + INIT(); + SEGGER_RTT_LOCK(); + // + // Get "to-host" ring buffer. + // + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) + { + WrOff = 0; + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) + { + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; + *pDst = c; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + pRing->WrOff = WrOff; + Status = 1; + } + else + { + Status = 0; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return Status; +} + +/********************************************************************* + * + * SEGGER_RTT_PutChar + * + * Function description + * Stores a single character/byte in SEGGER RTT buffer. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). + * c Byte to be stored. + * + * Return value + * Number of bytes which have been stored in the "Up"-buffer. + * + * Notes + * (1) Data is stored according to buffer flags. + */ + +unsigned SEGGER_RTT_PutChar(unsigned BufferIndex, char c) +{ + SEGGER_RTT_BUFFER_UP *pRing; + unsigned WrOff; + unsigned Status; + volatile char *pDst; + // + // Prepare + // + INIT(); + SEGGER_RTT_LOCK(); + // + // Get "to-host" ring buffer. + // + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) + { + WrOff = 0; + } + // + // Wait for free space if mode is set to blocking + // + if (pRing->Flags == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) + { + while (WrOff == pRing->RdOff) + { + ; + } + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) + { + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; + *pDst = c; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + pRing->WrOff = WrOff; + Status = 1; + } + else + { + Status = 0; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + return Status; +} + +/********************************************************************* + * + * SEGGER_RTT_GetKey + * + * Function description + * Reads one character from the SEGGER RTT buffer. + * Host has previously stored data there. + * + * Return value + * < 0 - No character available (buffer empty). + * >= 0 - Character which has been read. (Possible values: 0 - 255) + * + * Notes + * (1) This function is only specified for accesses to RTT buffer 0. + */ +int SEGGER_RTT_GetKey(void) +{ + char c; + int r; + + r = (int)SEGGER_RTT_Read(0u, &c, 1u); + if (r == 1) + { + r = (int)(unsigned char)c; + } + else + { + r = -1; + } + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_WaitKey + * + * Function description + * Waits until at least one character is avaible in the SEGGER RTT buffer. + * Once a character is available, it is read and this function returns. + * + * Return value + * >=0 - Character which has been read. + * + * Notes + * (1) This function is only specified for accesses to RTT buffer 0 + * (2) This function is blocking if no character is present in RTT buffer + */ +int SEGGER_RTT_WaitKey(void) +{ + int r; + + do + { + r = SEGGER_RTT_GetKey(); + } while (r < 0); + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_HasKey + * + * Function description + * Checks if at least one character for reading is available in the SEGGER RTT buffer. + * + * Return value + * == 0 - No characters are available to read. + * == 1 - At least one character is available. + * + * Notes + * (1) This function is only specified for accesses to RTT buffer 0 + */ +int SEGGER_RTT_HasKey(void) +{ + SEGGER_RTT_BUFFER_DOWN *pRing; + unsigned RdOff; + int r; + + INIT(); + pRing = + (SEGGER_RTT_BUFFER_DOWN *)((char *)&_SEGGER_RTT.aDown[0] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + RdOff = pRing->RdOff; + if (RdOff != pRing->WrOff) + { + r = 1; + } + else + { + r = 0; + } + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_HasData + * + * Function description + * Check if there is data from the host in the given buffer. + * + * Return value: + * ==0: No data + * !=0: Data in buffer + * + */ +unsigned SEGGER_RTT_HasData(unsigned BufferIndex) +{ + SEGGER_RTT_BUFFER_DOWN *pRing; + unsigned v; + + pRing = + (SEGGER_RTT_BUFFER_DOWN *)((char *)&_SEGGER_RTT.aDown[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + v = pRing->WrOff; + return v - pRing->RdOff; +} + +/********************************************************************* + * + * SEGGER_RTT_HasDataUp + * + * Function description + * Check if there is data remaining to be sent in the given buffer. + * + * Return value: + * ==0: No data + * !=0: Data in buffer + * + */ +unsigned SEGGER_RTT_HasDataUp(unsigned BufferIndex) +{ + SEGGER_RTT_BUFFER_UP *pRing; + unsigned v; + + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + v = pRing->RdOff; + return pRing->WrOff - v; +} + +/********************************************************************* + * + * SEGGER_RTT_AllocDownBuffer + * + * Function description + * Run-time configuration of the next down-buffer (H->T). + * The next buffer, which is not used yet is configured. + * This includes: Buffer address, size, name, flags, ... + * + * Parameters + * sName Pointer to a constant name string. + * pBuffer Pointer to a buffer to be used. + * BufferSize Size of the buffer. + * Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). + * + * Return value + * >= 0 - O.K. Buffer Index + * < 0 - Error + */ +int SEGGER_RTT_AllocDownBuffer(const char *sName, void *pBuffer, unsigned BufferSize, unsigned Flags) +{ + int BufferIndex; + volatile SEGGER_RTT_CB *pRTTCB; + + INIT(); + SEGGER_RTT_LOCK(); + pRTTCB = (volatile SEGGER_RTT_CB + *)((unsigned char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link + // side and all of our changes go into HW directly + BufferIndex = 0; + do + { + if (pRTTCB->aDown[BufferIndex].pBuffer == NULL) + { + break; + } + BufferIndex++; + } while (BufferIndex < pRTTCB->MaxNumDownBuffers); + if (BufferIndex < pRTTCB->MaxNumDownBuffers) + { + pRTTCB->aDown[BufferIndex].sName = sName; + pRTTCB->aDown[BufferIndex].pBuffer = (char *)pBuffer; + pRTTCB->aDown[BufferIndex].SizeOfBuffer = BufferSize; + pRTTCB->aDown[BufferIndex].RdOff = 0u; + pRTTCB->aDown[BufferIndex].WrOff = 0u; + pRTTCB->aDown[BufferIndex].Flags = Flags; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + } + else + { + BufferIndex = -1; + } + SEGGER_RTT_UNLOCK(); + return BufferIndex; +} + +/********************************************************************* + * + * SEGGER_RTT_AllocUpBuffer + * + * Function description + * Run-time configuration of the next up-buffer (T->H). + * The next buffer, which is not used yet is configured. + * This includes: Buffer address, size, name, flags, ... + * + * Parameters + * sName Pointer to a constant name string. + * pBuffer Pointer to a buffer to be used. + * BufferSize Size of the buffer. + * Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). + * + * Return value + * >= 0 - O.K. Buffer Index + * < 0 - Error + */ +int SEGGER_RTT_AllocUpBuffer(const char *sName, void *pBuffer, unsigned BufferSize, unsigned Flags) +{ + int BufferIndex; + volatile SEGGER_RTT_CB *pRTTCB; + + INIT(); + SEGGER_RTT_LOCK(); + pRTTCB = (volatile SEGGER_RTT_CB + *)((unsigned char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link + // side and all of our changes go into HW directly + BufferIndex = 0; + do + { + if (pRTTCB->aUp[BufferIndex].pBuffer == NULL) + { + break; + } + BufferIndex++; + } while (BufferIndex < pRTTCB->MaxNumUpBuffers); + if (BufferIndex < pRTTCB->MaxNumUpBuffers) + { + pRTTCB->aUp[BufferIndex].sName = sName; + pRTTCB->aUp[BufferIndex].pBuffer = (char *)pBuffer; + pRTTCB->aUp[BufferIndex].SizeOfBuffer = BufferSize; + pRTTCB->aUp[BufferIndex].RdOff = 0u; + pRTTCB->aUp[BufferIndex].WrOff = 0u; + pRTTCB->aUp[BufferIndex].Flags = Flags; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + } + else + { + BufferIndex = -1; + } + SEGGER_RTT_UNLOCK(); + return BufferIndex; +} + +/********************************************************************* + * + * SEGGER_RTT_ConfigUpBuffer + * + * Function description + * Run-time configuration of a specific up-buffer (T->H). + * Buffer to be configured is specified by index. + * This includes: Buffer address, size, name, flags, ... + * + * Parameters + * BufferIndex Index of the buffer to configure. + * sName Pointer to a constant name string. + * pBuffer Pointer to a buffer to be used. + * BufferSize Size of the buffer. + * Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). + * + * Return value + * >= 0 - O.K. + * < 0 - Error + * + * Additional information + * Buffer 0 is configured on compile-time. + * May only be called once per buffer. + * Buffer name and flags can be reconfigured using the appropriate functions. + */ +int SEGGER_RTT_ConfigUpBuffer( + unsigned BufferIndex, const char *sName, void *pBuffer, unsigned BufferSize, unsigned Flags) +{ + int r; + volatile SEGGER_RTT_CB *pRTTCB; + volatile SEGGER_RTT_BUFFER_UP *pUp; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB + *)((unsigned char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link + // side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) + { + SEGGER_RTT_LOCK(); + pUp = &pRTTCB->aUp[BufferIndex]; + if (BufferIndex) + { + pUp->sName = sName; + pUp->pBuffer = (char *)pBuffer; + pUp->SizeOfBuffer = BufferSize; + pUp->RdOff = 0u; + pUp->WrOff = 0u; + } + pUp->Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } + else + { + r = -1; + } + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_ConfigDownBuffer + * + * Function description + * Run-time configuration of a specific down-buffer (H->T). + * Buffer to be configured is specified by index. + * This includes: Buffer address, size, name, flags, ... + * + * Parameters + * BufferIndex Index of the buffer to configure. + * sName Pointer to a constant name string. + * pBuffer Pointer to a buffer to be used. + * BufferSize Size of the buffer. + * Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). + * + * Return value + * >= 0 O.K. + * < 0 Error + * + * Additional information + * Buffer 0 is configured on compile-time. + * May only be called once per buffer. + * Buffer name and flags can be reconfigured using the appropriate functions. + */ +int SEGGER_RTT_ConfigDownBuffer( + unsigned BufferIndex, const char *sName, void *pBuffer, unsigned BufferSize, unsigned Flags) +{ + int r; + volatile SEGGER_RTT_CB *pRTTCB; + volatile SEGGER_RTT_BUFFER_DOWN *pDown; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB + *)((unsigned char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link + // side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) + { + SEGGER_RTT_LOCK(); + pDown = &pRTTCB->aDown[BufferIndex]; + if (BufferIndex) + { + pDown->sName = sName; + pDown->pBuffer = (char *)pBuffer; + pDown->SizeOfBuffer = BufferSize; + pDown->RdOff = 0u; + pDown->WrOff = 0u; + } + pDown->Flags = Flags; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the + // order of memory accesses + SEGGER_RTT_UNLOCK(); + r = 0; + } + else + { + r = -1; + } + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_SetNameUpBuffer + * + * Function description + * Run-time configuration of a specific up-buffer name (T->H). + * Buffer to be configured is specified by index. + * + * Parameters + * BufferIndex Index of the buffer to renamed. + * sName Pointer to a constant name string. + * + * Return value + * >= 0 O.K. + * < 0 Error + */ +int SEGGER_RTT_SetNameUpBuffer(unsigned BufferIndex, const char *sName) +{ + int r; + volatile SEGGER_RTT_CB *pRTTCB; + volatile SEGGER_RTT_BUFFER_UP *pUp; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB + *)((unsigned char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link + // side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) + { + SEGGER_RTT_LOCK(); + pUp = &pRTTCB->aUp[BufferIndex]; + pUp->sName = sName; + SEGGER_RTT_UNLOCK(); + r = 0; + } + else + { + r = -1; + } + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_SetNameDownBuffer + * + * Function description + * Run-time configuration of a specific Down-buffer name (T->H). + * Buffer to be configured is specified by index. + * + * Parameters + * BufferIndex Index of the buffer to renamed. + * sName Pointer to a constant name string. + * + * Return value + * >= 0 O.K. + * < 0 Error + */ +int SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char *sName) +{ + int r; + volatile SEGGER_RTT_CB *pRTTCB; + volatile SEGGER_RTT_BUFFER_DOWN *pDown; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB + *)((unsigned char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link + // side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) + { + SEGGER_RTT_LOCK(); + pDown = &pRTTCB->aDown[BufferIndex]; + pDown->sName = sName; + SEGGER_RTT_UNLOCK(); + r = 0; + } + else + { + r = -1; + } + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_SetFlagsUpBuffer + * + * Function description + * Run-time configuration of specific up-buffer flags (T->H). + * Buffer to be configured is specified by index. + * + * Parameters + * BufferIndex Index of the buffer. + * Flags Flags to set for the buffer. + * + * Return value + * >= 0 O.K. + * < 0 Error + */ +int SEGGER_RTT_SetFlagsUpBuffer(unsigned BufferIndex, unsigned Flags) +{ + int r; + volatile SEGGER_RTT_CB *pRTTCB; + volatile SEGGER_RTT_BUFFER_UP *pUp; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB + *)((unsigned char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link + // side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) + { + SEGGER_RTT_LOCK(); + pUp = &pRTTCB->aUp[BufferIndex]; + pUp->Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } + else + { + r = -1; + } + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_SetFlagsDownBuffer + * + * Function description + * Run-time configuration of specific Down-buffer flags (T->H). + * Buffer to be configured is specified by index. + * + * Parameters + * BufferIndex Index of the buffer to renamed. + * Flags Flags to set for the buffer. + * + * Return value + * >= 0 O.K. + * < 0 Error + */ +int SEGGER_RTT_SetFlagsDownBuffer(unsigned BufferIndex, unsigned Flags) +{ + int r; + volatile SEGGER_RTT_CB *pRTTCB; + volatile SEGGER_RTT_BUFFER_DOWN *pDown; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB + *)((unsigned char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link + // side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) + { + SEGGER_RTT_LOCK(); + pDown = &pRTTCB->aDown[BufferIndex]; + pDown->Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } + else + { + r = -1; + } + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_Init + * + * Function description + * Initializes the RTT Control Block. + * Should be used in RAM targets, at start of the application. + * + */ +void SEGGER_RTT_Init(void) +{ + _DoInit(); +} + +/********************************************************************* + * + * SEGGER_RTT_SetTerminal + * + * Function description + * Sets the terminal to be used for output on channel 0. + * + * Parameters + * TerminalId Index of the terminal. + * + * Return value + * >= 0 O.K. + * < 0 Error (e.g. if RTT is configured for non-blocking mode and there was no space in the buffer to set the new + * terminal Id) + * + * Notes + * (1) Buffer 0 is always reserved for terminal I/O, so we can use index 0 here, fixed + */ +int SEGGER_RTT_SetTerminal(unsigned char TerminalId) +{ + unsigned char ac[2]; + SEGGER_RTT_BUFFER_UP *pRing; + unsigned Avail; + int r; + + INIT(); + r = 0; + ac[0] = 0xFFu; + if (TerminalId < sizeof(_aTerminalId)) + { // We only support a certain number of channels + ac[1] = _aTerminalId[TerminalId]; + pRing = (SEGGER_RTT_BUFFER_UP + *)((char *)&_SEGGER_RTT.aUp[0] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side + // and all of our changes go into HW directly + SEGGER_RTT_LOCK(); // Lock to make sure that no other task is writing into buffer, while we are and number of + // free bytes in buffer does not change downwards after checking and before writing + if ((pRing->Flags & SEGGER_RTT_MODE_MASK) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) + { + _ActiveTerminal = TerminalId; + _WriteBlocking(pRing, (const char *)ac, 2u); + } + else + { // Skipping mode or trim mode? => We cannot trim this command so handling is the same for both modes + Avail = _GetAvailWriteSpace(pRing); + if (Avail >= 2) + { + _ActiveTerminal = TerminalId; // Only change active terminal in case of success + _WriteNoCheck(pRing, (const char *)ac, 2u); + } + else + { + r = -1; + } + } + SEGGER_RTT_UNLOCK(); + } + else + { + r = -1; + } + return r; +} + +/********************************************************************* + * + * SEGGER_RTT_TerminalOut + * + * Function description + * Writes a string to the given terminal + * without changing the terminal for channel 0. + * + * Parameters + * TerminalId Index of the terminal. + * s String to be printed on the terminal. + * + * Return value + * >= 0 - Number of bytes written. + * < 0 - Error. + * + */ +int SEGGER_RTT_TerminalOut(unsigned char TerminalId, const char *s) +{ + int Status; + unsigned FragLen; + unsigned Avail; + SEGGER_RTT_BUFFER_UP *pRing; + // + INIT(); + // + // Validate terminal ID. + // + if (TerminalId < (char)sizeof(_aTerminalId)) + { // We only support a certain number of channels + // + // Get "to-host" ring buffer. + // + pRing = (SEGGER_RTT_BUFFER_UP + *)((char *)&_SEGGER_RTT.aUp[0] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side + // and all of our changes go into HW directly + // + // Need to be able to change terminal, write data, change back. + // Compute the fixed and variable sizes. + // + FragLen = STRLEN(s); + // + // How we output depends upon the mode... + // + SEGGER_RTT_LOCK(); + Avail = _GetAvailWriteSpace(pRing); + switch (pRing->Flags & SEGGER_RTT_MODE_MASK) + { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother switching terminals at all. + // + if (Avail < (FragLen + 4u)) + { + Status = 0; + } + else + { + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, FragLen); + _PostTerminalSwitch(pRing, _ActiveTerminal); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode and there is not enough space for everything, + // trim the output but always include the terminal switch. If no room + // for terminal switch, skip that totally. + // + if (Avail < 4u) + { + Status = -1; + } + else + { + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, (FragLen < (Avail - 4u)) ? FragLen : (Avail - 4u)); + _PostTerminalSwitch(pRing, _ActiveTerminal); + } + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, FragLen); + _PostTerminalSwitch(pRing, _ActiveTerminal); + break; + default: + Status = -1; + break; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + } + else + { + Status = -1; + } + return Status; +} + +/********************************************************************* + * + * SEGGER_RTT_GetAvailWriteSpace + * + * Function description + * Returns the number of bytes available in the ring buffer. + * + * Parameters + * BufferIndex Index of the up buffer. + * + * Return value + * Number of bytes that are free in the selected up buffer. + */ +unsigned SEGGER_RTT_GetAvailWriteSpace(unsigned BufferIndex) +{ + SEGGER_RTT_BUFFER_UP *pRing; + + pRing = + (SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[BufferIndex] + + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the + // J-Link side and all of our changes go into HW directly + return _GetAvailWriteSpace(pRing); +} + +/********************************************************************* + * + * SEGGER_RTT_GetBytesInBuffer() + * + * Function description + * Returns the number of bytes currently used in the up buffer. + * + * Parameters + * BufferIndex Index of the up buffer. + * + * Return value + * Number of bytes that are used in the buffer. + */ +unsigned SEGGER_RTT_GetBytesInBuffer(unsigned BufferIndex) +{ + unsigned RdOff; + unsigned WrOff; + unsigned r; + volatile SEGGER_RTT_CB *pRTTCB; + // + // Avoid warnings regarding volatile access order. It's not a problem + // in this case, but dampen compiler enthusiasm. + // + pRTTCB = (volatile SEGGER_RTT_CB + *)((unsigned char *)&_SEGGER_RTT + + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link + // side and all of our changes go into HW directly + RdOff = pRTTCB->aUp[BufferIndex].RdOff; + WrOff = pRTTCB->aUp[BufferIndex].WrOff; + if (RdOff <= WrOff) + { + r = WrOff - RdOff; + } + else + { + r = pRTTCB->aUp[BufferIndex].SizeOfBuffer - (WrOff - RdOff); + } + return r; +} + +/*************************** End of file ****************************/ diff --git a/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT.h b/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT.h new file mode 100644 index 0000000..c2cb2ee --- /dev/null +++ b/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT.h @@ -0,0 +1,440 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 7.22b * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT.h +Purpose : Implementation of SEGGER real-time transfer which allows + real-time communication on targets which support debugger + memory accesses while the CPU is running. +Revision: $Rev: 20869 $ +---------------------------------------------------------------------- +*/ + +#ifndef SEGGER_RTT_H +#define SEGGER_RTT_H + +#include "SEGGER_RTT_Conf.h" + +/********************************************************************* + * + * Defines, defaults + * + ********************************************************************** + */ +#ifndef RTT_USE_ASM +#if (defined __SES_ARM) // SEGGER Embedded Studio +#define _CC_HAS_RTT_ASM_SUPPORT 1 +#elif (defined __CROSSWORKS_ARM) // Rowley Crossworks +#define _CC_HAS_RTT_ASM_SUPPORT 1 +#elif (defined __ARMCC_VERSION) // ARM compiler +#if (__ARMCC_VERSION >= 6000000) // ARM compiler V6.0 and later is clang based +#define _CC_HAS_RTT_ASM_SUPPORT 1 +#else +#define _CC_HAS_RTT_ASM_SUPPORT 0 +#endif +#elif (defined __GNUC__) // GCC +#define _CC_HAS_RTT_ASM_SUPPORT 1 +#elif (defined __clang__) // Clang compiler +#define _CC_HAS_RTT_ASM_SUPPORT 1 +#elif ((defined __IASMARM__) || (defined __ICCARM__)) // IAR assembler/compiler +#define _CC_HAS_RTT_ASM_SUPPORT 1 +#else +#define _CC_HAS_RTT_ASM_SUPPORT 0 +#endif +#if ((defined __IASMARM__) || (defined __ICCARM__)) // IAR assembler/compiler +// +// IAR assembler / compiler +// +#if (__VER__ < 6300000) +#define VOLATILE +#else +#define VOLATILE volatile +#endif +#if (defined __ARM7M__) // Needed for old versions that do not know the define yet +#if (__CORE__ == __ARM7M__) // Cortex-M3 +#define _CORE_HAS_RTT_ASM_SUPPORT 1 +#endif +#endif +#if (defined __ARM7EM__) // Needed for old versions that do not know the define yet +#if (__CORE__ == __ARM7EM__) // Cortex-M4/M7 +#define _CORE_HAS_RTT_ASM_SUPPORT 1 +#define _CORE_NEEDS_DMB 1 +#define RTT__DMB() asm VOLATILE("DMB"); +#endif +#endif +#if (defined __ARM8M_BASELINE__) // Needed for old versions that do not know the define yet +#if (__CORE__ == __ARM8M_BASELINE__) // Cortex-M23 +#define _CORE_HAS_RTT_ASM_SUPPORT 0 +#define _CORE_NEEDS_DMB 1 +#define RTT__DMB() asm VOLATILE("DMB"); +#endif +#endif +#if (defined __ARM8M_MAINLINE__) // Needed for old versions that do not know the define yet +#if (__CORE__ == __ARM8M_MAINLINE__) // Cortex-M33 +#define _CORE_HAS_RTT_ASM_SUPPORT 1 +#define _CORE_NEEDS_DMB 1 +#define RTT__DMB() asm VOLATILE("DMB"); +#endif +#endif +#else +// +// GCC / Clang +// +#if (defined __ARM_ARCH_7M__) // Cortex-M3 +#define _CORE_HAS_RTT_ASM_SUPPORT 1 +#elif (defined __ARM_ARCH_7EM__) // Cortex-M4/M7 +#define _CORE_HAS_RTT_ASM_SUPPORT 1 +#define _CORE_NEEDS_DMB 1 +#define RTT__DMB() __asm volatile("dmb\n" : : :); +#elif (defined __ARM_ARCH_8M_BASE__) // Cortex-M23 +#define _CORE_HAS_RTT_ASM_SUPPORT 0 +#define _CORE_NEEDS_DMB 1 +#define RTT__DMB() __asm volatile("dmb\n" : : :); +#elif (defined __ARM_ARCH_8M_MAIN__) // Cortex-M33 +#define _CORE_HAS_RTT_ASM_SUPPORT 1 +#define _CORE_NEEDS_DMB 1 +#define RTT__DMB() __asm volatile("dmb\n" : : :); +#else +#define _CORE_HAS_RTT_ASM_SUPPORT 0 +#endif +#endif +// +// If IDE and core support the ASM version, enable ASM version by default +// +#ifndef _CORE_HAS_RTT_ASM_SUPPORT +#define _CORE_HAS_RTT_ASM_SUPPORT 0 // Default for unknown cores +#endif +#if (_CC_HAS_RTT_ASM_SUPPORT && _CORE_HAS_RTT_ASM_SUPPORT) +#define RTT_USE_ASM (1) +#else +#define RTT_USE_ASM (0) +#endif +#endif + +// +// We need to know if a DMB is needed to make sure that on Cortex-M7 etc. +// the order of accesses to the ring buffers is guaranteed +// Needed for: Cortex-M7, Cortex-M23, Cortex-M33 +// +#ifndef _CORE_NEEDS_DMB +#define _CORE_NEEDS_DMB 0 +#endif + +#ifndef RTT__DMB +#if _CORE_NEEDS_DMB +#error "Don't know how to place inline assembly for DMB" +#else +#define RTT__DMB() +#endif +#endif + +#ifndef SEGGER_RTT_CPU_CACHE_LINE_SIZE +#define SEGGER_RTT_CPU_CACHE_LINE_SIZE \ + (0) // On most target systems where RTT is used, we do not have a CPU cache, therefore 0 is a good default here +#endif + +#ifndef SEGGER_RTT_UNCACHED_OFF +#if SEGGER_RTT_CPU_CACHE_LINE_SIZE +#error "SEGGER_RTT_UNCACHED_OFF must be defined when setting SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" +#else +#define SEGGER_RTT_UNCACHED_OFF (0) +#endif +#endif +#if RTT_USE_ASM +#if SEGGER_RTT_CPU_CACHE_LINE_SIZE +#error "RTT_USE_ASM is not available if SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" +#endif +#endif + +#ifndef SEGGER_RTT_ASM // defined when SEGGER_RTT.h is included from assembly file +#include +#include + +/********************************************************************* + * + * Defines, fixed + * + ********************************************************************** + */ + +// +// Determine how much we must pad the control block to make it a multiple of a cache line in size +// Assuming: U8 = 1B +// U16 = 2B +// U32 = 4B +// U8/U16/U32* = 4B +// +#if SEGGER_RTT_CPU_CACHE_LINE_SIZE // Avoid division by zero in case we do not have any cache +#define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) \ + (((NumBytes + SEGGER_RTT_CPU_CACHE_LINE_SIZE - 1) / SEGGER_RTT_CPU_CACHE_LINE_SIZE) * \ + SEGGER_RTT_CPU_CACHE_LINE_SIZE) +#else +#define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (NumBytes) +#endif +#define SEGGER_RTT__CB_SIZE (16 + 4 + 4 + (SEGGER_RTT_MAX_NUM_UP_BUFFERS * 24) + (SEGGER_RTT_MAX_NUM_DOWN_BUFFERS * 24)) +#define SEGGER_RTT__CB_PADDING (SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(SEGGER_RTT__CB_SIZE) - SEGGER_RTT__CB_SIZE) + +/********************************************************************* + * + * Types + * + ********************************************************************** + */ + +// +// Description for a circular buffer (also called "ring buffer") +// which is used as up-buffer (T->H) +// +typedef struct +{ + const char *sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + char *pBuffer; // Pointer to start of buffer + unsigned + SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the + // buffer in order to avoid the problem of being unable to distinguish between full and empty. + unsigned WrOff; // Position of next item to be written by either target. + volatile unsigned + RdOff; // Position of next item to be read by host. Must be volatile since it may be modified by host. + unsigned Flags; // Contains configuration flags +} SEGGER_RTT_BUFFER_UP; + +// +// Description for a circular buffer (also called "ring buffer") +// which is used as down-buffer (H->T) +// +typedef struct +{ + const char *sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + char *pBuffer; // Pointer to start of buffer + unsigned + SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the + // buffer in order to avoid the problem of being unable to distinguish between full and empty. + volatile unsigned + WrOff; // Position of next item to be written by host. Must be volatile since it may be modified by host. + unsigned RdOff; // Position of next item to be read by target (down-buffer). + unsigned Flags; // Contains configuration flags +} SEGGER_RTT_BUFFER_DOWN; + +// +// RTT control block which describes the number of buffers available +// as well as the configuration for each buffer +// +// +typedef struct +{ + char acID[16]; // Initialized to "SEGGER RTT" + int MaxNumUpBuffers; // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2) + int MaxNumDownBuffers; // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2) + SEGGER_RTT_BUFFER_UP aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS]; // Up buffers, transferring information up from target via + // debug probe to host + SEGGER_RTT_BUFFER_DOWN aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS]; // Down buffers, transferring information down from + // host via debug probe to target +#if SEGGER_RTT__CB_PADDING + unsigned char aDummy[SEGGER_RTT__CB_PADDING]; +#endif +} SEGGER_RTT_CB; + +/********************************************************************* + * + * Global data + * + ********************************************************************** + */ +extern SEGGER_RTT_CB _SEGGER_RTT; + +/********************************************************************* + * + * RTT API functions + * + ********************************************************************** + */ +#ifdef __cplusplus +extern "C" { +#endif +int SEGGER_RTT_AllocDownBuffer(const char *sName, void *pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_AllocUpBuffer(const char *sName, void *pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_ConfigUpBuffer( + unsigned BufferIndex, const char *sName, void *pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_ConfigDownBuffer( + unsigned BufferIndex, const char *sName, void *pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_GetKey(void); +unsigned SEGGER_RTT_HasData(unsigned BufferIndex); +int SEGGER_RTT_HasKey(void); +unsigned SEGGER_RTT_HasDataUp(unsigned BufferIndex); +void SEGGER_RTT_Init(void); +unsigned SEGGER_RTT_Read(unsigned BufferIndex, void *pBuffer, unsigned BufferSize); +unsigned SEGGER_RTT_ReadNoLock(unsigned BufferIndex, void *pData, unsigned BufferSize); +int SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char *sName); +int SEGGER_RTT_SetNameUpBuffer(unsigned BufferIndex, const char *sName); +int SEGGER_RTT_SetFlagsDownBuffer(unsigned BufferIndex, unsigned Flags); +int SEGGER_RTT_SetFlagsUpBuffer(unsigned BufferIndex, unsigned Flags); +int SEGGER_RTT_WaitKey(void); +unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteNoLock(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_ASM_WriteSkipNoLock(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char *s); +void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_PutChar(unsigned BufferIndex, char c); +unsigned SEGGER_RTT_PutCharSkip(unsigned BufferIndex, char c); +unsigned SEGGER_RTT_PutCharSkipNoLock(unsigned BufferIndex, char c); +unsigned SEGGER_RTT_GetAvailWriteSpace(unsigned BufferIndex); +unsigned SEGGER_RTT_GetBytesInBuffer(unsigned BufferIndex); +// +// Function macro for performance optimization +// +#define SEGGER_RTT_HASDATA(n) \ + (((SEGGER_RTT_BUFFER_DOWN *)((char *)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - \ + ((SEGGER_RTT_BUFFER_DOWN *)((char *)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) + +#if RTT_USE_ASM +#define SEGGER_RTT_WriteSkipNoLock SEGGER_RTT_ASM_WriteSkipNoLock +#endif + +/********************************************************************* + * + * RTT transfer functions to send RTT data via other channels. + * + ********************************************************************** + */ +unsigned SEGGER_RTT_ReadUpBuffer(unsigned BufferIndex, void *pBuffer, unsigned BufferSize); +unsigned SEGGER_RTT_ReadUpBufferNoLock(unsigned BufferIndex, void *pData, unsigned BufferSize); +unsigned SEGGER_RTT_WriteDownBuffer(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteDownBufferNoLock(unsigned BufferIndex, const void *pBuffer, unsigned NumBytes); + +#define SEGGER_RTT_HASDATA_UP(n) \ + (((SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - \ + ((SEGGER_RTT_BUFFER_UP *)((char *)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF)) \ + ->RdOff) // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into + // HW directly + +/********************************************************************* + * + * RTT "Terminal" API functions + * + ********************************************************************** + */ +int SEGGER_RTT_SetTerminal(unsigned char TerminalId); +int SEGGER_RTT_TerminalOut(unsigned char TerminalId, const char *s); + +/********************************************************************* + * + * RTT printf functions (require SEGGER_RTT_printf.c) + * + ********************************************************************** + */ +int SEGGER_RTT_printf(unsigned BufferIndex, const char *sFormat, ...); +int SEGGER_RTT_vprintf(unsigned BufferIndex, const char *sFormat, va_list *pParamList); + +#ifdef __cplusplus +} +#endif + +#endif // ifndef(SEGGER_RTT_ASM) + +/********************************************************************* + * + * Defines + * + ********************************************************************** + */ + +// +// Operating modes. Define behavior if buffer is full (not enough space for entire message) +// +#define SEGGER_RTT_MODE_NO_BLOCK_SKIP (0) // Skip. Do not block, output nothing. (Default) +#define SEGGER_RTT_MODE_NO_BLOCK_TRIM (1) // Trim: Do not block, output as much as fits. +#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (2) // Block: Wait until there is space in the buffer. +#define SEGGER_RTT_MODE_MASK (3) + +// +// Control sequences, based on ANSI. +// Can be used to control color, and clear the screen +// +#define RTT_CTRL_RESET "\x1B[0m" // Reset to default colors +#define RTT_CTRL_CLEAR "\x1B[2J" // Clear screen, reposition cursor to top left + +#define RTT_CTRL_TEXT_BLACK "\x1B[2;30m" +#define RTT_CTRL_TEXT_RED "\x1B[2;31m" +#define RTT_CTRL_TEXT_GREEN "\x1B[2;32m" +#define RTT_CTRL_TEXT_YELLOW "\x1B[2;33m" +#define RTT_CTRL_TEXT_BLUE "\x1B[2;34m" +#define RTT_CTRL_TEXT_MAGENTA "\x1B[2;35m" +#define RTT_CTRL_TEXT_CYAN "\x1B[2;36m" +#define RTT_CTRL_TEXT_WHITE "\x1B[2;37m" + +#define RTT_CTRL_TEXT_BRIGHT_BLACK "\x1B[1;30m" +#define RTT_CTRL_TEXT_BRIGHT_RED "\x1B[1;31m" +#define RTT_CTRL_TEXT_BRIGHT_GREEN "\x1B[1;32m" +#define RTT_CTRL_TEXT_BRIGHT_YELLOW "\x1B[1;33m" +#define RTT_CTRL_TEXT_BRIGHT_BLUE "\x1B[1;34m" +#define RTT_CTRL_TEXT_BRIGHT_MAGENTA "\x1B[1;35m" +#define RTT_CTRL_TEXT_BRIGHT_CYAN "\x1B[1;36m" +#define RTT_CTRL_TEXT_BRIGHT_WHITE "\x1B[1;37m" + +#define RTT_CTRL_BG_BLACK "\x1B[24;40m" +#define RTT_CTRL_BG_RED "\x1B[24;41m" +#define RTT_CTRL_BG_GREEN "\x1B[24;42m" +#define RTT_CTRL_BG_YELLOW "\x1B[24;43m" +#define RTT_CTRL_BG_BLUE "\x1B[24;44m" +#define RTT_CTRL_BG_MAGENTA "\x1B[24;45m" +#define RTT_CTRL_BG_CYAN "\x1B[24;46m" +#define RTT_CTRL_BG_WHITE "\x1B[24;47m" + +#define RTT_CTRL_BG_BRIGHT_BLACK "\x1B[4;40m" +#define RTT_CTRL_BG_BRIGHT_RED "\x1B[4;41m" +#define RTT_CTRL_BG_BRIGHT_GREEN "\x1B[4;42m" +#define RTT_CTRL_BG_BRIGHT_YELLOW "\x1B[4;43m" +#define RTT_CTRL_BG_BRIGHT_BLUE "\x1B[4;44m" +#define RTT_CTRL_BG_BRIGHT_MAGENTA "\x1B[4;45m" +#define RTT_CTRL_BG_BRIGHT_CYAN "\x1B[4;46m" +#define RTT_CTRL_BG_BRIGHT_WHITE "\x1B[4;47m" + +#endif + +/*************************** End of file ****************************/ diff --git a/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT_Conf.h b/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT_Conf.h new file mode 100644 index 0000000..88a72e9 --- /dev/null +++ b/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT_Conf.h @@ -0,0 +1,429 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 7.22b * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT_Conf.h +Purpose : Implementation of SEGGER real-time transfer (RTT) which + allows real-time communication on targets which support + debugger memory accesses while the CPU is running. +Revision: $Rev: 21386 $ + +*/ + +#ifndef SEGGER_RTT_CONF_H +#define SEGGER_RTT_CONF_H + +#ifdef __IAR_SYSTEMS_ICC__ + #include +#endif + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ + +// +// Take in and set to correct values for Cortex-A systems with CPU cache +// +//#define SEGGER_RTT_CPU_CACHE_LINE_SIZE (32) // Largest cache line size (in bytes) in the current system +//#define SEGGER_RTT_UNCACHED_OFF (0xFB000000) // Address alias where RTT CB and buffers can be accessed uncached +// +// Most common case: +// Up-channel 0: RTT +// Up-channel 1: SystemView +// +#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS + #define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3) // Max. number of up-buffers (T->H) available on this target (Default: 3) +#endif +// +// Most common case: +// Down-channel 0: RTT +// Down-channel 1: SystemView +// +#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS + #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3) +#endif + +#ifndef BUFFER_SIZE_UP + #define BUFFER_SIZE_UP (FMSTR_COMM_BUFFER_SIZE + 7) // Size of the buffer for terminal output of target, up to host (Default: 1k) +#endif + +#ifndef BUFFER_SIZE_DOWN + #define BUFFER_SIZE_DOWN (FMSTR_COMM_BUFFER_SIZE + 7) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) +#endif + +#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE + #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) +#endif + +#ifndef SEGGER_RTT_MODE_DEFAULT + #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) +#endif + +/********************************************************************* +* +* RTT memcpy configuration +* +* memcpy() is good for large amounts of data, +* but the overhead is big for small amounts, which are usually stored via RTT. +* With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead. +* +* SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions. +* This is may be required with memory access restrictions, +* such as on Cortex-A devices with MMU. +*/ +#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP + #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 // 0: Use memcpy/SEGGER_RTT_MEMCPY, 1: Use a simple byte-loop +#endif +// +// Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets +// +//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) +// #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) SEGGER_memcpy((pDest), (pSrc), (NumBytes)) +//#endif + +// +// Target is not allowed to perform other RTT operations while string still has not been stored completely. +// Otherwise we would probably end up with a mixed string in the buffer. +// If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here. +// +// SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4. +// Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches. +// When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly. +// (Higher priority = lower priority number) +// Default value for embOS: 128u +// Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) +// In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC +// or define SEGGER_RTT_LOCK() to completely disable interrupts. +// +#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20) +#endif + +/********************************************************************* +* +* RTT lock configuration for SEGGER Embedded Studio, +* Rowley CrossStudio and GCC +*/ +#if ((defined(__SES_ARM) || defined(__SES_RISCV) || defined(__CROSSWORKS_ARM) || defined(__GNUC__) || defined(__clang__)) && !defined (__CC_ARM) && !defined(WIN32)) + #if (defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("mrs %0, primask \n\t" \ + "movs r1, #1 \n\t" \ + "msr primask, r1 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : \ + ); \ + } + #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("mrs %0, basepri \n\t" \ + "mov r1, %1 \n\t" \ + "msr basepri, r1 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : \ + ); \ + } + + #elif defined(__ARM_ARCH_7A__) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("mrs r1, CPSR \n\t" \ + "mov %0, r1 \n\t" \ + "orr r1, r1, #0xC0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ + "mrs r1, CPSR \n\t" \ + "bic r1, r1, #0xC0 \n\t" \ + "and r0, r0, #0xC0 \n\t" \ + "orr r1, r1, r0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : "r0", "r1", "cc" \ + ); \ + } + #elif defined(__riscv) || defined(__riscv_xlen) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("csrr %0, mstatus \n\t" \ + "csrci mstatus, 8 \n\t" \ + "andi %0, %0, 8 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : \ + : \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("csrr a1, mstatus \n\t" \ + "or %0, %0, a1 \n\t" \ + "csrs mstatus, %0 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : "a1" \ + ); \ + } + #else + #define SEGGER_RTT_LOCK() + #define SEGGER_RTT_UNLOCK() + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR EWARM +*/ +#ifdef __ICCARM__ + #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) || \ + (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_PRIMASK(); \ + __set_PRIMASK(1); + + #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \ + } + #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || \ + (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || \ + (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) || \ + (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_BASEPRI(); \ + __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); + + #define SEGGER_RTT_UNLOCK() __set_BASEPRI(_SEGGER_RTT__LockState); \ + } + #elif (defined (__ARM7A__) && (__CORE__ == __ARM7A__)) || \ + (defined (__ARM7R__) && (__CORE__ == __ARM7R__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("mrs r1, CPSR \n\t" \ + "mov %0, r1 \n\t" \ + "orr r1, r1, #0xC0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ + "mrs r1, CPSR \n\t" \ + "bic r1, r1, #0xC0 \n\t" \ + "and r0, r0, #0xC0 \n\t" \ + "orr r1, r1, r0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : "r0", "r1", "cc" \ + ); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR RX +*/ +#ifdef __ICCRX__ + #define SEGGER_RTT_LOCK() { \ + unsigned long _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_interrupt_state(); \ + __disable_interrupt(); + + #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR RL78 +*/ +#ifdef __ICCRL78__ + #define SEGGER_RTT_LOCK() { \ + __istate_t _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_interrupt_state(); \ + __disable_interrupt(); + + #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for KEIL ARM +*/ +#ifdef __CC_ARM + #if (defined __TARGET_ARCH_6S_M) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + register unsigned char _SEGGER_RTT__PRIMASK __asm( "primask"); \ + _SEGGER_RTT__LockState = _SEGGER_RTT__PRIMASK; \ + _SEGGER_RTT__PRIMASK = 1u; \ + __schedule_barrier(); + + #define SEGGER_RTT_UNLOCK() _SEGGER_RTT__PRIMASK = _SEGGER_RTT__LockState; \ + __schedule_barrier(); \ + } + #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + register unsigned char BASEPRI __asm( "basepri"); \ + _SEGGER_RTT__LockState = BASEPRI; \ + BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \ + __schedule_barrier(); + + #define SEGGER_RTT_UNLOCK() BASEPRI = _SEGGER_RTT__LockState; \ + __schedule_barrier(); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for TI ARM +*/ +#ifdef __TI_ARM__ + #if defined (__TI_ARM_V6M0__) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_PRIMASK(); \ + __set_PRIMASK(1); + + #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \ + } + #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = _set_interrupt_priority(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); + + #define SEGGER_RTT_UNLOCK() _set_interrupt_priority(_SEGGER_RTT__LockState); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for CCRX +*/ +#ifdef __RX + #include + #define SEGGER_RTT_LOCK() { \ + unsigned long _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = get_psw() & 0x010000; \ + clrpsw_i(); + + #define SEGGER_RTT_UNLOCK() set_psw(get_psw() | _SEGGER_RTT__LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for embOS Simulation on Windows +* (Can also be used for generic RTT locking with embOS) +*/ +#if defined(WIN32) || defined(SEGGER_RTT_LOCK_EMBOS) + +void OS_SIM_EnterCriticalSection(void); +void OS_SIM_LeaveCriticalSection(void); + +#define SEGGER_RTT_LOCK() { \ + OS_SIM_EnterCriticalSection(); + +#define SEGGER_RTT_UNLOCK() OS_SIM_LeaveCriticalSection(); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration fallback +*/ +#ifndef SEGGER_RTT_LOCK + #define SEGGER_RTT_LOCK() // Lock RTT (nestable) (i.e. disable interrupts) +#endif + +#ifndef SEGGER_RTT_UNLOCK + #define SEGGER_RTT_UNLOCK() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state) +#endif + +#endif +/*************************** End of file ****************************/ diff --git a/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT_printf.c b/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT_printf.c new file mode 100644 index 0000000..08d2aa7 --- /dev/null +++ b/middleware/freemaster/src/support/segger_rtt/SEGGER_RTT_printf.c @@ -0,0 +1,603 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 7.22b * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT_printf.c +Purpose : Replacement for printf to write formatted data via RTT +Revision: $Rev: 17697 $ +---------------------------------------------------------------------- +*/ +#include "SEGGER_RTT.h" +#include "SEGGER_RTT_Conf.h" + +/********************************************************************* + * + * Defines, configurable + * + ********************************************************************** + */ + +#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE +#define SEGGER_RTT_PRINTF_BUFFER_SIZE (64) +#endif + +#include +#include + +#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) +#define FORMAT_FLAG_PAD_ZERO (1u << 1) +#define FORMAT_FLAG_PRINT_SIGN (1u << 2) +#define FORMAT_FLAG_ALTERNATE (1u << 3) + +/********************************************************************* + * + * Types + * + ********************************************************************** + */ + +typedef struct +{ + char *pBuffer; + unsigned BufferSize; + unsigned Cnt; + + int ReturnValue; + + unsigned RTTBufferIndex; +} SEGGER_RTT_PRINTF_DESC; + +/********************************************************************* + * + * Function prototypes + * + ********************************************************************** + */ + +/********************************************************************* + * + * Static code + * + ********************************************************************** + */ +/********************************************************************* + * + * _StoreChar + */ +static void _StoreChar(SEGGER_RTT_PRINTF_DESC *p, char c) +{ + unsigned Cnt; + + Cnt = p->Cnt; + if ((Cnt + 1u) <= p->BufferSize) + { + *(p->pBuffer + Cnt) = c; + p->Cnt = Cnt + 1u; + p->ReturnValue++; + } + // + // Write part of string, when the buffer is full + // + if (p->Cnt == p->BufferSize) + { + if (SEGGER_RTT_Write(p->RTTBufferIndex, p->pBuffer, p->Cnt) != p->Cnt) + { + p->ReturnValue = -1; + } + else + { + p->Cnt = 0u; + } + } +} + +/********************************************************************* + * + * _PrintUnsigned + */ +static void _PrintUnsigned(SEGGER_RTT_PRINTF_DESC *pBufferDesc, + unsigned v, + unsigned Base, + unsigned NumDigits, + unsigned FieldWidth, + unsigned FormatFlags) +{ + static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + unsigned Div; + unsigned Digit; + unsigned Number; + unsigned Width; + char c; + + Number = v; + Digit = 1u; + // + // Get actual field width + // + Width = 1u; + while (Number >= Base) + { + Number = (Number / Base); + Width++; + } + if (NumDigits > Width) + { + Width = NumDigits; + } + // + // Print leading chars if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) + { + if (FieldWidth != 0u) + { + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) + { + c = '0'; + } + else + { + c = ' '; + } + while ((FieldWidth != 0u) && (Width < FieldWidth)) + { + FieldWidth--; + _StoreChar(pBufferDesc, c); + if (pBufferDesc->ReturnValue < 0) + { + break; + } + } + } + } + if (pBufferDesc->ReturnValue >= 0) + { + // + // Compute Digit. + // Loop until Digit has the value of the highest digit required. + // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. + // + while (1) + { + if (NumDigits > 1u) + { // User specified a min number of digits to print? => Make sure we loop at least that often, before + // checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) + NumDigits--; + } + else + { + Div = v / Digit; + if (Div < Base) + { // Is our divider big enough to extract the highest digit from value? => Done + break; + } + } + Digit *= Base; + } + // + // Output digits + // + do + { + Div = v / Digit; + v -= Div * Digit; + _StoreChar(pBufferDesc, _aV2C[Div]); + if (pBufferDesc->ReturnValue < 0) + { + break; + } + Digit /= Base; + } while (Digit); + // + // Print trailing spaces if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) + { + if (FieldWidth != 0u) + { + while ((FieldWidth != 0u) && (Width < FieldWidth)) + { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + if (pBufferDesc->ReturnValue < 0) + { + break; + } + } + } + } + } +} + +/********************************************************************* + * + * _PrintInt + */ +static void _PrintInt(SEGGER_RTT_PRINTF_DESC *pBufferDesc, + int v, + unsigned Base, + unsigned NumDigits, + unsigned FieldWidth, + unsigned FormatFlags) +{ + unsigned Width; + int Number; + + Number = (v < 0) ? -v : v; + + // + // Get actual field width + // + Width = 1u; + while (Number >= (int)Base) + { + Number = (Number / (int)Base); + Width++; + } + if (NumDigits > Width) + { + Width = NumDigits; + } + if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) + { + FieldWidth--; + } + + // + // Print leading spaces if necessary + // + if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && + ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) + { + if (FieldWidth != 0u) + { + while ((FieldWidth != 0u) && (Width < FieldWidth)) + { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + if (pBufferDesc->ReturnValue < 0) + { + break; + } + } + } + } + // + // Print sign if necessary + // + if (pBufferDesc->ReturnValue >= 0) + { + if (v < 0) + { + v = -v; + _StoreChar(pBufferDesc, '-'); + } + else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) + { + _StoreChar(pBufferDesc, '+'); + } + else + { + } + if (pBufferDesc->ReturnValue >= 0) + { + // + // Print leading zeros if necessary + // + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && + ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) + { + if (FieldWidth != 0u) + { + while ((FieldWidth != 0u) && (Width < FieldWidth)) + { + FieldWidth--; + _StoreChar(pBufferDesc, '0'); + if (pBufferDesc->ReturnValue < 0) + { + break; + } + } + } + } + if (pBufferDesc->ReturnValue >= 0) + { + // + // Print number without sign + // + _PrintUnsigned(pBufferDesc, (unsigned)v, Base, NumDigits, FieldWidth, FormatFlags); + } + } + } +} + +/********************************************************************* + * + * Public code + * + ********************************************************************** + */ +/********************************************************************* + * + * SEGGER_RTT_vprintf + * + * Function description + * Stores a formatted string in SEGGER RTT control block. + * This data is read by the host. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") + * sFormat Pointer to format string + * pParamList Pointer to the list of arguments for the format string + * + * Return values + * >= 0: Number of bytes which have been stored in the "Up"-buffer. + * < 0: Error + */ +int SEGGER_RTT_vprintf(unsigned BufferIndex, const char *sFormat, va_list *pParamList) +{ + char c; + SEGGER_RTT_PRINTF_DESC BufferDesc; + int v; + unsigned NumDigits; + unsigned FormatFlags; + unsigned FieldWidth; + char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE]; + + BufferDesc.pBuffer = acBuffer; + BufferDesc.BufferSize = SEGGER_RTT_PRINTF_BUFFER_SIZE; + BufferDesc.Cnt = 0u; + BufferDesc.RTTBufferIndex = BufferIndex; + BufferDesc.ReturnValue = 0; + + do + { + c = *sFormat; + sFormat++; + if (c == 0u) + { + break; + } + if (c == '%') + { + // + // Filter out flags + // + FormatFlags = 0u; + v = 1; + do + { + c = *sFormat; + switch (c) + { + case '-': + FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; + sFormat++; + break; + case '0': + FormatFlags |= FORMAT_FLAG_PAD_ZERO; + sFormat++; + break; + case '+': + FormatFlags |= FORMAT_FLAG_PRINT_SIGN; + sFormat++; + break; + case '#': + FormatFlags |= FORMAT_FLAG_ALTERNATE; + sFormat++; + break; + default: + v = 0; + break; + } + } while (v); + // + // filter out field with + // + FieldWidth = 0u; + do + { + c = *sFormat; + if ((c < '0') || (c > '9')) + { + break; + } + sFormat++; + FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0'); + } while (1); + + // + // Filter out precision (number of digits to display) + // + NumDigits = 0u; + c = *sFormat; + if (c == '.') + { + sFormat++; + do + { + c = *sFormat; + if ((c < '0') || (c > '9')) + { + break; + } + sFormat++; + NumDigits = NumDigits * 10u + ((unsigned)c - '0'); + } while (1); + } + // + // Filter out length modifier + // + c = *sFormat; + do + { + if ((c == 'l') || (c == 'h')) + { + sFormat++; + c = *sFormat; + } + else + { + break; + } + } while (1); + // + // Handle specifiers + // + switch (c) + { + case 'c': + { + char c0; + v = va_arg(*pParamList, int); + c0 = (char)v; + _StoreChar(&BufferDesc, c0); + break; + } + case 'd': + v = va_arg(*pParamList, int); + _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'u': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'x': + case 'X': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags); + break; + case 's': + { + const char *s = va_arg(*pParamList, const char *); + do + { + c = *s; + s++; + if (c == '\0') + { + break; + } + _StoreChar(&BufferDesc, c); + } while (BufferDesc.ReturnValue >= 0); + } + break; + case 'p': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u); + break; + case '%': + _StoreChar(&BufferDesc, '%'); + break; + default: + break; + } + sFormat++; + } + else + { + _StoreChar(&BufferDesc, c); + } + } while (BufferDesc.ReturnValue >= 0); + + if (BufferDesc.ReturnValue > 0) + { + // + // Write remaining data, if any + // + if (BufferDesc.Cnt != 0u) + { + SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt); + } + BufferDesc.ReturnValue += (int)BufferDesc.Cnt; + } + return BufferDesc.ReturnValue; +} + +/********************************************************************* + * + * SEGGER_RTT_printf + * + * Function description + * Stores a formatted string in SEGGER RTT control block. + * This data is read by the host. + * + * Parameters + * BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") + * sFormat Pointer to format string, followed by the arguments for conversion + * + * Return values + * >= 0: Number of bytes which have been stored in the "Up"-buffer. + * < 0: Error + * + * Notes + * (1) Conversion specifications have following syntax: + * %[flags][FieldWidth][.Precision]ConversionSpecifier + * (2) Supported flags: + * -: Left justify within the field width + * +: Always print sign extension for signed conversions + * 0: Pad with 0 instead of spaces. Ignored when using '-'-flag or precision + * Supported conversion specifiers: + * c: Print the argument as one char + * d: Print the argument as a signed integer + * u: Print the argument as an unsigned integer + * x: Print the argument as an hexadecimal integer + * s: Print the string pointed to by the argument + * p: Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.) + */ +int SEGGER_RTT_printf(unsigned BufferIndex, const char *sFormat, ...) +{ + int r; + va_list ParamList; + + va_start(ParamList, sFormat); + r = SEGGER_RTT_vprintf(BufferIndex, sFormat, &ParamList); + va_end(ParamList); + return r; +} +/*************************** End of file ****************************/ diff --git a/middleware/freemaster/src/support/segger_rtt/readme.txt b/middleware/freemaster/src/support/segger_rtt/readme.txt new file mode 100644 index 0000000..050e963 --- /dev/null +++ b/middleware/freemaster/src/support/segger_rtt/readme.txt @@ -0,0 +1 @@ +Files in this directory are used by the FreeMASTER RTT example application. diff --git a/middleware/freemaster/src/template/gen32le/freemaster_cfg.h b/middleware/freemaster/src/template/gen32le/freemaster_cfg.h new file mode 100644 index 0000000..e8c0da9 --- /dev/null +++ b/middleware/freemaster/src/template/gen32le/freemaster_cfg.h @@ -0,0 +1,143 @@ +/* + * Copyright 2019-2021 NXP + * + * SPDX-License-Identifier: BSD-3-Clause + * + * FreeMASTER Communication Driver - User Configuration File + */ + +#ifndef __FREEMASTER_CFG_H +#define __FREEMASTER_CFG_H + +/* This is a generic configuration file of the FreeMASTER driver. + * You need to edit this file before using FreeMASTER in this application. + * + * RECOMMENDED: Use the MCUXpresso ConfigTools to configure FreeMASTER driver graphically and + * to generate this file automatically. Refer to 'Middleware' configuration components in + * the Peripheral tool. The ConfigTools will also help you to configure the physical communication + * interface, device pins and clocks. + * + * EDIT MANUALLY: Alternatively, you may edit this file manually. See options marked as “TODO:” + * below. The FMSTR_TRANSPORT and related low-level communication driver options must be set. + * Also ensure that the configuration, device pins and clocks are initialized by the application. + * + * ALWAYS: Call FMSTR_Init() in your application code and call FMSTR_Poll() in the application loop. + * + * SEE MORE INFORMATION: in fmstr_uart, fmstr_can and other example applications. Reach out to + * FreeMASTER community at https://community.nxp.com/t5/FreeMASTER/bd-p/freemaster to get more support. + * + * Remove the warning statement below after this file is edited. + */ +#warning This freemaster_cfg.h file needs to be edited to configure low-level communication. +#define FMSTR_DISABLE 1 // TODO: set to 0 after this configuration is ready to be used + +//////////////////////////////////////////////////////////////////////////////// +// Definitions +//////////////////////////////////////////////////////////////////////////////// + +#define FMSTR_PLATFORM_CORTEX_M 1 /* Cortex-M platform (see freemaster.h for list of all supported platforms) */ + +// Set the demo application configuration +#define FMSTR_DEMO_ENOUGH_ROM 1 /* Platform has enough ROM to show most of the FreeMASTER features */ +#define FMSTR_DEMO_LARGE_ROM 1 /* ROM is large enough to store the extended data structures used in FreeMASTER demo */ +#define FMSTR_DEMO_SUPPORT_I64 1 /* support for long long type */ +#define FMSTR_DEMO_SUPPORT_FLT 1 /* support for float type */ +#define FMSTR_DEMO_SUPPORT_DBL 1 /* support for double type */ + +// Select interrupt or poll-driven serial communication +#define FMSTR_LONG_INTR 0 // Complete message processing in interrupt +#define FMSTR_SHORT_INTR 0 // Queuing done in interrupt +#define FMSTR_POLL_DRIVEN 1 // No interrupt needed, polling only + +// List of standard FreeMASTER transports and their low-level drivers. See more options in src/drivers. +// FMSTR_SERIAL - Serial transport (used by various types of UART peripherals and USB CDC implementation) +// FMSTR_SERIAL_MCUX_UART - MCUXSDK driver for UART peripheral +// FMSTR_SERIAL_MCUX_LPUART - MCUXSDK driver for LPUART peripheral +// FMSTR_SERIAL_MCUX_USART - MCUXSDK driver for USART peripheral +// FMSTR_SERIAL_MCUX_MINIUSART -MCUXSDK driver for MINIUSART peripheral +// FMSTR_SERIAL_MCUX_USB - MCUXSDK driver for USB peripheral with CDC class +// FMSTR_CAN - CAN transport protocol (used by various types of CAN peripherals) +// FMSTR_CAN_MCUX_FLEXCAN - MCUXSDK driver for FlexCAN peripheral +// FMSTR_CAN_MCUX_MCAN - MCUXSDK driver for MCAN peripheral +// FMSTR_CAN_MCUX_MSCAN - MCUXSDK driver for msCAN peripheral +// FMSTR_NET - Network interface supporting TCP or UDP protocols +// FMSTR_NET_LWIP_TCP - TCP using lwIP stack +// FMSTR_NET_LWIP_UDP - UDP using lwIP stack +// FMSTR_PDBDM - Packet Driven BDM (direct memory access via JTAG/BDM debug probes). No low-level driver used. + +// Select communication interface +#define FMSTR_TRANSPORT FMSTR_SERIAL // TODO: select FMSTR_SERIAL, FMSTR_CAN or FMSTR_PDBDM transport interface +#define FMSTR_SERIAL_DRV // TODO: when using FMSTR_SERIAL: select Serial low-level communication driver +#define FMSTR_CAN_DRV // TODO: when using FMSTR_CAN: select CAN low-level communication driver +#define FMSTR_NET_DRV // TODO: when using FMSTR_NET: select TCP, UDP or other low-level communication driver + +// Define communication interface base address or leave undefined for runtime setting +#undef FMSTR_SERIAL_BASE // Serial base will be assigned in runtime (when FMSTR_USE_UART) +#undef FMSTR_CAN_BASE // CAN base will be assigned in runtime (when FMSTR_USE_FLEXCAN) + +// FlexCAN-specific, communication message buffers +#define FMSTR_FLEXCAN_TXMB 0 +#define FMSTR_FLEXCAN_RXMB 1 + +// Network-specific communication options +#define FMSTR_NET_PORT 3344 // FreeMASTER server port number (used for both TCP or UDP) +#define FMSTR_NET_BLOCKING_TIMEOUT 250 // Blocking timeout (ms) of network calls used in FMSTR_Poll +#define FMSTR_NET_AUTODISCOVERY 1 // Enable automatic board discovery via UDP protocol + +// SERIAL communication options +#define FMSTR_COMM_RQUEUE_SIZE 32 // Receive FIFO queue size - FMSTR_SHORT_INTR mode + +// Input/output communication buffer size +#define FMSTR_COMM_BUFFER_SIZE 0 // Set to 0 for "automatic" + +// Support for Application Commands +#define FMSTR_USE_APPCMD 1 // Enable/disable App.Commands support +#define FMSTR_APPCMD_BUFF_SIZE 32 // App.Command data buffer size +#define FMSTR_MAX_APPCMD_CALLS 4 // How many app.cmd callbacks? (0=disable) + +// Oscilloscope support +#define FMSTR_USE_SCOPE 1 // Specify number of supported oscilloscopes +#define FMSTR_MAX_SCOPE_VARS 8 // Specify maximum number of scope variables per one oscilloscope + +// Recorder support +#define FMSTR_USE_RECORDER 1 // Specify number of supported recorders + +// Built-in recorder buffer +#define FMSTR_REC_BUFF_SIZE 1024 // Built-in buffer size of recorder #0. Set to 0 to use runtime settings. + +// Recorder time base, specifies how often the recorder is called in the user app. +#define FMSTR_REC_TIMEBASE FMSTR_REC_BASE_MILLISEC(0) // 0 = "unknown" +#define FMSTR_REC_FLOAT_TRIG 1 // Enable/disable floating point triggering + +// Target-side address translation (TSA) +#define FMSTR_USE_TSA 1 // Enable TSA functionality +#define FMSTR_USE_TSA_INROM 1 // TSA tables declared as const (put to ROM) +#define FMSTR_USE_TSA_SAFETY 1 // Enable/Disable TSA memory protection +#define FMSTR_USE_TSA_DYNAMIC 1 // Enable/Disable TSA entries to be added also in runtime + +// Pipes as data streaming over FreeMASTER protocol +#define FMSTR_USE_PIPES 1 // Specify number of supported pipe objects + +// Enable/Disable read/write memory commands +#define FMSTR_USE_READMEM 1 // Enable read memory commands +#define FMSTR_USE_WRITEMEM 1 // Enable write memory commands +#define FMSTR_USE_WRITEMEMMASK 1 // Enable write memory bits commands + +// Define password for access levels to protect them. AVOID SHORT PASSWORDS in production version. +// Passwords should be at least 20 characters long to prevent dictionary attacks. + +#if 0 +#define FMSTR_RESTRICTED_ACCESS_R_PASSWORD "r" // Read-only access level password. +#define FMSTR_RESTRICTED_ACCESS_RW_PASSWORD "rw" // Write access level password. Let undefined to set the same as for read-only access level. +#define FMSTR_RESTRICTED_ACCESS_RWF_PASSWORD "rwf" // Flash access level password. Let undefined to set the same as for write access level. +#endif + +// Storing cleartext passwords in Flash memory is not safe, consider storing their SHA1 hash instead +// Even with this option, the hash must be generated from reasonably complex password to prevent dictionary attack. +#define FMSTR_USE_HASHED_PASSWORDS 0 // When non-zero, the passwords above are specified as a pointer to 20-byte SHA1 hash of password text + +#endif /* __FREEMASTER_CFG_H */ + +//////////////////////////////////////////////////////////////////////////////// +// EOF +//////////////////////////////////////////////////////////////////////////////// diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_AngleTrackObsrv_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_AngleTrackObsrv_F32.h new file mode 100644 index 0000000..d52f08a --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_AngleTrackObsrv_F32.h @@ -0,0 +1,86 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Angle tracking observer +* +*******************************************************************************/ +#ifndef _AMCLIB_ANGLE_TRACK_OBSRV_F32_H_ +#define _AMCLIB_ANGLE_TRACK_OBSRV_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif +/****************************************************************************** +* Includes +******************************************************************************/ +#include "gflib.h" +#include "gmclib.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define AMCLIB_AngleTrackObsrv_F16_C(psSinCos, psCtrl) \ + AMCLIB_AngleTrackObsrv_F16_FC(psSinCos, psCtrl) +#define AMCLIB_AngleTrackObsrvInit_F16_C(f16ThetaInit, psCtrl) \ + AMCLIB_AngleTrackObsrvInit_F16_FC(f16ThetaInit, psCtrl) + +/****************************************************************************** +* Types +******************************************************************************/ +typedef struct +{ + frac32_t f32Speed; + frac32_t f32A2; + frac16_t f16Theta; + frac16_t f16SinEstim; + frac16_t f16CosEstim; + frac16_t f16K1Gain; + int16_t i16K1GainSh; + frac16_t f16K2Gain; + int16_t i16K2GainSh; + frac16_t f16A2Gain; + int16_t i16A2GainSh; +} AMCLIB_ANGLE_TRACK_OBSRV_T_F32; + +/****************************************************************************** +* Exported function prototypes +******************************************************************************/ +extern frac16_t AMCLIB_AngleTrackObsrv_F16_FC(const GMCLIB_2COOR_SINCOS_T_F16 *psSinCos, + AMCLIB_ANGLE_TRACK_OBSRV_T_F32 *psCtrl); +extern void AMCLIB_AngleTrackObsrvInit_F16_FC(frac16_t f16ThetaInit, + AMCLIB_ANGLE_TRACK_OBSRV_T_F32 *psCtrl); + +#if defined(__cplusplus) +} +#endif + +#endif /* _AMCLIB_ANGLE_TRACK_OBSRV_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_CtrlFluxWkng_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_CtrlFluxWkng_A32.h new file mode 100644 index 0000000..339048e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_CtrlFluxWkng_A32.h @@ -0,0 +1,104 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Flux weakening controller +* +*******************************************************************************/ +#ifndef _AMCLIB_CTRL_FLUX_WKNG_A32_H_ +#define _AMCLIB_CTRL_FLUX_WKNG_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif +/****************************************************************************** +* Includes +******************************************************************************/ +#include "gflib.h" +#include "gdflib.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define AMCLIB_CtrlFluxWkng_F16_C(f16IQErr, f16UQReq, f16UQLim, psCtrl) \ + AMCLIB_CtrlFluxWkng_F16_FC(f16IQErr, f16UQReq, f16UQLim, psCtrl) +#define AMCLIB_CtrlFluxWkngInit_F16_Ci(f16InitVal, psCtrl) \ + AMCLIB_CtrlFluxWkngInit_F16_FCi(f16InitVal, psCtrl) + +/****************************************************************************** +* Types +******************************************************************************/ +typedef struct +{ + /* function parameters */ + GFLIB_CTRL_PI_P_AW_T_A32 sFWPiParam; /* PIp controller structure for FW controller */ + GDFLIB_FILTER_IIR1_T_F32 sIqErrIIR1Param; /* Iq error IIR filter structure for Iq measured */ + + /* function parameters */ + frac16_t f16IqErrIIR1; /* Iq filtered by IIR - calculated by algorithm */ + frac16_t f16UFWErr; /* Required voltage error - calculated by algorithm */ + frac16_t f16FWErr; /* Flux weakening error - calculated by algorithm */ + bool_t *pbStopIntegFlag; /* Flux weakening controller stop integration flag - set by application */ +} AMCLIB_CTRL_FLUX_WKNG_T_A32; + +/****************************************************************************** +* Exported function prototypes +******************************************************************************/ +extern frac16_t AMCLIB_CtrlFluxWkng_F16_FC(frac16_t f16IQErr, frac16_t f16UQReq, frac16_t f16UQLim, + AMCLIB_CTRL_FLUX_WKNG_T_A32 *psCtrl); + +/***************************************************************************//*! +* +* @brief Initialization for the Flux weakening control function +* +* @param ptr AMCLIB_CTRL_FLUX_WKNG_T_A32 *psCtrl - Pointer to controller structure +* @param in frac16_t f16InitVal - Initial state value for CtrlPIpAW integrating part +* +* @return none +* +* @remarks The function initializes Flux weakening control function by following: +* +* - PI controller with anti-wind-up protection initialization. +* - Iq IIR filter initialization +* +****************************************************************************/ +static inline void AMCLIB_CtrlFluxWkngInit_F16_FCi(frac16_t f16InitVal, + AMCLIB_CTRL_FLUX_WKNG_T_A32 *psCtrl) +{ + GFLIB_CtrlPIpAWInit_F16(f16InitVal, &psCtrl->sFWPiParam); + GDFLIB_FilterIIR1Init_F16 (&psCtrl->sIqErrIIR1Param); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _AMCLIB_CTRL_FLUX_WKNG_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvABHw_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvABHw_A32.h new file mode 100644 index 0000000..75f172a --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvABHw_A32.h @@ -0,0 +1,77 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Algorithm of PMSM Back Electromotive Force observer in stationary +* reference frame +* +*******************************************************************************/ +#ifndef _AMCLIB_PMSM_BEMF_OBSRVHW_A32_AB_H_ +#define _AMCLIB_PMSM_BEMF_OBSRVHW_A32_AB_H_ + +#if defined(__cplusplus) +extern "C" { +#endif +/****************************************************************************** +* Includes +******************************************************************************/ +#include "gflib.h" +#include "gmclib.h" +#include "AMCLIB_PMSMBemfObsrvAB_A32.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define AMCLIB_PMSMBemfObsrvABHw_F16_C(psIAlBe, psUAlBe, f16Speed, psCtrl) \ + AMCLIB_PMSMBemfObsrvABHw_F16_FC(psIAlBe, psUAlBe, f16Speed, psCtrl) +/****************************************************************************** +* Types +******************************************************************************/ + + +/****************************************************************************** +* Exported function prototypes +******************************************************************************/ +extern void AMCLIB_PMSMBemfObsrvABHw_F16_FC(const GMCLIB_2COOR_ALBE_T_F16 *psIAlBe, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + frac16_t f16Speed, + AMCLIB_BEMF_OBSRV_AB_T_A32 *psCtrl); + +/****************************************************************************** +* Inline functions +******************************************************************************/ + + +#if defined(__cplusplus) +} +#endif + +#endif /* _AMCLIB_PMSM_BEMF_OBSRVHW_A32_AB_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvAB_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvAB_A32.h new file mode 100644 index 0000000..522f138 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvAB_A32.h @@ -0,0 +1,126 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Algorithm of PMSM Back Electromotive Force observer in stationary +* reference frame +* +*******************************************************************************/ +#ifndef _AMCLIB_PMSM_BEMF_OBSRV_A32_AB_H_ +#define _AMCLIB_PMSM_BEMF_OBSRV_A32_AB_H_ + +#if defined(__cplusplus) +extern "C" { +#endif +/****************************************************************************** +* Includes +******************************************************************************/ +#include "gflib.h" +#include "gmclib.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define AMCLIB_PMSMBemfObsrvAB_F16_C(psIAlBe, psUAlBe, f16Speed, psCtrl) \ + AMCLIB_PMSMBemfObsrvAB_F16_FC(psIAlBe, psUAlBe, f16Speed, psCtrl) +#define AMCLIB_PMSMBemfObsrvABInit_F16_Ci(psCtrl) \ + AMCLIB_PMSMBemfObsrvABInit_F16_FCi(psCtrl) +/****************************************************************************** +* Types +******************************************************************************/ +typedef struct +{ + GMCLIB_2COOR_ALBE_T_F32 sEObsrv; /* Estimated back-EMF voltage - alpha,beta */ + GMCLIB_2COOR_ALBE_T_F32 sIObsrv; /* Estimated current - alpha,beta */ + + /* Observer parameters for controllers */ + struct + { + frac32_t f32IAlpha_1; /* Integral part state variable for alpha coefficient */ + frac32_t f32IBeta_1; /* Integral part state variable for beta coefficient */ + acc32_t a32PGain; /* Observer proportional gain coefficient */ + acc32_t a32IGain; /* Observer integral gain coefficient */ + } sCtrl; + + /* Configuration parameters */ + acc32_t a32IGain; /* Current scaling coefficient */ + acc32_t a32UGain; /* Voltage scaling coefficient */ + acc32_t a32WIGain; /* Angular speed scaling coefficient */ + acc32_t a32EGain; /* Back-emf scaling coefficient */ + + /* Unity vector */ + GMCLIB_2COOR_SINCOS_T_F16 sUnityVctr; + +} AMCLIB_BEMF_OBSRV_AB_T_A32; + +/****************************************************************************** +* Exported function prototypes +******************************************************************************/ +extern void AMCLIB_PMSMBemfObsrvAB_F16_FC(const GMCLIB_2COOR_ALBE_T_F16 *psIAlBe, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + frac16_t f16Speed, + AMCLIB_BEMF_OBSRV_AB_T_A32 *psCtrl); + +/****************************************************************************** +* Inline functions +******************************************************************************/ + +/***************************************************************************//*! +* +* @brief PMSM BEMF in AB reference frame initialization +* +* @param ptr AMCLIB_BEMF_OBSRV_AB_T_A32 *psCtrl - pointer to the parameters of the observer +* +* @param in None +* +* @return None +* +* @remarks Initializes the structure of the PMSM BEMF in AB reference frame +* +* sIObsrv_f32Alpha = 0; +* sIObsrv_f32beta = 0; +* sCtrl_f32IAlpha_1= 0; +* sCtrl_f32IBeta_1 = 0; +* +****************************************************************************/ +static inline void AMCLIB_PMSMBemfObsrvABInit_F16_FCi(AMCLIB_BEMF_OBSRV_AB_T_A32 *psCtrl) +{ + psCtrl -> sIObsrv.f32Alpha = 0; + psCtrl -> sIObsrv.f32Beta = 0; + psCtrl -> sCtrl.f32IAlpha_1= 0; + psCtrl -> sCtrl.f32IBeta_1 = 0; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _AMCLIB_PMSM_BEMF_OBSRV_A32_AB_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvDQHw_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvDQHw_A32.h new file mode 100644 index 0000000..cba900d --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvDQHw_A32.h @@ -0,0 +1,80 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Algorithm of PMSM Back Electromotive Force observer in rotating +* reference frame +* +*******************************************************************************/ +#ifndef _AMCLIB_PMSM_BEMF_OBSRVHW_A32_DQ_H_ +#define _AMCLIB_PMSM_BEMF_OBSRVHW_A32_DQ_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib.h" +#include "AMCLIB_PMSMBemfObsrvDQ_A32.h" +#include "GFLIB_AtanYXHw_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define AMCLIB_PMSMBemfObsrvDQHw_F16_C(psIDQ, psUDQ, f16Speed, psCtrl) \ + AMCLIB_PMSMBemfObsrvDQHw_F16_FC(psIDQ, psUDQ, f16Speed, psCtrl) +#define AMCLIB_PMSMBemfObsrvDQHw_F16_Asm(psIDQ, psUDQ, f16Speed, psCtrl) \ + AMCLIB_PMSMBemfObsrvDQHw_F16_FAsm(psIDQ, psUDQ, f16Speed, psCtrl) + +/******************************************************************************* +* Types +*******************************************************************************/ + + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t AMCLIB_PMSMBemfObsrvDQHw_F16_FC(const GMCLIB_2COOR_DQ_T_F16 *psIDQ, + const GMCLIB_2COOR_DQ_T_F16 *psUDQ, + frac16_t f16Speed, + AMCLIB_BEMF_OBSRV_DQ_T_A32 *psCtrl); + +extern frac16_t AMCLIB_PMSMBemfObsrvDQHw_F16_FAsm(const GMCLIB_2COOR_DQ_T_F16 *psIDQ, + const GMCLIB_2COOR_DQ_T_F16 *psUDQ, + frac16_t f16Speed, + AMCLIB_BEMF_OBSRV_DQ_T_A32 *psCtrl); +#if defined(__cplusplus) +} +#endif + +#endif /* _AMCLIB_PMSM_BEMF_OBSRVHW_A32_DQ_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvDQ_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvDQ_A32.h new file mode 100644 index 0000000..d8e3b96 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_PMSMBemfObsrvDQ_A32.h @@ -0,0 +1,125 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Algorithm of PMSM Back Electromotive Force observer in rotating +* reference frame +* +*******************************************************************************/ +#ifndef _AMCLIB_PMSM_BEMF_OBSRV_A32_DQ_H_ +#define _AMCLIB_PMSM_BEMF_OBSRV_A32_DQ_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "amclib_types.h" +#include "gflib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define AMCLIB_PMSMBemfObsrvDQ_F16_Asm(psIDQ, psUDQ, f16Speed, psCtrl) \ + AMCLIB_PMSMBemfObsrvDQ_F16_FAsm(psIDQ, psUDQ, f16Speed, psCtrl) +#define AMCLIB_PMSMBemfObsrvDQInit_F16_Ci(psCtrl) \ + AMCLIB_PMSMBemfObsrvDQInit_F16_FCi( psCtrl) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + GMCLIB_2COOR_DQ_T_F32 sEObsrv; /* Estimated back-EMF voltage - d/q */ + GMCLIB_2COOR_DQ_T_F32 sIObsrv; /* Estimated current - d/q */ + + /* Observer parameters for controllers */ + struct + { + frac32_t f32ID_1; /* Integral part state variable for D coefficient */ + frac32_t f32IQ_1; /* Integral part state variable for Q coefficient */ + acc32_t a32PGain; /* Observer proportional gain coefficient */ + acc32_t a32IGain; /* Observer integral gain coefficient */ + } sCtrl; + + /* Configuration parameters */ + acc32_t a32IGain; /* Current scaling coefficient */ + acc32_t a32UGain; /* Voltage scaling coefficient */ + acc32_t a32WIGain; /* Angular speed scaling coefficient */ + acc32_t a32EGain; /* Back-emf scaling coefficient */ + + /* Estimated phase error between real d/q frame system and estimated d/q + reference system */ + frac16_t f16Error; + +} AMCLIB_BEMF_OBSRV_DQ_T_A32; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t AMCLIB_PMSMBemfObsrvDQ_F16_FAsm(const GMCLIB_2COOR_DQ_T_F16 *psIDQ, + const GMCLIB_2COOR_DQ_T_F16 *psUDQ, + frac16_t f16Speed, + AMCLIB_BEMF_OBSRV_DQ_T_A32 *psCtrl); +/****************************************************************************** +* Inline functions +******************************************************************************/ + +/***************************************************************************//*! +* +* @brief PMSM BEMF in DQ reference frame initialization +* +* @param ptr - AMCLIB_BEMF_OBSRV_DQ_T_A32 *psCtrl - pointer to the parameters of the observer +* +* @return None +* +* @remarks Initializes the structure of the PMSM BEMF in DQ reference frame +* +* sIObsrv_f32D = 0; +* sIObsrv_f32Q = 0; +* sCtrl_f32ID_1 = 0; +* sCtrl_f32IQ_1 = 0; +* +****************************************************************************/ +static inline void AMCLIB_PMSMBemfObsrvDQInit_F16_FCi(AMCLIB_BEMF_OBSRV_DQ_T_A32 *psCtrl) +{ + psCtrl -> sIObsrv.f32D = 0; + psCtrl -> sIObsrv.f32Q = 0; + psCtrl -> sCtrl.f32ID_1 = 0; + psCtrl -> sCtrl.f32IQ_1 = 0; +} +#if defined(__cplusplus) +} +#endif + +#endif /* _AMCLIB_PMSM_BEMF_OBSRV_A32_DQ_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_TrackObsrv_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_TrackObsrv_F32.h new file mode 100644 index 0000000..7cf6410 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/AMCLIB_TrackObsrv_F32.h @@ -0,0 +1,125 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Tracking observer +* +*******************************************************************************/ +#ifndef _AMCLIB_TRACK_OBSRV_F32_H_ +#define _AMCLIB_TRACK_OBSRV_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "amclib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define AMCLIB_TrackObsrv_F16_C(f16ThetaErr, psCtrl) \ + AMCLIB_TrackObsrv_F16_FC(f16ThetaErr, psCtrl) +#define AMCLIB_TrackObsrv_F16_Asm(f16ThetaErr, psCtrl) \ + AMCLIB_TrackObsrv_F16_FAsm(f16ThetaErr, psCtrl) +#define AMCLIB_TrackObsrvInit_F16_Ci(f16ThetaInit, psCtrl) \ + AMCLIB_TrackObsrvInit_F16_FCi(f16ThetaInit, psCtrl) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac32_t f32Theta; /* Estimated position */ + frac32_t f32Speed; /* Estimated speed - first integrator output */ + frac32_t f32I_1; /* State variable of observer controller part */ + frac16_t f16IGain; /* Observer integral gain */ + int16_t i16IGainSh; /* Observer integral gain shift*/ + frac16_t f16PGain; /* Observer proportional gain */ + int16_t i16PGainSh; /* Observer proportional gain shift*/ + frac16_t f16ThGain; /* Observer gain for output integrator of position */ + int16_t i16ThGainSh; /* Observer gain shift for integrator of position */ +}AMCLIB_TRACK_OBSRV_T_F32; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t AMCLIB_TrackObsrv_F16_FC(frac16_t f16ThetaErr, + AMCLIB_TRACK_OBSRV_T_F32 *psCtrl); + +extern frac16_t AMCLIB_TrackObsrv_F16_FAsm(frac16_t f16ThetaErr, + AMCLIB_TRACK_OBSRV_T_F32 *psCtrl); +/****************************************************************************** +* Inline functions +******************************************************************************/ + +/***************************************************************************//*! +* +* @brief Tracking observer initialization +* +* @param in - frac16_t f16ThetaInit - init angle <-1;1) corresponds to <-pi;pi) +* @param ptr - AMCLIB_TRACK_OBSRV_T_F32 *psCtrl +* - frac32_t f32Theta - Estimated position <-1;1) corresponds to <-pi;pi) +* - frac32_t f32Speed - Estimated speed <-1;1) +* - frac16_t f32I_1 - Internal integrator <-1;1) +* - frac16_t f16IGain - Integ. constant to get speed from error <0;1) +* - int16_t i16IGainSh - Shift for f16IGain <-15;15> +* - frac16_t f16PGain - Prop. constant to get speed from angle <0;1) +* - int16_t i16PGainSh - Shift for f16PGain <-15;15> +* - frac16_t f16ThGain - Constant to get angle from speed <0;1) +* - int16_t i16ThGainSh- Shift for f16ThGain <-15;15> +* +* @return None +* +* @remarks Initializes the structure of the tracking observer with an angle +* according to following rules: +* +* f32Theta = f16ThetaInit << 16 +* f32Speed = 0 +* f32I_1 = 0 +* +****************************************************************************/ +static inline void AMCLIB_TrackObsrvInit_F16_FCi(frac16_t f16ThetaInit, + AMCLIB_TRACK_OBSRV_T_F32 *psCtrl) +{ + psCtrl -> f32Theta = MLIB_Conv_F32s(f16ThetaInit); + psCtrl -> f32Speed = 0; + psCtrl -> f32I_1 = 0; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _AMCLIB_TRACK_OBSRV_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/amclib.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/amclib.h new file mode 100644 index 0000000..806cf65 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/amclib.h @@ -0,0 +1,92 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Main AMCLIB header file for devices without FPU. +* +*******************************************************************************/ +#ifndef _AMCLIB_H_ +#define _AMCLIB_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "AMCLIB_AngleTrackObsrv_F32.h" +#include "AMCLIB_CtrlFluxWkng_A32.h" +#include "AMCLIB_PMSMBemfObsrvDQ_A32.h" +#include "AMCLIB_PMSMBemfObsrvDQHw_A32.h" +#include "AMCLIB_PMSMBemfObsrvAB_A32.h" +#include "AMCLIB_PMSMBemfObsrvABHw_A32.h" +#include "AMCLIB_TrackObsrv_F32.h" + + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define AMCLIB_AngleTrackObsrvInit_F16(f16ThetaInit, psCtrl) \ + AMCLIB_AngleTrackObsrvInit_F16_C(f16ThetaInit, psCtrl) +#define AMCLIB_AngleTrackObsrv_F16(f16ThetaErr, psCtrl) \ + AMCLIB_AngleTrackObsrv_F16_C(f16ThetaErr, psCtrl) +#define AMCLIB_CtrlFluxWkngInit_F16(f16InitVal, psCtrl) \ + AMCLIB_CtrlFluxWkngInit_F16_Ci(f16InitVal, psCtrl) +#define AMCLIB_CtrlFluxWkng_F16(f16IQErr, f16UQReq, f16UQLim, psCtrl) \ + AMCLIB_CtrlFluxWkng_F16_C(f16IQErr, f16UQReq, f16UQLim, psCtrl) +#define AMCLIB_PMSMBemfObsrvDQInit_F16(psCtrl) \ + AMCLIB_PMSMBemfObsrvDQInit_F16_Ci(psCtrl) +#define AMCLIB_PMSMBemfObsrvABInit_F16(psCtrl) \ + AMCLIB_PMSMBemfObsrvABInit_F16_Ci(psCtrl) +#define AMCLIB_TrackObsrvInit_F16(f16ThetaInit, psCtrl) \ + AMCLIB_TrackObsrvInit_F16_Ci(f16ThetaInit, psCtrl) +#define AMCLIB_TrackObsrv_F16(f16ThetaErr, psCtrl) \ + AMCLIB_TrackObsrv_F16_Asm(f16ThetaErr, psCtrl) + +#if (RTCESL_MMDVSQ) +#define AMCLIB_PMSMBemfObsrvDQ_F16(psIDQ, psUDQ, f16Speed, psCtrl) \ + AMCLIB_PMSMBemfObsrvDQHw_F16_Asm(psIDQ, psUDQ, f16Speed, psCtrl) +#define AMCLIB_PMSMBemfObsrvAB_F16(psIAlBe, psUAlBe, f16Speed, psCtrl) \ + AMCLIB_PMSMBemfObsrvABHw_F16_C(psIAlBe, psUAlBe, f16Speed, psCtrl) +#else +#define AMCLIB_PMSMBemfObsrvDQ_F16(psIDQ, psUDQ, f16Speed, psCtrl) \ + AMCLIB_PMSMBemfObsrvDQ_F16_Asm(psIDQ, psUDQ, f16Speed, psCtrl) +#define AMCLIB_PMSMBemfObsrvAB_F16(psIAlBe, psUAlBe, f16Speed, psCtrl) \ + AMCLIB_PMSMBemfObsrvAB_F16_C(psIAlBe, psUAlBe, f16Speed, psCtrl) +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _AMCLIB_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/amclib_types.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/amclib_types.h new file mode 100644 index 0000000..b2e85ae --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/Include/amclib_types.h @@ -0,0 +1,61 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief AMCLIB types +* +*******************************************************************************/ +#ifndef _AMCLIB_TYPES_H_ +#define _AMCLIB_TYPES_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/****************************************************************************** +* Macros +******************************************************************************/ +#define AMCLIB_CONST + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "gmclib_types.h" + +#if defined(__cplusplus) +} +#endif + +#endif /* _AMCLIB_TYPES_H_ */ + + + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/libAMCLIB.a b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/libAMCLIB.a new file mode 100644 index 0000000..cc5c786 Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/AMCLIB/libAMCLIB.a differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterExp_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterExp_F32.h new file mode 100644 index 0000000..fdcafb8 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterExp_F32.h @@ -0,0 +1,130 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Exponential filter +* +*******************************************************************************/ +#ifndef _GDFLIB_FILTEREXP_F32_H_ +#define _GDFLIB_FILTEREXP_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gdflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GDFLIB_FilterExpInit_F16_Ci(f16InitVal, psParam) \ + GDFLIB_FilterExpInit_F16_FCi(f16InitVal, psParam) +#define GDFLIB_FilterExp_F16_Ci(f16InX, psParam) \ + GDFLIB_FilterExp_F16_FCi(f16InX, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct{ + frac32_t f32A; /* is a filter constant <0; 1)assigned in form: 1-a */ + frac32_t f32AccK_1; /* filter accumulator value at step k-1 (last filter output)*/ +} GDFLIB_FILTER_EXP_T_F32; + +/***************************************************************************//*! +* @brief The function initializes the actual values of FilterExp_F16. +* +* @param in frac16_t f16InitVal - Initial value +* ptr GDFLIB_FILTER_EXP_T_F32 *psParam - pointer to filter structure +* +*******************************************************************************/ +static inline void GDFLIB_FilterExpInit_F16_FCi(frac16_t f16InitVal, + GDFLIB_FILTER_EXP_T_F32 *psParam) +{ + psParam->f32AccK_1 = MLIB_Conv_F32s(f16InitVal); +} + +/***************************************************************************//*! +* +* @brief The function calculates exponential filter +* +* @param ptr GDFLIB_FILTER_EXP_T_F32 * psParam +* - Pointer to filter structure +* +* GDFLIB_FILTER_EXP_T_F32 structure: +* - f32A - filter constant assign in form 1-a +* (where a is exp. filter constant) +* - f32AccK_1 - filter output value at step k-1 +* +* @param in f16InX - input signal +* +* @return This function returns - frac16_t value +* +* @remarks +* +* Filter Equation: +* +* Filter Equation: +* +* y(k) = y(k-1) + A * (x(k) - y(k-1)) +* +* where +* x(k) is the filter input at time step k +* y(k) is the filtered output at time step k +* A is the filter constant assign as 1-a from range (0; 1) (where a is exp. filter constant - smoothing constant). +* +****************************************************************************/ +static inline frac16_t GDFLIB_FilterExp_F16_FCi(frac16_t f16InX, + GDFLIB_FILTER_EXP_T_F32 *psParam) +{ + register frac32_t f32Temp; + register frac32_t f32AccK_1; + + /* Store frequently read quantities to register */ + f32AccK_1 = psParam->f32AccK_1; + + /* Filter calculations */ + f32Temp = MLIB_Conv_F32s(f16InX); + f32Temp = MLIB_SubSat_F32_FAsmi(f32Temp, f32AccK_1); /* calculation x(k) - y(k-1) */ + f32Temp = MLIB_MacRndSat_F32(f32AccK_1, psParam->f32A, f32Temp); /* y(k-1) + A * (x(k) - y(k-1)) */ + psParam->f32AccK_1 = f32Temp; /* store filter state value */ + + return(MLIB_RndSat_F16l(f32Temp)); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GDFLIB_FILTEREXP_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterIIR1_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterIIR1_F32.h new file mode 100644 index 0000000..c63e23b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterIIR1_F32.h @@ -0,0 +1,193 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Digital IIR Filter, 1st order +* +*******************************************************************************/ +#ifndef _GDFLIB_FILTERIIR1_F32_H_ +#define _GDFLIB_FILTERIIR1_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gdflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GDFLIB_FilterIIR1Init_F16_Ci(psParam) \ + GDFLIB_FilterIIR1Init_F16_FCi(psParam) +#define GDFLIB_FilterIIR1_F16_Ci(f16InX, psParam) \ + GDFLIB_FilterIIR1_F16_FCi(f16InX, psParam) +#define GDFLIB_FilterIIR1_F16_Asm(f16InX, psParam) \ + GDFLIB_FilterIIR1_F16_FAsm(f16InX, psParam) +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac32_t f32B0; /* B0 coefficient of an IIR1 filter */ + frac32_t f32B1; /* B1 coefficient of an IIR1 filter */ + frac32_t f32A1; /* A1 coefficient of an IIR1 filter */ +} GDFLIB_FILTER_IIR1_COEFF_T_F32; + +typedef struct +{ + GDFLIB_FILTER_IIR1_COEFF_T_F32 sFltCoeff; /* Sub-structure containing filter coefficients. */ + frac32_t f32FltBfrY[1]; /* Internal accumulator buffer */ + frac16_t f16FltBfrX[1]; /* Input buffer of an IIR1 filter */ +} GDFLIB_FILTER_IIR1_T_F32; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GDFLIB_FilterIIR1_F16_FAsm(frac16_t f16InX, GDFLIB_FILTER_IIR1_T_F32 *psParam); + +/***************************************************************************//*! +* +* @brief The function clears buffer of 2nd order IIR filter pointed to by argument +* +* @param ptr GDFLIB_FILTER_IIR1_T_F16 *psParam - Pointer to filter structure +* +* @return N/A +* +*******************************************************************************/ + static inline void GDFLIB_FilterIIR1Init_F16_FCi(GDFLIB_FILTER_IIR1_T_F32 *psParam) + { + psParam->f32FltBfrY[0] = (frac32_t)0; + psParam->f16FltBfrX[0] = (frac16_t)0; + } +/***************************************************************************//*! +* +* @brief 16-bit input and output 1st order IIR filter +* +* @param ptr GDFLIB_FILTER_IIR1_T_F32 *psParam +* - pointer to the structure of the filter +* +* GDFLIB_FILTER_IIR1_T_F32 data structure: +* GDFLIB_FILTER_IIR1_COEFF_T_F32 sFltCoeff +* - filter coefficients in frac32_t divided by 2 +* in the following range: -1.0 <= coef < 1.0 +* - B coefficients: +* frac32_t f32B0 +* frac32_t f32B1 +* -A coefficient, the sign is negated +* frac32_t f32A1 +* frac32_t f32FltBfrY[1] - y history buffer in frac32_t +* frac16_t f16FltBfrX[1] - x history buffer in frac16_t +* @param in frac16_t f16InX - Input signal at the step K step +* fractional value in the range <-1;1) +* +* @return This function filtered value - frac16_t value <-1;1) +* +* ----------- +* x(k) | | y(k) +* --------| IIR1 |--------- +* | | +* ----------- +* +* x(k) - input signal +* y(k) - filtered output signal +* +* Filter equation: +* y(n) = b0*x(n) + b1*x(n-1) - a1*y(n-1) +* +* All coefficients must be divided by 2, i.e. if the desired b1 coefficient +* is 1.756 the value is then: b1 = FRAC32(1.786 / 2.0); +* +* All A coefficients must be negated, i.e. if the desired a2 coefficient +* is 1.789, the value is then: a2 = FRAC32(-1.789 / 2.0); +* +*******************************************************************************/ +static inline frac16_t GDFLIB_FilterIIR1_F16_FCi(frac16_t f16InX, + GDFLIB_FILTER_IIR1_T_F32 *psParam) +{ + register frac32_t f32Acc; + register frac64_t f64M1; + uint64_t u64Temp; + frac64_t f64M2; + frac64_t f64M3; + /* + * Implemented equation assuming adjusted(divided and sign-negative for A) coefficients: + * y(k) = b0*x(k) + b1*x(k-1) + a1*y(k-1) + * + * Calculation steps: + * M1 = b0 * x(k) + * M2 = b1 * x(k-1) + * M3 = a1 * y(k-1) + * Acc = M1 + M2 + M3 + * y(k) = Acc * 2 + */ + + /* M1 = b0 * x(k) */ + f64M1 = (frac64_t)(((frac64_t)psParam->sFltCoeff.f32B0) * ((frac64_t)f16InX)); + + /* M2 = b1 * x(k-1) */ + f64M2 = (frac64_t)(((frac64_t)psParam->sFltCoeff.f32B1) * ((frac64_t)psParam->f16FltBfrX[0])); + + /* M3 = a1 * y(k-1) */ + f64M3 = ((frac64_t)psParam->sFltCoeff.f32A1 * (frac64_t)psParam->f32FltBfrY[0]); + u64Temp = (uint64_t)f64M3 >> 16U; /* Misra compliance signed shift using unsigned type*/ + if (f64M3 < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x1000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + f64M3 = (frac64_t)u64Temp; /* cast back the corrected values */ + + /* Acc = M1 + M2 + M3, M3 is negated */ + f64M1 = f64M1 + f64M2 + f64M3 ; + /* >>14 given by: <<1 coeff. are divided by 2, <<1 signed mult. from >>16 convert */ + u64Temp = (uint64_t)f64M1 >> 14U; /* Misra compliance signed shift using unsigned type*/ + if (f64M1 < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x4000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + f64M1 = (frac64_t)u64Temp; /* cast back the corrected values */ + + /* Output limitation to frac32 range */ + f64M1 = (f64M1 > 2147483647) ? 2147483647 : f64M1; + f64M1 = (f64M1 < -2147483648) ? -2147483648 : f64M1; + f32Acc= (frac32_t)f64M1; + + /* Storing filter states in the buffers */ + psParam->f16FltBfrX[0] = f16InX; + psParam->f32FltBfrY[0] = f32Acc; + + /* Returning de-scaled value of internal accumulator */ + return (frac16_t)MLIB_ShR_F32_Ci(f32Acc,16U); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _GDFLIB_FILTERIIR1_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterIIR2_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterIIR2_F32.h new file mode 100644 index 0000000..0870625 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterIIR2_F32.h @@ -0,0 +1,90 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Digital IIR Filter, 2nd order +* +*******************************************************************************/ +#ifndef _GDFLIB_FILTERIIR2_F32_H_ +#define _GDFLIB_FILTERIIR2_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gdflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GDFLIB_FilterIIR2Init_F16_C(psParam) \ + GDFLIB_FilterIIR2Init_F16_FC(psParam) +#define GDFLIB_FilterIIR2_F16_C(f16InX, psParam) \ + GDFLIB_FilterIIR2_F16_FC(f16InX, psParam) +#define GDFLIB_FilterIIR2_F16_Asm(f16InX, psParam) \ + GDFLIB_FilterIIR2_F16_FAsm(f16InX, psParam) +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac32_t f32B0; /* B0 coefficient of an IIR2 filter */ + frac32_t f32B1; /* B1 coefficient of an IIR2 filter */ + frac32_t f32B2; /* B2 coefficient of an IIR2 filter */ + frac32_t f32A1; /* A1 coefficient of an IIR2 filter */ + frac32_t f32A2; /* A2 coefficient of an IIR2 filter */ +} GDFLIB_FILTER_IIR2_COEFF_T_F32; + +typedef struct +{ + GDFLIB_FILTER_IIR2_COEFF_T_F32 sFltCoeff; /* Sub-structure containing filter coefficients. */ + frac32_t f32FltBfrY[2]; /* Internal accumulator buffer */ + frac16_t f16FltBfrX[2]; /* Input buffer of an IIR2 filter */ +} GDFLIB_FILTER_IIR2_T_F32; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +void GDFLIB_FilterIIR2Init_F16_FC(GDFLIB_FILTER_IIR2_T_F32 *psParam); +frac16_t GDFLIB_FilterIIR2_F16_FC(frac16_t f16InX, + GDFLIB_FILTER_IIR2_T_F32 *psParam); +frac16_t GDFLIB_FilterIIR2_F16_FAsm(frac16_t f16InX, + GDFLIB_FILTER_IIR2_T_F32 *psParam); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GDFLIB_FILTERIIR2_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterMA_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterMA_A32.h new file mode 100644 index 0000000..5f78f89 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterMA_A32.h @@ -0,0 +1,80 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Moving average filter +* +*******************************************************************************/ +#ifndef _GDFLIB_FILTERMA_A32_H_ +#define _GDFLIB_FILTERMA_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gdflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GDFLIB_FilterMAInit_F16_Ci(f16InitVal, psParam) \ + GDFLIB_FilterMAInit_F16_FCi(f16InitVal, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct{ + acc32_t a32Acc; /* Filter accumulator. */ + uint16_t u16Sh; /* Number of samples for averaging, filter sample window [0,15].*/ +}GDFLIB_FILTER_MA_T_A32; + + +/***************************************************************************//*! +* @brief The function initializes the actual values of FilterMA_F16. +* +* @param in frac16_t f16InitVal - Initial value +* ptr GDFLIB_FILTER_MA_T_A32 *psParam - pointer to filter structure +* +*******************************************************************************/ +static inline void GDFLIB_FilterMAInit_F16_FCi(frac16_t f16InitVal, + GDFLIB_FILTER_MA_T_A32 *psParam) +{ + psParam->a32Acc = (acc32_t)MLIB_ShLSat_F32(f16InitVal, psParam->u16Sh) - (acc32_t)f16InitVal; +} +#if defined(__cplusplus) +} +#endif + +#endif /* _GDFLIB_FILTERMA_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterMA_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterMA_A32_Asmi.h new file mode 100644 index 0000000..96e726b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/GDFLIB_FilterMA_A32_Asmi.h @@ -0,0 +1,231 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Moving average filter +* +*******************************************************************************/ +#ifndef _GDFLIB_FILTERMA_A32_ASMI_H_ +#define _GDFLIB_FILTERMA_A32_ASMI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gdflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GDFLIB_FilterMA_F16_Asmi(f16InX, psParam) \ + GDFLIB_FilterMA_F16_FAsmi(f16InX, psParam) + +/***************************************************************************//*! +* +* @brief The function calculates recursive form of moving average filter +* +* @param ptr GDFLIB_FILTER_MA_T_A32 * psParam +* - Pointer to filter structure +* +* GDFLIB_FILTER_MA_T_A32 structure: +* - a32Acc - accumulator of the filter +* - u16Sh - 2 ^ u16Sh is the number of values +* +* @param in f16x - input signal +* +* @return This function returns +* - frac16_t value <-1;1) +* +* @remarks +* +* Filter Equation: +* +* sum(k) = sum(k-1) + input +* out(k) = sum(k)/N +* sum(k-1) = sum(k) - out(k) +* +****************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t GDFLIB_FilterMA_F16_FAsmi(frac16_t f16InX, + GDFLIB_FILTER_MA_T_A32 *psParam) +{ + + register frac32_t f32Val1=0, f32Val2=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16InX, f16InX /* Sign extend */ + /* a32Acc + f16InX */ + ldr f32Val1, [psParam] /* f32Val1 = psParam.a32Acc */ + adds f32Val2, f32Val1, f16InX /* f32Val2 = a32Acc + f16InX */ + subs f32Val1, f32Val2, f32Val1 /* f32Val1 = f32Val2 - a32Acc */ + cmp f32Val1, f16InX /* Compares f32Val2 and f32Val1 */ + beq Add_NotSat /* If f32Val2 != f32Val1, then saturates result */ + asrs f16InX, f16InX, #31 /* f16InX >> 16 */ + movs f32Val2, #0x80 /* f32Val2 = 0x80 */ + rev f32Val2, f32Val2 /* f32Val2 = 0x80000000 */ + subs f32Val2, f32Val2, #1 /* f32Val2 = 0x7FFFFFFF */ + subs f32Val2, f32Val2, f16InX /* f32Val2 = 0x7FFFFFFF - f16InX */ + /* (a32Acc + f16InX) >> u16Sh */ + Add_NotSat: + ldrh f32Val1, [psParam, #4] /* Loads psParam.u16Sh */ + mov f16InX, f32Val2 /* f16InX = a32Acc + f16InX */ + asrs f16InX, f16InX, f32Val1 /* f32Val1 = (a32Acc + f16InX) >> u16Sh */ + /* (a32Acc + f16InX) - ((a32Acc + f16InX) >> u16Sh)*/ + subs f32Val1, f32Val2, f16InX /* f32Val1 = (a32Acc + f16InX) - ((a32Acc + f16InX) >> u16Sh) */ + subs f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val1 - (a32Acc + f16InX) */ + cmp f32Val2, f16InX /* Compares values */ + beq Sub_NotSat /* If values are not equal, then saturates result */ + asrs f32Val1, f16InX, #31 /* f32Val1 = f16InX >> 16 */ + movs f32Val2, #0x80 /* f32Val2 = 0x80 */ + rev f32Val2, f32Val2 /* f32Val2 = 0x80000000 */ + subs f32Val1, f32Val2, f32Val1 /* f32Val1 = 0x80000000 - f32Val1 */ + Sub_NotSat: + str f32Val1, [psParam] /* Saves new value of psParam.a32Acc */ + /* Output saturation */ + sxth f32Val1, f16InX /* Sign extend */ + cmp f32Val1, f16InX /* Compares f32Val1 with f16InX */ + beq Res_NotSat /* If f32Val1 != f16InX, then saturates result */ + movs f32Val1, #0x80 /* f32Val1 = 0x80 */ + lsls f32Val1, #8 /* f32Val1 = 0x8000 */ + asrs f16InX, f16InX, #31 /* f16InX >> 16*/ + subs f32Val1, f32Val1, #1 /* f32Val1 = f32Val1 - 1 */ + subs f16InX, f32Val1, f16InX /* f16InX = f32Val1 - f16InX */ + Res_NotSat:}; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Sign extend */ + /* a32Acc + f16InX */ + "ldr %1, [%3] \n\t" /* f32Val1 = psParam.a32Acc */ + "adds %2, %1, %0 \n\t" /* f32Val2 = a32Acc + f16InX */ + "subs %1, %2, %1 \n\t" /* f32Val1 = f32Val2 - a32Acc */ + "cmp %1, %0 \n\t" /* Compares f32Val2 and f32Val1 */ + "beq GDFLIB_FilterMA_F16_Add_NotSat%= \n\t"/* If f32Val2 != f32Val1, then saturates result */ + "asrs %0, %0, #31 \n\t" /* f16InX >> 16 */ + "movs %2, #0x80 \n\t" /* f32Val2 = 0x80 */ + "rev %2, %2 \n\t" /* f32Val2 = 0x80000000 */ + "subs %2, %2, #1 \n\t" /* f32Val2 = 0x7FFFFFFF */ + "subs %2, %2, %0 \n\t" /* f32Val2 = 0x7FFFFFFF - f16InX */ + /* (a32Acc + f16InX) >> u16Sh */ + "GDFLIB_FilterMA_F16_Add_NotSat%=: \n\t" + "ldrh %1, [%3, #4] \n\t" /* Loads psParam.u16Sh */ + + "mov %0, %2 \n\t" /* f16InX = a32Acc + f16InX */ + "asrs %0, %0, %1 \n\t" /* f32Val1 = (a32Acc + f16InX) >> u16Sh */ + /* (a32Acc + f16InX) - ((a32Acc + f16InX) >> u16Sh)*/ + "subs %1, %2, %0 \n\t" /* f32Val1 = (a32Acc + f16InX) - ((a32Acc + f16InX) >> u16Sh) */ + "subs %2, %2, %1 \n\t" /* f32Val2 = f32Val1 - (a32Acc + f16InX) */ + "cmp %2, %0 \n\t" /* Compares values */ + "beq GDFLIB_FilterMA_F16_Sub_NotSat%= \n\t" /* If values are not equal, then saturates result */ + "asrs %1, %0, #31 \n\t" /* f32Val1 = f16InX >> 16 */ + "movs %2, #0x80 \n\t" /* f32Val2 = 0x80 */ + "rev %2, %2 \n\t" /* f32Val2 = 0x80000000 */ + "subs %1, %2, %1 \n\t" /* f32Val1 = 0x80000000 - f32Val1 */ + "GDFLIB_FilterMA_F16_Sub_NotSat%=: \n\t" + "str %1, [%3] \n\t" /* Saves new value of psParam.a32Acc */ + /* Output saturation */ + "sxth %1, %0 \n\t" /* Sign extend */ + "cmp %1, %0 \n\t" /* Compares f32Val1 with f16InX */ + "beq GDFLIB_FilterMA_F16_Res_NotSat%= \n\t"/* If f32Val1 != f16InX, then saturates result */ + "movs %1, #0x80 \n\t" /* f32Val1 = 0x80 */ + "lsls %1, %1, #8 \n\t" /* f32Val1 = 0x8000 */ + "asrs %0, %0, #31 \n\t" /* f16InX >> 16*/ + "subs %1, %1, #1 \n\t" /* f32Val1 = f32Val1 - 1 */ + "subs %0, %1, %0 \n\t" /* f16InX = f32Val1 - f16InX */ + "GDFLIB_FilterMA_F16_Res_NotSat%=: \n\t" + : "+l"(f16InX), "+l"(f32Val1), "+l"(f32Val2): "l"(psParam)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Sign extend */ + /* a32Acc + f16InX */ + "ldr %1, [%3] \n" /* f32Val1 = psParam.a32Acc */ + "adds %2, %1, %0 \n" /* f32Val2 = a32Acc + f16InX */ + "subs %1, %2, %1 \n" /* f32Val1 = f32Val2 - a32Acc */ + "cmp %1, %0 \n" /* Compares f32Val2 and f32Val1 */ + "beq .+12 \n" /* If f32Val2 != f32Val1, then saturates result */ + "asrs %0, %0, #31 \n" /* f16InX >> 16 */ + "movs %2, #0x80 \n" /* f32Val2 = 0x80 */ + "rev %2, %2 \n" /* f32Val2 = 0x80000000 */ + "subs %2, %2, #1 \n" /* f32Val2 = 0x7FFFFFFF */ + "subs %2, %2, %0 \n" /* f32Val2 = 0x7FFFFFFF - f16InX */ + /* (a32Acc + f16InX) >> u 16Sh */ + "ldrh %1, [%3, #4] \n" /* Loads psParam.u16Sh */ + "mov %0, %2 \n" /* f16InX = a32Acc + f16InX */ + "asrs %0, %0, %1 \n" /* f32Val1 = (a32Acc + f16InX) >> u16Sh */ + /* (a32Acc + f16InX) - (( a32Acc + f16InX) >> u16Sh)*/ + "subs %1, %2, %0 \n" /* f32Val1 = (a32Acc + f16InX) - ((a32Acc + f16InX) >> u16Sh) */ + "subs %2, %2, %1 \n" /* f32Val2 = f32Val1 - (a32Acc + f16InX) */ + "cmp %2, %0 \n" /* Compares values */ + "beq .+10 \n" /* If values are not equal, then saturates result */ + "asrs %1, %0, #31 \n" /* f32Val1 = f16InX >> 16 */ + "movs %2, #0x80 \n" /* f32Val2 = 0x80 */ + "rev %2, %2 \n" /* f32Val2 = 0x80000000 */ + "subs %1, %2, %1 \n" /* f32Val1 = 0x80000000 - f32Val1 */ + "str %1, [%3] \n" /* Saves new value of psParam.a32Acc */ + /* Output saturation */ + "sxth %1, %0 \n" /* Sign extend */ + "cmp %1, %0 \n" /* Compares f32Val1 with f16InX */ + "beq .+12 \n" /* If f32Val1 != f16InX, then saturates result */ + "movs %1, #0x80 \n" /* f32Val1 = 0x80 */ + "lsls %1, %1, #8 \n" /* f32Val1 = 0x8000 */ + "asrs %0, %0, #31 \n" /* f16InX >> 16*/ + "subs %1, %1, #1 \n" /* f32Val1 = f32Val1 - 1 */ + "subs %0, %1, %0 \n" /* f16InX = f32Val1 - f16InX */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16InX), "+l"(f32Val1), "+l"(f32Val2): "l"(psParam)); + #endif + + return(f16InX); +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _GDFLIB_FILTERMA_A32_ASMI_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/gdflib.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/gdflib.h new file mode 100644 index 0000000..7a70b50 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/gdflib.h @@ -0,0 +1,74 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************//*! +* +* @brief Main GDFLIB header file for devices without FPU. +* +*******************************************************************************/ +#ifndef _GDFLIB_H_ +#define _GDFLIB_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "GDFLIB_FilterExp_F32.h" +#include "GDFLIB_FilterIIR1_F32.h" +#include "GDFLIB_FilterIIR2_F32.h" +#include "GDFLIB_FilterMA_A32.h" +#include "GDFLIB_FilterMA_A32_Asmi.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GDFLIB_FilterExpInit_F16(f16InX, psParam) \ + GDFLIB_FilterExpInit_F16_Ci(f16InX, psParam) +#define GDFLIB_FilterExp_F16(f16InX, psParam) \ + GDFLIB_FilterExp_F16_Ci(f16InX, psParam) +#define GDFLIB_FilterIIR1Init_F16(psParam) \ + GDFLIB_FilterIIR1Init_F16_Ci(psParam) +#define GDFLIB_FilterIIR1_F16(f16InX, psParam) \ + GDFLIB_FilterIIR1_F16_Asm(f16InX, psParam) +#define GDFLIB_FilterIIR2Init_F16(psParam) \ + GDFLIB_FilterIIR2Init_F16_C(psParam) +#define GDFLIB_FilterIIR2_F16(f16InX, psParam) \ + GDFLIB_FilterIIR2_F16_Asm(f16InX, psParam) + #define GDFLIB_FilterMAInit_F16(f16InitVal, psParam) \ + GDFLIB_FilterMAInit_F16_Ci(f16InitVal, psParam) +#define GDFLIB_FilterMA_F16(f16InX, psParam) \ + GDFLIB_FilterMA_F16_Asmi(f16InX, psParam) +#if defined(__cplusplus) +} +#endif + +#endif /* _GDFLIB_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/gdflib_types.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/gdflib_types.h new file mode 100644 index 0000000..dbbd128 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/Include/gdflib_types.h @@ -0,0 +1,55 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*******************************************************************************/ +#ifndef _GDFLIB_TYPES_H_ +#define _GDFLIB_TYPES_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GDFLIB_CONST + +#if defined(__cplusplus) +} +#endif + +#endif /*_GDFLIB_TYPES_H_*/ + + + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/libGDFLIB.a b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/libGDFLIB.a new file mode 100644 index 0000000..004d163 Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GDFLIB/libGDFLIB.a differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_AtanYXHw_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_AtanYXHw_F32.h new file mode 100644 index 0000000..8b69fee --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_AtanYXHw_F32.h @@ -0,0 +1,68 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Arcus tangent function based on the provided x,y coordinates as arguments +* using division and piece-wise polynomial approximation +* +*******************************************************************************/ +#ifndef _GFLIB_ATANYXHW_F32_H_ +#define _GFLIB_ATANYXHW_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/****************************************************************************** +* Includes +******************************************************************************/ +#include "mlib.h" +#include "GFLIB_Atan_F32.h" +#include "gflib_types.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GFLIB_AtanYXHw_F16_Asm(f16Y, f16X, pbErrFlag) GFLIB_AtanYXHw_F16_FAsm(f16Y, f16X, pbErrFlag) + +/**************************************************************************** +* Exported function prototypes +****************************************************************************/ +extern frac16_t GFLIB_AtanYXHw_F16_FAsm(frac16_t f16Y, frac16_t f16X, bool_t *pbErrFlag); + +/******************************************************************************* +* Global variables +*******************************************************************************/ + +#if defined(__cplusplus) +} +#endif +#endif /* _GFLIB_ATANYXHW_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_AtanYX_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_AtanYX_F32.h new file mode 100644 index 0000000..5b1db97 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_AtanYX_F32.h @@ -0,0 +1,66 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Arcus tangent function based on the provided x,y coordinates as arguments +* using division and piece-wise polynomial approximation +* +*******************************************************************************/ +#ifndef _GFLIB_ATANYX_F32_H_ +#define _GFLIB_ATANYX_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/****************************************************************************** +* Includes +******************************************************************************/ +#include "GFLIB_Atan_F32.h" +#include "gflib_types.h" +#include "mlib.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GFLIB_AtanYX_F16_Asm(f16Y, f16X, pbErrFlag) GFLIB_AtanYX_F16_FAsm(f16Y, f16X, pbErrFlag, &gsAtanCoef) + +/**************************************************************************** +* Exported function prototypes +****************************************************************************/ +extern frac16_t GFLIB_AtanYX_F16_FAsm(frac16_t f16Y, frac16_t f16X, bool_t *pbErrFlag, const GFLIB_ATAN_T_F32 *GFLIB_CONST psParam); + + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_ATANYX_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Atan_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Atan_F32.h new file mode 100644 index 0000000..12ead32 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Atan_F32.h @@ -0,0 +1,80 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Inverse tangent +* +*******************************************************************************/ +#ifndef _GFLIB_ATAN_F32_H_ +#define _GFLIB_ATAN_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Atan_F16_Asm(f16Val) GFLIB_Atan_F16_FAsm(f16Val, &gsAtanCoef) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac32_t f32A[3]; +}GFLIB_ATAN_COEF_T_F32; + +typedef struct +{ + GFLIB_ATAN_COEF_T_F32 GFLIB_ATAN_SECTOR_F32[8]; +}GFLIB_ATAN_T_F32; + +/******************************************************************************* +* Global variables +*******************************************************************************/ + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GFLIB_Atan_F16_FAsm(frac16_t f16Val, const GFLIB_ATAN_T_F32 *psParam); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_ATAN_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_CtrlBetaIPp_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_CtrlBetaIPp_A32.h new file mode 100644 index 0000000..0fd7d76 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_CtrlBetaIPp_A32.h @@ -0,0 +1,101 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Parallel beta IP controller with and without anti-wind-up protection +* +*******************************************************************************/ +#ifndef _GFLIB_CTRLBETAIPP_A32_H_ +#define _GFLIB_CTRLBETAIPP_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_CtrlBetaIPpAW_F16_C(f16InReq, f16In, pbStopIntegFlag, psParam) \ + GFLIB_CtrlBetaIPpAW_F16_FC(f16InReq, f16In, pbStopIntegFlag, psParam) +#define GFLIB_CtrlBetaIPpAWInit_F16_Ci(f16InitVal, psParam) \ + GFLIB_CtrlBetaIPpAWInit_F16_FCi(f16InitVal, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + acc32_t a32PGain; /* Proportional Gain */ + acc32_t a32IGain; /* Integral Gain */ + frac32_t f32IAccK_1; /* State variable output at step k-1 */ + frac16_t f16InErrK_1; /* State variable input error at step k-1 */ + frac16_t f16UpperLim; /* Upper Limit of the controller */ + frac16_t f16LowerLim; /* Lower Limit of the controller */ + frac16_t f16BetaGain; /* Beta Gain for restricting the overshot */ + bool_t bLimFlag; /* Limitation flag, if set to 1, the controller + output has reached either the UpperLimit or LowerLimit */ +} GFLIB_CTRL_BETA_IP_P_AW_T_A32; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GFLIB_CtrlBetaIPpAW_F16_FC(frac16_t f16InReq, frac16_t f16In, + const bool_t *pbStopIntegFlag, + GFLIB_CTRL_BETA_IP_P_AW_T_A32 *psParam); + +/***************************************************************************//*! +* @brief The function initializes the actual values of CtrlBetaIPpAWInit controller. +* +* @params in frac16_t f16InitVal - Initial state value for Integrating part +* ptr GFLIB_CTRL_BETA_IP_P_AW_T_A32 *psParam - Pointer to controller structure +* +* @return N/A +* +*******************************************************************************/ +static inline void GFLIB_CtrlBetaIPpAWInit_F16_FCi(frac16_t f16InitVal, + GFLIB_CTRL_BETA_IP_P_AW_T_A32 *psParam) +{ + psParam -> f32IAccK_1 = MLIB_Conv_F32s(f16InitVal); + psParam->f16InErrK_1 = (frac16_t)0; +} + + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_CTRLBETAIPP_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_CtrlPIp_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_CtrlPIp_A32.h new file mode 100644 index 0000000..44fd335 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_CtrlPIp_A32.h @@ -0,0 +1,99 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Parallel PI controller with and without anti-wind-up protection +* +*******************************************************************************/ +#ifndef _GFLIB_CTRLPIP_A32_H_ +#define _GFLIB_CTRLPIP_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_CtrlPIpAW_F16_Asm(f16InErr, pbStopIntegFlag, psParam) \ + GFLIB_CtrlPIpAW_F16_FAsm(f16InErr, pbStopIntegFlag, psParam) +#define GFLIB_CtrlPIpAWInit_F16_Ci(f16InitVal, psParam) \ + GFLIB_CtrlPIpAWInit_F16_FCi(f16InitVal, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + acc32_t a32PGain; /* Proportional Gain */ + acc32_t a32IGain; /* Integral Gain */ + frac32_t f32IAccK_1; /* State variable output at step k-1 */ + frac16_t f16InErrK_1; /* State variable input error at step k-1 */ + frac16_t f16UpperLim; /* Upper Limit of the controller */ + frac16_t f16LowerLim; /* Lower Limit of the controller */ + bool_t bLimFlag; /* Limitation flag, if set to 1, the controller + output has reached either the UpperLimit or LowerLimit */ +}GFLIB_CTRL_PI_P_AW_T_A32; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GFLIB_CtrlPIpAW_F16_FAsm(frac16_t f16InErr, + const bool_t *pbStopIntegFlag, + GFLIB_CTRL_PI_P_AW_T_A32 *psParam); + +/***************************************************************************//*! +* @brief The function initializes the actual values of CtrlPIpAWInit controller. +* +* @params in frac16_t f16InitVal - Initial state value for Integrating part +* ptr GFLIB_CTRL_PI_P_AW_T_A32 *psParam - Pointer to controller structure +* +* @return N/A +* +*******************************************************************************/ +static inline void GFLIB_CtrlPIpAWInit_F16_FCi(frac16_t f16InitVal, + GFLIB_CTRL_PI_P_AW_T_A32 *psParam) +{ + psParam -> f32IAccK_1 = MLIB_Conv_F32s(f16InitVal); + psParam->f16InErrK_1 = (frac16_t)0; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_CTRLPIP_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DFlexRampHw_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DFlexRampHw_A32.h new file mode 100644 index 0000000..908e92e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DFlexRampHw_A32.h @@ -0,0 +1,67 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Dynamic flex ramp functions with 16-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_DFLEXRAMPHW_A32_H_ +#define _GFLIB_DFLEXRAMPHW_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif +/****************************************************************************** +* Includes +******************************************************************************/ +#include "mlib.h" +#include "GFLIB_DFlexRamp_A32.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GFLIB_DFlexRampCalcIncrHw_F16_C(f16Target, a32Duration, f32IncrSatMot, f32IncrSatGen, psParam) \ + GFLIB_DFlexRampCalcIncrHw_F16_FC(f16Target, a32Duration, f32IncrSatMot, f32IncrSatGen, psParam) + +/****************************************************************************** +* Exported function prototypes +******************************************************************************/ +extern void GFLIB_DFlexRampCalcIncrHw_F16_FC(frac16_t f16Target, + acc32_t a32Duration, + frac32_t f32IncrSatMot, + frac32_t f32IncrSatGen, + GFLIB_DFLEXRAMP_T_F32 *psParam); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_DFLEXRAMPHW_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DFlexRamp_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DFlexRamp_A32.h new file mode 100644 index 0000000..3b0dd32 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DFlexRamp_A32.h @@ -0,0 +1,126 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Dynamic flex ramp functions with 16-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_DFLEXRAMP_A32_H_ +#define _GFLIB_DFLEXRAMP_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif +/****************************************************************************** +* Includes +******************************************************************************/ +#include "mlib.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GFLIB_DFlexRampInit_F16_C(f16InitVal, psParam) \ + GFLIB_DFlexRampInit_F16_FC(f16InitVal, psParam) +#define GFLIB_DFlexRampCalcIncr_F16_C(f16Target, a32Duration, f32IncrSatMot, f32IncrSatGen, psParam) \ + GFLIB_DFlexRampCalcIncr_F16_FC(f16Target, a32Duration, f32IncrSatMot, f32IncrSatGen, psParam) +#define GFLIB_DFlexRamp_F16_C(f16Instant, pbStopFlagMot, pbStopFlagGen, psParam) \ + GFLIB_DFlexRamp_F16_FC(f16Instant, pbStopFlagMot, pbStopFlagGen, psParam) + +/****************************************************************************** +* Types +******************************************************************************/ +/* Flex dynamic ramp structure */ +typedef struct +{ + frac32_t f32State; + frac32_t f32Incr; + frac32_t f32IncrSatMot; + frac32_t f32IncrSatGen; + frac32_t f32Target; + frac32_t f32Ts; + frac32_t f32IncrMax; + bool_t bReachFlag; +} GFLIB_DFLEXRAMP_T_F32; + +/****************************************************************************** +* Exported function prototypes +******************************************************************************/ +extern void GFLIB_DFlexRampCalcIncr_F16_FC(frac16_t f16Target, + acc32_t a32Duration, + frac32_t f32IncrSatMot, + frac32_t f32IncrSatGen, + GFLIB_DFLEXRAMP_T_F32 *psParam); + +extern frac16_t GFLIB_DFlexRamp_F16_FC(frac16_t f16Instant, + const bool_t *pbStopFlagMot, + const bool_t *pbStopFlagGen, + GFLIB_DFLEXRAMP_T_F32 *psParam); + + +/****************************************************************************** +* Inline functions +******************************************************************************/ + +/***************************************************************************//*! +* +* @brief Dynamic flex ramp initialization +* +* @param in frac16_t f16InitVal - Measured instant value in <-1;1) in frac16_t +* +* @param ptr GFLIB_FLEXRAMP_T_F32 *psParam +* - f32State: State variable keeping the last state, assigned by GFLIB_DFlexRampInit_F16 +* - f32Incr: Increment - calculated by GFLIB_DFlexRampCalcIncr_F16 function +* - f32IncrSatMot: Motor mode saturation mode increment - assigned by user(positive value), +* sign can be changed by GFLIB_DFlexRampCalcIncr_F16 +* - f32IncrSatGen: Generator mode saturation mode increment - assigned by user(positive value), +* sign can be changed by GFLIB_DFlexRampCalcIncr_F16 +* - f32Target: Target value - assigned by GFLIB_DFlexRampCalcIncr_F16 function +* - f32Ts: Sample time [s] - assigned by user(positive value) +* - f32IncrMax: Maximum increment - assigned by user(positive value) +* - bReachFlag: Flag is set to TRUE if the desired value is achieved +* +* @return void +* +* @remarks The initialization value is stored into the f32State variable and the bReachFlag flag is cleared. +* +****************************************************************************/ +static inline void GFLIB_DFlexRampInit_F16_FC(register frac16_t f16InitVal, + register GFLIB_DFLEXRAMP_T_F32 *psParam) +{ + psParam -> f32State = MLIB_Conv_F32s(f16InitVal); + psParam -> bReachFlag = FALSE; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_DFLEXRAMP_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DRamp_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DRamp_F16.h new file mode 100644 index 0000000..8e73971 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DRamp_F16.h @@ -0,0 +1,101 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Dynamic Ramp +* +*******************************************************************************/ +#ifndef _GFLIB_DRAMP_F16_H_ +#define _GFLIB_DRAMP_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_DRampInit_F16_Ci(f16InitVal, psParam) \ + GFLIB_DRampInit_F16_FCi(f16InitVal, psParam) +#define GFLIB_DRamp_F16_Asm(f16Target, f16Instant, pbStopFlag, psParam) \ + GFLIB_DRamp_F16_FAsm(f16Target, f16Instant, pbStopFlag, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac16_t f16RampUp; /* Ramp-up increment */ + frac16_t f16RampDown; /* Ramp-down increment */ + frac16_t f16RampUpSat; /* Ramp-up increment used in case of saturation */ + frac16_t f16RampDownSat; /* Ramp-down increment used in case of saturation */ + frac16_t f16State; /* Previous ramp value */ + bool_t bReachFlag; /* Flag is set to 1 if the desired value is achieved */ +} GFLIB_DRAMP_T_F16; + +/***************************************************************************//*! +* @brief The function initializes the actual value of DRamp_F16. +* +* @param ptr GFLIB_DRAMP_T_F16 *psParam +* - f16RampUp: Ramp-up increment +* - f16RampDown: Ramp-down increment +* - f16RampUpSat: Ramp-up increment used in case of saturation +* - f16RampDownSat: Ramp-down increment used in case of saturation +* - f16State: Previous ramp value +* - bReachFlag: Flag is set to 1 if the desired value is achieved +* @param in frac16_t f16InitVal - Initial value +* @remarks The initialization value is stored into the psParam->f16State and the +* bReachFlag flag is cleared. +*******************************************************************************/ +static inline void GFLIB_DRampInit_F16_FCi(frac16_t f16InitVal, GFLIB_DRAMP_T_F16 *psParam) +{ + psParam->f16State = f16InitVal; + psParam->bReachFlag = (bool_t)0; +} + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GFLIB_DRamp_F16_FAsm(frac16_t f16Target, frac16_t f16Instant, + const bool_t *pbStopFlag, GFLIB_DRAMP_T_F16 *psParam); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_DRAMP_F16_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DRamp_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DRamp_F32.h new file mode 100644 index 0000000..1a1ad9b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_DRamp_F32.h @@ -0,0 +1,101 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Dynamic ramp +* +*******************************************************************************/ +#ifndef _GFLIB_DRAMP_F32_H_ +#define _GFLIB_DRAMP_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_DRampInit_F32_Ci(f32InitVal, psParam) \ + GFLIB_DRampInit_F32_FCi(f32InitVal, psParam) +#define GFLIB_DRamp_F32_Asm(f32Target, f32Instant, pbStopFlag, psParam) \ + GFLIB_DRamp_F32_FAsm(f32Target, f32Instant, pbStopFlag, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac32_t f32RampUp; /* Ramp-up increment */ + frac32_t f32RampDown; /* Ramp-down increment */ + frac32_t f32RampUpSat; /* Ramp-up increment used in case of saturation */ + frac32_t f32RampDownSat; /* Ramp-down increment used in case of saturation */ + frac32_t f32State; /* Previous ramp value */ + bool_t bReachFlag; /* Flag is set to 1 if the desired value is achieved */ +} GFLIB_DRAMP_T_F32; + +/***************************************************************************//*! +* @brief The function initializes the actual value of DRamp_F32. +* +* @param ptr GFLIB_DRAMP_T_F32 *psParam +* - f32RampUp: Ramp-up increment +* - f32RampDown: Ramp-down increment +* - f32RampUpSat: Ramp-up increment used in case of saturation +* - f32RampDownSat: Ramp-down increment used in case of saturation +* - f32State: Previous ramp value +* - bReachFlag: Flag is set to 1 if the desired value is achieved +* @param in frac32_t f32InitVal - Initial value +* @remarks The initialization value is stored into the psParam->f32State and the +* bReachFlag flag is cleared. +*******************************************************************************/ +static inline void GFLIB_DRampInit_F32_FCi(frac32_t f32InitVal, GFLIB_DRAMP_T_F32 *psParam) +{ + psParam->f32State = f32InitVal; + psParam->bReachFlag = (bool_t)0; +} + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t GFLIB_DRamp_F32_FAsm(frac32_t f32Target, frac32_t f32Instant, + const bool_t *pbStopFlag, GFLIB_DRAMP_T_F32 *psParam); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_DRAMP_F32_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_FlexRampHw_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_FlexRampHw_A32.h new file mode 100644 index 0000000..a7cce08 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_FlexRampHw_A32.h @@ -0,0 +1,66 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Flex ramp functions with 16-bit fractional output and MMDVSQ support +* +*******************************************************************************/ +#ifndef _GFLIB_FLEXRAMPHW_A32_H_ +#define _GFLIB_FLEXRAMPHW_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif +/****************************************************************************** +* Includes +******************************************************************************/ +#include "mlib.h" +#include "GFLIB_FlexRamp_A32.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GFLIB_FlexRampCalcIncrHw_F16_C(f16Target, a32Duration, psParam) \ + GFLIB_FlexRampCalcIncrHw_F16_FC(f16Target, a32Duration, psParam) + +/****************************************************************************** +* Exported function prototypes +******************************************************************************/ +extern void GFLIB_FlexRampCalcIncrHw_F16_FC(frac16_t f16Target, + acc32_t a32Duration, + GFLIB_FLEXRAMP_T_F32 *psParam); + + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_FLEXRAMPHw_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_FlexRamp_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_FlexRamp_A32.h new file mode 100644 index 0000000..587d470 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_FlexRamp_A32.h @@ -0,0 +1,116 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Flex ramp functions with 16-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_FLEXRAMP_A32_H_ +#define _GFLIB_FLEXRAMP_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif +/****************************************************************************** +* Includes +******************************************************************************/ +#include "mlib.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GFLIB_FlexRampInit_F16_C(f16InitVal, psParam) \ + GFLIB_FlexRampInit_F16_FC(f16InitVal, psParam) +#define GFLIB_FlexRampCalcIncr_F16_C(f16Target, a32Duration, psParam) \ + GFLIB_FlexRampCalcIncr_F16_FC(f16Target, a32Duration, psParam) +#define GFLIB_FlexRamp_F16_C(psParam) \ + GFLIB_FlexRamp_F16_FC(psParam) + +/****************************************************************************** +* Types +******************************************************************************/ +/* Flex dynamic ramp structure */ +typedef struct +{ + frac32_t f32State; + frac32_t f32Incr; + frac32_t f32Target; + frac32_t f32Ts; + frac32_t f32IncrMax; + bool_t bReachFlag; +} GFLIB_FLEXRAMP_T_F32; + +/****************************************************************************** +* Exported function prototypes +******************************************************************************/ +extern void GFLIB_FlexRampCalcIncr_F16_FC(frac16_t f16Target, + acc32_t a32Duration, + GFLIB_FLEXRAMP_T_F32 *psParam); + +extern frac16_t GFLIB_FlexRamp_F16_FC(GFLIB_FLEXRAMP_T_F32 *psParam); + +/****************************************************************************** +* Inline functions +******************************************************************************/ + +/***************************************************************************//*! +* +* @brief Flex ramp initialization +* +* @param in frac16_t f16InitVal - Measured instant value in <-1;1) in frac16_t +* +* @param ptr GFLIB_FLEXRAMP_T_F32 *psParam +* - f32State: State variable keeping the last state, assigned by +* GFLIB_FlexRampInit_F16 +* - f32Incr: Increment - calculated by GFLIB_FlexRampCalcIncr_F16 function +* - f32Target: Target value - assigned by GFLIB_FlexRampCalcIncr_F16 function +* - f32Ts: Sample time [s] - assigned by user(positive value) +* - f32IncrMax: Maximum increment - assigned by user(positive value) +* - bReachFlag: Flag is set to TRUE if the desired value is achieved +* +* @return void +* +* @remarks The initialization value is stored into the f32State variable and the +* bReachFlag flag is cleared. +* +****************************************************************************/ +static inline void GFLIB_FlexRampInit_F16_FC(register frac16_t f16InitVal, + register GFLIB_FLEXRAMP_T_F32 *psParam) +{ + psParam -> f32State = MLIB_Conv_F32s(f16InitVal); + psParam -> bReachFlag = FALSE; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_FLEXRAMP_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Hyst_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Hyst_F16_Asmi.h new file mode 100644 index 0000000..b83bfb2 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Hyst_F16_Asmi.h @@ -0,0 +1,224 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Hysteresis function +* +*******************************************************************************/ +#ifndef _GFLIB_HYST_F16_ASMI_H_ +#define _GFLIB_HYST_F16_ASMI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Hyst_F16_Asmi(f16Val, psParam) GFLIB_Hyst_F16_FAsmi(f16Val, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac16_t f16HystOn; /* Value determining the upper threshold */ + frac16_t f16HystOff; /* Value determining the lower threshold */ + frac16_t f16OutValOn; /* Value of the output when input is higher than the upper threshold */ + frac16_t f16OutValOff; /* Value of output when input is lower than lower threshold */ + frac16_t f16OutState; /* Actual state of the output */ +} GFLIB_HYST_T_F16; + +/***************************************************************************//*! +* +* @brief Hysteresis function +* +* @param ptr GFLIB_HYST_T_F16 *psParam +* - f16HystOn: Upper threshold +* - f16HystOff: Lower threshold +* - f16OutValOn: Output when input is above f16HystOn +* - f16OutValOff: Output when input is below f16HystOff +* - f16OutState: Output of the function +* +* @param in frac16_t f16Val +* - Argument in <-1;1) in frac16_t +* +* @return N/A +* +* @remarks The function represents a hysteresis (or relay) function. The +* function switches output between the two predefined values. When +* the input is higher than upper threshold f16HystOn, the output +* is high; when the input is below another (lower) threshold +* f16HystOff, the output is low; when the input is between the two, +* the output retains its value. +* +****************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t GFLIB_Hyst_F16_FAsmi(frac16_t f16Val, GFLIB_HYST_T_F16 *psParam) +{ + register frac16_t f16Temp=0, f16Out=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ ldrh f16Temp, [psParam, #2] /* f16Temp = psParam->f16HystOff */ + sxth f16Temp, f16Temp /* Sign extend */ + sxth f16Val, f16Val /* Sign extend */ + cmp f16Temp, f16Val /* Compares f16HystOff with f16Val*/ + ble Hyst_F16_HystOn /* If f16HystOff <= f16Val, then goes to the Hyst_F16_HystOn */ + ldrh f16Out, [psParam, #6] /* f16Out = psParam->f16OutValOff */ + b Hyst_F16_End /* Goes to the Hyst_F16_End */ + Hyst_F16_HystOn: + ldrh f16Temp, [psParam] /* f16Temp = psParam->f16HystOn */ + sxth f16Temp, f16Temp /* Sign extend */ + cmp f16Temp, f16Val /* Compares f16HystOn with f16Val*/ + bge Hyst_F16_State /* If f16HystOff >= f16Val, then goes to the Hyst_F16_State */ + ldrh f16Out, [psParam, #4] /* f16Out = psParam->f16OutValOn */ + b Hyst_F16_End /* Goes to the Hyst_F16_End */ + Hyst_F16_State: + ldrh f16Out, [psParam, #8] /* f16Out = psParam->f16State */ + ldrh f16Temp, [psParam, #4] /* f16Temp = psParam->f16OutValOn */ + cmp f16Out, f16Temp /* Compares f16State with f16OutValOn */ + beq Hyst_F16_End /* If f16State != f16OutValOn, then executes next command */ + ldrh f16Out, [psParam, #6] /* f16Out = psParam->f16OutValOff */ + Hyst_F16_End: + strh f16Out, [psParam, #8] }; /* psParam->f16State = f16Out */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "ldrh %2, [%3, #2] \n\t" /* f16Temp = psParam->f16HystOff */ + "sxth %2, %2 \n\t" /* Sign extend */ + "sxth %1, %1 \n\t" /* Sign extend */ + "cmp %2, %1 \n\t" /* Compares f16HystOff with f16Val*/ + "ble GFLIB_Hyst_F16_HystOn%= \n\t"/* If f16HystOff <= f16Val, then goes to the GFLIB_Hyst_F16_HystOn */ + "ldrh %0, [%3, #6] \n\t" /* f16Out = psParam->f16OutValOff */ + "b GFLIB_Hyst_F16_End%= \n\t" /* Goes to the GFLIB_Hyst_F16_End */ + "GFLIB_Hyst_F16_HystOn%=: \n\t" + "ldrh %2, [%3] \n\t" /* f16Temp = psParam->f16HystOn */ + "sxth %2, %2 \n\t" /* Sign extend */ + "cmp %2, %1 \n\t" /* Compares f16HystOn with f16Val*/ + "bge GFLIB_Hyst_F16_State%= \n\t" /* If f16HystOff >= f16Val, then goes to the GFLIB_Hyst_F16_State */ + "ldrh %0, [%3, #4] \n\t" /* f16Out = psParam->f16OutValOn */ + "b GFLIB_Hyst_F16_End%= \n\t" /* Goes to the GFLIB_Hyst_F16_End */ + "GFLIB_Hyst_F16_State%=: \n\t" + "ldrh %0, [%3, #8] \n\t" /* f16Out = psParam->f16State */ + "ldrh %2, [%3, #4] \n\t" /* f16Temp = psParam->f16OutValOn */ + "cmp %0, %2 \n\t" /* Compares f16State with f16OutValOn */ + "beq GFLIB_Hyst_F16_End%= \n\t" /* If f16State != f16OutValOn, then executes next command */ + "ldrh %0, [%3, #6] \n\t" /* f16Out = psParam->f16OutValOff */ + "GFLIB_Hyst_F16_End%=: \n\t" + "strh %0, [%3, #8] \n\t" /* psParam->f16State = f16Out */ + : "=&l"(f16Out), "+l"(f16Val), "+l"(f16Temp): "l"(psParam)); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "ldrh %2, [%3, #2] \n" /* f16Temp = psParam->f16HystOff */ + "sxth %2, %2 \n" /* Sign extend */ + "sxth %1, %1 \n" /* Sign extend */ + "cmp %2, %1 \n" /* Compares f16HystOff with f16Val*/ + "ble Hyst_F16_HystOn%= \n" /* If f16HystOff <= f16Val, then goes to the Hyst_F16_HystOn */ + "ldrh %0, [%3, #6] \n" /* f16Out = psParam->f16OutValOff */ + "b Hyst_F16_End%= \n" /* Goes to the Hyst_F16_End */ + "Hyst_F16_HystOn%=: \n" + "ldrh %2, [%3] \n" /* f16Temp = psParam->f16HystOn */ + "sxth %2, %2 \n" /* Sign extend */ + "cmp %2, %1 \n" /* Compares f16HystOn with f16Val*/ + "bge Hyst_F16_State%= \n" /* If f16HystOff >= f16Val, then goes to the Hyst_F16_State */ + "ldrh %0, [%3, #4] \n" /* f16Out = psParam->f16OutValOn */ + "b Hyst_F16_End%= \n" /* Goes to the Hyst_F16_End */ + "Hyst_F16_State%=: \n" + "ldrh %0, [%3, #8] \n" /* f16Out = psParam->f16State */ + "ldrh %2, [%3, #4] \n" /* f16Temp = psParam->f16OutValOn */ + "cmp %0, %2 \n" /* Compares f16State with f16OutValOn */ + "beq Hyst_F16_End%= \n" /* If f16State != f16OutValOn, then executes next command */ + "ldrh %0, [%3, #6] \n" /* f16Out = psParam->f16OutValOff */ + "Hyst_F16_End%=: \n" + "strh %0, [%3, #8] \n" /* psParam->f16State = f16Out */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "=&l"(f16Out), "+l"(f16Val), "+l"(f16Temp): "l"(psParam)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "ldrh %2, [%3, #2] \n" /* f16Temp = psParam->f16HystOff */ + "sxth %2, %2 \n" /* Sign extend */ + "sxth %1, %1 \n" /* Sign extend */ + "cmp %2, %1 \n" /* Compares f16HystOff with f16Val*/ + "ble Hyst_F16_HystOn \n" /* If f16HystOff <= f16Val, then goes to the Hyst_F16_HystOn */ + "ldrh %0, [%3, #6] \n" /* f16Out = psParam->f16OutValOff */ + "b Hyst_F16_End \n" /* Goes to the Hyst_F16_End */ + "Hyst_F16_HystOn: \n" + "ldrh %2, [%3] \n" /* f16Temp = psParam->f16HystOn */ + "sxth %2, %2 \n" /* Sign extend */ + "cmp %2, %1 \n" /* Compares f16HystOn with f16Val*/ + "bge Hyst_F16_State \n" /* If f16HystOff >= f16Val, then goes to the Hyst_F16_State */ + "ldrh %0, [%3, #4] \n" /* f16Out = psParam->f16OutValOn */ + "b Hyst_F16_End \n" /* Goes to the Hyst_F16_End */ + "Hyst_F16_State: \n" + "ldrh %0, [%3, #8] \n" /* f16Out = psParam->f16State */ + "ldrh %2, [%3, #4] \n" /* f16Temp = psParam->f16OutValOn */ + "cmp %0, %2 \n" /* Compares f16State with f16OutValOn */ + "beq Hyst_F16_End \n" /* If f16State != f16OutValOn, then executes next command */ + "ldrh %0, [%3, #6] \n" /* f16Out = psParam->f16OutValOff */ + "Hyst_F16_End: \n" + "strh %0, [%3, #8] \n" /* psParam->f16State = f16Out */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "=&l"(f16Out), "+l"(f16Val), "+l"(f16Temp): "l"(psParam)); + #endif + + return f16Out; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _GFLIB_HYST_F16_ASMI_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Integrator_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Integrator_A32.h new file mode 100644 index 0000000..0aa3f8b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Integrator_A32.h @@ -0,0 +1,138 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Integrator with bilinear transformation +* +*******************************************************************************/ +#ifndef _GFLIB_INTEGRATOR_A32_H_ +#define _GFLIB_INTEGRATOR_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_IntegratorInit_F16_Ci(f16InitVal, psParam) \ + GFLIB_IntegratorInit_F16_FCi(f16InitVal, psParam) +#define GFLIB_Integrator_F16_Ci(f16InVal, psParam) \ + GFLIB_Integrator_F16_FCi(f16InVal, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + acc32_t a32Gain; /* Integration Gain */ + frac32_t f32IAccK_1; /* Output Value from the previous step */ + frac16_t f16InValK_1; /* Input Value from the previous step */ +} GFLIB_INTEGRATOR_T_A32; + +/***************************************************************************//*! +* @brief The function initializes the actual value of Integrator. +* +* @param ptr GFLIB_INTEGRATOR_T *psParam - Pointer to integrator structure +* GFLIB_INTEGRATOR_T data structure: +* acc32 a32Gain - gain; input parameter +* in the following range: -65536.0 <= a32Gain < 65536.0 +* frac32_t f32IAccK_1 - state variable; fractional part (lower long) +* of integral part at step k-1; +* can be modified outside of the function; +* input/output parameter +* in the following range: -1.0 <= f32IAccK_1 < 1.0 +* frac16_t f16InValK_1 - input value at the step k-1; +* input/output parameter +* in the following range: -1.0 <= f16InVal_1 < 1.0 +* @param in frac16_t f16InitVal - Initial value +* +*******************************************************************************/ +static inline void GFLIB_IntegratorInit_F16_FCi(register frac16_t f16InitVal, + register GFLIB_INTEGRATOR_T_A32 *psParam) +{ + psParam->f32IAccK_1 = MLIB_Conv_F32s(f16InitVal); /* Stores the integral portion */ + psParam->f16InValK_1 = 0; /* Resets the previous step error */ +} + +/***************************************************************************//*! +* +* @brief Scaled integrator with the bilinear transformation. +* +* @param ptr GFLIB_INTEGRATOR_T *psParam - Pointer to integrator structure +* GFLIB_INTEGRATOR_T data structure: +* acc32 a32Gain - gain; input parameter +* in the following range: -65536.0 <= a32Gain < 65536.0 +* frac32_t f32IAccK_1 - state variable; fractional part (lower long) +* of integral part at step k-1; +* can be modified outside of the function; +* input/output parameter +* in the following range: -1.0 <= f32IAccK_1 < 1.0 +* frac16_t f16InValK_1 - input value at the step k-1; +* input/output parameter +* in the following range: -1.0 <= f16InVal_1 < 1.0 +* @param in Frac16 f16InVal - input value +* +* @return out This function returns the integrated value. - frac16_t value <-1;1) +* +* @remarks Integrated input value according to equation: +* +* f32IAccK_1 = [(f16InVal + f16InValK_1) / 2] * a32Gain) + f32IAccK_1 +* f16InValK_1 = f16InVal +* output = (frac16_t)f32IAccK_1 +* +*******************************************************************************/ +static inline frac16_t GFLIB_Integrator_F16_FCi(register frac16_t f16InVal, register GFLIB_INTEGRATOR_T_A32 *psParam) +{ + register acc32_t a32Temp; + register frac32_t f32Temp; + + a32Temp = ((acc32_t)f16InVal + (acc32_t)psParam->f16InValK_1); /* input + previous input */ + f32Temp = psParam->a32Gain * a32Temp; /* multiply by 0.5 because of bilinear transformation */ + + f32Temp = MLIB_Add_F32(psParam->f32IAccK_1,f32Temp); /* summed with previous output*/ + psParam->f32IAccK_1 = f32Temp; + psParam->f16InValK_1 = f16InVal; /* set value of previous input for next execution */ + + return (MLIB_Conv_F16l(f32Temp + 0x8000)); /* convert to f16 + rounding */ +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_INTEGRATOR_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Limit_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Limit_F16.h new file mode 100644 index 0000000..4a6687f --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Limit_F16.h @@ -0,0 +1,87 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Limit functions with 16-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_LIMIT_F16_H_ +#define _GFLIB_LIMIT_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Limit_F16_Ci(f16Val, f16LLim, f16ULim) \ + GFLIB_Limit_F16_FCi(f16Val, f16LLim, f16ULim) + +/***************************************************************************//*! +* +* @brief Limit function +* +* @param in frac16_t f16Val - Argument in <-1;1) in frac16_t +* frac16_t f16LLim - LowerLimit in <-1;1) in frac16_t +* frac16_t f16ULim - UpperLimit in <-1;1) in frac16_t +* +* @return This function returns - frac16_t value <-1;1) +* +* @remarks This function trims the argument according to the upper f16ULim and +* lower f16LLim limits. The upper limit must >= lower limit. +* +****************************************************************************/ +static inline frac16_t GFLIB_Limit_F16_FCi(frac16_t f16Val, + frac16_t f16LLim, frac16_t f16ULim) +{ + if(f16Val > f16ULim) + { + return(f16ULim); + } + if(f16Val < f16LLim) + { + return(f16LLim); + } + return(f16Val); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_LIMIT_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Limit_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Limit_F32.h new file mode 100644 index 0000000..180b54d --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Limit_F32.h @@ -0,0 +1,89 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Limit functions with 32-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_LIMIT_F32_H_ +#define _GFLIB_LIMIT_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Limit_F32_Ci(f32Val, f32LLim, f32ULim) \ + GFLIB_Limit_F32_FCi(f32Val, f32LLim, f32ULim) + +/***************************************************************************//*! +* +* @brief Limit function 32-bit version +* +* @param in frac32_t f32Val - Argument in <-1;1) in frac32_t +* frac32_t f32LLim - Lower limit in <-1;1) in frac32_t +* frac32_t f32ULim - Upper limit in <-1;1) in frac32_t +* +* @return This function returns - frac32_t value <-1;1) +* +* @remarks This function trims the argument according to the upper f32ULim and +* lower f32LLim limits. The upper limit must >= lower limit. +* +****************************************************************************/ +static inline frac32_t GFLIB_Limit_F32_FCi(frac32_t f32Val, + frac32_t f32LLim, frac32_t f32ULim) +{ + if(f32Val > f32ULim) + { + return(f32ULim); + } + if(f32Val < f32LLim) + { + return(f32LLim); + } + + return(f32Val); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_LIMIT_F32_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LowerLimit_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LowerLimit_F16.h new file mode 100644 index 0000000..e8a3c06 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LowerLimit_F16.h @@ -0,0 +1,82 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Lower limit functions with 16-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_LOWERLIMIT_F16_H_ +#define _GFLIB_LOWERLIMIT_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_LowerLimit_F16_Ci(f16Val, f16LLim) \ + GFLIB_LowerLimit_F16_FCi(f16Val, f16LLim) + +/***************************************************************************//*! +* +* @brief Lower limit function +* +* @param in frac16_t f16Val - Argument in <-1;1) in frac16_t +* frac16_t f16LLim - LowerLimit in <-1;1) in frac16_t +* +* @return This function returns - frac16_t value <-1;1) +* +* @remarks This function trims the argument above or equal to lower f16LLim +* limit. +* +****************************************************************************/ +static inline frac16_t GFLIB_LowerLimit_F16_FCi(frac16_t f16Val, frac16_t f16LLim) +{ + if(f16Val < f16LLim) + { + f16Val = f16LLim; + } + return(f16Val); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_LOWERLIMIT_F16_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LowerLimit_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LowerLimit_F32.h new file mode 100644 index 0000000..fa85a42 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LowerLimit_F32.h @@ -0,0 +1,83 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Lower limit functions with 32-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_LOWERLIMIT_F32_H_ +#define _GFLIB_LOWERLIMIT_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_LowerLimit_F32_Ci(f32Val, f32LLim) \ + GFLIB_LowerLimit_F32_FCi(f32Val, f32LLim) + +/***************************************************************************//*! +* +* @brief Lower limit function +* +* @param in frac32_t f32Val - Argument in <-1;1) in frac32_t +* frac32_t f32LLim - LowerLimit in <-1;1) in frac32_t +* +* @return This function returns - frac32_t value <-1;1) +* +* @remarks This function trims the argument above or equal to lower f32LLim +* limit. +* +****************************************************************************/ +static inline frac32_t GFLIB_LowerLimit_F32_FCi(frac32_t f32Val, frac32_t f32LLim) +{ + if(f32Val < f32LLim) + { + f32Val = f32LLim; + } + return(f32Val); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_LOWERLIMIT_F32_H_ */ + + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LutPer_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LutPer_F16_Asmi.h new file mode 100644 index 0000000..8ea92f3 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LutPer_F16_Asmi.h @@ -0,0 +1,171 @@ + /******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Periodical look-up table algorithm using linear interpolation +* +*******************************************************************************/ +#ifndef _GFLIB_LUTPER1D_ASMI_F16_H_ +#define _GFLIB_LUTPER1D_ASMI_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_LutPer1D_F16_Asmi(f16X, pf16Table, u16TableSize) GFLIB_LutPer1D_F16_FAsmi(f16X, pf16Table, u16TableSize) + +/***************************************************************************//*! +* +* @brief Periodical look-up table algorithm using linear interpolation +* +* @param ptr r1 - Pointer to the table values +* @param in r0 - Argument in <-1;1) in frac16_t +* r2 - Size of the look-up table in bit shifts, 3 for 8 values +* +* @return This function returns +* r0 - frac16_t value <-1;1) +* +* @remarks This function calculates the number from the table using interpolation +* of two values in the table. +* The table size must be based on 2^x, i.e. 256 values contains +* the size 8. +* +*******************************************************************************/ +inline static frac16_t GFLIB_LutPer1D_F16_FAsmi(frac16_t f16X, const frac16_t *pf16Table, uint16_t u16TableSize) +{ + register frac32_t f32Val1 = 32768, f32Val2 = 16, f32Val3 = 1; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16X, f16X /* Transforms 16-bit input f16Val to 32-bit */ + adds f32Val1, f32Val1, f16X /* f32Val1 = 32768 + f16X */ + /* Calculates the number of bit shifts between the 16-bit and table resolution */ + subs f32Val2, f32Val2, u16TableSize /* f32Val2 = 16 - u16TableSize */ + /* 16-bit argument is converted to the table table size bits */ + lsrs f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 >> f32Val2 */ + /* The exact position between two table points is calculated by keeping the LSBits of the original + * argument, below the table resolution. Then it is shifted to get the frac16_t resolution */ + subs f32Val2, u16TableSize, #1 /* f32Val2 = u16TableSize - 1 */ + lsls f16X, f16X, f32Val2 /* f16X << (u16TableSize - 1) */ + lsls f16X, f16X, #17 /* f16X << 17 */ + lsrs f16X, f16X, #17 /* f16X >> 17: clears higher 17 bits */ + lsls f32Val2, f32Val1, #1 /* f32Val2 = f32Val1 << 1 */ + ldrsh f32Val2, [pf16Table, f32Val2] /* Loads y1 */ + adds f32Val1, f32Val1, #1 /* f32Val1 = f32Val1 + 1 */ + lsls f32Val3, f32Val3, u16TableSize /* f32Val3 = 1 << u16TableSize */ + subs f32Val3, f32Val3, #1 /* f32Val3 = (1 << u16TableSize) - 1 */ + ands f32Val3, f32Val3, f32Val1 /* f32Val3 = f32Val3 & f32Val1 */ + lsls f32Val3, f32Val3, #1 /* f32Val3 << 1 */ + ldrsh f32Val3, [pf16Table, f32Val3] /* Loads y2 */ + /* Subtracts two table values and interpolates, the next value to the previous is +1. */ + subs f32Val3, f32Val3, f32Val2 /* y2 - y1 */ + muls f16X, f32Val3, f16X /* (y2 - y1) * x */ + asrs f16X, f16X, #15 /* f16X >> 15 */ + adds f16X, f32Val2, f16X }; /* result = y1 + (y2 - y1) * x */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Transforms 16-bit input f16Val to 32-bit */ + "adds %3, %3, %0 \n\t" /* f32Val1 = 32768 + f16X */ + /* Calculates the number of bit shifts between the 16-bit and table resolution */ + "subs %4, %4, %2 \n\t" /* f32Val2 = 16 - u16TableSize */ + /* 16-bit argument is converted to the table table size bits */ + "lsrs %3, %3, %4 \n\t" /* f32Val1 = f32Val1 >> f32Val2 */ + /* The exact position between two table points is calculated by keeping the LSBits of the original + * argument, below the table resolution. Then it is shifted to get the frac16_t resolution */ + "subs %4, %2, #1 \n\t" /* f32Val2 = u16TableSize - 1 */ + "lsls %0, %0, %4 \n\t" /* f16X << (u16TableSize - 1) */ + "lsls %0, %0, #17 \n\t" /* f16X << 17 */ + "lsrs %0, %0, #17 \n\t" /* f16X >> 17: clears higher 17 bits */ + "lsls %4, %3, #1 \n\t" /* f32Val2 = f32Val1 << 1 */ + "ldrsh %4, [%1, %4] \n\t" /* Loads y1 */ + "adds %3, %3, #1 \n\t" /* f32Val1 = f32Val1 + 1 */ + "lsls %5, %5, %2 \n\t" /* f32Val3 = 1 << u16TableSize */ + "subs %5, %5, #1 \n\t" /* f32Val3 = (1 << u16TableSize) - 1 */ + "ands %5, %5, %3 \n\t" /* f32Val3 = f32Val3 & f32Val1 */ + "lsls %5, %5, #1 \n\t" /* f32Val3 << 1 */ + "ldrsh %5, [%1, %5] \n\t" /* Loads y2 */ + /* Subtracts two table values and interpolates, the next value to the previous is +1. */ + "subs %5, %5, %4 \n\t" /* y2 - y1 */ + "muls %0, %5, %0 \n\t" /* (y2 - y1) * x */ + "asrs %0, %0, #15 \n\t" /* f16X >> 15 */ + "adds %0, %4, %0 \n\t" /* result = y1 + (y2 - y1) * x */ + : "+l"(f16X), "+l"(pf16Table), "+l"(u16TableSize), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Transforms 16-bit input f16Val to 32-bit */ + "adds %3, %3, %0 \n" /* f32Val1 = 32768 + f16X */ + /* Calculates the number of bit shifts between the 16-bit and table resolution */ + "subs %4, %4, %2 \n" /* f32Val2 = 16 - u16TableSize */ + /* 16-bit argument is converted to the table table size bits */ + "lsrs %3, %3, %4 \n" /* f32Val1 = f32Val1 >> f32Val2 */ + /* The exact position between two table points is calculated by keeping the LSBits of the original + * argument, below the table resolution. Then it is shifted to get the frac16_t resolution */ + "subs %4, %2, #1 \n" /* f32Val2 = u16TableSize - 1 */ + "lsls %0, %0, %4 \n" /* f16X << (u16TableSize - 1) */ + "lsls %0, %0, #17 \n" /* f16X << 17 */ + "lsrs %0, %0, #17 \n" /* f16X >> 17: clears higher 17 bits */ + "lsls %4, %3, #1 \n" /* f32Val2 = f32Val1 << 1 */ + "ldrsh %4, [%1, %4] \n" /* Loads y1 */ + "adds %3, %3, #1 \n" /* f32Val1 = f32Val1 + 1 */ + "lsls %5, %5, %2 \n" /* f32Val3 = 1 << u16TableSize */ + "subs %5, %5, #1 \n" /* f32Val3 = (1 << u16TableSize) - 1 */ + "ands %5, %5, %3 \n" /* f32Val3 = f32Val3 & f32Val1 */ + "lsls %5, %5, #1 \n" /* f32Val3 << 1 */ + "ldrsh %5, [%1, %5] \n" /* Loads y2 */ + /* Subtracts two table values and interpolates, the next value to the previous is +1. */ + "subs %5, %5, %4 \n" /* y2 - y1 */ + "muls %0, %5, %0 \n" /* (y2 - y1) * x */ + "asrs %0, %0, #15 \n" /* f16X >> 15 */ + "adds %0, %4, %0 \n" /* result = y1 + (y2 - y1) * x */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16X), "+l"(pf16Table), "+l"(u16TableSize), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f16X; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_LUTPER1D_ASMI_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LutPer_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LutPer_F32.h new file mode 100644 index 0000000..514a5ef --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_LutPer_F32.h @@ -0,0 +1,67 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Periodical look-up table algorithm using linear interpolation +* +*******************************************************************************/ +#ifndef _GFLIB_LUTPER_F32_H_ +#define _GFLIB_LUTPER_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_LutPer1D_F16_C(f16X, pf16Table, u16TableSize) \ + GFLIB_LutPer1D_F16_FC(f16X, pf16Table, u16TableSize) +#define GFLIB_LutPer1D_F32_C(f32X, pf32Table, u16TableSize) \ + GFLIB_LutPer1D_F32_FC(f32X, pf32Table, u16TableSize) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GFLIB_LutPer1D_F16_FC(frac16_t f16X, const frac16_t *pf16Table, uint16_t u16TableSize); +extern frac32_t GFLIB_LutPer1D_F32_FC(frac32_t f32X, const frac32_t *pf32Table, uint16_t u16TableSize); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_LUTPER_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Lut_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Lut_F16_Asmi.h new file mode 100644 index 0000000..39ac3a7 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Lut_F16_Asmi.h @@ -0,0 +1,160 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Look-up table algorithm using linear interpolation +* +*******************************************************************************/ +#ifndef _GFLIB_LUT1D_ASMI_F16_H_ +#define _GFLIB_LUT1D_ASMI_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Lut1D_F16_Asmi(f16X, pf16Table, u16TableSize) GFLIB_Lut1D_F16_FAsmi(f16X, pf16Table, u16TableSize) + +/***************************************************************************//*! +* +* @brief Look-up table algorithm using linear interpolation +* +* @param ptr r1 - Pointer to the table values +* @param in r0 - Argument in <-1;1) in frac16_t +* r2 - Size of the look-up table in bit shifts, 3 for 8 values +* +* @return This function returns +* r0 - frac16_t value <-1;1) +* +* @remarks This function calculates the number from the table using interpolation +* of two values in the table. +* The table size must be based on 2^x+1, i.e. 257 values contains +* the size 8. +* +*******************************************************************************/ +inline static frac16_t GFLIB_Lut1D_F16_FAsmi(frac16_t f16X, const frac16_t *pf16Table, uint16_t u16TableSize) +{ + register frac32_t f32Val1 = 2; + register frac32_t f32Val2 = f16X; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16X, f16X /* Transforms 16-bit input f16Val to 32-bit */ + subs u16TableSize, u16TableSize, #1 /* u16TableSize = u16TableSize - 1 */ + lsls f32Val1, f32Val1, u16TableSize /* f32Val1 << u16TableSize */ + /* Extract the fractional part of the input abscissa */ + lsls f32Val2, f32Val2, u16TableSize /* f32Val2 << u16TableSize */ + lsls f32Val2, f32Val2, #17 /* f32Val2 << 17 */ + lsrs f32Val2, f32Val2, #17 /* f32Val2 >> 17: clears higher 17 bits */ + adds pf16Table, pf16Table, f32Val1 /* pf16Table = pf16Table + f32Val1 */ + movs f32Val1, #15 /* f32Val1 = 15 */ + subs f32Val1, f32Val1, u16TableSize /* f32Val1 = f32Val1 - u16TableSize */ + asrs f16X, f16X, f32Val1 /* f16X >> f32Val1 */ + lsls f16X, f16X, #1 /* f16X = f16X *2 */ + /* Read interpolated data */ + ldrsh u16TableSize, [pf16Table, f16X] /* Loads y1 */ + adds f16X, f16X, #2 /* f16X = f16X + 2 */ + ldrsh f32Val1, [pf16Table, f16X] /* Loads y2 */ + /* Perform the actual interpolation with 16-bit accuracy */ + subs f16X, f32Val1, u16TableSize /* y2 - y1 */ + muls f16X, f16X, f32Val2 /* (y2 - y1) * x */ + asrs f16X, f16X, #15 /* f16X >> 15 */ + adds f16X, f16X, u16TableSize }; /* result = y1 + (y2 - y1) * x */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Transforms 16-bit input f16Val to 32-bit */ + "subs %2, %2, #1 \n\t" /* u16TableSize = u16TableSize - 1 */ + "lsls %3, %3, %2 \n\t" /* f32Val1 << u16TableSize */ + /* Extract the fractional part of the input abscissa */ + "lsls %4, %4, %2 \n\t" /* f32Val2 << u16TableSize */ + "lsls %4, %4, #17 \n\t" /* f32Val2 << 17 */ + "lsrs %4, %4, #17 \n\t" /* f32Val2 >> 17: clears higher 17 bits */ + "adds %1, %1, %3 \n\t" /* pf16Table = pf16Table + f32Val1 */ + "movs %3, #15 \n\t" /* f32Val1 = 15 */ + "subs %3, %3, %2 \n\t" /* f32Val1 = f32Val1 - u16TableSize */ + "asrs %0, %0, %3 \n\t" /* f16X >> f32Val1 */ + "lsls %0, %0, #1 \n\t" /* f16X = f16X *2 */ + /* Read interpolated data */ + "ldrsh %2, [%1, %0] \n\t" /* Loads y1 */ + "adds %0, %0, #2 \n\t" /* f16X = f16X + 2 */ + "ldrsh %3, [%1, %0] \n\t" /* Loads y2 */ + /* Perform the actual interpolation with 16-bit accuracy */ + "subs %0, %3, %2 \n\t" /* y2 - y1 */ + "muls %0, %0, %4 \n\t" /* (y2 - y1) * x */ + "asrs %0, %0, #15 \n\t" /* f16X >> 15 */ + "adds %0, %0, %2 \n\t" /* result = y1 + (y2 - y1) * x */ + : "+l"(f16X), "+l"(pf16Table), "+l"(u16TableSize), "+l"(f32Val1), "+l"(f32Val2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Transforms 16-bit input f16Val to 32-bit */ + "subs %2, %2, #1 \n" /* u16TableSize = u16TableSize - 1 */ + "lsls %3, %3, %2 \n" /* f32Val1 << u16TableSize */ + /* Extract the fractional part of the input abscissa */ + "lsls %4, %4, %2 \n" /* f32Val2 << u16TableSize */ + "lsls %4, %4, #17 \n" /* f32Val2 << 17 */ + "lsrs %4, %4, #17 \n" /* f32Val2 >> 17: clears higher 17 bits */ + "adds %1, %1, %3 \n" /* pf16Table = pf16Table + f32Val1 */ + "movs %3, #15 \n" /* f32Val1 = 15 */ + "subs %3, %3, %2 \n" /* f32Val1 = f32Val1 - u16TableSize */ + "asrs %0, %0, %3 \n" /* f16X >> f32Val1 */ + "lsls %0, %0, #1 \n" /* f16X = f16X *2 */ + /* Read interpolated data */ + "ldrsh %2, [%1, %0] \n" /* Loads y1 */ + "adds %0, %0, #2 \n" /* f16X = f16X + 2 */ + "ldrsh %3, [%1, %0] \n" /* Loads y2 */ + /* Perform the actual interpolation with 16-bit accuracy */ + "subs %0, %3, %2 \n" /* y2 - y1 */ + "muls %0, %0, %4 \n" /* (y2 - y1) * x */ + "asrs %0, %0, #15 \n" /* f16X >> 15 */ + "adds %0, %0, %2 \n" /* result = y1 + (y2 - y1) * x */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16X), "+l"(pf16Table), "+l"(u16TableSize), "+l"(f32Val1), "+l"(f32Val2):); + #endif + + return f16X; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_LUT1D_ASMI_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Lut_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Lut_F32.h new file mode 100644 index 0000000..863dc12 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Lut_F32.h @@ -0,0 +1,65 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Look-up table algorithm using linear interpolation +* +*******************************************************************************/ +#ifndef _GFLIB_LUT1D_F32_H_ +#define _GFLIB_LUT1D_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Lut1D_F16_C(f16X, pf16Table, u16TableSize) GFLIB_Lut1D_F16_FC(f16X, pf16Table, u16TableSize) +#define GFLIB_Lut1D_F32_C(f32X, pf32Table, u16TableSize) GFLIB_Lut1D_F32_FC(f32X, pf32Table, u16TableSize) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GFLIB_Lut1D_F16_FC(frac16_t f16X, const frac16_t *pf16Table, uint16_t u16TableSize); +extern frac32_t GFLIB_Lut1D_F32_FC(frac32_t f32X, const frac32_t *pf32Table, uint16_t u16TableSize); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_LUT1D_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F16.h new file mode 100644 index 0000000..b14eafc --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F16.h @@ -0,0 +1,84 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Ramp +* +*******************************************************************************/ +#ifndef _GFLIB_RAMP_F16_H_ +#define _GFLIB_RAMP_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_RampInit_F16_Ci(f16InitVal, psParam) \ + GFLIB_RampInit_F16_FCi(f16InitVal, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac16_t f16RampUp; /* Ramp-up increment */ + frac16_t f16RampDown; /* Ramp-down increment */ + frac16_t f16State; /* Previous ramp value */ +} GFLIB_RAMP_T_F16; + +/***************************************************************************//*! +* @brief The function initializes the actual value of Ramp_F16. +* +* @param ptr GFLIB_RAMP_T_F16 *psParam +* - rampUp: Ramp-up increment +* - rampDown: Ramp-down increment +* - state: Actual state +* +* @param in frac16_t f16InitVal - Initial value +*******************************************************************************/ +static inline void GFLIB_RampInit_F16_FCi(frac16_t f16InitVal, GFLIB_RAMP_T_F16 *psParam) +{ + psParam->f16State = f16InitVal; +} +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_RAMP_F16_H_*/ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F16_Asmi.h new file mode 100644 index 0000000..2387391 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F16_Asmi.h @@ -0,0 +1,194 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Ramp +* +*******************************************************************************/ +#ifndef _GFLIB_RAMP_F16_ASMI_H_ +#define _GFLIB_RAMP_F16_ASMI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Ramp_F16_Asmi(f16Target, psParam) GFLIB_Ramp_F16_FAsmi(f16Target, psParam) + +/***************************************************************************//*! +* @brief Ramp function +* +* @param ptr GFLIB_RAMP_T_F16 *psParam +* - rampUp: Ramp-up increment +* - rampDown: Ramp-down increment +* - state: Actual state +* @param in frac16_t f16Target +* - Desired value in <-1;1) in frac16_t +* +* @return This function returns +* frac16_t value <-1;1) +* +* @remarks This function ramps the value from the f16State value up/down to +* the f16Target value using the up/down increments defined in +* the psParam structure. +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t GFLIB_Ramp_F16_FAsmi(frac16_t f16Target, GFLIB_RAMP_T_F16 *psParam) +{ + register frac32_t f32Val1=0, f32Val2=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ ldrh f32Val1, [psParam, #4] /* Loads psParam -> f16State */ + sxth f32Val1, f32Val1 /* Transforms 16-bit value to 32-bit */ + sxth f16Target, f16Target /* Transforms 16-bit input value to 32-bit */ + cmp f16Target, f32Val1 /* Compares f16Target with psParam -> f16State */ + blt RampDown /* If f16Target < psParam -> f16State, then ramps down */ + ldrh f32Val2, [psParam] /* Loads psParam -> f16RampUp */ + adds f32Val1, f32Val1, f32Val2 /* f32Val1 = f16State + f16RampUp */ + cmp f16Target, f32Val1 /* Compares f32Val1 with f16Target */ + blt RampEnd /* If f16Target < f32Val1, then executes next command */ + mov f16Target, f32Val1 /* f16Target = f32Val1 */ + b RampEnd /* Goes to the RampEnd label */ + RampDown: + ldrh f32Val2, [psParam, #2] /* Loads psParam -> f16RampDown */ + subs f32Val1, f32Val1, f32Val2 /* f32Val1 = f16State - f16RampDown */ + cmp f16Target, f32Val1 /* Compares f32Val1 with f16Target */ + bgt RampEnd /* If f16Target > f32Val1, then executes next command */ + mov f16Target, f32Val1 /* f16Target = f32Val1 */ + RampEnd: + strh f16Target, [psParam, #4] };/* Loads psParam -> f16State */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "ldrh %2, [%1, #4] \n\t" /* Loads psParam -> f16State */ + "sxth %2, %2 \n\t" /* Transforms 16-bit value to 32-bit */ + "sxth %0, %0 \n\t" /* Transforms 16-bit input value to 32-bit */ + "cmp %0, %2 \n\t" /* Compares f16Target with psParam -> f16State */ + "blt GFLIB_Ramp_F16_Down%= \n\t"/* If f16Target < psParam -> f16State, then ramps down */ + "ldrh %3, [%1] \n\t" /* Loads psParam -> f16RampUp */ + "adds %2, %2, %3 \n\t" /* f32Val1 = f16State + f16RampUp */ + "cmp %0, %2 \n\t" /* Compares f32Val1 with f16Target */ + "blt GFLIB_Ramp_F16_End%= \n\t" /* If f16Target < f32Val1, then executes next command */ + "mov %0, %2 \n\t" /* f16Target = f32Val1 */ + "b GFLIB_Ramp_F16_End%= \n\t" /* Goes to the RampEnd label */ + "GFLIB_Ramp_F16_Down%=: \n\t" + "ldrh %3, [%1, #2] \n\t" /* Loads psParam -> f16RampDown */ + "subs %2, %2, %3 \n\t" /* f32Val1 = f16State - f16RampDown */ + "cmp %0, %2 \n\t" /* Compares f32Val1 with f16Target */ + "bgt GFLIB_Ramp_F16_End%= \n\t" /* If f16Target > f32Val1, then executes next command */ + "mov %0, %2 \n\t" /* f16Target = f32Val1 */ + "GFLIB_Ramp_F16_End%=: \n\t" + "strh %0, [%1, #4] \n\t" /* Loads psParam -> f16State */ + : "+l"(f16Target), "+l"(psParam), "+l"(f32Val1), "+l"(f32Val2):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "ldrh %2, [%1, #4] \n" /* Loads psParam -> f16State */ + "sxth %2, %2 \n" /* Transforms 16-bit value to 32-bit */ + "sxth %0, %0 \n" /* Transforms 16-bit input value to 32-bit */ + "cmp %0, %2 \n" /* Compares f16Target with psParam -> f16State */ + "blt RampDown%= \n" /* If f16Target < psParam -> f16State, then ramps down */ + "ldrh %3, [%1] \n" /* Loads psParam -> f16RampUp */ + "adds %2, %2, %3 \n" /* f32Val1 = f16State + f16RampUp */ + "cmp %0, %2 \n" /* Compares f32Val1 with f16Target */ + "blt RampEnd%= \n" /* If f16Target < f32Val1, then executes next command */ + "mov %0, %2 \n" /* f16Target = f32Val1 */ + "b RampEnd%= \n" /* Goes to the RampEnd label */ + "RampDown%=: \n" + "ldrh %3, [%1, #2] \n" /* Loads psParam -> f16RampDown */ + "subs %2, %2, %3 \n" /* f32Val1 = f16State - f16RampDown */ + "cmp %0, %2 \n" /* Compares f32Val1 with f16Target */ + "bgt .+4 \n" /* If f16Target > f32Val1, then executes next command */ + "mov %0, %2 \n" /* f16Target = f32Val1 */ + "RampEnd%=: \n" + "strh %0, [%1, #4] \n" /* Loads psParam -> f16State */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Target), "+l"(psParam), "+l"(f32Val1), "+l"(f32Val2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "ldrh %2, [%1, #4] \n" /* Loads psParam -> f16State */ + "sxth %2, %2 \n" /* Transforms 16-bit value to 32-bit */ + "sxth %0, %0 \n" /* Transforms 16-bit input value to 32-bit */ + "cmp %0, %2 \n" /* Compares f16Target with psParam -> f16State */ + "blt RampDown \n" /* If f16Target < psParam -> f16State, then ramps down */ + "ldrh %3, [%1] \n" /* Loads psParam -> f16RampUp */ + "adds %2, %2, %3 \n" /* f32Val1 = f16State + f16RampUp */ + "cmp %0, %2 \n" /* Compares f32Val1 with f16Target */ + "blt RampEnd \n" /* If f16Target < f32Val1, then executes next command */ + "mov %0, %2 \n" /* f16Target = f32Val1 */ + "b RampEnd \n" /* Goes to the RampEnd label */ + "RampDown: \n" + "ldrh %3, [%1, #2] \n" /* Loads psParam -> f16RampDown */ + "subs %2, %2, %3 \n" /* f32Val1 = f16State - f16RampDown */ + "cmp %0, %2 \n" /* Compares f32Val1 with f16Target */ + "bgt .+4 \n" /* If f16Target > f32Val1, then executes next command */ + "mov %0, %2 \n" /* f16Target = f32Val1 */ + "RampEnd: \n" + "strh %0, [%1, #4] \n" /* Loads psParam -> f16State */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Target), "+l"(psParam), "+l"(f32Val1), "+l"(f32Val2):); + #endif + return(f16Target); +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_RAMP_F16_ASMI_H */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F32.h new file mode 100644 index 0000000..f6006ec --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F32.h @@ -0,0 +1,84 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Ramp +* +*******************************************************************************/ +#ifndef _GFLIB_RAMP_F32_H_ +#define _GFLIB_RAMP_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +******************************************************************************/ +#define GFLIB_RampInit_F32_Ci(f32InitVal, psParam) \ + GFLIB_RampInit_F32_FCi(f32InitVal, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac32_t f32RampUp; /* Ramp-up increment */ + frac32_t f32RampDown; /* Ramp-down increment */ + frac32_t f32State; /* Previous ramp value */ +} GFLIB_RAMP_T_F32; + +/***************************************************************************//*! +* @brief The function initializes the actual value of Ramp_F32. +* +* @param ptr GFLIB_RAMP_T_F32 *psParam +* - rampUp: Ramp-up increment +* - rampDown: Ramp-down increment +* - state: Actual state +* +* @param in frac32_t f32InitVal - Initial value +*******************************************************************************/ +static inline void GFLIB_RampInit_F32_FCi(frac32_t f32InitVal, GFLIB_RAMP_T_F32 *psParam) +{ + psParam->f32State = f32InitVal; +} +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_RAMP_F32_H */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F32_Asmi.h new file mode 100644 index 0000000..b60737c --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Ramp_F32_Asmi.h @@ -0,0 +1,226 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Ramp +* +*******************************************************************************/ +#ifndef _GFLIB_RAMP_F32_ASMI_H_ +#define _GFLIB_RAMP_F32_ASMI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Ramp_F32_Asmi(f32Target, psParam) GFLIB_Ramp_F32_FAsmi(f32Target, psParam) + +/***************************************************************************//*! +* @brief Ramp function +* +* @param ptr GFLIB_RAMP_T_F32 *psParam +* - rampUp: Ramp-up increment +* - rampDown: Ramp-down increment +* - state: Actual state +* @param in frac32_t f32Target +* - Desired value in <-1;1) in frac32_t +* +* @return This function returns +* frac32_t value <-1;1) +* +* @remarks This function ramps the value from the f32State value up/down to +* the f32Target value using the up/down increments defined in +* the psParam structure. +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t GFLIB_Ramp_F32_FAsmi(frac32_t f32Target, GFLIB_RAMP_T_F32 *psParam) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ ldr f32Val1, [psParam, #8] /* Loads psParam -> f32State */ + cmp f32Target, f32Val1 /* Compares f32Target with psParam -> f32State */ + blt RampDown_F32 /* If f32Target < psParam -> f32State, then ramps down */ + ldr f32Val2, [psParam] /* Loads psParam -> f32RampUp */ + adds f32Val3, f32Val1, f32Val2 /* f32Val3 = f32State + f32RampUp */ + eors f32Val2, f32Val2, f32Val1 /* f32Val2 = f32State ^ f32RampUp */ + bmi RampUpLim_F32 /* If f32Val2 < 0, then goes to RampUpLim_F32 */ + eors f32Val1, f32Val1, f32Val3 /* f32Val1 = f32State ^ (f32State + f32RampUp) */ + bmi RampEnd_F32 /* If f32Val1 < 0, then goes to RampEnd_F32 */ + RampUpLim_F32: + cmp f32Target, f32Val3 /* Compares Result with f32Target */ + blt RampEnd_F32 /* If f32Target < Result, then executes next command */ + mov f32Target, f32Val3 /* f32Target = Result */ + b RampEnd_F32 /* Goes to the RampEnd_F32 label */ + RampDown_F32: + ldr f32Val2, [psParam, #4] /* Loads psParam -> f32RampDown */ + subs f32Val3, f32Val1, f32Val2 /* f32Val3 = f32State - f32RampDown */ + eors f32Val2, f32Val2, f32Val1 /* f32Val2 = f32State ^ f32RampDown */ + bpl RampDownLim_F32 /* If f32Val2 >= 0, then goes to RampDownLim_F32 */ + eors f32Val1, f32Val1, f32Val3 /* f32Val1 = f32State ^ (f32State - f32RampDown) */ + bmi RampEnd_F32 /* If f32Val1 >= 0, then goes to RampEnd_F32 */ + RampDownLim_F32: + cmp f32Target, f32Val3 /* Compares Result with f32Target */ + bgt RampEnd_F32 /* If f32Target > Result, then executes next command */ + mov f32Target, f32Val3 /* f32Target = Result */ + RampEnd_F32: + str f32Target, [psParam, #8] }; /* Loads psParam -> f32State */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "ldr %2, [%1, #8] \n\t" /* Loads psParam -> f32State */ + "cmp %0, %2 \n\t" /* Compares f32Target with psParam -> f32State */ + "blt GFLIB_Ramp_F32_Down_F32%= \n\t" /* If f32Target < psParam -> f32State, then ramps down */ + "ldr %3, [%1] \n\t" /* Loads psParam -> f32RampUp */ + "adds %4, %2, %3 \n\t" /* f32Val3 = f32State + f32RampUp */ + "eors %3, %3, %2 \n\t" /* f32Val2 = f32State ^ f32RampUp */ + "bmi GFLIB_Ramp_F32_UpLim_F32%= \n\t" /* If f32Val2 < 0, then goes to RampUpLim_F32 */ + "eors %2, %2, %4 \n\t" /* f32Val1 = f32State ^ (f32State + f32RampUp) */ + "bmi GFLIB_Ramp_F32_End_F32%= \n\t" /* If f32Val1 < 0, then goes to RampEnd_F32 */ + "GFLIB_Ramp_F32_UpLim_F32%=: \n\t" + "cmp %0, %4 \n\t" /* Compares Result with f32Target */ + "blt GFLIB_Ramp_F32_End_F32%= \n\t" /* If f32Target < Result, then executes next command */ + "mov %0, %4 \n\t" /* f32Target = Result */ + "b GFLIB_Ramp_F32_End_F32%= \n\t" /* Goes to the RampEnd label */ + "GFLIB_Ramp_F32_Down_F32%=: \n\t" + "ldr %3, [%1, #4] \n\t" /* Loads psParam -> f32RampDown */ + "subs %4, %2, %3 \n\t" /* f32Val3 = f32State - f32RampDown */ + "eors %3, %3, %2 \n\t" /* f32Val2 = f32State ^ f32RampDown */ + "bpl GFLIB_Ramp_F32_DownLim_F32%= \n\t"/* If f32Val2 >= 0, then goes to RampDownLim_F32 */ + "eors %2, %2, %4 \n\t" /* f32Val1 = f32State ^ (f32State - f32RampDown) */ + "bmi GFLIB_Ramp_F32_End_F32%= \n\t" /* If f32Val1 >= 0, then goes to RampEnd_F32 */ + "GFLIB_Ramp_F32_DownLim_F32%=: \n\t" + "cmp %0, %4 \n\t" /* Compares Result with f32Target */ + "bgt GFLIB_Ramp_F32_End_F32%= \n\t" /* If f32Target > Result, then executes next command */ + "mov %0, %4 \n\t" /* f32Target = Result */ + "GFLIB_Ramp_F32_End_F32%=: \n\t" + "str %0, [%1, #8] \n\t" /* Loads psParam -> f32State */ + : "+l"(f32Target), "+l"(psParam), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "ldr %2, [%1, #8] \n" /* Loads psParam -> f32State */ + "cmp %0, %2 \n" /* Compares f32Target with psParam -> f32State */ + "blt RampDown_F32%= \n" /* If f32Target < psParam -> f32State, then ramps down */ + "ldr %3, [%1] \n" /* Loads psParam -> f32RampUp */ + "adds %4, %2, %3 \n" /* f32Val3 = f32State + f32RampUp */ + "eors %3, %3, %2 \n" /* f32Val2 = f32State ^ f32RampUp */ + "bmi RampUpLim_F32%= \n" /* If f32Val2 < 0, then goes to RampUpLim_F32 */ + "eors %2, %2, %4 \n" /* f32Val1 = f32State ^ (f32State + f32RampUp) */ + "bmi RampEnd_F32%= \n" /* If f32Val1 < 0, then goes to RampEnd_F32 */ + "RampUpLim_F32%=: \n" + "cmp %0, %4 \n" /* Compares Result with f32Target */ + "blt RampEnd_F32%= \n" /* If f32Target < Result, then executes next command */ + "mov %0, %4 \n" /* f32Target = Result */ + "b RampEnd_F32%= \n" /* Goes to the RampEnd label */ + "RampDown_F32%=: \n" + "ldr %3, [%1, #4] \n" /* Loads psParam -> f32RampDown */ + "subs %4, %2, %3 \n" /* f32Val3 = f32State - f32RampDown */ + "eors %3, %3, %2 \n" /* f32Val2 = f32State ^ f32RampDown */ + "bpl RampDownLim_F32%= \n" /* If f32Val2 >= 0, then goes to RampDownLim_F32 */ + "eors %2, %2, %4 \n" /* f32Val1 = f32State ^ (f32State - f32RampDown) */ + "bmi RampEnd_F32%= \n" /* If f32Val1 >= 0, then goes to RampEnd_F32 */ + "RampDownLim_F32%=: \n" + "cmp %0, %4 \n" /* Compares Result with f32Target */ + "bgt RampEnd_F32%= \n" /* If f32Target > Result, then executes next command */ + "mov %0, %4 \n" /* f32Target = Result */ + "RampEnd_F32%=: \n" + "str %0, [%1, #8] \n" /* Loads psParam -> f32State */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Target), "+l"(psParam), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "ldr %2, [%1, #8] \n" /* Loads psParam -> f32State */ + "cmp %0, %2 \n" /* Compares f32Target with psParam -> f32State */ + "blt RampDown_F32 \n" /* If f32Target < psParam -> f32State, then ramps down */ + "ldr %3, [%1] \n" /* Loads psParam -> f32RampUp */ + "adds %4, %2, %3 \n" /* f32Val3 = f32State + f32RampUp */ + "eors %3, %3, %2 \n" /* f32Val2 = f32State ^ f32RampUp */ + "bmi RampUpLim_F32 \n" /* If f32Val2 < 0, then goes to RampUpLim_F32 */ + "eors %2, %2, %4 \n" /* f32Val1 = f32State ^ (f32State + f32RampUp) */ + "bmi RampEnd_F32 \n" /* If f32Val1 < 0, then goes to RampEnd_F32 */ + "RampUpLim_F32: \n" + "cmp %0, %4 \n" /* Compares Result with f32Target */ + "blt RampEnd_F32 \n" /* If f32Target < Result, then executes next command */ + "mov %0, %4 \n" /* f32Target = Result */ + "b RampEnd_F32 \n" /* Goes to the RampEnd label */ + "RampDown_F32: \n" + "ldr %3, [%1, #4] \n" /* Loads psParam -> f32RampDown */ + "subs %4, %2, %3 \n" /* f32Val3 = f32State - f32RampDown */ + "eors %3, %3, %2 \n" /* f32Val2 = f32State ^ f32RampDown */ + "bpl RampDownLim_F32 \n" /* If f32Val2 >= 0, then goes to RampDownLim_F32 */ + "eors %2, %2, %4 \n" /* f32Val1 = f32State ^ (f32State - f32RampDown) */ + "bmi RampEnd_F32 \n" /* If f32Val1 >= 0, then goes to RampEnd_F32 */ + "RampDownLim_F32: \n" + "cmp %0, %4 \n" /* Compares Result with f32Target */ + "bgt RampEnd_F32 \n" /* If f32Target > Result, then executes next command */ + "mov %0, %4 \n" /* f32Target = Result */ + "RampEnd_F32: \n" + "str %0, [%1, #8] \n" /* Loads psParam -> f32State */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Target), "+l"(psParam), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + return(f32Target); +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_RAMP_F32_ASMI_H */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SinCos_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SinCos_F32.h new file mode 100644 index 0000000..7e695e1 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SinCos_F32.h @@ -0,0 +1,86 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Sine, Cosine +* +*******************************************************************************/ +#ifndef _GFLIB_SINCOS_A32_H_ +#define _GFLIB_SINCOS_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Sin_F16_Asm(f16Angle) GFLIB_Sin_F16_FAsm(f16Angle, &gsSinCoef) +#define GFLIB_Cos_F16_Asmi(f16Angle) GFLIB_Cos_F16_FAsmi(f16Angle) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac32_t f32A[5]; /* Array of fractional coefficients */ +} GFLIB_SIN_T_F32; + +/******************************************************************************* +* Global variables +*******************************************************************************/ +extern GFLIB_CONST GFLIB_SIN_T_F32 gsSinCoef; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GFLIB_Sin_F16_FAsm(frac16_t f16Angle, GFLIB_CONST GFLIB_SIN_T_F32 *const psParam); + +/***************************************************************************//*! +* Cosine is calculated using the GFLIB_Sin_F16 function summed with FRAC(0.5) +*******************************************************************************/ +static inline frac16_t GFLIB_Cos_F16_FAsmi(register frac16_t f16Angle) +{ + return(GFLIB_Sin_F16_Asm((f16Angle +(frac16_t)16384))); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_SINCOS_A32_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F16.h new file mode 100644 index 0000000..a1cf730 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F16.h @@ -0,0 +1,101 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Hardware square root +* +*******************************************************************************/ +#ifndef _GFLIB_SQRTHW_F16_H_ +#define _GFLIB_SQRTHW_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_SqrtHw_F16_C(f16Val) GFLIB_SqrtHw_F16_FC(f16Val) + +/***************************************************************************//*! +* @brief This function returns the square root of input value. +* +* @param[in] f16Val The input value. +* +* @return The function returns the square root of the input value. The +* return value is within the [0, 1) 32 bit fraction range. +* If input is <= 0, then the function returns 0. +* +* The computations are made by hardware MMDSSQ +* +* +****************************************************************************/ +static inline frac32_t GFLIB_SqrtHw_F16_FC(frac16_t f16Val) +{ + uint16_t u16InternalCount; + frac32_t f32Out; + frac16_t f16Out; + + if (f16Val <= 0) + { + f16Out = 0; + } + else + { + do + { + u16InternalCount = gu16CntMmdvsq + 1U; + gu16CntMmdvsq = u16InternalCount; + + RTCESL_MMDVSQ_CSR = 0x0U; + RTCESL_MMDVSQ_RCND = (uint32_t)f16Val << 15U; + while (((RTCESL_MMDVSQ_CSR)>>31U) == 1U) + { + }; + + f32Out = (frac32_t)(RTCESL_MMDVSQ_RES); + } + while (u16InternalCount != gu16CntMmdvsq); + f16Out = (frac16_t)(f32Out); + } + return (f16Out); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_SQRTHW_F16_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F16_Asmi.h new file mode 100644 index 0000000..5f31ba2 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F16_Asmi.h @@ -0,0 +1,195 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Hardware square root +* +*******************************************************************************/ +#ifndef _GFLIB_SQRTHW_F16_ASMI_H_ +#define _GFLIB_SQRTHW_F16_ASMI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_SqrtHw_F16_Asmi(f16Val) GFLIB_SqrtHw_F16_FAsmi(f16Val) + +/***************************************************************************//*! +* @brief This function returns the square root of input value. +* +* @param[in] f16Val The input value. +* +* @return The function returns the square root of the input value. The +* return value is within the [0, 1) 32 bit fraction range. +* If input is <= 0, then the function returns 0. +* +* The computations are made by hardware MMDSSQ +* +* +****************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t GFLIB_SqrtHw_F16_FAsmi(register frac16_t f16Val) +{ + register frac32_t f32BasePtr = (frac32_t)0xF0004000U; + register frac16_t f16Result=0; + register frac32_t f32Temp1=0, f32Temp2=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ movs f16Result, #0 /* f16Result = 0 */ + lsls f16Val, f16Val, #16 /* f16Val << 16 */ + bmi SqrtHw_F16_End /* If f16Val < 0, then goes to SqrtHw_F16_End */ + asrs f16Val, f16Val, #1 /* f16Val >> 1 */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + SqrtHw_F16_Recount: + adds f32Temp2, f32Temp1, #1 /* f32Temp2 = gu16CntMmdvsq + 1 */ + strh f32Temp2, [&gu16CntMmdvsq] /* gu16CntMmdvsq = f32Temp2 */ + movs f32Temp1, #0 /* f32TestVal = 0 */ + str f32Temp1, [f32BasePtr, #8] /* MMDVSQ_CSR = 0x00000000 */ + str f16Val, [f32BasePtr, #16] /* RTCESL_MMDVSQ_RCND = f16Val */ + SqrtHw_F16_Wait: + ldr f32Temp1, [f32BasePtr, #8] /* f32Temp1 = MMDVSQ_CSR */ + lsrs f32Temp1, f32Temp1, #31 /* f32Temp1 >> 31*/ + bne SqrtHw_F16_Wait /* If f32Temp1 != 0, then goes to SqrtHw_F16_Wait */ + ldr f16Result, [f32BasePtr, #12] /* f16Result = MMDVSQ_RES */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + cmp f32Temp1, f32Temp2 /* Compares f32Temp1 and f32Temp2 */ + bne SqrtHw_F16_Recount /* If f32Temp1 != f32Temp2, then goes to SqrtHw_F16_Recount */ + SqrtHw_F16_End: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "movs %1, #0 \n\t" /* f16Result = 0 */ + "lsls %0, %0, #16 \n\t" /* f16Val << 16 */ + "bmi GFLIB_SqrtHw_F16_End%= \n\t" /* If f16Val < 0, then goes to GFLIB_SqrtHw_F16_End */ + "asrs %0, %0, #1 \n\t" /* f16Val >> 1 */ + "ldrh %2, [%4] \n\t" /* f32Temp1 = gu16CntMmdvsq */ + "GFLIB_SqrtHw_F16_Recount%=: \n\t" + "adds %3, %2, #1 \n\t" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %3, [%4] \n\t" /* gu16CntMmdvsq = f32Temp2 */ + "movs %2, #0 \n\t" /* f32TestVal = 0 */ + "str %2, [%5, #8] \n\t" /* MMDVSQ_CSR = 0x00000000 */ + "str %0, [%5, #16] \n\t" /* RTCESL_MMDVSQ_RCND = f16Val */ + "GFLIB_SqrtHw_F16_Wait%=: \n\t" + "ldr %2, [%5, #8] \n\t" /* f32Temp1 = MMDVSQ_CSR */ + "lsrs %2, %2, #31 \n\t" /* f32Temp1 >> 31*/ + "bne GFLIB_SqrtHw_F16_Wait%= \n\t" /* If f32Temp1 != 0, then goes to GFLIB_SqrtHw_F16_Wait */ + "ldr %1, [%5, #12] \n\t" /* f16Result = MMDVSQ_RES */ + "ldrh %2, [%4] \n\t" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %2, %3 \n\t" /* Compares f32Temp1 and f32Temp2 */ + "bne GFLIB_SqrtHw_F16_Recount%= \n\t" /* If f32Temp1 != f32Temp2, then goes to GFLIB_SqrtHw_F16_Recount */ + "GFLIB_SqrtHw_F16_End%=: \n\t" + : "+l"(f16Val), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "movs %1, #0 \n\t" /* f16Result = 0 */ + "lsls %0, %0, #16 \n\t" /* f16Val << 16 */ + "bmi GFLIB_SqrtHw_F16_End%= \n\t" /* If f16Val < 0, then goes to GFLIB_SqrtHw_F16_End */ + "asrs %0, %0, #1 \n\t" /* f16Val >> 1 */ + "ldrh %2, [%4] \n\t" /* f32Temp1 = gu16CntMmdvsq */ + "GFLIB_SqrtHw_F16_Recount%=: \n\t" + "adds %3, %2, #1 \n\t" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %3, [%4] \n\t" /* gu16CntMmdvsq = f32Temp2 */ + "movs %2, #0 \n\t" /* f32TestVal = 0 */ + "str %2, [%5, #8] \n\t" /* MMDVSQ_CSR = 0x00000000 */ + "str %0, [%5, #16] \n\t" /* RTCESL_MMDVSQ_RCND = f16Val */ + "GFLIB_SqrtHw_F16_Wait%=: \n\t" + "ldr %2, [%5, #8] \n\t" /* f32Temp1 = MMDVSQ_CSR */ + "lsrs %2, %2, #31 \n\t" /* f32Temp1 >> 31*/ + "bne GFLIB_SqrtHw_F16_Wait%= \n\t" /* If f32Temp1 != 0, then goes to GFLIB_SqrtHw_F16_Wait */ + "ldr %1, [%5, #12] \n\t" /* f16Result = MMDVSQ_RES */ + "ldrh %2, [%4] \n\t" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %2, %3 \n\t" /* Compares f32Temp1 and f32Temp2 */ + "bne GFLIB_SqrtHw_F16_Recount%= \n\t" /* If f32Temp1 != f32Temp2, then goes to GFLIB_SqrtHw_F16_Recount */ + "GFLIB_SqrtHw_F16_End%=: \n\t" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Val), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "movs %1, #0 \n" /* f16Result = 0 */ + "lsls %0, %0, #16 \n" /* f16Val << 16 */ + "bmi SqrtHw_F16_End \n" /* If f16Val < 0, then goes to SqrtHw_F16_End */ + "asrs %0, %0, #1 \n" /* f16Val >> 1 */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "SqrtHw_F16_Recount: \n" + "adds %3, %2, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %3, [%4] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %2, #0 \n" /* f32TestVal = 0 */ + "str %2, [%5, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %0, [%5, #16] \n" /* RTCESL_MMDVSQ_RCND = f16Val */ + "SqrtHw_F16_Wait: \n" + "ldr %2, [%5, #8] \n" /* f32Temp1 = MMDVSQ_CSR */ + "lsrs %2, %2, #31 \n" /* f32Temp1 >> 31*/ + "bne SqrtHw_F16_Wait \n" /* If f32Temp1 != 0, then goes to SqrtHw_F16_Wait */ + "ldr %1, [%5, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %2, %3 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne SqrtHw_F16_Recount \n" /* If f32Temp1 != f32Temp2, then goes to SqrtHw_F16_Recount */ + "SqrtHw_F16_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Val), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #endif + return f16Result; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_SQRTHW_F16_ASMI_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F32.h new file mode 100644 index 0000000..4431823 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F32.h @@ -0,0 +1,102 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Hardware Square root +* +*******************************************************************************/ +#ifndef _GFLIB_SQRTHW_F32_H_ +#define _GFLIB_SQRTHW_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_SqrtHw_F16l_C(f32Val) GFLIB_SqrtHw_F16l_FC(f32Val) + +/***************************************************************************//*! +* @brief This function returns the square root of input value. +* +* @param[in] f32Val The input value. +* +* @return The function returns the square root of the input value. The +* return value is within the [0, 1) 16 bit fraction range. +* If input is <= 0, then the function returns 0. +* +* The computations are made by hardware MMDVSQ +* +* +****************************************************************************/ +static inline frac16_t GFLIB_SqrtHw_F16l_FC(frac32_t f32Val) +{ + uint16_t u16InternalCount; + frac16_t f16Out; + frac32_t f32Out; + + if (f32Val <= 0) + { + f16Out = 0; + } + else + { + do + { + u16InternalCount = gu16CntMmdvsq + 1U; + gu16CntMmdvsq = u16InternalCount; + + RTCESL_MMDVSQ_CSR = 0x0U; + RTCESL_MMDVSQ_RCND = (uint32_t)f32Val >> 1U; + while (((RTCESL_MMDVSQ_CSR)>>31) == 1U) + { + }; + + f32Out = (frac32_t)(RTCESL_MMDVSQ_RES); + } + while (u16InternalCount != gu16CntMmdvsq); + + f16Out = (frac16_t)f32Out; + } + return (f16Out); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_SQRTHW_F32_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F32_Asmi.h new file mode 100644 index 0000000..d62de0b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_SqrtHw_F32_Asmi.h @@ -0,0 +1,191 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Hardware Square root +* +*******************************************************************************/ +#ifndef _GFLIB_SQRTHW_F32_ASMI_H_ +#define _GFLIB_SQRTHW_F32_ASMI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_SqrtHw_F16l_Asmi(f32Val) GFLIB_SqrtHw_F16l_FAsmi(f32Val) + +/***************************************************************************//*! +* @brief This function returns the square root of input value. +* +* @param[in] f32Val The input value. +* +* @return The function returns the square root of the input value. The +* return value is within the [0, 1) 16 bit fraction range. +* If input is <= 0, then the function returns 0. +* +* The computations are made by hardware MMDVSQ +* +* +****************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t GFLIB_SqrtHw_F16l_FAsmi(register frac32_t f32Val) +{ + register frac32_t f32BasePtr = (frac32_t)0xF0004000U; + register frac16_t f16Result=0; + register frac32_t f32Temp1=0, f32Temp2=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ movs f16Result, #0 /* f16Result = 0 */ + asrs f32Val, f32Val, #1 /* f32Val >> 1 */ + bmi SqrtHw_F16l_End /* If f32Val < 0, then goes to SqrtHw_F16l_End */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + SqrtHw_F16l_Recount: + adds f32Temp2, f32Temp1, #1 /* f32Temp2 = gu16CntMmdvsq + 1 */ + strh f32Temp2, [&gu16CntMmdvsq] /* gu16CntMmdvsq = f32Temp2 */ + movs f32Temp1, #0 /* f32TestVal = 0 */ + str f32Temp1, [f32BasePtr, #8] /* MMDVSQ_CSR = 0x00000000 */ + str f32Val, [f32BasePtr, #16] /* RTCESL_MMDVSQ_RCND = f32Val */ + SqrtHw_F16l_Wait: + ldr f32Temp1, [f32BasePtr, #8] /* f32Temp1 = MMDVSQ_CSR */ + lsrs f32Temp1, f32Temp1, #31 /* f32Temp1 >> 31*/ + bne SqrtHw_F16l_Wait /* If f32Temp1 != 0, then goes to SqrtHw_F16l_Wait */ + ldr f16Result, [f32BasePtr, #12] /* f16Result = MMDVSQ_RES */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + cmp f32Temp1, f32Temp2 /* Compares f32Temp1 and f32Temp2 */ + bne SqrtHw_F16l_Recount /* If f32Temp1 != f32Temp2, then goes to SqrtHw_F16l_Recount */ + SqrtHw_F16l_End: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "movs %1, #0 \n\t" /* f16Result = 0 */ + "asrs %0, %0, #1 \n\t" /* f32Val >> 1 */ + "bmi GFLIB_SqrtHw_F16l_End%= \n\t" /* If f32Val < 0, then goes to GFLIB_SqrtHw_F16l_End */ + "ldrh %2, [%4] \n\t" /* f32Temp1 = gu16CntMmdvsq */ + "GFLIB_SqrtHw_F16l_Recount%=: \n\t" + "adds %3, %2, #1 \n\t" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %3, [%4] \n\t" /* gu16CntMmdvsq = f32Temp2 */ + "movs %2, #0 \n\t" /* f32TestVal = 0 */ + "str %2, [%5, #8] \n\t" /* MMDVSQ_CSR = 0x00000000 */ + "str %0, [%5, #16] \n\t" /* RTCESL_MMDVSQ_RCND = f32Val */ + "GFLIB_SqrtHw_F16l_Wait%=: \n\t" + "ldr %2, [%5, #8] \n\t" /* f32Temp1 = MMDVSQ_CSR */ + "lsrs %2, %2, #31 \n\t" /* f32Temp1 >> 31*/ + "bne GFLIB_SqrtHw_F16l_Wait%= \n\t" /* If f32Temp1 != 0, then goes to GFLIB_SqrtHw_F16l_Wait */ + "ldr %1, [%5, #12] \n\t" /* f16Result = MMDVSQ_RES */ + "ldrh %2, [%4] \n\t" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %2, %3 \n\t" /* Compares f32Temp1 and f32Temp2 */ + "bne GFLIB_SqrtHw_F16l_Recount%= \n\t" /* If f32Temp1 != f32Temp2, then goes to GFLIB_SqrtHw_F16l_Recount */ + "GFLIB_SqrtHw_F16l_End%=: \n\t" + : "+l"(f32Val), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "movs %1, #0 \n" /* f16Result = 0 */ + "asrs %0, %0, #1 \n" /* f32Val >> 1 */ + "bmi SqrtHw_F16l_End%= \n" /* If f32Val < 0, then goes to SqrtHw_F16l_End */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "SqrtHw_F16l_Recount%=: \n" + "adds %3, %2, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %3, [%4] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %2, #0 \n" /* f32TestVal = 0 */ + "str %2, [%5, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %0, [%5, #16] \n" /* RTCESL_MMDVSQ_RCND = f32Val */ + "SqrtHw_F16l_Wait%=: \n" + "ldr %2, [%5, #8] \n" /* f32Temp1 = MMDVSQ_CSR */ + "lsrs %2, %2, #31 \n" /* f32Temp1 >> 31*/ + "bne SqrtHw_F16l_Wait%= \n" /* If f32Temp1 != 0, then goes to SqrtHw_F16l_Wait */ + "ldr %1, [%5, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %2, %3 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne SqrtHw_F16l_Recount%= \n" /* If f32Temp1 != f32Temp2, then goes to SqrtHw_F16l_Recount */ + "SqrtHw_F16l_End%=: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "movs %1, #0 \n" /* f16Result = 0 */ + "asrs %0, %0, #1 \n" /* f32Val >> 1 */ + "bmi SqrtHw_F16l_End \n" /* If f32Val < 0, then goes to SqrtHw_F16l_End */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "SqrtHw_F16l_Recount: \n" + "adds %3, %2, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %3, [%4] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %2, #0 \n" /* f32TestVal = 0 */ + "str %2, [%5, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %0, [%5, #16] \n" /* RTCESL_MMDVSQ_RCND = f32Val */ + "SqrtHw_F16l_Wait: \n" + "ldr %2, [%5, #8] \n" /* f32Temp1 = MMDVSQ_CSR */ + "lsrs %2, %2, #31 \n" /* f32Temp1 >> 31*/ + "bne SqrtHw_F16l_Wait \n" /* If f32Temp1 != 0, then goes to SqrtHw_F16l_Wait */ + "ldr %1, [%5, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %2, %3 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne SqrtHw_F16l_Recount \n" /* If f32Temp1 != f32Temp2, then goes to SqrtHw_F16l_Recount */ + "SqrtHw_F16l_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #endif + return f16Result; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_SQRTHW_F32_ASMI_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Sqrt_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Sqrt_F16.h new file mode 100644 index 0000000..b5d65e5 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Sqrt_F16.h @@ -0,0 +1,97 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Square root +* +*******************************************************************************/ + +#ifndef _GFLIB_SQRT_F16_H_ +#define _GFLIB_SQRT_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Sqrt_F16_C(f16Val) GFLIB_Sqrt_F16_FC(f16Val, &gsSqrtTable_F32) + +/****************************************************************************** +* Types +******************************************************************************/ + +/* Polynom table line */ +typedef struct +{ + frac16_t f16Dummy; + frac16_t f16XkOffset; + frac16_t f16PolyCoef[5]; + frac16_t f16NYScl; + frac32_t f32YkOffset; +} GFLIB_SQRT_ROW_T_F32; + +/* Polynom table line pointer */ +typedef struct +{ + GFLIB_SQRT_ROW_T_F32 *psLine; +} GFLIB_SQRT_OFFSET_T_F32; + +/* Polynom table */ +typedef struct +{ + GFLIB_SQRT_OFFSET_T_F32 sLine1; + GFLIB_SQRT_OFFSET_T_F32 sLine2; + GFLIB_SQRT_OFFSET_T_F32 sLine3; + GFLIB_SQRT_ROW_T_F32 sInterval1; + GFLIB_SQRT_ROW_T_F32 sInterval2; + GFLIB_SQRT_ROW_T_F32 sInterval3; +} GFLIB_SQRT_TABLE_T_F32; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GFLIB_Sqrt_F16_FC(frac16_t f16Val, + const GFLIB_SQRT_TABLE_T_F32 *psParam); +extern GFLIB_SQRT_TABLE_T_F32 gsSqrtTable_F32; + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_SQRT_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Sqrt_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Sqrt_F32.h new file mode 100644 index 0000000..6c46eec --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_Sqrt_F32.h @@ -0,0 +1,65 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Square root +* +*******************************************************************************/ + +#ifndef _GFLIB_SQRT_F32_H_ +#define _GFLIB_SQRT_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t GFLIB_Sqrt_F16l_FC(frac32_t f32Val); + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Sqrt_F16l_C(f32Val) GFLIB_Sqrt_F16l_FC(f32Val) + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_SQRT_F32_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_UpperLimit_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_UpperLimit_F16.h new file mode 100644 index 0000000..77b67f5 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_UpperLimit_F16.h @@ -0,0 +1,81 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Upper limit functions with 16-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_UPPERLIMIT_F16_H_ +#define _GFLIB_UPPERLIMIT_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "gflib_types.h" +#include "mlib.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_UpperLimit_F16_Ci(f16Val, f16ULim) \ + GFLIB_UpperLimit_F16_FCi(f16Val, f16ULim) + +/***************************************************************************//*! +* +* @brief Upper limit function +* +* @param in frac16_t f16Val - Argument in <-1;1) in frac16_t +* frac16_t f16ULim - UpperLimit in <-1;1) in frac16_t +* +* @return This function returns - frac16_t value <-1;1) +* +* @remarks This function trims the argument under or equal to upper f16ULim +* limit. +* +****************************************************************************/ +static inline frac16_t GFLIB_UpperLimit_F16_FCi(frac16_t f16Val,frac16_t f16ULim) +{ + if(f16Val > f16ULim) + { + f16Val = f16ULim; + } + return(f16Val); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_UPPERLIMIT_F16_H_ */ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_UpperLimit_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_UpperLimit_F32.h new file mode 100644 index 0000000..efb8cbf --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_UpperLimit_F32.h @@ -0,0 +1,80 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Upper limit functions with 32-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_UPPERLIMIT_F32_H_ +#define _GFLIB_UPPERLIMIT_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gflib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_UpperLimit_F32_Ci(f32Val, f32ULim) \ + GFLIB_UpperLimit_F32_FCi(f32Val, f32ULim) + +/***************************************************************************//*! +* +* @brief Upper limit function +* +* @param in frac32_t f32Val - Argument in <-1;1) in frac32_t +* frac32_t f32ULim - LowerLimit in <-1;1) in frac32_t +* +* @return This function returns - frac32_t value <-1;1) +* +* @remarks This function trims the argument under or equal to upper f32ULim +* limit. +* +****************************************************************************/ +static inline frac32_t GFLIB_UpperLimit_F32_FCi(frac32_t f32Val, frac32_t f32ULim) +{ + if(f32Val > f32ULim) + { + f32Val = f32ULim; + } + return(f32Val); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_UPPERLIMIT_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_VectorLimit1Hw_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_VectorLimit1Hw_F16.h new file mode 100644 index 0000000..f87960b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_VectorLimit1Hw_F16.h @@ -0,0 +1,71 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Vector limit functions with 16-bit and 32-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_VECTORLIMIT1HW_F16_H_ +#define _GFLIB_VECTORLIMIT1HW_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "GFLIB_SqrtHw_F32.h" +#include "GFLIB_VectorLimit1_F16.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_VectorLimit1Hw_F16_C(psVectorIn, f16Lim, psVectorOut) \ + GFLIB_VectorLimit1Hw_F16_FC(psVectorIn, f16Lim, psVectorOut) +/******************************************************************************* +* Types +*******************************************************************************/ + + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern bool_t GFLIB_VectorLimit1Hw_F16_FC(const GFLIB_VECTORLIMIT_T_F16 *psVectorIn, + frac16_t f16Lim, + GFLIB_VECTORLIMIT_T_F16 *psVectorOut); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_VECTORLIMIT1HW_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_VectorLimit1_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_VectorLimit1_F16.h new file mode 100644 index 0000000..32d37dd --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/GFLIB_VectorLimit1_F16.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Vector limit functions with 16-bit and 32-bit fractional output +* +*******************************************************************************/ +#ifndef _GFLIB_VECTORLIMIT1_F16_H_ +#define _GFLIB_VECTORLIMIT1_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "GFLIB_Sqrt_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_VectorLimit1_F16_C(psVectorIn, f16Lim, psVectorOut) \ + GFLIB_VectorLimit1_F16_FC(psVectorIn, f16Lim, psVectorOut) +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac16_t f16A; /*!< First argument */ + frac16_t f16B; /*!< Second argument */ +} GFLIB_VECTORLIMIT_T_F16; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern bool_t GFLIB_VectorLimit1_F16_FC(const GFLIB_VECTORLIMIT_T_F16 *psVectorIn, + frac16_t f16Lim, + GFLIB_VECTORLIMIT_T_F16 *psVectorOut); +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_VECTORLIMIT1_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/gflib.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/gflib.h new file mode 100644 index 0000000..805d83e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/gflib.h @@ -0,0 +1,139 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Main GFLIB header file for devices without FPU. +* +*******************************************************************************/ +#ifndef _GFLIB_H_ +#define _GFLIB_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "GFLIB_Atan_F32.h" +#include "GFLIB_AtanYX_F32.h" +#include "GFLIB_CtrlBetaIPp_A32.h" +#include "GFLIB_CtrlPIp_A32.h" +#include "GFLIB_FlexRamp_A32.h" +#include "GFLIB_DFlexRamp_A32.h" +#include "GFLIB_DRamp_F16.h" +#include "GFLIB_DRamp_F32.h" +#include "GFLIB_Hyst_F16_Asmi.h" +#include "GFLIB_Integrator_A32.h" +#include "GFLIB_Limit_F16.h" +#include "GFLIB_Limit_F32.h" +#include "GFLIB_LowerLimit_F16.h" +#include "GFLIB_LowerLimit_F32.h" +#include "GFLIB_Lut_F32.h" +#include "GFLIB_Lut_F16_Asmi.h" +#include "GFLIB_LutPer_F32.h" +#include "GFLIB_LutPer_F16_Asmi.h" +#include "GFLIB_Ramp_F16.h" +#include "GFLIB_Ramp_F16_Asmi.h" +#include "GFLIB_Ramp_F32.h" +#include "GFLIB_Ramp_F32_Asmi.h" +#include "GFLIB_SinCos_F32.h" +#include "GFLIB_Sqrt_F16.h" +#include "GFLIB_Sqrt_F32.h" +#include "GFLIB_UpperLimit_F16.h" +#include "GFLIB_UpperLimit_F32.h" +#include "GFLIB_VectorLimit1_F16.h" +#include "GFLIB_AtanYXHw_F32.h" +#include "GFLIB_FlexRampHw_A32.h" +#include "GFLIB_DFlexRampHw_A32.h" +#include "GFLIB_SqrtHw_F16.h" +#include "GFLIB_SqrtHw_F16_Asmi.h" +#include "GFLIB_SqrtHw_F32.h" +#include "GFLIB_SqrtHw_F32_Asmi.h" +#include "GFLIB_VectorLimit1Hw_F16.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_Atan_F16(f16Val) GFLIB_Atan_F16_Asm(f16Val) +#define GFLIB_Cos_F16(f16Angle) GFLIB_Cos_F16_Asmi(f16Angle) +#define GFLIB_CtrlBetaIPpAW_F16(f16InReq, f16In, pbStopIntegFlag, psParam) GFLIB_CtrlBetaIPpAW_F16_C(f16InReq, f16In, pbStopIntegFlag, psParam) +#define GFLIB_CtrlBetaIPpAWInit_F16(f16InitVal, psParam) GFLIB_CtrlBetaIPpAWInit_F16_Ci(f16InitVal, psParam) +#define GFLIB_CtrlPIpAWInit_F16(f16InitVal, psParam) GFLIB_CtrlPIpAWInit_F16_Ci(f16InitVal, psParam) +#define GFLIB_CtrlPIpAW_F16(f16InErr, pbStopIntegFlag, psParam) GFLIB_CtrlPIpAW_F16_Asm(f16InErr, pbStopIntegFlag, psParam) +#define GFLIB_DFlexRampInit_F16(f16InitVal, psParam) GFLIB_DFlexRampInit_F16_C(f16InitVal, psParam) +#define GFLIB_DFlexRamp_F16(f16Instant, pbStopFlagMot, pbStopFlagGen, psParam) GFLIB_DFlexRamp_F16_C(f16Instant, pbStopFlagMot, pbStopFlagGen, psParam) +#define GFLIB_FlexRampInit_F16(f16InitVal, psParam) GFLIB_FlexRampInit_F16_C(f16InitVal, psParam) +#define GFLIB_FlexRamp_F16(psParam) GFLIB_FlexRamp_F16_C(psParam) +#define GFLIB_DRampInit_F16(f16InitVal, psParam) GFLIB_DRampInit_F16_Ci(f16InitVal, psParam) +#define GFLIB_DRampInit_F32(f32InitVal, psParam) GFLIB_DRampInit_F32_Ci(f32InitVal, psParam) +#define GFLIB_DRamp_F16(f16Target, f16Instant, pbStopFlag, psParam) GFLIB_DRamp_F16_Asm(f16Target, f16Instant, pbStopFlag, psParam) +#define GFLIB_DRamp_F32(f32Target, f32Instant, pbStopFlag, psParam) GFLIB_DRamp_F32_Asm(f32Target, f32Instant, pbStopFlag, psParam) +#define GFLIB_Hyst_F16(f16Val, psParam) GFLIB_Hyst_F16_Asmi(f16Val, psParam) +#define GFLIB_IntegratorInit_F16(f16InitVal, psParam) GFLIB_IntegratorInit_F16_Ci(f16InitVal, psParam) +#define GFLIB_Integrator_F16(f16InVal, psParam) GFLIB_Integrator_F16_Ci(f16InVal, psParam) +#define GFLIB_Limit_F16(f16Val, f16LLim, f16ULim) GFLIB_Limit_F16_Ci(f16Val, f16LLim, f16ULim) +#define GFLIB_Limit_F32(f32Val, f32LLim, f32ULim) GFLIB_Limit_F32_Ci(f32Val, f32LLim, f32ULim) +#define GFLIB_LowerLimit_F16(f16Val, f16LLim) GFLIB_LowerLimit_F16_Ci(f16Val, f16LLim) +#define GFLIB_LowerLimit_F32(f32Val, f32LLim) GFLIB_LowerLimit_F32_Ci(f32Val, f32LLim) +#define GFLIB_Lut1D_F16(f16X, pf16Table, u16TableSize) GFLIB_Lut1D_F16_Asmi(f16X, pf16Table, u16TableSize) +#define GFLIB_LutPer1D_F16(f16X, pf16Table, u16TableSize) GFLIB_LutPer1D_F16_Asmi( f16X, pf16Table, u16TableSize) +#define GFLIB_Lut1D_F32(f32X, pf32Table, u16TableSize) GFLIB_Lut1D_F32_C(f32X, pf32Table, u16TableSize) +#define GFLIB_LutPer1D_F32(f32X, pf32Table, u16TableSize) GFLIB_LutPer1D_F32_C(f32X, pf32Table, u16TableSize) +#define GFLIB_RampInit_F16(f16InitVal, psParam) GFLIB_RampInit_F16_Ci(f16InitVal, psParam) +#define GFLIB_RampInit_F32(f32InitVal, psParam) GFLIB_RampInit_F32_Ci(f32InitVal, psParam) +#define GFLIB_Ramp_F16(f16Target, psParam) GFLIB_Ramp_F16_Asmi(f16Target, psParam) +#define GFLIB_Ramp_F32(f32Target, psParam) GFLIB_Ramp_F32_Asmi(f32Target, psParam) +#define GFLIB_Sin_F16(f16Angle) GFLIB_Sin_F16_Asm(f16Angle) +#define GFLIB_UpperLimit_F16(f16Val, f16ULim) GFLIB_UpperLimit_F16_Ci(f16Val, f16ULim) +#define GFLIB_UpperLimit_F32(f32Val, f32ULim) GFLIB_UpperLimit_F32_Ci(f32Val, f32ULim) +#if (RTCESL_MMDVSQ) + #define GFLIB_AtanYX_F16(f16Y, f16X, pbErrFlag) GFLIB_AtanYXHw_F16_Asm(f16Y, f16X, pbErrFlag) + #define GFLIB_Sqrt_F16(f16Val) GFLIB_SqrtHw_F16_Asmi(f16Val) + #define GFLIB_Sqrt_F16l(f32Val) GFLIB_SqrtHw_F16l_Asmi(f32Val) + #define GFLIB_VectorLimit1_F16(psVectorIn, f16Lim, psVectorOut) GFLIB_VectorLimit1Hw_F16_C(psVectorIn, f16Lim, psVectorOut) + #define GFLIB_DFlexRampCalcIncr_F16(f16Target, a32Duration, f32IncrSatMot, f32IncrSatGen, psParam) GFLIB_DFlexRampCalcIncrHw_F16_C(f16Target, a32Duration, f32IncrSatMot, f32IncrSatGen, psParam) + #define GFLIB_FlexRampCalcIncr_F16(f16Target, a32Duration, psParam) GFLIB_FlexRampCalcIncrHw_F16_C(f16Target, a32Duration, psParam) +#else + #define GFLIB_AtanYX_F16(f16Y, f16X, pbErrFlag) GFLIB_AtanYX_F16_Asm(f16Y, f16X, pbErrFlag) + #define GFLIB_Sqrt_F16(f16Val) GFLIB_Sqrt_F16_C(f16Val) + #define GFLIB_Sqrt_F16l(f32Val) GFLIB_Sqrt_F16l_C(f32Val) + #define GFLIB_VectorLimit1_F16(psVectorIn, f16Lim, psVectorOut) GFLIB_VectorLimit1_F16_C(psVectorIn, f16Lim, psVectorOut) + #define GFLIB_DFlexRampCalcIncr_F16(f16Target, a32Duration, f32IncrSatMot, f32IncrSatGen, psParam) GFLIB_DFlexRampCalcIncr_F16_C(f16Target, a32Duration, f32IncrSatMot, f32IncrSatGen, psParam) + #define GFLIB_FlexRampCalcIncr_F16(f16Target, a32Duration, psParam) GFLIB_FlexRampCalcIncr_F16_C(f16Target, a32Duration, psParam) +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _GFLIB_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/gflib_types.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/gflib_types.h new file mode 100644 index 0000000..9a0cdaa --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/Include/gflib_types.h @@ -0,0 +1,54 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +*******************************************************************************/ + +#ifndef _GFLIB_TYPES_H_ +#define _GFLIB_TYPES_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GFLIB_CONST + +#if defined(__cplusplus) +} +#endif + +#endif /*_GFLIB_TYPES_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/libGFLIB.a b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/libGFLIB.a new file mode 100644 index 0000000..a16a6a5 Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GFLIB/libGFLIB.a differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Clark_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Clark_F16_Asmi.h new file mode 100644 index 0000000..ce6451a --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Clark_F16_Asmi.h @@ -0,0 +1,375 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Clarke, Inverse Clarke Transformation +* +*******************************************************************************/ +#ifndef _GMCLIB_CLARK_F16_ASMI_H_ +#define _GMCLIB_CLARK_F16_ASMI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/****************************************************************************** +* Includes +******************************************************************************/ +#include "mlib.h" +#include "gmclib_types.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GMCLIB_Clark_F16_Asmi(psIn, psOut) GMCLIB_Clark_F16_FAsmi(psIn, psOut) +#define GMCLIB_ClarkInv_F16_Asmi(psIn, psOut) GMCLIB_ClarkInv_F16_FAsmi(psIn, psOut) + +/***************************************************************************//*! +* +* @brief The function calculates Clarke Transformation which is used +* for transforming values (current, voltage, flux) from the +* three phase stationary coordination system to alpha-beta +* stationary orthogonal coordination system. +* +* @param ptr GMCLIB_3COOR_T_F16 *psIn +* IN - pointer to structure containing data of +* three phase stationary system +* GMCLIB_2COOR_ALBE_T_F16 *psOut +* OUT - pointer to structure containing data of +* two phase stationary orthogonal system +* +* @remarks Modifies the structure pointed by psOut pointer +* according to the following equations: +* alpha = a +* beta = b * 1 / sqrt(3) - c * 1 / sqrt(3) +* +****************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline void GMCLIB_Clark_F16_FAsmi(const GMCLIB_3COOR_T_F16 *psIn, + GMCLIB_2COOR_ALBE_T_F16 *psOut) +{ + register frac32_t f32Val1=0, f32Val2=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ ldrh f32Val1, [psIn] /* f32Val1 = psIn->a */ + strh f32Val1, [psOut] /* psOut->alpha = psIn->a */ + ldrh f32Val1, [psIn, #2] /* f32Val1 = psIn->b */ + sxth f32Val1, f32Val1 /* Sign extend */ + ldrh f32Val2, [psIn, #4] /* f32Val2 = psIn->c */ + sxth f32Val2, f32Val2 /* Sign extend */ + subs f32Val1, f32Val1, f32Val2 /* f32Val1 = b - c */ + movs f32Val2, #0x93 /* f32Val2 = 0x93 */ + lsls f32Val2, f32Val2, #8 /* f32Val2 = 0x9300 */ + adds f32Val2, #0xCD /* f32Val2 = 0x93CD = 2 * FRAC16(1/sqrt(3)) */ + muls f32Val2, f32Val1, f32Val2 /* f32Val2 = (b - c)/sqrt(3) */ + asrs f32Val2, f32Val2, #16 /* f32Val2 >> 16 */ + eors f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 ^ f32Val2 */ + bpl Clark_F16_NotSat /* If f32Val1 < 0, then saturates result */ + asrs f32Val2, f32Val2, #16 /* f32Val2 >> 16 */ + movs f32Val1, #0x80 /* f32Val1 = 0x80 */ + lsls f32Val1, f32Val1, #8 /* f32Val1 = 0x8000 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val1 + f32Val2 */ + Clark_F16_NotSat: + strh f32Val2, [psOut, #2] }; /* psOut->beta = f32Val2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + + "ldrh %0, [%2] \n\t" /* f32Val1 = psIn->a */ + "strh %0, [%3] \n\t" /* psOut->alpha = psIn->a */ + "ldrh %0, [%2, #2] \n\t" /* f32Val1 = psIn->b */ + "sxth %0, %0 \n\t" /* Sign extend */ + "ldrh %1, [%2, #4] \n\t" /* f32Val2 = psIn->c */ + "sxth %1, %1 \n\t" /* Sign extend */ + "subs %0, %0, %1 \n\t" /* f32Val1 = b - c */ + "movs %1, #0x93 \n\t" /* f32Val2 = 0x93 */ + "lsls %1, %1, #8 \n\t" /* f32Val2 = 0x9300 */ + "adds %1, #0xCD \n\t" /* f32Val2 = 0x93CD = 2 * FRAC16(1/sqrt(3)) */ + "muls %1, %0, %1 \n\t" /* f32Val2 = (b - c)/sqrt(3) */ + "asrs %1, %1, #16 \n\t" /* f32Val2 >> 16 */ + "eors %0, %0, %1 \n\t" /* f32Val1 = f32Val1 ^ f32Val2 */ + "bpl GMCLIB_Clark_F16_NotSat%= \n\t" /* If f32Val1 < 0, then saturates result */ + "asrs %1, %1, #16 \n\t" /* f32Val2 >> 16 */ + "movs %0, #0x80 \n\t" /* f32Val1 = 0x80 */ + "lsls %0, %0, #8 \n\t" /* f32Val1 = 0x8000 */ + "adds %1, %1, %0 \n\t" /* f32Val2 = f32Val1 + f32Val2 */ + "GMCLIB_Clark_F16_NotSat%=: \n\t" + "strh %1, [%3, #2] \n\t" /* psOut->beta = f32Val2 */ + : "+l"(f32Val1), "+l"(f32Val2): "l"(psIn), "l"(psOut)); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "ldrh %0, [%2] \n" /* f32Val1 = psIn->a */ + "strh %0, [%3] \n" /* psOut->alpha = psIn->a */ + "ldrh %0, [%2, #2] \n" /* f32Val1 = psIn->b */ + "sxth %0, %0 \n" /* Sign extend */ + "ldrh %1, [%2, #4] \n" /* f32Val2 = psIn->c */ + "sxth %1, %1 \n" /* Sign extend */ + "subs %0, %0, %1 \n" /* f32Val1 = b - c */ + "movs %1, #0x93 \n" /* f32Val2 = 0x93 */ + "lsls %1, %1, #8 \n" /* f32Val2 = 0x9300 */ + "adds %1, #0xCD \n" /* f32Val2 = 0x93CD = 2 * FRAC16(1/sqrt(3)) */ + "muls %1, %0, %1 \n" /* f32Val2 = (b - c)/sqrt(3) */ + "asrs %1, %1, #16 \n" /* f32Val2 >> 16 */ + "eors %0, %0, %1 \n" /* f32Val1 = f32Val1 ^ f32Val2 */ + "bpl Clark_F16_NotSat%= \n" /* If f32Val1 < 0, then saturates result */ + "asrs %1, %1, #16 \n" /* f32Val2 >> 16 */ + "movs %0, #0x80 \n" /* f32Val1 = 0x80 */ + "lsls %0, %0, #8 \n" /* f32Val1 = 0x8000 */ + "adds %1, %1, %0 \n" /* f32Val2 = f32Val1 + f32Val2 */ + "Clark_F16_NotSat%=: \n" + "strh %1, [%3, #2] \n" /* psOut->beta = f32Val2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val1), "+l"(f32Val2): "l"(psIn), "l"(psOut)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "ldrh %0, [%2] \n" /* f32Val1 = psIn->a */ + "strh %0, [%3] \n" /* psOut->alpha = psIn->a */ + "ldrh %0, [%2, #2] \n" /* f32Val1 = psIn->b */ + "sxth %0, %0 \n" /* Sign extend */ + "ldrh %1, [%2, #4] \n" /* f32Val2 = psIn->c */ + "sxth %1, %1 \n" /* Sign extend */ + "subs %0, %0, %1 \n" /* f32Val1 = b - c */ + "movs %1, #0x93 \n" /* f32Val2 = 0x93 */ + "lsls %1, %1, #8 \n" /* f32Val2 = 0x9300 */ + "adds %1, #0xCD \n" /* f32Val2 = 0x93CD = 2 * FRAC16(1/sqrt(3)) */ + "muls %1, %0, %1 \n" /* f32Val2 = (b - c)/sqrt(3) */ + "asrs %1, %1, #16 \n" /* f32Val2 >> 16 */ + "eors %0, %0, %1 \n" /* f32Val1 = f32Val1 ^ f32Val2 */ + "bpl Clark_F16_NotSat \n" /* If f32Val1 < 0, then saturates result */ + "asrs %1, %1, #16 \n" /* f32Val2 >> 16 */ + "movs %0, #0x80 \n" /* f32Val1 = 0x80 */ + "lsls %0, %0, #8 \n" /* f32Val1 = 0x8000 */ + "adds %1, %1, %0 \n" /* f32Val2 = f32Val1 + f32Val2 */ + "Clark_F16_NotSat: \n" + "strh %1, [%3, #2] \n" /* psOut->beta = f32Val2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val1), "+l"(f32Val2): "l"(psIn), "l"(psOut)); + #endif + + return; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/**************************************************************************** +* +* @brief The function calculates Inverse Clarke Transformation which is used +* for transforming values (current, voltage, flux) from alpha-beta +* stationary orthogonal coordination system to three phase +* stationary coordination system +* +* @param ptr GMCLIB_2COOR_ALBE_T_F16 *psIn +* IN - pointer to structure containing data of two phase stationary orthogonal system +* GMCLIB_3COOR_T_F16 *psOut +* OUT - pointer to structure containing data of three phase stationary system +* +* @remarks Modifies the structure pointed by p_abc pointer +* according to the following equations: +* a = alpha +* b = -0.5 * alpha + sgrt(3) / 2 * beta +* c = -0.5 * alpha - sgrt(3) / 2 * beta +* +****************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline void GMCLIB_ClarkInv_F16_FAsmi(const GMCLIB_2COOR_ALBE_T_F16 *psIn, + GMCLIB_3COOR_T_F16 *psOut) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ ldrh f32Val2, [psIn] /* f32Val1 = psIn->alpha */ + strh f32Val2, [psOut] /* psOut->a = psIn->alpha */ + ldrh f32Val1, [psIn, #2] /* f32Val2 = psIn->beta */ + sxth f32Val2, f32Val2 /* Sign extend */ + sxth f32Val1, f32Val1 /* Sign extend */ + + rsbs f32Val2, f32Val2, #0 /* f32Val2 = - alpha */ + asrs f32Val2, f32Val2, #1 /* f32Val2 = - alpha / 2 */ + + movs psIn, #0xDD /* psIn = 0xDD */ + lsls psIn, psIn, #8 /* psIn = 0xDD00 */ + adds psIn, #0xB4 /* psIn = 0xDDB4 = 2 * FRAC16(sqrt(3)/2) */ + muls f32Val1, f32Val1, psIn /* f32Val1 = beta * sqrt(3)/2 */ + asrs f32Val1, f32Val1, #16 /* f32Val1 >> 16 */ + + subs f32Val3, f32Val2, f32Val1 /* c = - alpha / 2 - beta * sqrt(3)/2*/ + adds psIn, f32Val2, f32Val1 /* b = - alpha / 2 + beta * sqrt(3)/2*/ + + movs f32Val1, #0x80 /* f32Val1 = 0x80 */ + lsls f32Val1, f32Val1, #8 /* f32Val1 = 0x8000 */ + + adds f32Val2, f32Val3, f32Val1 /* f32Val2 = c + 0x8000 */ + asrs f32Val2, f32Val2, #16 /* f32Val2 >> 16 */ + beq ClarkInv_F16_TestB /* If f32Val2 != 0, then saturates c */ + asrs f32Val3, f32Val3, #31 /* f32Val3 = f32Val3 >> 31 */ + adds f32Val3, f32Val3, #1 /* f32Val3 = f32Val3 + 1 */ + subs f32Val3, f32Val1, f32Val3 /* f32Val3 = 0x8000 - f32Val3 */ + b ClarkInv_F16_SatEnd /* If c is saturated, then b does not need saturation */ + ClarkInv_F16_TestB: + adds f32Val2, psIn, f32Val1 /* f32Val2 = b + 0x8000 */ + asrs f32Val2, f32Val2, #16 /* f32Val2 >> 16 */ + beq ClarkInv_F16_SatEnd /* If f32Val2 != 0, then saturates b */ + asrs psIn, psIn, #31 /* psIn = psIn >> 31 */ + adds psIn, psIn, #1 /* psIn = psIn + 1 */ + subs psIn, f32Val1, psIn /* psIn = 0x8000 - psIn */ + ClarkInv_F16_SatEnd: + strh psIn, [psOut, #2] /* Stores psOut->b */ + strh f32Val3, [psOut, #4] }; /* Stores psOut->c */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "ldrh %1, [%3] \n\t" /* f32Val1 = psIn->alpha */ + "strh %1, [%4] \n\t" /* psOut->a = psIn->alpha */ + "ldrh %0, [%3, #2] \n\t" /* f32Val2 = psIn->beta */ + "sxth %1, %1 \n\t" /* Sign extend */ + "sxth %0, %0 \n\t" /* Sign extend */ + + "rsbs %1, %1, #0 \n\t" /* f32Val2 = - alpha */ + "asrs %1, %1, #1 \n\t" /* f32Val2 = - alpha / 2 */ + + "movs %3, #0xDD \n\t" /* psIn = 0xDD */ + "lsls %3, %3, #8 \n\t" /* psIn = 0xDD00 */ + "adds %3, #0xB4 \n\t" /* psIn = 0xDDB4 = 2 * FRAC16(sqrt(3)/2) */ + "muls %0, %0, %3 \n\t" /* f32Val1 = beta * sqrt(3)/2 */ + "asrs %0, %0, #16 \n\t" /* f32Val1 >> 16 */ + + "subs %2, %1, %0 \n\t" /* c = - alpha / 2 - beta * sqrt(3)/2*/ + "adds %3, %1, %0 \n\t" /* b = - alpha / 2 + beta * sqrt(3)/2*/ + + "movs %0, #0x80 \n\t" /* f32Val1 = 0x80 */ + "lsls %0, %0, #8 \n\t" /* f32Val1 = 0x8000 */ + + "adds %1, %2, %0 \n\t" /* f32Val2 = c + 0x8000 */ + "asrs %1, %1, #16 \n\t" /* f32Val2 >> 16 */ + "beq GMCLIB_Clark_F16_SatEnd%= \n\t" /* If f32Val2 != 0, then saturates c */ + "asrs %2, %2, #31 \n\t" /* f32Val3 = f32Val3 >> 31 */ + "adds %2, %2, #1 \n\t" /* f32Val3 = f32Val3 + 1 */ + "subs %2, %0, %2 \n\t" /* f32Val3 = 0x8000 - f32Val3 */ + "b GMCLIB_Clark_F16_SatEnd%= \n\t" /* If c is saturated, then b does not need saturation */ + + "adds %1, %3, %0 \n\t" /* f32Val2 = b + 0x8000 */ + "asrs %1, %1, #16 \n\t" /* f32Val2 >> 16 */ + "beq GMCLIB_Clark_F16_SatEnd%= \n\t" /* If f32Val2 != 0, then saturates b */ + "asrs %3, %3, #31 \n\t" /* psIn = psIn >> 31 */ + "adds %3, %3, #1 \n\t" /* psIn = psIn + 1 */ + "subs %3, %0, %3 \n\t" /* psIn = 0x8000 - psIn */ + + "GMCLIB_Clark_F16_SatEnd%=: \n\t" + "strh %3, [%4, #2] \n\t" /* Stores psOut->b */ + "strh %2, [%4, #4] \n\t" /* Stores psOut->c */ + : "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3), "+l"(psIn): "l"(psOut)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "ldrh %1, [%3] \n" /* f32Val1 = psIn->alpha */ + "strh %1, [%4] \n" /* psOut->a = psIn->alpha */ + "ldrh %0, [%3, #2] \n" /* f32Val2 = psIn->beta */ + "sxth %1, %1 \n" /* Sign extend */ + "sxth %0, %0 \n" /* Sign extend */ + + "rsbs %1, %1, #0 \n" /* f32Val2 = - alpha */ + "asrs %1, %1, #1 \n" /* f32Val2 = - alpha / 2 */ + + "movs %3, #0xDD \n" /* psIn = 0xDD */ + "lsls %3, %3, #8 \n" /* psIn = 0xDD00 */ + "adds %3, #0xB4 \n" /* psIn = 0xDDB4 = 2 * FRAC16(sqrt(3)/2) */ + "muls %0, %0, %3 \n" /* f32Val1 = beta * sqrt(3)/2 */ + "asrs %0, %0, #16 \n" /* f32Val1 >> 16 */ + + "subs %2, %1, %0 \n" /* c = - alpha / 2 - beta * sqrt(3)/2*/ + "adds %3, %1, %0 \n" /* b = - alpha / 2 + beta * sqrt(3)/2*/ + + "movs %0, #0x80 \n" /* f32Val1 = 0x80 */ + "lsls %0, %0, #8 \n" /* f32Val1 = 0x8000 */ + + "adds %1, %2, %0 \n" /* f32Val2 = c + 0x8000 */ + "asrs %1, %1, #16 \n" /* f32Val2 >> 16 */ + "beq .+10 \n" /* If f32Val2 != 0, then saturates c */ + "asrs %2, %2, #31 \n" /* f32Val3 = f32Val3 >> 31 */ + "adds %2, %2, #1 \n" /* f32Val3 = f32Val3 + 1 */ + "subs %2, %0, %2 \n" /* f32Val3 = 0x8000 - f32Val3 */ + "b ClarkInv_F16_SatEnd \n" /* If c is saturated, then b does not need saturation */ + + "adds %1, %3, %0 \n" /* f32Val2 = b + 0x8000 */ + "asrs %1, %1, #16 \n" /* f32Val2 >> 16 */ + "beq ClarkInv_F16_SatEnd \n" /* If f32Val2 != 0, then saturates b */ + "asrs %3, %3, #31 \n" /* psIn = psIn >> 31 */ + "adds %3, %3, #1 \n" /* psIn = psIn + 1 */ + "subs %3, %0, %3 \n" /* psIn = 0x8000 - psIn */ + + "ClarkInv_F16_SatEnd: \n" + "strh %3, [%4, #2] \n" /* Stores psOut->b */ + "strh %2, [%4, #4] \n" /* Stores psOut->c */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3), "+l"(psIn): "l"(psOut)); + #endif + + return; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + + +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_CLARK_F16_ASMI_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_DTCompLut1D_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_DTCompLut1D_F16.h new file mode 100644 index 0000000..794cc94 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_DTCompLut1D_F16.h @@ -0,0 +1,79 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Dead Time Compensation Custom Calculation +* +*******************************************************************************/ + +#ifndef _GMCLIB_DTCOMPLUT1D_F16_H_ +#define _GMCLIB_DTCOMPLUT1D_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/**************************************************************************** +* Includes +****************************************************************************/ +#include "mlib.h" +#include "gflib.h" +#include "gmclib_types.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GMCLIB_DTCompLut1D_F16_C(psIABC, psUAlBe, f16U_DCB, psParam, psUAlBeDtComp) \ + GMCLIB_DTCompLut1D_F16_FC(psIABC, psUAlBe, f16U_DCB, psParam, psUAlBeDtComp) + +/****************************************************************************** +* Types +******************************************************************************/ +typedef struct +{ + const frac16_t *pf16Table; + uint16_t u16TableSize; +} GMCLIB_DTCOMPLUT1D_T_F16; + +/**************************************************************************** +* Exported function prototypes +****************************************************************************/ +extern void GMCLIB_DTCompLut1D_F16_FC(const GMCLIB_3COOR_T_F16 *psIABC, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + frac16_t f16UDCBus, + const GMCLIB_DTCOMPLUT1D_T_F16 *psParam, + GMCLIB_2COOR_ALBE_T_F16 *psUAlBeDTComp); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_DTCOMPLUT1D_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Decoupling_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Decoupling_A32.h new file mode 100644 index 0000000..9a33f72 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Decoupling_A32.h @@ -0,0 +1,78 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Decoupling calculation +* +*******************************************************************************/ + +#ifndef _GMCLIB_DECOUPLING_A32_H_ +#define _GMCLIB_DECOUPLING_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/**************************************************************************** +* Includes +****************************************************************************/ +#include "mlib.h" +#include "gmclib_types.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GMCLIB_DecouplingPMSM_F16_Asm(psUDQ, psIDQ, f16SpeedEl, psParam, psUDQDec) \ + GMCLIB_DecouplingPMSM_F16_FAsm(psUDQ, psIDQ, f16SpeedEl, psParam, psUDQDec) + +/****************************************************************************** +* Types +******************************************************************************/ +typedef struct +{ + acc32_t a32KdGain; + acc32_t a32KqGain; +}GMCLIB_DECOUPLINGPMSM_T_A32; + +/**************************************************************************** +* Exported function prototypes +****************************************************************************/ +extern void GMCLIB_DecouplingPMSM_F16_FAsm(const GMCLIB_2COOR_DQ_T_F16 *psUDQ, + const GMCLIB_2COOR_DQ_T_F16 *psIDQ, + frac16_t f16SpeedEl, + const GMCLIB_DECOUPLINGPMSM_T_A32 *psParam, + GMCLIB_2COOR_DQ_T_F16 *psUDQDec); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_DECOUPLING_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRipHw_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRipHw_A32.h new file mode 100644 index 0000000..64a3520 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRipHw_A32.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Elimination of the DC-Bus voltage ripple with index +* +*******************************************************************************/ +#ifndef _GMCLIB_ELIMDCBUSRIPHW_A32_H_ +#define _GMCLIB_ELIMDCBUSRIPHW_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gmclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GMCLIB_ElimDcBusRipHw_F16sas_C(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRipHw_F16sas_FC(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) +#define GMCLIB_ElimDcBusRipHw_F16sas_Asm(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRipHw_F16sas_FAsm(f16UDCBus, a32IdxMod, psUAlBe, &gu16CntMmdvsq, psUAlBeComp) +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern void GMCLIB_ElimDcBusRipHw_F16sas_FC(frac16_t f16UDCBus, + acc32_t a32IdxMod, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + GMCLIB_2COOR_ALBE_T_F16 *psUAlBeComp); +extern void GMCLIB_ElimDcBusRipHw_F16sas_FAsm(frac16_t f16UDCBus, + acc32_t a32IdxMod, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + const volatile uint16_t *pVal, + GMCLIB_2COOR_ALBE_T_F16 *psUAlBeComp); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_ELIMDCBUSRIPHW_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRipHw_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRipHw_F16.h new file mode 100644 index 0000000..f187128 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRipHw_F16.h @@ -0,0 +1,71 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Elimination of the DC-Bus voltage ripple for FOC +* +*******************************************************************************/ +#ifndef _GMCLIB_ELIMDCBUSRIPHW_F16_H_ +#define _GMCLIB_ELIMDCBUSRIPHW_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gmclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GMCLIB_ElimDcBusRipFOCHw_F16_C(f16UDCBus, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRipFOCHw_F16_FC(f16UDCBus, psUAlBe, psUAlBeComp) +#define GMCLIB_ElimDcBusRipFOCHw_F16_Asm(f16UDCBus, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRipFOCHw_F16_FAsm(f16UDCBus, psUAlBe, psUAlBeComp, &gu16CntMmdvsq) +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern void GMCLIB_ElimDcBusRipFOCHw_F16_FC(frac16_t f16UDCBus, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + GMCLIB_2COOR_ALBE_T_F16 *psUAlBeComp); +extern void GMCLIB_ElimDcBusRipFOCHw_F16_FAsm(frac16_t f16UDCBus, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + GMCLIB_2COOR_ALBE_T_F16 *psUAlBeComp, + const volatile uint16_t *pVal); + +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_ELIMDCBUSRIPHW_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRip_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRip_A32.h new file mode 100644 index 0000000..5114d5e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRip_A32.h @@ -0,0 +1,71 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Elimination of the DC-Bus voltage ripple with index +* +*******************************************************************************/ +#ifndef _GMCLIB_ELIMDCBUSRIP_A32_H_ +#define _GMCLIB_ELIMDCBUSRIP_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gmclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GMCLIB_ElimDcBusRip_F16sas_C(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRip_F16sas_FC(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) +#define GMCLIB_ElimDcBusRip_F16sas_Asm(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRip_F16sas_FAsm(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern void GMCLIB_ElimDcBusRip_F16sas_FC(frac16_t f16UDCBus, + acc32_t a32IdxMod, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + GMCLIB_2COOR_ALBE_T_F16 *psUAlBeComp); +extern void GMCLIB_ElimDcBusRip_F16sas_FAsm(frac16_t f16UDCBus, + acc32_t a32IdxMod, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + GMCLIB_2COOR_ALBE_T_F16 *psUAlBeComp); +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_ELIMDCBUSRIP_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRip_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRip_F16.h new file mode 100644 index 0000000..f5715c8 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_ElimDcBusRip_F16.h @@ -0,0 +1,69 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Elimination of the DC-Bus voltage ripple for FOC +* +*******************************************************************************/ +#ifndef _GMCLIB_ELIMDCBUSRIP_F16_H_ +#define _GMCLIB_ELIMDCBUSRIP_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gmclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GMCLIB_ElimDcBusRipFOC_F16_C(f16UDCBus, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRipFOC_F16_FC(f16UDCBus, psUAlBe, psUAlBeComp) +#define GMCLIB_ElimDcBusRipFOC_F16_Asm(f16UDCBus, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRipFOC_F16_FAsm(f16UDCBus, psUAlBe, psUAlBeComp) +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern void GMCLIB_ElimDcBusRipFOC_F16_FC(frac16_t f16UDCBus, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + GMCLIB_2COOR_ALBE_T_F16 *psUAlBeComp); +extern void GMCLIB_ElimDcBusRipFOC_F16_FAsm(frac16_t f16UDCBus, + const GMCLIB_2COOR_ALBE_T_F16 *psUAlBe, + GMCLIB_2COOR_ALBE_T_F16 *psUAlBeComp); +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_ELIMDCBUSRIP_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Park_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Park_F16_Asmi.h new file mode 100644 index 0000000..6c505d5 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Park_F16_Asmi.h @@ -0,0 +1,390 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Park, Inverse Park Transformation +* +*******************************************************************************/ +#ifndef _GMCLIB_PARK_F16_ASMI_H_ +#define _GMCLIB_PARK_F16_ASMI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gmclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GMCLIB_Park_F16_Asmi(psIn, psAnglePos, psOut) GMCLIB_Park_F16_FAsmi(psIn, psAnglePos, psOut) +#define GMCLIB_ParkInv_F16_Asmi(psIn, psAnglePos, psOut) GMCLIB_ParkInv_F16_FAsmi(psIn, psAnglePos, psOut) + + /***************************************************************************//*! +* +* @brief The function calculates Park Transformation which is used for +* transforming values (current, voltage, flux) from +* alpha-beta stationary orthogonal coordination system +* to d-q rotating orthogonal coordination system +* +* @param ptr GMCLIB_2COOR_ALBE_T_F16 *psIn +* IN - pointer to structure containing data of two phase +* stationary orthogonal system +* GMCLIB_2COORD_SINCOS_T_F16 *psAnglePos +* IN - pointer to structure where the values +* of sine and cosine are stored +* GMCLIB_2_COOR_DQ_T_F16 *psOut +* OUT - pointer to structure containing data of +* DQ coordinate two-phase stationary orthogonal system +* +* @remarks Modifies the structure pointed by pDQ pointer +* according to the following equations +* d = alpha * cos(theta) + beta * sin(theta) +* q = beta * cos(theta) - alpha * sin(theta) +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline void GMCLIB_Park_F16_FAsmi(const GMCLIB_2COOR_ALBE_T_F16 *psIn, + const GMCLIB_2COOR_SINCOS_T_F16 *psAnglePos, + GMCLIB_2COOR_DQ_T_F16 *psOut) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ /* Loads input values */ + ldrh f32Val1, [psIn, #2] /* Loads beta */ + ldrh f32Val2, [psIn] /* Loads alpha */ + ldrh f32Val3, [psAnglePos, #2] /* Loads cos(theta) */ + ldrh psIn, [psAnglePos] /* Loads sin(theta) */ + sxth f32Val1, f32Val1 /* Sign extend */ + sxth f32Val2, f32Val2 /* Sign extend */ + sxth f32Val3, f32Val3 /* Sign extend */ + sxth psIn, psIn /* Sign extend */ + /* Counts d and q coordinates */ + movs psAnglePos, f32Val2 /* alpha */ + muls psAnglePos, f32Val3, psAnglePos /* alpha * cos(theta) */ + muls f32Val2, f32Val2, psIn /* alpha * sin(theta) */ + muls psIn, psIn, f32Val1 /* beta * sin(theta) */ + muls f32Val1, f32Val1, f32Val3 /* beta * cos(theta) */ + subs f32Val1, f32Val1, f32Val2 /* q = beta * cos(theta) - alpha * sin(theta) */ + adds psIn, psIn, psAnglePos /* d = beta * sin(theta) + alpha * cos(theta) */ + asrs f32Val1, f32Val1, #15 /* q << 15 */ + asrs psIn, psIn, #15 /* d << 15 */ + /* Saturation */ + movs f32Val3, #0x80 /* f32Val3 = 0x80 */ + lsls f32Val3, f32Val3, #8 /* f32Val3 = 0x8000 */ + sxth f32Val2, f32Val1 /* Sign extend */ + eors f32Val1, f32Val2, f32Val1 /* f32Val2 ^ f32Val1 */ + bpl Park_F16_QNotSat /* If f32Val2 < 0, then saturates result */ + asrs f32Val2, f32Val2, #16 /* f32Val2 >> 16 */ + adds f32Val2, f32Val3, f32Val2 /* q = 0x8000 + f32Val2 */ + Park_F16_QNotSat: + sxth f32Val1, psIn /* Sign extend */ + eors psIn, f32Val1, psIn /* f32Val2 ^ psIn */ + bpl Park_F16_DNotSat /* If f32Val2 < 0, then saturates result */ + asrs f32Val1, f32Val1, #16 /* f32Val1 >> 16*/ + adds f32Val1, f32Val3, f32Val1 /* d = 0x8000 + f32Val1*/ + Park_F16_DNotSat: + /* Stores d and q values */ + strh f32Val1, [psOut] /* Stores psOut->f16D */ + strh f32Val2, [psOut, #2] }; /* Stores psOut->f16Q */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + /* Loads input values */ + "ldrh %0, [%3, #2] \n\t" /* Loads beta */ + "ldrh %1, [%3] \n\t" /* Loads alpha */ + "ldrh %2, [%4, #2] \n\t" /* Loads cos(theta) */ + "ldrh %3, [%4] \n\t" /* Loads sin(theta) */ + "sxth %0, %0 \n\t" /* Sign extend */ + "sxth %1, %1 \n\t" /* Sign extend */ + "sxth %2, %2 \n\t" /* Sign extend */ + "sxth %3, %3 \n\t" /* Sign extend */ + /* Counts d and q coordinates */ + "movs %4, %1 \n\t" /* alpha */ + "muls %4, %2, %4 \n\t" /* alpha * cos(theta) */ + "muls %1, %1, %3 \n\t" /* alpha * sin(theta) */ + "muls %3, %3, %0 \n\t" /* beta * sin(theta) */ + "muls %0, %0, %2 \n\t" /* beta * cos(theta) */ + "subs %0, %0, %1 \n\t" /* q = beta * cos(theta) - alpha * sin(theta) */ + "adds %3, %3, %4 \n\t" /* d = beta * sin(theta) + alpha * cos(theta) */ + "asrs %0, %0, #15 \n\t" /* q << 15 */ + "asrs %3, %3, #15 \n\t" /* d << 15 */ + /* Saturation */ + "movs %2, #0x80 \n\t" /* f32Val3 = 0x80 */ + "lsls %2, %2, #8 \n\t" /* f32Val3 = 0x8000 */ + "sxth %1, %0 \n\t" /* Sign extend */ + "eors %0, %1, %0 \n\t" /* f32Val2 ^ f32Val1 */ + "bpl GMCLIB_Park_F16_QNotSat%= \n\t" /* If f32Val2 < 0, then saturates result */ + "asrs %1, %1, #16 \n\t" /* f32Val2 >> 16 */ + "adds %1, %2, %1 \n\t" /* q = 0x8000 + f32Val2 */ + "GMCLIB_Park_F16_QNotSat%=: \n\t" + "sxth %0, %3 \n\t" /* Sign extend */ + "eors %3, %0, %3 \n\t" /* f32Val2 ^ psIn */ + "bpl GMCLIB_Park_F16_DNotSat%= \n\t" /* If f32Val2 < 0, then saturates result */ + "asrs %0, %0, #16 \n\t" /* f32Val1 >> 16*/ + "adds %0, %2, %0 \n\t" /* d = 0x8000 + f32Val1*/ + "GMCLIB_Park_F16_DNotSat%=: \n\t" + /* Stores d and q values */ + "strh %0, [%5] \n\t" /* Stores psOut->f16D */ + "strh %1, [%5, #2] \n\t" /* Stores psOut->f16Q */ + : "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3), "+l"(psIn), "+l"(psAnglePos): "l"(psOut)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + /* Loads input values */ + "ldrh %0, [%3, #2] \n" /* Loads beta */ + "ldrh %1, [%3] \n" /* Loads alpha */ + "ldrh %2, [%4, #2] \n" /* Loads cos(theta) */ + "ldrh %3, [%4] \n" /* Loads sin(theta) */ + "sxth %0, %0 \n" /* Sign extend */ + "sxth %1, %1 \n" /* Sign extend */ + "sxth %2, %2 \n" /* Sign extend */ + "sxth %3, %3 \n" /* Sign extend */ + /* Counts d and q coordinates */ + "movs %4, %1 \n" /* alpha */ + "muls %4, %2, %4 \n" /* alpha * cos(theta) */ + "muls %1, %1, %3 \n" /* alpha * sin(theta) */ + "muls %3, %3, %0 \n" /* beta * sin(theta) */ + "muls %0, %0, %2 \n" /* beta * cos(theta) */ + "subs %0, %0, %1 \n" /* q = beta * cos(theta) - alpha * sin(theta) */ + "adds %3, %3, %4 \n" /* d = beta * sin(theta) + alpha * cos(theta) */ + "asrs %0, %0, #15 \n" /* q << 15 */ + "asrs %3, %3, #15 \n" /* d << 15 */ + /* Saturation */ + "movs %2, #0x80 \n" /* f32Val3 = 0x80 */ + "lsls %2, %2, #8 \n" /* f32Val3 = 0x8000 */ + "sxth %1, %0 \n" /* Sign extend */ + "eors %0, %1, %0 \n" /* f32Val2 ^ f32Val1 */ + "bpl .+6 \n" /* If f32Val2 < 0, then saturates result */ + "asrs %1, %1, #16 \n" /* f32Val2 >> 16 */ + "adds %1, %2, %1 \n" /* q = 0x8000 + f32Val2 */ + "sxth %0, %3 \n" /* Sign extend */ + "eors %3, %0, %3 \n" /* f32Val2 ^ psIn */ + "bpl .+6 \n" /* If f32Val2 < 0, then saturates result */ + "asrs %0, %0, #16 \n" /* f32Val1 >> 16*/ + "adds %0, %2, %0 \n" /* d = 0x8000 + f32Val1*/ + /* Stores d and q values */ + "strh %0, [%5] \n" /* Stores psOut->f16D */ + "strh %1, [%5, #2] \n" /* Stores psOut->f16Q */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3), "+l"(psIn), "+l"(psAnglePos): "l"(psOut)); + #endif +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif +/***************************************************************************//*! +* +* @brief The function calculates Inverse Park Transformation which is used +* for transforming values (current, voltage, flux) from +* d-q rotating orthogonal coordination system to alpha-beta +* stationary orthogonal coordination system. +* +* @param ptr GMCLIB_2COOR_DQ_T_F16 *psIn +* IN - pointer to structure containing data of +* DQ coordinate two-phase stationary orthogonal system +* GMCLIB_ANGLE_T *psAnglePos +* IN - pointer to structure where the values +* of sine and cosine are stored +* GMCLIB_2COOR_ALBE_T_F16 *psOut +* OUT - pointer to structure containing data of two phase +* stationary orthogonal system +* +* @remarks Modifies the structure pointed by pAlphaBeta pointer +* according following equations: +* alpha = d * cos(theta) - q * sin(theta) +* beta = d * sin(theta) + q * cos(theta) +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline void GMCLIB_ParkInv_F16_FAsmi(const GMCLIB_2COOR_DQ_T_F16 *psIn, + const GMCLIB_2COOR_SINCOS_T_F16 *psAnglePos, + GMCLIB_2COOR_ALBE_T_F16 *psOut) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ /* Loads input values */ + ldrh f32Val1, [psIn, #2] /* Loads q */ + ldrh f32Val2, [psIn] /* Loads d */ + ldrh f32Val3, [psAnglePos, #2] /* Loads cos(theta) */ + ldrh psIn, [psAnglePos] /* Loads sin(theta) */ + sxth f32Val1, f32Val1 /* Sign extend */ + sxth f32Val2, f32Val2 /* Sign extend */ + sxth f32Val3, f32Val3 /* Sign extend */ + sxth psIn, psIn /* Sign extend */ + /* Counts alpha and beta coordinates */ + movs psAnglePos, f32Val2 /* d */ + muls psAnglePos, f32Val3, psAnglePos /* d * cos(theta) */ + muls f32Val2, f32Val2, psIn /* d * sin(theta) */ + muls psIn, psIn, f32Val1 /* q * sin(theta) */ + muls f32Val1, f32Val1, f32Val3 /* q * cos(theta) */ + subs psIn, psAnglePos, psIn /* alpha = d * cos(theta) - q * sin(theta) */ + adds f32Val1, f32Val1, f32Val2 /* beta = d * sin(theta) + q * cos(theta) */ + asrs psIn, psIn, #15 /* alpha << 15 */ + asrs f32Val1, f32Val1, #15 /* beta << 15 */ + /* Saturation */ + movs f32Val3, #0x80 /* f32Val3 = 0x80 */ + lsls f32Val3, f32Val3, #8 /* f32Val3 = 0x8000 */ + sxth f32Val2, f32Val1 /* Sign extend */ + eors f32Val1, f32Val2, f32Val1 /* f32Val2 ^ f32Val1 */ + bpl ParkInv_F16_QNotSat /* If f32Val2 < 0, then saturates result */ + asrs f32Val2, f32Val2, #16 /* f32Val2 >> 16 */ + adds f32Val2, f32Val3, f32Val2 /* beta = 0x8000 + f32Val2 */ + ParkInv_F16_QNotSat: + sxth f32Val1, psIn /* Sign extend */ + eors psIn, f32Val1, psIn /* f32Val2 ^ psIn */ + bpl ParkInv_F16_DNotSat /* If f32Val2 < 0, then saturates result */ + asrs f32Val1, f32Val1, #16 /* f32Val1 >> 16*/ + adds f32Val1, f32Val3, f32Val1 /* alpha = 0x8000 + f32Val1*/ + ParkInv_F16_DNotSat: + /* Stores alpha and beta values */ + strh f32Val1, [psOut] /* Stores psOut->f16Alpha */ + strh f32Val2, [psOut, #2] }; /* Stores psOut->f16Beta */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + /* Loads input values */ + "ldrh %0, [%3, #2] \n\t" /* Loads q */ + "ldrh %1, [%3] \n\t" /* Loads d */ + "ldrh %2, [%4, #2] \n\t" /* Loads cos(theta) */ + "ldrh %3, [%4] \n\t" /* Loads sin(theta) */ + "sxth %0, %0 \n\t" /* Sign extend */ + "sxth %1, %1 \n\t" /* Sign extend */ + "sxth %2, %2 \n\t" /* Sign extend */ + "sxth %3, %3 \n\t" /* Sign extend */ + /* Counts alpha and beta coordinates */ + "movs %4, %1 \n\t" /* d */ + "muls %4, %2, %4 \n\t" /* d * cos(theta) */ + "muls %1, %1, %3 \n\t" /* d * sin(theta) */ + "muls %3, %3, %0 \n\t" /* q * sin(theta) */ + "muls %0, %0, %2 \n\t" /* q * cos(theta) */ + "subs %3, %4, %3 \n\t" /* alpha = d * cos(theta) - q * sin(theta) */ + "adds %0, %0, %1 \n\t" /* beta = d * sin(theta) + q * cos(theta) */ + "asrs %3, %3, #15 \n\t" /* alpha << 15 */ + "asrs %0, %0, #15 \n\t" /* beta << 15 */ + /* Saturation */ + "movs %2, #0x80 \n\t" /* f32Val3 = 0x80 */ + "lsls %2, %2, #8 \n\t" /* f32Val3 = 0x8000 */ + "sxth %1, %0 \n\t" /* Sign extend */ + "eors %0, %1, %0 \n\t" /* f32Val2 ^ f32Val1 */ + "bpl GMCLIB_Park_F16_Inv_F16_QNotSat%= \n\t" /* If f32Val2 < 0, then saturates result */ + "asrs %1, %1, #16 \n\t" /* f32Val2 >> 16 */ + "adds %1, %2, %1 \n\t" /* beta = 0x8000 + f32Val2 */ + "GMCLIB_Park_F16_Inv_F16_QNotSat%=: \n\t" + "sxth %0, %3 \n\t" /* Sign extend */ + "eors %3, %0, %3 \n\t" /* f32Val2 ^ psIn */ + "bpl GMCLIB_Park_F16_Inv_F16_DNotSat%= \n\t" /* If f32Val2 < 0, then saturates result */ + "asrs %0, %0, #16 \n\t" /* f32Val1 >> 16*/ + "adds %0, %2, %0 \n\t" /* alpha = 0x8000 + f32Val1*/ + "GMCLIB_Park_F16_Inv_F16_DNotSat%=: \n\t" + /* Stores alpha and beta values */ + "strh %0, [%5] \n\t" /* Stores psOut->f16Alpha */ + "strh %1, [%5, #2] \n\t" /* Stores psOut->f16Beta */ + : "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3), "+l"(psIn), "+l"(psAnglePos): "l"(psOut)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + /* Loads input values */ + "ldrh %0, [%3, #2] \n" /* Loads q */ + "ldrh %1, [%3] \n" /* Loads d */ + "ldrh %2, [%4, #2] \n" /* Loads cos(theta) */ + "ldrh %3, [%4] \n" /* Loads sin(theta) */ + "sxth %0, %0 \n" /* Sign extend */ + "sxth %1, %1 \n" /* Sign extend */ + "sxth %2, %2 \n" /* Sign extend */ + "sxth %3, %3 \n" /* Sign extend */ + /* Counts alpha and beta coordinates */ + "movs %4, %1 \n" /* d */ + "muls %4, %2, %4 \n" /* d * cos(theta) */ + "muls %1, %1, %3 \n" /* d * sin(theta) */ + "muls %3, %3, %0 \n" /* q * sin(theta) */ + "muls %0, %0, %2 \n" /* q * cos(theta) */ + "subs %3, %4, %3 \n" /* alpha = d * cos(theta) - q * sin(theta) */ + "adds %0, %0, %1 \n" /* beta = d * sin(theta) + q * cos(theta) */ + "asrs %3, %3, #15 \n" /* alpha << 15 */ + "asrs %0, %0, #15 \n" /* beta << 15 */ + /* Saturation */ + "movs %2, #0x80 \n" /* f32Val3 = 0x80 */ + "lsls %2, %2, #8 \n" /* f32Val3 = 0x8000 */ + "sxth %1, %0 \n" /* Sign extend */ + "eors %0, %1, %0 \n" /* f32Val2 ^ f32Val1 */ + "bpl .+6 \n" /* If f32Val2 < 0, then saturates result */ + "asrs %1, %1, #16 \n" /* f32Val2 >> 16 */ + "adds %1, %2, %1 \n" /* beta = 0x8000 + f32Val2 */ + "sxth %0, %3 \n" /* Sign extend */ + "eors %3, %0, %3 \n" /* f32Val2 ^ psIn */ + "bpl .+6 \n" /* If f32Val2 < 0, then saturates result */ + "asrs %0, %0, #16 \n" /* f32Val1 >> 16*/ + "adds %0, %2, %0 \n" /* alpha = 0x8000 + f32Val1*/ + /* Stores alpha and beta values */ + "strh %0, [%5] \n" /* Stores psOut->f16Alpha */ + "strh %1, [%5, #2] \n" /* Stores psOut->f16Beta */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3), "+l"(psIn), "+l"(psAnglePos): "l"(psOut)); + #endif +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_PARK_F16_ASMI_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Svm_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Svm_F16.h new file mode 100644 index 0000000..8d89257 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/GMCLIB_Svm_F16.h @@ -0,0 +1,121 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Space vector modulation +* +*******************************************************************************/ +#ifndef _GMCLIB_SVM_F16_H_ +#define _GMCLIB_SVM_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "gmclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GMCLIB_SvmDpwm_F16_C(psIn, psOut) GMCLIB_SvmDpwm_F16_FC(psIn, psOut) +#define GMCLIB_SvmExDpwm_F16_C(psIn, psAngle, psOut) GMCLIB_SvmExDpwm_F16_FC(psIn, psAngle,psOut) +#define GMCLIB_SvmIct_F16_C(psIn, psOut) GMCLIB_SvmIct_F16_FC(psIn, psOut) +#define GMCLIB_SvmStd_F16_Asm(psIn, psOut) GMCLIB_SvmStd_F16_FAsm(psIn, psOut) +#define GMCLIB_SvmStdShifted_F16_C(psIn, param, psCfgPWM, psCfgMeas) GMCLIB_SvmStdShifted_F16_FC(psIn, param, psCfgPWM, psCfgMeas) +#define GMCLIB_SvmU7n_F16_C(psIn, psOut) GMCLIB_SvmU7n_F16_FC(psIn, psOut) +#define GMCLIB_SvmU0n_F16_C(psIn, psOut) GMCLIB_SvmU0n_F16_FC(psIn, psOut) + +/****************************************************************************** +* Types +******************************************************************************/ +/* The GMCLIB_SvmStdShifted parameters structure */ +typedef struct +{ + frac16_t f16LowerLim; + frac16_t f16UpperLim; + frac16_t f16MinT1T2; +} GMCLIB_SVMSTDSHIFTED_T_F16; + +/* The GMCLIB_SvmStdShifted PWM signal configuration. */ +typedef struct +{ + GMCLIB_3COOR_T_F16 sDuty; /* Three-phase duty-cycle. */ + GMCLIB_3COOR_T_F16 sShift; /* Edge shift. */ +} GMCLIB_PWM_CONFIG_T_F16; + +/* The GMCLIB_SvmStdShifted phase index enumeration. */ +typedef enum +{ + kPhaseA = 0U, + kPhaseB = 1U, + kPhaseC = 2U +} GMCLIB_PHASE_INDEX_T; + +/* The GMCLIB_SvmStdShifted measurement configuration structure. */ +typedef struct +{ + uint16_t ui16SectorSVM; + frac16_t f16SmplFirstEdge; + frac16_t f16SmplSecondEdge; + GMCLIB_PHASE_INDEX_T eSmplOnePh; + GMCLIB_PHASE_INDEX_T eSmplTwoPh; + GMCLIB_PHASE_INDEX_T eCalcPh; +} GMCLIB_ADC_CONFIG_T_F16; + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern uint16_t GMCLIB_SvmStd_F16_FAsm(const GMCLIB_2COOR_ALBE_T_F16 *psIn, + GMCLIB_3COOR_T_F16 *psOut); +extern uint16_t GMCLIB_SvmIct_F16_FC(const GMCLIB_2COOR_ALBE_T_F16 *psIn, + GMCLIB_3COOR_T_F16 *psOut); +extern uint16_t GMCLIB_SvmU7n_F16_FC(const GMCLIB_2COOR_ALBE_T_F16 *psIn, + GMCLIB_3COOR_T_F16 *psOut); +extern void GMCLIB_SvmStdShifted_F16_FC(const GMCLIB_2COOR_ALBE_T_F16 *psIn, + const GMCLIB_SVMSTDSHIFTED_T_F16 *psParam, + GMCLIB_ADC_CONFIG_T_F16 *psCfgMeas, + GMCLIB_PWM_CONFIG_T_F16 *psCfgPWM); +extern uint16_t GMCLIB_SvmU0n_F16_FC(const GMCLIB_2COOR_ALBE_T_F16 *psIn, + GMCLIB_3COOR_T_F16 *psOut); +extern uint16_t GMCLIB_SvmDpwm_F16_FC(const GMCLIB_2COOR_ALBE_T_F16 *psIn, + GMCLIB_3COOR_T_F16 *psOut); +extern uint16_t GMCLIB_SvmExDpwm_F16_FC(const GMCLIB_2COOR_ALBE_T_F16 *psIn, + const GMCLIB_2COOR_SINCOS_T_F16 *psAngle, + GMCLIB_3COOR_T_F16 *psOut); +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_SVM_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/gmclib.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/gmclib.h new file mode 100644 index 0000000..056a95f --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/gmclib.h @@ -0,0 +1,104 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Main GMCLIB header file for devices without FPU. +* +*******************************************************************************/ +#ifndef _GMCLIB_H_ +#define _GMCLIB_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "GMCLIB_Clark_F16_Asmi.h" +#include "GMCLIB_DTCompLut1D_F16.h" +#include "GMCLIB_Decoupling_A32.h" +#include "GMCLIB_ElimDcBusRip_A32.h" +#include "GMCLIB_ElimDcBusRip_F16.h" +#include "GMCLIB_ElimDcBusRipHw_A32.h" +#include "GMCLIB_ElimDcBusRipHw_F16.h" +#include "GMCLIB_Park_F16_Asmi.h" +#include "GMCLIB_Svm_F16.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define GMCLIB_Clark_F16(psIn, psOut) \ + GMCLIB_Clark_F16_Asmi(psIn, psOut) +#define GMCLIB_ClarkInv_F16(psIn, psOut) \ + GMCLIB_ClarkInv_F16_Asmi(psIn, psOut) +#define GMCLIB_DecouplingPMSM_F16(psUDQ, psIDQ, f16SpeedEl, psParam, psUDQDec) \ + GMCLIB_DecouplingPMSM_F16_Asm(psUDQ, psIDQ, f16SpeedEl, psParam, psUDQDec) +#define GMCLIB_DTCompLut1D_F16(psIABC, psUAlBe, f16U_DCB, psParam, psUAlBeDtComp) \ + GMCLIB_DTCompLut1D_F16_C(psIABC, psUAlBe, f16U_DCB, psParam, psUAlBeDtComp) +#define GMCLIB_Park_F16(psIn, psAnglePos, psOut) \ + GMCLIB_Park_F16_Asmi(psIn, psAnglePos, psOut) +#define GMCLIB_ParkInv_F16(psIn, psAnglePos, psOut) \ + GMCLIB_ParkInv_F16_Asmi(psIn, psAnglePos, psOut) +#define GMCLIB_SvmIct_F16(psIn, psOut) \ + GMCLIB_SvmIct_F16_C(psIn, psOut) +#define GMCLIB_SvmStd_F16(psIn, psOut) \ + GMCLIB_SvmStd_F16_Asm(psIn, psOut) +#define GMCLIB_SvmStdShifted_F16(psIn, param, psCfgPWM, psCfgMeas) \ + GMCLIB_SvmStdShifted_F16_C(psIn, param, psCfgPWM, psCfgMeas) +#define GMCLIB_SvmU0n_F16(psIn, psOut) \ + GMCLIB_SvmU0n_F16_C(psIn, psOut) +#define GMCLIB_SvmU7n_F16(psIn, psOut) \ + GMCLIB_SvmU7n_F16_C(psIn, psOut) +#define GMCLIB_SvmDpwm_F16(psIn, psOut) \ + GMCLIB_SvmDpwm_F16_C(psIn, psOut) +#define GMCLIB_SvmExDpwm_F16(psIn, psAngle, psOut) \ + GMCLIB_SvmExDpwm_F16_C(psIn, psAngle,psOut) + + +/* Software switch to enable or disable Memory-Mapped Divide and Square Root Module(MMDVSQ) */ +#if (RTCESL_MMDVSQ) +#define GMCLIB_ElimDcBusRip_F16sas(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRipHw_F16sas_Asm(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) +#define GMCLIB_ElimDcBusRipFOC_F16(f16UDCBus, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRipFOCHw_F16_Asm(f16UDCBus, psUAlBe, psUAlBeComp) +#else +#define GMCLIB_ElimDcBusRip_F16sas(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRip_F16sas_Asm(f16UDCBus, a32IdxMod, psUAlBe, psUAlBeComp) +#define GMCLIB_ElimDcBusRipFOC_F16(f16UDCBus, psUAlBe, psUAlBeComp) \ + GMCLIB_ElimDcBusRipFOC_F16_Asm(f16UDCBus, psUAlBe, psUAlBeComp) +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/gmclib_types.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/gmclib_types.h new file mode 100644 index 0000000..a677c28 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/Include/gmclib_types.h @@ -0,0 +1,133 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief GMCLIB Types +* +*******************************************************************************/ +#ifndef _GMCLIB_TYPES_H_ +#define _GMCLIB_TYPES_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/****************************************************************************** +* Macros +******************************************************************************/ +#define GMCLIB_CONST + +/* GMCLIB_ONE_DIV_SQRT3_F16 define, the value is: 32768 / sqrt(3) = 18919 = 0x49E7 */ +#define GMCLIB_ONE_DIV_SQRT3_F16 (frac16_t)18919 +/* GMCLIB_SQRT3_DIV_2_F16 define, the value is: 32768 * sqrt(3) / 2 = 28378 = 0x6EDA */ +#define GMCLIB_SQRT3_DIV_2_F16 (frac16_t)28378 + +/******************************************************************************* +* Types +********************************************************************************/ +/* Integer data types */ + +/* The GMCLIB_3COOR_T_F16 structure type corresponds to the three-phase stationary +coordinate system based on the A, B, C components. */ +typedef struct +{ + frac16_t f16A; + frac16_t f16B; + frac16_t f16C; +} GMCLIB_3COOR_T_F16; + +/* The GMCLIB_2COOR_ALBE_T_F16 structure type corresponds to the two-phase +stationary coordinate system based on the Alpha and Beta orthogonal components. */ +typedef struct +{ + frac16_t f16Alpha; + frac16_t f16Beta; +} GMCLIB_2COOR_ALBE_T_F16; + +/* The GMCLIB_2COOR_DQ_T_F16 structure type corresponds to the two-phase rotating +coordinate system based on the D and Q orthogonal components. */ +typedef struct +{ + frac16_t f16D; + frac16_t f16Q; +} GMCLIB_2COOR_DQ_T_F16; + +/* The GMCLIB_2COOR_SINCOS_T_F16 structure type corresponds to the two-phase +coordinate system based on the Sin and Cos components of certain angle. */ +typedef struct +{ + frac16_t f16Sin; + frac16_t f16Cos; +} GMCLIB_2COOR_SINCOS_T_F16; + +/* The GMCLIB_2COOR_DQ_T_F32 structure type corresponds to the two-phase rotating +coordinate system based on the D and Q orthogonal components. */ +typedef struct +{ + frac32_t f32D; + frac32_t f32Q; +} GMCLIB_2COOR_DQ_T_F32; + +/* The GMCLIB_2COOR_ALBE_T_F16 structure type corresponds to the two-phase +stationary coordinate system based on the Alpha and Beta orthogonal components. */ +typedef struct +{ + frac32_t f32Alpha; + frac32_t f32Beta; +} GMCLIB_2COOR_ALBE_T_F32; + +/* The GMCLIB_2COOR_AB_T_F16 structure type corresponds to the two-phase stationary +coordinate system based on the A and B components. */ + +typedef struct +{ + frac16_t f16A; /* First argument */ + frac16_t f16B; /* Second argument */ +} GMCLIB_2COOR_AB_T_F16; + +/* The GMCLIB_2COOR_AB_T_F32 structure type corresponds to the two-phase stationary +coordinate system based on the A and B components. */ + +typedef struct +{ + frac32_t f32A; /* First argument */ + frac32_t f32B; /* Second argument */ +} GMCLIB_2COOR_AB_T_F32; +#if defined(__cplusplus) +} +#endif + +#endif /* _GMCLIB_TYPES_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/libGMCLIB.a b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/libGMCLIB.a new file mode 100644 index 0000000..8d4233c Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/GMCLIB/libGMCLIB.a differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F16.h new file mode 100644 index 0000000..7ac88ea --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F16.h @@ -0,0 +1,79 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Absolute Value +* +*******************************************************************************/ +#ifndef _MLIB_ABS_F16_H_ +#define _MLIB_ABS_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Abs_F16_Ci(f16Val) MLIB_Abs_F16_FCi(f16Val) +#define MLIB_AbsSat_F16_Ci(f16Val) MLIB_AbsSat_F16_FCi(f16Val) + +/***************************************************************************//*! +* Absolute value +* f16Out = |f16In| +* not saturated +*******************************************************************************/ +static inline frac16_t MLIB_Abs_F16_FCi(register frac16_t f16Val) +{ + return((f16Val < (frac16_t)0) ? (-f16Val) : (f16Val)); +} +/***************************************************************************//*! +* Absolute value saturated +* f16Out = |f16In| +*******************************************************************************/ +static inline frac16_t MLIB_AbsSat_F16_FCi(register frac16_t f16Val) +{ + register int16_t i16Temp; + + i16Temp = (int16_t)(MLIB_Abs_F16_Ci(f16Val)); + i16Temp = (i16Temp == INT16_MIN) ? INT16_MAX : i16Temp; /* Correction for -1.0 * (-1.0) */ + return((frac16_t)(i16Temp)); +} +#if defined(__cplusplus) +} +#endif + +#endif /*_MLIB_ABS_F16_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F16_Asmi.h new file mode 100644 index 0000000..871b259 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F16_Asmi.h @@ -0,0 +1,107 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Absolute Value +* +*******************************************************************************/ +#ifndef _MLIB_ABS_F16_ASM_H_ +#define _MLIB_ABS_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_AbsSat_F16_Asmi(f16Val) MLIB_AbsSat_F16_FAsmi(f16Val) + + +/***************************************************************************//*! +* Absolute value saturated +* Output = |f16In| +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_AbsSat_F16_FAsmi(register frac16_t f16Val) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ lsls f16Val, f16Val, #16 /* f16Val << 16 */ + bpl AbsEnd /* If f16Val >= 0, then goes to AbsEnd */ + rsbs f16Val, f16Val, #0 /* If f16Val < 0, then f16Val = 0 - f16Val */ + bpl AbsEnd /* If f16Val >= 0, then goes to AbsEnd */ + subs f16Val, f16Val, #1 /* If f16Val == 0xFFFF8000, f16Val = f16Val - 1 */ + AbsEnd: + lsrs f16Val, f16Val, #16}; /* f16Val >> 16 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "lsls %0, %0, #16 \n\t" /* f16Val << 16 */ + "bpl MLIB_AbsSat_F16_AbsEnd%= \n\t" /* If f16Val >= 0, then jumps through three commands */ + "rsbs %0, %0, #0 \n\t" /* If f16Val < 0, then f16Val = 0 - f16Val */ + "bpl MLIB_AbsSat_F16_AbsEnd%= \n\t" /* If f16Val >= 0, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* If f16Val = 0x80000000, f16Val = 0x7FFFFFFF */ + "MLIB_AbsSat_F16_AbsEnd%=: \n\t" + "lsrs %0, %0, #16 \n\t" /* f16Val >> 16 */ + : "+l"(f16Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %0, %0, #16 \n" /* f16Val << 16 */ + "bpl .+8 \n" /* If f16Val >= 0, then jumps through three commands */ + "rsbs %0, %0, #0 \n" /* If f16Val < 0, then f16Val = 0 - f16Val */ + "bpl .+4 \n" /* If f16Val >= 0, then jumps through next command */ + "subs %0, %0, #1 \n" /* If f16Val = 0x80000000, f16Val = 0x7FFFFFFF */ + "lsrs %0, %0, #16 \n" /* f16Val >> 16 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Val):); + #endif + + return f16Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /*_MLIB_ABS_F16_ASM_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F32.h new file mode 100644 index 0000000..ce02f97 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F32.h @@ -0,0 +1,79 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Absolute Value +* +*******************************************************************************/ +#ifndef _MLIB_ABS_F32_H_ +#define _MLIB_ABS_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Abs_F32_Ci(f32Val) MLIB_Abs_F32_FCi(f32Val) +#define MLIB_AbsSat_F32_Ci(f32Val) MLIB_AbsSat_F32_FCi(f32Val) + +/***************************************************************************//*! +* Absolute value +* f32Out = |f32In| +* not saturated +*******************************************************************************/ +static inline frac32_t MLIB_Abs_F32_FCi(register frac32_t f32Val) +{ + return((f32Val < (frac32_t)0) ? (-f32Val) : (f32Val)); +} +/***************************************************************************//*! +* Absolute value saturated +* f32Out = |f32In| +*******************************************************************************/ +static inline frac32_t MLIB_AbsSat_F32_FCi(register frac32_t f32Val) +{ + register int32_t i32Temp; + + i32Temp = (int32_t)(MLIB_Abs_F32_Ci(f32Val)); + i32Temp = (i32Temp == INT32_MIN) ? INT32_MAX : i32Temp; /* Correction for -1.0 * (-1.0) */ + return((frac32_t)(i32Temp)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ABS_F32_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F32_Asmi.h new file mode 100644 index 0000000..c3ed8e4 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Abs_F32_Asmi.h @@ -0,0 +1,103 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Absolute Value +* +*******************************************************************************/ +#ifndef _MLIB_ABS_F32_ASM_H_ +#define _MLIB_ABS_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_AbsSat_F32_Asmi(f32Val) MLIB_AbsSat_F32_FAsmi(f32Val) + +/***************************************************************************//*! +* Absolute value saturated +* Output = |f32In| +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_AbsSat_F32_FAsmi(register frac32_t f32Val) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ cmp f32Val, #0 /* Compares f32Val with 0 */ + bge AbsEnd /* If f32Val >= 0, then goes to AbsEnd */ + rsbs f32Val, f32Val, #0 /* If f32Val < 0, then f32Val = 0 - f32Val */ + bpl AbsEnd /* If f32Val >= 0, then goes to AbsEnd */ + subs f32Val, f32Val, #1 /* If f32Val = 0x80000000, f32Val = 0x7FFFFFFF */ + AbsEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "cmp %0, #0 \n\t" /* Compares f32Val with 0 */ + "bge MLIB_AbsSat_F32_AbsEnd%= \n\t" /* If f32Val >= 0, then jumps through three commands */ + "rsbs %0, %0, #0 \n\t" /* If f32Val < 0, then f32Val = 0 - f32Val */ + "bpl MLIB_AbsSat_F32_AbsEnd%= \n\t" /* If f32Val >= 0, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* If f32Val = 0x80000000, f32Val = 0x7FFFFFFF */ + "MLIB_AbsSat_F32_AbsEnd%=: \n\t" + : "+l"(f32Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "cmp %0, #0 \n" /* Compares f32Val with 0 */ + "bge .+8 \n" /* If f32Val >= 0, then jumps through three commands */ + "rsbs %0, %0, #0 \n" /* If f32Val < 0, then f32Val = 0 - f32Val */ + "bpl .+4 \n" /* If f32Val >= 0, then jumps through next command */ + "subs %0, %0, #1 \n" /* If f32Val = 0x80000000, f32Val = 0x7FFFFFFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val):); + #endif + + return f32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ABS_F32_ASM_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F16.h new file mode 100644 index 0000000..bd32251 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F16.h @@ -0,0 +1,68 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Summation of four inputs +* +*******************************************************************************/ +#ifndef _MLIB_ADD4_F16_H_ +#define _MLIB_ADD4_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Add4_F16_Ci(f16Add1, f16Add2, f16Add3, f16Add4) \ + MLIB_Add4_F16_FCi(f16Add1, f16Add2, f16Add3, f16Add4) + +/***************************************************************************//*! +* Summation of four inputs +* f16Out = f16Add1 + f16Add2 + f16Add3 + f16Add4 +* function is not saturated +*******************************************************************************/ +static inline frac16_t MLIB_Add4_F16_FCi(register frac16_t f16Add1, register frac16_t f16Add2, + register frac16_t f16Add3, register frac16_t f16Add4) +{ + return((frac16_t)(f16Add1 + f16Add2 + f16Add3 + f16Add4)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ADD4_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F16_Asmi.h new file mode 100644 index 0000000..8ba7458 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F16_Asmi.h @@ -0,0 +1,143 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Summation of four inputs +* +*******************************************************************************/ +#ifndef _MLIB_ADD4_F16_ASM_H_ +#define _MLIB_ADD4_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Add4Sat_F16_Asmi(f16Add1, f16Add2, f16Add3, f16Add4) \ + MLIB_Add4Sat_F16_FAsmi(f16Add1, f16Add2, f16Add3, f16Add4) + +/***************************************************************************//*! +* Saturated summation of four inputs +* Output = f16Add1 + f16Add2 + f16Add3 + f16Add4 +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_Add4Sat_F16_FAsmi(register frac16_t f16Add1, register frac16_t f16Add2, + register frac16_t f16Add3, register frac16_t f16Add4) +{ + register frac32_t f32Val = 0x8000; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Add1, f16Add1 /* Transforms 16-bit input f16Add1 to 32-bit */ + sxth f16Add2, f16Add2 /* Transforms 16-bit input f16Add2 to 32-bit */ + sxth f16Add3, f16Add3 /* Transforms 16-bit input f16Add1 to 32-bit */ + sxth f16Add4, f16Add4 /* Transforms 16-bit input f16Add2 to 32-bit */ + adds f16Add1, f16Add2, f16Add1 /* f16Add1 = f16Add1 + f16Add2 */ + adds f16Add1, f16Add1, f16Add3 /* f16Add1 = f16Add1 + f16Add3 */ + adds f16Add1, f16Add1, f16Add4 /* f16Add1 = f16Add1 + f16Add4 */ + + cmp f32Val, f16Add1 /* Compares f16Add1 with 0x8000 */ + bgt NegTest /* If f16Add1 < 0x8000, then goes to NegTest */ + subs f16Add1, f32Val, #1 /* If f16Add1 >= 0x8000, then f16Add1 = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f32Val, f32Val /* f32Val = 0xFFFF8000 */ + cmp f32Val, f16Add1 /* Compares f16Add1 with 0xFFFF8000 */ + ble SatEnd /* If f16Add1 >= 0xFFFF8000, then goes to SatEnd */ + mov f16Add1, f32Val /* If f16Add1 < 0xFFFF8000, then f16Add1 = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Transforms 16-bit input f16Add1 to 32-bit */ + "sxth %1, %1 \n\t" /* Transforms 16-bit input f16Add2 to 32-bit */ + "sxth %2, %2 \n\t" /* Transforms 16-bit input f16Add1 to 32-bit */ + "sxth %3, %3 \n\t" /* Transforms 16-bit input f16Add2 to 32-bit */ + "adds %0, %0, %1 \n\t" /* f16Add1 = f16Add1 + f16Add2 */ + "adds %0, %0, %2 \n\t" /* f16Add1 = f16Add1 + f16Add3 */ + "adds %0, %0, %3 \n\t" /* f16Add1 = f16Add1 + f16Add4 */ + + "cmp %4, %0 \n\t" /* Compares f16Add1 with 0x8000 */ + "bgt MLIB_Add4Sat_F16_NegTest%= \n\t" /* If f16Add1 < 0x8000, then jumps through two commands */ + "subs %0, %4, #1 \n\t" /* If f16Add1 >= 0x8000, then f16Add1 = 0x7FFF */ + "b MLIB_Add4Sat_F16_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_Add4Sat_F16_NegTest%=: \n\t" + "sxth %4, %4 \n\t" /* f32Val = 0xFFFF8000 */ + "cmp %4, %0 \n\t" /* Compares f16Add1 with 0xFFFF8000 */ + "ble MLIB_Add4Sat_F16_SatEnd%= \n\t" /* If f16Add1 >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %4 \n\t" /* If f16Add1 < 0xFFFF8000, then f16Add1 = 0xFFFF8000 */ + "MLIB_Add4Sat_F16_SatEnd%=: \n\t" + : "+l"(f16Add1), "+l"(f16Add2), "+l"(f16Add3), "+l"(f16Add4), "+l"(f32Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Transforms 16-bit input f16Add1 to 32-bit */ + "sxth %1, %1 \n" /* Transforms 16-bit input f16Add2 to 32-bit */ + "sxth %2, %2 \n" /* Transforms 16-bit input f16Add1 to 32-bit */ + "sxth %3, %3 \n" /* Transforms 16-bit input f16Add2 to 32-bit */ + "adds %0, %0, %1 \n" /* f16Add1 = f16Add1 + f16Add2 */ + "adds %0, %0, %2 \n" /* f16Add1 = f16Add1 + f16Add3 */ + "adds %0, %0, %3 \n" /* f16Add1 = f16Add1 + f16Add4 */ + + "cmp %4, %0 \n" /* Compares f16Add1 with 0x8000 */ + "bgt .+6 \n" /* If f16Add1 < 0x8000, then jumps through two commands */ + "subs %0, %4, #1 \n" /* If f16Add1 >= 0x8000, then f16Add1 = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + + "sxth %4, %4 \n" /* f32Val = 0xFFFF8000 */ + "cmp %4, %0 \n" /* Compares f16Add1 with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Add1 >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %4 \n" /* If f16Add1 < 0xFFFF8000, then f16Add1 = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Add1), "+l"(f16Add2), "+l"(f16Add3), "+l"(f16Add4), "+l"(f32Val):); + #endif + + return f16Add1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ADD4_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F32.h new file mode 100644 index 0000000..24f78f4 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F32.h @@ -0,0 +1,68 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Summation of four inputs +* +*******************************************************************************/ +#ifndef _MLIB_ADD4_F32_H_ +#define _MLIB_ADD4_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Add4_F32_Ci(f32Add1, f32Add2, f32Add3, f32Add4) \ + MLIB_Add4_F32_FCi(f32Add1, f32Add2, f32Add3, f32Add4) + +/***************************************************************************//*! +* Summation of four inputs +* f32Out = f32Add1 + f32Add2 + f32Add3 + f32Add4 +* function is not saturated +*******************************************************************************/ +static inline frac32_t MLIB_Add4_F32_FCi(register frac32_t f32Add1, register frac32_t f32Add2, + register frac32_t f32Add3, register frac32_t f32Add4) +{ + return((frac32_t)(f32Add1 + f32Add2 + f32Add3 + f32Add4)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ADD4_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F32_Asmi.h new file mode 100644 index 0000000..9b9618e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add4_F32_Asmi.h @@ -0,0 +1,164 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Summation of four inputs +* +*******************************************************************************/ +#ifndef _MLIB_ADD4_F32_ASM_H_ +#define _MLIB_ADD4_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Add4Sat_F32_Asmi(f32Add1, f32Add2, f32Add3, f32Add4) \ + MLIB_Add4Sat_F32_FAsmi(f32Add1, f32Add2, f32Add3, f32Add4) + +/***************************************************************************//*! +* Saturated summation of four inputs +* Output = f32Add1 + f32Add2 + f32Add3 + f32Add4 +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_Add4Sat_F32_FAsmi(register frac32_t f32Add1, register frac32_t f32Add2, + register frac32_t f32Add3, register frac32_t f32Add4) +{ + register frac32_t f32Val1=0, f32Val2=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ asrs f32Val1, f32Add1, #31 /* f32Val1 = sign of f32Add1 */ + asrs f32Val2, f32Add2, #31 /* f32Val2 = sign of f32Add2 */ + + adds f32Add1, f32Add1, f32Add2 /* f32Add1 = f32Add1 + f32Add2 */ + adcs f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 + f32Val2 + carry */ + + asrs f32Val2, f32Add3, #31 /* f32Val2 = sign of f32Add3 */ + adds f32Add1, f32Add1, f32Add3 /* f32Add1 = f32Add1 + f32Add3 */ + adcs f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 + f32Val2 + carry */ + + asrs f32Val2, f32Add4, #31 /* f32Val2 = sign of f32Add4 */ + adds f32Add1, f32Add1, f32Add4 /* f32Add1 = f32Add1 + f32Add4 */ + adcs f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 + f32Val2 + carry */ + + lsrs f32Val2, f32Add1, #31 /* f32Val2 = first bit of f32Add1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + beq SatEnd /* If r3 != 0, then saturates output */ + + movs f32Add1, #128 /* f32Add1 = 0x80 */ + rev f32Add1, f32Add1 /* f32Add1 = 0x80000000 */ + subs f32Add1, f32Add1, #1 /* f32Add1 = 0x7FFFFFFF */ + asrs f32Val2, f32Val2, #16 /* f32Val2 = sign of result */ + subs f32Add1, f32Add1, f32Val2 /* f32Add1 = 0x7FFFFFFF - f32Val2 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "asrs %1, %0, #31 \n\t" /* f32Val1 = sign of f32Add1 */ + "asrs %2, %3, #31 \n\t" /* f32Val2 = sign of f32Add2 */ + + "adds %0, %0, %3 \n\t" /* f32Add1 = f32Add1 + f32Add2 */ + "adcs %1, %1, %2 \n\t" /* f32Val1 = f32Val1 + f32Val2 + carry */ + + "asrs %2, %4, #31 \n\t" /* f32Val2 = sign of f32Add3 */ + "adds %0, %0, %4 \n\t" /* f32Add1 = f32Add1 + f32Add3 */ + "adcs %1, %1, %2 \n\t" /* f32Val1 = f32Val1 + f32Val2 + carry */ + + "asrs %2, %5, #31 \n\t" /* f32Val2 = sign of f32Add4 */ + "adds %0, %0, %5 \n\t" /* f32Add1 = f32Add1 + f32Add4 */ + "adcs %1, %1, %2 \n\t" /* f32Val1 = f32Val1 + f32Val2 + carry */ + + "lsrs %2, %0, #31 \n\t" /* f32Val2 = first bit of f32Add1 */ + "adds %2, %2, %1 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "beq MLIB_Add4Sat_F32_SatEnd%= \n\t" /* If r3 != 0, then saturates output */ + + "movs %0, #128 \n\t" /* f32Add1 = 0x80 */ + "rev %0, %0 \n\t" /* f32Add1 = 0x80000000 */ + "subs %0, %0, #1 \n\t" /* f32Add1 = 0x7FFFFFFF */ + "asrs %2, %2, #16 \n\t" /* f32Val2 = sign of result */ + "subs %0, %0, %2 \n\t" /* f32Add1 = 0x7FFFFFFF - f32Val2 */ + "MLIB_Add4Sat_F32_SatEnd%=: \n\t" + : "+l"(f32Add1), "+l"(f32Val1), "+l"(f32Val2): "l"(f32Add2), "l"(f32Add3), "l"(f32Add4)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "asrs %1, %0, #31 \n" /* f32Val1 = sign of f32Add1 */ + "asrs %2, %3, #31 \n" /* f32Val2 = sign of f32Add2 */ + + "adds %0, %0, %3 \n" /* f32Add1 = f32Add1 + f32Add2 */ + "adcs %1, %1, %2 \n" /* f32Val1 = f32Val1 + f32Val2 + carry */ + + "asrs %2, %4, #31 \n" /* f32Val2 = sign of f32Add3 */ + "adds %0, %0, %4 \n" /* f32Add1 = f32Add1 + f32Add3 */ + "adcs %1, %1, %2 \n" /* f32Val1 = f32Val1 + f32Val2 + carry */ + + "asrs %2, %5, #31 \n" /* f32Val2 = sign of f32Add4 */ + "adds %0, %0, %5 \n" /* f32Add1 = f32Add1 + f32Add4 */ + "adcs %1, %1, %2 \n" /* f32Val1 = f32Val1 + f32Val2 + carry */ + + "lsrs %2, %0, #31 \n" /* f32Val2 = first bit of f32Add1 */ + "adds %2, %2, %1 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "beq .+12 \n" /* If r3 != 0, then saturates output */ + + "movs %0, #128 \n" /* f32Add1 = 0x80 */ + "rev %0, %0 \n" /* f32Add1 = 0x80000000 */ + "subs %0, %0, #1 \n" /* f32Add1 = 0x7FFFFFFF */ + "asrs %2, %2, #16 \n" /* f32Val2 = sign of result */ + "subs %0, %0, %2 \n" /* f32Add1 = 0x7FFFFFFF - f32Val2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Add1), "+l"(f32Val1), "+l"(f32Val2): "l"(f32Add2), "l"(f32Add3), "l"(f32Add4)); + #endif + + return f32Add1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ADD4_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_A32.h new file mode 100644 index 0000000..0b3d548 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_A32.h @@ -0,0 +1,78 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Addition +* +*******************************************************************************/ +#ifndef _MLIB_ADD_A32_H_ +#define _MLIB_ADD_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Add_A32ss_Ci(f16Add1, f16Add2) MLIB_Add_A32ss_FCi(f16Add1, f16Add2) +#define MLIB_Add_A32as_Ci(a32Accum, f16Add) MLIB_Add_A32as_FCi(a32Accum, f16Add) + +/***************************************************************************//*! +* Addition +* a32Out = f16Add1 + f16Add2 +* Result can overflow through fractional range and is stored in accumulator type +*******************************************************************************/ +static inline acc32_t MLIB_Add_A32ss_FCi(register frac16_t f16Add1, register frac16_t f16Add2) +{ + return((acc32_t)((acc32_t)f16Add1 + (acc32_t)f16Add2)); +} + +/***************************************************************************//*! +* Addition +* a32Out = a32Accum + f16Add +* Result can overflow through fractional range and is stored in accumulator type +*******************************************************************************/ +static inline acc32_t MLIB_Add_A32as_FCi(register acc32_t a32Accum, register frac16_t f16Add) +{ + return((acc32_t)(a32Accum + (acc32_t)(f16Add))); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ADD_A32_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_A32_Asmi.h new file mode 100644 index 0000000..e538968 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_A32_Asmi.h @@ -0,0 +1,134 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Addition +* +*******************************************************************************/ +#ifndef _MLIB_ADD_A32_ASM_H_ +#define _MLIB_ADD_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Add_A32ss_Asmi(f16Add1, f16Add2) MLIB_Add_A32ss_FAsmi(f16Add1, f16Add2) +#define MLIB_Add_A32as_Asmi(a32Accum, f16Add) MLIB_Add_A32as_FAsmi(a32Accum, f16Add) + +/***************************************************************************//*! +* Addition +* Output = f16Add1 + f16Add2 +* Result can overflow through fractional range and is stored in accumulator type +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_Add_A32ss_FAsmi(register frac16_t f16Add1, register frac16_t f16Add2) +{ + register acc32_t a32Val=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Add1, f16Add1 /* Transforms 16-bit input f16Add2 to 32-bit */ + sxth f16Add2, f16Add2 /* Transforms 16-bit input f16Add2 to 32-bit */ + adds a32Val, f16Add1, f16Add2}; /* f16Add1 = f16Add1 + f16Add2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Transforms 16-bit input f16Add2 to 32-bit */ + "sxth %2, %2 \n\t" /* Transforms 16-bit input f16Add2 to 32-bit */ + "adds %0, %1, %2 \n\t" /* f16Add1 = f16Add1 + f16Add2 */ + : "=l"(a32Val), "+l"(f16Add1), "+l"(f16Add2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Transforms 16-bit input f16Add2 to 32-bit */ + "sxth %2, %2 \n" /* Transforms 16-bit input f16Add2 to 32-bit */ + "adds %0, %1, %2 \n" /* f16Add1 = f16Add1 + f16Add2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "=l"(a32Val), "+l"(f16Add1), "+l"(f16Add2):); + #endif + + return a32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +/***************************************************************************//*! +* Addition +* Output = a32Accum + f16Add +* Result can overflow through fractional range and is stored in accumulator type +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_Add_A32as_FAsmi(register acc32_t a32Accum, register frac16_t f16Add) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Add, f16Add /* Transforms 16-bit input f16Add2 to 32-bit */ + adds a32Accum, a32Accum, f16Add}; /* f16Add1 = f16Add1 + f16Add2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Transforms 16-bit input f16Add2 to 32-bit */ + "adds %0, %0, %1 \n\t" /* a32Accum = a32Accum + f16Add2 */ + : "+l"(a32Accum), "+l"(f16Add):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Transforms 16-bit input f16Add2 to 32-bit */ + "adds %0, %0, %1 \n" /* a32Accum = a32Accum + f16Add2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Accum), "+l"(f16Add):); + #endif + + return a32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ADD_A32_ASM_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F16.h new file mode 100644 index 0000000..61bdbce --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F16.h @@ -0,0 +1,82 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Addition +* +*******************************************************************************/ +#ifndef _MLIB_ADD_F16_H_ +#define _MLIB_ADD_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Add_F16_Ci(f16Add1, f16Add2) MLIB_Add_F16_FCi(f16Add1, f16Add2) +#define MLIB_AddSat_F16_Ci(f16Add1, f16Add2) MLIB_AddSat_F16_FCi(f16Add1, f16Add2) + +/***************************************************************************//*! +* Addition +* f16Out = f16Add1 + f16Add2 +* function is not saturated +*******************************************************************************/ +static inline frac16_t MLIB_Add_F16_FCi(register frac16_t f16Add1, register frac16_t f16Add2) +{ + return((frac16_t)(f16Add1 + f16Add2)); +} + +/***************************************************************************//*! +* Saturated Addition +* f16Out = f16Add1 + f16Add2 +*******************************************************************************/ +static inline frac16_t MLIB_AddSat_F16_FCi(register frac16_t f16Add1, register frac16_t f16Add2) +{ + register int32_t i32z; + + i32z = (int32_t)((frac32_t)f16Add1 + (frac32_t)f16Add2); + i32z = i32z > (int32_t)0x00007FFF ? (int32_t)0x00007FFF : i32z; + i32z = i32z < (int32_t)0xFFFF8000U ? (int32_t)0xFFFF8000U : i32z; + return((frac16_t)(i32z)); +} + +#if defined(__cplusplus) +} +#endif + +#endif /*_MLIB_ADD_F16_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F16_Asmi.h new file mode 100644 index 0000000..fb6db65 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F16_Asmi.h @@ -0,0 +1,125 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Addition +* +*******************************************************************************/ +#ifndef _MLIB_ADD_F16_ASM_H_ +#define _MLIB_ADD_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_AddSat_F16_Asmi(f16Add1, f16Add2) MLIB_AddSat_F16_FAsmi(f16Add1, f16Add2) + +/***************************************************************************//*! +* Saturated Addition +* Output = f16Add1 + f16Add2 +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_AddSat_F16_FAsmi(register frac16_t f16Add1, register frac16_t f16Add2) +{ + register frac32_t f32Val = 0x8000; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Add1, f16Add1 /* Transforms 16-bit input f16Add1 to 32-bit */ + sxth f16Add2, f16Add2 /* Transforms 16-bit input f16Add2 to 32-bit */ + adds f16Add1, f16Add2, f16Add1 /* f16Add1 = f16Add1 + f16Add2 */ + cmp f32Val, f16Add1 /* Compares f16Add1 with 0x8000 */ + bgt NegTest /* If f16Add1 < 0x8000, then goes to NegTest */ + subs f16Add1, f32Val, #1 /* If f16Add1 >= 0x8000, then f16Add1 = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + rsbs f32Val, f32Val, #0 /* f32Val = 0xFFFF8000 */ + cmp f32Val, f16Add1 /* Compares f16Add1 with 0xFFFF8000 */ + ble SatEnd /* If f16Add1 >= 0xFFFF8000, then goes to SatEnd */ + mov f16Add1, f32Val}; /* If f16Add1 < 0xFFFF8000, then f16Add1 = 0xFFFF8000 */ + SatEnd: + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Transforms 16-bit input f16Add1 to 32-bit */ + "sxth %2, %2 \n\t" /* Transforms 16-bit input f16Add2 to 32-bit */ + "adds %1, %2, %1 \n\t" /* f16Add1 = f16Add1 + f16Add2 */ + "cmp %0, %1 \n\t" /* Compares f16Add1 with 0x8000 */ + "bgt MLIB_AddSat_F16_NegTest%= \n\t" /* If f16Add1 <= 0x8000, then jumps through two commands */ + "subs %1, %0, #1 \n\t" /* If f16Add1 > 0x8000, then f16Add1 = 0x7FFF */ + "b MLIB_AddSat_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_AddSat_F16_NegTest%=: \n\t" + "rsbs %0, %0, #0 \n\t" /* f32Val = 0xFFFF8000 */ + "cmp %0, %1 \n\t" /* Compares f16Add1 with 0xFFFF8000 */ + "ble MLIB_AddSat_SatEnd%= \n\t" /* If f16Add1 >= 0xFFFF8000, then jumps through next commands */ + "mov %1, %0 \n\t" /* If f16Add1 < 0xFFFF8000, then f16Add1 = 0xFFFF8000 */ + "MLIB_AddSat_SatEnd%=: \n\t" + : "+l"(f32Val), "+l"(f16Add1), "+l"(f16Add2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Transforms 16-bit input f16Add1 to 32-bit */ + "sxth %2, %2 \n" /* Transforms 16-bit input f16Add2 to 32-bit */ + "adds %1, %2, %1 \n" /* f16Add1 = f16Add1 + f16Add2 */ + "cmp %0, %1 \n" /* Compares f16Add1 with 0x8000 */ + "bgt .+6 \n" /* If f16Add1 <= 0x8000, then jumps through two commands */ + "subs %1, %0, #1 \n" /* If f16Add1 > 0x8000, then f16Add1 = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + "rsbs %0, %0, #0 \n" /* f32Val = 0xFFFF8000 */ + "cmp %0, %1 \n" /* Compares f16Add1 with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Add1 >= 0xFFFF8000, then jumps through next commands */ + "mov %1, %0 \n" /* If f16Add1 < 0xFFFF8000, then f16Add1 = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(f16Add1), "+l"(f16Add2):); + #endif + + return f16Add1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /*_MLIB_ADD_F16_ASM_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F32.h new file mode 100644 index 0000000..bc2c8ab --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F32.h @@ -0,0 +1,87 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Addition +* +*******************************************************************************/ +#ifndef _MLIB_ADD_F32_H_ +#define _MLIB_ADD_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Add_F32_Ci(f32Add1, f32Add2) MLIB_Add_F32_FCi(f32Add1, f32Add2) +#define MLIB_AddSat_F32_Ci(f32Add1, f32Add2) MLIB_AddSat_F32_FCi(f32Add1, f32Add2) + +/***************************************************************************//*! +* Addition +* f32Out = f32Add1 + f32Add2 +* function is not saturated +*******************************************************************************/ +static inline frac32_t MLIB_Add_F32_FCi(register frac32_t f32Add1, register frac32_t f32Add2) +{ + return((frac32_t)(f32Add1 + f32Add2)); +} +/***************************************************************************//*! +* Saturated Addition +* f32Out = f32Add1 + f32Add2 +*******************************************************************************/ +static inline frac32_t MLIB_AddSat_F32_FCi(register frac32_t f32Add1, register frac32_t f32Add2) +{ + register int32_t i32z; + register uint32_t u32SatMin; + register uint32_t u32SatMax; + + i32z = f32Add1 + f32Add2; /* Addition without saturation to find saturation max. and min. */ + u32SatMax = ~((uint32_t)f32Add1 | (uint32_t)f32Add2); /* Saturation max. from addends and addition without sat. */ + u32SatMax = u32SatMax & (uint32_t)i32z; + u32SatMin = ((uint32_t)f32Add1 & (uint32_t)f32Add2); /* Saturation min. from addends and addition without sat. */ + u32SatMin = u32SatMin & (~(uint32_t)i32z); + + i32z = ((int32_t)u32SatMin < 0) ? (int32_t)0x80000000U : i32z; /* Low limit restriction */ + i32z = ((int32_t)u32SatMax < 0) ? (int32_t)0x7FFFFFFF : i32z; /* Hight limit restriction */ + return(i32z); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ADD_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F32_Asmi.h new file mode 100644 index 0000000..f56105a --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Add_F32_Asmi.h @@ -0,0 +1,130 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Addition +* +*******************************************************************************/ +#ifndef _MLIB_ADD_F32_ASM_H_ +#define _MLIB_ADD_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_AddSat_F32_Asmi(f32Add1, f32Add2) MLIB_AddSat_F32_FAsmi(f32Add1, f32Add2) + +/***************************************************************************//*! +* Saturated Addition +* Output = f32Add1 + f32Add2 +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_AddSat_F32_FAsmi(register frac32_t f32Add1, register frac32_t f32Add2) +{ + register frac32_t f32AddVal=0, f32SatVal=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ adds f32AddVal, f32Add1, f32Add2 /* f32AddVal = f32Add1 + f32Add2 */ + movs f32SatVal, f32Add1 /* f32SatVal = f32Add1 */ + eors f32SatVal, f32SatVal, f32Add2 /* f32SatVal = f32Add1 ^ f32Add2 */ + bmi SatEnd /* If f32SatVal < 0, then goes to the end of function */ + eors f32Add1, f32Add1, f32AddVal /* f32Add1 = f32Add1 ^ (f32Add1 + f32Add2) */ + bpl SatEnd /* If f32Add1 >= 0, then goes to the end of function */ + movs f32AddVal, #128 /* f32AddVal = 0x80 */ + lsls f32AddVal, f32AddVal, #24 /* f32AddVal = 0x80000000 */ + cmp f32Add2, #0 /* Compares f32Add2 with 0 */ + blt SatEnd /* If f32Add1 < 0, then goes to the end of function */ + subs f32AddVal, f32AddVal, #1 /* f32AddVal = 0x7FFFFFFF */ + SatEnd:}; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "adds %0, %1, %2 \n\t" /* f32AddVal = f32Add1 + f32Add2 */ + "movs %3, %1 \n\t" /* f32SatVal = f32Add1 */ + "eors %3, %3, %2 \n\t" /* f32SatVal = f32Add1 ^ f32Add2 */ + "bmi MLIB_AddSat_F32_SatEnd%= \n\t" /* If f32SatVal < 0, then goes to the end of function */ + "eors %1, %1, %0 \n\t" /* f32Add1 = f32Add1 ^ (f32Add1 + f32Add2) */ + "bpl MLIB_AddSat_F32_SatEnd%= \n\t" /* If f32Add1 >= 0, then goes to the end of function */ + "movs %0, #128 \n\t" /* f32AddVal = 0x80 */ + "lsls %0, %0, #24 \n\t" /* f32AddVal = 0x80000000 */ + "cmp %2, #0 \n\t" /* Compares f32Add2 with 0 */ + "blt MLIB_AddSat_F32_SatEnd%= \n\t" /* If f32Add1 < 0, then goes to the end of function */ + "subs %0, %0, #1 \n\t" /* f32AddVal = 0x7FFFFFFF */ + "MLIB_AddSat_F32_SatEnd%=: \n\t" + : "+l"(f32AddVal), "+l"(f32Add1), "+l"(f32Add2), "+l"(f32SatVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "adds %0, %1, %2 \n" /* f32AddVal = f32Add1 + f32Add2 */ + "movs %3, %1 \n" /* f32SatVal = f32Add1 */ + "eors %3, %3, %2 \n" /* f32SatVal = f32Add1 ^ f32Add2 */ + "bmi .+16 \n" /* If f32SatVal < 0, then goes to the end of function */ + "eors %1, %1, %0 \n" /* f32Add1 = f32Add1 ^ (f32Add1 + f32Add2) */ + "bpl .+12 \n" /* If f32Add1 >= 0, then goes to the end of function */ + "movs %0, #128 \n" /* f32AddVal = 0x80 */ + "lsls %0, %0, #24 \n" /* f32AddVal = 0x80000000 */ + "cmp %2, #0 \n" /* Compares f32Add2 with 0 */ + "blt .+4 \n" /* If f32Add1 < 0, then goes to the end of function */ + "subs %0, %0, #1 \n" /* f32AddVal = 0x7FFFFFFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32AddVal), "+l"(f32Add1), "+l"(f32Add2), "+l"(f32SatVal):); + #endif + + return f32AddVal; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_ADD_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F16.h new file mode 100644 index 0000000..4c946a9 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F16.h @@ -0,0 +1,83 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Shift +* +*******************************************************************************/ +#ifndef _MLIB_BISHIFT_F16_H_ +#define _MLIB_BISHIFT_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F16.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_ShLBi_F16_Ci(f16Val, i16Sh) MLIB_ShLBi_F16_FCi(f16Val, i16Sh) +#define MLIB_ShRBi_F16_Ci(f16Val, i16Sh) MLIB_ShRBi_F16_FCi(f16Val, i16Sh) + +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by the number of i16Sh to the left. +* If the i16Sh is negative, the input is shifted to the right. The function +* does not saturate the output. +* +*******************************************************************************/ +static inline frac16_t MLIB_ShLBi_F16_FCi(register frac16_t f16Val, register int16_t i16Sh) +{ + return (i16Sh<(int16_t)0) ? MLIB_ShR_F16_Ci(f16Val, (uint16_t)(-i16Sh)) : + MLIB_ShL_F16_Ci(f16Val, (uint16_t)(i16Sh)); +} +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by the number of i16Sh to the right. +* If the i16Sh is negative, the input is shifted to the left. The function +* does not saturate the output. +* +*******************************************************************************/ +static inline frac16_t MLIB_ShRBi_F16_FCi(register frac16_t f16Val, register int16_t i16Sh) +{ + return (i16Sh<(int16_t)0) ? MLIB_ShL_F16_Ci(f16Val, (uint16_t)(-i16Sh)) : + MLIB_ShR_F16_Ci(f16Val, (uint16_t)(i16Sh)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_BISHIFT_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F16_Asmi.h new file mode 100644 index 0000000..5b4d36e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F16_Asmi.h @@ -0,0 +1,298 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Shift +* +*******************************************************************************/ +#ifndef _MLIB_BISHIFT_F16_ASM_H_ +#define _MLIB_BISHIFT_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_ShLBiSat_F16_Asmi(f16Val, i16Sh) MLIB_ShLBiSat_F16_FAsmi(f16Val, i16Sh) +#define MLIB_ShRBiSat_F16_Asmi(f16Val, i16Sh) MLIB_ShRBiSat_F16_FAsmi(f16Val, i16Sh) + +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by the number of i16Sh to the left. +* If the i16Sh is negative, the input is shifted to the right. +* The function saturates the output. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_ShLBiSat_F16_FAsmi(register frac16_t f16Val, register int16_t i16Sh) +{ + register frac16_t f16SatVal=0, f16CmpVal=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Val, f16Val /* Converts 16-bit input to 32-bit*/ + sxth i16Sh, i16Sh /* Converts 16-bit input to 32-bit*/ + rsbs f16CmpVal, i16Sh, #0 /* f16CmpVal = - i16Sh */ + bmi LeftSh /* If i16Sh >= 0, then goes to LeftSh */ + asrs f16Val, f16Val, f16CmpVal /* f16Val = f16Val >> (-i16Sh) */ + b ShEnd /* Goes to ShEnd */ + LeftSh: + movs f16SatVal, #128 /* f16SatVal = 0x80 */ + lsls f16SatVal, f16SatVal, #8 /* f16SatVal = 0x00008000 */ + mov f16CmpVal, f16SatVal /* f16CmpVal = 0x00008000 */ + lsrs f16CmpVal, f16CmpVal, i16Sh /* f16CmpVal = f16CmpVal >> u16Sh */ + + cmp f16Val, f16CmpVal /* Compares f16Val with (0x00008000 >> u16Sh) */ + blt NegTest /* If f16Val < f16CmpVal, then goes to NegTest */ + subs f16Val, f16SatVal, #1 /* f16Val = 0x7FFF */ + b ShEnd + NegTest: + mvns f16CmpVal, f16SatVal /* f16CmpVal = 0xFFFF7FFF */ + asrs f16CmpVal, f16CmpVal, i16Sh /* f16CmpVal = f16CmpVal >> u16Sh */ + + cmp f16Val, f16CmpVal /* Compares f16Val with (0xFFFF7FFF >> u16Sh) */ + bgt NotSat /* If f16Val < f16CmpVal, then goes to NotSat */ + sxth f16Val, f16SatVal /* f16Val = 0xFFFF8000 */ + b ShEnd + NotSat: + lsls f16Val, f16Val, i16Sh /* f16CmpVal = f16CmpVal << u16Sh */ + ShEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit*/ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit*/ + "rsbs %2, %1, #0 \n\t" /* f16CmpVal = - i16Sh */ + "bmi MLIB_ShLBiSat_F16_LeftSh%= \n\t" /* If i16Sh >= 0, then jumps through two commands */ + "asrs %0, %0, %2 \n\t" /* f16Val = f16Val >> (-i16Sh) */ + "b MLIB_ShLBiSat_F16_ShEnd%= \n\t" /* Goes to the end of function */ + "MLIB_ShLBiSat_F16_LeftSh%=: \n\t" + "movs %3, #128 \n\t" /* f16SatVal = 0x80 */ + "lsls %3, %3, #8 \n\t" /* f16SatVal = 0x00008000 */ + "mov %2, %3 \n\t" /* f16CmpVal = 0x00008000 */ + "lsrs %2, %2, %1 \n\t" /* f16CmpVal = f16CmpVal >> u16Sh */ + + "cmp %0, %2 \n\t" /* Compares f16Val with (0x00008000 >> u16Sh) */ + "blt MLIB_ShLBiSat_F16_NegTest%= \n\t" /* If f16Val < f16CmpVal, then jumps through two commands */ + "subs %0, %3, #1 \n\t" /* f16Val = 0x7FFF */ + "b MLIB_ShLBiSat_F16_ShEnd%= \n\t" + "MLIB_ShLBiSat_F16_NegTest%=: \n\t" + "mvns %2, %3 \n\t" /* f16CmpVal = 0xFFFF7FFF */ + "asrs %2, %2, %1 \n\t" /* f16CmpVal = f16CmpVal >> u16Sh */ + + "cmp %0, %2 \n\t" /* Compares f16Val with (0xFFFF7FFF >> u16Sh) */ + "bgt MLIB_ShLBiSat_F16_NotSat%= \n\t" /* If f16Val < f16CmpVal, then jumps through two commands */ + "sxth %0, %3 \n\t" /* f16Val = 0xFFFF8000 */ + "b MLIB_ShLBiSat_F16_ShEnd%= \n\t" + "MLIB_ShLBiSat_F16_NotSat%=: \n\t" + "lsls %0, %0, %1 \n\t" /* f16CmpVal = f16CmpVal << u16Sh */ + "MLIB_ShLBiSat_F16_ShEnd%=: \n\t" + : "+l"(f16Val), "+l"(i16Sh), "+l"(f16CmpVal), "+l"(f16SatVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit*/ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit*/ + "rsbs %2, %1, #0 \n" /* f16CmpVal = - i16Sh */ + "bmi .+6 \n" /* If i16Sh >= 0, then jumps through two commands */ + "asrs %0, %0, %2 \n" /* f16Val = f16Val >> (-i16Sh) */ + "b .+32 \n" /* Goes to the end of function */ + + "movs %3, #128 \n" /* f16SatVal = 0x80 */ + "lsls %3, %3, #8 \n" /* f16SatVal = 0x00008000 */ + "mov %2, %3 \n" /* f16CmpVal = 0x00008000 */ + "lsrs %2, %2, %1 \n" /* f16CmpVal = f16CmpVal >> u16Sh */ + + "cmp %0, %2 \n" /* Compares f16Val with (0x00008000 >> u16Sh) */ + "blt .+6 \n" /* If f16Val < f16CmpVal, then jumps through two commands */ + "subs %0, %3, #1 \n" /* f16Val = 0x7FFF */ + "b .+16 \n" + + "mvns %2, %3 \n" /* f16CmpVal = 0xFFFF7FFF */ + "asrs %2, %2, %1 \n" /* f16CmpVal = f16CmpVal >> u16Sh */ + + "cmp %0, %2 \n" /* Compares f16Val with (0xFFFF7FFF >> u16Sh) */ + "bgt .+6 \n" /* If f16Val < f16CmpVal, then jumps through two commands */ + "sxth %0, %3 \n" /* f16Val = 0xFFFF8000 */ + "b .+4 \n" + "lsls %0, %0, %1 \n" /* f16CmpVal = f16CmpVal << u16Sh */ + + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Val), "+l"(i16Sh), "+l"(f16CmpVal), "+l"(f16SatVal):); + #endif + + return f16Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by the number of i16Sh to the right. +* If the i16Sh is negative, the input is shifted to the left. +* The function saturates the output. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_ShRBiSat_F16_FAsmi(register frac16_t f16Val, register int16_t i16Sh) +{ + register frac16_t f16SatVal=0, f16LSh=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Val, f16Val /* Converts 16-bit input to 32-bit*/ + sxth i16Sh, i16Sh /* Converts 16-bit input to 32-bit*/ + rsbs f16LSh, i16Sh, #0 /* f16LSh = - i16Sh */ + bpl LeftSh /* If i16Sh < 0, then goes to LeftSh */ + asrs f16Val, f16Val, i16Sh /* f16Val = f16Val >> (-i16Sh) */ + b ShEnd /* Goes to ShEnd */ + LeftSh: + movs f16SatVal, #128 /* f16SatVal = 0x80 */ + lsls f16SatVal, f16SatVal, #8 /* f16SatVal = 0x00008000 */ + mov i16Sh, f16SatVal /* i16Sh = 0x00008000 */ + lsrs i16Sh, i16Sh, f16LSh /* i16Sh = i16Sh >> f16LSh */ + + cmp f16Val, i16Sh /* Compares f16Val with (0x00008000 >> f16LSh) */ + blt NegTest /* If f16Val < i16Sh, then goes to NegTest */ + subs f16Val, f16SatVal, #1 /* f16Val = 0x7FFF */ + b ShEnd + NegTest: + mvns i16Sh, f16SatVal /* i16Sh = 0xFFFF7FFF */ + asrs i16Sh, i16Sh, f16LSh /* i16Sh = i16Sh >> f16LSh */ + + cmp f16Val, i16Sh /* Compares f16Val with (0xFFFF7FFF >> f16LSh) */ + bgt NotSat /* If f16Val < i16Sh, then goes to NotSat */ + sxth f16Val, f16SatVal /* f16Val = 0xFFFF8000 */ + b ShEnd + NotSat: + lsls f16Val, f16Val, f16LSh /* f16Val = f16Val << f16LSh */ + ShEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit*/ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit*/ + "rsbs %2, %1, #0 \n\t" /* f16LSh = - i16Sh */ + "bpl MLIB_ShRBiSat_F16_LeftSh%= \n\t" /* If i16Sh < 0, then jumps through three commands */ + "asrs %0, %0, %1 \n\t" /* f16Val = f16Val >> (-i16Sh) */ + "b MLIB_ShRBiSat_F16_ShEnd%= \n\t" /* Goes to the end of function */ + "MLIB_ShRBiSat_F16_LeftSh%=: \n\t" + "movs %3, #128 \n\t" /* f16SatVal = 0x80 */ + "lsls %3, %3, #8 \n\t" /* f16SatVal = 0x00008000 */ + "mov %1, %3 \n\t" /* i16Sh = 0x00008000 */ + "lsrs %1, %1, %2 \n\t" /* i16Sh = i16Sh >> f16LSh */ + + "cmp %0, %1 \n\t" /* Compares f16Val with (0x00008000 >> f16LSh) */ + "blt MLIB_ShRBiSat_F16_NegTest%= \n\t" /* If f16Val < i16Sh, then jumps through two commands */ + "subs %0, %3, #1 \n\t" /* f16Val = 0x7FFF */ + "b MLIB_ShRBiSat_F16_ShEnd%= \n\t" + "MLIB_ShRBiSat_F16_NegTest%=: \n\t" + "mvns %1, %3 \n\t" /* i16Sh = 0xFFFF7FFF */ + "asrs %1, %1, %2 \n\t" /* i16Sh = i16Sh >> f16LSh */ + + "cmp %0, %1 \n\t" /* Compares f16Val with (0xFFFF7FFF >> f16LSh) */ + "bgt MLIB_ShRBiSat_F16_NotSat%= \n\t" /* If f16Val < i16Sh, then jumps through two commands */ + "sxth %0, %3 \n\t" /* f16Val = 0xFFFF8000 */ + "b MLIB_ShRBiSat_F16_ShEnd%= \n\t" + "MLIB_ShRBiSat_F16_NotSat%=: \n\t" + "lsls %0, %0, %2 \n\t" /* f16Val = f16Val << f16LSh */ + "MLIB_ShRBiSat_F16_ShEnd%=: \n\t" + : "+l"(f16Val), "+l"(i16Sh), "+l"(f16LSh), "+l"(f16SatVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit*/ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit*/ + "rsbs %2, %1, #0 \n" /* f16LSh = - i16Sh */ + "bpl .+6 \n" /* If i16Sh < 0, then jumps through three commands */ + "asrs %0, %0, %1 \n" /* f16Val = f16Val >> (-i16Sh) */ + "b .+32 \n" /* Goes to the end of function */ + + "movs %3, #128 \n" /* f16SatVal = 0x80 */ + "lsls %3, %3, #8 \n" /* f16SatVal = 0x00008000 */ + "mov %1, %3 \n" /* i16Sh = 0x00008000 */ + "lsrs %1, %1, %2 \n" /* i16Sh = i16Sh >> f16LSh */ + + "cmp %0, %1 \n" /* Compares f16Val with (0x00008000 >> f16LSh) */ + "blt .+6 \n" /* If f16Val < i16Sh, then jumps through two commands */ + "subs %0, %3, #1 \n" /* f16Val = 0x7FFF */ + "b .+16 \n" + + "mvns %1, %3 \n" /* i16Sh = 0xFFFF7FFF */ + "asrs %1, %1, %2 \n" /* i16Sh = i16Sh >> f16LSh */ + + "cmp %0, %1 \n" /* Compares f16Val with (0xFFFF7FFF >> f16LSh) */ + "bgt .+6 \n" /* If f16Val < i16Sh, then jumps through two commands */ + "sxth %0, %3 \n" /* f16Val = 0xFFFF8000 */ + "b .+4 \n" + "lsls %0, %0, %2 \n" /* f16Val = f16Val << f16LSh */ + + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Val), "+l"(i16Sh), "+l"(f16LSh), "+l"(f16SatVal):); + #endif + + return f16Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_BISHIFT_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F32.h new file mode 100644 index 0000000..c879b6b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F32.h @@ -0,0 +1,83 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Shift +* +*******************************************************************************/ +#ifndef _MLIB_BISHIFT_F32_H_ +#define _MLIB_BISHIFT_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_ShLBi_F32_Ci(f32Val, i16Sh) MLIB_ShLBi_F32_FCi(f32Val, i16Sh) +#define MLIB_ShRBi_F32_Ci(f32Val, i16Sh) MLIB_ShRBi_F32_FCi(f32Val, i16Sh) + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by the number of i16Sh to the left. +* If the i16Sh is negative, the input is shifted to the right. The function +* does not saturate the output. +* +*******************************************************************************/ +static inline frac32_t MLIB_ShLBi_F32_FCi(register frac32_t f32Val, register int16_t i16Sh) +{ + return (i16Sh<(int16_t)0) ? MLIB_ShR_F32_Ci(f32Val, (uint16_t)(-i16Sh)) : + MLIB_ShL_F32_Ci(f32Val, (uint16_t)(i16Sh)); +} +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by the number of i16Sh to the right. +* If the i16Sh is negative, the input is shifted to the left. The function +* does not saturate the output. +* +*******************************************************************************/ +static inline frac32_t MLIB_ShRBi_F32_FCi(register frac32_t f32Val, register int16_t i16Sh) +{ + return (i16Sh<(int16_t)0) ? MLIB_ShL_F32_Ci(f32Val, (uint16_t)(-i16Sh)) : + MLIB_ShR_F32_Ci(f32Val, (uint16_t)(i16Sh)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_BISHIFT_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F32_Asmi.h new file mode 100644 index 0000000..f15c9bf --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_BiShift_F32_Asmi.h @@ -0,0 +1,293 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Shift +* +*******************************************************************************/ +#ifndef _MLIB_BISHIFT_F32_ASM_H_ +#define _MLIB_BISHIFT_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_ShLBiSat_F32_Asmi(f32Val, i16Sh) MLIB_ShLBiSat_F32_FAsmi(f32Val, i16Sh) +#define MLIB_ShRBiSat_F32_Asmi(f32Val, i16Sh) MLIB_ShRBiSat_F32_FAsmi(f32Val, i16Sh) + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by the number of i16Sh to the left. +* If the i16Sh is negative, the input is shifted to the right. +* The function saturates the output. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_ShLBiSat_F32_Asmi(register frac32_t f32Val, register int16_t i16Sh) +{ + register frac32_t f32SatVal=0, f32CmpVal=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth i16Sh, i16Sh /* Converts 16-bit input to 32-bit*/ + rsbs f32CmpVal, i16Sh, #0 /* f32CmpVal = - i16Sh */ + bmi LeftSh /* If i16Sh >= 0, then goes to LeftSh */ + asrs f32Val, f32Val, f32CmpVal /* f32Val = f32Val >> (-i16Sh) */ + b ShEnd /* Goes to ShEnd */ + LeftSh: + movs f32SatVal, #128 /* f32SatVal = 0x80 */ + rev f32SatVal, f32SatVal /* f32SatVal = 0x80000000 */ + subs f32CmpVal, f32SatVal, #1 /* f32CmpVal = 0x7FFFFFFF */ + asrs f32CmpVal, f32CmpVal, i16Sh /* f32CmpVal = f32CmpVal >> u16Sh */ + + cmp f32Val, f32CmpVal /* Compares f32Val with (0x7FFFFFFF >> u16Sh) */ + ble NegTest /* If f32Val <= f32CmpVal, then goes to NegTest */ + subs f32Val, f32SatVal, #1 /* f32Val = 0x7FFF */ + b ShEnd + NegTest: + mov f32CmpVal, f32SatVal /* f32CmpVal = 0x80000000 */ + asrs f32CmpVal, f32CmpVal, i16Sh /* f32CmpVal = f32CmpVal >> u16Sh */ + + cmp f32Val, f32CmpVal /* Compares f32Val with (0x80000000 >> u16Sh) */ + bgt NotSat /* If f32Val < f32CmpVal, then goes to NotSat */ + mov f32Val, f32SatVal /* f32Val = 0x80000000 */ + b ShEnd + NotSat: + lsls f32Val, f32Val, i16Sh /* f32Val = f32Val << u16Sh */ + ShEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit*/ + "rsbs %2, %1, #0 \n\t" /* f32CmpVal = - i16Sh */ + "bmi MLIB_ShLBiSat_F32_LeftSh%= \n\t" /* If i16Sh >= 0, then jumps through two commands */ + "asrs %0, %0, %2 \n\t" /* f32Val = f32Val >> (-i16Sh) */ + "b MLIB_ShLBiSat_F32_ShEnd%= \n\t" /* Goes to the end of function */ + "MLIB_ShLBiSat_F32_LeftSh%=: \n\t" + "movs %3, #128 \n\t" /* f32SatVal = 0x80 */ + "rev %3, %3 \n\t" /* f32SatVal = 0x80000000 */ + "subs %2, %3, #1 \n\t" /* f32CmpVal = 0x7FFFFFFF */ + "asrs %2, %2, %1 \n\t" /* f32CmpVal = f32CmpVal >> u16Sh */ + + "cmp %0, %2 \n\t" /* Compares f32Val with (0x7FFFFFFF >> u16Sh) */ + "ble MLIB_ShLBiSat_F32_NegTest%= \n\t" /* If f32Val <= f32CmpVal, then jumps through two commands */ + "subs %0, %3, #1 \n\t" /* f32Val = 0x7FFF */ + "b MLIB_ShLBiSat_F32_ShEnd%= \n\t" + "MLIB_ShLBiSat_F32_NegTest%=: \n\t" + "mov %2, %3 \n\t" /* f32CmpVal = 0x80000000 */ + "asrs %2, %2, %1 \n\t" /* f32CmpVal = f32CmpVal >> u16Sh */ + + "cmp %0, %2 \n\t" /* Compares f32Val with (0x80000000 >> u16Sh) */ + "bgt MLIB_ShLBiSat_F32_NotSat%= \n\t" /* If f32Val < f32CmpVal, then jumps through two commands */ + "mov %0, %3 \n\t" /* f32Val = 0x80000000 */ + "b MLIB_ShLBiSat_F32_ShEnd%= \n\t" + "MLIB_ShLBiSat_F32_NotSat%=: \n\t" + "lsls %0, %0, %1 \n\t" /* f32Val = f32Val << u16Sh */ + "MLIB_ShLBiSat_F32_ShEnd%=: \n\t" + + : "+l"(f32Val), "+l"(i16Sh), "+l"(f32CmpVal), "+l"(f32SatVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit*/ + "rsbs %2, %1, #0 \n" /* f32CmpVal = - i16Sh */ + "bmi .+6 \n" /* If i16Sh >= 0, then jumps through two commands */ + "asrs %0, %0, %2 \n" /* f32Val = f32Val >> (-i16Sh) */ + "b .+32 \n" /* Goes to the end of function */ + + "movs %3, #128 \n" /* f32SatVal = 0x80 */ + "rev %3, %3 \n" /* f32SatVal = 0x80000000 */ + "subs %2, %3, #1 \n" /* f32CmpVal = 0x7FFFFFFF */ + "asrs %2, %2, %1 \n" /* f32CmpVal = f32CmpVal >> u16Sh */ + + "cmp %0, %2 \n" /* Compares f32Val with (0x7FFFFFFF >> u16Sh) */ + "ble .+6 \n" /* If f32Val <= f32CmpVal, then jumps through two commands */ + "subs %0, %3, #1 \n" /* f32Val = 0x7FFF */ + "b .+16 \n" + + "mov %2, %3 \n" /* f32CmpVal = 0x80000000 */ + "asrs %2, %2, %1 \n" /* f32CmpVal = f32CmpVal >> u16Sh */ + + "cmp %0, %2 \n" /* Compares f32Val with (0x80000000 >> u16Sh) */ + "bgt .+6 \n" /* If f32Val < f32CmpVal, then jumps through two commands */ + "mov %0, %3 \n" /* f32Val = 0x80000000 */ + "b .+4 \n" + "lsls %0, %0, %1 \n" /* f32Val = f32Val << u16Sh */ + + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(i16Sh), "+l"(f32CmpVal), "+l"(f32SatVal):); + #endif + + return f32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by the number of i16Sh to the right. +* If the i16Sh is negative, the input is shifted to the left. +* The function saturates the output. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_ShRBiSat_F32_FAsmi(register frac32_t f32Val, register int16_t i16Sh) +{ + register int16_t i16LSh=0; + register frac32_t f32SatVal=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth i16Sh, i16Sh /* Converts 16-bit input to 32-bit*/ + rsbs i16LSh, i16Sh, #0 /* i16LSh = - i16Sh */ + bpl LeftSh /* If i16Sh < 0, then goes to LeftSh */ + asrs f32Val, f32Val, i16Sh /* f32Val = f32Val >> (-i16Sh) */ + b ShEnd /* Goes to ShEnd */ + LeftSh: + movs f32SatVal, #128 /* f32SatVal = 0x80 */ + rev f32SatVal, f32SatVal /* f32SatVal = 0x80000000 */ + subs i16Sh, f32SatVal, #1 /* i16Sh = 0x7FFFFFFF */ + asrs i16Sh, i16Sh, i16LSh /* i16Sh = 0x7FFFFFFF >> i16LSh */ + + cmp f32Val, i16Sh /* Compares f32Val with (0x7FFFFFFF >> i16LSh) */ + ble NegTest /* If f32Val <= i16Sh, then go to NegTest */ + subs f32Val, f32SatVal, #1 /* f32Val = 0x7FFF */ + b ShEnd + NegTest: + mov i16Sh, f32SatVal /* i16Sh = 0x80000000 */ + asrs i16Sh, i16Sh, i16LSh /* i16Sh = 0x80000000 >> i16LSh */ + + cmp f32Val, i16Sh /* Compares f32Val with (0x80000000 >> i16LSh) */ + bgt NotSat /* If f32Val < i16Sh, then goes to NotSat */ + mov f32Val, f32SatVal /* f32Val = 0x80000000 */ + b ShEnd + NotSat: + lsls f32Val, f32Val, i16LSh /* f32Val = f32Val << i16LSh */ + ShEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit*/ + "rsbs %2, %1, #0 \n\t" /* i16LSh = - i16Sh */ + "bpl MLIB_ShRBiSat_F32_LeftSh%= \n\t" /* If i16Sh < 0, then jumps through three commands */ + "asrs %0, %0, %1 \n\t" /* f32Val = f32Val >> (-i16Sh) */ + "b MLIB_ShRBiSat_F32_ShEnd%= \n\t" /* Goes to the end of function */ + "MLIB_ShRBiSat_F32_LeftSh%=: \n\t" + "movs %3, #128 \n\t" /* f32SatVal = 0x80 */ + "rev %3, %3 \n\t" /* f32SatVal = 0x80000000 */ + "subs %1, %3, #1 \n\t" /* i16Sh = 0x7FFFFFFF */ + "asrs %1, %1, %2 \n\t" /* i16Sh = 0x7FFFFFFF >> i16LSh */ + + "cmp %0, %1 \n\t" /* Compares f32Val with (0x7FFFFFFF >> i16LSh) */ + "ble MLIB_ShRBiSat_F32_NegTest%= \n\t" /* If f32Val <= i16Sh, then jumps through two commands */ + "subs %0, %3, #1 \n\t" /* f32Val = 0x7FFF */ + "b MLIB_ShRBiSat_F32_ShEnd%= \n\t" + "MLIB_ShRBiSat_F32_NegTest%=: \n\t" + "mov %1, %3 \n\t" /* i16Sh = 0x80000000 */ + "asrs %1, %1, %2 \n\t" /* i16Sh = 0x80000000 >> i16LSh */ + + "cmp %0, %1 \n\t" /* Compares f32Val with (0x80000000 >> i16LSh) */ + "bgt MLIB_ShRBiSat_F32_NotSat%= \n\t" /* If f32Val < i16Sh, then jumps through two commands */ + "mov %0, %3 \n\t" /* f32Val = 0x80000000 */ + "b MLIB_ShRBiSat_F32_ShEnd%= \n\t" + "MLIB_ShRBiSat_F32_NotSat%=: \n\t" + "lsls %0, %0, %2 \n\t" /* f32Val = f32Val << i16LSh */ + "MLIB_ShRBiSat_F32_ShEnd%=: \n\t" + : "+l"(f32Val), "+l"(i16Sh), "+l"(i16LSh), "+l"(f32SatVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit*/ + "rsbs %2, %1, #0 \n" /* i16LSh = - i16Sh */ + "bpl .+6 \n" /* If i16Sh < 0, then jumps through three commands */ + "asrs %0, %0, %1 \n" /* f32Val = f32Val >> (-i16Sh) */ + "b .+32 \n" /* Goes to the end of function */ + + "movs %3, #128 \n" /* f32SatVal = 0x80 */ + "rev %3, %3 \n" /* f32SatVal = 0x80000000 */ + "subs %1, %3, #1 \n" /* i16Sh = 0x7FFFFFFF */ + "asrs %1, %1, %2 \n" /* i16Sh = 0x7FFFFFFF >> i16LSh */ + + "cmp %0, %1 \n" /* Compares f32Val with (0x7FFFFFFF >> i16LSh) */ + "ble .+6 \n" /* If f32Val <= i16Sh, then jumps through two commands */ + "subs %0, %3, #1 \n" /* f32Val = 0x7FFF */ + "b .+16 \n" + + "mov %1, %3 \n" /* i16Sh = 0x80000000 */ + "asrs %1, %1, %2 \n" /* i16Sh = 0x80000000 >> i16LSh */ + + "cmp %0, %1 \n" /* Compares f32Val with (0x80000000 >> i16LSh) */ + "bgt .+6 \n" /* If f32Val < i16Sh, then jumps through two commands */ + "mov %0, %3 \n" /* f32Val = 0x80000000 */ + "b .+4 \n" + "lsls %0, %0, %2 \n" /* f32Val = f32Val << i16LSh */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(i16Sh), "+l"(i16LSh), "+l"(f32SatVal):); + #endif + + return f32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_BISHIFT_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Clb_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Clb_F16_Asmi.h new file mode 100644 index 0000000..325fb59 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Clb_F16_Asmi.h @@ -0,0 +1,169 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Count of leading bits +* +*******************************************************************************/ +#ifndef _MLIB_CLB_F16_ASM_H_ +#define _MLIB_CLB_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Clb_U16s_Asmi(f16Val) MLIB_Clb_U16s_FAsmi(f16Val) + +/***************************************************************************//*! +* Count of leading bits +* - first, if input < 0, the Bitwise NOT of the input is calculated +* - then the amount of zero bits before the first non-zero bits is counted (sign bit is not included) +****************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline uint16_t MLIB_Clb_U16s_FAsmi(register frac16_t f16Val) +{ + register frac16_t f16Clb = 0; /* Initialization of f16Clb */ + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Val, f16Val /* Transforms 16-bit input to 32-bit */ + cmp f16Val, #0 /* Compares f16Val with 0 */ + bgt NotNeg /* If f16Val > 0, then goes to NotNeg */ + mvns f16Val, f16Val /* If f16Val <= 0, then Bitwise NOT of f16Val */ + bne NotNeg /* If f16Val <> 0, then go to NotNeg */ + subs f16Val, f16Val, #1 /* f16Val = f16Val - 1 */ + NotNeg: + cmp f16Val, #0xFF /* Compares f16Val with 0xFF */ + ble Cmp1 /* If f16Val <= 0xFF, then goes to Cmp1 */ + movs f16Clb, #8 /* f16Clb = 8 */ + lsrs f16Val, f16Val, #8 /* f16Val >> 8 */ + Cmp1: + cmp f16Val, #0xF /* Compares f16Val with 0xF */ + ble Cmp2 /* If f16Val <= 0xF, then goes to Cmp2 */ + adds f16Clb, #4 /* f16Clb = f16Clb + 4 */ + lsrs f16Val, f16Val, #4 /* f16Val >> 4 */ + Cmp2: + cmp f16Val, #0x3 /* Compares f16Val with 0x3 */ + ble Cmp3 /* If f16Val <= 0x3, then goes to Cmp3 */ + adds f16Clb, #2 /* f16Clb = f16Clb + 2 */ + lsrs f16Val, f16Val, #2 /* f16Val >> 2 */ + Cmp3: + lsrs f16Val, f16Val, #1 /* f16Val >> 1 */ + orrs f16Clb, f16Clb, f16Val /* f16Clb = f16Clb |= f16Val */ + movs f16Val, #14 /* f16Val = 14 */ + subs f16Val, f16Val, f16Clb}; /* f16Val = 14 - f16Clb */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Transforms 16-bit input to 32-bit */ + "cmp %0,#0 \n\t" /* Compares f16Val with 0 */ + "bgt MLIB_Clb_U16s_NotNeg%= \n\t" /* If f16Val > 0, then jumps through three commands */ + "mvns %0, %0 \n\t" /* If f16Val <= 0, then Bitwise NOT of f16Val */ + "bne MLIB_Clb_U16s_NotNeg%= \n\t" /* If f16Val <> 0, then jumps through the next command */ + "subs %0, %0, #1 \n\t" /* f16Val = f16Val - 1 */ + "MLIB_Clb_U16s_NotNeg%=: \n\t" + "cmp %0, #0xFF \n\t" /* Compares f16Val with 0xFF */ + "ble MLIB_Clb_U16s_Cmp1%= \n\t" /* If f16Val <= 0xFF, then jumps through two commands */ + "movs %1, #8 \n\t" /* f16Clb = f16Clb + 8 */ + "lsrs %0, %0, #8 \n\t" /* f16Val >> 8 */ + "MLIB_Clb_U16s_Cmp1%=: \n\t" + "cmp %0, #0xF \n\t" /* Compares f16Val with 0xF */ + "ble MLIB_Clb_U16s_Cmp2%= \n\t" /* If f16Val <= 0xF, then jumps through two commands */ + "adds %1, #4 \n\t" /* f16Clb = f16Clb + 4 */ + "lsrs %0, %0, #4 \n\t" /* f16Val >> 4 */ + "MLIB_Clb_U16s_Cmp2%=: \n\t" + "cmp %0, #0x3 \n\t" /* Compares f16Val with 0x3 */ + "ble MLIB_Clb_U16s_Cmp3%= \n\t" /* If f16Val <= 0x3, then jumps through two commands */ + "adds %1, #2 \n\t" /* f16Clb = f16Clb + 2 */ + "lsrs %0, %0, #2 \n\t" /* f16Val >> 2 */ + "MLIB_Clb_U16s_Cmp3%=: \n\t" + "lsrs %0, %0, #1 \n\t" /* f16Val >> 1 */ + "orrs %1, %1, %0 \n\t" /* f16Clb = f16Clb | f16Val */ + "movs %0, #14 \n\t" /* f16Val = 14 */ + "subs %0, %0, %1 \n\t" /* f16Val = 14 - f16Clb */ + + : "+l"(f16Val), "+l"(f16Clb):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Transforms 16-bit input to 32-bit */ + "cmp %0,#0 \n" /* Compares f16Val with 0 */ + "bgt .+8 \n" /* If f16Val > 0, then jumps through three commands */ + "mvns %0, %0 \n" /* If f16Val <= 0, then Bitwise NOT of f16Val */ + "bne .+4 \n" /* If f16Val <> 0, then jumps through the next command */ + "subs %0, %0, #1 \n" /* f16Val = f16Val - 1 */ + + "cmp %0, #0xFF \n" /* Compares f16Val with 0xFF */ + "ble .+6 \n" /* If f16Val <= 0xFF, then jumps through two commands */ + "movs %1, #8 \n" /* f16Clb = f16Clb + 8 */ + "lsrs %0, %0, #8 \n" /* f16Val >> 8 */ + + "cmp %0, #0xF \n" /* Compares f16Val with 0xF */ + "ble .+6 \n" /* If f16Val <= 0xF, then jumps through two commands */ + "adds %1, #4 \n" /* f16Clb = f16Clb + 4 */ + "lsrs %0, %0, #4 \n" /* f16Val >> 4 */ + + "cmp %0, #0x3 \n" /* Compares f16Val with 0x3 */ + "ble .+6 \n" /* If f16Val <= 0x3, then jumps through two commands */ + "adds %1, #2 \n" /* f16Clb = f16Clb + 2 */ + "lsrs %0, %0, #2 \n" /* f16Val >> 2 */ + + "lsrs %0, %0, #1 \n" /* f16Val >> 1 */ + "orrs %1, %1, %0 \n" /* f16Clb = f16Clb | f16Val */ + + "movs %0, #14 \n" /* f16Val = 14 */ + "subs %0, %0, %1 \n" /* f16Val = 14 - f16Clb */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Val), "+l"(f16Clb):); + #endif + + return (uint16_t)f16Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_CLB_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Clb_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Clb_F32_Asmi.h new file mode 100644 index 0000000..01062d2 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Clb_F32_Asmi.h @@ -0,0 +1,182 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Count of leading bits +* +*******************************************************************************/ +#ifndef _MLIB_CLB_F32_ASM_H_ +#define _MLIB_CLB_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Clb_U16l_Asmi(f32Val) MLIB_Clb_U16l_FAsmi(f32Val) + +/***************************************************************************//*! +* Count of leading bits +* - first, if input < 0, the Bitwise NOT of the input is calculated +* - then the amount of zero bits before the first non-zero bits is counted (sign bit is not included) +****************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline uint16_t MLIB_Clb_U16l_FAsmi (register frac32_t f32Val) +{ + register frac32_t f32Clb = 0; /* Initialization of f32Clb */ + register frac32_t f32CompVal = 0xFFFF; /* Initialization of f32CompVal */ + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ cmp f32Val,#0 /* Compares f32Val with 0 */ + bgt NotNeg /* If f32Val > 0, then go to NotNeg */ + mvns f32Val, f32Val /* If f32Val <= 0, then Bitwise NOT of f32Val */ + bne NotNeg /* If f32Val <> 0, then go to NotNeg */ + subs f32Val, f32Val, #1 /* f32Val = f32Val - 1 */ + NotNeg: + cmp f32Val, f32CompVal /* Compares f32Val with 0xFFFF */ + ble Cmp1 /* If f32Val <= 0xFF, then goes to Cmp1 */ + movs f32Clb, #16 /* f32Clb = 16 */ + lsrs f32Val, f32Val, #16 /* f32Val >> 16 */ + Cmp1: + cmp f32Val, #0xFF /* Compares f32Val with 0xFF */ + ble Cmp2 /* If f32Val <= 0xFF, then goes to Cmp2 */ + adds f32Clb, #8 /* f32Clb = f32Clb + 8 */ + lsrs f32Val, f32Val, #8 /* f32Val >> 8 */ + Cmp2: + cmp f32Val, #0xF /* Compares f32Val with 0xF */ + ble Cmp3 /* If f32Val <= 0xFF, then goes to Cmp3 */ + adds f32Clb, #4 /* f32Clb = f32Clb + 4 */ + lsrs f32Val, f32Val, #4 /* f32Val >> 4 */ + Cmp3: + cmp f32Val, #0x3 /* Compares f32Val with 0x3 */ + ble Cmp4 /* If f32Val <= 0xFF, then goes to Cmp4 */ + adds f32Clb, #2 /* f32Clb = f32Clb + 2 */ + lsrs f32Val, f32Val, #2 /* f32Val >> 2 */ + Cmp4: + lsrs f32Val, f32Val, #1 /* f32Val >> 1 */ + orrs f32Clb, f32Clb, f32Val /* f32Clb = f32Clb |= f32Val */ + movs f32Val, #30 /* f32Val = 30 */ + subs f32Val, f32Val, f32Clb}; /* f32Val = 30 - f32Clb */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "cmp %0,#0 \n\t" /* Compares f32Val with 0 */ + "bgt MLIB_Clb_U16l_NotNeg%= \n\t" /* If f32Val > 0, then jumps through three commands */ + "mvns %0, %0 \n\t" /* If f32Val <= 0, then Bitwise NOT of f32Val */ + "bne MLIB_Clb_U16l_NotNeg%= \n\t" /* If f32Val <> 0, then jumps through the next command */ + "subs %0, %0, #1 \n\t" /* f32Val = f32Val - 1 */ + "MLIB_Clb_U16l_NotNeg%=: \n\t" + "cmp %0, %2 \n\t" /* Compares f32Val with 0xFFFF */ + "ble MLIB_Clb_U16l_Cmp1%= \n\t" /* If f32Val <= 0xFFFF, then jumps through two commands */ + "movs %1, #16 \n\t" /* f32Clb = 16 */ + "lsrs %0, %0, #16 \n\t" /* f32Val >> 16 */ + "MLIB_Clb_U16l_Cmp1%=: \n\t" + "cmp %0, #0xFF \n\t" /* Compares f32Val with 0xFF */ + "ble MLIB_Clb_U16l_Cmp2%= \n\t" /* If f32Val <= 0xFF, then jumps through two commands */ + "adds %1, #8 \n\t" /* f32Clb = f32Clb + 8 */ + "lsrs %0, %0, #8 \n\t" /* f32Val >> 8 */ + "MLIB_Clb_U16l_Cmp2%=: \n\t" + "cmp %0, #0xF \n\t" /* Compares f32Val with 0xF */ + "ble MLIB_Clb_U16l_Cmp3%= \n\t" /* If f32Val <= 0xF, then jumps through two commands */ + "adds %1, #4 \n\t" /* f32Clb = f32Clb + 4 */ + "lsrs %0, %0, #4 \n\t" /* f32Val >> 4 */ + "MLIB_Clb_U16l_Cmp3%=: \n\t" + "cmp %0, #0x3 \n\t" /* Compares f32Val with 0x3 */ + "ble MLIB_Clb_U16l_Cmp4%= \n\t" /* If f32Val <= 0x3, then jumps through two commands */ + "adds %1, #2 \n\t" /* f32Clb = f32Clb + 2 */ + "lsrs %0, %0, #2 \n\t" /* f32Val >> 2 */ + "MLIB_Clb_U16l_Cmp4%=: \n\t" + "lsrs %0, %0, #1 \n\t" /* f32Val >> 1 */ + "orrs %1, %1, %0 \n\t" /* f32Clb = f32Clb |= f32Val */ + "movs %0, #30 \n\t" /* f32Val = 30 */ + "subs %0, %0, %1 \n\t" /* f32Val = 30 - f32Clb */ + + : "+l"(f32Val), "+l"(f32Clb): "l"(f32CompVal)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC Compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "cmp %0,#0 \n" /* Compares f32Val with 0 */ + "bgt .+8 \n" /* If f32Val > 0, then jumps through three commands */ + "mvns %0, %0 \n" /* If f32Val <= 0, then Bitwise NOT of f32Val */ + "bne .+4 \n" /* If f32Val <> 0, then jumps through the next command */ + "subs %0, %0, #1 \n" /* f32Val = f32Val - 1 */ + + "cmp %0, %2 \n" /* Compares f32Val with 0xFFFF */ + "ble .+6 \n" /* If f32Val <= 0xFFFF, then jumps through two commands */ + "movs %1, #16 \n" /* f32Clb = 16 */ + "lsrs %0, %0, #16 \n" /* f32Val >> 16 */ + + "cmp %0, #0xFF \n" /* Compares f32Val with 0xFF */ + "ble .+6 \n" /* If f32Val <= 0xFF, then jumps through two commands */ + "adds %1, #8 \n" /* f32Clb = f32Clb + 8 */ + "lsrs %0, %0, #8 \n" /* f32Val >> 8 */ + + "cmp %0, #0xF \n" /* Compares f32Val with 0xF */ + "ble .+6 \n" /* If f32Val <= 0xF, then jumps through two commands */ + "adds %1, #4 \n" /* f32Clb = f32Clb + 4 */ + "lsrs %0, %0, #4 \n" /* f32Val >> 4 */ + + "cmp %0, #0x3 \n" /* Compares f32Val with 0x3 */ + "ble .+6 \n" /* If f32Val <= 0x3, then jumps through two commands */ + "adds %1, #2 \n" /* f32Clb = f32Clb + 2 */ + "lsrs %0, %0, #2 \n" /* f32Val >> 2 */ + + "lsrs %0, %0, #1 \n" /* f32Val >> 1 */ + "orrs %1, %1, %0 \n" /* f32Clb = f32Clb |= f32Val */ + + "movs %0, #30 \n" /* f32Val = 30 */ + "subs %0, %0, %1 \n" /* f32Val = 30 - f32Clb */ + #if defined(__GNUC__) /* For GCC Compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(f32Clb): "l"(f32CompVal)); + #endif + + return (uint16_t)f32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_CLB_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Conv_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Conv_F32.h new file mode 100644 index 0000000..eca4e66 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Conv_F32.h @@ -0,0 +1,94 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Conversion functions +* +*******************************************************************************/ +#ifndef _MLIB_CONV_F32_H_ +#define _MLIB_CONV_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Conv_F32s_Ci(f16Val) MLIB_Conv_F32s_FCi(f16Val) +#define MLIB_Conv_F16l_Ci(f32Val) MLIB_Conv_F16l_FCi(f32Val) + +/***************************************************************************//*! +* +* @brief 16-bit fractional to 32-bit fractional convert function +* +* @param in frac16_t f16Val - Argument in <-1;1) in frac16_t +* +* @return This function returns - frac32_t value <-1;1) +* +* @remarks This function convert the lower 16-bits of the 32-bit input and +* returns the upper 16-bit. +* +*******************************************************************************/ +static inline frac32_t MLIB_Conv_F32s_FCi(register frac16_t f16Val) +{ + register uint32_t ui32temp = (uint32_t)f16Val << 16U; + return (frac32_t)ui32temp; +} + +/***************************************************************************//*! +* +* @brief 32-bit fractional to 16-bit fractional convert function +* +* @param in frac32_t f32Val - Argument in <-1;1) in frac32_t +* +* @return This function returns - frac16_t value <-1;1) +* +* @remarks This function convert the lower 16-bits of the 32-bit input and +* returns the upper 16-bit. +* +*******************************************************************************/ +static inline frac16_t MLIB_Conv_F16l_FCi(register frac32_t f32Val) +{ + register uint16_t u16Temp = (uint16_t)((uint32_t)f32Val >> 16U); + return (frac16_t)u16Temp; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_CONV_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div1Q_A32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div1Q_A32_Asm.h new file mode 100644 index 0000000..027b442 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div1Q_A32_Asm.h @@ -0,0 +1,66 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Unsigned division +* +*******************************************************************************/ +#ifndef _MLIB_DIV1Q_A32_ASM_H_ +#define _MLIB_DIV1Q_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Div1Q_A32ss_Asm(f16Num, f16Denom) MLIB_Div1Q_A32ss_FAsm(f16Num, f16Denom) +#define MLIB_Div1Q_A32ls_Asm(f32Num, f16Denom) MLIB_Div1Q_A32ls_FAsm(f32Num, f16Denom) +#define MLIB_Div1Q_A32ll_Asm(f32Num, f32Denom) MLIB_Div1Q_A32ll_FAsm(f32Num, f32Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern acc32_t MLIB_Div1Q_A32ll_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern acc32_t MLIB_Div1Q_A32ss_FAsm(frac16_t f16Num, frac16_t f16Denom); +extern acc32_t MLIB_Div1Q_A32ls_FAsm(frac32_t f32Num, frac16_t f16Denom); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIV1Q_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div1Q_F16_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div1Q_F16_Asm.h new file mode 100644 index 0000000..08b3ce3 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div1Q_F16_Asm.h @@ -0,0 +1,64 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Unsigned division +* +*******************************************************************************/ +#ifndef _MLIB_DIV1Q_F16_ASM_H_ +#define _MLIB_DIV1Q_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Div1Q_F16_Asm(f16Num, f16Denom) MLIB_Div1Q_F16_FAsm(f16Num, f16Denom) +#define MLIB_Div1QSat_F16_Asm(f16Num, f16Denom) MLIB_Div1QSat_F16_FAsm(f16Num, f16Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t MLIB_Div1Q_F16_FAsm(frac16_t f16Num, frac16_t f16Denom); +extern frac16_t MLIB_Div1QSat_F16_FAsm(frac16_t f16Num, frac16_t f16Denom); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIV1Q_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div1Q_F32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div1Q_F32_Asm.h new file mode 100644 index 0000000..91f7855 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div1Q_F32_Asm.h @@ -0,0 +1,76 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Unsigned division +* +*******************************************************************************/ +#ifndef _MLIB_DIV1Q_F32_ASM_H_ +#define _MLIB_DIV1Q_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Div1Q_F32_Asm(f32Num, f32Denom) MLIB_Div1Q_F32_FAsm(f32Num, f32Denom) +#define MLIB_Div1Q_F32ls_Asm(f32Num, f16Denom) MLIB_Div1Q_F32ls_FAsm(f32Num, f16Denom) +#define MLIB_Div1Q_F16ll_Asm(f32Num, f32Denom) MLIB_Div1Q_F16ll_FAsm(f32Num, f32Denom) +#define MLIB_Div1Q_F16ls_Asm(f32Num, f16Denom) MLIB_Div1Q_F16ls_FAsm(f32Num, f16Denom) +#define MLIB_Div1QSat_F32_Asm(f32Num, f32Denom) MLIB_Div1QSat_F32_FAsm(f32Num, f32Denom) +#define MLIB_Div1QSat_F32ls_Asm(f32Num, f16Denom) MLIB_Div1QSat_F32ls_FAsm(f32Num, f16Denom) +#define MLIB_Div1QSat_F16ll_Asm(f32Num, f32Denom) MLIB_Div1QSat_F16ll_FAsm(f32Num, f32Denom) +#define MLIB_Div1QSat_F16ls_Asm(f32Num, f16Denom) MLIB_Div1QSat_F16ls_FAsm(f32Num, f16Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_Div1Q_F32_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern frac32_t MLIB_Div1QSat_F32_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern frac32_t MLIB_Div1Q_F32ls_FAsm(frac32_t f32Num, frac16_t f16Denom); +extern frac32_t MLIB_Div1QSat_F32ls_FAsm(frac32_t f32Num, frac16_t f16Denom); +extern frac16_t MLIB_Div1Q_F16ll_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern frac16_t MLIB_Div1QSat_F16ll_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern frac16_t MLIB_Div1Q_F16ls_FAsm(frac32_t f32Num, frac16_t f16Denom); +extern frac16_t MLIB_Div1QSat_F16ls_FAsm(frac32_t f32Num, frac16_t f16Denom); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIV1Q_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw1Q_A32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw1Q_A32_Asm.h new file mode 100644 index 0000000..fd1289b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw1Q_A32_Asm.h @@ -0,0 +1,322 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Unsigned division +* +*******************************************************************************/ +#ifndef _MLIB_DIVHW1Q_A32_ASM_H_ +#define _MLIB_DIVHW1Q_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_DivHw1Q_A32ss_Asmi(f16Num, f16Denom) MLIB_DivHw1Q_A32ss_FAsmi(f16Num, f16Denom) +#define MLIB_DivHw1Q_A32ls_Asmi(f32Num, f16Denom) MLIB_DivHw1Q_A32ls_FAsmi(f32Num, f16Denom) +#define MLIB_DivHw1Q_A32ll_Asm(f32Num, f32Denom) MLIB_DivHw1Q_A32ll_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern acc32_t MLIB_DivHw1Q_A32ll_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); + +/******************************************************************************* +* @brief 16-bit numerator, 16-bit denominator inputs 32-bit accumulator +* output 1-quadrant division function +* +* @param in frac16_t f16Num +* - Numerator in <0;1) in frac16_t +* frac16_t f16Denom +* - Denominator in <0;1) in frac16_t +* +* @return This function returns +* acc32_t value [0;65536.0) +* +* @remarks This function divides two positive fractional inputs: +* result = f16Num / f16Denom. +* The output is the accumulator type where the lower +* word is the fractional part. +* If the denominator is 0, the output is 0x7FFF FFFF. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_DivHw1Q_A32ss_FAsmi(register frac16_t f16Num, register frac16_t f16Denom) +{ + register acc32_t a32Result = 0x7FFFFFFF; + register frac32_t f32BasePtr = (frac32_t)0xF0004000U; + register frac32_t f32Temp1, f32Temp2; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ lsls f16Num, f16Num, #16 /* Numerator << 16 */ + lsls f16Denom, f16Denom, #16 /* Denominator << 16 */ + beq DivHw1Q_A32ss_End /* If Denominator = 0, then goes to DivHw1Q_A32ss_End */ + asrs f16Denom, f16Denom, #15 /* Denominator >> 15 */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + DivHw1Q_A32ss_Recount: + adds f32Temp2, f32Temp1, #1 /* f32Temp2 = gu16CntMmdvsq + 1 */ + strh f32Temp2, [&gu16CntMmdvsq] /* gu16CntMmdvsq = f32Temp2 */ + movs f32Temp1, #0 /* f32TestVal = 0 */ + str f32Temp1, [f32BasePtr, #8] /* MMDVSQ_CSR = 0x00000000 */ + str f16Num, [f32BasePtr] /* MMDVSQ_DEND = f16Num */ + str f16Denom, [f32BasePtr, #4] /* MMDVSQ_DSOR = f16Denom */ + ldr a32Result, [f32BasePtr, #12] /* a32Result = MMDVSQ_RES */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + cmp f32Temp1, f32Temp2 /* Compares f32Temp1 and f32Temp2 */ + bne DivHw1Q_A32ss_Recount /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_A32ss_Recount */ + DivHw1Q_A32ss_End: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "lsls %1, %1, #16 \n" /* Numerator << 16 */ + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "beq DivHw1Q_A32ss_End%= \n" /* If Denominator = 0, then goes to DivHw1Q_A32ss_End*/ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1Q_A32ss_Recount%=: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f16Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1Q_A32ss_Recount%= \n" /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_A32ss_Recount */ + "DivHw1Q_A32ss_End%=: \n" + : "+l"(f16Denom), "+l"(f16Num), "+l"(a32Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %1, %1, #16 \n" /* Numerator << 16 */ + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "beq DivHw1Q_A32ss_End%= \n" /* If Denominator = 0, then goes to DivHw1Q_A32ss_End*/ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1Q_A32ss_Recount%=: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f16Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1Q_A32ss_Recount%= \n" /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_A32ss_Recount */ + "DivHw1Q_A32ss_End%=: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Denom), "+l"(f16Num), "+l"(a32Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %1, %1, #16 \n" /* Numerator << 16 */ + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "beq DivHw1Q_A32ss_End \n" /* If Denominator = 0, then goes to DivHw1Q_A32ss_End*/ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1Q_A32ss_Recount: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f16Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1Q_A32ss_Recount \n" /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_A32ss_Recount */ + "DivHw1Q_A32ss_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Denom), "+l"(f16Num), "+l"(a32Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #endif + return a32Result; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/******************************************************************************* +* @brief 32-bit numerator, 16-bit denominator inputs 32-bit accumulator +* output 1-quadrant division function +* +* @param in frac32_t f32Num +* - Numerator in <0;1) in frac32_t +* frac16_t f16Denom +* - Denominator in <0;1) in frac16_t +* +* @return This function returns +* acc32_t value [0;65536.0) +* +* @remarks This function divides two non-negative fractional inputs: +* result = f32Num / f16Denom. +* The output is the accumulator type where the lower +* word is the fractional part. +* If the denominator is 0, the output is 0x7FFF FFFF. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_DivHw1Q_A32ls_FAsmi(register frac32_t f32Num, register frac16_t f16Denom) +{ + register acc32_t a32Result = 0x7FFFFFFF; + register frac32_t f32BasePtr = (frac32_t)0xF0004000U; + register frac32_t f32Temp1, f32Temp2; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ lsls f16Denom, f16Denom, #16 /* Denominator << 16 */ + beq DivHw1Q_A32ls_End /* If Denominator = 0, then goes to DivHw1Q_A32ls_End*/ + asrs f16Denom, f16Denom, #15 /* Denominator >> 15 */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + DivHw1Q_A32ls_Recount: + adds f32Temp2, f32Temp1, #1 /* f32Temp2 = gu16CntMmdvsq + 1 */ + strh f32Temp2, [&gu16CntMmdvsq] /* gu16CntMmdvsq = f32Temp2 */ + movs f32Temp1, #0 /* f32TestVal = 0 */ + str f32Temp1, [f32BasePtr, #8] /* MMDVSQ_CSR = 0x00000000 */ + str f32Num, [f32BasePtr] /* MMDVSQ_DEND = f32Num */ + str f16Denom, [f32BasePtr, #4] /* MMDVSQ_DSOR = f16Denom */ + ldr a32Result, [f32BasePtr, #12] /* a32Result = MMDVSQ_RES */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + cmp f32Temp1, f32Temp2 /* Compares f32Temp1 and f32Temp2 */ + bne DivHw1Q_A32ls_Recount /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_A32ls_Recount */ + DivHw1Q_A32ls_End: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "beq DivHw1Q_A32ls_End \n" /* If Denominator = 0, then goes to DivHw1Q_A32ls_End*/ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1Q_A32ls_Recount%=: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1Q_A32ls_Recount%= \n" /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_A32ls_Recount */ + "DivHw1Q_A32ls_End: \n" + : "+l"(f16Denom), "+l"(f32Num), "+l"(a32Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "beq DivHw1Q_A32ls_End%= \n" /* If Denominator = 0, then goes to DivHw1Q_A32ls_End*/ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1Q_A32ls_Recount%=: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1Q_A32ls_Recount%= \n" /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_A32ls_Recount */ + "DivHw1Q_A32ls_End%=: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Denom), "+l"(f32Num), "+l"(a32Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "beq DivHw1Q_A32ls_End \n" /* If Denominator = 0, then goes to DivHw1Q_A32ls_End*/ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1Q_A32ls_Recount: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1Q_A32ls_Recount \n" /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_A32ls_Recount */ + "DivHw1Q_A32ls_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Denom), "+l"(f32Num), "+l"(a32Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #endif + return a32Result; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIVHW1Q_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw1Q_F16_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw1Q_F16_Asm.h new file mode 100644 index 0000000..8e1eeec --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw1Q_F16_Asm.h @@ -0,0 +1,64 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Unsigned division +* +*******************************************************************************/ +#ifndef _MLIB_DIVHW1Q_F16_ASM_H_ +#define _MLIB_DIVHW1Q_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_DivHw1Q_F16_Asm(f16Num, f16Denom) MLIB_DivHw1Q_F16_FAsm(f16Num, f16Denom, &gu16CntMmdvsq) +#define MLIB_DivHw1QSat_F16_Asm(f16Num, f16Denom) MLIB_DivHw1QSat_F16_FAsm(f16Num, f16Denom, &gu16CntMmdvsq) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t MLIB_DivHw1Q_F16_FAsm(frac16_t f16Num, frac16_t f16Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHw1QSat_F16_FAsm(frac16_t f16Num, frac16_t f16Denom, const volatile uint16_t *pVal); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIVHW_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw1Q_F32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw1Q_F32_Asm.h new file mode 100644 index 0000000..736bcc0 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw1Q_F32_Asm.h @@ -0,0 +1,343 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Unsigned division +* +*******************************************************************************/ +#ifndef _MLIB_DIVHW1Q_F32_ASM_H_ +#define _MLIB_DIVHW1Q_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_DivHw1Q_F32_Asm(f32Num, f32Denom) MLIB_DivHw1Q_F32_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) +#define MLIB_DivHw1Q_F32ls_Asm(f32Num, f16Denom) MLIB_DivHw1Q_F32ls_FAsm(f32Num, f16Denom, &gu16CntMmdvsq) +#define MLIB_DivHw1Q_F16ll_Asm(f32Num, f32Denom) MLIB_DivHw1Q_F16ll_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) +#define MLIB_DivHw1Q_F16ls_Asm(f32Num, f16Denom) MLIB_DivHw1Q_F16ls_FAsm(f32Num, f16Denom, &gu16CntMmdvsq) + +#define MLIB_DivHw1QSat_F32_Asm(f32Num, f32Denom) MLIB_DivHw1QSat_F32_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) +#define MLIB_DivHw1QSat_F32ls_Asm(f32Num, f16Denom) MLIB_DivHw1QSat_F32ls_FAsm(f32Num, f16Denom, &gu16CntMmdvsq) +#define MLIB_DivHw1QSat_F16ll_Asm(f32Num, f32Denom) MLIB_DivHw1QSat_F16ll_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) +#define MLIB_DivHw1QSat_F16ls_Asm(f32Num, f16Denom) MLIB_DivHw1QSat_F16ls_FAsm(f32Num, f16Denom, &gu16CntMmdvsq) + +#define MLIB_DivHw1Q_F16ls_Asmi(f32Num, f16Denom) MLIB_DivHw1Q_F16ls_FAsmi(f32Num, f16Denom) +#define MLIB_DivHw1QSat_F16ls_Asmi(f32Num, f16Denom) MLIB_DivHw1QSat_F16ls_FAsmi(f32Num, f16Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_DivHw1Q_F32_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); +extern frac32_t MLIB_DivHw1Q_F32ls_FAsm(frac32_t f32Num, frac16_t f16Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHw1Q_F16ll_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHw1Q_F16ls_FAsm(frac32_t f32Num, frac16_t f16Denom, const volatile uint16_t *pVal); + +extern frac32_t MLIB_DivHw1QSat_F32_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); +extern frac32_t MLIB_DivHw1QSat_F32ls_FAsm(frac32_t f32Num, frac16_t f16Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHw1QSat_F16ll_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHw1QSat_F16ls_FAsm(frac32_t f32Num, frac16_t f16Denom, const volatile uint16_t *pVal); + +/******************************************************************************* +* @brief 32-bit numerator, 16-bit denominator inputs 16-output one quadrant +* division function +* +* @param in f32Num - Numerator in <0;1) in frac32_t +* f16Denom - Denominator in <0;1) in frac16_t +* +* @return This function returns +* - frac16_t value in <0;1) +* +* @remarks This function divides two fractional inputs: +* result = f32Num / f16Denom. +* The function does not saturate the output. +* If the denominator is 0, the output is 0x7FFF. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#elif defined(__CC_ARM) +#pragma push /* Save current optimization level */ +#pragma optimize O0 /* Prevent common subroutine optimization */ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_DivHw1Q_F16ls_FAsmi(register frac32_t f32Num, register frac16_t f16Denom) +{ + register frac16_t f16Result = 0x7FFF; + register frac32_t f32BasePtr = (frac32_t)0xF0004000U; + register frac32_t f32Temp1, f32Temp2; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ lsls f16Denom, f16Denom, #16 /* Denominator << 16 */ + beq DivHw1Q_F16ls_End /* If Denominator = 0, then goes to DivHw1Q_F16ls_End*/ + asrs f16Denom, f16Denom, #15 /* Denominator >> 15 */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + DivHw1Q_F16ls_Recount: + adds f32Temp2, f32Temp1, #1 /* f32Temp2 = gu16CntMmdvsq + 1 */ + strh f32Temp2, [&gu16CntMmdvsq] /* gu16CntMmdvsq = f32Temp2 */ + movs f32Temp1, #0 /* f32TestVal = 0 */ + str f32Temp1, [f32BasePtr, #8] /* MMDVSQ_CSR = 0x00000000 */ + str f32Num, [f32BasePtr] /* MMDVSQ_DEND = f32Num */ + str f16Denom, [f32BasePtr, #4] /* MMDVSQ_DSOR = f16Denom */ + ldr f16Result, [f32BasePtr, #12] /* f16Result = MMDVSQ_RES */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + cmp f32Temp1, f32Temp2 /* Compares f32Temp1 and f32Temp2 */ + bne DivHw1Q_F16ls_Recount /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_F16ls_Recount */ + DivHw1Q_F16ls_End: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "beq DivHw1Q_F16ls_End%= \n" /* If Denominator = 0, then goes to DivHw1Q_F16ls_End*/ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1Q_F16ls_Recount%=: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1Q_F16ls_Recount%= \n" /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_F16ls_Recount */ + "DivHw1Q_F16ls_End%=: \n" + : "+l"(f16Denom), "+l"(f32Num), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "beq DivHw1Q_F16ls_End%= \n" /* If Denominator = 0, then goes to DivHw1Q_F16ls_End*/ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1Q_F16ls_Recount%=: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1Q_F16ls_Recount%= \n" /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_F16ls_Recount */ + "DivHw1Q_F16ls_End%=: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + : "+l"(f16Denom), "+l"(f32Num), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "beq DivHw1Q_F16ls_End \n" /* If Denominator = 0, then goes to DivHw1Q_F16ls_End*/ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1Q_F16ls_Recount: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1Q_F16ls_Recount \n" /* If f32Temp1 != f32Temp2, then goes to DivHw1Q_F16ls_Recount */ + "DivHw1Q_F16ls_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Denom), "+l"(f32Num), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #endif + return f16Result; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#elif defined(__CC_ARM) +#pragma pop /* Restore previous optimization level */ +#endif + +/******************************************************************************* +* @brief 32-bit numerator, 16-bit denominator inputs 16-output one quadrant +* division function +* +* @param in f32Num - Numerator in <0;1) in frac32_t +* f16Denom - Denominator in <0;1) in frac16_t +* +* @return This function returns +* - frac16_t value in <0;1) +* +* @remarks This function divides two fractional inputs: +* result = f32Num / f16Denom. +* The function saturates the output if f32Num > f16Denom to 0x7FFF. +* If the denominator is 0, the output is 0x7FFF. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#elif defined(__CC_ARM) +#pragma push /* Save current optimization level */ +#pragma optimize O0 /* Prevent common subroutine optimization */ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_DivHw1QSat_F16ls_FAsmi(register frac32_t f32Num, register frac16_t f16Denom) +{ + register frac16_t f16Result = 0x7FFF; + register frac32_t f32BasePtr = (frac32_t)0xF0004000U; + register frac32_t f32Temp1, f32Temp2; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ lsls f16Denom, f16Denom, #16 /* Denominator << 16 */ + cmp f16Denom, f32Num /* Compares Denominator with Numerator */ + ble DivHw1Q_F16ls_End /* If Denominator >= Numerator, then goes to DivHw1QSat_F16ls_End */ + asrs f16Denom, f16Denom, #15 /* Denominator >> 15 */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + DivHw1QSat_F16ls_Recount: + adds f32Temp2, f32Temp1, #1 /* f32Temp2 = gu16CntMmdvsq + 1 */ + strh f32Temp2, [&gu16CntMmdvsq] /* gu16CntMmdvsq = f32Temp2 */ + movs f32Temp1, #0 /* f32TestVal = 0 */ + str f32Temp1, [f32BasePtr, #8] /* MMDVSQ_CSR = 0x00000000 */ + str f32Num, [f32BasePtr] /* MMDVSQ_DEND = f32Num */ + str f16Denom, [f32BasePtr, #4] /* MMDVSQ_DSOR = f16Denom */ + ldr f16Result, [f32BasePtr, #12] /* f16Result = MMDVSQ_RES */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + cmp f32Temp1, f32Temp2 /* Compares f32Temp1 and f32Temp2 */ + bne DivHw1QSat_F16ls_Recount /* If f32Temp1 != f32Temp2, then goes to DivHw1QSat_F16ls_Recount */ + DivHw1Q_F16ls_End: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "cmp %0, %1 \n" /* Compares Denominator with Numerator */ + "ble DivHw1QSat_F16ls_End%= \n" /* If Denominator >= Numerator, then goes to DivHw1QSat_F16ls_End */ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1QSat_F16ls_Recount%=: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1QSat_F16ls_Recount%= \n"/* If f32Temp1 != f32Temp2, then goes to DivHw1QSat_F16ls_Recount */ + "DivHw1QSat_F16ls_End%=: \n" + : "+l"(f16Denom), "+l"(f32Num), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "cmp %0, %1 \n" /* Compares Denominator with Numerator */ + "ble DivHw1QSat_F16ls_End%= \n" /* If Denominator >= Numerator, then goes to DivHw1QSat_F16ls_End */ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1QSat_F16ls_Recount%=: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1QSat_F16ls_Recount%= \n"/* If f32Temp1 != f32Temp2, then goes to DivHw1QSat_F16ls_Recount */ + "DivHw1QSat_F16ls_End%=: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Denom), "+l"(f32Num), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %0, %0, #16 \n" /* Denominator << 16 */ + "cmp %0, %1 \n" /* Compares Denominator with Numerator */ + "ble DivHw1QSat_F16ls_End \n" /* If Denominator >= Numerator, then goes to DivHw1QSat_F16ls_End */ + "asrs %0, %0, #15 \n" /* Denominator >> 15 */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "DivHw1QSat_F16ls_Recount: \n" + "adds %4, %3, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %4, [%5] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %3, #0 \n" /* f32TestVal = 0 */ + "str %3, [%6, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %1, [%6] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%6, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %2, [%6, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %3, [%5] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %3, %4 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne DivHw1QSat_F16ls_Recount \n"/* If f32Temp1 != f32Temp2, then goes to DivHw1QSat_F16ls_Recount */ + "DivHw1QSat_F16ls_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Denom), "+l"(f32Num), "+l"(f16Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr):); + #endif + return f16Result; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#elif defined(__CC_ARM) +#pragma pop /* Restore previous optimization level */ +#endif + + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIVHW1Q_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_A32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_A32_Asm.h new file mode 100644 index 0000000..563fbd4 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_A32_Asm.h @@ -0,0 +1,66 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Division +* +*******************************************************************************/ +#ifndef _MLIB_DIVHW_A32_ASM_H_ +#define _MLIB_DIVHW_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_DivHw_A32ll_Asm(f32Num, f32Denom) MLIB_DivHw_A32ll_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) +#define MLIB_DivHw_A32ls_Asm(f32Num, f16Denom) MLIB_DivHw_A32ls_FAsm(f32Num, f16Denom, &gu16CntMmdvsq) +#define MLIB_DivHw_A32ss_Asm(f16Num, f16Denom) MLIB_DivHw_A32ss_FAsm(f16Num, f16Denom, &gu16CntMmdvsq) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_DivHw_A32ll_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); +extern frac32_t MLIB_DivHw_A32ls_FAsm(frac32_t f32Num, frac16_t f16Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHw_A32ss_FAsm(frac16_t f16Num, frac16_t f16Denom, const volatile uint16_t *pVal); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIVHW_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_F16_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_F16_Asm.h new file mode 100644 index 0000000..f42c00e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_F16_Asm.h @@ -0,0 +1,64 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Division +* +*******************************************************************************/ +#ifndef _MLIB_DIVHW_F16_ASM_H_ +#define _MLIB_DIVHW_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_DivHw_F16_Asm(f16Num, f16Denom) MLIB_DivHw_F16_FAsm(f16Num, f16Denom, &gu16CntMmdvsq) +#define MLIB_DivHwSat_F16_Asm(f16Num, f16Denom) MLIB_DivHwSat_F16_FAsm(f16Num, f16Denom, &gu16CntMmdvsq) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t MLIB_DivHw_F16_FAsm(frac16_t f16Num, frac16_t f16Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHwSat_F16_FAsm(frac16_t f16Num, frac16_t f16Denom, const volatile uint16_t *pVal); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIVHW_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_F32.h new file mode 100644 index 0000000..7307659 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_F32.h @@ -0,0 +1,71 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Division +* +*******************************************************************************/ +#ifndef _MLIB_DIVHW_F32_H_ +#define _MLIB_DIVHW_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" +#include "MLIB_Shift_F32.h" +#include "MLIB_Shift_F16.h" +#include "MLIB_BiShift_F32.h" +#include "MLIB_Add_F32.h" +#include "MLIB_Conv_F32.h" +#include "MLIB_Mul_F32.h" +#include "MLIB_Neg_F16.h" +#include "MLIB_Neg_F32.h" +#include "MLIB_Abs_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_DivHw_F32_C(f32Num, f32Denom) MLIB_DivHw_F32_FC(f32Num, f32Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_DivHw_F32_FC(frac32_t f32Num, frac32_t f32Denom); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIVHW_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_F32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_F32_Asm.h new file mode 100644 index 0000000..85941ed --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_DivHw_F32_Asm.h @@ -0,0 +1,78 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Division +* +*******************************************************************************/ +#ifndef _MLIB_DIVHW_F32_ASM_H_ +#define _MLIB_DIVHW_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "MLIB_MMDVSQ.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_DivHw_F32_Asm(f32Num, f32Denom) MLIB_DivHw_F32_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) +#define MLIB_DivHw_F32ls_Asm(f32Num, f16Denom) MLIB_DivHw_F32ls_FAsm(f32Num, f16Denom, &gu16CntMmdvsq) +#define MLIB_DivHw_F16ll_Asm(f32Num, f32Denom) MLIB_DivHw_F16ll_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) +#define MLIB_DivHw_F16ls_Asm(f32Num, f16Denom) MLIB_DivHw_F16ls_FAsm(f32Num, f16Denom, &gu16CntMmdvsq) + +#define MLIB_DivHwSat_F32_Asm(f32Num, f32Denom) MLIB_DivHwSat_F32_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) +#define MLIB_DivHwSat_F32ls_Asm(f32Num, f16Denom) MLIB_DivHwSat_F32ls_FAsm(f32Num, f16Denom, &gu16CntMmdvsq) +#define MLIB_DivHwSat_F16ll_Asm(f32Num, f32Denom) MLIB_DivHwSat_F16ll_FAsm(f32Num, f32Denom, &gu16CntMmdvsq) +#define MLIB_DivHwSat_F16ls_Asm(f32Num, f16Denom) MLIB_DivHwSat_F16ls_FAsm(f32Num, f16Denom, &gu16CntMmdvsq) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_DivHw_F32_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); +extern frac32_t MLIB_DivHw_F32ls_FAsm(frac32_t f32Num, frac16_t f16Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHw_F16ll_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHw_F16ls_FAsm(frac32_t f32Num, frac16_t f16Denom, const volatile uint16_t *pVal); + +extern frac32_t MLIB_DivHwSat_F32_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); +extern frac32_t MLIB_DivHwSat_F32ls_FAsm(frac32_t f32Num, frac16_t f16Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHwSat_F16ll_FAsm(frac32_t f32Num, frac32_t f32Denom, const volatile uint16_t *pVal); +extern frac16_t MLIB_DivHwSat_F16ls_FAsm(frac32_t f32Num, frac16_t f16Denom, const volatile uint16_t *pVal); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIVHW_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div_A32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div_A32_Asm.h new file mode 100644 index 0000000..59a5423 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div_A32_Asm.h @@ -0,0 +1,66 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Division +* +*******************************************************************************/ +#ifndef _MLIB_DIV_A32_ASM_H_ +#define _MLIB_DIV_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Div_A32ss_Asm(f16Num, f16Denom) MLIB_Div_A32ss_FAsm(f16Num, f16Denom) +#define MLIB_Div_A32ls_Asm(f32Num, f16Denom) MLIB_Div_A32ls_FAsm(f32Num, f16Denom) +#define MLIB_Div_A32ll_Asm(f32Num, f32Denom) MLIB_Div_A32ll_FAsm(f32Num, f32Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern acc32_t MLIB_Div_A32ll_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern acc32_t MLIB_Div_A32ss_FAsm(frac16_t f16Num, frac16_t f16Denom); +extern acc32_t MLIB_Div_A32ls_FAsm(frac32_t f32Num, frac16_t f16Denom); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIV_A32_H_ASM_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div_F16_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div_F16_Asm.h new file mode 100644 index 0000000..7ebbbfa --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div_F16_Asm.h @@ -0,0 +1,64 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Division +* +*******************************************************************************/ +#ifndef _MLIB_DIV_F16_ASM_H_ +#define _MLIB_DIV_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Div_F16_Asm(f16Num, f16Denom) MLIB_Div_F16_FAsm(f16Num, f16Denom) +#define MLIB_DivSat_F16_Asm(f16Num, f16Denom) MLIB_DivSat_F16_FAsm(f16Num, f16Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t MLIB_Div_F16_FAsm(frac16_t f16Num, frac16_t f16Denom); +extern frac16_t MLIB_DivSat_F16_FAsm(frac16_t f16Num, frac16_t f16Denom); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIV_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div_F32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div_F32_Asm.h new file mode 100644 index 0000000..5317e23 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Div_F32_Asm.h @@ -0,0 +1,76 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Division +* +*******************************************************************************/ +#ifndef _MLIB_DIV_F32_ASM_H_ +#define _MLIB_DIV_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Div_F32_Asm(f32Num, f32Denom) MLIB_Div_F32_FAsm(f32Num, f32Denom) +#define MLIB_Div_F32ls_Asm(f32Num, f16Denom) MLIB_Div_F32ls_FAsm(f32Num, f16Denom) +#define MLIB_Div_F16ll_Asm(f32Num, f32Denom) MLIB_Div_F16ll_FAsm(f32Num, f32Denom) +#define MLIB_DivSat_F32_Asm(f32Num, f32Denom) MLIB_DivSat_F32_FAsm(f32Num, f32Denom) +#define MLIB_DivSat_F32ls_Asm(f32Num, f16Denom) MLIB_DivSat_F32ls_FAsm(f32Num, f16Denom) +#define MLIB_DivSat_F16ll_Asm(f32Num, f32Denom) MLIB_DivSat_F16ll_FAsm(f32Num, f32Denom) +#define MLIB_Div_F16ls_Asm(f32Num, f16Denom) MLIB_Div_F16ls_FAsm(f32Num, f16Denom) +#define MLIB_DivSat_F16ls_Asm(f32Num, f16Denom) MLIB_DivSat_F16ls_FAsm(f32Num, f16Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_Div_F32_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern frac32_t MLIB_DivSat_F32_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern frac32_t MLIB_Div_F32ls_FAsm(frac32_t f32Num, frac16_t f16Denom); +extern frac32_t MLIB_DivSat_F32ls_FAsm(frac32_t f32Num, frac16_t f16Denom); +extern frac16_t MLIB_Div_F16ll_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern frac16_t MLIB_DivSat_F16ll_FAsm(frac32_t f32Num, frac32_t f32Denom); +extern frac16_t MLIB_Div_F16ls_FAsm(frac32_t f32Num, frac16_t f16Denom); +extern frac16_t MLIB_DivSat_F16ls_FAsm(frac32_t f32Num, frac16_t f16Denom); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_DIV_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Log2_U16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Log2_U16_Asmi.h new file mode 100644 index 0000000..5c1a92a --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Log2_U16_Asmi.h @@ -0,0 +1,150 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Binary logarithm +* +*******************************************************************************/ +#ifndef _MLIB_LOG2_U16_ASM_H_ +#define _MLIB_LOG2_U16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Log2_U16_Asmi(u16Val) MLIB_Log2_U16_FAsmi(u16Val) + +/***************************************************************************//*! +* +* @brief Binary logarithm of 16-bit input +* +* @param in uint16_t u16Val +* - Argument in uint16_t +* +* @return This function returns +* - uint16_t value +* +* @remarks This function returns the 16-bit integer part of binary logarithm of the input. +* Returns 0 for input u16Val = 0. +* +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline uint16_t MLIB_Log2_U16_FAsmi(register uint16_t u16Val) +{ + register uint16_t u16Log2 = 0; /* Initialization of u16Log2 */ + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ cmp u16Val, #0xFF /* Compares u16Val with 0xFF */ + ble Cmp1 /* If u16Val <= 0xFF, then goes to Cmp1 */ + movs u16Log2, #8 /* u16Log2 = 8 */ + lsrs u16Val, u16Val, #8 /* u16Val >> 8 */ + Cmp1: + cmp u16Val, #0xF /* Compares u16Val with 0xF */ + ble Cmp2 /* If u16Val <= 0xF, then goes to Cmp2 */ + adds u16Log2, #4 /* u16Log2 = u16Log2 + 4 */ + lsrs u16Val, u16Val, #4 /* u16Val >> 4 */ + Cmp2: + cmp u16Val, #0x3 /* Compares u16Val with 0x3 */ + ble Cmp3 /* If u16Val <= 0x3, then goes to Cmp3 */ + adds u16Log2, #2 /* u16Log2 = u16Log2 + 2 */ + lsrs u16Val, u16Val, #2 /* u16Val >> 2 */ + Cmp3: + lsrs u16Val, u16Val, #1 /* u16Val >> 1 */ + orrs u16Val, u16Val, u16Log2 }; /* u16Val = u16Log2 | u16Val */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "cmp %0, #0xFF \n\t" /* Compares u16Val with 0xFF */ + "ble MLIB_Log2_U16_Cmp1%= \n\t" /* If u16Val <= 0xFF, then jumps through two commands */ + "movs %1, #8 \n\t" /* u16Log2 = 8 */ + "lsrs %0, %0, #8 \n\t" /* u16Val >> 8 */ + "MLIB_Log2_U16_Cmp1%=: \n\t" + "cmp %0, #0xF \n\t" /* Compares u16Val with 0xF */ + "ble MLIB_Log2_U16_Cmp2%= \n\t" /* If u16Val <= 0xF, then jumps through two commands */ + "adds %1, #4 \n\t" /* u16Log2 = u16Log2 + 4 */ + "lsrs %0, %0, #4 \n\t" /* u16Val >> 4 */ + "MLIB_Log2_U16_Cmp2%=: \n\t" + "cmp %0, #0x3 \n\t" /* Compares u16Val with 0x3 */ + "ble MLIB_Log2_U16_Cmp3%= \n\t" /* If u16Val <= 0x3, then jumps through two commands */ + "adds %1, #2 \n\t" /* u16Log2 = u16Log2 + 2 */ + "lsrs %0, %0, #2 \n\t" /* u16Val >> 2 */ + "MLIB_Log2_U16_Cmp3%=: \n\t" + "lsrs %0, %0, #1 \n\t" /* u16Val = 1 */ + "orrs %0, %0, %1 \n\t" /* u16Val = u16Log2 | u16Val */ + + : "+l"(u16Val), "+l"(u16Log2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "cmp %0, #0xFF \n" /* Compares u16Val with 0xFF */ + "ble .+6 \n" /* If u16Val <= 0xFF, then jumps through two commands */ + "movs %1, #8 \n" /* u16Log2 = 8 */ + "lsrs %0, %0, #8 \n" /* u16Val >> 8 */ + + "cmp %0, #0xF \n" /* Compares u16Val with 0xF */ + "ble .+6 \n" /* If u16Val <= 0xF, then jumps through two commands */ + "adds %1, #4 \n" /* u16Log2 = u16Log2 + 4 */ + "lsrs %0, %0, #4 \n" /* u16Val >> 4 */ + + "cmp %0, #0x3 \n" /* Compares u16Val with 0x3 */ + "ble .+6 \n" /* If u16Val <= 0x3, then jumps through two commands */ + "adds %1, #2 \n" /* u16Log2 = u16Log2 + 2 */ + "lsrs %0, %0, #2 \n" /* u16Val >> 2 */ + + "lsrs %0, %0, #1 \n" /* u16Val = 1 */ + "orrs %0, %0, %1 \n" /* u16Val = u16Log2 | u16Val */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(u16Val), "+l"(u16Log2):); + #endif + + return u16Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_LOG2_U16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MMDVSQ.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MMDVSQ.h new file mode 100644 index 0000000..2a758bb --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MMDVSQ.h @@ -0,0 +1,82 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief MLIB_MMDVSQ.h +* +*******************************************************************************/ +#ifndef _MLIB_MMDVSQ_H_ +#define _MLIB_MMDVSQ_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/****************************************************************************** +* Includes +******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +/* Base address of Memory-Mapped Divide and Square Root peripheral module(MMDVSQ) */ +#define RTCESL_MMDVSQ_BASE_PTR 0xF0004000U + +/* MMDVSQ registers definitions +* Absolute Register name Width Access Reset value +* address (hex) (in bits) +* F000_4000 Dividend Register (MMDVSQ_DEND) 32 R/W Undefined +* F000_4004 Divisor Register (MMDVSQ_DSOR) 32 R/W Undefined +* F000_4008 Control/Status Register (MMDVSQ_CSR) 32 R/W Some bits undefined +* F000_400C Result Register (MMDVSQ_RES) 32 R/W Undefined +* F000_4010 Radicand Register (MMDVSQ_RCND) 32 W Undefined */ + +#define RTCESL_MMDVSQ_DEND *(volatile unsigned int*)(RTCESL_MMDVSQ_BASE_PTR + 0x0U) +#define RTCESL_MMDVSQ_DSOR *(volatile unsigned int*)(RTCESL_MMDVSQ_BASE_PTR + 0x4U) +#define RTCESL_MMDVSQ_CSR *(volatile unsigned int*)(RTCESL_MMDVSQ_BASE_PTR + 0x8U) +#define RTCESL_MMDVSQ_RES *(volatile unsigned int*)(RTCESL_MMDVSQ_BASE_PTR + 0xCU) +#define RTCESL_MMDVSQ_RCND *(volatile unsigned int*)(RTCESL_MMDVSQ_BASE_PTR + 0x10U) + +/******************************************************************************* +* Variables +*******************************************************************************/ +/* Global variable which store actual MMDVSQ state to avoid register + rewriting during interrupt service routine handling */ +extern volatile uint16_t gu16CntMmdvsq; + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MMDVSQ_H_ */ + + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4Rnd_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4Rnd_F16.h new file mode 100644 index 0000000..33d40fb --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4Rnd_F16.h @@ -0,0 +1,72 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate of four inputs with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MAC4RND_F16_H_ +#define _MLIB_MAC4RND_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Add_F32.h" +#include "MLIB_Add_F16.h" +#include "MLIB_MulRnd_F16.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mac4Rnd_F16_Ci(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) \ + MLIB_Mac4Rnd_F16_FCi(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) + +/***************************************************************************//*! +* +* f16Out = (f16Add1Mul1 * f16Add1Mul2) + (f16Add2Mul1 * f16Add2Mul2) +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Mac4Rnd_F16_FCi(register frac16_t f16Add1Mul1, register frac16_t f16Add1Mul2, + register frac16_t f16Add2Mul1, register frac16_t f16Add2Mul2) +{ + return(frac16_t)MLIB_ShR_F32_Ci(((MLIB_Add_F32_Ci((int32_t)(f16Add1Mul1)*(int32_t)(f16Add1Mul2), + (int32_t)(f16Add2Mul1)*(int32_t)(f16Add2Mul2)))+0x4000), 15U); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MAC4RND_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4Rnd_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4Rnd_F16_Asmi.h new file mode 100644 index 0000000..569e2c3 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4Rnd_F16_Asmi.h @@ -0,0 +1,166 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate of four inputs with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MAC4RND_F16_ASM_H_ +#define _MLIB_MAC4RND_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mac4RndSat_F16_Asmi(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) \ + MLIB_Mac4RndSat_F16_FAsmi(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) + +/***************************************************************************//*! +* +* f16Out = (f16Add1Mul1 * f16Add1Mul2) + (f16Add2Mul1 * f16Add2Mul2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_Mac4RndSat_F16_FAsmi(register frac16_t f16Add1Mul1, register frac16_t f16Add1Mul2, + register frac16_t f16Add2Mul1, register frac16_t f16Add2Mul2) +{ + register frac32_t f32SatVal = 0x7FFF; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Add1Mul1, f16Add1Mul1 /* Converts 16-bit input to 32-bit */ + sxth f16Add1Mul2, f16Add1Mul2 /* Converts 16-bit input to 32-bit */ + sxth f16Add2Mul1, f16Add2Mul1 /* Converts 16-bit input to 32-bit */ + sxth f16Add2Mul2, f16Add2Mul2 /* Converts 16-bit input to 32-bit */ + muls f16Add1Mul1, f16Add1Mul1, f16Add1Mul2 /* f16Add1Mul1 * f16Add1Mul2 */ + muls f16Add2Mul1, f16Add2Mul1, f16Add2Mul2 /* f16Add2Mul1 * f16Add2Mul2 */ + adds f16Add2Mul1, f16Add2Mul1, f16Add1Mul1 /* f16Add1Mul1 * f16Add1Mul2 + f16Add2Mul1 * f16Add2Mul2 */ + asrs f16Add2Mul1, f16Add2Mul1, #7 /* f16Add2Mul1 >> 7 */ + adds f16Add2Mul1, f16Add2Mul1, #128 /* Rounding */ + asrs f16Add2Mul1, f16Add2Mul1, #8 /* f16Add2Mul1 >> 8 */ + movs f16Add1Mul2, f16Add2Mul1 /* Copies result to f16Add1Mul2 */ + + cmp f32SatVal, f16Add2Mul1 /* Compares result with 0x7FFF */ + bgt NegTest /* If result < 0x7FFF, then go to NegTest */ + mov f16Add2Mul1, f32SatVal /* If result >= 0x7FFF, then result = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + mvns f16Add1Mul1, f32SatVal /* f16Add1Mul1 = 0xFFFF8000 */ + cmp f16Add1Mul1, f16Add2Mul1 /* Compares result with 0xFFFF8000 */ + ble SatEnd /* If result >= 0xFFFF8000, then goes to SatEnd */ + mov f16Add2Mul1, f16Add1Mul1 /* f16Add2Mul1 = 0xFFFF8000 */ + lsls f16Add1Mul1, f16Add1Mul1, #1 /* f16Add1Mul1 = 0xFFFF0000 */ + cmp f16Add1Mul1, f16Add1Mul2 /* Compares result with 0xFFFF0000 */ + bne SatEnd /* If result <> 0xFFFF0000, then goes to SatEnd */ + mov f16Add2Mul1, f32SatVal /* If result = 0xFFFF0000, then result = 0x7FFF (in case, when all inputs are FRAC16(-1.0)) */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %3, %3 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %2, %2, %3 \n\t" /* f16Add1Mul1 * f16Add1Mul2 */ + "muls %0, %0, %1 \n\t" /* f16Add2Mul1 * f16Add2Mul2 */ + "adds %0, %0, %2 \n\t" /* f16Add1Mul1 * f16Add1Mul2 + f16Add2Mul1 * f16Add2Mul2 */ + "asrs %0, %0, #7 \n\t" /* f16Add2Mul1 >> 7 */ + "adds %0, %0, #128 \n\t" /* Rounding */ + "asrs %0, %0, #8 \n\t" /* f16Add2Mul1 >> 8 */ + "movs %1, %0 \n\t" /* Copies result to f16Add2Mul2 */ + + "cmp %4, %0 \n\t" /* Compares result with 0x7FFF */ + "bgt MLIB_Mac4RndSat_F16_NegTest%= \n\t" /* If result < 0x7FFF, then jumps through two commands */ + "mov %0, %4 \n\t" /* If result >= 0x7FFF, then result = 0x7FFF */ + "b MLIB_Mac4RndSat_F16_SatEnd%= \n\t" /* Goes to the end of function */ + "MLIB_Mac4RndSat_F16_NegTest%=: \n\t" + "mvns %2, %4 \n\t" /* f16Add1Mul1 = 0xFFFF8000 */ + "cmp %2, %0 \n\t" /* Compares result with 0xFFFF8000 */ + "ble MLIB_Mac4RndSat_F16_SatEnd%= \n\t" /* If result >= 0xFFFF8000, then jumps through four commands */ + "mov %0, %2 \n\t" /* f16Add2Mul1 = 0xFFFF8000 */ + "lsls %2, %2, #1 \n\t" /* f16Add1Mul1 = 0xFFFF0000 */ + "cmp %2, %1 \n\t" /* Compares result with 0xFFFF0000 */ + "bne MLIB_Mac4RndSat_F16_SatEnd%= \n\t" /* If result <> 0xFFFF0000, then jumps through next command */ + "mov %0, %4 \n\t" /* If result = 0xFFFF0000, then result = 0x7FFF (in case, when all inputs are FRAC16(-1.0)) */ + "MLIB_Mac4RndSat_F16_SatEnd%=: \n\t" + : "+l"(f16Add2Mul1), "+l"(f16Add2Mul2), "+l"(f16Add1Mul1), "+l"(f16Add1Mul2): "l"(f32SatVal)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "sxth %3, %3 \n" /* Converts 16-bit input to 32-bit */ + "muls %2, %2, %3 \n" /* f16Add1Mul1 * f16Add1Mul2 */ + "muls %0, %0, %1 \n" /* f16Add2Mul1 * f16Add2Mul2 */ + "adds %0, %0, %2 \n" /* f16Add1Mul1 * f16Add1Mul2 + f16Add2Mul1 * f16Add2Mul2 */ + "asrs %0, %0, #7 \n" /* f16Add2Mul1 >> 7 */ + "adds %0, %0, #128 \n" /* Rounding */ + "asrs %0, %0, #8 \n" /* f16Add2Mul1 >> 8 */ + "movs %1, %0 \n" /* Copies result to f16Add2Mul2 */ + + "cmp %4, %0 \n" /* Compares result with 0x7FFF */ + "bgt .+6 \n" /* If result < 0x7FFF, then jumps through two commands */ + "mov %0, %4 \n" /* If result >= 0x7FFF, then result = 0x7FFF */ + "b .+18 \n" /* Goes to the end of function */ + "mvns %2, %4 \n" /* f16Add1Mul1 = 0xFFFF8000 */ + "cmp %2, %0 \n" /* Compares result with 0xFFFF8000 */ + "ble .+12 \n" /* If result >= 0xFFFF8000, then jumps through four commands */ + "mov %0, %2 \n" /* f16Add2Mul1 = 0xFFFF8000 */ + "lsls %2, %2, #1 \n" /* f16Add1Mul1 = 0xFFFF0000 */ + "cmp %2, %1 \n" /* Compares result with 0xFFFF0000 */ + "bne .+4 \n" /* If result <> 0xFFFF0000, then jumps through next command */ + "mov %0, %4 \n" /* If result = 0xFFFF0000, then result = 0x7FFF (in case, when all inputs are FRAC16(-1.0)) */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Add2Mul1), "+l"(f16Add2Mul2), "+l"(f16Add1Mul1), "+l"(f16Add1Mul2): "l"(f32SatVal)); + #endif + + return f16Add2Mul1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MAC4RND_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4Rnd_F32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4Rnd_F32_Asm.h new file mode 100644 index 0000000..d0d5be8 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4Rnd_F32_Asm.h @@ -0,0 +1,68 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate of four inputs with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MAC4RND_F32_ASM_H_ +#define _MLIB_MAC4RND_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mac4Rnd_F32_Asm(f32Add1Mul1, f32Add1Mul2, f32Add2Mul1, f32Add2Mul2) \ + MLIB_Mac4Rnd_F32_FAsm(f32Add1Mul1, f32Add1Mul2, f32Add2Mul1, f32Add2Mul2) +#define MLIB_Mac4RndSat_F32_Asm(f32Add1Mul1, f32Add1Mul2, f32Add2Mul1, f32Add2Mul2) \ + MLIB_Mac4RndSat_F32_FAsm(f32Add1Mul1, f32Add1Mul2, f32Add2Mul1, f32Add2Mul2) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac16_t MLIB_Mac4Rnd_F32_FAsm(frac32_t f32Add1Mul1, frac32_t f32Add1Mul2, + frac32_t f32Add2Mul1, frac32_t f32Add2Mul2); +extern frac16_t MLIB_Mac4RndSat_F32_FAsm(frac32_t f32Add1Mul1, frac32_t f32Add1Mul2, + frac32_t f32Add2Mul1, frac32_t f32Add2Mul2); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MAC4RND_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4_F32.h new file mode 100644 index 0000000..63bb5db --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac4_F32.h @@ -0,0 +1,91 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate of four inputs +* +*******************************************************************************/ +#ifndef _MLIB_MAC4_F32_H_ +#define _MLIB_MAC4_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mac4_F32ssss_Ci(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) \ + MLIB_Mac4_F32ssss_FCi(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) +#define MLIB_Mac4Sat_F32ssss_Ci(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) \ + MLIB_Mac4Sat_F32ssss_FCi(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) + +/***************************************************************************//*! +* +* f32Out = (f16Add1Mul1 * f16Add1Mul2) + (f16Add2Mul1 * f16Add2Mul2) +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_Mac4_F32ssss_FCi(register frac16_t f16Add1Mul1, register frac16_t f16Add1Mul2, + register frac16_t f16Add2Mul1, register frac16_t f16Add2Mul2) +{ + return (MLIB_Sh1L_F32_Ci(((int32_t)f16Add1Mul1 * (int32_t)f16Add1Mul2) + + ((int32_t)f16Add2Mul1 * (int32_t)f16Add2Mul2))); +} + +/***************************************************************************//*! +* +* f32Out = (f16Add1Mul1 * f16Add1Mul2) + (f16Add2Mul1 * f16Add2Mul2) +* With saturation +*******************************************************************************/ +static inline frac32_t MLIB_Mac4Sat_F32ssss_FCi(register frac16_t f16Add1Mul1, register frac16_t f16Add1Mul2, + register frac16_t f16Add2Mul1, register frac16_t f16Add2Mul2) +{ + int32_t i32Temp; + + i32Temp = (int32_t)((int32_t)(f16Add1Mul1)*(int32_t)(f16Add1Mul2) + + (int32_t)(f16Add2Mul1)*(int32_t)(f16Add2Mul2)); + i32Temp = (int32_t)(((i32Temp == INT32_MIN) || (i32Temp >= 1073741824L)) ? INT32_MAX : + ((i32Temp <= -1073741824L) ? INT32_MIN : MLIB_Sh1L_F32_Ci(i32Temp))); + + return ((frac32_t)i32Temp); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MAC4_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_A32.h new file mode 100644 index 0000000..0cd7fd5 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_A32.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MACRND_A32_H_ +#define _MLIB_MACRND_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MacRnd_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) \ + MLIB_MacRnd_A32ass_FCi(a32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* a32Out = a32Accum + ( f16Mult1 * f16Mult2) +* +*******************************************************************************/ +static inline acc32_t MLIB_MacRnd_A32ass_FCi(register acc32_t a32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register acc32_t a32Temp; + + a32Temp = ((int32_t)f16Mult1 * (int32_t)f16Mult2); + a32Temp = MLIB_ShR_F32_Ci(a32Temp + 0x00004000, 15U); + return (a32Accum + a32Temp); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MACRND_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_A32_Asmi.h new file mode 100644 index 0000000..ed61ef1 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_A32_Asmi.h @@ -0,0 +1,111 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MACRND_A32_ASM_H_ +#define _MLIB_MACRND_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MacRnd_A32ass_Asmi(a32Accum, f16Mult1, f16Mult2) \ + MLIB_MacRnd_A32ass_FAsmi(a32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* a32Out = a32Accum + ( f16Mult1 * f16Mult2) +* +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MacRnd_A32ass_FAsmi(register acc32_t a32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #7 /* f16Mult1 >> 7 for fractional multiplication */ + adds f16Mult1, f16Mult1, #128 /* Rounding */ + asrs f16Mult1, f16Mult1, #8 /* f16Mult1 >> 8 for fractional multiplication */ + adds a32Accum, a32Accum, f16Mult1}; /* a32Accum + f16Mult1 * f16Mult2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n\t" /* f16Mult1 >> 7 for fractional multiplication */ + "adds %1, %1, #128 \n\t" /* Rounding */ + "asrs %1, %1, #8 \n\t" /* f16Mult1 >> 8 for fractional multiplication */ + "adds %0, %0, %1 \n\t" /* f32Accum + f16Mult1 * f16Mult2 */ + + : "+l"(a32Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n" /* f16Mult1 >> 7 for fractional multiplication */ + "adds %1, %1, #128 \n" /* Rounding */ + "asrs %1, %1, #8 \n" /* f16Mult1 >> 8 for fractional multiplication */ + "adds %0, %0, %1 \n" /* f32Accum + f16Mult1 * f16Mult2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return a32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MACRND_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F16.h new file mode 100644 index 0000000..6b0e9f6 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F16.h @@ -0,0 +1,74 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MACRND_F16_H_ +#define _MLIB_MACRND_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MacRnd_F16_Ci( f16Accum, f16Mult1, f16Mult2) \ + MLIB_MacRnd_F16_FCi( f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Accum + ( f16Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_MacRnd_F16_FCi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register acc32_t a32Temp; + + a32Temp = ((int32_t)f16Mult1 * (int32_t)f16Mult2); + a32Temp = MLIB_ShR_F32_Ci(a32Temp + 0x00004000, 15U); + a32Temp = (acc32_t)f16Accum + a32Temp; + return((frac16_t)a32Temp); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MACRND_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F16_Asmi.h new file mode 100644 index 0000000..cc21829 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F16_Asmi.h @@ -0,0 +1,155 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MACRND_F16_ASM_H_ +#define _MLIB_MACRND_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MacRndSat_F16_Asmi(f16Accum, f16Mult1, f16Mult2) \ + MLIB_MacRndSat_F16_FAsmi(f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Accum + ( f16Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MacRndSat_F16_FAsmi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Accum, f16Accum /* Converts 16-bit input to 32-bit */ + sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #7 /* f16Mult1 >> 7 */ + adds f16Mult1, f16Mult1, #128 /* Rounding */ + asrs f16Mult1, f16Mult1, #8 /* f16Mult1 >> 8 */ + adds f16Accum, f16Accum, f16Mult1 /* f16Accum + f16Mult1 * f16Mult2 */ + + movs f16Mult1, #128 /* f16Mult1 = 0x80 */ + lsls f16Mult1, #8 /* f16Mult1 = 0x8000 */ + + cmp f16Mult1, f16Accum /* Compares f16Accum with 0x8000 */ + bgt NegTest /* If f16Accum < 0x8000, then goes to NegTest */ + subs f16Accum, f16Mult1, #1 /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f16Mult1, f16Mult1 /* f16Mult1 = 0xFFFF8000 */ + cmp f16Mult1, f16Accum /* Compares f16Accum with 0xFFFF8000 */ + ble SatEnd /* If f16Accum >= 0xFFFF8000, then goes to SatEnd */ + mov f16Accum, f16Mult1 /* If f16Accum < 0xFFFF8000, then f16Mult1 = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n\t" /* f16Mult1 >> 7 */ + "adds %1, %1, #128 \n\t" /* Rounding */ + "asrs %1, %1, #8 \n\t" /* f16Mult1 >> 8 */ + "adds %0, %0, %1 \n\t" /* f16Accum + f16Mult1 * f16Mult2 */ + + "movs %1, #128 \n\t" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n\t" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n\t" /* Compares f16Accum with 0x8000 */ + "bgt MLIB_MacRndSat_F16_NegTest%= \n\t" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n\t" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b MLIB_MacRndSat_F16_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MacRndSat_F16_NegTest%=: \n\t" + "sxth %1, %1 \n\t" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n\t" /* Compares f16Accum with 0xFFFF8000 */ + "ble MLIB_MacRndSat_F16_SatEnd%= \n\t" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n\t" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + "MLIB_MacRndSat_F16_SatEnd%=: \n\t" + + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n" /* f16Mult1 >> 7 */ + "adds %1, %1, #128 \n" /* Rounding */ + "asrs %1, %1, #8 \n" /* f16Mult1 >> 8 */ + "adds %0, %0, %1 \n" /* f16Accum + f16Mult1 * f16Mult2 */ + + "movs %1, #128 \n" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n" /* Compares f16Accum with 0x8000 */ + "bgt .+6 \n" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + "sxth %1, %1 \n" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n" /* Compares f16Accum with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return f16Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MACRND_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F32.h new file mode 100644 index 0000000..1077008 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F32.h @@ -0,0 +1,77 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MACRND_F32_H_ +#define _MLIB_MACRND_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MacRnd_F32lls_Ci(f32Accum, f32Mult1, f16Mult2) \ + MLIB_MacRnd_F32lls_FCi(f32Accum, f32Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = f32Accum + ( f32Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_MacRnd_F32lls_FCi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac16_t f16Mult2) +{ + register uint64_t u64Temp; + register frac64_t f64Temp; + + f64Temp = (frac64_t)f32Mult1 * (frac16_t)f16Mult2 + 0x4000; + u64Temp = (uint64_t)f64Temp >> 15U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x2000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return ((frac32_t)u64Temp + (frac32_t)f32Accum); /* cast back the corrected values and add accumulator */ +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MACRND_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F32_Asmi.h new file mode 100644 index 0000000..b0e73c5 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MacRnd_F32_Asmi.h @@ -0,0 +1,332 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MACRND_F32_ASM_H_ +#define _MLIB_MACRND_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MacRnd_F32_Asmi(f32Accum, f32Mult1, f32Mult2) \ + MLIB_MacRnd_F32_FAsmi(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MacRndSat_F32_Asm(f32Accum, f32Mult1, f32Mult2) \ + MLIB_MacRndSat_F32_FAsm(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MacRndSat_F32lls_Asmi(f32Accum, f32Mult1, f16Mult2) \ + MLIB_MacRndSat_F32lls_FAsmi(f32Accum, f32Mult1, f16Mult2) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_MacRndSat_F32_FAsm(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2); + +/***************************************************************************//*! +* +* f32Out = f32Accum + ( f32Mult1 * f32Mult2) +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MacRnd_F32_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #1 /* f32Val1 >> 1 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + asrs f32Val2, f32Val2, #13 /* f32Val2 >> 13 */ + adds f32Val2, f32Val2, #1 /* Rounding */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + lsls f32Mult1, f32Mult1, #1 /* f32Mult1 << 1 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + adds f32Accum, f32Accum, f32Mult1 };/* f32Accum + f16Mult1 * f16Mult2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %3, %1 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n\t" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #13 \n\t" /* f32Val2 >> 13 */ + "adds %4, %4, #1 \n\t" /* Rounding */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n\t" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + "adds %0, %0, %1 \n\t" /* f32Accum + f16Mult1 * f16Mult2 */ + + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %3, %1 \n" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #13 \n" /* f32Val2 >> 13 */ + "adds %4, %4, #1 \n" /* Rounding */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + "adds %0, %0, %1 \n" /* f32Accum + f16Mult1 * f16Mult2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f32Out = f32Accum + ( f32Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MacRndSat_F32lls_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac16_t f16Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + uxth f32Val2, f32Mult1 /* f32Val2 = f32Mult1.L */ + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + + muls f32Val2, f32Val2, f16Mult2 /* f32Val2 = f32Mult1.L * f16Mult2 */ + asrs f32Val2, f32Val2, #7 /* f32Val2 >> 7 */ + adds f32Val2, f32Val2, #128 /* Rounding */ + asrs f32Val2, f32Val2, #8 /* f32Val2 >> 8 */ + + movs f32Val1, #0 /* f32Val1 = 0 */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adcs f32Val1, f32Val1, f32Val1 /* Stores the last bit of multiplication to f32Val1 */ + muls f32Mult1, f32Mult1, f16Mult2 /* f32Mult1 = f32Mult1.H * f16Mult2 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + + movs f32Val2, #0 /* f32Val1 = 0 */ + asrs f32Accum, f32Accum, #1 /* f32Accum >> 1 */ + adcs f32Val2, f32Val2, f32Val2 /* Stores the last bit of f32Accum to f32Val2 */ + + adds f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 + f32Val2 */ + lsls f32Val1, f32Val1, #31 /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + adcs f32Accum, f32Accum, f32Mult1 /* (result / 2) + Carry */ + + mov f32Mult1, f32Accum /* f32Mult1 = result / 2 */ + lsls f32Val2, f32Accum, #1 /* f32Val2 = result */ + lsrs f32Val1, f32Val1, #31 /* f32Val1 >> 31 (the last bit of result) */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = result + last bit */ + + eors f32Accum, f32Accum, f32Val2 /* f32Accum = f32Accum ^ f32Val2 */ + bpl SatEnd /* If f32Accum >= 0, then goes to SatEnd */ + movs f32Val2, #128 /* f32Val2 = 0x80 */ + lsls f32Val2, f32Val2, #24 /* result = 0x80000000 */ + cmp f32Mult1, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32Mult1 < 0, then goes to SatEnd */ + subs f32Val2, f32Val2, #1 /* result = 0x7FFFFFFF*/ + SatEnd: + movs f32Accum, f32Val2 }; /* f32Accum = result*/ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "uxth %4, %1 \n\t" /* f32Val2 = f32Mult1.L */ + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + + "muls %4, %4, %2 \n\t" /* f32Val2 = f32Mult1.L * f16Mult2 */ + "asrs %4, %4, #7 \n\t" /* f32Val2 >> 7 */ + "adds %4, %4, #128 \n\t" /* Rounding */ + "asrs %4, %4, #8 \n\t" /* f32Val2 >> 8 */ + + "movs %3, #0 \n\t" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n\t" /* Stores the last bit of multiplication to f32Val1 */ + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f16Mult2 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n\t" /* f32Val1 = 0 */ + "asrs %0, %0, #1 \n\t" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n\t" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n\t" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n\t" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %1 \n\t" /* (result / 2) + Carry */ + + "mov %1, %0 \n\t" /* f32Mult1 = result / 2 */ + "lsls %4, %0, #1 \n\t" /* f32Val2 = result */ + "lsrs %3, %3, #31 \n\t" /* f32Val1 >> 31 (the last bit of result) */ + "adds %4, %4, %3 \n\t" /* f32Val2 = result + last bit */ + + "eors %0, %0, %4 \n\t" /* f32Accum = f32Accum ^ f32Val2 */ + "bpl MLIB_MacRndSat_F32lls_SatEnd%= \n\t" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %4, #128 \n\t" /* f32Val2 = 0x80 */ + "lsls %4, %4, #24 \n\t" /* result = 0x80000000 */ + "cmp %1, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_MacRndSat_F32lls_SatEnd%= \n\t" /* If f32Mult1 < 0, then jumps through next command */ + "subs %4, %4, #1 \n\t" /* result = 0x7FFFFFFF*/ + "movs %0, %4 \n\t" /* f32Accum = result*/ + "MLIB_MacRndSat_F32lls_SatEnd%=: \n\t" + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f16Mult2), "+l"(f32Val1), "+l"(f32Val2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "uxth %4, %1 \n" /* f32Val2 = f32Mult1.L */ + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + + "muls %4, %4, %2 \n" /* f32Val2 = f32Mult1.L * f16Mult2 */ + "asrs %4, %4, #7 \n" /* f32Val2 >> 7 */ + "adds %4, %4, #128 \n" /* Rounding */ + "asrs %4, %4, #8 \n" /* f32Val2 >> 8 */ + + "movs %3, #0 \n" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n" /* Stores the last bit of multiplication to f32Val1 */ + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f16Mult2 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n" /* f32Val1 = 0 */ + "asrs %0, %0, #1 \n" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %1 \n" /* (result / 2) + Carry */ + + "mov %1, %0 \n" /* f32Mult1 = result / 2 */ + "lsls %4, %0, #1 \n" /* f32Val2 = result */ + "lsrs %3, %3, #31 \n" /* f32Val1 >> 31 (the last bit of result) */ + "adds %4, %4, %3 \n" /* f32Val2 = result + last bit */ + + "eors %0, %0, %4 \n" /* f32Accum = f32Accum ^ f32Val2 */ + "bpl .+12 \n" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %4, #128 \n" /* f32Val2 = 0x80 */ + "lsls %4, %4, #24 \n" /* result = 0x80000000 */ + "cmp %1, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32Mult1 < 0, then jumps through next command */ + "subs %4, %4, #1 \n" /* result = 0x7FFFFFFF*/ + "movs %0, %4 \n" /* f32Accum = result*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f16Mult2), "+l"(f32Val1), "+l"(f32Val2):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MACRND_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_A32.h new file mode 100644 index 0000000..4922a86 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_A32.h @@ -0,0 +1,70 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MAC_A32_H_ +#define _MLIB_MAC_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mac_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) \ + MLIB_Mac_A32ass_FCi(a32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* a32Out = a32Accum + ( f16Mult1 * f16Mult2 ) +* +*******************************************************************************/ +static inline acc32_t MLIB_Mac_A32ass_FCi(register acc32_t a32Accum, + register frac16_t f16Mult1,register frac16_t f16Mult2) +{ + return (acc32_t)(MLIB_ShR_F32_Ci(((int32_t)f16Mult1 * (int32_t)f16Mult2), 15U) + a32Accum); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MAC_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F16.h new file mode 100644 index 0000000..b4447a3 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F16.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MAC_F16_H_ +#define _MLIB_MAC_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mac_F16_Ci( f16Accum, f16Mult1, f16Mult2) \ + MLIB_Mac_F16_FCi( f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Accum + ( f16Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Mac_F16_FCi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register acc32_t a32Temp; + + a32Temp = ((int32_t)f16Mult1 * (int32_t)f16Mult2); + a32Temp = MLIB_ShR_F32_Ci(a32Temp, 15U); + a32Temp = (acc32_t)f16Accum + a32Temp; + return((frac16_t)a32Temp); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MAC_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F16_Asmi.h new file mode 100644 index 0000000..08b2423 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F16_Asmi.h @@ -0,0 +1,143 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MAC_F16_ASM_H_ +#define _MLIB_MAC_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MacSat_F16_Asmi(f16Accum, f16Mult1, f16Mult2) \ + MLIB_MacSat_F16_FAsmi(f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Accum + ( f16Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MacSat_F16_FAsmi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + sxth f16Accum, f16Accum /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #15 /* f16Mult1 >> 15 */ + adds f16Accum, f16Accum, f16Mult1 /* f16Accum + f16Mult1 * f16Mult2 */ + + movs f16Mult1, #128 /* f16Mult1 = 0x80 */ + lsls f16Mult1, f16Mult1, #8 /* f16Mult1 = 0x8000 */ + + cmp f16Mult1, f16Accum /* Compares f16Accum with 0x8000 */ + bgt NegTest /* If f16Accum < 0x8000, then goes to NegTest */ + subs f16Accum, f16Mult1, #1 /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f16Mult1, f16Mult1 /* f16Mult1 = 0xFFFF8000 */ + cmp f16Mult1, f16Accum /* Compares f16Accum with 0xFFFF8000 */ + ble SatEnd /* If f16Accum >= 0xFFFF8000, then goes to SatEnd */ + mov f16Accum, f16Mult1 /* If f16Accum < 0xFFFF8000, then f16Mult1 = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #15 \n\t" /* f16Mult1 >> 15 */ + "adds %0, %0, %1 \n\t" /* f16Accum + f16Mult1 * f16Mult2 */ + "movs %1, #128 \n\t" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n\t" /* f16Mult1 = 0x8000 */ + "cmp %1, %0 \n\t" /* Compares f16Accum with 0x8000 */ + "bgt MLIB_MacSat_F16_NegTest%= \n\t" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n\t" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b MLIB_MacSat_F16_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MacSat_F16_NegTest%=: \n\t" + "sxth %1, %1 \n\t" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n\t" /* Compares f16Accum with 0xFFFF8000 */ + "ble MLIB_MacSat_F16_SatEnd%= \n\t" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n\t" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + "MLIB_MacSat_F16_SatEnd%=: \n\t" + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #15 \n" /* f16Mult1 >> 15 */ + "adds %0, %0, %1 \n" /* f16Accum + f16Mult1 * f16Mult2 */ + "movs %1, #128 \n" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n" /* f16Mult1 = 0x8000 */ + "cmp %1, %0 \n" /* Compares f16Accum with 0x8000 */ + "bgt .+6 \n" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + "sxth %1, %1 \n" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n" /* Compares f16Accum with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return f16Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MAC_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F32.h new file mode 100644 index 0000000..f9f0c69 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F32.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MAC_F32_H_ +#define _MLIB_MAC_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Add_F32.h" +#include "MLIB_Sub_F32.h" +#include "MLIB_Mul_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mac_F32lss_Ci(f32Accum, f16Mult1, f16Mult2) \ + MLIB_Mac_F32lss_FCi(f32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = f32Accum + ( f16Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_Mac_F32lss_FCi(register frac32_t f32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + frac32_t f32Temp; + f32Temp = MLIB_Mul_F32ss_Ci(f16Mult1,f16Mult2); + return(MLIB_Add_F32_Ci(f32Accum, f32Temp)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MAC_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F32_Asmi.h new file mode 100644 index 0000000..f4b5833 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mac_F32_Asmi.h @@ -0,0 +1,435 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MAC_F32_ASM_H_ +#define _MLIB_MAC_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mac_F32_Asmi(f32Accum, f32Mult1, f32Mult2) \ + MLIB_Mac_F32_FAsmi(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MacSat_F32_Asmi(f32Accum, f32Mult1, f32Mult2) \ + MLIB_MacSat_F32_FAsmi(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MacSat_F32lss_Asmi(f32Accum, f16Mult1, f16Mult2) \ + MLIB_MacSat_F32lss_FAsmi(f32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = f32Accum + (f32Mult1 * f32Mult2) +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_Mac_F32_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #1 /* f32Val1 >> 1 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + asrs f32Val2, f32Val2, #14 /* f32Val2 >> 14 */ + + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + lsls f32Mult1, f32Mult1, #1 /* f32Mult1 << 1 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + adds f32Accum, f32Accum, f32Mult1 } /* f32Accum + f16Mult1 * f16Mult2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %3, %1 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n\t" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n\t" /* f32Val2 >> 14 */ + + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n\t" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + "adds %0, %0, %1 \n\t" /* f32Accum + f16Mult1 * f16Mult2 */ + + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %3, %1 \n" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n" /* f32Val2 >> 14 */ + + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + "adds %0, %0, %1 \n" /* f32Accum + f16Mult1 * f16Mult2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f32Out = f32Accum + (f32Mult1 * f32Mult2) +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MacSat_F32_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #1 /* f32Val1 >> 1 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + asrs f32Val2, f32Val2, #14 /* f32Val2 >> 14 */ + + movs f32Val1, #0 /* f32Val1 = 0 */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adcs f32Val1, f32Val1, f32Val1 /* Stores the last bit of multiplication to f32Val1 */ + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + + movs f32Val2, #0 /* f32Val1 = 0 */ + asrs f32Accum, f32Accum, #1 /* f32Accum >> 1 */ + adcs f32Val2, f32Val2, f32Val2 /* Stores the last bit of f32Accum to f32Val2 */ + + adds f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 + f32Val2 */ + lsls f32Val1, f32Val1, #31 /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + adcs f32Accum, f32Accum, f32Mult1 /* (result / 2) + Carry */ + + mov f32Mult1, f32Accum /* f32Mult1 = result / 2 */ + lsls f32Mult2, f32Accum, #1 /* f32Mult2 = result */ + lsrs f32Val1, f32Val1, #31 /* f32Val1 >> 31 (the last bit of result) */ + adds f32Mult2, f32Mult2, f32Val1 /* f32Mult2 = result + last bit */ + + eors f32Accum, f32Accum, f32Mult2 /* f32Accum = f32Accum ^ f32Mult2 */ + bpl SatEnd /* If f32Accum >= 0, then goes to SatEnd */ + movs f32Mult2, #128 /* f32Mult2 = 0x80 */ + rev f32Mult2, f32Mult2 /* result = 0x80000000 */ + cmp f32Mult1, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32Mult1 < 0, then goes to SatEnd */ + subs f32Mult2, f32Mult2, #1 /* result = 0x7FFFFFFF*/ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %3, %2 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %4, %1 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %2, %2, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %3, %3, %1 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n\t" /* f32Val1 >> 1 */ + + "muls %4, %4, %2 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n\t" /* f32Val2 >> 14 */ + + "movs %3, #0 \n\t" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n\t" /* Stores the last bit of multiplication to f32Val1 */ + "muls %2, %2, %1 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "adds %2, %2, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n\t" /* f32Val1 = 0 */ + "asrs %0, %0, #1 \n\t" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n\t" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n\t" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n\t" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %2 \n\t" /* (result / 2) + Carry */ + + "mov %2, %0 \n\t" /* f32Mult1 = result / 2 */ + "lsls %1, %0, #1 \n\t" /* f32Mult2 = result */ + "lsrs %3, %3, #31 \n\t" /* f32Val1 >> 31 (the last bit of result) */ + "adds %1, %1, %3 \n\t" /* f32Mult2 = result + last bit */ + + "eors %0, %0, %1 \n\t" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl MLIB_MacSat_F32_SatEnd%= \n\t" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %1, #128 \n\t" /* f32Mult2 = 0x80 */ + "rev %1, %1 \n\t" /* result = 0x80000000 */ + "cmp %2, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_MacSat_F32_SatEnd%= \n\t" /* If f32Mult1 < 0, then jumps through next command */ + "subs %1, %1, #1 \n\t" /* result = 0x7FFFFFFF*/ + "MLIB_MacSat_F32_SatEnd%=: \n\t" + : "+l"(f32Accum), "+l"(f32Mult2), "+l"(f32Mult1), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %3, %2 \n" /* f32Val1 = f32Mult1.L */ + "uxth %4, %1 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %2, %2, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n" /* f32Val3 >> 16 */ + + "muls %3, %3, %1 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n" /* f32Val1 >> 1 */ + + "muls %4, %4, %2 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n" /* f32Val2 >> 14 */ + + "movs %3, #0 \n" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n" /* Stores the last bit of multiplication to f32Val1 */ + "muls %2, %2, %1 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "adds %2, %2, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n" /* f32Val1 = 0 */ + "asrs %0, %0, #1 \n" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %2 \n" /* (result / 2) + Carry */ + + "mov %2, %0 \n" /* f32Mult1 = result / 2 */ + "lsls %1, %0, #1 \n" /* f32Mult2 = result */ + "lsrs %3, %3, #31 \n" /* f32Val1 >> 31 (the last bit of result) */ + "adds %1, %1, %3 \n" /* f32Mult2 = result + last bit */ + + "eors %0, %0, %1 \n" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl .+12 \n" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %1, #128 \n" /* f32Mult2 = 0x80 */ + "rev %1, %1 \n" /* result = 0x80000000 */ + "cmp %2, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32Mult1 < 0, then jumps through next command */ + "subs %1, %1, #1 \n" /* result = 0x7FFFFFFF*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult2), "+l"(f32Mult1), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Mult2; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif +/***************************************************************************//*! +* +* f32Out = f32Accum + (f16Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MacSat_F32lss_FAsmi(register frac32_t f32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register frac32_t f32Val = 0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2,f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f32Accum, f32Accum, #1 /* f32Accum >> 1 */ + adcs f32Val, f32Val, f32Val /* f32Val = the last bit of f32Accum */ + adds f16Mult1, f16Mult1, f32Accum /* f16Mult1 * f16Mult2 */ + + mov f16Mult2, f16Mult1 /* f16Mult1 = result / 2 */ + lsls f32Accum, f16Mult1, #1 /* f32Mult2 = result */ + adds f32Accum, f32Accum, f32Val /* f32Mult2 = result + last bit */ + + eors f16Mult1, f16Mult1, f32Accum /* f32Accum = f32Accum ^ f32Mult2 */ + bpl SatEnd /* If f32Accum >= 0, then jumps to the end of function*/ + movs f32Accum, #128 /* f32Mult2 = 0x80 */ + rev f32Accum, f32Accum /* result = 0x80000000 */ + cmp f16Mult2, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32Mult1 < 0, then jumps through next command */ + subs f32Accum, f32Accum, #1 /* result = 0x7FFFFFFF*/ + SatEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %0, %0, #1 \n\t" /* f32Accum >> 1 */ + "adcs %3, %3, %3 \n\t" /* f32Val = the last bit of f32Accum */ + "adds %1, %1, %0 \n\t" /* f16Mult1 * f16Mult2 */ + + "mov %2, %1 \n\t" /* f16Mult1 = result / 2 */ + "lsls %0, %1, #1 \n\t" /* f32Mult2 = result */ + "adds %0, %0, %3 \n\t" /* f32Mult2 = result + last bit */ + + "eors %1, %1, %0 \n\t" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl MLIB_MacSat_F32lss_SatEnd%= \n\t" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %0, #128 \n\t" /* f32Mult2 = 0x80 */ + "rev %0, %0 \n\t" /* result = 0x80000000 */ + "cmp %2, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_MacSat_F32lss_SatEnd%= \n\t" /* If f32Mult1 < 0, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* result = 0x7FFFFFFF*/ + "MLIB_MacSat_F32lss_SatEnd%=: \n\t" + : "+l"(f32Accum), "+l"(f16Mult1), "+l"(f16Mult2), "+l"(f32Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %0, %0, #1 \n" /* f32Accum >> 1 */ + "adcs %3, %3, %3 \n" /* f32Val = the last bit of f32Accum */ + "adds %1, %1, %0 \n" /* f16Mult1 * f16Mult2 */ + + "mov %2, %1 \n" /* f16Mult1 = result / 2 */ + "lsls %0, %1, #1 \n" /* f32Mult2 = result */ + "adds %0, %0, %3 \n" /* f32Mult2 = result + last bit */ + + "eors %1, %1, %0 \n" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl .+12 \n" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %0, #128 \n" /* f32Mult2 = 0x80 */ + "rev %0, %0 \n" /* result = 0x80000000 */ + "cmp %2, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32Mult1 < 0, then jumps through next command */ + "subs %0, %0, #1 \n" /* result = 0x7FFFFFFF*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f16Mult1), "+l"(f16Mult2), "+l"(f32Val):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MAC_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_A32.h new file mode 100644 index 0000000..a6b11bc --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_A32.h @@ -0,0 +1,74 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MNACRND_A32_H_ +#define _MLIB_MNACRND_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MnacRnd_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) \ + MLIB_MnacRnd_A32ass_FCi(a32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* a32Out = - a32Accum + ( f16Mult1 * f16Mult2) +* +*******************************************************************************/ +static inline acc32_t MLIB_MnacRnd_A32ass_FCi(register acc32_t a32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register acc32_t a32Temp; + + a32Temp = (int32_t)f16Mult1 * (int32_t)f16Mult2; + a32Temp = a32Temp + 0x00004000; + a32Temp = MLIB_ShR_F32_Ci(a32Temp, 15U); + return (a32Temp - a32Accum); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNACRND_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_A32_Asmi.h new file mode 100644 index 0000000..78c00c8 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_A32_Asmi.h @@ -0,0 +1,110 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MNACRND_A32_ASM_H_ +#define _MLIB_MNACRND_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MnacRnd_A32ass_Asmi(a32Accum, f16Mult1, f16Mult2) \ + MLIB_MnacRnd_A32ass_FAsmi(a32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* a32Out = - a32Accum + ( f16Mult1 * f16Mult2) +* +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MnacRnd_A32ass_FAsmi(register acc32_t a32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #7 /* f16Mult1 >> 7 for fractional multiplication */ + adds f16Mult1, f16Mult1, #128 /* Rounding */ + asrs f16Mult1, f16Mult1, #8 /* f16Mult1 >> 8 for fractional multiplication */ + subs a32Accum, f16Mult1, a32Accum }; /* f16Mult1 * f16Mult2 - a32Accum*/ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n\t" /* f16Mult1 >> 7 for fractional multiplication */ + "adds %1, %1, #128 \n\t" /* Rounding */ + "asrs %1, %1, #8 \n\t" /* f16Mult1 >> 8 for fractional multiplication */ + "subs %0, %1, %0 \n\t" /* f16Mult1 * f16Mult2 - a32Accum*/ + : "+l"(a32Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n" /* f16Mult1 >> 7 for fractional multiplication */ + "adds %1, %1, #128 \n" /* Rounding */ + "asrs %1, %1, #8 \n" /* f16Mult1 >> 8 for fractional multiplication */ + "subs %0, %1, %0 \n" /* f16Mult1 * f16Mult2 - a32Accum*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return a32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNACRND_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F16.h new file mode 100644 index 0000000..8079c05 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F16.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MNACRND_F16_H_ +#define _MLIB_MNACRND_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MnacRnd_F16_Ci( f16Accum, f16Mult1, f16Mult2) \ + MLIB_MnacRnd_F16_FCi( f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = - f16Accum + ( f16Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_MnacRnd_F16_FCi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register acc32_t a32Temp; + + a32Temp = ((int32_t)f16Mult1 * (int32_t)f16Mult2); + a32Temp = MLIB_ShR_F32_Ci(a32Temp + 0x00004000, 15U); + a32Temp = a32Temp - (acc32_t)f16Accum; + return((frac16_t)a32Temp); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNACRND_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F16_Asmi.h new file mode 100644 index 0000000..77201fb --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F16_Asmi.h @@ -0,0 +1,153 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MNACRND_F16_ASM_H_ +#define _MLIB_MNACRND_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MnacRndSat_F16_Asmi(f16Accum, f16Mult1, f16Mult2) \ + MLIB_MnacRndSat_F16_FAsmi(f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = - f16Accum + ( f16Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MnacRndSat_F16_FAsmi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Accum, f16Accum /* Converts 16-bit input to 32-bit */ + sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #7 /* f16Mult1 >> 7 */ + adds f16Mult1, f16Mult1, #128 /* Rounding */ + asrs f16Mult1, f16Mult1, #8 /* f16Mult1 >> 8 */ + subs f16Accum, f16Mult1, f16Accum /* f16Mult1 * f16Mult2 - f16Accum*/ + + movs f16Mult1, #128 /* f16Mult1 = 0x80 */ + lsls f16Mult1, f16Mult1, #8 /* f16Mult1 = 0x8000 */ + + cmp f16Mult1, f16Accum /* Compares f16Accum with 0x8000 */ + bgt NegTest /* If f16Accum < 0x8000, then goes to NegTest */ + subs f16Accum, f16Mult1, #1 /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f16Mult1, f16Mult1 /* f16Mult1 = 0xFFFF8000 */ + cmp f16Mult1, f16Accum /* Compares f16Accum with 0xFFFF8000 */ + ble SatEnd /* If f16Accum >= 0xFFFF8000, then goes to SatEnd */ + mov f16Accum, f16Mult1 /* If f16Accum < 0xFFFF8000, then f16Mult1 = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n\t" /* f16Mult1 >> 7 */ + "adds %1, %1, #128 \n\t" /* Rounding */ + "asrs %1, %1, #8 \n\t" /* f16Mult1 >> 8 */ + "subs %0, %1, %0 \n\t" /* f16Mult1 * f16Mult2 - f16Accum*/ + + "movs %1, #128 \n\t" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n\t" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n\t" /* Compares f16Accum with 0x8000 */ + "bgt MLIB_MnacRndSat_F16_NegTest%= \n\t" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n\t" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b MLIB_MnacRndSat_F16_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MnacRndSat_F16_NegTest%=: \n\t" + "sxth %1, %1 \n\t" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n\t" /* Compares f16Accum with 0xFFFF8000 */ + "ble MLIB_MnacRndSat_F16_SatEnd%= \n\t" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n\t" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + "MLIB_MnacRndSat_F16_SatEnd%=: \n\t" + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n" /* f16Mult1 >> 7 */ + "adds %1, %1, #128 \n" /* Rounding */ + "asrs %1, %1, #8 \n" /* f16Mult1 >> 8 */ + "subs %0, %1, %0 \n" /* f16Mult1 * f16Mult2 - f16Accum*/ + + "movs %1, #128 \n" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n" /* Compares f16Accum with 0x8000 */ + "bgt .+6 \n" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + "sxth %1, %1 \n" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n" /* Compares f16Accum with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return f16Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MACRND_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F32.h new file mode 100644 index 0000000..798ed28 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F32.h @@ -0,0 +1,77 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MNACRND_F32_H_ +#define _MLIB_MNACRND_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Sub_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MnacRnd_F32lls_Ci(f32Accum, f32Mult1, f16Mult2) \ + MLIB_MnacRnd_F32lls_FCi(f32Accum, f32Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = - f32Accum + ( f32Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_MnacRnd_F32lls_FCi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac16_t f16Mult2) +{ + register uint64_t u64Temp; + register frac64_t f64Temp; + + f64Temp = (frac64_t)f32Mult1*(frac16_t)f16Mult2 + 0x4000; + u64Temp = (uint64_t)f64Temp >> 15U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x8000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return (frac32_t)((frac32_t)u64Temp - (frac32_t)f32Accum); /* cast back the corrected values */ +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNACRND_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F32_Asmi.h new file mode 100644 index 0000000..acd5297 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MnacRnd_F32_Asmi.h @@ -0,0 +1,351 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MNACRND_F32_ASM_H_ +#define _MLIB_MNACRND_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MnacRnd_F32_Asmi(f32Accum, f32Mult1, f32Mult2) \ + MLIB_MnacRnd_F32_FAsmi(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MnacRndSat_F32_Asm(f32Accum, f32Mult1, f32Mult2) \ + MLIB_MnacRndSat_F32_FAsm(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MnacRndSat_F32lls_Asmi(f32Accum, f32Mult1, f16Mult2) \ + MLIB_MnacRndSat_F32lls_FAsmi(f32Accum, f32Mult1, f16Mult2) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_MnacRndSat_F32_FAsm(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2); + +/***************************************************************************//*! +* +* f32Out = - f32Accum + ( f32Mult1 * f32Mult2) +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MnacRnd_F32_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #1 /* f32Val1 >> 1 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + asrs f32Val2, f32Val2, #13 /* f32Val2 >> 13 */ + adds f32Val2, f32Val2, #1 /* Rounding */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + lsls f32Mult1, f32Mult1, #1 /* f32Mult1 << 1 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + subs f32Accum, f32Mult1, f32Accum}; /* f16Mult1 * f16Mult2 - f32Accum*/ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %3, %1 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n\t" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #13 \n\t" /* f32Val2 >> 13 */ + "adds %4, %4, #1 \n\t" /* Rounding */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n\t" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + "subs %0, %1, %0 \n\t" /* f16Mult1 * f16Mult2 - f32Accum*/ + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %3, %1 \n" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #13 \n" /* f32Val2 >> 13 */ + "adds %4, %4, #1 \n" /* Rounding */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + "subs %0, %1, %0 \n" /* f16Mult1 * f16Mult2 - f32Accum*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f32Out = - f32Accum + ( f32Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MnacRndSat_F32lls_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac16_t f16Mult2) +{ + + register frac32_t f32Val1=0, f32Val2=0; + register frac32_t f32Val3 = (frac32_t)0x80000000U; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + uxth f32Val2, f32Mult1 /* f32Val2 = f32Mult1.L */ + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + + muls f32Val2, f32Val2, f16Mult2 /* f32Val2 = f32Mult1.L * f16Mult2 */ + asrs f32Val2, f32Val2, #7 /* f32Val2 >> 7 */ + adds f32Val2, f32Val2, #128 /* Rounding */ + asrs f32Val2, f32Val2, #8 /* f32Val2 >> 8 */ + + movs f32Val1, #0 /* f32Val1 = 0 */ + + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adcs f32Val1, f32Val1, f32Val1 /* Stores the last bit of multiplication to f32Val1 */ + muls f32Mult1, f32Mult1, f16Mult2 /* f32Mult1 = f32Mult1.H * f16Mult2 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + + movs f32Val2, #0 /* f32Val1 = 0 */ + rsbs f32Accum, f32Accum, #0 /* f32Accum =-f32Accum */ + cmp f32Accum, f32Val3 /* Compares f32Accum with 0x80000000 */ + bne NotNeg /* If f32Accum != 0x8000000, then go to NotNeg */ + subs f32Accum, f32Accum, #1 /* If f32Accum == 0x80000000 then f32Accum = 0x7ffffff */ + NotNeg: + asrs f32Accum, f32Accum, #1 /* f32Accum >> 1 */ + adcs f32Val2, f32Val2, f32Val2 /* Stores the last bit of f32Accum to f32Val2 */ + + adds f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 + f32Val2 */ + lsls f32Val1, f32Val1, #31 /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + adcs f32Accum, f32Accum, f32Mult1 /* (result / 2) + Carry */ + + mov f32Mult1, f32Accum /* f32Mult1 = result / 2 */ + lsls f32Val2, f32Accum, #1 /* f32Val2 = result */ + lsrs f32Val1, f32Val1, #31 /* f32Val1 >> 31 (the last bit of result) */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = result + last bit */ + + eors f32Accum, f32Accum, f32Val2 /* f32Accum = f32Accum ^ f32Val2 */ + bpl SatEnd /* If f32Accum >= 0, then goes to SatEnd */ + movs f32Val2, #128 /* f32Val2 = 0x80 */ + lsls f32Val2, f32Val2, #24 /* result = 0x80000000 */ + cmp f32Mult1, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32Mult1 < 0, then goes to SatEnd */ + subs f32Val2, f32Val2, #1 /* result = 0x7FFFFFFF*/ + SatEnd: + movs f32Accum, f32Val2 }; /* f32Accum = result*/ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "uxth %4, %1 \n\t" /* f32Val2 = f32Mult1.L */ + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + + "muls %4, %4, %2 \n\t" /* f32Val2 = f32Mult1.L * f16Mult2 */ + "asrs %4, %4, #7 \n\t" /* f32Val2 >> 7 */ + "adds %4, %4, #128 \n\t" /* Rounding */ + "asrs %4, %4, #8 \n\t" /* f32Val2 >> 8 */ + + "movs %3, #0 \n\t" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n\t" /* Stores the last bit of multiplication to f32Val1 */ + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f16Mult2 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n\t" /* f32Val1 = 0 */ + "rsbs %0, %0, #0 \n\t" /* f32Accum =-f32Accum */ + "cmp %0, %5 \n\t" /* Compares f32Accum with 0x80000000 */ + "bne MLIB_MnacRndSat_F32lls_NotNeg%= \n\t" /* If f32Accum != 0x80000000, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* If f32Accum == 0x80000000 then f32Accum = 0x7ffffff */ + "MLIB_MnacRndSat_F32lls_NotNeg%=: \n\t" + "asrs %0, %0, #1 \n\t" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n\t" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n\t" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n\t" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %1 \n\t" /* (result / 2) + Carry */ + + "mov %1, %0 \n\t" /* f32Mult1 = result / 2 */ + "lsls %4, %0, #1 \n\t" /* f32Val2 = result */ + "lsrs %3, %3, #31 \n\t" /* f32Val1 >> 31 (the last bit of result) */ + "adds %4, %4, %3 \n\t" /* f32Val2 = result + last bit */ + + "eors %0, %0, %4 \n\t" /* f32Accum = f32Accum ^ f32Val2 */ + "bpl MLIB_MnacRndSat_F32lls_SatEnd%= \n\t" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %4, #128 \n\t" /* f32Val2 = 0x80 */ + "lsls %4, %4, #24 \n\t" /* result = 0x80000000 */ + "cmp %1, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_MnacRndSat_F32lls_SatEnd%= \n\t" /* If f32Mult1 < 0, then jumps through next command */ + "subs %4, %4, #1 \n\t" /* result = 0x7FFFFFFF*/ + "MLIB_MnacRndSat_F32lls_SatEnd%=: \n\t" + "movs %0, %4 \n\t" /* f32Accum = result*/ + + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f16Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "uxth %4, %1 \n" /* f32Val2 = f32Mult1.L */ + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + + "muls %4, %4, %2 \n" /* f32Val2 = f32Mult1.L * f16Mult2 */ + "asrs %4, %4, #7 \n" /* f32Val2 >> 7 */ + "adds %4, %4, #128 \n" /* Rounding */ + "asrs %4, %4, #8 \n" /* f32Val2 >> 8 */ + + "movs %3, #0 \n" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n" /* Stores the last bit of multiplication to f32Val1 */ + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f16Mult2 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n" /* f32Val1 = 0 */ + "rsbs %0, %0, #0 \n" /* f32Accum =-f32Accum */ + "cmp %0, %5 \n" /* Compares f32Accum with 0x80000000 */ + "bne .+4 \n" /* If f32Accum != 0x80000000, then jumps through next command */ + "subs %0, %0, #1 \n" /* If f32Accum == 0x80000000 then f32Accum = 0x7ffffff */ + "asrs %0, %0, #1 \n" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %1 \n" /* (result / 2) + Carry */ + + "mov %1, %0 \n" /* f32Mult1 = result / 2 */ + "lsls %4, %0, #1 \n" /* f32Val2 = result */ + "lsrs %3, %3, #31 \n" /* f32Val1 >> 31 (the last bit of result) */ + "adds %4, %4, %3 \n" /* f32Val2 = result + last bit */ + + "eors %0, %0, %4 \n" /* f32Accum = f32Accum ^ f32Val2 */ + "bpl .+12 \n" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %4, #128 \n" /* f32Val2 = 0x80 */ + "lsls %4, %4, #24 \n" /* result = 0x80000000 */ + "cmp %1, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32Mult1 < 0, then jumps through next command */ + "subs %4, %4, #1 \n" /* result = 0x7FFFFFFF*/ + "movs %0, %4 \n" /* f32Accum = result*/ + + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f16Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNACRND_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_A32.h new file mode 100644 index 0000000..1c8c79a --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_A32.h @@ -0,0 +1,70 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MNAC_A32_H_ +#define _MLIB_MNAC_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mnac_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) \ + MLIB_Mnac_A32ass_FCi(a32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* a32Out = - a32Accum + ( f16Mult1 * f16Mult2 ) +* +*******************************************************************************/ +static inline acc32_t MLIB_Mnac_A32ass_FCi(register acc32_t a32Accum, + register frac16_t f16Mult1,register frac16_t f16Mult2) +{ + return (acc32_t)(MLIB_ShR_F32_Ci(((int32_t)f16Mult1 * (int32_t)f16Mult2), 15U) - a32Accum); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNAC_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F16.h new file mode 100644 index 0000000..9039bdd --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F16.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MNAC_F16_H_ +#define _MLIB_MNAC_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mnac_F16_Ci( f16Accum, f16Mult1, f16Mult2) \ + MLIB_Mnac_F16_FCi( f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = - f16Accum + ( f16Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Mnac_F16_FCi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register acc32_t a32Temp; + + a32Temp = ((int32_t)f16Mult1 * (int32_t)f16Mult2); + a32Temp = a32Temp >> 15; + a32Temp = a32Temp - (acc32_t)f16Accum; + return((frac16_t)a32Temp); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNAC_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F16_Asmi.h new file mode 100644 index 0000000..bf5e5a9 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F16_Asmi.h @@ -0,0 +1,147 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MNAC_F16_ASM_H_ +#define _MLIB_MNAC_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MnacSat_F16_Asmi( f16Accum, f16Mult1, f16Mult2) \ + MLIB_MnacSat_F16_FAsmi(f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = - f16Accum + ( f16Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MnacSat_F16_FAsmi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + sxth f16Accum, f16Accum /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #15 /* f16Mult1 >> 15 */ + subs f16Accum, f16Mult1, f16Accum /* f16Mult1 * f16Mult2 - f16Accum */ + + movs f16Mult1, #128 /* f16Mult1 = 0x80 */ + lsls f16Mult1, f16Mult1, #8 /* f16Mult1 = 0x8000 */ + + cmp f16Mult1, f16Accum /* Compares f16Accum with 0x8000 */ + bgt NegTest /* If f16Accum < 0x8000, then goes to NegTest */ + subs f16Accum, f16Mult1, #1 /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f16Mult1, f16Mult1 /* f16Mult1 = 0xFFFF8000 */ + cmp f16Mult1, f16Accum /* Compares f16Accum with 0xFFFF8000 */ + ble SatEnd /* If f16Accum >= 0xFFFF8000, then goes to SatEnd */ + mov f16Accum, f16Mult1 /* If f16Accum < 0xFFFF8000, then f16Mult1 = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #15 \n\t" /* f16Mult1 >> 15 */ + "subs %0, %1, %0 \n\t" /* f16Mult1 * f16Mult2 - f16Accum */ + + "movs %1, #128 \n\t" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n\t" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n\t" /* Compares f16Accum with 0x8000 */ + "bgt MLIB_MnacSat_F16_NegTest%= \n\t" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n\t" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b MLIB_MnacSat_F16_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MnacSat_F16_NegTest%=: \n\t" + "sxth %1, %1 \n\t" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n\t" /* Compares f16Accum with 0xFFFF8000 */ + "ble MLIB_MnacSat_F16_SatEnd%= \n\t" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n\t" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + "MLIB_MnacSat_F16_SatEnd%=: \n\t" + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #15 \n" /* f16Mult1 >> 15 */ + "subs %0, %1, %0 \n" /* f16Mult1 * f16Mult2 - f16Accum */ + + "movs %1, #128 \n" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n" /* Compares f16Accum with 0x8000 */ + "bgt .+6 \n" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + "sxth %1, %1 \n" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n" /* Compares f16Accum with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return f16Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNAC_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F32.h new file mode 100644 index 0000000..8bd5d2d --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F32.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MNAC_F32_H_ +#define _MLIB_MNAC_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Add_F32.h" +#include "MLIB_Sub_F32.h" +#include "MLIB_Mul_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mnac_F32lss_Ci(f32Accum, f16Mult1, f16Mult2) \ + MLIB_Mnac_F32lss_FCi(f32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = - f32Accum + ( f16Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_Mnac_F32lss_FCi(register frac32_t f32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + frac32_t f32Temp; + f32Temp = MLIB_Mul_F32ss_Ci(f16Mult1,f16Mult2); + return(MLIB_Sub_F32_Ci(f32Temp, f32Accum)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNAC_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F32_Asmi.h new file mode 100644 index 0000000..59408de --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mnac_F32_Asmi.h @@ -0,0 +1,467 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply negate accumulate +* +*******************************************************************************/ +#ifndef _MLIB_MNAC_F32_ASM_H_ +#define _MLIB_MNAC_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mnac_F32_Asmi(f32Accum, f32Mult1, f32Mult2) \ + MLIB_Mnac_F32_FAsmi(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MnacSat_F32_Asmi(f32Accum, f32Mult1, f32Mult2) \ + MLIB_MnacSat_F32_FAsmi(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MnacSat_F32lss_Asmi(f32Accum, f16Mult1, f16Mult2) \ + MLIB_MnacSat_F32lss_FAsmi(f32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = - f32Accum + (f32Mult1 * f32Mult2) +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_Mnac_F32_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #1 /* f32Val1 >> 1 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + asrs f32Val2, f32Val2, #14 /* f32Val2 >> 14 */ + + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + lsls f32Mult1, f32Mult1, #1 /* f32Mult1 << 1 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + subs f32Accum, f32Mult1, f32Accum };/* f32Accum + f16Mult1 * f16Mult2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %3, %1 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n\t" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n\t" /* f32Val2 >> 14 */ + + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n\t" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + "subs %0, %1, %0 \n\t" /* f32Accum + f16Mult1 * f16Mult2 */ + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %3, %1 \n" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n" /* f32Val2 >> 14 */ + + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + "subs %0, %1, %0 \n" /* f32Accum + f16Mult1 * f16Mult2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f32Out = - f32Accum + (f32Mult1 * f32Mult2) +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MnacSat_F32_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Min = (frac32_t)0x80000000U; + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #1 /* f32Val1 >> 1 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + asrs f32Val2, f32Val2, #14 /* f32Val2 >> 14 */ + + movs f32Val1, #0 /* f32Val1 = 0 */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adcs f32Val1, f32Val1, f32Val1 /* Stores the last bit of multiplication to f32Val1 */ + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + + movs f32Val2, #0 /* f32Val1 = 0 */ + rsbs f32Accum, f32Accum, #0 /* f32Accum =-f32Accum */ + cmp f32Accum, f32Min /* Compares f32Accum with 0x80000000 */ + bne NotNeg /* If f32Accum != 0x8000000, then go to NotNeg */ + subs f32Accum, f32Accum, #1 /* If f32Accum == 0x80000000 then f32Accum = 0x7ffffff */ + NotNeg: + asrs f32Accum, f32Accum, #1 /* f32Accum >> 1 */ + adcs f32Val2, f32Val2, f32Val2 /* Stores the last bit of f32Accum to f32Val2 */ + + adds f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 + f32Val2 */ + lsls f32Val1, f32Val1, #31 /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + adcs f32Accum, f32Accum, f32Mult1 /* (result / 2) + Carry */ + + mov f32Mult1, f32Accum /* f32Mult1 = result / 2 */ + lsls f32Mult2, f32Accum, #1 /* f32Mult2 = result */ + lsrs f32Val1, f32Val1, #31 /* f32Val1 >> 31 (the last bit of result) */ + adds f32Mult2, f32Mult2, f32Val1 /* f32Mult2 = result + last bit */ + + eors f32Accum, f32Accum, f32Mult2 /* f32Accum = f32Accum ^ f32Mult2 */ + bpl SatEnd /* If f32Accum >= 0, then goes to SatEnd */ + movs f32Mult2, #128 /* f32Mult2 = 0x80 */ + rev f32Mult2, f32Mult2 /* result = 0x80000000 */ + cmp f32Mult1, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32Mult1 < 0, then goes to SatEnd */ + subs f32Mult2, f32Mult2, #1 /* result = 0x7FFFFFFF*/ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %3, %2 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %4, %1 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %2, %2, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %3, %3, %1 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n\t" /* f32Val1 >> 1 */ + + "muls %4, %4, %2 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n\t" /* f32Val2 >> 14 */ + + "movs %3, #0 \n\t" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n\t" /* Stores the last bit of multiplication to f32Val1 */ + "muls %2, %2, %1 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "adds %2, %2, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n\t" /* f32Val1 = 0 */ + "rsbs %0, %0, #0 \n\t" /* f32Accum =-f32Accum */ + "cmp %0, %6 \n\t" /* Compares f32Accum with 0x80000000 */ + "bne MLIB_MnacSat_F32_NotNeg%= \n\t" /* If f32Accum != 0x80000000, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* If f32Accum == 0x80000000 then f32Accum = 0x7ffffff */ + "MLIB_MnacSat_F32_NotNeg%=: \n\t" + "asrs %0, %0, #1 \n\t" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n\t" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n\t" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n\t" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %2 \n\t" /* (result / 2) + Carry */ + + "mov %2, %0 \n\t" /* f32Mult1 = result / 2 */ + "lsls %1, %0, #1 \n\t" /* f32Mult2 = result */ + "lsrs %3, %3, #31 \n\t" /* f32Val1 >> 31 (the last bit of result) */ + "adds %1, %1, %3 \n\t" /* f32Mult2 = result + last bit */ + + "eors %0, %0, %1 \n\t" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl MLIB_MnacSat_F32_SatEnd%= \n\t" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %1, #128 \n\t" /* f32Mult2 = 0x80 */ + "rev %1, %1 \n\t" /* result = 0x80000000 */ + "cmp %2, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_MnacSat_F32_SatEnd%= \n\t" /* If f32Mult1 < 0, then jumps through next command */ + "subs %1, %1, #1 \n\t" /* result = 0x7FFFFFFF*/ + "MLIB_MnacSat_F32_SatEnd%=: \n\t" + : "+l"(f32Accum), "+l"(f32Mult2), "+l"(f32Mult1), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3), "+l"(f32Min):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %3, %2 \n" /* f32Val1 = f32Mult1.L */ + "uxth %4, %1 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %2, %2, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n" /* f32Val3 >> 16 */ + + "muls %3, %3, %1 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n" /* f32Val1 >> 1 */ + + "muls %4, %4, %2 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n" /* f32Val2 >> 14 */ + + "movs %3, #0 \n" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n" /* Stores the last bit of multiplication to f32Val1 */ + "muls %2, %2, %1 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "adds %2, %2, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n" /* f32Val1 = 0 */ + "rsbs %0, %0, #0 \n" /* f32Accum =-f32Accum */ + "cmp %0, %6 \n" /* Compares f32Accum with 0x80000000 */ + "bne .+4 \n" /* If f32Accum != 0x80000000, then jumps through next command */ + "subs %0, %0, #1 \n" /* If f32Accum == 0x80000000 then f32Accum = 0x7ffffff */ + "asrs %0, %0, #1 \n" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %2 \n" /* (result / 2) + Carry */ + + "mov %2, %0 \n" /* f32Mult1 = result / 2 */ + "lsls %1, %0, #1 \n" /* f32Mult2 = result */ + "lsrs %3, %3, #31 \n" /* f32Val1 >> 31 (the last bit of result) */ + "adds %1, %1, %3 \n" /* f32Mult2 = result + last bit */ + + "eors %0, %0, %1 \n" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl .+12 \n" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %1, #128 \n" /* f32Mult2 = 0x80 */ + "rev %1, %1 \n" /* result = 0x80000000 */ + "cmp %2, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32Mult1 < 0, then jumps through next command */ + "subs %1, %1, #1 \n" /* result = 0x7FFFFFFF*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult2), "+l"(f32Mult1), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3), "+l"(f32Min):); + #endif + + return f32Mult2; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif +/***************************************************************************//*! +* +* f32Out = - f32Accum + (f16Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MnacSat_F32lss_FAsmi(register frac32_t f32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register frac32_t f32Val = (frac32_t)0x80000000U; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2,f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + rsbs f32Accum, f32Accum, #0 /* f32Accum =-f32Accum */ + cmp f32Accum, f32Val /* Compares f32Accum with 0x80000000 */ + bne NotNeg /* If f32Accum != 0x8000000, then go to NotNeg */ + subs f32Accum, f32Accum, #1 /* If f32Accum == 0x80000000 then f32Accum = 0x7ffffff */ + NotNeg: + asrs f32Accum, f32Accum, #1 /* f32Accum >> 1 */ + adcs f32Val, f32Val, f32Val /* f32Val = the last bit of f32Accum */ + adds f16Mult1, f16Mult1, f32Accum /* f16Mult1 * f16Mult2 */ + + mov f16Mult2, f16Mult1 /* f16Mult1 = result / 2 */ + lsls f32Accum, f16Mult1, #1 /* f32Mult2 = result */ + adds f32Accum, f32Accum, f32Val /* f32Mult2 = result + last bit */ + + eors f16Mult1, f16Mult1, f32Accum /* f32Accum = f32Accum ^ f32Mult2 */ + bpl SatEnd /* If f32Accum >= 0, then jumps to the end of function*/ + movs f32Accum, #128 /* f32Mult2 = 0x80 */ + rev f32Accum, f32Accum /* result = 0x80000000 */ + cmp f16Mult2, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32Mult1 < 0, then jumps through next command */ + subs f32Accum, f32Accum, #1 /* result = 0x7FFFFFFF*/ + SatEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + + "rsbs %0, %0, #0 \n\t" /* f32Accum =-f32Accum */ + "cmp %0, %3 \n\t" /* Compares f32Accum with 0x80000000 */ + "bne MLIB_MnacSat_F32lss_NotNeg%= \n\t" /* If f32Accum != 0x80000000, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* If f32Accum == 0x80000000 then f32Accum = 0x7ffffff */ + "MLIB_MnacSat_F32lss_NotNeg%=: \n\t" + "asrs %0, %0, #1 \n\t" /* f32Accum >> 1 */ + "adcs %3, %3, %3 \n\t" /* f32Val = the last bit of f32Accum */ + "adds %1, %1, %0 \n\t" /* f16Mult1 * f16Mult2 */ + + "mov %2, %1 \n\t" /* f16Mult1 = result / 2 */ + + "lsls %0, %1, #1 \n\t" /* f32Mult2 = result */ + "adds %0, %0, %3 \n\t" /* f32Mult2 = result + last bit */ + + "eors %1, %1, %0 \n\t" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl MLIB_MnacSat_F32lss_SatEnd%= \n\t" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %0, #128 \n\t" /* f32Mult2 = 0x80 */ + "rev %0, %0 \n\t" /* result = 0x80000000 */ + "cmp %2, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_MnacSat_F32lss_SatEnd%= \n\t" /* If f32Mult1 < 0, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* result = 0x7FFFFFFF*/ + "MLIB_MnacSat_F32lss_SatEnd%=: \n\t" + : "+l"(f32Accum), "+l"(f16Mult1), "+l"(f16Mult2), "+l"(f32Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + + "rsbs %0, %0, #0 \n" /* f32Accum =-f32Accum */ + "cmp %0, %3 \n" /* Compares f32Accum with 0x80000000 */ + "bne .+4 \n" /* If f32Accum != 0x80000000, then jumps through next command */ + "subs %0, %0, #1 \n" /* If f32Accum == 0x80000000 then f32Accum = 0x7ffffff */ + "asrs %0, %0, #1 \n" /* f32Accum >> 1 */ + "adcs %3, %3, %3 \n" /* f32Val = the last bit of f32Accum */ + "adds %1, %1, %0 \n" /* f16Mult1 * f16Mult2 */ + + "mov %2, %1 \n" /* f16Mult1 = result / 2 */ + + "lsls %0, %1, #1 \n" /* f32Mult2 = result */ + "adds %0, %0, %3 \n" /* f32Mult2 = result + last bit */ + + "eors %1, %1, %0 \n" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl .+12 \n" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %0, #128 \n" /* f32Mult2 = 0x80 */ + "rev %0, %0 \n" /* result = 0x80000000 */ + "cmp %2, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32Mult1 < 0, then jumps through next command */ + "subs %0, %0, #1 \n" /* result = 0x7FFFFFFF*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f16Mult1), "+l"(f16Mult2), "+l"(f32Val):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MNAC_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4Rnd_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4Rnd_F16.h new file mode 100644 index 0000000..e753fbb --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4Rnd_F16.h @@ -0,0 +1,74 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract of four inputs with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MSU4RND_F16_H_ +#define _MLIB_MSU4RND_F16_H_ + + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Sub_F16.h" +#include "MLIB_MulRnd_F16.h" +#include "MLIB_Sub_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Msu4Rnd_F16_Ci(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) \ + MLIB_Msu4Rnd_F16_FCi(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) + +/***************************************************************************//*! +* +* f16Out = (f16MinMul1 * f16MinMul2) - (f16SubMul1 * f16SubMul2) +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Msu4Rnd_F16_FCi(register frac16_t f16MinMul1, register frac16_t f16MinMul2, + register frac16_t f16SubMul1, register frac16_t f16SubMul2) +{ + return(frac16_t)MLIB_ShR_F32_Ci(((MLIB_Sub_F32_Ci((int32_t)f16MinMul1 * (int32_t)f16MinMul2, + (int32_t)f16SubMul1 * (int32_t)f16SubMul2)) + 0x4000), 15U); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSU4RND_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4Rnd_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4Rnd_F16_Asmi.h new file mode 100644 index 0000000..4b5e4e0 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4Rnd_F16_Asmi.h @@ -0,0 +1,167 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract of four inputs with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MSU4RND_F16_ASM_H_ +#define _MLIB_MSU4RND_F16_ASM_H_ + + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Msu4RndSat_F16_Asmi(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) \ + MLIB_Msu4RndSat_F16_FAsmi(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) + +/***************************************************************************//*! +* +* f16Out = (f16MinMul1 * f16MinMul2) - (f16SubMul1 * f16SubMul2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_Msu4RndSat_F16_FAsmi(register frac16_t f16MinMul1, register frac16_t f16MinMul2, + register frac16_t f16SubMul1, register frac16_t f16SubMul2) +{ + register frac32_t f32SatVal = 0x8000; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16MinMul1, f16MinMul1 /* Converts 16-bit input to 32-bit */ + sxth f16MinMul2, f16MinMul2 /* Converts 16-bit input to 32-bit */ + sxth f16SubMul1, f16SubMul1 /* Converts 16-bit input to 32-bit */ + sxth f16SubMul2, f16SubMul2 /* Converts 16-bit input to 32-bit */ + muls f16SubMul1, f16SubMul1, f16SubMul2 /* f16SubMul1 * f16SubMul2 */ + muls f16MinMul1, f16MinMul1, f16MinMul2 /* f16MinMul1 * f16MinMul2 */ + subs f16MinMul1, f16MinMul1, f16SubMul1 /* f16MinMul1 * f16MinMul2 - f16SubMul1 * f16SubMul2 */ + asrs f16MinMul1, f16MinMul1, #7 /* f16MinMul1 >> 7 */ + adds f16MinMul1, f16MinMul1, #128 /* Rounding */ + asrs f16MinMul1, f16MinMul1, #8 /* f16MinMul1 >> 8 */ + movs f16SubMul2, f16MinMul1 /* Copies result to f16SubMul2 */ + + cmp f32SatVal, f16MinMul1 /* Compares result with 0x8000 */ + bgt NegTest /* If result < 0x8000, then go to NegTest */ + subs f16MinMul1, f32SatVal, #1 /* If result >= 0x8000, then result = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f16SubMul1, f32SatVal /* f16SubMul1 = 0xFFFF8000 */ + cmp f16SubMul1, f16MinMul1 /* Compares result with 0xFFFF8000 */ + ble SatEnd /* If result >= 0xFFFF8000, then goes to SatEnd */ + mov f16MinMul1, f16SubMul1 /* If result < 0xFFFF8000, then result = 0xFFFF8000 */ + lsls f16SubMul1, f16SubMul1, #1 /* f16SubMul1 = 0xFFFF0000 */ + cmp f16SubMul1, f16SubMul2 /* Compares result with 0xFFFF0000 */ + bne SatEnd /* If result <> 0xFFFF0000, then goes to SatEnd */ + subs f16MinMul1, f32SatVal, #1 /* If result = 0xFFFF0000, then result = 0x7FFF */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %3, %3 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %2, %2, %3 \n\t" /* f16SubMul1 * f16SubMul2 */ + "muls %0, %0, %1 \n\t" /* f16MinMul1 * f16MinMul2 */ + "subs %0, %0, %2 \n\t" /* f16MinMul1 * f16MinMul2 - f16SubMul1 * f16SubMul2 */ + "asrs %0, %0, #7 \n\t" /* f16MinMul1 >> 7 */ + "adds %0, %0, #128 \n\t" /* Rounding */ + "asrs %0, %0, #8 \n\t" /* f16MinMul1 >> 8 */ + "movs %1, %0 \n\t" /* Copies result to f16SubMul2 */ + + "cmp %4, %0 \n\t" /* Compares result with 0x7FFF */ + "bgt MLIB_Msu4RndSat_F16_NegTest%= \n\t" /* If result < 0x8000, then jumps through two commands */ + "subs %0, %4, #1 \n\t" /* If result >= 0x8000, then result = 0x7FFF */ + "b MLIB_Msu4RndSat_F16_NegTest%= \n\t" /* Goes to the end of function */ + "MLIB_Msu4RndSat_F16_NegTest%=: \n\t" + "sxth %2, %4 \n\t" /* f16SubMul1 = 0xFFFF8000 */ + "cmp %2, %0 \n\t" /* Compares result with 0xFFFF8000 */ + "ble MLIB_Msu4RndSat_F16_SatEnd%= \n\t" /* If result >= 0xFFFF8000, then jumps through four commands */ + "mov %0, %2 \n\t" /* If result < 0xFFFF8000, then result = 0xFFFF8000 */ + "lsls %2, %2, #1 \n\t" /* f16SubMul1 = 0xFFFF0000 */ + "cmp %2, %1 \n\t" /* Compares result with 0xFFFF0000 */ + "bne MLIB_Msu4RndSat_F16_SatEnd%= \n\t" /* If result <> 0xFFFF0000, then jumps through next command */ + "subs %0, %4, #1 \n\t" /* If result = 0xFFFF0000, then result = 0x7FFF */ + "MLIB_Msu4RndSat_F16_SatEnd%=: \n\t" + : "+l"(f16MinMul1), "+l"(f16MinMul2), "+l"(f16SubMul1), "+l"(f16SubMul2): "l"(f32SatVal)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "sxth %3, %3 \n" /* Converts 16-bit input to 32-bit */ + "muls %2, %2, %3 \n" /* f16SubMul1 * f16SubMul2 */ + "muls %0, %0, %1 \n" /* f16MinMul1 * f16MinMul2 */ + "subs %0, %0, %2 \n" /* f16MinMul1 * f16MinMul2 - f16SubMul1 * f16SubMul2 */ + "asrs %0, %0, #7 \n" /* f16MinMul1 >> 7 */ + "adds %0, %0, #128 \n" /* Rounding */ + "asrs %0, %0, #8 \n" /* f16MinMul1 >> 8 */ + "movs %1, %0 \n" /* Copies result to f16SubMul2 */ + + "cmp %4, %0 \n" /* Compares result with 0x7FFF */ + "bgt .+6 \n" /* If result < 0x8000, then jumps through two commands */ + "subs %0, %4, #1 \n" /* If result >= 0x8000, then result = 0x7FFF */ + "b .+18 \n" /* Goes to the end of function */ + "sxth %2, %4 \n" /* f16SubMul1 = 0xFFFF8000 */ + "cmp %2, %0 \n" /* Compares result with 0xFFFF8000 */ + "ble .+12 \n" /* If result >= 0xFFFF8000, then jumps through four commands */ + "mov %0, %2 \n" /* If result < 0xFFFF8000, then result = 0xFFFF8000 */ + "lsls %2, %2, #1 \n" /* f16SubMul1 = 0xFFFF0000 */ + "cmp %2, %1 \n" /* Compares result with 0xFFFF0000 */ + "bne .+4 \n" /* If result <> 0xFFFF0000, then jumps through next command */ + "subs %0, %4, #1 \n" /* If result = 0xFFFF0000, then result = 0x7FFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16MinMul1), "+l"(f16MinMul2), "+l"(f16SubMul1), "+l"(f16SubMul2): "l"(f32SatVal)); + #endif + + return f16MinMul1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSU4RND_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4Rnd_F32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4Rnd_F32_Asm.h new file mode 100644 index 0000000..6983e20 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4Rnd_F32_Asm.h @@ -0,0 +1,68 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract of four inputs with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MSU4RND_F32_ASM_H_ +#define _MLIB_MSU4RND_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Msu4Rnd_F32_Asm(f32MinMul1, f32MinMul2, f32SubMul1, f32SubMul2) \ + MLIB_Msu4Rnd_F32_FAsm(f32MinMul1, f32MinMul2, f32SubMul1, f32SubMul2) +#define MLIB_Msu4RndSat_F32_Asm(f32MinMul1, f32MinMul2, f32SubMul1, f32SubMul2) \ + MLIB_Msu4RndSat_F32_FAsm(f32MinMul1, f32MinMul2, f32SubMul1, f32SubMul2) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_Msu4Rnd_F32_FAsm(register frac32_t f32MinMul1, register frac32_t f32MinMul2, + register frac32_t f32SubMul1, register frac32_t f32SubMul2); +extern frac32_t MLIB_Msu4RndSat_F32_FAsm(register frac32_t f32MinMul1,register frac32_t f32MinMul2, + register frac32_t f32SubMul1,register frac32_t f32SubMul2); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSU4RND_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4_F32.h new file mode 100644 index 0000000..9dad367 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu4_F32.h @@ -0,0 +1,102 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract of four inputs +* +*******************************************************************************/ +#ifndef _MLIB_MSU4_F32_H_ +#define _MLIB_MSU4_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Msu4_F32ssss_Ci(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) \ + MLIB_Msu4_F32ssss_FCi(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) +#define MLIB_Msu4Sat_F32ssss_Ci(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) \ + MLIB_Msu4Sat_F32ssss_FCi(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) + +/***************************************************************************//*! +* +* f32Out = (f16MinMul1 * f16MinMul2) - (f16SubMul1 * f16SubMul2) +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_Msu4_F32ssss_FCi(register frac16_t f16MinMul1, register frac16_t f16MinMul2, + register frac16_t f16SubMul1, register frac16_t f16SubMul2) +{ + return (MLIB_Sh1L_F32_Ci(((int32_t)f16MinMul1 * (int32_t)f16MinMul2) - + ((int32_t)f16SubMul1 * (int32_t)f16SubMul2))); +} + +/***************************************************************************//*! +* +* f32Out = (f16MinMul1 * f16MinMul2) - (f16SubMul1 * f16SubMul2) +* With saturation +*******************************************************************************/ +static inline frac32_t MLIB_Msu4Sat_F32ssss_FCi(register frac16_t f16MinMul1, register frac16_t f16MinMul2, + register frac16_t f16SubMul1, register frac16_t f16SubMul2) +{ + int32_t i32Temp; + + i32Temp = ((frac32_t)((int32_t)(f16MinMul1)*(int32_t)(f16MinMul2))) - + ((frac32_t)((int32_t)(f16SubMul1)*(int32_t)(f16SubMul2))); + if (i32Temp >= 1073741824) + { + i32Temp = 2147483647; + } + else + { + if (i32Temp <= -1073741824) + { + i32Temp = INT32_MIN; + } + else + { + i32Temp = MLIB_Sh1L_F32_Ci(i32Temp); + } + } + return (i32Temp); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSU4_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_A32.h new file mode 100644 index 0000000..47b7598 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_A32.h @@ -0,0 +1,81 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MSURND_A32_H_ +#define _MLIB_MSURND_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MsuRnd_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) \ + MLIB_MsuRnd_A32ass_FCi(a32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* a32Out = a32Accum - ( f16Mult1 * f16Mult2) +* +*******************************************************************************/ +static inline acc32_t MLIB_MsuRnd_A32ass_FCi(register acc32_t a32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register frac64_t f64Temp; + register uint64_t u64Temp; + + u64Temp = (uint64_t)a32Accum << 15U; + if (a32Accum < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x0800000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + f64Temp = (frac64_t)u64Temp; /* cast back the corrected values */ + f64Temp += (frac64_t)((int64_t)f16Mult1 * (int64_t)(-f16Mult2)) + 0x00004000; + u64Temp = (uint64_t)f64Temp >> 15U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x2000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return (acc32_t)u64Temp; /* cast back the corrected values */ +} + + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSURND_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_A32_Asmi.h new file mode 100644 index 0000000..e408041 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_A32_Asmi.h @@ -0,0 +1,110 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MSURND_A32_ASM_H_ +#define _MLIB_MSURND_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MsuRnd_A32ass_Asmi(a32Accum, f16Mult1, f16Mult2) \ + MLIB_MsuRnd_A32ass_FAsmi(a32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* a32Out = a32Accum - ( f16Mult1 * f16Mult2) +* +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MsuRnd_A32ass_FAsmi(register acc32_t a32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #7 /* f16Mult1 >> 7 for fractional multiplication */ + adds f16Mult1, f16Mult1, #128 /* Rounding */ + asrs f16Mult1, f16Mult1, #8 /* f16Mult1 >> 8 for fractional multiplication */ + subs a32Accum, a32Accum, f16Mult1}; /* a32Accum - f16Mult1 * f16Mult2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n\t" /* f16Mult1 >> 7 for fractional multiplication */ + "adds %1, %1, #128 \n\t" /* Rounding */ + "asrs %1, %1, #8 \n\t" /* f16Mult1 >> 8 for fractional multiplication */ + "subs %0, %0, %1 \n\t" /* f32Accum - f16Mult1 * f16Mult2 */ + : "+l"(a32Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n" /* f16Mult1 >> 7 for fractional multiplication */ + "adds %1, %1, #128 \n" /* Rounding */ + "asrs %1, %1, #8 \n" /* f16Mult1 >> 8 for fractional multiplication */ + "subs %0, %0, %1 \n" /* f32Accum - f16Mult1 * f16Mult2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return a32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSURND_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F16.h new file mode 100644 index 0000000..a65362f --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F16.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MSURND_F16_H_ +#define _MLIB_MSURND_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Add_F16.h" +#include "MLIB_MulRnd_F16.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MsuRnd_F16_Ci(f16Accum, f16Mult1, f16Mult2) \ + MLIB_MsuRnd_F16_FCi(f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Accum - ( f16Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_MsuRnd_F16_FCi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + frac16_t f16Temp; + + f16Temp = MLIB_MulNegRnd_F16_Ci(f16Mult1, f16Mult2); + return(MLIB_Add_F16_Ci(f16Accum, f16Temp)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSURND_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F16_Asmi.h new file mode 100644 index 0000000..9e60cef --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F16_Asmi.h @@ -0,0 +1,153 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MSURND_F16_ASM_H_ +#define _MLIB_MSURND_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MsuRndSat_F16_Asmi(f16Accum, f16Mult1, f16Mult2) \ + MLIB_MsuRndSat_F16_FAsmi(f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Accum - ( f16Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MsuRndSat_F16_FAsmi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Accum, f16Accum /* Converts 16-bit input to 32-bit */ + sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #7 /* f16Mult1 >> 7 */ + adds f16Mult1, f16Mult1, #128 /* Rounding */ + asrs f16Mult1, f16Mult1, #8 /* f16Mult1 >> 8 */ + subs f16Accum, f16Accum, f16Mult1 /* f16Accum - f16Mult1 * f16Mult2 */ + + movs f16Mult1, #128 /* f16Mult1 = 0x80 */ + lsls f16Mult1, f16Mult1, #8 /* f16Mult1 = 0x8000 */ + + cmp f16Mult1, f16Accum /* Compares f16Accum with 0x8000 */ + bgt NegTest /* If f16Accum < 0x8000, then goes to NegTest */ + subs f16Accum, f16Mult1, #1 /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f16Mult1, f16Mult1 /* f16Mult1 = 0xFFFF8000 */ + cmp f16Mult1, f16Accum /* Compares f16Accum with 0xFFFF8000 */ + ble SatEnd /* If f16Accum >= 0xFFFF8000, then goes to SatEnd */ + mov f16Accum, f16Mult1 /* If f16Accum < 0xFFFF8000, then f16Mult1 = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n\t" /* f16Mult1 >> 7 */ + "adds %1, %1, #128 \n\t" /* Rounding */ + "asrs %1, %1, #8 \n\t" /* f16Mult1 >> 8 */ + "subs %0, %0, %1 \n\t" /* f16Accum - f16Mult1 * f16Mult2 */ + + "movs %1, #128 \n\t" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n\t" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n\t" /* Compares f16Accum with 0x8000 */ + "bgt MLIB_MsuRndSat_F16_NegTest%= \n\t" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n\t" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b MLIB_MsuRndSat_F16_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MsuRndSat_F16_NegTest%=: \n\t" + "sxth %1, %1 \n\t" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n\t" /* Compares f16Accum with 0xFFFF8000 */ + "ble MLIB_MsuRndSat_F16_SatEnd%= \n\t" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n\t" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + "MLIB_MsuRndSat_F16_SatEnd%=: \n\t" + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #7 \n" /* f16Mult1 >> 7 */ + "adds %1, %1, #128 \n" /* Rounding */ + "asrs %1, %1, #8 \n" /* f16Mult1 >> 8 */ + "subs %0, %0, %1 \n" /* f16Accum - f16Mult1 * f16Mult2 */ + + "movs %1, #128 \n" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n" /* Compares f16Accum with 0x8000 */ + "bgt .+6 \n" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + "sxth %1, %1 \n" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n" /* Compares f16Accum with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return f16Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSURND_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F32.h new file mode 100644 index 0000000..2fa85b1 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F32.h @@ -0,0 +1,71 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MSURND_F32_H_ +#define _MLIB_MSURND_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Add_F32.h" +#include "MLIB_MulRnd_F32.h" +#include "MLIB_Mul_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MsuRnd_F32lls_Ci( f32Accum, f32Mult1, f16Mult2) \ + MLIB_MsuRnd_F32lls_FCi( f32Accum, f32Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = f32Accum - ( f32Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_MsuRnd_F32lls_FCi(register frac32_t f32Accum, + register frac32_t f32Mult1,register frac16_t f16Mult2) +{ + return(MLIB_Add_F32_Ci(f32Accum, MLIB_MulNegRnd_F32ls_Ci(f32Mult1,f16Mult2))); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSURND_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F32_Asmi.h new file mode 100644 index 0000000..ce5d15b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MsuRnd_F32_Asmi.h @@ -0,0 +1,334 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MSURND_F32_ASM_H_ +#define _MLIB_MSURND_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MsuRnd_F32_Asmi( f32Accum, f32Mult1, f32Mult2) \ + MLIB_MsuRnd_F32_FAsmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MsuRndSat_F32_Asm( f32Accum, f32Mult1, f32Mult2) \ + MLIB_MsuRndSat_F32_FAsm( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MsuRndSat_F32lls_Asmi( f32Accum, f32Mult1, f16Mult2) \ + MLIB_MsuRndSat_F32lls_FAsmi( f32Accum, f32Mult1, f16Mult2) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern frac32_t MLIB_MsuRndSat_F32_FAsm(register frac32_t f32Accum, + register frac32_t f32Mult1,register frac32_t f32Mult2); + +/***************************************************************************//*! +* +* f32Out = f32Accum - ( f32Mult1 * f32Mult2) +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MsuRnd_F32_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1,register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #1 /* f32Val1 >> 1 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + asrs f32Val2, f32Val2, #13 /* f32Val2 >> 13 */ + adds f32Val2, f32Val2, #1 /* Rounding */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + lsls f32Mult1, f32Mult1, #1 /* f32Mult1 << 1 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + subs f32Accum, f32Accum, f32Mult1 };/* f32Accum - f16Mult1 * f16Mult2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %3, %1 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n\t" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #13 \n\t" /* f32Val2 >> 13 */ + "adds %4, %4, #1 \n\t" /* Rounding */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n\t" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + "subs %0, %0, %1 \n\t" /* f32Accum - f16Mult1 * f16Mult2 */ + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %3, %1 \n" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #13 \n" /* f32Val2 >> 13 */ + "adds %4, %4, #1 \n" /* Rounding */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + "subs %0, %0, %1 \n" /* f32Accum - f16Mult1 * f16Mult2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f32Out = f32Accum - ( f32Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MsuRndSat_F32lls_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1,register frac16_t f16Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + rsbs f16Mult2, f16Mult2, #0 /* f16Mult2 = - f16Mult2 */ + uxth f32Val2, f32Mult1 /* f32Val2 = f32Mult1.L */ + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + + muls f32Val2, f32Val2, f16Mult2 /* f32Val2 = f32Mult1.L * f16Mult2 */ + asrs f32Val2, f32Val2, #7 /* f32Val2 >> 7 */ + adds f32Val2, f32Val2, #128 /* Rounding */ + asrs f32Val2, f32Val2, #8 /* f32Val2 >> 8 */ + + movs f32Val1, #0 /* f32Val1 = 0 */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adcs f32Val1, f32Val1, f32Val1 /* Stores the last bit of multiplication to f32Val1 */ + muls f32Mult1, f32Mult1, f16Mult2 /* f32Mult1 = f32Mult1.H * f16Mult2 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + + movs f32Val2, #0 /* f32Val1 = 0 */ + asrs f32Accum, f32Accum, #1 /* f32Accum >> 1 */ + adcs f32Val2, f32Val2, f32Val2 /* Stores the last bit of f32Accum to f32Val2 */ + + adds f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 + f32Val2 */ + lsls f32Val1, f32Val1, #31 /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + adcs f32Accum, f32Accum, f32Mult1 /* (result / 2) + Carry */ + + mov f32Mult1, f32Accum /* f32Mult1 = result / 2 */ + lsls f32Val2, f32Accum, #1 /* f32Val2 = result */ + lsrs f32Val1, f32Val1, #31 /* f32Val1 >> 31 (the last bit of result) */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = result + last bit */ + + eors f32Accum, f32Accum, f32Val2 /* f32Accum = f32Accum ^ f32Val2 */ + bpl SatEnd /* If f32Accum >= 0, then goes to SatEnd */ + movs f32Val2, #128 /* f32Val2 = 0x80 */ + lsls f32Val2, f32Val2, #24 /* result = 0x80000000 */ + cmp f32Mult1, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32Mult1 < 0, then goes to SatEnd */ + subs f32Val2, f32Val2, #1 /* result = 0x7FFFFFFF*/ + SatEnd: + movs f32Accum, f32Val2 }; /* f32Accum = result*/ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "rsbs %2, %2, #0 \n\t" /* f16Mult2 = - f16Mult2 */ + "uxth %4, %1 \n\t" /* f32Val2 = f32Mult1.L */ + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + + "muls %4, %4, %2 \n\t" /* f32Val2 = f32Mult1.L * f16Mult2 */ + "asrs %4, %4, #7 \n\t" /* f32Val2 >> 7 */ + "adds %4, %4, #128 \n\t" /* Rounding */ + "asrs %4, %4, #8 \n\t" /* f32Val2 >> 8 */ + + "movs %3, #0 \n\t" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n\t" /* Stores the last bit of multiplication to f32Val1 */ + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f16Mult2 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n\t" /* f32Val1 = 0 */ + "asrs %0, %0, #1 \n\t" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n\t" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n\t" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n\t" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %1 \n\t" /* (result / 2) + Carry */ + + "mov %1, %0 \n\t" /* f32Mult1 = result / 2 */ + "lsls %4, %0, #1 \n\t" /* f32Val2 = result */ + "lsrs %3, %3, #31 \n\t" /* f32Val1 >> 31 (the last bit of result) */ + "adds %4, %4, %3 \n\t" /* f32Val2 = result + last bit */ + + "eors %0, %0, %4 \n\t" /* f32Accum = f32Accum ^ f32Val2 */ + "bpl MLIB_MsuRndSat_F32lls_SatEnd%= \n\t" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %4, #128 \n\t" /* f32Val2 = 0x80 */ + "lsls %4, %4, #24 \n\t" /* result = 0x80000000 */ + "cmp %1, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_MsuRndSat_F32lls_SatEnd%= \n\t" /* If f32Mult1 < 0, then jumps through next command */ + "subs %4, %4, #1 \n\t" /* result = 0x7FFFFFFF*/ + "MLIB_MsuRndSat_F32lls_SatEnd%=: \n\t" + "movs %0, %4 \n\t" /* f32Accum = result*/ + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f16Mult2), "+l"(f32Val1), "+l"(f32Val2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "rsbs %2, %2, #0 \n" /* f16Mult2 = - f16Mult2 */ + "uxth %4, %1 \n" /* f32Val2 = f32Mult1.L */ + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + + "muls %4, %4, %2 \n" /* f32Val2 = f32Mult1.L * f16Mult2 */ + "asrs %4, %4, #7 \n" /* f32Val2 >> 7 */ + "adds %4, %4, #128 \n" /* Rounding */ + "asrs %4, %4, #8 \n" /* f32Val2 >> 8 */ + + "movs %3, #0 \n" /* f32Val1 = 0 */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n" /* Stores the last bit of multiplication to f32Val1 */ + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f16Mult2 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n" /* f32Val1 = 0 */ + "asrs %0, %0, #1 \n" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %1 \n" /* (result / 2) + Carry */ + + "mov %1, %0 \n" /* f32Mult1 = result / 2 */ + "lsls %4, %0, #1 \n" /* f32Val2 = result */ + "lsrs %3, %3, #31 \n" /* f32Val1 >> 31 (the last bit of result) */ + "adds %4, %4, %3 \n" /* f32Val2 = result + last bit */ + + "eors %0, %0, %4 \n" /* f32Accum = f32Accum ^ f32Val2 */ + "bpl .+12 \n" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %4, #128 \n" /* f32Val2 = 0x80 */ + "lsls %4, %4, #24 \n" /* result = 0x80000000 */ + "cmp %1, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32Mult1 < 0, then jumps through next command */ + "subs %4, %4, #1 \n" /* result = 0x7FFFFFFF*/ + "movs %0, %4 \n" /* f32Accum = result*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f16Mult2), "+l"(f32Val1), "+l"(f32Val2):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSURND_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_A32.h new file mode 100644 index 0000000..021f69b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_A32.h @@ -0,0 +1,70 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract +* +*******************************************************************************/ +#ifndef _MLIB_MSU_A32_H_ +#define _MLIB_MSU_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Msu_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) \ + MLIB_Msu_A32ass_FCi(a32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* a32Out = a32Accum - ( f16Mult1 * f16Mult2) +* +*******************************************************************************/ +static inline acc32_t MLIB_Msu_A32ass_FCi(register acc32_t a32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + return (acc32_t)(a32Accum - MLIB_ShR_F32_Ci(((int32_t)f16Mult1 * (int32_t)f16Mult2), 15U)); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSU_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F16.h new file mode 100644 index 0000000..15739bf --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F16.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract +* +*******************************************************************************/ +#ifndef _MLIB_MSU_F16_H_ +#define _MLIB_MSU_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Add_F16.h" +#include "MLIB_Mul_F16.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Msu_F16_Ci(f16Accum, f16Mult1, f16Mult2) \ + MLIB_Msu_F16_FCi(f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Accum - ( f16Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Msu_F16_FCi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + frac16_t f16Temp; + + f16Temp = MLIB_MulNeg_F16_Ci(f16Mult1, f16Mult2); + return(MLIB_Add_F16_Ci(f16Accum, f16Temp)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSU_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F16_Asmi.h new file mode 100644 index 0000000..6e2153d --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F16_Asmi.h @@ -0,0 +1,147 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract +* +*******************************************************************************/ +#ifndef _MLIB_MSU_F16_ASM_H_ +#define _MLIB_MSU_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MsuSat_F16_Asmi(f16Accum, f16Mult1, f16Mult2) \ + MLIB_MsuSat_F16_FAsmi(f16Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Accum - ( f16Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MsuSat_F16_FAsmi(register frac16_t f16Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Accum, f16Accum /* Converts 16-bit input to 32-bit */ + sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #15 /* f16Mult1 >> 15 */ + subs f16Accum, f16Accum, f16Mult1 /* f16Accum - f16Mult1 * f16Mult2 */ + + movs f16Mult1, #128 /* f16Mult1 = 0x80 */ + lsls f16Mult1, f16Mult1, #8 /* f16Mult1 = 0x8000 */ + + cmp f16Mult1, f16Accum /* Compares f16Accum with 0x8000 */ + bgt NegTest /* If f16Accum < 0x8000, then goes to NegTest */ + subs f16Accum, f16Mult1, #1 /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f16Mult1, f16Mult1 /* f16Mult1 = 0xFFFF8000 */ + cmp f16Mult1, f16Accum /* Compares f16Accum with 0xFFFF8000 */ + ble SatEnd /* If f16Accum >= 0xFFFF8000, then goes to SatEnd */ + mov f16Accum, f16Mult1 /* If f16Accum < 0xFFFF8000, then f16Mult1 = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #15 \n\t" /* f16Mult1 >> 15 */ + "subs %0, %0, %1 \n\t" /* f16Accum - f16Mult1 * f16Mult2 */ + + "movs %1, #128 \n\t" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n\t" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n\t" /* Compares f16Accum with 0x8000 */ + "bgt MLIB_MsuSat_F16_NegTest%= \n\t" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n\t" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b MLIB_MsuSat_F16_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MsuSat_F16_NegTest%=: \n\t" + "sxth %1, %1 \n\t" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n\t" /* Compares f16Accum with 0xFFFF8000 */ + "ble MLIB_MsuSat_F16_SatEnd%= \n\t" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n\t" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + "MLIB_MsuSat_F16_SatEnd%=: \n\t" + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "asrs %1, %1, #15 \n" /* f16Mult1 >> 15 */ + "subs %0, %0, %1 \n" /* f16Accum - f16Mult1 * f16Mult2 */ + + "movs %1, #128 \n" /* f16Mult1 = 0x80 */ + "lsls %1, %1, #8 \n" /* f16Mult1 = 0x8000 */ + + "cmp %1, %0 \n" /* Compares f16Accum with 0x8000 */ + "bgt .+6 \n" /* If f16Accum < 0x8000, then jumps through two commands */ + "subs %0, %1, #1 \n" /* If f16Accum >= 0x8000, then f16Accum = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + "sxth %1, %1 \n" /* f16Mult1 = 0xFFFF8000 */ + "cmp %1, %0 \n" /* Compares f16Accum with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Accum >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %1 \n" /* If f16Accum < 0xFFFF8000, then f16Accum = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Accum), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return f16Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSU_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F32.h new file mode 100644 index 0000000..e3cbffc --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F32.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract +* +*******************************************************************************/ +#ifndef _MLIB_MSU_F32_H_ +#define _MLIB_MSU_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Add_F32.h" +#include "MLIB_Mul_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Msu_F32lss_Ci(f32Accum, f16Mult1, f16Mult2) \ + MLIB_Msu_F32lss_FCi(f32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = f32Accum - ( f16Mult1 * f16Mult2) +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_Msu_F32lss_FCi(register frac32_t f32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + frac32_t f32Temp; + + f32Temp = MLIB_MulNeg_F32ss_Ci(f16Mult1,f16Mult2); + return(MLIB_Add_F32_Ci(f32Accum, f32Temp)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSU_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F32_Asmi.h new file mode 100644 index 0000000..9dd6ff3 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Msu_F32_Asmi.h @@ -0,0 +1,442 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply subtract +* +*******************************************************************************/ +#ifndef _MLIB_MSU_F32_ASM_H_ +#define _MLIB_MSU_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Msu_F32_Asmi(f32Accum, f32Mult1, f32Mult2) \ + MLIB_Msu_F32_FAsmi(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MsuSat_F32_Asmi(f32Accum, f32Mult1, f32Mult2) \ + MLIB_MsuSat_F32_FAsmi(f32Accum, f32Mult1, f32Mult2) +#define MLIB_MsuSat_F32lss_Asmi(f32Accum, f16Mult1, f16Mult2) \ + MLIB_MsuSat_F32lss_FAsmi(f32Accum, f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = f32Accum - ( f32Mult1 * f32Mult2) +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_Msu_F32_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #1 /* f32Val1 >> 1 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + asrs f32Val2, f32Val2, #14 /* f32Val2 >> 14 */ + + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + lsls f32Mult1, f32Mult1, #1 /* f32Mult1 << 1 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + subs f32Accum, f32Accum, f32Mult1 };/* f32Accum - f16Mult1 * f16Mult2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %3, %1 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n\t" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n\t" /* f32Val2 >> 14 */ + + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n\t" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + "subs %0, %0, %1 \n\t" /* f32Accum - f16Mult1 * f16Mult2 */ + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %3, %1 \n" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n" /* f32Val2 >> 14 */ + + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %1, %1, #1 \n" /* f32Mult1 << 1 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + "subs %0, %0, %1 \n" /* f32Accum - f16Mult1 * f16Mult2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f32Out = f32Accum - ( f32Mult1 * f32Mult2) +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MsuSat_F32_FAsmi(register frac32_t f32Accum, + register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #1 /* f32Val1 >> 1 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + asrs f32Val2, f32Val2, #14 /* f32Val2 >> 14 */ + + movs f32Val1, #0 /* f32Val1 = 0 */ + rsbs f32Val2, f32Val2, #0 /* f32Val2 = - f32Val2 */ + asrs f32Val2, f32Val2, #1 /* f32Val2 >> 1 */ + adcs f32Val1, f32Val1, f32Val1 /* Stores the last bit of multiplication to f32Val1 */ + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + rsbs f32Mult1, f32Mult1, #0 /* f32Val2 = - f32Val2 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + + movs f32Val2, #0 /* f32Val1 = 0 */ + asrs f32Accum, f32Accum, #1 /* f32Accum >> 1 */ + adcs f32Val2, f32Val2, f32Val2 /* Stores the last bit of f32Accum to f32Val2 */ + + adds f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 + f32Val2 */ + lsls f32Val1, f32Val1, #31 /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + adcs f32Accum, f32Accum, f32Mult1 /* (result / 2) + Carry */ + + mov f32Mult1, f32Accum /* f32Mult1 = result / 2 */ + lsls f32Mult2, f32Accum, #1 /* f32Mult2 = result */ + lsrs f32Val1, f32Val1, #31 /* f32Val1 >> 31 (the last bit of result) */ + adds f32Mult2, f32Mult2, f32Val1 /* f32Mult2 = result + last bit */ + + eors f32Accum, f32Accum, f32Mult2 /* f32Accum = f32Accum ^ f32Mult2 */ + bpl SatEnd /* If f32Accum >= 0, then goes to SatEnd */ + movs f32Mult2, #128 /* f32Mult2 = 0x80 */ + rev f32Mult2, f32Mult2 /* result = 0x80000000 */ + cmp f32Mult1, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32Mult1 < 0, then goes to SatEnd */ + subs f32Mult2, f32Mult2, #1 /* result = 0x7FFFFFFF*/ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %3, %1 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n\t" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n\t" /* f32Val2 >> 14 */ + + "movs %3, #0 \n\t" /* f32Val1 = 0 */ + "rsbs %4, %4, #0 \n\t" /* f32Val2 = - f32Val2 */ + "asrs %4, %4, #1 \n\t" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n\t" /* Stores the last bit of multiplication to f32Val1 */ + "muls %1, %1, %2 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "rsbs %1, %1, #0 \n\t" /* f32Mult1 = - f32Mult1 */ + "adds %1, %1, %4 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n\t" /* f32Val1 = 0 */ + "asrs %0, %0, #1 \n\t" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n\t" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n\t" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n\t" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %1 \n\t" /* (result / 2) + Carry */ + + "mov %1, %0 \n\t" /* f32Mult1 = result / 2 */ + "lsls %2, %0, #1 \n\t" /* f32Mult2 = result */ + "lsrs %3, %3, #31 \n\t" /* f32Val1 >> 31 (the last bit of result) */ + "adds %2, %2, %3 \n\t" /* f32Mult2 = result + last bit */ + + "eors %0, %0, %2 \n\t" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl MLIB_MsuSat_F32_SatEnd%= \n\t" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %2, #128 \n\t" /* f32Mult2 = 0x80 */ + "rev %2, %2 \n\t" /* result = 0x80000000 */ + "cmp %1, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_MsuSat_F32_SatEnd%= \n\t" /* If f32Mult1 < 0, then jumps through next command */ + "subs %2, %2, #1 \n\t" /* result = 0x7FFFFFFF*/ + "MLIB_MsuSat_F32_SatEnd%=: \n\t" + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %3, %1 \n" /* f32Val1 = f32Mult1.L */ + "uxth %4, %2 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %1, %1, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %2, %2, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %5, %3 \n" /* f32Val3 = f32Mult1.L */ + "muls %5, %5, %4 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %5, %5, #16 \n" /* f32Val3 >> 16 */ + + "muls %3, %3, %2 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %3, %3, %5 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %3, %3, #1 \n" /* f32Val1 >> 1 */ + + "muls %4, %4, %1 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adds %4, %4, %3 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "asrs %4, %4, #14 \n" /* f32Val2 >> 14 */ + + "movs %3, #0 \n" /* f32Val1 = 0 */ + "rsbs %4, %4, #0 \n" /* f32Val2 = - f32Val2 */ + "asrs %4, %4, #1 \n" /* f32Val2 >> 1 */ + "adcs %3, %3, %3 \n" /* Stores the last bit of multiplication to f32Val1 */ + "muls %1, %1, %2 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "rsbs %1, %1, #0 \n" /* f32Mult1 = - f32Mult1 */ + "adds %1, %1, %4 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "movs %4, #0 \n" /* f32Val1 = 0 */ + "asrs %0, %0, #1 \n" /* f32Accum >> 1 */ + "adcs %4, %4, %4 \n" /* Stores the last bit of f32Accum to f32Val2 */ + + "adds %3, %3, %4 \n" /* f32Val1 = f32Val1 + f32Val2 */ + "lsls %3, %3, #31 \n" /* f32Val1 << 31 (Carry = the first bit of f32Val1) */ + "adcs %0, %0, %1 \n" /* (result / 2) + Carry */ + + "mov %1, %0 \n" /* f32Mult1 = result / 2 */ + "lsls %2, %0, #1 \n" /* f32Mult2 = result */ + "lsrs %3, %3, #31 \n" /* f32Val1 >> 31 (the last bit of result) */ + "adds %2, %2, %3 \n" /* f32Mult2 = result + last bit */ + + "eors %0, %0, %2 \n" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl .+12 \n" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %2, #128 \n" /* f32Mult2 = 0x80 */ + "rev %2, %2 \n" /* result = 0x80000000 */ + "cmp %1, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32Mult1 < 0, then jumps through next command */ + "subs %2, %2, #1 \n" /* result = 0x7FFFFFFF*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Mult2; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif +/***************************************************************************//*! +* +* f32Out = f32Accum - ( f16Mult1 * f16Mult2) +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MsuSat_F32lss_FAsmi(register frac32_t f32Accum, + register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register frac32_t f32Val = 0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + rsbs f16Mult1, f16Mult1, #0 /* f16Mult1 = - f16Mult1 */ + asrs f32Accum, f32Accum, #1 /* f32Accum >> 1 */ + adcs f32Val, f32Val, f32Val /* f32Val = the last bit of f32Accum */ + adds f16Mult1, f16Mult1, f32Accum /* f16Mult1 * f16Mult2 */ + + mov f16Mult2, f16Mult1 /* f16Mult1 = result / 2 */ + lsls f32Accum, f16Mult1, #1 /* f32Mult2 = result */ + adds f32Accum, f32Accum, f32Val /* f32Mult2 = result + last bit */ + + eors f16Mult1, f16Mult1, f32Accum /* f32Accum = f32Accum ^ f32Mult2 */ + bpl SatEnd /* If f32Accum >= 0, then jumps to the end of function*/ + movs f32Accum, #128 /* f32Mult2 = 0x80 */ + rev f32Accum, f32Accum /* result = 0x80000000 */ + cmp f16Mult2, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32Mult1 < 0, then jumps through next command */ + subs f32Accum, f32Accum, #1 /* result = 0x7FFFFFFF*/ + SatEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n\t" /* f16Mult1 * f16Mult2 */ + "rsbs %1, %1, #0 \n\t" /* f16Mult1 = - f16Mult1 */ + "asrs %0, %0, #1 \n\t" /* f32Accum >> 1 */ + "adcs %3, %3, %3 \n\t" /* f32Val = the last bit of f32Accum */ + "adds %1, %1, %0 \n\t" /* f16Mult1 * f16Mult2 */ + + "mov %2, %1 \n\t" /* f16Mult1 = result / 2 */ + "lsls %0, %1, #1 \n\t" /* f32Mult2 = result */ + "adds %0, %0, %3 \n\t" /* f32Mult2 = result + last bit */ + + "eors %1, %1, %0 \n\t" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl MLIB_MsuSat_F32lss_SatEnd%= \n\t" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %0, #128 \n\t" /* f32Mult2 = 0x80 */ + "rev %0, %0 \n\t" /* result = 0x80000000 */ + "cmp %2, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_MsuSat_F32lss_SatEnd%= \n\t" /* If f32Mult1 < 0, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* result = 0x7FFFFFFF*/ + "MLIB_MsuSat_F32lss_SatEnd%=: \n\t" + : "+l"(f32Accum), "+l"(f16Mult1), "+l"(f16Mult2), "+l"(f32Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "muls %1, %1, %2 \n" /* f16Mult1 * f16Mult2 */ + "rsbs %1, %1, #0 \n" /* f16Mult1 = - f16Mult1 */ + "asrs %0, %0, #1 \n" /* f32Accum >> 1 */ + "adcs %3, %3, %3 \n" /* f32Val = the last bit of f32Accum */ + "adds %1, %1, %0 \n" /* f16Mult1 * f16Mult2 */ + + "mov %2, %1 \n" /* f16Mult1 = result / 2 */ + "lsls %0, %1, #1 \n" /* f32Mult2 = result */ + "adds %0, %0, %3 \n" /* f32Mult2 = result + last bit */ + + "eors %1, %1, %0 \n" /* f32Accum = f32Accum ^ f32Mult2 */ + "bpl .+12 \n" /* If f32Accum >= 0, then jumps to the end of function*/ + "movs %0, #128 \n" /* f32Mult2 = 0x80 */ + "rev %0, %0 \n" /* result = 0x80000000 */ + "cmp %2, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32Mult1 < 0, then jumps through next command */ + "subs %0, %0, #1 \n" /* result = 0x7FFFFFFF*/ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Accum), "+l"(f16Mult1), "+l"(f16Mult2), "+l"(f32Val):); + #endif + + return f32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MSU_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_A32.h new file mode 100644 index 0000000..64fae19 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_A32.h @@ -0,0 +1,91 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MULRND_A32_H_ +#define _MLIB_MULRND_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MulRnd_F16as_Ci(a32Accum, f16Mult) MLIB_MulRnd_F16as_FCi(a32Accum, f16Mult) +#define MLIB_MulNegRnd_F16as_Ci(a32Accum, f16Mult) MLIB_MulNegRnd_F16as_FCi(a32Accum, f16Mult) + +/***************************************************************************//*! +* +* f16Out = a32Accum * f16Mult +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_MulRnd_F16as_FCi(register acc32_t a32Accum, register frac16_t f16Mult) +{ + register frac64_t f64Temp; + register uint64_t u64Temp; + + f64Temp = (frac64_t)a32Accum * f16Mult + 0x4000; + u64Temp = (uint64_t)f64Temp >> 15U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x2000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return (frac16_t)u64Temp; /* cast back the corrected values */ +} + +/***************************************************************************//*! +* +* f16Out = a32Accum * -f16Mult +* +*******************************************************************************/ +static inline frac16_t MLIB_MulNegRnd_F16as_FCi(register acc32_t a32Accum, register frac16_t f16Mult) +{ + register frac64_t f64Temp; + register uint64_t u64Temp; + + f64Temp = (frac64_t)a32Accum * (-f16Mult) + 0x4000; + u64Temp = (uint64_t)f64Temp >> 15U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x2000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return (frac16_t)u64Temp; /* cast back the corrected values */ +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MULRND_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_A32_Asmi.h new file mode 100644 index 0000000..a1e1260 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_A32_Asmi.h @@ -0,0 +1,953 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MULRND_A32_ASM_H_ +#define _MLIB_MULRND_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MulRndSat_F16as_Asmi(a32Accum, f16Mult) MLIB_MulRndSat_F16as_FAsmi(a32Accum, f16Mult) +#define MLIB_MulRnd_A32_Asmi(a32Mult1, a32Mult2) MLIB_MulRnd_A32_FAsmi(a32Mult1, a32Mult2) +#define MLIB_MulRndSat_A32_Asmi(a32Mult1, a32Mult2) MLIB_MulRndSat_A32_FAsmi(a32Mult1, a32Mult2) +#define MLIB_MulNegRnd_A32_Asmi(a32Mult1, a32Mult2) MLIB_MulNegRnd_A32_FAsmi(a32Mult1, a32Mult2) +#define MLIB_MulNegRndSat_A32_Asmi(a32Mult1, a32Mult2) MLIB_MulNegRndSat_A32_FAsmi(a32Mult1, a32Mult2) +#define MLIB_MulNegRndSat_F16as_Asmi(a32Accum, f16Mult) MLIB_MulNegRndSat_F16as_FAsmi(a32Accum, f16Mult) + +/***************************************************************************//*! +* +* f16Out = a32Accum * f16Mult +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MulRndSat_F16as_FAsmi(register acc32_t a32Accum, register frac16_t f16Mult) +{ + register frac32_t f32Val=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult, f16Mult /* Converts 16-bit input to 32-bit */ + uxth f32Val, a32Accum /* f32Val = a32Accum.L */ + asrs a32Accum, a32Accum, #16 /* a32Accum = a32Accum.H */ + + muls f32Val, f32Val, f16Mult /* f32Val = a32Accum.L * f16Mult */ + asrs f32Val, f32Val, #7 /* f32Val >> 7 */ + adds f32Val, f32Val, #128 /* Rounding */ + asrs f32Val, f32Val, #8 /* f32Val >> 8 */ + + muls f16Mult, f16Mult, a32Accum /* f16Mult = a32Accum.H * f16Mult */ + lsls f16Mult, f16Mult, #1 /* f16Mult << 1 */ + adds f16Mult, f16Mult, f32Val /* f16Mult = f16Mult + f32Val */ + + movs f32Val, #128 /* f32Val = 0x80 */ + lsls f32Val, f32Val, #8 /* f32Val = 0x8000 */ + + rev a32Accum, f16Mult /* Reverse byte */ + cmp a32Accum, #0x80 /* Compares with 0x80 */ + bne PosTest /* If Result != 0x80000000, then goes to PosTest */ + subs f16Mult, f32Val, #1 /* If Result = 0x80000000, then f16Mult = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + PosTest: + cmp f32Val, f16Mult /* Compares f16Mult with 0x8000 */ + bge NegTest /* If f16Mult < 0x8000, then goes to NegTest */ + subs f16Mult, f32Val, #1 /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f32Val, f32Val /* f32Val = 0xFFFF8000 */ + cmp f32Val, f16Mult /* Compares f16Mult with 0xFFFF8000 */ + ble SatEnd /* If f16Mult >= 0xFFFF8000, then goes to SatEnd */ + mov f16Mult, f32Val /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "uxth %2, %1 \n\t" /* f32Val = a32Accum.L */ + "asrs %1, %1, #16 \n\t" /* a32Accum = a32Accum.H */ + + "muls %2, %2, %0 \n\t" /* f32Val = a32Accum.L * f16Mult */ + "asrs %2, %2, #7 \n\t" /* f32Val >> 7 */ + "adds %2, %2, #128 \n\t" /* Rounding */ + "asrs %2, %2, #8 \n\t" /* f32Val >> 8 */ + + "muls %0, %0, %1 \n\t" /* f16Mult = a32Accum.H * f16Mult */ + "lsls %0, %0, #1 \n\t" /* f16Mult << 1 */ + "adds %0, %0, %2 \n\t" /* f16Mult = f16Mult + f32Val */ + + "movs %2, #128 \n\t" /* f32Val = 0x80 */ + "lsls %2, %2, #8 \n\t" /* f32Val = 0x8000 */ + + "rev %1, %0 \n\t" /* Reverse byte */ + "cmp %1, #0x80 \n\t" /* Compares with 0x80 */ + "bne MLIB_MulRndSat_F16as_PosTest%= \n\t" /* If Result != 0x80000000, then jumps through two commands */ + "subs %0, %2, #1 \n\t" /* If Result = 0x80000000, then f16Mult = 0x7FFF */ + "b MLIB_MulRndSat_F16as_SatEnd%= \n\t" /* Jumps through eight commands */ + "MLIB_MulRndSat_F16as_PosTest%=: \n\t" + "cmp %2, %0 \n\t" /* Compares f16Mult with 0x8000 */ + "bge MLIB_MulRndSat_F16as_NegTest%= \n\t" /* If f16Mult < 0x8000, then jumps through two commands */ + "subs %0, %2, #1 \n\t" /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + "b MLIB_MulRndSat_F16as_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MulRndSat_F16as_NegTest%=: \n\t" + "sxth %2, %2 \n\t" /* f32Val = 0xFFFF8000 */ + "cmp %2, %0 \n\t" /* Compares f16Mult with 0xFFFF8000 */ + "ble MLIB_MulRndSat_F16as_SatEnd%= \n\t" /* If f16Mult >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %2 \n\t" /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + "MLIB_MulRndSat_F16as_SatEnd%=: \n\t" + : "+l"(f16Mult), "+l"(a32Accum), "+l"(f32Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "uxth %2, %1 \n" /* f32Val = a32Accum.L */ + "asrs %1, %1, #16 \n" /* a32Accum = a32Accum.H */ + + "muls %2, %2, %0 \n" /* f32Val = a32Accum.L * f16Mult */ + "asrs %2, %2, #7 \n" /* f32Val >> 7 */ + "adds %2, %2, #128 \n" /* Rounding */ + "asrs %2, %2, #8 \n" /* f32Val >> 8 */ + + "muls %0, %0, %1 \n" /* f16Mult = a32Accum.H * f16Mult */ + "lsls %0, %0, #1 \n" /* f16Mult << 1 */ + "adds %0, %0, %2 \n" /* f16Mult = f16Mult + f32Val */ + + "movs %2, #128 \n" /* f32Val = 0x80 */ + "lsls %2, %2, #8 \n" /* f32Val = 0x8000 */ + + "rev %1, %0 \n" /* Reverse byte */ + "cmp %1, #0x80 \n" /* Compares with 0x80 */ + "bne .+6 \n" /* If Result != 0x80000000, then jumps through two commands */ + "subs %0, %2, #1 \n" /* If Result = 0x80000000, then f16Mult = 0x7FFF */ + "b .+18 \n" /* Jumps through eight commands */ + + "cmp %2, %0 \n" /* Compares f16Mult with 0x8000 */ + "bge .+6 \n" /* If f16Mult < 0x8000, then jumps through two commands */ + "subs %0, %2, #1 \n" /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + + "sxth %2, %2 \n" /* f32Val = 0xFFFF8000 */ + "cmp %2, %0 \n" /* Compares f16Mult with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Mult >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %2 \n" /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Mult), "+l"(a32Accum), "+l"(f32Val):); + #endif + return f16Mult; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* Output = a32Mult1 * a32Mult2 +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MulRnd_A32_FAsmi(register acc32_t a32Mult1, register acc32_t a32Mult2) +{ + register frac32_t a32Val1=0, a32Val2=0, a32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth a32Val1, a32Mult1 /* a32Val1 = a32Mult1.L */ + uxth a32Val2, a32Mult2 /* a32Val2 = a32Mult2.L */ + + asrs a32Mult1, a32Mult1, #16 /* a32Mult1 = a32Mult1.H */ + asrs a32Mult2, a32Mult2, #16 /* a32Mult2 = a32Mult2.H */ + + movs a32Val3, a32Val1 /* a32Val3 = a32Mult1.L */ + muls a32Val3, a32Val3, a32Val2 /* a32Val3 = a32Mult1.L * a32Mult2.L */ + lsrs a32Val3, a32Val3, #7 /* a32Val3 >> 7 */ + adds a32Val3, a32Val3, #0x80 /* Rounding */ + lsrs a32Val3, a32Val3, #8 /* a32Val3 >> 8 */ + + muls a32Val1, a32Val1, a32Mult2 /* a32Val1 = a32Mult1.L * a32Mult2.H */ + muls a32Val2, a32Val2, a32Mult1 /* a32Val2 = a32Mult2.L * a32Mult1.H */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val1 */ + + lsls a32Val2, a32Val2, #1 /* a32Val2 << 1 */ + adds a32Val2, a32Val2, a32Val3 /* a32Val2 = a32Val2 + a32Val3 */ + + muls a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + lsls a32Mult1, a32Mult1, #17 /* a32Mult1 << 17 */ + adds a32Mult1, a32Mult1, a32Val2 }; /* a32Mult1 = a32Mult1 + a32Val2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n\t" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n\t" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n\t" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n\t" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #7 \n\t" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n\t" /* Rounding */ + "lsrs %4, %4, #8 \n\t" /* a32Val3 >> 8 */ + + "muls %2, %2, %1 \n\t" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n\t" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsls %3, %3, #1 \n\t" /* a32Val2 << 1 */ + "adds %3, %3, %4 \n\t" /* a32Val2 = a32Val2 + a32Val3 */ + + "muls %0, %0, %1 \n\t" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "lsls %0, %0, #17 \n\t" /* a32Mult1 << 17 */ + "adds %0, %0, %3 \n\t" /* a32Mult1 = a32Mult1 + a32Val2 */ + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #7 \n" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n" /* Rounding */ + "lsrs %4, %4, #8 \n" /* a32Val3 >> 8 */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsls %3, %3, #1 \n" /* a32Val2 << 1 */ + "adds %3, %3, %4 \n" /* a32Val2 = a32Val2 + a32Val3 */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "lsls %0, %0, #17 \n" /* a32Mult1 << 17 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #endif + + return a32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* Output = a32Mult1 * a32Mult2 +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MulRndSat_A32_FAsmi(register acc32_t a32Mult1, register acc32_t a32Mult2) +{ + register acc32_t a32Val1=0, a32Val2=0, a32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth a32Val1, a32Mult1 /* a32Val1 = a32Mult1.L */ + uxth a32Val2, a32Mult2 /* a32Val2 = a32Mult2.L */ + asrs a32Mult1, a32Mult1, #16 /* a32Mult1 = a32Mult1.H */ + asrs a32Mult2, a32Mult2, #16 /* a32Mult2 = a32Mult2.H */ + + movs a32Val3, a32Val1 /* a32Val3 = a32Mult1.L */ + muls a32Val3, a32Val3, a32Val2 /* a32Val3 = a32Mult1.L * a32Mult2.L */ + + muls a32Val1, a32Val1, a32Mult2 /* a32Val1 = a32Mult1.L * a32Mult2.H */ + muls a32Val2, a32Val2, a32Mult1 /* a32Val2 = a32Mult2.L * a32Mult1.H */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val1 */ + + lsrs a32Val1, a32Val3, #16 /* a32Val1 = a32Val3 >> 16 */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val3 */ + asrs a32Val1, a32Val2, #16 /* a32Val1 = a32Val2 >> 16 */ + uxth a32Val2, a32Val2 /* Clears higher 16 bits */ + + muls a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + adds a32Mult1, a32Mult1, a32Val1 /* a32Mult1 = a32Mult1 + a32Val1 */ + + asrs a32Mult2, a32Mult1, #14 /* a32Mult2 = higher 18 bits of multiplication */ + beq MLIB_MulRndSat_A32_NotSat /* If a32Mult2 = 0, then goes to the MLIB_MulRndSat_A32_NotSat */ + mvns a32Mult2, a32Mult2 /* a32Mult2 = ~ a32Mult2 */ + beq MLIB_MulRndSat_A32_NotSat /* If a32Mult2 = 0, then goes to the MLIB_MulRndSat_A32_NotSat */ + asrs a32Mult2, a32Mult1, #31 /* a32Mult2 = sign of result */ + movs a32Mult1, #0x80 /* a32Mult1 = 0x80 */ + lsls a32Mult1, a32Mult1, #24 /* a32Mult1 = 0x80000000 */ + subs a32Mult1, a32Mult1, #1 /* a32Mult1 = 0x7FFFFFFF */ + subs a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = 0x7FFFFFFF - Sign of result */ + b MLIB_MulRndSat_A32_End /* Goes to the MLIB_MulRndSat_A32_End*/ + + MLIB_MulRndSat_A32_NotSat: + lsls a32Mult1, a32Mult1, #16 /* a32Mult1 << 16 */ + adds a32Mult1, a32Mult1, a32Val2 /* a32Mult1 = a32Mult1 + a32Val2 */ + lsls a32Mult1, a32Mult1, #1 /* Result << 1 */ + uxth a32Val3, a32Val3 /* Clears higher 16 bits */ + lsrs a32Val3, a32Val3, #7 /* a32Val3 >> 7 */ + adds a32Val3, a32Val3, #0x80 /* Rounding */ + lsrs a32Val3, a32Val3, #8 /* a32Val3 >> 8 */ + adds a32Mult1, a32Mult1, a32Val3 /* a32Mult1 = a32Mult1 + a32Val3 */ + MLIB_MulRndSat_A32_End: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n\t" /* a32Val2 = a32Mult2.L */ + "asrs %0, %0, #16 \n\t" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n\t" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n\t" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + + "muls %2, %2, %1 \n\t" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n\t" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsrs %2, %4, #16 \n\t" /* a32Val1 = a32Val3 >> 16 */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val3 */ + "asrs %2, %3, #16 \n\t" /* a32Val1 = a32Val2 >> 16 */ + "uxth %3, %3 \n\t" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n\t" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %2 \n\t" /* a32Mult1 = a32Mult1 + a32Val1 */ + + "asrs %1, %0, #14 \n\t" /* a32Mult2 = higher 18 bits of multiplication */ + "beq MLIB_MulRndSat_A32_NotSat1%= \n\t" /* If a32Mult2 = 0, then goes to the MLIB_MulRndSat_A32_NotSat */ + "mvns %1, %1 \n\t" /* a32Mult2 = ~ a32Mult2 */ + "beq MLIB_MulRndSat_A32_NotSat1%= \n\t" /* If a32Mult2 = 0, then goes to the MLIB_MulRndSat_A32_NotSat */ + "asrs %1, %0, #31 \n\t" /* a32Mult2 = sign of result */ + "movs %0, #0x80 \n\t" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n\t" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, #1 \n\t" /* a32Mult1 = 0x7FFFFFFF */ + "subs %0, %0, %1 \n\t" /* a32Mult1 = 0x7FFFFFFF - Sign of result */ + "b MLIB_MulRndSat_A32_End1%= \n\t" /* Goes to the MLIB_MulRndSat_A32_End*/ + + "MLIB_MulRndSat_A32_NotSat1%=: \n\t" + "lsls %0, %0, #16 \n\t" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n\t" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n\t" /* Result << 1 */ + "uxth %4, %4 \n\t" /* Clears higher 16 bits */ + "lsrs %4, %4, #7 \n\t" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n\t" /* Rounding */ + "lsrs %4, %4, #8 \n\t" /* a32Val3 >> 8 */ + "adds %0, %0, %4 \n\t" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "MLIB_MulRndSat_A32_End1%=: \n\t" + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsrs %2, %4, #16 \n" /* a32Val1 = a32Val3 >> 16 */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val3 */ + "asrs %2, %3, #16 \n" /* a32Val1 = a32Val2 >> 16 */ + "uxth %3, %3 \n" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %2 \n" /* a32Mult1 = a32Mult1 + a32Val1 */ + + "asrs %1, %0, #14 \n" /* a32Mult2 = higher 18 bits of multiplication */ + "beq MLIB_MulRndSat_A32_NotSat \n" /* If a32Mult2 = 0, then goes to the MLIB_MulRndSat_A32_NotSat */ + "mvns %1, %1 \n" /* a32Mult2 = ~ a32Mult2 */ + "beq MLIB_MulRndSat_A32_NotSat \n" /* If a32Mult2 = 0, then goes to the MLIB_MulRndSat_A32_NotSat */ + "asrs %1, %0, #31 \n" /* a32Mult2 = sign of result */ + "movs %0, #0x80 \n" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, #1 \n" /* a32Mult1 = 0x7FFFFFFF */ + "subs %0, %0, %1 \n" /* a32Mult1 = 0x7FFFFFFF - Sign of result */ + "b MLIB_MulRndSat_A32_End \n" /* Goes to the MLIB_MulRndSat_A32_End*/ + + "MLIB_MulRndSat_A32_NotSat: \n" + "lsls %0, %0, #16 \n" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n" /* Result << 1 */ + "uxth %4, %4 \n" /* Clears higher 16 bits */ + "lsrs %4, %4, #7 \n" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n" /* Rounding */ + "lsrs %4, %4, #8 \n" /* a32Val3 >> 8 */ + "adds %0, %0, %4 \n" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "MLIB_MulRndSat_A32_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsrs %2, %4, #16 \n" /* a32Val1 = a32Val3 >> 16 */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val3 */ + "asrs %2, %3, #16 \n" /* a32Val1 = a32Val2 >> 16 */ + "uxth %3, %3 \n" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %2 \n" /* a32Mult1 = a32Mult1 + a32Val1 */ + + "asrs %1, %0, #14 \n" /* a32Mult2 = higher 18 bits of multiplication */ + "beq MLIB_MulRndSat_A32_NotSat \n" /* If a32Mult2 = 0, then goes to the MLIB_MulRndSat_A32_NotSat */ + "mvns %1, %1 \n" /* a32Mult2 = ~ a32Mult2 */ + "beq MLIB_MulRndSat_A32_NotSat \n" /* If a32Mult2 = 0, then goes to the MLIB_MulRndSat_A32_NotSat */ + "asrs %1, %0, #31 \n" /* a32Mult2 = sign of result */ + "movs %0, #0x80 \n" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, #1 \n" /* a32Mult1 = 0x7FFFFFFF */ + "subs %0, %0, %1 \n" /* a32Mult1 = 0x7FFFFFFF - Sign of result */ + "b MLIB_MulRndSat_A32_End \n" /* Goes to the MLIB_MulRndSat_A32_End*/ + + "MLIB_MulRndSat_A32_NotSat: \n" + "lsls %0, %0, #16 \n" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n" /* Result << 1 */ + "uxth %4, %4 \n" /* Clears higher 16 bits */ + "lsrs %4, %4, #7 \n" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n" /* Rounding */ + "lsrs %4, %4, #8 \n" /* a32Val3 >> 8 */ + "adds %0, %0, %4 \n" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "MLIB_MulRndSat_A32_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #endif + + return a32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* Output = a32Mult1 * a32Mult2 +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MulNegRnd_A32_FAsmi(register acc32_t a32Mult1, register acc32_t a32Mult2) +{ + register frac32_t a32Val1=0, a32Val2=0, a32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth a32Val1, a32Mult1 /* a32Val1 = a32Mult1.L */ + uxth a32Val2, a32Mult2 /* a32Val2 = a32Mult2.L */ + + asrs a32Mult1, a32Mult1, #16 /* a32Mult1 = a32Mult1.H */ + asrs a32Mult2, a32Mult2, #16 /* a32Mult2 = a32Mult2.H */ + + movs a32Val3, a32Val1 /* a32Val3 = a32Mult1.L */ + muls a32Val3, a32Val3, a32Val2 /* a32Val3 = a32Mult1.L * a32Mult2.L */ + lsrs a32Val3, a32Val3, #7 /* a32Val3 >> 7 */ + adds a32Val3, a32Val3, #0x80 /* Rounding */ + lsrs a32Val3, a32Val3, #8 /* a32Val3 >> 8 */ + + muls a32Val1, a32Val1, a32Mult2 /* a32Val1 = a32Mult1.L * a32Mult2.H */ + muls a32Val2, a32Val2, a32Mult1 /* a32Val2 = a32Mult2.L * a32Mult1.H */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val1 */ + + lsls a32Val2, a32Val2, #1 /* a32Val2 << 1 */ + adds a32Val2, a32Val2, a32Val3 /* a32Val2 = a32Val2 + a32Val3 */ + + muls a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + lsls a32Mult1, a32Mult1, #17 /* a32Mult1 << 17 */ + adds a32Mult1, a32Mult1, a32Val2 /* a32Mult1 = a32Mult1 + a32Val2 */ + rsbs a32Mult1, a32Mult1, #0 }; /* Negation */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n\t" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n\t" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n\t" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n\t" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #7 \n\t" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n\t" /* Rounding */ + "lsrs %4, %4, #8 \n\t" /* a32Val3 >> 8 */ + + "muls %2, %2, %1 \n\t" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n\t" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsls %3, %3, #1 \n\t" /* a32Val2 << 1 */ + "adds %3, %3, %4 \n\t" /* a32Val2 = a32Val2 + a32Val3 */ + + "muls %0, %0, %1 \n\t" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "lsls %0, %0, #17 \n\t" /* a32Mult1 << 17 */ + "adds %0, %0, %3 \n\t" /* a32Mult1 = a32Mult1 + a32Val2 */ + "rsbs %0, %0, #0 \n\t" /* Negation */ + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #7 \n" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n" /* Rounding */ + "lsrs %4, %4, #8 \n" /* a32Val3 >> 8 */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsls %3, %3, #1 \n" /* a32Val2 << 1 */ + "adds %3, %3, %4 \n" /* a32Val2 = a32Val2 + a32Val3 */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "lsls %0, %0, #17 \n" /* a32Mult1 << 17 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + "rsbs %0, %0, #0 \n" /* Negation */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #endif + + return a32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* Output = a32Mult1 * a32Mult2 +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MulNegRndSat_A32_FAsmi(register acc32_t a32Mult1, register acc32_t a32Mult2) +{ + register acc32_t a32Val1=0, a32Val2=0, a32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth a32Val1, a32Mult1 /* a32Val1 = a32Mult1.L */ + uxth a32Val2, a32Mult2 /* a32Val2 = a32Mult2.L */ + asrs a32Mult1, a32Mult1, #16 /* a32Mult1 = a32Mult1.H */ + asrs a32Mult2, a32Mult2, #16 /* a32Mult2 = a32Mult2.H */ + + movs a32Val3, a32Val1 /* a32Val3 = a32Mult1.L */ + muls a32Val3, a32Val3, a32Val2 /* a32Val3 = a32Mult1.L * a32Mult2.L */ + + muls a32Val1, a32Val1, a32Mult2 /* a32Val1 = a32Mult1.L * a32Mult2.H */ + muls a32Val2, a32Val2, a32Mult1 /* a32Val2 = a32Mult2.L * a32Mult1.H */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val1 */ + + lsrs a32Val1, a32Val3, #16 /* a32Val1 = a32Val3 >> 16 */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val3 */ + asrs a32Val1, a32Val2, #16 /* a32Val1 = a32Val2 >> 16 */ + uxth a32Val2, a32Val2 /* Clears higher 16 bits */ + + muls a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + adds a32Mult1, a32Mult1, a32Val1 /* a32Mult1 = a32Mult1 + a32Val1 */ + + asrs a32Mult2, a32Mult1, #14 /* a32Mult2 = higher 18 bits of multiplication */ + beq MLIB_MulNegRndSat_A32_NotSat /* If a32Mult2 = 0, then goes to the MLIB_MulNegRndSat_A32_NotSat */ + mvns a32Mult2, a32Mult2 /* a32Mult2 = ~ a32Mult2 */ + beq MLIB_MulNegRndSat_A32_NotSat /* If a32Mult2 = 0, then goes to the MLIB_MulNegRndSat_A32_NotSat */ + asrs a32Mult2, a32Mult1, #31 /* a32Mult2 = sign of result */ + movs a32Mult1, #0x80 /* a32Mult1 = 0x80 */ + lsls a32Mult1, a32Mult1, #24 /* a32Mult1 = 0x80000000 */ + subs a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = 0x80000000 - Sign of result */ + b MLIB_MulNegRndSat_A32_End /* Goes to the MLIB_MulNegRndSat_A32_End*/ + + MLIB_MulNegRndSat_A32_NotSat: + lsls a32Mult1, a32Mult1, #16 /* a32Mult1 << 16 */ + adds a32Mult1, a32Mult1, a32Val2 /* a32Mult1 = a32Mult1 + a32Val2 */ + lsls a32Mult1, a32Mult1, #1 /* Result << 1 */ + uxth a32Val3, a32Val3 /* Clears higher 16 bits */ + lsrs a32Val3, a32Val3, #7 /* a32Val3 >> 7 */ + adds a32Val3, a32Val3, #0x80 /* Rounding */ + lsrs a32Val3, a32Val3, #8 /* a32Val3 >> 8 */ + adds a32Mult1, a32Mult1, a32Val3 /* a32Mult1 = a32Mult1 + a32Val3 */ + MLIB_MulNegRndSat_A32_End: + rsbs a32Mult1, a32Mult1, #0 }; /* a32Mult1 = - a32Mult1 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n\t" /* a32Val2 = a32Mult2.L */ + "asrs %0, %0, #16 \n\t" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n\t" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n\t" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + + "muls %2, %2, %1 \n\t" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n\t" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsrs %2, %4, #16 \n\t" /* a32Val1 = a32Val3 >> 16 */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val3 */ + "asrs %2, %3, #16 \n\t" /* a32Val1 = a32Val2 >> 16 */ + "uxth %3, %3 \n\t" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n\t" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %2 \n\t" /* a32Mult1 = a32Mult1 + a32Val1 */ + + "asrs %1, %0, #14 \n\t" /* a32Mult2 = higher 18 bits of multiplication */ + "beq MLIB_MulNegRndSat_A32_NotSat1%= \n\t" /* If a32Mult2 = 0, then goes to the MLIB_MulNegRndSat_A32_NotSat */ + "mvns %1, %1 \n\t" /* a32Mult2 = ~ a32Mult2 */ + "beq MLIB_MulNegRndSat_A32_NotSat1%= \n\t" /* If a32Mult2 = 0, then goes to the MLIB_MulNegRndSat_A32_NotSat */ + "asrs %1, %0, #31 \n\t" /* a32Mult2 = sign of result */ + "movs %0, #0x80 \n\t" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n\t" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, %1 \n\t" /* a32Mult1 = 0x80000000 - Sign of result */ + "b MLIB_MulNegRndSat_A32_End1%= \n\t" /* Goes to the MLIB_MulNegRndSat_A32_End*/ + + "MLIB_MulNegRndSat_A32_NotSat1%=: \n\t" + "lsls %0, %0, #16 \n\t" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n\t" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n\t" /* Result << 1 */ + "uxth %4, %4 \n\t" /* Clears higher 16 bits */ + "lsrs %4, %4, #7 \n\t" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n\t" /* Rounding */ + "lsrs %4, %4, #8 \n\t" /* a32Val3 >> 8 */ + "adds %0, %0, %4 \n\t" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "MLIB_MulNegRndSat_A32_End1%=: \n\t" + "rsbs %0, %0, #0 \n\t" /* a32Mult1 = - a32Mult1 */ + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsrs %2, %4, #16 \n" /* a32Val1 = a32Val3 >> 16 */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val3 */ + "asrs %2, %3, #16 \n" /* a32Val1 = a32Val2 >> 16 */ + "uxth %3, %3 \n" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %2 \n" /* a32Mult1 = a32Mult1 + a32Val1 */ + + "asrs %1, %0, #14 \n" /* a32Mult2 = higher 18 bits of multiplication */ + "beq MLIB_MulNegRndSat_A32_NotSat%= \n" /* If a32Mult2 = 0, then goes to the MLIB_MulNegRndSat_A32_NotSat */ + "mvns %1, %1 \n" /* a32Mult2 = ~ a32Mult2 */ + "beq MLIB_MulNegRndSat_A32_NotSat%= \n" /* If a32Mult2 = 0, then goes to the MLIB_MulNegRndSat_A32_NotSat */ + "asrs %1, %0, #31 \n" /* a32Mult2 = sign of result */ + "movs %0, #0x80 \n" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, %1 \n" /* a32Mult1 = 0x80000000 - Sign of result */ + "b MLIB_MulNegRndSat_A32_End%= \n" /* Goes to the MLIB_MulNegRndSat_A32_End*/ + + "MLIB_MulNegRndSat_A32_NotSat%=: \n" + "lsls %0, %0, #16 \n" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n" /* Result << 1 */ + "uxth %4, %4 \n" /* Clears higher 16 bits */ + "lsrs %4, %4, #7 \n" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n" /* Rounding */ + "lsrs %4, %4, #8 \n" /* a32Val3 >> 8 */ + "adds %0, %0, %4 \n" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "MLIB_MulNegRndSat_A32_End%=: \n" + "rsbs %0, %0, #0 \n" /* a32Mult1 = - a32Mult1 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsrs %2, %4, #16 \n" /* a32Val1 = a32Val3 >> 16 */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val3 */ + "asrs %2, %3, #16 \n" /* a32Val1 = a32Val2 >> 16 */ + "uxth %3, %3 \n" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %2 \n" /* a32Mult1 = a32Mult1 + a32Val1 */ + + "asrs %1, %0, #14 \n" /* a32Mult2 = higher 18 bits of multiplication */ + "beq MLIB_MulNegRndSat_A32_NotSat \n" /* If a32Mult2 = 0, then goes to the MLIB_MulNegRndSat_A32_NotSat */ + "mvns %1, %1 \n" /* a32Mult2 = ~ a32Mult2 */ + "beq MLIB_MulNegRndSat_A32_NotSat \n" /* If a32Mult2 = 0, then goes to the MLIB_MulNegRndSat_A32_NotSat */ + "asrs %1, %0, #31 \n" /* a32Mult2 = sign of result */ + "movs %0, #0x80 \n" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, %1 \n" /* a32Mult1 = 0x80000000 - Sign of result */ + "b MLIB_MulNegRndSat_A32_End \n" /* Goes to the MLIB_MulNegRndSat_A32_End*/ + + "MLIB_MulNegRndSat_A32_NotSat: \n" + "lsls %0, %0, #16 \n" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n" /* Result << 1 */ + "uxth %4, %4 \n" /* Clears higher 16 bits */ + "lsrs %4, %4, #7 \n" /* a32Val3 >> 7 */ + "adds %4, %4, #0x80 \n" /* Rounding */ + "lsrs %4, %4, #8 \n" /* a32Val3 >> 8 */ + "adds %0, %0, %4 \n" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "MLIB_MulNegRndSat_A32_End: \n" + "rsbs %0, %0, #0 \n" /* a32Mult1 = - a32Mult1 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #endif + + return a32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f16Out = -a32Accum * f16Mult +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MulNegRndSat_F16as_FAsmi(register acc32_t a32Accum, register frac16_t f16Mult) +{ + register frac32_t f32Val=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult, f16Mult /* Converts 16-bit input to 32-bit */ + uxth f32Val, a32Accum /* f32Val = a32Accum.L */ + asrs a32Accum, a32Accum, #16 /* a32Accum = a32Accum.H */ + + muls f32Val, f32Val, f16Mult /* f32Val = a32Accum.L * f16Mult */ + asrs f32Val, f32Val, #7 /* f32Val >> 7 */ + adds f32Val, f32Val, #128 /* Rounding */ + asrs f32Val, f32Val, #8 /* f32Val >> 8 */ + + muls f16Mult, f16Mult, a32Accum /* f16Mult = a32Accum.H * f16Mult */ + lsls f16Mult, f16Mult, #1 /* f16Mult << 1 */ + adds f16Mult, f16Mult, f32Val /* f16Mult = f16Mult + f32Val */ + + rsbs f16Mult, f16Mult, #0 /* Negation */ + + movs f32Val, #128 /* f32Val = 0x80 */ + lsls f32Val, #8 /* f32Val = 0x8000 */ + + cmp f32Val, f16Mult /* Compares f16Mult with 0x8000 */ + bge NegTest /* If f16Mult < 0x8000, then goes to NegTest */ + subs f16Mult, f32Val, #1 /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f32Val, f32Val /* f32Val = 0xFFFF8000 */ + cmp f32Val, f16Mult /* Compares f16Mult with 0xFFFF8000 */ + ble SatEnd /* If f16Mult >= 0xFFFF8000, then goes to SatEnd */ + mov f16Mult, f32Val /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "uxth %2, %1 \n\t" /* f32Val = a32Accum.L */ + "asrs %1, %1, #16 \n\t" /* a32Accum = a32Accum.H */ + + "muls %2, %2, %0 \n\t" /* f32Val = a32Accum.L * f16Mult */ + "asrs %2, %2, #7 \n\t" /* f32Val >> 7 */ + "adds %2, %2, #128 \n\t" /* Rounding */ + "asrs %2, %2, #8 \n\t" /* f32Val >> 8 */ + + "muls %0, %0, %1 \n\t" /* f16Mult = a32Accum.H * f16Mult */ + "lsls %0, %0, #1 \n\t" /* f16Mult << 1 */ + "adds %0, %0, %2 \n\t" /* f16Mult = f16Mult + f32Val */ + + "rsbs %0, %0, #0 \n\t" /* Negation */ + + "movs %2, #128 \n\t" /* f32Val = 0x80 */ + "lsls %2, %2, #8 \n\t" /* f32Val = 0x8000 */ + + "cmp %2, %0 \n\t" /* Compares f16Mult with 0x8000 */ + "bge MLIB_MulNegRndSat_F16as_NegTest%= \n\t" /* If f16Mult < 0x8000, then jumps through two commands */ + "subs %0, %2, #1 \n\t" /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + "b MLIB_MulNegRndSat_F16as_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MulNegRndSat_F16as_NegTest%=: \n\t" + "sxth %2, %2 \n\t" /* f32Val = 0xFFFF8000 */ + "cmp %2, %0 \n\t" /* Compares f16Mult with 0xFFFF8000 */ + "ble MLIB_MulNegRndSat_F16as_SatEnd%= \n\t"/* If f16Mult >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %2 \n\t" /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + "MLIB_MulNegRndSat_F16as_SatEnd%=: \n\t" + : "+l"(f16Mult), "+l"(a32Accum), "+l"(f32Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "uxth %2, %1 \n" /* f32Val = a32Accum.L */ + "asrs %1, %1, #16 \n" /* a32Accum = a32Accum.H */ + + "muls %2, %2, %0 \n" /* f32Val = a32Accum.L * f16Mult */ + "asrs %2, %2, #7 \n" /* f32Val >> 7 */ + "adds %2, %2, #128 \n" /* Rounding */ + "asrs %2, %2, #8 \n" /* f32Val >> 8 */ + + "muls %0, %0, %1 \n" /* f16Mult = a32Accum.H * f16Mult */ + "lsls %0, %0, #1 \n" /* f16Mult << 1 */ + "adds %0, %0, %2 \n" /* f16Mult = f16Mult + f32Val */ + + "rsbs %0, %0, #0 \n" /* Negation */ + + "movs %2, #128 \n" /* f32Val = 0x80 */ + "lsls %2, %2, #8 \n" /* f32Val = 0x8000 */ + + "cmp %2, %0 \n" /* Compares f16Mult with 0x8000 */ + "bge .+6 \n" /* If f16Mult < 0x8000, then jumps through two commands */ + "subs %0, %2, #1 \n" /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + + "sxth %2, %2 \n" /* f32Val = 0xFFFF8000 */ + "cmp %2, %0 \n" /* Compares f16Mult with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Mult >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %2 \n" /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Mult), "+l"(a32Accum), "+l"(f32Val):); + #endif + return f16Mult; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MULRND_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F16.h new file mode 100644 index 0000000..b92068c --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F16.h @@ -0,0 +1,78 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MULRND_F16_H_ +#define _MLIB_MULRND_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MulRnd_F16_Ci(f16Mult1, f16Mult2) MLIB_MulRnd_F16_FCi(f16Mult1, f16Mult2) +#define MLIB_MulNegRnd_F16_Ci(f16Mult1, f16Mult2) MLIB_MulNegRnd_F16_FCi(f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Mult1 * f16Mult2 +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_MulRnd_F16_FCi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + return(frac16_t)MLIB_ShR_F32_Ci((int32_t)f16Mult1 * (int32_t)f16Mult2 + 0x4000, 15U); +} + +/***************************************************************************//*! +* +* f16Out = f16Mult1 * f16Mult2 +* +*******************************************************************************/ +static inline frac16_t MLIB_MulNegRnd_F16_FCi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + return(frac16_t)MLIB_ShR_F32_Ci((int32_t)f16Mult1 * (int32_t)(-f16Mult2) + 0x4000, 15U); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MULRND_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F16_Asmi.h new file mode 100644 index 0000000..a61984a --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F16_Asmi.h @@ -0,0 +1,124 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MULRND_F16_ASM_H_ +#define _MLIB_MULRND_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MulRndSat_F16_Asmi(f16Mult1, f16Mult2) MLIB_MulRndSat_F16_FAsmi(f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Mult1 * f16Mult2 +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MulRndSat_F16_FAsmi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #7 /* f16Mult1 >> 7 */ + adds f16Mult1, f16Mult1, #128 /* Rounding */ + asrs f16Mult1, f16Mult1, #8 /* f16Mult1 >> 8 */ + movs f16Mult2, #128 /* f16Mult2 = 0x80 */ + lsls f16Mult2, f16Mult2, #8 /* f16Mult2 = 0x8000 */ + cmp f16Mult1, f16Mult2 /* Compares f16Mult1 with 0x8000*/ + bne NotSat /* If f16Mult1 <> 0x8000, then jumps through next command */ + subs f16Mult1, f16Mult1, #1 /* If f16Mult1 = 0x8000, then f16Mult1 = 0x7FFF */ + NotSat: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %0, %0, %1 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %0, %0, #7 \n\t" /* f16Mult1 >> 7 */ + "adds %0, %0, #128 \n\t" /* Rounding */ + "asrs %0, %0, #8 \n\t" /* f16Mult1 >> 8 */ + + "movs %1, #128 \n\t" /* f16Mult2 = 0x80 */ + "lsls %1, %1, #8 \n\t" /* f16Mult2 = 0x8000 */ + "cmp %0, %1 \n\t" /* Compares f16Mult1 with 0x8000*/ + "bne MLIB_MulRndSat_F16_NotSat%= \n\t" /* If f16Mult1 <> 0x8000, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* If f16Mult1 = 0x8000, then f16Mult1 = 0x7FFF */ + "MLIB_MulRndSat_F16_NotSat%=: \n\t" + : "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "muls %0, %0, %1 \n" /* f16Mult1 * f16Mult2 */ + "asrs %0, %0, #7 \n" /* f16Mult1 >> 7 */ + "adds %0, %0, #128 \n" /* Rounding */ + "asrs %0, %0, #8 \n" /* f16Mult1 >> 8 */ + + "movs %1, #128 \n" /* f16Mult2 = 0x80 */ + "lsls %1, %1, #8 \n" /* f16Mult2 = 0x8000 */ + "cmp %0, %1 \n" /* Compares f16Mult1 with 0x8000*/ + "bne .+4 \n" /* If f16Mult1 <> 0x8000, then jumps through next command */ + "subs %0, %0, #1 \n" /* If f16Mult1 = 0x8000, then f16Mult1 = 0x7FFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return f16Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MULRND_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F32.h new file mode 100644 index 0000000..ab9d241 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F32.h @@ -0,0 +1,125 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MULRND_F32_H_ +#define _MLIB_MULRND_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Neg_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MulRnd_F32ls_Ci(f32Mult1, f16Mult2) MLIB_MulRnd_F32ls_FCi(f32Mult1, f16Mult2) +#define MLIB_MulRndSat_F32ls_Ci(f32Mult1, f16Mult2) MLIB_MulRndSat_F32ls_FCi(f32Mult1, f16Mult2) +#define MLIB_MulNegRnd_F32_Ci(f32Mult1, f32Mult2) MLIB_MulNegRnd_F32_FCi(f32Mult1, f32Mult2) +#define MLIB_MulNegRnd_F32ls_Ci(f32Mult1, f16Mult2) MLIB_MulNegRnd_F32ls_FCi(f32Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = f32Mult1 * f16Mult2 +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_MulRnd_F32ls_FCi(register frac32_t f32Mult1, register frac16_t f16Mult2) +{ + register frac64_t f64Temp; + register uint64_t u64Temp; + + f64Temp = (int64_t)f32Mult1 * (int16_t)f16Mult2 + 0x4000; + u64Temp = (uint64_t)f64Temp >> 15U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x2000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return (frac32_t)u64Temp; /* cast back the corrected values */ +} + +/***************************************************************************//*! +* +* f32Out = f32Mult1 * f16Mult2 +* With saturation +*******************************************************************************/ +static inline frac32_t MLIB_MulRndSat_F32ls_FCi(register frac32_t f32Mult1, register frac16_t f16Mult2) +{ + register int32_t i32Temp; + + i32Temp = (int32_t)(MLIB_MulRnd_F32ls_Ci(f32Mult1, f16Mult2)); + i32Temp = (i32Temp == INT32_MIN) ? INT32_MAX : i32Temp; + return((frac32_t)(i32Temp)); +} +/***************************************************************************//*! +* +* f32Out = f32Mult1 * -f32Mult2 +* +*******************************************************************************/ +static inline frac32_t MLIB_MulNegRnd_F32_FCi(register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac64_t f64Temp; + register uint64_t u64Temp; + + f64Temp = (int64_t)f32Mult1 * (int64_t)f32Mult2 + 0x40000000; + u64Temp = (uint64_t)f64Temp >> 31U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x200000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return MLIB_Neg_F32_FCi((frac32_t)u64Temp); /* cast back the corrected values */ +} + +/***************************************************************************//*! +* +* f32Out = f32Mult1 * -f16Mult2 +* +*******************************************************************************/ +static inline frac32_t MLIB_MulNegRnd_F32ls_FCi(register frac32_t f32Mult1, register frac16_t f16Mult2) +{ + register frac64_t f64Temp; + register uint64_t u64Temp; + + f64Temp = (int64_t)f32Mult1 * (int64_t)f16Mult2 + 0x4000; + u64Temp = (uint64_t)f64Temp >> 15U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x2000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return MLIB_Neg_F32_FCi((frac32_t)u64Temp); /* cast back the corrected values */ +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MULRND_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F32_Asmi.h new file mode 100644 index 0000000..6468513 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_MulRnd_F32_Asmi.h @@ -0,0 +1,401 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply with rounding +* +*******************************************************************************/ +#ifndef _MLIB_MULRND_F32_ASM_H_ +#define _MLIB_MULRND_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MulRnd_F32_Asmi(f32Mult1, f32Mult2) MLIB_MulRnd_F32_FAsmi(f32Mult1, f32Mult2) +#define MLIB_MulRndSat_F32_Asmi(f32Mult1, f32Mult2) MLIB_MulRndSat_F32_FAsmi(f32Mult1, f32Mult2) +#define MLIB_MulNegRnd_F32_Asmi(f32Mult1, f32Mult2) MLIB_MulNegRnd_F32_FAsmi(f32Mult1, f32Mult2) + +/***************************************************************************//*! +* +* f32Out = f32Mult1 * f32Mult2 +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MulRnd_F32_FAsmi(register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #7 /* f32Val1 >> 7 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #7 /* f32Val2 >> 7 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + adds f32Val2, f32Val2, #128 /* Rounding */ + asrs f32Val2, f32Val2, #8 /* f32Val2 >> 8 */ + + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + lsls f32Mult1, f32Mult1, #1 /* f32Mult1 << 1 */ + adds f32Mult1, f32Mult1, f32Val2 }; /* f32Mult1 = f32Mult1 + f32Val2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %3, %1 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %0, %0, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %4, %2 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %4, %4, %3 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %4, %4, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %2, %2, %1 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %2, %2, %4 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %2, %2, #7 \n\t" /* f32Val1 >> 7 */ + + "muls %3, %3, %0 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %3, %3, #7 \n\t" /* f32Val2 >> 7 */ + "adds %3, %3, %2 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "adds %3, %3, #128 \n\t" /* Rounding */ + "asrs %3, %3, #8 \n\t" /* f32Val2 >> 8 */ + + "muls %0, %0, %1 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %0, %0, #1 \n\t" /* f32Mult1 << 1 */ + "adds %0, %0, %3 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + + : "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* f32Val1 = f32Mult1.L */ + "uxth %3, %1 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %0, %0, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %4, %2 \n" /* f32Val3 = f32Mult1.L */ + "muls %4, %4, %3 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %4, %4, #16 \n" /* f32Val3 >> 16 */ + + "muls %2, %2, %1 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %2, %2, %4 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %2, %2, #7 \n" /* f32Val1 >> 7 */ + + "muls %3, %3, %0 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %3, %3, #7 \n" /* f32Val2 >> 7 */ + "adds %3, %3, %2 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "adds %3, %3, #128 \n" /* Rounding */ + "asrs %3, %3, #8 \n" /* f32Val2 >> 8 */ + + "muls %0, %0, %1 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %0, %0, #1 \n" /* f32Mult1 << 1 */ + "adds %0, %0, %3 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f32Out = f32Mult1 * f32Mult2 +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MulRndSat_F32_FAsmi(register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #7 /* f32Val1 >> 7 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #7 /* f32Val2 >> 7 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + adds f32Val2, f32Val2, #128 /* Rounding */ + asrs f32Val2, f32Val2, #8 /* f32Val2 >> 8 */ + + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + lsls f32Mult1, f32Mult1, #1 /* f32Mult1 << 1 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + + rev f32Mult2, f32Mult1 /* Byte-reverse of result */ + cmp f32Mult2, #128 /* Compares with 0x80 */ + bne NotSat /* If result <> 0x80000000, goes to NotSat */ + mvns f32Mult1, f32Mult1 /* If result = 0x80000000, then return 0x7FFFFFFF */ + NotSat: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %3, %1 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %0, %0, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %4, %2 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %4, %4, %3 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %4, %4, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %2, %2, %1 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %2, %2, %4 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %2, %2, #7 \n\t" /* f32Val1 >> 7 */ + + "muls %3, %3, %0 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %3, %3, #7 \n\t" /* f32Val2 >> 7 */ + "adds %3, %3, %2 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "adds %3, %3, #128 \n\t" /* Rounding */ + "asrs %3, %3, #8 \n\t" /* f32Val2 >> 8 */ + + "muls %0, %0, %1 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %0, %0, #1 \n\t" /* f32Mult1 << 1 */ + "adds %0, %0, %3 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "rev %1, %0 \n\t" /* Byte-reverse of result */ + "cmp %1, #128 \n\t" /* Compares with 0x80 */ + "bne MLIB_MulRndSat_F32_NotSat%= \n\t" /* If result <> 0x80000000, jumps through next command */ + "mvns %0, %0 \n\t" /* If result = 0x80000000, then return 0x7FFFFFFF */ + "MLIB_MulRndSat_F32_NotSat%=: \n\t" + : "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* f32Val1 = f32Mult1.L */ + "uxth %3, %1 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %0, %0, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %4, %2 \n" /* f32Val3 = f32Mult1.L */ + "muls %4, %4, %3 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %4, %4, #16 \n" /* f32Val3 >> 16 */ + + "muls %2, %2, %1 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %2, %2, %4 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %2, %2, #7 \n" /* f32Val1 >> 7 */ + + "muls %3, %3, %0 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %3, %3, #7 \n" /* f32Val2 >> 7 */ + "adds %3, %3, %2 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "adds %3, %3, #128 \n" /* Rounding */ + "asrs %3, %3, #8 \n" /* f32Val2 >> 8 */ + + "muls %0, %0, %1 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %0, %0, #1 \n" /* f32Mult1 << 1 */ + "adds %0, %0, %3 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + + "rev %1, %0 \n" /* Byte-reverse of result */ + "cmp %1, #128 \n" /* Compares with 0x80 */ + "bne .+4 \n" /* If result <> 0x80000000, jumps through next command */ + "mvns %0, %0 \n" /* If result = 0x80000000, then return 0x7FFFFFFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f32Out = f32Mult1 * -f32Mult2 +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MulNegRnd_F32_FAsmi(register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Val1=0, f32Val2=0, f32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth f32Val1, f32Mult1 /* f32Val1 = f32Mult1.L */ + uxth f32Val2, f32Mult2 /* f32Val2 = f32Mult2.L */ + + asrs f32Mult1, f32Mult1, #16 /* f32Mult1 = f32Mult1.H */ + asrs f32Mult2, f32Mult2, #16 /* f32Mult2 = f32Mult2.H */ + + movs f32Val3, f32Val1 /* f32Val3 = f32Mult1.L */ + muls f32Val3, f32Val3, f32Val2 /* f32Val3 = f32Mult1.L * f32Mult2.L */ + lsrs f32Val3, f32Val3, #16 /* f32Val3 >> 16 */ + + muls f32Val1, f32Val1, f32Mult2 /* f32Val1 = f32Mult1.L * f32Mult2.H */ + adds f32Val1, f32Val1, f32Val3 /* f32Val1 = f32Val1 + f32Val3 */ + asrs f32Val1, f32Val1, #7 /* f32Val1 >> 7 */ + + muls f32Val2, f32Val2, f32Mult1 /* f32Val2 = f32Mult2.L * f32Mult1.H */ + asrs f32Val2, f32Val2, #7 /* f32Val2 >> 7 */ + adds f32Val2, f32Val2, f32Val1 /* f32Val2 = f32Val2 + f32Val1 */ + adds f32Val2, f32Val2, #128 /* Rounding */ + asrs f32Val2, f32Val2, #8 /* f32Val2 >> 8 */ + + muls f32Mult1, f32Mult1, f32Mult2 /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + lsls f32Mult1, f32Mult1, #1 /* f32Mult1 << 1 */ + adds f32Mult1, f32Mult1, f32Val2 /* f32Mult1 = f32Mult1 + f32Val2 */ + rsbs f32Mult1, f32Mult1, #0 }; /* Negation */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* f32Val1 = f32Mult1.L */ + "uxth %3, %1 \n\t" /* f32Val2 = f32Mult2.L */ + + "asrs %0, %0, #16 \n\t" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* f32Mult2 = f32Mult2.H */ + + "movs %4, %2 \n\t" /* f32Val3 = f32Mult1.L */ + "muls %4, %4, %3 \n\t" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %4, %4, #16 \n\t" /* f32Val3 >> 16 */ + + "muls %2, %2, %1 \n\t" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %2, %2, %4 \n\t" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %2, %2, #7 \n\t" /* f32Val1 >> 7 */ + + "muls %3, %3, %0 \n\t" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %3, %3, #7 \n\t" /* f32Val2 >> 7 */ + "adds %3, %3, %2 \n\t" /* f32Val2 = f32Val2 + f32Val1 */ + "adds %3, %3, #128 \n\t" /* Rounding */ + "asrs %3, %3, #8 \n\t" /* f32Val2 >> 8 */ + + "muls %0, %0, %1 \n\t" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %0, %0, #1 \n\t" /* f32Mult1 << 1 */ + "adds %0, %0, %3 \n\t" /* f32Mult1 = f32Mult1 + f32Val2 */ + "rsbs %0, %0, #0 \n\t" /* Negation */ + : "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* f32Val1 = f32Mult1.L */ + "uxth %3, %1 \n" /* f32Val2 = f32Mult2.L */ + + "asrs %0, %0, #16 \n" /* f32Mult1 = f32Mult1.H */ + "asrs %1, %1, #16 \n" /* f32Mult2 = f32Mult2.H */ + + "movs %4, %2 \n" /* f32Val3 = f32Mult1.L */ + "muls %4, %4, %3 \n" /* f32Val3 = f32Mult1.L * f32Mult2.L */ + "lsrs %4, %4, #16 \n" /* f32Val3 >> 16 */ + + "muls %2, %2, %1 \n" /* f32Val1 = f32Mult1.L * f32Mult2.H */ + "adds %2, %2, %4 \n" /* f32Val1 = f32Val1 + f32Val3 */ + "asrs %2, %2, #7 \n" /* f32Val1 >> 7 */ + + "muls %3, %3, %0 \n" /* f32Val2 = f32Mult2.L * f32Mult1.H */ + "asrs %3, %3, #7 \n" /* f32Val2 >> 7 */ + "adds %3, %3, %2 \n" /* f32Val2 = f32Val2 + f32Val1 */ + "adds %3, %3, #128 \n" /* Rounding */ + "asrs %3, %3, #8 \n" /* f32Val2 >> 8 */ + + "muls %0, %0, %1 \n" /* f32Mult1 = f32Mult1.H * f32Mult2.H */ + "lsls %0, %0, #1 \n" /* f32Mult1 << 1 */ + "adds %0, %0, %3 \n" /* f32Mult1 = f32Mult1 + f32Val2 */ + "rsbs %0, %0, #0 \n" /* Negation */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Mult1), "+l"(f32Mult2), "+l"(f32Val1), "+l"(f32Val2), "+l"(f32Val3):); + #endif + + return f32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MULRND_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_A32.h new file mode 100644 index 0000000..963fa9e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_A32.h @@ -0,0 +1,92 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply +* +*******************************************************************************/ +#ifndef _MLIB_MUL_A32_H_ +#define _MLIB_MUL_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mul_F16as_Ci(a32Accum, f16Mult) MLIB_Mul_F16as_FCi(a32Accum, f16Mult) +#define MLIB_MulNeg_F16as_Ci(a32Accum, f16Mult) MLIB_MulNeg_F16as_FCi(a32Accum, f16Mult) + +/***************************************************************************//*! +* +* f16Out = a32Accum * f16Mult +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Mul_F16as_FCi(register acc32_t a32Accum, register frac16_t f16Mult) +{ + register frac64_t f64Temp; + register uint64_t u64Temp; + + f64Temp = (frac64_t)a32Accum * f16Mult; + u64Temp = (uint64_t)f64Temp >> 15U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x2000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return (frac16_t)u64Temp; /* cast back the corrected values */ +} +/***************************************************************************//*! +* +* f16Out = a32Accum * -f16Mult + +*******************************************************************************/ +static inline frac16_t MLIB_MulNeg_F16as_FCi(register acc32_t a32Accum, register frac16_t f16Mult) +{ + register frac64_t f64Temp; + register uint64_t u64Temp; + + f64Temp = (frac64_t)a32Accum * (-f16Mult); + u64Temp = (uint64_t)f64Temp >> 15U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x2000000000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return (frac16_t)u64Temp; /* cast back the corrected values */ +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MUL_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_A32_Asmi.h new file mode 100644 index 0000000..5656d49 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_A32_Asmi.h @@ -0,0 +1,805 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply +* +*******************************************************************************/ +#ifndef _MLIB_MUL_A32_ASM_H_ +#define _MLIB_MUL_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MulSat_F16as_Asmi(a32Accum, f16Mult) MLIB_MulSat_F16as_FAsmi(a32Accum, f16Mult) +#define MLIB_Mul_A32_Asmi(a32Mult1, a32Mult2) MLIB_Mul_A32_FAsmi(a32Mult1, a32Mult2) +#define MLIB_MulSat_A32_Asmi(a32Mult1, a32Mult2) MLIB_MulSat_A32_FAsmi(a32Mult1, a32Mult2) +#define MLIB_MulNeg_A32_Asmi(a32Mult1, a32Mult2) MLIB_MulNeg_A32_FAsmi(a32Mult1, a32Mult2) +#define MLIB_MulNegSat_A32_Asmi(a32Mult1, a32Mult2) MLIB_MulNegSat_A32_FAsmi(a32Mult1, a32Mult2) +#define MLIB_MulNegSat_F16as_Asmi(a32Accum, f16Mult) MLIB_MulNegSat_F16as_FAsmi(a32Accum, f16Mult) + +/***************************************************************************//*! +* +* f16Out = a32Accum * f16Mult +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MulSat_F16as_FAsmi(register acc32_t a32Accum, register frac16_t f16Mult) +{ + register frac32_t f32Val=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult, f16Mult /* Converts 16-bit input to 32-bit */ + uxth f32Val, a32Accum /* f32Val = a32Accum.L */ + asrs a32Accum, a32Accum, #16 /* a32Accum = a32Accum.H */ + + muls f32Val, f32Val, f16Mult /* f32Val = a32Accum.L * f16Mult */ + asrs f32Val, f32Val, #15 /* f32Val = a32Accum.L * f16Mult >> 15 */ + + muls f16Mult, f16Mult, a32Accum /* f16Mult = a32Accum.H * f16Mult */ + lsls f16Mult, f16Mult, #1 /* f16Mult << 1 */ + adds f16Mult, f16Mult, f32Val /* f16Mult = f16Mult + f32Val */ + + movs f32Val, #128 /* f32Val = 0x80 */ + lsls f32Val, f32Val, #8 /* f32Val = 0x8000 */ + + rev a32Accum, f16Mult /* Reverse byte */ + cmp a32Accum, #0x80 /* Compares with 0x80 */ + bne PosTest /* If Result != 0x80000000, then goes to PosTest */ + subs f16Mult, f32Val, #1 /* If Result = 0x80000000, then f16Mult = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + PosTest: + cmp f32Val, f16Mult /* Compares f16Mult with 0x8000 */ + bge NegTest /* If f16Mult < 0x8000, then goes to NegTest */ + subs f16Mult, f32Val, #1 /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f32Val, f32Val /* f32Val = 0xFFFF8000 */ + cmp f32Val, f16Mult /* Compares f16Mult with 0xFFFF8000 */ + ble SatEnd /* If f16Mult >= 0xFFFF8000, then goes to SatEnd */ + mov f16Mult, f32Val /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "uxth %2, %1 \n\t" /* f32Val = a32Accum.L */ + "asrs %1, %1, #16 \n\t" /* a32Accum = a32Accum.H */ + + "muls %2, %2, %0 \n\t" /* f32Val = a32Accum.L * f16Mult */ + "asrs %2, %2, #15 \n\t" /* f32Val = a32Accum.L * f16Mult >> 15 */ + + "muls %0, %0, %1 \n\t" /* f16Mult = a32Accum.H * f16Mult */ + "lsls %0, %0, #1 \n\t" /* f16Mult << 1 */ + "adds %0, %0, %2 \n\t" /* f16Mult = f16Mult + f32Val */ + + "movs %2, #128 \n\t" /* f32Val = 0x80 */ + "lsls %2, %2, #8 \n\t" /* f32Val = 0x8000 */ + + "rev %1, %0 \n\t" /* Reverse byte */ + "cmp %1, #0x80 \n\t" /* Compares with 0x80 */ + "bne MLIB_MulSat_F16as_PosTest%= \n\t" /* If Result != 0x80000000, then jumps through two commands */ + "subs %0, %2, #1 \n\t" /* If Result = 0x80000000, then f16Mult = 0x7FFF */ + "b MLIB_MulSat_F16as_SatEnd%= \n\t" /* Jumps through eight commands */ + "MLIB_MulSat_F16as_PosTest%=: \n\t" + "cmp %2, %0 \n\t" /* Compares f16Mult with 0x8000 */ + "bge MLIB_MulSat_F16as_NegTest%= \n\t" /* If f16Mult < 0x8000, then jumps through two commands */ + "subs %0, %2, #1 \n\t" /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + "b MLIB_MulSat_F16as_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MulSat_F16as_NegTest%=: \n\t" + "sxth %2, %2 \n\t" /* f32Val = 0xFFFF8000 */ + "cmp %2, %0 \n\t" /* Compares f16Mult with 0xFFFF8000 */ + "ble MLIB_MulSat_F16as_SatEnd%= \n\t" /* If f16Mult >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %2 \n\t" /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + "MLIB_MulSat_F16as_SatEnd%=: \n\t" + : "+l"(f16Mult), "+l"(a32Accum), "+l"(f32Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "uxth %2, %1 \n" /* f32Val = a32Accum.L */ + "asrs %1, %1, #16 \n" /* a32Accum = a32Accum.H */ + + "muls %2, %2, %0 \n" /* f32Val = a32Accum.L * f16Mult */ + "asrs %2, %2, #15 \n" /* f32Val = a32Accum.L * f16Mult >> 15 */ + + "muls %0, %0, %1 \n" /* f16Mult = a32Accum.H * f16Mult */ + "lsls %0, %0, #1 \n" /* f16Mult << 1 */ + "adds %0, %0, %2 \n" /* f16Mult = f16Mult + f32Val */ + + "movs %2, #128 \n" /* f32Val = 0x80 */ + "lsls %2, %2, #8 \n" /* f32Val = 0x8000 */ + + "rev %1, %0 \n" /* Reverse byte */ + "cmp %1, #0x80 \n" /* Compares with 0x80 */ + "bne .+6 \n" /* If Result != 0x80000000, then jumps through two commands */ + "subs %0, %2, #1 \n" /* If Result = 0x80000000, then f16Mult = 0x7FFF */ + "b .+18 \n" /* Jumps through eight commands */ + + "cmp %2, %0 \n" /* Compares f16Mult with 0x8000 */ + "bge .+6 \n" /* If f16Mult < 0x8000, then jumps through two commands */ + "subs %0, %2, #1 \n" /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + + "sxth %2, %2 \n" /* f32Val = 0xFFFF8000 */ + "cmp %2, %0 \n" /* Compares f16Mult with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Mult >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %2 \n" /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Mult), "+l"(a32Accum), "+l"(f32Val):); + #endif + return f16Mult; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* Output = a32Mult1 * a32Mult2 +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_Mul_A32_FAsmi(register acc32_t a32Mult1, register acc32_t a32Mult2) +{ + register frac32_t a32Val1=0, a32Val2=0, a32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth a32Val1, a32Mult1 /* a32Val1 = a32Mult1.L */ + uxth a32Val2, a32Mult2 /* a32Val2 = a32Mult2.L */ + + asrs a32Mult1, a32Mult1, #16 /* a32Mult1 = a32Mult1.H */ + asrs a32Mult2, a32Mult2, #16 /* a32Mult2 = a32Mult2.H */ + + movs a32Val3, a32Val1 /* a32Val3 = a32Mult1.L */ + muls a32Val3, a32Val3, a32Val2 /* a32Val3 = a32Mult1.L * a32Mult2.L */ + lsrs a32Val3, a32Val3, #15 /* a32Val3 >> 15 */ + + muls a32Val1, a32Val1, a32Mult2 /* a32Val1 = a32Mult1.L * a32Mult2.H */ + muls a32Val2, a32Val2, a32Mult1 /* a32Val2 = a32Mult2.L * a32Mult1.H */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val1 */ + + lsls a32Val2, a32Val2, #1 /* a32Val2 << 1 */ + adds a32Val2, a32Val2, a32Val3 /* a32Val2 = a32Val2 + a32Val3 */ + + muls a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + lsls a32Mult1, a32Mult1, #17 /* a32Mult1 << 17 */ + adds a32Mult1, a32Mult1, a32Val2 }; /* a32Mult1 = a32Mult1 + a32Val2 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n\t" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n\t" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n\t" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n\t" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #15 \n\t" /* a32Val3 >> 15 */ + + "muls %2, %2, %1 \n\t" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n\t" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsls %3, %3, #1 \n\t" /* a32Val2 << 1 */ + "adds %3, %3, %4 \n\t" /* a32Val2 = a32Val2 + a32Val3 */ + + "muls %0, %0, %1 \n\t" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "lsls %0, %0, #17 \n\t" /* a32Mult1 << 17 */ + "adds %0, %0, %3 \n\t" /* a32Mult1 = a32Mult1 + a32Val2 */ + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #15 \n" /* a32Val3 >> 15 */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsls %3, %3, #1 \n" /* a32Val2 << 1 */ + "adds %3, %3, %4 \n" /* a32Val2 = a32Val2 + a32Val3 */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "lsls %0, %0, #17 \n" /* a32Mult1 << 17 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #endif + + return a32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* Output = a32Mult1 * a32Mult2 +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MulSat_A32_FAsmi(register acc32_t a32Mult1, register acc32_t a32Mult2) +{ + register acc32_t a32Val1=0, a32Val2=0, a32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth a32Val1, a32Mult1 /* a32Val1 = a32Mult1.L */ + uxth a32Val2, a32Mult2 /* a32Val2 = a32Mult2.L */ + + asrs a32Mult1, a32Mult1, #16 /* a32Mult1 = a32Mult1.H */ + asrs a32Mult2, a32Mult2, #16 /* a32Mult2 = a32Mult2.H */ + + movs a32Val3, a32Val1 /* a32Val3 = a32Mult1.L */ + muls a32Val3, a32Val3, a32Val2 /* a32Val3 = a32Mult1.L * a32Mult2.L */ + lsrs a32Val3, a32Val3, #16 /* a32Val3 >> 16 */ + + muls a32Val1, a32Val1, a32Mult2 /* a32Val1 = a32Mult1.L * a32Mult2.H */ + muls a32Val2, a32Val2, a32Mult1 /* a32Val2 = a32Mult2.L * a32Mult1.H */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val1 */ + adds a32Val2, a32Val2, a32Val3 /* a32Val2 = a32Val2 + a32Val3 */ + + asrs a32Val3, a32Val2, #16 /* a32Val3 = a32Val2 >> 16 */ + uxth a32Val2, a32Val2 /* Clears higher 16 bits */ + + muls a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + adds a32Mult1, a32Mult1, a32Val3 /* a32Mult1 = a32Mult1 + a32Val3 */ + + asrs a32Val1, a32Mult1, #14 /* a32Val1 = higher 18 bits of multiplication */ + asrs a32Mult2, a32Mult1, #31 /* a32Mult2 = sign of multiplication */ + cmp a32Val1, a32Mult2 /* Compares a32Val1 and a32Val2 */ + bne MLIB_MulSat_A32_Sat /* If a32Val1 != a32Mult2, then goes to the MLIB_MulSat_A32_Sat */ + + lsls a32Mult1, a32Mult1, #16 /* a32Mult1 << 16 */ + adds a32Mult1, a32Mult1, a32Val2 /* a32Mult1 = a32Mult1 + a32Val2 */ + lsls a32Mult1, a32Mult1, #1 /* Result << 1 */ + b MLIB_MulSat_A32_End /* Goes to the MLIB_MulSat_A32_End*/ + + MLIB_MulSat_A32_Sat: + movs a32Mult1, #0x80 /* a32Mult1 = 0x80 */ + lsls a32Mult1, a32Mult1, #24 /* a32Mult1 = 0x80000000 */ + subs a32Mult1, a32Mult1, #1 /* a32Mult1 = 0x7FFFFFFF */ + subs a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = 0x7FFFFFFF - Sign of result */ + MLIB_MulSat_A32_End: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n\t" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n\t" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n\t" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n\t" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #16 \n\t" /* a32Val3 >> 16 */ + + "muls %2, %2, %1 \n\t" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n\t" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val1 */ + "adds %3, %3, %4 \n\t" /* a32Val2 = a32Val2 + a32Val3 */ + + "asrs %4, %3, #16 \n\t" /* a32Val3 = a32Val2 >> 16 */ + "uxth %3, %3 \n\t" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n\t" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %4 \n\t" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "asrs %2, %0, #14 \n\t" /* a32Val1 = higher 18 bits of multiplication */ + "asrs %1, %0, #31 \n\t" /* a32Mult2 = sign of multiplication */ + "cmp %2, %1 \n\t" /* Compares a32Val1 and a32Val2 */ + "bne MLIB_MulSat_A32_Sat1%= \n\t" /* If a32Val1 != a32Mult2, then goes to the MLIB_MulSat_A32_Sat */ + + "lsls %0, %0, #16 \n\t" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n\t" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n\t" /* Result << 1 */ + "b MLIB_MulSat_A32_End1%= \n\t" /* Goes to the MLIB_MulSat_A32_End*/ + + "MLIB_MulSat_A32_Sat1%=: \n\t" + "movs %0, #0x80 \n\t" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n\t" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, #1 \n\t" /* a32Mult1 = 0x7FFFFFFF */ + "subs %0, %0, %1 \n\t" /* a32Mult1 = 0x7FFFFFFF - Sign of result */ + + "MLIB_MulSat_A32_End1%=: \n\t" + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #16 \n" /* a32Val3 >> 16 */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + "adds %3, %3, %4 \n" /* a32Val2 = a32Val2 + a32Val3 */ + + "asrs %4, %3, #16 \n" /* a32Val3 = a32Val2 >> 16 */ + "uxth %3, %3 \n" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %4 \n" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "asrs %2, %0, #14 \n" /* a32Val1 = higher 18 bits of multiplication */ + "asrs %1, %0, #31 \n" /* a32Mult2 = sign of multiplication */ + "cmp %2, %1 \n" /* Compares a32Val1 and a32Val2 */ + "bne MLIB_MulSat_A32_Sat \n" /* If a32Val1 != a32Mult2, then goes to the MLIB_MulSat_A32_Sat */ + + "lsls %0, %0, #16 \n" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n" /* Result << 1 */ + "b MLIB_MulSat_A32_End \n" /* Goes to the MLIB_MulSat_A32_End*/ + + "MLIB_MulSat_A32_Sat: \n" + "movs %0, #0x80 \n" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, #1 \n" /* a32Mult1 = 0x7FFFFFFF */ + "subs %0, %0, %1 \n" /* a32Mult1 = 0x7FFFFFFF - Sign of result */ + + "MLIB_MulSat_A32_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #endif + + return a32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* Output = - a32Mult1 * a32Mult2 +* Without saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MulNeg_A32_FAsmi(register acc32_t a32Mult1, register acc32_t a32Mult2) +{ + register frac32_t a32Val1=0, a32Val2=0, a32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth a32Val1, a32Mult1 /* a32Val1 = a32Mult1.L */ + uxth a32Val2, a32Mult2 /* a32Val2 = a32Mult2.L */ + + asrs a32Mult1, a32Mult1, #16 /* a32Mult1 = a32Mult1.H */ + asrs a32Mult2, a32Mult2, #16 /* a32Mult2 = a32Mult2.H */ + + movs a32Val3, a32Val1 /* a32Val3 = a32Mult1.L */ + muls a32Val3, a32Val3, a32Val2 /* a32Val3 = a32Mult1.L * a32Mult2.L */ + lsrs a32Val3, a32Val3, #15 /* a32Val3 >> 15 */ + + muls a32Val1, a32Val1, a32Mult2 /* a32Val1 = a32Mult1.L * a32Mult2.H */ + muls a32Val2, a32Val2, a32Mult1 /* a32Val2 = a32Mult2.L * a32Mult1.H */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val1 */ + + lsls a32Val2, a32Val2, #1 /* a32Val2 << 1 */ + adds a32Val2, a32Val2, a32Val3 /* a32Val2 = a32Val2 + a32Val3 */ + + muls a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + lsls a32Mult1, a32Mult1, #17 /* a32Mult1 << 17 */ + adds a32Mult1, a32Mult1, a32Val2 /* a32Mult1 = a32Mult1 + a32Val2 */ + rsbs a32Mult1, a32Mult1, #0 }; /* Negation */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n\t" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n\t" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n\t" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n\t" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #15 \n\t" /* a32Val3 >> 15 */ + + "muls %2, %2, %1 \n\t" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n\t" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsls %3, %3, #1 \n\t" /* a32Val2 << 1 */ + "adds %3, %3, %4 \n\t" /* a32Val2 = a32Val2 + a32Val3 */ + + "muls %0, %0, %1 \n\t" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "lsls %0, %0, #17 \n\t" /* a32Mult1 << 17 */ + "adds %0, %0, %3 \n\t" /* a32Mult1 = a32Mult1 + a32Val2 */ + "rsbs %0, %0, #0 \n\t" /* Negation */ + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #15 \n" /* a32Val3 >> 15 */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + + "lsls %3, %3, #1 \n" /* a32Val2 << 1 */ + "adds %3, %3, %4 \n" /* a32Val2 = a32Val2 + a32Val3 */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "lsls %0, %0, #17 \n" /* a32Mult1 << 17 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + "rsbs %0, %0, #0 \n" /* Negation */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #endif + + return a32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* Output = a32Mult1 * a32Mult2 +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_MulNegSat_A32_FAsmi(register acc32_t a32Mult1, register acc32_t a32Mult2) +{ + register acc32_t a32Val1=0, a32Val2=0, a32Val3=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ uxth a32Val1, a32Mult1 /* a32Val1 = a32Mult1.L */ + uxth a32Val2, a32Mult2 /* a32Val2 = a32Mult2.L */ + + asrs a32Mult1, a32Mult1, #16 /* a32Mult1 = a32Mult1.H */ + asrs a32Mult2, a32Mult2, #16 /* a32Mult2 = a32Mult2.H */ + + movs a32Val3, a32Val1 /* a32Val3 = a32Mult1.L */ + muls a32Val3, a32Val3, a32Val2 /* a32Val3 = a32Mult1.L * a32Mult2.L */ + lsrs a32Val3, a32Val3, #16 /* a32Val3 >> 16 */ + + muls a32Val1, a32Val1, a32Mult2 /* a32Val1 = a32Mult1.L * a32Mult2.H */ + muls a32Val2, a32Val2, a32Mult1 /* a32Val2 = a32Mult2.L * a32Mult1.H */ + adds a32Val2, a32Val2, a32Val1 /* a32Val2 = a32Val2 + a32Val1 */ + adds a32Val2, a32Val2, a32Val3 /* a32Val2 = a32Val2 + a32Val3 */ + + asrs a32Val3, a32Val2, #16 /* a32Val3 = a32Val2 >> 16 */ + uxth a32Val2, a32Val2 /* Clears higher 16 bits */ + + muls a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + adds a32Mult1, a32Mult1, a32Val3 /* a32Mult1 = a32Mult1 + a32Val3 */ + + asrs a32Val1, a32Mult1, #14 /* a32Val1 = higher 18 bits of multiplication */ + asrs a32Mult2, a32Mult1, #31 /* a32Mult2 = sign of multiplication */ + cmp a32Val1, a32Mult2 /* Compares a32Val1 and a32Val2 */ + bne MLIB_MulNegSat_A32_Sat /* If a32Val1 != a32Mult2, then goes to the MLIB_MulNegSat_A32_Sat */ + + lsls a32Mult1, a32Mult1, #16 /* a32Mult1 << 16 */ + adds a32Mult1, a32Mult1, a32Val2 /* a32Mult1 = a32Mult1 + a32Val2 */ + lsls a32Mult1, a32Mult1, #1 /* Result << 1 */ + b MLIB_MulNegSat_A32_End /* Goes to the MLIB_MulNegSat_A32_End*/ + + MLIB_MulNegSat_A32_Sat: + movs a32Mult1, #0x80 /* a32Mult1 = 0x80 */ + lsls a32Mult1, a32Mult1, #24 /* a32Mult1 = 0x80000000 */ + subs a32Mult1, a32Mult1, a32Mult2 /* a32Mult1 = 0x80000000 - Sign of result */ + + MLIB_MulNegSat_A32_End: + rsbs a32Mult1, a32Mult1, #0 }; /* a32Mult1 = - a32Mult1 */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "uxth %2, %0 \n\t" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n\t" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n\t" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n\t" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n\t" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n\t" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #16 \n\t" /* a32Val3 >> 16 */ + + "muls %2, %2, %1 \n\t" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n\t" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n\t" /* a32Val2 = a32Val2 + a32Val1 */ + "adds %3, %3, %4 \n\t" /* a32Val2 = a32Val2 + a32Val3 */ + + "asrs %4, %3, #16 \n\t" /* a32Val3 = a32Val2 >> 16 */ + "uxth %3, %3 \n\t" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n\t" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %4 \n\t" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "asrs %2, %0, #14 \n\t" /* a32Val1 = higher 18 bits of multiplication */ + "asrs %1, %0, #31 \n\t" /* a32Mult2 = sign of multiplication */ + "cmp %2, %1 \n\t" /* Compares a32Val1 and a32Val2 */ + "bne MLIB_MulNegSat_A32_Sat%= \n\t" /* If a32Val1 != a32Mult2, then goes to the MLIB_MulNegSat_A32_Sat */ + + "lsls %0, %0, #16 \n\t" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n\t" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n\t" /* Result << 1 */ + "b MLIB_MulNegSat_A32_End%= \n\t" /* Goes to the MLIB_MulNegSat_A32_End*/ + + "MLIB_MulNegSat_A32_Sat%=: \n\t" + "movs %0, #0x80 \n\t" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n\t" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, %1 \n\t" /* a32Mult1 = 0x80000000 - Sign of result */ + + "MLIB_MulNegSat_A32_End%=: \n\t" + "rsbs %0, %0, #0 \n\t" /* a32Mult1 = - a32Mult1 */ + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "uxth %2, %0 \n" /* a32Val1 = a32Mult1.L */ + "uxth %3, %1 \n" /* a32Val2 = a32Mult2.L */ + + "asrs %0, %0, #16 \n" /* a32Mult1 = a32Mult1.H */ + "asrs %1, %1, #16 \n" /* a32Mult2 = a32Mult2.H */ + + "movs %4, %2 \n" /* a32Val3 = a32Mult1.L */ + "muls %4, %4, %3 \n" /* a32Val3 = a32Mult1.L * a32Mult2.L */ + "lsrs %4, %4, #16 \n" /* a32Val3 >> 16 */ + + "muls %2, %2, %1 \n" /* a32Val1 = a32Mult1.L * a32Mult2.H */ + "muls %3, %3, %0 \n" /* a32Val2 = a32Mult2.L * a32Mult1.H */ + "adds %3, %3, %2 \n" /* a32Val2 = a32Val2 + a32Val1 */ + "adds %3, %3, %4 \n" /* a32Val2 = a32Val2 + a32Val3 */ + + "asrs %4, %3, #16 \n" /* a32Val3 = a32Val2 >> 16 */ + "uxth %3, %3 \n" /* Clears higher 16 bits */ + + "muls %0, %0, %1 \n" /* a32Mult1 = a32Mult1.H * a32Mult2.H */ + "adds %0, %0, %4 \n" /* a32Mult1 = a32Mult1 + a32Val3 */ + + "asrs %2, %0, #14 \n" /* a32Val1 = higher 18 bits of multiplication */ + "asrs %1, %0, #31 \n" /* a32Mult2 = sign of multiplication */ + "cmp %2, %1 \n" /* Compares a32Val1 and a32Val2 */ + "bne MLIB_MulNegSat_A32_Sat \n" /* If a32Val1 != a32Mult2, then goes to the MLIB_MulNegSat_A32_Sat */ + + "lsls %0, %0, #16 \n" /* a32Mult1 << 16 */ + "adds %0, %0, %3 \n" /* a32Mult1 = a32Mult1 + a32Val2 */ + "lsls %0, %0, #1 \n" /* Result << 1 */ + "b MLIB_MulNegSat_A32_End \n" /* Goes to the MLIB_MulNegSat_A32_End*/ + + "MLIB_MulNegSat_A32_Sat: \n" + "movs %0, #0x80 \n" /* a32Mult1 = 0x80 */ + "lsls %0, %0, #24 \n" /* a32Mult1 = 0x80000000 */ + "subs %0, %0, %1 \n" /* a32Mult1 = 0x80000000 - Sign of result */ + + "MLIB_MulNegSat_A32_End: \n" + "rsbs %0, %0, #0 \n" /* a32Mult1 = - a32Mult1 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Mult1), "+l"(a32Mult2), "+l"(a32Val1), "+l"(a32Val2), "+l"(a32Val3):); + #endif + + return a32Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* f16Out = - a32Accum * f16Mult +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MulNegSat_F16as_FAsmi(register acc32_t a32Accum, register frac16_t f16Mult) +{ + register frac32_t f32Val=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult, f16Mult /* Converts 16-bit input to 32-bit */ + uxth f32Val, a32Accum /* f32Val = a32Accum.L */ + asrs a32Accum, a32Accum, #16 /* a32Accum = a32Accum.H */ + + muls f32Val, f32Val, f16Mult /* f32Val = a32Accum.L * f16Mult */ + asrs f32Val, f32Val, #15 /* f32Val = a32Accum.L * f16Mult >> 15 */ + + muls f16Mult, f16Mult, a32Accum /* f16Mult = a32Accum.H * f16Mult */ + lsls f16Mult, f16Mult, #1 /* f16Mult << 1 */ + adds f16Mult, f16Mult, f32Val /* f16Mult = f16Mult + f32Val */ + + rsbs f16Mult, f16Mult, #0 /* Negation */ + + movs f32Val, #128 /* f32Val = 0x80 */ + lsls f32Val, f32Val, #8 /* f32Val = 0x8000 */ + + cmp f32Val, f16Mult /* Compares f16Mult with 0x8000 */ + bge NegTest /* If f16Mult < 0x8000, then goes to NegTest */ + subs f16Mult, f32Val, #1 /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f32Val, f32Val /* f32Val = 0xFFFF8000 */ + cmp f32Val, f16Mult /* Compares f16Mult with 0xFFFF8000 */ + ble SatEnd /* If f16Mult >= 0xFFFF8000, then goes to SatEnd */ + mov f16Mult, f32Val /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "uxth %2, %1 \n\t" /* f32Val = a32Accum.L */ + "asrs %1, %1, #16 \n\t" /* a32Accum = a32Accum.H */ + + "muls %2, %2, %0 \n\t" /* f32Val = a32Accum.L * f16Mult */ + "asrs %2, %2, #15 \n\t" /* f32Val = a32Accum.L * f16Mult >> 15 */ + + "muls %0, %0, %1 \n\t" /* f16Mult = a32Accum.H * f16Mult */ + "lsls %0, %0, #1 \n\t" /* f16Mult << 1 */ + "adds %0, %0, %2 \n\t" /* f16Mult = f16Mult + f32Val */ + + "rsbs %0, %0, #0 \n\t" /* Negation */ + + "movs %2, #128 \n\t" /* f32Val = 0x80 */ + "lsls %2, %2, #8 \n\t" /* f32Val = 0x8000 */ + + "cmp %2, %0 \n\t" /* Compares f16Mult with 0x8000 */ + "bge MLIB_MulNegSat_F16as_NegTest%= \n\t" /* If f16Mult < 0x8000, then jumps through two commands */ + "subs %0, %2, #1 \n\t" /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + "b MLIB_MulNegSat_F16as_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_MulNegSat_F16as_NegTest%=: \n\t" + "sxth %2, %2 \n\t" /* f32Val = 0xFFFF8000 */ + "cmp %2, %0 \n\t" /* Compares f16Mult with 0xFFFF8000 */ + "ble MLIB_MulNegSat_F16as_SatEnd%= \n\t" /* If f16Mult >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %2 \n\t" /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + "MLIB_MulNegSat_F16as_SatEnd%=: \n\t" + : "+l"(f16Mult), "+l"(a32Accum), "+l"(f32Val):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "uxth %2, %1 \n" /* f32Val = a32Accum.L */ + "asrs %1, %1, #16 \n" /* a32Accum = a32Accum.H */ + + "muls %2, %2, %0 \n" /* f32Val = a32Accum.L * f16Mult */ + "asrs %2, %2, #15 \n" /* f32Val = a32Accum.L * f16Mult >> 15 */ + + "muls %0, %0, %1 \n" /* f16Mult = a32Accum.H * f16Mult */ + "lsls %0, %0, #1 \n" /* f16Mult << 1 */ + "adds %0, %0, %2 \n" /* f16Mult = f16Mult + f32Val */ + + "rsbs %0, %0, #0 \n" /* Negation */ + + "movs %2, #128 \n" /* f32Val = 0x80 */ + "lsls %2, %2, #8 \n" /* f32Val = 0x8000 */ + + "cmp %2, %0 \n" /* Compares f16Mult with 0x8000 */ + "bge .+6 \n" /* If f16Mult < 0x8000, then jumps through two commands */ + "subs %0, %2, #1 \n" /* If f16Mult >= 0x8000, then f16Mult = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + + "sxth %2, %2 \n" /* f32Val = 0xFFFF8000 */ + "cmp %2, %0 \n" /* Compares f16Mult with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Mult >= 0xFFFF8000, then jumps through next commands */ + "mov %0, %2 \n" /* If f16Mult < 0xFFFF8000, then f16Mult = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Mult), "+l"(a32Accum), "+l"(f32Val):); + #endif + return f16Mult; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif +/******************************************************************************/ + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MUL_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F16.h new file mode 100644 index 0000000..43852bd --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F16.h @@ -0,0 +1,78 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply +* +*******************************************************************************/ +#ifndef _MLIB_MUL_F16_H_ +#define _MLIB_MUL_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mul_F16_Ci(f16Mult1, f16Mult2) MLIB_Mul_F16_FCi(f16Mult1, f16Mult2) +#define MLIB_MulNeg_F16_Ci(f16Mult1, f16Mult2) MLIB_MulNeg_F16_FCi(f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f16Out = f16Mult1 * f16Mult2 +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Mul_F16_FCi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + return(frac16_t)MLIB_ShR_F32_Ci((int32_t)f16Mult1 * (int32_t)f16Mult2, 15U); +} + +/***************************************************************************//*! +* +* f16Out = f16Mult1 * f16Mult2 +* +*******************************************************************************/ +static inline frac16_t MLIB_MulNeg_F16_FCi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + return(frac16_t)MLIB_ShR_F32_Ci((int32_t)f16Mult1 * (int32_t)(-f16Mult2), 15U); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MUL_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F16_Asmi.h new file mode 100644 index 0000000..2bf1814 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F16_Asmi.h @@ -0,0 +1,111 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply +* +*******************************************************************************/ +#ifndef _MLIB_MUL_F16_ASM_H_ +#define _MLIB_MUL_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MulSat_F16_Asmi(f16Mult1, f16Mult2) MLIB_MulSat_F16_FAsmi(f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* Output = f16Mult1 * f16Mult2 +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_MulSat_F16_FAsmi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register frac32_t f32SatVal = 0x8000; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f16Mult1, f16Mult1, f16Mult2 /* f16Mult1 * f16Mult2 */ + asrs f16Mult1, f16Mult1, #15 /* f16Mult1 >> 15 */ + cmp f16Mult1, f32SatVal /* Compares f16Mult1 with 0x8000*/ + bne NotSat /* If f16Mult1 <> 0x8000, then jumps through next command */ + subs f16Mult1, f16Mult1, #1 /* If f16Mult1 = 0x8000, then f16Mult1 = 0x7FFF */ + NotSat: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %0, %0, %1 \n\t" /* f16Mult1 * f16Mult2 */ + "asrs %0, %0, #15 \n\t" /* f16Mult1 >> 15 */ + "cmp %0, %2 \n\t" /* Compares f16Mult1 with 0x8000*/ + "bne MLIB_MulSat_F16_NotSat%= \n\t" /* If f16Mult1 <> 0x8000, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* If f16Mult1 = 0x8000, then f16Mult1 = 0x7FFF */ + "MLIB_MulSat_F16_NotSat%=: \n\t" + : "+l"(f16Mult1), "+l"(f16Mult2): "l"(f32SatVal)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "muls %0, %0, %1 \n" /* f16Mult1 * f16Mult2 */ + "asrs %0, %0, #15 \n" /* f16Mult1 >> 15 */ + "cmp %0, %2 \n" /* Compares f16Mult1 with 0x8000*/ + "bne .+4 \n" /* If f16Mult1 <> 0x8000, then jumps through next command */ + "subs %0, %0, #1 \n" /* If f16Mult1 = 0x8000, then f16Mult1 = 0x7FFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Mult1), "+l"(f16Mult2): "l"(f32SatVal)); + #endif + + return f16Mult1; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MUL_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F32.h new file mode 100644 index 0000000..d8ae3f1 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F32.h @@ -0,0 +1,137 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply +* +*******************************************************************************/ +#ifndef _MLIB_MUL_F32_H_ +#define _MLIB_MUL_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Shift_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Mul_F32_Ci(f32Mult1, f32Mult2) MLIB_Mul_F32_FCi(f32Mult1, f32Mult2) +#define MLIB_Mul_F32ss_Ci(f16Mult1, f16Mult2) MLIB_Mul_F32ss_FCi(f16Mult1, f16Mult2) +#define MLIB_MulSat_F32_Ci(f32Mult1, f32Mult2) MLIB_MulSat_F32_FCi(f32Mult1, f32Mult2) +#define MLIB_MulSat_F32ss_Ci(f16Mult1, f16Mult2) MLIB_MulSat_F32ss_FCi(f16Mult1, f16Mult2) +#define MLIB_MulNeg_F32_Ci(f32Mult1, f32Mult2) MLIB_MulNeg_F32_FCi(f32Mult1, f32Mult2) +#define MLIB_MulNeg_F32ss_Ci(f16Mult1, f16Mult2) MLIB_MulNeg_F32ss_FCi(f16Mult1, f16Mult2) + +/***************************************************************************//*! +* +* f32Out = f32Mult1 * f32Mult2 +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_Mul_F32_FCi(register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac64_t f64Temp; + register uint64_t u64Temp; + + f64Temp = (frac64_t)f32Mult1 * f32Mult2; + u64Temp = (uint64_t)f64Temp >> 31U; /* Misra compliance signed shift using unsigned type*/ + if (f64Temp < 0) /* to compensate unsigned shift error with signed type need to */ + { u64Temp -= 0x200000000U;} /* subtract the value 2^(data type bits number - shifted value) */ + return (frac32_t)u64Temp; /* cast back the corrected values */ +} + +/***************************************************************************//*! +* +* f32Out = f16Mult1 * f16Mult2 +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_Mul_F32ss_FCi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + return(frac32_t) MLIB_Sh1L_F32_Ci((int32_t)f16Mult1 * (int32_t)f16Mult2); +} +/***************************************************************************//*! +* +* f32Out = f32Mult1 * f32Mult2 +* With saturation +*******************************************************************************/ +static inline frac32_t MLIB_MulSat_F32_FCi(register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register int32_t i32Temp; + + i32Temp = (int32_t)(MLIB_Mul_F32_Ci(f32Mult1, f32Mult2)); + i32Temp = (i32Temp == INT32_MIN) ? INT32_MAX : i32Temp; + return((frac32_t)(i32Temp)); +} +/***************************************************************************//*! +* +* f32Out = f16Mult1 * f16Mult2 +* With saturation +*******************************************************************************/ +static inline frac32_t MLIB_MulSat_F32ss_FCi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register int32_t i32Temp; + + i32Temp = (int32_t)(MLIB_Mul_F32ss_Ci(f16Mult1, f16Mult2)); + i32Temp = (i32Temp == INT32_MIN) ? INT32_MAX : i32Temp; + return((frac32_t)(i32Temp)); +} +/***************************************************************************//*! +* +* f32Out = f32Mult1 * -f32Mult2 +* +*******************************************************************************/ +static inline frac32_t MLIB_MulNeg_F32_FCi(register frac32_t f32Mult1, register frac32_t f32Mult2) +{ + register frac32_t f32Temp; + + f32Temp = (frac32_t)(MLIB_Mul_F32_Ci(f32Mult1, f32Mult2)); + return(-f32Temp); +} +/***************************************************************************//*! +* +* f32Out = f16Mult1 * -f16Mult2 +* +*******************************************************************************/ +static inline frac32_t MLIB_MulNeg_F32ss_FCi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + return(frac32_t)(MLIB_Sh1L_F32_Ci((int32_t)f16Mult1 * (int32_t)(-f16Mult2))); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MUL_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F32_Asmi.h new file mode 100644 index 0000000..94b6a11 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Mul_F32_Asmi.h @@ -0,0 +1,117 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Multiply +* +*******************************************************************************/ +#ifndef _MLIB_MUL_F32_ASM_H_ +#define _MLIB_MUL_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_MulSat_F32ss_Asmi(f32Mult1, f32Mult2) MLIB_MulSat_F32ss_FAsmi(f32Mult1, f32Mult2) + +/***************************************************************************//*! +* +* f32Out = f16Mult1 * f16Mult2 +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_MulSat_F32ss_FAsmi(register frac16_t f16Mult1, register frac16_t f16Mult2) +{ + register frac32_t f32Out=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Mult1, f16Mult1 /* Converts 16-bit input to 32-bit */ + sxth f16Mult2, f16Mult2 /* Converts 16-bit input to 32-bit */ + muls f32Out, f16Mult1, f16Mult2 /* f32Out = f16Mult1 * f16Mult2 */ + lsls f32Out, f32Out, #1 /* f32Out << 1 (fractional multiplication) */ + movs f16Mult2, #128 /* f16Mult2 = 0x80 */ + rev f16Mult2, f16Mult2 /* f16Mult2 = 0x80000000 */ + cmp f32Out, f16Mult2 /* Compares f32Out with 0x80000000*/ + bne NotSat /* If f32Out <> 0x80000000, then jumps through next command */ + subs f32Out, f32Out, #1 /* If f32Out = 0x80000000, then f32Out = 0x7FFFFFFF */ + NotSat: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %2, %2 \n\t" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n\t" /* Converts 16-bit input to 32-bit */ + "muls %2, %2, %1 \n\t" /* f16Mult2 = f16Mult1 * f16Mult2 */ + "lsls %0, %2, #1 \n\t" /* f32Out = f16Mult2 << 1 (fractional multiplication) */ + "movs %1, #128 \n\t" /* f16Mult1 = 0x80 */ + "rev %1, %1 \n\t" /* f16Mult1 = 0x80000000 */ + "cmp %0, %1 \n\t" /* Compares f32Out with 0x80000000*/ + "bne MLIB_MulSat_F32ss_NotSat%= \n\t" /* If f32Out <> 0x80000000, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* If f32Out = 0x80000000, then f16Mult1 = 0x7FFFFFFF */ + "MLIB_MulSat_F32ss_NotSat%=: \n\t" + : "=&l"(f32Out), "+l"(f16Mult1), "+l"(f16Mult2):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %2, %2 \n" /* Converts 16-bit input to 32-bit */ + "sxth %1, %1 \n" /* Converts 16-bit input to 32-bit */ + "muls %2, %2, %1 \n" /* f16Mult2 = f16Mult1 * f16Mult2 */ + "lsls %0, %2, #1 \n" /* f32Out = f16Mult2 << 1 (fractional multiplication) */ + "movs %1, #128 \n" /* f16Mult1 = 0x80 */ + "rev %1, %1 \n" /* f16Mult1 = 0x80000000 */ + "cmp %0, %1 \n" /* Compares f32Out with 0x80000000*/ + "bne .+4 \n" /* If f32Out <> 0x80000000, then jumps through next command */ + "subs %0, %0, #1 \n" /* If f32Out = 0x80000000, then f16Mult1 = 0x7FFFFFFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "=&l"(f32Out), "+l"(f16Mult1), "+l"(f16Mult2):); + #endif + + return f32Out; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_MUL_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F16.h new file mode 100644 index 0000000..91d6094 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F16.h @@ -0,0 +1,67 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Negation +* +*******************************************************************************/ +#ifndef _MLIB_NEG_F16_H_ +#define _MLIB_NEG_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Neg_F16_Ci(f16Val) MLIB_Neg_F16_FCi(f16Val) + +/***************************************************************************//*! +* +* f16Out = -f16Val +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Neg_F16_FCi(register frac16_t f16Val) +{ + return((frac16_t)(-f16Val)); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_NEG_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F16_Asmi.h new file mode 100644 index 0000000..4bf0357 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F16_Asmi.h @@ -0,0 +1,105 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Negation +* +*******************************************************************************/ +#ifndef _MLIB_NEG_F16_ASM_H_ +#define _MLIB_NEG_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_NegSat_F16_Asmi(f16Val) MLIB_NegSat_F16_FAsmi(f16Val) + +/***************************************************************************//*! +* +* Output = -f16Val +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_NegSat_F16_FAsmi(register frac16_t f16Val) +{ + register frac32_t f32SatVal = 0x8000; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Val, f16Val /* Transforms 16-bit input f16Val to 32-bit */ + rsbs f16Val, f16Val, #0 /* f16Val = - f16Val */ + cmp f16Val, f32SatVal /* Compares f16Val with 0x00008000 */ + bne SatEnd /* If f32Val != 0x8000, then goes to SatEnd */ + subs f16Val, f16Val, #1 /* Compares f16Val with 0x00008000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Transforms 16-bit input f16Val to 32-bit */ + "rsbs %0, %0, #0 \n\t" /* f16Val = - f16Val */ + "cmp %0, %1 \n\t" /* Compares f16Val with 0x00008000 */ + "bne MLIB_NegSat_F16_SatEnd%= \n\t" /* If f32Val != 0x8000, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* Compares f16Val with 0x00008000 */ + "MLIB_NegSat_F16_SatEnd%=: \n\t" + : "+l"(f16Val): "l"(f32SatVal)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Transforms 16-bit input f16Val to 32-bit */ + "rsbs %0, %0, #0 \n" /* f16Val = - f16Val */ + "cmp %0, %1 \n" /* Compares f16Val with 0x00008000 */ + "bne .+4 \n" /* If f32Val != 0x8000, then jumps through next command */ + "subs %0, %0, #1 \n" /* Compares f16Val with 0x00008000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Val): "l"(f32SatVal)); + #endif + + return f16Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_NEG_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F32.h new file mode 100644 index 0000000..34561c9 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F32.h @@ -0,0 +1,80 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Negation +* +*******************************************************************************/ +#ifndef _MLIB_NEG_F32_H_ +#define _MLIB_NEG_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Neg_F32_Ci(f32Val) MLIB_Neg_F32_FCi(f32Val) +#define MLIB_NegSat_F32_Ci(f32Val) MLIB_NegSat_F32_FCi(f32Val) + +/***************************************************************************//*! +* +* f32Out = -f32Val +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_Neg_F32_FCi(register frac32_t f32Val) +{ + return((frac32_t)(-f32Val)); +} +/***************************************************************************//*! +* +* f32Out = -f32Val +* With saturation +*******************************************************************************/ +static inline frac32_t MLIB_NegSat_F32_FCi(register frac32_t f32Val) +{ + register int32_t i32Out; + + i32Out = (int32_t)(MLIB_Neg_F32_Ci(f32Val)); + i32Out = (i32Out == INT32_MIN) ? INT32_MAX : i32Out; + return((frac32_t)(i32Out)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_NEG_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F32_Asmi.h new file mode 100644 index 0000000..a33e0b7 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Neg_F32_Asmi.h @@ -0,0 +1,112 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Negation +* +*******************************************************************************/ +#ifndef _MLIB_NEG_F32_ASM_H_ +#define _MLIB_NEG_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_NegSat_F32_Asmi(f32Val) MLIB_NegSat_F32_FAsmi(f32Val) + +/***************************************************************************//*! +* +* Output = -f32Val +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_NegSat_F32_FAsmi(register frac32_t f32Val) +{ + register frac32_t f32SatVal=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ rev f32SatVal, f32Val /* f32SatVal = byte-reverse of f32Val*/ + rsbs f32Val, f32Val, #0 /* f32Val = - f32Val */ + cmp f32SatVal, #128 /* Compares f32SatVal with 0x80 */ + bne SatEnd /* If f32SatVal != 0x80, then goes to SatEnd */ + subs f32Val, f32Val, #1 /* If f32SatVal = 0x80, then f32Val = f32Val - 1 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "rev %1, %0 \n\t" /* f32SatVal = byte-reverse of f32Val*/ + "rsbs %0, %0, #0 \n\t" /* f32Val = - f32Val */ + "cmp %1, #128 \n\t" /* Compares f32SatVal with 0x80 */ + "bne MLIB_NegSat_F32_SatEnd%= \n\t" /* If f32SatVal != 0x80, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* If f32SatVal = 0x80, then f32Val = f32Val - 1 */ + "MLIB_NegSat_F32_SatEnd%=: \n\t" + : "+l"(f32Val), "+l"(f32SatVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "rev %1, %0 \n" /* f32SatVal = byte-reverse of f32Val*/ + "rsbs %0, %0, #0 \n" /* f32Val = - f32Val */ + "cmp %1, #128 \n" /* Compares f32SatVal with 0x80 */ + "bne .+4 \n" /* If f32SatVal != 0x80, then jumps through next command */ + "subs %0, %0, #1 \n" /* If f32SatVal = 0x80, then f32Val = f32Val - 1 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(f32SatVal):); + #endif + + return f32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_NEG_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rcp1Q_A32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rcp1Q_A32_Asm.h new file mode 100644 index 0000000..282ceb3 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rcp1Q_A32_Asm.h @@ -0,0 +1,64 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Reciprocal value +* +*******************************************************************************/ +#ifndef _MLIB_RCP1Q_A32_ASM_H_ +#define _MLIB_RCP1Q_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Rcp1Q1_A32s_Asm(f16Denom) MLIB_Rcp1Q1_A32s_FAsm(f16Denom) +#define MLIB_Rcp1Q_A32s_Asm(f16Denom) MLIB_Rcp1Q_A32s_FAsm(f16Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern acc32_t MLIB_Rcp1Q1_A32s_FAsm(register frac16_t f16Denom); +extern acc32_t MLIB_Rcp1Q_A32s_FAsm(register frac16_t f16Denom); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_RCP1Q_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_RcpHw1Q_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_RcpHw1Q_A32_Asmi.h new file mode 100644 index 0000000..dee4a16 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_RcpHw1Q_A32_Asmi.h @@ -0,0 +1,183 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Reciprocal value +* +*******************************************************************************/ +#ifndef _MLIB_RCPHW1Q_A32_ASM_H_ +#define _MLIB_RCPHW1Q_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_RcpHw1Q1_A32s_Asmi(f16Denom) MLIB_RcpHw1Q_A32s_FAsmi(f16Denom) +#define MLIB_RcpHw1Q_A32s_Asmi(f16Denom) MLIB_RcpHw1Q_A32s_FAsmi(f16Denom) + +/******************************************************************************* +* @brief 16-bit input 32-output 16-bit precision one quadrant reciprocal +* function +* +* @param in frac16_t f16Denom +* - Denominator in <0;1) in frac16_t +* @return This function returns +* acc32_t value [1;65536.0) +* +* @remarks This function calculates the multiplicative inverse value of +* the fractional input: +* result = FRAC16(1) / f16Denom. The function calculates +* the result with 16-bit division precision. +* If the denominator is 0, the output is 0x7FFF FFFF. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_RcpHw1Q_A32s_FAsmi(register frac16_t f16Denom) +{ + register acc32_t a32Result = 0x7FFFFFFF; + register frac32_t f32BasePtr = (frac32_t)0xF0004000U; + register frac32_t f32Num = 0x40000000; + register frac32_t f32Temp1=0, f32Temp2=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Denom, f16Denom /* Converts 16 input to 32-bit value */ + cmp f16Denom, #0 /* Compares Denominator with 0 */ + beq RcpHw1Q_A32s_End /* If Denominator = 0, then goes to RcpHw1Q_A32s_End */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + RcpHw1Q_A32s_Recount: + adds f32Temp2, f32Temp1, #1 /* f32Temp2 = gu16CntMmdvsq + 1 */ + strh f32Temp2, [&gu16CntMmdvsq] /* gu16CntMmdvsq = f32Temp2 */ + movs f32Temp1, #0 /* f32TestVal = 0 */ + str f32Temp1, [f32BasePtr, #8] /* MMDVSQ_CSR = 0x00000000 */ + str f32Num, [f32BasePtr] /* MMDVSQ_DEND = f32Num */ + str f16Denom, [f32BasePtr, #4] /* MMDVSQ_DSOR = f16Denom */ + ldr a32Result, [f32BasePtr, #12] /* a32Result = MMDVSQ_RES */ + ldrh f32Temp1, [&gu16CntMmdvsq] /* f32Temp1 = gu16CntMmdvsq */ + cmp f32Temp1, f32Temp2 /* Compares f32Temp1 and f32Temp2 */ + bne RcpHw1Q_A32s_Recount /* If f32Temp1 != f32Temp2, then goes to RcpHw1Q_A32s_Recount */ + RcpHw1Q_A32s_End: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Converts 16 input to 32-bit value */ + "cmp %0, #0 \n\t" /* Compares Denominator with 0 */ + "beq MLIB_RcpHw1Q_A32s_End%= \n\t" /* If Denominator = 0, then goes to RcpHw1Q_A32s_End */ + "ldrh %2, [%4] \n\t" /* f32Temp1 = gu16CntMmdvsq */ + "MLIB_RcpHw1Q_A32s_Recount%=: \n\t" + "adds %3, %2, #1 \n\t" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %3, [%4] \n\t" /* gu16CntMmdvsq = f32Temp2 */ + "movs %2, #0 \n\t" /* f32TestVal = 0 */ + "str %2, [%5, #8] \n\t" /* MMDVSQ_CSR = 0x00000000 */ + "str %6, [%5] \n\t" /* MMDVSQ_DEND = f32Num */ + "str %0, [%5, #4] \n\t" /* MMDVSQ_DSOR = f16Denom */ + "ldr %1, [%5, #12] \n\t" /* f16Result = MMDVSQ_RES */ + "ldrh %2, [%4] \n\t" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %2, %3 \n\t" /* Compares f32Temp1 and f32Temp2 */ + "bne MLIB_RcpHw1Q_A32s_Recount%= \n\t" /* If f32Temp1 != f32Temp2, then goes to RcpHw1Q_A32s_Recount */ + "MLIB_RcpHw1Q_A32s_End%=: \n\t" + : "+l"(f16Denom), "+l"(a32Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr), "l"(f32Num):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16 input to 32-bit value */ + "cmp %0, #0 \n" /* Compares Denominator with 0 */ + "beq MLIB_RcpHw1Q_A32s_FAsmi_End%= \n" /* If Denominator = 0, then goes to RcpHw1Q_A32s_End */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "RcpHw1Q_A32s_Recount%=: \n" + "adds %3, %2, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %3, [%4] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %2, #0 \n" /* f32TestVal = 0 */ + "str %2, [%5, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %6, [%5] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%5, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %1, [%5, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %2, %3 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne RcpHw1Q_A32s_Recount%= \n" /* If f32Temp1 != f32Temp2, then goes to RcpHw1Q_A32s_Recount */ + "MLIB_RcpHw1Q_A32s_FAsmi_End%=: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Denom), "+l"(a32Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr), "l"(f32Num):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Converts 16 input to 32-bit value */ + "cmp %0, #0 \n" /* Compares Denominator with 0 */ + "beq MLIB_RcpHw1Q_A32s_FAsmi_End \n" /* If Denominator = 0, then goes to RcpHw1Q_A32s_End */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "RcpHw1Q_A32s_Recount: \n" + "adds %3, %2, #1 \n" /* f32Temp2 = gu16CntMmdvsq + 1 */ + "strh %3, [%4] \n" /* gu16CntMmdvsq = f32Temp2 */ + "movs %2, #0 \n" /* f32TestVal = 0 */ + "str %2, [%5, #8] \n" /* MMDVSQ_CSR = 0x00000000 */ + "str %6, [%5] \n" /* MMDVSQ_DEND = f32Num */ + "str %0, [%5, #4] \n" /* MMDVSQ_DSOR = f16Denom */ + "ldr %1, [%5, #12] \n" /* f16Result = MMDVSQ_RES */ + "ldrh %2, [%4] \n" /* f32Temp1 = gu16CntMmdvsq */ + "cmp %2, %3 \n" /* Compares f32Temp1 and f32Temp2 */ + "bne RcpHw1Q_A32s_Recount \n" /* If f32Temp1 != f32Temp2, then goes to RcpHw1Q_A32s_Recount */ + "MLIB_RcpHw1Q_A32s_FAsmi_End: \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Denom), "+l"(a32Result), "+l"(f32Temp1), "+l"(f32Temp2): "l"(&gu16CntMmdvsq), "l"(f32BasePtr), "l"(f32Num):); + #endif + return a32Result; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_RCPHW1Q_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_RcpHw_A32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_RcpHw_A32_Asm.h new file mode 100644 index 0000000..852ce9a --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_RcpHw_A32_Asm.h @@ -0,0 +1,63 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Reciprocal value +* +*******************************************************************************/ +#ifndef _MLIB_RCPHW_A32_ASM_H_ +#define _MLIB_RCPHW_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_RcpHw1_A32s_Asm(f16Denom) MLIB_RcpHw_A32s_FAsm(f16Denom, &gu16CntMmdvsq) +#define MLIB_RcpHw_A32s_Asm(f16Denom) MLIB_RcpHw_A32s_FAsm(f16Denom, &gu16CntMmdvsq) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern acc32_t MLIB_RcpHw_A32s_FAsm(register frac16_t f16Denom, const volatile uint16_t *pVal); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_RCPHW_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rcp_A32_Asm.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rcp_A32_Asm.h new file mode 100644 index 0000000..d3ef03c --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rcp_A32_Asm.h @@ -0,0 +1,64 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Reciprocal value +* +*******************************************************************************/ +#ifndef _MLIB_RCP_A32_ASM_H_ +#define _MLIB_RCP_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Rcp1_A32s_Asm(f16Denom) MLIB_Rcp1_A32s_FAsm(f16Denom) +#define MLIB_Rcp_A32s_Asm(f16Denom) MLIB_Rcp_A32s_FAsm(f16Denom) + +/******************************************************************************* +* Exported function prototypes +*******************************************************************************/ +extern acc32_t MLIB_Rcp1_A32s_FAsm(register frac16_t f16Denom); +extern acc32_t MLIB_Rcp_A32s_FAsm(register frac16_t f16Denom); + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_RCP_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rnd_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rnd_F32.h new file mode 100644 index 0000000..698e145 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rnd_F32.h @@ -0,0 +1,69 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Rounding +* +*******************************************************************************/ +#ifndef _MLIB_RND_F32_H_ +#define _MLIB_RND_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Add_F32.h" +#include "MLIB_Conv_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Rnd_F16l_Ci(f32Val) MLIB_Rnd_F16l_FCi(f32Val) + +/***************************************************************************//*! +* +* Converts 32-bit number into 16-bit with rounding +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Rnd_F16l_FCi(register frac32_t f32Val) +{ + return(frac16_t)MLIB_Conv_F16l_Ci(MLIB_Add_F32_Ci(f32Val, (frac32_t)0x00008000)); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_RND_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rnd_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rnd_F32_Asmi.h new file mode 100644 index 0000000..997f47e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Rnd_F32_Asmi.h @@ -0,0 +1,133 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Rounding +* +*******************************************************************************/ +#ifndef _MLIB_RND_F32_ASM_H_ +#define _MLIB_RND_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Add_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_RndSat_F16l_Asmi(f32Val) MLIB_RndSat_F16l_FAsmi(f32Val) + +/***************************************************************************//*! +* +* Converts 32-bit number into 16-bit with rounding +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_RndSat_F16l_FAsmi(register frac32_t f32Val) +{ + register frac32_t f32Rnd = 0x80; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ asrs f32Val, f32Val, #8 /* f32Val >> 8 */ + adds f32Val, f32Val, f32Rnd /* f32Val = f32Val + 0x80 */ + lsls f32Rnd, f32Rnd, #8 /* f32Rnd = 0x00008000 */ + asrs f32Val, f32Val, #8 /* f32Val >> 8 */ + + cmp f32Val, f32Rnd /* Compares f32Val with 0x00008000 */ + bge NegTest /* If f32Val <= 0x8000, then goes to NegTest */ + subs f32Rnd, f32Val, #1 /* If f32Val > 0x8000, then f32Val = 0x7FFF */ + b SatEnd /* Go to SatEnd */ + NegTest: + mvns f32Val, f32Val /* f32Rnd = 0xFFFF7FFF */ + cmp f32Val, f32Rnd /* Compares f32Val with 0xFFFF7FFF */ + ble SatEnd /* If f32Val >= 0xFFFF7FFF, then goes to SatEnd */ + adds f32Rnd, f32Val, #1 /* If f32Val < 0xFFFF7FFF, then f32Val = 0xFFFF8000 */ + SatEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "asrs %0,%0, #8 \n\t" /* f32Val >> 8 */ + "adds %0, %0, %1 \n\t" /* f32Val = f32Val + 0x80 */ + "lsls %1, %1, #8 \n\t" /* f32Rnd = 0x00008000 */ + "asrs %0, %0, #8 \n\t" /* f32Val >> 8 */ + + "cmp %0, %1 \n\t" /* Compares f32Val with 0x00008000 */ + "bge MLIB_RndSat_F16l_NegTest%= \n\t" /* If f32Val <= 0x8000, then jumps through two commands */ + "subs %1, %0, #1 \n\t" /* If f32Val > 0x8000, then f32Val = 0x7FFF */ + "b MLIB_RndSat_F16l_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_RndSat_F16l_NegTest%=: \n\t" + "mvns %0, %0 \n\t" /* f32Rnd = 0xFFFF7FFF */ + "cmp %0, %1 \n\t" /* Compares f32Val with 0xFFFF7FFF */ + "ble MLIB_RndSat_F16l_SatEnd%= \n\t" /* If f32Val >= 0xFFFF7FFF, then jumps through next commands */ + "adds %1, %0, #1 \n\t" /* If f32Val < 0xFFFF7FFF, then f32Val = 0xFFFF8000 */ + "MLIB_RndSat_F16l_SatEnd%=: \n\t" + : "+l"(f32Val), "+l"(f32Rnd):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "asrs %0,%0, #8 \n" /* f32Val >> 8 */ + "adds %0, %0, %1 \n" /* f32Val = f32Val + 0x80 */ + "lsls %1, %1, #8 \n" /* f32Rnd = 0x00008000 */ + "asrs %0, %0, #8 \n" /* f32Val >> 8 */ + + "cmp %0, %1 \n" /* Compares f32Val with 0x00008000 */ + "bge .+6 \n" /* If f32Val <= 0x8000, then jumps through two commands */ + "subs %1, %0, #1 \n" /* If f32Val > 0x8000, then f32Val = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + "mvns %0, %0 \n" /* f32Rnd = 0xFFFF7FFF */ + "cmp %0, %1 \n" /* Compares f32Val with 0xFFFF7FFF */ + "ble .+4 \n" /* If f32Val >= 0xFFFF7FFF, then jumps through next commands */ + "adds %1, %0, #1 \n" /* If f32Val < 0xFFFF7FFF, then f32Val = 0xFFFF8000 */ + + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(f32Rnd):); + #endif + + return (frac16_t)f32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_RND_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sat_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sat_A32.h new file mode 100644 index 0000000..980f6c4 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sat_A32.h @@ -0,0 +1,72 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Saturation +* +*******************************************************************************/ +#ifndef _MLIB_SAT_A32_H_ +#define _MLIB_SAT_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sat_F16a_Ci(a32Accum) MLIB_Sat_F16a_FCi(a32Accum) + +/***************************************************************************//*! +* +* Takes the fractional part from number in accumulator format and +* saturate if the original number is greater than 1. +* +*******************************************************************************/ +static inline frac16_t MLIB_Sat_F16a_FCi(register acc32_t a32Accum) +{ + register int32_t i32z; + i32z = (int32_t)(a32Accum); + + i32z = (i32z > ((int32_t)(INT16_MAX))) ? ((int32_t)(INT16_MAX)) : i32z; + i32z = (i32z < ((int32_t)(INT16_MIN))) ? ((int32_t)(INT16_MIN)) : i32z; + return ((frac16_t)(i32z)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SAT_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sat_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sat_A32_Asmi.h new file mode 100644 index 0000000..7c03690 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sat_A32_Asmi.h @@ -0,0 +1,134 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Saturation +* +*******************************************************************************/ +#ifndef _MLIB_SAT_A32_ASM_H_ +#define _MLIB_SAT_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sat_F16a_Asmi(a32Accum) MLIB_Sat_F16a_FAsmi(a32Accum) + +/***************************************************************************//*! +* +* Takes the fractional part from number in accumulator format and saturate if the original number is greater than 1. +* +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_Sat_F16a_FAsmi(register acc32_t a32Accum) +{ + register frac16_t f16Val=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Val, a32Accum /* Takes fractional part */ + cmp f16Val, a32Accum /* Compares a32Accum and f16Val */ + beq SatEnd /* If a32Accum != f16Val, then saturates output */ + movs f16Val, #0x80 /* f16Val = 0x80 */ + lsls f16Val, f16Val, #8 /* f16Val = 0x8000 */ + subs f16Val, #1 /* f16Val = 0x7FFF */ + asrs a32Accum, a32Accum, #31 /* a32Accum >> 31 */ + subs f16Val, f16Val, a32Accum /* f16Val = 0x7FFF - a32Accum */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %1 \n\t" /* Takes fractional part */ + "cmp %0, %1 \n\t" /* Compares a32Accum and f16Val */ + "beq MLIB_Sat_F16a_SatEnd%= \n\t" /* If a32Accum != f16Val, then saturates output */ + "movs %0, #0x80 \n\t" /* f16Val = 0x80 */ + "lsls %0, %0, #8 \n\t" /* f16Val = 0x8000 */ + "subs %0, #1 \n\t" /* f16Val = 0x7FFF */ + "asrs %1, %1, #31 \n\t" /* a32Accum >> 31 */ + "subs %0, %0, %1 \n\t" /* f16Val = 0x7FFF - a32Accum */ + "MLIB_Sat_F16a_SatEnd%=:" + :"=&l"(f16Val), "+l"(a32Accum):); + #elif defined(__GNUC__) + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %1 \n" /* Takes fractional part */ + "cmp %0, %1 \n" /* Compares a32Accum and f16Val */ + "beq SatEnd%= \n" /* If a32Accum != f16Val, then saturates output */ + "movs %0, #0x80 \n" /* f16Val = 0x80 */ + "lsls %0, %0, #8 \n" /* f16Val = 0x8000 */ + "subs %0, #1 \n" /* f16Val = 0x7FFF */ + "asrs %1, %1, #31 \n" /* a32Accum >> 31 */ + "subs %0, %0, %1 \n" /* f16Val = 0x7FFF - a32Accum */ + "SatEnd%=:" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + :"=&l"(f16Val), "+l"(a32Accum):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %1 \n" /* Takes fractional part */ + "cmp %0, %1 \n" /* Compares a32Accum and f16Val */ + "beq SatEnd \n" /* If a32Accum != f16Val, then saturates output */ + "movs %0, #0x80 \n" /* f16Val = 0x80 */ + "lsls %0, %0, #8 \n" /* f16Val = 0x8000 */ + "subs %0, #1 \n" /* f16Val = 0x7FFF */ + "asrs %1, %1, #31 \n" /* a32Accum >> 31 */ + "subs %0, %0, %1 \n" /* f16Val = 0x7FFF - a32Accum */ + "SatEnd:" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + :"=&l"(f16Val), "+l"(a32Accum):); + #endif + + return (frac16_t)f16Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SAT_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F16.h new file mode 100644 index 0000000..76b5105 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F16.h @@ -0,0 +1,107 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Shift +* +*******************************************************************************/ +#ifndef _MLIB_SHIFT_F16_H_ +#define _MLIB_SHIFT_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sh1L_F16_Ci(f16Val) MLIB_Sh1L_F16_FCi(f16Val) +#define MLIB_Sh1R_F16_Ci(f16Val) MLIB_Sh1R_F16_FCi(f16Val) +#define MLIB_Sh1R_F16_Ci(f16Val) MLIB_Sh1R_F16_FCi(f16Val) +#define MLIB_ShL_F16_Ci(f16Val, u16Sh) MLIB_ShL_F16_FCi(f16Val, u16Sh) +#define MLIB_ShR_F16_Ci(f16Val, u16Sh) MLIB_ShR_F16_FCi(f16Val, u16Sh) + +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by 1 to the left. +* The function does not saturate the output. +* +*******************************************************************************/ +static inline frac16_t MLIB_Sh1L_F16_FCi(register frac16_t f16Val) +{ + register uint32_t ui32temp = (uint32_t)f16Val << 1U; + return (frac16_t)ui32temp; +} + +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by 1 to the right. +* +*******************************************************************************/ +static inline frac16_t MLIB_Sh1R_F16_FCi(register frac16_t f16Val) +{ + register uint32_t ui32temp = (uint32_t)f16Val >> 1U; + return (frac16_t)ui32temp; +} + +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by the number of u16Sh to the left. +* The function does not saturate the output. +* +*******************************************************************************/ +static inline frac16_t MLIB_ShL_F16_FCi(register frac16_t f16Val, register uint16_t u16Sh) +{ + register uint32_t ui32temp = (uint32_t)f16Val << u16Sh; + return (frac16_t)ui32temp; +} + +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by the number of u16Sh to the right. +* +*******************************************************************************/ +static inline frac16_t MLIB_ShR_F16_FCi(register frac16_t f16Val, register uint16_t u16Sh) +{ + register uint32_t ui32temp = (uint32_t)f16Val >> u16Sh; + return (frac16_t)ui32temp; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SHIFT_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F16_Asmi.h new file mode 100644 index 0000000..9114f23 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F16_Asmi.h @@ -0,0 +1,232 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Shift +* +*******************************************************************************/ +#ifndef _MLIB_SHIFT_F16_ASM_H_ +#define _MLIB_SHIFT_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sh1LSat_F16_Asmi(f16Val) MLIB_Sh1LSat_F16_FAsmi(f16Val) +#define MLIB_ShLSat_F16_Asmi(f16Val, u16Sh) MLIB_ShLSat_F16_FAsmi(f16Val, u16Sh) + +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by 1 to the left. +* The function saturates the output. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_Sh1LSat_F16_FAsmi(register frac16_t f16Val) +{ + register frac16_t f16TestVal=0, f16Out=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Val, f16Val /* Transforms 16-bit input f16Val to 32-bit */ + mov f16TestVal, f16Val /* f16TestVal = f16Val */ + lsls f16Out, f16Val, #1 /* f16Out = f16Val << 1 */ + sxth f16Out, f16Out /* Transforms 16-bit value to 32-bit */ + eors f16Val, f16Val, f16Out /* f16Val = f16Val ^ f16Out */ + bpl SatEnd /* If f16Val >= 0, then goes to SatEnd */ + movs f16Out, #128 /* f16Out = 0x80 */ + lsls f16Out, f16Out, #8 /* f16Out = 0x00008000 */ + cmp f16TestVal, #0 /* Compares input value with 0 */ + blt SatEnd /* If f16TestVal < 0, then goes to SatEnd */ + subs f16Out, f16Out, #1 /* Else f16Out = 0x00007FFF*/ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Transforms 16-bit input f16Val to 32-bit */ + "mov %2, %1 \n\t" /* f16TestVal = f16Val */ + "lsls %0, %1, #1 \n\t" /* f16Out = f16Val << 1 */ + "sxth %0, %0 \n\t" /* Transforms 16-bit value to 32-bit */ + "eors %1, %1, %0 \n\t" /* f16Val = f16Val ^ f16Out */ + "bpl MLIB_Sh1LSat_F16_SatEnd%= \n\t" /* If f16Val >= 0, then jumps to the end of function */ + "movs %0, #128 \n\t" /* f16Out = 0x80 */ + "lsls %0, %0, #8 \n\t" /* f16Out = 0x00008000 */ + "cmp %2, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_Sh1LSat_F16_SatEnd%= \n\t" /* If f16TestVal < 0, then jumps through next command */ + "subs %0, %0, #1 \n\t" /* Else f16Out = 0x00007FFF */ + "MLIB_Sh1LSat_F16_SatEnd%=: \n\t" + : "+l"(f16Out), "+l"(f16Val), "+l"(f16TestVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Transforms 16-bit input f16Val to 32-bit */ + "mov %2, %1 \n" /* f16TestVal = f16Val */ + "lsls %0, %1, #1 \n" /* f16Out = f16Val << 1 */ + "sxth %0, %0 \n" /* Transforms 16-bit value to 32-bit */ + "eors %1, %1, %0 \n" /* f16Val = f16Val ^ f16Out */ + "bpl .+12 \n" /* If f16Val >= 0, then jumps to the end of function */ + "movs %0, #128 \n" /* f16Out = 0x80 */ + "lsls %0, %0, #8 \n" /* f16Out = 0x00008000 */ + "cmp %2, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f16TestVal < 0, then jumps through next command */ + "subs %0, %0, #1 \n" /* Else f16Out = 0x00007FFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Out), "+l"(f16Val), "+l"(f16TestVal):); + #endif + + return f16Out; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* This function returns the f16Val input shifted by the number of u16Sh to the left. +* The function saturates the output. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_ShLSat_F16_FAsmi(register frac16_t f16Val, register uint16_t u16Sh) +{ + register frac16_t f16SatVal=0, f16CmpVal=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Val, f16Val /* Transforms 16-bit input f16Val to 32-bit */ + movs f16SatVal, #128 /* f16SatVal = 0x80 */ + lsls f16SatVal, f16SatVal, #8 /* f16SatVal = 0x00008000 */ + mov f16CmpVal, f16SatVal /* f16CmpVal = 0x00008000 */ + lsrs f16CmpVal, f16CmpVal, u16Sh /* f16CmpVal = f16CmpVal >> u16Sh */ + + cmp f16Val, f16CmpVal /* Compares f16Val with (0x00008000 >> u16Sh) */ + blt NegTest /* If f16Val <= f16CmpVal, then jumps through two commands */ + subs f16Val, f16SatVal, #1 /* f16Val = 0x7FFF */ + b SatEnd + NegTest: + mvns f16CmpVal, f16SatVal /* f16CmpVal = 0xFFFF7FFF */ + asrs f16CmpVal, f16CmpVal, u16Sh /* f16CmpVal = f16CmpVal >> u16Sh */ + + cmp f16Val, f16CmpVal /* Compares f16Val with (0xFFFF7FFF >> u16Sh) */ + bgt NotSat /* If f16Val < f16CmpVal, then jumps through two commands */ + sxth f16Val, f16SatVal /* f16Val = 0xFFFF8000 */ + b SatEnd + NotSat: + lsls f16Val, f16Val, u16Sh /* f16CmpVal = f16CmpVal << u16Sh */ + SatEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %0, %0 \n\t" /* Transforms 16-bit input f16Val to 32-bit */ + "movs %3, #128 \n\t" /* f16SatVal = 0x80 */ + "lsls %3, %3, #8 \n\t" /* f16SatVal = 0x00008000 */ + "mov %2, %3 \n\t" /* f16CmpVal = 0x00008000 */ + "lsrs %2, %2, %1 \n\t" /* f16CmpVal = f16CmpVal >> u16Sh */ + "cmp %0, %2 \n\t" /* Compares f16Val with (0x00008000 >> u16Sh) */ + "blt MLIB_ShLSat_F16_NegTest%= \n\t" /* If f16Val < f16CmpVal, then jumps through two commands */ + "subs %0, %3, #1 \n\t" /* f16Val = 0x7FFF */ + "b MLIB_ShLSat_F16_SatEnd%= \n\t" + "MLIB_ShLSat_F16_NegTest%=:\n\t" + "mvns %2, %3 \n\t" /* f16CmpVal = 0xFFFF7FFF */ + "asrs %2, %2, %1 \n\t" /* f16CmpVal = f16CmpVal >> u16Sh */ + "cmp %0, %2 \n\t" /* Compares f16Val with (0xFFFF7FFF >> u16Sh) */ + "bgt MLIB_ShLSat_F16_NotSat%= \n\t" /* If f16Val < f16CmpVal, then jumps through two commands */ + "sxth %0, %3 \n\t" /* f16Val = 0xFFFF8000 */ + "b MLIB_ShLSat_F16_SatEnd%= \n\t" + "MLIB_ShLSat_F16_NotSat%=:\n\t" + "lsls %0, %0, %1 \n\t" /* f16CmpVal = f16CmpVal << u16Sh */ + "MLIB_ShLSat_F16_SatEnd%=:\n\t" + : "+l"(f16Val), "+l"(u16Sh), "+l"(f16CmpVal), "+l"(f16SatVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %0, %0 \n" /* Transforms 16-bit input f16Val to 32-bit */ + "movs %3, #128 \n" /* f16SatVal = 0x80 */ + "lsls %3, %3, #8 \n" /* f16SatVal = 0x00008000 */ + "mov %2, %3 \n" /* f16CmpVal = 0x00008000 */ + "lsrs %2, %2, %1 \n" /* f16CmpVal = f16CmpVal >> u16Sh */ + + "cmp %0, %2 \n" /* Compares f16Val with (0x00008000 >> u16Sh) */ + "blt .+6 \n" /* If f16Val < f16CmpVal, then jumps through two commands */ + "subs %0, %3, #1 \n" /* f16Val = 0x7FFF */ + "b .+16 \n" + + "mvns %2, %3 \n" /* f16CmpVal = 0xFFFF7FFF */ + "asrs %2, %2, %1 \n" /* f16CmpVal = f16CmpVal >> u16Sh */ + + "cmp %0, %2 \n" /* Compares f16Val with (0xFFFF7FFF >> u16Sh) */ + "bgt .+6 \n" /* If f16Val < f16CmpVal, then jumps through two commands */ + "sxth %0, %3 \n" /* f16Val = 0xFFFF8000 */ + "b .+4 \n" + "lsls %0, %0, %1 \n" /* f16CmpVal = f16CmpVal << u16Sh */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Val), "+l"(u16Sh), "+l"(f16CmpVal), "+l"(f16SatVal):); + #endif + + return f16Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SHIFT_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F32.h new file mode 100644 index 0000000..919d131 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F32.h @@ -0,0 +1,133 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Shift +* +*******************************************************************************/ +#ifndef _MLIB_SHIFT_F32_H_ +#define _MLIB_SHIFT_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sh1L_F32_Ci(f32Val) MLIB_Sh1L_F32_FCi(f32Val) +#define MLIB_Sh1R_F32_Ci(f32Val) MLIB_Sh1R_F32_FCi(f32Val) +#define MLIB_ShL_F32_Ci(f32Val, u16Sh) MLIB_ShL_F32_FCi(f32Val, u16Sh) +#define MLIB_ShR_F32_Ci(f32Val, u16Sh) MLIB_ShR_F32_FCi(f32Val, u16Sh) +#define MLIB_ShLSat_F32_Ci(f32Val, u16Sh) MLIB_ShLSat_F32_FCi(f32Val, u16Sh) + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by 1 to the left. +* The function does not saturate the output. +* +*******************************************************************************/ +static inline frac32_t MLIB_Sh1L_F32_FCi(register frac32_t f32Val) +{ + register uint64_t ui64temp = (uint64_t)f32Val << 1U; + return (frac32_t)ui64temp; +} + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by 1 to the right. +* +*******************************************************************************/ +static inline frac32_t MLIB_Sh1R_F32_FCi(register frac32_t f32Val) +{ + register uint64_t ui64temp = (uint64_t)f32Val >> 1U; + return (frac32_t)ui64temp; +} + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by the number of u16Sh to the left. +* The function does not saturate the output. +* +*******************************************************************************/ +static inline frac32_t MLIB_ShL_F32_FCi(register frac32_t f32Val, register uint16_t u16Sh) +{ + register uint64_t ui64temp = (uint64_t)f32Val << u16Sh; + return (frac32_t)ui64temp; +} + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by the number of u16Sh to the right. +* +*******************************************************************************/ +static inline frac32_t MLIB_ShR_F32_FCi(register frac32_t f32Val, register uint16_t u16Sh) +{ + register uint64_t ui64temp = (uint64_t)f32Val >> u16Sh; + return (frac32_t)ui64temp; +} + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by the number of u16Sh to the left. +* The function saturates the output. +* +*******************************************************************************/ +static inline frac32_t MLIB_ShLSat_F32_FCi(register frac32_t f32Val, register uint16_t u16Sh) +{ + register frac32_t f32Temp, f32Out; + + f32Out = MLIB_ShL_F32_Ci(f32Val, u16Sh); + f32Temp = MLIB_ShR_F32_Ci(INT32_MAX, u16Sh); + if(f32Val > f32Temp) + { + f32Out = (frac32_t)(INT32_MAX); + } + else + { + f32Temp = MLIB_ShR_F32_Ci(INT32_MIN, u16Sh); + if(f32Val <= f32Temp) + { + f32Out = (frac32_t)(INT32_MIN); + } + } + return(f32Out); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SHIFT_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F32_Asmi.h new file mode 100644 index 0000000..be0caba --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Shift_F32_Asmi.h @@ -0,0 +1,225 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Shift +* +*******************************************************************************/ +#ifndef _MLIB_SHIFT_F32_ASM_H_ +#define _MLIB_SHIFT_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sh1LSat_F32_Asmi(f32Val) MLIB_Sh1LSat_F32_FAsmi(f32Val) +#define MLIB_ShLSat_F32_Asmi(f32Val, u16Sh) MLIB_ShLSat_F32_FAsmi(f32Val, u16Sh) + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by 1 to the left. +* The function saturates the output. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_Sh1LSat_F32_FAsmi(register frac32_t f32Val) +{ + register frac32_t f32TestVal=0, f32Out=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ mov f32TestVal, f32Val /* f32TestVal = f32Val */ + lsls f32Out, f32Val, #1 /* f32Out = f32Val << 1 */ + eors f32Val, f32Val, f32Out /* f32Val = f32Val ^ f32Out */ + bpl SatEnd /* If f32Val >= 0, then goes to SatEnd*/ + movs f32Out, #128 /* f32Out = 0x80 */ + rev f32Out, f32Out /* f32Out = 0x80000000 */ + cmp f32TestVal, #0 /* Compares input value with 0 */ + blt SatEnd /* If f32TestVal < 0, then goes to SatEnd */ + subs f32Out, f32Out, #1 /* Else f32Out = 0x00007FFF*/ + SatEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "mov %2, %1 \n\t" /* f32TestVal = f32Val */ + "lsls %0, %1, #1 \n\t" /* f32Out = f32Val << 1 */ + "eors %1, %1, %0 \n\t" /* f32Val = f32Val ^ f32Out */ + "bpl MLIB_Sh1LSat_F32_SatEnd%= \n\t" /* If f32Val >= 0, then jumps to the end of function*/ + "movs %0, #128 \n\t" /* f32Out = 0x80 */ + "rev %0, %0 \n\t" /* f32Out = 0x80000000 */ + "cmp %2, #0 \n\t" /* Compares input value with 0 */ + "blt MLIB_Sh1LSat_F32_SatEnd%= \n\t" /* If f32TestVal < 0, then jumps through next command */ + "subs %0, %0, #1 \n\t" + "MLIB_Sh1LSat_F32_SatEnd%=: \n\t" + : "=l"(f32Out), "+l"(f32Val), "+l"(f32TestVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "mov %2, %1 \n" /* f32TestVal = f32Val */ + "lsls %0, %1, #1 \n" /* f32Out = f32Val << 1 */ + "eors %1, %1, %0 \n" /* f32Val = f32Val ^ f32Out */ + "bpl .+12 \n" /* If f32Val >= 0, then jumps to the end of function*/ + "movs %0, #128 \n" /* f32Out = 0x80 */ + "rev %0, %0 \n" /* f32Out = 0x80000000 */ + "cmp %2, #0 \n" /* Compares input value with 0 */ + "blt .+4 \n" /* If f32TestVal < 0, then jumps through next command */ + "subs %0, %0, #1 \n" + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" /* Else f32Out = 0x00007FFF*/ + #endif + : "=l"(f32Out), "+l"(f32Val), "+l"(f32TestVal):); + #endif + + return f32Out; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +/***************************************************************************//*! +* +* This function returns the f32Val input shifted by the number of u16Sh to the left. +* The function saturates the output. +* +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_ShLSat_F32_FAsmi(register frac32_t f32Val, register uint16_t u16Sh) +{ + register frac32_t f32SatVal=0, f32CmpVal=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ movs f32SatVal, #128 /* f32SatVal = 0x80 */ + rev f32SatVal, f32SatVal /* f32SatVal = 0x80000000 */ + subs f32CmpVal, f32SatVal, #1 /* f32CmpVal = 0x7FFFFFFF */ + asrs f32CmpVal, f32CmpVal, u16Sh /* f32CmpVal = f32CmpVal >> u16Sh */ + + cmp f32Val, f32CmpVal /* Compares f32Val with (0x7FFFFFFF >> u16Sh) */ + ble NegTest /* If f32Val <= f32CmpVal, then goes to NegTest */ + subs f32Val, f32SatVal, #1 /* f32Val = 0x7FFFFFFF */ + b SatEnd + NegTest: + mov f32CmpVal, f32SatVal /* f32CmpVal = 0x80000000 */ + asrs f32CmpVal, f32CmpVal, u16Sh /* f32CmpVal = f32CmpVal >> u16Sh */ + + cmp f32Val, f32CmpVal /* Compares f32Val with (0x80000000 >> u16Sh) */ + bgt NotSat /* If f32Val <= f32CmpVal, then goes to NotSat */ + mov f32Val, f32SatVal /* f32Val = 0x80000000 */ + b SatEnd + NotSat: + lsls f32Val, f32Val, u16Sh /* f32CmpVal = f32CmpVal << u16Sh */ + SatEnd: } + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "movs %3, #128 \n\t" /* f32SatVal = 0x80 */ + "rev %3, %3 \n\t" /* f32SatVal = 0x80000000 */ + "subs %2, %3, #1 \n\t" /* f32CmpVal = 0x7FFFFFFF */ + "asrs %2, %2, %1 \n\t" /* f32CmpVal = f32CmpVal >> u16Sh */ + + "cmp %0, %2 \n\t" /* Compares f32Val with (0x7FFFFFFF >> u16Sh) */ + "ble MLIB_ShLSat_F32_NegTest%= \n\t" /* If f32Val <= f32CmpVal, then jumps through two commands */ + "subs %0, %3, #1 \n\t" /* f32Val = 0x7FFF */ + "b MLIB_ShLSat_F32_SatEnd%= \n\t" + "MLIB_ShLSat_F32_NegTest%=: \n\t" + "mov %2, %3 \n\t" /* f32CmpVal = 0x80000000 */ + "asrs %2, %2, %1 \n\t" /* f32CmpVal = f32CmpVal >> u16Sh */ + + "cmp %0, %2 \n\t" /* Compares f32Val with (0x80000000 >> u16Sh) */ + "bgt MLIB_ShLSat_F32_NotSat%= \n\t" /* If f32Val < f32CmpVal, then jumps through two commands */ + "mov %0, %3 \n\t" /* f32Val = 0x80000000 */ + "b MLIB_ShLSat_F32_SatEnd%= \n\t" + "MLIB_ShLSat_F32_NotSat%=: \n\t" + "lsls %0, %0, %1 \n\t" /* f32CmpVal = f32CmpVal << u16Sh */ + "MLIB_ShLSat_F32_SatEnd%=: \n\t" + : "+l"(f32Val), "+l"(u16Sh), "+l"(f32CmpVal), "+l"(f32SatVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "movs %3, #128 \n" /* f32SatVal = 0x80 */ + "rev %3, %3 \n" /* f32SatVal = 0x80000000 */ + "subs %2, %3, #1 \n" /* f32CmpVal = 0x7FFFFFFF */ + "asrs %2, %2, %1 \n" /* f32CmpVal = f32CmpVal >> u16Sh */ + + "cmp %0, %2 \n" /* Compares f32Val with (0x7FFFFFFF >> u16Sh) */ + "ble .+6 \n" /* If f32Val <= f32CmpVal, then jumps through two commands */ + "subs %0, %3, #1 \n" /* f32Val = 0x7FFF */ + "b .+16 \n" + + "mov %2, %3 \n" /* f32CmpVal = 0x80000000 */ + "asrs %2, %2, %1 \n" /* f32CmpVal = f32CmpVal >> u16Sh */ + + "cmp %0, %2 \n" /* Compares f32Val with (0x80000000 >> u16Sh) */ + "bgt .+6 \n" /* If f32Val < f32CmpVal, then jumps through two commands */ + "mov %0, %3 \n" /* f32Val = 0x80000000 */ + "b .+4 \n" + "lsls %0, %0, %1 \n" /* f32CmpVal = f32CmpVal << u16Sh */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(u16Sh), "+l"(f32CmpVal), "+l"(f32SatVal):); + #endif + + return f32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SHIFT_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sign_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sign_F16_Asmi.h new file mode 100644 index 0000000..07bcb7e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sign_F16_Asmi.h @@ -0,0 +1,112 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Sign +* +*******************************************************************************/ +#ifndef _MLIB_SIGN_F16_ASM_H_ +#define _MLIB_SIGN_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sign_F16_Asmi(f16Val) MLIB_Sign_F16_FAsmi(f16Val) + +/***************************************************************************//*! +* This function returns the sign of the argument: +* f16Val = 0: returns 0 +* f16Val > 0: returns 32767 (fractional 1.0) +* f16Val < 0: returns -32768 (fractional -1.0) +* +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_Sign_F16_FAsmi(register frac16_t f16Val) +{ + register frac16_t f16SigVal = (frac16_t)0x8000U; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ lsls f16Val, f16Val, #16 /* f16Val << 16 */ + bpl Next /* If f16Val >= 0, then goes to Next */ + sxth f16Val, f16SigVal /* If f16Val < 0, then f16Val = 0xFFFF8000 */ + b SignEnd /* Goes to SignEnd */ + Next: + beq SignEnd /* If f16Val = 0, then goes to SignEnd */ + subs f16Val, f16SigVal, #1 /* If f16Val > 0, then f16Val = 0x00007FFF */ + SignEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "lsls %0, %0, #16 \n\t" /* f16Val << 16 */ + "bpl MLIB_Sign_F16_Next%= \n\t" /* If f16Val >= 0, then jumps through two commands */ + "sxth %0, %1 \n\t" /* If f16Val < 0, then f16Val = 0xFFFF8000 */ + "b MLIB_Sign_F16_SignEnd%= \n\t" /* Jumps to the end of function */ + "MLIB_Sign_F16_Next%=: \n\t" + "beq MLIB_Sign_F16_SignEnd%= \n\t" /* If f16Val = 0, then jumps through next command */ + "subs %0, %1, #1 \n\t" /* If f16Val > 0, then f16Val = 0x00007FFF */ + "MLIB_Sign_F16_SignEnd%=: \n\t" + : "+l"(f16Val): "l"(f16SigVal)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "lsls %0, %0, #16 \n" /* f16Val << 16 */ + "bpl .+6 \n" /* If f16Val >= 0, then jumps through two commands */ + "sxth %0, %1 \n" /* If f16Val < 0, then f16Val = 0xFFFF8000 */ + "b .+6 \n" /* Jumps to the end of function */ + "beq .+4 \n" /* If f16Val = 0, then jumps through next command */ + "subs %0, %1, #1 \n" /* If f16Val > 0, then f16Val = 0x00007FFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Val): "l"(f16SigVal)); + #endif + + return f16Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SIGN_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sign_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sign_F32_Asmi.h new file mode 100644 index 0000000..cfd8c72 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sign_F32_Asmi.h @@ -0,0 +1,112 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Sign +* +*******************************************************************************/ +#ifndef _MLIB_SIGN_F32_ASM_H_ +#define _MLIB_SIGN_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sign_F32_Asmi(f32Val) MLIB_Sign_F32_FAsmi(f32Val) + +/***************************************************************************//*! +* This function returns the sign of the argument: +* f32Val = 0: returns 0 +* f32Val > 0: returns 2147483647 (fractional 1.0) +* f32Val < 0: returns -2147483648 (fractional -1.0) +* +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_Sign_F32_FAsmi(register frac32_t f32Val) +{ + register frac32_t f32SigVal = 0x80; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ cmp f32Val, #0 /* Compares f32Val with 0 */ + bge Next /* If f32Val >= 0, then goes to Next */ + rev f32Val, f32SigVal /* If f32Val < 0, then f32Val = 0x80000000 */ + Next: + ble SignEnd /* If f32Val = 0, then goes to SignEnd */ + rev f32Val, f32SigVal /* If f32Val > 0, then f32Val = 0x80000000 */ + subs f32Val, f32Val, #1 /* f32Val = f32Val - 1 */ + SignEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "cmp %0, #0 \n\t" /* Compares f32Val with 0 */ + "bge MLIB_Sign_F32_Next%= \n\t" /* If f32Val >= 0, then jumps through next command */ + "rev %0, %1 \n\t" /* If f32Val < 0, then f32Val = 0x80000000 */ + "MLIB_Sign_F32_Next%=: \n\t" + "ble MLIB_Sign_F32_SignEnd%= \n\t" /* If f32Val = 0, then jumps through next command */ + "rev %0, %1 \n\t" /* If f32Val > 0, then f32Val = 0x80000000 */ + "subs %0, %0, #1 \n\t" /* f32Val = f32Val - 1 */ + "MLIB_Sign_F32_SignEnd%=: \n\t" + : "+l"(f32Val): "l"(f32SigVal)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "cmp %0, #0 \n" /* Compares f32Val with 0 */ + "bge .+4 \n" /* If f32Val >= 0, then jumps through next command */ + "rev %0, %1 \n" /* If f32Val < 0, then f32Val = 0x80000000 */ + "ble .+6 \n" /* If f32Val = 0, then jumps through next command */ + "rev %0, %1 \n" /* If f32Val > 0, then f32Val = 0x80000000 */ + "subs %0, %0, #1 \n" /* f32Val = f32Val - 1 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val): "l"(f32SigVal)); + #endif + + return f32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SIGN_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F16.h new file mode 100644 index 0000000..ea5ef0f --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F16.h @@ -0,0 +1,68 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction of three input values from the first input +* +*******************************************************************************/ +#ifndef _MLIB_SUB4_F16_H_ +#define _MLIB_SUB4_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sub4_F16_Ci(f16Min, f16Sub1, f16Sub2, f16Sub3) \ + MLIB_Sub4_F16_FCi(f16Min, f16Sub1, f16Sub2, f16Sub3) + +/***************************************************************************//*! +* Subtraction of three input values from the first input +* f16Out = f16Min + f16Sub1 + f16Sub2 + f16Sub3 +* function is not saturated +*******************************************************************************/ +static inline frac16_t MLIB_Sub4_F16_FCi(register frac16_t f16Min, register frac16_t f16Sub1, + register frac16_t f16Sub2,register frac16_t f16Sub3) +{ + return((frac16_t)(f16Min - f16Sub1 - f16Sub2 - f16Sub3)); +} +#if defined(__cplusplus) +} +#endif /* _MLIB_SUB4_F16_H_ */ + +#endif diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F16_Asmi.h new file mode 100644 index 0000000..2a23482 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F16_Asmi.h @@ -0,0 +1,144 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction of three input values from the first input +* +*******************************************************************************/ +#ifndef _MLIB_SUB4_F16_ASM_H_ +#define _MLIB_SUB4_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sub4Sat_F16_Asmi(f16Min, f16Sub1, f16Sub2, f16Sub3) \ + MLIB_Sub4Sat_F16_FAsmi(f16Min, f16Sub1, f16Sub2, f16Sub3) + +/***************************************************************************//*! +* Subtraction of three input values from the first input +* Output = f16Min - f16Sub1 - f16Sub2 - f16Sub3 +* function is saturated +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_Sub4Sat_F16_FAsmi(register frac16_t f16Min, register frac16_t f16Sub1, + register frac16_t f16Sub2, register frac16_t f16Sub3) +{ + register frac32_t f32Val = 0x8000; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Min, f16Min /* Transforms 16-bit input f16Min to 32-bit */ + sxth f16Sub1, f16Sub1 /* Transforms 16-bit input f16Sub1 to 32-bit */ + sxth f16Sub2, f16Sub2 /* Transforms 16-bit input f16Min to 32-bit */ + sxth f16Sub3, f16Sub3 /* Transforms 16-bit input f16Sub1 to 32-bit */ + subs f16Min, f16Min, f16Sub1 /* f16Min = f16Min - f16Sub1 */ + subs f16Min, f16Min, f16Sub2 /* f16Min = f16Min - f16Sub2 */ + subs f16Min, f16Min, f16Sub3 /* f16Min = f16Min - f16Sub3 */ + + cmp f32Val, f16Min /* Compares f16Min with 0x8000 */ + bgt NegTest /* If f16Min < 0x8000, then goes to NegTest */ + subs f16Min, f32Val, #1 /* If f16Min >= 0x8000, then f16Min = 0x8000 */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f32Val, f32Val /* f32Val = 0xFFFF8000 */ + cmp f32Val, f16Min /* Compares f16Min with 0xFFFF8000 */ + ble SatEnd /* If f16Min >= 0xFFFF8000, then goes to SatEnd */ + mov f16Min, f32Val /* If f16Min < 0xFFFF8000, then f16Min = 0xFFFF8000 */ + SatEnd: }; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Transforms 16-bit input f16Min to 32-bit */ + "sxth %2, %2 \n\t" /* Transforms 16-bit input f16Sub1 to 32-bit */ + "sxth %3, %3 \n\t" /* Transforms 16-bit input f16Min to 32-bit */ + "sxth %4, %4 \n\t" /* Transforms 16-bit input f16Sub1 to 32-bit */ + "subs %1, %1, %2 \n\t" /* f16Min = f16Min - f16Sub1 */ + "subs %1, %1, %3 \n\t" /* f16Min = f16Min - f16Sub2 */ + "subs %1, %1, %4 \n\t" /* f16Min = f16Min - f16Sub3 */ + + "cmp %0, %1 \n\t" /* Compares f16Min with 0x8000 */ + "bgt MLIB_SUB4_F16_NegTest%= \n\t" /* If f16Min < 0x8000, then jumps through two commands */ + "subs %1, %0, #1 \n\t" /* If f16Min >= 0x8000, then f16Min = 0x8000 */ + "b MLIB_SUB4_F16_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_SUB4_F16_NegTest%=: \n\t" + "sxth %0, %0 \n\t" /* f32Val = 0xFFFF8000 */ + "cmp %0, %1 \n\t" /* Compares f16Min with 0xFFFF8000 */ + "ble MLIB_SUB4_F16_SatEnd%= \n\t" /* If f16Min >= 0xFFFF8000, then jumps through next commands */ + "mov %1, %0 \n\t" /* If f16Min < 0xFFFF8000, then f16Min = 0xFFFF8000 */ + "MLIB_SUB4_F16_SatEnd%=: \n\t" + : "+l"(f32Val), "+l"(f16Min), "+l"(f16Sub1), "+l"(f16Sub2), "+l"(f16Sub3):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Transforms 16-bit input f16Min to 32-bit */ + "sxth %2, %2 \n" /* Transforms 16-bit input f16Sub1 to 32-bit */ + "sxth %3, %3 \n" /* Transforms 16-bit input f16Min to 32-bit */ + "sxth %4, %4 \n" /* Transforms 16-bit input f16Sub1 to 32-bit */ + "subs %1, %1, %2 \n" /* f16Min = f16Min - f16Sub1 */ + "subs %1, %1, %3 \n" /* f16Min = f16Min - f16Sub2 */ + "subs %1, %1, %4 \n" /* f16Min = f16Min - f16Sub3 */ + + "cmp %0, %1 \n" /* Compares f16Min with 0x8000 */ + "bgt .+6 \n" /* If f16Min < 0x8000, then jumps through two commands */ + "subs %1, %0, #1 \n" /* If f16Min >= 0x8000, then f16Min = 0x8000 */ + "b .+10 \n" /* Jumps through four commands */ + + "sxth %0, %0 \n" /* f32Val = 0xFFFF8000 */ + "cmp %0, %1 \n" /* Compares f16Min with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Min >= 0xFFFF8000, then jumps through next commands */ + "mov %1, %0 \n" /* If f16Min < 0xFFFF8000, then f16Min = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Val), "+l"(f16Min), "+l"(f16Sub1), "+l"(f16Sub2), "+l"(f16Sub3):); + #endif + + return f16Min; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif /* _MLIB_SUB4_F16_ASM_H_ */ + +#endif diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F32.h new file mode 100644 index 0000000..ae85951 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F32.h @@ -0,0 +1,69 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction of three input values from the first input +* +*******************************************************************************/ +#ifndef _MLIB_SUB4_F32_H_ +#define _MLIB_SUB4_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Conv_F32.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sub4_F32_Ci(f32Min, f32Sub1, f32Sub2, f32Sub3) \ + MLIB_Sub4_F32_FCi(f32Min, f32Sub1, f32Sub2, f32Sub3) + +/***************************************************************************//*! +* Subtraction of three input values from the first input +* f32Out = f32Min + f32Sub1 + f32Sub2 + f32Sub3 +* function is not saturated +*******************************************************************************/ +static inline frac32_t MLIB_Sub4_F32_FCi(register frac32_t f32Min, register frac32_t f32Sub1, + register frac32_t f32Sub2, register frac32_t f32Sub3) +{ + return((frac32_t)(f32Min - f32Sub1 - f32Sub2 - f32Sub3)); +} +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SUB4_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F32_Asmi.h new file mode 100644 index 0000000..d4fcff8 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub4_F32_Asmi.h @@ -0,0 +1,191 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction of three input values from the first input +* +*******************************************************************************/ +#ifndef _MLIB_SUB4_F32_ASM_H_ +#define _MLIB_SUB4_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sub4Sat_F32_Asmi(f32Min, f32Sub1, f32Sub2, f32Sub3) \ + MLIB_Sub4Sat_F32_FAsmi(f32Min, f32Sub1, f32Sub2, f32Sub3) + +/***************************************************************************//*! +* Subtraction of three input values from the first input +* Output = f32Min - f32Sub1 - f32Sub2 - f32Sub3 +* function is saturated +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_Sub4Sat_F32_FAsmi(register frac32_t f32Min, register frac32_t f32Sub1, + register frac32_t f32Sub2, register frac32_t f32Sub3) +{ + register frac32_t f32Val1=0, f32Val2=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ asrs f32Val1, f32Min, #31 /* f32Val1 = sign of f32Min */ + asrs f32Val2, f32Sub1, #31 /* f32Val2 = sign of f32Sub1 */ + + subs f32Min, f32Min, f32Sub1 /* f32Min = f32Min - f32Sub1 */ + sbcs f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 - f32Val2 - carry */ + + asrs f32Val2, f32Sub2, #31 /* f32Val2 = sign of f32Sub2 */ + subs f32Min, f32Min, f32Sub2 /* f32Min = f32Min - f32Sub2 */ + sbcs f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 - f32Val2 - carry */ + + asrs f32Val2, f32Sub3, #31 /* f32Val2 = sign of f32Sub3 */ + subs f32Min, f32Min, f32Sub3 /* f32Min = f32Min - f32Sub3 */ + sbcs f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 - f32Val2 - carry */ + + lsls f32Val1, f32Val1, #16 /* f32Val1 << 16 */ + lsrs f32Val2, f32Min, #16 /* f32Val2 = f32Min >> 16 */ + orrs f32Val1, f32Val1, f32Val2 /* f32Val1 = f32Val1 | f32Val2 */ + + movs f32Val2, #128 /* f32Val2 = 0x80 */ + lsls f32Val2, f32Val2, #8 /* f32Val2 = 0x8000 */ + cmp f32Val2, f32Val1 /* Compares f32Val1 with 0x00008000 */ + bgt NegTest /* If f32Val1 < 0x00008000, then goes to NegTest */ + lsls f32Min, f32Val2, #16 /* If f32Val1 >= 0x00008000, then f32Min = 0x80000000 */ + subs f32Min, f32Min, #1 /* f32Min = 0x7FFFFFFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + mvns f32Sub3, f32Val2 /* f32Sub3 = 0xFFFF7FFF */ + cmp f32Sub3, f32Val1 /* Compares f32Val1 with 0xFFFF7FFFF */ + blt SatEnd /* If f32Val1 > 0xFFFF7FFFF, then goes to SatEnd */ + lsls f32Min, f32Val2, #16 /* If f32Val1 <= 0xFFFF7FFFF, then f32Min = 0x80000000 */ + SatEnd: }; + + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "asrs %2, %0, #31 \n\t" /* f32Val1 = sign of f32Min */ + "asrs %3, %1, #31 \n\t" /* f32Val2 = sign of f32Sub1 */ + + "subs %0, %0, %1 \n\t" /* f32Min = f32Min - f32Sub1 */ + "sbcs %2, %2, %3 \n\t" /* f32Val1 = f32Val1 - f32Val2 - carry */ + + "asrs %3, %4, #31 \n\t" /* f32Val2 = sign of f32Sub2 */ + "subs %0, %0, %4 \n\t" /* f32Min = f32Min - f32Sub2 */ + "sbcs %2, %2, %3 \n\t" /* f32Val1 = f32Val1 - f32Val2 - carry */ + + "asrs %3, %5, #31 \n\t" /* f32Val2 = sign of f32Sub3 */ + "subs %0, %0, %5 \n\t" /* f32Min = f32Min - f32Sub3 */ + "sbcs %2, %2, %3 \n\t" /* f32Val1 = f32Val1 - f32Val2 - carry */ + + "lsls %2, %2, #16 \n\t" /* f32Val1 << 16 */ + "lsrs %3, %0, #16 \n\t" /* f32Val2 = f32Min >> 16 */ + "orrs %2, %2, %3 \n\t" /* f32Val1 = f32Val1 | f32Val2 */ + + "movs %3, #128 \n\t" /* f32Val2 = 0x80 */ + "lsls %3, %3, #8 \n\t" /* f32Val2 = 0x8000 */ + "cmp %3, %2 \n\t" /* Compares f32Val1 with 0x00008000 */ + "bgt MLIB_Sub4Sat_F32_NegTest%= \n\t" /* If f32Val1 < 0x00008000, then jumps through three commands */ + "lsls %0, %3, #16 \n\t" /* If f32Val1 >= 0x00008000, then f32Min = 0x80000000 */ + "subs %0, %0, #1 \n\t" /* f32Min = 0x7FFFFFFF */ + "b MLIB_Sub4Sat_F32_SatEnd%= \n\t" + "MLIB_Sub4Sat_F32_NegTest%=: \n\t" /* Jumps through four commands */ + "mvns %1, %3 \n\t" /* f32Sub1 = 0xFFFF7FFF */ + "cmp %1, %2 \n\t" /* Compares f32Val1 with 0xFFFF7FFFF */ + "blt MLIB_Sub4Sat_F32_SatEnd%= \n\t" /* If f32Val1 > 0xFFFF7FFFF, then jumps through next commands */ + "lsls %0, %3, #16 \n\t" /* If f32Val1 <= 0xFFFF7FFFF, then f32Min = 0x80000000 */ + "MLIB_Sub4Sat_F32_SatEnd%=: \n\t" + : "+l"(f32Min), "+l"(f32Sub1), "+l"(f32Val1), "+l"(f32Val2): "l"(f32Sub2), "l"(f32Sub3)); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "asrs %2, %0, #31 \n" /* f32Val1 = sign of f32Min */ + "asrs %3, %1, #31 \n" /* f32Val2 = sign of f32Sub1 */ + + "subs %0, %0, %1 \n" /* f32Min = f32Min - f32Sub1 */ + "sbcs %2, %2, %3 \n" /* f32Val1 = f32Val1 - f32Val2 - carry */ + + "asrs %3, %4, #31 \n" /* f32Val2 = sign of f32Sub2 */ + "subs %0, %0, %4 \n" /* f32Min = f32Min - f32Sub2 */ + "sbcs %2, %2, %3 \n" /* f32Val1 = f32Val1 - f32Val2 - carry */ + + "asrs %3, %5, #31 \n" /* f32Val2 = sign of f32Sub3 */ + "subs %0, %0, %5 \n" /* f32Min = f32Min - f32Sub3 */ + "sbcs %2, %2, %3 \n" /* f32Val1 = f32Val1 - f32Val2 - carry */ + + "lsls %2, %2, #16 \n" /* f32Val1 << 16 */ + "lsrs %3, %0, #16 \n" /* f32Val2 = f32Min >> 16 */ + "orrs %2, %2, %3 \n" /* f32Val1 = f32Val1 | f32Val2 */ + + "movs %3, #128 \n" /* f32Val2 = 0x80 */ + "lsls %3, %3, #8 \n" /* f32Val2 = 0x8000 */ + "cmp %3, %2 \n" /* Compares f32Val1 with 0x00008000 */ + "bgt .+8 \n" /* If f32Val1 < 0x00008000, then jumps through three commands */ + "lsls %0, %3, #16 \n" /* If f32Val1 >= 0x00008000, then f32Min = 0x80000000 */ + "subs %0, %0, #1 \n" /* f32Min = 0x7FFFFFFF */ + "b .+10 \n" /* Jumps through four commands */ + "mvns %1, %3 \n" /* f32Sub1 = 0xFFFF7FFF */ + "cmp %1, %2 \n" /* Compares f32Val1 with 0xFFFF7FFFF */ + "blt .+4 \n" /* If f32Val1 > 0xFFFF7FFFF, then jumps through next commands */ + "lsls %0, %3, #16 \n" /* If f32Val1 <= 0xFFFF7FFFF, then f32Min = 0x80000000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f32Min), "+l"(f32Sub1), "+l"(f32Val1), "+l"(f32Val2): "l"(f32Sub2), "l"(f32Sub3)); + #endif + + return f32Min; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SUB4_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_A32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_A32.h new file mode 100644 index 0000000..fdcb8b3 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_A32.h @@ -0,0 +1,78 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction +* +*******************************************************************************/ +#ifndef _MLIB_SUB_A32_H_ +#define _MLIB_SUB_A32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sub_A32ss_Ci(f16Min, f16Sub) MLIB_Sub_A32ss_FCi(f16Min, f16Sub) +#define MLIB_Sub_A32as_Ci(a32Accum, f16Sub) MLIB_Sub_A32as_FCi(a32Accum, f16Sub) + +/***************************************************************************//*! +* +* a32Out = f16Min - f16Sub +* +*******************************************************************************/ +static inline acc32_t MLIB_Sub_A32ss_FCi(register frac16_t f16Min, register frac16_t f16Sub) +{ + return((acc32_t)((acc32_t)f16Min - (acc32_t)f16Sub)); +} + +/***************************************************************************//*! +* +* a32Out = a32Accum - f16Sub +* +*******************************************************************************/ +static inline acc32_t MLIB_Sub_A32as_FCi(register acc32_t a32Accum, register frac16_t f16Sub) +{ + return ((acc32_t)((acc32_t)a32Accum -(acc32_t)f16Sub)); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SUB_A32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_A32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_A32_Asmi.h new file mode 100644 index 0000000..025dc14 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_A32_Asmi.h @@ -0,0 +1,134 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction +* +*******************************************************************************/ +#ifndef _MLIB_SUB_A32_ASM_H_ +#define _MLIB_SUB_A32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sub_A32ss_Asmi(f16Min, f16Sub) MLIB_Sub_A32ss_FAsmi(f16Min, f16Sub) +#define MLIB_Sub_A32as_Asmi(a32Accum, f16Sub) MLIB_Sub_A32as_FAsmi(a32Accum, f16Sub) + +/***************************************************************************//*! +* +* a32Out = f16Min - f16Sub +* +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_Sub_A32ss_FAsmi(register frac16_t f16Min, register frac16_t f16Sub) +{ + register acc32_t a32Val=0; + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Min, f16Min /* Transforms 16-bit input f16Sub to 32-bit */ + sxth f16Sub, f16Sub /* Transforms 16-bit input f16Sub to 32-bit */ + subs a32Val, f16Min, f16Sub}; /* f16Min = f16Min - f16Sub */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Transforms 16-bit input f16Sub to 32-bit */ + "sxth %2, %2 \n\t" /* Transforms 16-bit input f16Sub to 32-bit */ + "subs %0, %1, %2 \n\t" /* f16Min = f16Min - f16Sub */ + : "=l"(a32Val), "+l"(f16Min), "+l"(f16Sub):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Transforms 16-bit input f16Sub to 32-bit */ + "sxth %2, %2 \n" /* Transforms 16-bit input f16Sub to 32-bit */ + "subs %0, %1, %2 \n" /* f16Min = f16Min - f16Sub */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "=l"(a32Val), "+l"(f16Min), "+l"(f16Sub):); + #endif + + return a32Val; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +/***************************************************************************//*! +* +* a32Out = a32Accum - f16Sub +* +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline acc32_t MLIB_Sub_A32as_FAsmi(register acc32_t a32Accum, register frac16_t f16Sub) +{ + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Sub, f16Sub /* Transforms 16-bit input f16Sub to 32-bit */ + subs a32Accum, a32Accum, f16Sub}; /* a32Accum = a32Accum - f16Sub */ + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %1, %1 \n\t" /* Transforms 16-bit input f16Sub to 32-bit */ + "subs %0, %0, %1 \n\t" /* a32Accum = a32Accum - f16Sub */ + : "+l"(a32Accum), "+l"(f16Sub):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %1, %1 \n" /* Transforms 16-bit input f16Sub to 32-bit */ + "subs %0, %0, %1 \n" /* a32Accum = a32Accum - f16Sub */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(a32Accum), "+l"(f16Sub):); + #endif + + return a32Accum; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SUB_A32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F16.h new file mode 100644 index 0000000..0fd6902 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F16.h @@ -0,0 +1,67 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction +* +*******************************************************************************/ +#ifndef _MLIB_SUB_F16_H_ +#define _MLIB_SUB_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sub_F16_Ci(f16Min, f16Sub) MLIB_Sub_F16_FCi(f16Min, f16Sub) + +/***************************************************************************//*! +* +* f16Out = f16Min - f16Sub +* Without saturation +*******************************************************************************/ +static inline frac16_t MLIB_Sub_F16_FCi(register frac16_t f16Min, register frac16_t f16Sub) +{ + return(f16Min - f16Sub); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SUB_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F16_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F16_Asmi.h new file mode 100644 index 0000000..f714245 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F16_Asmi.h @@ -0,0 +1,130 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction +* +*******************************************************************************/ +#ifndef _MLIB_SUB_F16_ASM_H_ +#define _MLIB_SUB_F16_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_SubSat_F16_Asmi(f16Min, f16Sub) MLIB_SubSat_F16_FAsmi(f16Min, f16Sub) + +/***************************************************************************//*! +* +* f16Out = f16Min - f16Sub +* With saturation +*******************************************************************************/ +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac16_t MLIB_SubSat_F16_FAsmi(register frac16_t f16Min, register frac16_t f16Sub) +{ + register frac32_t f32Val = 0x8000; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ sxth f16Min, f16Min /* Transforms 16-bit input f16Min to 32-bit */ + sxth f16Sub, f16Sub /* Transforms 16-bit input f16Sub to 32-bit */ + subs f16Min, f16Min, f16Sub /* f16Min = f16Min - f16Sub */ + + cmp f32Val, f16Min /* Compares f16Min with 0x7FFF */ + bgt NegTest /* If f16Min < 0x8000, then goes to NegTest */ + subs f16Min, f32Val, #1 /* If f16Min >= 0x8000, then f16Min = 0x7FFF */ + b SatEnd /* Goes to SatEnd */ + NegTest: + sxth f32Val, f32Val /* f32Val = 0xFFFF8000 */ + cmp f32Val, f16Min /* Compares f16Min with 0xFFFF8000 */ + ble SatEnd /* If f16Min >= 0xFFFF8000, then goes to SatEnd */ + mov f16Min, f32Val}; /* If f16Min < 0xFFFF8000, then f16Min = 0xFFFF8000 */ + SatEnd: + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "sxth %2, %2 \n\t" /* Transforms 16-bit input f16Min to 32-bit */ + "sxth %0, %0 \n\t" /* Transforms 16-bit input f16Sub to 32-bit */ + "subs %2, %2, %0 \n\t" /* f16Min = f16Min - f16Sub */ + + "cmp %1, %2 \n\t" /* Compares f16Min with 0x8000 */ + "bgt MLIB_SUB_F16_NegTest%= \n\t" /* If f16Min < 0x8000, then jumps through two commands */ + "subs %2, %1, #1 \n\t" /* If f16Min >= 0x8000, then f16Min = 0x7FFF */ + "b MLIB_SUB_F16_SatEnd%= \n\t" /* Jumps through four commands */ + "MLIB_SUB_F16_NegTest%=: \n\t" + "sxth %1, %1 \n\t" /* f32Val = 0xFFFF8000 */ + "cmp %1, %2 \n\t" /* Compares f16Min with 0xFFFF8000 */ + "ble MLIB_SUB_F16_SatEnd%= \n\t"/* If f16Min >= 0xFFFF8000, then jumps through next commands */ + "mov %2, %1 \n\t" /* If f16Min < 0xFFFF8000, then f16Min = 0xFFFF8000 */ + "MLIB_SUB_F16_SatEnd%=: \n\t" + : "+l"(f16Sub), "+l"(f32Val), "+l"(f16Min):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "sxth %2, %2 \n" /* Transforms 16-bit input f16Min to 32-bit */ + "sxth %0, %0 \n" /* Transforms 16-bit input f16Sub to 32-bit */ + "subs %2, %2, %0 \n" /* f16Min = f16Min - f16Sub */ + + "cmp %1, %2 \n" /* Compares f16Min with 0x8000 */ + "bgt .+6 \n" /* If f16Min < 0x8000, then jumps through two commands */ + "subs %2, %1, #1 \n" /* If f16Min >= 0x8000, then f16Min = 0x7FFF */ + "b .+10 \n" /* Jumps through four commands */ + + "sxth %1, %1 \n" /* f32Val = 0xFFFF8000 */ + "cmp %1, %2 \n" /* Compares f16Min with 0xFFFF8000 */ + "ble .+4 \n" /* If f16Min >= 0xFFFF8000, then jumps through next commands */ + "mov %2, %1 \n" /* If f16Min < 0xFFFF8000, then f16Min = 0xFFFF8000 */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "+l"(f16Sub), "+l"(f32Val), "+l"(f16Min):); + #endif + + return f16Min; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SUB_F16_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F32.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F32.h new file mode 100644 index 0000000..30fc670 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F32.h @@ -0,0 +1,67 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction +* +*******************************************************************************/ +#ifndef _MLIB_SUB_F32_H_ +#define _MLIB_SUB_F32_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_Sub_F32_Ci(f32Min, f32Sub) MLIB_Sub_F32_FCi(f32Min, f32Sub) + +/***************************************************************************//*! +* +* f32Out = f32Min - f32Sub +* Without saturation +*******************************************************************************/ +static inline frac32_t MLIB_Sub_F32_FCi(register frac32_t f32Min, register frac32_t f32Sub) +{ + return(f32Min - f32Sub); +} + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SUB_F32_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F32_Asmi.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F32_Asmi.h new file mode 100644 index 0000000..de097e0 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/MLIB_Sub_F32_Asmi.h @@ -0,0 +1,131 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Subtraction +* +*******************************************************************************/ +#ifndef _MLIB_SUB_F32_ASM_H_ +#define _MLIB_SUB_F32_ASM_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_SubSat_F32_Asmi(f32Min, f32Sub) MLIB_SubSat_F32_FAsmi(f32Min, f32Sub) + +/***************************************************************************//*! +* +* Output = f32Min - f32Sub +* With saturation +*******************************************************************************/ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_suppress=Pe549 /* Suppresses the Pe549 warning for IAR compiler*/ +#endif +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_SAVE +RTCESL_INLINE_OPTIM_SET +static inline frac32_t MLIB_SubSat_F32_FAsmi(register frac32_t f32Min, register frac32_t f32Sub) +{ + register frac32_t f32SubVal=0, f32SatVal=0; + + #if defined(__CC_ARM) /* For ARM Compiler */ + __asm volatile{ subs f32SubVal, f32Min, f32Sub /* f32SubVal = f32Min - f32Sub */ + movs f32SatVal, f32Min /* f32SatVal = f32Min */ + eors f32SatVal, f32SatVal, f32Sub /* f32SatVal = f32Min ^ f32Sub */ + bpl SatEnd /* If f32SatVal >= 0, then goes to the SatEnd */ + eors f32Min, f32Min, f32SubVal /* f32Min = f32Min ^ (f32Min - f32Sub) */ + bpl SatEnd /* If f32Min >= 0, then goes to the SatEnd */ + movs f32SubVal, #128 /* f32SubVal = 0x80 */ + lsls f32SubVal, f32SubVal, #24 /* f32SubVal = 0x80000000 */ + cmp f32Sub, #0 /* Compares f32Sub with 0 */ + bgt SatEnd /* If f32Min > 0, then goes to the SatEnd */ + subs f32SubVal, f32SubVal, #1 /* f32SubVal = 0x7FFFFFFF */ + SatEnd:}; + #elif defined(__GNUC__) && defined(__ARMCC_VERSION) + __asm volatile( + "subs %0, %1, %2 \n\t" /* f32SubVal = f32Min - f32Sub */ + "movs %3, %1 \n\t" /* f32SatVal = f32Min */ + "eors %3, %3, %2 \n\t" /* f32SatVal = f32Min ^ f32Sub */ + "bpl MLIB_SUB_F32_SatEnd%= \n\t" /* If f32SatVal >= 0, then goes to the end of function */ + "eors %1, %1, %0 \n\t" /* f32Min = f32Min ^ (f32Min - f32Sub) */ + "bpl MLIB_SUB_F32_SatEnd%= \n\t" /* If f32Min >= 0, then goes to the end of function */ + "movs %0, #128 \n\t" /* f32SubVal = 0x80 */ + "lsls %0, %0, #24 \n\t" /* f32SubVal = 0x80000000 */ + "cmp %2, #0 \n\t" /* Compares f32Sub with 0 */ + "bgt MLIB_SUB_F32_SatEnd%= \n\t" /* If f32Min > 0, then goes to the end of function */ + "subs %0, %0, #1 \n\t" /* f32SubVal = 0x7FFFFFFF */ + "MLIB_SUB_F32_SatEnd%=: \n\t" + : "=&l"(f32SubVal), "+l"(f32Min), "+l"(f32Sub), "+l"(f32SatVal):); + #else + __asm volatile( + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax unified \n" /* Using unified asm syntax */ + #endif + "subs %0, %1, %2 \n" /* f32SubVal = f32Min - f32Sub */ + "movs %3, %1 \n" /* f32SatVal = f32Min */ + "eors %3, %3, %2 \n" /* f32SatVal = f32Min ^ f32Sub */ + "bpl .+16 \n" /* If f32SatVal >= 0, then goes to the end of function */ + "eors %1, %1, %0 \n" /* f32Min = f32Min ^ (f32Min - f32Sub) */ + "bpl .+12 \n" /* If f32Min >= 0, then goes to the end of function */ + "movs %0, #128 \n" /* f32SubVal = 0x80 */ + "lsls %0, %0, #24 \n" /* f32SubVal = 0x80000000 */ + "cmp %2, #0 \n" /* Compares f32Sub with 0 */ + "bgt .+4 \n" /* If f32Min > 0, then goes to the end of function */ + "subs %0, %0, #1 \n" /* f32SubVal = 0x7FFFFFFF */ + #if defined(__GNUC__) /* For GCC compiler */ + ".syntax divided \n" + #endif + : "=&l"(f32SubVal), "+l"(f32Min), "+l"(f32Sub), "+l"(f32SatVal):); + #endif + + return f32SubVal; +} +/* inline function without any optimization (compilation issue) */ +RTCESL_INLINE_OPTIM_RESTORE + +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ +#pragma diag_default=Pe549 +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_SUB_F32_ASM_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/RTCESL_cfg.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/RTCESL_cfg.h new file mode 100644 index 0000000..3093ca9 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/RTCESL_cfg.h @@ -0,0 +1,128 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief RTCESL configuration file +* +*******************************************************************************/ +#ifndef _RTCESL_CFG_H_ +#define _RTCESL_CFG_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************************* +* RTCESL vesion +*******************************************************************************/ +/* RTCESL version is 4.7 */ +#define RTCESL_VERSION 4.7 + + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define RTCESL_ON 1 +#define RTCESL_OFF 0 + +/******************************************************************************* +* User Modified Macros +*******************************************************************************/ +/* Memory-Mapped Divide and Square Root Module (MMDVSQ) RTCESL_ON/RTCESL_OFF +* configuration. It is recommended to use MMDVSQ for KV1x devices, because Div, +* Rcp and Sqrt operations are quicker. */ + +/* The MMDVSQ can be enabled or disabled by the definition of the symbol in IDE +* preprocessor setting. +* To enable MMDVSQ module please define symbol: RTCESL_MMDVSQ_ON, to disable the MMDVSQ please +* define RTCESL_MMDVSQ_OFF (Div,Rcp of Sqrt functions which use them will be +* calculated by core). +* If no symbol RTCESL_MMDVSQ_XXX is defined the RTCESL_MMDVSQ setting will be taken from +* this header file, see next paragraph. */ + +#if (defined (RTCESL_MMDVSQ_ON)) + #define RTCESL_MMDVSQ RTCESL_ON +#elif (defined (RTCESL_MMDVSQ_OFF)) + #define RTCESL_MMDVSQ RTCESL_OFF +#else + /* User option to enable or disable MMDVSQ module when IDE preprocessor setting + * was not used. Set the following define as RTCESL_ON or RTCESL_OFF to enable or + * disable hardware MMDVSQ support. */ + + /* Next line can be modified by user */ + #define RTCESL_MMDVSQ RTCESL_OFF + + /* Independent function call can be used as well, for example + * MLIB_Div_F16 ... depend on setting + * MLIB_DivHw_F16_C always make calculation in MMDVSQ module + * MLIB_Div_F16_Ci always make calculation in core */ +#endif + +/* Warning if RTCESL_MMDVSQ was not correctly defined */ +#ifndef RTCESL_MMDVSQ + #warning "RTCESL_MMDVSQ was not defined !" +#endif +/* Warning if RTCESL_MMDVSQ_ON and RTCESL_MMDVSQ_OFF are defined in IDE */ +#if defined(RTCESL_MMDVSQ_ON) && defined(RTCESL_MMDVSQ_OFF) + #warning "RTCESL_MMDVSQ_ON and RTCESL_MMDVSQ_OFF are defined !" +#endif + +/* Inline assembler function optimization setting */ +/* Only for functions written as inline assembler. The setting can be changed, but the RTCESL was tested + with following original setting. In case of any change the functionality is not guaranteed. */ + +#if defined(__IAR_SYSTEMS_ICC__) /* For IAR compiler */ + #define RTCESL_INLINE_OPTIM_SAVE /* Save original level - no value */ + #define RTCESL_INLINE_OPTIM_SET /* Set specific level */ + #define RTCESL_INLINE_OPTIM_RESTORE /* Restore original level - no value*/ +#elif defined(__CC_ARM) /* For ARM(KEIL) version < 6 compiler */ + #define RTCESL_INLINE_OPTIM_SAVE /* Save original level - no value */ + #define RTCESL_INLINE_OPTIM_SET /* Set specific level */ + #define RTCESL_INLINE_OPTIM_RESTORE /* Restore original level - no value*/ +#elif defined(__GNUC__) && defined(__ARMCC_VERSION) /* For ARM(KEIL) version >= 6 compiler */ + #define RTCESL_INLINE_OPTIM_SAVE /* Save original level - no value */ + #define RTCESL_INLINE_OPTIM_SET /* Set specific level */ + #define RTCESL_INLINE_OPTIM_RESTORE /* Restore original level - no value*/ +#elif defined(__GNUC__) /* For GCC compiler */ + #define RTCESL_INLINE_OPTIM_SAVE /* Save original level - no value */ + #define RTCESL_INLINE_OPTIM_SET /* Set specific level */ + #define RTCESL_INLINE_OPTIM_RESTORE /* Restore original level - no value*/ +#else /* Other compiler used */ + #warning "Unsupported compiler/IDE used !" +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /*_RTCESL_CFG_H_*/ + diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/asm_mac.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/asm_mac.h new file mode 100644 index 0000000..a8e053b --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/asm_mac.h @@ -0,0 +1,103 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief asm_mac.h +* +*******************************************************************************/ + +#ifndef ASM_MAC_H_ +#define ASM_MAC_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Macros +*******************************************************************************/ + +#if defined(__IAR_SYSTEMS_ASM__) /* IAR compiler */ + #define ASM_PREFIX(x) x + #define ASM_LABEL(label) label + #define ASM_EXTERN(label) EXTERN label + #define ASM_ALIGN(value) ALIGNROM value + #define ASM_PUBLIC(label) PUBLIC label + #define ASM_CONST16(value) DC16 value + #define ASM_CONST32(value) DC32 value + #define ASM_LABEL_CONST32(label,value) ASM_LABEL(label) ASM_CONST32(value) + #define ASM_DATA_SECTION(label) SECTION label : DATA (4) + #define ASM_CODE_SECTION(label) SECTION label : CODE (4) + #define ASM_END END + #define ASM_EQUATE(label, value) label: EQU value + #define ASM_COMP_SPECIFIC_DIRECTIVES + #define ASM_CODE CODE + #define ASM_DATA DATA +#elif defined(__GNUC__) /* GCC compiler */ + #define ASM_PREFIX(x) x + #define ASM_LABEL(label) label: + #define ASM_EXTERN(label) .extern ASM_PREFIX(label) + #define ASM_ALIGN(value) .balign value + #define ASM_PUBLIC(label) .type ASM_PREFIX(label), %function; \ + .global ASM_PREFIX(label); + #define ASM_CONST16(value) .short value + #define ASM_CONST32(value) .long value + #define ASM_LABEL_CONST32(label,value) ASM_LABEL(label) ASM_CONST32(value) + #define ASM_DATA_SECTION(name) .section name + #define ASM_CODE_SECTION(name) .section name + #define ASM_END .end + #define ASM_EQUATE(label,value) .equ label, value + #define ASM_COMP_SPECIFIC_DIRECTIVES .syntax unified + #define ASM_CODE .thumb + #define ASM_DATA +#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) /* ARM compiler */ + #define ASM_PREFIX(x) x + #define ASM_LABEL(label) label + #define ASM_EXTERN(label) EXTERN label + #define ASM_ALIGN(value) ALIGN value + #define ASM_PUBLIC(label) EXPORT label + #define ASM_CONST16(value) DCWU value + #define ASM_CONST32(value) DCDU value + #define ASM_LABEL_CONST32(label,value) ASM_LABEL(label) ASM_CONST32(value) + #define ASM_DATA_SECTION(label) AREA |label|, DATA + #define ASM_CODE_SECTION(label) AREA |label|, CODE + #define ASM_END END + #define ASM_EQUATE(label, value) label EQU value + #define ASM_COMP_SPECIFIC_DIRECTIVES + #define ASM_CODE THUMB + #define ASM_DATA +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* ASM_MAC_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/mlib.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/mlib.h new file mode 100644 index 0000000..15e5395 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/mlib.h @@ -0,0 +1,390 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Main MLIB header file for devices without FPU. +* +*******************************************************************************/ +#ifndef _MLIB_H_ +#define _MLIB_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/****************************************************************************** +* Includes +******************************************************************************/ +#include "mlib_types.h" +#include "MLIB_Abs_F16.h" +#include "MLIB_Abs_F16_Asmi.h" +#include "MLIB_Abs_F32.h" +#include "MLIB_Abs_F32_Asmi.h" +#include "MLIB_Add4_F16.h" +#include "MLIB_Add4_F16_Asmi.h" +#include "MLIB_Add4_F32.h" +#include "MLIB_Add4_F32_Asmi.h" +#include "MLIB_Add_F16.h" +#include "MLIB_Add_F16_Asmi.h" +#include "MLIB_Add_F32.h" +#include "MLIB_Add_F32_Asmi.h" +#include "MLIB_Add_A32.h" +#include "MLIB_BiShift_F16.h" +#include "MLIB_BiShift_F16_Asmi.h" +#include "MLIB_BiShift_F32.h" +#include "MLIB_BiShift_F32_Asmi.h" +#include "MLIB_Clb_F16_Asmi.h" +#include "MLIB_Clb_F32_Asmi.h" +#include "MLIB_Conv_F32.h" +#include "MLIB_Div1Q_A32_Asm.h" +#include "MLIB_Div1Q_F16_Asm.h" +#include "MLIB_Div1Q_F32_Asm.h" +#include "MLIB_DivHw1Q_A32_Asm.h" +#include "MLIB_DivHw1Q_F16_Asm.h" +#include "MLIB_DivHw1Q_F32_Asm.h" +#include "MLIB_DivHw_A32_Asm.h" +#include "MLIB_DivHw_F16_Asm.h" +#include "MLIB_DivHw_F32_Asm.h" +#include "MLIB_Div_A32_Asm.h" +#include "MLIB_Div_F16_Asm.h" +#include "MLIB_Div_F32_Asm.h" +#include "MLIB_Log2_U16_Asmi.h" +#include "MLIB_Mac4Rnd_F16.h" +#include "MLIB_Mac4Rnd_F16_Asmi.h" +#include "MLIB_Mac4Rnd_F32_Asm.h" +#include "MLIB_Mac4_F32.h" +#include "MLIB_MacRnd_A32.h" +#include "MLIB_MacRnd_F16.h" +#include "MLIB_MacRnd_F16_Asmi.h" +#include "MLIB_MacRnd_F32.h" +#include "MLIB_MacRnd_F32_Asmi.h" +#include "MLIB_MacRnd_A32.h" +#include "MLIB_Mac_F16.h" +#include "MLIB_Mac_F16_Asmi.h" +#include "MLIB_Mac_F32.h" +#include "MLIB_Mac_F32_Asmi.h" +#include "MLIB_Mac_A32.h" +#include "MLIB_MnacRnd_A32.h" +#include "MLIB_MnacRnd_F16.h" +#include "MLIB_MnacRnd_F16_Asmi.h" +#include "MLIB_MnacRnd_F32.h" +#include "MLIB_MnacRnd_F32_Asmi.h" +#include "MLIB_MnacRnd_A32.h" +#include "MLIB_Mnac_F16.h" +#include "MLIB_Mnac_F16_Asmi.h" +#include "MLIB_Mnac_F32.h" +#include "MLIB_Mnac_F32_Asmi.h" +#include "MLIB_Mnac_A32.h" +#include "MLIB_Msu4Rnd_F16.h" +#include "MLIB_Msu4Rnd_F16_Asmi.h" +#include "MLIB_Msu4Rnd_F32_Asm.h" +#include "MLIB_Msu4_F32.h" +#include "MLIB_MsuRnd_A32.h" +#include "MLIB_MsuRnd_F16.h" +#include "MLIB_MsuRnd_F16_Asmi.h" +#include "MLIB_MsuRnd_F32.h" +#include "MLIB_MsuRnd_F32_Asmi.h" +#include "MLIB_MsuRnd_A32.h" +#include "MLIB_Msu_A32.h" +#include "MLIB_Msu_F16.h" +#include "MLIB_Msu_F16_Asmi.h" +#include "MLIB_Msu_F32.h" +#include "MLIB_Msu_F32_Asmi.h" +#include "MLIB_MulRnd_A32.h" +#include "MLIB_MulRnd_A32_Asmi.h" +#include "MLIB_MulRnd_F16.h" +#include "MLIB_MulRnd_F16_Asmi.h" +#include "MLIB_MulRnd_F32.h" +#include "MLIB_MulRnd_F32_Asmi.h" +#include "MLIB_Mul_A32.h" +#include "MLIB_Mul_A32_Asmi.h" +#include "MLIB_Mul_F16.h" +#include "MLIB_Mul_F16_Asmi.h" +#include "MLIB_Mul_F32.h" +#include "MLIB_Mul_F32_Asmi.h" +#include "MLIB_Neg_F16.h" +#include "MLIB_Neg_F16_Asmi.h" +#include "MLIB_Neg_F32.h" +#include "MLIB_Neg_F32_Asmi.h" +#include "MLIB_Rcp1Q_A32_Asm.h" +#include "MLIB_RcpHw1Q_A32_Asmi.h" +#include "MLIB_RcpHw_A32_Asm.h" +#include "MLIB_Rcp_A32_Asm.h" +#include "MLIB_Rnd_F32.h" +#include "MLIB_Rnd_F32_Asmi.h" +#include "MLIB_Sat_A32_Asmi.h" +#include "MLIB_Shift_F16.h" +#include "MLIB_Shift_F16_Asmi.h" +#include "MLIB_Shift_F32.h" +#include "MLIB_Shift_F32_Asmi.h" +#include "MLIB_Sign_F16_Asmi.h" +#include "MLIB_Sign_F32_Asmi.h" +#include "MLIB_Sub4_F16.h" +#include "MLIB_Sub4_F16_Asmi.h" +#include "MLIB_Sub4_F32.h" +#include "MLIB_Sub4_F32_Asmi.h" +#include "MLIB_Sub_A32.h" +#include "MLIB_Sub_F16.h" +#include "MLIB_Sub_F16_Asmi.h" +#include "MLIB_Sub_F32.h" +#include "MLIB_Sub_F32_Asmi.h" +#include "MLIB_Sub_A32.h" +#include "MLIB_MMDVSQ.h" + + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_AbsSat_F16(f16Val) MLIB_AbsSat_F16_Asmi(f16Val) +#define MLIB_AbsSat_F32(f32Val) MLIB_AbsSat_F32_Asmi(f32Val) +#define MLIB_Abs_F16(f16Val) MLIB_Abs_F16_Ci(f16Val) +#define MLIB_Abs_F32(f32Val) MLIB_Abs_F32_Ci(f32Val) +#define MLIB_Add4Sat_F16(f16Add1, f16Add2, f16Add3, f16Add4) MLIB_Add4Sat_F16_Asmi(f16Add1, f16Add2, f16Add3, f16Add4) +#define MLIB_Add4Sat_F32(f32Add1, f32Add2, f32Add3, f32Add4) MLIB_Add4Sat_F32_Asmi(f32Add1, f32Add2, f32Add3, f32Add4) +#define MLIB_Add4_F16(f16Add1, f16Add2, f16Add3, f16Add4) MLIB_Add4_F16_Ci(f16Add1, f16Add2, f16Add3, f16Add4) +#define MLIB_Add4_F32(f32Add1, f32Add2, f32Add3, f32Add4) MLIB_Add4_F32_Ci(f32Add1, f32Add2, f32Add3, f32Add4) +#define MLIB_AddSat_F16(f16Add1, f16Add2) MLIB_AddSat_F16_Asmi(f16Add1, f16Add2) +#define MLIB_AddSat_F32(f32Add1, f32Add2) MLIB_AddSat_F32_Asmi(f32Add1, f32Add2) +#define MLIB_Add_A32as(a32Accum, f16Add) MLIB_Add_A32as_Ci(a32Accum, f16Add) +#define MLIB_Add_A32ss(f16Add1, f16Add2) MLIB_Add_A32ss_Ci(f16Add1, f16Add2) +#define MLIB_Add_F16(f16Add1, f16Add2) MLIB_Add_F16_Ci(f16Add1, f16Add2) +#define MLIB_Add_F32(f32Add1, f32Add2) MLIB_Add_F32_Ci(f32Add1, f32Add2) +#define MLIB_Clb_U16l(f32Val) MLIB_Clb_U16l_Asmi(f32Val) +#define MLIB_Clb_U16s(f16Val) MLIB_Clb_U16s_Asmi(f16Val) +#define MLIB_Conv_F16l(f32Val) MLIB_Conv_F16l_Ci(f32Val) +#define MLIB_Conv_F32s(f16Val) MLIB_Conv_F32s_Ci(f16Val) +#define MLIB_Log2_U16(u16Val) MLIB_Log2_U16_Asmi(u16Val) +#define MLIB_Mac4RndSat_F16(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) MLIB_Mac4RndSat_F16_Asmi(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) +#define MLIB_Mac4RndSat_F32(f32Add1Mul1, f32Add1Mul2, f32Add2Mul1, f32Add2Mul2) MLIB_Mac4RndSat_F32_Asm(f32Add1Mul1, f32Add1Mul2, f32Add2Mul1, f32Add2Mul2) +#define MLIB_Mac4Rnd_F16(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) MLIB_Mac4Rnd_F16_Ci(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) +#define MLIB_Mac4Rnd_F32(f32Add1Mul1, f32Add1Mul2, f32Add2Mul1, f32Add2Mul2) MLIB_Mac4Rnd_F32_Asm(f32Add1Mul1, f32Add1Mul2, f32Add2Mul1, f32Add2Mul2) +#define MLIB_Mac4Sat_F32ssss(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) MLIB_Mac4Sat_F32ssss_Ci(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) +#define MLIB_Mac4_F32ssss(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) MLIB_Mac4_F32ssss_Ci(f16Add1Mul1, f16Add1Mul2, f16Add2Mul1, f16Add2Mul2) +#define MLIB_MacRndSat_F16( f16Accum, f16Mult1, f16Mult2) MLIB_MacRndSat_F16_Asmi( f16Accum, f16Mult1, f16Mult2) +#define MLIB_MacRndSat_F32( f32Accum, f32Mult1, f32Mult2) MLIB_MacRndSat_F32_Asm( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MacRndSat_F32lls( f32Accum, f32Mult1, f16Mult2) MLIB_MacRndSat_F32lls_Asmi( f32Accum, f32Mult1, f16Mult2) +#define MLIB_MacRnd_A32ass(a32Accum, f16Mult1, f16Mult2) MLIB_MacRnd_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) +#define MLIB_MacRnd_F16( f16Accum, f16Mult1, f16Mult2) MLIB_MacRnd_F16_Ci( f16Accum, f16Mult1, f16Mult2) +#define MLIB_MacRnd_F32( f32Accum, f32Mult1, f32Mult2) MLIB_MacRnd_F32_Asmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MacRnd_F32lls( f32Accum, f32Mult1, f16Mult2) MLIB_MacRnd_F32lls_Ci( f32Accum, f32Mult1, f16Mult2) +#define MLIB_MacSat_F16( f16Accum, f16Mult1, f16Mult2) MLIB_MacSat_F16_Asmi( f16Accum, f16Mult1, f16Mult2) +#define MLIB_MacSat_F32( f32Accum, f32Mult1, f32Mult2) MLIB_MacSat_F32_Asmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MacSat_F32lss( f32Accum, f16Mult1, f16Mult2) MLIB_MacSat_F32lss_Asmi( f32Accum, f16Mult1, f16Mult2) +#define MLIB_Mac_A32ass(a32Accum, f16Mult1, f16Mult2) MLIB_Mac_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) +#define MLIB_Mac_F16( f16Accum, f16Mult1, f16Mult2) MLIB_Mac_F16_Ci( f16Accum, f16Mult1, f16Mult2) +#define MLIB_Mac_F32( f32Accum, f32Mult1, f32Mult2) MLIB_Mac_F32_Asmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_Mac_F32lss( f32Accum, f16Mult1, f16Mult2) MLIB_Mac_F32lss_Ci( f32Accum, f16Mult1, f16Mult2) +#define MLIB_MnacRndSat_F16( f16Accum, f16Mult1, f16Mult2) MLIB_MnacRndSat_F16_Asmi( f16Accum, f16Mult1, f16Mult2) +#define MLIB_MnacRndSat_F32( f32Accum, f32Mult1, f32Mult2) MLIB_MnacRndSat_F32_Asm( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MnacRndSat_F32lls( f32Accum, f32Mult1, f16Mult2) MLIB_MnacRndSat_F32lls_Asmi( f32Accum, f32Mult1, f16Mult2) +#define MLIB_MnacRnd_A32ass(a32Accum, f16Mult1, f16Mult2) MLIB_MnacRnd_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) +#define MLIB_MnacRnd_F16( f16Accum, f16Mult1, f16Mult2) MLIB_MnacRnd_F16_Ci( f16Accum, f16Mult1, f16Mult2) +#define MLIB_MnacRnd_F32( f32Accum, f32Mult1, f32Mult2) MLIB_MnacRnd_F32_Asmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MnacRnd_F32lls( f32Accum, f32Mult1, f16Mult2) MLIB_MnacRnd_F32lls_Ci( f32Accum, f32Mult1, f16Mult2) +#define MLIB_MnacSat_F16( f16Accum, f16Mult1, f16Mult2) MLIB_MnacSat_F16_Asmi( f16Accum, f16Mult1, f16Mult2) +#define MLIB_MnacSat_F32( f32Accum, f32Mult1, f32Mult2) MLIB_MnacSat_F32_Asmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MnacSat_F32lss( f32Accum, f16Mult1, f16Mult2) MLIB_MnacSat_F32lss_Asmi( f32Accum, f16Mult1, f16Mult2) +#define MLIB_Mnac_A32ass(a32Accum, f16Mult1, f16Mult2) MLIB_Mnac_A32ass_Ci(a32Accum, f16Mult1, f16Mult2) +#define MLIB_Mnac_F16( f16Accum, f16Mult1, f16Mult2) MLIB_Mnac_F16_Ci( f16Accum, f16Mult1, f16Mult2) +#define MLIB_Mnac_F32( f32Accum, f32Mult1, f32Mult2) MLIB_Mnac_F32_Asmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_Mnac_F32lss( f32Accum, f16Mult1, f16Mult2) MLIB_Mnac_F32lss_Ci( f32Accum, f16Mult1, f16Mult2) +#define MLIB_Msu4RndSat_F16( f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) MLIB_Msu4RndSat_F16_Asmi( f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) +#define MLIB_Msu4RndSat_F32( f32MinMul1, f32MinMul2, f32SubMul1, f32SubMul2) MLIB_Msu4RndSat_F32_Asm( f32MinMul1, f32MinMul2, f32SubMul1, f32SubMul2) +#define MLIB_Msu4Rnd_F16( f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) MLIB_Msu4Rnd_F16_Ci( f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) +#define MLIB_Msu4Rnd_F32( f32MinMul1, f32MinMul2, f32SubMul1, f32SubMul2) MLIB_Msu4Rnd_F32_Asm( f32MinMul1, f32MinMul2, f32SubMul1, f32SubMul2) +#define MLIB_Msu4Sat_F32ssss(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) MLIB_Msu4Sat_F32ssss_Ci(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) +#define MLIB_Msu4_F32ssss(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) MLIB_Msu4_F32ssss_Ci(f16MinMul1, f16MinMul2, f16SubMul1, f16SubMul2) +#define MLIB_MsuRndSat_F16( f16Accum, f16Mult1, f16Mult2) MLIB_MsuRndSat_F16_Asmi( f16Accum, f16Mult1, f16Mult2) +#define MLIB_MsuRndSat_F32( f32Accum, f32Mult1, f32Mult2) MLIB_MsuRndSat_F32_Asm( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MsuRndSat_F32lls( f32Accum, f32Mult1, f16Mult2) MLIB_MsuRndSat_F32lls_Asmi( f32Accum, f32Mult1, f16Mult2) +#define MLIB_MsuRnd_A32ass( a32Accum, f16Mult1, f16Mult2) MLIB_MsuRnd_A32ass_Ci( a32Accum, f16Mult1, f16Mult2) +#define MLIB_MsuRnd_F16( f16Accum, f16Mult1, f16Mult2) MLIB_MsuRnd_F16_Ci( f16Accum, f16Mult1, f16Mult2) +#define MLIB_MsuRnd_F32( f32Accum, f32Mult1, f32Mult2) MLIB_MsuRnd_F32_Asmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MsuRnd_F32lls( f32Accum, f32Mult1, f16Mult2) MLIB_MsuRnd_F32lls_Ci( f32Accum, f32Mult1, f16Mult2) +#define MLIB_MsuSat_F16( f16Accum, f16Mult1, f16Mult2) MLIB_MsuSat_F16_Asmi( f16Accum, f16Mult1, f16Mult2) +#define MLIB_MsuSat_F32( f32Accum, f32Mult1, f32Mult2) MLIB_MsuSat_F32_Asmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_MsuSat_F32lss( f32Accum, f16Mult1, f16Mult2) MLIB_MsuSat_F32lss_Asmi( f32Accum, f16Mult1, f16Mult2) +#define MLIB_Msu_A32ass( a32Accum, f16Mult1, f16Mult2) MLIB_Msu_A32ass_Ci( a32Accum, f16Mult1, f16Mult2) +#define MLIB_Msu_F16( f16Accum, f16Mult1, f16Mult2) MLIB_Msu_F16_Ci( f16Accum, f16Mult1, f16Mult2) +#define MLIB_Msu_F32( f32Accum, f32Mult1, f32Mult2) MLIB_Msu_F32_Asmi( f32Accum, f32Mult1, f32Mult2) +#define MLIB_Msu_F32lss( f32Accum, f16Mult1, f16Mult2) MLIB_Msu_F32lss_Ci( f32Accum, f16Mult1, f16Mult2) +#define MLIB_MulNegRndSat_A32( a32Mult1, a32Mult2) MLIB_MulNegRndSat_A32_Asmi( a32Mult1, a32Mult2) +#define MLIB_MulNegRndSat_F16as( a32Accum, f16Mult) MLIB_MulNegRndSat_F16as_Asmi( a32Accum, f16Mult) +#define MLIB_MulNegRnd_F16( f16Mult1, f16Mult2) MLIB_MulNegRnd_F16_Ci( f16Mult1, f16Mult2) +#define MLIB_MulNegRnd_F16as( a32Accum, f16Mult) MLIB_MulNegRnd_F16as_Ci( a32Accum, f16Mult) +#define MLIB_MulNegRnd_F32( f32Mult1, f32Mult2) MLIB_MulNegRnd_F32_Asmi( f32Mult1, f32Mult2) +#define MLIB_MulNegRnd_F32ls( f32Mult1, f16Mult2) MLIB_MulNegRnd_F32ls_Ci( f32Mult1, f16Mult2) +#define MLIB_MulNegRnd_A32( a32Mult1, a32Mult2) MLIB_MulNegRnd_A32_Asmi( a32Mult1, a32Mult2) +#define MLIB_MulNegSat_A32( a32Mult1, a32Mult2) MLIB_MulNegSat_A32_Asmi( a32Mult1, a32Mult2) +#define MLIB_MulNegSat_F16as( a32Accum, f16Mult) MLIB_MulNegSat_F16as_Asmi( a32Accum, f16Mult) +#define MLIB_MulNeg_F16( f16Mult1, f16Mult2) MLIB_MulNeg_F16_Ci( f16Mult1, f16Mult2) +#define MLIB_MulNeg_F16as( a32Accum, f16Mult) MLIB_MulNeg_F16as_Ci( a32Accum, f16Mult) +#define MLIB_MulNeg_F32( f32Mult1, f32Mult2) MLIB_MulNeg_F32_Ci( f32Mult1, f32Mult2) +#define MLIB_MulNeg_F32ss( f16Mult1, f16Mult2) MLIB_MulNeg_F32ss_Ci( f16Mult1, f16Mult2) +#define MLIB_MulNeg_A32( a32Mult1, a32Mult2) MLIB_MulNeg_A32_Asmi( a32Mult1, a32Mult2) +#define MLIB_MulRndSat_F16( f16Mult1, f16Mult2) MLIB_MulRndSat_F16_Asmi( f16Mult1, f16Mult2) +#define MLIB_MulRndSat_F16as( a32Accum, f16Mult) MLIB_MulRndSat_F16as_Asmi( a32Accum, f16Mult) +#define MLIB_MulRndSat_F32( f32Mult1, f32Mult2) MLIB_MulRndSat_F32_Asmi( f32Mult1, f32Mult2) +#define MLIB_MulRndSat_F32ls( f32Mult1, f16Mult2) MLIB_MulRndSat_F32ls_Ci( f32Mult1, f16Mult2) +#define MLIB_MulRndSat_A32( a32Mult1, a32Mult2) MLIB_MulRndSat_A32_Asmi( a32Mult1, a32Mult2) +#define MLIB_MulRnd_F16( f16Mult1, f16Mult2) MLIB_MulRnd_F16_Ci( f16Mult1, f16Mult2) +#define MLIB_MulRnd_F16as( a32Accum, f16Mult) MLIB_MulRnd_F16as_Ci( a32Accum, f16Mult) +#define MLIB_MulRnd_F32( f32Mult1, f32Mult2) MLIB_MulRnd_F32_Asmi( f32Mult1, f32Mult2) +#define MLIB_MulRnd_F32ls( f32Mult1, f16Mult2) MLIB_MulRnd_F32ls_Ci( f32Mult1, f16Mult2) +#define MLIB_MulRnd_A32( a32Mult1, a32Mult2) MLIB_MulRnd_A32_Asmi( a32Mult1, a32Mult2) +#define MLIB_MulSat_F16( f16Mult1, f16Mult2) MLIB_MulSat_F16_Asmi( f16Mult1, f16Mult2) +#define MLIB_MulSat_F16as( a32Accum, f16Mult) MLIB_MulSat_F16as_Asmi( a32Accum, f16Mult) +#define MLIB_MulSat_F32( f32Mult1, f32Mult2) MLIB_MulSat_F32_Ci( f32Mult1, f32Mult2) +#define MLIB_MulSat_F32ss( f16Mult1, f16Mult2) MLIB_MulSat_F32ss_Ci( f16Mult1, f16Mult2) +#define MLIB_MulSat_A32( a32Mult1, a32Mult2) MLIB_MulSat_A32_Asmi( a32Mult1, a32Mult2) +#define MLIB_Mul_F16( f16Mult1, f16Mult2) MLIB_Mul_F16_Ci( f16Mult1, f16Mult2) +#define MLIB_Mul_F16as( a32Accum, f16Mult) MLIB_Mul_F16as_Ci( a32Accum, f16Mult) +#define MLIB_Mul_F32( f32Mult1, f32Mult2) MLIB_Mul_F32_Ci( f32Mult1, f32Mult2) +#define MLIB_Mul_F32ss( f16Mult1, f16Mult2) MLIB_Mul_F32ss_Ci( f16Mult1, f16Mult2) +#define MLIB_Mul_A32( a32Mult1, a32Mult2) MLIB_Mul_A32_FAsmi( a32Mult1, a32Mult2) +#define MLIB_NegSat_F16(f16Val) MLIB_NegSat_F16_Asmi(f16Val) +#define MLIB_NegSat_F32(f32Val) MLIB_NegSat_F32_Asmi(f32Val) +#define MLIB_Neg_F16(f16Val) MLIB_Neg_F16_Ci(f16Val) +#define MLIB_Neg_F32(f32Val) MLIB_Neg_F32_Ci(f32Val) +#define MLIB_RndSat_F16l(f32Val) MLIB_RndSat_F16l_Asmi(f32Val) +#define MLIB_Rnd_F16l(f32Val) MLIB_Rnd_F16l_Ci(f32Val) +#define MLIB_Sat_F16a(a32Accum) MLIB_Sat_F16a_Asmi(a32Accum) +#define MLIB_Sh1LSat_F16(f16Val) MLIB_Sh1LSat_F16_Asmi(f16Val) +#define MLIB_Sh1LSat_F32(f32Val) MLIB_Sh1LSat_F32_Asmi(f32Val) +#define MLIB_Sh1L_F16(f16Val) MLIB_Sh1L_F16_Ci(f16Val) +#define MLIB_Sh1L_F32(f32Val) MLIB_Sh1L_F32_Ci(f32Val) +#define MLIB_Sh1R_F16(f16Val) MLIB_Sh1R_F16_Ci(f16Val) +#define MLIB_Sh1R_F32(f32Val) MLIB_Sh1R_F32_Ci(f32Val) +#define MLIB_ShLBiSat_F16(f16Val, i16Sh) MLIB_ShLBiSat_F16_Asmi(f16Val, i16Sh) +#define MLIB_ShLBiSat_F32(f32Val, i16Sh) MLIB_ShLBiSat_F32_Asmi(f32Val, i16Sh) +#define MLIB_ShLBi_F16(f16Val, i16Sh) MLIB_ShLBi_F16_Ci(f16Val, i16Sh) +#define MLIB_ShLBi_F32(f32Val, i16Sh) MLIB_ShLBi_F32_Ci(f32Val, i16Sh) +#define MLIB_ShLSat_F16(f16Val, u16Sh) MLIB_ShLSat_F16_Asmi(f16Val, u16Sh) +#define MLIB_ShLSat_F32(f32Val, u16Sh) MLIB_ShLSat_F32_Asmi(f32Val, u16Sh) +#define MLIB_ShL_F16(f16Val, u16Sh) MLIB_ShL_F16_Ci(f16Val, u16Sh) +#define MLIB_ShL_F32(f32Val, u16Sh) MLIB_ShL_F32_Ci(f32Val, u16Sh) +#define MLIB_ShRBiSat_F16(f16Val, i16Sh) MLIB_ShRBiSat_F16_Asmi(f16Val, i16Sh) +#define MLIB_ShRBiSat_F32(f32Val, i16Sh) MLIB_ShRBiSat_F32_Asmi(f32Val, i16Sh) +#define MLIB_ShRBi_F16(f16Val, i16Sh) MLIB_ShRBi_F16_Ci(f16Val, i16Sh) +#define MLIB_ShRBi_F32(f32Val, i16Sh) MLIB_ShRBi_F32_Ci(f32Val, i16Sh) +#define MLIB_ShR_F16(f16Val, u16Sh) MLIB_ShR_F16_Ci(f16Val, u16Sh) +#define MLIB_ShR_F32(f32Val, u16Sh) MLIB_ShR_F32_Ci(f32Val, u16Sh) +#define MLIB_Sign_F16(f16Val) MLIB_Sign_F16_Asmi(f16Val) +#define MLIB_Sign_F32(f32Val) MLIB_Sign_F32_Asmi(f32Val) +#define MLIB_Sub4Sat_F16(f16Min, f16Sub1, f16Sub2, f16Sub3) MLIB_Sub4Sat_F16_Asmi(f16Min, f16Sub1, f16Sub2, f16Sub3) +#define MLIB_Sub4Sat_F32(f32Min, f32Sub1, f32Sub2, f32Sub3) MLIB_Sub4Sat_F32_Asmi(f32Min, f32Sub1, f32Sub2, f32Sub3) +#define MLIB_Sub4_F16(f16Min, f16Sub1, f16Sub2, f16Sub3) MLIB_Sub4_F16_Ci(f16Min, f16Sub1, f16Sub2, f16Sub3) +#define MLIB_Sub4_F32(f32Min, f32Sub1, f32Sub2, f32Sub3) MLIB_Sub4_F32_Ci(f32Min, f32Sub1, f32Sub2, f32Sub3) +#define MLIB_SubSat_F16(f16Min, f16Sub) MLIB_SubSat_F16_Asmi(f16Min, f16Sub) +#define MLIB_SubSat_F32(f32Min, f32Sub) MLIB_SubSat_F32_Asmi(f32Min, f32Sub) +#define MLIB_Sub_A32as(a32Accum, f16Sub) MLIB_Sub_A32as_Ci(a32Accum, f16Sub) +#define MLIB_Sub_A32ss(f16Min, f16Sub) MLIB_Sub_A32ss_Ci(f16Min, f16Sub) +#define MLIB_Sub_F16(f16Min, f16Sub) MLIB_Sub_F16_Ci(f16Min, f16Sub) +#define MLIB_Sub_F32(f32Min, f32Sub) MLIB_Sub_F32_Ci(f32Min, f32Sub) + +/* Software switch to enable or disable Memory-Mapped Divide and Square Root Module(MMDVSQ) */ +#if (RTCESL_MMDVSQ) + #define MLIB_Div1QSat_F16(f16Num, f16Denom) MLIB_DivHw1QSat_F16_Asm(f16Num, f16Denom) + #define MLIB_Div1QSat_F16ll(f32Num, f32Denom) MLIB_DivHw1QSat_F16ll_Asm(f32Num, f32Denom) + #define MLIB_Div1QSat_F16ls(f32Num, f16Denom) MLIB_DivHw1QSat_F16ls_Asmi(f32Num, f16Denom) + #define MLIB_Div1QSat_F32(f32Num, f32Denom) MLIB_DivHw1QSat_F32_Asm(f32Num, f32Denom) + #define MLIB_Div1QSat_F32ls(f32Num, f16Denom) MLIB_DivHw1QSat_F32ls_Asm(f32Num, f16Denom) + #define MLIB_Div1QSat_A32as(a32Num, f16Denom) MLIB_DivHw1QSat_F32ls_Asm(a32Num, f16Denom) + #define MLIB_Div1Q_A32ll(f32Num, f32Denom) MLIB_DivHw1Q_A32ll_Asm(f32Num, f32Denom) + #define MLIB_Div1Q_A32ls(f32Num, f16Denom) MLIB_DivHw1Q_A32ls_Asmi(f32Num, f16Denom) + #define MLIB_Div1Q_A32ss(f16Num, f16Denom) MLIB_DivHw1Q_A32ss_Asmi(f16Num, f16Denom) + #define MLIB_Div1Q_F16(f16Num, f16Denom) MLIB_DivHw1Q_F16_Asm(f16Num, f16Denom) + #define MLIB_Div1Q_F16ll(f32Num, f32Denom) MLIB_DivHw1Q_F16ll_Asm(f32Num, f32Denom) + #define MLIB_Div1Q_F16ls(f32Num, f16Denom) MLIB_DivHw1Q_F16ls_Asmi(f32Num, f16Denom) + #define MLIB_Div1Q_F32(f32Num, f32Denom) MLIB_DivHw1Q_F32_Asm(f32Num, f32Denom) + #define MLIB_Div1Q_F32ls(f32Num, f16Denom) MLIB_DivHw1Q_F32ls_Asm(f32Num, f16Denom) + #define MLIB_Div1Q_A32as(a32Num, f16Denom) MLIB_DivHw1Q_F32ls_Asm(a32Num, f16Denom) + #define MLIB_DivSat_F16(f16Num, f16Denom) MLIB_DivHwSat_F16_Asm(f16Num, f16Denom) + #define MLIB_DivSat_F16ll(f32Num, f32Denom) MLIB_DivHwSat_F16ll_Asm(f32Num, f32Denom) + #define MLIB_DivSat_F16ls(f32Num, f16Denom) MLIB_DivHwSat_F16ls_Asm(f32Num, f16Denom) + #define MLIB_DivSat_F32(f32Num, f32Denom) MLIB_DivHwSat_F32_Asm(f32Num, f32Denom) + #define MLIB_DivSat_F32ls(f32Num, f16Denom) MLIB_DivHwSat_F32ls_Asm(f32Num, f16Denom) + #define MLIB_DivSat_A32as(a32Num, f16Denom) MLIB_DivHwSat_F32ls_Asm(a32Num, f16Denom) + #define MLIB_Div_A32ll(f32Num, f32Denom) MLIB_DivHw_A32ll_Asm(f32Num, f32Denom) + #define MLIB_Div_A32ls(f32Num, f16Denom) MLIB_DivHw_A32ls_Asm(f32Num, f16Denom) + #define MLIB_Div_A32ss(f16Num, f16Denom) MLIB_DivHw_A32ss_Asm(f16Num, f16Denom) + #define MLIB_Div_F16(f16Num, f16Denom) MLIB_DivHw_F16_Asm(f16Num, f16Denom) + #define MLIB_Div_F16ll(f32Num, f32Denom) MLIB_DivHw_F16ll_Asm(f32Num, f32Denom) + #define MLIB_Div_F16ls(f32Num, f16Denom) MLIB_DivHw_F16ls_Asm(f32Num, f16Denom) + #define MLIB_Div_F32(f32Num, f32Denom) MLIB_DivHw_F32_Asm(f32Num, f32Denom) + #define MLIB_Div_F32ls(f32Num, f16Denom) MLIB_DivHw_F32ls_Asm(f32Num, f16Denom) + #define MLIB_Div_A32as(a32Num, f16Denom) MLIB_DivHw_F32ls_Asm(a32Num, f16Denom) + #define MLIB_Rcp1Q1_A32s(f16Denom) MLIB_RcpHw1Q1_A32s_Asmi(f16Denom) + #define MLIB_Rcp1Q_A32s(f16Denom) MLIB_RcpHw1Q_A32s_Asmi(f16Denom) + #define MLIB_Rcp1_A32s(f16Denom) MLIB_RcpHw1_A32s_Asm(f16Denom) + #define MLIB_Rcp_A32s(f16Denom) MLIB_RcpHw_A32s_Asm(f16Denom) +#else + #define MLIB_Div1QSat_F16(f16Num, f16Denom) MLIB_Div1QSat_F16_Asm(f16Num, f16Denom) + #define MLIB_Div1QSat_F16ll(f32Num, f32Denom) MLIB_Div1QSat_F16ll_Asm(f32Num, f32Denom) + #define MLIB_Div1QSat_F16ls(f32Num, f16Denom) MLIB_Div1QSat_F16ls_Asm(f32Num, f16Denom) + #define MLIB_Div1QSat_F32(f32Num, f32Denom) MLIB_Div1QSat_F32_Asm(f32Num, f32Denom) + #define MLIB_Div1QSat_F32ls(f32Num, f16Denom) MLIB_Div1QSat_F32ls_Asm(f32Num, f16Denom) + #define MLIB_Div1QSat_A32as(a32Num, f16Denom) MLIB_Div1QSat_F32ls_Asm(a32Num, f16Denom) + #define MLIB_Div1Q_A32ll(f32Num, f32Denom) MLIB_Div1Q_A32ll_Asm(f32Num, f32Denom) + #define MLIB_Div1Q_A32ls(f32Num, f16Denom) MLIB_Div1Q_A32ls_Asm(f32Num, f16Denom) + #define MLIB_Div1Q_A32ss(f16Num, f16Denom) MLIB_Div1Q_A32ss_Asm(f16Num, f16Denom) + #define MLIB_Div1Q_F16(f16Num, f16Denom) MLIB_Div1Q_F16_Asm(f16Num, f16Denom) + #define MLIB_Div1Q_F16ll(f32Num, f32Denom) MLIB_Div1Q_F16ll_Asm(f32Num, f32Denom) + #define MLIB_Div1Q_F16ls(f32Num, f16Denom) MLIB_Div1Q_F16ls_Asm(f32Num, f16Denom) + #define MLIB_Div1Q_F32(f32Num, f32Denom) MLIB_Div1Q_F32_Asm(f32Num, f32Denom) + #define MLIB_Div1Q_F32ls(f32Num, f16Denom) MLIB_Div1Q_F32ls_Asm(f32Num, f16Denom) + #define MLIB_Div1Q_A32as(a32Num, f16Denom) MLIB_Div1Q_F32ls_Asm(a32Num, f16Denom) + #define MLIB_DivSat_F16(f16Num, f16Denom) MLIB_DivSat_F16_Asm(f16Num, f16Denom) + #define MLIB_DivSat_F16ll(f32Num, f32Denom) MLIB_DivSat_F16ll_Asm(f32Num, f32Denom) + #define MLIB_DivSat_F16ls(f32Num, f16Denom) MLIB_DivSat_F16ls_Asm(f32Num, f16Denom) + #define MLIB_DivSat_F32(f32Num, f32Denom) MLIB_DivSat_F32_Asm(f32Num, f32Denom) + #define MLIB_DivSat_F32ls(f32Num, f16Denom) MLIB_DivSat_F32ls_Asm(f32Num, f16Denom) + #define MLIB_DivSat_A32as(a32Num, f16Denom) MLIB_DivSat_F32ls_Asm(a32Num, f16Denom) + #define MLIB_Div_A32ll(f32Num, f32Denom) MLIB_Div_A32ll_Asm(f32Num, f32Denom) + #define MLIB_Div_A32ls(f32Num, f16Denom) MLIB_Div_A32ls_Asm(f32Num, f16Denom) + #define MLIB_Div_A32ss(f16Num, f16Denom) MLIB_Div_A32ss_Asm(f16Num, f16Denom) + #define MLIB_Div_F16(f16Num, f16Denom) MLIB_Div_F16_Asm(f16Num, f16Denom) + #define MLIB_Div_F16ll(f32Num, f32Denom) MLIB_Div_F16ll_Asm(f32Num, f32Denom) + #define MLIB_Div_F16ls(f32Num, f16Denom) MLIB_Div_F16ls_Asm(f32Num, f16Denom) + #define MLIB_Div_F32(f32Num, f32Denom) MLIB_Div_F32_Asm(f32Num, f32Denom) + #define MLIB_Div_F32ls(f32Num, f16Denom) MLIB_Div_F32ls_Asm(f32Num, f16Denom) + #define MLIB_Div_A32as(a32Num, f16Denom) MLIB_Div_F32ls_Asm(a32Num, f16Denom) + #define MLIB_Rcp1Q1_A32s(f16Denom) MLIB_Rcp1Q1_A32s_Asm(f16Denom) + #define MLIB_Rcp1Q_A32s(f16Denom) MLIB_Rcp1Q_A32s_Asm(f16Denom) + #define MLIB_Rcp1_A32s(f16Denom) MLIB_Rcp1_A32s_Asm(f16Denom) + #define MLIB_Rcp_A32s(f16Denom) MLIB_Rcp_A32s_Asm(f16Denom) +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* _MLIB_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/mlib_types.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/mlib_types.h new file mode 100644 index 0000000..6dbcde1 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/Include/mlib_types.h @@ -0,0 +1,208 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Basic types for RTCESL +* +*******************************************************************************/ +#ifndef _MLIB_TYPES_H_ +#define _MLIB_TYPES_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/****************************************************************************** +* Includes +******************************************************************************/ +#include /* stdint.h include for data types */ +#include "RTCESL_cfg.h" /* includes the RTCESL configuration */ + +/* Include intrinsic functions */ +#if defined(__IAR_SYSTEMS_ICC__) /* IAR compiler */ + #include /* To use intrinsic functions */ +#endif + +/*! Definition of inline. */ +#if defined(__CC_ARM) + #define inline __inline +#endif + +/******************************************************************************* +* Types +*******************************************************************************/ +/* Boolean data types */ +typedef unsigned short bool_t; + +#if !defined(__MSL_BUILD__) +#if !defined( __STDINT_DECLS) +/* Signed and Unsigned integer data types */ + +/* 8 bits */ +#if !defined( __int8_t_defined) +#if !defined(__INT8_T_TYPE__) +typedef signed char int8_t; +#endif /* __INT8_T_TYPE__ */ +#if !defined(__INT8_T_TYPE__) +typedef unsigned char uint8_t; +#endif /* __INT8_T_TYPE__ */ +#define __int8_t_defined 1 +#endif /* __int8_t_defined */ + +/* 16 bits */ +#if !defined( __int16_t_defined) +#if !defined(__INT16_T_TYPE__) +typedef signed short int16_t; +#endif /* __INT16_T_TYPE__ */ +#if !defined(__INT16_T_TYPE__) +typedef unsigned short uint16_t; +#endif /* __INT16_T_TYPE__ */ +#define __int16_t_defined 1 +#endif /* __int16_t_defined */ + +/* 32 bits */ +#if !defined( __int32_t_defined) +#if !defined(__STDINT_H_INCLUDED) +#if !defined(__INT32_T_TYPE__) +typedef signed long int32_t; +#endif /* __INT32_T_TYPE__ */ +#if !defined(__INT32_T_TYPE__) +typedef unsigned long uint32_t; +#endif /* __INT32_T_TYPE__ */ +#define __int32_t_defined 1 +#endif /* __STDINT_H_INCLUDED */ +#endif /* __int32_t_defined */ + +/* 64 bits */ +#if !defined( __int64_t_defined) +#if !defined(__INT64_T_TYPE__) +typedef signed long long int64_t; +#endif /* __INT64_T_TYPE__ */ +#if !defined(__INT64_T_TYPE__) +typedef unsigned long long uint64_t; +#endif /* __INT64_T_TYPE__ */ +#define __int64_t_defined 1 +#endif /* __int64_t_defined */ + +#endif /* __STDINT_DECLS */ +#endif /* __MSL_BUILD__ */ + +/* Fractional data types */ +typedef signed char frac8_t; +typedef signed short frac16_t; +typedef signed long frac32_t; +typedef signed long long frac64_t; + +/* Accumulator data types */ +typedef signed short acc16_t; +typedef signed long acc32_t; +typedef signed long long acc64_t; + +/* Float data types */ +typedef float float_t; + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define MLIB_CONST + +/* bool */ +#ifndef FALSE +#define FALSE ((bool_t)0) +#endif + +#ifndef TRUE +#define TRUE ((bool_t)1) +#endif + +/* unsigned min, max */ +#ifndef INT16_MIN +#define INT16_MIN ((int16_t) 0x8000) +#endif + +#ifndef INT16_MAX +#define INT16_MAX ((int16_t) 0x7fff) +#endif + +#ifndef INT32_MIN +#define INT32_MIN ((int32_t) 0x80000000U) +#endif + +#ifndef INT32_MAX +#define INT32_MAX ((int32_t) 0x7fffffff) +#endif + +#ifndef INT64_MIN +#define INT64_MIN ((int64_t) 0x8000000000000000U) +#endif + +#ifndef INT64_MAX +#define INT64_MAX ((int64_t) 0x7fffffffffffffff) +#endif + +/* unsigned min, max */ +#ifndef UINT16_MAX +#define UINT16_MAX ((uint16_t) 0x8000U) +#endif + +#ifndef UINT32_MAX +#define UINT32_MAX ((uint32_t) 0x80000000U) +#endif + + +/* Fractional conversion macros */ +#if !defined(FRAC8) +#define FRAC8(x) ((frac8_t)((x) < 0.9921875 ? ((x) >= -1.0 ? (x)*((double)0x80U) : ((double)0x80U)) : ((double)0x7FU))) +#endif /*FRAC8*/ + +#if !defined(FRAC16) +#define FRAC16(x) ((frac16_t)((x) < 0.999969482421875 ? ((x) >= -1.0 ? (x)*((double)0x8000U) : ((double)0x8000U)) : ((double)0x7FFFU))) +#endif /*FRAC16 */ + +#if !defined(FRAC32) +#define FRAC32(x) ((frac32_t)((x) < 1.0 ? ((x) >= -1.0 ? (x)*((double)0x80000000U) : ((double)-2147483648)) : ((double)0x7FFFFFFFU))) +#endif /*FRAC64*/ + +/* Accumulator conversion macros */ +#if !defined(ACC16) +#define ACC16(x) ((acc16_t)((x) < 255.9921875 ? ((x) >= -256.0 ? (x)*((double)0x80U) : ((double)0x8000U)) : ((double)0x7FFFU))) +#endif /*ACC16*/ + +#if !defined(ACC32) +#define ACC32(x) ((acc32_t)((x) < 65535.999969482421875 ? ((x) >= -65536.0 ? (x)*((double)0x8000U) : ((double)-2147483648)) : ((double)0x7FFFFFFFU))) +#endif /*ACC32*/ + + +#if defined(__cplusplus) +} +#endif + +#endif /*_MLIB_TYPES_H_*/ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/libMLIB.a b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/libMLIB.a new file mode 100644 index 0000000..93b639e Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/MLIB/libMLIB.a differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_Ctrl2P2Z_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_Ctrl2P2Z_F16.h new file mode 100644 index 0000000..db9037e --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_Ctrl2P2Z_F16.h @@ -0,0 +1,78 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************/ +#ifndef _PCLIB_CTRL2P2Z_F16_H_ +#define _PCLIB_CTRL2P2Z_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "pclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define PCLIB_Ctrl2P2ZInit_F16_C(psParam) PCLIB_Ctrl2P2ZInit_F16_FC(psParam) +#define PCLIB_Ctrl2P2Z_F16_C(f16InErr, psParam) PCLIB_Ctrl2P2Z_F16_FC(f16InErr, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac16_t f16CoeffB0; /* Controller coefficient for present error. */ + frac16_t f16CoeffB1; /* Controller coefficient for past error. */ + frac16_t f16CoeffB2; /* Controller coefficient for past to past error. */ + frac16_t f16CoeffA1; /* Controller coefficient for past result. */ + frac16_t f16CoeffA2; /* Controller coefficient for past to past result. */ + frac16_t f16DelayX1; /* Controller delay parameter, past error. */ + frac16_t f16DelayX2; /* Controller delay parameter, past to past error. */ + frac16_t f16DelayY1; /* Controller delay parameter, past result. */ + frac16_t f16DelayY2; /* Controller delay parameter, past to past result. */ +} PCLIB_CTRL_2P2Z_T_F16; + +/**************************************************************************** +* Exported function prototypes +****************************************************************************/ +extern void PCLIB_Ctrl2P2ZInit_F16_FC(PCLIB_CTRL_2P2Z_T_F16 *psParam); +extern frac16_t PCLIB_Ctrl2P2Z_F16_FC(frac16_t f16InErr, PCLIB_CTRL_2P2Z_T_F16 *psParam); + + +#if defined(__cplusplus) +} +#endif + +#endif /* _PCLIB_CTRL2P2Z_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_Ctrl3P3Z_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_Ctrl3P3Z_F16.h new file mode 100644 index 0000000..c59e433 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_Ctrl3P3Z_F16.h @@ -0,0 +1,81 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************/ +#ifndef _PCLIB_CTRL3P3Z_F16_H_ +#define _PCLIB_CTRL3P3Z_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "pclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define PCLIB_Ctrl3P3ZInit_F16_C(psParam) PCLIB_Ctrl3P3ZInit_F16_FC(psParam) +#define PCLIB_Ctrl3P3Z_F16_C(f16InErr, psParam) PCLIB_Ctrl3P3Z_F16_FC(f16InErr, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac16_t f16CoeffB0; /* Controller coefficient for present error. */ + frac16_t f16CoeffB1; /* Controller coefficient for past error. */ + frac16_t f16CoeffB2; /* Controller coefficient for past to past error. */ + frac16_t f16CoeffB3; /* Controller coefficient for past to past to past error. */ + frac16_t f16CoeffA1; /* Controller coefficient for past result. */ + frac16_t f16CoeffA2; /* Controller coefficient for past to past result. */ + frac16_t f16CoeffA3; /* Controller coefficient for past to past to past result. */ + frac16_t f16DelayX1; /* Controller delay parameter, past error. */ + frac16_t f16DelayX2; /* Controller delay parameter, past to past error. */ + frac16_t f16DelayX3; /* Controller delay parameter, past to past to past error. */ + frac16_t f16DelayY1; /* Controller delay parameter, past result. */ + frac16_t f16DelayY2; /* Controller delay parameter, past to past result. */ + frac16_t f16DelayY3; /* Controller delay parameter, past to past to past result. */ +} PCLIB_CTRL_3P3Z_T_F16; + +/**************************************************************************** +* Exported function prototypes +****************************************************************************/ +extern void PCLIB_Ctrl3P3ZInit_F16_FC(PCLIB_CTRL_3P3Z_T_F16 *psParam); +extern frac16_t PCLIB_Ctrl3P3Z_F16_FC(frac16_t f16InErr, PCLIB_CTRL_3P3Z_T_F16 *psParam); + +#if defined(__cplusplus) +} +#endif + +#endif /* _PCLIB_CTRL3P3Z_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_CtrlPID_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_CtrlPID_F16.h new file mode 100644 index 0000000..0f00273 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_CtrlPID_F16.h @@ -0,0 +1,77 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************/ +#ifndef _PCLIB_CTRLPID_F16_H_ +#define _PCLIB_CTRLPID_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "pclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define PCLIB_CtrlPIDInit_F16_C(psParam) PCLIB_CtrlPIDInit_F16_FC(psParam) +#define PCLIB_CtrlPID_F16_C(f16InErr, psParam) PCLIB_CtrlPID_F16_FC(f16InErr, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac16_t f16Ka; /* Controller coefficient for present error. */ + frac16_t f16Kb; /* Controller coefficient for past error. */ + frac16_t f16Kc; /* Controller coefficient for past to past error. */ + frac16_t f16DelayX1; /* Controller delay parameter, past error. */ + frac16_t f16DelayX2; /* Controller delay parameter, past to past error. */ + frac16_t f16DelayY1; /* Controller delay parameter, past result. */ + frac16_t f16UpperLimit; /* Control Loop Output Upper Limit */ + frac16_t f16LowerLimit; /* Control Loop Output Lower Limit */ +} PCLIB_CTRL_PID_T_F16; + +/**************************************************************************** +* Exported function prototypes +****************************************************************************/ +extern void PCLIB_CtrlPIDInit_F16_FC(PCLIB_CTRL_PID_T_F16 *psParam); +extern frac16_t PCLIB_CtrlPID_F16_FC(frac16_t f16InErr, PCLIB_CTRL_PID_T_F16 *psParam); + + +#if defined(__cplusplus) +} +#endif + +#endif /* _PCLIB_CTRLPID_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_CtrlPI_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_CtrlPI_F16.h new file mode 100644 index 0000000..6ebb837 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_CtrlPI_F16.h @@ -0,0 +1,75 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************/ +#ifndef _PCLIB_CTRLPI_F16_H_ +#define _PCLIB_CTRLPI_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "pclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define PCLIB_CtrlPIInit_F16_C(psParam) PCLIB_CtrlPIInit_F16_FC(psParam) +#define PCLIB_CtrlPI_F16_C(f16InErr, psParam) PCLIB_CtrlPI_F16_FC(f16InErr, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac16_t f16Kp; /* Proportional Gain. */ + frac16_t f16Ki; /* Integral Gain. */ + frac16_t f16IntegralUpperLimit; /* Integral Upper limit */ + frac16_t f16IntegralLowerLimit; /* Integral Lower limit */ + frac16_t f16PreviousIntegralOutput; /* Previous Integral output (n-1) */ + frac16_t f16UpperLimit; /* Control Loop Output Upper Limit */ + frac16_t f16LowerLimit; /* Control Loop Output Lower Limit */ +} PCLIB_CTRL_PI_T_F16; + +/**************************************************************************** +* Exported function prototypes +****************************************************************************/ +extern void PCLIB_CtrlPIInit_F16_FC(PCLIB_CTRL_PI_T_F16 *psParam); +extern frac16_t PCLIB_CtrlPI_F16_FC(frac16_t f16InErr, PCLIB_CTRL_PI_T_F16 *psParam); + +#if defined(__cplusplus) +} +#endif + +#endif /* _PCLIB_CTRLPI_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_CtrlPIandLPFilter_F16.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_CtrlPIandLPFilter_F16.h new file mode 100644 index 0000000..bc0ae49 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/PCLIB_CtrlPIandLPFilter_F16.h @@ -0,0 +1,78 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************/ +#ifndef _PCLIB_CTRLPILP_F16_H_ +#define _PCLIB_CTRLPILP_F16_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Includes +*******************************************************************************/ +#include "mlib.h" +#include "pclib_types.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define PCLIB_CtrlPIandLPInit_F16_C(psParam) PCLIB_CtrlPIandLPInit_F16_FC(psParam) +#define PCLIB_CtrlPIandLP_F16_C(f16InErr, psParam) PCLIB_CtrlPIandLP_F16_FC(f16InErr, psParam) + +/******************************************************************************* +* Types +*******************************************************************************/ +typedef struct +{ + frac16_t f16CoeffB0; /*!< Controller coefficient for present error. */ + frac16_t f16CoeffB1; /*!< Controller coefficient for past error. */ + frac16_t f16CoeffB2; /*!< Controller coefficient for past to past error. */ + frac16_t f16CoeffA1; /*!< Controller coefficient for past result. */ + frac16_t f16CoeffA2; /*!< Controller coefficient for past to past result. */ + frac16_t f16DelayX1; /*!< Controller delay parameter, past error. */ + frac16_t f16DelayX2; /*!< Controller delay parameter, past to past error. */ + frac16_t f16DelayY1; /*!< Controller delay parameter, past result. */ + frac16_t f16DelayY2; /*!< Controller delay parameter, past to past result. */ +} PCLIB_CTRL_PI_LP_T_F16; + +/**************************************************************************** +* Exported function prototypes +****************************************************************************/ +extern void PCLIB_CtrlPIandLPInit_F16_FC(PCLIB_CTRL_PI_LP_T_F16 *psParam); +extern frac16_t PCLIB_CtrlPIandLP_F16_FC(frac16_t f16InErr, PCLIB_CTRL_PI_LP_T_F16 *psParam); + + +#if defined(__cplusplus) +} +#endif + +#endif /* _PCLIB_CTRLPILP_F16_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/pclib.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/pclib.h new file mode 100644 index 0000000..9f53ab6 --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/pclib.h @@ -0,0 +1,71 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Main PCLIB header file for devices without FPU. +* +*******************************************************************************/ + +#ifndef _PCLIB_H_ +#define _PCLIB_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/****************************************************************************** +* Includes +******************************************************************************/ +#include "PCLIB_Ctrl2P2Z_F16.h" +#include "PCLIB_Ctrl3P3Z_F16.h" +#include "PCLIB_CtrlPID_F16.h" +#include "PCLIB_CtrlPI_F16.h" +#include "PCLIB_CtrlPIandLPFilter_F16.h" + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define PCLIB_Ctrl2P2ZInit_F16(psParam) PCLIB_Ctrl2P2ZInit_F16_C(psParam) +#define PCLIB_Ctrl2P2Z_F16(f16InErr, psParam) PCLIB_Ctrl2P2Z_F16_C(f16InErr, psParam) +#define PCLIB_Ctrl3P3ZInit_F16(psParam) PCLIB_Ctrl3P3ZInit_F16_C(psParam) +#define PCLIB_Ctrl3P3Z_F16(f16InErr, psParam) PCLIB_Ctrl3P3Z_F16_C(f16InErr, psParam) +#define PCLIB_CtrlPIDInit_F16(psParam) PCLIB_CtrlPIDInit_F16_C(psParam) +#define PCLIB_CtrlPID_F16(f16InErr, psParam) PCLIB_CtrlPID_F16_C(f16InErr, psParam) +#define PCLIB_CtrlPIInit_F16(psParam) PCLIB_CtrlPIInit_F16_C(psParam) +#define PCLIB_CtrlPI_F16(f16InErr, psParam) PCLIB_CtrlPI_F16_C(f16InErr, psParam) +#define PCLIB_CtrlPIandLPInit_F16(psParam) PCLIB_CtrlPIandLPInit_F16_C(psParam) +#define PCLIB_CtrlPIandLP_F16(f16InErr, psParam) PCLIB_CtrlPIandLP_F16_C(f16InErr, psParam) + +#if defined(__cplusplus) +} +#endif + +#endif /* _PCLIB_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/pclib_types.h b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/pclib_types.h new file mode 100644 index 0000000..027b31d --- /dev/null +++ b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/Include/pclib_types.h @@ -0,0 +1,53 @@ +/******************************************************************************* +* + * Copyright (c) 2013 - 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2021 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +****************************************************************************//*! +* +* @brief Basic types for PCLIB +* +*******************************************************************************/ +#ifndef _PCLIB_TYPES_H_ +#define _PCLIB_TYPES_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Macros +*******************************************************************************/ +#define PCLIB_CONST const + + +#if defined(__cplusplus) +} +#endif + +#endif /* _PCLIB_TYPES_H_ */ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/libPCLIB.a b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/libPCLIB.a new file mode 100644 index 0000000..62e26bf Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_MCUX/PCLIB/libPCLIB.a differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0AMCLIBUG.pdf b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0AMCLIBUG.pdf new file mode 100644 index 0000000..5bec669 Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0AMCLIBUG.pdf differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0GDFLIBUG.pdf b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0GDFLIBUG.pdf new file mode 100644 index 0000000..fa34665 Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0GDFLIBUG.pdf differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0GFLIBUG.pdf b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0GFLIBUG.pdf new file mode 100644 index 0000000..7d6e367 Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0GFLIBUG.pdf differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0GMCLIBUG.pdf b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0GMCLIBUG.pdf new file mode 100644 index 0000000..da2567e Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0GMCLIBUG.pdf differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0MLIBUG.pdf b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0MLIBUG.pdf new file mode 100644 index 0000000..b313511 Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0MLIBUG.pdf differ diff --git a/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0PCLIBUG.pdf b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0PCLIBUG.pdf new file mode 100644 index 0000000..738b459 Binary files /dev/null and b/middleware/rtcesl/CM0_RTCESL_4.7_doc/CM0PCLIBUG.pdf differ diff --git a/tools/cmake_toolchain_files/armgcc.cmake b/tools/cmake_toolchain_files/armgcc.cmake new file mode 100644 index 0000000..14ee4d0 --- /dev/null +++ b/tools/cmake_toolchain_files/armgcc.cmake @@ -0,0 +1,56 @@ +# TOOLCHAIN EXTENSION +IF(WIN32) + SET(TOOLCHAIN_EXT ".exe") +ELSE() + SET(TOOLCHAIN_EXT "") +ENDIF() + +# EXECUTABLE EXTENSION +SET (CMAKE_EXECUTABLE_SUFFIX ".elf") + +# TOOLCHAIN_DIR AND NANO LIBRARY +SET(TOOLCHAIN_DIR $ENV{ARMGCC_DIR}) +STRING(REGEX REPLACE "\\\\" "/" TOOLCHAIN_DIR "${TOOLCHAIN_DIR}") + +IF(NOT TOOLCHAIN_DIR) + MESSAGE(FATAL_ERROR "***Please set ARMGCC_DIR in envionment variables***") +ENDIF() + +MESSAGE(STATUS "TOOLCHAIN_DIR: " ${TOOLCHAIN_DIR}) + +# TARGET_TRIPLET +SET(TARGET_TRIPLET "arm-none-eabi") + +SET(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_DIR}/bin) +SET(TOOLCHAIN_INC_DIR ${TOOLCHAIN_DIR}/${TARGET_TRIPLET}/include) +SET(TOOLCHAIN_LIB_DIR ${TOOLCHAIN_DIR}/${TARGET_TRIPLET}/lib) + +SET(CMAKE_SYSTEM_NAME Generic) +SET(CMAKE_SYSTEM_PROCESSOR arm) + +SET(CMAKE_C_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc${TOOLCHAIN_EXT}) +SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-g++${TOOLCHAIN_EXT}) +SET(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc${TOOLCHAIN_EXT}) + +set(CMAKE_C_COMPILER_FORCED TRUE) +set(CMAKE_CXX_COMPILER_FORCED TRUE) + +SET(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objcopy CACHE INTERNAL "objcopy tool") +SET(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objdump CACHE INTERNAL "objdump tool") + +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g" CACHE INTERNAL "c compiler flags debug") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g" CACHE INTERNAL "cxx compiler flags debug") +SET(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -g" CACHE INTERNAL "asm compiler flags debug") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE INTERNAL "linker flags debug") + +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 " CACHE INTERNAL "c compiler flags release") +SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 " CACHE INTERNAL "cxx compiler flags release") +SET(CMAKE_ASM_FLAGS_RELEASE "${CMAKE_ASM_FLAGS_RELEASE}" CACHE INTERNAL "asm compiler flags release") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" CACHE INTERNAL "linker flags release") + +SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/${TARGET_TRIPLET} ${EXTRA_FIND_PATH}) +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +MESSAGE(STATUS "BUILD_TYPE: " ${CMAKE_BUILD_TYPE}) \ No newline at end of file diff --git a/tools/cmake_toolchain_files/armgcc_force_cpp.cmake b/tools/cmake_toolchain_files/armgcc_force_cpp.cmake new file mode 100644 index 0000000..14ee4d0 --- /dev/null +++ b/tools/cmake_toolchain_files/armgcc_force_cpp.cmake @@ -0,0 +1,56 @@ +# TOOLCHAIN EXTENSION +IF(WIN32) + SET(TOOLCHAIN_EXT ".exe") +ELSE() + SET(TOOLCHAIN_EXT "") +ENDIF() + +# EXECUTABLE EXTENSION +SET (CMAKE_EXECUTABLE_SUFFIX ".elf") + +# TOOLCHAIN_DIR AND NANO LIBRARY +SET(TOOLCHAIN_DIR $ENV{ARMGCC_DIR}) +STRING(REGEX REPLACE "\\\\" "/" TOOLCHAIN_DIR "${TOOLCHAIN_DIR}") + +IF(NOT TOOLCHAIN_DIR) + MESSAGE(FATAL_ERROR "***Please set ARMGCC_DIR in envionment variables***") +ENDIF() + +MESSAGE(STATUS "TOOLCHAIN_DIR: " ${TOOLCHAIN_DIR}) + +# TARGET_TRIPLET +SET(TARGET_TRIPLET "arm-none-eabi") + +SET(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_DIR}/bin) +SET(TOOLCHAIN_INC_DIR ${TOOLCHAIN_DIR}/${TARGET_TRIPLET}/include) +SET(TOOLCHAIN_LIB_DIR ${TOOLCHAIN_DIR}/${TARGET_TRIPLET}/lib) + +SET(CMAKE_SYSTEM_NAME Generic) +SET(CMAKE_SYSTEM_PROCESSOR arm) + +SET(CMAKE_C_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc${TOOLCHAIN_EXT}) +SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-g++${TOOLCHAIN_EXT}) +SET(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc${TOOLCHAIN_EXT}) + +set(CMAKE_C_COMPILER_FORCED TRUE) +set(CMAKE_CXX_COMPILER_FORCED TRUE) + +SET(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objcopy CACHE INTERNAL "objcopy tool") +SET(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objdump CACHE INTERNAL "objdump tool") + +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g" CACHE INTERNAL "c compiler flags debug") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g" CACHE INTERNAL "cxx compiler flags debug") +SET(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -g" CACHE INTERNAL "asm compiler flags debug") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE INTERNAL "linker flags debug") + +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 " CACHE INTERNAL "c compiler flags release") +SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 " CACHE INTERNAL "cxx compiler flags release") +SET(CMAKE_ASM_FLAGS_RELEASE "${CMAKE_ASM_FLAGS_RELEASE}" CACHE INTERNAL "asm compiler flags release") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" CACHE INTERNAL "linker flags release") + +SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/${TARGET_TRIPLET} ${EXTRA_FIND_PATH}) +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +MESSAGE(STATUS "BUILD_TYPE: " ${CMAKE_BUILD_TYPE}) \ No newline at end of file diff --git a/tools/cmake_toolchain_files/xcc.cmake b/tools/cmake_toolchain_files/xcc.cmake new file mode 100644 index 0000000..33142f8 --- /dev/null +++ b/tools/cmake_toolchain_files/xcc.cmake @@ -0,0 +1,65 @@ +INCLUDE(CMakeForceCompiler) + +# TOOLCHAIN EXTENSION +IF(WIN32) + SET(TOOLCHAIN_EXT ".exe") +ELSE() + SET(TOOLCHAIN_EXT "") +ENDIF() + +# EXECUTABLE EXTENSION +SET (CMAKE_EXECUTABLE_SUFFIX ".elf") + +# TOOLCHAIN_DIR AND NANO LIBRARY +SET(TOOLCHAIN_DIR $ENV{XCC_DIR}) +STRING(REGEX REPLACE "\\\\" "/" TOOLCHAIN_DIR "${TOOLCHAIN_DIR}") + +IF(NOT TOOLCHAIN_DIR) + MESSAGE(FATAL_ERROR "***Please set XCC_DIR in envionment variables***") +ENDIF() + +MESSAGE(STATUS "TOOLCHAIN_DIR: " ${TOOLCHAIN_DIR}) + +SET(XTENSA_SYSTEM $ENV{XTENSA_SYSTEM}) +IF(NOT XTENSA_SYSTEM) + SET(XTENSA_SYSTEM "/opt/xtensa/builds/RI-2019.1-linux/nxp_rt600_RI2019_newlib/config") +ENDIF() +SET(XTENSA_CORE $ENV{XTENSA_CORE}) +IF(NOT XTENSA_CORE) + SET(XTENSA_CORE "nxp_rt600_RI2019_newlib") +ENDIF() + +# TARGET_TRIPLET +SET(TARGET_TRIPLET "xt") + +SET(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_DIR}/bin) + +SET(CMAKE_SYSTEM_NAME Generic) +SET(CMAKE_SYSTEM_PROCESSOR hifi4) + +CMAKE_FORCE_C_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-xcc${TOOLCHAIN_EXT} GNU) +CMAKE_FORCE_CXX_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-xc++${TOOLCHAIN_EXT} GNU) +SET(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-xcc${TOOLCHAIN_EXT}) + +SET(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objcopy CACHE INTERNAL "objcopy tool") +SET(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objdump CACHE INTERNAL "objdump tool") + +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g" CACHE INTERNAL "c compiler flags debug") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g" CACHE INTERNAL "cxx compiler flags debug") +SET(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -g" CACHE INTERNAL "asm compiler flags debug") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE INTERNAL "linker flags debug") + +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 " CACHE INTERNAL "c compiler flags release") +SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 " CACHE INTERNAL "cxx compiler flags release") +SET(CMAKE_ASM_FLAGS_RELEASE "${CMAKE_ASM_FLAGS_RELEASE}" CACHE INTERNAL "asm compiler flags release") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" CACHE INTERNAL "linker flags release") + +SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/${TARGET_TRIPLET} ${EXTRA_FIND_PATH}) +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/${CMAKE_BUILD_TYPE}) + +MESSAGE(STATUS "BUILD_TYPE: " ${CMAKE_BUILD_TYPE}) diff --git a/tools/cmake_toolchain_files/xclang.cmake b/tools/cmake_toolchain_files/xclang.cmake new file mode 100644 index 0000000..239f172 --- /dev/null +++ b/tools/cmake_toolchain_files/xclang.cmake @@ -0,0 +1,65 @@ +INCLUDE(CMakeForceCompiler) + +# TOOLCHAIN EXTENSION +IF(WIN32) + SET(TOOLCHAIN_EXT ".exe") +ELSE() + SET(TOOLCHAIN_EXT "") +ENDIF() + +# EXECUTABLE EXTENSION +SET (CMAKE_EXECUTABLE_SUFFIX ".elf") + +# TOOLCHAIN_DIR AND NANO LIBRARY +SET(TOOLCHAIN_DIR $ENV{XCC_DIR}) +STRING(REGEX REPLACE "\\\\" "/" TOOLCHAIN_DIR "${TOOLCHAIN_DIR}") + +IF(NOT TOOLCHAIN_DIR) + MESSAGE(FATAL_ERROR "***Please set XCC_DIR in envionment variables***") +ENDIF() + +MESSAGE(STATUS "TOOLCHAIN_DIR: " ${TOOLCHAIN_DIR}) + +SET(XTENSA_SYSTEM $ENV{XTENSA_SYSTEM}) +IF(NOT XTENSA_SYSTEM) + SET(XTENSA_SYSTEM "/opt/xtensa/builds/RI-2019.1-linux/nxp_rt600_RI2019_newlib/config") +ENDIF() +SET(XTENSA_CORE $ENV{XTENSA_CORE}) +IF(NOT XTENSA_CORE) + SET(XTENSA_CORE "nxp_rt600_RI2019_newlib") +ENDIF() + +# TARGET_TRIPLET +SET(TARGET_TRIPLET "xt") + +SET(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_DIR}/bin) + +SET(CMAKE_SYSTEM_NAME Generic) +SET(CMAKE_SYSTEM_PROCESSOR hifi4) + +CMAKE_FORCE_C_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-clang${TOOLCHAIN_EXT} GNU) +CMAKE_FORCE_CXX_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-clang++${TOOLCHAIN_EXT} GNU) +SET(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-clang${TOOLCHAIN_EXT}) + +SET(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objcopy CACHE INTERNAL "objcopy tool") +SET(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objdump CACHE INTERNAL "objdump tool") + +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g" CACHE INTERNAL "c compiler flags debug") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g" CACHE INTERNAL "cxx compiler flags debug") +SET(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -g" CACHE INTERNAL "asm compiler flags debug") +SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE INTERNAL "linker flags debug") + +SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 " CACHE INTERNAL "c compiler flags release") +SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 " CACHE INTERNAL "cxx compiler flags release") +SET(CMAKE_ASM_FLAGS_RELEASE "${CMAKE_ASM_FLAGS_RELEASE}" CACHE INTERNAL "asm compiler flags release") +SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" CACHE INTERNAL "linker flags release") + +SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/${TARGET_TRIPLET} ${EXTRA_FIND_PATH}) +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/${CMAKE_BUILD_TYPE}) +SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/${CMAKE_BUILD_TYPE}) + +MESSAGE(STATUS "BUILD_TYPE: " ${CMAKE_BUILD_TYPE})